;+
;Program: mat_diag, p, EIG_VAL= eig_val, EIG_VEC= eig_vec
;INPUT:
; p 6-element vector [Pxx, Pyy, Pzz, Pxy, Pxz, Pyz] of a
; symmetric matrix
;OUTPUT:
; eig_val, eig_vec
;PURPOSE:
; Diagonalize a 3x3 symmetric matrix
; Returns the eigenvalues and eigenvectors.
; The eigenvalues are the diagnonal elements of the matrix
; The eigenvectors are the associated principle axis.
;NOTES:
; The first eigenvalue (eig_val(0)) and eigenvector (eig_vec(*,0))
; are the distinguisheable eigenvalue and the major (symmetry) axis,
; respectively.
; The "degenerate" eigenvalues are sorted such that the 2nd eigenvalue
; is smaller than the third one.
;CREATED BY:
; Tai Phan (95-9-15)
;LAST MODIFICATION:
; 95-9-29 Tai Phan
;-
pro mat_diag , p, EIG_VAL= eig_val, EIG_VEC= eig_vec
if n_elements(p) ne 6 then dprint, 'matrix must be 3x3'
p = [[p(0),p(3),p(4)],[p(3),p(1),p(5)],[p(4),p(5),p(2)]]
trired,p,d,e
triql,d,e,p
; identification of the distinguisheable (symmetry) axis
p= p(*,sort(d))
d= d(sort(d))
eig_val= fltarr(3)
eig_vec= fltarr(3,3)
if (d(2)-d(1) gt d(1)-d(0)) then begin
eig_val(0)= d(2)
eig_val(1)= d(0)
eig_val(2)= d(1)
eig_vec(*,0)= p(*,2)
eig_vec(*,1)= p(*,0)
eig_vec(*,2)= p(*,1)
endif else begin
eig_val= d
eig_vec= p
endelse
return
end