diff --git a/src/MNH/default_desfmn.f90 b/src/MNH/default_desfmn.f90 index c656a19af214c8c32027fdd699cc8e3d6842b52a..a3127f4a77ef52055227111821d045360404b8c2 100644 --- a/src/MNH/default_desfmn.f90 +++ b/src/MNH/default_desfmn.f90 @@ -279,7 +279,7 @@ USE MODD_PARAM_LIMA, ONLY : LCOLD, LNUCL, LSEDI, LHHONI, LSNOW, LHAIL, LMEYERS, 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, & @@ -991,6 +991,7 @@ IF (KMI == 1) THEN OACTIT = .FALSE. LADJ = .TRUE. LSPRO = .FALSE. + LKHKO = .FALSE. ODEPOC = .FALSE. LBOUND = .FALSE. OACTTKE = .TRUE. 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/lima.f90 b/src/MNH/lima.f90 index d5d566e84e266ea480cdee4a6b2a6975c067525d..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. @@ -988,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. @@ -1080,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, & @@ -1364,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) @@ -1531,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) @@ -1759,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_droplets_accretion.f90 b/src/MNH/lima_droplets_accretion.f90 index 8996b5425b8282ae43f1676dd6b09e55661b8787..d65aba66e01ef00f2a436f1108a032e8ccdf6b06 100644 --- a/src/MNH/lima_droplets_accretion.f90 +++ b/src/MNH/lima_droplets_accretion.f90 @@ -63,7 +63,7 @@ END MODULE MODI_LIMA_DROPLETS_ACCRETION !* 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 +109,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..93d9227ce343bd29fd6b9793ec045b66dfc8ae99 100644 --- a/src/MNH/lima_droplets_autoconversion.f90 +++ b/src/MNH/lima_droplets_autoconversion.f90 @@ -58,10 +58,11 @@ END MODULE MODI_LIMA_DROPLETS_AUTOCONVERSION !* 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 +87,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 +94,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_rain_evaporation.f90 b/src/MNH/lima_rain_evaporation.f90 index 2970e027d0ae5d8b380a0c9348ddc7de249fe049..babadcf4bb8887520fd90ee1eb49ae396c8ce67f 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 ) ! ############################################################################### ! @@ -68,9 +70,9 @@ END MODULE MODI_LIMA_RAIN_EVAPORATION !* 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 +91,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 +114,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_tendencies.f90 b/src/MNH/lima_tendencies.f90 index bd98d503c551fc74862ea85aeb1a80795beea2ce..e916a1a333ca5c103275dc8c9dae09263307fd67 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, & @@ -239,7 +240,7 @@ 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 + LCOLD, LNUCL, LSNOW, LHAIL, LWARM, LACTI, LRAIN, LKHKO 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 @@ -300,7 +301,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 @@ -525,7 +527,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 +566,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 +578,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 diff --git a/src/MNH/modd_param_lima.f90 b/src/MNH/modd_param_lima.f90 index 66156a05620e98e2662a314f7338b2453cdb5e51..e12d84506bdaf4fbd820e161580996c8efe30087 100644 --- a/src/MNH/modd_param_lima.f90 +++ b/src/MNH/modd_param_lima.f90 @@ -133,6 +133,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_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/modn_param_lima.f90 b/src/MNH/modn_param_lima.f90 index f86b1add06cd8ac04da64b6bac6556d924bbc223..b319bd9f4ed3e4701aeda3e0e9612b210b871b00 100644 --- a/src/MNH/modn_param_lima.f90 +++ b/src/MNH/modn_param_lima.f90 @@ -25,7 +25,7 @@ NAMELIST/NAM_PARAM_LIMA/LCOLD, LNUCL, LSEDI, LSNOW, LHAIL, LHHONI, LMEYERS,& 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, &