From edc3f88180fea50e1efde701bbafc70918a12dab Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?S=C3=A9bastien=20Riette?= <sebastien.riette@meteo.fr> Date: Wed, 21 Sep 2022 11:03:51 +0200 Subject: [PATCH] S. Riette 21 sept 2022 merge micro from 48t3 --- src/arome/ext/apl_arome.F90 | 105 ++- src/arome/ext/aro_adjust.F90 | 115 +-- src/arome/ext/aro_adjust.h | 20 +- src/arome/ext/aro_rain_ice.F90 | 133 ++-- src/arome/ext/aro_rain_ice.h | 22 +- src/arome/ext/aroini_micro.F90 | 198 +++++ src/arome/ext/aroini_micro.h | 46 ++ src/arome/ext/dead_code/aro_icecld.F90 | 217 ------ src/arome/ext/dead_code/aro_tiwmx.F90 | 123 ---- src/arome/ext/dead_code/modi_aro_icecld.F90 | 24 - src/arome/ext/dead_code/modi_aro_tiwmx.F90 | 11 - src/arome/ext/namparar.nam.h | 10 +- src/arome/ext/spp_mod_type.F90 | 122 ++++ src/arome/ext/suparar.F90 | 124 +++- src/arome/ext/suphmpa.F90 | 17 +- src/arome/ext/yomparar.F90 | 44 +- src/arome/micro/ini_rain_ice.F90 | 32 +- src/arome/micro/modi_rain_ice_old.F90 | 42 +- src/arome/micro/rain_ice_old.F90 | 683 +++++++++++------- src/common/micro/condensation.F90 | 117 ++- src/common/micro/ice_adjust.F90 | 79 +- src/common/micro/ini_rain_ice.F90 | 26 +- src/common/micro/ini_snow.F90 | 170 +++++ src/common/micro/ini_tiwmx.F90 | 55 ++ src/common/micro/modd_rain_ice_param.F90 | 5 +- src/common/micro/mode_icecloud.F90 | 8 +- src/common/micro/mode_tiwmx_fun.F90 | 108 +++ src/common/micro/modi_condensation.F90 | 35 +- src/common/micro/modi_ice_adjust.F90 | 105 +-- src/common/micro/modi_ini_snow.F90 | 15 + src/common/micro/modi_ini_tiwmx.F90 | 16 + .../turb/{modd_turbn.f90 => modd_turbn.F90} | 0 .../turb/{mode_coefj.f90 => mode_coefj.F90} | 0 src/mesonh/ext/resolved_cloud.f90 | 21 +- src/mesonh/micro/ice_adjust_elec.f90 | 12 +- src/mesonh/micro/ini_rain_ice.f90 | 26 +- src/mesonh/micro/lima_adjust_split.f90 | 13 +- src/mesonh/micro/radtr_satel.f90 | 10 +- tools/check_commit_ial.sh | 1 + 39 files changed, 1861 insertions(+), 1049 deletions(-) create mode 100644 src/arome/ext/aroini_micro.F90 create mode 100644 src/arome/ext/aroini_micro.h delete mode 100644 src/arome/ext/dead_code/aro_icecld.F90 delete mode 100644 src/arome/ext/dead_code/aro_tiwmx.F90 delete mode 100644 src/arome/ext/dead_code/modi_aro_icecld.F90 delete mode 100644 src/arome/ext/dead_code/modi_aro_tiwmx.F90 create mode 100644 src/arome/ext/spp_mod_type.F90 create mode 100644 src/common/micro/ini_snow.F90 create mode 100644 src/common/micro/ini_tiwmx.F90 create mode 100644 src/common/micro/mode_tiwmx_fun.F90 create mode 100644 src/common/micro/modi_ini_snow.F90 create mode 100644 src/common/micro/modi_ini_tiwmx.F90 rename src/common/turb/{modd_turbn.f90 => modd_turbn.F90} (100%) rename src/common/turb/{mode_coefj.f90 => mode_coefj.F90} (100%) diff --git a/src/arome/ext/apl_arome.F90 b/src/arome/ext/apl_arome.F90 index 1af66f4e8..1ab8b307a 100644 --- a/src/arome/ext/apl_arome.F90 +++ b/src/arome/ext/apl_arome.F90 @@ -252,8 +252,8 @@ SUBROUTINE APL_AROME(YDGEOMETRY,YDSURF, YDCFU, YDXFU, YDMODEL, KBL, KGPCOMP, KID ! Method ! ------ -! - convert aladin variables into mesonh variables (level inversion -! and q to r, t to theta) +! - convert aladin variables into mesonh variables (level inversion +! and q to r, t to theta) ! - call mesoNH physics and ECMWF radiation scheme ! - convert mesoNH tendencies to aladin tendencies @@ -265,44 +265,44 @@ SUBROUTINE APL_AROME(YDGEOMETRY,YDSURF, YDCFU, YDXFU, YDMODEL, KBL, KGPCOMP, KID ! externalisation of surface scheme call + small cleaning (20-07-04) Y.Seity ! Modifications ! ------------- -! G. Hello 04-02-06: Add the call of KFB-convection scheme +! G. Hello 04-02-06: Add the call of KFB-convection scheme ! for future use in ALARO -! T.Kovacic 04-05-05: Added ZCVTENDPR_ and ZCVTENDPRS_ +! T.Kovacic 04-05-05: Added ZCVTENDPR_ and ZCVTENDPRS_ ! M.Hamrud 01-Oct-2003 CY28 Cleaning ! F.Bouyssel 04-05-05: New arguments in ACRADIN ! Y. Seity 30-Sept-2005 Add MNH Chemistry scheme ! R. Zaaboul 15-feb-2006 add surface scheme call -! T.Kovacic 2006-03-23: calls to subroutines for budgets +! T.Kovacic 2006-03-23: calls to subroutines for budgets ! and new arguments PFRTH and PFRSO -! Y. Seity 2007-05-07: add CFU and XFU calculations +! Y. Seity 2007-05-07: add CFU and XFU calculations ! and call aro_ground_diag -! S.Ivatek-S 2007-04-17: Over dimensioning of PGPAR by NGPAR+1 just +! S.Ivatek-S 2007-04-17: Over dimensioning of PGPAR by NGPAR+1 just ! (KLON,NGPAR) is used boundary checking bf ! T.Kovacic 2007-03-16: Fourth dim. in APFT -! JJMorcrette, ECMWF, 20080325: dummy arguments for RADACT to allow for +! JJMorcrette, ECMWF, 20080325: dummy arguments for RADACT to allow for ! using a new sulphate climatology in the ECMWF model ! Y. Seity 2008-06-15: correct calculations of PFRTHDS, PFRSODS and PFCLL ! Y. Seity 2008-09-29: phasing Chemistry corrections ! O.Riviere 2008-10-01: introduction of new data flow for DDH in Arome ! Y. Seity 2009-05-03: new version of EDKF and implementation of EDMF -! Y. Seity 2009-10-03: add missed deallocations +! Y. Seity 2009-10-03: add missed deallocations ! S. Riette 2009-03-25: Arguments modification for AROCLDIA to add HTKERAF ! K. Yessad (Jul 2009): remove CDLOCK + some cleanings ! A. Alias 2009-09-01: Sulfate and Volcano aerosols added (call radaer) ! S. Riette 2010-01-19: ZUM__, ZVM__ and ZDEPTH_HEIGHT_ are given -! ARO_GROUND_DIAG in 3D. +! ARO_GROUND_DIAG in 3D. ! Y. Seity 2010-03-09: add PFEVN and PFEVL ! Y. Bouteloup 2010-03-26 : Add PQLRAD et PQIRAD ! Y. Seity : Test TKE > 0. ! Y. Seity : Optimized version of EDKF + diag HCLS ! Y. Seity : 2010-09 Save Ts at the end of apl_arome for ICMSH+0000 -! L. Bengtsson (2010): Introduce cloud diagnostics based on geop. -! height (LWMOCLOUD), AND cloud-overlap assumptions +! L. Bengtsson (2010): Introduce cloud diagnostics based on geop. +! height (LWMOCLOUD), AND cloud-overlap assumptions ! from C. Wittman 2009 (LACPANMX + WMXOV) ! S. Riette: 2010-12 aro_ground_diag interface modified ! Y. Seity: 2010-12 add hail diagnostic ! R. El Khatib 30-Jun-2010 NEC directive noloopfusion to preserve critical regions -! P.Marguinaud 2010-06-29 : KSURFEXCTL flag (disable SURFEX) +! P.Marguinaud 2010-06-29 : KSURFEXCTL flag (disable SURFEX) ! 2010-12 B. Decharme : modify the radiative coupling with surfex (SW per band in ACRADIN and RADHEAT) ! 2011-02 A. Voldoire : add ZAERINDS to CALL RADAER and ACRADIN ! for sulfate indirect effect computation @@ -331,11 +331,13 @@ SUBROUTINE APL_AROME(YDGEOMETRY,YDSURF, YDCFU, YDXFU, YDMODEL, KBL, KGPCOMP, KID ! 2016-09, J. Masek: Proper calculation of sunshine duration in ACRANEB2. ! 2016-10, P. Marguinaud : Port to single precision ! S. Riette 2016-11: Changes in ICE3/ICE4 +! K.I Ivarsson 2018-02 : Some new variables for microphysics ! 2018-09, E. Gleeson: Corrected misplaced arguments in ACRANEB2 call. ! 2019-09-24 J.M. Piriou arguments for convective gusts. ! R. El Khatib 30-Oct-2018 substantial rewrite for optimization and coding standards respect. ! 2018-10, I. Etchevers : add Visibilities ! 2019-01, I. Etchevers, Y. Seity : add Precipitation Type +! 2019-06, W. de Rooy: Modifications for new set-up statistical cloud scheme (LSTATNW) ! 2019-09, J. Masek: Corrected dimensioning of dummy argument PGMU0. ! Modified call to ACRANEB2 (clearsky fluxes). ! 2019-10, I. Etchevers : Visibilities in ACVISIH, AROCLDIA=>ACCLDIA @@ -375,6 +377,7 @@ USE YOMNSV , ONLY : NSV_CO2 USE DDH_MIX , ONLY : ADD_FIELD_3D, NEW_ADD_FIELD_3D, TYP_DDH ! for new diag data flow USE YOMSPSDT , ONLY : YSPPT_CONFIG, YSPPT USE SPP_MOD , ONLY : YSPP_CONFIG, YSPP +USE SPP_MOD_TYPE, ONLY : ALL_SPP_VARS, SET_ALL_SPP, CLEAR_ALL_SPP, APPLY_SPP USE YOMLSFORC , ONLY : LMUSCLFA, NMUSCLFA, REMIS_FORC, RALB_FORC ! daand: radflex USE INTFLEX_MOD, ONLY : LINTFLEX, LRADFLEX,& @@ -382,6 +385,25 @@ USE INTFLEX_MOD, ONLY : LINTFLEX, LRADFLEX,& & NEWINTFIELD, NEWINTPROC USE YOMMP0 , ONLY : MYPROC + + + + + + + +!SR phasing step, must be removed in 48t3 +USE SPP_MOD_TYPE, ONLY : TSPP_CONFIG_TYPE + + + + + + + + + + ! -------------------------------------------------------------------------- IMPLICIT NONE @@ -759,6 +781,14 @@ REAL(KIND=JPRB) :: ZZTOP_(KFDIA), ZCVTENDPR_(KFDIA), ZCVTENDPRS_(KFDIA) ! surface flux of x and y component of wind. are they really necessary ? REK REAL(KIND=JPRB) :: ZSFU_(KFDIA), ZSFV_(KFDIA) +! local areas for OCND2 option: +! ZICLDFR = ice cloud fraction , ZWCLDFR = water or mixed-phase cloud fraction, +! ZSSIO = Super-saturation with respect to ice in ZICLDFR , +! ZSSIU = Sub-saturation with respect to ice outside ZICLDFR, +! ZIFR = variable used for calulation of subgridscale ice +! Meso-NH world +REAL(KIND=JPRB) :: ZICLDFR_(KFDIA,KLEV), ZWCLDFR_(KFDIA,KLEV) +REAL(KIND=JPRB) :: ZSSIO_(KFDIA,KLEV), ZSSIU_(KFDIA,KLEV), ZIFR_(KFDIA,KLEV) ! Arpege-style dimensionning : ! -------------------------- @@ -934,6 +964,22 @@ REAL(KIND=JPRB) :: ZMU,ZVAL INTEGER(KIND=JPIM) :: JKO,JKE REAL(KIND=JPRB) :: ZHOOK_HANDLE + + + + + + + + + + + + + + +!SR phasing step +TYPE(TSPP_CONFIG_TYPE) :: YSPP1, YSPP2, YSPP3 ! -------------------------------------------------------------------------- #include "abor1.intfb.h" @@ -1020,7 +1066,7 @@ ASSOCIATE(MINPRR=>YDPARAR%MINPRR, MINPRS=>YDPARAR%MINPRS, MVQS=>YDPARAR%MVQS, & & CFRAC_ICE_SHALLOW_MF=>YDPARAR%CFRAC_ICE_SHALLOW_MF, CFRAC_ICE_ADJUST=>YDPARAR%CFRAC_ICE_ADJUST, & & MVTS=>YDPARAR%MVTS, NREFROI2=>YDPARAR%NREFROI2, NREFROI1=>YDPARAR%NREFROI1, & & MVEMIS=>YDPARAR%MVEMIS, LOWARM=>YDPARAR%LOWARM, LOCND2=>YDPARAR%LOCND2, & - & LGRSN=>YDPARAR%LGRSN, LOSIGMAS=>YDPARAR%LOSIGMAS, NRR=>YDPARAR%NRR, & + & LOSIGMAS=>YDPARAR%LOSIGMAS, NRR=>YDPARAR%NRR, & & LOSUBG_COND=>YDPARAR%LOSUBG_COND, RADGR=>YDPARAR%RADGR, & & CMF_UPDRAFT=>YDPARAR%CMF_UPDRAFT, LHARATU=>YDPARAR%LHARATU, & & XMINLM=>YDPHY0%XMINLM, XMAXLM=>YDPHY0%XMAXLM, AERCS1=>YDPHY0%AERCS1, & @@ -1042,6 +1088,7 @@ ASSOCIATE(MINPRR=>YDPARAR%MINPRR, MINPRS=>YDPARAR%MINPRS, MVQS=>YDPARAR%MVQS, & & NGFL_EXT=>YGFL%NGFL_EXT, YLRAD=>YGFL%YLRAD, YIRAD=>YGFL%YIRAD, & & NGFL_EZDIAG=>YGFL%NGFL_EZDIAG, & & NLIMA=>YGFL%NLIMA, CMICRO=>YDPARAR%CMICRO,NPROMICRO=>YDPARAR%NPROMICRO, & + & LKOGAN=>YDPARAR%LKOGAN, LHGT_QS=>YDPARAR%LHGT_QS, LMODICEDEP=>YDPARAR%LMODICEDEP, & & YSD_VAD=>YDSURF%YSD_VAD, & & QCO2=>YDPHY3%QCO2, & & NTEND_DIAG_POS=>YDPHY%NTEND_DIAG_POS, NTEND_DIAG_FREQ_RESET=>YDPHY%NTEND_DIAG_FREQ_RESET, & @@ -1188,6 +1235,11 @@ IF (INIT0 >= 0) THEN ZMFM_(:,:)=ZVALUE ZSIGM_(:,:)=ZVALUE ZNEBMNH_(:,:)=ZVALUE + ZICLDFR_(:,:)=ZVALUE + ZWCLDFR_(:,:)=ZVALUE + ZSSIO_(:,:)=ZVALUE + ZSSIU_(:,:)=ZVALUE + ZIFR_(:,:)=ZVALUE ZEVAP_(:,:)=ZVALUE ZRSWAP_(:,:,:)=ZVALUE @@ -1655,10 +1707,14 @@ IF (LMICRO) THEN & YDDDH, YDMODEL%YRML_DIAG%YRLDDH, YDMODEL%YRML_DIAG%YRMDDH) ELSE +YSPP1%LPERT=.FALSE. +YSPP2%LPERT=.FALSE. +YSPP3%LPERT=.FALSE. + +!SR phasing step, YSPP1 and YSPP2 must be replaced by their values CALL ARO_ADJUST (KLEV,IKU,IKL,KFDIA,KLEV,NRR,& - & NGFL_EZDIAG, & & CFRAC_ICE_ADJUST, CCONDENS, CLAMBDA3, LOSUBG_COND, & - & LOSIGMAS, CMICRO, LOCND2, CSUBG_MF_PDF, & + & LOSIGMAS, CMICRO, LOCND2, LHGT_QS, CSUBG_MF_PDF, & & ZDT,VSIGQSAT,ZZZ_F_,& & ZRHODJM__(:,1:KLEV),& & ZEXNREFM_,& @@ -1670,10 +1726,12 @@ IF (LMICRO) THEN & ZRI_MF_,ZCF_MF_,& & ZTHS__(:,1:KLEV),ZRS_,& & ZSRCS__(:,1:KLEV),ZNEBMNH_,& + & ZICLDFR_,ZWCLDFR_,ZSSIO_,ZSSIU_,ZIFR_,& & ZHLC_HRC__(:,1:KLEV), ZHLC_HCF__(:,1:KLEV),& & ZHLI_HRI__(:,1:KLEV), ZHLI_HCF__(:,1:KLEV),& - & PGP2DSPP,PEZDIAG,& - & YDDDH, YDMODEL%YRML_DIAG%YRLDDH, YDMODEL%YRML_DIAG%YRMDDH) + & YDDDH, YDMODEL%YRML_DIAG%YRLDDH, YDMODEL%YRML_DIAG%YRMDDH,& + & YSPP1, YSPP2) +! & ZSPP_ALL%YSPP_PSIGQSAT,ZSPP_ALL%YSPP_ICE_CLD_WGT) ENDIF @@ -3306,16 +3364,19 @@ IF (LMICRO) THEN & ZINPRR_NOTINCR_, ZINPRS_NOTINCR_, ZINPRG_NOTINCR_, ZINPRH_NOTINCR_,ZPFPR_,& & YDDDH, YDMODEL%YRML_DIAG%YRLDDH, YDMODEL%YRML_DIAG%YRMDDH ) ELSE - CALL ARO_RAIN_ICE (NPROMICRO,KLEV,IKU,IKL,KFDIA,KLEV,NRR,KSTEP+1,NSPLITR,NGFL_EZDIAG,& +!SR phasing step, YSPP1, YSPP2 and YSPP3 must be replaced by their values + CALL ARO_RAIN_ICE (NPROMICRO,KLEV,IKU,IKL,KFDIA,KLEV,NRR,KSTEP+1,NSPLITR,& & LOSUBG_COND, CSUBG_AUCV_RC, CSUBG_AUCV_RI, LOSEDIC,CSEDIM, CMICRO, ZDT,ZDZZ_ ,& & ZRHODJM__(:,1:KLEV),ZRHODREFM__(:,1:KLEV), ZEXNREFM_, ZPABSM__(:,1:KLEV),& & ZHLC_HRC__(:,1:KLEV), ZHLC_HCF__(:,1:KLEV),& & ZHLI_HRI__(:,1:KLEV), ZHLI_HCF__(:,1:KLEV),& & ZTHM__(:,1:KLEV),ZRM_, ZSIGS__(:,1:KLEV), ZNEBMNH_, ZTHS__(:,1:KLEV),ZRS_,& - & ZEVAP_, ZCIT_,LOWARM,ZSEA_,ZTOWN_, LOCND2,LGRSN,& + & ZEVAP_, ZCIT_,LOWARM,ZSEA_,ZTOWN_, & + & ZICLDFR_, ZWCLDFR_, ZSSIO_, ZSSIU_, ZIFR_, & + & LOCND2, LKOGAN, LMODICEDEP,& & ZINPRR_NOTINCR_, ZINPRS_NOTINCR_, ZINPRG_NOTINCR_, ZINPRH_NOTINCR_,ZPFPR_,& - & PGP2DSPP,PEZDIAG, & - & YDDDH, YDMODEL%YRML_DIAG%YRLDDH, YDMODEL%YRML_DIAG%YRMDDH) + & YDDDH, YDMODEL%YRML_DIAG%YRLDDH, YDMODEL%YRML_DIAG%YRMDDH,& + & YSPP1, YSPP2, YSPP3) ENDIF DO JLON=KIDIA,KFDIA diff --git a/src/arome/ext/aro_adjust.F90 b/src/arome/ext/aro_adjust.F90 index 4554df8ba..abae8e663 100644 --- a/src/arome/ext/aro_adjust.F90 +++ b/src/arome/ext/aro_adjust.F90 @@ -1,16 +1,16 @@ ! ######spl SUBROUTINE ARO_ADJUST(KKA,KKU,KKL,KLON,KLEV, KRR, & - NGFL_EZDIAG, & HFRAC_ICE, HCONDENS, HLAMBDA3, OSUBG_COND, & - OSIGMAS, CMICRO, OCND2, HSUBG_MF_PDF, & + OSIGMAS, CMICRO, OCND2, LHGT_QS, HSUBG_MF_PDF, & PTSTEP, PSIGQSAT, & PZZF, PRHODJ, PEXNREF, PRHODREF,& PPABSM, PTHT, PRT, PSIGS, & PMFCONV, PRC_MF, PRI_MF, PCF_MF, & PTHS, PRS, PSRCS, PCLDFR,& + PICLDFR, PWCLDFR, PSSIO, PSSIU, PIFR, & PHLC_HRC, PHLC_HCF, PHLI_HRI, PHLI_HCF,& - PGP2DSPP,PEZDIAG, & - YDDDH,YDLDDH,YDMDDH) + YDDDH,YDLDDH,YDMDDH,& + YSPP_PSIGQSAT,YSPP_ICE_CLD_WGT) USE PARKIND1, ONLY : JPRB USE YOMHOOK , ONLY : LHOOK, DR_HOOK ! ########################################################################## @@ -76,6 +76,7 @@ !! S. Riette ice for EDKF !! 2012-02 Y. Seity, add possibility to run with reversed vertical levels !! 2016-11 S. Riette: new ice_adjust interface, add OLD3/OLD4 schemes +!! 2018-02 K.I Ivarsson : More outputs from OCND2 option !! 2020-12 U. Andrae : Introduce SPP for HARMONIE-AROME !! R. El Khatib 24-Aug-2021 Optimizations !! @@ -88,11 +89,11 @@ USE MODD_CONF USE MODD_CST USE MODD_PARAMETERS USE MODD_RAIN_ICE_DESCR +USE MODD_RAIN_ICE_PARAM, ONLY: XFRMIN USE MODD_BUDGET, ONLY: TBUDGETDATA, NBUDGET_RI -USE MODD_SPP_TYPE +USE SPP_MOD_TYPE, ONLY : TSPP_CONFIG_TYPE, CLEAR_SPP_TYPE, APPLY_SPP ! USE MODI_ICE_ADJUST -USE SPP_MOD, ONLY : YSPP_CONFIG,YSPP ! USE DDH_MIX , ONLY : TYP_DDH USE YOMLDDH , ONLY : TLDDH @@ -111,7 +112,6 @@ INTEGER, INTENT(IN) :: KKL !vert. levels type 1=MNH -1=ARO INTEGER, INTENT(IN) :: KLON !NPROMA under CPG INTEGER, INTENT(IN) :: KLEV !Number of vertical levels INTEGER, INTENT(IN) :: KRR ! Number of moist variables -INTEGER, INTENT(IN) :: NGFL_EZDIAG ! Diagnostic array dimension CHARACTER*1, INTENT(IN) :: HFRAC_ICE CHARACTER*80, INTENT(IN) :: HCONDENS CHARACTER*4, INTENT(IN) :: HLAMBDA3 ! formulation for lambda3 coeff @@ -121,6 +121,7 @@ LOGICAL, INTENT(IN) :: OSIGMAS ! Switch for Sigma_s: ! or that from turbulence scheme CHARACTER (LEN=4), INTENT(IN) :: CMICRO ! Microphysics scheme LOGICAL, INTENT(IN) :: OCND2 +LOGICAL, INTENT(IN) :: LHGT_QS CHARACTER*80, INTENT(IN) :: HSUBG_MF_PDF REAL, INTENT(IN) :: PTSTEP ! Time step REAL, INTENT(IN) :: PSIGQSAT ! coeff applied to qsat variance contribution @@ -148,19 +149,25 @@ REAL, DIMENSION(KLON,1,KLEV), INTENT(OUT) :: PSRCS ! Second-order flux ! s'rc'/2Sigma_s2 at time t+1 ! multiplied by Lambda_3 REAL, DIMENSION(KLON,1,KLEV), INTENT(INOUT) :: PCLDFR! Cloud fraction +REAL, DIMENSION(KLON,1,KLEV), INTENT(OUT) :: PICLDFR ! ice cloud fraction +REAL, DIMENSION(KLON,1,KLEV), INTENT(OUT) :: PWCLDFR ! water or mixed-phase cloud fraction +REAL, DIMENSION(KLON,1,KLEV), INTENT(OUT) :: PSSIO ! Super-saturation with respect to ice in the + ! supersaturated fraction +REAL, DIMENSION(KLON,1,KLEV), INTENT(OUT) :: PSSIU ! Sub-saturation with respect to ice in the + ! subsaturated fraction +REAL, DIMENSION(KLON,1,KLEV), INTENT(OUT) :: PIFR ! Ratio cloud ice moist part to dry part ! REAL, DIMENSION(KLON,1,KLEV), INTENT(OUT) :: PHLC_HRC REAL, DIMENSION(KLON,1,KLEV), INTENT(OUT) :: PHLC_HCF REAL, DIMENSION(KLON,1,KLEV), INTENT(OUT) :: PHLI_HRI REAL, DIMENSION(KLON,1,KLEV), INTENT(OUT) :: PHLI_HCF ! -REAL, DIMENSION(KLON,YSPP%N2D), TARGET, INTENT(INOUT) :: PGP2DSPP -REAL, DIMENSION(KLON,KLEV,NGFL_EZDIAG), INTENT(INOUT) :: PEZDIAG -! TYPE(TYP_DDH), INTENT(INOUT), TARGET :: YDDDH TYPE(TLDDH), INTENT(IN), TARGET :: YDLDDH TYPE(TMDDH), INTENT(IN), TARGET :: YDMDDH ! +TYPE(TSPP_CONFIG_TYPE), INTENT(INOUT) :: YSPP_PSIGQSAT,YSPP_ICE_CLD_WGT +! !* 0.2 Declarations of local variables : CHARACTER*4 :: HBUNAME ! Name of the budget @@ -178,12 +185,9 @@ REAL :: ZMASSTOT ! total mass for one water category REAL :: ZMASSPOS ! total mass for one water category ! after removing the negative values REAL :: ZRATIO ! ZMASSTOT / ZMASSCOR -REAL :: ZCOR(KLON) ! for the correction of negative rv +REAL :: ZCOR(KLON) ! for the correction of negative rv ! -TYPE(TSPP_CONFIG_MPA) :: YSPP_PSIGQSAT,YSPP_ICE_CLD_WGT -REAL :: ZMU, ZVAL REAL, DIMENSION(KLON,1) :: ZSIGQSAT, ZICE_CLD_WGT -INTEGER :: JI TYPE(TBUDGETDATA), DIMENSION(NBUDGET_RI) :: YLBUDGET !NBUDGET_RI is the one with the highest number ! ! @@ -195,69 +199,20 @@ REAL(KIND=JPRB) :: ZHOOK_HANDLE ! IF (LHOOK) CALL DR_HOOK('ARO_ADJUST',0,ZHOOK_HANDLE) -! Copy SPP settings -IF ( YSPP_CONFIG%LSPP ) THEN - - IF ( YSPP_CONFIG%LPERT_PSIGQSAT ) & - CALL SET_SPP_TYPE(YSPP_PSIGQSAT, & - YSPP_CONFIG%LLNN_MEAN1, YSPP_CONFIG%LLNN_MEAN1_PSIGQSAT, & - YSPP_CONFIG%CMPERT_PSIGQSAT, YSPP_CONFIG%SDEV, & - YSPP_CONFIG%CLIP_PSIGQSAT, & - YSPP%MP_PSIGQSAT, & - KLON,KLEV,YSPP%N2D,NGFL_EZDIAG, & - YSPP_CONFIG%IEZDIAG_POS, & - PGP2DSPP,PSIGQSAT,PEZDIAG) - - IF ( YSPP_CONFIG%LPERT_ICE_CLD_WGT ) & - CALL SET_SPP_TYPE(YSPP_ICE_CLD_WGT, & - YSPP_CONFIG%LLNN_MEAN1, YSPP_CONFIG%LLNN_MEAN1_ICE_CLD_WGT, & - YSPP_CONFIG%CMPERT_ICE_CLD_WGT, YSPP_CONFIG%SDEV, & - YSPP_CONFIG%CLIP_ICE_CLD_WGT, & - YSPP%MP_ICE_CLD_WGT, & - KLON,KLEV,YSPP%N2D,NGFL_EZDIAG, & - YSPP_CONFIG%IEZDIAG_POS, & - PGP2DSPP,1.0_JPRB,PEZDIAG) - ! Awaiting merge of HARMONIE-AROME physics - !PGP2DSPP,XFRMIN(21),PEZDIAG) - -ENDIF +! +! Apply SPP perturbations +! -! Compute perturbations -! Perturb PSIGQSAT IF (YSPP_PSIGQSAT%LPERT) THEN - IF (YSPP_PSIGQSAT%LLNN_MEAN1.OR.YSPP_PSIGQSAT%LLNN_MEAN1_SELF) THEN - ZMU = -0.5 * (YSPP_PSIGQSAT%CMPERT * YSPP_PSIGQSAT%SDEV)**2 - ELSE - ZMU = 0. - ENDIF - DO JI=1,KLON - ZVAL = & - PSIGQSAT*EXP(ZMU+YSPP_PSIGQSAT%CMPERT*YSPP_PSIGQSAT%PGP2DSPP(JI)) - ZSIGQSAT(JI,1) = MAX(YSPP_PSIGQSAT%CLIP(1),MIN(ZVAL,YSPP_PSIGQSAT%CLIP(2))) - ENDDO + CALL APPLY_SPP(YSPP_PSIGQSAT,KLON,1,KLON,PSIGQSAT,ZSIGQSAT) ELSE - ZSIGQSAT(:,1) = PSIGQSAT + ZSIGQSAT(:,:) = PSIGQSAT ENDIF -! Perturb ICE_CLD_WGT IF (YSPP_ICE_CLD_WGT%LPERT) THEN - IF (YSPP_ICE_CLD_WGT%LLNN_MEAN1.OR.YSPP_ICE_CLD_WGT%LLNN_MEAN1_SELF) THEN - ZMU = -0.5 * (YSPP_ICE_CLD_WGT%CMPERT * YSPP_ICE_CLD_WGT%SDEV)**2 - ELSE - ZMU = 0. - ENDIF - DO JI=1,KLON - ! Awaiting HARMONIE-AROME physics changes - ! ZVAL = & - ! XFRMIN(21)* EXP(ZMU+YSPP_ICE_CLD_WGT%CMPERT*YSPP_ICE_CLD_WGT%PGP2DSPP(JI)) - ZVAL = & - 1.5* EXP(ZMU+YSPP_ICE_CLD_WGT%CMPERT*YSPP_ICE_CLD_WGT%PGP2DSPP(JI)) - ZICE_CLD_WGT(JI,1) = & - MAX(YSPP_ICE_CLD_WGT%CLIP(1),MIN(ZVAL,YSPP_ICE_CLD_WGT%CLIP(2))) - ENDDO + CALL APPLY_SPP(YSPP_ICE_CLD_WGT,KLON,1,KLON,XFRMIN(21),ZICE_CLD_WGT) ELSE -! ZICE_CLD_WGT(:) = XFRMIN(21) - ZICE_CLD_WGT(:,1) = 1.5 + ZICE_CLD_WGT(:,:) = XFRMIN(21) ENDIF HBUNAME='DEPI' @@ -435,11 +390,13 @@ IF (KRR==6) THEN CALL ICE_ADJUST ( KKA=KKA,KKU=KKU,KKL=KKL,KRR=KRR,& & HFRAC_ICE=HFRAC_ICE, HCONDENS=HCONDENS, HLAMBDA3=HLAMBDA3, HBUNAME=HBUNAME, & & OSUBG_COND=OSUBG_COND, OSIGMAS=OSIGMAS, & - & OCND2=OCND2, HSUBG_MF_PDF=HSUBG_MF_PDF, & + & OCND2=OCND2, LHGT_QS=LHGT_QS, HSUBG_MF_PDF=HSUBG_MF_PDF, & & PTSTEP=ZTWOTSTEP,PSIGQSAT=ZSIGQSAT, & & PRHODJ=PRHODJ ,PEXNREF=PEXNREF, PRHODREF=PRHODREF, & & PSIGS=PSIGS, PMFCONV=PMFCONV, PPABST=PPABSM, PZZ=ZZZ, & & PEXN=PEXNREF, PCF_MF=PCF_MF,PRC_MF=PRC_MF,PRI_MF=PRI_MF, & + & PICLDFR=PICLDFR, PWCLDFR=PWCLDFR, & + & PSSIO=PSSIO, PSSIU=PSSIU, PIFR=PIFR, & & PRV=ZRS(:,:,:,1), PRC=ZRS(:,:,:,2), & & PRVS=PRS(:,:,:,1), PRCS=PRS(:,:,:,2), & & PTH=ZRS(:,:,:,0), PTHS=PTHS,PSRCS=PSRCS, PCLDFR=PCLDFR, & @@ -447,19 +404,21 @@ IF (KRR==6) THEN & PRI=ZRS(:,:,:,4), PRIS=PRS(:,:,:,4), & & PRS=ZRS(:,:,:,5), & & PRG=ZRS(:,:,:,6), & - & PHLC_HRC=PHLC_HRC(:,:,:), PHLC_HCF=PHLC_HCF(:,:,:), & - & PHLI_HRI=PHLI_HRI(:,:,:), PHLI_HCF=PHLI_HCF(:,:,:), & + & TBUDGETS=YLBUDGET, KBUDGETS=SIZE(YLBUDGET), & & PICE_CLD_WGT=ZICE_CLD_WGT(:,:), & - & TBUDGETS=YLBUDGET, KBUDGETS=SIZE(YLBUDGET)) + & PHLC_HRC=PHLC_HRC(:,:,:), PHLC_HCF=PHLC_HCF(:,:,:), & + & PHLI_HRI=PHLI_HRI(:,:,:), PHLI_HCF=PHLI_HCF(:,:,:)) ELSE CALL ICE_ADJUST ( KKA=KKA,KKU=KKU,KKL=KKL,KRR=KRR,& & HFRAC_ICE=HFRAC_ICE, HCONDENS=HCONDENS, HLAMBDA3=HLAMBDA3, HBUNAME=HBUNAME, & & OSUBG_COND=OSUBG_COND, OSIGMAS=OSIGMAS, & - & OCND2=OCND2, HSUBG_MF_PDF=HSUBG_MF_PDF, & + & OCND2=OCND2, LHGT_QS=LHGT_QS, HSUBG_MF_PDF=HSUBG_MF_PDF, & & PTSTEP=ZTWOTSTEP,PSIGQSAT=ZSIGQSAT, & & PRHODJ=PRHODJ ,PEXNREF=PEXNREF, PRHODREF=PRHODREF, & & PSIGS=PSIGS, PMFCONV=PMFCONV, PPABST=PPABSM, PZZ=ZZZ, & & PEXN=PEXNREF, PCF_MF=PCF_MF,PRC_MF=PRC_MF,PRI_MF=PRI_MF, & + & PICLDFR=PICLDFR, PWCLDFR=PWCLDFR, & + & PSSIO=PSSIO, PSSIU=PSSIU, PIFR=PIFR, & & PRV=ZRS(:,:,:,1), PRC=ZRS(:,:,:,2), & & PRVS=PRS(:,:,:,1), PRCS=PRS(:,:,:,2), & & PTH=ZRS(:,:,:,0), PTHS=PTHS,PSRCS=PSRCS, PCLDFR=PCLDFR, & @@ -467,11 +426,11 @@ ELSE & PRI=ZRS(:,:,:,4), PRIS=PRS(:,:,:,4), & & PRS=ZRS(:,:,:,5), & & PRG=ZRS(:,:,:,6), & + & TBUDGETS=YLBUDGET, KBUDGETS=SIZE(YLBUDGET), & + & PICE_CLD_WGT=ZICE_CLD_WGT(:,:), & & PRH=ZRS(:,:,:,7), & & PHLC_HRC=PHLC_HRC(:,:,:), PHLC_HCF=PHLC_HCF(:,:,:), & - & PHLI_HRI=PHLI_HRI(:,:,:), PHLI_HCF=PHLI_HCF(:,:,:), & - & PICE_CLD_WGT=ZICE_CLD_WGT(:,:), & - & TBUDGETS=YLBUDGET, KBUDGETS=SIZE(YLBUDGET)) + & PHLI_HRI=PHLI_HRI(:,:,:), PHLI_HCF=PHLI_HCF(:,:,:)) ENDIF CALL CLEAR_SPP_TYPE(YSPP_PSIGQSAT) diff --git a/src/arome/ext/aro_adjust.h b/src/arome/ext/aro_adjust.h index 6f2856602..862153cee 100644 --- a/src/arome/ext/aro_adjust.h +++ b/src/arome/ext/aro_adjust.h @@ -1,17 +1,17 @@ INTERFACE SUBROUTINE ARO_ADJUST(KKA,KKU,KKL,KLON,KLEV, KRR,& - & NGFL_EZDIAG, & & HFRAC_ICE, HCONDENS, HLAMBDA3, OSUBG_COND, & - & OSIGMAS, CMICRO, OCND2, HSUBG_MF_PDF,& + & OSIGMAS, CMICRO, OCND2, LHGT_QS, HSUBG_MF_PDF,& & PTSTEP, PSIGQSAT, PZZF, PRHODJ, PEXNREF, PRHODREF,& & PPABSM, PTHT, PRT, PSIGS,& & PMFCONV, PRC_MF, PRI_MF, PCF_MF,& & PTHS, PRS, PSRCS, PCLDFR, & + & PICLDFR, PWCLDFR, PSSIO, PSSIU, PIFR,& & PHLC_HRC, PHLC_HCF, PHLI_HRI, PHLI_HCF, & - & PGP2DSPP,PEZDIAG, & - & YDDDH,YDLDDH,YDMDDH) + & YDDDH,YDLDDH,YDMDDH,& + & YSPP_PSIGQSAT,YSPP_ICE_CLD_WGT) USE PARKIND1 ,ONLY : JPIM ,JPRB -USE SPP_MOD, ONLY : YSPP +USE SPP_MOD_TYPE, ONLY : TSPP_CONFIG_TYPE USE DDH_MIX, ONLY : TYP_DDH USE YOMLDDH, ONLY : TLDDH USE YOMMDDH, ONLY : TMDDH @@ -21,7 +21,6 @@ INTEGER(KIND=JPIM), INTENT(IN) :: KKL INTEGER(KIND=JPIM), INTENT(IN) :: KLON INTEGER(KIND=JPIM), INTENT(IN) :: KLEV INTEGER(KIND=JPIM), INTENT(IN) :: KRR -INTEGER(KIND=JPIM), INTENT(IN) :: NGFL_EZDIAG CHARACTER*1, INTENT(IN) :: HFRAC_ICE CHARACTER(LEN=80), INTENT(IN) :: HCONDENS CHARACTER*4, INTENT(IN) :: HLAMBDA3 @@ -29,6 +28,7 @@ LOGICAL, INTENT(IN) :: OSUBG_COND LOGICAL, INTENT(IN) :: OSIGMAS CHARACTER(LEN=4), INTENT(IN) :: CMICRO LOGICAL, INTENT(IN) :: OCND2 +LOGICAL, INTENT(IN) :: LHGT_QS CHARACTER(LEN=80), INTENT(IN) :: HSUBG_MF_PDF REAL(KIND=JPRB), INTENT(IN) :: PTSTEP REAL(KIND=JPRB), INTENT(IN) :: PSIGQSAT @@ -46,14 +46,18 @@ REAL(KIND=JPRB), DIMENSION(KLON,1,KLEV), INTENT(INOUT) :: PTHS REAL(KIND=JPRB), DIMENSION(KLON,1,KLEV,KRR), INTENT(INOUT) :: PRS REAL(KIND=JPRB), DIMENSION(KLON,1,KLEV), INTENT(OUT) :: PSRCS REAL(KIND=JPRB), DIMENSION(KLON,1,KLEV), INTENT(INOUT) :: PCLDFR +REAL(KIND=JPRB), DIMENSION(KLON,1,KLEV), INTENT(OUT) :: PICLDFR +REAL(KIND=JPRB), DIMENSION(KLON,1,KLEV), INTENT(OUT) :: PWCLDFR +REAL(KIND=JPRB), DIMENSION(KLON,1,KLEV), INTENT(OUT) :: PSSIO +REAL(KIND=JPRB), DIMENSION(KLON,1,KLEV), INTENT(OUT) :: PSSIU +REAL(KIND=JPRB), DIMENSION(KLON,1,KLEV), INTENT(OUT) :: PIFR REAL(KIND=JPRB), DIMENSION(KLON,1,KLEV), INTENT(OUT) :: PHLC_HRC REAL(KIND=JPRB), DIMENSION(KLON,1,KLEV), INTENT(OUT) :: PHLC_HCF REAL(KIND=JPRB), DIMENSION(KLON,1,KLEV), INTENT(OUT) :: PHLI_HRI REAL(KIND=JPRB), DIMENSION(KLON,1,KLEV), INTENT(OUT) :: PHLI_HCF -REAL(KIND=JPRB), DIMENSION(KLON,YSPP%N2D), INTENT(INOUT) :: PGP2DSPP -REAL(KIND=JPRB), DIMENSION(KLON,KLEV,NGFL_EZDIAG), INTENT(INOUT) :: PEZDIAG TYPE(TYP_DDH) , INTENT(INOUT) :: YDDDH TYPE(TLDDH) , INTENT(IN) :: YDLDDH TYPE(TMDDH) , INTENT(IN) :: YDMDDH +TYPE(TSPP_CONFIG_TYPE), INTENT(INOUT) :: YSPP_PSIGQSAT,YSPP_ICE_CLD_WGT END SUBROUTINE ARO_ADJUST END INTERFACE diff --git a/src/arome/ext/aro_rain_ice.F90 b/src/arome/ext/aro_rain_ice.F90 index ccc927141..7e321c995 100644 --- a/src/arome/ext/aro_rain_ice.F90 +++ b/src/arome/ext/aro_rain_ice.F90 @@ -1,15 +1,15 @@ ! ######spl SUBROUTINE ARO_RAIN_ICE(KPROMA,KKA,KKU,KKL,KLON,KLEV, KRR, KTCOUNT, KSPLITR,& - KEZDIAG, & OSUBG_COND, CSUBG_AUCV_RC, CSUBG_AUCV_RI,OSEDIC, CSEDIM, CMICRO, & PTSTEP, PDZZ, PRHODJ, PRHODREF, PEXNREF,& PPABSM, PHLC_HRC, PHLC_HCF, PHLI_HRI, PHLI_HCF, PTHT, PRT, PSIGS,PCLDFR, & PTHS, PRS, PEVAP, & PCIT, OWARM, PSEA, PTOWN, & - OCND2,LGRSN, & + PICLDFR, PWCLDFR, PSSIO, PSSIU, PIFR, & + OCND2, LKOGAN, LMODICEDEP,& PINPRR,PINPRS,PINPRG,PINPRH,PFPR, & - PGP2DSPP,PEZDIAG, & - YDDDH, YDLDDH, YDMDDH) + YDDDH, YDLDDH, YDMDDH, & + YSPP_ICENU,YSPP_KGN_ACON,YSPP_KGN_SBGR) USE PARKIND1, ONLY : JPRB USE YOMHOOK , ONLY : LHOOK, DR_HOOK ! ########################################################################## @@ -78,6 +78,7 @@ !! 2014-11 S. Riette, ICE3/ICE4 modified, old versions under OLD3/OLD4 !! 2014-11 S. Riette, ICE3/ICE4 modified, old versions under OLD3/OLD4 !! 2020-12 U. Andrae : Introduce SPP for HARMONIE-AROME +!! 2018-02 K.I: Ivarsson: More inputs to OCND2-option for saving computing time. !! R. El Khatib 24-Aug-2021 Specific cache-blocking factor for microphysics !! !------------------------------------------------------------------------------- @@ -89,7 +90,7 @@ USE MODD_CONF USE MODD_CST USE MODD_PARAMETERS USE MODD_RAIN_ICE_DESCR -USE MODD_SPP_TYPE +USE MODD_RAIN_ICE_PARAM, ONLY: XFRMIN ! USE MODD_BUDGET, ONLY: LBUDGET_RV, LBUDGET_RC, LBUDGET_RR, LBUDGET_RI, LBUDGET_RS, & & LBUDGET_RG, LBUDGET_RH, LBUDGET_TH, TBUDGETDATA, NBUDGET_RH @@ -97,7 +98,7 @@ USE MODE_BUDGET, ONLY: BUDGET_DDH ! USE MODI_RAIN_ICE ! -USE SPP_MOD, ONLY : YSPP_CONFIG,YSPP +USE SPP_MOD_TYPE, ONLY : TSPP_CONFIG_TYPE, APPLY_SPP ! USE MODI_RAIN_ICE_OLD ! @@ -121,7 +122,6 @@ INTEGER, INTENT(IN) :: KLEV !Number of vertical levels INTEGER, INTENT(IN) :: KRR ! Number of moist variables INTEGER, INTENT(IN) :: KTCOUNT ! Temporal loop counter INTEGER, INTENT(IN) :: KSPLITR ! Number of small time step -INTEGER, INTENT(IN) :: KEZDIAG ! Size of diagnostics array ! integrations for rain sedimendation LOGICAL, INTENT(IN) :: OSUBG_COND ! Switch for Subgrid Cond. CHARACTER (LEN=4), INTENT(IN) :: CSUBG_AUCV_RC @@ -150,6 +150,16 @@ REAL, DIMENSION(KLON,1,KLEV), INTENT(IN) :: PTHT ! Theta at time t REAL, DIMENSION(KLON,1,KLEV,KRR), INTENT(INOUT):: PRT ! Moist variables at time t REAL, DIMENSION(KLON,1,KLEV), INTENT(IN) :: PSIGS ! Sigma_s at time t REAL, DIMENSION(KLON,1,KLEV), INTENT(IN) :: PCLDFR ! Cloud fraction +! input from aro_adjust / condensation with OCND2, dummy if OCND2 = F +REAL, DIMENSION(KLON,1,KLEV), INTENT(IN) :: PICLDFR ! ice cloud fraction +REAL, DIMENSION(KLON,1,KLEV), INTENT(IN) :: PWCLDFR ! water or mixed-phase cloud fraction +REAL, DIMENSION(KLON,1,KLEV), INTENT(IN) :: PSSIO ! Super-saturation with respect to ice in the + ! supersaturated fraction +REAL, DIMENSION(KLON,1,KLEV), INTENT(IN) :: PSSIU ! Sub-saturation with respect to ice in the + ! subsaturated fraction +REAL, DIMENSION(KLON,1,KLEV), INTENT(INOUT):: PIFR ! Ratio cloud ice moist part to dry part +!REAL, DIMENSION (KLON,1), INTENT(IN) :: PPBL ! PBL top above ground (m) +! input from aro_adjust / condensation with OCND2 END. ! ! REAL, DIMENSION(KLON,1,KLEV), INTENT(INOUT) :: PTHS ! Theta source @@ -164,7 +174,8 @@ LOGICAL, INTENT(IN) :: OWARM ! Control of the rain formation ! by slow warm microphysical ! processes LOGICAL, INTENT(IN) :: OCND2 ! Logical switch to separate liquid and ice -LOGICAL, INTENT(IN) :: LGRSN ! Logical switch to turn graupel to snow for high supersaturation wrt ice +LOGICAL, INTENT(IN) :: LKOGAN! Logical switch for using Kogan autoconversion of liquid +LOGICAL, INTENT(IN) :: LMODICEDEP ! Logical switch for alternative dep/evap of ice REAL, DIMENSION(KLON,1), INTENT(IN) :: PSEA ! Land sea mask REAL, DIMENSION(KLON,1), INTENT(IN) :: PTOWN ! Town mask REAL, DIMENSION(KLON,1), INTENT(OUT) :: PINPRR! Rain instant precip @@ -172,13 +183,13 @@ REAL, DIMENSION(KLON,1), INTENT(OUT) :: PINPRS! Snow instant precip REAL, DIMENSION(KLON,1), INTENT(OUT) :: PINPRG! Graupel instant precip REAL, DIMENSION(KLON,1), INTENT(OUT) :: PINPRH! Hail instant precip REAL, DIMENSION(KLON,1,KLEV,KRR), INTENT(INOUT) :: PFPR ! upper-air precip -REAL, DIMENSION(KLON,YSPP%N2D), TARGET, INTENT(INOUT) :: PGP2DSPP -REAL, DIMENSION(KLON,KLEV,KEZDIAG), INTENT(INOUT) :: PEZDIAG ! TYPE(TYP_DDH), INTENT(INOUT), TARGET :: YDDDH TYPE(TLDDH), INTENT(IN), TARGET :: YDLDDH TYPE(TMDDH), INTENT(IN), TARGET :: YDMDDH ! +TYPE(TSPP_CONFIG_TYPE), INTENT(INOUT) :: YSPP_ICENU,YSPP_KGN_ACON,YSPP_KGN_SBGR +! ! !* 0.2 Declarations of local variables : INTEGER :: JRR ! Loop index for the moist and scalar variables @@ -189,6 +200,7 @@ REAL, DIMENSION(KLON,1,KLEV):: ZT,ZLV,ZLS,ZCPH REAL, DIMENSION(KLON,1,KLEV):: ZCOR REAL, DIMENSION(KLON,1):: ZINDEP ! surf cloud deposition (already contained in sedimentation) REAL, DIMENSION(KLON,1,KLEV):: ZRAINFR +REAL, DIMENSION(KLON,1) :: ZICENU, ZKGN_ACON, ZKGN_SBGR REAL, DIMENSION(KLON,1):: ZINPRC ! surf cloud sedimentation ! for the correction of negative rv REAL :: ZMASSTOT ! total mass for one water category @@ -197,8 +209,6 @@ REAL :: ZMASSPOS ! total mass for one water category ! after removing the negative values REAL :: ZRATIO ! ZMASSTOT / ZMASSCOR -TYPE(TSPP_CONFIG_MPA) :: YSPP_ICENU,YSPP_KGN_ACON,YSPP_KGN_SBGR - LOGICAL, DIMENSION(KLON, 1, KLEV) :: LLMICRO !mask to limit computation TYPE(TBUDGETDATA), DIMENSION(NBUDGET_RH) :: YLBUDGET !NBUDGET_RH is the one with the highest number @@ -217,43 +227,6 @@ IF (LHOOK) CALL DR_HOOK('ARO_RAIN_ICE',0,ZHOOK_HANDLE) ZINPRC=0. PINPRH=0. -! Copy SPP settings -IF ( YSPP_CONFIG%LSPP ) THEN - - ! Awaiting HARMONIE-AROME physics changes - - IF ( YSPP_CONFIG%LPERT_ICENU ) & - CALL SET_SPP_TYPE(YSPP_ICENU, & - YSPP_CONFIG%LLNN_MEAN1, YSPP_CONFIG%LLNN_MEAN1_ICENU, & - YSPP_CONFIG%CMPERT_ICENU, YSPP_CONFIG%SDEV, & - YSPP_CONFIG%CLIP_ICENU, & - YSPP%MP_ICENU, KLON,KLEV,YSPP%N2D,KEZDIAG, & - YSPP_CONFIG%IEZDIAG_POS, & - PGP2DSPP, 1.0_JPRB,PEZDIAG) - !PGP2DSPP, XFRMIN(9),PEZDIAG) - - IF ( YSPP_CONFIG%LPERT_KGN_ACON ) & - CALL SET_SPP_TYPE(YSPP_KGN_ACON, & - YSPP_CONFIG%LLNN_MEAN1, YSPP_CONFIG%LLNN_MEAN1_KGN_ACON, & - YSPP_CONFIG%CMPERT_KGN_ACON, YSPP_CONFIG%SDEV, & - YSPP_CONFIG%CLIP_KGN_ACON, & - YSPP%MP_KGN_ACON, KLON,KLEV,YSPP%N2D,KEZDIAG, & - YSPP_CONFIG%IEZDIAG_POS, & - PGP2DSPP, 10._JPRB ,PEZDIAG) - !PGP2DSPP, XFRMIN(10),PEZDIAG) - - IF ( YSPP_CONFIG%LPERT_KGN_SBGR ) & - CALL SET_SPP_TYPE(YSPP_KGN_SBGR, & - YSPP_CONFIG%LLNN_MEAN1, YSPP_CONFIG%LLNN_MEAN1_KGN_SBGR, & - YSPP_CONFIG%CMPERT_KGN_SBGR, YSPP_CONFIG%SDEV, & - YSPP_CONFIG%CLIP_KGN_SBGR, & - YSPP%MP_KGN_SBGR, KLON,KLEV,YSPP%N2D,KEZDIAG, & - YSPP_CONFIG%IEZDIAG_POS, & - PGP2DSPP, 1.0_JPRB,PEZDIAG) - !PGP2DSPP, XFRMIN(11),PEZDIAG) - -ENDIF - !Mask to limit computation IF ( KRR == 7 ) THEN IF (CMICRO /= 'ICE4' .AND. CMICRO /= 'OLD4') THEN @@ -462,11 +435,31 @@ ELSEIF (CMICRO=='ICE3') THEN & TBUDGETS=YLBUDGET, KBUDGETS=SIZE(YLBUDGET), & & PSEA=PSEA, PTOWN=PTOWN, PFPR=PFPR) ELSEIF (CMICRO=='OLD4') THEN - CALL RAIN_ICE_OLD( OSEDIC=OSEDIC, OCND2=OCND2, LGRSN=LGRSN, HSEDIM=CSEDIM, HSUBG_AUCV_RC=CSUBG_AUCV_RC,& + IF (YSPP_ICENU%LPERT) THEN + CALL APPLY_SPP(YSPP_ICENU,KLON,1,KLON,XFRMIN(9),ZICENU) + ELSE + ZICENU(:,:) = XFRMIN(9) + ENDIF + + IF (YSPP_KGN_ACON%LPERT) THEN + CALL APPLY_SPP(YSPP_KGN_ACON,KLON,1,KLON,XFRMIN(10),ZKGN_ACON) + ELSE + ZKGN_ACON(:,:) = XFRMIN(10) + ENDIF + + IF (YSPP_KGN_SBGR%LPERT) THEN + CALL APPLY_SPP(YSPP_KGN_SBGR,KLON,1,KLON,XFRMIN(11),ZKGN_SBGR) + ELSE + ZKGN_SBGR(:,:) = XFRMIN(11) + ENDIF + CALL RAIN_ICE_OLD( OSEDIC=OSEDIC, OCND2=OCND2, LKOGAN=LKOGAN, LMODICEDEP=LMODICEDEP, & + & HSEDIM=CSEDIM, HSUBG_AUCV_RC=CSUBG_AUCV_RC, & & OWARM=OWARM,KKA=KKA,KKU=KKU,KKL=KKL,KSPLITR=KSPLITR, & & PTSTEP=2*PTSTEP, KRR=KRR, & & PDZZ=PDZZ, PRHODJ=PRHODJ, PRHODREF=PRHODREF, PEXNREF=PEXNREF,& & PPABST=PPABSM, PCIT=PCIT, PCLDFR=PCLDFR, & + & PICLDFR=PICLDFR, PWCLDFR=PWCLDFR, & + & PSSIO=PSSIO, PSSIU=PSSIU, PIFR=PIFR, & & PTHT=PTHT,PRVT= PRT(:,:,:,1),PRCT= PRT(:,:,:,2), & & PRRT=PRT(:,:,:,3), & & PRIT=PRT(:,:,:,4), PRST=PRT(:,:,:,5), & @@ -476,15 +469,39 @@ ELSEIF (CMICRO=='OLD4') THEN & PRIS=PRS(:,:,:,4),PRSS= PRS(:,:,:,5),PRGS= PRS(:,:,:,6),& & PINPRC=ZINPRC,PINPRR=PINPRR,PEVAP3D=PEVAP,& & PINPRS=PINPRS, PINPRG=PINPRG, & - & PSIGS=PSIGS, PSEA=PSEA, PTOWN=PTOWN, PRHT=PRT(:,:,:,7),& + & PSIGS=PSIGS, PSEA=PSEA, PTOWN=PTOWN, & + & YDDDH=YDDDH,YDLDDH=YDLDDH,YDMDDH=YDMDDH, & + & PRHT=PRT(:,:,:,7),& & PRHS=PRS(:,:,:,7), PINPRH=PINPRH, PFPR=PFPR, & - & YDDDH=YDDDH,YDLDDH=YDLDDH,YDMDDH=YDMDDH ) + & PICENU=ZICENU, & + & PKGN_ACON=ZKGN_ACON, & + & PKGN_SBGR=ZKGN_SBGR) ELSE - CALL RAIN_ICE_OLD ( OSEDIC=OSEDIC, OCND2=OCND2, LGRSN=LGRSN, HSEDIM=CSEDIM, HSUBG_AUCV_RC=CSUBG_AUCV_RC, & + IF (YSPP_ICENU%LPERT) THEN + CALL APPLY_SPP(YSPP_ICENU,KLON,1,KLON,XFRMIN(9),ZICENU) + ELSE + ZICENU(:,:) = XFRMIN(9) + ENDIF + + IF (YSPP_KGN_ACON%LPERT) THEN + CALL APPLY_SPP(YSPP_KGN_ACON,KLON,1,KLON,XFRMIN(10),ZKGN_ACON) + ELSE + ZKGN_ACON(:,:) = XFRMIN(10) + ENDIF + + IF (YSPP_KGN_SBGR%LPERT) THEN + CALL APPLY_SPP(YSPP_KGN_SBGR,KLON,1,KLON,XFRMIN(11),ZKGN_SBGR) + ELSE + ZKGN_SBGR(:,:) = XFRMIN(11) + ENDIF + CALL RAIN_ICE_OLD( OSEDIC=OSEDIC, OCND2=OCND2, LKOGAN=LKOGAN, LMODICEDEP=LMODICEDEP, & + & HSEDIM=CSEDIM, HSUBG_AUCV_RC=CSUBG_AUCV_RC, & & OWARM=OWARM,KKA=KKA,KKU=KKU,KKL=KKL,KSPLITR=KSPLITR, & & PTSTEP=2*PTSTEP, KRR=KRR, & - & PDZZ=PDZZ, PRHODJ=PRHODJ, PRHODREF=PRHODREF,PEXNREF=PEXNREF,& + & PDZZ=PDZZ, PRHODJ=PRHODJ, PRHODREF=PRHODREF, PEXNREF=PEXNREF,& & PPABST=PPABSM, PCIT=PCIT, PCLDFR=PCLDFR, & + & PICLDFR=PICLDFR, PWCLDFR=PWCLDFR, & + & PSSIO=PSSIO, PSSIU=PSSIU, PIFR=PIFR, & & PTHT=PTHT,PRVT= PRT(:,:,:,1),PRCT= PRT(:,:,:,2), & & PRRT=PRT(:,:,:,3), & & PRIT=PRT(:,:,:,4), PRST=PRT(:,:,:,5), & @@ -494,10 +511,12 @@ ELSE & PRIS=PRS(:,:,:,4),PRSS= PRS(:,:,:,5),PRGS= PRS(:,:,:,6),& & PINPRC=ZINPRC,PINPRR=PINPRR,PEVAP3D=PEVAP,& & PINPRS=PINPRS, PINPRG=PINPRG, & - & PSIGS=PSIGS, PSEA=PSEA, PTOWN=PTOWN, PFPR=PFPR, & + & PSIGS=PSIGS, PSEA=PSEA, PTOWN=PTOWN, & & YDDDH=YDDDH,YDLDDH=YDLDDH,YDMDDH=YDMDDH, & - & YSPP_KGN_ACON=YSPP_KGN_ACON, & - & YSPP_KGN_SBGR=YSPP_KGN_SBGR) + & PFPR=PFPR, & + & PICENU=ZICENU, & + & PKGN_ACON=ZKGN_ACON, & + & PKGN_SBGR=ZKGN_SBGR) ENDIF !add ZINPRC in PINPRR PINPRR=PINPRR+ZINPRC diff --git a/src/arome/ext/aro_rain_ice.h b/src/arome/ext/aro_rain_ice.h index 825705af0..6b506fe89 100644 --- a/src/arome/ext/aro_rain_ice.h +++ b/src/arome/ext/aro_rain_ice.h @@ -1,19 +1,19 @@ INTERFACE SUBROUTINE ARO_RAIN_ICE(KPROMA,KKA,KKU,KKL,KLON,KLEV, KRR, KTCOUNT, KSPLITR,& - & KEZDIAG, & & OSUBG_COND, CSUBG_AUCV_RC, CSUBG_AUCV_RI, OSEDIC,CSEDIM,CMICRO,& & PTSTEP, PDZZ, PRHODJ, PRHODREF, PEXNREF,& & PPABSM, PHLC_HRC, PHLC_HCF, PHLI_HRI, PHLI_HCF, PTHT, PRT, PSIGS,PCLDFR,& & PTHS, PRS, PEVAP,& & PCIT, OWARM, PSEA, PTOWN, & - & OCND2, LGRSN, & + & PICLDFR, PWCLDFR, PSSIO, PSSIU, PIFR, & + & OCND2, LKOGAN, LMODICEDEP,& & PINPRR,PINPRS,& & PINPRG,PINPRH,PFPR,& - & PGP2DSPP,PEZDIAG, & - & YDDDH,YDLDDH,YDMDDH) + & YDDDH,YDLDDH,YDMDDH,& + & YSPP_ICENU,YSPP_KGN_ACON,YSPP_KGN_SBGR) USE PARKIND1 ,ONLY : JPIM ,JPRB USE DDH_MIX, ONLY : TYP_DDH -USE SPP_MOD, ONLY : YSPP +USE SPP_MOD_TYPE, ONLY : TSPP_CONFIG_TYPE USE YOMLDDH, ONLY : TLDDH USE YOMMDDH, ONLY : TMDDH INTEGER, INTENT(IN) :: KPROMA @@ -25,7 +25,6 @@ INTEGER(KIND=JPIM), INTENT(IN) :: KLEV INTEGER(KIND=JPIM), INTENT(IN) :: KRR INTEGER(KIND=JPIM), INTENT(IN) :: KTCOUNT INTEGER(KIND=JPIM), INTENT(IN) :: KSPLITR -INTEGER(KIND=JPIM), INTENT(IN) :: KEZDIAG LOGICAL, INTENT(IN) :: OSUBG_COND CHARACTER(LEN=4), INTENT(IN) :: CSUBG_AUCV_RC CHARACTER(LEN=80), INTENT(IN) :: CSUBG_AUCV_RI @@ -53,17 +52,22 @@ REAL(KIND=JPRB), DIMENSION(KLON,1,KLEV), INTENT(INOUT) :: PCIT LOGICAL, INTENT(IN) :: OWARM REAL(KIND=JPRB), DIMENSION(KLON,1), INTENT(IN) :: PSEA REAL(KIND=JPRB), DIMENSION(KLON,1), INTENT(IN) :: PTOWN +REAL(KIND=JPRB), DIMENSION(KLON,1,KLEV), INTENT(IN) :: PICLDFR +REAL(KIND=JPRB), DIMENSION(KLON,1,KLEV), INTENT(IN) :: PWCLDFR +REAL(KIND=JPRB), DIMENSION(KLON,1,KLEV), INTENT(IN) :: PSSIO +REAL(KIND=JPRB), DIMENSION(KLON,1,KLEV), INTENT(IN) :: PSSIU +REAL(KIND=JPRB), DIMENSION(KLON,1,KLEV), INTENT(IN) :: PIFR LOGICAL, INTENT(IN) :: OCND2 -LOGICAL, INTENT(IN) :: LGRSN +LOGICAL, INTENT(IN) :: LKOGAN +LOGICAL, INTENT(IN) :: LMODICEDEP REAL(KIND=JPRB), DIMENSION(KLON,1), INTENT(INOUT) :: PINPRR REAL(KIND=JPRB), DIMENSION(KLON,1), INTENT(INOUT) :: PINPRS REAL(KIND=JPRB), DIMENSION(KLON,1), INTENT(INOUT) :: PINPRG REAL(KIND=JPRB), DIMENSION(KLON,1), INTENT(INOUT) :: PINPRH REAL(KIND=JPRB), DIMENSION(KLON,1,KLEV,KRR), INTENT(INOUT) :: PFPR -REAL(KIND=JPRB), DIMENSION(KLON,YSPP%N2D), INTENT(INOUT) :: PGP2DSPP -REAL(KIND=JPRB), DIMENSION(KLON,KLEV,1), INTENT(INOUT) :: PEZDIAG TYPE(TYP_DDH), INTENT(INOUT) :: YDDDH TYPE(TLDDH), INTENT(IN) :: YDLDDH TYPE(TMDDH), INTENT(IN) :: YDMDDH +TYPE(TSPP_CONFIG_TYPE), INTENT(INOUT) :: YSPP_ICENU,YSPP_KGN_ACON,YSPP_KGN_SBGR END SUBROUTINE ARO_RAIN_ICE END INTERFACE diff --git a/src/arome/ext/aroini_micro.F90 b/src/arome/ext/aroini_micro.F90 new file mode 100644 index 000000000..ddacff7d3 --- /dev/null +++ b/src/arome/ext/aroini_micro.F90 @@ -0,0 +1,198 @@ +! ######spl +SUBROUTINE AROINI_MICRO(KULOUT,PTSTEP,LDWARM,CMICRO,KSPLITR,CCSEDIM,LDCRIAUTI,& + PCRIAUTI,PT0CRIAUTI,PCRIAUTC,PTSTEP_TS, CCSNOWRIMING, PMRSTEP, KMAXITER, & + LDFEEDBACKT, LDEVLIMIT, LDNULLWETG, LDWETGPOST, LDNULLWETH, LDWETHPOST, & + PFRACM90, LDCONVHG, CCSUBG_RC_RR_ACCR, CCSUBG_RR_EVAP, CCSUBG_PR_PDF, & + LDCRFLIMIT, CCFRAC_ICE_ADJUST, PSPLIT_MAXCFL,& + CCFRAC_ICE_SHALLOW_MF, LDSEDIM_AFTER,LDDEPOSC,PVDEPOSC, PFRMIN,& + LDDEPSG,PRDEPSRED,PRDEPGRED) + +USE PARKIND1, ONLY : JPRB +USE YOMHOOK , ONLY : LHOOK, DR_HOOK +!**** *INI_MICRO* - Initialize common meso_NH MODD_ used in microphysics for AROME + +! Purpose. +! -------- +! Initialize +! MODD_RAIN_ICE_DESCR, MODD_RAIN_ICE_PARAM and MODD_PARAM_ICE +! parameters used in AROME microphysics + +!** Interface. +! ---------- +! *CALL* *INI_MICRO (KULOUT,KSTEP,KSPLITR) + +! Explicit arguments : +! -------------------- +! KULOUT : Logical unit for the output +! PTSTEP : Time step +! KSPLITR : Number of small time step interation for rain sedimentation +! LDWARM : value assigned to LWARM + +! Implicit arguments : +! -------------------- +! + +! Method. +! ------- +! See documentation + +! Externals. +! ---------- + +! Reference. +! ---------- +! Documentation AROME + +! Author. +! ------- +! Y. Seity + +! Modifications. +! -------------- +! Original : 03-12-12 +! 05-08-25 Kovacic added LDWARM +! Jan 2015 S. Riette: LFEEDBACKT, LEVLIMIT, LNULLWETG, LWETGPOST, CSNOWRIMING, +! XFRACM90, NMRSITER, XMRSTEP, LSIMULSG, XTSTEP_TS +! LNULLWETH, LWETHPOST added +! Oct 2016 S. Riette: LDCRFLIMIT, CCFRAC_ICE_ADJUST +! and CCFRAC_ICE_SHALLOW_MF added +! Dec 2020 Y. Seity : Add Fog deposition term +! Jan 2020 C.Wittmann: Add LDDEPSG,PRDEPSRED,PRDEPGRED +! ------------------------------------------------------------------ + +USE MODD_RAIN_ICE_DESCR +USE MODD_RAIN_ICE_PARAM +USE MODD_PARAM_ICE +USE MODD_PARAM_C1R3 + +USE MODI_INI_RAIN_ICE +USE MODI_INI_TIWMX + +IMPLICIT NONE +! ----------------------------------------------------------------------- +! DUMMY INTEGER SCALARS +INTEGER, INTENT (IN) :: KULOUT +REAL, INTENT (IN) :: PTSTEP +LOGICAL, INTENT (IN) :: LDWARM +CHARACTER(4), INTENT (IN) :: CMICRO +CHARACTER(4), INTENT (IN) :: CCSEDIM +INTEGER, INTENT (OUT) :: KSPLITR +LOGICAL, INTENT (IN) :: LDCRIAUTI +REAL, INTENT (IN) :: PCRIAUTI +REAL, INTENT (IN) :: PT0CRIAUTI +REAL, INTENT (IN) :: PCRIAUTC +REAL, INTENT (IN) :: PTSTEP_TS +CHARACTER(4), INTENT (IN) :: CCSNOWRIMING +REAL, INTENT (IN) :: PMRSTEP +INTEGER, INTENT (IN) :: KMAXITER +LOGICAL, INTENT (IN) :: LDFEEDBACKT +LOGICAL, INTENT (IN) :: LDEVLIMIT +LOGICAL, INTENT (IN) :: LDNULLWETG +LOGICAL, INTENT (IN) :: LDWETGPOST +LOGICAL, INTENT (IN) :: LDNULLWETH +LOGICAL, INTENT (IN) :: LDWETHPOST +REAL, INTENT (IN) :: PFRACM90 +LOGICAL, INTENT (IN) :: LDCONVHG +CHARACTER(LEN=80), INTENT(IN) :: CCSUBG_RC_RR_ACCR +CHARACTER(LEN=80), INTENT(IN) :: CCSUBG_RR_EVAP +CHARACTER(LEN=80), INTENT(IN) :: CCSUBG_PR_PDF +LOGICAL, INTENT (IN) :: LDCRFLIMIT +CHARACTER(LEN=1), INTENT(IN) :: CCFRAC_ICE_ADJUST +REAL, INTENT (IN) :: PSPLIT_MAXCFL +CHARACTER(LEN=1), INTENT(IN) :: CCFRAC_ICE_SHALLOW_MF +LOGICAL, INTENT (IN) :: LDSEDIM_AFTER +LOGICAL, INTENT (IN) :: LDDEPOSC +REAL, INTENT(IN):: PVDEPOSC +REAL, OPTIONAL, INTENT (IN) :: PFRMIN(40) +LOGICAL, INTENT (IN) :: LDDEPSG +REAL, INTENT (IN) :: PRDEPSRED, PRDEPGRED + +!----------------------------------------------------------------------- +! LOCAL VARIABLES +REAL :: ZCRI0, ZTCRI0 +! ----------------------------------------------------------------------- +! 1. Set implicit default values for MODD_PARAM_ICE + +REAL(KIND=JPRB) :: ZHOOK_HANDLE +IF (LHOOK) CALL DR_HOOK('AROINI_MICRO',0,ZHOOK_HANDLE) +LWARM=LDWARM +CPRISTINE_ICE='PLAT' +CPRISTINE_ICE_C1R3='PLAT' +CHEVRIMED_ICE_C1R3='GRAU' +CSEDIM=CCSEDIM +CSUBG_RC_RR_ACCR=CCSUBG_RC_RR_ACCR +CSUBG_RR_EVAP=CCSUBG_RR_EVAP +CSUBG_PR_PDF=CCSUBG_PR_PDF +LFEEDBACKT=LDFEEDBACKT ! When .TRUE. feed back on temperature is taken into account +LEVLIMIT=LDEVLIMIT ! When .TRUE. water vapour pressure is limited by saturation +LNULLWETG=LDNULLWETG ! When .TRUE. graupel wet growth is activated with null rate (to allow water shedding) +LWETGPOST=LDWETGPOST ! When .TRUE. graupel wet growth is activated with positive temperature (to allow water shedding) +LNULLWETH=LDNULLWETH ! Same as LNULLWETG but for hail +LWETHPOST=LDWETHPOST ! Same as LWETGPOST but for hail +CSNOWRIMING=CCSNOWRIMING ! OLD or M90 for Murakami 1990 formulation +XFRACM90=PFRACM90 ! Fraction used for the Murakami 1990 formulation +NMAXITER=KMAXITER ! Maximum number of iterations for mixing ratio or time splitting +XMRSTEP=PMRSTEP ! maximum mixing ratio step for mixing ratio splitting +LCONVHG=LDCONVHG ! TRUE to allow the conversion from hail to graupel +LCRFLIMIT=LDCRFLIMIT !True to limit rain contact freezing to possible heat exchange +CFRAC_ICE_ADJUST=CCFRAC_ICE_ADJUST !Choice of solid/liquid partition in adjustements +CFRAC_ICE_SHALLOW_MF=CCFRAC_ICE_SHALLOW_MF !Choice of solid/liquid partition in shallow_mf +XSPLIT_MAXCFL=PSPLIT_MAXCFL +LSEDIM_AFTER=LDSEDIM_AFTER ! sedimentation done before or after microphysics +! +XTSTEP_TS=PTSTEP_TS ! Approximative time step for time-splitting (0 for no time-splitting) +! +! 2. Set implicit default values for MODD_RAIN_ICE_DESCR +! et MODD_RAIN_ICE_PARAM + +CALL INI_RAIN_ICE (KULOUT, PTSTEP, 20.,KSPLITR,CMICRO) +CALL INI_TIWMX + +IF(PRESENT(PFRMIN))THEN + XFRMIN = PFRMIN + WRITE(UNIT=KULOUT,FMT='('' UPDATED VALUES OF XFRMIN FROM NAMPARAR :'')') + WRITE(UNIT=KULOUT,FMT='('' XFRMIN = '',40E10.3)') XFRMIN + IF(XFRMIN(16) > 0.) THEN + CALL INI_SNOW(KULOUT) ! Recalculate snow parameters : XCCS = XFRMIN(16),XCXS = XFRMIN(17) + ENDIF +ENDIF + +!update values from namparar +LDEPOSC=LDDEPOSC +XVDEPOSC=PVDEPOSC +IF (LDCRIAUTI) THEN + + XCRIAUTI=PCRIAUTI + XCRIAUTC=PCRIAUTC + XT0CRIAUTI=PT0CRIAUTI + !second point to determine 10**(aT+b) law + ZTCRI0=-40.0 + ZCRI0=1.25E-6 + + XBCRIAUTI=-( LOG10(XCRIAUTI) - LOG10(ZCRI0)*PT0CRIAUTI/ZTCRI0 )& + *ZTCRI0/(XT0CRIAUTI-ZTCRI0) + XACRIAUTI=(LOG10(ZCRI0)-XBCRIAUTI)/ZTCRI0 + + ! 3. Write NSPLITR,updated CRIAUTI + + WRITE(UNIT=KULOUT,FMT='('' NSPLITR = '',I8.4)')KSPLITR + WRITE(UNIT=KULOUT,FMT='('' UPDATED VALUES FROM NAMPARAR :'')') + WRITE(UNIT=KULOUT,FMT='('' LCRIAUTI = '',L5)')LDCRIAUTI + WRITE(UNIT=KULOUT,FMT='('' XCRIAUTI = '',E13.6)')XCRIAUTI + WRITE(UNIT=KULOUT,FMT='('' XACRIAUTI = '',E13.6)')XACRIAUTI + WRITE(UNIT=KULOUT,FMT='('' XBCRIAUTI = '',E13.6)')XBCRIAUTI + WRITE(UNIT=KULOUT,FMT='('' XT0CRIAUTI = '',E13.6)')XT0CRIAUTI + WRITE(UNIT=KULOUT,FMT='('' XCRIAUTC = '',E13.6)')XCRIAUTC + WRITE(UNIT=KULOUT,FMT='('' XVDEPOSC = '',E13.6)')XVDEPOSC + WRITE(UNIT=KULOUT,FMT='('' LDEPOSC = '',L5)')LDEPOSC +ENDIF + +XRDEPSRED=PRDEPSRED +XRDEPGRED=PRDEPGRED + + +! ----------------------------------------------------------------------- + +IF (LHOOK) CALL DR_HOOK('AROINI_MICRO',1,ZHOOK_HANDLE) +RETURN +END SUBROUTINE AROINI_MICRO diff --git a/src/arome/ext/aroini_micro.h b/src/arome/ext/aroini_micro.h new file mode 100644 index 000000000..bf6d1d18b --- /dev/null +++ b/src/arome/ext/aroini_micro.h @@ -0,0 +1,46 @@ +INTERFACE +SUBROUTINE AROINI_MICRO(KULOUT,PTSTEP,LDWARM,CMICRO,KSPLITR,CCSEDIM,LDCRIAUTI,& + & PCRIAUTI,PT0CRIAUTI,PCRIAUTC,PTSTEP_TS,CCSNOWRIMING, PMRSTEP,KMAXITER,& + & LDFEEDBACKT, LDEVLIMIT, LDNULLWETG, LDWETGPOST, LDNULLWETH, LDWETHPOST, & + & PFRACM90, LDCONVHG, CCSUBG_RC_RR_ACCR, CCSUBG_RR_EVAP, CCSUBG_PR_PDF, & + & LDCRFLIMIT, CCFRAC_ICE_ADJUST, PSPLIT_MAXCFL,& + & CCFRAC_ICE_SHALLOW_MF, LDSEDIC_AFTER,LDDEPOSC, PVDEPOSC, PFRMIN,& + & LDDEPSG,PRDEPSRED,PRDEPGRED) +USE PARKIND1 ,ONLY : JPIM ,JPRB +INTEGER(KIND=JPIM), INTENT (IN) :: KULOUT +REAL(KIND=JPRB), INTENT (IN) :: PTSTEP +LOGICAL, INTENT (IN) :: LDWARM +CHARACTER (LEN=4), INTENT (IN) :: CMICRO +CHARACTER(4), INTENT (IN) :: CCSEDIM +INTEGER(KIND=JPIM), INTENT (OUT) :: KSPLITR +LOGICAL, INTENT (IN) :: LDCRIAUTI +REAL(KIND=JPRB), INTENT (IN) :: PCRIAUTI +REAL(KIND=JPRB), INTENT (IN) :: PT0CRIAUTI +REAL(KIND=JPRB), INTENT (IN) :: PCRIAUTC +REAL(KIND=JPRB), INTENT (IN) :: PTSTEP_TS +CHARACTER(4), INTENT (IN) :: CCSNOWRIMING +REAL(KIND=JPRB), INTENT (IN) :: PMRSTEP +INTEGER(KIND=JPIM), INTENT (IN) :: KMAXITER +LOGICAL, INTENT (IN) :: LDFEEDBACKT +LOGICAL, INTENT (IN) :: LDEVLIMIT +LOGICAL, INTENT (IN) :: LDNULLWETG +LOGICAL, INTENT (IN) :: LDWETGPOST +LOGICAL, INTENT (IN) :: LDNULLWETH +LOGICAL, INTENT (IN) :: LDWETHPOST +REAL(KIND=JPRB), INTENT (IN) :: PFRACM90 +LOGICAL, INTENT (IN) :: LDCONVHG +CHARACTER(LEN=80), INTENT(IN) :: CCSUBG_RC_RR_ACCR +CHARACTER(LEN=80), INTENT(IN) :: CCSUBG_RR_EVAP +CHARACTER(LEN=80), INTENT(IN) :: CCSUBG_PR_PDF +LOGICAL, INTENT (IN) :: LDCRFLIMIT +CHARACTER(LEN=1), INTENT(IN) :: CCFRAC_ICE_ADJUST +REAL(KIND=JPRB), INTENT (IN) :: PSPLIT_MAXCFL +CHARACTER(LEN=1), INTENT(IN) :: CCFRAC_ICE_SHALLOW_MF +LOGICAL, INTENT (IN) :: LDSEDIC_AFTER +LOGICAL, INTENT (IN) :: LDDEPOSC +REAL(KIND=JPRB), INTENT (IN) :: PVDEPOSC +REAL(KIND=JPRB), OPTIONAL, INTENT (IN) :: PFRMIN(40) +LOGICAL, INTENT (IN) :: LDDEPSG +REAL(KIND=JPRB), INTENT (IN) :: PRDEPSRED, PRDEPGRED +END SUBROUTINE AROINI_MICRO +END INTERFACE diff --git a/src/arome/ext/dead_code/aro_icecld.F90 b/src/arome/ext/dead_code/aro_icecld.F90 deleted file mode 100644 index 95b508910..000000000 --- a/src/arome/ext/dead_code/aro_icecld.F90 +++ /dev/null @@ -1,217 +0,0 @@ -SUBROUTINE ARO_ICECLD & -! Input : - & ( PP,PZ,PDZ,PT,PR,PPBLH,PWCLD,XW2D, & -! Output : - & SIFRC,SSIO,SSIU,W2D,RSI) - - - USE PARKIND1, ONLY : JPRB - USE YOMHOOK , ONLY : LHOOK, DR_HOOK - USE MODD_CST,ONLY : XCPD,XCPV,XLVTT,XLSTT,XG,XRD,XTT,XMD,XMV,XEPSILO - IMPLICIT NONE -!----------------------------------------------------------------------- -! -! Purpose: -! calculate subgridscale fraction of supersaturation with respect to ice. -! Method: -! Assume a linear distubution of relative humidity and let the variability -! of humidity be a function of model level thickness. -! (Also a function of of humidity itself in the boundary layer) -! Interface: subroutine ARO_ICECLD is called -! ------------ from subroutine 'rain_ice' -! -! variable type content -! ======== ==== ======= -! -! INPUT arguments (arguments d'entree) -!---------------------------------------------- -! PP : pressure at model level (Pa) -! PZ : model level height (m) -! PDZ : model level thickness (m) -! PT : temperature (K) -! PR : model level humidity mixing ratio (kg/kg) -! PPBLH : plantetary layer height (m) (negative value means unknown) -! PWCLD : water and / mixed phase cloud cover (negative means unknown) -! XW2D : quota between ice crystal concentration between dry and wet -! part of a gridbox - -! OUTPUT arguments (arguments d'sortie) -!--------------------------------------------- -! SIFRC : subgridscale fraction with supersaturation with respect to ice. -! SSIO : Super-saturation with respect to ice in the -! supersaturated fraction -! SSIU : Sub-saturation with respect to ice in the sub-saturated -! fraction -! W2D : Factor used to get consistncy between the mean value of -! the gridbox and parts of the gridbox -! RSI : Saturation mixing ratio over ice - - - - -REAL, INTENT(IN) :: PP -REAL, INTENT(IN) :: PZ -REAL, INTENT(IN) :: PDZ -REAL, INTENT(IN) :: PT -REAL, INTENT(IN) :: PR -REAL, INTENT(IN) :: PPBLH -REAL, INTENT(IN) :: PWCLD -REAL, INTENT(IN) :: XW2D - -! OUTPUT arguments (arguments d'sortie) -!--------------------------------------------- -REAL, INTENT(OUT) :: SIFRC -REAL, INTENT(OUT) :: SSIO -REAL, INTENT(OUT) :: SSIU -REAL, INTENT(OUT) :: W2D -REAL, INTENT(OUT) :: RSI -! Working variables: - - REAL :: ZSIGMAX,ZSIGMAY,ZSIGMAZ,ZFICE,ZXDIST, ZYDIST,& - & ZRSW,ZRHW,ZRHIN,ZDRHDZ,ZZ,ZRHDIST ,ZRHLIM, & - & ZRHDIF,ZWCLD ,ZI2W,ZRHLIMICE,ZRHLIMINV,ZA,ZRHI - -! ================================================================== -! 1. Declarations. -! ================================================================== -! 1.1 MODULES USED -!----------------------------------------------------------------------- - REAL AROQSATMX - -REAL(KIND=JPRB) :: ZHOOK_HANDLE -IF (LHOOK) CALL DR_HOOK('ARO_ICECLD',0,ZHOOK_HANDLE) - -SIFRC = 0. -ZFICE = 0. -ZRSW= AROQSATMX(PP,PT,ZFICE) -ZRHW= PR/ZRSW -ZFICE=1. -RSI= AROQSATMX(PP,PT,ZFICE) -ZRHI= PR/RSI -ZI2W = ZRSW/RSI -SSIU=ZRHI -SSIO=SSIU -W2D = 1. - -IF(PT>XTT.OR. PR<=0.)THEN - SSIU=SSIU-1 - SSIO=SSIU - IF(PWCLD>=0.)SIFRC=PWCLD - IF (LHOOK) CALL DR_HOOK('ARO_ICECLD',1,ZHOOK_HANDLE) - RETURN -ENDIF - -ZSIGMAX=3.E-4 ! assumed rh variation in x axis direction -ZFICE=0. ! fraction of ice -ZSIGMAY=ZSIGMAX ! assumed rh variation in y axis direction -ZSIGMAZ=1.6E-2 ! t5 - -!ZXDIST=MAX(0.10,DTHETA)*110000. -!ZXDIST=DTHETA*110000. -ZXDIST=2500. - ! gridsize in x axis (m) Avoid too low - ! since the model has a tendency to become - ! drier at high horizontal resolution - ! due to stronger vertical velocities. -ZYDIST=ZXDIST ! gridsize in y axis (m) - - - - -ZRHIN = MAX(0.05, MIN(1.,PR/ZRSW)) - -ZDRHDZ=ZRHIN*XG /(PT*XRD)* & - & ( XEPSILO*XLVTT/(XCPD*PT) -1.) ! correct -! & ( XEPSILO*XLSTT/(XCPD*PT) -1.) ! incorrect but currently used -! more exact -! assumed rh variation in the z axis (rh/m) in the pbl . -! Also possible to just use -! zdrhdz=4.2e-4_jprb ! rh/m ! -ZZ=0. - - -IF(PPBLH < 0. )THEN ! Assume boundary layer height is not available - ZZ= MIN(1.,MAX(0.,PZ*0.001)) -ELSE - IF(PZ > 35. .AND. PZ > PPBLH)ZZ= 1. -ENDIF - -! 1.6e-2 rh/m means variations is of order 0.5 for a 1km dept. -! sigmaz=4e-2 ! EO 140 lev. - - -! Compute rh-variation is x,y,z direction as approxmately -! independent, exept for the z variation in the pbl, where rh is -! assumed to be fairly constantly increasing with height -if(ZXDIST*ZSIGMAX**2 + ZYDIST*ZSIGMAY**2 + & - & (1.-ZZ)* (PDZ* ZDRHDZ)**2 + ZZ*PDZ* ZSIGMAZ**2 < 0.)then -write(*,*)'in ARO_ICECLD: PDZ ZDRHDZ,expression=',PDZ, ZDRHDZ& -& ,ZXDIST*ZSIGMAX**2 + ZYDIST*ZSIGMAY**2 + & - & (1.-ZZ)* (PDZ* ZDRHDZ)**2 + ZZ*PDZ* ZSIGMAZ**2 -endif -ZRHDIST = SQRT( ZXDIST*ZSIGMAX**2 + ZYDIST*ZSIGMAY**2 + & - & (1.-ZZ)* (PDZ* ZDRHDZ)**2 + ZZ*PDZ* ZSIGMAZ**2) -! z-variation of rh in the pbl z-variation of rh outside the pbl -! Safety for very coarse vertical resolution: -IF(ZZ > 0.1) ZRHDIST = ZRHDIST/(1.+ZRHDIST) - -!!!! Note ZRHDIST is with respect to water ! !!!!!!!!!!!! - - -ZRHLIM = MAX(0.5, MIN(0.99,1. - 0.5*ZRHDIST)) - - -IF(PWCLD < 0.)THEN - ! Assume water/mixed-phase cloud cover from e.g. - ! statistical cloud scheme is not avialabe - ZRHDIF = (1. - ZRHW)/(1.0-ZRHLIM) - ZRHDIF = 1. - SQRT(MAX(0.,ZRHDIF)) - ZWCLD = MIN(1.,MAX(ZRHDIF,0.0)) -ELSE - ZWCLD = PWCLD -! possible to backwards compute a critical relative humity consitent with -! input cloudcover: -! IF(PWCLD < 0.99 .AND. PWCLD > 0.01) ZRHLIM= 1. - (1.-ZRHW)/(1.-PWCLD)**2 -ENDIF - -SIFRC = ZWCLD - -! relation rhlim with respect to water to that of ice: -!ZRHLIMICE = MAX(ZRHDMIN*ZI2W,1.+ ZI2W*( ZRHLIM - 1.)) -ZRHLIMICE = 1.+ ZI2W*( ZRHLIM - 1.) - -IF(ZRHLIM <= 0.999)THEN - - ! compute a 1/(1-rhlim) constistant with lstmp(i,k): - ZRHLIMINV = 1./(1. - ZRHLIMICE) - ZRHDIF = (ZRHI - ZRHLIMICE)*ZRHLIMINV - - IF(ZWCLD==0.)THEN - SIFRC = MIN(1.,0.5*MAX(0.,ZRHDIF)) - ELSE - ZA =1. - 1./ZI2W - SIFRC =MIN(1.,ZA*0.5/ (1. - ZRHLIM)) - SIFRC = MIN(1.,ZWCLD + SIFRC) - ENDIF -ENDIF - - - -IF(SIFRC > 0.01) THEN - SSIU = SIFRC + ZRHLIMICE*(1.-SIFRC) - SSIO = (ZRHI - (1.- SIFRC)*SSIU)/SIFRC -ELSE - SIFRC=0.! to aviod mismatch with output variables - ZA = MIN(0.,ZRHI-ZRHLIMICE) - SSIU = MAX(0.,SIFRC + ZRHLIMICE*(1.-SIFRC) + 2*ZA ) -ENDIF - - -! Transform from relative humidity to degree of saturation: -SSIU = SSIU - 1. -SSIO = SSIO - 1. - -IF (XW2D > 1.) W2D = 1./(1. - SIFRC + XW2D*SIFRC) - -IF (LHOOK) CALL DR_HOOK('ARO_ICECLD',1,ZHOOK_HANDLE) -END SUBROUTINE ARO_ICECLD diff --git a/src/arome/ext/dead_code/aro_tiwmx.F90 b/src/arome/ext/dead_code/aro_tiwmx.F90 deleted file mode 100644 index 55a335c81..000000000 --- a/src/arome/ext/dead_code/aro_tiwmx.F90 +++ /dev/null @@ -1,123 +0,0 @@ -FUNCTION ARO_TIWMX(P,T,QR,FICE,QRSN,RS,EPS) - -! Purpose: (*) -! The fuction arotiwmx returns the wet bulb temperature, but also the -! corresponding saturation specific humidity as an output parameter. -! ------------------------------------------------------------------- -! Computation of wet bulb temperature. -! TIW is found iteratively. Note that Q is used instead of WV. -! Converges VERY quickly. EPS is the threshold value for -! TIW(n)-TIW(n-1) at wich the iteration is interupted. (n is -! iteration number).Modified in July 1988 by Stefan Gollvik -! Convereted to new fortran standard in Dec. 2006 by Karl-Ivar Ivarsson. -! Convereted to AROME in 2014 by Karl-Ivar Ivarsson. -! INTERFACE : the function is intended to be used everywhere. -! INPUT arguments (arguments d'entree) -! ----------------------------------------------------- -! P : pressure (Pa) -! T : temperature (K) -! QR : mixing ratio humidity (kg/Kg) -! FICE : fraction of ice (0 to 1) -! EPS : The value determens the accuracy of the output value. 0.1 -! : is suffient in most cases. Low value means high accuracy but -! : also high computational cost. - -! OUTPUT arguments (arguments d'sortie) -! ----------------------------------------------------- -! RS : saturation mixing ratio (fice determines if it is over ice or water) -! -! QRSN : saturation mixing ratio for the wet bulb temperature. -! (Kg/Kg) -! ( the function itself is the wet bulb temperature (K) ) - -! Work variables : -! ----------------------------------------------------- -! f : temporary variable , temperature (K) -! dfdt : temporary variable (K/K) -! t2 : temperature used in iteration (K) -! thigh : temperature ( t2 + EPS K ) -! tlow : temperature ( t2 - EPS K ) -! dt : temperature residual (K) -! dqsdt : approximative d(qsat)/d(T) in iteration (1/K) -! b : (latent heat)/(heat capacity for dry air) (K) -! iter : iteration number - -! 1. Declarations. -! ================================================================== -! 1.1 MODULES USED - USE MODD_CST,ONLY : XCPD,XCPV,XLVTT,XLSTT,XRD,XTT,XEPSILO, & - & XALPW,XBETAW,XGAMW,XALPI,XBETAI,XGAMI - USE PARKIND1, ONLY : JPRB - USE YOMHOOK , ONLY : LHOOK, DR_HOOK - IMPLICIT NONE - -! Function name : - REAL :: ARO_TIWMX - -! Input Arguments - REAL, INTENT(IN) :: P,T,QR,FICE,EPS - -! Output Arguments - REAL, INTENT(OUT) :: QRSN,RS - -! Work variables : - REAL :: F,DFDT,T2,DT,QSN,DQSDT,B - REAL :: ZB,ZG,ZES,ZDESDT - INTEGER :: ITER - REAL(KIND=JPRB) :: ZHOOK_HANDLE - IF (LHOOK) CALL DR_HOOK('ARO_TIWMX',0,ZHOOK_HANDLE) - - T2 = T -!! Q = QR !approximation - - B = ( XLVTT*(1.-FICE) + FICE*XLSTT )/XCPD - - ARO_TIWMX = T2 - DO ITER=1,10 - ZB = (XBETAI*FICE + XBETAW*(1.-FICE))/T2 - ZG = XGAMI*FICE + XGAMW*(1.-FICE) - ZES = EXP(XALPI*FICE + XALPW*(1.-FICE) - ZB - ZG*ALOG(T2)) - ZDESDT = ZES*(ZB - ZG)/T2 - IF(ZES >= P)THEN - QSN = 1. - DQSDT = 0. - ELSE - QSN = XEPSILO*ZES/(P-ZES) - DQSDT = QSN*ZDESDT*( 1.0/ZES + 1.0/(P-ZES) ) - ENDIF - IF ( ITER == 1 ) RS = QSN - F = T2 - T + B*(QSN - QR) - DFDT = 1. + B*DQSDT - DT = -F / DFDT - T2 = T2 + DT - IF(ABS(DT) <= EPS)THEN - ARO_TIWMX = T2 - QSN = MIN(1.,QSN+DT*DQSDT) - QRSN = QSN ! approximation - IF (LHOOK) CALL DR_HOOK('ARO_TIWMX',1,ZHOOK_HANDLE) - RETURN - ENDIF - ENDDO - IF (LHOOK) CALL DR_HOOK('ARO_TIWMX',1,ZHOOK_HANDLE) -END FUNCTION ARO_TIWMX -!!!!!!!!!!!! -FUNCTION AROQSATMX(P,T,FICE) - USE MODD_CST,ONLY : XALPW,XBETAW,XGAMW,XALPI,XBETAI,XGAMI,XTT,XEPSILO - IMPLICIT NONE - REAL ZES,ZQS,P,T,FICE,& - &AROQSATMX - - ZES = EXP(XALPI*FICE + XALPW*(1.-FICE) - & - & (XBETAI*FICE + XBETAW*(1.-FICE))/T - & - & (XGAMI*FICE + XGAMW*(1.-FICE))*ALOG(T)) - - IF(ZES >= P)THEN ! temp > boiling point, condensation not possible. - ! Then this function lacks physical meaning, - ! here set to one - ZQS=1. - ELSE -! ZQS=0.622*ZES/(P-0.378*ZES) !q - ZQS=XEPSILO*ZES/(P-ZES) !r - ENDIF - AROQSATMX=ZQS -END FUNCTION AROQSATMX diff --git a/src/arome/ext/dead_code/modi_aro_icecld.F90 b/src/arome/ext/dead_code/modi_aro_icecld.F90 deleted file mode 100644 index 10cf08aa0..000000000 --- a/src/arome/ext/dead_code/modi_aro_icecld.F90 +++ /dev/null @@ -1,24 +0,0 @@ -! ######spl - MODULE MODI_ARO_ICECLD -! #################### -! -INTERFACE -SUBROUTINE ARO_ICECLD & - & ( PP,PZ,PDZ,PT,PR,PPBLH,PWCLD,XW2D, & - & SIFRC,SSIO,SSIU,W2D,RSI) -REAL, INTENT(IN) :: PP -REAL, INTENT(IN) :: PZ -REAL, INTENT(IN) :: PDZ -REAL, INTENT(IN) :: PT -REAL, INTENT(IN) :: PR -REAL, INTENT(IN) :: PPBLH -REAL, INTENT(IN) :: PWCLD -REAL, INTENT(IN) :: XW2D -REAL, INTENT(OUT) :: SIFRC -REAL, INTENT(OUT) :: SSIO -REAL, INTENT(OUT) :: SSIU -REAL, INTENT(OUT) :: W2D -REAL, INTENT(OUT) :: RSI -END SUBROUTINE ARO_ICECLD -END INTERFACE -END MODULE MODI_ARO_ICECLD diff --git a/src/arome/ext/dead_code/modi_aro_tiwmx.F90 b/src/arome/ext/dead_code/modi_aro_tiwmx.F90 deleted file mode 100644 index 1f192046a..000000000 --- a/src/arome/ext/dead_code/modi_aro_tiwmx.F90 +++ /dev/null @@ -1,11 +0,0 @@ -! ######spl - MODULE MODI_ARO_TIWMX -! #################### -! -INTERFACE -FUNCTION ARO_TIWMX(P,T,QR,FICE,QRSN,RS,EPS) - REAL, INTENT(IN) :: P,T,QR,FICE,EPS - REAL, INTENT(OUT) :: QRSN,RS -END FUNCTION ARO_TIWMX -END INTERFACE -END MODULE MODI_ARO_TIWMX diff --git a/src/arome/ext/namparar.nam.h b/src/arome/ext/namparar.nam.h index 6f667ceae..c3c90b342 100644 --- a/src/arome/ext/namparar.nam.h +++ b/src/arome/ext/namparar.nam.h @@ -1,9 +1,10 @@ ! ------------------------------------------------------------------ NAMELIST/NAMPARAR/LOSUBG_COND,CSUBG_AUCV_RC,CSUBG_AUCV_RI,LOSIGMAS,NSWB_MNH,NPRINTFR,LSQUALL,& &NREFROI1,NREFROI2,VSQUALL,NPTP,LDIAGWMAX,NDIAGWMAX,CMICRO,CSEDIM,& - &LAROBU_ENABLE,CMF_UPDRAFT,CMF_CLOUD,LMIXUV,LLCRIT,LTOTPREC,LOSEDIC,& - &VSIGQSAT,XLINI,LOLSMC,LOTOWNC,LOCND2,RADGR,RADSN,LHARATU,& - &LGRSN,NPROMICRO,& + &LAROBU_ENABLE,CMF_UPDRAFT,CMF_CLOUD,LMIXUV,LLCRIT,LTOTPREC,& + <OTPRECL,LHGT_QS,LOSEDIC,& + &VSIGQSAT,XLINI,LOLSMC,LOTOWNC,LOCND2,LKOGAN,LMODICEDEP,& + &LICERAD,RFRMIN,RADGR,RADSN,LSTATNW,LHARATU,NPROMICRO,& &XALP_PERT,XABUO,XBENTR,XBDETR,XCMF,XENTR_MF,XCRAD_MF,XENTR_DRY,& &XDETR_DRY,XDETR_LUP,XKCF_MF,XKRC_MF,XTAUSIGMF,XPRES_UV,XFRAC_UP_MAX,& &XALPHA_MF,XSIGMA_MF,XA1,XB,XC,XBETA1,LTHETAS,& @@ -13,5 +14,6 @@ NAMELIST/NAMPARAR/LOSUBG_COND,CSUBG_AUCV_RC,CSUBG_AUCV_RI,LOSIGMAS,NSWB_MNH,NPRI &LFEEDBACKT,LEVLIMIT,LNULLWETG,LWETGPOST,LNULLWETH,LWETHPOST, & &XFRACM90, LCONVHG, LCRFLIMIT, & &CFRAC_ICE_ADJUST, XSPLIT_MAXCFL, CFRAC_ICE_SHALLOW_MF, LSEDIM_AFTER,& - &LDEPOSC, XVDEPOSC, CCONDENS, CLAMBDA3, CSUBG_MF_PDF + &LDEPOSC, XVDEPOSC, CCONDENS, CLAMBDA3, CSUBG_MF_PDF,& + &LDEPSG,RDEPSRED,RDEPGRED ! ------------------------------------------------------------------ diff --git a/src/arome/ext/spp_mod_type.F90 b/src/arome/ext/spp_mod_type.F90 new file mode 100644 index 000000000..0758cb3d9 --- /dev/null +++ b/src/arome/ext/spp_mod_type.F90 @@ -0,0 +1,122 @@ +MODULE SPP_MOD_TYPE + + USE MODE_MSG, ONLY: PRINT_MSG, NVERB_FATAL + + TYPE TSPP_CONFIG_TYPE + + INTEGER :: MP_SELF=-1 + + LOGICAL :: LPERT=.FALSE. + LOGICAL :: LPRINT=.TRUE. + LOGICAL :: LLNN_MEAN1=.FALSE. + LOGICAL :: LPERT_UNIFORM=.FALSE. + + REAL :: CMPERT + REAL :: UNIFORM_OFFSET + REAL :: SDEV + REAL :: CLIP(2) + REAL, POINTER :: PGP2DSPP(:) => NULL(), & + PTRNDIAG(:) => NULL() + + CHARACTER(LEN=20) :: CTAG = '#' + + END TYPE TSPP_CONFIG_TYPE + + TYPE ALL_SPP_VARS + + ! Gather all parameter holders for convenience + + TYPE(TSPP_CONFIG_TYPE) :: YSPP_RADGR,YSPP_RADSN, & + YSPP_CLDDPTH,YSPP_CLDDPTHDP, & + YSPP_RFAC_TWOC,YSPP_RZC_H,YSPP_RZL_INF, & + YSPP_PSIGQSAT,YSPP_ICE_CLD_WGT, & + YSPP_RSWINHF,YSPP_RLWINHF, & + YSPP_ICENU,YSPP_KGN_ACON,YSPP_KGN_SBGR + + END TYPE ALL_SPP_VARS + + CONTAINS + + ! + !----------------------------------------------------------------------- + ! + + SUBROUTINE CLEAR_SPP_TYPE(TSPP) + IMPLICIT NONE + TYPE(TSPP_CONFIG_TYPE), INTENT(INOUT) :: TSPP + END SUBROUTINE CLEAR_SPP_TYPE + + ! + !----------------------------------------------------------------------- + ! + + SUBROUTINE SET_SPP_TYPE(TSPP,CTAG,LLNN_MEAN1_SELF, & + LPERT_UNIFORM, & + CMPERT,UNIFORM_OFFSET,SDEV,CLIP,MP_SELF, & + KLON,KLEV,NEZDIAG, & + KSTA,KEND, & + PGP2DSPP,PEZDIAG) + IMPLICIT NONE + TYPE(TSPP_CONFIG_TYPE), INTENT(INOUT) :: TSPP + CHARACTER(LEN=*), INTENT(IN ) :: CTAG + LOGICAL, INTENT(IN ) :: LLNN_MEAN1_SELF,LPERT_UNIFORM + REAL , INTENT(IN ) :: CMPERT,UNIFORM_OFFSET,SDEV,CLIP(2) + INTEGER , INTENT(IN ) :: MP_SELF,KLON,KLEV,KSTA,KEND, & + NEZDIAG + REAL , TARGET, INTENT(IN ) :: PGP2DSPP(KLON,0) + REAL , TARGET, INTENT(INOUT) :: PEZDIAG(KLON,KLEV,NEZDIAG) + CALL PRINT_MSG(NVERB_FATAL, 'GEN', 'SPP_MOD_TYPE', 'SET_SPP_TYPE is not implemented in PHYEX') + END SUBROUTINE SET_SPP_TYPE + + ! + !----------------------------------------------------------------------- + ! + + SUBROUTINE APPLY_SPP(TSPP, & + KLON,KSTA,KEND, & + PREFVAL,PFIELD) + IMPLICIT NONE + TYPE(TSPP_CONFIG_TYPE), INTENT(INOUT) :: TSPP + INTEGER , INTENT(IN ) :: KLON,KSTA,KEND + REAL , INTENT(IN ) :: PREFVAL + REAL , INTENT(INOUT) :: PFIELD(KLON) + CALL PRINT_MSG(NVERB_FATAL, 'GEN', 'SPP_MOD_TYPE', 'APPLY_SPP is not implemented in PHYEX') + END SUBROUTINE APPLY_SPP + + ! + !----------------------------------------------------------------------- + ! + + SUBROUTINE DIA_SPP(TSPP,KSTA,KEND) + IMPLICIT NONE + TYPE(TSPP_CONFIG_TYPE), INTENT(IN) :: TSPP + INTEGER , INTENT(IN) :: KSTA,KEND + CALL PRINT_MSG(NVERB_FATAL, 'GEN', 'SPP_MOD_TYPE', 'DIA_SPP is not implemented in PHYEX') + END SUBROUTINE DIA_SPP + + ! + !----------------------------------------------------------------------- + ! + SUBROUTINE SET_ALL_SPP(KLON,KLEV,NGFL_EZDIAG, & + KIDIA,KFDIA,PGP2DSPP,PEZDIAG,YSPP_ALL) + IMPLICIT NONE + INTEGER , INTENT(IN ) :: KLON,KLEV,NGFL_EZDIAG,KIDIA,KFDIA + REAL , TARGET, INTENT(IN ) :: PGP2DSPP(KLON,0) + REAL , INTENT(INOUT) :: PEZDIAG(KLON,KLEV,NGFL_EZDIAG) + TYPE(ALL_SPP_VARS), INTENT(INOUT) :: YSPP_ALL + CALL PRINT_MSG(NVERB_FATAL, 'GEN', 'SPP_MOD_TYPE', 'SET_ALL_SPP is not implemented in PHYEX') + END SUBROUTINE SET_ALL_SPP + + ! + !----------------------------------------------------------------------- + ! + + SUBROUTINE CLEAR_ALL_SPP(YSPP_ALL) + IMPLICIT NONE + TYPE(ALL_SPP_VARS), INTENT(INOUT) :: YSPP_ALL + CALL PRINT_MSG(NVERB_FATAL, 'GEN', 'SPP_MOD_TYPE', 'CLEAR_ALL_SPP is not implemented in PHYEX') + END SUBROUTINE CLEAR_ALL_SPP + +END MODULE SPP_MOD_TYPE + + diff --git a/src/arome/ext/suparar.F90 b/src/arome/ext/suparar.F90 index 286a2edca..8e3d6c403 100644 --- a/src/arome/ext/suparar.F90 +++ b/src/arome/ext/suparar.F90 @@ -1,14 +1,14 @@ SUBROUTINE SUPARAR(YDGEOMETRY,YGFL,YDML_PHY_MF,KULOUT) -!**** *SUPARAR* - Initialize common parameters used in physics for AROME +!**** *SUPARAR* - Initialize common parameters used in physics for AROME ! and SURFEX ! Purpose. ! -------- ! Initialize MODD_PARAMETERS, MODD_CST, MODD_CONF, -! MODD_RAIN_ICE_DESCR, MODD_RAIN_ICE_PARAM, MODD_BUDGET +! MODD_RAIN_ICE_DESCR, MODD_RAIN_ICE_PARAM, MODD_BUDGET ! parameters used in meso_NH Physics and aladin/meso_NH physics -! interface +! interface !** Interface. ! ---------- @@ -31,7 +31,7 @@ SUBROUTINE SUPARAR(YDGEOMETRY,YGFL,YDML_PHY_MF,KULOUT) ! Reference. ! ---------- -! Documentation AROME +! Documentation AROME ! Author. ! ------- @@ -53,7 +53,7 @@ SUBROUTINE SUPARAR(YDGEOMETRY,YGFL,YDML_PHY_MF,KULOUT) ! 2014-05-27: J.M. Piriou: default values of XCQVR and GQVPLIM. ! Nov. 2014: Y. Seity, add LFPREC3D for MOCAGE ! Nov 2016, S. Riette: New ICE3/ICE4 parameters -! R. El Khatib 24-Aug-2021 NPROMICRO specific cache-blocking factor for microphysics +! Jan 2021, C.Wittmann: add LDEPSG,RDEPSRED+RDEPGRED ! End Modifications !------------------------------------------------------------------------------- @@ -100,7 +100,6 @@ REAL(KIND=JPRB) , POINTER :: XDETR_DRY CHARACTER (LEN=4) :: CMF_UPDRAFT LOGICAL , POINTER :: LMIXUV LOGICAL , POINTER :: LLCRIT -LOGICAL , POINTER :: LTOTPREC INTEGER(KIND=JPIM) , POINTER :: NREFROI1 REAL(KIND=JPRB) , POINTER :: XTAUSIGMF LOGICAL , POINTER :: LCRIAUTI @@ -122,9 +121,16 @@ REAL(KIND=JPRB) , POINTER :: XPRES_UV CHARACTER (LEN=4) :: CSUBG_AUCV_RC CHARACTER (LEN=80) :: CSUBG_AUCV_RI REAL(KIND=JPRB) , POINTER :: XALP_PERT -LOGICAL , POINTER :: LOCND2 -LOGICAL , POINTER :: LHARATU -LOGICAL , POINTER :: LGRSN +LOGICAL , POINTER :: LOCND2 +LOGICAL , POINTER :: LSTATNW +LOGICAL , POINTER :: LHARATU +LOGICAL , POINTER :: LKOGAN +LOGICAL , POINTER :: LHGT_QS +LOGICAL , POINTER :: LMODICEDEP +LOGICAL , POINTER :: LICERAD +LOGICAL , POINTER :: LTOTPREC +LOGICAL , POINTER :: LTOTPRECL +REAL(KIND=JPRB), DIMENSION(:), POINTER :: RFRMIN INTEGER(KIND=JPIM) , POINTER :: NPRINTFR REAL(KIND=JPRB) , POINTER :: XCQVR CHARACTER(LEN=4) :: CMICRO @@ -172,13 +178,16 @@ REAL(KIND=JPRB) , POINTER :: XSPLIT_MAXCFL LOGICAL , POINTER :: LDEPOSC REAL(KIND=JPRB) , POINTER :: XVDEPOSC INTEGER(KIND=JPIM) , POINTER :: NPROMICRO +LOGICAL, POINTER :: LDEPSG +REAL(KIND=JPRB), POINTER :: RDEPSRED +REAL(KIND=JPRB), POINTER :: RDEPGRED #include "namparar.nam.h" #include "abor1.intfb.h" ! ------------------------------------------------------------------ IF (LHOOK) CALL DR_HOOK('SUPARAR',0,ZHOOK_HANDLE) -!Associate for variables not in the include namelists nor allocated in the routine +!Associate for variables not in the include namelists nor allocated in the routine ASSOCIATE(MACPRS=>YDML_PHY_MF%YRPARAR%MACPRS, MACPRR=>YDML_PHY_MF%YRPARAR%MACPRR, & & MINPRR=>YDML_PHY_MF%YRPARAR%MINPRR, MINPRS=>YDML_PHY_MF%YRPARAR%MINPRS, & @@ -223,7 +232,13 @@ LQVTOP => YDPARAR%LQVTOP XBETA1 => YDPARAR%XBETA1 NPTP => YDPARAR%NPTP LOCND2 => YDPARAR%LOCND2 -LGRSN => YDPARAR%LGRSN +LKOGAN => YDPARAR%LKOGAN +LHGT_QS => YDPARAR%LHGT_QS +LMODICEDEP => YDPARAR%LMODICEDEP +LICERAD => YDPARAR%LICERAD +LTOTPREC => YDPARAR%LTOTPREC +LTOTPRECL => YDPARAR%LTOTPRECL +RFRMIN => YDPARAR%RFRMIN XCQVR => YDPARAR%XCQVR XFRAC_UP_MAX => YDPARAR%XFRAC_UP_MAX XB => YDPARAR%XB @@ -245,7 +260,6 @@ LOSIGMAS => YDPARAR%LOSIGMAS GQVTOP => YDPARAR%GQVTOP LMIXUV => YDPARAR%LMIXUV LLCRIT => YDPARAR%LLCRIT -LTOTPREC => YDPARAR%LTOTPREC XALPHA_MF => YDPARAR%XALPHA_MF XPRES_UV => YDPARAR%XPRES_UV LOLSMC => YDPARAR%LOLSMC @@ -253,6 +267,7 @@ NDIAGWMAX => YDPARAR%NDIAGWMAX LOSUBG_COND => YDPARAR%LOSUBG_COND RADGR => YDPARAR%RADGR LFPREC3D => YDPARAR%LFPREC3D +LSTATNW => YDPARAR%LSTATNW LHARATU => YDPARAR%LHARATU XTSTEP_TS => YDPARAR%XTSTEP_TS XMRSTEP => YDPARAR%XMRSTEP @@ -271,6 +286,9 @@ XSPLIT_MAXCFL => YDPARAR%XSPLIT_MAXCFL LDEPOSC => YDPARAR%LDEPOSC XVDEPOSC => YDPARAR%XVDEPOSC NPROMICRO => YDPARAR%NPROMICRO +LDEPSG => YDPARAR%LDEPSG +RDEPSRED => YDPARAR%RDEPSRED +RDEPGRED => YDPARAR%RDEPGRED ! ------------------------------------------------------------------ @@ -313,8 +331,8 @@ CLAMBDA3='CB' ! for squall line academic case LSQUALL=.FALSE. NREFROI1=1 -NREFROI2=1 -VSQUALL=0._JPRB +NREFROI2=1 +VSQUALL=0._JPRB NPTP=1 LDIAGWMAX=.FALSE. NDIAGWMAX=1 @@ -323,10 +341,31 @@ LOLSMC=.FALSE. LOTOWNC=.FALSE. LOCND2=.FALSE. -LGRSN=.FALSE. +LKOGAN=.FALSE. +LHGT_QS=.FALSE. +LMODICEDEP=.FALSE. +LICERAD=.FALSE. RADGR=0._JPRB RADSN=0._JPRB +! Tuning and modication of graupeln etc: +RFRMIN(1:6)=0. +RFRMIN(7:9)=1. +RFRMIN(10) =10. +RFRMIN(11) =1. +RFRMIN(12) =0. +RFRMIN(13) =1.0E-15 +RFRMIN(14) =120. +RFRMIN(15) =1.0E-4 +RFRMIN(16:20)=0. +RFRMIN(21:22)=1. +RFRMIN(23)=0.5 +RFRMIN(24)=1.5 +RFRMIN(25)=30. +RFRMIN(26:38)=0. +RFRMIN(39)=0.25 +RFRMIN(40)=0.15 + ! default option for Mass Flux Scheme (Pergaud et al) CMF_UPDRAFT = 'EDKF' ! DIRE ou STAT @@ -336,25 +375,26 @@ LMIXUV= .TRUE. !default option in EDMFm mass-flux scheme: LLCRIT=.FALSE. LTOTPREC=.FALSE. +LTOTPRECL=.FALSE. ! Default for Mass Flux Scheme tuning variables XALP_PERT = 0.3_JPRB ! coefficient for the perturbation of - ! theta_l and r_t at the first level of + ! theta_l and r_t at the first level of ! the updraft -XABUO = 1._JPRB ! coefficient of the buoyancy term in the w_up equation +XABUO = 1._JPRB ! coefficient of the buoyancy term in the w_up equation XBENTR = 1._JPRB ! coefficient of the entrainment term in the w_up equation XBDETR = 0._JPRB ! coefficient of the detrainment term in the w_up equation -XCMF = 0.065_JPRB! coefficient for the mass flux at the first level - ! of the updraft (closure) +XCMF = 0.065_JPRB! coefficient for the mass flux at the first level + ! of the updraft (closure) XENTR_MF = 0.035_JPRB! entrainment constant (m/Pa) = 0.2 (m) XCRAD_MF = 50._JPRB ! cloud radius in cloudy part -XENTR_DRY = 0.55_JPRB ! coefficient for entrainment in dry part +XENTR_DRY = 0.55_JPRB ! coefficient for entrainment in dry part XDETR_DRY = 10._JPRB ! coefficient for detrainment in dry part XDETR_LUP = 1._JPRB ! coefficient for detrainment in dry part XKCF_MF = 2.75_JPRB ! coefficient for cloud fraction XKRC_MF = 1._JPRB ! coefficient for convective rc -XTAUSIGMF = 600._JPRB +XTAUSIGMF = 600._JPRB XPRES_UV = 0.5_JPRB ! coefficient for pressure term in wind mixing XFRAC_UP_MAX= 0.33_JPRB ! maximum Updraft fraction XALPHA_MF = 2._JPRB ! coefficient for updraft fraction in STA2 cloud scheme @@ -405,8 +445,14 @@ LSEDIM_AFTER=.FALSE. ! Sedimentation done after microphysics XSPLIT_MAXCFL=0.8 LDEPOSC=.FALSE. ! water deposition on vegetation XVDEPOSC=0.02 ! deposition speed (2 cm.s-1) +LDEPSG=.FALSE. ! activate tuning of deposition of snow/graupel (RDEPSRED,RDEPGRED) +RDEPSRED=1.0 +RDEPGRED=1.0 ! +! set up cloud scheme +LSTATNW=.FALSE. + ! for turbulence scheme XLINI=0._JPRB ! 0.1 in Meso-NH LHARATU=.FALSE. @@ -425,6 +471,12 @@ IF (.NOT.LOCND2) THEN RADGR=0._JPRB RADSN=0._JPRB ENDIF +IF (LHARATU .AND. CMF_UPDRAFT == 'EDKF') THEN + CALL ABOR1('Combination LHARATU and EDKF not valid!') +ENDIF +IF (.NOT. LHARATU .AND. LSTATNW ) THEN + CALL ABOR1('LSTATNW only tested in combination with HARATU and EDMFm!') +ENDIF ! Work-around for PGI compiler bug YDPARAR%CMF_UPDRAFT=CMF_UPDRAFT @@ -452,7 +504,7 @@ ENDIF IF ( CMICRO /= 'ICE3' .AND. CMICRO /= 'ICE4' .AND. & & CMICRO /= 'LIMA' .AND. CMICRO /= 'OLD3' .AND. CMICRO /= 'OLD4') THEN CALL ABOR1("AROME Microphysics must be ICE3, ICE4, LIMA, OLD3 or OLD4") -ENDIF +ENDIF IF ( (CMICRO == 'ICE4' .OR. CMICRO == 'OLD4') .AND. .NOT.YH%LACTIVE ) THEN CALL ABOR1("ICE4 and OLD4 microphysics requires activation of YH in NAMGFL") ENDIF @@ -512,6 +564,9 @@ ENDIF IF (LFPREC3D.AND.YGFL%NGFL_EZDIAG < 4) THEN CALL ABOR1 ("With LFPREC3D NGFL_EZDIAG should be >= 4 !") ENDIF +IF (LOCND2 .AND. LDEPSG) THEN + CALL ABOR1 ("LDEPSG must not be activated together with LOCND2") +ENDIF ! 3.Initialisation du buffer contenant les variables pseudo-historiques @@ -562,7 +617,7 @@ IF (LMPA) THEN ENDIF ELSE IF (LMSE) THEN - NGPAR=8 + NGPAR=9 MRAIN=1 MSNOW=2 MVTS=3 @@ -583,7 +638,7 @@ ELSE ENDIF ENDIF -! allocation du buffer +! allocation du buffer IF (NGPAR /= 0) THEN ALLOCATE (GPARBUF (YDGEOMETRY%YRDIM%NPROMA, NGPAR, YDGEOMETRY%YRDIM%NGPBLKS)) ENDIF @@ -600,11 +655,12 @@ WRITE(UNIT=KULOUT,FMT='('' CSUBG_RC_RR_ACCR = '',A80,& WRITE(UNIT=KULOUT,FMT='('' CLAMBDA3 = '',A80)')& & CLAMBDA3 WRITE(UNIT=KULOUT,FMT='('' NREFROI1 = '',I3,& - & '' NREFROI2 = '',I3,'' VSQUALL = '',E13.6)')NREFROI1, NREFROI2,VSQUALL + & '' NREFROI2 = '',I3,'' VSQUALL = '',E13.6)')NREFROI1, NREFROI2,VSQUALL WRITE(UNIT=KULOUT,FMT='('' NGPAR = '',I3,& & '' MINPRR = '',I3,'' MACPRR = '',I3,'' MINPRS = '',I3,& & '' MACPRS = '',I3,'' MINPRG = '',I3,'' MACPRG = '',I3)')& & NGPAR,MINPRR,MACPRR,MINPRS,MACPRS,MINPRG,MACPRG +WRITE(UNIT=KULOUT,FMT='('' MCD = '',I3,'' MRAIN = '',I3,'' MSNOW = '',I3)') MCD, MRAIN, MSNOW WRITE(UNIT=KULOUT,FMT='('' MSWDIR = '',I3,& & '' MSWDIF = '',I3)')MSWDIR,MSWDIF WRITE(UNIT=KULOUT,FMT='('' MALBDIR = '',I3,& @@ -615,7 +671,7 @@ WRITE(UNIT=KULOUT,FMT='('' NPRINTFR = '',I3, '' NPTP = '',I3)')& & NPRINTFR,NPTP WRITE(UNIT=KULOUT,FMT='('' LDIAGWMAX = '',L5,& & '' NDIAGWMAX = '',I3,'' NDTCHEM = '',I3)')& - & LDIAGWMAX, NDIAGWMAX,NDTCHEM + & LDIAGWMAX, NDIAGWMAX,NDTCHEM WRITE(UNIT=KULOUT,FMT='('' NRR = '',I3,& & '' NRRL = '',I3,'' NRRI = '',I3)')& & NRR, NRRL, NRRI @@ -628,7 +684,7 @@ WRITE(UNIT=KULOUT,FMT='(& WRITE(UNIT=KULOUT,FMT='('' CMF_UPDRAFT = '',A4,& & '' CMF_CLOUD = '',A4)')& & CMF_UPDRAFT,CMF_CLOUD - + WRITE(UNIT=KULOUT,FMT='(''Mass Flux Scheme tuning variables :'')') WRITE(UNIT=KULOUT,FMT='(''XALP_PERT = '',F6.3,'' XABUO = '',F6.3,'' XBENTR = '',F6.3,& &'' XBDETR = '',F6.3,'' XCMF = '',F6.3,'' XENTR_MF = '',F6.3,'' XCRAD_MF = '',F6.3,& @@ -658,11 +714,19 @@ WRITE(UNIT=KULOUT,FMT='('' CFRAC_ICE_ADJUST = '',A1,& WRITE(UNIT=KULOUT,FMT='('' XSPLIT_MAXCFL = '',E13.6)') XSPLIT_MAXCFL WRITE(UNIT=KULOUT,FMT='('' LSEDIM_AFTER = '',L5)') LSEDIM_AFTER WRITE(UNIT=KULOUT,FMT=*) 'XCQVR=',XCQVR,' GQVPLIM=',GQVPLIM,' GQVTOP=',GQVTOP,' LQVTOP=',LQVTOP +WRITE(UNIT=KULOUT,FMT='('' LLCRIT = '',L5)') LLCRIT +WRITE(UNIT=KULOUT,FMT='('' LTOTPREC = '',L5)') LTOTPREC +WRITE(UNIT=KULOUT,FMT='('' LTOTPRECL = '',L5)') LTOTPRECL WRITE(UNIT=KULOUT,FMT='('' LOCND2 = '',L5)') LOCND2 -WRITE(UNIT=KULOUT,FMT='('' LGRSN = '',L5)') LGRSN -WRITE(UNIT=KULOUT,FMT='('' RADSN = '',E13.6)') RADSN -WRITE(UNIT=KULOUT,FMT='('' RADGR = '',E13.6)') RADGR +WRITE(UNIT=KULOUT,FMT='('' LKOGAN = '',L5)') LKOGAN +WRITE(UNIT=KULOUT,FMT='('' LHGT_QS = '',L5)') LHGT_QS +WRITE(UNIT=KULOUT,FMT='('' LSTATNW = '',L5)') LSTATNW +WRITE(UNIT=KULOUT,FMT='('' LMODICEDEP = '',L5)') LMODICEDEP +WRITE(UNIT=KULOUT,FMT='('' RADSN = '',f6.2)') RADSN +WRITE(UNIT=KULOUT,FMT='('' RADGR = '',f6.2)') RADGR +WRITE(UNIT=KULOUT,FMT='('' RFRMIN = '',40E10.3)') RFRMIN WRITE(UNIT=KULOUT,FMT='('' LHARATU = '',L2)') LHARATU +WRITE(UNIT=KULOUT,FMT='('' LICERAD = '',L5)') LICERAD WRITE(UNIT=KULOUT,FMT='('' LDEPOSC = '',L5)') LDEPOSC WRITE(UNIT=KULOUT,FMT='('' XVDEPOSC = '',E13.6)') XVDEPOSC diff --git a/src/arome/ext/suphmpa.F90 b/src/arome/ext/suphmpa.F90 index d5817d3a4..33f631f7f 100644 --- a/src/arome/ext/suphmpa.F90 +++ b/src/arome/ext/suphmpa.F90 @@ -105,12 +105,13 @@ ASSOCIATE(XDETR_LUP=>YDPARAR%XDETR_LUP, XCMF=>YDPARAR%XCMF, & & XKRC_MF=>YDPARAR%XKRC_MF, XALPHA_MF=>YDPARAR%XALPHA_MF, & & XPRES_UV=>YDPARAR%XPRES_UV, NRR=>YDPARAR%NRR, XCRAD_MF=>YDPARAR%XCRAD_MF, & & CMF_UPDRAFT=>YDPARAR%CMF_UPDRAFT, LHARATU=>YDPARAR%LHARATU, & + & LSTATNW=>YDPARAR%LSTATNW, & & LMPA=>YDARPHY%LMPA, LKFBCONV=>YDARPHY%LKFBCONV, LMFSHAL=>YDARPHY%LMFSHAL, & & LGRADHPHY=>YDARPHY%LGRADHPHY, & & NPROMA=>YDDIM%NPROMA, & & LEDKF=>YDPHY%LEDKF, LCVPPKF=>YDPHY%LCVPPKF, & & NFLEVG=>YDDIMV%NFLEVG, & - & LSDDH=>YDLDDH%LSDDH, TSTEP=>YDRIP%TSTEP, & + & LSDDH=>YDLDDH%LSDDH, TSTEP=>YDRIP%TSTEP, RFRMIN=>YDPARAR%RFRMIN, & & XTSTEP_TS=>YDPARAR%XTSTEP_TS, CSNOWRIMING=>YDPARAR%CSNOWRIMING, XMRSTEP=>YDPARAR%XMRSTEP,& & NMAXITER_MICRO=>YDPARAR%NMAXITER_MICRO, LFEEDBACKT=>YDPARAR%LFEEDBACKT, LEVLIMIT=>YDPARAR%LEVLIMIT, & & LNULLWETG=>YDPARAR%LNULLWETG, LWETGPOST=>YDPARAR%LWETGPOST, LNULLWETH=>YDPARAR%LNULLWETH,& @@ -119,7 +120,8 @@ ASSOCIATE(XDETR_LUP=>YDPARAR%XDETR_LUP, XCMF=>YDPARAR%XCMF, & & CSUBG_PR_PDF=>YDPARAR%CSUBG_PR_PDF, LCRFLIMIT=>YDPARAR%LCRFLIMIT, & & CFRAC_ICE_ADJUST=>YDPARAR%CFRAC_ICE_ADJUST, XSPLIT_MAXCFL=>YDPARAR%XSPLIT_MAXCFL,& & CFRAC_ICE_SHALLOW_MF=>YDPARAR%CFRAC_ICE_SHALLOW_MF, LSEDIM_AFTER=>YDPARAR%LSEDIM_AFTER,& - & LDEPOSC=>YDPARAR%LDEPOSC, XVDEPOSC=>YDPARAR%XVDEPOSC) + & LDEPOSC=>YDPARAR%LDEPOSC, XVDEPOSC=>YDPARAR%XVDEPOSC,& + & LDEPSG=>YDPARAR%LDEPSG,RDEPSRED=>YDPARAR%RDEPSRED,RDEPGRED=>YDPARAR%RDEPGRED) ! ------------------------------------------------------------------ ! ------------------------------------------------------------------ ! 1. Initialisation of MesoNH constantes @@ -140,16 +142,18 @@ IF (CMICRO == 'LIMA') THEN & NMAXITER_MICRO, LFEEDBACKT, LEVLIMIT, LNULLWETG, LWETGPOST, LNULLWETH,& & LWETHPOST, XFRACM90, LCONVHG, CSUBG_RC_RR_ACCR, CSUBG_RR_EVAP, CSUBG_PR_PDF,& & LCRFLIMIT, CFRAC_ICE_ADJUST, XSPLIT_MAXCFL,& - & CFRAC_ICE_SHALLOW_MF, LSEDIM_AFTER, LDEPOSC, XVDEPOSC) + & CFRAC_ICE_SHALLOW_MF, LSEDIM_AFTER, LDEPOSC, XVDEPOSC, RFRMIN,& + & LDEPSG,RDEPSRED,RDEPGRED) CALL AROINI_MICRO_LIMA (KULOUT,4,ZTSTEP,LOWARM,CMICRO,NSPLITR,NSPLITG,CSEDIM,LCRIAUTI,& & RCRIAUTI,RT0CRIAUTI,RCRIAUTC) ELSE CALL AROINI_MICRO (KULOUT,ZTSTEP,LOWARM,CMICRO,NSPLITR,CSEDIM,LCRIAUTI,& - & RCRIAUTI,RT0CRIAUTI,RCRIAUTC,XTSTEP_TS, CSNOWRIMING, XMRSTEP,& + & RCRIAUTI,RT0CRIAUTI,RCRIAUTC, XTSTEP_TS, CSNOWRIMING, XMRSTEP,& & NMAXITER_MICRO, LFEEDBACKT, LEVLIMIT, LNULLWETG, LWETGPOST, LNULLWETH,& & LWETHPOST, XFRACM90, LCONVHG, CSUBG_RC_RR_ACCR, CSUBG_RR_EVAP, CSUBG_PR_PDF,& & LCRFLIMIT, CFRAC_ICE_ADJUST, XSPLIT_MAXCFL,& - & CFRAC_ICE_SHALLOW_MF, LSEDIM_AFTER, LDEPOSC, XVDEPOSC) + & CFRAC_ICE_SHALLOW_MF, LSEDIM_AFTER, LDEPOSC, XVDEPOSC, RFRMIN,& + & LDEPSG,RDEPSRED,RDEPGRED) ENDIF ! 3. Initialisation of Budget @@ -160,8 +164,7 @@ CALL AROINI_BUDGET(LAROBU_ENABLE) ! 4. Initialisation of Turbulence scheme -!SR phasing step, .FALSE. must be replaced by the value read in namelist -CALL AROINI_TURB(XLINI,LHARATU,.FALSE.) +CALL AROINI_TURB(XLINI,LHARATU,LSTATNW) ! 5. Initialisation of Mass Flux Shallow convection scheme diff --git a/src/arome/ext/yomparar.F90 b/src/arome/ext/yomparar.F90 index 8c07934b9..808083cd3 100644 --- a/src/arome/ext/yomparar.F90 +++ b/src/arome/ext/yomparar.F90 @@ -26,7 +26,7 @@ INTEGER(KIND=JPIM) :: NSWB_MNH !number of SW bands for surface ! (must be equal to NSW !!) INTEGER(KIND=JPIM) :: NGPAR !number of fields in the buffer containing ! the 2D pseudo-historical variables. -INTEGER(KIND=JPIM) :: MINPRR !pointer on INPRR +INTEGER(KIND=JPIM) :: MINPRR !pointer on INPRR INTEGER(KIND=JPIM) :: MINPRS !pointer on INPRS INTEGER(KIND=JPIM) :: MINPRG !pointer on INPRG INTEGER(KIND=JPIM) :: MACPRR !pointer on ACPRR @@ -36,10 +36,10 @@ INTEGER(KIND=JPIM) :: MALBDIR !pointer on ALBDIR INTEGER(KIND=JPIM) :: MALBSCA !pointer on ALBSCA INTEGER(KIND=JPIM) :: MRAIN !pointer on surface rain INTEGER(KIND=JPIM) :: MSNOW !pointer on surface snow -INTEGER(KIND=JPIM) :: MGZ0 !pointer on GZ0 -INTEGER(KIND=JPIM) :: MGZ0H !pointer on GZ0H +INTEGER(KIND=JPIM) :: MGZ0 !pointer on GZ0 +INTEGER(KIND=JPIM) :: MGZ0H !pointer on GZ0H INTEGER(KIND=JPIM) :: MVQS !pointer on surface moisture -INTEGER(KIND=JPIM) :: MVTS !pointer on surface temperature +INTEGER(KIND=JPIM) :: MVTS !pointer on surface temperature INTEGER(KIND=JPIM) :: MVEMIS !pointer on surface emissivity INTEGER(KIND=JPIM) :: MSWDIR !pointer on SW direct surface flux INTEGER(KIND=JPIM) :: MSWDIF !pointer on SW surface diffuse flux @@ -53,19 +53,28 @@ LOGICAL :: LOSEDIC ! activate cloud sedimentation LOGICAL :: LOWARM ! see OWARM in mesoNH LOGICAL :: LOSIGMAS ! activate calculation of variance of departure to ! saturation in turb scheme (to be used in subgrid condensation) -LOGICAL :: LOLSMC ! Land/sea mask for cloud droplet number conc. +LOGICAL :: LOLSMC ! Land/sea mask for cloud droplet number conc. LOGICAL :: LOTOWNC ! Town mask for cloud droplet number conc. LOGICAL :: LOCND2 ! Separate solid and liquid phase -LOGICAL :: LGRSN ! Turn graupel to snow for high supersaturation wrt ice +LOGICAL :: LKOGAN ! Use Kogan autocoversion of liquid +LOGICAL :: LMODICEDEP ! Logical switch for alternative dep/evap of ice +LOGICAL :: LICERAD ! Assume higher fraction of condensate for + ! ice/snow/graupel than the actual cloud cover in + ! radiation REAL(KIND=JPRB) :: RADGR ! Tuning of ice for radiation, TO BE REMOVED REAL(KIND=JPRB) :: RADSN ! Tuning of ice for radiation, TO BE REMOVED REAL(KIND=JPRB) :: VSIGQSAT ! coeff applied to qsat variance contribution ! for subgrid condensation +! Constants / tuning parameters for possible modifying some processes related to +! graupeln in RFRMIN(1:8), IN - concentration in RFRMIN(9) and Kogan +! autoconversion in RFRMIN(10:11). +REAL(KIND=JPRB) :: RFRMIN(40) + ! switches for MF scheme (Pergaud et al) -CHARACTER (LEN=4) :: CMF_UPDRAFT ! Type of Mass Flux Scheme +CHARACTER (LEN=4) :: CMF_UPDRAFT ! Type of Mass Flux Scheme ! 'NONE','DUAL', 'EDKF', 'RHCJ' or 'RAHA' CHARACTER (LEN=4) :: CMF_CLOUD ! type of cloud scheme associated with MF Scheme ! 'NONE', 'DIRE' or 'STAT' @@ -76,20 +85,22 @@ LOGICAL :: LLCRIT ! True if temperature dependent LOGICAL :: LTOTPREC ! True if precipitation tendencies ! from the sub-grid scheme are ! added to the total precip tendencies. +LOGICAL :: LTOTPRECL ! As LTOTPREC but updraft fraction untouched +LOGICAL :: LHGT_QS ! Switch for height dependent VQSIGSAT ! Tuning variables for MF scheme REAL(KIND=JPRB) :: XALP_PERT ! coefficient for the perturbation of - ! theta_l and r_t at the first level of + ! theta_l and r_t at the first level of ! the updraft -REAL(KIND=JPRB) :: XABUO ! coefficient of the buoyancy term in the w_up equation +REAL(KIND=JPRB) :: XABUO ! coefficient of the buoyancy term in the w_up equation REAL(KIND=JPRB) :: XBENTR ! coefficient of the entrainment term in the w_up equation REAL(KIND=JPRB) :: XBDETR ! coefficient of the detrainment term in the w_up equation -REAL(KIND=JPRB) :: XCMF ! coefficient for the mass flux at the first level - ! of the updraft (closure) +REAL(KIND=JPRB) :: XCMF ! coefficient for the mass flux at the first level + ! of the updraft (closure) REAL(KIND=JPRB) :: XENTR_MF ! entrainment constant (m/Pa) = 0.2 (m) REAL(KIND=JPRB) :: XCRAD_MF ! cloud radius in cloudy part -REAL(KIND=JPRB) :: XENTR_DRY ! coefficient for entrainment in dry part +REAL(KIND=JPRB) :: XENTR_DRY ! coefficient for entrainment in dry part REAL(KIND=JPRB) :: XDETR_DRY ! coefficient for detrainment in dry part REAL(KIND=JPRB) :: XDETR_LUP ! coefficient for detrainment in dry part REAL(KIND=JPRB) :: XKCF_MF ! coefficient for cloud fraction @@ -127,7 +138,7 @@ INTEGER(KIND=JPIM) :: NPTP ! index in NPROMA paquet where the print will be done INTEGER(KIND=JPIM) :: NPRINTFR !frequency of physical prints in apl_arome !* for other diagnostics -! wmax per vertical level +! wmax per vertical level LOGICAL :: LDIAGWMAX !activate print of WMAX in apl_arome INTEGER(KIND=JPIM) :: NDIAGWMAX ! frequency of preceding prints (in time step) @@ -138,6 +149,8 @@ INTEGER(KIND=JPIM) :: NDTCHEM ! time step factor for chemical scheme LOGICAL :: LAROBU_ENABLE ! for MNH budget anlysis !* for turbulence scheme REAL(KIND=JPRB) :: XLINI ! minimum bl89 mixing length +LOGICAL :: LSTATNW ! updated full statistical cloud scheme + ! (yet only to be used in combination with EDMFm convection (DUAL)) LOGICAL :: LHARATU ! if true RACMO turbulence is used ! (yet only to be used in combination with EDMFm convection (DUAL)) !* Subgrid precipitation scheme @@ -185,6 +198,11 @@ LOGICAL :: LSEDIM_AFTER !Sedimentation done after microphysics (.TRUE.) or befor REAL(KIND=JPRB) :: XSPLIT_MAXCFL ! Maximum CFL number allowed for SPLIT sedimentation scheme REAL(KIND=JPRB) :: XVDEPOSC ! Water deposition speed on vegetation (LDEPOSC) (DEPO_ICE3) ! +! for negative deposition (=sublimation) of qs,qg + LOGICAL :: LDEPSG ! activate namelist read of sublimation factors +REAL(KIND=JPRB) :: RDEPSRED ! tuning factor of sublimation of snow +REAL(KIND=JPRB) :: RDEPGRED ! tuning factor of sublimation of graupel +! !* For total cumulative 3D prec flux for MOCAGE LOGICAL :: LFPREC3D ! Switch on total cumulative 3D prec flux output (for MOCAGE use) !* For radiation : diff --git a/src/arome/micro/ini_rain_ice.F90 b/src/arome/micro/ini_rain_ice.F90 index 4068a1ab9..6e2f1077d 100644 --- a/src/arome/micro/ini_rain_ice.F90 +++ b/src/arome/micro/ini_rain_ice.F90 @@ -399,7 +399,7 @@ XLBDAS_MAX = 100000.0 XLBDAG_MAX = 100000.0 ! ZCONC_MAX = 1.E6 ! Maximal concentration for falling particules set to 1 per cc -XLBDAS_MAX = ( ZCONC_MAX/XCCS )**(1./XCXS) +IF(XCCS>0. .AND. XCXS>0. )XLBDAS_MAX = ( ZCONC_MAX/XCCS )**(1./XCXS) ! IF (HCLOUD == 'ICE4' .OR. HCLOUD == 'OLD4') THEN ALLOCATE( XRTMIN(7) ) @@ -545,16 +545,26 @@ X0DEPS = (4.0*XPI)*XCCS*XC1S*XF0S*MOMG(XALPHAS,XNUS,1.) X1DEPS = (4.0*XPI)*XCCS*XC1S*XF1S*SQRT(XCS)*MOMG(XALPHAS,XNUS,0.5*XDS+1.5) XEX0DEPS = XCXS-1.0 XEX1DEPS = XCXS-0.5*(XDS+3.0) +XRDEPSRED = 1.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) +XRDEPGRED = 1.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) + +GFLAG = .TRUE. +IF (GFLAG) THEN + WRITE(UNIT=KLUOUT,FMT='(" factors sublimation snow/groupel")') + WRITE(UNIT=KLUOUT,FMT='(" mod sublim snow =",E13.6)') XRDEPSRED + WRITE(UNIT=KLUOUT,FMT='(" mod sublim graupel =",E13.6)') XRDEPGRED +END IF + ! !* 5.3 Constants for pristine ice autoconversion ! @@ -1047,6 +1057,26 @@ IF( (KDRYLBDAG/=NDRYLBDAG) .OR. (KDRYLBDAR/=NDRYLBDAR) .OR. (KND/=IND) .OR. & PFDINFTY,XKER_RDRYG ) WRITE(UNIT=KLUOUT,FMT='(" Read XKER_RDRYG")') END IF + +! 8.2.6 Constants for possible modifying some processes related to +! graupeln in XFRMIN(1:8), IN - concentration in XFRMIN(9) and Kogan +! autoconversion in XFRMIN(10:11). May be used for e.g. ensemble spread + XFRMIN(1:6)=0. + XFRMIN(7:9)=1. + XFRMIN(10) =10. + XFRMIN(11) =1. + XFRMIN(12) =100. !0 in suparar + XFRMIN(13) =1.0E-15 + XFRMIN(14) =120. + XFRMIN(15) =1.0E-4 + XFRMIN(16:20)=0. + XFRMIN(21:22)=1. + XFRMIN(23)=0.5 + XFRMIN(24)=1.5 + XFRMIN(25)=30. + XFRMIN(26:38)=0. + XFRMIN(39)=0.25 + XFRMIN(40)=0.15 ! ! !------------------------------------------------------------------------------- diff --git a/src/arome/micro/modi_rain_ice_old.F90 b/src/arome/micro/modi_rain_ice_old.F90 index 2d09cf14c..81c0c368c 100644 --- a/src/arome/micro/modi_rain_ice_old.F90 +++ b/src/arome/micro/modi_rain_ice_old.F90 @@ -3,26 +3,27 @@ ! #################### ! INTERFACE - SUBROUTINE RAIN_ICE_OLD ( OSEDIC, OCND2, LGRSN, HSEDIM, HSUBG_AUCV_RC, OWARM, & + SUBROUTINE RAIN_ICE_OLD ( OSEDIC, OCND2, LKOGAN, LMODICEDEP, HSEDIM, HSUBG_AUCV_RC, OWARM, & KKA, KKU, KKL, & KSPLITR, PTSTEP, KRR, & PDZZ, PRHODJ, PRHODREF, PEXNREF, PPABST, PCIT, PCLDFR,& + PICLDFR, PWCLDFR, PSSIO, PSSIU, PIFR, & PTHT, PRVT, PRCT, PRRT, PRIT, PRST, & PRGT, PTHS, PRVS, PRCS, PRRS, PRIS, PRSS, PRGS, & PINPRC, PINPRR, PEVAP3D, & PINPRS, PINPRG, PSIGS, PSEA, PTOWN, & - PRHT, PRHS, PINPRH, PFPR, & YDDDH, YDLDDH, YDMDDH, & - YSPP_ICENU,YSPP_KGN_ACON,YSPP_KGN_SBGR) + PICENU, PKGN_ACON, PKGN_SBGR, & + PRHT, PRHS, PINPRH, PFPR) ! USE DDH_MIX, ONLY : TYP_DDH USE YOMLDDH, ONLY : TLDDH USE YOMMDDH, ONLY : TMDDH -USE MODD_SPP_TYPE, ONLY : TSPP_CONFIG_MPA ! LOGICAL, INTENT(IN) :: OSEDIC ! Switch for droplet sedim. LOGICAL, INTENT(IN) :: OCND2 ! Logical switch to separate liquid and ice -LOGICAL, INTENT(IN) :: LGRSN +LOGICAL, INTENT(IN) :: LKOGAN ! Logical switch for using Kogan autoconversion of liquid. +LOGICAL, INTENT(IN) :: LMODICEDEP ! Logical switch for alternative dep/evap of ice CHARACTER(LEN=4), INTENT(IN) :: HSEDIM ! Sedimentation scheme CHARACTER(LEN=4), INTENT(IN) :: HSUBG_AUCV_RC ! Switch for rc->rr Subgrid autoconversion ! Kind of Subgrid autoconversion method @@ -39,7 +40,7 @@ REAL, INTENT(IN) :: PTSTEP ! Double Time step ! (single if cold start) INTEGER, INTENT(IN) :: KRR ! Number of moist variable ! -REAL, DIMENSION(:,:,:), INTENT(IN) :: PDZZ ! Layer thikness (m) +REAL, DIMENSION(:,:,:), INTENT(IN) :: PDZZ ! Layer thickness (m) REAL, DIMENSION(:,:,:), INTENT(IN) :: PRHODJ ! Dry density * Jacobian REAL, DIMENSION(:,:,:), INTENT(IN) :: PRHODREF! Reference density REAL, DIMENSION(:,:,:), INTENT(IN) :: PEXNREF ! Reference Exner function @@ -55,8 +56,16 @@ REAL, DIMENSION(:,:,:), INTENT(IN) :: PRRT ! Rain water m.r. at t REAL, DIMENSION(:,:,:), INTENT(IN) :: PRIT ! Pristine ice m.r. at t REAL, DIMENSION(:,:,:), INTENT(IN) :: PRST ! Snow/aggregate m.r. at t REAL, DIMENSION(:,:,:), INTENT(IN) :: PRGT ! Graupel/hail m.r. at t -! REAL, DIMENSION(:,:,:), INTENT(IN) :: PSIGS ! Sigma_s at t +! input from aro_adjust / condensation with OCND2, dummy if OCND2 = F +REAL, DIMENSION(:,:,:), INTENT(IN) :: PICLDFR ! ice cloud fraction +REAL, DIMENSION(:,:,:), INTENT(IN) :: PWCLDFR ! water or mixed-phase cloud fraction +REAL, DIMENSION(:,:,:), INTENT(IN) :: PSSIO ! Super-saturation with respect to ice in the + ! supersaturated fraction +REAL, DIMENSION(:,:,:), INTENT(IN) :: PSSIU ! Sub-saturation with respect to ice in the + ! subsaturated fraction +REAL, DIMENSION(:,:,:), INTENT(INOUT) :: PIFR ! Ratio cloud ice moist part to dry part +! input from aro_adjust / condensation with OCND2 END. ! REAL, DIMENSION(:,:,:), INTENT(INOUT) :: PTHS ! Theta source REAL, DIMENSION(:,:,:), INTENT(INOUT) :: PRVS ! Water vapor m.r. source @@ -65,7 +74,6 @@ REAL, DIMENSION(:,:,:), INTENT(INOUT) :: PRRS ! Rain water m.r. source REAL, DIMENSION(:,:,:), INTENT(INOUT) :: PRIS ! Pristine ice m.r. source REAL, DIMENSION(:,:,:), INTENT(INOUT) :: PRSS ! Snow/aggregate m.r. source REAL, DIMENSION(:,:,:), INTENT(INOUT) :: PRGS ! Graupel m.r. source - ! REAL, DIMENSION(:,:), INTENT(INOUT) :: PINPRC! Cloud instant precip REAL, DIMENSION(:,:), INTENT(INOUT) :: PINPRR! Rain instant precip @@ -74,16 +82,14 @@ REAL, DIMENSION(:,:), INTENT(INOUT) :: PINPRS! Snow instant precip REAL, DIMENSION(:,:), INTENT(INOUT) :: PINPRG! Graupel instant precip REAL, DIMENSION(:,:), INTENT(IN) :: PSEA ! Sea Mask REAL, DIMENSION(:,:), INTENT(IN) :: PTOWN! Fraction that is town - -REAL, DIMENSION(:,:,:), OPTIONAL, INTENT(IN) :: PRHT ! Hail m.r. at t -REAL, DIMENSION(:,:,:), OPTIONAL, INTENT(INOUT) :: PRHS ! Hail m.r. source -REAL, DIMENSION(:,:), OPTIONAL, INTENT(INOUT) :: PINPRH! Hail instant precip -REAL, DIMENSION(:,:,:,:), OPTIONAL, INTENT(OUT) :: PFPR ! upper-air precipitation fluxes -TYPE(TYP_DDH), INTENT(INOUT) :: YDDDH -TYPE(TLDDH), INTENT(IN) :: YDLDDH -TYPE(TMDDH), INTENT(IN) :: YDMDDH - -TYPE(TSPP_CONFIG_MPA), OPTIONAL, INTENT(IN) :: YSPP_ICENU,YSPP_KGN_ACON,YSPP_KGN_SBGR +TYPE(TYP_DDH), INTENT(INOUT) :: YDDDH +TYPE(TLDDH), INTENT(IN) :: YDLDDH +TYPE(TMDDH), INTENT(IN) :: YDMDDH +REAL, DIMENSION(:,:), INTENT(IN) :: PICENU, PKGN_ACON, PKGN_SBGR +REAL, DIMENSION(:,:,:), OPTIONAL, INTENT(IN) :: PRHT ! Hail m.r. at t +REAL, DIMENSION(:,:,:), OPTIONAL, INTENT(INOUT) :: PRHS ! Hail m.r. source +REAL, DIMENSION(:,:), OPTIONAL, INTENT(INOUT) :: PINPRH ! Hail instant precip +REAL, DIMENSION(:,:,:,:), OPTIONAL, INTENT(OUT) :: PFPR ! upper-air precipitation fluxes ! END SUBROUTINE RAIN_ICE_OLD END INTERFACE diff --git a/src/arome/micro/rain_ice_old.F90 b/src/arome/micro/rain_ice_old.F90 index c1ac467d1..9d60e6f85 100644 --- a/src/arome/micro/rain_ice_old.F90 +++ b/src/arome/micro/rain_ice_old.F90 @@ -1,15 +1,16 @@ ! ######spl - SUBROUTINE RAIN_ICE_OLD ( OSEDIC, OCND2, LGRSN, HSEDIM, HSUBG_AUCV, OWARM, & + SUBROUTINE RAIN_ICE_OLD ( OSEDIC, OCND2, LKOGAN, LMODICEDEP, HSEDIM, HSUBG_AUCV_RC, OWARM, & KKA,KKU,KKL, & KSPLITR, PTSTEP, KRR, & PDZZ, PRHODJ, PRHODREF, PEXNREF, PPABST, PCIT, PCLDFR,& + PICLDFR, PWCLDFR, PSSIO, PSSIU, PIFR, & PTHT, PRVT, PRCT, PRRT, PRIT, PRST, & PRGT, PTHS, PRVS, PRCS, PRRS, PRIS, PRSS, PRGS, & PINPRC, PINPRR, PEVAP3D, & PINPRS, PINPRG, PSIGS, PSEA, PTOWN, & - PRHT, PRHS, PINPRH, PFPR, & YDDDH, YDLDDH, YDMDDH, & - YSPP_ICENU,YSPP_KGN_ACON,YSPP_KGN_SBGR) + PICENU, PKGN_ACON, PKGN_SBGR, & + PRHT, PRHS, PINPRH, PFPR) USE PARKIND1, ONLY : JPRB USE YOMHOOK , ONLY : LHOOK, DR_HOOK @@ -154,7 +155,11 @@ !! (C. Abiven, Y. Léauté, V. Seigner, S. Riette) Phasing of Turner rain subgrid param !! (K.I Ivarsson 2014) OCND2-option, possible to use derived cloud dropelt conc for cloudphysics, !! replace XMV/XMD with XEPSILO +!! (K.I Ivarsson 2016) LKOGAN-option, possible to use Kogan autoconversion of liquid regardless of OCND2 option. +!! (K.I Ivarsson 2018-02 New varibles for input/ output mainly for optimation. Some updates of OCND2 option. +!! Sedimented ice should be preciptation !! (U. Andrae Dec 2020) Introduce SPP for HARMONIE-AROME +!! (C. Wittmann Jan 2021) Introduce sublimation factor tuning ! ! !* 0. DECLARATIONS @@ -167,7 +172,6 @@ USE MODD_RAIN_ICE_DESCR USE MODD_RAIN_ICE_PARAM USE MODD_PARAM_ICE USE MODD_BUDGET -USE MODD_SPP_TYPE USE MODD_LES USE MODE_BUDGET, ONLY: BUDGET_DDH USE MODI_GAMMA @@ -177,6 +181,7 @@ USE MODE_TIWMX_TAB, ONLY : TIWMX_TAB USE DDH_MIX, ONLY : TYP_DDH USE YOMLDDH, ONLY : TLDDH USE YOMMDDH, ONLY : TMDDH + ! IMPLICIT NONE ! @@ -186,9 +191,10 @@ IMPLICIT NONE ! LOGICAL, INTENT(IN) :: OSEDIC ! Switch for droplet sedim. LOGICAL, INTENT(IN) :: OCND2 ! Logical switch to separate liquid and ice -LOGICAL, INTENT(IN) :: LGRSN +LOGICAL, INTENT(IN) :: LKOGAN ! Logical switch for using Kogan autoconversion of liquid. +LOGICAL, INTENT(IN) :: LMODICEDEP ! Logical switch for alternative dep/evap of ice CHARACTER(LEN=4), INTENT(IN) :: HSEDIM ! Sedimentation scheme -CHARACTER(LEN=4), INTENT(IN) :: HSUBG_AUCV +CHARACTER(LEN=4), INTENT(IN) :: HSUBG_AUCV_RC ! Switch for rc->rr Subgrid autoconversion ! Kind of Subgrid autoconversion method LOGICAL, INTENT(IN) :: OWARM ! .TRUE. allows raindrops to ! form by warm processes @@ -203,14 +209,14 @@ REAL, INTENT(IN) :: PTSTEP ! Double Time step ! (single if cold start) INTEGER, INTENT(IN) :: KRR ! Number of moist variable ! -REAL, DIMENSION(:,:,:), INTENT(IN) :: PDZZ ! Layer thikness (m) +REAL, DIMENSION(:,:,:), INTENT(IN) :: PDZZ ! Layer thickness (m) REAL, DIMENSION(:,:,:), INTENT(IN) :: PRHODJ ! Dry density * Jacobian REAL, DIMENSION(:,:,:), INTENT(IN) :: PRHODREF! Reference density REAL, DIMENSION(:,:,:), INTENT(IN) :: PEXNREF ! Reference Exner function REAL, DIMENSION(:,:,:), INTENT(IN) :: PPABST ! absolute pressure at t ! REAL, DIMENSION(:,:,:), INTENT(INOUT) :: PCIT ! Pristine ice n.c. at t -REAL, DIMENSION(:,:,:), INTENT(IN) :: PCLDFR! Convective Mass Flux Cloud fraction +REAL, DIMENSION(:,:,:), INTENT(IN) :: PCLDFR ! Cloud fraction ! REAL, DIMENSION(:,:,:), INTENT(IN) :: PTHT ! Theta at time t REAL, DIMENSION(:,:,:), INTENT(IN) :: PRVT ! Water vapor m.r. at t @@ -220,6 +226,15 @@ REAL, DIMENSION(:,:,:), INTENT(IN) :: PRIT ! Pristine ice m.r. at t REAL, DIMENSION(:,:,:), INTENT(IN) :: PRST ! Snow/aggregate m.r. at t REAL, DIMENSION(:,:,:), INTENT(IN) :: PRGT ! Graupel/hail m.r. at t REAL, DIMENSION(:,:,:), INTENT(IN) :: PSIGS ! Sigma_s at t +! input from aro_adjust / condensation with OCND2, dummy if OCND2 = F +REAL, DIMENSION(:,:,:), INTENT(IN) :: PICLDFR ! ice cloud fraction +REAL, DIMENSION(:,:,:), INTENT(IN) :: PWCLDFR ! water or mixed-phase cloud fraction +REAL, DIMENSION(:,:,:), INTENT(IN) :: PSSIO ! Super-saturation with respect to ice in the + ! supersaturated fraction +REAL, DIMENSION(:,:,:), INTENT(IN) :: PSSIU ! Sub-saturation with respect to ice in the + ! subsaturated fraction +REAL, DIMENSION(:,:,:), INTENT(INOUT) :: PIFR ! Ratio cloud ice moist part to dry part +! input from aro_adjust / condensation with OCND2 END. ! REAL, DIMENSION(:,:,:), INTENT(INOUT) :: PTHS ! Theta source REAL, DIMENSION(:,:,:), INTENT(INOUT) :: PRVS ! Water vapor m.r. source @@ -236,15 +251,14 @@ REAL, DIMENSION(:,:), INTENT(INOUT) :: PINPRS! Snow instant precip REAL, DIMENSION(:,:), INTENT(INOUT) :: PINPRG! Graupel instant precip REAL, DIMENSION(:,:), INTENT(IN) :: PSEA ! Sea Mask REAL, DIMENSION(:,:), INTENT(IN) :: PTOWN! Fraction that is town -REAL, DIMENSION(:,:,:), OPTIONAL, INTENT(IN) :: PRHT ! Hail m.r. at t -REAL, DIMENSION(:,:,:), OPTIONAL, INTENT(INOUT) :: PRHS ! Hail m.r. source -REAL, DIMENSION(:,:), OPTIONAL, INTENT(INOUT) :: PINPRH! Hail instant precip -REAL, DIMENSION(:,:,:,:), OPTIONAL, INTENT(OUT) :: PFPR ! upper-air precipitation fluxes -TYPE(TYP_DDH), INTENT(INOUT) :: YDDDH -TYPE(TLDDH), INTENT(IN) :: YDLDDH -TYPE(TMDDH), INTENT(IN) :: YDMDDH - -TYPE(TSPP_CONFIG_MPA), OPTIONAL, INTENT(IN) :: YSPP_ICENU,YSPP_KGN_ACON,YSPP_KGN_SBGR +TYPE(TYP_DDH), INTENT(INOUT) :: YDDDH +TYPE(TLDDH), INTENT(IN) :: YDLDDH +TYPE(TMDDH), INTENT(IN) :: YDMDDH +REAL, DIMENSION(:,:), INTENT(IN) :: PICENU, PKGN_ACON, PKGN_SBGR +REAL, DIMENSION(:,:,:), OPTIONAL, INTENT(IN) :: PRHT ! Hail m.r. at t +REAL, DIMENSION(:,:,:), OPTIONAL, INTENT(INOUT) :: PRHS ! Hail m.r. source +REAL, DIMENSION(:,:), OPTIONAL, INTENT(INOUT) :: PINPRH ! Hail instant precip +REAL, DIMENSION(:,:,:,:), OPTIONAL, INTENT(OUT) :: PFPR ! upper-air precipitation fluxes ! !* 0.2 Declarations of local variables : @@ -393,6 +407,8 @@ REAL, DIMENSION(:), ALLOCATABLE & ZSSIU, & ! Sub-saturation with respect to ice in the ! sub-saturated fraction of gridbox ZW2D, & ! Factor for subgridscale calculations + ZXW2D, & ! Ratio cloud ice moist part to dry part + ZXW2D13, & ! ZXW2D**0.333 or other expression for LMODICEDEP=T ZCRYSHA, & ! Ice crystal habit factor ZCI2S, & ! factor to turn cloud ice with few lagre crystals into snow ZCOLF, & ! collision factor cloud liquid to snow / graupel @@ -406,6 +422,7 @@ REAL, DIMENSION(:), ALLOCATABLE & ZBB3W, & ! as ZBB3 but for liquid ZAM3, & ! Meyers IN concentration function ZREDIN, & ! Reduction of IN concentration between 0 and -25 C + ZTIW, & ! Wet bulb temperature ZARTMP, & ! temporary work array ! ******* end logical switch OCND2 ******* ZCC, & ! terminal velocity @@ -422,19 +439,23 @@ REAL :: ZINVTSTEP REAL :: ZRVSOLD,ZTSP,& &ZRSP,ZRISOLD,ZRSSOLD,ZRGSOLD,& ! Function,old ice &ZRISFRC,ZRSSFRC,ZRGSFRC,ZRFRAC,ZRSA,ZRSTS,ZRSB,ZRSDIF,ZR20, & - &ZRSI,ZXW2D,ZXW2D13,ZTC,ZHU,ZTMP,ZQIMAX,ZDICRIT,ZCITRED23,ZCITRED,ZRCW,ZVT,ZST, & + &ZRSI,ZRSW,ZTC,ZHU,ZTMP,ZQIMAX,ZDICRIT,ZCITRED23,ZCITRED,ZRCW,ZVT,ZST, & &ZREDGR,ZREDSN, & ! Possible reduction of the rate of graupel,snow growth ZRSPO, &! Mixing ratio for saturation point for ! supersaturated part of gridbox - ZRSPU ! Mixing ratio for saturation point for - ! subsaturated part of gridbox + ZRSPU, &! Mixing ratio for saturation point for + ! subsaturated part of gridbox + ZKVO, &! factor used for caluclate maximum mass in the ice + ! distubution. + ZTIMESC ! Timescale for conversion lagre ice crystals to snow. + ! distubution. ! ******* end logical switch OCND2 ******* ! SPP arrays REAL, DIMENSION(:), ALLOCATABLE :: ZZICENU,ZZKGN_ACON,ZZKGN_SBGR -REAL, DIMENSION(SIZE(PEXNREF,1)) :: ZICENU,ZKGN_ACON,ZKGN_SBGR - +! Tuning of sublimation (neg. sublimation) +REAL :: ZRDEPSRED, ZRDEPGRED !internal fractions etc, finally saturation ratio over ice 'source' value @@ -448,6 +469,8 @@ CHARACTER (LEN=100) :: YCOMMENT ! Comment string in LFIFM file CHARACTER (LEN=16) :: YRECFM ! Name of the desired field in LFIFM file REAL :: ZCOEFFRCM,ZMU LOGICAL LTEST ! Only for test ! +LOGICAL LCHECKNOISE ! Noise check on/off +LOGICAL LTIW ! Use TIW for graupel melting ( set by XFRMIN(18) ~ 1) ! !------------------------------------------------------------------------------- ! @@ -457,6 +480,7 @@ LOGICAL LTEST ! Only for test ! REAL(KIND=JPRB) :: ZHOOK_HANDLE IF (LHOOK) CALL DR_HOOK('RAIN_ICE_OLD',0,ZHOOK_HANDLE) LTEST=.FALSE. +LCHECKNOISE=.TRUE. IIB=1+JPHEXT IIE=SIZE(PDZZ,1) - JPHEXT IJB=1+JPHEXT @@ -467,113 +491,86 @@ IKT=SIZE(PDZZ,3) IKTB=1+JPVEXT IKTE=IKT-JPVEXT - -!ZICENU(:) = XFRMIN( 9) -!ZKGN_ACON(:) = XFRMIN(10) -!ZKGN_SBGR(:) = XFRMIN(11) - -IF (PRESENT(YSPP_ICENU)) THEN - ! - ! Perturb ICENU - ! - IF (YSPP_ICENU%LPERT) THEN - IF (YSPP_ICENU%LLNN_MEAN1.OR.YSPP_ICENU%LLNN_MEAN1_SELF) THEN - ZMU = -0.5 * (YSPP_ICENU%CMPERT * YSPP_ICENU%SDEV)**2 - ELSE - ZMU = 0.0 - ENDIF -! ZICENU(:) = & -! XFRMIN(9)*EXP(ZMU+YSPP_ICENU%CMPERT*YSPP_ICENU%PGP2DSPP(:)) - WHERE (ZICENU(:) < YSPP_ICENU%CLIP(1) ) ZICENU(:) = YSPP_ICENU%CLIP(1) - WHERE (ZICENU(:) > YSPP_ICENU%CLIP(2) ) ZICENU(:) = YSPP_ICENU%CLIP(2) - ENDIF -ENDIF - -IF (PRESENT(YSPP_KGN_ACON)) THEN - ! - ! Perturb KGN_ACON - ! - IF (YSPP_KGN_ACON%LPERT) THEN - IF (YSPP_KGN_ACON%LLNN_MEAN1.OR.YSPP_KGN_ACON%LLNN_MEAN1_SELF) THEN - ZMU = -0.5 * (YSPP_KGN_ACON%CMPERT * YSPP_KGN_ACON%SDEV)**2 - ELSE - ZMU = 0.0 - ENDIF -! ZKGN_ACON(:) = & -! XFRMIN(10)*EXP(ZMU+YSPP_KGN_ACON%CMPERT*YSPP_KGN_ACON%PGP2DSPP(:)) - WHERE (ZKGN_ACON(:) < YSPP_KGN_ACON%CLIP(1) ) ZKGN_ACON(:) = YSPP_KGN_ACON%CLIP(1) - WHERE (ZKGN_ACON(:) > YSPP_KGN_ACON%CLIP(2) ) ZKGN_ACON(:) = YSPP_KGN_ACON%CLIP(2) - ENDIF -ENDIF - -IF (PRESENT(YSPP_KGN_SBGR)) THEN - ! - ! Perturb KGN_SBGR - ! - IF (YSPP_KGN_SBGR%LPERT) THEN - IF (YSPP_KGN_SBGR%LLNN_MEAN1.OR.YSPP_KGN_SBGR%LLNN_MEAN1_SELF) THEN - ZMU = -0.5 * (YSPP_KGN_SBGR%CMPERT * YSPP_KGN_SBGR%SDEV)**2 - ELSE - ZMU = 0.0 - ENDIF -! ZKGN_SBGR(:) = & -! XFRMIN(11)*EXP(ZMU+YSPP_KGN_SBGR%CMPERT*YSPP_KGN_SBGR%PGP2DSPP(:)) - WHERE (ZKGN_SBGR(:) < YSPP_KGN_SBGR%CLIP(1) ) ZKGN_SBGR(:) = YSPP_KGN_SBGR%CLIP(1) - WHERE (ZKGN_SBGR(:) > YSPP_KGN_SBGR%CLIP(2) ) ZKGN_SBGR(:) = YSPP_KGN_SBGR%CLIP(2) - ENDIF -ENDIF - ! !* 1.2 COMPUTE SOME CONSTANT PARAMETERS ! ZINVTSTEP=1./PTSTEP -ZXW2D = 10. ! ratio of cloud ice water mixing ratio wet to dry - ! part of a gridbox -ZXW2D13 = ZXW2D**0.333 ZCITRED = 0.1 ! ratio of ice crystal concentration wet to dry ! part of a gridbox +ZDICRIT = XFRMIN(15) ! Critical diameter of ice crystal to define what + ! is cloud ice and what is snow (m) + ZCITRED23 = ZCITRED**0.667 +IF (LMODICEDEP) THEN + ZCITRED = 1. + ZTIMESC = XFRMIN(14) + ZDICRIT = (700.*XPI/XAI/6.)**(1./XBI)*ZDICRIT**(3./XBI) ! from spherical diameter to maximum diameter + ZCITRED23 = ZCITRED**(1.+ XLBEXI) + ZKVO = ((XALPHAI*XNUI + XBI -1.)/XALPHAI)**(1./XALPHAI) + ZKVO = ZKVO/ZDICRIT/ZTIMESC + PIFR = 1. +ENDIF -ZDICRIT = 0.0001 ! Critical diameter of ice crystal to define what - ! is cloud ice and what is snow (m) ZREDGR = 1. ! Tuning of the deposition of graupel, 1. is ref. value -ZREDSN = 1. ! Tuning of the deposition of graupel, 1. is ref. value +ZREDSN = 1. ! Tuning of the deposition of snow, 1. is ref. value IF(OCND2) THEN - ZREDGR = 0.25 ! Tuning factor, may be /= 1. - ZREDSN = 0.1 ! Tuning factor, may be /= 1. + IF (.NOT. LMODICEDEP) THEN + ZREDGR = XFRMIN(39) ! Tuning factor, may be /= 1. + ZREDSN = XFRMIN(40) ! Tuning factor, may be /= 1. + ENDIF ENDIF +LTIW=.FALSE. +IF (NINT(XFRMIN(18)) == 1) LTIW=.TRUE. + +ZRDEPSRED = XRDEPSRED +ZRDEPGRED = XRDEPGRED + + ! !* 1.3 COMPUTE THE DROPLET NUMBER CONCENTRATION ! ---------------------------------------- -! (Do it alreay here, since also used with OCND2=T ) +! (Do it already here, since also used with OCND2=T ) IF (OSEDIC.OR.OCND2) THEN ZRAY(:,:,:) = 0. ZZZZ(:,:,IKTE) = PDZZ(:,:,IKTE)*0.5 ZZZT(:,:,IKTE) = PDZZ(:,:,IKTE) - ZCONC_TMP(:,:)=PSEA(:,:)*XCONC_SEA+(1.-PSEA(:,:))*XCONC_LAND - - DO JK=IKTB,IKTE - ZLBC(:,:,JK) = PSEA(:,:)*XLBC(2)+(1.-PSEA(:,:))*XLBC(1) - ZFSEDC(:,:,JK) = (PSEA(:,:)*XFSEDC(2)+(1.-PSEA(:,:))*XFSEDC(1)) - ZFSEDC(:,:,JK) = MAX(MIN(XFSEDC(1),XFSEDC(2)),ZFSEDC(:,:,JK)) - ZCONC3D(:,:,JK)= (1.-PTOWN(:,:))*ZCONC_TMP(:,:)+PTOWN(:,:)*XCONC_URBAN - ZRAY(:,:,JK) = 0.5*((1.-PSEA(:,:))*GAMMA(XNUC+1.0/XALPHAC)/(GAMMA(XNUC)) + & + IF (XFRMIN(26)>0.001) THEN ! Use alternative concentration given by (XFRMIN(26) + ZCONC_TMP(:,:) = XFRMIN(26) + DO JK=IKTB,IKTE + ZLBC(:,:,JK) = 0.5* (XLBC(2)+XLBC(1)) ! Assume "average" distr. func for simplicity + ZFSEDC(:,:,JK) = 0.5* (XFSEDC(2)+XFSEDC(1)) + ZFSEDC(:,:,JK) = MAX(MIN(XFSEDC(1),XFSEDC(2)),ZFSEDC(:,:,JK)) + ZCONC3D(:,:,JK)= ZCONC_TMP(:,:)*PPABST(:,:,JK)/XP00 ! Let it be diluted with decreasing pressure + ZRAY(:,:,JK) = 0.5*( 0.5*GAMMA(XNUC+1.0/XALPHAC)/(GAMMA(XNUC)) + & + 0.5*GAMMA(XNUC2+1.0/XALPHAC2)/(GAMMA(XNUC2))) + ENDDO + ELSE + ZCONC_TMP(:,:)=PSEA(:,:)*XCONC_SEA+(1.-PSEA(:,:))*XCONC_LAND + + DO JK=IKTB,IKTE + ZLBC(:,:,JK) = PSEA(:,:)*XLBC(2)+(1.-PSEA(:,:))*XLBC(1) + ZFSEDC(:,:,JK) = (PSEA(:,:)*XFSEDC(2)+(1.-PSEA(:,:))*XFSEDC(1)) + ZFSEDC(:,:,JK) = MAX(MIN(XFSEDC(1),XFSEDC(2)),ZFSEDC(:,:,JK)) + ZCONC3D(:,:,JK)= (1.-PTOWN(:,:))*ZCONC_TMP(:,:)+PTOWN(:,:)*XCONC_URBAN + ZRAY(:,:,JK) = 0.5*((1.-PSEA(:,:))*GAMMA(XNUC+1.0/XALPHAC)/(GAMMA(XNUC)) + & PSEA(:,:)*GAMMA(XNUC2+1.0/XALPHAC2)/(GAMMA(XNUC2))) - END DO + ENDDO + ENDIF + ZCONC3D(:,:,IKTE)= ZCONC3D(:,:,IKTE)*MAX(0.001,XFRMIN(22)) ZRAY(:,:,:) = MAX(1.,ZRAY(:,:,:)) - ZLBC(:,:,:) = MAX(MIN(XLBC(1),XLBC(2)),ZLBC(:,:,:)) + ZLBC(:,:,:) = MAX(MIN(XLBC(1),XLBC(2)),ZLBC(:,:,:)) DO JK=IKTE-1,IKTB,-1 ZZZT(:,:,JK) = ZZZT(:,:,JK+1) + PDZZ(:,:,JK) ZZZZ(:,:,JK) = ZZZT(:,:,JK) - 0.5*PDZZ(:,:,JK) - END DO + ENDDO ENDIF CALL RAIN_ICE_NUCLEATION @@ -584,25 +581,45 @@ CALL RAIN_ICE_NUCLEATION ! GMICRO(:,:,:) = .FALSE. - IF ( KRR == 7 ) THEN - GMICRO(IIB:IIE,IJB:IJE,IKTB:IKTE) = & +IF (OCND2) THEN + IF ( KRR == 7 ) THEN + GMICRO(IIB:IIE,IJB:IJE,IKTB:IKTE) = & + PSSIO(IIB:IIE,IJB:IJE,IKTB:IKTE)>XFRMIN(12) .OR. & + PRCT(IIB:IIE,IJB:IJE,IKTB:IKTE)>XFRMIN(13) .OR. & + PRRT(IIB:IIE,IJB:IJE,IKTB:IKTE)>XFRMIN(13) .OR. & + PRIT(IIB:IIE,IJB:IJE,IKTB:IKTE)>XFRMIN(13) .OR. & + PRST(IIB:IIE,IJB:IJE,IKTB:IKTE)>XFRMIN(13) .OR. & + PRGT(IIB:IIE,IJB:IJE,IKTB:IKTE)>XFRMIN(13) .OR. & + PRHT(IIB:IIE,IJB:IJE,IKTB:IKTE)>XFRMIN(13) + ELSEIF ( KRR == 6 ) THEN + GMICRO(IIB:IIE,IJB:IJE,IKTB:IKTE) = & + PSSIO(IIB:IIE,IJB:IJE,IKTB:IKTE)>XFRMIN(12) .OR. & + PRCT(IIB:IIE,IJB:IJE,IKTB:IKTE)>XFRMIN(13) .OR. & + PRRT(IIB:IIE,IJB:IJE,IKTB:IKTE)>XFRMIN(13) .OR. & + PRIT(IIB:IIE,IJB:IJE,IKTB:IKTE)>XFRMIN(13) .OR. & + PRST(IIB:IIE,IJB:IJE,IKTB:IKTE)>XFRMIN(13) .OR. & + PRGT(IIB:IIE,IJB:IJE,IKTB:IKTE)>XFRMIN(13) + ENDIF +ELSE + IF ( KRR == 7 ) THEN + GMICRO(IIB:IIE,IJB:IJE,IKTB:IKTE) = & PRCT(IIB:IIE,IJB:IJE,IKTB:IKTE)>XRTMIN(2) .OR. & PRRT(IIB:IIE,IJB:IJE,IKTB:IKTE)>XRTMIN(3) .OR. & PRIT(IIB:IIE,IJB:IJE,IKTB:IKTE)>XRTMIN(4) .OR. & PRST(IIB:IIE,IJB:IJE,IKTB:IKTE)>XRTMIN(5) .OR. & PRGT(IIB:IIE,IJB:IJE,IKTB:IKTE)>XRTMIN(6) .OR. & PRHT(IIB:IIE,IJB:IJE,IKTB:IKTE)>XRTMIN(7) - ELSE IF( KRR == 6 ) THEN - GMICRO(IIB:IIE,IJB:IJE,IKTB:IKTE) = & + ELSEIF ( KRR == 6 ) THEN + GMICRO(IIB:IIE,IJB:IJE,IKTB:IKTE) = & PRCT(IIB:IIE,IJB:IJE,IKTB:IKTE)>XRTMIN(2) .OR. & PRRT(IIB:IIE,IJB:IJE,IKTB:IKTE)>XRTMIN(3) .OR. & PRIT(IIB:IIE,IJB:IJE,IKTB:IKTE)>XRTMIN(4) .OR. & PRST(IIB:IIE,IJB:IJE,IKTB:IKTE)>XRTMIN(5) .OR. & PRGT(IIB:IIE,IJB:IJE,IKTB:IKTE)>XRTMIN(6) - END IF - + ENDIF +ENDIF IMICRO = COUNTJV( GMICRO(:,:,:),I1(:),I2(:),I3(:)) -IF( IMICRO >= 0 ) THEN +IF ( IMICRO >= 0 ) THEN ALLOCATE(ZRVT(IMICRO)) ALLOCATE(ZRCT(IMICRO)) ALLOCATE(ZRRT(IMICRO)) @@ -639,23 +656,39 @@ IF( IMICRO >= 0 ) THEN ALLOCATE(ZCOLF(IMICRO)) ALLOCATE(ZACRF(IMICRO)) ALLOCATE(ZCONCM(IMICRO)) + ALLOCATE(ZZKGN_ACON(IMICRO)) + ALLOCATE(ZZKGN_SBGR(IMICRO)) + IF (LTIW) ALLOCATE(ZTIW(IMICRO)) IF (OCND2) THEN - ALLOCATE(ZZZ(IMICRO)) - ALLOCATE(ZDZ(IMICRO)) + ALLOCATE(ZESI(IMICRO)) + ALLOCATE(ZESW(IMICRO)) ALLOCATE(ZSIFRC(IMICRO)) ALLOCATE(ZSSIO(IMICRO)) ALLOCATE(ZSSIU(IMICRO)) ALLOCATE(ZZWC(IMICRO)) ALLOCATE(ZW2D(IMICRO)) + ALLOCATE(ZXW2D(IMICRO)) + ALLOCATE(ZXW2D13(IMICRO)) ALLOCATE(ZCRYSHA(IMICRO)) ALLOCATE(ZCI2S(IMICRO)) - ALLOCATE(ZARTMP(IMICRO)) + IF (LTEST) ALLOCATE(ZARTMP(IMICRO)) ALLOCATE(ZAA2(IMICRO)) ALLOCATE(ZBB3(IMICRO)) ALLOCATE(ZAA2W(IMICRO)) ALLOCATE(ZBB3W(IMICRO)) - ALLOCATE(ZESI(IMICRO)) - ALLOCATE(ZESW(IMICRO)) + ENDIF + IF (OCND2) THEN + IF (LMODICEDEP) THEN + DO JL=1,IMICRO + ZXW2D(JL) = PIFR(I1(JL),I2(JL),I3(JL)) + ZXW2D13(JL)=ZXW2D(JL)**(-XLBEXI) + ENDDO + ELSE + DO JL=1,IMICRO + ZXW2D(JL) = PIFR(I1(JL),I2(JL),I3(JL)) + ZXW2D13(JL)=ZXW2D(JL)**0.333 + ENDDO + ENDIF ENDIF DO JL=1,IMICRO @@ -668,7 +701,7 @@ IF( IMICRO >= 0 ) THEN IF ( KRR == 7 ) ZRHT(JL) = PRHT(I1(JL),I2(JL),I3(JL)) ZCIT(JL) = PCIT(I1(JL),I2(JL),I3(JL)) ZCF(JL) = PCLDFR(I1(JL),I2(JL),I3(JL)) - IF ( HSUBG_AUCV == 'PDF ' .AND. CSUBG_PR_PDF == 'SIGM' ) THEN + IF ( HSUBG_AUCV_RC == 'PDF ' .AND. CSUBG_PR_PDF == 'SIGM' ) THEN ZSIGMA_RC(JL) = PSIGS(I1(JL),I2(JL),I3(JL)) * 2. END IF ZRVS(JL) = PRVS(I1(JL),I2(JL),I3(JL)) @@ -689,6 +722,9 @@ IF( IMICRO >= 0 ) THEN ZCOLF(JL)=1. ! No change from orignal when OCND2 = .FALSE. ZACRF(JL)=1. ! " " " " " ZCONCM(JL)=ZCONC3D(I1(JL),I2(JL),I3(JL))*0.000001 ! From m-3 to cm-3 + IF (LTIW) ZTIW(JL)=TIWMX_TAB(ZPRES(JL),ZZT(JL), ZRVS(JL)*PTSTEP,0._JPRB,ZRSP,ZRSW,0.1_JPRB) + ZZKGN_ACON(JL)=PKGN_ACON(I1(JL),I2(JL)) + ZZKGN_SBGR(JL)=PKGN_SBGR(I1(JL),I2(JL)) IF (OCND2) THEN ZESI(JL) = ESATI(ZZT(JL)) ZESW(JL) = ESATW(ZZT(JL)) @@ -696,8 +732,10 @@ IF( IMICRO >= 0 ) THEN ZBB3(JL) = BB3(ZZT(JL)) ZAA2W(JL)= AA2W(ZZT(JL)) ZBB3W(JL)= BB3W(ZZT(JL)) - ZZZ(JL) = ZZZZ(I1(JL),I2(JL),I3(JL)) - ZDZ(JL) = PDZZ(I1(JL),I2(JL),I3(JL)) + ZSIFRC(JL) = PICLDFR(I1(JL),I2(JL),I3(JL)) + ZSSIO(JL) = PSSIO(I1(JL),I2(JL),I3(JL)) + ZSSIU(JL) = PSSIU(I1(JL),I2(JL),I3(JL)) + ZW2D(JL) = 1./(ZXW2D(JL)*ZSIFRC(JL) + 1. -ZSIFRC(JL)) ZCOLF(JL)=0.00001 ZACRF(JL)=0.00001 IF(ZRCT(JL)>1.0E-10)THEN @@ -768,7 +806,7 @@ IF( IMICRO >= 0 ) THEN !Cloud water split between high and low content part is done here !according to autoconversion option ZRCRAUTC(:) = XCRIAUTC/ZRHODREF(:) ! Autoconversion rc threshold - IF (HSUBG_AUCV == 'NONE') THEN + IF (HSUBG_AUCV_RC == 'NONE') THEN !Cloud water is entirely in low or high part WHERE (ZRCT(:) > ZRCRAUTC(:)) ZHLC_HCF(:) = 1. @@ -790,7 +828,7 @@ IF( IMICRO >= 0 ) THEN ZRF(:) = 0. END WHERE - ELSEIF (HSUBG_AUCV == 'CLFR') THEN + ELSEIF (HSUBG_AUCV_RC == 'CLFR') THEN !Cloud water is only in the cloudy part and entirely in low or high part WHERE (ZCF(:) > 0. ) WHERE (ZRCT(:)/ZCF(:) > ZRCRAUTC(:)) @@ -820,7 +858,7 @@ IF( IMICRO >= 0 ) THEN ZRF(:) = 0. END WHERE - ELSEIF (HSUBG_AUCV == 'PDF ') THEN + ELSEIF (HSUBG_AUCV_RC == 'PDF ') THEN !Cloud water is split between high and low part according to a PDF ! 'HLCRECTPDF' : rectangular PDF form ! 'HLCTRIANGPDF' : triangular PDF form @@ -948,9 +986,9 @@ IF( IMICRO >= 0 ) THEN STOP 'wrong CSUBG_PR_PDF case' ENDIF ELSE - !wrong HSUBG_AUCV case + !wrong HSUBG_AUCV_RC case CALL ABORT - STOP 'wrong HSUBG_AUCV case' + STOP 'wrong HSUBG_AUCV_RC case' ENDIF !Diagnostic of precipitation fraction @@ -1022,7 +1060,7 @@ IF( IMICRO >= 0 ) THEN ! CALL RAIN_ICE_FAST_RI - IF(OCND2)THEN + IF (OCND2.AND.LCHECKNOISE) THEN !* 8 This check is mainly for noise reduction: ! ---------------------------------------- ! Do not override saturation point over ice for temperatures below freezing. @@ -1174,23 +1212,25 @@ IF( IMICRO >= 0 ) THEN DEALLOCATE(ZCOLF) DEALLOCATE(ZACRF) DEALLOCATE(ZCONCM) + DEALLOCATE(ZZKGN_ACON,ZZKGN_SBGR) + IF (LTIW) DEALLOCATE(ZTIW) IF (OCND2) THEN - DEALLOCATE(ZARTMP) - DEALLOCATE(ZZZ) - DEALLOCATE(ZDZ) + DEALLOCATE(ZESI) + DEALLOCATE(ZESW) DEALLOCATE(ZSIFRC) DEALLOCATE(ZSSIO) DEALLOCATE(ZSSIU) DEALLOCATE(ZZWC) DEALLOCATE(ZW2D) + DEALLOCATE(ZXW2D) + DEALLOCATE(ZXW2D13) DEALLOCATE(ZCRYSHA) - DEALLOCATE(ZCI2S) + DEALLOCATE(ZCI2S) DEALLOCATE(ZAA2) DEALLOCATE(ZBB3) DEALLOCATE(ZAA2W) DEALLOCATE(ZBB3W) - DEALLOCATE(ZESI) - DEALLOCATE(ZESW) + IF (LTEST) DEALLOCATE(ZARTMP) ENDIF ! @@ -2030,6 +2070,12 @@ END DO PRIS(:,:,:) = PRIS(:,:,:) * ZINVTSTEP +#ifdef REPRO48 + PINPRS(:,:) = 0. +#else + PINPRS(:,:) = ZWSED(:,:,IKB)/XRHOLW +#endif + ! !* 2.4 for aggregates/snow ! @@ -2085,7 +2131,7 @@ END DO ENDDO ENDIF - PINPRS(:,:) = ZWSED(:,:,IKB)/XRHOLW ! in m/s + PINPRS(:,:) = ZWSED(:,:,IKB)/XRHOLW + PINPRS(:,:) ! in m/s (add ice fall) PRSS(:,:,:) = PRSS(:,:,:) * ZINVTSTEP @@ -2262,16 +2308,11 @@ IF( INEGT >= 1 ) THEN ALLOCATE(ZCIT(INEGT)) ; ALLOCATE(ZZT(INEGT)) ; ALLOCATE(ZPRES(INEGT)); + ALLOCATE(ZZICENU(INEGT)); IF (OCND2) THEN ALLOCATE(ZZZ(INEGT)) - ALLOCATE(ZDZ(INEGT)) ALLOCATE(ZSIFRC(INEGT)) - ALLOCATE(ZSSIO(INEGT)) - ALLOCATE(ZSSIU(INEGT)) - ALLOCATE(ZW2D(INEGT)) - ALLOCATE(ZRVS(INEGT)) ALLOCATE(ZAM3(INEGT)) - ALLOCATE(ZARTMP(INEGT)) ALLOCATE(ZREDIN(INEGT)) ALLOCATE(ZESI(INEGT)) ALLOCATE(ZESW(INEGT)) @@ -2281,14 +2322,14 @@ IF( INEGT >= 1 ) THEN ZCIT(JL) = PCIT(I1(JL),I2(JL),I3(JL)) ZZT(JL) = ZT(I1(JL),I2(JL),I3(JL)) ZPRES(JL) = PPABST(I1(JL),I2(JL),I3(JL)) + ZZICENU(JL) = PICENU(I1(JL),I2(JL)) IF (OCND2) THEN - ZRVS(JL)= PRVS(I1(JL),I2(JL),I3(JL)) ZZZ(JL) = ZZZZ(I1(JL),I2(JL),I3(JL)) - ZDZ(JL) = PDZZ(I1(JL),I2(JL),I3(JL)) ZESI(JL) = ESATI(ZZT(JL)) ZESW(JL) = ESATW(ZZT(JL)) - ZAM3(JL) = AM3(ZZT(JL)) + ZAM3(JL) = AM3(MAX(XFRMIN(27),ZZT(JL))) ! Avoid too high IN for very low temp. ZREDIN(JL) = REDIN(ZZT(JL)) + ZSIFRC(JL) = PICLDFR(I1(JL),I2(JL),I3(JL)) ENDIF ENDDO ALLOCATE(ZZW(INEGT)) @@ -2320,12 +2361,13 @@ IF( INEGT >= 1 ) THEN ZZW(:) = 0.0 ZSSI(:) = MIN( ZSSI(:), ZUSW(:) ) ! limitation of SSi according to SSw=0 IF(OCND2)THEN - ZARTMP(:) = -1. - CALL ICECLOUD(INEGT,ZPRES,ZZZ,ZDZ,ZZT,ZRVS,PTSTEP,-1.,ZARTMP, & - & ZXW2D,ZSIFRC,ZSSIO,ZSSIU,ZW2D,ZZW) !note: ZZW is dummy here, not used - - ZZW(:) = ZREDIN(:)* MAX(0.1,((20000.- MIN(20000.,ZZZ(:)))/20000.)**4) & + IF (LMODICEDEP) THEN + ZZW(:) = 5.*EXP(0.304*(XTT-ZZT(:))) + ZZW(:) = MIN(1.,MAX(ZSSI(:)*10.,0.01))*ZZW(:) + ELSE + ZZW(:) = ZREDIN(:)* MAX(0.1,((20000.- MIN(20000.,ZZZ(:)))/20000.)**4) & & *ZAM3(:)*(0.0001 + 0.9999*ZSIFRC(:)) + ENDIF ELSE WHERE( (ZZT(:)<XTT-5.0) .AND. (ZSSI(:)>0.0) ) ZZW(:) = XNU20 * EXP( XALPHA2*ZSSI(:)-XBETA2 ) @@ -2336,8 +2378,7 @@ IF( INEGT >= 1 ) THEN ( ZSSI(:)/ZUSW(:) )**XALPHA1 ) END WHERE ENDIF - - ZZW(:) = ZZW(:) - ZCIT(:) + ZZW(:) = ZZW(:)*ZZICENU(:) - ZCIT(:) IF( MAXVAL(ZZW(:)) > 0.0 ) THEN ! !* 3.1.2 update the r_i and r_v mixing ratios @@ -2371,17 +2412,12 @@ IF( INEGT >= 1 ) THEN DEALLOCATE(ZZT) DEALLOCATE(ZCIT) DEALLOCATE(ZRVT) + DEALLOCATE(ZZICENU) IF (OCND2) THEN DEALLOCATE(ZZZ) - DEALLOCATE(ZDZ) DEALLOCATE(ZSIFRC) - DEALLOCATE(ZSSIO) - DEALLOCATE(ZSSIU) - DEALLOCATE(ZW2D) - DEALLOCATE(ZRVS) DEALLOCATE(ZAM3) DEALLOCATE(ZREDIN) - DEALLOCATE(ZARTMP) DEALLOCATE(ZESI) DEALLOCATE(ZESW) ENDIF @@ -2395,6 +2431,80 @@ IF (LBUDGET_RI) CALL BUDGET_DDH (PRIS(:,:,:)*PRHODJ(:,:,:),9,'HENU_BU_RRI',YDDDH ! IF (LHOOK) CALL DR_HOOK('RAIN_ICE_OLD:RAIN_ICE_NUCLEATION',1,ZHOOK_HANDLE) END SUBROUTINE RAIN_ICE_NUCLEATION + REAL FUNCTION ICENUMBER2 (Q_ICE, T3D) + + IMPLICIT NONE + REAL, PARAMETER:: ICE_DENSITY = 890.0 + REAL, PARAMETER:: PI = 3.1415926536 + INTEGER IDX_REI + REAL CORR, REICE, DEICE, Q_ICE, T3D + DOUBLE PRECISION LAMBDA + +!+---+-----------------------------------------------------------------+ +!..Table of lookup values of radiative effective radius of ice crystals +!.. as a function of Temperature from -94C to 0C. Taken from WRF RRTMG +!.. radiation code where it is attributed to Jon Egill Kristjansson +!.. and coauthors. +!+---+-----------------------------------------------------------------+ + + REAL RETAB(95) + DATA RETAB / & + 5.92779, 6.26422, 6.61973, 6.99539, 7.39234, & + 7.81177, 8.25496, 8.72323, 9.21800, 9.74075, 10.2930, & + 10.8765, 11.4929, 12.1440, 12.8317, 13.5581, 14.2319, & + 15.0351, 15.8799, 16.7674, 17.6986, 18.6744, 19.6955, & + 20.7623, 21.8757, 23.0364, 24.2452, 25.5034, 26.8125, & + 27.7895, 28.6450, 29.4167, 30.1088, 30.7306, 31.2943, & + 31.8151, 32.3077, 32.7870, 33.2657, 33.7540, 34.2601, & + 34.7892, 35.3442, 35.9255, 36.5316, 37.1602, 37.8078, & + 38.4720, 39.1508, 39.8442, 40.5552, 41.2912, 42.0635, & + 42.8876, 43.7863, 44.7853, 45.9170, 47.2165, 48.7221, & + 50.4710, 52.4980, 54.8315, 57.4898, 60.4785, 63.7898, & + 65.5604, 71.2885, 75.4113, 79.7368, 84.2351, 88.8833, & + 93.6658, 98.5739, 103.603, 108.752, 114.025, 119.424, & + 124.954, 130.630, 136.457, 142.446, 148.608, 154.956, & + 161.503, 168.262, 175.248, 182.473, 189.952, 197.699, & + 205.728, 214.055, 222.694, 231.661, 240.971, 250.639/ + +!+---+-----------------------------------------------------------------+ +!..From the model 3D temperature field, subtract 179K for which +!.. index value of retab as a start. Value of corr is for +!.. interpolating between neighboring values in the table. +!+---+-----------------------------------------------------------------+ + + IDX_REI = INT(T3D-179.) + IDX_REI = MIN(MAX(IDX_REI,1),95) + CORR = T3D - INT(T3D) + REICE = RETAB(IDX_REI)*(1.-CORR) + RETAB(MIN(95,IDX_REI+1))*CORR + DEICE = 2.*REICE * 1.E-6 + +!+---+-----------------------------------------------------------------+ +!..Now we have the final radiative effective size of ice (as function +!.. of temperature only). This size represents 3rd moment divided by +!.. second moment of the ice size distribution, so we can compute a +!.. number concentration from the mean size and mass mixing ratio. +!.. The mean (radiative effective) diameter is 3./Slope for an inverse +!.. exponential size distribution. So, starting with slope, work +!.. backwords to get number concentration. +!+---+-----------------------------------------------------------------+ + + LAMBDA = 3.0 / DEICE + ICENUMBER2 = Q_ICE * LAMBDA*LAMBDA*LAMBDA / (PI*ICE_DENSITY) + +!+---+-----------------------------------------------------------------+ +!..Example1: Common ice size coming from Thompson scheme is about 30 microns. +!.. An example ice mixing ratio could be 0.001 g/kg for a temperature of -50C. +!.. Remember to convert both into MKS units. This gives N_ice=357652 per kg. +!..Example2: Lower in atmosphere at T=-10C matching ~162 microns in retab, +!.. and assuming we have 0.1 g/kg mixing ratio, then N_ice=28122 per kg, +!.. which is 28 crystals per liter of air if the air density is 1.0. +!+---+-----------------------------------------------------------------+ + + RETURN + END + +! +! ! !------------------------------------------------------------------------------- ! @@ -2504,6 +2614,9 @@ IMPLICIT NONE ( 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(:))) + WHERE (ZZW(:) < 0.0 ) + ZZW(:) = ZZW(:) * ZRDEPSRED + END WHERE ZRSS(:) = ZRSS(:) + ZZW(:) ZRVS(:) = ZRVS(:) - ZZW(:) ZTHS(:) = ZTHS(:) + ZZW(:)*ZLSFACT(:) @@ -2551,14 +2664,11 @@ IMPLICIT NONE ZRIS(:) = ZRIS(:) - ZZW(:) END WHERE - IF(OCND2)THEN ! 3.4.5 B: + IF (OCND2 .AND. .NOT. LMODICEDEP) THEN ! 3.4.5 B: ! Turn ice crystals lagrer than a precribed size into snow: ! (For the moment sperical ice crystals are assumed) ALLOCATE(ZBFT(IMICRO)) - ZZW(:)=0._JPRB - ZZW(:) = MIN(ZPRES(:)/2._JPRB, ZESI(:)) ! es_i, safety limitation - WHERE ( (ZRIS(:)>0.0_JPRB) .AND.(ZSSI(:)>0.001_JPRB) ) ZBFT(:) = 0.5_JPRB*87.5_JPRB*(ZDICRIT)**2*ZAI(:)/ ZSSI(:) ZBFT(:) = PTSTEP/ MAX(PTSTEP,ZBFT(:)*2._JPRB) @@ -2569,6 +2679,33 @@ IMPLICIT NONE DEALLOCATE(ZBFT) ENDIF + IF (OCND2 .AND. LMODICEDEP) THEN ! 3.4.5 B: + ! Turn ice to snow if ice crystal distrubution is such that + ! the ice crystal diameter for the (mass x N_i) maximum + ! is lagrer than a precribed size. + ! (ZDICRIT) The general gamma function is assumed + ALLOCATE(ZBFT(IMICRO)) + DO JL=1,IMICRO + ZZW2(JL) = & + MAX(ZCIT(JL),ICENUMBER2(ZRIS(JL)*PTSTEP,ZZT(JL))*ZRHODREF(JL)) + ENDDO + + WHERE ( ZRIS(:)>XFRMIN(13) .AND.ZCIT(:) > 0. ) + ZZW2(:) = MIN(1.E8,XLBI*( ZRHODREF(:)*ZRIS(:)* PTSTEP/ZZW2(:) )**XLBEXI) ! LAMBDA for ICE + ZBFT(:) = 1. - 0.5**( ZKVO /ZZW2(:)) + ZBFT(:) = MIN(0.9*ZRIS(:)*PTSTEP, ZBFT(:)*ZRIS(:)*PTSTEP) + ZRSS(:) = ZRSS(:) + ZBFT(:) + ZRIS(:) = ZRIS(:) - ZBFT(:) + END WHERE +! DO JL=1,IMICRO + +! IF(ZRIS(JL)>XFRMIN(13) .AND.ZCIT(JL) > 0. ) THEN +! print*,'345JL', ZZW2(JL),ZRIS(JL),ZBFT(JL),ZZT(JL)-XTT +! ENDIF +! ENDDO + DEALLOCATE(ZBFT) + ENDIF + DEALLOCATE(ZCRIAUTI) IF (LBUDGET_RI) CALL BUDGET_DDH ( & UNPACK(ZRIS(:)*ZRHODJ(:),MASK=GMICRO(:,:,:),FIELD=0.0), & @@ -2580,40 +2717,33 @@ IMPLICIT NONE !* 3.4.6 compute the deposition on r_g: RVDEPG ! ! - ZZW2(:) = 0.0 - IF(LGRSN) ZZW2(:) = MAX(0., MIN(1., (1.0E-7 - ZRGS(:))/1.0E-7))* & - & MAX(0.,MIN(1.,ZSSI(:)/0.15)) - + IF (XFRMIN(5)> 1.0E-12 .AND. XFRMIN(6) > 0.01) & + & ZZW2(:) = MAX(0., MIN(1., (XFRMIN(5) - ZRGS(:))/XFRMIN(5)))* & + & MAX(0.,MIN(1.,ZSSI(:)/XFRMIN(6))) + + WHERE ( ZRGT(:)>0.0 ) ZLBDAG(:) = XLBG*( ZRHODREF(:)*MAX( ZRGT(:),XRTMIN(6) ) )**XLBEXG END WHERE ZZW(:) = 0.0 - - IF(LGRSN)THEN - WHERE ( (ZRGT(:)>XRTMIN(6)) .AND. (ZRGS(:)>0.0) ) + WHERE ( (ZRGT(:)>XRTMIN(6)) .AND. (ZRGS(:)>0.0) ) ZZW(:) = ( ZSSI(:)/(ZRHODREF(:)*ZAI(:)) ) * & ( 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(:))) ZZW(:) = ZZW(:)*ZREDGR + WHERE (ZZW(:) < 0.0 ) + ZZW(:) = ZZW(:) * ZRDEPGRED + END WHERE ZRSS(:) = (ZZW(:) + ZRGS(:))* ZZW2(:) + ZRSS(:) ZRGS(:) = (ZZW(:) + ZRGS(:))*(1. - ZZW2(:)) ZRVS(:) = ZRVS(:) - ZZW(:) ZTHS(:) = ZTHS(:) + ZZW(:)*ZLSFACT(:) - END WHERE - ELSE - WHERE ( (ZRGT(:)>XRTMIN(6)) .AND. (ZRGS(:)>0.0) ) - ZZW(:) = ( ZSSI(:)/(ZRHODREF(:)*ZAI(:)) ) * & - ( 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(:))) - ZZW(:) = ZZW(:)*ZREDGR - ZRGS(:) = ZRGS(:) + ZZW(:) - ZRVS(:) = ZRVS(:) - ZZW(:) - ZTHS(:) = ZTHS(:) + ZZW(:)*ZLSFACT(:) - END WHERE - END IF + END WHERE + WHERE (ZZW(:) < 0.0 ) + ZZW(:) = ZZW(:) * ZRDEPGRED + END WHERE IF (LBUDGET_TH) CALL BUDGET_DDH ( & @@ -2644,15 +2774,14 @@ IMPLICIT NONE ! !* 4.2 compute the autoconversion of r_c for r_r production: RCAUTR ! - REAL :: ZINHOMFACT REAL(KIND=JPRB) :: ZHOOK_HANDLE IF (LHOOK) CALL DR_HOOK('RAIN_ICE_OLD:RAIN_ICE_WARM',0,ZHOOK_HANDLE) - ZINHOMFACT=10. - - IF(OCND2)THEN + IF (LKOGAN) THEN WHERE( ZRCT(:) > 1.0E-8) ! Closely following Kogan autoconversion - ZZW(:) = 1350.0*ZINHOMFACT* ZCONCM(:)**(-1.79) * ZRCT(:)**2.47 + ZZW(:) = 1350.0*ZZKGN_ACON(:)* ZCONCM(:)**(-1.79) * & + & (ZRCT(:)/(MAX(ZZKGN_SBGR(:),ZCF(:))))**2.47 + ZZW(:) = ZZW(:)*MAX(ZZKGN_SBGR(:),ZCF(:)) ZZW(:) = MIN( ZRCS(:),ZZW(:)) ZRCS(:) = ZRCS(:) - ZZW(:) ZRRS(:) = ZRRS(:) + ZZW(:) @@ -2664,7 +2793,7 @@ IMPLICIT NONE ZRCS(:) = ZRCS(:) - ZZW(:) ZRRS(:) = ZRRS(:) + ZZW(:) END WHERE - ENDIF + ENDIF ! IF (LBUDGET_RC) CALL BUDGET_DDH ( & UNPACK(ZRCS(:)*ZRHODJ(:),MASK=GMICRO(:,:,:),FIELD=0.0), & @@ -2678,7 +2807,7 @@ IMPLICIT NONE IF (CSUBG_RC_RR_ACCR=='NONE') THEN !CLoud water and rain are diluted over the grid box WHERE( ZRCT(:)>XRTMIN(2) .AND. ZRRT(:)>XRTMIN(3) .AND. ZRCS(:)>0.0 ) - ZZW(:) = MIN( ZRCS(:), XFCACCR * ZRCT(:) & + ZZW(:) = MIN( ZRCS(:), XFCACCR * ZRCT(:)*ZACRF(:) & * ZLBDAR(:)**XEXCACCR & * ZRHODREF(:)**(-XCEXVT) ) ZRCS(:) = ZRCS(:) - ZZW(:) @@ -2906,27 +3035,15 @@ IMPLICIT NONE ! ! 5.1.4 riming of the small sized aggregates ! - IF(OCND2)THEN - WHERE ( GRIM(:) ) - ZZW1(:,1) = MIN( ZRCS(:), & + WHERE ( GRIM(:) ) + ZZW1(:,1) = MIN( ZRCS(:), & XCRIMSS * ZZW(:) * ZRCT(:)*ZCOLF(:) & ! RCRIMSS * ZLBDAS(:)**XEXCRIMSS & * ZRHODREF(:)**(-XCEXVT) ) - ZRCS(:) = ZRCS(:) - ZZW1(:,1) - ZRSS(:) = ZRSS(:) + ZZW1(:,1) - ZTHS(:) = ZTHS(:) + ZZW1(:,1)*(ZLSFACT(:)-ZLVFACT(:)) ! f(L_f*(RCRIMSS)) - END WHERE - ELSE - WHERE ( GRIM(:) ) - ZZW1(:,1) = MIN( ZRCS(:), & - XCRIMSS * ZZW(:) * ZRCT(:) & ! RCRIMSS - * ZLBDAS(:)**XEXCRIMSS & - * ZRHODREF(:)**(-XCEXVT) ) - ZRCS(:) = ZRCS(:) - ZZW1(:,1) - ZRSS(:) = ZRSS(:) + ZZW1(:,1) - ZTHS(:) = ZTHS(:) + ZZW1(:,1)*(ZLSFACT(:)-ZLVFACT(:)) ! f(L_f*(RCRIMSS)) - END WHERE - ENDIF + ZRCS(:) = ZRCS(:) - ZZW1(:,1) + ZRSS(:) = ZRSS(:) + ZZW1(:,1) + ZTHS(:) = ZTHS(:) + ZZW1(:,1)*(ZLSFACT(:)-ZLVFACT(:)) ! f(L_f*(RCRIMSS)) + END WHERE ! ! 5.1.5 perform the linear interpolation of the normalized ! "XBS"-moment of the incomplete gamma function @@ -2938,37 +3055,20 @@ IMPLICIT NONE ! 5.1.6 riming-conversion of the large sized aggregates into graupeln ! ! - IF(OCND2)THEN - WHERE ( GRIM(:) .AND. (ZRSS(:)>0.0) ) - ZZW1(:,2) = MIN( ZRCS(:), & + WHERE ( GRIM(:) .AND. (ZRSS(:)>0.0) ) + ZZW1(:,2) = MIN( ZRCS(:), & XCRIMSG * ZRCT(:)*ZCOLF(:) & ! RCRIMSG * ZLBDAS(:)**XEXCRIMSG & * ZRHODREF(:)**(-XCEXVT) & - ZZW1(:,1) ) - ZZW1(:,3) = MIN( ZRSS(:), & - XSRIMCG * ZLBDAS(:)**XEXSRIMCG & ! RSRIMCG - * (1.0 - ZZW(:) )/(PTSTEP*ZRHODREF(:)) ) - ZRCS(:) = ZRCS(:) - ZZW1(:,2) - ZRSS(:) = ZRSS(:) - ZZW1(:,3) - ZRGS(:) = ZRGS(:) + ZZW1(:,2)+ZZW1(:,3) - ZTHS(:) = ZTHS(:) + ZZW1(:,2)*(ZLSFACT(:)-ZLVFACT(:)) ! f(L_f*(RCRIMSG)) - END WHERE - ELSE - WHERE ( GRIM(:) .AND. (ZRSS(:)>0.0) ) - ZZW1(:,2) = MIN( ZRCS(:), & - XCRIMSG * ZRCT(:) & ! RCRIMSG - * ZLBDAS(:)**XEXCRIMSG & - * ZRHODREF(:)**(-XCEXVT) & - - ZZW1(:,1) ) - ZZW1(:,3) = MIN( ZRSS(:), & + ZZW1(:,3) = MIN( ZRSS(:), & XSRIMCG * ZLBDAS(:)**XEXSRIMCG & ! RSRIMCG * (1.0 - ZZW(:) )/(PTSTEP*ZRHODREF(:)) ) - ZRCS(:) = ZRCS(:) - ZZW1(:,2) - ZRSS(:) = ZRSS(:) - ZZW1(:,3) - ZRGS(:) = ZRGS(:) + ZZW1(:,2)+ZZW1(:,3) - ZTHS(:) = ZTHS(:) + ZZW1(:,2)*(ZLSFACT(:)-ZLVFACT(:)) ! f(L_f*(RCRIMSG)) - END WHERE - ENDIF + ZRCS(:) = ZRCS(:) - ZZW1(:,2) + ZRSS(:) = ZRSS(:) - ZZW1(:,3) + ZRGS(:) = ZRGS(:) + ZZW1(:,2)+ZZW1(:,3) + ZTHS(:) = ZTHS(:) + ZZW1(:,2)*(ZLSFACT(:)-ZLVFACT(:)) ! f(L_f*(RCRIMSG)) + END WHERE DEALLOCATE(IVEC2) DEALLOCATE(IVEC1) DEALLOCATE(ZVEC2) @@ -3047,9 +3147,9 @@ IMPLICIT NONE XLBRACCS2/( ZLBDAS(:) * ZLBDAR(:) ) + & XLBRACCS3/( (ZLBDAR(:)**2)) )/ZLBDAR(:)**4 ZZW1(:,4) = MIN( ZRRS(:),ZZW1(:,2)*ZZW(:) ) ! RRACCSS - ZRRS(:) = ZRRS(:) - ZZW1(:,4) - ZRSS(:) = ZRSS(:) + ZZW1(:,4) - ZTHS(:) = ZTHS(:) + ZZW1(:,4)*(ZLSFACT(:)-ZLVFACT(:)) ! f(L_f*(RRACCSS)) + ZRRS(:) = ZRRS(:) - ZZW1(:,4)*XFRMIN(7) + ZRSS(:) = ZRSS(:) + ZZW1(:,4)*XFRMIN(7) + ZTHS(:) = ZTHS(:) + ZZW1(:,4)*(ZLSFACT(:)-ZLVFACT(:))*XFRMIN(7) ! f(L_f*(RRACCSS)) END WHERE ! ! 5.2.4b perform the bilinear interpolation of the normalized @@ -3084,7 +3184,7 @@ IMPLICIT NONE WHERE ( GACC(:) .AND. (ZRSS(:)>0.0) ) ZZW1(:,2) = MAX( MIN( ZRRS(:),ZZW1(:,2)-ZZW1(:,4) ),0.0 ) ! RRACCSG END WHERE - WHERE ( GACC(:) .AND. (ZRSS(:)>0.0) .AND. ZZW1(:,2)>0.0 ) + WHERE ( GACC(:) .AND. (ZRSS(:)>0.0) .AND. ZZW1(:,2)>0.0 .AND. ZRSS(:)>XFRMIN(1)/PTSTEP ) ZZW1(:,3) = MIN( ZRSS(:),XFSACCRG*ZZW(:)* & ! RSACCRG ( ZLBDAS(:)**(XCXS-XBS) )*( ZRHODREF(:)**(-XCEXVT-1.) ) & *( XLBSACCR1/((ZLBDAR(:)**2) ) + & @@ -3167,7 +3267,7 @@ IMPLICIT NONE REAL(KIND=JPRB) :: ZHOOK_HANDLE IF (LHOOK) CALL DR_HOOK('RAIN_ICE_OLD:RAIN_ICE_FAST_RG',0,ZHOOK_HANDLE) ZZW1(:,3:4) = 0.0 - WHERE( (ZRIT(:)>XRTMIN(4)) .AND. (ZRRT(:)>XRTMIN(3)) .AND. & + WHERE( (ZRIT(:)>XRTMIN(4) .AND. ZRIT(:)>XFRMIN(2)) .AND. (ZRRT(:)>XRTMIN(3)) .AND. & (ZRIS(:)>0.0) .AND. (ZRRS(:)>0.0) ) ZZW1(:,3) = MIN( ZRIS(:),XICFRR * ZRIT(:) & ! RICFRRG * ZLBDAR(:)**XEXICFRR & @@ -3254,15 +3354,19 @@ IMPLICIT NONE END DO ZZW(:) = UNPACK( VECTOR=ZVEC3(:),MASK=GDRY,FIELD=0.0 ) ! - WHERE( GDRY(:) ) - ZZW1(:,3) = MIN( ZRSS(:),XFSDRYG*ZZW(:) & ! RSDRYG - * EXP( XCOLEXSG*(ZZT(:)-XTT) ) & - *( ZLBDAS(:)**(XCXS-XBS) )*( ZLBDAG(:)**XCXG ) & - *( ZRHODREF(:)**(-XCEXVT-1.) ) & - *( XLBSDRYG1/( ZLBDAG(:)**2 ) + & - XLBSDRYG2/( ZLBDAG(:) * ZLBDAS(:) ) + & - XLBSDRYG3/( ZLBDAS(:)**2) ) ) - END WHERE + IF (OCND2) THEN + ZZW1(:,3) = 0. + ELSE + WHERE( GDRY(:) ) + ZZW1(:,3) = MIN( ZRSS(:),XFSDRYG*ZZW(:) & ! RSDRYG + * EXP( XCOLEXSG*(ZZT(:)-XTT) ) & + *( ZLBDAS(:)**(XCXS-XBS) )*( ZLBDAG(:)**XCXG ) & + *( ZRHODREF(:)**(-XCEXVT-1.) ) & + *( XLBSDRYG1/( ZLBDAG(:)**2 ) + & + XLBSDRYG2/( ZLBDAG(:) * ZLBDAS(:) ) + & + XLBSDRYG3/( ZLBDAS(:)**2) ) ) + END WHERE + ENDIF DEALLOCATE(IVEC2) DEALLOCATE(IVEC1) DEALLOCATE(ZVEC3) @@ -3393,7 +3497,12 @@ IMPLICIT NONE ! f(L_f*(RCWETG+RRWETG)) END WHERE ELSE IF( KRR == 6 ) THEN - WHERE( ZRGT(:)>XRTMIN(6) .AND. ZZT(:)<XTT & + WHERE( ZRGT(:)>XRTMIN(6) .AND. ZRGT(:)>XFRMIN(3) .AND. & +#ifdef REPRO48 + ZZT(:)<XTT & +#else + ZRIS(:)*PTSTEP>XFRMIN(3) .AND. ZZT(:)<XTT & +#endif .AND. & ! Wet ZRDRYG(:)>=ZRWETG(:) .AND. ZRWETG(:)>0.0 ) ! case ZZW(:) = ZRWETG(:) @@ -3432,7 +3541,12 @@ IMPLICIT NONE END IF ! - WHERE( ZRGT(:)>XRTMIN(6) .AND. ZZT(:)<XTT & + WHERE( ZRGT(:)>XRTMIN(6) .AND. ZRGT(:)>XFRMIN(4) .AND. & +#ifdef REPRO48 + ZZT(:)<XTT & +#else + ZRIS(:)*PTSTEP>XFRMIN(4) .AND. ZZT(:)<XTT & +#endif .AND. & ZRDRYG(:)<ZRWETG(:) .AND. ZRDRYG(:)>0.0 ) ! Dry ZRCS(:) = ZRCS(:) - ZZW1(:,1) @@ -3470,24 +3584,50 @@ IMPLICIT NONE !* 6.5 Melting of the graupeln ! ZZW(:) = 0.0 - WHERE( (ZRGT(:)>XRTMIN(6)) .AND. (ZRGS(:)>0.0) .AND. (ZZT(:)>XTT) ) - ZZW(:) = ZRVT(:)*ZPRES(:)/(XEPSILO+ZRVT(:)) ! Vapor pressure - ZZW(:) = ZKA(:)*(XTT-ZZT(:)) + & - ( ZDV(:)*(XLVTT + ( XCPV - XCL ) * ( ZZT(:) - XTT )) & - *(XESTT-ZZW(:))/(XRV*ZZT(:)) ) + IF (LTIW) THEN + + WHERE( (ZRGT(:)>XRTMIN(6)) .AND. (ZRGS(:)>0.0) .AND. (ZTIW(:)>XTT) ) + ZZW(:) = ZRVT(:)*ZPRES(:)/(XEPSILO+ZRVT(:)) ! Vapor pressure + ZZW(:) = ZKA(:)*(XTT-ZTIW(:)) + & + ( ZDV(:)*(XLVTT + ( XCPV - XCL ) * ( ZTIW(:) - XTT )) & + *(XESTT-ZZW(:))/(XRV*ZTIW(:)) ) ! ! compute RGMLTR ! - ZZW(:) = MIN( ZRGS(:), MAX( 0.0,( -ZZW(:) * & - ( X0DEPG* ZLBDAG(:)**XEX0DEPG + & - X1DEPG*ZCJ(:)*ZLBDAG(:)**XEX1DEPG ) - & - ( ZZW1(:,1)+ZZW1(:,4) ) * & - ( ZRHODREF(:)*XCL*(XTT-ZZT(:))) ) / & - ( ZRHODREF(:)*XLMTT ) ) ) - ZRRS(:) = ZRRS(:) + ZZW(:) - ZRGS(:) = ZRGS(:) - ZZW(:) - ZTHS(:) = ZTHS(:) - ZZW(:)*(ZLSFACT(:)-ZLVFACT(:)) ! f(L_f*(-RGMLTR)) - END WHERE + ZZW(:) = XFRMIN(8)*MIN( ZRGS(:), MAX( 0.0,( -ZZW(:) * & + ( X0DEPG* ZLBDAG(:)**XEX0DEPG + & + X1DEPG*ZCJ(:)*ZLBDAG(:)**XEX1DEPG ) - & + ( ZZW1(:,1)+ZZW1(:,4) ) * & + ( ZRHODREF(:)*XCL*(XTT-ZTIW(:))) ) / & + ( ZRHODREF(:)*XLMTT ) ) ) + + + ZRRS(:) = ZRRS(:) + ZZW(:) + ZRGS(:) = ZRGS(:) - ZZW(:) + ZTHS(:) = ZTHS(:) - ZZW(:)*(ZLSFACT(:)-ZLVFACT(:)) ! f(L_f*(-RGMLTR)) + END WHERE + ELSE + + WHERE( (ZRGT(:)>XRTMIN(6)) .AND. (ZRGS(:)>0.0) .AND. (ZZT(:)>XTT) ) + ZZW(:) = ZRVT(:)*ZPRES(:)/(XEPSILO+ZRVT(:)) ! Vapor pressure + ZZW(:) = ZKA(:)*(XTT-ZZT(:)) + & + ( ZDV(:)*(XLVTT + ( XCPV - XCL ) * ( ZZT(:) - XTT )) & + *(XESTT-ZZW(:))/(XRV*ZZT(:)) ) +! +! compute RGMLTR +! + ZZW(:) = XFRMIN(8)*MIN( ZRGS(:), MAX( 0.0,( -ZZW(:) * & + ( X0DEPG* ZLBDAG(:)**XEX0DEPG + & + X1DEPG*ZCJ(:)*ZLBDAG(:)**XEX1DEPG ) - & + ( ZZW1(:,1)+ZZW1(:,4) ) * & + ( ZRHODREF(:)*XCL*(XTT-ZZT(:))) ) / & + ( ZRHODREF(:)*XLMTT ) ) ) + ZRRS(:) = ZRRS(:) + ZZW(:) + ZRGS(:) = ZRGS(:) - ZZW(:) + ZTHS(:) = ZTHS(:) - ZZW(:)*(ZLSFACT(:)-ZLVFACT(:)) ! f(L_f*(-RGMLTR)) + END WHERE + ENDIF + IF (LBUDGET_TH) CALL BUDGET_DDH ( & UNPACK(ZTHS(:),MASK=GMICRO(:,:,:),FIELD=PTHS)*PRHODJ(:,:,:), & 4,'GMLT_BU_RTH',YDDDH, YDLDDH, YDMDDH) @@ -3834,10 +3974,26 @@ IMPLICIT NONE ! Sub gridscale decomposition into a supersaturation part of the gridbox, ! ZSIFRC with a superaturation ZSSIO and a subsaturated part (1.- ZSIFRC) ! with a (negative) superaturation of ZSSIU - ZARTMP(:) = -1. - CALL ICECLOUD(IMICRO,ZPRES,ZZZ,ZDZ,ZZT,ZRVS,PTSTEP,-1.,ZARTMP, & - & ZXW2D,ZSIFRC,ZSSIO,ZSSIU,ZW2D,ZCI2S) !note: ZCI2S is dummy here, not used - DO JK=1,IMICRO + + + IF (LMODICEDEP) THEN + DO JL=1,IMICRO + ZZW2(JL) = MAX(ZCIT(JL),ICENUMBER2(ZRIS(JL)*PTSTEP,ZZT(JL))* & + ZRHODREF(JL)) + ENDDO + WHERE( ZZW2(:)>0.0 .AND. ZESI(:) < ZPRES(:)*0.5) + ZZW(:)= X0DEPI/(XLBI*ZAI(:)) *(ZZW2(:)/ZRHODREF(:))**(1.+XLBEXI) * & + & (PTSTEP*MAX(XRTMIN(4)/PTSTEP,ZRIS(:))*ZW2D(:) )**(-XLBEXI) + ZZW(:)= MAX(-ZRIS(:)*ZW2D(:)*(1.-ZSIFRC(:))+ZZW(:)*ZSSIO(:)* ZSIFRC(:)* ZXW2D13(:), & + & ZZW(:)* ( ZSSIO(:)* ZSIFRC(:)* ZXW2D13(:) + ZCITRED23*ZSSIU(:)* (1.-ZSIFRC(:)) )) + + ZRIS(:) = ZRIS(:) + ZZW(:) + ZRVS(:) = ZRVS(:) - ZZW(:) ! Budget here: ! cloud ice + vapor = const + ZTHS(:) = ZTHS(:) + ZZW(:)*ZLSFACT(:) ! f(L_f*(RCBERI)) + + END WHERE + ELSE + DO JK=1,IMICRO ZTC = MAX(-18.,MIN(-1.,ZZT(JK)-XTT)) ZHU = MIN(0.15,MAX(0.,ZSSI(JK))) @@ -3847,7 +4003,7 @@ IMPLICIT NONE ZCI2S(JK) = 0. IF(ZRIS(JK)*PTSTEP > 1.0e-12)THEN ZCI2S(JK) = ZRIS(JK)*(1. - MIN(1., 0.5*ZQIMAX /ZRIS(JK)/PTSTEP))* & - & (1.-ZSIFRC(JK))/( ZXW2D*ZSIFRC(JK) + 1.-ZSIFRC(JK)) + & (1.-ZSIFRC(JK))*ZW2D(JK) ! 0.5*ZQIMAX /ZRIS(JK)/PTSTEP reduce ice wich a factot of 0.5 when ! ZQIMAX = cloud ice content. ! (1.-ZSIFRC(JK))/( ZXW2D*ZSIFRC(JK) + 1.-ZSIFRC(JK)) is the ratio for cloudice @@ -3855,13 +4011,13 @@ IMPLICIT NONE ENDIF - ENDDO - WHERE( ZRIT(:)>XRTMIN(4) .AND. ZCIT(:)>0.0 .AND. ZESI(:) < ZPRES(:)*0.5 ) + ENDDO + WHERE( ZCIT(:)>0.0 .AND. ZESI(:) < ZPRES(:)*0.5) ZZWC(:)=ZCRYSHA(:)*0.878/ZAI(:)*(ZCIT(:)/ZRHODREF(:))**0.667 & - &*(ZRIS(:)*PTSTEP*ZW2D(:))**0.333 + &*(MAX(XRTMIN(4)/PTSTEP,ZRIS(:))*PTSTEP*ZW2D(:))**0.333 ! Ice supersaturated part of grid box: WHERE( ZSSIO(:)>0. .AND. ZSIFRC(:) > 0.02_JPRB ) - ZZW(:) = ZZWC(:)*ZXW2D13*ZSSIO(:) + ZZW(:) = ZZWC(:)*ZXW2D13(:)*ZSSIO(:) ZRIS(:) = ZRIS(:) + ZZW(:)*ZSIFRC(:) ZRVS(:) = ZRVS(:) - ZZW(:)*ZSIFRC(:) ! Budget here: ! cloud ice + vapor = const ZTHS(:) = ZTHS(:) + ZZW(:)*ZLSFACT(:)*ZSIFRC(:) ! f(L_f*(RCBERI)) @@ -3876,7 +4032,8 @@ IMPLICIT NONE ZRVS(:) = ZRVS(:) - ZZW(:)*(1.-ZSIFRC(:)) ZTHS(:) = ZTHS(:) + ZZW(:)*ZLSFACT(:)*(1.-ZSIFRC(:)) END WHERE - END WHERE + END WHERE + ENDIF ELSE ! End OCND2 WHERE( (ZRCS(:)>0.0) .AND. (ZSSI(:)>0.0) .AND. & (ZRIT(:)>XRTMIN(4)) .AND. (ZCIT(:)>0.0) ) diff --git a/src/common/micro/condensation.F90 b/src/common/micro/condensation.F90 index c1e03b3b9..e950151e3 100644 --- a/src/common/micro/condensation.F90 +++ b/src/common/micro/condensation.F90 @@ -4,14 +4,15 @@ !MNH_LIC for details. version 1. !----------------------------------------------------------------- ! ######spl - SUBROUTINE CONDENSATION( KIU, KJU, KKU, KIB, KIE, KJB, KJE, KKB, KKE, KKL, & - HFRAC_ICE, HCONDENS, HLAMBDA3, & - PPABS, PZZ, PRHODREF, PT, PRV_IN, PRV_OUT, PRC_IN, PRC_OUT, PRI_IN, PRI_OUT, & - PRR, PRS, PRG, PSIGS, PMFCONV, PCLDFR, PSIGRC, OUSERI, & - OSIGMAS, OCND2, PSIGQSAT, & - PLV, PLS, PCPH, & - PHLC_HRC, PHLC_HCF, PHLI_HRI, PHLI_HCF, & - PICE_CLD_WGT) + SUBROUTINE CONDENSATION( KIU, KJU, KKU, KIB, KIE, KJB, KJE, KKB, KKE, KKL,& + HFRAC_ICE, HCONDENS, HLAMBDA3, & + PPABS, PZZ, PRHODREF, PT, PRV_IN, PRV_OUT, PRC_IN, PRC_OUT, PRI_IN, PRI_OUT, & + PRR, PRS, PRG, PSIGS, PMFCONV, PCLDFR, & + PSIGRC, OUSERI, OSIGMAS, OCND2, LHGT_QS, & + PICLDFR, PWCLDFR, PSSIO, PSSIU, PIFR, PSIGQSAT, & + PLV, PLS, PCPH, & + PHLC_HRC, PHLC_HCF, PHLI_HRI, PHLI_HCF, & + PICE_CLD_WGT) ! ################################################################################ ! !! @@ -74,6 +75,9 @@ !! 2014-11 K.I Ivarsson add possibility to run with OCND2 option !! 2016 S.Riette Change INQ1 !! 2016-11 S. Riette: use HFRAC_ICE, output adjusted state +!! 2018-02 K.I Ivarsson: Some modificatons of OCND2 option, mainly for optimation - new outputs +!! 2019-06 W.C. de Rooy: Mods for new set up statistical cloud scheme +!! 2019-07 K.I.Ivarsson: Switch for height dependent VQSIGSAT: LHGT_QS !! 2020-12 U. Andrae : Introduce SPP for HARMONIE-AROME !! R. El Khatib 24-Aug-2021 Optimizations !! 2021-01: SPP computations moved in aro_adjust (AROME/HARMONIE) @@ -86,9 +90,10 @@ USE PARKIND1, ONLY : JPRB USE YOMHOOK , ONLY : LHOOK, DR_HOOK USE MODD_CST USE MODD_PARAMETERS -USE MODD_RAIN_ICE_PARAM, ONLY : XCRIAUTC, XCRIAUTI, XACRIAUTI, XBCRIAUTI +USE MODD_RAIN_ICE_PARAM, ONLY : XCRIAUTC, XCRIAUTI, XACRIAUTI, XBCRIAUTI, XFRMIN USE MODE_TIWMX, ONLY : ESATW, ESATI USE MODE_ICECLOUD, ONLY : ICECLOUD +USE MODD_CTURB, ONLY : LSTATNW ! IMPLICIT NONE ! @@ -118,22 +123,31 @@ REAL, DIMENSION(KIU,KJU,KKU), INTENT(IN) :: PRC_IN ! grid scale r_c mixing ra REAL, DIMENSION(KIU,KJU,KKU), INTENT(OUT) :: PRC_OUT! grid scale r_c mixing ratio (kg/kg) in output REAL, DIMENSION(KIU,KJU,KKU), INTENT(IN) :: PRI_IN ! grid scale r_i (kg/kg) in input REAL, DIMENSION(KIU,KJU,KKU), INTENT(OUT) :: PRI_OUT! grid scale r_i (kg/kg) in output +REAL, DIMENSION(KIU,KJU,KKU), INTENT(IN) :: PRR ! grid scale mixing ration of rain (kg/kg) +REAL, DIMENSION(KIU,KJU,KKU), INTENT(IN) :: PRS ! grid scale mixing ration of snow (kg/kg) +REAL, DIMENSION(KIU,KJU,KKU), INTENT(IN) :: PRG ! grid scale mixing ration of graupel (kg/kg) +REAL, DIMENSION(KIU,KJU,KKU), INTENT(IN) :: PSIGS ! Sigma_s from turbulence scheme +REAL, DIMENSION(:,:,:), INTENT(IN) :: PMFCONV! convective mass flux (kg /s m^2) +REAL, DIMENSION(KIU,KJU,KKU), INTENT(OUT) :: PCLDFR ! cloud fraction +REAL, DIMENSION(KIU,KJU,KKU), INTENT(OUT) :: PSIGRC ! s r_c / sig_s^2 + LOGICAL, INTENT(IN) :: OUSERI ! logical switch to compute both ! liquid and solid condensate (OUSERI=.TRUE.) ! or only solid condensate (OUSERI=.FALSE.) LOGICAL, INTENT(IN) :: OSIGMAS! use present global Sigma_s values ! or that from turbulence scheme LOGICAL, INTENT(IN) :: OCND2 ! logical switch to sparate liquid and ice - ! more rigid (DEFALT value : .FALSE.) + ! more rigid (DEFAULT value : .FALSE.) +LOGICAL, INTENT(IN) :: LHGT_QS! logical switch for height dependent VQSIGSAT +REAL, DIMENSION(KIU,KJU,KKU), INTENT(OUT) :: PICLDFR! ice cloud fraction +REAL, DIMENSION(KIU,KJU,KKU), INTENT(OUT) :: PWCLDFR! water or mixed-phase cloud fraction +REAL, DIMENSION(KIU,KJU,KKU), INTENT(OUT) :: PSSIO ! Super-saturation with respect to ice in the + ! supersaturated fraction +REAL, DIMENSION(KIU,KJU,KKU), INTENT(OUT) :: PSSIU ! Sub-saturation with respect to ice in the + ! subsaturated fraction +REAL, DIMENSION(KIU,KJU,KKU), INTENT(OUT) :: PIFR ! Ratio cloud ice moist part REAL, DIMENSION(KIU,KJU), INTENT(IN) :: PSIGQSAT ! use an extra "qsat" variance contribution (OSIGMAS case) ! multiplied by PSIGQSAT -REAL, DIMENSION(KIU,KJU,KKU), INTENT(IN) :: PRR ! grid scale mixing ration of rain (kg/kg) -REAL, DIMENSION(KIU,KJU,KKU), INTENT(IN) :: PRS ! grid scale mixing ration of snow (kg/kg) -REAL, DIMENSION(KIU,KJU,KKU), INTENT(IN) :: PRG ! grid scale mixing ration of graupel (kg/kg) -REAL, DIMENSION(KIU,KJU,KKU), INTENT(IN) :: PSIGS ! Sigma_s from turbulence scheme -REAL, DIMENSION(:,:,:), INTENT(IN) :: PMFCONV! convective mass flux (kg /s m^2) -REAL, DIMENSION(KIU,KJU,KKU), INTENT(OUT) :: PCLDFR ! cloud fraction -REAL, DIMENSION(KIU,KJU,KKU), INTENT(OUT) :: PSIGRC ! s r_c / sig_s^2 REAL, DIMENSION(KIU,KJU,KKU), OPTIONAL, INTENT(IN) :: PLV ! Latent heat L_v REAL, DIMENSION(KIU,KJU,KKU), OPTIONAL, INTENT(IN) :: PLS ! Latent heat L_s @@ -142,7 +156,7 @@ REAL, DIMENSION(KIU,KJU,KKU), OPTIONAL, INTENT(OUT) :: PHLC_HRC REAL, DIMENSION(KIU,KJU,KKU), OPTIONAL, INTENT(OUT) :: PHLC_HCF ! cloud fraction REAL, DIMENSION(KIU,KJU,KKU), OPTIONAL, INTENT(OUT) :: PHLI_HRI REAL, DIMENSION(KIU,KJU,KKU), OPTIONAL, INTENT(OUT) :: PHLI_HCF -REAL, DIMENSION(KIU,KJU), OPTIONAL, INTENT(IN) :: PICE_CLD_WGT +REAL, DIMENSION(KIU,KJU), OPTIONAL, INTENT(IN) :: PICE_CLD_WGT ! ! !* 0.2 Declarations of local variables : @@ -150,14 +164,14 @@ REAL, DIMENSION(KIU,KJU), OPTIONAL, INTENT(IN) :: PICE_CLD_WGT INTEGER :: JI, JJ, JK, JKP, JKM, IKTB, IKTE ! loop index REAL, DIMENSION(KIU,KJU,KKU) :: ZTLK, ZRT ! work arrays for T_l and total water mixing ratio REAL, DIMENSION(KIU,KJU,KKU) :: ZL ! length scale -INTEGER, DIMENSION(KIU,KJU) :: ITPL ! top levels of troposphere +INTEGER, DIMENSION(KIU,KJU) :: ITPL ! top levels of troposphere REAL, DIMENSION(KIU,KJU) :: ZTMIN ! minimum Temp. related to ITPL ! REAL, DIMENSION(KIU,KJU,KKU) :: ZLV, ZLS, ZCPD REAL :: ZGCOND, ZAUTC, ZAUTI, ZGAUV, ZGAUC, ZGAUI, ZGAUTC, ZGAUTI, ZCRIAUTI ! Used for Gaussian PDF integration REAL :: ZLVS ! thermodynamics REAL, DIMENSION(KIU) :: ZPV, ZPIV, ZQSL, ZQSI ! thermodynamics -REAL :: ZLL, DZZ, ZZZ ! used for length scales +REAL :: ZLL, DZZ, ZZZ ! used for length scales REAL :: ZAH, ZDRW, ZDTL, ZSIG_CONV ! related to computation of Sig_s REAL, DIMENSION(KIU) :: ZA, ZB, ZSBAR, ZSIGMA, ZQ1 ! related to computation of Sig_s REAL, DIMENSION(KIU) :: ZCOND @@ -168,10 +182,14 @@ REAL :: ZINC REAL :: ZRSP, ZRSW, ZRFRAC, ZRSDIF, ZRCOLD ! related to OCND2 ice cloud calulation : REAL, DIMENSION(KIU) :: ESATW_T -REAL :: ZDUM1,ZDUM2,ZDUM3,ZDUM4,ZPRIFACT -REAL, DIMENSION(KIU,KJU,KKU) :: TCLD -REAL :: ZDZ(KIU), ZARDUM(KIU),ZCLDUM(KIU) +REAL :: ZDUM1,ZDUM2,ZDUM3,ZDUM4,ZPRIFACT,ZLWINC +REAL :: ZDZ(KIU), ZARDUM(KIU),ZARDUM2(KIE-KIB+1),ZCLDINI(KIB:KIE) ! end OCND2 + +! LHGT_QS: +REAL :: ZDZFACT,ZDZREF +! LHGT_QS END + REAL(KIND=JPRB) :: ZHOOK_HANDLE INTEGER, DIMENSION(KIU) :: IERR ! @@ -206,12 +224,20 @@ IKTE=KKU-JPVEXT PCLDFR(:,:,:) = 0. ! Initialize values PSIGRC(:,:,:) = 0. ! Initialize values ZPRIFACT = 1. ! Initialize value -ZCLDUM=-1. ! Initialize value +ZARDUM2 = 0. ! Initialize values +ZCLDINI = -1. ! Dummy Initialized cloud input to icecloud routine +PIFR = 10. ! ratio of cloud ice water mixing ratio wet to dry + ! part of a gridbox +ZDZREF = XFRMIN(25) ! Thickness for unchanged vqsigsat (only used for LHGT_QS) ! Init of the HALO (should be on HALO points only) #ifdef REPRO55 PRC_OUT = PRC_IN PRV_OUT = PRV_IN PRI_OUT = PRI_IN +PHLC_HRC = 0. +PHLC_HCF = 0. +PHLI_HRI = 0. +PHLI_HCF = 0. #endif IF(OCND2)ZPRIFACT = 0. ! @@ -317,8 +343,8 @@ DO JK=IKTB,IKTE ZDZ(KIB:KIE) = PZZ(KIB:KIE,JJ,JKP) - PZZ(KIB:KIE,JJ,JKP-KKL) CALL ICECLOUD(KIE-KIB+1,PPABS(KIB,JJ,JK),PZZ(KIB,JJ,JK),ZDZ(KIB), & & PT(KIB,JJ,JK),PRV_IN(KIB,JJ,JK),1.,-1., & - & ZCLDUM(KIB:KIE),1.,TCLD(KIB,JJ,JK), & - & ZARDUM(KIB:KIE),ZARDUM(KIB:KIE),ZARDUM(KIB:KIE),ZARDUM(KIB:KIE)) + & ZCLDINI,PIFR(KIB,JJ,JK),PICLDFR(KIB,JJ,JK), & + & PSSIO(KIB,JJ,JK),PSSIU(KIB,JJ,JK),ZARDUM2,ZARDUM) ! latent heats ! saturated water vapor mixing ratio over liquid water and ice DO JI=KIB,KIE @@ -365,9 +391,23 @@ DO JK=IKTB,IKTE IF ( OSIGMAS ) THEN DO JI=KIB,KIE IF (PSIGQSAT(JI,JJ)/=0.) THEN - ZSIGMA(JI) = SQRT((2*PSIGS(JI,JJ,JK))**2 + (PSIGQSAT(JI,JJ)*ZQSL(JI)*ZA(JI))**2) + ZDZFACT = 1. + IF(LHGT_QS .AND. JK+1 <= IKTE)THEN + ZDZFACT= MAX(XFRMIN(23),MIN(XFRMIN(24),(PZZ(JI,JJ,JK) - PZZ(JI,JJ,JK+1))/ZDZREF)) + ELSEIF(LHGT_QS)THEN + ZDZFACT= MAX(XFRMIN(23),MIN(XFRMIN(24),((PZZ(JI,JJ,JK-1) - PZZ(JI,JJ,JK)))*0.8/ZDZREF)) + ENDIF + IF (LSTATNW) THEN + ZSIGMA(JI) = SQRT((PSIGS(JI,JJ,JK))**2 + (PSIGQSAT(JI,JJ)*ZDZFACT*ZQSL(JI)*ZA(JI))**2) + ELSE + ZSIGMA(JI) = SQRT((2*PSIGS(JI,JJ,JK))**2 + (PSIGQSAT(JI,JJ)*ZQSL(JI)*ZA(JI))**2) + ENDIF ELSE - ZSIGMA(JI) = 2*PSIGS(JI,JJ,JK) + IF (LSTATNW) THEN + ZSIGMA(JI) = PSIGS(JI,JJ,JK) + ELSE + ZSIGMA(JI) = 2*PSIGS(JI,JJ,JK) + ENDIF END IF END DO ELSE @@ -497,34 +537,33 @@ DO JK=IKTB,IKTE ELSE DO JI=KIB,KIE PRC_OUT(JI,JJ,JK) = (1.-ZFRAC(JI)) * ZCOND(JI) ! liquid condensate + ZLWINC = PRC_OUT(JI,JJ,JK) - PRC_IN(JI,JJ,JK) ! ! This check is mainly for noise reduction : ! ------------------------- - IF(ABS(PRC_IN(JI,JJ,JK)-PRC_OUT(JI,JJ,JK))>1.0E-12 .AND. ESATW_T(JI) < PPABS(JI,JJ,JK)*0.5)THEN + IF(ABS(ZLWINC)>1.0E-12 .AND. ESATW(PT(JI,JJ,JK)) < PPABS(JI,JJ,JK)*0.5 )THEN ZRCOLD = PRC_OUT(JI,JJ,JK) - ZRFRAC = PRV_IN(JI,JJ,JK) - ZCOND(JI) + PRC_OUT(JI,JJ,JK) + ZRFRAC = PRV_IN(JI,JJ,JK) - ZLWINC IF( PRV_IN(JI,JJ,JK) < ZRSW )THEN ! sub - saturation over water: ! Avoid drying of cloudwater leading to supersaturation with ! respect to water ZRSDIF= MIN(0.,ZRSP-ZRFRAC) ELSE ! super - saturation over water: - ! Avoid depostition of water leading to sub-saturation with + ! Avoid deposition of water leading to sub-saturation with ! respect to water ! ZRSDIF= MAX(0.,ZRSP-ZRFRAC) - ZRSDIF= MAX(0.,ZRSP*PCLDFR(JI,JJ,JK) - ZRFRAC) + ZRSDIF= 0. ! t7 ENDIF PRC_OUT(JI,JJ,JK) = ZCOND(JI) - ZRSDIF ELSE ZRCOLD = PRC_IN(JI,JJ,JK) ENDIF - ! end check + ! end check ! compute separate ice cloud: - ZDUM1 = MIN(1.0,20.* PRC_OUT(JI,JJ,JK)*SQRT(ZDZ(JI))/ZQSL(JI)) ! clould liquid water - ! factor - - ZDUM3 = MAX(0.,TCLD(JI,JJ,JK)-PCLDFR(JI,JJ,JK)) ! pure ice cloud part - + PWCLDFR(JI,JJ,JK) = PCLDFR(JI,JJ,JK) + ZDUM1 = MIN(1.0,20.* PRC_OUT(JI,JJ,JK)*SQRT(ZDZ(JI))/ZQSL(JI)) ! cloud liquid water factor + ZDUM3 = MAX(0.,PICLDFR(JI,JJ,JK)-PWCLDFR(JI,JJ,JK)) ! pure ice cloud part IF (JK==IKTB) THEN ZDUM4 = PRI_IN(JI,JJ,JK) ELSE @@ -537,7 +576,7 @@ DO JK=IKTB,IKTE ZDUM2 = (0.8*PCLDFR(JI,JJ,JK)+0.2)*MIN(1.,ZDUM1 + ZDUM4*PCLDFR(JI,JJ,JK)) ! water cloud, use 'statistical' cloud, but reduce it in case of low liquid content - PCLDFR(JI,JJ,JK) = MIN(1., ZDUM2 + (0.9*ZDUM3+0.1)*ZDUM4) ! Rad cloud + PCLDFR(JI,JJ,JK) = MIN(1., ZDUM2 + (0.5*ZDUM3+0.5)*ZDUM4) ! Rad cloud ! Reduce ice cloud part in case of low ice water content PRI_OUT(JI,JJ,JK) = PRI_IN(JI,JJ,JK) PT(JI,JJ,JK) = PT(JI,JJ,JK) + ((PRC_OUT(JI,JJ,JK)-ZRCOLD)*ZLV(JI,JJ,JK) + & diff --git a/src/common/micro/ice_adjust.F90 b/src/common/micro/ice_adjust.F90 index d395b1493..1fcf3de24 100644 --- a/src/common/micro/ice_adjust.F90 +++ b/src/common/micro/ice_adjust.F90 @@ -5,16 +5,18 @@ !----------------------------------------------------------------- ! ########################################################################## SUBROUTINE ICE_ADJUST (KKA, KKU, KKL, KRR, HFRAC_ICE, HCONDENS, HLAMBDA3,& - HBUNAME, OSUBG_COND, OSIGMAS, OCND2, HSUBG_MF_PDF,& - PTSTEP, PSIGQSAT, & + HBUNAME, OSUBG_COND, OSIGMAS, OCND2, LHGT_QS, & + HSUBG_MF_PDF, PTSTEP, PSIGQSAT, & PRHODJ, PEXNREF, PRHODREF, PSIGS, PMFCONV, & PPABST, PZZ, & PEXN, PCF_MF, PRC_MF, PRI_MF, & + PICLDFR, PWCLDFR, PSSIO, PSSIU, PIFR, & PRV, PRC, PRVS, PRCS, PTH, PTHS, PSRCS, PCLDFR, & - PRR, PRI, PRIS, PRS, PRG, TBUDGETS, KBUDGETS, PRH,& + PRR, PRI, PRIS, PRS, PRG, TBUDGETS, KBUDGETS, & + PICE_CLD_WGT, & + PRH, & POUT_RV, POUT_RC, POUT_RI, POUT_TH, & - PHLC_HRC, PHLC_HCF, PHLI_HRI, PHLI_HCF, & - PICE_CLD_WGT) + PHLC_HRC, PHLC_HCF, PHLI_HRI, PHLI_HCF) ! ######################################################################### ! !!**** *ICE_ADJUST* - compute the ajustment of water vapor in mixed-phase @@ -95,6 +97,7 @@ !! or to call it on S variables !! 2016-11 S. Riette: all-or-nothing adjustment now uses condensation ! P. Wautelet 05/2016-04/2018: new data structures and calls for I/O +!! 2018-02 K.I.Ivarsson : More outputs for OCND2 option ! P. Wautelet 02/2020: use the new data structures and subroutines for budgets !! 2020-12 U. Andrae : Introduce SPP for HARMONIE-AROME !! R. El Khatib 24-Aug-2021 Optimizations @@ -124,23 +127,24 @@ IMPLICIT NONE !* 0.1 Declarations of dummy arguments : ! ! -INTEGER, INTENT(IN) :: KKA !near ground array index -INTEGER, INTENT(IN) :: KKU !uppest atmosphere array index -INTEGER, INTENT(IN) :: KKL !vert. levels type 1=MNH -1=ARO +INTEGER, INTENT(IN) :: KKA !near ground array index +INTEGER, INTENT(IN) :: KKU !uppest atmosphere array index +INTEGER, INTENT(IN) :: KKL !vert. levels type 1=MNH -1=ARO INTEGER, INTENT(IN) :: KRR ! Number of moist variables CHARACTER(LEN=1), INTENT(IN) :: HFRAC_ICE CHARACTER(LEN=80), INTENT(IN) :: HCONDENS CHARACTER(LEN=4), INTENT(IN) :: HLAMBDA3 ! formulation for lambda3 coeff CHARACTER(LEN=4), INTENT(IN) :: HBUNAME ! Name of the budget -LOGICAL, INTENT(IN) :: OSUBG_COND ! Switch for Subgrid +LOGICAL, INTENT(IN) :: OSUBG_COND ! Switch for Subgrid ! Condensation -LOGICAL :: OSIGMAS ! Switch for Sigma_s: +LOGICAL, INTENT(IN) :: OSIGMAS ! Switch for Sigma_s: ! use values computed in CONDENSATION ! or that from turbulence scheme -LOGICAL :: OCND2 ! logical switch to sparate liquid +LOGICAL, INTENT(IN) :: OCND2 ! logical switch to separate liquid ! and ice - ! more rigid (DEFALT value : .FALSE.) -CHARACTER(LEN=80), INTENT(IN) :: HSUBG_MF_PDF + ! more rigid (DEFAULT value : .FALSE.) +LOGICAL, INTENT(IN) :: LHGT_QS ! logical switch for height dependent VQSIGSAT +CHARACTER(LEN=80), INTENT(IN) :: HSUBG_MF_PDF REAL, INTENT(IN) :: PTSTEP ! Double Time step ! (single if cold start) REAL, DIMENSION(:,:), INTENT(IN) :: PSIGQSAT ! coeff applied to qsat variance contribution @@ -151,16 +155,16 @@ REAL, DIMENSION(:,:,:), CONTIGUOUS, INTENT(IN) :: PRHODREF ! REAL, DIMENSION(:,:,:), CONTIGUOUS, INTENT(IN) :: PSIGS ! Sigma_s at time t REAL, DIMENSION(:,:,:), CONTIGUOUS, INTENT(IN) :: PMFCONV ! convective mass flux -REAL, DIMENSION(:,:,:), CONTIGUOUS, INTENT(IN) :: PPABST ! Absolute Pressure at t +REAL, DIMENSION(:,:,:), CONTIGUOUS, INTENT(IN) :: PPABST ! Absolute Pressure at t REAL, DIMENSION(:,:,:), CONTIGUOUS, INTENT(IN) :: PZZ ! height of model layer REAL, DIMENSION(:,:,:), CONTIGUOUS, INTENT(IN) :: PEXN ! Exner function ! -REAL, DIMENSION(:,:,:), CONTIGUOUS, INTENT(IN) :: PCF_MF! Convective Mass Flux Cloud fraction -REAL, DIMENSION(:,:,:), CONTIGUOUS, INTENT(IN) :: PRC_MF! Convective Mass Flux liquid mixing ratio -REAL, DIMENSION(:,:,:), CONTIGUOUS, INTENT(IN) :: PRI_MF! Convective Mass Flux ice mixing ratio +REAL, DIMENSION(:,:,:), CONTIGUOUS, INTENT(IN) :: PCF_MF ! Convective Mass Flux Cloud fraction +REAL, DIMENSION(:,:,:), CONTIGUOUS, INTENT(IN) :: PRC_MF ! Convective Mass Flux liquid mixing ratio +REAL, DIMENSION(:,:,:), CONTIGUOUS, INTENT(IN) :: PRI_MF ! Convective Mass Flux ice mixing ratio ! -REAL, DIMENSION(:,:,:), CONTIGUOUS, INTENT(IN) :: PRV ! Water vapor m.r. to adjust -REAL, DIMENSION(:,:,:), CONTIGUOUS, INTENT(IN) :: PRC ! Cloud water m.r. to adjust +REAL, DIMENSION(:,:,:), CONTIGUOUS, INTENT(IN) :: PRV ! Water vapor m.r. to adjust +REAL, DIMENSION(:,:,:), CONTIGUOUS, INTENT(IN) :: PRC ! Cloud water m.r. to adjust REAL, DIMENSION(:,:,:), CONTIGUOUS, INTENT(INOUT) :: PRVS ! Water vapor m.r. source REAL, DIMENSION(:,:,:), CONTIGUOUS, INTENT(INOUT) :: PRCS ! Cloud water m.r. source REAL, DIMENSION(:,:,:), CONTIGUOUS, INTENT(IN) :: PTH ! Theta to adjust @@ -168,13 +172,23 @@ REAL, DIMENSION(:,:,:), CONTIGUOUS, INTENT(INOUT) :: PTHS ! Theta source REAL, DIMENSION(:,:,:), CONTIGUOUS, INTENT(OUT) :: PSRCS ! Second-order flux ! s'rc'/2Sigma_s2 at time t+1 ! multiplied by Lambda_3 -REAL, DIMENSION(:,:,:), CONTIGUOUS, INTENT(OUT) :: PCLDFR ! Cloud fraction -! -REAL, DIMENSION(:,:,:), CONTIGUOUS, INTENT(INOUT):: PRIS ! Cloud ice m.r. at t+1 -REAL, DIMENSION(:,:,:), CONTIGUOUS, INTENT(IN) :: PRR ! Rain water m.r. to adjust -REAL, DIMENSION(:,:,:), CONTIGUOUS, INTENT(IN) :: PRI ! Cloud ice m.r. to adjust -REAL, DIMENSION(:,:,:), CONTIGUOUS, INTENT(IN) :: PRS ! Aggregate m.r. to adjust -REAL, DIMENSION(:,:,:), CONTIGUOUS, INTENT(IN) :: PRG ! Graupel m.r. to adjust +REAL, DIMENSION(:,:,:), CONTIGUOUS, INTENT(OUT) :: PCLDFR ! Cloud fraction +REAL, DIMENSION(:,:,:), CONTIGUOUS, INTENT(OUT) :: PICLDFR ! ice cloud fraction +REAL, DIMENSION(:,:,:), CONTIGUOUS, INTENT(OUT) :: PWCLDFR ! water or mixed-phase cloud fraction +REAL, DIMENSION(:,:,:), CONTIGUOUS, INTENT(OUT) :: PSSIO ! Super-saturation with respect to ice in the + ! supersaturated fraction +REAL, DIMENSION(:,:,:), CONTIGUOUS, INTENT(OUT) :: PSSIU ! Sub-saturation with respect to ice in the + ! subsaturated fraction +REAL, DIMENSION(:,:,:), CONTIGUOUS, INTENT(OUT) :: PIFR ! Ratio cloud ice moist part to dry part +! +REAL, DIMENSION(:,:,:), CONTIGUOUS, INTENT(INOUT) :: PRIS ! Cloud ice m.r. at t+1 +REAL, DIMENSION(:,:,:), CONTIGUOUS, INTENT(IN) :: PRR ! Rain water m.r. to adjust +REAL, DIMENSION(:,:,:), CONTIGUOUS, INTENT(IN) :: PRI ! Cloud ice m.r. to adjust +REAL, DIMENSION(:,:,:), CONTIGUOUS, INTENT(IN) :: PRS ! Aggregate m.r. to adjust +REAL, DIMENSION(:,:,:), CONTIGUOUS, INTENT(IN) :: PRG ! Graupel m.r. to adjust +TYPE(TBUDGETDATA), DIMENSION(KBUDGETS), INTENT(INOUT) :: TBUDGETS +INTEGER, INTENT(IN) :: KBUDGETS +REAL, DIMENSION(:,:), CONTIGUOUS, OPTIONAL, INTENT(IN) :: PICE_CLD_WGT REAL, DIMENSION(:,:,:), CONTIGUOUS, OPTIONAL, INTENT(IN) :: PRH ! Hail m.r. to adjust REAL, DIMENSION(:,:,:), CONTIGUOUS, OPTIONAL, INTENT(OUT) :: POUT_RV ! Adjusted value REAL, DIMENSION(:,:,:), CONTIGUOUS, OPTIONAL, INTENT(OUT) :: POUT_RC ! Adjusted value @@ -184,9 +198,6 @@ REAL, DIMENSION(:,:,:), CONTIGUOUS, OPTIONAL, INTENT(OUT) :: PHLC_HRC REAL, DIMENSION(:,:,:), CONTIGUOUS, OPTIONAL, INTENT(OUT) :: PHLC_HCF REAL, DIMENSION(:,:,:), CONTIGUOUS, OPTIONAL, INTENT(OUT) :: PHLI_HRI REAL, DIMENSION(:,:,:), CONTIGUOUS, OPTIONAL, INTENT(OUT) :: PHLI_HCF -TYPE(TBUDGETDATA), DIMENSION(KBUDGETS), INTENT(INOUT) :: TBUDGETS -INTEGER, INTENT(IN) :: KBUDGETS -REAL, DIMENSION(:,:), CONTIGUOUS, OPTIONAL, INTENT(IN) :: PICE_CLD_WGT ! !* 0.2 Declarations of local variables : ! @@ -471,8 +482,8 @@ IF ( OSUBG_COND ) THEN HFRAC_ICE, HCONDENS, HLAMBDA3, & PPABST, PZZ, PRHODREF, ZT, PRV_IN, PRV_OUT, PRC_IN, PRC_OUT, PRI_IN, PRI_OUT, & PRR, PRS, PRG, PSIGS, PMFCONV, PCLDFR, & - PSRCS, .TRUE., OSIGMAS, & - OCND2, PSIGQSAT, & + PSRCS, .TRUE., OSIGMAS, OCND2, LHGT_QS, & + PICLDFR, PWCLDFR, PSSIO, PSSIU, PIFR, PSIGQSAT, & PLV=ZLV, PLS=ZLS, PCPH=ZCPH, & PHLC_HRC=PHLC_HRC, PHLC_HCF=PHLC_HCF, PHLI_HRI=PHLI_HRI, PHLI_HCF=PHLI_HCF,& PICE_CLD_WGT=PICE_CLD_WGT) @@ -489,9 +500,9 @@ ELSE CALL CONDENSATION(IIU, IJU, IKU, IIB, IIE, IJB, IJE, IKB, IKE, KKL, & HFRAC_ICE, HCONDENS, HLAMBDA3, & PPABST, PZZ, PRHODREF, ZT, PRV_IN, PRV_OUT, PRC_IN, PRC_OUT, PRI_IN, PRI_OUT, & - PRR, PRS, PRG, ZSIGS, PMFCONV, PCLDFR, & - ZSRCS, .TRUE., OSIGMAS=.TRUE., & - OCND2=OCND2, PSIGQSAT=ZSIGQSAT, & + PRR, PRS, PRG, ZSIGS, PMFCONV, PCLDFR, & + ZSRCS, .TRUE., .TRUE., OCND2, LHGT_QS, & + PICLDFR, PWCLDFR, PSSIO, PSSIU, PIFR, ZSIGQSAT, & PLV=ZLV, PLS=ZLS, PCPH=ZCPH, & PHLC_HRC=PHLC_HRC, PHLC_HCF=PHLC_HCF, PHLI_HRI=PHLI_HRI, PHLI_HCF=PHLI_HCF,& PICE_CLD_WGT=PICE_CLD_WGT) diff --git a/src/common/micro/ini_rain_ice.F90 b/src/common/micro/ini_rain_ice.F90 index 85eb2f093..4929d778a 100644 --- a/src/common/micro/ini_rain_ice.F90 +++ b/src/common/micro/ini_rain_ice.F90 @@ -368,7 +368,7 @@ XLBDAS_MAX = 100000.0 XLBDAG_MAX = 100000.0 ! ZCONC_MAX = 1.E6 ! Maximal concentration for falling particules set to 1 per cc -XLBDAS_MAX = ( ZCONC_MAX/XCCS )**(1./XCXS) +IF(XCCS>0. .AND. XCXS>0. )XLBDAS_MAX = ( ZCONC_MAX/XCCS )**(1./XCXS) ! IF (HCLOUD == 'ICE4') THEN ALLOCATE( XRTMIN(7) ) @@ -514,16 +514,26 @@ X0DEPS = (4.0*XPI)*XCCS*XC1S*XF0S*MOMG(XALPHAS,XNUS,1.) X1DEPS = (4.0*XPI)*XCCS*XC1S*XF1S*SQRT(XCS)*MOMG(XALPHAS,XNUS,0.5*XDS+1.5) XEX0DEPS = XCXS-1.0 XEX1DEPS = XCXS-0.5*(XDS+3.0) +XRDEPSRED = 1.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) +XRDEPGRED = 1.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) + +GFLAG = .TRUE. +IF (GFLAG) THEN + WRITE(UNIT=KLUOUT,FMT='(" factors sublimation snow/groupel")') + WRITE(UNIT=KLUOUT,FMT='(" mod sublim snow =",E13.6)') XRDEPSRED + WRITE(UNIT=KLUOUT,FMT='(" mod sublim graupel =",E13.6)') XRDEPGRED +END IF + ! !* 5.3 Constants for pristine ice autoconversion ! @@ -1016,6 +1026,20 @@ IF( (KDRYLBDAG/=NDRYLBDAG) .OR. (KDRYLBDAR/=NDRYLBDAR) .OR. (KND/=IND) .OR. & PFDINFTY,XKER_RDRYG ) WRITE(UNIT=KLUOUT,FMT='(" Read XKER_RDRYG")') END IF + +! 8.2.6 Constants for possible modifying some processes related to +! graupeln in XFRMIN(1:8), IN - concentration in XFRMIN(9) and Kogan +! autoconversion in XFRMIN(10:11). May be used for e.g. ensemble spread + XFRMIN(1:6)=0. + XFRMIN(7:9)=1. + XFRMIN(10) =10. + XFRMIN(11) =1. + XFRMIN(12) =100. + XFRMIN(13) =1.0E-15 + XFRMIN(14) =120. + XFRMIN(15) =1.0E-4 + XFRMIN(16:20)=0. + XFRMIN(21)=1. ! ! !------------------------------------------------------------------------------- diff --git a/src/common/micro/ini_snow.F90 b/src/common/micro/ini_snow.F90 new file mode 100644 index 000000000..b1d284f63 --- /dev/null +++ b/src/common/micro/ini_snow.F90 @@ -0,0 +1,170 @@ +! ######spl + SUBROUTINE INI_SNOW ( KLUOUT ) + USE PARKIND1, ONLY : JPRB + USE YOMHOOK , ONLY : LHOOK, DR_HOOK +! ########################################################### +! +!!**** *INI_SNOW * - re-initialize the constants based on snow-size distubutio +!! cold microphysical schemes. +!! +!! PURPOSE +!! ------- +!! The purpose of this routine is to reinitialize the constants for snow used to +!! resolve the mixed phase microphysical scheme. +!! EXTERNAL +!! -------- +!! GAMMA : gamma function +!! +!! +!! IMPLICIT ARGUMENTS +!! ------------------ +!! Module MODD_CST +!! XPI ! +!! XP00 ! Reference pressure +!! XRD ! Gaz constant for dry air +!! XRHOLW ! Liquid water density +!! Module MODD_REF +!! XTHVREFZ ! Reference virtual pot.temp. without orography +!! Module MODD_PARAMETERS +!! JPVEXT ! +!! Module MODD_RAIN_ICE_DESCR +!! Module MODD_RAIN_ICE_PARAM +!! +!! REFERENCE +!! --------- +!! Book2 of documentation ( routine INI_RAIN_ICE ) +!! +!! ORIGINAL AUTHOR (from ini_rain_ice) +!! -------------- +!! J.-P. Pinty * Laboratoire d'Aerologie* +!! +!! MODIFICATIONS +!! ------------- +!! 2018-02 +!! Karl-Ivar Ivarsson +!* 0. DECLARATIONS +! ------------ +! +USE MODD_CST +USE MODD_LUNIT +USE MODD_PARAMETERS +USE MODD_PARAM_ICE +USE MODD_RAIN_ICE_DESCR +USE MODD_RAIN_ICE_PARAM +USE MODD_REF +! +USE MODI_GAMMA +USE MODI_GAMMA_INC +USE MODE_RRCOLSS +USE MODE_RZCOLX +USE MODE_RSCOLRG +USE MODE_READ_XKER_RACCS +USE MODE_READ_XKER_SDRYG +USE MODE_READ_XKER_RDRYG +USE MODE_READ_XKER_SWETH +USE MODE_READ_XKER_GWETH + + +IMPLICIT NONE +! +!* 0.1 Declarations of dummy arguments : +! +! +INTEGER, INTENT(IN) :: KLUOUT ! Logical unit number for prints + +!* 0.2 Declarations of local variables : +! +INTEGER :: IKB ! Coordinates of the first physical + ! points along z + +REAL :: ZRHO00 ! Surface reference air density + +REAL :: ZCONC_MAX ! Maximal concentration for snow + + +REAL(KIND=JPRB) :: ZHOOK_HANDLE +IF (LHOOK) CALL DR_HOOK('INI_RAIN_ICE',0,ZHOOK_HANDLE) + + +XCCS = XFRMIN(16) +XCXS = XFRMIN(17) +IKB = 1 + JPVEXT +ZRHO00 = XP00/(XRD*XTHVREFZ(IKB)) +! recalculate ini_rain_ice stuff: + +! 3.4 Constants for shape parameter +XLBEXS = 1.0/(XCXS-XBS) +XLBS = ( XAS*XCCS*MOMG(XALPHAS,XNUS,XBS) )**(-XLBEXS) +ZCONC_MAX = 1.E6 ! Maximal concentration for falling particules set to 1 per cc +IF(XCCS>0. .AND. XCXS>0. )XLBDAS_MAX = ( ZCONC_MAX/XCCS )**(1./XCXS) + +! 4.2 Constants for sedimentation +XEXSEDS = (XBS+XDS-XCXS)/(XBS-XCXS) + +XFSEDS = XCS*XAS*XCCS*MOMG(XALPHAS,XNUS,XBS+XDS)* & + (XAS*XCCS*MOMG(XALPHAS,XNUS,XBS))**(-XEXSEDS)*(ZRHO00)**XCEXVT + +! 5.2 Constants for vapor deposition on ice +X0DEPS = (4.0*XPI)*XCCS*XC1S*XF0S*MOMG(XALPHAS,XNUS,1.) +X1DEPS = (4.0*XPI)*XCCS*XC1S*XF1S*SQRT(XCS)*MOMG(XALPHAS,XNUS,0.5*XDS+1.5) +XEX0DEPS = XCXS-1.0 +XEX1DEPS = XCXS-0.5*(XDS+3.0) + +! 5.4 Constants for snow aggregation +XFIAGGS = (XPI/4.0)*XCOLIS*XCCS*XCS*(ZRHO00**XCEXVT)*MOMG(XALPHAS,XNUS,XDS+2.0) +XEXIAGGS = XCXS-XDS-2.0 + +! 7.1 Constants for the riming of the aggregates +XEXCRIMSS= XCXS-XDS-2.0 +XCRIMSS = (XPI/4.0)*XCOLCS*XCCS*XCS*(ZRHO00**XCEXVT)*MOMG(XALPHAS,XNUS,XDS+2.0) +XEXCRIMSG= XEXCRIMSS +XCRIMSG = XCRIMSS +XSRIMCG = XCCS*XAS*MOMG(XALPHAS,XNUS,XBS) +XEXSRIMCG= XCXS-XBS + +! 7.2 Constants for the accretion of raindrops onto aggregates + +XFRACCSS = ((XPI**2)/24.0)*XCCS*XCCR*XRHOLW*(ZRHO00**XCEXVT) + +XFSACCRG = (XPI/4.0)*XAS*XCCS*XCCR*(ZRHO00**XCEXVT) + +! 8.2.3 Constants for the aggregate collection by the graupeln +XFSDRYG = (XPI/4.0)*XCOLSG*XCCG*XCCS*XAS*(ZRHO00**XCEXVT) + +! 9.2.2 Constants for the aggregate collection by the hailstones +XFSWETH = (XPI/4.0)*XCCH*XCCS*XAS*(ZRHO00**XCEXVT) + +WRITE(UNIT=KLUOUT,FMT='(" updated snow concentration:C=",E13.6," x=",E13.6)') & + XCCS,XCXS + +IF (LHOOK) CALL DR_HOOK('INI_SNOW',1,ZHOOK_HANDLE) + +CONTAINS +! +!------------------------------------------------------------------------------ +! + FUNCTION MOMG(PALPHA,PNU,PP) RESULT (PMOMG) +! +! auxiliary routine used to compute the Pth moment order of the generalized +! gamma law +! + USE MODI_GAMMA +! + IMPLICIT NONE +! + REAL :: PALPHA ! first shape parameter of the dimensionnal distribution + REAL :: PNU ! second shape parameter of the dimensionnal distribution + REAL :: PP ! order of the moment + REAL :: PMOMG ! result: moment of order ZP +! +!------------------------------------------------------------------------------ +! +! + PMOMG = GAMMA(PNU+PP/PALPHA)/GAMMA(PNU) +! + END FUNCTION MOMG +! +!------------------------------------------------------------------------------- +! +! +END SUBROUTINE INI_SNOW diff --git a/src/common/micro/ini_tiwmx.F90 b/src/common/micro/ini_tiwmx.F90 new file mode 100644 index 000000000..2e3209a38 --- /dev/null +++ b/src/common/micro/ini_tiwmx.F90 @@ -0,0 +1,55 @@ +SUBROUTINE INI_TIWMX + USE PARKIND1, ONLY : JPRB + USE MODD_CST, ONLY : XALPW,XBETAW,XGAMW,XALPI,XBETAI,XGAMI, & + & XTT,XRV,XLVTT,XLSTT +! Include function definitions + USE MODE_TIWMX_FUN, ONLY : ESATW,DESDTW,ESATI,DESDTI,AA2,AA2W,AM3,AF3,BB3,BB3W,REDIN +! Only the tables, _NOT_ the functions! + USE MODE_TIWMX, ONLY : XNDEGR,NSTART,NSTOP,ESTABW,DESTABW,ESTABI,DESTABI, & + & A2TAB,BB3TAB,AM3TAB,AF3TAB,A2WTAB,BB3WTAB,REDINTAB + USE YOMHOOK, ONLY : LHOOK, DR_HOOK + IMPLICIT NONE + + INTEGER :: JK + REAL :: ZTEMP + + REAL(KIND=JPRB) :: ZHOOK_HANDLE + + IF (LHOOK) CALL DR_HOOK('INI_TIWMX',0,ZHOOK_HANDLE) + + DO JK=NSTART,NSTOP + ZTEMP = REAL(JK)/XNDEGR + + ESTABW(JK) = ESATW(ZTEMP) + DESTABW(JK) = DESDTW(ZTEMP) + + ESTABI(JK) = ESATI(ZTEMP) + DESTABI(JK) = DESDTI(ZTEMP) + +! Functions for ice crystals or water droplets: + A2TAB(JK) = AA2(ZTEMP) + A2WTAB(JK) = AA2W(ZTEMP) + AM3TAB(JK) = AM3(ZTEMP) + AF3TAB(JK) = AF3(ZTEMP) + BB3TAB(JK) = BB3(ZTEMP) + BB3WTAB(JK) = BB3W(ZTEMP) + REDINTAB(JK) = REDIN(ZTEMP) + + IF (ZTEMP.GT.273.15) THEN +! Avoid ice calculation above freezing level: + ESTABI(JK) = ESATW(ZTEMP) + DESTABI(JK) = DESDTW(ZTEMP) + +! Functions for ice crystal growth: + A2TAB(JK) = AA2(ZTEMP) + A2WTAB(JK) = AA2W(ZTEMP) + AM3TAB(JK) = 0. + AF3TAB(JK) = 0. + BB3TAB(JK) = BB3(ZTEMP) + BB3WTAB(JK) = BB3W(ZTEMP) + ENDIF + END DO + + IF (LHOOK) CALL DR_HOOK('INI_TIWMX',1,ZHOOK_HANDLE) + +END SUBROUTINE INI_TIWMX diff --git a/src/common/micro/modd_rain_ice_param.F90 b/src/common/micro/modd_rain_ice_param.F90 index 7568e2a68..8fdcd71e8 100644 --- a/src/common/micro/modd_rain_ice_param.F90 +++ b/src/common/micro/modd_rain_ice_param.F90 @@ -57,7 +57,9 @@ REAL,SAVE :: XSCFAC, & ! Constants for raindrop X0EVAR,X1EVAR,XEX0EVAR,XEX1EVAR, & ! evaporation: EVA and for X0DEPI,X2DEPI, & ! deposition : DEP on I, X0DEPS,X1DEPS,XEX0DEPS,XEX1DEPS, & ! on S and - X0DEPG,X1DEPG,XEX0DEPG,XEX1DEPG ! on G + XRDEPSRED,& + X0DEPG,X1DEPG,XEX0DEPG,XEX1DEPG, & ! on G + XRDEPGRED ! REAL,SAVE :: XTIMAUTI,XTEXAUTI,XCRIAUTI, & ! Constants for pristine ice XT0CRIAUTI,XACRIAUTI,XBCRIAUTI ! autoconversion : AUT @@ -181,5 +183,6 @@ REAL,DIMENSION(:,:), SAVE, ALLOCATABLE & :: XKER_SWETH, & ! Normalized kernel for SWETH XKER_GWETH, & ! Normalized kernel for GWETH XKER_RWETH ! Normalized kernel for RWETH +REAL,SAVE :: XFRMIN(40) ! Parmeters to modify melt and growth of graupels etc. ! END MODULE MODD_RAIN_ICE_PARAM diff --git a/src/common/micro/mode_icecloud.F90 b/src/common/micro/mode_icecloud.F90 index 774dd6887..e53841902 100644 --- a/src/common/micro/mode_icecloud.F90 +++ b/src/common/micro/mode_icecloud.F90 @@ -11,8 +11,7 @@ SUBROUTINE ICECLOUD & USE YOMHOOK , ONLY : LHOOK, DR_HOOK USE MODD_CST,ONLY : XCPD,XCPV,XLVTT,XLSTT,XG,XRD,XEPSILO USE MODE_TIWMX, ONLY: ESATW, ESATI - USE MODE_QSATMX_TAB -! USE MODI_TIWMX + USE MODE_QSATMX_TAB, ONLY: QSATMX_TAB IMPLICIT NONE !----------------------------------------------------------------------- ! @@ -77,15 +76,12 @@ REAL :: ZSIGMAX,ZSIGMAY,ZSIGMAZ,ZXDIST,ZYDIST,& & ZRHDIF,ZWCLD,ZI2W,ZRHLIMICE,ZRHLIMINV,ZA,ZRHI,ZR INTEGER :: JK -! External function -!REAL :: QSATMX_TAB - REAL(KIND=JPRB) :: ZHOOK_HANDLE IF (LHOOK) CALL DR_HOOK('ICECLOUD',0,ZHOOK_HANDLE) ZSIGMAX=3.E-4 ! assumed rh variation in x axis direction ZSIGMAY=ZSIGMAX ! assumed rh variation in y axis direction -ZSIGMAZ=1.6E-2 ! t5 +ZSIGMAZ=1.E-2 !ZXDIST=DTHETA*110000. ZXDIST=2500. diff --git a/src/common/micro/mode_tiwmx_fun.F90 b/src/common/micro/mode_tiwmx_fun.F90 new file mode 100644 index 000000000..7a708b859 --- /dev/null +++ b/src/common/micro/mode_tiwmx_fun.F90 @@ -0,0 +1,108 @@ +!@no_insert_drhook +! ######spl + MODULE MODE_TIWMX_FUN +! ############### +! +!!**** *MODD_TIWMX_FUN* - +!! +!! PURPOSE +!! ------- +! The purpose of this ... +! +!! +!! REFERENCE +!! --------- +!! Book2 of documentation of Meso-NH (ha ha) +!! +!! AUTHOR +!! ------ +!! K. I. Ivarsson *SMHI* +!! +!! MODIFICATIONS +!! ------------- +!! Original 20/11/14 +!------------------------------------------------------------------------------- +! +!* 0. DECLARATIONS +! ------------ +! +USE MODD_CST, ONLY : XALPW,XBETAW,XGAMW,XTT,XALPI,XBETAI,XGAMI,XLSTT,XRV,XLVTT,& + &XLSTT,XP00,XCPV,XCI,XCL + +IMPLICIT NONE + +CONTAINS +! + REAL FUNCTION ESATW(TT) + REAL,INTENT(IN) :: TT + ESATW = EXP( XALPW - XBETAW/TT - XGAMW*ALOG(TT) ) + END FUNCTION ESATW +! +! pure saturation pressure over ice for tt <0 C, +! esatw otherwise. +! + REAL FUNCTION ESATI(TT) + REAL,INTENT(IN) :: TT + ESATI = ( 0.5 + SIGN(0.5,TT-XTT) )*EXP( XALPW - XBETAW/TT - XGAMW*ALOG(TT) ) - & + & ( SIGN(0.5,TT-XTT) - 0.5)*EXP( XALPI - XBETAI/TT - XGAMI*ALOG(TT) ) + END FUNCTION ESATI +! +! pure saturation pressure over water + REAL FUNCTION DESDTW(TT) + REAL,INTENT(IN) :: TT + DESDTW = ESATW(TT)*(XBETAW/TT - XGAMW)/TT + END FUNCTION DESDTW + + REAL FUNCTION DESDTI(TT) + REAL,INTENT(IN) :: TT + DESDTI = ( 0.5 + SIGN(0.5,TT-XTT) )*DESDTW(TT) - & + & ( SIGN(0.5,TT-XTT) - 0.5)*ESATI(TT)*(XBETAI/TT - XGAMI)/TT + END FUNCTION DESDTI + +! Ice crystal function: + REAL FUNCTION AA2(TT) + REAL,INTENT(IN) :: TT + AA2 = ( XLSTT + (XCPV-XCI)*(TT-XTT) )**2 / & + & (2.38E-2 + 0.0071E-2 *(TT - XTT))/(TT**2*XRV) + END FUNCTION AA2 + +! Water droplet function: + REAL FUNCTION AA2W(TT) + REAL,INTENT(IN) :: TT + AA2W = ( (XLVTT+ (XCPV-XCL)*(TT-XTT))**2)/ & + & (2.38E-2 + 0.0071E-2 *(TT - XTT))/(TT**2*XRV) + END FUNCTION AA2W + +! Ice crystal function: + REAL FUNCTION BB3(TT) + REAL,INTENT(IN) :: TT + BB3 = XRV/(0.211E-4 * (TT/XTT)**1.94 * XP00)*TT/ESATI(TT) + END FUNCTION BB3 + +! Water droplet function: + REAL FUNCTION BB3W(TT) + REAL,INTENT(IN) :: TT + BB3W = XRV/(0.211E-4 * (TT/XTT)**1.94 * XP00)*TT/ESATW(TT) + END FUNCTION BB3W + +! Meyers IN concentration function: + REAL FUNCTION AM3(TT) + REAL,INTENT(IN) :: TT + AM3 = 1000.*EXP(12.96*(ESATW(TT)/ESATI(TT) -1.) -0.639) + END FUNCTION AM3 + +! Fletchers IN concentration function: + REAL FUNCTION AF3(TT) + REAL,INTENT(IN) :: TT + AF3 = 0.01*EXP(0.6*(XTT-TT)) + END FUNCTION AF3 + +! Function for IN concentration reduction between 0 and -20 C: + REAL FUNCTION REDIN(TT) + REAL,INTENT(IN) :: TT + REAL ZZT + ZZT = MAX(0., MIN(1.,(XTT - TT)/20.)) + REDIN = 1.- (1.-ZZT)/(ZZT**3 + (1.-ZZT)**3)**.333 + END FUNCTION REDIN + +END MODULE MODE_TIWMX_FUN diff --git a/src/common/micro/modi_condensation.F90 b/src/common/micro/modi_condensation.F90 index 32d53731b..790f62fe5 100644 --- a/src/common/micro/modi_condensation.F90 +++ b/src/common/micro/modi_condensation.F90 @@ -7,10 +7,12 @@ INTERFACE SUBROUTINE CONDENSATION( KIU, KJU, KKU, KIB, KIE, KJB, KJE, KKB, KKE, KKL,& HFRAC_ICE, HCONDENS, HLAMBDA3, & PPABS, PZZ, PRHODREF, PT, PRV_IN, PRV_OUT, PRC_IN, PRC_OUT, PRI_IN, PRI_OUT, & - PRR, PRS, PRG, PSIGS, PMFCONV, PCLDFR, PSIGRC, OUSERI,& - OSIGMAS, OCND2, PSIGQSAT, & + PRR, PRS, PRG, PSIGS, PMFCONV, PCLDFR, & + PSIGRC, OUSERI, OSIGMAS, OCND2, LHGT_QS, & + PICLDFR, PWCLDFR, PSSIO, PSSIU, PIFR, PSIGQSAT, & PLV, PLS, PCPH, & - PHLC_HRC, PHLC_HCF, PHLI_HRI, PHLI_HCF, PICE_CLD_WGT) + PHLC_HRC, PHLC_HCF, PHLI_HRI, PHLI_HCF, & + PICE_CLD_WGT) ! ! INTEGER, INTENT(IN) :: KIU ! horizontal dimension in x @@ -32,15 +34,6 @@ REAL, DIMENSION(KIU,KJU,KKU), INTENT(IN) :: PRHODREF REAL, DIMENSION(KIU,KJU,KKU), INTENT(INOUT) :: PT ! grid scale T (K) REAL, DIMENSION(KIU,KJU,KKU), INTENT(IN) :: PRV_IN ! grid scale water vapor mixing ratio (kg/kg) in input REAL, DIMENSION(KIU,KJU,KKU), INTENT(OUT) :: PRV_OUT! grid scale water vapor mixing ratio (kg/kg) in output -LOGICAL, INTENT(IN) :: OUSERI ! logical switch to compute both - ! liquid and solid condensate (OUSERI=.TRUE.) - ! or only solid condensate (OUSERI=.FALSE.) -LOGICAL, INTENT(IN) :: OSIGMAS! use present global Sigma_s values - ! or that from turbulence scheme -LOGICAL, INTENT(IN) :: OCND2 ! logical switch to sparate liquid and ice - ! more rigid (DEFALT value : .FALSE.) -REAL, DIMENSION(KIU,KJU), INTENT(IN) :: PSIGQSAT ! use an extra "qsat" variance contribution (OSIGMAS case) - ! multiplied by PSIGQSAT REAL, DIMENSION(KIU,KJU,KKU), INTENT(IN) :: PRC_IN ! grid scale r_c mixing ratio (kg/kg) in input REAL, DIMENSION(KIU,KJU,KKU), INTENT(OUT) :: PRC_OUT! grid scale r_c mixing ratio (kg/kg) in output REAL, DIMENSION(KIU,KJU,KKU), INTENT(IN) :: PRI_IN ! grid scale r_i (kg/kg) in input @@ -53,6 +46,24 @@ REAL, DIMENSION(:,:,:), INTENT(IN) :: PMFCONV! convective mass flux (kg REAL, DIMENSION(KIU,KJU,KKU), INTENT(OUT) :: PCLDFR ! cloud fraction REAL, DIMENSION(KIU,KJU,KKU), INTENT(OUT) :: PSIGRC ! s r_c / sig_s^2 +LOGICAL, INTENT(IN) :: OUSERI ! logical switch to compute both + ! liquid and solid condensate (OUSERI=.TRUE.) + ! or only solid condensate (OUSERI=.FALSE.) +LOGICAL, INTENT(IN) :: OSIGMAS! use present global Sigma_s values + ! or that from turbulence scheme +LOGICAL, INTENT(IN) :: OCND2 ! logical switch to sparate liquid and ice + ! more rigid (DEFAULT value : .FALSE.) +LOGICAL, INTENT(IN) :: LHGT_QS! logical switch for height dependent VQSIGSAT +REAL, DIMENSION(KIU,KJU,KKU), INTENT(OUT) :: PICLDFR! ice cloud fraction +REAL, DIMENSION(KIU,KJU,KKU), INTENT(OUT) :: PWCLDFR! water or mixed-phase cloud fraction +REAL, DIMENSION(KIU,KJU,KKU), INTENT(OUT) :: PSSIO ! Super-saturation with respect to ice in the + ! supersaturated fraction +REAL, DIMENSION(KIU,KJU,KKU), INTENT(OUT) :: PSSIU ! Sub-saturation with respect to ice in the + ! subsaturated fraction +REAL, DIMENSION(KIU,KJU,KKU), INTENT(OUT) :: PIFR ! Ratio cloud ice moist part +REAL, DIMENSION(KIU,KJU), INTENT(IN) :: PSIGQSAT ! use an extra "qsat" variance contribution (OSIGMAS case) + ! multiplied by PSIGQSAT + REAL, DIMENSION(KIU,KJU,KKU), OPTIONAL, INTENT(IN) :: PLV ! Latent heat L_v REAL, DIMENSION(KIU,KJU,KKU), OPTIONAL, INTENT(IN) :: PLS ! Latent heat L_s REAL, DIMENSION(KIU,KJU,KKU), OPTIONAL, INTENT(IN) :: PCPH ! Specific heat C_ph diff --git a/src/common/micro/modi_ice_adjust.F90 b/src/common/micro/modi_ice_adjust.F90 index 147a971cd..b955c8095 100644 --- a/src/common/micro/modi_ice_adjust.F90 +++ b/src/common/micro/modi_ice_adjust.F90 @@ -5,16 +5,19 @@ INTERFACE ! SUBROUTINE ICE_ADJUST (KKA, KKU, KKL, KRR, HFRAC_ICE, HCONDENS, HLAMBDA3,& - HBUNAME, OSUBG_COND, OSIGMAS, OCND2, HSUBG_MF_PDF,& - PTSTEP, PSIGQSAT, & + HBUNAME, OSUBG_COND, OSIGMAS, OCND2, LHGT_QS, & + HSUBG_MF_PDF, PTSTEP, PSIGQSAT, & PRHODJ, PEXNREF, PRHODREF, PSIGS, PMFCONV, & PPABST, PZZ, & PEXN, PCF_MF, PRC_MF, PRI_MF, & + PICLDFR, PWCLDFR, PSSIO, PSSIU, PIFR, & PRV, PRC, PRVS, PRCS, PTH, PTHS, PSRCS, PCLDFR, & - PRR, PRI, PRIS, PRS, PRG, TBUDGETS, KBUDGETS, PRH,& + PRR, PRI, PRIS, PRS, PRG, TBUDGETS, KBUDGETS, & + PICE_CLD_WGT, & + PRH, & POUT_RV, POUT_RC, POUT_RI, POUT_TH, & - PHLC_HRC, PHLC_HCF, PHLI_HRI, PHLI_HCF, & - PICE_CLD_WGT) + PHLC_HRC, PHLC_HCF, PHLI_HRI, PHLI_HCF) +! USE MODD_BUDGET, ONLY: TBUDGETDATA IMPLICIT NONE ! @@ -22,9 +25,9 @@ IMPLICIT NONE !* 0.1 Declarations of dummy arguments : ! ! -INTEGER, INTENT(IN) :: KKA !near ground array index -INTEGER, INTENT(IN) :: KKU !uppest atmosphere array index -INTEGER, INTENT(IN) :: KKL !vert. levels type 1=MNH -1=ARO +INTEGER, INTENT(IN) :: KKA !near ground array index +INTEGER, INTENT(IN) :: KKU !uppest atmosphere array index +INTEGER, INTENT(IN) :: KKL !vert. levels type 1=MNH -1=ARO INTEGER, INTENT(IN) :: KRR ! Number of moist variables CHARACTER(LEN=1), INTENT(IN) :: HFRAC_ICE CHARACTER(LEN=80), INTENT(IN) :: HCONDENS @@ -32,59 +35,67 @@ CHARACTER(LEN=4), INTENT(IN) :: HLAMBDA3 ! formulation for lambda3 co CHARACTER(LEN=4), INTENT(IN) :: HBUNAME ! Name of the budget LOGICAL, INTENT(IN) :: OSUBG_COND ! Switch for Subgrid ! Condensation -LOGICAL :: OSIGMAS ! Switch for Sigma_s: +LOGICAL, INTENT(IN) :: OSIGMAS ! Switch for Sigma_s: ! use values computed in CONDENSATION ! or that from turbulence scheme -LOGICAL :: OCND2 ! logical switch to sparate liquid +LOGICAL, INTENT(IN) :: OCND2 ! logical switch to separate liquid ! and ice - ! more rigid (DEFALT value : .FALSE.) -CHARACTER(LEN=80), INTENT(IN) :: HSUBG_MF_PDF + ! more rigid (DEFAULT value : .FALSE.) +LOGICAL, INTENT(IN) :: LHGT_QS ! logical switch for height dependent VQSIGSAT +CHARACTER(LEN=80), INTENT(IN) :: HSUBG_MF_PDF REAL, INTENT(IN) :: PTSTEP ! Double Time step ! (single if cold start) REAL, DIMENSION(:,:), INTENT(IN) :: PSIGQSAT ! coeff applied to qsat variance contribution ! -REAL, DIMENSION(:,:,:), INTENT(IN) :: PRHODJ ! Dry density * Jacobian -REAL, DIMENSION(:,:,:), INTENT(IN) :: PEXNREF ! Reference Exner function -REAL, DIMENSION(:,:,:), INTENT(IN) :: PRHODREF +REAL, DIMENSION(:,:,:), CONTIGUOUS, INTENT(IN) :: PRHODJ ! Dry density * Jacobian +REAL, DIMENSION(:,:,:), CONTIGUOUS, INTENT(IN) :: PEXNREF ! Reference Exner function +REAL, DIMENSION(:,:,:), CONTIGUOUS, INTENT(IN) :: PRHODREF ! -REAL, DIMENSION(:,:,:), INTENT(IN) :: PSIGS ! Sigma_s at time t -REAL, DIMENSION(:,:,:), INTENT(IN) :: PMFCONV ! convective mass flux -REAL, DIMENSION(:,:,:), INTENT(IN) :: PPABST ! Absolute Pressure at t -REAL, DIMENSION(:,:,:), INTENT(IN) :: PZZ ! height of model layer -REAL, DIMENSION(:,:,:), INTENT(IN) :: PEXN ! Exner function +REAL, DIMENSION(:,:,:), CONTIGUOUS, INTENT(IN) :: PSIGS ! Sigma_s at time t +REAL, DIMENSION(:,:,:), CONTIGUOUS, INTENT(IN) :: PMFCONV ! convective mass flux +REAL, DIMENSION(:,:,:), CONTIGUOUS, INTENT(IN) :: PPABST ! Absolute Pressure at t +REAL, DIMENSION(:,:,:), CONTIGUOUS, INTENT(IN) :: PZZ ! height of model layer +REAL, DIMENSION(:,:,:), CONTIGUOUS, INTENT(IN) :: PEXN ! Exner function ! -REAL, DIMENSION(:,:,:), INTENT(IN) :: PCF_MF! Convective Mass Flux Cloud fraction -REAL, DIMENSION(:,:,:), INTENT(IN) :: PRC_MF! Convective Mass Flux liquid mixing ratio -REAL, DIMENSION(:,:,:), INTENT(IN) :: PRI_MF! Convective Mass Flux ice mixing ratio +REAL, DIMENSION(:,:,:), CONTIGUOUS, INTENT(IN) :: PCF_MF ! Convective Mass Flux Cloud fraction +REAL, DIMENSION(:,:,:), CONTIGUOUS, INTENT(IN) :: PRC_MF ! Convective Mass Flux liquid mixing ratio +REAL, DIMENSION(:,:,:), CONTIGUOUS, INTENT(IN) :: PRI_MF ! Convective Mass Flux ice mixing ratio ! -REAL, DIMENSION(:,:,:), INTENT(IN) :: PRV ! Water vapor m.r. to adjust -REAL, DIMENSION(:,:,:), INTENT(IN) :: PRC ! Cloud water m.r. to adjust -REAL, DIMENSION(:,:,:), INTENT(INOUT) :: PRVS ! Water vapor m.r. source -REAL, DIMENSION(:,:,:), INTENT(INOUT) :: PRCS ! Cloud water m.r. source -REAL, DIMENSION(:,:,:), INTENT(IN) :: PTH ! Theta to adjust -REAL, DIMENSION(:,:,:), INTENT(INOUT) :: PTHS ! Theta source -REAL, DIMENSION(:,:,:), INTENT(OUT) :: PSRCS ! Second-order flux +REAL, DIMENSION(:,:,:), CONTIGUOUS, INTENT(IN) :: PRV ! Water vapor m.r. to adjust +REAL, DIMENSION(:,:,:), CONTIGUOUS, INTENT(IN) :: PRC ! Cloud water m.r. to adjust +REAL, DIMENSION(:,:,:), CONTIGUOUS, INTENT(INOUT) :: PRVS ! Water vapor m.r. source +REAL, DIMENSION(:,:,:), CONTIGUOUS, INTENT(INOUT) :: PRCS ! Cloud water m.r. source +REAL, DIMENSION(:,:,:), CONTIGUOUS, INTENT(IN) :: PTH ! Theta to adjust +REAL, DIMENSION(:,:,:), CONTIGUOUS, INTENT(INOUT) :: PTHS ! Theta source +REAL, DIMENSION(:,:,:), CONTIGUOUS, INTENT(OUT) :: PSRCS ! Second-order flux ! s'rc'/2Sigma_s2 at time t+1 ! multiplied by Lambda_3 -REAL, DIMENSION(:,:,:), INTENT(OUT) :: PCLDFR ! Cloud fraction +REAL, DIMENSION(:,:,:), CONTIGUOUS, INTENT(OUT) :: PCLDFR ! Cloud fraction +REAL, DIMENSION(:,:,:), CONTIGUOUS, INTENT(OUT) :: PICLDFR ! ice cloud fraction +REAL, DIMENSION(:,:,:), CONTIGUOUS, INTENT(OUT) :: PWCLDFR ! water or mixed-phase cloud fraction +REAL, DIMENSION(:,:,:), CONTIGUOUS, INTENT(OUT) :: PSSIO ! Super-saturation with respect to ice in the + ! supersaturated fraction +REAL, DIMENSION(:,:,:), CONTIGUOUS, INTENT(OUT) :: PSSIU ! Sub-saturation with respect to ice in the + ! subsaturated fraction +REAL, DIMENSION(:,:,:), CONTIGUOUS, INTENT(OUT) :: PIFR ! Ratio cloud ice moist part to dry part ! -REAL, DIMENSION(:,:,:), INTENT(INOUT):: PRIS ! Cloud ice m.r. at t+1 -REAL, DIMENSION(:,:,:), INTENT(IN) :: PRR ! Rain water m.r. to adjust -REAL, DIMENSION(:,:,:), INTENT(IN) :: PRI ! Cloud ice m.r. to adjust -REAL, DIMENSION(:,:,:), INTENT(IN) :: PRS ! Aggregate m.r. to adjust -REAL, DIMENSION(:,:,:), INTENT(IN) :: PRG ! Graupel m.r. to adjust -REAL, DIMENSION(:,:,:), OPTIONAL, INTENT(IN) :: PRH ! Hail m.r. to adjust -REAL, DIMENSION(:,:,:), OPTIONAL, INTENT(OUT) :: POUT_RV ! Adjusted value -REAL, DIMENSION(:,:,:), OPTIONAL, INTENT(OUT) :: POUT_RC ! Adjusted value -REAL, DIMENSION(:,:,:), OPTIONAL, INTENT(OUT) :: POUT_RI ! Adjusted value -REAL, DIMENSION(:,:,:), OPTIONAL, INTENT(OUT) :: POUT_TH ! Adjusted value -REAL, DIMENSION(:,:,:), OPTIONAL, INTENT(OUT) :: PHLC_HRC -REAL, DIMENSION(:,:,:), OPTIONAL, INTENT(OUT) :: PHLC_HCF -REAL, DIMENSION(:,:,:), OPTIONAL, INTENT(OUT) :: PHLI_HRI -REAL, DIMENSION(:,:,:), OPTIONAL, INTENT(OUT) :: PHLI_HCF +REAL, DIMENSION(:,:,:), CONTIGUOUS, INTENT(INOUT) :: PRIS ! Cloud ice m.r. at t+1 +REAL, DIMENSION(:,:,:), CONTIGUOUS, INTENT(IN) :: PRR ! Rain water m.r. to adjust +REAL, DIMENSION(:,:,:), CONTIGUOUS, INTENT(IN) :: PRI ! Cloud ice m.r. to adjust +REAL, DIMENSION(:,:,:), CONTIGUOUS, INTENT(IN) :: PRS ! Aggregate m.r. to adjust +REAL, DIMENSION(:,:,:), CONTIGUOUS, INTENT(IN) :: PRG ! Graupel m.r. to adjust TYPE(TBUDGETDATA), DIMENSION(KBUDGETS), INTENT(INOUT) :: TBUDGETS -INTEGER, INTENT(IN) :: KBUDGETS -REAL, DIMENSION(:,:), OPTIONAL, INTENT(IN) :: PICE_CLD_WGT +INTEGER, INTENT(IN) :: KBUDGETS +REAL, DIMENSION(:,:), CONTIGUOUS, OPTIONAL, INTENT(IN) :: PICE_CLD_WGT +REAL, DIMENSION(:,:,:), CONTIGUOUS, OPTIONAL, INTENT(IN) :: PRH ! Hail m.r. to adjust +REAL, DIMENSION(:,:,:), CONTIGUOUS, OPTIONAL, INTENT(OUT) :: POUT_RV ! Adjusted value +REAL, DIMENSION(:,:,:), CONTIGUOUS, OPTIONAL, INTENT(OUT) :: POUT_RC ! Adjusted value +REAL, DIMENSION(:,:,:), CONTIGUOUS, OPTIONAL, INTENT(OUT) :: POUT_RI ! Adjusted value +REAL, DIMENSION(:,:,:), CONTIGUOUS, OPTIONAL, INTENT(OUT) :: POUT_TH ! Adjusted value +REAL, DIMENSION(:,:,:), CONTIGUOUS, OPTIONAL, INTENT(OUT) :: PHLC_HRC +REAL, DIMENSION(:,:,:), CONTIGUOUS, OPTIONAL, INTENT(OUT) :: PHLC_HCF +REAL, DIMENSION(:,:,:), CONTIGUOUS, OPTIONAL, INTENT(OUT) :: PHLI_HRI +REAL, DIMENSION(:,:,:), CONTIGUOUS, OPTIONAL, INTENT(OUT) :: PHLI_HCF ! END SUBROUTINE ICE_ADJUST ! diff --git a/src/common/micro/modi_ini_snow.F90 b/src/common/micro/modi_ini_snow.F90 new file mode 100644 index 000000000..788ec7c9a --- /dev/null +++ b/src/common/micro/modi_ini_snow.F90 @@ -0,0 +1,15 @@ +! ######spl + MODULE MODI_INI_SNOW +! ######################## +! +INTERFACE + SUBROUTINE INI_SNOW ( KLUOUT ) +! +INTEGER, INTENT(IN) :: KLUOUT ! Logical unit number for prints + +! +END SUBROUTINE INI_SNOW +! +END INTERFACE +! +END MODULE MODI_INI_SNOW diff --git a/src/common/micro/modi_ini_tiwmx.F90 b/src/common/micro/modi_ini_tiwmx.F90 new file mode 100644 index 000000000..9ef7e6409 --- /dev/null +++ b/src/common/micro/modi_ini_tiwmx.F90 @@ -0,0 +1,16 @@ +!MNH_LIC Copyright 1994-2014 CNRS, Meteo-France and Universite Paul Sabatier +!MNH_LIC This is part of the Meso-NH software governed by the CeCILL-C licence +!MNH_LIC version 1. See LICENSE, CeCILL-C_V1-en.txt and CeCILL-C_V1-fr.txt +!MNH_LIC for details. version 1. +! ######spl + MODULE MODI_INI_TIWMX +! ##################### +! +INTERFACE +! +SUBROUTINE INI_TIWMX +END SUBROUTINE INI_TIWMX +! +END INTERFACE +! +END MODULE MODI_INI_TIWMX diff --git a/src/common/turb/modd_turbn.f90 b/src/common/turb/modd_turbn.F90 similarity index 100% rename from src/common/turb/modd_turbn.f90 rename to src/common/turb/modd_turbn.F90 diff --git a/src/common/turb/mode_coefj.f90 b/src/common/turb/mode_coefj.F90 similarity index 100% rename from src/common/turb/mode_coefj.f90 rename to src/common/turb/mode_coefj.F90 diff --git a/src/mesonh/ext/resolved_cloud.f90 b/src/mesonh/ext/resolved_cloud.f90 index a425fe89c..e087afdec 100644 --- a/src/mesonh/ext/resolved_cloud.f90 +++ b/src/mesonh/ext/resolved_cloud.f90 @@ -478,6 +478,7 @@ REAL, DIMENSION(SIZE(PZZ,1),SIZE(PZZ,2),SIZE(PZZ,3)):: ZICEFR REAL, DIMENSION(SIZE(PZZ,1),SIZE(PZZ,2),SIZE(PZZ,3)):: ZPRCFR REAL, DIMENSION(SIZE(PZZ,1),SIZE(PZZ,2),SIZE(PZZ,3)):: ZTM REAL, DIMENSION(SIZE(PZZ,1),SIZE(PZZ,2)) :: ZSIGQSAT2D +REAL, DIMENSION(SIZE(PZZ,1),SIZE(PZZ,2),SIZE(PZZ,3)):: ZDUM ZSIGQSAT2D(:,:) = PSIGQSAT ! !------------------------------------------------------------------------------ @@ -743,10 +744,11 @@ SELECT CASE ( HCLOUD ) ZZZ = MZF( PZZ ) IF(LRED .AND. LADJ_BEFORE) THEN CALL ICE_ADJUST (1, IKU, 1, KRR, CFRAC_ICE_ADJUST, CCONDENS, CLAMBDA3, & - 'ADJU', OSUBG_COND, OSIGMAS, .FALSE., CSUBG_MF_PDF, & - PTSTEP, ZSIGQSAT2D, & + 'ADJU', OSUBG_COND, OSIGMAS, .FALSE., .FALSE., & + CSUBG_MF_PDF, PTSTEP, ZSIGQSAT2D, & PRHODJ, PEXNREF, PRHODREF, PSIGS, PMFCONV, PPABST, ZZZ, & ZEXN, PCF_MF, PRC_MF, PRI_MF, & + ZDUM, ZDUM, ZDUM, ZDUM, ZDUM, & PRV=PRS(:,:,:,1)*PTSTEP, PRC=PRS(:,:,:,2)*PTSTEP, & PRVS=PRS(:,:,:,1), PRCS=PRS(:,:,:,2), & PTH=PTHS*PTSTEP, PTHS=PTHS, PSRCS=PSRCS, PCLDFR=PCLDFR, & @@ -795,10 +797,11 @@ SELECT CASE ( HCLOUD ) ! IF (.NOT. LRED .OR. (LRED .AND. LADJ_AFTER) ) THEN CALL ICE_ADJUST (1, IKU, 1, KRR, CFRAC_ICE_ADJUST, CCONDENS, CLAMBDA3, & - 'DEPI', OSUBG_COND, OSIGMAS, .FALSE.,CSUBG_MF_PDF, & - PTSTEP, ZSIGQSAT2D, & + 'DEPI', OSUBG_COND, OSIGMAS, .FALSE., .FALSE., & + CSUBG_MF_PDF, PTSTEP, ZSIGQSAT2D, & PRHODJ, PEXNREF, PRHODREF, PSIGS, PMFCONV, PPABST, ZZZ, & ZEXN, PCF_MF, PRC_MF, PRI_MF, & + ZDUM, ZDUM, ZDUM, ZDUM, ZDUM, & PRV=PRS(:,:,:,1)*PTSTEP, PRC=PRS(:,:,:,2)*PTSTEP, & PRVS=PRS(:,:,:,1), PRCS=PRS(:,:,:,2), & PTH=PTHS*PTSTEP, PTHS=PTHS, PSRCS=PSRCS, PCLDFR=PCLDFR, & @@ -830,10 +833,11 @@ SELECT CASE ( HCLOUD ) ZZZ = MZF( PZZ ) IF(LRED .AND. LADJ_BEFORE) THEN CALL ICE_ADJUST (1, IKU, 1, KRR, CFRAC_ICE_ADJUST, CCONDENS, CLAMBDA3, & - 'ADJU', OSUBG_COND, OSIGMAS, .FALSE., CSUBG_MF_PDF, & - PTSTEP, ZSIGQSAT2D, & + 'ADJU', OSUBG_COND, OSIGMAS, .FALSE., .FALSE., & + CSUBG_MF_PDF, PTSTEP, ZSIGQSAT2D, & PRHODJ, PEXNREF, PRHODREF, PSIGS, PMFCONV, PPABST, ZZZ, & ZEXN, PCF_MF, PRC_MF, PRI_MF, & + ZDUM, ZDUM, ZDUM, ZDUM, ZDUM, & PRV=PRS(:,:,:,1)*PTSTEP, PRC=PRS(:,:,:,2)*PTSTEP, & PRVS=PRS(:,:,:,1), PRCS=PRS(:,:,:,2), & PTH=PTHS*PTSTEP, PTHS=PTHS, PSRCS=PSRCS, PCLDFR=PCLDFR, & @@ -887,10 +891,11 @@ SELECT CASE ( HCLOUD ) ! IF (.NOT. LRED .OR. (LRED .AND. LADJ_AFTER) ) THEN CALL ICE_ADJUST (1, IKU, 1, KRR, CFRAC_ICE_ADJUST, CCONDENS, CLAMBDA3, & - 'DEPI', OSUBG_COND, OSIGMAS, .FALSE., CSUBG_MF_PDF, & - PTSTEP, ZSIGQSAT2D, & + 'DEPI', OSUBG_COND, OSIGMAS, .FALSE., .FALSE., & + CSUBG_MF_PDF, PTSTEP, ZSIGQSAT2D, & PRHODJ, PEXNREF, PRHODREF, PSIGS, PMFCONV, PPABST, ZZZ, & ZEXN, PCF_MF, PRC_MF, PRI_MF, & + ZDUM, ZDUM, ZDUM, ZDUM, ZDUM, & PRV=PRS(:,:,:,1)*PTSTEP, PRC=PRS(:,:,:,2)*PTSTEP, & PRVS=PRS(:,:,:,1), PRCS=PRS(:,:,:,2), & PTH=PTHS*PTSTEP, PTHS=PTHS, PSRCS=PSRCS, PCLDFR=PCLDFR, & diff --git a/src/mesonh/micro/ice_adjust_elec.f90 b/src/mesonh/micro/ice_adjust_elec.f90 index 19ac78f72..a44b468c0 100644 --- a/src/mesonh/micro/ice_adjust_elec.f90 +++ b/src/mesonh/micro/ice_adjust_elec.f90 @@ -263,7 +263,7 @@ REAL, DIMENSION(SIZE(PEXNREF,1),SIZE(PEXNREF,2),SIZE(PEXNREF,3)) & ZLV, & ! guess of the Lv at t+1 ZLS, & ! guess of the Ls at t+1 ZW1,ZW2,ZW3,ZW4,ZW5,ZW6,ZW7,& ! Work arrays for intermediate fields - ZW1_IN, ZW2_IN, ZW3_IN, & + ZW1_IN, ZW2_IN, ZW3_IN, ZDUM, & ZCND ! CND=(T-T00)/(T0-T00) cf sc doc and TAO etal (89) REAL, DIMENSION(SIZE(PEXNREF,1),SIZE(PEXNREF,2),SIZE(PEXNREF,3)) & :: ZWE1, & @@ -377,11 +377,13 @@ DO JITER = 1, ITERMAX ZSIGQSAT2D(:,:)=PSIGQSAT ZW4 = 1. ! PRODREF is not used if HL variables are not present ! - CALL CONDENSATION( IIU, IJU, IKU, IIB, IIE, IJB, IJE, IKB, IKE,1, 'T', 'CB02', 'CB', & + CALL CONDENSATION( IIU, IJU, IKU, IIB, IIE, IJB, IJE, IKB, IKE,1, & + 'T', 'CB02', 'CB', & PPABST, PZZ, ZW4, ZT, ZW3_IN, ZW3, ZW1_IN, ZW1, ZW2_IN, ZW2, & - PRRS*PTSTEP, PRSS*PTSTEP, PRGS*PTSTEP, & - PSIGS, PMFCONV, PCLDFR, PSRCS, .TRUE., & - OSIGMAS, .FALSE., ZSIGQSAT2D, PLV=ZLV, PLS=ZLS, PCPH=ZCPH ) + PRRS*PTSTEP, PRSS*PTSTEP, PRGS*PTSTEP, PSIGS, PMFCONV, PCLDFR, & + PSRCS, .TRUE., OSIGMAS, .FALSE., .FALSE., & + ZDUM, ZDUM, ZDUM, ZDUM, ZDUM, ZSIGQSAT2D, & + PLV=ZLV, PLS=ZLS, PCPH=ZCPH ) ! !* 3.2 compute the variation of mixing ratio ! diff --git a/src/mesonh/micro/ini_rain_ice.f90 b/src/mesonh/micro/ini_rain_ice.f90 index 9ee20cc3f..ab29fbc68 100644 --- a/src/mesonh/micro/ini_rain_ice.f90 +++ b/src/mesonh/micro/ini_rain_ice.f90 @@ -397,7 +397,7 @@ XLBH = ( XAH*XCCH*MOMG(XALPHAH,XNUH,XBH) )**(-XLBEXH) XLBDAS_MAX = 100000.0 ! ZCONC_MAX = 1.E6 ! Maximal concentration for falling particules set to 1 per cc -XLBDAS_MAX = ( ZCONC_MAX/XCCS )**(1./XCXS) +IF(XCCS>0. .AND. XCXS>0. )XLBDAS_MAX = ( ZCONC_MAX/XCCS )**(1./XCXS) ! IF (HCLOUD == 'ICE4') THEN ALLOCATE( XRTMIN(7) ) @@ -543,16 +543,26 @@ X0DEPS = (4.0*XPI)*XCCS*XC1S*XF0S*MOMG(XALPHAS,XNUS,1.) X1DEPS = (4.0*XPI)*XCCS*XC1S*XF1S*SQRT(XCS)*MOMG(XALPHAS,XNUS,0.5*XDS+1.5) XEX0DEPS = XCXS-1.0 XEX1DEPS = XCXS-0.5*(XDS+3.0) +XRDEPSRED = 1.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) +XRDEPGRED = 1.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) + +GFLAG = .TRUE. +IF (GFLAG) THEN + WRITE(UNIT=KLUOUT,FMT='(" factors sublimation snow/groupel")') + WRITE(UNIT=KLUOUT,FMT='(" mod sublim snow =",E13.6)') XRDEPSRED + WRITE(UNIT=KLUOUT,FMT='(" mod sublim graupel =",E13.6)') XRDEPGRED +END IF + ! !* 5.3 Constants for pristine ice autoconversion ! @@ -1045,6 +1055,20 @@ IF( (KDRYLBDAG/=NDRYLBDAG) .OR. (KDRYLBDAR/=NDRYLBDAR) .OR. (KND/=IND) .OR. & PFDINFTY,XKER_RDRYG ) WRITE(UNIT=KLUOUT,FMT='(" Read XKER_RDRYG")') END IF + +! 8.2.6 Constants for possible modifying some processes related to +! graupeln in XFRMIN(1:8), IN - concentration in XFRMIN(9) and Kogan +! autoconversion in XFRMIN(10:11). May be used for e.g. ensemble spread + XFRMIN(1:6)=0. + XFRMIN(7:9)=1. + XFRMIN(10) =10. + XFRMIN(11) =1. + XFRMIN(12) =100. + XFRMIN(13) =1.0E-15 + XFRMIN(14) =120. + XFRMIN(15) =1.0E-4 + XFRMIN(16:20)=0. + XFRMIN(21)=1. ! ! !------------------------------------------------------------------------------- diff --git a/src/mesonh/micro/lima_adjust_split.f90 b/src/mesonh/micro/lima_adjust_split.f90 index 7534a193a..ebe680c80 100644 --- a/src/mesonh/micro/lima_adjust_split.f90 +++ b/src/mesonh/micro/lima_adjust_split.f90 @@ -275,7 +275,7 @@ REAL, DIMENSION(SIZE(PRHODJ,1),SIZE(PRHODJ,2),SIZE(PRHODJ,3)) & ZRI, ZRI_IN, & ZSIGS, & ZW_MF -REAL, DIMENSION(SIZE(PRHODJ,1),SIZE(PRHODJ,2)) :: ZSIGQSAT2D +REAL, DIMENSION(SIZE(PRHODJ,1),SIZE(PRHODJ,2)) :: ZSIGQSAT2D, ZDUM LOGICAL, DIMENSION(SIZE(PRHODJ,1),SIZE(PRHODJ,2),SIZE(PRHODJ,3)) & :: GMICRO ! Test where to compute cond/dep proc. INTEGER :: IMICRO @@ -510,12 +510,13 @@ DO JITER =1,ITERMAX ZRI=0. ZSIGS=PSIGS ZSIGQSAT2D(:,:)=PSIGQSAT - CALL CONDENSATION(IIU, IJU, IKU, IIB, IIE, IJB, IJE, IKB, IKE, 1, 'S', & - HCONDENS, HLAMBDA3, & + CALL CONDENSATION(IIU, IJU, IKU, IIB, IIE, IJB, IJE, IKB, IKE, 1, & + 'S', HCONDENS, HLAMBDA3, & PPABST, PZZ, PRHODREF, ZT, ZRV_IN, ZRV, ZRC_IN, ZRC, ZRI_IN, ZRI,& - PRRS*PTSTEP, PRSS*PTSTEP, PRGS*PTSTEP, & - ZSIGS, PMFCONV, PCLDFR, PSRCS, .FALSE., OSIGMAS, .FALSE., & - ZSIGQSAT2D, PLV=ZLV, PLS=ZLS, PCPH=ZCPH ) + PRRS*PTSTEP, PRSS*PTSTEP, PRGS*PTSTEP, ZSIGS, PMFCONV, PCLDFR, & + PSRCS, .FALSE., OSIGMAS, .FALSE., .FALSE., & + ZDUM, ZDUM, ZDUM, ZDUM, ZDUM, ZSIGQSAT2D, & + PLV=ZLV, PLS=ZLS, PCPH=ZCPH ) PCLDFR(:,:,:) = MIN(PCLDFR(:,:,:) + PCF_MF(:,:,:) , 1.) ZRV(:,:,:) = ZRV(:,:,:) - MAX(MIN(PRC_MF(:,:,:), ZRV(:,:,:)),0.) ZRC(:,:,:) = ZRC(:,:,:) + MAX(MIN(PRC_MF(:,:,:), ZRV(:,:,:)),0.) diff --git a/src/mesonh/micro/radtr_satel.f90 b/src/mesonh/micro/radtr_satel.f90 index dbc0cd4e6..48115b4c4 100644 --- a/src/mesonh/micro/radtr_satel.f90 +++ b/src/mesonh/micro/radtr_satel.f90 @@ -258,7 +258,7 @@ REAL, DIMENSION(:,:,:), ALLOCATABLE :: ZRC_IN, ZRC_OUT ! grid scale r_c mixing REAL, DIMENSION(:,:,:), ALLOCATABLE :: ZRI_IN, ZRI_OUT ! grid scale r_i (kg/kg) REAL, DIMENSION(:,:,:), ALLOCATABLE :: ZRV_IN, ZRV_OUT ! grid scale r_v (kg/kg) REAL, DIMENSION(:,:,:), ALLOCATABLE :: ZRHO -REAL, DIMENSION(SIZE(PPABST,1),SIZE(PPABST,2)) :: ZSIGQSAT2D +REAL, DIMENSION(SIZE(PPABST,1),SIZE(PPABST,2)) :: ZSIGQSAT2D, ZDUM !---------------------------------------------------------------------------- ! !* 1. INITIALIZATION OF CONSTANTS FOR TRANSFERT CODE @@ -484,10 +484,12 @@ IF( SIZE(PRT(:,:,:,:),4) >= 2 ) THEN ALLOCATE(ZRHO(IIU,IJU,IKU)) ZRHO=1. !unused ZSIGQSAT2D(:,:)=PSIGQSAT - CALL CONDENSATION( IIU, IJU, IKU, IIB, IIE, IJB, IJE, IKB, IKE, 1, 'T', 'CB02', 'CB',& + CALL CONDENSATION( IIU, IJU, IKU, IIB, IIE, IJB, IJE, IKB, IKE, 1, & + 'T', 'CB02', 'CB',& PPABST, PZZ, ZRHO, ZTEMP, ZRV_IN, ZRV_OUT, ZRC_IN, ZRC_OUT, ZRI_IN, ZRI_OUT, & - PRT(:,:,:,2), PRT(:,:,:,5), PRT(:,:,:,6), PSIGS,& - PMFCONV, ZNCLD, ZSIGRC, OUSERI, OSIGMAS, .FALSE., PSIGQSAT=ZSIGQSAT2D ) + PRT(:,:,:,2), PRT(:,:,:,5), PRT(:,:,:,6), PSIGS, PMFCONV, ZNCLD, & + ZSIGRC, OUSERI, OSIGMAS, .FALSE., .FALSE., & + ZDUM, ZDUM, ZDUM, ZDUM, ZDUM, ZSIGQSAT2D ) DEALLOCATE(ZTEMP,ZSIGRC) DEALLOCATE(ZRV_OUT) ELSE diff --git a/tools/check_commit_ial.sh b/tools/check_commit_ial.sh index 2c025352d..cca87f5b8 100755 --- a/tools/check_commit_ial.sh +++ b/tools/check_commit_ial.sh @@ -277,6 +277,7 @@ if [ $compilation -eq 1 ]; then [ -f $EXT/suphmpa.F90 ] && mv $EXT/suphmpa.F90 ../arpifs/phys_dmn/ #Special mpa case [ -f $EXT/modd_spp_type.F90 ] && mv $EXT/modd_spp_type.F90 ../mpa/micro/externals/ + [ -f $EXT/spp_mod_type.F90 ] && mv $EXT/spp_mod_type.F90 ../mpa/micro/externals/ [ -d $EXT/dead_code ] && rm -rf $EXT/dead_code/ if [ $EXT == "PHYEX/externals" ]; then mv $EXT . -- GitLab