diff --git a/src/MNH/advecuvw_rk.f90 b/src/MNH/advecuvw_rk.f90 index 529e14d218a17e0528f27cf04ff73696450e57fa..bcb889933f39f9d2bf19b8cf8a03bdd47c89a526 100644 --- a/src/MNH/advecuvw_rk.f90 +++ b/src/MNH/advecuvw_rk.f90 @@ -580,36 +580,43 @@ RKLOOP: DO JS = 1, ISPL !$acc end kernels ! IF ( JS < ISPL ) THEN -!$acc kernels present(ZUT,ZVT,ZWT) present(ZBUT) present(PU,PV,PW) & -!$acc & present(ZRUS,ZRVS,ZRWS,ZIBM) present(PRUS_OTHER,PRVS_OTHER,PRWS_OTHER) & -!$acc & present(PMXM_RHODJ,PMYM_RHODJ,PMZM_RHODJ) +!PW: note: 20211025: kernels split because performance problems if in 1 block with NVHPC 21.9 +! !$acc kernels present(ZUT,ZVT,ZWT) present(ZBUT) present(PU,PV,PW) & +! !$acc & present(ZRUS,ZRVS,ZRWS,ZIBM) present(PRUS_OTHER,PRVS_OTHER,PRWS_OTHER) & +! !$acc & present(PMXM_RHODJ,PMYM_RHODJ,PMZM_RHODJ) ! +!$acc kernels ZUT(:,:,:) = PU(:,:,:) ZVT(:,:,:) = PV(:,:,:) ZWT(:,:,:) = PW(:,:,:) +!$acc end kernels ! DO JI = 1, JS ! ! Intermediate guesses inside the RK loop ! IF ( .NOT. LIBM ) THEN +!$acc kernels ZUT(:,:,:) = ZUT(:,:,:) + ZBUT(JS,JI) * PTSTEP * & ( ZRUS(:,:,:,JI) + PRUS_OTHER(:,:,:) ) / PMXM_RHODJ(:,:,:) ZVT(:,:,:) = ZVT(:,:,:) + ZBUT(JS,JI) * PTSTEP * & ( ZRVS(:,:,:,JI) + PRVS_OTHER(:,:,:) ) / PMYM_RHODJ(:,:,:) ZWT(:,:,:) = ZWT(:,:,:) + ZBUT(JS,JI) * PTSTEP * & ( ZRWS(:,:,:,JI) + PRWS_OTHER(:,:,:) ) / PMZM_RHODJ(:,:,:) +!$acc end kernels ELSE +!$acc kernels ZUT(:,:,:) = ZUT(:,:,:) + ZBUT(JS,JI) * PTSTEP * & ( ZRUS(:,:,:,JI) + PRUS_OTHER(:,:,:) ) / PMXM_RHODJ(:,:,:) * ZIBM(:,:,:,1) ZVT(:,:,:) = ZVT(:,:,:) + ZBUT(JS,JI) * PTSTEP * & ( ZRVS(:,:,:,JI) + PRVS_OTHER(:,:,:) ) / PMYM_RHODJ(:,:,:) * ZIBM(:,:,:,2) ZWT(:,:,:) = ZWT(:,:,:) + ZBUT(JS,JI) * PTSTEP * & ( ZRWS(:,:,:,JI) + PRWS_OTHER(:,:,:) ) / PMZM_RHODJ(:,:,:) * ZIBM(:,:,:,3) +!$acc end kernels END IF ! END DO -!$acc end kernels +! !$acc end kernels !$acc update self(ZUT,ZVT,ZWT) END IF ! diff --git a/src/MNH/condensation.f90 b/src/MNH/condensation.f90 index bf65c2ae4aa1b835cefdccedeeaa2b0f5394cebf..4216322b05baf248ba8b5649561c920916f93b46 100644 --- a/src/MNH/condensation.f90 +++ b/src/MNH/condensation.f90 @@ -394,8 +394,9 @@ 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 JKP=MAX(MIN(JK+KKL,IKTE),IKTB) JKM=MAX(MIN(JK-KKL,IKTE),IKTB) !$acc loop independent collapse(2) @@ -593,8 +594,8 @@ DO JK=IKTB,IKTE END DO END DO -END DO !$acc end kernels +END DO ! IF (MPPDB_INITIALIZED) THEN !Check all INOUT arrays diff --git a/src/MNH/ice4_fast_rg.f90 b/src/MNH/ice4_fast_rg.f90 index 5e04585a92ed0e0e0c480d81888de05816138ca5..c66c5f85ce474fd2a92a05a69cc30157455f2d66 100644 --- a/src/MNH/ice4_fast_rg.f90 +++ b/src/MNH/ice4_fast_rg.f90 @@ -315,6 +315,7 @@ ELSE END WHERE IF(LCRFLIMIT) THEN +!$acc loop independent DO JL=1, ISIZE !Comparison between heat to be released (to freeze rain) and heat sink (rain and ice temperature change) !ZZW is the proportion of process that can take place @@ -352,17 +353,19 @@ IF(LDSOFT) THEN PRG_TEND(JL, IRCDRYG)=ZMASK(JL)*PRG_TEND(JL, IRCDRYG) ENDDO ELSE - ZZW(:)=0. - WHERE(ZMASK(:)==1.) +!$acc loop independent + DO JL = 1, ISIZE + IF ( ZMASK(JL) == 1. ) THEN #ifndef MNH_BITREP - ZZW(:)=PLBDAG(:)**(XCXG-XDG-2.) * PRHODREF(:)**(-XCEXVT) + ZZW(JL) = PLBDAG(JL)**(XCXG-XDG-2.) * PRHODREF(JL)**(-XCEXVT) #else - ZZW(:)=BR_POW(PLBDAG(:),XCXG-XDG-2.) * BR_POW(PRHODREF(:),-XCEXVT) + ZZW(JL) = BR_POW( PLBDAG(JL), XCXG - XDG - 2. ) * BR_POW( PRHODREF(JL), -XCEXVT ) #endif - END WHERE - DO JL=1, ISIZE - PRG_TEND(JL, IRCDRYG)=ZMASK(JL)*XFCDRYG * PRCT(JL) * ZZW(JL) - ENDDO + PRG_TEND(JL, IRCDRYG) = XFCDRYG * PRCT(JL) * ZZW(JL) + ELSE + PRG_TEND(JL, IRCDRYG) = 0. + END IF + END DO ENDIF DO JL=1, ISIZE @@ -376,19 +379,23 @@ IF(LDSOFT) THEN PRG_TEND(JL, IRIWETG)=ZMASK(JL) * PRG_TEND(JL, IRIWETG) ENDDO ELSE - PRG_TEND(:, IRIDRYG)=0. - PRG_TEND(:, IRIWETG)=0. - WHERE(ZMASK(:)==1.) +!$acc loop independent + DO JL = 1, ISIZE + IF ( ZMASK(JL) == 1. ) THEN #ifndef MNH_BITREP - ZZW(:)=PLBDAG(:)**(XCXG-XDG-2.) * PRHODREF(:)**(-XCEXVT) - PRG_TEND(:, IRIDRYG)=XFIDRYG*EXP(XCOLEXIG*(PT(:)-XTT))*PRIT(:)*ZZW(:) - PRG_TEND(:, IRIWETG)=PRG_TEND(:, IRIDRYG) / (XCOLIG*EXP(XCOLEXIG*(PT(:)-XTT))) + ZZW(JL) = PLBDAG(JL)**(XCXG-XDG-2.) * PRHODREF(JL)**(-XCEXVT) + PRG_TEND(JL, IRIDRYG) = XFIDRYG * EXP( XCOLEXIG * ( PT(JL) - XTT ) ) * PRIT(JL) * ZZW(JL) + PRG_TEND(JL, IRIWETG) = PRG_TEND(JL, IRIDRYG) / ( XCOLIG * EXP( XCOLEXIG * ( PT(JL) - XTT ) ) ) #else - ZZW(:)=BR_POW(PLBDAG(:),XCXG-XDG-2.) * BR_POW(PRHODREF(:),-XCEXVT) - PRG_TEND(:, IRIDRYG)=XFIDRYG*BR_EXP(XCOLEXIG*(PT(:)-XTT))*PRIT(:)*ZZW(:) - PRG_TEND(:, IRIWETG)=PRG_TEND(:, IRIDRYG) / (XCOLIG*BR_EXP(XCOLEXIG*(PT(:)-XTT))) + ZZW(JL) = BR_POW( PLBDAG(JL), XCXG - XDG - 2. ) * BR_POW( PRHODREF(JL), -XCEXVT ) + PRG_TEND(JL, IRIDRYG) = XFIDRYG * BR_EXP( XCOLEXIG * ( PT(JL) - XTT ) ) * PRIT(JL) * ZZW(JL) + PRG_TEND(JL, IRIWETG) = PRG_TEND(JL, IRIDRYG) / ( XCOLIG * BR_EXP( XCOLEXIG * ( PT(JL) - XTT ) ) ) #endif - END WHERE + ELSE + PRG_TEND(JL, IRIDRYG) = 0. + PRG_TEND(JL, IRIWETG) = 0. + END IF + END DO ENDIF @@ -435,11 +442,13 @@ ELSE PRG_TEND(:, IRSWETG)=0. !$acc end kernels +!$acc update self( IGDRY ) IF(IGDRY>0)THEN !$acc kernels ! !* 6.2.3 select the (PLBDAG,PLBDAS) couplet ! +!$acc loop independent DO JJ = 1, IGDRY ZVEC1(JJ) = PLBDAG(I1(JJ)) ZVEC2(JJ) = PLBDAS(I1(JJ)) @@ -449,27 +458,31 @@ ELSE ! in the geometrical set of (Lbda_g,Lbda_s) couplet use to ! tabulate the SDRYG-kernel ! - ZVEC1(1:IGDRY)=MAX(1.00001, MIN(REAL(NDRYLBDAG)-0.00001, & +!$acc loop independent + DO CONCURRENT( JJ = 1 : IGDRY ) + ZVEC1(JJ) = MAX( 1.00001, MIN( REAL( NDRYLBDAG ) - 0.00001, & #ifndef MNH_BITREP - XDRYINTP1G*LOG(ZVEC1(1:IGDRY))+XDRYINTP2G)) + XDRYINTP1G * LOG( ZVEC1(JJ) ) + XDRYINTP2G ) ) #else - XDRYINTP1G*BR_LOG(ZVEC1(1:IGDRY))+XDRYINTP2G)) + XDRYINTP1G * BR_LOG( ZVEC1(JJ) ) + XDRYINTP2G ) ) #endif - IVEC1(1:IGDRY)=INT(ZVEC1(1:IGDRY) ) - ZVEC1(1:IGDRY)=ZVEC1(1:IGDRY)-REAL(IVEC1(1:IGDRY)) - ! - ZVEC2(1:IGDRY)=MAX(1.00001, MIN( REAL(NDRYLBDAS)-0.00001, & + IVEC1(JJ) = INT( ZVEC1(JJ) ) + ZVEC1(JJ) = ZVEC1(JJ) - REAL( IVEC1(JJ) ) + ! + ZVEC2(JJ) = MAX( 1.00001, MIN( REAL( NDRYLBDAS ) - 0.00001, & #ifndef MNH_BITREP - XDRYINTP1S*LOG(ZVEC2(1:IGDRY))+XDRYINTP2S)) + XDRYINTP1S * LOG( ZVEC2(JJ) ) + XDRYINTP2S ) ) #else - XDRYINTP1S*BR_LOG(ZVEC2(1:IGDRY))+XDRYINTP2S)) + XDRYINTP1S * BR_LOG( ZVEC2(JJ) ) + XDRYINTP2S ) ) #endif - IVEC2(1:IGDRY)=INT(ZVEC2(1:IGDRY)) - ZVEC2(1:IGDRY)=ZVEC2(1:IGDRY)-REAL(IVEC2(1:IGDRY)) + IVEC2(JJ) = INT( ZVEC2(JJ) ) + ZVEC2(JJ) = ZVEC2(JJ) - REAL( IVEC2(JJ) ) + END DO ! !* 6.2.5 perform the bilinear interpolation of the normalized ! SDRYG-kernel ! +!$acc loop independent DO JJ=1, IGDRY ZVEC3(JJ) = ( XKER_SDRYG(IVEC1(JJ)+1,IVEC2(JJ)+1)* ZVEC2(JJ) & - XKER_SDRYG(IVEC1(JJ)+1,IVEC2(JJ) )*(ZVEC2(JJ) - 1.0) ) & @@ -479,6 +492,7 @@ ELSE *(ZVEC1(JJ) - 1.0) END DO ZZW(:) = 0. +!$acc loop independent DO JJ = 1, IGDRY ZZW(I1(JJ)) = ZVEC3(JJ) END DO @@ -540,12 +554,14 @@ ELSE !$acc kernels PRG_TEND(:, IRRDRYG)=0. !$acc end kernels +!$acc update self( IGDRY ) ! - IF(IGDRY>0) THEN !$acc kernels + IF(IGDRY>0) THEN ! !* 6.2.8 select the (PLBDAG,PLBDAR) couplet ! +!$acc loop independent DO JJ = 1, IGDRY ZVEC1(JJ) = PLBDAG(I1(JJ)) ZVEC2(JJ) = PLBDAR(I1(JJ)) @@ -555,27 +571,31 @@ ELSE ! in the geometrical set of (Lbda_g,Lbda_r) couplet use to ! tabulate the RDRYG-kernel ! - ZVEC1(1:IGDRY)=MAX(1.00001, MIN( REAL(NDRYLBDAG)-0.00001, & +!$acc loop independent + DO JJ = 1, IGDRY + ZVEC1(JJ) = MAX( 1.00001, MIN( REAL( NDRYLBDAG ) - 0.00001, & #ifndef MNH_BITREP - XDRYINTP1G*LOG(ZVEC1(1:IGDRY))+XDRYINTP2G)) + XDRYINTP1G * LOG( ZVEC1(JJ) ) + XDRYINTP2G ) ) #else - XDRYINTP1G*BR_LOG(ZVEC1(1:IGDRY))+XDRYINTP2G)) + XDRYINTP1G * BR_LOG( ZVEC1(JJ) ) + XDRYINTP2G ) ) #endif - IVEC1(1:IGDRY)=INT(ZVEC1(1:IGDRY)) - ZVEC1(1:IGDRY)=ZVEC1(1:IGDRY)-REAL(IVEC1(1:IGDRY)) - ! - ZVEC2(1:IGDRY)=MAX(1.00001, MIN( REAL(NDRYLBDAR)-0.00001, & + IVEC1(JJ) = INT( ZVEC1(JJ) ) + ZVEC1(JJ) = ZVEC1(JJ) - REAL( IVEC1(JJ) ) + ! + ZVEC2(JJ) = MAX( 1.00001, MIN( REAL( NDRYLBDAR ) - 0.00001, & #ifndef MNH_BITREP - XDRYINTP1R*LOG(ZVEC2(1:IGDRY))+XDRYINTP2R)) + XDRYINTP1R * LOG( ZVEC2(JJ) ) + XDRYINTP2R ) ) #else - XDRYINTP1R*BR_LOG(ZVEC2(1:IGDRY))+XDRYINTP2R)) + XDRYINTP1R * BR_LOG( ZVEC2(JJ) ) + XDRYINTP2R ) ) #endif - IVEC2(1:IGDRY)=INT(ZVEC2(1:IGDRY)) - ZVEC2(1:IGDRY)=ZVEC2(1:IGDRY)-REAL(IVEC2(1:IGDRY)) + IVEC2(JJ) = INT( ZVEC2(JJ) ) + ZVEC2(JJ) = ZVEC2(JJ) - REAL( IVEC2(JJ) ) + END DO ! !* 6.2.10 perform the bilinear interpolation of the normalized ! RDRYG-kernel ! +!$acc loop independent DO JJ=1, IGDRY ZVEC3(JJ)= ( XKER_RDRYG(IVEC1(JJ)+1,IVEC2(JJ)+1)* ZVEC2(JJ) & - XKER_RDRYG(IVEC1(JJ)+1,IVEC2(JJ) )*(ZVEC2(JJ) - 1.0) ) & @@ -585,6 +605,7 @@ ELSE *(ZVEC1(JJ) - 1.0) END DO ZZW(:) = 0. +!$acc loop independent DO JJ = 1, IGDRY ZZW(I1(JJ)) = ZVEC3(JJ) END DO @@ -606,8 +627,8 @@ ELSE XLBRDRYG3/ BR_P2(PLBDAR(:)) ) #endif END WHERE -!$acc end kernels ENDIF +!$acc end kernels ENDIF !$acc kernels @@ -656,6 +677,7 @@ ELSE ( PRHODREF(:)*(XLMTT-XCL*(XTT-PT(:))) ) END WHERE ENDIF +!$acc loop independent DO JL=1, ISIZE !We must agregate, at least, the cold species ZRWETG_INIT(JL)=ZMASK(JL) * MAX(PRG_TEND(JL, IRIWETG)+PRG_TEND(JL, IRSWETG), & @@ -684,6 +706,7 @@ IF(.NOT. LWETGPOST) THEN PWETG(JL) = PWETG(JL) * MAX(0., -SIGN(1., PT(JL)-XTT)) ENDDO ENDIF +!$acc loop independent DO JL=1, ISIZE ZDRYG(JL) = ZMASK(JL) * & ! & MAX(0., -SIGN(1., PT(JL)-XTT)) * & ! WHERE(PT(:)<XTT) diff --git a/src/MNH/ice4_fast_rs.f90 b/src/MNH/ice4_fast_rs.f90 index 7acd05b48351b1e4f74c635489dfce5f80000efd..e1f78b374be7ddcfded7ac0727bb9f71ca890996 100644 --- a/src/MNH/ice4_fast_rs.f90 +++ b/src/MNH/ice4_fast_rs.f90 @@ -282,6 +282,7 @@ ELSE ( PRHODREF(:)*(XLMTT-XCL*(XTT-PT(:))) ) END WHERE ENDIF +!$acc loop independent DO JL=1, ISIZE !We must agregate, at least, the cold species !And we are only interested by the freezing rate of liquid species @@ -332,7 +333,8 @@ ELSE ! 5.1.1 select the PLBDAS ! !$acc kernels - DO JJ = 1, IGRIM +!$acc loop independent + DO CONCURRENT( JJ = 1 : IGRIM ) ZVEC1(JJ) = PLBDAS(I1(JJ)) END DO ! @@ -361,16 +363,18 @@ ELSE ! ! 5.1.4 riming of the small sized aggregates ! - WHERE (GRIM(:)) - PRS_TEND(:, IRCRIMSS) = XCRIMSS * ZZW(:) * PRCT(:) & ! RCRIMSS + DO CONCURRENT( JJ = 1 : IGRIM ) + IF ( GRIM(JJ) ) THEN + PRS_TEND(JJ, IRCRIMSS) = XCRIMSS * ZZW(JJ) * PRCT(JJ) & ! RCRIMSS #ifndef MNH_BITREP - * PLBDAS(:)**XEXCRIMSS & - * PRHODREF(:)**(-XCEXVT) + * PLBDAS(JJ)**XEXCRIMSS & + * PRHODREF(JJ)**(-XCEXVT) #else - * BR_POW(PLBDAS(:),XEXCRIMSS) & - * BR_POW(PRHODREF(:),-XCEXVT) + * BR_POW(PLBDAS(JJ),XEXCRIMSS) & + * BR_POW(PRHODREF(JJ),-XCEXVT) #endif - END WHERE + END IF + END DO ! ! 5.1.5 perform the linear interpolation of the normalized ! "XBS"-moment of the incomplete gamma function (XGAMINC_RIM2) and @@ -430,6 +434,7 @@ ELSE ENDIF ! !$acc kernels copyout(igacc) +!$acc loop independent DO JL=1, ISIZE ! More restrictive RIM mask to be used for riming by negative temperature only ZRIM(JL)=ZRIM(JL) * & @@ -539,22 +544,25 @@ ELSE ! ! 5.2.4 raindrop accretion on the small sized aggregates ! - WHERE(GACC(:)) +!$acc loop independent + DO JL=1, ISIZE + IF ( GACC(JL) ) THEN #ifndef MNH_BITREP - ZZW6(:) = & !! coef of RRACCS - XFRACCSS*( PLBDAS(:)**XCXS )*( PRHODREF(:)**(-XCEXVT-1.) ) & - *( XLBRACCS1/((PLBDAS(:)**2) ) + & - XLBRACCS2/( PLBDAS(:) * PLBDAR(:) ) + & - XLBRACCS3/( (PLBDAR(:)**2)) )/PLBDAR(:)**4 + ZZW6(JL) = & !! coef of RRACCS + XFRACCSS*( PLBDAS(JL)**XCXS )*( PRHODREF(JL)**(-XCEXVT-1.) ) & + *( XLBRACCS1/((PLBDAS(JL)**2) ) + & + XLBRACCS2/( PLBDAS(JL) * PLBDAR(JL) ) + & + XLBRACCS3/( (PLBDAR(JL)**2)) )/PLBDAR(JL)**4 #else - ZZW6(:) = & !! coef of RRACCS - XFRACCSS* BR_POW(PLBDAS(:),XCXS) * BR_POW(PRHODREF(:),-XCEXVT-1.) & - *( XLBRACCS1/BR_P2(PLBDAS(:)) + & - XLBRACCS2/( PLBDAS(:) * PLBDAR(:) ) + & - XLBRACCS3/ (BR_P2(PLBDAR(:))) )/BR_P4(PLBDAR(:)) + ZZW6(JL) = & !! coef of RRACCS + XFRACCSS* BR_POW(PLBDAS(JL),XCXS) * BR_POW(PRHODREF(JL),-XCEXVT-1.) & + *( XLBRACCS1/BR_P2(PLBDAS(JL)) + & + XLBRACCS2/( PLBDAS(JL) * PLBDAR(JL) ) + & + XLBRACCS3/ (BR_P2(PLBDAR(JL))) )/BR_P4(PLBDAR(JL)) #endif - PRS_TEND(:, IRRACCSS) =ZZW(:)*ZZW6(:) - END WHERE + PRS_TEND(JL, IRRACCSS) =ZZW(JL)*ZZW6(JL) + END IF + END DO ! ! 5.2.4b perform the bilinear interpolation of the normalized ! RACCS-kernel @@ -613,6 +621,7 @@ ELSE ENDIF !$acc kernels ! +!$acc loop independent DO JL=1, ISIZE ! More restrictive ACC mask to be used for accretion by negative temperature only ZACC(JL) = ZACC(JL) * & diff --git a/src/MNH/ice4_sedimentation_split.f90 b/src/MNH/ice4_sedimentation_split.f90 index 8eb745cb782f20e77a9ae950fba93d3c98a91a1b..25c9ab140a2570488c485080651a8401f09dbdbe 100644 --- a/src/MNH/ice4_sedimentation_split.f90 +++ b/src/MNH/ice4_sedimentation_split.f90 @@ -456,7 +456,8 @@ REAL, DIMENSION(:,:), POINTER, CONTIGUOUS :: ZREMAINT ! R REAL, DIMENSION(:,:,:), POINTER, CONTIGUOUS :: ZWSED ! Sedimentation fluxes !$acc data present(PRHODREF,POORHODZ,PDZZ,PPABST,PTHT,PRXT,PRXS,PINPRX,PPRXS, & -!$acc& PRAY,PLBC,PFSEDC,PCONC3D,PFPR) +!$acc& PRAY,PLBC,PFSEDC,PCONC3D,PFPR) & +!$acc& copyin( XRTMIN ) IF (MPPDB_INITIALIZED) THEN !Check all IN arrays @@ -525,20 +526,20 @@ ZREMAINT(:,:) = PTSTEP !$acc update self(ZREMAINT) ! DO WHILE (ANY(ZREMAINT>0.)) -!$acc kernels +!$acc kernels copyout( ISEDIM ) ISEDIM = 0 -!acc loop independent private(IDX,JI,JJ,JK) +!$acc loop independent private(IDX) DO JK = KKTB,KKTE -!acc loop independent collapse(2) +!$acc loop independent collapse(2) DO JJ = KJB,KJE DO JI = KIB,KIE IF( (PRXT (JI,JJ,JK)>XRTMIN(KSPE) .OR. & PPRXS(JI,JJ,JK)>ZRSMIN(KSPE)) .AND. & ZREMAINT(JI,JJ)>0. ) THEN -!acc atomic capture +!$acc atomic capture ISEDIM = ISEDIM + 1 IDX = ISEDIM -!acc end atomic +!$acc end atomic I1(IDX) = JI I2(IDX) = JJ I3(IDX) = JK @@ -548,8 +549,6 @@ DO WHILE (ANY(ZREMAINT>0.)) END DO !$acc end kernels ! -!PW:BUG/TODO: semble nécessaire!!! -if (JK==-9999) print *,'PW: ISEDIM=',ISEDIM ! ! !* 1. Parameters for cloud sedimentation @@ -666,31 +665,30 @@ if (JK==-9999) print *,'PW: ISEDIM=',ISEDIM !$acc kernels ZMAX_TSTEP(:,:) = ZREMAINT(:,:) !$acc loop independent private(JI,JJ,JK,JL) - DO JL=1, ISEDIM + DO CONCURRENT( JL = 1 : ISEDIM ) JI=I1(JL) JJ=I2(JL) JK=I3(JL) IF(PRXT(JI,JJ,JK)>XRTMIN(KSPE) .AND. ZWSED(JI, JJ, JK)>1.E-20) THEN -!$acc atomic update +!acc atomic update ZMAX_TSTEP(JI, JJ) = MIN(ZMAX_TSTEP(JI, JJ), PMAXCFL * PRHODREF(JI, JJ, JK) * & PRXT(JI, JJ, JK) * PDZZ(JI, JJ, JK) / ZWSED(JI, JJ, JK)) -!$acc end atomic +!acc end atomic ENDIF ENDDO ZREMAINT(:,:) = ZREMAINT(:,:) - ZMAX_TSTEP(:,:) +!$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 - ENDDO !$acc end kernels -!$acc update self(ZWSED,ZMAX_TSTEP,PINPRX) -!PW: BUG PGI: done on CPU to work around a PGI 19.10 bug - PINPRX(:,:) = PINPRX(:,:) + ZWSED(:,:,KKB) / XRHOLW * (ZMAX_TSTEP(:,:) * ZINVTSTEP) -!$acc update device(PINPRX) + ENDDO !$acc kernels + PINPRX(:,:) = PINPRX(:,:) + ZWSED(:,:,KKB) / XRHOLW * (ZMAX_TSTEP(:,:) * ZINVTSTEP) IF (GPRESENT_PFPR) THEN !$acc loop independent DO JK = KKTB , KKTE diff --git a/src/MNH/ice4_tendencies.f90 b/src/MNH/ice4_tendencies.f90 index 5f2fea0d1b29e20e841c21e4a4a75069a4869298..5be0afd9452a17d2353885f08f783aa2de71e66d 100644 --- a/src/MNH/ice4_tendencies.f90 +++ b/src/MNH/ice4_tendencies.f90 @@ -351,9 +351,9 @@ INTEGER :: IZRRT3D, IZRST3D, IZRGT3D, IZRHT3D !$acc& PRCRIMSS,PRCRIMSG,PRSRIMCG,PRRACCSS,PRRACCSG,PRSACCRG,PRSMLTG,PRCMLTSR,PRICFRRG,PRRCFRIG, & !$acc& PRICFRR,PRCWETG,PRIWETG,PRRWETG,PRSWETG,PRCDRYG,PRIDRYG,PRRDRYG,PRSDRYG, & !$acc& PRWETGH,PRWETGH_MR,PRGMLTR,PRCWETH,PRIWETH,PRSWETH,PRGWETH,PRRWETH, & -!$acc& PRCDRYH,PRIDRYH,PRSDRYH,PRRDRYH,PRGDRYH,PRDRYHG,PRHMLTR,PRCBERI,PRS_TEND,PRG_TEND,PRH_TEND, & +!$acc& PRCDRYH,PRIDRYH,PRSDRYH,PRRDRYH,PRGDRYH,PRDRYHG,PRHMLTR,PRCBERI,PRS_TEND,PRG_TEND,PRH_TEND,PSSI, & !$acc& PA_TH,PA_RV,PA_RC,PA_RR,PA_RI,PA_RS,PA_RG,PA_RH,PB_TH,PB_RV,PB_RC,PB_RR,PB_RI,PB_RS,PB_RG,PB_RH, & -!$acc& PHLC_HCF,PHLC_LCF,PHLC_HRC,PHLC_LRC,PHLI_HCF,PHLI_LCF,PHLI_HRI,PHLI_LRI,PRAINFR) +!$acc& PHLC_HCF,PHLC_LCF,PHLC_HRC,PHLC_LRC,PHLI_HCF,PHLI_LCF,PHLI_HRI,PHLI_LRI,PRAINFR) copyin(XRTMIN) IF (MPPDB_INITIALIZED) THEN !Check all IN arrays @@ -487,7 +487,8 @@ PB_RS(:)=0. PB_RG(:)=0. PB_RH(:)=0. ! -DO JL=1, ISIZE +!$acc loop independent +DO CONCURRENT ( JL = 1 : ISIZE ) ZRVT(JL)=PRVT(JL) ZRCT(JL)=PRCT(JL) ZRRT(JL)=PRRT(JL) @@ -519,7 +520,8 @@ ELSE ZRVT, & PCIT, PRVHENI_MR, PB_TH, PB_RV, PB_RI) !$acc kernels - DO JL=1, ISIZE +!$acc loop independent + DO CONCURRENT ( JL = 1 : ISIZE ) ZRIT(JL)=ZRIT(JL) + PRVHENI_MR(JL) ZRVT(JL)=ZRVT(JL) - PRVHENI_MR(JL) ZTHT(JL)=ZTHT(JL) + PRVHENI_MR(JL)*PLSFACT(JL) @@ -535,7 +537,8 @@ ELSE &ZTHT, & &PRRHONG_MR, PB_TH, PB_RR, PB_RG) !$acc kernels - DO JL=1, ISIZE +!$acc loop independent + DO CONCURRENT ( JL = 1 : ISIZE ) ZRGT(JL) = ZRGT(JL) + PRRHONG_MR(JL) ZRRT(JL) = ZRRT(JL) - PRRHONG_MR(JL) ZTHT(JL) = ZTHT(JL) + PRRHONG_MR(JL)*(PLSFACT(JL)-PLVFACT(JL)) ! f(L_f*(RRHONG)) @@ -551,7 +554,8 @@ ELSE &ZTHT, ZRIT, & &PRIMLTC_MR, PB_TH, PB_RC, PB_RI) !$acc kernels - DO JL=1, ISIZE +!$acc loop independent + DO CONCURRENT ( JL = 1 : ISIZE ) ZRCT(JL) = ZRCT(JL) + PRIMLTC_MR(JL) ZRIT(JL) = ZRIT(JL) - PRIMLTC_MR(JL) ZTHT(JL) = ZTHT(JL) - PRIMLTC_MR(JL)*(PLSFACT(JL)-PLVFACT(JL)) ! f(L_f*(-RIMLTC)) @@ -563,14 +567,18 @@ ELSE ! IF(CSNOWRIMING=='OLD ') THEN !$acc kernels - ZLBDAS(:)=0. - WHERE(ZRST(:)>0.) +!$acc loop independent + DO CONCURRENT ( JL = 1 : ISIZE ) + IF ( ZRST(JL) > 0. ) THEN #ifndef MNH_BITREP - ZLBDAS(:) = MIN(XLBDAS_MAX, XLBS*(PRHODREF(:)*MAX(ZRST(:), XRTMIN(5)))**XLBEXS) + ZLBDAS(JL) = MIN(XLBDAS_MAX, XLBS*(PRHODREF(JL)*MAX(ZRST(JL), XRTMIN(5)))**XLBEXS) #else - ZLBDAS(:) = MIN(XLBDAS_MAX, XLBS*BR_POW(PRHODREF(:)*MAX(ZRST(:), XRTMIN(5)),XLBEXS)) + ZLBDAS(JL) = MIN(XLBDAS_MAX, XLBS*BR_POW(PRHODREF(JL)*MAX(ZRST(JL), XRTMIN(5)),XLBEXS)) #endif - END WHERE + ELSE + ZLBDAS(JL) = 0. + END IF + END DO !$acc end kernels CALL ICE4_RSRIMCG_OLD(ODSOFT, PCOMPUTE==1., & &PRHODREF, & @@ -578,7 +586,8 @@ ELSE &ZT, ZRCT, ZRST, & &PRSRIMCG_MR, PB_RS, PB_RG) !$acc kernels - DO JL=1, ISIZE +!$acc loop independent + DO CONCURRENT ( JL = 1 : ISIZE ) ZRST(JL) = ZRST(JL) - PRSRIMCG_MR(JL) ZRGT(JL) = ZRGT(JL) + PRSRIMCG_MR(JL) ENDDO @@ -595,13 +604,14 @@ ENDIF IF(ISIZE>0) THEN IF(.NOT. ODSOFT) THEN !$acc kernels +!$acc loop independent + DO JL = 1, ISIZE #ifndef MNH_BITREP - ZZW(:) = EXP(XALPI-XBETAI/ZT(:)-XGAMI*ALOG(ZT(:))) + ZZW(JL) = EXP(XALPI-XBETAI/ZT(JL)-XGAMI*ALOG(ZT(JL))) #else - ZZW(:) = BR_EXP(XALPI-XBETAI/ZT(:)-XGAMI*BR_LOG(ZT(:))) + ZZW(JL) = BR_EXP(XALPI-XBETAI/ZT(JL)-XGAMI*BR_LOG(ZT(JL))) #endif -!$acc loop independent - DO JL = 1, ISIZE + PSSI(JL) = ZRVT(JL)*( PPRES(JL)-ZZW(JL) ) / ( XEPSILO * ZZW(JL) ) - 1.0 ! Supersaturation over ice ZKA(JL) = 2.38E-2 + 0.0071E-2*(ZT(JL)-XTT) ! k_a @@ -653,13 +663,15 @@ IF(ISIZE>0) THEN ZRST3D (K1(JL), K2(JL), K3(JL)) = ZRST(JL) ZRGT3D (K1(JL), K2(JL), K3(JL)) = ZRGT(JL) END DO +!$acc end kernels IF (KRR==7) THEN +!$acc kernels !$acc loop independent DO JL=1,ISIZE ZRHT3D (K1(JL), K2(JL), K3(JL)) = ZRHT(JL) - ENDDO - ENDIF + END DO !$acc end kernels + ENDIF CALL ICE4_RAINFR_VERT(KIB, KIE, KIT, KJB, KJE, KJT, KKB, KKE, KKT, KKL, PRAINFR(:,:,:), ZRRT3D(:,:,:), & &ZRST3D(:,:,:), ZRGT3D(:,:,:), ZRHT3D(:,:,:)) !$acc kernels @@ -678,53 +690,84 @@ IF(ISIZE>0) THEN !* compute the slope parameters ! !$acc kernels - ZLBDAS(:)=0. - WHERE(ZRST(:)>0.) +!$acc loop independent + DO CONCURRENT ( JL = 1 : ISIZE ) + IF ( ZRST(JL) > 0. ) THEN #ifndef MNH_BITREP - ZLBDAS(:) = MIN(XLBDAS_MAX, XLBS*(PRHODREF(:)*MAX(ZRST(:), XRTMIN(5)))**XLBEXS) + ZLBDAS(JL) = MIN(XLBDAS_MAX, XLBS*(PRHODREF(JL)*MAX(ZRST(JL), XRTMIN(5)))**XLBEXS) #else - ZLBDAS(:) = MIN(XLBDAS_MAX, XLBS*BR_POW(PRHODREF(:)*MAX(ZRST(:), XRTMIN(5)),XLBEXS)) + ZLBDAS(JL) = MIN(XLBDAS_MAX, XLBS*BR_POW(PRHODREF(JL)*MAX(ZRST(JL), XRTMIN(5)),XLBEXS)) #endif - END WHERE - ZLBDAG(:)=0. - WHERE(ZRGT(:)>0.) + ELSE + ZLBDAS(JL) = 0. + END IF + END DO +!$acc loop independent + DO CONCURRENT ( JL = 1 : ISIZE ) + IF ( ZRGT(JL) > 0. ) THEN #ifndef MNH_BITREP - ZLBDAG(:) = XLBG*(PRHODREF(:)*MAX(ZRGT(:), XRTMIN(6)))**XLBEXG + ZLBDAG(JL) = XLBG*(PRHODREF(JL)*MAX(ZRGT(JL), XRTMIN(6)))**XLBEXG #else - ZLBDAG(:) = XLBG*BR_POW(PRHODREF(:)*MAX(ZRGT(:), XRTMIN(6)),XLBEXG) + ZLBDAG(JL) = XLBG*BR_POW(PRHODREF(JL)*MAX(ZRGT(JL), XRTMIN(6)),XLBEXG) #endif - END WHERE + ELSE + ZLBDAG(JL) = 0. + END IF + END DO !ZLBDAR will be used when we consider rain diluted over the grid box - ZLBDAR(:)=0. - WHERE(ZRRT(:)>0.) +!$acc loop independent + DO CONCURRENT ( JL = 1 : ISIZE ) + IF ( ZRRT(JL) > 0. ) THEN #ifndef MNH_BITREP - ZLBDAR(:) = XLBR*( PRHODREF(:)*MAX( ZRRT(:), XRTMIN(3)))**XLBEXR + ZLBDAR(JL) = XLBR*( PRHODREF(JL)*MAX( ZRRT(JL), XRTMIN(3)))**XLBEXR #else - ZLBDAR(:) = XLBR*BR_POW(PRHODREF(:)*MAX( ZRRT(:), XRTMIN(3)),XLBEXR) + ZLBDAR(JL) = XLBR*BR_POW(PRHODREF(JL)*MAX( ZRRT(JL), XRTMIN(3)),XLBEXR) #endif - END WHERE + ELSE + ZLBDAR(JL) = 0. + END IF + END DO +!$acc end kernels !ZLBDAR_RF is used when we consider rain concentrated in its fraction IF (HSUBG_RC_RR_ACCR=='PRFR' .OR. HSUBG_RR_EVAP=='PRFR') THEN - ZLBDAR_RF(:)=0. - WHERE(ZRRT(:)>0. .AND. ZRF(:)>0.) +!PW: 20211012: kernels directive inside IF to prevent crash with nvhpc 21.9 +!$acc kernels +!$acc loop independent + DO CONCURRENT( JL = 1 : ISIZE ) + IF ( ZRRT(JL) >0. .AND. ZRF(JL) > 0. ) THEN #ifndef MNH_BITREP - ZLBDAR_RF(:) = XLBR*( PRHODREF(:) *MAX( ZRRT(:)/ZRF(:) , XRTMIN(3)))**XLBEXR + ZLBDAR_RF(JL) = XLBR*( PRHODREF(JL) *MAX( ZRRT(JL)/ZRF(JL) , XRTMIN(3)))**XLBEXR #else - ZLBDAR_RF(:) = XLBR*BR_POW(PRHODREF(:) *MAX( ZRRT(:)/ZRF(:) , XRTMIN(3)),XLBEXR) + ZLBDAR_RF(JL) = XLBR*BR_POW(PRHODREF(JL) *MAX( ZRRT(JL)/ZRF(JL) , XRTMIN(3)),XLBEXR) #endif - END WHERE + ELSE + ZLBDAR_RF(JL) = 0. + END IF + END DO +!$acc end kernels ELSE - ZLBDAR_RF(:) = ZLBDAR(:) +!$acc kernels +! ZLBDAR_RF(:) = ZLBDAR(:) +!$acc loop independent + DO CONCURRENT( JL = 1 : ISIZE ) + ZLBDAR_RF(JL) = ZLBDAR(JL) + END DO +!$acc end kernels ENDIF +!$acc kernels IF(KRR==7) THEN - ZLBDAH(:)=0. - WHERE(PRHT(:)>0.) +!$acc loop independent + DO CONCURRENT ( JL = 1 : ISIZE ) + IF ( PRHT(JL) > 0. ) THEN #ifndef MNH_BITREP - ZLBDAH(:) = XLBH*(PRHODREF(:)*MAX(PRHT(:), XRTMIN(7)))**XLBEXH + ZLBDAH(JL) = XLBH*(PRHODREF(JL)*MAX(PRHT(JL), XRTMIN(7)))**XLBEXH #else - ZLBDAH(:) = XLBH*BR_POW(PRHODREF(:)*MAX(PRHT(:), XRTMIN(7)),XLBEXH) + ZLBDAH(JL) = XLBH*BR_POW(PRHODREF(JL)*MAX(PRHT(JL), XRTMIN(7)),XLBEXH) #endif - END WHERE + ELSE + ZLBDAH(JL) = 0. + END IF + END DO ENDIF !$acc end kernels ENDIF @@ -790,7 +833,8 @@ CALL ICE4_FAST_RS(ODSOFT, PCOMPUTE, & ! ------------------------------------------------------ ! !$acc kernels -DO JL=1, ISIZE +!$acc loop independent +DO CONCURRENT ( JL = 1 : ISIZE ) ZRGSI(JL) = PRVDEPG(JL) + PRSMLTG(JL) + PRRACCSG(JL) + & & PRSACCRG(JL) + PRCRIMSG(JL) + PRSRIMCG(JL) ZRGSI_MR(JL) = PRRHONG_MR(JL) + PRSRIMCG_MR(JL)