From a84e32c80bedb58de2c0338cc0e7aa57710ce000 Mon Sep 17 00:00:00 2001 From: ESCOBAR Juan <escj@nuwa> Date: Mon, 14 Sep 2020 12:02:05 +0200 Subject: [PATCH] Juan 14/09/2020 : resolved_cloud.f90 , more PGI BUG correction -> use MNH_ALLOCATE --- src/MNH/resolved_cloud.f90 | 150 +++++++++++++++++++++++++++---------- 1 file changed, 110 insertions(+), 40 deletions(-) diff --git a/src/MNH/resolved_cloud.f90 b/src/MNH/resolved_cloud.f90 index 56dfb0cc5..5e19a9116 100644 --- a/src/MNH/resolved_cloud.f90 +++ b/src/MNH/resolved_cloud.f90 @@ -325,6 +325,10 @@ USE MODI_SHUMAN USE MODI_SHUMAN_DEVICE #endif USE MODI_SLOW_TERMS +#ifdef MNH_OPENACC +USE MODE_MNH_ZWORK , ONLY : MNH_ALLOCATE_ZT3D , MNH_REL_ZT3D, MNH_ALLOCATE_ZT4D , MNH_REL_ZT4D , MNH_ALLOCATE_ZT2D , & + MNH_ALLOCATE_GT3D , MNH_REL_GT3D +#endif ! IMPLICIT NONE ! @@ -454,11 +458,18 @@ INTEGER :: IKL INTEGER :: IINFO_ll ! return code of parallel routine INTEGER :: JI,JJ,JK,JL ! -REAL, DIMENSION(:,:,:), ALLOCATABLE :: ZDZZ -REAL, DIMENSION(:,:,:), ALLOCATABLE :: ZT,ZEXN,ZLV,ZLS,ZCPH -REAL, DIMENSION(:,:,:), ALLOCATABLE :: ZCOR +REAL, DIMENSION(:,:,:), POINTER , CONTIGUOUS :: ZDZZ +REAL, DIMENSION(:,:,:), POINTER , CONTIGUOUS :: ZT +REAL, DIMENSION(:,:,:), POINTER , CONTIGUOUS :: ZEXN +REAL, DIMENSION(:,:,:), POINTER , CONTIGUOUS :: ZLV +REAL, DIMENSION(:,:,:), POINTER , CONTIGUOUS :: ZLS +REAL, DIMENSION(:,:,:), POINTER , CONTIGUOUS :: ZCPH +REAL, DIMENSION(:,:,:), POINTER , CONTIGUOUS :: ZCOR +INTEGER :: IZDZZ,IZT,IZEXN,IZLV,IZLS,IZCPH,IZCOR +! ! for the correction of negative rv -REAL, DIMENSION(:,:,:), ALLOCATABLE :: ZZZ +REAL, DIMENSION(:,:,:), POINTER , CONTIGUOUS :: ZZZ +INTEGER :: IZZZ ! model layer height REAL :: ZMASSTOT ! total mass for one water category ! including the negative values @@ -468,18 +479,22 @@ REAL :: ZRATIO ! ZMASSTOT / ZMASSCOR ! INTEGER :: ISVBEG ! first scalar index for microphysics INTEGER :: ISVEND ! last scalar index for microphysics -REAL, DIMENSION(:), ALLOCATABLE :: ZRSMIN ! Minimum value for tendencies -REAL, DIMENSION(:,:,:,:), ALLOCATABLE :: ZSVT ! scalar variable for microphysics only -REAL, DIMENSION(:,:,:,:), ALLOCATABLE :: ZSVS ! scalar tendency for microphysics only -LOGICAL, DIMENSION(:,:,:), ALLOCATABLE :: LLMICRO ! mask to limit computation +REAL, DIMENSION(:), ALLOCATABLE :: ZRSMIN ! Minimum value for tendencies +REAL, DIMENSION(:,:,:,:), POINTER , CONTIGUOUS :: ZSVT ! scalar variable for microphysics only +REAL, DIMENSION(:,:,:,:), POINTER , CONTIGUOUS :: ZSVS ! scalar tendency for microphysics only +LOGICAL, DIMENSION(:,:,:), POINTER , CONTIGUOUS :: LLMICRO ! mask to limit computation +INTEGER :: IZSVT,IZSVS,ILLMICRO ! REAL, DIMENSION(SIZE(PZZ,1),SIZE(PZZ,2),SIZE(PZZ,3), KRR) :: ZFPR ! INTEGER :: JMOD, JMOD_IFN LOGICAL :: GWEST,GEAST,GNORTH,GSOUTH ! BVIE work array waiting for PINPRI -REAL, DIMENSION(:,:), ALLOCATABLE :: ZINPRI -REAL, DIMENSION(:,:,:), ALLOCATABLE :: ZTHSSTEP -REAL, DIMENSION(:,:,:,:), ALLOCATABLE :: ZRSSTEP +REAL, DIMENSION(:,:), POINTER , CONTIGUOUS :: ZINPRI +REAL, DIMENSION(:,:,:), POINTER , CONTIGUOUS :: ZTHSSTEP +REAL, DIMENSION(:,:,:,:), POINTER , CONTIGUOUS :: ZRSSTEP +INTEGER :: IZINPRI,IZTHSSTEP,IZRSSTEP +! +INTEGER :: JIU,JJU,JKU ! !------------------------------------------------------------------------------ ! @@ -549,20 +564,40 @@ IF (MPPDB_INITIALIZED) THEN CALL MPPDB_CHECK(PSSPRO,"RESOLVED_CLOUD beg:PSSPRO") END IF ! -allocate ( LLMICRO ( SIZE(PZZ,1), SIZE(PZZ,2), SIZE(PZZ,3) ) ) -allocate ( ZDZZ ( SIZE(PZZ,1), SIZE(PZZ,2), SIZE(PZZ,3) ) ) -allocate ( ZT ( SIZE(PZZ,1), SIZE(PZZ,2), SIZE(PZZ,3) ) ) -allocate ( ZEXN ( SIZE(PZZ,1), SIZE(PZZ,2), SIZE(PZZ,3) ) ) -allocate ( ZLV ( SIZE(PZZ,1), SIZE(PZZ,2), SIZE(PZZ,3) ) ) -allocate ( ZLS ( SIZE(PZZ,1), SIZE(PZZ,2), SIZE(PZZ,3) ) ) -allocate ( ZCPH ( SIZE(PZZ,1), SIZE(PZZ,2), SIZE(PZZ,3) ) ) -allocate ( ZCOR ( SIZE(PZZ,1), SIZE(PZZ,2), SIZE(PZZ,3) ) ) -allocate ( ZZZ ( SIZE(PZZ,1), SIZE(PZZ,2), SIZE(PZZ,3) ) ) -allocate ( ZINPRI ( SIZE(PZZ,1), SIZE(PZZ,2) ) ) +JIU = size(PZZ, 1 ) +JJU = size(PZZ, 2 ) +JKU = size(PZZ, 3 ) +! +#ifndef MNH_OPENACC +allocate ( LLMICRO ( JIU,JJU,JKU ) ) +allocate ( ZDZZ ( JIU,JJU,JKU ) ) +allocate ( ZT ( JIU,JJU,JKU ) ) +allocate ( ZEXN ( JIU,JJU,JKU ) ) +allocate ( ZLV ( JIU,JJU,JKU ) ) +allocate ( ZLS ( JIU,JJU,JKU ) ) +allocate ( ZCPH ( JIU,JJU,JKU ) ) +allocate ( ZCOR ( JIU,JJU,JKU ) ) +allocate ( ZZZ ( JIU,JJU,JKU ) ) +allocate ( ZINPRI ( JIU,JJU ) ) allocate ( ZTHSSTEP ( SIZE(PTHS,1), SIZE(PTHS,2), SIZE(PTHS,3) ) ) allocate ( ZRSSTEP ( SIZE(PRS,1), SIZE(PRS,2), SIZE(PRS,3), SIZE(PRS,4) ) ) +#else +ILLMICRO = MNH_ALLOCATE_GT3D ( LLMICRO ,JIU,JJU,JKU ) +IZDZZ = MNH_ALLOCATE_ZT3D ( ZDZZ ,JIU,JJU,JKU ) +IZT = MNH_ALLOCATE_ZT3D ( ZT ,JIU,JJU,JKU ) +IZEXN = MNH_ALLOCATE_ZT3D ( ZEXN ,JIU,JJU,JKU ) +IZLV = MNH_ALLOCATE_ZT3D ( ZLV ,JIU,JJU,JKU ) +IZLS = MNH_ALLOCATE_ZT3D ( ZLS ,JIU,JJU,JKU ) +IZCPH = MNH_ALLOCATE_ZT3D ( ZCPH ,JIU,JJU,JKU ) +IZCOR = MNH_ALLOCATE_ZT3D ( ZCOR ,JIU,JJU,JKU ) +IZZZ = MNH_ALLOCATE_ZT3D ( ZZZ ,JIU,JJU,JKU ) +IZINPRI = MNH_ALLOCATE_ZT2D ( ZINPRI ,JIU,JJU ) +IZTHSSTEP = MNH_ALLOCATE_ZT3D ( ZTHSSTEP , SIZE(PTHS,1), SIZE(PTHS,2), SIZE(PTHS,3) ) +IZRSSTEP = MNH_ALLOCATE_ZT4D ( ZRSSTEP , SIZE(PRS,1), SIZE(PRS,2), SIZE(PRS,3), SIZE(PRS,4) ) +#endif + -!$acc data create(LLMICRO,ZDZZ,ZT,ZEXN,ZLV,ZLS,ZCPH,ZCOR,ZZZ,ZINPRI,ZTHSSTEP,ZRSSTEP) +!$acc data present(LLMICRO,ZDZZ,ZT,ZEXN,ZLV,ZLS,ZCPH,ZCOR,ZZZ,ZINPRI,ZTHSSTEP,ZRSSTEP) CALL GET_INDICE_ll (IIB,IJB,IIE,IJE) IKA=1 @@ -592,9 +627,14 @@ ELSE END IF ! IF (HCLOUD=='C2R2' .OR. HCLOUD=='C3R5' .OR. HCLOUD=='KHKO' .OR. HCLOUD=='LIMA') THEN +#ifndef MNH_OPENACC ALLOCATE(ZSVT(SIZE(PZZ,1),SIZE(PZZ,2),SIZE(PZZ,3),ISVEND - ISVBEG + 1)) ALLOCATE(ZSVS(SIZE(PZZ,1),SIZE(PZZ,2),SIZE(PZZ,3),ISVEND - ISVBEG + 1)) -!$acc enter data create(ZSVT,ZSVS) +#else + IZSVT = MNH_ALLOCATE_ZT4D(ZSVT ,SIZE(PZZ,1),SIZE(PZZ,2),SIZE(PZZ,3),ISVEND - ISVBEG + 1 ) + IZSVS = MNH_ALLOCATE_ZT4D(ZSVS ,SIZE(PZZ,1),SIZE(PZZ,2),SIZE(PZZ,3),ISVEND - ISVBEG + 1 ) +! acc enter data create(ZSVT,ZSVS) +#endif ZSVT(:,:,:,:) = PSVT(:,:,:,ISVBEG:ISVEND) ZSVS(:,:,:,:) = PSVS(:,:,:,ISVBEG:ISVEND) END IF @@ -609,11 +649,12 @@ END IF !* 2. TRANSFORMATION INTO PHYSICAL TENDENCIES ! --------------------------------------- ! -!$acc kernels present(PTHS,PRS,PRHODJ,PPABST,ZEXN,ZLV,ZLS,ZCPH,ZSVS) +!$acc kernels ! present(PTHS,PRS,PRHODJ,PPABST,ZEXN,ZLV,ZLS,ZCPH,ZSVS) PTHS(:,:,:) = PTHS(:,:,:) / PRHODJ(:,:,:) -DO JRR = 1,KRR - PRS(:,:,:,JRR) = PRS(:,:,:,JRR) / PRHODJ(:,:,:) -END DO +! +DO CONCURRENT ( JI=1:JIU,JJ=1:JJU,JK=1:JKU ,JRR = 1:KRR ) + PRS(JI,JJ,JK,JRR) = PRS(JI,JJ,JK,JRR) / PRHODJ(JI,JJ,JK) +END DO ! CONCURRENT ! IF (HCLOUD=='C2R2' .OR. HCLOUD=='C3R5' .OR. HCLOUD=='KHKO' .OR. HCLOUD=='LIMA') THEN DO JSV = 1,SIZE(ZSVS,4) @@ -681,15 +722,17 @@ ENDIF ! microphysical routines would save ! computing time ! +DO CONCURRENT ( JI=1:JIU,JJ=1:JJU,JK=1:JKU) #ifndef MNH_BITREP -ZEXN(:,:,:) = (PPABST(:,:,:)/XP00) ** (XRD/XCPD) +ZEXN(JI,JJ,JK) = (PPABST(JI,JJ,JK)/XP00) ** (XRD/XCPD) #else -ZEXN(:,:,:) = BR_POW(PPABST(:,:,:)/XP00,XRD/XCPD) +ZEXN(JI,JJ,JK) = BR_POW(PPABST(JI,JJ,JK)/XP00,XRD/XCPD) #endif -ZT(:,:,:)= PTHT(:,:,:)*ZEXN(:,:,:) -ZLV(:,:,:)=XLVTT +(XCPV-XCL) *(ZT(:,:,:)-XTT) -ZLS(:,:,:)=XLSTT +(XCPV-XCI) *(ZT(:,:,:)-XTT) -ZCPH(:,:,:)=XCPD +XCPV*PRT(:,:,:,1) +ZT(JI,JJ,JK)= PTHT(JI,JJ,JK)*ZEXN(JI,JJ,JK) +ZLV(JI,JJ,JK)=XLVTT +(XCPV-XCL) *(ZT(JI,JJ,JK)-XTT) +ZLS(JI,JJ,JK)=XLSTT +(XCPV-XCI) *(ZT(JI,JJ,JK)-XTT) +ZCPH(JI,JJ,JK)=XCPD +XCPV*PRT(JI,JJ,JK,1) +END DO ! CONCURRENT !$acc end kernels ! ! @@ -835,7 +878,7 @@ CALL PRINT_MSG(NVERB_WARNING,'GEN','RESOLVED_CLOUD','KESS being implemented') END IF #else #if 1 -!$acc kernels present(PTHS,PRS,PEXNREF) present(ZLV,ZLS,ZCPH,ZCOR) +!$acc kernels ! present(PTHS,PRS,PEXNREF) present(ZLV,ZLS,ZCPH,ZCOR) !$acc loop independent collapse(3) DO JK=1,SIZE(PZZ,3) DO JJ=1,SIZE(PZZ,2) @@ -874,7 +917,7 @@ CALL PRINT_MSG(NVERB_WARNING,'GEN','RESOLVED_CLOUD','KESS being implemented') END DO !$acc end kernels #else -!$acc kernels present(PTHS,PRS,PEXNREF) present(ZLV,ZLS,ZCPH,ZCOR) +!$acc kernels ! present(PTHS,PRS,PEXNREF) present(ZLV,ZLS,ZCPH,ZCOR) DO JK=1,SIZE(PZZ,3) DO JJ=1,SIZE(PZZ,2) DO JI=1,SIZE(PZZ,1) @@ -1474,10 +1517,17 @@ END IF ! --------------------------------------- ! !$acc kernels -PTHS(:,:,:) = PTHS(:,:,:) * PRHODJ(:,:,:) +DO CONCURRENT ( JI=1:JIU,JJ=1:JJU,JK=1:JKU) + PTHS(JI,JJ,JK) = PTHS(JI,JJ,JK) * PRHODJ(JI,JJ,JK) +END DO ! CONCURRENT +!$acc end kernels ! -DO JRR = 1,KRR - PRS(:,:,:,JRR) = PRS(:,:,:,JRR) * PRHODJ(:,:,:) +!$acc kernels +!$acc loop seq +DO JRR=1,KRR + DO CONCURRENT ( JI=1:JIU,JJ=1:JJU,JK=1:JKU ) + PRS(JI,JJ,JK,JRR) = PRS(JI,JJ,JK,JRR) * PRHODJ(JI,JJ,JK) + END DO ! CONCURRENT END DO !$acc end kernels ! @@ -1487,8 +1537,14 @@ IF (HCLOUD=='C2R2' .OR. HCLOUD=='C3R5' .OR. HCLOUD=='KHKO' .OR. HCLOUD=='LIMA') ENDDO DO JSV = 1,SIZE(ZSVT,4) PSVT(:,:,:,JSV+ISVBEG-1) = ZSVT(:,:,:,JSV) - ENDDO -!$acc exit data delete(ZSVT,ZSVS) + ENDDO +#ifndef MNH_OPENACC + deallocate(ZSVT,ZSVS) +#else + CALL MNH_REL_ZT4D( ISVEND - ISVBEG + 1 , IZSVS) + CALL MNH_REL_ZT4D( ISVEND - ISVBEG + 1 , IZSVT) +! acc exit data delete(ZSVT,ZSVS) +#endif ENDIF ! IF (MPPDB_INITIALIZED) THEN @@ -1521,6 +1577,20 @@ END IF !$acc end data +#ifndef MNH_OPENACC +deallocate (LLMICRO) +deallocate (ZDZZ,ZT,ZEXN,ZLV,ZLS,ZCPH,ZCOR,ZZZ) +deallocate (ZINPRI) +deallocate (ZTHSSTEP) +deallocate (ZRSSTEP) +#else +CALL MNH_REL_ZT4D(SIZE(PRS,4) , IZRSSTEP ) +CALL MNH_REL_ZT3D ( IZTHSSTEP ) +CALL MNH_REL_ZT3D ( IZINPRI ) +CALL MNH_REL_ZT3D ( IZDZZ,IZT,IZEXN,IZLV,IZLS,IZCPH,IZCOR,IZZZ) +CALL MNH_REL_GT3D ( ILLMICRO ) +#endif + !$acc end data !------------------------------------------------------------------------------- -- GitLab