编译器无法识别显式类型

时间:2014-06-13 02:55:10

标签: compiler-errors fortran fortran90 intel-fortran

我对fortran很新,坦白说除了最简单的建筑程序。我正在尝试在远程服务器上编译一个大型代码包,它使用gfortrangfortran-mp-4.8)在我的笔记本电脑上工作,但它使用ifortifort (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

dcosdsincmplx是内置函数,对吧?所以它必须抱怨论点......但看起来ktheta都有明确的类型:INTEGERREAL(我不知道) (I4B)(SP)的意思是什么... ...

非常感谢任何帮助

1 个答案:

答案 0 :(得分:4)

dcos是一种过时的余弦形式,其中编程显式指示编译器参数是双精度。现代方式(几十年!)就是使用cos并让编译器自动确定要使用的版本。这里有dcos等的参数,它们不是双精度,因此编译器抱怨。我建议不要使用" D"表格,所以我建议编辑代码。

也就是说,如果算法需要双精度才能具有足够的精度,您可能需要进行其他更改以使变量具有预期的精度。最好的方法(IMO)是适当地声明变量。一种简单的方法是使用ISO Fortran环境提供的类型:请参阅precision of real variable

您似乎一直使用gfortran编译器选项进行默认的实际双精度。英特尔Fortran正在拒绝该特定编译器选项; ifort等价物是" -real-size 64"。这可能是让代码正常工作的最快方法。

"&I4B#34;和" SP"是由数字食谱模块提供的类型" nrtypes"这是4字节整数和单精度实数。