2017-07-04 100 views
0
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沒有給出正確的特徵值

然而,每次我收到以下錯誤

**在進入ZGEEV參數號12有一個非法值注:以下浮點異常信號: IEEE_UNDERFLOW_FLAG IEEE_DENORMAL

lwork是第12個參數。但是,如果我不分配lwork =work(1)我得到每個特徵值零。 任何人都可以幫忙嗎?

+0

嘗試'lwork = MAX(1,N)'如文檔中所述。 –

+3

你不止一次打電話給Ceigen嗎? – francescalus

+0

請勿使用複雜的(8)。不僅它醜陋而且不便攜。這也令人困惑,因爲它與複雜的* 8不兼容。 –

回答

0

通過其聲明中值分配給lwork,你含蓄地給它save屬性:

integer :: n,info,i,j,lwork=-1 

這意味着,這將讓函數調用之間的值。如果您第二次撥打Ceigen,第一個電話將不會是-1,但可能是非法值(lwork < 2*n,請參閱source code)。另一方面,如果您不更改lwork,它將保持-1,並且您將始終查詢工作陣列大小,並且不會執行任何計算。

作爲補救,分離聲明和分配:

integer :: n,info,i,j,lwork 
!... 
lwork=-1 
+0

謝謝。有用!! –

+0

Yaah當然!希望能有更多的答案。 –