Initial commit
This commit is contained in:
@@ -0,0 +1,51 @@
|
||||
subroutine eigen_sym_up(N,A,W)
|
||||
implicit none
|
||||
!
|
||||
!compute the eigenvalues and eigenvectors of a symmetrical matrix.
|
||||
!A: On entry, A is a symmetrical matrix with its upper triangle filled.
|
||||
! on exit, A contains the normalized eigenvectors in its columns.
|
||||
!W: contains the eigenvalues in descending order.
|
||||
|
||||
CHARACTER JOBZ, UPLO
|
||||
INTEGER INFO, LDA, LWORK, N
|
||||
DOUBLE PRECISION A(N, N), W( N ), WORK(3*N-1)
|
||||
double precision p
|
||||
integer i,j
|
||||
|
||||
JOBZ='V'
|
||||
UPLO='U'
|
||||
LWORK=3*N-1
|
||||
LDA=N
|
||||
call DSYEV(JOBZ,UPLO,N,A(1:N,1:N),LDA,W,WORK,LWORK,INFO)
|
||||
* INFO (output) INTEGER
|
||||
* = 0: successful exit
|
||||
* < 0: if INFO = -i, the i-th argument had an illegal value
|
||||
* > 0: if INFO = i, the algorithm failed to converge; i
|
||||
* off-diagonal elements of an intermediate tridiagonal
|
||||
* form did not converge to zero.
|
||||
if(INFO.lt.0)then
|
||||
write(*,*)'The ',-INFO,
|
||||
& 'th argument in DSYEV has an illegal value'
|
||||
stop
|
||||
endif
|
||||
if(INFO.gt.0)then
|
||||
write(*,*)'The algorithm failed to converge'
|
||||
stop
|
||||
endif
|
||||
|
||||
! Change the eigenvalue array from ascending to descending order and rearrange
|
||||
! the eigen vectors accordingly.
|
||||
!---------------------------------------------
|
||||
do i=1,N/2
|
||||
p=W(i)
|
||||
W(i)=W(N-i+1)
|
||||
W(N-i+1)=p
|
||||
do j=1,N
|
||||
p=A(j,i)
|
||||
A(j,i)=A(j,N-i+1)
|
||||
A(j,N-i+1)=p
|
||||
enddo
|
||||
enddo
|
||||
!---------------------------------------------
|
||||
return
|
||||
end
|
||||
Reference in New Issue
Block a user