[英]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上却有相同的错误。
PS整个代码在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
无法移植。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.