当我使用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
这里有两个复向量,a
和b
,都从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