我对fortran很新,坦白说除了最简单的建筑程序。我正在尝试在远程服务器上编译一个大型代码包,它使用gfortran
(gfortran-mp-4.8
)在我的笔记本电脑上工作,但它使用ifort
(ifort (IFORT) 13.0.0
)抱怨
这些是我的错误:
/n/sw/centos6/openmpi-1.6.4_intel-13.0.079/bin/mpif90 -ggdb -c -O2 -fdefault-real-8 -fdefault-double-8 -Wuninitialized -DMAXBLOCKS=1000 -DNXB=8 -DNYB=8 -DNZB=8 -DN_DIM=3 nrutil.F90
ifort: command line warning #10006: ignoring unknown option '-fdefault-real-8'
ifort: command line warning #10006: ignoring unknown option '-fdefault-double-8'
ifort: command line warning #10157: ignoring option '-W'; argument is of wrong type
nrutil.F90(713): warning #7319: This argument's data type is incompatible with this intrinsic procedure; procedure assumed EXTERNAL. [DCOS]
zroots_unity(k+1)=cmplx(dcos(k*theta),dsin(k*theta),SPC)
--------------------------------------^
nrutil.F90(713): error #6404: This name does not have a type, and must have an explicit type. [DCOS]
zroots_unity(k+1)=cmplx(dcos(k*theta),dsin(k*theta),SPC)
--------------------------------^
nrutil.F90(713): warning #7319: This argument's data type is incompatible with this intrinsic procedure; procedure assumed EXTERNAL. [DSIN]
zroots_unity(k+1)=cmplx(dcos(k*theta),dsin(k*theta),SPC)
----------------------------------------------------^
nrutil.F90(713): error #6404: This name does not have a type, and must have an explicit type. [DSIN]
zroots_unity(k+1)=cmplx(dcos(k*theta),dsin(k*theta),SPC)
----------------------------------------------^
nrutil.F90(713): warning #7319: This argument's data type is incompatible with this intrinsic procedure; procedure assumed EXTERNAL. [CMPLX]
zroots_unity(k+1)=cmplx(dcos(k*theta),dsin(k*theta),SPC)
--------------------------------^
nrutil.F90(713): warning #7319: This argument's data type is incompatible with this intrinsic procedure; procedure assumed EXTERNAL. [CMPLX]
zroots_unity(k+1)=cmplx(dcos(k*theta),dsin(k*theta),SPC)
----------------------------------------------^
nrutil.F90(713): error #6404: This name does not have a type, and must have an explicit type. [CMPLX]
zroots_unity(k+1)=cmplx(dcos(k*theta),dsin(k*theta),SPC)
--------------------------^
compilation aborted for nrutil.F90 (code 1)
和(我希望是)相关代码:
...
USE nrtype
implicit none
...
!BL
FUNCTION zroots_unity(n,nn)
INTEGER(I4B), INTENT(IN) :: n,nn
COMPLEX(SPC), DIMENSION(nn) :: zroots_unity
INTEGER(I4B) :: k
REAL(SP) :: theta
zroots_unity(1)=1.0
theta=TWOPI/n
k=1
do
if (k >= nn) exit
zroots_unity(k+1)=cmplx(dcos(k*theta),dsin(k*theta),SPC)
zroots_unity(k+2:min(2*k,nn))=zroots_unity(k+1)*&
zroots_unity(2:min(k,nn-k))
k=2*k
end do
END FUNCTION zroots_unity
!BL
文件nrtype
包含TWOPI
MODULE nrtype
...
REAL(SP), PARAMETER :: TWOPI=6.283185307179586476925286766559005768394_sp
...
END MODULE nrtype
dcos
,dsin
和cmplx
是内置函数,对吧?所以它必须抱怨论点......但看起来k
和theta
都有明确的类型:INTEGER
和REAL
(我不知道) (I4B)
和(SP)
的意思是什么... ...
非常感谢任何帮助
答案 0 :(得分:4)
dcos
是一种过时的余弦形式,其中编程显式指示编译器参数是双精度。现代方式(几十年!)就是使用cos
并让编译器自动确定要使用的版本。这里有dcos
等的参数,它们不是双精度,因此编译器抱怨。我建议不要使用" D"表格,所以我建议编辑代码。
也就是说,如果算法需要双精度才能具有足够的精度,您可能需要进行其他更改以使变量具有预期的精度。最好的方法(IMO)是适当地声明变量。一种简单的方法是使用ISO Fortran环境提供的类型:请参阅precision of real variable。
您似乎一直使用gfortran编译器选项进行默认的实际双精度。英特尔Fortran正在拒绝该特定编译器选项; ifort等价物是" -real-size 64"。这可能是让代码正常工作的最快方法。
"&I4B#34;和" SP"是由数字食谱模块提供的类型" nrtypes"这是4字节整数和单精度实数。