gfortran 混合了真实的类型

gfortran mixes up types of real

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

/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

在函数 boxdim 中,第一个变量给出为

  REAL,    INTENT (IN)  :: bmat(3,3)

boxdim 函数在 *.f 文件中给出。类型单元格给出为(在 *.f90 文件中):

  TYPE t_cell
     !name of 2D-lattice type
     CHARACTER*3::latnam
     !vol of dtilde box
     REAL::omtil
     !2D area
     REAL::area
     !bravais matrix
     REAL::amat(3,3)
     !rez. bravais matrx
     REAL::bmat(3,3)
     !square of bbmat
     REAL::bbmat(3,3)
     !d-value
     REAL::z1
     !volume of cell
     REAL::vol
     !volume of interstitial
     REAL::volint
     REAL:: c
  END TYPE t_cell

一切都使用 -fdefault-real-8 选项编译。如果我将 t_cell 中的 bmat 设置为

REAL(8) :: bmat

编译正常。为什么 gfortran 会忽略某些文件的 -fdefault-real-8?如果我使用 git 存储库中的新克隆,则不会出现此错误,它会在我处理此存储库一段时间后开始出现。

我完全被这个错误搞糊涂了。我的 gfortran 版本是 MacOS 上的 GNU Fortran (Homebrew GCC 8.2.0) 8.2.0,但我在 Ubuntu.

上的 7.2.0 上有同样的错误

P.S。整个代码在 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 指向其他类型(real32real128),而不是使用编译器选项。 REAL(8) :: bmat 不可移植。