diff --git a/src/MNH/condensation.f90 b/src/MNH/condensation.f90 index 4216322b05baf248ba8b5649561c920916f93b46..5af15ec9da3326514362b4fa54843659fec98f5f 100644 --- a/src/MNH/condensation.f90 +++ b/src/MNH/condensation.f90 @@ -394,12 +394,13 @@ 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) -!$acc kernels +!acc kernels JKP=MAX(MIN(JK+KKL,IKTE),IKTB) JKM=MAX(MIN(JK-KKL,IKTE),IKTB) -!$acc loop independent collapse(2) +!$acc loop independent collapse(2) private( ZCOND, ZQ1, ZTEMP ) DO JJ=KJB,KJE DO JI=KIB,KIE ! latent heats @@ -594,8 +595,9 @@ DO JK=IKTB,IKTE END DO END DO -!$acc end kernels +!acc end kernels END DO +!$acc end kernels ! IF (MPPDB_INITIALIZED) THEN !Check all INOUT arrays diff --git a/src/MNH/ice4_fast_rs.f90 b/src/MNH/ice4_fast_rs.f90 index cedb6f7aa783c51e57b02d374352e72ca6dbd353..9d635fc3efa5615ff115b4cf09f7dedebc7b112d 100644 --- a/src/MNH/ice4_fast_rs.f90 +++ b/src/MNH/ice4_fast_rs.f90 @@ -164,7 +164,8 @@ INTEGER :: IZZW, IZZW2, IZZW6, IZFREEZ_RATE !$acc data present( PCOMPUTE, PRHODREF, PLVFACT, PLSFACT, PPRES, PDV, PKA, PCJ, & !$acc& PLBDAR, PLBDAS, PT, PRVT, PRCT, PRRT, PRST, PRIAGGS, PRCRIMSS, PRCRIMSG, PRSRIMCG, & !$acc& PRRACCSS, PRRACCSG, PRSACCRG, PRSMLTG, PRCMLTSR, PRS_TEND, PA_TH, & -!$acc& PA_RC, PA_RR, PA_RS, PA_RG ) +!$acc& PA_RC, PA_RR, PA_RS, PA_RG ) & +!$acc& present( XGAMINC_RIM1, XGAMINC_RIM2, XGAMINC_RIM4 ) ! !------------------------------------------------------------------------------- ! @@ -332,31 +333,32 @@ ELSE ! ! 5.1.1 select the PLBDAS ! -!$acc kernels +!$acc kernels copyin( CSNOWRIMING ) !$acc loop independent DO CONCURRENT( JJ = 1 : IGRIM ) ZVEC1(JJ) = PLBDAS(I1(JJ)) - END DO ! ! 5.1.2 find the next lower indice for the PLBDAS in the geometrical ! set of Lbda_s used to tabulate some moments of the incomplete ! gamma function ! - ZVEC2(1:IGRIM) = MAX( 1.00001, MIN( REAL(NGAMINC)-0.00001, & + ZVEC2(JJ) = MAX( 1.00001, MIN( REAL(NGAMINC)-0.00001, & #ifndef MNH_BITREP - XRIMINTP1 * LOG( ZVEC1(1:IGRIM) ) + XRIMINTP2 ) ) + XRIMINTP1 * LOG( ZVEC1(JJ) ) + XRIMINTP2 ) ) #else - XRIMINTP1 * BR_LOG( ZVEC1(1:IGRIM) ) + XRIMINTP2 ) ) + XRIMINTP1 * BR_LOG( ZVEC1(JJ) ) + XRIMINTP2 ) ) #endif - IVEC2(1:IGRIM) = INT( ZVEC2(1:IGRIM) ) - ZVEC2(1:IGRIM) = ZVEC2(1:IGRIM) - REAL( IVEC2(1:IGRIM) ) - ! - ! 5.1.3 perform the linear interpolation of the normalized - ! "2+XDS"-moment of the incomplete gamma function - ! - ZVEC1(1:IGRIM) = XGAMINC_RIM1( IVEC2(1:IGRIM)+1 )* ZVEC2(1:IGRIM) & - - XGAMINC_RIM1( IVEC2(1:IGRIM) )*(ZVEC2(1:IGRIM) - 1.0) + IVEC2(JJ) = INT( ZVEC2(JJ) ) + ZVEC2(JJ) = ZVEC2(JJ) - REAL( IVEC2(JJ) ) + ! + ! 5.1.3 perform the linear interpolation of the normalized + ! "2+XDS"-moment of the incomplete gamma function + ! + ZVEC1(JJ) = XGAMINC_RIM1( IVEC2(JJ)+1 )* ZVEC2(JJ) & + - XGAMINC_RIM1( IVEC2(JJ) )*(ZVEC2(JJ) - 1.0) + END DO ZZW(:) = 0. +!$acc loop independent DO JJ = 1, IGRIM ZZW(I1(JJ)) = ZVEC1(JJ) END DO @@ -383,6 +385,7 @@ ELSE ZVEC1(1:IGRIM) = XGAMINC_RIM2( IVEC2(1:IGRIM)+1 )* ZVEC2(1:IGRIM) & - XGAMINC_RIM2( IVEC2(1:IGRIM) )*(ZVEC2(1:IGRIM) - 1.0) ZZW(:) = 0. +!$acc loop independent DO JJ = 1, IGRIM ZZW(I1(JJ)) = ZVEC1(JJ) END DO @@ -390,6 +393,7 @@ ELSE ZVEC1(1:IGRIM) = XGAMINC_RIM4( IVEC2(1:IGRIM)+1 )* ZVEC2(1:IGRIM) & - XGAMINC_RIM4( IVEC2(1:IGRIM) )*(ZVEC2(1:IGRIM) - 1.0) ZZW2(:) = 0. +!$acc loop independent DO JJ = 1, IGRIM ZZW2(I1(JJ)) = ZVEC1(JJ) END DO @@ -397,17 +401,20 @@ ELSE ! 5.1.6 riming-conversion of the large sized aggregates into graupeln ! ! - WHERE(GRIM(:)) - PRS_TEND(:, IRCRIMS)=XCRIMSG * PRCT(:) & ! RCRIMS +!$acc loop independent + DO CONCURRENT( JJ = 1 : ISIZE ) + IF ( GRIM(JJ) ) THEN + PRS_TEND(JJ, IRCRIMS)=XCRIMSG * PRCT(JJ) & ! RCRIMS #ifndef MNH_BITREP - * PLBDAS(:)**XEXCRIMSG & - * PRHODREF(:)**(-XCEXVT) + * PLBDAS(JJ)**XEXCRIMSG & + * PRHODREF(JJ)**(-XCEXVT) #else - * BR_POW(PLBDAS(:),XEXCRIMSG) & - * BR_POW(PRHODREF(:),-XCEXVT) + * BR_POW(PLBDAS(JJ),XEXCRIMSG) & + * BR_POW(PRHODREF(JJ),-XCEXVT) #endif - ZZW6(:) = PRS_TEND(:, IRCRIMS) - PRS_TEND(:, IRCRIMSS) ! RCRIMSG - END WHERE + ZZW6(JJ) = PRS_TEND(JJ, IRCRIMS) - PRS_TEND(JJ, IRCRIMSS) ! RCRIMSG + END IF + END DO IF(CSNOWRIMING=='M90 ')THEN !Murakami 1990 @@ -499,6 +506,7 @@ ELSE ! ! 5.2.1 select the (PLBDAS,PLBDAR) couplet ! +!$acc loop independent DO JJ = 1, IGACC ZVEC1(JJ) = PLBDAS(I1(JJ)) ZVEC2(JJ) = PLBDAR(I1(JJ)) @@ -508,27 +516,31 @@ ELSE ! in the geometrical set of (Lbda_s,Lbda_r) couplet use to ! tabulate the RACCSS-kernel ! - ZVEC1(1:IGACC) = MAX( 1.00001, MIN( REAL(NACCLBDAS)-0.00001, & +!$acc loop independent + DO CONCURRENT( JJ = 1 : IGACC ) + ZVEC1(JJ) = MAX( 1.00001, MIN( REAL(NACCLBDAS)-0.00001, & #ifndef MNH_BITREP - XACCINTP1S * LOG( ZVEC1(1:IGACC) ) + XACCINTP2S ) ) + XACCINTP1S * LOG( ZVEC1(JJ) ) + XACCINTP2S ) ) #else - XACCINTP1S * BR_LOG( ZVEC1(1:IGACC) ) + XACCINTP2S ) ) + XACCINTP1S * BR_LOG( ZVEC1(JJ) ) + XACCINTP2S ) ) #endif - IVEC1(1:IGACC) = INT( ZVEC1(1:IGACC) ) - ZVEC1(1:IGACC) = ZVEC1(1:IGACC) - REAL( IVEC1(1:IGACC) ) - ! - ZVEC2(1:IGACC) = MAX( 1.00001, MIN( REAL(NACCLBDAR)-0.00001, & + IVEC1(JJ) = INT( ZVEC1(JJ) ) + ZVEC1(JJ) = ZVEC1(JJ) - REAL( IVEC1(JJ) ) + ! + ZVEC2(JJ) = MAX( 1.00001, MIN( REAL(NACCLBDAR)-0.00001, & #ifndef MNH_BITREP - XACCINTP1R * LOG( ZVEC2(1:IGACC) ) + XACCINTP2R ) ) + XACCINTP1R * LOG( ZVEC2(JJ) ) + XACCINTP2R ) ) #else - XACCINTP1R * BR_LOG( ZVEC2(1:IGACC) ) + XACCINTP2R ) ) + XACCINTP1R * BR_LOG( ZVEC2(JJ) ) + XACCINTP2R ) ) #endif - IVEC2(1:IGACC) = INT( ZVEC2(1:IGACC) ) - ZVEC2(1:IGACC) = ZVEC2(1:IGACC) - REAL( IVEC2(1:IGACC) ) + IVEC2(JJ) = INT( ZVEC2(JJ) ) + ZVEC2(JJ) = ZVEC2(JJ) - REAL( IVEC2(JJ) ) + END DO ! ! 5.2.3 perform the bilinear interpolation of the normalized ! RACCSS-kernel ! +!$acc loop independent DO JJ = 1, IGACC ZVEC3(JJ) = ( XKER_RACCSS(IVEC1(JJ)+1,IVEC2(JJ)+1)* ZVEC2(JJ) & - XKER_RACCSS(IVEC1(JJ)+1,IVEC2(JJ) )*(ZVEC2(JJ) - 1.0) ) & @@ -538,6 +550,7 @@ ELSE * (ZVEC1(JJ) - 1.0) END DO ZZW(:) = 0. +!$acc loop independent DO JJ = 1, IGACC ZZW(I1(JJ)) = ZVEC3(JJ) END DO @@ -567,6 +580,7 @@ ELSE ! 5.2.4b perform the bilinear interpolation of the normalized ! RACCS-kernel ! +!$acc loop independent DO JJ = 1, IGACC ZVEC3(JJ) = ( XKER_RACCS(IVEC1(JJ)+1,IVEC2(JJ)+1)* ZVEC2(JJ) & - XKER_RACCS(IVEC1(JJ)+1,IVEC2(JJ) )*(ZVEC2(JJ) - 1.0) ) & @@ -576,6 +590,7 @@ ELSE * (ZVEC1(JJ) - 1.0) END DO ZZW(:) = 0. +!$acc loop independent DO JJ = 1, IGACC ZZW(I1(JJ)) = ZVEC3(JJ) END DO @@ -585,6 +600,7 @@ ELSE ! 5.2.5 perform the bilinear interpolation of the normalized ! SACCRG-kernel ! +!$acc loop independent DO JJ = 1, IGACC ZVEC3(JJ) = ( XKER_SACCRG(IVEC2(JJ)+1,IVEC1(JJ)+1)* ZVEC1(JJ) & - XKER_SACCRG(IVEC2(JJ)+1,IVEC1(JJ) )*(ZVEC1(JJ) - 1.0) ) & @@ -594,6 +610,7 @@ ELSE * (ZVEC2(JJ) - 1.0) END DO ZZW(:) = 0. +!$acc loop independent DO JJ = 1, IGACC ZZW(I1(JJ)) = ZVEC3(JJ) END DO diff --git a/src/MNH/ice4_sedimentation_split.f90 b/src/MNH/ice4_sedimentation_split.f90 index 25c9ab140a2570488c485080651a8401f09dbdbe..184ad4a387e45abed787887b3ac7540ccbd14c24 100644 --- a/src/MNH/ice4_sedimentation_split.f90 +++ b/src/MNH/ice4_sedimentation_split.f90 @@ -680,13 +680,16 @@ DO WHILE (ANY(ZREMAINT>0.)) !$acc end kernels !PW:BUG PGI: do not set independent (wrong results with PGI 19.10) !acc loop independent private(ZMRCHANGE) - DO JK = KKTB , KKTE !$acc kernels - ZMRCHANGE(:,:) = ZMAX_TSTEP(:,:) * POORHODZ(:,:,JK)*(ZWSED(:,:,JK+KKL)-ZWSED(:,:,JK)) - PRXT(:,:,JK) = PRXT(:,:,JK) + ZMRCHANGE(:,:) + PPRXS(:,:,JK) * ZMAX_TSTEP(:,:) - PRXS(:,:,JK) = PRXS(:,:,JK) + ZMRCHANGE(:,:) * ZINVTSTEP -!$acc end kernels + DO JK = KKTB , KKTE +!$acc loop independent collapse(2) + DO CONCURRENT( JI = 1 : KIT, JJ = 1 : KJT ) + ZMRCHANGE(JI,JJ) = ZMAX_TSTEP(JI,JJ) * POORHODZ(JI,JJ,JK)*(ZWSED(JI,JJ,JK+KKL)-ZWSED(JI,JJ,JK)) + PRXT(JI,JJ,JK) = PRXT(JI,JJ,JK) + ZMRCHANGE(JI,JJ) + PPRXS(JI,JJ,JK) * ZMAX_TSTEP(JI,JJ) + PRXS(JI,JJ,JK) = PRXS(JI,JJ,JK) + ZMRCHANGE(JI,JJ) * ZINVTSTEP + END DO ENDDO +!$acc end kernels !$acc kernels PINPRX(:,:) = PINPRX(:,:) + ZWSED(:,:,KKB) / XRHOLW * (ZMAX_TSTEP(:,:) * ZINVTSTEP) IF (GPRESENT_PFPR) THEN