diff --git a/src/MNH/ice_adjust.f90 b/src/MNH/ice_adjust.f90 index a04f63482dbfb138285d57f56511e7cb0a86d111..bb3883104ec94435005515ef4e2b721845f85857 100644 --- a/src/MNH/ice_adjust.f90 +++ b/src/MNH/ice_adjust.f90 @@ -264,6 +264,9 @@ INTEGER :: JITER,ITERMAX ! iterative loop for first order adjustment ! LOGICAL :: LPRETREATMENT, LNEW_ADJUST ! +#ifdef _OPENACC +PRINT *,'OPENACC: ICE_ADJUST being implemented' +#endif !------------------------------------------------------------------------------- ! !* 1. PRELIMINARIES diff --git a/src/MNH/rain_ice.f90 b/src/MNH/rain_ice.f90 index e2f9fd9196b28fe58f31914d89fe0ffd29b6926d..65c766ea997b8a5f5272496df8928666e033212a 100644 --- a/src/MNH/rain_ice.f90 +++ b/src/MNH/rain_ice.f90 @@ -17,38 +17,38 @@ INTERFACE PDZZ, PRHODJ, PRHODREF, PEXNREF, PPABST, PCIT, PCLDFR,& PTHT, PRVT, PRCT, PRRT, PRIT, PRST, & PRGT, PTHS, PRVS, PRCS, PRRS, PRIS, PRSS, PRGS, & - PINPRC,PINPRR, PINPRR3D, PEVAP3D, & - PINPRS, PINPRG, PSIGS,PINDEP, & + PINPRC, PINPRR, PINPRR3D, PEVAP3D, & + PINPRS, PINPRG, PSIGS, PINDEP, & PSEA, PTOWN, & - PRHT, PRHS, PINPRH,OCONVHG ) + PRHT, PRHS, PINPRH, OCONVHG ) ! ! LOGICAL, INTENT(IN) :: OSEDIC ! Switch for droplet sedim. CHARACTER(LEN=4), INTENT(IN) :: HSEDIM ! Sedimentation scheme -CHARACTER(LEN=4), INTENT(IN) :: HSUBG_AUCV ! Switch for Subgrid autoconversion +CHARACTER(LEN=4), INTENT(IN) :: HSUBG_AUCV ! Kind of Subgrid autoconversion method LOGICAL, INTENT(IN) :: OWARM ! .TRUE. allows raindrops to ! form by warm processes ! (Kessler scheme) ! -INTEGER, INTENT(IN) :: KKA !near ground array index -INTEGER, INTENT(IN) :: KKU !uppest atmosphere array index -INTEGER, INTENT(IN) :: KKL !vert. levels type 1=MNH -1=ARO +INTEGER, INTENT(IN) :: KKA !near ground array index +INTEGER, INTENT(IN) :: KKU !uppest atmosphere array index +INTEGER, INTENT(IN) :: KKL !vert. levels type 1=MNH -1=ARO INTEGER, INTENT(IN) :: KSPLITR ! Number of small time step - ! integration for rain sedimendation + ! integration for rain sedimendation REAL, INTENT(IN) :: PTSTEP ! Double Time step ! (single if cold start) INTEGER, INTENT(IN) :: KMI ! Model index INTEGER, INTENT(IN) :: KRR ! Number of moist variable ! -REAL, DIMENSION(:,:,:), INTENT(IN) :: PDZZ ! Layer thikness (m) +REAL, DIMENSION(:,:,:), INTENT(IN) :: PDZZ ! Layer thikness (m) REAL, DIMENSION(:,:,:), INTENT(IN) :: PRHODJ ! Dry density * Jacobian REAL, DIMENSION(:,:,:), INTENT(IN) :: PRHODREF! Reference density REAL, DIMENSION(:,:,:), INTENT(IN) :: PEXNREF ! Reference Exner function REAL, DIMENSION(:,:,:), INTENT(IN) :: PPABST ! absolute pressure at t ! REAL, DIMENSION(:,:,:), INTENT(INOUT) :: PCIT ! Pristine ice n.c. at t -REAL, DIMENSION(:,:,:), INTENT(IN) :: PCLDFR ! Cloud fraction +REAL, DIMENSION(:,:,:), INTENT(IN) :: PCLDFR ! Convective Mass Flux Cloud fraction ! REAL, DIMENSION(:,:,:), INTENT(IN) :: PTHT ! Theta at time t REAL, DIMENSION(:,:,:), INTENT(IN) :: PRVT ! Water vapor m.r. at t @@ -57,7 +57,6 @@ REAL, DIMENSION(:,:,:), INTENT(IN) :: PRRT ! Rain water m.r. at t REAL, DIMENSION(:,:,:), INTENT(IN) :: PRIT ! Pristine ice m.r. at t REAL, DIMENSION(:,:,:), INTENT(IN) :: PRST ! Snow/aggregate m.r. at t REAL, DIMENSION(:,:,:), INTENT(IN) :: PRGT ! Graupel/hail m.r. at t -! REAL, DIMENSION(:,:,:), INTENT(IN) :: PSIGS ! Sigma_s at t ! REAL, DIMENSION(:,:,:), INTENT(INOUT) :: PTHS ! Theta source @@ -67,23 +66,22 @@ REAL, DIMENSION(:,:,:), INTENT(INOUT) :: PRRS ! Rain water m.r. source REAL, DIMENSION(:,:,:), INTENT(INOUT) :: PRIS ! Pristine ice m.r. source REAL, DIMENSION(:,:,:), INTENT(INOUT) :: PRSS ! Snow/aggregate m.r. source REAL, DIMENSION(:,:,:), INTENT(INOUT) :: PRGS ! Graupel m.r. source - ! -REAL, DIMENSION(:,:), INTENT(INOUT) :: PINPRC! Cloud instant precip -REAL, DIMENSION(:,:), INTENT(INOUT) :: PINDEP ! Cloud instant deposition -REAL, DIMENSION(:,:), INTENT(INOUT) :: PINPRR! Rain instant precip -REAL, DIMENSION(:,:,:), INTENT(INOUT) :: PINPRR3D! Rain inst precip 3D -REAL, DIMENSION(:,:,:), INTENT(INOUT) :: PEVAP3D! Rain evap profile -REAL, DIMENSION(:,:), INTENT(INOUT) :: PINPRS! Snow instant precip -REAL, DIMENSION(:,:), INTENT(INOUT) :: PINPRG! Graupel instant precip -REAL, DIMENSION(:,:),OPTIONAL,INTENT(IN) :: PSEA -REAL, DIMENSION(:,:),OPTIONAL,INTENT(IN) :: PTOWN -REAL, DIMENSION(:,:,:), OPTIONAL, INTENT(IN) :: PRHT ! Hail m.r. at t -REAL, DIMENSION(:,:,:), OPTIONAL, INTENT(INOUT) :: PRHS ! Hail m.r. source -REAL, DIMENSION(:,:), OPTIONAL, INTENT(INOUT) :: PINPRH! Hail instant precip -LOGICAL, OPTIONAL, INTENT(IN) :: OCONVHG! Switch for conversion from - ! hail to graupel - +! +REAL, DIMENSION(:,:), INTENT(INOUT) :: PINPRC ! Cloud instant precip +REAL, DIMENSION(:,:), INTENT(INOUT) :: PINDEP ! Cloud instant deposition +REAL, DIMENSION(:,:), INTENT(INOUT) :: PINPRR ! Rain instant precip +REAL, DIMENSION(:,:,:), INTENT(INOUT) :: PINPRR3D! Rain inst precip 3D +REAL, DIMENSION(:,:,:), INTENT(INOUT) :: PEVAP3D ! Rain evap profile +REAL, DIMENSION(:,:), INTENT(INOUT) :: PINPRS ! Snow instant precip +REAL, DIMENSION(:,:), INTENT(INOUT) :: PINPRG ! Graupel instant precip +! +REAL, DIMENSION(:,:), OPTIONAL, INTENT(IN) :: PSEA +REAL, DIMENSION(:,:), OPTIONAL, INTENT(IN) :: PTOWN +REAL, DIMENSION(:,:,:), OPTIONAL, INTENT(IN) :: PRHT ! Hail m.r. at t +REAL, DIMENSION(:,:,:), OPTIONAL, INTENT(INOUT) :: PRHS ! Hail m.r. source +REAL, DIMENSION(:,:), OPTIONAL, INTENT(INOUT) :: PINPRH ! Hail instant precip +LOGICAL, OPTIONAL, INTENT(IN) :: OCONVHG ! Switch for conversion from ! END SUBROUTINE RAIN_ICE END INTERFACE @@ -94,10 +92,10 @@ END MODULE MODI_RAIN_ICE PDZZ, PRHODJ, PRHODREF, PEXNREF, PPABST, PCIT, PCLDFR, & PTHT, PRVT, PRCT, PRRT, PRIT, PRST, & PRGT, PTHS, PRVS, PRCS, PRRS, PRIS, PRSS, PRGS, & - PINPRC, PINPRR, PINPRR3D, PEVAP3D, & - PINPRS, PINPRG, PSIGS,PINDEP, & + PINPRC, PINPRR, PINPRR3D, PEVAP3D, & + PINPRS, PINPRG, PSIGS, PINDEP, & PSEA, PTOWN, & - PRHT, PRHS, PINPRH,OCONVHG ) + PRHT, PRHS, PINPRH, OCONVHG ) ! ##################################################################### ! !!**** * - compute the explicit microphysical sources @@ -261,6 +259,10 @@ USE MODE_ll USE MODE_PACK_PGI #endif ! +#ifdef MNH_BITREP +USE MODI_BITREP +#endif +! IMPLICIT NONE ! !* 0.1 Declarations of dummy arguments : @@ -275,11 +277,11 @@ LOGICAL, INTENT(IN) :: OWARM ! .TRUE. allows raindrops to ! form by warm processes ! (Kessler scheme) ! -INTEGER, INTENT(IN) :: KKA !near ground array index -INTEGER, INTENT(IN) :: KKU !uppest atmosphere array index -INTEGER, INTENT(IN) :: KKL !vert. levels type 1=MNH -1=ARO +INTEGER, INTENT(IN) :: KKA !near ground array index +INTEGER, INTENT(IN) :: KKU !uppest atmosphere array index +INTEGER, INTENT(IN) :: KKL !vert. levels type 1=MNH -1=ARO INTEGER, INTENT(IN) :: KSPLITR ! Number of small time step - ! integration for rain sedimendation + ! integration for rain sedimendation REAL, INTENT(IN) :: PTSTEP ! Double Time step ! (single if cold start) INTEGER, INTENT(IN) :: KMI ! Model index @@ -292,7 +294,7 @@ REAL, DIMENSION(:,:,:), INTENT(IN) :: PEXNREF ! Reference Exner function REAL, DIMENSION(:,:,:), INTENT(IN) :: PPABST ! absolute pressure at t ! REAL, DIMENSION(:,:,:), INTENT(INOUT) :: PCIT ! Pristine ice n.c. at t -REAL, DIMENSION(:,:,:), INTENT(IN) :: PCLDFR! Convective Mass Flux Cloud fraction +REAL, DIMENSION(:,:,:), INTENT(IN) :: PCLDFR ! Convective Mass Flux Cloud fraction ! REAL, DIMENSION(:,:,:), INTENT(IN) :: PTHT ! Theta at time t REAL, DIMENSION(:,:,:), INTENT(IN) :: PRVT ! Water vapor m.r. at t @@ -312,20 +314,37 @@ REAL, DIMENSION(:,:,:), INTENT(INOUT) :: PRSS ! Snow/aggregate m.r. source REAL, DIMENSION(:,:,:), INTENT(INOUT) :: PRGS ! Graupel m.r. source ! ! -REAL, DIMENSION(:,:), INTENT(INOUT) :: PINPRC! Cloud instant precip -REAL, DIMENSION(:,:), INTENT(INOUT) :: PINDEP ! Cloud instant deposition -REAL, DIMENSION(:,:), INTENT(INOUT) :: PINPRR! Rain instant precip -REAL, DIMENSION(:,:,:), INTENT(INOUT) :: PINPRR3D! Rain inst precip 3D -REAL, DIMENSION(:,:,:), INTENT(INOUT) :: PEVAP3D! Rain evap profile -REAL, DIMENSION(:,:), INTENT(INOUT) :: PINPRS! Snow instant precip -REAL, DIMENSION(:,:), INTENT(INOUT) :: PINPRG! Graupel instant precip -REAL, DIMENSION(:,:),OPTIONAL,INTENT(IN) :: PSEA -REAL, DIMENSION(:,:),OPTIONAL,INTENT(IN) :: PTOWN -REAL, DIMENSION(:,:,:), OPTIONAL, INTENT(IN) :: PRHT ! Hail m.r. at t -REAL, DIMENSION(:,:,:), OPTIONAL, INTENT(INOUT) :: PRHS ! Hail m.r. source -REAL, DIMENSION(:,:), OPTIONAL, INTENT(INOUT) :: PINPRH! Hail instant precip -LOGICAL, OPTIONAL, INTENT(IN) :: OCONVHG! Switch for conversion from - ! hail to graupel +REAL, DIMENSION(:,:), INTENT(INOUT) :: PINPRC ! Cloud instant precip +REAL, DIMENSION(:,:), INTENT(INOUT) :: PINDEP ! Cloud instant deposition +REAL, DIMENSION(:,:), INTENT(INOUT) :: PINPRR ! Rain instant precip +REAL, DIMENSION(:,:,:), INTENT(INOUT) :: PINPRR3D! Rain inst precip 3D +REAL, DIMENSION(:,:,:), INTENT(INOUT) :: PEVAP3D ! Rain evap profile +REAL, DIMENSION(:,:), INTENT(INOUT) :: PINPRS ! Snow instant precip +REAL, DIMENSION(:,:), INTENT(INOUT) :: PINPRG ! Graupel instant precip +! +REAL, DIMENSION(:,:), OPTIONAL, INTENT(IN) :: PSEA +REAL, DIMENSION(:,:), OPTIONAL, INTENT(IN) :: PTOWN +REAL, DIMENSION(:,:,:), OPTIONAL, INTENT(IN) :: PRHT ! Hail m.r. at t +REAL, DIMENSION(:,:,:), OPTIONAL, INTENT(INOUT) :: PRHS ! Hail m.r. source +REAL, DIMENSION(:,:), OPTIONAL, INTENT(INOUT) :: PINPRH ! Hail instant precip +LOGICAL, OPTIONAL, INTENT(IN) :: OCONVHG ! Switch for conversion from + ! hail to graupel +! +! IN variables +! +!$acc declare present(PDZZ,PRHODJ,PRHODREF,PEXNREF,PPABST, & +!$acc & PCLDFR,PTHT,PRVT,PRCT,PRRT,PRIT,PRST,PRGT, & +!$acc & PSIGS) +! +! INOUT variables +! +!$acc declare present(PCIT,PTHS,PRVS,PRCS,PRRS,PRIS,PRSS,PRGS,& +!$acc & PINPRC,PINPRR,PINPRR3D,PEVAP3D,PINPRS,PINPRG,PINDEP) + +! +! OUT variables +! +!***NONE*** ! !* 0.2 Declarations of local variables : ! @@ -446,7 +465,21 @@ 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(GNEGT,GMICRO,& +!$acc & ZW,ZT, & +!$acc & ZZW) & +!$acc & device_resident(I1,I2,I3) ! +#ifdef _OPENACC +PRINT *,'OPENACC: RAIN_ICE being implemented' +#endif +#ifdef _OPENACC +IF ( KRR == 7 ) THEN + PRINT *,'OPENACC: RAIN_ICE: KRR=7 being implemented' + PRINT *,'OPENACC: RAIN_ICE: KRR=7 not yet tested' + CALL ABORT +END IF +#endif !------------------------------------------------------------------------------- ! !* 1. COMPUTE THE LOOP BOUNDS @@ -458,7 +491,6 @@ IKE=KKU-JPVEXT*KKL IKT=SIZE(PDZZ,3) IKTB=1+JPVEXT IKTE=IKT-JPVEXT - ! ! ZINVTSTEP=1./PTSTEP @@ -473,6 +505,7 @@ CALL RAIN_ICE_NUCLEATION ! optimization by looking for locations where ! the microphysical fields are larger than a minimal value only !!! ! +!$acc kernels present(GMICRO) GMICRO(:,:,:) = .FALSE. IF ( KRR == 7 ) THEN @@ -491,8 +524,15 @@ GMICRO(:,:,:) = .FALSE. PRST(IIB:IIE,IJB:IJE,IKTB:IKTE)>XRTMIN(5) .OR. & PRGT(IIB:IIE,IJB:IJE,IKTB:IKTE)>XRTMIN(6) END IF +!$acc end kernels +!$acc update self(GMICRO) +#ifndef _OPENACC IMICRO = COUNTJV( GMICRO(:,:,:),I1(:),I2(:),I3(:)) +#else +CALL COUNTJV_DEVICE(GMICRO(:,:,:),I1(:),I2(:),I3(:),IMICRO) +#endif + IF( IMICRO >= 0 ) THEN ALLOCATE(ZRVT(IMICRO)) ALLOCATE(ZRCT(IMICRO)) @@ -500,7 +540,7 @@ IF( IMICRO >= 0 ) THEN ALLOCATE(ZRIT(IMICRO)) ALLOCATE(ZRST(IMICRO)) ALLOCATE(ZRGT(IMICRO)) - IF ( KRR == 7 ) ALLOCATE(ZRHT(IMICRO)) + IF ( KRR == 7 ) ALLOCATE(ZRHT(IMICRO)) ALLOCATE(ZCIT(IMICRO)) ALLOCATE(ZRVS(IMICRO)) ALLOCATE(ZRCS(IMICRO)) @@ -508,7 +548,7 @@ IF( IMICRO >= 0 ) THEN ALLOCATE(ZRIS(IMICRO)) ALLOCATE(ZRSS(IMICRO)) ALLOCATE(ZRGS(IMICRO)) - IF ( KRR == 7 ) ALLOCATE(ZRHS(IMICRO)) + IF ( KRR == 7 ) ALLOCATE(ZRHS(IMICRO)) ALLOCATE(ZTHS(IMICRO)) ALLOCATE(ZRHODREF(IMICRO)) ALLOCATE(ZZT(IMICRO)) @@ -516,28 +556,47 @@ IF( IMICRO >= 0 ) THEN ALLOCATE(ZEXNREF(IMICRO)) ALLOCATE(ZSIGMA_RC(IMICRO)) ALLOCATE(ZCF(IMICRO)) - DO JL=1,IMICRO +! + ALLOCATE(ZZW(IMICRO)) + ALLOCATE(ZLSFACT(IMICRO)) + ALLOCATE(ZLVFACT(IMICRO)) +! + ALLOCATE(ZUSW(IMICRO)) + ALLOCATE(ZSSI(IMICRO)) +! + ALLOCATE(ZLBDAR(IMICRO)) + ALLOCATE(ZLBDAS(IMICRO)) + ALLOCATE(ZLBDAG(IMICRO)) + IF ( KRR == 7 ) ALLOCATE(ZLBDAH(IMICRO)) + ALLOCATE(ZRDRYG(IMICRO)) + ALLOCATE(ZRWETG(IMICRO)) + ALLOCATE(ZAI(IMICRO)) + ALLOCATE(ZCJ(IMICRO)) + ALLOCATE(ZKA(IMICRO)) + ALLOCATE(ZDV(IMICRO)) +! + IF ( KRR == 7 ) THEN + ALLOCATE(ZZW1(IMICRO,7)) + ELSE IF( KRR == 6 ) THEN + ALLOCATE(ZZW1(IMICRO,6)) + ENDIF +! +!$acc kernels + DO JL=1,IMICRO ZRVT(JL) = PRVT(I1(JL),I2(JL),I3(JL)) ZRCT(JL) = PRCT(I1(JL),I2(JL),I3(JL)) ZRRT(JL) = PRRT(I1(JL),I2(JL),I3(JL)) ZRIT(JL) = PRIT(I1(JL),I2(JL),I3(JL)) ZRST(JL) = PRST(I1(JL),I2(JL),I3(JL)) ZRGT(JL) = PRGT(I1(JL),I2(JL),I3(JL)) - IF ( KRR == 7 ) ZRHT(JL) = PRHT(I1(JL),I2(JL),I3(JL)) ZCIT(JL) = PCIT(I1(JL),I2(JL),I3(JL)) - IF ( HSUBG_AUCV == 'SIGM') THEN - ZSIGMA_RC(JL) = MAX(PSIGS(I1(JL),I2(JL),I3(JL)) * 2., 1.E-12) - ELSE IF ( HSUBG_AUCV == 'CLFR') THEN - ZCF(JL) = PCLDFR(I1(JL),I2(JL),I3(JL)) - END IF -! + ! ZRVS(JL) = PRVS(I1(JL),I2(JL),I3(JL)) ZRCS(JL) = PRCS(I1(JL),I2(JL),I3(JL)) ZRRS(JL) = PRRS(I1(JL),I2(JL),I3(JL)) ZRIS(JL) = PRIS(I1(JL),I2(JL),I3(JL)) ZRSS(JL) = PRSS(I1(JL),I2(JL),I3(JL)) ZRGS(JL) = PRGS(I1(JL),I2(JL),I3(JL)) - IF ( KRR == 7 ) ZRHS(JL) = PRHS(I1(JL),I2(JL),I3(JL)) ZTHS(JL) = PTHS(I1(JL),I2(JL),I3(JL)) ! ZRHODREF(JL) = PRHODREF(I1(JL),I2(JL),I3(JL)) @@ -545,35 +604,38 @@ IF( IMICRO >= 0 ) THEN ZPRES(JL) = PPABST(I1(JL),I2(JL),I3(JL)) ZEXNREF(JL) = PEXNREF(I1(JL),I2(JL),I3(JL)) ENDDO - ALLOCATE(ZZW(IMICRO)) - ALLOCATE(ZLSFACT(IMICRO)) - ALLOCATE(ZLVFACT(IMICRO)) - ZZW(:) = ZEXNREF(:)*( XCPD+XCPV*ZRVT(:)+XCL*(ZRCT(:)+ZRRT(:)) & - +XCI*(ZRIT(:)+ZRST(:)+ZRGT(:)) ) - ZLSFACT(:) = (XLSTT+(XCPV-XCI)*(ZZT(:)-XTT))/ZZW(:) ! L_s/(Pi_ref*C_ph) - ZLVFACT(:) = (XLVTT+(XCPV-XCL)*(ZZT(:)-XTT))/ZZW(:) ! L_v/(Pi_ref*C_ph) - ALLOCATE(ZUSW(IMICRO)) - ALLOCATE(ZSSI(IMICRO)) - ZZW(:) = EXP( XALPI - XBETAI/ZZT(:) - XGAMI*ALOG(ZZT(:) ) ) - ZSSI(:) = ZRVT(:)*( ZPRES(:)-ZZW(:) ) / ( (XMV/XMD) * ZZW(:) ) - 1.0 - ! Supersaturation over ice -! - ALLOCATE(ZLBDAR(IMICRO)) - ALLOCATE(ZLBDAS(IMICRO)) - ALLOCATE(ZLBDAG(IMICRO)) - IF ( KRR == 7 ) ALLOCATE(ZLBDAH(IMICRO)) - ALLOCATE(ZRDRYG(IMICRO)) - ALLOCATE(ZRWETG(IMICRO)) - ALLOCATE(ZAI(IMICRO)) - ALLOCATE(ZCJ(IMICRO)) - ALLOCATE(ZKA(IMICRO)) - ALLOCATE(ZDV(IMICRO)) + ! + IF (KRR == 7 ) THEN + DO JL=1,IMICRO + ZRHT(JL) = PRHT(I1(JL),I2(JL),I3(JL)) + ZRHS(JL) = PRHS(I1(JL),I2(JL),I3(JL)) + ENDDO + ENDIF +! + IF ( HSUBG_AUCV == 'SIGM') THEN + DO JL=1,IMICRO + ZSIGMA_RC(JL) = MAX(PSIGS(I1(JL),I2(JL),I3(JL)) * 2., 1.E-12) + END DO + ELSE IF ( HSUBG_AUCV == 'CLFR') THEN + DO JL=1,IMICRO + ZCF(JL) = PCLDFR(I1(JL),I2(JL),I3(JL)) + END DO + END IF ! - IF ( KRR == 7 ) THEN - ALLOCATE(ZZW1(IMICRO,7)) - ELSE IF( KRR == 6 ) THEN - ALLOCATE(ZZW1(IMICRO,6)) - ENDIF + ZZW(:) = ZEXNREF(:)*( XCPD+XCPV*ZRVT(:)+XCL*(ZRCT(:)+ZRRT(:)) & + +XCI*(ZRIT(:)+ZRST(:)+ZRGT(:)) ) + ZLSFACT(:) = (XLSTT+(XCPV-XCI)*(ZZT(:)-XTT))/ZZW(:) ! L_s/(Pi_ref*C_ph) + ZLVFACT(:) = (XLVTT+(XCPV-XCL)*(ZZT(:)-XTT))/ZZW(:) ! L_v/(Pi_ref*C_ph) + +!$acc end kernels +!$acc update self(ZZW) +!acc kernels + ZZW(:) = EXP( XALPI - XBETAI/ZZT(:) - XGAMI*ALOG(ZZT(:) ) ) +!$acc update device(ZZW) +!$acc kernels + ZSSI(:) = ZRVT(:)*( ZPRES(:)-ZZW(:) ) / ( (XMV/XMD) * ZZW(:) ) - 1.0 + ! Supersaturation over ice +!$acc end kernels ! IF (LBU_ENABLE .OR. LLES_CALL .OR. LCHECK) THEN ALLOCATE(ZRHODJ(IMICRO)) @@ -641,24 +703,33 @@ IF( IMICRO >= 0 ) THEN ! ZW(:,:,:) = PRVS(:,:,:) PRVS(:,:,:) = UNPACK( ZRVS(:),MASK=GMICRO(:,:,:),FIELD=ZW(:,:,:) ) +!$acc update device(PRVS) ZW(:,:,:) = PRCS(:,:,:) PRCS(:,:,:) = UNPACK( ZRCS(:),MASK=GMICRO(:,:,:),FIELD=ZW(:,:,:) ) +!$acc update device(PRCS) ZW(:,:,:) = PRRS(:,:,:) PRRS(:,:,:) = UNPACK( ZRRS(:),MASK=GMICRO(:,:,:),FIELD=ZW(:,:,:) ) +!$acc update device(PRRS) ZW(:,:,:) = PRIS(:,:,:) PRIS(:,:,:) = UNPACK( ZRIS(:),MASK=GMICRO(:,:,:),FIELD=ZW(:,:,:) ) +!$acc update device(PRIS) ZW(:,:,:) = PRSS(:,:,:) PRSS(:,:,:) = UNPACK( ZRSS(:),MASK=GMICRO(:,:,:),FIELD=ZW(:,:,:) ) +!$acc update device(PRSS) ZW(:,:,:) = PRGS(:,:,:) PRGS(:,:,:) = UNPACK( ZRGS(:),MASK=GMICRO(:,:,:),FIELD=ZW(:,:,:) ) +!$acc update device(PRGS) IF ( KRR == 7 ) THEN ZW(:,:,:) = PRHS(:,:,:) PRHS(:,:,:) = UNPACK( ZRHS(:),MASK=GMICRO(:,:,:),FIELD=ZW(:,:,:) ) +!$acc update device(PRHS) END IF ZW(:,:,:) = PTHS(:,:,:) PTHS(:,:,:) = UNPACK( ZTHS(:),MASK=GMICRO(:,:,:),FIELD=ZW(:,:,:) ) +!$acc update device(PTHS) ZW(:,:,:) = PCIT(:,:,:) PCIT(:,:,:) = UNPACK( ZCIT(:),MASK=GMICRO(:,:,:),FIELD=ZW(:,:,:) ) +!$acc update device(PCIT) ! ! ! @@ -668,7 +739,7 @@ IF( IMICRO >= 0 ) THEN DEALLOCATE(ZRDRYG) DEALLOCATE(ZRWETG) DEALLOCATE(ZLBDAG) - IF ( KRR == 7 ) DEALLOCATE(ZLBDAH) + IF ( KRR == 7 ) DEALLOCATE(ZLBDAH) DEALLOCATE(ZLBDAS) DEALLOCATE(ZLBDAR) DEALLOCATE(ZSSI) @@ -816,6 +887,8 @@ ELSE STOP END IF +!$acc update device(PINPRC,PINPRR,PINPRR3D,PEVAP3D,PINPRS,PINPRG,PINDEP) + ! ! !------------------------------------------------------------------------------- @@ -868,16 +941,29 @@ REAL, DIMENSION(SIZE(PRHODREF,1),SIZE(PRHODREF,2),SIZE(PRHODREF,3)) :: ZCONC3D ! ! ! O. Initialization of for sedimentation ! +!$acc kernels IF (OSEDIC) PINPRC (:,:) = 0. PINPRR (:,:) = 0. PINPRR3D (:,:,:) = 0. PINPRS (:,:) = 0. PINPRG (:,:) = 0. IF ( KRR == 7 ) PINPRH (:,:) = 0. +!$acc end kernels +IF (OSEDIC) THEN +!$acc update self(PINPRC) +ENDIF +!$acc update self(PINPRR,PINPRR3D,PINPRS,PINPRG) +IF ( KRR == 7 ) THEN +!$acc update self(PINPRH) +ENDIF ! !* 1. Parameters for cloud sedimentation ! IF (OSEDIC) THEN +#ifdef _OPENACC + PRINT *,'OPENACC: RAIN_ICE_SEDIMENTATION_SPLIT::OSDIC=.T. not yet implemented' + CALL ABORT +#endif ZRAY(:,:,:) = 0. ZLBC(:,:,:) = XLBC(1) ZFSEDC(:,:,:) = XFSEDC(1) @@ -907,6 +993,7 @@ IF ( KRR == 7 ) PINPRH (:,:) = 0. ! the precipitating fields are larger than a minimal value only !!! ! For optimization we consider each variable separately +!$acc kernels ZRTMIN(:) = XRTMIN(:) * ZINVTSTEP IF (OSEDIC) GSEDIMC(:,:,:) = .FALSE. GSEDIMR(:,:,:) = .FALSE. @@ -921,6 +1008,7 @@ ILENALLOCI = 0 ILENALLOCS = 0 ILENALLOCG = 0 IF ( KRR == 7 ) ILENALLOCH = 0 +!$acc end kernels ! ! ZPiS = Specie i source creating during the current time step ! PRiS = Source of the previous time step @@ -1766,42 +1854,56 @@ IMPLICIT NONE ! INTEGER , DIMENSION(SIZE(GNEGT)) :: I1,I2,I3 ! Used to replace the COUNT INTEGER :: JL ! and PACK intrinsics +REAL :: ZZWMAX +!$acc device_resident(I1,I2,I3) ! !------------------------------------------------------------------------------- ! ! ! compute the temperature and the pressure ! -ZT(:,:,:) = PTHT(:,:,:) * ( PPABST(:,:,:) / XP00 ) ** (XRD/XCPD) +!$acc kernels present(GNEGT,ZT) +#ifndef MNH_BITREP +ZT(:,:,:) = PTHT(:,:,:) * (PPABST(:,:,:)/XP00) ** (XRD/XCPD) +#else +ZT(:,:,:) = PTHT(:,:,:) * BR_POW(PPABST(:,:,:)/XP00,XRD/XCPD) +#endif ! ! optimization by looking for locations where ! the temperature is negative only !!! ! GNEGT(:,:,:) = .FALSE. GNEGT(IIB:IIE,IJB:IJE,IKTB:IKTE) = ZT(IIB:IIE,IJB:IJE,IKTB:IKTE)<XTT +!$acc end kernels +#ifndef _OPENACC INEGT = COUNTJV( GNEGT(:,:,:),I1(:),I2(:),I3(:)) +#else +CALL COUNTJV_DEVICE(GNEGT(:,:,:),I1(:),I2(:),I3(:),INEGT) +#endif + IF( INEGT >= 1 ) THEN ALLOCATE(ZRVT(INEGT)) ; ALLOCATE(ZCIT(INEGT)) ; ALLOCATE(ZZT(INEGT)) ; ALLOCATE(ZPRES(INEGT)); - DO JL=1,INEGT - ZRVT(JL) = PRVT(I1(JL),I2(JL),I3(JL)) - ZCIT(JL) = PCIT(I1(JL),I2(JL),I3(JL)) - ZZT(JL) = ZT(I1(JL),I2(JL),I3(JL)) - ZPRES(JL) = PPABST(I1(JL),I2(JL),I3(JL)) - ENDDO ALLOCATE(ZZW(INEGT)) ALLOCATE(ZUSW(INEGT)) ALLOCATE(ZSSI(INEGT)) - ZZW(:) = EXP( XALPI - XBETAI/ZZT(:) - XGAMI*ALOG(ZZT(:) ) ) ! es_i - ZZW(:) = MIN(ZPRES(:)/2., ZZW(:)) ! safety limitation - ZSSI(:) = ZRVT(:)*( ZPRES(:)-ZZW(:) ) / ( (XMV/XMD) * ZZW(:) ) - 1.0 - ! Supersaturation over ice - ZUSW(:) = EXP( XALPW - XBETAW/ZZT(:) - XGAMW*ALOG(ZZT(:) ) ) ! es_w - ZUSW(:) = MIN(ZPRES(:)/2.,ZUSW(:)) ! safety limitation - ZUSW(:) = ( ZUSW(:)/ZZW(:) )*( (ZPRES(:)-ZZW(:))/(ZPRES(:)-ZUSW(:)) ) - 1.0 - ! Supersaturation of saturated water vapor over ice +!$acc kernels + DO JL=1,INEGT + ZRVT(JL) = PRVT (I1(JL),I2(JL),I3(JL)) + ZCIT(JL) = PCIT (I1(JL),I2(JL),I3(JL)) + ZZT(JL) = ZT (I1(JL),I2(JL),I3(JL)) + ZPRES(JL) = PPABST(I1(JL),I2(JL),I3(JL)) + ENDDO + ZZW(:) = EXP( XALPI - XBETAI/ZZT(:) - XGAMI*ALOG(ZZT(:) ) ) ! es_i + ZZW(:) = MIN(ZPRES(:)/2., ZZW(:)) ! safety limitation + ZSSI(:) = ZRVT(:)*( ZPRES(:)-ZZW(:) ) / ( (XMV/XMD) * ZZW(:) ) - 1.0 + ! Supersaturation over ice + ZUSW(:) = EXP( XALPW - XBETAW/ZZT(:) - XGAMW*ALOG(ZZT(:) ) ) ! es_w + ZUSW(:) = MIN(ZPRES(:)/2.,ZUSW(:)) ! safety limitation + ZUSW(:) = ( ZUSW(:)/ZZW(:) )*( (ZPRES(:)-ZZW(:))/(ZPRES(:)-ZUSW(:)) ) - 1.0 + ! Supersaturation of saturated water vapor over ice ! !* 3.1 compute the heterogeneous nucleation source: RVHENI ! @@ -1817,28 +1919,49 @@ IF( INEGT >= 1 ) THEN ( ZSSI(:)/ZUSW(:) )**XALPHA1 ) END WHERE ZZW(:) = ZZW(:) - ZCIT(:) - IF( MAXVAL(ZZW(:)) > 0.0 ) THEN + ZZWMAX = MAXVAL(ZZW(:)) +!$acc end kernels + IF( ZZWMAX > 0.0 ) THEN ! !* 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 +!$acc end kernels +#ifndef _OPENACC ZW(:,:,:) = UNPACK( ZZW(:),MASK=GNEGT(:,:,:),FIELD=0.0 ) +#else + CALL UNPACK_DEVICE (ZZW,GNEGT,0.0,ZW) +#endif +!$acc kernels ZW(:,:,:) = MAX( ZW(:,:,:) ,0.0 ) *XMNU0/(PRHODREF(:,:,:)*PTSTEP) PRIS(:,:,:) = PRIS(:,:,:) + ZW(:,:,:) PRVS(:,:,:) = PRVS(:,:,:) - ZW(:,:,:) IF ( KRR == 7 ) THEN - PTHS(:,:,:) = PTHS(:,:,:) + ZW(:,:,:)*(XLSTT+(XCPV-XCI)*(ZT(:,:,:)-XTT)) & - /( (XCPD + XCPV*PRVT(:,:,:) + XCL*(PRCT(:,:,:)+PRRT(:,:,:)) & + PTHS(:,:,:) = PTHS(:,:,:) + ZW(:,:,:)*(XLSTT+(XCPV-XCI)*(ZT(:,:,:)-XTT)) & + /( (XCPD + XCPV*PRVT(:,:,:) + XCL*(PRCT(:,:,:)+PRRT(:,:,:)) & + XCI*(PRIT(:,:,:)+PRST(:,:,:)+PRGT(:,:,:)+PRHT(:,:,:)))*PEXNREF(:,:,:) ) - ELSE IF( KRR == 6 ) THEN - PTHS(:,:,:) = PTHS(:,:,:) + ZW(:,:,:)*(XLSTT+(XCPV-XCI)*(ZT(:,:,:)-XTT)) & - /( (XCPD + XCPV*PRVT(:,:,:) + XCL*(PRCT(:,:,:)+PRRT(:,:,:)) & + ELSE IF( KRR == 6 ) THEN + PTHS(:,:,:) = PTHS(:,:,:) + ZW(:,:,:)*(XLSTT+(XCPV-XCI)*(ZT(:,:,:)-XTT)) & + /( (XCPD + XCPV*PRVT(:,:,:) + XCL*(PRCT(:,:,:)+PRRT(:,:,:)) & + XCI*(PRIT(:,:,:)+PRST(:,:,:)+PRGT(:,:,:)))*PEXNREF(:,:,:) ) END IF ! f(L_s*(RVHENI)) ZZW(:) = MAX( ZZW(:)+ZCIT(:),ZCIT(:) ) +!$acc end kernels +!acc update self(GNEGT) +!acc update self(ZZW) +#ifndef _OPENACC PCIT(:,:,:) = MAX( UNPACK( ZZW(:),MASK=GNEGT(:,:,:),FIELD=0.0 ) , & PCIT(:,:,:) ) +#else + CALL UNPACK_DEVICE(ZZW,GNEGT,0.0,ZW) +!$acc kernels + PCIT(:,:,:) = MAX( ZW(:,:,:), PCIT(:,:,:) ) +!$acc end kernels +#endif +!$acc update self(PRIS,PRVS,PTHS) +!$acc update self(PCIT) END IF DEALLOCATE(ZSSI) DEALLOCATE(ZUSW) @@ -1867,19 +1990,26 @@ IF (LBUDGET_RI) CALL BUDGET (PRIS(:,:,:)*PRHODJ(:,:,:),9,'HENU_BU_RRI') ! IMPLICIT NONE ! +LOGICAL,DIMENSION(:),ALLOCATABLE :: GWORK +!$acc declare create(GWORK) !------------------------------------------------------------------------------- ! ! !* 3.2 compute the homogeneous nucleation source: RCHONI ! + ALLOCATE(GWORK(IMICRO)) +! +!$acc kernels ZZW(:) = 0.0 - WHERE( (ZZT(:)<XTT-35.0) .AND. (ZRCT(:)>XRTMIN(2)) .AND. (ZRCS(:)>0.) ) + GWORK =(ZZT(:)<XTT-35.0) .AND. (ZRCT(:)>XRTMIN(2)) .AND. (ZRCS(:)>0.) + WHERE (GWORK) ZZW(:) = MIN( ZRCS(:),XHON*ZRHODREF(:)*ZRCT(:) & *EXP( XALPHA3*(ZZT(:)-XTT)-XBETA3 ) ) ZRIS(:) = ZRIS(:) + ZZW(:) ZRCS(:) = ZRCS(:) - ZZW(:) ZTHS(:) = ZTHS(:) + ZZW(:)*(ZLSFACT(:)-ZLVFACT(:)) ! f(L_f*(RCHONI)) ENDWHERE +!$acc end kernels ! IF (LBUDGET_TH) CALL BUDGET ( & UNPACK(ZTHS(:),MASK=GMICRO(:,:,:),FIELD=PTHS)*PRHODJ(:,:,:), & @@ -1893,13 +2023,16 @@ IMPLICIT NONE ! !* 3.3 compute the spontaneous freezing source: RRHONG ! +!$acc kernels ZZW(:) = 0.0 - WHERE( (ZZT(:)<XTT-35.0) .AND. (ZRRT(:)>XRTMIN(3)) .AND. (ZRRS(:)>0.) ) + GWORK = (ZZT(:)<XTT-35.0) .AND. (ZRRT(:)>XRTMIN(3)) .AND. (ZRRS(:)>0.) + WHERE (GWORK) ZZW(:) = MIN( ZRRS(:),ZRRT(:)* ZINVTSTEP ) ZRGS(:) = ZRGS(:) + ZZW(:) ZRRS(:) = ZRRS(:) - ZZW(:) ZTHS(:) = ZTHS(:) + ZZW(:)*(ZLSFACT(:)-ZLVFACT(:)) ! f(L_f*(RRHONG)) ENDWHERE +!$acc end kernels ! IF (LBUDGET_TH) CALL BUDGET ( & UNPACK(ZTHS(:),MASK=GMICRO(:,:,:),FIELD=PTHS)*PRHODJ(:,:,:), & @@ -1913,8 +2046,10 @@ IMPLICIT NONE ! !* 3.4 compute the deposition, aggregation and autoconversion sources ! +!acc kernels ZKA(:) = 2.38E-2 + 0.0071E-2 * ( ZZT(:) - XTT ) ! k_a ZDV(:) = 0.211E-4 * (ZZT(:)/XTT)**1.94 * (XP00/ZPRES(:)) ! D_v +!acc end kernels ! !* 3.4.1 compute the thermodynamical function A_i(T,P) !* and the c^prime_j (in the ventilation factor) @@ -2024,6 +2159,8 @@ IMPLICIT NONE IF (LBUDGET_RG) CALL BUDGET ( & UNPACK(ZRGS(:)*ZRHODJ(:),MASK=GMICRO(:,:,:),FIELD=0.0), & 11,'DEPG_BU_RRG') +! + DEALLOCATE(GWORK) ! END SUBROUTINE RAIN_ICE_SLOW ! @@ -3130,6 +3267,50 @@ DO JK = 1,SIZE(LTAB,3) END DO ! END FUNCTION COUNTJV +! +!------------------------------------------------------------------------------- +! +#ifdef _OPENACC + SUBROUTINE COUNTJV_DEVICE(LTAB,I1,I2,I3,IC) +! +!* 0. DECLARATIONS +! ------------ +! +IMPLICIT NONE +! +!* 0.2 declaration of local variables +! +! +LOGICAL, DIMENSION(:,:,:), INTENT(IN) :: LTAB ! Mask +INTEGER, DIMENSION(:), INTENT(OUT) :: I1,I2,I3 ! Used to replace the COUNT and PACK +INTEGER, INTENT(OUT) :: IC ! Count +!$acc declare present(LTAB,I1,I2,I3) +! +INTEGER :: JI,JJ,JK,IC +! +!------------------------------------------------------------------------------- +! +!$acc kernels +IC = 0 +DO JK = 1,SIZE(LTAB,3) + DO JJ = 1,SIZE(LTAB,2) + DO JI = 1,SIZE(LTAB,1) + IF( LTAB(JI,JJ,JK) ) THEN + IC = IC +1 + I1(IC) = JI + I2(IC) = JJ + I3(IC) = JK + END IF + END DO + END DO +END DO +!$acc end kernels +! +END SUBROUTINE COUNTJV_DEVICE +#endif +! +!------------------------------------------------------------------------------- +! FUNCTION COUNTJV2(LTAB,I1,I2) RESULT(IC) ! !* 0. DECLARATIONS @@ -3161,4 +3342,59 @@ END FUNCTION COUNTJV2 ! !------------------------------------------------------------------------------- ! +SUBROUTINE UNPACK_DEVICE (PVEC,OMASK,PFIELD,PMAT) +! +IMPLICIT NONE +! +REAL,DIMENSION(:), INTENT(IN) :: PVEC +LOGICAL,DIMENSION(:,:,:),INTENT(IN) :: OMASK +REAL, INTENT(IN) :: PFIELD +REAL,DIMENSION(:,:,:), INTENT(OUT) :: PMAT +!$acc declare present(PVEC,OMASK,PMAT) +! +INTEGER :: IDX, JI, JJ, JK +INTEGER :: JIMAX, JJMAX, JKMAX +! +!PW: TODO: opti: store idx in mask array (logical->integer) +! +IF ( SIZE(OMASK,1)/=SIZE(PMAT,1) .OR. SIZE(OMASK,2)/=SIZE(PMAT,2) .OR. SIZE(OMASK,3)/=SIZE(PMAT,3) ) THEN + PRINT *,'FATAL: UNPACK_DEVICE: arrays are not conformant' + CALL ABORT +END IF +! +IDX = 1 +JIMAX = SIZE(PMAT,1) +JJMAX = SIZE(PMAT,2) +JKMAX = SIZE(PMAT,3) +! +!$acc update self(OMASK,PVEC) +!acc kernels +DO JK = 1,JKMAX + DO JJ = 1,JJMAX + DO JI = 1,JIMAX + IF (OMASK(JI,JJ,JK)) THEN + PMAT(JI,JJ,JK) = PVEC(IDX) + IDX = IDX + 1 + ELSE + PMAT(JI,JJ,JK) = PFIELD + END IF + END DO + END DO +END DO +!acc end kernels +!$acc update device(PMAT) +! +IF (IDX-1 > SIZE(PVEC)) THEN + PRINT *,'FATAL: UNPACK_DEVICE: PVEC is too small' + CALL ABORT +ELSE IF (IDX-1 < SIZE(PVEC)) THEN + PRINT *,'WARNING: UNPACK_DEVICE: some elements of PVEC were not used (',IDX-1,'/',SIZE(PVEC),')' +!ELSE +! PRINT *,'INFO: UNPACK_DEVICE: used all elements of PVEC (',IDX-1,'/',SIZE(PVEC),')' +END IF +! +END SUBROUTINE UNPACK_DEVICE +! +!------------------------------------------------------------------------------- +! END SUBROUTINE RAIN_ICE diff --git a/src/MNH/resolved_cloud.f90 b/src/MNH/resolved_cloud.f90 index e8e2f2bdc9a3c6207c43cad5d986e7023e3c35da..9cc98fed55de2826f7aeca4de449a3034d1ccf6e 100644 --- a/src/MNH/resolved_cloud.f90 +++ b/src/MNH/resolved_cloud.f90 @@ -68,23 +68,23 @@ REAL, DIMENSION(:,:,:), INTENT(IN) :: PSIGS ! Sigma_s at time t REAL, INTENT(IN) :: PSIGQSAT! coeff applied to qsat variance contribution REAL, DIMENSION(:,:,:), INTENT(IN) :: PMFCONV ! convective mass flux REAL, DIMENSION(:,:,:), INTENT(IN) :: PTHM ! Theta at time t-Dt -REAL, DIMENSION(:,:,:), INTENT(IN) :: PPABSM ! Pressure time t-Dt +REAL, DIMENSION(:,:,:), INTENT(IN) :: PPABSM ! Pressure time t-Dt REAL, DIMENSION(:,:,:), INTENT(IN) :: PRCM ! Cloud water m.r. at time t-Dt ! ! REAL, DIMENSION(:,:,:), INTENT(IN) :: PW_ACT ! W for CCN activation -REAL, DIMENSION(:,:,:), INTENT(IN) :: PDTHRAD ! THeta RADiative Tendancy -REAL, DIMENSION(:,:,:), INTENT(INOUT) :: PTHS ! Theta source -REAL, DIMENSION(:,:,:,:), INTENT(INOUT) :: PRS ! Moist variable sources -REAL, DIMENSION(:,:,:,:), INTENT(INOUT) :: PSVT ! Scalar variable at time t -REAL, DIMENSION(:,:,:,:), INTENT(INOUT) :: PSVS ! Scalar variable sources +REAL, DIMENSION(:,:,:), INTENT(IN) :: PDTHRAD! THeta RADiative Tendancy +REAL, DIMENSION(:,:,:), INTENT(INOUT) :: PTHS ! Theta source +REAL, DIMENSION(:,:,:,:), INTENT(INOUT) :: PRS ! Moist variable sources +REAL, DIMENSION(:,:,:,:), INTENT(INOUT) :: PSVT ! Scalar variable at time t +REAL, DIMENSION(:,:,:,:), INTENT(INOUT) :: PSVS ! Scalar variable sources ! ! REAL, DIMENSION(:,:,:), INTENT(OUT) :: PSRCS ! Second-order flux ! s'rc'/2Sigma_s2 at time t+1 ! multiplied by Lambda_3 -REAL, DIMENSION(:,:,:), INTENT(INOUT) :: PCLDFR! Cloud fraction -REAL, DIMENSION(:,:,:), INTENT(INOUT) :: PCIT ! Pristine ice number +REAL, DIMENSION(:,:,:), INTENT(INOUT) :: PCLDFR! Cloud fraction +REAL, DIMENSION(:,:,:), INTENT(INOUT) :: PCIT ! Pristine ice number ! concentration at time t LOGICAL, INTENT(IN) :: OSEDIC! Switch to activate the ! cloud droplet sedimentation @@ -106,26 +106,27 @@ LOGICAL, INTENT(IN) :: OHHONI! enable haze freezing LOGICAL, INTENT(IN) :: OCONVHG! Switch for conversion from ! hail to graupel ! -REAL, DIMENSION(:,:,:), INTENT(IN) :: PCF_MF! Convective Mass Flux Cloud fraction -REAL, DIMENSION(:,:,:), INTENT(IN) :: PRC_MF! Convective Mass Flux liquid mixing ratio -REAL, DIMENSION(:,:,:), INTENT(IN) :: PRI_MF! Convective Mass Flux solid mixing ratio -! -REAL, DIMENSION(:,:), INTENT(INOUT) :: PINPRC! Cloud instant precip -REAL, DIMENSION(:,:), INTENT(INOUT) :: PINPRR! Rain instant precip -REAL, DIMENSION(:,:,:), INTENT(INOUT) :: PINPRR3D ! sed flux of precip -REAL, DIMENSION(:,:,:), INTENT(INOUT) :: PEVAP3D ! evap profile -REAL, DIMENSION(:,:), INTENT(INOUT) :: PINPRS! Snow instant precip -REAL, DIMENSION(:,:), INTENT(INOUT) :: PINPRG! Graupel instant precip -REAL, DIMENSION(:,:), INTENT(INOUT) :: PINPRH! Hail instant precip -REAL, DIMENSION(:,:,:,:), INTENT(IN) :: PSOLORG ![%] solubility fraction of soa -REAL, DIMENSION(:,:,:,:), INTENT(IN) :: PMI ! -REAL, DIMENSION(:,:), INTENT(INOUT) :: PINDEP! Cloud instant deposition +REAL, DIMENSION(:,:,:), INTENT(IN) :: PCF_MF! Convective Mass Flux Cloud fraction +REAL, DIMENSION(:,:,:), INTENT(IN) :: PRC_MF! Convective Mass Flux liquid mixing ratio +REAL, DIMENSION(:,:,:), INTENT(IN) :: PRI_MF! Convective Mass Flux solid mixing ratio +! +REAL, DIMENSION(:,:), INTENT(INOUT) :: PINPRC ! Cloud instant precip +REAL, DIMENSION(:,:), INTENT(INOUT) :: PINPRR ! Rain instant precip +REAL, DIMENSION(:,:,:), INTENT(INOUT) :: PINPRR3D ! sed flux of precip +REAL, DIMENSION(:,:,:), INTENT(INOUT) :: PEVAP3D ! evap profile +REAL, DIMENSION(:,:), INTENT(INOUT) :: PINPRS ! Snow instant precip +REAL, DIMENSION(:,:), INTENT(INOUT) :: PINPRG ! Graupel instant precip +REAL, DIMENSION(:,:), INTENT(INOUT) :: PINPRH ! Hail instant precip +REAL, DIMENSION(:,:,:,:), INTENT(IN) :: PSOLORG ![%] solubility fraction of soa +REAL, DIMENSION(:,:,:,:), INTENT(IN) :: PMI +REAL, DIMENSION(:,:), INTENT(INOUT) :: PINDEP ! Cloud instant deposition REAL, DIMENSION(:,:,:), INTENT(INOUT) :: PSUPSAT !sursat -REAL, DIMENSION(:,:,:), INTENT(INOUT) :: PNACT !concentrtaion d'aérosols activés au temps t -REAL, DIMENSION(:,:,:), INTENT(INOUT) :: PNPRO !concentrtaion d'aérosols activés au temps t +REAL, DIMENSION(:,:,:), INTENT(INOUT) :: PNACT !concentrtaion d'aérosols activés au temps t +REAL, DIMENSION(:,:,:), INTENT(INOUT) :: PNPRO !concentrtaion d'aérosols activés au temps t REAL, DIMENSION(:,:,:), INTENT(INOUT) :: PSSPRO !sursat -REAL, DIMENSION(:,:), OPTIONAL, INTENT(IN) :: PSEA ! Land Sea mask -REAL, DIMENSION(:,:), OPTIONAL, INTENT(IN) :: PTOWN ! Town fraction +! +REAL, DIMENSION(:,:), OPTIONAL, INTENT(IN) :: PSEA ! Land Sea mask +REAL, DIMENSION(:,:), OPTIONAL, INTENT(IN) :: PTOWN ! Town fraction ! END SUBROUTINE RESOLVED_CLOUD END INTERFACE @@ -292,6 +293,10 @@ USE MODI_LIMA_COLD USE MODI_LIMA_MIXED USE MODI_LIMA_ADJUST ! +#ifdef MNH_BITREP +USE MODI_BITREP +#endif +! IMPLICIT NONE ! !* 0.1 Declarations of dummy arguments : @@ -299,8 +304,8 @@ IMPLICIT NONE ! ! CHARACTER(LEN=4), INTENT(IN) :: HCLOUD ! kind of cloud +CHARACTER(LEN=4), INTENT(IN) :: HACTCCN ! kind of CCN activation scheme ! paramerization -CHARACTER(LEN=4), INTENT(IN) :: HACTCCN ! kind of CCN activation CHARACTER(LEN=4), INTENT(IN) :: HSCONV ! Shallow convection scheme CHARACTER(LEN=4), INTENT(IN) :: HMF_CLOUD! Type of statistical cloud INTEGER, INTENT(IN) :: KRR ! Number of moist variables @@ -341,23 +346,23 @@ REAL, DIMENSION(:,:,:), INTENT(IN) :: PSIGS ! Sigma_s at time t REAL, INTENT(IN) :: PSIGQSAT! coeff applied to qsat variance contribution REAL, DIMENSION(:,:,:), INTENT(IN) :: PMFCONV ! convective mass flux REAL, DIMENSION(:,:,:), INTENT(IN) :: PTHM ! Theta at time t-Dt -REAL, DIMENSION(:,:,:), INTENT(IN) :: PPABSM ! Pressure time t-Dt +REAL, DIMENSION(:,:,:), INTENT(IN) :: PPABSM ! Pressure time t-Dt REAL, DIMENSION(:,:,:), INTENT(IN) :: PRCM ! Cloud water m.r. at time t-Dt ! ! REAL, DIMENSION(:,:,:), INTENT(IN) :: PW_ACT ! W for CCN activation -REAL, DIMENSION(:,:,:), INTENT(IN) :: PDTHRAD ! THeta RADiative Tendancy -REAL, DIMENSION(:,:,:), INTENT(INOUT) :: PTHS ! Theta source -REAL, DIMENSION(:,:,:,:), INTENT(INOUT) :: PRS ! Moist variable sources -REAL, DIMENSION(:,:,:,:), INTENT(INOUT) :: PSVT ! Scalar variable at time t -REAL, DIMENSION(:,:,:,:), INTENT(INOUT) :: PSVS ! Scalar variable sources +REAL, DIMENSION(:,:,:), INTENT(IN) :: PDTHRAD! THeta RADiative Tendancy +REAL, DIMENSION(:,:,:), INTENT(INOUT) :: PTHS ! Theta source +REAL, DIMENSION(:,:,:,:), INTENT(INOUT) :: PRS ! Moist variable sources +REAL, DIMENSION(:,:,:,:), INTENT(INOUT) :: PSVT ! Scalar variable at time t +REAL, DIMENSION(:,:,:,:), INTENT(INOUT) :: PSVS ! Scalar variable sources ! ! REAL, DIMENSION(:,:,:), INTENT(OUT) :: PSRCS ! Second-order flux ! s'rc'/2Sigma_s2 at time t+1 ! multiplied by Lambda_3 -REAL, DIMENSION(:,:,:), INTENT(INOUT) :: PCLDFR! Cloud fraction -REAL, DIMENSION(:,:,:), INTENT(INOUT) :: PCIT ! Pristine ice number +REAL, DIMENSION(:,:,:), INTENT(INOUT) :: PCLDFR! Cloud fraction +REAL, DIMENSION(:,:,:), INTENT(INOUT) :: PCIT ! Pristine ice number ! concentration at time t LOGICAL, INTENT(IN) :: OSEDIC! Switch to activate the ! cloud droplet sedimentation @@ -367,6 +372,7 @@ LOGICAL, INTENT(IN) :: OACTIT ! Switch to activate the ! evolution in C2R2 and KHKO LOGICAL, INTENT(IN) :: OSEDC ! Switch to activate the ! cloud droplet sedimentation + ! for C2R2 or KHKO LOGICAL, INTENT(IN) :: OSEDI ! Switch to activate the ! cloud crystal sedimentation LOGICAL, INTENT(IN) :: ORAIN ! Switch to activate the @@ -378,26 +384,46 @@ LOGICAL, INTENT(IN) :: OHHONI! enable haze freezing LOGICAL, INTENT(IN) :: OCONVHG! Switch for conversion from ! hail to graupel ! -REAL, DIMENSION(:,:,:), INTENT(IN) :: PCF_MF! Convective Mass Flux Cloud fraction -REAL, DIMENSION(:,:,:), INTENT(IN) :: PRC_MF! Convective Mass Flux liquid mixing ratio -REAL, DIMENSION(:,:,:), INTENT(IN) :: PRI_MF! Convective Mass Flux solid mixing ratio -! -REAL, DIMENSION(:,:), INTENT(INOUT) :: PINPRC! Cloud instant precip -REAL, DIMENSION(:,:), INTENT(INOUT) :: PINPRR! Rain instant precip -REAL, DIMENSION(:,:,:), INTENT(INOUT) :: PINPRR3D ! sed flux of precip -REAL, DIMENSION(:,:,:), INTENT(INOUT) :: PEVAP3D ! evap profile -REAL, DIMENSION(:,:), INTENT(INOUT) :: PINPRS! Snow instant precip -REAL, DIMENSION(:,:), INTENT(INOUT) :: PINPRG! Graupel instant precip -REAL, DIMENSION(:,:), INTENT(INOUT) :: PINPRH! Hail instant precip -REAL, DIMENSION(:,:,:,:), INTENT(IN) :: PSOLORG ![%] solubility fraction of soa -REAL, DIMENSION(:,:,:,:), INTENT(IN) :: PMI ! -REAL, DIMENSION(:,:), INTENT(INOUT) :: PINDEP! Cloud instant deposition +REAL, DIMENSION(:,:,:), INTENT(IN) :: PCF_MF! Convective Mass Flux Cloud fraction +REAL, DIMENSION(:,:,:), INTENT(IN) :: PRC_MF! Convective Mass Flux liquid mixing ratio +REAL, DIMENSION(:,:,:), INTENT(IN) :: PRI_MF! Convective Mass Flux solid mixing ratio +! +REAL, DIMENSION(:,:), INTENT(INOUT) :: PINPRC ! Cloud instant precip +REAL, DIMENSION(:,:), INTENT(INOUT) :: PINPRR ! Rain instant precip +REAL, DIMENSION(:,:,:), INTENT(INOUT) :: PINPRR3D ! sed flux of precip +REAL, DIMENSION(:,:,:), INTENT(INOUT) :: PEVAP3D ! evap profile +REAL, DIMENSION(:,:), INTENT(INOUT) :: PINPRS ! Snow instant precip +REAL, DIMENSION(:,:), INTENT(INOUT) :: PINPRG ! Graupel instant precip +REAL, DIMENSION(:,:), INTENT(INOUT) :: PINPRH ! Hail instant precip +REAL, DIMENSION(:,:,:,:), INTENT(IN) :: PSOLORG ![%] solubility fraction of soa +REAL, DIMENSION(:,:,:,:), INTENT(IN) :: PMI +REAL, DIMENSION(:,:), INTENT(INOUT) :: PINDEP ! Cloud instant deposition REAL, DIMENSION(:,:,:), INTENT(INOUT) :: PSUPSAT !sursat -REAL, DIMENSION(:,:,:), INTENT(INOUT) :: PNACT !concentrtaion d'aérosols activés au temps t -REAL, DIMENSION(:,:,:), INTENT(INOUT) :: PNPRO !concentrtaion d'aérosols activés au temps t +REAL, DIMENSION(:,:,:), INTENT(INOUT) :: PNACT !concentrtaion d'aérosols activés au temps t +REAL, DIMENSION(:,:,:), INTENT(INOUT) :: PNPRO !concentrtaion d'aérosols activés au temps t REAL, DIMENSION(:,:,:), INTENT(INOUT) :: PSSPRO !sursat -REAL, DIMENSION(:,:), OPTIONAL, INTENT(IN) :: PSEA ! Land Sea mask -REAL, DIMENSION(:,:), OPTIONAL, INTENT(IN) :: PTOWN ! Town fraction +! +REAL, DIMENSION(:,:), OPTIONAL, INTENT(IN) :: PSEA ! Land Sea mask +REAL, DIMENSION(:,:), OPTIONAL, INTENT(IN) :: PTOWN ! Town fraction +! +!PW: TODO: copyin variables only if used (depending on HCLOUD) +! +! IN variables +! +!$acc declare present(PRHODJ) & +!$acc & copyin(PZZ,PRHODREF,PEXNREF,PPABST,PTHT,PSIGS,PSIGQSAT,PMFCONV,PTHM,PPABSM,PRCM,PW_ACT,PDTHRAD,& +!$acc & PCF_MF,PRC_MF,PRI_MF) +!In acc data: PSOLORG,PMI,PSEA,PTOWN +! +! INOUT variables +! +!$acc declare create(PTHS,PRT,PRS,PSVT,PSVS,PCLDFR,PCIT,& +!$acc & PINPRC,PINPRR,PINPRR3D,PEVAP3D,PINPRS,PINPRG,PINPRH,PINDEP,& +!$acc & PSUPSAT,PNACT,PNPRO,PSSPRO) +! +! OUT variables +! +!$acc declare create(PSRCS) ! ! !* 0.2 Declarations of local variables : @@ -411,8 +437,7 @@ INTEGER :: IKB ! INTEGER :: IKE ! INTEGER :: IKU INTEGER :: IINFO_ll ! return code of parallel routine -INTEGER :: JK,JI,JL -INTEGER :: I, J, K +INTEGER :: JI,JJ,JK,JL ! ! ! @@ -434,6 +459,8 @@ REAL, DIMENSION(:,:,:,:), ALLOCATABLE :: ZSVT ! scalar variable for microphysi REAL, DIMENSION(:,:,:,:), ALLOCATABLE :: ZSVS ! scalar tendency for microphysics only ! INTEGER :: JMOD, JMOD_IFN +LOGICAL :: GWEST,GEAST,GNORTH,GSOUTH +!$acc declare create(ZDZZ,ZEXN,ZLV,ZLS,ZCPH,ZSVT,ZSVS) create(ZT) device_resident(ZCOR) ! !------------------------------------------------------------------------------ ! @@ -445,6 +472,11 @@ IKB=1+JPVEXT IKE=SIZE(PZZ,3) - JPVEXT IKU=SIZE(PZZ,3) ! +GWEST = LWEST_ll() +GEAST = LEAST_ll() +GSOUTH = LSOUTH_ll() +GNORTH = LNORTH_ll() +! IF (HCLOUD == 'C2R2' .OR. HCLOUD == 'KHKO') THEN ISVBEG = NSV_C2R2BEG ISVEND = NSV_C2R2END @@ -469,6 +501,8 @@ END IF !* 2. TRANSFORMATION INTO PHYSICAL TENDENCIES ! --------------------------------------- ! +!$acc update device(PTHS,PRT,PRS,PRHODJ) +!$acc kernels present(PTHS,PRS,PRHODJ,PPABST,ZEXN,ZLV,ZLS,ZCPH,ZSVS) PTHS(:,:,:) = PTHS(:,:,:) / PRHODJ(:,:,:) DO JRR = 1,KRR PRS(:,:,:,JRR) = PRS(:,:,:,JRR) / PRHODJ(:,:,:) @@ -496,10 +530,10 @@ END DO ! ! complete the physical boundaries to avoid some computations ! -IF(LWEST_ll() .AND. HLBCX(1) /= 'CYCL') PRT(:IIB-1,:,:,2:) = 0.0 -IF(LEAST_ll() .AND. HLBCX(2) /= 'CYCL') PRT(IIE+1:,:,:,2:) = 0.0 -IF(LSOUTH_ll() .AND. HLBCY(1) /= 'CYCL') PRT(:,:IJB-1,:,2:) = 0.0 -IF(LNORTH_ll() .AND. HLBCY(2) /= 'CYCL') PRT(:,IJE+1:,:,2:) = 0.0 +IF(GWEST .AND. HLBCX(1) /= 'CYCL') PRT(:IIB-1,:,:,2:) = 0.0 +IF(GEAST .AND. HLBCX(2) /= 'CYCL') PRT(IIE+1:,:,:,2:) = 0.0 +IF(GSOUTH .AND. HLBCY(1) /= 'CYCL') PRT(:,:IJB-1,:,2:) = 0.0 +IF(GNORTH .AND. HLBCY(2) /= 'CYCL') PRT(:,IJE+1:,:,2:) = 0.0 ! IF (HCLOUD=='C2R2' .OR. HCLOUD=='C3R5' .OR. HCLOUD=='KHKO' .OR. HCLOUD=='LIMA') THEN DO JI=1,JPHEXT @@ -511,10 +545,10 @@ END DO ! ! complete the physical boundaries to avoid some computations ! - IF(LWEST_ll() .AND. HLBCX(1) /= 'CYCL') ZSVT(:IIB-1,:,:,:) = 0.0 - IF(LEAST_ll() .AND. HLBCX(2) /= 'CYCL') ZSVT(IIE+1:,:,:,:) = 0.0 - IF(LSOUTH_ll() .AND. HLBCY(1) /= 'CYCL') ZSVT(:,:IJB-1,:,:) = 0.0 - IF(LNORTH_ll() .AND. HLBCY(2) /= 'CYCL') ZSVT(:,IJE+1:,:,:) = 0.0 + IF(GWEST .AND. HLBCX(1) /= 'CYCL') ZSVT(:IIB-1,:,:,:) = 0.0 + IF(GEAST .AND. HLBCX(2) /= 'CYCL') ZSVT(IIE+1:,:,:,:) = 0.0 + IF(GSOUTH .AND. HLBCY(1) /= 'CYCL') ZSVT(:,:IJB-1,:,:) = 0.0 + IF(GNORTH .AND. HLBCY(2) /= 'CYCL') ZSVT(:,IJE+1:,:,:) = 0.0 ENDIF ! ! complete the vertical boundaries @@ -540,11 +574,20 @@ ENDIF ! microphysical routines would save ! computing time ! -ZEXN(:,:,:)= (PPABST(:,:,:)/XP00)**(XRD/XCPD) +#ifndef MNH_BITREP +ZEXN(:,:,:) = (PPABST(:,:,:)/XP00) ** (XRD/XCPD) +#else +ZEXN(:,:,:) = BR_POW(PPABST(:,:,:)/XP00,XRD/XCPD) +#endif ZT(:,:,:)= PTHT(:,:,:)*ZEXN(:,:,:) ZLV(:,:,:)=XLVTT +(XCPV-XCL) *(ZT(:,:,:)-XTT) ZLS(:,:,:)=XLSTT +(XCPV-XCI) *(ZT(:,:,:)-XTT) ZCPH(:,:,:)=XCPD +XCPV*PRT(:,:,:,1) +!$acc end kernels +!$acc update self(PTHS,PRT,PRS,ZEXN,ZLV,ZLS,ZCPH) +IF (HCLOUD=='C2R2' .OR. HCLOUD=='C3R5' .OR. HCLOUD=='KHKO' .OR. HCLOUD=='LIMA') THEN +!$acc update self(ZSVS,ZSVT) +ENDIF ! ! !* 3. REMOVE NEGATIVE VALUES @@ -577,6 +620,7 @@ IF (HCLOUD == 'KESS' .OR. HCLOUD == 'ICE3' .OR. HCLOUD == 'C2R2' .OR. & ! ZRATIO = ZMASSTOT / ZMASSPOS PRS(:,:,:,JRR) = PRS(:,:,:,JRR) * ZRATIO +!$acc update device(PRS) ! END IF END SELECT @@ -587,6 +631,10 @@ END IF ! SELECT CASE ( HCLOUD ) CASE('KESS') +#ifdef _OPENACC +PRINT *,'OPENACC: RESOLVED_CLOUD::KESS not yet implemented' +CALL ABORT +#endif WHERE (PRS(:,:,:,2) < 0.) PRS(:,:,:,1) = PRS(:,:,:,1) + PRS(:,:,:,2) PTHS(:,:,:) = PTHS(:,:,:) - PRS(:,:,:,2) * ZLV(:,:,:) / & @@ -616,6 +664,7 @@ SELECT CASE ( HCLOUD ) ! ! CASE('ICE3','ICE4') +#ifndef _OPENACC WHERE (PRS(:,:,:,4) < 0.) PRS(:,:,:,1) = PRS(:,:,:,1) + PRS(:,:,:,4) PTHS(:,:,:) = PTHS(:,:,:) - PRS(:,:,:,4) * ZLS(:,:,:) / & @@ -649,8 +698,55 @@ SELECT CASE ( HCLOUD ) PRS(:,:,:,4) = PRS(:,:,:,4) -ZCOR(:,:,:) END WHERE END IF +#else +!$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. + ELSE + ! if rc or ri are positive, we can correct negative rv + ! cloud + IF (PRS(JI,JJ,JK,1) < 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. + ! ice + IF(KRR > 3 .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 IF + END IF + END DO + END DO + END DO +!$acc end kernels +!$acc update self(PRS,PTHS) +! +! +#endif ! CASE('C3R5') +#ifdef _OPENACC +PRINT *,'OPENACC: RESOLVED_CLOUD::C3R5 not yet implemented' +CALL ABORT +#endif WHERE (PRS(:,:,:,2) < 0. .OR. ZSVS(:,:,:,2) < 0.) ZSVS(:,:,:,1) = 0.0 END WHERE @@ -683,6 +779,9 @@ SELECT CASE ( HCLOUD ) PSVS(:,:,:,:) = MAX( 0.0,PSVS(:,:,:,:) ) ! CASE('LIMA') +#ifdef _OPENACC +PRINT *,'OPENACC: RESOLVED_CLOUD::LIMA not yet implemented' +#endif ! Correction of CCN concentrations where rc<0 or Nc<0 IF (OWARM) THEN DO JMOD = 1, NMOD_CCN @@ -791,6 +890,10 @@ END IF ! SELECT CASE ( HCLOUD ) CASE ('REVE') +#ifdef _OPENACC +PRINT *,'OPENACC: RESOLVED_CLOUD::REVE not yet implemented' +CALL ABORT +#endif ! !* 4. REVERSIBLE MICROPHYSICAL SCHEME ! ------------------------------- @@ -804,6 +907,10 @@ SELECT CASE ( HCLOUD ) PTHS=PTHS, PSRCS=PSRCS, PCLDFR=PCLDFR ) ! CASE ('KESS') +#ifdef _OPENACC +PRINT *,'OPENACC: RESOLVED_CLOUD::KESS not yet implemented' +CALL ABORT +#endif ! !* 5. KESSLER MICROPHYSICAL SCHEME ! ---------------------------- @@ -829,6 +936,10 @@ SELECT CASE ( HCLOUD ) ! ! CASE ('C2R2','KHKO') +#ifdef _OPENACC +PRINT *,'OPENACC: RESOLVED_CLOUD::C2R2//KHKO not yet implemented' +CALL ABORT +#endif ! !* 7. 2-MOMENT WARM MICROPHYSICAL SCHEME C2R2 or KHKO ! --------------------------------------- @@ -837,6 +948,7 @@ SELECT CASE ( HCLOUD ) !* 7.1 Compute the explicit microphysical sources ! ! +!$acc data copyin(PSOLORG,PMI) CALL RAIN_C2R2_KHKO ( HCLOUD, OACTIT, OSEDC, ORAIN, KSPLITR, PTSTEP, KMI, & HFMFILE, HLUOUT, OCLOSE_OUT, PZZ, PRHODJ, PRHODREF, PEXNREF, & PPABST, PTHT, PRT(:,:,:,1), PRT(:,:,:,2), PRT(:,:,:,3), & @@ -847,6 +959,7 @@ SELECT CASE ( HCLOUD ) PINPRC, PINPRR, PINPRR3D, PEVAP3D , & PSVT(:,:,:,:), PSOLORG, PMI, HACTCCN, & PINDEP, PSUPSAT, PNACT ) +!$acc end data ! ! !* 7.2 Perform the saturation adjustment @@ -870,6 +983,9 @@ SELECT CASE ( HCLOUD ) END IF ! CASE ('ICE3') +#ifdef _OPENACC +PRINT *,'OPENACC: RESOLVED_CLOUD::ICE3 being implemented' +#endif ! !* 9. MIXED-PHASE MICROPHYSICAL SCHEME (WITH 3 ICE SPECIES) ! ----------------------------------------------------- @@ -878,9 +994,15 @@ SELECT CASE ( HCLOUD ) !* 9.1 Compute the explicit microphysical sources ! ! +!$acc kernels present(ZDZZ,PZZ) DO JK=IKB,IKE ZDZZ(:,:,JK)=PZZ(:,:,JK+1)-PZZ(:,:,JK) ENDDO +!$acc end kernels +!$acc update self(ZDZZ) +!$acc update device(PCIT,PCLDFR) +!$acc update device(PINPRC,PINPRR,PINPRR3D,PEVAP3D,PINPRS,PINPRG,PINDEP) +!$acc data copyin(PSEA,PTOWN) CALL RAIN_ICE ( OSEDIC,CSEDIM, HSUBG_AUCV, OWARM,1,IKU,1, & KSPLITR, PTSTEP, KMI, KRR, & ZDZZ, PRHODJ, PRHODREF, PEXNREF, PPABST, PCIT,PCLDFR,& @@ -889,9 +1011,12 @@ SELECT CASE ( HCLOUD ) PRT(:,:,:,5), PRT(:,:,:,6), & PTHS, PRS(:,:,:,1), PRS(:,:,:,2), PRS(:,:,:,3), & PRS(:,:,:,4), PRS(:,:,:,5), PRS(:,:,:,6), & - PINPRC,PINPRR, PINPRR3D, PEVAP3D, & - PINPRS, PINPRG, PSIGS,PINDEP, & - PSEA,PTOWN) + PINPRC, PINPRR, PINPRR3D, PEVAP3D, & + PINPRS, PINPRG, PSIGS, PINDEP, & + PSEA, PTOWN) +!$acc end data +!$acc update self(PINPRC,PINPRR,PINPRR3D,PEVAP3D,PINPRS,PINPRG,PINDEP) +!$acc update self(PCIT) ! !* 9.2 Perform the saturation adjustment over cloud ice and cloud water ! @@ -909,6 +1034,10 @@ SELECT CASE ( HCLOUD ) PRGT=PRT(:,:,:,6), PRGS=PRS(:,:,:,6) ) ! CASE ('ICE4') +#ifdef _OPENACC +PRINT *,'OPENACC: RESOLVED_CLOUD::ICE4 not yet implemented' +CALL ABORT +#endif ! !* 10. MIXED-PHASE MICROPHYSICAL SCHEME (WITH 4 ICE SPECIES) ! ----------------------------------------------------- @@ -917,9 +1046,14 @@ SELECT CASE ( HCLOUD ) !* 10.1 Compute the explicit microphysical sources ! ! +!$acc kernels present(ZDZZ,PZZ) DO JK=IKB,IKE ZDZZ(:,:,JK)=PZZ(:,:,JK+1)-PZZ(:,:,JK) ENDDO +!$acc end kernels +!$acc update self(ZDZZ) +!$acc update device(PCIT,PCLDFR) +!$acc data copyin(PSEA,PTOWN) CALL RAIN_ICE ( OSEDIC,CSEDIM, HSUBG_AUCV, OWARM,1,IKU,1, & KSPLITR, PTSTEP, KMI, KRR, & ZDZZ, PRHODJ, PRHODREF, PEXNREF, PPABST, PCIT, PCLDFR,& @@ -928,11 +1062,12 @@ SELECT CASE ( HCLOUD ) PRT(:,:,:,5), PRT(:,:,:,6), & PTHS, PRS(:,:,:,1), PRS(:,:,:,2), PRS(:,:,:,3), & PRS(:,:,:,4), PRS(:,:,:,5), PRS(:,:,:,6), & - PINPRC, PINPRR, PINPRR3D, PEVAP3D, & - PINPRS, PINPRG, PSIGS,PINDEP, & + PINPRC, PINPRR, PINPRR3D, PEVAP3D, & + PINPRS, PINPRG, PSIGS, PINDEP, & PSEA, PTOWN, & PRT(:,:,:,7), PRS(:,:,:,7), PINPRH,OCONVHG ) - +!$acc end data +!$acc update self(PCIT) ! !* 10.2 Perform the saturation adjustment over cloud ice and cloud water ! @@ -957,6 +1092,10 @@ SELECT CASE ( HCLOUD ) !* 12.1 Compute the explicit microphysical sources ! CASE ('LIMA') +#ifdef _OPENACC +PRINT *,'OPENACC: RESOLVED_CLOUD::LIMA not yet implemented' +CALL ABORT +#endif ! IF (OWARM) CALL LIMA_WARM(OACTIT, OSEDC, ORAIN, KSPLITR, PTSTEP, KMI, & HFMFILE, HLUOUT, OCLOSE_OUT, KRR, PZZ, PRHODJ,& @@ -1018,11 +1157,15 @@ END IF !* 13. SWITCH BACK TO THE PROGNOSTIC VARIABLES ! --------------------------------------- ! +!$acc update device(PTHS,PRS) +!$acc kernels PTHS(:,:,:) = PTHS(:,:,:) * PRHODJ(:,:,:) ! DO JRR = 1,KRR PRS(:,:,:,JRR) = PRS(:,:,:,JRR) * PRHODJ(:,:,:) END DO +!$acc end kernels +!$acc update self(PTHS,PRS) ! IF (HCLOUD=='C2R2' .OR. HCLOUD=='C3R5' .OR. HCLOUD=='KHKO' .OR. HCLOUD=='LIMA') THEN DO JSV = 1,SIZE(ZSVS,4)