From 95f7468a7513084c1b1869aee5d8d9b38d205fc1 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Beno=C3=AEt=20Vi=C3=A9?= <benoit.vie@meteo.fr> Date: Tue, 16 Aug 2022 16:58:37 +0200 Subject: [PATCH] LIMA2M compilation OK --- src/MNH/ini_budget.f90 | 167 ++++++++++- src/MNH/ini_lima.f90 | 6 +- src/MNH/ini_lima_cold_mixed.f90 | 301 ++++++++++++++++--- src/MNH/ini_lima_warm.f90 | 1 + src/MNH/lima.f90 | 367 ++++++++++++++++------- src/MNH/lima_cold_sedimentation.f90 | 215 ++++++++++--- src/MNH/lima_cold_slow_processes.f90 | 217 ++++++++++---- src/MNH/lima_collisional_ice_breakup.f90 | 71 +++-- src/MNH/lima_conversion_melting_snow.f90 | 20 +- src/MNH/lima_droplets_riming_snow.f90 | 77 ++--- src/MNH/lima_graupel.f90 | 172 ++++++++--- src/MNH/lima_graupel_deposition.f90 | 27 +- src/MNH/lima_ice_aggregation_snow.f90 | 27 +- src/MNH/lima_mixed.f90 | 157 ++++++++-- src/MNH/lima_mixed_slow_processes.f90 | 139 ++++++--- src/MNH/lima_rain_accr_snow.f90 | 157 ++++++++-- src/MNH/lima_sedimentation.f90 | 7 +- src/MNH/lima_snow_deposition.f90 | 22 +- src/MNH/lima_tendencies.f90 | 336 ++++++++++++++------- src/MNH/modd_param_lima_cold.f90 | 24 +- src/MNH/modd_param_lima_mixed.f90 | 40 ++- src/MNH/modd_param_lima_warm.f90 | 2 +- src/MNH/radar_rain_ice.f90 | 102 +++++-- src/MNH/sources_neg_correct.f90 | 165 ++++++---- src/MNH/update_nsv.f90 | 3 + src/MNH/write_lfifm1_for_diag.f90 | 56 ++-- src/MNH/write_lfin.f90 | 20 +- 27 files changed, 2167 insertions(+), 731 deletions(-) diff --git a/src/MNH/ini_budget.f90 b/src/MNH/ini_budget.f90 index 91461134c..e608329df 100644 --- a/src/MNH/ini_budget.f90 +++ b/src/MNH/ini_budget.f90 @@ -209,6 +209,7 @@ end subroutine Budget_preallocate ! P. Wautelet 04/03/2021: budgets: add terms for drag due to buildings ! P. Wautelet 17/03/2021: choose source terms for budgets with character strings instead of multiple integer variables ! C. Barthe 14/03/2022: budgets: add terms for CIBU and RDSF in LIMA +! M. Taufour 01/07/2022: budgets: add concentration for snow, graupel, hail !------------------------------------------------------------------------------- ! !* 0. DECLARATIONS @@ -238,6 +239,7 @@ use modd_nsv, only: csvnames, nsv_lima_beg, nsv_lima_end, nsv_lima_ccn_acti, nsv_lima_ccn_free, nsv_lima_hom_haze, & nsv_lima_ifn_free, nsv_lima_ifn_nucl, nsv_lima_imm_nucl, & nsv_lima_nc, nsv_lima_nr, nsv_lima_ni, nsv_lima_scavmass, nsv_lima_spro, & + nsv_lima_ns, nsv_lima_ng, nsv_lima_nh, & nsv_lnoxbeg, nsv_lnoxend, nsv_ppbeg, nsv_ppend, & nsv_sltbeg, nsv_sltend, nsv_sltdepbeg, nsv_sltdepend, nsv_snwbeg, nsv_snwend, & nsv_user @@ -249,8 +251,8 @@ use modd_param_lima, only: laero_mass_lima => laero_mass, lacti_lima => lacti, lhail_lima => lhail, lhhoni_lima => lhhoni, lmeyers_lima => lmeyers, lnucl_lima => lnucl, & lptsplit, & lrain_lima => lrain, lscav_lima => lscav, lsedc_lima => lsedc, lsedi_lima => lsedi, & - lsnow_lima => lsnow, lspro_lima => lspro, lwarm_lima => lwarm, lcibu, lrdsf, nmom_i, & - nmod_ccn, nmod_ifn, nmod_imm + lsnow_lima => lsnow, lspro_lima => lspro, lwarm_lima => lwarm, lcibu, lrdsf, & + nmom_c, nmom_r, nmom_i, nmom_s, nmom_g, nmom_h, nmod_ccn, nmod_ifn, nmod_imm use modd_ref, only: lcouples use modd_salt, only: lsalt use modd_turb_n, only: lsubg_cond @@ -1161,6 +1163,12 @@ if ( lbu_rth ) then .or. hcloud(1:3) == 'ICE' call Budget_source_add( tbudgets(NBUDGET_TH), tzsource ) + tzsource%cmnhname = 'DEPH' + tzsource%clongname = 'deposition on hail' + tzsource%lavailable = ( hcloud == 'LIMA' .and. ( lptsplit .or. lhail_lima ) ) & + .or. hcloud == 'ICE4' + call Budget_source_add( tbudgets(NBUDGET_TH), tzsource ) + tzsource%cmnhname = 'IMLT' tzsource%clongname = 'melting of ice' tzsource%lavailable = ( hcloud == 'LIMA' .and. ( lptsplit .or. ( lcold_lima .and. lwarm_lima ) ) ) .or. hcloud(1:3) == 'ICE' @@ -1539,6 +1547,12 @@ if ( tbudgets(NBUDGET_RV)%lenabled ) then .or. hcloud(1:3) == 'ICE' call Budget_source_add( tbudgets(NBUDGET_RV), tzsource ) + tzsource%cmnhname = 'DEPH' + tzsource%clongname = 'deposition on HAIL' + tzsource%lavailable = ( hcloud == 'LIMA' .and. ( lptsplit .or. lhail_lima ) & + .or. hcloud == 'ICE4' ) + call Budget_source_add( tbudgets(NBUDGET_RV), tzsource ) + tzsource%cmnhname = 'CEDS' tzsource%clongname = 'adjustment to saturation' tzsource%lavailable = hcloud == 'LIMA' @@ -2836,6 +2850,12 @@ if ( tbudgets(NBUDGET_RH)%lenabled ) then .or. hcloud == 'ICE4' call Budget_source_add( tbudgets(NBUDGET_RH), tzsource ) + tzsource%cmnhname = 'DEPH' + tzsource%clongname = 'deposition on hail' + tzsource%lavailable = ( hcloud == 'LIMA' .and. lhail_lima ) + call Budget_source_add( tbudgets(NBUDGET_RH), tzsource ) + + tzsource%cmnhname = 'GHCV' tzsource%clongname = 'graupel to hail conversion' tzsource%lavailable = hcloud == 'ICE4' .and. lred .and. celec == 'NONE' @@ -3237,7 +3257,7 @@ SV_BUDGETS: do jsv = 1, ksv tzsource%cmnhname = 'WETH' tzsource%clongname = 'wet growth of hail' - tzsource%lavailable = .not.lptsplit .and. lhail_lima .and. lcold_lima .and. lwarm_lima .and. lsnow_lima + tzsource%lavailable = lptsplit .or. lhail_lima call Budget_source_add( tbudgets(ibudget), tzsource ) tzsource%cmnhname = 'CORR2' @@ -3325,12 +3345,12 @@ SV_BUDGETS: do jsv = 1, ksv tzsource%cmnhname = 'WETH' tzsource%clongname = 'wet growth of hail' - tzsource%lavailable = .not.lptsplit .and. lhail_lima .and. lcold_lima .and. lwarm_lima .and. lsnow_lima + tzsource%lavailable = lptsplit .or. lhail_lima call Budget_source_add( tbudgets(ibudget), tzsource ) tzsource%cmnhname = 'HMLT' tzsource%clongname = 'melting of hail' - tzsource%lavailable = .not.lptsplit .and. lhail_lima .and. lcold_lima .and. lwarm_lima .and. lsnow_lima + tzsource%lavailable = lptsplit .or. lhail_lima call Budget_source_add( tbudgets(ibudget), tzsource ) tzsource%cmnhname = 'CORR2' @@ -3482,7 +3502,7 @@ SV_BUDGETS: do jsv = 1, ksv tzsource%cmnhname = 'WETH' tzsource%clongname = 'wet growth of hail' - tzsource%lavailable = .not.lptsplit .and. lhail_lima .and. lcold_lima .and. lwarm_lima .and. lsnow_lima + tzsource%lavailable = lptsplit .or. lhail_lima call Budget_source_add( tbudgets(ibudget), tzsource ) tzsource%cmnhname = 'CEDS' @@ -3495,7 +3515,142 @@ SV_BUDGETS: do jsv = 1, ksv tzsource%lavailable = lptsplit call Budget_source_add( tbudgets(ibudget), tzsource ) + else if ( jsv == nsv_lima_ns ) then SV_LIMA + + tzsource%cmnhname = 'SEDI' + tzsource%clongname = 'sedimentation' + tzsource%lavailable = lcold_lima .or. ( lcold_lima .and. lsnow_lima ) + call Budget_source_add( tbudgets(ibudget), tzsource ) + + tzsource%cmnhname = 'CNVI' + tzsource%clongname = 'conversion of snow to cloud ice' + tzsource%lavailable = lptsplit .or. ( lcold_lima .and. lsnow_lima ) + call Budget_source_add( tbudgets(ibudget), tzsource ) + + tzsource%cmnhname = 'CNVS' + tzsource%clongname = 'conversion of pristine ice to snow' + tzsource%lavailable = lptsplit .or. ( lcold_lima .and. lsnow_lima ) + call Budget_source_add( tbudgets(ibudget), tzsource ) + + tzsource%cmnhname = 'BRKU' + tzsource%clongname = 'break up of snow' + tzsource%lavailable = lptsplit .or. ( lcold_lima .and. lsnow_lima ) + call Budget_source_add( tbudgets(ibudget), tzsource ) + + tzsource%cmnhname = 'RIM' + tzsource%clongname = 'heavy riming of cloud droplet on snow' + tzsource%lavailable = lptsplit .or. ( lcold_lima .and. lwarm_lima .and. lsnow_lima ) + call Budget_source_add( tbudgets(ibudget), tzsource ) + + tzsource%cmnhname = 'ACC' + tzsource%clongname = 'accretion of rain on snow' + tzsource%lavailable = lptsplit .or. ( lcold_lima .and. lwarm_lima .and. lsnow_lima ) + call Budget_source_add( tbudgets(ibudget), tzsource ) + + tzsource%cmnhname = 'CMEL' + tzsource%clongname = 'conversion melting of snow' + tzsource%lavailable = lptsplit .or. ( lcold_lima .and. lwarm_lima .and. lsnow_lima ) + call Budget_source_add( tbudgets(ibudget), tzsource ) + + tzsource%cmnhname = 'WETG' + tzsource%clongname = 'wet growth of graupel' + tzsource%lavailable = lptsplit .or. ( lcold_lima .and. lwarm_lima .and. lsnow_lima ) + call Budget_source_add( tbudgets(ibudget), tzsource ) + + tzsource%cmnhname = 'DRYG' + tzsource%clongname = 'dry growth of graupel' + tzsource%lavailable = lptsplit .or. ( lcold_lima .and. lwarm_lima .and. lsnow_lima ) + call Budget_source_add( tbudgets(ibudget), tzsource ) + + tzsource%cmnhname = 'WETH' + tzsource%clongname = 'wet growth of hail' + tzsource%lavailable = lptsplit .or. lhail_lima + call Budget_source_add( tbudgets(ibudget), tzsource ) + + tzsource%cmnhname = 'SSC' + tzsource%clongname = 'snow self collection' + tzsource%lavailable = lptsplit .or. ( lcold_lima .and. lsnow_lima ) + call Budget_source_add( tbudgets(ibudget), tzsource ) + + tzsource%cmnhname = 'CEDS' + tzsource%clongname = 'adjustment to saturation' + tzsource%lavailable = lcold_lima .and. .not.lptsplit .and. .not.lspro_lima + call Budget_source_add( tbudgets(ibudget), tzsource ) + + else if ( jsv == nsv_lima_ng ) then SV_LIMA + + tzsource%cmnhname = 'SEDI' + tzsource%clongname = 'sedimentation' + tzsource%lavailable = lcold_lima .or. ( lcold_lima .and. lsnow_lima ) + call Budget_source_add( tbudgets(ibudget), tzsource ) + + tzsource%cmnhname = 'RIM' + tzsource%clongname = 'heavy riming of cloud droplet on snow' + tzsource%lavailable = lptsplit .or. ( lcold_lima .and. lwarm_lima .and. lsnow_lima ) + call Budget_source_add( tbudgets(ibudget), tzsource ) + + tzsource%cmnhname = 'ACC' + tzsource%clongname = 'accretion of rain on snow' + tzsource%lavailable = lptsplit .or. ( lcold_lima .and. lwarm_lima .and. lsnow_lima ) + call Budget_source_add( tbudgets(ibudget), tzsource ) + tzsource%cmnhname = 'CMEL' + tzsource%clongname = 'conversion melting of snow' + tzsource%lavailable = lptsplit .or. ( lcold_lima .and. lwarm_lima .and. lsnow_lima ) + call Budget_source_add( tbudgets(ibudget), tzsource ) + + tzsource%cmnhname = 'CFRZ' + tzsource%clongname = 'conversion freezing of raindrop' + tzsource%lavailable = lptsplit .or. ( lcold_lima .and. lwarm_lima .and. lsnow_lima ) + call Budget_source_add( tbudgets(ibudget), tzsource ) + + tzsource%cmnhname = 'WETG' + tzsource%clongname = 'wet growth of graupel' + tzsource%lavailable = lptsplit .or. ( lcold_lima .and. lwarm_lima .and. lsnow_lima ) + call Budget_source_add( tbudgets(ibudget), tzsource ) + + tzsource%cmnhname = 'GMLT' + tzsource%clongname = 'graupel melting' + tzsource%lavailable = lptsplit .or. ( lcold_lima .and. lwarm_lima .and. lsnow_lima ) + call Budget_source_add( tbudgets(ibudget), tzsource ) + + tzsource%cmnhname = 'WETH' + tzsource%clongname = 'wet growth of hail' + tzsource%lavailable = lptsplit .or. lhail_lima + call Budget_source_add( tbudgets(ibudget), tzsource ) + + tzsource%cmnhname = 'COHG' + tzsource%clongname = 'conversion hail graupel' + tzsource%lavailable = lptsplit .or. lhail_lima + call Budget_source_add( tbudgets(ibudget), tzsource ) + + tzsource%cmnhname = 'CEDS' + tzsource%clongname = 'adjustment to saturation' + tzsource%lavailable = lcold_lima .and. .not.lptsplit .and. .not.lspro_lima + call Budget_source_add( tbudgets(ibudget), tzsource ) + + else if ( jsv == nsv_lima_nh .and. lhail_lima) then SV_LIMA + + tzsource%cmnhname = 'SEDI' + tzsource%clongname = 'sedimentation' + tzsource%lavailable = lcold_lima .or. ( lcold_lima .and. lsnow_lima .and. lhail_lima ) + call Budget_source_add( tbudgets(ibudget), tzsource ) + + tzsource%cmnhname = 'WETG' + tzsource%clongname = 'wet growth of graupel' + tzsource%lavailable = lptsplit .or. lhail_lima + call Budget_source_add( tbudgets(ibudget), tzsource ) + + tzsource%cmnhname = 'COHG' + tzsource%clongname = 'conversion hail graupel' + tzsource%lavailable = lptsplit .or. lhail_lima + call Budget_source_add( tbudgets(ibudget), tzsource ) + + tzsource%cmnhname = 'HMLT' + tzsource%clongname = 'hail melting' + tzsource%lavailable = lptsplit .or. lhail_lima + call Budget_source_add( tbudgets(ibudget), tzsource ) + else if ( jsv >= nsv_lima_ifn_free .and. jsv <= nsv_lima_ifn_free + nmod_ifn - 1 ) then SV_LIMA ! Free IFN concentration tzsource%cmnhname = 'HIND' diff --git a/src/MNH/ini_lima.f90 b/src/MNH/ini_lima.f90 index d90f1e160..54c784e64 100644 --- a/src/MNH/ini_lima.f90 +++ b/src/MNH/ini_lima.f90 @@ -148,9 +148,9 @@ XCTMIN(1) = 1.0 ! Not used XCTMIN(2) = 1.0E-3 ! Nc XCTMIN(3) = 1.0E-3 ! Nr XCTMIN(4) = 1.0E-3 ! Ni -XCTMIN(5) = 1.0E-3 ! Not used -XCTMIN(6) = 1.0E-3 ! Not used -XCTMIN(7) = 1.0E-3 ! Not used +XCTMIN(5) = 1.0E-3 ! Ns +XCTMIN(6) = 1.0E-3 ! Ng +XCTMIN(7) = 1.0E-3 ! Nh ! ! ! Air density fall speed correction diff --git a/src/MNH/ini_lima_cold_mixed.f90 b/src/MNH/ini_lima_cold_mixed.f90 index 0807d5512..61568b5a3 100644 --- a/src/MNH/ini_lima_cold_mixed.f90 +++ b/src/MNH/ini_lima_cold_mixed.f90 @@ -43,6 +43,7 @@ END MODULE MODI_INI_LIMA_COLD_MIXED ! P. Wautelet 26/04/2019: replace non-standard FLOAT function by REAL function ! C. Barthe 14/03/2022: add CIBU and RDSF ! J. Wurtz 03/2022: new snow characteristics +! M. Taufour 07/2022: add concentration for snow, graupel, hail ! !------------------------------------------------------------------------------- ! @@ -65,8 +66,11 @@ USE MODI_LIMA_FUNCTIONS USE MODI_GAMMA USE MODI_GAMMA_INC USE MODI_RRCOLSS +USE MODI_NRCOLSS USE MODI_RZCOLX +USE MODI_NZCOLX USE MODI_RSCOLRG +USE MODI_NSCOLRG USE MODI_LIMA_READ_XKER_RACCS USE MODI_LIMA_READ_XKER_SDRYG USE MODI_LIMA_READ_XKER_RDRYG @@ -100,7 +104,7 @@ REAL :: ZBOUND ! XDCSLIM*Lbda_s: upper bound for the partial REAL :: ZEGS, ZEGR, ZEHS, ZEHG! Bulk collection efficiencies ! INTEGER :: IND ! Number of interval to integrate the kernels -REAL :: ZESR ! Mean efficiency of rain-aggregate collection +REAL :: ZESR, ZESS ! Mean efficiency of rain-aggregate collection, aggregate-aggregate collection REAL :: ZFDINFTY ! Factor used to define the "infinite" diameter ! ! @@ -270,14 +274,24 @@ IF (LSNOW_T) THEN 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 IF (NMOM_S.EQ.2) THEN + XALPHAS = 1.0 ! Gamma law + XNUS = 2.0 ! + 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 +if (NMOM_G.GE.2) then + XALPHAG = 1.0 ! + XNUG = 2.0 ! +else + XALPHAG = 1.0 ! Exponential law + XNUG = 1.0 ! Exponential law +end if ! XALPHAH = 1.0 ! Gamma law XNUH = 8.0 ! Gamma law with little dispersion @@ -287,8 +301,8 @@ XNUH = 8.0 ! Gamma law with little dispersion XLBEXI = 1.0/XBI XLBI = XAI*MOMG(XALPHAI,XNUI,XBI) ! +XNS = 1.0/(XAS*MOMG(XALPHAS,XNUS,XBS)) IF (NMOM_S.EQ.1) THEN - XNS = 1.0/(XAS*MOMG(XALPHAS,XNUS,XBS)) XLBEXS = 1.0/(XCXS-XBS) XLBS = ( XAS*XCCS*MOMG(XALPHAS,XNUS,XBS) )**(-XLBEXS) ELSE @@ -296,6 +310,7 @@ ELSE XLBS = XAS * MOMG(XALPHAS,XNUS,XBS) END IF ! +XNG = 1.0/(XAG*MOMG(XALPHAG,XNUG,XBG)) IF (NMOM_G.EQ.1) THEN XLBEXG = 1.0/(XCXG-XBG) XLBG = ( XAG*XCCG*MOMG(XALPHAG,XNUG,XBG))**(-XLBEXG) @@ -390,6 +405,26 @@ XFSEDG = XCG*XAG*XCCG*MOMG(XALPHAG,XNUG,XBG+XDG)* & XEXSEDH = (XBH+XDH-XCXH)/(XBH-XCXH) XFSEDH = XCH*XAH*XCCH*MOMG(XALPHAH,XNUH,XBH+XDH)* & (XAH*XCCH*MOMG(XALPHAH,XNUH,XBH))**(-XEXSEDH)*(ZRHO00)**XCEXVT +IF (NMOM_S.GE.2) THEN + XFSEDRS = XCS*GAMMA_X0D(XNUS+(XDS+XBS)/XALPHAS)/GAMMA_X0D(XNUS+XBS/XALPHAS)* & + (ZRHO00)**XCEXVT + XFSEDCS = XCS*GAMMA_X0D(XNUS+XDS/XALPHAS)/GAMMA_X0D(XNUS)* & + (ZRHO00)**XCEXVT +END IF +IF (NMOM_G.GE.2) THEN + XFSEDRG = XCG*GAMMA_X0D(XNUG+(XDG+XBG)/XALPHAG)/GAMMA_X0D(XNUG+XBG/XALPHAG)* & + (ZRHO00)**XCEXVT + XFSEDCG = XCG*GAMMA_X0D(XNUG+XDG/XALPHAG)/GAMMA_X0D(XNUG)* & + (ZRHO00)**XCEXVT +END IF +IF (NMOM_H.GE.2) THEN + XFSEDRH = XCH*GAMMA_X0D(XNUH+(XDH+XBH)/XALPHAH)/GAMMA_X0D(XNUH+XBH/XALPHAH)* & + (ZRHO00)**XCEXVT + XFSEDCH = XCH*GAMMA_X0D(XNUH+XDH/XALPHAH)/GAMMA_X0D(XNUH)* & + (ZRHO00)**XCEXVT +END IF +! +! ! XLB(4) = XLBI XLBEX(4) = XLBEXI @@ -402,18 +437,24 @@ XLBEX(5) = XLBEXS XD(5) = XDS XFSEDR(5) = XCS*GAMMA_X0D(XNUS+(XDS+XBS)/XALPHAS)/GAMMA_X0D(XNUS+XBS/XALPHAS)* & (ZRHO00)**XCEXVT +XFSEDC(5) = XCS*GAMMA_X0D(XNUS+XDS/XALPHAS)/GAMMA_X0D(XNUS)* & + (ZRHO00)**XCEXVT ! XLB(6) = XLBG XLBEX(6) = XLBEXG XD(6) = XDG XFSEDR(6) = XCG*GAMMA_X0D(XNUG+(XDG+XBG)/XALPHAG)/GAMMA_X0D(XNUG+XBG/XALPHAG)* & (ZRHO00)**XCEXVT +XFSEDC(6) = XCG*GAMMA_X0D(XNUG+XDG/XALPHAG)/GAMMA_X0D(XNUG)* & + (ZRHO00)**XCEXVT ! XLB(7) = XLBH XLBEX(7) = XLBEXH XD(7) = XDH XFSEDR(7) = XCH*GAMMA_X0D(XNUH+(XDH+XBH)/XALPHAH)/GAMMA_X0D(XNUH+XBH/XALPHAH)* & (ZRHO00)**XCEXVT +XFSEDC(7) = XCH*GAMMA_X0D(XNUH+XDH/XALPHAH)/GAMMA_X0D(XNUH)* & + (ZRHO00)**XCEXVT ! !------------------------------------------------------------------------------- ! @@ -652,21 +693,21 @@ XR1DEPSI = XC1DEPSI *(XAS*XDSCNVI_LIM**XBS) ! ! Vapor deposition on snow and graupel and hail ! -X0DEPS = XNS*(4.0*XPI)*XC1S*XF0S*MOMG(XALPHAS,XNUS,1.) -X1DEPS = XNS*(4.0*XPI)*XC1S*XF1S*SQRT(XCS)*MOMG(XALPHAS,XNUS,0.5*XDS+1.5) -XEX0DEPS = XBS-1.0 +X0DEPS = (4.0*XPI)*XC1S*XF0S*MOMG(XALPHAS,XNUS,1.) +X1DEPS = (4.0*XPI)*XC1S*XF1S*SQRT(XCS)*MOMG(XALPHAS,XNUS,0.5*XDS+1.5) +XEX0DEPS = -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) -XEX0DEPG = XCXG-1.0 -XEX1DEPG = XCXG-0.5*(XDG+3.0) +X0DEPG = (4.0*XPI)*XC1G*XF0G*MOMG(XALPHAG,XNUG,1.) +X1DEPG = (4.0*XPI)*XC1G*XF1G*SQRT(XCG)*MOMG(XALPHAG,XNUG,0.5*XDG+1.5) +XEX0DEPG = -1.0 +XEX1DEPG = -0.5*(XDG+3.0) +! +X0DEPH = (4.0*XPI)*XC1H*XF0H*MOMG(XALPHAH,XNUH,1.) +X1DEPH = (4.0*XPI)*XC1H*XF1H*SQRT(XCH)*MOMG(XALPHAH,XNUH,0.5*XDH+1.5) +XEX0DEPH = -1.0 +XEX1DEPH = -0.5*(XDH+3.0) ! -X0DEPH = (4.0*XPI)*XCCH*XC1H*XF0H*MOMG(XALPHAH,XNUH,1.) -X1DEPH = (4.0*XPI)*XCCH*XC1H*XF1H*SQRT(XCH)*MOMG(XALPHAH,XNUH,0.5*XDH+1.5) -XEX0DEPH = XCXH-1.0 -XEX1DEPH = XCXH-0.5*(XDH+3.0) -! !------------------------------------------------------------------------------- ! ! @@ -749,18 +790,18 @@ END IF ! XDCSLIM = 0.007 ! D_cs^lim = 7 mm as suggested by Farley et al. (1989) XCOLCS = 1.0 -XEXCRIMSS = -XDS-2.0 -XCRIMSS = XNS * (XPI/4.0)*XCOLCS*XCS*(ZRHO00**XCEXVT)*MOMG(XALPHAS,XNUS,XDS+2.0) +XEXCRIMSS= -XDS-2.0 +XCRIMSS = (XPI/4.0)*XCOLCS*XCS*(ZRHO00**XCEXVT)*MOMG(XALPHAS,XNUS,XDS+2.0) XEXCRIMSG= XEXCRIMSS XCRIMSG = XCRIMSS -XSRIMCG = XNS*XAS*MOMG(XALPHAS,XNUS,XBS) +XSRIMCG = XAS*MOMG(XALPHAS,XNUS,XBS) XEXSRIMCG= -XBS ! !Pour Murakami 1990 -XSRIMCG2 = XNS*XAG*MOMG(XALPHAS,XNUS,XBG) +XSRIMCG2 = XAG*MOMG(XALPHAS,XNUS,XBG) XSRIMCG3 = 0.1 -XEXSRIMCG2=XBS-XBG +XEXSRIMCG2=XBG GFLAG = .TRUE. IF (GFLAG) THEN WRITE(UNIT=ILUOUT0,FMT='(" riming of the aggregates")') @@ -819,17 +860,25 @@ 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 = XNS*XPI/4.0*XAR*(ZRHO00**XCEXVT) +XFRACCSS = XPI/4.0*XAR*(ZRHO00**XCEXVT) +XFNRACCSS = XPI/4.0*(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.) +XLBNRACCS1 = MOMG(XALPHAS,XNUS,2.) +XLBNRACCS2 = 2.*MOMG(XALPHAS,XNUS,1.)*MOMG(XALPHAR,XNUR,1.) +XLBNRACCS3 = MOMG(XALPHAR,XNUR,2.) ! -XFSACCRG = XNS*(XPI/4.0)*XAS*(ZRHO00**XCEXVT) +XFSACCRG = (XPI/4.0)*XAS*(ZRHO00**XCEXVT) +XFNSACCRG = (XPI/4.0)*(ZRHO00**XCEXVT) ! XLBSACCR1 = MOMG(XALPHAR,XNUR,2.)*MOMG(XALPHAS,XNUS,XBS) XLBSACCR2 = 2.*MOMG(XALPHAR,XNUR,1.)*MOMG(XALPHAS,XNUS,XBS+1.) XLBSACCR3 = MOMG(XALPHAS,XNUS,XBS+2.) +XLBNSACCR1 = MOMG(XALPHAR,XNUR,2.) +XLBNSACCR2 = 2.*MOMG(XALPHAR,XNUR,1.)*MOMG(XALPHAS,XNUS,1.) +XLBNSACCR3 = MOMG(XALPHAS,XNUS,2.) ! !* 7.2.1 Defining the ranges for the computation of the kernels ! @@ -858,6 +907,49 @@ ZFDINFTY = 20.0 ! computing the kernels XKER_RACCSS, XKER_RACCS and XKER_SACCRG ALLOCATE( XKER_RACCSS(NACCLBDAS,NACCLBDAR) ) ALLOCATE( XKER_RACCS (NACCLBDAS,NACCLBDAR) ) ALLOCATE( XKER_SACCRG(NACCLBDAR,NACCLBDAS) ) +ALLOCATE( XKER_N_RACCSS(NACCLBDAS,NACCLBDAR) ) +ALLOCATE( XKER_N_RACCS (NACCLBDAS,NACCLBDAR) ) +ALLOCATE( XKER_N_SACCRG(NACCLBDAR,NACCLBDAS) ) +CALL NRCOLSS ( IND, XALPHAS, XNUS, XALPHAR, XNUR, & + ZESR, XCS, XDS, XFVELOS, XCR, XDR, & + XACCLBDAS_MAX, XACCLBDAR_MAX, XACCLBDAS_MIN, XACCLBDAR_MIN, & + ZFDINFTY, XKER_N_RACCSS, XAG, XBS, XAS ) +CALL NZCOLX ( IND, XALPHAS, XNUS, XALPHAR, XNUR, & + ZESR, XCS, XDS, XFVELOS, XCR, XDR, 0., & ! + XACCLBDAS_MAX, XACCLBDAR_MAX, XACCLBDAS_MIN, XACCLBDAR_MIN, & + ZFDINFTY, XKER_N_RACCS ) +CALL NSCOLRG ( IND, XALPHAS, XNUS, XALPHAR, XNUR, & + ZESR, XCS, XDS, XFVELOS, XCR, XDR, & + XACCLBDAS_MAX, XACCLBDAR_MAX, XACCLBDAS_MIN, XACCLBDAR_MIN, & + ZFDINFTY, XKER_N_SACCRG,XAG, XBS, XAS ) +WRITE(UNIT=ILUOUT0,FMT='("!")') +WRITE(UNIT=ILUOUT0,FMT='("IF( PRESENT(PKER_N_RACCSS) ) THEN")') +DO J1 = 1 , NACCLBDAS + DO J2 = 1 , NACCLBDAR + WRITE(UNIT=ILUOUT0,FMT='(" PKER_N_RACCSS(",I3,",",I3,") = ",E13.6)') & + J1,J2,XKER_N_RACCSS(J1,J2) + END DO +END DO +WRITE(UNIT=ILUOUT0,FMT='("!")') +WRITE(UNIT=ILUOUT0,FMT='("!")') +WRITE(UNIT=ILUOUT0,FMT='("IF( PRESENT(PKER_N_RACCS) ) THEN")') +DO J1 = 1 , NACCLBDAS + DO J2 = 1 , NACCLBDAR + WRITE(UNIT=ILUOUT0,FMT='(" PKER_N_RACCS(",I3,",",I3,") = ",E13.6)') & + J1,J2,XKER_N_RACCS(J1,J2) + END DO +END DO +WRITE(UNIT=ILUOUT0,FMT='("!")') +WRITE(UNIT=ILUOUT0,FMT='("!")') +WRITE(UNIT=ILUOUT0,FMT='("IF( PRESENT(PKER_N_SACCRG) ) THEN")') +DO J1 = 1 , NACCLBDAR + DO J2 = 1 , NACCLBDAS + WRITE(UNIT=ILUOUT0,FMT='(" PKER_N_SACCRG(",I3,",",I3,") = ",E13.6)') & + J1,J2,XKER_N_SACCRG(J1,J2) + END DO +END DO +WRITE(UNIT=ILUOUT0,FMT='("!")') + ! CALL LIMA_READ_XKER_RACCS (KACCLBDAS,KACCLBDAR,KND, & PALPHAS,PNUS,PALPHAR,PNUR,PESR,PBS,PBR,PCS,PDS,PFVELOS,PCR,PDR, & @@ -950,6 +1042,75 @@ IF( (KACCLBDAS/=NACCLBDAS) .OR. (KACCLBDAR/=NACCLBDAR) .OR. (KND/=IND) .OR. & WRITE(UNIT=ILUOUT0,FMT='(" Read XKER_SACCRG")') END IF ! +!* 7.2N Computations of the tabulated normalized kernels Snow Self Collection !! +! +! +if (NMOM_S.GE.2) then + XCOLSS = 0.1 ! Collection efficiency of S+S + XCOLEXSS = 0.1 ! Temperature factor of the S+S collection efficiency + XFNSSCS = (XPI/4.0)*XCOLSS*(ZRHO00**XCEXVT)/2.0 +! + XLBNSSCS1 = 2.0*MOMG(XALPHAS,XNUS,2.) + XLBNSSCS2 = 2.0*MOMG(XALPHAS,XNUS,1.)**2 +! +!* 7.2N.1 Defining the ranges for the computation of the kernels +! +! Notice: One magnitude of lambda discretized over 10 points for snow +! +NSCLBDAS = 80 +XSCLBDAS_MIN = 1.0E0*XTRANS_MP_GAMMAS ! Minimal value of Lbda_s to tabulate XKER_RSCS +XSCLBDAS_MAX = 5.0E10*XTRANS_MP_GAMMAS ! Maximal value of Lbda_s to tabulate XKER_RSCS +ZRATE = LOG(XSCLBDAS_MAX/XSCLBDAS_MIN)/FLOAT(NSCLBDAS-1) +XSCINTP1S = 1.0 / ZRATE +XSCINTP2S = 1.0 - LOG( XSCLBDAS_MIN ) / ZRATE +! +! + IND = 50 ! Interval number, collection efficiency and infinite diameter + ZESS = 1.0 ! factor used to integrate the dimensional distributions when + ZFDINFTY = 20.0 ! computing the kernels XKER_SSCSS +! + ALLOCATE( XKER_N_SSCS(NSCLBDAS,NSCLBDAS) ) +! + CALL NZCOLX ( IND, XALPHAS, XNUS, XALPHAS, XNUS, & + ZESS, XCS, XDS, XFVELOS, XCS, XDS, XFVELOS, & + XSCLBDAS_MAX, XSCLBDAS_MAX, XSCLBDAS_MIN, XSCLBDAS_MIN, & + ZFDINFTY, XKER_N_SSCS ) +! + WRITE(UNIT=ILUOUT0,FMT='("*****************************************")') + WRITE(UNIT=ILUOUT0,FMT='("**** UPDATE NEW SET OF SSCS KERNELS ***")') + WRITE(UNIT=ILUOUT0,FMT='("*****************************************")') + WRITE(UNIT=ILUOUT0,FMT='("!")') + WRITE(UNIT=ILUOUT0,FMT='("KND=",I3)') IND + WRITE(UNIT=ILUOUT0,FMT='("KSCLBDAS=",I3)') NSCLBDAS + WRITE(UNIT=ILUOUT0,FMT='("PALPHAS=",E13.6)') XALPHAS + WRITE(UNIT=ILUOUT0,FMT='("PNUS=",E13.6)') XNUS + WRITE(UNIT=ILUOUT0,FMT='("PESS=",E13.6)') ZESS + WRITE(UNIT=ILUOUT0,FMT='("PBS=",E13.6)') XBS + WRITE(UNIT=ILUOUT0,FMT='("PCS=",E13.6)') XCS + WRITE(UNIT=ILUOUT0,FMT='("PDS=",E13.6)') XDS + WRITE(UNIT=ILUOUT0,FMT='("PSCLBDAS_MAX=",E13.6)') & + XSCLBDAS_MAX + WRITE(UNIT=ILUOUT0,FMT='("PSCLBDAS_MIN=",E13.6)') & + XSCLBDAS_MIN + WRITE(UNIT=ILUOUT0,FMT='("PFDINFTY=",E13.6)') ZFDINFTY + WRITE(UNIT=ILUOUT0,FMT='("!")') + WRITE(UNIT=ILUOUT0,FMT='("!")') + WRITE(UNIT=ILUOUT0,FMT='("IF( PRESENT(PKER_N_SSCS ) ) THEN")') + DO J1 = 1 , NSCLBDAS + WRITE(UNIT=ILUOUT0,FMT='(" PKER_N_SSCS (",I3,",",I3,") = ",E13.6)') & + J1,J1,XKER_N_SSCS (J1,J1) + END DO + WRITE(UNIT=ILUOUT0,FMT='("!")') +! +!* 7.2N2 Constants for the 'spontaneous' break-up +! + XACCS1=MOMG(XALPHAS,XNUS,XBS) + XSPONBUDS1 = 2.5E-3 + XSPONBUDS2 = 3.5E-3 + XSPONBUDS3 = 4.5E-3 + XSPONCOEFS2 = ((XSPONBUDS3/XSPONBUDS2)**3 - 1.0)/(XSPONBUDS3-XSPONBUDS1)**2 +! +end if ! !* 7.3 Constant for the conversion-melting rate ! @@ -1017,13 +1178,13 @@ XCIBUINTP_G = XALPHAG / LOG(ZRATE_G) XCIBUINTP1_G = 1.0 + XCIBUINTP_G * LOG(XDCGLIM_CIBU_MIN/(XGAMINC_BOUND_CIBU_GMIN)**(1.0/XALPHAG)) ! ! For ZNI_CIBU -XFACTOR_CIBU_NI = XNS * (XPI / 4.0) * XCCG * (ZRHO00**XCEXVT) +XFACTOR_CIBU_NI = (XPI / 4.0) * (ZRHO00**XCEXVT) XMOMGG_CIBU_1 = MOMG(XALPHAG,XNUG,2.0+XDG) XMOMGG_CIBU_2 = MOMG(XALPHAG,XNUG,2.0) XMOMGS_CIBU_1 = MOMG(XALPHAS,XNUS,XDS) ! ! For ZRI_CIBU -XFACTOR_CIBU_RI = XNS * XAS * (XPI / 4.0) * XCCG * (ZRHO00**XCEXVT) +XFACTOR_CIBU_RI = XAS * (XPI / 4.0) * (ZRHO00**XCEXVT) XMOMGS_CIBU_2 = MOMG(XALPHAS,XNUS,XBS) XMOMGS_CIBU_3 = MOMG(XALPHAS,XNUS,XBS+XDS) ! @@ -1095,7 +1256,7 @@ END IF ! and for the Hallett-Mossop process ! XCOLCG = 0.6 ! Estimated from Cober and List (1993) -XFCDRYG = (XPI/4.0)*XCOLCG*XCCG*XCG*(ZRHO00**XCEXVT)*MOMG(XALPHAG,XNUG,XDG+2.0) +XFCDRYG = (XPI/4.0)*XCOLCG*XCG*(ZRHO00**XCEXVT)*MOMG(XALPHAG,XNUG,XDG+2.0) ! XHM_COLLCG= 0.9 ! Collision efficiency graupel/droplet (with Dc>25 microns) XHM_FACTG = XHM_YIELD*(XHM_COLLCG/XCOLCG) @@ -1108,7 +1269,7 @@ XCOLIG = 0.01 ! Collection efficiency of I+G XCOLEXIG = 0.1 ! Temperature factor of the I+G collection efficiency WRITE (ILUOUT0, FMT=*) ' NEW Constants for the cloud ice collection by the graupeln' WRITE (ILUOUT0, 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*XCG*(ZRHO00**XCEXVT)*MOMG(XALPHAG,XNUG,XDG+2.0) ! GFLAG = .TRUE. IF (GFLAG) THEN @@ -1125,8 +1286,12 @@ 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 = XNS*(XPI/4.0)*XCOLSG*XCCG*XAS*(ZRHO00**XCEXVT) +XFSDRYG = XNS*(XPI/4.0)*XCOLSG*XAS*(ZRHO00**XCEXVT) +XFNSDRYG = XNS*(XPI/4.0)*XCOLSG*XAS*(ZRHO00**XCEXVT) ! +XLBNSDRYG1 = MOMG(XALPHAG,XNUG,2.) +XLBNSDRYG2 = 2.*MOMG(XALPHAG,XNUG,1.)*MOMG(XALPHAS,XNUS,1.) +XLBNSDRYG3 = MOMG(XALPHAS,XNUS,2.) XLBSDRYG1 = MOMG(XALPHAG,XNUG,2.)*MOMG(XALPHAS,XNUS,XBS) XLBSDRYG2 = 2.*MOMG(XALPHAG,XNUG,1.)*MOMG(XALPHAS,XNUS,XBS+1.) XLBSDRYG3 = MOMG(XALPHAS,XNUS,XBS+2.) @@ -1140,11 +1305,15 @@ END IF ! !* 8.2.4 Constants for the raindrop collection by the graupeln ! -XFRDRYG = ((XPI**2)/24.0)*XCCG*XRHOLW*(ZRHO00**XCEXVT) +XFRDRYG = XNR*(XPI/4.0)*XAR*(ZRHO00**XCEXVT) +XFNRDRYG= XNR*(XPI/4.0)*XAR*(ZRHO00**XCEXVT) ! XLBRDRYG1 = MOMG(XALPHAG,XNUG,2.)*MOMG(XALPHAR,XNUR,3.) XLBRDRYG2 = 2.*MOMG(XALPHAG,XNUG,1.)*MOMG(XALPHAR,XNUR,4.) XLBRDRYG3 = MOMG(XALPHAR,XNUR,5.) +XLBNRDRYG1 = MOMG(XALPHAG,XNUG,2.) +XLBNRDRYG2 = 2.*MOMG(XALPHAG,XNUG,1.)*MOMG(XALPHAR,XNUR,1.) +XLBNRDRYG3 = MOMG(XALPHAR,XNUR,2.) ! ! Notice: One magnitude of lambda discretized over 10 points ! @@ -1174,6 +1343,22 @@ ZEGS = 1.0 ! factor used to integrate the dimensional distributions when ZFDINFTY = 20.0 ! computing the kernels XKER_SDRYG ! ALLOCATE( XKER_SDRYG(NDRYLBDAG,NDRYLBDAS) ) +if (NMOM_S.GE.2) then + ALLOCATE( XKER_N_SDRYG(NDRYLBDAG,NDRYLBDAS) ) + CALL NZCOLX ( IND, XALPHAG, XNUG, XALPHAS, XNUS, & + ZEGS, XCG, XDG, 0., XCS, XDS, XFVELOS, & + XDRYLBDAG_MAX, XDRYLBDAS_MAX, XDRYLBDAG_MIN, XDRYLBDAS_MIN, & + ZFDINFTY, XKER_N_SDRYG ) + WRITE(UNIT=ILUOUT0,FMT='("!")') + WRITE(UNIT=ILUOUT0,FMT='("IF( PRESENT(PKER_N_SDRYG) ) THEN")') + DO J1 = 1 , NDRYLBDAG + DO J2 = 1 , NDRYLBDAS + WRITE(UNIT=ILUOUT0,FMT='(" PKER_N_SDRYG(",I3,",",I3,") = ",E13.6)') & + J1,J2,XKER_N_SDRYG(J1,J2) + END DO + END DO + WRITE(UNIT=ILUOUT0,FMT='("!")') +end if ! CALL LIMA_READ_XKER_SDRYG (KDRYLBDAG,KDRYLBDAS,KND, & PALPHAG,PNUG,PALPHAS,PNUS,PEGS,PBS,PCG,PDG,PCS,PDS,PFVELOS, & @@ -1241,6 +1426,22 @@ ZEGR = 1.0 ! distributions when computing the kernel XKER_RDRYG ZFDINFTY = 20.0 ! ALLOCATE( XKER_RDRYG(NDRYLBDAG,NDRYLBDAR) ) +if ( NMOM_R.GE.2 ) then + ALLOCATE( XKER_N_RDRYG(NDRYLBDAG,NDRYLBDAR) ) + CALL NZCOLX ( IND, XALPHAS, XNUS, XALPHAR, XNUR, & + ZEGR, XCG, XDG, 0., XCR, XDR, 0., & + XDRYLBDAG_MAX, XDRYLBDAR_MAX, XDRYLBDAG_MIN, XDRYLBDAR_MIN, & + ZFDINFTY, XKER_N_RDRYG ) + WRITE(UNIT=ILUOUT0,FMT='("!")') + WRITE(UNIT=ILUOUT0,FMT='("IF( PRESENT(PKER_N_RDRYG) ) THEN")') + DO J1 = 1 , NDRYLBDAG + DO J2 = 1 , NDRYLBDAR + WRITE(UNIT=ILUOUT0,FMT='(" PKER_N_RDRYG(",I3,",",I3,") = ",E13.6)') & + J1,J2,XKER_N_RDRYG(J1,J2) + END DO + END DO + WRITE(UNIT=ILUOUT0,FMT='("!")') +end if ! CALL LIMA_READ_XKER_RDRYG (KDRYLBDAG,KDRYLBDAR,KND, & PALPHAG,PNUG,PALPHAR,PNUR,PEGR,PBR,PCG,PDG,PCR,PDR, & @@ -1255,7 +1456,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,0., XCR, XDR, 0., & + ZEGR, XBR, XCG, XDG, 0., XCR, XDR, 0., & XDRYLBDAG_MAX, XDRYLBDAR_MAX, XDRYLBDAG_MIN, XDRYLBDAR_MIN, & ZFDINFTY, XKER_RDRYG ) WRITE(UNIT=ILUOUT0,FMT='("*****************************************")') @@ -1317,7 +1518,7 @@ 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 = XNS*(XPI/4.0)*XCCH*XAS*(ZRHO00**XCEXVT) ! Wurtz +XFSWETH = XNS*(XPI/4.0)*XAS*(ZRHO00**XCEXVT) ! XLBSWETH1 = MOMG(XALPHAH,XNUH,2.)*MOMG(XALPHAS,XNUS,XBS) XLBSWETH2 = 2.*MOMG(XALPHAH,XNUH,1.)*MOMG(XALPHAS,XNUS,XBS+1.) @@ -1325,7 +1526,7 @@ XLBSWETH3 = MOMG(XALPHAS,XNUS,XBS+2.) ! !* 9.2.3 Constants for the graupel collection by the hailstones ! -XFGWETH = (XPI/4.0)*XCCH*XCCG*XAG*(ZRHO00**XCEXVT) +XFGWETH = XNG*(XPI/4.0)*XAG*(ZRHO00**XCEXVT) ! XLBGWETH1 = MOMG(XALPHAH,XNUH,2.)*MOMG(XALPHAG,XNUG,XBG) XLBGWETH2 = 2.*MOMG(XALPHAH,XNUH,1.)*MOMG(XALPHAG,XNUG,XBG+1.) @@ -1358,6 +1559,22 @@ IND = 50 ! Interval number, collection efficiency and infinite diameter ZEHS = 1.0 ! factor used to integrate the dimensional distributions when ZFDINFTY = 20.0 ! computing the kernels XKER_SWETH ! +if ( NMOM_S.GE.2 ) then + IF( .NOT.ALLOCATED(XKER_N_SWETH) ) ALLOCATE( XKER_N_SWETH(NWETLBDAH,NWETLBDAS) ) + CALL NZCOLX ( IND, XALPHAH, XNUH, XALPHAS, XNUS, & + ZEHS, XCH, XDH, 0., XCS, XDS, XFVELOS, & ! + XWETLBDAH_MAX, XWETLBDAS_MAX, XWETLBDAH_MIN, XWETLBDAS_MIN, & ! + ZFDINFTY, XKER_N_SWETH ) + WRITE(UNIT=ILUOUT0,FMT='("!")') + WRITE(UNIT=ILUOUT0,FMT='("IF( PRESENT(PKER_N_SWETH) ) THEN")') + DO J1 = 1 , NWETLBDAH + DO J2 = 1 , NWETLBDAS + WRITE(UNIT=ILUOUT0,FMT='(" PKER_N_SWETH(",I3,",",I3,") = ",E13.6)') & + J1,J2,XKER_N_SWETH(J1,J2) + END DO + END DO + WRITE(UNIT=ILUOUT0,FMT='("!")') +end if IF( .NOT.ALLOCATED(XKER_SWETH) ) ALLOCATE( XKER_SWETH(NWETLBDAH,NWETLBDAS) ) ! CALL LIMA_READ_XKER_SWETH (KWETLBDAH,KWETLBDAS,KND, & @@ -1373,7 +1590,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,0., XCS, XDS, XFVELOS, & + ZEHS, XBS, XCH, XDH, 0., XCS, XDS, XFVELOS, & XWETLBDAH_MAX, XWETLBDAS_MAX, XWETLBDAH_MIN, XWETLBDAS_MIN, & ZFDINFTY, XKER_SWETH ) WRITE(UNIT=ILUOUT0,FMT='("*****************************************")') @@ -1425,6 +1642,22 @@ IND = 50 ! Number of interval used to integrate the dimensional ZEHG = 1.0 ! distributions when computing the kernel XKER_GWETH ZFDINFTY = 20.0 ! +if ( NMOM_G.GE.2 ) then + IF( .NOT.ALLOCATED(XKER_N_GWETH) ) ALLOCATE( XKER_N_GWETH(NWETLBDAH,NWETLBDAG) ) + CALL NZCOLX ( IND, XALPHAH, XNUH, XALPHAG, XNUG, & + ZEHG, XCH, XDH, 0., XCG, XDG, 0., & + XWETLBDAH_MAX, XWETLBDAG_MAX, XWETLBDAH_MIN, XWETLBDAG_MIN, & + ZFDINFTY, XKER_N_GWETH ) + WRITE(UNIT=ILUOUT0,FMT='("!")') + WRITE(UNIT=ILUOUT0,FMT='("IF( PRESENT(PKER_N_GWETH) ) THEN")') + DO J1 = 1 , NWETLBDAH + DO J2 = 1 , NWETLBDAG + WRITE(UNIT=ILUOUT0,FMT='(" PKER_N_GWETH(",I3,",",I3,") = ",E13.6)') & + J1,J2,XKER_N_GWETH(J1,J2) + END DO + END DO + WRITE(UNIT=ILUOUT0,FMT='("!")') +end if IF( .NOT.ALLOCATED(XKER_GWETH) ) ALLOCATE( XKER_GWETH(NWETLBDAH,NWETLBDAG) ) ! CALL LIMA_READ_XKER_GWETH (KWETLBDAH,KWETLBDAG,KND, & @@ -1440,7 +1673,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,0., XCG, XDG, 0., & + 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 5ef1977aa..e01c3e526 100644 --- a/src/MNH/ini_lima_warm.f90 +++ b/src/MNH/ini_lima_warm.f90 @@ -163,6 +163,7 @@ ZGAMR(6) = MOMG(XALPHAR,XNUR,3.)**(2./3.)/MOMG(XALPHAR,XNUR,2.) XLBC = XAR*ZGAMC(2) XLBEXC = 1.0/XBC ! +XNR = 1.0/(XAR*MOMG(XALPHAR,XNUR,XBR)) IF (NMOM_R.EQ.1) THEN XCCR = 8.E6 XCXR = -1. diff --git a/src/MNH/lima.f90 b/src/MNH/lima.f90 index 5dd354385..6a6673423 100644 --- a/src/MNH/lima.f90 +++ b/src/MNH/lima.f90 @@ -239,26 +239,28 @@ REAL, DIMENSION(:), ALLOCATABLE :: & 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 Z_RI_CNVS, Z_CI_CNVS, & ! conversion ice -> snow (CNVS) : ri, Ni, rs=-ri + Z_CS_SSC, & ! self collection of snow (SSC) : Ns Z_RI_AGGS, Z_CI_AGGS, & ! aggregation of ice on snow (AGGS) : ri, Ni, rs=-ri Z_TH_DEPG, Z_RG_DEPG, & ! deposition of vapor on graupel (DEPG) : rv=-rg, rg, th Z_TH_BERFI, Z_RC_BERFI, & ! Bergeron (BERFI) : rc, ri=-rc, th - Z_TH_RIM, Z_RC_RIM, Z_CC_RIM, Z_RS_RIM, Z_RG_RIM, & ! cloud droplet riming (RIM) : rc, Nc, rs, rg, th + Z_TH_RIM, Z_RC_RIM, Z_CC_RIM, Z_RS_RIM, Z_CS_RIM, Z_RG_RIM, & ! cloud droplet riming (RIM) : rc, Nc, rs, Ns, rg, Ng=-Ns, th Z_RI_HMS, Z_CI_HMS, Z_RS_HMS, & ! hallett mossop snow (HMS) : ri, Ni, rs - Z_TH_ACC, Z_RR_ACC, Z_CR_ACC, Z_RS_ACC, Z_RG_ACC, & ! rain accretion on aggregates (ACC) : rr, Nr, rs, rg, th - Z_RS_CMEL, & ! conversion-melting (CMEL) : rs, rg=-rs + Z_TH_ACC, Z_RR_ACC, Z_CR_ACC, Z_RS_ACC, Z_CS_ACC, Z_RG_ACC, & ! rain accretion on aggregates (ACC) : rr, Nr, rs, Ns, rg, Ng=-Ns, th + Z_RS_CMEL, Z_CS_CMEL, & ! conversion-melting (CMEL) : rs, rg=-rs Z_TH_CFRZ, Z_RR_CFRZ, Z_CR_CFRZ, Z_RI_CFRZ, Z_CI_CFRZ, & ! rain freezing (CFRZ) : rr, Nr, ri, Ni, rg=-rr-ri, th Z_RI_CIBU, Z_CI_CIBU, & ! collisional ice break-up (CIBU) : ri, Ni, rs=-ri Z_RI_RDSF, Z_CI_RDSF, & ! rain drops freezing shattering (RDSF) : ri, Ni, rg=-ri Z_TH_WETG, Z_RC_WETG, Z_CC_WETG, Z_RR_WETG, Z_CR_WETG, & ! wet growth of graupel (WETG) : rc, NC, rr, Nr, ri, Ni, rs, rg, rh, th - Z_RI_WETG, Z_CI_WETG, Z_RS_WETG, Z_RG_WETG, Z_RH_WETG, & ! wet growth of graupel (WETG) : rc, NC, rr, Nr, ri, Ni, rs, rg, rh, th + Z_RI_WETG, Z_CI_WETG, Z_RS_WETG, Z_CS_WETG, Z_RG_WETG, Z_CG_WETG, Z_RH_WETG, & ! wet growth of graupel (WETG) : rc, NC, rr, Nr, ri, Ni, rs, Ns, rg, Ng, rh, Nh=-Ng, th Z_TH_DRYG, Z_RC_DRYG, Z_CC_DRYG, Z_RR_DRYG, Z_CR_DRYG, & ! dry growth of graupel (DRYG) : rc, Nc, rr, Nr, ri, Ni, rs, rg, th - Z_RI_DRYG, Z_CI_DRYG, Z_RS_DRYG, Z_RG_DRYG, & ! dry growth of graupel (DRYG) : rc, Nc, rr, Nr, ri, Ni, rs, rg, th + Z_RI_DRYG, Z_CI_DRYG, Z_RS_DRYG, Z_CS_DRYG, Z_RG_DRYG, & ! dry growth of graupel (DRYG) : rc, Nc, rr, Nr, ri, Ni, rs, Ns, rg, th Z_RI_HMG, Z_CI_HMG, Z_RG_HMG, & ! hallett mossop graupel (HMG) : ri, Ni, rg - Z_TH_GMLT, Z_RR_GMLT, Z_CR_GMLT, & ! graupel melting (GMLT) : rr, Nr, rg=-rr, th -! Z_RC_WETH, Z_CC_WETH, Z_RR_WETH, Z_CR_WETH, & ! wet growth of hail (WETH) : rc, Nc, rr, Nr, ri, Ni, rs, rg, rh, th -! Z_RI_WETH, Z_CI_WETH, Z_RS_WETH, Z_RG_WETH, Z_RH_WETH, & ! wet growth of hail (WETH) : rc, Nc, rr, Nr, ri, Ni, rs, rg, rh, th -! Z_RG_COHG, & ! conversion of hail into graupel (COHG) : rg, rh -! Z_RR_HMLT, Z_CR_HMLT ! hail melting (HMLT) : rr, Nr, rh=-rr, th + Z_TH_GMLT, Z_RR_GMLT, Z_CR_GMLT, Z_CG_GMLT, & ! graupel melting (GMLT) : rr, Nr, rg=-rr, th + Z_TH_DEPH, Z_RH_DEPH, & ! deposition of vapor on hail (DEPH) : rv=-rh, rh, th + Z_TH_WETH, Z_RC_WETH, Z_CC_WETH, Z_RR_WETH, Z_CR_WETH, & ! wet growth of hail (WETH) : rc, Nc, rr, Nr, ri, Ni, rs, rg, rh, th + Z_RI_WETH, Z_CI_WETH, Z_RS_WETH, Z_CS_WETH, Z_RG_WETH, Z_CG_WETH, Z_RH_WETH, & ! wet growth of hail (WETH) : rc, Nc, rr, Nr, ri, Ni, rs, rg, rh, th + Z_RG_COHG, Z_CG_COHG, & ! conversion of hail into graupel (COHG) : rg, rh + Z_TH_HMLT, Z_RR_HMLT, Z_CR_HMLT, Z_CH_HMLT, & ! hail melting (HMLT) : rr, Nr, rh=-rr, th Z_RV_CORR2, Z_RC_CORR2, Z_RR_CORR2, Z_RI_CORR2, & Z_CC_CORR2, Z_CR_CORR2, Z_CI_CORR2 ! @@ -292,26 +294,28 @@ REAL, DIMENSION(:,:,:), ALLOCATABLE :: & ZTOT_TH_DEPS, ZTOT_RS_DEPS, & ! deposition of vapor on snow (DEPS) ZTOT_TH_DEPI, ZTOT_RI_DEPI, & ! deposition of vapor on ice (DEPI) ZTOT_RI_CNVS, ZTOT_CI_CNVS, & ! conversion ice -> snow (CNVS) + ZTOT_CS_SSC, & ! self collection of snow (SSC) ZTOT_RI_AGGS, ZTOT_CI_AGGS, & ! aggregation of ice on snow (AGGS) ZTOT_TH_DEPG, ZTOT_RG_DEPG, & ! deposition of vapor on graupel (DEPG) ZTOT_TH_BERFI, ZTOT_RC_BERFI, & ! Bergeron (BERFI) - ZTOT_TH_RIM, ZTOT_RC_RIM, ZTOT_CC_RIM, ZTOT_RS_RIM, ZTOT_RG_RIM, & ! cloud droplet riming (RIM) + ZTOT_TH_RIM, ZTOT_RC_RIM, ZTOT_CC_RIM, ZTOT_RS_RIM, ZTOT_CS_RIM, ZTOT_RG_RIM, & ! cloud droplet riming (RIM) ZTOT_RI_HMS, ZTOT_CI_HMS, ZTOT_RS_HMS, & ! hallett mossop snow (HMS) - ZTOT_TH_ACC, ZTOT_RR_ACC, ZTOT_CR_ACC, ZTOT_RS_ACC, ZTOT_RG_ACC, & ! rain accretion on aggregates (ACC) - ZTOT_RS_CMEL, & ! conversion-melting (CMEL) + ZTOT_TH_ACC, ZTOT_RR_ACC, ZTOT_CR_ACC, ZTOT_RS_ACC, ZTOT_CS_ACC, ZTOT_RG_ACC, & ! rain accretion on aggregates (ACC) + ZTOT_RS_CMEL, ZTOT_CS_CMEL, & ! conversion-melting (CMEL) ZTOT_TH_CFRZ, ZTOT_RR_CFRZ, ZTOT_CR_CFRZ, ZTOT_RI_CFRZ, ZTOT_CI_CFRZ, & ! rain freezing (CFRZ) ZTOT_RI_CIBU, ZTOT_CI_CIBU, & ! collisional ice break-up (CIBU) ZTOT_RI_RDSF, ZTOT_CI_RDSF, & ! rain drops freezing shattering (RDSF) ZTOT_TH_WETG, ZTOT_RC_WETG, ZTOT_CC_WETG, ZTOT_RR_WETG, ZTOT_CR_WETG, & ! wet growth of graupel (WETG) - ZTOT_RI_WETG, ZTOT_CI_WETG, ZTOT_RS_WETG, ZTOT_RG_WETG, ZTOT_RH_WETG, & ! wet growth of graupel (WETG) + ZTOT_RI_WETG, ZTOT_CI_WETG, ZTOT_RS_WETG, ZTOT_CS_WETG, ZTOT_RG_WETG, ZTOT_CG_WETG, ZTOT_RH_WETG, & ! wet growth of graupel (WETG) ZTOT_TH_DRYG, ZTOT_RC_DRYG, ZTOT_CC_DRYG, ZTOT_RR_DRYG, ZTOT_CR_DRYG, & ! dry growth of graupel (DRYG) - ZTOT_RI_DRYG, ZTOT_CI_DRYG, ZTOT_RS_DRYG, ZTOT_RG_DRYG, & ! dry growth of graupel (DRYG) + ZTOT_RI_DRYG, ZTOT_CI_DRYG, ZTOT_RS_DRYG, ZTOT_CS_DRYG, ZTOT_RG_DRYG, & ! dry growth of graupel (DRYG) ZTOT_RI_HMG, ZTOT_CI_HMG, ZTOT_RG_HMG, & ! hallett mossop graupel (HMG) - ZTOT_TH_GMLT, ZTOT_RR_GMLT, ZTOT_CR_GMLT, & ! graupel melting (GMLT) -! ZTOT_RC_WETH, ZTOT_CC_WETH, ZTOT_RR_WETH, ZTOT_CR_WETH, & ! wet growth of hail (WETH) -! ZTOT_RI_WETH, ZTOT_CI_WETH, ZTOT_RS_WETH, ZTOT_RG_WETH, ZTOT_RH_WETH, & ! wet growth of hail (WETH) -! ZTOT_RG_COHG, & ! conversion of hail into graupel (COHG) -! ZTOT_RR_HMLT, ZTOT_CR_HMLT, & ! hail melting (HMLT) + ZTOT_TH_GMLT, ZTOT_RR_GMLT, ZTOT_CR_GMLT, ZTOT_CG_GMLT, & ! graupel melting (GMLT) + ZTOT_TH_DEPH, ZTOT_RH_DEPH, & ! deposition of vapor on hail (DEPH) + ZTOT_TH_WETH, ZTOT_RC_WETH, ZTOT_CC_WETH, ZTOT_RR_WETH, ZTOT_CR_WETH, & ! wet growth of hail (WETH) + ZTOT_RI_WETH, ZTOT_CI_WETH, ZTOT_RS_WETH, ZTOT_CS_WETH, ZTOT_RG_WETH, ZTOT_CG_WETH, ZTOT_RH_WETH, & ! wet growth of hail (WETH) + ZTOT_RG_COHG, ZTOT_CG_COHG, & ! conversion of hail into graupel (COHG) + ZTOT_TH_HMLT, ZTOT_RR_HMLT, ZTOT_CR_HMLT, ZTOT_CH_HMLT, & ! hail melting (HMLT) ZTOT_RR_CVRC, ZTOT_CR_CVRC, & ! conversion of rain into cloud droplets if diameter too small ZTOT_RV_CORR2, ZTOT_RC_CORR2, ZTOT_RR_CORR2, ZTOT_RI_CORR2, & ZTOT_CC_CORR2, ZTOT_CR_CORR2, ZTOT_CI_CORR2 @@ -448,6 +452,7 @@ if ( lbu_enable ) then allocate( ZTOT_RI_DEPI (size( ptht, 1), size( ptht, 2), size( ptht, 3) ) ); ZTOT_RI_DEPI(:,:,:) = 0. allocate( ZTOT_RI_CNVS (size( ptht, 1), size( ptht, 2), size( ptht, 3) ) ); ZTOT_RI_CNVS(:,:,:) = 0. allocate( ZTOT_CI_CNVS (size( ptht, 1), size( ptht, 2), size( ptht, 3) ) ); ZTOT_CI_CNVS(:,:,:) = 0. + allocate( ZTOT_CS_SSC (size( ptht, 1), size( ptht, 2), size( ptht, 3) ) ); ZTOT_CS_SSC(:,:,:) = 0. allocate( ZTOT_RI_AGGS (size( ptht, 1), size( ptht, 2), size( ptht, 3) ) ); ZTOT_RI_AGGS(:,:,:) = 0. allocate( ZTOT_CI_AGGS (size( ptht, 1), size( ptht, 2), size( ptht, 3) ) ); ZTOT_CI_AGGS(:,:,:) = 0. allocate( ZTOT_TH_DEPG (size( ptht, 1), size( ptht, 2), size( ptht, 3) ) ); ZTOT_TH_DEPG(:,:,:) = 0. @@ -458,6 +463,7 @@ if ( lbu_enable ) then allocate( ZTOT_RC_RIM (size( ptht, 1), size( ptht, 2), size( ptht, 3) ) ); ZTOT_RC_RIM(:,:,:) = 0. allocate( ZTOT_CC_RIM (size( ptht, 1), size( ptht, 2), size( ptht, 3) ) ); ZTOT_CC_RIM(:,:,:) = 0. allocate( ZTOT_RS_RIM (size( ptht, 1), size( ptht, 2), size( ptht, 3) ) ); ZTOT_RS_RIM(:,:,:) = 0. + allocate( ZTOT_CS_RIM (size( ptht, 1), size( ptht, 2), size( ptht, 3) ) ); ZTOT_CS_RIM(:,:,:) = 0. allocate( ZTOT_RG_RIM (size( ptht, 1), size( ptht, 2), size( ptht, 3) ) ); ZTOT_RG_RIM(:,:,:) = 0. allocate( ZTOT_RI_HMS (size( ptht, 1), size( ptht, 2), size( ptht, 3) ) ); ZTOT_RI_HMS(:,:,:) = 0. allocate( ZTOT_CI_HMS (size( ptht, 1), size( ptht, 2), size( ptht, 3) ) ); ZTOT_CI_HMS(:,:,:) = 0. @@ -466,8 +472,10 @@ if ( lbu_enable ) then allocate( ZTOT_RR_ACC (size( ptht, 1), size( ptht, 2), size( ptht, 3) ) ); ZTOT_RR_ACC(:,:,:) = 0. allocate( ZTOT_CR_ACC (size( ptht, 1), size( ptht, 2), size( ptht, 3) ) ); ZTOT_CR_ACC(:,:,:) = 0. allocate( ZTOT_RS_ACC (size( ptht, 1), size( ptht, 2), size( ptht, 3) ) ); ZTOT_RS_ACC(:,:,:) = 0. + allocate( ZTOT_CS_ACC (size( ptht, 1), size( ptht, 2), size( ptht, 3) ) ); ZTOT_CS_ACC(:,:,:) = 0. allocate( ZTOT_RG_ACC (size( ptht, 1), size( ptht, 2), size( ptht, 3) ) ); ZTOT_RG_ACC(:,:,:) = 0. allocate( ZTOT_RS_CMEL (size( ptht, 1), size( ptht, 2), size( ptht, 3) ) ); ZTOT_RS_CMEL(:,:,:) = 0. + allocate( ZTOT_CS_CMEL (size( ptht, 1), size( ptht, 2), size( ptht, 3) ) ); ZTOT_CS_CMEL(:,:,:) = 0. allocate( ZTOT_TH_CFRZ (size( ptht, 1), size( ptht, 2), size( ptht, 3) ) ); ZTOT_TH_CFRZ(:,:,:) = 0. allocate( ZTOT_RR_CFRZ (size( ptht, 1), size( ptht, 2), size( ptht, 3) ) ); ZTOT_RR_CFRZ(:,:,:) = 0. allocate( ZTOT_CR_CFRZ (size( ptht, 1), size( ptht, 2), size( ptht, 3) ) ); ZTOT_CR_CFRZ(:,:,:) = 0. @@ -485,7 +493,9 @@ if ( lbu_enable ) then allocate( ZTOT_RI_WETG (size( ptht, 1), size( ptht, 2), size( ptht, 3) ) ); ZTOT_RI_WETG(:,:,:) = 0. allocate( ZTOT_CI_WETG (size( ptht, 1), size( ptht, 2), size( ptht, 3) ) ); ZTOT_CI_WETG(:,:,:) = 0. allocate( ZTOT_RS_WETG (size( ptht, 1), size( ptht, 2), size( ptht, 3) ) ); ZTOT_RS_WETG(:,:,:) = 0. + allocate( ZTOT_CS_WETG (size( ptht, 1), size( ptht, 2), size( ptht, 3) ) ); ZTOT_CS_WETG(:,:,:) = 0. allocate( ZTOT_RG_WETG (size( ptht, 1), size( ptht, 2), size( ptht, 3) ) ); ZTOT_RG_WETG(:,:,:) = 0. + allocate( ZTOT_CG_WETG (size( ptht, 1), size( ptht, 2), size( ptht, 3) ) ); ZTOT_CG_WETG(:,:,:) = 0. allocate( ZTOT_RH_WETG (size( ptht, 1), size( ptht, 2), size( ptht, 3) ) ); ZTOT_RH_WETG(:,:,:) = 0. allocate( ZTOT_TH_DRYG (size( ptht, 1), size( ptht, 2), size( ptht, 3) ) ); ZTOT_TH_DRYG(:,:,:) = 0. allocate( ZTOT_RC_DRYG (size( ptht, 1), size( ptht, 2), size( ptht, 3) ) ); ZTOT_RC_DRYG(:,:,:) = 0. @@ -495,6 +505,7 @@ if ( lbu_enable ) then allocate( ZTOT_RI_DRYG (size( ptht, 1), size( ptht, 2), size( ptht, 3) ) ); ZTOT_RI_DRYG(:,:,:) = 0. allocate( ZTOT_CI_DRYG (size( ptht, 1), size( ptht, 2), size( ptht, 3) ) ); ZTOT_CI_DRYG(:,:,:) = 0. allocate( ZTOT_RS_DRYG (size( ptht, 1), size( ptht, 2), size( ptht, 3) ) ); ZTOT_RS_DRYG(:,:,:) = 0. + allocate( ZTOT_CS_DRYG (size( ptht, 1), size( ptht, 2), size( ptht, 3) ) ); ZTOT_CS_DRYG(:,:,:) = 0. allocate( ZTOT_RG_DRYG (size( ptht, 1), size( ptht, 2), size( ptht, 3) ) ); ZTOT_RG_DRYG(:,:,:) = 0. allocate( ZTOT_RI_HMG (size( ptht, 1), size( ptht, 2), size( ptht, 3) ) ); ZTOT_RI_HMG(:,:,:) = 0. allocate( ZTOT_CI_HMG (size( ptht, 1), size( ptht, 2), size( ptht, 3) ) ); ZTOT_CI_HMG(:,:,:) = 0. @@ -502,18 +513,27 @@ if ( lbu_enable ) then allocate( ZTOT_TH_GMLT (size( ptht, 1), size( ptht, 2), size( ptht, 3) ) ); ZTOT_TH_GMLT(:,:,:) = 0. allocate( ZTOT_RR_GMLT (size( ptht, 1), size( ptht, 2), size( ptht, 3) ) ); ZTOT_RR_GMLT(:,:,:) = 0. allocate( ZTOT_CR_GMLT (size( ptht, 1), size( ptht, 2), size( ptht, 3) ) ); ZTOT_CR_GMLT(:,:,:) = 0. -! allocate( ZTOT_RC_WETH (size( ptht, 1), size( ptht, 2), size( ptht, 3) ) ); ZTOT_RC_WETH(:,:,:) = 0. -! allocate( ZTOT_CC_WETH (size( ptht, 1), size( ptht, 2), size( ptht, 3) ) ); ZTOT_CC_WETH(:,:,:) = 0. -! allocate( ZTOT_RR_WETH (size( ptht, 1), size( ptht, 2), size( ptht, 3) ) ); ZTOT_RR_WETH(:,:,:) = 0. -! allocate( ZTOT_CR_WETH (size( ptht, 1), size( ptht, 2), size( ptht, 3) ) ); ZTOT_CR_WETH(:,:,:) = 0. -! allocate( ZTOT_RI_WETH (size( ptht, 1), size( ptht, 2), size( ptht, 3) ) ); ZTOT_RI_WETH(:,:,:) = 0. -! allocate( ZTOT_CI_WETH (size( ptht, 1), size( ptht, 2), size( ptht, 3) ) ); ZTOT_CI_WETH(:,:,:) = 0. -! allocate( ZTOT_RS_WETH (size( ptht, 1), size( ptht, 2), size( ptht, 3) ) ); ZTOT_RS_WETH(:,:,:) = 0. -! allocate( ZTOT_RG_WETH (size( ptht, 1), size( ptht, 2), size( ptht, 3) ) ); ZTOT_RG_WETH(:,:,:) = 0. -! allocate( ZTOT_RH_WETH (size( ptht, 1), size( ptht, 2), size( ptht, 3) ) ); ZTOT_RH_WETH(:,:,:) = 0. -! allocate( ZTOT_RG_COHG (size( ptht, 1), size( ptht, 2), size( ptht, 3) ) ); ZTOT_RG_COHG(:,:,:) = 0. -! allocate( ZTOT_RR_HMLT (size( ptht, 1), size( ptht, 2), size( ptht, 3) ) ); ZTOT_RR_HMLT(:,:,:) = 0. -! allocate( ZTOT_CR_HMLT (size( ptht, 1), size( ptht, 2), size( ptht, 3) ) ); ZTOT_CR_HMLT(:,:,:) = 0. + allocate( ZTOT_CG_GMLT (size( ptht, 1), size( ptht, 2), size( ptht, 3) ) ); ZTOT_CG_GMLT(:,:,:) = 0. + allocate( ZTOT_TH_DEPH (size( ptht, 1), size( ptht, 2), size( ptht, 3) ) ); ZTOT_TH_DEPH(:,:,:) = 0. + allocate( ZTOT_RH_DEPH (size( ptht, 1), size( ptht, 2), size( ptht, 3) ) ); ZTOT_RH_DEPH(:,:,:) = 0. + allocate( ZTOT_TH_WETH (size( ptht, 1), size( ptht, 2), size( ptht, 3) ) ); ZTOT_TH_WETH(:,:,:) = 0. + allocate( ZTOT_RC_WETH (size( ptht, 1), size( ptht, 2), size( ptht, 3) ) ); ZTOT_RC_WETH(:,:,:) = 0. + allocate( ZTOT_CC_WETH (size( ptht, 1), size( ptht, 2), size( ptht, 3) ) ); ZTOT_CC_WETH(:,:,:) = 0. + allocate( ZTOT_RR_WETH (size( ptht, 1), size( ptht, 2), size( ptht, 3) ) ); ZTOT_RR_WETH(:,:,:) = 0. + allocate( ZTOT_CR_WETH (size( ptht, 1), size( ptht, 2), size( ptht, 3) ) ); ZTOT_CR_WETH(:,:,:) = 0. + allocate( ZTOT_RI_WETH (size( ptht, 1), size( ptht, 2), size( ptht, 3) ) ); ZTOT_RI_WETH(:,:,:) = 0. + allocate( ZTOT_CI_WETH (size( ptht, 1), size( ptht, 2), size( ptht, 3) ) ); ZTOT_CI_WETH(:,:,:) = 0. + allocate( ZTOT_RS_WETH (size( ptht, 1), size( ptht, 2), size( ptht, 3) ) ); ZTOT_RS_WETH(:,:,:) = 0. + allocate( ZTOT_CS_WETH (size( ptht, 1), size( ptht, 2), size( ptht, 3) ) ); ZTOT_CS_WETH(:,:,:) = 0. + allocate( ZTOT_RG_WETH (size( ptht, 1), size( ptht, 2), size( ptht, 3) ) ); ZTOT_RG_WETH(:,:,:) = 0. + allocate( ZTOT_CG_WETH (size( ptht, 1), size( ptht, 2), size( ptht, 3) ) ); ZTOT_CG_WETH(:,:,:) = 0. + allocate( ZTOT_RH_WETH (size( ptht, 1), size( ptht, 2), size( ptht, 3) ) ); ZTOT_RH_WETH(:,:,:) = 0. + allocate( ZTOT_RG_COHG (size( ptht, 1), size( ptht, 2), size( ptht, 3) ) ); ZTOT_RG_COHG(:,:,:) = 0. + allocate( ZTOT_CG_COHG (size( ptht, 1), size( ptht, 2), size( ptht, 3) ) ); ZTOT_CG_COHG(:,:,:) = 0. + allocate( ZTOT_TH_HMLT (size( ptht, 1), size( ptht, 2), size( ptht, 3) ) ); ZTOT_TH_HMLT(:,:,:) = 0. + allocate( ZTOT_RR_HMLT (size( ptht, 1), size( ptht, 2), size( ptht, 3) ) ); ZTOT_RR_HMLT(:,:,:) = 0. + allocate( ZTOT_CR_HMLT (size( ptht, 1), size( ptht, 2), size( ptht, 3) ) ); ZTOT_CR_HMLT(:,:,:) = 0. + allocate( ZTOT_CH_HMLT (size( ptht, 1), size( ptht, 2), size( ptht, 3) ) ); ZTOT_CH_HMLT(:,:,:) = 0. allocate( ZTOT_RR_CVRC (size( ptht, 1), size( ptht, 2), size( ptht, 3) ) ); ZTOT_RR_CVRC(:,:,:) = 0. allocate( ZTOT_CR_CVRC (size( ptht, 1), size( ptht, 2), size( ptht, 3) ) ); ZTOT_CR_CVRC(:,:,:) = 0. @@ -1045,68 +1065,96 @@ DO WHILE(ANY(ZTIME(IIB:IIE,IJB:IJE,IKTB:IKTE)<PTSTEP)) ALLOCATE(Z_RI_DEPI(IPACK)) ; Z_RI_DEPI(:) = 0. ALLOCATE(Z_RI_CNVS(IPACK)) ; Z_RI_CNVS(:) = 0. ALLOCATE(Z_CI_CNVS(IPACK)) ; Z_CI_CNVS(:) = 0. + ALLOCATE(Z_CS_SSC(IPACK)) ; Z_CS_SSC(:) = 0. ALLOCATE(Z_RI_AGGS(IPACK)) ; Z_RI_AGGS(:) = 0. ALLOCATE(Z_CI_AGGS(IPACK)) ; Z_CI_AGGS(:) = 0. ALLOCATE(Z_TH_DEPG(IPACK)) ; Z_TH_DEPG(:) = 0. ALLOCATE(Z_RG_DEPG(IPACK)) ; Z_RG_DEPG(:) = 0. ALLOCATE(Z_TH_BERFI(IPACK)) ; Z_TH_BERFI(:) = 0. ALLOCATE(Z_RC_BERFI(IPACK)) ; Z_RC_BERFI(:) = 0. - ALLOCATE(Z_TH_RIM(IPACK)) ; Z_TH_RIM = 0. - ALLOCATE(Z_RC_RIM(IPACK)) ; Z_RC_RIM = 0. - ALLOCATE(Z_CC_RIM(IPACK)) ; Z_CC_RIM = 0. - ALLOCATE(Z_RS_RIM(IPACK)) ; Z_RS_RIM = 0. - ALLOCATE(Z_RG_RIM(IPACK)) ; Z_RG_RIM = 0. - ALLOCATE(Z_RI_HMS(IPACK)) ; Z_RI_HMS = 0. - ALLOCATE(Z_CI_HMS(IPACK)) ; Z_CI_HMS = 0. - ALLOCATE(Z_RS_HMS(IPACK)) ; Z_RS_HMS = 0. - ALLOCATE(Z_TH_ACC(IPACK)) ; Z_TH_ACC = 0. - ALLOCATE(Z_RR_ACC(IPACK)) ; Z_RR_ACC = 0. - ALLOCATE(Z_CR_ACC(IPACK)) ; Z_CR_ACC = 0. - ALLOCATE(Z_RS_ACC(IPACK)) ; Z_RS_ACC = 0. - ALLOCATE(Z_RG_ACC(IPACK)) ; Z_RG_ACC = 0. - ALLOCATE(Z_RS_CMEL(IPACK)) ; Z_RS_CMEL = 0. - ALLOCATE(Z_TH_CFRZ(IPACK)) ; Z_TH_CFRZ = 0. - ALLOCATE(Z_RR_CFRZ(IPACK)) ; Z_RR_CFRZ = 0. - ALLOCATE(Z_CR_CFRZ(IPACK)) ; Z_CR_CFRZ = 0. - ALLOCATE(Z_RI_CFRZ(IPACK)) ; Z_RI_CFRZ = 0. - ALLOCATE(Z_CI_CFRZ(IPACK)) ; Z_CI_CFRZ = 0. - ALLOCATE(Z_RI_CIBU(IPACK)) ; Z_RI_CIBU = 0. - ALLOCATE(Z_CI_CIBU(IPACK)) ; Z_CI_CIBU = 0. - ALLOCATE(Z_RI_RDSF(IPACK)) ; Z_RI_RDSF = 0. - ALLOCATE(Z_CI_RDSF(IPACK)) ; Z_CI_RDSF = 0. - ALLOCATE(Z_TH_WETG(IPACK)) ; Z_TH_WETG = 0. - ALLOCATE(Z_RC_WETG(IPACK)) ; Z_RC_WETG = 0. - ALLOCATE(Z_CC_WETG(IPACK)) ; Z_CC_WETG = 0. - ALLOCATE(Z_RR_WETG(IPACK)) ; Z_RR_WETG = 0. - ALLOCATE(Z_CR_WETG(IPACK)) ; Z_CR_WETG = 0. - ALLOCATE(Z_RI_WETG(IPACK)) ; Z_RI_WETG = 0. - ALLOCATE(Z_CI_WETG(IPACK)) ; Z_CI_WETG = 0. - ALLOCATE(Z_RS_WETG(IPACK)) ; Z_RS_WETG = 0. - ALLOCATE(Z_RG_WETG(IPACK)) ; Z_RG_WETG = 0. - ALLOCATE(Z_RH_WETG(IPACK)) ; Z_RH_WETG = 0. - ALLOCATE(Z_TH_DRYG(IPACK)) ; Z_TH_DRYG = 0. - ALLOCATE(Z_RC_DRYG(IPACK)) ; Z_RC_DRYG = 0. - ALLOCATE(Z_CC_DRYG(IPACK)) ; Z_CC_DRYG = 0. - ALLOCATE(Z_RR_DRYG(IPACK)) ; Z_RR_DRYG = 0. - ALLOCATE(Z_CR_DRYG(IPACK)) ; Z_CR_DRYG = 0. - ALLOCATE(Z_RI_DRYG(IPACK)) ; Z_RI_DRYG = 0. - ALLOCATE(Z_CI_DRYG(IPACK)) ; Z_CI_DRYG = 0. - ALLOCATE(Z_RS_DRYG(IPACK)) ; Z_RS_DRYG = 0. - ALLOCATE(Z_RG_DRYG(IPACK)) ; Z_RG_DRYG = 0. - ALLOCATE(Z_RI_HMG(IPACK)) ; Z_RI_HMG = 0. - ALLOCATE(Z_CI_HMG(IPACK)) ; Z_CI_HMG = 0. - ALLOCATE(Z_RG_HMG(IPACK)) ; Z_RG_HMG = 0. - ALLOCATE(Z_TH_GMLT(IPACK)) ; Z_TH_GMLT = 0. - ALLOCATE(Z_RR_GMLT(IPACK)) ; Z_RR_GMLT = 0. - ALLOCATE(Z_CR_GMLT(IPACK)) ; Z_CR_GMLT = 0. + ALLOCATE(Z_TH_RIM(IPACK)) ; Z_TH_RIM(:) = 0. + ALLOCATE(Z_RC_RIM(IPACK)) ; Z_RC_RIM(:) = 0. + ALLOCATE(Z_CC_RIM(IPACK)) ; Z_CC_RIM(:) = 0. + ALLOCATE(Z_RS_RIM(IPACK)) ; Z_RS_RIM(:) = 0. + ALLOCATE(Z_CS_RIM(IPACK)) ; Z_CS_RIM(:) = 0. + ALLOCATE(Z_RG_RIM(IPACK)) ; Z_RG_RIM(:) = 0. + ALLOCATE(Z_RI_HMS(IPACK)) ; Z_RI_HMS(:) = 0. + ALLOCATE(Z_CI_HMS(IPACK)) ; Z_CI_HMS(:) = 0. + ALLOCATE(Z_RS_HMS(IPACK)) ; Z_RS_HMS(:) = 0. + ALLOCATE(Z_TH_ACC(IPACK)) ; Z_TH_ACC(:) = 0. + ALLOCATE(Z_RR_ACC(IPACK)) ; Z_RR_ACC(:) = 0. + ALLOCATE(Z_CR_ACC(IPACK)) ; Z_CR_ACC(:) = 0. + ALLOCATE(Z_RS_ACC(IPACK)) ; Z_RS_ACC(:) = 0. + ALLOCATE(Z_CS_ACC(IPACK)) ; Z_CS_ACC(:) = 0. + ALLOCATE(Z_RG_ACC(IPACK)) ; Z_RG_ACC(:) = 0. + ALLOCATE(Z_RS_CMEL(IPACK)) ; Z_RS_CMEL(:) = 0. + ALLOCATE(Z_CS_CMEL(IPACK)) ; Z_CS_CMEL(:) = 0. + ALLOCATE(Z_TH_CFRZ(IPACK)) ; Z_TH_CFRZ(:) = 0. + ALLOCATE(Z_RR_CFRZ(IPACK)) ; Z_RR_CFRZ(:) = 0. + ALLOCATE(Z_CR_CFRZ(IPACK)) ; Z_CR_CFRZ(:) = 0. + ALLOCATE(Z_RI_CFRZ(IPACK)) ; Z_RI_CFRZ(:) = 0. + ALLOCATE(Z_CI_CFRZ(IPACK)) ; Z_CI_CFRZ(:) = 0. + ALLOCATE(Z_RI_CIBU(IPACK)) ; Z_RI_CIBU(:) = 0. + ALLOCATE(Z_CI_CIBU(IPACK)) ; Z_CI_CIBU(:) = 0. + ALLOCATE(Z_RI_RDSF(IPACK)) ; Z_RI_RDSF(:) = 0. + ALLOCATE(Z_CI_RDSF(IPACK)) ; Z_CI_RDSF(:) = 0. + ALLOCATE(Z_TH_WETG(IPACK)) ; Z_TH_WETG(:) = 0. + ALLOCATE(Z_RC_WETG(IPACK)) ; Z_RC_WETG(:) = 0. + ALLOCATE(Z_CC_WETG(IPACK)) ; Z_CC_WETG(:) = 0. + ALLOCATE(Z_RR_WETG(IPACK)) ; Z_RR_WETG(:) = 0. + ALLOCATE(Z_CR_WETG(IPACK)) ; Z_CR_WETG(:) = 0. + ALLOCATE(Z_RI_WETG(IPACK)) ; Z_RI_WETG(:) = 0. + ALLOCATE(Z_CI_WETG(IPACK)) ; Z_CI_WETG(:) = 0. + ALLOCATE(Z_RS_WETG(IPACK)) ; Z_RS_WETG(:) = 0. + ALLOCATE(Z_CS_WETG(IPACK)) ; Z_CS_WETG(:) = 0. + ALLOCATE(Z_RG_WETG(IPACK)) ; Z_RG_WETG(:) = 0. + ALLOCATE(Z_CG_WETG(IPACK)) ; Z_CG_WETG(:) = 0. + ALLOCATE(Z_RH_WETG(IPACK)) ; Z_RH_WETG(:) = 0. + ALLOCATE(Z_TH_DRYG(IPACK)) ; Z_TH_DRYG(:) = 0. + ALLOCATE(Z_RC_DRYG(IPACK)) ; Z_RC_DRYG(:) = 0. + ALLOCATE(Z_CC_DRYG(IPACK)) ; Z_CC_DRYG(:) = 0. + ALLOCATE(Z_RR_DRYG(IPACK)) ; Z_RR_DRYG(:) = 0. + ALLOCATE(Z_CR_DRYG(IPACK)) ; Z_CR_DRYG(:) = 0. + ALLOCATE(Z_RI_DRYG(IPACK)) ; Z_RI_DRYG(:) = 0. + ALLOCATE(Z_CI_DRYG(IPACK)) ; Z_CI_DRYG(:) = 0. + ALLOCATE(Z_RS_DRYG(IPACK)) ; Z_RS_DRYG(:) = 0. + ALLOCATE(Z_CS_DRYG(IPACK)) ; Z_CS_DRYG(:) = 0. + ALLOCATE(Z_RG_DRYG(IPACK)) ; Z_RG_DRYG(:) = 0. + ALLOCATE(Z_RI_HMG(IPACK)) ; Z_RI_HMG(:) = 0. + ALLOCATE(Z_CI_HMG(IPACK)) ; Z_CI_HMG(:) = 0. + ALLOCATE(Z_RG_HMG(IPACK)) ; Z_RG_HMG(:) = 0. + ALLOCATE(Z_TH_GMLT(IPACK)) ; Z_TH_GMLT(:) = 0. + ALLOCATE(Z_RR_GMLT(IPACK)) ; Z_RR_GMLT(:) = 0. + ALLOCATE(Z_CR_GMLT(IPACK)) ; Z_CR_GMLT(:) = 0. + ALLOCATE(Z_CG_GMLT(IPACK)) ; Z_CG_GMLT(:) = 0. + ALLOCATE(Z_TH_DEPH(IPACK)) ; Z_TH_DEPH(:) = 0. + ALLOCATE(Z_RH_DEPH(IPACK)) ; Z_RH_DEPH(:) = 0. + ALLOCATE(Z_TH_WETH(IPACK)) ; Z_TH_WETH(:) = 0. + ALLOCATE(Z_RC_WETH(IPACK)) ; Z_RC_WETH(:) = 0. + ALLOCATE(Z_CC_WETH(IPACK)) ; Z_CC_WETH(:) = 0. + ALLOCATE(Z_RR_WETH(IPACK)) ; Z_RR_WETH(:) = 0. + ALLOCATE(Z_CR_WETH(IPACK)) ; Z_CR_WETH(:) = 0. + ALLOCATE(Z_RI_WETH(IPACK)) ; Z_RI_WETH(:) = 0. + ALLOCATE(Z_CI_WETH(IPACK)) ; Z_CI_WETH(:) = 0. + ALLOCATE(Z_RS_WETH(IPACK)) ; Z_RS_WETH(:) = 0. + ALLOCATE(Z_CS_WETH(IPACK)) ; Z_CS_WETH(:) = 0. + ALLOCATE(Z_RG_WETH(IPACK)) ; Z_RG_WETH(:) = 0. + ALLOCATE(Z_CG_WETH(IPACK)) ; Z_CG_WETH(:) = 0. + ALLOCATE(Z_RH_WETH(IPACK)) ; Z_RH_WETH(:) = 0. + ALLOCATE(Z_RG_COHG(IPACK)) ; Z_RG_COHG(:) = 0. + ALLOCATE(Z_CG_COHG(IPACK)) ; Z_CG_COHG(:) = 0. + ALLOCATE(Z_TH_HMLT(IPACK)) ; Z_TH_HMLT(:) = 0. + ALLOCATE(Z_RR_HMLT(IPACK)) ; Z_RR_HMLT(:) = 0. + ALLOCATE(Z_CR_HMLT(IPACK)) ; Z_CR_HMLT(:) = 0. + ALLOCATE(Z_CH_HMLT(IPACK)) ; Z_CH_HMLT(:) = 0. - ALLOCATE(Z_RV_CORR2(IPACK)) ; Z_RV_CORR2 = 0. - ALLOCATE(Z_RC_CORR2(IPACK)) ; Z_RC_CORR2 = 0. - ALLOCATE(Z_RR_CORR2(IPACK)) ; Z_RR_CORR2 = 0. - ALLOCATE(Z_RI_CORR2(IPACK)) ; Z_RI_CORR2 = 0. - ALLOCATE(Z_CC_CORR2(IPACK)) ; Z_CC_CORR2 = 0. - ALLOCATE(Z_CR_CORR2(IPACK)) ; Z_CR_CORR2 = 0. - ALLOCATE(Z_CI_CORR2(IPACK)) ; Z_CI_CORR2 = 0. + ALLOCATE(Z_RV_CORR2(IPACK)) ; Z_RV_CORR2(:) = 0. + ALLOCATE(Z_RC_CORR2(IPACK)) ; Z_RC_CORR2(:) = 0. + ALLOCATE(Z_RR_CORR2(IPACK)) ; Z_RR_CORR2(:) = 0. + ALLOCATE(Z_RI_CORR2(IPACK)) ; Z_RI_CORR2(:) = 0. + ALLOCATE(Z_CC_CORR2(IPACK)) ; Z_CC_CORR2(:) = 0. + ALLOCATE(Z_CR_CORR2(IPACK)) ; Z_CR_CORR2(:) = 0. + ALLOCATE(Z_CI_CORR2(IPACK)) ; Z_CI_CORR2(:) = 0. ! !*** 4.1 Tendecies computation ! @@ -1138,26 +1186,28 @@ DO WHILE(ANY(ZTIME(IIB:IIE,IJB:IJE,IKTB:IKTE)<PTSTEP)) Z_TH_DEPS, Z_RS_DEPS, & Z_TH_DEPI, Z_RI_DEPI, & Z_RI_CNVS, Z_CI_CNVS, & + Z_CS_SSC, & Z_RI_AGGS, Z_CI_AGGS, & Z_TH_DEPG, Z_RG_DEPG, & Z_TH_BERFI, Z_RC_BERFI, & - Z_TH_RIM, Z_RC_RIM, Z_CC_RIM, Z_RS_RIM, Z_RG_RIM, & + Z_TH_RIM, Z_RC_RIM, Z_CC_RIM, Z_RS_RIM, Z_CS_RIM, Z_RG_RIM, & Z_RI_HMS, Z_CI_HMS, Z_RS_HMS, & - Z_TH_ACC, Z_RR_ACC, Z_CR_ACC, Z_RS_ACC, Z_RG_ACC, & - Z_RS_CMEL, & + Z_TH_ACC, Z_RR_ACC, Z_CR_ACC, Z_RS_ACC, Z_CS_ACC, Z_RG_ACC, & + Z_RS_CMEL, Z_CS_CMEL, & Z_TH_CFRZ, Z_RR_CFRZ, Z_CR_CFRZ, Z_RI_CFRZ, Z_CI_CFRZ, & Z_RI_CIBU, Z_CI_CIBU, & Z_RI_RDSF, Z_CI_RDSF, & Z_TH_WETG, Z_RC_WETG, Z_CC_WETG, Z_RR_WETG, Z_CR_WETG, & - Z_RI_WETG, Z_CI_WETG, Z_RS_WETG, Z_RG_WETG, Z_RH_WETG, & + Z_RI_WETG, Z_CI_WETG, Z_RS_WETG, Z_CS_WETG, Z_RG_WETG, Z_CG_WETG, Z_RH_WETG, & Z_TH_DRYG, Z_RC_DRYG, Z_CC_DRYG, Z_RR_DRYG, Z_CR_DRYG, & - Z_RI_DRYG, Z_CI_DRYG, Z_RS_DRYG, Z_RG_DRYG, & + Z_RI_DRYG, Z_CI_DRYG, Z_RS_DRYG, Z_CS_DRYG, Z_RG_DRYG, & Z_RI_HMG, Z_CI_HMG, Z_RG_HMG, & - Z_TH_GMLT, Z_RR_GMLT, Z_CR_GMLT, & -!!! Z_RC_WETH, Z_CC_WETH, Z_RR_WETH, Z_CR_WETH, & ! wet growth of hail (WETH) : rc, Nc, rr, Nr, ri, Ni, rs, rg, rh, th -!!! Z_RI_WETH, Z_CI_WETH, Z_RS_WETH, Z_RG_WETH, Z_RH_WETH, & ! wet growth of hail (WETH) : rc, Nc, rr, Nr, ri, Ni, rs, rg, rh, th -!!! Z_RG_COHG, & ! conversion of hail into graupel (COHG) : rg, rh -!!! Z_RR_HMLT, Z_CR_HMLT ! hail melting (HMLT) : rr, Nr, rh=-rr, th + Z_TH_GMLT, Z_RR_GMLT, Z_CR_GMLT, Z_CG_GMLT, & + Z_TH_DEPH, Z_RH_DEPH, & + Z_TH_WETH, Z_RC_WETH, Z_CC_WETH, Z_RR_WETH, Z_CR_WETH, & + Z_RI_WETH, Z_CI_WETH, Z_RS_WETH, Z_CS_WETH, Z_RG_WETH, Z_CG_WETH, Z_RH_WETH, & + Z_RG_COHG, Z_CG_COHG, & + Z_TH_HMLT, Z_RR_HMLT, Z_CR_HMLT, Z_CH_HMLT, & ZA_TH, ZA_RV, ZA_RC, ZA_CC, ZA_RR, ZA_CR, & ZA_RI, ZA_CI, ZA_RS, ZA_CS, ZA_RG, ZA_CG, ZA_RH, ZA_CH, & ZEVAP1D, & @@ -1435,6 +1485,7 @@ DO WHILE(ANY(ZTIME(IIB:IIE,IJB:IJE,IKTB:IKTE)<PTSTEP)) ZTOT_RI_DEPI(I1(II),I2(II),I3(II)) = ZTOT_RI_DEPI(I1(II),I2(II),I3(II)) + Z_RI_DEPI(II) * ZMAXTIME(II) ZTOT_RI_CNVS(I1(II),I2(II),I3(II)) = ZTOT_RI_CNVS(I1(II),I2(II),I3(II)) + Z_RI_CNVS(II) * ZMAXTIME(II) ZTOT_CI_CNVS(I1(II),I2(II),I3(II)) = ZTOT_CI_CNVS(I1(II),I2(II),I3(II)) + Z_CI_CNVS(II) * ZMAXTIME(II) + ZTOT_CS_SSC(I1(II),I2(II),I3(II)) = ZTOT_CS_SSC(I1(II),I2(II),I3(II)) + Z_CS_SSC(II) * ZMAXTIME(II) ZTOT_RI_AGGS(I1(II),I2(II),I3(II)) = ZTOT_RI_AGGS(I1(II),I2(II),I3(II)) + Z_RI_AGGS(II) * ZMAXTIME(II) ZTOT_CI_AGGS(I1(II),I2(II),I3(II)) = ZTOT_CI_AGGS(I1(II),I2(II),I3(II)) + Z_CI_AGGS(II) * ZMAXTIME(II) ZTOT_TH_DEPG(I1(II),I2(II),I3(II)) = ZTOT_TH_DEPG(I1(II),I2(II),I3(II)) + Z_TH_DEPG(II) * ZMAXTIME(II) @@ -1445,6 +1496,7 @@ DO WHILE(ANY(ZTIME(IIB:IIE,IJB:IJE,IKTB:IKTE)<PTSTEP)) ZTOT_RC_RIM(I1(II),I2(II),I3(II)) = ZTOT_RC_RIM(I1(II),I2(II),I3(II)) + Z_RC_RIM(II) * ZMAXTIME(II) ZTOT_CC_RIM(I1(II),I2(II),I3(II)) = ZTOT_CC_RIM(I1(II),I2(II),I3(II)) + Z_CC_RIM(II) * ZMAXTIME(II) ZTOT_RS_RIM(I1(II),I2(II),I3(II)) = ZTOT_RS_RIM(I1(II),I2(II),I3(II)) + Z_RS_RIM(II) * ZMAXTIME(II) + ZTOT_CS_RIM(I1(II),I2(II),I3(II)) = ZTOT_CS_RIM(I1(II),I2(II),I3(II)) + Z_CS_RIM(II) * ZMAXTIME(II) ZTOT_RG_RIM(I1(II),I2(II),I3(II)) = ZTOT_RG_RIM(I1(II),I2(II),I3(II)) + Z_RG_RIM(II) * ZMAXTIME(II) ZTOT_RI_HMS(I1(II),I2(II),I3(II)) = ZTOT_RI_HMS(I1(II),I2(II),I3(II)) + Z_RI_HMS(II) * ZMAXTIME(II) ZTOT_CI_HMS(I1(II),I2(II),I3(II)) = ZTOT_CI_HMS(I1(II),I2(II),I3(II)) + Z_CI_HMS(II) * ZMAXTIME(II) @@ -1453,7 +1505,9 @@ DO WHILE(ANY(ZTIME(IIB:IIE,IJB:IJE,IKTB:IKTE)<PTSTEP)) ZTOT_RR_ACC(I1(II),I2(II),I3(II)) = ZTOT_RR_ACC(I1(II),I2(II),I3(II)) + Z_RR_ACC(II) * ZMAXTIME(II) ZTOT_CR_ACC(I1(II),I2(II),I3(II)) = ZTOT_CR_ACC(I1(II),I2(II),I3(II)) + Z_CR_ACC(II) * ZMAXTIME(II) ZTOT_RS_ACC(I1(II),I2(II),I3(II)) = ZTOT_RS_ACC(I1(II),I2(II),I3(II)) + Z_RS_ACC(II) * ZMAXTIME(II) + ZTOT_CS_ACC(I1(II),I2(II),I3(II)) = ZTOT_CS_ACC(I1(II),I2(II),I3(II)) + Z_CS_ACC(II) * ZMAXTIME(II) ZTOT_RG_ACC(I1(II),I2(II),I3(II)) = ZTOT_RG_ACC(I1(II),I2(II),I3(II)) + Z_RG_ACC(II) * ZMAXTIME(II) + ZTOT_CS_CMEL(I1(II),I2(II),I3(II)) = ZTOT_CS_CMEL(I1(II),I2(II),I3(II)) + Z_CS_CMEL(II) * ZMAXTIME(II) ZTOT_RS_CMEL(I1(II),I2(II),I3(II)) = ZTOT_RS_CMEL(I1(II),I2(II),I3(II)) + Z_RS_CMEL(II) * ZMAXTIME(II) ZTOT_TH_CFRZ(I1(II),I2(II),I3(II)) = ZTOT_TH_CFRZ(I1(II),I2(II),I3(II)) + Z_TH_CFRZ(II) * ZMAXTIME(II) ZTOT_RR_CFRZ(I1(II),I2(II),I3(II)) = ZTOT_RR_CFRZ(I1(II),I2(II),I3(II)) + Z_RR_CFRZ(II) * ZMAXTIME(II) @@ -1472,7 +1526,9 @@ DO WHILE(ANY(ZTIME(IIB:IIE,IJB:IJE,IKTB:IKTE)<PTSTEP)) ZTOT_RI_WETG(I1(II),I2(II),I3(II)) = ZTOT_RI_WETG(I1(II),I2(II),I3(II)) + Z_RI_WETG(II) * ZMAXTIME(II) ZTOT_CI_WETG(I1(II),I2(II),I3(II)) = ZTOT_CI_WETG(I1(II),I2(II),I3(II)) + Z_CI_WETG(II) * ZMAXTIME(II) ZTOT_RS_WETG(I1(II),I2(II),I3(II)) = ZTOT_RS_WETG(I1(II),I2(II),I3(II)) + Z_RS_WETG(II) * ZMAXTIME(II) + ZTOT_CS_WETG(I1(II),I2(II),I3(II)) = ZTOT_CS_WETG(I1(II),I2(II),I3(II)) + Z_CS_WETG(II) * ZMAXTIME(II) ZTOT_RG_WETG(I1(II),I2(II),I3(II)) = ZTOT_RG_WETG(I1(II),I2(II),I3(II)) + Z_RG_WETG(II) * ZMAXTIME(II) + ZTOT_CG_WETG(I1(II),I2(II),I3(II)) = ZTOT_CG_WETG(I1(II),I2(II),I3(II)) + Z_CG_WETG(II) * ZMAXTIME(II) ZTOT_RH_WETG(I1(II),I2(II),I3(II)) = ZTOT_RH_WETG(I1(II),I2(II),I3(II)) + Z_RH_WETG(II) * ZMAXTIME(II) ZTOT_TH_DRYG(I1(II),I2(II),I3(II)) = ZTOT_TH_DRYG(I1(II),I2(II),I3(II)) + Z_TH_DRYG(II) * ZMAXTIME(II) ZTOT_RC_DRYG(I1(II),I2(II),I3(II)) = ZTOT_RC_DRYG(I1(II),I2(II),I3(II)) + Z_RC_DRYG(II) * ZMAXTIME(II) @@ -1482,6 +1538,7 @@ DO WHILE(ANY(ZTIME(IIB:IIE,IJB:IJE,IKTB:IKTE)<PTSTEP)) ZTOT_RI_DRYG(I1(II),I2(II),I3(II)) = ZTOT_RI_DRYG(I1(II),I2(II),I3(II)) + Z_RI_DRYG(II) * ZMAXTIME(II) ZTOT_CI_DRYG(I1(II),I2(II),I3(II)) = ZTOT_CI_DRYG(I1(II),I2(II),I3(II)) + Z_CI_DRYG(II) * ZMAXTIME(II) ZTOT_RS_DRYG(I1(II),I2(II),I3(II)) = ZTOT_RS_DRYG(I1(II),I2(II),I3(II)) + Z_RS_DRYG(II) * ZMAXTIME(II) + ZTOT_CS_DRYG(I1(II),I2(II),I3(II)) = ZTOT_CS_DRYG(I1(II),I2(II),I3(II)) + Z_CS_DRYG(II) * ZMAXTIME(II) ZTOT_RG_DRYG(I1(II),I2(II),I3(II)) = ZTOT_RG_DRYG(I1(II),I2(II),I3(II)) + Z_RG_DRYG(II) * ZMAXTIME(II) ZTOT_RI_HMG(I1(II),I2(II),I3(II)) = ZTOT_RI_HMG(I1(II),I2(II),I3(II)) + Z_RI_HMG(II) * ZMAXTIME(II) ZTOT_CI_HMG(I1(II),I2(II),I3(II)) = ZTOT_CI_HMG(I1(II),I2(II),I3(II)) + Z_CI_HMG(II) * ZMAXTIME(II) @@ -1489,18 +1546,27 @@ DO WHILE(ANY(ZTIME(IIB:IIE,IJB:IJE,IKTB:IKTE)<PTSTEP)) ZTOT_TH_GMLT(I1(II),I2(II),I3(II)) = ZTOT_TH_GMLT(I1(II),I2(II),I3(II)) + Z_TH_GMLT(II) * ZMAXTIME(II) ZTOT_RR_GMLT(I1(II),I2(II),I3(II)) = ZTOT_RR_GMLT(I1(II),I2(II),I3(II)) + Z_RR_GMLT(II) * ZMAXTIME(II) ZTOT_CR_GMLT(I1(II),I2(II),I3(II)) = ZTOT_CR_GMLT(I1(II),I2(II),I3(II)) + Z_CR_GMLT(II) * ZMAXTIME(II) -!!$ ZTOT_RC_WETH(I1(II),I2(II),I3(II)) = ZTOT_RC_WETH(I1(II),I2(II),I3(II)) + Z_RC_WETH(II) * ZMAXTIME(II) -!!$ ZTOT_CC_WETH(I1(II),I2(II),I3(II)) = ZTOT_CC_WETH(I1(II),I2(II),I3(II)) + Z_CC_WETH(II) * ZMAXTIME(II) -!!$ ZTOT_RR_WETH(I1(II),I2(II),I3(II)) = ZTOT_RR_WETH(I1(II),I2(II),I3(II)) + Z_RR_WETH(II) * ZMAXTIME(II) -!!$ ZTOT_CR_WETH(I1(II),I2(II),I3(II)) = ZTOT_CR_WETH(I1(II),I2(II),I3(II)) + Z_CR_WETH(II) * ZMAXTIME(II) -!!$ ZTOT_RI_WETH(I1(II),I2(II),I3(II)) = ZTOT_RI_WETH(I1(II),I2(II),I3(II)) + Z_RI_WETH(II) * ZMAXTIME(II) -!!$ ZTOT_CI_WETH(I1(II),I2(II),I3(II)) = ZTOT_CI_WETH(I1(II),I2(II),I3(II)) + Z_CI_WETH(II) * ZMAXTIME(II) -!!$ ZTOT_RS_WETH(I1(II),I2(II),I3(II)) = ZTOT_RS_WETH(I1(II),I2(II),I3(II)) + Z_RS_WETH(II) * ZMAXTIME(II) -!!$ ZTOT_RG_WETH(I1(II),I2(II),I3(II)) = ZTOT_RG_WETH(I1(II),I2(II),I3(II)) + Z_RG_WETH(II) * ZMAXTIME(II) -!!$ ZTOT_RH_WETH(I1(II),I2(II),I3(II)) = ZTOT_RH_WETH(I1(II),I2(II),I3(II)) + Z_RH_WETH(II) * ZMAXTIME(II) -!!$ ZTOT_RG_COHG(I1(II),I2(II),I3(II)) = ZTOT_RG_COHG(I1(II),I2(II),I3(II)) + Z_RG_COHG(II) * ZMAXTIME(II) -!!$ ZTOT_RR_HMLT(I1(II),I2(II),I3(II)) = ZTOT_RR_HMLT(I1(II),I2(II),I3(II)) + Z_RR_HMLT(II) * ZMAXTIME(II) -!!$ ZTOT_CR_HMLT(I1(II),I2(II),I3(II)) = ZTOT_CR_HMLT(I1(II),I2(II),I3(II)) + Z_CR_HMLT(II) * ZMAXTIME(II) + ZTOT_CG_GMLT(I1(II),I2(II),I3(II)) = ZTOT_CG_GMLT(I1(II),I2(II),I3(II)) + Z_CG_GMLT(II) * ZMAXTIME(II) + ZTOT_TH_DEPH(I1(II),I2(II),I3(II)) = ZTOT_TH_DEPH(I1(II),I2(II),I3(II)) + Z_TH_DEPH(II) * ZMAXTIME(II) + ZTOT_RH_DEPH(I1(II),I2(II),I3(II)) = ZTOT_RH_DEPH(I1(II),I2(II),I3(II)) + Z_RH_DEPH(II) * ZMAXTIME(II) + ZTOT_TH_WETH(I1(II),I2(II),I3(II)) = ZTOT_TH_WETH(I1(II),I2(II),I3(II)) + Z_TH_WETH(II) * ZMAXTIME(II) + ZTOT_RC_WETH(I1(II),I2(II),I3(II)) = ZTOT_RC_WETH(I1(II),I2(II),I3(II)) + Z_RC_WETH(II) * ZMAXTIME(II) + ZTOT_CC_WETH(I1(II),I2(II),I3(II)) = ZTOT_CC_WETH(I1(II),I2(II),I3(II)) + Z_CC_WETH(II) * ZMAXTIME(II) + ZTOT_RR_WETH(I1(II),I2(II),I3(II)) = ZTOT_RR_WETH(I1(II),I2(II),I3(II)) + Z_RR_WETH(II) * ZMAXTIME(II) + ZTOT_CR_WETH(I1(II),I2(II),I3(II)) = ZTOT_CR_WETH(I1(II),I2(II),I3(II)) + Z_CR_WETH(II) * ZMAXTIME(II) + ZTOT_RI_WETH(I1(II),I2(II),I3(II)) = ZTOT_RI_WETH(I1(II),I2(II),I3(II)) + Z_RI_WETH(II) * ZMAXTIME(II) + ZTOT_CI_WETH(I1(II),I2(II),I3(II)) = ZTOT_CI_WETH(I1(II),I2(II),I3(II)) + Z_CI_WETH(II) * ZMAXTIME(II) + ZTOT_RS_WETH(I1(II),I2(II),I3(II)) = ZTOT_RS_WETH(I1(II),I2(II),I3(II)) + Z_RS_WETH(II) * ZMAXTIME(II) + ZTOT_CS_WETH(I1(II),I2(II),I3(II)) = ZTOT_CS_WETH(I1(II),I2(II),I3(II)) + Z_CS_WETH(II) * ZMAXTIME(II) + ZTOT_RG_WETH(I1(II),I2(II),I3(II)) = ZTOT_RG_WETH(I1(II),I2(II),I3(II)) + Z_RG_WETH(II) * ZMAXTIME(II) + ZTOT_CG_WETH(I1(II),I2(II),I3(II)) = ZTOT_CG_WETH(I1(II),I2(II),I3(II)) + Z_CG_WETH(II) * ZMAXTIME(II) + ZTOT_RH_WETH(I1(II),I2(II),I3(II)) = ZTOT_RH_WETH(I1(II),I2(II),I3(II)) + Z_RH_WETH(II) * ZMAXTIME(II) + ZTOT_RG_COHG(I1(II),I2(II),I3(II)) = ZTOT_RG_COHG(I1(II),I2(II),I3(II)) + Z_RG_COHG(II) * ZMAXTIME(II) + ZTOT_CG_COHG(I1(II),I2(II),I3(II)) = ZTOT_CG_COHG(I1(II),I2(II),I3(II)) + Z_CG_COHG(II) * ZMAXTIME(II) + ZTOT_TH_HMLT(I1(II),I2(II),I3(II)) = ZTOT_RR_HMLT(I1(II),I2(II),I3(II)) + Z_RR_HMLT(II) * ZMAXTIME(II) + ZTOT_RR_HMLT(I1(II),I2(II),I3(II)) = ZTOT_RR_HMLT(I1(II),I2(II),I3(II)) + Z_RR_HMLT(II) * ZMAXTIME(II) + ZTOT_CR_HMLT(I1(II),I2(II),I3(II)) = ZTOT_CR_HMLT(I1(II),I2(II),I3(II)) + Z_CR_HMLT(II) * ZMAXTIME(II) + ZTOT_CH_HMLT(I1(II),I2(II),I3(II)) = ZTOT_CH_HMLT(I1(II),I2(II),I3(II)) + Z_CH_HMLT(II) * ZMAXTIME(II) !Correction term ZTOT_RV_CORR2(I1(II),I2(II),I3(II)) = ZTOT_RV_CORR2(I1(II),I2(II),I3(II)) + Z_RV_CORR2(II) @@ -1615,6 +1681,7 @@ DO WHILE(ANY(ZTIME(IIB:IIE,IJB:IJE,IKTB:IKTE)<PTSTEP)) DEALLOCATE(Z_RI_DEPI) DEALLOCATE(Z_RI_CNVS) DEALLOCATE(Z_CI_CNVS) + DEALLOCATE(Z_CS_SSC) DEALLOCATE(Z_RI_AGGS) DEALLOCATE(Z_CI_AGGS) DEALLOCATE(Z_TH_DEPG) @@ -1625,6 +1692,7 @@ DO WHILE(ANY(ZTIME(IIB:IIE,IJB:IJE,IKTB:IKTE)<PTSTEP)) DEALLOCATE(Z_RC_RIM) DEALLOCATE(Z_CC_RIM) DEALLOCATE(Z_RS_RIM) + DEALLOCATE(Z_CS_RIM) DEALLOCATE(Z_RG_RIM) DEALLOCATE(Z_RI_HMS) DEALLOCATE(Z_CI_HMS) @@ -1634,6 +1702,7 @@ DO WHILE(ANY(ZTIME(IIB:IIE,IJB:IJE,IKTB:IKTE)<PTSTEP)) DEALLOCATE(Z_CR_ACC) DEALLOCATE(Z_RS_ACC) DEALLOCATE(Z_RG_ACC) + DEALLOCATE(Z_CS_CMEL) DEALLOCATE(Z_RS_CMEL) DEALLOCATE(Z_TH_CFRZ) DEALLOCATE(Z_RR_CFRZ) @@ -1652,7 +1721,9 @@ DO WHILE(ANY(ZTIME(IIB:IIE,IJB:IJE,IKTB:IKTE)<PTSTEP)) DEALLOCATE(Z_RI_WETG) DEALLOCATE(Z_CI_WETG) DEALLOCATE(Z_RS_WETG) + DEALLOCATE(Z_CS_WETG) DEALLOCATE(Z_RG_WETG) + DEALLOCATE(Z_CG_WETG) DEALLOCATE(Z_RH_WETG) DEALLOCATE(Z_TH_DRYG) DEALLOCATE(Z_RC_DRYG) @@ -1662,6 +1733,7 @@ DO WHILE(ANY(ZTIME(IIB:IIE,IJB:IJE,IKTB:IKTE)<PTSTEP)) DEALLOCATE(Z_RI_DRYG) DEALLOCATE(Z_CI_DRYG) DEALLOCATE(Z_RS_DRYG) + DEALLOCATE(Z_CS_DRYG) DEALLOCATE(Z_RG_DRYG) DEALLOCATE(Z_RI_HMG) DEALLOCATE(Z_CI_HMG) @@ -1669,6 +1741,27 @@ DO WHILE(ANY(ZTIME(IIB:IIE,IJB:IJE,IKTB:IKTE)<PTSTEP)) DEALLOCATE(Z_TH_GMLT) DEALLOCATE(Z_RR_GMLT) DEALLOCATE(Z_CR_GMLT) + DEALLOCATE(Z_CG_GMLT) + DEALLOCATE(Z_TH_DEPH) + DEALLOCATE(Z_RH_DEPH) + DEALLOCATE(Z_TH_WETH) + DEALLOCATE(Z_RC_WETH) + DEALLOCATE(Z_CC_WETH) + DEALLOCATE(Z_RR_WETH) + DEALLOCATE(Z_CR_WETH) + DEALLOCATE(Z_RI_WETH) + DEALLOCATE(Z_CI_WETH) + DEALLOCATE(Z_RS_WETH) + DEALLOCATE(Z_CS_WETH) + DEALLOCATE(Z_RG_WETH) + DEALLOCATE(Z_CG_WETH) + DEALLOCATE(Z_RH_WETH) + DEALLOCATE(Z_RG_COHG) + DEALLOCATE(Z_CG_COHG) + DEALLOCATE(Z_TH_HMLT) + DEALLOCATE(Z_RR_HMLT) + DEALLOCATE(Z_CR_HMLT) + DEALLOCATE(Z_CH_HMLT) DEALLOCATE(Z_RV_CORR2) DEALLOCATE(Z_RC_CORR2) @@ -1735,6 +1828,9 @@ if ( lbu_enable ) then call Budget_store_add( tbudgets(NBUDGET_TH), 'WETG', ztot_th_wetg (:, :, :) * zrhodjontstep(:, :, :) ) call Budget_store_add( tbudgets(NBUDGET_TH), 'DRYG', ztot_th_dryg (:, :, :) * zrhodjontstep(:, :, :) ) call Budget_store_add( tbudgets(NBUDGET_TH), 'GMLT', ztot_th_gmlt (:, :, :) * zrhodjontstep(:, :, :) ) + call Budget_store_add( tbudgets(NBUDGET_TH), 'DEPH', ztot_th_deph (:, :, :) * zrhodjontstep(:, :, :) ) + call Budget_store_add( tbudgets(NBUDGET_TH), 'WETH', ztot_th_weth (:, :, :) * zrhodjontstep(:, :, :) ) + call Budget_store_add( tbudgets(NBUDGET_TH), 'HMLT', ztot_th_hmlt (:, :, :) * zrhodjontstep(:, :, :) ) end if if ( lbudget_rv ) then @@ -1743,6 +1839,7 @@ if ( lbu_enable ) then call Budget_store_add( tbudgets(NBUDGET_RV), 'DEPI', -ztot_ri_depi (:, :, :) * zrhodjontstep(:, :, :) ) call Budget_store_add( tbudgets(NBUDGET_RV), 'DEPG', -ztot_rg_depg (:, :, :) * zrhodjontstep(:, :, :) ) call Budget_store_add( tbudgets(NBUDGET_RV), 'CORR2', ztot_rv_corr2(:, :, :) * zrhodjontstep(:, :, :) ) + call Budget_store_add( tbudgets(NBUDGET_RV), 'DEPH', -ztot_rh_deph (:, :, :) * zrhodjontstep(:, :, :) ) end if if ( lbudget_rc ) then @@ -1757,6 +1854,7 @@ if ( lbu_enable ) then call Budget_store_add( tbudgets(NBUDGET_RC), 'DRYG', ztot_rc_dryg (:, :, :) * zrhodjontstep(:, :, :) ) call Budget_store_add( tbudgets(NBUDGET_RC), 'CVRC', -ztot_rr_cvrc (:, :, :) * zrhodjontstep(:, :, :) ) call Budget_store_add( tbudgets(NBUDGET_RC), 'CORR2', ztot_rc_corr2(:, :, :) * zrhodjontstep(:, :, :) ) + call Budget_store_add( tbudgets(NBUDGET_RC), 'WETH', ztot_rc_weth(:, :, :) * zrhodjontstep(:, :, :) ) end if if ( lbudget_rr ) then @@ -1770,7 +1868,9 @@ if ( lbu_enable ) then call Budget_store_add( tbudgets(NBUDGET_RR), 'DRYG', ztot_rr_dryg(:, :, :) * zrhodjontstep(:, :, :) ) call Budget_store_add( tbudgets(NBUDGET_RR), 'GMLT', ztot_rr_gmlt(:, :, :) * zrhodjontstep(:, :, :) ) call Budget_store_add( tbudgets(NBUDGET_RR), 'CVRC', ztot_rr_cvrc(:, :, :) * zrhodjontstep(:, :, :) ) - call Budget_store_add( tbudgets(NBUDGET_RR), 'CORR2', ztot_rr_corr2(:, :, :) * zrhodjontstep(:, :, :) ) + call Budget_store_add( tbudgets(NBUDGET_RR), 'CORR2', ztot_rr_corr2(:, :, :)* zrhodjontstep(:, :, :) ) + call Budget_store_add( tbudgets(NBUDGET_RR), 'WETH', ztot_rr_weth(:, :, :) * zrhodjontstep(:, :, :) ) + call Budget_store_add( tbudgets(NBUDGET_RR), 'HMLT', ztot_rr_hmlt(:, :, :) * zrhodjontstep(:, :, :) ) end if if ( lbudget_ri ) then @@ -1789,6 +1889,7 @@ if ( lbu_enable ) then call Budget_store_add( tbudgets(NBUDGET_RI), 'DRYG', ztot_ri_dryg (:, :, :) * zrhodjontstep(:, :, :) ) call Budget_store_add( tbudgets(NBUDGET_RI), 'HMG', ztot_ri_hmg (:, :, :) * zrhodjontstep(:, :, :) ) call Budget_store_add( tbudgets(NBUDGET_RI), 'CORR2', ztot_ri_corr2(:, :, :) * zrhodjontstep(:, :, :) ) + call Budget_store_add( tbudgets(NBUDGET_RI), 'WETH', ztot_ri_weth (:, :, :) * zrhodjontstep(:, :, :) ) end if if ( lbudget_rs ) then @@ -1803,6 +1904,7 @@ if ( lbu_enable ) then call Budget_store_add( tbudgets(NBUDGET_RS), 'CIBU', -ztot_ri_cibu(:, :, :) * zrhodjontstep(:, :, :) ) call Budget_store_add( tbudgets(NBUDGET_RS), 'WETG', ztot_rs_wetg(:, :, :) * zrhodjontstep(:, :, :) ) call Budget_store_add( tbudgets(NBUDGET_RS), 'DRYG', ztot_rs_dryg(:, :, :) * zrhodjontstep(:, :, :) ) + call Budget_store_add( tbudgets(NBUDGET_RS), 'WETH', ztot_rs_weth(:, :, :) * zrhodjontstep(:, :, :) ) end if if ( lbudget_rg ) then @@ -1818,10 +1920,16 @@ if ( lbu_enable ) then call Budget_store_add( tbudgets(NBUDGET_RG), 'DRYG', ztot_rg_dryg(:, :, :) * zrhodjontstep(:, :, :) ) call Budget_store_add( tbudgets(NBUDGET_RG), 'HMG', ztot_rg_hmg (:, :, :) * zrhodjontstep(:, :, :) ) call Budget_store_add( tbudgets(NBUDGET_RG), 'GMLT', -ztot_rr_gmlt(:, :, :) * zrhodjontstep(:, :, :) ) + call Budget_store_add( tbudgets(NBUDGET_RG), 'WETH', ztot_rg_weth(:, :, :) * zrhodjontstep(:, :, :) ) + call Budget_store_add( tbudgets(NBUDGET_RG), 'COHG', ztot_rg_cohg(:, :, :) * zrhodjontstep(:, :, :) ) end if if ( lbudget_rh ) then - call Budget_store_add( tbudgets(NBUDGET_RH), 'WETG', ztot_rh_wetg(:, :, :) * zrhodjontstep(:, :, :) ) + call Budget_store_add( tbudgets(NBUDGET_RH), 'WETG', ztot_rh_wetg(:, :, :) * zrhodjontstep(:, :, :) ) + call Budget_store_add( tbudgets(NBUDGET_RH), 'DEPH', ztot_rh_deph(:, :, :) * zrhodjontstep(:, :, :) ) + call Budget_store_add( tbudgets(NBUDGET_RH), 'WETH', ztot_rh_weth(:, :, :) * zrhodjontstep(:, :, :) ) + call Budget_store_add( tbudgets(NBUDGET_RH), 'COHG', -ztot_rg_cohg(:, :, :) * zrhodjontstep(:, :, :) ) + call Budget_store_add( tbudgets(NBUDGET_RH), 'HMLT', -ztot_rr_hmlt(:, :, :) * zrhodjontstep(:, :, :) ) end if if ( lbudget_sv ) then @@ -1840,6 +1948,7 @@ if ( lbu_enable ) then call Budget_store_add( tbudgets(idx), 'DRYG', ztot_cc_dryg (:, :, :) * zrhodjontstep(:, :, :) ) call Budget_store_add( tbudgets(idx), 'CVRC', -ztot_cr_cvrc (:, :, :) * zrhodjontstep(:, :, :) ) call Budget_store_add( tbudgets(idx), 'CORR2', ztot_cc_corr2(:, :, :) * zrhodjontstep(:, :, :) ) + call Budget_store_add( tbudgets(idx), 'WETH', ztot_cc_weth (:, :, :) * zrhodjontstep(:, :, :) ) ! ! Rain drops ! @@ -1856,6 +1965,8 @@ if ( lbu_enable ) then call Budget_store_add( tbudgets(idx), 'GMLT', ztot_cr_gmlt(:, :, :) * zrhodjontstep(:, :, :) ) call Budget_store_add( tbudgets(idx), 'CVRC', ztot_cr_cvrc(:, :, :) * zrhodjontstep(:, :, :) ) call Budget_store_add( tbudgets(idx), 'CORR2', ztot_cr_corr2(:, :, :) * zrhodjontstep(:, :, :) ) + call Budget_store_add( tbudgets(idx), 'WETH', ztot_cr_weth(:, :, :) * zrhodjontstep(:, :, :) ) + call Budget_store_add( tbudgets(idx), 'HMLT', ztot_cr_hmlt(:, :, :) * zrhodjontstep(:, :, :) ) ! ! Ice crystals ! @@ -1873,6 +1984,40 @@ if ( lbu_enable ) then call Budget_store_add( tbudgets(idx), 'DRYG', ztot_ci_dryg (:, :, :) * zrhodjontstep(:, :, :) ) call Budget_store_add( tbudgets(idx), 'HMG', ztot_ci_hmg (:, :, :) * zrhodjontstep(:, :, :) ) call Budget_store_add( tbudgets(idx), 'CORR2', ztot_ci_corr2(:, :, :) * zrhodjontstep(:, :, :) ) + call Budget_store_add( tbudgets(idx), 'WETH', ztot_ci_weth (:, :, :) * zrhodjontstep(:, :, :) ) + ! + ! Snow + ! + idx = NBUDGET_SV1 - 1 + nsv_lima_ns + call Budget_store_add( tbudgets(idx), 'CNVI', -ztot_ci_cnvi(:, :, :) * zrhodjontstep(:, :, :) ) + call Budget_store_add( tbudgets(idx), 'CNVS', -ztot_ci_cnvs(:, :, :) * zrhodjontstep(:, :, :) ) + call Budget_store_add( tbudgets(idx), 'RIM', ztot_cs_rim(:, :, :) * zrhodjontstep(:, :, :) ) + call Budget_store_add( tbudgets(idx), 'ACC', ztot_cs_acc(:, :, :) * zrhodjontstep(:, :, :) ) + call Budget_store_add( tbudgets(idx), 'CMEL', ztot_cs_cmel(:, :, :) * zrhodjontstep(:, :, :) ) + call Budget_store_add( tbudgets(idx), 'SSC', ztot_cs_ssc(:, :, :) * zrhodjontstep(:, :, :) ) + call Budget_store_add( tbudgets(idx), 'WETG', ztot_cs_wetg(:, :, :) * zrhodjontstep(:, :, :) ) + call Budget_store_add( tbudgets(idx), 'DRYG', ztot_cs_dryg(:, :, :) * zrhodjontstep(:, :, :) ) + call Budget_store_add( tbudgets(idx), 'WETH', ztot_cs_weth(:, :, :) * zrhodjontstep(:, :, :) ) + ! + ! Graupel + ! + idx = NBUDGET_SV1 - 1 + nsv_lima_ng + call Budget_store_add( tbudgets(idx), 'RIM', -ztot_cs_rim(:, :, :) * zrhodjontstep(:, :, :) ) + call Budget_store_add( tbudgets(idx), 'ACC', -ztot_cs_acc(:, :, :) * zrhodjontstep(:, :, :) ) + call Budget_store_add( tbudgets(idx), 'CMEL', -ztot_cs_cmel(:, :, :) * zrhodjontstep(:, :, :) ) + call Budget_store_add( tbudgets(idx), 'CFRZ', -ztot_cr_cfrz(:, :, :) * zrhodjontstep(:, :, :) ) + call Budget_store_add( tbudgets(idx), 'WETG', ztot_cg_wetg(:, :, :) * zrhodjontstep(:, :, :) ) + call Budget_store_add( tbudgets(idx), 'GMLT', ztot_cg_gmlt(:, :, :) * zrhodjontstep(:, :, :) ) + call Budget_store_add( tbudgets(idx), 'WETH', ztot_cg_weth(:, :, :) * zrhodjontstep(:, :, :) ) + call Budget_store_add( tbudgets(idx), 'COHG', ztot_cg_cohg(:, :, :) * zrhodjontstep(:, :, :) ) + ! + ! Hail + ! + idx = NBUDGET_SV1 - 1 + nsv_lima_nh + call Budget_store_add( tbudgets(idx), 'WETG', -ztot_cg_wetg(:, :, :) * zrhodjontstep(:, :, :) ) + call Budget_store_add( tbudgets(idx), 'COHG', -ztot_cg_cohg(:, :, :) * zrhodjontstep(:, :, :) ) + call Budget_store_add( tbudgets(idx), 'HMLT', ztot_ch_hmlt(:, :, :) * zrhodjontstep(:, :, :) ) + do ii = 1, nmod_ifn idx = NBUDGET_SV1 - 1 + nsv_lima_ifn_nucl + ii - 1 diff --git a/src/MNH/lima_cold_sedimentation.f90 b/src/MNH/lima_cold_sedimentation.f90 index 6a62652b7..1cc8f19d1 100644 --- a/src/MNH/lima_cold_sedimentation.f90 +++ b/src/MNH/lima_cold_sedimentation.f90 @@ -12,7 +12,8 @@ INTERFACE PZZ, PRHODJ, PRHODREF, & PRIT, PCIT, & PRIS, PRSS, PRGS, PRHS, PCIS, & - PINPRS, PINPRG, PINPRH ) + PINPRS, PINPRG, PINPRH, & + PCSS, PCGS, PCHS) ! LOGICAL, INTENT(IN) :: OSEDI ! switch to activate the ! cloud ice sedimentation @@ -32,6 +33,9 @@ REAL, DIMENSION(:,:,:), INTENT(INOUT) :: PRSS ! Snow/aggregate m.r. sour REAL, DIMENSION(:,:,:), INTENT(INOUT) :: PRGS ! Graupel m.r. source REAL, DIMENSION(:,:,:), INTENT(INOUT) :: PRHS ! Hail m.r. source REAL, DIMENSION(:,:,:), INTENT(INOUT) :: PCIS ! Ice crystal C. source +REAL, DIMENSION(:,:,:),OPTIONAL, INTENT(INOUT) :: PCSS ! Snow/aggregate C. source +REAL, DIMENSION(:,:,:),OPTIONAL, INTENT(INOUT) :: PCGS ! Graupel C. source +REAL, DIMENSION(:,:,:),OPTIONAL, INTENT(INOUT) :: PCHS ! Hail C. source REAL, DIMENSION(:,:), INTENT(INOUT) :: PINPRS ! Snow instant precip REAL, DIMENSION(:,:), INTENT(INOUT) :: PINPRG ! Graupel instant precip REAL, DIMENSION(:,:), INTENT(INOUT) :: PINPRH ! Hail instant precip @@ -47,8 +51,8 @@ END MODULE MODI_LIMA_COLD_SEDIMENTATION PZZ, PRHODJ, PRHODREF, & PRIT, PCIT, & PRIS, PRSS, PRGS, PRHS, PCIS, & - PINPRS,PINPRG,& - PINPRH ) + PINPRS,PINPRG,PINPRH, & + PCSS, PCGS, PCHS) ! ###################################################################### ! !! PURPOSE @@ -77,6 +81,7 @@ END MODULE MODI_LIMA_COLD_SEDIMENTATION !! 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 ! P. Wautelet 28/05/2019: move COUNTJV function to tools.f90 +! M. Taufour 07/2022: add concentration for snow, graupel, hail ! !------------------------------------------------------------------------------- ! @@ -86,10 +91,17 @@ END MODULE MODI_LIMA_COLD_SEDIMENTATION USE MODD_CST, ONLY : XRHOLW USE MODD_NSV USE MODD_PARAMETERS, ONLY : JPHEXT, JPVEXT -USE MODD_PARAM_LIMA, ONLY : XCEXVT, XRTMIN, XCTMIN +USE MODD_PARAM_LIMA, ONLY : XCEXVT, XRTMIN, XCTMIN, & + NMOM_S, NMOM_G, NMOM_H USE MODD_PARAM_LIMA_COLD, ONLY : XLBEXI, XLBI, XDI, & - XFSEDRI, XFSEDCI, XFSEDS, XEXSEDS -USE MODD_PARAM_LIMA_MIXED, ONLY : XFSEDG, XEXSEDG, XFSEDH, XEXSEDH + XFSEDRI, XFSEDCI, XFSEDS, XEXSEDS, & + XLBEXS, XLBS, XDS, & + XFSEDRS, XFSEDCS + +USE MODD_PARAM_LIMA_MIXED, ONLY : XFSEDG, XEXSEDG, XFSEDH, XEXSEDH, & + XLBEXG, XLBG, XDG, & + XLBEXH, XLBH, XDH, & + XFSEDRG, XFSEDCG, XFSEDRH, XFSEDCH ! use mode_tools, only: Countjv ! @@ -117,6 +129,9 @@ REAL, DIMENSION(:,:,:), INTENT(INOUT) :: PRSS ! Snow/aggregate m.r. sour REAL, DIMENSION(:,:,:), INTENT(INOUT) :: PRGS ! Graupel m.r. source REAL, DIMENSION(:,:,:), INTENT(INOUT) :: PRHS ! Hail m.r. source REAL, DIMENSION(:,:,:), INTENT(INOUT) :: PCIS ! Ice crystal C. source +REAL, DIMENSION(:,:,:),OPTIONAL, INTENT(INOUT) :: PCSS ! Snow/aggregate C. source +REAL, DIMENSION(:,:,:),OPTIONAL, INTENT(INOUT) :: PCGS ! Graupel C. source +REAL, DIMENSION(:,:,:),OPTIONAL, INTENT(INOUT) :: PCHS ! Hail C. source REAL, DIMENSION(:,:), INTENT(INOUT) :: PINPRS ! Snow instant precip REAL, DIMENSION(:,:), INTENT(INOUT) :: PINPRG ! Graupel instant precip REAL, DIMENSION(:,:), INTENT(INOUT) :: PINPRH ! Hail instant precip @@ -139,8 +154,11 @@ REAL, DIMENSION(:), ALLOCATABLE & :: ZRIS, & ! Pristine ice m.r. source ZCIS, & ! Pristine ice conc. source ZRSS, & ! Snow/aggregate m.r. source + ZCSS, & ! Snow/aggregate conc. source ZRGS, & ! Graupel/hail m.r. source + ZCGS, & ! Graupel/hail conc. source ZRHS, & ! Graupel/hail m.r. source + ZCHS, & ! Graupel/hail conc. source ZRIT, & ! Pristine ice m.r. at t ZCIT, & ! Pristine ice conc. at t ZRHODREF, & ! RHO Dry REFerence @@ -148,8 +166,8 @@ REAL, DIMENSION(:), ALLOCATABLE & ZZW, & ! Work array ZZX, & ! Work array ZZY, & ! Work array - ZLBDAI, & ! Slope parameter of the ice crystal distr. - ZRTMIN + ZLBDAI, ZLBDAS, ZLBDAG, ZLBDAH, & ! Slope parameter of the ice crystal distr. + ZRTMIN, ZCTMIN ! INTEGER , DIMENSION(SIZE(PRHODREF)) :: I1,I2,I3 ! Indexes for PACK replacement ! @@ -170,7 +188,9 @@ IKE=SIZE(PZZ,3) - JPVEXT ! Time splitting and ZRTMIN ! ALLOCATE(ZRTMIN(SIZE(XRTMIN))) +ALLOCATE(ZCTMIN(SIZE(XCTMIN))) ZRTMIN(:) = XRTMIN(:) / PTSTEP +ZCTMIN(:) = XCTMIN(:) / PTSTEP ! ZTSPLITG= PTSTEP / REAL(KSPLITG) ! @@ -185,9 +205,28 @@ PINPRH(:,:) = 0. DO JN = 1 , KSPLITG ! Computation only where enough ice, snow, graupel or hail GSEDIM(:,:,:) = .FALSE. - GSEDIM(IIB:IIE,IJB:IJE,IKB:IKE) = PRSS(IIB:IIE,IJB:IJE,IKB:IKE)>ZRTMIN(5) & - .OR. PRGS(IIB:IIE,IJB:IJE,IKB:IKE)>ZRTMIN(6) & - .OR. PRHS(IIB:IIE,IJB:IJE,IKB:IKE)>ZRTMIN(7) +IF (NMOM_S.EQ.2) THEN + GSEDIM(IIB:IIE,IJB:IJE,IKB:IKE) = PRSS(IIB:IIE,IJB:IJE,IKB:IKE)>ZRTMIN(5) .AND. & + PCSS(IIB:IIE,IJB:IJE,IKB:IKE)>ZCTMIN(5) +ELSE + GSEDIM(IIB:IIE,IJB:IJE,IKB:IKE) = PRSS(IIB:IIE,IJB:IJE,IKB:IKE)>ZRTMIN(5) +END IF +IF (NMOM_G.EQ.2) THEN + GSEDIM(IIB:IIE,IJB:IJE,IKB:IKE) = GSEDIM(IIB:IIE,IJB:IJE,IKB:IKE) .OR. & + ( PRGS(IIB:IIE,IJB:IJE,IKB:IKE)>ZRTMIN(6) .AND. & + PCGS(IIB:IIE,IJB:IJE,IKB:IKE)>ZCTMIN(6) ) +ELSE + GSEDIM(IIB:IIE,IJB:IJE,IKB:IKE) = GSEDIM(IIB:IIE,IJB:IJE,IKB:IKE) .OR. & + PRGS(IIB:IIE,IJB:IJE,IKB:IKE)>ZRTMIN(6) +END IF +IF (NMOM_H.EQ.2) THEN + GSEDIM(IIB:IIE,IJB:IJE,IKB:IKE) = GSEDIM(IIB:IIE,IJB:IJE,IKB:IKE) .OR. & + ( PRSS(IIB:IIE,IJB:IJE,IKB:IKE)>ZRTMIN(7) .AND. & + PCSS(IIB:IIE,IJB:IJE,IKB:IKE)>ZCTMIN(7) ) +ELSE + GSEDIM(IIB:IIE,IJB:IJE,IKB:IKE) = GSEDIM(IIB:IIE,IJB:IJE,IKB:IKE) .OR. & + PRSS(IIB:IIE,IJB:IJE,IKB:IKE)>ZRTMIN(7) +END IF IF( OSEDI ) THEN GSEDIM(IIB:IIE,IJB:IJE,IKB:IKE) = GSEDIM(IIB:IIE,IJB:IJE,IKB:IKE) & .OR. PRIS(IIB:IIE,IJB:IJE,IKB:IKE)>ZRTMIN(4) @@ -204,6 +243,9 @@ DO JN = 1 , KSPLITG PRSS(:,:,:) = PRSS(:,:,:) * PTSTEP PRGS(:,:,:) = PRGS(:,:,:) * PTSTEP PRHS(:,:,:) = PRHS(:,:,:) * PTSTEP + IF(NMOM_S.EQ.2) PCSS(:,:,:) = PCSS(:,:,:) * PTSTEP + IF(NMOM_G.EQ.2) PCGS(:,:,:) = PCGS(:,:,:) * PTSTEP + IF(NMOM_H.EQ.2) PCHS(:,:,:) = PCHS(:,:,:) * PTSTEP DO JK = IKB , IKE ZW(:,:,JK)=ZTSPLITG/(PZZ(:,:,JK+1)-PZZ(:,:,JK)) END DO @@ -259,21 +301,52 @@ DO JN = 1 , KSPLITG !* 2.22 for aggregates ! ZZW(:) = 0. + ZZX(:) = 0.0 + ZZY(:) = 0.0 IF( MAXVAL(PRSS(:,:,:))>XRTMIN(5) ) THEN ALLOCATE(ZRSS(ISEDIM)) - DO JL = 1,ISEDIM + IF(NMOM_S.GE.2) THEN + ALLOCATE(ZCSS(ISEDIM)) + ALLOCATE(ZLBDAS(ISEDIM)) + DO JL = 1,ISEDIM ZRSS(JL) = PRSS(I1(JL),I2(JL),I3(JL)) + ZCSS(JL) = PCSS(I1(JL),I2(JL),I3(JL)) END DO - WHERE( ZRSS(:)>XRTMIN(5) ) - ZZW(:) = XFSEDS * (ZRSS(:)*ZRHODREF(:))**XEXSEDS * ZRHODREF(:)**(-XCEXVT) + ZLBDAS(:) = 1.E10 + WHERE( ZRSS(:)>XRTMIN(5) .AND. ZCSS(:)>XCTMIN(5) ) + ZLBDAS(:) = ( XLBS*ZCSS(:) / ZRSS(:) )**XLBEXS + ZZY(:) = ZRHODREF(:)**(-XCEXVT) * (ZLBDAS(:)**(-XDS)) + ZZW(:) = XFSEDRS * ZRSS(:) * ZZY(:) * ZRHODREF(:) + ZZX(:) = XFSEDCS * ZCSS(:) * ZZY(:) * ZRHODREF(:) END WHERE ZWSEDR(:,:,:) = UNPACK( ZZW(:),MASK=GSEDIM(:,:,:),FIELD=0.0 ) ZWSEDR(:,:,IKB:IKE) = MIN( ZWSEDR(:,:,IKB:IKE), PRSS(:,:,IKB:IKE) * PRHODREF(:,:,IKB:IKE) / ZW(:,:,IKB:IKE) ) + ZWSEDC(:,:,:) = UNPACK( ZZX(:),MASK=GSEDIM(:,:,:),FIELD=0.0 ) + ZWSEDC(:,:,IKB:IKE) = MIN( ZWSEDC(:,:,IKB:IKE), PCSS(:,:,IKB:IKE) * PRHODREF(:,:,IKB:IKE) / ZW(:,:,IKB:IKE) ) DO JK = IKB , IKE - PRSS(:,:,JK) = PRSS(:,:,JK) + ZW(:,:,JK)* & + PRSS(:,:,JK) = PRSS(:,:,JK) + ZW(:,:,JK)* & (ZWSEDR(:,:,JK+1)-ZWSEDR(:,:,JK))/PRHODREF(:,:,JK) - END DO + PCSS(:,:,JK) = PCSS(:,:,JK) + ZW(:,:,JK)* & + (ZWSEDC(:,:,JK+1)-ZWSEDC(:,:,JK))/PRHODREF(:,:,JK) + END DO DEALLOCATE(ZRSS) + DEALLOCATE(ZCSS) + DEALLOCATE(ZLBDAS) + ELSE + DO JL = 1,ISEDIM + ZRSS(JL) = PRSS(I1(JL),I2(JL),I3(JL)) + END DO + WHERE( ZRSS(:)>XRTMIN(5) ) + ZZW(:) = XFSEDS * (ZRSS(:)*ZRHODREF(:))**XEXSEDS * ZRHODREF(:)**(-XCEXVT) + END WHERE + ZWSEDR(:,:,:) = UNPACK( ZZW(:),MASK=GSEDIM(:,:,:),FIELD=0.0 ) + ZWSEDR(:,:,IKB:IKE) = MIN( ZWSEDR(:,:,IKB:IKE), PRSS(:,:,IKB:IKE) * PRHODREF(:,:,IKB:IKE) / ZW(:,:,IKB:IKE) ) + DO JK = IKB , IKE + PRSS(:,:,JK) = PRSS(:,:,JK) + ZW(:,:,JK)* & + (ZWSEDR(:,:,JK+1)-ZWSEDR(:,:,JK))/PRHODREF(:,:,JK) + END DO + DEALLOCATE(ZRSS) + END IF ELSE ZWSEDR(:,:,IKB) = 0.0 END IF @@ -283,21 +356,52 @@ DO JN = 1 , KSPLITG !* 2.23 for graupeln ! ZZW(:) = 0. + ZZX(:) = 0.0 + ZZY(:) = 0.0 IF( MAXVAL(PRGS(:,:,:))>XRTMIN(6) ) THEN ALLOCATE(ZRGS(ISEDIM)) - DO JL = 1,ISEDIM - ZRGS(JL) = PRGS(I1(JL),I2(JL),I3(JL)) - END DO - WHERE( ZRGS(:)>XRTMIN(6) ) - ZZW(:) = XFSEDG * (ZRGS(:)*ZRHODREF(:))**XEXSEDG * ZRHODREF(:)**(-XCEXVT) - END WHERE - ZWSEDR(:,:,:) = UNPACK( ZZW(:),MASK=GSEDIM(:,:,:),FIELD=0.0 ) - ZWSEDR(:,:,IKB:IKE) = MIN( ZWSEDR(:,:,IKB:IKE), PRGS(:,:,IKB:IKE) * PRHODREF(:,:,IKB:IKE) / ZW(:,:,IKB:IKE) ) - DO JK = IKB , IKE - PRGS(:,:,JK) = PRGS(:,:,JK) + ZW(:,:,JK)* & - (ZWSEDR(:,:,JK+1)-ZWSEDR(:,:,JK))/PRHODREF(:,:,JK) - END DO - DEALLOCATE(ZRGS) + IF(NMOM_G.GE.2) THEN + ALLOCATE(ZCGS(ISEDIM)) + ALLOCATE(ZLBDAG(ISEDIM)) + DO JL = 1,ISEDIM + ZRGS(JL) = PRGS(I1(JL),I2(JL),I3(JL)) + ZCGS(JL) = PCGS(I1(JL),I2(JL),I3(JL)) + END DO + ZLBDAG(:) = 1.E10 + WHERE( ZRGS(:)>XRTMIN(6) .AND. ZCGS(:)>XCTMIN(6) ) + ZLBDAG(:) = ( XLBS*ZCGS(:) / ZRGS(:) )**XLBEXG + ZZY(:) = ZRHODREF(:)**(-XCEXVT) * (ZLBDAG(:)**(-XDG)) + ZZW(:) = XFSEDRG * ZRGS(:) * ZZY(:) * ZRHODREF(:) + ZZX(:) = XFSEDCG * ZCGS(:) * ZZY(:) * ZRHODREF(:) + END WHERE + ZWSEDR(:,:,:) = UNPACK( ZZW(:),MASK=GSEDIM(:,:,:),FIELD=0.0 ) + ZWSEDR(:,:,IKB:IKE) = MIN( ZWSEDR(:,:,IKB:IKE), PRGS(:,:,IKB:IKE) * PRHODREF(:,:,IKB:IKE) / ZW(:,:,IKB:IKE) ) + ZWSEDC(:,:,:) = UNPACK( ZZX(:),MASK=GSEDIM(:,:,:),FIELD=0.0 ) + ZWSEDC(:,:,IKB:IKE) = MIN( ZWSEDC(:,:,IKB:IKE), PCGS(:,:,IKB:IKE) * PRHODREF(:,:,IKB:IKE) / ZW(:,:,IKB:IKE) ) + DO JK = IKB , IKE + PRGS(:,:,JK) = PRGS(:,:,JK) + ZW(:,:,JK)* & + (ZWSEDR(:,:,JK+1)-ZWSEDR(:,:,JK))/PRHODREF(:,:,JK) + PCGS(:,:,JK) = PCGS(:,:,JK) + ZW(:,:,JK)* & + (ZWSEDC(:,:,JK+1)-ZWSEDC(:,:,JK))/PRHODREF(:,:,JK) + END DO + DEALLOCATE(ZRGS) + DEALLOCATE(ZCGS) + DEALLOCATE(ZLBDAG) + ELSE + DO JL = 1,ISEDIM + ZRGS(JL) = PRGS(I1(JL),I2(JL),I3(JL)) + END DO + WHERE( ZRGS(:)>XRTMIN(6) ) + ZZW(:) = XFSEDG * (ZRGS(:)*ZRHODREF(:))**XEXSEDG * ZRHODREF(:)**(-XCEXVT) + END WHERE + ZWSEDR(:,:,:) = UNPACK( ZZW(:),MASK=GSEDIM(:,:,:),FIELD=0.0 ) + ZWSEDR(:,:,IKB:IKE) = MIN( ZWSEDR(:,:,IKB:IKE), PRGS(:,:,IKB:IKE) * PRHODREF(:,:,IKB:IKE) / ZW(:,:,IKB:IKE) ) + DO JK = IKB , IKE + PRGS(:,:,JK) = PRGS(:,:,JK) + ZW(:,:,JK)* & + (ZWSEDR(:,:,JK+1)-ZWSEDR(:,:,JK))/PRHODREF(:,:,JK) + END DO + DEALLOCATE(ZRGS) + END IF ELSE ZWSEDR(:,:,IKB) = 0.0 END IF @@ -307,21 +411,48 @@ DO JN = 1 , KSPLITG !* 2.23 for hail ! ZZW(:) = 0. + ZZX(:) = 0. + ZZY(:) = 0. IF( MAXVAL(PRHS(:,:,:))>XRTMIN(7) ) THEN ALLOCATE(ZRHS(ISEDIM)) - DO JL = 1,ISEDIM - ZRHS(JL) = PRHS(I1(JL),I2(JL),I3(JL)) - END DO - WHERE( ZRHS(:)>XRTMIN(7) ) - ZZW(:) = XFSEDH * (ZRHS(:)*ZRHODREF(:))**XEXSEDH * ZRHODREF(:)**(-XCEXVT) - END WHERE - ZWSEDR(:,:,:) = UNPACK( ZZW(:),MASK=GSEDIM(:,:,:),FIELD=0.0 ) - ZWSEDR(:,:,IKB:IKE) = MIN( ZWSEDR(:,:,IKB:IKE), PRHS(:,:,IKB:IKE) * PRHODREF(:,:,IKB:IKE) / ZW(:,:,IKB:IKE) ) - DO JK = IKB , IKE - PRHS(:,:,JK) = PRHS(:,:,JK) + ZW(:,:,JK)* & - (ZWSEDR(:,:,JK+1)-ZWSEDR(:,:,JK))/PRHODREF(:,:,JK) - END DO - DEALLOCATE(ZRHS) + IF(NMOM_H.GE.2) THEN + ALLOCATE(ZCHS(ISEDIM)) + ALLOCATE(ZLBDAH(ISEDIM)) + DO JL = 1,ISEDIM + ZRHS(JL) = PRHS(I1(JL),I2(JL),I3(JL)) + ZCHS(JL) = PRHS(I1(JL),I2(JL),I3(JL)) + END DO + ZLBDAH(:) = 1.E10 + WHERE( ZRHS(:)>XRTMIN(7) .AND. ZCHS(:)>XCTMIN(7) ) + ZLBDAH(:) = ( XLBH*ZCHS(:) / ZRHS(:) )**XLBEXH + ZZY(:) = ZRHODREF(:)**(-XCEXVT) * (ZLBDAH(:)**(-XDH)) + ZZW(:) = XFSEDRH * ZRHS(:) * ZZY(:) * ZRHODREF(:) + ZZX(:) = XFSEDCH * ZCHS(:) * ZZY(:) * ZRHODREF(:) + END WHERE + ZWSEDR(:,:,:) = UNPACK( ZZW(:),MASK=GSEDIM(:,:,:),FIELD=0.0 ) + ZWSEDR(:,:,IKB:IKE) = MIN( ZWSEDR(:,:,IKB:IKE), PRHS(:,:,IKB:IKE) * PRHODREF(:,:,IKB:IKE) / ZW(:,:,IKB:IKE) ) + DO JK = IKB , IKE + PRHS(:,:,JK) = PRHS(:,:,JK) + ZW(:,:,JK)* & + (ZWSEDR(:,:,JK+1)-ZWSEDR(:,:,JK))/PRHODREF(:,:,JK) + END DO + DEALLOCATE(ZRHS) + DEALLOCATE(ZLBDAH) + DEALLOCATE(ZCHS) + ELSE + DO JL = 1,ISEDIM + ZRHS(JL) = PRHS(I1(JL),I2(JL),I3(JL)) + END DO + WHERE( ZRHS(:)>XRTMIN(7) ) + ZZW(:) = XFSEDH * (ZRHS(:)*ZRHODREF(:))**XEXSEDH * ZRHODREF(:)**(-XCEXVT) + END WHERE + ZWSEDR(:,:,:) = UNPACK( ZZW(:),MASK=GSEDIM(:,:,:),FIELD=0.0 ) + ZWSEDR(:,:,IKB:IKE) = MIN( ZWSEDR(:,:,IKB:IKE), PRHS(:,:,IKB:IKE) * PRHODREF(:,:,IKB:IKE) / ZW(:,:,IKB:IKE) ) + DO JK = IKB , IKE + PRHS(:,:,JK) = PRHS(:,:,JK) + ZW(:,:,JK)* & + (ZWSEDR(:,:,JK+1)-ZWSEDR(:,:,JK))/PRHODREF(:,:,JK) + END DO + DEALLOCATE(ZRHS) + END IF ELSE ZWSEDR(:,:,IKB) = 0.0 END IF diff --git a/src/MNH/lima_cold_slow_processes.f90 b/src/MNH/lima_cold_slow_processes.f90 index 29c1aecbe..28203281b 100644 --- a/src/MNH/lima_cold_slow_processes.f90 +++ b/src/MNH/lima_cold_slow_processes.f90 @@ -12,7 +12,7 @@ INTERFACE PRHODREF, PEXNREF, PPABST, & PTHT, PRVT, PRCT, PRRT, PRIT, PRST, PRGT, & PTHS, PRVS, PRIS, PRSS, & - PCIT, PCIS ) + PCIT, PCIS, PCST, PCSS ) ! REAL, INTENT(IN) :: PTSTEP ! Time step INTEGER, INTENT(IN) :: KMI ! Model index @@ -37,8 +37,10 @@ REAL, DIMENSION(:,:,:), INTENT(INOUT) :: PRIS ! Pristine ice m.r. source REAL, DIMENSION(:,:,:), INTENT(INOUT) :: PRSS ! Snow/aggregate m.r. source ! REAL, DIMENSION(:,:,:), INTENT(IN) :: PCIT ! Ice crystal C. at t +REAL, DIMENSION(:,:,:),OPTIONAL, INTENT(IN) :: PCST ! Ice crystal C. at t ! REAL, DIMENSION(:,:,:), INTENT(INOUT) :: PCIS ! Ice crystal C. source +REAL, DIMENSION(:,:,:),OPTIONAL, INTENT(INOUT) :: PCSS ! Snow/aggregates C. source ! END SUBROUTINE LIMA_COLD_SLOW_PROCESSES END INTERFACE @@ -49,7 +51,7 @@ END MODULE MODI_LIMA_COLD_SLOW_PROCESSES PRHODREF, PEXNREF, PPABST, & PTHT, PRVT, PRCT, PRRT, PRIT, PRST, PRGT, & PTHS, PRVS, PRIS, PRSS, & - PCIT, PCIS ) + PCIT, PCIS, PCST, PCSS ) ! ################################################################################ ! !! PURPOSE @@ -81,6 +83,7 @@ END MODULE MODI_LIMA_COLD_SLOW_PROCESSES ! 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 +! M. Taufour 07/2022: add concentration for snow, graupel, hail ! !------------------------------------------------------------------------------- ! @@ -93,10 +96,10 @@ use modd_budget, only: lbu_enable, nbumod, tbudgets 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_NSV, ONLY: NSV_LIMA_NI, NSV_LIMA_NS USE MODD_PARAMETERS, ONLY: JPHEXT, JPVEXT USE MODD_PARAM_LIMA, ONLY: LSNOW, LSNOW_T, XRTMIN, XCTMIN, & - XALPHAI, XALPHAS, XNUI, XNUS + XALPHAI, XALPHAS, XNUI, XNUS, NMOM_S USE MODD_PARAM_LIMA_COLD, ONLY: XLBI, XLBEXI, XLBS, XLBEXS, XNS, XBI, XCXS, XCCS, & XLBDAS_MAX, XDSCNVI_LIM, XLBDASCNVI_MAX, & XC0DEPSI, XC1DEPSI, XR0DEPSI, XR1DEPSI, & @@ -137,8 +140,10 @@ REAL, DIMENSION(:,:,:), INTENT(INOUT) :: PRIS ! Pristine ice m.r. source REAL, DIMENSION(:,:,:), INTENT(INOUT) :: PRSS ! Snow/aggregate m.r. source ! REAL, DIMENSION(:,:,:), INTENT(IN) :: PCIT ! Ice crystal C. at t +REAL, DIMENSION(:,:,:),OPTIONAL, INTENT(IN) :: PCST ! Snow/aggregates C. at t ! REAL, DIMENSION(:,:,:), INTENT(INOUT) :: PCIS ! Ice crystal C. source +REAL, DIMENSION(:,:,:),OPTIONAL, INTENT(INOUT) :: PCSS ! Snow/aggregates C. source ! !* 0.2 Declarations of local variables : ! @@ -156,6 +161,7 @@ REAL, DIMENSION(:), ALLOCATABLE :: ZRST ! Snow/aggregate m.r. at t REAL, DIMENSION(:), ALLOCATABLE :: ZRGT ! Graupel/hail m.r. at t ! REAL, DIMENSION(:), ALLOCATABLE :: ZCIT ! Pristine ice conc. at t +REAL, DIMENSION(:), ALLOCATABLE :: ZCST ! Snow/aggregate conc. at t ! ! REAL, DIMENSION(:), ALLOCATABLE :: ZRVS ! Water vapor m.r. source REAL, DIMENSION(:), ALLOCATABLE :: ZRIS ! Pristine ice m.r. source @@ -164,6 +170,7 @@ REAL, DIMENSION(:), ALLOCATABLE :: ZRSS ! Snow/aggregate m.r. source REAL, DIMENSION(:), ALLOCATABLE :: ZTHS ! Theta source ! REAL, DIMENSION(:), ALLOCATABLE :: ZCIS ! Pristine ice conc. source +REAL, DIMENSION(:), ALLOCATABLE :: ZCSS ! Snow/aggregates conc. source ! REAL, DIMENSION(:), ALLOCATABLE & :: ZRHODREF, & ! RHO Dry REFerence @@ -248,6 +255,8 @@ IF( IMICRO >= 1 ) THEN ALLOCATE(ZTHS(IMICRO)) ! ALLOCATE(ZCIS(IMICRO)) + if (NMOM_S.GE.2) ALLOCATE(ZCST(IMICRO)) + if (NMOM_S.GE.2) ALLOCATE(ZCSS(IMICRO)) ! ALLOCATE(ZRHODREF(IMICRO)) ALLOCATE(ZZT(IMICRO)) @@ -270,6 +279,10 @@ IF( IMICRO >= 1 ) THEN ZTHS(JL) = PTHS(I1(JL),I2(JL),I3(JL)) ! ZCIS(JL) = PCIS(I1(JL),I2(JL),I3(JL)) + if (NMOM_S.GE.2) then + ZCST(JL) = PCST(I1(JL),I2(JL),I3(JL)) + ZCSS(JL) = PCSS(I1(JL),I2(JL),I3(JL)) + end if ! ZRHODREF(JL) = PRHODREF(I1(JL),I2(JL),I3(JL)) ZZT(JL) = ZT(I1(JL),I2(JL),I3(JL)) @@ -326,6 +339,10 @@ IF( IMICRO >= 1 ) THEN ZLBDAS(:) = MAX(MIN(XLBDAS_MAX, 10**(6.226-0.0106*ZZT(:))),XLBDAS_MIN) END WHERE ZLBDAS(:) = ZLBDAS(:) * XTRANS_MP_GAMMAS + ELSE IF (NMOM_S.GE.2) THEN + WHERE (ZRST(:)>XRTMIN(5) .AND. ZCST(:)>XCTMIN(5)) + ZLBDAS(:) = ( XLBS*ZCST(:) / ZRST(:) )**XLBEXS + END WHERE ELSE WHERE (ZRST(:)>XRTMIN(5) ) ZLBDAS(:) = MAX(MIN(XLBDAS_MAX,XLBS*( ZRHODREF(:)*ZRST(:) )**XLBEXS),XLBDAS_MIN) @@ -352,21 +369,45 @@ IF( IMICRO >= 1 ) THEN if ( lbudget_rs ) call Budget_store_init( tbudgets(NBUDGET_RS), 'CNVI', prss(:, :, :) * prhodj(:, :, :) ) if ( lbudget_sv ) & call Budget_store_init( tbudgets(NBUDGET_SV1 - 1 + nsv_lima_ni), 'CNVI', pcis(:, :, :) * prhodj(:, :, :) ) + if ( lbudget_sv .AND. NMOM_S.GE.2) & + call Budget_store_init( tbudgets(NBUDGET_SV1 - 1 + nsv_lima_ns), 'CNVI', pcss(:, :, :) * prhodj(:, :, :) ) end if - - ZZW(:) = 0.0 - WHERE ( ZLBDAS(:)<XLBDASCNVI_MAX .AND. (ZRST(:)>XRTMIN(5)) & - .AND. (ZSSI(:)<0.0) ) - ZZW(:) = (ZLBDAS(:)*XDSCNVI_LIM)**(XALPHAS) - ZZX(:) = ( -ZSSI(:)/ZAI(:) ) * (XNS*ZRST(:)*ZLBDAS(:)**XBS) * (ZZW(:)**XNUS) * EXP(-ZZW(:)) -! - ZZW(:) = MIN( ( XR0DEPSI+XR1DEPSI*ZCJ(:) )*ZZX(:),ZRSS(:) ) - ZRIS(:) = ZRIS(:) + ZZW(:) - ZRSS(:) = ZRSS(:) - ZZW(:) ! - ZZW(:) = ZZW(:)*( XC0DEPSI+XC1DEPSI*ZCJ(:) )/( XR0DEPSI+XR1DEPSI*ZCJ(:) ) - ZCIS(:) = ZCIS(:) + ZZW(:) - END WHERE + ZZW(:) = 0.0 + if(NMOM_S.GE.2) THEN + WHERE ( ZLBDAS(:)<XLBDASCNVI_MAX .AND. (ZRST(:)>XRTMIN(5)) .AND.(ZCST(:)>XCTMIN(5)) & + .AND. (ZSSI(:)<0.0) ) + ZZW(:) = (ZLBDAS(:)*XDSCNVI_LIM)**(XALPHAS) + ZZX(:) = ( -ZSSI(:)/ZAI(:) ) * (ZCST(:)) * (ZZW(:)**XNUI) & + * EXP(-ZZW(:)) +! + ZZW(:) = MIN( ( XR0DEPSI+XR1DEPSI*ZCJ(:) )*ZZX(:),ZRSS(:) ) + ZRIS(:) = ZRIS(:) + ZZW(:) + ZRSS(:) = ZRSS(:) - ZZW(:) +! + ZZW(:) = MIN(ZZW(:)*( XC0DEPSI+XC1DEPSI*ZCJ(:) )/( XR0DEPSI+XR1DEPSI*ZCJ(:)),ZCSS(:) ) + ZCIS(:) = ZCIS(:) + ZZW(:) + ZCSS(:) = ZCSS(:) - ZZW(:) + END WHERE + else + WHERE ( ZRST(:)>XRTMIN(5) ) + ZLBDAS(:) = MIN( XLBDAS_MAX, & + XLBS*( ZRHODREF(:)*MAX( ZRST(:),XRTMIN(5) ) )**XLBEXS ) + END WHERE + 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(:)) +! + ZZW(:) = MIN( ( XR0DEPSI+XR1DEPSI*ZCJ(:) )*ZZX(:),ZRSS(:) ) + ZRIS(:) = ZRIS(:) + ZZW(:) + ZRSS(:) = ZRSS(:) - ZZW(:) +! + ZZW(:) = ZZW(:)*( XC0DEPSI+XC1DEPSI*ZCJ(:) )/( XR0DEPSI+XR1DEPSI*ZCJ(:) ) + ZCIS(:) = ZCIS(:) + ZZW(:) + END WHERE + end if ! ! Budget storage if ( nbumod == kmi .and. lbu_enable ) then @@ -376,6 +417,9 @@ IF( IMICRO >= 1 ) THEN Unpack( zrss(:), mask = gmicro(:, :, :), field = prss(:, :, :) ) * prhodj(:, :, :) ) if ( lbudget_sv ) call Budget_store_end( tbudgets(NBUDGET_SV1 - 1 + nsv_lima_ni), 'CNVI', & Unpack( zcis(:), mask = gmicro(:, :, :), field = pcis(:, :, :) ) * prhodj(:, :, :) ) + if ( lbudget_sv .AND. NMOM_S.GE.2 ) & + call Budget_store_end( tbudgets(NBUDGET_SV1 - 1 + nsv_lima_ns), 'CNVI', & + Unpack( zcss(:), mask = gmicro(:, :, :), field = pcss(:, :, :) ) * prhodj(:, :, :) ) end if ! ! @@ -390,18 +434,28 @@ IF( IMICRO >= 1 ) THEN end if ZZW(:) = 0.0 - WHERE ( (ZRST(:)>XRTMIN(5)) .AND. (ZRSS(:)>ZRTMIN(5)) ) - ZZW(:) = ( ZRST(:)*ZSSI(:)/(ZAI(:)) ) * & - ( X0DEPS*ZLBDAS(:)**XEX0DEPS + & - (X1DEPS*ZCJ(:)*(1+0.5*(XFVELOS/ZLBDAS(:))**XALPHAS)**(-XNUS+XEX1DEPS/XALPHAS) * & - (ZLBDAS(:))**(XEX1DEPS+XBS))) + if (NMOM_S.GE.2) then + WHERE ( (ZRST(:)>XRTMIN(5)) .AND. (ZRSS(:)>ZRTMIN(5)) ) + ZZW(:) = ( ZSSI(:)/(ZRHODREF(:)*ZAI(:)) ) * ZCST * & + ( X0DEPS*ZLBDAS(:)**XEX0DEPS + X1DEPS*ZCJ(:)*ZLBDAS(:)**XEX1DEPS ) + ZZW(:) = MIN( ZRVS(:),ZZW(:) )*(0.5+SIGN(0.5,ZZW(:))) & + - MIN( ZRSS(:),ABS(ZZW(:)) )*(0.5-SIGN(0.5,ZZW(:))) + ZRSS(:) = ZRSS(:) + ZZW(:) + ZRVS(:) = ZRVS(:) - ZZW(:) + ZTHS(:) = ZTHS(:) + ZZW(:)*ZLSFACT(:) + END WHERE + else + WHERE ( (ZRST(:)>XRTMIN(5)) .AND. (ZRSS(:)>ZRTMIN(5)) ) + ZZW(:) = ( ZSSI(:)/(ZRHODREF(:)*ZAI(:)) ) * & + ( X0DEPS*ZLBDAS(:)**XEX0DEPS + X1DEPS*ZCJ(:)*ZLBDAS(:)**XEX1DEPS ) - ZZW(:) = MIN( ZRVS(:),ZZW(:) )*(0.5+SIGN(0.5,ZZW(:))) & - - MIN( ZRSS(:),ABS(ZZW(:)) )*(0.5-SIGN(0.5,ZZW(:))) - ZRSS(:) = ZRSS(:) + ZZW(:) - ZRVS(:) = ZRVS(:) - ZZW(:) - ZTHS(:) = ZTHS(:) + ZZW(:)*ZLSFACT(:) - END WHERE + ZZW(:) = MIN( ZRVS(:),ZZW(:) )*(0.5+SIGN(0.5,ZZW(:))) & + - MIN( ZRSS(:),ABS(ZZW(:)) )*(0.5-SIGN(0.5,ZZW(:))) + ZRSS(:) = ZRSS(:) + ZZW(:) + ZRVS(:) = ZRVS(:) - ZZW(:) + ZTHS(:) = ZTHS(:) + ZZW(:)*ZLSFACT(:) + END WHERE + end if ! Budget storage if ( nbumod == kmi .and. lbu_enable ) then if ( lbudget_th ) call Budget_store_end( tbudgets(NBUDGET_TH), 'DEPS', & @@ -422,23 +476,47 @@ IF( IMICRO >= 1 ) THEN Unpack( zrss(:), mask = gmicro(:, :, :), field = prss(:, :, :) ) * prhodj(:, :, :) ) if ( lbudget_sv ) call Budget_store_init( tbudgets(NBUDGET_SV1 - 1 + nsv_lima_ni), 'CNVS', & Unpack( zcis(:), mask = gmicro(:, :, :), field = pcis(:, :, :) ) * prhodj(:, :, :) ) + if ( lbudget_sv .AND. NMOM_S.GE.2 ) call Budget_store_init( tbudgets(NBUDGET_SV1 - 1 + nsv_lima_ns), 'CNVS', & + Unpack( zcss(:), mask = gmicro(:, :, :), field = pcss(:, :, :) ) * prhodj(:, :, :) ) end if ZZW(:) = 0.0 - WHERE ( (ZLBDAI(:)<XLBDAICNVS_LIM) .AND. (ZCIT(:)>XCTMIN(4)) & - .AND. (ZSSI(:)>0.0) ) - ZZW(:) = (ZLBDAI(:)*XDICNVS_LIM)**(XALPHAI) - ZZX(:) = ( ZSSI(:)/ZAI(:) )*ZCIT(:) * (ZZW(:)**XNUI) *EXP(-ZZW(:)) -! - ZZW(:) = MAX( MIN( ( XR0DEPIS + XR1DEPIS*ZCJ(:) )*ZZX(:) & - ,ZRIS(:) ) + ZRTMIN(5), ZRTMIN(5) ) - ZRTMIN(5) - ZRIS(:) = ZRIS(:) - ZZW(:) - ZRSS(:) = ZRSS(:) + ZZW(:) -! - ZZW(:) = MIN( ZZW(:)*(( XC0DEPIS+XC1DEPIS*ZCJ(:) ) & - /( XR0DEPIS+XR1DEPIS*ZCJ(:) )),ZCIS(:) ) - ZCIS(:) = ZCIS(:) - ZZW(:) - END WHERE + if (NMOM_S.GE.2) then + WHERE ( (ZLBDAI(:)<XLBDAICNVS_LIM) .AND. (ZCIT(:)>XCTMIN(4)) & + .AND. (ZSSI(:)>0.0) ) + 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(:) + ZRSS(:) = ZRSS(:) + ZZW(:) +! + ZZW(:) = MIN( ZZW(:)*(( XC0DEPIS+XC1DEPIS*ZCJ(:) ) & + /( XR0DEPIS+XR1DEPIS*ZCJ(:) )),ZCIS(:) ) + ZCIS(:) = ZCIS(:) - ZZW(:) + ZCSS(:) = ZCSS(:) + ZZW(:) + END WHERE + else + WHERE ( (ZLBDAI(:)<XLBDAICNVS_LIM) .AND. (ZCIT(:)>XCTMIN(4)) & + .AND. (ZSSI(:)>0.0) ) + 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(:) + ZRSS(:) = ZRSS(:) + ZZW(:) +! + ZZW(:) = MIN( ZZW(:)*(( XC0DEPIS+XC1DEPIS*ZCJ(:) ) & + /( XR0DEPIS+XR1DEPIS*ZCJ(:) )),ZCIS(:) ) + ZCIS(:) = ZCIS(:) - ZZW(:) + END WHERE + end if ! ! Budget storage if ( nbumod == kmi .and. lbu_enable ) then @@ -448,6 +526,8 @@ IF( IMICRO >= 1 ) THEN Unpack( zrss(:), mask = gmicro(:, :, :), field = prss(:, :, :) ) * prhodj(:, :, :) ) if ( lbudget_sv ) call Budget_store_end( tbudgets(NBUDGET_SV1 - 1 + nsv_lima_ni), 'CNVS', & Unpack( zcis(:), mask = gmicro(:, :, :), field = pcis(:, :, :) ) * prhodj(:, :, :) ) + if ( lbudget_sv .AND. NMOM_S.GE.2 ) call Budget_store_end( tbudgets(NBUDGET_SV1 - 1 + nsv_lima_ns), 'CNVS', & + Unpack( zcss(:), mask = gmicro(:, :, :), field = pcss(:, :, :) ) * prhodj(:, :, :) ) end if ! ! @@ -462,20 +542,36 @@ IF( IMICRO >= 1 ) THEN if ( lbudget_sv ) call Budget_store_init( tbudgets(NBUDGET_SV1 - 1 + nsv_lima_ni), 'AGGS', & Unpack( zcis(:), mask = gmicro(:, :, :), field = pcis(:, :, :) ) * prhodj(:, :, :) ) end if - - WHERE ( (ZRIT(:)>XRTMIN(4)) .AND. (ZRST(:)>XRTMIN(5)) .AND. (ZRIS(:)>ZRTMIN(4)) & - .AND. (ZCIS(:)>ZCTMIN(4)) ) - ZZW1(:,3) = (ZLBDAI(:) / ZLBDAS(:))**3 - ZZW1(:,1) = (ZCIT(:)*(XNS*ZRST(:)*ZLBDAS(:)**XBS)*EXP(XCOLEXIS*(ZZT(:)-XTT) ))*ZRHODREF(:) & - / (ZLBDAI(:)**3) - ZZW1(:,2) = MIN( ZZW1(:,1)*(XAGGS_CLARGE1+XAGGS_CLARGE2*ZZW1(:,3)),ZCIS(:) ) - ZCIS(:) = ZCIS(:) - ZZW1(:,2) -! - ZZW1(:,1) = ZZW1(:,1) / ZLBDAI(:)**XBI - ZZW1(:,2) = MIN( ZZW1(:,1)*(XAGGS_RLARGE1+XAGGS_RLARGE2*ZZW1(:,3)),ZRIS(:) ) - ZRIS(:) = ZRIS(:) - ZZW1(:,2) - ZRSS(:) = ZRSS(:) + ZZW1(:,2) - END WHERE +! + if (NMOM_S.GE.2) 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(:)*ZCST(:)*EXP( XCOLEXIS*(ZZT(:)-XTT) )) & + / (ZLBDAI(:)**3) + ZZW1(:,2) = MIN( ZZW1(:,1)*(XAGGS_CLARGE1+XAGGS_CLARGE2*ZZW1(:,3)),ZCIS(:) ) + ZCIS(:) = ZCIS(:) - ZZW1(:,2) +! + ZZW1(:,1) = ZZW1(:,1) / ZLBDAI(:)**XBI + ZZW1(:,2) = MIN( ZZW1(:,1)*(XAGGS_RLARGE1+XAGGS_RLARGE2*ZZW1(:,3)),ZRIS(:) ) + ZRIS(:) = ZRIS(:) - ZZW1(:,2) + ZRSS(:) = ZRSS(:) + ZZW1(:,2) + END WHERE + else + 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) )) & + / (ZLBDAI(:)**3) + ZZW1(:,2) = MIN( ZZW1(:,1)*(XAGGS_CLARGE1+XAGGS_CLARGE2*ZZW1(:,3)),ZCIS(:) ) + ZCIS(:) = ZCIS(:) - ZZW1(:,2) +! + ZZW1(:,1) = ZZW1(:,1) / ZLBDAI(:)**XBI + ZZW1(:,2) = MIN( ZZW1(:,1)*(XAGGS_RLARGE1+XAGGS_RLARGE2*ZZW1(:,3)),ZRIS(:) ) + ZRIS(:) = ZRIS(:) - ZZW1(:,2) + ZRSS(:) = ZRSS(:) + ZZW1(:,2) + END WHERE + end if ! Budget storage if ( nbumod == kmi .and. lbu_enable ) then if ( lbudget_ri ) call Budget_store_end( tbudgets(NBUDGET_RI), 'AGGS', & @@ -501,6 +597,11 @@ IF( IMICRO >= 1 ) THEN ! ZW(:,:,:) = PCIS(:,:,:) PCIS(:,:,:) = UNPACK( ZCIS(:),MASK=GMICRO(:,:,:),FIELD=ZW(:,:,:) ) + if (NMOM_S.GE.2) then + ZW(:,:,:) = PCSS(:,:,:) + PCSS(:,:,:) = UNPACK( ZCSS(:),MASK=GMICRO(:,:,:),FIELD=ZW(:,:,:) ) + end if + ! ZW(:,:,:) = PTHS(:,:,:) PTHS(:,:,:) = UNPACK( ZTHS(:),MASK=GMICRO(:,:,:),FIELD=ZW(:,:,:) ) @@ -516,7 +617,9 @@ IF( IMICRO >= 1 ) THEN DEALLOCATE(ZRIS) DEALLOCATE(ZRSS) DEALLOCATE(ZTHS) - DEALLOCATE(ZCIS) + DEALLOCATE(ZCIS) + if (NMOM_S.GE.2) DEALLOCATE(ZCSS) + if (NMOM_S.GE.2) DEALLOCATE(ZCST) DEALLOCATE(ZRHODREF) DEALLOCATE(ZZT) DEALLOCATE(ZPRES) diff --git a/src/MNH/lima_collisional_ice_breakup.f90 b/src/MNH/lima_collisional_ice_breakup.f90 index c5afbb591..3c22bf960 100644 --- a/src/MNH/lima_collisional_ice_breakup.f90 +++ b/src/MNH/lima_collisional_ice_breakup.f90 @@ -10,7 +10,7 @@ INTERFACE SUBROUTINE LIMA_COLLISIONAL_ICE_BREAKUP (LDCOMPUTE, & PRHODREF, & - PRIT, PRST, PRGT, PCIT, & + PRIT, PRST, PRGT, PCIT, PCST, PCGT, & PLBDS, PLBDG, & P_RI_CIBU, P_CI_CIBU ) ! @@ -22,6 +22,8 @@ REAL, DIMENSION(:), INTENT(IN) :: PRIT REAL, DIMENSION(:), INTENT(IN) :: PRST REAL, DIMENSION(:), INTENT(IN) :: PRGT REAL, DIMENSION(:), INTENT(IN) :: PCIT +REAL, DIMENSION(:), INTENT(IN) :: PCST +REAL, DIMENSION(:), INTENT(IN) :: PCGT REAL, DIMENSION(:), INTENT(IN) :: PLBDS REAL, DIMENSION(:), INTENT(IN) :: PLBDG ! @@ -35,7 +37,7 @@ END MODULE MODI_LIMA_COLLISIONAL_ICE_BREAKUP ! ####################################################################### SUBROUTINE LIMA_COLLISIONAL_ICE_BREAKUP (LDCOMPUTE, & PRHODREF, & - PRIT, PRST, PRGT, PCIT, & + PRIT, PRST, PRGT, PCIT, PCST, PCGT, & PLBDS, PLBDG, & P_RI_CIBU, P_CI_CIBU ) ! ####################################################################### @@ -83,6 +85,8 @@ REAL, DIMENSION(:), INTENT(IN) :: PRIT REAL, DIMENSION(:), INTENT(IN) :: PRST REAL, DIMENSION(:), INTENT(IN) :: PRGT REAL, DIMENSION(:), INTENT(IN) :: PCIT +REAL, DIMENSION(:), INTENT(IN) :: PCST +REAL, DIMENSION(:), INTENT(IN) :: PCGT REAL, DIMENSION(:), INTENT(IN) :: PLBDS REAL, DIMENSION(:), INTENT(IN) :: PLBDG ! @@ -102,7 +106,7 @@ INTEGER, PARAMETER :: I_SEED_PARAM = 26032012 INTEGER, DIMENSION(:), ALLOCATABLE :: I_SEED INTEGER :: NI_SEED ! -REAL, DIMENSION(:), ALLOCATABLE :: ZVEC1_S, ZVEC1_S1, ZVEC1_S2, & ! Work vectors +REAL, DIMENSION(:), ALLOCATABLE :: ZVEC1_S, ZVEC1_SW, ZVEC1_S1, ZVEC1_S2, & ! Work vectors ZVEC1_S3, ZVEC1_S4, & ZVEC1_S11, ZVEC1_S12, & ! for snow ZVEC1_S21, ZVEC1_S22, & @@ -174,6 +178,7 @@ IF (ICIBU > 0) THEN ! 1.3.1.0 allocations ! ALLOCATE(ZVEC1_S(ICIBU)) + ALLOCATE(ZVEC1_SW(ICIBU)) ALLOCATE(ZVEC1_S1(ICIBU)) ALLOCATE(ZVEC1_S2(ICIBU)) ALLOCATE(ZVEC1_S3(ICIBU)) @@ -195,6 +200,7 @@ IF (ICIBU > 0) THEN ! 1.3.1.1 select the PLBDS ! ZVEC1_S(:) = PACK( PLBDS(:),MASK=GCIBU(:) ) + ZVEC1_SW(:)= ( XFVELOS**XALPHAS + ZVEC1_S(:)**XALPHAS ) ** (1./XALPHAS) ! modified equivalent lambda ! ! ! 1.3.1.2 find the next lower indice for the PLBDS in the @@ -233,29 +239,53 @@ IF (ICIBU > 0) THEN ! ! ! 1.3.1.5 perform the linear interpolation of the -! normalized "XDS"-moment of the incomplete gamma function +! normalized "XBS"-moment of the incomplete gamma function ! ! For lower boundary (0.2 mm) - ZVEC1_S21(1:ICIBU) = XGAMINC_CIBU_S(2,IVEC2_S1(1:ICIBU)+1) * ZVEC2_S1(1:ICIBU) & - - XGAMINC_CIBU_S(2,IVEC2_S1(1:ICIBU)) * (ZVEC2_S1(1:ICIBU)-1.0) + ZVEC1_S31(1:ICIBU) = XGAMINC_CIBU_S(3,IVEC2_S1(1:ICIBU)+1) * ZVEC2_S1(1:ICIBU) & + - XGAMINC_CIBU_S(3,IVEC2_S1(1:ICIBU)) * (ZVEC2_S1(1:ICIBU)-1.0) ! ! For upper boundary (1 mm) - ZVEC1_S22(1:ICIBU) = XGAMINC_CIBU_S(2,IVEC2_S2(1:ICIBU)+1) * ZVEC2_S2(1:ICIBU) & - - XGAMINC_CIBU_S(2,IVEC2_S2(1:ICIBU)) * (ZVEC2_S2(1:ICIBU)-1.0) + ZVEC1_S32(1:ICIBU) = XGAMINC_CIBU_S(3,IVEC2_S2(1:ICIBU)+1) * ZVEC2_S2(1:ICIBU) & + - XGAMINC_CIBU_S(3,IVEC2_S2(1:ICIBU)) * (ZVEC2_S2(1:ICIBU)-1.0) ! ! From 0.2 mm to 1 mm we need - ZVEC1_S2(1:ICIBU) = XMOMGS_CIBU_1 * (ZVEC1_S22(1:ICIBU) - ZVEC1_S21(1:ICIBU)) + ZVEC1_S3(1:ICIBU) = XMOMGS_CIBU_2 * (ZVEC1_S32(1:ICIBU) - ZVEC1_S31(1:ICIBU)) +! +! +! 1.3.1.2 find the next lower indice for the PLBDS in the +! geometrical set of Lbda_s used to tabulate some moments of the +! incomplete gamma function, for boundary 1 (0.2 mm) for modified lambda (Wurtz snow fall speed) +! + ZVEC2_S1(1:ICIBU) = MAX( 1.0001, MIN( FLOAT(NGAMINC)-0.0001,XCIBUINTP_S & + * LOG( ZVEC1_SW(1:ICIBU) ) + XCIBUINTP1_S ) ) + IVEC2_S1(1:ICIBU) = INT( ZVEC2_S1(1:ICIBU) ) + ZVEC2_S1(1:ICIBU) = ZVEC2_S1(1:ICIBU) - FLOAT( IVEC2_S1(1:ICIBU) ) +! +! +! 1.3.1.3 find the next lower indice for the PLBDS in the +! geometrical set of Lbda_s used to tabulate some moments of the +! incomplete gamma function, for boundary 2 (1 mm) for modified lambda (Wurtz snow fall speed) +! + ZVEC2_S2(1:ICIBU) = MAX( 1.0001, MIN( FLOAT(NGAMINC)-0.0001,XCIBUINTP_S & + * LOG( ZVEC1_SW(1:ICIBU) ) + XCIBUINTP2_S ) ) + IVEC2_S2(1:ICIBU) = INT( ZVEC2_S2(1:ICIBU) ) + ZVEC2_S2(1:ICIBU) = ZVEC2_S2(1:ICIBU) - FLOAT( IVEC2_S2(1:ICIBU) ) +! +! +! 1.3.1.5 perform the linear interpolation of the +! normalized "XDS"-moment of the incomplete gamma function ! ! For lower boundary (0.2 mm) - ZVEC1_S31(1:ICIBU) = XGAMINC_CIBU_S(3,IVEC2_S1(1:ICIBU)+1) * ZVEC2_S1(1:ICIBU) & - - XGAMINC_CIBU_S(3,IVEC2_S1(1:ICIBU)) * (ZVEC2_S1(1:ICIBU)-1.0) + ZVEC1_S21(1:ICIBU) = XGAMINC_CIBU_S(2,IVEC2_S1(1:ICIBU)+1) * ZVEC2_S1(1:ICIBU) & + - XGAMINC_CIBU_S(2,IVEC2_S1(1:ICIBU)) * (ZVEC2_S1(1:ICIBU)-1.0) ! ! For upper boundary (1 mm) - ZVEC1_S32(1:ICIBU) = XGAMINC_CIBU_S(3,IVEC2_S2(1:ICIBU)+1) * ZVEC2_S2(1:ICIBU) & - - XGAMINC_CIBU_S(3,IVEC2_S2(1:ICIBU)) * (ZVEC2_S2(1:ICIBU)-1.0) + ZVEC1_S22(1:ICIBU) = XGAMINC_CIBU_S(2,IVEC2_S2(1:ICIBU)+1) * ZVEC2_S2(1:ICIBU) & + - XGAMINC_CIBU_S(2,IVEC2_S2(1:ICIBU)) * (ZVEC2_S2(1:ICIBU)-1.0) ! ! From 0.2 mm to 1 mm we need - ZVEC1_S3(1:ICIBU) = XMOMGS_CIBU_2 * (ZVEC1_S32(1:ICIBU) - ZVEC1_S31(1:ICIBU)) + ZVEC1_S2(1:ICIBU) = XMOMGS_CIBU_1 * (ZVEC1_S22(1:ICIBU) - ZVEC1_S21(1:ICIBU)) ! ! ! 1.3.1.6 perform the linear interpolation of the @@ -331,11 +361,11 @@ IF (ICIBU > 0) THEN ! 1.3.3 To compute final "CIBU" contributions ! ZFRAG_CIBU(:) = UNPACK ( VECTOR=ZFRAGMENTS(:),MASK=GCIBU,FIELD=0.0 ) - ZNI_CIBU(:) = ZFRAG_CIBU(:) * (XFACTOR_CIBU_NI * PRST(:) / (PRHODREF(:)**XCEXVT)) * & + ZNI_CIBU(:) = ZFRAG_CIBU(:) * (XFACTOR_CIBU_NI * PCST(:) * PCGT(:) / (PRHODREF(:)**XCEXVT)) * & (XCG * ZINTG_GRAUPEL_1(:) * ZINTG_SNOW_1(:) * & - PLBDS(:)**(XBS) * PLBDG(:)**(XCXG-(XDG+2.0)) & + PLBDG(:)**(-(XDG+2.0)) & - XCS * ZINTG_GRAUPEL_2(:) * ZINTG_SNOW_2(:) * & - PLBDS(:)**(-XDS+XBS) * PLBDG(:)**(XCXG-2.0) * & + PLBDS(:)**(-XDS) * PLBDG(:)**(-2.0) * & (1+(XFVELOS/PLBDS(:))**XALPHAS)**(-XNUS-XDS/XALPHAS) ) P_CI_CIBU(:) = MAX(ZNI_CIBU(:),0.) @@ -343,11 +373,11 @@ IF (ICIBU > 0) THEN DEALLOCATE(ZFRAGMENTS) ! ! Max value of rs removed by CIBU - ZRI_CIBU(:) = (XFACTOR_CIBU_RI * PRST(:) / (PRHODREF(:)**XCEXVT)) * & + ZRI_CIBU(:) = (XFACTOR_CIBU_RI * PCST(:) * PCGT(:) / (PRHODREF(:)**XCEXVT)) * & (XCG * ZINTG_GRAUPEL_1(:) * ZINTG_SNOW_3(:) * & - PLBDG(:)**(XCXG-(XDG+2.0)) & + PLBDS(:)**(-XBS) * PLBDG(:)**(-(XDG+2.0)) & - XCS * ZINTG_GRAUPEL_2(:) * ZINTG_SNOW_4(:) * & - PLBDS(:)**(-XDS) * PLBDG(:)**(XCXG-2.0) * & + PLBDS(:)**(-XBS-XDS) * PLBDG(:)**(-2.0) * & (1+(XFVELOS/PLBDS(:))**XALPHAS)**(-XNUS-(XBS+XDS)/XALPHAS) ) ! ! The value of rs removed by CIBU is determined by the mean mass of pristine ice @@ -360,6 +390,7 @@ IF (ICIBU > 0) THEN P_RI_CIBU(:) = MAX(ZRI_CIBU(:), 0.) ! DEALLOCATE(ZVEC1_S) + DEALLOCATE(ZVEC1_SW) DEALLOCATE(ZVEC1_S1) DEALLOCATE(ZVEC1_S2) DEALLOCATE(ZVEC1_S3) diff --git a/src/MNH/lima_conversion_melting_snow.f90 b/src/MNH/lima_conversion_melting_snow.f90 index d1aa60aa4..9b6bf0912 100644 --- a/src/MNH/lima_conversion_melting_snow.f90 +++ b/src/MNH/lima_conversion_melting_snow.f90 @@ -10,8 +10,8 @@ INTERFACE SUBROUTINE LIMA_CONVERSION_MELTING_SNOW (LDCOMPUTE, & PRHODREF, PPRES, PT, PKA, PDV, PCJ, & - PRVT, PRST, PLBDS, & - P_RS_CMEL ) + PRVT, PRST, PCST, PLBDS, & + P_RS_CMEL, P_CS_CMEL ) ! LOGICAL, DIMENSION(:),INTENT(IN) :: LDCOMPUTE ! @@ -23,10 +23,12 @@ REAL, DIMENSION(:), INTENT(IN) :: PDV ! REAL, DIMENSION(:), INTENT(IN) :: PCJ ! ! REAL, DIMENSION(:), INTENT(IN) :: PRVT ! -REAL, DIMENSION(:), INTENT(IN) :: PRST ! Cloud water C. at t +REAL, DIMENSION(:), INTENT(IN) :: PRST ! Snow mr at t +REAL, DIMENSION(:), INTENT(IN) :: PCST ! Snow C. at t REAL, DIMENSION(:), INTENT(IN) :: PLBDS ! ! REAL, DIMENSION(:), INTENT(OUT) :: P_RS_CMEL +REAL, DIMENSION(:), INTENT(OUT) :: P_CS_CMEL ! END SUBROUTINE LIMA_CONVERSION_MELTING_SNOW END INTERFACE @@ -35,8 +37,8 @@ END MODULE MODI_LIMA_CONVERSION_MELTING_SNOW ! ############################################################################## SUBROUTINE LIMA_CONVERSION_MELTING_SNOW (LDCOMPUTE, & PRHODREF, PPRES, PT, PKA, PDV, PCJ, & - PRVT, PRST, PLBDS, & - P_RS_CMEL ) + PRVT, PRST, PCST, PLBDS, & + P_RS_CMEL, P_CS_CMEL ) ! ############################################################################## ! !! PURPOSE @@ -80,10 +82,12 @@ REAL, DIMENSION(:), INTENT(IN) :: PDV ! REAL, DIMENSION(:), INTENT(IN) :: PCJ ! ! REAL, DIMENSION(:), INTENT(IN) :: PRVT ! -REAL, DIMENSION(:), INTENT(IN) :: PRST ! Cloud water C. at t +REAL, DIMENSION(:), INTENT(IN) :: PRST ! Snow mr at t +REAL, DIMENSION(:), INTENT(IN) :: PCST ! Snow C. at t REAL, DIMENSION(:), INTENT(IN) :: PLBDS ! ! REAL, DIMENSION(:), INTENT(OUT) :: P_RS_CMEL +REAL, DIMENSION(:), INTENT(OUT) :: P_CS_CMEL ! !* 0.2 Declarations of local variables : ! @@ -97,6 +101,7 @@ REAL, DIMENSION(SIZE(PRST)) :: ZW ! work arrays ! ! P_RS_CMEL(:)=0. +P_CS_CMEL(:)=0. ! ZW(:) = 0.0 WHERE( (PRST(:)>XRTMIN(5)) .AND. (PT(:)>XTT) .AND. LDCOMPUTE(:) ) @@ -107,13 +112,14 @@ WHERE( (PRST(:)>XRTMIN(5)) .AND. (PT(:)>XTT) .AND. LDCOMPUTE(:) ) ! ! compute RSMLT ! - ZW(:) = XFSCVMG*MAX( 0.0,( -ZW(:) * PRST(:) * & + ZW(:) = XFSCVMG*MAX( 0.0,( -ZW(:) * PCST(:) * & ( X0DEPS*PLBDS(:)**XEX0DEPS + & X1DEPS*PCJ(:)*PLBDS(:)**(XEX1DEPS+XBS)* & (1+0.5*(XFVELOS/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(:) + P_CS_CMEL(:) = - ZW(:) * PCST(:) / PRST(:) ! END WHERE ! diff --git a/src/MNH/lima_droplets_riming_snow.f90 b/src/MNH/lima_droplets_riming_snow.f90 index 4e650743e..ae585bbf1 100644 --- a/src/MNH/lima_droplets_riming_snow.f90 +++ b/src/MNH/lima_droplets_riming_snow.f90 @@ -8,11 +8,11 @@ ! ################################# ! INTERFACE - SUBROUTINE LIMA_DROPLETS_RIMING_SNOW (PTSTEP, LDCOMPUTE, & - PRHODREF, PT, & - PRCT, PCCT, PRST, PLBDC, PLBDS, PLVFACT, PLSFACT, & - P_TH_RIM, P_RC_RIM, P_CC_RIM, P_RS_RIM, P_RG_RIM, & - P_RI_HMS, P_CI_HMS, P_RS_HMS ) + SUBROUTINE LIMA_DROPLETS_RIMING_SNOW (PTSTEP, LDCOMPUTE, & + PRHODREF, PT, & + PRCT, PCCT, PRST, PCST, PLBDC, PLBDS, PLVFACT, PLSFACT, & + P_TH_RIM, P_RC_RIM, P_CC_RIM, P_RS_RIM, P_CS_RIM, P_RG_RIM, & + P_RI_HMS, P_CI_HMS, P_RS_HMS ) ! REAL, INTENT(IN) :: PTSTEP LOGICAL, DIMENSION(:),INTENT(IN) :: LDCOMPUTE @@ -20,9 +20,10 @@ LOGICAL, DIMENSION(:),INTENT(IN) :: LDCOMPUTE REAL, DIMENSION(:), INTENT(IN) :: PRHODREF ! REAL, DIMENSION(:), INTENT(IN) :: PT ! ! -REAL, DIMENSION(:), INTENT(IN) :: PRCT ! Cloud water C. at t +REAL, DIMENSION(:), INTENT(IN) :: PRCT ! Cloud water mr at t REAL, DIMENSION(:), INTENT(IN) :: PCCT ! Cloud water C. at t -REAL, DIMENSION(:), INTENT(IN) :: PRST ! Cloud water C. at t +REAL, DIMENSION(:), INTENT(IN) :: PRST ! Snow mr at t +REAL, DIMENSION(:), INTENT(IN) :: PCST ! Snow C. at t REAL, DIMENSION(:), INTENT(IN) :: PLBDC ! REAL, DIMENSION(:), INTENT(IN) :: PLBDS ! REAL, DIMENSION(:), INTENT(IN) :: PLVFACT ! @@ -32,6 +33,7 @@ REAL, DIMENSION(:), INTENT(OUT) :: P_TH_RIM REAL, DIMENSION(:), INTENT(OUT) :: P_RC_RIM REAL, DIMENSION(:), INTENT(OUT) :: P_CC_RIM REAL, DIMENSION(:), INTENT(OUT) :: P_RS_RIM +REAL, DIMENSION(:), INTENT(OUT) :: P_CS_RIM REAL, DIMENSION(:), INTENT(OUT) :: P_RG_RIM ! REAL, DIMENSION(:), INTENT(OUT) :: P_RI_HMS @@ -43,11 +45,11 @@ END INTERFACE END MODULE MODI_LIMA_DROPLETS_RIMING_SNOW ! ! ######################################################################################### - SUBROUTINE LIMA_DROPLETS_RIMING_SNOW (PTSTEP, LDCOMPUTE, & - PRHODREF, PT, & - PRCT, PCCT, PRST, PLBDC, PLBDS, PLVFACT, PLSFACT, & - P_TH_RIM, P_RC_RIM, P_CC_RIM, P_RS_RIM, P_RG_RIM, & - P_RI_HMS, P_CI_HMS, P_RS_HMS ) + SUBROUTINE LIMA_DROPLETS_RIMING_SNOW (PTSTEP, LDCOMPUTE, & + PRHODREF, PT, & + PRCT, PCCT, PRST, PCST, PLBDC, PLBDS, PLVFACT, PLSFACT, & + P_TH_RIM, P_RC_RIM, P_CC_RIM, P_RS_RIM, P_CS_RIM, P_RG_RIM, & + P_RI_HMS, P_CI_HMS, P_RS_HMS ) ! ######################################################################################### ! !! PURPOSE @@ -90,9 +92,10 @@ LOGICAL, DIMENSION(:),INTENT(IN) :: LDCOMPUTE REAL, DIMENSION(:), INTENT(IN) :: PRHODREF ! REAL, DIMENSION(:), INTENT(IN) :: PT ! ! -REAL, DIMENSION(:), INTENT(IN) :: PRCT ! -REAL, DIMENSION(:), INTENT(IN) :: PCCT ! -REAL, DIMENSION(:), INTENT(IN) :: PRST ! +REAL, DIMENSION(:), INTENT(IN) :: PRCT ! Cloud water mr at t +REAL, DIMENSION(:), INTENT(IN) :: PCCT ! Cloud water C. at t +REAL, DIMENSION(:), INTENT(IN) :: PRST ! Snow mr at t +REAL, DIMENSION(:), INTENT(IN) :: PCST ! Snow C. at t REAL, DIMENSION(:), INTENT(IN) :: PLBDC ! REAL, DIMENSION(:), INTENT(IN) :: PLBDS ! REAL, DIMENSION(:), INTENT(IN) :: PLVFACT ! @@ -101,6 +104,7 @@ REAL, DIMENSION(:), INTENT(IN) :: PLSFACT ! REAL, DIMENSION(:), INTENT(OUT) :: P_RC_RIM REAL, DIMENSION(:), INTENT(OUT) :: P_CC_RIM REAL, DIMENSION(:), INTENT(OUT) :: P_RS_RIM +REAL, DIMENSION(:), INTENT(OUT) :: P_CS_RIM REAL, DIMENSION(:), INTENT(OUT) :: P_RG_RIM ! REAL, DIMENSION(:), INTENT(OUT) :: P_TH_RIM @@ -112,8 +116,8 @@ REAL, DIMENSION(:), INTENT(OUT) :: P_RS_HMS ! REAL, DIMENSION(SIZE(PRCT)) :: ZZW1, ZZW2, ZZW3, ZZW4, ZZW5 ! -INTEGER, DIMENSION(SIZE(PRCT)) :: IVEC1,IVEC2 ! Vectors of indices -REAL, DIMENSION(SIZE(PRCT)) :: ZVEC1,ZVEC2 ! Work vectors +INTEGER, DIMENSION(SIZE(PRCT)) :: IVEC1,IVEC2 ! Vectors of indices +REAL, DIMENSION(SIZE(PRCT)) :: ZVEC1,ZVEC2,ZVEC1W ! Work vectors INTEGER :: JI ! !------------------------------------------------------------------------------- @@ -128,37 +132,38 @@ DO JI = 1, SIZE(PRCT) IF ( PRCT(JI)>XRTMIN(2) .AND. PRST(JI)>XRTMIN(5) .AND. PT(JI)<XTT .AND. LDCOMPUTE(JI) ) THEN ! ZVEC1(JI) = PLBDS(JI) + ZVEC1W(JI)= ( XFVELOS**XALPHAS + PLBDS(JI)**XALPHAS ) ** (1./XALPHAS) ! modified equivalent lambda ! -! 1. find the next lower indice for the ZLBDAS in the geometrical -! set of Lbda_s used to tabulate some moments of the incomplete -! gamma function +! 2. perform the linear interpolation of the normalized +! "2+XDS"-moment of the incomplete gamma function using the modified equivalent lambda ! ZVEC2(JI) = MAX( 1.0001, MIN( REAL(NGAMINC)-0.0001, & - XRIMINTP1 * LOG( ZVEC1(JI) ) + XRIMINTP2 ) ) + XRIMINTP1 * LOG( ZVEC1W(JI) ) + XRIMINTP2 ) ) IVEC2(JI) = INT( ZVEC2(JI) ) ZVEC2(JI) = ZVEC2(JI) - REAL( IVEC2(JI) ) ! -! 2. perform the linear interpolation of the normalized -! "2+XDS"-moment of the incomplete gamma function -! - ZVEC1(JI) = XGAMINC_RIM1( IVEC2(JI)+1 )* ZVEC2(JI) & + ZVEC1(JI) = XGAMINC_RIM1( IVEC2(JI)+1 )* ZVEC2(JI) & - XGAMINC_RIM1( IVEC2(JI) )*(ZVEC2(JI) - 1.0) ZZW1(JI) = ZVEC1(JI) ! ! 3. perform the linear interpolation of the normalized ! "XBS"-moment of the incomplete gamma function ! - ZVEC1(JI) = XGAMINC_RIM2( IVEC2(JI)+1 )* ZVEC2(JI) & + ZVEC2(JI) = MAX( 1.0001, MIN( REAL(NGAMINC)-0.0001, & + XRIMINTP1 * LOG( ZVEC1(JI) ) + XRIMINTP2 ) ) + IVEC2(JI) = INT( ZVEC2(JI) ) + ZVEC2(JI) = ZVEC2(JI) - REAL( IVEC2(JI) ) +! + ZVEC1(JI) = XGAMINC_RIM2( IVEC2(JI)+1 )* ZVEC2(JI) & - XGAMINC_RIM2( IVEC2(JI) )*(ZVEC2(JI) - 1.0) ZZW2(JI) = ZVEC1(JI) ! ! 4. riming ! ! Cloud droplets collected - P_RC_RIM(JI) = - XCRIMSS * PRCT(JI) * PRST(JI)*(1+(XFVELOS/PLBDS(JI))**XALPHAS)**(-XNUS+XEXCRIMSS/XALPHAS) & - * PRHODREF(JI)**(-XCEXVT+1) & - * (PLBDS(JI)) ** (XEXCRIMSS+XBS) - P_CC_RIM(JI) = P_RC_RIM(JI) *(PCCT(JI)/PRCT(JI)) ! Lambda_c**3 + P_RC_RIM(JI) = - XCRIMSS * PRCT(JI) * PCST(JI)*(1+(XFVELOS/PLBDS(JI))**XALPHAS)**(-XNUS+XEXCRIMSS/XALPHAS) & + * PRHODREF(JI)**(-XCEXVT+1) * PLBDS(JI)**XEXCRIMSS + P_CC_RIM(JI) = P_RC_RIM(JI) * PCCT(JI)/PRCT(JI) ! Lambda_c**3 ! ! Cloud droplets collected on small aggregates add to snow P_RS_RIM(JI) = - P_RC_RIM(JI) * ZZW1(JI) @@ -168,19 +173,20 @@ DO JI = 1, SIZE(PRCT) ! IF (LMURAKAMI) THEN ! Graupel formation based on Murakami - ZVEC1(JI) = XGAMINC_RIM4( IVEC2(JI)+1 )* ZVEC2(JI) & + ZVEC1(JI) = XGAMINC_RIM4( IVEC2(JI)+1 )* ZVEC2(JI) & - XGAMINC_RIM4( IVEC2(JI) )*(ZVEC2(JI) - 1.0) ZZW5(JI) = ZVEC1(JI) - ZZW3(JI) = XSRIMCG *PRHODREF(JI)*PRST(JI)* PLBDS(JI)**(XEXSRIMCG+XBS) * (1.0 - ZZW2(JI))!/(PTSTEP*PRHODREF(JI)) - ZZW3(JI) = (P_RG_RIM(JI))*ZZW3(JI)/ & + ZZW3(JI) = XSRIMCG * PRHODREF(JI) * PCST(JI) * PLBDS(JI)**XEXSRIMCG * (1.0 - ZZW2(JI))!/(PTSTEP*PRHODREF(JI)) + ZZW3(JI) = P_RG_RIM(JI)*ZZW3(JI)/ & MAX(1.E-10, & !-20 - XSRIMCG3*XSRIMCG2*PRST(JI)*PRHODREF(JI)*PLBDS(JI)**(XEXSRIMCG2)*(1.-ZZW5(JI))- & + XSRIMCG3*XSRIMCG2*PCST(JI)*PRHODREF(JI)*PLBDS(JI)**(XEXSRIMCG2)*(1.-ZZW5(JI))- & XSRIMCG3*ZZW3(JI)) ELSE ! Large aggregates collecting droplets add to graupel (instant process ???) ZZW3(JI) = PRST(JI)*(1.0 - ZZW2(JI))/PTSTEP END IF P_RS_RIM(JI) = P_RS_RIM(JI) - ZZW3(JI) + P_CS_RIM(JI) = -ZZW3(JI) * PCST(JI)/PRST(JI) P_RG_RIM(JI) = P_RG_RIM(JI) + ZZW3(JI) ! P_TH_RIM(JI) = - P_RC_RIM(JI)*(PLSFACT(JI)-PLVFACT(JI)) @@ -189,6 +195,7 @@ DO JI = 1, SIZE(PRCT) P_RC_RIM(JI) = 0. P_CC_RIM(JI) = 0. P_RS_RIM(JI) = 0. + P_CS_RIM(JI) = 0. P_RG_RIM(JI) = 0. END IF ! @@ -203,7 +210,7 @@ DO JI = 1, SIZE(PRCT) XHMLINTP1 * LOG( ZVEC1(JI) ) + XHMLINTP2 ) ) IVEC2(JI) = INT( ZVEC2(JI) ) ZVEC2(JI) = ZVEC2(JI) - REAL( IVEC2(JI) ) - ZVEC1(JI) = XGAMINC_HMC( IVEC2(JI)+1 )* ZVEC2(JI) & + ZVEC1(JI) = XGAMINC_HMC( IVEC2(JI)+1 )* ZVEC2(JI) & - XGAMINC_HMC( IVEC2(JI) )*(ZVEC2(JI) - 1.0) ZZW4(JI) = ZVEC1(JI) ! Large droplets ! diff --git a/src/MNH/lima_graupel.f90 b/src/MNH/lima_graupel.f90 index 1883891a1..ec51cbc55 100644 --- a/src/MNH/lima_graupel.f90 +++ b/src/MNH/lima_graupel.f90 @@ -11,17 +11,17 @@ INTERFACE SUBROUTINE LIMA_GRAUPEL (PTSTEP, LDCOMPUTE, & PRHODREF, PPRES, PT, PKA, PDV, PCJ, & PRVT, PRCT, PRRT, PRIT, PRST, PRGT, & - PCCT, PCRT, PCIT, & + PCCT, PCRT, PCIT, PCST, PCGT, & PLBDC, PLBDR, PLBDS, PLBDG, & PLVFACT, PLSFACT, & P_TH_WETG, P_RC_WETG, P_CC_WETG, P_RR_WETG, P_CR_WETG, & - P_RI_WETG, P_CI_WETG, P_RS_WETG, P_RG_WETG, P_RH_WETG, & + P_RI_WETG, P_CI_WETG, P_RS_WETG, P_CS_WETG, P_RG_WETG, P_CG_WETG, P_RH_WETG, & P_TH_DRYG, P_RC_DRYG, P_CC_DRYG, P_RR_DRYG, P_CR_DRYG, & - P_RI_DRYG, P_CI_DRYG, P_RS_DRYG, P_RG_DRYG, & + P_RI_DRYG, P_CI_DRYG, P_RS_DRYG, P_CS_DRYG, P_RG_DRYG, & P_RI_HMG, P_CI_HMG, P_RG_HMG, & - P_TH_GMLT, P_RR_GMLT, P_CR_GMLT, & + P_TH_GMLT, P_RR_GMLT, P_CR_GMLT, P_CG_GMLT, & PA_TH, PA_RC, PA_CC, PA_RR, PA_CR, & - PA_RI, PA_CI, PA_RS, PA_RG, PA_RH ) + PA_RI, PA_CI, PA_RS, PA_CS, PA_RG, PA_CG, PA_RH, PA_CH ) ! REAL, INTENT(IN) :: PTSTEP LOGICAL, DIMENSION(:),INTENT(IN) :: LDCOMPUTE @@ -43,6 +43,8 @@ REAL, DIMENSION(:), INTENT(IN) :: PRGT ! REAL, DIMENSION(:), INTENT(IN) :: PCCT ! REAL, DIMENSION(:), INTENT(IN) :: PCRT ! REAL, DIMENSION(:), INTENT(IN) :: PCIT ! +REAL, DIMENSION(:), INTENT(IN) :: PCST ! +REAL, DIMENSION(:), INTENT(IN) :: PCGT ! ! REAL, DIMENSION(:), INTENT(IN) :: PLBDC ! REAL, DIMENSION(:), INTENT(IN) :: PLBDR ! @@ -60,7 +62,9 @@ REAL, DIMENSION(:), INTENT(INOUT) :: P_CR_WETG REAL, DIMENSION(:), INTENT(INOUT) :: P_RI_WETG REAL, DIMENSION(:), INTENT(INOUT) :: P_CI_WETG REAL, DIMENSION(:), INTENT(INOUT) :: P_RS_WETG +REAL, DIMENSION(:), INTENT(INOUT) :: P_CS_WETG REAL, DIMENSION(:), INTENT(INOUT) :: P_RG_WETG +REAL, DIMENSION(:), INTENT(INOUT) :: P_CG_WETG REAL, DIMENSION(:), INTENT(INOUT) :: P_RH_WETG ! REAL, DIMENSION(:), INTENT(INOUT) :: P_TH_DRYG @@ -71,6 +75,7 @@ REAL, DIMENSION(:), INTENT(INOUT) :: P_CR_DRYG REAL, DIMENSION(:), INTENT(INOUT) :: P_RI_DRYG REAL, DIMENSION(:), INTENT(INOUT) :: P_CI_DRYG REAL, DIMENSION(:), INTENT(INOUT) :: P_RS_DRYG +REAL, DIMENSION(:), INTENT(INOUT) :: P_CS_DRYG REAL, DIMENSION(:), INTENT(INOUT) :: P_RG_DRYG ! REAL, DIMENSION(:), INTENT(INOUT) :: P_RI_HMG @@ -80,6 +85,7 @@ REAL, DIMENSION(:), INTENT(INOUT) :: P_RG_HMG REAL, DIMENSION(:), INTENT(INOUT) :: P_TH_GMLT REAL, DIMENSION(:), INTENT(INOUT) :: P_RR_GMLT REAL, DIMENSION(:), INTENT(INOUT) :: P_CR_GMLT +REAL, DIMENSION(:), INTENT(INOUT) :: P_CG_GMLT ! REAL, DIMENSION(:), INTENT(INOUT) :: PA_TH REAL, DIMENSION(:), INTENT(INOUT) :: PA_RC @@ -89,8 +95,11 @@ REAL, DIMENSION(:), INTENT(INOUT) :: PA_CR REAL, DIMENSION(:), INTENT(INOUT) :: PA_RI REAL, DIMENSION(:), INTENT(INOUT) :: PA_CI REAL, DIMENSION(:), INTENT(INOUT) :: PA_RS +REAL, DIMENSION(:), INTENT(INOUT) :: PA_CS REAL, DIMENSION(:), INTENT(INOUT) :: PA_RG +REAL, DIMENSION(:), INTENT(INOUT) :: PA_CG REAL, DIMENSION(:), INTENT(INOUT) :: PA_RH +REAL, DIMENSION(:), INTENT(INOUT) :: PA_CH ! END SUBROUTINE LIMA_GRAUPEL END INTERFACE @@ -100,17 +109,17 @@ END MODULE MODI_LIMA_GRAUPEL SUBROUTINE LIMA_GRAUPEL (PTSTEP, LDCOMPUTE, & PRHODREF, PPRES, PT, PKA, PDV, PCJ, & PRVT, PRCT, PRRT, PRIT, PRST, PRGT, & - PCCT, PCRT, PCIT, & + PCCT, PCRT, PCIT, PCST, PCGT, & PLBDC, PLBDR, PLBDS, PLBDG, & PLVFACT, PLSFACT, & P_TH_WETG, P_RC_WETG, P_CC_WETG, P_RR_WETG, P_CR_WETG, & - P_RI_WETG, P_CI_WETG, P_RS_WETG, P_RG_WETG, P_RH_WETG, & + P_RI_WETG, P_CI_WETG, P_RS_WETG, P_CS_WETG, P_RG_WETG, P_CG_WETG, P_RH_WETG, & P_TH_DRYG, P_RC_DRYG, P_CC_DRYG, P_RR_DRYG, P_CR_DRYG, & - P_RI_DRYG, P_CI_DRYG, P_RS_DRYG, P_RG_DRYG, & + P_RI_DRYG, P_CI_DRYG, P_RS_DRYG, P_CS_DRYG, P_RG_DRYG, & P_RI_HMG, P_CI_HMG, P_RG_HMG, & - P_TH_GMLT, P_RR_GMLT, P_CR_GMLT, & + P_TH_GMLT, P_RR_GMLT, P_CR_GMLT, P_CG_GMLT, & PA_TH, PA_RC, PA_CC, PA_RR, PA_CR, & - PA_RI, PA_CI, PA_RS, PA_RG, PA_RH ) + PA_RI, PA_CI, PA_RS, PA_CS, PA_RG, PA_CG, PA_RH, PA_CH ) ! ################################################################################# ! !! PURPOSE @@ -141,7 +150,9 @@ USE MODD_PARAM_LIMA, ONLY : XRTMIN, XCEXVT, LHAIL USE MODD_PARAM_LIMA_MIXED, ONLY : XCXG, XDG, X0DEPG, X1DEPG, NGAMINC, & XFCDRYG, XFIDRYG, XCOLIG, XCOLSG, XCOLEXIG, XCOLEXSG, & XFSDRYG, XLBSDRYG1, XLBSDRYG2, XLBSDRYG3, XKER_SDRYG, & + XFNSDRYG, XLBNSDRYG1, XLBNSDRYG2, XLBNSDRYG3, XKER_N_SDRYG, & XFRDRYG, XLBRDRYG1, XLBRDRYG2, XLBRDRYG3, XKER_RDRYG, & + XFNRDRYG, XLBNRDRYG1, XLBNRDRYG2, XLBNRDRYG3, XKER_N_RDRYG, & XHMTMIN, XHMTMAX, XHMLINTP1, XHMLINTP2, XHM_FACTG, XGAMINC_HMC, & XEX0DEPG, XEX1DEPG, & XDRYINTP1R, XDRYINTP1S, XDRYINTP1G, & @@ -173,6 +184,8 @@ REAL, DIMENSION(:), INTENT(IN) :: PRGT ! REAL, DIMENSION(:), INTENT(IN) :: PCCT ! REAL, DIMENSION(:), INTENT(IN) :: PCRT ! REAL, DIMENSION(:), INTENT(IN) :: PCIT ! +REAL, DIMENSION(:), INTENT(IN) :: PCST ! +REAL, DIMENSION(:), INTENT(IN) :: PCGT ! ! REAL, DIMENSION(:), INTENT(IN) :: PLBDC ! REAL, DIMENSION(:), INTENT(IN) :: PLBDR ! @@ -190,7 +203,9 @@ REAL, DIMENSION(:), INTENT(INOUT) :: P_CR_WETG REAL, DIMENSION(:), INTENT(INOUT) :: P_RI_WETG REAL, DIMENSION(:), INTENT(INOUT) :: P_CI_WETG REAL, DIMENSION(:), INTENT(INOUT) :: P_RS_WETG +REAL, DIMENSION(:), INTENT(INOUT) :: P_CS_WETG REAL, DIMENSION(:), INTENT(INOUT) :: P_RG_WETG +REAL, DIMENSION(:), INTENT(INOUT) :: P_CG_WETG REAL, DIMENSION(:), INTENT(INOUT) :: P_RH_WETG ! REAL, DIMENSION(:), INTENT(INOUT) :: P_TH_DRYG @@ -201,6 +216,7 @@ REAL, DIMENSION(:), INTENT(INOUT) :: P_CR_DRYG REAL, DIMENSION(:), INTENT(INOUT) :: P_RI_DRYG REAL, DIMENSION(:), INTENT(INOUT) :: P_CI_DRYG REAL, DIMENSION(:), INTENT(INOUT) :: P_RS_DRYG +REAL, DIMENSION(:), INTENT(INOUT) :: P_CS_DRYG REAL, DIMENSION(:), INTENT(INOUT) :: P_RG_DRYG ! REAL, DIMENSION(:), INTENT(INOUT) :: P_RI_HMG @@ -210,6 +226,7 @@ REAL, DIMENSION(:), INTENT(INOUT) :: P_RG_HMG REAL, DIMENSION(:), INTENT(INOUT) :: P_TH_GMLT REAL, DIMENSION(:), INTENT(INOUT) :: P_RR_GMLT REAL, DIMENSION(:), INTENT(INOUT) :: P_CR_GMLT +REAL, DIMENSION(:), INTENT(INOUT) :: P_CG_GMLT ! REAL, DIMENSION(:), INTENT(INOUT) :: PA_TH REAL, DIMENSION(:), INTENT(INOUT) :: PA_RC @@ -219,8 +236,11 @@ REAL, DIMENSION(:), INTENT(INOUT) :: PA_CR REAL, DIMENSION(:), INTENT(INOUT) :: PA_RI REAL, DIMENSION(:), INTENT(INOUT) :: PA_CI REAL, DIMENSION(:), INTENT(INOUT) :: PA_RS +REAL, DIMENSION(:), INTENT(INOUT) :: PA_CS REAL, DIMENSION(:), INTENT(INOUT) :: PA_RG +REAL, DIMENSION(:), INTENT(INOUT) :: PA_CG REAL, DIMENSION(:), INTENT(INOUT) :: PA_RH +REAL, DIMENSION(:), INTENT(INOUT) :: PA_CH ! !* 0.2 Declarations of local variables : ! @@ -230,6 +250,7 @@ INTEGER :: JJ ! REAL, DIMENSION(SIZE(PRCT)) :: Z1, Z2, Z3, Z4 REAL, DIMENSION(SIZE(PRCT)) :: ZZX, ZZW, ZZW1, ZZW2, ZZW3, ZZW4, ZZW5, ZZW6, ZZW7 +REAL, DIMENSION(SIZE(PRCT)) :: ZZW3N, ZZW4N, ZZW6N REAL, DIMENSION(SIZE(PRCT)) :: ZRDRYG, ZRWETG ! INTEGER, DIMENSION(SIZE(PRCT)) :: IVEC1,IVEC2 ! Vectors of indices @@ -240,6 +261,7 @@ INTEGER :: NHAIL !------------------------------------------------------------------------------- ! ! +P_TH_WETG(:) = 0. P_RC_WETG(:) = 0. P_CC_WETG(:) = 0. P_RR_WETG(:) = 0. @@ -247,9 +269,12 @@ P_CR_WETG(:) = 0. P_RI_WETG(:) = 0. P_CI_WETG(:) = 0. P_RS_WETG(:) = 0. +P_CS_WETG(:) = 0. P_RG_WETG(:) = 0. +P_CG_WETG(:) = 0. P_RH_WETG(:) = 0. ! +P_TH_DRYG(:) = 0. P_RC_DRYG(:) = 0. P_CC_DRYG(:) = 0. P_RR_DRYG(:) = 0. @@ -257,19 +282,24 @@ P_CR_DRYG(:) = 0. P_RI_DRYG(:) = 0. P_CI_DRYG(:) = 0. P_RS_DRYG(:) = 0. +P_CS_DRYG(:) = 0. P_RG_DRYG(:) = 0. ! P_RI_HMG(:) = 0. P_CI_HMG(:) = 0. P_RG_HMG(:) = 0. ! +P_TH_GMLT(:) = 0. P_RR_GMLT(:) = 0. P_CR_GMLT(:) = 0. +P_CG_GMLT(:) = 0. ! ZZW1(:) = 0. ! RCDRYG ZZW2(:) = 0. ! RIDRYG ZZW3(:) = 0. ! RSDRYG +ZZW3N(:) = 0.! NSDRYG ZZW4(:) = 0. ! RRDRYG +ZZW4N(:) = 0.! NRDRYG ZZW5(:) = 0. ! RIWETG ZZW6(:) = 0. ! RSWETG ZZW7(:) = 0. ! @@ -285,15 +315,15 @@ ZRWETG(:) = 0. ! -------------------------------------------- ! WHERE( PRGT(:)>XRTMIN(6) .AND. LDCOMPUTE(:) ) - ZZW(:) = PLBDG(:)**(XCXG-XDG-2.0) * PRHODREF(:)**(-XCEXVT) - ZZW1(:) = XFCDRYG * PRCT(:) * ZZW(:) ! RCDRYG - rc collected by graupel in dry mode + ZZW(:) = PCGT(:) * PLBDG(:)**(-XDG-2.0) * PRHODREF(:)**(1-XCEXVT) + ZZW1(:) = XFCDRYG * PRCT(:) * ZZW(:) ! RCDRYG - rc collected by graupel in dry mode ZZW2(:) = XFIDRYG * EXP( XCOLEXIG*(PT(:)-XTT) ) * PRIT(:) * ZZW(:) ! RIDRYG - ri collected by graupel in dry mode END WHERE ! !* 1.b Collection of rs in the dry mode ! ------------------------------------ ! -GDRY(:) = (PRST(:)>XRTMIN(5)) .AND. (PRGT(:)>XRTMIN(6)) .AND. LDCOMPUTE(:) +GDRY(:) = PRST(:)>XRTMIN(5) .AND. PRGT(:)>XRTMIN(6) .AND. LDCOMPUTE(:) ! WHERE( GDRY ) ! @@ -330,19 +360,36 @@ WHERE( GDRY ) - Z4(:)*(ZVEC2(:) - 1.0) ) & * (ZVEC1(:) - 1.0) ZZW(:) = ZVEC3(:) -! ZZW3(:) = XFSDRYG * ZZW(:) * EXP( XCOLEXSG*(PT(:)-XTT) ) & ! RSDRYG - rs collected by graupel in dry mode - *( PRST(:))*( PLBDG(:)**XCXG ) & - *( PRHODREF(:)**(-XCEXVT) ) & + * PRST(:) * PCGT(:) & + * PRHODREF(:)**(1-XCEXVT) & *( XLBSDRYG1/( PLBDG(:)**2 ) + & XLBSDRYG2/( PLBDG(:) * PLBDS(:) ) + & XLBSDRYG3/( PLBDS(:)**2) ) +! + Z1(:) = GET_XKER_N_SDRYG(IVEC1(:)+1,IVEC2(:)+1) + Z2(:) = GET_XKER_N_SDRYG(IVEC1(:)+1,IVEC2(:) ) + Z3(:) = GET_XKER_N_SDRYG(IVEC1(:) ,IVEC2(:)+1) + Z4(:) = GET_XKER_N_SDRYG(IVEC1(:) ,IVEC2(:) ) + ZVEC3(:) = ( Z1(:)* ZVEC2(:) & + - Z2(:)*(ZVEC2(:) - 1.0) ) & + * ZVEC1(:) & + - ( Z3(:)* ZVEC2(:) & + - Z4(:)*(ZVEC2(:) - 1.0) ) & + * (ZVEC1(:) - 1.0) + ZZW(:) = ZVEC3(:) + ZZW3N(:) = XFNSDRYG * ZZW(:) * EXP( XCOLEXSG*(PT(:)-XTT) ) & ! NSDRYG - Ns collected by graupel in dry mode + * PCST(:) * PCGT(:) & + * PRHODREF(:)**(1-XCEXVT) & + *( XLBNSDRYG1/( PLBDG(:)**2 ) + & + XLBNSDRYG2/( PLBDG(:) * PLBDS(:) ) + & + XLBNSDRYG3/( PLBDS(:)**2) ) END WHERE ! !* 1.c Collection of rr in the dry mode ! ------------------------------------- ! -GDRY(:) = (PRRT(:)>XRTMIN(3)) .AND. (PRGT(:)>XRTMIN(6)) .AND. LDCOMPUTE(:) +GDRY(:) = PRRT(:)>XRTMIN(3) .AND. PRGT(:)>XRTMIN(6) .AND. LDCOMPUTE(:) ! WHERE( GDRY ) ! @@ -379,14 +426,31 @@ WHERE( GDRY ) - Z4(:)*(ZVEC2(:) - 1.0) ) & * (ZVEC1(:) - 1.0) ZZW(:) = ZVEC3(:) -! -! BVIE manque PCRT ??????????????????????????????????? -! ZZW4(:) = XFRDRYG * ZZW(:) & ! RRDRYG - ZZW4(:) = XFRDRYG * ZZW(:) * PCRT(:) & ! RRDRYG - *( PLBDG(:)**XCXG ) * ( PRHODREF(:)**(-XCEXVT-1.) ) & - *( XLBRDRYG1/( PLBDG(:)**2 ) + & - XLBRDRYG2/( PLBDG(:) * PLBDR(:) ) + & - XLBRDRYG3/( PLBDR(:)**2) ) / PLBDR(:)**3 + ZZW4(:) = XFRDRYG * ZZW(:) & ! RRDRYG + * PRRT(:) * PCGT(:) & + * PRHODREF(:)**(1-XCEXVT) & + *( XLBRDRYG1/( PLBDG(:)**2 ) + & + XLBRDRYG2/( PLBDG(:) * PLBDR(:) ) + & + XLBRDRYG3/( PLBDR(:)**2) ) +! + Z1(:) = GET_XKER_N_RDRYG(IVEC1(:)+1,IVEC2(:)+1) + Z2(:) = GET_XKER_N_RDRYG(IVEC1(:)+1,IVEC2(:) ) + Z3(:) = GET_XKER_N_RDRYG(IVEC1(:) ,IVEC2(:)+1) + Z4(:) = GET_XKER_N_RDRYG(IVEC1(:) ,IVEC2(:) ) + ZVEC3(:) = ( Z1(:)* ZVEC2(:) & + - Z2(:)*(ZVEC2(:) - 1.0) ) & + * ZVEC1(:) & + - ( Z3(:)* ZVEC2(:) & + - Z4(:)*(ZVEC2(:) - 1.0) ) & + * (ZVEC1(:) - 1.0) + ZZW(:) = ZVEC3(:) + ZZW4N(:) = XFNRDRYG * ZZW(:) & ! NRDRYG + * PCRT(:) * PCGT(:) & + * PRHODREF(:)**(1-XCEXVT) & + *( XLBNRDRYG1/( PLBDG(:)**2 ) + & + XLBNRDRYG2/( PLBDG(:) * PLBDR(:) ) + & + XLBNRDRYG3/( PLBDR(:)**2) ) + END WHERE ! ! 1.d Total collection in the dry mode @@ -401,6 +465,7 @@ ZZW(:) = 0.0 WHERE( PRGT(:)>XRTMIN(6) .AND. LDCOMPUTE(:) ) ZZW5(:) = ZZW2(:) / (XCOLIG*EXP(XCOLEXIG*(PT(:)-XTT)) ) ! RIWETG ZZW6(:) = ZZW3(:) / (XCOLSG*EXP(XCOLEXSG*(PT(:)-XTT)) ) ! RSWETG + ZZW6N(:)= ZZW3N(:)/ (XCOLSG*EXP(XCOLEXSG*(PT(:)-XTT)) ) ! NSWETG ! ZZW(:) = PRVT(:)*PPRES(:)/((XMV/XMD)+PRVT(:)) ! Vapor pressure ZZW(:) = PKA(:)*(XTT-PT(:)) + & @@ -408,12 +473,11 @@ WHERE( PRGT(:)>XRTMIN(6) .AND. LDCOMPUTE(:) ) *(XESTT-ZZW(:))/(XRV*PT(:)) ) ! ! Total mass gained by graupel in wet mode - ZRWETG(:) = MAX( 0.0, & - ( ZZW(:) * ( X0DEPG* PLBDG(:)**XEX0DEPG + & - X1DEPG*PCJ(:)*PLBDG(:)**XEX1DEPG ) + & - ( ZZW5(:)+ZZW6(:) ) * & - ( PRHODREF(:)*(XLMTT+(XCI-XCL)*(XTT-PT(:))) ) ) / & - ( PRHODREF(:)*(XLMTT-XCL*(XTT-PT(:))) ) ) + ZRWETG(:) = MAX( 0.0, & + ( ZZW(:) * PCGT(:) * ( X0DEPG* PLBDG(:)**XEX0DEPG + & + X1DEPG*PCJ(:)*PLBDG(:)**XEX1DEPG ) + & + ( ZZW5(:)+ZZW6(:) ) * ( XLMTT + (XCI-XCL)*(XTT-PT(:)) ) ) & + / (XLMTT-XCL*(XTT-PT(:))) ) !We must agregate, at least, the cold species ZRWETG(:)=MAX(ZRWETG(:), ZZW5(:)+ZZW6(:)) END WHERE @@ -442,7 +506,9 @@ WHERE( LDCOMPUTE(:) .AND. PRGT(:)>XRTMIN(6) .AND. PT(:)<XTT .AND. & P_RI_WETG(:) = - ZZW5(:) P_CI_WETG(:) = P_RI_WETG(:) * PCIT(:)/MAX(PRIT(:),XRTMIN(4)) P_RS_WETG(:) = - ZZW6(:) + P_CS_WETG(:) = - ZZW6N(:) P_RG_WETG(:) = - PRGT(:)/PTSTEP * ZZW(:) + ZRWETG(:) * (1.-ZZW(:)) + P_CG_WETG(:) = - PCGT(:)/PTSTEP * ZZW(:) P_RH_WETG(:) = PRGT(:)/PTSTEP * ZZW(:) + ZRWETG(:) * ZZW(:) ! P_TH_WETG(:) = ZZW7(:) * (PLSFACT(:)-PLVFACT(:)) @@ -457,10 +523,11 @@ WHERE( LDCOMPUTE(:) .AND. PRGT(:)>XRTMIN(6) .AND. PT(:)<XTT .AND. P_RC_DRYG(:) = - ZZW1(:) P_CC_DRYG(:) = P_RC_DRYG(:) * PCCT(:)/MAX(PRCT(:),XRTMIN(2)) P_RR_DRYG(:) = - ZZW4(:) - P_CR_DRYG(:) = P_RR_DRYG(:) * PCRT(:)/MAX(PRRT(:),XRTMIN(3)) + P_CR_DRYG(:) = - ZZW4N(:) P_RI_DRYG(:) = - ZZW2(:) P_CI_DRYG(:) = P_RI_DRYG(:) * PCIT(:)/MAX(PRIT(:),XRTMIN(4)) P_RS_DRYG(:) = - ZZW3(:) + P_CS_DRYG(:) = - ZZW3N(:) P_RG_DRYG(:) = ZRDRYG(:) ! P_TH_DRYG(:) = (ZZW1(:) + ZZW4(:)) * (PLSFACT(:)-PLVFACT(:)) @@ -512,14 +579,14 @@ WHERE( (PRGT(:)>XRTMIN(6)) .AND. (PT(:)>XTT) .AND. LDCOMPUTE(:) ) ! ! compute RGMLTR ! - ZZX(:) = MAX( 0.0,( -ZZX(:) * & - ( X0DEPG* PLBDG(:)**XEX0DEPG + & + ZZX(:) = MAX( 0.0,( -ZZX(:) * PCGT(:) * & + ( X0DEPG* PLBDG(:)**XEX0DEPG + & X1DEPG*PCJ(:)*PLBDG(:)**XEX1DEPG ) - & - ( ZZW1(:)+ZZW4(:) ) * & - ( PRHODREF(:)*XCL*(XTT-PT(:))) ) / & - ( PRHODREF(:)*XLMTT ) ) + ( ZZW1(:)+ZZW4(:) ) * ( XCL*(XTT-PT(:))) ) & + / XLMTT ) P_RR_GMLT(:) = ZZX(:) P_CR_GMLT(:) = ZZX(:) * 5.0E6 ! obtained after averaging, Dshed=1mm and 500 microns + P_CG_GMLT(:) = - ZZX(:) * PCGT(:)/PRGT(:) ! P_TH_GMLT(:) = - P_RR_GMLT(:) * (PLSFACT(:)-PLVFACT(:)) END WHERE @@ -534,8 +601,11 @@ PA_CR(:) = PA_CR(:) + P_CR_WETG(:) + P_CR_DRYG(:) + P_CR_GMLT(:) PA_RI(:) = PA_RI(:) + P_RI_WETG(:) + P_RI_DRYG(:) + P_RI_HMG(:) PA_CI(:) = PA_CI(:) + P_CI_WETG(:) + P_CI_DRYG(:) + P_CI_HMG(:) PA_RS(:) = PA_RS(:) + P_RS_WETG(:) + P_RS_DRYG(:) +PA_CS(:) = PA_CS(:) + P_CS_WETG(:) + P_CS_DRYG(:) PA_RG(:) = PA_RG(:) + P_RG_WETG(:) + P_RG_DRYG(:) + P_RG_HMG(:) - P_RR_GMLT(:) +PA_CG(:) = PA_CG(:) + P_CG_WETG(:) + P_CG_GMLT(:) PA_RH(:) = PA_RH(:) + P_RH_WETG(:) +PA_CH(:) = PA_CH(:) - P_CG_WETG(:) PA_TH(:) = PA_TH(:) + P_TH_WETG(:) + P_TH_DRYG(:) + P_TH_GMLT(:) ! !------------------------------------------------------------------------------- @@ -554,6 +624,20 @@ CONTAINS END FUNCTION GET_XKER_SDRYG ! !------------------------------------------------------------------------------- +! + FUNCTION GET_XKER_N_SDRYG(GRAUPEL,SNOW) RESULT(RET) + INTEGER, DIMENSION(:) :: GRAUPEL + INTEGER, DIMENSION(:) :: SNOW + REAL, DIMENSION(SIZE(SNOW)) :: RET + ! + INTEGER I + ! + DO I=1,SIZE(GRAUPEL) + RET(I) = XKER_N_SDRYG(MAX(MIN(GRAUPEL(I),SIZE(XKER_N_SDRYG,1)),1),MAX(MIN(SNOW(I),SIZE(XKER_N_SDRYG,2)),1)) + END DO + END FUNCTION GET_XKER_N_SDRYG +! +!------------------------------------------------------------------------------- ! FUNCTION GET_XKER_RDRYG(GRAUPEL,RAIN) RESULT(RET) INTEGER, DIMENSION(:) :: GRAUPEL @@ -568,5 +652,19 @@ CONTAINS END FUNCTION GET_XKER_RDRYG ! !------------------------------------------------------------------------------- +! + FUNCTION GET_XKER_N_RDRYG(GRAUPEL,RAIN) RESULT(RET) + INTEGER, DIMENSION(:) :: GRAUPEL + INTEGER, DIMENSION(:) :: RAIN + REAL, DIMENSION(SIZE(RAIN)) :: RET + ! + INTEGER I + ! + DO I=1,SIZE(GRAUPEL) + RET(I) = XKER_N_RDRYG(MAX(MIN(GRAUPEL(I),SIZE(XKER_N_RDRYG,1)),1),MAX(MIN(RAIN(I),SIZE(XKER_N_RDRYG,2)),1)) + END DO + END FUNCTION GET_XKER_N_RDRYG +! +!------------------------------------------------------------------------------- ! END SUBROUTINE LIMA_GRAUPEL diff --git a/src/MNH/lima_graupel_deposition.f90 b/src/MNH/lima_graupel_deposition.f90 index d283c9699..83b28e3d2 100644 --- a/src/MNH/lima_graupel_deposition.f90 +++ b/src/MNH/lima_graupel_deposition.f90 @@ -8,14 +8,15 @@ ! ################################# ! INTERFACE - SUBROUTINE LIMA_GRAUPEL_DEPOSITION (LDCOMPUTE, PRHODREF, & - PRGT, PSSI, PLBDG, PAI, PCJ, PLSFACT, & - P_TH_DEPG, P_RG_DEPG ) + SUBROUTINE LIMA_GRAUPEL_DEPOSITION (LDCOMPUTE, PRHODREF, & + PRGT, PCGT, PSSI, PLBDG, PAI, PCJ, PLSFACT, & + P_TH_DEPG, P_RG_DEPG ) ! LOGICAL, DIMENSION(:),INTENT(IN) :: LDCOMPUTE REAL, DIMENSION(:), INTENT(IN) :: PRHODREF ! ! -REAL, DIMENSION(:), INTENT(IN) :: PRGT ! Cloud water C. at t +REAL, DIMENSION(:), INTENT(IN) :: PRGT ! graupel mr +REAL, DIMENSION(:), INTENT(IN) :: PCGT ! graupel conc REAL, DIMENSION(:), INTENT(IN) :: PSSI ! REAL, DIMENSION(:), INTENT(IN) :: PLBDG ! REAL, DIMENSION(:), INTENT(IN) :: PAI ! @@ -30,9 +31,9 @@ END INTERFACE END MODULE MODI_LIMA_GRAUPEL_DEPOSITION ! ! ########################################################################### - SUBROUTINE LIMA_GRAUPEL_DEPOSITION (LDCOMPUTE, PRHODREF, & - PRGT, PSSI, PLBDG, PAI, PCJ, PLSFACT, & - P_TH_DEPG, P_RG_DEPG ) + SUBROUTINE LIMA_GRAUPEL_DEPOSITION (LDCOMPUTE, PRHODREF, & + PRGT, PCGT, PSSI, PLBDG, PAI, PCJ, PLSFACT, & + P_TH_DEPG, P_RG_DEPG ) ! ########################################################################### ! !! PURPOSE @@ -51,12 +52,13 @@ END MODULE MODI_LIMA_GRAUPEL_DEPOSITION !! ------------- !! Original 15/03/2018 !! +! M. Taufour 07/2022 add concentration for snow, graupel, hail !------------------------------------------------------------------------------- ! !* 0. DECLARATIONS ! ------------ ! -USE MODD_PARAM_LIMA, ONLY : XRTMIN +USE MODD_PARAM_LIMA, ONLY : XRTMIN, XCTMIN USE MODD_PARAM_LIMA_MIXED, ONLY : X0DEPG, XEX0DEPG, X1DEPG, XEX1DEPG ! IMPLICIT NONE @@ -66,7 +68,8 @@ IMPLICIT NONE LOGICAL, DIMENSION(:),INTENT(IN) :: LDCOMPUTE REAL, DIMENSION(:), INTENT(IN) :: PRHODREF ! ! -REAL, DIMENSION(:), INTENT(IN) :: PRGT ! Cloud water C. at t +REAL, DIMENSION(:), INTENT(IN) :: PRGT ! graupel mr +REAL, DIMENSION(:), INTENT(IN) :: PCGT ! graupel conc REAL, DIMENSION(:), INTENT(IN) :: PSSI ! REAL, DIMENSION(:), INTENT(IN) :: PLBDG ! REAL, DIMENSION(:), INTENT(IN) :: PAI ! @@ -85,9 +88,9 @@ REAL, DIMENSION(:), INTENT(OUT) :: P_RG_DEPG ! P_TH_DEPG(:) = 0.0 P_RG_DEPG(:) = 0.0 -WHERE ( (PRGT(:)>XRTMIN(6)) .AND. LDCOMPUTE(:) ) - P_RG_DEPG(:) = ( PSSI(:)/PAI(:)/PRHODREF(:) ) * & - ( X0DEPG*PLBDG(:)**XEX0DEPG + X1DEPG*PCJ(:)*PLBDG(:)**XEX1DEPG ) +WHERE ( PRGT(:)>XRTMIN(6) .AND. PCGT(:)>XCTMIN(6) .AND. LDCOMPUTE(:) ) + P_RG_DEPG(:) = PSSI(:) / PAI(:) * PCGT(:) * & + ( X0DEPG*PLBDG(:)**XEX0DEPG + X1DEPG*PCJ(:)*PLBDG(:)**XEX1DEPG ) P_TH_DEPG(:) = P_RG_DEPG(:)*PLSFACT(:) END WHERE ! diff --git a/src/MNH/lima_ice_aggregation_snow.f90 b/src/MNH/lima_ice_aggregation_snow.f90 index af815a498..8268c17d6 100644 --- a/src/MNH/lima_ice_aggregation_snow.f90 +++ b/src/MNH/lima_ice_aggregation_snow.f90 @@ -8,10 +8,10 @@ ! ################################# ! INTERFACE - SUBROUTINE LIMA_ICE_AGGREGATION_SNOW (LDCOMPUTE, & - PT, PRHODREF, & - PRIT, PRST, PCIT, PLBDI, PLBDS, & - P_RI_AGGS, P_CI_AGGS ) + SUBROUTINE LIMA_ICE_AGGREGATION_SNOW (LDCOMPUTE, & + PT, PRHODREF, & + PRIT, PRST, PCIT, PCST, PLBDI, PLBDS, & + P_RI_AGGS, P_CI_AGGS ) ! LOGICAL, DIMENSION(:),INTENT(IN) :: LDCOMPUTE ! @@ -21,6 +21,7 @@ REAL, DIMENSION(:), INTENT(IN) :: PRHODREF REAL, DIMENSION(:), INTENT(IN) :: PRIT REAL, DIMENSION(:), INTENT(IN) :: PRST REAL, DIMENSION(:), INTENT(IN) :: PCIT +REAL, DIMENSION(:), INTENT(IN) :: PCST REAL, DIMENSION(:), INTENT(IN) :: PLBDI REAL, DIMENSION(:), INTENT(IN) :: PLBDS ! @@ -32,10 +33,10 @@ END INTERFACE END MODULE MODI_LIMA_ICE_AGGREGATION_SNOW ! ! ####################################################################### - SUBROUTINE LIMA_ICE_AGGREGATION_SNOW (LDCOMPUTE, & - PT, PRHODREF, & - PRIT, PRST, PCIT, PLBDI, PLBDS, & - P_RI_AGGS, P_CI_AGGS ) + SUBROUTINE LIMA_ICE_AGGREGATION_SNOW (LDCOMPUTE, & + PT, PRHODREF, & + PRIT, PRST, PCIT, PCST, PLBDI, PLBDS, & + P_RI_AGGS, P_CI_AGGS ) ! ####################################################################### ! !! PURPOSE @@ -54,6 +55,7 @@ END MODULE MODI_LIMA_ICE_AGGREGATION_SNOW !! Original 15/03/2018 ! J. Wurtz 03/2022: new snow characteristics ! B. Vie 03/2022: Add option for 1-moment pristine ice +! M. Taufour 07/2022: add concentration for snow, graupel, hail ! !------------------------------------------------------------------------------- ! @@ -77,6 +79,7 @@ REAL, DIMENSION(:), INTENT(IN) :: PRHODREF REAL, DIMENSION(:), INTENT(IN) :: PRIT REAL, DIMENSION(:), INTENT(IN) :: PRST REAL, DIMENSION(:), INTENT(IN) :: PCIT +REAL, DIMENSION(:), INTENT(IN) :: PCST REAL, DIMENSION(:), INTENT(IN) :: PLBDI REAL, DIMENSION(:), INTENT(IN) :: PLBDS ! @@ -102,7 +105,7 @@ P_CI_AGGS(:) = 0. ! ! IF (NMOM_I.EQ.1) THEN - WHERE ( (PRIT(:)>XRTMIN(4)) .AND. (PRST(:)>XRTMIN(5)) .AND. LDCOMPUTE(:) ) + WHERE ( PRIT(:)>XRTMIN(4) .AND. PRST(:)>XRTMIN(5) .AND. LDCOMPUTE(:) ) ZZW1(:) = XFIAGGS * EXP( XCOLEXIS*(PT(:)-XTT) ) & * PRIT(:) & * PRST(:) * (1+(XFVELOS/PLBDS(:))**XALPHAS)**(-XNUS+XEXIAGGS/XALPHAS) & @@ -112,10 +115,10 @@ IF (NMOM_I.EQ.1) THEN P_RI_AGGS(:) = - ZZW1(:) END WHERE ELSE - WHERE ( (PRIT(:)>XRTMIN(4)) .AND. (PRST(:)>XRTMIN(5)) .AND. LDCOMPUTE(:) ) + WHERE ( PRIT(:)>XRTMIN(4) .AND. PRST(:)>XRTMIN(5) .AND. & + PCIT(:)>XCTMIN(4) .AND. PCST(:)>XCTMIN(5) .AND. LDCOMPUTE(:) ) ZZW1(:) = (PLBDI(:) / PLBDS(:))**3 - ZZW2(:) = (PCIT(:)*(XNS*PRST(:)*PLBDS(:)**XBS)*EXP(XCOLEXIS*(PT(:)-XTT) ))*PRHODREF(:) & - / (PLBDI(:)**3) + ZZW2(:) = PCIT(:)*PCST(:)*EXP(XCOLEXIS*(PT(:)-XTT))*PRHODREF(:) / (PLBDI(:)**3) ZZW3(:) = ZZW2(:)*(XAGGS_CLARGE1+XAGGS_CLARGE2*ZZW1(:)) ! P_CI_AGGS(:) = - ZZW3(:) diff --git a/src/MNH/lima_mixed.f90 b/src/MNH/lima_mixed.f90 index 4d558eb1d..5c79c29d8 100644 --- a/src/MNH/lima_mixed.f90 +++ b/src/MNH/lima_mixed.f90 @@ -175,15 +175,30 @@ REAL, DIMENSION(SIZE(PZZ,1),SIZE(PZZ,2),SIZE(PZZ,3)) & PCCT, & ! Cloud water C. at t PCRT, & ! Rain water C. at t PCIT, & ! Ice crystal C. at t + PCST, & ! Snow/aggregates C. at t ! MTaufour + PCGT, & ! Graupel C. at t ! MTaufour + PCHT, & ! Hail C. at t ! MTaufour ! PCCS, & ! Cloud water C. source PCRS, & ! Rain water C. source - PCIS ! Ice crystal C. source -! + PCIS, & ! Ice crystal C. source + PCSS, & ! Snow/aggregates C. source ! MTaufour + PCGS, & ! Graupel C. source ! MTaufour + PCHS ! Hail C. source ! MTaufour +! +REAL, DIMENSION(:,:,:,:), ALLOCATABLE :: PNFS ! CCN C. available source + !used as Free ice nuclei for + !HOMOGENEOUS nucleation of haze +REAL, DIMENSION(:,:,:,:), ALLOCATABLE :: PNAS ! Cloud C. nuclei C. source + !used as Free ice nuclei for + !IMMERSION freezing REAL, DIMENSION(:,:,:,:), ALLOCATABLE :: PIFS ! Free ice nuclei C. source !for DEPOSITION and CONTACT REAL, DIMENSION(:,:,:,:), ALLOCATABLE :: PINS ! Activated ice nuclei C. source !for DEPOSITION and CONTACT +REAL, DIMENSION(:,:,:,:), ALLOCATABLE :: PNIS ! Activated ice nuclei C. source + !for IMMERSION +REAL, DIMENSION(:,:,:), ALLOCATABLE :: PNHS ! Hom. freezing of CCN ! ! Replace PACK LOGICAL, DIMENSION(SIZE(PRHODREF,1),SIZE(PRHODREF,2),SIZE(PRHODREF,3)) :: GMICRO @@ -202,6 +217,9 @@ REAL, DIMENSION(:), ALLOCATABLE :: ZRHT ! Hail m.r. at t REAL, DIMENSION(:), ALLOCATABLE :: ZCCT ! Cloud water conc. at t REAL, DIMENSION(:), ALLOCATABLE :: ZCRT ! Rain water conc. at t REAL, DIMENSION(:), ALLOCATABLE :: ZCIT ! Pristine ice conc. at t +REAL, DIMENSION(:), ALLOCATABLE :: ZCST ! Snow/aggregates conc. at t ! MTaufour +REAL, DIMENSION(:), ALLOCATABLE :: ZCGT ! Graupel conc. at t ! MTaufour +REAL, DIMENSION(:), ALLOCATABLE :: ZCHT ! Hail conc. at t ! MTaufour ! REAL, DIMENSION(:), ALLOCATABLE :: ZRVS ! Water vapor m.r. source REAL, DIMENSION(:), ALLOCATABLE :: ZRCS ! Cloud water m.r. source @@ -216,6 +234,9 @@ REAL, DIMENSION(:), ALLOCATABLE :: ZTHS ! Theta source REAL, DIMENSION(:), ALLOCATABLE :: ZCCS ! Cloud water conc. source REAL, DIMENSION(:), ALLOCATABLE :: ZCRS ! Rain water conc. source REAL, DIMENSION(:), ALLOCATABLE :: ZCIS ! Pristine ice conc. source +REAL, DIMENSION(:), ALLOCATABLE :: ZCSS ! Snow/aggregates conc. at t ! MTaufour +REAL, DIMENSION(:), ALLOCATABLE :: ZCGS ! Graupel conc. at t ! MTaufour +REAL, DIMENSION(:), ALLOCATABLE :: ZCHS ! Hail conc. at t ! MTaufour ! REAL, DIMENSION(:,:), ALLOCATABLE :: ZIFS ! Free Ice nuclei conc. source REAL, DIMENSION(:,:), ALLOCATABLE :: ZINS ! Nucleated Ice nuclei conc. source @@ -290,17 +311,41 @@ IF ( KRR .GE. 7 ) PRHS(:,:,:) = PRS(:,:,:,7) PCCT(:,:,:) = 0. PCRT(:,:,:) = 0. PCIT(:,:,:) = 0. +PCST(:,:,:) = 0. ! MTaufour +PCGT(:,:,:) = 0. ! MTaufour +PCHT(:,:,:) = 0. ! MTaufour PCCS(:,:,:) = 0. PCRS(:,:,:) = 0. PCIS(:,:,:) = 0. +PCSS(:,:,:) = 0. ! MTaufour +PCGS(:,:,:) = 0. ! MTaufour +PCHS(:,:,:) = 0. ! MTaufour ! IF ( LWARM ) PCCT(:,:,:) = PSVT(:,:,:,NSV_LIMA_NC) IF ( LWARM .AND. LRAIN ) PCRT(:,:,:) = PSVT(:,:,:,NSV_LIMA_NR) IF ( LCOLD ) PCIT(:,:,:) = PSVT(:,:,:,NSV_LIMA_NI) +IF ( LCOLD .AND. LSNOW ) PCST(:,:,:) = PSVT(:,:,:,NSV_LIMA_NS) ! MTaufour +IF ( LCOLD .AND. LSNOW ) PCGT(:,:,:) = PSVT(:,:,:,NSV_LIMA_NG) ! MTaufour +IF ( LCOLD .AND. LHAIL ) PCHT(:,:,:) = PSVT(:,:,:,NSV_LIMA_NH) ! MTaufour ! IF ( LWARM ) PCCS(:,:,:) = PSVS(:,:,:,NSV_LIMA_NC) IF ( LWARM .AND. LRAIN ) PCRS(:,:,:) = PSVS(:,:,:,NSV_LIMA_NR) IF ( LCOLD ) PCIS(:,:,:) = PSVS(:,:,:,NSV_LIMA_NI) +IF ( LCOLD .AND. LSNOW ) PCSS(:,:,:) = PSVS(:,:,:,NSV_LIMA_NS) ! MTaufour +IF ( LCOLD .AND. LSNOW ) PCGS(:,:,:) = PSVS(:,:,:,NSV_LIMA_NG) ! MTaufour +IF ( LCOLD .AND. LHAIL ) PCHS(:,:,:) = PSVS(:,:,:,NSV_LIMA_NH) ! MTaufour +! +IF ( NMOD_CCN .GE. 1 ) THEN + ALLOCATE( PNFS(SIZE(PRHODJ,1),SIZE(PRHODJ,2),SIZE(PRHODJ,3),NMOD_CCN) ) + ALLOCATE( PNAS(SIZE(PRHODJ,1),SIZE(PRHODJ,2),SIZE(PRHODJ,3),NMOD_CCN) ) + PNFS(:,:,:,:) = PSVS(:,:,:,NSV_LIMA_CCN_FREE:NSV_LIMA_CCN_FREE+NMOD_CCN-1) + PNAS(:,:,:,:) = PSVS(:,:,:,NSV_LIMA_CCN_ACTI:NSV_LIMA_CCN_ACTI+NMOD_CCN-1) +ELSE + ALLOCATE( PNFS(SIZE(PRHODJ,1),SIZE(PRHODJ,2),SIZE(PRHODJ,3),1) ) + ALLOCATE( PNAS(SIZE(PRHODJ,1),SIZE(PRHODJ,2),SIZE(PRHODJ,3),1) ) + PNFS(:,:,:,:) = 0. + PNAS(:,:,:,:) = 0. +END IF ! IF ( NMOD_IFN .GE. 1 ) THEN ALLOCATE( PIFS(SIZE(PRHODJ,1),SIZE(PRHODJ,2),SIZE(PRHODJ,3),NMOD_IFN) ) @@ -314,6 +359,22 @@ ELSE PINS(:,:,:,:) = 0. END IF ! +IF ( NMOD_IMM .GE. 1 ) THEN + ALLOCATE( PNIS(SIZE(PRHODJ,1),SIZE(PRHODJ,2),SIZE(PRHODJ,3),NMOD_IMM) ) + PNIS(:,:,:,:) = PSVS(:,:,:,NSV_LIMA_IMM_NUCL:NSV_LIMA_IMM_NUCL+NMOD_IMM-1) +ELSE + ALLOCATE( PNIS(SIZE(PRHODJ,1),SIZE(PRHODJ,2),SIZE(PRHODJ,3),1) ) + PNIS(:,:,:,:) = 0.0 +END IF +! +IF ( OHHONI ) THEN + ALLOCATE( PNHS(SIZE(PRHODJ,1),SIZE(PRHODJ,2),SIZE(PRHODJ,3)) ) + PNHS(:,:,:) = PSVS(:,:,:,NSV_LIMA_HOM_HAZE) +ELSE + ALLOCATE( PNHS(SIZE(PRHODJ,1),SIZE(PRHODJ,2),SIZE(PRHODJ,3)) ) + PNHS(:,:,:) = 0.0 +END IF +! !------------------------------------------------------------------------------- ! ! @@ -343,7 +404,7 @@ GMICRO(IIB:IIE,IJB:IJE,IKB:IKE) = PRCT(IIB:IIE,IJB:IJE,IKB:IKE)>XRTMIN(2) .OR. & ! IMICRO = COUNTJV( GMICRO(:,:,:),I1(:),I2(:),I3(:)) ! -IF( IMICRO >= 1 ) THEN +IF( IMICRO >= 0 ) THEN ! ALLOCATE(ZRVT(IMICRO)) ALLOCATE(ZRCT(IMICRO)) @@ -356,6 +417,9 @@ IF( IMICRO >= 1 ) THEN ALLOCATE(ZCCT(IMICRO)) ALLOCATE(ZCRT(IMICRO)) ALLOCATE(ZCIT(IMICRO)) + ALLOCATE(ZCST(IMICRO)) ! MTaufour + ALLOCATE(ZCGT(IMICRO)) ! MTaufour + ALLOCATE(ZCHT(IMICRO)) ! MTaufour ! ALLOCATE(ZRVS(IMICRO)) ALLOCATE(ZRCS(IMICRO)) @@ -369,6 +433,9 @@ IF( IMICRO >= 1 ) THEN ALLOCATE(ZCCS(IMICRO)) ALLOCATE(ZCRS(IMICRO)) ALLOCATE(ZCIS(IMICRO)) + ALLOCATE(ZCSS(IMICRO)) ! MTaufour + ALLOCATE(ZCGS(IMICRO)) ! MTaufour + ALLOCATE(ZCHS(IMICRO)) ! MTaufour ALLOCATE(ZIFS(IMICRO,NMOD_IFN)) ALLOCATE(ZINS(IMICRO,NMOD_IFN)) ! @@ -388,6 +455,9 @@ IF( IMICRO >= 1 ) THEN ZCCT(JL) = PCCT(I1(JL),I2(JL),I3(JL)) ZCRT(JL) = PCRT(I1(JL),I2(JL),I3(JL)) ZCIT(JL) = PCIT(I1(JL),I2(JL),I3(JL)) + ZCST(JL) = PCST(I1(JL),I2(JL),I3(JL)) ! MTaufour + ZCGT(JL) = PCGT(I1(JL),I2(JL),I3(JL)) ! MTaufour + ZCHT(JL) = PCHT(I1(JL),I2(JL),I3(JL)) ! MTaufour ! ZRVS(JL) = PRVS(I1(JL),I2(JL),I3(JL)) ZRCS(JL) = PRCS(I1(JL),I2(JL),I3(JL)) @@ -401,6 +471,9 @@ IF( IMICRO >= 1 ) THEN ZCCS(JL) = PCCS(I1(JL),I2(JL),I3(JL)) ZCRS(JL) = PCRS(I1(JL),I2(JL),I3(JL)) ZCIS(JL) = PCIS(I1(JL),I2(JL),I3(JL)) + ZCSS(JL) = PCSS(I1(JL),I2(JL),I3(JL)) ! MTaufour + ZCGS(JL) = PCGS(I1(JL),I2(JL),I3(JL)) ! MTaufour + ZCHS(JL) = PCHS(I1(JL),I2(JL),I3(JL)) ! MTaufour DO JMOD_IFN = 1, NMOD_IFN ZIFS(JL,JMOD_IFN) = PIFS(I1(JL),I2(JL),I3(JL),JMOD_IFN) ZINS(JL,JMOD_IFN) = PINS(I1(JL),I2(JL),I3(JL),JMOD_IFN) @@ -477,17 +550,17 @@ IF( IMICRO >= 1 ) THEN END WHERE ZLBDAS(:) = ZLBDAS(:)*XTRANS_MP_GAMMAS ELSE - WHERE (ZRST(:)>XRTMIN(5)) - ZLBDAS(:) = MAX(MIN(XLBDAS_MAX, XLBS*( ZRHODREF(:)*ZRST(:) )**XLBEXS),XLBDAS_MIN) + WHERE (ZRST(:)>XRTMIN(5) .AND. ZCST(:)>XCTMIN(5)) + ZLBDAS(:) = ( XLBS*ZCST(:) / ZRST(:) )**XLBEXS END WHERE END IF ZLBDAG(:) = 1.E10 - WHERE (ZRGT(:)>XRTMIN(6) ) - ZLBDAG(:) = XLBG*( ZRHODREF(:)*ZRGT(:) )**XLBEXG + WHERE (ZRGT(:)>XRTMIN(6) .AND. ZCGT(:)>XCTMIN(6) ) ! MTaufour + ZLBDAG(:) = ( XLBG*ZCGT(:) / ZRGT(:) )**XLBEXG ! MTaufour END WHERE ZLBDAH(:) = 1.E10 - WHERE (ZRHT(:)>XRTMIN(7) ) - ZLBDAH(:) = XLBH*( ZRHODREF(:)*ZRHT(:) )**XLBEXH + WHERE (ZRHT(:)>XRTMIN(7) .AND. ZCHT(:)>XCTMIN(7)) ! MTaufour + ZLBDAH(:) = ( XLBH*ZCHT(:) / ZRHT(:) )**XLBEXH ! MTaufour END WHERE ! !------------------------------------------------------------------------------- @@ -496,15 +569,15 @@ IF( IMICRO >= 1 ) THEN !* 2. Compute the slow processes involving cloud water and graupel ! ------------------------------------------------------------ ! - CALL LIMA_MIXED_SLOW_PROCESSES(ZRHODREF, ZZT, ZSSI, PTSTEP, & - ZLSFACT, ZLVFACT, ZAI, ZCJ, & - ZRGT, ZCIT, & - ZRVS, ZRCS, ZRIS, ZRGS, ZTHS, & - ZCCS, ZCIS, ZIFS, ZINS, & - ZLBDAI, ZLBDAG, & - ZRHODJ, GMICRO, PRHODJ, KMI, & - PTHS, PRVS, PRCS, PRIS, PRGS, & - PCCS, PCIS, PINS ) + CALL LIMA_MIXED_SLOW_PROCESSES(ZRHODREF, ZZT, ZSSI, PTSTEP, & + ZLSFACT, ZLVFACT, ZAI, ZCJ, & + ZRGT, ZRHT, ZCIT, ZCGT, ZCHT, & ! MTaufour add ZCGT, ZCHT + ZRVS, ZRCS, ZRIS, ZRGS, ZRHS, ZTHS, & ! MTaufour add ZRHS + ZCCS, ZCIS, ZCGS, ZIFS, ZINS, & ! MTaufour add ZCGS + ZLBDAI, ZLBDAG, ZLBDAH, & ! MTaufour add ZLBDAH + ZRHODJ, GMICRO, PRHODJ, KMI, & + PTHS, PRVS, PRCS, PRIS, PRGS, PRHS, & ! MTaufour add PRHS + PCCS, PCIS ) ! !------------------------------------------------------------------------------- ! @@ -513,16 +586,16 @@ IF( IMICRO >= 1 ) THEN ! ------------------------------------ ! IF (LSNOW) THEN - CALL LIMA_MIXED_FAST_PROCESSES(ZRHODREF, ZZT, ZPRES, PTSTEP, & - ZLSFACT, ZLVFACT, ZKA, ZDV, ZCJ, & - ZRVT, ZRCT, ZRRT, ZRIT, ZRST, ZRGT, & - ZRHT, ZCCT, ZCRT, ZCIT, & - ZRCS, ZRRS, ZRIS, ZRSS, ZRGS, ZRHS, & - ZTHS, ZCCS, ZCRS, ZCIS, & - ZLBDAC, ZLBDAR, ZLBDAS, ZLBDAG, ZLBDAH, & - ZRHODJ, GMICRO, PRHODJ, KMI, PTHS, & - PRCS, PRRS, PRIS, PRSS, PRGS, PRHS, & - PCCS, PCRS, PCIS ) +! CALL LIMA_MIXED_FAST_PROCESSES(ZRHODREF, ZZT, ZPRES, PTSTEP, & +! ZLSFACT, ZLVFACT, ZKA, ZDV, ZCJ, & +! ZRVT, ZRCT, ZRRT, ZRIT, ZRST, ZRGT, & +! ZRHT, ZCCT, ZCRT, ZCIT, ZCST, ZCGT, ZCHT, & ! MTaufour add ZCST, ZCGT, ZCHT +! ZRCS, ZRRS, ZRIS, ZRSS, ZRGS, ZRHS, & +! ZTHS, ZCCS, ZCRS, ZCIS, ZCSS, ZCGS, ZCHS, & ! MTaufour add ZCSS, ZCGS, ZCHS +! ZLBDAC, ZLBDAR, ZLBDAI, ZLBDAS, ZLBDAG, ZLBDAH, & ! MTaufour add ZLBDAI +! ZRHODJ, GMICRO, PRHODJ, KMI, PTHS, & +! PRCS, PRRS, PRIS, PRSS, PRGS, PRHS, & +! PCCS, PCRS, PCIS, PCSS, PCGS, PCHS ) ! MTaufour add PCSS, PCGS, PCHS END IF ! !------------------------------------------------------------------------------- @@ -557,6 +630,12 @@ END IF PCRS(:,:,:) = UNPACK( ZCRS(:),MASK=GMICRO(:,:,:),FIELD=ZW(:,:,:) ) ZW(:,:,:) = PCIS(:,:,:) PCIS(:,:,:) = UNPACK( ZCIS(:),MASK=GMICRO(:,:,:),FIELD=ZW(:,:,:) ) + ZW(:,:,:) = PCSS(:,:,:) ! MTaufour + PCSS(:,:,:) = UNPACK( ZCSS(:),MASK=GMICRO(:,:,:),FIELD=ZW(:,:,:) ) ! MTaufour + ZW(:,:,:) = PCGS(:,:,:) ! MTaufour + PCGS(:,:,:) = UNPACK( ZCGS(:),MASK=GMICRO(:,:,:),FIELD=ZW(:,:,:) ) ! MTaufour + ZW(:,:,:) = PCHS(:,:,:) ! MTaufour + PCHS(:,:,:) = UNPACK( ZCHS(:),MASK=GMICRO(:,:,:),FIELD=ZW(:,:,:) ) ! MTaufour ! DO JMOD_IFN = 1, NMOD_IFN ZW(:,:,:) = PIFS(:,:,:,JMOD_IFN) @@ -578,6 +657,9 @@ END IF DEALLOCATE(ZCCT) DEALLOCATE(ZCRT) DEALLOCATE(ZCIT) + DEALLOCATE(ZCST) ! MTaufour + DEALLOCATE(ZCGT) ! MTaufour + DEALLOCATE(ZCHT) ! MTaufour ! DEALLOCATE(ZRVS) DEALLOCATE(ZRCS) @@ -591,6 +673,9 @@ END IF DEALLOCATE(ZCCS) DEALLOCATE(ZCRS) DEALLOCATE(ZCIS) + DEALLOCATE(ZCSS) ! MTaufour + DEALLOCATE(ZCGS) ! MTaufour + DEALLOCATE(ZCHS) ! MTaufour DEALLOCATE(ZIFS) DEALLOCATE(ZINS) ! @@ -637,16 +722,32 @@ IF ( KRR .GE. 7 ) PRS(:,:,:,7) = PRHS(:,:,:) ! PSVS(:,:,:,NSV_LIMA_NC) = PCCS(:,:,:) IF ( LRAIN ) PSVS(:,:,:,NSV_LIMA_NR) = PCRS(:,:,:) +IF ( LSNOW ) PSVS(:,:,:,NSV_LIMA_NS) = PCSS(:,:,:) ! MTaufour +IF ( LSNOW ) PSVS(:,:,:,NSV_LIMA_NG) = PCGS(:,:,:) ! MTaufour +IF ( LHAIL ) PSVS(:,:,:,NSV_LIMA_NH) = PCHS(:,:,:) ! MTaufour PSVS(:,:,:,NSV_LIMA_NI) = PCIS(:,:,:) ! +IF ( NMOD_CCN .GE. 1 ) THEN + PSVS(:,:,:,NSV_LIMA_CCN_FREE:NSV_LIMA_CCN_FREE+NMOD_CCN-1) = PNFS(:,:,:,:) + PSVS(:,:,:,NSV_LIMA_CCN_ACTI:NSV_LIMA_CCN_ACTI+NMOD_CCN-1) = PNAS(:,:,:,:) +END IF +! IF ( NMOD_IFN .GE. 1 ) THEN PSVS(:,:,:,NSV_LIMA_IFN_FREE:NSV_LIMA_IFN_FREE+NMOD_IFN-1) = PIFS(:,:,:,:) PSVS(:,:,:,NSV_LIMA_IFN_NUCL:NSV_LIMA_IFN_NUCL+NMOD_IFN-1) = PINS(:,:,:,:) END IF ! +IF ( NMOD_IMM .GE. 1 ) THEN + PSVS(:,:,:,NSV_LIMA_IMM_NUCL:NSV_LIMA_IMM_NUCL+NMOD_IMM-1) = PNIS(:,:,:,:) +END IF +! !++cb++ +IF (ALLOCATED(PNFS)) DEALLOCATE(PNFS) +IF (ALLOCATED(PNAS)) DEALLOCATE(PNAS) IF (ALLOCATED(PIFS)) DEALLOCATE(PIFS) IF (ALLOCATED(PINS)) DEALLOCATE(PINS) +IF (ALLOCATED(PNIS)) DEALLOCATE(PNIS) +IF (ALLOCATED(PNHS)) DEALLOCATE(PNHS) !--cb-- ! !------------------------------------------------------------------------------- diff --git a/src/MNH/lima_mixed_slow_processes.f90 b/src/MNH/lima_mixed_slow_processes.f90 index 6ef9b55f5..097d575ac 100644 --- a/src/MNH/lima_mixed_slow_processes.f90 +++ b/src/MNH/lima_mixed_slow_processes.f90 @@ -8,15 +8,15 @@ ! ##################################### ! INTERFACE - SUBROUTINE LIMA_MIXED_SLOW_PROCESSES(ZRHODREF, ZZT, ZSSI, PTSTEP, & - ZLSFACT, ZLVFACT, ZAI, ZCJ, & - ZRGT, ZCIT, & - ZRVS, ZRCS, ZRIS, ZRGS, ZTHS, & - ZCCS, ZCIS, ZIFS, ZINS, & - ZLBDAI, ZLBDAG, & - PRHODJ1D, GMICRO, PRHODJ, KMI,& - PTHS, PRVS, PRCS, PRIS, PRGS, & - PCCS, PCIS, PINS ) + SUBROUTINE LIMA_MIXED_SLOW_PROCESSES(ZRHODREF, ZZT, ZSSI, PTSTEP, & + ZLSFACT, ZLVFACT, ZAI, ZCJ, & + ZRGT, ZRHT, ZCIT, ZCGT, ZCHT, & + ZRVS, ZRCS, ZRIS, ZRGS, ZRHS, ZTHS, & + ZCCS, ZCIS, ZCGS, ZIFS, ZINS, & + ZLBDAI, ZLBDAG, ZLBDAH, & + PRHODJ1D, GMICRO, PRHODJ, KMI, & + PTHS, PRVS, PRCS, PRIS, PRGS, PRHS, & + PCCS, PCIS ) ! REAL, DIMENSION(:), INTENT(IN) :: ZRHODREF ! RHO Dry REFerence REAL, DIMENSION(:), INTENT(IN) :: ZZT ! Temperature @@ -29,21 +29,27 @@ REAL, DIMENSION(:), INTENT(IN) :: ZAI ! Thermodynamical function REAL, DIMENSION(:), INTENT(IN) :: ZCJ ! for the ventilation coefficient ! REAL, DIMENSION(:), INTENT(IN) :: ZRGT ! Graupel/hail m.r. at t +REAL, DIMENSION(:), INTENT(IN) :: ZRHT ! Hail m.r. at t REAL, DIMENSION(:), INTENT(IN) :: ZCIT ! Pristine ice conc. at t +REAL, DIMENSION(:), INTENT(IN) :: ZCGT ! Graupel conc. at t +REAL, DIMENSION(:), INTENT(IN) :: ZCHT ! Hail conc. at t ! REAL, DIMENSION(:), INTENT(INOUT) :: ZRVS ! Water vapor m.r. source REAL, DIMENSION(:), INTENT(INOUT) :: ZRCS ! Cloud water m.r. source REAL, DIMENSION(:), INTENT(INOUT) :: ZRIS ! Pristine ice m.r. source REAL, DIMENSION(:), INTENT(INOUT) :: ZRGS ! Graupel/hail m.r. source +REAL, DIMENSION(:), INTENT(INOUT) :: ZRHS ! Graupel/hail m.r. source REAL, DIMENSION(:), INTENT(INOUT) :: ZTHS ! Theta source ! REAL, DIMENSION(:), INTENT(INOUT) :: ZCCS ! Cloud water conc. source REAL, DIMENSION(:), INTENT(INOUT) :: ZCIS ! Pristine ice conc. source +REAL, DIMENSION(:), INTENT(INOUT) :: ZCGS ! Graupel conc. source REAL, DIMENSION(:,:), INTENT(INOUT) :: ZIFS ! Free Ice nuclei conc. source REAL, DIMENSION(:,:), INTENT(INOUT) :: ZINS ! Nucleated Ice nuclei conc. source ! REAL, DIMENSION(:), INTENT(IN) :: ZLBDAI ! Slope parameter of the ice crystal distr. REAL, DIMENSION(:), INTENT(IN) :: ZLBDAG ! Slope parameter of the graupel distr. +REAL, DIMENSION(:), INTENT(IN) :: ZLBDAH ! Slope parameter of the hail distr. ! ! used for budget storage REAL, DIMENSION(:), INTENT(IN) :: PRHODJ1D @@ -55,24 +61,24 @@ REAL, DIMENSION(:,:,:), INTENT(IN) :: PRVS REAL, DIMENSION(:,:,:), INTENT(IN) :: PRCS REAL, DIMENSION(:,:,:), INTENT(IN) :: PRIS REAL, DIMENSION(:,:,:), INTENT(IN) :: PRGS +REAL, DIMENSION(:,:,:), INTENT(IN) :: PRHS REAL, DIMENSION(:,:,:), INTENT(IN) :: PCCS REAL, DIMENSION(:,:,:), INTENT(IN) :: PCIS -REAL, DIMENSION(:,:,:,:), INTENT(IN) :: PINS ! END SUBROUTINE LIMA_MIXED_SLOW_PROCESSES END INTERFACE END MODULE MODI_LIMA_MIXED_SLOW_PROCESSES ! ! ####################################################################### - SUBROUTINE LIMA_MIXED_SLOW_PROCESSES(ZRHODREF, ZZT, ZSSI, PTSTEP, & - ZLSFACT, ZLVFACT, ZAI, ZCJ, & - ZRGT, ZCIT, & - ZRVS, ZRCS, ZRIS, ZRGS, ZTHS, & - ZCCS, ZCIS, ZIFS, ZINS, & - ZLBDAI, ZLBDAG, & - PRHODJ1D, GMICRO, PRHODJ, KMI,& - PTHS, PRVS, PRCS, PRIS, PRGS, & - PCCS, PCIS, PINS ) + SUBROUTINE LIMA_MIXED_SLOW_PROCESSES(ZRHODREF, ZZT, ZSSI, PTSTEP, & + ZLSFACT, ZLVFACT, ZAI, ZCJ, & + ZRGT, ZRHT, ZCIT, ZCGT, ZCHT, & + ZRVS, ZRCS, ZRIS, ZRGS, ZRHS, ZTHS, & + ZCCS, ZCIS, ZCGS, ZIFS, ZINS, & + ZLBDAI, ZLBDAG, ZLBDAH, & + PRHODJ1D, GMICRO, PRHODJ, KMI, & + PTHS, PRVS, PRCS, PRIS, PRGS, PRHS, & + PCCS, PCIS ) ! ####################################################################### ! !! @@ -119,16 +125,17 @@ END MODULE MODI_LIMA_MIXED_SLOW_PROCESSES ! ------------ ! use modd_budget, only: lbu_enable, nbumod, & - lbudget_th, lbudget_rv, lbudget_rc, lbudget_rc, lbudget_ri, lbudget_rg, lbudget_sv, & - NBUDGET_TH, NBUDGET_RV, NBUDGET_RC, NBUDGET_RC, NBUDGET_RI, NBUDGET_RG, NBUDGET_SV1, & + lbudget_th, lbudget_rv, lbudget_rc, lbudget_rc, lbudget_ri, lbudget_rg, lbudget_rh, lbudget_sv, & + NBUDGET_TH, NBUDGET_RV, NBUDGET_RC, NBUDGET_RC, NBUDGET_RI, NBUDGET_RG, NBUDGET_RH, NBUDGET_SV1, & tbudgets USE MODD_CST, ONLY : XTT, XALPI, XBETAI, XGAMI, & XALPW, XBETAW, XGAMW USE MODD_NSV -USE MODD_PARAM_LIMA, ONLY : XRTMIN, XCTMIN, NMOD_IFN, LSNOW +USE MODD_PARAM_LIMA, ONLY : XRTMIN, XCTMIN, NMOD_IFN, LSNOW, LHAIL, NMOM_S, NMOM_G, NMOM_H USE MODD_PARAM_LIMA_COLD, ONLY : XDI, X0DEPI, X2DEPI, XSCFAC -USE MODD_PARAM_LIMA_MIXED, ONLY : XLBG, XLBEXG, XLBDAG_MAX, & - X0DEPG, XEX0DEPG, X1DEPG, XEX1DEPG +USE MODD_PARAM_LIMA_MIXED, ONLY : XLBG, XLBEXG, XLBDAG_MAX, XCCG, XCXG, & + X0DEPG, XEX0DEPG, X1DEPG, XEX1DEPG, & + X0DEPH, XEX0DEPH, X1DEPH, XEX1DEPH use mode_budget, only: Budget_store_add, Budget_store_init, Budget_store_end IMPLICIT NONE @@ -146,21 +153,27 @@ REAL, DIMENSION(:), INTENT(IN) :: ZAI ! Thermodynamical function REAL, DIMENSION(:), INTENT(IN) :: ZCJ ! for the ventilation coefficient ! REAL, DIMENSION(:), INTENT(IN) :: ZRGT ! Graupel/hail m.r. at t +REAL, DIMENSION(:), INTENT(IN) :: ZRHT ! Hail m.r. at t REAL, DIMENSION(:), INTENT(IN) :: ZCIT ! Pristine ice conc. at t +REAL, DIMENSION(:), INTENT(IN) :: ZCGT ! Graupel conc. at t +REAL, DIMENSION(:), INTENT(IN) :: ZCHT ! hail conc. at t ! REAL, DIMENSION(:), INTENT(INOUT) :: ZRVS ! Water vapor m.r. source REAL, DIMENSION(:), INTENT(INOUT) :: ZRCS ! Cloud water m.r. source REAL, DIMENSION(:), INTENT(INOUT) :: ZRIS ! Pristine ice m.r. source REAL, DIMENSION(:), INTENT(INOUT) :: ZRGS ! Graupel/hail m.r. source +REAL, DIMENSION(:), INTENT(INOUT) :: ZRHS ! hail m.r. source REAL, DIMENSION(:), INTENT(INOUT) :: ZTHS ! Theta source ! REAL, DIMENSION(:), INTENT(INOUT) :: ZCCS ! Cloud water conc. source REAL, DIMENSION(:), INTENT(INOUT) :: ZCIS ! Pristine ice conc. source +REAL, DIMENSION(:), INTENT(INOUT) :: ZCGS ! Graupel conc. source REAL, DIMENSION(:,:), INTENT(INOUT) :: ZIFS ! Free Ice nuclei conc. source REAL, DIMENSION(:,:), INTENT(INOUT) :: ZINS ! Nucleated Ice nuclei conc. source ! REAL, DIMENSION(:), INTENT(IN) :: ZLBDAI ! Slope parameter of the ice crystal distr. REAL, DIMENSION(:), INTENT(IN) :: ZLBDAG ! Slope parameter of the graupel distr. +REAL, DIMENSION(:), INTENT(IN) :: ZLBDAH ! Slope parameter of the hail distr. ! ! used for budget storage REAL, DIMENSION(:), INTENT(IN) :: PRHODJ1D @@ -172,9 +185,9 @@ REAL, DIMENSION(:,:,:), INTENT(IN) :: PRVS REAL, DIMENSION(:,:,:), INTENT(IN) :: PRCS REAL, DIMENSION(:,:,:), INTENT(IN) :: PRIS REAL, DIMENSION(:,:,:), INTENT(IN) :: PRGS +REAL, DIMENSION(:,:,:), INTENT(IN) :: PRHS REAL, DIMENSION(:,:,:), INTENT(IN) :: PCCS REAL, DIMENSION(:,:,:), INTENT(IN) :: PCIS -REAL, DIMENSION(:,:,:,:), INTENT(IN) :: PINS ! !* 0.2 Declarations of local variables : ! @@ -190,15 +203,27 @@ INTEGER :: JMOD_IFN ! IF (LSNOW) THEN ZZW(:) = 0.0 - WHERE ( (ZRGT(:)>XRTMIN(6)) .AND. (ZRGS(:)>XRTMIN(6)/PTSTEP) ) - ZZW(:) = ( ZSSI(:)/ZAI(:)/ZRHODREF(:) ) * & - ( X0DEPG*ZLBDAG(:)**XEX0DEPG + X1DEPG*ZCJ(:)*ZLBDAG(:)**XEX1DEPG ) - ZZW(:) = MIN( ZRVS(:),ZZW(:) )*(0.5+SIGN(0.5,ZZW(:))) & - - MIN( ZRGS(:),ABS(ZZW(:)) )*(0.5-SIGN(0.5,ZZW(:))) - ZRGS(:) = ZRGS(:) + ZZW(:) - ZRVS(:) = ZRVS(:) - ZZW(:) - ZTHS(:) = ZTHS(:) + ZZW(:)*ZLSFACT(:) - END WHERE + if (NMOM_G.GE.2) then + WHERE ( (ZRGT(:)>XRTMIN(6)) .AND. (ZRGS(:)>XRTMIN(6)/PTSTEP) ) + ZZW(:) = ( ZSSI(:)/ZAI(:)/ZRHODREF(:) ) * ZCGT(:) * & + ( X0DEPG*ZLBDAG(:)**XEX0DEPG + X1DEPG*ZCJ(:)*ZLBDAG(:)**XEX1DEPG ) + ZZW(:) = MIN( ZRVS(:),ZZW(:) )*(0.5+SIGN(0.5,ZZW(:))) & + - MIN( ZRGS(:),ABS(ZZW(:)) )*(0.5-SIGN(0.5,ZZW(:))) + ZRGS(:) = ZRGS(:) + ZZW(:) + ZRVS(:) = ZRVS(:) - ZZW(:) + ZTHS(:) = ZTHS(:) + ZZW(:)*ZLSFACT(:) + END WHERE + else + WHERE ( (ZRGT(:)>XRTMIN(6)) .AND. (ZRGS(:)>XRTMIN(6)/PTSTEP) ) + ZZW(:) = ( ZSSI(:)/ZAI(:)/ZRHODREF(:) ) * XCCG * & + ( X0DEPG*ZLBDAG(:)**(XCXG+XEX0DEPG) + X1DEPG*ZCJ(:)*ZLBDAG(:)**(XCXG+XEX1DEPG) ) + ZZW(:) = MIN( ZRVS(:),ZZW(:) )*(0.5+SIGN(0.5,ZZW(:))) & + - MIN( ZRGS(:),ABS(ZZW(:)) )*(0.5-SIGN(0.5,ZZW(:))) + ZRGS(:) = ZRGS(:) + ZZW(:) + ZRVS(:) = ZRVS(:) - ZZW(:) + ZTHS(:) = ZTHS(:) + ZZW(:)*ZLSFACT(:) + END WHERE + end if ! ! Budget storage if ( nbumod == kmi .and. lbu_enable ) then @@ -211,6 +236,34 @@ IF (LSNOW) THEN end if END IF ! +! +!* 1.0 Deposition of water vapor on r_h: RVDEPH +! --------------------------------------------- +! +! +IF (LHAIL .AND. NMOM_H.GE.2) THEN + ZZW(:) = 0.0 + WHERE ( (ZRHT(:)>XRTMIN(7)) .AND. (ZRHS(:)>XRTMIN(7)/PTSTEP) ) + ZZW(:) = ( ZSSI(:)/(ZAI(:)) ) * ZCHT(:) * & + ( X0DEPH*ZLBDAH(:)**XEX0DEPH + X1DEPH*ZCJ(:)*ZLBDAH(:)**XEX1DEPH ) + ZZW(:) = MIN( ZRVS(:),ZZW(:) )*(0.5+SIGN(0.5,ZZW(:))) & + - MIN( ZRHS(:),ABS(ZZW(:)) )*(0.5-SIGN(0.5,ZZW(:))) + ZRHS(:) = ZRHS(:) + ZZW(:) + ZRVS(:) = ZRVS(:) - ZZW(:) + ZTHS(:) = ZTHS(:) + ZZW(:)*ZLSFACT(:) + END WHERE +! +! Budget storage + if ( nbumod == kmi .and. lbu_enable ) then + if ( lbudget_th ) call Budget_store_add( tbudgets(NBUDGET_TH), 'DEPH', & + Unpack( zzw(:) * zlsfact(:) * prhodj1d(:), mask = gmicro(:, :, :), field = 0. ) ) + if ( lbudget_rv ) call Budget_store_add( tbudgets(NBUDGET_RV), 'DEPH', & + Unpack( -zzw(:) * prhodj1d(:), mask = gmicro(:, :, :), field = 0. ) ) + if ( lbudget_rh ) call Budget_store_add( tbudgets(NBUDGET_RH), 'DEPH', & + Unpack( zzw(:) * prhodj1d(:), mask = gmicro(:, :, :), field = 0. ) ) + end if +END IF +! ! !* 2 cloud ice Melting: RIMLTC and CIMLTC ! ----------------------------------------- @@ -223,10 +276,10 @@ END IF if ( lbudget_sv ) then call Budget_store_init( tbudgets(NBUDGET_SV1 - 1 + nsv_lima_nc), 'IMLT', pccs(:, :, :) * prhodj(:, :, :) ) call Budget_store_init( tbudgets(NBUDGET_SV1 - 1 + nsv_lima_ni), 'IMLT', pcis(:, :, :) * prhodj(:, :, :) ) - do jmod_ifn = 1,nmod_ifn - call Budget_store_init( tbudgets(NBUDGET_SV1 - 1 + nsv_lima_ifn_nucl + jmod_ifn - 1), 'IMLT', & - pins(:, :, :, jmod_ifn) * prhodj(:, :, :) ) - enddo +! do jmod_ifn = 1,nmod_ifn +! call Budget_store_init( tbudgets(NBUDGET_SV1 - 1 + nsv_lima_ifn_nucl + jmod_ifn - 1), 'IMLT', & +! pins(:, :, :, jmod_ifn) * prhodj(:, :, :) ) +! enddo end if end if @@ -243,7 +296,7 @@ END IF DO JMOD_IFN = 1,NMOD_IFN ! Correction BVIE aerosols not released but in droplets ! ZIFS(:,JMOD_IFN) = ZIFS(:,JMOD_IFN) + ZINS(:,JMOD_IFN)*(1.-ZMASK(:)) - ZINS(:,JMOD_IFN) = ZINS(:,JMOD_IFN) * ZMASK(:) +! ZINS(:,JMOD_IFN) = ZINS(:,JMOD_IFN) * ZMASK(:) ENDDO ! ! Budget storage @@ -259,10 +312,10 @@ END IF Unpack( zccs(:), mask = gmicro(:, :, :), field = pccs(:, :, :) ) * prhodj(:, :, :) ) call Budget_store_end( tbudgets(NBUDGET_SV1 - 1 + nsv_lima_ni), 'IMLT', & Unpack( zcis(:), mask = gmicro(:, :, :), field = pcis(:, :, :) ) * prhodj(:, :, :) ) - do jmod_ifn = 1,nmod_ifn - call Budget_store_end( tbudgets(NBUDGET_SV1 - 1 + nsv_lima_ifn_nucl + jmod_ifn - 1), 'IMLT', & - Unpack( zins(:, jmod_ifn), mask = gmicro(:, :, :), field = pins(:, :, :, jmod_ifn) ) * prhodj(:, :, :) ) - enddo +! do jmod_ifn = 1,nmod_ifn +! call Budget_store_end( tbudgets(NBUDGET_SV1 - 1 + nsv_lima_ifn_nucl + jmod_ifn - 1), 'IMLT', & +! Unpack( zins(:, jmod_ifn), mask = gmicro(:, :, :), field = pins(:, :, :, jmod_ifn) ) * prhodj(:, :, :) ) +! enddo end if end if ! diff --git a/src/MNH/lima_rain_accr_snow.f90 b/src/MNH/lima_rain_accr_snow.f90 index 5ece49ac9..8973de927 100644 --- a/src/MNH/lima_rain_accr_snow.f90 +++ b/src/MNH/lima_rain_accr_snow.f90 @@ -8,10 +8,10 @@ ! ################################# ! INTERFACE - SUBROUTINE LIMA_RAIN_ACCR_SNOW (PTSTEP, LDCOMPUTE, & - PRHODREF, PT, & - PRRT, PCRT, PRST, PLBDR, PLBDS, PLVFACT, PLSFACT, & - P_TH_ACC, P_RR_ACC, P_CR_ACC, P_RS_ACC, P_RG_ACC ) + SUBROUTINE LIMA_RAIN_ACCR_SNOW (PTSTEP, LDCOMPUTE, & + PRHODREF, PT, & + PRRT, PCRT, PRST, PCST, PLBDR, PLBDS, PLVFACT, PLSFACT, & + P_TH_ACC, P_RR_ACC, P_CR_ACC, P_RS_ACC, P_CS_ACC, P_RG_ACC ) ! REAL, INTENT(IN) :: PTSTEP LOGICAL, DIMENSION(:),INTENT(IN) :: LDCOMPUTE @@ -19,9 +19,10 @@ LOGICAL, DIMENSION(:),INTENT(IN) :: LDCOMPUTE REAL, DIMENSION(:), INTENT(IN) :: PRHODREF ! REAL, DIMENSION(:), INTENT(IN) :: PT ! ! -REAL, DIMENSION(:), INTENT(IN) :: PRRT ! Cloud water C. at t -REAL, DIMENSION(:), INTENT(IN) :: PCRT ! Cloud water C. at t -REAL, DIMENSION(:), INTENT(IN) :: PRST ! Cloud water C. at t +REAL, DIMENSION(:), INTENT(IN) :: PRRT ! Rain mr at t +REAL, DIMENSION(:), INTENT(IN) :: PCRT ! Rain C. at t +REAL, DIMENSION(:), INTENT(IN) :: PRST ! Snow mr at t +REAL, DIMENSION(:), INTENT(IN) :: PCST ! Snow C. at t REAL, DIMENSION(:), INTENT(IN) :: PLBDR ! REAL, DIMENSION(:), INTENT(IN) :: PLBDS ! REAL, DIMENSION(:), INTENT(IN) :: PLVFACT ! @@ -31,6 +32,7 @@ REAL, DIMENSION(:), INTENT(OUT) :: P_TH_ACC REAL, DIMENSION(:), INTENT(OUT) :: P_RR_ACC REAL, DIMENSION(:), INTENT(OUT) :: P_CR_ACC REAL, DIMENSION(:), INTENT(OUT) :: P_RS_ACC +REAL, DIMENSION(:), INTENT(OUT) :: P_CS_ACC REAL, DIMENSION(:), INTENT(OUT) :: P_RG_ACC ! END SUBROUTINE LIMA_RAIN_ACCR_SNOW @@ -38,10 +40,10 @@ END INTERFACE END MODULE MODI_LIMA_RAIN_ACCR_SNOW ! ! ################################################################################### - SUBROUTINE LIMA_RAIN_ACCR_SNOW (PTSTEP, LDCOMPUTE, & - PRHODREF, PT, & - PRRT, PCRT, PRST, PLBDR, PLBDS, PLVFACT, PLSFACT, & - P_TH_ACC, P_RR_ACC, P_CR_ACC, P_RS_ACC, P_RG_ACC ) + SUBROUTINE LIMA_RAIN_ACCR_SNOW (PTSTEP, LDCOMPUTE, & + PRHODREF, PT, & + PRRT, PCRT, PRST, PCST, PLBDR, PLBDS, PLVFACT, PLSFACT, & + P_TH_ACC, P_RR_ACC, P_CR_ACC, P_RS_ACC, P_CS_ACC, P_RG_ACC ) ! ################################################################################### ! !! PURPOSE @@ -71,11 +73,14 @@ USE MODD_CST, ONLY : XTT USE MODD_PARAM_LIMA, ONLY : XRTMIN, XCEXVT USE MODD_PARAM_LIMA_WARM, ONLY : XBR USE MODD_PARAM_LIMA_COLD, ONLY : XBS, XTRANS_MP_GAMMAS -USE MODD_PARAM_LIMA_MIXED, ONLY : NACCLBDAS, XACCINTP1S, XACCINTP2S, & - NACCLBDAR, XACCINTP1R, XACCINTP2R, & - XKER_RACCSS, XKER_RACCS, XKER_SACCRG, & - XFRACCSS, XLBRACCS1, XLBRACCS2, XLBRACCS3, & - XFSACCRG, XLBSACCR1, XLBSACCR2, XLBSACCR3 +USE MODD_PARAM_LIMA_MIXED, ONLY : NACCLBDAS, XACCINTP1S, XACCINTP2S, & + NACCLBDAR, XACCINTP1R, XACCINTP2R, & + XKER_RACCSS, XKER_RACCS, XKER_SACCRG, & + XKER_N_RACCSS, XKER_N_RACCS, XKER_N_SACCRG, & + XFRACCSS, XLBRACCS1, XLBRACCS2, XLBRACCS3, & + XFNRACCSS, XLBNRACCS1, XLBNRACCS2, XLBNRACCS3, & + XFSACCRG, XLBSACCR1, XLBSACCR2, XLBSACCR3, & + XFNSACCRG, XLBNSACCR1, XLBNSACCR2, XLBNSACCR3 ! IMPLICIT NONE ! @@ -87,9 +92,10 @@ LOGICAL, DIMENSION(:),INTENT(IN) :: LDCOMPUTE REAL, DIMENSION(:), INTENT(IN) :: PRHODREF ! REAL, DIMENSION(:), INTENT(IN) :: PT ! ! -REAL, DIMENSION(:), INTENT(IN) :: PRRT ! Cloud water C. at t -REAL, DIMENSION(:), INTENT(IN) :: PCRT ! Cloud water C. at t -REAL, DIMENSION(:), INTENT(IN) :: PRST ! Cloud water C. at t +REAL, DIMENSION(:), INTENT(IN) :: PRRT ! Rain mr at t +REAL, DIMENSION(:), INTENT(IN) :: PCRT ! Rain C. at t +REAL, DIMENSION(:), INTENT(IN) :: PRST ! Snow mr at t +REAL, DIMENSION(:), INTENT(IN) :: PCST ! Snow C. at t REAL, DIMENSION(:), INTENT(IN) :: PLBDR ! REAL, DIMENSION(:), INTENT(IN) :: PLBDS ! REAL, DIMENSION(:), INTENT(IN) :: PLVFACT ! @@ -99,6 +105,7 @@ REAL, DIMENSION(:), INTENT(OUT) :: P_TH_ACC REAL, DIMENSION(:), INTENT(OUT) :: P_RR_ACC REAL, DIMENSION(:), INTENT(OUT) :: P_CR_ACC REAL, DIMENSION(:), INTENT(OUT) :: P_RS_ACC +REAL, DIMENSION(:), INTENT(OUT) :: P_CS_ACC REAL, DIMENSION(:), INTENT(OUT) :: P_RG_ACC ! !* 0.2 Declarations of local variables : @@ -107,6 +114,7 @@ LOGICAL, DIMENSION(SIZE(PRRT)) :: GACC ! REAL, DIMENSION(SIZE(PRRT)) :: Z1, Z2, Z3, Z4 REAL, DIMENSION(SIZE(PRRT)) :: ZZW1, ZZW2, ZZW3, ZZW4, ZZW5 +REAL, DIMENSION(SIZE(PRRT)) :: ZZWC1, ZZWC2, ZZWC3, ZZWC4, ZZWC5 ! INTEGER, DIMENSION(SIZE(PRRT)) :: IVEC1,IVEC2 ! Vectors of indices REAL, DIMENSION(SIZE(PRRT)) :: ZVEC1,ZVEC2,ZVEC3 ! Work vectors @@ -162,7 +170,7 @@ WHERE( GACC ) ! ! 1.3.3 perform the bilinear interpolation of the normalized ! RACCSS-kernel : for small rain drops transformed into snow - ! +! Z1(:) = GET_XKER_RACCSS(IVEC1(:)+1,IVEC2(:)+1) Z2(:) = GET_XKER_RACCSS(IVEC1(:)+1,IVEC2(:) ) Z3(:) = GET_XKER_RACCSS(IVEC1(:) ,IVEC2(:)+1) @@ -175,7 +183,22 @@ WHERE( GACC ) * (ZVEC1(:) - 1.0) ZZW1(:) = ZVEC3(:) ! -! 1.3.4b perform the bilinear interpolation of the normalized +! 1.3.3b perform the bilinear interpolation of the normalized +! RACCSS-kernel for concentration : for small rain drops transformed into snow +! + Z1(:) = GET_XKER_N_RACCSS(IVEC1(:)+1,IVEC2(:)+1) + Z2(:) = GET_XKER_N_RACCSS(IVEC1(:)+1,IVEC2(:) ) + Z3(:) = GET_XKER_N_RACCSS(IVEC1(:) ,IVEC2(:)+1) + Z4(:) = GET_XKER_N_RACCSS(IVEC1(:) ,IVEC2(:) ) + ZVEC3(:) = ( Z1(:)* ZVEC2(:) & + - Z2(:)*(ZVEC2(:) - 1.0) ) & + * ZVEC1(:) & + - ( Z3(:)* ZVEC2(:) & + - Z4(:)*(ZVEC2(:) - 1.0) ) & + * (ZVEC1(:) - 1.0) + ZZWC1(:) = ZVEC3(:) +! +! 1.3.4 perform the bilinear interpolation of the normalized ! RACCS-kernel : total frozen rain drops ! Z1(:) = GET_XKER_RACCS(IVEC1(:)+1,IVEC2(:)+1) @@ -190,10 +213,26 @@ WHERE( GACC ) * (ZVEC1(:) - 1.0) ZZW2(:) = ZVEC3(:) ! +! 1.3.4b perform the bilinear interpolation of the normalized +! RACCS-kernel for concentration : total frozen rain drops +! + Z1(:) = GET_XKER_N_RACCS(IVEC1(:)+1,IVEC2(:)+1) + Z2(:) = GET_XKER_N_RACCS(IVEC1(:)+1,IVEC2(:) ) + Z3(:) = GET_XKER_N_RACCS(IVEC1(:) ,IVEC2(:)+1) + Z4(:) = GET_XKER_N_RACCS(IVEC1(:) ,IVEC2(:) ) + ZVEC3(:) = ( Z1(:)* ZVEC2(:) & + - Z2(:)*(ZVEC2(:) - 1.0) ) & + * ZVEC1(:) & + - ( Z3(:)* ZVEC2(:) & + - Z4(:)*(ZVEC2(:) - 1.0) ) & + * (ZVEC1(:) - 1.0) + ZZWC2(:) = ZVEC3(:) +! ! Correction of ZZW1 to ensure that ZZW1 <= ZZW2 ! ie coll. of small drops <= coll. of all drops ! ZZW1(:) = MIN(ZZW1(:),ZZW2(:)) + ZZWC1(:)= MIN(ZZWC1(:),ZZWC2(:)) ! ! 1.3.5 perform the bilinear interpolation of the normalized ! SACCRG-kernel : snow transformed into graupel @@ -210,27 +249,55 @@ WHERE( GACC ) * (ZVEC2(:) - 1.0) ZZW3(:) = ZVEC3(:) ! +! 1.3.5b perform the bilinear interpolation of the normalized +! SACCRG-kernel for concentration : snow transformed into graupel +! + Z1(:) = GET_XKER_N_SACCRG(IVEC2(:)+1,IVEC1(:)+1) + Z2(:) = GET_XKER_N_SACCRG(IVEC2(:)+1,IVEC1(:) ) + Z3(:) = GET_XKER_N_SACCRG(IVEC2(:) ,IVEC1(:)+1) + Z4(:) = GET_XKER_N_SACCRG(IVEC2(:) ,IVEC1(:) ) + ZVEC3(:) = ( Z1(:)* ZVEC1(:) & + - Z2(:)*(ZVEC1(:) - 1.0) ) & + * ZVEC2(:) & + - ( Z3(:)* ZVEC1(:) & + - Z4(:)*(ZVEC1(:) - 1.0) ) & + * (ZVEC2(:) - 1.0) + ZZWC3(:) = ZVEC3(:) +! ! 1.3.4 raindrop accretion on the small sized aggregates ! ZZW4(:) = PCRT(:) * & !! coef of RRACCS and RRACCS - XFRACCSS *( PRST(:)*PLBDS(:)**XBS )*( PRHODREF(:)**(1-XCEXVT) ) & + XFRACCSS * PCST(:) * PRHODREF(:)**(1-XCEXVT) & *( XLBRACCS1/( PLBDS(:)**2 ) + & XLBRACCS2/( PLBDS(:) * PLBDR(:) ) + & XLBRACCS3/( PLBDR(:)**2 ) ) / PLBDR(:)**XBR +! + ZZWC4(:)= PCRT(:) * & !! coef of RRACCS and RRACCS + XFNRACCSS * PCST(:) * PRHODREF(:)**(1-XCEXVT) & + *( XLBNRACCS1/( PLBDS(:)**2 ) + & + XLBNRACCS2/( PLBDS(:) * PLBDR(:) ) + & + XLBNRACCS3/( PLBDR(:)**2 ) ) / PLBDR(:)**XBR ! ! 1.3.6 raindrop accretion-conversion of the large sized aggregates ! into graupeln ! ZZW5(:) = XFSACCRG * ZZW3(:) * PCRT(:) * & ! RSACCRG - ( PRST(:) )*( PRHODREF(:)**(1-XCEXVT) ) * & + PCST(:) * PLBDS(:)**(-XBS) * PRHODREF(:)**(1-XCEXVT) * & ( XLBSACCR1/( PLBDR(:)**2 ) + & XLBSACCR2/( PLBDR(:) * PLBDS(:) ) + & XLBSACCR3/( PLBDS(:)**2 ) ) +! + ZZWC5(:)= XFNSACCRG * ZZW3(:) * PCRT(:) * & ! RSACCRG + PCST(:) * PLBDS(:)**(-XBS) * PRHODREF(:)**(1-XCEXVT) * & + ( XLBNSACCR1/( PLBDR(:)**2 ) + & + XLBNSACCR2/( PLBDR(:) * PLBDS(:) ) + & + XLBNSACCR3/( PLBDS(:)**2 ) ) ! P_RR_ACC(:) = - ZZW4(:) * ZZW2(:) - P_CR_ACC(:) = P_RR_ACC(:) * PCRT(:)/PRRT(:) + P_CR_ACC(:) = - ZZWC4(:) * ZZWC2(:) P_RS_ACC(:) = ZZW4(:) * ZZW1(:) - ZZW5(:) + P_CS_ACC(:) = - ZZWC5(:) P_RG_ACC(:) = ZZW4(:) * ( ZZW2(:) - ZZW1(:) ) + ZZW5(:) P_TH_ACC(:) = - P_RR_ACC(:) * (PLSFACT(:)-PLVFACT(:)) ! @@ -253,6 +320,20 @@ CONTAINS END FUNCTION GET_XKER_RACCSS ! !------------------------------------------------------------------------------- +! + FUNCTION GET_XKER_N_RACCSS(I1,I2) RESULT(RET) + INTEGER, DIMENSION(:) :: I1 + INTEGER, DIMENSION(:) :: I2 + REAL, DIMENSION(SIZE(I1)) :: RET + ! + INTEGER I + ! + DO I=1,SIZE(I1) + RET(I) = XKER_N_RACCSS(MAX(MIN(I1(I),SIZE(XKER_N_RACCSS,1)),1),MAX(MIN(I2(I),SIZE(XKER_N_RACCSS,2)),1)) + END DO + END FUNCTION GET_XKER_N_RACCSS +! +!------------------------------------------------------------------------------- ! FUNCTION GET_XKER_RACCS(I1,I2) RESULT(RET) INTEGER, DIMENSION(:) :: I1 @@ -267,6 +348,20 @@ CONTAINS END FUNCTION GET_XKER_RACCS ! !------------------------------------------------------------------------------- +! + FUNCTION GET_XKER_N_RACCS(I1,I2) RESULT(RET) + INTEGER, DIMENSION(:) :: I1 + INTEGER, DIMENSION(:) :: I2 + REAL, DIMENSION(SIZE(I1)) :: RET + ! + INTEGER I + ! + DO I=1,SIZE(I1) + RET(I) = XKER_N_RACCS(MAX(MIN(I1(I),SIZE(XKER_N_RACCS,1)),1),MAX(MIN(I2(I),SIZE(XKER_N_RACCS,2)),1)) + END DO + END FUNCTION GET_XKER_N_RACCS +! +!------------------------------------------------------------------------------- ! FUNCTION GET_XKER_SACCRG(I1,I2) RESULT(RET) INTEGER, DIMENSION(:) :: I1 @@ -281,5 +376,19 @@ CONTAINS END FUNCTION GET_XKER_SACCRG ! !------------------------------------------------------------------------------- +! + FUNCTION GET_XKER_N_SACCRG(I1,I2) RESULT(RET) + INTEGER, DIMENSION(:) :: I1 + INTEGER, DIMENSION(:) :: I2 + REAL, DIMENSION(SIZE(I1)) :: RET + ! + INTEGER I + ! + DO I=1,SIZE(I1) + RET(I) = XKER_N_SACCRG(MAX(MIN(I1(I),SIZE(XKER_N_SACCRG,1)),1),MAX(MIN(I2(I),SIZE(XKER_N_SACCRG,2)),1)) + END DO + END FUNCTION GET_XKER_N_SACCRG +! +!------------------------------------------------------------------------------- ! END SUBROUTINE LIMA_RAIN_ACCR_SNOW diff --git a/src/MNH/lima_sedimentation.f90 b/src/MNH/lima_sedimentation.f90 index d7d26bf02..23072bb81 100644 --- a/src/MNH/lima_sedimentation.f90 +++ b/src/MNH/lima_sedimentation.f90 @@ -76,7 +76,8 @@ USE MODD_CST, ONLY: XRHOLW, XCL, XCI, XPI USE MODD_PARAMETERS, ONLY: JPHEXT, JPVEXT USE MODD_PARAM_LIMA, ONLY: XCEXVT, XRTMIN, XCTMIN, NSPLITSED, & XLB, XLBEX, XD, XFSEDR, XFSEDC, & - XALPHAC, XNUC, XALPHAS, XNUS, LSNOW_T + XALPHAC, XNUC, XALPHAS, XNUS, LSNOW_T, & + NMOM_S USE MODD_PARAM_LIMA_COLD, ONLY: XLBEXI, XLBI, XDI, XLBDAS_MAX, XBS, XEXSEDS, & XLBDAS_MIN, XTRANS_MP_GAMMAS, XFVELOS @@ -194,7 +195,7 @@ DO JN = 1 , NSPLITSED(KID) IF (ZMOMENTS==2) ZCS(JL) = PCS(I1(JL),I2(JL),I3(JL)) END DO ! - IF (KID == 5 .AND. LSNOW_T) THEN + IF (KID == 5 .AND. NMOM_S.EQ.1 .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) @@ -209,6 +210,8 @@ DO JN = 1 , NSPLITSED(KID) IF (ZMOMENTS==1) ZLBDA(:) = XLB(KID) * ( ZRHODREF(:) * ZRS(:) )**XLBEX(KID) IF (ZMOMENTS==2) ZLBDA(:) = ( XLB(KID)*ZCS(:) / ZRS(:) )**XLBEX(KID) ZZY(:) = ZRHODREF(:)**(-XCEXVT) * ZLBDA(:)**(-XD(KID)) + IF (LSNOW_T .AND. KID==5) & + ZZY(:) = ZZY(:) * (1 + (XFVELOS/ZLBDA(:))**XALPHAS)**(-XNUS-(XD(KID)+XBS)/XALPHAS) ZZW(:) = XFSEDR(KID) * ZRS(:) * ZZY(:) * ZRHODREF(:) END IF ! Wurtz ! diff --git a/src/MNH/lima_snow_deposition.f90 b/src/MNH/lima_snow_deposition.f90 index 5a6ec35ca..0531a3a4a 100644 --- a/src/MNH/lima_snow_deposition.f90 +++ b/src/MNH/lima_snow_deposition.f90 @@ -10,7 +10,7 @@ INTERFACE SUBROUTINE LIMA_SNOW_DEPOSITION (LDCOMPUTE, & PRHODREF, PSSI, PAI, PCJ, PLSFACT, & - PRST, PLBDS, & + PRST, PCST, PLBDS, & P_RI_CNVI, P_CI_CNVI, & P_TH_DEPS, P_RS_DEPS ) ! @@ -23,6 +23,7 @@ REAL, DIMENSION(:), INTENT(IN) :: PCJ ! abs. pressure at time t REAL, DIMENSION(:), INTENT(IN) :: PLSFACT ! abs. pressure at time t ! REAL, DIMENSION(:), INTENT(IN) :: PRST ! Snow/aggregate m.r. at t +REAL, DIMENSION(:), INTENT(IN) :: PCST ! Snow/aggregate concentration ! REAL, DIMENSION(:), INTENT(IN) :: PLBDS ! Graupel m.r. at t ! @@ -38,7 +39,7 @@ END MODULE MODI_LIMA_SNOW_DEPOSITION ! ########################################################################## SUBROUTINE LIMA_SNOW_DEPOSITION (LDCOMPUTE, & PRHODREF, PSSI, PAI, PCJ, PLSFACT, & - PRST, PLBDS, & + PRST, PCST, PLBDS, & P_RI_CNVI, P_CI_CNVI, & P_TH_DEPS, P_RS_DEPS ) ! ########################################################################## @@ -65,6 +66,7 @@ SUBROUTINE LIMA_SNOW_DEPOSITION (LDCOMPUTE, & !! ! J. Wurtz 03/2022: new snow characteristics ! B. Vie 03/2022: Add option for 1-moment pristine ice +! M. Taufour 07/2022: add snow concentration !------------------------------------------------------------------------------- ! !* 0. DECLARATIONS @@ -94,6 +96,7 @@ REAL, DIMENSION(:), INTENT(IN) :: PCJ ! abs. pressure at time t REAL, DIMENSION(:), INTENT(IN) :: PLSFACT ! abs. pressure at time t ! REAL, DIMENSION(:), INTENT(IN) :: PRST ! Snow/aggregate m.r. at t +REAL, DIMENSION(:), INTENT(IN) :: PCST ! Snow/aggregate m.r. at t ! REAL, DIMENSION(:), INTENT(IN) :: PLBDS ! Graupel m.r. at t ! @@ -124,7 +127,7 @@ IF (NMOM_I.EQ.1) THEN ! Deposition of water vapor on r_s: RVDEPS ! ZZW(:) = 0.0 - WHERE ( (PRST(:)>XRTMIN(5)) ) + WHERE ( PRST(:)>XRTMIN(5) ) ZZW(:) = PRST(:) * PSSI(:) / PAI(:) * & ( X0DEPS*PLBDS(:)**XEX0DEPS + & X1DEPS*PLBDS(:)**(XEX1DEPS+XBS)*PCJ(:) * & @@ -142,10 +145,10 @@ ELSE ! ZZW2(:) = 0.0 ZZW(:) = 0.0 - WHERE ( PLBDS(:)<XLBDASCNVI_MAX .AND. (PRST(:)>XRTMIN(5)) & - .AND. (PSSI(:)<0.0) ) + WHERE ( PLBDS(:)<XLBDASCNVI_MAX .AND. PRST(:)>XRTMIN(5) .AND. PCST(:)>XCTMIN(5) & + .AND. PSSI(:)<0.0 ) ZZW(:) = (PLBDS(:)*XDSCNVI_LIM)**(XALPHAS) - ZZX(:) = ( -PSSI(:)/PAI(:) ) * (XNS*PRST(:)*PLBDS(:)**XBS) * (ZZW(:)**XNUS) * EXP(-ZZW(:)) + ZZX(:) = ( -PSSI(:)/PAI(:) ) * PCST(:) * (ZZW(:)**XNUS) * EXP(-ZZW(:)) ! ZZW(:) = ( XR0DEPSI+XR1DEPSI*PCJ(:) )*ZZX(:) ! @@ -161,16 +164,15 @@ ELSE ! ! ZZW(:) = 0.0 - WHERE ( (PRST(:)>XRTMIN(5)) ) - ZZW(:) = ( PRST(:)*PSSI(:)/(PAI(:)) ) * & + WHERE ( PRST(:)>XRTMIN(5) .AND. PCST(:)>XCTMIN(5) ) + ZZW(:) = ( PCST(:)*PSSI(:)/(PAI(:)) ) * & ( X0DEPS*PLBDS(:)**XEX0DEPS + & - ( X1DEPS*PCJ(:)*(PLBDS(:))**(XBS+XEX1DEPS) * & + ( X1DEPS*PCJ(:)*PLBDS(:)**XEX1DEPS * & (1+0.5*(XFVELOS/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_TH_DEPS(:) = P_RS_DEPS(:) * PLSFACT(:) ! END WHERE END IF diff --git a/src/MNH/lima_tendencies.f90 b/src/MNH/lima_tendencies.f90 index 3e63f4d38..19bc49ec6 100644 --- a/src/MNH/lima_tendencies.f90 +++ b/src/MNH/lima_tendencies.f90 @@ -7,44 +7,46 @@ MODULE MODI_LIMA_TENDENCIES !############################### INTERFACE - SUBROUTINE LIMA_TENDENCIES (PTSTEP, LDCOMPUTE, & - PEXNREF, PRHODREF, PPABST, PTHT, & - PRVT, PRCT, PRRT, PRIT, PRST, PRGT, PRHT, & - PCCT, PCRT, PCIT, PCST, PCGT, PCHT, & - P_TH_HONC, P_RC_HONC, P_CC_HONC, & - P_CC_SELF, & - 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_CR_EVAP, & - P_RI_CNVI, P_CI_CNVI, & - P_TH_DEPS, P_RS_DEPS, & - P_TH_DEPI, P_RI_DEPI, & - P_RI_CNVS, P_CI_CNVS, & - P_RI_AGGS, P_CI_AGGS, & - P_TH_DEPG, P_RG_DEPG, & - P_TH_BERFI, P_RC_BERFI, & - P_TH_RIM, P_RC_RIM, P_CC_RIM, P_RS_RIM, P_RG_RIM, & - P_RI_HMS, P_CI_HMS, P_RS_HMS, & - P_TH_ACC, P_RR_ACC, P_CR_ACC, P_RS_ACC, P_RG_ACC, & - P_RS_CMEL, & - P_TH_CFRZ, P_RR_CFRZ, P_CR_CFRZ, P_RI_CFRZ, P_CI_CFRZ, & - P_RI_CIBU, P_CI_CIBU, & - P_RI_RDSF, P_CI_RDSF, & - P_TH_WETG, P_RC_WETG, P_CC_WETG, P_RR_WETG, P_CR_WETG, & - P_RI_WETG, P_CI_WETG, P_RS_WETG, P_RG_WETG, P_RH_WETG, & - P_TH_DRYG, P_RC_DRYG, P_CC_DRYG, P_RR_DRYG, P_CR_DRYG, & - P_RI_DRYG, P_CI_DRYG, P_RS_DRYG, P_RG_DRYG, & - P_RI_HMG, P_CI_HMG, P_RG_HMG, & - P_TH_GMLT, P_RR_GMLT, P_CR_GMLT, & -!!! Z_RC_WETH, Z_CC_WETH, Z_RR_WETH, Z_CR_WETH, & ! wet growth of hail (WETH) : rc, Nc, rr, Nr, ri, Ni, rs, rg, rh, th -!!! Z_RI_WETH, Z_CI_WETH, Z_RS_WETH, Z_RG_WETH, Z_RH_WETH, & ! wet growth of hail (WETH) : rc, Nc, rr, Nr, ri, Ni, rs, rg, rh, th -!!! Z_RG_COHG, & ! conversion of hail into graupel (COHG) : rg, rh -!!! Z_RR_HMLT, Z_CR_HMLT ! hail melting (HMLT) : rr, Nr, rh=-rr, th - PA_TH, PA_RV, PA_RC, PA_CC, PA_RR, PA_CR, & - PA_RI, PA_CI, PA_RS, PA_CS, PA_RG, PA_CG, PA_RH, PA_CH, & - PEVAP3D, & - PCF1D, PIF1D, PPF1D ) + SUBROUTINE LIMA_TENDENCIES (PTSTEP, LDCOMPUTE, & + PEXNREF, PRHODREF, PPABST, PTHT, & + PRVT, PRCT, PRRT, PRIT, PRST, PRGT, PRHT, & + PCCT, PCRT, PCIT, PCST, PCGT, PCHT, & + P_TH_HONC, P_RC_HONC, P_CC_HONC, & + P_CC_SELF, & + 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_CR_EVAP, & + P_RI_CNVI, P_CI_CNVI, & + P_TH_DEPS, P_RS_DEPS, & + P_TH_DEPI, P_RI_DEPI, & + P_RI_CNVS, P_CI_CNVS, & + P_CS_SSC, & + P_RI_AGGS, P_CI_AGGS, & + P_TH_DEPG, P_RG_DEPG, & + P_TH_BERFI, P_RC_BERFI, & + P_TH_RIM, P_RC_RIM, P_CC_RIM, P_RS_RIM, P_CS_RIM, P_RG_RIM, & + P_RI_HMS, P_CI_HMS, P_RS_HMS, & + P_TH_ACC, P_RR_ACC, P_CR_ACC, P_RS_ACC, P_CS_ACC, P_RG_ACC, & + P_RS_CMEL, P_CS_CMEL, & + P_TH_CFRZ, P_RR_CFRZ, P_CR_CFRZ, P_RI_CFRZ, P_CI_CFRZ, & + P_RI_CIBU, P_CI_CIBU, & + P_RI_RDSF, P_CI_RDSF, & + P_TH_WETG, P_RC_WETG, P_CC_WETG, P_RR_WETG, P_CR_WETG, & + P_RI_WETG, P_CI_WETG, P_RS_WETG, P_CS_WETG, P_RG_WETG, P_CG_WETG, P_RH_WETG, & + P_TH_DRYG, P_RC_DRYG, P_CC_DRYG, P_RR_DRYG, P_CR_DRYG, & + P_RI_DRYG, P_CI_DRYG, P_RS_DRYG, P_CS_DRYG, P_RG_DRYG, & + P_RI_HMG, P_CI_HMG, P_RG_HMG, & + P_TH_GMLT, P_RR_GMLT, P_CR_GMLT, P_CG_GMLT, & + P_TH_DEPH, P_RH_DEPH, & + P_TH_WETH, P_RC_WETH, P_CC_WETH, P_RR_WETH, P_CR_WETH, & + P_RI_WETH, P_CI_WETH, P_RS_WETH, P_CS_WETH, P_RG_WETH, P_CG_WETH, P_RH_WETH, & + P_RG_COHG, P_CG_COHG, & + P_TH_HMLT, P_RR_HMLT, P_CR_HMLT, P_CH_HMLT, & + PA_TH, PA_RV, PA_RC, PA_CC, PA_RR, PA_CR, & + PA_RI, PA_CI, PA_RS, PA_CS, PA_RG, PA_CG, PA_RH, PA_CH, & + PEVAP3D, & + PCF1D, PIF1D, PPF1D ) ! REAL, INTENT(IN) :: PTSTEP LOGICAL, DIMENSION(:),INTENT(IN) :: LDCOMPUTE @@ -100,6 +102,8 @@ REAL, DIMENSION(:), INTENT(INOUT) :: P_RI_DEPI ! deposition of vapor on ice ( REAL, DIMENSION(:), INTENT(INOUT) :: P_RI_CNVS REAL, DIMENSION(:), INTENT(INOUT) :: P_CI_CNVS ! conversion ice -> snow (CNVS) : ri, Ni, rs=-ri ! +REAL, DIMENSION(:), INTENT(INOUT) :: P_CS_SSC ! self collection of snow (SSC) : Ns +! REAL, DIMENSION(:), INTENT(INOUT) :: P_RI_AGGS REAL, DIMENSION(:), INTENT(INOUT) :: P_CI_AGGS ! aggregation of ice on snow (AGGS) : ri, Ni, rs=-ri ! @@ -113,7 +117,8 @@ REAL, DIMENSION(:), INTENT(INOUT) :: P_TH_RIM REAL, DIMENSION(:), INTENT(INOUT) :: P_RC_RIM REAL, DIMENSION(:), INTENT(INOUT) :: P_CC_RIM REAL, DIMENSION(:), INTENT(INOUT) :: P_RS_RIM -REAL, DIMENSION(:), INTENT(INOUT) :: P_RG_RIM ! cloud droplet riming (RIM) : rc, Nc, rs, rg, th +REAL, DIMENSION(:), INTENT(INOUT) :: P_CS_RIM +REAL, DIMENSION(:), INTENT(INOUT) :: P_RG_RIM ! cloud droplet riming (RIM) : rc, Nc, rs, Ns, rg, Ng=-Ns, th ! REAL, DIMENSION(:), INTENT(INOUT) :: P_RI_HMS REAL, DIMENSION(:), INTENT(INOUT) :: P_CI_HMS @@ -123,9 +128,11 @@ REAL, DIMENSION(:), INTENT(INOUT) :: P_TH_ACC REAL, DIMENSION(:), INTENT(INOUT) :: P_RR_ACC REAL, DIMENSION(:), INTENT(INOUT) :: P_CR_ACC REAL, DIMENSION(:), INTENT(INOUT) :: P_RS_ACC -REAL, DIMENSION(:), INTENT(INOUT) :: P_RG_ACC ! rain accretion on aggregates (ACC) : rr, Nr, rs, rg, th +REAL, DIMENSION(:), INTENT(INOUT) :: P_CS_ACC +REAL, DIMENSION(:), INTENT(INOUT) :: P_RG_ACC ! rain accretion on aggregates (ACC) : rr, Nr, rs, Ns, rg, Ng=-Ns, th ! -REAL, DIMENSION(:), INTENT(INOUT) :: P_RS_CMEL ! conversion-melting (CMEL) : rs, rg=-rs +REAL, DIMENSION(:), INTENT(INOUT) :: P_RS_CMEL +REAL, DIMENSION(:), INTENT(INOUT) :: P_CS_CMEL ! conversion-melting (CMEL) : rs, Ns, rg=-rs, Ng=-Ns ! REAL, DIMENSION(:), INTENT(INOUT) :: P_TH_CFRZ REAL, DIMENSION(:), INTENT(INOUT) :: P_RR_CFRZ @@ -147,8 +154,10 @@ REAL, DIMENSION(:), INTENT(INOUT) :: P_CR_WETG REAL, DIMENSION(:), INTENT(INOUT) :: P_RI_WETG REAL, DIMENSION(:), INTENT(INOUT) :: P_CI_WETG REAL, DIMENSION(:), INTENT(INOUT) :: P_RS_WETG +REAL, DIMENSION(:), INTENT(INOUT) :: P_CS_WETG REAL, DIMENSION(:), INTENT(INOUT) :: P_RG_WETG -REAL, DIMENSION(:), INTENT(INOUT) :: P_RH_WETG ! wet growth of graupel (WETG) : rc, NC, rr, Nr, ri, Ni, rs, rg, rh, th +REAL, DIMENSION(:), INTENT(INOUT) :: P_CG_WETG +REAL, DIMENSION(:), INTENT(INOUT) :: P_RH_WETG ! wet growth of graupel (WETG) : rc, NC, rr, Nr, ri, Ni, rs, Ns, rg, Ng, rh, Nh=-Ng, th ! REAL, DIMENSION(:), INTENT(INOUT) :: P_TH_DRYG REAL, DIMENSION(:), INTENT(INOUT) :: P_RC_DRYG @@ -158,7 +167,8 @@ REAL, DIMENSION(:), INTENT(INOUT) :: P_CR_DRYG REAL, DIMENSION(:), INTENT(INOUT) :: P_RI_DRYG REAL, DIMENSION(:), INTENT(INOUT) :: P_CI_DRYG REAL, DIMENSION(:), INTENT(INOUT) :: P_RS_DRYG -REAL, DIMENSION(:), INTENT(INOUT) :: P_RG_DRYG ! dry growth of graupel (DRYG) : rc, Nc, rr, Nr, ri, Ni, rs, rg, th +REAL, DIMENSION(:), INTENT(INOUT) :: P_CS_DRYG +REAL, DIMENSION(:), INTENT(INOUT) :: P_RG_DRYG ! dry growth of graupel (DRYG) : rc, Nc, rr, Nr, ri, Ni, rs, Ns, rg, th ! REAL, DIMENSION(:), INTENT(INOUT) :: P_RI_HMG REAL, DIMENSION(:), INTENT(INOUT) :: P_CI_HMG @@ -166,7 +176,32 @@ REAL, DIMENSION(:), INTENT(INOUT) :: P_RG_HMG ! hallett mossop graupel (HMG) ! REAL, DIMENSION(:), INTENT(INOUT) :: P_TH_GMLT REAL, DIMENSION(:), INTENT(INOUT) :: P_RR_GMLT -REAL, DIMENSION(:), INTENT(INOUT) :: P_CR_GMLT ! graupel melting (GMLT) : rr, Nr, rg=-rr, th +REAL, DIMENSION(:), INTENT(INOUT) :: P_CR_GMLT +REAL, DIMENSION(:), INTENT(INOUT) :: P_CG_GMLT ! graupel melting (GMLT) : rr, Nr, rg=-rr, Ng, th +! +REAL, DIMENSION(:), INTENT(INOUT) :: P_TH_DEPH +REAL, DIMENSION(:), INTENT(INOUT) :: P_RH_DEPH ! deposition of vapor on hail (DEPH) : rv=-rh, rh, th +! +REAL, DIMENSION(:), INTENT(INOUT) :: P_TH_WETH +REAL, DIMENSION(:), INTENT(INOUT) :: P_RC_WETH +REAL, DIMENSION(:), INTENT(INOUT) :: P_CC_WETH +REAL, DIMENSION(:), INTENT(INOUT) :: P_RR_WETH +REAL, DIMENSION(:), INTENT(INOUT) :: P_CR_WETH +REAL, DIMENSION(:), INTENT(INOUT) :: P_RI_WETH +REAL, DIMENSION(:), INTENT(INOUT) :: P_CI_WETH +REAL, DIMENSION(:), INTENT(INOUT) :: P_RS_WETH +REAL, DIMENSION(:), INTENT(INOUT) :: P_CS_WETH +REAL, DIMENSION(:), INTENT(INOUT) :: P_RG_WETH +REAL, DIMENSION(:), INTENT(INOUT) :: P_CG_WETH +REAL, DIMENSION(:), INTENT(INOUT) :: P_RH_WETH ! wet growth of hail (WETH) : rc, NC, rr, Nr, ri, Ni, rs, Ns, rg, Ng, rh, th +! +REAL, DIMENSION(:), INTENT(INOUT) :: P_RG_COHG +REAL, DIMENSION(:), INTENT(INOUT) :: P_CG_COHG ! conversion hail -> graupel (COHG) : rg, Ng, rh=-rg; Nh=-Ng +! +REAL, DIMENSION(:), INTENT(INOUT) :: P_TH_HMLT +REAL, DIMENSION(:), INTENT(INOUT) :: P_RR_HMLT +REAL, DIMENSION(:), INTENT(INOUT) :: P_CR_HMLT +REAL, DIMENSION(:), INTENT(INOUT) :: P_CH_HMLT ! hail melting (HMLT) : rr, Nr, rh=-rr, Nh, th ! REAL, DIMENSION(:), INTENT(INOUT) :: PA_TH REAL, DIMENSION(:), INTENT(INOUT) :: PA_RV @@ -195,44 +230,46 @@ END MODULE MODI_LIMA_TENDENCIES !##################################################################### ! !##################################################################### -SUBROUTINE LIMA_TENDENCIES (PTSTEP, LDCOMPUTE, & - PEXNREF, PRHODREF, PPABST, PTHT, & - PRVT, PRCT, PRRT, PRIT, PRST, PRGT, PRHT, & - PCCT, PCRT, PCIT, PCST, PCGT, PCHT, & - P_TH_HONC, P_RC_HONC, P_CC_HONC, & - P_CC_SELF, & - 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_CR_EVAP, & - P_RI_CNVI, P_CI_CNVI, & - P_TH_DEPS, P_RS_DEPS, & - P_TH_DEPI, P_RI_DEPI, & - P_RI_CNVS, P_CI_CNVS, & - P_RI_AGGS, P_CI_AGGS, & - P_TH_DEPG, P_RG_DEPG, & - P_TH_BERFI, P_RC_BERFI, & - P_TH_RIM, P_RC_RIM, P_CC_RIM, P_RS_RIM, P_RG_RIM, & - P_RI_HMS, P_CI_HMS, P_RS_HMS, & - P_TH_ACC, P_RR_ACC, P_CR_ACC, P_RS_ACC, P_RG_ACC, & - P_RS_CMEL, & - P_TH_CFRZ, P_RR_CFRZ, P_CR_CFRZ, P_RI_CFRZ, P_CI_CFRZ, & - P_RI_CIBU, P_CI_CIBU, & - P_RI_RDSF, P_CI_RDSF, & - P_TH_WETG, P_RC_WETG, P_CC_WETG, P_RR_WETG, P_CR_WETG, & - P_RI_WETG, P_CI_WETG, P_RS_WETG, P_RG_WETG, P_RH_WETG, & - P_TH_DRYG, P_RC_DRYG, P_CC_DRYG, P_RR_DRYG, P_CR_DRYG, & - P_RI_DRYG, P_CI_DRYG, P_RS_DRYG, P_RG_DRYG, & - P_RI_HMG, P_CI_HMG, P_RG_HMG, & - P_TH_GMLT, P_RR_GMLT, P_CR_GMLT, & -!!! Z_RC_WETH, Z_CC_WETH, Z_RR_WETH, Z_CR_WETH, & ! wet growth of hail (WETH) : rc, Nc, rr, Nr, ri, Ni, rs, rg, rh, th -!!! Z_RI_WETH, Z_CI_WETH, Z_RS_WETH, Z_RG_WETH, Z_RH_WETH, & ! wet growth of hail (WETH) : rc, Nc, rr, Nr, ri, Ni, rs, rg, rh, th -!!! Z_RG_COHG, & ! conversion of hail into graupel (COHG) : rg, rh -!!! Z_RR_HMLT, Z_CR_HMLT ! hail melting (HMLT) : rr, Nr, rh=-rr, th - PA_TH, PA_RV, PA_RC, PA_CC, PA_RR, PA_CR, & - PA_RI, PA_CI, PA_RS, PA_CS, PA_RG, PA_CG, PA_RH, PA_CH, & - PEVAP3D, & - PCF1D, PIF1D, PPF1D ) +SUBROUTINE LIMA_TENDENCIES (PTSTEP, LDCOMPUTE, & + PEXNREF, PRHODREF, PPABST, PTHT, & + PRVT, PRCT, PRRT, PRIT, PRST, PRGT, PRHT, & + PCCT, PCRT, PCIT, PCST, PCGT, PCHT, & + P_TH_HONC, P_RC_HONC, P_CC_HONC, & + P_CC_SELF, & + 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_CR_EVAP, & + P_RI_CNVI, P_CI_CNVI, & + P_TH_DEPS, P_RS_DEPS, & + P_TH_DEPI, P_RI_DEPI, & + P_RI_CNVS, P_CI_CNVS, & + P_CS_SSC, & + P_RI_AGGS, P_CI_AGGS, & + P_TH_DEPG, P_RG_DEPG, & + P_TH_BERFI, P_RC_BERFI, & + P_TH_RIM, P_RC_RIM, P_CC_RIM, P_RS_RIM, P_CS_RIM, P_RG_RIM, & + P_RI_HMS, P_CI_HMS, P_RS_HMS, & + P_TH_ACC, P_RR_ACC, P_CR_ACC, P_RS_ACC, P_CS_ACC, P_RG_ACC, & + P_RS_CMEL, P_CS_CMEL, & + P_TH_CFRZ, P_RR_CFRZ, P_CR_CFRZ, P_RI_CFRZ, P_CI_CFRZ, & + P_RI_CIBU, P_CI_CIBU, & + P_RI_RDSF, P_CI_RDSF, & + P_TH_WETG, P_RC_WETG, P_CC_WETG, P_RR_WETG, P_CR_WETG, & + P_RI_WETG, P_CI_WETG, P_RS_WETG, P_CS_WETG, P_RG_WETG, P_CG_WETG, P_RH_WETG, & + P_TH_DRYG, P_RC_DRYG, P_CC_DRYG, P_RR_DRYG, P_CR_DRYG, & + P_RI_DRYG, P_CI_DRYG, P_RS_DRYG, P_CS_DRYG, P_RG_DRYG, & + P_RI_HMG, P_CI_HMG, P_RG_HMG, & + P_TH_GMLT, P_RR_GMLT, P_CR_GMLT, P_CG_GMLT, & + P_TH_DEPH, P_RH_DEPH, & + P_TH_WETH, P_RC_WETH, P_CC_WETH, P_RR_WETH, P_CR_WETH, & + P_RI_WETH, P_CI_WETH, P_RS_WETH, P_CS_WETH, P_RG_WETH, P_CG_WETH, P_RH_WETH, & + P_RG_COHG, P_CG_COHG, & + P_TH_HMLT, P_RR_HMLT, P_CR_HMLT, P_CH_HMLT, & + PA_TH, PA_RV, PA_RC, PA_CC, PA_RR, PA_CR, & + PA_RI, PA_CI, PA_RS, PA_CS, PA_RG, PA_CG, PA_RH, PA_CH, & + PEVAP3D, & + PCF1D, PIF1D, PPF1D ) ! ###################################################################### !! !! PURPOSE @@ -274,6 +311,7 @@ USE MODI_LIMA_DROPS_SELF_COLLECTION USE MODI_LIMA_RAIN_EVAPORATION USE MODI_LIMA_ICE_DEPOSITION USE MODI_LIMA_SNOW_DEPOSITION +USE MODI_LIMA_SNOW_SELF_COLLECTION USE MODI_LIMA_ICE_AGGREGATION_SNOW USE MODI_LIMA_GRAUPEL_DEPOSITION USE MODI_LIMA_DROPLETS_RIMING_SNOW @@ -283,6 +321,7 @@ USE MODI_LIMA_RAIN_FREEZING USE MODI_LIMA_COLLISIONAL_ICE_BREAKUP USE MODI_LIMA_RAINDROP_SHATTERING_FREEZING USE MODI_LIMA_GRAUPEL +USE MODI_LIMA_HAIL_DEPOSITION ! USE MODI_LIMA_BERGERON ! @@ -344,6 +383,8 @@ REAL, DIMENSION(:), INTENT(INOUT) :: P_RI_DEPI ! deposition of vapor on ice ( REAL, DIMENSION(:), INTENT(INOUT) :: P_RI_CNVS REAL, DIMENSION(:), INTENT(INOUT) :: P_CI_CNVS ! conversion ice -> snow (CNVS) : ri, Ni, rs=-ri ! +REAL, DIMENSION(:), INTENT(INOUT) :: P_CS_SSC ! self collection of snow (SSC) : Ns +! REAL, DIMENSION(:), INTENT(INOUT) :: P_RI_AGGS REAL, DIMENSION(:), INTENT(INOUT) :: P_CI_AGGS ! aggregation of ice on snow (AGGS) : ri, Ni, rs=-ri ! @@ -357,6 +398,7 @@ REAL, DIMENSION(:), INTENT(INOUT) :: P_TH_RIM REAL, DIMENSION(:), INTENT(INOUT) :: P_RC_RIM REAL, DIMENSION(:), INTENT(INOUT) :: P_CC_RIM REAL, DIMENSION(:), INTENT(INOUT) :: P_RS_RIM +REAL, DIMENSION(:), INTENT(INOUT) :: P_CS_RIM REAL, DIMENSION(:), INTENT(INOUT) :: P_RG_RIM ! cloud droplet riming (RIM) : rc, Nc, rs, rg, th ! REAL, DIMENSION(:), INTENT(INOUT) :: P_RI_HMS @@ -367,9 +409,11 @@ REAL, DIMENSION(:), INTENT(INOUT) :: P_TH_ACC REAL, DIMENSION(:), INTENT(INOUT) :: P_RR_ACC REAL, DIMENSION(:), INTENT(INOUT) :: P_CR_ACC REAL, DIMENSION(:), INTENT(INOUT) :: P_RS_ACC -REAL, DIMENSION(:), INTENT(INOUT) :: P_RG_ACC ! rain accretion on aggregates (ACC) : rr, Nr, rs, rg, th +REAL, DIMENSION(:), INTENT(INOUT) :: P_CS_ACC +REAL, DIMENSION(:), INTENT(INOUT) :: P_RG_ACC ! rain accretion on aggregates (ACC) : rr, Nr, rs, Ns, rg, Ng=-Ns, th ! -REAL, DIMENSION(:), INTENT(INOUT) :: P_RS_CMEL ! conversion-melting (CMEL) : rs, rg=-rs +REAL, DIMENSION(:), INTENT(INOUT) :: P_RS_CMEL +REAL, DIMENSION(:), INTENT(INOUT) :: P_CS_CMEL ! conversion-melting (CMEL) : rs, Ns, rg=-rs, Ng=-Ns ! REAL, DIMENSION(:), INTENT(INOUT) :: P_TH_CFRZ REAL, DIMENSION(:), INTENT(INOUT) :: P_RR_CFRZ @@ -391,8 +435,10 @@ REAL, DIMENSION(:), INTENT(INOUT) :: P_CR_WETG REAL, DIMENSION(:), INTENT(INOUT) :: P_RI_WETG REAL, DIMENSION(:), INTENT(INOUT) :: P_CI_WETG REAL, DIMENSION(:), INTENT(INOUT) :: P_RS_WETG +REAL, DIMENSION(:), INTENT(INOUT) :: P_CS_WETG REAL, DIMENSION(:), INTENT(INOUT) :: P_RG_WETG -REAL, DIMENSION(:), INTENT(INOUT) :: P_RH_WETG ! wet growth of graupel (WETG) : rc, NC, rr, Nr, ri, Ni, rs, rg, rh, th +REAL, DIMENSION(:), INTENT(INOUT) :: P_CG_WETG +REAL, DIMENSION(:), INTENT(INOUT) :: P_RH_WETG ! wet growth of graupel (WETG) : rc, NC, rr, Nr, ri, Ni, rs, Ns, rg, Ng, rh, Nh=-Ng, th ! REAL, DIMENSION(:), INTENT(INOUT) :: P_TH_DRYG REAL, DIMENSION(:), INTENT(INOUT) :: P_RC_DRYG @@ -402,6 +448,7 @@ REAL, DIMENSION(:), INTENT(INOUT) :: P_CR_DRYG REAL, DIMENSION(:), INTENT(INOUT) :: P_RI_DRYG REAL, DIMENSION(:), INTENT(INOUT) :: P_CI_DRYG REAL, DIMENSION(:), INTENT(INOUT) :: P_RS_DRYG +REAL, DIMENSION(:), INTENT(INOUT) :: P_CS_DRYG REAL, DIMENSION(:), INTENT(INOUT) :: P_RG_DRYG ! dry growth of graupel (DRYG) : rc, Nc, rr, Nr, ri, Ni, rs, rg, th ! REAL, DIMENSION(:), INTENT(INOUT) :: P_RI_HMG @@ -410,7 +457,32 @@ REAL, DIMENSION(:), INTENT(INOUT) :: P_RG_HMG ! hallett mossop graupel (HMG) ! REAL, DIMENSION(:), INTENT(INOUT) :: P_TH_GMLT REAL, DIMENSION(:), INTENT(INOUT) :: P_RR_GMLT -REAL, DIMENSION(:), INTENT(INOUT) :: P_CR_GMLT ! graupel melting (GMLT) : rr, Nr, rg=-rr, th +REAL, DIMENSION(:), INTENT(INOUT) :: P_CR_GMLT +REAL, DIMENSION(:), INTENT(INOUT) :: P_CG_GMLT ! graupel melting (GMLT) : rr, Nr, rg=-rr, Ng, th +! +REAL, DIMENSION(:), INTENT(INOUT) :: P_TH_DEPH +REAL, DIMENSION(:), INTENT(INOUT) :: P_RH_DEPH ! deposition of vapor on hail (DEPH) : rv=-rh, rh, th +! +REAL, DIMENSION(:), INTENT(INOUT) :: P_TH_WETH +REAL, DIMENSION(:), INTENT(INOUT) :: P_RC_WETH +REAL, DIMENSION(:), INTENT(INOUT) :: P_CC_WETH +REAL, DIMENSION(:), INTENT(INOUT) :: P_RR_WETH +REAL, DIMENSION(:), INTENT(INOUT) :: P_CR_WETH +REAL, DIMENSION(:), INTENT(INOUT) :: P_RI_WETH +REAL, DIMENSION(:), INTENT(INOUT) :: P_CI_WETH +REAL, DIMENSION(:), INTENT(INOUT) :: P_RS_WETH +REAL, DIMENSION(:), INTENT(INOUT) :: P_CS_WETH +REAL, DIMENSION(:), INTENT(INOUT) :: P_RG_WETH +REAL, DIMENSION(:), INTENT(INOUT) :: P_CG_WETH +REAL, DIMENSION(:), INTENT(INOUT) :: P_RH_WETH ! wet growth of hail (WETH) : rc, NC, rr, Nr, ri, Ni, rs, Ns, rg, Ng, rh, th +! +REAL, DIMENSION(:), INTENT(INOUT) :: P_RG_COHG +REAL, DIMENSION(:), INTENT(INOUT) :: P_CG_COHG ! conversion hail -> graupel (COHG) : rg, Ng, rh=-rg; Nh=-Ng +! +REAL, DIMENSION(:), INTENT(INOUT) :: P_TH_HMLT +REAL, DIMENSION(:), INTENT(INOUT) :: P_RR_HMLT +REAL, DIMENSION(:), INTENT(INOUT) :: P_CR_HMLT +REAL, DIMENSION(:), INTENT(INOUT) :: P_CH_HMLT ! hail melting (HMLT) : rr, Nr, rh=-rr, Nh, th ! REAL, DIMENSION(:), INTENT(INOUT) :: PA_TH REAL, DIMENSION(:), INTENT(INOUT) :: PA_RV @@ -443,6 +515,7 @@ REAL, DIMENSION(SIZE(PRCT)) :: ZLBDR REAL, DIMENSION(SIZE(PRCT)) :: ZLBDR3 REAL, DIMENSION(SIZE(PRCT)) :: ZLBDI REAL, DIMENSION(SIZE(PRCT)) :: ZLBDS +REAL, DIMENSION(SIZE(PRCT)) :: ZLBDS3 REAL, DIMENSION(SIZE(PRCT)) :: ZLBDG REAL, DIMENSION(SIZE(PRCT)) :: ZLBDH @@ -615,6 +688,7 @@ IF (NMOM_S.EQ.1) THEN ELSE ZLBDS(:) = (XLBS*PCST(:)/ZRST(:))**XLBEXS END IF +ZLBDS3(:) = ZLBDS(:)**3. ! ! Graupel ZLBDG(:) = 1.E10 @@ -741,6 +815,7 @@ IF (LCOLD) THEN PA_RI(:) = PA_RI(:) + P_RI_DEPI(:) + P_RI_CNVS(:) IF (NMOM_I.GE.2) PA_CI(:) = PA_CI(:) + P_CI_CNVS(:) PA_RS(:) = PA_RS(:) - P_RI_CNVS(:) + IF (NMOM_S.GE.2) PA_CS(:) = PA_CS(:) - P_CI_CNVS(:) END IF ! @@ -750,7 +825,7 @@ IF (LCOLD .AND. LSNOW) THEN ! CALL LIMA_SNOW_DEPOSITION (LDCOMPUTE, & ! depends on IF, PF PRHODREF, ZSSI, ZAI, ZCJ, ZLSFACT, & - ZRST/ZPF1D, ZLBDS, & + ZRST/ZPF1D, PCST/ZPF1D, ZLBDS, & P_RI_CNVI, P_CI_CNVI, & P_TH_DEPS, P_RS_DEPS ) ! @@ -762,11 +837,23 @@ IF (LCOLD .AND. LSNOW) THEN PA_RI(:) = PA_RI(:) + P_RI_CNVI(:) IF (NMOM_I.GE.2) PA_CI(:) = PA_CI(:) + P_CI_CNVI(:) PA_RS(:) = PA_RS(:) - P_RI_CNVI(:) + P_RS_DEPS(:) + IF (NMOM_S.GE.2) PA_CS(:) = PA_CS(:) - P_CI_CNVI(:) PA_TH(:) = PA_TH(:) + P_TH_DEPS(:) PA_RV(:) = PA_RV(:) - P_RS_DEPS(:) END IF ! +IF (LSNOW .AND. NMOM_S.GE.2) THEN + CALL LIMA_SNOW_SELF_COLLECTION (LDCOMPUTE, & ! depends on PF + PRHODREF, & + PCST/ZPF1D(:), ZLBDS, ZLBDS3, & + P_CS_SSC ) + ! + P_CS_SSC(:) = P_CS_SSC(:) * ZPF1D(:) + ! + PA_CS(:) = PA_CS(:) + P_CS_SSC(:) +END IF +! ! Lambda_s limited for collection processes to prevent too high concentrations ! must be changed or removed if C and x modified ! @@ -774,10 +861,10 @@ END IF ! ! IF (LCOLD .AND. LSNOW) THEN - CALL LIMA_ICE_AGGREGATION_SNOW (LDCOMPUTE, & ! depends on IF, PF - ZT, PRHODREF, & - ZRIT/ZIF1D, ZRST/ZPF1D, PCIT/ZIF1D, ZLBDI, ZLBDS, & - P_RI_AGGS, P_CI_AGGS ) + CALL LIMA_ICE_AGGREGATION_SNOW (LDCOMPUTE, & ! depends on IF, PF + ZT, PRHODREF, & + ZRIT/ZIF1D, ZRST/ZPF1D, PCIT/ZIF1D, PCST/ZPF1D, ZLBDI, ZLBDS, & + P_RI_AGGS, P_CI_AGGS ) P_CI_AGGS(:) = P_CI_AGGS(:) * ZIF1D(:) P_RI_AGGS(:) = P_RI_AGGS(:) * ZIF1D(:) ! @@ -787,9 +874,9 @@ IF (LCOLD .AND. LSNOW) THEN END IF ! IF (LWARM .AND. LCOLD) THEN - CALL LIMA_GRAUPEL_DEPOSITION (LDCOMPUTE, PRHODREF, & ! depends on PF ? - ZRGT/ZPF1D, ZSSI, ZLBDG, ZAI, ZCJ, ZLSFACT, & - P_TH_DEPG, P_RG_DEPG ) + CALL LIMA_GRAUPEL_DEPOSITION (LDCOMPUTE, PRHODREF, & ! depends on PF ? + ZRGT/ZPF1D, PCGT/ZPF1D, ZSSI, ZLBDG, ZAI, ZCJ, ZLSFACT, & + P_TH_DEPG, P_RG_DEPG ) P_RG_DEPG(:) = P_RG_DEPG(:) * ZPF1D(:) P_TH_DEPG(:) = P_RG_DEPG(:) * ZLSFACT(:) ! @@ -818,12 +905,13 @@ IF (LWARM .AND. LCOLD .AND. LSNOW) THEN ! CALL LIMA_DROPLETS_RIMING_SNOW (PTSTEP, LDCOMPUTE, & ! depends on CF PRHODREF, ZT, & - ZRCT/ZCF1D, PCCT/ZCF1D, ZRST/ZPF1D, ZLBDC, ZLBDS, ZLVFACT, ZLSFACT, & - P_TH_RIM, P_RC_RIM, P_CC_RIM, P_RS_RIM, P_RG_RIM, & + ZRCT/ZCF1D, PCCT/ZCF1D, ZRST/ZPF1D, PCST/ZPF1D, ZLBDC, ZLBDS, ZLVFACT, ZLSFACT, & + P_TH_RIM, P_RC_RIM, P_CC_RIM, P_RS_RIM, P_CS_RIM, P_RG_RIM, & P_RI_HMS, P_CI_HMS, P_RS_HMS ) P_RC_RIM(:) = P_RC_RIM(:) * ZCF1D(:) P_CC_RIM(:) = P_CC_RIM(:) * ZCF1D(:) P_RS_RIM(:) = P_RS_RIM(:) * ZCF1D(:) + P_CS_RIM(:) = P_CS_RIM(:) * ZCF1D(:) P_RG_RIM(:) = P_RG_RIM(:) * ZCF1D(:) P_TH_RIM(:) = - P_RC_RIM(:) * (ZLSFACT(:)-ZLVFACT(:)) P_RI_HMS(:) = P_RI_HMS(:) * ZCF1D(:) @@ -835,7 +923,9 @@ IF (LWARM .AND. LCOLD .AND. LSNOW) THEN PA_RI(:) = PA_RI(:) + P_RI_HMS(:) IF (NMOM_I.GE.2) PA_CI(:) = PA_CI(:) + P_CI_HMS(:) PA_RS(:) = PA_RS(:) + P_RS_RIM(:) + P_RS_HMS(:) + IF (NMOM_S.GE.2) PA_CS(:) = PA_CS(:) + P_CS_RIM(:) PA_RG(:) = PA_RG(:) + P_RG_RIM(:) + IF (NMOM_G.GE.2) PA_CG(:) = PA_CG(:) - P_CS_RIM(:) PA_TH(:) = PA_TH(:) + P_TH_RIM(:) END IF @@ -843,18 +933,21 @@ END IF IF (LWARM .AND. LRAIN .AND. LCOLD .AND. LSNOW) THEN CALL LIMA_RAIN_ACCR_SNOW (PTSTEP, LDCOMPUTE, & ! depends on PF PRHODREF, ZT, & - ZRRT/ZPF1D, PCRT/ZPF1D, ZRST/ZPF1D, ZLBDR, ZLBDS, ZLVFACT, ZLSFACT, & - P_TH_ACC, P_RR_ACC, P_CR_ACC, P_RS_ACC, P_RG_ACC ) + ZRRT/ZPF1D, PCRT/ZPF1D, ZRST/ZPF1D, PCST/ZPF1D, ZLBDR, ZLBDS, ZLVFACT, ZLSFACT, & + P_TH_ACC, P_RR_ACC, P_CR_ACC, P_RS_ACC, P_CS_ACC, P_RG_ACC ) P_RR_ACC(:) = P_RR_ACC(:) * ZPF1D(:) P_CR_ACC(:) = P_CR_ACC(:) * ZPF1D(:) P_RS_ACC(:) = P_RS_ACC(:) * ZPF1D(:) + P_CS_ACC(:) = P_CS_ACC(:) * ZPF1D(:) P_RG_ACC(:) = P_RG_ACC(:) * ZPF1D(:) P_TH_ACC(:) = - P_RR_ACC(:) * (ZLSFACT(:)-ZLVFACT(:)) ! PA_RR(:) = PA_RR(:) + P_RR_ACC(:) IF (NMOM_R.GE.2) PA_CR(:) = PA_CR(:) + P_CR_ACC(:) PA_RS(:) = PA_RS(:) + P_RS_ACC(:) + IF (NMOM_S.GE.2) PA_CS(:) = PA_CS(:) + P_CS_ACC(:) PA_RG(:) = PA_RG(:) + P_RG_ACC(:) + IF (NMOM_G.GE.2) PA_CG(:) = PA_CG(:) - P_CS_ACC(:) PA_TH(:) = PA_TH(:) + P_TH_ACC(:) END IF @@ -866,12 +959,15 @@ IF (LWARM .AND. LCOLD .AND. LSNOW) THEN ! CALL LIMA_CONVERSION_MELTING_SNOW (LDCOMPUTE, & ! depends on PF PRHODREF, PPABST, ZT, ZKA, ZDV, ZCJ, & - PRVT, ZRST/ZPF1D, ZLBDS, & - P_RS_CMEL ) + PRVT, ZRST/ZPF1D, PCST/ZPF1D, ZLBDS, & + P_RS_CMEL, P_CS_CMEL ) P_RS_CMEL(:) = P_RS_CMEL(:) * ZPF1D(:) + P_CS_CMEL(:) = P_CS_CMEL(:) * ZPF1D(:) ! PA_RS(:) = PA_RS(:) + P_RS_CMEL(:) + IF (NMOM_S.GE.2) PA_CS(:) = PA_CS(:) + P_CS_CMEL(:) PA_RG(:) = PA_RG(:) - P_RS_CMEL(:) + IF (NMOM_G.GE.2) PA_CG(:) = PA_CG(:) - P_CS_CMEL(:) END IF ! @@ -892,6 +988,7 @@ IF (LWARM .AND. LRAIN .AND. LCOLD ) THEN PA_RI(:) = PA_RI(:) + P_RI_CFRZ(:) IF (NMOM_I.GE.2) PA_CI(:) = PA_CI(:) + P_CI_CFRZ(:) PA_RG(:) = PA_RG(:) - P_RR_CFRZ(:) - P_RI_CFRZ(:) + IF (NMOM_G.GE.2) PA_CG(:) = PA_CG(:) - P_CR_CFRZ(:) END IF ! @@ -902,7 +999,7 @@ IF (LWARM .AND. LCOLD .AND. LSNOW .AND. LCIBU) THEN ! CALL LIMA_COLLISIONAL_ICE_BREAKUP (LDCOMPUTE, & ! depends on PF (IF for fragments size) PRHODREF, & - ZRIT/ZIF1D, ZRST/ZPF1D, ZRGT/ZPF1D, PCIT/ZIF1D, & + ZRIT/ZIF1D, ZRST/ZPF1D, ZRGT/ZPF1D, PCIT/ZIF1D, PCST/ZPF1D, PCST/ZPF1D, & ZLBDS, ZLBDG, & P_RI_CIBU, P_CI_CIBU ) P_RI_CIBU(:) = P_RI_CIBU(:) * ZPF1D(:) @@ -944,25 +1041,42 @@ IF (LWARM .AND. LCOLD) THEN CALL LIMA_GRAUPEL (PTSTEP, LDCOMPUTE, & ! depends on PF, CF, IF PRHODREF, PPABST, ZT, ZKA, ZDV, ZCJ, & PRVT, ZRCT, ZRRT, ZRIT, ZRST, ZRGT, & - PCCT, PCRT, PCIT, & + PCCT, PCRT, PCIT, PCST, PCGT, & ZLBDC, ZLBDR, ZLBDS, ZLBDG, & ZLVFACT, ZLSFACT, & P_TH_WETG, P_RC_WETG, P_CC_WETG, P_RR_WETG, P_CR_WETG, & - P_RI_WETG, P_CI_WETG, P_RS_WETG, P_RG_WETG, P_RH_WETG, & + P_RI_WETG, P_CI_WETG, P_RS_WETG, P_CS_WETG, P_RG_WETG, P_CG_WETG, P_RH_WETG, & P_TH_DRYG, P_RC_DRYG, P_CC_DRYG, P_RR_DRYG, P_CR_DRYG, & - P_RI_DRYG, P_CI_DRYG, P_RS_DRYG, P_RG_DRYG, & + P_RI_DRYG, P_CI_DRYG, P_RS_DRYG, P_CS_DRYG, P_RG_DRYG, & P_RI_HMG, P_CI_HMG, P_RG_HMG, & - P_TH_GMLT, P_RR_GMLT, P_CR_GMLT, & + P_TH_GMLT, P_RR_GMLT, P_CR_GMLT, P_CG_GMLT, & PA_TH, PA_RC, PA_CC, PA_RR, PA_CR, & - PA_RI, PA_CI, PA_RS, PA_RG, PA_RH ) + PA_RI, PA_CI, PA_RS, PA_CS, PA_RG, PA_CG, PA_RH, PA_CH ) END IF ! IF (LWARM .AND. LCOLD .AND. LHAIL) THEN -! CALL LIMA_HAIL_GROWTH - -! CALL LIMA_HAIL_CONVERSION - -! CALL LIMA_HAIL_MELTING + CALL LIMA_HAIL_DEPOSITION (LDCOMPUTE, PRHODREF, & ! depends on PF ? + ZRHT/ZPF1D, PCHT/ZPF1D, ZSSI, ZLBDH, ZAI, ZCJ, ZLSFACT, & + P_TH_DEPH, P_RH_DEPH ) + P_RH_DEPH(:) = P_RH_DEPH(:) * ZPF1D(:) + P_TH_DEPH(:) = P_RH_DEPH(:) * ZLSFACT(:) + ! + PA_RV(:) = PA_RV(:) - P_RH_DEPH(:) + PA_RH(:) = PA_RH(:) + P_RH_DEPH(:) + PA_TH(:) = PA_TH(:) + P_TH_DEPH(:) +! CALL LIMA_HAIL_GROWTH LIMA_HAIL_CONVERSION LIMA_HAIL_MELTING + CALL LIMA_HAIL (PTSTEP, LDCOMPUTE, & ! depends on PF, CF, IF + PRHODREF, PPABST, ZT, ZKA, ZDV, ZCJ, & + PRVT, ZRCT, ZRRT, ZRIT, ZRST, ZRGT, ZRHT, & + PCCT, PCRT, PCIT, PCST, PCGT, PCHT, & + ZLBDC, ZLBDR, ZLBDS, ZLBDG, ZLBDH, & + ZLVFACT, ZLSFACT, & + P_TH_WETH, P_RC_WETH, P_CC_WETH, P_RR_WETH, P_CR_WETH, & + P_RI_WETH, P_CI_WETH, P_RS_WETH, P_CS_WETH, P_RG_WETH, P_CG_WETH, P_RH_WETH, & + P_RG_COHG, P_CG_COHG, & + P_TH_HMLT, P_RR_HMLT, P_CR_HMLT, P_CH_HMLT, & + PA_TH, PA_RC, PA_CC, PA_RR, PA_CR, & + PA_RI, PA_CI, PA_RS, PA_CS, PA_RG, PA_CG, PA_RH, PA_CH ) END IF ! END SUBROUTINE LIMA_TENDENCIES diff --git a/src/MNH/modd_param_lima_cold.f90 b/src/MNH/modd_param_lima_cold.f90 index 3ae77bb76..3801cfcb7 100644 --- a/src/MNH/modd_param_lima_cold.f90 +++ b/src/MNH/modd_param_lima_cold.f90 @@ -20,7 +20,8 @@ !! ------------- !! Original ??/??/13 !! C. Barthe 14/03/2022 add CIBU and RDSF -! J. Wurtz 03/2022: new snow characteristics +! J. Wurtz 03/2022: new snow characteristics +! M. Taufour 07/2022: add concentration for snow, graupel, hail !! !------------------------------------------------------------------------------- USE MODD_PARAMETERS, ONLY: JPSVNAMELGTMAX @@ -57,8 +58,9 @@ REAL,SAVE :: XLBDAS_MIN, XLBDAS_MAX ! Max values allowed for the shape paramet 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', & +CHARACTER(LEN=JPSVNAMELGTMAX),DIMENSION(8),PARAMETER & + :: CLIMA_COLD_NAMES=(/'CICE ','CSNOW ','CGRAUPEL','CHAIL ',& + 'CIFNFREE','CIFNNUCL', & 'CCNINIMM','CCCNNUCL'/) ! basenames of the SV articles stored ! in the binary files @@ -66,8 +68,8 @@ CHARACTER(LEN=JPSVNAMELGTMAX),DIMENSION(5),PARAMETER & ! IN:Ice-nuclei Nucleated (activated IFN by Dep/Cond) ! NI:Nuclei Immersed (activated IFN by Imm) ! HF:Homogeneous Freezing -CHARACTER(LEN=JPSVNAMELGTMAX),DIMENSION(5),PARAMETER & - :: CLIMA_COLD_CONC=(/'NI ','NIF','NIN','NNI','NNH'/)!for DIAG +CHARACTER(LEN=JPSVNAMELGTMAX),DIMENSION(8),PARAMETER & + :: CLIMA_COLD_CONC=(/'NI ','NS ','NG ','NH ','NIF','NIN','NNI','NNH'/)!for DIAG ! !------------------------------------------------------------------------------- ! @@ -75,7 +77,8 @@ CHARACTER(LEN=JPSVNAMELGTMAX),DIMENSION(5),PARAMETER & ! --------------------- ! REAL,SAVE :: XFSEDRI,XFSEDCI, & ! Constants for sedimentation - XFSEDS, XEXSEDS ! fluxes of ice and snow + XFSEDRS,XFSEDCS, & ! + XFSEDS, XEXSEDS ! fluxes of ice and snow ! REAL,SAVE :: XNUC_DEP,XEXSI_DEP,XEX_DEP, & ! Constants for heterogeneous XNUC_CON,XEXTT_CON,XEX_CON, & ! ice nucleation : DEP et CON @@ -112,12 +115,21 @@ REAL,SAVE :: XCOLEXIS, & ! Constants for snow XAGGS_RLARGE1,XAGGS_RLARGE2, & XFIAGGS,XEXIAGGS ! +REAL,SAVE :: XACCS1, XSPONBUDS1, XSPONBUDS2, & ! Constant for snow + XSPONBUDS3, XSPONCOEFS2 ! spontaneous break-up +! !?????????????????? REAL,SAVE :: XKER_ZRNIC_A1,XKER_ZRNIC_A2 ! Long-Zrnic Kernels (ini_ice_coma) ! REAL,SAVE :: XSELFI,XCOLEXII ! Constants for pristine ice ! self-collection (ini_ice_coma) ! +REAL,DIMENSION(:,:), SAVE, ALLOCATABLE :: XKER_N_SSCS +REAL,SAVE :: XCOLSS,XCOLEXSS,XFNSSCS, & ! + XLBNSSCS1,XLBNSSCS2, & ! Constants for snow self collection + XSCINTP1S,XSCINTP2S ! +INTEGER,SAVE :: NSCLBDAS ! + REAL,SAVE :: XAUTO3, XAUTO4, & ! Constants for pristine ice XLAUTS, XLAUTS_THRESHOLD, & ! autoconversion : AUT XITAUTS, XITAUTS_THRESHOLD, & ! (ini_ice_com) diff --git a/src/MNH/modd_param_lima_mixed.f90 b/src/MNH/modd_param_lima_mixed.f90 index 6074d09fb..6a9c763dc 100644 --- a/src/MNH/modd_param_lima_mixed.f90 +++ b/src/MNH/modd_param_lima_mixed.f90 @@ -15,7 +15,8 @@ !! ------------- !! Original ??/??/13 !! C. Barthe 14/03/2022 add CIBU and RDSF -! J. Wurtz 03/2022: new snow characteristics +! J. Wurtz 03/2022: new snow characteristics +! M. Taufour 07/2022: add concentration for snow, graupel, hail !! !------------------------------------------------------------------------------- ! @@ -41,7 +42,7 @@ IMPLICIT NONE ! distribution law ! REAL,SAVE :: XAG,XBG,XCG,XDG,XCCG,XCXG,XF0G,XF1G,XC1G ! Graupel charact. -REAL,SAVE :: XLBEXG,XLBG ! Graupel distribution parameters +REAL,SAVE :: XLBEXG,XLBG,XNG ! Graupel distribution parameters REAL,SAVE :: XLBDAG_MAX ! Max values allowed for the shape ! parameter of graupeln ! @@ -90,7 +91,7 @@ REAL, DIMENSION(:), SAVE, ALLOCATABLE & !* 3. MICROPHYSICAL FACTORS - Graupel ! ------------------------------- ! -REAL,SAVE :: XFSEDG, XEXSEDG ! Sedimentation fluxes of Graupel +REAL,SAVE :: XFSEDG, XEXSEDG, XFSEDRG, XFSEDCG ! Sedimentation fluxes of Graupel ! REAL,SAVE :: X0DEPG,X1DEPG,XEX0DEPG,XEX1DEPG ! Deposition on graupel ! @@ -119,9 +120,15 @@ REAL, DIMENSION(:), SAVE, ALLOCATABLE & XGAMINC_HMC ! and for the HM process ! REAL,SAVE :: XFRACCSS, & ! Constants for the accretion + XFNRACCSS, & ! Constants for the accretion XLBRACCS1,XLBRACCS2,XLBRACCS3, & ! raindrops onto the aggregates + XLBNRACCS1,XLBNRACCS2,XLBNRACCS3, & ! raindrops onto the aggregates XFSACCRG, & ! ACC (processes RACCSS and + XFNSACCRG, & ! ACC (processes RACCSS and XLBSACCR1,XLBSACCR2,XLBSACCR3, & ! SACCRG) + XLBNSACCR1,XLBNSACCR2,XLBNSACCR3, & ! SACCRG) + XSCLBDAS_MIN, & ! Min val. of Lbda_s for ACC + XSCLBDAS_MAX, & ! Max val. of Lbda_s for ACC XACCLBDAS_MIN, & ! Min val. of Lbda_s for ACC XACCLBDAS_MAX, & ! Max val. of Lbda_s for ACC XACCLBDAR_MIN, & ! Min val. of Lbda_r for ACC @@ -137,7 +144,10 @@ INTEGER,SAVE :: NACCLBDAS, & ! Number of Lbda_s values and REAL,DIMENSION(:,:), SAVE, ALLOCATABLE & :: XKER_RACCSS, & ! Normalized kernel for RACCSS XKER_RACCS, & ! Normalized kernel for RACCS - XKER_SACCRG ! Normalized kernel for SACCRG + XKER_SACCRG, & ! Normalized kernel for SACCRG + XKER_N_RACCSS, & ! Normalized kernel for RACCSS + XKER_N_RACCS, & ! Normalized kernel for RACCS + XKER_N_SACCRG ! Normalized kernel for SACCRG REAL,SAVE :: XFSCVMG ! Melting-conversion factor of ! the aggregates ! @@ -148,10 +158,12 @@ REAL,SAVE :: XCOLIR, & ! Constants for rain contact REAL,SAVE :: XFCDRYG, & ! Constants for the dry growth XCOLCG, & ! of the graupeln : XCOLIG,XCOLEXIG,XFIDRYG, & ! - XCOLSG,XCOLEXSG,XFSDRYG, & ! RCDRYG + XCOLSG,XCOLEXSG,XFSDRYG,XFNSDRYG, & ! RCDRYG XLBSDRYG1,XLBSDRYG2,XLBSDRYG3, & ! RIDRYG - XFRDRYG, & ! RSDRYG + XLBNSDRYG1,XLBNSDRYG2,XLBNSDRYG3, & ! RIDRYG + XFRDRYG,XFNRDRYG, & ! RSDRYG XLBRDRYG1,XLBRDRYG2,XLBRDRYG3, & ! RRDRYG + XLBNRDRYG1,XLBNRDRYG2,XLBNRDRYG3, & ! RRDRYG XDRYLBDAR_MIN, & ! Min val. of Lbda_r for DRY XDRYLBDAR_MAX, & ! Max val. of Lbda_r for DRY XDRYLBDAS_MIN, & ! Min val. of Lbda_s for DRY @@ -169,22 +181,26 @@ INTEGER,SAVE :: NDRYLBDAR, & ! Number of Lbda_r, ! tables REAL,DIMENSION(:,:), SAVE, ALLOCATABLE & :: XKER_SDRYG, & ! Normalized kernel for SDRYG - XKER_RDRYG ! Normalized kernel for RDRYG + XKER_RDRYG, & ! Normalized kernel for RDRYG + XKER_N_SDRYG, & ! Normalized kernel for RDRYG + XKER_N_RDRYG ! Normalized kernel for RDRYG ! !------------------------------------------------------------------------------- ! !* 4. MICROPHYSICAL FACTORS - Hail ! ---------------------------- ! -REAL,SAVE :: XFSEDH,XEXSEDH ! Constants for sedimentation +REAL,SAVE :: XFSEDH,XEXSEDH,XFSEDRH,XFSEDCH ! Constants for sedimentation ! ! REAL,SAVE :: X0DEPH,X1DEPH,XEX0DEPH,XEX1DEPH ! Constants for deposition ! -REAL,SAVE :: XFWETH,XFSWETH, & ! Constants for the wet growth +REAL,SAVE :: XFWETH,XFSWETH,XFNSWETH, & ! Constants for the wet growth XLBSWETH1,XLBSWETH2,XLBSWETH3, & ! of the hailstones : WET - XFGWETH, & ! processes RSWETH + XLBNSWETH1,XLBNSWETH2,XLBNSWETH3, & ! of the hailstones : WET + XFGWETH, XFNGWETH, & ! processes RSWETH XLBGWETH1,XLBGWETH2,XLBGWETH3, & ! RGWETH + XLBNGWETH1,XLBNGWETH2,XLBNGWETH3, & ! RGWETH XWETLBDAS_MIN, & ! Min val. of Lbda_s for WET XWETLBDAS_MAX, & ! Max val. of Lbda_s for WET XWETLBDAG_MIN, & ! Min val. of Lbda_g for WET @@ -202,7 +218,9 @@ INTEGER,SAVE :: NWETLBDAS, & ! Number of Lbda_s, ! tables REAL,DIMENSION(:,:), SAVE, ALLOCATABLE & :: XKER_SWETH, & ! Normalized kernel for SWETH - XKER_GWETH ! Normalized kernel for GWETH + XKER_GWETH, & ! Normalized kernel for GWETH + XKER_N_SWETH, & ! Normalized kernel for GWETH + XKER_N_GWETH ! Normalized kernel for GWETH ! !------------------------------------------------------------------------------- diff --git a/src/MNH/modd_param_lima_warm.f90 b/src/MNH/modd_param_lima_warm.f90 index 8089a5f5d..cf555286d 100644 --- a/src/MNH/modd_param_lima_warm.f90 +++ b/src/MNH/modd_param_lima_warm.f90 @@ -29,7 +29,7 @@ IMPLICIT NONE ! ---------------------- ! REAL,SAVE :: XLBC, XLBEXC, & ! shape parameters of the cloud droplets - XLBR, XLBEXR ! shape parameters of the raindrops + XLBR, XLBEXR, XNR ! shape parameters of the raindrops ! REAL,SAVE :: XAR,XBR,XCR,XDR,XF0R,XF1R, & ! Raindrop charact. XCCR,XCXR, & !For diagnostics diff --git a/src/MNH/radar_rain_ice.f90 b/src/MNH/radar_rain_ice.f90 index 027372e44..c8ff0e2d5 100644 --- a/src/MNH/radar_rain_ice.f90 +++ b/src/MNH/radar_rain_ice.f90 @@ -9,7 +9,7 @@ ! INTERFACE SUBROUTINE RADAR_RAIN_ICE(PRT,PCIT,PRHODREF,PTEMP,PRARE,PVDOP,PRZDR,PRKDP,& - PCRT) + PCRT,PCST,PCGT,PCHT) ! REAL, DIMENSION(:,:,:,:), INTENT(IN) :: PRT ! microphysical mix. ratios at t REAL, DIMENSION(:,:,:), INTENT(IN) :: PCIT ! pristine ice concentration at t @@ -23,7 +23,9 @@ REAL, DIMENSION(:,:,:), INTENT(OUT) :: PRZDR! radar differential reflectivity REAL, DIMENSION(:,:,:), INTENT(OUT) :: PRKDP! radar differential phase shift ! H-V in degree/km REAL, DIMENSION(:,:,:), INTENT(IN),OPTIONAL :: PCRT ! rain concentration at t - +REAL, DIMENSION(:,:,:), INTENT(IN),OPTIONAL :: PCST ! snow concentration at t ! +REAL, DIMENSION(:,:,:), INTENT(IN),OPTIONAL :: PCGT ! graupel concentration at t ! +REAL, DIMENSION(:,:,:), INTENT(IN),OPTIONAL :: PCHT ! hail concentration at t ! ! END SUBROUTINE RADAR_RAIN_ICE ! @@ -31,7 +33,7 @@ END INTERFACE ! END MODULE MODI_RADAR_RAIN_ICE ! ######################################################################### - SUBROUTINE RADAR_RAIN_ICE(PRT,PCIT,PRHODREF,PTEMP,PRARE,PVDOP,PRZDR,PRKDP,PCRT) + SUBROUTINE RADAR_RAIN_ICE(PRT,PCIT,PRHODREF,PTEMP,PRARE,PVDOP,PRZDR,PRKDP,PCRT,PCST,PCGT,PCHT) ! ######################################################################### ! !!**** *RADAR_RAIN_ICE * - computes some pertinent radar parameters @@ -125,7 +127,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, LSNOW_T_L=>LSNOW_T + XRTMIN_L=>XRTMIN,XALPHAC_L=>XALPHAC,XNUC_L=>XNUC,LSNOW_T_L=>LSNOW_T,NMOM_S,NMOM_G,NMOM_H USE MODD_PARAMETERS USE MODD_PARAM_n, ONLY : CCLOUD USE MODD_LUNIT @@ -147,6 +149,9 @@ REAL, DIMENSION(:,:,:), INTENT(OUT) :: PRZDR! radar differential reflectivity REAL, DIMENSION(:,:,:), INTENT(OUT) :: PRKDP! radar differential phase shift ! H-V in degree/km REAL, DIMENSION(:,:,:), INTENT(IN),OPTIONAL :: PCRT ! rain concentration at t +REAL, DIMENSION(:,:,:), INTENT(IN),OPTIONAL :: PCST ! snow concentration at t +REAL, DIMENSION(:,:,:), INTENT(IN),OPTIONAL :: PCGT ! graupel concentration at t +REAL, DIMENSION(:,:,:), INTENT(IN),OPTIONAL :: PCHT ! hail concentration at t ! !* 0.2 Declarations of local variables : ! @@ -338,7 +343,11 @@ IF (SIZE(PRT,4) >= 5) THEN 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(:,:,:)=XNS_L*PRHODREF(:,:,:)*PRT(:,:,:,5)*ZLBDA(:,:,:)**XBS_L + IF (NMOM_S.GE.2) THEN + ZN(:,:,:)=PCST(:,:,:) + ELSE + ZN(:,:,:)=XNS_L*PRHODREF(:,:,:)*PRT(:,:,:,5)*ZLBDA(:,:,:)**XBS_L + END IF WHERE( PRT(:,:,:,5).GT.XRTMIN_L(5) ) ZW(:,:,:) = ZEQICE*ZDMELT_FACT & *1.E18*ZN(:,:,:)*(ZLBDA(:,:,:)**(-ZEXP))*MOMG(XALPHAS_L,XNUS_L,ZEXP) @@ -366,14 +375,25 @@ IF (SIZE(PRT,4) >= 5) THEN 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) ) - ZLBDA(:,:,:) = XLBS_L*( PRHODREF(:,:,:)*PRT(:,:,:,5) )**XLBEXS_L - ZW(:,:,:) = ZEQICE*ZDMELT_FACT & + if (NMOM_S.GE.2) then + WHERE( PRT(:,:,:,5).GT.XRTMIN_L(5) .AND. PCST(:,:,:).GT.0.0) + ZLBDA(:,:,:) = XLBS_L**(XLBEXS_L)*(PRT(:,:,:,5)/PCST(:,:,:))**(-XLBEXS_L) + ZW(:,:,:) = ZEQICE*ZDMELT_FACT & + *1.E18*PRHODREF(:,:,:)*PCST(:,:,:)*(ZLBDA(:,:,:)**(-ZEXP))*MOMG(XALPHAS_L,XNUS_L,ZEXP) + PVDOP(:,:,:) = PVDOP(:,:,:)+ZEQICE*ZDMELT_FACT*MOMG(XALPHAS_L,XNUS_L,ZEXP+XDS_L) & + *1.E18*PRHODREF(:,:,:)*PCST(:,:,:)*XCS_L*(ZLBDA(:,:,:)**(-ZEXP-XDS_L)) + PRARE(:,:,:) = PRARE(:,:,:) + ZW(:,:,:) + END WHERE + else + WHERE( PRT(:,:,:,5).GT.XRTMIN_L(5) ) + ZLBDA(:,:,:) = XLBS_L*( PRHODREF(:,:,:)*PRT(:,:,:,5) )**XLBEXS_L + ZW(:,:,:) = ZEQICE*ZDMELT_FACT & *1.E18*XCCS_L*(ZLBDA(:,:,:)**(XCXS_L-ZEXP))*MOMG(XALPHAS_L,XNUS_L,ZEXP) - PVDOP(:,:,:) = PVDOP(:,:,:)+ZEQICE*ZDMELT_FACT*MOMG(XALPHAS_L,XNUS_L,ZEXP+XDS_L) & + PVDOP(:,:,:) = PVDOP(:,:,:)+ZEQICE*ZDMELT_FACT*MOMG(XALPHAS_L,XNUS_L,ZEXP+XDS_L) & *1.E18*XCCS_L*XCS_L*(ZLBDA(:,:,:)**(XCXS_L-ZEXP-XDS_L)) - PRARE(:,:,:) = PRARE(:,:,:) + ZW(:,:,:) - END WHERE + PRARE(:,:,:) = PRARE(:,:,:) + ZW(:,:,:) + END WHERE + end if ELSE ZDMELT_FACT = ( (6.0*XAS_I)/(XPI*XRHOLW) )**(2.0) ZEXP = 2.0*XBS_I @@ -402,15 +422,27 @@ IF (SIZE(PRT,4) >= 6) THEN END WHERE ! ZEXP = 2.0*XBG_L - WHERE( PRT(:,:,:,6).GT.XRTMIN_L(6) ) - ZLBDA(:,:,:) = XLBG_L*( PRHODREF(:,:,:)*PRT(:,:,:,6) )**XLBEXG_L - ZW(:,:,:) = ZREFL_MELT_CONV(:,:,:)*1.E18*XCCG_L* & - (ZLBDA(:,:,:)**(XCXG_L-ZEXP))*MOMG(XALPHAG_L,XNUG_L,ZEXP) - PVDOP(:,:,:) = PVDOP(:,:,:) + & - ZREFL_MELT_CONV(:,:,:)*1.E18*XCCG_L*XCG_L* & - (ZLBDA(:,:,:)**(XCXG_L-ZEXP-XDG_L))*MOMG(XALPHAG_L,XNUG_L,ZEXP+XDG_L) - PRARE(:,:,:) = PRARE(:,:,:) + ZW(:,:,:) - END WHERE + if(NMOM_G.GE.2) then + WHERE( PRT(:,:,:,6).GT.XRTMIN_L(6) .AND. PCGT(:,:,:).GT.1.0E-3 ) + ZLBDA(:,:,:) = XLBG_L**(XLBEXG_L)*(PRT(:,:,:,6)/PCGT(:,:,:))**(-XLBEXG_L) + ZW(:,:,:) = ZREFL_MELT_CONV(:,:,:) & + *1.E18*PRHODREF(:,:,:)*PCGT(:,:,:)*(ZLBDA(:,:,:)**(-ZEXP))*MOMG(XALPHAG_L,XNUG_L,ZEXP) + PVDOP(:,:,:) = PVDOP(:,:,:) + & + ZREFL_MELT_CONV(:,:,:)*1.E18 & + *1.E18*PRHODREF(:,:,:)*PCGT(:,:,:)*XCG_L*(ZLBDA(:,:,:)**(-ZEXP-XDG_L)) + PRARE(:,:,:) = PRARE(:,:,:) + ZW(:,:,:) + END WHERE + else + WHERE( PRT(:,:,:,6).GT.XRTMIN_L(6) ) + ZLBDA(:,:,:) = XLBG_L*( PRHODREF(:,:,:)*PRT(:,:,:,6) )**XLBEXG_L + ZW(:,:,:) = ZREFL_MELT_CONV(:,:,:)*1.E18*XCCG_L* & + (ZLBDA(:,:,:)**(XCXG_L-ZEXP))*MOMG(XALPHAG_L,XNUG_L,ZEXP) + PVDOP(:,:,:) = PVDOP(:,:,:) + & + ZREFL_MELT_CONV(:,:,:)*1.E18*XCCG_L*XCG_L* & + (ZLBDA(:,:,:)**(XCXG_L-ZEXP-XDG_L))*MOMG(XALPHAG_L,XNUG_L,ZEXP+XDG_L) + PRARE(:,:,:) = PRARE(:,:,:) + ZW(:,:,:) + END WHERE + end if ELSE ZFRAC_WATER = 0.14 ZDMELT_FACT = ( (6.0*XAG_I)/(XPI*XRHOLW) )**(2.0) @@ -443,15 +475,27 @@ IF (SIZE(PRT,4) >= 7) THEN ZREFL_MELT_CONV(:,:,:) = ((1.0-ZFRAC_WATER)*ZEQICE+ZFRAC_WATER)*ZDMELT_FACT ! ZEXP = 2.0*XBH_L - WHERE( PRT(:,:,:,7).GT.XRTMIN_L(7) ) - ZLBDA(:,:,:) = XLBH_L*( PRHODREF(:,:,:)*PRT(:,:,:,7) )**XLBEXH_L - ZW(:,:,:) = ZREFL_MELT_CONV(:,:,:)*1.E18*XCCH_L* & - (ZLBDA(:,:,:)**(XCXH_L-ZEXP))*MOMG(XALPHAH_L,XNUH_L,ZEXP) - PVDOP(:,:,:) = PVDOP(:,:,:) + & - ZREFL_MELT_CONV(:,:,:)*1.E18*XCCH_L*XCH_L* & - (ZLBDA(:,:,:)**(XCXH_L-ZEXP-XDH_L))*MOMG(XALPHAH_L,XNUH_L,ZEXP+XDH_L) - PRARE(:,:,:) = PRARE(:,:,:) + ZW(:,:,:) - END WHERE + if (NMOM_H.GE.2) then + WHERE( PRT(:,:,:,7).GT.XRTMIN_L(7) .AND. PCHT(:,:,:).GT.1.0E-3 ) + ZLBDA(:,:,:) = XLBH_L**(XLBEXH_L)*(PRT(:,:,:,7)/PCHT(:,:,:))**(-XLBEXH_L) + ZW(:,:,:) = ZREFL_MELT_CONV(:,:,:) & + *1.E18*PRHODREF(:,:,:)*PCHT(:,:,:)*(ZLBDA(:,:,:)**(-ZEXP))*MOMG(XALPHAH_L,XNUH_L,ZEXP) + PVDOP(:,:,:) = PVDOP(:,:,:) + & + ZREFL_MELT_CONV(:,:,:) & + *1.E18*PRHODREF(:,:,:)*PCHT(:,:,:)*XCH_L*(ZLBDA(:,:,:)**(-ZEXP-XDH_L)) + PRARE(:,:,:) = PRARE(:,:,:) + ZW(:,:,:) + END WHERE + else + WHERE( PRT(:,:,:,7).GT.XRTMIN_L(7) ) + ZLBDA(:,:,:) = XLBH_L*( PRHODREF(:,:,:)*PRT(:,:,:,7) )**XLBEXH_L + ZW(:,:,:) = ZREFL_MELT_CONV(:,:,:)*1.E18*XCCH_L* & + (ZLBDA(:,:,:)**(XCXH_L-ZEXP))*MOMG(XALPHAH_L,XNUH_L,ZEXP) + PVDOP(:,:,:) = PVDOP(:,:,:) + & + ZREFL_MELT_CONV(:,:,:)*1.E18*XCCH_L*XCH_L* & + (ZLBDA(:,:,:)**(XCXH_L-ZEXP-XDH_L))*MOMG(XALPHAH_L,XNUH_L,ZEXP+XDH_L) + PRARE(:,:,:) = PRARE(:,:,:) + ZW(:,:,:) + END WHERE + end if ELSE ZFRAC_WATER = 1. ZDMELT_FACT = ( (6.0*XAH_I)/(XPI*XRHOLW) )**(2.0) diff --git a/src/MNH/sources_neg_correct.f90 b/src/MNH/sources_neg_correct.f90 index aa5978a54..2160bf2d4 100644 --- a/src/MNH/sources_neg_correct.f90 +++ b/src/MNH/sources_neg_correct.f90 @@ -27,9 +27,10 @@ use modd_budget, only: lbudget_th, lbudget_rv, lbudget_rc, lbudget_rr, lbudg NBUDGET_RS, NBUDGET_RG, NBUDGET_RH, NBUDGET_SV1, & tbudgets use modd_cst, only: xci, xcl, xcpd, xcpv, xlstt, xlvtt, xp00, xrd, xtt -use modd_nsv, only: nsv_c2r2beg, nsv_c2r2end, nsv_lima_beg, nsv_lima_end, nsv_lima_nc, nsv_lima_nr, nsv_lima_ni +use modd_nsv, only: nsv_c2r2beg, nsv_c2r2end, nsv_lima_beg, nsv_lima_end, nsv_lima_nc, nsv_lima_nr,& + nsv_lima_ni, nsv_lima_ns, nsv_lima_ng, nsv_lima_nh use modd_param_lima, only: lcold_lima => lcold, lrain_lima => lrain, lspro_lima => lspro, lwarm_lima => lwarm, & - xctmin_lima => xctmin, xrtmin_lima => xrtmin, nmom_c, nmom_r, nmom_i + xctmin_lima => xctmin, xrtmin_lima => xrtmin, nmom_c, nmom_r, nmom_i, nmom_s, nmom_g, nmom_h use mode_budget, only: Budget_store_init, Budget_store_end use mode_msg @@ -237,77 +238,109 @@ CLOUD: select case ( hcloud ) ! ! case( 'LIMA' ) - allocate( zmask ( Size( prths, 1 ), Size( prths, 2 ), Size( prths, 3 ) ) ) + allocate( zmask ( Size( prths, 1 ), Size( prths, 2 ), Size( prths, 3 ) ) ) ! Correction where rc<0 or Nc<0 - if ( lwarm_lima ) then - zmask(:,:,:)=(prrs(:, :, :, 2) < xrtmin_lima(2) / ptstep) - if (nmom_c.ge.2) zmask(:,:,:)=(zmask(:,:,:) .or. prsvs(:, :, :, nsv_lima_nc) < 0. ) - where ( zmask(:,:,:) ) - prrs(:, :, :, 1) = prrs(:, :, :, 1) + prrs(:, :, :, 2) - prths(:, :, :) = prths(:, :, :) - prrs(:, :, :, 2) * zlv(:, :, :) / & - ( zcph(:, :, :) * zexn(:, :, :) ) - prrs(:, :, :, 2) = 0. - end where - where ( prrs(:, :, :, 1) < 0. .and. prrs(:, :, :, 2) > 0. ) - prrs(:, :, :, 1) = prrs(:, :, :, 1) + prrs(:, :, :, 2) - prths(:, :, :) = prths(:, :, :) - prrs(:, :, :, 2) * zlv(:, :, :) / & - ( zcph(:, :, :) * zexn(:, :, :) ) - prrs(:, :, :, 2) = 0. - end where - if (nmom_c.ge.2) then - where (prrs(:, :, :, 2) == 0.) prsvs(:, :, :, nsv_lima_nc) = 0. - end if - end if + if ( krr.GE.2 ) then + zmask(:,:,:)=(prrs(:, :, :, 2) < xrtmin_lima(2) / ptstep) + if (nmom_c.ge.2) zmask(:,:,:)=(zmask(:,:,:) .or. prsvs(:, :, :, nsv_lima_nc) < 0. ) + where ( zmask(:,:,:) ) + prrs(:, :, :, 1) = prrs(:, :, :, 1) + prrs(:, :, :, 2) + prths(:, :, :) = prths(:, :, :) - prrs(:, :, :, 2) * zlv(:, :, :) / & + ( zcph(:, :, :) * zexn(:, :, :) ) + prrs(:, :, :, 2) = 0. + end where + where ( prrs(:, :, :, 1) < 0. .and. prrs(:, :, :, 2) > 0. ) + prrs(:, :, :, 1) = prrs(:, :, :, 1) + prrs(:, :, :, 2) + prths(:, :, :) = prths(:, :, :) - prrs(:, :, :, 2) * zlv(:, :, :) / & + ( zcph(:, :, :) * zexn(:, :, :) ) + prrs(:, :, :, 2) = 0. + end where + if (nmom_c.ge.2) then + where (prrs(:, :, :, 2) == 0.) prsvs(:, :, :, nsv_lima_nc) = 0. + end if + end if ! Correction where rr<0 or Nr<0 - if ( lwarm_lima .and. lrain_lima ) then - zmask(:,:,:)=(prrs(:, :, :, 3) < xrtmin_lima(3) / ptstep) - if (nmom_r.ge.2) zmask(:,:,:)=(zmask(:,:,:) .or. prsvs(:, :, :, nsv_lima_nr) < 0. ) - where ( zmask(:,:,:) ) - prrs(:, :, :, 1) = prrs(:, :, :, 1) + prrs(:, :, :, 3) - prths(:, :, :) = prths(:, :, :) - prrs(:, :, :, 3) * zlv(:, :, :) / & - ( zcph(:, :, :) * zexn(:, :, :) ) - prrs(:, :, :, 3) = 0. - end where - if (nmom_r.ge.2) then - where (prrs(:, :, :, 3) == 0.) prsvs(:, :, :, nsv_lima_nr) = 0. - end if - end if + if ( krr.GE.3 ) then + zmask(:,:,:)=(prrs(:, :, :, 3) < xrtmin_lima(3) / ptstep) + if (nmom_r.ge.2) zmask(:,:,:)=(zmask(:,:,:) .or. prsvs(:, :, :, nsv_lima_nr) < 0. ) + where ( zmask(:,:,:) ) + prrs(:, :, :, 1) = prrs(:, :, :, 1) + prrs(:, :, :, 3) + prths(:, :, :) = prths(:, :, :) - prrs(:, :, :, 3) * zlv(:, :, :) / & + ( zcph(:, :, :) * zexn(:, :, :) ) + prrs(:, :, :, 3) = 0. + end where + if (nmom_r.ge.2) then + where (prrs(:, :, :, 3) == 0.) prsvs(:, :, :, nsv_lima_nr) = 0. + end if + end if ! Correction where ri<0 or Ni<0 - if ( lcold_lima ) then - zmask(:,:,:)=(prrs(:, :, :, 4) < xrtmin_lima(4) / ptstep) - if (nmom_i.ge.2) zmask(:,:,:)=(zmask(:,:,:) .or. prsvs(:, :, :, nsv_lima_ni) < 0. ) - where ( zmask(:,:,:) ) - prrs(:, :, :, 1) = prrs(:, :, :, 1) + prrs(:, :, :, 4) - prths(:, :, :) = prths(:, :, :) - prrs(:, :, :, 4) * zls(:, :, :) / & - ( zcph(:, :, :) * zexn(:, :, :) ) - prrs(:, :, :, 4) = 0. - end where - if ( hbudname /= 'NETUR' ) then - do jr = 5, Size( prrs, 4 ) - where ( prrs(:, :, :, jr) < 0. ) - prrs(:, :, :, 1) = prrs(:, :, :, 1) + prrs(:, :, :, jr) - prths(:, :, :) = prths(:, :, :) - prrs(:, :, :, jr) * zls(:, :, :) / & - ( zcph(:, :, :) * zexn(:, :, :) ) - prrs(:, :, :, jr) = 0. - end where - end do - end if - if(krr > 3) then + if ( krr.GE.4 ) then + zmask(:,:,:)=(prrs(:, :, :, 4) < xrtmin_lima(4) / ptstep) + if (nmom_i.ge.2) zmask(:,:,:)=(zmask(:,:,:) .or. prsvs(:, :, :, nsv_lima_ni) < 0. ) + where ( zmask(:,:,:) ) + prrs(:, :, :, 1) = prrs(:, :, :, 1) + prrs(:, :, :, 4) + prths(:, :, :) = prths(:, :, :) - prrs(:, :, :, 4) * zls(:, :, :) / & + ( zcph(:, :, :) * zexn(:, :, :) ) + prrs(:, :, :, 4) = 0. + end where + end if + if(krr > 3) then allocate( zcor( Size( prths, 1 ), Size( prths, 2 ), Size( prths, 3 ) ) ) where ( prrs(:, :, :, 1) < 0. .and. prrs(:, :, :, 4) > 0. ) - zcor(:, :, :) = Min( -prrs(:, :, :, 1), prrs(:, :, :, 4) ) - prrs(:, :, :, 1) = prrs(:, :, :, 1) + zcor(:, :, :) - prths(:, :, :) = prths(:, :, :) - zcor(:, :, :) * zls(:, :, :) / & - ( zcph(:, :, :) * zexn(:, :, :) ) - prrs(:, :, :, 4) = prrs(:, :, :, 4) - zcor(:, :, :) + zcor(:, :, :) = Min( -prrs(:, :, :, 1), prrs(:, :, :, 4) ) + prrs(:, :, :, 1) = prrs(:, :, :, 1) + zcor(:, :, :) + prths(:, :, :) = prths(:, :, :) - zcor(:, :, :) * zls(:, :, :) / & + ( zcph(:, :, :) * zexn(:, :, :) ) + prrs(:, :, :, 4) = prrs(:, :, :, 4) - zcor(:, :, :) end where deallocate( zcor ) - end if - if (nmom_i.ge.2) then - where (prrs(:, :, :, 4) == 0.) prsvs(:, :, :, nsv_lima_ni) = 0. - end if - end if - + end if + if (nmom_i.ge.2) then + where (prrs(:, :, :, 4) == 0.) prsvs(:, :, :, nsv_lima_ni) = 0. + end if +! Snow + if ( krr.GE.5 ) then + zmask(:,:,:)=(prrs(:, :, :, 5) < xrtmin_lima(5) / ptstep) + if (nmom_s.ge.2) zmask(:,:,:)=(zmask(:,:,:) .or. prsvs(:, :, :, nsv_lima_ns) < 0. ) + where ( zmask(:,:,:) ) + prrs(:, :, :, 1) = prrs(:, :, :, 1) + prrs(:, :, :, 5) + prths(:, :, :) = prths(:, :, :) - prrs(:, :, :, 5) * zls(:, :, :) / & + ( zcph(:, :, :) * zexn(:, :, :) ) + prrs(:, :, :, 5) = 0. + end where + end if + if (nmom_s.ge.2) then + where (prrs(:, :, :, 5) == 0.) prsvs(:, :, :, nsv_lima_ns) = 0. + end if +! Graupel + if ( krr.GE.6 ) then + zmask(:,:,:)=(prrs(:, :, :, 6) < xrtmin_lima(6) / ptstep) + if (nmom_g.ge.2) zmask(:,:,:)=(zmask(:,:,:) .or. prsvs(:, :, :, nsv_lima_ng) < 0. ) + where ( zmask(:,:,:) ) + prrs(:, :, :, 1) = prrs(:, :, :, 1) + prrs(:, :, :, 6) + prths(:, :, :) = prths(:, :, :) - prrs(:, :, :, 6) * zls(:, :, :) / & + ( zcph(:, :, :) * zexn(:, :, :) ) + prrs(:, :, :, 6) = 0. + end where + end if + if (nmom_g.ge.2) then + where (prrs(:, :, :, 6) == 0.) prsvs(:, :, :, nsv_lima_ng) = 0. + end if +! Hail + if ( krr.GE.7 ) then + zmask(:,:,:)=(prrs(:, :, :, 7) < xrtmin_lima(7) / ptstep) + if (nmom_h.ge.2) zmask(:,:,:)=(zmask(:,:,:) .or. prsvs(:, :, :, nsv_lima_nh) < 0. ) + where ( zmask(:,:,:) ) + prrs(:, :, :, 1) = prrs(:, :, :, 1) + prrs(:, :, :, 7) + prths(:, :, :) = prths(:, :, :) - prrs(:, :, :, 7) * zls(:, :, :) / & + ( zcph(:, :, :) * zexn(:, :, :) ) + prrs(:, :, :, 7) = 0. + end where + end if + if (nmom_h.ge.2) then + where (prrs(:, :, :, 7) == 0.) prsvs(:, :, :, nsv_lima_nh) = 0. + end if +! prsvs(:, :, :, nsv_lima_beg : isv_lima_end) = Max( 0.0, prsvs(:, :, :, nsv_lima_beg : isv_lima_end) ) deallocate(zmask) end select CLOUD diff --git a/src/MNH/update_nsv.f90 b/src/MNH/update_nsv.f90 index c706bfe90..b8e6b36c5 100644 --- a/src/MNH/update_nsv.f90 +++ b/src/MNH/update_nsv.f90 @@ -83,6 +83,9 @@ NSV_LIMA_CCN_FREE = NSV_LIMA_CCN_FREE_A(KMI) NSV_LIMA_CCN_ACTI = NSV_LIMA_CCN_ACTI_A(KMI) NSV_LIMA_SCAVMASS = NSV_LIMA_SCAVMASS_A(KMI) NSV_LIMA_NI = NSV_LIMA_NI_A(KMI) +NSV_LIMA_NS = NSV_LIMA_NS_A(KMI) +NSV_LIMA_NG = NSV_LIMA_NG_A(KMI) +NSV_LIMA_NH = NSV_LIMA_NH_A(KMI) NSV_LIMA_IFN_FREE = NSV_LIMA_IFN_FREE_A(KMI) NSV_LIMA_IFN_NUCL = NSV_LIMA_IFN_NUCL_A(KMI) NSV_LIMA_IMM_NUCL = NSV_LIMA_IMM_NUCL_A(KMI) diff --git a/src/MNH/write_lfifm1_for_diag.f90 b/src/MNH/write_lfifm1_for_diag.f90 index d5245ba54..7630a9363 100644 --- a/src/MNH/write_lfifm1_for_diag.f90 +++ b/src/MNH/write_lfifm1_for_diag.f90 @@ -196,7 +196,7 @@ USE MODD_PARAM_LIMA, ONLY : NMOD_CCN, NMOD_IFN, NMOD_IMM, NINDICE_CCN_IMM,& LSCAV, LHHONI, LAERO_MASS, & LLIMA_DIAG, & NSPECIE, XMDIAM_IFN, XSIGMA_IFN, ZFRAC=>XFRAC,& - XR_MEAN_CCN, XLOGSIG_CCN + XR_MEAN_CCN, XLOGSIG_CCN, NMOM_S, NMOM_G, NMOM_H USE MODD_PARAM_LIMA_WARM, ONLY : CLIMA_WARM_CONC, CAERO_MASS USE MODD_PARAM_LIMA_COLD, ONLY : CLIMA_COLD_CONC USE MODD_LG, ONLY : CLGNAMES @@ -333,7 +333,7 @@ INTEGER :: IACCMODE ! !------------------------------------------------------------------------------- INTEGER :: IAUX ! work variable -REAL,DIMENSION(SIZE(XTHT,1),SIZE(XTHT,2),SIZE(XTHT,3)) :: ZWORK35,ZWORK36 +REAL,DIMENSION(SIZE(XTHT,1),SIZE(XTHT,2),SIZE(XTHT,3)) :: ZWORK35,ZWORK36, ZW1, ZW2, ZW3 REAL,DIMENSION(SIZE(XTHT,1),SIZE(XTHT,2)) :: ZWORK25,ZWORK26 REAL :: ZEAU ! Mean precipitable water INTEGER, DIMENSION(SIZE(XZZ,1),SIZE(XZZ,2)) ::IKTOP ! level in which is the altitude 3000m @@ -751,7 +751,7 @@ IF (LVAR_PR ) THEN ENDIF ! ! -!* Flux d'humidité et d'hydrométéores +!* Flux d'humidite et d'hydrometeores IF (LHU_FLX) THEN ZWORK35(:,:,:) = XRHODREF(:,:,:) * XRT(:,:,:,1) ZWORK31(:,:,:) = MXM(ZWORK35(:,:,:)) * XUT(:,:,:) @@ -815,7 +815,7 @@ IF (LHU_FLX) THEN ENDDO ENDIF ! Ecriture - ! composantes U et V du flux surfacique d'humidité + ! composantes U et V du flux surfacique d'humidite TZFIELD%CMNHNAME = 'UM90' TZFIELD%CSTDNAME = '' TZFIELD%CLONGNAME = 'UM90' @@ -839,7 +839,7 @@ IF (LHU_FLX) THEN TZFIELD%NDIMS = 3 TZFIELD%LTIMEDEP = .TRUE. CALL IO_Field_write(TPFILE,TZFIELD,ZWORK32) - ! composantes U et V du flux d'humidité intégré sur 3000 metres + ! composantes U et V du flux d'humidite integre sur 3000 metres TZFIELD%CMNHNAME = 'UM91' TZFIELD%CSTDNAME = '' TZFIELD%CLONGNAME = 'UM91' @@ -864,7 +864,7 @@ IF (LHU_FLX) THEN TZFIELD%LTIMEDEP = .TRUE. CALL IO_Field_write(TPFILE,TZFIELD,ZWORK22) ! - ! Convergence d'humidité + ! Convergence d'humidite TZFIELD%CMNHNAME = 'HMCONV' TZFIELD%CSTDNAME = '' TZFIELD%CLONGNAME = 'HMCONV' @@ -877,7 +877,7 @@ IF (LHU_FLX) THEN TZFIELD%LTIMEDEP = .TRUE. CALL IO_Field_write(TPFILE,TZFIELD,-ZWORK35) ! - ! Convergence d'humidité intégré sur 3000 mètres + ! Convergence d'humidite integre sur 3000 metres TZFIELD%CMNHNAME = 'HMCONV3000' TZFIELD%CSTDNAME = '' TZFIELD%CLONGNAME = 'HMCONV3000' @@ -891,7 +891,7 @@ IF (LHU_FLX) THEN CALL IO_Field_write(TPFILE,TZFIELD,-ZWORK25) ! IF (CCLOUD(1:3) == 'ICE' .OR. CCLOUD == 'LIMA') THEN - ! composantes U et V du flux surfacique d'hydrométéores + ! composantes U et V du flux surfacique d'hydrometeores TZFIELD%CMNHNAME = 'UM92' TZFIELD%CSTDNAME = '' TZFIELD%CLONGNAME = 'UM92' @@ -915,7 +915,7 @@ IF (LHU_FLX) THEN TZFIELD%NDIMS = 3 TZFIELD%LTIMEDEP = .TRUE. CALL IO_Field_write(TPFILE,TZFIELD,ZWORK34) - ! composantes U et V du flux d'hydrométéores intégré sur 3000 metres + ! composantes U et V du flux d'hydrometeores integre sur 3000 metres TZFIELD%CMNHNAME = 'UM93' TZFIELD%CSTDNAME = '' TZFIELD%CLONGNAME = 'UM93' @@ -939,7 +939,7 @@ IF (LHU_FLX) THEN TZFIELD%NDIMS = 2 TZFIELD%LTIMEDEP = .TRUE. CALL IO_Field_write(TPFILE,TZFIELD,ZWORK24) - ! Convergence d'hydrométéores + ! Convergence d'hydrometeores TZFIELD%CMNHNAME = 'HMCONV_TT' TZFIELD%CSTDNAME = '' TZFIELD%CLONGNAME = 'HMCONV_TT' @@ -951,7 +951,7 @@ IF (LHU_FLX) THEN TZFIELD%NDIMS = 3 TZFIELD%LTIMEDEP = .TRUE. CALL IO_Field_write(TPFILE,TZFIELD,-ZWORK36) - ! Convergence d'hydrométéores intégré sur 3000 mètres + ! Convergence d'hydrometeores integre sur 3000 metres TZFIELD%CMNHNAME = 'HMCONV3000_TT' TZFIELD%CSTDNAME = '' TZFIELD%CLONGNAME = 'HMCONV3000_TT' @@ -1152,24 +1152,36 @@ IF (LLIMA_DIAG) THEN IF (JSV .EQ. NSV_LIMA_NI) THEN TZFIELD%CMNHNAME = TRIM(CLIMA_COLD_CONC(1))//'T' END IF +! Ns + IF (JSV .EQ. NSV_LIMA_NS) THEN + TZFIELD%CMNHNAME = TRIM(CLIMA_COLD_CONC(2))//'T' + END IF +! Ng + IF (JSV .EQ. NSV_LIMA_NG) THEN + TZFIELD%CMNHNAME = TRIM(CLIMA_COLD_CONC(3))//'T' + END IF +! Nh + IF (JSV .EQ. NSV_LIMA_NH) THEN + TZFIELD%CMNHNAME = TRIM(CLIMA_COLD_CONC(4))//'T' + END IF ! N IFN free IF (JSV .GE. NSV_LIMA_IFN_FREE .AND. JSV .LT. NSV_LIMA_IFN_NUCL) THEN WRITE(INDICE,'(I2.2)')(JSV - NSV_LIMA_IFN_FREE + 1) - TZFIELD%CMNHNAME = TRIM(CLIMA_COLD_CONC(2))//INDICE//'T' + TZFIELD%CMNHNAME = TRIM(CLIMA_COLD_CONC(5))//INDICE//'T' END IF ! N IFN nucl IF (JSV .GE. NSV_LIMA_IFN_NUCL .AND. JSV .LT. NSV_LIMA_IFN_NUCL + NMOD_IFN) THEN WRITE(INDICE,'(I2.2)')(JSV - NSV_LIMA_IFN_NUCL + 1) - TZFIELD%CMNHNAME = TRIM(CLIMA_COLD_CONC(3))//INDICE//'T' + TZFIELD%CMNHNAME = TRIM(CLIMA_COLD_CONC(6))//INDICE//'T' END IF ! N IMM nucl IF (JSV .GE. NSV_LIMA_IMM_NUCL .AND. JSV .LT. NSV_LIMA_IMM_NUCL + NMOD_IMM) THEN WRITE(INDICE,'(I2.2)')(NINDICE_CCN_IMM(JSV - NSV_LIMA_IMM_NUCL + 1)) - TZFIELD%CMNHNAME = TRIM(CLIMA_COLD_CONC(4))//INDICE//'T' + TZFIELD%CMNHNAME = TRIM(CLIMA_COLD_CONC(7))//INDICE//'T' END IF ! Hom. freez. of CCN IF (JSV .EQ. NSV_LIMA_HOM_HAZE) THEN - TZFIELD%CMNHNAME = TRIM(CLIMA_COLD_CONC(5))//'T' + TZFIELD%CMNHNAME = TRIM(CLIMA_COLD_CONC(8))//'T' END IF ! ! Supersaturation @@ -3637,13 +3649,17 @@ IF(LRADAR .AND. LUSERR) THEN XCIT(:,:,:)=XSVT(:,:,:,NSV_LIMA_NI) CALL INI_RADAR('PLAT') END IF -! +! + IF (NMOM_S.GE.2) ZW1(:,:,:)=XSVT(:,:,:,NSV_LIMA_NS) + IF (NMOM_G.GE.2) ZW2(:,:,:)=XSVT(:,:,:,NSV_LIMA_NG) + IF (NMOM_H.GE.2) ZW3(:,:,:)=XSVT(:,:,:,NSV_LIMA_NH) IF (NVERSION_RAD == 1) THEN ! original version of radar diagnostics WRITE(ILUOUT0,*) 'radar diagnostics from RADAR_RAIN_ICE routine' IF (CCLOUD=='LIMA') THEN - CALL RADAR_RAIN_ICE (XRT, XCIT, XRHODREF, ZTEMP, ZWORK31, ZWORK32, & - ZWORK33, ZWORK34,XSVT(:,:,:,NSV_LIMA_NR) ) + CALL RADAR_RAIN_ICE (XRT, XCIT, XRHODREF, ZTEMP, ZWORK31, ZWORK32, & + ZWORK33, ZWORK34,XSVT(:,:,:,NSV_LIMA_NR), & + ZW1(:,:,:),ZW2(:,:,:),ZW3(:,:,:) ) ELSE CALL RADAR_RAIN_ICE (XRT, XCIT, XRHODREF, ZTEMP, ZWORK31, ZWORK32, & ZWORK33, ZWORK34 ) @@ -4025,7 +4041,7 @@ END IF ! IF (CBLTOP == 'THETA') THEN ! - ! méthode de la parcelle + ! methode de la parcelle ! ALLOCATE(ZSHMIX(IIU,IJU)) @@ -4064,7 +4080,7 @@ IF (CBLTOP == 'THETA') THEN DEALLOCATE(ZSHMIX) ELSEIF (CBLTOP == 'RICHA') THEN ! - ! méthode du "bulk Richardson number" + ! methode du "bulk Richardson number" ! ALLOCATE(ZRIB(IIU,IJU,IKU)) ALLOCATE(ZSHMIX(IIU,IJU)) diff --git a/src/MNH/write_lfin.f90 b/src/MNH/write_lfin.f90 index b7264511f..9a23c67e3 100644 --- a/src/MNH/write_lfin.f90 +++ b/src/MNH/write_lfin.f90 @@ -990,24 +990,36 @@ IF (NSV >=1) THEN IF (JSV .EQ. NSV_LIMA_NI) THEN TZFIELD%CMNHNAME = TRIM(CLIMA_COLD_NAMES(1))//'T' END IF +! Ns + IF (JSV .EQ. NSV_LIMA_NS) THEN + TZFIELD%CMNHNAME = TRIM(CLIMA_COLD_NAMES(2))//'T' + END IF +! Ng + IF (JSV .EQ. NSV_LIMA_NG) THEN + TZFIELD%CMNHNAME = TRIM(CLIMA_COLD_NAMES(3))//'T' + END IF +! Nh + IF (JSV .EQ. NSV_LIMA_NH) THEN + TZFIELD%CMNHNAME = TRIM(CLIMA_COLD_NAMES(4))//'T' + END IF ! N IFN free IF (JSV .GE. NSV_LIMA_IFN_FREE .AND. JSV .LT. NSV_LIMA_IFN_NUCL) THEN WRITE(INDICE,'(I2.2)')(JSV - NSV_LIMA_IFN_FREE + 1) - TZFIELD%CMNHNAME = TRIM(CLIMA_COLD_NAMES(2))//INDICE//'T' + TZFIELD%CMNHNAME = TRIM(CLIMA_COLD_NAMES(5))//INDICE//'T' END IF ! N IFN nucl IF (JSV .GE. NSV_LIMA_IFN_NUCL .AND. JSV .LT. NSV_LIMA_IFN_NUCL + NMOD_IFN) THEN WRITE(INDICE,'(I2.2)')(JSV - NSV_LIMA_IFN_NUCL + 1) - TZFIELD%CMNHNAME = TRIM(CLIMA_COLD_NAMES(3))//INDICE//'T' + TZFIELD%CMNHNAME = TRIM(CLIMA_COLD_NAMES(6))//INDICE//'T' END IF ! N IMM nucl IF (JSV .GE. NSV_LIMA_IMM_NUCL .AND. JSV .LT. NSV_LIMA_IMM_NUCL + NMOD_IMM) THEN WRITE(INDICE,'(I2.2)')(NINDICE_CCN_IMM(JSV - NSV_LIMA_IMM_NUCL + 1)) - TZFIELD%CMNHNAME = TRIM(CLIMA_COLD_NAMES(4))//INDICE//'T' + TZFIELD%CMNHNAME = TRIM(CLIMA_COLD_NAMES(7))//INDICE//'T' END IF ! Hom. freez. of CCN IF (JSV .EQ. NSV_LIMA_HOM_HAZE) THEN - TZFIELD%CMNHNAME = TRIM(CLIMA_COLD_NAMES(5))//'T' + TZFIELD%CMNHNAME = TRIM(CLIMA_COLD_NAMES(8))//'T' END IF ! ! Supersaturation -- GitLab