2012-03-06 2 views
1

Lapack에서 ZGEEV 루틴을 사용하여 테스트 문제를 해결하고 몇 가지 어려움을 겪고 있습니다. 1 주일 전에 FORTRAN에서 코딩을 시작 했으므로 빠뜨린 것이 너무 사소한 것 같습니다.FORTRAN ZGEEV, 모두 0 고유 값

대용량의 복잡한 대칭 행렬을 대각 화해야합니다. 시작하려면 Matlab을 사용하여 대각선 화 가능하다는 것을 확인한 200 x 200 행렬을 만들었습니다. 코드를 실행할 때 오류가 발생하지 않고 INFO = 0으로 성공을 제안합니다. 그러나, 모든 고유 값은 (0,0) 내가 아는 것은 틀린 것입니다.

첨부 : 내 코드입니다.

PROGRAM speed_zgeev 
    IMPLICIT NONE 
    INTEGER(8) :: N 
    COMPLEX*16, DIMENSION(:,:), ALLOCATABLE :: MAT 
    INTEGER(8) :: INFO, I, J 
    COMPLEX*16, DIMENSION(:), ALLOCATABLE :: RWORK 
    COMPLEX*16, DIMENSION(:), ALLOCATABLE :: D 
    COMPLEX*16, DIMENSION(1,1) :: VR, VL 
    INTEGER(8) :: LWORK = -1 
    COMPLEX*16, DIMENSION(:), ALLOCATABLE :: WORK 
    DOUBLE PRECISION :: RPART, IPART 

    EXTERNAL ZGEEV 
    N = 200 

    ALLOCATE(D(N)) 
    ALLOCATE(RWORK(2*N)) 
    ALLOCATE(WORK(N)) 
    ALLOCATE(MAT(N,N)) 

    OPEN(UNIT = 31, FILE = "newmat.txt") 
    OPEN(UNIT = 32, FILE = "newmati.txt") 
    DO J = 1,N 
    DO I = 1,N 
    READ(31,*) RPART 
    READ(32,*) IPART 
    MAT(I,J) = CMPLX(RPART, IPART) 
    END DO 
    END DO 

    CLOSE(31) 
    CLOSE(32) 

    CALL ZGEEV('N','N', N, MAT, N, D, VL, 1, VR, 1, WORK, LWORK, RWORK, INFO) 
    INFO = WORK(1) 

    DEALLOCATE(WORK) 
    ALLOCATE(WORK(INFO)) 

    CALL ZGEEV('N','N', N, MAT, N, D, VL, 1, VR, 1, WORK, LWORK, RWORK, INFO) 

    IF (INFO .EQ. 0) THEN 
    PRINT*, D(1:10) 
    ELSE 
    PRINT*, INFO 
    END IF 

    DEALLOCATE(MAT) 
    DEALLOCATE(D) 
    DEALLOCATE(RWORK) 
    DEALLOCATE(WORK) 


END PROGRAM speed_zgeev 

나는 30 사이즈 (30), 작은 행렬에 동일한 코드를 시도하고 잘 작동합니다. 어떤 도움을 주시면 감사하겠습니다! 감사.

내가 제대로 작동하는지 확인한 테스트 파일에서 행렬을로드 중입니다.

답변

3

아마도 대신 LWORK = WORK (1)일까요? ALLOCATE(WORK(INFO))도 변경하십시오.

+0

고맙습니다. 그것은 효과가 있었다. – Jeremie187