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
指向其他类型(real32
、real128
),而不是使用编译器选项。 REAL(8) :: bmat
不可移植。
我想编译一个大代码,它抛出这个错误:
/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
指向其他类型(real32
、real128
),而不是使用编译器选项。 REAL(8) :: bmat
不可移植。