diff --git a/src/LIB/SURCOUCHE/src/mode_field.f90 b/src/LIB/SURCOUCHE/src/mode_field.f90 index ce06ed50bf7d80102600d3423136c97d754915b4..648ac8b7546ff473b262245e84e3f186abd6fa6c 100644 --- a/src/LIB/SURCOUCHE/src/mode_field.f90 +++ b/src/LIB/SURCOUCHE/src/mode_field.f90 @@ -2316,6 +2316,20 @@ ALLOCATE(TFIELDLIST(IDX)%TFIELD_X3D(IMODEL)) IDX = IDX+1 ! IF(IDX>MAXFIELDS) CALL ERR_INI_FIELD_LIST() +TFIELDLIST(IDX)%CMNHNAME = 'ICEFR' +TFIELDLIST(IDX)%CSTDNAME = '' +TFIELDLIST(IDX)%CLONGNAME = 'ICEFR' +TFIELDLIST(IDX)%CUNITS = '1' +TFIELDLIST(IDX)%CDIR = 'XY' +TFIELDLIST(IDX)%CCOMMENT = 'X_Y_Z_ICE cloud FRaction' +TFIELDLIST(IDX)%NGRID = 1 +TFIELDLIST(IDX)%NTYPE = TYPEREAL +TFIELDLIST(IDX)%NDIMS = 3 +TFIELDLIST(IDX)%LTIMEDEP = .TRUE. +ALLOCATE(TFIELDLIST(IDX)%TFIELD_X3D(IMODEL)) +IDX = IDX+1 +! +IF(IDX>MAXFIELDS) CALL ERR_INI_FIELD_LIST() TFIELDLIST(IDX)%CMNHNAME = 'CIT' TFIELDLIST(IDX)%CSTDNAME = '' TFIELDLIST(IDX)%CLONGNAME = 'CIT' diff --git a/src/MNH/aircraft_balloon_evol.f90 b/src/MNH/aircraft_balloon_evol.f90 index 9642bcc4e8de8a731373a2db1fc3b94934abb8ce..aa0a13bf2ffc514375f355960a1fe6d750e5d481 100644 --- a/src/MNH/aircraft_balloon_evol.f90 +++ b/src/MNH/aircraft_balloon_evol.f90 @@ -144,15 +144,17 @@ USE MODD_NSV, ONLY : NSV_LIMA_NI,NSV_LIMA_NR,NSV_LIMA_NC USE MODD_PARAMETERS USE MODD_PARAM_LIMA, ONLY: XALPHAR_L=>XALPHAR,XNUR_L=>XNUR,XALPHAS_L=>XALPHAS,XNUS_L=>XNUS,& XALPHAG_L=>XALPHAG,XNUG_L=>XNUG, XALPHAI_L=>XALPHAI,XNUI_L=>XNUI,& - XRTMIN_L=>XRTMIN,XALPHAC_L=>XALPHAC,XNUC_L=>XNUC + XRTMIN_L=>XRTMIN,XALPHAC_L=>XALPHAC,XNUC_L=>XNUC,LSNOW_T_L=>LSNOW_T USE MODD_PARAM_LIMA_COLD, ONLY: XDI_L=>XDI,XLBEXI_L=>XLBEXI,XLBI_L=>XLBI,XAI_L=>XAI,XBI_L=>XBI,XC_I_L=>XC_I,& XLBEXS_L=>XLBEXS,XLBS_L=>XLBS,XCCS_L=>XCCS,& - XAS_L=>XAS,XBS_L=>XBS,XCXS_L=>XCXS + XAS_L=>XAS,XBS_L=>XBS,XCXS_L=>XCXS, & + XLBDAS_MAX,XLBDAS_MIN USE MODD_PARAM_LIMA_MIXED, ONLY: XDG_L=>XDG,XLBEXG_L=>XLBEXG,XLBG_L=>XLBG,XCCG_L=>XCCG,& XAG_L=>XAG,XBG_L=>XBG,XCXG_L=>XCXG,XCG_L=>XCG USE MODD_PARAM_LIMA_WARM, ONLY: XLBEXR_L=>XLBEXR,XLBR_L=>XLBR,XBR_L=>XBR,XAR_L=>XAR,& XBC_L=>XBC,XAC_L=>XAC USE MODD_PARAM_n, ONLY: CCLOUD, CSURF +USE MODD_PARAM_ICE, ONLY: LSNOW_T_I=>LSNOW_T USE MODD_RAIN_ICE_DESCR, ONLY: XALPHAR_I=>XALPHAR,XNUR_I=>XNUR,XLBEXR_I=>XLBEXR,& XLBR_I=>XLBR,XCCR_I=>XCCR,XBR_I=>XBR,XAR_I=>XAR,& XALPHAC_I=>XALPHAC,XNUC_I=>XNUC,& @@ -318,6 +320,7 @@ REAL :: ZAETOT,ZAETMP,ZREFLOC,ZQSCA,ZQBACK,ZQEXT ! tem REAL,DIMENSION(:),ALLOCATABLE :: ZAELOC,ZZMZ ! temporary arrays INTEGER :: JPTS_GAULAG=7 ! number of points for Gauss-Laguerre quadrature REAL :: ZLBDA ! slope distribution parameter +REAL :: ZN ! number concentration REAL :: ZFRAC_ICE ! ice water fraction REAL :: ZDELTA_EQUIV ! mass-equivalent Gauss-Laguerre point REAL :: ZFW ! liquid fraction @@ -1177,7 +1180,18 @@ IF ( TPFLYER%FLY) THEN ZLB=( ZA*ZCC*MOMG(ZALPHA,ZNU,ZB) )**(-ZLBEX) ENDIF END SELECT - ZLBDA=ZLB*(ZRHODREFZ(JK)*ZRZ(JK,JLOOP))**ZLBEX + IF (JLOOP.EQ.5 .AND. ( (CCLOUD=='LIMA'.AND.LSNOW_T_L).OR. & + (CCLOUD=='ICE3'.AND.LSNOW_T_I) ) ) THEN + IF (ZTEMPZ(JK)>-10.) THEN + ZLBDA = MAX(MIN(XLBDAS_MAX, 10**(14.554-0.0423*(ZTEMPZ(JK)+273.15))),XLBDAS_MIN) + ELSE + ZLBDA = MAX(MIN(XLBDAS_MAX, 10**(6.226-0.0106*(ZTEMPZ(JK)+273.15))),XLBDAS_MIN) + END IF + ZN=XLBS_L*ZRHODREFZ(JK)*ZRZ(JK,JLOOP)*ZLBDA**ZB + ELSE + ZLBDA=ZLB*(ZRHODREFZ(JK)*ZRZ(JK,JLOOP))**ZLBEX + ZN=ZCC*ZLBDA**ZCX + END IF ZREFLOC=0. ZAETMP=0. DO JJ=1,JPTS_GAULAG ! Gauss-Laguerre quadrature @@ -1209,8 +1223,8 @@ IF ( TPFLYER%FLY) THEN ZREFLOC=ZREFLOC+ZQBACK*ZX(JJ)**(ZNU-1)*ZDELTA_EQUIV**2*ZW(JJ) ZAETMP =ZAETMP +ZQEXT *ZX(JJ)**(ZNU-1)*ZDELTA_EQUIV**2*ZW(JJ) END DO - ZREFLOC=ZREFLOC*(XLAM_CRAD/XPI)**4*ZCC*ZLBDA**ZCX/(4.*GAMMA(ZNU)*.93) - ZAETMP=ZAETMP * XPI *ZCC*ZLBDA**ZCX/(4.*GAMMA(ZNU)) + ZREFLOC=ZREFLOC*(XLAM_CRAD/XPI)**4*ZN/(4.*GAMMA(ZNU)*.93) + ZAETMP=ZAETMP * XPI *ZN/(4.*GAMMA(ZNU)) TPFLYER%CRARE(IN,JK)=TPFLYER%CRARE(IN,JK)+ZREFLOC ZAELOC(JK)=ZAELOC(JK)+ZAETMP END IF diff --git a/src/MNH/deallocate_model1.f90 b/src/MNH/deallocate_model1.f90 index 3b0b4673893c19604b474aa94d5979f9d97c7b50..f73c628c8730c1f457010036351ef1b7263477b3 100644 --- a/src/MNH/deallocate_model1.f90 +++ b/src/MNH/deallocate_model1.f90 @@ -198,6 +198,10 @@ IF ( ASSOCIATED(XCLDFR) .AND. KCALL==2 ) THEN DEALLOCATE(XCLDFR) END IF ! +IF ( ASSOCIATED(XICEFR) .AND. KCALL==2 ) THEN + DEALLOCATE(XICEFR) +END IF +! IF ( ASSOCIATED(XRAINFR) .AND. KCALL==2 ) THEN DEALLOCATE(XRAINFR) END IF diff --git a/src/MNH/default_desfmn.f90 b/src/MNH/default_desfmn.f90 index c1be2c51e65e7c16f078c8010a3e21b7f2bf4727..e7eb7820ced7bf18d6c179750c9561a3a55a9c7b 100644 --- a/src/MNH/default_desfmn.f90 +++ b/src/MNH/default_desfmn.f90 @@ -219,6 +219,7 @@ END MODULE MODI_DEFAULT_DESFM_n ! Q. Rodier 06/2021: modify default value to LGZ=F (grey-zone corr.), LSEDI and OSEDC=T (LIMA sedimentation) ! F. Couvreux 06/2021: add LRELAX_UVMEAN_FRC ! Q. Rodier 07/2021: modify XPOND=1 +! Delbeke/Vie 03/2022 : KHKO option in LIMA !------------------------------------------------------------------------------- ! !* 0. DECLARATIONS @@ -274,12 +275,12 @@ USE MODD_ALLSTATION_n ! ! USE MODD_PARAM_LIMA, ONLY : LCOLD, LNUCL, LSEDI, LHHONI, LSNOW, LHAIL, LMEYERS, & - NMOD_IFN, XIFN_CONC, LIFN_HOM, CIFN_SPECIES, & + NMOD_IFN, NMOM_I, XIFN_CONC, LIFN_HOM, CIFN_SPECIES, & CINT_MIXING, NMOD_IMM, NIND_SPECIE, & - CPRISTINE_ICE_LIMA, CHEVRIMED_ICE_LIMA, & + YSNOW_T=>LSNOW_T, CPRISTINE_ICE_LIMA, CHEVRIMED_ICE_LIMA, & XFACTNUC_DEP, XFACTNUC_CON, & OWARM=>LWARM, LACTI, ORAIN=>LRAIN, OSEDC=>LSEDC, & - OACTIT=>LACTIT, LBOUND, LSPRO, LADJ, & + OACTIT=>LACTIT, LBOUND, LSPRO, LADJ, LKHKO, & NMOD_CCN, XCCN_CONC, & LCCN_HOM, CCCN_MODES, & YALPHAR=>XALPHAR, YNUR=>XNUR, & @@ -871,7 +872,8 @@ IF (KMI == 1) THEN CFRAC_ICE_SHALLOW_MF = 'S' LSEDIM_AFTER = .FALSE. LDEPOSC = .FALSE. - XVDEPOSC= 0.02 ! 2 cm/s + XVDEPOSC= 0.02 ! 2 cm/s + LSNOW_T=.FALSE. END IF ! !------------------------------------------------------------------------------- @@ -972,13 +974,13 @@ ENDIF !* 19.BIS SET DEFAULT VALUES FOR MODD_PARAM_LIMA : ! ---------------------------------------- ! -LPTSPLIT = .FALSE. -L_LFEEDBACKT = .TRUE. -L_NMAXITER = 1 -L_XMRSTEP = 0. -L_XTSTEP_TS = 0. -! IF (KMI == 1) THEN + LPTSPLIT = .FALSE. + L_LFEEDBACKT = .TRUE. + L_NMAXITER = 1 + L_XMRSTEP = 0. + L_XTSTEP_TS = 0. +! YNUC = 1.0 YALPHAC = 3.0 YNUR = 2.0 @@ -991,6 +993,7 @@ IF (KMI == 1) THEN OACTIT = .FALSE. LADJ = .TRUE. LSPRO = .FALSE. + LKHKO = .FALSE. ODEPOC = .FALSE. LBOUND = .FALSE. OACTTKE = .TRUE. @@ -1017,19 +1020,19 @@ IF (KMI == 1) THEN LCCN_HOM = .TRUE. CCCN_MODES = 'COPT' XCCN_CONC(:)=300. -ENDIF -! -IF (KMI == 1) THEN + LHHONI = .FALSE. LCOLD = .TRUE. LNUCL = .TRUE. LSEDI = .TRUE. LSNOW = .TRUE. LHAIL = .FALSE. + YSNOW_T = .TRUE. CPRISTINE_ICE_LIMA = 'PLAT' CHEVRIMED_ICE_LIMA = 'GRAU' XFACTNUC_DEP = 1.0 XFACTNUC_CON = 1.0 + NMOM_I = 2 NMOD_IFN = 1 NIND_SPECIE = 1 LMEYERS = .FALSE. diff --git a/src/MNH/endstep_budget.f90 b/src/MNH/endstep_budget.f90 index eef2796be9394b7317e9bd82c6a46ff3d417a344..947c0770403adadd9a59248a206102c50046cca6 100644 --- a/src/MNH/endstep_budget.f90 +++ b/src/MNH/endstep_budget.f90 @@ -105,7 +105,6 @@ integer :: jbu, jgrp ! call Print_msg( NVERB_DEBUG, 'BUD', 'Endstep_budget', 'called' ) -!Do not call Write_budget at the beginning of the simulation (this is necessary in the case were xbulen = xtstep) IF ( KTCOUNT == 1 ) RETURN SELECT CASE(CBUTYPE) diff --git a/src/MNH/ice4_fast_rg.f90 b/src/MNH/ice4_fast_rg.f90 index b84dda857e7a679561f062eabbe0570f7fc22408..0f7dea2179ad05277f16065f54b35c893dbb4deb 100644 --- a/src/MNH/ice4_fast_rg.f90 +++ b/src/MNH/ice4_fast_rg.f90 @@ -94,6 +94,7 @@ SUBROUTINE ICE4_FAST_RG(KSIZE, LDSOFT, PCOMPUTE, KRR, & !! ! P. Wautelet 26/04/2019: replace non-standard FLOAT function by REAL function ! P. Wautelet 29/05/2019: remove PACK/UNPACK intrinsics (to get more performance and better OpenACC support) +! J. Wurtz 03/2022: New snow characteristics with LSNOW_T ! ! !* 0. DECLARATIONS @@ -337,10 +338,10 @@ ELSE WHERE(GDRY(:)) PRG_TEND(:, IRSWETG)=XFSDRYG*ZZW(:) & ! RSDRYG / XCOLSG & - *(PLBDAS(:)**(XCXS-XBS))*( PLBDAG(:)**XCXG ) & - *(PRHODREF(:)**(-XCEXVT-1.)) & - *( XLBSDRYG1/( PLBDAG(:)**2 ) + & - XLBSDRYG2/( PLBDAG(:) * PLBDAS(:) ) + & + *(PRST(:))*( PLBDAG(:)**XCXG ) & + *(PRHODREF(:)**(-XCEXVT)) & + *( XLBSDRYG1/( PLBDAG(:)**2 ) + & ! Il s'agit de moments (?) + XLBSDRYG2/( PLBDAG(:) * PLBDAS(:) ) + & XLBSDRYG3/( PLBDAS(:)**2)) PRG_TEND(:, IRSDRYG)=PRG_TEND(:, IRSWETG)*XCOLSG*EXP(XCOLEXSG*(PT(:)-XTT)) END WHERE diff --git a/src/MNH/ice4_fast_rh.f90 b/src/MNH/ice4_fast_rh.f90 index fcac937485414ba29fd691cb0774a32cb3ea4a3c..a21c85f19308cffede426f7b2510f52ef5cd447a 100644 --- a/src/MNH/ice4_fast_rh.f90 +++ b/src/MNH/ice4_fast_rh.f90 @@ -84,6 +84,7 @@ SUBROUTINE ICE4_FAST_RH(KSIZE, LDSOFT, PCOMPUTE, PWETG, & !! ! P. Wautelet 26/04/2019: replace non-standard FLOAT function by REAL function ! P. Wautelet 29/05/2019: remove PACK/UNPACK intrinsics (to get more performance and better OpenACC support) +! J. Wurtz 03/2022: New snow characteristics with LSNOW_T ! ! !* 0. DECLARATIONS @@ -269,9 +270,9 @@ ELSE END DO ! WHERE(GWET(:)) - PRH_TEND(:, IRSWETH)=XFSWETH*ZZW(:) & ! RSWETH - *( PLBDAS(:)**(XCXS-XBS) )*( PLBDAH(:)**XCXH ) & - *( PRHODREF(:)**(-XCEXVT-1.) ) & + PRH_TEND(:, IRSWETH)=XFSWETH*ZZW(:) & + *( PRST(:))*( PLBDAH(:)**XCXH ) & + *( PRHODREF(:)**(-XCEXVT) ) & *( XLBSWETH1/( PLBDAH(:)**2 ) + & XLBSWETH2/( PLBDAH(:) * PLBDAS(:) ) + & XLBSWETH3/( PLBDAS(:)**2) ) diff --git a/src/MNH/ice4_fast_rs.f90 b/src/MNH/ice4_fast_rs.f90 index 6d71c7b61b8188969aa488a3b22d65ad15d7cc26..11dbd67f50ac67a9fc97f9d7f145ba85541a6e4c 100644 --- a/src/MNH/ice4_fast_rs.f90 +++ b/src/MNH/ice4_fast_rs.f90 @@ -77,6 +77,7 @@ SUBROUTINE ICE4_FAST_RS(KSIZE, LDSOFT, PCOMPUTE, & !! ! P. Wautelet 26/04/2019: replace non-standard FLOAT function by REAL function ! P. Wautelet 29/05/2019: remove PACK/UNPACK intrinsics (to get more performance and better OpenACC support) +! J. Wurtz 03/2022: New snow characteristics with LSNOW_T ! ! !* 0. DECLARATIONS @@ -85,7 +86,7 @@ SUBROUTINE ICE4_FAST_RS(KSIZE, LDSOFT, PCOMPUTE, & USE MODD_CST, ONLY: XALPI,XALPW,XBETAI,XBETAW,XCI,XCL,XCPV,XESTT,XGAMI,XGAMW,XLMTT,XLVTT,XMD,XMV,XRV,XTT, & XEPSILO USE MODD_PARAM_ICE, ONLY: LEVLIMIT, CSNOWRIMING -USE MODD_RAIN_ICE_DESCR, ONLY: XBS,XCEXVT,XCXS,XRTMIN +USE MODD_RAIN_ICE_DESCR, ONLY: XBS,XCEXVT,XCXS,XRTMIN,XALPHAS,XNUS,XFVELOS USE MODD_RAIN_ICE_PARAM, ONLY: NACCLBDAR,NACCLBDAS,NGAMINC,X0DEPS,X1DEPS,XACCINTP1R,XACCINTP1S,XACCINTP2R,XACCINTP2S, & XCRIMSG,XCRIMSS,XEX0DEPS,XEX1DEPS,XEXCRIMSG,XEXCRIMSS,XEXSRIMCG,XEXSRIMCG2,XFRACCSS, & XFSACCRG,XFSCVMG,XGAMINC_RIM1,XGAMINC_RIM1,XGAMINC_RIM2,XGAMINC_RIM4,XKER_RACCS, & @@ -170,9 +171,10 @@ ELSE PRS_TEND(:, IFREEZ1)=PKA(:)*(XTT-PT(:)) + & (PDV(:)*(XLVTT+(XCPV-XCL)*(PT(:)-XTT)) & *(XESTT-PRS_TEND(:, IFREEZ1))/(XRV*PT(:)) ) - PRS_TEND(:, IFREEZ1)=PRS_TEND(:, IFREEZ1)* ( X0DEPS* PLBDAS(:)**XEX0DEPS + & - X1DEPS*PCJ(:)*PLBDAS(:)**XEX1DEPS )/ & - ( PRHODREF(:)*(XLMTT-XCL*(XTT-PT(:))) ) + PRS_TEND(:, IFREEZ1)=PRS_TEND(:, IFREEZ1)* PRST(:) * ( X0DEPS* PLBDAS(:)**XEX0DEPS + & + X1DEPS*PCJ(:)*PLBDAS(:) **(XBS+XEX1DEPS)* & + (1+(XFVELOS/(2*PLBDAS(:)))**XALPHAS)**(-XNUS+XEX1DEPS/XALPHAS))/ & + ( PRHODREF(:)*(XLMTT-XCL*(XTT-PT(:))) ) PRS_TEND(:, IFREEZ2)=(PRHODREF(:)*(XLMTT+(XCI-XCL)*(XTT-PT(:))) ) / & ( PRHODREF(:)*(XLMTT-XCL*(XTT-PT(:))) ) END WHERE @@ -218,7 +220,7 @@ ELSE ! 5.1.1 select the PLBDAS ! DO JJ = 1, IGRIM - ZVEC1(JJ) = PLBDAS(I1(JJ)) + ZVEC1(JJ) = (PLBDAS(I1(JJ))**XALPHAS + XFVELOS**XALPHAS)**(1./XALPHAS) END DO ! ! 5.1.2 find the next lower indice for the PLBDAS in the geometrical @@ -244,8 +246,9 @@ ELSE ! WHERE (GRIM(:)) PRS_TEND(:, IRCRIMSS) = XCRIMSS * ZZW(:) * PRCT(:) & ! RCRIMSS - * PLBDAS(:)**XEXCRIMSS & - * PRHODREF(:)**(-XCEXVT) + * PRST(:)*(1+(XFVELOS/PLBDAS(:))**XALPHAS)**(-XNUS+XEXCRIMSS/XALPHAS) & + * PRHODREF(:)**(-XCEXVT+1.) & + * (PLBDAS(:)) ** (XEXCRIMSS+XBS) END WHERE ! ! 5.1.5 perform the linear interpolation of the normalized @@ -270,19 +273,21 @@ ELSE ! ! WHERE(GRIM(:)) - PRS_TEND(:, IRCRIMS)=XCRIMSG * PRCT(:) & ! RCRIMS - * PLBDAS(:)**XEXCRIMSG & - * PRHODREF(:)**(-XCEXVT) + PRS_TEND(:, IRCRIMS) = XCRIMSG * PRCT(:) & ! RCRIMS + * PRST(:)*(1+(XFVELOS/PLBDAS(:))**(XALPHAS))**(-XNUS+XEXCRIMSG/XALPHAS) & + * PRHODREF(:)**(-XCEXVT+1.) & + * PLBDAS(:)**(XBS+XEXCRIMSG) ZZW6(:) = PRS_TEND(:, IRCRIMS) - PRS_TEND(:, IRCRIMSS) ! RCRIMSG END WHERE IF(CSNOWRIMING=='M90 ')THEN !Murakami 1990 WHERE(GRIM(:)) - PRS_TEND(:, IRSRIMCG)=XSRIMCG * PLBDAS(:)**XEXSRIMCG*(1.0-ZZW(:)) + PRS_TEND(:, IRSRIMCG)=XSRIMCG * PRST(:)*PRHODREF(:)*PLBDAS(:)**(XEXSRIMCG+XBS)*(1.0-ZZW(:)) + PRS_TEND(:, IRSRIMCG)=ZZW6(:)*PRS_TEND(:, IRSRIMCG)/ & MAX(1.E-20, & - XSRIMCG3*XSRIMCG2*PLBDAS(:)**XEXSRIMCG2*(1.-ZZW2(:)) - & + XSRIMCG3*XSRIMCG2*PRST(:)*PRHODREF(:)*PLBDAS(:)**XEXSRIMCG2*(1.-ZZW2(:)) - & XSRIMCG3*PRS_TEND(:, IRSRIMCG)) END WHERE ELSE @@ -384,7 +389,7 @@ ELSE ! WHERE(GACC(:)) ZZW6(:) = & !! coef of RRACCS - XFRACCSS*( PLBDAS(:)**XCXS )*( PRHODREF(:)**(-XCEXVT-1.) ) & + XFRACCSS*( PRST(:)*PLBDAS(:)**XBS )*( PRHODREF(:)**(-XCEXVT) ) & *( XLBRACCS1/((PLBDAS(:)**2) ) + & XLBRACCS2/( PLBDAS(:) * PLBDAR(:) ) + & XLBRACCS3/( (PLBDAR(:)**2)) )/PLBDAR(:)**4 @@ -430,7 +435,7 @@ ELSE ! WHERE(GACC(:)) PRS_TEND(:, IRSACCRG) = XFSACCRG*ZZW(:)* & ! RSACCRG - ( PLBDAS(:)**(XCXS-XBS) )*( PRHODREF(:)**(-XCEXVT-1.) ) & + ( PRST(:))*( PRHODREF(:)**(-XCEXVT) ) & *( XLBSACCR1/((PLBDAR(:)**2) ) + & XLBSACCR2/( PLBDAR(:) * PLBDAS(:) ) + & XLBSACCR3/( (PLBDAS(:)**2)) )/PLBDAR(:) @@ -496,11 +501,16 @@ ELSE ! compute RSMLT ! PRSMLTG(:) = XFSCVMG*MAX( 0.0,( -PRSMLTG(:) * & - ( X0DEPS* PLBDAS(:)**XEX0DEPS + & - X1DEPS*PCJ(:)*PLBDAS(:)**XEX1DEPS ) - & - ( PRS_TEND(:, IRCRIMS) + PRS_TEND(:, IRRACCS) ) * & - ( PRHODREF(:)*XCL*(XTT-PT(:))) ) / & - ( PRHODREF(:)*XLMTT ) ) + PRST(:)*PRHODREF(:) * & + ( X0DEPS *PLBDAS(:)**XEX0DEPS + & + X1DEPS*PCJ(:)*(1+(XFVELOS/(2*PLBDAS(:))**XALPHAS))**(XNUS+XEX1DEPS/XALPHAS)*((PLBDAS(:))**(XBS+XEX1DEPS))) - & + ( PRS_TEND(:, IRCRIMS) + PRS_TEND(:, IRRACCS)) * & + ( PRHODREF(:)*XCL*(XTT-PT(:))) ) / & + ( PRHODREF(:)*XLMTT ) ) + ! + ! note that RSCVMG = RSMLT*XFSCVMG but no heat is exchanged (at the rate RSMLT) + ! because the graupeln produced by this process are still icy!!! + ! ! When T < XTT, rc is collected by snow (riming) to produce snow and graupel ! When T > XTT, if riming was still enabled, rc would produce snow and graupel with snow becomming graupel (conversion/melting) and graupel becomming rain (melting) ! To insure consistency when crossing T=XTT, rc collected with T>XTT must be transformed in rain. diff --git a/src/MNH/ice4_rsrimcg_old.f90 b/src/MNH/ice4_rsrimcg_old.f90 index cf88792b1b42827bdce381c4e2ad5644b3fed376..d250ddc0e38953cbec90d1615655ba1eb291b313 100644 --- a/src/MNH/ice4_rsrimcg_old.f90 +++ b/src/MNH/ice4_rsrimcg_old.f90 @@ -44,6 +44,7 @@ SUBROUTINE ICE4_RSRIMCG_OLD(KSIZE, ODSOFT, ODCOMPUTE, & !! ! P. Wautelet 26/04/2019: replace non-standard FLOAT function by REAL function ! P. Wautelet 29/05/2019: remove PACK/UNPACK intrinsics (to get more performance and better OpenACC support) +! J. Wurtz 03/2022: New snow characteristics with LSNOW_T ! ! !* 0. DECLARATIONS @@ -132,7 +133,7 @@ IF(.NOT. ODSOFT) THEN ! WHERE(GRIM(:)) PRSRIMCG_MR(:) = XSRIMCG * PLBDAS(:)**XEXSRIMCG & ! RSRIMCG - * (1.0 - ZZW(:) )/PRHODREF(:) + * (1.0 - ZZW(:) )*PRST(:) PRSRIMCG_MR(:)=MIN(PRST(:), PRSRIMCG_MR(:)) END WHERE END IF diff --git a/src/MNH/ice4_sedimentation_split.f90 b/src/MNH/ice4_sedimentation_split.f90 index cb0a147d070b865e8e9391bacf7ef143c3727311..f9369a8783af23ad117f46ab51489a44afad0436 100644 --- a/src/MNH/ice4_sedimentation_split.f90 +++ b/src/MNH/ice4_sedimentation_split.f90 @@ -6,11 +6,12 @@ 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, & + &PTSTEP, KRR, OSEDIC, ODEPOSC, PVDEPOSC, PDZZ, & + &PRHODREF, PPABST, PTHT, PRHODJ, & + & PLBDAS, & + &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 @@ -25,6 +26,7 @@ REAL, DIMENSION(KIT,KJT,KKT), INTENT(IN) :: PRHODREF! Reference den 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(IN) :: PLBDAS ! lambda parameter for snow 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 @@ -51,11 +53,12 @@ END SUBROUTINE ICE4_SEDIMENTATION_SPLIT END INTERFACE END MODULE MODI_ICE4_SEDIMENTATION_SPLIT 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, & + &PTSTEP, KRR, OSEDIC, ODEPOSC, PVDEPOSC, PDZZ, & + &PRHODREF, PPABST, PTHT, PRHODJ, & + & PLBDAS, & + &PRCS, PRCT, PRRS, PRRT, PRIS, PRIT, PRSS, PRST, PRGS, PRGT, & + &PINPRC, PINDEP, PINPRR, PINPRI, PINPRS, PINPRG, & + &PSEA, PTOWN, & &PINPRH, PRHT, PRHS, PFPR) !! !!** PURPOSE @@ -72,6 +75,7 @@ SUBROUTINE ICE4_SEDIMENTATION_SPLIT(KIB, KIE, KIT, KJB, KJE, KJT, KKB, KKE, KKTB !! ! 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 +! J. Wurtz 03/2022: New snow characteristics with LSNOW_T ! ! !* 0. DECLARATIONS @@ -102,6 +106,7 @@ REAL, DIMENSION(KIT,KJT,KKT), INTENT(IN) :: PRHODREF! Reference den 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(IN) :: PLBDAS ! lambda parameter for snow 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 @@ -239,6 +244,7 @@ IF (GSEDIC) THEN &XSPLIT_MAXCFL, & &PRHODREF, ZW, PDZZ, PPABST, PTHT, PTSTEP, & &2, & + &PLBDAS, & &ZRCT, PRCS, PINPRC, ZPRCS, & &ZRAY, ZLBC, ZFSEDC, ZCONC3D, PFPR=PFPR) ENDIF @@ -265,8 +271,9 @@ END IF &XSPLIT_MAXCFL, & &PRHODREF, ZW, PDZZ, PPABST, PTHT, PTSTEP, & &3, & + &PLBDAS, & &ZRRT, PRRS, PINPRR, ZPRRS, & - PFPR=PFPR) + &PFPR=PFPR) ! !* 2.3 for pristine ice ! @@ -274,6 +281,7 @@ END IF &XSPLIT_MAXCFL, & &PRHODREF, ZW, PDZZ, PPABST, PTHT, PTSTEP, & &4, & + &PLBDAS, & &ZRIT, PRIS, PINPRI, ZPRIS, & PFPR=PFPR) ! @@ -283,6 +291,7 @@ END IF &XSPLIT_MAXCFL, & &PRHODREF, ZW, PDZZ, PPABST, PTHT, PTSTEP, & &5, & + &PLBDAS, & &ZRST, PRSS, PINPRS, ZPRSS, & PFPR=PFPR) ! @@ -292,6 +301,7 @@ END IF &XSPLIT_MAXCFL, & &PRHODREF, ZW, PDZZ, PPABST, PTHT, PTSTEP, & &6, & + &PLBDAS, & &ZRGT, PRGS, PINPRG, ZPRGS, & PFPR=PFPR) ! @@ -302,6 +312,7 @@ IF (IRR==7) THEN &XSPLIT_MAXCFL, & &PRHODREF, ZW, PDZZ, PPABST, PTHT, PTSTEP, & &7, & + &PLBDAS, & &ZRHT, PRHS, PINPRH, ZPRHS, & PFPR=PFPR) ENDIF @@ -315,15 +326,16 @@ 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, & + &KSPE,PLBDAS,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_DESCR, ONLY: XCC,XCEXVT,XDC,XLBEXC,XRTMIN,XALPHAS,XNUS,XBS,XFVELOS USE MODD_RAIN_ICE_PARAM, ONLY: XEXCSEDI,XEXSEDG,XEXSEDH,XEXSEDR,XEXSEDS,XFSEDG,XFSEDH,XFSEDI,XFSEDR,XFSEDS + ! IMPLICIT NONE ! @@ -344,6 +356,7 @@ REAL, DIMENSION(KIT,KJT), INTENT(OUT) :: 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), INTENT(INOUT), OPTIONAL :: PFPR ! upper-air precipitation fluxes + REAL, DIMENSION(KIT,KJT,KKT), INTENT(IN) :: PLBDAS ! lambda parameter for snow ! Modif Wurtz ! !* 0.2 declaration of local variables ! @@ -433,15 +446,30 @@ DO WHILE (ANY(ZREMAINT>0.)) & ALOG(PRHODREF(JI,JJ,JK)*PRXT(JI,JJ,JK)) )**XEXCSEDI ENDIF ENDDO + ELSEIF(KSPE==5) THEN + ! ******* for snow + ZWSED(:,:,:) = 0. + DO JL=1, ISEDIM + JI=I1(JL) + JJ=I2(JL) + JK=I3(JL) + IF(PRXT(JI,JJ,JK)> XRTMIN(KSPE)) THEN + + ZWSED(JI, JJ, JK) = XFSEDS * & + & PRXT(JI,JJ,JK)* & + & PRHODREF(JI,JJ,JK)**(1-XCEXVT) * & + & (1 + (XFVELOS/PLBDAS(JI, JJ, JK))**XALPHAS)** (-XNUS+XEXSEDS/XALPHAS) * & + & PLBDAS(JI, JJ, JK) ** (XBS+XEXSEDS) + ! GAMMAGEN_LH_EXTENDED + + ENDIF + ENDDO ELSE ! ******* for other species SELECT CASE(KSPE) CASE(3) ZFSED=XFSEDR ZEXSED=XEXSEDR - CASE(5) - ZFSED=XFSEDS - ZEXSED=XEXSEDS CASE(6) ZFSED=XFSEDG ZEXSED=XEXSEDG diff --git a/src/MNH/ice4_sedimentation_stat.f90 b/src/MNH/ice4_sedimentation_stat.f90 index 3cbb31493eac8295e718f2e1438e4e3a269520e7..891223920fd73ea2bbbeed059ce1669aeebd2d51 100644 --- a/src/MNH/ice4_sedimentation_stat.f90 +++ b/src/MNH/ice4_sedimentation_stat.f90 @@ -8,6 +8,7 @@ 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, & + & PLBDAS, & &PRCS, PRCT, PRRS, PRRT, PRIS, PRIT,& &PRSS, PRST, PRGS, PRGT,& &PINPRC, PINDEP, PINPRR, PINPRI, PINPRS, PINPRG, & @@ -26,6 +27,7 @@ REAL, DIMENSION(KIT,KJT,KKT), INTENT(IN) :: PRHODREF! Reference den 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(IN) :: PLBDAS ! lambda parameter for snow 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 @@ -54,6 +56,7 @@ 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, & + & PLBDAS, & &PRCS, PRCT, PRRS, PRRT, PRIS, PRIT, & &PRSS, PRST, PRGS, PRGT,& &PINPRC, PINDEP, PINPRR, PINPRI, PINPRS, PINPRG, & @@ -75,6 +78,7 @@ SUBROUTINE ICE4_SEDIMENTATION_STAT(KIB, KIE, KIT, KJB, KJE, KJT, KKB, KKE, KKTB, ! 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 +! J. Wurtz 03/2022: New snow characteristics with LSNOW_T ! ! !* 0. DECLARATIONS @@ -83,7 +87,8 @@ SUBROUTINE ICE4_SEDIMENTATION_STAT(KIB, KIE, KIT, KJB, KJE, KJT, KKB, KKE, KKTB, USE MODD_CST USE MODE_MSG - +USE MODD_RAIN_ICE_DESCR +! IMPLICIT NONE ! !* 0.1 Declarations of dummy arguments : @@ -100,6 +105,7 @@ REAL, DIMENSION(KIT,KJT,KKT), INTENT(IN) :: PRHODREF! Reference den 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(IN) :: PLBDAS ! lambda parameter for snow 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 @@ -160,6 +166,7 @@ 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, & + &PLBDAS, &!Modif Wurtz &PRCT, PRCS, ZWSED, PSEA, PTOWN) IF (PRESENT(PFPR)) THEN DO JK = KKTB , KKTE @@ -187,6 +194,7 @@ END IF CALL INTERNAL_SEDIM_STAT(KIB, KIE, KIT, KJB, KJE, KJT, KKB, KKE, KKT, KKTB, KKTE, KKL, & &PRHODREF, PDZZ, ZW, PPABST, PTHT, PTSTEP, & &3, & + &PLBDAS, & &PRRT, PRRS, ZWSED) IF (PRESENT(PFPR)) THEN DO JK = KKTB , KKTE @@ -200,6 +208,7 @@ PINPRR(:,:) = ZWSED(:,:,KKB)/XRHOLW ! in m/s CALL INTERNAL_SEDIM_STAT(KIB, KIE, KIT, KJB, KJE, KJT, KKB, KKE, KKT, KKTB, KKTE, KKL, & &PRHODREF, PDZZ, ZW, PPABST, PTHT, PTSTEP, & &4, & + &PLBDAS, & &PRIT, PRIS, ZWSED) IF (PRESENT(PFPR)) THEN DO JK = KKTB , KKTE @@ -213,6 +222,7 @@ PINPRI(:,:) = ZWSED(:,:,KKB)/XRHOLW ! in m/s CALL INTERNAL_SEDIM_STAT(KIB, KIE, KIT, KJB, KJE, KJT, KKB, KKE, KKT, KKTB, KKTE, KKL, & &PRHODREF, PDZZ, ZW, PPABST, PTHT, PTSTEP, & &5, & + &PLBDAS, & &PRST, PRSS, ZWSED) IF (PRESENT(PFPR)) THEN DO JK = KKTB , KKTE @@ -226,6 +236,7 @@ PINPRS(:,:) = ZWSED(:,:,KKB)/XRHOLW ! in m/s CALL INTERNAL_SEDIM_STAT(KIB, KIE, KIT, KJB, KJE, KJT, KKB, KKE, KKT, KKTB, KKTE, KKL, & &PRHODREF, PDZZ, ZW, PPABST, PTHT, PTSTEP, & &6, & + &PLBDAS, & &PRGT, PRGS, ZWSED) IF (PRESENT(PFPR)) THEN DO JK = KKTB , KKTE @@ -240,6 +251,7 @@ 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, & + &PLBDAS, & &PRHT, PRHS, ZWSED) IF (PRESENT(PFPR)) THEN DO JK = KKTB , KKTE @@ -254,6 +266,7 @@ CONTAINS SUBROUTINE INTERNAL_SEDIM_STAT(KIB, KIE, KIT, KJB, KJE, KJT, KKB, KKE, KKT, KKTB, KKTE, KKL, & &PRHODREF, PDZZ, PTSORHODZ, PPABST, PTHT, PTSTEP, & &KSPE, & + &PLBDAS, & &PRXT, PRXS, PWSED, PSEA, PTOWN) ! !* 0. DECLARATIONS @@ -272,6 +285,7 @@ CONTAINS ! 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) :: PLBDAS ! lambda parameter for snow 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 @@ -386,14 +400,34 @@ CONTAINS & ALOG(PRHODREF(JI,JJ,JK)*ZQP(JI,JJ)) )**XEXCSEDI ENDIF ENDDO + + ELSEIF(KSPE==5) THEN + ! ******* for snow + 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)= XFSEDS * & + & PRHODREF(JI,JJ,JK)**(-XCEXVT) * & + & (1+(XFVELOS/PLBDAS(JI,JJ,JK))**XALPHAS)**(-XNUS+XEXSEDS/XALPHAS) * & + & PLBDAS(JI,JJ,JK)**(XBS+XEXSEDS) + ENDIF + IF ( ZQP(JI,JJ) > XRTMIN(KSPE)) THEN + ZWSEDW2(JI,JJ,JK)= XFSEDS * & + & PRHODREF(JI,JJ,JK)**(-XCEXVT) * & + & (1+(XFVELOS/PLBDAS(JI,JJ,JK))**XALPHAS)**(-XNUS+XEXSEDS/XALPHAS) * & + & PLBDAS(JI,JJ,JK)**(XBS+XEXSEDS) + + 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 diff --git a/src/MNH/ice4_slow.f90 b/src/MNH/ice4_slow.f90 index 15d0cd78e495cb255015fb6ed29fbfdb5361c748..e08dd1e77adff5823c7c2cb6404cfc1162d39af4 100644 --- a/src/MNH/ice4_slow.f90 +++ b/src/MNH/ice4_slow.f90 @@ -65,13 +65,14 @@ SUBROUTINE ICE4_SLOW(KSIZE, LDSOFT, PCOMPUTE, PRHODREF, PT, & !! MODIFICATIONS !! ------------- !! +! J. Wurtz 03/2022: New snow characteristics with LSNOW_T ! ! !* 0. DECLARATIONS ! ------------ ! USE MODD_CST, ONLY: XTT -USE MODD_RAIN_ICE_DESCR, ONLY: XCEXVT,XRTMIN +USE MODD_RAIN_ICE_DESCR, ONLY: XCEXVT,XRTMIN,XALPHAS,XNUS,XBS,XFVELOS USE MODD_RAIN_ICE_PARAM, ONLY: X0DEPG,X0DEPS,X1DEPG,X1DEPS,XACRIAUTI,XALPHA3,XBCRIAUTI,XBETA3,XCOLEXIS,XCRIAUTI, & XEX0DEPG,XEX0DEPS,XEX1DEPG,XEX1DEPS,XEXIAGGS,XFIAGGS,XHON,XTEXAUTI,XTIMAUTI ! @@ -173,8 +174,9 @@ IF(LDSOFT) THEN ELSE PRVDEPS(:) = 0. WHERE(ZMASK(:)==1.) - PRVDEPS(:) = ( PSSI(:)/(PRHODREF(:)*PAI(:)) ) * & - ( X0DEPS*PLBDAS(:)**XEX0DEPS + X1DEPS*PCJ(:)*PLBDAS(:)**XEX1DEPS ) + PRVDEPS(:) = ( PRST(:)*PSSI(:)/PAI(:)) * & + ( X0DEPS*PLBDAS(:)**XEX0DEPS + (X1DEPS*PCJ(:)*(1+(PLBDAS(:)/(2*XFVELOS)**XALPHAS))**(-XNUS+XEX1DEPS) & + *(PLBDAS(:))**(XBS+XEX1DEPS))) END WHERE ENDIF DO JL=1, KSIZE @@ -197,10 +199,11 @@ IF(LDSOFT) THEN ELSE PRIAGGS(:) = 0. WHERE(ZMASK(:)==1) - PRIAGGS(:) = XFIAGGS * EXP( XCOLEXIS*(PT(:)-XTT) ) & + PRIAGGS(:) = XFIAGGS * EXP( XCOLEXIS*(PT(:)-XTT) ) & * PRIT(:) & - * PLBDAS(:)**XEXIAGGS & - * PRHODREF(:)**(-XCEXVT) + * PRST(:) * (1+(XFVELOS/PLBDAS(:))**XALPHAS)**(-XNUS+XEXIAGGS/XALPHAS) & + * PRHODREF(:)**(-XCEXVT+1.) & + * ((PLBDAS(:))**(XBS+XEXIAGGS)) END WHERE ENDIF DO JL=1, KSIZE diff --git a/src/MNH/ice4_tendencies.f90 b/src/MNH/ice4_tendencies.f90 index 49cd599235d8a67c664bd2710e7864adc0a82123..ec33e100cfc60bec6ad576d781283372e52c165f 100644 --- a/src/MNH/ice4_tendencies.f90 +++ b/src/MNH/ice4_tendencies.f90 @@ -174,14 +174,16 @@ SUBROUTINE ICE4_TENDENCIES(KSIZE, KIB, KIE, KIT, KJB, KJE, KJT, KKB, KKE, KKT, K !! ------------- ! ! P. Wautelet 29/05/2019: remove PACK/UNPACK intrinsics (to get more performance and better OpenACC support) +! J. Wurtz 03/2022: New snow characteristics with LSNOW_T ! ! !* 0. DECLARATIONS ! ------------ ! USE MODD_CST, ONLY: XALPI,XBETAI,XCI,XCPV,XEPSILO,XGAMI,XLSTT,XMD,XMV,XP00,XRV,XTT -USE MODD_PARAM_ICE, ONLY: CSNOWRIMING -USE MODD_RAIN_ICE_DESCR, ONLY: XLBDAS_MAX,XLBEXG,XLBEXH,XLBEXR,XLBEXS,XLBG,XLBH,XLBR,XLBS,XRTMIN +USE MODD_PARAM_ICE, ONLY: CSNOWRIMING,LSNOW_T +USE MODD_RAIN_ICE_DESCR, ONLY: XLBDAS_MIN,XLBDAS_MAX,XLBEXG,XLBEXH,XLBEXR,XLBEXS,& + XLBG,XLBH,XLBR,XLBS,XRTMIN,XTRANS_MP_GAMMAS USE MODD_RAIN_ICE_PARAM, ONLY: XSCFAC ! USE MODI_ICE4_COMPUTE_PDF @@ -400,21 +402,28 @@ ELSE ! 5.1.6 riming-conversion of the large sized aggregates into graupel (old parametrisation) ! IF(CSNOWRIMING=='OLD ') THEN - ZLBDAS(:)=0. - WHERE(ZRST(:)>0.) - ZLBDAS(:) = MIN(XLBDAS_MAX, XLBS*(PRHODREF(:)*MAX(ZRST(:), XRTMIN(5)))**XLBEXS) - END WHERE - CALL ICE4_RSRIMCG_OLD(KSIZE, ODSOFT, PCOMPUTE==1., & - &PRHODREF, & - &ZLBDAS, & - &ZT, ZRCT, ZRST, & - &PRSRIMCG_MR, PB_RS, PB_RG) - DO JL=1, KSIZE - ZRST(JL) = ZRST(JL) - PRSRIMCG_MR(JL) - ZRGT(JL) = ZRGT(JL) + PRSRIMCG_MR(JL) - ENDDO + ZLBDAS(:)=0. + IF (LSNOW_T) THEN + WHERE (ZRST(:)>XRTMIN(5) .AND. ZT(:)>263.15) + ZLBDAS(:) = MAX(MIN(XLBDAS_MAX, 10**(14.554-0.0423*ZT(:))),XLBDAS_MIN)*XTRANS_MP_GAMMAS + END WHERE + WHERE (ZRST(:)>XRTMIN(5) .AND. ZT(:)<=263.15) + ZLBDAS(:) = MAX(MIN(XLBDAS_MAX, 10**(6.226-0.0106*ZT(:))),XLBDAS_MIN)*XTRANS_MP_GAMMAS + END WHERE + ELSE + ZLBDAS(:) = MAX(MIN(XLBDAS_MAX,XLBS*(PRHODREF(:)*ZRST(:))**XLBEXS),XLBDAS_MIN) + END IF + CALL ICE4_RSRIMCG_OLD(KSIZE, ODSOFT, PCOMPUTE==1., & + &PRHODREF, & + &ZLBDAS, & + &ZT, ZRCT, ZRST, & + &PRSRIMCG_MR, PB_RS, PB_RG) + DO JL=1, KSIZE + ZRST(JL) = ZRST(JL) - PRSRIMCG_MR(JL) + ZRGT(JL) = ZRGT(JL) + PRSRIMCG_MR(JL) + ENDDO ELSE - PRSRIMCG_MR(:) = 0. + PRSRIMCG_MR(:) = 0. ENDIF ENDIF ! @@ -470,9 +479,16 @@ IF(KSIZE>0) THEN !* compute the slope parameters ! ZLBDAS(:)=0. - WHERE(ZRST(:)>0.) - ZLBDAS(:) = MIN(XLBDAS_MAX, XLBS*(PRHODREF(:)*MAX(ZRST(:), XRTMIN(5)))**XLBEXS) - END WHERE + IF (LSNOW_T) THEN + WHERE (ZRST(:)>XRTMIN(5) .AND. ZT(:)>263.15) + ZLBDAS(:) = MAX(MIN(XLBDAS_MAX, 10**(14.554-0.0423*ZT(:))),XLBDAS_MIN)*XTRANS_MP_GAMMAS + END WHERE + WHERE (ZRST(:)>XRTMIN(5) .AND. ZT(:)<=263.15) + ZLBDAS(:) = MAX(MIN(XLBDAS_MAX, 10**(6.226-0.0106*ZT(:))),XLBDAS_MIN)*XTRANS_MP_GAMMAS + END WHERE + ELSE + ZLBDAS(:) = MAX(MIN(XLBDAS_MAX,XLBS*(PRHODREF(:)*ZRST(:))**XLBEXS),XLBDAS_MIN) + END IF ZLBDAG(:)=0. WHERE(ZRGT(:)>0.) ZLBDAG(:) = XLBG*(PRHODREF(:)*MAX(ZRGT(:), XRTMIN(6)))**XLBEXG diff --git a/src/MNH/ini_budget.f90 b/src/MNH/ini_budget.f90 index 3152cb6e5e17022fc128393ad806dff7b7a08fa6..f1f3b5a37c5ce2e3314004b53b8a36d6b51fe999 100644 --- a/src/MNH/ini_budget.f90 +++ b/src/MNH/ini_budget.f90 @@ -524,7 +524,6 @@ if ( lbu_rth .or. lbu_rtke .or. lbu_rrv .or. lbu_rrc .or. lbu_rrr .or. & tburhodj%xdata(:, :, :) = 0. end if - tzsource%ntype = TYPEREAL tzsource%ndims = 3 @@ -4068,31 +4067,6 @@ SV_BUDGETS: do jsv = 1, ksv end if end do SV_BUDGETS -IF (CBUTYPE=='CART') THEN - WRITE(UNIT=KLUOUT, FMT= '(2/,"DESCRIPTION OF THE BUDGET BOX")' ) - WRITE(UNIT=KLUOUT, FMT= '("BUIL = ",I4.4)' ) NBUIL - WRITE(UNIT=KLUOUT, FMT= '("BUIH = ",I4.4)' ) NBUIH - WRITE(UNIT=KLUOUT, FMT= '("BUJL = ",I4.4)' ) NBUJL - WRITE(UNIT=KLUOUT, FMT= '("BUJH = ",I4.4)' ) NBUJH - WRITE(UNIT=KLUOUT, FMT= '("BUKL = ",I4.4)' ) NBUKL - WRITE(UNIT=KLUOUT, FMT= '("BUKH = ",I4.4)' ) NBUKH - WRITE(UNIT=KLUOUT, FMT= '("BUIMAX = ",I4.4)' ) NBUIMAX - WRITE(UNIT=KLUOUT, FMT= '("BUJMAX = ",I4.4)' ) NBUJMAX - WRITE(UNIT=KLUOUT, FMT= '("BUKMAX = ",I4.4)' ) NBUKMAX -END IF -IF (CBUTYPE=='MASK') THEN - WRITE(UNIT=KLUOUT, FMT= '(2/,"DESCRIPTION OF THE BUDGET MASK")' ) - WRITE(UNIT=KLUOUT, FMT= '("BUIL = ",I4.4)' ) NBUIL - WRITE(UNIT=KLUOUT, FMT= '("BUIH = ",I4.4)' ) NBUIH - WRITE(UNIT=KLUOUT, FMT= '("BUJL = ",I4.4)' ) NBUJL - WRITE(UNIT=KLUOUT, FMT= '("BUJH = ",I4.4)' ) NBUJH - WRITE(UNIT=KLUOUT, FMT= '("BUKL = ",I4.4)' ) NBUKL - WRITE(UNIT=KLUOUT, FMT= '("BUKH = ",I4.4)' ) NBUKH - WRITE(UNIT=KLUOUT, FMT= '("BUKMAX = ",I4.4)' ) NBUKMAX - WRITE(UNIT=KLUOUT, FMT= '("BUSUBWRITE = ",I4.4)' ) NBUSUBWRITE - WRITE(UNIT=KLUOUT, FMT= '("BUMASK = ",I4.4)' ) NBUMASK -END IF - call Ini_budget_groups( tbudgets, ibudim1, ibudim2, ibudim3 ) if ( tbudgets(NBUDGET_U) %lenabled ) call Sourcelist_nml_compact( tbudgets(NBUDGET_U), cbulist_ru ) diff --git a/src/MNH/ini_ice_c1r3.f90 b/src/MNH/ini_ice_c1r3.f90 index b0a35554a88837b36dc5ae44119426abe6a482a6..d04e1335813234391e13b0504dda31e1a8abeac8 100644 --- a/src/MNH/ini_ice_c1r3.f90 +++ b/src/MNH/ini_ice_c1r3.f90 @@ -90,6 +90,7 @@ END MODULE MODI_INI_ICE_C1R3 !! Philippe Wautelet: 05/2016-04/2018: new data structures and calls for I/O ! P. Wautelet 10/04/2019: replace ABORT and STOP calls by Print_msg ! P. Wautelet 26/04/2019: replace non-standard FLOAT function by REAL function +! J. Wurtz 03/2022: new snow characteristics ! !------------------------------------------------------------------------------- ! @@ -109,6 +110,8 @@ USE MODD_REF ! use mode_msg ! +USE MODD_RAIN_ICE_DESCR, ONLY : XFVELOS +! USE MODI_GAMMA USE MODI_GAMMA_INC USE MODI_READ_XKER_RACCS @@ -725,15 +728,15 @@ IF( (KACCLBDAS/=NACCLBDAS) .OR. (KACCLBDAR/=NACCLBDAR) .OR. (KND/=IND) .OR. & (PACCLBDAS_MIN/=XACCLBDAS_MIN) .OR. (PACCLBDAR_MIN/=XACCLBDAR_MIN) .OR. & (PFDINFTY/=ZFDINFTY) ) THEN CALL RRCOLSS ( IND, XALPHAS, XNUS, XALPHAR, XNUR, & - ZESR, XBR, XCS, XDS, XCR, XDR, & + ZESR, XBR, XCS, XDS, XFVELOS, XCR, XDR, & XACCLBDAS_MAX, XACCLBDAR_MAX, XACCLBDAS_MIN, XACCLBDAR_MIN, & ZFDINFTY, XKER_RACCSS, XAG, XBS, XAS ) CALL RZCOLX ( IND, XALPHAS, XNUS, XALPHAR, XNUR, & - ZESR, XBR, XCS, XDS, XCR, XDR, & + ZESR, XBR, XCS, XDS, XFVELOS, XCR, XDR, 0., & XACCLBDAS_MAX, XACCLBDAR_MAX, XACCLBDAS_MIN, XACCLBDAR_MIN, & ZFDINFTY, XKER_RACCS ) CALL RSCOLRG ( IND, XALPHAS, XNUS, XALPHAR, XNUR, & - ZESR, XBS, XCS, XDS, XCR, XDR, & + ZESR, XBS, XCS, XDS, XFVELOS, XCR, XDR, & XACCLBDAS_MAX, XACCLBDAR_MAX, XACCLBDAS_MIN, XACCLBDAR_MIN, & ZFDINFTY, XKER_SACCRG,XAG, XBS, XAS ) WRITE(UNIT=ILUOUT0,FMT='("*****************************************")') @@ -938,7 +941,7 @@ IF( (KDRYLBDAG/=NDRYLBDAG) .OR. (KDRYLBDAS/=NDRYLBDAS) .OR. (KND/=IND) .OR. & (PDRYLBDAG_MIN/=XDRYLBDAG_MIN) .OR. (PDRYLBDAS_MIN/=XDRYLBDAS_MIN) .OR. & (PFDINFTY/=ZFDINFTY) ) THEN CALL RZCOLX ( IND, XALPHAG, XNUG, XALPHAS, XNUS, & - ZEGS, XBS, XCG, XDG, XCS, XDS, & + ZEGS, XBS, XCG, XDG, 0., XCS, XDS, XFVELOS, & XDRYLBDAG_MAX, XDRYLBDAS_MAX, XDRYLBDAG_MIN, XDRYLBDAS_MIN, & ZFDINFTY, XKER_SDRYG ) WRITE(UNIT=ILUOUT0,FMT='("*****************************************")') @@ -1004,7 +1007,7 @@ IF( (KDRYLBDAG/=NDRYLBDAG) .OR. (KDRYLBDAR/=NDRYLBDAR) .OR. (KND/=IND) .OR. & (PDRYLBDAG_MIN/=XDRYLBDAG_MIN) .OR. (PDRYLBDAR_MIN/=XDRYLBDAR_MIN) .OR. & (PFDINFTY/=ZFDINFTY) ) THEN CALL RZCOLX ( IND, XALPHAG, XNUG, XALPHAR, XNUR, & - ZEGR, XBR, XCG, XDG, XCR, XDR, & + ZEGR, XBR, XCG, XDG, 0., XCR, XDR, 0., & XDRYLBDAG_MAX, XDRYLBDAR_MAX, XDRYLBDAG_MIN, XDRYLBDAR_MIN, & ZFDINFTY, XKER_RDRYG ) WRITE(UNIT=ILUOUT0,FMT='("*****************************************")') diff --git a/src/MNH/ini_lesn.f90 b/src/MNH/ini_lesn.f90 index 45d7b9f9ac85e947fda34a09e56fe335c79d1d1c..406ee30a2feac649f7b708aa132f538ed52288b0 100644 --- a/src/MNH/ini_lesn.f90 +++ b/src/MNH/ini_lesn.f90 @@ -543,8 +543,10 @@ ELSE END IF IF (LUSERI ) THEN ALLOCATE(XLES_MEAN_Ri (NLES_K,NLES_TIMES,NLES_MASKS)) + ALLOCATE(XLES_MEAN_If (NLES_K,NLES_TIMES,NLES_MASKS)) ELSE ALLOCATE(XLES_MEAN_Ri (0,0,0)) + ALLOCATE(XLES_MEAN_If (0,0,0)) END IF IF (LUSERS ) THEN ALLOCATE(XLES_MEAN_Rs (NLES_K,NLES_TIMES,NLES_MASKS)) @@ -650,6 +652,7 @@ IF (LUSERC ) XLES_MEAN_INDCf = XUNDEF IF (LUSERC ) XLES_MEAN_INDCf2 = XUNDEF IF (LUSERR ) XLES_MEAN_Rr = XUNDEF IF (LUSERI ) XLES_MEAN_Ri = XUNDEF +IF (LUSERI ) XLES_MEAN_If = XUNDEF IF (LUSERS ) XLES_MEAN_Rs = XUNDEF IF (LUSERG ) XLES_MEAN_Rg = XUNDEF IF (LUSERH ) XLES_MEAN_Rh = XUNDEF diff --git a/src/MNH/ini_lima_cold_mixed.f90 b/src/MNH/ini_lima_cold_mixed.f90 index cb427cdb434982b229095adb417eee3d1071b73e..f2cea1e34033a4988a2869012776103bf5964205 100644 --- a/src/MNH/ini_lima_cold_mixed.f90 +++ b/src/MNH/ini_lima_cold_mixed.f90 @@ -41,6 +41,7 @@ END MODULE MODI_INI_LIMA_COLD_MIXED !! Philippe Wautelet: 05/2016-04/2018: new data structures and calls for I/O ! P. Wautelet 10/04/2019: replace ABORT and STOP calls by Print_msg ! P. Wautelet 26/04/2019: replace non-standard FLOAT function by REAL function +! J. Wurtz 03/2022: new snow characteristics ! !------------------------------------------------------------------------------- ! @@ -171,12 +172,27 @@ XF1IS = 0.28 ! XAS = 0.02 XBS = 1.9 + +IF (LSNOW_T) THEN +!Cas Gamma generalisee +XCS = 11.52 +XDS = 0.39 +XFVELOS =0.097 +!Cas MP +!XCS = 13.2 +!XDS = 0.423 +!XFVELOS = 25.14 +ELSE XCS = 5. XDS = 0.27 -! -XCCS = 5.0 -XCXS = 1.0 -! +XFVELOS = 0. +END IF + +IF (.NOT. LSNOW_T) THEN + XCCS = 5.0 + XCXS = 1.0 +END IF + XF0S = 0.86 XF1S = 0.28 ! @@ -234,8 +250,17 @@ XC1H = 1./2. XALPHAI = 3.0 ! Gamma law for the ice crystal volume XNUI = 3.0 ! Gamma law with little dispersion ! -XALPHAS = 1.0 ! Exponential law -XNUS = 1.0 ! Exponential law +IF (LSNOW_T) THEN +!Cas GAMMAGEN + XALPHAS = .214 ! Generalized gamma law + XNUS = 43.7 ! Generalized gamma law + XTRANS_MP_GAMMAS = SQRT( ( GAMMA(XNUS + 2./XALPHAS)*GAMMA(XNUS + 4./XALPHAS) ) / & + ( 8.* GAMMA(XNUS + 1./XALPHAS)*GAMMA(XNUS + 3./XALPHAS) ) ) +ELSE + XALPHAS = 1.0 ! Exponential law + XNUS = 1.0 ! Exponential law + XTRANS_MP_GAMMAS = 1. +END IF ! XALPHAG = 1.0 ! Exponential law XNUG = 1.0 ! Exponential law @@ -248,8 +273,13 @@ XNUH = 8.0 ! Gamma law with little dispersion XLBEXI = 1.0/XBI XLBI = XAI*MOMG(XALPHAI,XNUI,XBI) ! -XLBEXS = 1.0/(XCXS-XBS) -XLBS = ( XAS*XCCS*MOMG(XALPHAS,XNUS,XBS) )**(-XLBEXS) +IF (LSNOW_T) THEN + XLBEXS = 0. ! Not used + XLBS = 1.0/(XAS*MOMG(XALPHAS,XNUS,XBS)) +ELSE + XLBEXS = 1.0/(XCXS-XBS) + XLBS = ( XAS*XCCS*MOMG(XALPHAS,XNUS,XBS) )**(-XLBEXS) +END IF ! XLBEXG = 1.0/(XCXG-XBG) XLBG = ( XAG*XCCG*MOMG(XALPHAG,XNUG,XBG))**(-XLBEXG) @@ -266,7 +296,8 @@ IF (GFLAG) THEN WRITE(UNIT=ILUOUT0,FMT='(" XLBEXH =",E13.6," XLBH =",E13.6)') XLBEXH,XLBH END IF ! -XLBDAS_MAX = 500000 +XLBDAS_MAX = 500000. ! LBDAS_MAX doit être compare avec LBDAS avec une forme de Marshall-Palmer +XLBDAS_MIN = 1000. XLBDAG_MAX = 100000.0 ! ZCONC_MAX = 1.E6 ! Maximal concentration for falling particules set to 1 per cc @@ -312,9 +343,20 @@ XFSEDRI = XC_I*GAMMA_X0D(XNUI+(XDI+XBI)/XALPHAI)/GAMMA_X0D(XNUI+XBI/XALPHAI)* XFSEDCI = XC_I*GAMMA_X0D(XNUI+XDI/XALPHAI)/GAMMA_X0D(XNUI)* & (ZRHO00)**XCEXVT ! -XEXSEDS = (XBS+XDS-XCXS)/(XBS-XCXS) -XFSEDS = XCS*XAS*XCCS*MOMG(XALPHAS,XNUS,XBS+XDS)* & +IF (LSNOW_T) THEN +!HOUZE/HAIC + !XEXSEDS = -XDS !(2*XBS+XDS) + !XFSEDS = XCS*MOMG(XALPHAS,XNUS,XBS+XDS)/(MOMG(XALPHAS,XNUS,XBS)) & + ! *(ZRHO00)**XCEXVT +!LH_EXTENDED + XEXSEDS = -XDS-XBS + XFSEDS = XCS*MOMG(XALPHAS,XNUS,XBS+XDS)/(MOMG(XALPHAS,XNUS,XBS)) & + *(ZRHO00)**XCEXVT +ELSE + XEXSEDS = (XBS+XDS-XCXS)/(XBS-XCXS) + XFSEDS = XCS*XAS*XCCS*MOMG(XALPHAS,XNUS,XBS+XDS)* & (XAS*XCCS*MOMG(XALPHAS,XNUS,XBS))**(-XEXSEDS)*(ZRHO00)**XCEXVT +END IF ! XEXSEDG = (XBG+XDG-XCXG)/(XBG-XCXG) XFSEDG = XCG*XAG*XCCG*MOMG(XALPHAG,XNUG,XBG+XDG)* & @@ -324,8 +366,6 @@ XEXSEDH = (XBH+XDH-XCXH)/(XBH-XCXH) XFSEDH = XCH*XAH*XCCH*MOMG(XALPHAH,XNUH,XBH+XDH)* & (XAH*XCCH*MOMG(XALPHAH,XNUH,XBH))**(-XEXSEDH)*(ZRHO00)**XCEXVT ! -! -! XLB(4) = XLBI XLBEX(4) = XLBEXI XD(4) = XDI @@ -561,7 +601,7 @@ XR1DEPIS = XC1DEPIS *(XAI*XDICNVS_LIM**XBI) ! ! Harrington parameterization for snow to ice conversion ! -XLBDASCNVI_MAX = 6000. ! lbdas max after Field (1999) +XLBDASCNVI_MAX = 6000.*XTRANS_MP_GAMMAS ! lbdas max after Field (1999) ! XDSCNVI_LIM = 125.E-6 ! size in microns XLBDASCNVI_LIM = (50.0**(1.0/(XALPHAS)))/XDSCNVI_LIM ! ZLBDAS Limitation @@ -574,10 +614,10 @@ XR1DEPSI = XC1DEPSI *(XAS*XDSCNVI_LIM**XBS) ! ! Vapor deposition on snow and graupel and hail ! -X0DEPS = (4.0*XPI)*XCCS*XC1S*XF0S*MOMG(XALPHAS,XNUS,1.) -X1DEPS = (4.0*XPI)*XCCS*XC1S*XF1S*SQRT(XCS)*MOMG(XALPHAS,XNUS,0.5*XDS+1.5) -XEX0DEPS = XCXS-1.0 -XEX1DEPS = XCXS-0.5*(XDS+3.0) +X0DEPS = XLBS*(4.0*XPI)*XC1S*XF0S*MOMG(XALPHAS,XNUS,1.) +X1DEPS = XLBS*(4.0*XPI)*XC1S*XF1S*SQRT(XCS)*MOMG(XALPHAS,XNUS,0.5*XDS+1.5) +XEX0DEPS = XBS-1.0 +XEX1DEPS = -0.5*(XDS+3.0) ! X0DEPG = (4.0*XPI)*XCCG*XC1G*XF0G*MOMG(XALPHAG,XNUG,1.) X1DEPG = (4.0*XPI)*XCCG*XC1G*XF1G*SQRT(XCG)*MOMG(XALPHAG,XNUG,0.5*XDG+1.5) @@ -647,6 +687,7 @@ XITAUTS_THRESHOLD = 7.5 !* 6.4 Constants for snow aggregation ! XCOLEXIS = 0.05 ! Temperature factor of the I+S collection efficiency +XFIAGGS = (XPI/4.0)*0.25*XCCS*XCS*(ZRHO00**XCEXVT)*MOMG(XALPHAS,XNUS,XDS+2.0) XAGGS_CLARGE1 = XKER_ZRNIC_A2*ZGAMI(2) XAGGS_CLARGE2 = XKER_ZRNIC_A2*ZGAMS(2) XAGGS_RLARGE1 = XKER_ZRNIC_A2*ZGAMI(6)*XAI @@ -669,11 +710,12 @@ END IF ! XDCSLIM = 0.007 ! D_cs^lim = 7 mm as suggested by Farley et al. (1989) XCOLCS = 1.0 -XEXCRIMSS= XCXS-XDS-2.0 -XCRIMSS = (XPI/4.0)*XCOLCS*XCCS*XCS*(ZRHO00**XCEXVT)*MOMG(XALPHAS,XNUS,XDS+2.0) +XEXCRIMSS = -XDS-2.0 +XCRIMSS = XLBS * (XPI/4.0)*XCOLCS*XCS*(ZRHO00**XCEXVT)*MOMG(XALPHAS,XNUS,XDS+2.0) + XEXCRIMSG= XEXCRIMSS XCRIMSG = XCRIMSS -XSRIMCG = XCCS*XAS*MOMG(XALPHAS,XNUS,XBS) +XSRIMCG = XAS*MOMG(XALPHAS,XNUS,XBS) XEXSRIMCG= XCXS-XBS ! GFLAG = .TRUE. @@ -684,9 +726,9 @@ IF (GFLAG) THEN END IF ! NGAMINC = 80 -XGAMINC_BOUND_MIN = 1.0E-1 ! Minimal value of (Lbda * D_cs^lim)**alpha -XGAMINC_BOUND_MAX = 1.0E7 ! Maximal value of (Lbda * D_cs^lim)**alpha -ZRATE = EXP(LOG(XGAMINC_BOUND_MAX/XGAMINC_BOUND_MIN)/REAL(NGAMINC-1)) +XGAMINC_BOUND_MIN = (1000.*XTRANS_MP_GAMMAS*XDCSLIM)**XALPHAS !1.0E-1 ! Minimal value of (Lbda * D_cs^lim)**alpha +XGAMINC_BOUND_MAX = (50000.*XTRANS_MP_GAMMAS*XDCSLIM)**XALPHAS !1.0E7 ! Maximal value of (Lbda * D_cs^lim)**alpha +ZRATE = EXP(LOG(XGAMINC_BOUND_MAX/XGAMINC_BOUND_MIN)/FLOAT(NGAMINC-1)) ! ALLOCATE( XGAMINC_RIM1(NGAMINC) ) ALLOCATE( XGAMINC_RIM2(NGAMINC) ) @@ -732,13 +774,13 @@ XHMLINTP2 = 1.0 + XHMLINTP1*LOG( 25.E-6/(XGAMINC_HMC_BOUND_MIN)**(1.0/XALPHAC) ) ! !* 7.2 Constants for the accretion of raindrops onto aggregates ! -XFRACCSS = ((XPI**2)/24.0)*XCCS*XRHOLW*(ZRHO00**XCEXVT) +XFRACCSS = XLBS*((XPI**2)/24.0)*XCCR*XRHOLW*(ZRHO00**XCEXVT) ! XLBRACCS1 = MOMG(XALPHAS,XNUS,2.)*MOMG(XALPHAR,XNUR,3.) XLBRACCS2 = 2.*MOMG(XALPHAS,XNUS,1.)*MOMG(XALPHAR,XNUR,4.) XLBRACCS3 = MOMG(XALPHAR,XNUR,5.) ! -XFSACCRG = (XPI/4.0)*XAS*XCCS*(ZRHO00**XCEXVT) +XFSACCRG = XLBS*(XPI/4.0)*XAS*XCCR*(ZRHO00**XCEXVT) ! XLBSACCR1 = MOMG(XALPHAR,XNUR,2.)*MOMG(XALPHAS,XNUS,XBS) XLBSACCR2 = 2.*MOMG(XALPHAR,XNUR,1.)*MOMG(XALPHAS,XNUS,XBS+1.) @@ -750,9 +792,9 @@ XLBSACCR3 = MOMG(XALPHAS,XNUS,XBS+2.) ! Notice: One magnitude of lambda discretized over 10 points for snow ! NACCLBDAS = 40 -XACCLBDAS_MIN = 5.0E1 ! Minimal value of Lbda_s to tabulate XKER_RACCS -XACCLBDAS_MAX = 5.0E5 ! Maximal value of Lbda_s to tabulate XKER_RACCS -ZRATE = LOG(XACCLBDAS_MAX/XACCLBDAS_MIN)/REAL(NACCLBDAS-1) +XACCLBDAS_MIN = 5.0E2*XTRANS_MP_GAMMAS !5.0E1*XTRANS_MP_GAMMAS ! Minimal value of Lbda_s to tabulate XKER_RACCS +XACCLBDAS_MAX = 1.0E5*XTRANS_MP_GAMMAS !5.0E5*XTRANS_MP_GAMMAS ! Maximal value of Lbda_s to tabulate XKER_RACCS +ZRATE = LOG(XACCLBDAS_MAX/XACCLBDAS_MIN)/FLOAT(NACCLBDAS-1) XACCINTP1S = 1.0 / ZRATE XACCINTP2S = 1.0 - LOG( XACCLBDAS_MIN ) / ZRATE NACCLBDAR = 40 @@ -785,15 +827,15 @@ IF( (KACCLBDAS/=NACCLBDAS) .OR. (KACCLBDAR/=NACCLBDAR) .OR. (KND/=IND) .OR. & (PACCLBDAS_MIN/=XACCLBDAS_MIN) .OR. (PACCLBDAR_MIN/=XACCLBDAR_MIN) .OR. & (PFDINFTY/=ZFDINFTY) ) THEN CALL RRCOLSS ( IND, XALPHAS, XNUS, XALPHAR, XNUR, & - ZESR, XBR, XCS, XDS, XCR, XDR, & + ZESR, XBR, XCS, XDS, XFVELOS, XCR, XDR, & XACCLBDAS_MAX, XACCLBDAR_MAX, XACCLBDAS_MIN, XACCLBDAR_MIN, & ZFDINFTY, XKER_RACCSS, XAG, XBS, XAS ) CALL RZCOLX ( IND, XALPHAS, XNUS, XALPHAR, XNUR, & - ZESR, XBR, XCS, XDS, XCR, XDR, & + ZESR, XBR, XCS, XDS, XFVELOS, XCR, XDR, 0., & XACCLBDAS_MAX, XACCLBDAR_MAX, XACCLBDAS_MIN, XACCLBDAR_MIN, & ZFDINFTY, XKER_RACCS ) CALL RSCOLRG ( IND, XALPHAS, XNUS, XALPHAR, XNUR, & - ZESR, XBS, XCS, XDS, XCR, XDR, & + ZESR, XBS, XCS, XDS, XFVELOS, XCR, XDR, & XACCLBDAS_MAX, XACCLBDAR_MAX, XACCLBDAS_MIN, XACCLBDAR_MIN, & ZFDINFTY, XKER_SACCRG,XAG, XBS, XAS ) WRITE(UNIT=ILUOUT0,FMT='("*****************************************")') @@ -936,7 +978,7 @@ XCOLSG = 0.01 ! Collection efficiency of S+G XCOLEXSG = 0.1 ! Temperature factor of the S+G collection efficiency WRITE (ILUOUT0, FMT=*) ' NEW Constants for the aggregate collection by the graupeln' WRITE (ILUOUT0, FMT=*) ' XCOLSG, XCOLEXSG = ',XCOLSG,XCOLEXSG -XFSDRYG = (XPI/4.0)*XCOLSG*XCCG*XCCS*XAS*(ZRHO00**XCEXVT) +XFSDRYG = XLBS*(XPI/4.0)*XCOLSG*XCCG*XAS*(ZRHO00**XCEXVT) ! XLBSDRYG1 = MOMG(XALPHAG,XNUG,2.)*MOMG(XALPHAS,XNUS,XBS) XLBSDRYG2 = 2.*MOMG(XALPHAG,XNUG,1.)*MOMG(XALPHAS,XNUS,XBS+1.) @@ -966,8 +1008,8 @@ ZRATE = LOG(XDRYLBDAR_MAX/XDRYLBDAR_MIN)/REAL(NDRYLBDAR-1) XDRYINTP1R = 1.0 / ZRATE XDRYINTP2R = 1.0 - LOG( XDRYLBDAR_MIN ) / ZRATE NDRYLBDAS = 80 -XDRYLBDAS_MIN = 2.5E1 ! Minimal value of Lbda_s to tabulate XKER_SDRYG -XDRYLBDAS_MAX = 2.5E9 ! Maximal value of Lbda_s to tabulate XKER_SDRYG +XDRYLBDAS_MIN = 5.0E2*XTRANS_MP_GAMMAS ! Minimal value of Lbda_s to tabulate XKER_SDRYG +XDRYLBDAS_MAX = 1.0E5*XTRANS_MP_GAMMAS ! Maximal value of Lbda_s to tabulate XKER_SDRYG ZRATE = LOG(XDRYLBDAS_MAX/XDRYLBDAS_MIN)/REAL(NDRYLBDAS-1) XDRYINTP1S = 1.0 / ZRATE XDRYINTP2S = 1.0 - LOG( XDRYLBDAS_MIN ) / ZRATE @@ -999,7 +1041,7 @@ IF( (KDRYLBDAG/=NDRYLBDAG) .OR. (KDRYLBDAS/=NDRYLBDAS) .OR. (KND/=IND) .OR. & (PDRYLBDAG_MIN/=XDRYLBDAG_MIN) .OR. (PDRYLBDAS_MIN/=XDRYLBDAS_MIN) .OR. & (PFDINFTY/=ZFDINFTY) ) THEN CALL RZCOLX ( IND, XALPHAG, XNUG, XALPHAS, XNUS, & - ZEGS, XBS, XCG, XDG, XCS, XDS, & + ZEGS, XBS, XCG, XDG, 0., XCS, XDS, XFVELOS, & XDRYLBDAG_MAX, XDRYLBDAS_MAX, XDRYLBDAG_MIN, XDRYLBDAS_MIN, & ZFDINFTY, XKER_SDRYG ) WRITE(UNIT=ILUOUT0,FMT='("*****************************************")') @@ -1065,7 +1107,7 @@ IF( (KDRYLBDAG/=NDRYLBDAG) .OR. (KDRYLBDAR/=NDRYLBDAR) .OR. (KND/=IND) .OR. & (PDRYLBDAG_MIN/=XDRYLBDAG_MIN) .OR. (PDRYLBDAR_MIN/=XDRYLBDAR_MIN) .OR. & (PFDINFTY/=ZFDINFTY) ) THEN CALL RZCOLX ( IND, XALPHAG, XNUG, XALPHAR, XNUR, & - ZEGR, XBR, XCG, XDG, XCR, XDR, & + ZEGR, XBR, XCG, XDG,0., XCR, XDR, 0., & XDRYLBDAG_MAX, XDRYLBDAR_MAX, XDRYLBDAG_MIN, XDRYLBDAR_MIN, & ZFDINFTY, XKER_RDRYG ) WRITE(UNIT=ILUOUT0,FMT='("*****************************************")') @@ -1126,7 +1168,8 @@ XFWETH = (XPI/4.0)*XCCH*XCH*(ZRHO00**XCEXVT)*MOMG(XALPHAH,XNUH,XDH+2.0) ! !* 9.2.2 Constants for the aggregate collection by the hailstones ! -XFSWETH = (XPI/4.0)*XCCH*XCCS*XAS*(ZRHO00**XCEXVT) +!XFSWETH = (XPI/4.0)*XCCH*XCCS*XAS*(ZRHO00**XCEXVT) +XFSWETH = XLBS*(XPI/4.0)*XCCH*XAS*(ZRHO00**XCEXVT) ! Wurtz ! XLBSWETH1 = MOMG(XALPHAH,XNUH,2.)*MOMG(XALPHAS,XNUS,XBS) XLBSWETH2 = 2.*MOMG(XALPHAH,XNUH,1.)*MOMG(XALPHAS,XNUS,XBS+1.) @@ -1143,8 +1186,8 @@ XLBGWETH3 = MOMG(XALPHAG,XNUG,XBG+2.) ! Notice: One magnitude of lambda discretized over 10 points ! NWETLBDAS = 80 -XWETLBDAS_MIN = 2.5E1 ! Minimal value of Lbda_s to tabulate XKER_SWETH -XWETLBDAS_MAX = 2.5E9 ! Maximal value of Lbda_s to tabulate XKER_SWETH +XWETLBDAS_MIN = 5.0E2*XTRANS_MP_GAMMAS ! Minimal value of Lbda_s to tabulate XKER_SWETH +XWETLBDAS_MAX = 1.0E5*XTRANS_MP_GAMMAS ! Maximal value of Lbda_s to tabulate XKER_SWETH ZRATE = LOG(XWETLBDAS_MAX/XWETLBDAS_MIN)/REAL(NWETLBDAS-1) XWETINTP1S = 1.0 / ZRATE XWETINTP2S = 1.0 - LOG( XWETLBDAS_MIN ) / ZRATE @@ -1182,7 +1225,7 @@ IF( (KWETLBDAH/=NWETLBDAH) .OR. (KWETLBDAS/=NWETLBDAS) .OR. (KND/=IND) .OR. & (PWETLBDAH_MIN/=XWETLBDAH_MIN) .OR. (PWETLBDAS_MIN/=XWETLBDAS_MIN) .OR. & (PFDINFTY/=ZFDINFTY) ) THEN CALL RZCOLX ( IND, XALPHAH, XNUH, XALPHAS, XNUS, & - ZEHS, XBS, XCH, XDH, XCS, XDS, & + ZEHS, XBS, XCH, XDH,0., XCS, XDS, XFVELOS, & XWETLBDAH_MAX, XWETLBDAS_MAX, XWETLBDAH_MIN, XWETLBDAS_MIN, & ZFDINFTY, XKER_SWETH ) WRITE(UNIT=ILUOUT0,FMT='("*****************************************")') @@ -1248,7 +1291,7 @@ IF( (KWETLBDAH/=NWETLBDAH) .OR. (KWETLBDAG/=NWETLBDAG) .OR. (KND/=IND) .OR. & (PWETLBDAH_MIN/=XWETLBDAH_MIN) .OR. (PWETLBDAG_MIN/=XWETLBDAG_MIN) .OR. & (PFDINFTY/=ZFDINFTY) ) THEN CALL RZCOLX ( IND, XALPHAH, XNUH, XALPHAG, XNUG, & - ZEHG, XBG, XCH, XDH, XCG, XDG, & + ZEHG, XBG, XCH, XDH,0., XCG, XDG, 0., & XWETLBDAH_MAX, XWETLBDAG_MAX, XWETLBDAH_MIN, XWETLBDAG_MIN, & ZFDINFTY, XKER_GWETH ) WRITE(UNIT=ILUOUT0,FMT='("*****************************************")') diff --git a/src/MNH/ini_lima_warm.f90 b/src/MNH/ini_lima_warm.f90 index 3fac15aaefe54e303ddb025473017407a5a60b6d..842552d8131dbe99f954f8c1aeaae70b8ea8f353 100644 --- a/src/MNH/ini_lima_warm.f90 +++ b/src/MNH/ini_lima_warm.f90 @@ -334,6 +334,7 @@ XLAUTR_THRESHOLD = 0.4 XITAUTR= 0.27 ! (Notice that T2 of BR74 is uncorrect and that 0.27=1./3.7 XITAUTR_THRESHOLD = 7.5 XCAUTR = 3.5E9 +XR0 = 25.0E-6 ! ! Cst for the accretion process ! @@ -405,6 +406,7 @@ X0EVAR = (12.0)*XF0R*GAMMA_X0D(XNUR+1./XALPHAR)/GAMMA_X0D(XNUR+3./XALPHAR) X1EVAR = (12.0)*XF1R*((ZRHO00)**(XCEXVT)*(XCR/0.15E-4))**0.5* & GAMMA_X0D(XNUR+(XDR+3.0)/(2.0*XALPHAR))/GAMMA_X0D(XNUR+3./XALPHAR) ! +XCEVAP = 0.86 ! !------------------------------------------------------------------------------ ! diff --git a/src/MNH/ini_modeln.f90 b/src/MNH/ini_modeln.f90 index 718f11ce615bb12340a0c91c7d2b514630be805a..1341b29f9488a37e2ddd3cd64ca3c6a692b82322 100644 --- a/src/MNH/ini_modeln.f90 +++ b/src/MNH/ini_modeln.f90 @@ -959,9 +959,11 @@ END IF ! IF (NRR>1) THEN ALLOCATE(XCLDFR(IIU,IJU,IKU)); XCLDFR (:, :, :) = 0. + ALLOCATE(XICEFR(IIU,IJU,IKU)); XICEFR (:, :, :) = 0. ALLOCATE(XRAINFR(IIU,IJU,IKU)); XRAINFR(:, :, :) = 0. ELSE ALLOCATE(XCLDFR(0,0,0)) + ALLOCATE(XICEFR(0,0,0)) ALLOCATE(XRAINFR(0,0,0)) END IF ! @@ -1906,7 +1908,7 @@ CALL MPPDB_CHECK3D(XUT,"INI_MODEL_N-before read_field::XUT",PRECISION) CALL READ_FIELD(KMI,TPINIFILE,IIU,IJU,IKU, & CGETTKET,CGETRVT,CGETRCT,CGETRRT,CGETRIT,CGETCIT,CGETZWS, & CGETRST,CGETRGT,CGETRHT,CGETSVT,CGETSRCT,CGETSIGS,CGETCLDFR, & - CGETBL_DEPTH,CGETSBL_DEPTH,CGETPHC,CGETPHR, & + CGETICEFR, CGETBL_DEPTH,CGETSBL_DEPTH,CGETPHC,CGETPHR, & CUVW_ADV_SCHEME, CTEMP_SCHEME, & NSIZELBX_ll, NSIZELBXU_ll, NSIZELBY_ll, NSIZELBYV_ll, & NSIZELBXTKE_ll,NSIZELBYTKE_ll, & @@ -1914,8 +1916,8 @@ CALL READ_FIELD(KMI,TPINIFILE,IIU,IJU,IKU, & XUM,XVM,XWM,XDUM,XDVM,XDWM, & XUT,XVT,XWT,XTHT,XPABST,XTKET,XRTKEMS, & XRT,XSVT,XZWS,XCIT,XDRYMASST,XDRYMASSS, & - XSIGS,XSRCT,XCLDFR,XBL_DEPTH,XSBL_DEPTH,XWTHVMF,XPHC,XPHR, & - XLSUM,XLSVM,XLSWM,XLSTHM,XLSRVM,XLSZWSM, & + XSIGS,XSRCT,XCLDFR,XICEFR, XBL_DEPTH,XSBL_DEPTH,XWTHVMF, & + XPHC,XPHR, XLSUM,XLSVM,XLSWM,XLSTHM,XLSRVM,XLSZWSM, & XLBXUM,XLBXVM,XLBXWM,XLBXTHM,XLBXTKEM, & XLBXRM,XLBXSVM, & XLBYUM,XLBYVM,XLBYWM,XLBYTHM,XLBYTKEM, & diff --git a/src/MNH/ini_param_elec.f90 b/src/MNH/ini_param_elec.f90 index bdbd3c6d90293a6d4fde0fd28e4d9187e4712642..02a8b1578cfe2608304c04ccd8d8ebff6fd9025d 100644 --- a/src/MNH/ini_param_elec.f90 +++ b/src/MNH/ini_param_elec.f90 @@ -85,6 +85,7 @@ END MODULE MODI_INI_PARAM_ELEC !! J. Escobar 8/01/2016 bug , missing YDIR='XY' in READ !! Philippe Wautelet: 05/2016-04/2018: new data structures and calls for I/O ! P. Wautelet 26/04/2019: replace non-standard FLOAT function by REAL function +! J. Wurtz 03/2022: new snow characteristics ! !------------------------------------------------------------------------------- ! @@ -846,17 +847,17 @@ XLBQSACCRG3 = MOMG(XALPHAS,XNUS,XFS) * MOMG(XALPHAR,XNUR,2.) ZESR = 1.0 ! CALL RRCOLSS (KND, XALPHAS, XNUS, XALPHAR, XNUR, & - ZESR, XFR, XCS, XDS, XCR, XDR, & + ZESR, XFR, XCS, XDS, 0., XCR, XDR, & XACCLBDAS_MAX, XACCLBDAR_MAX, XACCLBDAS_MIN, XACCLBDAR_MIN, & PFDINFTY, XKER_Q_RACCSS, XAG, XBS, XAS ) ! CALL RZCOLX (KND, XALPHAS, XNUS, XALPHAR, XNUR, & - ZESR, XFR, XCS, XDS, XCR, XDR, & + ZESR, XFR, XCS, XDS, 0., XCR, XDR, 0., & XACCLBDAS_MAX, XACCLBDAR_MAX, XACCLBDAS_MIN, XACCLBDAR_MIN, & PFDINFTY, XKER_Q_RACCS ) ! CALL RSCOLRG (KND, XALPHAS, XNUS, XALPHAR, XNUR, & - ZESR, XFS, XCS, XDS, XCR, XDR, & + ZESR, XFS, XCS, XDS, 0., XCR, XDR, & XACCLBDAS_MAX, XACCLBDAR_MAX, XACCLBDAS_MIN, XACCLBDAR_MIN, & PFDINFTY, XKER_Q_SACCRG, XAG, XBS, XAS ) ! @@ -878,7 +879,7 @@ XLBQSDRYG3 = MOMG(XALPHAS,XNUS,XFS) * MOMG(XALPHAG,XNUG,2.) ZEGS = 1. ! also initialized in ini_rain_ice_elec ! CALL RZCOLX (KND, XALPHAG, XNUG, XALPHAS, XNUS, & - ZEGS, XFS, XCG, XDG, XCS, XDS, & + ZEGS, XFS, XCG, XDG, 0., XCS, XDS, 0., & XDRYLBDAG_MAX, XDRYLBDAS_MAX, XDRYLBDAG_MIN, XDRYLBDAS_MIN, & PFDINFTY, XKER_Q_SDRYG ) ! @@ -897,7 +898,7 @@ IF (CNI_CHARGING == 'HELFA') THEN ! IF( .NOT.ALLOCATED(XKER_Q_SDRYGB)) ALLOCATE( XKER_Q_SDRYGB(NDRYLBDAG,NDRYLBDAS) ) CALL RZCOLX (KND, XALPHAG, XNUG, XALPHAS, XNUS, & - ZEGS, 0., XCG, XDG, XCS, XDS, & + ZEGS, 0., XCG, XDG, 0., XCS, XDS, 0., & XDRYLBDAG_MAX, XDRYLBDAS_MAX, XDRYLBDAG_MIN, XDRYLBDAS_MIN, & PFDINFTY, XKER_Q_SDRYGB ) ! Delta vqb1_sg @@ -999,7 +1000,7 @@ IF (CNI_CHARGING == 'TAKAH' .OR. CNI_CHARGING == 'SAP98' .OR. & XAUX_LIM3 = MOMG(XALPHAG,XNUG,2.) IF( .NOT.ALLOCATED(XKER_Q_LIMSG)) ALLOCATE( XKER_Q_LIMSG(NDRYLBDAG,NDRYLBDAS) ) CALL RZCOLX (KND, XALPHAG, XNUG, XALPHAS, XNUS, & - ZEGS, 0., XCG, XDG, XCS, XDS, & + ZEGS, 0., XCG, XDG, 0., XCS, XDS, 0., & XDRYLBDAG_MAX, XDRYLBDAS_MAX, XDRYLBDAG_MIN, XDRYLBDAS_MIN, & PFDINFTY, XKER_Q_LIMSG) ENDIF @@ -1021,7 +1022,7 @@ XLBQRDRYG3 = MOMG(XALPHAR,XNUR,XFR) * MOMG(XALPHAG,XNUG,2.) ZEGR = 1.0 ! CALL RZCOLX (KND, XALPHAG, XNUG, XALPHAR, XNUR, & - ZEGR, XFR, XCG, XDG, XCR, XDR, & + ZEGR, XFR, XCG, XDG, 0., XCR, XDR, 0., & XDRYLBDAG_MAX, XDRYLBDAR_MAX, XDRYLBDAG_MIN, XDRYLBDAR_MIN, & PFDINFTY, XKER_Q_RDRYG ) ! diff --git a/src/MNH/ini_rain_ice.f90 b/src/MNH/ini_rain_ice.f90 index 62cabad5b587f48a6cd6d443c088c8c7cea8c2ca..2c1ef440e54c4ed484d2b8547521293641d7a1ad 100644 --- a/src/MNH/ini_rain_ice.f90 +++ b/src/MNH/ini_rain_ice.f90 @@ -102,6 +102,7 @@ END MODULE MODI_INI_RAIN_ICE !! S. Riette 2016-11: new ICE3/ICE4 options !! P. Wautelet 22/01/2019 bug correction: incorrect write ! P. Wautelet 26/04/2019: replace non-standard FLOAT function by REAL function +! J. Wurtz 03/2022: New snow characteristics with LSNOW_T ! !------------------------------------------------------------------------------- ! @@ -297,11 +298,25 @@ XF2I = 0.14 ! XAS = 0.02 XBS = 1.9 -XCS = 5.1 +IF (LSNOW_T) THEN +!Cas Gamma generalisee +XCS = 11.52 +XDS = 0.39 +XFVELOS =0.097 +!Cas MP +!XCS = 13.2 +!XDS = 0.423 +!XFVELOS = 25.14 +ELSE +XCS = 5. XDS = 0.27 +XFVELOS = 0. +END IF ! +IF (.NOT. LSNOW_T) THEN XCCS = 5.0 XCXS = 1.0 +END IF ! XF0S = 0.86 XF1S = 0.28 @@ -377,8 +392,17 @@ XNUR = 1.0 ! Exponential law XALPHAI = 3.0 ! Gamma law for the ice crystal volume XNUI = 3.0 ! Gamma law with little dispersion ! -XALPHAS = 1.0 ! Exponential law -XNUS = 1.0 ! Exponential law +IF (LSNOW_T) THEN +!Cas GAMMAGEN + XALPHAS = .214 ! Generalized gamma law + XNUS = 43.7 ! Generalized gamma law + XTRANS_MP_GAMMAS = SQRT( ( GAMMA(XNUS + 2./XALPHAS)*GAMMA(XNUS + 4./XALPHAS) ) / & + ( 8.* GAMMA(XNUS + 1./XALPHAS)*GAMMA(XNUS + 3./XALPHAS) ) ) +ELSE + XALPHAS = 1.0 ! Exponential law + XNUS = 1.0 ! Exponential law + XTRANS_MP_GAMMAS = 1. +END IF ! XALPHAG = 1.0 ! Exponential law XNUG = 1.0 ! Exponential law @@ -400,8 +424,13 @@ XLBR = ( XAR*XCCR*MOMG(XALPHAR,XNUR,XBR) )**(-XLBEXR) XLBEXI = 1.0/(-XBI) XLBI = ( XAI*MOMG(XALPHAI,XNUI,XBI) )**(-XLBEXI) ! -XLBEXS = 1.0/(XCXS-XBS) -XLBS = ( XAS*XCCS*MOMG(XALPHAS,XNUS,XBS) )**(-XLBEXS) +IF (LSNOW_T) THEN + XLBEXS = 0. ! Not used + XLBS = 1.0/(XAS*MOMG(XALPHAS,XNUS,XBS)) +ELSE + XLBEXS = 1.0/(XCXS-XBS) + XLBS = ( XAS*XCCS*MOMG(XALPHAS,XNUS,XBS) )**(-XLBEXS) +END IF ! XLBEXG = 1.0/(XCXG-XBG) XLBG = ( XAG*XCCG*MOMG(XALPHAG,XNUG,XBG) )**(-XLBEXG) @@ -414,7 +443,8 @@ XLBH = ( XAH*XCCH*MOMG(XALPHAH,XNUH,XBH) )**(-XLBEXH) XLBDAS_MAX = 100000.0 ! ZCONC_MAX = 1.E6 ! Maximal concentration for falling particules set to 1 per cc -XLBDAS_MAX = ( ZCONC_MAX/XCCS )**(1./XCXS) +XLBDAS_MAX = 1.E6 +XLBDAS_MIN = 1000. ! IF (HCLOUD == 'ICE4') THEN ALLOCATE( XRTMIN(7) ) @@ -481,9 +511,20 @@ XEXCSEDI =-0.9324*3.0 WRITE (KLUOUT,FMT=*)' PRISTINE ICE SEDIMENTATION for columns XFSEDI =',XFSEDI ! ! -XEXSEDS = (XBS+XDS-XCXS)/(XBS-XCXS) -XFSEDS = XCS*XAS*XCCS*MOMG(XALPHAS,XNUS,XBS+XDS)* & +IF (LSNOW_T) THEN +!HOUZE/HAIC + !XEXSEDS = -XDS !(2*XBS+XDS) + !XFSEDS = XCS*MOMG(XALPHAS,XNUS,XBS+XDS)/(MOMG(XALPHAS,XNUS,XBS)) & + ! *(ZRHO00)**XCEXVT +!LH_EXTENDED + XEXSEDS = -XDS-XBS + XFSEDS = XCS*MOMG(XALPHAS,XNUS,XBS+XDS)/(MOMG(XALPHAS,XNUS,XBS)) & + *(ZRHO00)**XCEXVT +ELSE + XEXSEDS = (XBS+XDS-XCXS)/(XBS-XCXS) + XFSEDS = XCS*XAS*XCCS*MOMG(XALPHAS,XNUS,XBS+XDS)* & (XAS*XCCS*MOMG(XALPHAS,XNUS,XBS))**(-XEXSEDS)*(ZRHO00)**XCEXVT +END IF ! XEXSEDG = (XBG+XDG-XCXG)/(XBG-XCXG) XFSEDG = XCG*XAG*XCCG*MOMG(XALPHAG,XNUG,XBG+XDG)* & @@ -556,10 +597,10 @@ XSCFAC = (0.63**(1./3.))*SQRT((ZRHO00)**XCEXVT) ! One assumes Sc=0.63 X0DEPI = (4.0*XPI)*XC1I*XF0I*MOMG(XALPHAI,XNUI,1.) X2DEPI = (4.0*XPI)*XC1I*XF2I*XC_I*MOMG(XALPHAI,XNUI,XDI+2.0) ! -X0DEPS = (4.0*XPI)*XCCS*XC1S*XF0S*MOMG(XALPHAS,XNUS,1.) -X1DEPS = (4.0*XPI)*XCCS*XC1S*XF1S*SQRT(XCS)*MOMG(XALPHAS,XNUS,0.5*XDS+1.5) -XEX0DEPS = XCXS-1.0 -XEX1DEPS = XCXS-0.5*(XDS+3.0) +X0DEPS = XLBS*(4.0*XPI)*XC1S*XF0S*MOMG(XALPHAS,XNUS,1.) +X1DEPS = XLBS*(4.0*XPI)*XC1S*XF1S*SQRT(XCS)*MOMG(XALPHAS,XNUS,0.5*XDS+1.5) +XEX0DEPS = XBS-1.0 +XEX1DEPS = -0.5*(XDS+3.0) ! X0DEPG = (4.0*XPI)*XCCG*XC1G*XF0G*MOMG(XALPHAG,XNUG,1.) X1DEPG = (4.0*XPI)*XCCG*XC1G*XF1G*SQRT(XCG)*MOMG(XALPHAG,XNUG,0.5*XDG+1.5) @@ -599,8 +640,8 @@ END IF ! XCOLIS = 0.25 ! Collection efficiency of I+S XCOLEXIS = 0.05 ! Temperature factor of the I+S collection efficiency -XFIAGGS = (XPI/4.0)*XCOLIS*XCCS*XCS*(ZRHO00**XCEXVT)*MOMG(XALPHAS,XNUS,XDS+2.0) -XEXIAGGS = XCXS-XDS-2.0 +XFIAGGS = XLBS*(XPI/4.0)*XCOLIS*XCS*(ZRHO00**XCEXVT)*MOMG(XALPHAS,XNUS,XDS+2.0) +XEXIAGGS = -XDS - 2.0 ! GAMMGEN LH_EXTENDED ! GFLAG = .TRUE. IF (GFLAG) THEN @@ -651,15 +692,15 @@ XEX1EVAR = -1.0-0.5*(XDR+3.0) ! XDCSLIM = 0.007 ! D_cs^lim = 7 mm as suggested by Farley et al. (1989) XCOLCS = 1.0 -XEXCRIMSS= XCXS-XDS-2.0 -XCRIMSS = (XPI/4.0)*XCOLCS*XCCS*XCS*(ZRHO00**XCEXVT)*MOMG(XALPHAS,XNUS,XDS+2.0) +XEXCRIMSS= -XDS-2.0 +XCRIMSS = XLBS * (XPI/4.0)*XCOLCS*XCS*(ZRHO00**XCEXVT)*MOMG(XALPHAS,XNUS,XDS+2.0) XEXCRIMSG= XEXCRIMSS XCRIMSG = XCRIMSS -XSRIMCG = XCCS*XAS*MOMG(XALPHAS,XNUS,XBS) -XEXSRIMCG= XCXS-XBS -XSRIMCG2 = XCCS*XAG*MOMG(XALPHAS,XNUS,XBG) +XSRIMCG = XLBS*XAS*MOMG(XALPHAS,XNUS,XBS) +XEXSRIMCG = -XBS +XSRIMCG2 = XLBS*XAG*MOMG(XALPHAS,XNUS,XBG) XSRIMCG3 = XFRACM90 -XEXSRIMCG2=XCXS-XBG +XEXSRIMCG2=XBS-XBG ! GFLAG = .TRUE. IF (GFLAG) THEN @@ -689,13 +730,13 @@ XRIMINTP2 = 1.0 + XRIMINTP1*LOG( XDCSLIM/(XGAMINC_BOUND_MIN)**(1.0/XALPHAS) ) ! !* 7.2 Constants for the accretion of raindrops onto aggregates ! -XFRACCSS = ((XPI**2)/24.0)*XCCS*XCCR*XRHOLW*(ZRHO00**XCEXVT) +XFRACCSS = XLBS*((XPI**2)/24.0)*XCCR*XRHOLW*(ZRHO00**XCEXVT) ! XLBRACCS1 = MOMG(XALPHAS,XNUS,2.)*MOMG(XALPHAR,XNUR,3.) XLBRACCS2 = 2.*MOMG(XALPHAS,XNUS,1.)*MOMG(XALPHAR,XNUR,4.) XLBRACCS3 = MOMG(XALPHAR,XNUR,5.) ! -XFSACCRG = (XPI/4.0)*XAS*XCCS*XCCR*(ZRHO00**XCEXVT) +XFSACCRG = XLBS*(XPI/4.0)*XAS*XCCR*(ZRHO00**XCEXVT) ! XLBSACCR1 = MOMG(XALPHAR,XNUR,2.)*MOMG(XALPHAS,XNUS,XBS) XLBSACCR2 = 2.*MOMG(XALPHAR,XNUR,1.)*MOMG(XALPHAS,XNUS,XBS+1.) @@ -742,15 +783,15 @@ IF( (KACCLBDAS/=NACCLBDAS) .OR. (KACCLBDAR/=NACCLBDAR) .OR. (KND/=IND) .OR. & (PACCLBDAS_MIN/=XACCLBDAS_MIN) .OR. (PACCLBDAR_MIN/=XACCLBDAR_MIN) .OR. & (PFDINFTY/=ZFDINFTY) ) THEN CALL RRCOLSS ( IND, XALPHAS, XNUS, XALPHAR, XNUR, & - ZESR, XBR, XCS, XDS, XCR, XDR, & + ZESR, XBR, XCS, XDS, XFVELOS, XCR, XDR, & XACCLBDAS_MAX, XACCLBDAR_MAX, XACCLBDAS_MIN, XACCLBDAR_MIN, & ZFDINFTY, XKER_RACCSS, XAG, XBS, XAS ) CALL RZCOLX ( IND, XALPHAS, XNUS, XALPHAR, XNUR, & - ZESR, XBR, XCS, XDS, XCR, XDR, & + ZESR, XBR, XCS, XDS, XFVELOS, XCR, XDR, 0., & XACCLBDAS_MAX, XACCLBDAR_MAX, XACCLBDAS_MIN, XACCLBDAR_MIN, & ZFDINFTY, XKER_RACCS ) CALL RSCOLRG ( IND, XALPHAS, XNUS, XALPHAR, XNUR, & - ZESR, XBS, XCS, XDS, XCR, XDR, & + ZESR, XBS, XCS, XDS, XFVELOS, XCR, XDR, & XACCLBDAS_MAX, XACCLBDAR_MAX, XACCLBDAS_MIN, XACCLBDAR_MIN, & ZFDINFTY, XKER_SACCRG, XAG, XBS, XAS ) WRITE(UNIT=KLUOUT,FMT='("*****************************************")') @@ -887,7 +928,7 @@ XCOLSG = 0.01 ! Collection efficiency of S+G XCOLEXSG = 0.1 ! Temperature factor of the S+G collection efficiency WRITE (KLUOUT, FMT=*) ' NEW Constants for the aggregate collection by the graupeln' WRITE (KLUOUT, FMT=*) ' XCOLSG, XCOLEXSG = ',XCOLSG,XCOLEXSG -XFSDRYG = (XPI/4.0)*XCOLSG*XCCG*XCCS*XAS*(ZRHO00**XCEXVT) +XFSDRYG = XLBS*(XPI/4.0)*XCOLSG*XCCG*XAS*(ZRHO00**XCEXVT) ! XLBSDRYG1 = MOMG(XALPHAG,XNUG,2.)*MOMG(XALPHAS,XNUS,XBS) XLBSDRYG2 = 2.*MOMG(XALPHAG,XNUG,1.)*MOMG(XALPHAS,XNUS,XBS+1.) @@ -950,7 +991,7 @@ IF( (KDRYLBDAG/=NDRYLBDAG) .OR. (KDRYLBDAS/=NDRYLBDAS) .OR. (KND/=IND) .OR. & (PDRYLBDAG_MIN/=XDRYLBDAG_MIN) .OR. (PDRYLBDAS_MIN/=XDRYLBDAS_MIN) .OR. & (PFDINFTY/=ZFDINFTY) ) THEN CALL RZCOLX ( IND, XALPHAG, XNUG, XALPHAS, XNUS, & - ZEGS, XBS, XCG, XDG, XCS, XDS, & + ZEGS, XBS, XCG, XDG, 0., XCS, XDS, XFVELOS, & XDRYLBDAG_MAX, XDRYLBDAS_MAX, XDRYLBDAG_MIN, XDRYLBDAS_MIN, & ZFDINFTY, XKER_SDRYG ) WRITE(UNIT=KLUOUT,FMT='("*****************************************")') @@ -1016,7 +1057,7 @@ IF( (KDRYLBDAG/=NDRYLBDAG) .OR. (KDRYLBDAR/=NDRYLBDAR) .OR. (KND/=IND) .OR. & (PDRYLBDAG_MIN/=XDRYLBDAG_MIN) .OR. (PDRYLBDAR_MIN/=XDRYLBDAR_MIN) .OR. & (PFDINFTY/=ZFDINFTY) ) THEN CALL RZCOLX ( IND, XALPHAG, XNUG, XALPHAR, XNUR, & - ZEGR, XBR, XCG, XDG, XCR, XDR, & + ZEGR, XBR, XCG, XDG, 0., XCR, XDR, 0., & XDRYLBDAG_MAX, XDRYLBDAR_MAX, XDRYLBDAG_MIN, XDRYLBDAR_MIN, & ZFDINFTY, XKER_RDRYG ) WRITE(UNIT=KLUOUT,FMT='("*****************************************")') @@ -1082,7 +1123,8 @@ XFWETH = (XPI/4.0)*XCCH*XCH*(ZRHO00**XCEXVT)*MOMG(XALPHAH,XNUH,XDH+2.0) ! XCOLSH = 0.01 ! Collection efficiency of S+H XCOLEXSH = 0.1 ! Temperature factor of the S+H collection efficiency -XFSWETH = (XPI/4.0)*XCCH*XCCS*XAS*(ZRHO00**XCEXVT) +!XFSWETH = (XPI/4.0)*XCCH*XCCS*XAS*(ZRHO00**XCEXVT) +XFSWETH = XLBS*(XPI/4.0)*XCCH*XAS*(ZRHO00**XCEXVT) ! Wurtz ! XLBSWETH1 = MOMG(XALPHAH,XNUH,2.)*MOMG(XALPHAS,XNUS,XBS) XLBSWETH2 = 2.*MOMG(XALPHAH,XNUH,1.)*MOMG(XALPHAS,XNUS,XBS+1.) @@ -1154,7 +1196,7 @@ IF( (KWETLBDAH/=NWETLBDAH) .OR. (KWETLBDAS/=NWETLBDAS) .OR. (KND/=IND) .OR. & (PWETLBDAH_MIN/=XWETLBDAH_MIN) .OR. (PWETLBDAS_MIN/=XWETLBDAS_MIN) .OR. & (PFDINFTY/=ZFDINFTY) ) THEN CALL RZCOLX ( IND, XALPHAH, XNUH, XALPHAS, XNUS, & - ZEHS, XBS, XCH, XDH, XCS, XDS, & + ZEHS, XBS, XCH, XDH, 0., XCS, XDS, XFVELOS, & XWETLBDAH_MAX, XWETLBDAS_MAX, XWETLBDAH_MIN, XWETLBDAS_MIN, & ZFDINFTY, XKER_SWETH ) WRITE(UNIT=KLUOUT,FMT='("*****************************************")') @@ -1220,7 +1262,7 @@ IF( (KWETLBDAH/=NWETLBDAH) .OR. (KWETLBDAG/=NWETLBDAG) .OR. (KND/=IND) .OR. & (PWETLBDAH_MIN/=XWETLBDAH_MIN) .OR. (PWETLBDAG_MIN/=XWETLBDAG_MIN) .OR. & (PFDINFTY/=ZFDINFTY) ) THEN CALL RZCOLX ( IND, XALPHAH, XNUH, XALPHAG, XNUG, & - ZEHG, XBG, XCH, XDH, XCG, XDG, & + ZEHG, XBG, XCH, XDH, 0., XCG, XDG, 0., & XWETLBDAH_MAX, XWETLBDAG_MAX, XWETLBDAH_MIN, XWETLBDAG_MIN, & ZFDINFTY, XKER_GWETH ) WRITE(UNIT=KLUOUT,FMT='("*****************************************")') @@ -1286,7 +1328,7 @@ IF( (KWETLBDAH/=NWETLBDAH) .OR. (KWETLBDAR/=NWETLBDAR) .OR. (KND/=IND) .OR. & (PWETLBDAH_MIN/=XWETLBDAH_MIN) .OR. (PWETLBDAR_MIN/=XWETLBDAR_MIN) .OR. & (PFDINFTY/=ZFDINFTY) ) THEN CALL RZCOLX ( IND, XALPHAH, XNUH, XALPHAR, XNUR, & - ZEHR, XBR, XCH, XDH, XCR, XDR, & + ZEHR, XBR, XCH, XDH, 0., XCR, XDR, 0., & XWETLBDAH_MAX, XWETLBDAR_MAX, XWETLBDAH_MIN, XWETLBDAR_MIN, & ZFDINFTY, XKER_RWETH ) WRITE(UNIT=KLUOUT,FMT='("*****************************************")') diff --git a/src/MNH/ini_rain_ice_elec.f90 b/src/MNH/ini_rain_ice_elec.f90 index 940caeaeefc96dcda0800b7678b8be775815c116..978674f6912b966165a165116f9abe35eafb2b0f 100644 --- a/src/MNH/ini_rain_ice_elec.f90 +++ b/src/MNH/ini_rain_ice_elec.f90 @@ -87,6 +87,7 @@ END MODULE MODI_INI_RAIN_ICE_ELEC !! Modifications: !! C. Barthe 20/11/09 update to version 4.8.1 ! P. Wautelet 26/04/2019: replace non-standard FLOAT function by REAL function +! J. Wurtz 03/2022: New snow characteristics with LSNOW_T ! !------------------------------------------------------------------------------- ! @@ -271,11 +272,25 @@ XF2I = 0.14 ! XAS = 0.02 XBS = 1.9 -XCS = 5.1 +IF (LSNOW_T) THEN +!Cas Gamma generalisee +XCS = 11.52 +XDS = 0.39 +XFVELOS =0.097 +!Cas MP +!XCS = 13.2 +!XDS = 0.423 +!XFVELOS = 25.14 +ELSE +XCS = 5. XDS = 0.27 +XFVELOS = 0. +END IF ! +IF (.NOT. LSNOW_T) THEN XCCS = 5.0 XCXS = 1.0 +END IF ! XF0S = 0.86 XF1S = 0.28 @@ -342,8 +357,17 @@ XNUR = 1.0 ! Exponential law XALPHAI = 3.0 ! Gamma law for the ice crystal volume XNUI = 3.0 ! Gamma law with little dispersion ! -XALPHAS = 1.0 ! Exponential law -XNUS = 1.0 ! Exponential law +IF (LSNOW_T) THEN +!Cas GAMMAGEN + XALPHAS = .214 ! Generalized gamma law + XNUS = 43.7 ! Generalized gamma law + XTRANS_MP_GAMMAS = SQRT( ( GAMMA(XNUS + 2./XALPHAS)*GAMMA(XNUS + 4./XALPHAS) ) / & + ( 8.* GAMMA(XNUS + 1./XALPHAS)*GAMMA(XNUS + 3./XALPHAS) ) ) +ELSE + XALPHAS = 1.0 ! Exponential law + XNUS = 1.0 ! Exponential law + XTRANS_MP_GAMMAS = 1. +END IF ! XALPHAG = 1.0 ! Exponential law XNUG = 1.0 ! Exponential law @@ -365,8 +389,13 @@ XLBR = (XAR * XCCR * MOMG(XALPHAR,XNUR,XBR))**(-XLBEXR) XLBEXI = 1.0 / (-XBI) XLBI = (XAI * MOMG(XALPHAI,XNUI,XBI))**(-XLBEXI) ! -XLBEXS = 1.0 / (XCXS - XBS) -XLBS = (XAS * XCCS * MOMG(XALPHAS,XNUS,XBS))**(-XLBEXS) +IF (LSNOW_T) THEN + XLBEXS = 0. ! Not used + XLBS = 1.0/(XAS*MOMG(XALPHAS,XNUS,XBS)) +ELSE + XLBEXS = 1.0/(XCXS-XBS) + XLBS = ( XAS*XCCS*MOMG(XALPHAS,XNUS,XBS) )**(-XLBEXS) +END IF ! XLBEXG = 1.0 / (XCXG - XBG) XLBG = (XAG * XCCG * MOMG(XALPHAG,XNUG,XBG))**(-XLBEXG) @@ -381,7 +410,8 @@ XLBDAS_MAX = 100000.0 XLBDAG_MAX = 100000.0 ! ZCONC_MAX = 1.E6 ! Maximal concentration for falling particules set to 1 per cc -XLBDAS_MAX = (ZCONC_MAX / XCCS)**(1./XCXS) +XLBDAS_MAX = 1.E6 +XLBDAS_MIN = 1000. ! IF (HCLOUD == 'ICE4') THEN ALLOCATE( XRTMIN(7) ) @@ -441,17 +471,29 @@ XFSEDI = 3.89745E11 * MOMG(XALPHAI,XNUI,3.285) * & XEXCSEDI =-0.9324 * 3.0 WRITE (KLUOUT,FMT=*)' PRISTINE ICE SEDIMENTATION for columns XFSEDI =',XFSEDI ! -XEXSEDS = (XBS + XDS - XCXS) / (XBS - XCXS) -XFSEDS = XCS * XAS * XCCS * MOMG(XALPHAS,XNUS,XBS+XDS) * & - (XAS * XCCS * MOMG(XALPHAS,XNUS,XBS))**(-XEXSEDS) * (ZRHO00)**XCEXVT ! -XEXSEDG = (XBG + XDG - XCXG) / (XBG - XCXG) -XFSEDG = XCG * XAG * XCCG * MOMG(XALPHAG,XNUG,XBG+XDG) * & - (XAG * XCCG * MOMG(XALPHAG,XNUG,XBG))**(-XEXSEDG) * (ZRHO00)**XCEXVT +IF (LSNOW_T) THEN +!HOUZE/HAIC + !XEXSEDS = -XDS !(2*XBS+XDS) + !XFSEDS = XCS*MOMG(XALPHAS,XNUS,XBS+XDS)/(MOMG(XALPHAS,XNUS,XBS)) & + ! *(ZRHO00)**XCEXVT +!LH_EXTENDED + XEXSEDS = -XDS-XBS + XFSEDS = XCS*MOMG(XALPHAS,XNUS,XBS+XDS)/(MOMG(XALPHAS,XNUS,XBS)) & + *(ZRHO00)**XCEXVT +ELSE + XEXSEDS = (XBS+XDS-XCXS)/(XBS-XCXS) + XFSEDS = XCS*XAS*XCCS*MOMG(XALPHAS,XNUS,XBS+XDS)* & + (XAS*XCCS*MOMG(XALPHAS,XNUS,XBS))**(-XEXSEDS)*(ZRHO00)**XCEXVT +END IF +! +XEXSEDG = (XBG+XDG-XCXG)/(XBG-XCXG) +XFSEDG = XCG*XAG*XCCG*MOMG(XALPHAG,XNUG,XBG+XDG)* & + (XAG*XCCG*MOMG(XALPHAG,XNUG,XBG))**(-XEXSEDG)*(ZRHO00)**XCEXVT ! -XEXSEDH = (XBH + XDH - XCXH) / (XBH - XCXH) -XFSEDH = XCH * XAH * XCCH * MOMG(XALPHAH,XNUH,XBH+XDH) * & - (XAH * XCCH * MOMG(XALPHAH,XNUH,XBH))**(-XEXSEDH) * (ZRHO00)**XCEXVT +XEXSEDH = (XBH+XDH-XCXH)/(XBH-XCXH) +XFSEDH = XCH*XAH*XCCH*MOMG(XALPHAH,XNUH,XBH+XDH)* & + (XAH*XCCH*MOMG(XALPHAH,XNUH,XBH))**(-XEXSEDH)*(ZRHO00)**XCEXVT ! ! !------------------------------------------------------------------------------- @@ -516,10 +558,10 @@ XSCFAC = (0.63**(1./3.)) * SQRT((ZRHO00)**XCEXVT) ! One assumes Sc=0.63 X0DEPI = (4.0 * XPI) * XC1I * XF0I * MOMG(XALPHAI,XNUI,1.) X2DEPI = (4.0 * XPI) * XC1I * XF2I * XC_I * MOMG(XALPHAI,XNUI,XDI+2.0) ! -X0DEPS = (4.0 * XPI) * XCCS * XC1S * XF0S * MOMG(XALPHAS,XNUS,1.) -X1DEPS = (4.0 * XPI) * XCCS * XC1S * XF1S * SQRT(XCS) * MOMG(XALPHAS,XNUS,0.5*XDS+1.5) -XEX0DEPS = XCXS - 1.0 -XEX1DEPS = XCXS - 0.5 * (XDS + 3.0) +X0DEPS = XLBS*(4.0*XPI)*XC1S*XF0S*MOMG(XALPHAS,XNUS,1.) +X1DEPS = XLBS*(4.0*XPI)*XC1S*XF1S*SQRT(XCS)*MOMG(XALPHAS,XNUS,0.5*XDS+1.5) +XEX0DEPS = XBS-1.0 +XEX1DEPS = -0.5*(XDS+3.0) ! X0DEPG = (4.0 * XPI) * XCCG * XC1G * XF0G * MOMG(XALPHAG,XNUG,1.) X1DEPG = (4.0 * XPI) * XCCG * XC1G * XF1G * SQRT(XCG) * MOMG(XALPHAG,XNUG,0.5*XDG+1.5) @@ -552,9 +594,8 @@ END IF ! XCOLIS = 0.25 ! Collection efficiency of I+S XCOLEXIS = 0.05 ! Temperature factor of the I+S collection efficiency -XFIAGGS = (XPI / 4.0) * XCOLIS * XCCS * XCS * (ZRHO00**XCEXVT) * & - MOMG(XALPHAS,XNUS,XDS+2.0) -XEXIAGGS = XCXS - XDS - 2.0 +XFIAGGS = XLBS*(XPI/4.0)*XCOLIS*XCS*(ZRHO00**XCEXVT)*MOMG(XALPHAS,XNUS,XDS+2.0) +XEXIAGGS = -XDS - 2.0 ! GAMMGEN LH_EXTENDED ! GFLAG = .TRUE. IF (GFLAG) THEN @@ -604,12 +645,15 @@ XEX1EVAR = -1.0 - 0.5 * (XDR + 3.0) ! XDCSLIM = 0.007 ! D_cs^lim = 7 mm as suggested by Farley et al. (1989) XCOLCS = 1.0 -XEXCRIMSS= XCXS - XDS - 2.0 -XCRIMSS = (XPI / 4.0) * XCOLCS * XCCS * XCS * (ZRHO00**XCEXVT) * MOMG(XALPHAS,XNUS,XDS+2.0) +XEXCRIMSS= -XDS-2.0 +XCRIMSS = XLBS * (XPI/4.0)*XCOLCS*XCS*(ZRHO00**XCEXVT)*MOMG(XALPHAS,XNUS,XDS+2.0) XEXCRIMSG= XEXCRIMSS XCRIMSG = XCRIMSS -XSRIMCG = XCCS * XAS * MOMG(XALPHAS,XNUS,XBS) -XEXSRIMCG= XCXS - XBS +XSRIMCG = XLBS*XAS*MOMG(XALPHAS,XNUS,XBS) +XEXSRIMCG = -XBS +XSRIMCG2 = XLBS*XAG*MOMG(XALPHAS,XNUS,XBG) +XSRIMCG3 = XFRACM90 +XEXSRIMCG2=XBS-XBG ! GFLAG = .TRUE. IF (GFLAG) THEN @@ -640,13 +684,13 @@ XRIMINTP2 = 1.0 + XRIMINTP1 * LOG(XDCSLIM/(XGAMINC_BOUND_MIN)**(1.0/XALPHAS)) ! !* 7.2 Constants for the accretion of raindrops onto aggregates ! -XFRACCSS = ((XPI**2) / 24.0) * XCCS * XCCR * XRHOLW * (ZRHO00**XCEXVT) +XFRACCSS = XLBS*((XPI**2)/24.0)*XCCR*XRHOLW*(ZRHO00**XCEXVT) ! XLBRACCS1 = MOMG(XALPHAS,XNUS,2.) * MOMG(XALPHAR,XNUR,3.) XLBRACCS2 = 2. * MOMG(XALPHAS,XNUS,1.) * MOMG(XALPHAR,XNUR,4.) XLBRACCS3 = MOMG(XALPHAR,XNUR,5.) ! -XFSACCRG = (XPI / 4.0) * XAS * XCCS * XCCR * (ZRHO00**XCEXVT) +XFSACCRG = XLBS*(XPI/4.0)*XAS*XCCR*(ZRHO00**XCEXVT) ! XLBSACCR1 = MOMG(XALPHAR,XNUR,2.) * MOMG(XALPHAS,XNUS,XBS) XLBSACCR2 = 2. * MOMG(XALPHAR,XNUR,1.) * MOMG(XALPHAS,XNUS,XBS+1.) @@ -694,15 +738,15 @@ IF( (KACCLBDAS/=NACCLBDAS) .OR. (KACCLBDAR/=NACCLBDAR) .OR. (KND/=IND) .OR. & (PACCLBDAS_MIN/=XACCLBDAS_MIN) .OR. (PACCLBDAR_MIN/=XACCLBDAR_MIN) .OR. & (PFDINFTY/=ZFDINFTY) ) THEN CALL RRCOLSS ( IND, XALPHAS, XNUS, XALPHAR, XNUR, & - ZESR, XBR, XCS, XDS, XCR, XDR, & + ZESR, XBR, XCS, XDS, XFVELOS, XCR, XDR, & XACCLBDAS_MAX, XACCLBDAR_MAX, XACCLBDAS_MIN, XACCLBDAR_MIN, & ZFDINFTY, XKER_RACCSS, XAG, XBS, XAS ) CALL RZCOLX ( IND, XALPHAS, XNUS, XALPHAR, XNUR, & - ZESR, XBR, XCS, XDS, XCR, XDR, & + ZESR, XBR, XCS, XDS, XFVELOS, XCR, XDR, 0., & XACCLBDAS_MAX, XACCLBDAR_MAX, XACCLBDAS_MIN, XACCLBDAR_MIN, & ZFDINFTY, XKER_RACCS ) CALL RSCOLRG ( IND, XALPHAS, XNUS, XALPHAR, XNUR, & - ZESR, XBS, XCS, XDS, XCR, XDR, & + ZESR, XBS, XCS, XDS, XFVELOS, XCR, XDR, & XACCLBDAS_MAX, XACCLBDAR_MAX, XACCLBDAS_MIN, XACCLBDAR_MIN, & ZFDINFTY, XKER_SACCRG, XAG, XBS, XAS ) WRITE(UNIT=KLUOUT,FMT='("*****************************************")') @@ -820,9 +864,9 @@ XCOLIG = 0.01 ! Collection efficiency of I+G XCOLEXIG = 0.1 ! Temperature factor of the I+G collection efficiency WRITE (KLUOUT, FMT=*) ' NEW Constants for the cloud ice collection by the graupeln' WRITE (KLUOUT, FMT=*) ' XCOLIG, XCOLEXIG = ',XCOLIG,XCOLEXIG -! -XFIDRYG = (XPI / 4.0) * XCOLIG * XCCG * XCG * (ZRHO00**XCEXVT) * & - MOMG(XALPHAG,XNUG,XDG+2.0) +XFIDRYG = (XPI/4.0)*XCOLIG*XCCG*XCG*(ZRHO00**XCEXVT)*MOMG(XALPHAG,XNUG,XDG+2.0) +XEXFIDRYG=(XCXG-XDG-2.)/(XCXG-XBG) +XFIDRYG2=XFIDRYG/XCOLIG*(XAG*XCCG*MOMG(XALPHAG,XNUG,XBG))**(-XEXFIDRYG) ! GFLAG = .TRUE. IF (GFLAG) THEN @@ -839,8 +883,7 @@ XCOLSG = 0.01 ! Collection efficiency of S+G XCOLEXSG = 0.1 ! Temperature factor of the S+G collection efficiency WRITE (KLUOUT, FMT=*) ' NEW Constants for the aggregate collection by the graupeln' WRITE (KLUOUT, FMT=*) ' XCOLSG, XCOLEXSG = ',XCOLSG,XCOLEXSG -! -XFSDRYG = (XPI / 4.0) * XCOLSG * XCCG * XCCS * XAS * (ZRHO00**XCEXVT) +XFSDRYG = XLBS*(XPI/4.0)*XCOLSG*XCCG*XAS*(ZRHO00**XCEXVT) ! XLBSDRYG1 = MOMG(XALPHAG,XNUG,2.) * MOMG(XALPHAS,XNUS,XBS) XLBSDRYG2 = 2. * MOMG(XALPHAG,XNUG,1.) * MOMG(XALPHAS,XNUS,XBS+1.) @@ -905,7 +948,7 @@ IF( (KDRYLBDAG/=NDRYLBDAG) .OR. (KDRYLBDAS/=NDRYLBDAS) .OR. (KND/=IND) .OR. & (PDRYLBDAG_MIN/=XDRYLBDAG_MIN) .OR. (PDRYLBDAS_MIN/=XDRYLBDAS_MIN) .OR. & (PFDINFTY/=ZFDINFTY) ) THEN CALL RZCOLX ( IND, XALPHAG, XNUG, XALPHAS, XNUS, & - ZEGS, XBS, XCG, XDG, XCS, XDS, & + ZEGS, XBS, XCG, XDG,0., XCS, XDS, XFVELOS, & XDRYLBDAG_MAX, XDRYLBDAS_MAX, XDRYLBDAG_MIN, XDRYLBDAS_MIN, & ZFDINFTY, XKER_SDRYG ) WRITE(UNIT=KLUOUT,FMT='("*****************************************")') @@ -971,7 +1014,7 @@ IF( (KDRYLBDAG/=NDRYLBDAG) .OR. (KDRYLBDAR/=NDRYLBDAR) .OR. (KND/=IND) .OR. & (PDRYLBDAG_MIN/=XDRYLBDAG_MIN) .OR. (PDRYLBDAR_MIN/=XDRYLBDAR_MIN) .OR. & (PFDINFTY/=ZFDINFTY) ) THEN CALL RZCOLX ( IND, XALPHAG, XNUG, XALPHAR, XNUR, & - ZEGR, XBR, XCG, XDG, XCR, XDR, & + ZEGR, XBR, XCG, XDG, 0., XCR, XDR, 0., & XDRYLBDAG_MAX, XDRYLBDAR_MAX, XDRYLBDAG_MIN, XDRYLBDAR_MIN, & ZFDINFTY, XKER_RDRYG ) WRITE(UNIT=KLUOUT,FMT='("*****************************************")') @@ -1033,7 +1076,10 @@ XFWETH = (XPI / 4.0) * XCCH * XCH * (ZRHO00**XCEXVT) * MOMG(XALPHAH,XNUH,XDH+2.0 ! !* 9.2.2 Constants for the aggregate collection by the hailstones ! -XFSWETH = (XPI/4.0) * XCCH * XCCS * XAS * (ZRHO00**XCEXVT) +XCOLSH = 0.01 ! Collection efficiency of S+H +XCOLEXSH = 0.1 ! Temperature factor of the S+H collection efficiency +!XFSWETH = (XPI/4.0)*XCCH*XCCS*XAS*(ZRHO00**XCEXVT) +XFSWETH = XLBS*(XPI/4.0)*XCCH*XAS*(ZRHO00**XCEXVT) ! Wurtz ! XLBSWETH1 = MOMG(XALPHAH,XNUH,2.) * MOMG(XALPHAS,XNUS,XBS) XLBSWETH2 = 2. * MOMG(XALPHAH,XNUH,1.) * MOMG(XALPHAS,XNUS,XBS+1.) @@ -1089,7 +1135,7 @@ IF( (KWETLBDAH/=NWETLBDAH) .OR. (KWETLBDAS/=NWETLBDAS) .OR. (KND/=IND) .OR. & (PWETLBDAH_MIN/=XWETLBDAH_MIN) .OR. (PWETLBDAS_MIN/=XWETLBDAS_MIN) .OR. & (PFDINFTY/=ZFDINFTY) ) THEN CALL RZCOLX ( IND, XALPHAH, XNUH, XALPHAS, XNUS, & - ZEHS, XBS, XCH, XDH, XCS, XDS, & + ZEHS, XBS, XCH, XDH,0., XCS, XDS, XFVELOS, & XWETLBDAH_MAX, XWETLBDAS_MAX, XWETLBDAH_MIN, XWETLBDAS_MIN, & ZFDINFTY, XKER_SWETH ) WRITE(UNIT=KLUOUT,FMT='("*****************************************")') @@ -1155,7 +1201,7 @@ IF( (KWETLBDAH/=NWETLBDAH) .OR. (KWETLBDAG/=NWETLBDAG) .OR. (KND/=IND) .OR. & (PWETLBDAH_MIN/=XWETLBDAH_MIN) .OR. (PWETLBDAG_MIN/=XWETLBDAG_MIN) .OR. & (PFDINFTY/=ZFDINFTY) ) THEN CALL RZCOLX ( IND, XALPHAH, XNUH, XALPHAG, XNUG, & - ZEHG, XBG, XCH, XDH, XCG, XDG, & + ZEHG, XBG, XCH, XDH, 0., XCG, XDG, 0., & XWETLBDAH_MAX, XWETLBDAG_MAX, XWETLBDAH_MIN, XWETLBDAG_MIN, & ZFDINFTY, XKER_GWETH ) WRITE(UNIT=KLUOUT,FMT='("*****************************************")') diff --git a/src/MNH/init_aerosol_concentration.f90 b/src/MNH/init_aerosol_concentration.f90 index e86998c4b18e3a4f712a57c016ea1cbb7e9c14d0..32494739c32a42c280773d7510b518e518d2089b 100644 --- a/src/MNH/init_aerosol_concentration.f90 +++ b/src/MNH/init_aerosol_concentration.f90 @@ -54,7 +54,7 @@ END MODULE MODI_INIT_AEROSOL_CONCENTRATION USE MODD_NSV USE MODD_PARAM_n, ONLY : CCLOUD USE MODD_PARAM_LIMA, ONLY : LWARM, LACTI, NMOD_CCN, LSCAV, LAERO_MASS, & - XCCN_CONC, LCCN_HOM, & + XCCN_CONC, LCCN_HOM, & LCOLD, LNUCL, NMOD_IFN, LMEYERS, & XIFN_CONC, LIFN_HOM USE MODD_PARAMETERS, ONLY : JPVEXT @@ -79,7 +79,7 @@ INTEGER :: IKB, IKE ! ! IF ( LWARM .AND. LACTI ) THEN - DO JSV = NSV_LIMA_CCN_FREE, NSV_LIMA_CCN_ACTI+NMOD_CCN-1 + DO JSV = NSV_LIMA_CCN_FREE, NSV_LIMA_CCN_ACTI+NMOD_CCN-1 PSVT(:,:,:,JSV) = 0.0 ENDDO IKB = 1+JPVEXT @@ -112,7 +112,7 @@ END IF ! LWARM AND LACTI ! Initialisation des concentrations en IFN ! IF ( LCOLD .AND. LNUCL .AND. (.NOT. LMEYERS) ) THEN - DO JSV = NSV_LIMA_IFN_FREE, NSV_LIMA_IFN_NUCL+NMOD_IFN-1 + DO JSV = NSV_LIMA_IFN_FREE, NSV_LIMA_IFN_NUCL+NMOD_IFN-1 PSVT(:,:,:,JSV) = 0.0 ENDDO IKB = 1+JPVEXT @@ -127,7 +127,7 @@ IF ( LCOLD .AND. LNUCL .AND. (.NOT. LMEYERS) ) THEN ELSE ! concentration décroissante selon z DO JSV = 1, NMOD_IFN - WHERE (PZZ(:,:,:) .LE. 1000.) + WHERE (PZZ(:,:,:) .LE. 1000.) PSVT(:,:,:,NSV_LIMA_IFN_FREE+JSV-1) = XIFN_CONC(JSV)*1.0E3 / PRHODREF(:,:,:) ELSEWHERE (PZZ(:,:,:) .LE. 10000.) PSVT(:,:,:,NSV_LIMA_IFN_FREE+JSV-1) = XIFN_CONC(JSV)*1.0E3 & diff --git a/src/MNH/lesn.f90 b/src/MNH/lesn.f90 index 129929246495bee84d57526e482a17fc9b4e52b7..c23dc91b3ec93bfe41659dd8e9a69c8ee54cbd53 100644 --- a/src/MNH/lesn.f90 +++ b/src/MNH/lesn.f90 @@ -107,6 +107,7 @@ REAL, DIMENSION(:,:,:), ALLOCATABLE :: ZEW REAL, DIMENSION(:,:,:), ALLOCATABLE :: ZINDCLD !indice cloud si rc>0 REAL, DIMENSION(:,:,:), ALLOCATABLE :: ZINDCLD2 !indice cloud rc>1E-5 REAL, DIMENSION(:,:,:), ALLOCATABLE :: ZCLDFR_LES! CLDFR on LES vertical grid +REAL, DIMENSION(:,:,:), ALLOCATABLE :: ZICEFR_LES! ICEFR on LES vertical grid REAL, DIMENSION(:,:,:), ALLOCATABLE :: ZRAINFR_LES! RAINFR on LES vertical grid REAL, DIMENSION(:,:,:), ALLOCATABLE :: ZMASSF ! massflux=rho*w REAL, DIMENSION(:,:,:), ALLOCATABLE :: ZREHU ! relative humidity @@ -345,9 +346,11 @@ END IF IF (LUSERI) THEN ALLOCATE(ZRI_LES (IIU,IJU,NLES_K)) ALLOCATE(ZIWP_LES(IIU,IJU)) + ALLOCATE(ZICEFR_LES(IIU,IJU,NLES_K)) ELSE ALLOCATE(ZRI_LES (0,0,0)) ALLOCATE(ZIWP_LES(0,0)) + ALLOCATE(ZICEFR_LES(0,0,0)) END IF IF (LUSERS) THEN ALLOCATE(ZRS_LES (IIU,IJU,NLES_K)) @@ -598,6 +601,7 @@ IF (LUSERI) THEN END DO CALL LES_MEAN_ll ( ZIWP_LES, LLES_CURRENT_CART_MASK(:,:,1), & XLES_IWP(NLES_CURRENT_TCOUNT) ) + CALL LES_VER_INT( XICEFR(:,:,:) ,ZICEFR_LES ) END IF IF (LUSERS) THEN IRR = IRR + 1 @@ -812,6 +816,8 @@ END IF IF (LUSERI) & CALL LES_MEAN_ll ( ZRI_LES, LLES_CURRENT_CART_MASK, & XLES_MEAN_Ri(:,NLES_CURRENT_TCOUNT,1) ) + CALL LES_MEAN_ll ( ZICEFR_LES, LLES_CURRENT_CART_MASK, & + XLES_MEAN_If(:,NLES_CURRENT_TCOUNT,1) ) ! IF (LUSERS) & CALL LES_MEAN_ll ( ZRS_LES, LLES_CURRENT_CART_MASK, & @@ -1046,6 +1052,7 @@ DEALLOCATE(ZINDCLD2 ) DEALLOCATE(ZINDCLD2D ) DEALLOCATE(ZINDCLD2D2) DEALLOCATE(ZCLDFR_LES) +DEALLOCATE(ZICEFR_LES) DEALLOCATE(ZRAINFR_LES) DEALLOCATE(ZMASSF ) DEALLOCATE(ZTEMP ) diff --git a/src/MNH/lidar.f90 b/src/MNH/lidar.f90 index 4a3d987e8873486c7ce58e984cf78dc6b21a49da..a7b0bf94d598c56b4f72a3acd6480f51138a99fe 100644 --- a/src/MNH/lidar.f90 +++ b/src/MNH/lidar.f90 @@ -8,7 +8,7 @@ ! ################# ! INTERFACE - SUBROUTINE LIDAR(HCLOUD,HVIEW,PALT,PWVL,PZZ,PRHO,PCLDFR,PRT, & + SUBROUTINE LIDAR(HCLOUD,HVIEW,PALT,PWVL,PZZ,PRHO,PT,PCLDFR,PRT, & PLIDAROUT,PLIPAROUT,PCT,PDSTC,PDSTD,PDSTS) ! CHARACTER(LEN=*), INTENT(IN) :: HCLOUD ! Name of the cloud scheme @@ -17,6 +17,7 @@ REAL, INTENT(IN) :: PALT ! Altitude of the lidar source REAL, INTENT(IN) :: PWVL ! Wavelength of the lidar source REAL, DIMENSION(:,:,:), INTENT(IN) :: PZZ ! Altitude REAL, DIMENSION(:,:,:), INTENT(IN) :: PRHO ! Air density +REAL, DIMENSION(:,:,:), INTENT(IN) :: PT ! Air temperature (C) REAL, DIMENSION(:,:,:), INTENT(IN) :: PCLDFR ! Cloud fraction REAL, DIMENSION(:,:,:,:), INTENT(IN) :: PRT ! Moist variables at t REAL, DIMENSION(:,:,:), INTENT(OUT) :: PLIDAROUT ! Lidar output @@ -36,7 +37,7 @@ END INTERFACE ! END MODULE MODI_LIDAR ! ######################################################### - SUBROUTINE LIDAR(HCLOUD,HVIEW,PALT,PWVL,PZZ,PRHO,PCLDFR,PRT, & + SUBROUTINE LIDAR(HCLOUD,HVIEW,PALT,PWVL,PZZ,PRHO,PT,PCLDFR,PRT, & PLIDAROUT,PLIPAROUT,PCT,PDSTC,PDSTD,PDSTS) ! ######################################################### ! @@ -98,6 +99,7 @@ USE MODD_RAIN_C2R2_DESCR, ONLY : XLBEXC, XLBEXR, & XRTMIN, XCTMIN USE MODD_PARAM_C2R2, ONLY : YALPHAC=>XALPHAC,YNUC=>XNUC, & YALPHAR=>XALPHAR,YNUR=>XNUR +USE MODD_PARAM_ICE, ONLY: WSNOW_T=>LSNOW_T USE MODD_RAIN_ICE_DESCR, ONLY : XCCR, WLBEXR=>XLBEXR, XLBR, & XCCS, XCXS, XLBEXS, XLBS, & XCCG, XCXG, XLBEXG, XLBG, & @@ -109,9 +111,11 @@ USE MODD_ICE_C1R3_DESCR, ONLY : XLBEXI, & USE MODD_PARAM_LIMA, ONLY : URTMIN=>XRTMIN, UCTMIN=>XCTMIN, & UALPHAC=>XALPHAC,UNUC=>XNUC, & UALPHAR=>XALPHAR,UNUR=>XNUR, & - UALPHAI=>XALPHAI,UNUI=>XNUI + UALPHAI=>XALPHAI,UNUI=>XNUI, & + USNOW_T=>LSNOW_T USE MODD_PARAM_LIMA_COLD, ONLY : UCCS=>XCCS, UCXS=>XCXS, ULBEXS=>XLBEXS, & - ULBS=>XLBS + ULBS=>XLBS, & + XLBDAS_MAX,XLBDAS_MIN, UBS=>XBS USE MODD_PARAM_LIMA_MIXED,ONLY : UCCG=>XCCG, UCXG=>XCXG, ULBEXG=>XLBEXG, & ULBG=>XLBG @@ -130,6 +134,7 @@ REAL, INTENT(IN) :: PALT ! Altitude of the lidar source REAL, INTENT(IN) :: PWVL ! Wavelength of the lidar source REAL, DIMENSION(:,:,:), INTENT(IN) :: PZZ ! Altitude REAL, DIMENSION(:,:,:), INTENT(IN) :: PRHO ! Air density +REAL, DIMENSION(:,:,:), INTENT(IN) :: PT ! Air temperature (C) REAL, DIMENSION(:,:,:), INTENT(IN) :: PCLDFR ! Cloud fraction REAL, DIMENSION(:,:,:,:), INTENT(IN) :: PRT ! Moist variables at t REAL, DIMENSION(:,:,:), INTENT(OUT) :: PLIDAROUT ! Lidar output @@ -523,9 +528,19 @@ SELECT CASE ( HCLOUD ) ! YDSD = 'MONOD' ZIWC = PRHO(JI,JJ,JK)*PRT(JI,JJ,JK,5) - ZLBDAS = ZLBS*(ZIWC)**ZLBEXS + IF ( (HCLOUD=='LIMA' .AND. USNOW_T) .OR. & + (HCLOUD=='ICE3' .AND. WSNOW_T) ) THEN + IF (PT(JI,JJ,JK)>-10.) THEN + ZLBDAS = MAX(MIN(XLBDAS_MAX, 10**(14.554-0.0423*(PT(JI,JJ,JK)+273.15))),XLBDAS_MIN) + ELSE + ZLBDAS = MAX(MIN(XLBDAS_MAX, 10**(6.226-0.0106*(PT(JI,JJ,JK)+273.15))),XLBDAS_MIN) + END IF + ZCONC=ZLBS*ZIWC*ZLBDAS**UBS + ELSE + ZLBDAS = ZLBS*(ZIWC)**ZLBEXS + ZCONC = ZCCS*(ZLBDAS)**ZCXS + END IF IF (ZLBDAS .GT. 0) THEN - ZCONC = ZCCS*(ZLBDAS)**ZCXS ZRADIUS = 0.5*(3.0/ZLBDAS) ! Assume Marshall-Palmer law for Reff IANGLE = 11 CALL BHMIE_WATER( ZWAVE_LENGTH, ZZREFIND_ICE, YDSD, ZCONC, & diff --git a/src/MNH/lima.f90 b/src/MNH/lima.f90 index c248f1acf5366d8bea72fab2055770f2562e5cc4..02b7a5b9c5af4a998838d9852595262b12454272 100644 --- a/src/MNH/lima.f90 +++ b/src/MNH/lima.f90 @@ -233,7 +233,7 @@ REAL, DIMENSION(:), ALLOCATABLE :: & Z_RC_ACCR, Z_CC_ACCR, & ! accretion of droplets by rain drops (ACCR) : rc, Nc, rr=-rr Z_CR_SCBU, & ! self collectio break up of drops (SCBU) : Nr ! Z_TH_EVAP, Z_RC_EVAP, Z_CC_EVAP, Z_RR_EVAP, Z_CR_EVAP, & ! evaporation of rain drops (EVAP) : rv=-rr-rc, rc, Nc, rr, Nr, th - Z_TH_EVAP, Z_RR_EVAP, & ! evaporation of rain drops (EVAP) : rv=-rr-rc, rc, Nc, rr, Nr, th + Z_TH_EVAP, Z_RR_EVAP, Z_CR_EVAP, & ! evaporation of rain drops (EVAP) : rv=-rr-rc, rc, Nc, rr, Nr, th Z_RI_CNVI, Z_CI_CNVI, & ! conversion snow -> ice (CNVI) : ri, Ni, rs=-ri Z_TH_DEPS, Z_RS_DEPS, & ! deposition of vapor on snow (DEPS) : rv=-rs, rs, th Z_TH_DEPI, Z_RI_DEPI, & ! deposition of vapor on ice (DEPI) : rv=-ri, ri, th @@ -284,7 +284,7 @@ REAL, DIMENSION(:,:,:), ALLOCATABLE :: & ZTOT_RC_ACCR, ZTOT_CC_ACCR, & ! accretion of droplets by rain drops (ACCR) ZTOT_CR_SCBU, & ! self collectio break up of drops (SCBU) ! ZTOT_TH_EVAP, ZTOT_RC_EVAP, ZTOT_CC_EVAP, ZTOT_RR_EVAP, ZTOT_CR_EVAP, & ! evaporation of rain drops (EVAP) - ZTOT_TH_EVAP, ZTOT_RR_EVAP, & ! evaporation of rain drops (EVAP) + ZTOT_TH_EVAP, ZTOT_RR_EVAP, ZTOT_CR_EVAP, & ! evaporation of rain drops (EVAP) ZTOT_RI_CNVI, ZTOT_CI_CNVI, & ! conversion snow -> ice (CNVI) ZTOT_TH_DEPS, ZTOT_RS_DEPS, & ! deposition of vapor on snow (DEPS) ZTOT_TH_DEPI, ZTOT_RI_DEPI, & ! deposition of vapor on ice (DEPI) @@ -428,7 +428,7 @@ if ( lbu_enable ) then ! allocate( ZTOT_RC_EVAP (size( ptht, 1), size( ptht, 2), size( ptht, 3) ) ); ZTOT_RC_EVAP(:,:,:) = 0. ! allocate( ZTOT_CC_EVAP (size( ptht, 1), size( ptht, 2), size( ptht, 3) ) ); ZTOT_CC_EVAP(:,:,:) = 0. allocate( ZTOT_RR_EVAP (size( ptht, 1), size( ptht, 2), size( ptht, 3) ) ); ZTOT_RR_EVAP(:,:,:) = 0. -! allocate( ZTOT_CR_EVAP (size( ptht, 1), size( ptht, 2), size( ptht, 3) ) ); ZTOT_CR_EVAP(:,:,:) = 0. + allocate( ZTOT_CR_EVAP (size( ptht, 1), size( ptht, 2), size( ptht, 3) ) ); ZTOT_CR_EVAP(:,:,:) = 0. allocate( ZTOT_RI_CNVI (size( ptht, 1), size( ptht, 2), size( ptht, 3) ) ); ZTOT_RI_CNVI(:,:,:) = 0. allocate( ZTOT_CI_CNVI (size( ptht, 1), size( ptht, 2), size( ptht, 3) ) ); ZTOT_CI_CNVI(:,:,:) = 0. allocate( ZTOT_TH_DEPS (size( ptht, 1), size( ptht, 2), size( ptht, 3) ) ); ZTOT_TH_DEPS(:,:,:) = 0. @@ -768,18 +768,12 @@ IF ( LCOLD ) ZCIT(:,:,:) = ZCIS(:,:,:) * PTSTEP !* 2. Compute cloud, ice and precipitation fractions ! ---------------------------------------------- ! -IF (LSUBG_COND) THEN - CALL LIMA_COMPUTE_CLOUD_FRACTIONS (IIB, IIE, IJB, IJE, IKB, IKE, KKL, & - ZCCT, ZRCT, & - ZCRT, ZRRT, & - ZCIT, ZRIT, & - ZRST, ZRGT, ZRHT, & - PCLDFR, PICEFR, PPRCFR ) -ELSE - PCLDFR(:,:,:)=1. - PICEFR(:,:,:)=1. - PPRCFR(:,:,:)=1. -END IF +CALL LIMA_COMPUTE_CLOUD_FRACTIONS (IIB, IIE, IJB, IJE, IKB, IKE, KKL, & + ZCCT, ZRCT, & + ZCRT, ZRRT, & + ZCIT, ZRIT, & + ZRST, ZRGT, ZRHT, & + PCLDFR, PICEFR, PPRCFR ) ! !------------------------------------------------------------------------------- ! @@ -994,6 +988,7 @@ DO WHILE(ANY(ZTIME(IIB:IIE,IJB:IJE,IKTB:IKTE)<PTSTEP)) ALLOCATE(Z_CR_SCBU(IPACK)) ; Z_CR_SCBU(:) = 0. ALLOCATE(Z_TH_EVAP(IPACK)) ; Z_TH_EVAP(:) = 0. ALLOCATE(Z_RR_EVAP(IPACK)) ; Z_RR_EVAP(:) = 0. + ALLOCATE(Z_CR_EVAP(IPACK)) ; Z_CR_EVAP(:) = 0. ALLOCATE(Z_RI_CNVI(IPACK)) ; Z_RI_CNVI(:) = 0. ALLOCATE(Z_CI_CNVI(IPACK)) ; Z_CI_CNVI(:) = 0. ALLOCATE(Z_TH_DEPS(IPACK)) ; Z_TH_DEPS(:) = 0. @@ -1086,7 +1081,7 @@ DO WHILE(ANY(ZTIME(IIB:IIE,IJB:IJE,IKTB:IKTE)<PTSTEP)) Z_RC_AUTO, Z_CC_AUTO, Z_CR_AUTO, & Z_RC_ACCR, Z_CC_ACCR, & Z_CR_SCBU, & - Z_TH_EVAP, Z_RR_EVAP, & + Z_TH_EVAP, Z_RR_EVAP, Z_CR_EVAP, & Z_RI_CNVI, Z_CI_CNVI, & Z_TH_DEPS, Z_RS_DEPS, & Z_TH_DEPI, Z_RI_DEPI, & @@ -1370,7 +1365,7 @@ DO WHILE(ANY(ZTIME(IIB:IIE,IJB:IJE,IKTB:IKTE)<PTSTEP)) !!$ ZTOT_RC_EVAP(I1(II),I2(II),I3(II)) = ZTOT_RC_EVAP(I1(II),I2(II),I3(II)) + Z_RC_EVAP(II) * ZMAXTIME(II) !!$ ZTOT_CC_EVAP(I1(II),I2(II),I3(II)) = ZTOT_CC_EVAP(I1(II),I2(II),I3(II)) + Z_CC_EVAP(II) * ZMAXTIME(II) ZTOT_RR_EVAP(I1(II),I2(II),I3(II)) = ZTOT_RR_EVAP(I1(II),I2(II),I3(II)) + Z_RR_EVAP(II) * ZMAXTIME(II) -!!$ ZTOT_CR_EVAP(I1(II),I2(II),I3(II)) = ZTOT_CR_EVAP(I1(II),I2(II),I3(II)) + Z_CR_EVAP(II) * ZMAXTIME(II) + ZTOT_CR_EVAP(I1(II),I2(II),I3(II)) = ZTOT_CR_EVAP(I1(II),I2(II),I3(II)) + Z_CR_EVAP(II) * ZMAXTIME(II) ZTOT_RI_CNVI(I1(II),I2(II),I3(II)) = ZTOT_RI_CNVI(I1(II),I2(II),I3(II)) + Z_RI_CNVI(II) * ZMAXTIME(II) ZTOT_CI_CNVI(I1(II),I2(II),I3(II)) = ZTOT_CI_CNVI(I1(II),I2(II),I3(II)) + Z_CI_CNVI(II) * ZMAXTIME(II) ZTOT_TH_DEPS(I1(II),I2(II),I3(II)) = ZTOT_TH_DEPS(I1(II),I2(II),I3(II)) + Z_TH_DEPS(II) * ZMAXTIME(II) @@ -1537,6 +1532,7 @@ DO WHILE(ANY(ZTIME(IIB:IIE,IJB:IJE,IKTB:IKTE)<PTSTEP)) DEALLOCATE(Z_CR_SCBU) DEALLOCATE(Z_TH_EVAP) DEALLOCATE(Z_RR_EVAP) + DEALLOCATE(Z_CR_EVAP) DEALLOCATE(Z_RI_CNVI) DEALLOCATE(Z_CI_CNVI) DEALLOCATE(Z_TH_DEPS) @@ -1765,7 +1761,7 @@ if ( lbu_enable ) then idx = NBUDGET_SV1 - 1 + nsv_lima_nr call Budget_store_add( tbudgets(idx), 'AUTO', ztot_cr_auto(:, :, :) * zrhodjontstep(:, :, :) ) call Budget_store_add( tbudgets(idx), 'SCBU', ztot_cr_scbu(:, :, :) * zrhodjontstep(:, :, :) ) - !call Budget_store_add( tbudgets(idx), 'REVA', 0. ) + call Budget_store_add( tbudgets(idx), 'REVA', ztot_cr_evap(:, :, :) * zrhodjontstep(:, :, :) ) call Budget_store_add( tbudgets(idx), 'BRKU', ztot_cr_brku(:, :, :) * zrhodjontstep(:, :, :) ) call Budget_store_add( tbudgets(idx), 'HONR', ztot_cr_honr(:, :, :) * zrhodjontstep(:, :, :) ) call Budget_store_add( tbudgets(idx), 'ACC', ztot_cr_acc (:, :, :) * zrhodjontstep(:, :, :) ) diff --git a/src/MNH/lima_adjust.f90 b/src/MNH/lima_adjust.f90 index 31ea1fefa3f64de70ef37019f48128354ae84871..410c9a92043c33866f2c5b8205598815e12bae59 100644 --- a/src/MNH/lima_adjust.f90 +++ b/src/MNH/lima_adjust.f90 @@ -9,12 +9,12 @@ ! INTERFACE ! - SUBROUTINE LIMA_ADJUST(KRR, KMI, TPFILE, & - OSUBG_COND, PTSTEP, & - PRHODREF, PRHODJ, PEXNREF, PPABSM, & - PPABST, & - PRT, PRS, PSVT, PSVS, & - PTHS, PSRCS, PCLDFR ) + SUBROUTINE LIMA_ADJUST(KRR, KMI, TPFILE, & + OSUBG_COND, PTSTEP, & + PRHODREF, PRHODJ, PEXNREF, PPABSM, & + PPABST, & + PRT, PRS, PSVT, PSVS, & + PTHS, PSRCS, PCLDFR, PICEFR, PRAINFR ) ! USE MODD_IO, ONLY: TFILEDATA USE MODD_NSV, only: NSV_LIMA_BEG @@ -47,6 +47,8 @@ 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) :: PICEFR ! Cloud fraction +REAL, DIMENSION(:,:,:), INTENT(INOUT) :: PRAINFR ! Cloud fraction ! END SUBROUTINE LIMA_ADJUST ! @@ -54,14 +56,14 @@ END INTERFACE ! END MODULE MODI_LIMA_ADJUST ! -! ########################################################### - SUBROUTINE LIMA_ADJUST(KRR, KMI, TPFILE, & - OSUBG_COND, PTSTEP, & - PRHODREF, PRHODJ, PEXNREF, PPABSM, & - PPABST, & - PRT, PRS, PSVT, PSVS, & - PTHS, PSRCS, PCLDFR ) -! ########################################################### +! ############################################################# + SUBROUTINE LIMA_ADJUST(KRR, KMI, TPFILE, & + OSUBG_COND, PTSTEP, & + PRHODREF, PRHODJ, PEXNREF, PPABSM, & + PPABST, & + PRT, PRS, PSVT, PSVS, & + PTHS, PSRCS, PCLDFR, PICEFR, PRAINFR ) +! ############################################################# ! !!**** *MIMA_ADJUST* - compute the fast microphysical sources !! @@ -202,6 +204,8 @@ 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) :: PICEFR ! Cloud fraction +REAL, DIMENSION(:,:,:), INTENT(INOUT) :: PRAINFR ! Cloud fraction ! ! !* 0.2 Declarations of local variables : @@ -1171,11 +1175,21 @@ END DO !* 5.2 compute the cloud fraction PCLDFR (binary !!!!!!!) ! IF ( .NOT. OSUBG_COND ) THEN - WHERE (PRCS(:,:,:) + PRIS(:,:,:) + PRSS(:,:,:) > 1.E-12 / ZDT) + WHERE (PRCS(:,:,:) + PRIS(:,:,:) + PRSS(:,:,:) > 1.E-12 / ZDT) PCLDFR(:,:,:) = 1. ELSEWHERE PCLDFR(:,:,:) = 0. ENDWHERE + WHERE (PRIS(:,:,:) > 1.E-12 / ZDT) + PICEFR(:,:,:) = 1. + ELSEWHERE + PICEFR(:,:,:) = 0. + ENDWHERE + WHERE (PRRS(:,:,:)+PRSS(:,:,:)+PRGS(:,:,:) > 1.E-12 / ZDT) + PRAINFR(:,:,:) = 1. + ELSEWHERE + PRAINFR(:,:,:) = 0. + ENDWHERE END IF ! IF ( SIZE(PSRCS,3) /= 0 ) THEN diff --git a/src/MNH/lima_adjust_split.f90 b/src/MNH/lima_adjust_split.f90 index 6f7dbb738c7ebbe213c1145f31eba74964ecf3c4..8baf17668657c028818b1bc75665b6d712b53f15 100644 --- a/src/MNH/lima_adjust_split.f90 +++ b/src/MNH/lima_adjust_split.f90 @@ -14,7 +14,7 @@ INTERFACE PRHODREF, PRHODJ, PEXNREF, PPABSM, PSIGS, PMFCONV, & PPABST, PZZ, PDTHRAD, PW_NU, & PRT, PRS, PSVT, PSVS, & - PTHS, PSRCS, PCLDFR, PRC_MF, PCF_MF ) + PTHS, PSRCS, PCLDFR, PICEFR, PRC_MF, PRI_MF, PCF_MF) ! USE MODD_IO, ONLY: TFILEDATA USE MODD_NSV, only: NSV_LIMA_BEG @@ -58,7 +58,9 @@ 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) :: PICEFR ! Cloud fraction REAL, DIMENSION(:,:,:), INTENT(IN) :: PRC_MF! Convective Mass Flux liquid mixing ratio +REAL, DIMENSION(:,:,:), INTENT(IN) :: PRI_MF! Convective Mass Flux ice mixing ratio REAL, DIMENSION(:,:,:), INTENT(IN) :: PCF_MF! Convective Mass Flux Cloud fraction ! END SUBROUTINE LIMA_ADJUST_SPLIT @@ -73,7 +75,7 @@ END MODULE MODI_LIMA_ADJUST_SPLIT PRHODREF, PRHODJ, PEXNREF, PPABSM, PSIGS, PMFCONV, & PPABST, PZZ, PDTHRAD, PW_NU, & PRT, PRS, PSVT, PSVS, & - PTHS, PSRCS, PCLDFR, PRC_MF, PCF_MF ) + PTHS, PSRCS, PCLDFR, PICEFR, PRC_MF, PRI_MF, PCF_MF) ! ########################################################################### ! !!**** *MIMA_ADJUST* - compute the fast microphysical sources @@ -142,6 +144,7 @@ END MODULE MODI_LIMA_ADJUST_SPLIT !! ------------- !! Original 06/2021 forked from lima_adjust.f90 ! P. Wautelet 23/07/2021: replace non-standard FLOAT function by REAL function +! B. Vie 03/2022: Add option for 1-moment pristine ice !------------------------------------------------------------------------------- ! !* 0. DECLARATIONS @@ -217,7 +220,9 @@ 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) :: PICEFR ! Cloud fraction REAL, DIMENSION(:,:,:), INTENT(IN) :: PRC_MF! Convective Mass Flux liquid mixing ratio +REAL, DIMENSION(:,:,:), INTENT(IN) :: PRI_MF! Convective Mass Flux ice mixing ratio REAL, DIMENSION(:,:,:), INTENT(IN) :: PCF_MF! Convective Mass Flux Cloud fraction ! ! @@ -273,7 +278,7 @@ REAL, DIMENSION(SIZE(PRHODJ,1),SIZE(PRHODJ,2),SIZE(PRHODJ,3)) & ZRV, ZRV2, & ZRC, ZRC2, & ZRI, & - ZSIGS, & + Z_SIGS, Z_SRCS, & ZW_MF LOGICAL, DIMENSION(SIZE(PRHODJ,1),SIZE(PRHODJ,2),SIZE(PRHODJ,3)) & :: GMICRO ! Test where to compute cond/dep proc. @@ -310,6 +315,8 @@ INTEGER :: JMOD, JMOD_IFN, JMOD_IMM ! INTEGER , DIMENSION(3) :: BV TYPE(TFIELDDATA) :: TZFIELD +LOGICAL :: G_SIGMAS, GUSERI +REAL :: Z_SIGQSAT ! !------------------------------------------------------------------------------- ! @@ -497,234 +504,154 @@ DO JITER =1,ITERMAX !* 3. FIRST ORDER SUBGRID CONDENSATION SCHEME ! --------------------------------------- ! - IF ( OSUBG_COND ) THEN - ! - ZRV=PRVS*PTSTEP - ZRC=PRCS*PTSTEP - ZRV2=PRVT - ZRC2=PRCT + ZRV=PRVS*PTSTEP + ZRC=PRCS*PTSTEP + ZRV2=PRVT + ZRC2=PRCT + IF (NMOM_I.EQ.1) THEN + ZRI=PRIS*PTSTEP + GUSERI=.TRUE. + ELSE ZRI=0. - ZSIGS=PSIGS - CALL CONDENSATION(IIU, IJU, IKU, IIB, IIE, IJB, IJE, IKB, IKE, 1, 'S', & - HCONDENS, HLAMBDA3, & - PPABST, PZZ, PRHODREF, ZT, ZRV, ZRC, ZRI, PRSS*PTSTEP, PRGS*PTSTEP, & - ZSIGS, PMFCONV, PCLDFR, PSRCS, .FALSE., OSIGMAS, & - PSIGQSAT, PLV=ZLV, PLS=ZLS, PCPH=ZCPH ) - PCLDFR(:,:,:) = MIN(PCLDFR(:,:,:) + PCF_MF(:,:,:) , 1.) - ZRV(:,:,:) = ZRV(:,:,:) - MAX(MIN(PRC_MF(:,:,:), ZRV(:,:,:)),0.) - ZRC(:,:,:) = ZRC(:,:,:) + MAX(MIN(PRC_MF(:,:,:), ZRV(:,:,:)),0.) + GUSERI=.FALSE. + END IF + IF (OSUBG_COND) THEN + Z_SIGS=PSIGS + G_SIGMAS=OSIGMAS + Z_SIGQSAT=PSIGQSAT + ELSE + Z_SIGS=0. + G_SIGMAS=.TRUE. + Z_SIGQSAT=0. + END IF + + CALL CONDENSATION(IIU, IJU, IKU, IIB, IIE, IJB, IJE, IKB, IKE, 1, 'S', & + HCONDENS, HLAMBDA3, & + PPABST, PZZ, PRHODREF, ZT, ZRV, ZRC, ZRI, PRSS*PTSTEP, PRGS*PTSTEP, & + Z_SIGS, PMFCONV, PCLDFR, Z_SRCS, GUSERI, G_SIGMAS, & + Z_SIGQSAT, PLV=ZLV, PLS=ZLS, PCPH=ZCPH ) + + IF (OSUBG_COND) THEN + PSRCS=Z_SRCS ZW_MF=0. - CALL LIMA_CCN_ACTIVATION (TPFILE, & + CALL LIMA_CCN_ACTIVATION (TPFILE, & PRHODREF, PEXNREF, PPABST, ZT2, PDTHRAD, PW_NU+ZW_MF, & - PTHT, ZRV2, ZRC2, PCCT, PRRT, PNFT, PNAT, & - PCLDFR ) -! - ELSE -! -!------------------------------------------------------------------------------- -! + PTHT, ZRV2, ZRC2, PCCT, PRRT, PNFT, PNAT, & + PCLDFR ) + END IF + +END DO ! +!* 5.1 compute the sources ! -!* FULLY IMPLICIT CONDENSATION SCHEME -! --------------------------------- -! -!* select cases where r_c>0 -! + ! Rc - Rc* +ZW1(:,:,:) = (ZRC(:,:,:) - PRCS(:,:,:)*PTSTEP) / PTSTEP ! Pcon = ---------- + ! 2 Delta t +WHERE( ZW1(:,:,:) < 0.0 ) + ZW1(:,:,:) = MAX ( ZW1(:,:,:), -PRCS(:,:,:) ) +ELSEWHERE + ZW1(:,:,:) = MIN ( ZW1(:,:,:), PRVS(:,:,:) ) +END WHERE +PRVS(:,:,:) = PRVS(:,:,:) - ZW1(:,:,:) +PRCS(:,:,:) = PRCS(:,:,:) + ZW1(:,:,:) +PTHS(:,:,:) = PTHS(:,:,:) + & + ZW1(:,:,:) * ZLV(:,:,:) / (ZCPH(:,:,:) * PEXNREF(:,:,:)) ! - GMICRO(:,:,:) = .FALSE. - GMICRO(IIB:IIE,IJB:IJE,IKB:IKE) =( PRCS(IIB:IIE,IJB:IJE,IKB:IKE)>0. .AND. & - PCCS(IIB:IIE,IJB:IJE,IKB:IKE)>0. ) - IMICRO = COUNTJV( GMICRO(:,:,:),I1(:),I2(:),I3(:)) - IF( IMICRO >= 1 ) THEN - ALLOCATE(ZRVT(IMICRO)) - ALLOCATE(ZRCT(IMICRO)) -! - ALLOCATE(ZRVS(IMICRO)) - ALLOCATE(ZRCS(IMICRO)) - ALLOCATE(ZCCS(IMICRO)) - ALLOCATE(ZTHS(IMICRO)) -! - ALLOCATE(ZRHODREF(IMICRO)) - ALLOCATE(ZZT(IMICRO)) - ALLOCATE(ZPRES(IMICRO)) - ALLOCATE(ZEXNREF(IMICRO)) - ALLOCATE(ZZCPH(IMICRO)) - DO JL=1,IMICRO - ZRVT(JL) = PRVT(I1(JL),I2(JL),I3(JL)) - ZRCT(JL) = PRCT(I1(JL),I2(JL),I3(JL)) - ! - ZRVS(JL) = PRVS(I1(JL),I2(JL),I3(JL)) - ZRCS(JL) = PRCS(I1(JL),I2(JL),I3(JL)) - ZCCS(JL) = PCCS(I1(JL),I2(JL),I3(JL)) - ZTHS(JL) = PTHS(I1(JL),I2(JL),I3(JL)) - ! - ZRHODREF(JL) = PRHODREF(I1(JL),I2(JL),I3(JL)) - ZZT(JL) = ZT(I1(JL),I2(JL),I3(JL)) - ZPRES(JL) = 2.0*PPABST(I1(JL),I2(JL),I3(JL))-PPABSM(I1(JL),I2(JL),I3(JL)) - ZEXNREF(JL) = PEXNREF(I1(JL),I2(JL),I3(JL)) - ZZCPH(JL) = ZCPH(I1(JL),I2(JL),I3(JL)) - ENDDO - ALLOCATE(ZZW(IMICRO)) - ALLOCATE(ZLVFACT(IMICRO)) - ALLOCATE(ZRVSATW(IMICRO)) - ALLOCATE(ZCND(IMICRO)) - ZLVFACT(:) = (XLVTT+(XCPV-XCL)*(ZZT(:)-XTT))/ZZCPH(:) ! L_v/C_ph - ZZW(:) = EXP( XALPW - XBETAW/ZZT(:) - XGAMW*ALOG(ZZT(:) ) ) ! es_w - ZRVSATW(:) = ZEPS*ZZW(:) / ( ZPRES(:)-ZZW(:) ) ! r_sw - - IF (LADJ) THEN - ALLOCATE(ZRVSATW_PRIME(IMICRO)) - ALLOCATE(ZAWW(IMICRO)) - ALLOCATE(ZDELT1(IMICRO)) - ALLOCATE(ZDELT2(IMICRO)) - ZRVSATW_PRIME(:) = (( XBETAW/ZZT(:) - XGAMW ) / ZZT(:)) & ! r'_sw - * ZRVSATW(:) * ( 1. + ZRVSATW(:)/ZEPS ) - ZAWW(:) = 1.0 + ZRVSATW_PRIME(:)*ZLVFACT(:) - ZDELT2(:) = (ZRVSATW_PRIME(:)*ZLVFACT(:)/ZAWW(:)) * & - ( ((-2.*XBETAW+XGAMW*ZZT(:))/(XBETAW-XGAMW*ZZT(:)) & - + (XBETAW/ZZT(:)-XGAMW)*(1.0+2.0*ZRVSATW(:)/ZEPS))/ZZT(:) ) - ZDELT1(:) = (ZLVFACT(:)/ZAWW(:)) * ( ZRVSATW(:) - ZRVS(:)*ZDT ) - ZCND(:) = - ZDELT1(:)*( 1.0 + 0.5*ZDELT1(:)*ZDELT2(:) ) / (ZLVFACT(:)*ZDT) - DEALLOCATE(ZRVSATW_PRIME) - DEALLOCATE(ZAWW) - DEALLOCATE(ZDELT1) - DEALLOCATE(ZDELT2) - ELSE - ALLOCATE(ZS(IMICRO)) - ALLOCATE(ZZW2(IMICRO)) - ALLOCATE(ZVEC1(IMICRO)) - ALLOCATE(IVEC1(IMICRO)) - ZVEC1(:) = MAX( 1.0001, MIN( REAL(NAHEN)-0.0001, XAHENINTP1 * ZZT(:) + XAHENINTP2 ) ) - IVEC1(:) = INT( ZVEC1(:) ) - ZVEC1(:) = ZVEC1(:) - REAL( IVEC1(:) ) - ZS(:) = ZRVS(:)*PTSTEP / ZRVSATW(:) - 1. - ZZW(:) = ZCCS(:)*PTSTEP/(XLBC*ZCCS(:)/ZRCS(:))**XLBEXC - ZZW2(:) = XAHENG3(IVEC1(:)+1)*ZVEC1(:)-XAHENG3(IVEC1(:))*(ZVEC1(:)-1.) - ZCND(:) = 2.*3.14*1000.*ZZW2(:)*ZS(:)*ZZW(:) - DEALLOCATE(ZS) - DEALLOCATE(ZZW2) - DEALLOCATE(ZVEC1) - DEALLOCATE(IVEC1) - END IF -! -! -! Integration -! - WHERE( ZCND(:) < 0.0 ) - ZCND(:) = MAX ( ZCND(:), -ZRCS(:) ) - ELSEWHERE - ZCND(:) = MIN ( ZCND(:), ZRVS(:) ) - END WHERE - ZRVS(:) = ZRVS(:) - ZCND(:) - ZRCS(:) = ZRCS(:) + ZCND(:) - ZTHS(:) = ZTHS(:) + ZCND(:) * ZLVFACT(:) / ZEXNREF(:) -! - ZW(:,:,:) = PRVS(:,:,:) - PRVS(:,:,:) = UNPACK( ZRVS(:),MASK=GMICRO(:,:,:),FIELD=ZW(:,:,:) ) - ZW(:,:,:) = PRCS(:,:,:) - PRCS(:,:,:) = UNPACK( ZRCS(:),MASK=GMICRO(:,:,:),FIELD=ZW(:,:,:) ) - ZW(:,:,:) = PTHS(:,:,:) - PTHS(:,:,:) = UNPACK( ZTHS(:),MASK=GMICRO(:,:,:),FIELD=ZW(:,:,:) ) -! - DEALLOCATE(ZRVT) - DEALLOCATE(ZRCT) - DEALLOCATE(ZRVS) - DEALLOCATE(ZRCS) - DEALLOCATE(ZTHS) - DEALLOCATE(ZRHODREF) - DEALLOCATE(ZZT) - DEALLOCATE(ZPRES) - DEALLOCATE(ZEXNREF) - DEALLOCATE(ZZCPH) - DEALLOCATE(ZZW) - DEALLOCATE(ZLVFACT) - DEALLOCATE(ZRVSATW) - DEALLOCATE(ZCND) - END IF ! IMICRO -! - END IF ! end of adjustment procedure (test on OSUBG_COND) +IF (NMOM_I.EQ.1) THEN + ZW2(:,:,:) = (ZRI(:,:,:) - PRIS(:,:,:)*PTSTEP) / PTSTEP ! idem ZW1 but for Ri ! -! Remove cloud droplets if there are few - - ZMASK(:,:,:) = 0.0 - ZW(:,:,:) = 0. - WHERE (PRCS(:,:,:) <= ZRTMIN(2) .OR. PCCS(:,:,:) <= ZCTMIN(2)) - PRVS(:,:,:) = PRVS(:,:,:) + PRCS(:,:,:) - PTHS(:,:,:) = PTHS(:,:,:) - PRCS(:,:,:)*ZLV(:,:,:)/(ZCPH(:,:,:)*ZEXNS(:,:,:)) - PRCS(:,:,:) = 0.0 - ZW(:,:,:) = MAX(PCCS(:,:,:),0.) - PCCS(:,:,:) = 0.0 + WHERE( ZW2(:,:,:) < 0.0 ) + ZW2(:,:,:) = MAX ( ZW2(:,:,:), -PRIS(:,:,:) ) + ELSEWHERE + ZW2(:,:,:) = MIN ( ZW2(:,:,:), PRVS(:,:,:) ) END WHERE + PRVS(:,:,:) = PRVS(:,:,:) - ZW2(:,:,:) + PRIS(:,:,:) = PRIS(:,:,:) + ZW2(:,:,:) + PTHS(:,:,:) = PTHS(:,:,:) + & + ZW2(:,:,:) * ZLS(:,:,:) / (ZCPH(:,:,:) * PEXNREF(:,:,:)) +END IF ! - ZW1(:,:,:) = 0. - IF (LWARM .AND. NMOD_CCN.GE.1) ZW1(:,:,:) = SUM(PNAS,DIM=4) - ZW (:,:,:) = MIN( ZW(:,:,:), ZW1(:,:,:) ) - ZW2(:,:,:) = 0. - WHERE ( ZW(:,:,:) > 0. ) - ZMASK(:,:,:) = 1.0 - ZW2(:,:,:) = ZW(:,:,:) / ZW1(:,:,:) - ENDWHERE +!* 5.2 compute the cloud fraction PCLDFR ! - IF (LWARM .AND. NMOD_CCN.GE.1) THEN - DO JMOD = 1, NMOD_CCN - PNFS(:,:,:,JMOD) = PNFS(:,:,:,JMOD) + & - ZMASK(:,:,:) * PNAS(:,:,:,JMOD) * ZW2(:,:,:) - PNAS(:,:,:,JMOD) = PNAS(:,:,:,JMOD) - & - ZMASK(:,:,:) * PNAS(:,:,:,JMOD) * ZW2(:,:,:) - PNAS(:,:,:,JMOD) = MAX( 0.0 , PNAS(:,:,:,JMOD) ) - ENDDO +IF ( .NOT. OSUBG_COND ) THEN + WHERE (PRCS(:,:,:) + PRIS(:,:,:) > 1.E-12 / PTSTEP) + PCLDFR(:,:,:) = 1. + ELSEWHERE + PCLDFR(:,:,:) = 0. + ENDWHERE + IF ( SIZE(PSRCS,3) /= 0 ) THEN + WHERE (PRCS(:,:,:) + PRIS(:,:,:) > 1.E-12 / ZDT) + PSRCS(:,:,:) = 1. + ELSEWHERE + PSRCS(:,:,:) = 0. + ENDWHERE + END IF +ELSE +! We limit PRC_MF+PRI_MF to PRVS*PTSTEP to avoid negative humidity + ZW1(:,:,:)=PRC_MF(:,:,:)/PTSTEP + IF (NMOM_I.EQ.1) THEN + ZW2(:,:,:)=PRI_MF(:,:,:)/PTSTEP + ELSE + ZW2(:,:,:)=0. END IF + WHERE(ZW1(:,:,:)+ZW2(:,:,:)>PRVS(:,:,:)) + ZW1(:,:,:)=ZW1(:,:,:)*PRVS(:,:,:)/(ZW1(:,:,:)+ZW2(:,:,:)) + ZW2(:,:,:)=PRVS(:,:,:)-ZW1(:,:,:) + ENDWHERE +! Compute CF and update rc, ri from MF scheme + PRVS(:,:,:) = PRVS(:,:,:) - ZW1(:,:,:) -ZW2(:,:,:) + PRCS(:,:,:) = PRCS(:,:,:) + ZW1(:,:,:) + PRIS(:,:,:) = PRIS(:,:,:) + ZW2(:,:,:) + PCCS(:,:,:) = PCCT(:,:,:) / PTSTEP + PNFS(:,:,:,:) = PNFT(:,:,:,:) / PTSTEP + PNAS(:,:,:,:) = PNAT(:,:,:,:) / PTSTEP + PTHS(:,:,:) = PTHS(:,:,:) + & + (ZW1(:,:,:) * ZLV(:,:,:) + ZW2 * ZLS(:,:,:)) / ZCPH(:,:,:) & + / PEXNREF(:,:,:) +END IF ! - IF (LSCAV .AND. LAERO_MASS) PMAS(:,:,:) = PMAS(:,:,:) * (1-ZMASK(:,:,:)) +! Remove cloud droplets if there are few ! +ZMASK(:,:,:) = 0.0 +ZW(:,:,:) = 0. +WHERE (PRCS(:,:,:) <= ZRTMIN(2) .OR. PCCS(:,:,:) <= ZCTMIN(2)) + PRVS(:,:,:) = PRVS(:,:,:) + PRCS(:,:,:) + PTHS(:,:,:) = PTHS(:,:,:) - PRCS(:,:,:)*ZLV(:,:,:)/(ZCPH(:,:,:)*ZEXNS(:,:,:)) + PRCS(:,:,:) = 0.0 + ZW(:,:,:) = MAX(PCCS(:,:,:),0.) + PCCS(:,:,:) = 0.0 +END WHERE ! -END DO ! end of the iterative loop +ZW1(:,:,:) = 0. +IF (LWARM .AND. NMOD_CCN.GE.1) ZW1(:,:,:) = SUM(PNAS,DIM=4) +ZW (:,:,:) = MIN( ZW(:,:,:), ZW1(:,:,:) ) +ZW2(:,:,:) = 0. +WHERE ( ZW(:,:,:) > 0. ) + ZMASK(:,:,:) = 1.0 + ZW2(:,:,:) = ZW(:,:,:) / ZW1(:,:,:) +ENDWHERE +! +IF (LWARM .AND. NMOD_CCN.GE.1) THEN + DO JMOD = 1, NMOD_CCN + PNFS(:,:,:,JMOD) = PNFS(:,:,:,JMOD) + & + ZMASK(:,:,:) * PNAS(:,:,:,JMOD) * ZW2(:,:,:) + PNAS(:,:,:,JMOD) = PNAS(:,:,:,JMOD) - & + ZMASK(:,:,:) * PNAS(:,:,:,JMOD) * ZW2(:,:,:) + PNAS(:,:,:,JMOD) = MAX( 0.0 , PNAS(:,:,:,JMOD) ) + ENDDO +END IF ! +IF (LSCAV .AND. LAERO_MASS) PMAS(:,:,:) = PMAS(:,:,:) * (1-ZMASK(:,:,:)) ! -!* 5.2 compute the cloud fraction PCLDFR (binary !!!!!!!) ! -IF ( .NOT. OSUBG_COND ) THEN - WHERE (PRCS(:,:,:) + PRIS(:,:,:) + PRSS(:,:,:) > 1.E-12 / ZDT) - PCLDFR(:,:,:) = 1. - ELSEWHERE - PCLDFR(:,:,:) = 0. - ENDWHERE -END IF ! -IF ( SIZE(PSRCS,3) /= 0 ) THEN - WHERE (PRCS(:,:,:) + PRIS(:,:,:) > 1.E-12 / ZDT) - PSRCS(:,:,:) = 1. - ELSEWHERE - PSRCS(:,:,:) = 0. - ENDWHERE +PICEFR(:,:,:)=0. +IF (NMOM_I.EQ.1) THEN + WHERE(PICEFR(:,:,:)<1.E-10 .AND. PRIT(:,:,:)>XRTMIN(4) .AND. PCIT(:,:,:)>XCTMIN(4)) PICEFR(:,:,:)=PCLDFR(:,:,:) +ELSE + WHERE(PICEFR(:,:,:)<1.E-10 .AND. PRIT(:,:,:)>XRTMIN(4) .AND. PCIT(:,:,:)>XCTMIN(4)) PICEFR(:,:,:)=1. END IF ! -IF ( OSUBG_COND ) THEN - ! - ! Mixing ratio change (cloud liquid water) - ! - ZW1(:,:,:) = (ZRC(:,:,:) - PRCS(:,:,:)*PTSTEP) / PTSTEP - WHERE( ZW1(:,:,:) < 0.0 ) - ZW1(:,:,:) = MAX ( ZW1(:,:,:), -PRCS(:,:,:) ) - ELSEWHERE - ZW1(:,:,:) = MIN ( ZW1(:,:,:), PRVS(:,:,:) ) - END WHERE - - WHERE (PCCT(:,:,:) < PCLDFR(:,:,:)*XCTMIN(2) .OR. ZRC(:,:,:)<PCLDFR(:,:,:)*XRTMIN(2)) - ZW1=-PRCS - PCCS=0. - PCLDFR=0. - END WHERE - - PRVS(:,:,:) = PRVS(:,:,:) - ZW1(:,:,:) - PRCS(:,:,:) = PRCS(:,:,:) + ZW1(:,:,:) - PCCS(:,:,:) = PCCT(:,:,:) / PTSTEP - PNFS(:,:,:,:) = PNFT(:,:,:,:) / PTSTEP - PNAS(:,:,:,:) = PNAT(:,:,:,:) / PTSTEP - PTHS(:,:,:) = PTHS(:,:,:) + & - ZW1(:,:,:) * ZLV(:,:,:) / (ZCPH(:,:,:) * PEXNREF(:,:,:)) -END IF ! fin test OSUBG_COND - IF ( tpfile%lopened ) THEN TZFIELD%CMNHNAME = 'NEB' TZFIELD%CSTDNAME = '' @@ -743,7 +670,6 @@ END IF !* 6. SAVE CHANGES IN PRS AND PSVS ! ---------------------------- ! -! ! Prepare 3D water mixing ratios PRS(:,:,:,1) = PRVS(:,:,:) IF ( KRR .GE. 2 ) PRS(:,:,:,2) = PRCS(:,:,:) @@ -802,7 +728,6 @@ if ( nbumod == kmi .and. lbu_enable ) then if ( lbudget_th ) call Budget_store_end( tbudgets(NBUDGET_TH), 'CEDS', pths(:, :, :) * prhodj(:, :, :) ) if ( lbudget_rv ) call Budget_store_end( tbudgets(NBUDGET_RV), 'CEDS', prvs(:, :, :) * prhodj(:, :, :) ) if ( lbudget_rc ) call Budget_store_end( tbudgets(NBUDGET_RC), 'CEDS', prcs(:, :, :) * prhodj(:, :, :) ) - !Remark: PRIS is not modified but source term kept for better coherence with lima_adjust and lima_notadjust if ( lbudget_ri ) call Budget_store_end( tbudgets(NBUDGET_RI), 'CEDS', pris(:, :, :) * prhodj(:, :, :) ) if ( lbudget_sv ) then if ( lwarm ) & diff --git a/src/MNH/lima_bergeron.f90 b/src/MNH/lima_bergeron.f90 index 9105c78d6f07be74f84fce86c33fe2c3a240f6e5..7a4967708e09ec8b49e850a2583fd47a7c04ee6d 100644 --- a/src/MNH/lima_bergeron.f90 +++ b/src/MNH/lima_bergeron.f90 @@ -10,8 +10,7 @@ INTERFACE SUBROUTINE LIMA_BERGERON (LDCOMPUTE, & PRCT, PRIT, PCIT, PLBDI, & PSSIW, PAI, PCJ, PLVFACT, PLSFACT, & - P_TH_BERFI, P_RC_BERFI, & - PA_TH, PA_RC, PA_RI ) + P_TH_BERFI, P_RC_BERFI ) ! LOGICAL, DIMENSION(:),INTENT(IN) :: LDCOMPUTE ! @@ -28,10 +27,6 @@ REAL, DIMENSION(:), INTENT(IN) :: PLSFACT ! ! REAL, DIMENSION(:), INTENT(INOUT) :: P_TH_BERFI REAL, DIMENSION(:), INTENT(INOUT) :: P_RC_BERFI -! -REAL, DIMENSION(:), INTENT(INOUT) :: PA_TH -REAL, DIMENSION(:), INTENT(INOUT) :: PA_RC -REAL, DIMENSION(:), INTENT(INOUT) :: PA_RI !! END SUBROUTINE LIMA_BERGERON END INTERFACE @@ -41,8 +36,7 @@ END MODULE MODI_LIMA_BERGERON SUBROUTINE LIMA_BERGERON( LDCOMPUTE, & PRCT, PRIT, PCIT, PLBDI, & PSSIW, PAI, PCJ, PLVFACT, PLSFACT, & - P_TH_BERFI, P_RC_BERFI, & - PA_TH, PA_RC, PA_RI ) + P_TH_BERFI, P_RC_BERFI ) ! ############################################################# ! !! PURPOSE @@ -89,18 +83,9 @@ REAL, DIMENSION(:), INTENT(IN) :: PLSFACT ! REAL, DIMENSION(:), INTENT(INOUT) :: P_TH_BERFI REAL, DIMENSION(:), INTENT(INOUT) :: P_RC_BERFI ! -REAL, DIMENSION(:), INTENT(INOUT) :: PA_TH -REAL, DIMENSION(:), INTENT(INOUT) :: PA_RC -REAL, DIMENSION(:), INTENT(INOUT) :: PA_RI -! -!* 0.2 Declarations of local variables : -! -! !------------------------------------------------------------------------------- ! -! -!* 1. Bergeron-Findeisen process -! -------------------------- +! Bergeron-Findeisen process ! P_TH_BERFI(:) = 0.0 P_RC_BERFI(:) = 0.0 @@ -111,11 +96,6 @@ WHERE( (PRCT(:)>XRTMIN(2)) .AND. (PRIT(:)>XRTMIN(4)) .AND. (PCIT(:)>XCTMIN(4)) . P_TH_BERFI(:) = - P_RC_BERFI(:)*(PLSFACT(:)-PLVFACT(:)) END WHERE ! -PA_RC(:) = PA_RC(:) + P_RC_BERFI(:) -PA_RI(:) = PA_RI(:) - P_RC_BERFI(:) -PA_TH(:) = PA_TH(:) + P_TH_BERFI(:) -! -! !------------------------------------------------------------------------------- ! END SUBROUTINE LIMA_BERGERON diff --git a/src/MNH/lima_ccn_activation.f90 b/src/MNH/lima_ccn_activation.f90 index b7786ea4f056c16c1f632f33e51df67f572c71d1..78d9e7c1430316ffad866e1830efb81bfc2e5304 100644 --- a/src/MNH/lima_ccn_activation.f90 +++ b/src/MNH/lima_ccn_activation.f90 @@ -167,7 +167,7 @@ REAL, DIMENSION(:), ALLOCATABLE :: ZZW1, ZZW2, ZZW3, ZZW4, ZZW5, ZZW6, & REAL, DIMENSION(:,:), ALLOCATABLE :: ZTMP, ZCHEN_MULTI ! REAL, DIMENSION(SIZE(PRHODREF,1),SIZE(PRHODREF,2),SIZE(PRHODREF,3)) & - :: ZTDT, ZDRC, ZRVSAT, ZW, ZW2 + :: ZTDT, ZDRC, ZRVSAT, ZW, ZW2, ZCLDFR REAL, DIMENSION(SIZE(PNFT,1),SIZE(PNFT,2),SIZE(PNFT,3)) & :: ZCONC_TOT ! total CCN C. available ! @@ -230,6 +230,11 @@ IF (.NOT. LSUBG_COND) GNUCT(IIB:IIE,IJB:IJE,IKB:IKE) = GNUCT(IIB:IIE,IJB:IJE,IKB .AND. PRVT(IIB:IIE,IJB:IJE,IKB:IKE).GE.ZRVSAT(IIB:IIE,IJB:IJE,IKB:IKE) ! +IF (.NOT. LSUBG_COND) THEN + ZCLDFR(:,:,:) = 1. +ELSE + ZCLDFR(:,:,:) = PCLDFR(:,:,:) +END IF INUCT = COUNTJV( GNUCT(:,:,:),I1(:),I2(:),I3(:)) ! @@ -255,8 +260,8 @@ IF( INUCT >= 1 ) THEN ALLOCATE(ZRHODREF(INUCT)) ALLOCATE(ZEXNREF(INUCT)) DO JL=1,INUCT - ZRCT(JL) = PRCT(I1(JL),I2(JL),I3(JL))/PCLDFR(I1(JL),I2(JL),I3(JL)) - ZCCT(JL) = PCCT(I1(JL),I2(JL),I3(JL))/PCLDFR(I1(JL),I2(JL),I3(JL)) + ZRCT(JL) = PRCT(I1(JL),I2(JL),I3(JL))/ZCLDFR(I1(JL),I2(JL),I3(JL)) + ZCCT(JL) = PCCT(I1(JL),I2(JL),I3(JL))/ZCLDFR(I1(JL),I2(JL),I3(JL)) ZZT(JL) = PT(I1(JL),I2(JL),I3(JL)) ZZW1(JL) = ZRVSAT(I1(JL),I2(JL),I3(JL)) ZZW2(JL) = PW_NU(I1(JL),I2(JL),I3(JL)) diff --git a/src/MNH/lima_cold_slow_processes.f90 b/src/MNH/lima_cold_slow_processes.f90 index 9fcacdd5a39b10fc469e99ffba04621f848456a7..a95f91d462b981b9dec4184de9d767cddeecf288 100644 --- a/src/MNH/lima_cold_slow_processes.f90 +++ b/src/MNH/lima_cold_slow_processes.f90 @@ -80,6 +80,7 @@ END MODULE MODI_LIMA_COLD_SLOW_PROCESSES ! P. Wautelet 05/2016-04/2018: new data structures and calls for I/O ! P. Wautelet 28/05/2019: move COUNTJV function to tools.f90 ! P. Wautelet 03/2020: use the new data structures and subroutines for budgets +! J. Wurtz 03/2022: new snow characteristics ! !------------------------------------------------------------------------------- ! @@ -94,8 +95,8 @@ USE MODD_CST, ONLY: XP00, XRD, XRV, XMV, XMD, XCPD, XCPV, & XCL, XCI, XTT, XLSTT, XALPI, XBETAI, XGAMI USE MODD_NSV, ONLY: NSV_LIMA_NI USE MODD_PARAMETERS, ONLY: JPHEXT, JPVEXT -USE MODD_PARAM_LIMA, ONLY: LSNOW, XRTMIN, XCTMIN, XALPHAI, XALPHAS, & - XNUI +USE MODD_PARAM_LIMA, ONLY: LSNOW, LSNOW_T, XRTMIN, XCTMIN, & + XALPHAI, XALPHAS, XNUI, XNUS USE MODD_PARAM_LIMA_COLD, ONLY: XLBI, XLBEXI, XLBS, XLBEXS, XBI, XCXS, XCCS, & XLBDAS_MAX, XDSCNVI_LIM, XLBDASCNVI_MAX, & XC0DEPSI, XC1DEPSI, XR0DEPSI, XR1DEPSI, & @@ -103,7 +104,8 @@ USE MODD_PARAM_LIMA_COLD, ONLY: XLBI, XLBEXI, XLBS, XLBEXS, XBI, XCXS, XCCS, & XDICNVS_LIM, XLBDAICNVS_LIM, & XC0DEPIS, XC1DEPIS, XR0DEPIS, XR1DEPIS, & XCOLEXIS, XAGGS_CLARGE1, XAGGS_CLARGE2, & - XAGGS_RLARGE1, XAGGS_RLARGE2 + XAGGS_RLARGE1, XAGGS_RLARGE2, XBS, & + XLBDAS_MIN,XFVELOS,XTRANS_MP_GAMMAS use mode_budget, only: Budget_store_init, Budget_store_end use mode_tools, only: Countjv @@ -316,9 +318,19 @@ IF( IMICRO >= 1 ) THEN ZLBDAI(:) = ( XLBI*ZCIT(:) / ZRIT(:) )**XLBEXI END WHERE ZLBDAS(:) = 1.E10 - WHERE (ZRST(:)>XRTMIN(5) ) - ZLBDAS(:) = XLBS*( ZRHODREF(:)*ZRST(:) )**XLBEXS - END WHERE + IF (LSNOW_T) THEN + WHERE(ZZT(:)>263.15 .AND. ZRST(:)>XRTMIN(5)) + ZLBDAS(:) = MAX(MIN(XLBDAS_MAX, 10**(14.554-0.0423*ZZT(:))),XLBDAS_MIN) + END WHERE + WHERE(ZZT(:)<=263.15 .AND. ZRST(:)>XRTMIN(5)) + ZLBDAS(:) = MAX(MIN(XLBDAS_MAX, 10**(6.226-0.0106*ZZT(:))),XLBDAS_MIN) + END WHERE + ZLBDAS(:) = ZLBDAS(:) * XTRANS_MP_GAMMAS + ELSE + WHERE (ZRST(:)>XRTMIN(5) ) + ZLBDAS(:) = MAX(MIN(XLBDAS_MAX,XLBS*( ZRHODREF(:)*ZRST(:) )**XLBEXS),XLBDAS_MIN) + END WHERE + END IF ! ZKA(:) = 2.38E-2 + 0.0071E-2 * ( ZZT(:) - XTT ) ! k_a ZDV(:) = 0.211E-4 * (ZZT(:)/XTT)**1.94 * (XP00/ZPRES(:)) ! D_v @@ -342,16 +354,11 @@ IF( IMICRO >= 1 ) THEN call Budget_store_init( tbudgets(NBUDGET_SV1 - 1 + nsv_lima_ni), 'CNVI', pcis(:, :, :) * prhodj(:, :, :) ) end if - WHERE ( ZRST(:)>XRTMIN(5) ) - ZLBDAS(:) = MIN( XLBDAS_MAX, & - XLBS*( ZRHODREF(:)*MAX( ZRST(:),XRTMIN(5) ) )**XLBEXS ) - END WHERE ZZW(:) = 0.0 WHERE ( ZLBDAS(:)<XLBDASCNVI_MAX .AND. (ZRST(:)>XRTMIN(5)) & .AND. (ZSSI(:)<0.0) ) ZZW(:) = (ZLBDAS(:)*XDSCNVI_LIM)**(XALPHAS) - ZZX(:) = ( -ZSSI(:)/ZAI(:) ) * (XCCS*ZLBDAS(:)**XCXS)/ZRHODREF(:) * (ZZW(:)**XNUI) & - * EXP(-ZZW(:)) + ZZX(:) = ( -ZSSI(:)/ZAI(:) ) * (XLBS*ZRST(:)*ZLBDAS(:)**XBS) * (ZZW(:)**XNUI) * EXP(-ZZW(:)) ! ZZW(:) = MIN( ( XR0DEPSI+XR1DEPSI*ZCJ(:) )*ZZX(:),ZRSS(:) ) ZRIS(:) = ZRIS(:) + ZZW(:) @@ -384,8 +391,11 @@ IF( IMICRO >= 1 ) THEN ZZW(:) = 0.0 WHERE ( (ZRST(:)>XRTMIN(5)) .AND. (ZRSS(:)>ZRTMIN(5)) ) - ZZW(:) = ( ZSSI(:)/(ZRHODREF(:)*ZAI(:)) ) * & - ( X0DEPS*ZLBDAS(:)**XEX0DEPS + X1DEPS*ZCJ(:)*ZLBDAS(:)**XEX1DEPS ) + ZZW(:) = ( ZRST(:)*ZSSI(:)/(ZAI(:)) ) * & + ( X0DEPS*ZLBDAS(:)**XEX0DEPS + & + (X1DEPS*ZCJ(:)*(1+(XFVELOS/(2.*ZLBDAS))**XALPHAS)**(-XNUS+XEX1DEPS/XALPHAS) * & + (ZLBDAS(:))**(XEX1DEPS+XBS))) + ZZW(:) = MIN( ZRVS(:),ZZW(:) )*(0.5+SIGN(0.5,ZZW(:))) & - MIN( ZRSS(:),ABS(ZZW(:)) )*(0.5-SIGN(0.5,ZZW(:))) ZRSS(:) = ZRSS(:) + ZZW(:) @@ -420,8 +430,6 @@ IF( IMICRO >= 1 ) THEN ZZW(:) = (ZLBDAI(:)*XDICNVS_LIM)**(XALPHAI) ZZX(:) = ( ZSSI(:)/ZAI(:) )*ZCIT(:) * (ZZW(:)**XNUI) *EXP(-ZZW(:)) ! -! Correction BVIE -! ZZW(:) = MAX( MIN( ( XR0DEPIS + XR1DEPIS*ZCJ(:) )*ZZX(:)/ZRHODREF(:) & ZZW(:) = MAX( MIN( ( XR0DEPIS + XR1DEPIS*ZCJ(:) )*ZZX(:) & ,ZRIS(:) ) + ZRTMIN(5), ZRTMIN(5) ) - ZRTMIN(5) ZRIS(:) = ZRIS(:) - ZZW(:) @@ -458,7 +466,7 @@ IF( IMICRO >= 1 ) THEN WHERE ( (ZRIT(:)>XRTMIN(4)) .AND. (ZRST(:)>XRTMIN(5)) .AND. (ZRIS(:)>ZRTMIN(4)) & .AND. (ZCIS(:)>ZCTMIN(4)) ) ZZW1(:,3) = (ZLBDAI(:) / ZLBDAS(:))**3 - ZZW1(:,1) = (ZCIT(:)*(XCCS*ZLBDAS(:)**XCXS)/ZRHODREF(:)*EXP( XCOLEXIS*(ZZT(:)-XTT) )) & + ZZW1(:,1) = (ZCIT(:)*(XLBS*ZRST(:)*ZLBDAS(:)**XBS)*EXP(XCOLEXIS*(ZZT(:)-XTT) )) & / (ZLBDAI(:)**3) ZZW1(:,2) = MIN( ZZW1(:,1)*(XAGGS_CLARGE1+XAGGS_CLARGE2*ZZW1(:,3)),ZCIS(:) ) ZCIS(:) = ZCIS(:) - ZZW1(:,2) diff --git a/src/MNH/lima_conversion_melting_snow.f90 b/src/MNH/lima_conversion_melting_snow.f90 index ff5a691461b7a5de36d44febb6c320ce909eee12..307db0255eed1136811b4b159c846dcbfa692c6a 100644 --- a/src/MNH/lima_conversion_melting_snow.f90 +++ b/src/MNH/lima_conversion_melting_snow.f90 @@ -55,15 +55,16 @@ END MODULE MODI_LIMA_CONVERSION_MELTING_SNOW !! ------------- !! Original 15/03/2018 !! +! J. Wurtz 03/2022: new snow characteristics !------------------------------------------------------------------------------- ! !* 0. DECLARATIONS ! ------------ ! USE MODD_CST, ONLY : XTT, XMV, XMD, XLVTT, XCPV, XCL, XESTT, XRV -USE MODD_PARAM_LIMA, ONLY : XRTMIN +USE MODD_PARAM_LIMA, ONLY : XRTMIN, XNUS, XALPHAS USE MODD_PARAM_LIMA_MIXED, ONLY : XFSCVMG -USE MODD_PARAM_LIMA_COLD, ONLY : X0DEPS, XEX0DEPS, X1DEPS, XEX1DEPS +USE MODD_PARAM_LIMA_COLD, ONLY : X0DEPS, XEX0DEPS, X1DEPS, XEX1DEPS, XBS, XFVELOS ! IMPLICIT NONE ! @@ -106,9 +107,10 @@ WHERE( (PRST(:)>XRTMIN(5)) .AND. (PT(:)>XTT) .AND. LDCOMPUTE(:) ) ! ! compute RSMLT ! - ZW(:) = XFSCVMG*MAX( 0.0,( -ZW(:) * & - ( X0DEPS* PLBDS(:)**XEX0DEPS + & - X1DEPS*PCJ(:)*PLBDS(:)**XEX1DEPS ) ))!- & + ZW(:) = XFSCVMG*MAX( 0.0,( -ZW(:) * PRHODREF(:) * PRST(:) * & + ( X0DEPS*PLBDS(:)**XEX0DEPS + & + X1DEPS*PCJ(:)*PLBDS(:)**(XEX1DEPS+XBS)* & + (1+(XFVELOS/(2.*PLBDS(:)))**XALPHAS)**(-XNUS+XEX1DEPS/XALPHAS)) )) ! On ne tient pas compte de la collection de pluie et gouttelettes par la neige si T>0 !!!! ! Note that no heat is exchanged because the graupeln produced are still icy!!! P_RS_CMEL(:) = - ZW(:) diff --git a/src/MNH/lima_droplets_accretion.f90 b/src/MNH/lima_droplets_accretion.f90 index 8996b5425b8282ae43f1676dd6b09e55661b8787..d97d99d3ed0e10522453e5d3043f15d819a102f8 100644 --- a/src/MNH/lima_droplets_accretion.f90 +++ b/src/MNH/lima_droplets_accretion.f90 @@ -58,12 +58,13 @@ END MODULE MODI_LIMA_DROPLETS_ACCRETION !! ------------- !! Original 15/03/2018 !! +! Delbeke/Vie 03/2022 : KHKO option !------------------------------------------------------------------------------- ! !* 0. DECLARATIONS ! ------------ ! -USE MODD_PARAM_LIMA, ONLY : XRTMIN, XCTMIN +USE MODD_PARAM_LIMA, ONLY : XRTMIN, XCTMIN, LKHKO USE MODD_PARAM_LIMA_WARM, ONLY : XLAUTR, XAUTO1, XLAUTR_THRESHOLD, & XACCR4, XACCR5, XACCR3, XACCR2, XACCR1, & XACCR_CLARGE1, XACCR_CLARGE2, XACCR_RLARGE1, XACCR_RLARGE2, & @@ -109,50 +110,71 @@ ZW2(:) = 0.0 ZW3(:) = 0.0 ZW4(:) = 0.0 ! -WHERE( PRCT(:)>XRTMIN(2) .AND. PCCT(:)>XCTMIN(2) .AND. PRRT(:)>XRTMIN(3) .AND. PCRT(:)>XCTMIN(3) .AND. LDCOMPUTE(:) ) - ZW2(:) = MAX( 0.0,XLAUTR*PRHODREF(:)*PRCT(:)*(XAUTO1/PLBDC(:)**4-XLAUTR_THRESHOLD) ) ! L - ZW4(:) = XACCR1/PLBDR(:) -END WHERE -! -GACCR(:) = LDCOMPUTE(:) .AND. & - PRRT(:)>XRTMIN(3) .AND. & - PCRT(:)>XCTMIN(3) .AND. & - PRCT(:)>XRTMIN(2) .AND. & - PCCT(:)>XCTMIN(2) .AND. & - (PRRT(:)>1.2*ZW2(:)/PRHODREF(:) .OR. & +! +! +IF ( LKHKO ) THEN +! + GACCR(:) = PRRT(:)>XRTMIN(3) .AND. & + PRCT(:)>XRTMIN(2) .AND. & + PCCT(:)>XCTMIN(2) +! + WHERE ( GACCR(:) ) +! + ZW1(:) = 67.0 * ( PRCT(:) * PRRT(:) )**1.15 + P_RC_ACCR(:) = - ZW1(:) +! + ZW2(:) = ZW1(:) * PCCT(:) / PRCT(:) + P_CC_ACCR(:) = - ZW2(:) +! + END WHERE +! +ELSE +! + WHERE( PRCT(:)>XRTMIN(2) .AND. PCCT(:)>XCTMIN(2) .AND. PRRT(:)>XRTMIN(3) .AND. PCRT(:)>XCTMIN(3) .AND. LDCOMPUTE(:) ) + ZW2(:) = MAX( 0.0,XLAUTR*PRHODREF(:)*PRCT(:)*(XAUTO1/PLBDC(:)**4-XLAUTR_THRESHOLD) ) ! L + ZW4(:) = XACCR1/PLBDR(:) + END WHERE +! + GACCR(:) = LDCOMPUTE(:) .AND. & + PRRT(:)>XRTMIN(3) .AND. & + PCRT(:)>XCTMIN(3) .AND. & + PRCT(:)>XRTMIN(2) .AND. & + PCCT(:)>XCTMIN(2) .AND. & + (PRRT(:)>1.2*ZW2(:)/PRHODREF(:) .OR. & ZW4(:)>=MAX(XACCR2,XACCR3/(XACCR4/PLBDC(:)-XACCR5)) ) ! ! Accretion for D>100 10-6 m -WHERE( GACCR(:).AND.(ZW4(:)>1.E-4) ) - ZW3(:) = MIN(PLBDC3(:) / PLBDR3(:),1.E15) - ZW1(:) = ( PCCT(:)*PCRT(:) / PLBDC3(:) )*PRHODREF(:) - ZW2(:) = ZW1(:)*(XACCR_CLARGE1+XACCR_CLARGE2*ZW3(:)) + WHERE( GACCR(:).AND.(ZW4(:)>1.E-4) ) + ZW3(:) = MIN(PLBDC3(:) / PLBDR3(:),1.E15) + ZW1(:) = ( PCCT(:)*PCRT(:) / PLBDC3(:) )*PRHODREF(:) + ZW2(:) = ZW1(:)*(XACCR_CLARGE1+XACCR_CLARGE2*ZW3(:)) ! - P_CC_ACCR(:) = - ZW2(:) + P_CC_ACCR(:) = - ZW2(:) ! - ZW1(:) = ( ZW1(:) / PLBDC3(:) ) - ZW2(:) = ZW1(:)*(XACCR_RLARGE1+XACCR_RLARGE2*ZW3(:)) + ZW1(:) = ( ZW1(:) / PLBDC3(:) ) + ZW2(:) = ZW1(:)*(XACCR_RLARGE1+XACCR_RLARGE2*ZW3(:)) ! - P_RC_ACCR(:) = - ZW2(:) -END WHERE + P_RC_ACCR(:) = - ZW2(:) + END WHERE ! ! Accretion for D<100 10-6 m -WHERE( GACCR(:).AND.(ZW4(:)<=1.E-4) ) - ZW3(:) = MIN(PLBDC3(:) / PLBDR3(:), 1.E8) - ZW1(:) = ( PCCT(:)*PCRT(:) / PLBDC3(:) )*PRHODREF(:) - ZW1(:) = ZW1(:)/PLBDC3(:) + WHERE( GACCR(:).AND.(ZW4(:)<=1.E-4) ) + ZW3(:) = MIN(PLBDC3(:) / PLBDR3(:), 1.E8) + ZW1(:) = ( PCCT(:)*PCRT(:) / PLBDC3(:) )*PRHODREF(:) + ZW1(:) = ZW1(:)/PLBDC3(:) - ZW3(:) = ZW3(:)**2 - ZW2(:) = ZW1(:)*(XACCR_CSMALL1+XACCR_CSMALL2*ZW3(:)) + ZW3(:) = ZW3(:)**2 + ZW2(:) = ZW1(:)*(XACCR_CSMALL1+XACCR_CSMALL2*ZW3(:)) ! - P_CC_ACCR(:) = - ZW2(:) + P_CC_ACCR(:) = - ZW2(:) ! - ZW1(:) = ZW1(:) / PLBDC3(:) - ZW2(:) = ZW1(:)*(XACCR_RSMALL1+XACCR_RSMALL2*ZW3(:)) + ZW1(:) = ZW1(:) / PLBDC3(:) + ZW2(:) = ZW1(:)*(XACCR_RSMALL1+XACCR_RSMALL2*ZW3(:)) ! - P_RC_ACCR(:) = - ZW2(:) -END WHERE + P_RC_ACCR(:) = - ZW2(:) + END WHERE ! +END IF ! ! !------------------------------------------------------------------------------- diff --git a/src/MNH/lima_droplets_autoconversion.f90 b/src/MNH/lima_droplets_autoconversion.f90 index 044030f792dd2b64affa03bd8407470d8486691b..27090666289087303630e97d95b1c7836fd33d07 100644 --- a/src/MNH/lima_droplets_autoconversion.f90 +++ b/src/MNH/lima_droplets_autoconversion.f90 @@ -53,15 +53,17 @@ END MODULE MODI_LIMA_DROPLETS_AUTOCONVERSION !! ------------- !! Original 15/03/2018 !! B. Vie 02/03/2020 : missing CC process +! Delbeke/Vie 03/2022 : KHKO option !------------------------------------------------------------------------------- ! !* 0. DECLARATIONS ! ------------ ! -USE MODD_PARAM_LIMA, ONLY : XRTMIN, XCTMIN +USE MODD_PARAM_LIMA, ONLY : XRTMIN, XCTMIN, LKHKO USE MODD_PARAM_LIMA_WARM, ONLY : XLAUTR, XAUTO1, XLAUTR_THRESHOLD, & XITAUTR, XAUTO2, XITAUTR_THRESHOLD, & - XACCR4, XACCR5, XACCR3, XACCR1, XAC + XACCR4, XACCR5, XACCR3, XACCR1, XAC, XR0 +USE MODD_CST, ONLY : XPI, XRHOLW ! IMPLICIT NONE ! @@ -86,13 +88,6 @@ REAL, DIMENSION(SIZE(PRCT)) :: ZW1, ZW2, ZW3 ! work arrays ! !------------------------------------------------------------------------------- ! -! -! -!* 1. Autoconversion of cloud droplets (Berry-Reinhardt parameterization) -! ---------------------------------------------------------------------- -! -! -! P_RC_AUTO(:) = 0.0 P_CC_AUTO(:) = 0.0 P_CR_AUTO(:) = 0.0 @@ -100,27 +95,53 @@ P_CR_AUTO(:) = 0.0 ZW3(:) = 0.0 ZW2(:) = 0.0 ZW1(:) = 0.0 -WHERE( PRCT(:)>XRTMIN(2) .AND. PCCT(:)>XCTMIN(2) .AND. PLBDC(:)>0. .AND. LDCOMPUTE(:) ) - ZW2(:) = MAX( 0.0, & +! +IF (LKHKO) THEN +! +! 1. Autoconversion of cloud droplets (Berry-Reinhardt parameterization) +! ---------------------------------------------------------------------- +! + WHERE ( PRCT(:)>XRTMIN(2) .AND. PCCT(:)>XCTMIN(2) .AND. LDCOMPUTE(:) ) +! + ZW1(:)= 1350.0 * PRCT(:)**(2.47) * (PCCT(:)* PRHODREF(:)/1.0E6)**(-1.79) ! ZCCT in cm-3 +! + P_RC_AUTO(:) = - ZW1(:) +! + ZW2(:) = ZW1(:) * 3./(4.*XPI*XRHOLW*(XR0)**(3.)) + P_CR_AUTO(:) = ZW2(:) +! + ZW3(:) = - ZW1(:) * PCCT(:) / PRCT(:) + P_CC_AUTO(:) = ZW3(:) +! + END WHERE +! +ELSE +! +! 2. Autoconversion of cloud droplets (Berry-Reinhardt parameterization) +! ---------------------------------------------------------------------- +! + WHERE( PRCT(:)>XRTMIN(2) .AND. PCCT(:)>XCTMIN(2) .AND. PLBDC(:)>0. .AND. LDCOMPUTE(:) ) + ZW2(:) = MAX( 0.0, & XLAUTR*PRHODREF(:)*PRCT(:)*(XAUTO1/min(PLBDC(:),1.e9)**4-XLAUTR_THRESHOLD) ) ! L ! - ZW3(:) = MAX( 0.0, & + ZW3(:) = MAX( 0.0, & XITAUTR*ZW2(:)*PRCT(:)*(XAUTO2/PLBDC(:)-XITAUTR_THRESHOLD) ) ! L/tau ! - P_RC_AUTO(:) = - ZW3(:) + P_RC_AUTO(:) = - ZW3(:) ! - ZW1(:) = MIN( MIN( 1.2E4, & - (XACCR4/PLBDC(:)-XACCR5)/XACCR3 ), & - PLBDR(:)/XACCR1 ) ! D**-1 threshold diameter for - ! switching the autoconversion regimes - ! min (80 microns, D_h, D_r) - ZW3(:) = ZW3(:) * MAX( 0.0,ZW1(:) )**3 / XAC + ZW1(:) = MIN( MIN( 1.2E4, & + (XACCR4/PLBDC(:)-XACCR5)/XACCR3 ), & + PLBDR(:)/XACCR1 ) ! D**-1 threshold diameter for + ! switching the autoconversion regimes + ! min (80 microns, D_h, D_r) + ZW3(:) = ZW3(:) * MAX( 0.0,ZW1(:) )**3 / XAC ! - P_CC_AUTO(:) = -ZW3(:) - P_CR_AUTO(:) = ZW3(:) + P_CC_AUTO(:) = -ZW3(:) + P_CR_AUTO(:) = ZW3(:) ! -END WHERE + END WHERE ! +END IF ! !------------------------------------------------------------------------------- ! diff --git a/src/MNH/lima_droplets_riming_snow.f90 b/src/MNH/lima_droplets_riming_snow.f90 index 6bef29df3bfac250078b40d9c8f45d2d00cc4dfa..b1c4a8007bddd182015e9aac542bec4c3e0d1c73 100644 --- a/src/MNH/lima_droplets_riming_snow.f90 +++ b/src/MNH/lima_droplets_riming_snow.f90 @@ -66,6 +66,7 @@ END MODULE MODI_LIMA_DROPLETS_RIMING_SNOW !! ------------- !! Original 15/03/2018 ! P. Wautelet 26/04/2019: replace non-standard FLOAT function by REAL function +! J. Wurtz 03/2022: new snow characteristics ! !------------------------------------------------------------------------------- ! @@ -73,11 +74,11 @@ END MODULE MODI_LIMA_DROPLETS_RIMING_SNOW ! ------------ ! USE MODD_CST, ONLY : XTT -USE MODD_PARAM_LIMA, ONLY : XRTMIN, XCEXVT +USE MODD_PARAM_LIMA, ONLY : XRTMIN, XCEXVT, XNUS, XALPHAS USE MODD_PARAM_LIMA_MIXED, ONLY : NGAMINC, XRIMINTP1, XRIMINTP2, XGAMINC_RIM1, XGAMINC_RIM2, & - XCRIMSS, XEXCRIMSS, XSRIMCG, XEXSRIMCG, & + XCRIMSS, XEXCRIMSS, XSRIMCG, XEXSRIMCG, XSRIMCG2, XSRIMCG3, XEXSRIMCG2, & XHMLINTP1, XHMLINTP2, XGAMINC_HMC, XHM_FACTS, XHMTMIN, XHMTMAX -USE MODD_PARAM_LIMA_COLD, ONLY : XMNU0 +USE MODD_PARAM_LIMA_COLD, ONLY : XMNU0, XBS, XFVELOS ! IMPLICIT NONE ! @@ -171,7 +172,9 @@ WHERE( GRIM ) ! 4. riming ! ! Cloud droplets collected - P_RC_RIM(:) = - XCRIMSS * PRCT(:) * PLBDS(:)**XEXCRIMSS * PRHODREF(:)**(-XCEXVT) + P_RC_RIM(:) = - XCRIMSS * PRCT(:) * PRST(:)*(1+(XFVELOS/PLBDS(:))**XALPHAS)**(-XNUS+XEXCRIMSS/XALPHAS) & + * PRHODREF(:)**(-XCEXVT+1) & + * (PLBDS(:)) ** (XEXCRIMSS+XBS) P_CC_RIM(:) = P_RC_RIM(:) *(PCCT(:)/PRCT(:)) ! Lambda_c**3 ! ! Cloud droplets collected on small aggregates add to snow @@ -181,7 +184,7 @@ WHERE( GRIM ) P_RG_RIM(:) = - P_RC_RIM(:) - P_RS_RIM(:) ! ! Large aggregates collecting droplets add to graupel (instant process ???) - ZZW3(:) = XSRIMCG * PLBDS(:)**XEXSRIMCG * (1.0 - ZZW2(:))/(PTSTEP*PRHODREF(:)) + ZZW3(:) = PRST(:)*(1.0 - ZZW2(:))/PTSTEP P_RS_RIM(:) = P_RS_RIM(:) - ZZW3(:) P_RG_RIM(:) = P_RG_RIM(:) + ZZW3(:) ! diff --git a/src/MNH/lima_graupel.f90 b/src/MNH/lima_graupel.f90 index ad114da363f6c1616ce45ee6534f929d64845e2f..578f22bbf93fb04be12fb7e1c7edd9f1957cbe53 100644 --- a/src/MNH/lima_graupel.f90 +++ b/src/MNH/lima_graupel.f90 @@ -129,6 +129,7 @@ END MODULE MODI_LIMA_GRAUPEL !! ------------- !! Original 15/03/2018 ! P. Wautelet 26/04/2019: replace non-standard FLOAT function by REAL function +! J. Wurtz 03/2022: new snow characteristics ! !------------------------------------------------------------------------------- ! @@ -330,12 +331,12 @@ WHERE( GDRY ) * (ZVEC1(:) - 1.0) ZZW(:) = ZVEC3(:) ! - ZZW3(:) = XFSDRYG * ZZW(:) * EXP( XCOLEXSG*(PT(:)-XTT) ) & ! RSDRYG - rs collected by graupel in dry mode - *( PLBDS(:)**(XCXS-XBS) )*( PLBDG(:)**XCXG ) & - *( PRHODREF(:)**(-XCEXVT-1.) ) & - *( XLBSDRYG1/( PLBDG(:)**2 ) + & - XLBSDRYG2/( PLBDG(:) * PLBDS(:) ) + & - XLBSDRYG3/( PLBDS(:)**2) ) + ZZW3(:) = XFSDRYG * ZZW(:) * EXP( XCOLEXSG*(PT(:)-XTT) ) & ! RSDRYG - rs collected by graupel in dry mode + *( PRST(:))*( PLBDG(:)**XCXG ) & + *( PRHODREF(:)**(-XCEXVT) ) & + *( XLBSDRYG1/( PLBDG(:)**2 ) + & + XLBSDRYG2/( PLBDG(:) * PLBDS(:) ) + & + XLBSDRYG3/( PLBDS(:)**2) ) END WHERE ! !* 1.c Collection of rr in the dry mode diff --git a/src/MNH/lima_ice_aggregation_snow.f90 b/src/MNH/lima_ice_aggregation_snow.f90 index 15e01ec84b33a508d8b30285ea944540185b1015..2979bee5b31a944057a7b78360a6505ab58302ee 100644 --- a/src/MNH/lima_ice_aggregation_snow.f90 +++ b/src/MNH/lima_ice_aggregation_snow.f90 @@ -52,16 +52,18 @@ END MODULE MODI_LIMA_ICE_AGGREGATION_SNOW !! MODIFICATIONS !! ------------- !! Original 15/03/2018 -!! +! J. Wurtz 03/2022: new snow characteristics +! B. Vie 03/2022: Add option for 1-moment pristine ice +! !------------------------------------------------------------------------------- ! !* 0. DECLARATIONS ! ------------ ! USE MODD_CST, ONLY : XTT -USE MODD_PARAM_LIMA, ONLY : XRTMIN, XCTMIN +USE MODD_PARAM_LIMA, ONLY : XRTMIN, XCTMIN, XCEXVT, NMOM_I USE MODD_PARAM_LIMA_COLD, ONLY : XBI, XCCS, XCXS, XCOLEXIS, XAGGS_CLARGE1, XAGGS_CLARGE2, & - XAGGS_RLARGE1, XAGGS_RLARGE2 + XAGGS_RLARGE1, XAGGS_RLARGE2, XFIAGGS, XBS, XLBS ! IMPLICIT NONE ! @@ -99,19 +101,30 @@ P_RI_AGGS(:) = 0. P_CI_AGGS(:) = 0. ! ! -WHERE ( (PRIT(:)>XRTMIN(4)) .AND. (PRST(:)>XRTMIN(5)) .AND. LDCOMPUTE(:) ) - ZZW1(:) = (PLBDI(:) / PLBDS(:))**3 - ZZW2(:) = (PCIT(:)*(XCCS*PLBDS(:)**XCXS)/PRHODREF(:)*EXP( XCOLEXIS*(PT(:)-XTT) )) & - / (PLBDI(:)**3) - ZZW3(:) = ZZW2(:)*(XAGGS_CLARGE1+XAGGS_CLARGE2*ZZW1(:)) +IF (NMOM_I.EQ.1) THEN + WHERE ( (PRIT(:)>XRTMIN(4)) .AND. (PRST(:)>XRTMIN(5)) .AND. LDCOMPUTE(:) ) + ZZW1(:) = XFIAGGS * EXP( XCOLEXIS*(PT(:)-XTT) ) & + * PRIT(:) & + * PLBDS(:)**(1.-0.27-2.) & + * PRHODREF(:)**(-XCEXVT) +! + P_RI_AGGS(:) = - ZZW1(:) + END WHERE +ELSE + WHERE ( (PRIT(:)>XRTMIN(4)) .AND. (PRST(:)>XRTMIN(5)) .AND. LDCOMPUTE(:) ) + ZZW1(:) = (PLBDI(:) / PLBDS(:))**3 + ZZW2(:) = (PCIT(:)*(XLBS*PRST(:)*PLBDS(:)**XBS)*EXP(XCOLEXIS*(PT(:)-XTT) )) & + / (PLBDI(:)**3) + ZZW3(:) = ZZW2(:)*(XAGGS_CLARGE1+XAGGS_CLARGE2*ZZW1(:)) ! - P_CI_AGGS(:) = - ZZW3(:) + P_CI_AGGS(:) = - ZZW3(:) ! - ZZW2(:) = ZZW2(:) / PLBDI(:)**XBI - ZZW2(:) = ZZW2(:)*(XAGGS_RLARGE1+XAGGS_RLARGE2*ZZW1(:)) + ZZW2(:) = ZZW2(:) / PLBDI(:)**XBI + ZZW2(:) = ZZW2(:)*(XAGGS_RLARGE1+XAGGS_RLARGE2*ZZW1(:)) ! - P_RI_AGGS(:) = - ZZW2(:) -END WHERE + P_RI_AGGS(:) = - ZZW2(:) + END WHERE +END IF ! ! !------------------------------------------------------------------------------- diff --git a/src/MNH/lima_ice_deposition.f90 b/src/MNH/lima_ice_deposition.f90 index 8c7c57e4091305b31d8906cec050cd18427f63cb..2b46227b80ded9618b03c77b75eb75ce0a90a458 100644 --- a/src/MNH/lima_ice_deposition.f90 +++ b/src/MNH/lima_ice_deposition.f90 @@ -8,16 +8,17 @@ ! ##################### ! INTERFACE - SUBROUTINE LIMA_ICE_DEPOSITION (PTSTEP, LDCOMPUTE, & - PRHODREF, PSSI, PAI, PCJ, PLSFACT, & - PRIT, PCIT, PLBDI, & - P_TH_DEPI, P_RI_DEPI, & - P_RI_CNVS, P_CI_CNVS ) + SUBROUTINE LIMA_ICE_DEPOSITION (PTSTEP, LDCOMPUTE, & + PRHODREF, PT, PSSI, PAI, PCJ, PLSFACT, & + PRIT, PCIT, PLBDI, & + P_TH_DEPI, P_RI_DEPI, & + P_RI_CNVS, P_CI_CNVS ) ! REAL, INTENT(IN) :: PTSTEP LOGICAL, DIMENSION(:),INTENT(IN) :: LDCOMPUTE ! REAL, DIMENSION(:), INTENT(IN) :: PRHODREF! Reference density +REAL, DIMENSION(:), INTENT(IN) :: PT ! abs. pressure at time t REAL, DIMENSION(:), INTENT(IN) :: PSSI ! abs. pressure at time t REAL, DIMENSION(:), INTENT(IN) :: PAI ! abs. pressure at time t REAL, DIMENSION(:), INTENT(IN) :: PCJ ! abs. pressure at time t @@ -40,7 +41,7 @@ END MODULE MODI_LIMA_ICE_DEPOSITION ! ! ########################################################################## SUBROUTINE LIMA_ICE_DEPOSITION (PTSTEP, LDCOMPUTE, & - PRHODREF, PSSI, PAI, PCJ, PLSFACT, & + PRHODREF, PT, PSSI, PAI, PCJ, PLSFACT, & PRIT, PCIT, PLBDI, & P_TH_DEPI, P_RI_DEPI, & P_RI_CNVS, P_CI_CNVS ) @@ -65,14 +66,16 @@ SUBROUTINE LIMA_ICE_DEPOSITION (PTSTEP, LDCOMPUTE, & !! MODIFICATIONS !! ------------- !! Original 15/03/2018 -!! +!! B. Vié 30/08/2021 Disable CNVS if LSNOW=F +!! B. Vie 03/2022 Add option for 1-moment pristine ice !------------------------------------------------------------------------------- ! !* 0. DECLARATIONS ! ------------ ! -USE MODD_PARAM_LIMA, ONLY : XRTMIN, XCTMIN, XALPHAI, XALPHAS, XNUI, XNUS -USE MODD_PARAM_LIMA_COLD, ONLY : XCXS, XCCS, & +USE MODD_PARAM_LIMA, ONLY : XRTMIN, XCTMIN, XALPHAI, XALPHAS, XNUI, XNUS,& + LSNOW, NMOM_I +USE MODD_PARAM_LIMA_COLD, ONLY : XCXS, XCCS, & XLBDAS_MAX, XDSCNVI_LIM, XLBDASCNVI_MAX, & XC0DEPSI, XC1DEPSI, XR0DEPSI, XR1DEPSI, & XSCFAC, X1DEPS, X0DEPS, XEX1DEPS, XEX0DEPS, & @@ -81,7 +84,7 @@ USE MODD_PARAM_LIMA_COLD, ONLY : XCXS, XCCS, & XCOLEXIS, XAGGS_CLARGE1, XAGGS_CLARGE2, & XAGGS_RLARGE1, XAGGS_RLARGE2, & XDI, X0DEPI, X2DEPI - +USE MODD_CST, ONLY : XTT ! IMPLICIT NONE ! @@ -91,6 +94,7 @@ REAL, INTENT(IN) :: PTSTEP LOGICAL, DIMENSION(:),INTENT(IN) :: LDCOMPUTE ! REAL, DIMENSION(:), INTENT(IN) :: PRHODREF! Reference density +REAL, DIMENSION(:), INTENT(IN) :: PT ! abs. pressure at time t REAL, DIMENSION(:), INTENT(IN) :: PSSI ! abs. pressure at time t REAL, DIMENSION(:), INTENT(IN) :: PAI ! abs. pressure at time t REAL, DIMENSION(:), INTENT(IN) :: PCJ ! abs. pressure at time t @@ -110,7 +114,7 @@ REAL, DIMENSION(:), INTENT(OUT) :: P_CI_CNVS !* 0.2 Declarations of local variables : ! LOGICAL, DIMENSION(SIZE(PRHODREF)) :: GMICRO ! Computations only where necessary -REAL, DIMENSION(SIZE(PRHODREF)) :: ZZW, ZZW2, ZZX ! Work array +REAL, DIMENSION(SIZE(PRHODREF)) :: ZZW, ZZW2, ZZX, ZCRIAUTI ! Work array ! ! !------------------------------------------------------------------------------- @@ -128,48 +132,55 @@ P_CI_CNVS(:) = 0. GMICRO(:) = LDCOMPUTE(:) .AND. PRIT(:)>XRTMIN(4) ! ! -WHERE( GMICRO ) -! +IF (NMOM_I.EQ.1) THEN + WHERE( GMICRO ) ! -!* 2.2 Deposition of water vapor on r_i: RVDEPI -! ----------------------------------------------- +!* Conversion of pristine ice to r_s: RICNVS +! ----------------------------------------- ! + ZCRIAUTI(:)=MIN(0.2E-4,10**(0.06*(PT(:)-XTT)-3.5)) + ZZW(:) = 0.0 + WHERE ( (PRIT(:)>XRTMIN(4))) + ZZW(:) = 1.E-3 * EXP( 0.015*(PT(:)-XTT) ) * MAX( PRIT(:)-ZCRIAUTI(:),0.0 ) + END WHERE ! - ZZW(:) = 0.0 - WHERE ( (PRIT(:)>XRTMIN(4)) .AND. (PCIT(:)>XCTMIN(4)) ) - ZZW(:) = ( PSSI(:) / PAI(:) ) * PCIT(:) * & - ( X0DEPI/PLBDI(:)+X2DEPI*PCJ(:)*PCJ(:)/PLBDI(:)**(XDI+2.0) ) + P_RI_CNVS(:) = - ZZW(:) END WHERE -! - P_RI_DEPI(:) = ZZW(:) -!!$ P_TH_DEPI(:) = P_RI_DEPI(:) * PLSFACT(:) -! -!!$ PA_TH(:) = PA_TH(:) + P_TH_DEPI(:) -!!$ PA_RV(:) = PA_RV(:) - P_RI_DEPI(:) -!!$ PA_RI(:) = PA_RI(:) + P_RI_DEPI(:) -! -! -!* 2.3 Conversion of pristine ice to r_s: RICNVS -! ------------------------------------------------ -! -! - ZZW(:) = 0.0 - ZZW2(:) = 0.0 - WHERE ( (PLBDI(:)<XLBDAICNVS_LIM) .AND. (PCIT(:)>XCTMIN(4)) & - .AND. (PSSI(:)>0.0) ) - ZZW(:) = (PLBDI(:)*XDICNVS_LIM)**(XALPHAI) - ZZX(:) = ( PSSI(:)/PAI(:) )*PCIT(:) * (ZZW(:)**XNUI) *EXP(-ZZW(:)) -! - ZZW(:) = ( XR0DEPIS + XR1DEPIS*PCJ(:) )*ZZX(:) -! - ZZW2(:) = ZZW(:) * (XC0DEPIS+XC1DEPIS*PCJ(:)) / (XR0DEPIS+XR1DEPIS*PCJ(:)) +ELSE + WHERE( GMICRO ) +! +!* Deposition of water vapor on r_i: RVDEPI +! ---------------------------------------- +! + ZZW(:) = 0.0 + WHERE ( (PRIT(:)>XRTMIN(4)) .AND. (PCIT(:)>XCTMIN(4)) ) + ZZW(:) = ( PSSI(:) / PAI(:) ) * PCIT(:) * & + ( X0DEPI/PLBDI(:)+X2DEPI*PCJ(:)*PCJ(:)/PLBDI(:)**(XDI+2.0) ) + END WHERE + P_RI_DEPI(:) = ZZW(:) +! +!* Conversion of pristine ice to r_s: RICNVS +! ----------------------------------------- +! + ZZW(:) = 0.0 + ZZW2(:) = 0.0 + WHERE ( (PLBDI(:)<XLBDAICNVS_LIM) .AND. (PCIT(:)>XCTMIN(4)) & + .AND. (PSSI(:)>0.0) ) + ZZW(:) = (PLBDI(:)*XDICNVS_LIM)**(XALPHAI) + ZZX(:) = (PSSI(:)/PAI(:))*PCIT(:) * (ZZW(:)**XNUI) *EXP(-ZZW(:)) +! + ZZW(:) = (XR0DEPIS + XR1DEPIS*PCJ(:))*ZZX(:) +! + ZZW2(:) = ZZW(:) * (XC0DEPIS+XC1DEPIS*PCJ(:)) / (XR0DEPIS+XR1DEPIS*PCJ(:)) + END WHERE + P_RI_CNVS(:) = - ZZW(:) + P_CI_CNVS(:) = - ZZW2(:) END WHERE +END IF ! -P_RI_CNVS(:) = - ZZW(:) -P_CI_CNVS(:) = - ZZW2(:) -! -! -END WHERE -! +IF (.NOT.LSNOW) THEN + P_RI_CNVS(:) = 0. + P_CI_CNVS(:) = 0. +END IF ! END SUBROUTINE LIMA_ICE_DEPOSITION diff --git a/src/MNH/lima_ice_snow_deposition.f90 b/src/MNH/lima_ice_snow_deposition.f90 index 4d92b528ac9aabb0224e61ae9de0c23a5b50f0fb..f31d3175d58108eecb631b515567ca27e669d202 100644 --- a/src/MNH/lima_ice_snow_deposition.f90 +++ b/src/MNH/lima_ice_snow_deposition.f90 @@ -78,21 +78,22 @@ SUBROUTINE LIMA_ICE_SNOW_DEPOSITION (PTSTEP, LDCOMPUTE, & !! MODIFICATIONS !! ------------- !! Original 15/03/2018 +! J. Wurtz 03/2022: new snow characteristics !! !------------------------------------------------------------------------------- ! !* 0. DECLARATIONS ! ------------ ! -USE MODD_PARAM_LIMA, ONLY : XRTMIN, XCTMIN, XALPHAI, XALPHAS, XNUI, XNUS -USE MODD_PARAM_LIMA_COLD, ONLY : XCXS, XCCS, & +USE MODD_PARAM_LIMA, ONLY : XRTMIN, XCTMIN, XALPHAI, XALPHAS, XNUI, XNUS +USE MODD_PARAM_LIMA_COLD, ONLY : XCXS, XCCS, XLBS, XBS, & XLBDAS_MAX, XDSCNVI_LIM, XLBDASCNVI_MAX, & XC0DEPSI, XC1DEPSI, XR0DEPSI, XR1DEPSI, & XSCFAC, X1DEPS, X0DEPS, XEX1DEPS, XEX0DEPS, & XDICNVS_LIM, XLBDAICNVS_LIM, & XC0DEPIS, XC1DEPIS, XR0DEPIS, XR1DEPIS, & XCOLEXIS, XAGGS_CLARGE1, XAGGS_CLARGE2, & - XAGGS_RLARGE1, XAGGS_RLARGE2 + XAGGS_RLARGE1, XAGGS_RLARGE2, XFVELOS ! IMPLICIT NONE @@ -166,7 +167,7 @@ WHERE( GMICRO ) WHERE ( PLBDS(:)<XLBDASCNVI_MAX .AND. (PRST(:)>XRTMIN(5)) & .AND. (PSSI(:)<0.0) ) ZZW(:) = (PLBDS(:)*XDSCNVI_LIM)**(XALPHAS) - ZZX(:) = ( -PSSI(:)/PAI(:) ) * (XCCS*PLBDS(:)**XCXS)/PRHODREF(:) * (ZZW(:)**XNUS) * EXP(-ZZW(:)) + ZZX(:) = ( -PSSI(:)/PAI(:) ) * (XLBS*PRST(:)*PLBDS(:)**XBS) * (ZZW(:)**XNUS) * EXP(-ZZW(:)) ! ZZW(:) = ( XR0DEPSI+XR1DEPSI*PCJ(:) )*ZZX(:) ! @@ -187,8 +188,10 @@ WHERE( GMICRO ) ! ZZW(:) = 0.0 WHERE ( (PRST(:)>XRTMIN(5)) ) - ZZW(:) = ( PSSI(:)/(PAI(:))/PRHODREF(:) ) * & - ( X0DEPS*PLBDS(:)**XEX0DEPS + X1DEPS*PCJ(:)*PLBDS(:)**XEX1DEPS ) + ZZW(:) =( PRST(:)*PSSI(:)/PAI(:) ) * & + ( X0DEPS*PLBDS(:)**XEX0DEPS + & + ( X1DEPS*PCJ(:)*(PLBDS(:))**(XBS+XEX1DEPS) * & + (1+(XFVELOS/(2.*PLBDS(:)))**XALPHAS)**(-XNUS+XEX1DEPS/XALPHAS))) ZZW(:) = ZZW(:)*(0.5+SIGN(0.5,ZZW(:))) - ABS(ZZW(:))*(0.5-SIGN(0.5,ZZW(:))) END WHERE ! diff --git a/src/MNH/lima_mixed.f90 b/src/MNH/lima_mixed.f90 index 49024b7b518893f1b9b101175676fb8a5d18f558..4d558eb1da83e2eb5d500c0ee18dbce977d80c42 100644 --- a/src/MNH/lima_mixed.f90 +++ b/src/MNH/lima_mixed.f90 @@ -96,6 +96,7 @@ END MODULE MODI_LIMA_MIXED ! P. Wautelet 03/2020: use the new data structures and subroutines for budgets (no more call to budget in this subroutine) ! P. Wautelet 28/05/2020: bugfix: correct array start for PSVT and PSVS ! P. Wautelet 02/02/2021: budgets: add missing source terms for SV budgets in LIMA +! J. Wurtz 03/2022: new snow characteristics !------------------------------------------------------------------------------- ! !* 0. DECLARATIONS @@ -108,9 +109,9 @@ USE MODD_CST, ONLY: XP00, XRD, XRV, XMV, XMD, XCPD, XCPV, & USE MODD_NSV USE MODD_PARAMETERS, ONLY: JPHEXT, JPVEXT USE MODD_PARAM_LIMA, ONLY: NMOD_IFN, XRTMIN, XCTMIN, LWARM, LCOLD, & - NMOD_CCN, NMOD_IMM, LRAIN, LSNOW, LHAIL + NMOD_CCN, NMOD_IMM, LRAIN, LSNOW, LHAIL, LSNOW_T USE MODD_PARAM_LIMA_WARM, ONLY: XLBC, XLBEXC, XLBR, XLBEXR -USE MODD_PARAM_LIMA_COLD, ONLY: XLBI, XLBEXI, XLBS, XLBEXS, XSCFAC +USE MODD_PARAM_LIMA_COLD, ONLY: XLBI, XLBEXI, XLBS, XLBEXS, XSCFAC, XLBDAS_MAX, XLBDAS_MIN, XTRANS_MP_GAMMAS USE MODD_PARAM_LIMA_MIXED, ONLY: XLBG, XLBEXG, XLBH, XLBEXH use mode_tools, only: Countjv @@ -467,9 +468,19 @@ IF( IMICRO >= 1 ) THEN ZLBDAI(:) = ( XLBI*ZCIT(:) / ZRIT(:) )**XLBEXI END WHERE ZLBDAS(:) = 1.E10 - WHERE (ZRST(:)>XRTMIN(5) ) - ZLBDAS(:) = XLBS*( ZRHODREF(:)*ZRST(:) )**XLBEXS - END WHERE + IF (LSNOW_T) THEN + WHERE(ZZT(:)>263.15 .AND. ZRST(:)>XRTMIN(5)) + ZLBDAS(:) = MAX(MIN(XLBDAS_MAX, 10**(14.554-0.0423*ZZT(:))),XLBDAS_MIN) + END WHERE + WHERE(ZZT(:)<=263.15 .AND. ZRST(:)>XRTMIN(5)) + ZLBDAS(:) = MAX(MIN(XLBDAS_MAX, 10**(6.226-0.0106*ZZT(:))),XLBDAS_MIN) + END WHERE + ZLBDAS(:) = ZLBDAS(:)*XTRANS_MP_GAMMAS + ELSE + WHERE (ZRST(:)>XRTMIN(5)) + ZLBDAS(:) = MAX(MIN(XLBDAS_MAX, XLBS*( ZRHODREF(:)*ZRST(:) )**XLBEXS),XLBDAS_MIN) + END WHERE + END IF ZLBDAG(:) = 1.E10 WHERE (ZRGT(:)>XRTMIN(6) ) ZLBDAG(:) = XLBG*( ZRHODREF(:)*ZRGT(:) )**XLBEXG diff --git a/src/MNH/lima_mixed_fast_processes.f90 b/src/MNH/lima_mixed_fast_processes.f90 index 09c86c8a20e23fb9cd16adb859604d1aae2c37e5..7cfeffec02fef10d912cece900b69ca2983494bc 100644 --- a/src/MNH/lima_mixed_fast_processes.f90 +++ b/src/MNH/lima_mixed_fast_processes.f90 @@ -142,6 +142,7 @@ END MODULE MODI_LIMA_MIXED_FAST_PROCESSES !! C. Barthe * LACy * jan. 2014 add budgets ! P. Wautelet 26/04/2019: replace non-standard FLOAT function by REAL function ! P. Wautelet 03/2020: use the new data structures and subroutines for budgets +! J. Wurtz 03/2022: new snow characteristics !------------------------------------------------------------------------------- ! !* 0. DECLARATIONS @@ -297,9 +298,11 @@ IF( IGRIM>0 ) THEN ! WHERE ( GRIM(:) ) ZZW1(:,1) = MIN( ZRCS(:), & - XCRIMSS * ZZW(:) * ZRCT(:) & ! RCRIMSS - * ZLBDAS(:)**XEXCRIMSS & - * ZRHODREF(:)**(-XCEXVT) ) + XCRIMSS * ZZW(:) * ZRCT(:) & + * ZRST(:)*(1+(XFVELOS/ZLBDAS(:))**XALPHAS)**(-XNUS+XEXCRIMSS/XALPHAS) & + * ZRHODREF(:)**(-XCEXVT+1) & + * (ZLBDAS(:)) ** (XEXCRIMSS+XBS) ) +! ZRCS(:) = ZRCS(:) - ZZW1(:,1) ZRSS(:) = ZRSS(:) + ZZW1(:,1) ZTHS(:) = ZTHS(:) + ZZW1(:,1)*(ZLSFACT(:)-ZLVFACT(:)) ! f(L_f*(RCRIMSS)) @@ -318,14 +321,15 @@ IF( IGRIM>0 ) THEN ! ! WHERE ( GRIM(:) .AND. (ZRSS(:)>XRTMIN(5)/PTSTEP) ) - ZZW1(:,2) = MIN( ZRCS(:), & - XCRIMSG * ZRCT(:) & ! RCRIMSG - * ZLBDAS(:)**XEXCRIMSG & - * ZRHODREF(:)**(-XCEXVT) & - - ZZW1(:,1) ) + ZZW1(:,2) = MIN( ZRCS(:), & + XCRIMSG * ZRCT(:)* ZRST(:) & ! RCRIMSG + *(1+(XFVELOS/ZLBDAS(:))**XALPHAS)**(-XNUS+XEXCRIMSG/XALPHAS)*ZLBDAS(:)**(XBS+XEXCRIMSG) & + * ZRHODREF(:)**(-XCEXVT+1) & + - ZZW1(:,1) ) + ZZW1(:,3) = MIN( ZRSS(:), & - XSRIMCG * ZLBDAS(:)**XEXSRIMCG & ! RSRIMCG - * (1.0 - ZZW(:) )/(PTSTEP*ZRHODREF(:))) + XSRIMCG * XLBS * ZRST(:) * (1.0 - ZZW(:))/PTSTEP ) + ZRCS(:) = ZRCS(:) - ZZW1(:,2) ZRSS(:) = ZRSS(:) - ZZW1(:,3) ZRGS(:) = ZRGS(:) + ZZW1(:,2) + ZZW1(:,3) @@ -477,7 +481,7 @@ IF( IGACC>0 .AND. LRAIN) THEN ! WHERE ( GACC(:) ) ZZW1(:,2) = ZCRT(:) * & !! coef of RRACCS - XFRACCSS*( ZLBDAS(:)**XCXS )*( ZRHODREF(:)**(-XCEXVT-1.) ) & + XFRACCSS*( ZRST(:)*ZLBDAS(:)**XBS )*( ZRHODREF(:)**(-XCEXVT) ) & *( XLBRACCS1/((ZLBDAS(:)**2) ) + & XLBRACCS2/( ZLBDAS(:) * ZLBDAR(:) ) + & XLBRACCS3/( (ZLBDAR(:)**2)) )/ZLBDAR(:)**3 @@ -521,7 +525,7 @@ IF( IGACC>0 .AND. LRAIN) THEN WHERE ( GACC(:) .AND. (ZRSS(:)>XRTMIN(5)/PTSTEP) ) ZZW1(:,2) = MAX( MIN( ZRRS(:),ZZW1(:,2)-ZZW1(:,4) ) , 0. ) ! RRACCSG ZZW1(:,3) = MIN( ZRSS(:),XFSACCRG*ZZW(:)* & ! RSACCRG - ( ZLBDAS(:)**(XCXS-XBS) )*( ZRHODREF(:)**(-XCEXVT-1.) ) & + ( ZRST(:) )*( ZRHODREF(:)**(-XCEXVT) ) & *( XLBSACCR1/((ZLBDAR(:)**2) ) + & XLBSACCR2/( ZLBDAR(:) * ZLBDAS(:) ) + & XLBSACCR3/( (ZLBDAS(:)**2)) ) ) @@ -573,8 +577,9 @@ WHERE( (ZRST(:)>XRTMIN(5)) .AND. (ZRSS(:)>XRTMIN(5)/PTSTEP) .AND. (ZZT(:)>XTT) ) ! compute RSMLT ! ZZW(:) = MIN( ZRSS(:), XFSCVMG*MAX( 0.0,( -ZZW(:) * & - ( X0DEPS* ZLBDAS(:)**XEX0DEPS + & - X1DEPS*ZCJ(:)*ZLBDAS(:)**XEX1DEPS ) - & + ZRHODREF(:) * ZRST(:)*( X0DEPS* ZLBDAS(:)**XEX0DEPS + & + X1DEPS*ZCJ(:)*(1+(XFVELOS/(2.*ZLBDAS(:)))**XALPHAS) & + **(-XNUS+XEX1DEPS/XALPHAS)*(ZLBDAS(:))**(XEX1DEPS+XBS))- & ( ZZW1(:,1)+ZZW1(:,4) ) * & ( ZRHODREF(:)*XCL*(XTT-ZZT(:))) ) / & ( ZRHODREF(:)*XLMTT ) ) ) @@ -738,14 +743,14 @@ IF( IGDRY>0 ) THEN END DO ZZW(:) = UNPACK( VECTOR=ZVEC3(:),MASK=GDRY,FIELD=0.0 ) ! - WHERE( GDRY(:) ) + WHERE( GDRY(:) ) ZZW1(:,3) = MIN( ZRSS(:),XFSDRYG*ZZW(:) & ! RSDRYG * EXP( XCOLEXSG*(ZZT(:)-XTT) ) & - *( ZLBDAS(:)**(XCXS-XBS) )*( ZLBDAG(:)**XCXG ) & - *( ZRHODREF(:)**(-XCEXVT-1.) ) & + *( ZRST(:)) )*( ZLBDAG(:)**XCXG ) & + *( ZRHODREF(:)**(-XCEXVT) ) & *( XLBSDRYG1/( ZLBDAG(:)**2 ) + & XLBSDRYG2/( ZLBDAG(:) * ZLBDAS(:) ) + & - XLBSDRYG3/( ZLBDAS(:)**2) ) ) + XLBSDRYG3/( ZLBDAS(:)**2) ) END WHERE DEALLOCATE(IVEC2) DEALLOCATE(IVEC1) @@ -1185,8 +1190,8 @@ IF( IHAIL>0 ) THEN ! WHERE( GWET(:) ) ZZW1(:,3) = MIN( ZRSS(:),XFSWETH*ZZW(:) & ! RSWETH - *( ZLBDAS(:)**(XCXS-XBS) )*( ZLBDAH(:)**XCXH ) & - *( ZRHODREF(:)**(-XCEXVT-1.) ) & + *( ZRST(:))*( ZLBDAH(:)**XCXH ) & + *( ZRHODREF(:)**(-XCEXVT) ) & *( XLBSWETH1/( ZLBDAH(:)**2 ) + & XLBSWETH2/( ZLBDAH(:) * ZLBDAS(:) ) + & XLBSWETH3/( ZLBDAS(:)**2) ) ) diff --git a/src/MNH/lima_notadjust.f90 b/src/MNH/lima_notadjust.f90 index 94ea1f4fdac0f3df7143f867cdd9e28740f8a5b6..48e97a2f32c15557758f71eddfe2c2f8517c9364 100644 --- a/src/MNH/lima_notadjust.f90 +++ b/src/MNH/lima_notadjust.f90 @@ -11,7 +11,7 @@ INTERFACE ! SUBROUTINE LIMA_NOTADJUST(KMI, TPFILE, HRAD, & PTSTEP, PRHODJ, PPABSM, PPABST, PRHODREF, PEXNREF, PZZ, & - PTHT,PRT, PSVT, PTHS, PRS,PSVS, PCLDFR, PSRCS ) + PTHT,PRT, PSVT, PTHS, PRS,PSVS, PCLDFR, PICEFR, PRAINFR, PSRCS ) ! USE MODD_IO, ONLY: TFILEDATA ! @@ -38,6 +38,8 @@ REAL, DIMENSION(:,:,:), INTENT(OUT) :: PSRCS ! Second-order flux ! s'rc'/2Sigma_s2 at time t+1 ! multiplied by Lambda_3 REAL, DIMENSION(:,:,:), INTENT(OUT) :: PCLDFR ! Cloud fraction +REAL, DIMENSION(:,:,:), INTENT(INOUT) :: PICEFR ! Cloud fraction +REAL, DIMENSION(:,:,:), INTENT(INOUT) :: PRAINFR ! Cloud fraction ! ! END SUBROUTINE LIMA_NOTADJUST @@ -49,7 +51,7 @@ END MODULE MODI_LIMA_NOTADJUST ! #################################################################################### SUBROUTINE LIMA_NOTADJUST(KMI, TPFILE, HRAD, & PTSTEP, PRHODJ, PPABSM, PPABST, PRHODREF, PEXNREF, PZZ, & - PTHT,PRT, PSVT, PTHS, PRS,PSVS, PCLDFR, PSRCS ) + PTHT,PRT, PSVT, PTHS, PRS,PSVS, PCLDFR, PICEFR, PRAINFR, PSRCS ) ! #################################################################################### ! !!**** * - compute pseudo-prognostic of supersaturation according to Thouron @@ -126,6 +128,8 @@ REAL, DIMENSION(:,:,:), INTENT(OUT) :: PSRCS ! Second-order flux ! s'rc'/2Sigma_s2 at time t+1 ! multiplied by Lambda_3 REAL, DIMENSION(:,:,:), INTENT(OUT) :: PCLDFR ! Cloud fraction +REAL, DIMENSION(:,:,:), INTENT(INOUT) :: PICEFR ! Cloud fraction +REAL, DIMENSION(:,:,:), INTENT(INOUT) :: PRAINFR ! Cloud fraction ! ! !* 0.2 Declarations of local variables : @@ -447,9 +451,10 @@ GNUCT(:,:,:) = .FALSE. !GNUCT(IIB:IIE,IJB:IJE,IKB:IKE) = ZSAT(IIB:IIE,IJB:IJE,IKB:IKE)>0.0 .OR. & ! ZCCS(IIB:IIE,IJB:IJE,IKB:IKE)>0.0 !GNUCT(IIB:IIE,IJB:IJE,IKB:IKE) = ZSAT(IIB:IIE,IJB:IJE,IKB:IKE)>0.0 -GNUCT(IIB:IIE,IJB:IJE,IKB:IKE) = ZSAT(IIB:IIE,IJB:IJE,IKB:IKE)>0.0 .OR. & +GNUCT(IIB:IIE,IJB:IJE,IKB:IKE) = ZSAT(IIB:IIE,IJB:IJE,IKB:IKE)>-1.0 .AND. & + ( ZSAT(IIB:IIE,IJB:IJE,IKB:IKE)>0.0 .OR. & ! ZCCS(IIB:IIE,IJB:IJE,IKB:IKE)>1.E+05 - ZCCS(IIB:IIE,IJB:IJE,IKB:IKE)>XCTMIN(2) + ZCCS(IIB:IIE,IJB:IJE,IKB:IKE)>XCTMIN(2) ) INUCT = COUNTJV( GNUCT(:,:,:),I1(:),I2(:),I3(:)) !3D array to 1D array ! @@ -564,6 +569,23 @@ IF ( HRAD /= 'NONE' ) THEN PCLDFR(:,:,:) = ZW1(:,:,:) END IF ! +ZW1(:,:,:)=0. +IF (SIZE(PRS,4)>3) ZW1(:,:,:)=ZW1(:,:,:) + PRS(:,:,:,4) +WHERE (ZW1(:,:,:) > 1.E-15) + PICEFR(:,:,:) = 1. +ELSEWHERE + PICEFR(:,:,:) = 0. +ENDWHERE +ZW1(:,:,:)=0. +IF (SIZE(PRS,4)>2) ZW1(:,:,:)=ZW1(:,:,:) + PRS(:,:,:,3) +IF (SIZE(PRS,4)>4) ZW1(:,:,:)=ZW1(:,:,:) + PRS(:,:,:,5) +IF (SIZE(PRS,4)>5) ZW1(:,:,:)=ZW1(:,:,:) + PRS(:,:,:,6) +WHERE (ZW1(:,:,:) > 1.E-15) + PRAINFR(:,:,:) = 1. +ELSEWHERE + PRAINFR(:,:,:) = 0. +ENDWHERE +! IF ( tpfile%lopened ) THEN ZW(:,:,:)=SUM(ZNAS,4)-ZW(:,:,:) TZFIELD%CMNHNAME = 'NACT' diff --git a/src/MNH/lima_nucleation_procs.f90 b/src/MNH/lima_nucleation_procs.f90 index 122d4b3c867f2e98af5b9d6461a492df26a45e5e..f3f4e17fd057fde863f393e761a8f98265e1aae1 100644 --- a/src/MNH/lima_nucleation_procs.f90 +++ b/src/MNH/lima_nucleation_procs.f90 @@ -79,6 +79,7 @@ SUBROUTINE LIMA_NUCLEATION_PROCS (PTSTEP, TPFILE, PRHODJ, ! P. Wautelet 27/02/2020: add Z_TH_HINC variable (for budgets) ! P. Wautelet 02/2020: use the new data structures and subroutines for budgets ! B. Vie 03/03/2020: use DTHRAD instead of dT/dt in Smax diagnostic computation +! B. Vie 03/2022: Add option for 1-moment pristine ice !------------------------------------------------------------------------------- ! use modd_budget, only: lbu_enable, lbudget_th, lbudget_rv, lbudget_rc, lbudget_rr, & @@ -86,10 +87,11 @@ use modd_budget, only: lbu_enable, lbudget_th, lbudget_rv, lbudget_rc, lbudg NBUDGET_TH, NBUDGET_RV, NBUDGET_RC, NBUDGET_RI, NBUDGET_SV1, & tbudgets USE MODD_IO, ONLY: TFILEDATA +USE MODD_PARAMETERS, ONLY : JPHEXT, JPVEXT USE MODD_NSV, ONLY : NSV_LIMA_NC, NSV_LIMA_NR, NSV_LIMA_CCN_FREE, NSV_LIMA_CCN_ACTI, & NSV_LIMA_NI, NSV_LIMA_IFN_FREE, NSV_LIMA_IFN_NUCL, NSV_LIMA_IMM_NUCL, NSV_LIMA_HOM_HAZE USE MODD_PARAM_LIMA, ONLY : LCOLD, LNUCL, LMEYERS, LSNOW, LWARM, LACTI, LRAIN, LHHONI, & - NMOD_CCN, NMOD_IFN, NMOD_IMM, XCTMIN, XRTMIN, LSPRO + NMOD_CCN, NMOD_IFN, NMOD_IMM, XCTMIN, XRTMIN, LSPRO, NMOM_I USE MODD_TURB_n, ONLY : LSUBG_COND use mode_budget, only: Budget_store_add, Budget_store_init, Budget_store_end @@ -98,6 +100,7 @@ USE MODI_LIMA_CCN_ACTIVATION USE MODI_LIMA_CCN_HOM_FREEZING USE MODI_LIMA_MEYERS_NUCLEATION USE MODI_LIMA_PHILLIPS_IFN_NUCLEATION +USE MODE_RAIN_ICE_NUCLEATION ! !------------------------------------------------------------------------------- ! @@ -142,6 +145,7 @@ REAL, DIMENSION(:,:,:), INTENT(INOUT) :: PPRCFR ! Precipitation fraction !------------------------------------------------------------------------------- ! REAL, DIMENSION(SIZE(PT,1),SIZE(PT,2),SIZE(PT,3)) :: Z_TH_HIND, Z_RI_HIND, Z_CI_HIND, Z_TH_HINC, Z_RC_HINC, Z_CC_HINC +REAL, DIMENSION(SIZE(PT,1),SIZE(PT,2),SIZE(PT,3)) :: ZTHS, ZRIS, ZRVS, ZRHT, ZCIT, ZT ! integer :: idx INTEGER :: JL @@ -193,7 +197,7 @@ END IF ! !------------------------------------------------------------------------------- ! -IF ( LCOLD .AND. LNUCL .AND. .NOT.LMEYERS .AND. NMOD_IFN >= 1 ) THEN +IF ( LCOLD .AND. LNUCL .AND. NMOM_I>=2 .AND. .NOT.LMEYERS .AND. NMOD_IFN >= 1 ) THEN if ( lbu_enable ) then if ( lbudget_sv ) then do jl = 1, nmod_ifn @@ -257,7 +261,7 @@ END IF ! !------------------------------------------------------------------------------- ! -IF (LCOLD .AND. LNUCL .AND. LMEYERS) THEN +IF (LCOLD .AND. LNUCL .AND. NMOM_I>=2 .AND. LMEYERS) THEN CALL LIMA_MEYERS_NUCLEATION (PTSTEP, & PRHODREF, PEXNREF, PPABST, & PTHT, PRVT, PRCT, PRRT, PRIT, PRST, PRGT, & @@ -266,7 +270,56 @@ IF (LCOLD .AND. LNUCL .AND. LMEYERS) THEN Z_TH_HINC, Z_RC_HINC, Z_CC_HINC, & PICEFR ) WHERE(PICEFR(:,:,:)<1.E-10 .AND. PRIT(:,:,:)>XRTMIN(4) .AND. PCIT(:,:,:)>XCTMIN(4)) PICEFR(:,:,:)=1. + ! + if ( lbu_enable ) then + if ( lbudget_th ) call Budget_store_add( tbudgets(NBUDGET_TH), 'HIND', z_th_hind(:, :, :) * prhodj(:, :, :) / ptstep ) + if ( lbudget_rv ) call Budget_store_add( tbudgets(NBUDGET_RV), 'HIND', -z_ri_hind(:, :, :) * prhodj(:, :, :) / ptstep ) + if ( lbudget_ri ) call Budget_store_add( tbudgets(NBUDGET_RI), 'HIND', z_ri_hind(:, :, :) * prhodj(:, :, :) / ptstep ) + if ( lbudget_sv ) then + call Budget_store_add( tbudgets(NBUDGET_SV1 - 1 + nsv_lima_ni), 'HIND', z_ci_hind(:, :, :) * prhodj(:, :, :) / ptstep ) + if (nmod_ifn > 0 ) & + call Budget_store_add( tbudgets(NBUDGET_SV1 - 1 + nsv_lima_ifn_nucl), 'HIND', & + z_ci_hind(:, :, :) * prhodj(:, :, :) / ptstep ) + end if + + if ( lbudget_th ) call Budget_store_add( tbudgets(NBUDGET_TH), 'HINC', z_th_hinc(:, :, :) * prhodj(:, :, :) / ptstep ) + if ( lbudget_rc ) call Budget_store_add( tbudgets(NBUDGET_RC), 'HINC', z_rc_hinc(:, :, :) * prhodj(:, :, :) / ptstep ) + if ( lbudget_ri ) call Budget_store_add( tbudgets(NBUDGET_RI), 'HINC', -z_rc_hinc(:, :, :) * prhodj(:, :, :) / ptstep ) + if ( lbudget_sv ) then + call Budget_store_add( tbudgets(NBUDGET_SV1 - 1 + nsv_lima_nc), 'HINC', z_cc_hinc(:, :, :) * prhodj(:, :, :) / ptstep ) + call Budget_store_add( tbudgets(NBUDGET_SV1 - 1 + nsv_lima_ni), 'HINC', -z_cc_hinc(:, :, :) * prhodj(:, :, :) / ptstep ) + if (nmod_ifn > 0 ) & + call Budget_store_add( tbudgets(NBUDGET_SV1 - 1 + nsv_lima_ifn_nucl), 'HINC', & + -z_cc_hinc(:, :, :) * prhodj(:, :, :) / ptstep ) + end if + end if +END IF ! +!------------------------------------------------------------------------------- +! +IF (LCOLD .AND. LNUCL .AND. NMOM_I.EQ.1) THEN + WHERE(PICEFR(:,:,:)<1.E-10 .AND. PRIT(:,:,:)>XRTMIN(4) .AND. PCIT(:,:,:)>XCTMIN(4)) PICEFR(:,:,:)=1. + ! + ZTHS=PTHT/PTSTEP + ZRVS=PRVT/PTSTEP + ZRIS=PRIT/PTSTEP + ZRHT=0. + ZCIT=PCIT + ZT=PT + CALL RAIN_ICE_NUCLEATION(1+JPHEXT, SIZE(PT,1)-JPHEXT, 1+JPHEXT, SIZE(PT,2)-JPHEXT, 1+JPVEXT, SIZE(PT,3)-JPVEXT, 6, & + PTSTEP, PTHT, PPABST, PRHODJ, PRHODREF, PRVT, PRCT, PRRT, PRIT, PRST, PRGT, & + ZCIT, PEXNREF, ZTHS, ZRVS, ZRIS, ZT, ZRHT) + ! + Z_TH_HIND=ZTHS*PTSTEP-PTHT + Z_RI_HIND=ZRIS*PTSTEP-PRIT + Z_CI_HIND=ZCIT-PCIT + PCIT=ZCIT + PRIT=ZRIS*PTSTEP + PTHT=ZTHS*PTSTEP + Z_TH_HINC=0. + Z_RC_HINC=0. + Z_CC_HINC=0. + ! if ( lbu_enable ) then if ( lbudget_th ) call Budget_store_add( tbudgets(NBUDGET_TH), 'HIND', z_th_hind(:, :, :) * prhodj(:, :, :) / ptstep ) if ( lbudget_rv ) call Budget_store_add( tbudgets(NBUDGET_RV), 'HIND', -z_ri_hind(:, :, :) * prhodj(:, :, :) / ptstep ) diff --git a/src/MNH/lima_rain_accr_snow.f90 b/src/MNH/lima_rain_accr_snow.f90 index 01c31afbe3ff0152065142f33475281538a3c6ac..7c5c9bee51e37bc3c6d453f5a03b6fc07f3fa379 100644 --- a/src/MNH/lima_rain_accr_snow.f90 +++ b/src/MNH/lima_rain_accr_snow.f90 @@ -60,6 +60,7 @@ END MODULE MODI_LIMA_RAIN_ACCR_SNOW !! ------------- !! Original 15/03/2018 ! P. Wautelet 26/04/2019: replace non-standard FLOAT function by REAL function +! J. Wurtz 03/2022: new snow characteristics ! !------------------------------------------------------------------------------- ! @@ -68,7 +69,7 @@ END MODULE MODI_LIMA_RAIN_ACCR_SNOW ! USE MODD_CST, ONLY : XTT USE MODD_PARAM_LIMA, ONLY : XRTMIN, XCEXVT -USE MODD_PARAM_LIMA_COLD, ONLY : XBS, XCXS +USE MODD_PARAM_LIMA_COLD, ONLY : XBS, XCXS, XTRANS_MP_GAMMAS USE MODD_PARAM_LIMA_MIXED, ONLY : NACCLBDAS, XACCINTP1S, XACCINTP2S, & NACCLBDAR, XACCINTP1R, XACCINTP2R, & XKER_RACCSS, XKER_RACCS, XKER_SACCRG, & @@ -141,7 +142,7 @@ WHERE( GACC ) ! ! 1.3.1 select the (ZLBDAS,ZLBDAR) couplet ! - ZVEC1(:) = MAX(MIN(PLBDS(:),5.E5),5.E1) + ZVEC1(:) = MAX(MIN(PLBDS(:),5.E5*XTRANS_MP_GAMMAS),5.E1*XTRANS_MP_GAMMAS) ZVEC2(:) = PLBDR(:) ! ! 1.3.2 find the next lower indice for the ZLBDAS and for the ZLBDAR @@ -212,42 +213,28 @@ WHERE( GACC ) ! ! BVIE manque PCRT ??????????????????????????????????? ! ZZW4(:) = & !! coef of RRACCS and RRACCS - ZZW4(:) = PCRT(:) & !! coef of RRACCS and RRACCS - * XFRACCSS *( PLBDS(:)**XCXS )*( PRHODREF(:)**(-XCEXVT-1.) ) & - *( XLBRACCS1/( PLBDS(:)**2 ) + & - XLBRACCS2/( PLBDS(:) * PLBDR(:) ) + & - XLBRACCS3/( PLBDR(:)**2 ) ) / PLBDR(:)**3 + ZZW4(:) = PCRT(:) & !! coef of RRACCS and RRACCS + * XFRACCSS *( PRST(:)*PLBDS(:)**XBS )*( PRHODREF(:)**(-XCEXVT) ) & + *( XLBRACCS1/( PLBDS(:)**2 ) + & + XLBRACCS2/( PLBDS(:) * PLBDR(:) ) + & + XLBRACCS3/( PLBDR(:)**2 ) ) / PLBDR(:)**3 -! ZRRS(:) = ZRRS(:) - ZZW1(:,4) -! ZRSS(:) = ZRSS(:) + ZZW1(:,4) -! ZTHS(:) = ZTHS(:) + ZZW1(:,4)*(ZLSFACT(:)-ZLVFACT(:)) ! f(L_f*(RRACCSS)) -! -! ZCRS(:) = MAX( ZCRS(:)-ZZW1(:,4)*(ZCRT(:)/ZRRT(:)),0.0 ) ! Lambda_r**3 ! ! 1.3.6 raindrop accretion-conversion of the large sized aggregates ! into graupeln ! - ZZW5(:) = XFSACCRG*ZZW3(:) * & ! RSACCRG - ( PLBDS(:)**(XCXS-XBS) )*( PRHODREF(:)**(-XCEXVT-1.) ) & - *( XLBSACCR1/((PLBDR(:)**2) ) + & - XLBSACCR2/( PLBDR(:) * PLBDS(:) ) + & - XLBSACCR3/( (PLBDS(:)**2)) ) - ! -! P_RR_ACC(:) = - ZZW4(:) * ZZW1(:) ! RRACCSS -! P_CR_ACC(:) = P_RR_ACC(:) * PCRT(:)/PRRT(:) ! Lambda_r**3 -! P_RS_ACC(:) = - P_RR_ACC(:) - ! -! P_RR_ACC(:) = P_RR_ACC(:) - ( ZZW2(:)-P_RS_ACC(:) ) -! P_CR_ACC(:) = P_CR_ACC(:) - ( ZZW2(:)-P_RS_ACC(:) ) * PCRT(:)/PRRT(:) ! Lambda_r**3 -! P_RS_ACC(:) = P_RS_ACC(:) - ZZW5(:) -! P_RG_ACC(:) = ( ZZW2(:)-P_RS_ACC(:) ) + ZZW5(:) - ! + ZZW5(:) = XFSACCRG*ZZW3(:) * & ! RSACCRG + ( PRST(:) )*( PRHODREF(:)**(-XCEXVT) ) & + *( XLBSACCR1/( PLBDR(:)**2 ) + & + XLBSACCR2/( PLBDR(:) * PLBDS(:) ) + & + XLBSACCR3/( PLBDS(:)**2 ) ) +! P_RR_ACC(:) = - ZZW4(:) * ZZW2(:) P_CR_ACC(:) = P_RR_ACC(:) * PCRT(:)/PRRT(:) P_RS_ACC(:) = ZZW4(:) * ZZW1(:) - ZZW5(:) P_RG_ACC(:) = ZZW4(:) * ( ZZW2(:) - ZZW1(:) ) + ZZW5(:) P_TH_ACC(:) = - P_RR_ACC(:) * (PLSFACT(:)-PLVFACT(:)) - ! +! END WHERE ! ! diff --git a/src/MNH/lima_rain_evaporation.f90 b/src/MNH/lima_rain_evaporation.f90 index 2970e027d0ae5d8b380a0c9348ddc7de249fe049..f4c0df7d033880a071937fc0c696bacc2899879a 100644 --- a/src/MNH/lima_rain_evaporation.f90 +++ b/src/MNH/lima_rain_evaporation.f90 @@ -10,8 +10,8 @@ INTERFACE SUBROUTINE LIMA_RAIN_EVAPORATION (PTSTEP, LDCOMPUTE, & PRHODREF, PT, PLV, PLVFACT, PEVSAT, PRVSAT, & - PRVT, PRCT, PRRT, PLBDR, & - P_TH_EVAP, P_RR_EVAP, & + PRVT, PRCT, PRRT, PCRT, PLBDR, & + P_TH_EVAP, P_RR_EVAP, P_CR_EVAP, & PEVAP3D ) ! REAL, INTENT(IN) :: PTSTEP ! Time step @@ -27,10 +27,12 @@ REAL, DIMENSION(:), INTENT(IN) :: PRVSAT ! REAL, DIMENSION(:), INTENT(IN) :: PRVT ! Water vapor m.r. at t REAL, DIMENSION(:), INTENT(IN) :: PRCT ! Cloud water m.r. at t REAL, DIMENSION(:), INTENT(IN) :: PRRT ! Rain water m.r. at t +REAL, DIMENSION(:), INTENT(IN) :: PCRT ! Rain water conc at t REAL, DIMENSION(:), INTENT(IN) :: PLBDR ! Lambda(rain) ! REAL, DIMENSION(:), INTENT(OUT) :: P_TH_EVAP REAL, DIMENSION(:), INTENT(OUT) :: P_RR_EVAP +REAL, DIMENSION(:), INTENT(OUT) :: P_CR_EVAP ! REAL, DIMENSION(:), INTENT(INOUT) :: PEVAP3D ! Rain evap profile ! @@ -40,8 +42,8 @@ END MODULE MODI_LIMA_RAIN_EVAPORATION ! ############################################################################### SUBROUTINE LIMA_RAIN_EVAPORATION (PTSTEP, LDCOMPUTE, & PRHODREF, PT, PLV, PLVFACT, PEVSAT, PRVSAT, & - PRVT, PRCT, PRRT, PLBDR, & - P_TH_EVAP, P_RR_EVAP, & + PRVT, PRCT, PRRT, PCRT, PLBDR, & + P_TH_EVAP, P_RR_EVAP, P_CR_EVAP, & PEVAP3D ) ! ############################################################################### ! @@ -63,14 +65,15 @@ END MODULE MODI_LIMA_RAIN_EVAPORATION !! ------------- !! Original 15/03/2018 !! +! Delbeke/Vie 03/2022 : KHKO option !------------------------------------------------------------------------------- ! !* 0. DECLARATIONS ! ------------ ! -USE MODD_CST, ONLY : XRHOLW, XRV -USE MODD_PARAM_LIMA, ONLY : XRTMIN -USE MODD_PARAM_LIMA_WARM, ONLY : X0EVAR, XEX0EVAR, X1EVAR, XEX2EVAR, XEX1EVAR, XTHCO, XDIVA +USE MODD_CST, ONLY : XRHOLW, XRV, XPI +USE MODD_PARAM_LIMA, ONLY : XRTMIN, XCTMIN, LKHKO +USE MODD_PARAM_LIMA_WARM, ONLY : X0EVAR, XEX0EVAR, X1EVAR, XEX2EVAR, XEX1EVAR, XTHCO, XDIVA, XCEVAP ! IMPLICIT NONE ! @@ -89,10 +92,12 @@ REAL, DIMENSION(:), INTENT(IN) :: PRVSAT ! REAL, DIMENSION(:), INTENT(IN) :: PRVT ! Water vapor m.r. at t REAL, DIMENSION(:), INTENT(IN) :: PRCT ! Cloud water m.r. at t REAL, DIMENSION(:), INTENT(IN) :: PRRT ! Rain water m.r. at t -REAL, DIMENSION(:), INTENT(IN) :: PLBDR ! Lambda(rain) +REAL, DIMENSION(:), INTENT(IN) :: PCRT ! Rain water conc at t +REAL, DIMENSION(:), INTENT(IN) :: PLBDR ! Lambda(rain) ! REAL, DIMENSION(:), INTENT(OUT) :: P_TH_EVAP REAL, DIMENSION(:), INTENT(OUT) :: P_RR_EVAP +REAL, DIMENSION(:), INTENT(OUT) :: P_CR_EVAP ! REAL, DIMENSION(:), INTENT(INOUT) :: PEVAP3D ! Rain evap profile ! @@ -110,40 +115,57 @@ REAL, DIMENSION(SIZE(PRHODREF)) :: ZZW1, ZZW2 ! P_TH_EVAP(:) = 0. P_RR_EVAP(:) = 0. +P_CR_EVAP(:) = 0. +! +ZZW1(:) = 0. +ZZW2(:) = 0. ! GEVAP(:) = .FALSE. GEVAP(:) = LDCOMPUTE(:) .AND. & PRRT(:)>XRTMIN(3) .AND. & - PRVT(:)<PRVSAT(:) -! -WHERE ( GEVAP ) -! -!------------------------------------------------------------------------------- + PRVT(:)<PRVSAT(:) .AND. & + PCRT(:)>XCTMIN(3) ! ! -!* 2. compute the evaporation of rain drops -! ---------------------------------------- ! +IF (LKHKO) THEN + + ZZW1(:) = MAX((1.0 - PRVT(:)/ZZW1(:)),0.0) ! Subsaturation + + ZZW2(:) = 1. / ( XRHOLW*((((PLV(:)/PT(:))**2)/(XTHCO*XRV)) + & ! G + (XRV*PT(:))/(XDIVA*PEVSAT(:)))) + + ZZW2(:) = 3.0 * XCEVAP * ZZW2(:) * (4.*XPI*XRHOLW/(3.))**(2./3.) * & + (PRRT(:))**(1./3.) * (PCRT(:))**(2./3.) * ZZW1(:) + P_RR_EVAP(:) = - ZZW2(:) + + ZZW2(:) = ZZW2(:) * PCRT(:)/PRRT(:) + P_CR_EVAP = - ZZW2(:) + +ELSE + + WHERE ( GEVAP ) ! - ZZW1(:) = MAX((1.0 - PRVT(:)/PRVSAT(:)),0.0) ! Subsaturation + ZZW1(:) = MAX((1.0 - PRVT(:)/PRVSAT(:)),0.0) ! Subsaturation ! ! Compute the function G(T) ! - ZZW2(:) = 1. / ( XRHOLW*((((PLV(:)/PT(:))**2)/(XTHCO*XRV)) + & ! G - (XRV*PT(:))/(XDIVA*PEVSAT(:)))) + ZZW2(:) = 1. / ( XRHOLW*((((PLV(:)/PT(:))**2)/(XTHCO*XRV)) + & ! G + (XRV*PT(:))/(XDIVA*PEVSAT(:)))) ! ! Compute the evaporation tendency ! - ZZW2(:) = ZZW2(:) * ZZW1(:) * PRRT(:) * & - (X0EVAR * PLBDR(:)**XEX0EVAR + X1EVAR * PRHODREF(:)**XEX2EVAR * PLBDR(:)**XEX1EVAR) - ZZW2(:) = MAX(ZZW2(:),0.0) + ZZW2(:) = ZZW2(:) * ZZW1(:) * PRRT(:) * & + (X0EVAR * PLBDR(:)**XEX0EVAR + X1EVAR * PRHODREF(:)**XEX2EVAR * PLBDR(:)**XEX1EVAR) + ZZW2(:) = MAX(ZZW2(:),0.0) ! - P_RR_EVAP(:) = - ZZW2(:) + P_RR_EVAP(:) = - ZZW2(:) ! P_TH_EVAP(:) = P_RR_EVAP(:) * PLVFACT(:) ! PEVAP3D(:) = - P_RR_EVAP(:) ! -END WHERE + END WHERE ! +END IF !----------------------------------------------------------------------------- ! END SUBROUTINE LIMA_RAIN_EVAPORATION diff --git a/src/MNH/lima_sedimentation.f90 b/src/MNH/lima_sedimentation.f90 index 365ae0f23362e17a84e8f9ab1682d8dc165f38dd..8d48b776d8a46279ab4b6fd8268068faf0411f5e 100644 --- a/src/MNH/lima_sedimentation.f90 +++ b/src/MNH/lima_sedimentation.f90 @@ -66,6 +66,7 @@ END MODULE MODI_LIMA_SEDIMENTATION ! P. Wautelet 26/04/2019: replace non-standard FLOAT function by REAL function ! P. Wautelet 28/05/2019: move COUNTJV function to tools.f90 ! B. Vie 03/2020: disable temperature change of droplets by air temperature +! J. Wurtz 03/2022: new snow characteristics !------------------------------------------------------------------------------- ! !* 0. DECLARATIONS @@ -73,10 +74,11 @@ END MODULE MODI_LIMA_SEDIMENTATION ! USE MODD_CST, ONLY: XRHOLW, XCL, XCI USE MODD_PARAMETERS, ONLY: JPHEXT, JPVEXT -USE MODD_PARAM_LIMA, ONLY: XCEXVT, XRTMIN, XCTMIN, NSPLITSED, & - XLB, XLBEX, XD, XFSEDR, XFSEDC, & - XALPHAC, XNUC -USE MODD_PARAM_LIMA_COLD, ONLY: XLBEXI, XLBI, XDI +USE MODD_PARAM_LIMA, ONLY: XCEXVT, XRTMIN, XCTMIN, NSPLITSED, & + XLB, XLBEX, XD, XFSEDR, XFSEDC, & + XALPHAC, XNUC, XALPHAS, XNUS, LSNOW_T +USE MODD_PARAM_LIMA_COLD, ONLY: XLBEXI, XLBI, XDI, XLBDAS_MAX, XBS, XEXSEDS, & + XLBDAS_MIN, XTRANS_MP_GAMMAS, XFVELOS use mode_tools, only: Countjv @@ -183,11 +185,24 @@ DO JN = 1 , NSPLITSED(KID) IF (KMOMENTS==2) ZCS(JL) = PCS(I1(JL),I2(JL),I3(JL)) END DO ! - IF (KMOMENTS==1) ZLBDA(:) = XLB(KID) * ( ZRHODREF(:) * ZRS(:) )**XLBEX(KID) - IF (KMOMENTS==2) ZLBDA(:) = ( XLB(KID)*ZCS(:) / ZRS(:) )**XLBEX(KID) + IF (KID == 5 .AND. LSNOW_T) THEN + ZLBDA(:) = 1.E10 + WHERE(ZT(:)>263.15 .AND. ZRS(:)>XRTMIN(5)) + ZLBDA(:) = MAX(MIN(XLBDAS_MAX, 10**(14.554-0.0423*ZT(:))),XLBDAS_MIN) + END WHERE + WHERE(ZT(:)<=263.15 .AND. ZRS(:)>XRTMIN(5)) + ZLBDA(:) = MAX(MIN(XLBDAS_MAX, 10**(6.226-0.0106*ZT(:))),XLBDAS_MIN) + END WHERE + ZLBDA(:) = ZLBDA(:)*XTRANS_MP_GAMMAS + ZZW(:) = XFSEDR(KID) * ZRHODREF(:)**(1.-XCEXVT)*ZRS(:)* & + (1 + (XFVELOS/ZLBDA(:))**XALPHAS)**(-XNUS+XEXSEDS/XALPHAS) * ZLBDA(:)**(XBS+XEXSEDS) + ELSE + IF (KMOMENTS==1) ZLBDA(:) = XLB(KID) * ( ZRHODREF(:) * ZRS(:) )**XLBEX(KID) + IF (KMOMENTS==2) ZLBDA(:) = ( XLB(KID)*ZCS(:) / ZRS(:) )**XLBEX(KID) + ZZY(:) = ZRHODREF(:)**(-XCEXVT) * ZLBDA(:)**(-XD(KID)) + ZZW(:) = XFSEDR(KID) * ZRS(:) * ZZY(:) * ZRHODREF(:) + END IF ! Wurtz ! - ZZY(:) = ZRHODREF(:)**(-XCEXVT) * ZLBDA(:)**(-XD(KID)) - ZZW(:) = XFSEDR(KID) * ZRS(:) * ZZY(:) * ZRHODREF(:) IF (KMOMENTS==2) ZZX(:) = XFSEDC(KID) * ZCS(:) * ZZY(:) * ZRHODREF(:) IF (KID==2) THEN diff --git a/src/MNH/lima_snow_deposition.f90 b/src/MNH/lima_snow_deposition.f90 index 697f9ee74f5f9101579f9724421e76ee6f93d614..fa96aa705626479d4728dc83192533296bf470a9 100644 --- a/src/MNH/lima_snow_deposition.f90 +++ b/src/MNH/lima_snow_deposition.f90 @@ -63,20 +63,22 @@ SUBROUTINE LIMA_SNOW_DEPOSITION (LDCOMPUTE, & !! ------------- !! Original 15/03/2018 !! +! J. Wurtz 03/2022: new snow characteristics +! B. Vie 03/2022: Add option for 1-moment pristine ice !------------------------------------------------------------------------------- ! !* 0. DECLARATIONS ! ------------ ! -USE MODD_PARAM_LIMA, ONLY : XRTMIN, XCTMIN, XALPHAI, XALPHAS, XNUI, XNUS -USE MODD_PARAM_LIMA_COLD, ONLY : XCXS, XCCS, & +USE MODD_PARAM_LIMA, ONLY : XRTMIN, XCTMIN, XALPHAI, XALPHAS, XNUI, XNUS, NMOM_I +USE MODD_PARAM_LIMA_COLD, ONLY : XCXS, XCCS,XLBS,XBS, & XLBDAS_MAX, XDSCNVI_LIM, XLBDASCNVI_MAX, & XC0DEPSI, XC1DEPSI, XR0DEPSI, XR1DEPSI, & XSCFAC, X1DEPS, X0DEPS, XEX1DEPS, XEX0DEPS, & XDICNVS_LIM, XLBDAICNVS_LIM, & XC0DEPIS, XC1DEPIS, XR0DEPIS, XR1DEPIS, & XCOLEXIS, XAGGS_CLARGE1, XAGGS_CLARGE2, & - XAGGS_RLARGE1, XAGGS_RLARGE2 + XAGGS_RLARGE1, XAGGS_RLARGE2, XFVELOS ! IMPLICIT NONE @@ -113,51 +115,62 @@ P_CI_CNVI(:) = 0. P_TH_DEPS(:) = 0. P_RS_DEPS(:) = 0. ! -! Physical limitations -! -! ! Looking for regions where computations are necessary -! GMICRO(:) = LDCOMPUTE(:) .AND. PRST(:)>XRTMIN(5) ! +IF (NMOM_I.EQ.1) THEN + WHERE( GMICRO ) ! -WHERE( GMICRO ) +! Deposition of water vapor on r_s: RVDEPS +! + ZZW(:) = 0.0 + WHERE ( (PRST(:)>XRTMIN(5)) ) + ZZW(:) = ( PSSI(:)/(PAI(:)*PRHODREF(:)) ) * & + ( X0DEPS*PLBDS(:)**XEX0DEPS + X1DEPS*PCJ(:)*PLBDS(:)**XEX1DEPS ) + ZZW(:) = ZZW(:)*(0.5+SIGN(0.5,ZZW(:))) - ABS(ZZW(:))*(0.5-SIGN(0.5,ZZW(:))) + END WHERE + P_RS_DEPS(:) = ZZW(:) + END WHERE +ELSE + WHERE( GMICRO ) ! !* 2.1 Conversion of snow to r_i: RSCNVI ! ---------------------------------------- ! ! - ZZW2(:) = 0.0 - ZZW(:) = 0.0 - WHERE ( PLBDS(:)<XLBDASCNVI_MAX .AND. (PRST(:)>XRTMIN(5)) & - .AND. (PSSI(:)<0.0) ) - ZZW(:) = (PLBDS(:)*XDSCNVI_LIM)**(XALPHAS) - ZZX(:) = ( -PSSI(:)/PAI(:) ) * (XCCS*PLBDS(:)**XCXS) * (ZZW(:)**XNUS) * EXP(-ZZW(:)) + ZZW2(:) = 0.0 + ZZW(:) = 0.0 + WHERE ( PLBDS(:)<XLBDASCNVI_MAX .AND. (PRST(:)>XRTMIN(5)) & + .AND. (PSSI(:)<0.0) ) + ZZW(:) = (PLBDS(:)*XDSCNVI_LIM)**(XALPHAS) + ZZX(:) = ( -PSSI(:)/PAI(:) ) * (XLBS*PRST(:)*PLBDS(:)**XBS) * (ZZW(:)**XNUS) * EXP(-ZZW(:)) ! - ZZW(:) = ( XR0DEPSI+XR1DEPSI*PCJ(:) )*ZZX(:) + ZZW(:) = ( XR0DEPSI+XR1DEPSI*PCJ(:) )*ZZX(:) ! - ZZW2(:) = ZZW(:)*( XC0DEPSI+XC1DEPSI*PCJ(:) )/( XR0DEPSI+XR1DEPSI*PCJ(:) ) - END WHERE + ZZW2(:) = ZZW(:)*( XC0DEPSI+XC1DEPSI*PCJ(:) )/( XR0DEPSI+XR1DEPSI*PCJ(:) ) + END WHERE ! - P_RI_CNVI(:) = ZZW(:) - P_CI_CNVI(:) = ZZW2(:) + P_RI_CNVI(:) = ZZW(:) + P_CI_CNVI(:) = ZZW2(:) ! ! !* 2.2 Deposition of water vapor on r_s: RVDEPS ! ----------------------------------------------- ! ! - ZZW(:) = 0.0 - WHERE ( (PRST(:)>XRTMIN(5)) ) - ZZW(:) = ( PSSI(:)/(PAI(:)) ) * & - ( X0DEPS*PLBDS(:)**XEX0DEPS + X1DEPS*PCJ(:)*PLBDS(:)**XEX1DEPS ) - ZZW(:) = ZZW(:)*(0.5+SIGN(0.5,ZZW(:))) - ABS(ZZW(:))*(0.5-SIGN(0.5,ZZW(:))) - END WHERE + ZZW(:) = 0.0 + WHERE ( (PRST(:)>XRTMIN(5)) ) + ZZW(:) = ( PRST(:)*PSSI(:)/(PAI(:)) ) * & + ( X0DEPS*PLBDS(:)**XEX0DEPS + & + ( X1DEPS*PCJ(:)*(PLBDS(:))**(XBS+XEX1DEPS) * & + (1+(XFVELOS/(2.*PLBDS))**XALPHAS)**(-XNUS+XEX1DEPS/XALPHAS)) ) + ZZW(:) = ZZW(:)*(0.5+SIGN(0.5,ZZW(:))) - ABS(ZZW(:))*(0.5-SIGN(0.5,ZZW(:))) + END WHERE ! - P_RS_DEPS(:) = ZZW(:) + P_RS_DEPS(:) = ZZW(:) !!$ P_TH_DEPS(:) = P_RS_DEPS(:) * PLSFACT(:) ! -END WHERE -! + END WHERE +END IF ! END SUBROUTINE LIMA_SNOW_DEPOSITION diff --git a/src/MNH/lima_tendencies.f90 b/src/MNH/lima_tendencies.f90 index bd98d503c551fc74862ea85aeb1a80795beea2ce..0fce8cb11722c47e66789b940aa8d64127712cc8 100644 --- a/src/MNH/lima_tendencies.f90 +++ b/src/MNH/lima_tendencies.f90 @@ -16,7 +16,7 @@ MODULE MODI_LIMA_TENDENCIES P_RC_AUTO, P_CC_AUTO, P_CR_AUTO, & P_RC_ACCR, P_CC_ACCR, & P_CR_SCBU, & - P_TH_EVAP, P_RR_EVAP, & + P_TH_EVAP, P_RR_EVAP, P_CR_EVAP, & P_RI_CNVI, P_CI_CNVI, & P_TH_DEPS, P_RS_DEPS, & P_TH_DEPI, P_RI_DEPI, & @@ -80,7 +80,8 @@ REAL, DIMENSION(:), INTENT(INOUT) :: P_CC_ACCR ! accretion of droplets by rain REAL, DIMENSION(:), INTENT(INOUT) :: P_CR_SCBU ! self collectio break up of drops (SCBU) : Nr ! REAL, DIMENSION(:), INTENT(INOUT) :: P_TH_EVAP -REAL, DIMENSION(:), INTENT(INOUT) :: P_RR_EVAP ! evaporation of rain drops (EVAP) : rr, rv=-rr +REAL, DIMENSION(:), INTENT(INOUT) :: P_RR_EVAP +REAL, DIMENSION(:), INTENT(INOUT) :: P_CR_EVAP ! evaporation of rain drops (EVAP) : rr, Nr, rv=-rr ! REAL, DIMENSION(:), INTENT(INOUT) :: P_RI_CNVI REAL, DIMENSION(:), INTENT(INOUT) :: P_CI_CNVI ! conversion snow -> ice (CNVI) : ri, Ni, rs=-ri @@ -189,7 +190,7 @@ SUBROUTINE LIMA_TENDENCIES (PTSTEP, LDCOMPUTE, P_RC_AUTO, P_CC_AUTO, P_CR_AUTO, & P_RC_ACCR, P_CC_ACCR, & P_CR_SCBU, & - P_TH_EVAP, P_RR_EVAP, & + P_TH_EVAP, P_RR_EVAP, P_CR_EVAP, & P_RI_CNVI, P_CI_CNVI, & P_TH_DEPS, P_RS_DEPS, & P_TH_DEPI, P_RI_DEPI, & @@ -231,6 +232,9 @@ SUBROUTINE LIMA_TENDENCIES (PTSTEP, LDCOMPUTE, !! ------------- !! Original 15/03/2018 !! +! Delbeke/Vie 03/2022 : KHKO option +! J. Wurtz 03/2022 : new snow characteristics +! B. Vie 03/2022: Add option for 1-moment pristine ice !------------------------------------------------------------------------------- ! !* 0. DECLARATIONS @@ -238,11 +242,12 @@ SUBROUTINE LIMA_TENDENCIES (PTSTEP, LDCOMPUTE, ! USE MODD_CST, ONLY : XP00, XRD, XRV, XMD, XMV, XCPD, XCPV, XCL, XCI, XLVTT, XLSTT, XTT, & XALPW, XBETAW, XGAMW, XALPI, XBETAI, XGAMI -USE MODD_PARAM_LIMA, ONLY : XRTMIN, XCTMIN, & - LCOLD, LNUCL, LSNOW, LHAIL, LWARM, LACTI, LRAIN +USE MODD_PARAM_LIMA, ONLY : XRTMIN, XCTMIN, XNUS, & + LCOLD, LNUCL, LSNOW, LHAIL, LWARM, LACTI, LRAIN, LKHKO, LSNOW_T, NMOM_I USE MODD_PARAM_LIMA_WARM, ONLY : XLBC, XLBEXC, XLBR, XLBEXR USE MODD_PARAM_LIMA_MIXED, ONLY : XLBG, XLBEXG, XLBH, XLBEXH, XLBDAG_MAX -USE MODD_PARAM_LIMA_COLD, ONLY : XSCFAC, XLBI, XLBEXI, XLBS, XLBEXS, XLBDAS_MAX +USE MODD_PARAM_LIMA_COLD, ONLY : XSCFAC, XLBI, XLBEXI, XLBS, XLBEXS, XLBDAS_MAX, XTRANS_MP_GAMMAS, & + XFVELOS, XLBDAS_MIN ! USE MODI_LIMA_DROPLETS_HOM_FREEZING USE MODI_LIMA_DROPLETS_SELF_COLLECTION @@ -260,6 +265,8 @@ USE MODI_LIMA_CONVERSION_MELTING_SNOW USE MODI_LIMA_RAIN_FREEZING USE MODI_LIMA_GRAUPEL ! +USE MODI_LIMA_BERGERON +! IMPLICIT NONE ! !* 0.1 Declarations of dummy arguments : @@ -300,7 +307,8 @@ REAL, DIMENSION(:), INTENT(INOUT) :: P_CC_ACCR ! accretion of droplets by rain REAL, DIMENSION(:), INTENT(INOUT) :: P_CR_SCBU ! self collectio break up of drops (SCBU) : Nr ! REAL, DIMENSION(:), INTENT(INOUT) :: P_TH_EVAP -REAL, DIMENSION(:), INTENT(INOUT) :: P_RR_EVAP ! evaporation of rain drops (EVAP) : rr, rv=-rr +REAL, DIMENSION(:), INTENT(INOUT) :: P_RR_EVAP +REAL, DIMENSION(:), INTENT(INOUT) :: P_CR_EVAP ! evaporation of rain drops (EVAP) : rr, Nr, rv=-rr ! REAL, DIMENSION(:), INTENT(INOUT) :: P_RI_CNVI REAL, DIMENSION(:), INTENT(INOUT) :: P_CI_CNVI ! conversion snow -> ice (CNVI) : ri, Ni, rs=-ri @@ -502,9 +510,21 @@ WHERE (PRIT(:)>XRTMIN(4) .AND. PCIT(:)>XCTMIN(4) .AND. LDCOMPUTE(:)) ZLBDI(:) = ( XLBI*PCIT(:) / PRIT(:) )**XLBEXI END WHERE ZLBDS(:) = 1.E10 -WHERE (PRST(:)>XRTMIN(5) .AND. LDCOMPUTE(:) ) - ZLBDS(:) = XLBS*( PRHODREF(:)*PRST(:) )**XLBEXS -END WHERE +IF (LSNOW_T) THEN + WHERE (PRST(:)>XRTMIN(5) .AND. LDCOMPUTE(:) ) + WHERE(ZT(:)>263.15) + ZLBDS(:) = MAX(MIN(XLBDAS_MAX, 10**(14.554-0.0423*ZT(:))),XLBDAS_MIN) + END WHERE + WHERE(ZT(:)<=263.15) + ZLBDS(:) = MAX(MIN(XLBDAS_MAX, 10**(6.226-0.0106*ZT(:))),XLBDAS_MIN) + END WHERE + END WHERE + ZLBDS(:) = ZLBDS(:) * XTRANS_MP_GAMMAS +ELSE + WHERE (PRST(:)>XRTMIN(5) .AND. LDCOMPUTE(:) ) + ZLBDS(:) = XLBS*( PRHODREF(:)*PRST(:) )**XLBEXS + END WHERE +END IF ZLBDG(:) = 1.E10 WHERE (PRGT(:)>XRTMIN(6) .AND. LDCOMPUTE(:) ) ZLBDG(:) = XLBG*( PRHODREF(:)*PRGT(:) )**XLBEXG @@ -525,7 +545,7 @@ IF (LCOLD .AND. LWARM) THEN PA_TH, PA_RC, PA_CC, PA_RI, PA_CI ) END IF ! -IF (LWARM .AND. LRAIN) THEN +IF (LWARM .AND. LRAIN .AND. (.NOT. LKHKO)) THEN CALL LIMA_DROPLETS_SELF_COLLECTION (LDCOMPUTE, & ! depends on CF PRHODREF, & PCCT/ZCF1D, ZLBDC3, & @@ -564,7 +584,7 @@ IF (LWARM .AND. LRAIN) THEN PA_RR(:) = PA_RR(:) - P_RC_ACCR(:) END IF ! -IF (LWARM .AND. LRAIN) THEN +IF (LWARM .AND. LRAIN .AND. (.NOT. LKHKO)) THEN CALL LIMA_DROPS_SELF_COLLECTION (LDCOMPUTE, & ! depends on PF PRHODREF, & PCRT/ZPF1D(:), ZLBDR, ZLBDR3, & @@ -576,18 +596,20 @@ IF (LWARM .AND. LRAIN) THEN END IF ! IF (LWARM .AND. LRAIN) THEN - CALL LIMA_RAIN_EVAPORATION (PTSTEP, LDCOMPUTE, & ! depends on PF > CF - PRHODREF, ZT, ZLV, ZLVFACT, ZEVSAT, ZRVSAT, & - PRVT, PRCT/ZPF1D, PRRT/ZPF1D, ZLBDR, & - P_TH_EVAP, P_RR_EVAP, & - PEVAP3D ) + CALL LIMA_RAIN_EVAPORATION (PTSTEP, LDCOMPUTE, & ! depends on PF > CF + PRHODREF, ZT, ZLV, ZLVFACT, ZEVSAT, ZRVSAT, & + PRVT, PRCT/ZPF1D, PRRT/ZPF1D, PCRT/ZPF1D, ZLBDR, & + P_TH_EVAP, P_RR_EVAP, P_CR_EVAP, & + PEVAP3D ) P_RR_EVAP(:) = P_RR_EVAP(:) * MAX((ZPF1D(:) - ZCF1D(:)),0.) + P_CR_EVAP(:) = P_RR_EVAP(:) * MAX((ZPF1D(:) - ZCF1D(:)),0.) P_TH_EVAP(:) = P_RR_EVAP(:) * ZLVFACT(:) PEVAP3D(:) = - P_RR_EVAP(:) ! PA_TH(:) = PA_TH(:) + P_TH_EVAP(:) PA_RV(:) = PA_RV(:) - P_RR_EVAP(:) PA_RR(:) = PA_RR(:) + P_RR_EVAP(:) + PA_CR(:) = PA_CR(:) + P_CR_EVAP(:) END IF ! IF (LCOLD) THEN @@ -595,7 +617,7 @@ IF (LCOLD) THEN ! Includes vapour deposition on ice, ice -> snow conversion ! CALL LIMA_ICE_DEPOSITION (PTSTEP, LDCOMPUTE, & ! depends on IF, PF - PRHODREF, ZSSI, ZAI, ZCJ, ZLSFACT, & + PRHODREF, ZT, ZSSI, ZAI, ZCJ, ZLSFACT, & PRIT/ZIF1D, PCIT/ZIF1D, ZLBDI, & P_TH_DEPI, P_RI_DEPI, & P_RI_CNVS, P_CI_CNVS ) @@ -639,7 +661,7 @@ END IF ! Lambda_s limited for collection processes to prevent too high concentrations ! must be changed or removed if C and x modified ! -ZLBDS(:) = MIN( XLBDAS_MAX, ZLBDS(:)) +!ZLBDS(:) = MIN( XLBDAS_MAX, ZLBDS(:)) ! ! IF (LCOLD .AND. LSNOW) THEN @@ -667,16 +689,18 @@ IF (LWARM .AND. LCOLD) THEN PA_TH(:) = PA_TH(:) + P_TH_DEPG(:) END IF ! -!!$IF (LWARM .AND. LCOLD) THEN -!!$ CALL LIMA_BERGERON (LDCOMPUTE, & ! depends on CF, IF -!!$ PRCT, PRIT, PCIT, ZLBDI, & -!!$ ZSSIW, ZAI, ZCJ, ZLVFACT, ZLSFACT, & -!!$ P_TH_BERFI, P_RC_BERFI, & -!!$ PA_TH, PA_RC, PA_RI ) -!!$END IF -P_TH_BERFI(:) = 0. -P_RC_BERFI(:) = 0. -! +IF (LWARM .AND. LCOLD .AND. NMOM_I.EQ.1) THEN + CALL LIMA_BERGERON (LDCOMPUTE, & ! depends on CF, IF + PRCT/ZCF1D, PRIT/ZIF1D, PCIT/ZIF1D, ZLBDI, & + ZSSIW, ZAI, ZCJ, ZLVFACT, ZLSFACT, & + P_TH_BERFI, P_RC_BERFI ) + P_TH_BERFI(:) = P_TH_BERFI(:) * MIN(ZCF1D,ZIF1D) + P_RC_BERFI(:) = P_RC_BERFI(:) * MIN(ZCF1D,ZIF1D) +! + PA_RC(:) = PA_RC(:) + P_RC_BERFI(:) + PA_RI(:) = PA_RI(:) - P_RC_BERFI(:) + PA_TH(:) = PA_TH(:) + P_TH_BERFI(:) +END IF ! IF (LWARM .AND. LCOLD .AND. LSNOW) THEN ! diff --git a/src/MNH/lima_warm_coal.f90 b/src/MNH/lima_warm_coal.f90 index 4ec69ac5823e786c1dc06b9149d655e772db9e40..66c83de670a5fe35ad95e050c64363f9d6dff4c1 100644 --- a/src/MNH/lima_warm_coal.f90 +++ b/src/MNH/lima_warm_coal.f90 @@ -98,12 +98,14 @@ END MODULE MODI_LIMA_WARM_COAL ! P. Wautelet 05/2016-04/2018: new data structures and calls for I/O ! P. Wautelet 28/05/2019: move COUNTJV function to tools.f90 ! P. Wautelet 02/2020: use the new data structures and subroutines for budgets (no more budget calls in this subroutine) +! Delbeke/Vie 03/2022 : KHKO option !------------------------------------------------------------------------------- ! !* 0. DECLARATIONS ! ------------ ! use modd_budget, only: lbudget_rc, lbudget_rr, lbudget_sv, NBUDGET_RC, NBUDGET_RR, NBUDGET_SV1, tbudgets +USE MODD_CST, ONLY: XPI, XRHOLW USE MODD_NSV, ONLY: NSV_LIMA_NC, NSV_LIMA_NR USE MODD_PARAMETERS, ONLY: JPHEXT, JPVEXT USE MODD_PARAM_LIMA @@ -252,7 +254,7 @@ IF (LRAIN) THEN GSELF(:) = ZCCT(:)>XCTMIN(2) ISELF = COUNT(GSELF(:)) - IF( ISELF>0 ) THEN + IF( ISELF>0 .AND. .NOT.LKHKO) THEN ZZW1(:) = XSELFC*(ZCCT(:)/ZLBDC3(:))**2 * ZRHODREF(:) ! analytical integration WHERE( GSELF(:) ) ZCCS(:) = ZCCS(:) - MIN( ZCCS(:),ZZW1(:) ) @@ -273,38 +275,54 @@ IF (LRAIN) THEN if ( lbudget_rc ) call Budget_store_init( tbudgets(NBUDGET_RC), 'AUTO', prcs(:, :, :) * prhodj(:, :, :) ) if ( lbudget_rr ) call Budget_store_init( tbudgets(NBUDGET_RR), 'AUTO', prrs(:, :, :) * prhodj(:, :, :) ) if ( lbudget_sv ) then - !call Budget_store_init( tbudgets(NBUDGET_SV1 - 1 + nsv_lima_nc), 'AUTO', pccs(:, :, :) * prhodj(:, :, :) ) + call Budget_store_init( tbudgets(NBUDGET_SV1 - 1 + nsv_lima_nc), 'AUTO', pccs(:, :, :) * prhodj(:, :, :) ) call Budget_store_init( tbudgets(NBUDGET_SV1 - 1 + nsv_lima_nr), 'AUTO', pcrs(:, :, :) * prhodj(:, :, :) ) end if ZZW2(:) = 0.0 ZZW1(:) = 0.0 - WHERE( ZRCT(:)>XRTMIN(2) ) - ZZW2(:) = MAX( 0.0,XLAUTR*ZRHODREF(:)*ZRCT(:)* & + IF (LKHKO) THEN + WHERE ( ZRCT(:) .GT. XRTMIN(2) .AND. ZCCT(:) .GT. XCTMIN(2) & + .AND. (ZRCS(:) .GT. 0.0) .AND. (ZCCS(:) .GT. 0.0)) +! + ZZW1(:)= 1350.0 * ZRCT(:)**(2.47) * (ZCCT(:)/1.0E6)**(-1.79) ! ZCCT in cm-3 + ZZW1(:) = min (ZRCS(:), ZZW1(:)) + ZRCS(:) = ZRCS(:) - ZZW1(:) + ZRRS(:) = ZRRS(:) + ZZW1(:) +! + ZCRS(:) = ZCRS(:) + ZZW1(:) * 3. * ZRHODREF(:)/(4.*XPI*XRHOLW*(XR0)**(3.)) +! + ZZW1(:) = min ( ZCCS(:),ZZW1(:) * ZCCT(:) / ZRCT(:)) + ZCCS(:) = ZCCS(:) - ZZW1(:) +! + END WHERE + ELSE + WHERE( ZRCT(:)>XRTMIN(2) ) + ZZW2(:) = MAX( 0.0,XLAUTR*ZRHODREF(:)*ZRCT(:)* & (XAUTO1/min(ZLBDC(:),1.e9)**4-XLAUTR_THRESHOLD) ) ! L ! - ZZW3(:) = MIN( ZRCS(:), MAX( 0.0,XITAUTR*ZZW2(:)*ZRCT(:)* & + ZZW3(:) = MIN( ZRCS(:), MAX( 0.0,XITAUTR*ZZW2(:)*ZRCT(:)* & (XAUTO2/ZLBDC(:)-XITAUTR_THRESHOLD) ) ) ! L/tau ! - ZRCS(:) = ZRCS(:) - ZZW3(:) - ZRRS(:) = ZRRS(:) + ZZW3(:) + ZRCS(:) = ZRCS(:) - ZZW3(:) + ZRRS(:) = ZRRS(:) + ZZW3(:) ! - ZZW1(:) = MIN( MIN( 1.2E4,(XACCR4/ZLBDC(:)-XACCR5)/XACCR3), & + ZZW1(:) = MIN( MIN( 1.2E4,(XACCR4/ZLBDC(:)-XACCR5)/XACCR3), & ZLBDR(:)/XACCR1 ) ! D**-1 threshold diameter for ! switching the autoconversion regimes ! min (80 microns, D_h, D_r) - ZZW3(:) = ZZW3(:) * MAX( 0.0,ZZW1(:) )**3 / XAC - ZCRS(:) = ZCRS(:) + ZZW3(:) - END WHERE - + ZZW3(:) = ZZW3(:) * MAX( 0.0,ZZW1(:) )**3 / XAC + ZCRS(:) = ZCRS(:) + ZZW3(:) + END WHERE + END IF if ( lbudget_rc ) call Budget_store_end( tbudgets(NBUDGET_RC), 'AUTO', & Unpack( zrcs(:), mask = gmicro(:, :, :), field = prcs(:, :, :) ) * prhodj(:, :, :) ) if ( lbudget_rr ) call Budget_store_end( tbudgets(NBUDGET_RR), 'AUTO', & Unpack( zrrs(:), mask = gmicro(:, :, :), field = prrs(:, :, :) ) * prhodj(:, :, :) ) if ( lbudget_sv ) then !This budget is = 0 for nsv_lima_nc => not necessary to call it (ZCCS is not modified in this part) - !call Budget_store_end( tbudgets(NBUDGET_SV1 - 1 + nsv_lima_nc), 'AUTO', & - ! Unpack( zccs(:), mask = gmicro(:, :, :), field = pccs(:, :, :) ) * prhodj(:, :, :) ) + call Budget_store_end( tbudgets(NBUDGET_SV1 - 1 + nsv_lima_nc), 'AUTO', & + Unpack( zccs(:), mask = gmicro(:, :, :), field = pccs(:, :, :) ) * prhodj(:, :, :) ) call Budget_store_end( tbudgets(NBUDGET_SV1 - 1 + nsv_lima_nr), 'AUTO', & Unpack( zcrs(:), mask = gmicro(:, :, :), field = pcrs(:, :, :) ) * prhodj(:, :, :) ) end if @@ -334,31 +352,45 @@ IF (LRAIN) THEN Unpack( zrrs(:), mask = gmicro(:, :, :), field = prrs(:, :, :) ) * prhodj(:, :, :) ) if ( lbudget_sv ) call Budget_store_init( tbudgets(NBUDGET_SV1 - 1 + nsv_lima_nc), 'ACCR', & Unpack( zccs(:), mask = gmicro(:, :, :), field = pccs(:, :, :) ) * prhodj(:, :, :) ) - WHERE( GACCR(:).AND.(ZZW4(:)>1.E-4) ) ! Accretion for D>100 10-6 m - ZZW3(:) = ZLBDC3(:) / ZLBDR3(:) - ZZW1(:) = ( ZCCT(:)*ZCRT(:) / ZLBDC3(:) )*ZRHODREF(:) - ZZW2(:) = MIN( ZZW1(:)*(XACCR_CLARGE1+XACCR_CLARGE2*ZZW3(:)),ZCCS(:) ) - ZCCS(:) = ZCCS(:) - ZZW2(:) -! - ZZW1(:) = ( ZZW1(:) / ZLBDC3(:) ) - ZZW2(:) = MIN( ZZW1(:)*(XACCR_RLARGE1+XACCR_RLARGE2*ZZW3(:)),ZRCS(:) ) - ZRCS(:) = ZRCS(:) - ZZW2(:) - ZRRS(:) = ZRRS(:) + ZZW2(:) - END WHERE - WHERE( GACCR(:).AND.(ZZW4(:)<=1.E-4) ) ! Accretion for D<100 10-6 m - ZZW3(:) = MIN(ZLBDC3(:) / ZLBDR3(:), 1.E8) - ZZW1(:) = ( ZCCT(:)*ZCRT(:) / ZLBDC3(:) )*ZRHODREF(:) - ZZW1(:) = ZZW1(:) / ZLBDC3(:) - ZZW3(:) = ZZW3(:)**2 - ZZW2(:) = MIN( ZZW1(:)*(XACCR_CSMALL1+XACCR_CSMALL2*ZZW3(:)),ZCCS(:) ) - ZCCS(:) = ZCCS(:) - ZZW2(:) -! - ZZW1(:) = ZZW1(:) / ZLBDC3(:) - ZZW2(:) = MIN( ZZW1(:)*(XACCR_RSMALL1+XACCR_RSMALL2*ZZW3(:)) & + IF (LKHKO) THEN + WHERE ( (ZRCT(:) .GT. XRTMIN(2)) .AND. (ZRRT(:) .GT. XRTMIN(3)) & + .AND. (ZRCS(:) .GT. 0.0) .AND. (ZCCS(:) .GT. 0.0)) + ZZW1(:) = 67.0 * ( ZRCT(:) * ZRRT(:) )**1.15 + ZZW1(:) = MIN (ZRCS(:),ZZW1(:)) + ZRCS(:) = ZRCS(:) - ZZW1(:) + ZRRS(:) = ZRRS(:) + ZZW1(:) +! + ZZW1(:) = MIN (ZCCS(:),ZZW1(:) * ZCCT(:) / ZRCT(:)) + ZCCS(:) = ZCCS(:) - ZZW1(:) +! + END WHERE + ELSE + WHERE( GACCR(:).AND.(ZZW4(:)>1.E-4) ) ! Accretion for D>100 10-6 m + ZZW3(:) = ZLBDC3(:) / ZLBDR3(:) + ZZW1(:) = ( ZCCT(:)*ZCRT(:) / ZLBDC3(:) )*ZRHODREF(:) + ZZW2(:) = MIN( ZZW1(:)*(XACCR_CLARGE1+XACCR_CLARGE2*ZZW3(:)),ZCCS(:) ) + ZCCS(:) = ZCCS(:) - ZZW2(:) +! + ZZW1(:) = ( ZZW1(:) / ZLBDC3(:) ) + ZZW2(:) = MIN( ZZW1(:)*(XACCR_RLARGE1+XACCR_RLARGE2*ZZW3(:)),ZRCS(:) ) + ZRCS(:) = ZRCS(:) - ZZW2(:) + ZRRS(:) = ZRRS(:) + ZZW2(:) + END WHERE + WHERE( GACCR(:).AND.(ZZW4(:)<=1.E-4) ) ! Accretion for D<100 10-6 m + ZZW3(:) = MIN(ZLBDC3(:) / ZLBDR3(:), 1.E8) + ZZW1(:) = ( ZCCT(:)*ZCRT(:) / ZLBDC3(:) )*ZRHODREF(:) + ZZW1(:) = ZZW1(:) / ZLBDC3(:) + ZZW3(:) = ZZW3(:)**2 + ZZW2(:) = MIN( ZZW1(:)*(XACCR_CSMALL1+XACCR_CSMALL2*ZZW3(:)),ZCCS(:) ) + ZCCS(:) = ZCCS(:) - ZZW2(:) +! + ZZW1(:) = ZZW1(:) / ZLBDC3(:) + ZZW2(:) = MIN( ZZW1(:)*(XACCR_RSMALL1+XACCR_RSMALL2*ZZW3(:)) & ,ZRCS(:) ) - ZRCS(:) = ZRCS(:) - ZZW2(:) - ZRRS(:) = ZRRS(:) + ZZW2(:) - END WHERE + ZRCS(:) = ZRCS(:) - ZZW2(:) + ZRRS(:) = ZRRS(:) + ZZW2(:) + END WHERE + END IF if ( lbudget_rc ) call Budget_store_end( tbudgets(NBUDGET_RC), 'ACCR', & Unpack( zrcs(:), mask = gmicro(:, :, :), field = prcs(:, :, :) ) * prhodj(:, :, :) ) @@ -380,7 +412,7 @@ IF (LRAIN) THEN ELSE ISCBU = 0.0 END IF - IF( ISCBU>0 ) THEN + IF( ISCBU>0 .AND. .NOT.LKHKO) THEN if ( lbudget_sv ) call Budget_store_init( tbudgets(NBUDGET_SV1 - 1 + nsv_lima_nr), 'SCBU', & Unpack( zcrs(:), mask = gmicro(:, :, :), field = pcrs(:, :, :) ) * prhodj(:, :, :) ) ! diff --git a/src/MNH/lima_warm_evap.f90 b/src/MNH/lima_warm_evap.f90 index 9a67a4b824bf150485226d9ad53037131418c1a9..e62660ecdb41c18ec7da4ac2c8d9110384f7bbbb 100644 --- a/src/MNH/lima_warm_evap.f90 +++ b/src/MNH/lima_warm_evap.f90 @@ -75,6 +75,7 @@ END MODULE MODI_LIMA_WARM_EVAP !! Original ??/??/13 !! Philippe Wautelet: 05/2016-04/2018: new data structures and calls for I/O ! P. Wautelet 28/05/2019: move COUNTJV function to tools.f90 +! Delbeke/Vie 03/2022 : KHKO option ! !------------------------------------------------------------------------------- ! @@ -137,6 +138,7 @@ REAL, DIMENSION(:) , ALLOCATABLE :: ZCRT ! rain conc. at t ! REAL, DIMENSION(:) , ALLOCATABLE :: ZRVS ! Water vapor m.r. source REAL, DIMENSION(:) , ALLOCATABLE :: ZRRS ! Rain water m.r. source +REAL, DIMENSION(:) , ALLOCATABLE :: ZCRS ! Rain water m.r. source REAL, DIMENSION(:) , ALLOCATABLE :: ZTHS ! Theta source ! ! Other packed variables @@ -151,7 +153,7 @@ REAL, DIMENSION(:), ALLOCATABLE :: ZZW1, ZZW2, ZZW3, & ZZLV ! Latent heat of vaporization at T ! REAL, DIMENSION(SIZE(PRHODREF,1),SIZE(PRHODREF,2),SIZE(PRHODREF,3)) & - :: ZW, ZW2, ZRVSAT, ZDR + :: ZW, ZW2, ZRVSAT, ZDR, ZLV ! ! REAL :: ZEPS, ZFACT @@ -179,11 +181,14 @@ ZCTMIN(:) = XCTMIN(:) / PTSTEP ZEPS= XMV / XMD ZRVSAT(:,:,:) = ZEPS / (PPABST(:,:,:) * & EXP(-XALPW+XBETAW/ZT(:,:,:)+XGAMW*ALOG(ZT(:,:,:))) - 1.0) - +ZLV(:,:,:) = XLVTT + (XCPV-XCL)*(ZT(:,:,:)-XTT) ! GEVAP(:,:,:) = .FALSE. GEVAP(IIB:IIE,IJB:IJE,IKB:IKE) = & - PRRS(IIB:IIE,IJB:IJE,IKB:IKE)>ZRTMIN(3) .AND. & + PRRS(IIB:IIE,IJB:IJE,IKB:IKE)>ZRTMIN(3) .AND. & + PCRS(IIB:IIE,IJB:IJE,IKB:IKE)>ZCTMIN(3) .AND. & + PRRT(IIB:IIE,IJB:IJE,IKB:IKE)>ZRTMIN(3) .AND. & + PCRT(IIB:IIE,IJB:IJE,IKB:IKE)>ZCTMIN(3) .AND. & PRVT(IIB:IIE,IJB:IJE,IKB:IKE)<ZRVSAT(IIB:IIE,IJB:IJE,IKB:IKE) ! IEVAP = COUNTJV( GEVAP(:,:,:),I1(:),I2(:),I3(:)) @@ -196,6 +201,7 @@ IF( IEVAP >= 1 ) THEN ! ALLOCATE(ZRVS(IEVAP)) ALLOCATE(ZRRS(IEVAP)) + ALLOCATE(ZCRS(IEVAP)) ALLOCATE(ZTHS(IEVAP)) ! ALLOCATE(ZLBDR(IEVAP)) @@ -212,6 +218,7 @@ IF( IEVAP >= 1 ) THEN ZRRT(JL) = PRRT(I1(JL),I2(JL),I3(JL)) ZCRT(JL) = PCRT(I1(JL),I2(JL),I3(JL)) ZRRS(JL) = PRRS(I1(JL),I2(JL),I3(JL)) + ZCRS(JL) = PCRS(I1(JL),I2(JL),I3(JL)) ZRVS(JL) = PRVS(I1(JL),I2(JL),I3(JL)) ZTHS(JL) = PTHS(I1(JL),I2(JL),I3(JL)) ZZT(JL) = ZT(I1(JL),I2(JL),I3(JL)) @@ -219,8 +226,8 @@ IF( IEVAP >= 1 ) THEN ZLBDR(JL) = ZWLBDR(I1(JL),I2(JL),I3(JL)) ZRHODREF(JL) = PRHODREF(I1(JL),I2(JL),I3(JL)) ZEXNREF(JL) = PEXNREF(I1(JL),I2(JL),I3(JL)) + ZZLV(JL) = ZLV(I1(JL),I2(JL),I3(JL)) END DO - ZZLV(:) = XLVTT + (XCPV-XCL)*(ZZT(:)-XTT) ! ALLOCATE(ZZW2(IEVAP)) ALLOCATE(ZZW3(IEVAP)) @@ -242,10 +249,16 @@ IF( IEVAP >= 1 ) THEN ! ! Compute the evaporation tendency ! - ZZW2(:) = MIN( ZZW2(:) * ZZW3(:) * ZRRT(:) * & + IF (LKHKO) THEN + ZZW2(:) = 3.0 * XCEVAP * ZZW2(:) * (4.*XPI*XRHOLW/(3.*ZRHODREF(:)))**(2./3.) * & + (ZRRT(:))**(1./3.) * (ZCRT(:))**(2./3.) * ZZW3(:) + ZZW2(:) = MIN(ZZW2(:),ZRRS(:)) + ELSE + ZZW2(:) = MIN( ZZW2(:) * ZZW3(:) * ZRRT(:) * & (X0EVAR*ZLBDR(:)**XEX0EVAR + X1EVAR*ZRHODREF(:)**XEX2EVAR* & ZLBDR(:)**XEX1EVAR),ZRRS(:) ) - ZZW2(:) = MAX(ZZW2(:),0.0) + ZZW2(:) = MAX(ZZW2(:),0.0) + END IF ! ! Adjust sources ! @@ -271,12 +284,20 @@ IF( IEVAP >= 1 ) THEN ZW(:,:,:)= PEVAP3D(:,:,:) PEVAP3D(:,:,:) = UNPACK( ZZW2(:),MASK=GEVAP(:,:,:),FIELD=ZW(:,:,:) ) ! + IF (LKHKO) THEN + ZZW2(:) = MIN(ZZW2(:) * ZCRT(:)/ZRRT(:),ZCRS(:)) + ZCRS(:) = ZCRS(:) - ZZW2(:) + ZW(:,:,:) = PCRS(:,:,:) + PCRS(:,:,:) = UNPACK( ZCRS(:),MASK=GEVAP(:,:,:),FIELD=ZW(:,:,:) ) + ENDIF + DEALLOCATE(ZRCT) DEALLOCATE(ZRRT) DEALLOCATE(ZRVT) DEALLOCATE(ZCRT) DEALLOCATE(ZRVS) DEALLOCATE(ZRRS) + DEALLOCATE(ZCRS) DEALLOCATE(ZTHS) DEALLOCATE(ZZLV) DEALLOCATE(ZZT) @@ -295,21 +316,40 @@ IF( IEVAP >= 1 ) THEN ! --------------------------------------- ! ! - GEVAP(:,:,:) = PRRS(:,:,:)>ZRTMIN(3) .AND. PCRS(:,:,:)>ZCTMIN(3) - ZDR(:,:,:) = 9999. - WHERE (GEVAP(:,:,:)) - ZDR(:,:,:)=(6.*PRRS(:,:,:)/XPI/XRHOLW/PCRS(:,:,:))**0.33 - ZWLBDR3(:,:,:) = XLBR * PCRS(:,:,:) / PRRS(:,:,:) - ZWLBDR(:,:,:) = ZWLBDR3(:,:,:)**XLBEXR - END WHERE + IF (LKHKO) THEN +!* correct negative values for rain +! -------------------------------- +! + WHERE (PRRS(:,:,:)<0.) + PRCS(:,:,:) = PRCS(:,:,:)+PRRS(:,:,:) + PRRS(:,:,:) = 0. + PCRS(:,:,:) = 0. + END WHERE +! +!* REMOVES NON-PHYSICAL LOW VALUES + GEVAP(:,:,:) = PRRS(:,:,:)<ZRTMIN(3) .AND. PCRS(:,:,:)< ZCTMIN(3) + WHERE (GEVAP(:,:,:)) + PRVS(:,:,:) = PRVS(:,:,:) + PRRS(:,:,:) + PTHS(:,:,:) = PTHS(:,:,:) - PRRS(:,:,:) * ZLV(:,:,:) / & + ( PEXNREF(:,:,:)*(XCPD + XCPV*PRVT(:,:,:) + XCL*(PRCT(:,:,:) + PRRT(:,:,:)) ) ) + PCRS(:,:,:) = 0.0 + PRRS(:,:,:) = 0.0 + END WHERE + ELSE + GEVAP(:,:,:) = PRRS(:,:,:)>ZRTMIN(3) .AND. PCRS(:,:,:)>ZCTMIN(3) + ZDR(:,:,:) = 9999. + WHERE (GEVAP(:,:,:)) + ZDR(:,:,:)=(6.*PRRS(:,:,:)/XPI/XRHOLW/PCRS(:,:,:))**0.33 + ZWLBDR3(:,:,:) = XLBR * PCRS(:,:,:) / PRRS(:,:,:) + ZWLBDR(:,:,:) = ZWLBDR3(:,:,:)**XLBEXR + END WHERE ! - WHERE (GEVAP(:,:,:) .AND. ZDR(:,:,:).LT.82.E-6) - PCCS(:,:,:) = PCCS(:,:,:)+PCRS(:,:,:) - PCRS(:,:,:) = 0. - PRCS(:,:,:) = PRCS(:,:,:)+PRRS(:,:,:) - PRRS(:,:,:) = 0. - END WHERE - + WHERE (GEVAP(:,:,:) .AND. ZDR(:,:,:).LT.82.E-6) + PCCS(:,:,:) = PCCS(:,:,:)+PCRS(:,:,:) + PCRS(:,:,:) = 0. + PRCS(:,:,:) = PRCS(:,:,:)+PRRS(:,:,:) + PRRS(:,:,:) = 0. + END WHERE !!$ GMICRO(:,:,:) = GEVAP(:,:,:) .AND. ZWLBDR(:,:,:)/XACCR1>ZWLBDC3(:,:,:) !!$ ! the raindrops are too small, that is lower than D_h !!$ ZFACT = 1.2E4*XACCR1 @@ -341,6 +381,8 @@ IF( IEVAP >= 1 ) THEN !!$ PRRS(:,:,:) = 0.0 !!$ END WHERE ! + END IF ! LKHKO + ! END IF ! IEVAP ! !++cb++ diff --git a/src/MNH/modd_fieldn.f90 b/src/MNH/modd_fieldn.f90 index 2e28feeae0e88d68dc7de3d6d189917ddcc66dfa..49cd8d3e5860b3a96468052aabae09bc6f79be44 100644 --- a/src/MNH/modd_fieldn.f90 +++ b/src/MNH/modd_fieldn.f90 @@ -165,6 +165,7 @@ REAL, DIMENSION(:,:,:), POINTER :: XHLI_HRI=>NULL() REAL, DIMENSION(:,:,:), POINTER :: XHLI_HCF=>NULL() REAL, DIMENSION(:,:,:), POINTER :: XSIGS=>NULL() REAL, DIMENSION(:,:,:), POINTER :: XCLDFR=>NULL() +REAL, DIMENSION(:,:,:), POINTER :: XICEFR=>NULL() REAL, DIMENSION(:,:,:), POINTER :: XRAINFR=>NULL() REAL, DIMENSION(:,:,:), POINTER :: XCIT=>NULL() REAL, DIMENSION(:,:,:), POINTER :: XTHM=>NULL() diff --git a/src/MNH/modd_getn.f90 b/src/MNH/modd_getn.f90 index f6531c4f82818662547b4332cfd7e6e2559a28f2..5978b7c2f6aafcf4f7a061d8938fab84360284f3 100644 --- a/src/MNH/modd_getn.f90 +++ b/src/MNH/modd_getn.f90 @@ -86,6 +86,8 @@ TYPE GET_t ! and SRC related to the subgrid condensation CHARACTER (LEN=4) :: CGETCLDFR ! Get indicator for the ! CLouD FRaction + CHARACTER (LEN=4) :: CGETICEFR ! Get indicator for the + ! CLouD FRaction CHARACTER (LEN=4) :: CGETSRCT ! Get indicator for SRCM ! and SRCT related to the subgrid condensation CHARACTER (LEN=4) :: CGETHL ! Get indicator for HighLow cloud @@ -123,6 +125,7 @@ CHARACTER (LEN=4), POINTER :: CGETLSUM=>NULL(), CGETLSVM=>NULL(), CGETLSWM=>NULL CHARACTER (LEN=4), POINTER :: CGETLSTHM=>NULL(), CGETLSRVM=>NULL() CHARACTER (LEN=4), POINTER :: CGETSIGS=>NULL(),CGETSRC=>NULL() CHARACTER (LEN=4), POINTER :: CGETCLDFR=>NULL() +CHARACTER (LEN=4), POINTER :: CGETICEFR=>NULL() CHARACTER (LEN=4), POINTER :: CGETSRCT=>NULL() CHARACTER (LEN=4), POINTER :: CGETHL=>NULL() CHARACTER (LEN=4), POINTER :: CGETCIT=>NULL() @@ -178,6 +181,7 @@ CGETLSRVM=>GET_MODEL(KTO)%CGETLSRVM CGETSIGS=>GET_MODEL(KTO)%CGETSIGS CGETSRC=>GET_MODEL(KTO)%CGETSRC CGETCLDFR=>GET_MODEL(KTO)%CGETCLDFR +CGETICEFR=>GET_MODEL(KTO)%CGETICEFR CGETSRCT=>GET_MODEL(KTO)%CGETSRCT CGETHL=>GET_MODEL(KTO)%CGETHL CGETCIT=>GET_MODEL(KTO)%CGETCIT diff --git a/src/MNH/modd_lesn.f90 b/src/MNH/modd_lesn.f90 index 28db43c4d13ba4f85754ace59ad988145b5f1c75..ac78ef503a2edbb805192fd505df5d174686b7ad 100644 --- a/src/MNH/modd_lesn.f90 +++ b/src/MNH/modd_lesn.f90 @@ -113,6 +113,7 @@ TYPE LES_t REAL, DIMENSION(:,:,:), POINTER :: XLES_MEAN_Qs=>NULL() ! saturated spec h REAL, DIMENSION(:,:,:), POINTER :: XLES_MEAN_Rc=>NULL() ! <Rc> REAL, DIMENSION(:,:,:), POINTER :: XLES_MEAN_Cf=>NULL() ! <CLDFR> + REAL, DIMENSION(:,:,:), POINTER :: XLES_MEAN_If=>NULL() ! <CLDFR> REAL, DIMENSION(:,:,:), POINTER :: XLES_MEAN_INDCf=>NULL() ! <Cf> tq rc>0 (0 OU 1) REAL, DIMENSION(:,:,:), POINTER :: XLES_MEAN_INDCf2=>NULL() ! <Cf> tq rc>1E-5 (0 OU 1) REAL, DIMENSION(:,:,:), POINTER :: XLES_MEAN_RF=>NULL() ! <RAINFR> @@ -686,6 +687,7 @@ REAL, DIMENSION(:,:,:), POINTER :: XLES_MEAN_Rehu=>NULL() REAL, DIMENSION(:,:,:), POINTER :: XLES_MEAN_Qs=>NULL() REAL, DIMENSION(:,:,:), POINTER :: XLES_MEAN_Rc=>NULL() REAL, DIMENSION(:,:,:), POINTER :: XLES_MEAN_Cf=>NULL() +REAL, DIMENSION(:,:,:), POINTER :: XLES_MEAN_If=>NULL() REAL, DIMENSION(:,:,:), POINTER :: XLES_MEAN_INDCf=>NULL() REAL, DIMENSION(:,:,:), POINTER :: XLES_MEAN_INDCf2=>NULL() REAL, DIMENSION(:,:,:), POINTER :: XLES_MEAN_RF=>NULL() @@ -1110,6 +1112,7 @@ LES_MODEL(KFROM)%XLES_MEAN_Rehu=>XLES_MEAN_Rehu LES_MODEL(KFROM)%XLES_MEAN_Qs=>XLES_MEAN_Qs LES_MODEL(KFROM)%XLES_MEAN_Rc=>XLES_MEAN_Rc LES_MODEL(KFROM)%XLES_MEAN_Cf=>XLES_MEAN_Cf +LES_MODEL(KFROM)%XLES_MEAN_If=>XLES_MEAN_If LES_MODEL(KFROM)%XLES_MEAN_INDCf=>XLES_MEAN_INDCf LES_MODEL(KFROM)%XLES_MEAN_INDCf2=>XLES_MEAN_INDCf2 LES_MODEL(KFROM)%XLES_MEAN_RF=>XLES_MEAN_RF @@ -1535,6 +1538,7 @@ XLES_MEAN_Rehu=>LES_MODEL(KTO)%XLES_MEAN_Rehu XLES_MEAN_Qs=>LES_MODEL(KTO)%XLES_MEAN_Qs XLES_MEAN_Rc=>LES_MODEL(KTO)%XLES_MEAN_Rc XLES_MEAN_Cf=>LES_MODEL(KTO)%XLES_MEAN_Cf +XLES_MEAN_If=>LES_MODEL(KTO)%XLES_MEAN_If XLES_MEAN_INDCf=>LES_MODEL(KTO)%XLES_MEAN_INDCf XLES_MEAN_INDCf2=>LES_MODEL(KTO)%XLES_MEAN_INDCf2 XLES_MEAN_RF=>LES_MODEL(KTO)%XLES_MEAN_RF diff --git a/src/MNH/modd_param_ice.f90 b/src/MNH/modd_param_ice.f90 index ddafd7516ed3313d0295d5c0b69fed2851f71783..ade107121eeb6c60d406147a6a09d104b67b59f6 100644 --- a/src/MNH/modd_param_ice.f90 +++ b/src/MNH/modd_param_ice.f90 @@ -78,6 +78,7 @@ LOGICAL, SAVE :: LSEDIM_AFTER ! sedimentation done before (.FALSE.) or after (.T ! REAL, SAVE :: XSPLIT_MAXCFL ! Maximum CFL number allowed for SPLIT scheme ! +LOGICAL,SAVE :: LSNOW_T ! Snow parameterization from Wurtz (2021) !------------------------------------------------------------------------------- ! END MODULE MODD_PARAM_ICE diff --git a/src/MNH/modd_param_lima.f90 b/src/MNH/modd_param_lima.f90 index 66156a05620e98e2662a314f7338b2453cdb5e51..3ad666dea03d88e8e4dca7371227fa2b5b63590e 100644 --- a/src/MNH/modd_param_lima.f90 +++ b/src/MNH/modd_param_lima.f90 @@ -62,6 +62,7 @@ LOGICAL, SAVE :: LMEYERS ! TRUE to use Meyers nucleation ! 1.2 IFN initialisation ! INTEGER, SAVE :: NMOD_IFN ! Number of IFN modes +INTEGER, SAVE :: NMOM_I ! Number of moments for pristine ice REAL, DIMENSION(JPLIMAIFNMAX), SAVE :: XIFN_CONC ! Ref. concentration of IFN(#/L) LOGICAL, SAVE :: LIFN_HOM ! True for z-homogeneous IFN concentrations CHARACTER(LEN=8), SAVE :: CIFN_SPECIES ! Internal mixing species definitions @@ -80,6 +81,7 @@ REAL, DIMENSION(:), SAVE, ALLOCATABLE :: XFRAC_REF ! AP compostion in P ! ! 1.3 Ice characteristics ! +LOGICAL, SAVE :: LSNOW_T ! TRUE to enable snow param. after Wurtz 2021 CHARACTER(LEN=4), SAVE :: CPRISTINE_ICE_LIMA ! Pristine type PLAT, COLU or BURO CHARACTER(LEN=4), SAVE :: CHEVRIMED_ICE_LIMA ! Heavily rimed type GRAU or HAIL REAL,SAVE :: XALPHAI,XNUI, & ! Pristine ice distribution parameters @@ -133,6 +135,7 @@ LOGICAL, SAVE :: LDEPOC ! Deposition of rc at 1st level above ground LOGICAL, SAVE :: LACTTKE ! TRUE to take into account TKE in W for activation LOGICAL, SAVE :: LADJ ! TRUE for adjustment procedure + Smax (false for diagnostic supersaturation) LOGICAL, SAVE :: LSPRO ! TRUE for prognostic supersaturation +LOGICAL, SAVE :: LKHKO ! TRUE for Scu simulation (replicates the previous KHKO scheme) ! ! 2.2 CCN initialisation ! diff --git a/src/MNH/modd_param_lima_cold.f90 b/src/MNH/modd_param_lima_cold.f90 index 64494219e13b43678a4600d0f3de3c5a3291241c..a3937fbaf230ea1087d71bd26cfc7ffc263f6615 100644 --- a/src/MNH/modd_param_lima_cold.f90 +++ b/src/MNH/modd_param_lima_cold.f90 @@ -19,6 +19,7 @@ !! MODIFICATIONS !! ------------- !! Original ??/??/13 +! J. Wurtz 03/2022: new snow characteristics !! !------------------------------------------------------------------------------- USE MODD_PARAMETERS, ONLY: JPSVNAMELGTMAX @@ -51,8 +52,9 @@ REAL,SAVE :: XAI,XBI,XC_I,XDI ,XF0I,XF2I,XC1I ! Cloud ice charact. REAL,SAVE :: XF0IS,XF1IS ! (large Di vent. coef.) REAL,SAVE :: XAS,XBS,XCS,XDS,XCCS,XCXS,XF0S,XF1S,XC1S ! Snow/agg. charact. ! -REAL,SAVE :: XLBDAS_MAX ! Max values allowed for the shape - ! parameter of snow +REAL,SAVE :: XLBDAS_MIN, XLBDAS_MAX ! Max values allowed for the shape parameter of snow +REAL,SAVE :: XFVELOS ! Wurtz - snow fall speed parameterizaed after Thompson 2008 +REAL,SAVE :: XTRANS_MP_GAMMAS ! Wurtz - change between lambda value for MP and gen. gamma ! CHARACTER(LEN=JPSVNAMELGTMAX),DIMENSION(5),PARAMETER & :: CLIMA_COLD_NAMES=(/'CICE ','CIFNFREE','CIFNNUCL', & @@ -106,7 +108,8 @@ REAL,SAVE :: XDICNVS_LIM, XLBDAICNVS_LIM, & ! Constants for pristine ice ! REAL,SAVE :: XCOLEXIS, & ! Constants for snow XAGGS_CLARGE1,XAGGS_CLARGE2, & ! aggregation : AGG - XAGGS_RLARGE1,XAGGS_RLARGE2 + XAGGS_RLARGE1,XAGGS_RLARGE2, & + XFIAGGS ! !?????????????????? REAL,SAVE :: XKER_ZRNIC_A1,XKER_ZRNIC_A2 ! Long-Zrnic Kernels (ini_ice_coma) diff --git a/src/MNH/modd_param_lima_mixed.f90 b/src/MNH/modd_param_lima_mixed.f90 index f13accfc669e88fca83566c2eb72f5c2cc6f4945..57ea4d1a559fcab6f202c4bafb3b6015119732f6 100644 --- a/src/MNH/modd_param_lima_mixed.f90 +++ b/src/MNH/modd_param_lima_mixed.f90 @@ -14,6 +14,7 @@ !! MODIFICATIONS !! ------------- !! Original ??/??/13 +! J. Wurtz 03/2022: new snow characteristics !! !------------------------------------------------------------------------------- ! @@ -67,6 +68,7 @@ REAL,SAVE :: XDCSLIM,XCOLCS, & ! Constants for the riming of XEXCRIMSS,XCRIMSS, & ! the aggregates : RIM XEXCRIMSG,XCRIMSG, & ! XEXSRIMCG,XSRIMCG, & ! + XSRIMCG2, XSRIMCG3, XEXSRIMCG2, & ! Murakami 1990 XGAMINC_BOUND_MIN, & ! Min val. of Lbda_s for RIM XGAMINC_BOUND_MAX, & ! Max val. of Lbda_s for RIM XRIMINTP1,XRIMINTP2 ! Csts for lin. interpol. of diff --git a/src/MNH/modd_param_lima_warm.f90 b/src/MNH/modd_param_lima_warm.f90 index 65a3d10279364cb382048f19ed657c7eca2d2c39..2c182b6e986a346fb9d61594316501cba7577cd9 100644 --- a/src/MNH/modd_param_lima_warm.f90 +++ b/src/MNH/modd_param_lima_warm.f90 @@ -90,8 +90,8 @@ REAL,SAVE :: XSELFC ! Constants for cloud droplet ! selfcollection : SELF ! REAL,SAVE :: XAUTO1, XAUTO2, XCAUTR, & ! Constants for cloud droplet - XLAUTR, XLAUTR_THRESHOLD, & ! autoconversion : AUT - XITAUTR, XITAUTR_THRESHOLD + XLAUTR, XLAUTR_THRESHOLD, & ! autoconversion : AUT + XITAUTR, XITAUTR_THRESHOLD, XR0 ! XR0 for KHKO autoconversion ! REAL,SAVE :: XACCR1, XACCR2, XACCR3, & ! Constants for the accretion XACCR4, XACCR5, XACCR6, & ! process @@ -105,7 +105,8 @@ REAL,SAVE :: XSPONBUD1,XSPONBUD2,XSPONBUD3, & ! Spontaneous Break-up XSPONCOEF2 ! (drop size limiter) ! REAL,SAVE :: X0EVAR, X1EVAR, & ! Constants for raindrop - XEX0EVAR, XEX1EVAR, XEX2EVAR ! evaporation: EVA + XEX0EVAR, XEX1EVAR, XEX2EVAR, & ! evaporation: EVA + XCEVAP ! for KHKO ! REAL,DIMENSION(:,:,:,:), SAVE, ALLOCATABLE :: XCONCC_INI REAL,SAVE :: XCONCR_PARAM_INI diff --git a/src/MNH/modd_rain_ice_descr.f90 b/src/MNH/modd_rain_ice_descr.f90 index 96295e4e7841c57028903c03f50731d03b9a9c6c..789a251c87e825c19bdcd08119d12b1ed97795b1 100644 --- a/src/MNH/modd_rain_ice_descr.f90 +++ b/src/MNH/modd_rain_ice_descr.f90 @@ -76,7 +76,10 @@ REAL,SAVE :: XALPHAS,XNUS,XLBEXS,XLBS ! Snow/agg. distribution parameters REAL,SAVE :: XALPHAG,XNUG,XLBEXG,XLBG ! Graupel distribution parameters REAL,SAVE :: XALPHAH,XNUH,XLBEXH,XLBH ! Hail distribution parameters ! -REAL,SAVE :: XLBDAR_MAX,XLBDAS_MAX,XLBDAG_MAX ! Max values allowed for the shape +REAL,SAVE :: XFVELOS ! factor for snow fall speed after Thompson (2008) +REAL,SAVE :: XTRANS_MP_GAMMAS ! coefficient to convert lambdas for gamma function +! +REAL,SAVE :: XLBDAR_MAX,XLBDAS_MIN,XLBDAS_MAX,XLBDAG_MAX ! Max values allowed for the shape ! parameters (rain,snow,graupeln) ! REAL,DIMENSION(:),SAVE,ALLOCATABLE :: XRTMIN ! Min values allowed for the mixing ratios diff --git a/src/MNH/modd_rain_ice_param.f90 b/src/MNH/modd_rain_ice_param.f90 index 7568e2a68efc91b9081f88ca55d426724038c3fc..434c4bc761d351bc6756fbdd6b5026d1a38141a3 100644 --- a/src/MNH/modd_rain_ice_param.f90 +++ b/src/MNH/modd_rain_ice_param.f90 @@ -39,7 +39,6 @@ ! ------------ ! IMPLICIT NONE -! REAL,DIMENSION(2),SAVE :: XFSEDC ! Constants for sedimentation fluxes of C REAL,SAVE :: XFSEDR,XEXSEDR, & ! Constants for sedimentation XFSEDI,XEXCSEDI,XEXRSEDI, & ! fluxes of R, I, S and G diff --git a/src/MNH/modeln.f90 b/src/MNH/modeln.f90 index 6ba8d83984325d8138102903d0428b07887e3a3d..63245233c3d962a4a861c2da5de99cd296319113 100644 --- a/src/MNH/modeln.f90 +++ b/src/MNH/modeln.f90 @@ -1807,7 +1807,7 @@ IF ((LDUST).OR.(LSALT)) THEN ! GCLD=.TRUE. IF (GCLD .AND. NRR.LE.3 ) THEN - IF( MAXVAL(XCLDFR(:,:,:)).LE. 1.E-10 .AND. GCLOUD_ONLY ) THEN + IF( MAX(MAXVAL(XCLDFR(:,:,:)),MAXVAL(XICEFR(:,:,:))).LE. 1.E-10 .AND. GCLOUD_ONLY ) THEN GCLD = .FALSE. ! only the cloudy verticals would be ! refreshed but there is no clouds END IF @@ -1895,7 +1895,7 @@ IF (CCLOUD /= 'NONE' .AND. CELEC == 'NONE') THEN ZPABST, XTHT,XRT,XSIGS,VSIGQSAT,XMFCONV,XTHM,XRCM, & XPABSM, XWT_ACT_NUC,XDTHRAD, XRTHS, XRRS, & XSVT, XRSVS, & - XSRCT, XCLDFR,XCIT, & + XSRCT, XCLDFR,XICEFR, XCIT, & LSEDIC,KACTIT, KSEDC, KSEDI, KRAIN, KWARM, KHHONI, & LCONVHG, XCF_MF,XRC_MF, XRI_MF, & XINPRC,ZINPRC3D,XINPRR, XINPRR3D, XEVAP3D, & @@ -1914,7 +1914,7 @@ IF (CCLOUD /= 'NONE' .AND. CELEC == 'NONE') THEN ZPABST, XTHT,XRT,XSIGS,VSIGQSAT,XMFCONV,XTHM,XRCM, & XPABSM, XWT_ACT_NUC,XDTHRAD, XRTHS, XRRS, & XSVT, XRSVS, & - XSRCT, XCLDFR,XCIT, & + XSRCT, XCLDFR, XICEFR, XCIT, & LSEDIC,KACTIT, KSEDC, KSEDI, KRAIN, KWARM, KHHONI, & LCONVHG, XCF_MF,XRC_MF, XRI_MF, & XINPRC,ZINPRC3D,XINPRR, XINPRR3D, XEVAP3D, & @@ -2130,7 +2130,7 @@ IF (LPROFILER) & CALL PROFILER_n(XTSTEP, & XXHAT, XYHAT, XZZ,XRHODREF, & XUT, XVT, XWT, XTHT, XRT, XSVT, XTKET, XTSRAD, XPABST, & - XAER, XCLDFR, XCIT,PSEA=ZSEA(:,:)) + XAER, MAX(XCLDFR,XICEFR), XCIT,PSEA=ZSEA(:,:)) ! ! CALL SECOND_MNH2(ZTIME2) diff --git a/src/MNH/modn_param_ice.f90 b/src/MNH/modn_param_ice.f90 index 0c7379b3b0f75b233ba679e0d2469ce3a759e0cd..085f74d7381939312012e03d5f1cf082779e233d 100644 --- a/src/MNH/modn_param_ice.f90 +++ b/src/MNH/modn_param_ice.f90 @@ -26,6 +26,6 @@ NAMELIST/NAM_PARAM_ICE/LWARM,LSEDIC,LCONVHG,CPRISTINE_ICE,CSEDIM,LDEPOSC,XVDEPOS LEVLIMIT,LNULLWETG,LWETGPOST,LNULLWETH,LWETHPOST, & CSNOWRIMING,XFRACM90,NMAXITER,XMRSTEP,XTSTEP_TS, & LADJ_BEFORE, LADJ_AFTER, CFRAC_ICE_ADJUST, LCRFLIMIT, & - XSPLIT_MAXCFL, CFRAC_ICE_SHALLOW_MF, LSEDIM_AFTER + XSPLIT_MAXCFL, CFRAC_ICE_SHALLOW_MF, LSEDIM_AFTER, LSNOW_T ! END MODULE MODN_PARAM_ICE diff --git a/src/MNH/modn_param_lima.f90 b/src/MNH/modn_param_lima.f90 index f86b1add06cd8ac04da64b6bac6556d924bbc223..3bac60a071981589639892d40ded6d11d9ba9e3f 100644 --- a/src/MNH/modn_param_lima.f90 +++ b/src/MNH/modn_param_lima.f90 @@ -18,14 +18,14 @@ IMPLICIT NONE ! ! NAMELIST/NAM_PARAM_LIMA/LCOLD, LNUCL, LSEDI, LSNOW, LHAIL, LHHONI, LMEYERS,& - NMOD_IFN, XIFN_CONC, LIFN_HOM, & + NMOD_IFN, NMOM_I, XIFN_CONC, LIFN_HOM, & CIFN_SPECIES, CINT_MIXING, NMOD_IMM, NIND_SPECIE, & - CPRISTINE_ICE_LIMA, CHEVRIMED_ICE_LIMA, & + LSNOW_T, CPRISTINE_ICE_LIMA, CHEVRIMED_ICE_LIMA, & XALPHAI, XNUI, XALPHAS, XNUS, XALPHAG, XNUG, & XFACTNUC_DEP, XFACTNUC_CON, NPHILLIPS, & ! LWARM, LACTI, LRAIN, LSEDC, LACTIT, LBOUND, LSPRO, & - LADJ, & + LADJ, LKHKO, & NMOD_CCN, XCCN_CONC, & LCCN_HOM, CCCN_MODES, HINI_CCN, HTYPE_CCN, & XALPHAC, XNUC, XALPHAR, XNUR, & diff --git a/src/MNH/phys_paramn.f90 b/src/MNH/phys_paramn.f90 index be5d47e97df870f165baa47c3b3efb1d37f95961..ef08a0077d4ee244a144c6cf400e1545f9c71316 100644 --- a/src/MNH/phys_paramn.f90 +++ b/src/MNH/phys_paramn.f90 @@ -624,7 +624,7 @@ IF (CRAD /='NONE') THEN ! IF (CRAD =='ECMW' .OR. CRAD =='ECRA') THEN IF (GRAD .AND. NRR.LE.3 ) THEN - IF( MAXVAL(XCLDFR(:,:,:)).LE. 1.E-10 .AND. OCLOUD_ONLY ) THEN + IF( MAX(MAXVAL(XCLDFR(:,:,:)),MAXVAL(XICEFR(:,:,:))).LE. 1.E-10 .AND. OCLOUD_ONLY ) THEN GRAD = .FALSE. ! only the cloudy verticals would be ! refreshed but there is no clouds END IF @@ -739,7 +739,7 @@ CALL SUNPOS_n ( XZENITH, ZCOSZEN, ZSINZEN, ZAZIMSOL ) COPWLW, COPILW, XFUDG, & NDLON, NFLEV, NRAD_DIAG, NFLUX, NRAD, NAER, NSWB_OLD, NSWB_MNH, NLWB_MNH, & NSTATM, NRAD_COLNBR, ZCOSZEN, XSEA, XCORSOL, & - XDIR_ALB, XSCA_ALB, XEMIS, XCLDFR, XCCO2, XTSRAD, XSTATM, XTHT, XRT, & + XDIR_ALB, XSCA_ALB, XEMIS, MAX(XCLDFR,XICEFR), XCCO2, XTSRAD, XSTATM, XTHT, XRT, & XPABST, XOZON, XAER,XDST_WL, XAER_CLIM, XSVT, & XDTHRAD, XFLALWD, XDIRFLASWD, XSCAFLASWD, XRHODREF, XZZ , & XRADEFF, XSWU, XSWD, XLWU, XLWD, XDTHRADSW, XDTHRADLW ) diff --git a/src/MNH/profilern.f90 b/src/MNH/profilern.f90 index 433a5c6ef02ae8a1630718f497b1f602b536f7a5..997562e4fca562d22a6875e636244257abfc050d 100644 --- a/src/MNH/profilern.f90 +++ b/src/MNH/profilern.f90 @@ -112,14 +112,16 @@ USE MODE_FGAU, ONLY : GAULAG USE MODE_FSCATTER, ONLY: QEPSW,QEPSI,BHMIE,MOMG,MG USE MODD_PARAM_LIMA, ONLY: XALPHAR_L=>XALPHAR,XNUR_L=>XNUR,XALPHAS_L=>XALPHAS,XNUS_L=>XNUS,& XALPHAG_L=>XALPHAG,XNUG_L=>XNUG, XALPHAI_L=>XALPHAI,XNUI_L=>XNUI,& - XRTMIN_L=>XRTMIN,XALPHAC_L=>XALPHAC,XNUC_L=>XNUC + XRTMIN_L=>XRTMIN,XALPHAC_L=>XALPHAC,XNUC_L=>XNUC, LSNOW_T_L=>LSNOW_T USE MODD_PARAM_LIMA_COLD, ONLY: XDI_L=>XDI,XLBEXI_L=>XLBEXI,XLBI_L=>XLBI,XAI_L=>XAI,XBI_L=>XBI,XC_I_L=>XC_I,& XLBEXS_L=>XLBEXS,XLBS_L=>XLBS,XCCS_L=>XCCS,& - XAS_L=>XAS,XBS_L=>XBS,XCXS_L=>XCXS + XAS_L=>XAS,XBS_L=>XBS,XCXS_L=>XCXS, & + XLBDAS_MIN,XLBDAS_MAX USE MODD_PARAM_LIMA_MIXED, ONLY: XDG_L=>XDG,XLBEXG_L=>XLBEXG,XLBG_L=>XLBG,XCCG_L=>XCCG,& XAG_L=>XAG,XBG_L=>XBG,XCXG_L=>XCXG,XCG_L=>XCG USE MODD_PARAM_LIMA_WARM, ONLY: XLBEXR_L=>XLBEXR,XLBR_L=>XLBR,XBR_L=>XBR,XAR_L=>XAR,& XBC_L=>XBC,XAC_L=>XAC +USE MODD_PARAM_ICE, ONLY: LSNOW_T_I=>LSNOW_T USE MODD_RAIN_ICE_DESCR, ONLY: XALPHAR_I=>XALPHAR,XNUR_I=>XNUR,XLBEXR_I=>XLBEXR,& XLBR_I=>XLBR,XCCR_I=>XCCR,XBR_I=>XBR,XAR_I=>XAR,& XALPHAC_I=>XALPHAC,XNUC_I=>XNUC,& @@ -242,6 +244,7 @@ REAL :: ZAETOT,ZAETMP,ZREFLOC,ZQSCA,ZQBACK,ZQEXT ! tem REAL,DIMENSION(:),ALLOCATABLE :: ZAELOC,ZZMZ ! temporary arrays INTEGER :: JPTS_GAULAG=9 ! number of points for Gauss-Laguerre quadrature REAL :: ZLBDA ! slope distribution parameter +REAL :: ZN ! number cocentration REAL :: ZFRAC_ICE ! ice water fraction REAL :: ZDELTA_EQUIV ! mass-equivalent Gauss-Laguerre point REAL :: ZFW ! liquid fraction @@ -724,7 +727,18 @@ IF (GSTORE) THEN ZLB=( ZA*ZCC*MOMG(ZALPHA,ZNU,ZB) )**(-ZLBEX) ENDIF END SELECT - ZLBDA=ZLB*(ZRHODREFZ(JK)*ZRZ(JK,JLOOP))**ZLBEX + IF (JLOOP.EQ.5 .AND. ( (CCLOUD=='LIMA'.AND.LSNOW_T_L).OR. & + (CCLOUD=='ICE3'.AND.LSNOW_T_I) ) ) THEN + IF (ZTEMPZ(JK)>-10.) THEN + ZLBDA = MAX(MIN(XLBDAS_MAX, 10**(14.554-0.0423*(ZTEMPZ(JK)+273.15))),XLBDAS_MIN) + ELSE + ZLBDA = MAX(MIN(XLBDAS_MAX, 10**(6.226-0.0106*(ZTEMPZ(JK)+273.15))),XLBDAS_MIN) + END IF + ZN=XLBS_L*ZRHODREFZ(JK)*ZRZ(JK,JLOOP)*ZLBDA**ZB + ELSE + ZLBDA=ZLB*(ZRHODREFZ(JK)*ZRZ(JK,JLOOP))**ZLBEX + ZN=ZCC*ZLBDA**ZCX + END IF ZREFLOC=0. ZAETMP=0. DO JJ=1,JPTS_GAULAG ! Gauss-Laguerre quadrature @@ -754,8 +768,8 @@ IF (GSTORE) THEN ZREFLOC=ZREFLOC+ZQBACK*ZX(JJ)**(ZNU-1)*ZDELTA_EQUIV**2*ZW(JJ) ZAETMP =ZAETMP +ZQEXT *ZX(JJ)**(ZNU-1)*ZDELTA_EQUIV**2*ZW(JJ) END DO - ZREFLOC=ZREFLOC*(XLAM_CRAD/XPI)**4*ZCC*ZLBDA**ZCX/(4.*GAMMA(ZNU)*.93) - ZAETMP=ZAETMP * XPI *ZCC*ZLBDA**ZCX/(4.*GAMMA(ZNU)) + ZREFLOC=ZREFLOC*(XLAM_CRAD/XPI)**4*ZN/(4.*GAMMA(ZNU)*.93) + ZAETMP=ZAETMP * XPI *ZN/(4.*GAMMA(ZNU)) TPROFILER%CRARE(IN,JK,I)=TPROFILER%CRARE(IN,JK,I)+ZREFLOC ZAELOC(JK)=ZAELOC(JK)+ZAETMP END IF diff --git a/src/MNH/radar_rain_ice.f90 b/src/MNH/radar_rain_ice.f90 index eddac2294d8c62054116b7be77081b610e72aefb..bd892a45293a32fc6296d13677bf88c111230fa3 100644 --- a/src/MNH/radar_rain_ice.f90 +++ b/src/MNH/radar_rain_ice.f90 @@ -96,6 +96,7 @@ END MODULE MODI_RADAR_RAIN_ICE ! USE MODD_CST USE MODD_REF +USE MODD_PARAM_ICE, ONLY: LSNOW_T_I=>LSNOW_T USE MODD_RAIN_ICE_DESCR, ONLY: XALPHAR_I=>XALPHAR,XNUR_I=>XNUR,XLBEXR_I=>XLBEXR,& XLBR_I=>XLBR,XCCR_I=>XCCR,XBR_I=>XBR,XAR_I=>XAR,& XALPHAC_I=>XALPHAC,XNUC_I=>XNUC,& @@ -114,7 +115,8 @@ USE MODD_PARAM_LIMA_WARM, ONLY: XLBEXR_L=>XLBEXR,XLBR_L=>XLBR,XBR_L=>XBR,XAR_L=> XBC_L=>XBC,XAC_L=>XAC,XCR_L=>XCR,XDR_L=>XDR USE MODD_PARAM_LIMA_COLD, ONLY: XDI_L=>XDI,XLBEXI_L=>XLBEXI,XLBI_L=>XLBI,XAI_L=>XAI,XBI_L=>XBI,XC_I_L=>XC_I,& XLBEXS_L=>XLBEXS,XLBS_L=>XLBS,XCCS_L=>XCCS,& - XAS_L=>XAS,XBS_L=>XBS,XCXS_L=>XCXS,XCS_L=>XCS,XDS_L=>XDS + XAS_L=>XAS,XBS_L=>XBS,XCXS_L=>XCXS,XCS_L=>XCS,XDS_L=>XDS,& + XLBDAS_MIN,XLBDAS_MAX USE MODD_PARAM_LIMA_MIXED, ONLY:XDG_L=>XDG,XLBEXG_L=>XLBEXG,XLBG_L=>XLBG,XCCG_L=>XCCG,& XAG_L=>XAG,XBG_L=>XBG,XCXG_L=>XCXG,XCG_L=>XCG,& @@ -123,7 +125,7 @@ USE MODD_PARAM_LIMA_MIXED, ONLY:XDG_L=>XDG,XLBEXG_L=>XLBEXG,XLBG_L=>XLBG,XCCG_L= USE MODD_PARAM_LIMA, ONLY: XALPHAR_L=>XALPHAR,XNUR_L=>XNUR,XALPHAS_L=>XALPHAS,XNUS_L=>XNUS,& XALPHAG_L=>XALPHAG,XNUG_L=>XNUG, XALPHAI_L=>XALPHAI,XNUI_L=>XNUI,& - XRTMIN_L=>XRTMIN,XALPHAC_L=>XALPHAC,XNUC_L=>XNUC + XRTMIN_L=>XRTMIN,XALPHAC_L=>XALPHAC,XNUC_L=>XNUC, LSNOW_T_L=>LSNOW_T USE MODD_PARAMETERS USE MODD_PARAM_n, ONLY : CCLOUD USE MODD_LUNIT @@ -169,6 +171,8 @@ REAL :: ZRHO00 ! Surface reference air density LOGICAL, DIMENSION(SIZE(PTEMP,1),SIZE(PTEMP,2),SIZE(PTEMP,3)) :: GRAIN REAL, DIMENSION(SIZE(PTEMP,1),SIZE(PTEMP,2),SIZE(PTEMP,3)) :: ZLBDA ! slope distribution parameter +REAL, DIMENSION(SIZE(PTEMP,1),SIZE(PTEMP,2),SIZE(PTEMP,3)) :: ZN + ! number concentration REAL, DIMENSION(SIZE(PTEMP,1),SIZE(PTEMP,2),SIZE(PTEMP,3)) :: ZW REAL, DIMENSION(SIZE(PTEMP,1),SIZE(PTEMP,2),SIZE(PTEMP,3)) :: ZREFL_MELT_CONV INTEGER :: JLBDA @@ -325,7 +329,25 @@ END IF ! --------------- ! IF (SIZE(PRT,4) >= 5) THEN - IF (CCLOUD=='LIMA') THEN + IF ( (CCLOUD=='LIMA' .AND. LSNOW_T_L) .OR. & + (CCLOUD=='ICE3' .AND. LSNOW_T_I) ) THEN + ZDMELT_FACT = ( (6.0*XAS_L)/(XPI*XRHOLW) )**(2.0) + ZEXP = 2.0*XBS_L + WHERE(PTEMP(:,:,:)>-10. .AND. PRT(:,:,:,5).GT.XRTMIN_L(5)) + ZLBDA(:,:,:) = MAX(MIN(XLBDAS_MAX, 10**(14.554-0.0423*(PTEMP(:,:,:)+273.15))),XLBDAS_MIN) + END WHERE + WHERE(PTEMP(:,:,:)<=-10 .AND. PRT(:,:,:,5).GT.XRTMIN_L(5)) + ZLBDA(:,:,:) = MAX(MIN(XLBDAS_MAX, 10**(6.226-0.0106*(PTEMP(:,:,:)+273.15))),XLBDAS_MIN) + END WHERE + ZN(:,:,:)=XLBS_L*PRHODREF(:,:,:)*PRT(:,:,:,5)*ZLBDA(:,:,:)**XBS_L + WHERE( PRT(:,:,:,5).GT.XRTMIN_L(5) ) + ZW(:,:,:) = ZEQICE*ZDMELT_FACT & + *1.E18*ZN(:,:,:)*(ZLBDA(:,:,:)**(-ZEXP))*MOMG(XALPHAS_L,XNUS_L,ZEXP) + PVDOP(:,:,:) = PVDOP(:,:,:)+ZEQICE*ZDMELT_FACT*MOMG(XALPHAS_L,XNUS_L,ZEXP+XDS_L) & + *1.E18*ZN(:,:,:)*XCS_L*(ZLBDA(:,:,:)**(-ZEXP-XDS_L)) + PRARE(:,:,:) = PRARE(:,:,:) + ZW(:,:,:) + END WHERE + ELSEIF (CCLOUD=='LIMA') THEN ZDMELT_FACT = ( (6.0*XAS_L)/(XPI*XRHOLW) )**(2.0) ZEXP = 2.0*XBS_L WHERE( PRT(:,:,:,5).GT.XRTMIN_L(5) ) diff --git a/src/MNH/radar_scattering.f90 b/src/MNH/radar_scattering.f90 index dc3ddc1e5027eed57ce8610829eef632598ac9ac..4d6537af5ea199b904980a1ae2b8c694b40817c6 100644 --- a/src/MNH/radar_scattering.f90 +++ b/src/MNH/radar_scattering.f90 @@ -105,6 +105,7 @@ USE MODD_CST USE MODD_IO, ONLY: TFILEDATA USE MODD_LUNIT USE MODD_PARAMETERS +USE MODD_PARAM_ICE, ONLY: LSNOW_T_I=>LSNOW_T USE MODD_RAIN_ICE_DESCR, ONLY: XALPHAR_I=>XALPHAR,XNUR_I=>XNUR,XDR_I=>XDR,XLBEXR_I=>XLBEXR,& XLBR_I=>XLBR,XCCR_I=>XCCR,XBR_I=>XBR,XCR_I=>XCR,& XALPHAS_I=>XALPHAS,XNUS_I=>XNUS,XDS_I=>XDS,XLBEXS_I=>XLBEXS,& @@ -119,12 +120,13 @@ USE MODD_RAIN_ICE_DESCR, ONLY: XALPHAR_I=>XALPHAR,XNUR_I=>XNUR,XDR_I=>XDR,XLBEXR !!LIMA USE MODD_PARAM_LIMA_WARM, ONLY: XDR_L=>XDR,XLBEXR_L=>XLBEXR,XLBR_L=>XLBR,XBR_L=>XBR,XCR_L=>XCR USE MODD_PARAM_LIMA_COLD, ONLY: XDI_L=>XDI,XLBEXI_L=>XLBEXI,XLBI_L=>XLBI,XAI_L=>XAI,XBI_L=>XBI,XC_I_L=>XC_I,& - XDS_L=>XDS,XLBEXS_L=>XLBEXS,XLBS_L=>XLBS,XCCS_L=>XCCS,XAS_L=>XAS,XBS_L=>XBS,XCXS_L=>XCXS,XCS_L=>XCS + XDS_L=>XDS,XLBEXS_L=>XLBEXS,XLBS_L=>XLBS,XCCS_L=>XCCS,XAS_L=>XAS,XBS_L=>XBS,& + XCXS_L=>XCXS,XCS_L=>XCS,XLBDAS_MIN,XLBDAS_MAX USE MODD_PARAM_LIMA_MIXED, ONLY:XDG_L=>XDG,XLBEXG_L=>XLBEXG,XLBG_L=>XLBG,XCCG_L=>XCCG,XAG_L=>XAG,XBG_L=>XBG,XCXG_L=>XCXG,XCG_L=>XCG USE MODD_PARAM_LIMA, ONLY: XALPHAR_L=>XALPHAR,XNUR_L=>XNUR,XALPHAS_L=>XALPHAS,XNUS_L=>XNUS,& XALPHAG_L=>XALPHAG,XNUG_L=>XNUG, XALPHAI_L=>XALPHAI,XNUI_L=>XNUI,& - XRTMIN_L=>XRTMIN + XRTMIN_L=>XRTMIN, LSNOW_T_L=>LSNOW_T !!LIMA USE MODD_RADAR, ONLY:XLAM_RAD,XSTEP_RAD,NBELEV,NDIFF,LATT,NPTS_GAULAG,LQUAD,XVALGROUND,NDGS, & LFALL,LWBSCS,LWREFL,XREFLVDOPMIN,XREFLMIN,LSNRT,XSNRMIN @@ -192,6 +194,7 @@ REAL :: ZDMELT_FACT ! factor used to compute the equivalent melted diameter REAL :: ZEQICE=0.224! factor used to convert the ice crystals reflectivity into an equivalent liquid water reflectivity (from Smith, JCAM 84) REAL :: ZEXP ! anciliary parameter REAL :: ZLBDA ! slope distribution parameter +REAL :: ZN ! Number concentration REAL :: ZFRAC_ICE,ZD,ZDE ! auxiliary variables REAL :: ZQSCA REAL,DIMENSION(2) :: ZQEXT @@ -1282,28 +1285,37 @@ DO JI=1,INBRAD ZDMELT_FACT=6.*ZAS/(XPI*.92*XRHOLW) ZEXP=2.*ZBS !XBS = 1.9 in ini_radar.f90 (bj tab 2.1 p24) !dans ini_rain_ice.f90 : - ZLBDA= ZLBS*(ZM)**ZLBEXS - + IF ( (GLIMA .AND. LSNOW_T_L) .OR. (.NOT.GLIMA .AND. LSNOW_T_I) ) THEN + IF (PT_RAY(JI,JEL,JAZ,JL,JH,JV)>-10.) THEN + ZLBDA = MAX(MIN(XLBDAS_MAX, 10**(14.554-0.0423*(PT_RAY(JI,JEL,JAZ,JL,JH,JV)+273.15))),XLBDAS_MIN) + ELSE + ZLBDA = MAX(MIN(XLBDAS_MAX, 10**(6.226-0.0106*(PT_RAY(JI,JEL,JAZ,JL,JH,JV)+273.15))),XLBDAS_MIN) + END IF + ZN=ZLBS*ZM*ZLBDA**ZBS + ELSE + ZLBDA= ZLBS*(ZM)**ZLBEXS + ZN=ZCCS*ZLBDA**ZCXS + END IF ! Rayleigh or Rayleigh-Gans or Rayleigh with 6th order for attenuation IF(NDIFF==0.OR.NDIFF==3.OR.NDIFF==4) THEN - ZREFLOC(1:2)=ZEQICE*.92**2*ZDMELT_FACT**2*1.E18*ZCCS*ZLBDA**(ZCXS-ZEXP)*MOMG(ZALPHAS,ZNUS,ZEXP) + ZREFLOC(1:2)=ZEQICE*.92**2*ZDMELT_FACT**2*1.E18*ZN*ZLBDA**(ZEXP)*MOMG(ZALPHAS,ZNUS,ZEXP) ZREFLOC(3)=0. IF(LWREFL) THEN ! weighting by reflectivities ZREFL(JI,JEL,JAZ,JL,JH,JV,IVDOP)=ZREFL(JI,JEL,JAZ,JL,JH,JV,IVDOP)& -ZCS*SIN(PELEV(JI,JEL,JL,JV))*ZEQICE*.92**2*ZDMELT_FACT**2& - *1.E18*ZCCS*ZLBDA**(ZCXS-ZEXP-ZDS)*MOMG(ZALPHAS,ZNUS,ZEXP+ZDS) + *1.E18*ZN*ZLBDA**(ZEXP-ZDS)*MOMG(ZALPHAS,ZNUS,ZEXP+ZDS) ELSE - ZREFL(JI,JEL,JAZ,JL,JH,JV,IMAX)=ZREFL(JI,JEL,JAZ,JL,JH,JV,IMAX)+ZCCS*ZLBDA**ZCXS + ZREFL(JI,JEL,JAZ,JL,JH,JV,IMAX)=ZREFL(JI,JEL,JAZ,JL,JH,JV,IMAX)+ZN ZREFL(JI,JEL,JAZ,JL,JH,JV,IVDOP)=ZREFL(JI,JEL,JAZ,JL,JH,JV,IVDOP)& -ZCS*SIN(PELEV(JI,JEL,JL,JV))& - *ZCCS*ZLBDA**(ZCXS-ZDS)*MOMG(ZALPHAS,ZNUS,ZDS) + *ZN*ZLBDA**(ZDS)*MOMG(ZALPHAS,ZNUS,ZDS) END IF IF(LATT) THEN IF(NDIFF==0.OR.NDIFF==3) THEN - ZAETMP(:)=ZCCS*ZLBDA**ZCXS*(ZDMELT_FACT*XPI**2/XLAM_RAD(JI)*AIMAG(ZQK)& + ZAETMP(:)=ZN*(ZDMELT_FACT*XPI**2/XLAM_RAD(JI)*AIMAG(ZQK)& *MOMG(ZALPHAS,ZNUS,ZBS)/ZLBDA**ZBS) ELSE - ZAETMP(:)=ZCCS*ZLBDA**ZCXS*(ZDMELT_FACT*XPI**2/XLAM_RAD(JI)*AIMAG(ZQK) & + ZAETMP(:)=ZN*(ZDMELT_FACT*XPI**2/XLAM_RAD(JI)*AIMAG(ZQK) & *MOMG(ZALPHAS,ZNUS,ZBS)/ZLBDA**ZBS & +ZDMELT_FACT**(5./3.)*XPI**4/15./XLAM_RAD(JI)**3 & *AIMAG(ZQK**2*(ZQMI**4+27.*ZQMI**2+38.) & @@ -1355,7 +1367,7 @@ DO JI=1,INBRAD ZREFLOC(3)=180.E3/XPI*XLAM_RAD(JI)*ZRE_S22FMS11F ZREFL(JI,JEL,JAZ,JL,JH,JV,IVDOP)=PVDOP_RAY(JI,JEL,JAZ,JL,JH,JV)*ZREFLOC(1) & -ZCS*SIN(PELEV(JI,JEL,JL,JV))*ZREFLOC(1) & - *1.E18*(XLAM_RAD(JI)/XPI)**4/.93*ZCCS/4./ZLBDA**(3+ZDS) + *1.E18*(XLAM_RAD(JI)/XPI)**4/.93*(ZN*ZLBDA**(-ZCXS))/4./ZLBDA**(3+ZDS) IF(LATT) THEN ZAETMP(1)=ZIM_S22FT*XLAM_RAD(JI)*2 ZAETMP(2)=ZIM_S11FT*XLAM_RAD(JI)*2 @@ -1374,15 +1386,15 @@ DO JI=1,INBRAD ZREFLOC(4)=ZREFLOC(4)+ZQBACK(1)*ZX(JJ)**(ZNUS-1.+2.*ZBS/3./ZALPHAS+ZDS/ZALPHAS)*ZW(JJ) IF(LATT) ZAETMP(:)=ZAETMP(:)+ZQEXT(:)*ZX(JJ)**(ZNUS-1.+2.*ZBS/3./ZALPHAS)*ZW(JJ) END DO ! ****** end loop Gauss-Laguerre quadrature - ZREFLOC(1:2)=1.E18*(XLAM_RAD(JI)/XPI)**4*ZCCS*ZLBDA**(ZCXS-2.*ZBS/3.)/& + ZREFLOC(1:2)=1.E18*(XLAM_RAD(JI)/XPI)**4*ZN*ZLBDA**(-2.*ZBS/3.)/& (4.*GAMMA(ZNUS)*.93)*ZDMELT_FACT**(2./3.)*ZREFLOC(1:2) ZREFL(JI,JEL,JAZ,JL,JH,JV,IVDOP)=ZREFL(JI,JEL,JAZ,JL,JH,JV,IVDOP)& +PVDOP_RAY(JI,JEL,JAZ,JL,JH,JV)*ZREFLOC(1) & -ZCS*SIN(PELEV(JI,JEL,JL,JV))*ZREFLOC(4) & - *1.E18*(XLAM_RAD(JI)/XPI)**4*ZCCS & - *ZLBDA**(ZCXS-2.*ZBS/3.-ZDS)/ & + *1.E18*(XLAM_RAD(JI)/XPI)**4*ZN & + *ZLBDA**(2.*ZBS/3.-ZDS)/ & (4.*GAMMA(ZNUS)*.93)*ZDMELT_FACT**(2./3.) - IF(LATT) ZAETMP(:)=ZAETMP(:)*XPI*ZCCS*ZLBDA**(ZCXS-2.*ZBS/3.)/(4.*GAMMA(ZNUS))& + IF(LATT) ZAETMP(:)=ZAETMP(:)*XPI*ZN*ZLBDA**(-2.*ZBS/3.)/(4.*GAMMA(ZNUS))& *ZDMELT_FACT**(2./3.) ZRE_S22S11_S=0 ZIM_S22S11_S=0 diff --git a/src/MNH/rain_ice_red.f90 b/src/MNH/rain_ice_red.f90 index 2416326653944702f6e731bfda3d47c2f2f7d9d3..3ad44addbceccd40be33646a13bc83964a27e0b8 100644 --- a/src/MNH/rain_ice_red.f90 +++ b/src/MNH/rain_ice_red.f90 @@ -257,6 +257,7 @@ END MODULE MODI_RAIN_ICE_RED ! P. Wautelet 17/01/2020: move Quicksort to tools.f90 ! P. Wautelet 02/2020: use the new data structures and subroutines for budgets ! P. Wautelet 25/02/2020: bugfix: add missing budget: WETH_BU_RRG +! J. Wurtz 03/2022: New snow characteristics with LSNOW_T !----------------------------------------------------------------- ! !* 0. DECLARATIONS @@ -272,8 +273,8 @@ use modd_budget, only: lbu_enable, USE MODD_CST, ONLY: XCI,XCL,XCPD,XCPV,XLSTT,XLVTT,XTT USE MODD_PARAMETERS, ONLY: JPVEXT,XUNDEF USE MODD_PARAM_ICE, ONLY: CSUBG_PR_PDF,CSUBG_RC_RR_ACCR,CSUBG_RR_EVAP,LDEPOSC,LFEEDBACKT,LSEDIM_AFTER, & - NMAXITER,XMRSTEP,XTSTEP_TS,XVDEPOSC -USE MODD_RAIN_ICE_DESCR, ONLY: XRTMIN + NMAXITER,XMRSTEP,XTSTEP_TS,XVDEPOSC,LSNOW_T +USE MODD_RAIN_ICE_DESCR, ONLY: XRTMIN,XLBDAS_MIN,XLBDAS_MAX,XTRANS_MP_GAMMAS,XLBS,XLBEXS USE MODD_VAR_ll, ONLY: IP use mode_budget, only: Budget_store_add, Budget_store_init, Budget_store_end @@ -356,6 +357,8 @@ REAL, DIMENSION(KIT,KJT,KKT,KRR), OPTIONAL, INTENT(OUT) :: PFPR ! upper-air pre ! !* 0.2 Declarations of local variables : ! +REAL, DIMENSION(SIZE(PRST,1),SIZE(PRST,2),SIZE(PRST,3)) :: ZLBDAS ! Modif !lbda parameter snow + INTEGER :: IIB ! Define the domain where is INTEGER :: IIE ! the microphysical sources have to be computed INTEGER :: IJB ! @@ -571,6 +574,27 @@ ELSE ENDDO ENDDO ENDIF + +!Compute lambda_snow parameter +!ZT en KELVIN +ZLBDAS(:,:,:)=1000. +DO JK = 1, KKT + DO JJ = 1, KJT + DO JI = 1, KIT + IF (LSNOW_T) THEN + IF (PRST(JI,JJ,JK)>XRTMIN(5)) THEN + IF(ZT(JI,JJ,JK)>263.15) THEN + ZLBDAS(JI,JJ,JK) = MAX(MIN(XLBDAS_MAX, 10**(14.554-0.0423*ZT(JI,JJ,JK))),XLBDAS_MIN)*XTRANS_MP_GAMMAS + ELSE + ZLBDAS(JI,JJ,JK) = MAX(MIN(XLBDAS_MAX, 10**(6.226-0.0106*ZT(JI,JJ,JK))),XLBDAS_MIN)*XTRANS_MP_GAMMAS + END IF + END IF + ELSE + ZLBDAS(JI,JJ,JK) = MAX(MIN(XLBDAS_MAX,XLBS*(PRHODREF(JI,JK,JL)*PRST(JI,JK,JL))**XLBEXS),XLBDAS_MIN) + END IF + END DO + END DO +END DO ! !------------------------------------------------------------------------------- ! @@ -600,6 +624,7 @@ IF(.NOT. LSEDIM_AFTER) THEN CALL ICE4_SEDIMENTATION_STAT(IIB, IIE, KIT, IJB, IJE, KJT, IKB, IKE, IKTB, IKTE, KKT, KKL, & &PTSTEP, KRR, OSEDIC, LDEPOSC, XVDEPOSC, PDZZ, & &PRHODREF, PPABST, PTHT, PRHODJ, & + &ZLBDAS, & &PRCS, PRCS*PTSTEP, PRRS, PRRS*PTSTEP, PRIS, PRIS*PTSTEP,& &PRSS, PRSS*PTSTEP, PRGS, PRGS*PTSTEP,& &PINPRC, PINDEP, PINPRR, ZINPRI, PINPRS, PINPRG, & @@ -609,6 +634,7 @@ IF(.NOT. LSEDIM_AFTER) THEN CALL ICE4_SEDIMENTATION_STAT(IIB, IIE, KIT, IJB, IJE, KJT, IKB, IKE, IKTB, IKTE, KKT, KKL, & &PTSTEP, KRR, OSEDIC, LDEPOSC, XVDEPOSC, PDZZ, & &PRHODREF, PPABST, PTHT, PRHODJ, & + &ZLBDAS, & &PRCS, PRCS*PTSTEP, PRRS, PRRS*PTSTEP, PRIS, PRIS*PTSTEP,& &PRSS, PRSS*PTSTEP, PRGS, PRGS*PTSTEP,& &PINPRC, PINDEP, PINPRR, ZINPRI, PINPRS, PINPRG, & @@ -623,6 +649,7 @@ IF(.NOT. LSEDIM_AFTER) THEN CALL ICE4_SEDIMENTATION_SPLIT(IIB, IIE, KIT, IJB, IJE, KJT, IKB, IKE, IKTB, IKTE, KKT, KKL, & &PTSTEP, KRR, OSEDIC, LDEPOSC, XVDEPOSC, PDZZ, & &PRHODREF, PPABST, PTHT, PRHODJ, & + &ZLBDAS, & &PRCS, PRCT, PRRS, PRRT, PRIS, PRIT, PRSS, PRST, PRGS, PRGT,& &PINPRC, PINDEP, PINPRR, ZINPRI, PINPRS, PINPRG, & &PSEA=PSEA, PTOWN=PTOWN, & @@ -631,6 +658,7 @@ IF(.NOT. LSEDIM_AFTER) THEN CALL ICE4_SEDIMENTATION_SPLIT(IIB, IIE, KIT, IJB, IJE, KJT, IKB, IKE, IKTB, IKTE, KKT, KKL, & &PTSTEP, KRR, OSEDIC, LDEPOSC, XVDEPOSC, PDZZ, & &PRHODREF, PPABST, PTHT, PRHODJ, & + &ZLBDAS, & &PRCS, PRCT, PRRS, PRRT, PRIS, PRIT, PRSS, PRST, PRGS, PRGT,& &PINPRC, PINDEP, PINPRR, ZINPRI, PINPRS, PINPRG, & &PSEA=PSEA, PTOWN=PTOWN, & @@ -1684,6 +1712,7 @@ IF(LSEDIM_AFTER) THEN CALL ICE4_SEDIMENTATION_STAT(IIB, IIE, KIT, IJB, IJE, KJT, IKB, IKE, IKTB, IKTE, KKT, KKL, & &PTSTEP, KRR, OSEDIC, LDEPOSC, XVDEPOSC, PDZZ, & &PRHODREF, PPABST, PTHT, PRHODJ, & + &ZLBDAS, & &PRCS, PRCS*PTSTEP, PRRS, PRRS*PTSTEP, PRIS, PRIS*PTSTEP,& &PRSS, PRSS*PTSTEP, PRGS, PRGS*PTSTEP,& &PINPRC, PINDEP, PINPRR, ZINPRI, PINPRS, PINPRG, & @@ -1693,6 +1722,7 @@ IF(LSEDIM_AFTER) THEN CALL ICE4_SEDIMENTATION_STAT(IIB, IIE, KIT, IJB, IJE, KJT, IKB, IKE, IKTB, IKTE, KKT, KKL, & &PTSTEP, KRR, OSEDIC, LDEPOSC, XVDEPOSC, PDZZ,& &PRHODREF, PPABST, PTHT, PRHODJ, & + &ZLBDAS, & &PRCS, PRCS*PTSTEP, PRRS, PRRS*PTSTEP, PRIS, PRIS*PTSTEP,& &PRSS, PRSS*PTSTEP, PRGS, PRGS*PTSTEP,& &PINPRC, PINDEP, PINPRR, ZINPRI, PINPRS, PINPRG, & @@ -1707,6 +1737,7 @@ IF(LSEDIM_AFTER) THEN CALL ICE4_SEDIMENTATION_SPLIT(IIB, IIE, KIT, IJB, IJE, KJT, IKB, IKE, IKTB, IKTE, KKT, KKL, & &PTSTEP, KRR, OSEDIC, LDEPOSC, XVDEPOSC, PDZZ, & &PRHODREF, PPABST, PTHT, PRHODJ, & + &ZLBDAS, & &PRCS, PRCT, PRRS, PRRT, PRIS, PRIT, PRSS, PRST, PRGS, PRGT,& &PINPRC, PINDEP, PINPRR, ZINPRI, PINPRS, PINPRG, & &PSEA=PSEA, PTOWN=PTOWN, & @@ -1715,6 +1746,7 @@ IF(LSEDIM_AFTER) THEN CALL ICE4_SEDIMENTATION_SPLIT(IIB, IIE, KIT, IJB, IJE, KJT, IKB, IKE, IKTB, IKTE, KKT, KKL, & &PTSTEP, KRR, OSEDIC, LDEPOSC, XVDEPOSC, PDZZ, & &PRHODREF, PPABST, PTHT, PRHODJ, & + &ZLBDAS, & &PRCS, PRCT, PRRS, PRRT, PRIS, PRIT, PRSS, PRST, PRGS, PRGT,& &PINPRC, PINDEP, PINPRR, ZINPRI, PINPRS, PINPRG, & &PSEA=PSEA, PTOWN=PTOWN, & diff --git a/src/MNH/read_exsegn.f90 b/src/MNH/read_exsegn.f90 index 9db15fc163ad08c775913431fff5c97226d3839e..6876f2f46d87e93b9a180522e17cc1f9d92f43b1 100644 --- a/src/MNH/read_exsegn.f90 +++ b/src/MNH/read_exsegn.f90 @@ -1606,6 +1606,20 @@ ELSE END IF END IF ! +IF (LUSERI.AND. (.NOT.OUSERI)) THEN + WRITE(UNIT=ILUOUT,FMT=9001) KMI + WRITE(UNIT=ILUOUT,FMT=*) 'THE ICE CLOUD FRACTION WILL BE INITIALIZED ACCORDING' + WRITE(UNIT=ILUOUT,FMT=*) 'TO CLOUD MIXING RATIO VALUE OR SET TO 0' + CGETICEFR = 'INIT' +ELSE + IF ( LUSERI ) THEN + CGETICEFR = 'READ' + IF ( (CCONF=='START') .AND. CPROGRAM /= 'DIAG') CGETICEFR='INIT' + ELSE + CGETICEFR = 'SKIP' + END IF +END IF +! IF(CTURBLEN=='RM17' .OR. CTURBLEN=='ADAP') THEN XCEDIS=0.34 ELSE diff --git a/src/MNH/read_field.f90 b/src/MNH/read_field.f90 index f7ccb114e6c605c3aad6f3585688b88e4f2b6b8b..d83171513705eb2621407b89d55801859dcf9749 100644 --- a/src/MNH/read_field.f90 +++ b/src/MNH/read_field.f90 @@ -11,7 +11,7 @@ INTERFACE ! SUBROUTINE READ_FIELD(KOCEMI,TPINIFILE,KIU,KJU,KKU, & HGETTKET,HGETRVT,HGETRCT,HGETRRT,HGETRIT,HGETCIT,HGETZWS, & - HGETRST,HGETRGT,HGETRHT,HGETSVT,HGETSRCT,HGETSIGS,HGETCLDFR, & + HGETRST,HGETRGT,HGETRHT,HGETSVT,HGETSRCT,HGETSIGS,HGETCLDFR,HGETICEFR, & HGETBL_DEPTH,HGETSBL_DEPTH,HGETPHC,HGETPHR,HUVW_ADV_SCHEME, & HTEMP_SCHEME,KSIZELBX_ll,KSIZELBXU_ll,KSIZELBY_ll,KSIZELBYV_ll, & KSIZELBXTKE_ll,KSIZELBYTKE_ll, & @@ -19,7 +19,7 @@ INTERFACE PUM,PVM,PWM,PDUM,PDVM,PDWM, & PUT,PVT,PWT,PTHT,PPABST,PTKET,PRTKEMS, & PRT,PSVT,PZWS,PCIT,PDRYMASST,PDRYMASSS, & - PSIGS,PSRCT,PCLDFR,PBL_DEPTH,PSBL_DEPTH,PWTHVMF,PPHC,PPHR, & + PSIGS,PSRCT,PCLDFR,PICEFR,PBL_DEPTH,PSBL_DEPTH,PWTHVMF,PPHC,PPHR, & PLSUM,PLSVM,PLSWM,PLSTHM,PLSRVM, PLSZWSM, & PLBXUM,PLBXVM,PLBXWM,PLBXTHM,PLBXTKEM,PLBXRM,PLBXSVM, & PLBYUM,PLBYVM,PLBYWM,PLBYTHM,PLBYTKEM,PLBYRM,PLBYSVM, & @@ -46,7 +46,7 @@ CHARACTER (LEN=*), INTENT(IN) :: HGETTKET, & HGETRVT,HGETRCT,HGETRRT, & HGETRIT,HGETRST,HGETRGT,HGETRHT, & HGETCIT,HGETSRCT, HGETZWS, & - HGETSIGS,HGETCLDFR,HGETBL_DEPTH, & + HGETSIGS,HGETCLDFR,HGETICEFR,HGETBL_DEPTH, & HGETSBL_DEPTH,HGETPHC,HGETPHR CHARACTER (LEN=*), DIMENSION(:),INTENT(IN) :: HGETSVT ! @@ -85,6 +85,7 @@ REAL, INTENT(OUT) :: PDRYMASSS ! d Md(t) / dt REAL, DIMENSION(:,:,:), INTENT(OUT) :: PSIGS ! =sqrt(<s's'>) for the ! Subgrid Condensation REAL, DIMENSION(:,:,:), INTENT(OUT) :: PCLDFR ! cloud fraction +REAL, DIMENSION(:,:,:), INTENT(OUT) :: PICEFR ! cloud fraction REAL, DIMENSION(:,:,:), INTENT(OUT) :: PPHC ! pH value in cloud water REAL, DIMENSION(:,:,:), INTENT(OUT) :: PPHR ! pH value in rainwater ! Larger Scale fields @@ -135,7 +136,7 @@ END MODULE MODI_READ_FIELD ! ######################################################################## SUBROUTINE READ_FIELD(KOCEMI,TPINIFILE,KIU,KJU,KKU, & HGETTKET,HGETRVT,HGETRCT,HGETRRT,HGETRIT,HGETCIT,HGETZWS, & - HGETRST,HGETRGT,HGETRHT,HGETSVT,HGETSRCT,HGETSIGS,HGETCLDFR, & + HGETRST,HGETRGT,HGETRHT,HGETSVT,HGETSRCT,HGETSIGS,HGETCLDFR,HGETICEFR, & HGETBL_DEPTH,HGETSBL_DEPTH,HGETPHC,HGETPHR,HUVW_ADV_SCHEME, & HTEMP_SCHEME,KSIZELBX_ll,KSIZELBXU_ll,KSIZELBY_ll,KSIZELBYV_ll, & KSIZELBXTKE_ll,KSIZELBYTKE_ll, & @@ -143,7 +144,7 @@ END MODULE MODI_READ_FIELD PUM,PVM,PWM,PDUM,PDVM,PDWM, & PUT,PVT,PWT,PTHT,PPABST,PTKET,PRTKEMS, & PRT,PSVT,PZWS,PCIT,PDRYMASST,PDRYMASSS, & - PSIGS,PSRCT,PCLDFR,PBL_DEPTH,PSBL_DEPTH,PWTHVMF,PPHC,PPHR, & + PSIGS,PSRCT,PCLDFR,PICEFR,PBL_DEPTH,PSBL_DEPTH,PWTHVMF,PPHC,PPHR, & PLSUM,PLSVM,PLSWM,PLSTHM,PLSRVM,PLSZWSM, & PLBXUM,PLBXVM,PLBXWM,PLBXTHM,PLBXTKEM,PLBXRM,PLBXSVM, & PLBYUM,PLBYVM,PLBYWM,PLBYTHM,PLBYTKEM,PLBYRM,PLBYSVM, & @@ -325,7 +326,7 @@ CHARACTER (LEN=*), INTENT(IN) :: HGETTKET, & HGETRVT,HGETRCT,HGETRRT, & HGETRIT,HGETRST,HGETRGT,HGETRHT, & HGETCIT,HGETSRCT,HGETZWS, & - HGETSIGS,HGETCLDFR,HGETBL_DEPTH, & + HGETSIGS,HGETCLDFR,HGETICEFR,HGETBL_DEPTH, & HGETSBL_DEPTH,HGETPHC,HGETPHR CHARACTER (LEN=*), DIMENSION(:),INTENT(IN) :: HGETSVT ! @@ -366,6 +367,7 @@ REAL, INTENT(OUT) :: PDRYMASSS ! d Md(t) / dt REAL, DIMENSION(:,:,:), INTENT(OUT) :: PSIGS ! =sqrt(<s's'>) for the ! Subgrid Condensation REAL, DIMENSION(:,:,:), INTENT(OUT) :: PCLDFR ! cloud fraction +REAL, DIMENSION(:,:,:), INTENT(OUT) :: PICEFR ! cloud fraction REAL, DIMENSION(:,:,:), INTENT(OUT) :: PPHC ! pH value in cloud water REAL, DIMENSION(:,:,:), INTENT(OUT) :: PPHR ! pH value in rainwater ! @@ -1520,6 +1522,22 @@ IF(HGETCLDFR=='INIT' .OR. IRESP /= 0) THEN ENDIF ENDIF ! +IRESP=0 +IF(HGETICEFR=='READ') THEN ! cloud fraction + CALL IO_Field_read(TPINIFILE,'ICEFR',PICEFR,IRESP) +ENDIF +IF(HGETCLDFR=='INIT' .OR. IRESP /= 0) THEN + IF(SIZE(PRT,4) > 3) THEN + WHERE(PRT(:,:,:,4) > 1.E-30) + PICEFR(:,:,:) = 1. + ELSEWHERE + PICEFR(:,:,:) = 0. + ENDWHERE + ELSE + PICEFR(:,:,:) = 0. + ENDIF +ENDIF +! !* boundary layer depth ! IF (HGETBL_DEPTH=='READ') THEN diff --git a/src/MNH/resolved_cloud.f90 b/src/MNH/resolved_cloud.f90 index 30616e6c57314d97e5f5e032bf5f4b6e77d89c87..74b043a45a0b52d100a572be84266ba5b596e2e8 100644 --- a/src/MNH/resolved_cloud.f90 +++ b/src/MNH/resolved_cloud.f90 @@ -14,7 +14,7 @@ INTERFACE PTSTEP, PZZ, PRHODJ, PRHODREF, PEXNREF, & PPABST, PTHT, PRT, PSIGS, PSIGQSAT, PMFCONV, & PTHM, PRCM, PPABSM, & - PW_ACT,PDTHRAD, PTHS, PRS, PSVT, PSVS, PSRCS, PCLDFR,& + PW_ACT,PDTHRAD, PTHS, PRS, PSVT, PSVS, PSRCS, PCLDFR, PICEFR,& PCIT, OSEDIC, OACTIT, OSEDC, OSEDI, & ORAIN, OWARM, OHHONI, OCONVHG, & PCF_MF,PRC_MF, PRI_MF, & @@ -83,6 +83,7 @@ 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) :: PICEFR! Cloud fraction REAL, DIMENSION(:,:,:), INTENT(INOUT) :: PCIT ! Pristine ice number ! concentration at time t LOGICAL, INTENT(IN) :: OSEDIC! Switch to activate the @@ -152,7 +153,7 @@ END MODULE MODI_RESOLVED_CLOUD PTSTEP, PZZ, PRHODJ, PRHODREF, PEXNREF, & PPABST, PTHT, PRT, PSIGS, PSIGQSAT, PMFCONV, & PTHM, PRCM, PPABSM, & - PW_ACT,PDTHRAD, PTHS, PRS, PSVT, PSVS, PSRCS, PCLDFR,& + PW_ACT,PDTHRAD, PTHS, PRS, PSVT, PSVS, PSRCS, PCLDFR,PICEFR,& PCIT, OSEDIC, OACTIT, OSEDC, OSEDI, & ORAIN, OWARM, OHHONI, OCONVHG, & PCF_MF,PRC_MF, PRI_MF, & @@ -382,6 +383,7 @@ 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) :: PICEFR! Cloud fraction REAL, DIMENSION(:,:,:), INTENT(INOUT) :: PCIT ! Pristine ice number ! concentration at time t LOGICAL, INTENT(IN) :: OSEDIC! Switch to activate the @@ -474,9 +476,6 @@ INTEGER :: JMOD, JMOD_IFN LOGICAL :: GWEST,GEAST,GNORTH,GSOUTH ! BVIE work array waiting for PINPRI REAL, DIMENSION(SIZE(PZZ,1),SIZE(PZZ,2)):: ZINPRI -REAL, DIMENSION(SIZE(PZZ,1),SIZE(PZZ,2),SIZE(PZZ,3)):: ZICEFR -REAL, DIMENSION(SIZE(PZZ,1),SIZE(PZZ,2),SIZE(PZZ,3)):: ZPRCFR -REAL, DIMENSION(SIZE(PZZ,1),SIZE(PZZ,2),SIZE(PZZ,3)):: ZTM ! !------------------------------------------------------------------------------ ! @@ -939,7 +938,7 @@ SELECT CASE ( HCLOUD ) PSVT(:,:,:,NSV_LIMA_BEG:NSV_LIMA_END), PW_ACT, & PTHS, PRS, PSVS(:,:,:,NSV_LIMA_BEG:NSV_LIMA_END), & PINPRC, PINDEP, PINPRR, ZINPRI, PINPRS, PINPRG, PINPRH, & - PEVAP3D, PCLDFR, ZICEFR, ZPRCFR ) + PEVAP3D, PCLDFR, PICEFR, PRAINFR ) ELSE IF (OWARM) CALL LIMA_WARM(OACTIT, OSEDC, ORAIN, KSPLITR, PTSTEP, KMI, & @@ -973,7 +972,7 @@ SELECT CASE ( HCLOUD ) PTSTEP, PRHODJ, PPABSM, PPABST, PRHODREF, PEXNREF, PZZ, & PTHT,PRT, PSVT(:,:,:,NSV_LIMA_BEG:NSV_LIMA_END), & PTHS,PRS, PSVS(:,:,:,NSV_LIMA_BEG:NSV_LIMA_END), & - PCLDFR, PSRCS ) + PCLDFR, PICEFR, PRAINFR, PSRCS ) ELSE IF (LPTSPLIT) THEN CALL LIMA_ADJUST_SPLIT(KRR, KMI, TPFILE, CCONDENS, CLAMBDA3, & OSUBG_COND, OSIGMAS, PTSTEP, PSIGQSAT, & @@ -981,14 +980,14 @@ SELECT CASE ( HCLOUD ) PDTHRAD, PW_ACT, & PRT, PRS, PSVT(:,:,:,NSV_LIMA_BEG:NSV_LIMA_END), & PSVS(:,:,:,NSV_LIMA_BEG:NSV_LIMA_END), & - PTHS, PSRCS, PCLDFR, PRC_MF, PCF_MF ) + PTHS, PSRCS, PCLDFR, PICEFR, PRC_MF, PRI_MF, PCF_MF ) ELSE CALL LIMA_ADJUST(KRR, KMI, TPFILE, & OSUBG_COND, PTSTEP, & PRHODREF, PRHODJ, PEXNREF, PPABST, PPABST, & PRT, PRS, PSVT(:,:,:,NSV_LIMA_BEG:NSV_LIMA_END), & PSVS(:,:,:,NSV_LIMA_BEG:NSV_LIMA_END), & - PTHS, PSRCS, PCLDFR ) + PTHS, PSRCS, PCLDFR, PICEFR, PRAINFR ) ENDIF ! END SELECT diff --git a/src/MNH/rrcolss.f90 b/src/MNH/rrcolss.f90 index 527165111ecf4d225ce5ec0117c09846d2116b9e..7be9a8af4b13f889e15c5592330ec49db74e0d6f 100644 --- a/src/MNH/rrcolss.f90 +++ b/src/MNH/rrcolss.f90 @@ -10,7 +10,7 @@ INTERFACE ! SUBROUTINE RRCOLSS( KND, PALPHAS, PNUS, PALPHAR, PNUR, & - PESR, PEXMASSR, PFALLS, PEXFALLS, PFALLR, PEXFALLR, & + PESR, PEXMASSR, PFALLS, PEXFALLS, PFALLEXPS, PFALLR, PEXFALLR, & PLBDASMAX, PLBDARMAX, PLBDASMIN, PLBDARMIN, & PDINFTY, PRRCOLSS, PAG, PBS, PAS ) ! @@ -28,6 +28,7 @@ REAL, INTENT(IN) :: PESR ! Efficiency of aggregates collecting rain REAL, INTENT(IN) :: PEXMASSR ! Mass exponent of rain REAL, INTENT(IN) :: PFALLS ! Fall speed constant of aggregates REAL, INTENT(IN) :: PEXFALLS ! Fall speed exponent of aggregates +REAL, INTENT(IN) :: PFALLEXPS ! Fall speed exponential of aggregates (Thompson 2008) REAL, INTENT(IN) :: PFALLR ! Fall speed constant of rain REAL, INTENT(IN) :: PEXFALLR ! Fall speed exponent of rain REAL, INTENT(IN) :: PLBDASMAX ! Maximun slope of size distribution of aggregates @@ -49,7 +50,7 @@ END INTERFACE END MODULE MODI_RRCOLSS ! ######################################################################## SUBROUTINE RRCOLSS( KND, PALPHAS, PNUS, PALPHAR, PNUR, & - PESR, PEXMASSR, PFALLS, PEXFALLS, PFALLR, PEXFALLR, & + PESR, PEXMASSR, PFALLS, PEXFALLS, PFALLEXPS, PFALLR, PEXFALLR, & PLBDASMAX, PLBDARMAX, PLBDASMIN, PLBDARMIN, & PDINFTY, PRRCOLSS, PAG, PBS, PAS ) ! ######################################################################## @@ -117,6 +118,7 @@ END INTERFACE !! Original 8/11/95 !! ! P. Wautelet 26/04/2019: replace non-standard FLOAT function by REAL function +! J. Wurtz 03/2022: new snow characteristics ! !------------------------------------------------------------------------------- ! @@ -151,6 +153,7 @@ REAL, INTENT(IN) :: PESR ! Efficiency of aggregates collecting rain REAL, INTENT(IN) :: PEXMASSR ! Mass exponent of rain REAL, INTENT(IN) :: PFALLS ! Fall speed constant of aggregates REAL, INTENT(IN) :: PEXFALLS ! Fall speed exponent of aggregates +REAL, INTENT(IN) :: PFALLEXPS ! Fall speed exponential of aggregates (Thompson 2008) REAL, INTENT(IN) :: PFALLR ! Fall speed constant of rain REAL, INTENT(IN) :: PEXFALLR ! Fall speed exponent of rain REAL, INTENT(IN) :: PLBDASMAX ! Maximun slope of size distribution of aggregates @@ -277,11 +280,11 @@ DO JLBDAS = 1,SIZE(PRRCOLSS(:,:),1) DO JDR = 1,INR-1 ZDR = ZDDCOLLR * REAL(JDR) ZCOLLR = ZCOLLR + (ZDS+ZDR)**2 * ZDR**PEXMASSR & - * PESR * ABS(PFALLS*ZDS**PEXFALLS-PFALLR*ZDR**PEXFALLR) & + * PESR * ABS(PFALLS*ZDS**PEXFALLS * EXP(-(PFALLEXPS*XDS)**PALPHAS)-PFALLR*ZDR**PEXFALLR) & * GENERAL_GAMMA(PALPHAR,PNUR,ZLBDAR,ZDR) END DO ZCOLLDRMAX = (ZDS+ZDRMAX)**2 * ZDRMAX**PEXMASSR & - * PESR * ABS(PFALLS*ZDS**PEXFALLS-PFALLR*ZDRMAX**PEXFALLR) & + * PESR * ABS(PFALLS*ZDS**PEXFALLS* EXP(-(PFALLEXPS*XDS)**PALPHAS)-PFALLR*ZDRMAX**PEXFALLR) & * GENERAL_GAMMA(PALPHAR,PNUR,ZLBDAR,ZDRMAX) ZCOLLR = (ZCOLLR + 0.5*ZCOLLDRMAX)*(ZDDCOLLR/ZDDSCALR) ! diff --git a/src/MNH/rscolrg.f90 b/src/MNH/rscolrg.f90 index caa868e91d39cbe12010bfa2c265ffe35304dba4..210df03805b8189e969d1712d411b6f7540e07d8 100644 --- a/src/MNH/rscolrg.f90 +++ b/src/MNH/rscolrg.f90 @@ -10,7 +10,7 @@ INTERFACE ! SUBROUTINE RSCOLRG( KND, PALPHAS, PZNUS, PALPHAR, PNUR, & - PESR, PEXMASSS, PFALLS, PEXFALLS, PFALLR, PEXFALLR, & + PESR, PEXMASSS, PFALLS, PEXFALLS, PFALLEXPS, PFALLR, PEXFALLR, & PLBDASMAX, PLBDARMAX, PLBDASMIN, PLBDARMIN, & PDINFTY, PRSCOLRG,PAG, PBS, PAS ) ! @@ -28,6 +28,7 @@ REAL, INTENT(IN) :: PESR ! Efficiency of the aggregates collecting rain REAL, INTENT(IN) :: PEXMASSS ! Mass exponent of the aggregates REAL, INTENT(IN) :: PFALLS ! Fall speed constant of the aggregates REAL, INTENT(IN) :: PEXFALLS ! Fall speed exponent of the aggregates +REAL, INTENT(IN) :: PFALLEXPS ! Fall speed exponential constant of the aggregates REAL, INTENT(IN) :: PFALLR ! Fall speed constant of rain REAL, INTENT(IN) :: PEXFALLR ! Fall speed exponent of rain REAL, INTENT(IN) :: PLBDASMAX ! Maximun slope of size distribution of the aggregates @@ -49,7 +50,7 @@ END INTERFACE END MODULE MODI_RSCOLRG ! ######################################################################## SUBROUTINE RSCOLRG( KND, PALPHAS, PZNUS, PALPHAR, PNUR, & - PESR, PEXMASSS, PFALLS, PEXFALLS, PFALLR, PEXFALLR, & + PESR, PEXMASSS, PFALLS, PEXFALLS, PFALLEXPS, PFALLR, PEXFALLR, & PLBDASMAX, PLBDARMAX, PLBDASMIN, PLBDARMIN, & PDINFTY, PRSCOLRG,PAG, PBS, PAS ) ! ######################################################################## @@ -117,6 +118,7 @@ END INTERFACE !! Original 8/11/95 !! ! P. Wautelet 26/04/2019: replace non-standard FLOAT function by REAL function +! J. Wurtz 03/2022: new snow characteristics ! !------------------------------------------------------------------------------- ! @@ -149,6 +151,7 @@ REAL, INTENT(IN) :: PESR ! Efficiency of the aggregates collecting rain REAL, INTENT(IN) :: PEXMASSS ! Mass exponent of the aggregates REAL, INTENT(IN) :: PFALLS ! Fall speed constant of the aggregates REAL, INTENT(IN) :: PEXFALLS ! Fall speed exponent of the aggregates +REAL, INTENT(IN) :: PFALLEXPS ! Fall speed exponential constant of the aggregates REAL, INTENT(IN) :: PFALLR ! Fall speed constant of rain REAL, INTENT(IN) :: PEXFALLR ! Fall speed exponent of rain REAL, INTENT(IN) :: PLBDASMAX ! Maximun slope of size distribution of the aggregates @@ -271,12 +274,12 @@ DO JLBDAR = 1,SIZE(PRSCOLRG(:,:),1) ZDR = ZDDCOLLR * REAL(JDR) + ZDRMIN ZCOLLR = ZCOLLR + (ZDS+ZDR)**2 & * GENERAL_GAMMA(PALPHAR,PNUR,ZLBDAR,ZDR) & - * PESR * ABS(PFALLS*ZDS**PEXFALLS-PFALLR*ZDR**PEXFALLR) + * PESR * ABS(PFALLS*ZDS**PEXFALLS*EXP(-(ZDS*PFALLEXPS)**PALPHAS)-PFALLR*ZDR**PEXFALLR) END DO IF( ZDRMIN>0.0 ) THEN ZCOLLDRMIN = (ZDS+ZDRMIN)**2 & * GENERAL_GAMMA(PALPHAR,PNUR,ZLBDAR,ZDRMIN) & - * PESR * ABS(PFALLS*ZDS**PEXFALLS-PFALLR*ZDRMIN**PEXFALLR) + * PESR * ABS(PFALLS*ZDS**PEXFALLS*EXP(-(ZDS*PFALLEXPS)**PALPHAS)-PFALLR*ZDRMIN**PEXFALLR) ELSE ZCOLLDRMIN = 0.0 END IF diff --git a/src/MNH/rzcolx.f90 b/src/MNH/rzcolx.f90 index 28658241cf1021a29de694cd5a99b85e9c3340d9..de0fc723a1598394e512fafa67b808ff469ad670 100644 --- a/src/MNH/rzcolx.f90 +++ b/src/MNH/rzcolx.f90 @@ -10,7 +10,8 @@ INTERFACE ! SUBROUTINE RZCOLX( KND, PALPHAX, PNUX, PALPHAZ, PNUZ, & - PEXZ, PEXMASSZ, PFALLX, PEXFALLX, PFALLZ, PEXFALLZ, & + PEXZ, PEXMASSZ, PFALLX, PEXFALLX, PFALLEXPX, & + PFALLZ, PEXFALLZ, PFALLEXPZ, & PLBDAXMAX, PLBDAZMAX, PLBDAXMIN, PLBDAZMIN, & PDINFTY, PRZCOLX ) ! @@ -29,8 +30,10 @@ REAL, INTENT(IN) :: PEXZ ! Efficiency of specy X collecting specy Z REAL, INTENT(IN) :: PEXMASSZ ! Mass exponent of specy Z REAL, INTENT(IN) :: PFALLX ! Fall speed constant of specy X REAL, INTENT(IN) :: PEXFALLX ! Fall speed exponent of specy X +REAL, INTENT(IN) :: PFALLEXPX ! Fall speed exponential constant of specy X REAL, INTENT(IN) :: PFALLZ ! Fall speed constant of specy Z REAL, INTENT(IN) :: PEXFALLZ ! Fall speed exponent of specy Z +REAL, INTENT(IN) :: PFALLEXPZ ! Fall speed exponential constant of specy Z REAL, INTENT(IN) :: PLBDAXMAX ! Maximun slope of size distribution of specy X REAL, INTENT(IN) :: PLBDAZMAX ! Maximun slope of size distribution of specy Z REAL, INTENT(IN) :: PLBDAXMIN ! Minimun slope of size distribution of specy X @@ -49,7 +52,8 @@ END INTERFACE END MODULE MODI_RZCOLX ! ######################################################################## SUBROUTINE RZCOLX( KND, PALPHAX, PNUX, PALPHAZ, PNUZ, & - PEXZ, PEXMASSZ, PFALLX, PEXFALLX, PFALLZ, PEXFALLZ, & + PEXZ, PEXMASSZ, PFALLX, PEXFALLX, PFALLEXPX, & + PFALLZ, PEXFALLZ, PFALLEXPZ, & PLBDAXMAX, PLBDAZMAX, PLBDAXMIN, PLBDAZMIN, & PDINFTY, PRZCOLX ) ! ######################################################################## @@ -121,6 +125,7 @@ END INTERFACE !! Original 8/11/95 !! ! P. Wautelet 26/04/2019: replace non-standard FLOAT function by REAL function +! J. Wurtz 03/2022: new snow characteristics ! !------------------------------------------------------------------------------- ! @@ -152,8 +157,10 @@ REAL, INTENT(IN) :: PEXZ ! Efficiency of specy X collecting specy Z REAL, INTENT(IN) :: PEXMASSZ ! Mass exponent of specy Z REAL, INTENT(IN) :: PFALLX ! Fall speed constant of specy X REAL, INTENT(IN) :: PEXFALLX ! Fall speed exponent of specy X +REAL, INTENT(IN) :: PFALLEXPX ! Fall speed exponential constant of specy X REAL, INTENT(IN) :: PFALLZ ! Fall speed constant of specy Z REAL, INTENT(IN) :: PEXFALLZ ! Fall speed exponent of specy Z +REAL, INTENT(IN) :: PFALLEXPZ ! Fall speed exponential constant of specy Z REAL, INTENT(IN) :: PLBDAXMAX ! Maximun slope of size distribution of specy X REAL, INTENT(IN) :: PLBDAZMAX ! Maximun slope of size distribution of specy Z REAL, INTENT(IN) :: PLBDAXMIN ! Minimun slope of size distribution of specy X @@ -234,20 +241,20 @@ DO JLBDAX = 1,SIZE(PRZCOLX(:,:),1) ZSCALZ = 0.0 ZCOLLZ = 0.0 DO JDZ = 1,KND-1 - ZDZ = ZDDZ * REAL(JDZ) + ZDZ = ZDDZ * REAL(JDZ) ! !* 1.6 Compute the normalization factor by integration over the ! dimensional spectrum of specy Z ! - ZFUNC = (ZDX+ZDZ)**2 * ZDZ**PEXMASSZ & - * GENERAL_GAMMA(PALPHAZ,PNUZ,ZLBDAZ,ZDZ) - ZSCALZ = ZSCALZ + ZFUNC + ZFUNC = (ZDX+ZDZ)**2 * ZDZ**PEXMASSZ & + * GENERAL_GAMMA(PALPHAZ,PNUZ,ZLBDAZ,ZDZ) + ZSCALZ = ZSCALZ + ZFUNC ! !* 1.7 Compute the scaled fall speed difference by integration over ! the dimensional spectrum of specy Z ! - ZCOLLZ = ZCOLLZ + ZFUNC & - * PEXZ * ABS(PFALLX*ZDX**PEXFALLX-PFALLZ*ZDZ**PEXFALLZ) + ZCOLLZ = ZCOLLZ + ZFUNC * PEXZ * ABS( PFALLX*ZDX**PEXFALLX * EXP(-(ZDX*PFALLEXPX)**PALPHAX) & + - PFALLZ*ZDZ**PEXFALLZ * EXP(-(ZDZ*PFALLEXPZ)**PALPHAZ)) END DO ! !* 1.8 Compute the normalization factor by integration over the diff --git a/src/MNH/write_lesn.f90 b/src/MNH/write_lesn.f90 index e4adb2045bd0fc24bbcf5f685c34fd7051a53ba7..d1fedaada44a7c8cbbd0ce15dcc9358a6c038d15 100644 --- a/src/MNH/write_lesn.f90 +++ b/src/MNH/write_lesn.f90 @@ -87,6 +87,7 @@ use modd_grid_n, only: xdxhat, xdyhat use modd_nsv, only: nsv use modd_les use modd_les_n +use modd_param_n, only: ccloud use modd_param_c2r2, only: ldepoc use modd_param_ice, only: ldeposc use modd_parameters, only: XUNDEF @@ -126,6 +127,7 @@ INTEGER :: IMI ! Current model inde ! IF (.NOT. LLES) RETURN ! +! !* 1. Initializations ! --------------- ! @@ -355,6 +357,8 @@ if ( luserr ) & call Les_diachro_write( tpdiafile, XLES_MEAN_RF, 'MEAN_RF', 'Mean RF Profile', '1', ymasks ) if ( luseri ) & call Les_diachro_write( tpdiafile, XLES_MEAN_Ri, 'MEAN_RI', 'Mean Ri Profile', 'kg kg-1', ymasks ) +if ( luseri ) & +call Les_diachro_write( tpdiafile, XLES_MEAN_If, 'MEAN_IF', 'Mean If Profile', '1', ymasks ) if ( lusers ) & call Les_diachro_write( tpdiafile, XLES_MEAN_Rs, 'MEAN_RS', 'Mean Rs Profile', 'kg kg-1', ymasks ) if ( luserg ) & diff --git a/src/MNH/write_lfifm1_for_diag.f90 b/src/MNH/write_lfifm1_for_diag.f90 index 0a16f3078ac75dfbe27e09ebcd0088176eb15fbe..7ca40d7a41b47f6939a81a3d9e56f935f12a9457 100644 --- a/src/MNH/write_lfifm1_for_diag.f90 +++ b/src/MNH/write_lfifm1_for_diag.f90 @@ -3926,20 +3926,20 @@ IF (LLIDAR) THEN ZTMP3(:,:,:,1)=ZSIG_DST(:,:,:,IACCMODE) SELECT CASE ( CCLOUD ) CASE('KESS''ICE3','ICE4') - CALL LIDAR(CCLOUD, YVIEW, XALT_LIDAR, XWVL_LIDAR, XZZ, XRHODREF, XCLDFR, & + CALL LIDAR(CCLOUD, YVIEW, XALT_LIDAR, XWVL_LIDAR, XZZ, XRHODREF, ZTEMP, XCLDFR, & XRT, ZWORK31, ZWORK32, & PDSTC=ZTMP1, & PDSTD=ZTMP2, & PDSTS=ZTMP3) CASE('C2R2') - CALL LIDAR(CCLOUD, YVIEW, XALT_LIDAR, XWVL_LIDAR, XZZ, XRHODREF, XCLDFR, & + CALL LIDAR(CCLOUD, YVIEW, XALT_LIDAR, XWVL_LIDAR, XZZ, XRHODREF, ZTEMP, XCLDFR, & XRT, ZWORK31, ZWORK32, & PCT=XSVT(:,:,:,NSV_C2R2BEG+1:NSV_C2R2END), & PDSTC=ZTMP1, & PDSTD=ZTMP2, & PDSTS=ZTMP3) CASE('C3R5') - CALL LIDAR(CCLOUD, YVIEW, XALT_LIDAR, XWVL_LIDAR, XZZ, XRHODREF, XCLDFR, & + CALL LIDAR(CCLOUD, YVIEW, XALT_LIDAR, XWVL_LIDAR, XZZ, XRHODREF, ZTEMP, XCLDFR, & XRT, ZWORK31, ZWORK32, & PCT=XSVT(:,:,:,NSV_C2R2BEG+1:NSV_C1R3END-1), & PDSTC=ZTMP1, & @@ -3953,7 +3953,7 @@ IF (LLIDAR) THEN ZTMP4(:,:,:,3)=XSVT(:,:,:,NSV_LIMA_NR) ZTMP4(:,:,:,4)=XSVT(:,:,:,NSV_LIMA_NI) ! - CALL LIDAR(CCLOUD, YVIEW, XALT_LIDAR, XWVL_LIDAR, XZZ, XRHODREF, XCLDFR,& + CALL LIDAR(CCLOUD, YVIEW, XALT_LIDAR, XWVL_LIDAR, XZZ, XRHODREF, ZTEMP, MAX(XCLDFR,XICEFR),& XRT, ZWORK31, ZWORK32, & PCT=ZTMP4, & PDSTC=ZTMP1, & @@ -3964,14 +3964,14 @@ IF (LLIDAR) THEN ELSE SELECT CASE ( CCLOUD ) CASE('KESS','ICE3','ICE4') - CALL LIDAR(CCLOUD, YVIEW, XALT_LIDAR, XWVL_LIDAR, XZZ, XRHODREF, XCLDFR, & + CALL LIDAR(CCLOUD, YVIEW, XALT_LIDAR, XWVL_LIDAR, XZZ, XRHODREF, ZTEMP, XCLDFR, & XRT, ZWORK31, ZWORK32) CASE('C2R2') - CALL LIDAR(CCLOUD, YVIEW, XALT_LIDAR, XWVL_LIDAR, XZZ, XRHODREF, XCLDFR, & + CALL LIDAR(CCLOUD, YVIEW, XALT_LIDAR, XWVL_LIDAR, XZZ, XRHODREF, ZTEMP, XCLDFR, & XRT, ZWORK31, ZWORK32, & PCT=XSVT(:,:,:,NSV_C2R2BEG+1:NSV_C2R2END)) CASE('C3R5') - CALL LIDAR(CCLOUD, YVIEW, XALT_LIDAR, XWVL_LIDAR, XZZ, XRHODREF, XCLDFR, & + CALL LIDAR(CCLOUD, YVIEW, XALT_LIDAR, XWVL_LIDAR, XZZ, XRHODREF, ZTEMP, XCLDFR, & XRT, ZWORK31, ZWORK32, & PCT=XSVT(:,:,:,NSV_C2R2BEG+1:NSV_C1R3END-1)) CASE('LIMA') @@ -3982,7 +3982,7 @@ IF (LLIDAR) THEN ZTMP4(:,:,:,3)=XSVT(:,:,:,NSV_LIMA_NR) ZTMP4(:,:,:,4)=XSVT(:,:,:,NSV_LIMA_NI) ! - CALL LIDAR(CCLOUD, YVIEW, XALT_LIDAR, XWVL_LIDAR, XZZ, XRHODREF, XCLDFR,& + CALL LIDAR(CCLOUD, YVIEW, XALT_LIDAR, XWVL_LIDAR, XZZ, XRHODREF, ZTEMP, MAX(XCLDFR,XICEFR),& XRT, ZWORK31, ZWORK32, & PCT=ZTMP4) END SELECT diff --git a/src/MNH/write_lfifm1_for_diag_supp.f90 b/src/MNH/write_lfifm1_for_diag_supp.f90 index 1bb11e435afd44755eff957d81908fa904554cb6..0175e2c28a7b797264a2578763d00077218aadcd 100644 --- a/src/MNH/write_lfifm1_for_diag_supp.f90 +++ b/src/MNH/write_lfifm1_for_diag_supp.f90 @@ -519,6 +519,7 @@ IF (LCLD_COV .AND. LUSERC) THEN CALL IO_Field_write(TPFILE,TZFIELD,ZWORK22) ! CALL IO_Field_write(TPFILE,'CLDFR',XCLDFR) + CALL IO_Field_write(TPFILE,'ICEFR',XICEFR) ! ! Visibility ! @@ -808,7 +809,7 @@ IF (LEN_TRIM(CRAD_SAT) /= 0 .AND. NRR /=0) THEN CALL RADTR_SATEL( TDTCUR%nyear, TDTCUR%nmonth, TDTCUR%nday, TDTCUR%xtime, & NDLON, NFLEV, NSTATM, NRAD_COLNBR, XEMIS(:,:,1), & XCCO2, XTSRAD, XSTATM, XTHT, XRT, XPABST, XZZ, & - XSIGS, XMFCONV, XCLDFR, LUSERI, LSIGMAS, & + XSIGS, XMFCONV, MAX(XCLDFR,XICEFR), LUSERI, LSIGMAS, & LSUBG_COND, LRAD_SUBG_COND, ZIRBT, ZWVBT, & INDGEO(JI), VSIGQSAT ) ! @@ -848,15 +849,15 @@ IF (NRTTOVINFO(1,1) /= NUNDEF) THEN ! PRINT*,'YOU ASK FOR BRIGHTNESS TEMPERATURE COMPUTED BY THE RTTOV CODE' #ifdef MNH_RTTOV_8 CALL CALL_RTTOV8(NDLON, NFLEV, NSTATM, XEMIS(:,:,1), XTSRAD, XSTATM, XTHT, XRT, & - XPABST, XZZ, XMFCONV, XCLDFR, XUT(:,:,IKB), XVT(:,:,IKB), & + XPABST, XZZ, XMFCONV, MAX(XCLDFR,XICEFR), XUT(:,:,IKB), XVT(:,:,IKB), & LUSERI, NRTTOVINFO, TPFILE ) #elif MNH_RTTOV_11 CALL CALL_RTTOV11(NDLON, NFLEV, XEMIS(:,:,1), XTSRAD, XTHT, XRT, & - XPABST, XZZ, XMFCONV, XCLDFR, XUT(:,:,IKB), XVT(:,:,IKB), & + XPABST, XZZ, XMFCONV, MAX(XCLDFR,XICEFR), XUT(:,:,IKB), XVT(:,:,IKB), & LUSERI, NRTTOVINFO, TPFILE ) #elif MNH_RTTOV_13 CALL CALL_RTTOV13(NDLON, NFLEV, XEMIS(:,:,1), XTSRAD, XTHT, XRT, & - XPABST, XZZ, XMFCONV, XCLDFR, XUT(:,:,IKB), XVT(:,:,IKB), & + XPABST, XZZ, XMFCONV, MAX(XCLDFR,XICEFR), XUT(:,:,IKB), XVT(:,:,IKB), & LUSERI, NRTTOVINFO, TPFILE ) #else PRINT *, "RTTOV LIBRARY NOT AVAILABLE = ###CALL_RTTOV####" diff --git a/src/MNH/write_lfin.f90 b/src/MNH/write_lfin.f90 index e9bab27c0a30fccb9d0b8fbb61d500a8fa9e84a9..bf995535edfc2ccea499fc360c92d749beb4ca19 100644 --- a/src/MNH/write_lfin.f90 +++ b/src/MNH/write_lfin.f90 @@ -1673,6 +1673,7 @@ ENDIF ! IF (NRR > 1 .AND. CPROGRAM == 'MESONH') THEN CALL IO_Field_write(TPFILE,'CLDFR',XCLDFR) + CALL IO_Field_write(TPFILE,'ICEFR',XICEFR) CALL IO_Field_write(TPFILE,'RAINFR',XRAINFR) END IF !