gpt4 book ai didi

fortran - gfortran 错误 : zgesvd in lapack

转载 作者:行者123 更新时间:2023-12-02 03:35:29 25 4
gpt4 key购买 nike

我正在对方阵 A 进行 svd 分解,其中 A=U S 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)

提前致谢!小雨

附注需要说明的是,这样的程序用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 的值在使用 intel fortran 编译器时是 0,而 gfortran 是任意数。我需要使用这个值作为分配 U V 矩阵的标准:

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))

附言最佳做法是不要依赖种类的特定数值。种类值是任意的,不一定是该类型的字节数。有些编译器使用字节数,有些则不使用。指定字节数和可移植代码的一种方法是使用 ISO Fortran 环境提供的类型:

use, intrinsic :: ISO_FORTRAN_ENV

integer(int32) :: d
real(real64), allocatable :: S(:)

类型以位数命名。可用类型的列表在 gfortran 手册的“内部模块”一章中。

关于fortran - gfortran 错误 : zgesvd in lapack,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/23707429/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com