diff --git a/docs/TODO b/docs/TODO index 55b6e2dc32a870dd8ba41867cf2fdb75e4831483..600b726c8c1181664c2b91f43f006d3769a2d60e 100644 --- a/docs/TODO +++ b/docs/TODO @@ -47,12 +47,13 @@ Ce répertoire devra être vidé à la fin du phasage, les modifications nécess Budgets/DDH - Le code dans budget_DDH devra être transféré dans mode_budget -- les routines arome specifiques aux budgets sont dans mpa/micro, il faudrait les mettre ailleurs +- les routines arome specifiques aux budgets sont dans mpa/micro, il faudrait les mettre dans aux +- nettoyage necessaire des routines budgets: + - etape 1: adaptation GPU en passant la structure => permettra d'identifier avec certitude les variables utiles + - etape 2: suppr des codes qui ne sont pas appelés, ménage modd_budget, ini_budget... Je pense que seul aro_ini_budget est utile SPP - modd_spp_type est pour l'instant dans mpa/micro/externals mais n'est pas de la microphysique Gradients/shuman: - essayer de mettre des abort dans les routines arome (shuman doit suffire) - -compute_frac_ice: prendre la solution retenue à la fin de la discussion entre LAERO et GMAP diff --git a/src/arome/aux/modd_budget.F90 b/src/arome/aux/modd_budget.F90 index 1f033601270a4834d15609054afe5c6dd418449a..8f7f8a44840dd90a23c908b88b64595005b2452d 100644 --- a/src/arome/aux/modd_budget.F90 +++ b/src/arome/aux/modd_budget.F90 @@ -66,10 +66,29 @@ TYPE TBUDGETDATA TYPE(TYP_DDH), POINTER :: YDDDH=>NULL() TYPE(TLDDH), POINTER :: YDLDDH=>NULL() TYPE(TMDDH), POINTER :: YDMDDH=>NULL() -ENDTYPE +ENDTYPE TBUDGETDATA +! +TYPE TBUDGETCONF_t + LOGICAL :: LBU_ENABLE=.FALSE. + LOGICAL :: LBUDGET_U=.FALSE. ! flag to compute budget of RhoJu and/or LES budgets with u + LOGICAL :: LBUDGET_V=.FALSE. ! flag to compute budget of RhoJv and/or LES budgets with u + LOGICAL :: LBUDGET_W=.FALSE. ! flag to compute budget of RhoJw and/or LES budgets with u + LOGICAL :: LBUDGET_TH=.FALSE. ! flag to compute budget of RhoJTh and/or LES budgets with th + LOGICAL :: LBUDGET_TKE=.FALSE.! flag to compute budget of RhoJTke and/or LES budgets with Tke + LOGICAL :: LBUDGET_RV=.FALSE. ! flag to compute budget of RhoJrv and/or LES budgets with rv + LOGICAL :: LBUDGET_RC=.FALSE. ! flag to compute budget of RhoJrc and/or LES budgets with rc + LOGICAL :: LBUDGET_RR=.FALSE. ! flag to compute budget of RhoJrr and/or LES budgets with rr + LOGICAL :: LBUDGET_RI=.FALSE. ! flag to compute budget of RhoJri and/or LES budgets with ri + LOGICAL :: LBUDGET_RS=.FALSE. ! flag to compute budget of RhoJrs and/or LES budgets with rs + LOGICAL :: LBUDGET_RG=.FALSE. ! flag to compute budget of RhoJrg and/or LES budgets with rg + LOGICAL :: LBUDGET_RH=.FALSE. ! flag to compute budget of RhoJrh and/or LES budgets with rh + LOGICAL :: LBUDGET_SV=.FALSE. ! flag to compute budget of RhoJsv and/or LES budgets with sv +END TYPE TBUDGETCONF_t +! +TYPE(TBUDGETCONF_t), TARGET :: TBUCONF ! ! General variables -LOGICAL :: LBU_ENABLE=.FALSE. +LOGICAL, POINTER :: LBU_ENABLE=>TBUCONF%LBU_ENABLE ! INTEGER, DIMENSION(JPBUMAX,JPBUPROMAX) & ! number of processes to be :: NBUINC=0 ! avoided for every budget @@ -658,18 +677,18 @@ INTEGER :: NNEUTQG=0 REAL :: XTIME_BU=0. ! budget time in this time-step REAL :: XTIME_BU_PROCESS=0. ! budget time per process for this time-step ! -LOGICAL :: LBUDGET_U=.FALSE. ! flag to compute budget of RhoJu and/or LES budgets with u -LOGICAL :: LBUDGET_V=.FALSE. ! flag to compute budget of RhoJv and/or LES budgets with u -LOGICAL :: LBUDGET_W=.FALSE. ! flag to compute budget of RhoJw and/or LES budgets with u -LOGICAL :: LBUDGET_TH=.FALSE. ! flag to compute budget of RhoJTh and/or LES budgets with th -LOGICAL :: LBUDGET_TKE=.FALSE.! flag to compute budget of RhoJTke and/or LES budgets with Tke -LOGICAL :: LBUDGET_RV=.FALSE. ! flag to compute budget of RhoJrv and/or LES budgets with rv -LOGICAL :: LBUDGET_RC=.FALSE. ! flag to compute budget of RhoJrc and/or LES budgets with rc -LOGICAL :: LBUDGET_RR=.FALSE. ! flag to compute budget of RhoJrr and/or LES budgets with rr -LOGICAL :: LBUDGET_RI=.FALSE. ! flag to compute budget of RhoJri and/or LES budgets with ri -LOGICAL :: LBUDGET_RS=.FALSE. ! flag to compute budget of RhoJrs and/or LES budgets with rs -LOGICAL :: LBUDGET_RG=.FALSE. ! flag to compute budget of RhoJrg and/or LES budgets with rg -LOGICAL :: LBUDGET_RH=.FALSE. ! flag to compute budget of RhoJrh and/or LES budgets with rh -LOGICAL :: LBUDGET_SV=.FALSE. ! flag to compute budget of RhoJsv and/or LES budgets with sv +LOGICAL, POINTER :: LBUDGET_U=>TBUCONF%LBUDGET_U ! flag to compute budget of RhoJu and/or LES budgets with u +LOGICAL, POINTER :: LBUDGET_V=>TBUCONF%LBUDGET_V ! flag to compute budget of RhoJv and/or LES budgets with u +LOGICAL, POINTER :: LBUDGET_W=>TBUCONF%LBUDGET_W ! flag to compute budget of RhoJw and/or LES budgets with u +LOGICAL, POINTER :: LBUDGET_TH=>TBUCONF%LBUDGET_TH ! flag to compute budget of RhoJTh and/or LES budgets with th +LOGICAL, POINTER :: LBUDGET_TKE=>TBUCONF%LBUDGET_TKE ! flag to compute budget of RhoJTke and/or LES budgets with Tke +LOGICAL, POINTER :: LBUDGET_RV=>TBUCONF%LBUDGET_RV ! flag to compute budget of RhoJrv and/or LES budgets with rv +LOGICAL, POINTER :: LBUDGET_RC=>TBUCONF%LBUDGET_RC ! flag to compute budget of RhoJrc and/or LES budgets with rc +LOGICAL, POINTER :: LBUDGET_RR=>TBUCONF%LBUDGET_RR ! flag to compute budget of RhoJrr and/or LES budgets with rr +LOGICAL, POINTER :: LBUDGET_RI=>TBUCONF%LBUDGET_RI ! flag to compute budget of RhoJri and/or LES budgets with ri +LOGICAL, POINTER :: LBUDGET_RS=>TBUCONF%LBUDGET_RS ! flag to compute budget of RhoJrs and/or LES budgets with rs +LOGICAL, POINTER :: LBUDGET_RG=>TBUCONF%LBUDGET_RG ! flag to compute budget of RhoJrg and/or LES budgets with rg +LOGICAL, POINTER :: LBUDGET_RH=>TBUCONF%LBUDGET_RH ! flag to compute budget of RhoJrh and/or LES budgets with rh +LOGICAL, POINTER :: LBUDGET_SV=>TBUCONF%LBUDGET_SV ! flag to compute budget of RhoJsv and/or LES budgets with sv ! END MODULE MODD_BUDGET diff --git a/src/arome/aux/mode_fill_dimphyexn.F90 b/src/arome/aux/mode_fill_dimphyexn.F90 new file mode 100644 index 0000000000000000000000000000000000000000..5df75ef5e5d1d02924f228de45bf4b365ff27d54 --- /dev/null +++ b/src/arome/aux/mode_fill_dimphyexn.F90 @@ -0,0 +1,79 @@ +!MNH_LIC Copyright 1995-2021 CNRS, Meteo-France and Universite Paul Sabatier +!MNH_LIC This is part of the Meso-NH software governed by the CeCILL-C licence +!MNH_LIC version 1. See LICENSE, CeCILL-C_V1-en.txt and CeCILL-C_V1-fr.txt +!MNH_LIC for details. version 1. +!----------------------------------------------------------------- +MODULE MODE_FILL_DIMPHYEX +IMPLICIT NONE +CONTAINS +SUBROUTINE FILL_DIMPHYEX(YDDIMPHYEX, KIT, KJT, KKT, KVEXT, KIE) +! ######################### +! +!! +!! PURPOSE +!! ------- +! This subroutine computes the dimensions according to the running model. +! +!! +!!** IMPLICIT ARGUMENTS +!! ------------------ +!! None +!! +!! REFERENCE +!! --------- +!! +!! AUTHOR +!! ------ +!! S. Riette, Météo-France +!! +!! MODIFICATIONS +!! ------------- +!! Original January 2022 +! +!----------------------------------------------------------------- +!* 0. DECLARATIONS +! ------------ +! +USE MODD_DIMPHYEX, ONLY: DIMPHYEX_t +USE PARKIND1, ONLY : JPRB +USE YOMHOOK , ONLY : LHOOK, DR_HOOK +! +IMPLICIT NONE +! +!* 0.1 Declarations of dummy arguments : +! +TYPE(DIMPHYEX_t), INTENT(OUT) :: YDDIMPHYEX ! Structure to fill in +INTEGER, INTENT(IN) :: KIT, KJT, KKT ! Array dimensions +INTEGER, INTENT(IN) :: KVEXT ! Number of unphysical points at each end of the vertical axis +INTEGER, INTENT(IN) :: KIE ! Index of the last horizontal point to consider + +! +!* 0.2 declaration of local variables +! +REAL(KIND=JPRB) :: ZHOOK_HANDLE +!------------------------------------------------------------------------------- +! +IF (LHOOK) CALL DR_HOOK('FILL_DIMPHYEX', 0, ZHOOK_HANDLE) +! +YDDIMPHYEX%NIT=KIT +YDDIMPHYEX%NIB=1 +YDDIMPHYEX%NIE=KIE !used to be KIT before considering KPROMA blocs +! +!In AROME, KJT is always 1 +YDDIMPHYEX%NJT=KJT +YDDIMPHYEX%NJB=1 +YDDIMPHYEX%NJE=KJT +! +YDDIMPHYEX%NKL=-1 +YDDIMPHYEX%NKT=KKT +YDDIMPHYEX%NKA=KKT +YDDIMPHYEX%NKU=1 +YDDIMPHYEX%NKB=KKT-KVEXT +YDDIMPHYEX%NKE=1+KVEXT +YDDIMPHYEX%NKTB=1+KVEXT +YDDIMPHYEX%NKTE=KKT-KVEXT +! +IF (LHOOK) CALL DR_HOOK('FILL_DIMPHYEX', 1, ZHOOK_HANDLE) +! +END SUBROUTINE FILL_DIMPHYEX +END MODULE MODE_FILL_DIMPHYEX diff --git a/src/arome/ext/apl_arome.F90 b/src/arome/ext/apl_arome.F90 index 298f6c90dc742c10d07cc74fafcacb4ee2ae1e0e..1f62ea8861ac74c04c25d46d40b7d48dc9b8f756 100644 --- a/src/arome/ext/apl_arome.F90 +++ b/src/arome/ext/apl_arome.F90 @@ -1642,8 +1642,8 @@ IF (LMICRO) THEN & ZSRCS__(:,1:KLEV),ZNEBMNH_,& & YDDDH, YDMODEL%YRML_DIAG%YRLDDH, YDMODEL%YRML_DIAG%YRMDDH) ELSE - - CALL ARO_ADJUST (KLEV,IKU,IKL,KFDIA,KLEV,NRR,& +! CALL ARO_ADJUST (KLON,KIDIA,KFDIA,KLEV,NRR,& !this is the target version + CALL ARO_ADJUST (KFDIA,KIDIA,KFDIA,KLEV,NRR,& & NGFL_EZDIAG, & & CFRAC_ICE_ADJUST, CCONDENS, CLAMBDA3, LOSUBG_COND, & & LOSIGMAS, CMICRO, LOCND2, CSUBG_MF_PDF, & diff --git a/src/arome/ext/aro_adjust.F90 b/src/arome/ext/aro_adjust.F90 index 213a974dd150bba8dbae7fa69b99ad3afd6f2af2..0713b1c6d8d0ab77a23966780256365c4054d6f8 100644 --- a/src/arome/ext/aro_adjust.F90 +++ b/src/arome/ext/aro_adjust.F90 @@ -1,5 +1,5 @@ ! ######spl - SUBROUTINE ARO_ADJUST(KKA,KKU,KKL,KLON,KLEV, KRR, & + SUBROUTINE ARO_ADJUST(KLON,KIDIA,KFDIA,KLEV, KRR, & NGFL_EZDIAG, & HFRAC_ICE, HCONDENS, HLAMBDA3, OSUBG_COND, & OSIGMAS, CMICRO, OCND2, HSUBG_MF_PDF, & @@ -85,13 +85,18 @@ ! ------------ ! USE MODD_CONF -USE MODD_CST +USE MODD_CST, ONLY: CST +USE MODD_RAIN_ICE_PARAM, ONLY: RAIN_ICE_PARAM +USE MODD_NEB, ONLY: NEB USE MODD_PARAMETERS USE MODD_RAIN_ICE_DESCR -USE MODD_BUDGET, ONLY: TBUDGETDATA, NBUDGET_RI +USE MODD_BUDGET, ONLY: TBUDGETDATA, NBUDGET_RI, TBUCONF USE MODD_SPP_TYPE +USE MODD_DIMPHYEX, ONLY: DIMPHYEX_t ! USE MODI_ICE_ADJUST +USE MODE_FILL_DIMPHYEX, ONLY: FILL_DIMPHYEX +! USE SPP_MOD, ONLY : YSPP_CONFIG,YSPP ! USE DDH_MIX , ONLY : TYP_DDH @@ -105,10 +110,9 @@ IMPLICIT NONE ! ! -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) :: KLON !NPROMA under CPG +INTEGER, INTENT(IN) :: KLON ! array length (NPROMA) +INTEGER, INTENT(IN) :: KIDIA !start index (=1) +INTEGER, INTENT(IN) :: KFDIA !end index (=KLON only if block is full) INTEGER, INTENT(IN) :: KLEV !Number of vertical levels INTEGER, INTENT(IN) :: KRR ! Number of moist variables INTEGER, INTENT(IN) :: NGFL_EZDIAG ! Diagnostic array dimension @@ -185,6 +189,7 @@ 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 +TYPE(DIMPHYEX_t) :: YLDIMPHYEX ! ! REAL(KIND=JPRB) :: ZHOOK_HANDLE @@ -195,6 +200,9 @@ REAL(KIND=JPRB) :: ZHOOK_HANDLE ! IF (LHOOK) CALL DR_HOOK('ARO_ADJUST',0,ZHOOK_HANDLE) +!Dimensions +CALL FILL_DIMPHYEX(YLDIMPHYEX, KLON, 1, KLEV, 0, KFDIA) + ! Copy SPP settings IF ( YSPP_CONFIG%LSPP ) THEN @@ -230,13 +238,13 @@ IF (YSPP_PSIGQSAT%LPERT) THEN ELSE ZMU = 0. ENDIF - DO JI=1,KLON + DO JI=KIDIA,KFDIA 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 ELSE - ZSIGQSAT(:,1) = PSIGQSAT + ZSIGQSAT(KIDIA:KFDIA,1) = PSIGQSAT ENDIF ! Perturb ICE_CLD_WGT @@ -246,7 +254,7 @@ IF (YSPP_ICE_CLD_WGT%LPERT) THEN ELSE ZMU = 0. ENDIF - DO JI=1,KLON + DO JI=KIDIA,KFDIA ! Awaiting HARMONIE-AROME physics changes ! ZVAL = & ! XFRMIN(21)* EXP(ZMU+YSPP_ICE_CLD_WGT%CMPERT*YSPP_ICE_CLD_WGT%PGP2DSPP(JI)) @@ -257,7 +265,7 @@ IF (YSPP_ICE_CLD_WGT%LPERT) THEN ENDDO ELSE ! ZICE_CLD_WGT(:) = XFRMIN(21) - ZICE_CLD_WGT(:,1) = 1.5 + ZICE_CLD_WGT(KIDIA:KFDIA,1) = 1.5 ENDIF HBUNAME='DEPI' @@ -287,7 +295,7 @@ IF (CMICRO == 'KESS' .OR. CMICRO == 'ICE3' .OR. CMICRO == 'ICE2' & SELECT CASE (JRR) CASE(3,5,6,7) ! rain, snow, graupel and hail - IF ( MINVAL( PRS(:,:,:,JRR)) < 0.0 ) THEN + IF ( MINVAL( PRS(KIDIA:KFDIA,:,:,JRR)) < 0.0 ) THEN ! For AROME, we cannot use MAX_ll so that according to JPP's advises ! we only correct negative values but not the total mass ! compute the total water mass computation @@ -296,7 +304,7 @@ IF (CMICRO == 'KESS' .OR. CMICRO == 'ICE3' .OR. CMICRO == 'ICE2' & ! ! remove the negative values ! - PRS(:,:,:,JRR) = MAX( 0., PRS(:,:,:,JRR) ) + PRS(KIDIA:KFDIA,:,:,JRR) = MAX( 0., PRS(KIDIA:KFDIA,:,:,JRR) ) ! ! compute the new total mass ! @@ -324,14 +332,14 @@ SELECT CASE ( CMICRO ) DO JLEV=1,KLEV - DO JLON=1,KLON + DO JLON=KIDIA,KFDIA ZT = PTHT(JLON,1,JLEV)*PEXNREF(JLON,1,JLEV) - ZLV(JLON)=XLVTT +(XCPV-XCL) *(ZT-XTT) - ZLS(JLON)=XLSTT +(XCPV-XCI) *(ZT-XTT) - ZCPH(JLON)=XCPD +XCPV*2.*PTSTEP*PRS(JLON,1,JLEV,1) + ZLV(JLON)=CST%XLVTT +(CST%XCPV-CST%XCL) *(ZT-CST%XTT) + ZLS(JLON)=CST%XLSTT +(CST%XCPV-CST%XCI) *(ZT-CST%XTT) + ZCPH(JLON)=CST%XCPD +CST%XCPV*2.*PTSTEP*PRS(JLON,1,JLEV,1) ENDDO - DO JLON=1,KLON + DO JLON=KIDIA,KFDIA IF (PRS(JLON,1,JLEV,4) < 0.) THEN PRS(JLON,1,JLEV,1) = PRS(JLON,1,JLEV,1) + PRS(JLON,1,JLEV,4) PTHS(JLON,1,JLEV) = PTHS(JLON,1,JLEV) - PRS(JLON,1,JLEV,4) * ZLS(JLON) / ZCPH(JLON) / PEXNREF(JLON,1,JLEV) @@ -340,7 +348,7 @@ SELECT CASE ( CMICRO ) ENDDO ! ! cloud - DO JLON=1,KLON + DO JLON=KIDIA,KFDIA IF (PRS(JLON,1,JLEV,2) < 0.) THEN PRS(JLON,1,JLEV,1) = PRS(JLON,1,JLEV,1) + PRS(JLON,1,JLEV,2) PTHS(JLON,1,JLEV) = PTHS(JLON,1,JLEV) - PRS(JLON,1,JLEV,2) * ZLV(JLON) / ZCPH(JLON) / PEXNREF(JLON,1,JLEV) @@ -350,7 +358,7 @@ SELECT CASE ( CMICRO ) ! ! if rc or ri are positive, we can correct negative rv ! cloud - DO JLON=1,KLON + DO JLON=KIDIA,KFDIA LL(JLON) = (PRS(JLON,1,JLEV,1) <0.) .AND. (PRS(JLON,1,JLEV,2)> 0.) IF (LL(JLON)) THEN #ifdef REPRO48 @@ -360,7 +368,7 @@ SELECT CASE ( CMICRO ) #endif ENDIF ENDDO - DO JLON=1,KLON + DO JLON=KIDIA,KFDIA IF (LL(JLON)) THEN PRS(JLON,1,JLEV,1) = PRS(JLON,1,JLEV,1) + ZCOR(JLON) PTHS(JLON,1,JLEV) = PTHS(JLON,1,JLEV) - ZCOR(JLON) * ZLV(JLON) / ZCPH(JLON) / PEXNREF(JLON,1,JLEV) @@ -370,13 +378,13 @@ SELECT CASE ( CMICRO ) ! ice IF (KRR > 3) THEN - DO JLON=1,KLON + DO JLON=KIDIA,KFDIA LL(JLON) = (PRS(JLON,1,JLEV,1) < 0.).AND.(PRS(JLON,1,JLEV,4) > 0.) IF (LL(JLON)) THEN ZCOR(JLON)=MIN(-PRS(JLON,1,JLEV,1),PRS(JLON,1,JLEV,4)) ENDIF ENDDO - DO JLON=1,KLON + DO JLON=KIDIA,KFDIA IF (LL(JLON)) THEN PRS(JLON,1,JLEV,1) = PRS(JLON,1,JLEV,1) + ZCOR(JLON) PTHS(JLON,1,JLEV) = PTHS(JLON,1,JLEV) - ZCOR(JLON) * ZLS(JLON) / ZCPH(JLON) / PEXNREF(JLON,1,JLEV) @@ -418,23 +426,23 @@ ENDDO ! DO JRR = 0,KRR IF (JRR==0) THEN - ZRS(:,:,:,0)=PTHS(:,:,:)*2.*PTSTEP + ZRS(KIDIA:KFDIA,:,:,0)=PTHS(KIDIA:KFDIA,:,:)*2.*PTSTEP ELSE - ZRS(:,:,:,JRR)=PRS(:,:,:,JRR)*2.*PTSTEP + ZRS(KIDIA:KFDIA,:,:,JRR)=PRS(KIDIA:KFDIA,:,:,JRR)*2.*PTSTEP ENDIF ENDDO -ZZZ(:,:,:) = PZZF(:,:,:) +ZZZ(KIDIA:KFDIA,:,:) = PZZF(KIDIA:KFDIA,:,:) ! !* 9.2 Perform the saturation adjustment over cloud ice and cloud water ! IF (KRR==6) THEN - CALL ICE_ADJUST ( KKA=KKA,KKU=KKU,KKL=KKL,KRR=KRR,& + CALL ICE_ADJUST ( YLDIMPHYEX, CST=CST, ICEP=RAIN_ICE_PARAM, NEB=NEB, BUCONF=TBUCONF, 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, & & PTSTEP=ZTWOTSTEP,PSIGQSAT=ZSIGQSAT, & & PRHODJ=PRHODJ ,PEXNREF=PEXNREF, PRHODREF=PRHODREF, & - & PSIGS=PSIGS, PMFCONV=PMFCONV, PPABST=PPABSM, PZZ=ZZZ, & + & PSIGS=PSIGS, LMFCONV=.TRUE., PMFCONV=PMFCONV, PPABST=PPABSM, PZZ=ZZZ, & & PEXN=PEXNREF, PCF_MF=PCF_MF,PRC_MF=PRC_MF,PRI_MF=PRI_MF, & & PRV=ZRS(:,:,:,1), PRC=ZRS(:,:,:,2), & & PRVS=PRS(:,:,:,1), PRCS=PRS(:,:,:,2), & @@ -448,13 +456,13 @@ IF (KRR==6) THEN & PICE_CLD_WGT=ZICE_CLD_WGT(:,:), & & TBUDGETS=YLBUDGET, KBUDGETS=SIZE(YLBUDGET)) ELSE - CALL ICE_ADJUST ( KKA=KKA,KKU=KKU,KKL=KKL,KRR=KRR,& + CALL ICE_ADJUST ( YLDIMPHYEX, CST=CST, ICEP=RAIN_ICE_PARAM, NEB=NEB, BUCONF=TBUCONF, 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, & & PTSTEP=ZTWOTSTEP,PSIGQSAT=ZSIGQSAT, & & PRHODJ=PRHODJ ,PEXNREF=PEXNREF, PRHODREF=PRHODREF, & - & PSIGS=PSIGS, PMFCONV=PMFCONV, PPABST=PPABSM, PZZ=ZZZ, & + & PSIGS=PSIGS, LMFCONV=.TRUE., PMFCONV=PMFCONV, PPABST=PPABSM, PZZ=ZZZ, & & PEXN=PEXNREF, PCF_MF=PCF_MF,PRC_MF=PRC_MF,PRI_MF=PRI_MF, & & PRV=ZRS(:,:,:,1), PRC=ZRS(:,:,:,2), & & PRVS=PRS(:,:,:,1), PRCS=PRS(:,:,:,2), & diff --git a/src/arome/ext/aro_adjust.h b/src/arome/ext/aro_adjust.h index 6f2856602c59c9926eecc055be328e7e4efaea48..d79c911464463399bcd82e994459d6c0f45f448e 100644 --- a/src/arome/ext/aro_adjust.h +++ b/src/arome/ext/aro_adjust.h @@ -1,5 +1,5 @@ INTERFACE - SUBROUTINE ARO_ADJUST(KKA,KKU,KKL,KLON,KLEV, KRR,& + SUBROUTINE ARO_ADJUST(KLON,KIDIA,KFDIA,KLEV, KRR,& & NGFL_EZDIAG, & & HFRAC_ICE, HCONDENS, HLAMBDA3, OSUBG_COND, & & OSIGMAS, CMICRO, OCND2, HSUBG_MF_PDF,& @@ -15,10 +15,9 @@ USE SPP_MOD, ONLY : YSPP USE DDH_MIX, ONLY : TYP_DDH USE YOMLDDH, ONLY : TLDDH USE YOMMDDH, ONLY : TMDDH -INTEGER(KIND=JPIM), INTENT(IN) :: KKA -INTEGER(KIND=JPIM), INTENT(IN) :: KKU -INTEGER(KIND=JPIM), INTENT(IN) :: KKL INTEGER(KIND=JPIM), INTENT(IN) :: KLON +INTEGER(KIND=JPIM), INTENT(IN) :: KIDIA +INTEGER(KIND=JPIM), INTENT(IN) :: KFDIA INTEGER(KIND=JPIM), INTENT(IN) :: KLEV INTEGER(KIND=JPIM), INTENT(IN) :: KRR INTEGER(KIND=JPIM), INTENT(IN) :: NGFL_EZDIAG diff --git a/src/arome/gmkpack_ignored_files b/src/arome/gmkpack_ignored_files index f4e9b065d46a9057243920e27b9348e3f4f57c6d..7af12651efdba8e9d0cfdc51c0c2d31c04645891 100644 --- a/src/arome/gmkpack_ignored_files +++ b/src/arome/gmkpack_ignored_files @@ -101,3 +101,4 @@ phyex/micro/modi_icecloud.F90 phyex/micro/tiwmx_tab.F90 phyex/micro/modi_tiwmx.F90 phyex/micro/modd_spp_type.F90 +phyex/micro/modd_cst.F90 diff --git a/src/arome/micro/ini_rain_ice.F90 b/src/arome/micro/ini_rain_ice.F90 index 023e0e268dc0507e998380b9619e65efcd457542..021d23402c54e92b8476af3e345d799157945ec1 100644 --- a/src/arome/micro/ini_rain_ice.F90 +++ b/src/arome/micro/ini_rain_ice.F90 @@ -164,7 +164,10 @@ REAL :: PDRYLBDAG_MAX,PDRYLBDAS_MAX,PDRYLBDAG_MIN,PDRYLBDAS_MIN REAL :: PDRYLBDAR_MAX,PDRYLBDAR_MIN REAL :: PWETLBDAS_MAX,PWETLBDAG_MAX,PWETLBDAS_MIN,PWETLBDAG_MIN REAL :: PWETLBDAR_MAX,PWETLBDAH_MAX,PWETLBDAR_MIN,PWETLBDAH_MIN +! +REAL(KIND=JPRB) :: ZHOOK_HANDLE !------------------------------------------------------------------------------- +IF (LHOOK) CALL DR_HOOK('INI_RAIN_ICE',0,ZHOOK_HANDLE) ! ! !* 0. FUNCTION STATEMENTS @@ -180,8 +183,6 @@ REAL :: PWETLBDAR_MAX,PWETLBDAH_MAX,PWETLBDAR_MIN,PWETLBDAH_MIN ! !* 1.1 Set the hailstones maximum fall velocity ! -REAL(KIND=JPRB) :: ZHOOK_HANDLE -IF (LHOOK) CALL DR_HOOK('INI_RAIN_ICE',0,ZHOOK_HANDLE) IF (CSEDIM == 'SPLI') THEN IF (HCLOUD == 'OLD4') THEN ZVTRMAX = 40. @@ -195,7 +196,7 @@ END IF KSPLITR = 1 IF (CSEDIM == 'SPLI' .AND. HCLOUD(1:3)=='OLD') THEN SPLIT : DO - ZT = PTSTEP / FLOAT(KSPLITR) + ZT = PTSTEP / REAL(KSPLITR) IF ( ZT * ZVTRMAX / PDZMIN .LT. 1.) EXIT SPLIT KSPLITR = KSPLITR + 1 END DO SPLIT @@ -430,6 +431,7 @@ ZRHO00 = 101325.*(1.+ZRV)/(XRD+ZRV*XRV)/293.15 ! !* 4.2 Constants for sedimentation ! +IF(.NOT.ASSOCIATED(XFSEDC)) CALL RAIN_ICE_INIT() XFSEDC(1) = GAMMA(XNUC+(XDC+3.)/XALPHAC)/GAMMA(XNUC+3./XALPHAC)* & (ZRHO00)**XCEXVT XFSEDC(2) = GAMMA(XNUC2+(XDC+3.)/XALPHAC2)/GAMMA(XNUC2+3./XALPHAC2)* & @@ -649,11 +651,11 @@ END IF NGAMINC = 80 XGAMINC_BOUND_MIN = 1.0E-1 ! Minimal value of (Lbda * D_cs^lim)**alpha XGAMINC_BOUND_MAX = 1.0E7 ! Maximal value of (Lbda * D_cs^lim)**alpha -ZRATE = EXP(LOG(XGAMINC_BOUND_MAX/XGAMINC_BOUND_MIN)/FLOAT(NGAMINC-1)) +ZRATE = EXP(LOG(XGAMINC_BOUND_MAX/XGAMINC_BOUND_MIN)/REAL(NGAMINC-1)) ! -IF( .NOT.ALLOCATED(XGAMINC_RIM1) ) ALLOCATE( XGAMINC_RIM1(NGAMINC) ) -IF( .NOT.ALLOCATED(XGAMINC_RIM2) ) ALLOCATE( XGAMINC_RIM2(NGAMINC) ) -IF( .NOT.ALLOCATED(XGAMINC_RIM4) ) ALLOCATE( XGAMINC_RIM4(NGAMINC) ) +IF( .NOT.ASSOCIATED(XGAMINC_RIM1) ) CALL RAIN_ICE_ALLOCATE('XGAMINC_RIM1', NGAMINC) +IF( .NOT.ASSOCIATED(XGAMINC_RIM2) ) CALL RAIN_ICE_ALLOCATE('XGAMINC_RIM2', NGAMINC) +IF( .NOT.ASSOCIATED(XGAMINC_RIM4) ) CALL RAIN_ICE_ALLOCATE('XGAMINC_RIM4', NGAMINC) ! DO J1=1,NGAMINC ZBOUND = XGAMINC_BOUND_MIN*ZRATE**(J1-1) @@ -687,13 +689,13 @@ XLBSACCR3 = MOMG(XALPHAS,XNUS,XBS+2.) NACCLBDAS = 40 XACCLBDAS_MIN = 5.0E1 ! Minimal value of Lbda_s to tabulate XKER_RACCS XACCLBDAS_MAX = 5.0E5 ! Maximal value of Lbda_s to tabulate XKER_RACCS -ZRATE = LOG(XACCLBDAS_MAX/XACCLBDAS_MIN)/FLOAT(NACCLBDAS-1) +ZRATE = LOG(XACCLBDAS_MAX/XACCLBDAS_MIN)/REAL(NACCLBDAS-1) XACCINTP1S = 1.0 / ZRATE XACCINTP2S = 1.0 - LOG( XACCLBDAS_MIN ) / ZRATE NACCLBDAR = 40 XACCLBDAR_MIN = 1.0E3 ! Minimal value of Lbda_r to tabulate XKER_RACCS XACCLBDAR_MAX = 1.0E7 ! Maximal value of Lbda_r to tabulate XKER_RACCS -ZRATE = LOG(XACCLBDAR_MAX/XACCLBDAR_MIN)/FLOAT(NACCLBDAR-1) +ZRATE = LOG(XACCLBDAR_MAX/XACCLBDAR_MIN)/REAL(NACCLBDAR-1) XACCINTP1R = 1.0 / ZRATE XACCINTP2R = 1.0 - LOG( XACCLBDAR_MIN ) / ZRATE ! @@ -703,9 +705,9 @@ IND = 50 ! Interval number, collection efficiency and infinite diameter ZESR = 1.0 ! factor used to integrate the dimensional distributions when ZFDINFTY = 20.0 ! computing the kernels XKER_RACCSS, XKER_RACCS and XKER_SACCRG ! -IF( .NOT.ALLOCATED(XKER_RACCSS) ) ALLOCATE( XKER_RACCSS(NACCLBDAS,NACCLBDAR) ) -IF( .NOT.ALLOCATED(XKER_RACCS ) ) ALLOCATE( XKER_RACCS (NACCLBDAS,NACCLBDAR) ) -IF( .NOT.ALLOCATED(XKER_SACCRG) ) ALLOCATE( XKER_SACCRG(NACCLBDAR,NACCLBDAS) ) +IF( .NOT.ASSOCIATED(XKER_RACCSS) ) CALL RAIN_ICE_ALLOCATE('XKER_RACCSS', NACCLBDAS,NACCLBDAR) +IF( .NOT.ASSOCIATED(XKER_RACCS ) ) CALL RAIN_ICE_ALLOCATE('XKER_RACCS', NACCLBDAS,NACCLBDAR) +IF( .NOT.ASSOCIATED(XKER_SACCRG) ) CALL RAIN_ICE_ALLOCATE('XKER_SACCRG', NACCLBDAR,NACCLBDAS) ! CALL READ_XKER_RACCS (KACCLBDAS,KACCLBDAR,KND, & PALPHAS,PNUS,PALPHAR,PNUR,PESR,PBS,PBR,PCS,PDS,PCR,PDR, & @@ -891,19 +893,19 @@ XLBRDRYG3 = MOMG(XALPHAR,XNUR,5.) NDRYLBDAR = 40 XDRYLBDAR_MIN = 1.0E3 ! Minimal value of Lbda_r to tabulate XKER_RDRYG XDRYLBDAR_MAX = 1.0E7 ! Maximal value of Lbda_r to tabulate XKER_RDRYG -ZRATE = LOG(XDRYLBDAR_MAX/XDRYLBDAR_MIN)/FLOAT(NDRYLBDAR-1) +ZRATE = LOG(XDRYLBDAR_MAX/XDRYLBDAR_MIN)/REAL(NDRYLBDAR-1) XDRYINTP1R = 1.0 / ZRATE XDRYINTP2R = 1.0 - LOG( XDRYLBDAR_MIN ) / ZRATE NDRYLBDAS = 80 XDRYLBDAS_MIN = 2.5E1 ! Minimal value of Lbda_s to tabulate XKER_SDRYG XDRYLBDAS_MAX = 2.5E9 ! Maximal value of Lbda_s to tabulate XKER_SDRYG -ZRATE = LOG(XDRYLBDAS_MAX/XDRYLBDAS_MIN)/FLOAT(NDRYLBDAS-1) +ZRATE = LOG(XDRYLBDAS_MAX/XDRYLBDAS_MIN)/REAL(NDRYLBDAS-1) XDRYINTP1S = 1.0 / ZRATE XDRYINTP2S = 1.0 - LOG( XDRYLBDAS_MIN ) / ZRATE NDRYLBDAG = 40 XDRYLBDAG_MIN = 1.0E3 ! Min value of Lbda_g to tabulate XKER_SDRYG,XKER_RDRYG XDRYLBDAG_MAX = 1.0E7 ! Max value of Lbda_g to tabulate XKER_SDRYG,XKER_RDRYG -ZRATE = LOG(XDRYLBDAG_MAX/XDRYLBDAG_MIN)/FLOAT(NDRYLBDAG-1) +ZRATE = LOG(XDRYLBDAG_MAX/XDRYLBDAG_MIN)/REAL(NDRYLBDAG-1) XDRYINTP1G = 1.0 / ZRATE XDRYINTP2G = 1.0 - LOG( XDRYLBDAG_MIN ) / ZRATE ! @@ -913,7 +915,7 @@ IND = 50 ! Interval number, collection efficiency and infinite diameter ZEGS = 1.0 ! factor used to integrate the dimensional distributions when ZFDINFTY = 20.0 ! computing the kernels XKER_SDRYG ! -IF( .NOT.ALLOCATED(XKER_SDRYG) ) ALLOCATE( XKER_SDRYG(NDRYLBDAG,NDRYLBDAS) ) +IF( .NOT.ASSOCIATED(XKER_SDRYG) ) CALL RAIN_ICE_ALLOCATE('XKER_SDRYG', NDRYLBDAG,NDRYLBDAS) ! CALL READ_XKER_SDRYG (KDRYLBDAG,KDRYLBDAS,KND, & PALPHAG,PNUG,PALPHAS,PNUS,PEGS,PBS,PCG,PDG,PCS,PDS, & @@ -979,7 +981,7 @@ IND = 50 ! Number of interval used to integrate the dimensional ZEGR = 1.0 ! distributions when computing the kernel XKER_RDRYG ZFDINFTY = 20.0 ! -IF( .NOT.ALLOCATED(XKER_RDRYG) ) ALLOCATE( XKER_RDRYG(NDRYLBDAG,NDRYLBDAR) ) +IF( .NOT.ASSOCIATED(XKER_RDRYG) ) CALL RAIN_ICE_ALLOCATE('XKER_RDRYG', NDRYLBDAG,NDRYLBDAR) ! CALL READ_XKER_RDRYG (KDRYLBDAG,KDRYLBDAR,KND, & PALPHAG,PNUG,PALPHAR,PNUR,PEGR,PBR,PCG,PDG,PCR,PDR, & @@ -1089,25 +1091,25 @@ XLBRWETH3 = MOMG(XALPHAR,XNUR,XBR+2.) NWETLBDAS = 80 XWETLBDAS_MIN = 2.5E1 ! Minimal value of Lbda_s to tabulate XKER_SWETH XWETLBDAS_MAX = 2.5E9 ! Maximal value of Lbda_s to tabulate XKER_SWETH -ZRATE = LOG(XWETLBDAS_MAX/XWETLBDAS_MIN)/FLOAT(NWETLBDAS-1) +ZRATE = LOG(XWETLBDAS_MAX/XWETLBDAS_MIN)/REAL(NWETLBDAS-1) XWETINTP1S = 1.0 / ZRATE XWETINTP2S = 1.0 - LOG( XWETLBDAS_MIN ) / ZRATE NWETLBDAG = 40 XWETLBDAG_MIN = 1.0E3 ! Min value of Lbda_g to tabulate XKER_GWETH XWETLBDAG_MAX = 1.0E7 ! Max value of Lbda_g to tabulate XKER_GWETH -ZRATE = LOG(XWETLBDAG_MAX/XWETLBDAG_MIN)/FLOAT(NWETLBDAG-1) +ZRATE = LOG(XWETLBDAG_MAX/XWETLBDAG_MIN)/REAL(NWETLBDAG-1) XWETINTP1G = 1.0 / ZRATE XWETINTP2G = 1.0 - LOG( XWETLBDAG_MIN ) / ZRATE NWETLBDAR = 40 XWETLBDAR_MIN = 1.0E3 ! Minimal value of Lbda_r to tabulate XKER_RWETH XWETLBDAR_MAX = 1.0E7 ! Maximal value of Lbda_r to tabulate XKER_RWETH -ZRATE = LOG(XWETLBDAR_MAX/XWETLBDAR_MIN)/FLOAT(NWETLBDAR-1) +ZRATE = LOG(XWETLBDAR_MAX/XWETLBDAR_MIN)/REAL(NWETLBDAR-1) XWETINTP1R = 1.0 / ZRATE XWETINTP2R = 1.0 - LOG( XWETLBDAR_MIN ) / ZRATE NWETLBDAH = 40 XWETLBDAH_MIN = 1.0E3 ! Min value of Lbda_h to tabulate XKER_SWETH,XKER_GWETH,XKER_RWETH XWETLBDAH_MAX = 1.0E7 ! Max value of Lbda_h to tabulate XKER_SWETH,XKER_GWETH,XKER_RWETH -ZRATE = LOG(XWETLBDAH_MAX/XWETLBDAH_MIN)/FLOAT(NWETLBDAH-1) +ZRATE = LOG(XWETLBDAH_MAX/XWETLBDAH_MIN)/REAL(NWETLBDAH-1) XWETINTP1H = 1.0 / ZRATE XWETINTP2H = 1.0 - LOG( XWETLBDAH_MIN ) / ZRATE ! @@ -1117,7 +1119,7 @@ IND = 50 ! Interval number, collection efficiency and infinite diameter ZEHS = 1.0 ! factor used to integrate the dimensional distributions when ZFDINFTY = 20.0 ! computing the kernels XKER_SWETH ! -IF( .NOT.ALLOCATED(XKER_SWETH) ) ALLOCATE( XKER_SWETH(NWETLBDAH,NWETLBDAS) ) +IF( .NOT.ASSOCIATED(XKER_SWETH) ) CALL RAIN_ICE_ALLOCATE('XKER_SWETH', NWETLBDAH,NWETLBDAS) ! CALL READ_XKER_SWETH (KWETLBDAH,KWETLBDAS,KND, & PALPHAH,PNUH,PALPHAS,PNUS,PEHS,PBS,PCH,PDH,PCS,PDS, & @@ -1183,7 +1185,7 @@ IND = 50 ! Number of interval used to integrate the dimensional ZEHG = 1.0 ! distributions when computing the kernel XKER_GWETH ZFDINFTY = 20.0 ! -IF( .NOT.ALLOCATED(XKER_GWETH) ) ALLOCATE( XKER_GWETH(NWETLBDAH,NWETLBDAG) ) +IF( .NOT.ASSOCIATED(XKER_GWETH) ) CALL RAIN_ICE_ALLOCATE('XKER_GWETH', NWETLBDAH,NWETLBDAG) ! CALL READ_XKER_GWETH (KWETLBDAH,KWETLBDAG,KND, & PALPHAH,PNUH,PALPHAG,PNUG,PEHG,PBG,PCH,PDH,PCG,PDG, & @@ -1249,7 +1251,7 @@ IND = 50 ! Number of interval used to integrate the dimensional ZEHR = 1.0 ! distributions when computing the kernel XKER_RWETH ZFDINFTY = 20.0 ! -IF( .NOT.ALLOCATED(XKER_RWETH) ) ALLOCATE( XKER_RWETH(NWETLBDAH,NWETLBDAR) ) +IF( .NOT.ASSOCIATED(XKER_RWETH) ) CALL RAIN_ICE_ALLOCATE('XKER_RWETH', NWETLBDAH,NWETLBDAR) ! CALL READ_XKER_RWETH (KWETLBDAH,KWETLBDAR,KND, & PALPHAH,PNUH,PALPHAR,PNUR,PEHR,PBR,PCH,PDH,PCR,PDR, & diff --git a/src/arome/micro/modd_cst.F90 b/src/arome/micro/modd_cst.F90 deleted file mode 100644 index 1f5d39b521df169340f648dcd59e73afbe32b217..0000000000000000000000000000000000000000 --- a/src/arome/micro/modd_cst.F90 +++ /dev/null @@ -1,100 +0,0 @@ -! ######spl - MODULE MODD_CST -! ############### -! -!!**** *MODD_CST* - declaration of Physic constants -!! -!! PURPOSE -!! ------- -! The purpose of this declarative module is to declare the -! Physics constants. -! -!! -!!** IMPLICIT ARGUMENTS -!! ------------------ -!! None -!! -!! REFERENCE -!! --------- -!! Book2 of documentation of Meso-NH (MODD_CST) -!! -!! AUTHOR -!! ------ -!! V. Ducrocq *Meteo France* -!! -!! MODIFICATIONS -!! ------------- -!! Original 16/05/94 -!! J. Stein 02/01/95 add xrholw -!! J.-P. Pinty 13/12/95 add XALPI,XBETAI,XGAMI -!! J. Stein 25/07/97 add XTH00 -!! V. Masson 05/10/98 add XRHOLI -!! C. Mari 31/10/00 add NDAYSEC -!! V. Masson 01/03/03 add conductivity of ice -!! R. El Khatib 04/08/14 add pre-computed quantities -!! J.L. Redelsperger 03/2021 add constants for ocean penetrating solar -!------------------------------------------------------------------------------- -! -!* 0. DECLARATIONS -! ------------ -! -IMPLICIT NONE -REAL,SAVE :: XPI ! Pi -! -REAL,SAVE :: XDAY,XSIYEA,XSIDAY ! day duration, sideral year duration, - ! sideral day duration -! -REAL,SAVE :: XKARMAN ! von karman constant -REAL,SAVE :: XLIGHTSPEED ! light speed -REAL,SAVE :: XPLANCK ! Planck constant -REAL,SAVE :: XBOLTZ ! Boltzman constant -REAL,SAVE :: XAVOGADRO ! Avogadro number -! -REAL,SAVE :: XRADIUS,XOMEGA ! Earth radius, earth rotation -REAL,SAVE :: XG ! Gravity constant -! -REAL,SAVE :: XP00 ! Reference pressure -REAL,SAVE :: XP00OCEAN ! Reference pressure for ocean model -REAL,SAVE :: XRH00OCEAN ! Reference density for ocean model -! -REAL,SAVE :: XSTEFAN,XI0 ! Stefan-Boltzman constant, solar constant -! -REAL,SAVE :: XMD,XMV ! Molar mass of dry air and molar mass of vapor -REAL,SAVE :: XRD,XRV ! Gaz constant for dry air, gaz constant for vapor -REAL,SAVE :: XEPSILO ! XMV/XMD -REAL,SAVE :: XCPD,XCPV ! Cpd (dry air), Cpv (vapor) -REAL,SAVE :: XRHOLW ! Volumic mass of liquid water -REAL,SAVE :: XCL,XCI ! Cl (liquid), Ci (ice) -REAL,SAVE :: XTT ! Triple point temperature -REAL,SAVE :: XLVTT ! Vaporization heat constant -REAL,SAVE :: XLSTT ! Sublimation heat constant -REAL,SAVE :: XLMTT ! Melting heat constant -REAL,SAVE :: XESTT ! Saturation vapor pressure at triple point - ! temperature -REAL,SAVE :: XALPW,XBETAW,XGAMW ! Constants for saturation vapor - ! pressure function -REAL,SAVE :: XALPI,XBETAI,XGAMI ! Constants for saturation vapor - ! pressure function over solid ice -REAL,SAVE :: XCONDI ! thermal conductivity of ice (W m-1 K-1) -REAL,SAVE :: XALPHAOC ! thermal expansion coefficient for ocean (K-1) -REAL,SAVE :: XBETAOC ! Haline contraction coeff for ocean (S-1) -REAL,SAVE :: XTH00 ! reference value for the potential temperature -REAL,SAVE :: XTH00OCEAN ! Ref value for pot temp in ocean model -REAL,SAVE :: XSA00OCEAN ! Ref value for SAlinity in ocean model -REAL,SAVE :: XROC=0.69! 3 coeffs for SW penetration in Ocean (Hoecker et al) -REAL,SAVE :: XD1=1.1 -REAL,SAVE :: XD2=23. -! Values used in SURFEX CMO -!REAL,SAVE :: XROC=0.58 -!REAL,SAVE :: XD1=0.35 -!REAL,SAVE :: XD2=23. - -REAL,SAVE :: XRHOLI ! Volumic mass of liquid water -! -INTEGER, SAVE :: NDAYSEC ! Number of seconds in a day -! -REAL,SAVE :: RDSRV ! XRD/XRV -REAL,SAVE :: RDSCPD ! XRD/XCPD -REAL,SAVE :: RINVXP00 ! 1./XP00 - -END MODULE MODD_CST diff --git a/src/arome/turb/shallow_mf.F90 b/src/arome/turb/shallow_mf.F90 index d73839a6b6f077934c42780c6542bd5bb1d0d196..4da7b7daa1709df62a741708aa584c63df2e8486 100644 --- a/src/arome/turb/shallow_mf.F90 +++ b/src/arome/turb/shallow_mf.F90 @@ -62,6 +62,7 @@ USE MODD_CST USE MODD_PARAMETERS, ONLY: JPVEXT USE MODD_CMFSHALL +USE MODD_NEB, ONLY: NEB USE MODI_THL_RT_FROM_TH_R_MF USE MODI_COMPUTE_UPDRAFT @@ -70,7 +71,6 @@ USE MODI_COMPUTE_UPDRAFT_RAHA USE MODI_MF_TURB USE MODI_MF_TURB_EXPL USE MODI_COMPUTE_MF_CLOUD -USE MODE_COMPUTE_FRAC_ICE, ONLY : COMPUTE_FRAC_ICE ! IMPLICIT NONE @@ -187,7 +187,7 @@ ZFRAC_ICE(:,:) = 0. WHERE(PRM(:,:,2)+PRM(:,:,4) > 1.E-20) ZFRAC_ICE(:,:) = PRM(:,:,4) / (PRM(:,:,2)+PRM(:,:,4)) ENDWHERE -CALL COMPUTE_FRAC_ICE(HFRAC_ICE,ZFRAC_ICE(:,:),PTHM(:,:)*PEXNM(:,:), IERR(:,:)) +CALL COMPUTE_FRAC_ICE(HFRAC_ICE,NEB,ZFRAC_ICE(:,:),PTHM(:,:)*PEXNM(:,:), IERR(:,:)) ! Conservative variables at t-dt CALL THL_RT_FROM_TH_R_MF(KRR,KRRL,KRRI, & @@ -295,4 +295,8 @@ IF( HMF_UPDRAFT == 'DUAL') THEN ENDIF ! IF (LHOOK) CALL DR_HOOK('SHALLOW_MF',1,ZHOOK_HANDLE) +! +CONTAINS +INCLUDE "compute_frac_ice.func.h" +! END SUBROUTINE SHALLOW_MF diff --git a/src/arome/turb/th_r_from_thl_rt_1d.F90 b/src/arome/turb/th_r_from_thl_rt_1d.F90 index f553f45851e617143f842eca05a70f4eb9817456..fe0cc27db48e4e7ffed2928567b5d6807468a23f 100644 --- a/src/arome/turb/th_r_from_thl_rt_1d.F90 +++ b/src/arome/turb/th_r_from_thl_rt_1d.F90 @@ -43,8 +43,8 @@ ! USE PARKIND1, ONLY : JPRB USE YOMHOOK , ONLY : LHOOK, DR_HOOK -USE MODE_COMPUTE_FRAC_ICE, ONLY : COMPUTE_FRAC_ICE USE MODD_CST!, ONLY: XP00, XRD, XCPD, XCPV, XCL, XCI, XLVTT, XTT, XLSTT +USE MODD_NEB, ONLY: NEB USE MODE_THERMO ! IMPLICIT NONE @@ -128,7 +128,7 @@ DO II=1,JITER PFRAC_ICE(J) = PRI(J) / (PRL(J)+PRI(J)) ENDIF ENDDO - CALL COMPUTE_FRAC_ICE(HFRAC_ICE,PFRAC_ICE(:),ZT(:), IERR(:)) + CALL COMPUTE_FRAC_ICE(HFRAC_ICE,NEB,PFRAC_ICE(:),ZT(:), IERR(:)) !Computation of Rvsat and dRsat/dT !In this version QSAT, QSATI, DQSAT and DQASATI functions are not used @@ -190,5 +190,8 @@ DO II=1,JITER ENDDO IF (LHOOK) CALL DR_HOOK('TH_R_FROM_THL_RT_1D',1,ZHOOK_HANDLE) - +! +CONTAINS +INCLUDE "compute_frac_ice.func.h" +! END SUBROUTINE TH_R_FROM_THL_RT_1D diff --git a/src/common/aux/modd_cst.F90 b/src/common/aux/modd_cst.F90 new file mode 100644 index 0000000000000000000000000000000000000000..7316997409a1ff1b115e17f6e1b9df62eed3f2ca --- /dev/null +++ b/src/common/aux/modd_cst.F90 @@ -0,0 +1,174 @@ +!MNH_LIC Copyright 1994-2021 CNRS, Meteo-France and Universite Paul Sabatier +!MNH_LIC This is part of the Meso-NH software governed by the CeCILL-C licence +!MNH_LIC version 1. See LICENSE, CeCILL-C_V1-en.txt and CeCILL-C_V1-fr.txt +!MNH_LIC for details. version 1. +!----------------------------------------------------------------- +! ############### + MODULE MODD_CST +! ############### +! +!!**** *MODD_CST* - declaration of Physic constants +!! +!! PURPOSE +!! ------- +! The purpose of this declarative module is to declare the +! Physics constants. +! +!! +!!** IMPLICIT ARGUMENTS +!! ------------------ +!! None +!! +!! REFERENCE +!! --------- +!! Book2 of documentation of Meso-NH (MODD_CST) +!! +!! AUTHOR +!! ------ +!! V. Ducrocq *Meteo France* +!! +!! MODIFICATIONS +!! ------------- +!! Original 16/05/94 +!! J. Stein 02/01/95 add xrholw +!! J.-P. Pinty 13/12/95 add XALPI,XBETAI,XGAMI +!! J. Stein 25/07/97 add XTH00 +!! V. Masson 05/10/98 add XRHOLI +!! C. Mari 31/10/00 add NDAYSEC +!! V. Masson 01/03/03 add conductivity of ice +!! R. El Khatib 04/08/14 add pre-computed quantities +!! J.Escobar : 10/2017 : for real*4 , add XMNH_HUGE_12_LOG +!! J.L. Redelsperger 03/2021 add constants for ocean penetrating solar +!! S. Riette: Jan 2022: introduction of a strucuture +!------------------------------------------------------------------------------- +! +!* 0. DECLARATIONS +! ------------ +! +IMPLICIT NONE +TYPE CST_t +REAL :: XPI ! Pi +! +REAL :: XDAY,XSIYEA,XSIDAY ! day duration, sideral year duration, + ! sideral day duration +! +REAL :: XKARMAN ! von karman constant +REAL :: XLIGHTSPEED ! light speed +REAL :: XPLANCK ! Planck constant +REAL :: XBOLTZ ! Boltzman constant +REAL :: XAVOGADRO ! Avogadro number +! +REAL :: XRADIUS,XOMEGA ! Earth radius, earth rotation +REAL :: XG ! Gravity constant +! +REAL :: XP00 ! Reference pressure +REAL :: XP00OCEAN ! Reference pressure for ocean model +REAL :: XRH00OCEAN ! Reference density for ocean model +! +REAL :: XSTEFAN,XI0 ! Stefan-Boltzman constant, solar constant +! +REAL :: XMD,XMV ! Molar mass of dry air and molar mass of vapor +REAL :: XRD,XRV ! Gaz constant for dry air, gaz constant for vapor +REAL :: XEPSILO ! XMV/XMD +REAL :: XCPD,XCPV ! Cpd (dry air), Cpv (vapor) +REAL :: XRHOLW ! Volumic mass of liquid water +REAL :: XCL,XCI ! Cl (liquid), Ci (ice) +REAL :: XTT ! Triple point temperature +REAL :: XLVTT ! Vaporization heat constant +REAL :: XLSTT ! Sublimation heat constant +REAL :: XLMTT ! Melting heat constant +REAL :: XESTT ! Saturation vapor pressure at triple point + ! temperature +REAL :: XALPW,XBETAW,XGAMW ! Constants for saturation vapor + ! pressure function +REAL :: XALPI,XBETAI,XGAMI ! Constants for saturation vapor + ! pressure function over solid ice +REAL :: XCONDI ! thermal conductivity of ice (W m-1 K-1) +REAL :: XALPHAOC ! thermal expansion coefficient for ocean (K-1) +REAL :: XBETAOC ! Haline contraction coeff for ocean (S-1) +REAL :: XTH00 ! reference value for the potential temperature +REAL :: XTH00OCEAN ! Ref value for pot temp in ocean model +REAL :: XSA00OCEAN ! Ref value for SAlinity in ocean model +REAL :: XROC=0.69! 3 coeffs for SW penetration in Ocean (Hoecker et al) +REAL :: XD1=1.1 +REAL :: XD2=23. +! Values used in SURFEX CMO +!REAL :: XROC=0.58 +!REAL :: XD1=0.35 +!REAL :: XD2=23. + +REAL :: XRHOLI ! Volumic mass of liquid water +! +INTEGER :: NDAYSEC ! Number of seconds in a day +! +REAL :: RDSRV ! XRD/XRV +REAL :: RDSCPD ! XRD/XCPD +REAL :: RINVXP00 ! 1./XP00 +! +! Some machine precision value depending of real4/8 use +! +REAL :: XMNH_TINY ! minimum real on this machine +REAL :: XMNH_TINY_12 ! sqrt(minimum real on this machine) +REAL :: XMNH_EPSILON ! minimum space with 1.0 +REAL :: XMNH_HUGE ! maximum real on this machine +REAL :: XMNH_HUGE_12_LOG ! maximum log(sqrt(real)) on this machine + +REAL :: XEPS_DT ! default value for DT test +REAL :: XRES_FLAT_CART ! default flat&cart residual tolerance +REAL :: XRES_OTHER ! default not flat&cart residual tolerance +REAL :: XRES_PREP ! default prep residual tolerance +END TYPE CST_t + +TYPE(CST_t), TARGET, SAVE :: CST + +REAL, POINTER :: XPI=>CST%XPI +REAL, POINTER :: XDAY=>CST%XDAY, XSIYEA=>CST%XSIYEA, XSIDAY=>CST%XSIDAY +REAL, POINTER :: XKARMAN=>CST%XKARMAN +REAL, POINTER :: XLIGHTSPEED=>CST%XLIGHTSPEED +REAL, POINTER :: XPLANCK=>CST%XPLANCK +REAL, POINTER :: XBOLTZ=>CST%XBOLTZ +REAL, POINTER :: XAVOGADRO=>CST%XAVOGADRO +REAL, POINTER :: XRADIUS=>CST%XRADIUS, XOMEGA=>CST%XOMEGA +REAL, POINTER :: XG=>CST%XG +REAL, POINTER :: XP00=>CST%XP00 +REAL, POINTER :: XP00OCEAN=>CST%XP00OCEAN +REAL, POINTER :: XRH00OCEAN=>CST%XRH00OCEAN +REAL, POINTER :: XSTEFAN=>CST%XSTEFAN, XI0=>CST%XI0 +REAL, POINTER :: XMD=>CST%XMD, XMV=>CST%XMV +REAL, POINTER :: XRD=>CST%XRD, XRV=>CST%XRV +REAL, POINTER :: XEPSILO=>CST%XEPSILO +REAL, POINTER :: XCPD=>CST%XCPD, XCPV=>CST%XCPV +REAL, POINTER :: XRHOLW=>CST%XRHOLW +REAL, POINTER :: XCL=>CST%XCL, XCI=>CST%XCI +REAL, POINTER :: XTT=>CST%XTT +REAL, POINTER :: XLVTT=>CST%XLVTT +REAL, POINTER :: XLSTT=>CST%XLSTT +REAL, POINTER :: XLMTT=>CST%XLMTT +REAL, POINTER :: XESTT=>CST%XESTT +REAL, POINTER :: XALPW=>CST%XALPW, XBETAW=>CST%XBETAW, XGAMW=>CST%XGAMW +REAL, POINTER :: XALPI=>CST%XALPI, XBETAI=>CST%XBETAI, XGAMI=>CST%XGAMI +REAL, POINTER :: XCONDI=>CST%XCONDI +REAL, POINTER :: XALPHAOC=>CST%XALPHAOC +REAL, POINTER :: XBETAOC=>CST%XBETAOC +REAL, POINTER :: XTH00=>CST%XTH00 +REAL, POINTER :: XTH00OCEAN=>CST%XTH00OCEAN +REAL, POINTER :: XSA00OCEAN=>CST%XSA00OCEAN +REAL, POINTER :: XROC=>CST%XROC +REAL, POINTER :: XD1=>CST%XD1 +REAL, POINTER :: XD2=>CST%XD2 +REAL, POINTER :: XRHOLI=>CST%XRHOLI +INTEGER, POINTER :: NDAYSEC=>CST%NDAYSEC +REAL, POINTER :: RDSRV=>CST%RDSRV +REAL, POINTER :: RDSCPD=>CST%RDSCPD +REAL, POINTER :: RINVXP00=>CST%RINVXP00 +REAL, POINTER :: XMNH_TINY=>CST%XMNH_TINY +REAL, POINTER :: XMNH_TINY_12=>CST%XMNH_TINY_12 +REAL, POINTER :: XMNH_EPSILON=>CST%XMNH_EPSILON +REAL, POINTER :: XMNH_HUGE=>CST%XMNH_HUGE +REAL, POINTER :: XMNH_HUGE_12_LOG=>CST%XMNH_HUGE_12_LOG +REAL, POINTER :: XEPS_DT=>CST%XEPS_DT +REAL, POINTER :: XRES_FLAT_CART=>CST%XRES_FLAT_CART +REAL, POINTER :: XRES_OTHER=>CST%XRES_OTHER +REAL, POINTER :: XRES_PREP=>CST%XRES_PREP +! +END MODULE MODD_CST diff --git a/src/common/aux/modd_dimphyexn.F90 b/src/common/aux/modd_dimphyexn.F90 new file mode 100644 index 0000000000000000000000000000000000000000..d644ea4d52a0d5551983f691da9696ef3b7fbc82 --- /dev/null +++ b/src/common/aux/modd_dimphyexn.F90 @@ -0,0 +1,72 @@ +!MNH_LIC Copyright 1995-2021 CNRS, Meteo-France and Universite Paul Sabatier +!MNH_LIC This is part of the Meso-NH software governed by the CeCILL-C licence +!MNH_LIC version 1. See LICENSE, CeCILL-C_V1-en.txt and CeCILL-C_V1-fr.txt +!MNH_LIC for details. version 1. +!----------------------------------------------------------------- +! #################### + MODULE MODD_DIMPHYEX +! #################### +! +!!**** *MODD_DIMPHYEX* - declaration of dimensions for the physics +!! +!! PURPOSE +!! ------- +! Declaration of array dimensions used by the physics +! +!! +!!** IMPLICIT ARGUMENTS +!! ------------------ +!! None +!! +!! REFERENCE +!! --------- +!! +!! AUTHOR +!! ------ +!! S. Riette, Météo-France +!! +!! MODIFICATIONS +!! ------------- +!! Original January 2022 +! +!----------------------------------------------------------------- +!* 0. DECLARATIONS +! ------------ +! +IMPLICIT NONE +! +TYPE DIMPHYEX_t + ! + !On x direction + INTEGER :: NIT ! Array total dimension + INTEGER :: NIB ! First inner mass point index + INTEGER :: NIE ! Last inner mass point index + ! + !On y direction + INTEGER :: NJT ! Array total dimension + INTEGER :: NJB ! First inner mass point index + INTEGER :: NJE ! Last inner mass point index + ! + !On z direction + !Ordering can be different depending on the host model + INTEGER :: NKL ! Order of the vertical levels + ! 1: as for Méso-NH, levels are numbered from ground to space + ! -1: as for AROME, levels are numbered from space to ground + INTEGER :: NKT ! Array total dimension + INTEGER :: NKA ! Near ground array index (is an unphysical level if JPVEXT!=0) + INTEGER :: NKU ! Uppest atmosphere array index (is an unphysical level if JPVEXT!=0) + INTEGER :: NKB ! Near ground physical array index (e.g. equal to 1+JPVEXT if NKL==1) + INTEGER :: NKE ! Uppest physical atmosphere array index (e.g. equal to 1+JPVEXT if NKL==-1) + INTEGER :: NKTB ! Smaller index of the physical domain (equals to MIN(NKB, NKE)=1+JPVEXT) + INTEGER :: NKTE ! Greater index of the physical domain (equals to MAX(NKB, NKE)=NKT-JPVEXT) + !Explanations about the different values. To loop on: + !* all (including non physical) levels from ground to top of atm: DO JK=NKA, NKU, KKL + !* all (including non physical) levels from top of atm to ground: DO JK=NKU, NKA, -KKL + !* physical levels only from ground to top of atm: DO JK=NKB, NKE, KKL + !* physical levels only from top of atm to ground: DO JK=NKE, NKB, -KKL + !* all (including non physical) following the array ordering: DO JK=1, NKT + !* physical levels only following the array ordering: DO JK=NKTB, NKTE +END TYPE DIMPHYEX_t +! +END MODULE MODD_DIMPHYEX + diff --git a/src/common/micro/compute_frac_ice.func.h b/src/common/micro/compute_frac_ice.func.h new file mode 100644 index 0000000000000000000000000000000000000000..f63cfe5548499d148d97b967ea89afe934f7857c --- /dev/null +++ b/src/common/micro/compute_frac_ice.func.h @@ -0,0 +1,54 @@ +!MNH_LIC Copyright 2006-2019 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. + ELEMENTAL SUBROUTINE COMPUTE_FRAC_ICE(HFRAC_ICE,NEB,PFRAC_ICE,PT,KERR) + +! ******* TO BE INCLUDED IN THE *CONTAINS* OF A SUBROUTINE, IN ORDER TO EASE AUTOMATIC INLINING ****** +! => Don't use drHook !!! +! +!!**** *COMPUTE_FRAC_ICE* - computes ice fraction +! +!! AUTHOR +!! ------ +!! Julien PERGAUD * Meteo-France * +!! +!! MODIFICATIONS +!! ------------- +!! Original 13/03/06 +!! S. Riette April 2011 optimisation +!! S. Riette 08/2016 add option O +!! R. El Khatib 12-Aug-2021 written as a include file +! +!! -------------------------------------------------------------------------- +USE MODD_NEB, ONLY : NEB_t +USE MODD_CST, ONLY : XTT +! +IMPLICIT NONE +! +CHARACTER(LEN=1), INTENT(IN) :: HFRAC_ICE ! scheme to use +TYPE(NEB_t), INTENT(IN) :: NEB +REAL, INTENT(IN) :: PT ! temperature +REAL, INTENT(INOUT) :: PFRAC_ICE ! Ice fraction (1 for ice only, 0 for liquid only) +INTEGER, INTENT(OUT) :: KERR ! Error code in return +! +!------------------------------------------------------------------------ + +! 1. Compute FRAC_ICE +! +KERR=0 +SELECT CASE(HFRAC_ICE) + CASE ('T') !using Temperature + PFRAC_ICE = MAX( 0., MIN(1., (( NEB%XTMAXMIX - PT ) / ( NEB%XTMAXMIX - NEB%XTMINMIX )) ) ) ! freezing interval + CASE ('O') !using Temperature with old formulae + PFRAC_ICE = MAX( 0., MIN(1., (( XTT - PT ) / 40.) ) ) ! freezing interval + CASE ('N') !No ice + PFRAC_ICE = 0. + CASE ('S') !Same as previous + ! (almost) nothing to do + PFRAC_ICE = MAX( 0., MIN(1., PFRAC_ICE ) ) + CASE DEFAULT + KERR=1 +END SELECT + +END SUBROUTINE COMPUTE_FRAC_ICE diff --git a/src/common/micro/condensation.F90 b/src/common/micro/condensation.F90 index 2e8112fc2fa0a54d8fbca37bc3fca5b4a82eab8c..e07e87f180092a51b6f615a8693292e33c9d961b 100644 --- a/src/common/micro/condensation.F90 +++ b/src/common/micro/condensation.F90 @@ -4,10 +4,10 @@ !MNH_LIC for details. version 1. !----------------------------------------------------------------- ! ######spl - SUBROUTINE CONDENSATION( KIU, KJU, KKU, KIB, KIE, KJB, KJE, KKB, KKE, KKL, & + SUBROUTINE CONDENSATION(D, CST, ICEP, NEB, & HFRAC_ICE, HCONDENS, HLAMBDA3, & PPABS, PZZ, PRHODREF, PT, PRV_IN, PRV_OUT, PRC_IN, PRC_OUT, PRI_IN, PRI_OUT, & - PRS, PRG, PSIGS, PMFCONV, PCLDFR, PSIGRC, OUSERI, & + PRS, PRG, PSIGS, LMFCONV, PMFCONV, PCLDFR, PSIGRC, OUSERI, & OSIGMAS, OCND2, PSIGQSAT, & PLV, PLS, PCPH, & PHLC_HRC, PHLC_HCF, PHLI_HRI, PHLI_HCF, & @@ -84,41 +84,35 @@ ! 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 MODE_COMPUTE_FRAC_ICE, ONLY : COMPUTE_FRAC_ICE -USE MODE_TIWMX, ONLY : ESATW, ESATI -USE MODE_ICECLOUD, ONLY : ICECLOUD +USE MODD_DIMPHYEX, ONLY: DIMPHYEX_t +USE MODD_CST, ONLY: CST_t +USE MODD_RAIN_ICE_PARAM, ONLY: RAIN_ICE_PARAM_t +USE MODD_NEB, ONLY: NEB_t +USE MODE_TIWMX, ONLY : ESATW, ESATI +USE MODE_ICECLOUD, ONLY : ICECLOUD ! IMPLICIT NONE ! !* 0.1 Declarations of dummy arguments : ! ! -INTEGER, INTENT(IN) :: KIU ! horizontal dimension in x -INTEGER, INTENT(IN) :: KJU ! horizontal dimension in y -INTEGER, INTENT(IN) :: KKU ! vertical dimension -INTEGER, INTENT(IN) :: KIB ! value of the first point in x -INTEGER, INTENT(IN) :: KIE ! value of the last point in x -INTEGER, INTENT(IN) :: KJB ! value of the first point in y -INTEGER, INTENT(IN) :: KJE ! value of the last point in y -INTEGER, INTENT(IN) :: KKB ! value of the first point in z -INTEGER, INTENT(IN) :: KKE ! value of the last point in z -INTEGER, INTENT(IN) :: KKL ! +1 if grid goes from ground to atmosphere top, -1 otherwise +TYPE(DIMPHYEX_t), INTENT(IN) :: D +TYPE(CST_t), INTENT(IN) :: CST +TYPE(RAIN_ICE_PARAM_t), INTENT(IN) :: ICEP +TYPE(NEB_t), INTENT(IN) :: NEB CHARACTER(LEN=1), INTENT(IN) :: HFRAC_ICE CHARACTER(LEN=4), INTENT(IN) :: HCONDENS CHARACTER(LEN=*), INTENT(IN) :: HLAMBDA3 ! formulation for lambda3 coeff -REAL, DIMENSION(KIU,KJU,KKU), INTENT(IN) :: PPABS ! pressure (Pa) -REAL, DIMENSION(KIU,KJU,KKU), INTENT(IN) :: PZZ ! height of model levels (m) -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 -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 -REAL, DIMENSION(KIU,KJU,KKU), INTENT(OUT) :: PRI_OUT! grid scale r_i (kg/kg) in output +REAL, DIMENSION(D%NIT,D%NJT,D%NKT), INTENT(IN) :: PPABS ! pressure (Pa) +REAL, DIMENSION(D%NIT,D%NJT,D%NKT), INTENT(IN) :: PZZ ! height of model levels (m) +REAL, DIMENSION(D%NIT,D%NJT,D%NKT), INTENT(IN) :: PRHODREF +REAL, DIMENSION(D%NIT,D%NJT,D%NKT), INTENT(INOUT) :: PT ! grid scale T (K) +REAL, DIMENSION(D%NIT,D%NJT,D%NKT), INTENT(IN) :: PRV_IN ! grid scale water vapor mixing ratio (kg/kg) in input +REAL, DIMENSION(D%NIT,D%NJT,D%NKT), INTENT(OUT) :: PRV_OUT! grid scale water vapor mixing ratio (kg/kg) in output +REAL, DIMENSION(D%NIT,D%NJT,D%NKT), INTENT(IN) :: PRC_IN ! grid scale r_c mixing ratio (kg/kg) in input +REAL, DIMENSION(D%NIT,D%NJT,D%NKT), INTENT(OUT) :: PRC_OUT! grid scale r_c mixing ratio (kg/kg) in output +REAL, DIMENSION(D%NIT,D%NJT,D%NKT), INTENT(IN) :: PRI_IN ! grid scale r_i (kg/kg) in input +REAL, DIMENSION(D%NIT,D%NJT,D%NKT), INTENT(OUT) :: PRI_OUT! grid scale r_i (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.) @@ -126,54 +120,59 @@ LOGICAL, INTENT(IN) :: OSIGMAS! use present global Sigma ! 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) +REAL, DIMENSION(D%NIT,D%NJT), INTENT(IN) :: PSIGQSAT ! use an extra "qsat" variance contribution (OSIGMAS case) ! multiplied by PSIGQSAT -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(D%NIT,D%NJT,D%NKT), INTENT(IN) :: PRS ! grid scale mixing ration of snow (kg/kg) +REAL, DIMENSION(D%NIT,D%NJT,D%NKT), INTENT(IN) :: PRG ! grid scale mixing ration of graupel (kg/kg) +REAL, DIMENSION(D%NIT,D%NJT,D%NKT), INTENT(IN) :: PSIGS ! Sigma_s from turbulence scheme +LOGICAL, INTENT(IN) :: LMFCONV ! =SIZE(PMFCONV)!=0 +REAL, DIMENSION(MERGE(D%NIT,0,LMFCONV),& + MERGE(D%NJT,0,LMFCONV),& + MERGE(D%NKT,0,LMFCONV)), INTENT(IN) :: PMFCONV! convective mass flux (kg /s m^2) +REAL, DIMENSION(D%NIT,D%NJT,D%NKT), INTENT(OUT) :: PCLDFR ! cloud fraction +REAL, DIMENSION(D%NIT,D%NJT,D%NKT), 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 -REAL, DIMENSION(KIU,KJU,KKU), OPTIONAL, INTENT(IN) :: PCPH ! Specific heat C_ph -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(D%NIT,D%NJT,D%NKT), OPTIONAL, INTENT(IN) :: PLV ! Latent heat L_v +REAL, DIMENSION(D%NIT,D%NJT,D%NKT), OPTIONAL, INTENT(IN) :: PLS ! Latent heat L_s +REAL, DIMENSION(D%NIT,D%NJT,D%NKT), OPTIONAL, INTENT(IN) :: PCPH ! Specific heat C_ph +REAL, DIMENSION(D%NIT,D%NJT,D%NKT), OPTIONAL, INTENT(OUT) :: PHLC_HRC +REAL, DIMENSION(D%NIT,D%NJT,D%NKT), OPTIONAL, INTENT(OUT) :: PHLC_HCF ! cloud fraction +REAL, DIMENSION(D%NIT,D%NJT,D%NKT), OPTIONAL, INTENT(OUT) :: PHLI_HRI +REAL, DIMENSION(D%NIT,D%NJT,D%NKT), OPTIONAL, INTENT(OUT) :: PHLI_HCF +REAL, DIMENSION(D%NIT,D%NJT), OPTIONAL, INTENT(IN) :: PICE_CLD_WGT ! ! !* 0.2 Declarations of local variables : ! -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 -REAL, DIMENSION(KIU,KJU) :: ZTMIN ! minimum Temp. related to ITPL +INTEGER :: JI, JJ, JK, JKP, JKM ! loop index +REAL, DIMENSION(D%NIT,D%NJT,D%NKT) :: ZTLK, ZRT ! work arrays for T_l and total water mixing ratio +REAL, DIMENSION(D%NIT,D%NJT,D%NKT) :: ZL ! length scale +INTEGER, DIMENSION(D%NIT,D%NJT) :: ITPL ! top levels of troposphere +REAL, DIMENSION(D%NIT,D%NJT) :: ZTMIN ! minimum Temp. related to ITPL ! -REAL, DIMENSION(KIU,KJU,KKU) :: ZLV, ZLS, ZCPD +REAL, DIMENSION(D%NIT,D%NJT,D%NKT) :: ZLV, ZLS, ZCPD REAL :: ZGCOND, ZAUTC, ZAUTI, ZGAUV, ZGAUC, ZGAUI, ZGAUTC, ZGAUTI, ZCRIAUTI ! Used for Gaussian PDF integration REAL :: ZLVS ! thermodynamics -REAL, DIMENSION(KIB:KIE) :: ZPV, ZPIV, ZQSL, ZQSI ! thermodynamics +REAL, DIMENSION(D%NIB:D%NIE) :: ZPV, ZPIV, ZQSL, ZQSI ! thermodynamics REAL :: ZLL, DZZ, ZZZ ! used for length scales REAL :: ZAH, ZDRW, ZDTL, ZSIG_CONV ! related to computation of Sig_s -REAL, DIMENSION(KIB:KIE) :: ZA, ZB, ZSBAR, ZSIGMA, ZQ1 ! related to computation of Sig_s -REAL, DIMENSION(KIB:KIE) :: ZCOND -REAL, DIMENSION(KIB:KIE) :: ZFRAC ! Ice fraction +REAL, DIMENSION(D%NIB:D%NIE) :: ZA, ZB, ZSBAR, ZSIGMA, ZQ1 ! related to computation of Sig_s +REAL, DIMENSION(D%NIB:D%NIE) :: ZCOND +REAL, DIMENSION(D%NIB:D%NIE) :: ZFRAC ! Ice fraction INTEGER :: INQ1 REAL :: ZINC ! related to OCND2 noise check : REAL :: ZRSP, ZRSW, ZRFRAC, ZRSDIF, ZRCOLD ! related to OCND2 ice cloud calulation : -REAL, DIMENSION(KIB:KIE) :: ESATW_T +REAL, DIMENSION(D%NIB:D%NIE) :: ESATW_T REAL :: ZDUM1,ZDUM2,ZDUM3,ZDUM4,ZPRIFACT -REAL, DIMENSION(KIU,KJU,KKU) :: TCLD -REAL :: ZDZ(KIB:KIE), ZARDUM(KIE-KIB+1),ZCLDUM(KIE-KIB+1) +REAL, DIMENSION(D%NIT,D%NJT,D%NKT) :: TCLD +REAL :: ZDZ(D%NIB:D%NIE), & + ZARDUM(D%NIE-D%NIB+1), ZCLDUM(D%NIE-D%NIB+1) ! end OCND2 REAL(KIND=JPRB) :: ZHOOK_HANDLE -INTEGER, DIMENSION(KIU) :: IERR +INTEGER, DIMENSION(D%NIT) :: IERR +! ! !* 0.3 Definition of constants : ! @@ -199,10 +198,7 @@ REAL, DIMENSION(-22:11),PARAMETER :: ZSRC_1D =(/ & ! ! IF (LHOOK) CALL DR_HOOK('CONDENSATION',0,ZHOOK_HANDLE) - -IKTB=1+JPVEXT -IKTE=KKU-JPVEXT - +! PCLDFR(:,:,:) = 0. ! Initialize values PSIGRC(:,:,:) = 0. ! Initialize values ZPRIFACT = 1. ! Initialize value @@ -212,9 +208,9 @@ IF(OCND2)ZPRIFACT = 0. ! !------------------------------------------------------------------------------- ! store total water mixing ratio -DO JK=IKTB,IKTE - DO JJ=KJB,KJE - DO JI=KIB,KIE +DO JK=D%NKTB,D%NKTE + DO JJ=D%NJB,D%NJE + DO JI=D%NIB,D%NIE ZRT(JI,JJ,JK) = PRV_IN(JI,JJ,JK) + PRC_IN(JI,JJ,JK) + PRI_IN(JI,JJ,JK)*ZPRIFACT END DO END DO @@ -226,12 +222,12 @@ IF(PRESENT(PLV) .AND. PRESENT(PLS)) THEN ZLV(:,:,:)=PLV(:,:,:) ZLS(:,:,:)=PLS(:,:,:) ELSE - DO JK=IKTB,IKTE - DO JJ=KJB,KJE - DO JI=KIB,KIE + DO JK=D%NKTB,D%NKTE + DO JJ=D%NJB,D%NJE + DO JI=D%NIB,D%NIE ! latent heat of vaporisation/sublimation - ZLV(JI,JJ,JK) = XLVTT + ( XCPV - XCL ) * ( PT(JI,JJ,JK) - XTT ) - ZLS(JI,JJ,JK) = XLSTT + ( XCPV - XCI ) * ( PT(JI,JJ,JK) - XTT ) + ZLV(JI,JJ,JK) = CST%XLVTT + ( CST%XCPV - CST%XCL ) * ( PT(JI,JJ,JK) - CST%XTT ) + ZLS(JI,JJ,JK) = CST%XLSTT + ( CST%XCPV - CST%XCI ) * ( PT(JI,JJ,JK) - CST%XTT ) ENDDO ENDDO ENDDO @@ -239,20 +235,20 @@ ENDIF IF(PRESENT(PCPH)) THEN ZCPD(:,:,:)=PCPH(:,:,:) ELSE - DO JK=IKTB,IKTE - DO JJ=KJB,KJE - DO JI=KIB,KIE - ZCPD(JI,JJ,JK) = XCPD + XCPV*PRV_IN(JI,JJ,JK) + XCL*PRC_IN(JI,JJ,JK) + XCI*PRI_IN(JI,JJ,JK) + & - XCI*(PRS(JI,JJ,JK) + PRG(JI,JJ,JK) ) + DO JK=D%NKTB,D%NKTE + DO JJ=D%NJB,D%NJE + DO JI=D%NIB,D%NIE + ZCPD(JI,JJ,JK) = CST%XCPD + CST%XCPV*PRV_IN(JI,JJ,JK) + CST%XCL*PRC_IN(JI,JJ,JK) + CST%XCI*PRI_IN(JI,JJ,JK) + & + CST%XCI*(PRS(JI,JJ,JK) + PRG(JI,JJ,JK) ) ENDDO ENDDO ENDDO ENDIF ! Preliminary calculations needed for computing the "turbulent part" of Sigma_s IF ( .NOT. OSIGMAS ) THEN - DO JK=IKTB,IKTE - DO JJ=KJB,KJE - DO JI=KIB,KIE + DO JK=D%NKTB,D%NKTE + DO JJ=D%NJB,D%NJE + DO JI=D%NIB,D%NIE ! store temperature at saturation ZTLK(JI,JJ,JK) = PT(JI,JJ,JK) - ZLV(JI,JJ,JK)*PRC_IN(JI,JJ,JK)/ZCPD(JI,JJ,JK) & - ZLS(JI,JJ,JK)*PRI_IN(JI,JJ,JK)/ZCPD(JI,JJ,JK)*ZPRIFACT @@ -260,11 +256,18 @@ IF ( .NOT. OSIGMAS ) THEN END DO END DO ! Determine tropopause/inversion height from minimum temperature - ITPL(:,:) = KIB+1 +#ifdef REPRO48 + ITPL(:,:) = D%NIB+1 + !I (Sébastien Riette) don't understand why tropopause level is set + !with the index of the second physical point on the horizontal (i.e. 2+JPHEXT)!!! + !I assume it is a bug... +#else + ITPL(:,:) = D%NKB+D%NKL +#endif ZTMIN(:,:) = 400. - DO JK = IKTB+1,IKTE-1 - DO JJ=KJB,KJE - DO JI=KIB,KIE + DO JK = D%NKTB+1,D%NKTE-1 + DO JJ=D%NJB,D%NJE + DO JI=D%NIB,D%NIE IF ( PT(JI,JJ,JK) < ZTMIN(JI,JJ) ) THEN ZTMIN(JI,JJ) = PT(JI,JJ,JK) ITPL(JI,JJ) = JK @@ -273,38 +276,39 @@ IF ( .NOT. OSIGMAS ) THEN END DO END DO ! Set the mixing length scale - ZL(:,:,KKB) = 20. - DO JK = KKB+KKL,KKE,KKL - DO JJ=KJB,KJE - DO JI=KIB,KIE + ZL(:,:,D%NKB) = 20. + DO JK = D%NKB+D%NKL,D%NKE,D%NKL + DO JJ=D%NJB,D%NJE + DO JI=D%NIB,D%NIE ! free troposphere ZL(JI,JJ,JK) = ZL0 - ZZZ = PZZ(JI,JJ,JK) - PZZ(JI,JJ,KKB) + ZZZ = PZZ(JI,JJ,JK) - PZZ(JI,JJ,D%NKB) JKP = ITPL(JI,JJ) ! approximate length for boundary-layer IF ( ZL0 > ZZZ ) ZL(JI,JJ,JK) = ZZZ ! gradual decrease of length-scale near and above tropopause - IF ( ZZZ > 0.9*(PZZ(JI,JJ,JKP)-PZZ(JI,JJ,KKB)) ) & - ZL(JI,JJ,JK) = .6 * ZL(JI,JJ,JK-KKL) + IF ( ZZZ > 0.9*(PZZ(JI,JJ,JKP)-PZZ(JI,JJ,D%NKB)) ) & + ZL(JI,JJ,JK) = .6 * ZL(JI,JJ,JK-D%NKL) END DO END DO END DO END IF !------------------------------------------------------------------------------- ! -DO JK=IKTB,IKTE - JKP=MAX(MIN(JK+KKL,IKTE),IKTB) - JKM=MAX(MIN(JK-KKL,IKTE),IKTB) - DO JJ=KJB,KJE +DO JK=D%NKTB,D%NKTE + JKP=MAX(MIN(JK+D%NKL,D%NKTE),D%NKTB) + JKM=MAX(MIN(JK-D%NKL,D%NKTE),D%NKTB) + DO JJ=D%NJB,D%NJE IF (OCND2) THEN - ZDZ(KIB:KIE) = PZZ(KIB:KIE,JJ,JKP) - PZZ(KIB:KIE,JJ,JKP+1) - 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,1.,TCLD(KIB,JJ,JK), & + ZDZ(D%NIB:D%NIE) = PZZ(D%NIB:D%NIE,JJ,JKP) - & + PZZ(D%NIB:D%NIE,JJ,JKP-D%NKL) + CALL ICECLOUD(D%NIE-D%NIB+1,PPABS(D%NIB,JJ,JK),PZZ(D%NIB,JJ,JK),ZDZ(D%NIB), & + & PT(D%NIB,JJ,JK),PRV_IN(D%NIB,JJ,JK),1.,-1., & + & ZCLDUM,1.,TCLD(D%NIB,JJ,JK), & & ZARDUM,ZARDUM,ZARDUM,ZARDUM) ! latent heats ! saturated water vapor mixing ratio over liquid water and ice - DO JI=KIB,KIE + DO JI=D%NIB,D%NIE ESATW_T(JI)=ESATW(PT(JI,JJ,JK)) ZPV(JI) = MIN(ESATW_T(JI), .99*PPABS(JI,JJ,JK)) ZPIV(JI) = MIN(ESATI(PT(JI,JJ,JK)), .99*PPABS(JI,JJ,JK)) @@ -312,24 +316,24 @@ DO JK=IKTB,IKTE ELSE ! latent heats ! saturated water vapor mixing ratio over liquid water and ice - DO JI=KIB,KIE - ZPV(JI) = MIN(EXP( XALPW - XBETAW / PT(JI,JJ,JK) - XGAMW * LOG( PT(JI,JJ,JK) ) ), .99*PPABS(JI,JJ,JK)) - ZPIV(JI) = MIN(EXP( XALPI - XBETAI / PT(JI,JJ,JK) - XGAMI * LOG( PT(JI,JJ,JK) ) ), .99*PPABS(JI,JJ,JK)) + DO JI=D%NIB,D%NIE + ZPV(JI) = MIN(EXP( CST%XALPW - CST%XBETAW / PT(JI,JJ,JK) - CST%XGAMW * LOG( PT(JI,JJ,JK) ) ), .99*PPABS(JI,JJ,JK)) + ZPIV(JI) = MIN(EXP( CST%XALPI - CST%XBETAI / PT(JI,JJ,JK) - CST%XGAMI * LOG( PT(JI,JJ,JK) ) ), .99*PPABS(JI,JJ,JK)) END DO ENDIF !Ice fraction ZFRAC(:) = 0. IF (OUSERI .AND. .NOT.OCND2) THEN - DO JI=KIB,KIE + DO JI=D%NIB,D%NIE IF (PRC_IN(JI,JJ,JK)+PRI_IN(JI,JJ,JK) > 1.E-20) THEN ZFRAC(JI) = PRI_IN(JI,JJ,JK) / (PRC_IN(JI,JJ,JK)+PRI_IN(JI,JJ,JK)) ENDIF END DO - CALL COMPUTE_FRAC_ICE(HFRAC_ICE, ZFRAC(:), PT(:,JJ,JK), IERR) !error code IERR cannot be checked here to not break vectorization + CALL COMPUTE_FRAC_ICE(HFRAC_ICE, NEB, ZFRAC(:), PT(:,JJ,JK), IERR) !error code IERR cannot be checked here to not break vectorization ENDIF - DO JI=KIB,KIE - ZQSL(JI) = XRD / XRV * ZPV(JI) / ( PPABS(JI,JJ,JK) - ZPV(JI) ) - ZQSI(JI) = XRD / XRV * ZPIV(JI) / ( PPABS(JI,JJ,JK) - ZPIV(JI) ) + DO JI=D%NIB,D%NIE + ZQSL(JI) = CST%XRD / CST%XRV * ZPV(JI) / ( PPABS(JI,JJ,JK) - ZPV(JI) ) + ZQSI(JI) = CST%XRD / CST%XRV * ZPIV(JI) / ( PPABS(JI,JJ,JK) - ZPIV(JI) ) ! interpolate between liquid and solid as function of temperature ZQSL(JI) = (1. - ZFRAC(JI)) * ZQSL(JI) + ZFRAC(JI) * ZQSI(JI) @@ -337,7 +341,7 @@ DO JK=IKTB,IKTE & ZFRAC(JI) * ZLS(JI,JJ,JK) ! coefficients a and b - ZAH = ZLVS * ZQSL(JI) / ( XRV * PT(JI,JJ,JK)**2 ) * (XRV * ZQSL(JI) / XRD + 1.) + ZAH = ZLVS * ZQSL(JI) / ( CST%XRV * PT(JI,JJ,JK)**2 ) * (CST%XRV * ZQSL(JI) / CST%XRD + 1.) ZA(JI) = 1. / ( 1. + ZLVS/ZCPD(JI,JJ,JK) * ZAH ) ZB(JI) = ZAH * ZA(JI) ZSBAR(JI) = ZA(JI) * ( ZRT(JI,JJ,JK) - ZQSL(JI) + & @@ -346,7 +350,7 @@ DO JK=IKTB,IKTE ! switch to take either present computed value of SIGMAS ! or that of Meso-NH turbulence scheme IF ( OSIGMAS ) THEN - DO JI=KIB,KIE + DO JI=D%NIB,D%NIE IF (PSIGQSAT(JI,JJ)/=0.) THEN ZSIGMA(JI) = SQRT((2*PSIGS(JI,JJ,JK))**2 + (PSIGQSAT(JI,JJ)*ZQSL(JI)*ZA(JI))**2) ELSE @@ -354,11 +358,11 @@ DO JK=IKTB,IKTE END IF END DO ELSE - DO JI=KIB,KIE + DO JI=D%NIB,D%NIE ! parameterize Sigma_s with first_order closure DZZ = PZZ(JI,JJ,JKP) - PZZ(JI,JJ,JKM) ZDRW = ZRT(JI,JJ,JKP) - ZRT(JI,JJ,JKM) - ZDTL = ZTLK(JI,JJ,JKP) - ZTLK(JI,JJ,JKM) + XG/ZCPD(JI,JJ,JK) * DZZ + ZDTL = ZTLK(JI,JJ,JKP) - ZTLK(JI,JJ,JKM) + CST%XG/ZCPD(JI,JJ,JK) * DZZ ZLL = ZL(JI,JJ,JK) ! standard deviation due to convection ZSIG_CONV =0. @@ -369,41 +373,41 @@ DO JK=IKTB,IKTE ZSIG_CONV * ZSIG_CONV ) ) END DO END IF - DO JI=KIB,KIE + DO JI=D%NIB,D%NIE ZSIGMA(JI)= MAX( 1.E-10, ZSIGMA(JI) ) ! normalized saturation deficit ZQ1(JI) = ZSBAR(JI)/ZSIGMA(JI) END DO IF(HCONDENS == 'GAUS') THEN - DO JI=KIB,KIE + DO JI=D%NIB,D%NIE ! Gaussian Probability Density Function around ZQ1 ! Computation of ZG and ZGAM(=erf(ZG)) ZGCOND = -ZQ1(JI)/SQRT(2.) !Approximation of erf function for Gaussian distribution - ZGAUV = 1 - SIGN(1., ZGCOND) * SQRT(1-EXP(-4*ZGCOND**2/XPI)) + ZGAUV = 1 - SIGN(1., ZGCOND) * SQRT(1-EXP(-4*ZGCOND**2/CST%XPI)) !Computation Cloud Fraction PCLDFR(JI,JJ,JK) = MAX( 0., MIN(1.,0.5*ZGAUV)) !Computation of condensate - ZCOND(JI) = (EXP(-ZGCOND**2)-ZGCOND*SQRT(XPI)*ZGAUV)*ZSIGMA(JI)/SQRT(2.*XPI) + ZCOND(JI) = (EXP(-ZGCOND**2)-ZGCOND*SQRT(CST%XPI)*ZGAUV)*ZSIGMA(JI)/SQRT(2.*CST%XPI) ZCOND(JI) = MAX(ZCOND(JI), 0.) PSIGRC(JI,JJ,JK) = PCLDFR(JI,JJ,JK) END DO !Computation warm/cold Cloud Fraction and content in high water content part IF(PRESENT(PHLC_HCF) .AND. PRESENT(PHLC_HRC))THEN - DO JI=KIB,KIE + DO JI=D%NIB,D%NIE IF(1-ZFRAC(JI) > 1.E-20)THEN - ZAUTC = (ZSBAR(JI) - XCRIAUTC/(PRHODREF(JI,JJ,JK)*(1-ZFRAC(JI))))/ZSIGMA(JI) + ZAUTC = (ZSBAR(JI) - ICEP%XCRIAUTC/(PRHODREF(JI,JJ,JK)*(1-ZFRAC(JI))))/ZSIGMA(JI) ZGAUTC = -ZAUTC/SQRT(2.) !Approximation of erf function for Gaussian distribution - ZGAUC = 1 - SIGN(1., ZGAUTC) * SQRT(1-EXP(-4*ZGAUTC**2/XPI)) + ZGAUC = 1 - SIGN(1., ZGAUTC) * SQRT(1-EXP(-4*ZGAUTC**2/CST%XPI)) PHLC_HCF(JI,JJ,JK) = MAX( 0., MIN(1.,0.5*ZGAUC)) - PHLC_HRC(JI,JJ,JK) = (1-ZFRAC(JI))*(EXP(-ZGAUTC**2)-ZGAUTC*SQRT(XPI)*ZGAUC)*ZSIGMA(JI)/SQRT(2.*XPI) - PHLC_HRC(JI,JJ,JK) = PHLC_HRC(JI,JJ,JK) + XCRIAUTC/PRHODREF(JI,JJ,JK) * PHLC_HCF(JI,JJ,JK) + PHLC_HRC(JI,JJ,JK) = (1-ZFRAC(JI))*(EXP(-ZGAUTC**2)-ZGAUTC*SQRT(CST%XPI)*ZGAUC)*ZSIGMA(JI)/SQRT(2.*CST%XPI) + PHLC_HRC(JI,JJ,JK) = PHLC_HRC(JI,JJ,JK) + ICEP%XCRIAUTC/PRHODREF(JI,JJ,JK) * PHLC_HCF(JI,JJ,JK) PHLC_HRC(JI,JJ,JK) = MAX(PHLC_HRC(JI,JJ,JK), 0.) ELSE PHLC_HCF(JI,JJ,JK)=0. @@ -413,15 +417,15 @@ DO JK=IKTB,IKTE ENDIF IF(PRESENT(PHLI_HCF) .AND. PRESENT(PHLI_HRI))THEN - DO JI=KIB,KIE + DO JI=D%NIB,D%NIE IF(ZFRAC(JI) > 1.E-20)THEN - ZCRIAUTI=MIN(XCRIAUTI,10**(XACRIAUTI*(PT(JI,JJ,JK)-XTT)+XBCRIAUTI)) + ZCRIAUTI=MIN(ICEP%XCRIAUTI,10**(ICEP%XACRIAUTI*(PT(JI,JJ,JK)-CST%XTT)+ICEP%XBCRIAUTI)) ZAUTI = (ZSBAR(JI) - ZCRIAUTI/ZFRAC(JI))/ZSIGMA(JI) ZGAUTI = -ZAUTI/SQRT(2.) !Approximation of erf function for Gaussian distribution - ZGAUI = 1 - SIGN(1., ZGAUTI) * SQRT(1-EXP(-4*ZGAUTI**2/XPI)) + ZGAUI = 1 - SIGN(1., ZGAUTI) * SQRT(1-EXP(-4*ZGAUTI**2/CST%XPI)) PHLI_HCF(JI,JJ,JK) = MAX( 0., MIN(1.,0.5*ZGAUI)) - PHLI_HRI(JI,JJ,JK) = ZFRAC(JI)*(EXP(-ZGAUTI**2)-ZGAUTI*SQRT(XPI)*ZGAUI)*ZSIGMA(JI)/SQRT(2.*XPI) + PHLI_HRI(JI,JJ,JK) = ZFRAC(JI)*(EXP(-ZGAUTI**2)-ZGAUTI*SQRT(CST%XPI)*ZGAUI)*ZSIGMA(JI)/SQRT(2.*CST%XPI) PHLI_HRI(JI,JJ,JK) = PHLI_HRI(JI,JJ,JK) + ZCRIAUTI*PHLI_HCF(JI,JJ,JK) PHLI_HRI(JI,JJ,JK) = MAX(PHLI_HRI(JI,JJ,JK), 0.) ELSE @@ -432,7 +436,7 @@ DO JK=IKTB,IKTE ENDIF ELSEIF(HCONDENS == 'CB02')THEN - DO JI=KIB,KIE + DO JI=D%NIB,D%NIE !Total condensate IF (ZQ1(JI) > 0. .AND. ZQ1(JI) <= 2) THEN ZCOND(JI) = MIN(EXP(-1.)+.66*ZQ1(JI)+.086*ZQ1(JI)**2, 2.) ! We use the MIN function for continuity @@ -469,7 +473,7 @@ DO JK=IKTB,IKTE END IF !HCONDENS IF(.NOT. OCND2) THEN - DO JI=KIB,KIE + DO JI=D%NIB,D%NIE PRC_OUT(JI,JJ,JK) = (1.-ZFRAC(JI)) * ZCOND(JI) ! liquid condensate PRI_OUT(JI,JJ,JK) = ZFRAC(JI) * ZCOND(JI) ! solid condensate PT(JI,JJ,JK) = PT(JI,JJ,JK) + ((PRC_OUT(JI,JJ,JK)-PRC_IN(JI,JJ,JK))*ZLV(JI,JJ,JK) + & @@ -478,7 +482,7 @@ DO JK=IKTB,IKTE PRV_OUT(JI,JJ,JK) = ZRT(JI,JJ,JK) - PRC_OUT(JI,JJ,JK) - PRI_OUT(JI,JJ,JK)*ZPRIFACT END DO ELSE - DO JI=KIB,KIE + DO JI=D%NIB,D%NIE PRC_OUT(JI,JJ,JK) = (1.-ZFRAC(JI)) * ZCOND(JI) ! liquid condensate ! ! This check is mainly for noise reduction : @@ -508,7 +512,7 @@ DO JK=IKTB,IKTE ZDUM3 = MAX(0.,TCLD(JI,JJ,JK)-PCLDFR(JI,JJ,JK)) ! pure ice cloud part - IF (JK==IKTB) THEN + IF (JK==D%NKTB) THEN ZDUM4 = PRI_IN(JI,JJ,JK) ELSE ZDUM4 = PRI_IN(JI,JJ,JK) + PRS(JI,JJ,JK)*0.5 + PRG(JI,JJ,JK)*0.25 @@ -530,7 +534,7 @@ DO JK=IKTB,IKTE END DO END IF ! End OCND2 IF(HLAMBDA3=='CB')THEN - DO JI=KIB,KIE + DO JI=D%NIB,D%NIE ! s r_c/ sig_s^2 ! PSIGRC(JI,JJ,JK) = PCLDFR(JI,JJ,JK) ! use simple Gaussian relation ! @@ -546,4 +550,8 @@ DO JK=IKTB,IKTE END DO ! IF (LHOOK) CALL DR_HOOK('CONDENSATION',1,ZHOOK_HANDLE) +! +CONTAINS +INCLUDE "compute_frac_ice.func.h" +! END SUBROUTINE CONDENSATION diff --git a/src/common/micro/ice_adjust.F90 b/src/common/micro/ice_adjust.F90 index 355cb63ccc4fc7de4d12decc5433d2a6b9bc094a..d2c9d943a6497358e48cde8cfd00ae94fcaf9cf3 100644 --- a/src/common/micro/ice_adjust.F90 +++ b/src/common/micro/ice_adjust.F90 @@ -4,10 +4,11 @@ !MNH_LIC for details. version 1. !----------------------------------------------------------------- ! ########################################################################## - SUBROUTINE ICE_ADJUST (KKA, KKU, KKL, KRR, HFRAC_ICE, HCONDENS, HLAMBDA3,& + SUBROUTINE ICE_ADJUST (D, CST, ICEP, NEB, BUCONF, KRR, & + HFRAC_ICE, HCONDENS, HLAMBDA3,& HBUNAME, OSUBG_COND, OSIGMAS, OCND2, HSUBG_MF_PDF,& PTSTEP, PSIGQSAT, & - PRHODJ, PEXNREF, PRHODREF, PSIGS, PMFCONV, & + PRHODJ, PEXNREF, PRHODREF, PSIGS, LMFCONV, PMFCONV,& PPABST, PZZ, & PEXN, PCF_MF, PRC_MF, PRI_MF, & PRV, PRC, PRVS, PRCS, PTH, PTHS, PSRCS, PCLDFR, & @@ -107,15 +108,13 @@ ! USE PARKIND1, ONLY : JPRB USE YOMHOOK , ONLY : LHOOK, DR_HOOK -USE MODD_BUDGET, ONLY: TBUDGETDATA, LBU_ENABLE, & - & LBUDGET_TH, LBUDGET_RV, LBUDGET_RC, LBUDGET_RI, & - & NBUDGET_TH, NBUDGET_RV, NBUDGET_RC, NBUDGET_RI -USE MODD_CST, ONLY: XLVTT, XLSTT, XCPV, XCL, XCI, XTT, XCPD, XCPV -USE MODD_PARAMETERS, ONLY: JPVEXT -USE MODD_RAIN_ICE_PARAM, ONLY : XCRIAUTC, XCRIAUTI, XACRIAUTI, XBCRIAUTI +USE MODD_DIMPHYEX, ONLY: DIMPHYEX_t +USE MODD_CST, ONLY: CST_t +USE MODD_NEB, ONLY: NEB_t +USE MODD_BUDGET, ONLY: TBUDGETDATA, TBUDGETCONF_t, NBUDGET_TH, NBUDGET_RV, NBUDGET_RC, NBUDGET_RI +USE MODD_RAIN_ICE_PARAM, ONLY : RAIN_ICE_PARAM_t ! USE MODE_BUDGET, ONLY: BUDGET_STORE_INIT, BUDGET_STORE_END -USE MODE_ll, ONLY: GET_INDICE_ll ! USE MODI_CONDENSATION ! @@ -125,9 +124,11 @@ 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 +TYPE(DIMPHYEX_t), INTENT(IN) :: D +TYPE(CST_t), INTENT(IN) :: CST +TYPE(RAIN_ICE_PARAM_t), INTENT(IN) :: ICEP +TYPE(NEB_t), INTENT(IN) :: NEB +TYPE(TBUDGETCONF_t), INTENT(IN) :: BUCONF INTEGER, INTENT(IN) :: KRR ! Number of moist variables CHARACTER(LEN=1), INTENT(IN) :: HFRAC_ICE CHARACTER(LEN=80), INTENT(IN) :: HCONDENS @@ -144,50 +145,55 @@ LOGICAL :: OCND2 ! logical switch to sparate 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(:,:,:), CONTIGUOUS, INTENT(IN) :: PRHODJ ! Dry density * Jacobian -REAL, DIMENSION(:,:,:), CONTIGUOUS, INTENT(IN) :: PEXNREF ! Reference Exner function -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) :: 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) :: 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(:,:,:), 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, 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 -TYPE(TBUDGETDATA), DIMENSION(KBUDGETS), INTENT(INOUT) :: TBUDGETS -INTEGER, INTENT(IN) :: KBUDGETS -REAL, DIMENSION(:,:), CONTIGUOUS, OPTIONAL, INTENT(IN) :: PICE_CLD_WGT +REAL, DIMENSION(D%NIT,D%NJT), INTENT(IN) :: PSIGQSAT ! coeff applied to qsat variance contribution +! +REAL, DIMENSION(D%NIT,D%NJT,D%NKT), INTENT(IN) :: PRHODJ ! Dry density * Jacobian +REAL, DIMENSION(D%NIT,D%NJT,D%NKT), INTENT(IN) :: PEXNREF ! Reference Exner function +REAL, DIMENSION(D%NIT,D%NJT,D%NKT), INTENT(IN) :: PRHODREF +! +REAL, DIMENSION(MERGE(D%NIT,0,OSUBG_COND),& + MERGE(D%NJT,0,OSUBG_COND),& + MERGE(D%NKT,0,OSUBG_COND)), INTENT(IN) :: PSIGS ! Sigma_s at time t +LOGICAL, INTENT(IN) :: LMFCONV ! =SIZE(PMFCONV)!=0 +REAL, DIMENSION(MERGE(D%NIT,0,LMFCONV),& + MERGE(D%NJT,0,LMFCONV),& + MERGE(D%NKT,0,LMFCONV)), INTENT(IN) :: PMFCONV ! convective mass flux +REAL, DIMENSION(D%NIT,D%NJT,D%NKT), INTENT(IN) :: PPABST ! Absolute Pressure at t +REAL, DIMENSION(D%NIT,D%NJT,D%NKT), INTENT(IN) :: PZZ ! height of model layer +REAL, DIMENSION(D%NIT,D%NJT,D%NKT), INTENT(IN) :: PEXN ! Exner function +! +REAL, DIMENSION(D%NIT,D%NJT,D%NKT), INTENT(IN) :: PCF_MF! Convective Mass Flux Cloud fraction +REAL, DIMENSION(D%NIT,D%NJT,D%NKT), INTENT(IN) :: PRC_MF! Convective Mass Flux liquid mixing ratio +REAL, DIMENSION(D%NIT,D%NJT,D%NKT), INTENT(IN) :: PRI_MF! Convective Mass Flux ice mixing ratio +! +REAL, DIMENSION(D%NIT,D%NJT,D%NKT), INTENT(IN) :: PRV ! Water vapor m.r. to adjust +REAL, DIMENSION(D%NIT,D%NJT,D%NKT), INTENT(IN) :: PRC ! Cloud water m.r. to adjust +REAL, DIMENSION(D%NIT,D%NJT,D%NKT), INTENT(INOUT) :: PRVS ! Water vapor m.r. source +REAL, DIMENSION(D%NIT,D%NJT,D%NKT), INTENT(INOUT) :: PRCS ! Cloud water m.r. source +REAL, DIMENSION(D%NIT,D%NJT,D%NKT), INTENT(IN) :: PTH ! Theta to adjust +REAL, DIMENSION(D%NIT,D%NJT,D%NKT), INTENT(INOUT) :: PTHS ! Theta source +REAL, DIMENSION(D%NIT,D%NJT,D%NKT), INTENT(OUT) :: PSRCS ! Second-order flux + ! s'rc'/2Sigma_s2 at time t+1 + ! multiplied by Lambda_3 +REAL, DIMENSION(D%NIT,D%NJT,D%NKT), INTENT(OUT) :: PCLDFR ! Cloud fraction +! +REAL, DIMENSION(D%NIT,D%NJT,D%NKT), INTENT(INOUT):: PRIS ! Cloud ice m.r. at t+1 +REAL, DIMENSION(D%NIT,D%NJT,D%NKT), INTENT(IN) :: PRR ! Rain water m.r. to adjust +REAL, DIMENSION(D%NIT,D%NJT,D%NKT), INTENT(IN) :: PRI ! Cloud ice m.r. to adjust +REAL, DIMENSION(D%NIT,D%NJT,D%NKT), INTENT(IN) :: PRS ! Aggregate m.r. to adjust +REAL, DIMENSION(D%NIT,D%NJT,D%NKT), INTENT(IN) :: PRG ! Graupel m.r. to adjust +REAL, DIMENSION(D%NIT,D%NJT,D%NKT), OPTIONAL, INTENT(IN) :: PRH ! Hail m.r. to adjust +REAL, DIMENSION(D%NIT,D%NJT,D%NKT), OPTIONAL, INTENT(OUT) :: POUT_RV ! Adjusted value +REAL, DIMENSION(D%NIT,D%NJT,D%NKT), OPTIONAL, INTENT(OUT) :: POUT_RC ! Adjusted value +REAL, DIMENSION(D%NIT,D%NJT,D%NKT), OPTIONAL, INTENT(OUT) :: POUT_RI ! Adjusted value +REAL, DIMENSION(D%NIT,D%NJT,D%NKT), OPTIONAL, INTENT(OUT) :: POUT_TH ! Adjusted value +REAL, DIMENSION(D%NIT,D%NJT,D%NKT), OPTIONAL, INTENT(OUT) :: PHLC_HRC +REAL, DIMENSION(D%NIT,D%NJT,D%NKT), OPTIONAL, INTENT(OUT) :: PHLC_HCF +REAL, DIMENSION(D%NIT,D%NJT,D%NKT), OPTIONAL, INTENT(OUT) :: PHLI_HRI +REAL, DIMENSION(D%NIT,D%NJT,D%NKT), OPTIONAL, INTENT(OUT) :: PHLI_HCF +TYPE(TBUDGETDATA), DIMENSION(KBUDGETS), INTENT(INOUT) :: TBUDGETS +INTEGER, INTENT(IN) :: KBUDGETS +REAL, DIMENSION(D%NIT,D%NJT), OPTIONAL, INTENT(IN) :: PICE_CLD_WGT ! !* 0.2 Declarations of local variables : ! @@ -202,16 +208,11 @@ REAL, DIMENSION(SIZE(PEXNREF,1),SIZE(PEXNREF,2),SIZE(PEXNREF,3)) & REAL :: ZCRIAUT, & ! Autoconversion thresholds ZHCF, ZHR ! -INTEGER :: IIU,IJU,IKU! dimensions of dummy arrays -INTEGER :: IIB,IJB ! Horz index values of the first inner mass points -INTEGER :: IIE,IJE ! Horz index values of the last inner mass points -INTEGER :: IKB ! K index value of the first inner mass point -INTEGER :: IKE ! K index value of the last inner mass point INTEGER :: JITER,ITERMAX ! iterative loop for first order adjustment INTEGER :: JI, JJ, JK ! -REAL, DIMENSION(SIZE(PEXNREF,1),SIZE(PEXNREF,2),SIZE(PEXNREF,3)) :: ZSIGS, ZSRCS -REAL, DIMENSION(SIZE(PEXNREF,1),SIZE(PEXNREF,2)) :: ZSIGQSAT +REAL, DIMENSION(D%NIT,D%NJT,D%NKT) :: ZSIGS, ZSRCS +REAL, DIMENSION(D%NIT,D%NJT) :: ZSIGQSAT REAL(KIND=JPRB) :: ZHOOK_HANDLE ! !------------------------------------------------------------------------------- @@ -221,19 +222,12 @@ REAL(KIND=JPRB) :: ZHOOK_HANDLE ! IF (LHOOK) CALL DR_HOOK('ICE_ADJUST',0,ZHOOK_HANDLE) ! -IIU = SIZE(PEXNREF,1) -IJU = SIZE(PEXNREF,2) -IKU = SIZE(PEXNREF,3) -CALL GET_INDICE_ll(IIB,IJB,IIE,IJE,IIU,IJU) -IKB=KKA+JPVEXT*KKL -IKE=KKU-JPVEXT*KKL -! ITERMAX=1 ! -IF(LBUDGET_TH) CALL BUDGET_STORE_INIT(TBUDGETS(NBUDGET_TH), TRIM(HBUNAME), PTHS(:, :, :)*PRHODJ(:, :, :)) -IF(LBUDGET_RV) CALL BUDGET_STORE_INIT(TBUDGETS(NBUDGET_RV), TRIM(HBUNAME), PRVS(:, :, :)*PRHODJ(:, :, :)) -IF(LBUDGET_RC) CALL BUDGET_STORE_INIT(TBUDGETS(NBUDGET_RC), TRIM(HBUNAME), PRCS(:, :, :)*PRHODJ(:, :, :)) -IF(LBUDGET_RI) CALL BUDGET_STORE_INIT(TBUDGETS(NBUDGET_RI), TRIM(HBUNAME), PRIS(:, :, :)*PRHODJ(:, :, :)) +IF(BUCONF%LBUDGET_TH) CALL BUDGET_STORE_INIT(TBUDGETS(NBUDGET_TH), TRIM(HBUNAME), PTHS(:, :, :)*PRHODJ(:, :, :)) +IF(BUCONF%LBUDGET_RV) CALL BUDGET_STORE_INIT(TBUDGETS(NBUDGET_RV), TRIM(HBUNAME), PRVS(:, :, :)*PRHODJ(:, :, :)) +IF(BUCONF%LBUDGET_RC) CALL BUDGET_STORE_INIT(TBUDGETS(NBUDGET_RC), TRIM(HBUNAME), PRCS(:, :, :)*PRHODJ(:, :, :)) +IF(BUCONF%LBUDGET_RI) CALL BUDGET_STORE_INIT(TBUDGETS(NBUDGET_RI), TRIM(HBUNAME), PRIS(:, :, :)*PRHODJ(:, :, :)) !------------------------------------------------------------------------------- ! !* 2. COMPUTE QUANTITIES WITH THE GUESS OF THE FUTURE INSTANT @@ -247,12 +241,12 @@ DO JITER =1,ITERMAX !* 2.3 compute the latent heat of vaporization Lv(T*) at t+1 ! and the latent heat of sublimation Ls(T*) at t+1 ! - DO JK=1,IKU - DO JJ=1,IJU - DO JI=1,IIU + DO JK=D%NKTB,D%NKTE + DO JJ=D%NJB,D%NJE + DO JI=D%NIB,D%NIE IF (JITER==1) ZT(JI,JJ,JK) = PTH(JI,JJ,JK) * PEXN(JI,JJ,JK) - ZLV(JI,JJ,JK) = XLVTT + ( XCPV - XCL ) * ( ZT(JI,JJ,JK) -XTT ) - ZLS(JI,JJ,JK) = XLSTT + ( XCPV - XCI ) * ( ZT(JI,JJ,JK) -XTT ) + ZLV(JI,JJ,JK) = CST%XLVTT + ( CST%XCPV - CST%XCL ) * ( ZT(JI,JJ,JK) -CST%XTT ) + ZLS(JI,JJ,JK) = CST%XLSTT + ( CST%XCPV - CST%XCI ) * ( ZT(JI,JJ,JK) -CST%XTT ) ENDDO ENDDO ENDDO @@ -272,9 +266,9 @@ ENDDO ! end of the iterative loop ! ------------------------------------------------- ! ! -DO JK=1,IKU - DO JJ=1,IJU - DO JI=1,IIU +DO JK=D%NKTB,D%NKTE + DO JJ=D%NJB,D%NJE + DO JI=D%NIB,D%NIE ! !* 5.0 compute the variation of mixing ratio ! @@ -309,7 +303,7 @@ DO JK=1,IKU !* 5.2 compute the cloud fraction PCLDFR ! IF ( .NOT. OSUBG_COND ) THEN - DO JI=1,IIU + DO JI=D%NIB,D%NIE IF (PRCS(JI,JJ,JK) + PRIS(JI,JJ,JK) > 1.E-12 / PTSTEP) THEN PCLDFR(JI,JJ,JK) = 1. ELSE @@ -320,7 +314,7 @@ DO JK=1,IKU END IF ENDDO ELSE !OSUBG_COND case - DO JI=1,IIU + DO JI=D%NIB,D%NIE !We limit PRC_MF+PRI_MF to PRVS*PTSTEP to avoid negative humidity ZW1=PRC_MF(JI,JJ,JK)/PTSTEP ZW2=PRI_MF(JI,JJ,JK)/PTSTEP @@ -336,7 +330,7 @@ DO JK=1,IKU (ZW1 * ZLV(JI,JJ,JK) + ZW2 * ZLS(JI,JJ,JK)) / ZCPH(JI,JJ,JK) / PEXNREF(JI,JJ,JK) ! IF(PRESENT(PHLC_HRC) .AND. PRESENT(PHLC_HCF)) THEN - ZCRIAUT=XCRIAUTC/PRHODREF(JI,JJ,JK) + ZCRIAUT=ICEP%XCRIAUTC/PRHODREF(JI,JJ,JK) IF(HSUBG_MF_PDF=='NONE')THEN IF(ZW1*PTSTEP>PCF_MF(JI,JJ,JK) * ZCRIAUT) THEN PHLC_HRC(JI,JJ,JK)=PHLC_HRC(JI,JJ,JK)+ZW1*PTSTEP @@ -364,7 +358,7 @@ DO JK=1,IKU ENDIF ENDIF IF(PRESENT(PHLI_HRI) .AND. PRESENT(PHLI_HCF)) THEN - ZCRIAUT=MIN(XCRIAUTI,10**(XACRIAUTI*(ZT(JI,JJ,JK)-XTT)+XBCRIAUTI)) + ZCRIAUT=MIN(ICEP%XCRIAUTI,10**(ICEP%XACRIAUTI*(ZT(JI,JJ,JK)-CST%XTT)+ICEP%XBCRIAUTI)) IF(HSUBG_MF_PDF=='NONE')THEN IF(ZW2*PTSTEP>PCF_MF(JI,JJ,JK) * ZCRIAUT) THEN PHLI_HRI(JI,JJ,JK)=PHLI_HRI(JI,JJ,JK)+ZW2*PTSTEP @@ -392,7 +386,7 @@ DO JK=1,IKU ! IF(PRESENT(POUT_RV) .OR. PRESENT(POUT_RC) .OR. & &PRESENT(POUT_RI) .OR. PRESENT(POUT_TH)) THEN - DO JI=1,IIU + DO JI=D%NIB,D%NIE ZW1=PRC_MF(JI,JJ,JK) ZW2=PRI_MF(JI,JJ,JK) IF(ZW1+ZW2>ZRV(JI,JJ,JK)) THEN @@ -419,10 +413,10 @@ IF(PRESENT(POUT_TH)) POUT_TH=ZT / PEXN(:,:,:) !* 6. STORE THE BUDGET TERMS ! ---------------------- ! -IF(LBUDGET_TH) CALL BUDGET_STORE_END(TBUDGETS(NBUDGET_TH), TRIM(HBUNAME), PTHS(:, :, :)*PRHODJ(:, :, :)) -IF(LBUDGET_RV) CALL BUDGET_STORE_END(TBUDGETS(NBUDGET_RV), TRIM(HBUNAME), PRVS(:, :, :)*PRHODJ(:, :, :)) -IF(LBUDGET_RC) CALL BUDGET_STORE_END(TBUDGETS(NBUDGET_RC), TRIM(HBUNAME), PRCS(:, :, :)*PRHODJ(:, :, :)) -IF(LBUDGET_RI) CALL BUDGET_STORE_END(TBUDGETS(NBUDGET_RI), TRIM(HBUNAME), PRIS(:, :, :)*PRHODJ(:, :, :)) +IF(BUCONF%LBUDGET_TH) CALL BUDGET_STORE_END(TBUDGETS(NBUDGET_TH), TRIM(HBUNAME), PTHS(:, :, :)*PRHODJ(:, :, :)) +IF(BUCONF%LBUDGET_RV) CALL BUDGET_STORE_END(TBUDGETS(NBUDGET_RV), TRIM(HBUNAME), PRVS(:, :, :)*PRHODJ(:, :, :)) +IF(BUCONF%LBUDGET_RC) CALL BUDGET_STORE_END(TBUDGETS(NBUDGET_RC), TRIM(HBUNAME), PRCS(:, :, :)*PRHODJ(:, :, :)) +IF(BUCONF%LBUDGET_RI) CALL BUDGET_STORE_END(TBUDGETS(NBUDGET_RI), TRIM(HBUNAME), PRIS(:, :, :)*PRHODJ(:, :, :)) !------------------------------------------------------------------------------ ! ! @@ -431,35 +425,40 @@ IF (LHOOK) CALL DR_HOOK('ICE_ADJUST',1,ZHOOK_HANDLE) CONTAINS SUBROUTINE ITERATION(PRV_IN,PRC_IN,PRI_IN,PRV_OUT,PRC_OUT,PRI_OUT) -REAL, DIMENSION(:,:,:), CONTIGUOUS, INTENT(IN) :: PRV_IN ! Water vapor m.r. to adjust in input -REAL, DIMENSION(:,:,:), CONTIGUOUS, INTENT(IN) :: PRC_IN ! Cloud water m.r. to adjust in input -REAL, DIMENSION(:,:,:), CONTIGUOUS, INTENT(IN) :: PRI_IN ! Cloud ice m.r. to adjust in input -REAL, DIMENSION(:,:,:), CONTIGUOUS, INTENT(OUT) :: PRV_OUT ! Water vapor m.r. to adjust in output -REAL, DIMENSION(:,:,:), CONTIGUOUS, INTENT(OUT) :: PRC_OUT ! Cloud water m.r. to adjust in output -REAL, DIMENSION(:,:,:), CONTIGUOUS, INTENT(OUT) :: PRI_OUT ! Cloud ice m.r. to adjust in output +REAL, DIMENSION(D%NIT,D%NJT,D%NKT), INTENT(IN) :: PRV_IN ! Water vapor m.r. to adjust in input +REAL, DIMENSION(D%NIT,D%NJT,D%NKT), INTENT(IN) :: PRC_IN ! Cloud water m.r. to adjust in input +REAL, DIMENSION(D%NIT,D%NJT,D%NKT), INTENT(IN) :: PRI_IN ! Cloud ice m.r. to adjust in input +REAL, DIMENSION(D%NIT,D%NJT,D%NKT), INTENT(OUT) :: PRV_OUT ! Water vapor m.r. to adjust in output +REAL, DIMENSION(D%NIT,D%NJT,D%NKT), INTENT(OUT) :: PRC_OUT ! Cloud water m.r. to adjust in output +REAL, DIMENSION(D%NIT,D%NJT,D%NKT), INTENT(OUT) :: PRI_OUT ! Cloud ice m.r. to adjust in output ! !* 2.4 compute the specific heat for moist air (Cph) at t+1 - -SELECT CASE(KRR) - CASE(7) - ZCPH(:,:,:) = XCPD + XCPV * PRV_IN(:,:,:) & - + XCL * (PRC_IN(:,:,:) + PRR(:,:,:)) & - + XCI * (PRI_IN(:,:,:) + PRS(:,:,:) + PRG(:,:,:) + PRH(:,:,:)) - CASE(6) - ZCPH(:,:,:) = XCPD + XCPV * PRV_IN(:,:,:) & - + XCL * (PRC_IN(:,:,:) + PRR(:,:,:)) & - + XCI * (PRI_IN(:,:,:) + PRS(:,:,:) + PRG(:,:,:)) - CASE(5) - ZCPH(:,:,:) = XCPD + XCPV * PRV_IN(:,:,:) & - + XCL * (PRC_IN(:,:,:) + PRR(:,:,:)) & - + XCI * (PRI_IN(:,:,:) + PRS(:,:,:)) - CASE(3) - ZCPH(:,:,:) = XCPD + XCPV * PRV_IN(:,:,:) & - + XCL * (PRC_IN(:,:,:) + PRR(:,:,:)) - CASE(2) - ZCPH(:,:,:) = XCPD + XCPV * PRV_IN(:,:,:) & - + XCL * PRC_IN(:,:,:) -END SELECT +DO JK=D%NKTB,D%NKTE + DO JJ=D%NJB,D%NJE + DO JI=D%NIB,D%NIE + SELECT CASE(KRR) + CASE(7) + ZCPH(JI,JJ,JK) = CST%XCPD + CST%XCPV * PRV_IN(JI,JJ,JK) & + + CST%XCL * (PRC_IN(JI,JJ,JK) + PRR(JI,JJ,JK)) & + + CST%XCI * (PRI_IN(JI,JJ,JK) + PRS(JI,JJ,JK) + PRG(JI,JJ,JK) + PRH(JI,JJ,JK)) + CASE(6) + ZCPH(JI,JJ,JK) = CST%XCPD + CST%XCPV * PRV_IN(JI,JJ,JK) & + + CST%XCL * (PRC_IN(JI,JJ,JK) + PRR(JI,JJ,JK)) & + + CST%XCI * (PRI_IN(JI,JJ,JK) + PRS(JI,JJ,JK) + PRG(JI,JJ,JK)) + CASE(5) + ZCPH(JI,JJ,JK) = CST%XCPD + CST%XCPV * PRV_IN(JI,JJ,JK) & + + CST%XCL * (PRC_IN(JI,JJ,JK) + PRR(JI,JJ,JK)) & + + CST%XCI * (PRI_IN(JI,JJ,JK) + PRS(JI,JJ,JK)) + CASE(3) + ZCPH(JI,JJ,JK) = CST%XCPD + CST%XCPV * PRV_IN(JI,JJ,JK) & + + CST%XCL * (PRC_IN(JI,JJ,JK) + PRR(JI,JJ,JK)) + CASE(2) + ZCPH(JI,JJ,JK) = CST%XCPD + CST%XCPV * PRV_IN(JI,JJ,JK) & + + CST%XCL * PRC_IN(JI,JJ,JK) + END SELECT + ENDDO + ENDDO +ENDDO ! IF ( OSUBG_COND ) THEN ! @@ -468,10 +467,10 @@ IF ( OSUBG_COND ) THEN ! ! PSRC= s'rci'/Sigma_s^2 ! ZT is INOUT - CALL CONDENSATION(IIU, IJU, IKU, IIB, IIE, IJB, IJE, IKB, IKE, KKL, & + CALL CONDENSATION(D, CST, ICEP, NEB, & HFRAC_ICE, HCONDENS, HLAMBDA3, & PPABST, PZZ, PRHODREF, ZT, PRV_IN, PRV_OUT, PRC_IN, PRC_OUT, PRI_IN, PRI_OUT, & - PRS, PRG, PSIGS, PMFCONV, PCLDFR, & + PRS, PRG, PSIGS, LMFCONV, PMFCONV, PCLDFR, & PSRCS, .TRUE., OSIGMAS, & OCND2, PSIGQSAT, & PLV=ZLV, PLS=ZLS, PCPH=ZCPH, & @@ -487,10 +486,10 @@ ELSE ZSIGQSAT(:,:)=0. !We use ZSRCS because in Méso-NH, PSRCS can be a zero-length array in this case !ZT is INOUT - CALL CONDENSATION(IIU, IJU, IKU, IIB, IIE, IJB, IJE, IKB, IKE, KKL, & + CALL CONDENSATION(D, CST, ICEP, NEB, & HFRAC_ICE, HCONDENS, HLAMBDA3, & PPABST, PZZ, PRHODREF, ZT, PRV_IN, PRV_OUT, PRC_IN, PRC_OUT, PRI_IN, PRI_OUT, & - PRS, PRG, ZSIGS, PMFCONV, PCLDFR, & + PRS, PRG, ZSIGS, LMFCONV, PMFCONV, PCLDFR, & ZSRCS, .TRUE., OSIGMAS=.TRUE., & OCND2=OCND2, PSIGQSAT=ZSIGQSAT, & PLV=ZLV, PLS=ZLS, PCPH=ZCPH, & diff --git a/src/common/micro/modd_neb.F90 b/src/common/micro/modd_neb.F90 index 984059f4388bbec0b3a1b22a256d50c78aa6d0a9..03fa2ecc04c72fc2572ed7c30a7c5cc7dd06afb5 100644 --- a/src/common/micro/modd_neb.F90 +++ b/src/common/micro/modd_neb.F90 @@ -36,8 +36,14 @@ ! IMPLICIT NONE ! -REAL,SAVE :: XTMINMIX ! minimum temperature of mixed phase -REAL,SAVE :: XTMAXMIX ! maximum temperature of mixed phase +TYPE NEB_t + REAL :: XTMINMIX ! minimum temperature of mixed phase + REAL :: XTMAXMIX ! maximum temperature of mixed phase +END TYPE NEB_t + +TYPE(NEB_t), SAVE, TARGET :: NEB + +REAL, POINTER :: XTMINMIX=>NEB%XTMINMIX, XTMAXMIX=>NEB%XTMAXMIX ! ! END MODULE MODD_NEB diff --git a/src/common/micro/modd_rain_ice_param.F90 b/src/common/micro/modd_rain_ice_param.F90 index 7568e2a68efc91b9081f88ca55d426724038c3fc..4b6951a4169ed8d6aa9c363e9e9fb90827de1265 100644 --- a/src/common/micro/modd_rain_ice_param.F90 +++ b/src/common/micro/modd_rain_ice_param.F90 @@ -40,39 +40,40 @@ ! IMPLICIT NONE ! -REAL,DIMENSION(2),SAVE :: XFSEDC ! Constants for sedimentation fluxes of C -REAL,SAVE :: XFSEDR,XEXSEDR, & ! Constants for sedimentation +TYPE RAIN_ICE_PARAM_t +REAL,DIMENSION(2) :: XFSEDC ! Constants for sedimentation fluxes of C +REAL :: XFSEDR,XEXSEDR, & ! Constants for sedimentation XFSEDI,XEXCSEDI,XEXRSEDI, & ! fluxes of R, I, S and G XFSEDS,XEXSEDS, & XFSEDG,XEXSEDG ! -REAL,SAVE :: XNU10,XALPHA1,XBETA1, & ! Constants for heterogeneous +REAL :: XNU10,XALPHA1,XBETA1, & ! Constants for heterogeneous XNU20,XALPHA2,XBETA2, & ! ice nucleation : HEN XMNU0 ! mass of nucleated ice crystal ! -REAL,SAVE :: XALPHA3,XBETA3, & ! Constants for homogeneous +REAL :: XALPHA3,XBETA3, & ! Constants for homogeneous XHON ! ice nucleation : HON ! -REAL,SAVE :: XSCFAC, & ! Constants for raindrop +REAL :: 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 ! -REAL,SAVE :: XTIMAUTI,XTEXAUTI,XCRIAUTI, & ! Constants for pristine ice +REAL :: XTIMAUTI,XTEXAUTI,XCRIAUTI, & ! Constants for pristine ice XT0CRIAUTI,XACRIAUTI,XBCRIAUTI ! autoconversion : AUT ! -REAL,SAVE :: XCOLIS,XCOLEXIS, & ! Constants for snow +REAL :: XCOLIS,XCOLEXIS, & ! Constants for snow XFIAGGS, & ! aggregation : AGG XEXIAGGS ! -REAL,SAVE :: XTIMAUTC, & ! Constants for cloud droplet +REAL :: XTIMAUTC, & ! Constants for cloud droplet XCRIAUTC ! autoconversion : AUT ! -REAL,SAVE :: XFCACCR, & ! Constants for cloud droplet +REAL :: XFCACCR, & ! Constants for cloud droplet XEXCACCR ! accretion on raindrops : ACC ! -REAL,SAVE :: XDCSLIM,XCOLCS, & ! Constants for the riming of +REAL :: XDCSLIM,XCOLCS, & ! Constants for the riming of XEXCRIMSS,XCRIMSS, & ! the aggregates : RIM XEXCRIMSG,XCRIMSG, & ! XEXSRIMCG,XSRIMCG, & ! @@ -82,13 +83,13 @@ REAL,SAVE :: XDCSLIM,XCOLCS, & ! Constants for the riming of XGAMINC_BOUND_MAX, & ! Max val. of Lbda_s for RIM XRIMINTP1,XRIMINTP2 ! Csts for lin. interpol. of ! the tab. incomplete Gamma law -INTEGER,SAVE :: NGAMINC ! Number of tab. Lbda_s -REAL, DIMENSION(:), SAVE, ALLOCATABLE & +INTEGER :: NGAMINC ! Number of tab. Lbda_s +REAL, DIMENSION(:), ALLOCATABLE & :: XGAMINC_RIM1, & ! Tab. incomplete Gamma funct. XGAMINC_RIM2, & ! for XDS+2 and for XBS XGAMINC_RIM4 ! and for 2+XDS+XBS-XBG ! -REAL,SAVE :: XFRACCSS, & ! Constants for the accretion +REAL :: XFRACCSS, & ! Constants for the accretion XLBRACCS1,XLBRACCS2,XLBRACCS3, & ! raindrops onto the aggregates XFSACCRG, & ! ACC (processes RACCSS and XLBSACCR1,XLBSACCR2,XLBSACCR3, & ! SACCRG) @@ -100,22 +101,22 @@ REAL,SAVE :: XFRACCSS, & ! Constants for the accretion XACCINTP1R,XACCINTP2R ! Lbda_s and Lbda_r in the ! XKER_RACCSS and XKER_SACCRG ! tables -INTEGER,SAVE :: NACCLBDAS, & ! Number of Lbda_s values and +INTEGER :: NACCLBDAS, & ! Number of Lbda_s values and NACCLBDAR ! of Lbda_r values in the ! XKER_RACCSS and XKER_SACCRG ! tables -REAL,DIMENSION(:,:), SAVE, ALLOCATABLE & +REAL,DIMENSION(:,:), ALLOCATABLE & :: XKER_RACCSS, & ! Normalized kernel for RACCSS XKER_RACCS, & ! Normalized kernel for RACCS XKER_SACCRG ! Normalized kernel for SACCRG -REAL,SAVE :: XFSCVMG ! Melting-conversion factor of +REAL :: XFSCVMG ! Melting-conversion factor of ! the aggregates ! -REAL,SAVE :: XCOLIR, & ! Constants for rain contact +REAL :: XCOLIR, & ! Constants for rain contact XEXRCFRI,XRCFRI, & ! freezing : CFR XEXICFRR,XICFRR ! ! -REAL,SAVE :: XFCDRYG, & ! Constants for the dry growth +REAL :: XFCDRYG, & ! Constants for the dry growth XCOLIG,XCOLEXIG,XFIDRYG, & ! of the graupeln : DRY XFIDRYG2, XEXFIDRYG, & XCOLSG,XCOLEXSG,XFSDRYG, & ! processes RCDRYG @@ -132,27 +133,27 @@ REAL,SAVE :: XFCDRYG, & ! Constants for the dry growth XDRYINTP1S,XDRYINTP2S, & ! Lbda_r, Lbda_s and Lbda_g in XDRYINTP1G,XDRYINTP2G ! the XKER_SDRYG and XKER_RDRYG ! tables -INTEGER,SAVE :: NDRYLBDAR, & ! Number of Lbda_r, +INTEGER :: NDRYLBDAR, & ! Number of Lbda_r, NDRYLBDAS, & ! of Lbda_s and NDRYLBDAG ! of Lbda_g values in ! the XKER_SDRYG and XKER_RDRYG ! tables -REAL,DIMENSION(:,:), SAVE, ALLOCATABLE & +REAL,DIMENSION(:,:), ALLOCATABLE & :: XKER_SDRYG, & ! Normalized kernel for SDRYG XKER_RDRYG ! Normalized kernel for RDRYG ! ! addition of Hail category ! -REAL,SAVE :: XFSEDH,XEXSEDH ! Constants for sedimentation +REAL :: XFSEDH,XEXSEDH ! Constants for sedimentation ! ! -REAL,SAVE :: X0DEPH,X1DEPH,XEX0DEPH,XEX1DEPH ! Constants for deposition +REAL :: X0DEPH,X1DEPH,XEX0DEPH,XEX1DEPH ! Constants for deposition ! -REAL,SAVE :: XCOLIH, XCOLEXIH, & ! Constants for the dry growth +REAL :: XCOLIH, XCOLEXIH, & ! Constants for the dry growth & XCOLSH, XCOLEXSH, & ! of the hail & XCOLGH, XCOLEXGH ! ! -REAL,SAVE :: XFWETH,XFSWETH, & ! Constants for the wet growth +REAL :: XFWETH,XFSWETH, & ! Constants for the wet growth XLBSWETH1,XLBSWETH2,XLBSWETH3, & ! of the hailstones : WET XFGWETH, & ! processes RSWETH XLBGWETH1,XLBGWETH2,XLBGWETH3, & ! RGWETH @@ -171,15 +172,248 @@ REAL,SAVE :: XFWETH,XFSWETH, & ! Constants for the wet growth XWETINTP1R,XWETINTP2R, & ! and Lbda_h in XWETINTP1H,XWETINTP2H ! the XKER_SWETH, XKER_GWETH ! and XKER_RWETH tables -INTEGER,SAVE :: NWETLBDAS, & ! Number of Lbda_s, +INTEGER :: NWETLBDAS, & ! Number of Lbda_s, NWETLBDAG, & ! of Lbda_g, NWETLBDAR, & ! of Lbda_r and NWETLBDAH ! of Lbda_h values in ! the XKER_SWETH, XKER_GWETH ! and XKER_RWETH tables -REAL,DIMENSION(:,:), SAVE, ALLOCATABLE & +REAL,DIMENSION(:,:), ALLOCATABLE & :: XKER_SWETH, & ! Normalized kernel for SWETH XKER_GWETH, & ! Normalized kernel for GWETH XKER_RWETH ! Normalized kernel for RWETH +END TYPE RAIN_ICE_PARAM_t ! +TYPE(RAIN_ICE_PARAM_t), SAVE, TARGET :: RAIN_ICE_PARAM +! +REAL,DIMENSION(:),POINTER :: XFSEDC => NULL() + +REAL,POINTER :: XFSEDR => RAIN_ICE_PARAM%XFSEDR, & + XEXSEDR => RAIN_ICE_PARAM%XEXSEDR, & + XFSEDI => RAIN_ICE_PARAM%XFSEDI, & + XEXCSEDI => RAIN_ICE_PARAM%XEXCSEDI, & + XEXRSEDI => RAIN_ICE_PARAM%XEXRSEDI, & + XFSEDS => RAIN_ICE_PARAM%XFSEDS, & + XEXSEDS => RAIN_ICE_PARAM%XEXSEDS, & + XFSEDG => RAIN_ICE_PARAM%XFSEDG, & + XEXSEDG => RAIN_ICE_PARAM%XEXSEDG, & + XNU10 => RAIN_ICE_PARAM%XNU10, & + XALPHA1 => RAIN_ICE_PARAM%XALPHA1, & + XBETA1 => RAIN_ICE_PARAM%XBETA1, & + XNU20 => RAIN_ICE_PARAM%XNU20, & + XALPHA2 => RAIN_ICE_PARAM%XALPHA2, & + XBETA2 => RAIN_ICE_PARAM%XBETA2, & + XMNU0 => RAIN_ICE_PARAM%XMNU0, & + XALPHA3 => RAIN_ICE_PARAM%XALPHA3, & + XBETA3 => RAIN_ICE_PARAM%XBETA3, & + XHON => RAIN_ICE_PARAM%XHON, & + XSCFAC => RAIN_ICE_PARAM%XSCFAC, & + X0EVAR => RAIN_ICE_PARAM%X0EVAR, & + X1EVAR => RAIN_ICE_PARAM%X1EVAR, & + XEX0EVAR => RAIN_ICE_PARAM%XEX0EVAR, & + XEX1EVAR => RAIN_ICE_PARAM%XEX1EVAR, & + X0DEPI => RAIN_ICE_PARAM%X0DEPI, & + X2DEPI => RAIN_ICE_PARAM%X2DEPI, & + X0DEPS => RAIN_ICE_PARAM%X0DEPS, & + X1DEPS => RAIN_ICE_PARAM%X1DEPS, & + XEX0DEPS => RAIN_ICE_PARAM%XEX0DEPS, & + XEX1DEPS => RAIN_ICE_PARAM%XEX1DEPS, & + X0DEPG => RAIN_ICE_PARAM%X0DEPG, & + X1DEPG => RAIN_ICE_PARAM%X1DEPG, & + XEX0DEPG => RAIN_ICE_PARAM%XEX0DEPG, & + XEX1DEPG => RAIN_ICE_PARAM%XEX1DEPG, & + XTIMAUTI => RAIN_ICE_PARAM%XTIMAUTI, & + XTEXAUTI => RAIN_ICE_PARAM%XTEXAUTI, & + XCRIAUTI => RAIN_ICE_PARAM%XCRIAUTI, & + XT0CRIAUTI => RAIN_ICE_PARAM%XT0CRIAUTI, & + XACRIAUTI => RAIN_ICE_PARAM%XACRIAUTI, & + XBCRIAUTI => RAIN_ICE_PARAM%XBCRIAUTI, & + XCOLIS => RAIN_ICE_PARAM%XCOLIS, & + XCOLEXIS => RAIN_ICE_PARAM%XCOLEXIS, & + XFIAGGS => RAIN_ICE_PARAM%XFIAGGS, & + XEXIAGGS => RAIN_ICE_PARAM%XEXIAGGS, & + XTIMAUTC => RAIN_ICE_PARAM%XTIMAUTC, & + XCRIAUTC => RAIN_ICE_PARAM%XCRIAUTC, & + XFCACCR => RAIN_ICE_PARAM%XFCACCR, & + XEXCACCR => RAIN_ICE_PARAM%XEXCACCR, & + XDCSLIM => RAIN_ICE_PARAM%XDCSLIM, & + XCOLCS => RAIN_ICE_PARAM%XCOLCS, & + XEXCRIMSS => RAIN_ICE_PARAM%XEXCRIMSS, & + XCRIMSS => RAIN_ICE_PARAM%XCRIMSS, & + XEXCRIMSG => RAIN_ICE_PARAM%XEXCRIMSG, & + XCRIMSG => RAIN_ICE_PARAM%XCRIMSG, & + XEXSRIMCG => RAIN_ICE_PARAM%XEXSRIMCG, & + XSRIMCG => RAIN_ICE_PARAM%XSRIMCG, & + XEXSRIMCG2 => RAIN_ICE_PARAM%XEXSRIMCG2, & + XSRIMCG2 => RAIN_ICE_PARAM%XSRIMCG2, & + XSRIMCG3 => RAIN_ICE_PARAM%XSRIMCG3, & + XGAMINC_BOUND_MIN => RAIN_ICE_PARAM%XGAMINC_BOUND_MIN, & + XGAMINC_BOUND_MAX => RAIN_ICE_PARAM%XGAMINC_BOUND_MAX, & + XRIMINTP1 => RAIN_ICE_PARAM%XRIMINTP1, & + XRIMINTP2 => RAIN_ICE_PARAM%XRIMINTP2, & + XFRACCSS => RAIN_ICE_PARAM%XFRACCSS, & + XLBRACCS1 => RAIN_ICE_PARAM%XLBRACCS1, & + XLBRACCS2 => RAIN_ICE_PARAM%XLBRACCS2, & + XLBRACCS3 => RAIN_ICE_PARAM%XLBRACCS3, & + XFSACCRG => RAIN_ICE_PARAM%XFSACCRG, & + XLBSACCR1 => RAIN_ICE_PARAM%XLBSACCR1, & + XLBSACCR2 => RAIN_ICE_PARAM%XLBSACCR2, & + XLBSACCR3 => RAIN_ICE_PARAM%XLBSACCR3, & + XACCLBDAS_MIN => RAIN_ICE_PARAM%XACCLBDAS_MIN, & + XACCLBDAS_MAX => RAIN_ICE_PARAM%XACCLBDAS_MAX, & + XACCLBDAR_MIN => RAIN_ICE_PARAM%XACCLBDAR_MIN, & + XACCLBDAR_MAX => RAIN_ICE_PARAM%XACCLBDAR_MAX, & + XACCINTP1S => RAIN_ICE_PARAM%XACCINTP1S, & + XACCINTP2S => RAIN_ICE_PARAM%XACCINTP2S, & + XACCINTP1R => RAIN_ICE_PARAM%XACCINTP1R, & + XACCINTP2R => RAIN_ICE_PARAM%XACCINTP2R, & + XFSCVMG => RAIN_ICE_PARAM%XFSCVMG, & + XCOLIR => RAIN_ICE_PARAM%XCOLIR, & + XEXRCFRI => RAIN_ICE_PARAM%XEXRCFRI, & + XRCFRI => RAIN_ICE_PARAM%XRCFRI, & + XEXICFRR => RAIN_ICE_PARAM%XEXICFRR, & + XICFRR => RAIN_ICE_PARAM%XICFRR, & + XFCDRYG => RAIN_ICE_PARAM%XFCDRYG, & + XCOLIG => RAIN_ICE_PARAM%XCOLIG, & + XCOLEXIG => RAIN_ICE_PARAM%XCOLEXIG, & + XFIDRYG => RAIN_ICE_PARAM%XFIDRYG, & + XFIDRYG2 => RAIN_ICE_PARAM%XFIDRYG2, & + XEXFIDRYG => RAIN_ICE_PARAM%XEXFIDRYG, & + XCOLSG => RAIN_ICE_PARAM%XCOLSG, & + XCOLEXSG => RAIN_ICE_PARAM%XCOLEXSG, & + XFSDRYG => RAIN_ICE_PARAM%XFSDRYG, & + XLBSDRYG1 => RAIN_ICE_PARAM%XLBSDRYG1, & + XLBSDRYG2 => RAIN_ICE_PARAM%XLBSDRYG2, & + XLBSDRYG3 => RAIN_ICE_PARAM%XLBSDRYG3, & + XFRDRYG => RAIN_ICE_PARAM%XFRDRYG, & + XLBRDRYG1 => RAIN_ICE_PARAM%XLBRDRYG1, & + XLBRDRYG2 => RAIN_ICE_PARAM%XLBRDRYG2, & + XLBRDRYG3 => RAIN_ICE_PARAM%XLBRDRYG3, & + XDRYLBDAR_MIN => RAIN_ICE_PARAM%XDRYLBDAR_MIN, & + XDRYLBDAR_MAX => RAIN_ICE_PARAM%XDRYLBDAR_MAX, & + XDRYLBDAS_MIN => RAIN_ICE_PARAM%XDRYLBDAS_MIN, & + XDRYLBDAS_MAX => RAIN_ICE_PARAM%XDRYLBDAS_MAX, & + XDRYLBDAG_MIN => RAIN_ICE_PARAM%XDRYLBDAG_MIN, & + XDRYLBDAG_MAX => RAIN_ICE_PARAM%XDRYLBDAG_MAX, & + XDRYINTP1R => RAIN_ICE_PARAM%XDRYINTP1R, & + XDRYINTP2R => RAIN_ICE_PARAM%XDRYINTP2R, & + XDRYINTP1S => RAIN_ICE_PARAM%XDRYINTP1S, & + XDRYINTP2S => RAIN_ICE_PARAM%XDRYINTP2S, & + XDRYINTP1G => RAIN_ICE_PARAM%XDRYINTP1G, & + XDRYINTP2G => RAIN_ICE_PARAM%XDRYINTP2G, & + XFSEDH => RAIN_ICE_PARAM%XFSEDH, & + XEXSEDH => RAIN_ICE_PARAM%XEXSEDH, & + X0DEPH => RAIN_ICE_PARAM%X0DEPH, & + X1DEPH => RAIN_ICE_PARAM%X1DEPH, & + XEX0DEPH => RAIN_ICE_PARAM%XEX0DEPH, & + XEX1DEPH => RAIN_ICE_PARAM%XEX1DEPH, & + XCOLIH => RAIN_ICE_PARAM%XCOLIH, & + XCOLEXIH => RAIN_ICE_PARAM%XCOLEXIH, & + XCOLSH => RAIN_ICE_PARAM%XCOLSH, & + XCOLEXSH => RAIN_ICE_PARAM%XCOLEXSH, & + XCOLGH => RAIN_ICE_PARAM%XCOLGH, & + XCOLEXGH => RAIN_ICE_PARAM%XCOLEXGH, & + XFWETH => RAIN_ICE_PARAM%XFWETH, & + XFSWETH => RAIN_ICE_PARAM%XFSWETH, & + XLBSWETH1 => RAIN_ICE_PARAM%XLBSWETH1, & + XLBSWETH2 => RAIN_ICE_PARAM%XLBSWETH2, & + XLBSWETH3 => RAIN_ICE_PARAM%XLBSWETH3, & + XFGWETH => RAIN_ICE_PARAM%XFGWETH, & + XLBGWETH1 => RAIN_ICE_PARAM%XLBGWETH1, & + XLBGWETH2 => RAIN_ICE_PARAM%XLBGWETH2, & + XLBGWETH3 => RAIN_ICE_PARAM%XLBGWETH3, & + XFRWETH => RAIN_ICE_PARAM%XFRWETH, & + XLBRWETH1 => RAIN_ICE_PARAM%XLBRWETH1, & + XLBRWETH2 => RAIN_ICE_PARAM%XLBRWETH2, & + XLBRWETH3 => RAIN_ICE_PARAM%XLBRWETH3, & + XWETLBDAS_MIN => RAIN_ICE_PARAM%XWETLBDAS_MIN, & + XWETLBDAS_MAX => RAIN_ICE_PARAM%XWETLBDAS_MAX, & + XWETLBDAG_MIN => RAIN_ICE_PARAM%XWETLBDAG_MIN, & + XWETLBDAG_MAX => RAIN_ICE_PARAM%XWETLBDAG_MAX, & + XWETLBDAR_MIN => RAIN_ICE_PARAM%XWETLBDAR_MIN, & + XWETLBDAR_MAX => RAIN_ICE_PARAM%XWETLBDAR_MAX, & + XWETLBDAH_MIN => RAIN_ICE_PARAM%XWETLBDAH_MIN, & + XWETLBDAH_MAX => RAIN_ICE_PARAM%XWETLBDAH_MAX, & + XWETINTP1S => RAIN_ICE_PARAM%XWETINTP1S, & + XWETINTP2S => RAIN_ICE_PARAM%XWETINTP2S, & + XWETINTP1G => RAIN_ICE_PARAM%XWETINTP1G, & + XWETINTP2G => RAIN_ICE_PARAM%XWETINTP2G, & + XWETINTP1R => RAIN_ICE_PARAM%XWETINTP1R, & + XWETINTP2R => RAIN_ICE_PARAM%XWETINTP2R, & + XWETINTP1H => RAIN_ICE_PARAM%XWETINTP1H, & + XWETINTP2H => RAIN_ICE_PARAM%XWETINTP2H + +INTEGER, POINTER :: NGAMINC => RAIN_ICE_PARAM%NGAMINC, & + NACCLBDAS => RAIN_ICE_PARAM%NACCLBDAS, & + NACCLBDAR => RAIN_ICE_PARAM%NACCLBDAR, & + NDRYLBDAR => RAIN_ICE_PARAM%NDRYLBDAR, & + NDRYLBDAS => RAIN_ICE_PARAM%NDRYLBDAS, & + NDRYLBDAG => RAIN_ICE_PARAM%NDRYLBDAG, & + NWETLBDAS => RAIN_ICE_PARAM%NWETLBDAS, & + NWETLBDAG => RAIN_ICE_PARAM%NWETLBDAG, & + NWETLBDAR => RAIN_ICE_PARAM%NWETLBDAR, & + NWETLBDAH => RAIN_ICE_PARAM%NWETLBDAH + +REAL, DIMENSION(:), POINTER :: XGAMINC_RIM1 => NULL(), & + XGAMINC_RIM2 => NULL(), & + XGAMINC_RIM4 => NULL() + +REAL,DIMENSION(:,:), POINTER :: XKER_RACCSS => NULL(), & + XKER_RACCS => NULL(), & + XKER_SACCRG => NULL(), & + XKER_SDRYG => NULL(), & + XKER_RDRYG => NULL(), & + XKER_SWETH => NULL(), & + XKER_GWETH => NULL(), & + XKER_RWETH => NULL() +CONTAINS +SUBROUTINE RAIN_ICE_INIT() + IMPLICIT NONE + XFSEDC => RAIN_ICE_PARAM%XFSEDC +END SUBROUTINE RAIN_ICE_INIT +SUBROUTINE RAIN_ICE_ALLOCATE(HNAME, KDIM1, KDIM2) + IMPLICIT NONE + CHARACTER(LEN=*), INTENT(IN) :: HNAME + INTEGER, INTENT(IN) :: KDIM1 + INTEGER, OPTIONAL, INTENT(IN) :: KDIM2 + + SELECT CASE(TRIM(HNAME)) + !1D arrays + CASE('XGAMINC_RIM1') + ALLOCATE(RAIN_ICE_PARAM%XGAMINC_RIM1(KDIM1)) + XGAMINC_RIM1 => RAIN_ICE_PARAM%XGAMINC_RIM1 + CASE('XGAMINC_RIM2') + ALLOCATE(RAIN_ICE_PARAM%XGAMINC_RIM2(KDIM1)) + XGAMINC_RIM2 => RAIN_ICE_PARAM%XGAMINC_RIM2 + CASE('XGAMINC_RIM4') + ALLOCATE(RAIN_ICE_PARAM%XGAMINC_RIM4(KDIM1)) + XGAMINC_RIM4 => RAIN_ICE_PARAM%XGAMINC_RIM4 + ! + !2D arrays + CASE('XKER_RACCSS') + ALLOCATE(RAIN_ICE_PARAM%XKER_RACCSS(KDIM1, KDIM2)) + XKER_RACCSS=> RAIN_ICE_PARAM%XKER_RACCSS + CASE('XKER_RACCS') + ALLOCATE(RAIN_ICE_PARAM%XKER_RACCS(KDIM1, KDIM2)) + XKER_RACCS=> RAIN_ICE_PARAM%XKER_RACCS + CASE('XKER_SACCRG') + ALLOCATE(RAIN_ICE_PARAM%XKER_SACCRG(KDIM1, KDIM2)) + XKER_SACCRG=> RAIN_ICE_PARAM%XKER_SACCRG + CASE('XKER_SDRYG') + ALLOCATE(RAIN_ICE_PARAM%XKER_SDRYG(KDIM1, KDIM2)) + XKER_SDRYG=> RAIN_ICE_PARAM%XKER_SDRYG + CASE('XKER_RDRYG') + ALLOCATE(RAIN_ICE_PARAM%XKER_RDRYG(KDIM1, KDIM2)) + XKER_RDRYG=> RAIN_ICE_PARAM%XKER_RDRYG + CASE('XKER_SWETH') + ALLOCATE(RAIN_ICE_PARAM%XKER_SWETH(KDIM1, KDIM2)) + XKER_SWETH=> RAIN_ICE_PARAM%XKER_SWETH + CASE('XKER_GWETH') + ALLOCATE(RAIN_ICE_PARAM%XKER_GWETH(KDIM1, KDIM2)) + XKER_GWETH=> RAIN_ICE_PARAM%XKER_GWETH + CASE('XKER_RWETH') + ALLOCATE(RAIN_ICE_PARAM%XKER_RWETH(KDIM1, KDIM2)) + XKER_RWETH=> RAIN_ICE_PARAM%XKER_RWETH + END SELECT +END SUBROUTINE RAIN_ICE_ALLOCATE END MODULE MODD_RAIN_ICE_PARAM diff --git a/src/common/micro/mode_compute_frac_ice.F90 b/src/common/micro/mode_compute_frac_ice.F90 deleted file mode 100644 index ba2dffd7f4d00f2d141934eddc384cf10ee55f17..0000000000000000000000000000000000000000 --- a/src/common/micro/mode_compute_frac_ice.F90 +++ /dev/null @@ -1,93 +0,0 @@ -!MNH_LIC Copyright 2006-2019 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 MODE_COMPUTE_FRAC_ICE -! ############################ -! -!!**** *COMPUTE_FRAC_ICE* - computes ice fraction -!! -!! PURPOSE -!! ------- -!! -!!** METHOD -!! ------ -!! -!! -!! EXTERNAL -!! -------- -!! -!! IMPLICIT ARGUMENTS -!! ------------------ -!! -!! -!! REFERENCE -!! --------- -!! -!! AUTHOR -!! ------ -!! Julien PERGAUD * Meteo-France * -!! -!! MODIFICATIONS -!! ------------- -!! Original 13/03/06 -!! S. Riette April 2011 optimisation -!! S. Riette 08/2016 add option O -!! P. Wautelet 10/04/2019: replace ABORT and STOP calls by Print_msg -!! R. El Khatib 24-Aug-2021 Optimization by cache re-use + assume data is contiguous -!! S. Riette Jan-2022 Merge the 3 procedures in one module + array shape declaration -! R. El Khatib / S. Riette Jan-2022 written as an elemental subroutine -! -! -! - - -!****************** Don't use drHook !!! - - - -IMPLICIT NONE -CONTAINS - -ELEMENTAL SUBROUTINE COMPUTE_FRAC_ICE(HFRAC_ICE, PFRAC_ICE, PT, KERR) -!! -------------------------------------------------------------------------- -! 0. DECLARATIONS -! ------------ -! -USE MODD_NEB, ONLY : XTMINMIX, XTMAXMIX -USE MODD_CST, ONLY : XTT -! -IMPLICIT NONE -! -! -!* 0.1 declarations of arguments -! -CHARACTER(LEN=1), INTENT(IN) :: HFRAC_ICE ! scheme to use -REAL, INTENT(IN) :: PT ! Temperature -REAL, INTENT(INOUT) :: PFRAC_ICE ! Ice fraction (1 for ice only, 0 for liquid only) -INTEGER, INTENT(OUT) :: KERR ! Error code in return -! -! 0.2 declaration of local variables -! -!------------------------------------------------------------------------ -! 1. Compute FRAC_ICE -! -KERR=0 -SELECT CASE(HFRAC_ICE) - CASE ('T') !using Temperature - PFRAC_ICE = MAX( 0., MIN(1., (( XTMAXMIX - PT ) / ( XTMAXMIX - XTMINMIX )) ) ) ! freezing interval - CASE ('O') !using Temperature with old formulae - PFRAC_ICE = MAX( 0., MIN(1., (( XTT - PT ) / 40.) ) ) ! freezing interval - CASE ('N') !No ice - PFRAC_ICE = 0. - CASE ('S') !Same as previous - ! (almost) nothing to do - PFRAC_ICE = MAX( 0., MIN(1., PFRAC_ICE ) ) - CASE DEFAULT - KERR=1 -END SELECT -! -END SUBROUTINE COMPUTE_FRAC_ICE -! -END MODULE MODE_COMPUTE_FRAC_ICE diff --git a/src/common/micro/modi_condensation.F90 b/src/common/micro/modi_condensation.F90 index 7163e82088c944853c5f5f65a30a6f8eeac923fa..22b37318f3669c624442328ad957e21a1548c950 100644 --- a/src/common/micro/modi_condensation.F90 +++ b/src/common/micro/modi_condensation.F90 @@ -4,35 +4,36 @@ ! INTERFACE ! - SUBROUTINE CONDENSATION( KIU, KJU, KKU, KIB, KIE, KJB, KJE, KKB, KKE, KKL,& + SUBROUTINE CONDENSATION(D, CST, ICEP, NEB, & HFRAC_ICE, HCONDENS, HLAMBDA3, & PPABS, PZZ, PRHODREF, PT, PRV_IN, PRV_OUT, PRC_IN, PRC_OUT, PRI_IN, PRI_OUT, & - PRS, PRG, PSIGS, PMFCONV, PCLDFR, PSIGRC, OUSERI,& + PRS, PRG, PSIGS, LMFCONV, PMFCONV, PCLDFR, PSIGRC, OUSERI,& OSIGMAS, OCND2, PSIGQSAT, & PLV, PLS, PCPH, & PHLC_HRC, PHLC_HCF, PHLI_HRI, PHLI_HCF, PICE_CLD_WGT) ! -USE MODD_SPP_TYPE +USE MODD_DIMPHYEX, ONLY: DIMPHYEX_t +USE MODD_CST, ONLY: CST_t +USE MODD_NEB, ONLY: NEB_t +USE MODD_RAIN_ICE_PARAM, ONLY: RAIN_ICE_PARAM_t ! -INTEGER, INTENT(IN) :: KIU ! horizontal dimension in x -INTEGER, INTENT(IN) :: KJU ! horizontal dimension in y -INTEGER, INTENT(IN) :: KKU ! vertical dimension -INTEGER, INTENT(IN) :: KIB ! value of the first point in x -INTEGER, INTENT(IN) :: KIE ! value of the last point in x -INTEGER, INTENT(IN) :: KJB ! value of the first point in y -INTEGER, INTENT(IN) :: KJE ! value of the last point in y -INTEGER, INTENT(IN) :: KKB ! value of the first point in z -INTEGER, INTENT(IN) :: KKE ! value of the last point in z -INTEGER, INTENT(IN) :: KKL ! +1 if grid goes from ground to atmosphere top, -1 otherwise +TYPE(DIMPHYEX_t), INTENT(IN) :: D +TYPE(CST_t), INTENT(IN) :: CST +TYPE(RAIN_ICE_PARAM_t), INTENT(IN) :: ICEP +TYPE(NEB_t), INTENT(IN) :: NEB CHARACTER(LEN=1), INTENT(IN) :: HFRAC_ICE CHARACTER(LEN=4), INTENT(IN) :: HCONDENS CHARACTER(LEN=*), INTENT(IN) :: HLAMBDA3 ! formulation for lambda3 coeff -REAL, DIMENSION(KIU,KJU,KKU), INTENT(IN) :: PPABS ! pressure (Pa) -REAL, DIMENSION(KIU,KJU,KKU), INTENT(IN) :: PZZ ! height of model levels (m) -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 +REAL, DIMENSION(D%NIT,D%NJT,D%NKT), INTENT(IN) :: PPABS ! pressure (Pa) +REAL, DIMENSION(D%NIT,D%NJT,D%NKT), INTENT(IN) :: PZZ ! height of model levels (m) +REAL, DIMENSION(D%NIT,D%NJT,D%NKT), INTENT(IN) :: PRHODREF +REAL, DIMENSION(D%NIT,D%NJT,D%NKT), INTENT(INOUT) :: PT ! grid scale T (K) +REAL, DIMENSION(D%NIT,D%NJT,D%NKT), INTENT(IN) :: PRV_IN ! grid scale water vapor mixing ratio (kg/kg) in input +REAL, DIMENSION(D%NIT,D%NJT,D%NKT), INTENT(OUT) :: PRV_OUT! grid scale water vapor mixing ratio (kg/kg) in output +REAL, DIMENSION(D%NIT,D%NJT,D%NKT), INTENT(IN) :: PRC_IN ! grid scale r_c mixing ratio (kg/kg) in input +REAL, DIMENSION(D%NIT,D%NJT,D%NKT), INTENT(OUT) :: PRC_OUT! grid scale r_c mixing ratio (kg/kg) in output +REAL, DIMENSION(D%NIT,D%NJT,D%NKT), INTENT(IN) :: PRI_IN ! grid scale r_i (kg/kg) in input +REAL, DIMENSION(D%NIT,D%NJT,D%NKT), INTENT(OUT) :: PRI_OUT! grid scale r_i (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.) @@ -40,27 +41,27 @@ LOGICAL, INTENT(IN) :: OSIGMAS! use present global Sigma ! 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) +REAL, DIMENSION(D%NIT,D%NJT), 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 -REAL, DIMENSION(KIU,KJU,KKU), INTENT(OUT) :: PRI_OUT! grid scale r_i (kg/kg) in output -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(D%NIT,D%NJT,D%NKT), INTENT(IN) :: PRS ! grid scale mixing ration of snow (kg/kg) +REAL, DIMENSION(D%NIT,D%NJT,D%NKT), INTENT(IN) :: PRG ! grid scale mixing ration of graupel (kg/kg) +REAL, DIMENSION(D%NIT,D%NJT,D%NKT), INTENT(IN) :: PSIGS ! Sigma_s from turbulence scheme +LOGICAL, INTENT(IN) :: LMFCONV ! =SIZE(PMFCONV)!=0 +REAL, DIMENSION(MERGE(D%NIT,0,LMFCONV),& + MERGE(D%NJT,0,LMFCONV),& + MERGE(D%NKT,0,LMFCONV)), INTENT(IN) :: PMFCONV! convective mass flux (kg /s m^2) +REAL, DIMENSION(D%NIT,D%NJT,D%NKT), INTENT(OUT) :: PCLDFR ! cloud fraction +REAL, DIMENSION(D%NIT,D%NJT,D%NKT), INTENT(OUT) :: PSIGRC ! s r_c / sig_s^2 + +REAL, DIMENSION(D%NIT,D%NJT,D%NKT), OPTIONAL, INTENT(IN) :: PLV ! Latent heat L_v +REAL, DIMENSION(D%NIT,D%NJT,D%NKT), OPTIONAL, INTENT(IN) :: PLS ! Latent heat L_s +REAL, DIMENSION(D%NIT,D%NJT,D%NKT), OPTIONAL, INTENT(IN) :: PCPH ! Specific heat C_ph +REAL, DIMENSION(D%NIT,D%NJT,D%NKT), OPTIONAL, INTENT(OUT) :: PHLC_HRC +REAL, DIMENSION(D%NIT,D%NJT,D%NKT), OPTIONAL, INTENT(OUT) :: PHLC_HCF ! cloud fraction +REAL, DIMENSION(D%NIT,D%NJT,D%NKT), OPTIONAL, INTENT(OUT) :: PHLI_HRI +REAL, DIMENSION(D%NIT,D%NJT,D%NKT), OPTIONAL, INTENT(OUT) :: PHLI_HCF +REAL, DIMENSION(D%NIT,D%NJT), OPTIONAL, INTENT(IN) :: PICE_CLD_WGT -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 -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 END SUBROUTINE CONDENSATION ! END INTERFACE diff --git a/src/common/micro/modi_ice_adjust.F90 b/src/common/micro/modi_ice_adjust.F90 index e949147f50114a2a109eb8b12ec78096fad83ffc..9c962de2ca5877cab6692476b61fd92140be6d94 100644 --- a/src/common/micro/modi_ice_adjust.F90 +++ b/src/common/micro/modi_ice_adjust.F90 @@ -4,10 +4,11 @@ ! INTERFACE ! - SUBROUTINE ICE_ADJUST (KKA, KKU, KKL, KRR, HFRAC_ICE, HCONDENS, HLAMBDA3,& + SUBROUTINE ICE_ADJUST (D, CST, ICEP, NEB, BUCONF, KRR, & + HFRAC_ICE, HCONDENS, HLAMBDA3,& HBUNAME, OSUBG_COND, OSIGMAS, OCND2, HSUBG_MF_PDF,& PTSTEP, PSIGQSAT, & - PRHODJ, PEXNREF, PRHODREF, PSIGS, PMFCONV, & + PRHODJ, PEXNREF, PRHODREF, PSIGS, LMFCONV, PMFCONV,& PPABST, PZZ, & PEXN, PCF_MF, PRC_MF, PRI_MF, & PRV, PRC, PRVS, PRCS, PTH, PTHS, PSRCS, PCLDFR, & @@ -16,16 +17,22 @@ INTERFACE PHLC_HRC, PHLC_HCF, PHLI_HRI, PHLI_HCF, & TBUDGETS, KBUDGETS, & PICE_CLD_WGT) -USE MODD_BUDGET, ONLY: TBUDGETDATA +USE MODD_BUDGET, ONLY: TBUDGETDATA, TBUDGETCONF_t +USE MODD_CST, ONLY: CST_t +USE MODD_RAIN_ICE_PARAM, ONLY: RAIN_ICE_PARAM_t +USE MODD_NEB, ONLY: NEB_t +USE MODD_DIMPHYEX, ONLY: DIMPHYEX_t 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 +TYPE(DIMPHYEX_t), INTENT(IN) :: D +TYPE(CST_t), INTENT(IN) :: CST +TYPE(RAIN_ICE_PARAM_t), INTENT(IN) :: ICEP +TYPE(NEB_t), INTENT(IN) :: NEB +TYPE(TBUDGETCONF_t), INTENT(IN) :: BUCONF INTEGER, INTENT(IN) :: KRR ! Number of moist variables CHARACTER(LEN=1), INTENT(IN) :: HFRAC_ICE CHARACTER(LEN=80), INTENT(IN) :: HCONDENS @@ -42,50 +49,56 @@ LOGICAL :: OCND2 ! logical switch to sparate 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(D%NIT,D%NJT), 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(D%NIT,D%NJT,D%NKT), INTENT(IN) :: PRHODJ ! Dry density * Jacobian +REAL, DIMENSION(D%NIT,D%NJT,D%NKT), INTENT(IN) :: PEXNREF ! Reference Exner function +REAL, DIMENSION(D%NIT,D%NJT,D%NKT), 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(MERGE(D%NIT,0,OSUBG_COND),& + MERGE(D%NJT,0,OSUBG_COND),& + MERGE(D%NKT,0,OSUBG_COND)), INTENT(IN) :: PSIGS ! Sigma_s at time t +LOGICAL, INTENT(IN) :: LMFCONV ! =SIZE(PMFCONV)!=0 +REAL, DIMENSION(MERGE(D%NIT,0,LMFCONV),& + MERGE(D%NJT,0,LMFCONV),& + MERGE(D%NKT,0,LMFCONV)), INTENT(IN) :: PMFCONV ! convective mass flux +REAL, DIMENSION(D%NIT,D%NJT,D%NKT), INTENT(IN) :: PPABST ! Absolute Pressure at t +REAL, DIMENSION(D%NIT,D%NJT,D%NKT), INTENT(IN) :: PZZ ! height of model layer +REAL, DIMENSION(D%NIT,D%NJT,D%NKT), 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(D%NIT,D%NJT,D%NKT), INTENT(IN) :: PCF_MF! Convective Mass Flux Cloud fraction +REAL, DIMENSION(D%NIT,D%NJT,D%NKT), INTENT(IN) :: PRC_MF! Convective Mass Flux liquid mixing ratio +REAL, DIMENSION(D%NIT,D%NJT,D%NKT), 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 - ! s'rc'/2Sigma_s2 at time t+1 - ! multiplied by Lambda_3 -REAL, DIMENSION(:,:,:), INTENT(OUT) :: PCLDFR ! Cloud fraction +REAL, DIMENSION(D%NIT,D%NJT,D%NKT), INTENT(IN) :: PRV ! Water vapor m.r. to adjust +REAL, DIMENSION(D%NIT,D%NJT,D%NKT), INTENT(IN) :: PRC ! Cloud water m.r. to adjust +REAL, DIMENSION(D%NIT,D%NJT,D%NKT), INTENT(INOUT) :: PRVS ! Water vapor m.r. source +REAL, DIMENSION(D%NIT,D%NJT,D%NKT), INTENT(INOUT) :: PRCS ! Cloud water m.r. source +REAL, DIMENSION(D%NIT,D%NJT,D%NKT), INTENT(IN) :: PTH ! Theta to adjust +REAL, DIMENSION(D%NIT,D%NJT,D%NKT), INTENT(INOUT) :: PTHS ! Theta source +REAL, DIMENSION(D%NIT,D%NJT,D%NKT), INTENT(OUT) :: PSRCS ! Second-order flux + ! s'rc'/2Sigma_s2 at time t+1 + ! multiplied by Lambda_3 +REAL, DIMENSION(D%NIT,D%NJT,D%NKT), INTENT(OUT) :: PCLDFR ! Cloud fraction ! -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 -TYPE(TBUDGETDATA), DIMENSION(KBUDGETS), INTENT(INOUT) :: TBUDGETS -INTEGER, INTENT(IN) :: KBUDGETS -REAL, DIMENSION(:,:), OPTIONAL, INTENT(IN) :: PICE_CLD_WGT +REAL, DIMENSION(D%NIT,D%NJT,D%NKT), INTENT(INOUT):: PRIS ! Cloud ice m.r. at t+1 +REAL, DIMENSION(D%NIT,D%NJT,D%NKT), INTENT(IN) :: PRR ! Rain water m.r. to adjust +REAL, DIMENSION(D%NIT,D%NJT,D%NKT), INTENT(IN) :: PRI ! Cloud ice m.r. to adjust +REAL, DIMENSION(D%NIT,D%NJT,D%NKT), INTENT(IN) :: PRS ! Aggregate m.r. to adjust +REAL, DIMENSION(D%NIT,D%NJT,D%NKT), INTENT(IN) :: PRG ! Graupel m.r. to adjust +REAL, DIMENSION(D%NIT,D%NJT,D%NKT), OPTIONAL, INTENT(IN) :: PRH ! Hail m.r. to adjust +REAL, DIMENSION(D%NIT,D%NJT,D%NKT), OPTIONAL, INTENT(OUT) :: POUT_RV ! Adjusted value +REAL, DIMENSION(D%NIT,D%NJT,D%NKT), OPTIONAL, INTENT(OUT) :: POUT_RC ! Adjusted value +REAL, DIMENSION(D%NIT,D%NJT,D%NKT), OPTIONAL, INTENT(OUT) :: POUT_RI ! Adjusted value +REAL, DIMENSION(D%NIT,D%NJT,D%NKT), OPTIONAL, INTENT(OUT) :: POUT_TH ! Adjusted value +REAL, DIMENSION(D%NIT,D%NJT,D%NKT), OPTIONAL, INTENT(OUT) :: PHLC_HRC +REAL, DIMENSION(D%NIT,D%NJT,D%NKT), OPTIONAL, INTENT(OUT) :: PHLC_HCF +REAL, DIMENSION(D%NIT,D%NJT,D%NKT), OPTIONAL, INTENT(OUT) :: PHLI_HRI +REAL, DIMENSION(D%NIT,D%NJT,D%NKT), OPTIONAL, INTENT(OUT) :: PHLI_HCF +TYPE(TBUDGETDATA), DIMENSION(KBUDGETS), INTENT(INOUT) :: TBUDGETS +INTEGER, INTENT(IN) :: KBUDGETS +REAL, DIMENSION(D%NIT,D%NJT), OPTIONAL, INTENT(IN) :: PICE_CLD_WGT + ! END SUBROUTINE ICE_ADJUST ! diff --git a/src/mesonh/aux/mode_fill_dimphyexn.F90 b/src/mesonh/aux/mode_fill_dimphyexn.F90 new file mode 100644 index 0000000000000000000000000000000000000000..69bdb37f361bf1ea74dc194a1a9641ff9b59da5a --- /dev/null +++ b/src/mesonh/aux/mode_fill_dimphyexn.F90 @@ -0,0 +1,74 @@ +!MNH_LIC Copyright 1995-2021 CNRS, Meteo-France and Universite Paul Sabatier +!MNH_LIC This is part of the Meso-NH software governed by the CeCILL-C licence +!MNH_LIC version 1. See LICENSE, CeCILL-C_V1-en.txt and CeCILL-C_V1-fr.txt +!MNH_LIC for details. version 1. +!----------------------------------------------------------------- +MODULE MODE_FILL_DIMPHYEX +IMPLICIT NONE +CONTAINS +SUBROUTINE FILL_DIMPHYEX(YDDIMPHYEX, KIT, KJT, KKT) +! ######################### +! +!! +!! PURPOSE +!! ------- +! This subroutine computes the dimensions according to the running model. +! +!! +!!** IMPLICIT ARGUMENTS +!! ------------------ +!! None +!! +!! REFERENCE +!! --------- +!! +!! AUTHOR +!! ------ +!! S. Riette, Météo-France +!! +!! MODIFICATIONS +!! ------------- +!! Original January 2022 +! +!----------------------------------------------------------------- +!* 0. DECLARATIONS +! ------------ +! +USE MODD_DIMPHYEX, ONLY: DIMPHYEX_t +USE MODD_PARAMETERS, ONLY: JPVEXT +USE PARKIND1, ONLY : JPRB +USE YOMHOOK , ONLY : LHOOK, DR_HOOK +! +IMPLICIT NONE +! +!* 0.1 Declarations of dummy arguments : +! +TYPE(DIMPHYEX_t), INTENT(OUT) :: YDDIMPHYEX ! Structure to fill in +INTEGER, INTENT(IN) :: KIT, KJT, KKT ! Array dimensions + +! +!* 0.2 declaration of local variables +! +REAL(KIND=JPRB) :: ZHOOK_HANDLE +!------------------------------------------------------------------------------- +! +IF (LHOOK) CALL DR_HOOK('FILL_DIMPHYEX', 0, ZHOOK_HANDLE) +! +YDDIMPHYEX%NIT=KIT +YDDIMPHYEX%NJT=KJT +CALL GET_INDICE_ll(YDDIMPHYEX%NIB, YDDIMPHYEX%NJB,& + &YDDIMPHYEX%NIE, YDDIMPHYEX%NJE) +! +YDDIMPHYEX%NKL=1 +YDDIMPHYEX%NKT=KKT +YDDIMPHYEX%NKA=1 +YDDIMPHYEX%NKU=KKT +YDDIMPHYEX%NKB=1+JPVEXT +YDDIMPHYEX%NKE=KKT-JPVEXT +YDDIMPHYEX%NKTB=1+JPVEXT +YDDIMPHYEX%NKTE=KKT-JPVEXT +! +IF (LHOOK) CALL DR_HOOK('FILL_DIMPHYEX', 1, ZHOOK_HANDLE) +! +END SUBROUTINE FILL_DIMPHYEX +END MODULE MODE_FILL_DIMPHYEX diff --git a/src/mesonh/micro/ini_rain_ice.f90 b/src/mesonh/micro/ini_rain_ice.f90 index 7f8bb85b01422106019deeb22ce4fa3f9c10f3cb..c172f556ebca02c69cf1921f20fd8d2e1ec05fe3 100644 --- a/src/mesonh/micro/ini_rain_ice.f90 +++ b/src/mesonh/micro/ini_rain_ice.f90 @@ -191,7 +191,10 @@ REAL :: PDRYLBDAG_MAX,PDRYLBDAS_MAX,PDRYLBDAG_MIN,PDRYLBDAS_MIN REAL :: PDRYLBDAR_MAX,PDRYLBDAR_MIN REAL :: PWETLBDAS_MAX,PWETLBDAG_MAX,PWETLBDAS_MIN,PWETLBDAG_MIN REAL :: PWETLBDAR_MAX,PWETLBDAH_MAX,PWETLBDAR_MIN,PWETLBDAH_MIN +! +REAL(KIND=JPRB) :: ZHOOK_HANDLE !------------------------------------------------------------------------------- +IF (LHOOK) CALL DR_HOOK('INI_RAIN_ICE',0,ZHOOK_HANDLE) ! ! !* 0. FUNCTION STATEMENTS @@ -453,6 +456,7 @@ ZRHO00 = 101325.*(1.+ZRV)/(XRD+ZRV*XRV)/293.15 ! !* 4.2 Constants for sedimentation ! +IF(.NOT.ASSOCIATED(XFSEDC)) CALL RAIN_ICE_INIT() XFSEDC(1) = GAMMA(XNUC+(XDC+3.)/XALPHAC)/GAMMA(XNUC+3./XALPHAC)* & (ZRHO00)**XCEXVT XFSEDC(2) = GAMMA(XNUC2+(XDC+3.)/XALPHAC2)/GAMMA(XNUC2+3./XALPHAC2)* & @@ -673,9 +677,9 @@ XGAMINC_BOUND_MIN = 1.0E-1 ! Minimal value of (Lbda * D_cs^lim)**alpha XGAMINC_BOUND_MAX = 1.0E7 ! Maximal value of (Lbda * D_cs^lim)**alpha ZRATE = EXP(LOG(XGAMINC_BOUND_MAX/XGAMINC_BOUND_MIN)/REAL(NGAMINC-1)) ! -IF( .NOT.ALLOCATED(XGAMINC_RIM1) ) ALLOCATE( XGAMINC_RIM1(NGAMINC) ) -IF( .NOT.ALLOCATED(XGAMINC_RIM2) ) ALLOCATE( XGAMINC_RIM2(NGAMINC) ) -IF( .NOT.ALLOCATED(XGAMINC_RIM4) ) ALLOCATE( XGAMINC_RIM4(NGAMINC) ) +IF( .NOT.ASSOCIATED(XGAMINC_RIM1) ) CALL RAIN_ICE_ALLOCATE('XGAMINC_RIM1', NGAMINC) +IF( .NOT.ASSOCIATED(XGAMINC_RIM2) ) CALL RAIN_ICE_ALLOCATE('XGAMINC_RIM2', NGAMINC) +IF( .NOT.ASSOCIATED(XGAMINC_RIM4) ) CALL RAIN_ICE_ALLOCATE('XGAMINC_RIM4', NGAMINC) ! DO J1=1,NGAMINC ZBOUND = XGAMINC_BOUND_MIN*ZRATE**(J1-1) @@ -725,9 +729,9 @@ IND = 50 ! Interval number, collection efficiency and infinite diameter ZESR = 1.0 ! factor used to integrate the dimensional distributions when ZFDINFTY = 20.0 ! computing the kernels XKER_RACCSS, XKER_RACCS and XKER_SACCRG ! -IF( .NOT.ALLOCATED(XKER_RACCSS) ) ALLOCATE( XKER_RACCSS(NACCLBDAS,NACCLBDAR) ) -IF( .NOT.ALLOCATED(XKER_RACCS ) ) ALLOCATE( XKER_RACCS (NACCLBDAS,NACCLBDAR) ) -IF( .NOT.ALLOCATED(XKER_SACCRG) ) ALLOCATE( XKER_SACCRG(NACCLBDAR,NACCLBDAS) ) +IF( .NOT.ASSOCIATED(XKER_RACCSS) ) CALL RAIN_ICE_ALLOCATE('XKER_RACCSS', NACCLBDAS,NACCLBDAR) +IF( .NOT.ASSOCIATED(XKER_RACCS ) ) CALL RAIN_ICE_ALLOCATE('XKER_RACCS', NACCLBDAS,NACCLBDAR) +IF( .NOT.ASSOCIATED(XKER_SACCRG) ) CALL RAIN_ICE_ALLOCATE('XKER_SACCRG', NACCLBDAR,NACCLBDAS) ! CALL READ_XKER_RACCS (KACCLBDAS,KACCLBDAR,KND, & PALPHAS,PNUS,PALPHAR,PNUR,PESR,PBS,PBR,PCS,PDS,PCR,PDR, & @@ -935,7 +939,7 @@ IND = 50 ! Interval number, collection efficiency and infinite diameter ZEGS = 1.0 ! factor used to integrate the dimensional distributions when ZFDINFTY = 20.0 ! computing the kernels XKER_SDRYG ! -IF( .NOT.ALLOCATED(XKER_SDRYG) ) ALLOCATE( XKER_SDRYG(NDRYLBDAG,NDRYLBDAS) ) +IF( .NOT.ASSOCIATED(XKER_SDRYG) ) CALL RAIN_ICE_ALLOCATE('XKER_SDRYG', NDRYLBDAG,NDRYLBDAS) ! CALL READ_XKER_SDRYG (KDRYLBDAG,KDRYLBDAS,KND, & PALPHAG,PNUG,PALPHAS,PNUS,PEGS,PBS,PCG,PDG,PCS,PDS, & @@ -1001,7 +1005,7 @@ IND = 50 ! Number of interval used to integrate the dimensional ZEGR = 1.0 ! distributions when computing the kernel XKER_RDRYG ZFDINFTY = 20.0 ! -IF( .NOT.ALLOCATED(XKER_RDRYG) ) ALLOCATE( XKER_RDRYG(NDRYLBDAG,NDRYLBDAR) ) +IF( .NOT.ASSOCIATED(XKER_RDRYG) ) CALL RAIN_ICE_ALLOCATE('XKER_RDRYG', NDRYLBDAG,NDRYLBDAR) ! CALL READ_XKER_RDRYG (KDRYLBDAG,KDRYLBDAR,KND, & PALPHAG,PNUG,PALPHAR,PNUR,PEGR,PBR,PCG,PDG,PCR,PDR, & @@ -1139,7 +1143,7 @@ IND = 50 ! Interval number, collection efficiency and infinite diameter ZEHS = 1.0 ! factor used to integrate the dimensional distributions when ZFDINFTY = 20.0 ! computing the kernels XKER_SWETH ! -IF( .NOT.ALLOCATED(XKER_SWETH) ) ALLOCATE( XKER_SWETH(NWETLBDAH,NWETLBDAS) ) +IF( .NOT.ASSOCIATED(XKER_SWETH) ) CALL RAIN_ICE_ALLOCATE('XKER_SWETH', NWETLBDAH,NWETLBDAS) ! CALL READ_XKER_SWETH (KWETLBDAH,KWETLBDAS,KND, & PALPHAH,PNUH,PALPHAS,PNUS,PEHS,PBS,PCH,PDH,PCS,PDS, & @@ -1205,7 +1209,7 @@ IND = 50 ! Number of interval used to integrate the dimensional ZEHG = 1.0 ! distributions when computing the kernel XKER_GWETH ZFDINFTY = 20.0 ! -IF( .NOT.ALLOCATED(XKER_GWETH) ) ALLOCATE( XKER_GWETH(NWETLBDAH,NWETLBDAG) ) +IF( .NOT.ASSOCIATED(XKER_GWETH) ) CALL RAIN_ICE_ALLOCATE('XKER_GWETH', NWETLBDAH,NWETLBDAG) ! CALL READ_XKER_GWETH (KWETLBDAH,KWETLBDAG,KND, & PALPHAH,PNUH,PALPHAG,PNUG,PEHG,PBG,PCH,PDH,PCG,PDG, & @@ -1271,7 +1275,7 @@ IND = 50 ! Number of interval used to integrate the dimensional ZEHR = 1.0 ! distributions when computing the kernel XKER_RWETH ZFDINFTY = 20.0 ! -IF( .NOT.ALLOCATED(XKER_RWETH) ) ALLOCATE( XKER_RWETH(NWETLBDAH,NWETLBDAR) ) +IF( .NOT.ASSOCIATED(XKER_RWETH) ) CALL RAIN_ICE_ALLOCATE('XKER_RWETH', NWETLBDAH,NWETLBDAR) ! CALL READ_XKER_RWETH (KWETLBDAH,KWETLBDAR,KND, & PALPHAH,PNUH,PALPHAR,PNUR,PEHR,PBR,PCH,PDH,PCR,PDR, & @@ -1377,6 +1381,7 @@ IF (GFLAG) THEN WRITE(UNIT=KLUOUT,FMT='(" distribution:AL=",E13.6,"NU=",E13.6)') & XALPHAH,XNUH END IF +IF (LHOOK) CALL DR_HOOK('INI_RAIN_ICE',1,ZHOOK_HANDLE) CONTAINS ! !------------------------------------------------------------------------------ diff --git a/src/mesonh/micro/modd_cst.f90 b/src/mesonh/micro/modd_cst.f90 deleted file mode 100644 index 73607888ccbf0791641a83952225dd0a2a76e9ce..0000000000000000000000000000000000000000 --- a/src/mesonh/micro/modd_cst.f90 +++ /dev/null @@ -1,116 +0,0 @@ -!MNH_LIC Copyright 1994-2021 CNRS, Meteo-France and Universite Paul Sabatier -!MNH_LIC This is part of the Meso-NH software governed by the CeCILL-C licence -!MNH_LIC version 1. See LICENSE, CeCILL-C_V1-en.txt and CeCILL-C_V1-fr.txt -!MNH_LIC for details. version 1. -!----------------------------------------------------------------- -! ############### - MODULE MODD_CST -! ############### -! -!!**** *MODD_CST* - declaration of Physic constants -!! -!! PURPOSE -!! ------- -! The purpose of this declarative module is to declare the -! Physics constants. -! -!! -!!** IMPLICIT ARGUMENTS -!! ------------------ -!! None -!! -!! REFERENCE -!! --------- -!! Book2 of documentation of Meso-NH (MODD_CST) -!! -!! AUTHOR -!! ------ -!! V. Ducrocq *Meteo France* -!! -!! MODIFICATIONS -!! ------------- -!! Original 16/05/94 -!! J. Stein 02/01/95 add xrholw -!! J.-P. Pinty 13/12/95 add XALPI,XBETAI,XGAMI -!! J. Stein 25/07/97 add XTH00 -!! V. Masson 05/10/98 add XRHOLI -!! C. Mari 31/10/00 add NDAYSEC -!! V. Masson 01/03/03 add conductivity of ice -!! J.Escobar : 10/2017 : for real*4 , add XMNH_HUGE_12_LOG -!! J.L. Redelsperger 03/2021 add constants for ocean penetrating solar -!------------------------------------------------------------------------------- -! -!* 0. DECLARATIONS -! ------------ -! -IMPLICIT NONE -REAL,SAVE :: XPI ! Pi -! -REAL,SAVE :: XDAY,XSIYEA,XSIDAY ! day duration, sideral year duration, - ! sideral day duration -! -REAL,SAVE :: XKARMAN ! von karman constant -REAL,SAVE :: XLIGHTSPEED ! light speed -REAL,SAVE :: XPLANCK ! Planck constant -REAL,SAVE :: XBOLTZ ! Boltzman constant -REAL,SAVE :: XAVOGADRO ! Avogadro number -! -REAL,SAVE :: XRADIUS,XOMEGA ! Earth radius, earth rotation -REAL,SAVE :: XG ! Gravity constant -! -REAL,SAVE :: XP00 ! Reference pressure -REAL,SAVE :: XP00OCEAN ! Reference pressure for ocean model -REAL,SAVE :: XRH00OCEAN ! Reference density for ocean model -! -REAL,SAVE :: XSTEFAN,XI0 ! Stefan-Boltzman constant, solar constant -! -REAL,SAVE :: XMD,XMV ! Molar mass of dry air and molar mass of vapor -REAL,SAVE :: XRD,XRV ! Gaz constant for dry air, gaz constant for vapor -REAL,SAVE :: XEPSILO ! XMV/XMD -REAL,SAVE :: XCPD,XCPV ! Cpd (dry air), Cpv (vapor) -REAL,SAVE :: XRHOLW ! Volumic mass of liquid water -REAL,SAVE :: XCL,XCI ! Cl (liquid), Ci (ice) -REAL,SAVE :: XTT ! Triple point temperature -REAL,SAVE :: XLVTT ! Vaporization heat constant -REAL,SAVE :: XLSTT ! Sublimation heat constant -REAL,SAVE :: XLMTT ! Melting heat constant -REAL,SAVE :: XESTT ! Saturation vapor pressure at triple point - ! temperature -REAL,SAVE :: XALPW,XBETAW,XGAMW ! Constants for saturation vapor - ! pressure function -REAL,SAVE :: XALPI,XBETAI,XGAMI ! Constants for saturation vapor - ! pressure function over solid ice -REAL,SAVE :: XCONDI ! thermal conductivity of ice (W m-1 K-1) -REAL,SAVE :: XALPHAOC ! thermal expansion coefficient for ocean (K-1) -REAL,SAVE :: XBETAOC ! Haline contraction coeff for ocean (S-1) -REAL,SAVE :: XTH00 ! reference value for the potential temperature -REAL,SAVE :: XTH00OCEAN ! Ref value for pot temp in ocean model -REAL,SAVE :: XSA00OCEAN ! Ref value for SAlinity in ocean model -REAL,SAVE :: XROC=0.69! 3 coeffs for SW penetration in Ocean (Hoecker et al) -REAL,SAVE :: XD1=1.1 -REAL,SAVE :: XD2=23. -! Values used in SURFEX CMO -!REAL,SAVE :: XROC=0.58 -!REAL,SAVE :: XD1=0.35 -!REAL,SAVE :: XD2=23. - -REAL,SAVE :: XRHOLI ! Volumic mass of liquid water -! -INTEGER, SAVE :: NDAYSEC ! Number of seconds in a day -! -! -! Some machine precision value depending of real4/8 use -! -REAL,SAVE :: XMNH_TINY ! minimum real on this machine -REAL,SAVE :: XMNH_TINY_12 ! sqrt(minimum real on this machine) -REAL,SAVE :: XMNH_EPSILON ! minimum space with 1.0 -REAL,SAVE :: XMNH_HUGE ! maximum real on this machine -REAL,SAVE :: XMNH_HUGE_12_LOG ! maximum log(sqrt(real)) on this machine - -REAL,SAVE :: XEPS_DT ! default value for DT test -REAL,SAVE :: XRES_FLAT_CART ! default flat&cart residual tolerance -REAL,SAVE :: XRES_OTHER ! default not flat&cart residual tolerance -REAL,SAVE :: XRES_PREP ! default prep residual tolerance - -! -END MODULE MODD_CST diff --git a/src/mesonh/turb/shallow_mf.f90 b/src/mesonh/turb/shallow_mf.f90 index 23dbbec3918c88e25337a3eeb8af0b55a919089d..7373c5c3d5e4e44162468f6fe943e68d26d89f09 100644 --- a/src/mesonh/turb/shallow_mf.f90 +++ b/src/mesonh/turb/shallow_mf.f90 @@ -177,6 +177,7 @@ END MODULE MODI_SHALLOW_MF ! USE MODD_CST USE MODD_PARAMETERS, ONLY: JPVEXT +USE MODD_NEB, ONLY: NEB USE MODD_PARAM_MFSHALL_n USE MODD_TURB_n, ONLY: CTURBLEN @@ -188,7 +189,6 @@ USE MODI_MF_TURB USE MODI_MF_TURB_EXPL USE MODI_MF_TURB_GREYZONE USE MODI_COMPUTE_MF_CLOUD -USE MODE_COMPUTE_FRAC_ICE, ONLY : COMPUTE_FRAC_ICE USE MODI_SHUMAN_MF ! USE MODI_COMPUTE_BL89_ML @@ -323,7 +323,7 @@ IF (SIZE(PRM,3).GE.4) THEN ZFRAC_ICE(:,:) = PRM(:,:,4) / (PRM(:,:,2)+PRM(:,:,4)) ENDWHERE ENDIF -CALL COMPUTE_FRAC_ICE(HFRAC_ICE,ZFRAC_ICE(:,:),PTHM(:,:)*PEXNM(:,:), IERR(:,:)) +CALL COMPUTE_FRAC_ICE(HFRAC_ICE,NEB,ZFRAC_ICE(:,:),PTHM(:,:)*PEXNM(:,:), IERR(:,:)) ! Conservative variables at t-dt CALL THL_RT_FROM_TH_R_MF(KRR,KRRL,KRRI, & @@ -435,4 +435,7 @@ IF( HMF_UPDRAFT == 'DUAL') THEN ! PDVDT_MF=0. ENDIF ! +CONTAINS +INCLUDE "compute_frac_ice.func.h" +! END SUBROUTINE SHALLOW_MF