Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/iphone/44.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
gfortran混淆了真实的_Fortran_Gfortran - Fatal编程技术网

gfortran混淆了真实的

gfortran混淆了真实的,fortran,gfortran,Fortran,Gfortran,我想编译一个大代码,它会抛出以下错误: /Users/redies/fleur/types/types_lapw.F90:178:47: CALL boxdim(cell%bmat,arltv1,arltv2,arltv3) 1 Error: Type mismatch in argument 'bmat' at (1); passed REAL(4) to REAL(8) /Users/r

我想编译一个大代码,它会抛出以下错误:

/Users/redies/fleur/types/types_lapw.F90:178:47:

     CALL boxdim(cell%bmat,arltv1,arltv2,arltv3)
                                               1
Error: Type mismatch in argument 'bmat' at (1); passed REAL(4) to REAL(8)
/Users/redies/fleur/types/types_lapw.F90:69:47:

     CALL boxdim(cell%bmat,arltv1,arltv2,arltv3)
                                               1
Error: Type mismatch in argument 'bmat' at (1); passed REAL(4) to REAL(8)
make[2]: *** [CMakeFiles/fleur_MPI.dir/types/types_lapw.F90.o] Error 1
make[1]: *** [CMakeFiles/fleur_MPI.dir/all] Error 2
make: *** [all] Error 2
在函数框DIM中,第一个变量如下所示

  REAL,    INTENT (IN)  :: bmat(3,3)
boxdim函数在*.f文件中给出。单元格类型如下所示(在*.f90文件中):

所有内容都使用-fdefault-real-8选项编译。如果我将t_cell中的bmat设置为

REAL(8) :: bmat
它编译得很好。为什么gfortran对某些文件忽略-fdefault-real-8?如果我使用git repo的新克隆,则不会出现此错误,在我使用此repo一段时间后,它会开始出现

我完全被这只虫子吓坏了。我的gfortran版本在MacOS上是GNU Fortran(自制GCC 8.2.0)8.2.0,但在Ubuntu上的7.2.0上也有同样的错误


另外,整个代码在ifort中编译得很好,正如第一条评论中提到的,为什么不根据可移植的现代Fortran规则简单地声明所需的实数类型来解决您的问题呢:

module t_cell_mod

    use, intrinsic :: iso_fortran_env, only: RK => real64
    implicit none

    type t_cell

        !name of 2D-lattice type
        CHARACTER(len=3) :: latnam

        !vol of dtilde box
        real(RK) :: omtil

        !2D area
        real(RK) :: area

        !bravais matrix
        real(RK) :: amat(3,3)

        !rez. bravais matrx
        real(RK) :: bmat(3,3)

        !square of bbmat
        real(RK) :: bbmat(3,3)

        !d-value
        real(RK) :: z1

        !volume of cell
        real(RK) :: vol

        !volume of interstitial
        real(RK) :: volint
        real(RK) :: c

    end type t_cell

end module t_cell_mod

如果您需要任何其他真正的类型,只需将
RK
指向其他类型(
real32
real128
),而不是使用编译器选项
REAL(8)::bmat
不可移植。

一位gfortran开发者建议用户永远不要使用gfortran提供的-fdefault-*选项。他声称这些选项可能不会像天真的用户所想的那样。他建议人们应该正确地声明他/她的变量。如果您确定要使用-fdefault-real-8选项,则可能需要使用-freal-4-real-8选项。我刚刚尝试了
-freal-4-real-8
,但这对情况没有帮助。重写整个代码可能需要一点工作量。幸运的是,在gfortran中,它会提示问题(节省大量调试)。在ifort中,您应该查看选项
-gen\u interfaces-warn interfaces
,您可能会发现更多内容。关于“重写整个代码可能需要做一点工作”,所以你更喜欢有bug的代码?为什么我很幸运?这是有效代码。我在任何地方都使用
real
,但不知何故gfortran有时将其解释为
real(8)
,有时解释为
real(4)
,然后抱怨它不匹配。@stein“这对情况没有帮助”不太具有描述性。恐怕我们需要看完整的代码才能提供帮助。-freal-4-real-8选项是一个大锤,可以从
real(4)
升级到
real(8)
。顺便说一句,如果您有多个正在编译的文件,则必须使用这些选项编译所有文件。
module t_cell_mod

    use, intrinsic :: iso_fortran_env, only: RK => real64
    implicit none

    type t_cell

        !name of 2D-lattice type
        CHARACTER(len=3) :: latnam

        !vol of dtilde box
        real(RK) :: omtil

        !2D area
        real(RK) :: area

        !bravais matrix
        real(RK) :: amat(3,3)

        !rez. bravais matrx
        real(RK) :: bmat(3,3)

        !square of bbmat
        real(RK) :: bbmat(3,3)

        !d-value
        real(RK) :: z1

        !volume of cell
        real(RK) :: vol

        !volume of interstitial
        real(RK) :: volint
        real(RK) :: c

    end type t_cell

end module t_cell_mod