3442 |
out=numarray.linear_algebra.eigenvalues((arg+numarray.transpose(arg))/2.) |
out=numarray.linear_algebra.eigenvalues((arg+numarray.transpose(arg))/2.) |
3443 |
out.sort() |
out.sort() |
3444 |
return out |
return out |
3445 |
elif isinstance(arg,escript.Data) or isinstance(arg,Symbol): |
elif isinstance(arg,escript.Data): |
3446 |
|
return escript_eigenvalues(arg) |
3447 |
|
elif isinstance(arg,Symbol): |
3448 |
if not arg.getRank()==2: |
if not arg.getRank()==2: |
3449 |
raise ValueError,"eigenvalues: argument must have rank 2" |
raise ValueError,"eigenvalues: argument must have rank 2" |
3450 |
s=arg.getShape() |
s=arg.getShape() |
3468 |
A13=arg[0,2] |
A13=arg[0,2] |
3469 |
A23=arg[1,2] |
A23=arg[1,2] |
3470 |
A33=arg[2,2] |
A33=arg[2,2] |
3471 |
trA=(A11+A22+A22)/3. |
trA=(A11+A22+A33)/3. |
3472 |
A11-=trA |
A11-=trA |
3473 |
A22-=trA |
A22-=trA |
3474 |
A33-=trA |
A33-=trA |
3478 |
p=A13_2+A23_2+A12_2+(A11**2+A22**2+A33**2)/2. |
p=A13_2+A23_2+A12_2+(A11**2+A22**2+A33**2)/2. |
3479 |
q=A13_2*A22+A23_2*A11+A12_2*A33-A11*A22*A33-2*A12*A23*A13 |
q=A13_2*A22+A23_2*A11+A12_2*A33-A11*A22*A33-2*A12*A23*A13 |
3480 |
sq_p=sqrt(p/3.) |
sq_p=sqrt(p/3.) |
3481 |
alpha_3=acos(-q/sq_p**(1./3.)/2.)/3. |
alpha_3=acos(-q*sq_p**(-3.)/2.)/3. |
3482 |
sq_p*=2. |
sq_p*=2. |
3483 |
f=cos(alpha_3) *numarray.array([1.,0.,0.]) \ |
f=cos(alpha_3) *numarray.array([0.,0.,1.]) \ |
3484 |
-cos(alpha_3+numarray.pi/3.)*numarray.array([0.,1.,0.]) \ |
-cos(alpha_3+numarray.pi/3.)*numarray.array([0.,1.,0.]) \ |
3485 |
-cos(alpha_3-numarray.pi/3.)*numarray.array([0.,0.,1.]) |
-cos(alpha_3-numarray.pi/3.)*numarray.array([1.,0.,0.]) |
3486 |
return trA+sq_p*f |
return trA+sq_p*f |
3487 |
else: |
else: |
3488 |
raise TypeError,"eigenvalues: only matrix dimensions 1,2,3 are supported right now." |
raise TypeError,"eigenvalues: only matrix dimensions 1,2,3 are supported right now." |
3492 |
return float(arg) |
return float(arg) |
3493 |
else: |
else: |
3494 |
raise TypeError,"eigenvalues: Unknown argument type." |
raise TypeError,"eigenvalues: Unknown argument type." |
3495 |
|
|
3496 |
|
def escript_eigenvalues(arg): # this should be implemented in C++ arg and LAPACK is data object |
3497 |
|
if not arg.getRank()==2: |
3498 |
|
raise ValueError,"eigenvalues: argument must have rank 2" |
3499 |
|
s=arg.getShape() |
3500 |
|
if not s[0] == s[1]: |
3501 |
|
raise ValueError,"eigenvalues: argument must be a square matrix." |
3502 |
|
if s[0]==1: |
3503 |
|
return arg[0] |
3504 |
|
elif s[0]==2: |
3505 |
|
A11=arg[0,0] |
3506 |
|
A12=arg[0,1] |
3507 |
|
A22=arg[1,1] |
3508 |
|
trA=(A11+A22)/2. |
3509 |
|
A11-=trA |
3510 |
|
A22-=trA |
3511 |
|
s=sqrt(A12**2-A11*A22) |
3512 |
|
return trA+s*numarray.array([-1.,1.]) |
3513 |
|
elif s[0]==3: |
3514 |
|
A11=arg[0,0] |
3515 |
|
A12=arg[0,1] |
3516 |
|
A22=arg[1,1] |
3517 |
|
A13=arg[0,2] |
3518 |
|
A23=arg[1,2] |
3519 |
|
A33=arg[2,2] |
3520 |
|
trA=(A11+A22+A33)/3. |
3521 |
|
A11-=trA |
3522 |
|
A22-=trA |
3523 |
|
A33-=trA |
3524 |
|
A13_2=A13**2 |
3525 |
|
A23_2=A23**2 |
3526 |
|
A12_2=A12**2 |
3527 |
|
p=A13_2+A23_2+A12_2+(A11**2+A22**2+A33**2)/2. |
3528 |
|
q=A13_2*A22+A23_2*A11+A12_2*A33-A11*A22*A33-2*A12*A23*A13 |
3529 |
|
sq_p=sqrt(p/3.) |
3530 |
|
alpha_3=acos(-q*sq_p**(-3.)/2.)/3. |
3531 |
|
sq_p*=2. |
3532 |
|
f=escript.Data(0.,(3,),arg.getFunctionSpace()) |
3533 |
|
f[0]=-cos(alpha_3-numarray.pi/3.) |
3534 |
|
f[1]=-cos(alpha_3+numarray.pi/3.) |
3535 |
|
f[2]=cos(alpha_3) |
3536 |
|
return trA+sq_p*f |
3537 |
|
else: |
3538 |
|
raise TypeError,"eigenvalues: only matrix dimensions 1,2,3 are supported right now." |
3539 |
#======================================================= |
#======================================================= |
3540 |
# Binary operations: |
# Binary operations: |
3541 |
#======================================================= |
#======================================================= |