我在做一個方陣A的SVD分解,其中A = US Vdag,並且在Fortran代碼,行讀取gfortran錯誤:zgesvd在LAPACK
lwork = -1
call zgesvd('A', 'A', A%d, A%d, A%m, A%d, S, U%m, U%d, Vdag%m, Vdag%d,work, lwork, rwork, info)
lwork = int(work(1));deallocate(work); allocate(work(lwork))
call zgesvd('A', 'A', A%d, A%d, A%m, A%d, S, U%m, U%d, Vdag%m, Vdag%d,work, lwork, rwork, info)
當我與gfortran編譯,它沒有錯誤或警告經歷。然而,當我運行程序,它會顯示錯誤與消息:
「**在進入ZGESVD參數號11有一個非法值」
我無法弄清楚什麼地方出了錯。
僅供參考,參數的定義:
type cmatrix
integer(4) d
complex(8), allocatable :: m(:,:)
end type
type (cmatrix) A,U,Vdag
allocate(A%m(dim,dim),U%m(dim,dim),Vdag%m(dim,dim))
A%d = dim; U%m = dim; Vdag%d = dim
real(8) S(dim)
提前感謝! Xiaoyu
p.s.應該指出的是,這樣的程序在使用ifort編譯時運行平穩,但gfortran給出了上面顯示的運行時錯誤
---問題解決了!
似乎問題在於ifortran和gfortran如何分配內存。我在代碼USV類型的定義:
type USV
integer is_alloc
type (cmatrix) U,V
real(8), allocatable :: S(:)
end USV
當由
type(USV) Test_usv(:)
allocate(Test_usv(3)),
初始化is_alloc的值是使用英特爾Fortran編譯0,而任意數量爲gfortran。我需要使用此值作爲分配U V矩陣的標準:
if (is_alloc.eq.0) then
allocate(U%m(dim,dim))
end if
第11個參數是'Vdag%d'。我建議在每次通話前打印其價值。嘗試使用gfortran調試選項:'-fimplicit-none -Wall -Wline-truncation -Wcharacter-truncation -Wsprising -Waliasing -Wimplicit-interface -Wunused-parameter -fcheck = all -fbacktrace' –
你能告訴我們'S '? –
謝謝你們! @ M.S.B .:第11個說法確實無效。我發現這是一個問題,因爲使用intel fortran和gfortran分配內存的初始化方案不同。 – Rain