簡體   English   中英

gfortran錯誤:lapack中的zgesvd

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM