zgeev没有给出正确的特征值

时间:2017-07-04 02:47:18

标签: fortran

subroutine Ceigen(n,Uf,Ud,d)
implicit none 
integer ::    n,info,i,j,lwork=-1
complex(8) ::    Ud(n,n),Uf(n,n),rwork(2*n),d(n)
complex(8),allocatable :: work(:)
complex(8),dimension(1,1) :: vr,vl
allocate(work(0:n-1))
Ud=Uf 
call zgeev('N','N', n, Ud, n, d, vl, 1, vr, 1, work, lwork, rwork, info)
lwork=work(1)
deallocate(work)
allocate(work(n))
call zgeev('N','N', n, Ud, n, d, vl, 1, vr, 1, work, lwork, rwork, info)

end subroutine Ceigen

我正在使用这个子程序来获得一个非对称的大复数矩阵的特征值。

但是,每次我收到以下错误

  

**进入ZGEEV参数号12时有非法值注意:以下浮点异常表示:   IEEE_UNDERFLOW_FLAG IEEE_DENORMAL

lwork是第12个参数。但是,如果我不指定lwork =work(1),我将得到每个特征值为零。 有人可以帮忙吗?

1 个答案:

答案 0 :(得分:0)

通过在声明期间为.env分配值,您隐式赋予它lwork属性:

save

这意味着,它将在函数调用之间保持其值。如果您再次拨打integer :: n,info,i,j,lwork=-1 ,第一次通话时不会Ceigen,但可能是非法值(-1,请参阅source code)。

另一方面,如果您不更改lwork < 2*n,它将保持lwork,您将始终查询工作数组大小,从不进行任何计算。

作为补救措施,将声明与作业分开:

-1