From 233798d48bb1c8004dddb4f897b85c8f05ebbb2c Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?S=C3=A9bastien=20Riette?= <sebastien.riette@meteo.fr> Date: Wed, 13 Apr 2022 16:30:44 +0200 Subject: [PATCH] S. Riette 13/4/2022 Modules and array declartion for shallow_mf top routines --- src/arome/ext/apl_arome.F90 | 3 +- src/arome/ext/aro_shallow_mf.F90 | 48 +++------ src/arome/ext/aro_shallow_mf.h | 3 +- src/arome/ext/arp_shallow_mf.F90 | 21 +++- src/common/turb/modd_param_mfshalln.F90 | 3 + src/common/turb/modi_shallow_mf.F90 | 93 +++++++++-------- src/common/turb/shallow_mf.F90 | 133 ++++++++++++------------ src/mesonh/ext/shallow_mf_pack.f90 | 14 ++- 8 files changed, 172 insertions(+), 146 deletions(-) diff --git a/src/arome/ext/apl_arome.F90 b/src/arome/ext/apl_arome.F90 index e47134825..168fdb8b8 100644 --- a/src/arome/ext/apl_arome.F90 +++ b/src/arome/ext/apl_arome.F90 @@ -2899,7 +2899,8 @@ IF (LMFSHAL) THEN ZARG_FLXZTHVMF_ => ZFLXZTHVMF_(:,1:KLEV) ENDIF - CALL ARO_SHALLOW_MF (KKL=IKL, KLON=KFDIA,KLEV=KLEV,KRR=NRR,KRRL=NRRL,& + !CALL ARO_SHALLOW_MF (KKL=IKL, KLON=KFDIA, KLEV=KLEV, KFDIA=KFDIA, KRR=NRR, KRRL=NRRL,& !this is the target version + CALL ARO_SHALLOW_MF (KKL=IKL, KLON=KFDIA, KLEV=KLEV, KFDIA=KLON, KRR=NRR, KRRL=NRRL,& & KRRI=NRRI,KSV=NGFL_EXT,HMF_UPDRAFT=CMF_UPDRAFT, HMF_CLOUD=CMF_CLOUD,& & HFRAC_ICE=CFRAC_ICE_SHALLOW_MF,& & OMIXUV=LMIXUV, ONOMIXLG=.FALSE.,KSV_LGBEG=0,KSV_LGEND=0,& diff --git a/src/arome/ext/aro_shallow_mf.F90 b/src/arome/ext/aro_shallow_mf.F90 index 4a59175ab..eb583c24f 100644 --- a/src/arome/ext/aro_shallow_mf.F90 +++ b/src/arome/ext/aro_shallow_mf.F90 @@ -1,5 +1,5 @@ ! ######spl - SUBROUTINE ARO_SHALLOW_MF(KKL, KLON,KLEV, KRR, KRRL, KRRI,KSV, & + SUBROUTINE ARO_SHALLOW_MF(KKL, KLON, KLEV, KFDIA, KRR, KRRL, KRRI,KSV, & HMF_UPDRAFT, HMF_CLOUD, HFRAC_ICE, OMIXUV, & ONOMIXLG,KSV_LGBEG,KSV_LGEND, & KTCOUNT, PTSTEP, & @@ -63,9 +63,15 @@ !* 0. DECLARATIONS ! ------------ ! -USE MODD_PARAMETERS, ONLY: JPVEXT, JPHEXT +USE MODD_PARAMETERS, ONLY: JPVEXT +USE MODD_CST, ONLY: CST +USE MODD_NEB, ONLY: NEB +USE MODD_TURB_n, ONLY: TURBN +USE MODD_PARAM_MFSHALL_n, ONLY: PARAM_MFSHALLN +USE MODD_DIMPHYEX, ONLY: DIMPHYEX_t ! USE MODI_SHALLOW_MF +USE MODE_FILL_DIMPHYEX, ONLY: FILL_DIMPHYEX ! IMPLICIT NONE ! @@ -77,6 +83,7 @@ INTEGER, INTENT(IN) :: KKL ! +1 if grid goes from ground ! atmosphere top, -1 otherwise INTEGER, INTENT(IN) :: KLON !NPROMA under CPG INTEGER, INTENT(IN) :: KLEV !Number of vertical levels +INTEGER, INTENT(IN) :: KFDIA INTEGER, INTENT(IN) :: KRR ! Number of moist variables INTEGER, INTENT(IN) :: KRRL ! Number of liquide water variables INTEGER, INTENT(IN) :: KRRI ! Number of ice variables @@ -138,23 +145,12 @@ REAL, DIMENSION(KLON,KLEV), INTENT(INOUT) :: PEMF ! updraft mass flux ! !* 0.2 Declarations of local variables : ! -INTEGER :: JRR ! Loop index for the moist -INTEGER :: IIB ! Define the physical domain -INTEGER :: IIE ! -INTEGER :: IJB ! -INTEGER :: IJE ! -INTEGER :: IKB ! -INTEGER :: IKE ! -INTEGER :: IKA, IKU -INTEGER :: JI, JJ, JL, JK ! -INTEGER ::II INTEGER, DIMENSION(size(PRHODJ,1)) :: IKLCL,IKETL,IKCTL REAL,DIMENSION(size(PRHODJ,1),size(PRHODJ,2)) :: ZFLXZTHMF,ZFLXZRMF,ZFLXZUMF,ZFLXZVMF REAL,DIMENSION(size(PRHODJ,1),size(PRHODJ,2)) :: ZDETR,ZENTR -! -! - +TYPE(DIMPHYEX_t) :: YLDIMPHYEX REAL :: ZIMPL ! degree of implicitness +REAL(KIND=JPRB) :: ZHOOK_HANDLE ! ! ! @@ -163,23 +159,10 @@ REAL :: ZIMPL ! degree of implicitness !* 1. PRELIMINARY COMPUTATIONS ! ------------------------ ! -REAL(KIND=JPRB) :: ZHOOK_HANDLE IF (LHOOK) CALL DR_HOOK('ARO_SHALLOW_MF',0,ZHOOK_HANDLE) - -IIB=1+JPHEXT -IIE=SIZE(PZZ,1) - JPHEXT -IJB=1+JPHEXT -IJE=1 - JPHEXT -IF(KKL==1)THEN - IKA=1 - IKU=SIZE(PZZ,2) -ELSE - IKA=SIZE(PZZ,2) - IKU=1 -ENDIF -IKB=IKA+KKL*JPVEXT -IKE=IKU-KKL*JPVEXT +!Dimensions +CALL FILL_DIMPHYEX(YLDIMPHYEX, KLON, 1, KLEV, JPVEXT, KFDIA) ! ! !------------------------------------------------------------------------------ @@ -219,11 +202,12 @@ ZIMPL=1. ! ! --------------------------------- ! - CALL SHALLOW_MF(KKA=IKA,KKU=IKU,KKL=KKL,KRR=KRR,KRRL=KRRL,KRRI=KRRI, & + CALL SHALLOW_MF(YLDIMPHYEX, CST, NEB, PARAM_MFSHALLN, TURBN, & + &KRR=KRR, KRRL=KRRL, KRRI=KRRI, KSV=KSV, & &HMF_UPDRAFT=HMF_UPDRAFT, HMF_CLOUD=HMF_CLOUD,HFRAC_ICE=HFRAC_ICE,OMIXUV=OMIXUV, & &ONOMIXLG=ONOMIXLG,KSV_LGBEG=KSV_LGBEG,KSV_LGEND=KSV_LGEND, & &PIMPL_MF=ZIMPL, PTSTEP=PTSTEP, & - &PDZZ=PDZZF,PZZ=PZZ, & + &PDZZ=PDZZF,PZZ=PZZ, & &PRHODJ=PRHODJ,PRHODREF=PRHODREF, & &PPABSM=PPABSM,PEXNM=PEXNM, & &PSFTH=PSFTH,PSFRV=PSFRV, & diff --git a/src/arome/ext/aro_shallow_mf.h b/src/arome/ext/aro_shallow_mf.h index 07cdb7a7d..4ec74085e 100644 --- a/src/arome/ext/aro_shallow_mf.h +++ b/src/arome/ext/aro_shallow_mf.h @@ -1,5 +1,5 @@ INTERFACE - SUBROUTINE ARO_SHALLOW_MF(KKL, KLON,KLEV, KRR, KRRL, KRRI,KSV,& + SUBROUTINE ARO_SHALLOW_MF(KKL, KLON, KLEV, KFDIA, KRR, KRRL, KRRI,KSV,& & HMF_UPDRAFT, HMF_CLOUD, HFRAC_ICE, OMIXUV,& & ONOMIXLG,KSV_LGBEG,KSV_LGEND,& & KTCOUNT, PTSTEP,& @@ -18,6 +18,7 @@ USE PARKIND1 ,ONLY : JPIM ,JPRB INTEGER(KIND=JPIM), INTENT(IN) :: KKL INTEGER(KIND=JPIM), INTENT(IN) :: KLON INTEGER(KIND=JPIM), INTENT(IN) :: KLEV +INTEGER(KIND=JPIM), INTENT(IN) :: KFDIA INTEGER(KIND=JPIM), INTENT(IN) :: KRR INTEGER(KIND=JPIM), INTENT(IN) :: KRRL INTEGER(KIND=JPIM), INTENT(IN) :: KRRI diff --git a/src/arome/ext/arp_shallow_mf.F90 b/src/arome/ext/arp_shallow_mf.F90 index f79aee52d..d79db7626 100644 --- a/src/arome/ext/arp_shallow_mf.F90 +++ b/src/arome/ext/arp_shallow_mf.F90 @@ -45,6 +45,7 @@ !! Original 11/2010 !! S. Riette shallow_mf now outputs ice cloud !! S. Riette Jan 2012: support for both order of vertical levels +!! S. Riette April 2022: call abort, waiting for an update from an arpege developper... !! !------------------------------------------------------------------------------- ! @@ -55,7 +56,14 @@ USE YOMCST , ONLY : RG, RATM, RKAPPA, RD, RCPD, RCPV !USE MODD_PARAMETERS ! +USE MODD_CST, ONLY: CST +USE MODD_NEB, ONLY: NEB +USE MODD_TURB_n, ONLY: TURBN +USE MODD_PARAM_MFSHALL_n, ONLY: PARAM_MFSHALLN +USE MODD_DIMPHYEX, ONLY: DIMPHYEX_t +! USE MODI_SHALLOW_MF +USE MODE_FILL_DIMPHYEX, ONLY: FILL_DIMPHYEX USE MODD_CST USE YOMCT3 ! @@ -181,6 +189,8 @@ REAL, DIMENSION(KIDIA:KFDIA,KLEV+2) :: ZTKE REAL, DIMENSION(KIDIA:KFDIA,KLEV+2) :: ZU REAL, DIMENSION(KIDIA:KFDIA,KLEV+2) :: ZV REAL, DIMENSION(KIDIA:KFDIA,KLEV+2) :: ZZZF +TYPE(DIMPHYEX_t) :: YLDIMPHYEX +#include "abor1.intfb.h" !------------------------------------------------------------------------------ @@ -190,6 +200,14 @@ REAL, DIMENSION(KIDIA:KFDIA,KLEV+2) :: ZZZF ! Controle : +!shallow_mf code is now ready to deal with KIDIA/KFDIA +!Array copies can be suppressed (no need to limit the horizontal domain nor to add the two extra levels) +!CALL FILL_DIMPHYEX(YLDIMPHYEX, KLON, 1, KLEV, 0, KFDIA) + +!For now, copies are done +CALL FILL_DIMPHYEX(YLDIMPHYEX, KFDIA, 1, KLEV, 1, KFDIA) + +CALL ABOR1('ARP_SHALLOW_MF: code must be checked before being activated again') ! Avec inversion des boucles IKA=1 ! <== Bottom index of array @@ -372,7 +390,8 @@ ZDRTDT_MF(:,:) = 0. ! ! --------------------------------- - CALL SHALLOW_MF(KKA=IKA,KKU=IKU,KKL=IKL,KRR=IKR,KRRL=IKRL,KRRI=IKRI, & + CALL SHALLOW_MF(YLDIMPHYEX, CST, NEB, PARAM_MFSHALLN, TURBN, & + KRR=IKR,KRRL=IKRL,KRRI=IKRI, KSV=1, & HMF_UPDRAFT=HMF_UPDRAFT, HMF_CLOUD=HMF_CLOUD,HFRAC_ICE='N',OMIXUV=LLOMIXUV, & ONOMIXLG=LLONOMIXLG,KSV_LGBEG=ISV_LGBEG,KSV_LGEND=ISV_LGEND, & PIMPL_MF=PIMPL, PTSTEP=ZDT, & diff --git a/src/common/turb/modd_param_mfshalln.F90 b/src/common/turb/modd_param_mfshalln.F90 index 936d408ae..72a5644bf 100644 --- a/src/common/turb/modd_param_mfshalln.F90 +++ b/src/common/turb/modd_param_mfshalln.F90 @@ -94,6 +94,7 @@ REAL :: XLAMBDA_MF ! Lambda to compute ThetaS1 from ThetaL END TYPE PARAM_MFSHALL_t TYPE(PARAM_MFSHALL_t), DIMENSION(JPMODELMAX), TARGET, SAVE :: PARAM_MFSHALL_MODEL +TYPE(PARAM_MFSHALL_t), POINTER, SAVE :: PARAM_MFSHALLN => NULL() REAL , POINTER :: XIMPL_MF=>NULL() CHARACTER (LEN=4), POINTER :: CMF_UPDRAFT=>NULL() @@ -131,6 +132,8 @@ CONTAINS SUBROUTINE PARAM_MFSHALL_GOTO_MODEL(KFROM, KTO) INTEGER, INTENT(IN) :: KFROM, KTO ! +PARAM_MFSHALLN => PARAM_MFSHALL_MODEL(KTO) +! ! Save current state for allocated arrays ! ! Current model is set to model KTO diff --git a/src/common/turb/modi_shallow_mf.F90 b/src/common/turb/modi_shallow_mf.F90 index 23559eeec..29f16989a 100644 --- a/src/common/turb/modi_shallow_mf.F90 +++ b/src/common/turb/modi_shallow_mf.F90 @@ -4,7 +4,8 @@ ! INTERFACE ! ################################################################# - SUBROUTINE SHALLOW_MF(KKA,KKU,KKL,KRR,KRRL,KRRI, & + SUBROUTINE SHALLOW_MF(D, CST, NEB, PARAMMF, TURB, & + KRR, KRRL, KRRI, KSV, & HMF_UPDRAFT, HMF_CLOUD, HFRAC_ICE, OMIXUV, & ONOMIXLG,KSV_LGBEG,KSV_LGEND, & PIMPL_MF, PTSTEP, & @@ -23,16 +24,24 @@ INTERFACE KKLCL,KKETL,KKCTL,PDX,PDY ) ! ################################################################# !! +USE MODD_DIMPHYEX, ONLY: DIMPHYEX_t +USE MODD_CST, ONLY: CST_t +USE MODD_NEB, ONLY: NEB_t +USE MODD_PARAM_MFSHALL_n, ONLY: PARAM_MFSHALL_t +USE MODD_TURB_n, ONLY: TURB_t ! !* 1.1 Declaration of Arguments ! ! -INTEGER, INTENT(IN) :: KKA ! near ground array index -INTEGER, INTENT(IN) :: KKU ! uppest atmosphere array index -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(NEB_t), INTENT(IN) :: NEB +TYPE(PARAM_MFSHALL_t), INTENT(IN) :: PARAMMF +TYPE(TURB_t), INTENT(IN) :: TURB INTEGER, INTENT(IN) :: KRR ! number of moist var. INTEGER, INTENT(IN) :: KRRL ! number of liquid water var. INTEGER, INTENT(IN) :: KRRI ! number of ice water var. +INTEGER, INTENT(IN) :: KSV CHARACTER (LEN=4), INTENT(IN) :: HMF_UPDRAFT ! Type of Mass Flux Scheme ! 'NONE' if no parameterization CHARACTER (LEN=4), INTENT(IN) :: HMF_CLOUD ! Type of statistical cloud @@ -45,49 +54,49 @@ INTEGER, INTENT(IN) :: KSV_LGEND ! last index of lag. tracer REAL, INTENT(IN) :: PIMPL_MF ! degre of implicitness REAL, INTENT(IN) :: PTSTEP ! Dynamical timestep -REAL, DIMENSION(:,:), INTENT(IN) :: PZZ ! Height of flux point -REAL, DIMENSION(:,:), INTENT(IN) :: PDZZ ! Metric coefficients -REAL, DIMENSION(:,:), INTENT(IN) :: PRHODJ ! dry density * Grid size -REAL, DIMENSION(:,:), INTENT(IN) :: PRHODREF ! dry density of the +REAL, DIMENSION(D%NIT*D%NJT,D%NKT), INTENT(IN) :: PZZ ! Height of flux point +REAL, DIMENSION(D%NIT*D%NJT,D%NKT), INTENT(IN) :: PDZZ ! Metric coefficients +REAL, DIMENSION(D%NIT*D%NJT,D%NKT), INTENT(IN) :: PRHODJ ! dry density * Grid size +REAL, DIMENSION(D%NIT*D%NJT,D%NKT), INTENT(IN) :: PRHODREF ! dry density of the ! reference state -REAL, DIMENSION(:,:), INTENT(IN) :: PPABSM ! Pressure at time t-1 -REAL, DIMENSION(:,:), INTENT(IN) :: PEXNM ! Exner function at t-dt +REAL, DIMENSION(D%NIT*D%NJT,D%NKT), INTENT(IN) :: PPABSM ! Pressure at time t-1 +REAL, DIMENSION(D%NIT*D%NJT,D%NKT), INTENT(IN) :: PEXNM ! Exner function at t-dt -REAL, DIMENSION(:), INTENT(IN) :: PSFTH,PSFRV ! normal surface fluxes of theta and Rv -REAL, DIMENSION(:,:), INTENT(IN) :: PTHM ! Theta at t-dt -REAL, DIMENSION(:,:,:), INTENT(IN) :: PRM ! water var. at t-dt -REAL, DIMENSION(:,:), INTENT(IN) :: PUM,PVM ! wind components at t-dt -REAL, DIMENSION(:,:), INTENT(IN) :: PTKEM ! tke at t-dt +REAL, DIMENSION(D%NIT*D%NJT), INTENT(IN) :: PSFTH,PSFRV ! normal surface fluxes of theta and Rv +REAL, DIMENSION(D%NIT*D%NJT,D%NKT), INTENT(IN) :: PTHM ! Theta at t-dt +REAL, DIMENSION(D%NIT*D%NJT,KRR), INTENT(IN) :: PRM ! water var. at t-dt +REAL, DIMENSION(D%NIT*D%NJT,D%NKT), INTENT(IN) :: PUM,PVM ! wind components at t-dt +REAL, DIMENSION(D%NIT*D%NJT,D%NKT), INTENT(IN) :: PTKEM ! tke at t-dt -REAL, DIMENSION(:,:,:), INTENT(IN) :: PSVM ! scalar variable a t-dt +REAL, DIMENSION(D%NIT*D%NJT,D%NKT,KSV), INTENT(IN) :: PSVM ! scalar variable a t-dt -REAL, DIMENSION(:,:), INTENT(OUT):: PDUDT_MF ! tendency of U by massflux scheme -REAL, DIMENSION(:,:), INTENT(OUT):: PDVDT_MF ! tendency of V by massflux scheme -REAL, DIMENSION(:,:), INTENT(OUT):: PDTHLDT_MF ! tendency of thl by massflux scheme -REAL, DIMENSION(:,:), INTENT(OUT):: PDRTDT_MF ! tendency of rt by massflux scheme -REAL, DIMENSION(:,:,:), INTENT(OUT):: PDSVDT_MF ! tendency of Sv by massflux scheme +REAL, DIMENSION(D%NIT*D%NJT,D%NKT), INTENT(OUT):: PDUDT_MF ! tendency of U by massflux scheme +REAL, DIMENSION(D%NIT*D%NJT,D%NKT), INTENT(OUT):: PDVDT_MF ! tendency of V by massflux scheme +REAL, DIMENSION(D%NIT*D%NJT,D%NKT), INTENT(OUT):: PDTHLDT_MF ! tendency of thl by massflux scheme +REAL, DIMENSION(D%NIT*D%NJT,D%NKT), INTENT(OUT):: PDRTDT_MF ! tendency of rt by massflux scheme +REAL, DIMENSION(D%NIT*D%NJT,D%NKT,KSV), INTENT(OUT):: PDSVDT_MF ! tendency of Sv by massflux scheme -REAL, DIMENSION(:,:), INTENT(OUT) :: PSIGMF,PRC_MF,PRI_MF,PCF_MF ! cloud info for the cloud scheme -REAL, DIMENSION(:,:), INTENT(OUT) :: PFLXZTHVMF ! Thermal production for TKE scheme -REAL, DIMENSION(:,:), INTENT(OUT) :: PFLXZTHMF -REAL, DIMENSION(:,:), INTENT(OUT) :: PFLXZRMF -REAL, DIMENSION(:,:), INTENT(OUT) :: PFLXZUMF -REAL, DIMENSION(:,:), INTENT(OUT) :: PFLXZVMF -REAL, DIMENSION(:,:), INTENT(INOUT) :: PTHL_UP ! Thl updraft characteristics -REAL, DIMENSION(:,:), INTENT(INOUT) :: PRT_UP ! Rt updraft characteristics -REAL, DIMENSION(:,:), INTENT(OUT) :: PRV_UP ! Vapor updraft characteristics -REAL, DIMENSION(:,:), INTENT(INOUT) :: PU_UP ! U wind updraft characteristics -REAL, DIMENSION(:,:), INTENT(INOUT) :: PV_UP ! V wind updraft characteristics -REAL, DIMENSION(:,:), INTENT(INOUT) :: PRC_UP ! cloud content updraft characteristics -REAL, DIMENSION(:,:), INTENT(INOUT) :: PRI_UP ! ice content updraft characteristics -REAL, DIMENSION(:,:), INTENT(INOUT) :: PTHV_UP ! Thv updraft characteristics -REAL, DIMENSION(:,:), INTENT(INOUT) :: PW_UP ! vertical speed updraft characteristics -REAL, DIMENSION(:,:), INTENT(INOUT) :: PFRAC_UP ! updraft fraction -REAL, DIMENSION(:,:), INTENT(INOUT) :: PEMF ! updraft mass flux -REAL, DIMENSION(:,:), INTENT(OUT) :: PDETR ! updraft detrainment -REAL, DIMENSION(:,:), INTENT(OUT) :: PENTR ! updraft entrainment -INTEGER,DIMENSION(:), INTENT(OUT) :: KKLCL,KKETL,KKCTL ! level of LCL,ETL and CTL -REAL, INTENT(IN) :: PDX, PDY +REAL, DIMENSION(D%NIT*D%NJT,D%NKT), INTENT(OUT) :: PSIGMF,PRC_MF,PRI_MF,PCF_MF ! cloud info for the cloud scheme +REAL, DIMENSION(D%NIT*D%NJT,D%NKT), INTENT(OUT) :: PFLXZTHVMF ! Thermal production for TKE scheme +REAL, DIMENSION(D%NIT*D%NJT,D%NKT), INTENT(OUT) :: PFLXZTHMF +REAL, DIMENSION(D%NIT*D%NJT,D%NKT), INTENT(OUT) :: PFLXZRMF +REAL, DIMENSION(D%NIT*D%NJT,D%NKT), INTENT(OUT) :: PFLXZUMF +REAL, DIMENSION(D%NIT*D%NJT,D%NKT), INTENT(OUT) :: PFLXZVMF +REAL, DIMENSION(D%NIT*D%NJT,D%NKT), INTENT(INOUT) :: PTHL_UP ! Thl updraft characteristics +REAL, DIMENSION(D%NIT*D%NJT,D%NKT), INTENT(INOUT) :: PRT_UP ! Rt updraft characteristics +REAL, DIMENSION(D%NIT*D%NJT,D%NKT), INTENT(OUT) :: PRV_UP ! Vapor updraft characteristics +REAL, DIMENSION(D%NIT*D%NJT,D%NKT), INTENT(INOUT) :: PU_UP ! U wind updraft characteristics +REAL, DIMENSION(D%NIT*D%NJT,D%NKT), INTENT(INOUT) :: PV_UP ! V wind updraft characteristics +REAL, DIMENSION(D%NIT*D%NJT,D%NKT), INTENT(INOUT) :: PRC_UP ! cloud content updraft characteristics +REAL, DIMENSION(D%NIT*D%NJT,D%NKT), INTENT(INOUT) :: PRI_UP ! ice content updraft characteristics +REAL, DIMENSION(D%NIT*D%NJT,D%NKT), INTENT(INOUT) :: PTHV_UP ! Thv updraft characteristics +REAL, DIMENSION(D%NIT*D%NJT,D%NKT), INTENT(INOUT) :: PW_UP ! vertical speed updraft characteristics +REAL, DIMENSION(D%NIT*D%NJT,D%NKT), INTENT(INOUT) :: PFRAC_UP ! updraft fraction +REAL, DIMENSION(D%NIT*D%NJT,D%NKT), INTENT(INOUT) :: PEMF ! updraft mass flux +REAL, DIMENSION(D%NIT*D%NJT,D%NKT), INTENT(OUT) :: PDETR ! updraft detrainment +REAL, DIMENSION(D%NIT*D%NJT,D%NKT), INTENT(OUT) :: PENTR ! updraft entrainment +INTEGER,DIMENSION(D%NIT*D%NJT), INTENT(OUT) :: KKLCL,KKETL,KKCTL ! level of LCL,ETL and CTL +REAL, INTENT(IN) :: PDX, PDY END SUBROUTINE SHALLOW_MF diff --git a/src/common/turb/shallow_mf.F90 b/src/common/turb/shallow_mf.F90 index 814869f50..6fcf18600 100644 --- a/src/common/turb/shallow_mf.F90 +++ b/src/common/turb/shallow_mf.F90 @@ -4,7 +4,8 @@ !MNH_LIC for details. version 1. !----------------------------------------------------------------- ! ################################################################ - SUBROUTINE SHALLOW_MF(KKA,KKU,KKL,KRR,KRRL,KRRI, & + SUBROUTINE SHALLOW_MF(D, CST, NEB, PARAMMF, TURB, & + KRR, KRRL, KRRI, KSV, & HMF_UPDRAFT, HMF_CLOUD, HFRAC_ICE, OMIXUV, & ONOMIXLG,KSV_LGBEG,KSV_LGEND, & PIMPL_MF, PTSTEP, & @@ -71,11 +72,12 @@ !* 0. DECLARATIONS ! ------------ ! -USE MODD_CST -USE MODD_PARAMETERS, ONLY: JPVEXT -USE MODD_NEB, ONLY: NEB -USE MODD_PARAM_MFSHALL_n - +USE MODD_DIMPHYEX, ONLY: DIMPHYEX_t +USE MODD_CST, ONLY: CST_t +USE MODD_NEB, ONLY: NEB_t +USE MODD_PARAM_MFSHALL_n, ONLY: PARAM_MFSHALL_t +USE MODD_TURB_n, ONLY: TURB_t +! USE MODE_THL_RT_FROM_TH_R_MF, ONLY: THL_RT_FROM_TH_R_MF USE MODE_COMPUTE_UPDRAFT, ONLY: COMPUTE_UPDRAFT USE MODE_COMPUTE_UPDRAFT_RHCJ10, ONLY: COMPUTE_UPDRAFT_RHCJ10 @@ -93,12 +95,15 @@ IMPLICIT NONE ! ! ! -INTEGER, INTENT(IN) :: KKA ! near ground array index -INTEGER, INTENT(IN) :: KKU ! uppest atmosphere array index -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(NEB_t), INTENT(IN) :: NEB +TYPE(PARAM_MFSHALL_t), INTENT(IN) :: PARAMMF +TYPE(TURB_t), INTENT(IN) :: TURB INTEGER, INTENT(IN) :: KRR ! number of moist var. INTEGER, INTENT(IN) :: KRRL ! number of liquid water var. INTEGER, INTENT(IN) :: KRRI ! number of ice water var. +INTEGER, INTENT(IN) :: KSV CHARACTER(LEN=4), INTENT(IN) :: HMF_UPDRAFT ! Type of Mass Flux Scheme ! 'NONE' if no parameterization CHARACTER(LEN=4), INTENT(IN) :: HMF_CLOUD ! Type of statistical cloud @@ -111,71 +116,69 @@ INTEGER, INTENT(IN) :: KSV_LGEND ! last index of lag. tracer REAL, INTENT(IN) :: PIMPL_MF ! degre of implicitness REAL, INTENT(IN) :: PTSTEP ! Dynamical timestep -REAL, DIMENSION(:,:), INTENT(IN) :: PZZ ! Height of flux point -REAL, DIMENSION(:,:), INTENT(IN) :: PDZZ ! Metric coefficients -REAL, DIMENSION(:,:), INTENT(IN) :: PRHODJ ! dry density * Grid size -REAL, DIMENSION(:,:), INTENT(IN) :: PRHODREF ! dry density of the +REAL, DIMENSION(D%NIT*D%NJT,D%NKT), INTENT(IN) :: PZZ ! Height of flux point +REAL, DIMENSION(D%NIT*D%NJT,D%NKT), INTENT(IN) :: PDZZ ! Metric coefficients +REAL, DIMENSION(D%NIT*D%NJT,D%NKT), INTENT(IN) :: PRHODJ ! dry density * Grid size +REAL, DIMENSION(D%NIT*D%NJT,D%NKT), INTENT(IN) :: PRHODREF ! dry density of the ! reference state -REAL, DIMENSION(:,:), INTENT(IN) :: PPABSM ! Pressure at time t-1 -REAL, DIMENSION(:,:), INTENT(IN) :: PEXNM ! Exner function at t-dt +REAL, DIMENSION(D%NIT*D%NJT,D%NKT), INTENT(IN) :: PPABSM ! Pressure at time t-1 +REAL, DIMENSION(D%NIT*D%NJT,D%NKT), INTENT(IN) :: PEXNM ! Exner function at t-dt -REAL, DIMENSION(:), INTENT(IN) :: PSFTH,PSFRV ! normal surface fluxes of theta and Rv -REAL, DIMENSION(:,:), INTENT(IN) :: PTHM ! Theta at t-dt -REAL, DIMENSION(:,:,:), INTENT(IN) :: PRM ! water var. at t-dt -REAL, DIMENSION(:,:), INTENT(IN) :: PUM,PVM ! wind components at t-dt -REAL, DIMENSION(:,:), INTENT(IN) :: PTKEM ! tke at t-dt +REAL, DIMENSION(D%NIT*D%NJT), INTENT(IN) :: PSFTH,PSFRV ! normal surface fluxes of theta and Rv +REAL, DIMENSION(D%NIT*D%NJT,D%NKT), INTENT(IN) :: PTHM ! Theta at t-dt +REAL, DIMENSION(D%NIT*D%NJT,D%NKT,KRR), INTENT(IN) :: PRM ! water var. at t-dt +REAL, DIMENSION(D%NIT*D%NJT,D%NKT), INTENT(IN) :: PUM,PVM ! wind components at t-dt +REAL, DIMENSION(D%NIT*D%NJT,D%NKT), INTENT(IN) :: PTKEM ! tke at t-dt -REAL, DIMENSION(:,:,:), INTENT(IN) :: PSVM ! scalar variable a t-dt +REAL, DIMENSION(D%NIT*D%NJT,D%NKT,KSV), INTENT(IN) :: PSVM ! scalar variable a t-dt -REAL, DIMENSION(:,:), INTENT(OUT):: PDUDT_MF ! tendency of U by massflux scheme -REAL, DIMENSION(:,:), INTENT(OUT):: PDVDT_MF ! tendency of V by massflux scheme -REAL, DIMENSION(:,:), INTENT(OUT):: PDTHLDT_MF ! tendency of thl by massflux scheme -REAL, DIMENSION(:,:), INTENT(OUT):: PDRTDT_MF ! tendency of rt by massflux scheme -REAL, DIMENSION(:,:,:), INTENT(OUT):: PDSVDT_MF ! tendency of Sv by massflux scheme +REAL, DIMENSION(D%NIT*D%NJT,D%NKT), INTENT(OUT):: PDUDT_MF ! tendency of U by massflux scheme +REAL, DIMENSION(D%NIT*D%NJT,D%NKT), INTENT(OUT):: PDVDT_MF ! tendency of V by massflux scheme +REAL, DIMENSION(D%NIT*D%NJT,D%NKT), INTENT(OUT):: PDTHLDT_MF ! tendency of thl by massflux scheme +REAL, DIMENSION(D%NIT*D%NJT,D%NKT), INTENT(OUT):: PDRTDT_MF ! tendency of rt by massflux scheme +REAL, DIMENSION(D%NIT*D%NJT,D%NKT,KSV), INTENT(OUT):: PDSVDT_MF ! tendency of Sv by massflux scheme -REAL, DIMENSION(:,:), INTENT(OUT) :: PSIGMF,PRC_MF,PRI_MF,PCF_MF ! cloud info for the cloud scheme -REAL, DIMENSION(:,:), INTENT(OUT) :: PFLXZTHVMF ! Thermal production for TKE scheme -REAL, DIMENSION(:,:), INTENT(OUT) :: PFLXZTHMF -REAL, DIMENSION(:,:), INTENT(OUT) :: PFLXZRMF -REAL, DIMENSION(:,:), INTENT(OUT) :: PFLXZUMF -REAL, DIMENSION(:,:), INTENT(OUT) :: PFLXZVMF -REAL, DIMENSION(:,:), INTENT(INOUT) :: PTHL_UP ! Thl updraft characteristics -REAL, DIMENSION(:,:), INTENT(INOUT) :: PRT_UP ! Rt updraft characteristics -REAL, DIMENSION(:,:), INTENT(INOUT) :: PRV_UP ! Vapor updraft characteristics -REAL, DIMENSION(:,:), INTENT(INOUT) :: PU_UP ! U wind updraft characteristics -REAL, DIMENSION(:,:), INTENT(INOUT) :: PV_UP ! V wind updraft characteristics -REAL, DIMENSION(:,:), INTENT(INOUT) :: PRC_UP ! cloud content updraft characteristics -REAL, DIMENSION(:,:), INTENT(INOUT) :: PRI_UP ! ice content updraft characteristics -REAL, DIMENSION(:,:), INTENT(INOUT) :: PTHV_UP ! Thv updraft characteristics -REAL, DIMENSION(:,:), INTENT(INOUT) :: PW_UP ! vertical speed updraft characteristics -REAL, DIMENSION(:,:), INTENT(INOUT) :: PFRAC_UP ! updraft fraction -REAL, DIMENSION(:,:), INTENT(INOUT) :: PEMF ! updraft mass flux -REAL, DIMENSION(:,:), INTENT(OUT) :: PDETR ! updraft detrainment -REAL, DIMENSION(:,:), INTENT(OUT) :: PENTR ! updraft entrainment -INTEGER,DIMENSION(:), INTENT(OUT) :: KKLCL,KKETL,KKCTL ! level of LCL,ETL and CTL +REAL, DIMENSION(D%NIT*D%NJT,D%NKT), INTENT(OUT) :: PSIGMF,PRC_MF,PRI_MF,PCF_MF ! cloud info for the cloud scheme +REAL, DIMENSION(D%NIT*D%NJT,D%NKT), INTENT(OUT) :: PFLXZTHVMF ! Thermal production for TKE scheme +REAL, DIMENSION(D%NIT*D%NJT,D%NKT), INTENT(OUT) :: PFLXZTHMF +REAL, DIMENSION(D%NIT*D%NJT,D%NKT), INTENT(OUT) :: PFLXZRMF +REAL, DIMENSION(D%NIT*D%NJT,D%NKT), INTENT(OUT) :: PFLXZUMF +REAL, DIMENSION(D%NIT*D%NJT,D%NKT), INTENT(OUT) :: PFLXZVMF +REAL, DIMENSION(D%NIT*D%NJT,D%NKT), INTENT(INOUT) :: PTHL_UP ! Thl updraft characteristics +REAL, DIMENSION(D%NIT*D%NJT,D%NKT), INTENT(INOUT) :: PRT_UP ! Rt updraft characteristics +REAL, DIMENSION(D%NIT*D%NJT,D%NKT), INTENT(INOUT) :: PRV_UP ! Vapor updraft characteristics +REAL, DIMENSION(D%NIT*D%NJT,D%NKT), INTENT(INOUT) :: PU_UP ! U wind updraft characteristics +REAL, DIMENSION(D%NIT*D%NJT,D%NKT), INTENT(INOUT) :: PV_UP ! V wind updraft characteristics +REAL, DIMENSION(D%NIT*D%NJT,D%NKT), INTENT(INOUT) :: PRC_UP ! cloud content updraft characteristics +REAL, DIMENSION(D%NIT*D%NJT,D%NKT), INTENT(INOUT) :: PRI_UP ! ice content updraft characteristics +REAL, DIMENSION(D%NIT*D%NJT,D%NKT), INTENT(INOUT) :: PTHV_UP ! Thv updraft characteristics +REAL, DIMENSION(D%NIT*D%NJT,D%NKT), INTENT(INOUT) :: PW_UP ! vertical speed updraft characteristics +REAL, DIMENSION(D%NIT*D%NJT,D%NKT), INTENT(INOUT) :: PFRAC_UP ! updraft fraction +REAL, DIMENSION(D%NIT*D%NJT,D%NKT), INTENT(INOUT) :: PEMF ! updraft mass flux +REAL, DIMENSION(D%NIT*D%NJT,D%NKT), INTENT(OUT) :: PDETR ! updraft detrainment +REAL, DIMENSION(D%NIT*D%NJT,D%NKT), INTENT(OUT) :: PENTR ! updraft entrainment +INTEGER,DIMENSION(D%NIT*D%NJT), INTENT(OUT) :: KKLCL,KKETL,KKCTL ! level of LCL,ETL and CTL REAL, INTENT(IN) :: PDX, PDY ! ! 0.2 Declaration of local variables ! -REAL, DIMENSION(SIZE(PTHM,1),SIZE(PTHM,2)) :: & +REAL, DIMENSION(D%NIT*D%NJT,D%NKT) :: & ZTHLM, & ! ZRTM, & ! ZTHVM, & ! ZEMF_O_RHODREF, & ! entrainment/detrainment ZBUO_INTEG ! integrated buoyancy -REAL, DIMENSION(SIZE(PTHM,1),SIZE(PTHM,2)) :: ZFRAC_ICE +REAL, DIMENSION(D%NIT*D%NJT,D%NKT) :: ZFRAC_ICE -REAL, DIMENSION(SIZE(PSVM,1),SIZE(PSVM,2),SIZE(PSVM,3)) :: & +REAL, DIMENSION(D%NIT*D%NJT,D%NKT,KSV) :: & ZSV_UP,& ! updraft scalar var. ZFLXZSVMF ! Flux -REAL, DIMENSION(SIZE(PTHM,1)) :: ZDEPTH ! Deepness of cloud -REAL, DIMENSION(SIZE(PTHM,1),SIZE(PTHM,2)) :: ZFRAC_ICE_UP ! liquid/solid fraction in updraft -REAL, DIMENSION(SIZE(PTHM,1),SIZE(PTHM,2)) :: ZRSAT_UP ! Rsat in updraft +REAL, DIMENSION(D%NIT*D%NJT) :: ZDEPTH ! Deepness of cloud +REAL, DIMENSION(D%NIT*D%NJT,D%NKT) :: ZFRAC_ICE_UP ! liquid/solid fraction in updraft +REAL, DIMENSION(D%NIT*D%NJT,D%NKT) :: ZRSAT_UP ! Rsat in updraft LOGICAL :: GENTR_DETR ! flag to recompute entrainment, detrainment and mass flux -INTEGER :: IKB ! near ground physical index -INTEGER :: IKE ! uppest atmosphere physical index -INTEGER, DIMENSION(SIZE(PTHM,1),SIZE(PTHM,2)) :: IERR +INTEGER, DIMENSION(D%NIT*D%NJT,D%NKT) :: IERR ! REAL(KIND=JPRB) :: ZHOOK_HANDLE !------------------------------------------------------------------------ @@ -183,10 +186,6 @@ REAL(KIND=JPRB) :: ZHOOK_HANDLE !!! 1. Initialisation IF (LHOOK) CALL DR_HOOK('SHALLOW_MF',0,ZHOOK_HANDLE) -! vertical boundaries -IKB=KKA+KKL*JPVEXT -IKE=KKU-KKL*JPVEXT - ! updraft governing variables IF (HMF_UPDRAFT == 'EDKF' .OR. HMF_UPDRAFT == 'RHCJ') THEN PENTR = 1.E20 @@ -197,7 +196,7 @@ ENDIF ! Thermodynamics functions ZFRAC_ICE(:,:) = 0. -IF (SIZE(PRM,3).GE.4) THEN +IF (KRR.GE.4) THEN WHERE(PRM(:,:,2)+PRM(:,:,4) > 1.E-20) ZFRAC_ICE(:,:) = PRM(:,:,4) / (PRM(:,:,2)+PRM(:,:,4)) ENDWHERE @@ -210,7 +209,7 @@ CALL THL_RT_FROM_TH_R_MF(KRR,KRRL,KRRI, & ZTHLM, ZRTM ) ! Virtual potential temperature at t-dt -ZTHVM(:,:) = PTHM(:,:)*((1.+XRV / XRD *PRM(:,:,1))/(1.+ZRTM(:,:))) +ZTHVM(:,:) = PTHM(:,:)*((1.+CST%XRV / CST%XRD *PRM(:,:,1))/(1.+ZRTM(:,:))) ! !!! 2. Compute updraft @@ -218,7 +217,7 @@ ZTHVM(:,:) = PTHM(:,:)*((1.+XRV / XRD *PRM(:,:,1))/(1.+ZRTM(:,:))) ! IF (HMF_UPDRAFT == 'EDKF') THEN GENTR_DETR = .TRUE. - CALL COMPUTE_UPDRAFT(KKA,IKB,IKE,KKU,KKL,HFRAC_ICE,GENTR_DETR,OMIXUV,& + CALL COMPUTE_UPDRAFT(D%NKA,D%NKB,D%NKE,D%NKU,D%NKL,HFRAC_ICE,GENTR_DETR,OMIXUV,& ONOMIXLG,KSV_LGBEG,KSV_LGEND, & PZZ,PDZZ, & PSFTH,PSFRV,PPABSM,PRHODREF, & @@ -231,7 +230,7 @@ IF (HMF_UPDRAFT == 'EDKF') THEN PDX,PDY) ELSEIF (HMF_UPDRAFT == 'RHCJ') THEN GENTR_DETR = .TRUE. - CALL COMPUTE_UPDRAFT_RHCJ10(KKA,IKB,IKE,KKU,KKL,HFRAC_ICE,GENTR_DETR,OMIXUV,& + CALL COMPUTE_UPDRAFT_RHCJ10(D%NKA,D%NKB,D%NKE,D%NKU,D%NKL,HFRAC_ICE,GENTR_DETR,OMIXUV,& ONOMIXLG,KSV_LGBEG,KSV_LGEND, & PZZ,PDZZ, & PSFTH,PSFRV,PPABSM,PRHODREF, & @@ -242,7 +241,7 @@ ELSEIF (HMF_UPDRAFT == 'RHCJ') THEN PFRAC_UP,ZFRAC_ICE_UP,ZRSAT_UP,PEMF,PDETR,& PENTR,ZBUO_INTEG,KKLCL,KKETL,KKCTL,ZDEPTH ) ELSEIF (HMF_UPDRAFT == 'RAHA') THEN - CALL COMPUTE_UPDRAFT_RAHA(KKA,IKB,IKE,KKU,KKL,HFRAC_ICE, & + CALL COMPUTE_UPDRAFT_RAHA(D%NKA,D%NKB,D%NKE,D%NKU,D%NKL,HFRAC_ICE, & GENTR_DETR,OMIXUV, & ONOMIXLG,KSV_LGBEG,KSV_LGEND, & PZZ,PDZZ, & @@ -265,7 +264,7 @@ ENDIF !!! 5. Compute diagnostic convective cloud fraction and content !!! -------------------------------------------------------- ! -CALL COMPUTE_MF_CLOUD(KKA,IKB,IKE,KKU,KKL,KRR,KRRL,KRRI,& +CALL COMPUTE_MF_CLOUD(D%NKA,D%NKB,D%NKE,D%NKU,D%NKL,KRR,KRRL,KRRI,& HMF_CLOUD,ZFRAC_ICE, & PRC_UP,PRI_UP,PEMF, & PTHL_UP,PRT_UP,PFRAC_UP, & @@ -283,7 +282,7 @@ CALL COMPUTE_MF_CLOUD(KKA,IKB,IKE,KKU,KKL,KRR,KRRL,KRRI,& ZEMF_O_RHODREF=PEMF/PRHODREF IF ( PIMPL_MF > 1.E-10 ) THEN - CALL MF_TURB(KKA, IKB, IKE, KKU, KKL, OMIXUV, & + CALL MF_TURB(D%NKA,D%NKB,D%NKE,D%NKU,D%NKL, OMIXUV, & ONOMIXLG,KSV_LGBEG,KSV_LGEND, & PIMPL_MF, PTSTEP, & PDZZ, & @@ -294,7 +293,7 @@ IF ( PIMPL_MF > 1.E-10 ) THEN PFLXZTHMF,PFLXZTHVMF,PFLXZRMF,PFLXZUMF,PFLXZVMF, & ZFLXZSVMF ) ELSE - CALL MF_TURB_EXPL(KKA, IKB, IKE, KKU, KKL, OMIXUV, & + CALL MF_TURB_EXPL(D%NKA,D%NKB,D%NKE,D%NKU,D%NKL, OMIXUV, & PRHODJ, & ZTHLM,ZTHVM,ZRTM,PUM,PVM, & PDTHLDT_MF,PDRTDT_MF,PDUDT_MF,PDVDT_MF, & diff --git a/src/mesonh/ext/shallow_mf_pack.f90 b/src/mesonh/ext/shallow_mf_pack.f90 index 5001e4bad..b1134a50f 100644 --- a/src/mesonh/ext/shallow_mf_pack.f90 +++ b/src/mesonh/ext/shallow_mf_pack.f90 @@ -123,11 +123,18 @@ END MODULE MODI_SHALLOW_MF_PACK !* 0. DECLARATIONS ! ------------ ! +USE MODD_CST, ONLY: CST +USE MODD_NEB, ONLY: NEB +USE MODD_TURB_n, ONLY: TURBN +USE MODD_PARAM_MFSHALL_n, ONLY: PARAM_MFSHALLN +USE MODD_DIMPHYEX, ONLY: DIMPHYEX_t +! +USE MODE_FILL_DIMPHYEX, ONLY: FILL_DIMPHYEX +! use modd_budget, only: lbudget_u, lbudget_v, lbudget_th, lbudget_rv, lbudget_sv, & NBUDGET_U, NBUDGET_V, NBUDGET_TH, NBUDGET_RV, NBUDGET_SV1, & tbudgets USE MODD_CONF -USE MODD_CST USE MODD_IO, ONLY: TFILEDATA use modd_field, only: tfielddata, TYPEREAL USE MODD_NSV @@ -260,9 +267,11 @@ INTEGER :: IIU, IJU, IKU, IKB, IKE, IRR, ISV INTEGER :: JK,JRR,JSV ! Loop counters TYPE(TFIELDDATA) :: TZFIELD +TYPE(DIMPHYEX_t) :: YLDIMPHYEX !------------------------------------------------------------------------ !!! 1. Initialisation +CALL FILL_DIMPHYEX(YLDIMPHYEX, SIZE(PZZ,1), SIZE(PZZ,2), SIZE(PZZ,3)) ! Internal Domain IIU=SIZE(PTHM,1) @@ -323,7 +332,8 @@ ZSFRV(:)=RESHAPE(PSFRV(:,:),(/ IIU*IJU /) ) !!! 3. Call of the physical parameterization of massflux vertical transport -CALL SHALLOW_MF(1,IKU,1,KRR,KRRL,KRRI, & +CALL SHALLOW_MF(YLDIMPHYEX, CST, NEB, PARAM_MFSHALLN, TURBN, & + KRR,KRRL,KRRI,ISV, & HMF_UPDRAFT, HMF_CLOUD, CFRAC_ICE_SHALLOW_MF, OMIXUV, & LNOMIXLG,NSV_LGBEG,NSV_LGEND, & PIMPL_MF, PTSTEP, & -- GitLab