我正在尝试在Fortran中重新编写一个旧的C ++程序来使用LAPACK(我知道C ++确实有LAPACK ++,但是我在安装它时遇到了很多麻烦,所以我放弃了。) / p>
我最初对编译没有任何问题,但那时我将所有变量声明为REAL
。当我开始编写需要LAPACK的程序部分时,我发现传递给DSYEV
的所有参数都需要DOUBLE PRECISION
。因此,我尝试将所有内容更改为双精度(包括将所有硬编码数字更改为其双精度数据,即0.0 - > 0.0D0)现在,当我尝试编译时,我得到以下所有函数和子例程的错误我写过:
Error: Return type mismatch of function <function> at (1) (REAL(4)/REAL(8))
我不确定它的来源,因为程序中的所有内容都已更改为双精度。
例如,我已宣布以下内容:
double precision :: alpha(3),d(3),zeta1,zeta2
double precision :: A1(3),A2(3),D1(3),D2(3)
double precision :: PI
PI = 3.14159265359D0
alpha = (/0.109818D0, 0.405771D0, 2.22766D0/)
d = (/0.444635D0, 0.535328D0, 0.154329D0 /)
do 10 i=1,3
A1(i) = alpha(i)*zeta1**2.0D0
A2(i) = alpha(i)*zeta2**2.0D0
D1(i) = d(i)*(2.0D0*A1(i)/PI)**(3.0D0/4.0D0)
D2(i) = d(i)*(2.0D0*A2(i)/PI)**(3.0D0/4.0D0)
10 continue
功能:
subroutine createS(S,A1,A2,D1,D2,r)
double precision A1(3),A2(3),D1(3),D2(3)
double precision r
double precision S(2,2)
integer :: i,j
S(1,1) = 1.0D0
S(2,2) = 1.0D0
do 80 i=1,3
do 90 j=1,3
S(1,2) = S(1,2) + getS(A1(i),A2(j),r)*D1(i)*D2(j)
90 continue
80 continue
S(2,1) = S(1,2)
return
end
double precision function getS(a,b,r)
double precision :: PI
double precision a,b,r
double precision :: S
PI = 3.14159265359D0
S = (PI/(a+b))**1.5D0
S = S*dexp(-(a*b*r*r)/(a+b))
getS = S
return
end
然后我收到错误
HFSTO3G.f:85.28:
S(1,2) = S(1,2) + getS(A1(i),A2(j),r)*D1(i)*D2(j)
1
Error: Return type mismatch of function 'gets' at (1) (REAL(4)/REAL(8))
我正在使用gfortran进行编译。这可能是问题吗?我不是编程新手,但对Fortran不熟悉。不在Fortran编程也不是一种选择。
答案 0 :(得分:3)
您是否将子程序和函数放入模块并use
该模块?否则,可能正在发生的是您在子例程createS中将getS隐式类型化为单精度实数,但它实际上返回双精度。另一个建议:始终使用implicit none
来查找未声明的变量。如果您忘记在源代码中包含implicit none
,gfortran会提供编译器选项-fimplicit-none
。隐式类型是有害的,并且可能在Fortran中继续以支持遗留代码。
P.S。 double precision
也是过时的,但比隐式打字风险要小得多。如果您有最新版本的gfortran,可以使用以下内容:
use ISO_FORTRAN_ENV
real (real64) ::
请参阅gfortran手册。
编辑:implicit none
将getS的类型从real(4)(通过隐式类型)更改为unknown(未声明类型,禁用隐式类型)。如果将过程放入模块中,它们将“知道”彼此的类型:函数返回和参数类型。这将解决这个错误。它还有助于编译器找到其他错误,但允许它检查调用和过程参数之间的参数的一致性。有关示例,请参阅Correct use of modules, subroutines and functions in fortran和Computing the cross product of two vectors in Fortran 90。
答案 1 :(得分:2)
您没有在子例程getS
中将createS
声明为函数。您需要在子例程double precision, external :: getS
的变量声明中添加createS
。
答案 2 :(得分:-1)
将双精度替换为:
REAL (Kind=8)
INTEGER (Kind=4)
COMPLEX (Kind=8)