簡體   English   中英

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上卻有相同的錯誤。

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指向其他類型( real32real128 ),而不用使用編譯器選項。 REAL(8) :: bmat無法移植。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM