FORTRAN ZGEEV,全部0个特征值

时间:2012-03-06 06:28:30

标签: fortran

我试图在Lapack中使用ZGEEV例程来解决测试问题并遇到一些困难。我刚刚在一周前开始在FORTRAN编码,所以我认为这可能是我失踪的非常微不足道的事情。

我必须对角化相当大的复杂对称矩阵。为了开始,使用Matlab我创建了一个200乘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 x 30,它们工作正常。任何帮助,将不胜感激!感谢。

我忘了提到我正在从我已经验证正常工作的测试文件中加载矩阵。

1 个答案:

答案 0 :(得分:3)

可能LWORK = WORK (1)代替INFO = WORK(1)?同时更改ALLOCATE(WORK(INFO))