diff --git a/src/MNH/ice_adjust.f90 b/src/MNH/ice_adjust.f90 index 5876b4b4185805675da982907478e23387eb4bb8..1571bc2741f977d4f5903c3392b4fdb2767b7654 100644 --- a/src/MNH/ice_adjust.f90 +++ b/src/MNH/ice_adjust.f90 @@ -240,22 +240,21 @@ REAL, DIMENSION(:,:,:), OPTIONAL, INTENT(IN) :: PRHS ! Hail m.r. at t+1 ! ! IN variables ! -!$acc declare present(PPABST,PRRS,PRSS,PRGS) -!acc declare present(PRHODJ,PEXNREF,PSIGS,PMFCONV,PPABST,PZZ, & -!acc & PCF_MF,PRC_MF,PRI_MF,PRVT,PRCT, & -!acc & PRRT,PRIT,PRST,PRGT, & +!$acc declare present(PRHODJ,PEXNREF,PSIGS,PMFCONV,PPABST,PZZ, & +!$acc & PCF_MF,PRC_MF,PRI_MF,PRVT,PRCT, & +!$acc & PRRS,PRSS,PRGS,PRRT,PRIT,PRST,PRGT, & +!Optional arguments: if declared present but not provided +! => crash in the kernels using them (even if branch not taken) +! (BUG PGI 16.10) !acc & PRHT,PRHS, & ! ! INOUT variables ! -!acc & & -!acc & & -!$acc declare present(PRVS,PRCS,PRIS,PTHS) +!$acc & PRVS,PRCS,PRIS,PTHS, & ! ! OUT variables ! -!acc & PSRCS) -!acc & PCLDFR) +!$acc & PSRCS,PCLDFR) ! !* 0.2 Declarations of local variables : ! @@ -336,6 +335,7 @@ DO JITER =1,ITERMAX ! !* 2.2 compute the intermediate temperature at t+1, T* ! +!$acc data present(PRHS) !$acc kernels ZT(:,:,:) = ( PTHS(:,:,:) * PTSTEP ) * ZEXNS(:,:,:) ! @@ -368,6 +368,7 @@ ELSE IF( KRR == 2 ) THEN + XCL *PTSTEP* PRCS(:,:,:) END IF !$acc end kernels +!$acc end data ! ! !* 3. FIRST ORDER SUBGRID CONDENSATION SCHEME @@ -412,11 +413,12 @@ END IF ! !* compute the saturation vapor pressures at t+1 ! -#ifndef _OPENACC - CALL GET_HALO(ZT) -#else - CALL GET_HALO_D(ZT) -#endif +! PW: get_halo call looks unnecessary +! #ifndef _OPENACC +! CALL GET_HALO(ZT) +! #else +! CALL GET_HALO_D(ZT) +! #endif !$acc kernels #ifndef MNH_BITREP @@ -638,17 +640,29 @@ ELSE / PEXNREF(:,:,:) /PTSTEP ENDIF !$acc end kernels -!$acc update self(PCLDFR,PSRCS,PRVS,PRCS,PRIS,PTHS) +!$acc update self(PCLDFR,PSRCS) ! ! ! !* 6. STORE THE BUDGET TERMS ! ---------------------- ! -IF (LBUDGET_RV) CALL BUDGET (PRVS(:,:,:) * PRHODJ(:,:,:),6,'DEPI_BU_RRV') -IF (LBUDGET_RC) CALL BUDGET (PRCS(:,:,:) * PRHODJ(:,:,:),7,'DEPI_BU_RRC') -IF (LBUDGET_RI) CALL BUDGET (PRIS(:,:,:) * PRHODJ(:,:,:),9,'DEPI_BU_RRI') -IF (LBUDGET_TH) CALL BUDGET (PTHS(:,:,:) * PRHODJ(:,:,:),4,'DEPI_BU_RTH') +IF (LBUDGET_RV) THEN +!$acc update self(PRVS) + CALL BUDGET (PRVS(:,:,:) * PRHODJ(:,:,:),6,'DEPI_BU_RRV') +END IF +IF (LBUDGET_RC) THEN +!$acc update self(PRCS) + CALL BUDGET (PRCS(:,:,:) * PRHODJ(:,:,:),7,'DEPI_BU_RRC') +END IF +IF (LBUDGET_RI) THEN +!$acc update self(PRIS) + CALL BUDGET (PRIS(:,:,:) * PRHODJ(:,:,:),9,'DEPI_BU_RRI') +END IF +IF (LBUDGET_TH) THEN +!$acc update self(PTHS) + CALL BUDGET (PTHS(:,:,:) * PRHODJ(:,:,:),4,'DEPI_BU_RTH') +END IF ! !------------------------------------------------------------------------------ ! diff --git a/src/MNH/rain_ice.f90 b/src/MNH/rain_ice.f90 index d143f4fced3e6bffb82077760c017017640d9861..87026443097eb2156b3ec7e61d049957dc6b286f 100644 --- a/src/MNH/rain_ice.f90 +++ b/src/MNH/rain_ice.f90 @@ -454,8 +454,7 @@ REAL, DIMENSION(SIZE(XRTMIN)) :: ZRTMIN ! INTEGER , DIMENSION(SIZE(GMICRO)) :: I1,I2,I3 ! Used to replace the COUNT INTEGER :: JL ! and PACK intrinsics -!$acc declare create(GSEDIMR,GSEDIMC,GSEDIMI,GSEDIMS,GSEDIMG,GSEDIMH, & -!$acc & GNEGT,GMICRO,GRIM,GACC,GDRY,GWET,GHAIL,GWORK,GDEP, & +!$acc declare create(GMICRO,GWET,GHAIL,GDEP, & !$acc & IVEC1,IVEC2,ZVEC1,ZVEC2,ZVEC3,ZW, & !$acc & ZPRCS,ZPRRS,ZPRSS,ZPRGS,ZPRHS, & !$acc & ZWSED,ZWSEDW1,ZWSEDW2,ZCONC_TMP,ZT,ZRAY,ZLBC,ZFSEDC, & @@ -463,10 +462,13 @@ INTEGER :: JL ! and PACK intrinsics !$acc & ZRVS,ZRCS,ZRRS,ZRIS,ZRSS,ZRGS,ZRHS,ZTHS, & !$acc & ZRHODREF, & !$acc & ZRHODJ,ZZT,ZPRES,ZZW,ZLSFACT,ZLVFACT, & -!$acc & ZUSW,ZSSI,ZLBDAR,ZLBDAS,ZLBDAG,ZLBDAH, & +!$acc & ZUSW,ZSSI,ZLBDAS,ZLBDAG,ZLBDAH, & !$acc & ZAI,ZCJ,ZKA,ZDV,ZZW1,ZRTMIN) & -!$acc & device_resident(ZCRIAUTI,ZEXNREF,ZRDRYG,ZRWETG,ZSIGMA_RC,ZCF, & -!$acc & I1,I2,I3) +!$acc & device_resident(GSEDIMR,GSEDIMC,GSEDIMI,GSEDIMS,GSEDIMG,GSEDIMH, & +!$acc & GNEGT,GRIM,GACC,GDRY,GWORK, & +!$acc & ZCRIAUTI,ZEXNREF,ZLBDAR,ZRDRYG,ZRWETG,ZSIGMA_RC,ZCF, & +!$acc & I1,I2,I3) + ! #ifdef _OPENACC PRINT *,'OPENACC: RAIN_ICE being implemented' @@ -642,7 +644,7 @@ IF( IMICRO >= 0 ) THEN ZRHODJ(JL) = PRHODJ(I1(JL),I2(JL),I3(JL)) END DO !$acc end kernels -!$acc update self(ZRHODJ) !used in BUDGET +!$acc update self(ZRHODJ) !used only in BUDGET END IF ! CALL RAIN_ICE_SLOW @@ -1128,11 +1130,9 @@ DO JN = 1 , KSPLITR PRCS(:,:,:) = PRCS(:,:,:) * ZINVTSTEP END IF END IF -!acc end kernels ! !* 2.2 for rain ! -!acc kernels IF( JN==1 ) PRRS(:,:,:) = PRRS(:,:,:) * PTSTEP ZWSED(:,:,:) = 0. ! @@ -1158,11 +1158,9 @@ DO JN = 1 , KSPLITR IF ( JN==KSPLITR ) THEN PRRS(:,:,:) = PRRS(:,:,:) * ZINVTSTEP END IF -!acc end kernels ! !* 2.3 for pristine ice ! -!acc kernels IF( JN==1 ) PRIS(:,:,:) = PRIS(:,:,:) * PTSTEP ZWSED(:,:,:) = 0. ! @@ -1190,11 +1188,9 @@ DO JN = 1 , KSPLITR IF( JN==KSPLITR ) THEN PRIS(:,:,:) = PRIS(:,:,:) * ZINVTSTEP END IF -!acc end kernels ! !* 2.4 for aggregates/snow ! -!acc kernels IF( JN==1 ) PRSS(:,:,:) = PRSS(:,:,:) * PTSTEP ZWSED(:,:,:) = 0. ! @@ -1219,11 +1215,9 @@ DO JN = 1 , KSPLITR IF( JN==KSPLITR ) THEN PRSS(:,:,:) = PRSS(:,:,:) * ZINVTSTEP END IF -!acc end kernels ! !* 2.5 for graupeln ! -!acc kernels ZWSED(:,:,:) = 0. IF( JN==1 ) PRGS(:,:,:) = PRGS(:,:,:) * PTSTEP ! @@ -1248,11 +1242,9 @@ DO JN = 1 , KSPLITR IF( JN==KSPLITR ) THEN PRGS(:,:,:) = PRGS(:,:,:) * ZINVTSTEP END IF -!acc end kernels ! !* 2.6 for hail ! -!acc kernels IF ( KRR == 7 ) THEN IF( JN==1 ) PRHS(:,:,:) = PRHS(:,:,:) * PTSTEP ZWSED(:,:,:) = 0. @@ -1282,25 +1274,33 @@ DO JN = 1 , KSPLITR !$acc end kernels ! END DO -!$acc update self(PRRS,PRSS,PRGS,PRIS) -#ifdef _OPENACC -IF (KRR==7) THEN -!$acc update self(PRHS) -END IF -#endif ! !* 2.3 budget storage ! IF (LBUDGET_RC .AND. OSEDIC) THEN !$acc update self(PRCS) - CALL BUDGET (PRCS(:,:,:)*PRHODJ(:,:,:),7 ,'SEDI_BU_RRC') + CALL BUDGET (PRCS(:,:,:)*PRHODJ(:,:,:),7 ,'SEDI_BU_RRC') +END IF +IF (LBUDGET_RR) THEN +!$acc update self(PRRS) + CALL BUDGET (PRRS(:,:,:)*PRHODJ(:,:,:),8 ,'SEDI_BU_RRR') +END IF +IF (LBUDGET_RI) THEN +!$acc update self(PRIS) + CALL BUDGET (PRIS(:,:,:)*PRHODJ(:,:,:),9 ,'SEDI_BU_RRI') +END IF +IF (LBUDGET_RS) THEN +!$acc update self(PRSS) + CALL BUDGET (PRSS(:,:,:)*PRHODJ(:,:,:),10,'SEDI_BU_RRS') +END IF +IF (LBUDGET_RG) THEN +!$acc update self(PRGS) + CALL BUDGET (PRGS(:,:,:)*PRHODJ(:,:,:),11,'SEDI_BU_RRG') +END IF +IF ( KRR == 7 .AND. LBUDGET_RH) THEN +!$acc update self(PRHS) + CALL BUDGET (PRHS(:,:,:)*PRHODJ(:,:,:),12,'SEDI_BU_RRH') END IF -IF (LBUDGET_RR) CALL BUDGET (PRRS(:,:,:)*PRHODJ(:,:,:),8 ,'SEDI_BU_RRR') -IF (LBUDGET_RI) CALL BUDGET (PRIS(:,:,:)*PRHODJ(:,:,:),9 ,'SEDI_BU_RRI') -IF (LBUDGET_RS) CALL BUDGET (PRSS(:,:,:)*PRHODJ(:,:,:),10,'SEDI_BU_RRS') -IF (LBUDGET_RG) CALL BUDGET (PRGS(:,:,:)*PRHODJ(:,:,:),11,'SEDI_BU_RRG') -IF ( KRR == 7 .AND. LBUDGET_RH) & - CALL BUDGET (PRHS(:,:,:)*PRHODJ(:,:,:),12,'SEDI_BU_RRH') ! ! !* 2.4 DROPLET DEPOSITION AT THE 1ST LEVEL ABOVE GROUND @@ -1319,13 +1319,14 @@ IF (LDEPOSC) THEN PINDEP(:,:) = XVDEPOSC * PRCT(:,:,2) * PRHODJ(:,:,2) /XRHOLW END WHERE !$acc end kernels -!$acc update self(PRCS) END IF ! !* 2.5 budget storage ! -IF ( LBUDGET_RC .AND. LDEPOSC ) & +IF ( LBUDGET_RC .AND. LDEPOSC ) THEN +!$acc update self(PRCS) CALL BUDGET (PRCS(:,:,:)*PRHODJ(:,:,:),7 ,'DEPO_BU_RRC') +END IF ! END SUBROUTINE RAIN_ICE_SEDIMENTATION_SPLIT ! @@ -1965,10 +1966,10 @@ IF( INEGT >= 1 ) THEN ZZWMAX = MAXVAL(ZZW(:)) !$acc end kernels IF( ZZWMAX > 0.0 ) THEN +!$acc kernels ! !* 3.1.2 update the r_i and r_v mixing ratios ! -!$acc kernels ZZW(:) = MIN( ZZW(:),50.E3 ) ! limitation provisoire a 50 l^-1 ZW(:,:,:) = 0.0 DO JL=1,INEGT @@ -1997,8 +1998,8 @@ IF( INEGT >= 1 ) THEN ZW(I1(JL),I2(JL),I3(JL)) = ZZW(JL) END DO PCIT(:,:,:) = MAX( ZW(:,:,:), PCIT(:,:,:) ) -!$acc end kernels #endif +!$acc end kernels END IF DEALLOCATE(ZSSI) DEALLOCATE(ZUSW) @@ -2432,8 +2433,8 @@ IMPLICIT NONE ! INTEGER , DIMENSION(:),ALLOCATABLE :: I1 ! Used to replace the COUNT INTEGER :: JL ! and PACK intrinsics -!acc declare device_resident(I1) -!$acc declare create(I1) +REAL,DIMENSION(SIZE(ZZW1,1)) :: ZTMP +!$acc declare device_resident(I1) ! !------------------------------------------------------------------------------- ! @@ -2616,11 +2617,13 @@ INTEGER :: JL ! and PACK intrinsics ! ! 5.2.1 select the (ZLBDAS,ZLBDAR) couplet ! +!$acc kernels copyin (XKER_RACCS,XKER_RACCSS,XKER_SACCRG) & +!$acc & present(GACC,ZLBDAS,ZRHODREF,ZZW,ZLSFACT,ZLVFACT,ZLBDAR,I1, & +!$acc & ZZW1,ZRRS,ZRSS,ZTHS,IVEC1,IVEC2,ZVEC1,ZVEC2,ZVEC3) #ifndef _OPENACC ZVEC1(:) = PACK( ZLBDAS(:),MASK=GACC(:) ) ZVEC2(:) = PACK( ZLBDAR(:),MASK=GACC(:) ) #else -!$acc kernels copyin(XKER_RACCSS) DO JL=1,IGACC ZVEC1(JL) = ZLBDAS(I1(JL)) ZVEC2(JL) = ZLBDAR(I1(JL)) @@ -2667,14 +2670,10 @@ INTEGER :: JL ! and PACK intrinsics DO JL=1,IGACC ZZW(I1(JL)) = ZVEC3(JL) END DO -!$acc end kernels #endif ! ! 5.2.4 raindrop accretion on the small sized aggregates ! -!$acc kernels present(GACC,ZLBDAS,ZRHODREF,ZZW,ZLSFACT,ZLVFACT,ZLBDAR, & -!$acc & ZZW1,ZRRS,ZRSS,ZTHS,IVEC1,IVEC2,ZVEC1,ZVEC2,ZVEC3) & -!$acc & copyin(XKER_RACCS) WHERE ( GACC(:) ) #ifndef MNH_BITREP ZZW1(:,2) = & !! coef of RRACCS @@ -2706,19 +2705,24 @@ INTEGER :: JL ! and PACK intrinsics - XKER_RACCS(IVEC2(JJ) ,IVEC1(JJ) )*(ZVEC1(JJ) - 1.0) ) & * (ZVEC2(JJ) - 1.0) END DO -!$acc end kernels #ifndef _OPENACC ZZW1(:,2) = ZZW1(:,2)*UNPACK( VECTOR=ZVEC3(:),MASK=GACC(:),FIELD=0.0 ) #else -!$acc update self(I1) -!$acc kernels present(I1,ZZW1,ZVEC3,IVEC1,IVEC2,ZVEC1,ZVEC2,ZVEC3) copyin(XKER_SACCRG) - ZZW1(1:I1(1)-1,2) = 0.0 - ZZW1(I1(1),2) = ZZW1(I1(1),2)*ZVEC3(1) - DO JL=2,IGACC - ZZW1(I1(JL-1)+1:I1(JL)-1,2) = 0.0 - ZZW1(I1(JL),2) = ZZW1(I1(JL),2)*ZVEC3(JL) - END DO - ZZW1(I1(IGACC)+1:,2) = 0.0 + !Problems when doing it this way on GPU (PGI 16.10/17.01): + !ZZW1(1:I1(1)-1,2) = 0.0 + !ZZW1(I1(1),2) = ZZW1(I1(1),2)*ZVEC3(1) + !DO JL=2,IGACC + ! ZZW1(I1(JL-1)+1:I1(JL)-1,2) = 0.0 + ! ZZW1(I1(JL),2) = ZZW1(I1(JL),2)*ZVEC3(JL) + !END DO + !ZZW1(I1(IGACC)+1:,2) = 0.0 + ! + !OK on GPU: + ZTMP(:) = ZZW1(:,2) + ZZW1(:,2) = 0.0 + DO JL=1,IGACC + ZZW1(I1(JL),2) = ZTMP(I1(JL))*ZVEC3(JL) +END DO #endif !! RRACCS! ! 5.2.5 perform the bilinear interpolation of the normalized @@ -2748,8 +2752,6 @@ INTEGER :: JL ! and PACK intrinsics WHERE ( GWORK(:) ) ZZW1(:,2) = MAX( MIN( ZRRS(:),ZZW1(:,2)-ZZW1(:,4) ),0.0 ) ! RRACCSG END WHERE -!$acc end kernels -!$acc kernels present(GWORK,GACC,ZLBDAS,ZRHODREF,ZLSFACT,ZLVFACT,ZLBDAR,ZZW1,ZRRS,ZRSS,ZRGS,ZTHS,ZZW) default(none) GWORK(:) = GWORK(:) .AND. ZZW1(:,2)>0.0 WHERE ( GWORK(:) ) #ifndef MNH_BITREP @@ -2779,6 +2781,7 @@ INTEGER :: JL ! and PACK intrinsics DEALLOCATE(ZVEC1) END IF DEALLOCATE(GACC) + DEALLOCATE(I1) IF (LBUDGET_TH) THEN !$acc update self(ZTHS) CALL BUDGET (UNPACK(ZTHS(:),MASK=GMICRO(:,:,:),FIELD=PTHS)*PRHODJ(:,:,:), 4,'ACC_BU_RTH') @@ -2856,9 +2859,11 @@ IMPLICIT NONE ! INTEGER :: JL INTEGER,DIMENSION(:),ALLOCATABLE :: I1 -!$acc declare create(I1) +!$acc declare device_resident(I1) ! !------------------------------------------------------------------------------- + ALLOCATE(GDRY(IMICRO)) + ALLOCATE(I1(IMICRO)) !I1 is bigger than necessary but it easier to do it now (instead of computing IGDRY before allocating I1) ! !* 6.1 rain contact freezing ! @@ -2932,13 +2937,9 @@ INTEGER,DIMENSION(:),ALLOCATABLE :: I1 * ZRIT(:) * ZZW(:) ) ! RIDRYG #endif END WHERE -!$acc end kernels ! !* 6.2.1 accretion of aggregates on the graupeln ! - ALLOCATE(GDRY(IMICRO)) - ALLOCATE(I1(IMICRO)) !I1 is bigger than necessary but it easier to do it now (instead of computing IGDRY before allocating I1) -!$acc kernels GDRY(:) = (ZRST(:)>XRTMIN(5)) .AND. (ZRGT(:)>XRTMIN(6)) .AND. (ZRSS(:)>0.0) !$acc end kernels #ifndef _OPENACC @@ -2959,11 +2960,12 @@ INTEGER,DIMENSION(:),ALLOCATABLE :: I1 ! !* 6.2.3 select the (ZLBDAG,ZLBDAS) couplet ! +!$acc kernels copyin(XKER_SDRYG,XCOLEXSG,XCXG) & +!$acc & present(IVEC1,IVEC2,ZVEC1,ZVEC2,ZVEC3,GDRY,ZZW1,ZRSS,ZZW,ZZT,ZLBDAS,ZLBDAG,ZRHODREF) #ifndef _OPENACC ZVEC1(:) = PACK( ZLBDAG(:),MASK=GDRY(:) ) ZVEC2(:) = PACK( ZLBDAS(:),MASK=GDRY(:) ) #else -!$acc kernels DO JL=1,IGDRY ZVEC1(JL) = ZLBDAG(I1(JL)) ZVEC2(JL) = ZLBDAS(I1(JL)) @@ -2991,13 +2993,10 @@ INTEGER,DIMENSION(:),ALLOCATABLE :: I1 #endif IVEC2(1:IGDRY) = INT( ZVEC2(1:IGDRY) ) ZVEC2(1:IGDRY) = ZVEC2(1:IGDRY) - FLOAT( IVEC2(1:IGDRY) ) -!$acc end kernels ! !* 6.2.5 perform the bilinear interpolation of the normalized ! SDRYG-kernel ! -!$acc kernels copyin(XKER_SDRYG,XCOLEXSG,XCXG) default(none) & -!$acc & present(IVEC1,IVEC2,ZVEC1,ZVEC2,ZVEC3,GDRY,ZZW1,ZRSS,ZZW,ZZT,ZLBDAS,ZLBDAG,ZRHODREF) 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) ) & @@ -3065,11 +3064,12 @@ INTEGER,DIMENSION(:),ALLOCATABLE :: I1 ! !* 6.2.8 select the (ZLBDAG,ZLBDAR) couplet ! +!$acc kernels copyin(XKER_RDRYG,XCXG) & +!$acc & present(IVEC1,IVEC2,ZVEC1,ZVEC2,ZVEC3,GDRY,ZZW1,ZRRS,ZZW,ZLBDAR,ZLBDAG,ZRHODREF) #ifndef _OPENACC ZVEC1(:) = PACK( ZLBDAG(:),MASK=GDRY(:) ) ZVEC2(:) = PACK( ZLBDAR(:),MASK=GDRY(:) ) #else -!$acc kernels DO JL=1,IGDRY ZVEC1(JL) = ZLBDAG(I1(JL)) ZVEC2(JL) = ZLBDAR(I1(JL)) @@ -3097,13 +3097,10 @@ INTEGER,DIMENSION(:),ALLOCATABLE :: I1 #endif IVEC2(1:IGDRY) = INT( ZVEC2(1:IGDRY) ) ZVEC2(1:IGDRY) = ZVEC2(1:IGDRY) - FLOAT( IVEC2(1:IGDRY) ) -!$acc end kernels ! !* 6.2.10 perform the bilinear interpolation of the normalized ! RDRYG-kernel ! -!$acc kernels copyin(XKER_RDRYG,XCXG) default(none) & -!$acc & present(IVEC1,IVEC2,ZVEC1,ZVEC2,ZVEC3,GDRY,ZZW1,ZRRS,ZZW,ZLBDAR,ZLBDAG,ZRHODREF) 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) ) & @@ -3146,15 +3143,14 @@ INTEGER,DIMENSION(:),ALLOCATABLE :: I1 DEALLOCATE(ZVEC1) END IF ! -!$acc kernels - ZRDRYG(:) = ZZW1(:,1) + ZZW1(:,2) + ZZW1(:,3) + ZZW1(:,4) -!$acc end kernels DEALLOCATE(GDRY) ! +!$acc kernels copyin(XRTMIN,XEX0DEPG,XEX1DEPG) & +!$acc & present(ZZW,ZRWETG,ZRGT,ZZW1,ZRIS,ZRSS,ZRVT,ZZT,ZPRES,ZKA,ZDV,ZLBDAG,ZCJ) + ZRDRYG(:) = ZZW1(:,1) + ZZW1(:,2) + ZZW1(:,3) + ZZW1(:,4) +! !* 6.3 compute the Wet growth case ! -!$acc kernels default(none) copyin(XRTMIN,XEX0DEPG,XEX1DEPG) & -!$acc & present(ZZW,ZRWETG,ZRGT,ZZW1,ZRIS,ZRSS,ZRVT,ZZT,ZPRES,ZKA,ZDV,ZLBDAG,ZCJ) ZZW(:) = 0.0 ZRWETG(:) = 0.0 WHERE( ZRGT(:)>XRTMIN(6) ) @@ -3193,11 +3189,9 @@ INTEGER,DIMENSION(:),ALLOCATABLE :: I1 ( ZRHODREF(:)*(XLMTT-XCL*(XTT-ZZT(:))) ) ) #endif END WHERE -!$acc end kernels ! !* 6.4 Select Wet or Dry case ! -!$acc kernels ZZW(:) = 0.0 IF ( KRR == 7 ) THEN GWORK(:) = ZRGT(:)>XRTMIN(6) .AND. ZZT(:)<XTT .AND. & ! Wet diff --git a/src/MNH/resolved_cloud.f90 b/src/MNH/resolved_cloud.f90 index 7afd1d7408bc47946cb8bb74cd884977069bbcfb..99d742e83b0909aa0aff31e5130234e720463d5c 100644 --- a/src/MNH/resolved_cloud.f90 +++ b/src/MNH/resolved_cloud.f90 @@ -702,6 +702,45 @@ CALL ABORT END WHERE END IF #else +#if 1 +!$acc kernels present(PTHS,PRS) present(ZEXN,ZLV,ZLS,ZCPH,ZCOR) + DO JK=1,SIZE(PZZ,3) + DO JJ=1,SIZE(PZZ,2) + DO JI=1,SIZE(PZZ,1) + IF (PRS(JI,JJ,JK,4) < 0.) THEN + PRS(JI,JJ,JK,1) = PRS(JI,JJ,JK,1) + PRS(JI,JJ,JK,4) + PTHS(JI,JJ,JK) = PTHS(JI,JJ,JK) - PRS(JI,JJ,JK,4) * ZLS(JI,JJ,JK) / & + ZCPH(JI,JJ,JK) / ZEXN(JI,JJ,JK) + PRS(JI,JJ,JK,4) = 0. + END IF + ! cloud + IF (PRS(JI,JJ,JK,2) < 0.) THEN + PRS(JI,JJ,JK,1) = PRS(JI,JJ,JK,1) + PRS(JI,JJ,JK,2) + PTHS(JI,JJ,JK) = PTHS(JI,JJ,JK) - PRS(JI,JJ,JK,2) * ZLV(JI,JJ,JK) / & + ZCPH(JI,JJ,JK) / ZEXN(JI,JJ,JK) + PRS(JI,JJ,JK,2) = 0. + END IF + ! if rc or ri are positive, we can correct negative rv + ! cloud + IF ( PRS(JI,JJ,JK,1) < 0. .AND. (PRS(JI,JJ,JK,2)> 0.) ) THEN + PRS(JI,JJ,JK,1) = PRS(JI,JJ,JK,1) + PRS(JI,JJ,JK,2) + PTHS(JI,JJ,JK) = PTHS(JI,JJ,JK) - PRS(JI,JJ,JK,2) * ZLV(JI,JJ,JK) / & + ZCPH(JI,JJ,JK) / ZEXN(JI,JJ,JK) + PRS(JI,JJ,JK,2) = 0. + END IF + ! ice + IF (KRR>3 .AND. (PRS(JI,JJ,JK,1) < 0.).AND.(PRS(JI,JJ,JK,4) > 0.)) THEN + ZCOR(JI,JJ,JK)=MIN(-PRS(JI,JJ,JK,1),PRS(JI,JJ,JK,4)) + PRS(JI,JJ,JK,1) = PRS(JI,JJ,JK,1) + ZCOR(JI,JJ,JK) + PTHS(JI,JJ,JK) = PTHS(JI,JJ,JK) - ZCOR(JI,JJ,JK) * ZLS(JI,JJ,JK) / & + ZCPH(JI,JJ,JK) / ZEXN(JI,JJ,JK) + PRS(JI,JJ,JK,4) = PRS(JI,JJ,JK,4) -ZCOR(JI,JJ,JK) + END IF + END DO + END DO + END DO +!$acc end kernels +#else !$acc kernels present(PTHS,PRS) present(ZEXN,ZLV,ZLS,ZCPH,ZCOR) DO JK=1,SIZE(PZZ,3) DO JJ=1,SIZE(PZZ,2) @@ -740,6 +779,7 @@ CALL ABORT END DO END DO !$acc end kernels +#endif ! ! #endif