diff --git a/docs/TODO b/docs/TODO index 554b8b70b9d34c97b6939622e2276ad8c6bd1c89..02d50d4cc3829797d16c16f4493add307bfc8432 100644 --- a/docs/TODO +++ b/docs/TODO @@ -22,7 +22,16 @@ Merge pb: Ryad doit faire des tests pour regarder impact des allaocatble sur CPU. si test OK, on passe en alloacatble si test KO, arbitrage entre Philippe et Riad +- ice4_sedimentation_*: + Philippe a déclaré PINPRC et PINDEP en (:,:) à la place de (KIT,KJT) + En commentaire (version split), il met "dimensions of PINPRC and PINDEP not necessarily KIT,KJT" + Comprendre pourquoi, comment ça peut marcher dans la sédimentation + Code dans common en (KIT,KJT) + repasser code en (:,:) si besoin, ou passer en arg les dimensions effectives + ou modifier MNH pour toujours avoir KIT,KJT + une partie du code est maintentant dans rain_ice (déposition) Etape 2: array syntax -> loop - en profiter pour supprimer args PA/PB des routines appelées depuis ice4_tendencies, comme pour nucleation - si possible, modifier ice4_sedimentation_split* dans le même esprit que stat +- transformer sedimentation_split_momentum comme sedimentation_split diff --git a/src/arome/gmkpack_ignored_files b/src/arome/gmkpack_ignored_files index af931924e666f45f5bedc8ebe931c3b30bb8ccdd..45075fc85384251ba29db7e9f0da0200986082cd 100644 --- a/src/arome/gmkpack_ignored_files +++ b/src/arome/gmkpack_ignored_files @@ -46,3 +46,7 @@ phyex/micro/ice4_nucleation.F90 phyex/micro/modi_ice4_nucleation.F90 phyex/micro/ice4_nucleation_wrapper.F90 phyex/micro/modi_ice4_nucleation_wrapper.F90 +phyex/micro/ice4_sedimentation_stat.F90 +phyex/micro/modi_ice4_sedimentation_split.F90 +phyex/micro/ice4_sedimentation_split.F90 +phyex/micro/modi_ice4_sedimentation_stat.F90 diff --git a/src/arome/micro/ice4_sedimentation_split.F90 b/src/arome/micro/ice4_sedimentation_split.F90 deleted file mode 100644 index b4b1c15f878d1b4179717433107b386709f42cc2..0000000000000000000000000000000000000000 --- a/src/arome/micro/ice4_sedimentation_split.F90 +++ /dev/null @@ -1,488 +0,0 @@ -SUBROUTINE ICE4_SEDIMENTATION_SPLIT(KIB, KIE, KIT, KJB, KJE, KJT, KKB, KKE, KKTB, KKTE, KKT, KKL, & - &PTSTEP, KRR, OSEDIC, & - &PDZZ, & - &PRHODREF, PPABST, PTHT, PRHODJ, & - &PRCS, PRCT, PRRS, PRRT, PRIS, PRIT, PRSS, PRST, PRGS, PRGT,& - &PINPRC, PINPRR, PINPRI, PINPRS, PINPRG, & - &PSEA, PTOWN, PINPRH, PRHT, PRHS, PFPR) -!! -!!** PURPOSE -!! ------- -!! Computes the sedimentation -!! -!! AUTHOR -!! ------ -!! S. Riette from the plitting of rain_ice source code (nov. 2014) -!! and modified for optimisation -!! -!! MODIFICATIONS -!! ------------- -!! -! -! -!* 0. DECLARATIONS -! ------------ -! -USE PARKIND1, ONLY : JPRB -USE YOMHOOK , ONLY : LHOOK, DR_HOOK -USE MODD_CST -USE MODD_RAIN_ICE_DESCR -USE MODD_RAIN_ICE_PARAM -USE MODD_PARAM_ICE -USE MODI_GAMMA -! -IMPLICIT NONE -! -!* 0.1 Declarations of dummy arguments : -! -INTEGER, INTENT(IN) :: KIB, KIE, KIT, KJB, KJE, KJT, KKB, KKE, KKTB, KKTE, KKT -INTEGER, INTENT(IN) :: KKL !vert. levels type 1=MNH -1=ARO -REAL, INTENT(IN) :: PTSTEP ! Double Time step (single if cold start) -INTEGER, INTENT(IN) :: KRR ! Number of moist variable -LOGICAL, INTENT(IN) :: OSEDIC ! Switch for droplet sedim. -REAL, DIMENSION(KIT,KJT,KKT), INTENT(IN) :: PDZZ ! Layer thikness (m) -REAL, DIMENSION(KIT,KJT,KKT), INTENT(IN) :: PRHODREF! Reference density -REAL, DIMENSION(KIT,KJT,KKT), INTENT(IN) :: PPABST ! absolute pressure at t -REAL, DIMENSION(KIT,KJT,KKT), INTENT(IN) :: PTHT ! Theta at time t -REAL, DIMENSION(KIT,KJT,KKT), INTENT(IN) :: PRHODJ ! Dry density * Jacobian -REAL, DIMENSION(KIT,KJT,KKT), INTENT(INOUT) :: PRCS ! Cloud water m.r. source -REAL, DIMENSION(KIT,KJT,KKT), INTENT(IN) :: PRCT ! Cloud water m.r. at t -REAL, DIMENSION(KIT,KJT,KKT), INTENT(INOUT) :: PRRS ! Rain water m.r. source -REAL, DIMENSION(KIT,KJT,KKT), INTENT(IN) :: PRRT ! Rain water m.r. at t -REAL, DIMENSION(KIT,KJT,KKT), INTENT(INOUT) :: PRIS ! Pristine ice m.r. source -REAL, DIMENSION(KIT,KJT,KKT), INTENT(IN) :: PRIT ! Pristine ice m.r. at t -REAL, DIMENSION(KIT,KJT,KKT), INTENT(INOUT) :: PRSS ! Snow/aggregate m.r. source -REAL, DIMENSION(KIT,KJT,KKT), INTENT(IN) :: PRST ! Snow/aggregate m.r. at t -REAL, DIMENSION(KIT,KJT,KKT), INTENT(INOUT) :: PRGS ! Graupel m.r. source -REAL, DIMENSION(KIT,KJT,KKT), INTENT(IN) :: PRGT ! Graupel/hail m.r. at t -REAL, DIMENSION(KIT,KJT), INTENT(OUT) :: PINPRC ! Cloud instant precip -REAL, DIMENSION(KIT,KJT), INTENT(OUT) :: PINPRR ! Rain instant precip -REAL, DIMENSION(KIT,KJT), INTENT(OUT) :: PINPRI ! Pristine ice instant precip -REAL, DIMENSION(KIT,KJT), INTENT(OUT) :: PINPRS ! Snow instant precip -REAL, DIMENSION(KIT,KJT), INTENT(OUT) :: PINPRG ! Graupel instant precip -REAL, DIMENSION(KIT,KJT), OPTIONAL, INTENT(IN) :: PSEA ! Sea Mask -REAL, DIMENSION(KIT,KJT), OPTIONAL, INTENT(IN) :: PTOWN ! Fraction that is town -REAL, DIMENSION(KIT,KJT), OPTIONAL, INTENT(OUT) :: PINPRH ! Hail instant precip -REAL, DIMENSION(KIT,KJT,KKT), OPTIONAL, INTENT(IN) :: PRHT ! Hail m.r. at t -REAL, DIMENSION(KIT,KJT,KKT), OPTIONAL, INTENT(INOUT) :: PRHS ! Hail m.r. source -REAL, DIMENSION(KIT,KJT,KKT,KRR), OPTIONAL, INTENT(OUT) :: PFPR ! upper-air precipitation fluxes -! -!* 0.2 declaration of local variables -! -! -LOGICAL, DIMENSION(KIT, KJT, KKT) & - :: GSEDIM ! Test where to compute the SED processes -INTEGER , DIMENSION(SIZE(GSEDIM)) :: I1,I2,I3 ! Used to replace the COUNT - -REAL, DIMENSION(KIT, KJT, KKT) :: ZCONC3D, & ! droplet condensation - & ZRAY, & ! Cloud Mean radius - & ZLBC, & ! XLBC weighted by sea fraction - & ZFSEDC, & - & ZPRCS,ZPRRS,ZPRIS,ZPRSS,ZPRGS,ZPRHS, & ! Mixing ratios created during the time step - & ZW, & ! work array - & ZRCT, & - & ZRRT, & - & ZRIT, & - & ZRST, & - & ZRGT, & - & ZRHT -REAL, DIMENSION(KIT, KJT,0:KKT+1) :: ZWSED ! sedimentation fluxes -REAL, DIMENSION(KIT, KJT) :: ZCONC_TMP ! Weighted concentration -REAL, DIMENSION(KIT, KJT) :: ZREMAINT ! Remaining time until the timestep end -REAL :: ZINVTSTEP -INTEGER :: ISEDIM ! ! Case number of sedimentation -INTEGER :: JK -REAL, DIMENSION(SIZE(XRTMIN)) :: ZRSMIN -REAL(KIND=JPRB) :: ZHOOK_HANDLE -!------------------------------------------------------------------------------- -! -IF (LHOOK) CALL DR_HOOK('ICE4_SEDIMENTATION_SPLIT', 0, ZHOOK_HANDLE) -!------------------------------------------------------------------------------- -! -! -! O. Initialization of for sedimentation -! -ZINVTSTEP=1./PTSTEP -ZRSMIN(:) = XRTMIN(:) * ZINVTSTEP -IF (OSEDIC) PINPRC (:,:) = 0. -PINPRR (:,:) = 0. -PINPRI (:,:) = 0. -PINPRS (:,:) = 0. -PINPRG (:,:) = 0. -IF ( KRR == 7 ) PINPRH (:,:) = 0. -IF (PRESENT(PFPR)) PFPR(:,:,:,:) = 0. -! -!* 1. Parameters for cloud sedimentation -! -IF (OSEDIC) THEN - IF(PRESENT(PSEA) .AND. PRESENT(PTOWN)) THEN - ZRAY(:,:,:) = 0. - ZCONC_TMP(:,:)=PSEA(:,:)*XCONC_SEA+(1.-PSEA(:,:))*XCONC_LAND - DO JK=KKTB, KKTE - ZLBC(:,:,JK) = PSEA(:,:)*XLBC(2)+(1.-PSEA(:,:))*XLBC(1) - ZFSEDC(:,:,JK) = (PSEA(:,:)*XFSEDC(2)+(1.-PSEA(:,:))*XFSEDC(1)) - ZFSEDC(:,:,JK) = MAX(MIN(XFSEDC(1),XFSEDC(2)),ZFSEDC(:,:,JK)) - ZCONC3D(:,:,JK)= (1.-PTOWN(:,:))*ZCONC_TMP(:,:)+PTOWN(:,:)*XCONC_URBAN - ZRAY(:,:,JK) = 0.5*((1.-PSEA(:,:))*GAMMA(XNUC+1.0/XALPHAC)/(GAMMA(XNUC)) + & - PSEA(:,:)*GAMMA(XNUC2+1.0/XALPHAC2)/(GAMMA(XNUC2))) - END DO - ELSE - ZLBC(:,:,:) = XLBC(1) - ZFSEDC(:,:,:) = XFSEDC(1) - ZCONC3D(:,:,:)= XCONC_LAND - ZRAY(:,:,:) = 0.5*(GAMMA(XNUC+1.0/XALPHAC)/(GAMMA(XNUC))) - ENDIF - ZRAY(:,:,:) = MAX(1.,ZRAY(:,:,:)) - ZLBC(:,:,:) = MAX(MIN(XLBC(1),XLBC(2)),ZLBC(:,:,:)) -ENDIF -! -!* 2. compute the fluxes -! -! optimization by looking for locations where -! the precipitating fields are larger than a minimal value only !!! -! For optimization we consider each variable separately -! -! External tendecies -IF (OSEDIC) ZPRCS(:,:,:) = PRCS(:,:,:)-PRCT(:,:,:)*ZINVTSTEP -ZPRRS(:,:,:) = PRRS(:,:,:)-PRRT(:,:,:)*ZINVTSTEP -ZPRIS(:,:,:) = PRIS(:,:,:)-PRIT(:,:,:)*ZINVTSTEP -ZPRSS(:,:,:) = PRSS(:,:,:)-PRST(:,:,:)*ZINVTSTEP -ZPRGS(:,:,:) = PRGS(:,:,:)-PRGT(:,:,:)*ZINVTSTEP -IF ( KRR == 7 ) ZPRHS(:,:,:) = PRHS(:,:,:)-PRHT(:,:,:)*ZINVTSTEP -! -! mr values inside the time-splitting loop -ZRCT(:,:,:) = PRCT(:,:,:) -ZRRT(:,:,:) = PRRT(:,:,:) -ZRIT(:,:,:) = PRIT(:,:,:) -ZRST(:,:,:) = PRST(:,:,:) -ZRGT(:,:,:) = PRGT(:,:,:) -IF (KRR==7) ZRHT(:,:,:) = PRHT(:,:,:) -! -DO JK = KKTB , KKTE - ZW(:,:,JK) =1./(PRHODREF(:,:,JK)* PDZZ(:,:,JK)) -END DO -! -! -!* 2.1 for cloud -! -IF (OSEDIC) THEN - ZREMAINT(:,:) = PTSTEP - DO WHILE (ANY(ZREMAINT>0.)) - GSEDIM(:,:,:)=.FALSE. - DO JK = KKTB , KKTE - GSEDIM(KIB:KIE,KJB:KJE,JK) = & - (ZRCT(KIB:KIE,KJB:KJE,JK)>XRTMIN(2) .OR. & - ZPRCS(KIB:KIE,KJB:KJE,JK)>ZRSMIN(2)) .AND. & - ZREMAINT(KIB:KIE,KJB:KJE)>0. - ENDDO - ISEDIM = ICE4_SEDIMENTATION_SPLIT_COUNTJV(GSEDIM(:,:,:),KIT,KJT,KKT,& - &SIZE(I1),I1(:),I2(:),I3(:)) - CALL INTERNAL_SEDIM_SPLI(KIT, KJT, KKB, KKTB, KKTE, KKT, KKL, KRR, & - &ISEDIM, GSEDIM, I1, I2, I3, XSPLIT_MAXCFL, ZREMAINT, & - &PRHODREF, ZW, PDZZ, PPABST, PTHT, PTSTEP, & - &2, & - &ZRCT, PRCS, ZWSED, PINPRC, ZPRCS, & - &ZRAY, ZLBC, ZFSEDC, ZCONC3D, PFPR=PFPR) - ENDDO -ENDIF -! -!* 2.2 for rain -! -ZREMAINT(:,:) = PTSTEP -DO WHILE (ANY(ZREMAINT>0.)) - GSEDIM(:,:,:)=.FALSE. - DO JK = KKTB , KKTE - GSEDIM(KIB:KIE,KJB:KJE,JK) = & - (ZRRT(KIB:KIE,KJB:KJE,JK)>XRTMIN(3) .OR. & - ZPRRS(KIB:KIE,KJB:KJE,JK)>ZRSMIN(3)) .AND. & - ZREMAINT(KIB:KIE,KJB:KJE)>0. - ENDDO - ISEDIM = ICE4_SEDIMENTATION_SPLIT_COUNTJV(GSEDIM(:,:,:),KIT,KJT,KKT,& - &SIZE(I1),I1(:),I2(:),I3(:)) - CALL INTERNAL_SEDIM_SPLI(KIT, KJT, KKB, KKTB, KKTE, KKT, KKL, KRR, & - &ISEDIM, GSEDIM, I1, I2, I3, XSPLIT_MAXCFL, ZREMAINT, & - &PRHODREF, ZW, PDZZ, PPABST, PTHT, PTSTEP, & - &3, & - &ZRRT, PRRS, ZWSED, PINPRR, ZPRRS, & - &PFPR=PFPR) -ENDDO -! -!* 2.3 for pristine ice -! -ZREMAINT(:,:) = PTSTEP -DO WHILE (ANY(ZREMAINT>0.)) - GSEDIM(:,:,:)=.FALSE. - DO JK = KKTB , KKTE - GSEDIM(KIB:KIE,KJB:KJE,JK) = & - (ZRIT(KIB:KIE,KJB:KJE,JK)>XRTMIN(4) .OR. & - ZPRIS(KIB:KIE,KJB:KJE,JK)>ZRSMIN(4)) .AND. & - ZREMAINT(KIB:KIE,KJB:KJE)>0. - ENDDO - ISEDIM = ICE4_SEDIMENTATION_SPLIT_COUNTJV(GSEDIM(:,:,:),KIT,KJT,KKT,& - &SIZE(I1),I1(:),I2(:),I3(:)) - CALL INTERNAL_SEDIM_SPLI(KIT, KJT, KKB, KKTB, KKTE, KKT, KKL, KRR, & - &ISEDIM, GSEDIM, I1, I2, I3, XSPLIT_MAXCFL, ZREMAINT, & - &PRHODREF, ZW, PDZZ, PPABST, PTHT, PTSTEP, & - &4, & - &ZRIT, PRIS, ZWSED, PINPRI, ZPRIS, PFPR=PFPR) -ENDDO -! -!* 2.4 for aggregates/snow -! -ZREMAINT(:,:) = PTSTEP -DO WHILE (ANY(ZREMAINT>0.)) - GSEDIM(:,:,:)=.FALSE. - DO JK = KKTB , KKTE - GSEDIM(KIB:KIE,KJB:KJE,JK) = & - (ZRST(KIB:KIE,KJB:KJE,JK)>XRTMIN(5) .OR. & - ZPRSS(KIB:KIE,KJB:KJE,JK)>ZRSMIN(5)) .AND. & - ZREMAINT(KIB:KIE,KJB:KJE)>0. - ENDDO - ISEDIM = ICE4_SEDIMENTATION_SPLIT_COUNTJV(GSEDIM(:,:,:),KIT,KJT,KKT,& - &SIZE(I1),I1(:),I2(:),I3(:)) - CALL INTERNAL_SEDIM_SPLI(KIT, KJT, KKB, KKTB, KKTE, KKT, KKL, KRR, & - &ISEDIM, GSEDIM, I1, I2, I3, XSPLIT_MAXCFL, ZREMAINT, & - &PRHODREF, ZW, PDZZ, PPABST, PTHT, PTSTEP, & - &5, & - &ZRST, PRSS, ZWSED, PINPRS, ZPRSS, PFPR=PFPR) -ENDDO -! -!* 2.5 for graupeln -! -ZREMAINT(:,:) = PTSTEP -DO WHILE (ANY(ZREMAINT>0.)) - GSEDIM(:,:,:)=.FALSE. - DO JK = KKTB , KKTE - GSEDIM(KIB:KIE,KJB:KJE,JK) = & - (ZRGT(KIB:KIE,KJB:KJE,JK)>XRTMIN(6) .OR. & - ZPRGS(KIB:KIE,KJB:KJE,JK)>ZRSMIN(6)) .AND. & - ZREMAINT(KIB:KIE,KJB:KJE)>0. - ENDDO - ISEDIM = ICE4_SEDIMENTATION_SPLIT_COUNTJV(GSEDIM(:,:,:),KIT,KJT,KKT,& - &SIZE(I1),I1(:),I2(:),I3(:)) - CALL INTERNAL_SEDIM_SPLI(KIT, KJT, KKB, KKTB, KKTE, KKT, KKL, KRR, & - &ISEDIM, GSEDIM, I1, I2, I3, XSPLIT_MAXCFL, ZREMAINT, & - &PRHODREF, ZW, PDZZ, PPABST, PTHT, PTSTEP, & - &6, & - &ZRGT, PRGS, ZWSED, PINPRG, ZPRGS, PFPR=PFPR) -ENDDO -! -!* 2.6 for hail -! -IF (KRR==7) THEN - ZREMAINT(:,:) = PTSTEP - DO WHILE (ANY(ZREMAINT>0.)) - GSEDIM(:,:,:)=.FALSE. - DO JK = KKTB , KKTE - GSEDIM(KIB:KIE,KJB:KJE,JK) = & - (ZRHT(KIB:KIE,KJB:KJE,JK)>XRTMIN(7) .OR. & - ZPRHS(KIB:KIE,KJB:KJE,JK)>ZRSMIN(7)) .AND. & - ZREMAINT(KIB:KIE,KJB:KJE)>0. - ENDDO - ISEDIM = ICE4_SEDIMENTATION_SPLIT_COUNTJV(GSEDIM(:,:,:),KIT,KJT,KKT,& - &SIZE(I1),I1(:),I2(:),I3(:)) - CALL INTERNAL_SEDIM_SPLI(KIT, KJT, KKB, KKTB, KKTE, KKT, KKL, KRR, & - &ISEDIM, GSEDIM, I1, I2, I3, XSPLIT_MAXCFL, ZREMAINT, & - &PRHODREF, ZW, PDZZ, PPABST, PTHT, PTSTEP, & - &7, & - &ZRHT, PRHS, ZWSED, PINPRH, ZPRHS, PFPR=PFPR) - END DO -ENDIF -! -IF (LHOOK) CALL DR_HOOK('ICE4_SEDIMENTATION_SPLIT', 1, ZHOOK_HANDLE) -! -CONTAINS -! -! -!------------------------------------------------------------------------------- -! -! - SUBROUTINE INTERNAL_SEDIM_SPLI(KIT, KJT, KKB, KKTB, KKTE, KKT, KKL, KRR, & - &KSEDIM, LDSEDIM, I1, I2, I3, PMAXCFL, PREMAINT, & - &PRHODREF, POORHODZ, PDZZ, PPABST, PTHT, PTSTEP, & - &KSPE, & - &PRXT, PRXS, PWSED, PINPRX, PPRXS, & - &PRAY, PLBC, PFSEDC, PCONC3D, PFPR) - ! - !* 0. DECLARATIONS - ! ------------ - ! - USE MODD_RAIN_ICE_DESCR - USE MODD_RAIN_ICE_PARAM - ! - IMPLICIT NONE - ! - !* 0.1 Declarations of dummy arguments : - ! - INTEGER, INTENT(IN) :: KIT, KJT, KKB, KKTB, KKTE, KKT, KKL, KRR - INTEGER, INTENT(IN) :: KSEDIM - LOGICAL, DIMENSION(KIT,KJT,KKT), INTENT(IN) :: LDSEDIM - INTEGER, DIMENSION(KSEDIM), INTENT(IN) :: I1, I2, I3 - REAL, INTENT(IN) :: PMAXCFL ! maximum CFL allowed - REAL, DIMENSION(KIT,KJT), INTENT(INOUT) :: PREMAINT ! Time remaining until the end of the timestep - REAL, DIMENSION(KIT,KJT,KKT), INTENT(IN) :: PRHODREF ! Reference density - REAL, DIMENSION(KIT,KJT,KKT), INTENT(IN) :: POORHODZ ! One Over (Rhodref times delta Z) - REAL, DIMENSION(KIT,KJT,KKT), INTENT(IN) :: PDZZ ! layer thikness (m) - REAL, DIMENSION(KIT,KJT,KKT), INTENT(IN) :: PPABST - REAL, DIMENSION(KIT,KJT,KKT), INTENT(IN) :: PTHT - REAL, INTENT(IN) :: PTSTEP ! total timestep - INTEGER, INTENT(IN) :: KSPE ! 1 for rc, 2 for rr... - REAL, DIMENSION(KIT,KJT,KKT), INTENT(INOUT) :: PRXT ! mr of specy X - REAL, DIMENSION(KIT,KJT,KKT), INTENT(INOUT) :: PRXS !Tendency of the specy KSPE - REAL, DIMENSION(KIT,KJT,0:KKT+1), INTENT(OUT) :: PWSED ! sedimentation flux - REAL, DIMENSION(KIT,KJT), INTENT(INOUT) :: PINPRX ! instant precip - REAL, DIMENSION(KIT,KJT,KKT), INTENT(IN) :: PPRXS ! external tendencie - REAL, DIMENSION(KIT,KJT,KKT), INTENT(IN), OPTIONAL :: PRAY, PLBC, PFSEDC, PCONC3D - REAL, DIMENSION(KIT,KJT,KKT,KRR), OPTIONAL, INTENT(INOUT) :: PFPR ! upper-air precipitation fluxes - ! - !* 0.2 declaration of local variables - ! - ! - INTEGER :: JK, JL, JI, JJ - REAL :: ZINVTSTEP - REAL :: ZZWLBDC, ZRAY, ZZT, ZZWLBDA, ZZCC - REAL :: ZFSED, ZEXSED - REAL, DIMENSION(KIT, KJT) :: ZMRCHANGE - REAL, DIMENSION(KIT, KJT) :: ZMAX_TSTEP ! Maximum CFL in column - REAL, DIMENSION(SIZE(XRTMIN)) :: ZRSMIN - REAL(KIND=JPRB) :: ZHOOK_HANDLE - IF (LHOOK) CALL DR_HOOK('ICE4_SEDIMENTATION_SPLIT:INTERNAL_SEDIM_SPLIT', 0, ZHOOK_HANDLE) - ! - !------------------------------------------------------------------------------- - ! - ! - !* 1. Parameters for cloud sedimentation - ! - ! - !* 2. compute the fluxes - ! - ! - ZINVTSTEP = 1./PTSTEP - ZRSMIN(:) = XRTMIN(:) * ZINVTSTEP - IF(KSPE==2) THEN - !******* for cloud - PWSED(:,:,:) = 0. - DO JL=1, KSEDIM - JI=I1(JL) - JJ=I2(JL) - JK=I3(JL) - IF(PRXT(JI,JJ,JK)>XRTMIN(KSPE)) THEN - ZZWLBDC = PLBC(JI,JJ,JK) * PCONC3D(JI,JJ,JK) / & - (PRHODREF(JI,JJ,JK) * PRXT(JI,JJ,JK)) - ZZWLBDC = ZZWLBDC**XLBEXC - ZRAY = PRAY(JI,JJ,JK) / ZZWLBDC - ZZT = PTHT(JI,JJ,JK) * (PPABST(JI,JJ,JK)/XP00)**(XRD/XCPD) - ZZWLBDA = 6.6E-8*(101325./PPABST(JI,JJ,JK))*(ZZT/293.15) - ZZCC = XCC*(1.+1.26*ZZWLBDA/ZRAY) - PWSED(JI, JJ, JK) = PRHODREF(JI,JJ,JK)**(-XCEXVT +1 ) * & - ZZWLBDC**(-XDC)*ZZCC*PFSEDC(JI,JJ,JK) * PRXT(JI,JJ,JK) - ENDIF - ENDDO - ELSEIF(KSPE==4) THEN - ! ******* for pristine ice - PWSED(:,:,:) = 0. - DO JL=1, KSEDIM - JI=I1(JL) - JJ=I2(JL) - JK=I3(JL) - IF(PRXT(JI, JJ, JK) .GT. MAX(XRTMIN(4), 1.0E-7)) THEN - PWSED(JI, JJ, JK) = XFSEDI * PRXT(JI, JJ, JK) * & - & PRHODREF(JI,JJ,JK)**(1.-XCEXVT) * & ! McF&H - & MAX( 0.05E6,-0.15319E6-0.021454E6* & - & ALOG(PRHODREF(JI,JJ,JK)*PRXT(JI,JJ,JK)) )**XEXCSEDI - ENDIF - ENDDO - ELSE - ! ******* for other species - IF(KSPE==3) THEN - ZFSED=XFSEDR - ZEXSED=XEXSEDR - ELSEIF(KSPE==5) THEN - ZFSED=XFSEDS - ZEXSED=XEXSEDS - ELSEIF(KSPE==6) THEN - ZFSED=XFSEDG - ZEXSED=XEXSEDG - ELSEIF(KSPE==7) THEN - ZFSED=XFSEDH - ZEXSED=XEXSEDH - ELSE - WRITE(*,*) ' STOP' - WRITE(*,*) ' NO SEDIMENTATION PARAMETER FOR KSPE==', KSPE - CALL ABORT - STOP - ENDIF - PWSED(:,:,:) = 0. - DO JL=1, KSEDIM - JI=I1(JL) - JJ=I2(JL) - JK=I3(JL) - IF(PRXT(JI,JJ,JK)>XRTMIN(KSPE)) THEN - PWSED(JI, JJ, JK) = ZFSED * PRXT(JI, JJ, JK)**ZEXSED * & - PRHODREF(JI, JJ, JK)**(ZEXSED-XCEXVT) - ENDIF - ENDDO - ENDIF - ZMAX_TSTEP(:,:) = PREMAINT(:,:) - DO JL=1, KSEDIM - JI=I1(JL) - JJ=I2(JL) - JK=I3(JL) - IF(PRXT(JI,JJ,JK)>XRTMIN(KSPE) .AND. PWSED(JI, JJ, JK)>1.E-20) THEN - ZMAX_TSTEP(JI, JJ) = MIN(ZMAX_TSTEP(JI, JJ), PMAXCFL * PRHODREF(JI, JJ, JK) * & - PRXT(JI, JJ, JK) * PDZZ(JI, JJ, JK) / PWSED(JI, JJ, JK)) - ENDIF - ENDDO - ZMRCHANGE(:,:) = 0. - PREMAINT(:,:) = PREMAINT(:,:) - ZMAX_TSTEP(:,:) - DO JK = KKTB , KKTE - ZMRCHANGE(:,:) = ZMAX_TSTEP(:,:) * POORHODZ(:,:,JK)*(PWSED(:,:,JK+KKL)-PWSED(:,:,JK)) - PRXT(:,:,JK) = PRXT(:,:,JK) + ZMRCHANGE(:,:) + PPRXS(:,:,JK) * ZMAX_TSTEP(:,:) - PRXS(:,:,JK) = PRXS(:,:,JK) + ZMRCHANGE(:,:) * ZINVTSTEP - ENDDO - PINPRX(:,:) = PINPRX(:,:) + ZWSED(:,:,KKB) / XRHOLW * (ZMAX_TSTEP(:,:) * ZINVTSTEP) - IF (PRESENT(PFPR)) THEN - DO JK = KKTB , KKTE - PFPR(:,:,JK,KSPE) = PFPR(:,:,JK,KSPE) + ZWSED(:,:,JK) * (ZMAX_TSTEP(:,:) * ZINVTSTEP) - ENDDO - ENDIF - ! - IF (LHOOK) CALL DR_HOOK('ICE4_SEDIMENTATION_SPLIT:INTERNAL_SEDIM_SPLIT', 1, ZHOOK_HANDLE) - END SUBROUTINE INTERNAL_SEDIM_SPLI - ! - FUNCTION ICE4_SEDIMENTATION_SPLIT_COUNTJV(LTAB,KIT,KJT,KKT,KSIZE,I1,I2,I3) RESULT(IC) - ! - !* 0. DECLARATIONS - ! ------------ - ! - IMPLICIT NONE - ! - !* 0.2 declaration of local variables - ! - INTEGER, INTENT(IN) :: KIT,KJT,KKT,KSIZE - LOGICAL, DIMENSION(KIT,KJT,KKT), INTENT(IN) :: LTAB ! Mask - INTEGER, DIMENSION(KSIZE), INTENT(OUT) :: I1,I2,I3 ! Used to replace the COUNT and PACK - INTEGER :: JI,JJ,JK,IC - REAL(KIND=JPRB) :: ZHOOK_HANDLE - ! - !------------------------------------------------------------------------------- - ! - IF (LHOOK) CALL DR_HOOK('ICE4_SEDIMENTATION_SPLIT:ICE4_SEDIMENTATION_SPLIT_COUNTJV', 0, ZHOOK_HANDLE) - 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 - ! - IF (LHOOK) CALL DR_HOOK('ICE4_SEDIMENTATION_SPLIT:ICE4_SEDIMENTATION_SPLIT_COUNTJV', 1, ZHOOK_HANDLE) - END FUNCTION ICE4_SEDIMENTATION_SPLIT_COUNTJV - ! -END SUBROUTINE ICE4_SEDIMENTATION_SPLIT diff --git a/src/arome/micro/modi_ice4_sedimentation_split.F90 b/src/arome/micro/modi_ice4_sedimentation_split.F90 deleted file mode 100644 index 2bcea3b472f7c0fd96ccfd20fce5639e0d823a1a..0000000000000000000000000000000000000000 --- a/src/arome/micro/modi_ice4_sedimentation_split.F90 +++ /dev/null @@ -1,44 +0,0 @@ -MODULE MODI_ICE4_SEDIMENTATION_SPLIT -INTERFACE -SUBROUTINE ICE4_SEDIMENTATION_SPLIT(KIB, KIE, KIT, KJB, KJE, KJT, KKB, KKE, KKTB, KKTE, KKT, KKL, & - &PTSTEP, KRR, OSEDIC, & - &PDZZ, & - &PRHODREF, PPABST, PTHT, PRHODJ, & - &PRCS, PRCT, PRRS, PRRT, PRIS, PRIT, PRSS, PRST, PRGS, PRGT,& - &PINPRC, PINPRR, PINPRI, PINPRS, PINPRG, & - &PSEA, PTOWN, PINPRH, PRHT, PRHS, PFPR) -IMPLICIT NONE -INTEGER, INTENT(IN) :: KIB, KIE, KIT, KJB, KJE, KJT, KKB, KKE, KKTB, KKTE, KKT -INTEGER, INTENT(IN) :: KKL !vert. levels type 1=MNH -1=ARO -REAL, INTENT(IN) :: PTSTEP ! Double Time step (single if cold start) -INTEGER, INTENT(IN) :: KRR ! Number of moist variable -LOGICAL, INTENT(IN) :: OSEDIC ! Switch for droplet sedim. -REAL, DIMENSION(KIT,KJT,KKT), INTENT(IN) :: PDZZ ! Layer thikness (m) -REAL, DIMENSION(KIT,KJT,KKT), INTENT(IN) :: PRHODREF! Reference density -REAL, DIMENSION(KIT,KJT,KKT), INTENT(IN) :: PPABST ! absolute pressure at t -REAL, DIMENSION(KIT,KJT,KKT), INTENT(IN) :: PTHT ! Theta at time t -REAL, DIMENSION(KIT,KJT,KKT), INTENT(IN) :: PRHODJ ! Dry density * Jacobian -REAL, DIMENSION(KIT,KJT,KKT), INTENT(INOUT) :: PRCS ! Cloud water m.r. source -REAL, DIMENSION(KIT,KJT,KKT), INTENT(IN) :: PRCT ! Cloud water m.r. at t -REAL, DIMENSION(KIT,KJT,KKT), INTENT(INOUT) :: PRRS ! Rain water m.r. source -REAL, DIMENSION(KIT,KJT,KKT), INTENT(IN) :: PRRT ! Rain water m.r. at t -REAL, DIMENSION(KIT,KJT,KKT), INTENT(INOUT) :: PRIS ! Pristine ice m.r. source -REAL, DIMENSION(KIT,KJT,KKT), INTENT(IN) :: PRIT ! Pristine ice m.r. at t -REAL, DIMENSION(KIT,KJT,KKT), INTENT(INOUT) :: PRSS ! Snow/aggregate m.r. source -REAL, DIMENSION(KIT,KJT,KKT), INTENT(IN) :: PRST ! Snow/aggregate m.r. at t -REAL, DIMENSION(KIT,KJT,KKT), INTENT(INOUT) :: PRGS ! Graupel m.r. source -REAL, DIMENSION(KIT,KJT,KKT), INTENT(IN) :: PRGT ! Graupel/hail m.r. at t -REAL, DIMENSION(KIT,KJT), INTENT(OUT) :: PINPRC ! Cloud instant precip -REAL, DIMENSION(KIT,KJT), INTENT(OUT) :: PINPRR ! Rain instant precip -REAL, DIMENSION(KIT,KJT), INTENT(OUT) :: PINPRI ! Pristine ice instant precip -REAL, DIMENSION(KIT,KJT), INTENT(OUT) :: PINPRS ! Snow instant precip -REAL, DIMENSION(KIT,KJT), INTENT(OUT) :: PINPRG ! Graupel instant precip -REAL, DIMENSION(KIT,KJT), OPTIONAL, INTENT(IN) :: PSEA ! Sea Mask -REAL, DIMENSION(KIT,KJT), OPTIONAL, INTENT(IN) :: PTOWN ! Fraction that is town -REAL, DIMENSION(KIT,KJT), OPTIONAL, INTENT(OUT) :: PINPRH ! Hail instant precip -REAL, DIMENSION(KIT,KJT,KKT), OPTIONAL, INTENT(IN) :: PRHT ! Hail m.r. at t -REAL, DIMENSION(KIT,KJT,KKT), OPTIONAL, INTENT(INOUT) :: PRHS ! Hail m.r. source -REAL, DIMENSION(KIT,KJT,KKT,KRR), OPTIONAL, INTENT(OUT) :: PFPR ! upper-air precipitation fluxes -END SUBROUTINE ICE4_SEDIMENTATION_SPLIT -END INTERFACE -END MODULE MODI_ICE4_SEDIMENTATION_SPLIT diff --git a/src/arome/micro/modi_ice4_sedimentation_stat.F90 b/src/arome/micro/modi_ice4_sedimentation_stat.F90 deleted file mode 100644 index a6a4988a158df42174873897fbfcc64d57b4e076..0000000000000000000000000000000000000000 --- a/src/arome/micro/modi_ice4_sedimentation_stat.F90 +++ /dev/null @@ -1,45 +0,0 @@ -MODULE MODI_ICE4_SEDIMENTATION_STAT -INTERFACE -SUBROUTINE ICE4_SEDIMENTATION_STAT(KIB, KIE, KIT, KJB, KJE, KJT, KKB, KKE, KKTB, KKTE, KKT, KKL, & - &PTSTEP, KRR, OSEDIC, & - &PDZZ, & - &PRHODREF, PPABST, PTHT, PRHODJ, & - &PRCS, PRCT, PRRS, PRRT, PRIS, PRIT,& - &PRSS, PRST, PRGS, PRGT,& - &PINPRC, PINPRR, PINPRI, PINPRS, PINPRG, & - &PSEA, PTOWN, PINPRH, PRHT, PRHS, PFPR) -IMPLICIT NONE -INTEGER, INTENT(IN) :: KIB, KIE, KIT, KJB, KJE, KJT, KKB, KKE, KKTB, KKTE, KKT -INTEGER, INTENT(IN) :: KKL !vert. levels type 1=MNH -1=ARO -REAL, INTENT(IN) :: PTSTEP ! Double Time step (single if cold start) -INTEGER, INTENT(IN) :: KRR ! Number of moist variable -LOGICAL, INTENT(IN) :: OSEDIC ! Switch for droplet sedim. -REAL, DIMENSION(KIT,KJT,KKT), INTENT(IN) :: PDZZ ! Layer thikness (m) -REAL, DIMENSION(KIT,KJT,KKT), INTENT(IN) :: PRHODREF! Reference density -REAL, DIMENSION(KIT,KJT,KKT), INTENT(IN) :: PPABST ! absolute pressure at t -REAL, DIMENSION(KIT,KJT,KKT), INTENT(IN) :: PTHT ! Theta at time t -REAL, DIMENSION(KIT,KJT,KKT), INTENT(IN) :: PRHODJ ! Dry density * Jacobian -REAL, DIMENSION(KIT,KJT,KKT), INTENT(INOUT) :: PRCS ! Cloud water m.r. source -REAL, DIMENSION(KIT,KJT,KKT), INTENT(IN) :: PRCT ! Cloud water m.r. at t -REAL, DIMENSION(KIT,KJT,KKT), INTENT(INOUT) :: PRRS ! Rain water m.r. source -REAL, DIMENSION(KIT,KJT,KKT), INTENT(IN) :: PRRT ! Rain water m.r. at t -REAL, DIMENSION(KIT,KJT,KKT), INTENT(INOUT) :: PRIS ! Pristine ice m.r. source -REAL, DIMENSION(KIT,KJT,KKT), INTENT(IN) :: PRIT ! Pristine ice m.r. at t -REAL, DIMENSION(KIT,KJT,KKT), INTENT(INOUT) :: PRSS ! Snow/aggregate m.r. source -REAL, DIMENSION(KIT,KJT,KKT), INTENT(IN) :: PRST ! Snow/aggregate m.r. at t -REAL, DIMENSION(KIT,KJT,KKT), INTENT(INOUT) :: PRGS ! Graupel m.r. source -REAL, DIMENSION(KIT,KJT,KKT), INTENT(IN) :: PRGT ! Graupel/hail m.r. at t -REAL, DIMENSION(KIT,KJT), INTENT(OUT) :: PINPRC ! Cloud instant precip -REAL, DIMENSION(KIT,KJT), INTENT(OUT) :: PINPRR ! Rain instant precip -REAL, DIMENSION(KIT,KJT), INTENT(OUT) :: PINPRI ! Pristine ice instant precip -REAL, DIMENSION(KIT,KJT), INTENT(OUT) :: PINPRS ! Snow instant precip -REAL, DIMENSION(KIT,KJT), INTENT(OUT) :: PINPRG ! Graupel instant precip -REAL, DIMENSION(KIT,KJT), OPTIONAL, INTENT(IN) :: PSEA ! Sea Mask -REAL, DIMENSION(KIT,KJT), OPTIONAL, INTENT(IN) :: PTOWN ! Fraction that is town -REAL, DIMENSION(KIT,KJT), OPTIONAL, INTENT(OUT) :: PINPRH ! Hail instant precip -REAL, DIMENSION(KIT,KJT,KKT), OPTIONAL, INTENT(IN) :: PRHT ! Hail m.r. at t -REAL, DIMENSION(KIT,KJT,KKT), OPTIONAL, INTENT(INOUT) :: PRHS ! Hail m.r. source -REAL, DIMENSION(KIT,KJT,KKT,KRR), OPTIONAL, INTENT(OUT) :: PFPR ! upper-air precipitation fluxes -END SUBROUTINE ICE4_SEDIMENTATION_STAT -END INTERFACE -END MODULE MODI_ICE4_SEDIMENTATION_STAT diff --git a/src/arome/micro/rain_ice.F90 b/src/arome/micro/rain_ice.F90 index 74496592a92b778164d80db44f8c4a59334d7d78..7b33f9f2a158a63c29309ec784d858feb50709be 100644 --- a/src/arome/micro/rain_ice.F90 +++ b/src/arome/micro/rain_ice.F90 @@ -164,8 +164,9 @@ USE MODD_BUDGET USE MODD_LES USE MODI_BUDGET USE MODI_ICE4_RAINFR_VERT -USE MODI_ICE4_SEDIMENTATION_STAT -USE MODI_ICE4_SEDIMENTATION_SPLIT +USE MODE_ICE4_SEDIMENTATION_STAT, ONLY: ICE4_SEDIMENTATION_STAT +USE MODE_ICE4_SEDIMENTATION_SPLIT, ONLY: ICE4_SEDIMENTATION_SPLIT +USE MODE_ICE4_SEDIMENTATION_SPLIT_MOMENTUM, ONLY: ICE4_SEDIMENTATION_SPLIT_MOMENTUM USE MODE_ICE4_NUCLEATION_WRAPPER, ONLY: ICE4_NUCLEATION_WRAPPER USE MODI_ICE4_TENDENCIES USE DDH_MIX, ONLY : TYP_DDH @@ -458,7 +459,6 @@ IF(.NOT. LSEDIM_AFTER) THEN !* 2.1 sedimentation ! IF(HSEDIM=='STAT') THEN - !SR: It *seems* that we must have two separate calls for ifort IF(KRR==7) THEN CALL ICE4_SEDIMENTATION_STAT(IIB, IIE, KIT, IJB, IJE, KJT, IKB, IKE, IKTB, IKTE, KKT, KKL, & &PTSTEP, KRR, OSEDIC, & @@ -483,11 +483,9 @@ IF(.NOT. LSEDIM_AFTER) THEN PINPRS(:,:) = PINPRS(:,:) + ZINPRI(:,:) !No negativity correction here as we apply sedimentation on PR.S*PTSTEP variables ELSEIF(HSEDIM=='SPLI') THEN - !SR: It *seems* that we must have two separate calls for ifort IF(KRR==7) THEN CALL ICE4_SEDIMENTATION_SPLIT(IIB, IIE, KIT, IJB, IJE, KJT, IKB, IKE, IKTB, IKTE, KKT, KKL, & - &PTSTEP, KRR, OSEDIC, & - &PDZZ, & + &PTSTEP, KRR, OSEDIC, PDZZ, & &PRHODREF, PPABST, PTHT, PRHODJ, & &PRCS, PRCT, PRRS, PRRT, PRIS, PRIT, PRSS, PRST, PRGS, PRGT,& &PINPRC, PINPRR, ZINPRI, PINPRS, PINPRG, & @@ -495,8 +493,7 @@ IF(.NOT. LSEDIM_AFTER) THEN &PINPRH=PINPRH, PRHT=PRHT, PRHS=PRHS, PFPR=PFPR) ELSE CALL ICE4_SEDIMENTATION_SPLIT(IIB, IIE, KIT, IJB, IJE, KJT, IKB, IKE, IKTB, IKTE, KKT, KKL, & - &PTSTEP, KRR, OSEDIC, & - &PDZZ, & + &PTSTEP, KRR, OSEDIC, PDZZ, & &PRHODREF, PPABST, PTHT, PRHODJ, & &PRCS, PRCT, PRRS, PRRT, PRIS, PRIT, PRSS, PRST, PRGS, PRGT,& &PINPRC, PINPRR, ZINPRI, PINPRS, PINPRG, & @@ -524,6 +521,27 @@ IF(.NOT. LSEDIM_AFTER) THEN CALL ABORT STOP END IF + + + + + + +!!!!! ajouter momentum + + + + + + + + + + + + + + ! !* 2.2 budget storage ! @@ -1559,6 +1577,40 @@ IF (LDEPOSC) THEN !cloud water deposition on vegetation PRCS(:,:,IKB) = PRCS(:,:,IKB) - XVDEPOSC * PRCT(:,:,IKB) / PDZZ(:,:,IKB) PINPRC(:,:) = PINPRC(:,:) + XVDEPOSC * PRCT(:,:,IKB) * PRHODREF(:,:,IKB)/XRHOLW + + + + + + + + + + + + + + + + + + + + !PINDEP(:,:) = XVDEPOSC * PRCT(:,:,KKB) * PRHODREF(:,:,KKB) /XRHOLW + + + + + + + + + + + + + + IF (LBUDGET_RC) CALL BUDGET (PRCS(:,:,:)*PRHODJ(:,:,:),7,'DEPO_BU_RRC',YDDDH, YDLDDH, YDMDDH) ENDIF diff --git a/src/mesonh/micro/ice4_sedimentation_split.f90 b/src/common/micro/mode_ice4_sedimentation_split.F90 similarity index 64% rename from src/mesonh/micro/ice4_sedimentation_split.f90 rename to src/common/micro/mode_ice4_sedimentation_split.F90 index cb0a147d070b865e8e9391bacf7ef143c3727311..195a9e894917f8144b35a45c163d383328c62bec 100644 --- a/src/mesonh/micro/ice4_sedimentation_split.f90 +++ b/src/common/micro/mode_ice4_sedimentation_split.F90 @@ -3,58 +3,14 @@ !MNH_LIC version 1. See LICENSE, CeCILL-C_V1-en.txt and CeCILL-C_V1-fr.txt !MNH_LIC for details. version 1. !----------------------------------------------------------------- -MODULE MODI_ICE4_SEDIMENTATION_SPLIT -INTERFACE -SUBROUTINE ICE4_SEDIMENTATION_SPLIT(KIB, KIE, KIT, KJB, KJE, KJT, KKB, KKE, KKTB, KKTE, KKT, KKL, & - &PTSTEP, KRR, OSEDIC, ODEPOSC, PVDEPOSC, PDZZ, & - &PRHODREF, PPABST, PTHT, PRHODJ, & - &PRCS, PRCT, PRRS, PRRT, PRIS, PRIT, PRSS, PRST, PRGS, PRGT,& - &PINPRC, PINDEP, PINPRR, PINPRI, PINPRS, PINPRG, & - &PSEA, PTOWN, & - &PINPRH, PRHT, PRHS, PFPR) +MODULE MODE_ICE4_SEDIMENTATION_SPLIT IMPLICIT NONE -INTEGER, INTENT(IN) :: KIB, KIE, KIT, KJB, KJE, KJT, KKB, KKE, KKTB, KKTE, KKT -INTEGER, INTENT(IN) :: KKL !vert. levels type 1=MNH -1=ARO -REAL, INTENT(IN) :: PTSTEP ! Double Time step (single if cold start) -INTEGER, INTENT(IN) :: KRR ! Number of moist variable -LOGICAL, INTENT(IN) :: OSEDIC ! Switch for droplet sedim. -LOGICAL, INTENT(IN) :: ODEPOSC ! Switch for droplet depos. -REAL, INTENT(IN) :: PVDEPOSC! Droplet deposition velocity -REAL, DIMENSION(KIT,KJT,KKT), INTENT(IN) :: PDZZ ! Layer thikness (m) -REAL, DIMENSION(KIT,KJT,KKT), INTENT(IN) :: PRHODREF! Reference density -REAL, DIMENSION(KIT,KJT,KKT), INTENT(IN) :: PPABST ! absolute pressure at t -REAL, DIMENSION(KIT,KJT,KKT), INTENT(IN) :: PTHT ! Theta at time t -REAL, DIMENSION(KIT,KJT,KKT), INTENT(IN) :: PRHODJ ! Dry density * Jacobian -REAL, DIMENSION(KIT,KJT,KKT), INTENT(INOUT) :: PRCS ! Cloud water m.r. source -REAL, DIMENSION(KIT,KJT,KKT), INTENT(IN) :: PRCT ! Cloud water m.r. at t -REAL, DIMENSION(KIT,KJT,KKT), INTENT(INOUT) :: PRRS ! Rain water m.r. source -REAL, DIMENSION(KIT,KJT,KKT), INTENT(IN) :: PRRT ! Rain water m.r. at t -REAL, DIMENSION(KIT,KJT,KKT), INTENT(INOUT) :: PRIS ! Pristine ice m.r. source -REAL, DIMENSION(KIT,KJT,KKT), INTENT(IN) :: PRIT ! Pristine ice m.r. at t -REAL, DIMENSION(KIT,KJT,KKT), INTENT(INOUT) :: PRSS ! Snow/aggregate m.r. source -REAL, DIMENSION(KIT,KJT,KKT), INTENT(IN) :: PRST ! Snow/aggregate m.r. at t -REAL, DIMENSION(KIT,KJT,KKT), INTENT(INOUT) :: PRGS ! Graupel m.r. source -REAL, DIMENSION(KIT,KJT,KKT), INTENT(IN) :: PRGT ! Graupel/hail m.r. at t -REAL, DIMENSION(:,:), INTENT(OUT) :: PINPRC ! Cloud instant precip -REAL, DIMENSION(:,:), INTENT(OUT) :: PINDEP ! Cloud instant deposition -REAL, DIMENSION(KIT,KJT), INTENT(OUT) :: PINPRR ! Rain instant precip -REAL, DIMENSION(KIT,KJT), INTENT(OUT) :: PINPRI ! Pristine ice instant precip -REAL, DIMENSION(KIT,KJT), INTENT(OUT) :: PINPRS ! Snow instant precip -REAL, DIMENSION(KIT,KJT), INTENT(OUT) :: PINPRG ! Graupel instant precip -REAL, DIMENSION(KIT,KJT), OPTIONAL,INTENT(IN) :: PSEA ! Sea Mask -REAL, DIMENSION(KIT,KJT), OPTIONAL,INTENT(IN) :: PTOWN ! Fraction that is town -REAL, DIMENSION(KIT,KJT), OPTIONAL, INTENT(OUT) :: PINPRH ! Hail instant precip -REAL, DIMENSION(KIT,KJT,KKT), OPTIONAL, INTENT(IN) :: PRHT ! Hail m.r. at t -REAL, DIMENSION(KIT,KJT,KKT), OPTIONAL, INTENT(INOUT) :: PRHS ! Hail m.r. source -REAL, DIMENSION(KIT,KJT,KKT,KRR), OPTIONAL, INTENT(OUT) :: PFPR ! upper-air precipitation fluxes -END SUBROUTINE ICE4_SEDIMENTATION_SPLIT -END INTERFACE -END MODULE MODI_ICE4_SEDIMENTATION_SPLIT +CONTAINS SUBROUTINE ICE4_SEDIMENTATION_SPLIT(KIB, KIE, KIT, KJB, KJE, KJT, KKB, KKE, KKTB, KKTE, KKT, KKL, & - &PTSTEP, KRR, OSEDIC, ODEPOSC, PVDEPOSC, PDZZ, & + &PTSTEP, KRR, OSEDIC, PDZZ, & &PRHODREF, PPABST, PTHT, PRHODJ, & &PRCS, PRCT, PRRS, PRRT, PRIS, PRIT, PRSS, PRST, PRGS, PRGT,& - &PINPRC, PINDEP, PINPRR, PINPRI, PINPRS, PINPRG, & + &PINPRC, PINPRR, PINPRI, PINPRS, PINPRG, & &PSEA, PTOWN, & &PINPRH, PRHT, PRHS, PFPR) !! @@ -70,16 +26,18 @@ SUBROUTINE ICE4_SEDIMENTATION_SPLIT(KIB, KIE, KIT, KJB, KJE, KJT, KKB, KKE, KKTB !! MODIFICATIONS !! ------------- !! -! P. Wautelet 11/02/2019: dimensions of PINPRC and PINDEP not necessarily KIT,KJT ! P. Wautelet 10/04/2019: replace ABORT and STOP calls by Print_msg ! ! !* 0. DECLARATIONS ! ------------ ! +USE PARKIND1, ONLY : JPRB +USE YOMHOOK , ONLY : LHOOK, DR_HOOK USE MODD_CST, ONLY: XRHOLW USE MODD_PARAM_ICE, ONLY: XSPLIT_MAXCFL -USE MODD_RAIN_ICE_DESCR, ONLY: XALPHAC,XALPHAC2,XCONC_LAND,XCONC_SEA,XCONC_URBAN,XLBC,XNUC,XNUC2 +USE MODD_RAIN_ICE_DESCR, ONLY: XALPHAC, XALPHAC2, XCONC_LAND, XCONC_SEA, XCONC_URBAN, & + & XLBC, XNUC, XNUC2 USE MODD_RAIN_ICE_PARAM, ONLY: XFSEDC ! USE MODE_MSG @@ -95,8 +53,6 @@ INTEGER, INTENT(IN) :: KKL !vert. levels t REAL, INTENT(IN) :: PTSTEP ! Double Time step (single if cold start) INTEGER, INTENT(IN) :: KRR ! Number of moist variable LOGICAL, INTENT(IN) :: OSEDIC ! Switch for droplet sedim. -LOGICAL, INTENT(IN) :: ODEPOSC ! Switch for droplet depos. -REAL, INTENT(IN) :: PVDEPOSC! Droplet deposition velocity REAL, DIMENSION(KIT,KJT,KKT), INTENT(IN) :: PDZZ ! Layer thikness (m) REAL, DIMENSION(KIT,KJT,KKT), INTENT(IN) :: PRHODREF! Reference density REAL, DIMENSION(KIT,KJT,KKT), INTENT(IN) :: PPABST ! absolute pressure at t @@ -112,14 +68,13 @@ REAL, DIMENSION(KIT,KJT,KKT), INTENT(INOUT) :: PRSS ! Snow/aggregat REAL, DIMENSION(KIT,KJT,KKT), INTENT(IN) :: PRST ! Snow/aggregate m.r. at t REAL, DIMENSION(KIT,KJT,KKT), INTENT(INOUT) :: PRGS ! Graupel m.r. source REAL, DIMENSION(KIT,KJT,KKT), INTENT(IN) :: PRGT ! Graupel/hail m.r. at t -REAL, DIMENSION(:,:), INTENT(OUT) :: PINPRC ! Cloud instant precip -REAL, DIMENSION(:,:), INTENT(OUT) :: PINDEP ! Cloud instant deposition +REAL, DIMENSION(KIT,KJT), INTENT(OUT) :: PINPRC ! Cloud instant precip REAL, DIMENSION(KIT,KJT), INTENT(OUT) :: PINPRR ! Rain instant precip REAL, DIMENSION(KIT,KJT), INTENT(OUT) :: PINPRI ! Pristine ice instant precip REAL, DIMENSION(KIT,KJT), INTENT(OUT) :: PINPRS ! Snow instant precip REAL, DIMENSION(KIT,KJT), INTENT(OUT) :: PINPRG ! Graupel instant precip -REAL, DIMENSION(KIT,KJT), OPTIONAL,INTENT(IN) :: PSEA ! Sea Mask -REAL, DIMENSION(KIT,KJT), OPTIONAL,INTENT(IN) :: PTOWN ! Fraction that is town +REAL, DIMENSION(KIT,KJT), OPTIONAL, INTENT(IN) :: PSEA ! Sea Mask +REAL, DIMENSION(KIT,KJT), OPTIONAL, INTENT(IN) :: PTOWN ! Fraction that is town REAL, DIMENSION(KIT,KJT), OPTIONAL, INTENT(OUT) :: PINPRH ! Hail instant precip REAL, DIMENSION(KIT,KJT,KKT), OPTIONAL, INTENT(IN) :: PRHT ! Hail m.r. at t REAL, DIMENSION(KIT,KJT,KKT), OPTIONAL, INTENT(INOUT) :: PRHS ! Hail m.r. source @@ -128,14 +83,14 @@ REAL, DIMENSION(KIT,KJT,KKT,KRR), OPTIONAL, INTENT(OUT) :: PFPR ! upper-air !* 0.2 declaration of local variables ! ! -INTEGER :: JI,JJ,JK +INTEGER :: JK INTEGER :: IRR !Workaround of PGI bug with OpenACC (at least up to 18.10 version) -LOGICAL :: GDEPOSC, GSEDIC !Workaround of PGI bug with OpenACC (at least up to 18.10 version) +LOGICAL :: GSEDIC !Workaround of PGI bug with OpenACC (at least up to 18.10 version) LOGICAL :: GPRESENT_PFPR, GPRESENT_PSEA REAL :: ZINVTSTEP -REAL, DIMENSION(SIZE(PRHODREF,1),SIZE(PRHODREF,2)) :: ZCONC_TMP ! Weighted concentration -REAL, DIMENSION(SIZE(PRHODREF,1),SIZE(PRHODREF,2),KKTB:KKTE) :: ZW ! work array -REAL, DIMENSION(SIZE(PRHODREF,1),SIZE(PRHODREF,2),SIZE(PRHODREF,3)) :: ZCONC3D, & ! droplet condensation +REAL, DIMENSION(KIT, KJT) :: ZCONC_TMP ! Weighted concentration +REAL, DIMENSION(KIT,KJT,KKTB:KKTE) :: ZW ! work array +REAL, DIMENSION(KIT, KJT, KKT) :: ZCONC3D, & ! droplet condensation & ZRAY, & ! Cloud Mean radius & ZLBC, & ! XLBC weighted by sea fraction & ZFSEDC, & @@ -146,13 +101,13 @@ REAL, DIMENSION(SIZE(PRHODREF,1),SIZE(PRHODREF,2),SIZE(PRHODREF,3)) :: ZCONC3D, & ZRST, & & ZRGT, & & ZRHT -! +REAL(KIND=JPRB) :: ZHOOK_HANDLE !------------------------------------------------------------------------------- ! +IF (LHOOK) CALL DR_HOOK('ICE4_SEDIMENTATION_SPLIT', 0, ZHOOK_HANDLE) !------------------------------------------------------------------------------- ! ! -GDEPOSC = ODEPOSC GSEDIC = OSEDIC IRR = KRR ! @@ -184,19 +139,19 @@ IF (GSEDIC) THEN ZCONC3D(:,:,:)= XCONC_LAND ZCONC_TMP(:,:)= XCONC_LAND IF (GPRESENT_PSEA) THEN - ZCONC_TMP(:,:)=PSEA(:,:)*XCONC_SEA+(1.-PSEA(:,:))*XCONC_LAND - DO JK=KKTB, KKTE - ZLBC(:,:,JK) = PSEA(:,:)*XLBC(2)+(1.-PSEA(:,:))*XLBC(1) - ZFSEDC(:,:,JK) = (PSEA(:,:)*XFSEDC(2)+(1.-PSEA(:,:))*XFSEDC(1)) - ZFSEDC(:,:,JK) = MAX(MIN(XFSEDC(1),XFSEDC(2)),ZFSEDC(:,:,JK)) - ZCONC3D(:,:,JK)= (1.-PTOWN(:,:))*ZCONC_TMP(:,:)+PTOWN(:,:)*XCONC_URBAN - ZRAY(:,:,JK) = 0.5*((1.-PSEA(:,:))*GAMMA(XNUC+1.0/XALPHAC)/(GAMMA(XNUC)) + & - PSEA(:,:)*GAMMA(XNUC2+1.0/XALPHAC2)/(GAMMA(XNUC2))) - END DO + ZCONC_TMP(:,:)=PSEA(:,:)*XCONC_SEA+(1.-PSEA(:,:))*XCONC_LAND + DO JK=KKTB, KKTE + ZLBC(:,:,JK) = PSEA(:,:)*XLBC(2)+(1.-PSEA(:,:))*XLBC(1) + ZFSEDC(:,:,JK) = (PSEA(:,:)*XFSEDC(2)+(1.-PSEA(:,:))*XFSEDC(1)) + ZFSEDC(:,:,JK) = MAX(MIN(XFSEDC(1),XFSEDC(2)),ZFSEDC(:,:,JK)) + ZCONC3D(:,:,JK)= (1.-PTOWN(:,:))*ZCONC_TMP(:,:)+PTOWN(:,:)*XCONC_URBAN + ZRAY(:,:,JK) = 0.5*((1.-PSEA(:,:))*GAMMA(XNUC+1.0/XALPHAC)/(GAMMA(XNUC)) + & + & PSEA(:,:)*GAMMA(XNUC2+1.0/XALPHAC2)/(GAMMA(XNUC2))) + END DO ELSE - ZCONC3D(:,:,:) = XCONC_LAND - ZRAY(:,:,:) = 0.5*(GAMMA(XNUC+1.0/XALPHAC)/(GAMMA(XNUC))) - END IF + ZCONC3D(:,:,:) = XCONC_LAND + ZRAY(:,:,:) = 0.5*(GAMMA(XNUC+1.0/XALPHAC)/(GAMMA(XNUC))) + END IF ZRAY(:,:,:) = MAX(1.,ZRAY(:,:,:)) ZLBC(:,:,:) = MAX(MIN(XLBC(1),XLBC(2)),ZLBC(:,:,:)) ENDIF @@ -235,7 +190,7 @@ ZW(:,:,KKTB:KKTE) =1./(PRHODREF(:,:,KKTB:KKTE)* PDZZ(:,:,KKTB:KKTE)) !* 2.1 for cloud ! IF (GSEDIC) THEN - CALL INTERNAL_SEDIM_SPLI(KIB,KIE,KIT,KJB,KJE,KJT, KKB, KKTB, KKTE, KKT, KKL, KRR, & + CALL INTERNAL_SEDIM_SPLI(KIB, KIE, KIT, KJB, KJE, KJT, KKB, KKTB, KKTE, KKT, KKL, KRR, & &XSPLIT_MAXCFL, & &PRHODREF, ZW, PDZZ, PPABST, PTHT, PTSTEP, & &2, & @@ -243,69 +198,54 @@ IF (GSEDIC) THEN &ZRAY, ZLBC, ZFSEDC, ZCONC3D, PFPR=PFPR) ENDIF ! -! -!* 2.1bis DROPLET DEPOSITION AT THE 1ST LEVEL ABOVE GROUND -! -IF (GDEPOSC) THEN - PINDEP (:,:) = 0. - DO JJ=KJB,KJE - DO JI=KIB,KIE - IF (PRCS(JI,JJ,KKB)>0.) THEN - PRCS(JI,JJ,KKB) = PRCS(JI,JJ,KKB) - PVDEPOSC * PRCT(JI,JJ,KKB) / PDZZ(JI,JJ,KKB) - PINPRC(JI,JJ) = PINPRC(JI,JJ) + PVDEPOSC * PRCT(JI,JJ,KKB) * PRHODREF(JI,JJ,KKB) /XRHOLW - PINDEP(JI,JJ) = PVDEPOSC * PRCT(JI,JJ,KKB) * PRHODREF(JI,JJ,KKB) /XRHOLW - END IF - END DO - END DO -END IF -! !* 2.2 for rain ! - CALL INTERNAL_SEDIM_SPLI(KIB,KIE,KIT,KJB,KJE,KJT, KKB, KKTB, KKTE, KKT, KKL, KRR, & + CALL INTERNAL_SEDIM_SPLI(KIB, KIE, KIT, KJB, KJE, KJT, KKB, KKTB, KKTE, KKT, KKL, KRR, & &XSPLIT_MAXCFL, & &PRHODREF, ZW, PDZZ, PPABST, PTHT, PTSTEP, & &3, & &ZRRT, PRRS, PINPRR, ZPRRS, & - PFPR=PFPR) + &PFPR=PFPR) ! !* 2.3 for pristine ice ! - CALL INTERNAL_SEDIM_SPLI(KIB,KIE,KIT,KJB,KJE,KJT, KKB, KKTB, KKTE, KKT, KKL, KRR, & + CALL INTERNAL_SEDIM_SPLI(KIB, KIE, KIT, KJB, KJE, KJT, KKB, KKTB, KKTE, KKT, KKL, KRR, & &XSPLIT_MAXCFL, & &PRHODREF, ZW, PDZZ, PPABST, PTHT, PTSTEP, & &4, & &ZRIT, PRIS, PINPRI, ZPRIS, & - PFPR=PFPR) + &PFPR=PFPR) ! !* 2.4 for aggregates/snow ! - CALL INTERNAL_SEDIM_SPLI(KIB,KIE,KIT,KJB,KJE,KJT, KKB, KKTB, KKTE, KKT, KKL, KRR, & + CALL INTERNAL_SEDIM_SPLI(KIB, KIE, KIT, KJB, KJE, KJT, KKB, KKTB, KKTE, KKT, KKL, KRR, & &XSPLIT_MAXCFL, & &PRHODREF, ZW, PDZZ, PPABST, PTHT, PTSTEP, & &5, & &ZRST, PRSS, PINPRS, ZPRSS, & - PFPR=PFPR) + &PFPR=PFPR) ! !* 2.5 for graupeln ! - CALL INTERNAL_SEDIM_SPLI(KIB,KIE,KIT,KJB,KJE,KJT, KKB, KKTB, KKTE, KKT, KKL, KRR, & + CALL INTERNAL_SEDIM_SPLI(KIB, KIE, KIT, KJB, KJE, KJT, KKB, KKTB, KKTE, KKT, KKL, KRR, & &XSPLIT_MAXCFL, & &PRHODREF, ZW, PDZZ, PPABST, PTHT, PTSTEP, & &6, & &ZRGT, PRGS, PINPRG, ZPRGS, & - PFPR=PFPR) + &PFPR=PFPR) ! !* 2.6 for hail ! IF (IRR==7) THEN - CALL INTERNAL_SEDIM_SPLI(KIB,KIE,KIT,KJB,KJE,KJT, KKB, KKTB, KKTE, KKT, KKL, KRR, & + CALL INTERNAL_SEDIM_SPLI(KIB, KIE, KIT, KJB, KJE, KJT, KKB, KKTB, KKTE, KKT, KKL, KRR, & &XSPLIT_MAXCFL, & &PRHODREF, ZW, PDZZ, PPABST, PTHT, PTSTEP, & &7, & &ZRHT, PRHS, PINPRH, ZPRHS, & - PFPR=PFPR) + &PFPR=PFPR) ENDIF ! +IF (LHOOK) CALL DR_HOOK('ICE4_SEDIMENTATION_SPLIT', 1, ZHOOK_HANDLE) ! CONTAINS ! @@ -313,23 +253,24 @@ CONTAINS !------------------------------------------------------------------------------- ! ! -SUBROUTINE INTERNAL_SEDIM_SPLI(KIB,KIE,KIT,KJB,KJE,KJT,KKB,KKTB,KKTE,KKT,KKL,KRR, & - &PMAXCFL,PRHODREF,POORHODZ,PDZZ,PPABST,PTHT,PTSTEP, & - &KSPE,PRXT,PRXS,PINPRX,PPRXS, & - &PRAY,PLBC,PFSEDC,PCONC3D,PFPR) +SUBROUTINE INTERNAL_SEDIM_SPLI(KIB, KIE, KIT, KJB, KJE, KJT, KKB, KKTB, KKTE, KKT, KKL, KRR, & + &PMAXCFL, PRHODREF, POORHODZ, PDZZ, PPABST, PTHT, PTSTEP, & + &KSPE, PRXT, PRXS, PINPRX, PPRXS, & + &PRAY, PLBC, PFSEDC, PCONC3D, PFPR) ! !* 0. DECLARATIONS ! ------------ ! -USE MODD_CST, ONLY: XCPD,XP00,XRD -USE MODD_RAIN_ICE_DESCR, ONLY: XCC,XCEXVT,XDC,XLBEXC,XRTMIN -USE MODD_RAIN_ICE_PARAM, ONLY: XEXCSEDI,XEXSEDG,XEXSEDH,XEXSEDR,XEXSEDS,XFSEDG,XFSEDH,XFSEDI,XFSEDR,XFSEDS +USE MODD_CST, ONLY: XCPD, XP00, XRD +USE MODD_RAIN_ICE_DESCR, ONLY: XCC, XCEXVT, XDC, XLBEXC, XRTMIN +USE MODD_RAIN_ICE_PARAM, ONLY: XEXCSEDI, XEXSEDG, XEXSEDH, XEXSEDR, XEXSEDS, XFSEDG, & + & XFSEDH, XFSEDI, XFSEDR, XFSEDS ! IMPLICIT NONE ! !* 0.1 Declarations of dummy arguments : ! -INTEGER, INTENT(IN) :: KIB,KIE,KIT, KJB,KJE,KJT, KKB, KKTB, KKTE, KKT, KKL, KRR +INTEGER, INTENT(IN) :: KIB, KIE, KIT, KJB, KJE, KJT, KKB, KKTB, KKTE, KKT, KKL, KRR REAL, INTENT(IN) :: PMAXCFL ! maximum CFL allowed REAL, DIMENSION(KIT,KJT,KKT), INTENT(IN) :: PRHODREF ! Reference density REAL, DIMENSION(KIT,KJT,KKTB:KKTE), INTENT(IN) :: POORHODZ ! One Over (Rhodref times delta Z) @@ -347,10 +288,10 @@ REAL, DIMENSION(KIT,KJT,KKT,KRR), INTENT(INOUT), OPTIONAL :: PFPR ! upper-air ! !* 0.2 declaration of local variables ! -character(len=10) :: yspe ! String for error message +CHARACTER(LEN=10) :: yspe ! String for error message INTEGER :: IDX, ISEDIM INTEGER :: JI, JJ, JK, JL -INTEGER, DIMENSION(KIT*KJT*KKT) :: I1,I2,I3 ! Used to replace the COUNT +INTEGER, DIMENSION(KIT*KJT*KKT) :: I1,I2,I3 ! Used to replace the COUNT LOGICAL :: GPRESENT_PFPR REAL :: ZINVTSTEP REAL :: ZZWLBDC, ZRAY, ZZT, ZZWLBDA, ZZCC @@ -358,8 +299,10 @@ REAL :: ZFSED, ZEXSED REAL, DIMENSION(KIT, KJT) :: ZMRCHANGE REAL, DIMENSION(KIT, KJT) :: ZMAX_TSTEP ! Maximum CFL in column REAL, DIMENSION(SIZE(XRTMIN)) :: ZRSMIN -REAL, DIMENSION(SIZE(PRHODREF,1),SIZE(PRHODREF,2)) :: ZREMAINT ! Remaining time until the timestep end -REAL, DIMENSION(SIZE(PRHODREF,1),SIZE(PRHODREF,2),0:SIZE(PRHODREF,3)+1) :: ZWSED ! Sedimentation fluxes +REAL, DIMENSION(KIT, KJT) :: ZREMAINT ! Remaining time until the timestep end +REAL, DIMENSION(KIT, KJT, 0:KKT+1) :: ZWSED ! Sedimentation fluxes +REAL(KIND=JPRB) :: ZHOOK_HANDLE +IF (LHOOK) CALL DR_HOOK('ICE4_SEDIMENTATION_SPLIT:INTERNAL_SEDIM_SPLIT', 0, ZHOOK_HANDLE) ! !------------------------------------------------------------------------------- IF (KSPE<2 .OR. KSPE>7) CALL PRINT_MSG(NVERB_FATAL,'GEN','INTERNAL_SEDIM_SPLIT','invalid species (KSPE variable)') @@ -409,14 +352,14 @@ DO WHILE (ANY(ZREMAINT>0.)) JK=I3(JL) IF(PRXT(JI,JJ,JK)>XRTMIN(KSPE)) THEN ZZWLBDC = PLBC(JI,JJ,JK) * PCONC3D(JI,JJ,JK) / & - (PRHODREF(JI,JJ,JK) * PRXT(JI,JJ,JK)) + &(PRHODREF(JI,JJ,JK) * PRXT(JI,JJ,JK)) ZZWLBDC = ZZWLBDC**XLBEXC ZRAY = PRAY(JI,JJ,JK) / ZZWLBDC ZZT = PTHT(JI,JJ,JK) * (PPABST(JI,JJ,JK)/XP00)**(XRD/XCPD) ZZWLBDA = 6.6E-8*(101325./PPABST(JI,JJ,JK))*(ZZT/293.15) ZZCC = XCC*(1.+1.26*ZZWLBDA/ZRAY) ZWSED(JI, JJ, JK) = PRHODREF(JI,JJ,JK)**(-XCEXVT +1 ) * & - ZZWLBDC**(-XDC)*ZZCC*PFSEDC(JI,JJ,JK) * PRXT(JI,JJ,JK) + &ZZWLBDC**(-XDC)*ZZCC*PFSEDC(JI,JJ,JK) * PRXT(JI,JJ,JK) ENDIF ENDDO ELSEIF(KSPE==4) THEN @@ -460,7 +403,7 @@ DO WHILE (ANY(ZREMAINT>0.)) JK=I3(JL) IF(PRXT(JI,JJ,JK)>XRTMIN(KSPE)) THEN ZWSED(JI, JJ, JK) = ZFSED * PRXT(JI, JJ, JK)**ZEXSED & - * PRHODREF(JI, JJ, JK)**(ZEXSED-XCEXVT) + & * PRHODREF(JI, JJ, JK)**(ZEXSED-XCEXVT) ENDIF ENDDO ENDIF @@ -471,7 +414,7 @@ DO WHILE (ANY(ZREMAINT>0.)) JK=I3(JL) IF(PRXT(JI,JJ,JK)>XRTMIN(KSPE) .AND. ZWSED(JI, JJ, JK)>1.E-20) THEN 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)) + & PRXT(JI, JJ, JK) * PDZZ(JI, JJ, JK) / ZWSED(JI, JJ, JK)) ENDIF ENDDO ZREMAINT(:,:) = ZREMAINT(:,:) - ZMAX_TSTEP(:,:) @@ -489,6 +432,8 @@ DO WHILE (ANY(ZREMAINT>0.)) ! END DO ! +IF (LHOOK) CALL DR_HOOK('ICE4_SEDIMENTATION_SPLIT:INTERNAL_SEDIM_SPLIT', 1, ZHOOK_HANDLE) END SUBROUTINE INTERNAL_SEDIM_SPLI ! END SUBROUTINE ICE4_SEDIMENTATION_SPLIT +END MODULE MODE_ICE4_SEDIMENTATION_SPLIT diff --git a/src/mesonh/micro/ice4_sedimentation_split_momentum.f90 b/src/common/micro/mode_ice4_sedimentation_split_momentum.f90 similarity index 86% rename from src/mesonh/micro/ice4_sedimentation_split_momentum.f90 rename to src/common/micro/mode_ice4_sedimentation_split_momentum.f90 index 927eb8ba536c7a0c0d726272ee4acafd8594892a..43d3094e4790ba7eaa98dc0d445c70fd3626a867 100644 --- a/src/mesonh/micro/ice4_sedimentation_split_momentum.f90 +++ b/src/common/micro/mode_ice4_sedimentation_split_momentum.f90 @@ -3,51 +3,9 @@ !MNH_LIC version 1. See LICENSE, CeCILL-C_V1-en.txt and CeCILL-C_V1-fr.txt !MNH_LIC for details. version 1. !----------------------------------------------------------------- -MODULE MODI_ICE4_SEDIMENTATION_SPLIT_MOMENTUM -INTERFACE -SUBROUTINE ICE4_SEDIMENTATION_SPLIT_MOMENTUM(KIB, KIE, KIT, KJB, KJE, KJT, KKB, KKE, KKTB, KKTE, KKT, KKL, & - &PTSTEP, KRR, OSEDIC, OMOMENTUM, & - &PSEA, PTOWN, PDZZ, & - &PRHODREF, PPABST, PTHT, PRHODJ, & - &PRCS, PRCT, PRRS, PRRT, PRIS, PRIT, PRSS, PRST, PRGS, PRGT,& - &PINPRC, PINPRR, PINPRI, PINPRS, PINPRG, & - &PINPRH, PRHT, PRHS, PFPR) +MODULE MODE_ICE4_SEDIMENTATION_SPLIT_MOMENTUM IMPLICIT NONE -INTEGER, INTENT(IN) :: KIB, KIE, KIT, KJB, KJE, KJT, KKB, KKE, KKTB, KKTE, KKT -INTEGER, INTENT(IN) :: KKL !vert. levels type 1=MNH -1=ARO -REAL, INTENT(IN) :: PTSTEP ! Double Time step (single if cold start) -INTEGER, INTENT(IN) :: KRR ! Number of moist variable -LOGICAL, INTENT(IN) :: OSEDIC ! Switch for droplet sedim. -LOGICAL, INTENT(IN) :: OMOMENTUM ! Switch to use momentum flux -REAL, DIMENSION(KIT,KJT), INTENT(IN) :: PSEA ! Sea Mask -REAL, DIMENSION(KIT,KJT), INTENT(IN) :: PTOWN ! Fraction that is town -REAL, DIMENSION(KIT,KJT,KKT), INTENT(IN) :: PDZZ ! Layer thikness (m) -REAL, DIMENSION(KIT,KJT,KKT), INTENT(IN) :: PRHODREF! Reference density -REAL, DIMENSION(KIT,KJT,KKT), INTENT(IN) :: PPABST ! absolute pressure at t -REAL, DIMENSION(KIT,KJT,KKT), INTENT(IN) :: PTHT ! Theta at time t -REAL, DIMENSION(KIT,KJT,KKT), INTENT(IN) :: PRHODJ ! Dry density * Jacobian -REAL, DIMENSION(KIT,KJT,KKT), INTENT(INOUT) :: PRCS ! Cloud water m.r. source -REAL, DIMENSION(KIT,KJT,KKT), INTENT(IN) :: PRCT ! Cloud water m.r. at t -REAL, DIMENSION(KIT,KJT,KKT), INTENT(INOUT) :: PRRS ! Rain water m.r. source -REAL, DIMENSION(KIT,KJT,KKT), INTENT(IN) :: PRRT ! Rain water m.r. at t -REAL, DIMENSION(KIT,KJT,KKT), INTENT(INOUT) :: PRIS ! Pristine ice m.r. source -REAL, DIMENSION(KIT,KJT,KKT), INTENT(IN) :: PRIT ! Pristine ice m.r. at t -REAL, DIMENSION(KIT,KJT,KKT), INTENT(INOUT) :: PRSS ! Snow/aggregate m.r. source -REAL, DIMENSION(KIT,KJT,KKT), INTENT(IN) :: PRST ! Snow/aggregate m.r. at t -REAL, DIMENSION(KIT,KJT,KKT), INTENT(INOUT) :: PRGS ! Graupel m.r. source -REAL, DIMENSION(KIT,KJT,KKT), INTENT(IN) :: PRGT ! Graupel/hail m.r. at t -REAL, DIMENSION(KIT,KJT), INTENT(OUT) :: PINPRC ! Cloud instant precip -REAL, DIMENSION(KIT,KJT), INTENT(OUT) :: PINPRR ! Rain instant precip -REAL, DIMENSION(KIT,KJT), INTENT(OUT) :: PINPRI ! Pristine ice instant precip -REAL, DIMENSION(KIT,KJT), INTENT(OUT) :: PINPRS ! Snow instant precip -REAL, DIMENSION(KIT,KJT), INTENT(OUT) :: PINPRG ! Graupel instant precip -REAL, DIMENSION(KIT,KJT), OPTIONAL, INTENT(OUT) :: PINPRH ! Hail instant precip -REAL, DIMENSION(KIT,KJT,KKT), OPTIONAL, INTENT(IN) :: PRHT ! Hail m.r. at t -REAL, DIMENSION(KIT,KJT,KKT), OPTIONAL, INTENT(INOUT) :: PRHS ! Hail m.r. source -REAL, DIMENSION(KIT,KJT,KKT,KRR), OPTIONAL, INTENT(OUT) :: PFPR ! upper-air precipitation fluxes -END SUBROUTINE ICE4_SEDIMENTATION_SPLIT_MOMENTUM -END INTERFACE -END MODULE MODI_ICE4_SEDIMENTATION_SPLIT_MOMENTUM +CONTAINS SUBROUTINE ICE4_SEDIMENTATION_SPLIT_MOMENTUM(KIB, KIE, KIT, KJB, KJE, KJT, KKB, KKE, KKTB, KKTE, KKT, KKL, & &PTSTEP, KRR, OSEDIC, OMOMENTUM, & &PSEA, PTOWN, PDZZ, & @@ -575,3 +533,5 @@ CONTAINS END SUBROUTINE INTERNAL_SEDIM_SPLI ! END SUBROUTINE ICE4_SEDIMENTATION_SPLIT_MOMENTUM +! +END MODULE MODE_ICE4_SEDIMENTATION_SPLIT_MOMENTUM diff --git a/src/arome/micro/ice4_sedimentation_stat.F90 b/src/common/micro/mode_ice4_sedimentation_stat.F90 similarity index 92% rename from src/arome/micro/ice4_sedimentation_stat.F90 rename to src/common/micro/mode_ice4_sedimentation_stat.F90 index 2884f0333029d22f419df9fd6f5b915be3a8a213..26b25e10350bb349df94d7d16c95a67d264e0f2a 100644 --- a/src/arome/micro/ice4_sedimentation_stat.F90 +++ b/src/common/micro/mode_ice4_sedimentation_stat.F90 @@ -1,11 +1,19 @@ +!MNH_LIC Copyright 1994-2021 CNRS, Meteo-France and Universite Paul Sabatier +!MNH_LIC This is part of the Meso-NH software governed by the CeCILL-C licence +!MNH_LIC version 1. See LICENSE, CeCILL-C_V1-en.txt and CeCILL-C_V1-fr.txt +!MNH_LIC for details. version 1. +!----------------------------------------------------------------- +MODULE MODE_ICE4_SEDIMENTATION_STAT +IMPLICIT NONE +CONTAINS SUBROUTINE ICE4_SEDIMENTATION_STAT(KIB, KIE, KIT, KJB, KJE, KJT, KKB, KKE, KKTB, KKTE, KKT, KKL, & - &PTSTEP, KRR, OSEDIC, & - &PDZZ, & + &PTSTEP, KRR, OSEDIC, PDZZ, & &PRHODREF, PPABST, PTHT, PRHODJ, & &PRCS, PRCT, PRRS, PRRT, PRIS, PRIT, & &PRSS, PRST, PRGS, PRGT,& &PINPRC, PINPRR, PINPRI, PINPRS, PINPRG, & - &PSEA, PTOWN, PINPRH, PRHT, PRHS, PFPR) + &PSEA, PTOWN, & + &PINPRH, PRHT, PRHS, PFPR) !! !!** PURPOSE @@ -19,8 +27,11 @@ SUBROUTINE ICE4_SEDIMENTATION_STAT(KIB, KIE, KIT, KJB, KJE, KJT, KKB, KKE, KKTB, !! MODIFICATIONS !! ------------- !! +! P. Wautelet 10/04/2019: replace ABORT and STOP calls by Print_msg +! P. Wautelet 28/05/2019: move COUNTJV function to tools.f90 !! Ryad El Khatib 09-Oct-2019 Substantial re-write for optimization !! (outerunrolling, vectorization, memory cache saving, unrolling) +! P. Wautelet 21/01/2021: initialize untouched part of PFPR ! ! !* 0. DECLARATIONS @@ -62,8 +73,8 @@ REAL, DIMENSION(KIT,KJT), INTENT(OUT) :: PINPRR ! Rain instant REAL, DIMENSION(KIT,KJT), INTENT(OUT) :: PINPRI ! Pristine ice instant precip REAL, DIMENSION(KIT,KJT), INTENT(OUT) :: PINPRS ! Snow instant precip REAL, DIMENSION(KIT,KJT), INTENT(OUT) :: PINPRG ! Graupel instant precip -REAL, DIMENSION(KIT,KJT), OPTIONAL, INTENT(IN) :: PSEA ! Sea Mask -REAL, DIMENSION(KIT,KJT), OPTIONAL, INTENT(IN) :: PTOWN ! Fraction that is town +REAL, DIMENSION(KIT,KJT), OPTIONAL, INTENT(IN) :: PSEA ! Sea Mask +REAL, DIMENSION(KIT,KJT), OPTIONAL, INTENT(IN) :: PTOWN ! Fraction that is town REAL, DIMENSION(KIT,KJT), OPTIONAL, INTENT(OUT) :: PINPRH ! Hail instant precip REAL, DIMENSION(KIT,KJT,KKT), OPTIONAL, INTENT(IN) :: PRHT ! Hail m.r. at t REAL, DIMENSION(KIT,KJT,KKT), OPTIONAL, INTENT(INOUT) :: PRHS ! Hail m.r. source @@ -81,8 +92,6 @@ REAL, DIMENSION(KIT,KJT,0:1,2:KRR) :: ZSED ! sedimentation flux array for each REAL :: FWSED1, FWSED2, PWSEDW, PWSEDWSUP, PINVTSTEP, PTSTEP1, PDZZ1, PRHODREF1, PRXT1 REAL(KIND=JPRB) :: ZHOOK_HANDLE -REAL(KIND=JPRB) :: ZHOOK_HANDLE_PRXS -REAL(KIND=JPRB) :: ZHOOK_HANDLE_PINPRX ! #ifndef REK ! 5 multiplications + 1 division => cost = 7X @@ -96,6 +105,12 @@ FWSED2(PWSEDW,PTSTEP1,PDZZ1,PWSEDWSUP)=MAX(0.,1.-PDZZ1/(PTSTEP1*PWSEDW))*PWSEDWS !------------------------------------------------------------------------------- IF (LHOOK) CALL DR_HOOK('ICE4_SEDIMENTATION_STAT',0,ZHOOK_HANDLE) +IF ( PRESENT( PFPR ) ) THEN + !Set to 0. to avoid undefined values (in files) + PFPR(:, :, : KKTB - 1, :) = 0. + PFPR(:, :, KKTE + 1 :, :) = 0. +END IF + !------------------------------------------------------------------------------- ! !* 1. compute the fluxes @@ -178,7 +193,6 @@ DO JK = KKE , KKB, -1*KKL ENDDO ENDIF - !IF (LHOOK) CALL DR_HOOK('ICE4_SEDIMENTATION_STAT:UPDATE_PRXS',0,ZHOOK_HANDLE_PRXS) DO JJ = KJB, KJE DO JI = KIB, KIE PRCS(JI,JJ,JK) = PRCS(JI,JJ,JK)+ZTSORHODZ(JI,JJ)*(ZSED(JI,JJ,IKPLUS,2)-ZSED(JI,JJ,IK,2))*ZINVTSTEP @@ -191,10 +205,8 @@ DO JK = KKE , KKB, -1*KKL ENDIF ENDDO ENDDO - !IF (LHOOK) CALL DR_HOOK('ICE4_SEDIMENTATION_STAT:UPDATE_PRXS',1,ZHOOK_HANDLE_PRXS) IF (JK==KKB) THEN - !IF (LHOOK) CALL DR_HOOK('ICE4_SEDIMENTATION_STAT:CP_INSTANT_PRECIP',0,ZHOOK_HANDLE_PINPRX) DO JJ = KJB, KJE DO JI = KIB, KIE PINPRC(JI,JJ) = ZSED(JI,JJ,IK,2)/XRHOLW @@ -207,7 +219,6 @@ DO JK = KKE , KKB, -1*KKL ENDIF ENDDO ENDDO - !IF (LHOOK) CALL DR_HOOK('ICE4_SEDIMENTATION_STAT:CP_INSTANT_PRECIP',1,ZHOOK_HANDLE_PINPRX) ENDIF ! shift mechanism : current level now takes the place of previous one @@ -387,3 +398,4 @@ CONTAINS END SUBROUTINE SHIFT END SUBROUTINE ICE4_SEDIMENTATION_STAT +END MODULE MODE_ICE4_SEDIMENTATION_STAT diff --git a/src/mesonh/micro/ice4_sedimentation_stat.f90 b/src/mesonh/micro/ice4_sedimentation_stat.f90 deleted file mode 100644 index 3cbb31493eac8295e718f2e1438e4e3a269520e7..0000000000000000000000000000000000000000 --- a/src/mesonh/micro/ice4_sedimentation_stat.f90 +++ /dev/null @@ -1,444 +0,0 @@ -!MNH_LIC Copyright 1994-2021 CNRS, Meteo-France and Universite Paul Sabatier -!MNH_LIC This is part of the Meso-NH software governed by the CeCILL-C licence -!MNH_LIC version 1. See LICENSE, CeCILL-C_V1-en.txt and CeCILL-C_V1-fr.txt -!MNH_LIC for details. version 1. -!----------------------------------------------------------------- -MODULE MODI_ICE4_SEDIMENTATION_STAT -INTERFACE -SUBROUTINE ICE4_SEDIMENTATION_STAT(KIB, KIE, KIT, KJB, KJE, KJT, KKB, KKE, KKTB, KKTE, KKT, KKL, & - &PTSTEP, KRR, OSEDIC, ODEPOSC, PVDEPOSC, PDZZ, & - &PRHODREF, PPABST, PTHT, PRHODJ, & - &PRCS, PRCT, PRRS, PRRT, PRIS, PRIT,& - &PRSS, PRST, PRGS, PRGT,& - &PINPRC, PINDEP, PINPRR, PINPRI, PINPRS, PINPRG, & - &PSEA, PTOWN, & - &PINPRH, PRHT, PRHS, PFPR) -IMPLICIT NONE -INTEGER, INTENT(IN) :: KIB, KIE, KIT, KJB, KJE, KJT, KKB, KKE, KKTB, KKTE, KKT -INTEGER, INTENT(IN) :: KKL !vert. levels type 1=MNH -1=ARO -REAL, INTENT(IN) :: PTSTEP ! Double Time step (single if cold start) -INTEGER, INTENT(IN) :: KRR ! Number of moist variable -LOGICAL, INTENT(IN) :: OSEDIC ! Switch for droplet sedim. -LOGICAL, INTENT(IN) :: ODEPOSC ! Switch for droplet depos. -REAL, INTENT(IN) :: PVDEPOSC! Droplet deposition velocity -REAL, DIMENSION(KIT,KJT,KKT), INTENT(IN) :: PDZZ ! Layer thikness (m) -REAL, DIMENSION(KIT,KJT,KKT), INTENT(IN) :: PRHODREF! Reference density -REAL, DIMENSION(KIT,KJT,KKT), INTENT(IN) :: PPABST ! absolute pressure at t -REAL, DIMENSION(KIT,KJT,KKT), INTENT(IN) :: PTHT ! Theta at time t -REAL, DIMENSION(KIT,KJT,KKT), INTENT(IN) :: PRHODJ ! Dry density * Jacobian -REAL, DIMENSION(KIT,KJT,KKT), INTENT(INOUT) :: PRCS ! Cloud water m.r. source -REAL, DIMENSION(KIT,KJT,KKT), INTENT(IN) :: PRCT ! Cloud water m.r. at t -REAL, DIMENSION(KIT,KJT,KKT), INTENT(INOUT) :: PRRS ! Rain water m.r. source -REAL, DIMENSION(KIT,KJT,KKT), INTENT(IN) :: PRRT ! Rain water m.r. at t -REAL, DIMENSION(KIT,KJT,KKT), INTENT(INOUT) :: PRIS ! Pristine ice m.r. source -REAL, DIMENSION(KIT,KJT,KKT), INTENT(IN) :: PRIT ! Pristine ice m.r. at t -REAL, DIMENSION(KIT,KJT,KKT), INTENT(INOUT) :: PRSS ! Snow/aggregate m.r. source -REAL, DIMENSION(KIT,KJT,KKT), INTENT(IN) :: PRST ! Snow/aggregate m.r. at t -REAL, DIMENSION(KIT,KJT,KKT), INTENT(INOUT) :: PRGS ! Graupel m.r. source -REAL, DIMENSION(KIT,KJT,KKT), INTENT(IN) :: PRGT ! Graupel/hail m.r. at t -REAL, DIMENSION(:,:), INTENT(OUT) :: PINPRC ! Cloud instant precip -REAL, DIMENSION(:,:), INTENT(OUT) :: PINDEP ! Cloud instant deposition -REAL, DIMENSION(KIT,KJT), INTENT(OUT) :: PINPRR ! Rain instant precip -REAL, DIMENSION(KIT,KJT), INTENT(OUT) :: PINPRI ! Pristine ice instant precip -REAL, DIMENSION(KIT,KJT), INTENT(OUT) :: PINPRS ! Snow instant precip -REAL, DIMENSION(KIT,KJT), INTENT(OUT) :: PINPRG ! Graupel instant precip -REAL, DIMENSION(KIT,KJT), OPTIONAL, INTENT(IN) :: PSEA ! Sea Mask -REAL, DIMENSION(KIT,KJT), OPTIONAL, INTENT(IN) :: PTOWN ! Fraction that is town -REAL, DIMENSION(KIT,KJT), OPTIONAL, INTENT(OUT) :: PINPRH ! Hail instant precip -REAL, DIMENSION(KIT,KJT,KKT), OPTIONAL, INTENT(IN) :: PRHT ! Hail m.r. at t -REAL, DIMENSION(KIT,KJT,KKT), OPTIONAL, INTENT(INOUT) :: PRHS ! Hail m.r. source -REAL, DIMENSION(KIT,KJT,KKT,KRR), OPTIONAL, INTENT(OUT) :: PFPR ! upper-air precipitation fluxes -END SUBROUTINE ICE4_SEDIMENTATION_STAT -END INTERFACE -END MODULE MODI_ICE4_SEDIMENTATION_STAT -SUBROUTINE ICE4_SEDIMENTATION_STAT(KIB, KIE, KIT, KJB, KJE, KJT, KKB, KKE, KKTB, KKTE, KKT, KKL, & - &PTSTEP, KRR, OSEDIC, ODEPOSC, PVDEPOSC, PDZZ, & - &PRHODREF, PPABST, PTHT, PRHODJ, & - &PRCS, PRCT, PRRS, PRRT, PRIS, PRIT, & - &PRSS, PRST, PRGS, PRGT,& - &PINPRC, PINDEP, PINPRR, PINPRI, PINPRS, PINPRG, & - &PSEA, PTOWN, & - &PINPRH, PRHT, PRHS, PFPR) - -!! -!!** PURPOSE -!! ------- -!! Computes the sedimentation -!! -!! AUTHOR -!! ------ -!! S. Riette from the plitting of rain_ice source code (nov. 2014) -!! -!! MODIFICATIONS -!! ------------- -!! -! P. Wautelet 10/04/2019: replace ABORT and STOP calls by Print_msg -! P. Wautelet 28/05/2019: move COUNTJV function to tools.f90 -! P. Wautelet 21/01/2021: initialize untouched part of PFPR -! -! -!* 0. DECLARATIONS -! ------------ -! -USE MODD_CST - -USE MODE_MSG - -IMPLICIT NONE -! -!* 0.1 Declarations of dummy arguments : -! -INTEGER, INTENT(IN) :: KIB, KIE, KIT, KJB, KJE, KJT, KKB, KKE, KKTB, KKTE, KKT -INTEGER, INTENT(IN) :: KKL !vert. levels type 1=MNH -1=ARO -REAL, INTENT(IN) :: PTSTEP ! Double Time step (single if cold start) -INTEGER, INTENT(IN) :: KRR ! Number of moist variable -LOGICAL, INTENT(IN) :: OSEDIC ! Switch for droplet sedim. -LOGICAL, INTENT(IN) :: ODEPOSC ! Switch for droplet depos. -REAL, INTENT(IN) :: PVDEPOSC! Droplet deposition velocity -REAL, DIMENSION(KIT,KJT,KKT), INTENT(IN) :: PDZZ ! Layer thikness (m) -REAL, DIMENSION(KIT,KJT,KKT), INTENT(IN) :: PRHODREF! Reference density -REAL, DIMENSION(KIT,KJT,KKT), INTENT(IN) :: PPABST ! absolute pressure at t -REAL, DIMENSION(KIT,KJT,KKT), INTENT(IN) :: PTHT ! Theta at time t -REAL, DIMENSION(KIT,KJT,KKT), INTENT(IN) :: PRHODJ ! Dry density * Jacobian -REAL, DIMENSION(KIT,KJT,KKT), INTENT(INOUT) :: PRCS ! Cloud water m.r. source -REAL, DIMENSION(KIT,KJT,KKT), INTENT(IN) :: PRCT ! Cloud water m.r. at t -REAL, DIMENSION(KIT,KJT,KKT), INTENT(INOUT) :: PRRS ! Rain water m.r. source -REAL, DIMENSION(KIT,KJT,KKT), INTENT(IN) :: PRRT ! Rain water m.r. at t -REAL, DIMENSION(KIT,KJT,KKT), INTENT(INOUT) :: PRIS ! Pristine ice m.r. source -REAL, DIMENSION(KIT,KJT,KKT), INTENT(IN) :: PRIT ! Pristine ice m.r. at t -REAL, DIMENSION(KIT,KJT,KKT), INTENT(INOUT) :: PRSS ! Snow/aggregate m.r. source -REAL, DIMENSION(KIT,KJT,KKT), INTENT(IN) :: PRST ! Snow/aggregate m.r. at t -REAL, DIMENSION(KIT,KJT,KKT), INTENT(INOUT) :: PRGS ! Graupel m.r. source -REAL, DIMENSION(KIT,KJT,KKT), INTENT(IN) :: PRGT ! Graupel/hail m.r. at t -REAL, DIMENSION(:,:), INTENT(OUT) :: PINPRC ! Cloud instant precip -REAL, DIMENSION(:,:), INTENT(OUT) :: PINDEP ! Cloud instant deposition -REAL, DIMENSION(KIT,KJT), INTENT(OUT) :: PINPRR ! Rain instant precip -REAL, DIMENSION(KIT,KJT), INTENT(OUT) :: PINPRI ! Pristine ice instant precip -REAL, DIMENSION(KIT,KJT), INTENT(OUT) :: PINPRS ! Snow instant precip -REAL, DIMENSION(KIT,KJT), INTENT(OUT) :: PINPRG ! Graupel instant precip -REAL, DIMENSION(KIT,KJT), OPTIONAL, INTENT(IN) :: PSEA ! Sea Mask -REAL, DIMENSION(KIT,KJT), OPTIONAL, INTENT(IN) :: PTOWN ! Fraction that is town -REAL, DIMENSION(KIT,KJT), OPTIONAL, INTENT(OUT) :: PINPRH ! Hail instant precip -REAL, DIMENSION(KIT,KJT,KKT), OPTIONAL, INTENT(IN) :: PRHT ! Hail m.r. at t -REAL, DIMENSION(KIT,KJT,KKT), OPTIONAL, INTENT(INOUT) :: PRHS ! Hail m.r. source -REAL, DIMENSION(KIT,KJT,KKT,KRR), OPTIONAL, INTENT(OUT) :: PFPR ! upper-air precipitation fluxes -! -!* 0.2 declaration of local variables -! -! -INTEGER :: JK -! -REAL :: ZINVTSTEP -REAL, DIMENSION(SIZE(PRHODREF,1),SIZE(PRHODREF,2),SIZE(PRHODREF,3)) & - :: ZW ! work array -REAL, DIMENSION(SIZE(PRHODREF,1),SIZE(PRHODREF,2),0:SIZE(PRHODREF,3)+1) & - :: ZWSED ! sedimentation fluxes -LOGICAL, DIMENSION(SIZE(PRHODREF,1),SIZE(PRHODREF,2)):: GDEP -! -! -!------------------------------------------------------------------------------- -! -ZINVTSTEP=1./PTSTEP - -IF ( PRESENT( PFPR ) ) THEN - !Set to 0. to avoid undefined values (in files) - PFPR(:, :, : KKTB - 1, :) = 0. - PFPR(:, :, KKTE + 1 :, :) = 0. -END IF -!------------------------------------------------------------------------------- -! -!* 1. compute the fluxes -! -! -DO JK = KKTB , KKTE - ZW(:,:,JK) =PTSTEP/(PRHODREF(:,:,JK)* PDZZ(:,:,JK) ) -END DO -! -!* 2.1 for cloud -! -IF (OSEDIC) THEN - CALL INTERNAL_SEDIM_STAT(KIB, KIE, KIT, KJB, KJE, KJT, KKB, KKE, KKT, KKTB, KKTE, KKL, & - &PRHODREF, PDZZ, ZW, PPABST, PTHT, PTSTEP, & - &2, & - &PRCT, PRCS, ZWSED, PSEA, PTOWN) - IF (PRESENT(PFPR)) THEN - DO JK = KKTB , KKTE - PFPR(:,:,JK,2)=ZWSED(:,:,JK) - ENDDO - ENDIF - PINPRC(:,:) = ZWSED(:,:,KKB)/XRHOLW ! in m/s -ENDIF -! -! -!* 2.1bis DROPLET DEPOSITION AT THE 1ST LEVEL ABOVE GROUND -! -IF (ODEPOSC) THEN - GDEP(:,:) = .FALSE. - GDEP(KIB:KIE,KJB:KJE) = PRCS(KIB:KIE,KJB:KJE,KKB) >0 - WHERE (GDEP) - PRCS(:,:,KKB) = PRCS(:,:,KKB) - PVDEPOSC * PRCT(:,:,KKB) / PDZZ(:,:,KKB) - PINPRC(:,:) = PINPRC(:,:) + PVDEPOSC * PRCT(:,:,KKB) * PRHODREF(:,:,KKB) /XRHOLW - PINDEP(:,:) = PVDEPOSC * PRCT(:,:,KKB) * PRHODREF(:,:,KKB) /XRHOLW - END WHERE -END IF -! -!* 2.2 for rain -! -CALL INTERNAL_SEDIM_STAT(KIB, KIE, KIT, KJB, KJE, KJT, KKB, KKE, KKT, KKTB, KKTE, KKL, & - &PRHODREF, PDZZ, ZW, PPABST, PTHT, PTSTEP, & - &3, & - &PRRT, PRRS, ZWSED) -IF (PRESENT(PFPR)) THEN - DO JK = KKTB , KKTE - PFPR(:,:,JK,3)=ZWSED(:,:,JK) - ENDDO -ENDIF -PINPRR(:,:) = ZWSED(:,:,KKB)/XRHOLW ! in m/s -! -!* 2.3 for pristine ice -! -CALL INTERNAL_SEDIM_STAT(KIB, KIE, KIT, KJB, KJE, KJT, KKB, KKE, KKT, KKTB, KKTE, KKL, & - &PRHODREF, PDZZ, ZW, PPABST, PTHT, PTSTEP, & - &4, & - &PRIT, PRIS, ZWSED) -IF (PRESENT(PFPR)) THEN - DO JK = KKTB , KKTE - PFPR(:,:,JK,4)=ZWSED(:,:,JK) - ENDDO -ENDIF -PINPRI(:,:) = ZWSED(:,:,KKB)/XRHOLW ! in m/s -! -!* 2.4 for aggregates/snow -! -CALL INTERNAL_SEDIM_STAT(KIB, KIE, KIT, KJB, KJE, KJT, KKB, KKE, KKT, KKTB, KKTE, KKL, & - &PRHODREF, PDZZ, ZW, PPABST, PTHT, PTSTEP, & - &5, & - &PRST, PRSS, ZWSED) -IF (PRESENT(PFPR)) THEN - DO JK = KKTB , KKTE - PFPR(:,:,JK,5)=ZWSED(:,:,JK) - ENDDO -ENDIF -PINPRS(:,:) = ZWSED(:,:,KKB)/XRHOLW ! in m/s -! -!* 2.5 for graupeln -! -CALL INTERNAL_SEDIM_STAT(KIB, KIE, KIT, KJB, KJE, KJT, KKB, KKE, KKT, KKTB, KKTE, KKL, & - &PRHODREF, PDZZ, ZW, PPABST, PTHT, PTSTEP, & - &6, & - &PRGT, PRGS, ZWSED) -IF (PRESENT(PFPR)) THEN - DO JK = KKTB , KKTE - PFPR(:,:,JK,6)=ZWSED(:,:,JK) - ENDDO -ENDIF -PINPRG(:,:) = ZWSED(:,:,KKB)/XRHOLW ! in m/s -! -!* 2.6 for hail -! -IF ( KRR == 7 ) THEN - CALL INTERNAL_SEDIM_STAT(KIB, KIE, KIT, KJB, KJE, KJT, KKB, KKE, KKT, KKTB, KKTE, KKL, & - &PRHODREF, PDZZ, ZW, PPABST, PTHT, PTSTEP, & - &7, & - &PRHT, PRHS, ZWSED) - IF (PRESENT(PFPR)) THEN - DO JK = KKTB , KKTE - PFPR(:,:,JK,7)=ZWSED(:,:,JK) - ENDDO - ENDIF - PINPRH(:,:) = ZWSED(:,:,KKB)/XRHOLW ! in m/s -ENDIF -! -! -CONTAINS - SUBROUTINE INTERNAL_SEDIM_STAT(KIB, KIE, KIT, KJB, KJE, KJT, KKB, KKE, KKT, KKTB, KKTE, KKL, & - &PRHODREF, PDZZ, PTSORHODZ, PPABST, PTHT, PTSTEP, & - &KSPE, & - &PRXT, PRXS, PWSED, PSEA, PTOWN) - ! - !* 0. DECLARATIONS - ! ------------ - ! - use mode_tools, only: Countjv - - USE MODD_RAIN_ICE_DESCR - USE MODD_RAIN_ICE_PARAM - - USE MODI_GAMMA - - IMPLICIT NONE - ! - !* 0.1 Declarations of dummy arguments : - ! - INTEGER, INTENT(IN) :: KIB, KIE, KIT, KJB, KJE, KJT, KKB, KKT, KKE, KKTB, KKTE, KKL - REAL, DIMENSION(KIT,KJT,KKT), INTENT(IN) :: PRHODREF ! Reference density - REAL, DIMENSION(KIT,KJT,KKT), INTENT(IN) :: PDZZ ! Layer thikness (m) - REAL, DIMENSION(KIT,KJT,KKT), INTENT(IN) :: PTSORHODZ ! TimeStep Over (Rhodref times delta Z) - REAL, DIMENSION(KIT,KJT,KKT), INTENT(IN) :: PPABST - REAL, DIMENSION(KIT,KJT,KKT), INTENT(IN) :: PTHT - REAL, INTENT(IN) :: PTSTEP - INTEGER, INTENT(IN) :: KSPE ! 1 for rc, 2 for rr... - REAL, DIMENSION(KIT,KJT,KKT), INTENT(IN) :: PRXT ! mr of specy X - REAL, DIMENSION(KIT,KJT,KKT), INTENT(INOUT) :: PRXS !Tendency of the specy KSPE - REAL, DIMENSION(KIT,KJT,0:KKT+1), INTENT(OUT) :: PWSED ! sedimentation flux - REAL, DIMENSION(KIT,KJT), OPTIONAL, INTENT(IN) :: PSEA ! Sea Mask - REAL, DIMENSION(KIT,KJT), OPTIONAL, INTENT(IN) :: PTOWN ! Fraction that is town - ! - !* 0.2 declaration of local variables - ! - ! - character(len=10) :: yspe ! String for error message - INTEGER :: JK, JCOUNT, JL, JI, JJ - INTEGER, DIMENSION(SIZE(PRHODREF,1)*SIZE(PRHODREF,2)) :: I1, I2 - REAL, DIMENSION(SIZE(PRHODREF,1),SIZE(PRHODREF,2),0:SIZE(PRHODREF,3)+1) & - :: ZWSEDW1, ZWSEDW2 ! sedimentation speed - REAL, DIMENSION(SIZE(PRHODREF,1),SIZE(PRHODREF,2)) :: ZQP - REAL :: ZINVTSTEP, ZH, ZP1, ZP2, ZZWLBDA, ZZWLBDC, ZZCC - REAL, DIMENSION(SIZE(PRHODREF,1),SIZE(PRHODREF,2),SIZE(PRHODREF,3)) :: ZCONC3D ! droplet condensation - REAL, DIMENSION(SIZE(PRHODREF,1),SIZE(PRHODREF,2),SIZE(PRHODREF,3)) :: & - ZRAY, & ! Cloud Mean radius - ZLBC, & ! XLBC weighted by sea fraction - ZFSEDC - REAL, DIMENSION(SIZE(PRHODREF,1),SIZE(PRHODREF,2)) & - :: ZCONC_TMP ! Weighted concentration - REAL :: ZFSED, ZEXSED - ! - !------------------------------------------------------------------------------- - ! - ! - !* 1. Parameters for cloud sedimentation - ! - IF(KSPE==2) THEN - ZRAY(:,:,:) = 0. - ZLBC(:,:,:) = XLBC(1) - ZFSEDC(:,:,:) = XFSEDC(1) - ZCONC3D(:,:,:)= XCONC_LAND - ZCONC_TMP(:,:)= XCONC_LAND - IF (PRESENT(PSEA)) THEN - ZCONC_TMP(:,:)=PSEA(:,:)*XCONC_SEA+(1.-PSEA(:,:))*XCONC_LAND - DO JK=KKTB,KKTE - ZLBC(:,:,JK) = PSEA(:,:)*XLBC(2)+(1.-PSEA(:,:))*XLBC(1) - ZFSEDC(:,:,JK) = (PSEA(:,:)*XFSEDC(2)+(1.-PSEA(:,:))*XFSEDC(1)) - ZFSEDC(:,:,JK) = MAX(MIN(XFSEDC(1),XFSEDC(2)),ZFSEDC(:,:,JK)) - ZCONC3D(:,:,JK)= (1.-PTOWN(:,:))*ZCONC_TMP(:,:)+PTOWN(:,:)*XCONC_URBAN - ZRAY(:,:,JK) = 0.5*((1.-PSEA(:,:))*GAMMA(XNUC+1.0/XALPHAC)/(GAMMA(XNUC)) + & - PSEA(:,:)*GAMMA(XNUC2+1.0/XALPHAC2)/(GAMMA(XNUC2))) - END DO - ELSE - ZCONC3D(:,:,:) = XCONC_LAND - ZRAY(:,:,:) = 0.5*(GAMMA(XNUC+1.0/XALPHAC)/(GAMMA(XNUC))) - END IF - ZRAY(:,:,:) = MAX(1.,ZRAY(:,:,:)) - ZLBC(:,:,:) = MAX(MIN(XLBC(1),XLBC(2)),ZLBC(:,:,:)) - ENDIF - ! - !* 2. compute the fluxes - ! - ! - ZINVTSTEP = 1./PTSTEP - PWSED(:,:,:) = 0. - ZWSEDW1(:,:,:) = 0. - ZWSEDW2(:,:,:) = 0. - ! calculation of ZP1, ZP2 and sedimentation flux - DO JK = KKE , KKB, -1*KKL - !estimation of q' taking into account incomming PWSED - ZQP(:,:)=PWSED(:,:,JK+KKL)*PTSORHODZ(:,:,JK) - JCOUNT=COUNTJV( (PRXT(:,:,JK) > XRTMIN(KSPE)) .OR. (ZQP(:,:) > XRTMIN(KSPE)) ,I1(:),I2(:)) - IF(KSPE==2) THEN - !******* for cloud - DO JL=1, JCOUNT - JI=I1(JL) - JJ=I2(JL) - !calculation of w - IF(PRXT(JI,JJ,JK) > XRTMIN(KSPE)) THEN - ZZWLBDA=6.6E-8*(101325./PPABST(JI,JJ,JK))*(PTHT(JI,JJ,JK)/293.15) - ZZWLBDC=(ZLBC(JI,JJ,JK)*ZCONC3D(JI,JJ,JK) & - &/(PRHODREF(JI,JJ,JK)*PRXT(JI,JJ,JK)))**XLBEXC - ZZCC=XCC*(1.+1.26*ZZWLBDA*ZZWLBDC/ZRAY(JI,JJ,JK)) !! ZCC : Fall speed - ZWSEDW1 (JI,JJ,JK)=PRHODREF(JI,JJ,JK)**(-XCEXVT ) * & - & ZZWLBDC**(-XDC)*ZZCC*ZFSEDC(JI,JJ,JK) - ENDIF - IF ( ZQP(JI,JJ) > XRTMIN(KSPE) ) THEN - ZZWLBDA=6.6E-8*(101325./PPABST(JI,JJ,JK))*(PTHT(JI,JJ,JK)/293.15) - ZZWLBDC=(ZLBC(JI,JJ,JK)*ZCONC3D(JI,JJ,JK) & - &/(PRHODREF(JI,JJ,JK)*ZQP(JI,JJ)))**XLBEXC - ZZCC=XCC*(1.+1.26*ZZWLBDA*ZZWLBDC/ZRAY(JI,JJ,JK)) !! ZCC : Fall speed - ZWSEDW2 (JI,JJ,JK)=PRHODREF(JI,JJ,JK)**(-XCEXVT ) * & - & ZZWLBDC**(-XDC)*ZZCC*ZFSEDC(JI,JJ,JK) - ENDIF - ENDDO - ELSEIF(KSPE==4) THEN - ! ******* for pristine ice - DO JL=1, JCOUNT - JI=I1(JL) - JJ=I2(JL) - !calculation of w - IF ( PRXT(JI,JJ,JK) > MAX(XRTMIN(KSPE),1.0E-7 ) ) THEN - ZWSEDW1 (JI,JJ,JK)= XFSEDI * & - & PRHODREF(JI,JJ,JK)**(-XCEXVT) * & ! McF&H - & MAX( 0.05E6,-0.15319E6-0.021454E6* & - & ALOG(PRHODREF(JI,JJ,JK)*PRXT(JI,JJ,JK)) )**XEXCSEDI - ENDIF - IF ( ZQP(JI,JJ) > MAX(XRTMIN(KSPE),1.0E-7 ) ) THEN - ZWSEDW2 (JI,JJ,JK)= XFSEDI * & - & PRHODREF(JI,JJ,JK)**(-XCEXVT) * & ! McF&H - & MAX( 0.05E6,-0.15319E6-0.021454E6* & - & ALOG(PRHODREF(JI,JJ,JK)*ZQP(JI,JJ)) )**XEXCSEDI - ENDIF - ENDDO - ELSE - ! ******* for other species - IF(KSPE==3) THEN - ZFSED=XFSEDR - ZEXSED=XEXSEDR - ELSEIF(KSPE==5) THEN - ZFSED=XFSEDS - ZEXSED=XEXSEDS - ELSEIF(KSPE==6) THEN - ZFSED=XFSEDG - ZEXSED=XEXSEDG - ELSEIF(KSPE==7) THEN - ZFSED=XFSEDH - ZEXSED=XEXSEDH - ELSE - write( yspe, '( I10 )' ) kspe - call Print_msg( NVERB_FATAL, 'GEN', 'ICE4_SEDIMENTATION_STAT', & - 'no sedimentation parameter for KSPE='//trim(yspe) ) - ENDIF - DO JL=1, JCOUNT - JI=I1(JL) - JJ=I2(JL) - !calculation of w - IF ( PRXT(JI,JJ,JK) > XRTMIN(KSPE) ) THEN - ZWSEDW1 (JI,JJ,JK)= ZFSED *PRXT(JI,JJ,JK)**(ZEXSED-1)* & - PRHODREF(JI,JJ,JK)**(ZEXSED-XCEXVT-1) - ENDIF - IF ( ZQP(JI,JJ) > XRTMIN(KSPE) ) THEN - ZWSEDW2 (JI,JJ,JK)= ZFSED *ZQP(JI,JJ)**(ZEXSED-1)* & - PRHODREF(JI,JJ,JK)**(ZEXSED-XCEXVT-1) - ENDIF - ENDDO - ENDIF - DO JJ = KJB, KJE - DO JI = KIB, KIE - ZH=PDZZ(JI,JJ,JK) - ZP1 = MIN(1., ZWSEDW1(JI,JJ,JK) * PTSTEP / ZH ) - IF (ZWSEDW2(JI,JJ,JK) /= 0.) THEN - ZP2 = MAX(0.,1 - ZH & - & / (PTSTEP*ZWSEDW2(JI,JJ,JK)) ) - ELSE - ZP2 = 0. - ENDIF - PWSED (JI,JJ,JK)=ZP1*PRHODREF(JI,JJ,JK)*& - &ZH*PRXT(JI,JJ,JK)& - &* ZINVTSTEP+ ZP2 * PWSED (JI,JJ,JK+KKL) - ENDDO - ENDDO - ENDDO - DO JK = KKTB , KKTE - PRXS(:,:,JK) = PRXS(:,:,JK) + & - & PTSORHODZ(:,:,JK)*(PWSED(:,:,JK+KKL)-PWSED(:,:,JK))*ZINVTSTEP - ENDDO - END SUBROUTINE INTERNAL_SEDIM_STAT - ! -END SUBROUTINE ICE4_SEDIMENTATION_STAT