我将F77代码转换为F90,并且我试图摆脱隐式声明和包含。
特别是,我有一个子程序(经常被称为)
子程序:
SUBROUTINE GRADE(NIE,NJE,NKE,IDEW,IDNS,IDTB,FI,FIF,GRX,GRY,GRZ)
USE module_dec
USE module_geom_common
IMPLICIT NONE
REAL :: FI(NXYZA),FIF(NXYZA)
REAL :: GRX(NXYZA),GRY(NXYZA),GRZ(NXYZA)
REAL :: BN(NXYZA),BE(NXYZA),BT(NXYZA)
REAL :: FIE
INTEGER :: NIE,NJE,NKE,IDEW,IDNS,IDTB
INTEGER :: I,J,K
! Declaration of the variables used in file.inc
REAL :: ARX,ARY,ARZ
REAL :: AKX,AKY,AKZ
REAL :: ARE,ARE2,ARKSI2
REAL :: FXE,FXW
INTEGER :: INE
REAL :: DELN,DELNR
DO 30 K=2,NKE
DO 30 I=2,NIE
DO 30 J=2,NJE
INCLUDE "file.inc"
FIE=FI(INP)*FXW+FI(INE)*FXE
BE(INP)= FIE*ARX
BN(INP)= FIE*ARY
BT(INP)= FIE*ARZ
30 CONTINUE
DO 31 K=2,NKE
DO 31 I=2,NIE
DO 31 J=2,NJE
INP=LK(K)+LI(I)+J
GRX(INP)=GRX(INP)+BE(INP)
GRY(INP)=GRY(INP)+BN(INP)
GRZ(INP)=GRZ(INP)+BT(INP)
GRX(INP+IDEW)=GRX(INP+IDEW)-BE(INP)
GRY(INP+IDEW)=GRY(INP+IDEW)-BN(INP)
GRZ(INP+IDEW)=GRZ(INP+IDEW)-BT(INP)
31 CONTINUE
和file.inc
INP=LK(K)+LI(I)+J
INE=INP+IDEW
INS=INP-IDNS
INB=INP-IDTB
INBS=INB-IDNS
FXE=FIF(INP)
FXW=1.-FXE
DXS=.5*(X(INP)-X(INS)+X(INB)-X(INBS))
DYS=.5*(Y(INP)-Y(INS)+Y(INB)-Y(INBS))
DZS=.5*(Z(INP)-Z(INS)+Z(INB)-Z(INBS))
DXT=.5*(X(INP)-X(INB)+X(INS)-X(INBS))
DYT=.5*(Y(INP)-Y(INB)+Y(INS)-Y(INBS))
DZT=.5*(Z(INP)-Z(INB)+Z(INS)-Z(INBS))
ARX=DYS*DZT-DYT*DZS
ARY=DZS*DXT-DZT*DXS
ARZ=DXS*DYT-DXT*DYS
ARE2=ARX**2+ARY**2+ARZ**2
AKX=XC(INE)-XC(INP)
AKY=YC(INE)-YC(INP)
AKZ=ZC(INE)-ZC(INP)
ARKSI2=AKX**2+AKY**2+AKZ**2
我的程序执行时间为12秒
当我移动' file.inc'中存在的变量声明时在一个模块中,
MODULE module_geom_common
REAL :: ARX,ARY,ARZ
REAL :: AKX,AKY,AKZ
REAL :: ARE,ARE2,ARKSI2
REAL :: FXE,FXW
INTEGER :: INE
REAL :: DELN,DELNR
END MODULE module_geom_common
我现在的执行时间为13秒。
我正在使用ifort进行编译,但我观察到与gfortran相同的内容。
我不明白我为什么慢一点。 是因为在模块中声明的变量会被放在内存中,导致缓存未命中或类似的东西吗?
有没有办法在不使用include的情况下克服这个问题?
编辑:我已编辑了我的问题,以便提供更多详细信息。