I’m using VS2010 and PGI Visual Fortran 10.8
Current working old code is
SUBROUTINE NLMMT(TH,IFN,JFN,Z,M,N,DZ,DM,DN,HZ,HM,HN,RX,DT,FM)
C
PARAMETER (GX=1.0E-5, GG=9.81)
C
INTEGER IFN, JFN
REAL TH, Z(IFN,JFN,2), M(IFN,JFN,2), N(IFN,JFN,2)
REAL DZ(IFN,JFN,2), DM(IFN,JFN,2), DN(IFN,JFN,2)
REAL HZ(IFN,JFN), HM(IFN,JFN), HN(IFN,JFN), RX, DT, FM
REAL DM1, DM2, DN1, DN2, FN
C
DO 10 K=1,2
DO 10 J=1,JFN
DO 10 I=1,IFN
DM(I,J,K)=0.0
DN(I,J,K)=0.0
10 CONTINUE
C
DO J=1, JFN
DO I=1, IFN
IF (I .LT. IFN) THEN
DM1 = 0.25*(Z(I,J,1)+Z(I,J,2)+Z(I+1,J,1)+Z(I+1,J,2))
& + 0.5*(HZ(I,J)+HZ(I+1,J))
DM2 = 0.5*(Z(I,J,2)+Z(I+1,J,2)+HZ(I,J)+HZ(I+1,J))
ELSE
DM1 = Z(I,J,2) + HZ(I,J)
DM2 = Z(I,J,2) + HZ(I,J)
END IF
IF (DM1 .GE. GX) DM(I,J,1) = DM1
IF (DM2 .GE. GX) DM(I,J,2) = DM2
C
IF (J .LT. JFN) THEN
DN1 = 0.25*(Z(I,J,1)+Z(I,J,2)+Z(I,J+1,1)+Z(I,J+1,2))
& + 0.5*(HZ(I,J)+HZ(I,J+1))
DN2 = 0.5*(Z(I,J,2)+Z(I,J+1,2)+HZ(I,J)+HZ(I,J+1))
ELSE
DN1 = Z(I,J,2)+HZ(I,J)
DN2 = Z(I,J,2)+HZ(I,J)
END IF
IF (DN1 .GE. GX) DN(I,J,1) = DN1
IF (DN2 .GE. GX) DN(I,J,2) = DN2
END DO
END DO
FN=0.5*DT*GG*FM**2
C
C ------- X-DIRECTION -------
C
DO J=1, JFN
DO I=1, IFN
IF (HZ(I,J).GT.TH .AND. HM(I,J).GT.TH) THEN
CALL XMMT(GG, I, J, IFN, JFN, HZ, Z, DZ, DM,
& M, N, RX, FN)
END IF
C
C ------- Y-DIRECTION -------
C
IF (HZ(I,J).GT.TH .AND. HN(I,J).GT.TH) THEN
CALL YMMT(GG, I, J, IFN, JFN, HZ, Z, DZ, DN,
& M, N, RX, FN)
END IF
END DO
END DO
RETURN
END
This is the code after modification, but it doesn’t work correctly. Although some local variables are changed to arrays, it works correctly without !$acc region.
SUBROUTINE NLMMT(TH,IFN,JFN,Z,M,N,DZ,DM,DN,HZ,HM,HN,RX,DT,FM)
C
PARAMETER (GX=1.0E-5, GG=9.81)
C
INTEGER IFN, JFN
REAL TH, Z(IFN,JFN,2), M(IFN,JFN,2), N(IFN,JFN,2)
REAL DZ(IFN,JFN,2), DM(IFN,JFN,2), DN(IFN,JFN,2)
REAL HZ(IFN,JFN), HM(IFN,JFN), HN(IFN,JFN), RX, DT, FM
REAL DM1(IFN,JFN), DM2(IFN,JFN), DN1(IFN,JFN), DN2(IFN,JFN), FN
C
!$acc region
DO 10 K=1,2
DO 10 J=1,JFN
DO 10 I=1,IFN
DM(I,J,K)=0.0
DN(I,J,K)=0.0
10 CONTINUE
C
DO J=1, JFN
DO I=1, IFN
IF (I .LT. IFN) THEN
DM1(I,J) = 0.25*(Z(I,J,1)+Z(I,J,2)+Z(I+1,J,1)+Z(I+1,J,2))
& + 0.5*(HZ(I,J)+HZ(I+1,J))
DM2(I,J) = 0.5*(Z(I,J,2)+Z(I+1,J,2)+HZ(I,J)+HZ(I+1,J))
ELSE
DM1(I,J) = Z(I,J,2) + HZ(I,J)
DM2(I,J) = Z(I,J,2) + HZ(I,J)
END IF
C
IF (J .LT. JFN) THEN
DN1(I,J) = 0.25*(Z(I,J,1)+Z(I,J,2)+Z(I,J+1,1)+Z(I,J+1,2))
& + 0.5*(HZ(I,J)+HZ(I,J+1))
DN2(I,J) = 0.5*(Z(I,J,2)+Z(I,J+1,2)+HZ(I,J)+HZ(I,J+1))
ELSE
DN1(I,J) = Z(I,J,2)+HZ(I,J)
DN2(I,J) = Z(I,J,2)+HZ(I,J)
END IF
END DO
END DO
DO J=1, JFN
DO I=1, IFN
IF (DM1(I,J) .GE. GX) DM(I,J,1) = DM1(I,J)
IF (DM2(I,J) .GE. GX) DM(I,J,2) = DM2(I,J)
IF (DN1(I,J) .GE. GX) DN(I,J,1) = DN1(I,J)
IF (DN2(I,J) .GE. GX) DN(I,J,2) = DN2(I,J)
END DO
END DO
!$acc end region
FN=0.5*DT*GG*FM**2
C
C ------- X-DIRECTION -------
C
DO J=1, JFN
DO I=1, IFN
IF (HZ(I,J).GT.TH .AND. HM(I,J).GT.TH) THEN
CALL XMMT(GG, I, J, IFN, JFN, HZ, Z, DZ, DM,
& M, N, RX, FN)
END IF
C
C ------- Y-DIRECTION -------
C
IF (HZ(I,J).GT.TH .AND. HN(I,J).GT.TH) THEN
CALL YMMT(GG, I, J, IFN, JFN, HZ, Z, DZ, DN,
& M, N, RX, FN)
END IF
END DO
END DO
RETURN
END
The size of arrays M,N,Z are all 2293416x2293416x2
The main program call this function on only parts of the M,N,Z as around IFN=721 and JFN=841 per call