Blas函数在使用相对路径和绝对路径编译时返回两个不同的结果



当我使用BLAS中的zgerc子例程编译Fortran代码时,我遇到了一个非常奇怪的问题。基本上,这个子程序计算向量x与向量y的共轭的外积。关于这个函数的更多信息。我的简单代码如下:

program main
implicit none
integer :: i
complex(8), dimension(10) :: a = [(i, i=0,9)]
complex(8), dimension(10) :: b = [(i, i=0,9)]
complex(8), dimension(10, 10) :: c
c = 0
CALL zgerc(10, 10, 1.D0, a, 1, b, 1, c, 10)
WRITE(*, *) c
end program main

这里有两个复向量,ab,都从0到9,它们的虚部是0。

现在是奇怪的部分。如果我用绝对路径gfortran -c /home/myUser/Fortran/tests/main.f90 -o main.o编译代码,我会得到正确的结果,但如果我用gfortran -c main.f90 -o main.o编译(当然我在正确的目录中,我也尝试过./main.f90(,实部的结果是正确的,但对于虚部,我会获得类似1E+225的数字(如果我使用./main.f90,我会获取类似1E+163的数字(。

我不明白为什么我的代码的路径会改变想象部分的结果。。。我会很高兴得到你的帮助。

我使用Ubuntu 20.04.2和默认的gfortran(9.3.0(

第页。S、 我的最终目标是将其用作带有f2py的Python中更复杂的子例程的一部分。

编辑:我的全部命令:

#gfortran -c /home/myUser/Fortran/tests/main.f90 -o main.o
gfortran -c main.f90 -o main.o
gfortran -o test main.o /home/myUser/PycharmProjects/GSIE_2D/fortran_scripts/libblas.a /home/myUser/PycharmProjects/GSIE_2D/fortran_scripts/liblapack.a
rm ./main.o
./test

第1行和第2行是两种情况,所以我每次只运行其中一种。

您提供的1d0是一个double precision文字,而zgerc假定为double complex值。

call zgerc(10, 10, cmplx(1, kind=8), a, 1, b, 1, c, 10)

通过包含显式接口(通过某种blas模块(,当提供错误数据类型的参数时,您可能会出现编译时错误。英特尔的mkl在其blas95模块中提供了这样的显式接口,以及通用例程(gerc而不是{c,z}gerc(。还有这个开源模块为标准blas例程提供了明确的接口。

还可以使用iso_fortran_env中定义的可移植类型。

program main
use blas95,          only: gerc
use iso_fortran_env, only: real64
implicit none
integer, parameter :: n = 10
integer            :: i
complex(real64)    :: a(n) = [(i, i=0,n-1)], b(n) = [(i, i=0,n-1)], c(n,n)
c = 0
! call zgerc(10, 10, cmplx(1, kind=8), a, 1, b, 1, c, 10) ! standard blas 
call gerc(c, a, b, alpha=cmplx(1, kind=real64))           !  generic blas95 
print *, c
end program

最新更新