diff --git a/src/arome/ext/aro_turb_mnh.F90 b/src/arome/ext/aro_turb_mnh.F90 index 73772849b9066a6a3f5b1289ed8fcffc9d6c0646..80e069a4895202d935b804fa7bfd06ce65ac19e2 100644 --- a/src/arome/ext/aro_turb_mnh.F90 +++ b/src/arome/ext/aro_turb_mnh.F90 @@ -2,7 +2,7 @@ SUBROUTINE ARO_TURB_MNH( KKA,KKU,KKL,KLON,KLEV,KRR,KRRL,KRRI,KSV, & KTCOUNT, KGRADIENTS, LDHARATU, PTSTEP, & PZZ, PZZF, PZZTOP, & - PRHODJ, PTHVREF,PRHODREF,HINST_SFU,HMF_UPDRAFT, & + PRHODJ, PTHVREF,PRHODREF,HINST_SFU,HMF_UPDRAFT,& PSFTH,PSFRV,PSFSV,PSFU,PSFV, & PPABSM,PUM,PVM,PWM,PTKEM,PEPSM,PSVM,PSRCM, & PTHM,PRM, & @@ -69,10 +69,11 @@ ! ------------ ! USE MODD_CONF -USE MODD_CST +USE MODD_CST, ONLY:CST +USE MODD_CTURB, ONLY:CSTURB USE MODD_PARAMETERS USE MODD_IO, ONLY: TFILEDATA -USE MODD_BUDGET, ONLY: NBUDGET_RI, TBUDGETDATA +USE MODD_BUDGET, ONLY: NBUDGET_RI, TBUDGETDATA, TBUCONF ! USE MODI_TURB ! @@ -101,7 +102,6 @@ INTEGER, INTENT(IN) :: KGRADIENTS ! Number of stored horizon LOGICAL, INTENT(IN) :: LDHARATU ! HARATU scheme active CHARACTER (LEN=4), INTENT(IN) :: HMF_UPDRAFT ! Type of mass flux scheme -CHARACTER (LEN=4) :: HCLOUD ! Type of microphysical scheme REAL, INTENT(IN) :: PTSTEP ! Time step ! ! @@ -199,6 +199,7 @@ INTEGER ::II INTEGER :: IMI ! model index number CHARACTER(LEN=4),DIMENSION(2) :: HLBCX, HLBCY ! X- and Y-direc LBC +CHARACTER (LEN=4) :: HCLOUD ! Type of microphysical scheme INTEGER :: ISPLIT ! number of time-splitting @@ -212,6 +213,12 @@ LOGICAL :: OOCEAN ! switch for OCEAN version of turbulence scheme CHARACTER(LEN=4) :: HTURBDIM ! dimensionality of the ! turbulence scheme CHARACTER(LEN=4) :: HTURBLEN ! kind of mixing length +CHARACTER(LEN=6) :: HPROGRAM ! Program (AROME or MESONH prog) +LOGICAL :: OFLAT ! Logical for zero ororography +LOGICAL :: ONOMIXLG ! to use turbulence for lagrangian variables (modd_conf) +LOGICAL :: O2D ! Logical for 2D model version (modd_conf) +INTEGER :: KSV_LGBEG, KSV_LGEND ! number of scalar variables + REAL :: ZIMPL ! degree of implicitness ! @@ -281,12 +288,24 @@ ORMC01=.FALSE. HTURBDIM='1DIM' HTURBLEN='BL89' -HCLOUD='ICE3' + ZIMPL=1. !Version Ocean du schema de turbulence OOCEAN=.FALSE. +HPROGRAM='AROME ' + +! no orography for mesonh +OFLAT=.FALSE. +! 2D version of turbulence +O2D=.FALSE. +! Lagragian diag for mesonh +ONOMIXLG=.FALSE. +KSV_LGBEG=0 +KSV_LGEND=0 + + ! tableau a recalculer a chaque pas de temps ! attention, ZDZZ est l'altitude entre deux niveaux (et pas l'�paisseur de la couche) @@ -419,9 +438,12 @@ DO JRR=1, NBUDGET_RI YLBUDGET(JRR)%YDMDDH=>YDMDDH ENDDO -CALL TURB (KLEV+2,1,KKL,IMI, KRR, KRRL, KRRI, HLBCX, HLBCY, ISPLIT,IMI, & - & OTURB_FLX,OTURB_DIAG,OSUBG_COND,ORMC01,OOCEAN, & - & HTURBDIM,HTURBLEN,'NONE','NONE',HCLOUD, & +HCLOUD="ICE3" +CALL TURB (CST,CSTURB,TBUCONF,KLEV+2,1,KKL,IMI, KRR, KRRL, KRRI, HLBCX, HLBCY,& + & ISPLIT,IMI, KSV, KSV_LGBEG, KSV_LGEND, & + & HPROGRAM, O2D, ONOMIXLG, OFLAT, & + & OTURB_FLX,OTURB_DIAG,OSUBG_COND,ORMC01,OOCEAN,LDHARATU & + & HTURBDIM,HTURBLEN,'NONE','NONE','LIMA', & & ZIMPL, & & 2*PTSTEP,ZTFILE, & & ZDXX,ZDYY,ZDZZ,ZDZX,ZDZY,ZZZ, & diff --git a/src/common/turb/modd_cturb.F90 b/src/common/turb/modd_cturb.F90 index a446914f779a1f5aa6d72c4c24b7b9a2960261e5..fa34643351daaa89aeaa6769621c254e9fba5d1d 100644 --- a/src/common/turb/modd_cturb.F90 +++ b/src/common/turb/modd_cturb.F90 @@ -33,54 +33,100 @@ !! Nov 06, 2002 (V. Masson) add XALPSBL and XASBL !! May 06 Remove EPS !! Jan 2019 (Q. Rodier) Remove XASBL +!! Jan 2022 (Q. Rodier) introduction of a strucuture !---------------------------------------------------------------------------- ! !* 0. DECLARATIONS ! ------------ ! IMPLICIT NONE +TYPE CSTURB_t ! -REAL,SAVE :: XCMFS ! constant for the momentum flux due to shear -REAL,SAVE :: XCMFB ! constant for the momentum flux due to buoyancy -REAL,SAVE :: XCSHF ! constant for the sensible heat flux -REAL,SAVE :: XCHF ! constant for the humidity flux -REAL,SAVE :: XCTV ! constant for the temperature variance -REAL,SAVE :: XCHV ! constant for the humidity variance -REAL,SAVE :: XCHT1 ! first ct. for the humidity-temperature correlation -REAL,SAVE :: XCHT2 ! second ct. for the humidity-temperature correlation -! -REAL,SAVE :: XCPR1 ! first ct. for the turbulent Prandtl numbers -REAL,SAVE :: XCPR2 ! second ct. for the turbulent Prandtl numbers -REAL,SAVE :: XCPR3 ! third ct. for the turbulent Prandtl numbers -REAL,SAVE :: XCPR4 ! fourth ct. for the turbulent Prandtl numbers -REAL,SAVE :: XCPR5 ! fifth ct. for the turbulent Prandtl numbers -! -REAL,SAVE :: XCET ! constant into the transport term of the TKE eq. -REAL,SAVE :: XCED ! constant into the dissipation term of the TKE eq. -! -REAL,SAVE :: XCDP ! ct. for the production term in the dissipation eq. -REAL,SAVE :: XCDD ! ct. for the destruction term in the dissipation eq. -REAL,SAVE :: XCDT ! ct. for the transport term in the dissipation eq. -! -REAL,SAVE :: XTKEMIN ! mimimum value for the TKE -REAL,SAVE :: XRM17 ! Rodier et al 2017 constant in shear term for mixing length -! -REAL,SAVE :: XLINI ! initial value for BL mixing length -REAL,SAVE :: XLINF ! to prevent division by zero in the BL algorithm -! -REAL,SAVE :: XALPSBL ! constant linking TKE and friction velocity in the SBL -! -REAL,SAVE :: XCEP ! Constant for wind pressure-correlations -REAL,SAVE :: XA0 ! Constant a0 for wind pressure-correlations -REAL,SAVE :: XA2 ! Constant a2 for wind pressure-correlations -REAL,SAVE :: XA3 ! Constant a3 for wind pressure-correlations -REAL,SAVE :: XA5 ! Constant a5 for temperature pressure-correlations -REAL,SAVE :: XCTD ! Constant for temperature and vapor dissipation -REAL,SAVE :: XCTP ! Constant for temperature and vapor pressure-correlations -! -REAL,SAVE :: XPHI_LIM ! Threshold value for Phi3 and Psi3 -REAL,SAVE :: XSBL_O_BL ! SBL height / BL height ratio -REAL,SAVE :: XFTOP_O_FSURF! Fraction of surface (heat or momentum) flux used to define top of BL -LOGICAL,SAVE :: LHARAT ! SWITCH HARATU +REAL :: XCMFS ! constant for the momentum flux due to shear +REAL :: XCMFB ! constant for the momentum flux due to buoyancy +REAL :: XCSHF ! constant for the sensible heat flux +REAL :: XCHF ! constant for the humidity flux +REAL :: XCTV ! constant for the temperature variance +REAL :: XCHV ! constant for the humidity variance +REAL :: XCHT1 ! first ct. for the humidity-temperature correlation +REAL :: XCHT2 ! second ct. for the humidity-temperature correlation ! +REAL :: XCPR1 ! first ct. for the turbulent Prandtl numbers +REAL :: XCPR2 ! second ct. for the turbulent Prandtl numbers +REAL :: XCPR3 ! third ct. for the turbulent Prandtl numbers +REAL :: XCPR4 ! fourth ct. for the turbulent Prandtl numbers +REAL :: XCPR5 ! fifth ct. for the turbulent Prandtl numbers +! +REAL :: XCET ! constant into the transport term of the TKE eq. +REAL :: XCED ! constant into the dissipation term of the TKE eq. +! +REAL :: XCDP ! ct. for the production term in the dissipation eq. +REAL :: XCDD ! ct. for the destruction term in the dissipation eq. +REAL :: XCDT ! ct. for the transport term in the dissipation eq. +! +REAL :: XTKEMIN ! mimimum value for the TKE +REAL :: XRM17 ! Rodier et al 2017 constant in shear term for mixing length +! +REAL :: XLINI ! initial value for BL mixing length +REAL :: XLINF ! to prevent division by zero in the BL algorithm +! +REAL :: XALPSBL ! constant linking TKE and friction velocity in the SBL +! +REAL :: XCEP ! Constant for wind pressure-correlations +REAL :: XA0 ! Constant a0 for wind pressure-correlations +REAL :: XA2 ! Constant a2 for wind pressure-correlations +REAL :: XA3 ! Constant a3 for wind pressure-correlations +REAL :: XA5 ! Constant a5 for temperature pressure-correlations +REAL :: XCTD ! Constant for temperature and vapor dissipation +REAL :: XCTP ! Constant for temperature and vapor pressure-correlations +! +REAL :: XPHI_LIM ! Threshold value for Phi3 and Psi3 +REAL :: XSBL_O_BL ! SBL height / BL height ratio +REAL :: XFTOP_O_FSURF! Fraction of surface (heat or momentum) flux used to define top of BL +! +END TYPE CSTURB_t +! +TYPE(CSTURB_t), TARGET, SAVE :: CSTURB +! +REAL,POINTER :: XCMFS=>CSTURB%XCMFS +REAL,POINTER :: XCMFB=>CSTURB%XCMFB +REAL,POINTER :: XCSHF=>CSTURB%XCSHF +REAL,POINTER :: XCHF=>CSTURB%XCHF +REAL,POINTER :: XCTV=>CSTURB%XCTV +REAL,POINTER :: XCHV=>CSTURB%XCHV +REAL,POINTER :: XCHT1=>CSTURB%XCHT1 +REAL,POINTER :: XCHT2=>CSTURB%XCHT2 +! +REAL,POINTER :: XCPR1=>CSTURB%XCPR1 +REAL,POINTER :: XCPR2=>CSTURB%XCPR2 +REAL,POINTER :: XCPR3=>CSTURB%XCPR3 +REAL,POINTER :: XCPR4=>CSTURB%XCPR4 +REAL,POINTER :: XCPR5=>CSTURB%XCPR5 +! +REAL,POINTER :: XCET=>CSTURB%XCET +REAL,POINTER :: XCED=>CSTURB%XCED +! +REAL,POINTER :: XCDP=>CSTURB%XCDP +REAL,POINTER :: XCDD=>CSTURB%XCDD +REAL,POINTER :: XCDT=>CSTURB%XCDT +! +REAL,POINTER :: XTKEMIN=>CSTURB%XTKEMIN +REAL,POINTER :: XRM17=>CSTURB%XRM17 +! +REAL,POINTER :: XLINI=>CSTURB%XLINI +REAL,POINTER :: XLINF=>CSTURB%XLINF +! +REAL,POINTER :: XALPSBL=>CSTURB%XALPSBL +! +REAL,POINTER :: XCEP=>CSTURB%XCEP +REAL,POINTER :: XA0=>CSTURB%XA0 +REAL,POINTER :: XA2=>CSTURB%XA2 +REAL,POINTER :: XA3=>CSTURB%XA3 +REAL,POINTER :: XA5=>CSTURB%XA5 +REAL,POINTER :: XCTD=>CSTURB%XCTD +REAL,POINTER :: XCTP=>CSTURB%XCTP +! +REAL,POINTER :: XPHI_LIM=>CSTURB%XPHI_LIM +REAL,POINTER :: XSBL_O_BL=>CSTURB%XSBL_O_BL +REAL,POINTER :: XFTOP_O_FSURF=>CSTURB%XFTOP_O_FSURF END MODULE MODD_CTURB diff --git a/src/common/turb/mode_bl89.F90 b/src/common/turb/mode_bl89.F90 index 1a5506d6b4392d4f4d8e4b13fcb363f5b494379a..7d4e21b2055f0108055891e4a8d4eb9e9584636e 100644 --- a/src/common/turb/mode_bl89.F90 +++ b/src/common/turb/mode_bl89.F90 @@ -6,7 +6,7 @@ MODULE MODE_BL89 IMPLICIT NONE CONTAINS ! ######spl - SUBROUTINE BL89(KKA,KKU,KKL,PZZ,PDZZ,PTHVREF,PTHLM,KRR,PRM,PTKEM,PSHEAR,PLM,OOCEAN) + SUBROUTINE BL89(CST,CSTURB,KKA,KKU,KKL,PZZ,PDZZ,PTHVREF,PTHLM,KRR,PRM,PTKEM,PSHEAR,PLM,OOCEAN,HPROGRAM) USE PARKIND1, ONLY : JPRB USE YOMHOOK , ONLY : LHOOK, DR_HOOK ! ######################################################### @@ -56,9 +56,8 @@ CONTAINS !* 0. DECLARATIONS ! ------------ ! -USE MODD_CONF, ONLY: CPROGRAM -USE MODD_CST -USE MODD_CTURB +USE MODD_CST, ONLY: CST_t +USE MODD_CTURB, ONLY: CSTURB_t USE MODD_PARAMETERS USE MODD_PRECISION, ONLY: MNHREAL ! @@ -68,6 +67,8 @@ IMPLICIT NONE !* 0.1 Declaration of arguments ! ------------------------ ! +TYPE(CST_t), INTENT(IN) :: CST +TYPE(CSTURB_t), INTENT(IN) :: CSTURB 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 @@ -81,6 +82,7 @@ REAL, DIMENSION(:,:,:), INTENT(IN) :: PTKEM ! TKE REAL, DIMENSION(:,:,:), INTENT(IN) :: PSHEAR REAL, DIMENSION(:,:,:), INTENT(OUT) :: PLM ! Mixing length LOGICAL, INTENT(IN) :: OOCEAN ! switch for Ocean model version +CHARACTER(LEN=6), INTENT(IN) :: HPROGRAM ! CPROGRAM is the program currently running (modd_conf) ! thermodynamical variables PTHLM=Theta at the begining ! !* 0.2 Declaration of local variables @@ -131,21 +133,21 @@ IKE=KKU-JPVEXT_TURB*KKL IKTB = JPVEXT_TURB + 1 IKT = SIZE(PTKEM,3) IKTE = IKT-JPVEXT_TURB -ZRVORD = XRV / XRD +ZRVORD = CST%XRV / CST%XRD ! !------------------------------------------------------------------------------- ! !* 1. pack the horizontal dimensions into one ! --------------------------------------- ! -IF (CPROGRAM=='AROME ') THEN +IF (HPROGRAM=='AROME ') THEN DO JK=1,IKT ZZZ (:,JK) = PZZ (:,1,JK) ZDZZ (:,JK) = PDZZ (:,1,JK) ZTHM (:,JK) = PTHLM (:,1,JK) ZSHEAR (:,JK) = PSHEAR (:,1,JK) ZTKEM (:,JK) = PTKEM (:,1,JK) - ZG_O_THVREF(:,JK) = XG/PTHVREF(:,1,JK) + ZG_O_THVREF(:,JK) = CST%XG/PTHVREF(:,1,JK) END DO DO JK=1,IKT DO JRR=1,KRR @@ -159,8 +161,8 @@ ELSE ZTHM (:,JK) = RESHAPE(PTHLM (:,:,JK),(/ IIU*IJU /) ) ZSHEAR (:,JK) = RESHAPE(PSHEAR (:,:,JK),(/ IIU*IJU /) ) ZTKEM (:,JK) = RESHAPE(PTKEM (:,:,JK),(/ IIU*IJU /) ) - ZG_O_THVREF(:,JK) = RESHAPE(XG/PTHVREF(:,:,JK),(/ IIU*IJU /) ) - IF (OOCEAN) ZG_O_THVREF(:,JK) = XG * XALPHAOC + ZG_O_THVREF(:,JK) = RESHAPE(CST%XG/PTHVREF(:,:,JK),(/ IIU*IJU /) ) + IF (OOCEAN) ZG_O_THVREF(:,JK) = CST%XG * CST%XALPHAOC DO JRR=1,KRR ZRM (:,JK,JRR) = RESHAPE(PRM (:,:,JK,JRR),(/ IIU*IJU /) ) END DO @@ -169,8 +171,8 @@ END IF ! ZSQRT_TKE = SQRT(ZTKEM) ! -!ZBL89EXP is defined here because (and not in ini_cturb) because XCED is defined in read_exseg (depending on BL89/RM17) -ZBL89EXP = LOG(16.)/(4.*LOG(XKARMAN)+LOG(XCED)-3.*LOG(XCMFS)) +!ZBL89EXP is defined here because (and not in ini_cturb) because CSTURB%XCED is defined in read_exseg (depending on BL89/RM17) +ZBL89EXP = LOG(16.)/(4.*LOG(CST%XKARMAN)+LOG(CSTURB%XCED)-3.*LOG(CSTURB%XCMFS)) ZUSRBL89 = 1./ZBL89EXP !------------------------------------------------------------------------------- ! @@ -202,8 +204,8 @@ END IF ZDELTVPT(:,IKTB:IKTE)=ZVPT(:,IKTB:IKTE)-ZVPT(:,IKTB-KKL:IKTE-KKL) ZDELTVPT(:,KKU)=ZVPT(:,KKU)-ZVPT(:,KKU-KKL) ZDELTVPT(:,KKA)=0. -WHERE (ABS(ZDELTVPT(:,:))<XLINF) - ZDELTVPT(:,:)=XLINF +WHERE (ABS(ZDELTVPT(:,:))<CSTURB%XLINF) + ZDELTVPT(:,:)=CSTURB%XLINF END WHERE ! ZHLVPT(:,IKTB:IKTE)= 0.5 * ( ZVPT(:,IKTB:IKTE)+ZVPT(:,IKTB-KKL:IKTE-KKL) ) @@ -231,7 +233,7 @@ DO JK=IKTB,IKTE !--------- SHEAR + STABILITY ----------- ZPOTE = ZTEST0* & (-ZG_O_THVREF(J1D,JK)*(ZHLVPT(J1D,JKK)-ZVPT(J1D,JK)) & - + XRM17*ZSHEAR(J1D,JKK)*ZSQRT_TKE(J1D,JK) & + + CSTURB%XRM17*ZSHEAR(J1D,JKK)*ZSQRT_TKE(J1D,JK) & )*ZDZZ(J1D,JKK) ZTEST =0.5+SIGN(0.5,ZINTE(J1D)-ZPOTE) @@ -240,8 +242,8 @@ DO JK=IKTB,IKTE !--------- SHEAR + STABILITY ----------- ZLWORK2 = (ZG_O_THVREF(J1D,JK) *(ZVPT(J1D,JKK) - ZVPT(J1D,JK)) & - -XRM17*ZSHEAR(J1D,JKK)*ZSQRT_TKE(J1D,JK) & - + sqrt(abs( (XRM17*ZSHEAR(J1D,JKK)*ZSQRT_TKE(J1D,JK) & + -CSTURB%XRM17*ZSHEAR(J1D,JKK)*ZSQRT_TKE(J1D,JK) & + + sqrt(abs( (CSTURB%XRM17*ZSHEAR(J1D,JKK)*ZSQRT_TKE(J1D,JK) & + ( -ZG_O_THVREF(J1D,JK) * (ZVPT(J1D,JKK) - ZVPT(J1D,JK)) ))**2.0 + & 2. * ZINTE(J1D) * & #ifdef REPRO48 @@ -279,16 +281,16 @@ DO JK=IKTB,IKTE !--------- SHEAR + STABILITY ----------- ZPOTE = ZTEST0* & (ZG_O_THVREF(J1D,JK)*(ZHLVPT(J1D,JKK)-ZVPT(J1D,JK)) & - +XRM17*ZSHEAR(J1D,JKK)*ZSQRT_TKE(J1D,JK) & + +CSTURB%XRM17*ZSHEAR(J1D,JKK)*ZSQRT_TKE(J1D,JK) & )*ZDZZ(J1D,JKK) ZTEST =0.5+SIGN(0.5,ZINTE(J1D)-ZPOTE) ZTESTM=ZTESTM+ZTEST0 ZLWORK1=ZDZZ(J1D,JKK) !--------- SHEAR + STABILITY ----------- ZLWORK2= ( - ZG_O_THVREF(J1D,JK) *(ZVPT(J1D,JKK-KKL) - ZVPT(J1D,JK) ) & - - XRM17*ZSHEAR(J1D,JKK)*ZSQRT_TKE(J1D,JK) & + - CSTURB%XRM17*ZSHEAR(J1D,JKK)*ZSQRT_TKE(J1D,JK) & + SQRT (ABS( & - (XRM17*ZSHEAR(J1D,JKK)*ZSQRT_TKE(J1D,JK) & + (CSTURB%XRM17*ZSHEAR(J1D,JKK)*ZSQRT_TKE(J1D,JK) & + ( ZG_O_THVREF(J1D,JK) * (ZVPT(J1D,JKK-KKL) - ZVPT(J1D,JK))) )**2 & + 2. * ZINTE(J1D) * & #ifdef REPRO48 @@ -320,7 +322,7 @@ DO JK=IKTB,IKTE #endif END DO -ZLM(:,JK)=MAX(ZLM(:,JK),XLINI) +ZLM(:,JK)=MAX(ZLM(:,JK),CSTURB%XLINI) !------------------------------------------------------------------------------- !* 8. end of the loop on the vertical levels @@ -342,7 +344,7 @@ ZLM(:,KKU)=ZLM(:,IKE-KKL) !* 10. retrieve output array in model coordinates ! ------------------------------------------ ! -IF (CPROGRAM=='AROME ') THEN +IF (HPROGRAM=='AROME ') THEN DO JK=1,IKT PLM (:,1,JK) = ZLM (:,JK) END DO diff --git a/src/common/turb/mode_prandtl.F90 b/src/common/turb/mode_prandtl.F90 index d11181fbf350eff21eba14c370520c8daaced4be..72eb12a4222c0cd8434a026e5259a693cca7717b 100644 --- a/src/common/turb/mode_prandtl.F90 +++ b/src/common/turb/mode_prandtl.F90 @@ -13,7 +13,7 @@ ! used for implicitation of exchange coefficients ! 05/2020 V. Masson and C. Lac : bug in D_PHI3DTDZ2_O_DDTDZ ! -USE MODD_CTURB, ONLY : XCTV, XCSHF, XCTD, XPHI_LIM, XCPR3, XCPR4, XCPR5 +USE MODD_CTURB, ONLY : CSTURB_t USE MODD_PARAMETERS, ONLY : JPVEXT_TURB ! USE MODI_SHUMAN, ONLY: MZM, MZF @@ -21,8 +21,8 @@ IMPLICIT NONE !---------------------------------------------------------------------------- CONTAINS !---------------------------------------------------------------------------- - SUBROUTINE PRANDTL(KKA,KKU,KKL,KRR,KRRI,OTURB_DIAG, & - HTURBDIM,OOCEAN, & + SUBROUTINE PRANDTL(CST,CSTURB,KKA,KKU,KKL,KRR,KRRI,OTURB_DIAG,& + HTURBDIM,OOCEAN,OHARAT,O2D, & TPFILE, & PDXX,PDYY,PDZZ,PDZX,PDZY, & PTHVREF,PLOCPEXNM,PATHETA,PAMOIST, & @@ -81,11 +81,11 @@ CONTAINS !! IMPLICIT ARGUMENTS !! ------------------ !! Module MODD_CST : contains physical constants -!! XG : gravity constant +!! CST%XG : gravity constant !! !! Module MODD_CTURB: contains the set of constants for !! the turbulence scheme -!! XCTV,XCPR2 : constants for the turbulent prandtl numbers +!! CSTURB%XCTV,XCPR2 : constants for the turbulent prandtl numbers !! XTKEMIN : minimum value allowed for the TKE !! !! Module MODD_PARAMETERS @@ -130,7 +130,7 @@ CONTAINS !! 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 +!! Modifications: July 2015 (Wim de Rooy) OHARAT (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 @@ -142,16 +142,16 @@ CONTAINS USE PARKIND1, ONLY : JPRB USE YOMHOOK , ONLY : LHOOK, DR_HOOK ! -USE MODD_CST +USE MODD_CST, ONLY : CST_t USE MODD_CONF -USE MODD_CTURB +USE MODD_CTURB, ONLY : CSTURB_t USE MODD_FIELD, ONLY: TFIELDDATA, TYPEREAL USE MODD_IO, ONLY: TFILEDATA USE MODD_PARAMETERS ! USE MODI_GRADIENT_M -USE MODE_EMOIST, ONLY: EMOIST -USE MODE_ETHETA, ONLY: ETHETA +USE MODE_EMOIST +USE MODE_ETHETA USE MODI_SHUMAN, ONLY: MZM USE MODE_IO_FIELD_WRITE, ONLY: IO_FIELD_WRITE ! @@ -160,6 +160,8 @@ IMPLICIT NONE ! !* 0.1 declarations of arguments ! +TYPE(CST_t), INTENT(IN) :: CST +TYPE(CSTURB_t), INTENT(IN) :: CSTURB 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 @@ -170,6 +172,8 @@ INTEGER, INTENT(IN) :: KRRI ! number of ice var. LOGICAL, INTENT(IN) :: OTURB_DIAG ! switch to write some ! diagnostic fields in the syncronous FM-file LOGICAL, INTENT(IN) :: OOCEAN ! switch for Ocean model version +LOGICAL, INTENT(IN) :: OHARAT +LOGICAL, INTENT(IN) :: O2D ! Logical for 2D model version (modd_conf) 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 @@ -234,7 +238,7 @@ TYPE(TFIELDDATA) :: TZFIELD REAL(KIND=JPRB) :: ZHOOK_HANDLE IF (LHOOK) CALL DR_HOOK('PRANDTL',0,ZHOOK_HANDLE) -IF (LHARAT) THEN +IF (OHARAT) THEN PREDTH1(:,:,:)=0. PREDR1(:,:,:)=0. PRED2TH3(:,:,:)=0. @@ -257,25 +261,25 @@ PETHETA(:,:,KKA) = 2.*PETHETA(:,:,IKB) - PETHETA(:,:,IKB+KKL) PEMOIST(:,:,KKA) = 2.*PEMOIST(:,:,IKB) - PEMOIST(:,:,IKB+KKL) ! !--------------------------------------------------------------------------- -IF (.NOT. LHARAT) THEN +IF (.NOT. OHARAT) THEN ! ! 1.3 1D Redelsperger numbers ! -PBLL_O_E(:,:,:) = MZM(XG / PTHVREF(:,:,:) * PLM(:,:,:) * PLEPS(:,:,:) / PTKEM(:,:,:), KKA, KKU, KKL) +PBLL_O_E(:,:,:) = MZM(CST%XG / PTHVREF(:,:,:) * PLM(:,:,:) * PLEPS(:,:,:) / PTKEM(:,:,:), KKA, KKU, KKL) IF (KRR /= 0) THEN ! moist case - PREDTH1(:,:,:)= XCTV*PBLL_O_E(:,:,:) * PETHETA(:,:,:) * & + PREDTH1(:,:,:)= CSTURB%XCTV*PBLL_O_E(:,:,:) * PETHETA(:,:,:) * & & GZ_M_W(KKA, KKU, KKL,PTHLM,PDZZ) - PREDR1(:,:,:) = XCTV*PBLL_O_E(:,:,:) * PEMOIST(:,:,:) * & + PREDR1(:,:,:) = CSTURB%XCTV*PBLL_O_E(:,:,:) * PEMOIST(:,:,:) * & & GZ_M_W(KKA, KKU, KKL,PRM(:,:,:,1),PDZZ) ELSE ! dry case - PREDTH1(:,:,:)= XCTV*PBLL_O_E(:,:,:) * GZ_M_W(KKA, KKU, KKL,PTHLM,PDZZ) + PREDTH1(:,:,:)= CSTURB%XCTV*PBLL_O_E(:,:,:) * GZ_M_W(KKA, KKU, KKL,PTHLM,PDZZ) PREDR1(:,:,:) = 0. END IF ! ! 3. Limits on 1D Redelperger numbers ! -------------------------------- ! -ZMINVAL = (1.-1./XPHI_LIM) +ZMINVAL = (1.-1./CSTURB%XPHI_LIM) ! ZW1 = 1. ZW2 = 1. @@ -319,7 +323,7 @@ END IF ! ! For the scalar variables DO JSV=1,ISV - PREDS1(:,:,:,JSV)=XCTV*PBLL_O_E(:,:,:)*GZ_M_W(KKA, KKU, KKL,PSVM(:,:,:,JSV),PDZZ) + PREDS1(:,:,:,JSV)=CSTURB%XCTV*PBLL_O_E(:,:,:)*GZ_M_W(KKA, KKU, KKL,PSVM(:,:,:,JSV),PDZZ) END DO ! DO JSV=1,ISV @@ -341,25 +345,25 @@ IF(HTURBDIM=='1DIM') THEN ! 1D case ! PRED2THR3(:,:,:) = PREDTH1(:,:,:) * PREDR1(:,:,:) ! -ELSE IF (L2D) THEN ! 3D case in a 2D model +ELSE IF (O2D) THEN ! 3D case in a 2D model ! IF (KRR /= 0) THEN ! moist 3D case - PRED2TH3(:,:,:)= PREDTH1(:,:,:)**2+(XCTV*PBLL_O_E(:,:,:)*PETHETA(:,:,:) )**2 * & + PRED2TH3(:,:,:)= PREDTH1(:,:,:)**2+(CSTURB%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 * & + PRED2R3(:,:,:)= PREDR1(:,:,:)**2 + (CSTURB%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 * & + PRED2THR3(:,:,:)= PREDR1(:,:,:) * PREDTH1(:,:,:) + CSTURB%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 * & + PRED2TH3(:,:,:) = PREDTH1(:,:,:)**2 + CSTURB%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) ! @@ -372,17 +376,17 @@ ELSE IF (L2D) THEN ! 3D case in a 2D model ELSE ! 3D case in a 3D model ! IF (KRR /= 0) THEN ! moist 3D case - PRED2TH3(:,:,:)= PREDTH1(:,:,:)**2 + ( XCTV*PBLL_O_E(:,:,:)*PETHETA(:,:,:) )**2 * & + PRED2TH3(:,:,:)= PREDTH1(:,:,:)**2 + ( CSTURB%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 * & + PRED2R3(:,:,:)= PREDR1(:,:,:)**2 + (CSTURB%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 * & + PRED2THR3(:,:,:)= PREDR1(:,:,:) * PREDTH1(:,:,:) + CSTURB%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)+ & @@ -391,7 +395,7 @@ ELSE ! 3D case in a 3D model PRED2THR3(:,:,IKB)=PRED2THR3(:,:,IKB+KKL) ! ELSE ! dry 3D case in a 3D model - PRED2TH3(:,:,:) = PREDTH1(:,:,:)**2 + XCTV**2*PBLL_O_E(:,:,:)**2 * & + PRED2TH3(:,:,:) = PREDTH1(:,:,:)**2 + CSTURB%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) @@ -420,12 +424,12 @@ DO JSV=1,ISV PRED2RS3(:,:,:,JSV) = 0. END IF ! - ELSE IF (L2D) THEN ! 3D case in a 2D model + ELSE IF (O2D) THEN ! 3D case in a 2D model ! IF (KRR /= 0) THEN - ZW1 = MZM((XG / PTHVREF * PLM * PLEPS / PTKEM)**2, KKA, KKU, KKL) *PETHETA + ZW1 = MZM((CST%XG / PTHVREF * PLM * PLEPS / PTKEM)**2, KKA, KKU, KKL) *PETHETA ELSE - ZW1 = MZM((XG / PTHVREF * PLM * PLEPS / PTKEM)**2, KKA, KKU, KKL) + ZW1 = MZM((CST%XG / PTHVREF * PLM * PLEPS / PTKEM)**2, KKA, KKU, KKL) END IF PRED2THS3(:,:,:,JSV) = PREDTH1(:,:,:) * PREDS1(:,:,:,JSV) + & ZW1* & @@ -446,9 +450,9 @@ DO JSV=1,ISV ELSE ! 3D case in a 3D model ! IF (KRR /= 0) THEN - ZW1 = MZM((XG / PTHVREF * PLM * PLEPS / PTKEM)**2, KKA, KKU, KKL) *PETHETA + ZW1 = MZM((CST%XG / PTHVREF * PLM * PLEPS / PTKEM)**2, KKA, KKU, KKL) *PETHETA ELSE - ZW1 = MZM((XG / PTHVREF * PLM * PLEPS / PTKEM)**2, KKA, KKU, KKL) + ZW1 = MZM((CST%XG / PTHVREF * PLM * PLEPS / PTKEM)**2, KKA, KKU, KKL) END IF PRED2THS3(:,:,:,JSV) = PREDTH1(:,:,:) * PREDS1(:,:,:,JSV) + & ZW1* & @@ -549,13 +553,14 @@ IF ( OTURB_DIAG .AND. TPFILE%LOPENED ) THEN END IF ! !--------------------------------------------------------------------------- -ENDIF ! (Done only if LHARAT is FALSE) +ENDIF ! (Done only if OHARAT is FALSE) ! IF (LHOOK) CALL DR_HOOK('PRANDTL',1,ZHOOK_HANDLE) END SUBROUTINE PRANDTL ! -SUBROUTINE SMOOTH_TURB_FUNCT(PPHI3,PF_LIM,PF) +SUBROUTINE SMOOTH_TURB_FUNCT(CSTURB,PPHI3,PF_LIM,PF) ! +TYPE(CSTURB_t), INTENT(IN) :: CSTURB REAL, DIMENSION(:,:,:), INTENT(IN) :: PPHI3 ! Phi3 REAL, DIMENSION(:,:,:), INTENT(IN) :: PF_LIM ! Value of F when Phi3 is ! ! larger than Phi_lim @@ -569,14 +574,15 @@ REAL, DIMENSION(SIZE(PF,1),SIZE(PF,2),SIZE(PF,3)) :: ZCOEF ! Note that in the Boundary layer, phi is usually between 0.8 and 1 ! ! -ZCOEF = MAX(MIN(( 10.*(1.-PPHI3/XPHI_LIM)) ,1.), 0.) +ZCOEF = MAX(MIN(( 10.*(1.-PPHI3/CSTURB%XPHI_LIM)) ,1.), 0.) ! PF(:,:,:) = ZCOEF(:,:,:) * PF & + (1.-ZCOEF(:,:,:)) * PF_LIM ! END SUBROUTINE SMOOTH_TURB_FUNCT !---------------------------------------------------------------------------- -FUNCTION PHI3(PREDTH1,PREDR1,PRED2TH3,PRED2R3,PRED2THR3,HTURBDIM,OUSERV) +FUNCTION PHI3(CSTURB,PREDTH1,PREDR1,PRED2TH3,PRED2R3,PRED2THR3,HTURBDIM,OUSERV) + TYPE(CSTURB_t), INTENT(IN) :: CSTURB REAL, DIMENSION(:,:,:), INTENT(IN) :: PREDTH1 REAL, DIMENSION(:,:,:), INTENT(IN) :: PREDR1 REAL, DIMENSION(:,:,:), INTENT(IN) :: PRED2TH3 @@ -618,8 +624,8 @@ IF (HTURBDIM=='3DIM') THEN PHI3(:,:,:)= 1. - & (PRED2TH3(:,:,:) / PREDTH1(:,:,:) + ZW2(:,:,:)) / ZW1(:,:,:) END IF - WHERE( PHI3 <= 0. .OR. PHI3 > XPHI_LIM ) - PHI3 = XPHI_LIM + WHERE( PHI3 <= 0. .OR. PHI3 > CSTURB%XPHI_LIM ) + PHI3 = CSTURB%XPHI_LIM END WHERE ELSE @@ -637,7 +643,8 @@ PHI3(:,:,IKE+1)=PHI3(:,:,IKE) IF (LHOOK) CALL DR_HOOK('MODE_PRANDTL:PHI3',1,ZHOOK_HANDLE) END FUNCTION PHI3 !---------------------------------------------------------------------------- -FUNCTION PSI_SV(PREDTH1,PREDR1,PREDS1,PRED2THS,PRED2RS,PPHI3,PPSI3) +FUNCTION PSI_SV(CSTURB,PREDTH1,PREDR1,PREDS1,PRED2THS,PRED2RS,PPHI3,PPSI3) + TYPE(CSTURB_t), INTENT(IN) :: CSTURB REAL, DIMENSION(:,:,:), INTENT(IN) :: PREDTH1 REAL, DIMENSION(:,:,:), INTENT(IN) :: PREDR1 REAL, DIMENSION(:,:,:,:), INTENT(IN) :: PREDS1 @@ -657,16 +664,16 @@ IKE = SIZE(PREDTH1,3)-JPVEXT_TURB ! DO JSV=1,SIZE(PSI_SV,4) PSI_SV(:,:,:,JSV) = ( 1. & - - (XCPR3+XCPR5) * (PRED2THS(:,:,:,JSV)/PREDS1(:,:,:,JSV)-PREDTH1) & - - (XCPR4+XCPR5) * (PRED2RS (:,:,:,JSV)/PREDS1(:,:,:,JSV)-PREDR1 ) & - - XCPR3 * PREDTH1 * PPHI3 - XCPR4 * PREDR1 * PPSI3 & - ) / ( 1. + XCPR5 * ( PREDTH1 + PREDR1 ) ) + - (CSTURB%XCPR3+CSTURB%XCPR5) * (PRED2THS(:,:,:,JSV)/PREDS1(:,:,:,JSV)-PREDTH1) & + - (CSTURB%XCPR4+CSTURB%XCPR5) * (PRED2RS (:,:,:,JSV)/PREDS1(:,:,:,JSV)-PREDR1 ) & + - CSTURB%XCPR3 * PREDTH1 * PPHI3 - CSTURB%XCPR4 * PREDR1 * PPSI3 & + ) / ( 1. + CSTURB%XCPR5 * ( PREDTH1 + PREDR1 ) ) ! control of the PSI_SV positivity WHERE ( (PSI_SV(:,:,:,JSV) <=0.).AND. (PREDTH1+PREDR1) <= 0. ) - PSI_SV(:,:,:,JSV)=XPHI_LIM + PSI_SV(:,:,:,JSV)=CSTURB%XPHI_LIM END WHERE - PSI_SV(:,:,:,JSV) = MAX( 1.E-4, MIN(XPHI_LIM,PSI_SV(:,:,:,JSV)) ) + PSI_SV(:,:,:,JSV) = MAX( 1.E-4, MIN(CSTURB%XPHI_LIM,PSI_SV(:,:,:,JSV)) ) ! PSI_SV(:,:,IKB-1,JSV)=PSI_SV(:,:,IKB,JSV) PSI_SV(:,:,IKE+1,JSV)=PSI_SV(:,:,IKE,JSV) @@ -675,7 +682,8 @@ END DO IF (LHOOK) CALL DR_HOOK('MODE_PRANDTL:PSI_SV',1,ZHOOK_HANDLE) END FUNCTION PSI_SV !---------------------------------------------------------------------------- -FUNCTION D_PHI3DTDZ_O_DDTDZ(PPHI3,PREDTH1,PREDR1,PRED2TH3,PRED2THR3,HTURBDIM,OUSERV) +FUNCTION D_PHI3DTDZ_O_DDTDZ(CSTURB,PPHI3,PREDTH1,PREDR1,PRED2TH3,PRED2THR3,HTURBDIM,OUSERV) + TYPE(CSTURB_t), INTENT(IN) :: CSTURB REAL, DIMENSION(:,:,:), INTENT(IN) :: PPHI3 REAL, DIMENSION(:,:,:), INTENT(IN) :: PREDTH1 REAL, DIMENSION(:,:,:), INTENT(IN) :: PREDR1 @@ -694,11 +702,7 @@ IKE = SIZE(PREDTH1,3)-JPVEXT_TURB IF (HTURBDIM=='3DIM') THEN !* 3DIM case IF (OUSERV) THEN -#ifdef REPRO48 - WHERE (PPHI3(:,:,:)/=XPHI_LIM) -#else - WHERE (PPHI3(:,:,:)<=XPHI_LIM) -#endif + WHERE (PPHI3(:,:,:)<=CSTURB%XPHI_LIM) D_PHI3DTDZ_O_DDTDZ(:,:,:) = PPHI3(:,:,:) & * (1. - PREDTH1(:,:,:) * (3./2.+PREDTH1+PREDR1) & /((1.+PREDTH1+PREDR1)*(1.+1./2.*(PREDTH1+PREDR1)))) & @@ -712,11 +716,7 @@ IF (HTURBDIM=='3DIM') THEN ! ELSE -#ifdef REPRO48 - WHERE (PPHI3(:,:,:)/=XPHI_LIM) -#else - WHERE (PPHI3(:,:,:)<=XPHI_LIM) -#endif + WHERE (PPHI3(:,:,:)<=CSTURB%XPHI_LIM) D_PHI3DTDZ_O_DDTDZ(:,:,:) = PPHI3(:,:,:) & * (1. - PREDTH1(:,:,:) * (3./2.+PREDTH1) & /((1.+PREDTH1)*(1.+1./2.*PREDTH1))) & @@ -729,10 +729,16 @@ IF (HTURBDIM=='3DIM') THEN END IF ELSE !* 1DIM case +! WHERE (PPHI3(:,:,:)<=CSTURB%XPHI_LIM) +! D_PHI3DTDZ_O_DDTDZ(:,:,:) = PPHI3(:,:,:) & +! * (1. - PREDTH1(:,:,:)*PPHI3(:,:,:)) +! ELSEWHERE +! D_PHI3DTDZ_O_DDTDZ(:,:,:) = PPHI3(:,:,:) +! ENDWHERE DO JJ=1,SIZE(PPHI3,2) DO JL=1,SIZE(PPHI3,1) DO JK=1,SIZE(PPHI3,3) - IF ( ABS(PPHI3(JL,JJ,JK)-XPHI_LIM) < 1.E-12 ) THEN + IF ( ABS(PPHI3(JL,JJ,JK)-CSTURB%XPHI_LIM) < 1.E-12 ) THEN D_PHI3DTDZ_O_DDTDZ(JL,JJ,JK)=PPHI3(JL,JJ,JK)*& & (1. - PREDTH1(JL,JJ,JK)*PPHI3(JL,JJ,JK)) ELSE @@ -743,11 +749,8 @@ DO JJ=1,SIZE(PPHI3,2) ENDDO END IF ! -#ifdef REPRO48 -#else !* smoothing -CALL SMOOTH_TURB_FUNCT(PPHI3,PPHI3,D_PHI3DTDZ_O_DDTDZ) -#endif +CALL SMOOTH_TURB_FUNCT(CSTURB,PPHI3,PPHI3,D_PHI3DTDZ_O_DDTDZ) ! D_PHI3DTDZ_O_DDTDZ(:,:,IKB-1)=D_PHI3DTDZ_O_DDTDZ(:,:,IKB) D_PHI3DTDZ_O_DDTDZ(:,:,IKE+1)=D_PHI3DTDZ_O_DDTDZ(:,:,IKE) @@ -755,7 +758,8 @@ D_PHI3DTDZ_O_DDTDZ(:,:,IKE+1)=D_PHI3DTDZ_O_DDTDZ(:,:,IKE) IF (LHOOK) CALL DR_HOOK('MODE_PRANDTL:D_PHI3DTDZ_O_DDTDZ',1,ZHOOK_HANDLE) END FUNCTION D_PHI3DTDZ_O_DDTDZ !---------------------------------------------------------------------------- -FUNCTION D_PHI3DRDZ_O_DDRDZ(PPHI3,PREDTH1,PREDR1,PRED2TH3,PRED2THR3,HTURBDIM,OUSERV) +FUNCTION D_PHI3DRDZ_O_DDRDZ(CSTURB,PPHI3,PREDTH1,PREDR1,PRED2TH3,PRED2THR3,HTURBDIM,OUSERV) + TYPE(CSTURB_t), INTENT(IN) :: CSTURB REAL, DIMENSION(:,:,:), INTENT(IN) :: PPHI3 REAL, DIMENSION(:,:,:), INTENT(IN) :: PREDTH1 REAL, DIMENSION(:,:,:), INTENT(IN) :: PREDR1 @@ -775,11 +779,7 @@ IKE = SIZE(PREDTH1,3)-JPVEXT_TURB IF (HTURBDIM=='3DIM') THEN !* 3DIM case IF (OUSERV) THEN -#ifdef REPRO48 - WHERE (PPHI3(:,:,:)/=XPHI_LIM) -#else - WHERE (PPHI3(:,:,:)<=XPHI_LIM) -#endif + WHERE (PPHI3(:,:,:)<=CSTURB%XPHI_LIM) D_PHI3DRDZ_O_DDRDZ(:,:,:) = & PPHI3(:,:,:) * (1.-PREDR1(:,:,:)*(3./2.+PREDTH1+PREDR1) & / ((1.+PREDTH1+PREDR1)*(1.+1./2.*(PREDTH1+PREDR1)))) & @@ -795,11 +795,7 @@ IF (HTURBDIM=='3DIM') THEN END IF ELSE !* 1DIM case -#ifdef REPRO48 - WHERE (PPHI3(:,:,:)/=XPHI_LIM) -#else - WHERE (PPHI3(:,:,:)<=XPHI_LIM) -#endif + WHERE (PPHI3(:,:,:)<=CSTURB%XPHI_LIM) D_PHI3DRDZ_O_DDRDZ(:,:,:) = PPHI3(:,:,:) & * (1. - PREDR1(:,:,:)*PPHI3(:,:,:)) ELSEWHERE @@ -807,11 +803,8 @@ ELSE END WHERE END IF ! -#ifdef REPRO48 -#else !* smoothing -CALL SMOOTH_TURB_FUNCT(PPHI3,PPHI3,D_PHI3DRDZ_O_DDRDZ) -#endif +CALL SMOOTH_TURB_FUNCT(CSTURB,PPHI3,PPHI3,D_PHI3DRDZ_O_DDRDZ) ! D_PHI3DRDZ_O_DDRDZ(:,:,IKB-1)=D_PHI3DRDZ_O_DDRDZ(:,:,IKB) D_PHI3DRDZ_O_DDRDZ(:,:,IKE+1)=D_PHI3DRDZ_O_DDRDZ(:,:,IKE) @@ -819,7 +812,8 @@ D_PHI3DRDZ_O_DDRDZ(:,:,IKE+1)=D_PHI3DRDZ_O_DDRDZ(:,:,IKE) IF (LHOOK) CALL DR_HOOK('MODE_PRANDTL:D_PHI3DRDZ_O_DDRDZ',1,ZHOOK_HANDLE) END FUNCTION D_PHI3DRDZ_O_DDRDZ !---------------------------------------------------------------------------- -FUNCTION D_PHI3DTDZ2_O_DDTDZ(PPHI3,PREDTH1,PREDR1,PRED2TH3,PRED2THR3,PDTDZ,HTURBDIM,OUSERV) +FUNCTION D_PHI3DTDZ2_O_DDTDZ(CSTURB,PPHI3,PREDTH1,PREDR1,PRED2TH3,PRED2THR3,PDTDZ,HTURBDIM,OUSERV) + TYPE(CSTURB_t), INTENT(IN) :: CSTURB REAL, DIMENSION(:,:,:), INTENT(IN) :: PPHI3 REAL, DIMENSION(:,:,:), INTENT(IN) :: PREDTH1 REAL, DIMENSION(:,:,:), INTENT(IN) :: PREDR1 @@ -840,15 +834,37 @@ IKE = SIZE(PREDTH1,3)-JPVEXT_TURB IF (HTURBDIM=='3DIM') THEN ! by derivation of (phi3 dtdz) * dtdz according to dtdz we obtain: D_PHI3DTDZ2_O_DDTDZ(:,:,:) = PDTDZ * (PPHI3 + & - D_PHI3DTDZ_O_DDTDZ(PPHI3,PREDTH1,PREDR1,PRED2TH3,PRED2THR3,HTURBDIM,OUSERV) ) + D_PHI3DTDZ_O_DDTDZ(CSTURB,PPHI3,PREDTH1,PREDR1,PRED2TH3,PRED2THR3,HTURBDIM,OUSERV) ) +! !* 3DIM case +! IF (OUSERV) THEN +! WHERE (PPHI3(:,:,:)<=CSTURB%XPHI_LIM) +! D_PHI3DTDZ2_O_DDTDZ(:,:,:) = PPHI3(:,:,:) & +! * PDTDZ(:,:,:)*(2.-PREDTH1(:,:,:)*(3./2.+PREDTH1+PREDR1) & +! /((1.+PREDTH1+PREDR1)*(1.+1./2.*(PREDTH1+PREDR1)))) & +! + (1.+PREDR1)*(PRED2THR3+PRED2TH3) & +! / (PREDTH1*(1.+PREDTH1+PREDR1)*(1.+1./2.*(PREDTH1+PREDR1))) & +! - (1./2.*PREDTH1+PREDR1 * (1.+PREDTH1+PREDR1)) & +! / ((1.+PREDTH1+PREDR1)*(1.+1./2.*(PREDTH1+PREDR1))) +! ELSEWHERE +! D_PHI3DTDZ2_O_DDTDZ(:,:,:) = PPHI3(:,:,:) * 2. * PDTDZ(:,:,:) +! ENDWHERE +! +!! +! ELSE +! WHERE (PPHI3(:,:,:)<=CSTURB%XPHI_LIM) +! D_PHI3DTDZ2_O_DDTDZ(:,:,:) = PPHI3(:,:,:) & +! * PDTDZ(:,:,:)*(2.-PREDTH1(:,:,:)*(3./2.+PREDTH1) & +! /((1.+PREDTH1)*(1.+1./2.*PREDTH1))) & +! + PRED2TH3 / (PREDTH1*(1.+PREDTH1)*(1.+1./2.*PREDTH1)) & +! - 1./2.*PREDTH1 / ((1.+PREDTH1)*(1.+1./2.*PREDTH1)) +! ELSEWHERE +! D_PHI3DTDZ2_O_DDTDZ(:,:,:) = PPHI3(:,:,:) * 2. * PDTDZ(:,:,:) +! ENDWHERE +! END IF ELSE !* 1DIM case -#ifdef REPRO48 - WHERE (PPHI3(:,:,:)/=XPHI_LIM) -#else - WHERE (PPHI3(:,:,:)<=XPHI_LIM) -#endif + WHERE (PPHI3(:,:,:)<=CSTURB%XPHI_LIM) D_PHI3DTDZ2_O_DDTDZ(:,:,:) = PPHI3(:,:,:)*PDTDZ(:,:,:) & * (2. - PREDTH1(:,:,:)*PPHI3(:,:,:)) ELSEWHERE @@ -856,11 +872,8 @@ ELSE END WHERE END IF ! -#ifdef REPRO48 -#else !* smoothing -CALL SMOOTH_TURB_FUNCT(PPHI3,PPHI3*2.*PDTDZ,D_PHI3DTDZ2_O_DDTDZ) -#endif +CALL SMOOTH_TURB_FUNCT(CSTURB,PPHI3,PPHI3*2.*PDTDZ,D_PHI3DTDZ2_O_DDTDZ) ! ! D_PHI3DTDZ2_O_DDTDZ(:,:,IKB-1)=D_PHI3DTDZ2_O_DDTDZ(:,:,IKB) @@ -869,7 +882,8 @@ D_PHI3DTDZ2_O_DDTDZ(:,:,IKE+1)=D_PHI3DTDZ2_O_DDTDZ(:,:,IKE) IF (LHOOK) CALL DR_HOOK('MODE_PRANDTL:D_PHI3DTDZ2_O_DDTDZ',1,ZHOOK_HANDLE) END FUNCTION D_PHI3DTDZ2_O_DDTDZ !---------------------------------------------------------------------------- -FUNCTION M3_WTH_WTH2(PREDTH1,PREDR1,PD,PBLL_O_E,PETHETA) +FUNCTION M3_WTH_WTH2(CSTURB,PREDTH1,PREDR1,PD,PBLL_O_E,PETHETA) + TYPE(CSTURB_t), INTENT(IN) :: CSTURB REAL, DIMENSION(:,:,:), INTENT(IN) :: PREDTH1 REAL, DIMENSION(:,:,:), INTENT(IN) :: PREDR1 REAL, DIMENSION(:,:,:), INTENT(IN) :: PD @@ -883,7 +897,7 @@ IF (LHOOK) CALL DR_HOOK('MODE_PRANDTL:M3_WTH_WTH2',0,ZHOOK_HANDLE) IKB = 1+JPVEXT_TURB IKE = SIZE(PD,3)-JPVEXT_TURB -M3_WTH_WTH2(:,:,:) = XCSHF*PBLL_O_E*PETHETA*0.5/XCTD & +M3_WTH_WTH2(:,:,:) = CSTURB%XCSHF*PBLL_O_E*PETHETA*0.5/CSTURB%XCTD & * (1.+0.5*PREDTH1+PREDR1) / PD M3_WTH_WTH2(:,:,IKB-1)=M3_WTH_WTH2(:,:,IKB) M3_WTH_WTH2(:,:,IKE+1)=M3_WTH_WTH2(:,:,IKE) @@ -891,7 +905,8 @@ M3_WTH_WTH2(:,:,IKE+1)=M3_WTH_WTH2(:,:,IKE) IF (LHOOK) CALL DR_HOOK('MODE_PRANDTL:M3_WTH_WTH2',1,ZHOOK_HANDLE) END FUNCTION M3_WTH_WTH2 !---------------------------------------------------------------------------- -FUNCTION D_M3_WTH_WTH2_O_DDTDZ(PM3_WTH_WTH2,PREDTH1,PREDR1,PD,PBLL_O_E,PETHETA) +FUNCTION D_M3_WTH_WTH2_O_DDTDZ(CSTURB,PM3_WTH_WTH2,PREDTH1,PREDR1,PD,PBLL_O_E,PETHETA) + TYPE(CSTURB_t), INTENT(IN) :: CSTURB REAL, DIMENSION(:,:,:), INTENT(IN) :: PM3_WTH_WTH2 REAL, DIMENSION(:,:,:), INTENT(IN) :: PREDTH1 REAL, DIMENSION(:,:,:), INTENT(IN) :: PREDR1 @@ -906,9 +921,9 @@ IF (LHOOK) CALL DR_HOOK('MODE_PRANDTL:D_M3_WTH_WTH2_O_DDTDZ',0,ZHOOK_HANDLE) IKB = 1+JPVEXT_TURB IKE = SIZE(PD,3)-JPVEXT_TURB -D_M3_WTH_WTH2_O_DDTDZ(:,:,:) = ( 0.5*XCSHF*PBLL_O_E*PETHETA*0.5/XCTD/PD & +D_M3_WTH_WTH2_O_DDTDZ(:,:,:) = ( 0.5*CSTURB%XCSHF*PBLL_O_E*PETHETA*0.5/CSTURB%XCTD/PD & - PM3_WTH_WTH2/PD*(1.5+PREDTH1+PREDR1) )& - * PBLL_O_E * PETHETA * XCTV + * PBLL_O_E * PETHETA * CSTURB%XCTV ! D_M3_WTH_WTH2_O_DDTDZ(:,:,IKB-1)=D_M3_WTH_WTH2_O_DDTDZ(:,:,IKB) D_M3_WTH_WTH2_O_DDTDZ(:,:,IKE+1)=D_M3_WTH_WTH2_O_DDTDZ(:,:,IKE) @@ -916,7 +931,8 @@ D_M3_WTH_WTH2_O_DDTDZ(:,:,IKE+1)=D_M3_WTH_WTH2_O_DDTDZ(:,:,IKE) IF (LHOOK) CALL DR_HOOK('MODE_PRANDTL:D_M3_WTH_WTH2_O_DDTDZ',1,ZHOOK_HANDLE) END FUNCTION D_M3_WTH_WTH2_O_DDTDZ !---------------------------------------------------------------------------- -FUNCTION M3_WTH_W2TH(KKA,KKU,KKL,PREDTH1,PREDR1,PD,PKEFF,PTKE) +FUNCTION M3_WTH_W2TH(CSTURB,KKA,KKU,KKL,PREDTH1,PREDR1,PD,PKEFF,PTKE) + TYPE(CSTURB_t), INTENT(IN) :: CSTURB INTEGER, INTENT(IN) :: KKA INTEGER, INTENT(IN) :: KKU INTEGER, INTENT(IN) :: KKL @@ -933,7 +949,7 @@ IF (LHOOK) CALL DR_HOOK('MODE_PRANDTL:M3_WTH_W2TH',0,ZHOOK_HANDLE) IKB = 1+JPVEXT_TURB IKE = SIZE(PD,3)-JPVEXT_TURB -M3_WTH_W2TH(:,:,:) = XCSHF*PKEFF*1.5/MZM(PTKE, KKA, KKU, KKL) & +M3_WTH_W2TH(:,:,:) = CSTURB%XCSHF*PKEFF*1.5/MZM(PTKE, KKA, KKU, KKL) & * (1. - 0.5*PREDR1*(1.+PREDR1)/PD ) / (1.+PREDTH1) ! M3_WTH_W2TH(:,:,IKB-1)=M3_WTH_W2TH(:,:,IKB) @@ -942,7 +958,8 @@ M3_WTH_W2TH(:,:,IKE+1)=M3_WTH_W2TH(:,:,IKE) IF (LHOOK) CALL DR_HOOK('MODE_PRANDTL:M3_WTH_W2TH',1,ZHOOK_HANDLE) END FUNCTION M3_WTH_W2TH !---------------------------------------------------------------------------- -FUNCTION D_M3_WTH_W2TH_O_DDTDZ(KKA,KKU,KKL,PREDTH1,PREDR1,PD,PBLL_O_E,PETHETA,PKEFF,PTKE) +FUNCTION D_M3_WTH_W2TH_O_DDTDZ(CSTURB,KKA,KKU,KKL,PREDTH1,PREDR1,PD,PBLL_O_E,PETHETA,PKEFF,PTKE) + TYPE(CSTURB_t), INTENT(IN) :: CSTURB INTEGER, INTENT(IN) :: KKA INTEGER, INTENT(IN) :: KKU INTEGER, INTENT(IN) :: KKL @@ -962,7 +979,7 @@ IKB = 1+JPVEXT_TURB IKE = SIZE(PD,3)-JPVEXT_TURB D_M3_WTH_W2TH_O_DDTDZ(:,:,:) = & - - XCSHF*PKEFF*1.5/MZM(PTKE, KKA, KKU, KKL)/(1.+PREDTH1)**2*XCTV*PBLL_O_E*PETHETA & + - CSTURB%XCSHF*PKEFF*1.5/MZM(PTKE, KKA, KKU, KKL)/(1.+PREDTH1)**2*CSTURB%XCTV*PBLL_O_E*PETHETA & * (1. - 0.5*PREDR1*(1.+PREDR1)/PD*( 1.+(1.+PREDTH1)*(1.5+PREDR1+PREDTH1)/PD) ) ! D_M3_WTH_W2TH_O_DDTDZ(:,:,IKB-1)=D_M3_WTH_W2TH_O_DDTDZ(:,:,IKB) @@ -971,7 +988,8 @@ D_M3_WTH_W2TH_O_DDTDZ(:,:,IKE+1)=D_M3_WTH_W2TH_O_DDTDZ(:,:,IKE) IF (LHOOK) CALL DR_HOOK('MODE_PRANDTL:D_M3_WTH_W2TH_O_DDTDZ',1,ZHOOK_HANDLE) END FUNCTION D_M3_WTH_W2TH_O_DDTDZ !---------------------------------------------------------------------------- -FUNCTION M3_WTH_W2R(KKA,KKU,KKL,PD,PKEFF,PTKE,PBLL_O_E,PEMOIST,PDTDZ) +FUNCTION M3_WTH_W2R(CSTURB,KKA,KKU,KKL,PD,PKEFF,PTKE,PBLL_O_E,PEMOIST,PDTDZ) + TYPE(CSTURB_t), INTENT(IN) :: CSTURB INTEGER, INTENT(IN) :: KKA INTEGER, INTENT(IN) :: KKU INTEGER, INTENT(IN) :: KKL @@ -989,7 +1007,7 @@ IF (LHOOK) CALL DR_HOOK('MODE_PRANDTL:M3_WTH_W2R',0,ZHOOK_HANDLE) IKB = 1+JPVEXT_TURB IKE = SIZE(PD,3)-JPVEXT_TURB -M3_WTH_W2R(:,:,:) = - XCSHF*PKEFF*0.75*XCTV*PBLL_O_E/MZM(PTKE, KKA, KKU, KKL)*PEMOIST*PDTDZ/PD +M3_WTH_W2R(:,:,:) = - CSTURB%XCSHF*PKEFF*0.75*CSTURB%XCTV*PBLL_O_E/MZM(PTKE, KKA, KKU, KKL)*PEMOIST*PDTDZ/PD ! M3_WTH_W2R(:,:,IKB-1)=M3_WTH_W2R(:,:,IKB) M3_WTH_W2R(:,:,IKE+1)=M3_WTH_W2R(:,:,IKE) @@ -997,7 +1015,8 @@ M3_WTH_W2R(:,:,IKE+1)=M3_WTH_W2R(:,:,IKE) IF (LHOOK) CALL DR_HOOK('MODE_PRANDTL:M3_WTH_W2R',1,ZHOOK_HANDLE) END FUNCTION M3_WTH_W2R !---------------------------------------------------------------------------- -FUNCTION D_M3_WTH_W2R_O_DDTDZ(KKA,KKU,KKL,PREDTH1,PREDR1,PD,PKEFF,PTKE,PBLL_O_E,PEMOIST) +FUNCTION D_M3_WTH_W2R_O_DDTDZ(CSTURB,KKA,KKU,KKL,PREDTH1,PREDR1,PD,PKEFF,PTKE,PBLL_O_E,PEMOIST) + TYPE(CSTURB_t), INTENT(IN) :: CSTURB INTEGER, INTENT(IN) :: KKA INTEGER, INTENT(IN) :: KKU INTEGER, INTENT(IN) :: KKL @@ -1016,7 +1035,7 @@ IF (LHOOK) CALL DR_HOOK('MODE_PRANDTL:D_M3_WTH_W2R_O_DDTDZ',0,ZHOOK_HANDLE) IKB = 1+JPVEXT_TURB IKE = SIZE(PD,3)-JPVEXT_TURB -D_M3_WTH_W2R_O_DDTDZ(:,:,:) = - XCSHF*PKEFF*0.75*XCTV*PBLL_O_E/MZM(PTKE, KKA, KKU, KKL)*PEMOIST/PD & +D_M3_WTH_W2R_O_DDTDZ(:,:,:) = - CSTURB%XCSHF*PKEFF*0.75*CSTURB%XCTV*PBLL_O_E/MZM(PTKE, KKA, KKU, KKL)*PEMOIST/PD & * (1. - PREDTH1*(1.5+PREDTH1+PREDR1)/PD) ! D_M3_WTH_W2R_O_DDTDZ(:,:,IKB-1)=D_M3_WTH_W2R_O_DDTDZ(:,:,IKB) @@ -1025,7 +1044,8 @@ D_M3_WTH_W2R_O_DDTDZ(:,:,IKE+1)=D_M3_WTH_W2R_O_DDTDZ(:,:,IKE) IF (LHOOK) CALL DR_HOOK('MODE_PRANDTL:D_M3_WTH_W2R_O_DDTDZ',1,ZHOOK_HANDLE) END FUNCTION D_M3_WTH_W2R_O_DDTDZ !---------------------------------------------------------------------------- -FUNCTION M3_WTH_WR2(KKA,KKU,KKL,PD,PKEFF,PTKE,PSQRT_TKE,PBLL_O_E,PBETA,PLEPS,PEMOIST,PDTDZ) +FUNCTION M3_WTH_WR2(CSTURB,KKA,KKU,KKL,PD,PKEFF,PTKE,PSQRT_TKE,PBLL_O_E,PBETA,PLEPS,PEMOIST,PDTDZ) + TYPE(CSTURB_t), INTENT(IN) :: CSTURB INTEGER, INTENT(IN) :: KKA INTEGER, INTENT(IN) :: KKU INTEGER, INTENT(IN) :: KKL @@ -1046,8 +1066,8 @@ IF (LHOOK) CALL DR_HOOK('MODE_PRANDTL:M3_WTH_WR2',0,ZHOOK_HANDLE) IKB = 1+JPVEXT_TURB IKE = SIZE(PD,3)-JPVEXT_TURB -M3_WTH_WR2(:,:,:) = - XCSHF*PKEFF*0.25*PBLL_O_E*XCTV*PEMOIST**2 & - *MZM(PBETA*PLEPS/(PSQRT_TKE*PTKE), KKA, KKU, KKL)/XCTD*PDTDZ/PD +M3_WTH_WR2(:,:,:) = - CSTURB%XCSHF*PKEFF*0.25*PBLL_O_E*CSTURB%XCTV*PEMOIST**2 & + *MZM(PBETA*PLEPS/(PSQRT_TKE*PTKE), KKA, KKU, KKL)/CSTURB%XCTD*PDTDZ/PD ! M3_WTH_WR2(:,:,IKB-1)=M3_WTH_WR2(:,:,IKB) M3_WTH_WR2(:,:,IKE+1)=M3_WTH_WR2(:,:,IKE) @@ -1055,7 +1075,8 @@ M3_WTH_WR2(:,:,IKE+1)=M3_WTH_WR2(:,:,IKE) IF (LHOOK) CALL DR_HOOK('MODE_PRANDTL:M3_WTH_WR2',1,ZHOOK_HANDLE) END FUNCTION M3_WTH_WR2 !---------------------------------------------------------------------------- -FUNCTION D_M3_WTH_WR2_O_DDTDZ(KKA,KKU,KKL,PREDTH1,PREDR1,PD,PKEFF,PTKE,PSQRT_TKE,PBLL_O_E,PBETA,PLEPS,PEMOIST) +FUNCTION D_M3_WTH_WR2_O_DDTDZ(CSTURB,KKA,KKU,KKL,PREDTH1,PREDR1,PD,PKEFF,PTKE,PSQRT_TKE,PBLL_O_E,PBETA,PLEPS,PEMOIST) + TYPE(CSTURB_t), INTENT(IN) :: CSTURB INTEGER, INTENT(IN) :: KKA INTEGER, INTENT(IN) :: KKU INTEGER, INTENT(IN) :: KKL @@ -1077,8 +1098,8 @@ IF (LHOOK) CALL DR_HOOK('MODE_PRANDTL:D_M3_WTH_WR2_O_DDTDZ',0,ZHOOK_HANDLE) IKB = 1+JPVEXT_TURB IKE = SIZE(PD,3)-JPVEXT_TURB -D_M3_WTH_WR2_O_DDTDZ(:,:,:) = - XCSHF*PKEFF*0.25*PBLL_O_E*XCTV*PEMOIST**2 & - *MZM(PBETA*PLEPS/(PSQRT_TKE*PTKE), KKA, KKU, KKL)/XCTD/PD & +D_M3_WTH_WR2_O_DDTDZ(:,:,:) = - CSTURB%XCSHF*PKEFF*0.25*PBLL_O_E*CSTURB%XCTV*PEMOIST**2 & + *MZM(PBETA*PLEPS/(PSQRT_TKE*PTKE), KKA, KKU, KKL)/CSTURB%XCTD/PD & * (1. - PREDTH1*(1.5+PREDTH1+PREDR1)/PD) ! D_M3_WTH_WR2_O_DDTDZ(:,:,IKB-1)=D_M3_WTH_WR2_O_DDTDZ(:,:,IKB) @@ -1087,7 +1108,8 @@ D_M3_WTH_WR2_O_DDTDZ(:,:,IKE+1)=D_M3_WTH_WR2_O_DDTDZ(:,:,IKE) IF (LHOOK) CALL DR_HOOK('MODE_PRANDTL:D_M3_WTH_WR2_O_DDTDZ',1,ZHOOK_HANDLE) END FUNCTION D_M3_WTH_WR2_O_DDTDZ !---------------------------------------------------------------------------- -FUNCTION M3_WTH_WTHR(KKA,KKU,KKL,PREDR1,PD,PKEFF,PTKE,PSQRT_TKE,PBETA,PLEPS,PEMOIST) +FUNCTION M3_WTH_WTHR(CSTURB,KKA,KKU,KKL,PREDR1,PD,PKEFF,PTKE,PSQRT_TKE,PBETA,PLEPS,PEMOIST) + TYPE(CSTURB_t), INTENT(IN) :: CSTURB INTEGER, INTENT(IN) :: KKA INTEGER, INTENT(IN) :: KKU INTEGER, INTENT(IN) :: KKL @@ -1107,10 +1129,10 @@ IF (LHOOK) CALL DR_HOOK('MODE_PRANDTL:M3_WTH_WTHR',0,ZHOOK_HANDLE) IKB = 1+JPVEXT_TURB IKE = SIZE(PD,3)-JPVEXT_TURB -!M3_WTH_WTHR(:,:,:) = XCSHF*PKEFF*PEMOIST/MZM(PBETA*PTKE*PSQRT_TKE, KKA, KKU, KKL) & -! *0.5*PLEPS/XCTD*(1+PREDR1)/PD -M3_WTH_WTHR(:,:,:) = XCSHF*PKEFF*PEMOIST*MZM(PBETA/PTKE*PSQRT_TKE, KKA, KKU, KKL) & - *0.5*PLEPS/XCTD*(1+PREDR1)/PD +!M3_WTH_WTHR(:,:,:) = CSTURB%XCSHF*PKEFF*PEMOIST/MZM(PBETA*PTKE*PSQRT_TKE, KKA, KKU, KKL) & +! *0.5*PLEPS/CSTURB%XCTD*(1+PREDR1)/PD +M3_WTH_WTHR(:,:,:) = CSTURB%XCSHF*PKEFF*PEMOIST*MZM(PBETA/PTKE*PSQRT_TKE, KKA, KKU, KKL) & + *0.5*PLEPS/CSTURB%XCTD*(1+PREDR1)/PD ! M3_WTH_WTHR(:,:,IKB-1)=M3_WTH_WTHR(:,:,IKB) M3_WTH_WTHR(:,:,IKE+1)=M3_WTH_WTHR(:,:,IKE) @@ -1118,7 +1140,8 @@ M3_WTH_WTHR(:,:,IKE+1)=M3_WTH_WTHR(:,:,IKE) IF (LHOOK) CALL DR_HOOK('MODE_PRANDTL:M3_WTH_WTHR',1,ZHOOK_HANDLE) END FUNCTION M3_WTH_WTHR !---------------------------------------------------------------------------- -FUNCTION D_M3_WTH_WTHR_O_DDTDZ(PM3_WTH_WTHR,PREDTH1,PREDR1,PD,PBLL_O_E,PETHETA) +FUNCTION D_M3_WTH_WTHR_O_DDTDZ(CSTURB,PM3_WTH_WTHR,PREDTH1,PREDR1,PD,PBLL_O_E,PETHETA) + TYPE(CSTURB_t), INTENT(IN) :: CSTURB REAL, DIMENSION(:,:,:), INTENT(IN) :: PM3_WTH_WTHR REAL, DIMENSION(:,:,:), INTENT(IN) :: PREDTH1 REAL, DIMENSION(:,:,:), INTENT(IN) :: PREDR1 @@ -1133,7 +1156,7 @@ IF (LHOOK) CALL DR_HOOK('MODE_PRANDTL:D_M3_WTH_WTHR_O_DDTDZ',0,ZHOOK_HANDLE) IKB = 1+JPVEXT_TURB IKE = SIZE(PD,3)-JPVEXT_TURB -D_M3_WTH_WTHR_O_DDTDZ(:,:,:) = - PM3_WTH_WTHR * (1.5+PREDTH1+PREDR1)/PD*XCTV*PBLL_O_E*PETHETA +D_M3_WTH_WTHR_O_DDTDZ(:,:,:) = - PM3_WTH_WTHR * (1.5+PREDTH1+PREDR1)/PD*CSTURB%XCTV*PBLL_O_E*PETHETA ! D_M3_WTH_WTHR_O_DDTDZ(:,:,IKB-1)=D_M3_WTH_WTHR_O_DDTDZ(:,:,IKB) D_M3_WTH_WTHR_O_DDTDZ(:,:,IKE+1)=D_M3_WTH_WTHR_O_DDTDZ(:,:,IKE) @@ -1141,7 +1164,8 @@ D_M3_WTH_WTHR_O_DDTDZ(:,:,IKE+1)=D_M3_WTH_WTHR_O_DDTDZ(:,:,IKE) IF (LHOOK) CALL DR_HOOK('MODE_PRANDTL:D_M3_WTH_WTHR_O_DDTDZ',1,ZHOOK_HANDLE) END FUNCTION D_M3_WTH_WTHR_O_DDTDZ !---------------------------------------------------------------------------- -FUNCTION M3_TH2_W2TH(KKA,KKU,KKL,PREDTH1,PREDR1,PD,PDTDZ,PLM,PLEPS,PTKE) +FUNCTION M3_TH2_W2TH(CSTURB,KKA,KKU,KKL,PREDTH1,PREDR1,PD,PDTDZ,PLM,PLEPS,PTKE) + TYPE(CSTURB_t), INTENT(IN) :: CSTURB INTEGER, INTENT(IN) :: KKA INTEGER, INTENT(IN) :: KKU INTEGER, INTENT(IN) :: KKL @@ -1161,7 +1185,7 @@ IKB = 1+JPVEXT_TURB IKE = SIZE(PD,3)-JPVEXT_TURB M3_TH2_W2TH(:,:,:) = - MZF((1.-0.5*PREDR1*(1.+PREDR1)/PD)/(1.+PREDTH1)*PDTDZ, KKA, KKU, KKL) & - * 1.5*PLM*PLEPS/PTKE*XCTV + * 1.5*PLM*PLEPS/PTKE*CSTURB%XCTV ! M3_TH2_W2TH(:,:,IKB-1)=M3_TH2_W2TH(:,:,IKB) M3_TH2_W2TH(:,:,IKE+1)=M3_TH2_W2TH(:,:,IKE) @@ -1169,7 +1193,8 @@ M3_TH2_W2TH(:,:,IKE+1)=M3_TH2_W2TH(:,:,IKE) IF (LHOOK) CALL DR_HOOK('MODE_PRANDTL:M3_TH2_W2TH',1,ZHOOK_HANDLE) END FUNCTION M3_TH2_W2TH !---------------------------------------------------------------------------- -FUNCTION D_M3_TH2_W2TH_O_DDTDZ(KKA,KKU,KKL,PREDTH1,PREDR1,PD,PLM,PLEPS,PTKE,OUSERV) +FUNCTION D_M3_TH2_W2TH_O_DDTDZ(CSTURB,KKA,KKU,KKL,PREDTH1,PREDR1,PD,PLM,PLEPS,PTKE,OUSERV) + TYPE(CSTURB_t), INTENT(IN) :: CSTURB INTEGER, INTENT(IN) :: KKA INTEGER, INTENT(IN) :: KKU INTEGER, INTENT(IN) :: KKL @@ -1189,15 +1214,15 @@ IKB = 1+JPVEXT_TURB IKE = SIZE(PD,3)-JPVEXT_TURB IF (OUSERV) THEN -! D_M3_TH2_W2TH_O_DDTDZ(:,:,:) = - 1.5*PLM*PLEPS/PTKE*XCTV * MZF( & +! D_M3_TH2_W2TH_O_DDTDZ(:,:,:) = - 1.5*PLM*PLEPS/PTKE*CSTURB%XCTV * MZF( & ! (1.-0.5*PREDR1*(1.+PREDR1)/PD)*(1.-(1.5+PREDTH1+PREDR1)*(1.+PREDTH1)/PD ) & ! / (1.+PREDTH1)**2, KKA, KKU, KKL) - D_M3_TH2_W2TH_O_DDTDZ(:,:,:) = - 1.5*PLM*PLEPS/PTKE*XCTV * MZF( & + D_M3_TH2_W2TH_O_DDTDZ(:,:,:) = - 1.5*PLM*PLEPS/PTKE*CSTURB%XCTV * MZF( & (1.-0.5*PREDR1*(1.+PREDR1)/PD)*(1.-(1.5+PREDTH1+PREDR1)* & PREDTH1*(1.+PREDTH1)/PD ) / (1.+PREDTH1)**2, KKA, KKU, KKL) ELSE - D_M3_TH2_W2TH_O_DDTDZ(:,:,:) = - 1.5*PLM*PLEPS/PTKE*XCTV * MZF(1./(1.+PREDTH1)**2, KKA, KKU, KKL) + D_M3_TH2_W2TH_O_DDTDZ(:,:,:) = - 1.5*PLM*PLEPS/PTKE*CSTURB%XCTV * MZF(1./(1.+PREDTH1)**2, KKA, KKU, KKL) END IF ! D_M3_TH2_W2TH_O_DDTDZ(:,:,IKB-1)=D_M3_TH2_W2TH_O_DDTDZ(:,:,IKB) @@ -1206,7 +1231,8 @@ D_M3_TH2_W2TH_O_DDTDZ(:,:,IKE+1)=D_M3_TH2_W2TH_O_DDTDZ(:,:,IKE) IF (LHOOK) CALL DR_HOOK('MODE_PRANDTL:D_M3_TH2_W2TH_O_DDTDZ',1,ZHOOK_HANDLE) END FUNCTION D_M3_TH2_W2TH_O_DDTDZ !---------------------------------------------------------------------------- -FUNCTION M3_TH2_WTH2(KKA,KKU,KKL,PREDTH1,PREDR1,PD,PLEPS,PSQRT_TKE) +FUNCTION M3_TH2_WTH2(CSTURB,KKA,KKU,KKL,PREDTH1,PREDR1,PD,PLEPS,PSQRT_TKE) + TYPE(CSTURB_t), INTENT(IN) :: CSTURB INTEGER, INTENT(IN) :: KKA INTEGER, INTENT(IN) :: KKU INTEGER, INTENT(IN) :: KKL @@ -1223,7 +1249,7 @@ IF (LHOOK) CALL DR_HOOK('MODE_PRANDTL:M3_TH2_WTH2',0,ZHOOK_HANDLE) IKB = 1+JPVEXT_TURB IKE = SIZE(PD,3)-JPVEXT_TURB -M3_TH2_WTH2(:,:,:) = PLEPS*0.5/XCTD/PSQRT_TKE & +M3_TH2_WTH2(:,:,:) = PLEPS*0.5/CSTURB%XCTD/PSQRT_TKE & * MZF((1.+0.5*PREDTH1+1.5*PREDR1+0.5*PREDR1**2)/PD, KKA, KKU, KKL) ! M3_TH2_WTH2(:,:,IKB-1)=M3_TH2_WTH2(:,:,IKB) @@ -1232,7 +1258,8 @@ M3_TH2_WTH2(:,:,IKE+1)=M3_TH2_WTH2(:,:,IKE) IF (LHOOK) CALL DR_HOOK('MODE_PRANDTL:M3_TH2_WTH2',1,ZHOOK_HANDLE) END FUNCTION M3_TH2_WTH2 !---------------------------------------------------------------------------- -FUNCTION D_M3_TH2_WTH2_O_DDTDZ(KKA,KKU,KKL,PREDTH1,PREDR1,PD,PLEPS,PSQRT_TKE,PBLL_O_E,PETHETA) +FUNCTION D_M3_TH2_WTH2_O_DDTDZ(CSTURB,KKA,KKU,KKL,PREDTH1,PREDR1,PD,PLEPS,PSQRT_TKE,PBLL_O_E,PETHETA) + TYPE(CSTURB_t), INTENT(IN) :: CSTURB INTEGER, INTENT(IN) :: KKA INTEGER, INTENT(IN) :: KKU INTEGER, INTENT(IN) :: KKL @@ -1251,7 +1278,7 @@ IF (LHOOK) CALL DR_HOOK('MODE_PRANDTL:D_M3_TH2_WTH2_O_DDTDZ',0,ZHOOK_HANDLE) IKB = 1+JPVEXT_TURB IKE = SIZE(PD,3)-JPVEXT_TURB -D_M3_TH2_WTH2_O_DDTDZ(:,:,:) = PLEPS*0.5/XCTD/PSQRT_TKE*XCTV & +D_M3_TH2_WTH2_O_DDTDZ(:,:,:) = PLEPS*0.5/CSTURB%XCTD/PSQRT_TKE*CSTURB%XCTV & * MZF(PBLL_O_E*PETHETA* (0.5/PD & - (1.5+PREDTH1+PREDR1)*(1.+0.5*PREDTH1+1.5*PREDR1+0.5*PREDR1**2)/PD**2 & ), KKA, KKU, KKL) @@ -1262,7 +1289,8 @@ D_M3_TH2_WTH2_O_DDTDZ(:,:,IKE+1)=D_M3_TH2_WTH2_O_DDTDZ(:,:,IKE) IF (LHOOK) CALL DR_HOOK('MODE_PRANDTL:D_M3_TH2_WTH2_O_DDTDZ',1,ZHOOK_HANDLE) END FUNCTION D_M3_TH2_WTH2_O_DDTDZ !---------------------------------------------------------------------------- -FUNCTION M3_TH2_W2R(KKA,KKU,KKL,PD,PLM,PLEPS,PTKE,PBLL_O_E,PEMOIST,PDTDZ) +FUNCTION M3_TH2_W2R(CSTURB,KKA,KKU,KKL,PD,PLM,PLEPS,PTKE,PBLL_O_E,PEMOIST,PDTDZ) + TYPE(CSTURB_t), INTENT(IN) :: CSTURB INTEGER, INTENT(IN) :: KKA INTEGER, INTENT(IN) :: KKU INTEGER, INTENT(IN) :: KKL @@ -1281,7 +1309,7 @@ IF (LHOOK) CALL DR_HOOK('MODE_PRANDTL:M3_TH2_W2R',0,ZHOOK_HANDLE) IKB = 1+JPVEXT_TURB IKE = SIZE(PD,3)-JPVEXT_TURB -M3_TH2_W2R(:,:,:) = 0.75*XCTV**2*MZF(PBLL_O_E*PEMOIST/PD*PDTDZ**2, KKA, KKU, KKL)*PLM*PLEPS/PTKE +M3_TH2_W2R(:,:,:) = 0.75*CSTURB%XCTV**2*MZF(PBLL_O_E*PEMOIST/PD*PDTDZ**2, KKA, KKU, KKL)*PLM*PLEPS/PTKE ! M3_TH2_W2R(:,:,IKB-1)=M3_TH2_W2R(:,:,IKB) M3_TH2_W2R(:,:,IKE+1)=M3_TH2_W2R(:,:,IKE) @@ -1289,7 +1317,8 @@ M3_TH2_W2R(:,:,IKE+1)=M3_TH2_W2R(:,:,IKE) IF (LHOOK) CALL DR_HOOK('MODE_PRANDTL:M3_TH2_W2R',1,ZHOOK_HANDLE) END FUNCTION M3_TH2_W2R !---------------------------------------------------------------------------- -FUNCTION D_M3_TH2_W2R_O_DDTDZ(KKA,KKU,KKL,PREDTH1,PREDR1,PD,PLM,PLEPS,PTKE,PBLL_O_E,PEMOIST,PDTDZ) +FUNCTION D_M3_TH2_W2R_O_DDTDZ(CSTURB,KKA,KKU,KKL,PREDTH1,PREDR1,PD,PLM,PLEPS,PTKE,PBLL_O_E,PEMOIST,PDTDZ) + TYPE(CSTURB_t), INTENT(IN) :: CSTURB INTEGER, INTENT(IN) :: KKA INTEGER, INTENT(IN) :: KKU INTEGER, INTENT(IN) :: KKL @@ -1310,7 +1339,7 @@ IF (LHOOK) CALL DR_HOOK('MODE_PRANDTL:D_M3_TH2_W2R_O_DDTDZ',0,ZHOOK_HANDLE) IKB = 1+JPVEXT_TURB IKE = SIZE(PD,3)-JPVEXT_TURB -D_M3_TH2_W2R_O_DDTDZ(:,:,:) = 0.75*XCTV**2*PLM*PLEPS/PTKE & +D_M3_TH2_W2R_O_DDTDZ(:,:,:) = 0.75*CSTURB%XCTV**2*PLM*PLEPS/PTKE & * MZF(PBLL_O_E*PEMOIST/PD*PDTDZ*(2.-PREDTH1*(1.5+PREDTH1+PREDR1)/PD), KKA, KKU, KKL) ! D_M3_TH2_W2R_O_DDTDZ(:,:,IKB-1)=D_M3_TH2_W2R_O_DDTDZ(:,:,IKB) @@ -1319,7 +1348,8 @@ D_M3_TH2_W2R_O_DDTDZ(:,:,IKE+1)=D_M3_TH2_W2R_O_DDTDZ(:,:,IKE) IF (LHOOK) CALL DR_HOOK('MODE_PRANDTL:D_M3_TH2_W2R_O_DDTDZ',1,ZHOOK_HANDLE) END FUNCTION D_M3_TH2_W2R_O_DDTDZ !---------------------------------------------------------------------------- -FUNCTION M3_TH2_WR2(KKA,KKU,KKL,PD,PLEPS,PSQRT_TKE,PBLL_O_E,PEMOIST,PDTDZ) +FUNCTION M3_TH2_WR2(CSTURB,KKA,KKU,KKL,PD,PLEPS,PSQRT_TKE,PBLL_O_E,PEMOIST,PDTDZ) + TYPE(CSTURB_t), INTENT(IN) :: CSTURB INTEGER, INTENT(IN) :: KKA INTEGER, INTENT(IN) :: KKU INTEGER, INTENT(IN) :: KKL @@ -1337,7 +1367,7 @@ IF (LHOOK) CALL DR_HOOK('MODE_PRANDTL:M3_TH2_WR2',0,ZHOOK_HANDLE) IKB = 1+JPVEXT_TURB IKE = SIZE(PD,3)-JPVEXT_TURB -M3_TH2_WR2(:,:,:) = 0.25*XCTV**2*MZF((PBLL_O_E*PEMOIST*PDTDZ)**2/PD, KKA, KKU, KKL)*PLEPS/PSQRT_TKE/XCTD +M3_TH2_WR2(:,:,:) = 0.25*CSTURB%XCTV**2*MZF((PBLL_O_E*PEMOIST*PDTDZ)**2/PD, KKA, KKU, KKL)*PLEPS/PSQRT_TKE/CSTURB%XCTD ! M3_TH2_WR2(:,:,IKB-1)=M3_TH2_WR2(:,:,IKB) M3_TH2_WR2(:,:,IKE+1)=M3_TH2_WR2(:,:,IKE) @@ -1345,7 +1375,8 @@ M3_TH2_WR2(:,:,IKE+1)=M3_TH2_WR2(:,:,IKE) IF (LHOOK) CALL DR_HOOK('MODE_PRANDTL:M3_TH2_WR2',1,ZHOOK_HANDLE) END FUNCTION M3_TH2_WR2 !---------------------------------------------------------------------------- -FUNCTION D_M3_TH2_WR2_O_DDTDZ(KKA,KKU,KKL,PREDTH1,PREDR1,PD,PLEPS,PSQRT_TKE,PBLL_O_E,PEMOIST,PDTDZ) +FUNCTION D_M3_TH2_WR2_O_DDTDZ(CSTURB,KKA,KKU,KKL,PREDTH1,PREDR1,PD,PLEPS,PSQRT_TKE,PBLL_O_E,PEMOIST,PDTDZ) + TYPE(CSTURB_t), INTENT(IN) :: CSTURB INTEGER, INTENT(IN) :: KKA INTEGER, INTENT(IN) :: KKU INTEGER, INTENT(IN) :: KKL @@ -1365,7 +1396,7 @@ IF (LHOOK) CALL DR_HOOK('MODE_PRANDTL:D_M3_TH2_WR2_O_DDTDZ',0,ZHOOK_HANDLE) IKB = 1+JPVEXT_TURB IKE = SIZE(PD,3)-JPVEXT_TURB -D_M3_TH2_WR2_O_DDTDZ(:,:,:) = 0.25*XCTV**2*PLEPS/PSQRT_TKE/XCTD & +D_M3_TH2_WR2_O_DDTDZ(:,:,:) = 0.25*CSTURB%XCTV**2*PLEPS/PSQRT_TKE/CSTURB%XCTD & * MZF((PBLL_O_E*PEMOIST)**2*PDTDZ/PD*(2.-PREDTH1*(1.5+PREDTH1+PREDR1)/PD), KKA, KKU, KKL) ! D_M3_TH2_WR2_O_DDTDZ(:,:,IKB-1)=D_M3_TH2_WR2_O_DDTDZ(:,:,IKB) @@ -1374,7 +1405,8 @@ D_M3_TH2_WR2_O_DDTDZ(:,:,IKE+1)=D_M3_TH2_WR2_O_DDTDZ(:,:,IKE) IF (LHOOK) CALL DR_HOOK('MODE_PRANDTL:D_M3_TH2_WR2_O_DDTDZ',1,ZHOOK_HANDLE) END FUNCTION D_M3_TH2_WR2_O_DDTDZ !---------------------------------------------------------------------------- -FUNCTION M3_TH2_WTHR(KKA,KKU,KKL,PREDR1,PD,PLEPS,PSQRT_TKE,PBLL_O_E,PEMOIST,PDTDZ) +FUNCTION M3_TH2_WTHR(CSTURB,KKA,KKU,KKL,PREDR1,PD,PLEPS,PSQRT_TKE,PBLL_O_E,PEMOIST,PDTDZ) + TYPE(CSTURB_t), INTENT(IN) :: CSTURB INTEGER, INTENT(IN) :: KKA INTEGER, INTENT(IN) :: KKU INTEGER, INTENT(IN) :: KKL @@ -1393,7 +1425,7 @@ IF (LHOOK) CALL DR_HOOK('MODE_PRANDTL:M3_TH2_WTHR',0,ZHOOK_HANDLE) IKB = 1+JPVEXT_TURB IKE = SIZE(PD,3)-JPVEXT_TURB -M3_TH2_WTHR(:,:,:) = - 0.5*XCTV*PLEPS/PSQRT_TKE/XCTD & +M3_TH2_WTHR(:,:,:) = - 0.5*CSTURB%XCTV*PLEPS/PSQRT_TKE/CSTURB%XCTD & * MZF(PBLL_O_E*PEMOIST*PDTDZ*(1.+PREDR1)/PD, KKA, KKU, KKL) ! M3_TH2_WTHR(:,:,IKB-1)=M3_TH2_WTHR(:,:,IKB) @@ -1402,7 +1434,8 @@ M3_TH2_WTHR(:,:,IKE+1)=M3_TH2_WTHR(:,:,IKE) IF (LHOOK) CALL DR_HOOK('MODE_PRANDTL:M3_TH2_WTHR',1,ZHOOK_HANDLE) END FUNCTION M3_TH2_WTHR !---------------------------------------------------------------------------- -FUNCTION D_M3_TH2_WTHR_O_DDTDZ(KKA,KKU,KKL,PREDTH1,PREDR1,PD,PLEPS,PSQRT_TKE,PBLL_O_E,PEMOIST,PDTDZ) +FUNCTION D_M3_TH2_WTHR_O_DDTDZ(CSTURB,KKA,KKU,KKL,PREDTH1,PREDR1,PD,PLEPS,PSQRT_TKE,PBLL_O_E,PEMOIST,PDTDZ) + TYPE(CSTURB_t), INTENT(IN) :: CSTURB INTEGER, INTENT(IN) :: KKA INTEGER, INTENT(IN) :: KKU INTEGER, INTENT(IN) :: KKL @@ -1422,7 +1455,7 @@ IF (LHOOK) CALL DR_HOOK('MODE_PRANDTL:D_M3_TH2_WTHR_O_DDTDZ',0,ZHOOK_HANDLE) IKB = 1+JPVEXT_TURB IKE = SIZE(PD,3)-JPVEXT_TURB -D_M3_TH2_WTHR_O_DDTDZ(:,:,:) = - 0.5*XCTV*PLEPS/PSQRT_TKE/XCTD & +D_M3_TH2_WTHR_O_DDTDZ(:,:,:) = - 0.5*CSTURB%XCTV*PLEPS/PSQRT_TKE/CSTURB%XCTD & * MZF(PBLL_O_E*PEMOIST*(1.+PREDR1)/PD * (1. -PREDTH1*(1.5+PREDTH1+PREDR1)/PD), KKA, KKU, KKL) ! D_M3_TH2_WTHR_O_DDTDZ(:,:,IKB-1)=D_M3_TH2_WTHR_O_DDTDZ(:,:,IKB) @@ -1431,7 +1464,8 @@ D_M3_TH2_WTHR_O_DDTDZ(:,:,IKE+1)=D_M3_TH2_WTHR_O_DDTDZ(:,:,IKE) IF (LHOOK) CALL DR_HOOK('MODE_PRANDTL:D_M3_TH2_WTHR_O_DDTDZ',1,ZHOOK_HANDLE) END FUNCTION D_M3_TH2_WTHR_O_DDTDZ !---------------------------------------------------------------------------- -FUNCTION M3_THR_WTHR(KKA,KKU,KKL,PREDTH1,PREDR1,PD,PLEPS,PSQRT_TKE) +FUNCTION M3_THR_WTHR(CSTURB,KKA,KKU,KKL,PREDTH1,PREDR1,PD,PLEPS,PSQRT_TKE) + TYPE(CSTURB_t), INTENT(IN) :: CSTURB INTEGER, INTENT(IN) :: KKA INTEGER, INTENT(IN) :: KKU INTEGER, INTENT(IN) :: KKL @@ -1448,7 +1482,7 @@ IF (LHOOK) CALL DR_HOOK('MODE_PRANDTL:M3_THR_WTHR',0,ZHOOK_HANDLE) IKB = 1+JPVEXT_TURB IKE = SIZE(PD,3)-JPVEXT_TURB -M3_THR_WTHR(:,:,:) = 0.5*PLEPS/PSQRT_TKE/XCTD & +M3_THR_WTHR(:,:,:) = 0.5*PLEPS/PSQRT_TKE/CSTURB%XCTD & * MZF((1.+PREDTH1)*(1.+PREDR1)/PD, KKA, KKU, KKL) ! M3_THR_WTHR(:,:,IKB-1)=M3_THR_WTHR(:,:,IKB) @@ -1457,7 +1491,8 @@ M3_THR_WTHR(:,:,IKE+1)=M3_THR_WTHR(:,:,IKE) IF (LHOOK) CALL DR_HOOK('MODE_PRANDTL:M3_THR_WTHR',1,ZHOOK_HANDLE) END FUNCTION M3_THR_WTHR !---------------------------------------------------------------------------- -FUNCTION D_M3_THR_WTHR_O_DDTDZ(KKA,KKU,KKL,PREDTH1,PREDR1,PD,PLEPS,PSQRT_TKE,PBLL_O_E,PETHETA) +FUNCTION D_M3_THR_WTHR_O_DDTDZ(CSTURB,KKA,KKU,KKL,PREDTH1,PREDR1,PD,PLEPS,PSQRT_TKE,PBLL_O_E,PETHETA) + TYPE(CSTURB_t), INTENT(IN) :: CSTURB INTEGER, INTENT(IN) :: KKA INTEGER, INTENT(IN) :: KKU INTEGER, INTENT(IN) :: KKL @@ -1476,7 +1511,7 @@ IF (LHOOK) CALL DR_HOOK('MODE_PRANDTL:D_M3_THR_WTHR_O_DDTDZ',0,ZHOOK_HANDLE) IKB = 1+JPVEXT_TURB IKE = SIZE(PD,3)-JPVEXT_TURB -D_M3_THR_WTHR_O_DDTDZ(:,:,:) = 0.5*PLEPS/PSQRT_TKE/XCTD * XCTV & +D_M3_THR_WTHR_O_DDTDZ(:,:,:) = 0.5*PLEPS/PSQRT_TKE/CSTURB%XCTD * CSTURB%XCTV & * MZF(PETHETA*PBLL_O_E/PD*(1.+PREDR1)*(1.-(1.+PREDTH1)*(1.5+PREDTH1+PREDR1)/PD), KKA, KKU, KKL) ! D_M3_THR_WTHR_O_DDTDZ(:,:,IKB-1)=D_M3_THR_WTHR_O_DDTDZ(:,:,IKB) @@ -1485,7 +1520,8 @@ D_M3_THR_WTHR_O_DDTDZ(:,:,IKE+1)=D_M3_THR_WTHR_O_DDTDZ(:,:,IKE) IF (LHOOK) CALL DR_HOOK('MODE_PRANDTL:D_M3_THR_WTHR_O_DDTDZ',1,ZHOOK_HANDLE) END FUNCTION D_M3_THR_WTHR_O_DDTDZ !---------------------------------------------------------------------------- -FUNCTION M3_THR_WTH2(KKA,KKU,KKL,PREDR1,PD,PLEPS,PSQRT_TKE,PBLL_O_E,PETHETA,PDRDZ) +FUNCTION M3_THR_WTH2(CSTURB,KKA,KKU,KKL,PREDR1,PD,PLEPS,PSQRT_TKE,PBLL_O_E,PETHETA,PDRDZ) + TYPE(CSTURB_t), INTENT(IN) :: CSTURB INTEGER, INTENT(IN) :: KKA INTEGER, INTENT(IN) :: KKU INTEGER, INTENT(IN) :: KKL @@ -1504,7 +1540,7 @@ IF (LHOOK) CALL DR_HOOK('MODE_PRANDTL:M3_THR_WTH2',0,ZHOOK_HANDLE) IKB = 1+JPVEXT_TURB IKE = SIZE(PD,3)-JPVEXT_TURB -M3_THR_WTH2(:,:,:) = - 0.25*PLEPS/PSQRT_TKE/XCTD*XCTV & +M3_THR_WTH2(:,:,:) = - 0.25*PLEPS/PSQRT_TKE/CSTURB%XCTD*CSTURB%XCTV & * MZF((1.+PREDR1)*PBLL_O_E*PETHETA*PDRDZ/PD, KKA, KKU, KKL) ! M3_THR_WTH2(:,:,IKB-1)=M3_THR_WTH2(:,:,IKB) @@ -1513,7 +1549,8 @@ M3_THR_WTH2(:,:,IKE+1)=M3_THR_WTH2(:,:,IKE) IF (LHOOK) CALL DR_HOOK('MODE_PRANDTL:M3_THR_WTH2',1,ZHOOK_HANDLE) END FUNCTION M3_THR_WTH2 !---------------------------------------------------------------------------- -FUNCTION D_M3_THR_WTH2_O_DDTDZ(KKA,KKU,KKL,PREDTH1,PREDR1,PD,PLEPS,PSQRT_TKE,PBLL_O_E,PETHETA,PDRDZ) +FUNCTION D_M3_THR_WTH2_O_DDTDZ(CSTURB,KKA,KKU,KKL,PREDTH1,PREDR1,PD,PLEPS,PSQRT_TKE,PBLL_O_E,PETHETA,PDRDZ) + TYPE(CSTURB_t), INTENT(IN) :: CSTURB INTEGER, INTENT(IN) :: KKA INTEGER, INTENT(IN) :: KKU INTEGER, INTENT(IN) :: KKL @@ -1533,7 +1570,7 @@ IF (LHOOK) CALL DR_HOOK('MODE_PRANDTL:D_M3_THR_WTH2_O_DDTDZ',0,ZHOOK_HANDLE) IKB = 1+JPVEXT_TURB IKE = SIZE(PD,3)-JPVEXT_TURB -D_M3_THR_WTH2_O_DDTDZ(:,:,:) = - 0.25*PLEPS/PSQRT_TKE/XCTD*XCTV**2 & +D_M3_THR_WTH2_O_DDTDZ(:,:,:) = - 0.25*PLEPS/PSQRT_TKE/CSTURB%XCTD*CSTURB%XCTV**2 & * MZF(-(1.+PREDR1)*(PBLL_O_E*PETHETA/PD)**2*PDRDZ*(1.5+PREDTH1+PREDR1), KKA, KKU, KKL) ! D_M3_THR_WTH2_O_DDTDZ(:,:,IKB-1)=D_M3_THR_WTH2_O_DDTDZ(:,:,IKB) @@ -1542,7 +1579,8 @@ D_M3_THR_WTH2_O_DDTDZ(:,:,IKE+1)=D_M3_THR_WTH2_O_DDTDZ(:,:,IKE) IF (LHOOK) CALL DR_HOOK('MODE_PRANDTL:D_M3_THR_WTH2_O_DDTDZ',1,ZHOOK_HANDLE) END FUNCTION D_M3_THR_WTH2_O_DDTDZ !---------------------------------------------------------------------------- -FUNCTION D_M3_THR_WTH2_O_DDRDZ(KKA,KKU,KKL,PREDTH1,PREDR1,PD,PLEPS,PSQRT_TKE,PBLL_O_E,PETHETA) +FUNCTION D_M3_THR_WTH2_O_DDRDZ(CSTURB,KKA,KKU,KKL,PREDTH1,PREDR1,PD,PLEPS,PSQRT_TKE,PBLL_O_E,PETHETA) + TYPE(CSTURB_t), INTENT(IN) :: CSTURB INTEGER, INTENT(IN) :: KKA INTEGER, INTENT(IN) :: KKU INTEGER, INTENT(IN) :: KKL @@ -1561,7 +1599,7 @@ IF (LHOOK) CALL DR_HOOK('MODE_PRANDTL:D_M3_THR_WTH2_O_DDRDZ',0,ZHOOK_HANDLE) IKB = 1+JPVEXT_TURB IKE = SIZE(PD,3)-JPVEXT_TURB -D_M3_THR_WTH2_O_DDRDZ(:,:,:) = - 0.25*PLEPS/PSQRT_TKE/XCTD*XCTV & +D_M3_THR_WTH2_O_DDRDZ(:,:,:) = - 0.25*PLEPS/PSQRT_TKE/CSTURB%XCTD*CSTURB%XCTV & * MZF(PBLL_O_E*PETHETA/PD & *(-(1.+PREDR1)*PREDR1/PD*(1.5+PREDTH1+PREDR1)+(1.+2.*PREDR1)), & KKA, KKU, KKL) @@ -1572,7 +1610,8 @@ D_M3_THR_WTH2_O_DDRDZ(:,:,IKE+1)=D_M3_THR_WTH2_O_DDRDZ(:,:,IKE) IF (LHOOK) CALL DR_HOOK('MODE_PRANDTL:D_M3_THR_WTH2_O_DDRDZ',1,ZHOOK_HANDLE) END FUNCTION D_M3_THR_WTH2_O_DDRDZ !---------------------------------------------------------------------------- -FUNCTION M3_THR_W2TH(KKA,KKU,KKL,PREDR1,PD,PLM,PLEPS,PTKE,PDRDZ) +FUNCTION M3_THR_W2TH(CSTURB,KKA,KKU,KKL,PREDR1,PD,PLM,PLEPS,PTKE,PDRDZ) + TYPE(CSTURB_t), INTENT(IN) :: CSTURB INTEGER, INTENT(IN) :: KKA INTEGER, INTENT(IN) :: KKU INTEGER, INTENT(IN) :: KKL @@ -1590,7 +1629,7 @@ IF (LHOOK) CALL DR_HOOK('MODE_PRANDTL:M3_THR_W2TH',0,ZHOOK_HANDLE) IKB = 1+JPVEXT_TURB IKE = SIZE(PD,3)-JPVEXT_TURB -M3_THR_W2TH(:,:,:) = - 0.75*PLM*PLEPS/PTKE * XCTV & +M3_THR_W2TH(:,:,:) = - 0.75*PLM*PLEPS/PTKE * CSTURB%XCTV & * MZF((1.+PREDR1)*PDRDZ/PD, KKA, KKU, KKL) ! M3_THR_W2TH(:,:,IKB-1)=M3_THR_W2TH(:,:,IKB) @@ -1599,7 +1638,8 @@ M3_THR_W2TH(:,:,IKE+1)=M3_THR_W2TH(:,:,IKE) IF (LHOOK) CALL DR_HOOK('MODE_PRANDTL:M3_THR_W2TH',1,ZHOOK_HANDLE) END FUNCTION M3_THR_W2TH !---------------------------------------------------------------------------- -FUNCTION D_M3_THR_W2TH_O_DDTDZ(KKA,KKU,KKL,PREDTH1,PREDR1,PD,PLM,PLEPS,PTKE,PBLL_O_E,PDRDZ,PETHETA) +FUNCTION D_M3_THR_W2TH_O_DDTDZ(CSTURB,KKA,KKU,KKL,PREDTH1,PREDR1,PD,PLM,PLEPS,PTKE,PBLL_O_E,PDRDZ,PETHETA) + TYPE(CSTURB_t), INTENT(IN) :: CSTURB INTEGER, INTENT(IN) :: KKA INTEGER, INTENT(IN) :: KKU INTEGER, INTENT(IN) :: KKL @@ -1620,7 +1660,7 @@ IF (LHOOK) CALL DR_HOOK('MODE_PRANDTL:D_M3_THR_W2TH_O_DDTDZ',0,ZHOOK_HANDLE) IKB = 1+JPVEXT_TURB IKE = SIZE(PD,3)-JPVEXT_TURB -D_M3_THR_W2TH_O_DDTDZ(:,:,:) = - 0.75*PLM*PLEPS/PTKE * XCTV**2 & +D_M3_THR_W2TH_O_DDTDZ(:,:,:) = - 0.75*PLM*PLEPS/PTKE * CSTURB%XCTV**2 & * MZF(-PETHETA*PBLL_O_E*(1.+PREDR1)*PDRDZ*(1.5+PREDTH1+PREDR1)/PD**2, KKA, KKU, KKL) ! @@ -1630,7 +1670,8 @@ D_M3_THR_W2TH_O_DDTDZ(:,:,IKE+1)=D_M3_THR_W2TH_O_DDTDZ(:,:,IKE) IF (LHOOK) CALL DR_HOOK('MODE_PRANDTL:D_M3_THR_W2TH_O_DDTDZ',1,ZHOOK_HANDLE) END FUNCTION D_M3_THR_W2TH_O_DDTDZ !---------------------------------------------------------------------------- -FUNCTION D_M3_THR_W2TH_O_DDRDZ(KKA,KKU,KKL,PREDTH1,PREDR1,PD,PLM,PLEPS,PTKE) +FUNCTION D_M3_THR_W2TH_O_DDRDZ(CSTURB,KKA,KKU,KKL,PREDTH1,PREDR1,PD,PLM,PLEPS,PTKE) + TYPE(CSTURB_t), INTENT(IN) :: CSTURB INTEGER, INTENT(IN) :: KKA INTEGER, INTENT(IN) :: KKU INTEGER, INTENT(IN) :: KKL @@ -1648,7 +1689,7 @@ IF (LHOOK) CALL DR_HOOK('MODE_PRANDTL:D_M3_THR_W2TH_O_DDRDZ',0,ZHOOK_HANDLE) IKB = 1+JPVEXT_TURB IKE = SIZE(PD,3)-JPVEXT_TURB -D_M3_THR_W2TH_O_DDRDZ(:,:,:) = - 0.75*PLM*PLEPS/PTKE * XCTV & +D_M3_THR_W2TH_O_DDRDZ(:,:,:) = - 0.75*PLM*PLEPS/PTKE * CSTURB%XCTV & * MZF(-(1.+PREDR1)*PREDR1*(1.5+PREDTH1+PREDR1)/PD**2 & +(1.+2.*PREDR1)/PD, & KKA, KKU, KKL) @@ -1663,7 +1704,8 @@ END FUNCTION D_M3_THR_W2TH_O_DDRDZ !---------------------------------------------------------------------------- !---------------------------------------------------------------------------- ! -FUNCTION PSI3(PREDR1,PREDTH1,PRED2R3,PRED2TH3,PRED2THR3,HTURBDIM,OUSERV) +FUNCTION PSI3(CSTURB,PREDR1,PREDTH1,PRED2R3,PRED2TH3,PRED2THR3,HTURBDIM,OUSERV) + TYPE(CSTURB_t), INTENT(IN) :: CSTURB REAL, DIMENSION(:,:,:), INTENT(IN) :: PREDTH1 REAL, DIMENSION(:,:,:), INTENT(IN) :: PREDR1 REAL, DIMENSION(:,:,:), INTENT(IN) :: PRED2TH3 @@ -1675,12 +1717,13 @@ FUNCTION PSI3(PREDR1,PREDTH1,PRED2R3,PRED2TH3,PRED2THR3,HTURBDIM,OUSERV) ! REAL(KIND=JPRB) :: ZHOOK_HANDLE IF (LHOOK) CALL DR_HOOK('MODE_PRANDTL:PSI3',0,ZHOOK_HANDLE) -PSI3 = PHI3(PREDR1,PREDTH1,PRED2R3,PRED2TH3,PRED2THR3,HTURBDIM,OUSERV) +PSI3 = PHI3(CSTURB,PREDR1,PREDTH1,PRED2R3,PRED2TH3,PRED2THR3,HTURBDIM,OUSERV) ! IF (LHOOK) CALL DR_HOOK('MODE_PRANDTL:PSI3',1,ZHOOK_HANDLE) END FUNCTION PSI3 !---------------------------------------------------------------------------- -FUNCTION D_PSI3DRDZ_O_DDRDZ(PPSI3,PREDR1,PREDTH1,PRED2R3,PRED2THR3,HTURBDIM,OUSERV) +FUNCTION D_PSI3DRDZ_O_DDRDZ(CSTURB,PPSI3,PREDR1,PREDTH1,PRED2R3,PRED2THR3,HTURBDIM,OUSERV) + TYPE(CSTURB_t), INTENT(IN) :: CSTURB REAL, DIMENSION(:,:,:), INTENT(IN) :: PPSI3 REAL, DIMENSION(:,:,:), INTENT(IN) :: PREDTH1 REAL, DIMENSION(:,:,:), INTENT(IN) :: PREDR1 @@ -1692,14 +1735,15 @@ FUNCTION D_PSI3DRDZ_O_DDRDZ(PPSI3,PREDR1,PREDTH1,PRED2R3,PRED2THR3,HTURBDIM,OUSE REAL(KIND=JPRB) :: ZHOOK_HANDLE IF (LHOOK) CALL DR_HOOK('MODE_PRANDTL:D_PSI3DRDZ_O_DDRDZ',0,ZHOOK_HANDLE) -D_PSI3DRDZ_O_DDRDZ = D_PHI3DTDZ_O_DDTDZ(PPSI3,PREDR1,PREDTH1,PRED2R3,PRED2THR3,HTURBDIM,OUSERV) +D_PSI3DRDZ_O_DDRDZ = D_PHI3DTDZ_O_DDTDZ(CSTURB,PPSI3,PREDR1,PREDTH1,PRED2R3,PRED2THR3,HTURBDIM,OUSERV) ! !C'est ok?! ! IF (LHOOK) CALL DR_HOOK('MODE_PRANDTL:D_PSI3DRDZ_O_DDRDZ',1,ZHOOK_HANDLE) END FUNCTION D_PSI3DRDZ_O_DDRDZ !---------------------------------------------------------------------------- -FUNCTION D_PSI3DTDZ_O_DDTDZ(PPSI3,PREDR1,PREDTH1,PRED2R3,PRED2THR3,HTURBDIM,OUSERV) +FUNCTION D_PSI3DTDZ_O_DDTDZ(CSTURB,PPSI3,PREDR1,PREDTH1,PRED2R3,PRED2THR3,HTURBDIM,OUSERV) + TYPE(CSTURB_t), INTENT(IN) :: CSTURB REAL, DIMENSION(:,:,:), INTENT(IN) :: PPSI3 REAL, DIMENSION(:,:,:), INTENT(IN) :: PREDTH1 REAL, DIMENSION(:,:,:), INTENT(IN) :: PREDR1 @@ -1711,12 +1755,13 @@ FUNCTION D_PSI3DTDZ_O_DDTDZ(PPSI3,PREDR1,PREDTH1,PRED2R3,PRED2THR3,HTURBDIM,OUSE ! REAL(KIND=JPRB) :: ZHOOK_HANDLE IF (LHOOK) CALL DR_HOOK('MODE_PRANDTL:D_PSI3DTDZ_O_DDTDZ',0,ZHOOK_HANDLE) -D_PSI3DTDZ_O_DDTDZ = D_PHI3DRDZ_O_DDRDZ(PPSI3,PREDR1,PREDTH1,PRED2R3,PRED2THR3,HTURBDIM,OUSERV) +D_PSI3DTDZ_O_DDTDZ = D_PHI3DRDZ_O_DDRDZ(CSTURB,PPSI3,PREDR1,PREDTH1,PRED2R3,PRED2THR3,HTURBDIM,OUSERV) ! IF (LHOOK) CALL DR_HOOK('MODE_PRANDTL:D_PSI3DTDZ_O_DDTDZ',1,ZHOOK_HANDLE) END FUNCTION D_PSI3DTDZ_O_DDTDZ !---------------------------------------------------------------------------- -FUNCTION D_PSI3DRDZ2_O_DDRDZ(PPSI3,PREDR1,PREDTH1,PRED2R3,PRED2THR3,PDRDZ,HTURBDIM,OUSERV) +FUNCTION D_PSI3DRDZ2_O_DDRDZ(CSTURB,PPSI3,PREDR1,PREDTH1,PRED2R3,PRED2THR3,PDRDZ,HTURBDIM,OUSERV) + TYPE(CSTURB_t), INTENT(IN) :: CSTURB REAL, DIMENSION(:,:,:), INTENT(IN) :: PPSI3 REAL, DIMENSION(:,:,:), INTENT(IN) :: PREDR1 REAL, DIMENSION(:,:,:), INTENT(IN) :: PREDTH1 @@ -1729,12 +1774,13 @@ FUNCTION D_PSI3DRDZ2_O_DDRDZ(PPSI3,PREDR1,PREDTH1,PRED2R3,PRED2THR3,PDRDZ,HTURBD ! REAL(KIND=JPRB) :: ZHOOK_HANDLE IF (LHOOK) CALL DR_HOOK('MODE_PRANDTL:D_PSI3DRDZ2_O_DDRDZ',0,ZHOOK_HANDLE) -D_PSI3DRDZ2_O_DDRDZ = D_PHI3DTDZ2_O_DDTDZ(PPSI3,PREDR1,PREDTH1,PRED2R3,PRED2THR3,PDRDZ,HTURBDIM,OUSERV) +D_PSI3DRDZ2_O_DDRDZ = D_PHI3DTDZ2_O_DDTDZ(CSTURB,PPSI3,PREDR1,PREDTH1,PRED2R3,PRED2THR3,PDRDZ,HTURBDIM,OUSERV) ! IF (LHOOK) CALL DR_HOOK('MODE_PRANDTL:D_PSI3DRDZ2_O_DDRDZ',1,ZHOOK_HANDLE) END FUNCTION D_PSI3DRDZ2_O_DDRDZ !---------------------------------------------------------------------------- -FUNCTION M3_WR_WR2(PREDR1,PREDTH1,PD,PBLL_O_E,PEMOIST) +FUNCTION M3_WR_WR2(CSTURB,PREDR1,PREDTH1,PD,PBLL_O_E,PEMOIST) + TYPE(CSTURB_t), INTENT(IN) :: CSTURB REAL, DIMENSION(:,:,:), INTENT(IN) :: PREDR1 REAL, DIMENSION(:,:,:), INTENT(IN) :: PREDTH1 REAL, DIMENSION(:,:,:), INTENT(IN) :: PD @@ -1744,12 +1790,13 @@ FUNCTION M3_WR_WR2(PREDR1,PREDTH1,PD,PBLL_O_E,PEMOIST) ! REAL(KIND=JPRB) :: ZHOOK_HANDLE IF (LHOOK) CALL DR_HOOK('MODE_PRANDTL:M3_WR_WR2',0,ZHOOK_HANDLE) -M3_WR_WR2 = M3_WTH_WTH2(PREDR1,PREDTH1,PD,PBLL_O_E,PEMOIST) +M3_WR_WR2 = M3_WTH_WTH2(CSTURB,PREDR1,PREDTH1,PD,PBLL_O_E,PEMOIST) ! IF (LHOOK) CALL DR_HOOK('MODE_PRANDTL:M3_WR_WR2',1,ZHOOK_HANDLE) END FUNCTION M3_WR_WR2 !---------------------------------------------------------------------------- -FUNCTION D_M3_WR_WR2_O_DDRDZ(PM3_WR_WR2,PREDR1,PREDTH1,PD,PBLL_O_E,PEMOIST) +FUNCTION D_M3_WR_WR2_O_DDRDZ(CSTURB,PM3_WR_WR2,PREDR1,PREDTH1,PD,PBLL_O_E,PEMOIST) + TYPE(CSTURB_t), INTENT(IN) :: CSTURB REAL, DIMENSION(:,:,:), INTENT(IN) :: PM3_WR_WR2 REAL, DIMENSION(:,:,:), INTENT(IN) :: PREDR1 REAL, DIMENSION(:,:,:), INTENT(IN) :: PREDTH1 @@ -1760,12 +1807,13 @@ FUNCTION D_M3_WR_WR2_O_DDRDZ(PM3_WR_WR2,PREDR1,PREDTH1,PD,PBLL_O_E,PEMOIST) ! REAL(KIND=JPRB) :: ZHOOK_HANDLE IF (LHOOK) CALL DR_HOOK('MODE_PRANDTL:D_M3_WR_WR2_O_DDRDZ',0,ZHOOK_HANDLE) -D_M3_WR_WR2_O_DDRDZ = D_M3_WTH_WTH2_O_DDTDZ(PM3_WR_WR2,PREDR1,PREDTH1,PD,PBLL_O_E,PEMOIST) +D_M3_WR_WR2_O_DDRDZ = D_M3_WTH_WTH2_O_DDTDZ(CSTURB,PM3_WR_WR2,PREDR1,PREDTH1,PD,PBLL_O_E,PEMOIST) ! IF (LHOOK) CALL DR_HOOK('MODE_PRANDTL:D_M3_WR_WR2_O_DDRDZ',1,ZHOOK_HANDLE) END FUNCTION D_M3_WR_WR2_O_DDRDZ !---------------------------------------------------------------------------- -FUNCTION M3_WR_W2R(KKA,KKU,KKL,PREDR1,PREDTH1,PD,PKEFF,PTKE) +FUNCTION M3_WR_W2R(CSTURB,KKA,KKU,KKL,PREDR1,PREDTH1,PD,PKEFF,PTKE) + TYPE(CSTURB_t), INTENT(IN) :: CSTURB INTEGER, INTENT(IN) :: KKA INTEGER, INTENT(IN) :: KKU INTEGER, INTENT(IN) :: KKL @@ -1778,12 +1826,13 @@ FUNCTION M3_WR_W2R(KKA,KKU,KKL,PREDR1,PREDTH1,PD,PKEFF,PTKE) ! REAL(KIND=JPRB) :: ZHOOK_HANDLE IF (LHOOK) CALL DR_HOOK('MODE_PRANDTL:M3_WR_W2R',0,ZHOOK_HANDLE) -M3_WR_W2R = M3_WTH_W2TH(KKA,KKU,KKL,PREDR1,PREDTH1,PD,PKEFF,PTKE) +M3_WR_W2R = M3_WTH_W2TH(CSTURB,KKA,KKU,KKL,PREDR1,PREDTH1,PD,PKEFF,PTKE) ! IF (LHOOK) CALL DR_HOOK('MODE_PRANDTL:M3_WR_W2R',1,ZHOOK_HANDLE) END FUNCTION M3_WR_W2R !---------------------------------------------------------------------------- -FUNCTION D_M3_WR_W2R_O_DDRDZ(KKA,KKU,KKL,PREDR1,PREDTH1,PD,PBLL_O_E,PEMOIST,PKEFF,PTKE) +FUNCTION D_M3_WR_W2R_O_DDRDZ(CSTURB,KKA,KKU,KKL,PREDR1,PREDTH1,PD,PBLL_O_E,PEMOIST,PKEFF,PTKE) + TYPE(CSTURB_t), INTENT(IN) :: CSTURB INTEGER, INTENT(IN) :: KKA INTEGER, INTENT(IN) :: KKU INTEGER, INTENT(IN) :: KKL @@ -1798,12 +1847,13 @@ FUNCTION D_M3_WR_W2R_O_DDRDZ(KKA,KKU,KKL,PREDR1,PREDTH1,PD,PBLL_O_E,PEMOIST,PKEF ! REAL(KIND=JPRB) :: ZHOOK_HANDLE IF (LHOOK) CALL DR_HOOK('MODE_PRANDTL:D_M3_WR_W2R_O_DDRDZ',0,ZHOOK_HANDLE) -D_M3_WR_W2R_O_DDRDZ = D_M3_WTH_W2TH_O_DDTDZ(KKA,KKU,KKL,PREDR1,PREDTH1,PD,PBLL_O_E,PEMOIST,PKEFF,PTKE) +D_M3_WR_W2R_O_DDRDZ = D_M3_WTH_W2TH_O_DDTDZ(CSTURB,KKA,KKU,KKL,PREDR1,PREDTH1,PD,PBLL_O_E,PEMOIST,PKEFF,PTKE) ! IF (LHOOK) CALL DR_HOOK('MODE_PRANDTL:D_M3_WR_W2R_O_DDRDZ',1,ZHOOK_HANDLE) END FUNCTION D_M3_WR_W2R_O_DDRDZ !---------------------------------------------------------------------------- -FUNCTION M3_WR_W2TH(KKA,KKU,KKL,PD,PKEFF,PTKE,PBLL_O_E,PETHETA,PDRDZ) +FUNCTION M3_WR_W2TH(CSTURB,KKA,KKU,KKL,PD,PKEFF,PTKE,PBLL_O_E,PETHETA,PDRDZ) + TYPE(CSTURB_t), INTENT(IN) :: CSTURB INTEGER, INTENT(IN) :: KKA INTEGER, INTENT(IN) :: KKU INTEGER, INTENT(IN) :: KKL @@ -1817,12 +1867,13 @@ FUNCTION M3_WR_W2TH(KKA,KKU,KKL,PD,PKEFF,PTKE,PBLL_O_E,PETHETA,PDRDZ) ! REAL(KIND=JPRB) :: ZHOOK_HANDLE IF (LHOOK) CALL DR_HOOK('MODE_PRANDTL:M3_WR_W2TH',0,ZHOOK_HANDLE) -M3_WR_W2TH = M3_WTH_W2R(KKA,KKU,KKL,PD,PKEFF,PTKE,PBLL_O_E,PETHETA,PDRDZ) +M3_WR_W2TH = M3_WTH_W2R(CSTURB,KKA,KKU,KKL,PD,PKEFF,PTKE,PBLL_O_E,PETHETA,PDRDZ) ! IF (LHOOK) CALL DR_HOOK('MODE_PRANDTL:M3_WR_W2TH',1,ZHOOK_HANDLE) END FUNCTION M3_WR_W2TH !---------------------------------------------------------------------------- -FUNCTION D_M3_WR_W2TH_O_DDRDZ(KKA,KKU,KKL,PREDR1,PREDTH1,PD,PKEFF,PTKE,PBLL_O_E,PETHETA) +FUNCTION D_M3_WR_W2TH_O_DDRDZ(CSTURB,KKA,KKU,KKL,PREDR1,PREDTH1,PD,PKEFF,PTKE,PBLL_O_E,PETHETA) + TYPE(CSTURB_t), INTENT(IN) :: CSTURB INTEGER, INTENT(IN) :: KKA INTEGER, INTENT(IN) :: KKU INTEGER, INTENT(IN) :: KKL @@ -1837,12 +1888,13 @@ FUNCTION D_M3_WR_W2TH_O_DDRDZ(KKA,KKU,KKL,PREDR1,PREDTH1,PD,PKEFF,PTKE,PBLL_O_E, ! REAL(KIND=JPRB) :: ZHOOK_HANDLE IF (LHOOK) CALL DR_HOOK('MODE_PRANDTL:D_M3_WR_W2TH_O_DDRDZ',0,ZHOOK_HANDLE) -D_M3_WR_W2TH_O_DDRDZ = D_M3_WTH_W2R_O_DDTDZ(KKA,KKU,KKL,PREDR1,PREDTH1,PD,PKEFF,PTKE,PBLL_O_E,PETHETA) +D_M3_WR_W2TH_O_DDRDZ = D_M3_WTH_W2R_O_DDTDZ(CSTURB,KKA,KKU,KKL,PREDR1,PREDTH1,PD,PKEFF,PTKE,PBLL_O_E,PETHETA) ! IF (LHOOK) CALL DR_HOOK('MODE_PRANDTL:D_M3_WR_W2TH_O_DDRDZ',1,ZHOOK_HANDLE) END FUNCTION D_M3_WR_W2TH_O_DDRDZ !---------------------------------------------------------------------------- -FUNCTION M3_WR_WTH2(KKA,KKU,KKL,PD,PKEFF,PTKE,PSQRT_TKE,PBLL_O_E,PBETA,PLEPS,PETHETA,PDRDZ) +FUNCTION M3_WR_WTH2(CSTURB,KKA,KKU,KKL,PD,PKEFF,PTKE,PSQRT_TKE,PBLL_O_E,PBETA,PLEPS,PETHETA,PDRDZ) + TYPE(CSTURB_t), INTENT(IN) :: CSTURB INTEGER, INTENT(IN) :: KKA INTEGER, INTENT(IN) :: KKU INTEGER, INTENT(IN) :: KKL @@ -1859,12 +1911,13 @@ FUNCTION M3_WR_WTH2(KKA,KKU,KKL,PD,PKEFF,PTKE,PSQRT_TKE,PBLL_O_E,PBETA,PLEPS,PET ! REAL(KIND=JPRB) :: ZHOOK_HANDLE IF (LHOOK) CALL DR_HOOK('MODE_PRANDTL:M3_WR_WTH2',0,ZHOOK_HANDLE) -M3_WR_WTH2 = M3_WTH_WR2(KKA,KKU,KKL,PD,PKEFF,PTKE,PSQRT_TKE,PBLL_O_E,PBETA,PLEPS,PETHETA,PDRDZ) +M3_WR_WTH2 = M3_WTH_WR2(CSTURB,KKA,KKU,KKL,PD,PKEFF,PTKE,PSQRT_TKE,PBLL_O_E,PBETA,PLEPS,PETHETA,PDRDZ) ! IF (LHOOK) CALL DR_HOOK('MODE_PRANDTL:M3_WR_WTH2',1,ZHOOK_HANDLE) END FUNCTION M3_WR_WTH2 !---------------------------------------------------------------------------- -FUNCTION D_M3_WR_WTH2_O_DDRDZ(KKA,KKU,KKL,PREDR1,PREDTH1,PD,PKEFF,PTKE,PSQRT_TKE,PBLL_O_E,PBETA,PLEPS,PETHETA) +FUNCTION D_M3_WR_WTH2_O_DDRDZ(CSTURB,KKA,KKU,KKL,PREDR1,PREDTH1,PD,PKEFF,PTKE,PSQRT_TKE,PBLL_O_E,PBETA,PLEPS,PETHETA) + TYPE(CSTURB_t), INTENT(IN) :: CSTURB INTEGER, INTENT(IN) :: KKA INTEGER, INTENT(IN) :: KKU INTEGER, INTENT(IN) :: KKL @@ -1882,12 +1935,13 @@ FUNCTION D_M3_WR_WTH2_O_DDRDZ(KKA,KKU,KKL,PREDR1,PREDTH1,PD,PKEFF,PTKE,PSQRT_TKE ! REAL(KIND=JPRB) :: ZHOOK_HANDLE IF (LHOOK) CALL DR_HOOK('MODE_PRANDTL:D_M3_WR_WTH2_O_DDRDZ',0,ZHOOK_HANDLE) -D_M3_WR_WTH2_O_DDRDZ = D_M3_WTH_WR2_O_DDTDZ(KKA,KKU,KKL,PREDR1,PREDTH1,PD,PKEFF,PTKE,PSQRT_TKE,PBLL_O_E,PBETA,PLEPS,PETHETA) +D_M3_WR_WTH2_O_DDRDZ = D_M3_WTH_WR2_O_DDTDZ(CSTURB,KKA,KKU,KKL,PREDR1,PREDTH1,PD,PKEFF,PTKE,PSQRT_TKE,PBLL_O_E,PBETA,PLEPS,PETHETA) ! IF (LHOOK) CALL DR_HOOK('MODE_PRANDTL:D_M3_WR_WTH2_O_DDRDZ',1,ZHOOK_HANDLE) END FUNCTION D_M3_WR_WTH2_O_DDRDZ !---------------------------------------------------------------------------- -FUNCTION M3_WR_WTHR(KKA,KKU,KKL,PREDTH1,PD,PKEFF,PTKE,PSQRT_TKE,PBETA,PLEPS,PETHETA) +FUNCTION M3_WR_WTHR(CSTURB,KKA,KKU,KKL,PREDTH1,PD,PKEFF,PTKE,PSQRT_TKE,PBETA,PLEPS,PETHETA) + TYPE(CSTURB_t), INTENT(IN) :: CSTURB INTEGER, INTENT(IN) :: KKA INTEGER, INTENT(IN) :: KKU INTEGER, INTENT(IN) :: KKL @@ -1903,12 +1957,13 @@ FUNCTION M3_WR_WTHR(KKA,KKU,KKL,PREDTH1,PD,PKEFF,PTKE,PSQRT_TKE,PBETA,PLEPS,PETH ! REAL(KIND=JPRB) :: ZHOOK_HANDLE IF (LHOOK) CALL DR_HOOK('MODE_PRANDTL:M3_WR_WTHR',0,ZHOOK_HANDLE) -M3_WR_WTHR = M3_WTH_WTHR(KKA,KKU,KKL,PREDTH1,PD,PKEFF,PTKE,PSQRT_TKE,PBETA,PLEPS,PETHETA) +M3_WR_WTHR = M3_WTH_WTHR(CSTURB,KKA,KKU,KKL,PREDTH1,PD,PKEFF,PTKE,PSQRT_TKE,PBETA,PLEPS,PETHETA) ! IF (LHOOK) CALL DR_HOOK('MODE_PRANDTL:M3_WR_WTHR',1,ZHOOK_HANDLE) END FUNCTION M3_WR_WTHR !---------------------------------------------------------------------------- -FUNCTION D_M3_WR_WTHR_O_DDRDZ(KKA,KKU,KKL,PM3_WR_WTHR,PREDR1,PREDTH1,PD,PBLL_O_E,PEMOIST) +FUNCTION D_M3_WR_WTHR_O_DDRDZ(CSTURB,KKA,KKU,KKL,PM3_WR_WTHR,PREDR1,PREDTH1,PD,PBLL_O_E,PEMOIST) + TYPE(CSTURB_t), INTENT(IN) :: CSTURB INTEGER, INTENT(IN) :: KKA INTEGER, INTENT(IN) :: KKU INTEGER, INTENT(IN) :: KKL @@ -1922,12 +1977,13 @@ FUNCTION D_M3_WR_WTHR_O_DDRDZ(KKA,KKU,KKL,PM3_WR_WTHR,PREDR1,PREDTH1,PD,PBLL_O_E ! REAL(KIND=JPRB) :: ZHOOK_HANDLE IF (LHOOK) CALL DR_HOOK('MODE_PRANDTL:D_M3_WR_WTHR_O_DDRDZ',0,ZHOOK_HANDLE) -D_M3_WR_WTHR_O_DDRDZ = D_M3_WTH_WTHR_O_DDTDZ(PM3_WR_WTHR,PREDR1,PREDTH1,PD,PBLL_O_E,PEMOIST) +D_M3_WR_WTHR_O_DDRDZ = D_M3_WTH_WTHR_O_DDTDZ(CSTURB,PM3_WR_WTHR,PREDR1,PREDTH1,PD,PBLL_O_E,PEMOIST) ! IF (LHOOK) CALL DR_HOOK('MODE_PRANDTL:D_M3_WR_WTHR_O_DDRDZ',1,ZHOOK_HANDLE) END FUNCTION D_M3_WR_WTHR_O_DDRDZ !---------------------------------------------------------------------------- -FUNCTION M3_R2_W2R(KKA,KKU,KKL,PREDR1,PREDTH1,PD,PDRDZ,PLM,PLEPS,PTKE) +FUNCTION M3_R2_W2R(CSTURB,KKA,KKU,KKL,PREDR1,PREDTH1,PD,PDRDZ,PLM,PLEPS,PTKE) + TYPE(CSTURB_t), INTENT(IN) :: CSTURB INTEGER, INTENT(IN) :: KKA INTEGER, INTENT(IN) :: KKU INTEGER, INTENT(IN) :: KKL @@ -1942,12 +1998,13 @@ FUNCTION M3_R2_W2R(KKA,KKU,KKL,PREDR1,PREDTH1,PD,PDRDZ,PLM,PLEPS,PTKE) ! REAL(KIND=JPRB) :: ZHOOK_HANDLE IF (LHOOK) CALL DR_HOOK('MODE_PRANDTL:M3_R2_W2R',0,ZHOOK_HANDLE) -M3_R2_W2R = M3_TH2_W2TH(KKA,KKU,KKL,PREDR1,PREDTH1,PD,PDRDZ,PLM,PLEPS,PTKE) +M3_R2_W2R = M3_TH2_W2TH(CSTURB,KKA,KKU,KKL,PREDR1,PREDTH1,PD,PDRDZ,PLM,PLEPS,PTKE) ! IF (LHOOK) CALL DR_HOOK('MODE_PRANDTL:M3_R2_W2R',1,ZHOOK_HANDLE) END FUNCTION M3_R2_W2R !---------------------------------------------------------------------------- -FUNCTION D_M3_R2_W2R_O_DDRDZ(KKA,KKU,KKL,PREDR1,PREDTH1,PD,PLM,PLEPS,PTKE,OUSERV) +FUNCTION D_M3_R2_W2R_O_DDRDZ(CSTURB,KKA,KKU,KKL,PREDR1,PREDTH1,PD,PLM,PLEPS,PTKE,OUSERV) + TYPE(CSTURB_t), INTENT(IN) :: CSTURB INTEGER, INTENT(IN) :: KKA INTEGER, INTENT(IN) :: KKU INTEGER, INTENT(IN) :: KKL @@ -1962,12 +2019,13 @@ FUNCTION D_M3_R2_W2R_O_DDRDZ(KKA,KKU,KKL,PREDR1,PREDTH1,PD,PLM,PLEPS,PTKE,OUSERV ! REAL(KIND=JPRB) :: ZHOOK_HANDLE IF (LHOOK) CALL DR_HOOK('MODE_PRANDTL:D_M3_R2_W2R_O_DDRDZ',0,ZHOOK_HANDLE) -D_M3_R2_W2R_O_DDRDZ = D_M3_TH2_W2TH_O_DDTDZ(KKA,KKU,KKL,PREDR1,PREDTH1,PD,PLM,PLEPS,PTKE,OUSERV) +D_M3_R2_W2R_O_DDRDZ = D_M3_TH2_W2TH_O_DDTDZ(CSTURB,KKA,KKU,KKL,PREDR1,PREDTH1,PD,PLM,PLEPS,PTKE,OUSERV) ! IF (LHOOK) CALL DR_HOOK('MODE_PRANDTL:D_M3_R2_W2R_O_DDRDZ',1,ZHOOK_HANDLE) END FUNCTION D_M3_R2_W2R_O_DDRDZ !---------------------------------------------------------------------------- -FUNCTION M3_R2_WR2(KKA,KKU,KKL,PREDR1,PREDTH1,PD,PLEPS,PSQRT_TKE) +FUNCTION M3_R2_WR2(CSTURB,KKA,KKU,KKL,PREDR1,PREDTH1,PD,PLEPS,PSQRT_TKE) + TYPE(CSTURB_t), INTENT(IN) :: CSTURB INTEGER, INTENT(IN) :: KKA INTEGER, INTENT(IN) :: KKU INTEGER, INTENT(IN) :: KKL @@ -1980,12 +2038,13 @@ FUNCTION M3_R2_WR2(KKA,KKU,KKL,PREDR1,PREDTH1,PD,PLEPS,PSQRT_TKE) ! REAL(KIND=JPRB) :: ZHOOK_HANDLE IF (LHOOK) CALL DR_HOOK('MODE_PRANDTL:M3_R2_WR2',0,ZHOOK_HANDLE) -M3_R2_WR2 = M3_TH2_WTH2(KKA,KKU,KKL,PREDR1,PREDTH1,PD,PLEPS,PSQRT_TKE) +M3_R2_WR2 = M3_TH2_WTH2(CSTURB,KKA,KKU,KKL,PREDR1,PREDTH1,PD,PLEPS,PSQRT_TKE) ! IF (LHOOK) CALL DR_HOOK('MODE_PRANDTL:M3_R2_WR2',1,ZHOOK_HANDLE) END FUNCTION M3_R2_WR2 !---------------------------------------------------------------------------- -FUNCTION D_M3_R2_WR2_O_DDRDZ(KKA,KKU,KKL,PREDR1,PREDTH1,PD,PLEPS,PSQRT_TKE,PBLL_O_E,PEMOIST) +FUNCTION D_M3_R2_WR2_O_DDRDZ(CSTURB,KKA,KKU,KKL,PREDR1,PREDTH1,PD,PLEPS,PSQRT_TKE,PBLL_O_E,PEMOIST) + TYPE(CSTURB_t), INTENT(IN) :: CSTURB INTEGER, INTENT(IN) :: KKA INTEGER, INTENT(IN) :: KKU INTEGER, INTENT(IN) :: KKL @@ -2000,12 +2059,13 @@ FUNCTION D_M3_R2_WR2_O_DDRDZ(KKA,KKU,KKL,PREDR1,PREDTH1,PD,PLEPS,PSQRT_TKE,PBLL_ ! REAL(KIND=JPRB) :: ZHOOK_HANDLE IF (LHOOK) CALL DR_HOOK('MODE_PRANDTL:D_M3_R2_WR2_O_DDRDZ',0,ZHOOK_HANDLE) -D_M3_R2_WR2_O_DDRDZ = D_M3_TH2_WTH2_O_DDTDZ(KKA,KKU,KKL,PREDR1,PREDTH1,PD,PLEPS,PSQRT_TKE,PBLL_O_E,PEMOIST) +D_M3_R2_WR2_O_DDRDZ = D_M3_TH2_WTH2_O_DDTDZ(CSTURB,KKA,KKU,KKL,PREDR1,PREDTH1,PD,PLEPS,PSQRT_TKE,PBLL_O_E,PEMOIST) ! IF (LHOOK) CALL DR_HOOK('MODE_PRANDTL:D_M3_R2_WR2_O_DDRDZ',1,ZHOOK_HANDLE) END FUNCTION D_M3_R2_WR2_O_DDRDZ !---------------------------------------------------------------------------- -FUNCTION M3_R2_W2TH(KKA,KKU,KKL,PD,PLM,PLEPS,PTKE,PBLL_O_E,PETHETA,PDRDZ) +FUNCTION M3_R2_W2TH(CSTURB,KKA,KKU,KKL,PD,PLM,PLEPS,PTKE,PBLL_O_E,PETHETA,PDRDZ) + TYPE(CSTURB_t), INTENT(IN) :: CSTURB INTEGER, INTENT(IN) :: KKA INTEGER, INTENT(IN) :: KKU INTEGER, INTENT(IN) :: KKL @@ -2020,12 +2080,13 @@ FUNCTION M3_R2_W2TH(KKA,KKU,KKL,PD,PLM,PLEPS,PTKE,PBLL_O_E,PETHETA,PDRDZ) ! REAL(KIND=JPRB) :: ZHOOK_HANDLE IF (LHOOK) CALL DR_HOOK('MODE_PRANDTL:M3_R2_W2TH',0,ZHOOK_HANDLE) -M3_R2_W2TH = M3_TH2_W2R(KKA,KKU,KKL,PD,PLM,PLEPS,PTKE,PBLL_O_E,PETHETA,PDRDZ) +M3_R2_W2TH = M3_TH2_W2R(CSTURB,KKA,KKU,KKL,PD,PLM,PLEPS,PTKE,PBLL_O_E,PETHETA,PDRDZ) ! IF (LHOOK) CALL DR_HOOK('MODE_PRANDTL:M3_R2_W2TH',1,ZHOOK_HANDLE) END FUNCTION M3_R2_W2TH !---------------------------------------------------------------------------- -FUNCTION D_M3_R2_W2TH_O_DDRDZ(KKA,KKU,KKL,PREDR1,PREDTH1,PD,PLM,PLEPS,PTKE,PBLL_O_E,PETHETA,PDRDZ) +FUNCTION D_M3_R2_W2TH_O_DDRDZ(CSTURB,KKA,KKU,KKL,PREDR1,PREDTH1,PD,PLM,PLEPS,PTKE,PBLL_O_E,PETHETA,PDRDZ) + TYPE(CSTURB_t), INTENT(IN) :: CSTURB INTEGER, INTENT(IN) :: KKA INTEGER, INTENT(IN) :: KKU INTEGER, INTENT(IN) :: KKL @@ -2042,12 +2103,13 @@ FUNCTION D_M3_R2_W2TH_O_DDRDZ(KKA,KKU,KKL,PREDR1,PREDTH1,PD,PLM,PLEPS,PTKE,PBLL_ ! REAL(KIND=JPRB) :: ZHOOK_HANDLE IF (LHOOK) CALL DR_HOOK('MODE_PRANDTL:D_M3_R2_W2TH_O_DDRDZ',0,ZHOOK_HANDLE) -D_M3_R2_W2TH_O_DDRDZ = D_M3_TH2_W2R_O_DDTDZ(KKA,KKU,KKL,PREDR1,PREDTH1,PD,PLM,PLEPS,PTKE,PBLL_O_E,PETHETA,PDRDZ) +D_M3_R2_W2TH_O_DDRDZ = D_M3_TH2_W2R_O_DDTDZ(CSTURB,KKA,KKU,KKL,PREDR1,PREDTH1,PD,PLM,PLEPS,PTKE,PBLL_O_E,PETHETA,PDRDZ) ! IF (LHOOK) CALL DR_HOOK('MODE_PRANDTL:D_M3_R2_W2TH_O_DDRDZ',1,ZHOOK_HANDLE) END FUNCTION D_M3_R2_W2TH_O_DDRDZ !---------------------------------------------------------------------------- -FUNCTION M3_R2_WTH2(KKA,KKU,KKL,PD,PLEPS,PSQRT_TKE,PBLL_O_E,PETHETA,PDRDZ) +FUNCTION M3_R2_WTH2(CSTURB,KKA,KKU,KKL,PD,PLEPS,PSQRT_TKE,PBLL_O_E,PETHETA,PDRDZ) + TYPE(CSTURB_t), INTENT(IN) :: CSTURB INTEGER, INTENT(IN) :: KKA INTEGER, INTENT(IN) :: KKU INTEGER, INTENT(IN) :: KKL @@ -2061,12 +2123,13 @@ FUNCTION M3_R2_WTH2(KKA,KKU,KKL,PD,PLEPS,PSQRT_TKE,PBLL_O_E,PETHETA,PDRDZ) ! REAL(KIND=JPRB) :: ZHOOK_HANDLE IF (LHOOK) CALL DR_HOOK('MODE_PRANDTL:M3_R2_WTH2',0,ZHOOK_HANDLE) -M3_R2_WTH2 = M3_TH2_WR2(KKA,KKU,KKL,PD,PLEPS,PSQRT_TKE,PBLL_O_E,PETHETA,PDRDZ) +M3_R2_WTH2 = M3_TH2_WR2(CSTURB,KKA,KKU,KKL,PD,PLEPS,PSQRT_TKE,PBLL_O_E,PETHETA,PDRDZ) ! IF (LHOOK) CALL DR_HOOK('MODE_PRANDTL:M3_R2_WTH2',1,ZHOOK_HANDLE) END FUNCTION M3_R2_WTH2 !---------------------------------------------------------------------------- -FUNCTION D_M3_R2_WTH2_O_DDRDZ(KKA,KKU,KKL,PREDR1,PREDTH1,PD,PLEPS,PSQRT_TKE,PBLL_O_E,PETHETA,PDRDZ) +FUNCTION D_M3_R2_WTH2_O_DDRDZ(CSTURB,KKA,KKU,KKL,PREDR1,PREDTH1,PD,PLEPS,PSQRT_TKE,PBLL_O_E,PETHETA,PDRDZ) + TYPE(CSTURB_t), INTENT(IN) :: CSTURB INTEGER, INTENT(IN) :: KKA INTEGER, INTENT(IN) :: KKU INTEGER, INTENT(IN) :: KKL @@ -2082,12 +2145,13 @@ FUNCTION D_M3_R2_WTH2_O_DDRDZ(KKA,KKU,KKL,PREDR1,PREDTH1,PD,PLEPS,PSQRT_TKE,PBLL ! REAL(KIND=JPRB) :: ZHOOK_HANDLE IF (LHOOK) CALL DR_HOOK('MODE_PRANDTL:D_M3_R2_WTH2_O_DDRDZ',0,ZHOOK_HANDLE) -D_M3_R2_WTH2_O_DDRDZ = D_M3_TH2_WR2_O_DDTDZ(KKA,KKU,KKL,PREDR1,PREDTH1,PD,PLEPS,PSQRT_TKE,PBLL_O_E,PETHETA,PDRDZ) +D_M3_R2_WTH2_O_DDRDZ = D_M3_TH2_WR2_O_DDTDZ(CSTURB,KKA,KKU,KKL,PREDR1,PREDTH1,PD,PLEPS,PSQRT_TKE,PBLL_O_E,PETHETA,PDRDZ) ! IF (LHOOK) CALL DR_HOOK('MODE_PRANDTL:D_M3_R2_WTH2_O_DDRDZ',1,ZHOOK_HANDLE) END FUNCTION D_M3_R2_WTH2_O_DDRDZ !---------------------------------------------------------------------------- -FUNCTION M3_R2_WTHR(KKA,KKU,KKL,PREDTH1,PD,PLEPS,PSQRT_TKE,PBLL_O_E,PETHETA,PDRDZ) +FUNCTION M3_R2_WTHR(CSTURB,KKA,KKU,KKL,PREDTH1,PD,PLEPS,PSQRT_TKE,PBLL_O_E,PETHETA,PDRDZ) + TYPE(CSTURB_t), INTENT(IN) :: CSTURB INTEGER, INTENT(IN) :: KKA INTEGER, INTENT(IN) :: KKU INTEGER, INTENT(IN) :: KKL @@ -2102,12 +2166,13 @@ FUNCTION M3_R2_WTHR(KKA,KKU,KKL,PREDTH1,PD,PLEPS,PSQRT_TKE,PBLL_O_E,PETHETA,PDRD ! REAL(KIND=JPRB) :: ZHOOK_HANDLE IF (LHOOK) CALL DR_HOOK('MODE_PRANDTL:M3_R2_WTHR',0,ZHOOK_HANDLE) -M3_R2_WTHR = M3_TH2_WTHR(KKA,KKU,KKL,PREDTH1,PD,PLEPS,PSQRT_TKE,PBLL_O_E,PETHETA,PDRDZ) +M3_R2_WTHR = M3_TH2_WTHR(CSTURB,KKA,KKU,KKL,PREDTH1,PD,PLEPS,PSQRT_TKE,PBLL_O_E,PETHETA,PDRDZ) ! IF (LHOOK) CALL DR_HOOK('MODE_PRANDTL:M3_R2_WTHR',1,ZHOOK_HANDLE) END FUNCTION M3_R2_WTHR !---------------------------------------------------------------------------- -FUNCTION D_M3_R2_WTHR_O_DDRDZ(KKA,KKU,KKL,PREDR1,PREDTH1,PD,PLEPS,PSQRT_TKE,PBLL_O_E,PETHETA,PDRDZ) +FUNCTION D_M3_R2_WTHR_O_DDRDZ(CSTURB,KKA,KKU,KKL,PREDR1,PREDTH1,PD,PLEPS,PSQRT_TKE,PBLL_O_E,PETHETA,PDRDZ) + TYPE(CSTURB_t), INTENT(IN) :: CSTURB INTEGER, INTENT(IN) :: KKA INTEGER, INTENT(IN) :: KKU INTEGER, INTENT(IN) :: KKL @@ -2123,12 +2188,13 @@ FUNCTION D_M3_R2_WTHR_O_DDRDZ(KKA,KKU,KKL,PREDR1,PREDTH1,PD,PLEPS,PSQRT_TKE,PBLL ! REAL(KIND=JPRB) :: ZHOOK_HANDLE IF (LHOOK) CALL DR_HOOK('MODE_PRANDTL:D_M3_R2_WTHR_O_DDRDZ',0,ZHOOK_HANDLE) -D_M3_R2_WTHR_O_DDRDZ = D_M3_TH2_WTHR_O_DDTDZ(KKA,KKU,KKL,PREDR1,PREDTH1,PD,PLEPS,PSQRT_TKE,PBLL_O_E,PETHETA,PDRDZ) +D_M3_R2_WTHR_O_DDRDZ = D_M3_TH2_WTHR_O_DDTDZ(CSTURB,KKA,KKU,KKL,PREDR1,PREDTH1,PD,PLEPS,PSQRT_TKE,PBLL_O_E,PETHETA,PDRDZ) ! IF (LHOOK) CALL DR_HOOK('MODE_PRANDTL:D_M3_R2_WTHR_O_DDRDZ',1,ZHOOK_HANDLE) END FUNCTION D_M3_R2_WTHR_O_DDRDZ !---------------------------------------------------------------------------- -FUNCTION D_M3_THR_WTHR_O_DDRDZ(KKA,KKU,KKL,PREDR1,PREDTH1,PD,PLEPS,PSQRT_TKE,PBLL_O_E,PEMOIST) +FUNCTION D_M3_THR_WTHR_O_DDRDZ(CSTURB,KKA,KKU,KKL,PREDR1,PREDTH1,PD,PLEPS,PSQRT_TKE,PBLL_O_E,PEMOIST) + TYPE(CSTURB_t), INTENT(IN) :: CSTURB INTEGER, INTENT(IN) :: KKA INTEGER, INTENT(IN) :: KKU INTEGER, INTENT(IN) :: KKL @@ -2143,12 +2209,13 @@ FUNCTION D_M3_THR_WTHR_O_DDRDZ(KKA,KKU,KKL,PREDR1,PREDTH1,PD,PLEPS,PSQRT_TKE,PBL ! REAL(KIND=JPRB) :: ZHOOK_HANDLE IF (LHOOK) CALL DR_HOOK('MODE_PRANDTL:D_M3_THR_WTHR_O_DDRDZ',0,ZHOOK_HANDLE) -D_M3_THR_WTHR_O_DDRDZ = D_M3_THR_WTHR_O_DDTDZ(KKA,KKU,KKL,PREDR1,PREDTH1,PD,PLEPS,PSQRT_TKE,PBLL_O_E,PEMOIST) +D_M3_THR_WTHR_O_DDRDZ = D_M3_THR_WTHR_O_DDTDZ(CSTURB,KKA,KKU,KKL,PREDR1,PREDTH1,PD,PLEPS,PSQRT_TKE,PBLL_O_E,PEMOIST) ! IF (LHOOK) CALL DR_HOOK('MODE_PRANDTL:D_M3_THR_WTHR_O_DDRDZ',1,ZHOOK_HANDLE) END FUNCTION D_M3_THR_WTHR_O_DDRDZ !---------------------------------------------------------------------------- -FUNCTION M3_THR_WR2(KKA,KKU,KKL,PREDTH1,PD,PLEPS,PSQRT_TKE,PBLL_O_E,PEMOIST,PDTDZ) +FUNCTION M3_THR_WR2(CSTURB,KKA,KKU,KKL,PREDTH1,PD,PLEPS,PSQRT_TKE,PBLL_O_E,PEMOIST,PDTDZ) + TYPE(CSTURB_t), INTENT(IN) :: CSTURB INTEGER, INTENT(IN) :: KKA INTEGER, INTENT(IN) :: KKU INTEGER, INTENT(IN) :: KKL @@ -2163,12 +2230,13 @@ FUNCTION M3_THR_WR2(KKA,KKU,KKL,PREDTH1,PD,PLEPS,PSQRT_TKE,PBLL_O_E,PEMOIST,PDTD ! REAL(KIND=JPRB) :: ZHOOK_HANDLE IF (LHOOK) CALL DR_HOOK('MODE_PRANDTL:M3_THR_WR2',0,ZHOOK_HANDLE) -M3_THR_WR2 = M3_THR_WTH2(KKA,KKU,KKL,PREDTH1,PD,PLEPS,PSQRT_TKE,PBLL_O_E,PEMOIST,PDTDZ) +M3_THR_WR2 = M3_THR_WTH2(CSTURB,KKA,KKU,KKL,PREDTH1,PD,PLEPS,PSQRT_TKE,PBLL_O_E,PEMOIST,PDTDZ) ! IF (LHOOK) CALL DR_HOOK('MODE_PRANDTL:M3_THR_WR2',1,ZHOOK_HANDLE) END FUNCTION M3_THR_WR2 !---------------------------------------------------------------------------- -FUNCTION D_M3_THR_WR2_O_DDRDZ(KKA,KKU,KKL,PREDR1,PREDTH1,PD,PLEPS,PSQRT_TKE,PBLL_O_E,PEMOIST,PDTDZ) +FUNCTION D_M3_THR_WR2_O_DDRDZ(CSTURB,KKA,KKU,KKL,PREDR1,PREDTH1,PD,PLEPS,PSQRT_TKE,PBLL_O_E,PEMOIST,PDTDZ) + TYPE(CSTURB_t), INTENT(IN) :: CSTURB INTEGER, INTENT(IN) :: KKA INTEGER, INTENT(IN) :: KKU INTEGER, INTENT(IN) :: KKL @@ -2184,12 +2252,13 @@ FUNCTION D_M3_THR_WR2_O_DDRDZ(KKA,KKU,KKL,PREDR1,PREDTH1,PD,PLEPS,PSQRT_TKE,PBLL ! REAL(KIND=JPRB) :: ZHOOK_HANDLE IF (LHOOK) CALL DR_HOOK('MODE_PRANDTL:D_M3_THR_WR2_O_DDRDZ',0,ZHOOK_HANDLE) -D_M3_THR_WR2_O_DDRDZ = D_M3_THR_WTH2_O_DDTDZ(KKA,KKU,KKL,PREDR1,PREDTH1,PD,PLEPS,PSQRT_TKE,PBLL_O_E,PEMOIST,PDTDZ) +D_M3_THR_WR2_O_DDRDZ = D_M3_THR_WTH2_O_DDTDZ(CSTURB,KKA,KKU,KKL,PREDR1,PREDTH1,PD,PLEPS,PSQRT_TKE,PBLL_O_E,PEMOIST,PDTDZ) ! IF (LHOOK) CALL DR_HOOK('MODE_PRANDTL:D_M3_THR_WR2_O_DDRDZ',1,ZHOOK_HANDLE) END FUNCTION D_M3_THR_WR2_O_DDRDZ !---------------------------------------------------------------------------- -FUNCTION D_M3_THR_WR2_O_DDTDZ(KKA,KKU,KKL,PREDR1,PREDTH1,PD,PLEPS,PSQRT_TKE,PBLL_O_E,PEMOIST) +FUNCTION D_M3_THR_WR2_O_DDTDZ(CSTURB,KKA,KKU,KKL,PREDR1,PREDTH1,PD,PLEPS,PSQRT_TKE,PBLL_O_E,PEMOIST) + TYPE(CSTURB_t), INTENT(IN) :: CSTURB INTEGER, INTENT(IN) :: KKA INTEGER, INTENT(IN) :: KKU INTEGER, INTENT(IN) :: KKL @@ -2204,12 +2273,13 @@ FUNCTION D_M3_THR_WR2_O_DDTDZ(KKA,KKU,KKL,PREDR1,PREDTH1,PD,PLEPS,PSQRT_TKE,PBLL ! REAL(KIND=JPRB) :: ZHOOK_HANDLE IF (LHOOK) CALL DR_HOOK('MODE_PRANDTL:D_M3_THR_WR2_O_DDTDZ',0,ZHOOK_HANDLE) -D_M3_THR_WR2_O_DDTDZ = D_M3_THR_WTH2_O_DDRDZ(KKA,KKU,KKL,PREDR1,PREDTH1,PD,PLEPS,PSQRT_TKE,PBLL_O_E,PEMOIST) +D_M3_THR_WR2_O_DDTDZ = D_M3_THR_WTH2_O_DDRDZ(CSTURB,KKA,KKU,KKL,PREDR1,PREDTH1,PD,PLEPS,PSQRT_TKE,PBLL_O_E,PEMOIST) ! IF (LHOOK) CALL DR_HOOK('MODE_PRANDTL:D_M3_THR_WR2_O_DDTDZ',1,ZHOOK_HANDLE) END FUNCTION D_M3_THR_WR2_O_DDTDZ !---------------------------------------------------------------------------- -FUNCTION M3_THR_W2R(KKA,KKU,KKL,PREDTH1,PD,PLM,PLEPS,PTKE,PDTDZ) +FUNCTION M3_THR_W2R(CSTURB,KKA,KKU,KKL,PREDTH1,PD,PLM,PLEPS,PTKE,PDTDZ) + TYPE(CSTURB_t), INTENT(IN) :: CSTURB INTEGER, INTENT(IN) :: KKA INTEGER, INTENT(IN) :: KKU INTEGER, INTENT(IN) :: KKL @@ -2223,12 +2293,13 @@ FUNCTION M3_THR_W2R(KKA,KKU,KKL,PREDTH1,PD,PLM,PLEPS,PTKE,PDTDZ) ! REAL(KIND=JPRB) :: ZHOOK_HANDLE IF (LHOOK) CALL DR_HOOK('MODE_PRANDTL:M3_THR_W2R',0,ZHOOK_HANDLE) -M3_THR_W2R = M3_THR_W2TH(KKA,KKU,KKL,PREDTH1,PD,PLM,PLEPS,PTKE,PDTDZ) +M3_THR_W2R = M3_THR_W2TH(CSTURB,KKA,KKU,KKL,PREDTH1,PD,PLM,PLEPS,PTKE,PDTDZ) ! IF (LHOOK) CALL DR_HOOK('MODE_PRANDTL:M3_THR_W2R',1,ZHOOK_HANDLE) END FUNCTION M3_THR_W2R !---------------------------------------------------------------------------- -FUNCTION D_M3_THR_W2R_O_DDRDZ(KKA,KKU,KKL,PREDR1,PREDTH1,PD,PLM,PLEPS,PTKE,PBLL_O_E,PDTDZ,PEMOIST) +FUNCTION D_M3_THR_W2R_O_DDRDZ(CSTURB,KKA,KKU,KKL,PREDR1,PREDTH1,PD,PLM,PLEPS,PTKE,PBLL_O_E,PDTDZ,PEMOIST) + TYPE(CSTURB_t), INTENT(IN) :: CSTURB INTEGER, INTENT(IN) :: KKA INTEGER, INTENT(IN) :: KKU INTEGER, INTENT(IN) :: KKL @@ -2245,12 +2316,13 @@ FUNCTION D_M3_THR_W2R_O_DDRDZ(KKA,KKU,KKL,PREDR1,PREDTH1,PD,PLM,PLEPS,PTKE,PBLL_ ! REAL(KIND=JPRB) :: ZHOOK_HANDLE IF (LHOOK) CALL DR_HOOK('MODE_PRANDTL:D_M3_THR_W2R_O_DDRDZ',0,ZHOOK_HANDLE) -D_M3_THR_W2R_O_DDRDZ = D_M3_THR_W2TH_O_DDTDZ(KKA,KKU,KKL,PREDR1,PREDTH1,PD,PLM,PLEPS,PTKE,PBLL_O_E,PDTDZ,PEMOIST) +D_M3_THR_W2R_O_DDRDZ = D_M3_THR_W2TH_O_DDTDZ(CSTURB,KKA,KKU,KKL,PREDR1,PREDTH1,PD,PLM,PLEPS,PTKE,PBLL_O_E,PDTDZ,PEMOIST) ! IF (LHOOK) CALL DR_HOOK('MODE_PRANDTL:D_M3_THR_W2R_O_DDRDZ',1,ZHOOK_HANDLE) END FUNCTION D_M3_THR_W2R_O_DDRDZ !---------------------------------------------------------------------------- -FUNCTION D_M3_THR_W2R_O_DDTDZ(KKA,KKU,KKL,PREDR1,PREDTH1,PD,PLM,PLEPS,PTKE) +FUNCTION D_M3_THR_W2R_O_DDTDZ(CSTURB,KKA,KKU,KKL,PREDR1,PREDTH1,PD,PLM,PLEPS,PTKE) + TYPE(CSTURB_t), INTENT(IN) :: CSTURB INTEGER, INTENT(IN) :: KKA INTEGER, INTENT(IN) :: KKU INTEGER, INTENT(IN) :: KKL @@ -2264,10 +2336,11 @@ FUNCTION D_M3_THR_W2R_O_DDTDZ(KKA,KKU,KKL,PREDR1,PREDTH1,PD,PLM,PLEPS,PTKE) ! REAL(KIND=JPRB) :: ZHOOK_HANDLE IF (LHOOK) CALL DR_HOOK('MODE_PRANDTL:D_M3_THR_W2R_O_DDTDZ',0,ZHOOK_HANDLE) -D_M3_THR_W2R_O_DDTDZ = D_M3_THR_W2TH_O_DDRDZ(KKA,KKU,KKL,PREDR1,PREDTH1,PD,PLM,PLEPS,PTKE) +D_M3_THR_W2R_O_DDTDZ = D_M3_THR_W2TH_O_DDRDZ(CSTURB,KKA,KKU,KKL,PREDR1,PREDTH1,PD,PLM,PLEPS,PTKE) ! IF (LHOOK) CALL DR_HOOK('MODE_PRANDTL:D_M3_THR_W2R_O_DDTDZ',1,ZHOOK_HANDLE) END FUNCTION D_M3_THR_W2R_O_DDTDZ !---------------------------------------------------------------------------- ! END MODULE MODE_PRANDTL + diff --git a/src/common/turb/mode_tke_eps_sources.F90 b/src/common/turb/mode_tke_eps_sources.F90 index cdfa0d2e45d8b701262f5b4c734a84d86c18dade..637d5d6d50f467e0234c4352ff3e8c8234a92cbc 100644 --- a/src/common/turb/mode_tke_eps_sources.F90 +++ b/src/common/turb/mode_tke_eps_sources.F90 @@ -5,7 +5,8 @@ MODULE MODE_TKE_EPS_SOURCES IMPLICIT NONE CONTAINS - SUBROUTINE TKE_EPS_SOURCES(KKA,KKU,KKL,KMI,PTKEM,PLM,PLEPS,PDP, & + SUBROUTINE TKE_EPS_SOURCES(CST,CSTURB,BUCONF,HPROGRAM, & + & KKA,KKU,KKL,KMI,PTKEM,PLM,PLEPS,PDP, & & PTRH,PRHODJ,PDZZ,PDXX,PDYY,PDZX,PDZY,PZZ, & & PTSTEP,PIMPL,PEXPL, & & HTURBLEN,HTURBDIM, & @@ -58,10 +59,10 @@ CONTAINS !! Module MODD_CTURB: contains the set of constants for !! the turbulence scheme !! -!! XCET,XCED : transport and dissipation cts. for the TKE +!! CSTURB%XCET,CSTURB%XCED : transport and dissipation cts. for the TKE !! XCDP,XCDD,XCDT: constants from the parameterization of !! the K-epsilon equation -!! XTKEMIN,XEPSMIN : minimum values for the TKE and its +!! CSTURB%XTKEMIN,XEPSMIN : minimum values for the TKE and its !! dissipation !! !! Module MODD_PARAMETERS: @@ -130,10 +131,9 @@ USE PARKIND1, ONLY : JPRB USE YOMHOOK , ONLY : LHOOK, DR_HOOK ! USE MODD_ARGSLIST_ll, ONLY: LIST_ll -USE MODD_BUDGET, ONLY: LBUDGET_TKE, LBUDGET_TH, NBUDGET_TKE, NBUDGET_TH, TBUDGETDATA -USE MODD_CONF -USE MODD_CST -USE MODD_CTURB +USE MODD_BUDGET, ONLY: TBUDGETCONF_t, NBUDGET_TKE, NBUDGET_TH, TBUDGETDATA +USE MODD_CST, ONLY: CST_t +USE MODD_CTURB, ONLY: CSTURB_t USE MODD_DIAG_IN_RUN, ONLY : LDIAG_IN_RUN, XCURRENT_TKE_DISS USE MODD_FIELD, ONLY: TFIELDDATA, TYPEREAL USE MODD_IO, ONLY: TFILEDATA @@ -160,6 +160,9 @@ IMPLICIT NONE !* 0.1 declarations of arguments ! ! +TYPE(CST_t), INTENT(IN) :: CST +TYPE(CSTURB_t), INTENT(IN) :: CSTURB +TYPE(TBUDGETCONF_t), INTENT(IN) :: BUCONF 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 @@ -177,6 +180,7 @@ REAL, INTENT(IN) :: PEXPL, PIMPL ! Coef. temporal. disc. CHARACTER(LEN=4), INTENT(IN) :: HTURBDIM ! dimensionality of the ! turbulence scheme CHARACTER(LEN=4), INTENT(IN) :: HTURBLEN ! kind of mixing length +CHARACTER(LEN=6), INTENT(IN) :: HPROGRAM ! CPROGRAM is the program currently running (modd_conf) TYPE(TFILEDATA), INTENT(IN) :: TPFILE ! Output file LOGICAL, INTENT(IN) :: OTURB_DIAG ! switch to write some ! diagnostic fields in the syncronous FM-file @@ -212,7 +216,7 @@ REAL, DIMENSION(SIZE(PTKEM,1),SIZE(PTKEM,2),SIZE(PTKEM,3)):: & ZKEFF, & ! effectif diffusion coeff = LT * SQRT( TKE ) ZTR ! Transport term LOGICAL,DIMENSION(SIZE(PTKEM,1),SIZE(PTKEM,2),SIZE(PTKEM,3)) :: GTKENEG - ! 3D mask .T. if TKE < XTKEMIN + ! 3D mask .T. if TKE < CSTURB%XTKEMIN INTEGER :: IIB,IIE,IJB,IJE,IKB,IKE ! Index values for the Beginning and End ! mass points of the domain @@ -267,7 +271,7 @@ PDP(:,:,IKB) = PDP(:,:,IKB) * (1. + PDZZ(:,:,IKB+KKL)/PDZZ(:,:,IKB)) ! ! Compute the source terms for TKE: ( ADVECtion + NUMerical DIFFusion + ..) ! + (Dynamical Production) + (Thermal Production) - (dissipation) -ZFLX(:,:,:) = XCED * SQRT(PTKEM(:,:,:)) / PLEPS(:,:,:) +ZFLX(:,:,:) = CSTURB%XCED * SQRT(PTKEM(:,:,:)) / PLEPS(:,:,:) ZSOURCE(:,:,:) = ( PRTKES(:,:,:) + PRTKEMS(:,:,:) ) / PRHODJ(:,:,:) & - PTKEM(:,:,:) / PTSTEP & + PDP(:,:,:) + PTP(:,:,:) + ZTR(:,:,:) - PEXPL * ZFLX(:,:,:) * PTKEM(:,:,:) @@ -278,7 +282,7 @@ ZSOURCE(:,:,:) = ( PRTKES(:,:,:) + PRTKEMS(:,:,:) ) / PRHODJ(:,:,:) & ! Compute the vector giving the elements just under the diagonal for the ! matrix inverted in TRIDIAG ! -ZA(:,:,:) = - PTSTEP * XCET * & +ZA(:,:,:) = - PTSTEP * CSTURB%XCET * & MZM(ZKEFF, KKA, KKU, KKL) * MZM(PRHODJ, KKA, KKU, KKL) / PDZZ**2 ! ! Compute TKE at time t+deltat: ( stored in ZRES ) @@ -299,10 +303,10 @@ ENDIF ! ! TKE must be greater than its minimum value ! CL : Now done at the end of the time step in ADVECTION_METSV for MesoNH -IF(CPROGRAM/='MESONH') THEN - GTKENEG = ZRES <= XTKEMIN +IF(HPROGRAM/='MESONH') THEN + GTKENEG = ZRES <= CSTURB%XTKEMIN WHERE ( GTKENEG ) - ZRES = XTKEMIN + ZRES = CSTURB%XTKEMIN END WHERE END IF PTDISS(:,:,:) = - ZFLX(:,:,:)*(PEXPL*PTKEM(:,:,:) + PIMPL*ZRES(:,:,:)) @@ -313,7 +317,7 @@ IF ( LLES_CALL .OR. & ! Compute the cartesian vertical flux of TKE in ZFLX ! - ZFLX(:,:,:) = - XCET * MZM(ZKEFF, KKA, KKU, KKL) * & + ZFLX(:,:,:) = - CSTURB%XCET * MZM(ZKEFF, KKA, KKU, KKL) * & DZM(PIMPL * ZRES + PEXPL * PTKEM, KKA, KKU, KKL) / PDZZ ! ZFLX(:,:,IKB) = 0. @@ -334,13 +338,13 @@ END IF ! !* 2.4 stores the explicit sources for budget purposes ! -IF (LBUDGET_TKE) THEN +IF (BUCONF%LBUDGET_TKE) THEN ! Dynamical production CALL BUDGET_STORE_ADD( TBUDGETS(NBUDGET_TKE), 'DP', PDP(:, :, :) * PRHODJ(:, :, :) ) ! Thermal production CALL BUDGET_STORE_ADD( TBUDGETS(NBUDGET_TKE), 'TP', PTP(:, :, :) * PRHODJ(:, :, :) ) ! Dissipation - CALL BUDGET_STORE_ADD( TBUDGETS(NBUDGET_TKE), 'DISS',- XCED * SQRT(PTKEM(:,:,:)) / PLEPS(:,:,:) * & + CALL BUDGET_STORE_ADD( TBUDGETS(NBUDGET_TKE), 'DISS',- CSTURB%XCED * SQRT(PTKEM(:,:,:)) / PLEPS(:,:,:) * & (PEXPL*PTKEM(:,:,:) + PIMPL*ZRES(:,:,:)) * PRHODJ(:,:,:)) END IF ! @@ -351,34 +355,34 @@ END IF !Should be in IF LBUDGET_TKE only. Was removed out for a correct comput. of PTDIFF in case of LBUDGET_TKE=F in AROME PRTKES(:,:,:) = PRTKES(:,:,:) + PRHODJ(:,:,:) * & ( PDP(:,:,:) + PTP(:,:,:) & - - XCED * SQRT(PTKEM(:,:,:)) / PLEPS(:,:,:) * ( PEXPL*PTKEM(:,:,:) + PIMPL*ZRES(:,:,:) ) ) + - CSTURB%XCED * SQRT(PTKEM(:,:,:)) / PLEPS(:,:,:) * ( PEXPL*PTKEM(:,:,:) + PIMPL*ZRES(:,:,:) ) ) ! PTDIFF(:,:,:) = ZRES(:,:,:) / PTSTEP - PRTKES(:,:,:)/PRHODJ(:,:,:) & & - PDP(:,:,:)- PTP(:,:,:) - PTDISS(:,:,:) -IF (LBUDGET_TKE) CALL BUDGET_STORE_INIT( TBUDGETS(NBUDGET_TKE), 'TR', PRTKES(:, :, :) ) +IF (BUCONF%LBUDGET_TKE) CALL BUDGET_STORE_INIT( TBUDGETS(NBUDGET_TKE), 'TR', PRTKES(:, :, :) ) ! PRTKES(:,:,:) = ZRES(:,:,:) * PRHODJ(:,:,:) / PTSTEP - PRTKEMS(:,:,:) ! ! stores the whole turbulent transport ! -IF (LBUDGET_TKE) CALL BUDGET_STORE_END( TBUDGETS(NBUDGET_TKE), 'TR', PRTKES(:, :, :) ) +IF (BUCONF%LBUDGET_TKE) CALL BUDGET_STORE_END( TBUDGETS(NBUDGET_TKE), 'TR', PRTKES(:, :, :) ) !---------------------------------------------------------------------------- ! !* 3. COMPUTE THE DISSIPATIVE HEATING ! ------------------------------- ! -PRTHLS(:,:,:) = PRTHLS(:,:,:) + XCED * SQRT(PTKEM(:,:,:)) / PLEPS(:,:,:) * & +PRTHLS(:,:,:) = PRTHLS(:,:,:) + CSTURB%XCED * SQRT(PTKEM(:,:,:)) / PLEPS(:,:,:) * & (PEXPL*PTKEM(:,:,:) + PIMPL*ZRES(:,:,:)) * PRHODJ(:,:,:) * PCOEF_DISS(:,:,:) !---------------------------------------------------------------------------- ! !* 4. STORES SOME DIAGNOSTICS ! ----------------------- ! -IF(PRESENT(PDISS)) PDISS(:,:,:) = -XCED * (PTKEM(:,:,:)**1.5) / PLEPS(:,:,:) +IF(PRESENT(PDISS)) PDISS(:,:,:) = -CSTURB%XCED * (PTKEM(:,:,:)**1.5) / PLEPS(:,:,:) IF(PRESENT(PTR)) PTR=ZTR -IF(PRESENT(PEDR)) PEDR = XCED * (PTKEM(:,:,:)**1.5) / PLEPS(:,:,:) +IF(PRESENT(PEDR)) PEDR = CSTURB%XCED * (PTKEM(:,:,:)**1.5) / PLEPS(:,:,:) ! IF ( OTURB_DIAG .AND. TPFILE%LOPENED ) THEN ! diff --git a/src/common/turb/mode_turb_ver.F90 b/src/common/turb/mode_turb_ver.F90 index 49ed101bb374d335175ae8b26f446b5bdf427f44..52b47898ba2dd6dba67b8b6118948765ff635210 100644 --- a/src/common/turb/mode_turb_ver.F90 +++ b/src/common/turb/mode_turb_ver.F90 @@ -5,9 +5,11 @@ MODULE MODE_TURB_VER IMPLICIT NONE CONTAINS -SUBROUTINE TURB_VER(KKA,KKU,KKL,KRR,KRRL,KRRI, & - OTURB_FLX, OOCEAN, & +SUBROUTINE TURB_VER(CST,CSTURB,KKA,KKU,KKL,KRR,KRRL,KRRI, & + OTURB_FLX, OOCEAN, OHARAT, & + KSV,KSV_LGBEG,KSV_LGEND, & HTURBDIM,HTOM,PIMPL,PEXPL, & + HPROGRAM, O2D, ONOMIXLG, OFLAT, & PTSTEP, TPFILE, & PDXX,PDYY,PDZZ,PDZX,PDZY,PDIRCOSZW,PZZ, & PCOSSLOPE,PSINSLOPE, & @@ -132,15 +134,15 @@ SUBROUTINE TURB_VER(KKA,KKU,KKL,KRR,KRRL,KRRI, & !! ------------------ !! Module MODD_CST : contains physical constants !! -!! XG : gravity constant +!! CST%XG : gravity constant !! !! Module MODD_CTURB: contains the set of constants for !! the turbulence scheme !! -!! XCMFS,XCMFB : cts for the momentum flux -!! XCSHF : ct for the sensible heat flux -!! XCHF : ct for the moisture flux -!! XCTV,XCHV : cts for the T and moisture variances +!! CSTURB%XCMFS,XCMFB : cts for the momentum flux +!! CSTURB%XCSHF : ct for the sensible heat flux +!! CSTURB%XCHF : ct for the moisture flux +!! CSTURB%XCTV,CSTURB%XCHV : cts for the T and moisture variances !! !! Module MODD_PARAMETERS !! @@ -209,15 +211,13 @@ SUBROUTINE TURB_VER(KKA,KKU,KKL,KRR,KRRL,KRRI, & USE PARKIND1, ONLY : JPRB USE YOMHOOK , ONLY : LHOOK, DR_HOOK ! -USE MODD_CST -USE MODD_CTURB +USE MODD_CST, ONLY: CST_t +USE MODD_CTURB, ONLY: CSTURB_t USE MODD_FIELD, ONLY: TFIELDDATA, TYPEREAL USE MODD_IO, ONLY: TFILEDATA USE MODD_PARAMETERS USE MODD_LES -USE MODD_NSV, ONLY: NSV ! -!USE MODE_PRANDTL, ONLY: PRANDTL USE MODE_EMOIST, ONLY: EMOIST USE MODE_ETHETA, ONLY: ETHETA USE MODI_GRADIENT_M @@ -242,15 +242,19 @@ IMPLICIT NONE ! ! ! +TYPE(CST_t), INTENT(IN) :: CST +TYPE(CSTURB_t), INTENT(IN) :: CSTURB 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) :: KRRL ! number of liquid water var. INTEGER, INTENT(IN) :: KRRI ! number of ice water var. +INTEGER, INTENT(IN) :: KSV, KSV_LGBEG, KSV_LGEND ! number of scalar variables LOGICAL, INTENT(IN) :: OTURB_FLX ! switch to write the ! turbulent fluxes in the syncronous FM-file LOGICAL, INTENT(IN) :: OOCEAN ! switch for Ocean model version +LOGICAL, INTENT(IN) :: OHARAT ! CHARACTER(len=4), INTENT(IN) :: HTURBDIM ! dimensionality of the ! turbulence scheme CHARACTER(len=4), INTENT(IN) :: HTOM ! type of Third Order Moment @@ -269,7 +273,7 @@ REAL, DIMENSION(:,:), INTENT(IN) :: PSINSLOPE ! sinus of the angle ! between i and the slope vector ! REAL, DIMENSION(:,:,:), INTENT(IN) :: PRHODJ ! dry density * grid volum -! MFMOIST used in case of LHARATU +! MFMOIST used in case of OHARATU REAL, DIMENSION(:,:,:), INTENT(IN) :: MFMOIST ! moist mass flux dual scheme REAL, DIMENSION(:,:,:), INTENT(IN) :: PTHVREF ! ref. state Virtual @@ -300,7 +304,7 @@ REAL, DIMENSION(:,:), INTENT(IN) :: PVSLOPEM ! wind component along the ! REAL, DIMENSION(:,:,:), INTENT(IN) :: PTKEM ! TKE at time t REAL, DIMENSION(:,:,:), INTENT(IN) :: PLM ! Turb. mixing length -! PLENGTHM PLENGTHH used in case of LHARATU +! PLENGTHM PLENGTHH used in case of OHARATU REAL, DIMENSION(:,:,:), INTENT(IN) :: PLENGTHM ! Turb. mixing length momentum REAL, DIMENSION(:,:,:), INTENT(IN) :: PLENGTHH ! Turb. mixing length heat/moisture REAL, DIMENSION(:,:,:), INTENT(IN) :: PLEPS ! dissipative length @@ -329,10 +333,11 @@ REAL, DIMENSION(:,:,:), INTENT(OUT) :: PSIGS ! Vert. part of Sigma_s at t REAL, DIMENSION(:,:,:), INTENT(OUT) :: PWTH ! heat flux REAL, DIMENSION(:,:,:), INTENT(OUT) :: PWRC ! cloud water flux REAL, DIMENSION(:,:,:,:),INTENT(OUT) :: PWSV ! scalar flux - -! -! ! +CHARACTER(LEN=6), INTENT(IN) :: HPROGRAM ! CPROGRAM is the program currently running (modd_conf) +LOGICAL, INTENT(IN) :: ONOMIXLG ! to use turbulence for lagrangian variables (modd_conf) +LOGICAL, INTENT(IN) :: O2D ! Logical for 2D model version (modd_conf) +LOGICAL, INTENT(IN) :: OFLAT ! Logical for zero ororography ! !* 0.2 declaration of local variables ! @@ -360,7 +365,7 @@ REAL, ALLOCATABLE, DIMENSION(:,:,:) :: & ZTHLP, & ! guess of potential temperature due to vert. turbulent flux ZRP ! guess of total water due to vert. turbulent flux -!!$REAL, DIMENSION(SIZE(PTHLM,1),SIZE(PTHLM,2),SIZE(PTHLM,3),NSV) :: & +!!$REAL, DIMENSION(SIZE(PTHLM,1),SIZE(PTHLM,2),SIZE(PTHLM,3),KSV) :: & REAL, ALLOCATABLE, DIMENSION(:,:,:,:) :: & ZPSI_SV, & ! Prandtl number for scalars ZREDS1, & ! 1D Redelsperger number R_sv @@ -399,10 +404,10 @@ ALLOCATE ( ZBETA(SIZE(PTHLM,1),SIZE(PTHLM,2),SIZE(PTHLM,3)) ,& ZRP(SIZE(PTHLM,1),SIZE(PTHLM,2),SIZE(PTHLM,3)) ) ALLOCATE ( & - ZPSI_SV(SIZE(PTHLM,1),SIZE(PTHLM,2),SIZE(PTHLM,3),NSV), & - ZREDS1(SIZE(PTHLM,1),SIZE(PTHLM,2),SIZE(PTHLM,3),NSV), & - ZRED2THS(SIZE(PTHLM,1),SIZE(PTHLM,2),SIZE(PTHLM,3),NSV), & - ZRED2RS(SIZE(PTHLM,1),SIZE(PTHLM,2),SIZE(PTHLM,3),NSV) ) + ZPSI_SV(SIZE(PTHLM,1),SIZE(PTHLM,2),SIZE(PTHLM,3),KSV), & + ZREDS1(SIZE(PTHLM,1),SIZE(PTHLM,2),SIZE(PTHLM,3),KSV), & + ZRED2THS(SIZE(PTHLM,1),SIZE(PTHLM,2),SIZE(PTHLM,3),KSV), & + ZRED2RS(SIZE(PTHLM,1),SIZE(PTHLM,2),SIZE(PTHLM,3),KSV) ) !---------------------------------------------------------------------------- ! @@ -418,8 +423,8 @@ IKE=KKU-JPVEXT_TURB*KKL ! 3D Redelsperger numbers ! ! -CALL PRANDTL(KKA,KKU,KKL,KRR,KRRI,OTURB_FLX, & - HTURBDIM, OOCEAN, & +CALL PRANDTL(CST,CSTURB,KKA,KKU,KKL,KRR,KRRI,OTURB_FLX, & + HTURBDIM, OOCEAN,OHARAT,O2D, & TPFILE, & PDXX,PDYY,PDZZ,PDZX,PDZY, & PTHVREF,PLOCPEXNM,PATHETA,PAMOIST, & @@ -433,9 +438,9 @@ CALL PRANDTL(KKA,KKU,KKL,KRR,KRRI,OTURB_FLX, & ! Buoyancy coefficient ! IF (OOCEAN) THEN - ZBETA = XG*XALPHAOC + ZBETA = CST%XG*CST%XALPHAOC ELSE - ZBETA = XG/PTHVREF + ZBETA = CST%XG/PTHVREF END IF ! ! Square root of Tke @@ -451,7 +456,7 @@ IF (KRR>0) ZDR_DZ = GZ_M_W(KKA, KKU, KKL,PRM(:,:,:,1),PDZZ) ! ! Denominator factor in 3rd order terms ! -IF (.NOT. LHARAT) THEN +IF (.NOT. OHARAT) THEN ZD(:,:,:) = (1.+ZREDTH1+ZREDR1) * (1.+0.5*(ZREDTH1+ZREDR1)) ELSE ZD(:,:,:) = 1. @@ -461,13 +466,13 @@ ENDIF ! GUSERV = KRR/=0 ! -ZPHI3 = PHI3(ZREDTH1,ZREDR1,ZRED2TH3,ZRED2R3,ZRED2THR3,HTURBDIM,GUSERV) +ZPHI3 = PHI3(CSTURB,ZREDTH1,ZREDR1,ZRED2TH3,ZRED2R3,ZRED2THR3,HTURBDIM,GUSERV) IF(KRR/=0) & -ZPSI3 = PSI3(ZREDR1,ZREDTH1,ZRED2R3,ZRED2TH3,ZRED2THR3,HTURBDIM,GUSERV) +ZPSI3 = PSI3(CSTURB,ZREDR1,ZREDTH1,ZRED2R3,ZRED2TH3,ZRED2THR3,HTURBDIM,GUSERV) ! ! Prandtl numbers for scalars ! -ZPSI_SV = PSI_SV(ZREDTH1,ZREDR1,ZREDS1,ZRED2THS,ZRED2RS,ZPHI3,ZPSI3) +ZPSI_SV = PSI_SV(CSTURB,ZREDTH1,ZREDR1,ZREDS1,ZRED2THS,ZRED2RS,ZPHI3,ZPSI3) ! ! LES diagnostics ! @@ -495,15 +500,15 @@ END IF ! ---------------------------------------------------------------- ! -IF (LHARAT) THEN +IF (OHARAT) THEN ZLM=PLENGTHH ELSE ZLM=PLM ENDIF ! - CALL TURB_VER_THERMO_FLUX(KKA,KKU,KKL,KRR,KRRL,KRRI, & - OTURB_FLX,HTURBDIM,HTOM,OOCEAN, & - PIMPL,PEXPL,PTSTEP, & + CALL TURB_VER_THERMO_FLUX(CST,CSTURB,KKA,KKU,KKL,KRR,KRRL,KRRI, & + OTURB_FLX,HTURBDIM,HTOM,OOCEAN,OHARAT, & + PIMPL,PEXPL,PTSTEP,HPROGRAM, & TPFILE, & PDXX,PDYY,PDZZ,PDZX,PDZY,PDIRCOSZW,PZZ, & PRHODJ,PTHVREF, & @@ -518,8 +523,8 @@ ENDIF MFMOIST,PBL_DEPTH,ZWTHV, & PRTHLS,PRRS,ZTHLP,ZRP,PTP,PWTH,PWRC ) ! - CALL TURB_VER_THERMO_CORR(KKA,KKU,KKL,KRR,KRRL,KRRI, & - OTURB_FLX,HTURBDIM,HTOM, & + CALL TURB_VER_THERMO_CORR(CST,CSTURB,KKA,KKU,KKL,KRR,KRRL,KRRI, & + OTURB_FLX,HTURBDIM,HTOM, OHARAT, & PIMPL,PEXPL, & TPFILE, & PDXX,PDYY,PDZZ,PDZX,PDZY,PDIRCOSZW, & @@ -548,10 +553,10 @@ ENDIF ! ----------------------------------------------- ! ! -IF (LHARAT) ZLM=PLENGTHM +IF (OHARAT) ZLM=PLENGTHM ! -CALL TURB_VER_DYN_FLUX(KKA,KKU,KKL, & - OTURB_FLX,KRR, OOCEAN, & +CALL TURB_VER_DYN_FLUX(CST,CSTURB,KKA,KKU,KKL,KSV,O2D,OFLAT, & + OTURB_FLX,KRR, OOCEAN, OHARAT, & HTURBDIM,PIMPL,PEXPL,PTSTEP, & TPFILE, & PDXX,PDYY,PDZZ,PDZX,PDZY,PDIRCOSZW,PZZ, & @@ -569,11 +574,12 @@ CALL TURB_VER_DYN_FLUX(KKA,KKU,KKL, & !* 8. SOURCES OF PASSIVE SCALAR VARIABLES ! ----------------------------------- ! -IF (LHARAT) ZLM=PLENGTHH +IF (OHARAT) ZLM=PLENGTHH ! IF (SIZE(PSVM,4)>0) & -CALL TURB_VER_SV_FLUX(KKA,KKU,KKL, & - OTURB_FLX,HTURBDIM, & +CALL TURB_VER_SV_FLUX(CST,CSTURB,KKA,KKU,KKL,ONOMIXLG, & + KSV_LGBEG,KSV_LGEND, & + OTURB_FLX,HTURBDIM,OHARAT, & PIMPL,PEXPL,PTSTEP, & TPFILE, & PDZZ,PDIRCOSZW, & @@ -585,8 +591,8 @@ CALL TURB_VER_SV_FLUX(KKA,KKU,KKL, & ! ! IF (SIZE(PSVM,4)>0 .AND. LLES_CALL) & -CALL TURB_VER_SV_CORR(KKA,KKU,KKL,KRR,KRRL,KRRI,OOCEAN, & - PDZZ, & +CALL TURB_VER_SV_CORR(CST,CSTURB,KKA,KKU,KKL,KRR,KRRL,KRRI,OOCEAN, & + PDZZ,KSV,KSV_LGBEG,KSV_LGEND,ONOMIXLG, & PTHLM,PRM,PTHVREF, & PLOCPEXNM,PATHETA,PAMOIST,PSRCM,ZPHI3,ZPSI3, & PWM,PSVM, & @@ -607,7 +613,7 @@ IF (SIZE(PSBL_DEPTH)>0) CALL SBL_DEPTH(IKB,IKE,PZZ,ZWU,ZWV,ZWTHV,PLMO,PSBL_DEPTH ! ------ ! ! -IF ( OTURB_FLX .AND. TPFILE%LOPENED .AND. .NOT. LHARAT) THEN +IF ( OTURB_FLX .AND. TPFILE%LOPENED .AND. .NOT. OHARAT) THEN ! ! stores the Turbulent Prandtl number ! @@ -647,7 +653,7 @@ IF ( OTURB_FLX .AND. TPFILE%LOPENED .AND. .NOT. LHARAT) THEN TZFIELD%NTYPE = TYPEREAL TZFIELD%NDIMS = 3 TZFIELD%LTIMEDEP = .TRUE. - DO JSV=1,NSV + DO JSV=1,KSV WRITE(TZFIELD%CMNHNAME, '("PSI_SV_",I3.3)') JSV TZFIELD%CLONGNAME = TRIM(TZFIELD%CMNHNAME) TZFIELD%CCOMMENT = 'X_Y_Z_'//TRIM(TZFIELD%CMNHNAME) diff --git a/src/common/turb/mode_turb_ver_dyn_flux.F90 b/src/common/turb/mode_turb_ver_dyn_flux.F90 index 12915e63529d9791f97de93bbb1fe0f9cad3846b..a09e3f7f80ef2e9109482812d36bbb8c57a44af9 100644 --- a/src/common/turb/mode_turb_ver_dyn_flux.F90 +++ b/src/common/turb/mode_turb_ver_dyn_flux.F90 @@ -5,8 +5,8 @@ MODULE MODE_TURB_VER_DYN_FLUX IMPLICIT NONE CONTAINS -SUBROUTINE TURB_VER_DYN_FLUX(KKA,KKU,KKL, & - OTURB_FLX,KRR, OOCEAN, & +SUBROUTINE TURB_VER_DYN_FLUX(CST,CSTURB,KKA,KKU,KKL,KSV,O2D,OFLAT, & + OTURB_FLX,KRR, OOCEAN,OHARAT, & HTURBDIM,PIMPL,PEXPL, & PTSTEP, & TPFILE, & @@ -132,15 +132,15 @@ SUBROUTINE TURB_VER_DYN_FLUX(KKA,KKU,KKL, & !! ------------------ !! Module MODD_CST : contains physical constants !! -!! XG : gravity constant +!! CST%XG : gravity constant !! !! Module MODD_CTURB: contains the set of constants for !! the turbulence scheme !! -!! XCMFS,XCMFB : cts for the momentum flux -!! XCSHF : ct for the sensible heat flux -!! XCHF : ct for the moisture flux -!! XCTV,XCHV : cts for the T and moisture variances +!! CSTURB%XCMFS,XCMFB : cts for the momentum flux +!! CSTURB%XCSHF : ct for the sensible heat flux +!! CSTURB%XCHF : ct for the moisture flux +!! CSTURB%XCTV,CSTURB%XCHV : cts for the T and moisture variances !! !! Module MODD_PARAMETERS !! @@ -193,7 +193,7 @@ SUBROUTINE TURB_VER_DYN_FLUX(KKA,KKU,KKL, & !! 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) LHARATU switch +!! Modifications July 2015 (Wim de Rooy) OHARATU switch !! J.Escobar : 15/09/2015 : WENO5 & JPHEXT <> 1 !! Philippe Wautelet: 05/2016-04/2018: new data structures and calls for I/O !! Q. Rodier 17/01/2019 : cleaning : remove cyclic conditions on DP and ZA @@ -206,13 +206,11 @@ SUBROUTINE TURB_VER_DYN_FLUX(KKA,KKU,KKL, & USE PARKIND1, ONLY : JPRB USE YOMHOOK , ONLY : LHOOK, DR_HOOK ! -USE MODD_CONF -USE MODD_CST -USE MODD_CTURB +USE MODD_CST, ONLY: CST_t +USE MODD_CTURB, ONLY: CSTURB_t USE MODD_FIELD, ONLY: TFIELDDATA, TYPEREAL USE MODD_IO, ONLY: TFILEDATA USE MODD_LES -USE MODD_NSV USE MODD_OCEANH USE MODD_PARAMETERS USE MODD_REF, ONLY : LCOUPLES @@ -238,12 +236,18 @@ IMPLICIT NONE ! ! ! +TYPE(CST_t), INTENT(IN) :: CST +TYPE(CSTURB_t), INTENT(IN) :: CSTURB 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) :: KSV ! number of scalar variables LOGICAL, INTENT(IN) :: OTURB_FLX ! switch to write the ! turbulent fluxes in the syncronous FM-file LOGICAL, INTENT(IN) :: OOCEAN ! switch for Ocean model version +LOGICAL, INTENT(IN) :: OHARAT +LOGICAL, INTENT(IN) :: O2D ! Logical for 2D model version (modd_conf) +LOGICAL, INTENT(IN) :: OFLAT ! Logical for zero ororography INTEGER, INTENT(IN) :: KRR ! number of moist var. CHARACTER(len=4), INTENT(IN) :: HTURBDIM ! dimensionality of the ! turbulence scheme @@ -350,16 +354,16 @@ IKTE=IKT-JPVEXT_TURB ! ZSOURCE = 0. ZFLXZ = 0. -ZCMFS = XCMFS -IF (LHARAT) ZCMFS=1. +ZCMFS = CSTURB%XCMFS +IF (OHARAT) ZCMFS=1. ! ZDIRSINZW(:,:) = SQRT(1.-PDIRCOSZW(:,:)**2) ! compute the coefficients for the uncentred gradient computation near the ! ground ! -! With LHARATU length scale and TKE are at half levels so remove MZM +! With OHARATU length scale and TKE are at half levels so remove MZM ! -IF (LHARAT) THEN +IF (OHARAT) THEN ZKEFF(:,:,:) = PLM(:,:,:) * SQRT(PTKEM(:,:,:)) + 50*MFMOIST(:,:,:) ELSE ZKEFF(:,:,:) = MZM(PLM(:,:,:) * SQRT(PTKEM(:,:,:)), KKA, KKU, KKL) @@ -536,7 +540,7 @@ IF(HTURBDIM=='3DIM') THEN END IF ! - IF (.NOT. LFLAT) THEN + IF (.NOT. OFLAT) THEN PRWS(:,:,:)= PRWS & -DXF( MZM(MXM(PRHODJ) /PDXX, KKA, KKU, KKL) * ZFLXZ ) & +DZM(PRHODJ / MZF(PDZZ, KKA, KKU, KKL) * & @@ -593,7 +597,7 @@ END IF CALL LES_MEAN_SUBGRID(MXF(GX_U_M(PRM(:,:,:,1),PDXX,PDZZ,PDZX, KKA, KKU, KKL)& *MZF(ZFLXZ, KKA, KKU, KKL)),X_LES_RES_ddxa_Rt_SBG_UaW ) END IF - DO JSV=1,NSV + DO JSV=1,KSV CALL LES_MEAN_SUBGRID( MXF(GX_U_M(PSVM(:,:,:,JSV),PDXX,PDZZ,& PDZX, KKA, KKU, KKL)*MZF(ZFLXZ, KKA, KKU, KKL)),X_LES_RES_ddxa_Sv_SBG_UaW(:,:,:,JSV) ) END DO @@ -764,8 +768,8 @@ IF(HTURBDIM=='3DIM') THEN ZFLXZ(:,:,KKU) = 2 * ZFLXZ(:,:,IKE) - ZFLXZ(:,:,IKE-KKL) ! extrapolation END IF ! - IF (.NOT. L2D) THEN - IF (.NOT. LFLAT) THEN + IF (.NOT. O2D) THEN + IF (.NOT. OFLAT) THEN PRWS(:,:,:)= PRWS(:,:,:) & -DYF( MZM(MYM(PRHODJ) /PDYY, KKA, KKU, KKL) * ZFLXZ ) & +DZM(PRHODJ / MZF(PDZZ, KKA, KKU, KKL) * & @@ -777,7 +781,7 @@ IF(HTURBDIM=='3DIM') THEN END IF ! ! Complete the Dynamical production with the W wind component - IF (.NOT. L2D) THEN + IF (.NOT. O2D) THEN ZA(:,:,:) = - MZF(MYF(ZFLXZ * GY_W_VW(PWM,PDYY,PDZZ,PDZY, KKA, KKU, KKL)), KKA, KKU, KKL) ! ! evaluate the dynamic production at w(IKB+KKL) in PDP(IKB) diff --git a/src/common/turb/mode_turb_ver_sv_corr.F90 b/src/common/turb/mode_turb_ver_sv_corr.F90 index 9fb527829b7e3db91ac9bde036de9a18889a7bff..79a32ef71e834f57590fa47f1043bb535da3bd09 100644 --- a/src/common/turb/mode_turb_ver_sv_corr.F90 +++ b/src/common/turb/mode_turb_ver_sv_corr.F90 @@ -5,8 +5,8 @@ MODULE MODE_TURB_VER_SV_CORR IMPLICIT NONE CONTAINS -SUBROUTINE TURB_VER_SV_CORR(KKA,KKU,KKL,KRR,KRRL,KRRI,OOCEAN, & - PDZZ, & +SUBROUTINE TURB_VER_SV_CORR(CST,CSTURB,KKA,KKU,KKL,KRR,KRRL,KRRI,OOCEAN,& + PDZZ,KSV,KSV_LGBEG,KSV_LGEND,ONOMIXLG, & PTHLM,PRM,PTHVREF, & PLOCPEXNM,PATHETA,PAMOIST,PSRCM,PPHI3,PPSI3, & PWM,PSVM, & @@ -55,12 +55,10 @@ SUBROUTINE TURB_VER_SV_CORR(KKA,KKU,KKL,KRR,KRRL,KRRI,OOCEAN, & USE PARKIND1, ONLY : JPRB USE YOMHOOK , ONLY : LHOOK, DR_HOOK ! -USE MODD_CST -USE MODD_CTURB +USE MODD_CST, ONLY: CST_t +USE MODD_CTURB, ONLY: CSTURB_t USE MODD_PARAMETERS USE MODD_LES -USE MODD_CONF -USE MODD_NSV, ONLY : NSV,NSV_LGBEG,NSV_LGEND USE MODD_BLOWSNOW ! ! @@ -81,9 +79,13 @@ IMPLICIT NONE ! ! ! +TYPE(CST_t), INTENT(IN) :: CST +TYPE(CSTURB_t), INTENT(IN) :: CSTURB INTEGER, INTENT(IN) :: KKA, KKU ! near ground and uppest atmosphere array indexes INTEGER, INTENT(IN) :: KKL ! +1 if grid goes from ground to atmosphere top, -1 otherwise +INTEGER, INTENT(IN) :: KSV, KSV_LGBEG, KSV_LGEND ! number of scalar variables LOGICAL, INTENT(IN) :: OOCEAN ! switch for Ocean model version +LOGICAL, INTENT(IN) :: ONOMIXLG ! to use turbulence for lagrangian variables (modd_conf) INTEGER, INTENT(IN) :: KRR ! number of moist var. INTEGER, INTENT(IN) :: KRRL ! number of liquid var. INTEGER, INTENT(IN) :: KRRI ! number of ice var. @@ -133,14 +135,14 @@ CALL SECOND_MNH(ZTIME1) ! IF(LBLOWSNOW) THEN ! See Vionnet (PhD, 2012) for a complete discussion around the value of the Schmidt number for blowing snow variables - ZCSV= XCHF/XRSNOW + ZCSV= CSTURB%XCHF/XRSNOW ELSE - ZCSV= XCHF + ZCSV= CSTURB%XCHF ENDIF ! -DO JSV=1,NSV +DO JSV=1,KSV ! - IF (LNOMIXLG .AND. JSV >= NSV_LGBEG .AND. JSV<= NSV_LGEND) CYCLE + IF (ONOMIXLG .AND. JSV >= KSV_LGBEG .AND. JSV<= KSV_LGEND) CYCLE ! ! variance Sv2 ! @@ -157,12 +159,12 @@ DO JSV=1,NSV IF (LLES_CALL) THEN ! approximation: diagnosed explicitely (without implicit term) ZA(:,:,:) = ETHETA(KRR,KRRI,PTHLM,PRM,PLOCPEXNM,PATHETA,PSRCM,OOCEAN) - ZFLXZ(:,:,:)= ( XCSHF * PPHI3 + ZCSV * PPSI_SV(:,:,:,JSV) ) & + ZFLXZ(:,:,:)= ( CSTURB%XCSHF * PPHI3 + ZCSV * PPSI_SV(:,:,:,JSV) ) & * GZ_M_W(KKA, KKU, KKL,PTHLM,PDZZ) & * GZ_M_W(KKA, KKU, KKL,PSVM(:,:,:,JSV),PDZZ) ZFLXZ(:,:,:)= PLM * PLEPS / (2.*ZCTSVD) * MZF(ZFLXZ, KKA, KKU, KKL) CALL LES_MEAN_SUBGRID( ZA*ZFLXZ, X_LES_SUBGRID_SvThv(:,:,:,JSV) ) - CALL LES_MEAN_SUBGRID( -XG/PTHVREF/3.*ZA*ZFLXZ, X_LES_SUBGRID_SvPz(:,:,:,JSV), .TRUE.) + CALL LES_MEAN_SUBGRID( -CST%XG/PTHVREF/3.*ZA*ZFLXZ, X_LES_SUBGRID_SvPz(:,:,:,JSV), .TRUE.) ! IF (KRR>=1) THEN ZA(:,:,:) = EMOIST(KRR,KRRI,PTHLM,PRM,PLOCPEXNM,PAMOIST,PSRCM,OOCEAN) @@ -171,7 +173,7 @@ DO JSV=1,NSV * GZ_M_W(KKA, KKU, KKL,PSVM(:,:,:,JSV),PDZZ) ZFLXZ(:,:,:)= PLM * PLEPS / (2.*ZCQSVD) * MZF(ZFLXZ, KKA, KKU, KKL) CALL LES_MEAN_SUBGRID( ZA*ZFLXZ, X_LES_SUBGRID_SvThv(:,:,:,JSV) , .TRUE.) - CALL LES_MEAN_SUBGRID( -XG/PTHVREF/3.*ZA*ZFLXZ, X_LES_SUBGRID_SvPz(:,:,:,JSV), .TRUE.) + CALL LES_MEAN_SUBGRID( -CST%XG/PTHVREF/3.*ZA*ZFLXZ, X_LES_SUBGRID_SvPz(:,:,:,JSV), .TRUE.) END IF END IF ! diff --git a/src/common/turb/mode_turb_ver_sv_flux.F90 b/src/common/turb/mode_turb_ver_sv_flux.F90 index 271ee734e6aabd3d2cda09b7eba343113fa6e402..8fee07a4036efc5590ae6de8b5653fdf40c74c96 100644 --- a/src/common/turb/mode_turb_ver_sv_flux.F90 +++ b/src/common/turb/mode_turb_ver_sv_flux.F90 @@ -5,8 +5,9 @@ MODULE MODE_TURB_VER_SV_FLUX IMPLICIT NONE CONTAINS -SUBROUTINE TURB_VER_SV_FLUX(KKA,KKU,KKL, & - OTURB_FLX,HTURBDIM, & +SUBROUTINE TURB_VER_SV_FLUX(CST,CSTURB,KKA,KKU,KKL,ONOMIXLG, & + KSV_LGBEG,KSV_LGEND, & + OTURB_FLX,HTURBDIM,OHARAT, & PIMPL,PEXPL, & PTSTEP, & TPFILE, & @@ -133,15 +134,15 @@ SUBROUTINE TURB_VER_SV_FLUX(KKA,KKU,KKL, & !! ------------------ !! Module MODD_CST : contains physical constants !! -!! XG : gravity constant +!! CST%XG : gravity constant !! !! Module MODD_CTURB: contains the set of constants for !! the turbulence scheme !! -!! XCMFS,XCMFB : cts for the momentum flux -!! XCSHF : ct for the sensible heat flux -!! XCHF : ct for the moisture flux -!! XCTV,XCHV : cts for the T and moisture variances +!! CSTURB%XCMFS,XCMFB : cts for the momentum flux +!! CSTURB%XCSHF : ct for the sensible heat flux +!! CSTURB%XCHF : ct for the moisture flux +!! CSTURB%XCTV,CSTURB%XCHV : cts for the T and moisture variances !! !! Module MODD_PARAMETERS !! @@ -197,7 +198,7 @@ SUBROUTINE TURB_VER_SV_FLUX(KKA,KKU,KKL, & !! change of YCOMMENT !! Feb 2012(Y. Seity) add possibility to run with reversed !! vertical levels -!! Modifications: July 2015 (Wim de Rooy) LHARAT switch +!! Modifications: July 2015 (Wim de Rooy) OHARAT switch !! Feb 2017(M. Leriche) add initialisation of ZSOURCE !! to avoid unknwon values outside physical domain !! and avoid negative values in sv tendencies @@ -210,14 +211,12 @@ SUBROUTINE TURB_VER_SV_FLUX(KKA,KKU,KKL, & USE PARKIND1, ONLY : JPRB USE YOMHOOK , ONLY : LHOOK, DR_HOOK ! -USE MODD_CST -USE MODD_CTURB +USE MODD_CST, ONLY: CST_t +USE MODD_CTURB, ONLY: CSTURB_t USE MODD_FIELD, ONLY: TFIELDDATA, TYPEREAL USE MODD_IO, ONLY: TFILEDATA USE MODD_PARAMETERS USE MODD_LES -USE MODD_CONF -USE MODD_NSV, ONLY: XSVMIN, NSV_LGBEG, NSV_LGEND USE MODD_BLOWSNOW USE MODE_IO_FIELD_WRITE, ONLY: IO_FIELD_WRITE ! @@ -238,13 +237,18 @@ IMPLICIT NONE !* 0.1 declarations of arguments ! ! +TYPE(CST_t), INTENT(IN) :: CST +TYPE(CSTURB_t), INTENT(IN) :: CSTURB 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) :: KSV_LGBEG, KSV_LGEND ! number of scalar variables LOGICAL, INTENT(IN) :: OTURB_FLX ! switch to write the ! turbulent fluxes in the syncronous FM-file +LOGICAL, INTENT(IN) :: ONOMIXLG ! to use turbulence for lagrangian variables (modd_conf) CHARACTER(len=4), INTENT(IN) :: HTURBDIM ! dimensionality of the ! turbulence scheme +LOGICAL, INTENT(IN) :: OHARAT REAL, INTENT(IN) :: PIMPL, PEXPL ! Coef. for temporal disc. REAL, INTENT(IN) :: PTSTEP ! Double Time Step TYPE(TFILEDATA), INTENT(IN) :: TPFILE ! Output file @@ -319,7 +323,7 @@ IKTB =1+JPVEXT_TURB ! ISV=SIZE(PSVM,4) ! -IF (LHARAT) THEN +IF (OHARAT) THEN ZKEFF(:,:,:) = PLM(:,:,:) * SQRT(PTKEM(:,:,:)) + 50.*MFMOIST(:,:,:) ELSE ZKEFF(:,:,:) = MZM(PLM(:,:,:) * SQRT(PTKEM(:,:,:)), KKA, KKU, KKL) @@ -327,9 +331,9 @@ ENDIF ! IF(LBLOWSNOW) THEN ! See Vionnet (PhD, 2012) for a complete discussion around the value of the Schmidt number for blowing snow variables - ZCSV= XCHF/XRSNOW + ZCSV= CSTURB%XCHF/XRSNOW ELSE - ZCSV= XCHF + ZCSV= CSTURB%XCHF ENDIF !---------------------------------------------------------------------------- ! @@ -338,10 +342,10 @@ ENDIF ! DO JSV=1,ISV ! - IF (LNOMIXLG .AND. JSV >= NSV_LGBEG .AND. JSV<= NSV_LGEND) CYCLE + IF (ONOMIXLG .AND. JSV >= KSV_LGBEG .AND. JSV<= KSV_LGEND) CYCLE ! ! Preparation of the arguments for TRIDIAG - IF (LHARAT) THEN + IF (OHARAT) THEN ZA(:,:,:) = -PTSTEP* & ZKEFF * MZM(PRHODJ, KKA, KKU, KKL) / & PDZZ**2 diff --git a/src/common/turb/mode_turb_ver_thermo_corr.F90 b/src/common/turb/mode_turb_ver_thermo_corr.F90 index db08f0ce62947783ab09870fd2b49ff4d4245f2d..9edb09f531ec8a450a1cec4dd16fd6f25f21a28a 100644 --- a/src/common/turb/mode_turb_ver_thermo_corr.F90 +++ b/src/common/turb/mode_turb_ver_thermo_corr.F90 @@ -5,8 +5,8 @@ MODULE MODE_TURB_VER_THERMO_CORR IMPLICIT NONE CONTAINS -SUBROUTINE TURB_VER_THERMO_CORR(KKA,KKU,KKL,KRR,KRRL,KRRI, & - OTURB_FLX,HTURBDIM,HTOM, & +SUBROUTINE TURB_VER_THERMO_CORR(CST,CSTURB,KKA,KKU,KKL,KRR,KRRL,KRRI, & + OTURB_FLX,HTURBDIM,HTOM,OHARAT, & PIMPL,PEXPL, & TPFILE, & PDXX,PDYY,PDZZ,PDZX,PDZY,PDIRCOSZW, & @@ -131,15 +131,15 @@ SUBROUTINE TURB_VER_THERMO_CORR(KKA,KKU,KKL,KRR,KRRL,KRRI, & !! ------------------ !! Module MODD_CST : contains physical constants !! -!! XG : gravity constant +!! CST%XG : gravity constant !! !! Module MODD_CTURB: contains the set of constants for !! the turbulence scheme !! -!! XCMFS,XCMFB : cts for the momentum flux -!! XCSHF : ct for the sensible heat flux -!! XCHF : ct for the moisture flux -!! XCTV,XCHV : cts for the T and moisture variances +!! CSTURB%XCMFS,XCMFB : cts for the momentum flux +!! CSTURB%XCSHF : ct for the sensible heat flux +!! CSTURB%XCHF : ct for the moisture flux +!! CSTURB%XCTV,CSTURB%XCHV : cts for the T and moisture variances !! !! Module MODD_PARAMETERS !! @@ -195,7 +195,7 @@ SUBROUTINE TURB_VER_THERMO_CORR(KKA,KKU,KKL,KRR,KRRL,KRRI, & !! change of YCOMMENT !! 2012-02 (Y. Seity) add possibility to run with reversed !! vertical levels -!! Modifications July 2015 (Wim de Rooy) LHARAT switch +!! Modifications July 2015 (Wim de Rooy) OHARAT switch !! Philippe Wautelet: 05/2016-04/2018: new data structures and calls for I/O !!-------------------------------------------------------------------------- ! @@ -204,12 +204,12 @@ SUBROUTINE TURB_VER_THERMO_CORR(KKA,KKU,KKL,KRR,KRRL,KRRI, & ! USE PARKIND1, ONLY : JPRB USE YOMHOOK , ONLY : LHOOK, DR_HOOK -USE MODD_CST -USE MODD_CTURB +USE MODD_CST, ONLY: CST_t +USE MODD_CTURB, ONLY: CSTURB_t USE MODD_FIELD, ONLY: TFIELDDATA, TYPEREAL USE MODD_IO, ONLY: TFILEDATA USE MODD_PARAMETERS -USE MODD_CONF +!USE MODD_CONF USE MODD_LES ! USE MODI_GRADIENT_U @@ -230,6 +230,8 @@ IMPLICIT NONE ! ! ! +TYPE(CST_t), INTENT(IN) :: CST +TYPE(CSTURB_t), INTENT(IN) :: CSTURB 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 @@ -241,6 +243,7 @@ LOGICAL, INTENT(IN) :: OTURB_FLX ! switch to write the CHARACTER(len=4), INTENT(IN) :: HTURBDIM ! dimensionality of the ! turbulence scheme CHARACTER(len=4), INTENT(IN) :: HTOM ! type of Third Order Moment +LOGICAL, INTENT(IN) :: OHARAT REAL, INTENT(IN) :: PIMPL, PEXPL ! Coef. for temporal disc. TYPE(TFILEDATA), INTENT(IN) :: TPFILE ! Output file ! @@ -270,7 +273,7 @@ REAL, DIMENSION(:,:,:,:), INTENT(IN) :: PRM ! Mixing ratios REAL, DIMENSION(:,:,:,:), INTENT(IN) :: PSVM ! Mixing ratios ! REAL, DIMENSION(:,:,:), INTENT(IN) :: PTKEM ! TKE at time t -! In case LHARATU=TRUE, PLM already includes all stability corrections +! In case OHARATU=TRUE, PLM already includes all stability corrections REAL, DIMENSION(:,:,:), INTENT(IN) :: PLM ! Turb. mixing length REAL, DIMENSION(:,:,:), INTENT(IN) :: PLEPS ! dissipative length REAL, DIMENSION(:,:,:), INTENT(IN) :: PLOCPEXNM ! Lv(T)/Cp/Exnref at time t-1 @@ -318,7 +321,7 @@ REAL, DIMENSION(SIZE(PTHLM,1),SIZE(PTHLM,2),SIZE(PTHLM,3)) :: & ZDFDDTDZ, & ! dF/d(dTh/dz) ZDFDDRDZ, & ! dF/d(dr/dz) Z3RDMOMENT, & ! 3 order term in flux or variance equation -! Estimate of full level length and dissipation length scale in case LHARATU +! Estimate of full level length and dissipation length scale in case OHARATU PLMF, & ! estimate full level length scale from half levels (sub optimal) PLEPSF ! estimate full level diss length scale from half levels (sub optimal) @@ -373,7 +376,7 @@ ZCOEFF(:,:,IKB)= - (PDZZ(:,:,IKB+2*KKL)+2.*PDZZ(:,:,IKB+KKL)) / & ( (PDZZ(:,:,IKB+2*KKL)+PDZZ(:,:,IKB+KKL)) * PDZZ(:,:,IKB+KKL) ) ! ! -IF (LHARAT) THEN +IF (OHARAT) THEN PLMF=MZF(PLM, KKA, KKU, KKL) PLEPSF=PLMF ! function MZF produces -999 for level IKU (82 for 80 levels) @@ -413,10 +416,10 @@ END IF ! ! Compute the turbulent variance F and F' at time t-dt. ! -IF (LHARAT) THEN +IF (OHARAT) THEN ZF (:,:,:) = PLMF*PLEPSF*MZF(PDTH_DZ**2, KKA, KKU, KKL) ELSE - ZF (:,:,:) = XCTV*PLM*PLEPS*MZF(PPHI3*PDTH_DZ**2, KKA, KKU, KKL) + ZF (:,:,:) = CSTURB%XCTV*PLM*PLEPS*MZF(PPHI3*PDTH_DZ**2, KKA, KKU, KKL) ENDIF ZDFDDTDZ(:,:,:) = 0. ! this term, because of discretization, is treated separately ! @@ -424,55 +427,55 @@ ENDIF ! ! d(w'th'2)/dz IF (GFTH2) THEN - ZF = ZF + M3_TH2_WTH2(KKA,KKU,KKL,PREDTH1,PREDR1,PD,PLEPS,& + ZF = ZF + M3_TH2_WTH2(CSTURB,KKA,KKU,KKL,PREDTH1,PREDR1,PD,PLEPS,& & PSQRT_TKE) * PFTH2 - ZDFDDTDZ = ZDFDDTDZ + D_M3_TH2_WTH2_O_DDTDZ(KKA,KKU,KKL,PREDTH1,PREDR1,& + ZDFDDTDZ = ZDFDDTDZ + D_M3_TH2_WTH2_O_DDTDZ(CSTURB,KKA,KKU,KKL,PREDTH1,PREDR1,& & PD,PLEPS,PSQRT_TKE,PBLL_O_E,PETHETA) * PFTH2 END IF ! ! d(w'2th')/dz IF (GFWTH) THEN - ZF = ZF + M3_TH2_W2TH(KKA,KKU,KKL,PREDTH1,PREDR1,PD,PDTH_DZ,& + ZF = ZF + M3_TH2_W2TH(CSTURB,KKA,KKU,KKL,PREDTH1,PREDR1,PD,PDTH_DZ,& & PLM,PLEPS,PTKEM) * MZF(PFWTH, KKA, KKU, KKL) - ZDFDDTDZ = ZDFDDTDZ + D_M3_TH2_W2TH_O_DDTDZ(KKA,KKU,KKL,PREDTH1,PREDR1,PD,& + ZDFDDTDZ = ZDFDDTDZ + D_M3_TH2_W2TH_O_DDTDZ(CSTURB,KKA,KKU,KKL,PREDTH1,PREDR1,PD,& & PLM,PLEPS,PTKEM,GUSERV) * MZF(PFWTH, KKA, KKU, KKL) END IF ! IF (KRR/=0) THEN ! d(w'r'2)/dz IF (GFR2) THEN - ZF = ZF + M3_TH2_WR2(KKA,KKU,KKL,PD,PLEPS,PSQRT_TKE,PBLL_O_E,& + ZF = ZF + M3_TH2_WR2(CSTURB,KKA,KKU,KKL,PD,PLEPS,PSQRT_TKE,PBLL_O_E,& & PEMOIST,PDTH_DZ) * PFR2 - ZDFDDTDZ = ZDFDDTDZ + D_M3_TH2_WR2_O_DDTDZ(KKA,KKU,KKL,PREDTH1,PREDR1,PD,& + ZDFDDTDZ = ZDFDDTDZ + D_M3_TH2_WR2_O_DDTDZ(CSTURB,KKA,KKU,KKL,PREDTH1,PREDR1,PD,& & PLEPS,PSQRT_TKE,PBLL_O_E,PEMOIST,PDTH_DZ) * PFR2 END IF ! ! d(w'2r')/dz IF (GFWR) THEN - ZF = ZF + M3_TH2_W2R(KKA,KKU,KKL,PD,PLM,PLEPS,PTKEM,PBLL_O_E,& + ZF = ZF + M3_TH2_W2R(CSTURB,KKA,KKU,KKL,PD,PLM,PLEPS,PTKEM,PBLL_O_E,& & PEMOIST,PDTH_DZ) * MZF(PFWR, KKA, KKU, KKL) - ZDFDDTDZ = ZDFDDTDZ + D_M3_TH2_W2R_O_DDTDZ(KKA,KKU,KKL,PREDTH1,PREDR1,PD,& + ZDFDDTDZ = ZDFDDTDZ + D_M3_TH2_W2R_O_DDTDZ(CSTURB,KKA,KKU,KKL,PREDTH1,PREDR1,PD,& & PLM,PLEPS,PTKEM,PBLL_O_E,PEMOIST,PDTH_DZ) * MZF(PFWR, KKA, KKU, KKL) END IF ! ! d(w'th'r')/dz IF (GFTHR) THEN - ZF = ZF + M3_TH2_WTHR(KKA,KKU,KKL,PREDR1,PD,PLEPS,PSQRT_TKE,& + ZF = ZF + M3_TH2_WTHR(CSTURB,KKA,KKU,KKL,PREDR1,PD,PLEPS,PSQRT_TKE,& & PBLL_O_E,PEMOIST,PDTH_DZ) * PFTHR - ZDFDDTDZ = ZDFDDTDZ + D_M3_TH2_WTHR_O_DDTDZ(KKA,KKU,KKL,PREDTH1,PREDR1,& + ZDFDDTDZ = ZDFDDTDZ + D_M3_TH2_WTHR_O_DDTDZ(CSTURB,KKA,KKU,KKL,PREDTH1,PREDR1,& & PD,PLEPS,PSQRT_TKE,PBLL_O_E,PEMOIST,PDTH_DZ) * PFTHR END IF END IF ! ZFLXZ(:,:,:) = ZF & - ! + PIMPL * XCTV*PLM*PLEPS & + ! + PIMPL * CSTURB%XCTV*PLM*PLEPS & ! *MZF(D_PHI3DTDZ2_O_DDTDZ(PPHI3,PREDTH1,PREDR1,PRED2TH3,PRED2THR3,PDTH_DZ,HTURBDIM,GUSERV) & ! *DZM(PTHLP - PTHLM, KKA, KKU, KKL) / PDZZ ) & + PIMPL * ZDFDDTDZ * MZF(DZM(PTHLP - PTHLM, KKA, KKU, KKL) / PDZZ, KKA, KKU, KKL) ! ! special case near the ground ( uncentred gradient ) - IF (LHARAT) THEN + IF (OHARAT) THEN ZFLXZ(:,:,IKB) = PLMF(:,:,IKB) & * PLEPSF(:,:,IKB) & *( PEXPL * & @@ -485,7 +488,7 @@ ENDIF +ZCOEFF(:,:,IKB )*PTHLP(:,:,IKB ) )**2 & ) ELSE - ZFLXZ(:,:,IKB) = XCTV * PPHI3(:,:,IKB+KKL) * PLM(:,:,IKB) & + ZFLXZ(:,:,IKB) = CSTURB%XCTV * PPHI3(:,:,IKB+KKL) * PLM(:,:,IKB) & * PLEPS(:,:,IKB) & *( PEXPL * & ( ZCOEFF(:,:,IKB+2*KKL)*PTHLM(:,:,IKB+2*KKL) & @@ -528,9 +531,9 @@ ENDIF CALL SECOND_MNH(ZTIME1) CALL LES_MEAN_SUBGRID(ZFLXZ, X_LES_SUBGRID_Thl2 ) CALL LES_MEAN_SUBGRID(MZF(PWM, KKA, KKU, KKL)*ZFLXZ, X_LES_RES_W_SBG_Thl2 ) - CALL LES_MEAN_SUBGRID(-2.*XCTD*PSQRT_TKE*ZFLXZ/PLEPS, X_LES_SUBGRID_DISS_Thl2 ) + CALL LES_MEAN_SUBGRID(-2.*CSTURB%XCTD*PSQRT_TKE*ZFLXZ/PLEPS, X_LES_SUBGRID_DISS_Thl2 ) CALL LES_MEAN_SUBGRID(PETHETA*ZFLXZ, X_LES_SUBGRID_ThlThv ) - CALL LES_MEAN_SUBGRID(-XA3*PBETA*PETHETA*ZFLXZ, X_LES_SUBGRID_ThlPz, .TRUE. ) + CALL LES_MEAN_SUBGRID(-CSTURB%XA3*PBETA*PETHETA*ZFLXZ, X_LES_SUBGRID_ThlPz, .TRUE. ) CALL SECOND_MNH(ZTIME2) XTIME_LES = XTIME_LES + ZTIME2 - ZTIME1 END IF @@ -541,10 +544,10 @@ ENDIF ! ! ! Compute the turbulent variance F and F' at time t-dt. -IF (LHARAT) THEN +IF (OHARAT) THEN ZF (:,:,:) = PLMF*PLEPSF*MZF(PDTH_DZ*PDR_DZ, KKA, KKU, KKL) ELSE - ZF (:,:,:) = XCTV*PLM*PLEPS*MZF(0.5*(PPHI3+PPSI3)*PDTH_DZ*PDR_DZ, KKA, KKU, KKL) + ZF (:,:,:) = CSTURB%XCTV*PLM*PLEPS*MZF(0.5*(PPHI3+PPSI3)*PDTH_DZ*PDR_DZ, KKA, KKU, KKL) ENDIF ZDFDDTDZ(:,:,:) = 0. ! this term, because of discretization, is treated separately ZDFDDRDZ(:,:,:) = 0. ! this term, because of discretization, is treated separately @@ -553,55 +556,55 @@ ENDIF ! ! d(w'th'2)/dz IF (GFTH2) THEN - ZF = ZF + M3_THR_WTH2(KKA,KKU,KKL,PREDR1,PD,PLEPS,PSQRT_TKE,& + ZF = ZF + M3_THR_WTH2(CSTURB,KKA,KKU,KKL,PREDR1,PD,PLEPS,PSQRT_TKE,& & PBLL_O_E,PETHETA,PDR_DZ) * PFTH2 - ZDFDDTDZ = ZDFDDTDZ + D_M3_THR_WTH2_O_DDTDZ(KKA,KKU,KKL,PREDTH1,PREDR1,& + ZDFDDTDZ = ZDFDDTDZ + D_M3_THR_WTH2_O_DDTDZ(CSTURB,KKA,KKU,KKL,PREDTH1,PREDR1,& & PD,PLEPS,PSQRT_TKE,PBLL_O_E,PETHETA,PDR_DZ) * PFTH2 - ZDFDDRDZ = ZDFDDRDZ + D_M3_THR_WTH2_O_DDRDZ(KKA,KKU,KKL,PREDTH1,PREDR1,& + ZDFDDRDZ = ZDFDDRDZ + D_M3_THR_WTH2_O_DDRDZ(CSTURB,KKA,KKU,KKL,PREDTH1,PREDR1,& & PD,PLEPS,PSQRT_TKE,PBLL_O_E,PETHETA) * PFTH2 END IF ! ! d(w'2th')/dz IF (GFWTH) THEN - ZF = ZF + M3_THR_W2TH(KKA,KKU,KKL,PREDR1,PD,PLM,PLEPS,PTKEM,& + ZF = ZF + M3_THR_W2TH(CSTURB,KKA,KKU,KKL,PREDR1,PD,PLM,PLEPS,PTKEM,& & PDR_DZ) * MZF(PFWTH, KKA, KKU, KKL) - ZDFDDTDZ = ZDFDDTDZ + D_M3_THR_W2TH_O_DDTDZ(KKA,KKU,KKL,PREDTH1,PREDR1,& + ZDFDDTDZ = ZDFDDTDZ + D_M3_THR_W2TH_O_DDTDZ(CSTURB,KKA,KKU,KKL,PREDTH1,PREDR1,& & PD,PLM,PLEPS,PTKEM,PBLL_O_E,PDR_DZ,PETHETA) * MZF(PFWTH, KKA, KKU, KKL) - ZDFDDRDZ = ZDFDDRDZ + D_M3_THR_W2TH_O_DDRDZ(KKA,KKU,KKL,PREDTH1,PREDR1,& + ZDFDDRDZ = ZDFDDRDZ + D_M3_THR_W2TH_O_DDRDZ(CSTURB,KKA,KKU,KKL,PREDTH1,PREDR1,& & PD,PLM,PLEPS,PTKEM) * MZF(PFWTH, KKA, KKU, KKL) END IF ! ! d(w'r'2)/dz IF (GFR2) THEN - ZF = ZF + M3_THR_WR2(KKA,KKU,KKL,PREDTH1,PD,PLEPS,PSQRT_TKE,& + ZF = ZF + M3_THR_WR2(CSTURB,KKA,KKU,KKL,PREDTH1,PD,PLEPS,PSQRT_TKE,& & PBLL_O_E,PEMOIST,PDTH_DZ) * PFR2 - ZDFDDTDZ = ZDFDDTDZ + D_M3_THR_WR2_O_DDTDZ(KKA,KKU,KKL,PREDR1,PREDTH1,PD,& + ZDFDDTDZ = ZDFDDTDZ + D_M3_THR_WR2_O_DDTDZ(CSTURB,KKA,KKU,KKL,PREDR1,PREDTH1,PD,& & PLEPS,PSQRT_TKE,PBLL_O_E,PEMOIST) * PFR2 - ZDFDDRDZ = ZDFDDRDZ + D_M3_THR_WR2_O_DDRDZ(KKA,KKU,KKL,PREDR1,PREDTH1,PD,& + ZDFDDRDZ = ZDFDDRDZ + D_M3_THR_WR2_O_DDRDZ(CSTURB,KKA,KKU,KKL,PREDR1,PREDTH1,PD,& & PLEPS,PSQRT_TKE,PBLL_O_E,PEMOIST,PDTH_DZ) * PFR2 END IF ! ! d(w'2r')/dz IF (GFWR) THEN - ZF = ZF + M3_THR_W2R(KKA,KKU,KKL,PREDTH1,PD,PLM,PLEPS,PTKEM,& + ZF = ZF + M3_THR_W2R(CSTURB,KKA,KKU,KKL,PREDTH1,PD,PLM,PLEPS,PTKEM,& & PDTH_DZ) * MZF(PFWR, KKA, KKU, KKL) - ZDFDDTDZ = ZDFDDTDZ + D_M3_THR_W2R_O_DDTDZ(KKA,KKU,KKL,PREDR1,PREDTH1,PD,& + ZDFDDTDZ = ZDFDDTDZ + D_M3_THR_W2R_O_DDTDZ(CSTURB,KKA,KKU,KKL,PREDR1,PREDTH1,PD,& & PLM,PLEPS,PTKEM) * MZF(PFWR, KKA, KKU, KKL) - ZDFDDRDZ = ZDFDDRDZ + D_M3_THR_W2R_O_DDRDZ(KKA,KKU,KKL,PREDR1,PREDTH1,PD,& + ZDFDDRDZ = ZDFDDRDZ + D_M3_THR_W2R_O_DDRDZ(CSTURB,KKA,KKU,KKL,PREDR1,PREDTH1,PD,& & PLM,PLEPS,PTKEM,PBLL_O_E,PDTH_DZ,PEMOIST) * MZF(PFWR, KKA, KKU, KKL) END IF ! ! d(w'th'r')/dz IF (GFTHR) THEN - ZF = ZF + M3_THR_WTHR(KKA,KKU,KKL,PREDTH1,PREDR1,PD,PLEPS,& + ZF = ZF + M3_THR_WTHR(CSTURB,KKA,KKU,KKL,PREDTH1,PREDR1,PD,PLEPS,& & PSQRT_TKE) * PFTHR - ZDFDDTDZ = ZDFDDTDZ + D_M3_THR_WTHR_O_DDTDZ(KKA,KKU,KKL,PREDTH1,PREDR1,& + ZDFDDTDZ = ZDFDDTDZ + D_M3_THR_WTHR_O_DDTDZ(CSTURB,KKA,KKU,KKL,PREDTH1,PREDR1,& & PD,PLEPS,PSQRT_TKE,PBLL_O_E,PETHETA) * PFTHR - ZDFDDRDZ = ZDFDDRDZ + D_M3_THR_WTHR_O_DDRDZ(KKA,KKU,KKL,PREDR1,PREDTH1,& + ZDFDDRDZ = ZDFDDRDZ + D_M3_THR_WTHR_O_DDRDZ(CSTURB,KKA,KKU,KKL,PREDR1,PREDTH1,& & PD,PLEPS,PSQRT_TKE,PBLL_O_E,PEMOIST) * PFTHR END IF ! - IF (LHARAT) THEN + IF (OHARAT) THEN ZFLXZ(:,:,:) = ZF & + PIMPL * PLMF*PLEPSF*0.5 & * MZF(( 2. & @@ -613,12 +616,12 @@ ENDIF + PIMPL * ZDFDDRDZ * MZF(DZM(PRP - PRM(:,:,:,1), KKA, KKU, KKL) / PDZZ, KKA, KKU, KKL) ELSE ZFLXZ(:,:,:) = ZF & - + PIMPL * XCTV*PLM*PLEPS*0.5 & - * MZF(( D_PHI3DTDZ_O_DDTDZ(PPHI3,PREDTH1,PREDR1,PRED2TH3,PRED2THR3,HTURBDIM,GUSERV) & ! d(phi3*dthdz)/ddthdz term - +D_PSI3DTDZ_O_DDTDZ(PPSI3,PREDR1,PREDTH1,PRED2R3,PRED2THR3,HTURBDIM,GUSERV) & ! d(psi3*dthdz)/ddthdz term + + PIMPL * CSTURB%XCTV*PLM*PLEPS*0.5 & + * MZF(( D_PHI3DTDZ_O_DDTDZ(CSTURB,PPHI3,PREDTH1,PREDR1,PRED2TH3,PRED2THR3,HTURBDIM,GUSERV) & ! d(phi3*dthdz)/ddthdz term + +D_PSI3DTDZ_O_DDTDZ(CSTURB,PPSI3,PREDR1,PREDTH1,PRED2R3,PRED2THR3,HTURBDIM,GUSERV) & ! d(psi3*dthdz)/ddthdz term ) *PDR_DZ *DZM(PTHLP - PTHLM, KKA, KKU, KKL) / PDZZ & - +( D_PHI3DRDZ_O_DDRDZ(PPHI3,PREDTH1,PREDR1,PRED2TH3,PRED2THR3,HTURBDIM,GUSERV) & ! d(phi3*drdz )/ddrdz term - +D_PSI3DRDZ_O_DDRDZ(PPSI3,PREDR1,PREDTH1,PRED2R3,PRED2THR3,HTURBDIM,GUSERV) & ! d(psi3*drdz )/ddrdz term + +( D_PHI3DRDZ_O_DDRDZ(CSTURB,PPHI3,PREDTH1,PREDR1,PRED2TH3,PRED2THR3,HTURBDIM,GUSERV) & ! d(phi3*drdz )/ddrdz term + +D_PSI3DRDZ_O_DDRDZ(CSTURB,PPSI3,PREDR1,PREDTH1,PRED2R3,PRED2THR3,HTURBDIM,GUSERV) & ! d(psi3*drdz )/ddrdz term ) *PDTH_DZ *DZM(PRP - PRM(:,:,:,1), KKA, KKU, KKL) / PDZZ & , KKA, KKU, KKL) & + PIMPL * ZDFDDTDZ * MZF(DZM(PTHLP - PTHLM(:,:,:), KKA, KKU, KKL) / PDZZ, KKA, KKU, KKL) & @@ -626,7 +629,7 @@ ENDIF ENDIF ! ! special case near the ground ( uncentred gradient ) - IF (LHARAT) THEN + IF (OHARAT) THEN ZFLXZ(:,:,IKB) = & (1. ) & *( PEXPL * & @@ -646,7 +649,7 @@ ENDIF ) ELSE ZFLXZ(:,:,IKB) = & - (XCHT1 * PPHI3(:,:,IKB+KKL) + XCHT2 * PPSI3(:,:,IKB+KKL)) & + (CSTURB%XCHT1 * PPHI3(:,:,IKB+KKL) + CSTURB%XCHT2 * PPSI3(:,:,IKB+KKL)) & *( PEXPL * & ( ZCOEFF(:,:,IKB+2*KKL)*PTHLM(:,:,IKB+2*KKL) & +ZCOEFF(:,:,IKB+KKL )*PTHLM(:,:,IKB+KKL ) & @@ -695,11 +698,11 @@ IF (LLES_CALL) THEN CALL SECOND_MNH(ZTIME1) CALL LES_MEAN_SUBGRID(ZFLXZ, X_LES_SUBGRID_THlRt ) CALL LES_MEAN_SUBGRID(MZF(PWM, KKA, KKU, KKL)*ZFLXZ, X_LES_RES_W_SBG_ThlRt ) - CALL LES_MEAN_SUBGRID(-2.*XCTD*PSQRT_TKE*ZFLXZ/PLEPS, X_LES_SUBGRID_DISS_ThlRt ) + CALL LES_MEAN_SUBGRID(-2.*CSTURB%XCTD*PSQRT_TKE*ZFLXZ/PLEPS, X_LES_SUBGRID_DISS_ThlRt ) CALL LES_MEAN_SUBGRID(PETHETA*ZFLXZ, X_LES_SUBGRID_RtThv ) - CALL LES_MEAN_SUBGRID(-XA3*PBETA*PETHETA*ZFLXZ, X_LES_SUBGRID_RtPz, .TRUE. ) + CALL LES_MEAN_SUBGRID(-CSTURB%XA3*PBETA*PETHETA*ZFLXZ, X_LES_SUBGRID_RtPz, .TRUE. ) CALL LES_MEAN_SUBGRID(PEMOIST*ZFLXZ, X_LES_SUBGRID_ThlThv , .TRUE. ) - CALL LES_MEAN_SUBGRID(-XA3*PBETA*PEMOIST*ZFLXZ, X_LES_SUBGRID_ThlPz, .TRUE. ) + CALL LES_MEAN_SUBGRID(-CSTURB%XA3*PBETA*PEMOIST*ZFLXZ, X_LES_SUBGRID_ThlPz, .TRUE. ) CALL SECOND_MNH(ZTIME2) XTIME_LES = XTIME_LES + ZTIME2 - ZTIME1 END IF @@ -709,10 +712,10 @@ END IF ! ! ! Compute the turbulent variance F and F' at time t-dt. -IF (LHARAT) THEN +IF (OHARAT) THEN ZF (:,:,:) = PLMF*PLEPSF*MZF(PDR_DZ**2, KKA, KKU, KKL) ELSE - ZF (:,:,:) = XCTV*PLM*PLEPS*MZF(PPSI3*PDR_DZ**2, KKA, KKU, KKL) + ZF (:,:,:) = CSTURB%XCTV*PLM*PLEPS*MZF(PPSI3*PDR_DZ**2, KKA, KKU, KKL) ENDIF ZDFDDRDZ(:,:,:) = 0. ! this term, because of discretization, is treated separately ! @@ -720,48 +723,48 @@ ENDIF ! ! d(w'r'2)/dz IF (GFR2) THEN - ZF = ZF + M3_R2_WR2(KKA,KKU,KKL,PREDR1,PREDTH1,PD,PLEPS,& + ZF = ZF + M3_R2_WR2(CSTURB,KKA,KKU,KKL,PREDR1,PREDTH1,PD,PLEPS,& & PSQRT_TKE) * PFR2 - ZDFDDRDZ = ZDFDDRDZ + D_M3_R2_WR2_O_DDRDZ(KKA,KKU,KKL,PREDR1,PREDTH1,& + ZDFDDRDZ = ZDFDDRDZ + D_M3_R2_WR2_O_DDRDZ(CSTURB,KKA,KKU,KKL,PREDR1,PREDTH1,& & PD,PLEPS,PSQRT_TKE,PBLL_O_E,PEMOIST) * PFR2 END IF ! ! d(w'2r')/dz IF (GFWR) THEN - ZF = ZF + M3_R2_W2R(KKA,KKU,KKL,PREDR1,PREDTH1,PD,PDR_DZ,& + ZF = ZF + M3_R2_W2R(CSTURB,KKA,KKU,KKL,PREDR1,PREDTH1,PD,PDR_DZ,& & PLM,PLEPS,PTKEM) * MZF(PFWR, KKA, KKU, KKL) - ZDFDDRDZ = ZDFDDRDZ + D_M3_R2_W2R_O_DDRDZ(KKA,KKU,KKL,PREDR1,PREDTH1,& + ZDFDDRDZ = ZDFDDRDZ + D_M3_R2_W2R_O_DDRDZ(CSTURB,KKA,KKU,KKL,PREDR1,PREDTH1,& & PD,PLM,PLEPS,PTKEM,GUSERV) * MZF(PFWR, KKA, KKU, KKL) END IF ! IF (KRR/=0) THEN ! d(w'r'2)/dz IF (GFTH2) THEN - ZF = ZF + M3_R2_WTH2(KKA,KKU,KKL,PD,PLEPS,PSQRT_TKE,& + ZF = ZF + M3_R2_WTH2(CSTURB,KKA,KKU,KKL,PD,PLEPS,PSQRT_TKE,& & PBLL_O_E,PETHETA,PDR_DZ) * PFTH2 - ZDFDDRDZ = ZDFDDRDZ + D_M3_R2_WTH2_O_DDRDZ(KKA,KKU,KKL,PREDR1,& + ZDFDDRDZ = ZDFDDRDZ + D_M3_R2_WTH2_O_DDRDZ(CSTURB,KKA,KKU,KKL,PREDR1,& & PREDTH1,PD,PLEPS,PSQRT_TKE,PBLL_O_E,PETHETA,PDR_DZ) * PFTH2 END IF ! ! d(w'2r')/dz IF (GFWTH) THEN - ZF = ZF + M3_R2_W2TH(KKA,KKU,KKL,PD,PLM,PLEPS,PTKEM,& + ZF = ZF + M3_R2_W2TH(CSTURB,KKA,KKU,KKL,PD,PLM,PLEPS,PTKEM,& & PBLL_O_E,PETHETA,PDR_DZ) * MZF(PFWTH, KKA, KKU, KKL) - ZDFDDRDZ = ZDFDDRDZ + D_M3_R2_W2TH_O_DDRDZ(KKA,KKU,KKL,PREDR1,PREDTH1,& + ZDFDDRDZ = ZDFDDRDZ + D_M3_R2_W2TH_O_DDRDZ(CSTURB,KKA,KKU,KKL,PREDR1,PREDTH1,& & PD,PLM,PLEPS,PTKEM,PBLL_O_E,PETHETA,PDR_DZ) * MZF(PFWTH, KKA, KKU, KKL) END IF ! ! d(w'th'r')/dz IF (GFTHR) THEN - ZF = ZF + M3_R2_WTHR(KKA,KKU,KKL,PREDTH1,PD,PLEPS,& + ZF = ZF + M3_R2_WTHR(CSTURB,KKA,KKU,KKL,PREDTH1,PD,PLEPS,& & PSQRT_TKE,PBLL_O_E,PETHETA,PDR_DZ) * PFTHR - ZDFDDRDZ = ZDFDDRDZ + D_M3_R2_WTHR_O_DDRDZ(KKA,KKU,KKL,PREDR1,PREDTH1,& + ZDFDDRDZ = ZDFDDRDZ + D_M3_R2_WTHR_O_DDRDZ(CSTURB,KKA,KKU,KKL,PREDR1,PREDTH1,& & PD,PLEPS,PSQRT_TKE,PBLL_O_E,PETHETA,PDR_DZ) * PFTHR END IF END IF ! - IF (LHARAT) THEN + IF (OHARAT) THEN ZFLXZ(:,:,:) = ZF & + PIMPL * PLMF*PLEPSF & *MZF(2.*PDR_DZ* & @@ -769,14 +772,14 @@ ENDIF + PIMPL * ZDFDDRDZ * MZF(DZM(PRP - PRM(:,:,:,1), KKA, KKU, KKL) / PDZZ, KKA, KKU, KKL) ELSE ZFLXZ(:,:,:) = ZF & - + PIMPL * XCTV*PLM*PLEPS & - *MZF(D_PSI3DRDZ2_O_DDRDZ(PPSI3,PREDR1,PREDTH1,PRED2R3,PRED2THR3,PDR_DZ,HTURBDIM,GUSERV) & + + PIMPL * CSTURB%XCTV*PLM*PLEPS & + *MZF(D_PSI3DRDZ2_O_DDRDZ(CSTURB,PPSI3,PREDR1,PREDTH1,PRED2R3,PRED2THR3,PDR_DZ,HTURBDIM,GUSERV) & *DZM(PRP - PRM(:,:,:,1), KKA, KKU, KKL) / PDZZ, KKA, KKU, KKL) & + PIMPL * ZDFDDRDZ * MZF(DZM(PRP - PRM(:,:,:,1), KKA, KKU, KKL) / PDZZ, KKA, KKU, KKL) ENDIF ! ! special case near the ground ( uncentred gradient ) - IF (LHARAT) THEN + IF (OHARAT) THEN ZFLXZ(:,:,IKB) = PLMF(:,:,IKB) & * PLEPSF(:,:,IKB) & *( PEXPL * & @@ -789,7 +792,7 @@ ENDIF +ZCOEFF(:,:,IKB )*PRP(:,:,IKB ))**2 & ) ELSE - ZFLXZ(:,:,IKB) = XCHV * PPSI3(:,:,IKB+KKL) * PLM(:,:,IKB) & + ZFLXZ(:,:,IKB) = CSTURB%XCHV * PPSI3(:,:,IKB+KKL) * PLM(:,:,IKB) & * PLEPS(:,:,IKB) & *( PEXPL * & ( ZCOEFF(:,:,IKB+2*KKL)*PRM(:,:,IKB+2*KKL,1) & @@ -829,8 +832,8 @@ ENDIF CALL LES_MEAN_SUBGRID(ZFLXZ, X_LES_SUBGRID_Rt2 ) CALL LES_MEAN_SUBGRID(MZF(PWM, KKA, KKU, KKL)*ZFLXZ, X_LES_RES_W_SBG_Rt2 ) CALL LES_MEAN_SUBGRID(PEMOIST*ZFLXZ, X_LES_SUBGRID_RtThv , .TRUE. ) - CALL LES_MEAN_SUBGRID(-XA3*PBETA*PEMOIST*ZFLXZ, X_LES_SUBGRID_RtPz, .TRUE. ) - CALL LES_MEAN_SUBGRID(-2.*XCTD*PSQRT_TKE*ZFLXZ/PLEPS, X_LES_SUBGRID_DISS_Rt2 ) + CALL LES_MEAN_SUBGRID(-CSTURB%XA3*PBETA*PEMOIST*ZFLXZ, X_LES_SUBGRID_RtPz, .TRUE. ) + CALL LES_MEAN_SUBGRID(-2.*CSTURB%XCTD*PSQRT_TKE*ZFLXZ/PLEPS, X_LES_SUBGRID_DISS_Rt2 ) CALL SECOND_MNH(ZTIME2) XTIME_LES = XTIME_LES + ZTIME2 - ZTIME1 END IF diff --git a/src/common/turb/mode_turb_ver_thermo_flux.F90 b/src/common/turb/mode_turb_ver_thermo_flux.F90 index 16c320423a0560bae32296ebfb4942442246c178..1c24fb9635da56411affa82402ef574c1d5e71e9 100644 --- a/src/common/turb/mode_turb_ver_thermo_flux.F90 +++ b/src/common/turb/mode_turb_ver_thermo_flux.F90 @@ -6,10 +6,9 @@ MODULE MODE_TURB_VER_THERMO_FLUX IMPLICIT NONE CONTAINS -SUBROUTINE TURB_VER_THERMO_FLUX(KKA,KKU,KKL,KRR,KRRL,KRRI, & - OTURB_FLX,HTURBDIM,HTOM,OOCEAN, & - PIMPL,PEXPL, & - PTSTEP, & +SUBROUTINE TURB_VER_THERMO_FLUX(CST,CSTURB,KKA,KKU,KKL,KRR,KRRL,KRRI, & + OTURB_FLX,HTURBDIM,HTOM,OOCEAN,OHARAT, & + PIMPL,PEXPL,PTSTEP,HPROGRAM, & TPFILE, & PDXX,PDYY,PDZZ,PDZX,PDZY,PDIRCOSZW,PZZ, & PRHODJ,PTHVREF, & @@ -139,15 +138,15 @@ SUBROUTINE TURB_VER_THERMO_FLUX(KKA,KKU,KKL,KRR,KRRL,KRRI, & !! ------------------ !! Module MODD_CST : contains physical constants !! -!! XG : gravity constant +!! CST%XG : gravity constant !! !! Module MODD_CTURB: contains the set of constants for !! the turbulence scheme !! -!! XCMFS,XCMFB : cts for the momentum flux -!! XCSHF : ct for the sensible heat flux -!! XCHF : ct for the moisture flux -!! XCTV,XCHV : cts for the T and moisture variances +!! CSTURB%XCMFS,XCMFB : cts for the momentum flux +!! CSTURB%XCSHF : ct for the sensible heat flux +!! CSTURB%XCHF : ct for the moisture flux +!! CSTURB%XCTV,CSTURB%XCHV : cts for the T and moisture variances !! !! Module MODD_PARAMETERS !! @@ -209,7 +208,7 @@ SUBROUTINE TURB_VER_THERMO_FLUX(KKA,KKU,KKL,KRR,KRRL,KRRI, & !! change of YCOMMENT !! 2012-02 (Y. Seity) add possibility to run with reversed !! vertical levels -!! Modifications July 2015 (Wim de Rooy) LHARAT switch +!! Modifications July 2015 (Wim de Rooy) OHARAT switch !! Philippe Wautelet: 05/2016-04/2018: new data structures and calls for I/O !! 2021 (D. Ricard) last version of HGRAD turbulence scheme !! Leronard terms instead of Reynolds terms @@ -227,16 +226,14 @@ SUBROUTINE TURB_VER_THERMO_FLUX(KKA,KKU,KKL,KRR,KRRL,KRRI, & USE PARKIND1, ONLY : JPRB USE YOMHOOK , ONLY : LHOOK, DR_HOOK ! -USE MODD_CST -USE MODD_CONF, ONLY: CPROGRAM -USE MODD_CTURB +USE MODD_CST, ONLY: CST_t +USE MODD_CTURB, ONLY: CSTURB_t USE MODD_FIELD, ONLY: TFIELDDATA, TYPEREAL USE MODD_GRID_n, ONLY: XZS, XXHAT, XYHAT USE MODD_IO, ONLY: TFILEDATA USE MODD_METRICS_n, ONLY: XDXX, XDYY, XDZX, XDZY, XDZZ USE MODD_PARAMETERS USE MODD_TURB_n, ONLY: LHGRAD, XCOEFHGRADTHL, XCOEFHGRADRM, XALTHGRAD, XCLDTHOLD -USE MODD_CONF USE MODD_LES USE MODD_DIM_n USE MODD_OCEANH @@ -267,6 +264,8 @@ IMPLICIT NONE ! ! ! +TYPE(CST_t), INTENT(IN) :: CST +TYPE(CSTURB_t), INTENT(IN) :: CSTURB 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 @@ -276,8 +275,10 @@ INTEGER, INTENT(IN) :: KRRI ! number of ice water var. LOGICAL, INTENT(IN) :: OTURB_FLX ! switch to write the ! turbulent fluxes in the syncronous FM-file LOGICAL, INTENT(IN) :: OOCEAN ! switch for Ocean model version +LOGICAL, INTENT(IN) :: OHARAT CHARACTER(len=4), INTENT(IN) :: HTURBDIM ! dimensionality of the ! turbulence scheme +CHARACTER(LEN=6), INTENT(IN) :: HPROGRAM ! CPROGRAM is the program currently running (modd_conf) CHARACTER(len=4), INTENT(IN) :: HTOM ! type of Third Order Moment REAL, INTENT(IN) :: PIMPL, PEXPL ! Coef. for temporal disc. REAL, INTENT(IN) :: PTSTEP ! Double Time Step @@ -310,7 +311,7 @@ REAL, DIMENSION(:,:,:,:), INTENT(IN) :: PSVM ! Mixing ratios ! REAL, DIMENSION(:,:,:), INTENT(IN) :: PTKEM ! TKE at time t ! -! In case LHARAT=TRUE, PLM already includes all stability corrections +! In case OHARAT=TRUE, PLM already includes all stability corrections REAL, DIMENSION(:,:,:), INTENT(IN) :: PLM ! Turb. mixing length REAL, DIMENSION(:,:,:), INTENT(IN) :: PLEPS ! dissipative length REAL, DIMENSION(:,:,:), INTENT(IN) :: PLOCPEXNM ! Lv(T)/Cp/Exnref at time t-1 @@ -460,8 +461,8 @@ GUSERV = (KRR/=0) ! compute the coefficients for the uncentred gradient computation near the ! ground ! -IF (LHARAT) THEN -! LHARAT so TKE and length scales at half levels! +IF (OHARAT) THEN +! OHARAT so TKE and length scales at half levels! ZKEFF(:,:,:) = PLM(:,:,:) * SQRT(PTKEM(:,:,:)) +50.*MFMOIST(:,:,:) ELSE ZKEFF(:,:,:) = MZM(PLM(:,:,:) * SQRT(PTKEM(:,:,:)), KKA, KKU, KKL) @@ -504,12 +505,12 @@ END IF ! ! Compute the turbulent flux F and F' at time t-dt. ! -IF (LHARAT) THEN +IF (OHARAT) THEN ZF (:,:,:) = -ZKEFF*DZM(PTHLM, KKA, KKU, KKL)/PDZZ ZDFDDTDZ(:,:,:) = -ZKEFF ELSE - ZF (:,:,:) = -XCSHF*PPHI3*ZKEFF*DZM(PTHLM, KKA, KKU, KKL)/PDZZ - ZDFDDTDZ(:,:,:) = -XCSHF*ZKEFF*D_PHI3DTDZ_O_DDTDZ(PPHI3,PREDTH1,PREDR1,PRED2TH3,PRED2THR3,HTURBDIM,GUSERV) + ZF (:,:,:) = -CSTURB%XCSHF*PPHI3*ZKEFF*DZM(PTHLM, KKA, KKU, KKL)/PDZZ + ZDFDDTDZ(:,:,:) = -CSTURB%XCSHF*ZKEFF*D_PHI3DTDZ_O_DDTDZ(CSTURB,PPHI3,PREDTH1,PREDR1,PRED2TH3,PRED2THR3,HTURBDIM,GUSERV) END IF ! IF (LHGRAD) THEN @@ -526,45 +527,45 @@ END IF ! ! d(w'2th')/dz IF (GFWTH) THEN - Z3RDMOMENT= M3_WTH_W2TH(KKA,KKU,KKL,PREDTH1,PREDR1,PD,ZKEFF,PTKEM) + Z3RDMOMENT= M3_WTH_W2TH(CSTURB,KKA,KKU,KKL,PREDTH1,PREDR1,PD,ZKEFF,PTKEM) ! ZF = ZF + Z3RDMOMENT * PFWTH - ZDFDDTDZ = ZDFDDTDZ + D_M3_WTH_W2TH_O_DDTDZ(KKA,KKU,KKL,PREDTH1,PREDR1,& + ZDFDDTDZ = ZDFDDTDZ + D_M3_WTH_W2TH_O_DDTDZ(CSTURB,KKA,KKU,KKL,PREDTH1,PREDR1,& & PD,PBLL_O_E,PETHETA,ZKEFF,PTKEM) * PFWTH END IF ! ! d(w'th'2)/dz IF (GFTH2) THEN - Z3RDMOMENT= M3_WTH_WTH2(PREDTH1,PREDR1,PD,PBLL_O_E,PETHETA) + Z3RDMOMENT= M3_WTH_WTH2(CSTURB,PREDTH1,PREDR1,PD,PBLL_O_E,PETHETA) ! ZF = ZF + Z3RDMOMENT * MZM(PFTH2, KKA, KKU, KKL) - ZDFDDTDZ = ZDFDDTDZ + D_M3_WTH_WTH2_O_DDTDZ(Z3RDMOMENT,PREDTH1,PREDR1,& + ZDFDDTDZ = ZDFDDTDZ + D_M3_WTH_WTH2_O_DDTDZ(CSTURB,Z3RDMOMENT,PREDTH1,PREDR1,& & PD,PBLL_O_E,PETHETA) * MZM(PFTH2, KKA, KKU, KKL) END IF ! ! d(w'2r')/dz IF (GFWR) THEN - ZF = ZF + M3_WTH_W2R(KKA,KKU,KKL,PD,ZKEFF,& + ZF = ZF + M3_WTH_W2R(CSTURB,KKA,KKU,KKL,PD,ZKEFF,& & PTKEM,PBLL_O_E,PEMOIST,PDTH_DZ) * PFWR - ZDFDDTDZ = ZDFDDTDZ + D_M3_WTH_W2R_O_DDTDZ(KKA,KKU,KKL,PREDTH1,PREDR1,& + ZDFDDTDZ = ZDFDDTDZ + D_M3_WTH_W2R_O_DDTDZ(CSTURB,KKA,KKU,KKL,PREDTH1,PREDR1,& & PD,ZKEFF,PTKEM,PBLL_O_E,PEMOIST) * PFWR END IF ! ! d(w'r'2)/dz IF (GFR2) THEN - ZF = ZF + M3_WTH_WR2(KKA,KKU,KKL,PD,ZKEFF,PTKEM,& + ZF = ZF + M3_WTH_WR2(CSTURB,KKA,KKU,KKL,PD,ZKEFF,PTKEM,& & PSQRT_TKE,PBLL_O_E,PBETA,PLEPS,PEMOIST,PDTH_DZ) * MZM(PFR2, KKA, KKU, KKL) - ZDFDDTDZ = ZDFDDTDZ + D_M3_WTH_WR2_O_DDTDZ(KKA,KKU,KKL,PREDTH1,PREDR1,PD,& + ZDFDDTDZ = ZDFDDTDZ + D_M3_WTH_WR2_O_DDTDZ(CSTURB,KKA,KKU,KKL,PREDTH1,PREDR1,PD,& & ZKEFF,PTKEM,PSQRT_TKE,PBLL_O_E,PBETA,PLEPS,PEMOIST) * MZM(PFR2, KKA, KKU, KKL) END IF ! ! d(w'th'r')/dz IF (GFTHR) THEN - Z3RDMOMENT= M3_WTH_WTHR(KKA,KKU,KKL,PREDR1,PD,ZKEFF,PTKEM,PSQRT_TKE,PBETA,& + Z3RDMOMENT= M3_WTH_WTHR(CSTURB,KKA,KKU,KKL,PREDR1,PD,ZKEFF,PTKEM,PSQRT_TKE,PBETA,& & PLEPS,PEMOIST) ! ZF = ZF + Z3RDMOMENT * MZM(PFTHR, KKA, KKU, KKL) - ZDFDDTDZ = ZDFDDTDZ + D_M3_WTH_WTHR_O_DDTDZ(Z3RDMOMENT,PREDTH1,& + ZDFDDTDZ = ZDFDDTDZ + D_M3_WTH_WTHR_O_DDTDZ(CSTURB,Z3RDMOMENT,PREDTH1,& & PREDR1,PD,PBLL_O_E,PETHETA) * MZM(PFTHR, KKA, KKU, KKL) END IF ! compute interface flux @@ -673,7 +674,7 @@ END IF ! ! Contribution of the conservative temperature flux to the buoyancy flux IF (OOCEAN) THEN - PTP(:,:,:)= XG*XALPHAOC * MZF(ZFLXZ,KKA, KKU, KKL ) + PTP(:,:,:)= CST%XG*CST%XALPHAOC * MZF(ZFLXZ,KKA, KKU, KKL ) ELSE IF (KRR /= 0) THEN PTP(:,:,:) = PBETA * MZF( MZM(PETHETA,KKA, KKU, KKL) * ZFLXZ,KKA, KKU, KKL ) @@ -695,7 +696,7 @@ IF (OOCEAN) THEN END IF !* 2.3 Partial vertical divergence of the < Rc w > flux ! Correction for qc and qi negative in AROME -IF(CPROGRAM/='AROME ') THEN +IF(HPROGRAM/='AROME ') THEN IF ( KRRL >= 1 ) THEN IF ( KRRI >= 1 ) THEN PRRS(:,:,:,2) = PRRS(:,:,:,2) - & @@ -720,7 +721,7 @@ IF (LLES_CALL) THEN CALL LES_MEAN_SUBGRID(GZ_W_M(PWM,PDZZ, KKA, KKU, KKL)*MZF(ZFLXZ, KKA, KKU, KKL),& & X_LES_RES_ddxa_W_SBG_UaThl ) CALL LES_MEAN_SUBGRID(MZF(PDTH_DZ*ZFLXZ, KKA, KKU, KKL), X_LES_RES_ddxa_Thl_SBG_UaThl ) - CALL LES_MEAN_SUBGRID(-XCTP*PSQRT_TKE/PLM*MZF(ZFLXZ, KKA, KKU, KKL), X_LES_SUBGRID_ThlPz ) + CALL LES_MEAN_SUBGRID(-CSTURB%XCTP*PSQRT_TKE/PLM*MZF(ZFLXZ, KKA, KKU, KKL), X_LES_SUBGRID_ThlPz ) CALL LES_MEAN_SUBGRID(MZF(MZM(PETHETA, KKA, KKU, KKL)*ZFLXZ, KKA, KKU, KKL), X_LES_SUBGRID_WThv ) IF (KRR>=1) THEN CALL LES_MEAN_SUBGRID(MZF(PDR_DZ*ZFLXZ, KKA, KKU, KKL), X_LES_RES_ddxa_Rt_SBG_UaThl ) @@ -729,7 +730,7 @@ IF (LLES_CALL) THEN ZA = DZM(PTHLP, KKA, KKU, KKL) WHERE (ZA==0.) ZA=1.E-6 ZA = - ZFLXZ / ZA * PDZZ - ZA(:,:,IKB) = XCSHF*PPHI3(:,:,IKB)*ZKEFF(:,:,IKB) + ZA(:,:,IKB) = CSTURB%XCSHF*PPHI3(:,:,IKB)*ZKEFF(:,:,IKB) ZA = MZF(ZA, KKA, KKU, KKL) ZA = MIN(MAX(ZA,-1000.),1000.) CALL LES_MEAN_SUBGRID( ZA, X_LES_SUBGRID_Kh ) @@ -755,12 +756,12 @@ IF (HTOM=='TM06') CALL TM06_H(IKB,IKTB,IKTE,PTSTEP,PZZ,ZFLXZ,PBL_DEPTH) IF (KRR /= 0) THEN ! Compute the turbulent flux F and F' at time t-dt. ! - IF (LHARAT) THEN + IF (OHARAT) THEN ZF (:,:,:) = -ZKEFF*DZM(PRM(:,:,:,1), KKA, KKU, KKL)/PDZZ ZDFDDRDZ(:,:,:) = -ZKEFF ELSE - ZF (:,:,:) = -XCSHF*PPSI3*ZKEFF*DZM(PRM(:,:,:,1), KKA, KKU, KKL)/PDZZ - ZDFDDRDZ(:,:,:) = -XCSHF*ZKEFF*D_PSI3DRDZ_O_DDRDZ(PPSI3,PREDR1,PREDTH1,PRED2R3,PRED2THR3,HTURBDIM,GUSERV) + ZF (:,:,:) = -CSTURB%XCSHF*PPSI3*ZKEFF*DZM(PRM(:,:,:,1), KKA, KKU, KKL)/PDZZ + ZDFDDRDZ(:,:,:) = -CSTURB%XCSHF*ZKEFF*D_PSI3DRDZ_O_DDRDZ(CSTURB,PPSI3,PREDR1,PREDTH1,PRED2R3,PRED2THR3,HTURBDIM,GUSERV) ENDIF ! ! Compute Leonard Terms for Cloud mixing ratio @@ -777,45 +778,45 @@ IF (KRR /= 0) THEN ! ! d(w'2r')/dz IF (GFWR) THEN - Z3RDMOMENT= M3_WR_W2R(KKA,KKU,KKL,PREDR1,PREDTH1,PD,ZKEFF,PTKEM) + Z3RDMOMENT= M3_WR_W2R(CSTURB,KKA,KKU,KKL,PREDR1,PREDTH1,PD,ZKEFF,PTKEM) ! ZF = ZF + Z3RDMOMENT * PFWR - ZDFDDRDZ = ZDFDDRDZ + D_M3_WR_W2R_O_DDRDZ(KKA,KKU,KKL,PREDR1,PREDTH1,PD,& + ZDFDDRDZ = ZDFDDRDZ + D_M3_WR_W2R_O_DDRDZ(CSTURB,KKA,KKU,KKL,PREDR1,PREDTH1,PD,& & PBLL_O_E,PEMOIST,ZKEFF,PTKEM) * PFWR END IF ! ! d(w'r'2)/dz IF (GFR2) THEN - Z3RDMOMENT= M3_WR_WR2(PREDR1,PREDTH1,PD,PBLL_O_E,PEMOIST) + Z3RDMOMENT= M3_WR_WR2(CSTURB,PREDR1,PREDTH1,PD,PBLL_O_E,PEMOIST) ! ZF = ZF + Z3RDMOMENT * MZM(PFR2, KKA, KKU, KKL) - ZDFDDRDZ = ZDFDDRDZ + D_M3_WR_WR2_O_DDRDZ(Z3RDMOMENT,PREDR1,& + ZDFDDRDZ = ZDFDDRDZ + D_M3_WR_WR2_O_DDRDZ(CSTURB,Z3RDMOMENT,PREDR1,& & PREDTH1,PD,PBLL_O_E,PEMOIST) * MZM(PFR2, KKA, KKU, KKL) END IF ! ! d(w'2th')/dz IF (GFWTH) THEN - ZF = ZF + M3_WR_W2TH(KKA,KKU,KKL,PD,ZKEFF,& + ZF = ZF + M3_WR_W2TH(CSTURB,KKA,KKU,KKL,PD,ZKEFF,& & PTKEM,PBLL_O_E,PETHETA,PDR_DZ) * PFWTH - ZDFDDRDZ = ZDFDDRDZ + D_M3_WR_W2TH_O_DDRDZ(KKA,KKU,KKL,PREDR1,PREDTH1,& + ZDFDDRDZ = ZDFDDRDZ + D_M3_WR_W2TH_O_DDRDZ(CSTURB,KKA,KKU,KKL,PREDR1,PREDTH1,& & PD,ZKEFF,PTKEM,PBLL_O_E,PETHETA) * PFWTH END IF ! ! d(w'th'2)/dz IF (GFTH2) THEN - ZF = ZF + M3_WR_WTH2(KKA,KKU,KKL,PD,ZKEFF,PTKEM,& + ZF = ZF + M3_WR_WTH2(CSTURB,KKA,KKU,KKL,PD,ZKEFF,PTKEM,& & PSQRT_TKE,PBLL_O_E,PBETA,PLEPS,PETHETA,PDR_DZ) * MZM(PFTH2, KKA, KKU, KKL) - ZDFDDRDZ = ZDFDDRDZ + D_M3_WR_WTH2_O_DDRDZ(KKA,KKU,KKL,PREDR1,PREDTH1,PD,& + ZDFDDRDZ = ZDFDDRDZ + D_M3_WR_WTH2_O_DDRDZ(CSTURB,KKA,KKU,KKL,PREDR1,PREDTH1,PD,& &ZKEFF,PTKEM,PSQRT_TKE,PBLL_O_E,PBETA,PLEPS,PETHETA) * MZM(PFTH2, KKA, KKU, KKL) END IF ! ! d(w'th'r')/dz IF (GFTHR) THEN - Z3RDMOMENT= M3_WR_WTHR(KKA,KKU,KKL,PREDTH1,PD,ZKEFF,PTKEM,PSQRT_TKE,PBETA,& + Z3RDMOMENT= M3_WR_WTHR(CSTURB,KKA,KKU,KKL,PREDTH1,PD,ZKEFF,PTKEM,PSQRT_TKE,PBETA,& & PLEPS,PETHETA) ! ZF = ZF + Z3RDMOMENT * MZM(PFTHR, KKA, KKU, KKL) - ZDFDDRDZ = ZDFDDRDZ + D_M3_WR_WTHR_O_DDRDZ(KKA,KKU,KKL,Z3RDMOMENT,PREDR1, & + ZDFDDRDZ = ZDFDDRDZ + D_M3_WR_WTHR_O_DDRDZ(CSTURB,KKA,KKU,KKL,Z3RDMOMENT,PREDR1, & & PREDTH1,PD,PBLL_O_E,PEMOIST) * MZM(PFTHR, KKA, KKU, KKL) END IF ! @@ -919,7 +920,7 @@ IF (KRR /= 0) THEN ! ! Contribution of the conservative water flux to the Buoyancy flux IF (OOCEAN) THEN - ZA(:,:,:)= -XG*XBETAOC * MZF(ZFLXZ, KKA, KKU, KKL ) + ZA(:,:,:)= -CST%XG*CST%XBETAOC * MZF(ZFLXZ, KKA, KKU, KKL ) ELSE ZA(:,:,:) = PBETA * MZF( MZM(PEMOIST, KKA, KKU, KKL) * ZFLXZ,KKA,KKU,KKL ) ZA(:,:,IKB) = PBETA(:,:,IKB) * PEMOIST(:,:,IKB) * & @@ -937,7 +938,7 @@ IF (KRR /= 0) THEN ! !* 3.3 Complete vertical divergence of the < Rc w > flux ! Correction of qc and qi negative for AROME -IF(CPROGRAM/='AROME ') THEN +IF(HPROGRAM/='AROME ') THEN IF ( KRRL >= 1 ) THEN IF ( KRRI >= 1 ) THEN PRRS(:,:,:,2) = PRRS(:,:,:,2) - & @@ -964,7 +965,7 @@ END IF CALL LES_MEAN_SUBGRID(MZF(PDTH_DZ*ZFLXZ, KKA, KKU, KKL), X_LES_RES_ddxa_Thl_SBG_UaRt ) CALL LES_MEAN_SUBGRID(MZF(PDR_DZ*ZFLXZ, KKA, KKU, KKL), X_LES_RES_ddxa_Rt_SBG_UaRt ) CALL LES_MEAN_SUBGRID(MZF(MZM(PEMOIST, KKA, KKU, KKL)*ZFLXZ, KKA, KKU, KKL), X_LES_SUBGRID_WThv , .TRUE. ) - CALL LES_MEAN_SUBGRID(-XCTP*PSQRT_TKE/PLM*MZF(ZFLXZ, KKA, KKU, KKL), X_LES_SUBGRID_RtPz ) + CALL LES_MEAN_SUBGRID(-CSTURB%XCTP*PSQRT_TKE/PLM*MZF(ZFLXZ, KKA, KKU, KKL), X_LES_SUBGRID_RtPz ) CALL SECOND_MNH(ZTIME2) XTIME_LES = XTIME_LES + ZTIME2 - ZTIME1 END IF @@ -983,14 +984,14 @@ END IF IF ( ((OTURB_FLX .AND. TPFILE%LOPENED) .OR. LLES_CALL) .AND. (KRRL > 0) ) THEN ! ! recover the Conservative potential temperature flux : -! With LHARAT is true tke and length scales at half levels +! With OHARAT is true tke and length scales at half levels ! yet modify to use length scale and tke at half levels from vdfexcuhl - IF (LHARAT) THEN + IF (OHARAT) THEN ZA(:,:,:) = DZM(PIMPL * PTHLP + PEXPL * PTHLM, KKA, KKU, KKL) / PDZZ * & (-PLM*PSQRT_TKE) ELSE ZA(:,:,:) = DZM(PIMPL * PTHLP + PEXPL * PTHLM, KKA, KKU, KKL) / PDZZ * & - (-PPHI3*MZM(PLM*PSQRT_TKE, KKA, KKU, KKL)) * XCSHF + (-PPHI3*MZM(PLM*PSQRT_TKE, KKA, KKU, KKL)) * CSTURB%XCSHF ENDIF ZA(:,:,IKB) = ( PIMPL*PSFTHP(:,:) + PEXPL*PSFTHM(:,:) ) & * PDIRCOSZW(:,:) diff --git a/src/common/turb/modi_turb.F90 b/src/common/turb/modi_turb.F90 index b2b57f334a08349e3a242d6428ddd63f5420922b..c99e4fa1b3b450130bc68368f8400aa1220f5878 100644 --- a/src/common/turb/modi_turb.F90 +++ b/src/common/turb/modi_turb.F90 @@ -4,9 +4,10 @@ ! INTERFACE ! - SUBROUTINE TURB(KKA, KKU, KKL, KMI,KRR,KRRL,KRRI,HLBCX,HLBCY, & - & KSPLIT,KMODEL_CL, & - & OTURB_FLX,OTURB_DIAG,OSUBG_COND,ORMC01,OOCEAN, & + SUBROUTINE TURB(CST,CSTURB,BUCONF,KKA, KKU, KKL, KMI,KRR,KRRL,KRRI,HLBCX,HLBCY, & + & KSPLIT,KMODEL_CL,KSV,KSV_LGBEG,KSV_LGEND, & + & HPROGRAM, O2D, ONOMIXLG, OFLAT, & + & OTURB_FLX,OTURB_DIAG,OSUBG_COND,ORMC01,OOCEAN,OHARAT, & & HTURBDIM,HTURBLEN,HTOM,HTURBLEN_CL,HCLOUD, & & PIMPL,PTSTEP,TPFILE, & & PDXX,PDYY,PDZZ,PDZX,PDZY,PZZ, & @@ -26,9 +27,14 @@ INTERFACE & PDRUS_TURB,PDRVS_TURB, & & PDRTHLS_TURB,PDRRTS_TURB,PDRSVS_TURB ) ! -USE MODD_BUDGET, ONLY : TBUDGETDATA +USE MODD_BUDGET, ONLY : TBUDGETDATA,TBUDGETCONF_t USE MODD_IO, ONLY : TFILEDATA +USE MODD_CST, ONLY: CST_t +USE MODD_CTURB, ONLY: CSTURB_t ! +TYPE(CST_t), INTENT(IN) :: CST +TYPE(CSTURB_t), INTENT(IN) :: CSTURB +TYPE(TBUDGETCONF_t), INTENT(IN) :: BUCONF 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=AR @@ -36,6 +42,7 @@ INTEGER, INTENT(IN) :: KMI ! model index number 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, KSV_LGBEG, KSV_LGEND ! number of scalar variables CHARACTER(LEN=*),DIMENSION(:),INTENT(IN):: HLBCX, HLBCY ! X- and Y-direc LBC INTEGER, INTENT(IN) :: KSPLIT ! number of time-splitting INTEGER, INTENT(IN) :: KMODEL_CL ! model number for cloud mixing length @@ -47,6 +54,8 @@ LOGICAL, INTENT(IN) :: OSUBG_COND ! switch for SUBGrid ! CONDensation LOGICAL, INTENT(IN) :: ORMC01 ! switch for RMC01 lengths in SBL LOGICAL, INTENT(IN) :: OOCEAN ! switch for Ocean model version +LOGICAL, INTENT(IN) :: OHARAT +LOGICAL, INTENT(IN) :: OFLAT ! Logical for zero ororography CHARACTER(LEN=4) , INTENT(IN) :: HTURBDIM ! dimensionality of the ! turbulence scheme CHARACTER(LEN=4) , INTENT(IN) :: HTURBLEN ! kind of mixing length @@ -137,6 +146,10 @@ REAL, DIMENSION(:,:,:), INTENT(IN) :: PLENGTHH TYPE(TBUDGETDATA), DIMENSION(KBUDGETS), INTENT(INOUT) :: TBUDGETS INTEGER, INTENT(IN) :: KBUDGETS ! +CHARACTER(LEN=6), INTENT(IN) :: HPROGRAM ! CPROGRAM is the program currently running (modd_conf) +LOGICAL, INTENT(IN) :: ONOMIXLG ! to use turbulence for lagrangian variables (modd_conf) +LOGICAL, INTENT(IN) :: O2D ! Logical for 2D model version (modd_conf) +! REAL, DIMENSION(:,:,:), INTENT(OUT), OPTIONAL :: PEDR ! EDR REAL, DIMENSION(:,:,:), INTENT(OUT), OPTIONAL :: PLEM ! Mixing length ! diff --git a/src/common/turb/turb.F90 b/src/common/turb/turb.F90 index 5c0e60d3cf0f429bdaf89a8396f33f7c3eeb7379..fafe9acee5d6e69b18f48ec9133d41872a524e03 100644 --- a/src/common/turb/turb.F90 +++ b/src/common/turb/turb.F90 @@ -3,9 +3,10 @@ !MNH_LIC version 1. See LICENSE, CeCILL-C_V1-en.txt and CeCILL-C_V1-fr.txt !MNH_LIC for details. version 1. !----------------------------------------------------------------- - SUBROUTINE TURB(KKA,KKU,KKL,KMI,KRR,KRRL,KRRI,HLBCX,HLBCY, & - & KSPLIT,KMODEL_CL, & - & OTURB_FLX,OTURB_DIAG,OSUBG_COND,ORMC01,OOCEAN, & + SUBROUTINE TURB(CST,CSTURB,BUCONF,KKA,KKU,KKL,KMI,KRR,KRRL,KRRI,HLBCX,HLBCY, & + & KSPLIT,KMODEL_CL,KSV,KSV_LGBEG,KSV_LGEND, & + & HPROGRAM, O2D, ONOMIXLG,OFLAT, & + & OTURB_FLX,OTURB_DIAG,OSUBG_COND,ORMC01,OOCEAN,OHARAT, & & HTURBDIM,HTURBLEN,HTOM,HTURBLEN_CL,HCLOUD,PIMPL, & & PTSTEP,TPFILE,PDXX,PDYY,PDZZ,PDZX,PDZY,PZZ, & & PDIRCOSXW,PDIRCOSYW,PDIRCOSZW,PCOSSLOPE,PSINSLOPE, & @@ -113,14 +114,14 @@ !! L2D switch for 2D model version !! !! MODD_CST : contains physical constants -!! XG gravity constant -!! XRD Gas constant for dry air -!! XRV Gas constant for vapor +!! CST%XG gravity constant +!! CST%XRD Gas constant for dry air +!! CST%XRV Gas constant for vapor !! !! MODD_CTURB : contains turbulence scheme constants !! XCMFS,XCED to compute the dissipation mixing length !! XTKEMIN minimum values for the TKE -!! XLINI,XLINF to compute Bougeault-Lacarrere mixing +!! CST%XLINI,CST%XLINF to compute Bougeault-Lacarrere mixing !! length !! Module MODD_BUDGET: !! NBUMOD @@ -213,7 +214,7 @@ !! 10/2012 J.Escobar Bypass PGI bug , redefine some allocatable array inplace of automatic !! 2014-11 Y. Seity, add output terms for TKE DDHs budgets !! July 2015 (Wim de Rooy) modifications to run with RACMO -!! turbulence (LHARAT=TRUE) +!! turbulence (OHARAT=TRUE) !! 04/2016 (C.Lac) correction of negativity for KHKO ! P. Wautelet 05/2016-04/2018: new data structures and calls for I/O ! Q. Rodier 01/2018: introduction of RM17 @@ -233,46 +234,41 @@ USE PARKIND1, ONLY : JPRB USE YOMHOOK , ONLY : LHOOK, DR_HOOK ! -USE MODD_PARAMETERS, ONLY: JPVEXT_TURB -USE MODD_CST -USE MODD_CTURB -USE MODD_CONF -USE MODD_BUDGET, ONLY: LBUDGET_U, LBUDGET_V, LBUDGET_W, LBUDGET_TH, LBUDGET_RV, LBUDGET_RC, & - LBUDGET_RR, LBUDGET_RI, LBUDGET_RS, LBUDGET_RG, LBUDGET_RH, LBUDGET_SV, & - NBUDGET_U, NBUDGET_V, NBUDGET_W, NBUDGET_TH, NBUDGET_RV, NBUDGET_RC, & +USE MODD_PARAMETERS, ONLY: JPVEXT_TURB, XUNDEF +USE MODD_CST, ONLY: CST_t +USE MODD_CTURB, ONLY: CSTURB_t +USE MODD_BUDGET, ONLY: NBUDGET_U, NBUDGET_V, NBUDGET_W, NBUDGET_TH, NBUDGET_RV, NBUDGET_RC, & NBUDGET_RR, NBUDGET_RI, NBUDGET_RS, NBUDGET_RG, NBUDGET_RH, NBUDGET_SV1, & - TBUDGETDATA + TBUDGETDATA, TBUDGETCONF_t USE MODD_FIELD, ONLY: TFIELDDATA,TYPEREAL USE MODD_IO, ONLY: TFILEDATA -USE MODD_LES USE MODD_TURB_n, ONLY: XCADAP -USE MODD_NSV +! +USE MODD_LES +USE MODD_IBM_PARAM_n, ONLY: LIBM, XIBM_LS, XIBM_XMUT ! USE MODE_BL89, ONLY: BL89 USE MODE_TURB_VER, ONLY : TURB_VER USE MODE_ROTATE_WIND, ONLY: ROTATE_WIND USE MODE_TURB_HOR_SPLT, ONLY: TURB_HOR_SPLT USE MODE_TKE_EPS_SOURCES, ONLY: TKE_EPS_SOURCES -USE MODI_SHUMAN, ONLY : MZF, MXF, MYF -USE MODI_GRADIENT_M -USE MODI_GRADIENT_U -USE MODI_GRADIENT_V -USE MODI_LES_MEAN_SUBGRID USE MODE_RMC01, ONLY: RMC01 -USE MODI_GRADIENT_W USE MODE_TM06, ONLY: TM06 USE MODE_UPDATE_LM, ONLY: UPDATE_LM -! USE MODE_BUDGET, ONLY: BUDGET_STORE_INIT, BUDGET_STORE_END USE MODE_IO_FIELD_WRITE, ONLY: IO_FIELD_WRITE USE MODE_SBL USE MODE_SOURCES_NEG_CORRECT, ONLY: SOURCES_NEG_CORRECT -! USE MODE_EMOIST, ONLY: EMOIST USE MODE_ETHETA, ONLY: ETHETA ! -USE MODD_IBM_PARAM_n, ONLY: LIBM, XIBM_LS, XIBM_XMUT +USE MODI_GRADIENT_W +USE MODI_GRADIENT_M +USE MODI_GRADIENT_U +USE MODI_GRADIENT_V USE MODI_IBM_MIXINGLENGTH +USE MODI_LES_MEAN_SUBGRID +USE MODI_SHUMAN, ONLY : MZF, MXF, MYF ! IMPLICIT NONE ! @@ -281,6 +277,9 @@ IMPLICIT NONE ! ! ! +TYPE(CST_t), INTENT(IN) :: CST +TYPE(CSTURB_t), INTENT(IN) :: CSTURB +TYPE(TBUDGETCONF_t), INTENT(IN) :: BUCONF 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 @@ -288,6 +287,7 @@ INTEGER, INTENT(IN) :: KMI ! model index number 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, KSV_LGBEG, KSV_LGEND ! number of scalar variables CHARACTER(LEN=*),DIMENSION(:),INTENT(IN):: HLBCX, HLBCY ! X- and Y-direc LBC INTEGER, INTENT(IN) :: KSPLIT ! number of time-splitting INTEGER, INTENT(IN) :: KMODEL_CL ! model number for cloud mixing length @@ -299,6 +299,8 @@ LOGICAL, INTENT(IN) :: OSUBG_COND ! switch for SUBGrid ! CONDensation LOGICAL, INTENT(IN) :: ORMC01 ! switch for RMC01 lengths in SBL LOGICAL, INTENT(IN) :: OOCEAN ! switch for Ocean model version +LOGICAL, INTENT(IN) :: OHARAT ! +LOGICAL, INTENT(IN) :: OFLAT ! Logical for zero ororography CHARACTER(LEN=4), INTENT(IN) :: HTURBDIM ! dimensionality of the ! turbulence scheme CHARACTER(LEN=4), INTENT(IN) :: HTURBLEN ! kind of mixing length @@ -388,6 +390,10 @@ REAL, DIMENSION(:,:,:), INTENT(OUT) :: PTDISS ! Dissipation TKE term TYPE(TBUDGETDATA), DIMENSION(KBUDGETS), INTENT(INOUT) :: TBUDGETS INTEGER, INTENT(IN) :: KBUDGETS ! +CHARACTER(LEN=6), INTENT(IN) :: HPROGRAM ! CPROGRAM is the program currently running (modd_conf) +LOGICAL, INTENT(IN) :: ONOMIXLG ! to use turbulence for lagrangian variables (modd_conf) +LOGICAL, INTENT(IN) :: O2D ! Logical for 2D model version (modd_conf) +! ! length scale from vdfexcu REAL, DIMENSION(:,:,:), INTENT(IN) :: PLENGTHM, PLENGTHH ! @@ -461,11 +467,11 @@ TYPE(TFIELDDATA) :: TZFIELD REAL(KIND=JPRB) :: ZHOOK_HANDLE IF (LHOOK) CALL DR_HOOK('TURB',0,ZHOOK_HANDLE) ! -IF (LHARAT .AND. HTURBDIM /= '1DIM') THEN - CALL ABOR1('LHARATU only implemented for option HTURBDIM=1DIM!') +IF (OHARAT .AND. HTURBDIM /= '1DIM') THEN + CALL ABOR1('OHARATU only implemented for option HTURBDIM=1DIM!') ENDIF -IF (LHARAT .AND. LLES_CALL) THEN - CALL ABOR1('LHARATU not implemented for option LLES_CALL') +IF (OHARAT .AND. LLES_CALL) THEN + CALL ABOR1('OHARATU not implemented for option LLES_CALL') ENDIF IKT=SIZE(PTHLT,3) @@ -475,7 +481,7 @@ IKB=KKA+JPVEXT_TURB*KKL IKE=KKU-JPVEXT_TURB*KKL ! ZEXPL = 1.- PIMPL -ZRVORD= XRV / XRD +ZRVORD= CST%XRV / CST%XRD ! ! !Copy data into ZTHLM and ZRM only if needed @@ -493,15 +499,15 @@ END IF ! !* 2.1 Cph at t ! -ZCP(:,:,:)=XCPD +ZCP(:,:,:)=CST%XCPD ! -IF (KRR > 0) ZCP(:,:,:) = ZCP(:,:,:) + XCPV * PRT(:,:,:,1) +IF (KRR > 0) ZCP(:,:,:) = ZCP(:,:,:) + CST%XCPV * PRT(:,:,:,1) DO JRR = 2,1+KRRL ! loop on the liquid components - ZCP(:,:,:) = ZCP(:,:,:) + XCL * PRT(:,:,:,JRR) + ZCP(:,:,:) = ZCP(:,:,:) + CST%XCL * PRT(:,:,:,JRR) END DO ! DO JRR = 2+KRRL,1+KRRL+KRRI ! loop on the solid components - ZCP(:,:,:) = ZCP(:,:,:) + XCI * PRT(:,:,:,JRR) + ZCP(:,:,:) = ZCP(:,:,:) + CST%XCI * PRT(:,:,:,JRR) END DO ! !* 2.2 Exner function at t @@ -509,7 +515,7 @@ END DO IF (OOCEAN) THEN ZEXN(:,:,:) = 1. ELSE - ZEXN(:,:,:) = (PPABST(:,:,:)/XP00) ** (XRD/XCPD) + ZEXN(:,:,:) = (PPABST(:,:,:)/CST%XP00) ** (CST%XRD/CST%XCPD) END IF ! !* 2.3 dissipative heating coeff a t @@ -535,9 +541,9 @@ IF (KRRL >=1) THEN ALLOCATE(ZAMOIST_ICE(SIZE(PTHLT,1),SIZE(PTHLT,2),SIZE(PTHLT,3))) ALLOCATE(ZATHETA_ICE(SIZE(PTHLT,1),SIZE(PTHLT,2),SIZE(PTHLT,3))) ! - CALL COMPUTE_FUNCTION_THERMO(XALPW,XBETAW,XGAMW,XLVTT,XCL,ZT,ZEXN,ZCP, & + CALL COMPUTE_FUNCTION_THERMO(CST%XALPW,CST%XBETAW,CST%XGAMW,CST%XLVTT,CST%XCL,ZT,ZEXN,ZCP, & ZLVOCPEXNM,ZAMOIST,ZATHETA) - CALL COMPUTE_FUNCTION_THERMO(XALPI,XBETAI,XGAMI,XLSTT,XCI,ZT,ZEXN,ZCP, & + CALL COMPUTE_FUNCTION_THERMO(CST%XALPI,CST%XBETAI,CST%XGAMI,CST%XLSTT,CST%XCI,ZT,ZEXN,ZCP, & ZLSOCPEXNM,ZAMOIST_ICE,ZATHETA_ICE) ! WHERE(PRT(:,:,:,2)+PRT(:,:,:,4)>0.0) @@ -554,7 +560,7 @@ IF (KRRL >=1) THEN DEALLOCATE(ZAMOIST_ICE) DEALLOCATE(ZATHETA_ICE) ELSE - CALL COMPUTE_FUNCTION_THERMO(XALPW,XBETAW,XGAMW,XLVTT,XCL,ZT,ZEXN,ZCP, & + CALL COMPUTE_FUNCTION_THERMO(CST%XALPW,CST%XBETAW,CST%XGAMW,CST%XLVTT,CST%XCL,ZT,ZEXN,ZCP, & ZLOCPEXNM,ZAMOIST,ZATHETA) END IF ! @@ -625,7 +631,7 @@ END IF ! ----------------------------------------- ! ! -IF (.NOT. LHARAT) THEN +IF (.NOT. OHARAT) THEN SELECT CASE (HTURBLEN) ! @@ -634,7 +640,7 @@ SELECT CASE (HTURBLEN) CASE ('BL89') ZSHEAR=0. - CALL BL89(KKA,KKU,KKL,PZZ,PDZZ,PTHVREF,ZTHLM,KRR,ZRM,PTKET,ZSHEAR,ZLM,OOCEAN) + CALL BL89(CST,CSTURB,KKA,KKU,KKL,PZZ,PDZZ,PTHVREF,ZTHLM,KRR,ZRM,PTKET,ZSHEAR,ZLM,OOCEAN,HPROGRAM) ! !* 3.2 RM17 mixing length ! ------------------ @@ -643,7 +649,7 @@ SELECT CASE (HTURBLEN) ZDUDZ = MXF(MZF(GZ_U_UW(PUT,PDZZ,KKA,KKU,KKL),KKA,KKU,KKL)) ZDVDZ = MYF(MZF(GZ_V_VW(PVT,PDZZ,KKA,KKU,KKL),KKA,KKU,KKL)) ZSHEAR = SQRT(ZDUDZ*ZDUDZ + ZDVDZ*ZDVDZ) - CALL BL89(KKA,KKU,KKL,PZZ,PDZZ,PTHVREF,ZTHLM,KRR,ZRM,PTKET,ZSHEAR,ZLM,OOCEAN) + CALL BL89(CST,CSTURB,KKA,KKU,KKL,PZZ,PDZZ,PTHVREF,ZTHLM,KRR,ZRM,PTKET,ZSHEAR,ZLM,OOCEAN,HPROGRAM) ! !* 3.3 Grey-zone combined RM17 & Deardorff mixing lengths ! -------------------------------------------------- @@ -652,7 +658,7 @@ SELECT CASE (HTURBLEN) ZDUDZ = MXF(MZF(GZ_U_UW(PUT,PDZZ,KKA,KKU,KKL),KKA,KKU,KKL)) ZDVDZ = MYF(MZF(GZ_V_VW(PVT,PDZZ,KKA,KKU,KKL),KKA,KKU,KKL)) ZSHEAR = SQRT(ZDUDZ*ZDUDZ + ZDVDZ*ZDVDZ) - CALL BL89(KKA,KKU,KKL,PZZ,PDZZ,PTHVREF,ZTHLM,KRR,ZRM,PTKET,ZSHEAR,ZLM,OOCEAN) + CALL BL89(CST,CSTURB,KKA,KKU,KKL,PZZ,PDZZ,PTHVREF,ZTHLM,KRR,ZRM,PTKET,ZSHEAR,ZLM,OOCEAN,HPROGRAM) CALL DELT(ZLMW,ODZ=.FALSE.) ! The minimum mixing length is chosen between Horizontal grid mesh (not taking into account the vertical grid mesh) and RM17. @@ -705,7 +711,7 @@ ENDIF ! end LHARRAT !* 3.6 Dissipative length ! ------------------ -IF (LHARAT) THEN +IF (OHARAT) THEN ZLEPS=PLENGTHM*(3.75**2.) ELSE ZLEPS=ZLM @@ -753,7 +759,7 @@ ENDIF ! ! ! -IF (CPROGRAM/='AROME ') THEN +IF (HPROGRAM/='AROME ') THEN CALL ROTATE_WIND(PUT,PVT,PWT, & PDIRCOSXW, PDIRCOSYW, PDIRCOSZW, & PCOSSLOPE,PSINSLOPE, & @@ -773,7 +779,7 @@ ZCDUEFF(:,:) =-SQRT ( (PSFU(:,:)**2 + PSFV(:,:)**2) / & #ifdef REPRO48 (1.E-60 + ZUSLOPE(:,:)**2 + ZVSLOPE(:,:)**2 ) ) #else - (XMNH_TINY + ZUSLOPE(:,:)**2 + ZVSLOPE(:,:)**2 ) ) + (CST%XMNH_TINY + ZUSLOPE(:,:)**2 + ZVSLOPE(:,:)**2 ) ) #endif ! !* 4.6 compute the surface tangential fluxes @@ -832,11 +838,11 @@ ENDIF !* 5. TURBULENT SOURCES ! ----------------- ! -IF( LBUDGET_U ) CALL BUDGET_STORE_INIT( TBUDGETS(NBUDGET_U ), 'VTURB', PRUS(:, :, :) ) -IF( LBUDGET_V ) CALL BUDGET_STORE_INIT( TBUDGETS(NBUDGET_V ), 'VTURB', PRVS(:, :, :) ) -IF( LBUDGET_W ) CALL BUDGET_STORE_INIT( TBUDGETS(NBUDGET_W ), 'VTURB', PRWS(:, :, :) ) +IF( BUCONF%LBUDGET_U ) CALL BUDGET_STORE_INIT( TBUDGETS(NBUDGET_U ), 'VTURB', PRUS(:, :, :) ) +IF( BUCONF%LBUDGET_V ) CALL BUDGET_STORE_INIT( TBUDGETS(NBUDGET_V ), 'VTURB', PRVS(:, :, :) ) +IF( BUCONF%LBUDGET_W ) CALL BUDGET_STORE_INIT( TBUDGETS(NBUDGET_W ), 'VTURB', PRWS(:, :, :) ) -IF( LBUDGET_TH ) THEN +IF( BUCONF%LBUDGET_TH ) THEN IF( KRRI >= 1 .AND. KRRL >= 1 ) THEN CALL BUDGET_STORE_INIT( TBUDGETS(NBUDGET_TH), 'VTURB', PRTHLS(:, :, :) + ZLVOCPEXNM(:, :, :) * PRRS(:, :, :, 2) & + ZLSOCPEXNM(:, :, :) * PRRS(:, :, :, 4) ) @@ -847,7 +853,7 @@ IF( LBUDGET_TH ) THEN END IF END IF -IF( LBUDGET_RV ) THEN +IF( BUCONF%LBUDGET_RV ) THEN IF( KRRI >= 1 .AND. KRRL >= 1 ) THEN CALL BUDGET_STORE_INIT( TBUDGETS(NBUDGET_RV), 'VTURB', PRRS(:, :, :, 1) - PRRS(:, :, :, 2) - PRRS(:, :, :, 4) ) ELSE IF( KRRL >= 1 ) THEN @@ -857,18 +863,20 @@ IF( LBUDGET_RV ) THEN END IF END IF -IF( LBUDGET_RC ) CALL BUDGET_STORE_INIT( TBUDGETS(NBUDGET_RC), 'VTURB', PRRS (:, :, :, 2) ) -IF( LBUDGET_RI ) CALL BUDGET_STORE_INIT( TBUDGETS(NBUDGET_RI), 'VTURB', PRRS (:, :, :, 4) ) +IF( BUCONF%LBUDGET_RC ) CALL BUDGET_STORE_INIT( TBUDGETS(NBUDGET_RC), 'VTURB', PRRS (:, :, :, 2) ) +IF( BUCONF%LBUDGET_RI ) CALL BUDGET_STORE_INIT( TBUDGETS(NBUDGET_RI), 'VTURB', PRRS (:, :, :, 4) ) -IF( LBUDGET_SV ) THEN - DO JSV = 1, NSV +IF( BUCONF%LBUDGET_SV ) THEN + DO JSV = 1, KSV CALL BUDGET_STORE_INIT( TBUDGETS(NBUDGET_SV1 - 1 + JSV), 'VTURB', PRSVS(:, :, :, JSV) ) END DO END IF -CALL TURB_VER(KKA,KKU,KKL,KRR, KRRL, KRRI, & - OTURB_FLX, OOCEAN, & +CALL TURB_VER(CST,CSTURB,KKA,KKU,KKL,KRR, KRRL, KRRI, & + OTURB_FLX, OOCEAN, OHARAT, & + KSV,KSV_LGBEG,KSV_LGEND, & HTURBDIM,HTOM,PIMPL,ZEXPL, & + HPROGRAM, O2D, ONOMIXLG, OFLAT, & PTSTEP,TPFILE, & PDXX,PDYY,PDZZ,PDZX,PDZY,PDIRCOSZW,PZZ, & PCOSSLOPE,PSINSLOPE, & @@ -883,11 +891,11 @@ CALL TURB_VER(KKA,KKU,KKL,KRR, KRRL, KRRI, & PRUS,PRVS,PRWS,PRTHLS,PRRS,PRSVS, & PDP,PTP,PSIGS,PWTH,PWRC,PWSV ) -IF( LBUDGET_U ) CALL BUDGET_STORE_END( TBUDGETS(NBUDGET_U), 'VTURB', PRUS(:, :, :) ) -IF( LBUDGET_V ) CALL BUDGET_STORE_END( TBUDGETS(NBUDGET_V), 'VTURB', PRVS(:, :, :) ) -IF( LBUDGET_W ) CALL BUDGET_STORE_END( TBUDGETS(NBUDGET_W), 'VTURB', PRWS(:, :, :) ) +IF( BUCONF%LBUDGET_U ) CALL BUDGET_STORE_END( TBUDGETS(NBUDGET_U), 'VTURB', PRUS(:, :, :) ) +IF( BUCONF%LBUDGET_V ) CALL BUDGET_STORE_END( TBUDGETS(NBUDGET_V), 'VTURB', PRVS(:, :, :) ) +IF( BUCONF%LBUDGET_W ) CALL BUDGET_STORE_END( TBUDGETS(NBUDGET_W), 'VTURB', PRWS(:, :, :) ) -IF( LBUDGET_TH ) THEN +IF( BUCONF%LBUDGET_TH ) THEN IF( KRRI >= 1 .AND. KRRL >= 1 ) THEN CALL BUDGET_STORE_END( TBUDGETS(NBUDGET_TH), 'VTURB', PRTHLS(:, :, :) + ZLVOCPEXNM(:, :, :) * PRRS(:, :, :, 2) & + ZLSOCPEXNM(:, :, :) * PRRS(:, :, :, 4) ) @@ -898,7 +906,7 @@ IF( LBUDGET_TH ) THEN END IF END IF -IF( LBUDGET_RV ) THEN +IF( BUCONF%LBUDGET_RV ) THEN IF( KRRI >= 1 .AND. KRRL >= 1 ) THEN CALL BUDGET_STORE_END( TBUDGETS(NBUDGET_RV), 'VTURB', PRRS(:, :, :, 1) - PRRS(:, :, :, 2) - PRRS(:, :, :, 4) ) ELSE IF( KRRL >= 1 ) THEN @@ -908,11 +916,11 @@ IF( LBUDGET_RV ) THEN END IF END IF -IF( LBUDGET_RC ) CALL BUDGET_STORE_END( TBUDGETS(NBUDGET_RC), 'VTURB', PRRS(:, :, :, 2) ) -IF( LBUDGET_RI ) CALL BUDGET_STORE_END( TBUDGETS(NBUDGET_RI), 'VTURB', PRRS(:, :, :, 4) ) +IF( BUCONF%LBUDGET_RC ) CALL BUDGET_STORE_END( TBUDGETS(NBUDGET_RC), 'VTURB', PRRS(:, :, :, 2) ) +IF( BUCONF%LBUDGET_RI ) CALL BUDGET_STORE_END( TBUDGETS(NBUDGET_RI), 'VTURB', PRRS(:, :, :, 4) ) -IF( LBUDGET_SV ) THEN - DO JSV = 1, NSV +IF( BUCONF%LBUDGET_SV ) THEN + DO JSV = 1, KSV CALL BUDGET_STORE_END( TBUDGETS(NBUDGET_SV1 - 1 + JSV), 'VTURB', PRSVS(:, :, :, JSV) ) END DO END IF @@ -923,11 +931,11 @@ END IF #else IF( HTURBDIM == '3DIM' ) THEN #endif - IF( LBUDGET_U ) CALL BUDGET_STORE_INIT( TBUDGETS(NBUDGET_U ), 'HTURB', PRUS (:, :, :) ) - IF( LBUDGET_V ) CALL BUDGET_STORE_INIT( TBUDGETS(NBUDGET_V ), 'HTURB', PRVS (:, :, :) ) - IF( LBUDGET_W ) CALL BUDGET_STORE_INIT( TBUDGETS(NBUDGET_W ), 'HTURB', PRWS (:, :, :) ) + IF( BUCONF%LBUDGET_U ) CALL BUDGET_STORE_INIT( TBUDGETS(NBUDGET_U ), 'HTURB', PRUS (:, :, :) ) + IF( BUCONF%LBUDGET_V ) CALL BUDGET_STORE_INIT( TBUDGETS(NBUDGET_V ), 'HTURB', PRVS (:, :, :) ) + IF( BUCONF%LBUDGET_W ) CALL BUDGET_STORE_INIT( TBUDGETS(NBUDGET_W ), 'HTURB', PRWS (:, :, :) ) - IF(LBUDGET_TH) THEN + IF(BUCONF%LBUDGET_TH) THEN IF( KRRI >= 1 .AND. KRRL >= 1 ) THEN CALL BUDGET_STORE_INIT( TBUDGETS(NBUDGET_TH), 'HTURB', PRTHLS(:, :, :) + ZLVOCPEXNM(:, :, :) * PRRS(:, :, :, 2) & + ZLSOCPEXNM(:, :, :) * PRRS(:, :, :, 4) ) @@ -938,7 +946,7 @@ IF( HTURBDIM == '3DIM' ) THEN END IF END IF - IF( LBUDGET_RV ) THEN + IF( BUCONF%LBUDGET_RV ) THEN IF( KRRI >= 1 .AND. KRRL >= 1 ) THEN CALL BUDGET_STORE_INIT( TBUDGETS(NBUDGET_RV), 'HTURB', PRRS(:, :, :, 1) - PRRS(:, :, :, 2) - PRRS(:, :, :, 4) ) ELSE IF( KRRL >= 1 ) THEN @@ -948,11 +956,11 @@ IF( HTURBDIM == '3DIM' ) THEN END IF END IF - IF( LBUDGET_RC ) CALL BUDGET_STORE_INIT( TBUDGETS(NBUDGET_RC), 'HTURB', PRRS(:, :, :, 2) ) - IF( LBUDGET_RI ) CALL BUDGET_STORE_INIT( TBUDGETS(NBUDGET_RI), 'HTURB', PRRS(:, :, :, 4) ) + IF( BUCONF%LBUDGET_RC ) CALL BUDGET_STORE_INIT( TBUDGETS(NBUDGET_RC), 'HTURB', PRRS(:, :, :, 2) ) + IF( BUCONF%LBUDGET_RI ) CALL BUDGET_STORE_INIT( TBUDGETS(NBUDGET_RI), 'HTURB', PRRS(:, :, :, 4) ) - IF( LBUDGET_SV ) THEN - DO JSV = 1, NSV + IF( BUCONF%LBUDGET_SV ) THEN + DO JSV = 1, KSV CALL BUDGET_STORE_INIT( TBUDGETS(NBUDGET_SV1 - 1 + JSV), 'HTURB', PRSVS(:, :, :, JSV) ) END DO END IF @@ -975,11 +983,11 @@ IF( HTURBDIM == '3DIM' ) THEN ZTRH, & PRUS,PRVS,PRWS,PRTHLS,PRRS,PRSVS ) #endif - IF( LBUDGET_U ) CALL BUDGET_STORE_END( TBUDGETS(NBUDGET_U), 'HTURB', PRUS(:, :, :) ) - IF( LBUDGET_V ) CALL BUDGET_STORE_END( TBUDGETS(NBUDGET_V), 'HTURB', PRVS(:, :, :) ) - IF( LBUDGET_W ) CALL BUDGET_STORE_END( TBUDGETS(NBUDGET_W), 'HTURB', PRWS(:, :, :) ) + IF( BUCONF%LBUDGET_U ) CALL BUDGET_STORE_END( TBUDGETS(NBUDGET_U), 'HTURB', PRUS(:, :, :) ) + IF( BUCONF%LBUDGET_V ) CALL BUDGET_STORE_END( TBUDGETS(NBUDGET_V), 'HTURB', PRVS(:, :, :) ) + IF( BUCONF%LBUDGET_W ) CALL BUDGET_STORE_END( TBUDGETS(NBUDGET_W), 'HTURB', PRWS(:, :, :) ) - IF( LBUDGET_TH ) THEN + IF( BUCONF%LBUDGET_TH ) THEN IF( KRRI >= 1 .AND. KRRL >= 1 ) THEN CALL BUDGET_STORE_END( TBUDGETS(NBUDGET_TH), 'HTURB', PRTHLS(:, :, :) + ZLVOCPEXNM(:, :, :) * PRRS(:, :, :, 2) & + ZLSOCPEXNM(:, :, :) * PRRS(:, :, :, 4) ) @@ -990,7 +998,7 @@ IF( HTURBDIM == '3DIM' ) THEN END IF END IF - IF( LBUDGET_RV ) THEN + IF( BUCONF%LBUDGET_RV ) THEN IF( KRRI >= 1 .AND. KRRL >= 1 ) THEN CALL BUDGET_STORE_END( TBUDGETS(NBUDGET_RV), 'HTURB', PRRS(:, :, :, 1) - PRRS(:, :, :, 2) - PRRS(:, :, :, 4) ) ELSE IF( KRRL >= 1 ) THEN @@ -1000,11 +1008,11 @@ IF( HTURBDIM == '3DIM' ) THEN END IF END IF - IF( LBUDGET_RC ) CALL BUDGET_STORE_END( TBUDGETS(NBUDGET_RC), 'HTURB', PRRS(:, :, :, 2) ) - IF( LBUDGET_RI ) CALL BUDGET_STORE_END( TBUDGETS(NBUDGET_RI), 'HTURB', PRRS(:, :, :, 4) ) + IF( BUCONF%LBUDGET_RC ) CALL BUDGET_STORE_END( TBUDGETS(NBUDGET_RC), 'HTURB', PRRS(:, :, :, 2) ) + IF( BUCONF%LBUDGET_RI ) CALL BUDGET_STORE_END( TBUDGETS(NBUDGET_RI), 'HTURB', PRRS(:, :, :, 4) ) - IF( LBUDGET_SV ) THEN - DO JSV = 1, NSV + IF( BUCONF%LBUDGET_SV ) THEN + DO JSV = 1, KSV CALL BUDGET_STORE_END( TBUDGETS(NBUDGET_SV1 - 1 + JSV), 'HTURB', PRSVS(:, :, :, JSV) ) END DO END IF @@ -1020,14 +1028,14 @@ END IF ! 6.1 Contribution of mass-flux in the TKE buoyancy production if ! cloud computation is not statistical -PTP = PTP + XG / PTHVREF * MZF(PFLXZTHVMF,KKA, KKU, KKL) -IF(PRESENT(PTPMF)) PTPMF=XG / PTHVREF * MZF(PFLXZTHVMF, KKA, KKU, KKL) +PTP = PTP + CST%XG / PTHVREF * MZF(PFLXZTHVMF,KKA, KKU, KKL) +IF(PRESENT(PTPMF)) PTPMF=CST%XG / PTHVREF * MZF(PFLXZTHVMF, KKA, KKU, KKL) ! 6.2 TKE evolution equation -IF (.NOT. LHARAT) THEN +IF (.NOT. OHARAT) THEN ! -IF (LBUDGET_TH) THEN +IF (BUCONF%LBUDGET_TH) THEN IF ( KRRI >= 1 .AND. KRRL >= 1 ) THEN CALL BUDGET_STORE_INIT( TBUDGETS(NBUDGET_TH), 'DISSH', PRTHLS+ ZLVOCPEXNM * PRRS(:,:,:,2) & & + ZLSOCPEXNM * PRRS(:,:,:,4) ) @@ -1044,14 +1052,15 @@ ELSE ZRTKEMS=0. END IF ! -CALL TKE_EPS_SOURCES(KKA,KKU,KKL,KMI,PTKET,ZLM,ZLEPS,PDP,ZTRH, & +CALL TKE_EPS_SOURCES(CST,CSTURB,BUCONF,HPROGRAM,& + &KKA,KKU,KKL,KMI,PTKET,ZLM,ZLEPS,PDP,ZTRH, & & PRHODJ,PDZZ,PDXX,PDYY,PDZX,PDZY,PZZ, & & PTSTEP,PIMPL,ZEXPL, & & HTURBLEN,HTURBDIM, & & TPFILE,OTURB_DIAG, & & PTP,PRTKES,PRTHLS,ZCOEF_DISS,PTDIFF,PTDISS,ZRTKEMS,& & TBUDGETS,KBUDGETS, PEDR=PEDR) -IF (LBUDGET_TH) THEN +IF (BUCONF%LBUDGET_TH) THEN IF ( KRRI >= 1 .AND. KRRL >= 1 ) THEN CALL BUDGET_STORE_END( TBUDGETS(NBUDGET_TH), 'DISSH', PRTHLS+ ZLVOCPEXNM * PRRS(:,:,:,2) & & + ZLSOCPEXNM * PRRS(:,:,:,4) ) @@ -1160,7 +1169,7 @@ IF (LLES_CALL) THEN CALL SECOND_MNH(ZTIME1) CALL LES_MEAN_SUBGRID(PSFTH,X_LES_Q0) CALL LES_MEAN_SUBGRID(PSFRV,X_LES_E0) - DO JSV=1,NSV + DO JSV=1,KSV CALL LES_MEAN_SUBGRID(PSFSV(:,:,JSV),X_LES_SV0(:,JSV)) END DO CALL LES_MEAN_SUBGRID(PSFU,X_LES_UW0) @@ -1193,7 +1202,7 @@ IF (LLES_CALL) THEN IF (KRR>=1) & CALL LES_MEAN_SUBGRID(2./3.*PTKET*MZF(GZ_M_W(KKA,KKU,KKL,PRT(:,:,:,1),PDZZ),& &KKA, KKU, KKL),X_LES_RES_ddz_Rt_SBG_W2) - DO JSV=1,NSV + DO JSV=1,KSV CALL LES_MEAN_SUBGRID(2./3.*PTKET*MZF(GZ_M_W(KKA,KKU,KKL,PSVT(:,:,:,JSV),PDZZ), & &KKA, KKU, KKL), X_LES_RES_ddz_Sv_SBG_W2(:,:,:,JSV)) END DO @@ -1245,7 +1254,6 @@ CONTAINS ! ------------ USE MODE_ll USE MODD_ARGSLIST_ll, ONLY : LIST_ll -USE MODD_CONF ! IMPLICIT NONE ! @@ -1322,7 +1330,7 @@ END SUBROUTINE UPDATE_ROTATE_WIND ! !* 0. DECLARATIONS ! ------------ -USE MODD_CST +USE MODD_CST, ONLY: CST_t ! IMPLICIT NONE ! @@ -1344,11 +1352,11 @@ REAL, DIMENSION(SIZE(PEXN,1),SIZE(PEXN,2),SIZE(PEXN,3)) :: ZDRVSATDT ! REAL(KIND=JPRB) :: ZHOOK_HANDLE IF (LHOOK) CALL DR_HOOK('TURB:COMPUTE_FUNCTION_THERMO',0,ZHOOK_HANDLE) - ZEPS = XMV / XMD + ZEPS = CST%XMV / CST%XMD ! !* 1.1 Lv/Cph at t ! - PLOCPEXN(:,:,:) = ( PLTT + (XCPV-PC) * (PT(:,:,:)-XTT) ) / PCP(:,:,:) + PLOCPEXN(:,:,:) = ( PLTT + (CST%XCPV-PC) * (PT(:,:,:)-CST%XTT) ) / PCP(:,:,:) ! !* 1.2 Saturation vapor pressure at t ! @@ -1429,7 +1437,7 @@ IF (ODZ) THEN PLM(:,:,KKU) = PLM(:,:,IKE) PLM(:,:,KKA) = PZZ(:,:,IKB) - PZZ(:,:,KKA) IF ( HTURBDIM /= '1DIM' ) THEN ! 3D turbulence scheme - IF ( L2D) THEN + IF ( O2D) THEN PLM(:,:,:) = SQRT( PLM(:,:,:)*MXF(PDXX(:,:,:)) ) ELSE PLM(:,:,:) = (PLM(:,:,:)*MXF(PDXX(:,:,:))*MYF(PDYY(:,:,:)) ) ** (1./3.) @@ -1439,7 +1447,7 @@ ELSE ! Dz not taken into account in computation to assure invariability with vertical grid mesh PLM=1.E10 IF ( HTURBDIM /= '1DIM' ) THEN ! 3D turbulence scheme - IF ( L2D) THEN + IF ( O2D) THEN PLM(:,:,:) = MXF(PDXX(:,:,:)) ELSE PLM(:,:,:) = (MXF(PDXX(:,:,:))*MYF(PDYY(:,:,:)) ) ** (1./2.) @@ -1533,7 +1541,7 @@ PLM(:,:,IKTB:IKTE) = PZZ(:,:,IKTB+KKL:IKTE+KKL) - PZZ(:,:,IKTB:IKTE) PLM(:,:,KKU) = PLM(:,:,IKE) PLM(:,:,KKA) = PZZ(:,:,IKB) - PZZ(:,:,KKA) IF ( HTURBDIM /= '1DIM' ) THEN ! 3D turbulence scheme - IF ( L2D) THEN + IF ( O2D) THEN PLM(:,:,:) = SQRT( PLM(:,:,:)*MXF(PDXX(:,:,:)) ) ELSE PLM(:,:,:) = (PLM(:,:,:)*MXF(PDXX(:,:,:))*MYF(PDYY(:,:,:)) ) ** (1./3.) @@ -1553,14 +1561,14 @@ IF (KRR>0) THEN ZDRTDZ(JI,JJ,JK) = 0.5*((PRT(JI,JJ,JK+KKL,1)-PRT(JI,JJ,JK ,1))/PDZZ(JI,JJ,JK+KKL)+ & (PRT(JI,JJ,JK ,1)-PRT(JI,JJ,JK-KKL,1))/PDZZ(JI,JJ,JK )) IF (OOCEAN) THEN - ZVAR=XG*(XALPHAOC*ZDTHLDZ(JI,JJ,JK)-XBETAOC*ZDRTDZ(JI,JJ,JK)) + ZVAR=CST%XG*(CST%XALPHAOC*ZDTHLDZ(JI,JJ,JK)-CST%XBETAOC*ZDRTDZ(JI,JJ,JK)) ELSE - ZVAR=XG/PTHVREF(JI,JJ,JK)* & + ZVAR=CST%XG/PTHVREF(JI,JJ,JK)* & (ZETHETA(JI,JJ,JK)*ZDTHLDZ(JI,JJ,JK)+ZEMOIST(JI,JJ,JK)*ZDRTDZ(JI,JJ,JK)) END IF ! IF (ZVAR>0.) THEN - PLM(JI,JJ,JK)=MAX(XMNH_EPSILON,MIN(PLM(JI,JJ,JK), & + PLM(JI,JJ,JK)=MAX(CST%XMNH_EPSILON,MIN(PLM(JI,JJ,JK), & 0.76* SQRT(PTKET(JI,JJ,JK)/ZVAR))) END IF END DO @@ -1573,13 +1581,13 @@ ELSE! For dry atmos or unsalted ocean runs ZDTHLDZ(JI,JJ,JK)= 0.5*((PTHLT(JI,JJ,JK+KKL)-PTHLT(JI,JJ,JK ))/PDZZ(JI,JJ,JK+KKL)+ & (PTHLT(JI,JJ,JK )-PTHLT(JI,JJ,JK-KKL))/PDZZ(JI,JJ,JK )) IF (OOCEAN) THEN - ZVAR= XG*XALPHAOC*ZDTHLDZ(JI,JJ,JK) + ZVAR= CST%XG*CST%XALPHAOC*ZDTHLDZ(JI,JJ,JK) ELSE - ZVAR= XG/PTHVREF(JI,JJ,JK)*ZETHETA(JI,JJ,JK)*ZDTHLDZ(JI,JJ,JK) + ZVAR= CST%XG/PTHVREF(JI,JJ,JK)*ZETHETA(JI,JJ,JK)*ZDTHLDZ(JI,JJ,JK) END IF ! IF (ZVAR>0.) THEN - PLM(JI,JJ,JK)=MAX(XMNH_EPSILON,MIN(PLM(JI,JJ,JK), & + PLM(JI,JJ,JK)=MAX(CST%XMNH_EPSILON,MIN(PLM(JI,JJ,JK), & 0.76* SQRT(PTKET(JI,JJ,JK)/ZVAR))) END IF END DO @@ -1596,13 +1604,13 @@ ELSE ENDIF ! IF (OOCEAN) THEN - ZWORK2D(:,:)=XG*(XALPHAOC*ZDTHLDZ(:,:,IKB)-XBETAOC*ZDRTDZ(:,:,IKB)) + ZWORK2D(:,:)=CST%XG*(CST%XALPHAOC*ZDTHLDZ(:,:,IKB)-CST%XBETAOC*ZDRTDZ(:,:,IKB)) ELSE - ZWORK2D(:,:)=XG/PTHVREF(:,:,IKB)* & + ZWORK2D(:,:)=CST%XG/PTHVREF(:,:,IKB)* & (ZETHETA(:,:,IKB)*ZDTHLDZ(:,:,IKB)+ZEMOIST(:,:,IKB)*ZDRTDZ(:,:,IKB)) END IF WHERE(ZWORK2D(:,:)>0.) - PLM(:,:,IKB)=MAX(XMNH_EPSILON,MIN( PLM(:,:,IKB), & + PLM(:,:,IKB)=MAX(CST%XMNH_EPSILON,MIN( PLM(:,:,IKB), & 0.76* SQRT(PTKET(:,:,IKB)/ZWORK2D(:,:)))) END WHERE ! @@ -1743,7 +1751,7 @@ ELSE ! ------------------ CASE ('BL89','RM17','ADAP') ZSHEAR=0. - CALL BL89(KKA,KKU,KKL,PZZ,PDZZ,PTHVREF,ZTHLM,KRR,ZRM,PTKET,ZSHEAR,ZLM_CLOUD,OOCEAN) + CALL BL89(CST,CSTURB,KKA,KKU,KKL,PZZ,PDZZ,PTHVREF,ZTHLM,KRR,ZRM,PTKET,ZSHEAR,ZLM_CLOUD,OOCEAN,HPROGRAM) ! !* 3.2 Delta mixing length ! ------------------- diff --git a/src/mesonh/ext/phys_paramn.f90 b/src/mesonh/ext/phys_paramn.f90 index 6b62cc0a441f49a5e4464064f836b1bedf31b495..643e5e23803a708cabb6e7c33f1b57a5c80eb92e 100644 --- a/src/mesonh/ext/phys_paramn.f90 +++ b/src/mesonh/ext/phys_paramn.f90 @@ -242,11 +242,10 @@ END MODULE MODI_PHYS_PARAM_n !* 0. DECLARATIONS ! ------------ ! -USE MODD_ADV_n, ONLY : XRTKEMS +USE MODD_ADV_n, ONLY : XRTKEMS USE MODD_ARGSLIST_ll, ONLY : LIST_ll -use modd_budget, only: lbudget_th, lbudget_rv, lbudget_rc, lbudget_ri, lbudget_sv, & - NBUDGET_TH, NBUDGET_RV, NBUDGET_RC, NBUDGET_RI, NBUDGET_SV1, & - tbudgets, xtime_bu_process +USE MODD_BUDGET, ONLY: NBUDGET_TH, NBUDGET_RV, NBUDGET_RC, NBUDGET_RI, NBUDGET_SV1, & + TBUDGETS, xtime_bu_process, TBUCONF USE MODD_CH_AEROSOL USE MODD_CH_MNHC_n, ONLY : LUSECHEM, &! indicates if chemistry is used LCH_CONV_SCAV, & @@ -255,7 +254,8 @@ USE MODD_CLOUD_MF_n USE MODD_CONDSAMP USE MODD_CONF USE MODD_CONF_n -USE MODD_CST +USE MODD_CST, ONLY : CST +USE MODD_CTURB, ONLY : CSTURB USE MODD_CURVCOR_n USE MODD_DEEP_CONVECTION_n USE MODD_DEF_EDDY_FLUX_n ! Ajout PP @@ -283,7 +283,10 @@ USE MODD_LUNIT_n USE MODD_METRICS_n USE MODD_MNH_SURFEX_n USE MODD_NESTING, ONLY : XWAY,NDAD, NDXRATIO_ALL, NDYRATIO_ALL -USE MODD_NSV +USE MODD_NSV, ONLY : NSV, NSV_LGBEG, NSV_LGEND, & + NSV_SLTBEG,NSV_SLTEND,NSV_SLT,& + NSV_AERBEG,NSV_AEREND, & + NSV_DSTBEG,NSV_DSTEND, NSV_DST USE MODD_OCEANH USE MODD_OUT_n USE MODD_PARAM_C2R2, ONLY : LSEDC @@ -453,7 +456,7 @@ REAL :: ZSWA,TINTSW ! index for SW interpolation and int time betwenn forcin REAL, DIMENSION(:), ALLOCATABLE :: ZIZOCE(:) ! Solar flux penetrating in ocean REAL, DIMENSION(:), ALLOCATABLE :: ZPROSOL1(:),ZPROSOL2(:) ! Funtions for penetrating solar flux ! -REAL, DIMENSION(:,:,:), ALLOCATABLE :: ZLENGTHM, ZLENGTHH, ZMFMOIST !LHARAT turb option from AROME +REAL, DIMENSION(:,:,:), ALLOCATABLE :: ZLENGTHM, ZLENGTHH, ZMFMOIST !OHARAT turb option from AROME ! !----------------------------------------------------------------------------- @@ -698,7 +701,7 @@ CALL SUNPOS_n ( XZENITH, ZCOSZEN, ZSINZEN, ZAZIMSOL ) ! XFLALWD (:,:) = 300. DO JSWB=1,NSWB_MNH - XDIRFLASWD(:,:,JSWB) = XI0 * MAX(COS(XZENITH(:,:)),0.)/REAL(NSWB_MNH) + XDIRFLASWD(:,:,JSWB) = CST%XI0 * MAX(COS(XZENITH(:,:)),0.)/REAL(NSWB_MNH) XSCAFLASWD(:,:,JSWB) = 0. END DO XDTHRAD(:,:,:) = 0. @@ -708,7 +711,7 @@ CALL SUNPOS_n ( XZENITH, ZCOSZEN, ZSINZEN, ZAZIMSOL ) ! ------------------------------ ! CASE('FIXE') - ZTIME = MOD(TDTCUR%xtime +XLON0*240., XDAY) + ZTIME = MOD(TDTCUR%xtime +XLON0*240., CST%XDAY) IHOUR = INT( ZTIME/3600. ) IF (IHOUR < 0) IHOUR=IHOUR + 24 ZDT = ZTIME/3600. - REAL(IHOUR) @@ -811,9 +814,9 @@ END IF ! ------------------------------ ! IF (CRAD /='NONE') THEN - if ( lbudget_th ) call Budget_store_init( tbudgets(NBUDGET_TH), 'RAD', xrths(:, :, :) ) + if ( TBUCONF%LBUDGET_th ) call Budget_store_init( TBUDGETS(NBUDGET_TH), 'RAD', xrths(:, :, :) ) XRTHS(:,:,:) = XRTHS(:,:,:) + XRHODJ(:,:,:)*XDTHRAD(:,:,:) - if ( lbudget_th ) call Budget_store_end ( tbudgets(NBUDGET_TH), 'RAD', xrths(:, :, :) ) + if ( TBUCONF%LBUDGET_th ) call Budget_store_end ( TBUDGETS(NBUDGET_TH), 'RAD', xrths(:, :, :) ) END IF ! ! @@ -837,21 +840,21 @@ IF (LOCEAN .AND. (.NOT.LCOUPLES)) THEN XSSVFL = (XSSVFL_T(JSW+1)*(1.-ZSWA)+XSSVFL_T(JSW+2)*ZSWA) ! ZIZOCE(IKU) = XSSOLA_T(JSW+1)*(1.-ZSWA)+XSSOLA_T(JSW+2)*ZSWA - ZPROSOL1(IKU) = XROC*ZIZOCE(IKU) - ZPROSOL2(IKU) = (1.-XROC)*ZIZOCE(IKU) + ZPROSOL1(IKU) = CST%XROC*ZIZOCE(IKU) + ZPROSOL2(IKU) = (1.-CST%XROC)*ZIZOCE(IKU) IF(NVERB >= 5 ) THEN WRITE(ILUOUT,*)'ZSWA JSW TDTCUR XTSTEP FT FU FV SolarR(IKU)', NINFRT, ZSWA,JSW,& TDTCUR%xtime, XTSTEP, XSSTFL(2,2), XSSUFL(2,2),XSSVFL(2,2),ZIZOCE(IKU) END IF - if ( lbudget_th ) call Budget_store_init( tbudgets(NBUDGET_TH), 'OCEAN', xrths(:, :, :) ) + if ( TBUCONF%LBUDGET_th ) call Budget_store_init( TBUDGETS(NBUDGET_TH), 'OCEAN', xrths(:, :, :) ) DO JKM=IKU-1,2,-1 - ZPROSOL1(JKM) = ZPROSOL1(JKM+1)* exp(-XDZZ(2,2,JKM)/XD1) - ZPROSOL2(JKM) = ZPROSOL2(JKM+1)* exp(-XDZZ(2,2,JKM)/XD2) + ZPROSOL1(JKM) = ZPROSOL1(JKM+1)* exp(-XDZZ(2,2,JKM)/CST%XD1) + ZPROSOL2(JKM) = ZPROSOL2(JKM+1)* exp(-XDZZ(2,2,JKM)/CST%XD2) ZIZOCE(JKM) = (ZPROSOL1(JKM+1)-ZPROSOL1(JKM) + ZPROSOL2(JKM+1)-ZPROSOL2(JKM))/XDZZ(2,2,JKM) ! Adding to temperature tendency, the solar radiation penetrating in ocean XRTHS(:,:,JKM) = XRTHS(:,:,JKM) + XRHODJ(:,:,JKM)*ZIZOCE(JKM) END DO - if ( lbudget_th ) call Budget_store_end ( tbudgets(NBUDGET_TH), 'OCEAN', xrths(:, :, :) ) + if ( TBUCONF%LBUDGET_th ) call Budget_store_end ( TBUDGETS(NBUDGET_TH), 'OCEAN', xrths(:, :, :) ) DEALLOCATE( ZIZOCE) DEALLOCATE (ZPROSOL1) DEALLOCATE (ZPROSOL2) @@ -879,13 +882,13 @@ CALL SECOND_MNH2(ZTIME1) ! IF( CDCONV == 'KAFR' .OR. CSCONV == 'KAFR' ) THEN - if ( lbudget_th ) call Budget_store_init( tbudgets(NBUDGET_TH), 'DCONV', xrths(:, :, :) ) - if ( lbudget_rv ) call Budget_store_init( tbudgets(NBUDGET_RV), 'DCONV', xrrs (:, :, :, 1) ) - if ( lbudget_rc ) call Budget_store_init( tbudgets(NBUDGET_RC), 'DCONV', xrrs (:, :, :, 2) ) - if ( lbudget_ri ) call Budget_store_init( tbudgets(NBUDGET_RI), 'DCONV', xrrs (:, :, :, 4) ) - if ( lbudget_sv .and. lchtrans ) then + if ( TBUCONF%LBUDGET_th ) call Budget_store_init( TBUDGETS(NBUDGET_TH), 'DCONV', xrths(:, :, :) ) + if ( TBUCONF%LBUDGET_rv ) call Budget_store_init( TBUDGETS(NBUDGET_RV), 'DCONV', xrrs (:, :, :, 1) ) + if ( TBUCONF%LBUDGET_rc ) call Budget_store_init( TBUDGETS(NBUDGET_RC), 'DCONV', xrrs (:, :, :, 2) ) + if ( TBUCONF%LBUDGET_ri ) call Budget_store_init( TBUDGETS(NBUDGET_RI), 'DCONV', xrrs (:, :, :, 4) ) + if ( TBUCONF%LBUDGET_sv .and. lchtrans ) then do jsv = 1, size( xrsvs, 4 ) - call Budget_store_init( tbudgets(NBUDGET_SV1 - 1 + jsv), 'DCONV', xrsvs (:, :, :, jsv) ) + call Budget_store_init( TBUDGETS(NBUDGET_SV1 - 1 + jsv), 'DCONV', xrsvs (:, :, :, jsv) ) end do end if ! @@ -1107,7 +1110,7 @@ END IF ! and cloud ice is melted ! XRTHS(:,:,:) = XRTHS(:,:,:) - XRHODJ(:,:,:) * & - ( XP00/XPABST(:,:,:) )**(XRD/XCPD) * XLMTT / XCPD * XDRICONV(:,:,:) + ( XP00/XPABST(:,:,:) )**(XRD/XCPD) * CST%XLMTT / XCPD * XDRICONV(:,:,:) ! ELSE IF ( (.NOT. LUSERC) .AND. (.NOT. LUSERI) ) THEN ! @@ -1119,17 +1122,17 @@ END IF ! and all cloud condensate is evaporated ! XRTHS(:,:,:) = XRTHS(:,:,:) - XRHODJ(:,:,:) / XCPD * ( & - XLVTT * XDRCCONV(:,:,:) + XLSTT * XDRICONV(:,:,:) ) *& + CST%XLVTT * XDRCCONV(:,:,:) + CST%XLSTT * XDRICONV(:,:,:) ) *& ( XP00 / XPABST(:,:,:) ) ** ( XRD / XCPD ) END IF - if ( lbudget_th ) call Budget_store_end( tbudgets(NBUDGET_TH), 'DCONV', xrths(:, :, :) ) - if ( lbudget_rv ) call Budget_store_end( tbudgets(NBUDGET_RV), 'DCONV', xrrs (:, :, :, 1) ) - if ( lbudget_rc ) call Budget_store_end( tbudgets(NBUDGET_RC), 'DCONV', xrrs (:, :, :, 2) ) - if ( lbudget_ri ) call Budget_store_end( tbudgets(NBUDGET_RI), 'DCONV', xrrs (:, :, :, 4) ) - if ( lbudget_sv .and. lchtrans ) then + if ( TBUCONF%LBUDGET_th ) call Budget_store_end( TBUDGETS(NBUDGET_TH), 'DCONV', xrths(:, :, :) ) + if ( TBUCONF%LBUDGET_rv ) call Budget_store_end( TBUDGETS(NBUDGET_RV), 'DCONV', xrrs (:, :, :, 1) ) + if ( TBUCONF%LBUDGET_rc ) call Budget_store_end( TBUDGETS(NBUDGET_RC), 'DCONV', xrrs (:, :, :, 2) ) + if ( TBUCONF%LBUDGET_ri ) call Budget_store_end( TBUDGETS(NBUDGET_RI), 'DCONV', xrrs (:, :, :, 4) ) + if ( TBUCONF%LBUDGET_sv .and. lchtrans ) then do jsv = 1, size( xrsvs, 4 ) - call Budget_store_end( tbudgets(NBUDGET_SV1 - 1 + jsv), 'DCONV', xrsvs (:, :, :, jsv) ) + call Budget_store_end( TBUDGETS(NBUDGET_SV1 - 1 + jsv), 'DCONV', xrsvs (:, :, :, jsv) ) end do end if END IF @@ -1482,8 +1485,10 @@ ELSE ALLOCATE(XSVW_FLUX(SIZE(XSVT,1),SIZE(XSVT,2),SIZE(XSVT,3),SIZE(XSVT,4))) END IF ! - CALL TURB( 1, IKU, 1, IMI, NRR, NRRL, NRRI, CLBCX, CLBCY, 1, NMODEL_CLOUD, & - LTURB_FLX, LTURB_DIAG, LSUBG_COND, LRMC01, LOCEAN, & + CALL TURB( CST,CSTURB, TBUCONF,& + 1, IKU, 1, IMI, NRR, NRRL, NRRI, CLBCX, CLBCY, 1, NMODEL_CLOUD, & + NSV, NSV_LGBEG, NSV_LGEND,CPROGRAM, L2D, LNOMIXLG,LFLAT, & + LTURB_FLX, LTURB_DIAG, LSUBG_COND, LRMC01, LOCEAN, .FALSE., & CTURBDIM, CTURBLEN, CTOM, CTURBLEN_CLOUD, CCLOUD,XIMPL, & XTSTEP, TPFILE, & XDXX, XDYY, XDZZ, XDZX, XDZY, XZZ, &