diff --git a/src/MNH/condensation.f90 b/src/MNH/condensation.f90 index bed183f7b5942d9d2143f13ce50c7624ca84b86e..0afa5265f161fd4c479ee1c3e0b77bbdf04089a2 100644 --- a/src/MNH/condensation.f90 +++ b/src/MNH/condensation.f90 @@ -229,6 +229,9 @@ REAL, DIMENSION(:,:,:), POINTER, CONTIGUOUS :: ZINCP LOGICAL :: GPRESENT_PLV, GPRESENT_PLS, GPRESENT_PCPH LOGICAL, DIMENSION(:,:,:), POINTER, CONTIGUOUS :: GWORK CHARACTER(LEN=4) :: YLAMBDA3 !Necessary to workaround NVHPC bug (version 21.7 if OpenACC enabled) +LOGICAL :: GPRESENT_PHLC_HCF, GPRESENT_PHLC_HRC, GPRESENT_PHLI_HCF, GPRESENT_PHLI_HRI +! +INTEGER, DIMENSION(:), POINTER, CONTIGUOUS :: JKPK,JKMK ! !* 0.3 Definition of constants : ! @@ -252,6 +255,14 @@ REAL, DIMENSION(-22:11),PARAMETER :: ZSRC_1D =(/ & ! !------------------------------------------------------------------------------- ! +GPRESENT_PLV = PRESENT(PLV) +GPRESENT_PLS = PRESENT(PLS) +GPRESENT_PCPH = PRESENT(PCPH) +GPRESENT_PHLC_HCF = PRESENT(PHLC_HCF) +GPRESENT_PHLC_HRC = PRESENT(PHLC_HRC) +GPRESENT_PHLI_HCF = PRESENT(PHLI_HCF) +GPRESENT_PHLI_HRI = PRESENT(PHLI_HRI) +! IF (MPPDB_INITIALIZED) THEN !Check all IN arrays CALL MPPDB_CHECK3D(PPABS,"CONDENSATION beg:PPABS",PRECISION) @@ -260,9 +271,9 @@ IF (MPPDB_INITIALIZED) THEN CALL MPPDB_CHECK3D(PRG,"CONDENSATION beg:PRG",PRECISION) CALL MPPDB_CHECK3D(PSIGS,"CONDENSATION beg:PSIGS",PRECISION) CALL MPPDB_CHECK3D(PMFCONV,"CONDENSATION beg:PMFCONV",PRECISION) - IF (PRESENT(PLV)) CALL MPPDB_CHECK3D(PLV,"CONDENSATION beg:PLV",PRECISION) - IF (PRESENT(PLS)) CALL MPPDB_CHECK3D(PLS,"CONDENSATION beg:PLS",PRECISION) - IF (PRESENT(PCPH)) CALL MPPDB_CHECK3D(PCPH,"CONDENSATION beg:PCPH",PRECISION) + IF (GPRESENT_PLV) CALL MPPDB_CHECK3D(PLV,"CONDENSATION beg:PLV",PRECISION) + IF (GPRESENT_PLS) CALL MPPDB_CHECK3D(PLS,"CONDENSATION beg:PLS",PRECISION) + IF (GPRESENT_PCPH) CALL MPPDB_CHECK3D(PCPH,"CONDENSATION beg:PCPH",PRECISION) !Check all INOUT arrays CALL MPPDB_CHECK3D(PT,"CONDENSATION beg:PT",PRECISION) CALL MPPDB_CHECK3D(PRV,"CONDENSATION beg:PRV",PRECISION) @@ -321,6 +332,8 @@ allocate( INQ1P(kiu, kju, kku ) allocate( ZINCP(kiu, kju, kku ) allocate( ZRCOLDP(kiu, kju, kku ) allocate( ZRIOLDP(kiu, kju, kku ) +allocate( JKPK(kku) ) +allocate( JKMK(kku) ) #else !Pin positions in the pools of MNH memory @@ -371,23 +384,20 @@ CALL MNH_MEM_GET( INQ1P, kiu, kju, kku ) CALL MNH_MEM_GET( ZINCP, kiu, kju, kku ) CALL MNH_MEM_GET( ZRCOLDP, kiu, kju, kku ) CALL MNH_MEM_GET( ZRIOLDP, kiu, kju, kku ) +CALL MNH_MEM_GET( JKPK, kku ) +CALL MNH_MEM_GET( JKMK, kku ) !$acc data present( PPABS, PZZ, PT, PRV, PRC, PRI, PRS, PRG, PSIGS, PMFCONV, PCLDFR, PSIGRC, & !$acc & ztlk, zrt, zl, zfrac, itpl, ztmin, zlv, zls,zcpd, gwork,& !$acc & ZZZP,JKPP,ZPVP,ZQSLP,ZPIVP,ZQSIP,ZLVSP,ZAHP,ZAP,ZBP,ZSBARP,ZSIGMAP,& !$acc & DZZP,ZDRWP,ZDTLP,ZLLP,ZSIG_CONVP,ZQ1P,ZGCONDP,ZGAUVP,ZCONDP,ZAUTCP,& -!$acc & ZGAUTCP,ZGAUCP,ZCRIAUTIP,ZAUTIP,ZGAUTIP,ZGAUIP,INQ1P,ZINCP,ZRCOLDP,ZRIOLDP) +!$acc & ZGAUTCP,ZGAUCP,ZCRIAUTIP,ZAUTIP,ZGAUTIP,ZGAUIP,INQ1P,ZINCP,ZRCOLDP,ZRIOLDP,& +!$acc & JKPK,JKMK ) #endif IKTB=1+JPVEXT IKTE=KKU-JPVEXT ! -GPRESENT_PLV = .FALSE. -GPRESENT_PLS = .FALSE. -GPRESENT_PCPH = .FALSE. -IF (PRESENT(PLV)) GPRESENT_PLV = .TRUE. -IF (PRESENT(PLS)) GPRESENT_PLS = .TRUE. -IF (PRESENT(PCPH)) GPRESENT_PCPH = .TRUE. ! !$acc kernels PCLDFR(:,:,:) = 0. ! Initialize values @@ -437,8 +447,9 @@ IF ( .NOT. OSIGMAS ) THEN - ZLV(KIB:KIE,KJB:KJE,IKTB:IKTE)*PRC(KIB:KIE,KJB:KJE,IKTB:IKTE)/ZCPD(KIB:KIE,KJB:KJE,IKTB:IKTE) & - ZLS(KIB:KIE,KJB:KJE,IKTB:IKTE)*PRI(KIB:KIE,KJB:KJE,IKTB:IKTE)/ZCPD(KIB:KIE,KJB:KJE,IKTB:IKTE) ! Determine tropopause/inversion height from minimum temperature - ITPL(KIB:KIE,KJB:KJE) = KIB+1 + ITPL(KIB:KIE,KJB:KJE) = KKB+KKL ZTMIN(KIB:KIE,KJB:KJE) = 400. + !$acc loop seq DO JK = IKTB+1,IKTE-1 WHERE ( PT(KIB:KIE,KJB:KJE,JK) < ZTMIN(KIB:KIE,KJB:KJE) ) ZTMIN(KIB:KIE,KJB:KJE) = PT(KIB:KIE,KJB:KJE,JK) @@ -447,6 +458,7 @@ IF ( .NOT. OSIGMAS ) THEN END DO ! Set the mixing length scale ZL(KIB:KIE,KJB:KJE,KKB) = 20. + !$acc loop seq DO JK = KKB+KKL,KKE,KKL ! free troposphere ZL(KIB:KIE,KJB:KJE,JK) = ZL0 @@ -483,16 +495,14 @@ IF (OUSERI) CALL COMPUTE_FRAC_ICE(HFRAC_ICE, ZFRAC, PT) IF (OUSERI) CALL COMPUTE_FRAC_ICE3D_DEVICE(HFRAC_ICE, ZFRAC, PT) #endif ! -!acc kernels -DO JK=IKTB,IKTE -!PW: note: 10x faster to put the kernels zone inside the JK loop (NVHPC 21.9, NVHPC 22.2) even if indenpendent forced !$acc kernels - JKP=MAX(MIN(JK+KKL,IKTE),IKTB) - JKM=MAX(MIN(JK-KKL,IKTE),IKTB) -#ifdef MNH_COMPILER_NVHPC -!$acc loop independent collapse(2) -#endif - DO CONCURRENT (JI=KIB:KIE,JJ=KJB:KJE) +!$acc_nv loop independent +DO CONCURRENT ( JK=IKTB:IKTE ) + JKPK(JK)=MAX(MIN(JK+KKL,IKTE),IKTB) + JKMK(JK)=MAX(MIN(JK-KKL,IKTE),IKTB) +END DO +!$acc_nv loop independent collapse(3) +DO CONCURRENT (JI=KIB:KIE,JJ=KJB:KJE,JK=IKTB:IKTE) ! latent heats ! saturated water vapor mixing ratio over liquid water #ifndef MNH_BITREP @@ -541,9 +551,9 @@ DO JK=IKTB,IKTE END IF ELSE ! parameterize Sigma_s with first_order closure - DZZP(JI,JJ,JK) = PZZ(JI,JJ,JKP) - PZZ(JI,JJ,JKM) - ZDRWP(JI,JJ,JK) = ZRT(JI,JJ,JKP) - ZRT(JI,JJ,JKM) - ZDTLP(JI,JJ,JK) = ZTLK(JI,JJ,JKP) - ZTLK(JI,JJ,JKM) + XG/ZCPD(JI,JJ,JK) * DZZP(JI,JJ,JK) + DZZP(JI,JJ,JK) = PZZ(JI,JJ,JKPK(JK)) - PZZ(JI,JJ,JKMK(JK)) + ZDRWP(JI,JJ,JK) = ZRT(JI,JJ,JKPK(JK)) - ZRT(JI,JJ,JKMK(JK)) + ZDTLP(JI,JJ,JK) = ZTLK(JI,JJ,JKPK(JK)) - ZTLK(JI,JJ,JKMK(JK)) + XG/ZCPD(JI,JJ,JK) * DZZP(JI,JJ,JK) ZLLP(JI,JJ,JK) = ZL(JI,JJ,JK) ! standard deviation due to convection ZSIG_CONVP(JI,JJ,JK) =0. @@ -582,7 +592,7 @@ DO JK=IKTB,IKTE PSIGRC(JI,JJ,JK) = PCLDFR(JI,JJ,JK) !Computation warm/cold Cloud Fraction and content in high water content part - IF(PRESENT(PHLC_HCF) .AND. PRESENT(PHLC_HRC))THEN + IF(GPRESENT_PHLC_HCF .AND. GPRESENT_PHLC_HRC)THEN IF(1-ZFRAC(JI,JJ,JK) > 1.E-20)THEN ZAUTCP(JI,JJ,JK) = (ZSBARP(JI,JJ,JK) - XCRIAUTC/(PRHODREF(JI,JJ,JK)*(1-ZFRAC(JI,JJ,JK)))) & /ZSIGMAP(JI,JJ,JK) @@ -600,7 +610,7 @@ DO JK=IKTB,IKTE ENDIF ENDIF - IF(PRESENT(PHLI_HCF) .AND. PRESENT(PHLI_HRI))THEN + IF(GPRESENT_PHLI_HCF .AND. GPRESENT_PHLI_HRI)THEN IF(ZFRAC(JI,JJ,JK) > 1.E-20)THEN ZCRIAUTIP(JI,JJ,JK)=MIN(XCRIAUTI,10**(XACRIAUTI*(PT(JI,JJ,JK)-XTT)+XBCRIAUTI)) ZAUTIP(JI,JJ,JK) = (ZSBARP(JI,JJ,JK) - ZCRIAUTIP(JI,JJ,JK)/ZFRAC(JI,JJ,JK))/ZSIGMAP(JI,JJ,JK) @@ -648,11 +658,11 @@ DO JK=IKTB,IKTE PSIGRC(JI,JJ,JK) = MIN(1.,(1.-ZINCP(JI,JJ,JK))*ZSRC_1D(INQ1P(JI,JJ,JK))+ZINCP(JI,JJ,JK)*ZSRC_1D(INQ1P(JI,JJ,JK)+1)) - IF(PRESENT(PHLC_HCF) .AND. PRESENT(PHLC_HRC))THEN + IF(GPRESENT_PHLC_HCF .AND. GPRESENT_PHLC_HRC)THEN PHLC_HCF(JI,JJ,JK)=0. PHLC_HRC(JI,JJ,JK)=0. ENDIF - IF(PRESENT(PHLI_HCF) .AND. PRESENT(PHLI_HRI))THEN + IF(GPRESENT_PHLI_HCF .AND. GPRESENT_PHLI_HRI)THEN PHLI_HCF(JI,JJ,JK)=0. PHLI_HRI(JI,JJ,JK)=0. ENDIF @@ -689,10 +699,8 @@ DO JK=IKTB,IKTE PSIGRC(JI,JJ,JK) = PSIGRC(JI,JJ,JK)* MIN( 3. , MAX(1.,1.-ZQ1P(JI,JJ,JK)) ) ENDIF - END DO -!$acc end kernels END DO -!acc end kernels +!$acc end kernels !$acc end data @@ -701,6 +709,7 @@ deallocate( ztlk, zrt, zl, zfrac, itpl, ztmin, zlv, zls,zcpd, gwork ) deallocate( ZZZP, JKPP, ZPVP, ZQSLP, ZPIVP, ZQSIP, ZLVSP, ZAHP, ZAP, ZBP, ZSBARP, ZSIGMAP ) deallocate( DZZP, ZDRWP, ZDTLP, ZLLP, ZSIG_CONVP, ZQ1P, ZGCONDP, ZGAUVP, ZCONDP, ZAUTCP ) deallocate( ZGAUTCP, ZGAUCP, ZCRIAUTIP, ZAUTIP, ZGAUTIP, ZGAUIP, INQ1P, ZINCP, ZRCOLDP, ZRIOLDP ) +deallocate( JKPK,JKMK ) #else !Release all memory allocated with MNH_MEM_GET calls since last call to MNH_MEM_POSITION_PIN CALL MNH_MEM_RELEASE()