![](/img/trans.png)
[英]gfortran SIGABRT error: the zgesvd function from lapack
[英]gfortran error: zgesvd in lapack
我正在做方形矩陣A的svd分解,A = US Vdag,而在fortran代碼中,行讀取
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)
提前致謝! 小玉
ps應該提到的是,當使用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)),
使用intel fortran編譯器,is_alloc的值為0,而gfortran的值為任意數。 我需要使用此值作為分配UV矩陣的標准:
if (is_alloc.eq.0) then
allocate(U%m(dim,dim))
end if
根本問題不在於ifort和gfortran之間的區別。 您對變量初始化的方法是無效的Fortran。 除非使用聲明,賦值語句等初始化變量,否則其值是未定義的。 解決此問題的一種方法是向類型定義添加默認初始化:
type USV
integer is_alloc = 0
type (cmatrix) U,V
real(8), allocatable :: S(:)
end USV
另一種方法是不自己跟蹤分配狀態,並依賴Fortran為此目的提供的內在功能:
if (.NOT. allocated (U%m) ) allocate(U%m(dim,dim))
PS最佳做法是不依賴於特定的數值。 種類值是任意的,不一定是該類型的字節數。 有些編譯器使用字節數,有些則沒有。 指定字節數和具有可移植代碼的一種方法是使用ISO Fortran環境提供的類型:
use, intrinsic :: ISO_FORTRAN_ENV
integer(int32) :: d
real(real64), allocatable :: S(:)
類型以位數命名。 可用類型的列表位於gfortran手冊的“內在模塊”一章中。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.