From afb26f518583f5c60739b8bf18b88cf2c4c717ac Mon Sep 17 00:00:00 2001 From: Quentin Rodier <quentin.rodier@meteo.fr> Date: Mon, 24 Jan 2022 11:27:36 +0100 Subject: [PATCH] Quentin 24/01/2022: Move routines to mode_ and clean prandtl.F90 --- src/arome/turb/modi_bl89.F90 | 22 - src/arome/turb/modi_emoist.F90 | 26 - src/arome/turb/modi_etheta.F90 | 28 - src/arome/turb/modi_prandtl.F90 | 72 --- src/arome/turb/modi_rmc01.F90 | 24 - src/arome/turb/modi_sbl_depth.F90 | 24 - src/arome/turb/prandtl.F90 | 501 ---------------- src/common/turb/{bl89.F90 => mode_bl89.F90} | 8 + .../turb/{emoist.F90 => mode_emoist.F90} | 7 +- .../turb/{etheta.F90 => mode_etheta.F90} | 5 +- src/common/turb/mode_prandtl.F90 | 4 +- src/common/turb/{rmc01.F90 => mode_rmc01.F90} | 11 +- .../{sbl_depth.F90 => mode_sbl_depth.F90} | 8 + src/common/turb/mode_turb_ver.F90 | 6 +- src/common/turb/mode_turb_ver_sv_corr.F90 | 4 +- src/common/turb/mode_turb_ver_sv_flux.F90 | 4 +- src/common/turb/prandtl.F90 | 540 ------------------ src/common/turb/turb.F90 | 8 +- 18 files changed, 47 insertions(+), 1255 deletions(-) delete mode 100644 src/arome/turb/modi_bl89.F90 delete mode 100644 src/arome/turb/modi_emoist.F90 delete mode 100644 src/arome/turb/modi_etheta.F90 delete mode 100644 src/arome/turb/modi_prandtl.F90 delete mode 100644 src/arome/turb/modi_rmc01.F90 delete mode 100644 src/arome/turb/modi_sbl_depth.F90 delete mode 100644 src/arome/turb/prandtl.F90 rename src/common/turb/{bl89.F90 => mode_bl89.F90} (97%) rename src/common/turb/{emoist.F90 => mode_emoist.F90} (97%) rename src/common/turb/{etheta.F90 => mode_etheta.F90} (98%) rename src/common/turb/{rmc01.F90 => mode_rmc01.F90} (95%) rename src/common/turb/{sbl_depth.F90 => mode_sbl_depth.F90} (92%) delete mode 100644 src/common/turb/prandtl.F90 diff --git a/src/arome/turb/modi_bl89.F90 b/src/arome/turb/modi_bl89.F90 deleted file mode 100644 index e45177299..000000000 --- a/src/arome/turb/modi_bl89.F90 +++ /dev/null @@ -1,22 +0,0 @@ -! ######spl - MODULE MODI_BL89 -! ################ -INTERFACE - SUBROUTINE BL89(KKA,KKU,KKL,PZZ,PDZZ,PTHVREF,PTHLM,KRR,PRM,PTKEM,PSHEAR,PLM) -! -INTEGER, INTENT(IN) :: KKA -INTEGER, INTENT(IN) :: KKU -INTEGER, INTENT(IN) :: KKL -REAL, DIMENSION(:,:,:), INTENT(IN) :: PZZ -REAL, DIMENSION(:,:,:), INTENT(IN) :: PDZZ -REAL, DIMENSION(:,:,:), INTENT(IN) :: PTHVREF -REAL, DIMENSION(:,:,:), INTENT(IN) :: PTHLM -INTEGER, INTENT(IN) :: KRR -REAL, DIMENSION(:,:,:,:), INTENT(IN) :: PRM -REAL, DIMENSION(:,:,:), INTENT(IN) :: PTKEM -REAL, DIMENSION(:,:,:), INTENT(IN) :: PSHEAR -REAL, DIMENSION(:,:,:), INTENT(OUT) :: PLM - -END SUBROUTINE BL89 -END INTERFACE -END MODULE MODI_BL89 diff --git a/src/arome/turb/modi_emoist.F90 b/src/arome/turb/modi_emoist.F90 deleted file mode 100644 index 57e762b71..000000000 --- a/src/arome/turb/modi_emoist.F90 +++ /dev/null @@ -1,26 +0,0 @@ -! ######spl -MODULE MODI_EMOIST -!################# -! -INTERFACE -! -FUNCTION EMOIST(KRR,KRRI,PTHLM,PRM,PLOCPEXNM,PAMOIST,PSRCM) RESULT(PEMOIST) -! -INTEGER :: KRR ! number of moist var. -INTEGER :: KRRI ! number of ice var. -! -REAL, DIMENSION(:,:,:), INTENT(IN) :: PTHLM ! Conservative pot. temperature -REAL, DIMENSION(:,:,:,:), INTENT(IN) :: PRM ! Mixing ratios, where -! PRM(:,:,:,1) = conservative mixing ratio -REAL, DIMENSION(:,:,:), INTENT(IN) :: PLOCPEXNM ! Lv(T)/Cp/Exner at time t-1 -REAL, DIMENSION(:,:,:), INTENT(IN) :: PAMOIST ! Amoist -REAL, DIMENSION(:,:,:), INTENT(IN) :: PSRCM ! Normalized 2dn_order - ! moment s'r'c/2Sigma_s2 -! -REAL,DIMENSION(SIZE(PTHLM,1),SIZE(PTHLM,2),SIZE(PTHLM,3)):: PEMOIST ! result -! -END FUNCTION EMOIST -! -END INTERFACE -! -END MODULE MODI_EMOIST diff --git a/src/arome/turb/modi_etheta.F90 b/src/arome/turb/modi_etheta.F90 deleted file mode 100644 index bc08b8a89..000000000 --- a/src/arome/turb/modi_etheta.F90 +++ /dev/null @@ -1,28 +0,0 @@ -! ######spl -MODULE MODI_ETHETA -!################# -! -INTERFACE -! -FUNCTION ETHETA(KRR,KRRI,PTHLM,PRM,PLOCPEXNM,PATHETA,PSRCM) RESULT(PETHETA) -! -INTEGER :: KRR ! number of moist var. -INTEGER :: KRRI ! number of ice var. -! -REAL, DIMENSION(:,:,:), INTENT(IN) :: PTHLM ! Conservative pot. temperature -REAL, DIMENSION(:,:,:,:), INTENT(IN) :: PRM ! Mixing ratios, where -! PRM(:,:,:,1) = conservative mixing ratio -REAL, DIMENSION(:,:,:), INTENT(IN) :: PLOCPEXNM ! Lv(T)/Cp/Exner at time t-1 -REAL, DIMENSION(:,:,:), INTENT(IN) :: PATHETA ! Atheta -! -REAL, DIMENSION(:,:,:), INTENT(IN) :: PSRCM ! Normalized 2dn_order - ! moment s'r'c/2Sigma_s2 -! -REAL,DIMENSION(SIZE(PTHLM,1),SIZE(PTHLM,2),SIZE(PTHLM,3)):: PETHETA ! result -! -! -END FUNCTION ETHETA -! -END INTERFACE -! -END MODULE MODI_ETHETA diff --git a/src/arome/turb/modi_prandtl.F90 b/src/arome/turb/modi_prandtl.F90 deleted file mode 100644 index 74fb802bf..000000000 --- a/src/arome/turb/modi_prandtl.F90 +++ /dev/null @@ -1,72 +0,0 @@ -! ######spl - MODULE MODI_PRANDTL -! ################### -! -INTERFACE -! - SUBROUTINE PRANDTL(KKA,KKU,KKL,KRR,KRRI,OCLOSE_OUT,OTURB_DIAG,& - HTURBDIM, & - HFMFILE,HLUOUT, & - PDXX,PDYY,PDZZ,PDZX,PDZY, & - PTHVREF,PLOCPEXNM,PATHETA,PAMOIST, & - PLM,PLEPS,PTKEM,PTHLM,PRM,PSVM,PSRCM, & - PREDTH1,PREDR1, & - PRED2TH3, PRED2R3, PRED2THR3, & - PREDS1,PRED2THS3, PRED2RS3, & - PBLL_O_E, & - PETHETA, PEMOIST ) -! -! -INTEGER, INTENT(IN) :: KKA !near ground array index -INTEGER, INTENT(IN) :: KKU !uppest atmosphere array index -INTEGER, INTENT(IN) :: KKL !vert. levels type 1=MNH -1=ARO -INTEGER, INTENT(IN) :: KRR ! number of moist var. -INTEGER, INTENT(IN) :: KRRI ! number of ice var. -! -LOGICAL, INTENT(IN) :: OCLOSE_OUT ! switch for syncronous - ! file opening -LOGICAL, INTENT(IN) :: OTURB_DIAG ! switch to write some - ! diagnostic fields in the syncronous FM-file -CHARACTER*4 , INTENT(IN) :: HTURBDIM ! Kind of turbulence param. -CHARACTER(LEN=*), INTENT(IN) :: HFMFILE ! Name of the output - ! FM-file -CHARACTER(LEN=*), INTENT(IN) :: HLUOUT ! Output-listing name for - ! model n -REAL, DIMENSION(:,:,:), INTENT(IN) :: PDXX,PDYY,PDZZ,PDZX,PDZY - ! metric coefficients -! -REAL, DIMENSION(:,:,:), INTENT(IN) :: PTHVREF ! Virtual Potential Temp. - ! of the reference state -REAL, DIMENSION(:,:,:), INTENT(IN) :: PLOCPEXNM ! Lv(T)/Cp/Exner at t-1 -REAL, DIMENSION(:,:,:), INTENT(IN) :: PATHETA ! coefficients between -REAL, DIMENSION(:,:,:), INTENT(IN) :: PAMOIST ! s and Thetal and Rnp -! -REAL, DIMENSION(:,:,:), INTENT(IN) :: PLM ! Turbulent Mixing length -REAL, DIMENSION(:,:,:), INTENT(IN) :: PLEPS ! Dissipative length -REAL, DIMENSION(:,:,:), INTENT(IN) :: PTHLM,PTKEM! Conservative Potential - ! Temperature and TKE at t-1 -REAL, DIMENSION(:,:,:,:), INTENT(IN) :: PRM ! Mixing ratios at t-1 - ! with PRM(:,:,:,1) = cons. - ! mixing ratio -REAL, DIMENSION(:,:,:,:), INTENT(IN) :: PSVM ! Scalars at t-1 -REAL, DIMENSION(:,:,:), INTENT(IN) :: PSRCM - ! s'r'c/2Sigma_s2 at t-1 multiplied by Lambda_3 -! -! -REAL, DIMENSION(:,:,:), INTENT(OUT) :: PREDTH1 ! Redelsperger number R_theta -REAL, DIMENSION(:,:,:), INTENT(OUT) :: PREDR1 ! Redelsperger number R_q -REAL, DIMENSION(:,:,:), INTENT(OUT) :: PRED2TH3 ! Redelsperger number R*2_theta -REAL, DIMENSION(:,:,:), INTENT(OUT) :: PRED2R3 ! Redelsperger number R*2_q -REAL, DIMENSION(:,:,:), INTENT(OUT) :: PRED2THR3! Redelsperger number R*2_thq -REAL, DIMENSION(:,:,:,:), INTENT(OUT):: PREDS1 ! Redelsperger number R_sv -REAL, DIMENSION(:,:,:,:), INTENT(OUT):: PRED2THS3! Redelsperger number R*2_thsv -REAL, DIMENSION(:,:,:,:), INTENT(OUT):: PRED2RS3 ! Redelsperger number R*2_qsv -REAL, DIMENSION(:,:,:), INTENT(OUT) :: PBLL_O_E! beta*Lk*Leps/tke -REAL, DIMENSION(:,:,:), INTENT(OUT) :: PETHETA ! coefficient E_theta -REAL, DIMENSION(:,:,:), INTENT(OUT) :: PEMOIST ! coefficient E_moist -! -END SUBROUTINE PRANDTL -! -END INTERFACE -! -END MODULE MODI_PRANDTL diff --git a/src/arome/turb/modi_rmc01.F90 b/src/arome/turb/modi_rmc01.F90 deleted file mode 100644 index 1845c21be..000000000 --- a/src/arome/turb/modi_rmc01.F90 +++ /dev/null @@ -1,24 +0,0 @@ -! ######spl - MODULE MODI_RMC01 -! ################ -INTERFACE - SUBROUTINE RMC01(HTURBLEN,KKA,KKU,KKL,PZZ,PDXX,PDYY,PDZZ,PDIRCOSZW, & - PSBL_DEPTH, PLMO, PLK, PLEPS ) -! -CHARACTER(LEN=4), INTENT(IN) :: HTURBLEN ! type of mixing length -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 -REAL, DIMENSION(:,:,:), INTENT(IN) :: PZZ ! altitude of flux points -REAL, DIMENSION(:,:,:), INTENT(IN) :: PDXX ! width of grid mesh (X dir) -REAL, DIMENSION(:,:,:), INTENT(IN) :: PDYY ! width of grid mesh (Y dir) -REAL, DIMENSION(:,:,:), INTENT(IN) :: PDZZ ! width of vert. layers -REAL, DIMENSION(:,:), INTENT(IN) :: PDIRCOSZW ! Director Cosinus -REAL, DIMENSION(:,:), INTENT(IN) :: PSBL_DEPTH! SBL depth -REAL, DIMENSION(:,:), INTENT(IN) :: PLMO ! Monin Obuhkov length -REAL, DIMENSION(:,:,:), INTENT(INOUT) :: PLK ! Mixing length -REAL, DIMENSION(:,:,:), INTENT(INOUT) :: PLEPS ! Dissipative length - -END SUBROUTINE RMC01 -END INTERFACE -END MODULE MODI_RMC01 diff --git a/src/arome/turb/modi_sbl_depth.F90 b/src/arome/turb/modi_sbl_depth.F90 deleted file mode 100644 index 1f9fb9439..000000000 --- a/src/arome/turb/modi_sbl_depth.F90 +++ /dev/null @@ -1,24 +0,0 @@ -! ######spl - MODULE MODI_SBL_DEPTH -! ################ -! -INTERFACE -! - SUBROUTINE SBL_DEPTH(KKB,KKE,PZZ,PFLXU,PFLXV,PWTHV,PLMO,PSBL_DEPTH) -! -INTEGER, INTENT(IN) :: KKB ! first physical level -INTEGER, INTENT(IN) :: KKE ! upper physical level -REAL, DIMENSION(:,:,:), INTENT(IN) :: PZZ ! altitude of flux levels -REAL, DIMENSION(:,:,:), INTENT(IN) :: PFLXU ! u'w' -REAL, DIMENSION(:,:,:), INTENT(IN) :: PFLXV ! v'w' -REAL, DIMENSION(:,:,:), INTENT(IN) :: PWTHV ! buoyancy flux -REAL, DIMENSION(:,:), INTENT(IN) :: PLMO ! Monin-Obukhov length -REAL, DIMENSION(:,:), INTENT(INOUT) :: PSBL_DEPTH! boundary layer height -! -!------------------------------------------------------------------------------- -! -END SUBROUTINE SBL_DEPTH -! -END INTERFACE -! -END MODULE MODI_SBL_DEPTH diff --git a/src/arome/turb/prandtl.F90 b/src/arome/turb/prandtl.F90 deleted file mode 100644 index 3afb18cc4..000000000 --- a/src/arome/turb/prandtl.F90 +++ /dev/null @@ -1,501 +0,0 @@ -! ######spl - SUBROUTINE PRANDTL(KKA,KKU,KKL,KRR,KRRI,OCLOSE_OUT,OTURB_DIAG, & - HTURBDIM, & - HFMFILE,HLUOUT, & - PDXX,PDYY,PDZZ,PDZX,PDZY, & - PTHVREF,PLOCPEXNM,PATHETA,PAMOIST, & - PLM,PLEPS,PTKEM,PTHLM,PRM,PSVM,PSRCM, & - PREDTH1,PREDR1, & - PRED2TH3, PRED2R3, PRED2THR3, & - PREDS1,PRED2THS3, PRED2RS3, & - PBLL_O_E, & - PETHETA, PEMOIST ) - USE PARKIND1, ONLY : JPRB - USE YOMHOOK , ONLY : LHOOK, DR_HOOK - USE MODD_CTURB, ONLY : LHARAT -! ########################################################### -! -! -!!**** *PRANDTL* - routine to compute the Prandtl turbulent numbers -!! -!! PURPOSE -!! ------- -! The purpose of this routine is to compute the Redelsperger -! numbers and then get the turbulent Prandtl and Schmidt numbers: -! * for the heat fluxes - PHI3 = 1/ Prandtl -! * for the moisture fluxes - PSI3 = 1/ Schmidt -! -!!** METHOD -!! ------ -!! The following steps are performed: -!! -!! 1 - default values of 1 are taken for phi3 and psi3 and different masks -!! are defined depending on the presence of turbulence, stratification and -!! humidity. The 1D Redelsperger numbers are computed -!! * ZREDTH1 : (g / THVREF ) (LT**2 / TKE ) ETHETA (D Theta / Dz) -!! * ZREDR1 : (g / THVREF ) (LT**2 / TKE ) EMOIST (D TW / Dz) -!! 2 - 3D Redelsperger numbers are computed only for turbulent -!! grid points where ZREDTH1 or ZREDR1 are > 0. -!! 3 - PHI3 is computed only for turbulent grid points where ZREDTH1 > 0 -!! (turbulent thermally stratified points) -!! 4 - PSI3 is computed only for turbulent grid points where ZREDR1 > 0 -!! (turbulent moist points) -!! -!! -!! EXTERNAL -!! -------- -!! FUNCTIONs ETHETA and EMOIST : -!! allows to compute the coefficients -!! for the turbulent correlation between any variable -!! and the virtual potential temperature, of its correlations -!! with the conservative potential temperature and the humidity -!! conservative variable: -!! ------- ------- ------- -!! A' Thv' = ETHETA A' Thl' + EMOIST A' Rnp' -!! -!! GX_M_M, GY_M_M, GZ_M_M : Cartesian gradient operators -!! MZM : Shuman function (mean operator in the z direction) -!! Module MODI_ETHETA : interface module for ETHETA -!! Module MODI_EMOIST : interface module for EMOIST -!! Module MODI_SHUMAN : interface module for Shuman operators -!! -!! IMPLICIT ARGUMENTS -!! ------------------ -!! Module MODD_CST : contains physical constants -!! XG : gravity constant -!! -!! Module MODD_CTURB: contains the set of constants for -!! the turbulence scheme -!! XCTV,XCPR2 : constants for the turbulent prandtl numbers -!! XTKEMIN : minimum value allowed for the TKE -!! -!! Module MODD_PARAMETERS -!! JPVEXT_TURB : number of vertical marginal points -!! -!! REFERENCE -!! --------- -!! Book 2 of documentation (routine PRANDTL) -!! Book 1 of documentation (Chapter: Turbulence) -!! -!! AUTHOR -!! ------ -!! Joan Cuxart * INM and Meteo-France * -!! -!! MODIFICATIONS -!! ------------- -!! Original 18/10/94 -!! Modifications: Feb 14, 1995 (J.Cuxart and J.Stein) -!! Doctorization and Optimization -!! Modifications: March 21, 1995 (J.M. Carriere) -!! Introduction of cloud water -!! Modifications: March 21, 1995 (J. Cuxart and J.Stein) -!! Phi3 and Psi3 at w point + cleaning -!! Modifications: July 2, 1995 (J.Cuxart and Ph.Bougeault) -!! change the value of Phi3 and Psi3 if negative -!! Modifications: Sept 20, 1995 (J. Stein, J. Cuxart, J.L. Redelsperger) -!! remove the Where + use REDTH1+REDR1 for the tests -!! Modifications: October 10, 1995 (J. Cuxart and J.Stein) -!! Psi3 for tPREDS1he scalar variables -!! Modifications: February 27, 1996 (J.Stein) optimization -!! Modifications: June 15, 1996 (P.Jabouille) return to the previous -!! computation of Phi3 and Psi3 -!! Modifications: October 10, 1996 (J. Stein) change the temporal -!! discretization -!! Modifications: May 23, 1997 (J. Stein) bug in 3D Redels number at ground -!! with orography -!! Modifications: Feb 20, 1998 (J. Stein) bug in all the 3D cases due to -!! the use of ZW1 instead of ZW2 -!! Feb 20, 2003 (JP Pinty) Add PFRAC_ICE -!! July 2005 (Tomas, Masson) implicitation of PHI3 and PSI3 -!! October 2009 (G. Tanguy) add ILENCH=LEN(YCOMMENT) after -!! change of YCOMMENT -!! 2012-02 Y. Seity, add possibility to run with reversed -!! vertical levels -!! Modifications: July 2015 (Wim de Rooy) LHARAT (Racmo turbulence) switch -!! -------------------------------------------------------------------------- -! -!* 0. DECLARATIONS -! ------------ -! -USE MODD_CST -USE MODD_CONF -USE MODD_CTURB -USE MODD_PARAMETERS -! -USE MODI_GRADIENT_M -USE MODI_EMOIST -USE MODI_ETHETA -USE MODI_SHUMAN, ONLY: MZM -USE MODE_FMWRIT -! -IMPLICIT NONE -! -! -!* 0.1 declarations of arguments -! -INTEGER, INTENT(IN) :: KKA !near ground array index -INTEGER, INTENT(IN) :: KKU !uppest atmosphere array index -INTEGER, INTENT(IN) :: KKL !vert. levels type 1=MNH -1=ARO - -INTEGER, INTENT(IN) :: KRR ! number of moist var. -INTEGER, INTENT(IN) :: KRRI ! number of ice var. -! -LOGICAL, INTENT(IN) :: OCLOSE_OUT ! switch for syncronous - ! file opening -LOGICAL, INTENT(IN) :: OTURB_DIAG ! switch to write some - ! diagnostic fields in the syncronous FM-file -CHARACTER*4 , INTENT(IN) :: HTURBDIM ! Kind of turbulence param. -CHARACTER(LEN=*), INTENT(IN) :: HFMFILE ! Name of the output - ! FM-file -CHARACTER(LEN=*), INTENT(IN) :: HLUOUT ! Output-listing name for - ! model n -REAL, DIMENSION(:,:,:), INTENT(IN) :: PDXX,PDYY,PDZZ,PDZX,PDZY - ! metric coefficients -! -REAL, DIMENSION(:,:,:), INTENT(IN) :: PTHVREF ! Virtual Potential Temp. - ! of the reference state -REAL, DIMENSION(:,:,:), INTENT(IN) :: PLOCPEXNM ! Lv(T)/Cp/Exner at t-1 -REAL, DIMENSION(:,:,:), INTENT(IN) :: PATHETA ! coefficients between -REAL, DIMENSION(:,:,:), INTENT(IN) :: PAMOIST ! s and Thetal and Rnp -! -REAL, DIMENSION(:,:,:), INTENT(IN) :: PLM ! Turbulent Mixing length -REAL, DIMENSION(:,:,:), INTENT(IN) :: PLEPS ! Dissipative length -REAL, DIMENSION(:,:,:), INTENT(IN) :: PTHLM,PTKEM! Conservative Potential - ! Temperature and TKE at t-1 -REAL, DIMENSION(:,:,:,:), INTENT(IN) :: PRM ! Mixing ratios at t-1 - ! with PRM(:,:,:,1) = cons. - ! mixing ratio -REAL, DIMENSION(:,:,:,:), INTENT(IN) :: PSVM ! Scalars at t-1 -REAL, DIMENSION(:,:,:), INTENT(IN) :: PSRCM - ! s'r'c/2Sigma_s2 at t-1 multiplied by Lambda_3 -! -! -REAL, DIMENSION(:,:,:), INTENT(OUT) :: PREDTH1 ! Redelsperger number R_theta -REAL, DIMENSION(:,:,:), INTENT(OUT) :: PREDR1 ! Redelsperger number R_q -REAL, DIMENSION(:,:,:), INTENT(OUT) :: PRED2TH3 ! Redelsperger number R*2_theta -REAL, DIMENSION(:,:,:), INTENT(OUT) :: PRED2R3 ! Redelsperger number R*2_q -REAL, DIMENSION(:,:,:), INTENT(OUT) :: PRED2THR3! Redelsperger number R*2_thq -REAL, DIMENSION(:,:,:,:), INTENT(OUT):: PREDS1 ! Redelsperger number R_s -REAL, DIMENSION(:,:,:,:), INTENT(OUT):: PRED2THS3! Redelsperger number R*2_thsv -REAL, DIMENSION(:,:,:,:), INTENT(OUT):: PRED2RS3 ! Redelsperger number R*2_qsv -REAL, DIMENSION(:,:,:), INTENT(OUT) :: PBLL_O_E! beta*Lk*Leps/tke -REAL, DIMENSION(:,:,:), INTENT(OUT) :: PETHETA ! coefficient E_theta -REAL, DIMENSION(:,:,:), INTENT(OUT) :: PEMOIST ! coefficient E_moist -! -! -! 0.2 declaration of local variables -! -REAL, DIMENSION(SIZE(PTHLM,1),SIZE(PTHLM,2),SIZE(PTHLM,3)) :: & - ZW1, ZW2, ZW3 -! working variables -! -INTEGER :: IKB ! vertical index value for the first inner mass point -INTEGER :: IKE ! vertical index value for the last inner mass point -INTEGER :: IRESP ! Return code of FM routines -INTEGER :: ILENG ! Length of the data field in LFIFM file -INTEGER :: IGRID ! C-grid indicator in LFIFM file -INTEGER :: ILENCH ! Length of comment string in LFIFM file -CHARACTER (LEN=100) :: YCOMMENT ! comment string in LFIFM file -CHARACTER (LEN=16) :: YRECFM ! Name of the desired field in LFIFM file -INTEGER:: ISV ! number of scalar variables -INTEGER:: JSV ! loop index for the scalar variables - -INTEGER :: JLOOP -REAL :: ZMINVAL -! --------------------------------------------------------------------------- -! -! -!* 1. DEFAULT VALUES, 1D REDELSPERGER NUMBERS -! ---------------------------------------- -! -REAL(KIND=JPRB) :: ZHOOK_HANDLE -IF (LHOOK) CALL DR_HOOK('PRANDTL',0,ZHOOK_HANDLE) - -IF (LHARAT) THEN -PREDTH1(:,:,:)=0. -PREDR1(:,:,:)=0. -PRED2TH3(:,:,:)=0. -PRED2R3(:,:,:)=0. -PRED2THR3(:,:,:)=0. -PREDS1(:,:,:,:)=0. -PRED2THS3(:,:,:,:)=0. -PRED2RS3(:,:,:,:)=0. -PBLL_O_E(:,:,:)=0. -ENDIF -! -IKB = KKA+JPVEXT_TURB*KKL -IKE = KKU-JPVEXT_TURB*KKL -ILENG=SIZE(PTHLM,1)*SIZE(PTHLM,2)*SIZE(PTHLM,3) -ISV =SIZE(PSVM,4) -! -PETHETA(:,:,:) = MZM(ETHETA(KRR,KRRI,PTHLM,PRM,PLOCPEXNM,PATHETA,PSRCM), KKA, KKU, KKL) -PEMOIST(:,:,:) = MZM(EMOIST(KRR,KRRI,PTHLM,PRM,PLOCPEXNM,PAMOIST,PSRCM), KKA, KKU, KKL) -PETHETA(:,:,KKA) = 2.*PETHETA(:,:,IKB) - PETHETA(:,:,IKB+KKL) -PEMOIST(:,:,KKA) = 2.*PEMOIST(:,:,IKB) - PEMOIST(:,:,IKB+KKL) -! -!--------------------------------------------------------------------------- -IF (.NOT. LHARAT) THEN -! -! 1.3 1D Redelsperger numbers -! -PBLL_O_E(:,:,:) = MZM(XG / PTHVREF(:,:,:) * PLM(:,:,:) * PLEPS(:,:,:) / PTKEM(:,:,:), KKA, KKU, KKL) -IF (KRR /= 0) THEN ! moist case - PREDTH1(:,:,:)= XCTV*PBLL_O_E(:,:,:) * PETHETA(:,:,:) * & - & GZ_M_W(PTHLM,PDZZ, KKA, KKU, KKL) - PREDR1(:,:,:) = XCTV*PBLL_O_E(:,:,:) * PEMOIST(:,:,:) * & - & GZ_M_W(PRM(:,:,:,1),PDZZ, KKA, KKU, KKL) -ELSE ! dry case - PREDTH1(:,:,:)= XCTV*PBLL_O_E(:,:,:) * GZ_M_W(PTHLM,PDZZ, KKA, KKU, KKL) - PREDR1(:,:,:) = 0. -END IF -! -! 3. Limits on 1D Redelperger numbers -! -------------------------------- -! -ZMINVAL = (1.-1./XPHI_LIM) -! -ZW1 = 1. -ZW2 = 1. -! -WHERE (PREDTH1+PREDR1<-ZMINVAL) - ZW1 = (-ZMINVAL) / (PREDTH1+PREDR1) -END WHERE -! -WHERE (PREDTH1<-ZMINVAL) - ZW2 = (-ZMINVAL) / (PREDTH1) -END WHERE -ZW2 = MIN(ZW1,ZW2) -! -ZW1 = 1. -WHERE (PREDR1<-ZMINVAL) - ZW1 = (-ZMINVAL) / (PREDR1) -END WHERE -ZW1 = MIN(ZW2,ZW1) -! -! -! 3. Modification of Mixing length and dissipative length -! ---------------------------------------------------- -! -PBLL_O_E(:,:,:) = PBLL_O_E(:,:,:) * ZW1(:,:,:) -PREDTH1 (:,:,:) = PREDTH1 (:,:,:) * ZW1(:,:,:) -PREDR1 (:,:,:) = PREDR1 (:,:,:) * ZW1(:,:,:) -! -! 4. Threshold for very small (in absolute value) Redelperger numbers -! ---------------------------------------------------------------- -! -ZW2=SIGN(1.,PREDTH1(:,:,:)) -PREDTH1(:,:,:)= ZW2(:,:,:) * MAX(1.E-30, ZW2(:,:,:)*PREDTH1(:,:,:)) -! -IF (KRR /= 0) THEN ! dry case - ZW2=SIGN(1.,PREDR1(:,:,:)) - PREDR1(:,:,:)= ZW2(:,:,:) * MAX(1.E-30, ZW2(:,:,:)*PREDR1(:,:,:)) -END IF -! -! -!--------------------------------------------------------------------------- -! -! For the scalar variables -DO JSV=1,ISV - PREDS1(:,:,:,JSV)=XCTV*PBLL_O_E(:,:,:)*GZ_M_W(PSVM(:,:,:,JSV),PDZZ, KKA, KKU, KKL) -END DO -! -DO JSV=1,ISV - ZW2=SIGN(1.,PREDS1(:,:,:,JSV)) - PREDS1(:,:,:,JSV)= ZW2(:,:,:) * MAX(1.E-30, ZW2(:,:,:)*PREDS1(:,:,:,JSV)) -END DO -! -!--------------------------------------------------------------------------- -! -!* 2. 3D REDELSPERGER NUMBERS -! ------------------------ -! -IF(HTURBDIM=='1DIM') THEN ! 1D case -! -! - PRED2TH3(:,:,:) = PREDTH1(:,:,:)**2 -! - PRED2R3(:,:,:) = PREDR1(:,:,:) **2 -! - PRED2THR3(:,:,:) = PREDTH1(:,:,:) * PREDR1(:,:,:) -! -ELSE IF (L2D) THEN ! 3D case in a 2D model -! - IF (KRR /= 0) THEN ! moist 3D case - PRED2TH3(:,:,:)= PREDTH1(:,:,:)**2+(XCTV*PBLL_O_E(:,:,:)*PETHETA(:,:,:) )**2 * & - MZM(GX_M_M(PTHLM,PDXX,PDZZ,PDZX, KKA, KKU, KKL)**2, KKA, KKU, KKL) - PRED2TH3(:,:,IKB)=PRED2TH3(:,:,IKB+KKL) -! - PRED2R3(:,:,:)= PREDR1(:,:,:)**2 + (XCTV*PBLL_O_E(:,:,:)*PEMOIST(:,:,:))**2 * & - MZM(GX_M_M(PRM(:,:,:,1),PDXX,PDZZ,PDZX, KKA, KKU, KKL)**2, KKA, KKU, KKL) - PRED2R3(:,:,IKB)=PRED2R3(:,:,IKB+KKL) -! - PRED2THR3(:,:,:)= PREDR1(:,:,:) * PREDTH1(:,:,:) + XCTV**2*PBLL_O_E(:,:,:)**2 * & - PEMOIST(:,:,:) * PETHETA(:,:,:) * & - MZM(GX_M_M(PRM(:,:,:,1),PDXX,PDZZ,PDZX, KKA, KKU, KKL)* & - GX_M_M(PTHLM,PDXX,PDZZ,PDZX, KKA, KKU, KKL), KKA, KKU, KKL) - PRED2THR3(:,:,IKB)=PRED2THR3(:,:,IKB+KKL) -! - ELSE ! dry 3D case in a 2D model - PRED2TH3(:,:,:) = PREDTH1(:,:,:)**2 + XCTV**2*PBLL_O_E(:,:,:)**2 * & - MZM(GX_M_M(PTHLM,PDXX,PDZZ,PDZX, KKA, KKU, KKL)**2, KKA, KKU, KKL) - PRED2TH3(:,:,IKB)=PRED2TH3(:,:,IKB+KKL) -! - PRED2R3(:,:,:) = 0. -! - PRED2THR3(:,:,:) = 0. -! - END IF -! -ELSE ! 3D case in a 3D model -! - IF (KRR /= 0) THEN ! moist 3D case - PRED2TH3(:,:,:)= PREDTH1(:,:,:)**2 + ( XCTV*PBLL_O_E(:,:,:)*PETHETA(:,:,:) )**2 * & - MZM(GX_M_M(PTHLM,PDXX,PDZZ,PDZX, KKA, KKU, KKL)**2 & - + GY_M_M(PTHLM,PDYY,PDZZ,PDZY, KKA, KKU, KKL)**2, KKA, KKU, KKL) - PRED2TH3(:,:,IKB)=PRED2TH3(:,:,IKB+KKL) -! - PRED2R3(:,:,:)= PREDR1(:,:,:)**2 + (XCTV*PBLL_O_E(:,:,:)*PEMOIST(:,:,:))**2 * & - MZM(GX_M_M(PRM(:,:,:,1),PDXX,PDZZ,PDZX, KKA, KKU, KKL)**2 + & - GY_M_M(PRM(:,:,:,1),PDYY,PDZZ,PDZY, KKA, KKU, KKL)**2, KKA, KKU, KKL) - PRED2R3(:,:,IKB)=PRED2R3(:,:,IKB+KKL) -! - PRED2THR3(:,:,:)= PREDR1(:,:,:) * PREDTH1(:,:,:) + XCTV**2*PBLL_O_E(:,:,:)**2 * & - PEMOIST(:,:,:) * PETHETA(:,:,:) * & - MZM(GX_M_M(PRM(:,:,:,1),PDXX,PDZZ,PDZX, KKA, KKU, KKL)* & - GX_M_M(PTHLM,PDXX,PDZZ,PDZX, KKA, KKU, KKL)+ & - GY_M_M(PRM(:,:,:,1),PDYY,PDZZ,PDZY, KKA, KKU, KKL)* & - GY_M_M(PTHLM,PDYY,PDZZ,PDZY, KKA, KKU, KKL), KKA, KKU, KKL) - PRED2THR3(:,:,IKB)=PRED2THR3(:,:,IKB+KKL) -! - ELSE ! dry 3D case in a 3D model - PRED2TH3(:,:,:) = PREDTH1(:,:,:)**2 + XCTV**2*PBLL_O_E(:,:,:)**2 * & - MZM(GX_M_M(PTHLM,PDXX,PDZZ,PDZX, KKA, KKU, KKL)**2 & - + GY_M_M(PTHLM,PDYY,PDZZ,PDZY, KKA, KKU, KKL)**2, KKA, KKU, KKL) - PRED2TH3(:,:,IKB)=PRED2TH3(:,:,IKB+KKL) -! - PRED2R3(:,:,:) = 0. -! - PRED2THR3(:,:,:) = 0. -! - END IF -! -END IF ! end of the if structure on the turbulence dimensionnality -! -! -!--------------------------------------------------------------------------- -! -! 5. Prandtl numbers for scalars -! --------------------------- -DO JSV=1,ISV -! - IF(HTURBDIM=='1DIM') THEN -! 1D case - PRED2THS3(:,:,:,JSV) = PREDS1(:,:,:,JSV) * PREDTH1(:,:,:) - IF (KRR /= 0) THEN - PRED2RS3(:,:,:,JSV) = PREDR1(:,:,:) *PREDS1(:,:,:,JSV) - ELSE - PRED2RS3(:,:,:,JSV) = 0. - END IF -! - ELSE IF (L2D) THEN ! 3D case in a 2D model -! - IF (KRR /= 0) THEN - ZW1 = MZM((XG / PTHVREF * PLM * PLEPS / PTKEM)**2, KKA, KKU, KKL) *PETHETA - ELSE - ZW1 = MZM((XG / PTHVREF * PLM * PLEPS / PTKEM)**2, KKA, KKU, KKL) - END IF - PRED2THS3(:,:,:,JSV) = PREDTH1(:,:,:) * PREDS1(:,:,:,JSV) + & - ZW1* & - MZM(GX_M_M(PSVM(:,:,:,JSV),PDXX,PDZZ,PDZX, KKA, KKU, KKL)* & - GX_M_M(PTHLM,PDXX,PDZZ,PDZX, KKA, KKU, KKL), & - KKA, KKU, KKL) -! - IF (KRR /= 0) THEN - PRED2RS3(:,:,:,JSV) = PREDR1(:,:,:) * PREDS1(:,:,:,JSV) + & - ZW1 * PEMOIST * & - MZM(GX_M_M(PSVM(:,:,:,JSV),PDXX,PDZZ,PDZX, KKA, KKU, KKL)* & - GX_M_M(PRM(:,:,:,1),PDXX,PDZZ,PDZX, KKA, KKU, KKL), & - KKA, KKU, KKL) - ELSE - PRED2RS3(:,:,:,JSV) = 0. - END IF -! - ELSE ! 3D case in a 3D model -! - IF (KRR /= 0) THEN - ZW1 = MZM((XG / PTHVREF * PLM * PLEPS / PTKEM)**2, KKA, KKU, KKL) *PETHETA - ELSE - ZW1 = MZM((XG / PTHVREF * PLM * PLEPS / PTKEM)**2, KKA, KKU, KKL) - END IF - PRED2THS3(:,:,:,JSV) = PREDTH1(:,:,:) * PREDS1(:,:,:,JSV) + & - ZW1* & - MZM(GX_M_M(PSVM(:,:,:,JSV),PDXX,PDZZ,PDZX, KKA, KKU, KKL)* & - GX_M_M(PTHLM,PDXX,PDZZ,PDZX, KKA, KKU, KKL) & - +GY_M_M(PSVM(:,:,:,JSV),PDYY,PDZZ,PDZY, KKA, KKU, KKL)* & - GY_M_M(PTHLM,PDYY,PDZZ,PDZY, KKA, KKU, KKL), & - KKA, KKU, KKL) -! - IF (KRR /= 0) THEN - PRED2RS3(:,:,:,JSV) = PREDR1(:,:,:) * PREDS1(:,:,:,JSV) + & - ZW1 * PEMOIST * & - MZM(GX_M_M(PSVM(:,:,:,JSV),PDXX,PDZZ,PDZX, KKA, KKU, KKL)* & - GX_M_M(PRM(:,:,:,1),PDXX,PDZZ,PDZX, KKA, KKU, KKL) & - +GY_M_M(PSVM(:,:,:,JSV),PDYY,PDZZ,PDZY, KKA, KKU, KKL)* & - GY_M_M(PRM(:,:,:,1),PDYY,PDZZ,PDZY, KKA, KKU, KKL), & - KKA, KKU, KKL) - ELSE - PRED2RS3(:,:,:,JSV) = 0. - END IF -! - END IF ! end of HTURBDIM if-block -! -END DO -! -!--------------------------------------------------------------------------- -! -!* 6. SAVES THE REDELSPERGER NUMBERS -! ------------------------------ -! -IF ( OTURB_DIAG .AND. OCLOSE_OUT ) THEN - ! - ! stores the RED_TH1 - YRECFM ='RED_TH1' - YCOMMENT='X_Y_Z_RED_TH1 (0)' - IGRID = 4 - ILENCH=LEN(YCOMMENT) - CALL FMWRIT(HFMFILE,YRECFM,HLUOUT,'XY',PREDTH1,IGRID,ILENCH,YCOMMENT,IRESP) - ! - ! stores the RED_R1 - YRECFM ='RED_R1' - YCOMMENT='X_Y_Z_RED_R1 (0)' - IGRID = 4 - ILENCH=LEN(YCOMMENT) - CALL FMWRIT(HFMFILE,YRECFM,HLUOUT,'XY',PREDR1,IGRID,ILENCH,YCOMMENT,IRESP) - ! - ! stores the RED2_TH3 - YRECFM ='RED2_TH3' - YCOMMENT='X_Y_Z_RED2_TH3 (0)' - IGRID = 4 - ILENCH=LEN(YCOMMENT) - CALL FMWRIT(HFMFILE,YRECFM,HLUOUT,'XY',PRED2TH3,IGRID,ILENCH,YCOMMENT,IRESP) - ! - ! stores the RED2_R3 - YRECFM ='RED2_R3' - YCOMMENT='X_Y_Z_RED2_R3 (0)' - IGRID = 4 - ILENCH=LEN(YCOMMENT) - CALL FMWRIT(HFMFILE,YRECFM,HLUOUT,'XY',PRED2R3,IGRID,ILENCH,YCOMMENT,IRESP) - ! - ! stores the RED2_THR3 - YRECFM ='RED2_THR3' - YCOMMENT='X_Y_Z_RED2_THR3 (0)' - IGRID = 4 - ILENCH=LEN(YCOMMENT) - CALL FMWRIT(HFMFILE,YRECFM,HLUOUT,'XY',PRED2THR3,IGRID,ILENCH,YCOMMENT,IRESP) -END IF -! -!--------------------------------------------------------------------------- -ENDIF ! (Done only if LHARAT is FALSE) -! -IF (LHOOK) CALL DR_HOOK('PRANDTL',1,ZHOOK_HANDLE) -END SUBROUTINE PRANDTL diff --git a/src/common/turb/bl89.F90 b/src/common/turb/mode_bl89.F90 similarity index 97% rename from src/common/turb/bl89.F90 rename to src/common/turb/mode_bl89.F90 index 57056e481..9208fcb6b 100644 --- a/src/common/turb/bl89.F90 +++ b/src/common/turb/mode_bl89.F90 @@ -1,3 +1,10 @@ +!MNH_LIC Copyright 1994-2022 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_BL89 +IMPLICIT NONE +CONTAINS ! ######spl SUBROUTINE BL89(KKA,KKU,KKL,PZZ,PDZZ,PTHVREF,PTHLM,KRR,PRM,PTKEM,PSHEAR,PLM) USE PARKIND1, ONLY : JPRB @@ -348,3 +355,4 @@ END IF ! IF (LHOOK) CALL DR_HOOK('BL89',1,ZHOOK_HANDLE) END SUBROUTINE BL89 +END MODULE MODE_BL89 diff --git a/src/common/turb/emoist.F90 b/src/common/turb/mode_emoist.F90 similarity index 97% rename from src/common/turb/emoist.F90 rename to src/common/turb/mode_emoist.F90 index f17bc3168..b06579b1f 100644 --- a/src/common/turb/emoist.F90 +++ b/src/common/turb/mode_emoist.F90 @@ -1,8 +1,10 @@ -!MNH_LIC Copyright 1995-2021 CNRS, Meteo-France and Universite Paul Sabatier +!MNH_LIC Copyright 1995-2022 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_EMOIST +IMPLICIT NONE +CONTAINS FUNCTION EMOIST(KRR,KRRI,PTHLM,PRM,PLOCPEXNM,PAMOIST,PSRCM) RESULT(PEMOIST) USE PARKIND1, ONLY : JPRB USE YOMHOOK , ONLY : LHOOK, DR_HOOK @@ -162,3 +164,4 @@ END IF ! IF (LHOOK) CALL DR_HOOK('EMOIST',1,ZHOOK_HANDLE) END FUNCTION EMOIST +END MODULE MODE_EMOIST diff --git a/src/common/turb/etheta.F90 b/src/common/turb/mode_etheta.F90 similarity index 98% rename from src/common/turb/etheta.F90 rename to src/common/turb/mode_etheta.F90 index f0506bd89..4e3e91fad 100644 --- a/src/common/turb/etheta.F90 +++ b/src/common/turb/mode_etheta.F90 @@ -2,7 +2,9 @@ !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_ETHETA +IMPLICIT NONE +CONTAINS FUNCTION ETHETA(KRR,KRRI,PTHLM,PRM,PLOCPEXNM,PATHETA,PSRCM) RESULT(PETHETA) USE PARKIND1, ONLY : JPRB USE YOMHOOK , ONLY : LHOOK, DR_HOOK @@ -153,3 +155,4 @@ END IF ! IF (LHOOK) CALL DR_HOOK('ETHETA',1,ZHOOK_HANDLE) END FUNCTION ETHETA +END MODULE MODE_ETHETA diff --git a/src/common/turb/mode_prandtl.F90 b/src/common/turb/mode_prandtl.F90 index 6a84eb9b3..9cce0c874 100644 --- a/src/common/turb/mode_prandtl.F90 +++ b/src/common/turb/mode_prandtl.F90 @@ -151,8 +151,8 @@ USE MODD_IO, ONLY: TFILEDATA USE MODD_PARAMETERS ! USE MODI_GRADIENT_M -USE MODI_EMOIST -USE MODI_ETHETA +USE MODE_EMOIST, ONLY: EMOIST +USE MODE_ETHETA, ONLY: ETHETA USE MODI_SHUMAN, ONLY: MZM USE MODE_IO_FIELD_WRITE, ONLY: IO_FIELD_WRITE ! diff --git a/src/common/turb/rmc01.F90 b/src/common/turb/mode_rmc01.F90 similarity index 95% rename from src/common/turb/rmc01.F90 rename to src/common/turb/mode_rmc01.F90 index 7488d6cbd..628b4cad0 100644 --- a/src/common/turb/rmc01.F90 +++ b/src/common/turb/mode_rmc01.F90 @@ -1,5 +1,11 @@ -! ######spl - SUBROUTINE RMC01(HTURBLEN,KKA,KKU,KKL,PZZ,PDXX,PDYY, & +!MNH_LIC Copyright 1994-2022 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_RMC01 +IMPLICIT NONE +CONTAINS +SUBROUTINE RMC01(HTURBLEN,KKA,KKU,KKL,PZZ,PDXX,PDYY, & PDZZ,PDIRCOSZW,PSBL_DEPTH,PLMO,PLK,PLEPS) USE PARKIND1, ONLY : JPRB USE YOMHOOK , ONLY : LHOOK, DR_HOOK @@ -233,3 +239,4 @@ PLEPS(:,:,KKU ) = PLEPS(:,:,IKE) ! IF (LHOOK) CALL DR_HOOK('RMC01',1,ZHOOK_HANDLE) END SUBROUTINE RMC01 +END MODULE MODE_RMC01 diff --git a/src/common/turb/sbl_depth.F90 b/src/common/turb/mode_sbl_depth.F90 similarity index 92% rename from src/common/turb/sbl_depth.F90 rename to src/common/turb/mode_sbl_depth.F90 index 0c670f8db..8de257fe9 100644 --- a/src/common/turb/sbl_depth.F90 +++ b/src/common/turb/mode_sbl_depth.F90 @@ -1,3 +1,10 @@ +!MNH_LIC Copyright 1994-2022 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_SBL_DEPTH +IMPLICIT NONE +CONTAINS ! ######spl SUBROUTINE SBL_DEPTH(KKB,KKE,PZZ,PFLXU,PFLXV,PWTHV,PLMO,PSBL_DEPTH) USE PARKIND1, ONLY : JPRB @@ -119,3 +126,4 @@ WHERE (PLMO(:,:)==XUNDEF) PSBL_DEPTH = ZSBL_DYN !---------------------------------------------------------------------------- IF (LHOOK) CALL DR_HOOK('SBL_DEPTH',1,ZHOOK_HANDLE) END SUBROUTINE SBL_DEPTH +END MODULE MODE_SBL_DEPTH diff --git a/src/common/turb/mode_turb_ver.F90 b/src/common/turb/mode_turb_ver.F90 index 32e00a0af..2860adfd3 100644 --- a/src/common/turb/mode_turb_ver.F90 +++ b/src/common/turb/mode_turb_ver.F90 @@ -219,8 +219,8 @@ USE MODD_LES USE MODD_NSV, ONLY: NSV ! !USE MODE_PRANDTL, ONLY: PRANDTL -USE MODI_EMOIST -USE MODI_ETHETA +USE MODE_EMOIST, ONLY: EMOIST +USE MODE_ETHETA, ONLY: ETHETA USE MODI_GRADIENT_M USE MODI_GRADIENT_W USE MODI_TURB @@ -230,7 +230,7 @@ USE MODE_TURB_VER_DYN_FLUX, ONLY: TURB_VER_DYN_FLUX USE MODE_TURB_VER_SV_FLUX, ONLY: TURB_VER_SV_FLUX USE MODE_TURB_VER_SV_CORR, ONLY: TURB_VER_SV_CORR USE MODI_LES_MEAN_SUBGRID -USE MODI_SBL_DEPTH +USE MODE_SBL_DEPTH, ONLY: SBL_DEPTH USE MODI_SECOND_MNH ! USE MODE_IO_FIELD_WRITE, only: IO_Field_write diff --git a/src/common/turb/mode_turb_ver_sv_corr.F90 b/src/common/turb/mode_turb_ver_sv_corr.F90 index 7de442316..97928bf69 100644 --- a/src/common/turb/mode_turb_ver_sv_corr.F90 +++ b/src/common/turb/mode_turb_ver_sv_corr.F90 @@ -69,8 +69,8 @@ USE MODI_GRADIENT_V USE MODI_GRADIENT_W USE MODI_GRADIENT_M USE MODI_SHUMAN , ONLY : MZF -USE MODI_EMOIST -USE MODI_ETHETA +USE MODE_EMOIST, ONLY: EMOIST +USE MODE_ETHETA, ONLY: ETHETA USE MODI_LES_MEAN_SUBGRID ! USE MODI_SECOND_MNH diff --git a/src/common/turb/mode_turb_ver_sv_flux.F90 b/src/common/turb/mode_turb_ver_sv_flux.F90 index 6fdbba5c3..781e1b125 100644 --- a/src/common/turb/mode_turb_ver_sv_flux.F90 +++ b/src/common/turb/mode_turb_ver_sv_flux.F90 @@ -227,8 +227,8 @@ USE MODI_GRADIENT_W USE MODI_GRADIENT_M USE MODI_SHUMAN , ONLY : DZM, MZM, MZF USE MODE_TRIDIAG, ONLY: TRIDIAG -USE MODI_EMOIST -USE MODI_ETHETA +USE MODE_EMOIST, ONLY: EMOIST +USE MODE_ETHETA, ONLY: ETHETA USE MODI_LES_MEAN_SUBGRID ! USE MODI_SECOND_MNH diff --git a/src/common/turb/prandtl.F90 b/src/common/turb/prandtl.F90 deleted file mode 100644 index 458899f39..000000000 --- a/src/common/turb/prandtl.F90 +++ /dev/null @@ -1,540 +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 MODE_PRANDTL -IMPLICIT NONE -CONTAINS - SUBROUTINE PRANDTL(KKA,KKU,KKL,KRR,KRRI,OTURB_DIAG, & - HTURBDIM, & - TPFILE, & - PDXX,PDYY,PDZZ,PDZX,PDZY, & - PTHVREF,PLOCPEXNM,PATHETA,PAMOIST, & - PLM,PLEPS,PTKEM,PTHLM,PRM,PSVM,PSRCM, & - PREDTH1,PREDR1, & - PRED2TH3, PRED2R3, PRED2THR3, & - PREDS1,PRED2THS3, PRED2RS3, & - PBLL_O_E, & - PETHETA, PEMOIST ) -! ########################################################### -! -! -!!**** *PRANDTL* - routine to compute the Prandtl turbulent numbers -!! -!! PURPOSE -!! ------- -! The purpose of this routine is to compute the Redelsperger -! numbers and then get the turbulent Prandtl and Schmidt numbers: -! * for the heat fluxes - PHI3 = 1/ Prandtl -! * for the moisture fluxes - PSI3 = 1/ Schmidt -! -!!** METHOD -!! ------ -!! The following steps are performed: -!! -!! 1 - default values of 1 are taken for phi3 and psi3 and different masks -!! are defined depending on the presence of turbulence, stratification and -!! humidity. The 1D Redelsperger numbers are computed -!! * ZREDTH1 : (g / THVREF ) (LT**2 / TKE ) ETHETA (D Theta / Dz) -!! * ZREDR1 : (g / THVREF ) (LT**2 / TKE ) EMOIST (D TW / Dz) -!! 2 - 3D Redelsperger numbers are computed only for turbulent -!! grid points where ZREDTH1 or ZREDR1 are > 0. -!! 3 - PHI3 is computed only for turbulent grid points where ZREDTH1 > 0 -!! (turbulent thermally stratified points) -!! 4 - PSI3 is computed only for turbulent grid points where ZREDR1 > 0 -!! (turbulent moist points) -!! -!! -!! EXTERNAL -!! -------- -!! FUNCTIONs ETHETA and EMOIST : -!! allows to compute the coefficients -!! for the turbulent correlation between any variable -!! and the virtual potential temperature, of its correlations -!! with the conservative potential temperature and the humidity -!! conservative variable: -!! ------- ------- ------- -!! A' Thv' = ETHETA A' Thl' + EMOIST A' Rnp' -!! -!! GX_M_M, GY_M_M, GZ_M_M : Cartesian gradient operators -!! MZM : Shuman function (mean operator in the z direction) -!! Module MODI_ETHETA : interface module for ETHETA -!! Module MODI_EMOIST : interface module for EMOIST -!! Module MODI_SHUMAN : interface module for Shuman operators -!! -!! IMPLICIT ARGUMENTS -!! ------------------ -!! Module MODD_CST : contains physical constants -!! XG : gravity constant -!! -!! Module MODD_CTURB: contains the set of constants for -!! the turbulence scheme -!! XCTV,XCPR2 : constants for the turbulent prandtl numbers -!! XTKEMIN : minimum value allowed for the TKE -!! -!! Module MODD_PARAMETERS -!! JPVEXT_TURB : number of vertical marginal points -!! -!! REFERENCE -!! --------- -!! Book 2 of documentation (routine PRANDTL) -!! Book 1 of documentation (Chapter: Turbulence) -!! -!! AUTHOR -!! ------ -!! Joan Cuxart * INM and Meteo-France * -!! -!! MODIFICATIONS -!! ------------- -!! Original 18/10/94 -!! Modifications: Feb 14, 1995 (J.Cuxart and J.Stein) -!! Doctorization and Optimization -!! Modifications: March 21, 1995 (J.M. Carriere) -!! Introduction of cloud water -!! Modifications: March 21, 1995 (J. Cuxart and J.Stein) -!! Phi3 and Psi3 at w point + cleaning -!! Modifications: July 2, 1995 (J.Cuxart and Ph.Bougeault) -!! change the value of Phi3 and Psi3 if negative -!! Modifications: Sept 20, 1995 (J. Stein, J. Cuxart, J.L. Redelsperger) -!! remove the Where + use REDTH1+REDR1 for the tests -!! Modifications: October 10, 1995 (J. Cuxart and J.Stein) -!! Psi3 for tPREDS1he scalar variables -!! Modifications: February 27, 1996 (J.Stein) optimization -!! Modifications: June 15, 1996 (P.Jabouille) return to the previous -!! computation of Phi3 and Psi3 -!! Modifications: October 10, 1996 (J. Stein) change the temporal -!! discretization -!! Modifications: May 23, 1997 (J. Stein) bug in 3D Redels number at ground -!! with orography -!! Modifications: Feb 20, 1998 (J. Stein) bug in all the 3D cases due to -!! the use of ZW1 instead of ZW2 -!! Feb 20, 2003 (JP Pinty) Add PFRAC_ICE -!! July 2005 (Tomas, Masson) implicitation of PHI3 and PSI3 -!! October 2009 (G. Tanguy) add ILENCH=LEN(YCOMMENT) after -!! change of YCOMMENT -!! 2012-02 Y. Seity, add possibility to run with reversed -!! vertical levels -!! Modifications: July 2015 (Wim de Rooy) LHARAT (Racmo turbulence) switch -!! 2017-09 J.Escobar, use epsilon XMNH_TINY_12 for R*4 -!! Philippe Wautelet: 05/2016-04/2018: new data structures and calls for I/O -!! JL Redelsperger 03/2021 : adding Ocean case for temperature only -!! -------------------------------------------------------------------------- -! -!* 0. DECLARATIONS -! ------------ -! -USE PARKIND1, ONLY : JPRB -USE YOMHOOK , ONLY : LHOOK, DR_HOOK -! -USE MODD_CST -USE MODD_CONF -USE MODD_CTURB -USE MODD_DYN_n, ONLY: LOCEAN -USE MODD_FIELD, ONLY: TFIELDDATA, TYPEREAL -USE MODD_IO, ONLY: TFILEDATA -USE MODD_PARAMETERS -! -USE MODI_GRADIENT_M -USE MODI_EMOIST -USE MODI_ETHETA -USE MODI_SHUMAN, ONLY: MZM -USE MODE_IO_FIELD_WRITE, ONLY: IO_FIELD_WRITE -! -IMPLICIT NONE -! -! -!* 0.1 declarations of arguments -! -INTEGER, INTENT(IN) :: KKA !near ground array index -INTEGER, INTENT(IN) :: KKU !uppest atmosphere array index -INTEGER, INTENT(IN) :: KKL !vert. levels type 1=MNH -1=ARO - -INTEGER, INTENT(IN) :: KRR ! number of moist var. -INTEGER, INTENT(IN) :: KRRI ! number of ice var. -! -LOGICAL, INTENT(IN) :: OTURB_DIAG ! switch to write some - ! diagnostic fields in the syncronous FM-file -CHARACTER(LEN=4), INTENT(IN) :: HTURBDIM ! Kind of turbulence param. -TYPE(TFILEDATA), INTENT(IN) :: TPFILE ! Output file -REAL, DIMENSION(:,:,:), INTENT(IN) :: PDXX,PDYY,PDZZ,PDZX,PDZY - ! metric coefficients -! -REAL, DIMENSION(:,:,:), INTENT(IN) :: PTHVREF ! Virtual Potential Temp. - ! of the reference state -REAL, DIMENSION(:,:,:), INTENT(IN) :: PLOCPEXNM ! Lv(T)/Cp/Exner at t-1 -REAL, DIMENSION(:,:,:), INTENT(IN) :: PATHETA ! coefficients between -REAL, DIMENSION(:,:,:), INTENT(IN) :: PAMOIST ! s and Thetal and Rnp -! -REAL, DIMENSION(:,:,:), INTENT(IN) :: PLM ! Turbulent Mixing length -REAL, DIMENSION(:,:,:), INTENT(IN) :: PLEPS ! Dissipative length -REAL, DIMENSION(:,:,:), INTENT(IN) :: PTHLM,PTKEM! Conservative Potential - ! Temperature and TKE at t-1 -REAL, DIMENSION(:,:,:,:), INTENT(IN) :: PRM ! Mixing ratios at t-1 - ! with PRM(:,:,:,1) = cons. - ! mixing ratio -REAL, DIMENSION(:,:,:,:), INTENT(IN) :: PSVM ! Scalars at t-1 -REAL, DIMENSION(:,:,:), INTENT(IN) :: PSRCM - ! s'r'c/2Sigma_s2 at t-1 multiplied by Lambda_3 -! -! -REAL, DIMENSION(:,:,:), INTENT(OUT) :: PREDTH1 ! Redelsperger number R_theta -REAL, DIMENSION(:,:,:), INTENT(OUT) :: PREDR1 ! Redelsperger number R_q -REAL, DIMENSION(:,:,:), INTENT(OUT) :: PRED2TH3 ! Redelsperger number R*2_theta -REAL, DIMENSION(:,:,:), INTENT(OUT) :: PRED2R3 ! Redelsperger number R*2_q -REAL, DIMENSION(:,:,:), INTENT(OUT) :: PRED2THR3! Redelsperger number R*2_thq -REAL, DIMENSION(:,:,:,:), INTENT(OUT):: PREDS1 ! Redelsperger number R_s -REAL, DIMENSION(:,:,:,:), INTENT(OUT):: PRED2THS3! Redelsperger number R*2_thsv -REAL, DIMENSION(:,:,:,:), INTENT(OUT):: PRED2RS3 ! Redelsperger number R*2_qsv -REAL, DIMENSION(:,:,:), INTENT(OUT) :: PBLL_O_E! beta*Lk*Leps/tke -REAL, DIMENSION(:,:,:), INTENT(OUT) :: PETHETA ! coefficient E_theta -REAL, DIMENSION(:,:,:), INTENT(OUT) :: PEMOIST ! coefficient E_moist -! -! -! 0.2 declaration of local variables -! -REAL, DIMENSION(SIZE(PTHLM,1),SIZE(PTHLM,2),SIZE(PTHLM,3)) :: & - ZW1, ZW2, ZW3 -! working variables -! -INTEGER :: IKB ! vertical index value for the first inner mass point -INTEGER :: IKE ! vertical index value for the last inner mass point -INTEGER :: IRESP ! Return code of FM routines -INTEGER :: ILENG ! Length of the data field in LFIFM file -INTEGER :: IGRID ! C-grid indicator in LFIFM file -INTEGER :: ILENCH ! Length of comment string in LFIFM file -CHARACTER (LEN=100) :: YCOMMENT ! comment string in LFIFM file -CHARACTER (LEN=16) :: YRECFM ! Name of the desired field in LFIFM file -INTEGER:: ISV ! number of scalar variables -INTEGER:: JSV ! loop index for the scalar variables - -INTEGER :: JLOOP -REAL :: ZMINVAL -TYPE(TFIELDDATA) :: TZFIELD -! --------------------------------------------------------------------------- -! -!* 1. DEFAULT VALUES, 1D REDELSPERGER NUMBERS -! ---------------------------------------- -! -REAL(KIND=JPRB) :: ZHOOK_HANDLE -IF (LHOOK) CALL DR_HOOK('PRANDTL',0,ZHOOK_HANDLE) - -IF (LHARAT) THEN -PREDTH1(:,:,:)=0. -PREDR1(:,:,:)=0. -PRED2TH3(:,:,:)=0. -PRED2R3(:,:,:)=0. -PRED2THR3(:,:,:)=0. -PREDS1(:,:,:,:)=0. -PRED2THS3(:,:,:,:)=0. -PRED2RS3(:,:,:,:)=0. -PBLL_O_E(:,:,:)=0. -ENDIF -! -IKB = KKA+JPVEXT_TURB*KKL -IKE = KKU-JPVEXT_TURB*KKL -ILENG=SIZE(PTHLM,1)*SIZE(PTHLM,2)*SIZE(PTHLM,3) -ISV =SIZE(PSVM,4) -! -PETHETA(:,:,:) = MZM(ETHETA(KRR,KRRI,PTHLM,PRM,PLOCPEXNM,PATHETA,PSRCM), KKA, KKU, KKL) -PEMOIST(:,:,:) = MZM(EMOIST(KRR,KRRI,PTHLM,PRM,PLOCPEXNM,PAMOIST,PSRCM), KKA, KKU, KKL) -PETHETA(:,:,KKA) = 2.*PETHETA(:,:,IKB) - PETHETA(:,:,IKB+KKL) -PEMOIST(:,:,KKA) = 2.*PEMOIST(:,:,IKB) - PEMOIST(:,:,IKB+KKL) -! -!--------------------------------------------------------------------------- -IF (.NOT. LHARAT) THEN -! -! 1.3 1D Redelsperger numbers -! -PBLL_O_E(:,:,:) = MZM(XG / PTHVREF(:,:,:) * PLM(:,:,:) * PLEPS(:,:,:) / PTKEM(:,:,:), KKA, KKU, KKL) -IF (KRR /= 0) THEN ! moist case - PREDTH1(:,:,:)= XCTV*PBLL_O_E(:,:,:) * PETHETA(:,:,:) * & - & GZ_M_W(PTHLM,PDZZ, KKA, KKU, KKL) - PREDR1(:,:,:) = XCTV*PBLL_O_E(:,:,:) * PEMOIST(:,:,:) * & - & GZ_M_W(PRM(:,:,:,1),PDZZ, KKA, KKU, KKL) -ELSE ! dry case - PREDTH1(:,:,:)= XCTV*PBLL_O_E(:,:,:) * GZ_M_W(PTHLM,PDZZ, KKA, KKU, KKL) - PREDR1(:,:,:) = 0. -END IF -! -! 3. Limits on 1D Redelperger numbers -! -------------------------------- -! -ZMINVAL = (1.-1./XPHI_LIM) -! -ZW1 = 1. -ZW2 = 1. -! -WHERE (PREDTH1+PREDR1<-ZMINVAL) - ZW1 = (-ZMINVAL) / (PREDTH1+PREDR1) -END WHERE -! -WHERE (PREDTH1<-ZMINVAL) - ZW2 = (-ZMINVAL) / (PREDTH1) -END WHERE -ZW2 = MIN(ZW1,ZW2) -! -ZW1 = 1. -WHERE (PREDR1<-ZMINVAL) - ZW1 = (-ZMINVAL) / (PREDR1) -END WHERE -ZW1 = MIN(ZW2,ZW1) -! -! -! 3. Modification of Mixing length and dissipative length -! ---------------------------------------------------- -! -PBLL_O_E(:,:,:) = PBLL_O_E(:,:,:) * ZW1(:,:,:) -PREDTH1 (:,:,:) = PREDTH1 (:,:,:) * ZW1(:,:,:) -PREDR1 (:,:,:) = PREDR1 (:,:,:) * ZW1(:,:,:) -! -! 4. Threshold for very small (in absolute value) Redelperger numbers -! ---------------------------------------------------------------- -! -ZW2=SIGN(1.,PREDTH1(:,:,:)) -PREDTH1(:,:,:)= ZW2(:,:,:) * MAX(1.E-30, ZW2(:,:,:)*PREDTH1(:,:,:)) -! -IF (KRR /= 0) THEN ! dry case - ZW2=SIGN(1.,PREDR1(:,:,:)) - PREDR1(:,:,:)= ZW2(:,:,:) * MAX(1.E-30, ZW2(:,:,:)*PREDR1(:,:,:)) -END IF -! -! -!--------------------------------------------------------------------------- -! -! For the scalar variables -DO JSV=1,ISV - PREDS1(:,:,:,JSV)=XCTV*PBLL_O_E(:,:,:)*GZ_M_W(PSVM(:,:,:,JSV),PDZZ, KKA, KKU, KKL) -END DO -! -DO JSV=1,ISV - ZW2=SIGN(1.,PREDS1(:,:,:,JSV)) - PREDS1(:,:,:,JSV)= ZW2(:,:,:) * MAX(1.E-30, ZW2(:,:,:)*PREDS1(:,:,:,JSV)) -END DO -! -!--------------------------------------------------------------------------- -! -!* 2. 3D REDELSPERGER NUMBERS -! ------------------------ -! -IF(HTURBDIM=='1DIM') THEN ! 1D case -! -! - PRED2TH3(:,:,:) = PREDTH1(:,:,:)**2 -! - PRED2R3(:,:,:) = PREDR1(:,:,:) **2 -! - PRED2THR3(:,:,:) = PREDTH1(:,:,:) * PREDR1(:,:,:) -! -ELSE IF (L2D) THEN ! 3D case in a 2D model -! - IF (KRR /= 0) THEN ! moist 3D case - PRED2TH3(:,:,:)= PREDTH1(:,:,:)**2+(XCTV*PBLL_O_E(:,:,:)*PETHETA(:,:,:) )**2 * & - MZM(GX_M_M(PTHLM,PDXX,PDZZ,PDZX, KKA, KKU, KKL)**2, KKA, KKU, KKL) - PRED2TH3(:,:,IKB)=PRED2TH3(:,:,IKB+KKL) -! - PRED2R3(:,:,:)= PREDR1(:,:,:)**2 + (XCTV*PBLL_O_E(:,:,:)*PEMOIST(:,:,:))**2 * & - MZM(GX_M_M(PRM(:,:,:,1),PDXX,PDZZ,PDZX, KKA, KKU, KKL)**2, KKA, KKU, KKL) - PRED2R3(:,:,IKB)=PRED2R3(:,:,IKB+KKL) -! - PRED2THR3(:,:,:)= PREDR1(:,:,:) * PREDTH1(:,:,:) + XCTV**2*PBLL_O_E(:,:,:)**2 * & - PEMOIST(:,:,:) * PETHETA(:,:,:) * & - MZM(GX_M_M(PRM(:,:,:,1),PDXX,PDZZ,PDZX, KKA, KKU, KKL)* & - GX_M_M(PTHLM,PDXX,PDZZ,PDZX, KKA, KKU, KKL), KKA, KKU, KKL) - PRED2THR3(:,:,IKB)=PRED2THR3(:,:,IKB+KKL) -! - ELSE ! dry 3D case in a 2D model - PRED2TH3(:,:,:) = PREDTH1(:,:,:)**2 + XCTV**2*PBLL_O_E(:,:,:)**2 * & - MZM(GX_M_M(PTHLM,PDXX,PDZZ,PDZX, KKA, KKU, KKL)**2, KKA, KKU, KKL) - PRED2TH3(:,:,IKB)=PRED2TH3(:,:,IKB+KKL) -! - PRED2R3(:,:,:) = 0. -! - PRED2THR3(:,:,:) = 0. -! - END IF -! -ELSE ! 3D case in a 3D model -! - IF (KRR /= 0) THEN ! moist 3D case - PRED2TH3(:,:,:)= PREDTH1(:,:,:)**2 + ( XCTV*PBLL_O_E(:,:,:)*PETHETA(:,:,:) )**2 * & - MZM(GX_M_M(PTHLM,PDXX,PDZZ,PDZX, KKA, KKU, KKL)**2 & - + GY_M_M(PTHLM,PDYY,PDZZ,PDZY, KKA, KKU, KKL)**2, KKA, KKU, KKL) - PRED2TH3(:,:,IKB)=PRED2TH3(:,:,IKB+KKL) -! - PRED2R3(:,:,:)= PREDR1(:,:,:)**2 + (XCTV*PBLL_O_E(:,:,:)*PEMOIST(:,:,:))**2 * & - MZM(GX_M_M(PRM(:,:,:,1),PDXX,PDZZ,PDZX, KKA, KKU, KKL)**2 + & - GY_M_M(PRM(:,:,:,1),PDYY,PDZZ,PDZY, KKA, KKU, KKL)**2, KKA, KKU, KKL) - PRED2R3(:,:,IKB)=PRED2R3(:,:,IKB+KKL) -! - PRED2THR3(:,:,:)= PREDR1(:,:,:) * PREDTH1(:,:,:) + XCTV**2*PBLL_O_E(:,:,:)**2 * & - PEMOIST(:,:,:) * PETHETA(:,:,:) * & - MZM(GX_M_M(PRM(:,:,:,1),PDXX,PDZZ,PDZX, KKA, KKU, KKL)* & - GX_M_M(PTHLM,PDXX,PDZZ,PDZX, KKA, KKU, KKL)+ & - GY_M_M(PRM(:,:,:,1),PDYY,PDZZ,PDZY, KKA, KKU, KKL)* & - GY_M_M(PTHLM,PDYY,PDZZ,PDZY, KKA, KKU, KKL), KKA, KKU, KKL) - PRED2THR3(:,:,IKB)=PRED2THR3(:,:,IKB+KKL) -! - ELSE ! dry 3D case in a 3D model - PRED2TH3(:,:,:) = PREDTH1(:,:,:)**2 + XCTV**2*PBLL_O_E(:,:,:)**2 * & - MZM(GX_M_M(PTHLM,PDXX,PDZZ,PDZX, KKA, KKU, KKL)**2 & - + GY_M_M(PTHLM,PDYY,PDZZ,PDZY, KKA, KKU, KKL)**2, KKA, KKU, KKL) - PRED2TH3(:,:,IKB)=PRED2TH3(:,:,IKB+KKL) -! - PRED2R3(:,:,:) = 0. -! - PRED2THR3(:,:,:) = 0. -! - END IF -! -END IF ! end of the if structure on the turbulence dimensionnality -! -! -!--------------------------------------------------------------------------- -! -! 5. Prandtl numbers for scalars -! --------------------------- -DO JSV=1,ISV -! - IF(HTURBDIM=='1DIM') THEN -! 1D case - PRED2THS3(:,:,:,JSV) = PREDS1(:,:,:,JSV) * PREDTH1(:,:,:) - IF (KRR /= 0) THEN - PRED2RS3(:,:,:,JSV) = PREDR1(:,:,:) *PREDS1(:,:,:,JSV) - ELSE - PRED2RS3(:,:,:,JSV) = 0. - END IF -! - ELSE IF (L2D) THEN ! 3D case in a 2D model -! - IF (KRR /= 0) THEN - ZW1 = MZM((XG / PTHVREF * PLM * PLEPS / PTKEM)**2, KKA, KKU, KKL) *PETHETA - ELSE - ZW1 = MZM((XG / PTHVREF * PLM * PLEPS / PTKEM)**2, KKA, KKU, KKL) - END IF - PRED2THS3(:,:,:,JSV) = PREDTH1(:,:,:) * PREDS1(:,:,:,JSV) + & - ZW1* & - MZM(GX_M_M(PSVM(:,:,:,JSV),PDXX,PDZZ,PDZX, KKA, KKU, KKL)* & - GX_M_M(PTHLM,PDXX,PDZZ,PDZX, KKA, KKU, KKL), & - KKA, KKU, KKL) -! - IF (KRR /= 0) THEN - PRED2RS3(:,:,:,JSV) = PREDR1(:,:,:) * PREDS1(:,:,:,JSV) + & - ZW1 * PEMOIST * & - MZM(GX_M_M(PSVM(:,:,:,JSV),PDXX,PDZZ,PDZX, KKA, KKU, KKL)* & - GX_M_M(PRM(:,:,:,1),PDXX,PDZZ,PDZX, KKA, KKU, KKL), & - KKA, KKU, KKL) - ELSE - PRED2RS3(:,:,:,JSV) = 0. - END IF -! - ELSE ! 3D case in a 3D model -! - IF (KRR /= 0) THEN - ZW1 = MZM((XG / PTHVREF * PLM * PLEPS / PTKEM)**2, KKA, KKU, KKL) *PETHETA - ELSE - ZW1 = MZM((XG / PTHVREF * PLM * PLEPS / PTKEM)**2, KKA, KKU, KKL) - END IF - PRED2THS3(:,:,:,JSV) = PREDTH1(:,:,:) * PREDS1(:,:,:,JSV) + & - ZW1* & - MZM(GX_M_M(PSVM(:,:,:,JSV),PDXX,PDZZ,PDZX, KKA, KKU, KKL)* & - GX_M_M(PTHLM,PDXX,PDZZ,PDZX, KKA, KKU, KKL) & - +GY_M_M(PSVM(:,:,:,JSV),PDYY,PDZZ,PDZY, KKA, KKU, KKL)* & - GY_M_M(PTHLM,PDYY,PDZZ,PDZY, KKA, KKU, KKL), & - KKA, KKU, KKL) -! - IF (KRR /= 0) THEN - PRED2RS3(:,:,:,JSV) = PREDR1(:,:,:) * PREDS1(:,:,:,JSV) + & - ZW1 * PEMOIST * & - MZM(GX_M_M(PSVM(:,:,:,JSV),PDXX,PDZZ,PDZX, KKA, KKU, KKL)* & - GX_M_M(PRM(:,:,:,1),PDXX,PDZZ,PDZX, KKA, KKU, KKL) & - +GY_M_M(PSVM(:,:,:,JSV),PDYY,PDZZ,PDZY, KKA, KKU, KKL)* & - GY_M_M(PRM(:,:,:,1),PDYY,PDZZ,PDZY, KKA, KKU, KKL), & - KKA, KKU, KKL) - ELSE - PRED2RS3(:,:,:,JSV) = 0. - END IF -! - END IF ! end of HTURBDIM if-block -! -END DO -! -!--------------------------------------------------------------------------- -! -!* 6. SAVES THE REDELSPERGER NUMBERS -! ------------------------------ -! -IF ( OTURB_DIAG .AND. TPFILE%LOPENED ) THEN - ! - ! stores the RED_TH1 - TZFIELD%CMNHNAME = 'RED_TH1' - TZFIELD%CSTDNAME = '' - TZFIELD%CLONGNAME = 'RED_TH1' - TZFIELD%CUNITS = '1' - TZFIELD%CDIR = 'XY' - TZFIELD%CCOMMENT = 'X_Y_Z_RED_TH1' - TZFIELD%NGRID = 4 - TZFIELD%NTYPE = TYPEREAL - TZFIELD%NDIMS = 3 - TZFIELD%LTIMEDEP = .TRUE. - CALL IO_Field_write(TPFILE,TZFIELD,PREDTH1) - ! - ! stores the RED_R1 - TZFIELD%CMNHNAME = 'RED_R1' - TZFIELD%CSTDNAME = '' - TZFIELD%CLONGNAME = 'RED_R1' - TZFIELD%CUNITS = '1' - TZFIELD%CDIR = 'XY' - TZFIELD%CCOMMENT = 'X_Y_Z_RED_R1' - TZFIELD%NGRID = 4 - TZFIELD%NTYPE = TYPEREAL - TZFIELD%NDIMS = 3 - TZFIELD%LTIMEDEP = .TRUE. - CALL IO_Field_write(TPFILE,TZFIELD,PREDR1) - ! - ! stores the RED2_TH3 - TZFIELD%CMNHNAME = 'RED2_TH3' - TZFIELD%CSTDNAME = '' - TZFIELD%CLONGNAME = 'RED2_TH3' - TZFIELD%CUNITS = '1' - TZFIELD%CDIR = 'XY' - TZFIELD%CCOMMENT = 'X_Y_Z_RED2_TH3' - TZFIELD%NGRID = 4 - TZFIELD%NTYPE = TYPEREAL - TZFIELD%NDIMS = 3 - TZFIELD%LTIMEDEP = .TRUE. - CALL IO_Field_write(TPFILE,TZFIELD,PRED2TH3) - ! - ! stores the RED2_R3 - TZFIELD%CMNHNAME = 'RED2_R3' - TZFIELD%CSTDNAME = '' - TZFIELD%CLONGNAME = 'RED2_R3' - TZFIELD%CUNITS = '1' - TZFIELD%CDIR = 'XY' - TZFIELD%CCOMMENT = 'X_Y_Z_RED2_R3' - TZFIELD%NGRID = 4 - TZFIELD%NTYPE = TYPEREAL - TZFIELD%NDIMS = 3 - TZFIELD%LTIMEDEP = .TRUE. - CALL IO_Field_write(TPFILE,TZFIELD,PRED2R3) - ! - ! stores the RED2_THR3 - TZFIELD%CMNHNAME = 'RED2_THR3' - TZFIELD%CSTDNAME = '' - TZFIELD%CLONGNAME = 'RED2_THR3' - TZFIELD%CUNITS = '1' - TZFIELD%CDIR = 'XY' - TZFIELD%CCOMMENT = 'X_Y_Z_RED2_THR3' - TZFIELD%NGRID = 4 - TZFIELD%NTYPE = TYPEREAL - TZFIELD%NDIMS = 3 - TZFIELD%LTIMEDEP = .TRUE. - CALL IO_Field_write(TPFILE,TZFIELD,PRED2THR3) - ! -END IF -! -!--------------------------------------------------------------------------- -ENDIF ! (Done only if LHARAT is FALSE) -! -IF (LHOOK) CALL DR_HOOK('PRANDTL',1,ZHOOK_HANDLE) -END SUBROUTINE PRANDTL -END MODULE MODE_PRANDTL diff --git a/src/common/turb/turb.F90 b/src/common/turb/turb.F90 index 9bfa00590..5f710e437 100644 --- a/src/common/turb/turb.F90 +++ b/src/common/turb/turb.F90 @@ -232,7 +232,7 @@ USE MODD_IO, ONLY: TFILEDATA USE MODD_LES USE MODD_NSV ! -USE MODI_BL89 +USE MODE_BL89, ONLY: BL89 USE MODE_TURB_VER, ONLY : TURB_VER !!MODIF AROME !USE MODI_ROTATE_WIND @@ -242,7 +242,7 @@ USE MODI_SHUMAN, ONLY : MZF, MXF, MYF USE MODI_GRADIENT_M USE MODI_BUDGET_DDH USE MODI_LES_MEAN_SUBGRID -USE MODI_RMC01 +USE MODE_RMC01, ONLY: RMC01 USE MODI_GRADIENT_W USE MODE_TM06, ONLY: TM06 USE MODI_UPDATE_LM @@ -251,8 +251,8 @@ USE MODE_IO_FIELD_WRITE, ONLY: IO_FIELD_WRITE USE MODE_SBL USE MODE_FMWRIT ! -USE MODI_EMOIST -USE MODI_ETHETA +USE MODE_EMOIST, ONLY: EMOIST +USE MODE_ETHETA, ONLY: ETHETA ! USE DDH_MIX, ONLY : TYP_DDH USE YOMLDDH, ONLY : TLDDH -- GitLab