diff --git a/src/arome/ext/aro_turb_mnh.F90 b/src/arome/ext/aro_turb_mnh.F90 index e5c5486f4e82bdeee8d05923b989474081080fe2..552070615f2cd7a2e0667def6a9263933666cea9 100644 --- a/src/arome/ext/aro_turb_mnh.F90 +++ b/src/arome/ext/aro_turb_mnh.F90 @@ -429,7 +429,7 @@ CALL TURB (CST,CSTURB,TBUCONF,TURBN, YLDIMPHYEX,TLES,& & IMI, KRR, KRRL, KRRI, HLBCX, HLBCY, KGRADIENTS,1, & & ISPLIT,IMI, KSV, KSV_LGBEG, KSV_LGEND, HPROGRAM,& & NSV_LIMA_NR, NSV_LIMA_NS, NSV_LIMA_NG, NSV_LIMA_NH, & - & O2D, ONOMIXLG, OFLAT, OCOUPLES,OBLOWSNOW,& + & O2D, ONOMIXLG, OFLAT, OCOUPLES,OBLOWSNOW,.FALSE.,& & .FALSE., OCOMPUTE_SRC, 1.0, & & OOCEAN,ODEEPOC, .FALSE., & & 'NONE',CMICRO, & diff --git a/src/common/aux/gradient_m_phy.F90 b/src/common/aux/gradient_m_phy.F90 index 2b1636b6306e94862bb3086835ae484fd97d9c2a..348dea22e2e0f2301f5b7e15a5ad8dd6bb750b48 100644 --- a/src/common/aux/gradient_m_phy.F90 +++ b/src/common/aux/gradient_m_phy.F90 @@ -436,7 +436,7 @@ REAL, DIMENSION(D%NIT*D%NJT*D%NKT), INTENT(IN) :: PDZX ! metric coefficient REAL, DIMENSION(D%NIT,D%NJT,D%NKT), INTENT(OUT) :: PGX_M_U ! result at flux ! side REAL, DIMENSION(D%NIT*D%NJT*D%NKT) :: ZGX_M_U -REAL, DIMENSION(D%NIT,D%NJT,D%NKT):: ZY, ZDXX,ZDZZ,ZDZX +REAL, DIMENSION(D%NIT,D%NJT,D%NKT):: ZY, ZDXX INTEGER IIU,IKU,JI,JK,IKL, IKA ! INTEGER :: JJK,IJU @@ -456,6 +456,10 @@ IJU=D%NJT IKU=D%NKT IKL=D%NKL IKA=D%NKA +! +CALL D1D_TO_3D(D,PDXX,ZDXX) +CALL D1D_TO_3D(D,PY,ZY) +! IF (.NOT. OFLAT) THEN JIJKOR = 1 + JPHEXT + IIU*IJU*(JPVEXT_TURB+1 - 1) JIJKEND = IIU*IJU*(IKU-JPVEXT_TURB) @@ -479,26 +483,22 @@ IF (.NOT. OFLAT) THEN ) * PDZX(JIJKP1)* 0.25 & ) / PDXX(JIJK) END DO - +! CALL D1D_TO_3D(D,ZGX_M_U,PGX_M_U) -CALL D1D_TO_3D(D,PDXX,ZDXX) -CALL D1D_TO_3D(D,PDZZ,ZDZZ) -CALL D1D_TO_3D(D,PDZX,ZDZX) -CALL D1D_TO_3D(D,PY,ZY) ! DO JI=1+JPHEXT,IIU PGX_M_U(JI,:,IKU)= ( ZY(JI,:,IKU)-ZY(JI-1,:,IKU) ) / ZDXX(JI,:,IKU) PGX_M_U(JI,:,IKA)= -999. END DO -! - PGX_M_U(1,:,:)=PGX_M_U(IIU-2*JPHEXT+1,:,:) ELSE ! PGX_M_U = DXM(PY) / PDXX - PGX_M_U(1+JPHEXT:IIU,:,:) = ( ZY(1+JPHEXT:IIU,:,:)-ZY(JPHEXT:IIU-1,:,:) ) & - / ZDXX(1+JPHEXT:IIU,:,:) + PGX_M_U(1+1:IIU,:,:) = ( ZY(1+1:IIU,:,:)-ZY(1:IIU-1,:,:) ) & + / ZDXX(1+1:IIU,:,:) ! - PGX_M_U(1,:,:)=PGX_M_U(IIU-2*JPHEXT+1,:,:) ENDIF +DO JI=1,JPHEXT + PGX_M_U(JI,:,:)=PGX_M_U(IIU-2*JPHEXT+JI,:,:) ! for reprod JPHEXT <> 1 +END DO ! !------------------------------------------------------------------------------- ! @@ -623,14 +623,15 @@ IF (.NOT. OFLAT) THEN PGY_M_V(:,JJ,IKA)= -999. END DO ! - PGY_M_V(:,1,:)=PGY_M_V(:,IJU-2*JPHEXT+1,:) ELSE ! PGY_M_V = DYM(PY)/PDYY - PGY_M_V(:,1+JPHEXT:IJU,:) = ( PY(:,1+JPHEXT:IJU,:)-PY(:,JPHEXT:IJU-1,:) ) & - / PDYY(:,1+JPHEXT:IJU,:) + PGY_M_V(:,1+1:IJU,:) = ( PY(:,1+1:IJU,:)-PY(:,1:IJU-1,:) ) & + / PDYY(:,1+1:IJU,:) ! - PGY_M_V(:,1,:)=PGY_M_V(:,IJU-2*JPHEXT+1,:) ENDIF +DO JJ=1,JPHEXT + PGY_M_V(:,JJ,:)=PGY_M_V(:,IJU-2*JPHEXT+JJ,:) +END DO ! !------------------------------------------------------------------------------- ! diff --git a/src/common/aux/modd_cst.F90 b/src/common/aux/modd_cst.F90 index 544c754648621b3c66d725c261c57bedf412b244..cb0aed25e632bec67853d370ac79198d944051e4 100644 --- a/src/common/aux/modd_cst.F90 +++ b/src/common/aux/modd_cst.F90 @@ -1,10 +1,10 @@ -!MNH_LIC Copyright 1994-2021 CNRS, Meteo-France and Universite Paul Sabatier +!MNH_LIC Copyright 1994-2023 CNRS, Meteo-France and Universite Paul Sabatier !MNH_LIC This is part of the Meso-NH software governed by the CeCILL-C licence -!MNH_LIC version 1. See LICENSE, CeCILL-C_V1-en.txt and CeCILL-C_V1-fr.txt +!MNH_LIC version 1. See LICENSE, CeCILL-C_V1-en.txt and CeCILL-C_V1-fr.txt !MNH_LIC for details. version 1. !----------------------------------------------------------------- ! ############### - MODULE MODD_CST + MODULE MODD_CST ! ############### ! !!**** *MODD_CST* - declaration of Physic constants @@ -12,7 +12,7 @@ !! PURPOSE !! ------- ! The purpose of this declarative module is to declare the -! Physics constants. +! Physics constants. ! !! !!** IMPLICIT ARGUMENTS @@ -38,85 +38,85 @@ !! V. Masson 01/03/03 add conductivity of ice !! R. El Khatib 04/08/14 add pre-computed quantities !! J.Escobar : 10/2017 : for real*4 , add XMNH_HUGE_12_LOG -!! J.L. Redelsperger 03/2021 add constants for ocean penetrating solar -!! S. Riette: Jan 2022: introduction of a strucuture +! J.L. Redelsperger 03/2021: add constants for ocean penetrating solar +! S. Riette 01/2022: introduction of a structure +! P. Wautelet 20/05/2022: add RASTA cloud radar wavelength !------------------------------------------------------------------------------- ! !* 0. DECLARATIONS ! ------------ ! IMPLICIT NONE + +REAL, PARAMETER :: XLAM_CRAD = 3.154E-3 ! RASTA cloud radar wavelength (m) <=> 95.04 GHz + TYPE CST_t -REAL :: XPI ! Pi -! -REAL :: XDAY,XSIYEA,XSIDAY ! day duration, sideral year duration, - ! sideral day duration -! -REAL :: XKARMAN ! von karman constant -REAL :: XLIGHTSPEED ! light speed -REAL :: XPLANCK ! Planck constant -REAL :: XBOLTZ ! Boltzman constant -REAL :: XAVOGADRO ! Avogadro number -! -REAL :: XRADIUS,XOMEGA ! Earth radius, earth rotation -REAL :: XG ! Gravity constant -! -REAL :: XP00 ! Reference pressure -REAL :: XP00OCEAN ! Reference pressure for ocean model -REAL :: XRH00OCEAN ! Reference density for ocean model -! -REAL :: XSTEFAN,XI0 ! Stefan-Boltzman constant, solar constant -! -REAL :: XMD,XMV ! Molar mass of dry air and molar mass of vapor -REAL :: XRD,XRV ! Gaz constant for dry air, gaz constant for vapor -REAL :: XEPSILO ! XMV/XMD -REAL :: XCPD,XCPV ! Cpd (dry air), Cpv (vapor) -REAL :: XRHOLW ! Volumic mass of liquid water -REAL :: XCL,XCI ! Cl (liquid), Ci (ice) -REAL :: XTT ! Triple point temperature -REAL :: XLVTT ! Vaporization heat constant -REAL :: XLSTT ! Sublimation heat constant -REAL :: XLMTT ! Melting heat constant -REAL :: XESTT ! Saturation vapor pressure at triple point - ! temperature -REAL :: XALPW,XBETAW,XGAMW ! Constants for saturation vapor - ! pressure function -REAL :: XALPI,XBETAI,XGAMI ! Constants for saturation vapor - ! pressure function over solid ice -REAL :: XCONDI ! thermal conductivity of ice (W m-1 K-1) -REAL :: XALPHAOC ! thermal expansion coefficient for ocean (K-1) -REAL :: XBETAOC ! Haline contraction coeff for ocean (S-1) -REAL :: XTH00 ! reference value for the potential temperature -REAL :: XTH00OCEAN ! Ref value for pot temp in ocean model -REAL :: XSA00OCEAN ! Ref value for SAlinity in ocean model -REAL :: XROC=0.69! 3 coeffs for SW penetration in Ocean (Hoecker et al) -REAL :: XD1=1.1 -REAL :: XD2=23. -! Values used in SURFEX CMO -!REAL :: XROC=0.58 -!REAL :: XD1=0.35 -!REAL :: XD2=23. + REAL :: XPI ! Pi + ! + REAL :: XDAY,XSIYEA,XSIDAY ! day duration, sideral year duration, sideral day duration + ! + REAL :: XKARMAN ! von karman constant + REAL :: XLIGHTSPEED ! light speed + REAL :: XPLANCK ! Planck constant + REAL :: XBOLTZ ! Boltzman constant + REAL :: XAVOGADRO ! Avogadro number + ! + REAL :: XRADIUS,XOMEGA ! Earth radius, earth rotation + REAL :: XG ! Gravity constant + ! + REAL :: XP00 ! Reference pressure + REAL :: XP00OCEAN ! Reference pressure for ocean model + REAL :: XRH00OCEAN ! Reference density for ocean model + ! + REAL :: XSTEFAN,XI0 ! Stefan-Boltzman constant, solar constant + ! + REAL :: XMD,XMV ! Molar mass of dry air and molar mass of vapor + REAL :: XRD,XRV ! Gaz constant for dry air, gaz constant for vapor + REAL :: XEPSILO ! XMV/XMD + REAL :: XCPD,XCPV ! Cpd (dry air), Cpv (vapor) + REAL :: XRHOLW ! Volumic mass of liquid water + REAL :: XCL,XCI ! Cl (liquid), Ci (ice) + REAL :: XTT ! Triple point temperature + REAL :: XLVTT ! Vaporization heat constant + REAL :: XLSTT ! Sublimation heat constant + REAL :: XLMTT ! Melting heat constant + REAL :: XESTT ! Saturation vapor pressure at triple point temperature + REAL :: XALPW,XBETAW,XGAMW ! Constants for saturation vapor pressure function + REAL :: XALPI,XBETAI,XGAMI ! Constants for saturation vapor pressure function over solid ice + REAL :: XCONDI ! thermal conductivity of ice (W m-1 K-1) + REAL :: XALPHAOC ! thermal expansion coefficient for ocean (K-1) + REAL :: XBETAOC ! Haline contraction coeff for ocean (S-1) + REAL :: XTH00 ! reference value for the potential temperature + REAL :: XTH00OCEAN ! Ref value for pot temp in ocean model + REAL :: XSA00OCEAN ! Ref value for SAlinity in ocean model + REAL :: XROC=0.69! 3 coeffs for SW penetration in Ocean (Hoecker et al) + REAL :: XD1=1.1 + REAL :: XD2=23. + ! Values used in SURFEX CMO + !REAL :: XROC=0.58 + !REAL :: XD1=0.35 + !REAL :: XD2=23. -REAL :: XRHOLI ! Volumic mass of ice -! -INTEGER :: NDAYSEC ! Number of seconds in a day -! -REAL :: RDSRV ! XRD/XRV -REAL :: RDSCPD ! XRD/XCPD -REAL :: RINVXP00 ! 1./XP00 -! -! Some machine precision value depending of real4/8 use -! -REAL :: XMNH_TINY ! minimum real on this machine -REAL :: XMNH_TINY_12 ! sqrt(minimum real on this machine) -REAL :: XMNH_EPSILON ! minimum space with 1.0 -REAL :: XMNH_HUGE ! maximum real on this machine -REAL :: XMNH_HUGE_12_LOG ! maximum log(sqrt(real)) on this machine + REAL :: XRHOLI ! Volumic mass of ice + ! + INTEGER :: NDAYSEC ! Number of seconds in a day + ! + REAL :: RDSRV ! XRD/XRV + REAL :: RDSCPD ! XRD/XCPD + REAL :: RINVXP00 ! 1./XP00 + ! + ! Some machine precision value depending of real4/8 use + ! + REAL :: XMNH_TINY ! minimum real on this machine + REAL :: XMNH_TINY_12 ! sqrt(minimum real on this machine) + REAL :: XMNH_EPSILON ! minimum space with 1.0 + REAL :: XMNH_HUGE ! maximum real on this machine + REAL :: XMNH_HUGE_12_LOG ! maximum log(sqrt(real)) on this machine -REAL :: XEPS_DT ! default value for DT test -REAL :: XRES_FLAT_CART ! default flat&cart residual tolerance -REAL :: XRES_OTHER ! default not flat&cart residual tolerance -REAL :: XRES_PREP ! default prep residual tolerance + REAL :: XEPS_DT ! default value for DT test + REAL :: XRES_FLAT_CART ! default flat&cart residual tolerance + REAL :: XRES_OTHER ! default not flat&cart residual tolerance + REAL :: XRES_PREP ! default prep residual tolerance END TYPE CST_t TYPE(CST_t), TARGET, SAVE :: CST @@ -172,6 +172,7 @@ REAL, POINTER :: XRES_OTHER=>NULL() REAL, POINTER :: XRES_PREP=>NULL() ! CONTAINS + SUBROUTINE CST_ASSOCIATE() IMPLICIT NONE XPI=>CST%XPI diff --git a/src/common/micro/condensation.F90 b/src/common/micro/condensation.F90 index 8b46541123e578150e769d33e4a467814ecd8bd4..31fda664b8e3671dc4eff6ccdd3b7135b40b2f7e 100644 --- a/src/common/micro/condensation.F90 +++ b/src/common/micro/condensation.F90 @@ -239,10 +239,12 @@ ZDZREF = ICEP%XFRMIN(25) ! Thickness for unchanged vqsigsat (only used for LHGT_ PRC_OUT = PRC_IN PRV_OUT = PRV_IN PRI_OUT = PRI_IN -PHLC_HRC = 0. -PHLC_HCF = 0. -PHLI_HRI = 0. -PHLI_HCF = 0. +IF(PRESENT(PHLC_HRC)) THEN + PHLC_HRC = 0. + PHLC_HCF = 0. + PHLI_HRI = 0. + PHLI_HCF = 0. +END IF #endif IF(OCND2)ZPRIFACT = 0. ! diff --git a/src/common/turb/mode_prandtl.F90 b/src/common/turb/mode_prandtl.F90 index 120b784a5e170829bae52f188ff7f2b49a1501ce..9a0d77c6dd45218aecc31b142635e444bbb1d2c4 100644 --- a/src/common/turb/mode_prandtl.F90 +++ b/src/common/turb/mode_prandtl.F90 @@ -144,16 +144,16 @@ CONTAINS USE PARKIND1, ONLY : JPRB USE YOMHOOK , ONLY : LHOOK, DR_HOOK ! -USE MODD_CST, ONLY : CST_t -USE MODD_CTURB, ONLY : CSTURB_t -USE MODD_DIMPHYEX, ONLY: DIMPHYEX_t -USE MODD_FIELD, ONLY: TFIELDDATA, TYPEREAL +USE MODD_CST, ONLY: CST_t +USE MODD_CTURB, ONLY: CSTURB_t +USE MODD_DIMPHYEX, ONLY: DIMPHYEX_t +USE MODD_FIELD, ONLY: TFIELDMETADATA, TYPEREAL USE MODD_IO, ONLY: TFILEDATA -USE MODD_PARAMETERS, ONLY: JPVEXT_TURB +USE MODD_PARAMETERS, ONLY: JPVEXT_TURB ! +USE MODE_EMOIST, ONLY: EMOIST +USE MODE_ETHETA, ONLY: ETHETA USE MODE_GRADIENT_M_PHY, ONLY: GX_M_M_PHY, GY_M_M_PHY -USE MODE_EMOIST, ONLY : EMOIST -USE MODE_ETHETA, ONLY : ETHETA USE MODE_IO_FIELD_WRITE, ONLY: IO_FIELD_WRITE_PHY ! IMPLICIT NONE @@ -174,7 +174,7 @@ LOGICAL, INTENT(IN) :: OTURB_DIAG ! switch to write some LOGICAL, INTENT(IN) :: OOCEAN ! switch for Ocean model version LOGICAL, INTENT(IN) :: OHARAT LOGICAL, INTENT(IN) :: OCOMPUTE_SRC ! flag to define dimensions of SIGS and -LOGICAL, INTENT(IN) :: O2D ! Logical for 2D model version (modd_conf) +LOGICAL, INTENT(IN) :: O2D ! Logical for 2D model version (modd_conf) LOGICAL, INTENT(IN) :: OFLAT ! Logical for zero ororography CHARACTER(LEN=4), INTENT(IN) :: HTURBDIM ! Kind of turbulence param. TYPE(TFILEDATA), INTENT(IN) :: TPFILE ! Output file @@ -230,7 +230,7 @@ INTEGER :: IIJB,IIJE,IKT,IKA,IKL INTEGER :: JLOOP REAL :: ZMINVAL -TYPE(TFIELDDATA) :: TZFIELD +TYPE(TFIELDMETADATA) :: TZFIELD ! --------------------------------------------------------------------------- ! !* 1. DEFAULT VALUES, 1D REDELSPERGER NUMBERS @@ -656,68 +656,73 @@ END DO IF ( OTURB_DIAG .AND. TPFILE%LOPENED ) THEN ! ! stores the RED_TH1 - TZFIELD%CMNHNAME = 'RED_TH1' - TZFIELD%CSTDNAME = '' - TZFIELD%CLONGNAME = 'RED_TH1' - TZFIELD%CUNITS = '1' - TZFIELD%CDIR = 'XY' - TZFIELD%CCOMMENT = 'X_Y_Z_RED_TH1' - TZFIELD%NGRID = 4 - TZFIELD%NTYPE = TYPEREAL - TZFIELD%NDIMS = 3 - TZFIELD%LTIMEDEP = .TRUE. + TZFIELD = TFIELDMETADATA( & + CMNHNAME = 'RED_TH1', & + CSTDNAME = '', & + CLONGNAME = 'RED_TH1', & + CUNITS = '1', & + CDIR = 'XY', & + CCOMMENT = 'X_Y_Z_RED_TH1', & + NGRID = 4, & + NTYPE = TYPEREAL, & + NDIMS = 3, & + LTIMEDEP = .TRUE. ) CALL IO_FIELD_WRITE_PHY(D,TPFILE,TZFIELD,PREDTH1) ! ! stores the RED_R1 - TZFIELD%CMNHNAME = 'RED_R1' - TZFIELD%CSTDNAME = '' - TZFIELD%CLONGNAME = 'RED_R1' - TZFIELD%CUNITS = '1' - TZFIELD%CDIR = 'XY' - TZFIELD%CCOMMENT = 'X_Y_Z_RED_R1' - TZFIELD%NGRID = 4 - TZFIELD%NTYPE = TYPEREAL - TZFIELD%NDIMS = 3 - TZFIELD%LTIMEDEP = .TRUE. + TZFIELD = TFIELDMETADATA( & + CMNHNAME = 'RED_R1', & + CSTDNAME = '', & + CLONGNAME = 'RED_R1', & + CUNITS = '1', & + CDIR = 'XY', & + CCOMMENT = 'X_Y_Z_RED_R1', & + NGRID = 4, & + NTYPE = TYPEREAL, & + NDIMS = 3, & + LTIMEDEP = .TRUE. ) CALL IO_FIELD_WRITE_PHY(D,TPFILE,TZFIELD,PREDR1) ! ! stores the RED2_TH3 - TZFIELD%CMNHNAME = 'RED2_TH3' - TZFIELD%CSTDNAME = '' - TZFIELD%CLONGNAME = 'RED2_TH3' - TZFIELD%CUNITS = '1' - TZFIELD%CDIR = 'XY' - TZFIELD%CCOMMENT = 'X_Y_Z_RED2_TH3' - TZFIELD%NGRID = 4 - TZFIELD%NTYPE = TYPEREAL - TZFIELD%NDIMS = 3 - TZFIELD%LTIMEDEP = .TRUE. + TZFIELD = TFIELDMETADATA( & + CMNHNAME = 'RED2_TH3', & + CSTDNAME = '', & + CLONGNAME = 'RED2_TH3', & + CUNITS = '1', & + CDIR = 'XY', & + CCOMMENT = 'X_Y_Z_RED2_TH3', & + NGRID = 4, & + NTYPE = TYPEREAL, & + NDIMS = 3, & + LTIMEDEP = .TRUE. ) CALL IO_FIELD_WRITE_PHY(D,TPFILE,TZFIELD,PRED2TH3) ! ! stores the RED2_R3 - TZFIELD%CMNHNAME = 'RED2_R3' - TZFIELD%CSTDNAME = '' - TZFIELD%CLONGNAME = 'RED2_R3' - TZFIELD%CUNITS = '1' - TZFIELD%CDIR = 'XY' - TZFIELD%CCOMMENT = 'X_Y_Z_RED2_R3' - TZFIELD%NGRID = 4 - TZFIELD%NTYPE = TYPEREAL - TZFIELD%NDIMS = 3 - TZFIELD%LTIMEDEP = .TRUE. + TZFIELD = TFIELDMETADATA( & + CMNHNAME = 'RED2_R3', & + CSTDNAME = '', & + CLONGNAME = 'RED2_R3', & + CUNITS = '1', & + CDIR = 'XY', & + CCOMMENT = 'X_Y_Z_RED2_R3', & + NGRID = 4, & + NTYPE = TYPEREAL, & + NDIMS = 3, & + LTIMEDEP = .TRUE. ) CALL IO_FIELD_WRITE_PHY(D,TPFILE,TZFIELD,PRED2R3) ! ! stores the RED2_THR3 - TZFIELD%CMNHNAME = 'RED2_THR3' - TZFIELD%CSTDNAME = '' - TZFIELD%CLONGNAME = 'RED2_THR3' - TZFIELD%CUNITS = '1' - TZFIELD%CDIR = 'XY' - TZFIELD%CCOMMENT = 'X_Y_Z_RED2_THR3' - TZFIELD%NGRID = 4 - TZFIELD%NTYPE = TYPEREAL - TZFIELD%NDIMS = 3 - TZFIELD%LTIMEDEP = .TRUE. + TZFIELD = TFIELDMETADATA( & + CMNHNAME = 'RED2_THR3', & + CSTDNAME = '', & + CLONGNAME = 'RED2_THR3', & + CUNITS = '1', & + CDIR = 'XY', & + CCOMMENT = 'X_Y_Z_RED2_THR3', & + NGRID = 4, & + NTYPE = TYPEREAL, & + NDIMS = 3, & + LTIMEDEP = .TRUE. ) CALL IO_FIELD_WRITE_PHY(D,TPFILE,TZFIELD,PRED2THR3) ! END IF diff --git a/src/common/turb/mode_tke_eps_sources.F90 b/src/common/turb/mode_tke_eps_sources.F90 index 516d4e6896a51f3b007965a5f8cae6dae742175b..f7f6a5082ae0c68b332cc8b4fed22347fbd2bfd1 100644 --- a/src/common/turb/mode_tke_eps_sources.F90 +++ b/src/common/turb/mode_tke_eps_sources.F90 @@ -2,6 +2,7 @@ !MNH_LIC This is part of the Meso-NH software governed by the CeCILL-C licence !MNH_LIC version 1. See LICENSE, CeCILL-C_V1-en.txt and CeCILL-C_V1-fr.txt !MNH_LIC for details. version 1. +!----------------------------------------------------------------- MODULE MODE_TKE_EPS_SOURCES IMPLICIT NONE CONTAINS @@ -116,7 +117,6 @@ CONTAINS !! 2012-02 Y. Seity, add possibility to run with reversed !! vertical levels !! 2014-11 Y. Seity, add output terms for TKE DDHs budgets -!! -------------------------------------------------------------------------- !! 2015-01 (J. Escobar) missing get_halo(ZRES) for JPHEXT<> 1 !! J.Escobar : 15/09/2015 : WENO5 & JPHEXT <> 1 !! Philippe Wautelet: 05/2016-04/2018: new data structures and calls for I/O @@ -127,29 +127,28 @@ CONTAINS !* 0. DECLARATIONS ! ------------ ! -USE PARKIND1, ONLY : JPRB -USE YOMHOOK , ONLY : LHOOK, DR_HOOK +USE PARKIND1, ONLY: JPRB +USE SHUMAN_PHY, ONLY: MZM_PHY, MZF_PHY, DZF_PHY, DZM_PHY +USE YOMHOOK, ONLY: LHOOK, DR_HOOK ! USE MODD_ARGSLIST_ll, ONLY: LIST_ll -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_TURB_n, ONLY: TURB_t -USE MODD_DIMPHYEX, ONLY: DIMPHYEX_t -USE MODD_FIELD, ONLY: TFIELDDATA, TYPEREAL -USE MODD_IO, ONLY: TFILEDATA -USE MODD_LES, ONLY: TLES_t -USE MODD_PARAMETERS, ONLY: JPVEXT_TURB -! -USE MODE_BUDGET, ONLY: BUDGET_STORE_ADD_PHY, BUDGET_STORE_END_PHY, BUDGET_STORE_INIT_PHY +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_DIMPHYEX, ONLY: DIMPHYEX_t +USE MODD_FIELD, ONLY: TFIELDMETADATA, TYPEREAL +USE MODD_IO, ONLY: TFILEDATA +USE MODD_LES, ONLY: TLES_t +USE MODD_PARAMETERS, ONLY: JPVEXT_TURB +USE MODD_TURB_n, ONLY: TURB_t +! +USE MODE_BUDGET, ONLY: BUDGET_STORE_ADD_PHY, BUDGET_STORE_END_PHY, BUDGET_STORE_INIT_PHY USE MODE_IO_FIELD_WRITE, ONLY: IO_FIELD_WRITE_PHY USE MODE_ll ! -USE SHUMAN_PHY, ONLY: MZM_PHY, MZF_PHY, DZF_PHY, DZM_PHY -! USE MODI_GET_HALO USE MODI_LES_MEAN_SUBGRID_PHY -USE MODE_TRIDIAG_TKE, ONLY: TRIDIAG_TKE +USE MODE_TRIDIAG_TKE, ONLY: TRIDIAG_TKE ! ! IMPLICIT NONE @@ -164,37 +163,35 @@ TYPE(CSTURB_t), INTENT(IN) :: CSTURB TYPE(TBUDGETCONF_t), INTENT(IN) :: BUCONF TYPE(TURB_t), INTENT(IN) :: TURBN TYPE(TLES_t), INTENT(INOUT):: TLES +CHARACTER(LEN=6), INTENT(IN) :: HPROGRAM ! CPROGRAM is the program currently running (modd_conf) INTEGER, INTENT(IN) :: KMI ! model index number REAL, DIMENSION(D%NIJT,D%NKT), INTENT(IN) :: PTKEM ! TKE at t-deltat REAL, DIMENSION(D%NIJT,D%NKT), INTENT(IN) :: PLM ! mixing length REAL, DIMENSION(D%NIJT,D%NKT), INTENT(IN) :: PLEPS ! dissipative length +REAL, DIMENSION(D%NIJT,D%NKT), INTENT(INOUT):: PDP ! Dyn. prod. of TKE +REAL, DIMENSION(D%NIJT,D%NKT), INTENT(IN) :: PTRH REAL, DIMENSION(D%NIJT,D%NKT), INTENT(IN) :: PRHODJ ! density * grid volume -REAL, DIMENSION(D%NIJT,D%NKT), INTENT(IN) :: PDXX,PDYY,PDZZ,PDZX,PDZY - ! metric coefficients +REAL, DIMENSION(D%NIJT,D%NKT), INTENT(IN) :: PDXX,PDYY,PDZZ,PDZX,PDZY ! metric coefficients REAL, DIMENSION(D%NIJT,D%NKT), INTENT(IN) :: PZZ ! physical height w-pt REAL, INTENT(IN) :: PTSTEP ! Time step REAL, INTENT(IN) :: PEXPL ! Coef. temporal. disc. -CHARACTER(LEN=6), INTENT(IN) :: HPROGRAM ! CPROGRAM is the program currently running (modd_conf) TYPE(TFILEDATA), INTENT(IN) :: TPFILE ! Output file LOGICAL, INTENT(IN) :: ODIAG_IN_RUN ! switch to activate online diagnostics (mesonh) -LOGICAL, INTENT(IN) :: OOCEAN ! switch for Ocean model version -REAL, DIMENSION(D%NIJT,D%NKT), INTENT(INOUT):: PDP ! Dyn. prod. of TKE -REAL, DIMENSION(D%NIJT,D%NKT), INTENT(IN) :: PTRH +LOGICAL, INTENT(IN) :: OOCEAN ! switch for Ocean model version +REAL, DIMENSION(D%NIJT), INTENT(IN) :: PSFUM,PSFVM ! momentum sfc flux REAL, DIMENSION(D%NIJT,D%NKT), INTENT(IN) :: PTP ! Ther. prod. of TKE -REAL, DIMENSION(D%NIJT,D%NKT), INTENT(INOUT):: PRTKES ! RHOD * Jacobian * - ! TKE at t+deltat +REAL, DIMENSION(D%NIJT,D%NKT), INTENT(INOUT):: PRTKES ! RHOD * Jacobian * TKE at t+deltat REAL, DIMENSION(D%NIJT,D%NKT), INTENT(INOUT):: PRTHLS ! Source of Theta_l REAL, DIMENSION(D%NIJT,D%NKT), INTENT(IN) :: PCOEF_DISS ! 1/(Cph*Exner) REAL, DIMENSION(D%NIJT,D%NKT), INTENT(OUT) :: PTDIFF ! Diffusion TKE term REAL, DIMENSION(D%NIJT,D%NKT), INTENT(OUT) :: PTDISS ! Dissipation TKE term -REAL, DIMENSION(D%NIJT,D%NKT), INTENT(IN) :: PRTKEMS ! Advection source +REAL, DIMENSION(D%NIJT,D%NKT), INTENT(IN) :: PRTKEMS ! Advection source TYPE(TBUDGETDATA), DIMENSION(KBUDGETS), INTENT(INOUT) :: TBUDGETS -INTEGER, INTENT(IN) :: KBUDGETS -REAL, DIMENSION(D%NIJT,D%NKT), INTENT(OUT), OPTIONAL :: PTR ! Transport prod. of TKE -REAL, DIMENSION(D%NIJT,D%NKT), INTENT(OUT), OPTIONAL :: PDISS ! Dissipation of TKE -REAL, DIMENSION(D%NIJT,D%NKT), INTENT(OUT), OPTIONAL :: PEDR ! EDR -REAL, DIMENSION(D%NIJT,D%NKT), INTENT(INOUT), OPTIONAL :: PCURRENT_TKE_DISS ! if ODIAG_IN_RUN in mesonh -REAL, DIMENSION(D%NIJT), INTENT(IN) :: PSFUM,PSFVM ! momentum sfc flux +INTEGER, INTENT(IN) :: KBUDGETS +REAL, DIMENSION(D%NIJT,D%NKT), INTENT(OUT), OPTIONAL :: PEDR ! EDR +REAL, DIMENSION(D%NIJT,D%NKT), INTENT(OUT), OPTIONAL :: PTR ! Transport prod. of TKE +REAL, DIMENSION(D%NIJT,D%NKT), INTENT(OUT), OPTIONAL :: PDISS ! Dissipation of TKE +REAL, DIMENSION(D%NIJT,D%NKT), INTENT(INOUT), OPTIONAL :: PCURRENT_TKE_DISS ! if ODIAG_IN_RUN in mesonh ! ! ! @@ -220,7 +217,7 @@ INTEGER :: IIJB,IIJE,IKB,IKE,IKT,IKA,IKL ! Index value for the mass ! TYPE(LIST_ll), POINTER :: TZFIELDDISS_ll ! list of fields to exchange INTEGER :: IINFO_ll ! return code of parallel routine -TYPE(TFIELDDATA) :: TZFIELD +TYPE(TFIELDMETADATA) :: TZFIELD REAL(KIND=JPRB) :: ZHOOK_HANDLE INTEGER :: JIJ,JK ! @@ -476,58 +473,62 @@ IF ( TURBN%LTURB_DIAG .AND. TPFILE%LOPENED ) THEN ! ! stores the dynamic production ! - TZFIELD%CMNHNAME = 'DP' - TZFIELD%CSTDNAME = '' - TZFIELD%CLONGNAME = 'DP' - TZFIELD%CUNITS = 'm2 s-3' - TZFIELD%CDIR = 'XY' - TZFIELD%CCOMMENT = 'X_Y_Z_DP' - TZFIELD%NGRID = 1 - TZFIELD%NTYPE = TYPEREAL - TZFIELD%NDIMS = 3 - TZFIELD%LTIMEDEP = .TRUE. + TZFIELD = TFIELDMETADATA( & + CMNHNAME = 'DP', & + CSTDNAME = '', & + CLONGNAME = 'DP', & + CUNITS = 'm2 s-3', & + CDIR = 'XY', & + CCOMMENT = 'X_Y_Z_DP', & + NGRID = 1, & + NTYPE = TYPEREAL, & + NDIMS = 3, & + LTIMEDEP = .TRUE. ) CALL IO_FIELD_WRITE_PHY(D,TPFILE,TZFIELD,PDP) ! ! stores the thermal production ! - TZFIELD%CMNHNAME = 'TP' - TZFIELD%CSTDNAME = '' - TZFIELD%CLONGNAME = 'TP' - TZFIELD%CUNITS = 'm2 s-3' - TZFIELD%CDIR = 'XY' - TZFIELD%CCOMMENT = 'X_Y_Z_TP' - TZFIELD%NGRID = 1 - TZFIELD%NTYPE = TYPEREAL - TZFIELD%NDIMS = 3 - TZFIELD%LTIMEDEP = .TRUE. + TZFIELD = TFIELDMETADATA( & + CMNHNAME = 'TP', & + CSTDNAME = '', & + CLONGNAME = 'TP', & + CUNITS = 'm2 s-3', & + CDIR = 'XY', & + CCOMMENT = 'X_Y_Z_TP', & + NGRID = 1, & + NTYPE = TYPEREAL, & + NDIMS = 3, & + LTIMEDEP = .TRUE. ) CALL IO_FIELD_WRITE_PHY(D,TPFILE,TZFIELD,PTP) ! ! stores the whole turbulent transport ! - TZFIELD%CMNHNAME = 'TR' - TZFIELD%CSTDNAME = '' - TZFIELD%CLONGNAME = 'TR' - TZFIELD%CUNITS = 'm2 s-3' - TZFIELD%CDIR = 'XY' - TZFIELD%CCOMMENT = 'X_Y_Z_TR' - TZFIELD%NGRID = 1 - TZFIELD%NTYPE = TYPEREAL - TZFIELD%NDIMS = 3 - TZFIELD%LTIMEDEP = .TRUE. + TZFIELD = TFIELDMETADATA( & + CMNHNAME = 'TR', & + CSTDNAME = '', & + CLONGNAME = 'TR', & + CUNITS = 'm2 s-3', & + CDIR = 'XY', & + CCOMMENT = 'X_Y_Z_TR', & + NGRID = 1, & + NTYPE = TYPEREAL, & + NDIMS = 3, & + LTIMEDEP = .TRUE. ) CALL IO_FIELD_WRITE_PHY(D,TPFILE,TZFIELD,ZTR) ! ! stores the dissipation of TKE ! - TZFIELD%CMNHNAME = 'DISS' - TZFIELD%CSTDNAME = '' - TZFIELD%CLONGNAME = 'DISS' - TZFIELD%CUNITS = 'm2 s-3' - TZFIELD%CDIR = 'XY' - TZFIELD%CCOMMENT = 'X_Y_Z_DISS' - TZFIELD%NGRID = 1 - TZFIELD%NTYPE = TYPEREAL - TZFIELD%NDIMS = 3 - TZFIELD%LTIMEDEP = .TRUE. + TZFIELD = TFIELDMETADATA( & + CMNHNAME = 'DISS', & + CSTDNAME = '', & + CLONGNAME = 'DISS', & + CUNITS = 'm2 s-3', & + CDIR = 'XY', & + CCOMMENT = 'X_Y_Z_DISS', & + NGRID = 1, & + NTYPE = TYPEREAL, & + NDIMS = 3, & + LTIMEDEP = .TRUE. ) CALL IO_FIELD_WRITE_PHY(D,TPFILE,TZFIELD,PDISS) END IF ! diff --git a/src/common/turb/mode_turb_hor_dyn_corr.F90 b/src/common/turb/mode_turb_hor_dyn_corr.F90 index 6bfd6f98ef8d968586fcd46d5bea23844f4855f1..32270e64e5176722c2eaf993ef9376614878d4e9 100644 --- a/src/common/turb/mode_turb_hor_dyn_corr.F90 +++ b/src/common/turb/mode_turb_hor_dyn_corr.F90 @@ -75,7 +75,7 @@ USE MODD_TURB_n, ONLY: TURB_t USE MODD_ARGSLIST_ll, ONLY: LIST_ll USE MODD_CST USE MODD_CTURB -USE MODD_FIELD, ONLY: TFIELDDATA, TYPEREAL +use modd_field, only: tfieldmetadata, TYPEREAL USE MODD_IO, ONLY: TFILEDATA USE MODD_PARAMETERS USE MODD_LES, ONLY: TLES_t @@ -189,7 +189,7 @@ REAL :: ZTIME1, ZTIME2 REAL, DIMENSION(SIZE(PDZZ,1),SIZE(PDZZ,2),1+JPVEXT:3+JPVEXT) :: ZCOEFF , ZDZZ ! coefficients for the uncentred gradient ! computation near the ground -TYPE(TFIELDDATA) :: TZFIELD +TYPE(TFIELDMETADATA) :: TZFIELD ! -------------------------------------------------------------------------- ! !* 1. PRELIMINARY COMPUTATIONS @@ -304,17 +304,18 @@ ZFLX(:,:,IKB-1) = 2. * ZFLX(:,:,IKB-1) - ZFLX(:,:,IKB) CALL UPDATE_HALO_ll(TZFIELDS_ll, IINFO_ll) IF ( TPFILE%LOPENED .AND. TURBN%LTURB_FLX ) THEN ! stores <U U> - TZFIELD%CMNHNAME = 'U_VAR' - TZFIELD%CSTDNAME = '' - TZFIELD%CLONGNAME = 'U_VAR' - TZFIELD%CUNITS = 'm2 s-2' - TZFIELD%CDIR = 'XY' - TZFIELD%CCOMMENT = 'X_Y_Z_U_VAR' - TZFIELD%NGRID = 1 - TZFIELD%NTYPE = TYPEREAL - TZFIELD%NDIMS = 3 - TZFIELD%LTIMEDEP = .TRUE. - CALL IO_FIELD_WRITE(TPFILE,TZFIELD,ZFLX) + TZFIELD = TFIELDMETADATA( & + CMNHNAME = 'U_VAR', & + CSTDNAME = '', & + CLONGNAME = 'U_VAR', & + CUNITS = 'm2 s-2', & + CDIR = 'XY', & + CCOMMENT = 'X_Y_Z_U_VAR', & + NGRID = 1, & + NTYPE = TYPEREAL, & + NDIMS = 3, & + LTIMEDEP = .TRUE. ) + CALL IO_Field_write(TPFILE,TZFIELD,ZFLX) END IF ! ! Complete the U tendency @@ -399,17 +400,18 @@ CALL UPDATE_HALO_ll(TZFIELDS_ll, IINFO_ll) ! IF ( TPFILE%LOPENED .AND. TURBN%LTURB_FLX ) THEN ! stores <V V> - TZFIELD%CMNHNAME = 'V_VAR' - TZFIELD%CSTDNAME = '' - TZFIELD%CLONGNAME = 'V_VAR' - TZFIELD%CUNITS = 'm2 s-2' - TZFIELD%CDIR = 'XY' - TZFIELD%CCOMMENT = 'X_Y_Z_V_VAR' - TZFIELD%NGRID = 1 - TZFIELD%NTYPE = TYPEREAL - TZFIELD%NDIMS = 3 - TZFIELD%LTIMEDEP = .TRUE. - CALL IO_FIELD_WRITE(TPFILE,TZFIELD,ZFLX) + TZFIELD = TFIELDMETADATA( & + CMNHNAME = 'V_VAR', & + CSTDNAME = '', & + CLONGNAME = 'V_VAR', & + CUNITS = 'm2 s-2', & + CDIR = 'XY', & + CCOMMENT = 'X_Y_Z_V_VAR', & + NGRID = 1, & + NTYPE = TYPEREAL, & + NDIMS = 3, & + LTIMEDEP = .TRUE. ) + CALL IO_Field_write(TPFILE,TZFIELD,ZFLX) END IF ! ! Complete the V tendency @@ -486,17 +488,18 @@ ZFLX(:,:,IKB-1) = 2. * ZFLX(:,:,IKB-1) - ZFLX(:,:,IKB) ! IF ( TPFILE%LOPENED .AND. TURBN%LTURB_FLX ) THEN ! stores <W W> - TZFIELD%CMNHNAME = 'W_VAR' - TZFIELD%CSTDNAME = '' - TZFIELD%CLONGNAME = 'W_VAR' - TZFIELD%CUNITS = 'm2 s-2' - TZFIELD%CDIR = 'XY' - TZFIELD%CCOMMENT = 'X_Y_Z_W_VAR' - TZFIELD%NGRID = 1 - TZFIELD%NTYPE = TYPEREAL - TZFIELD%NDIMS = 3 - TZFIELD%LTIMEDEP = .TRUE. - CALL IO_FIELD_WRITE(TPFILE,TZFIELD,ZFLX) + TZFIELD = TFIELDMETADATA( & + CMNHNAME = 'W_VAR', & + CSTDNAME = '', & + CLONGNAME = 'W_VAR', & + CUNITS = 'm2 s-2', & + CDIR = 'XY', & + CCOMMENT = 'X_Y_Z_W_VAR', & + NGRID = 1, & + NTYPE = TYPEREAL, & + NDIMS = 3, & + LTIMEDEP = .TRUE. ) + CALL IO_Field_write(TPFILE,TZFIELD,ZFLX) END IF ! ! Complete the W tendency diff --git a/src/common/turb/mode_turb_hor_sv_flux.F90 b/src/common/turb/mode_turb_hor_sv_flux.F90 index ae50bb870a833b4b7553d7eb95c33ba992679fcd..db1b033eb0a08f2670ba8cc52706c4b97b8bf8f1 100644 --- a/src/common/turb/mode_turb_hor_sv_flux.F90 +++ b/src/common/turb/mode_turb_hor_sv_flux.F90 @@ -63,7 +63,7 @@ USE MODD_TURB_n, ONLY: TURB_t ! USE MODD_CST USE MODD_CTURB -USE MODD_FIELD, ONLY: TFIELDDATA, TYPEREAL +use modd_field, only: tfieldmetadata, TYPEREAL USE MODD_IO, ONLY: TFILEDATA USE MODD_PARAMETERS USE MODD_LES, ONLY: TLES_t @@ -139,8 +139,9 @@ REAL, DIMENSION(SIZE(PDZZ,1),SIZE(PDZZ,2),1+JPVEXT:3+JPVEXT) :: ZCOEFF ! coefficients for the uncentred gradient ! computation near the ground ! +CHARACTER(LEN=NMNHNAMELGTMAX) :: YMNHNAME INTEGER :: IKU -TYPE(TFIELDDATA) :: TZFIELD +TYPE(TFIELDMETADATA) :: TZFIELD REAL :: ZTIME1, ZTIME2 ! --------------------------------------------------------------------------- ! @@ -202,17 +203,19 @@ DO JSV=1,ISV ! ! stores <U SVth> IF ( TPFILE%LOPENED .AND. TURBN%LTURB_FLX ) THEN - WRITE(TZFIELD%CMNHNAME,'("USV_FLX_",I3.3)') JSV - TZFIELD%CSTDNAME = '' - TZFIELD%CLONGNAME = TRIM(TZFIELD%CMNHNAME) - TZFIELD%CUNITS = 'SVUNIT m s-1' - TZFIELD%CDIR = 'XY' - TZFIELD%CCOMMENT = 'X_Y_Z_'//TRIM(TZFIELD%CMNHNAME) - TZFIELD%NGRID = 2 - TZFIELD%NTYPE = TYPEREAL - TZFIELD%NDIMS = 3 - TZFIELD%LTIMEDEP = .TRUE. - CALL IO_FIELD_WRITE(TPFILE,TZFIELD,ZFLXX) + WRITE(YMNHNAME,'("USV_FLX_",I3.3)') JSV + TZFIELD = TFIELDMETADATA( & + CMNHNAME = TRIM( YMNHNAME ), & + CSTDNAME = '', & + CLONGNAME = TRIM( YMNHNAME ), & + CUNITS = 'SVUNIT m s-1', & + CDIR = 'XY', & + CCOMMENT = 'X_Y_Z_' // TRIM( YMNHNAME ), & + NGRID = 2, & + NTYPE = TYPEREAL, & + NDIMS = 3, & + LTIMEDEP = .TRUE. ) + CALL IO_Field_write(TPFILE,TZFIELD,ZFLXX) END IF ! IF (TLES%LLES_CALL .AND. KSPLT==1) THEN @@ -253,17 +256,19 @@ DO JSV=1,ISV ! ! stores <V SVth> IF ( TPFILE%LOPENED .AND. TURBN%LTURB_FLX ) THEN - WRITE(TZFIELD%CMNHNAME,'("VSV_FLX_",I3.3)') JSV - TZFIELD%CSTDNAME = '' - TZFIELD%CLONGNAME = TRIM(TZFIELD%CMNHNAME) - TZFIELD%CUNITS = 'SVUNIT m s-1' - TZFIELD%CDIR = 'XY' - TZFIELD%CCOMMENT = 'X_Y_Z_'//TRIM(TZFIELD%CMNHNAME) - TZFIELD%NGRID = 3 - TZFIELD%NTYPE = TYPEREAL - TZFIELD%NDIMS = 3 - TZFIELD%LTIMEDEP = .TRUE. - CALL IO_FIELD_WRITE(TPFILE,TZFIELD,ZFLXY) + WRITE(YMNHNAME,'("VSV_FLX_",I3.3)') JSV + TZFIELD = TFIELDMETADATA( & + CMNHNAME = TRIM( YMNHNAME ), & + CSTDNAME = '', & + CLONGNAME = TRIM(TZFIELD%CMNHNAME), & + CUNITS = 'SVUNIT m s-1', & + CDIR = 'XY', & + CCOMMENT = 'X_Y_Z_'//TRIM(TZFIELD%CMNHNAME), & + NGRID = 3, & + NTYPE = TYPEREAL, & + NDIMS = 3, & + LTIMEDEP = .TRUE. ) + CALL IO_Field_write(TPFILE,TZFIELD,ZFLXY) END IF ! ELSE diff --git a/src/common/turb/mode_turb_hor_thermo_corr.F90 b/src/common/turb/mode_turb_hor_thermo_corr.F90 index 6c00603eac98ae37d90ce1b495ed6df6a695eaf3..268f923931607513832a9af54690e02638893bde 100644 --- a/src/common/turb/mode_turb_hor_thermo_corr.F90 +++ b/src/common/turb/mode_turb_hor_thermo_corr.F90 @@ -59,14 +59,14 @@ CONTAINS !* 0. DECLARATIONS ! ------------ ! -USE MODD_CST, ONLY : CST_t +USE MODD_CST, ONLY : CST_t USE MODD_CTURB -USE MODD_FIELD, ONLY: TFIELDDATA, TYPEREAL -USE MODD_DIMPHYEX, ONLY: DIMPHYEX_t -USE MODD_TURB_n, ONLY: TURB_t +USE MODD_DIMPHYEX, ONLY: DIMPHYEX_t +USE MODD_FIELD, ONLY: TFIELDMETADATA, TYPEREAL USE MODD_IO, ONLY: TFILEDATA -USE MODD_PARAMETERS USE MODD_LES, ONLY: TLES_t +USE MODD_PARAMETERS +USE MODD_TURB_n, ONLY: TURB_t ! USE MODE_IO_FIELD_WRITE, ONLY: IO_FIELD_WRITE ! @@ -142,7 +142,7 @@ REAL, DIMENSION(SIZE(PDZZ,1),SIZE(PDZZ,2),1+JPVEXT:3+JPVEXT) :: ZCOEFF ! coefficients for the uncentred gradient ! computation near the ground REAL :: ZTIME1, ZTIME2 -TYPE(TFIELDDATA) :: TZFIELD +TYPE(TFIELDMETADATA) :: TZFIELD ! ! --------------------------------------------------------------------------- ! @@ -211,16 +211,17 @@ IF ( ( KRRL > 0 .AND. TURBN%LSUBG_COND) .OR. ( TURBN%LTURB_FLX .AND. TPFILE%LOPE ! ! stores <THl THl> IF ( TURBN%LTURB_FLX .AND. TPFILE%LOPENED ) THEN - TZFIELD%CMNHNAME = 'THL_HVAR' - TZFIELD%CSTDNAME = '' - TZFIELD%CLONGNAME = 'THL_HVAR' - TZFIELD%CUNITS = 'K2' - TZFIELD%CDIR = 'XY' - TZFIELD%CCOMMENT = 'X_Y_Z_THL_HVAR' - TZFIELD%NGRID = 1 - TZFIELD%NTYPE = TYPEREAL - TZFIELD%NDIMS = 3 - TZFIELD%LTIMEDEP = .TRUE. + TZFIELD = TFIELDMETADATA( & + CMNHNAME = 'THL_HVAR', & + CSTDNAME = '', & + CLONGNAME = 'THL_HVAR', & + CUNITS = 'K2', & + CDIR = 'XY', & + CCOMMENT = 'X_Y_Z_THL_HVAR', & + NGRID = 1, & + NTYPE = TYPEREAL, & + NDIMS = 3, & + LTIMEDEP = .TRUE. ) CALL IO_FIELD_WRITE(TPFILE,TZFIELD,ZFLX) END IF ! @@ -299,16 +300,17 @@ IF ( ( KRRL > 0 .AND. TURBN%LSUBG_COND) .OR. ( TURBN%LTURB_FLX .AND. TPFILE%LOPE ! ! stores <THl Rnp> IF ( TURBN%LTURB_FLX .AND. TPFILE%LOPENED ) THEN - TZFIELD%CMNHNAME = 'THLR_HCOR' - TZFIELD%CSTDNAME = '' - TZFIELD%CLONGNAME = 'THLR_HCOR' - TZFIELD%CUNITS = 'K kg kg-1' - TZFIELD%CDIR = 'XY' - TZFIELD%CCOMMENT = 'X_Y_Z_THLR_HCOR' - TZFIELD%NGRID = 1 - TZFIELD%NTYPE = TYPEREAL - TZFIELD%NDIMS = 3 - TZFIELD%LTIMEDEP = .TRUE. + TZFIELD = TFIELDMETADATA( & + CMNHNAME = 'THLR_HCOR', & + CSTDNAME = '', & + CLONGNAME = 'THLR_HCOR', & + CUNITS = 'K kg kg-1', & + CDIR = 'XY', & + CCOMMENT = 'X_Y_Z_THLR_HCOR', & + NGRID = 1, & + NTYPE = TYPEREAL, & + NDIMS = 3, & + LTIMEDEP = .TRUE. ) CALL IO_FIELD_WRITE(TPFILE,TZFIELD,ZFLX) END IF ! @@ -367,16 +369,17 @@ IF ( ( KRRL > 0 .AND. TURBN%LSUBG_COND) .OR. ( TURBN%LTURB_FLX .AND. TPFILE%LOPE ! ! stores <Rnp Rnp> IF ( TURBN%LTURB_FLX .AND. TPFILE%LOPENED ) THEN - TZFIELD%CMNHNAME = 'R_HVAR' - TZFIELD%CSTDNAME = '' - TZFIELD%CLONGNAME = 'R_HVAR' - TZFIELD%CUNITS = 'kg2 kg-2' - TZFIELD%CDIR = 'XY' - TZFIELD%CCOMMENT = 'X_Y_Z_R_HVAR' - TZFIELD%NGRID = 1 - TZFIELD%NTYPE = TYPEREAL - TZFIELD%NDIMS = 3 - TZFIELD%LTIMEDEP = .TRUE. + TZFIELD = TFIELDMETADATA( & + CMNHNAME = 'R_HVAR', & + CSTDNAME = '', & + CLONGNAME = 'R_HVAR', & + CUNITS = 'kg2 kg-2', & + CDIR = 'XY', & + CCOMMENT = 'X_Y_Z_R_HVAR', & + NGRID = 1, & + NTYPE = TYPEREAL, & + NDIMS = 3, & + LTIMEDEP = .TRUE. ) CALL IO_FIELD_WRITE(TPFILE,TZFIELD,ZFLX) END IF ! diff --git a/src/common/turb/mode_turb_hor_thermo_flux.F90 b/src/common/turb/mode_turb_hor_thermo_flux.F90 index 93313669a3ffc01ca0ddf57ed8b0a999e541259f..0654ed9918e6e044ccc1c1ee87988a1e6d9e674c 100644 --- a/src/common/turb/mode_turb_hor_thermo_flux.F90 +++ b/src/common/turb/mode_turb_hor_thermo_flux.F90 @@ -65,7 +65,7 @@ USE MODD_TURB_n, ONLY: TURB_t ! USE MODD_CST USE MODD_CTURB -USE MODD_FIELD, ONLY: TFIELDDATA, TYPEREAL +USE MODD_FIELD, ONLY: TFIELDMETADATA, TYPEREAL USE MODD_IO, ONLY: TFILEDATA USE MODD_PARAMETERS USE MODD_LES, ONLY: TLES_t @@ -149,7 +149,7 @@ REAL, DIMENSION(SIZE(PDZZ,1),SIZE(PDZZ,2),1+JPVEXT:3+JPVEXT) :: ZCOEFF ! computation near the ground ! REAL :: ZTIME1, ZTIME2 -TYPE(TFIELDDATA) :: TZFIELD +TYPE(TFIELDMETADATA) :: TZFIELD ! --------------------------------------------------------------------------- ! !* 1. PRELIMINARY COMPUTATIONS @@ -246,16 +246,17 @@ END IF ! ! stores the horizontal <U THl> IF ( TPFILE%LOPENED .AND. TURBN%LTURB_FLX ) THEN - TZFIELD%CMNHNAME = 'UTHL_FLX' - TZFIELD%CSTDNAME = '' - TZFIELD%CLONGNAME = 'UTHL_FLX' - TZFIELD%CUNITS = 'K m s-1' - TZFIELD%CDIR = 'XY' - TZFIELD%CCOMMENT = 'X_Y_Z_UTHL_FLX' - TZFIELD%NGRID = 2 - TZFIELD%NTYPE = TYPEREAL - TZFIELD%NDIMS = 3 - TZFIELD%LTIMEDEP = .TRUE. + TZFIELD = TFIELDMETADATA( & + CMNHNAME = 'UTHL_FLX', & + CSTDNAME = '', & + CLONGNAME = 'UTHL_FLX', & + CUNITS = 'K m s-1', & + CDIR = 'XY', & + CCOMMENT = 'X_Y_Z_UTHL_FLX', & + NGRID = 2, & + NTYPE = TYPEREAL, & + NDIMS = 3, & + LTIMEDEP = .TRUE. ) CALL IO_FIELD_WRITE(TPFILE,TZFIELD,ZFLX) END IF ! @@ -349,16 +350,17 @@ IF (KRR/=0) THEN ! ! stores the horizontal <U Rnp> IF ( TPFILE%LOPENED .AND. TURBN%LTURB_FLX ) THEN - TZFIELD%CMNHNAME = 'UR_FLX' - TZFIELD%CSTDNAME = '' - TZFIELD%CLONGNAME = 'UR_FLX' - TZFIELD%CUNITS = 'kg kg-1 m s-1' - TZFIELD%CDIR = 'XY' - TZFIELD%CCOMMENT = 'X_Y_Z_UR_FLX' - TZFIELD%NGRID = 2 - TZFIELD%NTYPE = TYPEREAL - TZFIELD%NDIMS = 3 - TZFIELD%LTIMEDEP = .TRUE. + TZFIELD = TFIELDMETADATA( & + CMNHNAME = 'UR_FLX', & + CSTDNAME = '', & + CLONGNAME = 'UR_FLX', & + CUNITS = 'kg kg-1 m s-1', & + CDIR = 'XY', & + CCOMMENT = 'X_Y_Z_UR_FLX', & + NGRID = 2, & + NTYPE = TYPEREAL, & + NDIMS = 3, & + LTIMEDEP = .TRUE. ) CALL IO_FIELD_WRITE(TPFILE,TZFIELD,ZFLX) END IF ! @@ -398,16 +400,17 @@ END IF !! ! !! ! stores the horizontal <U VPT> !! IF ( TPFILE%LOPENED .AND. TURBN%LTURB_FLX ) THEN -!! TZFIELD%CMNHNAME = 'UVPT_FLX' -!! TZFIELD%CSTDNAME = '' -!! TZFIELD%CLONGNAME = 'UVPT_FLX' -!! TZFIELD%CUNITS = 'K m s-1' -!! TZFIELD%CDIR = 'XY' -!! TZFIELD%CCOMMENT = 'X_Y_Z_UVPT_FLX' -!! TZFIELD%NGRID = 2 -!! TZFIELD%NTYPE = TYPEREAL -!! TZFIELD%NDIMS = 3 -!! TZFIELD%LTIMEDEP = .TRUE. +!! TZFIELD = TFIELDMETADATA( & +!! CMNHNAME = 'UVPT_FLX', & +!! CSTDNAME = '', & +!! CLONGNAME = 'UVPT_FLX', & +!! CUNITS = 'K m s-1', & +!! CDIR = 'XY', & +!! CCOMMENT = 'X_Y_Z_UVPT_FLX', & +!! NGRID = 2, & +!! NTYPE = TYPEREAL, & +!! NDIMS = 3, & +!! LTIMEDEP = .TRUE. ) !! CALL IO_FIELD_WRITE(TPFILE,TZFIELD,ZVPTU) !! END IF !!! @@ -501,16 +504,17 @@ END IF ! ! stores the horizontal <V THl> IF ( TPFILE%LOPENED .AND. TURBN%LTURB_FLX ) THEN - TZFIELD%CMNHNAME = 'VTHL_FLX' - TZFIELD%CSTDNAME = '' - TZFIELD%CLONGNAME = 'VTHL_FLX' - TZFIELD%CUNITS = 'K m s-1' - TZFIELD%CDIR = 'XY' - TZFIELD%CCOMMENT = 'X_Y_Z_VTHL_FLX' - TZFIELD%NGRID = 3 - TZFIELD%NTYPE = TYPEREAL - TZFIELD%NDIMS = 3 - TZFIELD%LTIMEDEP = .TRUE. + TZFIELD = TFIELDMETADATA( & + CMNHNAME = 'VTHL_FLX', & + CSTDNAME = '', & + CLONGNAME = 'VTHL_FLX', & + CUNITS = 'K m s-1', & + CDIR = 'XY', & + CCOMMENT = 'X_Y_Z_VTHL_FLX', & + NGRID = 3, & + NTYPE = TYPEREAL, & + NDIMS = 3, & + LTIMEDEP = .TRUE. ) CALL IO_FIELD_WRITE(TPFILE,TZFIELD,ZFLX) END IF ! @@ -613,16 +617,17 @@ IF (KRR/=0) THEN ! ! stores the horizontal <V Rnp> IF ( TPFILE%LOPENED .AND. TURBN%LTURB_FLX ) THEN - TZFIELD%CMNHNAME = 'VR_FLX' - TZFIELD%CSTDNAME = '' - TZFIELD%CLONGNAME = 'VR_FLX' - TZFIELD%CUNITS = 'kg kg-1 m s-1' - TZFIELD%CDIR = 'XY' - TZFIELD%CCOMMENT = 'X_Y_Z_VR_FLX' - TZFIELD%NGRID = 3 - TZFIELD%NTYPE = TYPEREAL - TZFIELD%NDIMS = 3 - TZFIELD%LTIMEDEP = .TRUE. + TZFIELD = TFIELDMETADATA( & + CMNHNAME = 'VR_FLX', & + CSTDNAME = '', & + CLONGNAME = 'VR_FLX', & + CUNITS = 'kg kg-1 m s-1', & + CDIR = 'XY', & + CCOMMENT = 'X_Y_Z_VR_FLX', & + NGRID = 3, & + NTYPE = TYPEREAL, & + NDIMS = 3, & + LTIMEDEP = .TRUE. ) CALL IO_FIELD_WRITE(TPFILE,TZFIELD,ZFLX) END IF ! @@ -666,16 +671,17 @@ END IF !! ! !! ! stores the horizontal <V VPT> !! IF ( TPFILE%LOPENED .AND. TURBN%LTURB_FLX ) THEN -!! TZFIELD%CMNHNAME = 'VVPT_FLX' -!! TZFIELD%CSTDNAME = '' -!! TZFIELD%CLONGNAME = 'VVPT_FLX' -!! TZFIELD%CUNITS = 'K m s-1' -!! TZFIELD%CDIR = 'XY' -!! TZFIELD%CCOMMENT = 'X_Y_Z_VVPT_FLX' -!! TZFIELD%NGRID = 3 -!! TZFIELD%NTYPE = TYPEREAL -!! TZFIELD%NDIMS = 3 -!! TZFIELD%LTIMEDEP = .TRUE. +!! TZFIELD = TFIELDMETADATA( & +!! CMNHNAME = 'VVPT_FLX', & +!! CSTDNAME = '', & +!! CLONGNAME = 'VVPT_FLX', & +!! CUNITS = 'K m s-1', & +!! CDIR = 'XY', & +!! CCOMMENT = 'X_Y_Z_VVPT_FLX', & +!! NGRID = 3, & +!! NTYPE = TYPEREAL, & +!! NDIMS = 3, & +!! LTIMEDEP = .TRUE. ) !! CALL IO_FIELD_WRITE(TPFILE,TZFIELD,ZVPTV) !! END IF !!! diff --git a/src/common/turb/mode_turb_hor_uv.F90 b/src/common/turb/mode_turb_hor_uv.F90 index cd9a3f32a3147c77477cbd5c035ad92d62a56d75..717ef59073695384a958d49e2c3a1ff00090ec2b 100644 --- a/src/common/turb/mode_turb_hor_uv.F90 +++ b/src/common/turb/mode_turb_hor_uv.F90 @@ -62,7 +62,7 @@ USE MODD_TURB_n, ONLY: TURB_t ! USE MODD_CST USE MODD_CTURB -USE MODD_FIELD, ONLY: TFIELDDATA, TYPEREAL +USE MODD_FIELD, ONLY: TFIELDMETADATA, TYPEREAL USE MODD_IO, ONLY: TFILEDATA USE MODD_PARAMETERS USE MODD_LES, ONLY: TLES_t @@ -146,7 +146,7 @@ REAL, DIMENSION(SIZE(PUM,1),SIZE(PUM,2),SIZE(PUM,3)) :: GY_U_UV_PUM REAL, DIMENSION(SIZE(PVM,1),SIZE(PVM,2),SIZE(PVM,3)) :: GX_V_UV_PVM ! REAL :: ZTIME1, ZTIME2 -TYPE(TFIELDDATA) :: TZFIELD +TYPE(TFIELDMETADATA) :: TZFIELD ! --------------------------------------------------------------------------- ! !* 1. PRELIMINARY COMPUTATIONS @@ -208,16 +208,17 @@ ZFLX(:,:,IKB-1:IKB-1) = 2. * MXM( MYM( ZFLX(:,:,IKB-1:IKB-1) ) ) & ! ! stores <U V> IF ( TPFILE%LOPENED .AND. TURBN%LTURB_FLX ) THEN - TZFIELD%CMNHNAME = 'UV_FLX' - TZFIELD%CSTDNAME = '' - TZFIELD%CLONGNAME = 'UV_FLX' - TZFIELD%CUNITS = 'm2 s-2' - TZFIELD%CDIR = 'XY' - TZFIELD%CCOMMENT = 'X_Y_Z_UV_FLX' - TZFIELD%NGRID = 5 - TZFIELD%NTYPE = TYPEREAL - TZFIELD%NDIMS = 3 - TZFIELD%LTIMEDEP = .TRUE. + TZFIELD = TFIELDMETADATA( & + CMNHNAME = 'UV_FLX', & + CSTDNAME = '', & + CLONGNAME = 'UV_FLX', & + CUNITS = 'm2 s-2', & + CDIR = 'XY', & + CCOMMENT = 'X_Y_Z_UV_FLX', & + NGRID = 5, & + NTYPE = TYPEREAL, & + NDIMS = 3, & + LTIMEDEP = .TRUE. ) CALL IO_FIELD_WRITE(TPFILE,TZFIELD,ZFLX) END IF ! diff --git a/src/common/turb/mode_turb_hor_uw.F90 b/src/common/turb/mode_turb_hor_uw.F90 index b13acfaa287d3038bec942634f4c1b85dcde385a..1885d3d9eda92940af4df9714b87cb8cf6db225a 100644 --- a/src/common/turb/mode_turb_hor_uw.F90 +++ b/src/common/turb/mode_turb_hor_uw.F90 @@ -66,7 +66,7 @@ USE MODD_TURB_n, ONLY: TURB_t ! USE MODD_CST USE MODD_CTURB -USE MODD_FIELD, ONLY: TFIELDDATA, TYPEREAL +USE MODD_FIELD, ONLY: TFIELDMETADATA, TYPEREAL USE MODD_IO, ONLY: TFILEDATA USE MODD_PARAMETERS USE MODD_LES, ONLY: TLES_t @@ -137,7 +137,7 @@ INTEGER :: JSV ! scalar loop counter REAL, DIMENSION(SIZE(PWM,1),SIZE(PWM,2),SIZE(PWM,3)) :: GX_W_UW_PWM ! REAL :: ZTIME1, ZTIME2 -TYPE(TFIELDDATA) :: TZFIELD +TYPE(TFIELDMETADATA) :: TZFIELD ! --------------------------------------------------------------------------- ! !* 1. PRELIMINARY COMPUTATIONS @@ -170,16 +170,17 @@ ZFLX(:,:,IKB-1)=2.*ZFLX(:,:,IKB)- ZFLX(:,:,IKB+1) ! ! stores <U W> IF ( TPFILE%LOPENED .AND. TURBN%LTURB_FLX ) THEN - TZFIELD%CMNHNAME = 'UW_HFLX' - TZFIELD%CSTDNAME = '' - TZFIELD%CLONGNAME = 'UW_HFLX' - TZFIELD%CUNITS = 'm2 s-2' - TZFIELD%CDIR = 'XY' - TZFIELD%CCOMMENT = 'X_Y_Z_UW_HFLX' - TZFIELD%NGRID = 6 - TZFIELD%NTYPE = TYPEREAL - TZFIELD%NDIMS = 3 - TZFIELD%LTIMEDEP = .TRUE. + TZFIELD = TFIELDMETADATA( & + CMNHNAME = 'UW_HFLX', & + CSTDNAME = '', & + CLONGNAME = 'UW_HFLX', & + CUNITS = 'm2 s-2', & + CDIR = 'XY', & + CCOMMENT = 'X_Y_Z_UW_HFLX', & + NGRID = 6, & + NTYPE = TYPEREAL, & + NDIMS = 3, & + LTIMEDEP = .TRUE. ) CALL IO_FIELD_WRITE(TPFILE,TZFIELD,ZFLX) END IF ! diff --git a/src/common/turb/mode_turb_hor_vw.F90 b/src/common/turb/mode_turb_hor_vw.F90 index 196734ea63a19cd4b31ef7e735e9fc2a50c89104..2fe089f60f8dc098787ad3c5dea9dd9b858fa9d2 100644 --- a/src/common/turb/mode_turb_hor_vw.F90 +++ b/src/common/turb/mode_turb_hor_vw.F90 @@ -65,7 +65,7 @@ USE MODD_TURB_n, ONLY: TURB_t ! USE MODD_CST USE MODD_CTURB -USE MODD_FIELD, ONLY: TFIELDDATA, TYPEREAL +USE MODD_FIELD, ONLY: TFIELDMETADATA, TYPEREAL USE MODD_IO, ONLY: TFILEDATA USE MODD_PARAMETERS USE MODD_LES, ONLY: TLES_t @@ -136,7 +136,7 @@ INTEGER :: JSV ! scalar loop counter REAL, DIMENSION(SIZE(PWM,1),SIZE(PWM,2),SIZE(PWM,3)) :: GY_W_VW_PWM ! REAL :: ZTIME1, ZTIME2 -TYPE(TFIELDDATA) :: TZFIELD +TYPE(TFIELDMETADATA) :: TZFIELD ! --------------------------------------------------------------------------- ! !* 1. PRELIMINARY COMPUTATIONS @@ -176,16 +176,17 @@ ZFLX(:,:,IKB-1)= 2.*ZFLX(:,:,IKB) - ZFLX(:,:,IKB+1) ! ! stores <V W> IF ( TPFILE%LOPENED .AND. TURBN%LTURB_FLX ) THEN - TZFIELD%CMNHNAME = 'VW_HFLX' - TZFIELD%CSTDNAME = '' - TZFIELD%CLONGNAME = 'VW_HFLX' - TZFIELD%CUNITS = 'm2 s-2' - TZFIELD%CDIR = 'XY' - TZFIELD%CCOMMENT = 'X_Y_Z_VW_HFLX' - TZFIELD%NGRID = 7 - TZFIELD%NTYPE = TYPEREAL - TZFIELD%NDIMS = 3 - TZFIELD%LTIMEDEP = .TRUE. + TZFIELD = TFIELDMETADATA( & + CMNHNAME = 'VW_HFLX', & + CSTDNAME = '', & + CLONGNAME = 'VW_HFLX', & + CUNITS = 'm2 s-2', & + CDIR = 'XY', & + CCOMMENT = 'X_Y_Z_VW_HFLX', & + NGRID = 7, & + NTYPE = TYPEREAL, & + NDIMS = 3, & + LTIMEDEP = .TRUE. ) CALL IO_FIELD_WRITE(TPFILE,TZFIELD,ZFLX) END IF ! diff --git a/src/common/turb/mode_turb_ver.F90 b/src/common/turb/mode_turb_ver.F90 index ddc28851ffc77d70ccf07113d61a243b2297a583..b014aa191d35db68f45b60b86ade811c2159ec3e 100644 --- a/src/common/turb/mode_turb_ver.F90 +++ b/src/common/turb/mode_turb_ver.F90 @@ -2,6 +2,7 @@ !MNH_LIC This is part of the Meso-NH software governed by the CeCILL-C licence !MNH_LIC version 1. See LICENSE, CeCILL-C_V1-en.txt and CeCILL-C_V1-fr.txt !MNH_LIC for details. version 1. +!----------------------------------------------------------------- MODULE MODE_TURB_VER IMPLICIT NONE CONTAINS @@ -9,7 +10,7 @@ SUBROUTINE TURB_VER(D,CST,CSTURB,TURBN,TLES,KRR,KRRL,KRRI,KGRADIENTS,& OOCEAN,ODEEPOC,OCOMPUTE_SRC, & KSV,KSV_LGBEG,KSV_LGEND, & PEXPL, HPROGRAM, O2D, ONOMIXLG, OFLAT, & - OCOUPLES,OBLOWSNOW,PRSNOW, & + OCOUPLES,OBLOWSNOW,OFLYER,PRSNOW, & PTSTEP, TPFILE, & PDXX,PDYY,PDZZ,PDZX,PDZY,PDIRCOSZW,PZZ, & PCOSSLOPE,PSINSLOPE, & @@ -209,29 +210,29 @@ SUBROUTINE TURB_VER(D,CST,CSTURB,TURBN,TLES,KRR,KRRL,KRRI,KGRADIENTS,& !* 0. DECLARATIONS ! ------------ ! -USE PARKIND1, ONLY : JPRB -USE YOMHOOK , ONLY : LHOOK, DR_HOOK +USE PARKIND1, ONLY: JPRB +USE YOMHOOK, ONLY: LHOOK, DR_HOOK ! -USE MODD_CST, ONLY: CST_t -USE MODD_CTURB, ONLY: CSTURB_t -USE MODD_DIMPHYEX, ONLY: DIMPHYEX_t -USE MODD_FIELD, ONLY: TFIELDDATA, TYPEREAL +USE MODD_CST, ONLY: CST_t +USE MODD_CTURB, ONLY: CSTURB_t +USE MODD_DIMPHYEX, ONLY: DIMPHYEX_t +USE MODD_FIELD, ONLY: TFIELDMETADATA, TYPEREAL USE MODD_IO, ONLY: TFILEDATA -USE MODD_PARAMETERS, ONLY: JPVEXT_TURB -USE MODD_LES, ONLY: TLES_t -USE MODD_TURB_n, ONLY: TURB_t -! -USE MODE_EMOIST, ONLY: EMOIST -USE MODE_ETHETA, ONLY: ETHETA -USE MODE_GRADIENT_M_PHY, ONLY : GZ_M_W_PHY -USE MODE_IO_FIELD_WRITE, ONLY: IO_FIELD_WRITE_PHY -USE MODE_PRANDTL, ONLY: PSI_SV, PSI3, PHI3, PRANDTL -USE MODE_SBL_DEPTH, ONLY: SBL_DEPTH +USE MODD_PARAMETERS, ONLY: JPVEXT_TURB +USE MODD_LES, ONLY: TLES_t +USE MODD_TURB_n, ONLY: TURB_t +! +USE MODE_EMOIST, ONLY: EMOIST +USE MODE_ETHETA, ONLY: ETHETA +USE MODE_GRADIENT_M_PHY, ONLY: GZ_M_W_PHY +USE MODE_IO_FIELD_WRITE, ONLY: IO_FIELD_WRITE_PHY +USE MODE_PRANDTL, ONLY: PSI_SV, PSI3, PHI3, PRANDTL +USE MODE_SBL_DEPTH, ONLY: SBL_DEPTH +USE MODE_TURB_VER_DYN_FLUX, ONLY: TURB_VER_DYN_FLUX +USE MODE_TURB_VER_SV_FLUX, ONLY: TURB_VER_SV_FLUX +USE MODE_TURB_VER_SV_CORR, ONLY: TURB_VER_SV_CORR USE MODE_TURB_VER_THERMO_FLUX, ONLY: TURB_VER_THERMO_FLUX USE MODE_TURB_VER_THERMO_CORR, ONLY: TURB_VER_THERMO_CORR -USE MODE_TURB_VER_DYN_FLUX, ONLY: TURB_VER_DYN_FLUX -USE MODE_TURB_VER_SV_FLUX, ONLY: TURB_VER_SV_FLUX -USE MODE_TURB_VER_SV_CORR, ONLY: TURB_VER_SV_CORR ! USE MODI_LES_MEAN_SUBGRID_PHY USE MODI_SECOND_MNH @@ -252,6 +253,7 @@ INTEGER, INTENT(IN) :: KRRI ! number of ice water var. INTEGER, INTENT(IN) :: KSV, KSV_LGBEG, KSV_LGEND ! number of scalar variables LOGICAL, INTENT(IN) :: OOCEAN ! switch for Ocean model version LOGICAL, INTENT(IN) :: ODEEPOC ! activates sfc forcing for ideal ocean deep conv +LOGICAL, INTENT(IN) :: OFLYER ! MesoNH flyer diagnostic LOGICAL, INTENT(IN) :: OCOMPUTE_SRC ! flag to define dimensions of SIGS and SRCT variables LOGICAL, INTENT(IN) :: OFLAT ! Logical for zero ororography LOGICAL, INTENT(IN) :: OCOUPLES ! switch to activate atmos-ocean LES version @@ -386,8 +388,8 @@ INTEGER :: IKB,IKE,IIJE,IIJB,IKT ! index value for the Beginning INTEGER :: JSV,JIJ,JK ! loop counter REAL :: ZTIME1 REAL :: ZTIME2 -REAL(KIND=JPRB) :: ZHOOK_HANDLE -TYPE(TFIELDDATA) :: TZFIELD +REAL(KIND=JPRB) :: ZHOOK_HANDLE +TYPE(TFIELDMETADATA) :: TZFIELD !---------------------------------------------------------------------------- !---------------------------------------------------------------------------- ! @@ -502,7 +504,7 @@ ENDIF ! CALL TURB_VER_THERMO_FLUX(D,CST,CSTURB,TURBN,TLES, & KRR,KRRL,KRRI,KSV,KGRADIENTS, & - OOCEAN,ODEEPOC, & + OOCEAN,ODEEPOC,OFLYER, & OCOUPLES,OCOMPUTE_SRC, & PEXPL,PTSTEP,HPROGRAM,TPFILE, & PDXX,PDYY,PDZZ,PDZX,PDZY,PDIRCOSZW,PZZ, & @@ -575,7 +577,7 @@ IF (TURBN%LHARAT) ZLM(:,:)=PLENGTHH(:,:) IF (KSV>0) & CALL TURB_VER_SV_FLUX(D,CST,CSTURB,TURBN,TLES,ONOMIXLG, & KSV,KSV_LGBEG,KSV_LGEND, & - OBLOWSNOW, & + OBLOWSNOW,OFLYER, & PEXPL,PTSTEP,TPFILE,PRSNOW, & PDZZ,PDIRCOSZW, & PRHODJ,PWM, & @@ -613,42 +615,46 @@ IF ( TURBN%LTURB_FLX .AND. TPFILE%LOPENED .AND. .NOT. TURBN%LHARAT) THEN ! ! stores the Turbulent Prandtl number ! - TZFIELD%CMNHNAME = 'PHI3' - TZFIELD%CSTDNAME = '' - TZFIELD%CLONGNAME = 'PHI3' - TZFIELD%CUNITS = '1' - TZFIELD%CDIR = 'XY' - TZFIELD%CCOMMENT = 'Turbulent Prandtl number' - TZFIELD%NGRID = 4 - TZFIELD%NTYPE = TYPEREAL - TZFIELD%NDIMS = 3 - TZFIELD%LTIMEDEP = .TRUE. + TZFIELD = TFIELDMETADATA( & + CMNHNAME = 'PHI3', & + CSTDNAME = '', & + CLONGNAME = 'PHI3', & + CUNITS = '1', & + CDIR = 'XY', & + CCOMMENT = 'Turbulent Prandtl number', & + NGRID = 4, & + NTYPE = TYPEREAL, & + NDIMS = 3, & + LTIMEDEP = .TRUE. ) CALL IO_FIELD_WRITE_PHY(D,TPFILE,TZFIELD,ZPHI3) ! ! stores the Turbulent Schmidt number ! - TZFIELD%CMNHNAME = 'PSI3' - TZFIELD%CSTDNAME = '' - TZFIELD%CLONGNAME = 'PSI3' - TZFIELD%CUNITS = '1' - TZFIELD%CDIR = 'XY' - TZFIELD%CCOMMENT = 'Turbulent Schmidt number' - TZFIELD%NGRID = 4 - TZFIELD%NTYPE = TYPEREAL - TZFIELD%NDIMS = 3 - TZFIELD%LTIMEDEP = .TRUE. + TZFIELD = TFIELDMETADATA( & + CMNHNAME = 'PSI3', & + CSTDNAME = '', & + CLONGNAME = 'PSI3', & + CUNITS = '1', & + CDIR = 'XY', & + CCOMMENT = 'Turbulent Schmidt number', & + NGRID = 4, & + NTYPE = TYPEREAL, & + NDIMS = 3, & + LTIMEDEP = .TRUE. ) CALL IO_FIELD_WRITE_PHY(D,TPFILE,TZFIELD,ZPSI3) ! ! ! stores the Turbulent Schmidt number for the scalar variables ! - TZFIELD%CSTDNAME = '' - TZFIELD%CUNITS = '1' - TZFIELD%CDIR = 'XY' - TZFIELD%NGRID = 4 - TZFIELD%NTYPE = TYPEREAL - TZFIELD%NDIMS = 3 - TZFIELD%LTIMEDEP = .TRUE. + TZFIELD = TFIELDMETADATA( & + CMNHNAME = 'generic for SV in turb_ver', & !Temporary name to ease identification + CSTDNAME = '', & + CUNITS = '1', & + CDIR = 'XY', & + NGRID = 4, & + NTYPE = TYPEREAL, & + NDIMS = 3, & + LTIMEDEP = .TRUE. ) DO JSV=1,KSV WRITE(TZFIELD%CMNHNAME, '("PSI_SV_",I3.3)') JSV TZFIELD%CLONGNAME = 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 f68fc2d2377fd6263dac088a2fc9570162bf782f..17f8d55009e8e4a0c251bc3f79d9b715a4ebcf6c 100644 --- a/src/common/turb/mode_turb_ver_dyn_flux.F90 +++ b/src/common/turb/mode_turb_ver_dyn_flux.F90 @@ -204,31 +204,29 @@ SUBROUTINE TURB_VER_DYN_FLUX(D,CST,CSTURB,TURBN,TLES,KSV,O2D,OFLAT, & !* 0. DECLARATIONS ! ------------ ! -USE PARKIND1, ONLY : JPRB -USE YOMHOOK , ONLY : LHOOK, DR_HOOK +USE PARKIND1, ONLY: JPRB +USE SHUMAN_PHY +USE YOMHOOK, ONLY: LHOOK, DR_HOOK ! -USE MODD_CST, ONLY: CST_t -USE MODD_CTURB, ONLY: CSTURB_t -USE MODD_DIMPHYEX, ONLY: DIMPHYEX_t -USE MODD_FIELD, ONLY: TFIELDDATA, TYPEREAL +USE MODD_CST, ONLY: CST_t +USE MODD_CTURB, ONLY: CSTURB_t +USE MODD_DIMPHYEX, ONLY: DIMPHYEX_t +USE MODD_FIELD, ONLY: TFIELDMETADATA, TYPEREAL USE MODD_IO, ONLY: TFILEDATA -USE MODD_LES, ONLY: TLES_t -USE MODD_PARAMETERS, ONLY: JPVEXT_TURB,XUNDEF -USE MODD_TURB_n, ONLY: TURB_t +USE MODD_LES, ONLY: TLES_t +USE MODD_PARAMETERS, ONLY: JPVEXT_TURB, XUNDEF +USE MODD_TURB_n, ONLY: TURB_t ! -USE SHUMAN_PHY USE MODE_GRADIENT_U_PHY, ONLY : GZ_U_UW_PHY, GX_U_M_PHY USE MODE_GRADIENT_V_PHY, ONLY : GZ_V_VW_PHY, GY_V_M_PHY USE MODE_GRADIENT_W_PHY, ONLY : GX_W_UW_PHY, GY_W_VW_PHY, GZ_W_M_PHY USE MODE_GRADIENT_M_PHY, ONLY : GX_M_U_PHY, GY_M_V_PHY -! -USE MODI_SECOND_MNH -! -USE MODE_TRIDIAG_WIND, ONLY: TRIDIAG_WIND -USE MODI_LES_MEAN_SUBGRID_PHY -! USE MODE_IO_FIELD_WRITE, only: IO_FIELD_WRITE_PHY USE MODE_ll +USE MODE_TRIDIAG_WIND, ONLY: TRIDIAG_WIND +! +USE MODI_LES_MEAN_SUBGRID_PHY +USE MODI_SECOND_MNH ! IMPLICIT NONE ! @@ -334,7 +332,7 @@ REAL, DIMENSION(D%NIJT) :: ZCOEFFLXU, & ! PVSLOPEM in local 3D arrays ! REAL :: ZTIME1, ZTIME2, ZCMFS -TYPE(TFIELDDATA) :: TZFIELD +TYPE(TFIELDMETADATA) :: TZFIELD !---------------------------------------------------------------------------- ! !* 1. PRELIMINARIES @@ -516,16 +514,17 @@ END IF ! IF ( TURBN%LTURB_FLX .AND. TPFILE%LOPENED ) THEN ! stores the U wind component vertical flux - TZFIELD%CMNHNAME = 'UW_VFLX' - TZFIELD%CSTDNAME = '' - TZFIELD%CLONGNAME = 'UW_VFLX' - TZFIELD%CUNITS = 'm2 s-2' - TZFIELD%CDIR = 'XY' - TZFIELD%CCOMMENT = 'U wind component vertical flux' - TZFIELD%NGRID = 4 - TZFIELD%NTYPE = TYPEREAL - TZFIELD%NDIMS = 3 - TZFIELD%LTIMEDEP = .TRUE. + TZFIELD = TFIELDMETADATA( & + CMNHNAME = 'UW_VFLX', & + CSTDNAME = '', & + CLONGNAME = 'UW_VFLX', & + CUNITS = 'm2 s-2', & + CDIR = 'XY', & + CCOMMENT = 'U wind component vertical flux', & + NGRID = 4, & + NTYPE = TYPEREAL, & + NDIMS = 3, & + LTIMEDEP = .TRUE. ) CALL IO_FIELD_WRITE_PHY(D,TPFILE,TZFIELD,ZFLXZ) END IF ! @@ -882,16 +881,17 @@ END IF ! IF ( TURBN%LTURB_FLX .AND. TPFILE%LOPENED ) THEN ! stores the V wind component vertical flux - TZFIELD%CMNHNAME = 'VW_VFLX' - TZFIELD%CSTDNAME = '' - TZFIELD%CLONGNAME = 'VW_VFLX' - TZFIELD%CUNITS = 'm2 s-2' - TZFIELD%CDIR = 'XY' - TZFIELD%CCOMMENT = 'V wind component vertical flux' - TZFIELD%NGRID = 4 - TZFIELD%NTYPE = TYPEREAL - TZFIELD%NDIMS = 3 - TZFIELD%LTIMEDEP = .TRUE. + TZFIELD = TFIELDMETADATA( & + CMNHNAME = 'VW_VFLX', & + CSTDNAME = '', & + CLONGNAME = 'VW_VFLX', & + CUNITS = 'm2 s-2', & + CDIR = 'XY', & + CCOMMENT = 'V wind component vertical flux', & + NGRID = 4, & + NTYPE = TYPEREAL, & + NDIMS = 3, & + LTIMEDEP = .TRUE. ) CALL IO_FIELD_WRITE_PHY(D,TPFILE,TZFIELD,ZFLXZ) END IF ! @@ -1119,16 +1119,17 @@ IF ( TURBN%LTURB_FLX .AND. TPFILE%LOPENED .AND. TURBN%CTURBDIM == '1DIM') THEN ! to be tested & ! +XCMFB*(4./3.)*PLM(:,:,:)/SQRT(PTKEM(:,:,:))*PTP(:,:,:) ! stores the W variance - TZFIELD%CMNHNAME = 'W_VVAR' - TZFIELD%CSTDNAME = '' - TZFIELD%CLONGNAME = 'W_VVAR' - TZFIELD%CUNITS = 'm2 s-2' - TZFIELD%CDIR = 'XY' - TZFIELD%CCOMMENT = 'X_Y_Z_W_VVAR' - TZFIELD%NGRID = 1 - TZFIELD%NTYPE = TYPEREAL - TZFIELD%NDIMS = 3 - TZFIELD%LTIMEDEP = .TRUE. + TZFIELD = TFIELDMETADATA( & + CMNHNAME = 'W_VVAR', & + CSTDNAME = '', & + CLONGNAME = 'W_VVAR', & + CUNITS = 'm2 s-2', & + CDIR = 'XY', & + CCOMMENT = 'X_Y_Z_W_VVAR', & + NGRID = 1, & + NTYPE = TYPEREAL, & + NDIMS = 3, & + LTIMEDEP = .TRUE. ) CALL IO_FIELD_WRITE_PHY(D,TPFILE,TZFIELD,ZFLXZ) 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 e1bc59249485149a8d7189f5fd8c4801ae66b5a8..09d51b09c9b107d184a2c192d057c3043afd55fe 100644 --- a/src/common/turb/mode_turb_ver_sv_flux.F90 +++ b/src/common/turb/mode_turb_ver_sv_flux.F90 @@ -1,13 +1,14 @@ -!MNH_LIC Copyright 1994-2021 CNRS, Meteo-France and Universite Paul Sabatier +!MNH_LIC Copyright 1994-2022 CNRS, Meteo-France and Universite Paul Sabatier !MNH_LIC This is part of the Meso-NH software governed by the CeCILL-C licence !MNH_LIC version 1. See LICENSE, CeCILL-C_V1-en.txt and CeCILL-C_V1-fr.txt !MNH_LIC for details. version 1. +!----------------------------------------------------------------- MODULE MODE_TURB_VER_SV_FLUX IMPLICIT NONE CONTAINS SUBROUTINE TURB_VER_SV_FLUX(D,CST,CSTURB,TURBN,TLES,ONOMIXLG, & KSV,KSV_LGBEG,KSV_LGEND, & - OBLOWSNOW, & + OBLOWSNOW,OFLYER, & PEXPL,PTSTEP,TPFILE,PRSNOW, & PDZZ,PDIRCOSZW, & PRHODJ,PWM, & @@ -201,35 +202,34 @@ SUBROUTINE TURB_VER_SV_FLUX(D,CST,CSTURB,TURBN,TLES,ONOMIXLG, & !! to avoid unknwon values outside physical domain !! and avoid negative values in sv tendencies !! Philippe Wautelet: 05/2016-04/2018: new data structures and calls for I/O -!! Modifications: June 2019 (Wim de Rooy) with energycascade, 50MF nog -!! longer necessary +! Wim de Rooy 06/2019: with energycascade, 50MF nog longer necessary +! P. Wautelet 30/11/2022: compute PWSV only when needed !!-------------------------------------------------------------------------- ! !* 0. DECLARATIONS ! ------------ ! -USE PARKIND1, ONLY : JPRB -USE YOMHOOK , ONLY : LHOOK, DR_HOOK -! -USE MODD_CST, ONLY: CST_t -USE MODD_CTURB, ONLY: CSTURB_t -USE MODD_DIMPHYEX, ONLY: DIMPHYEX_t -USE MODD_TURB_n, ONLY: TURB_t -USE MODD_FIELD, ONLY: TFIELDDATA, TYPEREAL -USE MODD_IO, ONLY: TFILEDATA -USE MODD_PARAMETERS, ONLY: JPVEXT_TURB -USE MODD_LES, ONLY: TLES_t -USE MODE_IO_FIELD_WRITE, ONLY: IO_FIELD_WRITE_PHY -! - -USE SHUMAN_PHY , ONLY : DZM_PHY, MZM_PHY, MZF_PHY +USE PARKIND1, ONLY: JPRB +USE SHUMAN_PHY, ONLY: DZM_PHY, MZM_PHY, MZF_PHY +USE YOMHOOK, ONLY: LHOOK, DR_HOOK +! +USE MODD_CST, ONLY: CST_t +USE MODD_CTURB, ONLY: CSTURB_t +USE MODD_DIMPHYEX, ONLY: DIMPHYEX_t +USE MODD_FIELD, ONLY: TFIELDMETADATA, TYPEREAL +USE MODD_IO, ONLY: TFILEDATA +USE MODD_LES, ONLY: TLES_t +USE MODD_PARAMETERS, ONLY: JPVEXT_TURB, NMNHNAMELGTMAX +USE MODD_TURB_n, ONLY: TURB_t +! +USE MODE_EMOIST, ONLY: EMOIST +USE MODE_ETHETA, ONLY: ETHETA USE MODE_GRADIENT_W_PHY, ONLY: GZ_W_M_PHY USE MODE_GRADIENT_M_PHY, ONLY: GZ_M_W_PHY -USE MODE_TRIDIAG, ONLY: TRIDIAG -USE MODE_EMOIST, ONLY: EMOIST -USE MODE_ETHETA, ONLY: ETHETA -USE MODI_LES_MEAN_SUBGRID_PHY +USE MODE_IO_FIELD_WRITE, ONLY: IO_FIELD_WRITE_PHY +USE MODE_TRIDIAG, ONLY: TRIDIAG ! +USE MODI_LES_MEAN_SUBGRID_PHY USE MODI_SECOND_MNH ! IMPLICIT NONE @@ -246,6 +246,7 @@ INTEGER, INTENT(IN) :: KSV, & KSV_LGBEG, KSV_LGEND ! number of scalar variables LOGICAL, INTENT(IN) :: ONOMIXLG ! to use turbulence for lagrangian variables (modd_conf) LOGICAL, INTENT(IN) :: OBLOWSNOW ! switch to activate pronostic blowing snow +LOGICAL, INTENT(IN) :: OFLYER ! MesoNH flyer diagnostic REAL, INTENT(IN) :: PRSNOW ! Ratio for diffusion coeff. scalar (blowing snow) REAL, INTENT(IN) :: PEXPL ! Coef. for temporal disc. REAL, INTENT(IN) :: PTSTEP ! Double Time Step @@ -302,13 +303,14 @@ REAL :: ZTIME1, ZTIME2 REAL :: ZCSVP = 4.0 ! constant for scalar flux presso-correlation (RS81) REAL :: ZCSV !constant for the scalar flux ! -TYPE(TFIELDDATA) :: TZFIELD +CHARACTER(LEN=NMNHNAMELGTMAX) :: YMNHNAME +REAL(KIND=JPRB) :: ZHOOK_HANDLE +TYPE(TFIELDMETADATA) :: TZFIELD !---------------------------------------------------------------------------- ! !* 1. PRELIMINARIES ! ------------- ! -REAL(KIND=JPRB) :: ZHOOK_HANDLE IF (LHOOK) CALL DR_HOOK('TURB_VER_SV_FLUX',0,ZHOOK_HANDLE) ! IKT=D%NKT @@ -323,7 +325,7 @@ IIJB=D%NIJB ! IF (TURBN%LHARAT) THEN !$mnh_expand_array(JIJ=IIJB:IIJE,JK=1:IKT) - ZKEFF(IIJB:IIJE,IKB:IKE) = PLM(IIJB:IIJE,IKB:IKE) * SQRT(PTKEM(IIJB:IIJE,IKB:IKE)) + ZKEFF(IIJB:IIJE,1:IKT) = PLM(IIJB:IIJE,1:IKT) * SQRT(PTKEM(IIJB:IIJE,1:IKT)) !$mnh_end_expand_array(JIJ=IIJB:IIJE,JK=1:IKT) ELSE !$mnh_expand_array(JIJ=IIJB:IIJE,JK=1:IKT) @@ -351,16 +353,16 @@ DO JSV=1,KSV ! Preparation of the arguments for TRIDIAG IF (TURBN%LHARAT) THEN !$mnh_expand_array(JIJ=IIJB:IIJE,JK=1:IKT) - ZA(IIJB:IIJE,IKB:IKE) = -PTSTEP * ZKEFF(IIJB:IIJE,IKB:IKE) * ZWORK1(IIJB:IIJE,IKB:IKE) & - / PDZZ(IIJB:IIJE,IKB:IKE)**2 + ZA(IIJB:IIJE,1:IKT) = -PTSTEP * ZKEFF(IIJB:IIJE,1:IKT) * ZWORK1(IIJB:IIJE,1:IKT) & + / PDZZ(IIJB:IIJE,1:IKT)**2 !$mnh_end_expand_array(JIJ=IIJB:IIJE,JK=1:IKT) ELSE !$mnh_expand_array(JIJ=IIJB:IIJE,JK=1:IKT) - ZA(IIJB:IIJE,IKB:IKE) = -PTSTEP*ZCSV*PPSI_SV(IIJB:IIJE,IKB:IKE,JSV) * & - ZKEFF(IIJB:IIJE,IKB:IKE) * ZWORK1(IIJB:IIJE,IKB:IKE) / PDZZ(IIJB:IIJE,IKB:IKE)**2 + ZA(IIJB:IIJE,1:IKT) = -PTSTEP*ZCSV*PPSI_SV(IIJB:IIJE,1:IKT,JSV) * & + ZKEFF(IIJB:IIJE,1:IKT) * ZWORK1(IIJB:IIJE,1:IKT) / PDZZ(IIJB:IIJE,1:IKT)**2 !$mnh_end_expand_array(JIJ=IIJB:IIJE,JK=1:IKT) ENDIF - ZSOURCE(IIJB:IIJE,IKB:IKE) = 0. + ZSOURCE(IIJB:IIJE,1:IKT) = 0. ! ! Compute the sources for the JSVth scalar variable @@ -389,8 +391,8 @@ DO JSV=1,KSV ! ! Compute the equivalent tendency for the JSV scalar variable !$mnh_expand_array(JIJ=IIJB:IIJE,JK=1:IKT) - PRSVS(IIJB:IIJE,IKB:IKE,JSV)= PRSVS(IIJB:IIJE,IKB:IKE,JSV)+ & - PRHODJ(IIJB:IIJE,IKB:IKE)*(ZRES(IIJB:IIJE,IKB:IKE)-PSVM(IIJB:IIJE,IKB:IKE,JSV))/PTSTEP + PRSVS(IIJB:IIJE,1:IKT,JSV)= PRSVS(IIJB:IIJE,1:IKT,JSV)+ & + PRHODJ(IIJB:IIJE,1:IKT)*(ZRES(IIJB:IIJE,1:IKT)-PSVM(IIJB:IIJE,1:IKT,JSV))/PTSTEP !$mnh_end_expand_array(JIJ=IIJB:IIJE,JK=1:IKT) ! IF ( (TURBN%LTURB_FLX .AND. TPFILE%LOPENED) .OR. TLES%LLES_CALL ) THEN @@ -403,9 +405,9 @@ DO JSV=1,KSV CALL MZM_PHY(D,ZWORK1,ZWORK3) CALL DZM_PHY(D,ZWORK2,ZWORK4) !$mnh_expand_array(JIJ=IIJB:IIJE,JK=1:IKT) - ZFLXZ(IIJB:IIJE,IKB:IKE) = -ZCSV * PPSI_SV(IIJB:IIJE,IKB:IKE,JSV) * ZWORK3(IIJB:IIJE,IKB:IKE) & - / PDZZ(IIJB:IIJE,IKB:IKE) * & - ZWORK4(IIJB:IIJE,IKB:IKE) + ZFLXZ(IIJB:IIJE,1:IKT) = -ZCSV * PPSI_SV(IIJB:IIJE,1:IKT,JSV) * ZWORK3(IIJB:IIJE,1:IKT) & + / PDZZ(IIJB:IIJE,1:IKT) * & + ZWORK4(IIJB:IIJE,1:IKT) !$mnh_end_expand_array(JIJ=IIJB:IIJE,JK=1:IKT) ! surface flux !* in 3DIM case, a part of the flux goes vertically, and another goes horizontally @@ -429,30 +431,35 @@ DO JSV=1,KSV !$mnh_expand_array(JIJ=IIJB:IIJE) ZFLXZ(IIJB:IIJE,IKA) = ZFLXZ(IIJB:IIJE,IKB) !$mnh_end_expand_array(JIJ=IIJB:IIJE) - DO JK=IKTB+1,IKTE-1 + + IF ( OFLYER ) THEN + DO JK=IKTB+1,IKTE-1 + !$mnh_expand_array(JIJ=IIJB:IIJE) + PWSV(IIJB:IIJE,JK,JSV)=0.5*(ZFLXZ(IIJB:IIJE,JK)+ZFLXZ(IIJB:IIJE,JK+IKL)) + !$mnh_end_expand_array(JIJ=IIJB:IIJE) + END DO !$mnh_expand_array(JIJ=IIJB:IIJE) - PWSV(IIJB:IIJE,JK,JSV)=0.5*(ZFLXZ(IIJB:IIJE,JK)+ZFLXZ(IIJB:IIJE,JK+IKL)) + PWSV(IIJB:IIJE,IKB,JSV)=0.5*(ZFLXZ(IIJB:IIJE,IKB)+ZFLXZ(IIJB:IIJE,IKB+IKL)) + PWSV(IIJB:IIJE,IKE,JSV)=PWSV(IIJB:IIJE,IKE-IKL,JSV) !$mnh_end_expand_array(JIJ=IIJB:IIJE) - END DO - !$mnh_expand_array(JIJ=IIJB:IIJE) - PWSV(IIJB:IIJE,IKB,JSV)=0.5*(ZFLXZ(IIJB:IIJE,IKB)+ZFLXZ(IIJB:IIJE,IKB+IKL)) - PWSV(IIJB:IIJE,IKE,JSV)=PWSV(IIJB:IIJE,IKE-IKL,JSV) - !$mnh_end_expand_array(JIJ=IIJB:IIJE) + END IF END IF ! IF (TURBN%LTURB_FLX .AND. TPFILE%LOPENED) THEN ! stores the JSVth vertical flux - WRITE(TZFIELD%CMNHNAME,'("WSV_FLX_",I3.3)') JSV - TZFIELD%CSTDNAME = '' - TZFIELD%CLONGNAME = TRIM(TZFIELD%CMNHNAME) + WRITE(YMNHNAME,'("WSV_FLX_",I3.3)') JSV + TZFIELD = TFIELDMETADATA( & + CMNHNAME = TRIM( YMNHNAME ), & + CSTDNAME = '', & + CLONGNAME = TRIM( YMNHNAME ), & !PW: TODO: use the correct units of the JSV variable (and multiply it by m s-1) - TZFIELD%CUNITS = 'SVUNIT m s-1' - TZFIELD%CDIR = 'XY' - TZFIELD%CCOMMENT = 'X_Y_Z_'//TRIM(TZFIELD%CMNHNAME) - TZFIELD%NGRID = 4 - TZFIELD%NTYPE = TYPEREAL - TZFIELD%NDIMS = 3 - TZFIELD%LTIMEDEP = .TRUE. + CUNITS = 'SVUNIT m s-1', & + CDIR = 'XY', & + CCOMMENT = 'X_Y_Z_' // TRIM( YMNHNAME ), & + NGRID = 4, & + NTYPE = TYPEREAL, & + NDIMS = 3, & + LTIMEDEP = .TRUE. ) ! CALL IO_FIELD_WRITE_PHY(D,TPFILE,TZFIELD,ZFLXZ) END IF diff --git a/src/common/turb/mode_turb_ver_thermo_corr.F90 b/src/common/turb/mode_turb_ver_thermo_corr.F90 index 6d71d9196a2fb302dd634267dfcd024065342357..56c4e01d7c54ac8f2e02d8f7a272f356846a767a 100644 --- a/src/common/turb/mode_turb_ver_thermo_corr.F90 +++ b/src/common/turb/mode_turb_ver_thermo_corr.F90 @@ -2,6 +2,7 @@ !MNH_LIC This is part of the Meso-NH software governed by the CeCILL-C licence !MNH_LIC version 1. See LICENSE, CeCILL-C_V1-en.txt and CeCILL-C_V1-fr.txt !MNH_LIC for details. version 1. +!----------------------------------------------------------------- MODULE MODE_TURB_VER_THERMO_CORR IMPLICIT NONE CONTAINS @@ -203,23 +204,23 @@ SUBROUTINE TURB_VER_THERMO_CORR(D,CST,CSTURB,TURBN,TLES, & !* 0. DECLARATIONS ! ------------ ! -USE PARKIND1, ONLY : JPRB -USE YOMHOOK , ONLY : LHOOK, DR_HOOK -USE MODD_CST, ONLY: CST_t -USE MODD_CTURB, ONLY: CSTURB_t -USE MODD_TURB_n, ONLY: TURB_t -USE MODD_DIMPHYEX, ONLY: DIMPHYEX_t -USE MODD_FIELD, ONLY: TFIELDDATA, TYPEREAL -USE MODD_IO, ONLY: TFILEDATA -USE MODD_PARAMETERS, ONLY: JPVEXT_TURB -USE MODD_LES, ONLY: TLES_t +USE PARKIND1, ONLY: JPRB +USE SHUMAN_PHY, ONLY: MZM_PHY, MZF_PHY, DZM_PHY +USE YOMHOOK, ONLY: LHOOK, DR_HOOK ! -USE MODI_LES_MEAN_SUBGRID_PHY +USE MODD_CST, ONLY: CST_t +USE MODD_CTURB, ONLY: CSTURB_t +USE MODD_DIMPHYEX, ONLY: DIMPHYEX_t +USE MODD_FIELD, ONLY: TFIELDMETADATA, TYPEREAL +USE MODD_IO, ONLY: TFILEDATA +USE MODD_LES, ONLY: TLES_t +USE MODD_PARAMETERS, ONLY: JPVEXT_TURB +USE MODD_TURB_n, ONLY: TURB_t ! USE MODE_IO_FIELD_WRITE, ONLY: IO_FIELD_WRITE_PHY USE MODE_PRANDTL -USE SHUMAN_PHY, ONLY: MZM_PHY, MZF_PHY, DZM_PHY ! +USE MODI_LES_MEAN_SUBGRID_PHY USE MODI_SECOND_MNH ! IMPLICIT NONE @@ -248,7 +249,6 @@ REAL, DIMENSION(D%NIJT), INTENT(IN) :: PDIRCOSZW ! Director Cosinus of t ! normal to the ground surface ! REAL, DIMENSION(D%NIJT,D%NKT), INTENT(IN) :: PRHODJ ! dry density * grid volum -REAL, DIMENSION(D%NIJT,D%NKT), INTENT(IN) :: MFMOIST ! moist mass flux dual scheme REAL, DIMENSION(D%NIJT,D%NKT), INTENT(IN) :: PTHVREF ! ref. state Virtual ! Potential Temperature @@ -299,6 +299,7 @@ REAL, DIMENSION(D%NIJT,D%NKT), INTENT(IN) :: PFTHR ! d(w'th'r')/dz (at REAL, DIMENSION(D%NIJT,D%NKT), INTENT(IN) :: PTHLP ! guess of thl at t+ deltat REAL, DIMENSION(D%NIJT,D%NKT), INTENT(IN) :: PRP ! guess of r at t+ deltat ! +REAL, DIMENSION(D%NIJT,D%NKT), INTENT(IN) :: MFMOIST ! moist mass flux dual scheme REAL, DIMENSION(MERGE(D%NIJT,0,OCOMPUTE_SRC),& MERGE(D%NKT,0,OCOMPUTE_SRC)), INTENT(OUT) :: PSIGS ! Vert. part of Sigma_s at t ! @@ -346,7 +347,7 @@ LOGICAL :: GFWTH ! flag to use w'2th' LOGICAL :: GFR2 ! flag to use w'r'2 LOGICAL :: GFWR ! flag to use w'2r' LOGICAL :: GFTHR ! flag to use w'th'r' -TYPE(TFIELDDATA) :: TZFIELD +TYPE(TFIELDMETADATA) :: TZFIELD !---------------------------------------------------------------------------- ! !* 1. PRELIMINARIES @@ -614,16 +615,17 @@ END IF ! ! stores <THl THl> IF ( TURBN%LTURB_FLX .AND. TPFILE%LOPENED ) THEN - TZFIELD%CMNHNAME = 'THL_VVAR' - TZFIELD%CSTDNAME = '' - TZFIELD%CLONGNAME = 'THL_VVAR' - TZFIELD%CUNITS = 'K2' - TZFIELD%CDIR = 'XY' - TZFIELD%CCOMMENT = 'X_Y_Z_THL_VVAR' - TZFIELD%NGRID = 1 - TZFIELD%NTYPE = TYPEREAL - TZFIELD%NDIMS = 3 - TZFIELD%LTIMEDEP = .TRUE. + TZFIELD = TFIELDMETADATA( & + CMNHNAME = 'THL_VVAR', & + CSTDNAME = '', & + CLONGNAME = 'THL_VVAR', & + CUNITS = 'K2', & + CDIR = 'XY', & + CCOMMENT = 'X_Y_Z_THL_VVAR', & + NGRID = 1, & + NTYPE = TYPEREAL, & + NDIMS = 3, & + LTIMEDEP = .TRUE. ) CALL IO_FIELD_WRITE_PHY(D,TPFILE,TZFIELD,ZFLXZ) END IF ! @@ -927,16 +929,17 @@ END IF END IF ! stores <THl Rnp> IF ( TURBN%LTURB_FLX .AND. TPFILE%LOPENED ) THEN - TZFIELD%CMNHNAME = 'THLRCONS_VCOR' - TZFIELD%CSTDNAME = '' - TZFIELD%CLONGNAME = 'THLRCONS_VCOR' - TZFIELD%CUNITS = 'K kg kg-1' - TZFIELD%CDIR = 'XY' - TZFIELD%CCOMMENT = 'X_Y_Z_THLRCONS_VCOR' - TZFIELD%NGRID = 1 - TZFIELD%NTYPE = TYPEREAL - TZFIELD%NDIMS = 3 - TZFIELD%LTIMEDEP = .TRUE. + TZFIELD = TFIELDMETADATA( & + CMNHNAME = 'THLRCONS_VCOR', & + CSTDNAME = '', & + CLONGNAME = 'THLRCONS_VCOR', & + CUNITS = 'K kg kg-1', & + CDIR = 'XY', & + CCOMMENT = 'X_Y_Z_THLRCONS_VCOR', & + NGRID = 1, & + NTYPE = TYPEREAL, & + NDIMS = 3, & + LTIMEDEP = .TRUE. ) CALL IO_FIELD_WRITE_PHY(D,TPFILE,TZFIELD,ZFLXZ) END IF ! @@ -1192,16 +1195,17 @@ ENDIF END IF ! stores <Rnp Rnp> IF ( TURBN%LTURB_FLX .AND. TPFILE%LOPENED ) THEN - TZFIELD%CMNHNAME = 'RTOT_VVAR' - TZFIELD%CSTDNAME = '' - TZFIELD%CLONGNAME = 'RTOT_VVAR' - TZFIELD%CUNITS = 'kg2 kg-2' - TZFIELD%CDIR = 'XY' - TZFIELD%CCOMMENT = 'X_Y_Z_RTOT_VVAR' - TZFIELD%NGRID = 1 - TZFIELD%NTYPE = TYPEREAL - TZFIELD%NDIMS = 3 - TZFIELD%LTIMEDEP = .TRUE. + TZFIELD = TFIELDMETADATA( & + CMNHNAME = 'RTOT_VVAR', & + CSTDNAME = '', & + CLONGNAME = 'RTOT_VVAR', & + CUNITS = 'kg2 kg-2', & + CDIR = 'XY', & + CCOMMENT = 'X_Y_Z_RTOT_VVAR', & + NGRID = 1, & + NTYPE = TYPEREAL, & + NDIMS = 3, & + LTIMEDEP = .TRUE. ) CALL IO_FIELD_WRITE_PHY(D,TPFILE,TZFIELD,ZFLXZ) 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 97366b22aef729e9d8007ddaf0108e881367d009..618fb377a19214004ad7dcd906efc3e6fbad40b5 100644 --- a/src/common/turb/mode_turb_ver_thermo_flux.F90 +++ b/src/common/turb/mode_turb_ver_thermo_flux.F90 @@ -1,13 +1,14 @@ -!MNH_LIC Copyright 1994-2021 CNRS, Meteo-France and Universite Paul Sabatier +!MNH_LIC Copyright 1994-2022 CNRS, Meteo-France and Universite Paul Sabatier !MNH_LIC This is part of the Meso-NH software governed by the CeCILL-C licence !MNH_LIC version 1. See LICENSE, CeCILL-C_V1-en.txt and CeCILL-C_V1-fr.txt !MNH_LIC for details. version 1. +!----------------------------------------------------------------- MODULE MODE_TURB_VER_THERMO_FLUX IMPLICIT NONE CONTAINS SUBROUTINE TURB_VER_THERMO_FLUX(D,CST,CSTURB,TURBN,TLES, & KRR,KRRL,KRRI,KSV,KGRADIENTS, & - OOCEAN,ODEEPOC, & + OOCEAN,ODEEPOC,OFLYER, & OCOUPLES, OCOMPUTE_SRC, & PEXPL,PTSTEP,HPROGRAM, & TPFILE, & @@ -222,34 +223,32 @@ SUBROUTINE TURB_VER_THERMO_FLUX(D,CST,CSTURB,TURBN,TLES, & !! June 2020 (B. Vie) Patch preventing negative rc and ri in 2.3 and 3.3 !! JL Redelsperger : 03/2021: Ocean and Autocoupling O-A LES Cases !! Sfc flux shape for LDEEPOC Case +! P. Wautelet 30/11/2022: compute PWTH and PWRC only when needed !!-------------------------------------------------------------------------- ! !* 0. DECLARATIONS ! ------------ ! -USE PARKIND1, ONLY : JPRB -USE YOMHOOK , ONLY : LHOOK, DR_HOOK +USE PARKIND1, ONLY: JPRB +USE SHUMAN_PHY, ONLY: DZF_PHY, DZM_PHY, MXF_PHY, MYF_PHY, MZF_PHY, MZM_PHY +USE YOMHOOK, ONLY: LHOOK, DR_HOOK ! -USE MODD_CST, ONLY: CST_t -USE MODD_CTURB, ONLY: CSTURB_t -USE MODD_DIMPHYEX, ONLY: DIMPHYEX_t -USE MODD_FIELD, ONLY: TFIELDDATA, TYPEREAL -USE MODD_IO, ONLY: TFILEDATA -USE MODD_PARAMETERS, ONLY: JPVEXT_TURB, JPHEXT -USE MODD_TURB_n, ONLY: TURB_t -USE MODD_LES, ONLY: TLES_t -USE MODD_TURB_n, ONLY: TURB_t -! -USE MODI_LES_MEAN_SUBGRID_PHY -USE MODE_TRIDIAG_THERMO, ONLY: TRIDIAG_THERMO -USE MODE_TM06_H, ONLY: TM06_H +USE MODD_CST, ONLY: CST_t +USE MODD_CTURB, ONLY: CSTURB_t +USE MODD_DIMPHYEX, ONLY: DIMPHYEX_t +USE MODD_FIELD, ONLY: TFIELDMETADATA, TYPEREAL +USE MODD_IO, ONLY: TFILEDATA +USE MODD_LES, ONLY: TLES_t +USE MODD_PARAMETERS, ONLY: JPVEXT_TURB, JPHEXT, XUNDEF +USE MODD_TURB_n, ONLY: TURB_t ! +USE MODE_GRADIENT_W_PHY, ONLY: GZ_W_M_PHY USE MODE_IO_FIELD_WRITE, ONLY: IO_FIELD_WRITE_PHY USE MODE_PRANDTL -USE SHUMAN_PHY, ONLY: MZM_PHY, MZF_PHY, DZM_PHY, DZF_PHY, & - MXF_PHY,MYF_PHY -USE MODE_GRADIENT_W_PHY, ONLY: GZ_W_M_PHY +USE MODE_TM06_H, ONLY: TM06_H +USE MODE_TRIDIAG_THERMO, ONLY: TRIDIAG_THERMO ! +USE MODI_LES_MEAN_SUBGRID_PHY USE MODI_SECOND_MNH ! IMPLICIT NONE @@ -263,44 +262,36 @@ TYPE(CST_t), INTENT(IN) :: CST TYPE(CSTURB_t), INTENT(IN) :: CSTURB TYPE(TURB_t), INTENT(IN) :: TURBN TYPE(TLES_t), INTENT(INOUT):: TLES ! modd_les structure -INTEGER, INTENT(IN) :: KGRADIENTS ! Number of stored horizontal gradients INTEGER, INTENT(IN) :: KRR ! number of moist var. -INTEGER, INTENT(IN) :: KSV ! number of scalar var. INTEGER, INTENT(IN) :: KRRL ! number of liquid water var. INTEGER, INTENT(IN) :: KRRI ! number of ice water var. +INTEGER, INTENT(IN) :: KSV ! number of scalar var. +INTEGER, INTENT(IN) :: KGRADIENTS ! Number of stored horizontal gradients LOGICAL, INTENT(IN) :: OOCEAN ! switch for Ocean model version LOGICAL, INTENT(IN) :: ODEEPOC ! activates sfc forcing for ideal ocean deep conv +LOGICAL, INTENT(IN) :: OFLYER ! MesoNH flyer diagnostic +LOGICAL, INTENT(IN) :: OCOUPLES ! switch to activate atmos-ocean LES version LOGICAL, INTENT(IN) :: OCOMPUTE_SRC ! flag to define dimensions of SIGS and -CHARACTER(LEN=6), INTENT(IN) :: HPROGRAM ! CPROGRAM is the program currently running (modd_conf) REAL, INTENT(IN) :: PEXPL ! Coef. for temporal disc. REAL, INTENT(IN) :: PTSTEP ! Double Time Step +CHARACTER(LEN=6), INTENT(IN) :: HPROGRAM ! CPROGRAM is the program currently running (modd_conf) TYPE(TFILEDATA), INTENT(IN) :: TPFILE ! Output file -LOGICAL, INTENT(IN) :: OCOUPLES ! switch to activate atmos-ocean LES version ! -REAL, DIMENSION(D%NIJT,D%NKT), INTENT(IN) :: PDZZ, PDXX, PDYY, PDZX, PDZY - ! Metric coefficients -REAL, DIMENSION(D%NIJT), INTENT(IN) :: PDIRCOSZW ! Director Cosinus of the - ! normal to the ground surface +REAL, DIMENSION(D%NIJT,D%NKT), INTENT(IN) :: PDZZ, PDXX, PDYY, PDZX, PDZY ! Metric coefficients +REAL, DIMENSION(D%NIJT), INTENT(IN) :: PDIRCOSZW ! Director Cosinus of the normal to the ground surface REAL, DIMENSION(D%NIJT,D%NKT), INTENT(IN) :: PZZ ! altitudes ! REAL, DIMENSION(D%NIJT,D%NKT), INTENT(IN) :: PRHODJ ! dry density * grid volum -REAL, DIMENSION(D%NIJT,D%NKT), INTENT(IN) :: MFMOIST ! moist mass flux dual scheme -REAL, DIMENSION(D%NIJT,D%NKT), INTENT(IN) :: PTHVREF ! ref. state Virtual - ! Potential Temperature +REAL, DIMENSION(D%NIJT,D%NKT), INTENT(IN) :: PTHVREF ! ref. state Virtual Potential Temperature ! -REAL, DIMENSION(D%NIJT), INTENT(IN) :: PSFTHM,PSFRM ! surface fluxes at time -! ! t - deltat -! -REAL, DIMENSION(D%NIJT), INTENT(IN) :: PSFTHP,PSFRP ! surface fluxes at time -! ! t + deltat +REAL, DIMENSION(D%NIJT,D%NKT,KGRADIENTS),INTENT(IN) :: PHGRAD ! horizontal gradients REAL, DIMENSION(D%NIJT), INTENT(IN) :: PZS ! orography (for LEONARD terms) +REAL, DIMENSION(D%NIJT), INTENT(IN) :: PSFTHM,PSFRM ! surface fluxes at time t - deltat +REAL, DIMENSION(D%NIJT), INTENT(IN) :: PSFTHP,PSFRP ! surface fluxes at time t + deltat ! -REAL, DIMENSION(D%NIJT,D%NKT), INTENT(IN) :: PWM -! Vertical wind -REAL, DIMENSION(D%NIJT,D%NKT), INTENT(IN) :: PTHLM -! potential temperature at t-Delta t -REAL, DIMENSION(D%NIJT,D%NKT,KRR), INTENT(IN) :: PRM ! Mixing ratios - ! at t-Delta t +REAL, DIMENSION(D%NIJT,D%NKT), INTENT(IN) :: PWM ! Vertical wind +REAL, DIMENSION(D%NIJT,D%NKT), INTENT(IN) :: PTHLM ! potential temperature at t-Delta t +REAL, DIMENSION(D%NIJT,D%NKT,KRR), INTENT(IN) :: PRM ! Mixing ratios at t-Delta t REAL, DIMENSION(D%NIJT,D%NKT,KSV), INTENT(IN) :: PSVM ! Mixing ratios ! REAL, DIMENSION(D%NIJT,D%NKT), INTENT(IN) :: PTKEM ! TKE at time t @@ -335,13 +326,13 @@ REAL, DIMENSION(D%NIJT,D%NKT), INTENT(IN) :: PFWR ! d(w'2r' )/dz (at REAL, DIMENSION(D%NIJT,D%NKT), INTENT(IN) :: PFTH2 ! d(w'th'2 )/dz (at mass point) REAL, DIMENSION(D%NIJT,D%NKT), INTENT(IN) :: PFR2 ! d(w'r'2 )/dz (at mass point) REAL, DIMENSION(D%NIJT,D%NKT), INTENT(IN) :: PFTHR ! d(w'th'r')/dz (at mass point) -REAL, DIMENSION(D%NIJT,D%NKT,KGRADIENTS),INTENT(IN) :: PHGRAD ! horizontal gradients +REAL, DIMENSION(D%NIJT,D%NKT), INTENT(IN) :: MFMOIST ! moist mass flux dual scheme REAL, DIMENSION(MERGE(D%NIT,0,TURBN%CTOM=='TM06'),& MERGE(D%NJT,0,TURBN%CTOM=='TM06')), INTENT(INOUT):: PBL_DEPTH ! BL depth REAL, DIMENSION(D%NIJT,D%NKT), INTENT(OUT) :: PWTHV ! buoyancy flux ! REAL, DIMENSION(D%NIJT,D%NKT), INTENT(INOUT) :: PRTHLS ! cumulated source for theta -REAL, DIMENSION(D%NIJT,D%NKT,KRR), INTENT(INOUT) :: PRRS ! cumulated source for rt +REAL, DIMENSION(D%NIJT,D%NKT,KRR), INTENT(INOUT) :: PRRS ! cumulated source for rt REAL, DIMENSION(D%NIJT,D%NKT), INTENT(OUT) :: PTHLP ! guess of thl at t+ deltat REAL, DIMENSION(D%NIJT,D%NKT), INTENT(OUT) :: PRP ! guess of r at t+ deltat ! @@ -396,7 +387,7 @@ LOGICAL :: GFWTH ! flag to use w'2th' LOGICAL :: GFR2 ! flag to use w'r'2 LOGICAL :: GFWR ! flag to use w'2r' LOGICAL :: GFTHR ! flag to use w'th'r' -TYPE(TFIELDDATA) :: TZFIELD +TYPE(TFIELDMETADATA) :: TZFIELD !---------------------------------------------------------------------------- ! !* 1. PRELIMINARIES @@ -672,42 +663,48 @@ ELSE !$mnh_end_expand_array(JIJ=IIJB:IIJE) END IF ! -DO JK=IKTB+1,IKTE-1 - !$mnh_expand_array(JIJ=IIJB:IIJE) - PWTH(IIJB:IIJE,JK)=0.5*(ZFLXZ(IIJB:IIJE,JK)+ZFLXZ(IIJB:IIJE,JK+IKL)) - !$mnh_end_expand_array(JIJ=IIJB:IIJE) -END DO -! -!$mnh_expand_array(JIJ=IIJB:IIJE) -PWTH(IIJB:IIJE,IKB)=0.5*(ZFLXZ(IIJB:IIJE,IKB)+ZFLXZ(IIJB:IIJE,IKB+IKL)) -!$mnh_end_expand_array(JIJ=IIJB:IIJE) -! -IF (OOCEAN) THEN - !$mnh_expand_array(JIJ=IIJB:IIJE) - PWTH(IIJB:IIJE,IKE)=0.5*(ZFLXZ(IIJB:IIJE,IKE)+ZFLXZ(IIJB:IIJE,IKE+IKL)) - PWTH(IIJB:IIJE,IKA)=0. - PWTH(IIJB:IIJE,IKU)=PWTH(IIJB:IIJE,IKE)! not used - !$mnh_end_expand_array(JIJ=IIJB:IIJE) -ELSE +IF ( OFLYER ) THEN + PWTH(:,:IKTB) = XUNDEF + PWTH(:,IKTE:) = XUNDEF + ! + DO JK = IKTB + 1, IKTE - 1 + !$mnh_expand_array(JIJ=IIJB:IIJE) + PWTH(IIJB:IIJE,JK)=0.5*(ZFLXZ(IIJB:IIJE,JK)+ZFLXZ(IIJB:IIJE,JK+IKL)) + !$mnh_end_expand_array(JIJ=IIJB:IIJE) + END DO + ! !$mnh_expand_array(JIJ=IIJB:IIJE) - PWTH(IIJB:IIJE,IKA)=0.5*(ZFLXZ(IIJB:IIJE,IKA)+ZFLXZ(IIJB:IIJE,IKA+IKL)) - PWTH(IIJB:IIJE,IKE)=PWTH(IIJB:IIJE,IKE-IKL) - PWTH(IIJB:IIJE,IKU)=0. + PWTH(IIJB:IIJE,IKB)=0.5*(ZFLXZ(IIJB:IIJE,IKB)+ZFLXZ(IIJB:IIJE,IKB+IKL)) !$mnh_end_expand_array(JIJ=IIJB:IIJE) + ! + IF (OOCEAN) THEN + !$mnh_expand_array(JIJ=IIJB:IIJE) + PWTH(IIJB:IIJE,IKE)=0.5*(ZFLXZ(IIJB:IIJE,IKE)+ZFLXZ(IIJB:IIJE,IKE+IKL)) + PWTH(IIJB:IIJE,IKA)=0. + PWTH(IIJB:IIJE,IKU)=PWTH(IIJB:IIJE,IKE)! not used + !$mnh_end_expand_array(JIJ=IIJB:IIJE) + ELSE + !$mnh_expand_array(JIJ=IIJB:IIJE) + PWTH(IIJB:IIJE,IKA)=0.5*(ZFLXZ(IIJB:IIJE,IKA)+ZFLXZ(IIJB:IIJE,IKA+IKL)) + PWTH(IIJB:IIJE,IKE)=PWTH(IIJB:IIJE,IKE-IKL) + PWTH(IIJB:IIJE,IKU)=0. + !$mnh_end_expand_array(JIJ=IIJB:IIJE) + END IF END IF ! IF ( TURBN%LTURB_FLX .AND. TPFILE%LOPENED ) THEN ! stores the conservative potential temperature vertical flux - TZFIELD%CMNHNAME = 'THW_FLX' - TZFIELD%CSTDNAME = '' - TZFIELD%CLONGNAME = 'THW_FLX' - TZFIELD%CUNITS = 'K m s-1' - TZFIELD%CDIR = 'XY' - TZFIELD%CCOMMENT = 'Conservative potential temperature vertical flux' - TZFIELD%NGRID = 4 - TZFIELD%NTYPE = TYPEREAL - TZFIELD%NDIMS = 3 - TZFIELD%LTIMEDEP = .TRUE. + TZFIELD = TFIELDMETADATA( & + CMNHNAME = 'THW_FLX', & + CSTDNAME = '', & + CLONGNAME = 'THW_FLX', & + CUNITS = 'K m s-1', & + CDIR = 'XY', & + CCOMMENT = 'Conservative potential temperature vertical flux', & + NGRID = 4, & + NTYPE = TYPEREAL, & + NDIMS = 3, & + LTIMEDEP = .TRUE. ) CALL IO_FIELD_WRITE_PHY(D,TPFILE,TZFIELD,ZFLXZ) END IF ! @@ -1061,41 +1058,44 @@ IF (KRR /= 0) THEN ZFLXZ(IIJB:IIJE,IKU) = ZFLXZ(IIJB:IIJE,IKE) END IF ! - DO JK=IKTB+1,IKTE-1 + IF ( OFLYER ) THEN + DO JK=IKTB+1,IKTE-1 + !$mnh_expand_array(JIJ=IIJB:IIJE) + PWRC(IIJB:IIJE,JK)=0.5*(ZFLXZ(IIJB:IIJE,JK)+ZFLXZ(IIJB:IIJE,JK+IKL)) + !$mnh_end_expand_array(JIJ=IIJB:IIJE) + END DO !$mnh_expand_array(JIJ=IIJB:IIJE) - PWRC(IIJB:IIJE,JK)=0.5*(ZFLXZ(IIJB:IIJE,JK)+ZFLXZ(IIJB:IIJE,JK+IKL)) + PWRC(IIJB:IIJE,IKB)=0.5*(ZFLXZ(IIJB:IIJE,IKB)+ZFLXZ(IIJB:IIJE,IKB+IKL)) !$mnh_end_expand_array(JIJ=IIJB:IIJE) - END DO - !$mnh_expand_array(JIJ=IIJB:IIJE) - PWRC(IIJB:IIJE,IKB)=0.5*(ZFLXZ(IIJB:IIJE,IKB)+ZFLXZ(IIJB:IIJE,IKB+IKL)) - !$mnh_end_expand_array(JIJ=IIJB:IIJE) - ! - IF (OOCEAN) THEN - !$mnh_expand_array(JIJ=IIJB:IIJE) - PWRC(IIJB:IIJE,IKE)=0.5*(ZFLXZ(IIJB:IIJE,IKE)+ZFLXZ(IIJB:IIJE,IKE+IKL)) - PWRC(IIJB:IIJE,IKA)=0. - PWRC(IIJB:IIJE,IKE+1)=ZFLXZ(IIJB:IIJE,IKE+1) - !$mnh_end_expand_array(JIJ=IIJB:IIJE) - ELSE - !$mnh_expand_array(JIJ=IIJB:IIJE) - PWRC(IIJB:IIJE,IKA)=0.5*(ZFLXZ(IIJB:IIJE,IKA)+ZFLXZ(IIJB:IIJE,IKA+IKL)) - PWRC(IIJB:IIJE,IKE)=PWRC(IIJB:IIJE,IKE-IKL) - PWRC(IIJB:IIJE,IKU)=0. - !$mnh_end_expand_array(JIJ=IIJB:IIJE) - ENDIF + ! + IF (OOCEAN) THEN + !$mnh_expand_array(JIJ=IIJB:IIJE) + PWRC(IIJB:IIJE,IKE)=0.5*(ZFLXZ(IIJB:IIJE,IKE)+ZFLXZ(IIJB:IIJE,IKE+IKL)) + PWRC(IIJB:IIJE,IKA)=0. + PWRC(IIJB:IIJE,IKE+1)=ZFLXZ(IIJB:IIJE,IKE+1) + !$mnh_end_expand_array(JIJ=IIJB:IIJE) + ELSE + !$mnh_expand_array(JIJ=IIJB:IIJE) + PWRC(IIJB:IIJE,IKA)=0.5*(ZFLXZ(IIJB:IIJE,IKA)+ZFLXZ(IIJB:IIJE,IKA+IKL)) + PWRC(IIJB:IIJE,IKE)=PWRC(IIJB:IIJE,IKE-IKL) + PWRC(IIJB:IIJE,IKU)=0. + !$mnh_end_expand_array(JIJ=IIJB:IIJE) + END IF + END IF ! IF ( TURBN%LTURB_FLX .AND. TPFILE%LOPENED ) THEN ! stores the conservative mixing ratio vertical flux - TZFIELD%CMNHNAME = 'RCONSW_FLX' - TZFIELD%CSTDNAME = '' - TZFIELD%CLONGNAME = 'RCONSW_FLX' - TZFIELD%CUNITS = 'kg m s-1 kg-1' - TZFIELD%CDIR = 'XY' - TZFIELD%CCOMMENT = 'Conservative mixing ratio vertical flux' - TZFIELD%NGRID = 4 - TZFIELD%NTYPE = TYPEREAL - TZFIELD%NDIMS = 3 - TZFIELD%LTIMEDEP = .TRUE. + TZFIELD = TFIELDMETADATA( & + CMNHNAME = 'RCONSW_FLX', & + CSTDNAME = '', & + CLONGNAME = 'RCONSW_FLX', & + CUNITS = 'kg m s-1 kg-1', & + CDIR = 'XY', & + CCOMMENT = 'Conservative mixing ratio vertical flux', & + NGRID = 4, & + NTYPE = TYPEREAL, & + NDIMS = 3, & + LTIMEDEP = .TRUE. ) CALL IO_FIELD_WRITE_PHY(D,TPFILE,TZFIELD,ZFLXZ) END IF ! @@ -1273,16 +1273,17 @@ IF ( ((TURBN%LTURB_FLX .AND. TPFILE%LOPENED) .OR. TLES%LLES_CALL) .AND. (KRRL > ! ! store the liquid water mixing ratio vertical flux IF ( TURBN%LTURB_FLX .AND. TPFILE%LOPENED ) THEN - TZFIELD%CMNHNAME = 'RCW_FLX' - TZFIELD%CSTDNAME = '' - TZFIELD%CLONGNAME = 'RCW_FLX' - TZFIELD%CUNITS = 'kg m s-1 kg-1' - TZFIELD%CDIR = 'XY' - TZFIELD%CCOMMENT = 'Liquid water mixing ratio vertical flux' - TZFIELD%NGRID = 4 - TZFIELD%NTYPE = TYPEREAL - TZFIELD%NDIMS = 3 - TZFIELD%LTIMEDEP = .TRUE. + TZFIELD = TFIELDMETADATA( & + CMNHNAME = 'RCW_FLX', & + CSTDNAME = '', & + CLONGNAME = 'RCW_FLX', & + CUNITS = 'kg m s-1 kg-1', & + CDIR = 'XY', & + CCOMMENT = 'Liquid water mixing ratio vertical flux', & + NGRID = 4, & + NTYPE = TYPEREAL, & + NDIMS = 3, & + LTIMEDEP = .TRUE. ) CALL IO_FIELD_WRITE_PHY(D,TPFILE,TZFIELD,ZFLXZ) END IF ! diff --git a/src/common/turb/modi_turb.F90 b/src/common/turb/modi_turb.F90 index 3694890aeed0689c5cfd322fe6b39c9dfdb739b5..747f10538154c6456a3824f929eff22814de4330 100644 --- a/src/common/turb/modi_turb.F90 +++ b/src/common/turb/modi_turb.F90 @@ -8,7 +8,7 @@ INTERFACE & KMI,KRR,KRRL,KRRI,HLBCX,HLBCY,KGRADIENTS,KHALO, & & KSPLIT,KMODEL_CL,KSV,KSV_LGBEG,KSV_LGEND,HPROGRAM, & & KSV_LIMA_NR, KSV_LIMA_NS, KSV_LIMA_NG, KSV_LIMA_NH, & - & O2D,ONOMIXLG,OFLAT,OCOUPLES,OBLOWSNOW,OIBM, & + & O2D,ONOMIXLG,OFLAT,OCOUPLES,OBLOWSNOW,OIBM,OFLYER, & & OCOMPUTE_SRC, PRSNOW, & & OOCEAN,ODEEPOC,ODIAG_IN_RUN, & & HTURBLEN_CL,HCLOUD, & @@ -61,6 +61,7 @@ INTEGER, INTENT(IN) :: KHALO ! Size of the halo for par LOGICAL, INTENT(IN) :: OCOMPUTE_SRC ! flag to define dimensions of SIGS and SRCT variables LOGICAL, INTENT(IN) :: OOCEAN ! switch for Ocean model version LOGICAL, INTENT(IN) :: ODEEPOC ! activates sfc forcing for ideal ocean deep conv +LOGICAL, INTENT(IN) :: OFLYER ! MesoNH flyer diagnostic LOGICAL, INTENT(IN) :: OFLAT ! Logical for zero ororography LOGICAL, INTENT(IN) :: OCOUPLES ! switch to activate atmos-ocean LES version LOGICAL, INTENT(IN) :: OBLOWSNOW ! switch to activate pronostic blowing snow diff --git a/src/common/turb/shallow_mf.F90 b/src/common/turb/shallow_mf.F90 index ec3a76764d15e02c60fa00531c59a39a99fb6bad..898883076890bc04c938b2339d1c956b653fff5c 100644 --- a/src/common/turb/shallow_mf.F90 +++ b/src/common/turb/shallow_mf.F90 @@ -1,4 +1,4 @@ -!MNH_LIC Copyright 1994-2021 CNRS, Meteo-France and Universite Paul Sabatier +!MNH_LIC Copyright 1994-2023 CNRS, Meteo-France and Universite Paul Sabatier !MNH_LIC This is part of the Meso-NH software governed by the CeCILL-C licence !MNH_LIC version 1. See LICENSE, CeCILL-C_V1-en.txt and CeCILL-C_V1-fr.txt !MNH_LIC for details. version 1. @@ -72,6 +72,10 @@ !* 0. DECLARATIONS ! ------------ ! +USE PARKIND1, ONLY: JPRB +USE SHUMAN_PHY, ONLY: MXM_PHY, MYM_PHY +USE YOMHOOK, ONLY: LHOOK, DR_HOOK +! USE MODD_BUDGET, ONLY: TBUDGETCONF_t, TBUDGETDATA, NBUDGET_U, NBUDGET_V, & NBUDGET_TH, NBUDGET_RV, NBUDGET_SV1 USE MODD_DIMPHYEX, ONLY: DIMPHYEX_t @@ -82,18 +86,15 @@ USE MODD_TURB_n, ONLY: TURB_t USE MODD_CTURB, ONLY: CSTURB_t USE MODD_PARAMETERS, ONLY: JPSVMAX ! -USE MODE_BUDGET, ONLY: BUDGET_STORE_ADD_PHY -USE MODE_THL_RT_FROM_TH_R_MF, ONLY: THL_RT_FROM_TH_R_MF -USE MODE_COMPUTE_UPDRAFT, ONLY: COMPUTE_UPDRAFT +USE MODE_BUDGET, ONLY: BUDGET_STORE_ADD_PHY +USE MODE_COMPUTE_MF_CLOUD, ONLY: COMPUTE_MF_CLOUD +USE MODE_COMPUTE_UPDRAFT, ONLY: COMPUTE_UPDRAFT +USE MODE_COMPUTE_UPDRAFT_RAHA, ONLY: COMPUTE_UPDRAFT_RAHA USE MODE_COMPUTE_UPDRAFT_RHCJ10, ONLY: COMPUTE_UPDRAFT_RHCJ10 -USE MODE_COMPUTE_UPDRAFT_RAHA, ONLY: COMPUTE_UPDRAFT_RAHA -USE MODE_MF_TURB, ONLY: MF_TURB -USE MODE_MF_TURB_EXPL, ONLY: MF_TURB_EXPL -USE MODE_COMPUTE_MF_CLOUD, ONLY: COMPUTE_MF_CLOUD -USE MODE_MSG, ONLY: PRINT_MSG, NVERB_FATAL -USE PARKIND1, ONLY : JPRB -USE YOMHOOK , ONLY : LHOOK, DR_HOOK -USE SHUMAN_PHY, ONLY: MXM_PHY, MYM_PHY +USE MODE_MF_TURB, ONLY: MF_TURB +USE MODE_MF_TURB_EXPL, ONLY: MF_TURB_EXPL +USE MODE_MSG, ONLY: PRINT_MSG, NVERB_FATAL +USE MODE_THL_RT_FROM_TH_R_MF, ONLY: THL_RT_FROM_TH_R_MF ! IMPLICIT NONE @@ -120,16 +121,15 @@ REAL, INTENT(IN) :: PTSTEP ! Dynamical timestep REAL, DIMENSION(D%NIJT,D%NKT), INTENT(IN) :: PZZ ! Height of flux point REAL, DIMENSION(D%NIJT,D%NKT), INTENT(IN) :: PDZZ ! Metric coefficients REAL, DIMENSION(D%NIJT,D%NKT), INTENT(IN) :: PRHODJ ! dry density * Grid size -REAL, DIMENSION(D%NIJT,D%NKT), INTENT(IN) :: PRHODREF ! dry density of the - ! reference state +REAL, DIMENSION(D%NIJT,D%NKT), INTENT(IN) :: PRHODREF ! dry density of the reference state REAL, DIMENSION(D%NIJT,D%NKT), INTENT(IN) :: PPABSM ! Pressure at time t-1 REAL, DIMENSION(D%NIJT,D%NKT), INTENT(IN) :: PEXNM ! Exner function at t-dt -REAL, DIMENSION(D%NIJT), INTENT(IN) :: PSFTH,PSFRV ! normal surface fluxes of theta and Rv -REAL, DIMENSION(D%NIJT,D%NKT), INTENT(IN) :: PTHM ! Theta at t-dt +REAL, DIMENSION(D%NIJT), INTENT(IN) :: PSFTH,PSFRV ! normal surface fluxes of theta and Rv +REAL, DIMENSION(D%NIJT,D%NKT), INTENT(IN) :: PTHM ! Theta at t-dt REAL, DIMENSION(D%NIJT,D%NKT,KRR), INTENT(IN) :: PRM ! water var. at t-dt -REAL, DIMENSION(D%NIJT,D%NKT), INTENT(IN) :: PUM,PVM ! wind components at t-dt -REAL, DIMENSION(D%NIJT,D%NKT), INTENT(IN) :: PTKEM ! tke at t-dt +REAL, DIMENSION(D%NIJT,D%NKT), INTENT(IN) :: PUM,PVM ! wind components at t-dt +REAL, DIMENSION(D%NIJT,D%NKT), INTENT(IN) :: PTKEM ! tke at t-dt REAL, DIMENSION(D%NIJT,D%NKT,KSV), INTENT(IN) :: PSVM ! scalar variable a t-dt REAL, DIMENSION(D%NIJT,D%NKT), INTENT(OUT):: PDUDT_MF ! tendency of U by massflux scheme @@ -157,13 +157,13 @@ REAL, DIMENSION(D%NIJT,D%NKT), INTENT(INOUT) :: PFRAC_UP ! updraft fraction REAL, DIMENSION(D%NIJT,D%NKT), INTENT(INOUT) :: PEMF ! updraft mass flux REAL, DIMENSION(D%NIJT,D%NKT), INTENT(OUT) :: PDETR ! updraft detrainment REAL, DIMENSION(D%NIJT,D%NKT), INTENT(OUT) :: PENTR ! updraft entrainment -INTEGER,DIMENSION(D%NIJT), INTENT(OUT) :: KKLCL,KKETL,KKCTL ! level of LCL,ETL and CTL -REAL, INTENT(IN) :: PDX, PDY -REAL, DIMENSION(D%NIJT,D%NKT,KSV), INTENT(IN),OPTIONAL :: PRSVS ! sources of sv (for Budgets with lagrangian tracer) -TYPE(TBUDGETCONF_t), INTENT(IN),OPTIONAL :: BUCONF ! budget structure -INTEGER, INTENT(IN) :: KBUDGETS ! option. because not used in arpifs -TYPE(TBUDGETDATA), DIMENSION(KBUDGETS), INTENT(INOUT),OPTIONAL :: TBUDGETS -REAL,DIMENSION(JPSVMAX),INTENT(IN),OPTIONAL :: PSVMIN ! minimum value for SV variables (for Budgets) +INTEGER,DIMENSION(D%NIJT), INTENT(OUT) :: KKLCL,KKETL,KKCTL ! level of LCL,ETL and CTL +REAL, INTENT(IN) :: PDX, PDY +REAL, DIMENSION(D%NIJT,D%NKT,KSV), INTENT(IN), OPTIONAL :: PRSVS ! sources of sv (for Budgets with lagrangian tracer) +REAL,DIMENSION(JPSVMAX), INTENT(IN), OPTIONAL :: PSVMIN ! minimum value for SV variables (for Budgets) +TYPE(TBUDGETCONF_t), INTENT(IN), OPTIONAL :: BUCONF ! budget structure +TYPE(TBUDGETDATA), DIMENSION(KBUDGETS), INTENT(INOUT), OPTIONAL :: TBUDGETS +INTEGER, INTENT(IN) :: KBUDGETS ! option. because not used in arpifs ! ! 0.2 Declaration of local variables diff --git a/src/common/turb/turb.F90 b/src/common/turb/turb.F90 index e0713fcd3a642d3f4888df1f9548d6769958e08a..58e0ba1847373e468597bdfa8ed1590f97281dc0 100644 --- a/src/common/turb/turb.F90 +++ b/src/common/turb/turb.F90 @@ -7,7 +7,7 @@ & KMI,KRR,KRRL,KRRI,HLBCX,HLBCY,KGRADIENTS,KHALO, & & KSPLIT,KMODEL_CL,KSV,KSV_LGBEG,KSV_LGEND,HPROGRAM, & & KSV_LIMA_NR, KSV_LIMA_NS, KSV_LIMA_NG, KSV_LIMA_NH, & - & O2D,ONOMIXLG,OFLAT,OCOUPLES,OBLOWSNOW,OIBM, & + & O2D,ONOMIXLG,OFLAT,OCOUPLES,OBLOWSNOW,OIBM,OFLYER, & & OCOMPUTE_SRC, PRSNOW, & & OOCEAN,ODEEPOC,ODIAG_IN_RUN, & & HTURBLEN_CL,HCLOUD, & @@ -226,7 +226,7 @@ ! P. Wautelet 05/2016-04/2018: new data structures and calls for I/O ! Q. Rodier 01/2018: introduction of RM17 ! P. Wautelet 20/05/2019: add name argument to ADDnFIELD_ll + new ADD4DFIELD_ll subroutine -!! June 2019 (Wim de Rooy) update statistical cloud scheme +! Wim de Rooy 06/2019: update statistical cloud scheme ! P. Wautelet 02/2020: use the new data structures and subroutines for budgets ! B. Vie 03/2020: LIMA negativity checks after turbulence, advection and microphysics budgets ! P. Wautelet 11/06/2020: bugfix: correct PRSVS array indices @@ -239,45 +239,44 @@ !* 0. DECLARATIONS ! ------------ ! -USE PARKIND1, ONLY : JPRB -USE YOMHOOK , ONLY : LHOOK, DR_HOOK +USE PARKIND1, ONLY: JPRB +USE SHUMAN_PHY, ONLY: MZF_PHY,MXF_PHY,MYF_PHY +USE YOMHOOK , ONLY: LHOOK, DR_HOOK ! -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, & +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, TBUDGETCONF_t -USE MODD_FIELD, ONLY: TFIELDDATA,TYPEREAL -USE MODD_IO, ONLY: TFILEDATA -! -USE MODD_LES, ONLY : TLES_t +USE MODD_CST, ONLY: CST_t +USE MODD_CTURB, ONLY: CSTURB_t USE MODD_DIMPHYEX, ONLY: DIMPHYEX_t -USE MODD_TURB_n, ONLY: TURB_t -! -USE MODE_BL89, ONLY: BL89 -USE MODE_TURB_VER, ONLY : TURB_VER -USE MODE_ROTATE_WIND, ONLY: ROTATE_WIND, UPDATE_ROTATE_WIND -USE MODE_TURB_HOR_SPLT, ONLY: TURB_HOR_SPLT -USE MODE_TKE_EPS_SOURCES, ONLY: TKE_EPS_SOURCES -USE MODE_RMC01, ONLY: RMC01 -USE MODE_TM06, ONLY: TM06 -USE MODE_UPDATE_LM, ONLY: UPDATE_LM -USE MODE_BUDGET, ONLY: BUDGET_STORE_INIT_PHY, BUDGET_STORE_END_PHY -USE MODE_IO_FIELD_WRITE, ONLY: IO_FIELD_WRITE_PHY -USE MODE_SBL_PHY, ONLY: LMO +USE MODD_FIELD, ONLY: TFIELDMETADATA, TYPEREAL +USE MODD_IO, ONLY: TFILEDATA +USE MODD_LES, ONLY: TLES_t +USE MODD_PARAMETERS, ONLY: JPVEXT_TURB, XUNDEF +USE MODD_TURB_n, ONLY: TURB_t +! +USE MODE_BL89, ONLY: BL89 +USE MODE_BUDGET, ONLY: BUDGET_STORE_INIT_PHY, BUDGET_STORE_END_PHY +USE MODE_EMOIST, ONLY: EMOIST +USE MODE_ETHETA, ONLY: ETHETA +USE MODE_GRADIENT_U_PHY, ONLY: GZ_U_UW_PHY +USE MODE_GRADIENT_V_PHY, ONLY: GZ_V_VW_PHY +USE MODE_GRADIENT_W_PHY, ONLY: GZ_W_M_PHY +USE MODE_GRADIENT_M_PHY, ONLY: GZ_M_W_PHY +USE MODE_IBM_MIXINGLENGTH, ONLY: IBM_MIXINGLENGTH +USE MODE_IO_FIELD_WRITE, ONLY: IO_FIELD_WRITE_PHY +USE MODE_RMC01, ONLY: RMC01 +USE MODE_ROTATE_WIND, ONLY: ROTATE_WIND, UPDATE_ROTATE_WIND +USE MODE_SBL_PHY, ONLY: LMO USE MODE_SOURCES_NEG_CORRECT, ONLY: SOURCES_NEG_CORRECT_PHY -USE MODE_EMOIST, ONLY: EMOIST -USE MODE_ETHETA, ONLY: ETHETA -USE MODE_IBM_MIXINGLENGTH, ONLY: IBM_MIXINGLENGTH +USE MODE_TM06, ONLY: TM06 +USE MODE_TKE_EPS_SOURCES, ONLY: TKE_EPS_SOURCES +USE MODE_TURB_HOR_SPLT, ONLY: TURB_HOR_SPLT +USE MODE_TURB_VER, ONLY: TURB_VER +USE MODE_UPDATE_LM, ONLY: UPDATE_LM ! USE MODI_LES_MEAN_SUBGRID_PHY ! -USE SHUMAN_PHY, ONLY : MZF_PHY,MXF_PHY,MYF_PHY -USE MODE_GRADIENT_U_PHY, ONLY : GZ_U_UW_PHY -USE MODE_GRADIENT_V_PHY, ONLY : GZ_V_VW_PHY -USE MODE_GRADIENT_W_PHY, ONLY : GZ_W_M_PHY -USE MODE_GRADIENT_M_PHY, ONLY : GZ_M_W_PHY ! IMPLICIT NONE ! @@ -305,6 +304,7 @@ INTEGER, INTENT(IN) :: KMODEL_CL ! model number for cloud m LOGICAL, INTENT(IN) :: OCOMPUTE_SRC ! flag to define dimensions of SIGS and SRCT variables LOGICAL, INTENT(IN) :: OOCEAN ! switch for Ocean model version LOGICAL, INTENT(IN) :: ODEEPOC ! activates sfc forcing for ideal ocean deep conv +LOGICAL, INTENT(IN) :: OFLYER ! MesoNH flyer diagnostic LOGICAL, INTENT(IN) :: OFLAT ! Logical for zero ororography LOGICAL, INTENT(IN) :: OCOUPLES ! switch to activate atmos-ocean LES version LOGICAL, INTENT(IN) :: OBLOWSNOW ! switch to activate pronostic blowing snow @@ -500,7 +500,7 @@ REAL :: ZALPHA ! work coefficient : ! ! BL89 mixing length near the surface ! REAL :: ZTIME1, ZTIME2 -TYPE(TFIELDDATA) :: TZFIELD +TYPE(TFIELDMETADATA) :: TZFIELD ! !* 1.PRELIMINARIES ! ------------- @@ -533,7 +533,7 @@ ZEXPL = 1.- TURBN%XIMPL ZRVORD= CST%XRV / CST%XRD ! !Copy data into ZTHLM and ZRM only if needed -IF (TURBN%CTURBLEN=='BL89' .OR. TURBN%CTURBLEN=='RM17' .OR. TURBN%CTURBLEN=='ADAP' .OR. TURBN%LRMC01) THEN +IF (TURBN%CTURBLEN=='BL89' .OR. TURBN%CTURBLEN=='RM17' .OR. TURBN%CTURBLEN=='HM21' .OR. TURBN%LRMC01) THEN ZTHLM(IIJB:IIJE,1:IKT) = PTHLT(IIJB:IIJE,1:IKT) ZRM(IIJB:IIJE,1:IKT,:) = PRT(IIJB:IIJE,1:IKT,:) END IF @@ -641,28 +641,30 @@ IF (KRRL >=1) THEN ! ! IF ( TPFILE%LOPENED .AND. TURBN%LTURB_DIAG ) THEN - TZFIELD%CMNHNAME = 'ATHETA' - TZFIELD%CSTDNAME = '' - TZFIELD%CLONGNAME = 'ATHETA' - TZFIELD%CUNITS = 'm' - TZFIELD%CDIR = 'XY' - TZFIELD%CCOMMENT = 'X_Y_Z_ATHETA' - TZFIELD%NGRID = 1 - TZFIELD%NTYPE = TYPEREAL - TZFIELD%NDIMS = 3 - TZFIELD%LTIMEDEP = .TRUE. + TZFIELD = TFIELDMETADATA( & + CMNHNAME = 'ATHETA', & + CSTDNAME = '', & + CLONGNAME = 'ATHETA', & + CUNITS = 'm', & + CDIR = 'XY', & + CCOMMENT = 'X_Y_Z_ATHETA', & + NGRID = 1, & + NTYPE = TYPEREAL, & + NDIMS = 3, & + LTIMEDEP = .TRUE. ) CALL IO_FIELD_WRITE_PHY(D,TPFILE,TZFIELD,ZATHETA) ! - TZFIELD%CMNHNAME = 'AMOIST' - TZFIELD%CSTDNAME = '' - TZFIELD%CLONGNAME = 'AMOIST' - TZFIELD%CUNITS = 'm' - TZFIELD%CDIR = 'XY' - TZFIELD%CCOMMENT = 'X_Y_Z_AMOIST' - TZFIELD%NGRID = 1 - TZFIELD%NTYPE = TYPEREAL - TZFIELD%NDIMS = 3 - TZFIELD%LTIMEDEP = .TRUE. + TZFIELD = TFIELDMETADATA( & + CMNHNAME = 'AMOIST', & + CSTDNAME = '', & + CLONGNAME = 'AMOIST', & + CUNITS = 'm', & + CDIR = 'XY', & + CCOMMENT = 'X_Y_Z_AMOIST', & + NGRID = 1, & + NTYPE = TYPEREAL, & + NDIMS = 3, & + LTIMEDEP = .TRUE. ) CALL IO_FIELD_WRITE_PHY(D,TPFILE,TZFIELD,ZAMOIST) END IF ! @@ -748,7 +750,7 @@ SELECT CASE (TURBN%CTURBLEN) !* 3.3 Grey-zone combined RM17 & Deardorff mixing lengths ! -------------------------------------------------- - CASE ('ADAP') + CASE ('HM21') CALL GZ_U_UW_PHY(D,PUT,PDZZ,ZWORK1) CALL MZF_PHY(D,ZWORK1,ZWORK2) CALL MXF_PHY(D,ZWORK2,ZDUDZ) @@ -851,8 +853,8 @@ IF (TURBN%LRMC01) THEN CALL RMC01(D,CST,CSTURB,TURBN%CTURBLEN,PZZ,PDXX,PDYY,PDZZ,PDIRCOSZW,PSBL_DEPTH,ZLMO,ZLM,ZLEPS) END IF ! -!RMC01 is only applied on RM17 in ADAP -IF (TURBN%CTURBLEN=='ADAP') THEN +!RMC01 is only applied on RM17 in HM21 +IF (TURBN%CTURBLEN=='HM21') THEN !$mnh_expand_array(JIJ=IIJB:IIJE,JK=1:IKT) ZLEPS(IIJB:IIJE,1:IKT) = MIN(ZLEPS(IIJB:IIJE,1:IKT),ZLMW(IIJB:IIJE,1:IKT)*TURBN%XCADAP) !$mnh_end_expand_array(JIJ=IIJB:IIJE,JK=1:IKT) @@ -1006,7 +1008,7 @@ CALL TURB_VER(D,CST,CSTURB,TURBN,TLES, & OOCEAN, ODEEPOC, OCOMPUTE_SRC, & KSV,KSV_LGBEG,KSV_LGEND, & ZEXPL,HPROGRAM, O2D, ONOMIXLG, OFLAT, & - OCOUPLES,OBLOWSNOW, PRSNOW, & + OCOUPLES,OBLOWSNOW,OFLYER, PRSNOW, & PTSTEP,TPFILE, & PDXX,PDYY,PDZZ,PDZX,PDZY,PDIRCOSZW,PZZ, & PCOSSLOPE,PSINSLOPE, & @@ -1239,46 +1241,49 @@ IF ( TURBN%LTURB_DIAG .AND. TPFILE%LOPENED ) THEN ! ! stores the mixing length ! - TZFIELD%CMNHNAME = 'LM' - TZFIELD%CSTDNAME = '' - TZFIELD%CLONGNAME = 'LM' - TZFIELD%CUNITS = 'm' - TZFIELD%CDIR = 'XY' - TZFIELD%CCOMMENT = 'Mixing length' - TZFIELD%NGRID = 1 - TZFIELD%NTYPE = TYPEREAL - TZFIELD%NDIMS = 3 - TZFIELD%LTIMEDEP = .TRUE. + TZFIELD = TFIELDMETADATA( & + CMNHNAME = 'LM', & + CSTDNAME = '', & + CLONGNAME = 'LM', & + CUNITS = 'm', & + CDIR = 'XY', & + CCOMMENT = 'Mixing length', & + NGRID = 1, & + NTYPE = TYPEREAL, & + NDIMS = 3, & + LTIMEDEP = .TRUE. ) CALL IO_FIELD_WRITE_PHY(D,TPFILE,TZFIELD,ZLM) ! IF (KRR /= 0) THEN ! ! stores the conservative potential temperature ! - TZFIELD%CMNHNAME = 'THLM' - TZFIELD%CSTDNAME = '' - TZFIELD%CLONGNAME = 'THLM' - TZFIELD%CUNITS = 'K' - TZFIELD%CDIR = 'XY' - TZFIELD%CCOMMENT = 'Conservative potential temperature' - TZFIELD%NGRID = 1 - TZFIELD%NTYPE = TYPEREAL - TZFIELD%NDIMS = 3 - TZFIELD%LTIMEDEP = .TRUE. + TZFIELD = TFIELDMETADATA( & + CMNHNAME = 'THLM', & + CSTDNAME = '', & + CLONGNAME = 'THLM', & + CUNITS = 'K', & + CDIR = 'XY', & + CCOMMENT = 'Conservative potential temperature', & + NGRID = 1, & + NTYPE = TYPEREAL, & + NDIMS = 3, & + LTIMEDEP = .TRUE. ) CALL IO_FIELD_WRITE_PHY(D,TPFILE,TZFIELD,PTHLT) ! ! stores the conservative mixing ratio ! - TZFIELD%CMNHNAME = 'RNPM' - TZFIELD%CSTDNAME = '' - TZFIELD%CLONGNAME = 'RNPM' - TZFIELD%CUNITS = 'kg kg-1' - TZFIELD%CDIR = 'XY' - TZFIELD%CCOMMENT = 'Conservative mixing ratio' - TZFIELD%NGRID = 1 - TZFIELD%NTYPE = TYPEREAL - TZFIELD%NDIMS = 3 - TZFIELD%LTIMEDEP = .TRUE. + TZFIELD = TFIELDMETADATA( & + CMNHNAME = 'RNPM', & + CSTDNAME = '', & + CLONGNAME = 'RNPM', & + CUNITS = 'kg kg-1', & + CDIR = 'XY', & + CCOMMENT = 'Conservative mixing ratio',& + NGRID = 1, & + NTYPE = TYPEREAL, & + NDIMS = 3, & + LTIMEDEP = .TRUE. ) CALL IO_FIELD_WRITE_PHY(D,TPFILE,TZFIELD,PRT(:,:,1)) END IF END IF @@ -1951,7 +1956,7 @@ ELSE ! !* 3.1 BL89 mixing length ! ------------------ - CASE ('BL89','RM17','ADAP') + CASE ('BL89','RM17','HM21') ZSHEAR(:,:)=0. CALL BL89(D,CST,CSTURB,PZZ,PDZZ,PTHVREF,ZTHLM,KRR,ZRM,PTKET,ZSHEAR,ZLM_CLOUD,OOCEAN,HPROGRAM) ! @@ -1973,16 +1978,17 @@ ENDIF ! ! Impression before modification of the mixing length IF ( TURBN%LTURB_DIAG .AND. TPFILE%LOPENED ) THEN - TZFIELD%CMNHNAME = 'LM_CLEAR_SKY' - TZFIELD%CSTDNAME = '' - TZFIELD%CLONGNAME = 'LM_CLEAR_SKY' - TZFIELD%CUNITS = 'm' - TZFIELD%CDIR = 'XY' - TZFIELD%CCOMMENT = 'X_Y_Z_LM CLEAR SKY' - TZFIELD%NGRID = 1 - TZFIELD%NTYPE = TYPEREAL - TZFIELD%NDIMS = 3 - TZFIELD%LTIMEDEP = .TRUE. + TZFIELD = TFIELDMETADATA( & + CMNHNAME = 'LM_CLEAR_SKY', & + CSTDNAME = '', & + CLONGNAME = 'LM_CLEAR_SKY', & + CUNITS = 'm', & + CDIR = 'XY', & + CCOMMENT = 'X_Y_Z_LM CLEAR SKY', & + NGRID = 1, & + NTYPE = TYPEREAL, & + NDIMS = 3, & + LTIMEDEP = .TRUE. ) CALL IO_FIELD_WRITE_PHY(D,TPFILE,TZFIELD,ZLM) ENDIF ! @@ -2007,27 +2013,30 @@ END WHERE ! ---------- ! IF ( TURBN%LTURB_DIAG .AND. TPFILE%LOPENED ) THEN - TZFIELD%CMNHNAME = 'COEF_AMPL' - TZFIELD%CSTDNAME = '' - TZFIELD%CLONGNAME = 'COEF_AMPL' - TZFIELD%CUNITS = '1' - TZFIELD%CDIR = 'XY' - TZFIELD%CCOMMENT = 'X_Y_Z_COEF AMPL' - TZFIELD%NGRID = 1 - TZFIELD%NTYPE = TYPEREAL - TZFIELD%NDIMS = 3 - TZFIELD%LTIMEDEP = .TRUE. + TZFIELD = TFIELDMETADATA( & + CMNHNAME = 'COEF_AMPL', & + CSTDNAME = '', & + CLONGNAME = 'COEF_AMPL', & + CUNITS = '1', & + CDIR = 'XY', & + CCOMMENT = 'X_Y_Z_COEF AMPL', & + NGRID = 1, & + NTYPE = TYPEREAL, & + NDIMS = 3, & + LTIMEDEP = .TRUE. ) CALL IO_FIELD_WRITE_PHY(D,TPFILE,TZFIELD,ZCOEF_AMPL) ! - TZFIELD%CMNHNAME = 'LM_CLOUD' - TZFIELD%CSTDNAME = '' - TZFIELD%CLONGNAME = 'LM_CLOUD' - TZFIELD%CUNITS = 'm' - TZFIELD%CDIR = 'XY' - TZFIELD%CCOMMENT = 'X_Y_Z_LM CLOUD' - TZFIELD%NGRID = 1 - TZFIELD%NTYPE = TYPEREAL - TZFIELD%NDIMS = 3 + TZFIELD = TFIELDMETADATA( & + CMNHNAME = 'LM_CLOUD', & + CSTDNAME = '', & + CLONGNAME = 'LM_CLOUD', & + CUNITS = 'm', & + CDIR = 'XY', & + CCOMMENT = 'X_Y_Z_LM CLOUD', & + NGRID = 1, & + NTYPE = TYPEREAL, & + NDIMS = 3, & + LTIMEDEP = .TRUE. ) CALL IO_FIELD_WRITE_PHY(D,TPFILE,TZFIELD,ZLM_CLOUD) ! ENDIF diff --git a/src/mesonh/aux/modd_budget.f90 b/src/mesonh/aux/modd_budget.f90 index 65d6ce37bebf22b6490e804acf4cc6552176b36d..0270f474a0e5b53d71ccc86620c9c9bcafefd866 100644 --- a/src/mesonh/aux/modd_budget.f90 +++ b/src/mesonh/aux/modd_budget.f90 @@ -35,7 +35,7 @@ ! P. Wautelet 19/07/2019: parameters to identify budget number ! P. Wautelet 15/11/2019: remove unused CBURECORD variable ! P. Wautelet 17/01/2020: add new budget data types -! P. Wautelet 27/01/2020: use the tfield_metadata_base abstract datatype +! P. Wautelet 27/01/2020: use the tfieldmetadata_base abstract datatype ! P. Wautelet 28/01/2020: add trhodj in tbudgetdata datatype ! P. Wautelet 09/03/2020: add tburhodj variable ! P. Wautelet 17/04/2020: set default values for budgets switch values @@ -53,7 +53,7 @@ !* 0. DECLARATIONS ! ------------ -use modd_field, only: tfield_metadata_base +use modd_field, only: tfieldmetadata_base use modd_parameters, only: NBUNAMELGTMAX, NCOMMENTLGTMAX implicit none @@ -102,7 +102,7 @@ character(len=*), dimension(NMAXLEVELS), parameter :: CNCGROUPNAMES = [ & integer :: nbudgets ! Number of budget categories -type, extends( tfield_metadata_base ) :: tbusourcedata +type, extends( tfieldmetadata_base ) :: tbusourcedata integer :: ngroup = 0 ! Number of the source term group in which storing the source term ! (0: no store, 1: individual store, >1: number of the group) logical :: lavailable = .false. ! If true, the source is available in the run (conditions to access it are met), @@ -114,16 +114,17 @@ type, extends( tfield_metadata_base ) :: tbusourcedata ! It may be true only if the source term is in a group not containing other sources end type tbusourcedata -type, extends( tfield_metadata_base ) :: tbugroupdata +type, extends( tfieldmetadata_base ) :: tbugroupdata integer :: nsources = 0 ! Number of source terms composing this group integer, dimension(:), allocatable :: nsourcelist ! List of the source terms composing this group real, dimension(:,:,:), allocatable :: xdata ! Array to store the budget data end type tbugroupdata -type, extends( tfield_metadata_base ) :: tburhodata +type, extends( tfieldmetadata_base ) :: tburhodata real, dimension(:,:,:), allocatable :: xdata ! Array to store the budget data end type tburhodata +!PW: a commenter + renommer??? type :: tbudiachrometadata character(len=NBUNAMELGTMAX), dimension(NMAXLEVELS) :: clevels = '' !Name of the different groups/levels in the netCDF file character(len=NCOMMENTLGTMAX), dimension(NMAXLEVELS) :: ccomments ='' !Comments for the different groups/levels in the netCDF file @@ -164,20 +165,20 @@ type tbudgetdata end type tbudgetdata TYPE TBUDGETCONF_t - LOGICAL :: LBU_ENABLE - LOGICAL :: LBUDGET_U ! flag to compute budget of RhoJu and/or LES budgets with u - LOGICAL :: LBUDGET_V ! flag to compute budget of RhoJv and/or LES budgets with u - LOGICAL :: LBUDGET_W ! flag to compute budget of RhoJw and/or LES budgets with u - LOGICAL :: LBUDGET_TH ! flag to compute budget of RhoJTh and/or LES budgets with th - LOGICAL :: LBUDGET_TKE! flag to compute budget of RhoJTke and/or LES budgets with Tke - LOGICAL :: LBUDGET_RV ! flag to compute budget of RhoJrv and/or LES budgets with rv - LOGICAL :: LBUDGET_RC ! flag to compute budget of RhoJrc and/or LES budgets with rc - LOGICAL :: LBUDGET_RR ! flag to compute budget of RhoJrr and/or LES budgets with rr - LOGICAL :: LBUDGET_RI ! flag to compute budget of RhoJri and/or LES budgets with ri - LOGICAL :: LBUDGET_RS ! flag to compute budget of RhoJrs and/or LES budgets with rs - LOGICAL :: LBUDGET_RG ! flag to compute budget of RhoJrg and/or LES budgets with rg - LOGICAL :: LBUDGET_RH ! flag to compute budget of RhoJrh and/or LES budgets with rh - LOGICAL :: LBUDGET_SV ! flag to compute budget of RhoJsv and/or LES budgets with sv + LOGICAL :: LBU_ENABLE=.FALSE. + LOGICAL :: LBUDGET_U=.FALSE. ! flag to compute budget of RhoJu and/or LES budgets with u + LOGICAL :: LBUDGET_V=.FALSE. ! flag to compute budget of RhoJv and/or LES budgets with u + LOGICAL :: LBUDGET_W=.FALSE. ! flag to compute budget of RhoJw and/or LES budgets with u + LOGICAL :: LBUDGET_TH=.FALSE. ! flag to compute budget of RhoJTh and/or LES budgets with th + LOGICAL :: LBUDGET_TKE=.FALSE.! flag to compute budget of RhoJTke and/or LES budgets with Tke + LOGICAL :: LBUDGET_RV=.FALSE. ! flag to compute budget of RhoJrv and/or LES budgets with rv + LOGICAL :: LBUDGET_RC=.FALSE. ! flag to compute budget of RhoJrc and/or LES budgets with rc + LOGICAL :: LBUDGET_RR=.FALSE. ! flag to compute budget of RhoJrr and/or LES budgets with rr + LOGICAL :: LBUDGET_RI=.FALSE. ! flag to compute budget of RhoJri and/or LES budgets with ri + LOGICAL :: LBUDGET_RS=.FALSE. ! flag to compute budget of RhoJrs and/or LES budgets with rs + LOGICAL :: LBUDGET_RG=.FALSE. ! flag to compute budget of RhoJrg and/or LES budgets with rg + LOGICAL :: LBUDGET_RH=.FALSE. ! flag to compute budget of RhoJrh and/or LES budgets with rh + LOGICAL :: LBUDGET_SV=.FALSE. ! flag to compute budget of RhoJsv and/or LES budgets with sv END TYPE TBUDGETCONF_t ! TYPE(TBUDGETCONF_t), TARGET :: TBUCONF @@ -187,7 +188,7 @@ type(tburhodata), pointer, save :: tburhodj => null() ! Budge ! General variables -LOGICAL, POINTER :: LBU_ENABLE=>TBUCONF%LBU_ENABLE +LOGICAL, POINTER :: LBU_ENABLE=>NULL() ! CHARACTER (LEN=4), SAVE :: CBUTYPE ! type of desired budget 'CART' ! (cartesian box) or 'MASK' (budget @@ -369,18 +370,38 @@ CHARACTER(LEN=NBULISTMAXLEN), DIMENSION(:), ALLOCATABLE :: CBULIST_RSV REAL :: XTIME_BU ! budget time in this time-step REAL :: XTIME_BU_PROCESS ! budget time per process for this time-step ! -LOGICAL, POINTER :: LBUDGET_U=>TBUCONF%LBUDGET_U ! flag to compute budget of RhoJu and/or LES budgets with u -LOGICAL, POINTER :: LBUDGET_V=>TBUCONF%LBUDGET_V ! flag to compute budget of RhoJv and/or LES budgets with u -LOGICAL, POINTER :: LBUDGET_W=>TBUCONF%LBUDGET_W ! flag to compute budget of RhoJw and/or LES budgets with u -LOGICAL, POINTER :: LBUDGET_TH=>TBUCONF%LBUDGET_TH ! flag to compute budget of RhoJTh and/or LES budgets with th -LOGICAL, POINTER :: LBUDGET_TKE=>TBUCONF%LBUDGET_TKE ! flag to compute budget of RhoJTke and/or LES budgets with Tke -LOGICAL, POINTER :: LBUDGET_RV=>TBUCONF%LBUDGET_RV ! flag to compute budget of RhoJrv and/or LES budgets with rv -LOGICAL, POINTER :: LBUDGET_RC=>TBUCONF%LBUDGET_RC ! flag to compute budget of RhoJrc and/or LES budgets with rc -LOGICAL, POINTER :: LBUDGET_RR=>TBUCONF%LBUDGET_RR ! flag to compute budget of RhoJrr and/or LES budgets with rr -LOGICAL, POINTER :: LBUDGET_RI=>TBUCONF%LBUDGET_RI ! flag to compute budget of RhoJri and/or LES budgets with ri -LOGICAL, POINTER :: LBUDGET_RS=>TBUCONF%LBUDGET_RS ! flag to compute budget of RhoJrs and/or LES budgets with rs -LOGICAL, POINTER :: LBUDGET_RG=>TBUCONF%LBUDGET_RG ! flag to compute budget of RhoJrg and/or LES budgets with rg -LOGICAL, POINTER :: LBUDGET_RH=>TBUCONF%LBUDGET_RH ! flag to compute budget of RhoJrh and/or LES budgets with rh -LOGICAL, POINTER :: LBUDGET_SV=>TBUCONF%LBUDGET_SV ! flag to compute budget of RhoJsv and/or LES budgets with sv -! +LOGICAL, POINTER :: LBUDGET_U=>NULL() ! flag to compute budget of RhoJu and/or LES budgets with u +LOGICAL, POINTER :: LBUDGET_V=>NULL() ! flag to compute budget of RhoJv and/or LES budgets with u +LOGICAL, POINTER :: LBUDGET_W=>NULL() ! flag to compute budget of RhoJw and/or LES budgets with u +LOGICAL, POINTER :: LBUDGET_TH=>NULL() ! flag to compute budget of RhoJTh and/or LES budgets with th +LOGICAL, POINTER :: LBUDGET_TKE=>NULL() ! flag to compute budget of RhoJTke and/or LES budgets with Tke +LOGICAL, POINTER :: LBUDGET_RV=>NULL() ! flag to compute budget of RhoJrv and/or LES budgets with rv +LOGICAL, POINTER :: LBUDGET_RC=>NULL() ! flag to compute budget of RhoJrc and/or LES budgets with rc +LOGICAL, POINTER :: LBUDGET_RR=>NULL() ! flag to compute budget of RhoJrr and/or LES budgets with rr +LOGICAL, POINTER :: LBUDGET_RI=>NULL() ! flag to compute budget of RhoJri and/or LES budgets with ri +LOGICAL, POINTER :: LBUDGET_RS=>NULL() ! flag to compute budget of RhoJrs and/or LES budgets with rs +LOGICAL, POINTER :: LBUDGET_RG=>NULL() ! flag to compute budget of RhoJrg and/or LES budgets with rg +LOGICAL, POINTER :: LBUDGET_RH=>NULL() ! flag to compute budget of RhoJrh and/or LES budgets with rh +LOGICAL, POINTER :: LBUDGET_SV=>NULL() ! flag to compute budget of RhoJsv and/or LES budgets with sv +! +CONTAINS +SUBROUTINE TBUCONF_ASSOCIATE() + IMPLICIT NONE + LBU_ENABLE=>TBUCONF%LBU_ENABLE + + LBUDGET_U=>TBUCONF%LBUDGET_U + LBUDGET_V=>TBUCONF%LBUDGET_V + LBUDGET_W=>TBUCONF%LBUDGET_W + LBUDGET_TH=>TBUCONF%LBUDGET_TH + LBUDGET_TKE=>TBUCONF%LBUDGET_TKE + LBUDGET_RV=>TBUCONF%LBUDGET_RV + LBUDGET_RC=>TBUCONF%LBUDGET_RC + LBUDGET_RR=>TBUCONF%LBUDGET_RR + LBUDGET_RI=>TBUCONF%LBUDGET_RI + LBUDGET_RS=>TBUCONF%LBUDGET_RS + LBUDGET_RG=>TBUCONF%LBUDGET_RG + LBUDGET_RH=>TBUCONF%LBUDGET_RH + LBUDGET_SV=>TBUCONF%LBUDGET_SV +END SUBROUTINE TBUCONF_ASSOCIATE + END MODULE MODD_BUDGET diff --git a/src/mesonh/aux/mode_io_field_write.f90 b/src/mesonh/aux/mode_io_field_write.f90 index a4a6a28c0f76c12701db46b997a5cf1cc96fbb80..e513093ca60097b15caa167b738b12576ebc5a8e 100644 --- a/src/mesonh/aux/mode_io_field_write.f90 +++ b/src/mesonh/aux/mode_io_field_write.f90 @@ -25,7 +25,8 @@ MODULE MODE_IO_FIELD_WRITE - use modd_field, only: tfielddata, tfieldlist, TYPECHAR, TYPEDATE, TYPEINT, TYPELOG, TYPEREAL + use modd_field, only: tfieldlist, tfieldmetadata, tfieldmetadata_base, & + TYPECHAR, TYPEDATE, TYPEINT, TYPELOG, TYPEREAL USE MODD_IO, ONLY: TFILEDATA, TOUTBAK USE MODD_MPIF use modd_parameters, only: NMNHNAMELGTMAX @@ -86,10 +87,10 @@ MODULE MODE_IO_FIELD_WRITE CONTAINS SUBROUTINE IO_Field_metadata_check(TPFIELD,KTYPE,KDIMS,HCALLER) - TYPE(TFIELDDATA), INTENT(IN) :: TPFIELD ! Field to check - INTEGER, INTENT(IN) :: KTYPE ! Expected datatype - INTEGER, INTENT(IN) :: KDIMS ! Expected number of dimensions - CHARACTER(LEN=*), INTENT(IN) :: HCALLER ! name of the calling subroutine + CLASS(tfieldmetadata_base), INTENT(IN) :: TPFIELD ! Field to check + INTEGER, INTENT(IN) :: KTYPE ! Expected datatype + INTEGER, INTENT(IN) :: KDIMS ! Expected number of dimensions + CHARACTER(LEN=*), INTENT(IN) :: HCALLER ! name of the calling subroutine ! CHARACTER(LEN=2) :: YDIMOK,YDIMKO CHARACTER(LEN=8) :: YTYPEOK,YTYPEKO @@ -182,13 +183,13 @@ CONTAINS subroutine IO_Field_write_error_check( tpfile, tpfield, hsubr, kresp_in, kresp_lfi, kresp_nc4, kresp_out ) use modd_io, only: gsmonoproc - type(tfiledata), intent(in) :: tpfile - type(tfielddata), intent(in) :: tpfield - character(len=*), intent(in) :: hsubr - integer, intent(in) :: kresp_in - integer, intent(in) :: kresp_lfi - integer, intent(in) :: kresp_nc4 - integer, intent(out) :: kresp_out + type(tfiledata), intent(in) :: tpfile + class(tfieldmetadata_base), intent(in) :: tpfield + character(len=*), intent(in) :: hsubr + integer, intent(in) :: kresp_in + integer, intent(in) :: kresp_lfi + integer, intent(in) :: kresp_nc4 + integer, intent(out) :: kresp_out character(len=:), allocatable :: ymsg character(len=6) :: yresp @@ -316,14 +317,14 @@ subroutine IO_Field_create( tpfile, tpfield ) use modd_field use modd_io, only: gsmonoproc, isp - type(tfiledata), intent(in) :: tpfile - type(tfielddata), intent(in) :: tpfield + type(tfiledata), intent(in) :: tpfile + class(tfieldmetadata), intent(in) :: tpfield - integer :: ik_file - integer :: iresp - logical :: glfi, gnc4 - type(tfielddata) :: tzfield - type(tfiledata), pointer :: tzfile + integer :: ik_file + integer :: iresp + logical :: glfi, gnc4 + class(tfieldmetadata), allocatable :: tzfield + type(tfiledata), pointer :: tzfile call Print_msg( NVERB_DEBUG, 'IO', 'IO_Field_create', Trim( tpfile%cname ) // ': creating ' // Trim( tpfield%cmnhname ) ) @@ -345,7 +346,7 @@ subroutine IO_Field_create( tpfile, tpfield ) end if if ( iresp == 0 ) then - tzfield = tpfield + Allocate( tzfield, source = tpfield ) if ( All( tzfield%ntype /= [ TYPEINT, TYPELOG, TYPEREAL, TYPECHAR, TYPEDATE ] ) ) then call Print_msg( NVERB_ERROR, 'IO', 'IO_Field_create', Trim( tpfile%cname ) // ': ' & @@ -448,8 +449,8 @@ subroutine IO_Ndimlist_reduce( tpfile, tpfield ) use modd_io, only: gsmonoproc, l1d, l2d, lpack use modd_parameters_ll, only: jphext - type(tfiledata), intent(in) :: tpfile - type(tfielddata), intent(inout) :: tpfield + type(tfiledata), intent(in) :: tpfile + class(tfieldmetadata_base), intent(inout) :: tpfield integer :: ihextot integer :: ji @@ -534,7 +535,7 @@ end subroutine IO_Ndimlist_reduce !* 0.1 Declarations of arguments ! TYPE(TFILEDATA), INTENT(IN) :: TPFILE - TYPE(TFIELDDATA), INTENT(IN) :: TPFIELD + CLASS(TFIELDMETADATA), INTENT(IN) :: TPFIELD REAL,TARGET, INTENT(IN) :: PFIELD ! array containing the data field INTEGER,OPTIONAL, INTENT(OUT):: KRESP ! return-code ! @@ -633,7 +634,7 @@ end subroutine IO_Ndimlist_reduce ! TYPE(DIMPHYEX_t), INTENT(IN) :: D TYPE(TFILEDATA), INTENT(IN) :: TPFILE - TYPE(TFIELDDATA), INTENT(IN) :: TPFIELD + TYPE(TFIELDMETADATA), INTENT(IN) :: TPFIELD REAL,DIMENSION(D%NIJT,D%NKT),TARGET, INTENT(IN) :: PFIELD ! array containing the data field INTEGER, OPTIONAL, INTENT(OUT) :: KRESP ! return-code integer, dimension(3), optional, intent(in) :: koffset @@ -651,7 +652,7 @@ end subroutine IO_Ndimlist_reduce ! TYPE(DIMPHYEX_t), INTENT(IN) :: D TYPE(TFILEDATA), INTENT(IN) :: TPFILE - TYPE(TFIELDDATA), INTENT(IN) :: TPFIELD + TYPE(TFIELDMETADATA), INTENT(IN) :: TPFIELD REAL,DIMENSION(D%NIT,D%NJT,D%NKT),TARGET, INTENT(IN) :: PFIELD ! array containing the data field INTEGER, OPTIONAL, INTENT(OUT) :: KRESP ! return-code integer, dimension(3), optional, intent(in) :: koffset @@ -669,7 +670,7 @@ end subroutine IO_Ndimlist_reduce ! TYPE(DIMPHYEX_t), INTENT(IN) :: D TYPE(TFILEDATA), INTENT(IN) :: TPFILE - TYPE(TFIELDDATA), INTENT(IN) :: TPFIELD + TYPE(TFIELDMETADATA), INTENT(IN) :: TPFIELD REAL,DIMENSION(D%NIJT),TARGET, INTENT(IN) :: PFIELD ! array containing the data field INTEGER, OPTIONAL, INTENT(OUT) :: KRESP ! return-code integer, dimension(3), optional, intent(in) :: koffset @@ -687,7 +688,7 @@ end subroutine IO_Ndimlist_reduce ! TYPE(DIMPHYEX_t), INTENT(IN) :: D TYPE(TFILEDATA), INTENT(IN) :: TPFILE - TYPE(TFIELDDATA), INTENT(IN) :: TPFIELD + TYPE(TFIELDMETADATA), INTENT(IN) :: TPFIELD REAL,DIMENSION(D%NIT,D%NJT),TARGET, INTENT(IN) :: PFIELD ! array containing the data field INTEGER, OPTIONAL, INTENT(OUT) :: KRESP ! return-code integer, dimension(3), optional, intent(in) :: koffset @@ -708,7 +709,7 @@ end subroutine IO_Ndimlist_reduce !* 0.1 Declarations of arguments ! TYPE(TFILEDATA), INTENT(IN) :: TPFILE - TYPE(TFIELDDATA), INTENT(IN) :: TPFIELD + CLASS(TFIELDMETADATA), INTENT(IN) :: TPFIELD REAL,DIMENSION(:),TARGET, INTENT(IN) :: PFIELD ! array containing the data field INTEGER, OPTIONAL, INTENT(OUT) :: KRESP ! return-code integer, dimension(1), optional, intent(in) :: koffset @@ -838,7 +839,7 @@ end subroutine IO_Ndimlist_reduce !* 0.1 Declarations of arguments ! TYPE(TFILEDATA), INTENT(IN) :: TPFILE - TYPE(TFIELDDATA), INTENT(IN) :: TPFIELD + CLASS(TFIELDMETADATA), INTENT(IN) :: TPFIELD REAL,DIMENSION(:,:),TARGET, INTENT(IN) :: PFIELD ! array containing the data field INTEGER, OPTIONAL, INTENT(OUT) :: KRESP ! return-code integer, dimension(2), optional, intent(in) :: koffset @@ -866,7 +867,7 @@ end subroutine IO_Ndimlist_reduce INTEGER :: IHEXTOT CHARACTER(LEN=:),ALLOCATABLE :: YMSG CHARACTER(LEN=6) :: YRESP - type(tfielddata) :: tzfield + class(tfieldmetadata), allocatable :: tzfield ! YFILEM = TPFILE%CNAME YRECFM = TPFIELD%CMNHNAME @@ -897,8 +898,8 @@ end subroutine IO_Ndimlist_reduce IF (GSMONOPROC) THEN ! sequential execution ! IF (LPACK .AND. L1D .AND. YDIR=='XY') THEN IF (LPACK .AND. L1D .AND. SIZE(PFIELD,1)==IHEXTOT .AND. SIZE(PFIELD,2)==IHEXTOT) THEN + Allocate( tzfield, source = tpfield ) if ( tpfile%ldimreduced ) then - tzfield = tpfield tzfield%ndims = tzfield%ndims - 2 if ( tzfield%ndimlist(1) /= NMNHDIM_UNKNOWN ) then tzfield%ndimlist(1) = tzfield%ndimlist(3) !Necessary if time dimension @@ -915,7 +916,6 @@ end subroutine IO_Ndimlist_reduce if ( gnc4 ) call IO_Field_write_nc4( tpfile, tzfield, zfieldp0d, iresp_nc4 ) end if else - tzfield = tpfield if ( tzfield%ndimlist(1) /= NMNHDIM_UNKNOWN ) then tzfield%ndimlist(1:2) = NMNHDIM_ONE end if @@ -930,8 +930,8 @@ end subroutine IO_Ndimlist_reduce endif ! ELSE IF (LPACK .AND. L2D .AND. YDIR=='XY') THEN ELSEIF (LPACK .AND. L2D .AND. SIZE(PFIELD,2)==IHEXTOT) THEN + Allocate( tzfield, source = tpfield ) if ( tpfile%ldimreduced ) then - tzfield = tpfield tzfield%ndims = tzfield%ndims - 1 if ( tzfield%ndimlist(1) /= NMNHDIM_UNKNOWN ) then tzfield%ndimlist(2) = tzfield%ndimlist(3) !Necessary if time dimension @@ -947,7 +947,6 @@ end subroutine IO_Ndimlist_reduce if ( gnc4 ) call IO_Field_write_nc4( tpfile, tzfield, zfieldp1d, iresp_nc4 ) end if else - tzfield = tpfield if ( tzfield%ndimlist(1) /= NMNHDIM_UNKNOWN ) then tzfield%ndimlist(2) = NMNHDIM_ONE end if @@ -1097,7 +1096,7 @@ end subroutine IO_Ndimlist_reduce !* 0.1 Declarations of arguments ! TYPE(TFILEDATA),TARGET, INTENT(IN) :: TPFILE - TYPE(TFIELDDATA), INTENT(IN) :: TPFIELD + CLASS(TFIELDMETADATA), INTENT(IN) :: TPFIELD REAL,DIMENSION(:,:,:),TARGET, INTENT(IN) :: PFIELD ! array containing the data field INTEGER, OPTIONAL, INTENT(OUT) :: KRESP ! return-code integer, dimension(3), optional, intent(in) :: koffset @@ -1140,7 +1139,7 @@ end subroutine IO_Ndimlist_reduce INTEGER :: IHEXTOT CHARACTER(LEN=:),ALLOCATABLE :: YMSG CHARACTER(LEN=6) :: YRESP - type(tfielddata) :: tzfield + class(tfieldmetadata), allocatable :: tzfield TYPE(TFILEDATA),POINTER :: TZFILE ! TZFILE => NULL() @@ -1178,8 +1177,8 @@ end subroutine IO_Ndimlist_reduce IF (GSMONOPROC .AND. TPFILE%NSUBFILES_IOZ==0 ) THEN ! sequential execution ! IF (LPACK .AND. L1D .AND. YDIR=='XY') THEN IF (LPACK .AND. L1D .AND. SIZE(PFIELD,1)==IHEXTOT .AND. SIZE(PFIELD,2)==IHEXTOT) THEN + Allocate( tzfield, source = tpfield ) if ( tpfile%ldimreduced ) then - tzfield = tpfield tzfield%ndims = tzfield%ndims - 2 if ( tzfield%ndimlist(1) /= NMNHDIM_UNKNOWN ) then tzfield%ndimlist(1) = tzfield%ndimlist(3) @@ -1196,7 +1195,6 @@ end subroutine IO_Ndimlist_reduce if ( gnc4 ) call IO_Field_write_nc4( tpfile, tzfield, zfieldp1d, iresp_nc4 ) end if else - tzfield = tpfield if ( tzfield%ndimlist(1) /= NMNHDIM_UNKNOWN ) then tzfield%ndimlist(1:2) = NMNHDIM_ONE end if @@ -1210,8 +1208,8 @@ end subroutine IO_Ndimlist_reduce end if endif ELSEIF (LPACK .AND. L2D .AND. SIZE(PFIELD,2)==IHEXTOT) THEN + Allocate( tzfield, source = tpfield ) if ( tpfile%ldimreduced ) then - tzfield = tpfield tzfield%ndims = tzfield%ndims - 1 if ( tzfield%ndimlist(1) /= NMNHDIM_UNKNOWN ) then tzfield%ndimlist(2) = tzfield%ndimlist(3) @@ -1229,7 +1227,6 @@ end subroutine IO_Ndimlist_reduce if ( gnc4 ) call IO_Field_write_nc4( tpfile, tzfield, zfieldp2d, iresp_nc4 ) end if else - tzfield = tpfield if ( tzfield%ndimlist(2) /= NMNHDIM_UNKNOWN ) tzfield%ndimlist(2) = NMNHDIM_ONE zfieldp => pfield(:, jphext + 1 : jphext + 1, :) if ( Present ( koffset ) ) then @@ -1503,7 +1500,7 @@ end subroutine IO_Ndimlist_reduce ! end of MNH_GA #endif !Not global reduction because a broadcast is done in IO_Field_write_error_check - call MPI_REDUCE( -Abs( [ iresp_lfi, iresp_nc4 ] ), iresps(:), 1, MNHINT_MPI, MPI_MIN, & + call MPI_REDUCE( -Abs( [ iresp_lfi, iresp_nc4 ] ), iresps(:), 2, MNHINT_MPI, MPI_MIN, & tpfile%nmaster_rank - 1, tpfile%nmpicomm, ierr ) iresp_lfi = iresps(1) iresp_nc4 = iresps(2) @@ -1562,7 +1559,7 @@ end subroutine IO_Ndimlist_reduce !* 0.1 Declarations of arguments ! TYPE(TFILEDATA), INTENT(IN) :: TPFILE - TYPE(TFIELDDATA), INTENT(IN) :: TPFIELD + CLASS(TFIELDMETADATA), INTENT(IN) :: TPFIELD REAL,DIMENSION(:,:,:,:),TARGET, INTENT(IN) :: PFIELD ! array containing the data field INTEGER, OPTIONAL, INTENT(OUT) :: KRESP ! return-code integer, dimension(4), optional, intent(in) :: koffset @@ -1585,7 +1582,7 @@ end subroutine IO_Ndimlist_reduce INTEGER :: IHEXTOT CHARACTER(LEN=:),ALLOCATABLE :: YMSG CHARACTER(LEN=6) :: YRESP - type(tfielddata) :: tzfield + class(tfieldmetadata), allocatable :: tzfield ! YFILEM = TPFILE%CNAME YRECFM = TPFIELD%CMNHNAME @@ -1615,8 +1612,8 @@ end subroutine IO_Ndimlist_reduce IF (GSMONOPROC) THEN ! sequential execution ! IF (LPACK .AND. L1D .AND. YDIR=='XY') THEN IF (LPACK .AND. L1D .AND. SIZE(PFIELD,1)==IHEXTOT .AND. SIZE(PFIELD,2)==IHEXTOT) THEN + Allocate( tzfield, source = tpfield ) if ( tpfile%ldimreduced ) then - tzfield = tpfield tzfield%ndims = tzfield%ndims - 2 if ( tzfield%ndimlist(1) /= NMNHDIM_UNKNOWN ) then tzfield%ndimlist(1) = tzfield%ndimlist(3) @@ -1635,7 +1632,6 @@ end subroutine IO_Ndimlist_reduce if ( gnc4 ) call IO_Field_write_nc4( tpfile, tzfield, zfieldp2d, iresp_nc4 ) end if else - tzfield = tpfield if ( tzfield%ndimlist(1) /= NMNHDIM_UNKNOWN ) then tzfield%ndimlist(1:2) = NMNHDIM_ONE end if @@ -1650,8 +1646,8 @@ end subroutine IO_Ndimlist_reduce endif ! ELSE IF (LPACK .AND. L2D .AND. YDIR=='XY') THEN ELSEIF (LPACK .AND. L2D .AND. SIZE(PFIELD,2)==IHEXTOT) THEN + Allocate( tzfield, source = tpfield ) if ( tpfile%ldimreduced ) then - tzfield = tpfield tzfield%ndims = tzfield%ndims - 1 if ( tzfield%ndimlist(1) /= NMNHDIM_UNKNOWN ) then tzfield%ndimlist(2) = tzfield%ndimlist(3) @@ -1671,7 +1667,6 @@ end subroutine IO_Ndimlist_reduce if ( gnc4 ) call IO_Field_write_nc4( tpfile, tzfield, zfieldp3d, iresp_nc4 ) end if else - tzfield = tpfield if ( tzfield%ndimlist(2) /= NMNHDIM_UNKNOWN ) tzfield%ndimlist(2) = NMNHDIM_ONE zfieldp => pfield(:, jphext + 1 : jphext + 1, :, :) if ( Present( koffset ) ) then @@ -1777,7 +1772,7 @@ end subroutine IO_Ndimlist_reduce !* 0.1 Declarations of arguments ! TYPE(TFILEDATA), INTENT(IN) :: TPFILE - TYPE(TFIELDDATA), INTENT(IN) :: TPFIELD + CLASS(TFIELDMETADATA), INTENT(IN) :: TPFIELD REAL,DIMENSION(:,:,:,:,:),TARGET,INTENT(IN) :: PFIELD ! array containing the data field INTEGER,OPTIONAL, INTENT(OUT):: KRESP ! return-code ! @@ -1797,7 +1792,7 @@ end subroutine IO_Ndimlist_reduce INTEGER :: IHEXTOT CHARACTER(LEN=:),ALLOCATABLE :: YMSG CHARACTER(LEN=6) :: YRESP - type(tfielddata) :: tzfield + class(tfieldmetadata), allocatable :: tzfield ! YFILEM = TPFILE%CNAME YRECFM = TPFIELD%CMNHNAME @@ -1822,8 +1817,8 @@ end subroutine IO_Ndimlist_reduce IF (GSMONOPROC) THEN ! sequential execution ! IF (LPACK .AND. L1D .AND. YDIR=='XY') THEN IF (LPACK .AND. L1D .AND. SIZE(PFIELD,1)==IHEXTOT .AND. SIZE(PFIELD,2)==IHEXTOT) THEN + Allocate( tzfield, source = tpfield ) if ( tpfile%ldimreduced ) then - tzfield = tpfield tzfield%ndims = tzfield%ndims - 2 if ( tzfield%ndimlist(1) /= NMNHDIM_UNKNOWN ) then tzfield%ndimlist(1) = tzfield%ndimlist(3) @@ -1836,7 +1831,6 @@ end subroutine IO_Ndimlist_reduce if ( glfi ) call IO_Field_write_lfi( tpfile, tzfield, zfieldp3d, iresp_lfi ) if ( gnc4 ) call IO_Field_write_nc4( tpfile, tzfield, zfieldp3d, iresp_nc4 ) else - tzfield = tpfield if ( tzfield%ndimlist(1) /= NMNHDIM_UNKNOWN ) then tzfield%ndimlist(1:2) = NMNHDIM_ONE end if @@ -1846,8 +1840,8 @@ end subroutine IO_Ndimlist_reduce endif ! ELSE IF (LPACK .AND. L2D .AND. YDIR=='XY') THEN ELSEIF (LPACK .AND. L2D .AND. SIZE(PFIELD,2)==IHEXTOT) THEN + Allocate( tzfield, source = tpfield ) if ( tpfile%ldimreduced ) then - tzfield = tpfield tzfield%ndims = tzfield%ndims - 1 if ( tzfield%ndimlist(1) /= NMNHDIM_UNKNOWN ) then tzfield%ndimlist(2) = tzfield%ndimlist(3) @@ -1860,7 +1854,6 @@ end subroutine IO_Ndimlist_reduce if ( glfi ) call IO_Field_write_lfi( tpfile, tzfield, zfieldp4d, iresp_lfi ) if ( gnc4 ) call IO_Field_write_nc4( tpfile, tzfield, zfieldp4d, iresp_nc4 ) else - tzfield = tpfield if ( tzfield%ndimlist(2) /= NMNHDIM_UNKNOWN ) tzfield%ndimlist(2) = NMNHDIM_ONE zfieldp => pfield(:, jphext + 1 : jphext + 1, :, :, :) if ( glfi ) call IO_Field_write_lfi( tpfile, tzfield, zfieldp, iresp_lfi ) @@ -1950,7 +1943,7 @@ end subroutine IO_Ndimlist_reduce !* 0.1 Declarations of arguments ! TYPE(TFILEDATA), INTENT(IN) :: TPFILE - TYPE(TFIELDDATA), INTENT(IN) :: TPFIELD + CLASS(TFIELDMETADATA), INTENT(IN) :: TPFIELD REAL,DIMENSION(:,:,:,:,:,:),TARGET,INTENT(IN) :: PFIELD ! array containing the data field INTEGER,OPTIONAL, INTENT(OUT):: KRESP ! return-code ! @@ -2061,7 +2054,7 @@ end subroutine IO_Ndimlist_reduce !* 0.1 Declarations of arguments ! TYPE(TFILEDATA), INTENT(IN) :: TPFILE - TYPE(TFIELDDATA), INTENT(IN) :: TPFIELD + CLASS(TFIELDMETADATA), INTENT(IN) :: TPFIELD INTEGER, INTENT(IN) :: KFIELD ! array containing the data field INTEGER,OPTIONAL, INTENT(OUT):: KRESP ! return-code ! @@ -2153,7 +2146,7 @@ end subroutine IO_Ndimlist_reduce !* 0.1 Declarations of arguments ! TYPE(TFILEDATA), INTENT(IN) :: TPFILE - TYPE(TFIELDDATA), INTENT(IN) :: TPFIELD + CLASS(TFIELDMETADATA), INTENT(IN) :: TPFIELD INTEGER,DIMENSION(:),TARGET, INTENT(IN) :: KFIELD ! array containing the data field INTEGER,OPTIONAL, INTENT(OUT):: KRESP ! return-code ! @@ -2265,7 +2258,7 @@ end subroutine IO_Ndimlist_reduce !* 0.1 Declarations of arguments ! TYPE(TFILEDATA), INTENT(IN) :: TPFILE - TYPE(TFIELDDATA), INTENT(IN) :: TPFIELD + CLASS(TFIELDMETADATA), INTENT(IN) :: TPFIELD INTEGER,DIMENSION(:,:),TARGET,INTENT(IN) :: KFIELD ! array containing the data field INTEGER,OPTIONAL, INTENT(OUT):: KRESP ! return-code ! @@ -2288,7 +2281,7 @@ end subroutine IO_Ndimlist_reduce INTEGER :: IHEXTOT CHARACTER(LEN=:),ALLOCATABLE :: YMSG CHARACTER(LEN=6) :: YRESP - type(tfielddata) :: tzfield + class(tfieldmetadata), allocatable :: tzfield ! YFILEM = TPFILE%CNAME YRECFM = TPFIELD%CMNHNAME @@ -2314,8 +2307,8 @@ end subroutine IO_Ndimlist_reduce IF (IRESP==0) THEN IF (GSMONOPROC) THEN ! sequential execution IF (LPACK .AND. L1D .AND. SIZE(KFIELD,1)==IHEXTOT .AND. SIZE(KFIELD,2)==IHEXTOT) THEN + Allocate( tzfield, source = tpfield ) if ( tpfile%ldimreduced ) then - tzfield = tpfield tzfield%ndims = tzfield%ndims - 2 if ( tzfield%ndimlist(1) /= NMNHDIM_UNKNOWN ) then tzfield%ndimlist(1) = tzfield%ndimlist(3) !Necessary if time dimension @@ -2325,7 +2318,6 @@ end subroutine IO_Ndimlist_reduce if ( glfi ) call IO_Field_write_lfi( tpfile, tzfield, ifieldp0d, iresp_lfi ) if ( gnc4 ) call IO_Field_write_nc4( tpfile, tzfield, ifieldp0d, iresp_nc4 ) else - tzfield = tpfield if ( tzfield%ndimlist(1) /= NMNHDIM_UNKNOWN ) then tzfield%ndimlist(1:2) = NMNHDIM_ONE end if @@ -2335,8 +2327,8 @@ end subroutine IO_Ndimlist_reduce endif ! ELSE IF (LPACK .AND. L2D .AND. YDIR=='XY') THEN ELSEIF (LPACK .AND. L2D .AND. SIZE(KFIELD,2)==IHEXTOT) THEN + Allocate( tzfield, source = tpfield ) if ( tpfile%ldimreduced ) then - tzfield = tpfield tzfield%ndims = tzfield%ndims - 1 if ( tzfield%ndimlist(1) /= NMNHDIM_UNKNOWN ) then tzfield%ndimlist(2) = tzfield%ndimlist(3) !Necessary if time dimension @@ -2346,7 +2338,6 @@ end subroutine IO_Ndimlist_reduce if ( glfi ) call IO_Field_write_lfi( tpfile, tzfield, ifieldp1d, iresp_lfi ) if ( gnc4 ) call IO_Field_write_nc4( tpfile, tzfield, ifieldp1d, iresp_nc4 ) else - tzfield = tpfield if ( tzfield%ndimlist(1) /= NMNHDIM_UNKNOWN ) then tzfield%ndimlist(2) = NMNHDIM_ONE end if @@ -2446,7 +2437,7 @@ end subroutine IO_Ndimlist_reduce !* 0.1 Declarations of arguments ! TYPE(TFILEDATA), INTENT(IN) :: TPFILE - TYPE(TFIELDDATA), INTENT(IN) :: TPFIELD + CLASS(TFIELDMETADATA), INTENT(IN) :: TPFIELD INTEGER,DIMENSION(:,:,:),TARGET,INTENT(IN) :: KFIELD ! array containing the data field INTEGER,OPTIONAL, INTENT(OUT):: KRESP ! return-code ! @@ -2468,7 +2459,7 @@ end subroutine IO_Ndimlist_reduce INTEGER :: IHEXTOT CHARACTER(LEN=:),ALLOCATABLE :: YMSG CHARACTER(LEN=6) :: YRESP - type(tfielddata) :: tzfield + class(tfieldmetadata), allocatable :: tzfield ! YFILEM = TPFILE%CNAME YRECFM = TPFIELD%CMNHNAME @@ -2494,8 +2485,8 @@ end subroutine IO_Ndimlist_reduce IF (IRESP==0) THEN IF (GSMONOPROC) THEN ! sequential execution IF (LPACK .AND. L1D .AND. SIZE(KFIELD,1)==IHEXTOT .AND. SIZE(KFIELD,2)==IHEXTOT) THEN + Allocate( tzfield, source = tpfield ) if ( tpfile%ldimreduced ) then - tzfield = tpfield tzfield%ndims = tzfield%ndims - 2 if ( tzfield%ndimlist(1) /= NMNHDIM_UNKNOWN ) then tzfield%ndimlist(1) = tzfield%ndimlist(3) @@ -2506,7 +2497,6 @@ end subroutine IO_Ndimlist_reduce if ( glfi ) call IO_Field_write_lfi( tpfile, tzfield, ifieldp1d, iresp_lfi ) if ( gnc4 ) call IO_Field_write_nc4( tpfile, tzfield, ifieldp1d, iresp_nc4 ) else - tzfield = tpfield if ( tzfield%ndimlist(1) /= NMNHDIM_UNKNOWN ) then tzfield%ndimlist(1:2) = NMNHDIM_ONE end if @@ -2516,8 +2506,8 @@ end subroutine IO_Ndimlist_reduce endif ! ELSE IF (LPACK .AND. L2D .AND. YDIR=='XY') THEN ELSEIF (LPACK .AND. L2D .AND. SIZE(KFIELD,2)==IHEXTOT) THEN + Allocate( tzfield, source = tpfield ) if ( tpfile%ldimreduced ) then - tzfield = tpfield tzfield%ndims = tzfield%ndims - 1 if ( tzfield%ndimlist(1) /= NMNHDIM_UNKNOWN ) then tzfield%ndimlist(2) = tzfield%ndimlist(3) @@ -2528,7 +2518,6 @@ end subroutine IO_Ndimlist_reduce if ( glfi ) call IO_Field_write_lfi( tpfile, tzfield, ifieldp2d, iresp_lfi ) if ( gnc4 ) call IO_Field_write_nc4( tpfile, tzfield, ifieldp2d, iresp_nc4 ) else - tzfield = tpfield if ( tzfield%ndimlist(2) /= NMNHDIM_UNKNOWN ) tzfield%ndimlist(2) = NMNHDIM_ONE ifieldp => kfield(:, jphext + 1 : jphext + 1, :) if ( glfi ) call IO_Field_write_lfi( tpfile, tzfield, ifieldp, iresp_lfi ) @@ -2624,7 +2613,7 @@ end subroutine IO_Ndimlist_reduce !* 0.1 Declarations of arguments ! TYPE(TFILEDATA), INTENT(IN) :: TPFILE - TYPE(TFIELDDATA), INTENT(IN) :: TPFIELD + CLASS(TFIELDMETADATA), INTENT(IN) :: TPFIELD INTEGER,DIMENSION(:,:,:,:),TARGET, INTENT(IN) :: KFIELD ! array containing the data field INTEGER, OPTIONAL, INTENT(OUT) :: KRESP ! return-code integer, dimension(4), optional, intent(in) :: koffset @@ -2647,7 +2636,7 @@ end subroutine IO_Ndimlist_reduce INTEGER :: IHEXTOT CHARACTER(LEN=:),ALLOCATABLE :: YMSG CHARACTER(LEN=6) :: YRESP - type(tfielddata) :: tzfield + class(tfieldmetadata), allocatable :: tzfield ! YFILEM = TPFILE%CNAME YRECFM = TPFIELD%CMNHNAME @@ -2677,8 +2666,8 @@ end subroutine IO_Ndimlist_reduce IF (GSMONOPROC) THEN ! sequential execution ! IF (LPACK .AND. L1D .AND. YDIR=='XY') THEN IF (LPACK .AND. L1D .AND. SIZE(KFIELD,1)==IHEXTOT .AND. SIZE(KFIELD,2)==IHEXTOT) THEN + Allocate( tzfield, source = tpfield ) if ( tpfile%ldimreduced ) then - tzfield = tpfield tzfield%ndims = tzfield%ndims - 2 if ( tzfield%ndimlist(1) /= NMNHDIM_UNKNOWN ) then tzfield%ndimlist(1) = tzfield%ndimlist(3) @@ -2697,7 +2686,6 @@ end subroutine IO_Ndimlist_reduce if ( gnc4 ) call IO_Field_write_nc4( tpfile, tzfield, ifieldp2d, iresp_nc4 ) end if else - tzfield = tpfield if ( tzfield%ndimlist(1) /= NMNHDIM_UNKNOWN ) then tzfield%ndimlist(1:2) = NMNHDIM_ONE end if @@ -2712,8 +2700,8 @@ end subroutine IO_Ndimlist_reduce endif ! ELSE IF (LPACK .AND. L2D .AND. YDIR=='XY') THEN ELSEIF (LPACK .AND. L2D .AND. SIZE(KFIELD,2)==IHEXTOT) THEN + Allocate( tzfield, source = tpfield ) if ( tpfile%ldimreduced ) then - tzfield = tpfield tzfield%ndims = tzfield%ndims - 1 if ( tzfield%ndimlist(1) /= NMNHDIM_UNKNOWN ) then tzfield%ndimlist(2) = tzfield%ndimlist(3) @@ -2733,7 +2721,6 @@ end subroutine IO_Ndimlist_reduce if ( gnc4 ) call IO_Field_write_nc4( tpfile, tzfield, ifieldp3d, iresp_nc4 ) end if else - tzfield = tpfield if ( tzfield%ndimlist(2) /= NMNHDIM_UNKNOWN ) tzfield%ndimlist(2) = NMNHDIM_ONE ifieldp => kfield(:, jphext + 1 : jphext + 1, :, :) if ( Present( koffset ) ) then @@ -2833,7 +2820,7 @@ end subroutine IO_Ndimlist_reduce !* 0.1 Declarations of arguments ! TYPE(TFILEDATA), INTENT(IN) :: TPFILE - TYPE(TFIELDDATA), INTENT(IN) :: TPFIELD + CLASS(TFIELDMETADATA), INTENT(IN) :: TPFIELD LOGICAL, INTENT(IN) :: OFIELD ! array containing the data field INTEGER,OPTIONAL, INTENT(OUT):: KRESP ! return-code ! @@ -2925,7 +2912,7 @@ end subroutine IO_Ndimlist_reduce !* 0.1 Declarations of arguments ! TYPE(TFILEDATA), INTENT(IN) :: TPFILE - TYPE(TFIELDDATA), INTENT(IN) :: TPFIELD + CLASS(TFIELDMETADATA), INTENT(IN) :: TPFIELD LOGICAL,DIMENSION(:),TARGET, INTENT(IN) :: OFIELD ! array containing the data field INTEGER,OPTIONAL, INTENT(OUT):: KRESP ! return-code ! @@ -3032,7 +3019,7 @@ end subroutine IO_Ndimlist_reduce !* 0.1 Declarations of arguments ! TYPE(TFILEDATA), INTENT(IN) :: TPFILE - TYPE(TFIELDDATA), INTENT(IN) :: TPFIELD + CLASS(TFIELDMETADATA), INTENT(IN) :: TPFIELD CHARACTER(LEN=*), INTENT(IN) :: HFIELD ! array containing the data field INTEGER,OPTIONAL, INTENT(OUT):: KRESP ! return-code ! @@ -3112,7 +3099,7 @@ end subroutine IO_Ndimlist_reduce !* 0.1 Declarations of arguments ! TYPE(TFILEDATA), INTENT(IN) :: TPFILE - TYPE(TFIELDDATA), INTENT(IN) :: TPFIELD + CLASS(TFIELDMETADATA), INTENT(IN) :: TPFIELD CHARACTER(LEN=*),DIMENSION(:),INTENT(IN) :: HFIELD ! array containing the data field INTEGER,OPTIONAL, INTENT(OUT):: KRESP ! return-code ! @@ -3216,7 +3203,7 @@ end subroutine IO_Ndimlist_reduce !* 0.1 Declarations of arguments ! TYPE(TFILEDATA), INTENT(IN) :: TPFILE - TYPE(TFIELDDATA), INTENT(IN) :: TPFIELD + CLASS(TFIELDMETADATA), INTENT(IN) :: TPFIELD TYPE (DATE_TIME), INTENT(IN) :: TFIELD ! array containing the data field INTEGER,OPTIONAL, INTENT(OUT):: KRESP ! return-code ! @@ -3293,7 +3280,7 @@ end subroutine IO_Ndimlist_reduce !* 0.1 Declarations of arguments ! TYPE(TFILEDATA), INTENT(IN) :: TPFILE - TYPE(TFIELDDATA), INTENT(IN) :: TPFIELD + CLASS(TFIELDMETADATA), INTENT(IN) :: TPFIELD TYPE (DATE_TIME),DIMENSION(:), INTENT(IN) :: TFIELD ! array containing the data field INTEGER,OPTIONAL, INTENT(OUT):: KRESP ! return-code ! @@ -3373,7 +3360,7 @@ end subroutine IO_Ndimlist_reduce !* 0.1 Declarations of arguments ! TYPE(TFILEDATA), INTENT(IN) :: TPFILE - TYPE(TFIELDDATA), INTENT(INOUT) :: TPFIELD + CLASS(TFIELDMETADATA), INTENT(INOUT) :: TPFIELD INTEGER, INTENT(IN) :: KL3D ! size of the LB array in FM REAL,DIMENSION(:,:,:),TARGET,INTENT(IN) :: PLB ! array containing the LB field INTEGER,OPTIONAL, INTENT(OUT) :: KRESP ! return-code @@ -3402,7 +3389,7 @@ end subroutine IO_Ndimlist_reduce TYPE(TX_3DP),ALLOCATABLE,DIMENSION(:) :: T_TX3DP CHARACTER(LEN=:),ALLOCATABLE :: YMSG CHARACTER(LEN=6) :: YRESP - type(tfielddata) :: tzfield + class(tfieldmetadata), allocatable :: tzfield ! YFILEM = TPFILE%CNAME YRECFM = TPFIELD%CMNHNAME @@ -3437,8 +3424,8 @@ end subroutine IO_Ndimlist_reduce IF (IRESP==0) THEN IF (GSMONOPROC) THEN ! sequential execution IF (LPACK .AND. L2D) THEN + Allocate( tzfield, source = tpfield ) if ( tpfile%ldimreduced ) then - tzfield = tpfield tzfield%ndims = tzfield%ndims - 1 if ( tzfield%ndimlist(1) /= NMNHDIM_UNKNOWN ) then tzfield%ndimlist(2) = tzfield%ndimlist(3) @@ -3449,7 +3436,6 @@ end subroutine IO_Ndimlist_reduce if ( glfi ) call IO_Field_write_lfi( tpfile, tzfield, ztx2dp, iresp_lfi ) if ( gnc4 ) call IO_Field_write_nc4( tpfile, tzfield, ztx2dp, iresp_nc4 ) else - tzfield = tpfield if ( tzfield%ndimlist(2) /= NMNHDIM_UNKNOWN ) tzfield%ndimlist(2) = NMNHDIM_ONE tx3dp => plb(:, jphext + 1 : jphext + 1, :) if ( glfi ) call IO_Field_write_lfi( tpfile, tzfield, tx3dp, iresp_lfi ) @@ -3533,7 +3519,7 @@ end subroutine IO_Ndimlist_reduce !* 0.1 Declarations of arguments ! TYPE(TFILEDATA), INTENT(IN) :: TPFILE - TYPE(TFIELDDATA), INTENT(IN) :: TPFIELD + CLASS(TFIELDMETADATA), INTENT(IN) :: TPFIELD CHARACTER(LEN=*), INTENT(IN) :: HBUDGET ! 'BUDGET' (budget) or 'OTHER' (MesoNH field) REAL, DIMENSION(:,:), TARGET, INTENT(IN) :: PFIELD ! array containing the data field INTEGER, INTENT(IN) :: KXOBOX ! @@ -3627,7 +3613,7 @@ end subroutine IO_Ndimlist_reduce !* 0.1 Declarations of arguments ! TYPE(TFILEDATA), INTENT(IN) :: TPFILE - TYPE(TFIELDDATA), INTENT(IN) :: TPFIELD + CLASS(TFIELDMETADATA), INTENT(IN) :: TPFIELD CHARACTER(LEN=*), INTENT(IN) :: HBUDGET ! 'BUDGET' (budget) or 'OTHER' (MesoNH field) REAL, DIMENSION(:,:,:), TARGET, INTENT(IN) :: PFIELD ! array containing the data field INTEGER, INTENT(IN) :: KXOBOX ! @@ -3721,7 +3707,7 @@ end subroutine IO_Ndimlist_reduce !* 0.1 Declarations of arguments ! TYPE(TFILEDATA), INTENT(IN) :: TPFILE - TYPE(TFIELDDATA), INTENT(IN) :: TPFIELD + CLASS(TFIELDMETADATA), INTENT(IN) :: TPFIELD CHARACTER(LEN=*), INTENT(IN) :: HBUDGET ! 'BUDGET' (budget) or 'OTHER' (MesoNH field) REAL, DIMENSION(:,:,:,:), TARGET, INTENT(IN) :: PFIELD ! array containing the data field INTEGER, INTENT(IN) :: KXOBOX ! @@ -3815,7 +3801,7 @@ end subroutine IO_Ndimlist_reduce !* 0.1 Declarations of arguments ! TYPE(TFILEDATA), INTENT(IN) :: TPFILE - TYPE(TFIELDDATA), INTENT(IN) :: TPFIELD + CLASS(TFIELDMETADATA), INTENT(IN) :: TPFIELD CHARACTER(LEN=*), INTENT(IN) :: HBUDGET ! 'BUDGET' (budget) or 'OTHER' (MesoNH field) REAL,DIMENSION(:,:,:,:,:),TARGET,INTENT(IN) :: PFIELD ! array containing the data field INTEGER, INTENT(IN) :: KXOBOX ! @@ -4325,7 +4311,7 @@ IMPLICIT NONE ! TYPE(TOUTBAK), INTENT(IN) :: TPOUTPUT !Output structure ! -TYPE(TFIELDDATA) :: TZFIELD +TYPE(TFIELDMETADATA) :: TZFIELD ! #if 0 INTEGER :: IKB diff --git a/src/mesonh/ext/deallocate_model1.f90 b/src/mesonh/ext/deallocate_model1.f90 deleted file mode 100644 index 4a940c6d89977fc8eef400fc57aac4f123ba5138..0000000000000000000000000000000000000000 --- a/src/mesonh/ext/deallocate_model1.f90 +++ /dev/null @@ -1,703 +0,0 @@ -!MNH_LIC Copyright 1997-2021 CNRS, Meteo-France and Universite Paul Sabatier -!MNH_LIC This is part of the Meso-NH software governed by the CeCILL-C licence -!MNH_LIC version 1. See LICENSE, CeCILL-C_V1-en.txt and CeCILL-C_V1-fr.txt -!MNH_LIC for details. version 1. -!----------------------------------------------------------------- -!############################ -MODULE MODI_DEALLOCATE_MODEL1 -!############################ -! -INTERFACE -! -SUBROUTINE DEALLOCATE_MODEL1 (KCALL) -! -INTEGER, INTENT(IN) :: KCALL -! -END SUBROUTINE DEALLOCATE_MODEL1 -! -END INTERFACE -! -END MODULE MODI_DEALLOCATE_MODEL1 -! -! -! #################################### - SUBROUTINE DEALLOCATE_MODEL1 (KCALL) -! #################################### -! -!!**** *DEALLOCATE_MODEL1* - deallocate all model1 fields -!! -!! PURPOSE -!! ------- -! deallocate all model #1 fields in order to spare memory in spawning -! -!!** METHOD -!! ------ -!! -!! KCALL = 1 --> deallocates all SOURCES, LES, FORCING and SOLVER variables -!! -!! KCALL = 2 --> deallocates all METRIC, RADIATION and CORIOLIS variables -!! -!! KCALL = 3 --> deallocates all other variables of model1 -!! -!! KCALL = 4 --> deallocates all variables common to ALL models -!! -!! 1 + 2 --> all variables used in spawning -!! 1 + 2 + 3 + 4 --> in diag after a file has been treated -!! -!! EXTERNAL -!! -------- -!! -!! REFERENCE -!! --------- -!! -!! -!! AUTHOR -!! ------ -!! V. Masson * Meteo France * -!! -!! MODIFICATIONS -!! ------------- -!! Original 08/12/97 -!! -!! 20/05/98 use the LB fields -!! 15/03/99 new PGD fields -!! 08/03/01 D.Gazen add chemical emission field -!! 01/2004 V. Masson surface externalization -!! 06/2012 M.Tomasini add 2D nesting ADVFRC -!! 10/2016 M.Mazoyer New KHKO output fields -! P. Wautelet 05/2016-04/2018: new data structures and calls for I/O -! C. Lac 02/2019: add rain fraction as an output field -! P. Wautelet 07/06/2019: bugfix: deallocate XLSRVM only if allocated -! S. Riette 04/2020: XHL* fields -! A. Costes 12:2021: Blaze Fire model variables -!------------------------------------------------------------------------------- -! -!* 0. DECLARATIONS -! ------------ -USE MODD_REF -! -USE MODD_METRICS_n -USE MODD_FIELD_n -USE MODD_DUMMY_GR_FIELD_n -USE MODD_LSFIELD_n -USE MODD_GRID_n -USE MODD_REF_n -USE MODD_CURVCOR_n -USE MODD_DYN_n -USE MODD_DEEP_CONVECTION_n -USE MODD_RADIATIONS_n -USE MODD_FRC -USE MODD_PRECIP_n -USE MODD_ELEC_n -USE MODD_PASPOL_n -USE MODD_RAIN_ICE_PARAM -USE MODD_RAIN_ICE_DESCR -USE MODD_PARAM_n , ONLY : CCLOUD -USE MODE_MODELN_HANDLER -! -! Modif 2D -USE MODD_LATZ_EDFLX ! For ADVFRC and EDDY FLUXES -USE MODD_DEF_EDDY_FLUX_n ! For EDDY FLUXES -USE MODD_DEF_EDDYUV_FLUX_n ! For EDDY FLUXES -! -USE MODD_2D_FRC -USE MODD_ADVFRC_n ! For ADVFRC and EDDY FLUXES -USE MODD_RELFRC_n -USE MODD_ADV_n -USE MODD_PAST_FIELD_n -USE MODD_TURB_n -USE MODD_PARAM_C2R2, ONLY :LSUPSAT -! -IMPLICIT NONE -! -!* 0.1 declarations of arguments -! -INTEGER, INTENT(IN) :: KCALL ! number of times this routine has been called -INTEGER :: IMI ! Current Model index -! -!* 0.2 declarations of local variables -! -!------------------------------------------------------------------------------- -! -! Save current Model index and switch to model 1 variables -IMI = GET_CURRENT_MODEL_INDEX() -CALL GOTO_MODEL(1) -!* 1. Module MODD_FIELD$n -! -IF ( KCALL==3 ) THEN - IF (CUVW_ADV_SCHEME(1:3)=='CEN'.AND. CTEMP_SCHEME=='LEFR') THEN - DEALLOCATE(XUM) - DEALLOCATE(XVM) - DEALLOCATE(XWM) - DEALLOCATE(XDUM) - DEALLOCATE(XDVM) - DEALLOCATE(XDWM) - END IF - DEALLOCATE(XUT) - DEALLOCATE(XVT) - DEALLOCATE(XWT) - DEALLOCATE(XTHT) - IF (L2D_ADV_FRC) THEN - IF (ASSOCIATED(XDTHFRC)) DEALLOCATE(XDTHFRC) - IF (ASSOCIATED(XDRVFRC)) DEALLOCATE(XDRVFRC) - IF (ASSOCIATED(TDTADVFRC)) DEALLOCATE(TDTADVFRC) - END IF - IF (L2D_REL_FRC) THEN - IF (ASSOCIATED(XTHREL)) DEALLOCATE(XTHREL) - IF (ASSOCIATED(XRVREL)) DEALLOCATE(XRVREL) - IF (ASSOCIATED(TDTRELFRC)) DEALLOCATE(TDTRELFRC) - END IF - ! DEALLOCATE EDDY FLUXES - IF (LTH_FLX) THEN - DEALLOCATE(XVTH_FLUX_M) - DEALLOCATE(XWTH_FLUX_M) - END IF - IF (LUV_FLX) THEN - DEALLOCATE(XVU_FLUX_M) - END IF -END IF -IF ( KCALL==1 ) THEN - DEALLOCATE(XRUS) - DEALLOCATE(XRVS) - DEALLOCATE(XRWS) - DEALLOCATE(XRTHS) - DEALLOCATE(XRUS_PRES, XRVS_PRES, XRWS_PRES ) - DEALLOCATE(XRTHS_CLD ) -END IF -! -IF ( KCALL==3 ) THEN - IF (ASSOCIATED(XTKET)) DEALLOCATE(XTKET) -END IF -IF ( ASSOCIATED(XRTKES) .AND. KCALL==1 ) THEN - DEALLOCATE(XRTKES) -END IF -! -IF ( KCALL==3 ) THEN - DEALLOCATE(XPABST) -! - DEALLOCATE(XRT) -END IF -! -IF ( KCALL==1 ) THEN - DEALLOCATE(XRRS) - DEALLOCATE(XRRS_CLD) -END IF -! -IF ( ASSOCIATED(XSRCT) .AND. KCALL==3 ) THEN - DEALLOCATE(XSRCT) - DEALLOCATE(XSIGS) -END IF -! -IF ( ASSOCIATED(XHLC_HRC) .AND. KCALL==3 ) THEN - DEALLOCATE(XHLC_HRC) - DEALLOCATE(XHLC_HCF) - DEALLOCATE(XHLI_HRI) - DEALLOCATE(XHLI_HCF) -END IF -! -IF ( ASSOCIATED(XCLDFR) .AND. KCALL==2 ) THEN - DEALLOCATE(XCLDFR) -END IF -! -IF ( ASSOCIATED(XICEFR) .AND. KCALL==2 ) THEN - DEALLOCATE(XICEFR) -END IF -! -IF ( ASSOCIATED(XRAINFR) .AND. KCALL==2 ) THEN - DEALLOCATE(XRAINFR) -END IF -! -IF ( KCALL == 3 ) THEN - DEALLOCATE(XSVT) -END IF -IF ( KCALL == 1 ) THEN - DEALLOCATE(XRSVS) - DEALLOCATE(XRSVS_CLD) -END IF -! -IF ((CCLOUD == 'KHKO') .AND. LSUPSAT) THEN - DEALLOCATE(XSUPSAT) - DEALLOCATE(XNACT) - DEALLOCATE(XNPRO) - DEALLOCATE(XSSPRO) -END IF -! -IF (ASSOCIATED(XDUMMY_GR_FIELDS) .AND. KCALL==3 ) THEN - DEALLOCATE(XDUMMY_GR_FIELDS) -END IF - -IF (ASSOCIATED(XLSPHI)) THEN - DEALLOCATE(XLSPHI) -END IF - -IF (ASSOCIATED(XBMAP)) THEN - DEALLOCATE(XBMAP) -END IF - -IF (ASSOCIATED(XFMRFA)) THEN - DEALLOCATE(XFMRFA) -END IF - -IF (ASSOCIATED(XFMWF0)) THEN - DEALLOCATE(XFMWF0) -END IF - -IF (ASSOCIATED(XFMR0)) THEN - DEALLOCATE(XFMR0) -END IF - -IF (ASSOCIATED(XFMR00)) THEN - DEALLOCATE(XFMR00) -END IF - -IF (ASSOCIATED(XFMIGNITION)) THEN - DEALLOCATE(XFMIGNITION) -END IF - -IF (ASSOCIATED(XFMFUELTYPE)) THEN - DEALLOCATE(XFMFUELTYPE) -END IF - -IF (ASSOCIATED(XFIRETAU)) THEN - DEALLOCATE(XFIRETAU) -END IF - -IF (ASSOCIATED(XFLUXPARAMH)) THEN - DEALLOCATE(XFLUXPARAMH) -END IF - -IF (ASSOCIATED(XFLUXPARAMW)) THEN - DEALLOCATE(XFLUXPARAMW) -END IF - -IF (ASSOCIATED(XFIRERW)) THEN - DEALLOCATE(XFIRERW) -END IF - -IF (ASSOCIATED(XFMASE)) THEN - DEALLOCATE(XFMASE) -END IF - -IF (ASSOCIATED(XFMAWC)) THEN - DEALLOCATE(XFMAWC) -END IF - -IF (ASSOCIATED(XFMWALKIG)) THEN - DEALLOCATE(XFMWALKIG) -END IF - -IF (ASSOCIATED(XFMFLUXHDH)) THEN - DEALLOCATE(XFMFLUXHDH) -END IF - -IF (ASSOCIATED(XFMFLUXHDW)) THEN - DEALLOCATE(XFMFLUXHDW) -END IF - -IF (ASSOCIATED(XFMHWS)) THEN - DEALLOCATE(XFMHWS) -END IF - -IF (ASSOCIATED(XFMWINDU)) THEN - DEALLOCATE(XFMWINDU) -END IF - -IF (ASSOCIATED(XFMWINDV)) THEN - DEALLOCATE(XFMWINDV) -END IF - -IF (ASSOCIATED(XFMWINDW)) THEN - DEALLOCATE(XFMWINDW) -END IF - -IF (ASSOCIATED(XFMGRADOROX)) THEN - DEALLOCATE(XFMGRADOROX) -END IF - -IF (ASSOCIATED(XFMGRADOROY)) THEN - DEALLOCATE(XFMGRADOROY) -END IF - -IF (ASSOCIATED(XGRADLSPHIX)) THEN - DEALLOCATE(XGRADLSPHIX) -END IF - -IF (ASSOCIATED(XGRADLSPHIY)) THEN - DEALLOCATE(XGRADLSPHIY) -END IF - -IF (ASSOCIATED(XFIREWIND)) THEN - DEALLOCATE(XFIREWIND) -END IF - -IF (ASSOCIATED(XLSPHI2D)) THEN - DEALLOCATE(XLSPHI2D) -END IF - -IF (ASSOCIATED(XGRADLSPHIX2D)) THEN - DEALLOCATE(XGRADLSPHIX2D) -END IF - -IF (ASSOCIATED(XGRADLSPHIY2D)) THEN - DEALLOCATE(XGRADLSPHIY2D) -END IF - -IF (ASSOCIATED(XGRADMASKX)) THEN - DEALLOCATE(XGRADMASKX) -END IF - -IF (ASSOCIATED(XGRADMASKY)) THEN - DEALLOCATE(XGRADMASKY) -END IF - -IF (ASSOCIATED(XSURFRATIO2D)) THEN - DEALLOCATE(XSURFRATIO2D) -END IF - -IF (ASSOCIATED(XLSDIFFUX2D)) THEN - DEALLOCATE(XLSDIFFUX2D) -END IF - -IF (ASSOCIATED(XLSDIFFUY2D)) THEN - DEALLOCATE(XLSDIFFUY2D) -END IF - -IF (ASSOCIATED(XFIRERW2D)) THEN - DEALLOCATE(XFIRERW2D) -END IF -! -!* 3. Module MODD_GRID$n -! -IF ( ASSOCIATED(XLON) .AND. KCALL == 3 ) THEN - DEALLOCATE(XLON) - DEALLOCATE(XLAT) - DEALLOCATE(XMAP) -END IF -! -IF ( KCALL == 3 ) THEN - !Philippe W.: do not deallocate XXHAT, XYHAT and XZHAT because they are needed later on - !As they are 1D, their memory footprint is negligible - ! DEALLOCATE(XXHAT) - DEALLOCATE(XDXHAT) - ! DEALLOCATE(XYHAT) - DEALLOCATE(XDYHAT) - DEALLOCATE(XZS) - DEALLOCATE(XZSMT) - DEALLOCATE(XZZ) - ! DEALLOCATE(XZHAT) -END IF -! -IF ( KCALL == 2 ) THEN - DEALLOCATE(XDIRCOSZW) - DEALLOCATE(XDIRCOSXW) - DEALLOCATE(XDIRCOSYW) - DEALLOCATE(XCOSSLOPE) - DEALLOCATE(XSINSLOPE) -END IF - -IF ( KCALL == 2 ) THEN - DEALLOCATE(XDXX) - DEALLOCATE(XDYY) - DEALLOCATE(XDZX) - DEALLOCATE(XDZY) - DEALLOCATE(XDZZ) -END IF -! -!* 4. Modules MODD_REF and MODD_REF$n -! -IF ( KCALL == 4 ) THEN - DEALLOCATE(XRHODREFZ) - DEALLOCATE(XTHVREFZ) -END IF -! -IF ( KCALL == 3 ) THEN - DEALLOCATE(XRHODREF) - DEALLOCATE(XTHVREF) - DEALLOCATE(XEXNREF) - DEALLOCATE(XRHODJ) - IF ( ASSOCIATED(XRVREF) ) THEN - DEALLOCATE(XRVREF) - END IF -END IF -! -!* 5. Module MODD_CURVCOR$n -! -IF ( ASSOCIATED(XCORIOX) .AND. KCALL == 2 ) THEN - DEALLOCATE(XCORIOX) - DEALLOCATE(XCORIOY) -END IF -IF ( KCALL == 2 ) THEN - DEALLOCATE(XCORIOZ) -END IF -IF ( ASSOCIATED(XCURVX) .AND. KCALL == 2) THEN - DEALLOCATE(XCURVX) - DEALLOCATE(XCURVY) -END IF -! -!* 6. Module MODD_DYN$n -! -IF ( KCALL == 1 ) THEN - DEALLOCATE(XBFY) - DEALLOCATE(XAF,XCF) - DEALLOCATE(XTRIGSX) - DEALLOCATE(XTRIGSY) - DEALLOCATE(XRHOM) - DEALLOCATE(XALK) - DEALLOCATE(XALKW) - DEALLOCATE(XALKBAS) - DEALLOCATE(XALKWBAS) - IF ( ASSOCIATED(XKURELAX) ) THEN - DEALLOCATE(XKURELAX) - DEALLOCATE(XKVRELAX) - DEALLOCATE(XKWRELAX) - DEALLOCATE(LMASK_RELAX) - END IF -END IF -! -!* 7. Larger Scale variables (Module MODD_LSFIELD$n) -! -IF ( KCALL == 3 ) THEN - DEALLOCATE(XLSUM) - DEALLOCATE(XLSVM) - DEALLOCATE(XLSWM) - DEALLOCATE(XLSTHM) - IF(ASSOCIATED(XLSRVM)) DEALLOCATE(XLSRVM) - IF (ASSOCIATED(XLBXUM)) THEN - DEALLOCATE(XLBXUM) - DEALLOCATE(XLBYUM) - DEALLOCATE(XLBXVM) - DEALLOCATE(XLBYVM) - DEALLOCATE(XLBXWM) - DEALLOCATE(XLBYWM) - DEALLOCATE(XLBXTHM) - DEALLOCATE(XLBYTHM) - END IF - IF (ASSOCIATED(XLBXTKEM)) THEN - DEALLOCATE(XLBXTKEM) - DEALLOCATE(XLBYTKEM) - END IF - IF (ASSOCIATED(XLBXRM)) THEN - DEALLOCATE(XLBXRM) - DEALLOCATE(XLBYRM) - END IF - IF (ASSOCIATED(XLBXSVM)) THEN - DEALLOCATE(XLBXSVM) - DEALLOCATE(XLBYSVM) - END IF -END IF -! - ! steady LS fields only for model 1 or independent models -! -IF( ASSOCIATED(XLSUS) .AND. KCALL == 3 ) THEN - DEALLOCATE(XLSUS) - DEALLOCATE(XLSVS) - DEALLOCATE(XLSWS) - DEALLOCATE(XLSTHS) - IF(ASSOCIATED(XLSRVS)) DEALLOCATE(XLSRVS) -! - IF ( ASSOCIATED(XLBXUS) ) THEN - DEALLOCATE(XLBXUS) - DEALLOCATE(XLBYUS) - DEALLOCATE(XLBXVS) - DEALLOCATE(XLBYVS) - DEALLOCATE(XLBXWS) - DEALLOCATE(XLBYWS) - DEALLOCATE(XLBXTHS) - DEALLOCATE(XLBYTHS) - END IF - IF ( ASSOCIATED(XLBXTKES) ) THEN - DEALLOCATE(XLBXTKES) - DEALLOCATE(XLBYTKES) - END IF -! - IF ( ASSOCIATED(XLBXRS) ) THEN - DEALLOCATE(XLBXRS) - DEALLOCATE(XLBYRS) - END IF -! - IF ( ASSOCIATED(XLBXSVS) ) THEN - DEALLOCATE(XLBXSVS) - DEALLOCATE(XLBYSVS) - END IF -! - IF ( ASSOCIATED(XCOEFLIN_LBXM) ) THEN - DEALLOCATE(XCOEFLIN_LBXM) - DEALLOCATE(NKLIN_LBXM) - END IF - - IF ( ASSOCIATED(XCOEFLIN_LBYM) ) THEN - DEALLOCATE(XCOEFLIN_LBYM) - DEALLOCATE(NKLIN_LBYM) - END IF - - IF ( ASSOCIATED(XCOEFLIN_LBXU) ) THEN - DEALLOCATE(XCOEFLIN_LBXU) - DEALLOCATE(NKLIN_LBXU) - DEALLOCATE(XCOEFLIN_LBYU) - DEALLOCATE(NKLIN_LBYU) - DEALLOCATE(XCOEFLIN_LBXV) - DEALLOCATE(NKLIN_LBXV) - DEALLOCATE(XCOEFLIN_LBYV) - DEALLOCATE(NKLIN_LBYV) - DEALLOCATE(XCOEFLIN_LBXW) - DEALLOCATE(NKLIN_LBXW) - DEALLOCATE(XCOEFLIN_LBYW) - DEALLOCATE(NKLIN_LBYW) - END IF -END IF -! -!* 8. L.E.S. variables -! - -! -!* 9. Module MODD_RADIATIONS$n -! -! -IF ( ASSOCIATED(XSLOPANG) .AND. KCALL == 2 ) THEN - DEALLOCATE(XSLOPANG) - DEALLOCATE(XSLOPAZI) - DEALLOCATE(XDTHRAD) - DEALLOCATE(XFLALWD) - DEALLOCATE(XDIRFLASWD) - DEALLOCATE(XSCAFLASWD) - DEALLOCATE(XDIRSRFSWD) - DEALLOCATE(XSWU) - DEALLOCATE(XSWD) - DEALLOCATE(XLWU) - DEALLOCATE(XLWD) - DEALLOCATE(XDTHRADSW) - DEALLOCATE(XDTHRADLW) - DEALLOCATE(XRADEFF) - DEALLOCATE(NCLEARCOL_TM1) -END IF -IF (ASSOCIATED(XSTATM)) DEALLOCATE(XSTATM) -! -!* 10. Module MODD_DEEP_CONVECTION$n -! -IF ( ASSOCIATED(XDTHCONV) .AND. KCALL == 2 ) THEN - DEALLOCATE(NCOUNTCONV) - DEALLOCATE(XDTHCONV) - DEALLOCATE(XDRVCONV) - DEALLOCATE(XDRCCONV) - DEALLOCATE(XDRICONV) -END IF -! -IF ( ASSOCIATED(XPRCONV) .AND. KCALL == 2 ) THEN - DEALLOCATE(XPRCONV) - DEALLOCATE(XPACCONV) -END IF -IF ( ASSOCIATED(XPRSCONV) .AND. KCALL == 2 ) THEN - DEALLOCATE(XPRSCONV) -END IF -! -IF ( ASSOCIATED(XDSVCONV) .AND. KCALL == 2 ) THEN - DEALLOCATE(XDSVCONV) -END IF -! -!* 11. Forcing variables (Module MODD_FRC) -! -IF ( ALLOCATED(XUFRC) .AND. KCALL == 4 ) THEN - DEALLOCATE(TDTFRC) - DEALLOCATE(XUFRC) - DEALLOCATE(XVFRC) - DEALLOCATE(XWFRC) - DEALLOCATE(XTHFRC) - DEALLOCATE(XRVFRC) - DEALLOCATE(XTENDTHFRC) - DEALLOCATE(XTENDRVFRC) - DEALLOCATE(XGXTHFRC) - DEALLOCATE(XGYTHFRC) - DEALLOCATE(XPGROUNDFRC) -END IF -! -!* 12. Module MODD_ICE_CONC$n -! -IF ( ASSOCIATED(XCIT) .AND. KCALL == 2 ) THEN - DEALLOCATE(XCIT) -END IF -! -!* 13. Module MODD_PRECIP$n -! -IF ( ASSOCIATED(XINPRC) .AND. KCALL == 3 ) THEN - DEALLOCATE(XINPRC) - DEALLOCATE(XACPRC) -END IF -! -IF ( ASSOCIATED(XINPRR) .AND. KCALL == 3 ) THEN - DEALLOCATE(XINPRR) - DEALLOCATE(XACPRR) -END IF -! -IF ( ASSOCIATED(XINPRR3D) .AND. KCALL == 3 ) THEN - DEALLOCATE(XINPRR3D) - DEALLOCATE(XEVAP3D) -END IF -! -IF ( ASSOCIATED(XINPRS) .AND. KCALL == 3 ) THEN - DEALLOCATE(XINPRS) - DEALLOCATE(XACPRS) - DEALLOCATE(XINPRG) - DEALLOCATE(XACPRG) -END IF -! -IF ( ASSOCIATED(XINPRH) .AND. KCALL == 3 ) THEN - DEALLOCATE(XINPRH) - DEALLOCATE(XACPRH) -END IF -! -!* 13b. Module MODD_ELEC$n -! -IF ( ASSOCIATED(XNI_SDRYG) .AND. KCALL == 3 ) THEN - DEALLOCATE(XNI_SDRYG) - DEALLOCATE(XNI_IDRYG) - DEALLOCATE(XNI_IAGGS) - DEALLOCATE(XEW) - DEALLOCATE(XIND_RATE) -END IF -! -IF ( ASSOCIATED(XEFIELDU) .AND. KCALL == 3 ) THEN - DEALLOCATE(XEFIELDU) - DEALLOCATE(XEFIELDV) - DEALLOCATE(XEFIELDW) - DEALLOCATE(XESOURCEFW) - DEALLOCATE(XIONSOURCEFW) - DEALLOCATE(XCION_POS_FW) - DEALLOCATE(XCION_NEG_FW) - DEALLOCATE(XMOBIL_POS) - DEALLOCATE(XMOBIL_NEG) -END IF -! -IF ( ASSOCIATED(XRHOM_E) .AND. KCALL == 3 ) THEN - DEALLOCATE (XRHOM_E) - DEALLOCATE (XAF_E) - DEALLOCATE (XCF_E) - DEALLOCATE (XBFY_E) -END IF -! -!* 14. Modules RAIN_ICE_DESCR and MODD_RAIN_ICE_PARAM -! -IF ( ASSOCIATED(XRTMIN) .AND. KCALL == 4 ) THEN - CALL RAIN_ICE_DESCR_DEALLOCATE() - CALL RAIN_ICE_PARAM_DEALLOCATE() -END IF -! -!* 15. Module PASPOLn -! -IF ( ASSOCIATED(XATC) .AND. KCALL == 3 ) THEN - DEALLOCATE(XATC) -END IF -! -!* 16. Module TURBn -! -IF ( KCALL==3 ) THEN - IF (ASSOCIATED(XDYP)) DEALLOCATE(XDYP) - IF (ASSOCIATED(XTHP)) DEALLOCATE(XTHP) - IF (ASSOCIATED(XTR)) DEALLOCATE(XTR) - IF (ASSOCIATED(XDISS)) DEALLOCATE(XDISS) - IF (ASSOCIATED(XLEM)) DEALLOCATE(XLEM) -END IF -!------------------------------------------------------------------------------- -! -CALL GOTO_MODEL(IMI) -! -END SUBROUTINE DEALLOCATE_MODEL1 diff --git a/src/mesonh/ext/diagnos_les_mf.f90 b/src/mesonh/ext/diagnos_les_mf.f90 deleted file mode 100644 index 665d1ea7666f6047ab2a4d8e9343253fb2852446..0000000000000000000000000000000000000000 --- a/src/mesonh/ext/diagnos_les_mf.f90 +++ /dev/null @@ -1,244 +0,0 @@ -!MNH_LIC Copyright 2009-2020 CNRS, Meteo-France and Universite Paul Sabatier -!MNH_LIC This is part of the Meso-NH software governed by the CeCILL-C licence -!MNH_LIC version 1. See LICENSE, CeCILL-C_V1-en.txt and CeCILL-C_V1-fr.txt -!MNH_LIC for details. version 1. -!----------------------------------------------------------------- -! ########################### - MODULE MODI_DIAGNOS_LES_MF -! ########################### -! -INTERFACE -! -! ################################################################# - SUBROUTINE DIAGNOS_LES_MF(KIU,KJU,KKU,PTIME_LES, & - PTHL_UP,PRT_UP,PRV_UP,PRC_UP,PRI_UP, & - PU_UP, PV_UP, PTHV_UP, PW_UP, & - PFRAC_UP,PEMF,PDETR,PENTR, & - PWTHMF,PWTHVMF,PWRTMF, & - PWUMF,PWVMF, & - KKLCL,KKETL,KKCTL) -! ################################################################# -! -!* 1.1 Declaration of Arguments -! -use modd_precision, only: MNHTIME -! -INTEGER, INTENT(IN) :: KIU, KJU, KKU ! 3D grid size -REAL(kind=MNHTIME), DIMENSION(2), INTENT(OUT) :: PTIME_LES -REAL, DIMENSION(:,:,:), INTENT(IN) :: PTHL_UP,PRT_UP,PRV_UP,& - PRC_UP,PRI_UP ! updraft properties -REAL, DIMENSION(:,:,:), INTENT(IN) :: PU_UP, PV_UP -REAL, DIMENSION(:,:,:), INTENT(IN) :: PTHV_UP,PW_UP,& - PFRAC_UP,PEMF,PDETR,PENTR -REAL, DIMENSION(:,:,:), INTENT(IN) :: PWTHMF,PWTHVMF,PWRTMF, & - PWUMF,PWVMF -INTEGER, DIMENSION(:), INTENT(IN) :: KKLCL,KKETL,KKCTL - - -END SUBROUTINE DIAGNOS_LES_MF - -END INTERFACE -! -END MODULE MODI_DIAGNOS_LES_MF -! -! ################################################################# - SUBROUTINE DIAGNOS_LES_MF(KIU,KJU,KKU,PTIME_LES, & - PTHL_UP,PRT_UP,PRV_UP,PRC_UP,PRI_UP, & - PU_UP, PV_UP, PTHV_UP, PW_UP, & - PFRAC_UP,PEMF,PDETR,PENTR, & - PWTHMF,PWTHVMF,PWRTMF, & - PWUMF,PWVMF, & - KKLCL,KKETL,KKCTL) -! ################################################################# -!! -!!**** *DIAGNOS_LES_MF* - Edit in File the updraft properties as -!! LES diagnostics -!! -!! PURPOSE -!! ------- -!!**** The purpose of this routine is to write updraft variable as -!! LES diagnostics -! -!!** METHOD -!! ------ -!! -!! EXTERNAL -!! -------- -!! -!! IMPLICIT ARGUMENTS -!! ------------------ -!! -!! REFERENCE -!! --------- -!! -!! -!! AUTHOR -!! ------ -!! J.pergaud -! -! Modifications: -! V. Masson 09/2010: Optimization -! P. Wautelet 28/03/2019: use MNHTIME for time measurement variables -!! -------------------------------------------------------------------------- -! -!* 0. DECLARATIONS -! ------------ -! -USE MODD_LES -use modd_precision, only: MNHTIME -! -USE MODE_MNH_TIMING -! -USE MODI_LES_VER_INT -USE MODI_LES_MEAN_ll -USE MODI_SHUMAN -! -IMPLICIT NONE - -!* 0.1 Declaration of Arguments -! -! -INTEGER, INTENT(IN) :: KIU, KJU, KKU ! 3D grid size -REAL(kind=MNHTIME), DIMENSION(2), INTENT(OUT) :: PTIME_LES -REAL, DIMENSION(:,:,:), INTENT(IN) :: PTHL_UP,PRT_UP,PRV_UP,& - PRC_UP,PRI_UP ! updraft properties -REAL, DIMENSION(:,:,:), INTENT(IN) :: PU_UP, PV_UP -REAL, DIMENSION(:,:,:), INTENT(IN) :: PTHV_UP,PW_UP,& - PFRAC_UP,PEMF,PDETR,PENTR -REAL, DIMENSION(:,:,:), INTENT(IN) :: PWTHMF,PWTHVMF,PWRTMF, & - PWUMF,PWVMF -INTEGER, DIMENSION(:), INTENT(IN) :: KKLCL,KKETL,KKCTL - -! -! -! 0.2 Declaration of local variables -! -REAL, DIMENSION(:,:,:), ALLOCATABLE :: ZTHLMFFLX_LES,ZRTMFFLX_LES, & - ZTHVMFFLX_LES,ZUMFFLX_LES, & - ZVMFFLX_LES -REAL, DIMENSION(:,:,:), ALLOCATABLE :: ZTHLUP_MF_LES,ZRTUP_MF_LES, & - ZRCUP_MF_LES,ZEMF_MF_LES, & - ZDETR_MF_LES, ZENTR_MF_LES, & - ZWUP_MF_LES,ZFRACUP_MF_LES, & - ZTHVUP_MF_LES,ZRVUP_MF_LES, & - ZRIUP_MF_LES -REAL(kind=MNHTIME), DIMENSION(2) :: ZTIME1, ZTIME2 -!------------------------------------------------------------------------ -! - -CALL SECOND_MNH2(ZTIME1) - - IF (LLES_CALL) THEN - - ALLOCATE( ZTHLUP_MF_LES(KIU,KJU,NLES_K) ) - ALLOCATE( ZRTUP_MF_LES(KIU,KJU,NLES_K) ) - ALLOCATE( ZRVUP_MF_LES(KIU,KJU,NLES_K) ) - ALLOCATE( ZRCUP_MF_LES(KIU,KJU,NLES_K) ) - ALLOCATE( ZRIUP_MF_LES(KIU,KJU,NLES_K) ) - ALLOCATE( ZEMF_MF_LES(KIU,KJU,NLES_K) ) - ALLOCATE( ZDETR_MF_LES(KIU,KJU,NLES_K) ) - ALLOCATE( ZENTR_MF_LES(KIU,KJU,NLES_K) ) - ALLOCATE( ZWUP_MF_LES(KIU,KJU,NLES_K) ) - ALLOCATE( ZFRACUP_MF_LES(KIU,KJU,NLES_K) ) - ALLOCATE( ZTHVUP_MF_LES(KIU,KJU,NLES_K) ) - - ALLOCATE( ZTHLMFFLX_LES(KIU,KJU,NLES_K) ) - ALLOCATE( ZRTMFFLX_LES (KIU,KJU,NLES_K) ) - ALLOCATE( ZTHVMFFLX_LES(KIU,KJU,NLES_K) ) - ALLOCATE( ZUMFFLX_LES (KIU,KJU,NLES_K) ) - ALLOCATE( ZVMFFLX_LES (KIU,KJU,NLES_K) ) - - - CALL LES_VER_INT(MZF(PWTHMF) ,ZTHLMFFLX_LES ) - CALL LES_MEAN_ll(ZTHLMFFLX_LES,LLES_CURRENT_CART_MASK, & - X_LES_SUBGRID_WTHLMF(:,NLES_CURRENT_TCOUNT,1)) - - CALL LES_VER_INT( MZF(PWRTMF) ,ZRTMFFLX_LES ) - CALL LES_MEAN_ll (ZRTMFFLX_LES , LLES_CURRENT_CART_MASK, & - X_LES_SUBGRID_WRTMF(:,NLES_CURRENT_TCOUNT,1) ) - - CALL LES_VER_INT( MZF(PWUMF) ,ZUMFFLX_LES ) - CALL LES_MEAN_ll (ZUMFFLX_LES , LLES_CURRENT_CART_MASK, & - X_LES_SUBGRID_WUMF(:,NLES_CURRENT_TCOUNT,1) ) - - CALL LES_VER_INT( MZF(PWVMF) ,ZVMFFLX_LES ) - CALL LES_MEAN_ll (ZVMFFLX_LES , LLES_CURRENT_CART_MASK, & - X_LES_SUBGRID_WVMF(:,NLES_CURRENT_TCOUNT,1) ) - - CALL LES_VER_INT( MZF(PWTHVMF) ,ZTHVMFFLX_LES ) - CALL LES_MEAN_ll (ZTHVMFFLX_LES , LLES_CURRENT_CART_MASK, & - X_LES_SUBGRID_WTHVMF(:,NLES_CURRENT_TCOUNT,1) ) - - - CALL LES_VER_INT( MZF(PTHL_UP) ,ZTHLUP_MF_LES ) - CALL LES_MEAN_ll (ZTHLUP_MF_LES , LLES_CURRENT_CART_MASK, & - X_LES_SUBGRID_THLUP_MF(:,NLES_CURRENT_TCOUNT,1) ) - - CALL LES_VER_INT( MZF(PRT_UP) ,ZRTUP_MF_LES ) - CALL LES_MEAN_ll (ZRTUP_MF_LES , LLES_CURRENT_CART_MASK, & - X_LES_SUBGRID_RTUP_MF(:,NLES_CURRENT_TCOUNT,1) ) - - CALL LES_VER_INT( MZF(PRV_UP) ,ZRVUP_MF_LES ) - CALL LES_MEAN_ll (ZRVUP_MF_LES , LLES_CURRENT_CART_MASK, & - X_LES_SUBGRID_RVUP_MF(:,NLES_CURRENT_TCOUNT,1) ) - - CALL LES_VER_INT( MZF(PRC_UP) ,ZRCUP_MF_LES ) - CALL LES_MEAN_ll (ZRCUP_MF_LES , LLES_CURRENT_CART_MASK, & - X_LES_SUBGRID_RCUP_MF(:,NLES_CURRENT_TCOUNT,1) ) - - CALL LES_VER_INT( MZF(PRI_UP) ,ZRIUP_MF_LES ) - CALL LES_MEAN_ll (ZRIUP_MF_LES , LLES_CURRENT_CART_MASK, & - X_LES_SUBGRID_RIUP_MF(:,NLES_CURRENT_TCOUNT,1) ) - - CALL LES_VER_INT( MZF(PEMF) ,ZEMF_MF_LES ) - CALL LES_MEAN_ll (ZEMF_MF_LES , LLES_CURRENT_CART_MASK, & - X_LES_SUBGRID_MASSFLUX(:,NLES_CURRENT_TCOUNT,1) ) - - CALL LES_VER_INT( MZF(PDETR) ,ZDETR_MF_LES ) - CALL LES_MEAN_ll (ZDETR_MF_LES , LLES_CURRENT_CART_MASK, & - X_LES_SUBGRID_DETR(:,NLES_CURRENT_TCOUNT,1) ) - - CALL LES_VER_INT( MZF(PENTR) ,ZENTR_MF_LES ) - CALL LES_MEAN_ll (ZENTR_MF_LES , LLES_CURRENT_CART_MASK, & - X_LES_SUBGRID_ENTR(:,NLES_CURRENT_TCOUNT,1) ) - - CALL LES_VER_INT( MZF(PW_UP) ,ZWUP_MF_LES ) - CALL LES_MEAN_ll (ZWUP_MF_LES , LLES_CURRENT_CART_MASK, & - X_LES_SUBGRID_WUP_MF(:,NLES_CURRENT_TCOUNT,1) ) - - CALL LES_VER_INT( MZF(PFRAC_UP) ,ZFRACUP_MF_LES ) - CALL LES_MEAN_ll (ZFRACUP_MF_LES , LLES_CURRENT_CART_MASK, & - X_LES_SUBGRID_FRACUP(:,NLES_CURRENT_TCOUNT,1) ) - - CALL LES_VER_INT( MZF(PTHV_UP) ,ZTHVUP_MF_LES ) - CALL LES_MEAN_ll (ZTHVUP_MF_LES , LLES_CURRENT_CART_MASK, & - X_LES_SUBGRID_THVUP_MF(:,NLES_CURRENT_TCOUNT,1) ) - - - - DEALLOCATE( ZTHLMFFLX_LES ) - DEALLOCATE( ZRTMFFLX_LES ) - DEALLOCATE( ZTHVMFFLX_LES ) - DEALLOCATE( ZUMFFLX_LES ) - DEALLOCATE( ZVMFFLX_LES ) - - - DEALLOCATE( ZTHLUP_MF_LES ) - DEALLOCATE( ZRTUP_MF_LES ) - DEALLOCATE( ZRVUP_MF_LES ) - DEALLOCATE( ZRCUP_MF_LES ) - DEALLOCATE( ZRIUP_MF_LES ) - DEALLOCATE( ZENTR_MF_LES ) - DEALLOCATE( ZDETR_MF_LES ) - DEALLOCATE( ZEMF_MF_LES ) - DEALLOCATE( ZWUP_MF_LES ) - DEALLOCATE( ZFRACUP_MF_LES ) - DEALLOCATE( ZTHVUP_MF_LES ) - -ENDIF - -CALL SECOND_MNH2(ZTIME2) -PTIME_LES = ZTIME2 - ZTIME1 -XTIME_LES = XTIME_LES + ZTIME2 - ZTIME1 - -END SUBROUTINE DIAGNOS_LES_MF diff --git a/src/mesonh/ext/ground_paramn.f90 b/src/mesonh/ext/ground_paramn.f90 deleted file mode 100644 index 5d872413b3361b500da93f8a7671510c51adfdac..0000000000000000000000000000000000000000 --- a/src/mesonh/ext/ground_paramn.f90 +++ /dev/null @@ -1,1230 +0,0 @@ -!MNH_LIC Copyright 1994-2020 CNRS, Meteo-France and Universite Paul Sabatier -!MNH_LIC This is part of the Meso-NH software governed by the CeCILL-C licence -!MNH_LIC version 1. See LICENSE, CeCILL-C_V1-en.txt and CeCILL-C_V1-fr.txt -!MNH_LIC for details. version 1. -!----------------------------------------------------------------- -! ########## -MODULE MODI_GROUND_PARAM_n -! ########## -! -INTERFACE -! - SUBROUTINE GROUND_PARAM_n(D, PSFTH, PSFRV, PSFSV, PSFCO2, PSFU, PSFV, & - PDIR_ALB, PSCA_ALB, PEMIS, PTSRAD, KTCOUNT, TPFILE ) -! -USE MODD_DIMPHYEX, ONLY: DIMPHYEX_t -!* surface fluxes -! -------------- -! -USE MODD_IO, ONLY: TFILEDATA -! -TYPE(DIMPHYEX_t), INTENT(IN) :: D -REAL, DIMENSION(:,:), INTENT(OUT) :: PSFTH ! surface flux of potential temperature (Km/s) -REAL, DIMENSION(:,:), INTENT(OUT) :: PSFRV ! surface flux of water vapor (m/s*kg/kg) -REAL, DIMENSION(:,:,:),INTENT(OUT):: PSFSV ! surface flux of scalar (m/s*kg/kg) - ! flux of chemical var. (ppp.m/s) -REAL, DIMENSION(:,:), INTENT(OUT) :: PSFCO2! surface flux of CO2 (m/s*kg/kg) -REAL, DIMENSION(:,:), INTENT(OUT) :: PSFU ! surface fluxes of horizontal -REAL, DIMENSION(:,:), INTENT(OUT) :: PSFV ! momentum in x and y directions (m2/s2) -! -!* Radiative parameters -! -------------------- -! -REAL, DIMENSION(:,:,:), INTENT(OUT) :: PDIR_ALB ! direct albedo for each spectral band (-) -REAL, DIMENSION(:,:,:), INTENT(OUT) :: PSCA_ALB ! diffuse albedo for each spectral band (-) -REAL, DIMENSION(:,:,:), INTENT(OUT) :: PEMIS ! surface emissivity (-) -REAL, DIMENSION(:,:), INTENT(OUT) :: PTSRAD ! surface radiative temperature (K) -! -INTEGER, INTENT(IN) :: KTCOUNT ! temporal iteration count -TYPE(TFILEDATA), INTENT(IN) :: TPFILE ! Synchronous output file -END SUBROUTINE GROUND_PARAM_n -! -END INTERFACE -! -END MODULE MODI_GROUND_PARAM_n -! -! ###################################################################### - SUBROUTINE GROUND_PARAM_n(D, PSFTH, PSFRV, PSFSV, PSFCO2, PSFU, PSFV, & - PDIR_ALB, PSCA_ALB, PEMIS, PTSRAD, KTCOUNT, TPFILE ) -! ####################################################################### -! -! -!!**** *GROUND_PARAM* -!! -!! PURPOSE -!! ------- -! Monitor to call the externalized surface -! -!!** METHOD -!! ------ -! -!! EXTERNAL -!! -------- -!! -!! IMPLICIT ARGUMENTS -!! ------------------ -!! -!! -!! REFERENCE -!! --------- -!! -!! Noilhan and Planton (1989) -!! -!! AUTHOR -!! ------ -!! S. Belair * Meteo-France * -!! -!! MODIFICATIONS -!! ------------- -!! Original 10/03/95 -!! (J.Stein) 25/10/95 add the rain flux computation at the ground -!! and the lbc -!! (J.Stein) 15/11/95 include the strong slopes cases -!! (J.Stein) 06/02/96 bug correction for the precipitation flux writing -!! (J.Stein) 20/05/96 set the right IGRID value for the rain rate -!! (J.Viviand) 04/02/97 add cold and convective precipitation rate -!! (J.Stein) 22/06/97 use the absolute pressure -!! (V.Masson) 09/07/97 add directional z0 computations and RESA correction -!! (V.Masson) 13/02/98 merge the ISBA and TSZ0 routines, -!! rename the routine as a monitor, called by PHYS_PARAMn -!! add the town parameterization -!! recomputes z0 where snow is. -!! pack and unpack of 2D fields into 1D fields -!! (V.Masson) 04/01/00 removes the TSZ0 case -! (F.Solmon/V.Masson) adapatation for patch approach -! modification of internal subroutine pack/ allocation in function -! of patch indices -! calling of isba for each defined patch -! averaging of patch fluxes to get nat fluxes -! (P. Tulet/G.Guenais) 04/02/01 separation of vegetatives class -! for friction velocity and -! aerodynamical resistance -! (S Donnier) 09/12/02 add specific humidity at 2m for diagnostic -! (V.Masson) 01/03/03 externalisation of the surface schemes! -! (P.Tulet ) 01/11/03 externalisation of the surface chemistry! -!! (D.Gazen) 01/12/03 change emissions handling for surf. externalization -!! (J.escobar) 18/10/2012 missing USE MODI_COUPLING_SURF_ATM_n & MODI_DIAG_SURF_ATM_n -! (J.escobar) 02/2014 add Forefire coupling -!! (G.Delautier) 06/2016 phasage surfex 8 -!! (B.Vie) 2016 LIMA -!! (J.Pianezze) 08/2016 add send/recv oasis functions -!! (M.Leriche) 24/03/16 remove flag for chemical surface fluxes -!! (M.Leriche) 01/07/2017 Add DIAG chimical surface fluxes -!! 01/2018 (G.Delautier) SURFEX 8.1 -!! 02/2018 Q.Libois ECRAD -!! (P.Wautelet) 28/03/2018 replace TEMPORAL_DIST by DATETIME_DISTANCE - -!! (V. Vionnet) 18/07/2017 add coupling for blowing snow module -!! (Bielli S.) 02/2019 Sea salt : significant sea wave height influences salt emission; 5 salt modes -! P. Wautelet 20/05/2019: add name argument to ADDnFIELD_ll + new ADD4DFIELD_ll subroutine -! P. Wautelet 09/02/2022: bugfix: add missing XCURRENT_LEI computation -! A. Costes 12/2021: Blaze Fire model -!------------------------------------------------------------------------------- -! -!* 0. DECLARATIONS -! ------------ -! -! -#ifdef CPLOASIS -USE MODI_GET_HALO -USE MODI_MNH_OASIS_RECV -USE MODI_MNH_OASIS_SEND -USE MODD_SFX_OASIS, ONLY : LOASIS -USE MODD_DYN, ONLY : XSEGLEN -USE MODD_DYN_n, ONLY : DYN_MODEL -#endif -! -USE MODD_LUNIT_n, ONLY: TLUOUT -USE MODD_CST, ONLY : XP00, XCPD, XRD, XRV,XRHOLW, XDAY, XPI, XLVTT, XMD, XAVOGADRO -USE MODD_DIMPHYEX, ONLY : DIMPHYEX_t -USE MODD_PARAMETERS, ONLY : JPVEXT, XUNDEF -USE MODD_DYN_n, ONLY : XTSTEP -USE MODD_CH_MNHC_n, ONLY : LUSECHEM -USE MODD_CH_M9_n, ONLY : CNAMES -USE MODD_FIELD_n, ONLY : XUT, XVT, XWT, XTHT, XRT, XPABST, XSVT, XTKET, XZWS,& -XLSPHI, XBMAP, XFMR0, XFMRFA, XFMWF0, XFMR00, XFMIGNITION, XFMFUELTYPE,& -XFIRETAU, XFLUXPARAMH, XFLUXPARAMW, XFIRERW, XFMASE, XFMAWC, XFMWALKIG,& -XFMFLUXHDH, XFMFLUXHDW, XRTHS, XRRS, XFMHWS, XFMWINDU, XFMWINDV, XFMWINDW, XGRADLSPHIX, & -XGRADLSPHIY, XFIREWIND, XFMGRADOROX, XFMGRADOROY -USE MODD_METRICS_n, ONLY : XDXX, XDYY, XDZZ -USE MODD_DIM_n, ONLY : NKMAX -USE MODD_GRID_n, ONLY : XLON, XZZ, XDIRCOSXW, XDIRCOSYW, XDIRCOSZW, & - XCOSSLOPE, XSINSLOPE, XZS -USE MODD_REF_n, ONLY : XRHODREF,XRHODJ,XEXNREF -USE MODD_CONF_n, ONLY : NRR -USE MODD_PARAM_n, ONLY : CDCONV,CCLOUD, CRAD -USE MODD_PRECIP_n, ONLY : XINPRC, XINPRR, XINPRS, XINPRG, XINPRH -USE MODD_DEEP_CONVECTION_n, ONLY : XPRCONV, XPRSCONV -USE MODD_CONF, ONLY : LCARTESIAN, CPROGRAM -USE MODD_TIME_n, ONLY : TDTCUR -USE MODD_RADIATIONS_n, ONLY : XFLALWD, XCCO2, XTSIDER, & - XSW_BANDS, XDIRSRFSWD, XSCAFLASWD, & - XZENITH, XAZIM, XAER, XSWU, XLWU -USE MODD_NSV -USE MODD_GRID, ONLY : XLON0, XRPK, XBETA -USE MODD_PARAM_ICE, ONLY : LSEDIC -USE MODD_PARAM_C2R2, ONLY : LSEDC -USE MODD_DIAG_IN_RUN -USE MODD_DUST, ONLY : LDUST -USE MODD_SALT, ONLY : LSALT -USE MODD_BLOWSNOW -USE MODD_BLOWSNOW_n -USE MODD_CH_AEROSOL, ONLY : LORILAM -USE MODD_CSTS_DUST, ONLY : XMOLARWEIGHT_DUST -USE MODD_CSTS_SALT, ONLY : XMOLARWEIGHT_SALT -USE MODD_CH_FLX_n, ONLY : XCHFLX -USE MODD_DIAG_FLAG, ONLY : LCHEMDIAG -! -USE MODI_NORMAL_INTERPOL -USE MODE_ROTATE_WIND, ONLY : ROTATE_WIND -USE MODI_SHUMAN -USE MODI_MNHGET_SURF_PARAM_n -USE MODI_COUPLING_SURF_ATM_n -USE MODI_DIAG_SURF_ATM_n -USE MODD_MNH_SURFEX_n -! -USE MODE_DATETIME -USE MODE_ll -USE MODD_ARGSLIST_ll, ONLY : LIST_ll -#ifdef MNH_FOREFIRE -!** MODULES FOR FOREFIRE **! -USE MODD_FOREFIRE -USE MODD_FOREFIRE_n -USE MODI_COUPLING_FOREFIRE_n -#endif -! -USE MODD_TIME_n -USE MODD_TIME -! -USE MODD_PARAM_LIMA, ONLY : MSEDC=>LSEDC -! -USE MODD_FIRE -USE MODD_FIELD -USE MODI_FIRE_MODEL -USE MODD_CONF, ONLY : NVERB, NHALO -USE MODE_MNH_TIMING, ONLY : SECOND_MNH2 -USE MODE_MSG -USE MODD_IO, ONLY: TFILEDATA -! -IMPLICIT NONE -! -! -! -!* 0.1 declarations of arguments -! -!* surface fluxes -! -------------- -! -TYPE(DIMPHYEX_t), INTENT(IN) :: D -REAL, DIMENSION(:,:), INTENT(OUT) :: PSFTH ! surface flux of potential temperature (Km/s) -REAL, DIMENSION(:,:), INTENT(OUT) :: PSFRV ! surface flux of water vapor (m/s*kg/kg) -REAL, DIMENSION(:,:,:),INTENT(OUT):: PSFSV ! surface flux of scalar (m/s*kg/kg) - ! flux of chemical var. (ppp.m/s) -REAL, DIMENSION(:,:), INTENT(OUT) :: PSFCO2! surface flux of CO2 (m/s*kg/kg) -REAL, DIMENSION(:,:), INTENT(OUT) :: PSFU ! surface fluxes of horizontal -REAL, DIMENSION(:,:), INTENT(OUT) :: PSFV ! momentum in x and y directions (m2/s2) -! -!* Radiative parameters -! -------------------- -! -REAL, DIMENSION(:,:,:), INTENT(OUT) :: PDIR_ALB ! direct albedo for each spectral band (-) -REAL, DIMENSION(:,:,:), INTENT(OUT) :: PSCA_ALB ! diffuse albedo for each spectral band (-) -REAL, DIMENSION(:,:,:), INTENT(OUT) :: PEMIS ! surface emissivity (-) -REAL, DIMENSION(:,:), INTENT(OUT) :: PTSRAD ! surface radiative temperature (K) -! -INTEGER, INTENT(IN) :: KTCOUNT ! temporal iteration count -TYPE(TFILEDATA), INTENT(IN) :: TPFILE ! Synchronous output file -! -!------------------------------------------------------------------------------- -! -! -! -!* 0.2 declarations of local variables -! ------------------------------- -! -! -!* Atmospheric variables -! --------------------- -! -REAL, DIMENSION(:,:,:), ALLOCATABLE :: ZRV ! vapor mixing ratio -! -! suffix 'A' stands for atmospheric variable at first model level -! -REAL, DIMENSION(SIZE(PSFTH,1),SIZE(PSFTH,2)) :: ZZREF ! Forcing height -REAL, DIMENSION(SIZE(PSFTH,1),SIZE(PSFTH,2)) :: ZTA ! Temperature -REAL, DIMENSION(SIZE(PSFTH,1),SIZE(PSFTH,2)) :: ZRVA ! vapor mixing ratio -REAL, DIMENSION(SIZE(PSFTH,1),SIZE(PSFTH,2)) :: ZQA ! humidity (kg/m3) -REAL, DIMENSION(SIZE(PSFTH,1),SIZE(PSFTH,2)) :: ZPA ! Pressure -REAL, DIMENSION(SIZE(PSFTH,1),SIZE(PSFTH,2)) :: ZPS ! Pressure -REAL, DIMENSION(SIZE(PSFTH,1),SIZE(PSFTH,2)) :: ZEXNA ! Exner function -REAL, DIMENSION(SIZE(PSFTH,1),SIZE(PSFTH,2)) :: ZEXNS ! Exner function -REAL, DIMENSION(SIZE(PSFTH,1),SIZE(PSFTH,2)) :: ZTHA ! potential temperature -REAL, DIMENSION(SIZE(PSFTH,1),SIZE(PSFTH,2)) :: ZRAIN ! liquid precipitation (kg/m2/s) -REAL, DIMENSION(SIZE(PSFTH,1),SIZE(PSFTH,2)) :: ZSNOW ! solid precipitation (kg/m2/s) -REAL, DIMENSION(SIZE(PSFTH,1),SIZE(PSFTH,2)) :: ZTSUN ! solar time (s since midnight) -! -REAL, DIMENSION(SIZE(PSFTH,1),SIZE(PSFTH,2)) :: ZUA ! u component of the wind -! ! parallel to the orography -REAL, DIMENSION(SIZE(PSFTH,1),SIZE(PSFTH,2)) :: ZVA ! v component of the wind -! ! parallel to the orography -REAL, DIMENSION(SIZE(PSFTH,1),SIZE(PSFTH,2)) :: ZU ! zonal wind -REAL, DIMENSION(SIZE(PSFTH,1),SIZE(PSFTH,2)) :: ZV ! meridian wind -REAL, DIMENSION(SIZE(PSFTH,1),SIZE(PSFTH,2)) :: ZWIND ! wind parallel to the orography -REAL, DIMENSION(SIZE(PSFTH,1),SIZE(PSFTH,2)) :: ZRHOA ! air density -REAL, DIMENSION(SIZE(PSFTH,1),SIZE(PSFTH,2)) :: ZDIR ! wind direction (rad from N clockwise) -REAL, DIMENSION(SIZE(PSFTH,1),SIZE(PSFTH,2)) :: ZSFU ! zonal momentum flux -REAL, DIMENSION(SIZE(PSFTH,1),SIZE(PSFTH,2)) :: ZSFV ! meridian momentum flux -REAL, DIMENSION(SIZE(PSFTH,1),SIZE(PSFTH,2)) :: ZCO2 ! CO2 concentration (kg/kg) -REAL, DIMENSION(SIZE(PSFTH,1),SIZE(PSFTH,2)) :: ZALFA ! angle between the wind -! ! and the x axis -REAL, DIMENSION(SIZE(PSFTH,1),SIZE(PSFTH,2),1):: ZU2D ! u and v component of the -REAL, DIMENSION(SIZE(PSFTH,1),SIZE(PSFTH,2),1):: ZV2D ! wind at mass point -REAL, DIMENSION(SIZE(PSFTH,1),SIZE(PSFTH,2)) :: ZSFTH ! Turbulent flux of heat -REAL, DIMENSION(SIZE(PSFTH,1),SIZE(PSFTH,2)) :: ZSFTQ ! Turbulent flux of water -REAL, DIMENSION(SIZE(PSFTH,1),SIZE(PSFTH,2)) :: ZSFCO2 ! Turbulent flux of CO2 -REAL, DIMENSION(SIZE(PSFTH,1),SIZE(PSFTH,2),NSV):: ZSFTS! Turbulent flux of scalar -! -REAL, DIMENSION(SIZE(PSFTH,1),SIZE(PSFTH,2),NBLOWSNOW_2D) :: ZBLOWSNOW_2D ! 2D blowing snow variables - ! after advection - ! They refer to the 2D fields advected by MNH including: - ! - total number concentration in Canopy - ! - total mass concentration in Canopy - ! - equivalent concentration in the saltation layer -! -!* Dimensions -! ---------- -! -INTEGER :: IIB ! physical boundary -INTEGER :: IIE ! physical boundary -INTEGER :: IJB ! physical boundary -INTEGER :: IJE ! physical boundary -INTEGER :: IKB ! physical boundary -INTEGER :: IKE ! physical boundary -INTEGER :: IKU ! vertical array sizes -! -INTEGER :: JLAYER ! loop counter -INTEGER :: JSV ! loop counter -INTEGER :: JI,JJ,JK ! loop index -! -INTEGER :: IDIM1 ! X physical dimension -INTEGER :: IDIM2 ! Y physical dimension -INTEGER :: IDIM1D! total physical dimension -INTEGER :: IKRAD -! -INTEGER :: KSV_SURF ! Number of scalar variables sent to SURFEX -! -!* Arrays put in 1D vectors -! ------------------------ -! -REAL, DIMENSION(:), ALLOCATABLE :: ZP_TSUN ! solar time -REAL, DIMENSION(:), ALLOCATABLE :: ZP_ZENITH ! zenithal angle -REAL, DIMENSION(:), ALLOCATABLE :: ZP_AZIM ! azimuthal angle -REAL, DIMENSION(:), ALLOCATABLE :: ZP_ZREF ! forcing height -REAL, DIMENSION(:), ALLOCATABLE :: ZP_ZS ! orography -REAL, DIMENSION(:), ALLOCATABLE :: ZP_U ! zonal wind -REAL, DIMENSION(:), ALLOCATABLE :: ZP_V ! meridian wind -REAL, DIMENSION(:), ALLOCATABLE :: ZP_QA ! air humidity (kg/m3) -REAL, DIMENSION(:), ALLOCATABLE :: ZP_TA ! air temperature -REAL, DIMENSION(:), ALLOCATABLE :: ZP_RHOA ! air density -REAL, DIMENSION(:,:), ALLOCATABLE :: ZP_SV ! scalar at first atmospheric level -REAL, DIMENSION(:), ALLOCATABLE :: ZP_CO2 ! air CO2 concentration -REAL, DIMENSION(:), ALLOCATABLE :: ZP_RAIN ! liquid precipitation -REAL, DIMENSION(:), ALLOCATABLE :: ZP_SNOW ! solid precipitation -REAL, DIMENSION(:), ALLOCATABLE :: ZP_LW ! incoming longwave -REAL, DIMENSION(:,:), ALLOCATABLE :: ZP_DIR_SW ! direct incoming shortwave -REAL, DIMENSION(:,:), ALLOCATABLE :: ZP_SCA_SW ! diffuse incoming shortwave -REAL, DIMENSION(:), ALLOCATABLE :: ZP_PS ! surface pressure -REAL, DIMENSION(:), ALLOCATABLE :: ZP_PA ! pressure at first atmospheric level -REAL, DIMENSION(:), ALLOCATABLE :: ZP_ZWS ! significant wave height (m) - -REAL, DIMENSION(:), ALLOCATABLE :: ZP_SFTQ ! water vapor flux -REAL, DIMENSION(:), ALLOCATABLE :: ZP_SFTH ! potential temperature flux -REAL, DIMENSION(:,:), ALLOCATABLE :: ZP_SFTS ! scalar flux -REAL, DIMENSION(:), ALLOCATABLE :: ZP_SFCO2 ! CO2 flux -REAL, DIMENSION(:), ALLOCATABLE :: ZP_SFU ! zonal momentum flux -REAL, DIMENSION(:), ALLOCATABLE :: ZP_SFV ! meridian momentum flux -REAL, DIMENSION(:), ALLOCATABLE :: ZP_TSRAD ! radiative surface temperature -REAL, DIMENSION(:,:), ALLOCATABLE :: ZP_DIR_ALB ! direct albedo -REAL, DIMENSION(:,:), ALLOCATABLE :: ZP_SCA_ALB ! diffuse albedo -REAL, DIMENSION(:), ALLOCATABLE :: ZP_EMIS ! emissivity - -REAL, DIMENSION(:), ALLOCATABLE :: ZP_TSURF -REAL, DIMENSION(:), ALLOCATABLE :: ZP_Z0 -REAL, DIMENSION(:), ALLOCATABLE :: ZP_Z0H -REAL, DIMENSION(:), ALLOCATABLE :: ZP_QSURF - -REAL, DIMENSION(:), ALLOCATABLE :: ZP_PEW_A_COEF ! coefficients for -REAL, DIMENSION(:), ALLOCATABLE :: ZP_PEW_B_COEF ! implicit coupling -REAL, DIMENSION(:), ALLOCATABLE :: ZP_PET_A_COEF -REAL, DIMENSION(:), ALLOCATABLE :: ZP_PEQ_A_COEF -REAL, DIMENSION(:), ALLOCATABLE :: ZP_PET_B_COEF -REAL, DIMENSION(:), ALLOCATABLE :: ZP_PEQ_B_COEF -REAL, DIMENSION(:), ALLOCATABLE :: ZP_RN ! net radiation (W/m2) -REAL, DIMENSION(:), ALLOCATABLE :: ZP_H ! sensible heat flux (W/m2) -REAL, DIMENSION(:), ALLOCATABLE :: ZP_LE ! Total latent heat flux (W/m2) -REAL, DIMENSION(:), ALLOCATABLE :: ZP_LEI ! Solid Latent heat flux (W/m2) -REAL, DIMENSION(:), ALLOCATABLE :: ZP_GFLUX ! ground flux (W/m2) -REAL, DIMENSION(:), ALLOCATABLE :: ZP_T2M ! Air temperature at 2 meters (K) -REAL, DIMENSION(:), ALLOCATABLE :: ZP_Q2M ! Air humidity at 2 meters (kg/kg) -REAL, DIMENSION(:), ALLOCATABLE :: ZP_HU2M ! Air relative humidity at 2 meters (-) -REAL, DIMENSION(:), ALLOCATABLE :: ZP_ZON10M ! zonal Wind at 10 meters (m/s) -REAL, DIMENSION(:), ALLOCATABLE :: ZP_MER10M ! meridian Wind at 10 meters (m/s) -TYPE(LIST_ll), POINTER :: TZFIELDSURF_ll ! list of fields to exchange -INTEGER :: IINFO_ll ! return code of parallel routine -! -! -CHARACTER(LEN=6), DIMENSION(:), ALLOCATABLE :: YSV_SURF ! name of the scalar variables - ! sent to SURFEX -! -REAL :: ZTIMEC -INTEGER :: ILUOUT ! logical unit -! -! Fire model -REAL, DIMENSION(2) :: ZFIRETIME1, ZFIRETIME2 ! CPU time for Blaze perf profiling -REAL, DIMENSION(2) :: ZGRADTIME1, ZGRADTIME2 ! CPU time for Blaze perf profiling -REAL, DIMENSION(2) :: ZPROPAGTIME1, ZPROPAGTIME2 ! CPU time for Blaze perf profiling -REAL, DIMENSION(2) :: ZFLUXTIME1, ZFLUXTIME2 ! CPU time for Blaze perf profiling -REAL, DIMENSION(2) :: ZROSWINDTIME1, ZROSWINDTIME2 ! CPU time for Blaze perf profiling -REAL, DIMENSION(:,:,:,:), ALLOCATABLE :: ZFIREFUELMAP ! Fuel map -CHARACTER(LEN=7) :: YFUELMAPFILE ! Fuel Map file name -TYPE(LIST_ll), POINTER :: TZFIELDFIRE_ll ! list of fields to exchange - -!------------------------------------------------------------------------------- -! -! -ILUOUT=TLUOUT%NLU -IKB= 1+JPVEXT -IKU=NKMAX + 2* JPVEXT -IKE=IKU-JPVEXT -! -CALL GET_INDICE_ll (IIB,IJB,IIE,IJE) -! -PSFTH = XUNDEF -PSFRV = XUNDEF -PSFSV = XUNDEF -PSFCO2 = XUNDEF -PSFU = XUNDEF -PSFV = XUNDEF -PDIR_ALB = XUNDEF -PSCA_ALB = XUNDEF -PEMIS = XUNDEF -PTSRAD = XUNDEF -! -! -!------------------------------------------------------------------------------- -! -!* 1. CONVERSION OF THE ATMOSPHERIC VARIABLES -! --------------------------------------- -! -! 1.1 water vapor -! ----------- - -! -ALLOCATE(ZRV(SIZE(PSFTH,1),SIZE(PSFTH,2),IKU)) -! -IF(NRR>0) THEN - ZRV(:,:,:)=XRT(:,:,:,1) -ELSE - ZRV(:,:,:)=0. -END IF -! -! 1.2 Horizontal wind direction (rad from N clockwise) -! ------------------------- -! -ZU2D(:,:,:)=MXF(XUT(:,:,IKB:IKB)) -ZV2D(:,:,:)=MYF(XVT(:,:,IKB:IKB)) -! -!* angle between Y axis and wind (rad., clockwise) -! -ZALFA = 0. -WHERE(ZU2D(:,:,1)/=0. .OR. ZV2D(:,:,1)/=0.) - ZALFA(:,:)=ATAN2(ZU2D(:,:,1),ZV2D(:,:,1)) -END WHERE -WHERE(ZALFA(:,:)<0.) ZALFA(:,:) = ZALFA(:,:) + 2. * XPI -! -!* angle between North and wind (rad., clockwise) -! -IF (.NOT. LCARTESIAN) THEN - ZDIR = ( (XRPK*(XLON(:,:)-XLON0)) - XBETA ) * XPI/180. + ZALFA -ELSE - ZDIR = - XBETA * XPI/180. + ZALFA -END IF -! -! -! 1.3 Rotate the wind -! --------------- -! -CALL ROTATE_WIND(D,XUT,XVT,XWT, & - XDIRCOSXW, XDIRCOSYW, XDIRCOSZW, & - XCOSSLOPE,XSINSLOPE, & - XDXX,XDYY,XDZZ, & - ZUA,ZVA ) - -! -! 1.4 zonal and meridian components of the wind parallel to the slope -! --------------------------------------------------------------- -! -ZWIND(:,:) = SQRT( ZUA**2 + ZVA**2 ) -! -ZU(:,:) = ZWIND(:,:) * SIN(ZDIR) -ZV(:,:) = ZWIND(:,:) * COS(ZDIR) -! -! 1.5 Horizontal interpolation the thermodynamic fields -! ------------------------------------------------- -! -CALL NORMAL_INTERPOL(XTHT,ZRV,XPABST, & - XDIRCOSXW, XDIRCOSYW, XDIRCOSZW, & - XCOSSLOPE,XSINSLOPE, & - XDXX,XDYY,XDZZ, & - ZTHA,ZRVA,ZEXNA ) -! -DEALLOCATE(ZRV) -! -! -! 1.6 Pressure and Exner function -! --------------------------- -! -! -ZPA(:,:) = XP00 * ZEXNA(:,:) **(XCPD/XRD) -! -ZEXNS(:,:) = 0.5 * ( (XPABST(:,:,IKB-1)/XP00)**(XRD/XCPD) & - +(XPABST(:,:,IKB )/XP00)**(XRD/XCPD) & - ) -ZPS(:,:) = XP00 * ZEXNS(:,:) **(XCPD/XRD) -! -! 1.7 humidity in kg/m3 from the mixing ratio -! --------------------------------------- -! -! -ZQA(:,:) = ZRVA(:,:) * XRHODREF(:,:,IKB) -! -! -! 1.8 Temperature from the potential temperature -! ------------------------------------------ -! -! -ZTA(:,:) = ZTHA(:,:) * ZEXNA(:,:) -! -! -! 1.9 Air density -! ----------- -! -ZRHOA(:,:) = ZPA(:,:)/(XRD * ZTA(:,:) * ((1. + (XRD/XRV)*ZRVA(:,:))/ & - (1. + ZRVA(:,:)))) -! -! -! 1.10 Precipitations -! -------------- -! -ZRAIN=0. -ZSNOW=0. -IF (NRR>2 .AND. SIZE(XINPRR)>0 ) THEN - IF (( CCLOUD(1:3) == 'ICE' .AND. LSEDIC) .OR. & - ((CCLOUD == 'C2R2' .OR. CCLOUD == 'C3R5' .OR. CCLOUD == 'KHKO') .AND. LSEDC) .OR. & - ( CCLOUD=='LIMA' .AND. MSEDC)) THEN - ZRAIN = ZRAIN + XINPRR * XRHOLW + XINPRC * XRHOLW - ELSE - ZRAIN = ZRAIN + XINPRR * XRHOLW - END IF -END IF -IF (CDCONV == 'KAFR') THEN - ZRAIN = ZRAIN + (XPRCONV - XPRSCONV) * XRHOLW - ZSNOW = ZSNOW + XPRSCONV * XRHOLW -END IF -IF( NRR >= 5 .AND. SIZE(XINPRS)>0 ) ZSNOW = ZSNOW + XINPRS * XRHOLW -IF( NRR >= 6 .AND. SIZE(XINPRG)>0 ) ZSNOW = ZSNOW + XINPRG * XRHOLW -IF( NRR >= 7 .AND. SIZE(XINPRH)>0 ) ZSNOW = ZSNOW + XINPRH * XRHOLW -! -! -! 1.11 Solar time -! ---------- -! -IF (.NOT. LCARTESIAN) THEN - ZTSUN(:,:) = MOD(TDTCUR%xtime -XTSIDER*3600. +XLON(:,:)*240., XDAY) -ELSE - ZTSUN(:,:) = MOD(TDTCUR%xtime -XTSIDER*3600. +XLON0 *240., XDAY) -END IF -! -! 1.12 Forcing level -! ------------- -! -ZZREF(:,:) = 0.5*( XZZ(:,:,IKB+1)-XZZ(:,:,IKB) )*XDIRCOSZW(:,:) -! -! -! 1.13 CO2 concentration (kg/m3) -! ----------------- -! -ZCO2(:,:) = XCCO2 * XRHODREF(:,:,IKB) -! -! -! -! 1.14 Blowing snow scheme (optional) -! ----------------- -! -ZBLOWSNOW_2D=0. - -IF(LBLOWSNOW) THEN - KSV_SURF = NSV+NBLOWSNOW_2D ! When blowing snow scheme is used - ! NBLOWSN0W_2D variables are sent to SURFEX through ZP_SV. - ! They refer to the 2D fields advected by MNH including: - ! - total number concentration in Canopy - ! - total mass concentration in Canopy - ! - equivalent concentration in the saltation layer - ! Initialize array of scalar to be sent to SURFEX including 2D blowing snow fields - ALLOCATE(YSV_SURF(KSV_SURF)) - YSV_SURF(1:NSV) = CSV(:) - YSV_SURF(NSV+1:KSV_SURF) = YPBLOWSNOW_2D(:) - - - DO JSV=1,NBLOWSNOW_2D - ZBLOWSNOW_2D(:,:,JSV) = XRSNWCANOS(:,:,JSV)*XTSTEP/XRHODJ(:,:,IKB) - END DO - -ELSE - KSV_SURF = NSV - ALLOCATE(YSV_SURF(KSV_SURF)) - YSV_SURF(:) = CSV(:) -ENDIF -! -!------------------------------------------------------------------------------- -! -!* 2. Call to surface monitor with 2D variables -! ----------------------------------------- -! -! -! initial values: -! -IDIM1 = IIE-IIB+1 -IDIM2 = IJE-IJB+1 -IDIM1D = IDIM1*IDIM2 -! -! -! Transform 2D input fields into 1D: -! -CALL RESHAPE_SURF(IDIM1D) -! -! call to have the cumulated time since beginning of simulation -! -CALL DATETIME_DISTANCE(TDTSEG,TDTCUR,ZTIMEC) - -#ifdef CPLOASIS -IF (LOASIS) THEN - IF ( MOD(ZTIMEC,1.0) .LE. 1E-2 .OR. (1.0 - MOD(ZTIMEC,1.0)) .LE. 1E-2 ) THEN - IF ( NINT(ZTIMEC-(XSEGLEN-DYN_MODEL(1)%XTSTEP)) .LT. 0 ) THEN - WRITE(ILUOUT,*) '----------------------------' - WRITE(ILUOUT,*) ' Reception des champs avec OASIS' - WRITE(ILUOUT,*) 'NINT(ZTIMEC)=', NINT(ZTIMEC) - CALL MNH_OASIS_RECV(CPROGRAM,IDIM1D,SIZE(XSW_BANDS),ZTIMEC+XTSTEP,XTSTEP, & - ZP_ZENITH,XSW_BANDS , & - ZP_TSRAD,ZP_DIR_ALB,ZP_SCA_ALB,ZP_EMIS,ZP_TSURF) - WRITE(ILUOUT,*) '----------------------------' - END IF - END IF -END IF -#endif -! -! Call to surface schemes -! -CALL COUPLING_SURF_ATM_n(YSURF_CUR,'MESONH', 'E',ZTIMEC, & - XTSTEP, TDTCUR%nyear, TDTCUR%nmonth, TDTCUR%nday, TDTCUR%xtime, & - IDIM1D,KSV_SURF,SIZE(XSW_BANDS), & - ZP_TSUN, ZP_ZENITH,ZP_ZENITH, ZP_AZIM, & - ZP_ZREF, ZP_ZREF, ZP_ZS, ZP_U, ZP_V, ZP_QA, ZP_TA, ZP_RHOA, ZP_SV, ZP_CO2, YSV_SURF, & - ZP_RAIN, ZP_SNOW, ZP_LW, ZP_DIR_SW, ZP_SCA_SW, XSW_BANDS, ZP_PS, ZP_PA, & - ZP_SFTQ, ZP_SFTH, ZP_SFTS, ZP_SFCO2, ZP_SFU, ZP_SFV, & - ZP_TSRAD, ZP_DIR_ALB, ZP_SCA_ALB, ZP_EMIS, ZP_TSURF, ZP_Z0, ZP_Z0H, ZP_QSURF, & - ZP_PEW_A_COEF, ZP_PEW_B_COEF, & - ZP_PET_A_COEF, ZP_PEQ_A_COEF, ZP_PET_B_COEF, ZP_PEQ_B_COEF,ZP_ZWS, & - 'OK' ) -! -#ifdef CPLOASIS -IF (LOASIS) THEN - IF ( MOD(ZTIMEC,1.0) .LE. 1E-2 .OR. (1.0 - MOD(ZTIMEC,1.0)) .LE. 1E-2 ) THEN - IF (NINT(ZTIMEC-(XSEGLEN-DYN_MODEL(1)%XTSTEP)) .LT. 0) THEN - WRITE(ILUOUT,*) '----------------------------' - WRITE(ILUOUT,*) ' Envoi des champs avec OASIS' - WRITE(ILUOUT,*) 'NINT(ZTIMEC)=', NINT(ZTIMEC) - CALL MNH_OASIS_SEND(CPROGRAM,IDIM1D,ZTIMEC+XTSTEP,XTSTEP) - WRITE(ILUOUT,*) '----------------------------' - END IF - END IF -END IF -#endif -! -IF (CPROGRAM=='DIAG ' .OR. LDIAG_IN_RUN) THEN - CALL DIAG_SURF_ATM_n(YSURF_CUR,'MESONH') - CALL MNHGET_SURF_PARAM_n( PRN = ZP_RN, PH = ZP_H, PLE = ZP_LE, PLEI = ZP_LEI, & - PGFLUX = ZP_GFLUX, PT2M = ZP_T2M, PQ2M = ZP_Q2M, PHU2M = ZP_HU2M, & - PZON10M = ZP_ZON10M, PMER10M = ZP_MER10M ) -END IF -! -! Transform 1D output fields into 2D: -! -CALL UNSHAPE_SURF(IDIM1,IDIM2) -#ifdef MNH_FOREFIRE -!------------------------! -! COUPLING WITH FOREFIRE ! -!------------------------! - -IF ( LFOREFIRE ) THEN - CALL FOREFIRE_DUMP_FIELDS_n(XUT, XVT, XWT, XSVT& - , XTHT, XRT(:,:,:,1), XPABST, XTKET& - , IDIM1+2, IDIM2+2, NKMAX+2) -END IF - -IF ( FFCOUPLING ) THEN - - CALL SEND_GROUND_WIND_n(XUT, XVT, IKB, IINFO_ll) - - CALL FOREFIRE_RECEIVE_PARAL_n() - - CALL COUPLING_FOREFIRE_n(XTSTEP, ZSFTH, ZSFTQ, ZSFTS) - - CALL FOREFIRE_SEND_PARAL_n(IINFO_ll) - -END IF - -FF_TIME = FF_TIME + XTSTEP -#endif -! -! Friction of components along slope axes (U: largest local slope axis, V: zero slope axis) -! -! -PSFU(:,:) = 0. -PSFV(:,:) = 0. -! -WHERE (ZSFU(:,:)/=XUNDEF .AND. ZWIND(:,:)>0.) - PSFU(:,:) = - SQRT(ZSFU**2+ZSFV**2) * ZUA(:,:) / ZWIND(:,:) / XRHODREF(:,:,IKB) - PSFV(:,:) = - SQRT(ZSFU**2+ZSFV**2) * ZVA(:,:) / ZWIND(:,:) / XRHODREF(:,:,IKB) -END WHERE -! - -!* 2.1 Blaze Fire Model -! ---------------- -! -IF (LBLAZE) THEN - ! get start time - CALL SECOND_MNH2( ZFIRETIME1 ) - - !* 2.1.1 Local variables allocation - ! -------------------------- - ! - - ! Parallel fuel - NULLIFY(TZFIELDFIRE_ll) - IF (KTCOUNT <= 1) THEN - ! fuelmap - SELECT CASE (CPROPAG_MODEL) - CASE('SANTONI2011') - ! - ALLOCATE( ZFIREFUELMAP(SIZE(XLSPHI,1), SIZE(XLSPHI,2), SIZE(XLSPHI,3), 22) ); - ! Parallel fuel - CALL ADD4DFIELD_ll( TZFIELDFIRE_ll, ZFIREFUELMAP(:,:,:,1::22), 'MODEL_n::ZFIREFUELMAP' ) - ! Default value - ZFIREFUELMAP(:,:,:,:) = 0. - END SELECT - - !* 2.1.2 Read fuel map file - ! ------------------ - ! - ! Fuel map file name - YFUELMAPFILE = 'FuelMap' - ! - CALL FIRE_READFUEL( TPFILE, ZFIREFUELMAP, XFMIGNITION, XFMWALKIG ) - - !* 2.1.3 Ignition LS function with ignition map - ! -------------------------------------- - ! - SELECT CASE (CFIRE_CPL_MODE) - CASE('2WAYCPL', 'ATM2FIR') - ! force ignition - WHERE (XFMIGNITION <= TDTCUR%XTIME ) XLSPHI = 1. - ! walking ignition - CALL FIRE_LS_RECONSTRUCTION_FROM_BMAP( XLSPHI, XFMWALKIG, 0.) - ! - !* 2.1.4 Update BMAP - ! ----------- - ! - WHERE (XLSPHI >= .5 .AND. XBMAP < 0) XBMAP = TDTCUR%XTIME - ! - CASE('FIR2ATM') - CALL FIRE_READBMAP(TPFILE,XBMAP) - - END SELECT - ! - !* 2.1.5 Compute R0, A, Wf0, R00 - ! ----------------------- - ! - SELECT CASE (CPROPAG_MODEL) - CASE('SANTONI2011') - CALL FIRE_NOWINDROS( ZFIREFUELMAP, XFMR0, XFMRFA, XFMWF0, XFMR00, XFMFUELTYPE, XFIRETAU, XFLUXPARAMH, & - XFLUXPARAMW, XFMASE, XFMAWC ) - END SELECT - ! - !* 2.1.6 Compute orographic gradient - ! --------------------------- - CALL FIRE_GRAD_OROGRAPHY( XZS, XFMGRADOROX, XFMGRADOROY ) - ! - !* 2.1.7 Test halo size - ! -------------- - IF (NHALO < 2 .AND. NFIRE_WENO_ORDER == 3) THEN - WRITE(ILUOUT,'(A/A)') 'ERROR BLAZE-FIRE : WENO3 fire gradient calculation needs NHALO >= 2' - !callabortstop - CALL PRINT_MSG(NVERB_FATAL,'GEN','GROUND_PARAM_n','') - ELSEIF (NHALO < 3 .AND. NFIRE_WENO_ORDER == 5) THEN - WRITE(ILUOUT,'(A/A)') 'ERROR : WENO5 fire gradient calculation needs NHALO >= 3' - !callabortstop - CALL PRINT_MSG(NVERB_FATAL,'GEN','GROUND_PARAM_n','') - END IF - ! - END IF - ! - !* 2.1.6 Compute grad of level set function phi - ! -------------------------------------- - ! - SELECT CASE (CFIRE_CPL_MODE) - CASE('2WAYCPL', 'ATM2FIR') - ! get time 1 - CALL SECOND_MNH2( ZGRADTIME1 ) - CALL FIRE_GRADPHI( XLSPHI, XGRADLSPHIX, XGRADLSPHIY ) - - ! get time 2 - CALL SECOND_MNH2( ZGRADTIME2 ) - XGRADPERF = XGRADPERF + ZGRADTIME2 - ZGRADTIME1 - ! - !* 2.1.7 Get horizontal wind speed projected on LS gradient direction - ! ------------------------------------------------------------ - ! - CALL FIRE_GETWIND( XUT, XVT, XWT, XGRADLSPHIX, XGRADLSPHIY, XFIREWIND, KTCOUNT, XTSTEP, XFMGRADOROX, XFMGRADOROY ) - ! - !* 2.1.8 Compute ROS XFIRERW with wind - ! ----------------------------- - ! - ! - SELECT CASE (CPROPAG_MODEL) - CASE('SANTONI2011') - CALL FIRE_RATEOFSPREAD( XFMFUELTYPE, XFMR0, XFMRFA, XFMWF0, XFMR00, XFIREWIND, XGRADLSPHIX, XGRADLSPHIY, & - XFMGRADOROX, XFMGRADOROY, XFIRERW ) - END SELECT - CALL SECOND_MNH2( ZROSWINDTIME2 ) - XROSWINDPERF = XROSWINDPERF + ZROSWINDTIME2 - ZGRADTIME2 - ! - !* 2.1.8 Integrate model on atm time step to propagate - ! --------------------------------------------- - ! - SELECT CASE (CPROPAG_MODEL) - CASE('SANTONI2011') - CALL FIRE_PROPAGATE( XLSPHI, XBMAP, XFMIGNITION, XFMWALKIG, XGRADLSPHIX, XGRADLSPHIY, XTSTEP, XFIRERW ) - END SELECT - CALL SECOND_MNH2( ZPROPAGTIME2 ) - XPROPAGPERF = XPROPAGPERF + ZPROPAGTIME2 - ZROSWINDTIME2 - ! - CASE('FIR2ATM') - ! - CALL SECOND_MNH2( ZPROPAGTIME1 ) - CALL FIRE_LS_RECONSTRUCTION_FROM_BMAP( XLSPHI, XBMAP, XTSTEP ) - CALL SECOND_MNH2( ZPROPAGTIME2 ) - XPROPAGPERF = XPROPAGPERF + ZPROPAGTIME2 - ZPROPAGTIME1 - XGRADPERF(:) = 0. - ! - END SELECT - ! - !* 2.1.8 Compute fluxes - ! -------------- - ! - SELECT CASE (CFIRE_CPL_MODE) - CASE('2WAYCPL','FIR2ATM') - CALL SECOND_MNH2( ZFLUXTIME1 ) - ! 2 way coupling - CALL FIRE_HEATFLUXES( XLSPHI, XBMAP, XFIRETAU, XTSTEP, XFLUXPARAMH, XFLUXPARAMW, XFMFLUXHDH, XFMFLUXHDW, XFMASE, XFMAWC ) - ! vertical distribution of fire heat fluxes - CALL FIRE_VERTICALFLUXDISTRIB( XFMFLUXHDH, XFMFLUXHDW, XRTHS, XRRS, ZSFTS, XEXNREF, XRHODJ, XRT, XRHODREF ) - ! - CALL SECOND_MNH2( ZFLUXTIME2 ) - XFLUXPERF = XFLUXPERF + ZFLUXTIME2 - ZFLUXTIME1 - CASE DEFAULT - XFLUXPERF(:) = 0. - END SELECT - ! get end time - CALL SECOND_MNH2( ZFIRETIME2 ) - ! add to Blaze time - XFIREPERF = XFIREPERF + ZFIRETIME2 - ZFIRETIME1 -END IF -!* conversion from H (W/m2) to w'Theta' -! -PSFTH(:,:) = ZSFTH(:,:) / XCPD / XRHODREF(:,:,IKB) -! -! -!* conversion from water flux (kg/m2/s) to w'rv' -! -PSFRV(:,:) = ZSFTQ(:,:) / XRHODREF(:,:,IKB) -! -! -!* conversion from scalar flux (kg/m2/s) to w'rsv' -! -IF(NSV .GT. 0) THEN - DO JSV=1,NSV - PSFSV(:,:,JSV) = ZSFTS(:,:,JSV) / XRHODREF(:,:,IKB) - END DO -END IF -! -!* conversion from chemistry flux (molec/m2/s) to (ppp.m.s-1) -! -IF (LUSECHEM) THEN - DO JSV=NSV_CHEMBEG,NSV_CHEMEND - PSFSV(:,:,JSV) = ZSFTS(:,:,JSV) * XMD / ( XAVOGADRO * XRHODREF(:,:,IKB)) - IF ((LCHEMDIAG).AND.(CPROGRAM == 'DIAG ')) XCHFLX(:,:,JSV-NSV_CHEMBEG+1) = PSFSV(:,:,JSV) - END DO -ELSE - PSFSV(:,:,NSV_CHEMBEG:NSV_CHEMEND) = 0. -END IF -! -!* conversion from dust flux (kg/m2/s) to (ppp.m.s-1) -! -IF (LDUST) THEN - DO JSV=NSV_DSTBEG,NSV_DSTEND - PSFSV(:,:,JSV) = ZSFTS(:,:,JSV) * XMD / (XMOLARWEIGHT_DUST * XRHODREF(:,:,IKB)) - END DO -ELSE - PSFSV(:,:,NSV_DSTBEG:NSV_DSTEND) = 0. -END IF -! -!* conversion from sea salt flux (kg/m2/s) to (ppp.m.s-1) -! -IF (LSALT) THEN - DO JSV=NSV_SLTBEG,NSV_SLTEND - PSFSV(:,:,JSV) = ZSFTS(:,:,JSV) * XMD / (XMOLARWEIGHT_SALT * XRHODREF(:,:,IKB)) - END DO -ELSE - PSFSV(:,:,NSV_SLTBEG:NSV_SLTEND) = 0. -END IF -! -!* conversion from aerosol flux (molec/m2/s) to (ppp.m.s-1) -! -IF (LORILAM) THEN - DO JSV=NSV_AERBEG,NSV_AEREND - PSFSV(:,:,JSV) = ZSFTS(:,:,JSV) * XMD / ( XAVOGADRO * XRHODREF(:,:,IKB)) - END DO -ELSE - PSFSV(:,:,NSV_AERBEG:NSV_AEREND) = 0. -END IF -! -!* conversion from blowing snow flux (kg/m2/s) to [kg(snow)/kg(dry air).m.s-1] -! -IF (LBLOWSNOW) THEN - DO JSV=NSV_SNWBEG,NSV_SNWEND - PSFSV(:,:,JSV) = ZSFTS(:,:,JSV)/ (ZRHOA(:,:)) - END DO - !* Update tendency for blowing snow 2D fields - DO JSV=1,(NBLOWSNOW_2D) - XRSNWCANOS(:,:,JSV) = ZBLOWSNOW_2D(:,:,JSV)*XRHODJ(:,:,IKB)/(XTSTEP*ZRHOA(:,:)) - END DO - -ELSE - PSFSV(:,:,NSV_SNWBEG:NSV_SNWEND) = 0. -END IF -! -!* conversion from CO2 flux (kg/m2/s) to w'CO2' -! -PSFCO2(:,:) = ZSFCO2(:,:) / XRHODREF(:,:,IKB) -! -! -!* Diagnostics -! ----------- -! -! -IF (LDIAG_IN_RUN) THEN - ! - XCURRENT_SFCO2(:,:) = ZSFCO2(:,:) - XCURRENT_DSTAOD(:,:)=0.0 - XCURRENT_SLTAOD(:,:)=0.0 - IF (CRAD/='NONE') THEN - XCURRENT_LWD (:,:) = XFLALWD(:,:) - XCURRENT_SWD (:,:) = SUM(XDIRSRFSWD(:,:,:)+XSCAFLASWD(:,:,:),DIM=3) - XCURRENT_LWU (:,:) = XLWU(:,:,IKB) - XCURRENT_SWU (:,:) = XSWU(:,:,IKB) - XCURRENT_SWDIR(:,:) = SUM(XDIRSRFSWD,DIM=3) - XCURRENT_SWDIFF(:,:) = SUM(XSCAFLASWD(:,:,:),DIM=3) - DO JK=IKB,IKE - IKRAD = JK - 1 - DO JJ=IJB,IJE - DO JI=IIB,IIE - XCURRENT_DSTAOD(JI,JJ)=XCURRENT_DSTAOD(JI,JJ)+XAER(JI,JJ,IKRAD,3) - XCURRENT_SLTAOD(JI,JJ)=XCURRENT_SLTAOD(JI,JJ)+XAER(JI,JJ,IKRAD,2) - ENDDO - ENDDO - ENDDO - END IF -! - NULLIFY(TZFIELDSURF_ll) - CALL ADD2DFIELD_ll( TZFIELDSURF_ll,XCURRENT_RN, 'GROUND_PARAM_n::XCURRENT_RN' ) - CALL ADD2DFIELD_ll( TZFIELDSURF_ll,XCURRENT_H, 'GROUND_PARAM_n::XCURRENT_H' ) - CALL ADD2DFIELD_ll( TZFIELDSURF_ll,XCURRENT_LE, 'GROUND_PARAM_n::XCURRENT_LE' ) - CALL ADD2DFIELD_ll( TZFIELDSURF_ll,XCURRENT_GFLUX, 'GROUND_PARAM_n::XCURRENT_GFLUX' ) - CALL ADD2DFIELD_ll( TZFIELDSURF_ll,XCURRENT_SWD, 'GROUND_PARAM_n::XCURRENT_SWD' ) - CALL ADD2DFIELD_ll( TZFIELDSURF_ll,XCURRENT_SWU, 'GROUND_PARAM_n::XCURRENT_SWU' ) - CALL ADD2DFIELD_ll( TZFIELDSURF_ll,XCURRENT_LWD, 'GROUND_PARAM_n::XCURRENT_LWD' ) - CALL ADD2DFIELD_ll( TZFIELDSURF_ll,XCURRENT_LWU, 'GROUND_PARAM_n::XCURRENT_LWU' ) - CALL ADD2DFIELD_ll( TZFIELDSURF_ll,XCURRENT_T2M, 'GROUND_PARAM_n::XCURRENT_T2M' ) - CALL ADD2DFIELD_ll( TZFIELDSURF_ll,XCURRENT_Q2M, 'GROUND_PARAM_n::XCURRENT_Q2M' ) - CALL ADD2DFIELD_ll( TZFIELDSURF_ll,XCURRENT_HU2M, 'GROUND_PARAM_n::XCURRENT_HU2M' ) - CALL ADD2DFIELD_ll( TZFIELDSURF_ll,XCURRENT_ZON10M, 'GROUND_PARAM_n::XCURRENT_ZON10M' ) - CALL ADD2DFIELD_ll( TZFIELDSURF_ll,XCURRENT_MER10M, 'GROUND_PARAM_n::XCURRENT_MER10M' ) - CALL ADD2DFIELD_ll( TZFIELDSURF_ll,XCURRENT_DSTAOD, 'GROUND_PARAM_n::XCURRENT_DSTAOD' ) - CALL ADD2DFIELD_ll( TZFIELDSURF_ll,XCURRENT_SLTAOD, 'GROUND_PARAM_n::XCURRENT_SLTAOD' ) - CALL ADD2DFIELD_ll( TZFIELDSURF_ll,XCURRENT_ZWS, 'GROUND_PARAM_n::XCURRENT_ZWS' ) - CALL ADD2DFIELD_ll( TZFIELDSURF_ll,XCURRENT_SFCO2, 'GROUND_PARAM_n::XCURRENT_SFCO2' ) - - CALL UPDATE_HALO_ll(TZFIELDSURF_ll,IINFO_ll) - CALL CLEANLIST_ll(TZFIELDSURF_ll) -END IF -! -IF (LBLAZE) THEN - IF (KTCOUNT <= 1) THEN - DEALLOCATE(ZFIREFUELMAP) - END IF - CALL CLEANLIST_ll(TZFIELDFIRE_ll) -END IF -!================================================================================== -! -CONTAINS -! -!================================================================================== -! -SUBROUTINE RESHAPE_SURF(KDIM1D) -! -INTEGER, INTENT(IN) :: KDIM1D -INTEGER, DIMENSION(1) :: ISHAPE_1 -! -ISHAPE_1 = (/KDIM1D/) -! -ALLOCATE(ZP_TSUN (KDIM1D)) -ALLOCATE(ZP_ZENITH (KDIM1D)) -ALLOCATE(ZP_AZIM (KDIM1D)) -ALLOCATE(ZP_ZREF (KDIM1D)) -ALLOCATE(ZP_ZS (KDIM1D)) -ALLOCATE(ZP_U (KDIM1D)) -ALLOCATE(ZP_V (KDIM1D)) -ALLOCATE(ZP_QA (KDIM1D)) -ALLOCATE(ZP_TA (KDIM1D)) -ALLOCATE(ZP_RHOA (KDIM1D)) -ALLOCATE(ZP_SV (KDIM1D,KSV_SURF)) -ALLOCATE(ZP_CO2 (KDIM1D)) -ALLOCATE(ZP_RAIN (KDIM1D)) -ALLOCATE(ZP_SNOW (KDIM1D)) -ALLOCATE(ZP_LW (KDIM1D)) -ALLOCATE(ZP_DIR_SW (KDIM1D,SIZE(XDIRSRFSWD,3))) -ALLOCATE(ZP_SCA_SW (KDIM1D,SIZE(XSCAFLASWD,3))) -ALLOCATE(ZP_PS (KDIM1D)) -ALLOCATE(ZP_PA (KDIM1D)) -ALLOCATE(ZP_ZWS (KDIM1D)) - -ALLOCATE(ZP_SFTQ (KDIM1D)) -ALLOCATE(ZP_SFTH (KDIM1D)) -ALLOCATE(ZP_SFU (KDIM1D)) -ALLOCATE(ZP_SFV (KDIM1D)) -ALLOCATE(ZP_SFTS (KDIM1D,KSV_SURF)) -ALLOCATE(ZP_SFCO2 (KDIM1D)) -ALLOCATE(ZP_TSRAD (KDIM1D)) -ALLOCATE(ZP_DIR_ALB (KDIM1D,SIZE(PDIR_ALB,3))) -ALLOCATE(ZP_SCA_ALB (KDIM1D,SIZE(PSCA_ALB,3))) -ALLOCATE(ZP_EMIS (KDIM1D)) -ALLOCATE(ZP_TSURF (KDIM1D)) -ALLOCATE(ZP_Z0 (KDIM1D)) -ALLOCATE(ZP_Z0H (KDIM1D)) -ALLOCATE(ZP_QSURF (KDIM1D)) -ALLOCATE(ZP_RN (KDIM1D)) -ALLOCATE(ZP_H (KDIM1D)) -ALLOCATE(ZP_LE (KDIM1D)) -ALLOCATE(ZP_LEI (KDIM1D)) -ALLOCATE(ZP_GFLUX (KDIM1D)) -ALLOCATE(ZP_T2M (KDIM1D)) -ALLOCATE(ZP_Q2M (KDIM1D)) -ALLOCATE(ZP_HU2M (KDIM1D)) -ALLOCATE(ZP_ZON10M (KDIM1D)) -ALLOCATE(ZP_MER10M (KDIM1D)) - -!* explicit coupling only -ALLOCATE(ZP_PEW_A_COEF (KDIM1D)) -ALLOCATE(ZP_PEW_B_COEF (KDIM1D)) -ALLOCATE(ZP_PET_A_COEF (KDIM1D)) -ALLOCATE(ZP_PEQ_A_COEF (KDIM1D)) -ALLOCATE(ZP_PET_B_COEF (KDIM1D)) -ALLOCATE(ZP_PEQ_B_COEF (KDIM1D)) - -ZP_TSUN(:) = RESHAPE(ZTSUN(IIB:IIE,IJB:IJE), ISHAPE_1) -ZP_TA(:) = RESHAPE(ZTA(IIB:IIE,IJB:IJE), ISHAPE_1) -ZP_QA(:) = RESHAPE(ZQA(IIB:IIE,IJB:IJE), ISHAPE_1) -ZP_RHOA(:) = RESHAPE(ZRHOA(IIB:IIE,IJB:IJE), ISHAPE_1) -ZP_U(:) = RESHAPE(ZU(IIB:IIE,IJB:IJE), ISHAPE_1) -ZP_V(:) = RESHAPE(ZV(IIB:IIE,IJB:IJE), ISHAPE_1) -ZP_PS(:) = RESHAPE(ZPS(IIB:IIE,IJB:IJE), ISHAPE_1) -ZP_PA(:) = RESHAPE(ZPA(IIB:IIE,IJB:IJE), ISHAPE_1) -ZP_ZS(:) = RESHAPE(XZS(IIB:IIE,IJB:IJE), ISHAPE_1) -ZP_CO2(:) = RESHAPE(ZCO2(IIB:IIE,IJB:IJE), ISHAPE_1) -ZP_SNOW(:) = RESHAPE(ZSNOW(IIB:IIE,IJB:IJE), ISHAPE_1) -ZP_RAIN(:) = RESHAPE(ZRAIN(IIB:IIE,IJB:IJE), ISHAPE_1) -ZP_ZREF(:) = RESHAPE(ZZREF(IIB:IIE,IJB:IJE), ISHAPE_1) -ZP_ZWS(:) = RESHAPE(XZWS(IIB:IIE,IJB:IJE), ISHAPE_1) - -DO JLAYER=1,NSV - ZP_SV(:,JLAYER) = RESHAPE(XSVT(IIB:IIE,IJB:IJE,IKB,JLAYER), ISHAPE_1) -END DO -! -IF(LBLOWSNOW) THEN - DO JLAYER=1,NBLOWSNOW_2D - ZP_SV(:,NSV+JLAYER) = RESHAPE(ZBLOWSNOW_2D(IIB:IIE,IJB:IJE,JLAYER), ISHAPE_1) - END DO -END IF -! -!chemical conversion : from part/part to molec./m3 -DO JLAYER=NSV_CHEMBEG,NSV_CHEMEND - ZP_SV(:,JLAYER) = ZP_SV(:,JLAYER) * XAVOGADRO * ZP_RHOA(:) / XMD -END DO -DO JLAYER=NSV_AERBEG,NSV_AEREND - ZP_SV(:,JLAYER) = ZP_SV(:,JLAYER) * XAVOGADRO * ZP_RHOA(:) / XMD -END DO -!dust conversion : from part/part to kg/m3 -DO JLAYER=NSV_DSTBEG,NSV_DSTEND - ZP_SV(:,JLAYER) = ZP_SV(:,JLAYER) * XMOLARWEIGHT_DUST* ZP_RHOA(:) / XMD -END DO -!sea salt conversion : from part/part to kg/m3 -DO JLAYER=NSV_SLTBEG,NSV_SLTEND - ZP_SV(:,JLAYER) = ZP_SV(:,JLAYER) * XMOLARWEIGHT_SALT* ZP_RHOA(:) / XMD -END DO -! -!blowing snow conversion : from kg(snow)/kg(dry air) to kg(snow)/m3 -DO JLAYER=NSV_SNWBEG,NSV_SNWEND - ZP_SV(:,JLAYER) = ZP_SV(:,JLAYER) * ZP_RHOA(:) -END DO - -IF(LBLOWSNOW) THEN ! Convert 2D blowing snow fields - ! from kg(snow)/kg(dry air) to kg(snow)/m3 - DO JLAYER=(NSV+1),KSV_SURF - ZP_SV(:,JLAYER) = ZP_SV(:,JLAYER) * ZP_RHOA(:) - END DO -END IF -! -ZP_ZENITH(:) = RESHAPE(XZENITH(IIB:IIE,IJB:IJE), ISHAPE_1) -ZP_AZIM (:) = RESHAPE(XAZIM (IIB:IIE,IJB:IJE), ISHAPE_1) -ZP_LW(:) = RESHAPE(XFLALWD(IIB:IIE,IJB:IJE), ISHAPE_1) -DO JLAYER=1,SIZE(XDIRSRFSWD,3) - ZP_DIR_SW(:,JLAYER) = RESHAPE(XDIRSRFSWD(IIB:IIE,IJB:IJE,JLAYER), ISHAPE_1) - ZP_SCA_SW(:,JLAYER) = RESHAPE(XSCAFLASWD(IIB:IIE,IJB:IJE,JLAYER), ISHAPE_1) -END DO -! -ZP_PEW_A_COEF = 0. -ZP_PEW_B_COEF = 0. -ZP_PET_A_COEF = 0. -ZP_PEQ_A_COEF = 0. -ZP_PET_B_COEF = 0. -ZP_PEQ_B_COEF = 0. -! -END SUBROUTINE RESHAPE_SURF -!================================================i================================= -SUBROUTINE UNSHAPE_SURF(KDIM1,KDIM2) -! -INTEGER, INTENT(IN) :: KDIM1, KDIM2 -INTEGER, DIMENSION(2) :: ISHAPE_2 -! -ISHAPE_2 = (/KDIM1,KDIM2/) -! -! Arguments in call to surface: -! -ZSFTH = XUNDEF -ZSFTQ = XUNDEF -IF (NSV>0) ZSFTS = XUNDEF -ZSFCO2 = XUNDEF -ZSFU = XUNDEF -ZSFV = XUNDEF -! -ZSFTH (IIB:IIE,IJB:IJE) = RESHAPE(ZP_SFTH(:), ISHAPE_2) -ZSFTQ (IIB:IIE,IJB:IJE) = RESHAPE(ZP_SFTQ(:), ISHAPE_2) -DO JLAYER=1,SIZE(PSFSV,3) - ZSFTS (IIB:IIE,IJB:IJE,JLAYER) = RESHAPE(ZP_SFTS(:,JLAYER), ISHAPE_2) -END DO -ZSFCO2 (IIB:IIE,IJB:IJE) = RESHAPE(ZP_SFCO2(:), ISHAPE_2) -ZSFU (IIB:IIE,IJB:IJE) = RESHAPE(ZP_SFU(:), ISHAPE_2) -ZSFV (IIB:IIE,IJB:IJE) = RESHAPE(ZP_SFV(:), ISHAPE_2) -DO JLAYER=1,SIZE(PEMIS,3) - PEMIS (IIB:IIE,IJB:IJE,JLAYER) = RESHAPE(ZP_EMIS(:), ISHAPE_2) -END DO -PTSRAD (IIB:IIE,IJB:IJE) = RESHAPE(ZP_TSRAD(:), ISHAPE_2) -IF(LBLOWSNOW) THEN - DO JLAYER=1,NBLOWSNOW_2D - ZBLOWSNOW_2D(IIB:IIE,IJB:IJE,JLAYER) = RESHAPE(ZP_SFTS(:,NSV+JLAYER), ISHAPE_2) - END DO -END IF -! -IF (LDIAG_IN_RUN) THEN - XCURRENT_RN (IIB:IIE,IJB:IJE) = RESHAPE(ZP_RN(:), ISHAPE_2) - XCURRENT_H (IIB:IIE,IJB:IJE) = RESHAPE(ZP_H (:), ISHAPE_2) - XCURRENT_LE (IIB:IIE,IJB:IJE) = RESHAPE(ZP_LE(:), ISHAPE_2) - XCURRENT_LEI (IIB:IIE,IJB:IJE) = RESHAPE(ZP_LEI(:), ISHAPE_2) - XCURRENT_GFLUX (IIB:IIE,IJB:IJE) = RESHAPE(ZP_GFLUX(:), ISHAPE_2) - XCURRENT_T2M (IIB:IIE,IJB:IJE) = RESHAPE(ZP_T2M(:), ISHAPE_2) - XCURRENT_Q2M (IIB:IIE,IJB:IJE) = RESHAPE(ZP_Q2M(:), ISHAPE_2) - XCURRENT_HU2M (IIB:IIE,IJB:IJE) = RESHAPE(ZP_HU2M(:), ISHAPE_2) - XCURRENT_ZON10M (IIB:IIE,IJB:IJE) = RESHAPE(ZP_ZON10M(:), ISHAPE_2) - XCURRENT_MER10M (IIB:IIE,IJB:IJE) = RESHAPE(ZP_MER10M(:), ISHAPE_2) - XCURRENT_ZWS (IIB:IIE,IJB:IJE) = RESHAPE(ZP_ZWS(:), ISHAPE_2) -ENDIF -! -DO JLAYER=1,SIZE(PDIR_ALB,3) - PDIR_ALB(IIB:IIE,IJB:IJE,JLAYER) = RESHAPE(ZP_DIR_ALB(:,JLAYER), ISHAPE_2) - PSCA_ALB(IIB:IIE,IJB:IJE,JLAYER) = RESHAPE(ZP_SCA_ALB(:,JLAYER), ISHAPE_2) -END DO -! -DEALLOCATE(ZP_TSUN ) -DEALLOCATE(ZP_ZENITH ) -DEALLOCATE(ZP_AZIM ) -DEALLOCATE(ZP_ZREF ) -DEALLOCATE(ZP_ZS ) -DEALLOCATE(ZP_U ) -DEALLOCATE(ZP_V ) -DEALLOCATE(ZP_QA ) -DEALLOCATE(ZP_TA ) -DEALLOCATE(ZP_RHOA ) -DEALLOCATE(ZP_SV ) -DEALLOCATE(ZP_CO2 ) -DEALLOCATE(ZP_RAIN ) -DEALLOCATE(ZP_SNOW ) -DEALLOCATE(ZP_LW ) -DEALLOCATE(ZP_DIR_SW ) -DEALLOCATE(ZP_SCA_SW ) -DEALLOCATE(ZP_PS ) -DEALLOCATE(ZP_PA ) -DEALLOCATE(ZP_ZWS ) - -DEALLOCATE(ZP_SFTQ ) -DEALLOCATE(ZP_SFTH ) -DEALLOCATE(ZP_SFTS ) -DEALLOCATE(ZP_SFCO2 ) -DEALLOCATE(ZP_SFU ) -DEALLOCATE(ZP_SFV ) -DEALLOCATE(ZP_TSRAD ) -DEALLOCATE(ZP_DIR_ALB ) -DEALLOCATE(ZP_SCA_ALB ) -DEALLOCATE(ZP_EMIS ) -DEALLOCATE(ZP_RN ) -DEALLOCATE(ZP_H ) -DEALLOCATE(ZP_LE ) -DEALLOCATE(ZP_LEI ) -DEALLOCATE(ZP_GFLUX ) -DEALLOCATE(ZP_T2M ) -DEALLOCATE(ZP_Q2M ) -DEALLOCATE(ZP_HU2M ) -DEALLOCATE(ZP_ZON10M ) -DEALLOCATE(ZP_MER10M ) - -DEALLOCATE(ZP_PEW_A_COEF ) -DEALLOCATE(ZP_PEW_B_COEF ) -DEALLOCATE(ZP_PET_A_COEF ) -DEALLOCATE(ZP_PEQ_A_COEF ) -DEALLOCATE(ZP_PET_B_COEF ) -DEALLOCATE(ZP_PEQ_B_COEF ) -! -END SUBROUTINE UNSHAPE_SURF -!================================================================================== -! -END SUBROUTINE GROUND_PARAM_n diff --git a/src/mesonh/ext/ibm_affectv.f90 b/src/mesonh/ext/ibm_affectv.f90 deleted file mode 100644 index 74df9a13dcc052c86357bf674ab178fff8dcfae7..0000000000000000000000000000000000000000 --- a/src/mesonh/ext/ibm_affectv.f90 +++ /dev/null @@ -1,402 +0,0 @@ -!MNH_LIC Copyright 2019-2021 CNRS, Meteo-France and Universite Paul Sabatier -!MNH_LIC This is part of the Meso-NH software governed by the CeCILL-C licence -!MNH_LIC version 1. See LICENSE, CeCILL-C_V1-en.txt and CeCILL-C_V1-fr.txt -!MNH_LIC for details. version 1. -!----------------------------------------------------------------- -! -! ####################### -MODULE MODI_IBM_AFFECTV - ! ####################### - ! - INTERFACE - ! - SUBROUTINE IBM_AFFECTV(PVAR,PVAR2,PVAR3,HVAR,KIBM_LAYER,HIBM_MODE_INTE3,& - HIBM_FORC_BOUNR,PRADIUS,PPOWERS,& - HIBM_MODE_INT1N,HIBM_TYPE_BOUNN,HIBM_MODE_BOUNN,HIBM_FORC_BOUNN,PIBM_FORC_BOUNN,& - HIBM_MODE_INT1T,HIBM_TYPE_BOUNT,HIBM_MODE_BOUNT,HIBM_FORC_BOUNT,PIBM_FORC_BOUNT,& - HIBM_MODE_INT1C,HIBM_TYPE_BOUNC,HIBM_MODE_BOUNC,HIBM_FORC_BOUNC,PIBM_FORC_BOUNC,PXMU,PDIV) - ! - REAL, DIMENSION(:,:,:) ,INTENT(INOUT) :: PVAR - REAL, DIMENSION(:,:,:,:) ,INTENT(IN) :: PVAR2,PVAR3 - CHARACTER(LEN=1) ,INTENT(IN) :: HVAR - INTEGER ,INTENT(IN) :: KIBM_LAYER - REAL ,INTENT(IN) :: PRADIUS - REAL ,INTENT(IN) :: PPOWERS - CHARACTER(LEN=3) ,INTENT(IN) :: HIBM_FORC_BOUNR - CHARACTER(LEN=3) ,INTENT(IN) :: HIBM_MODE_INTE3 - CHARACTER(LEN=3) ,INTENT(IN) :: HIBM_MODE_INT1N - CHARACTER(LEN=3) ,INTENT(IN) :: HIBM_TYPE_BOUNN - CHARACTER(LEN=3) ,INTENT(IN) :: HIBM_MODE_BOUNN - CHARACTER(LEN=3) ,INTENT(IN) :: HIBM_FORC_BOUNN - REAL ,INTENT(IN) :: PIBM_FORC_BOUNN - CHARACTER(LEN=3) ,INTENT(IN) :: HIBM_MODE_INT1T - CHARACTER(LEN=3) ,INTENT(IN) :: HIBM_TYPE_BOUNT - CHARACTER(LEN=3) ,INTENT(IN) :: HIBM_MODE_BOUNT - CHARACTER(LEN=3) ,INTENT(IN) :: HIBM_FORC_BOUNT - REAL ,INTENT(IN) :: PIBM_FORC_BOUNT - CHARACTER(LEN=3) ,INTENT(IN) :: HIBM_MODE_INT1C - CHARACTER(LEN=3) ,INTENT(IN) :: HIBM_TYPE_BOUNC - CHARACTER(LEN=3) ,INTENT(IN) :: HIBM_MODE_BOUNC - CHARACTER(LEN=3) ,INTENT(IN) :: HIBM_FORC_BOUNC - REAL ,INTENT(IN) :: PIBM_FORC_BOUNC - REAL, DIMENSION(:,:,:) ,INTENT(IN) :: PXMU - REAL, DIMENSION(:,:,:) ,INTENT(IN) :: PDIV - ! - END SUBROUTINE IBM_AFFECTV - ! - END INTERFACE - ! -END MODULE MODI_IBM_AFFECTV -! -! ######################################################## -SUBROUTINE IBM_AFFECTV(PVAR,PVAR2,PVAR3,HVAR,KIBM_LAYER,HIBM_MODE_INTE3,& - HIBM_FORC_BOUNR,PRADIUS,PPOWERS,& - HIBM_MODE_INT1N,HIBM_TYPE_BOUNN,HIBM_MODE_BOUNN,HIBM_FORC_BOUNN,PIBM_FORC_BOUNN,& - HIBM_MODE_INT1T,HIBM_TYPE_BOUNT,HIBM_MODE_BOUNT,HIBM_FORC_BOUNT,PIBM_FORC_BOUNT,& - HIBM_MODE_INT1C,HIBM_TYPE_BOUNC,HIBM_MODE_BOUNC,HIBM_FORC_BOUNC,PIBM_FORC_BOUNC,PXMU,PDIV) - ! ######################################################## - ! - ! - !**** IBM_AFFECTV computes the variable PVAR on desired ghost points : - ! - the V type of the ghost/image - ! - the 3D interpolation mode (HIBM_MODE_INTE3) - ! - the 1D interpolation mode (HIBM_MODE_INTE1) - ! - the boundary condition (HIBM_TYPE_BOUND) - ! - the symmetry character (HIBM_MODE_BOUND) - ! - the forcing type (HIBM_FORC_BOUND) - ! - the forcing term (HIBM_FORC_BOUND) - ! Choice of forcing type is depending on - ! the normal, binormal, tangent vectors (N,C,T) - ! - ! - ! PURPOSE - ! ------- - !**** Ghosts (resp. Images) locations are stored in KIBM_STOR_GHOST (resp. KIBM_STOR_IMAGE). - ! Solutions are computed in regard of the symmetry character of the solution: - ! HIBM_MODE_BOUND = 'SYM' (Symmetrical) - ! HIBM_MODE_BOUND = 'ASY' (Anti-symmetrical) - ! The ghost value is depending on the variable value at the interface: - ! HIBM_TYPE_BOUND = "CST" (constant value) - ! HIBM_TYPE_BOUND = "LAW" (wall models) - ! HIBM_TYPE_BOUND = "LIN" (linear evolution, only IMAGE2 type) - ! HIBM_TYPE_BOUND = "LOG" (logarithmic evol, only IMAGE2 type) - ! Three 3D interpolations exists HIBM_MODE_INTE3 = "IDW" (Inverse Distance Weighting) - ! HIBM_MODE_INTE3 = "MDW" (Modified Distance Weighting) - ! HIBM_MODE_INTE3 = "LAG" (Trilinear Lagrange interp. ) - ! Three 1D interpolations exists HIBM_MODE_INTE1 = "CL0" (Lagrange Polynomials - 1 points - MIRROR) - ! HIBM_MODE_INTE1 = "CL1" (Lagrange Polynomials - 2 points - IMAGE1) - ! HIBM_MODE_INTE1 = "CL2" (Lagrange Polynomials - 3 points - IMAGE2) - ! METHOD - ! ------ - ! - loop on ghosts - ! - functions storage - ! - computations of the location of the corners cell containing MIRROR/IMAGE1/IMAGE2 - ! - 3D interpolation (IDW, MDW, CLI) to obtain the MIRROR/IMAGE1/IMAGE2 values - ! - computation of the value at the interface - ! - 1D interpolation (CLI1,CLI2,CLI3) to obtain the GHOSTS values - ! - Affectation - ! - ! EXTERNAL - ! -------- - ! SUBROUTINE ? - ! - ! IMPLICIT ARGUMENTS - ! ------------------ - ! MODD_? - ! - ! REFERENCE - ! --------- - ! - ! AUTHOR - ! ------ - ! Franck Auguste (CERFACS-AE) - ! - ! MODIFICATIONS - ! ------------- - ! Original 01/01/2019 - ! - !------------------------------------------------------------------------------ - ! - !**** 0. DECLARATIONS - ! --------------- - ! module - USE MODE_POS - USE MODE_ll - USE MODE_IO - USE MODD_ARGSLIST_ll, ONLY : LIST_ll - ! - ! declaration - USE MODD_IBM_PARAM_n - USE MODD_FIELD_n - USE MODD_PARAM_n, ONLY: CTURB - USE MODD_GRID_n, ONLY: XXHAT,XYHAT,XZZ - USE MODD_VAR_ll, ONLY: IP - USE MODD_LBC_n - USE MODD_REF_n, ONLY: XRHODJ,XRHODREF - ! - ! interface - USE MODI_IBM_VALUECORN - USE MODI_IBM_LOCATCORN - USE MODI_IBM_3DINT - USE MODI_IBM_1DINT - USE MODI_IBM_0DINT - USE MODI_IBM_VALUEMAT1 - USE MODI_IBM_VALUEMAT2 - USE MODI_SHUMAN - USE MODD_DYN_n - USE MODD_FIELD_n - USE MODD_CST - USE MODD_CTURB - USE MODD_RADIATIONS_n - ! - IMPLICIT NONE - ! - !------------------------------------------------------------------------------ - ! - ! 0.1 declarations of arguments - ! - REAL, DIMENSION(:,:,:) ,INTENT(INOUT) :: PVAR - REAL, DIMENSION(:,:,:,:) ,INTENT(IN) :: PVAR2,PVAR3 - CHARACTER(LEN=1) ,INTENT(IN) :: HVAR - INTEGER ,INTENT(IN) :: KIBM_LAYER - REAL ,INTENT(IN) :: PRADIUS - REAL ,INTENT(IN) :: PPOWERS - CHARACTER(LEN=3) ,INTENT(IN) :: HIBM_FORC_BOUNR - CHARACTER(LEN=3) ,INTENT(IN) :: HIBM_MODE_INTE3 - CHARACTER(LEN=3) ,INTENT(IN) :: HIBM_MODE_INT1N - CHARACTER(LEN=3) ,INTENT(IN) :: HIBM_TYPE_BOUNN - CHARACTER(LEN=3) ,INTENT(IN) :: HIBM_MODE_BOUNN - CHARACTER(LEN=3) ,INTENT(IN) :: HIBM_FORC_BOUNN - REAL ,INTENT(IN) :: PIBM_FORC_BOUNN - CHARACTER(LEN=3) ,INTENT(IN) :: HIBM_MODE_INT1T - CHARACTER(LEN=3) ,INTENT(IN) :: HIBM_TYPE_BOUNT - CHARACTER(LEN=3) ,INTENT(IN) :: HIBM_MODE_BOUNT - CHARACTER(LEN=3) ,INTENT(IN) :: HIBM_FORC_BOUNT - REAL ,INTENT(IN) :: PIBM_FORC_BOUNT - CHARACTER(LEN=3) ,INTENT(IN) :: HIBM_MODE_INT1C - CHARACTER(LEN=3) ,INTENT(IN) :: HIBM_TYPE_BOUNC - CHARACTER(LEN=3) ,INTENT(IN) :: HIBM_MODE_BOUNC - CHARACTER(LEN=3) ,INTENT(IN) :: HIBM_FORC_BOUNC - REAL ,INTENT(IN) :: PIBM_FORC_BOUNC - REAL, DIMENSION(:,:,:) ,INTENT(IN) :: PXMU - REAL, DIMENSION(:,:,:) ,INTENT(IN) :: PDIV - ! - !------------------------------------------------------------------------------ - ! - ! 0.2 declaration of local variables - ! - INTEGER :: JI,JJ,JK,JL,JM,JMM,JN,JNN,JH,JLL ! loop index - INTEGER, DIMENSION(:) , ALLOCATABLE :: I_INDEX_CORN ! reference corner index - INTEGER :: I_GHOST_NUMB ! ghost number per layer - REAL , DIMENSION(:,:), ALLOCATABLE :: Z_LOCAT_CORN,Z_LOCAT_IMAG ! corners coordinates - REAL , DIMENSION(:) , ALLOCATABLE :: Z_TESTS_CORN ! interface distance dependence - REAL , DIMENSION(:) , ALLOCATABLE :: Z_VALUE_CORN ! value variables at corners - REAL , DIMENSION(:,:), ALLOCATABLE :: Z_VALUE_IMAG,Z_VALUE_TEMP,Z_VALUE_ZLKE ! value at mirror/image1/image2 - REAL , DIMENSION(:) , ALLOCATABLE :: Z_LOCAT_BOUN,Z_LOCAT_GHOS,Z_TEMP_ZLKE ! location of bound and ghost - REAL :: Z_DELTA_IMAG,ZIBM_VISC,ZIBM_DIVK - CHARACTER(LEN=3),DIMENSION(:), ALLOCATABLE :: Y_TYPE_BOUND,Y_FORC_BOUND,Y_MODE_BOUND,Y_MODE_INTE1 - REAL , DIMENSION(:) , ALLOCATABLE :: Z_FORC_BOUND,Z_VALUE_GHOS - REAL , DIMENSION(:,:), ALLOCATABLE :: Z_VALUE_MAT1,Z_VALUE_MAT2 - REAL :: ZIBM_HALO - ! - !------------------------------------------------------------------------------ - ! - ! 0.3 Allocation - ! - ALLOCATE(I_INDEX_CORN(3)) - ALLOCATE(Z_LOCAT_CORN(8,3)) - ALLOCATE(Z_VALUE_CORN(8)) - ALLOCATE(Z_TESTS_CORN(8)) - ALLOCATE(Z_LOCAT_IMAG(3,3)) - ALLOCATE(Z_VALUE_IMAG(4,3)) - ALLOCATE(Z_VALUE_TEMP(4,3)) - ALLOCATE(Z_LOCAT_BOUN(3)) - ALLOCATE(Z_LOCAT_GHOS(3)) - ALLOCATE(Z_VALUE_GHOS(3)) - ALLOCATE(Y_TYPE_BOUND(3),Y_FORC_BOUND(3)) - ALLOCATE(Y_MODE_BOUND(3),Y_MODE_INTE1(3)) - ALLOCATE(Z_FORC_BOUND(3)) - ALLOCATE(Z_VALUE_MAT1(3,3)) - ALLOCATE(Z_VALUE_MAT2(3,3)) - ! - !------------------------------------------------------------------------------ - ! - !**** 1. PRELIMINARIES - ! ---------------- - I_INDEX_CORN(:) = 0 - Z_LOCAT_CORN(:,:) = 0. - Z_VALUE_CORN(:) = 0. - Z_TESTS_CORN(:) = 0. - Z_LOCAT_IMAG(:,:) = 0. - Z_VALUE_IMAG(:,:) = 0. - Z_VALUE_TEMP(:,:) = 0. - Z_LOCAT_GHOS(:) = 0. - Z_LOCAT_BOUN(:) = 0. - Z_VALUE_GHOS(:) = 0. - Z_VALUE_MAT1(:,:) = 0. - Z_VALUE_MAT2(:,:) = 0. - IF (HVAR=='U') JH = 1 - IF (HVAR=='V') JH = 2 - IF (HVAR=='W') JH = 3 - Y_TYPE_BOUND(1) = HIBM_TYPE_BOUNN - Y_TYPE_BOUND(2) = HIBM_TYPE_BOUNT - Y_TYPE_BOUND(3) = HIBM_TYPE_BOUNC - Y_FORC_BOUND(1) = HIBM_FORC_BOUNN - Y_FORC_BOUND(2) = HIBM_FORC_BOUNT - Y_FORC_BOUND(3) = HIBM_FORC_BOUNC - Y_MODE_BOUND(1) = HIBM_MODE_BOUNN - Y_MODE_BOUND(2) = HIBM_MODE_BOUNT - Y_MODE_BOUND(3) = HIBM_MODE_BOUNC - Y_MODE_INTE1(1) = HIBM_MODE_INT1N - Y_MODE_INTE1(2) = HIBM_MODE_INT1T - Y_MODE_INTE1(3) = HIBM_MODE_INT1C - Z_FORC_BOUND(1) = PIBM_FORC_BOUNN - Z_FORC_BOUND(2) = PIBM_FORC_BOUNT - Z_FORC_BOUND(3) = PIBM_FORC_BOUNC - ! - ALLOCATE(Z_VALUE_ZLKE(4,3)) - ALLOCATE(Z_TEMP_ZLKE(3)) - Z_VALUE_ZLKE(:,:) = 0. - Z_TEMP_ZLKE(:) = 0. - ! - DO JMM=1,KIBM_LAYER - ! - ! searching number of ghosts - JM = size(NIBM_GHOST_V,1) - JI = 0 - JJ = 0 - JK = 0 - DO WHILE ((JI==0.and.JJ==0.and.JK==0).and.JM>0) - JI = NIBM_GHOST_V(JM,JMM,JH,1) - JJ = NIBM_GHOST_V(JM,JMM,JH,2) - JK = NIBM_GHOST_V(JM,JMM,JH,3) - IF (JI==0.and.JJ==0.and.JK==0) JM = JM - 1 - ENDDO - I_GHOST_NUMB = JM - ! - ! Loop on each P Ghosts - IF (I_GHOST_NUMB<=0) GO TO 666 - DO JM = 1,I_GHOST_NUMB - ! - ! ghost index/ls - JI = NIBM_GHOST_V(JM,JMM,JH,1) - JJ = NIBM_GHOST_V(JM,JMM,JH,2) - JK = NIBM_GHOST_V(JM,JMM,JH,3) - IF (JI==0.or.JJ==0.or.JK==0) GO TO 777 - Z_LOCAT_GHOS(:) = XIBM_GHOST_V(JM,JMM,JH,:) - Z_LOCAT_BOUN(:) = 2.0*XIBM_IMAGE_V(JM,JMM,JH,1,:)-1.0*XIBM_IMAGE_V(JM,JMM,JH,2,:) - ZIBM_HALO = 1. - ! - DO JN = 1,3 - ! - Z_LOCAT_IMAG(JN,:)= XIBM_IMAGE_V(JM,JMM,JH ,JN,:) - Z_DELTA_IMAG = ((XXHAT(JI+1)-XXHAT(JI))*(XYHAT(JJ+1)-XYHAT(JJ)))**0.5 - ! - DO JLL=1,3 - I_INDEX_CORN(:) = NIBM_IMAGE_V(JM,JMM,JH,JLL,JN,:) - IF (I_INDEX_CORN(1)==0.AND.JN==2) ZIBM_HALO=0. - IF (I_INDEX_CORN(2)==0.AND.JN==2) ZIBM_HALO=0. - Z_LOCAT_CORN(:,:) = IBM_LOCATCORN(I_INDEX_CORN,JLL+1) - Z_TESTS_CORN(:) = XIBM_TESTI_V(JM,JMM,JH,JLL,JN,:) - Z_VALUE_CORN(:) = IBM_VALUECORN(PVAR2(:,:,:,JLL),I_INDEX_CORN) - Z_VALUE_IMAG(JN,JLL) = IBM_3DINT(JN,Z_VALUE_IMAG(:,JLL),Z_LOCAT_BOUN,Z_TESTS_CORN,& - Z_LOCAT_CORN,Z_VALUE_CORN,Z_LOCAT_IMAG(JN,:),& - HIBM_MODE_INTE3,PRADIUS,PPOWERS) - ENDDO - ! - ENDDO - ZIBM_VISC = PXMU(JI,JJ,JK) - ZIBM_DIVK = PDIV(JI,JJ,JK) - ! - ! projection step - Z_VALUE_MAT1(:,:) = IBM_VALUEMAT1(Z_LOCAT_IMAG(1,:),Z_LOCAT_BOUN,Z_VALUE_IMAG,HIBM_FORC_BOUNR) - DO JN=1,3 - Z_VALUE_TEMP(JN,:)= Z_VALUE_MAT1(:,1)*Z_VALUE_IMAG(JN,1) +& - Z_VALUE_MAT1(:,2)*Z_VALUE_IMAG(JN,2) +& - Z_VALUE_MAT1(:,3)*Z_VALUE_IMAG(JN,3) - ENDDO - ! - ! === BOUND computation === - ! - JN=4 - DO JLL=1,3 - Z_VALUE_TEMP(JN,JLL) = IBM_0DINT(Z_DELTA_IMAG,Z_VALUE_TEMP(:,JLL),Y_TYPE_BOUND(JLL),Y_FORC_BOUND(JLL), & - Z_FORC_BOUND(JLL),ZIBM_VISC,ZIBM_DIVK) - ENDDO - ! - ! inverse projection step - Z_VALUE_MAT2(:,:) = IBM_VALUEMAT2(Z_VALUE_MAT1) - Z_VALUE_IMAG(JN,:)= Z_VALUE_MAT2(:,1)*Z_VALUE_TEMP(JN,1) +& - Z_VALUE_MAT2(:,2)*Z_VALUE_TEMP(JN,2) +& - Z_VALUE_MAT2(:,3)*Z_VALUE_TEMP(JN,3) - ! - ! === GHOST computation === - ! - ! functions storage - Z_LOCAT_IMAG(1,3) = ((XIBM_GHOST_V(JM,JMM,JH,1)-Z_LOCAT_BOUN(1))**2.+& - (XIBM_GHOST_V(JM,JMM,JH,2)-Z_LOCAT_BOUN(2))**2.+& - (XIBM_GHOST_V(JM,JMM,JH,3)-Z_LOCAT_BOUN(3))**2.)**0.5 - IF (Z_LOCAT_IMAG(1,3)>Z_DELTA_IMAG.AND.ZIBM_HALO>0.5) THEN - Z_LOCAT_IMAG(1,1) = ((XIBM_IMAGE_V(JM,JMM,JH,1,1)-Z_LOCAT_BOUN(1))**2.+& - (XIBM_IMAGE_V(JM,JMM,JH,1,2)-Z_LOCAT_BOUN(2))**2.+& - (XIBM_IMAGE_V(JM,JMM,JH,1,3)-Z_LOCAT_BOUN(3))**2.)**0.5 - Z_LOCAT_IMAG(1,2) = ((XIBM_IMAGE_V(JM,JMM,JH,2,1)-Z_LOCAT_BOUN(1))**2.+& - (XIBM_IMAGE_V(JM,JMM,JH,2,2)-Z_LOCAT_BOUN(2))**2.+& - (XIBM_IMAGE_V(JM,JMM,JH,2,3)-Z_LOCAT_BOUN(3))**2.)**0.5 - ELSE - Z_LOCAT_IMAG(1,1) = ((XIBM_IMAGE_V(JM,JMM,JH,3,1)-Z_LOCAT_BOUN(1))**2.+& - (XIBM_IMAGE_V(JM,JMM,JH,3,2)-Z_LOCAT_BOUN(2))**2.+& - (XIBM_IMAGE_V(JM,JMM,JH,3,3)-Z_LOCAT_BOUN(3))**2.)**0.5 - Z_LOCAT_IMAG(1,2) = ((XIBM_IMAGE_V(JM,JMM,JH,1,1)-Z_LOCAT_BOUN(1))**2.+& - (XIBM_IMAGE_V(JM,JMM,JH,1,2)-Z_LOCAT_BOUN(2))**2.+& - (XIBM_IMAGE_V(JM,JMM,JH,1,3)-Z_LOCAT_BOUN(3))**2.)**0.5 - Z_VALUE_TEMP(2,:) = Z_VALUE_TEMP(1,:) - Z_VALUE_TEMP(1,:) = Z_VALUE_TEMP(3,:) - ENDIF - ! - DO JLL=1,3 - Z_VALUE_GHOS(JLL) = IBM_1DINT(Z_LOCAT_IMAG(1,:),Z_VALUE_TEMP(:,JLL),Y_MODE_INTE1(JLL)) - IF (Y_MODE_BOUND(JLL)=='SYM') Z_VALUE_GHOS(JLL) = +Z_VALUE_GHOS(JLL) - IF (Y_MODE_BOUND(JLL)=='ASY') Z_VALUE_GHOS(JLL) = -Z_VALUE_GHOS(JLL) + 2.*Z_VALUE_TEMP(4,JLL) - IF (Y_MODE_BOUND(JLL)=='CST') Z_VALUE_GHOS(JLL) = Z_VALUE_TEMP(4,JLL) - ENDDO - ! - PVAR(JI,JJ,JK) = Z_VALUE_MAT2(JH,1)*Z_VALUE_GHOS(1) +& - Z_VALUE_MAT2(JH,2)*Z_VALUE_GHOS(2) +& - Z_VALUE_MAT2(JH,3)*Z_VALUE_GHOS(3) - ! - IF ((JH==3).AND.(JK==2)) THEN - PVAR(JI,JJ,JK) = 0. - ENDIF - ! -777 CONTINUE - ! - ENDDO - ENDDO - ! -666 CONTINUE - ! - !**** X. DEALLOCATIONS/CLOSES - ! ----------------------- - ! - DEALLOCATE(I_INDEX_CORN) - DEALLOCATE(Z_LOCAT_CORN) - DEALLOCATE(Z_VALUE_CORN) - DEALLOCATE(Z_LOCAT_IMAG) - DEALLOCATE(Z_VALUE_IMAG) - DEALLOCATE(Z_VALUE_TEMP) - DEALLOCATE(Z_LOCAT_BOUN) - DEALLOCATE(Z_LOCAT_GHOS) - DEALLOCATE(Z_VALUE_GHOS) - DEALLOCATE(Z_TESTS_CORN) - DEALLOCATE(Y_TYPE_BOUND,Y_FORC_BOUND) - DEALLOCATE(Y_MODE_BOUND,Y_MODE_INTE1) - DEALLOCATE(Z_FORC_BOUND) - DEALLOCATE(Z_VALUE_MAT1) - DEALLOCATE(Z_VALUE_MAT2) - DEALLOCATE(Z_VALUE_ZLKE) - DEALLOCATE(Z_TEMP_ZLKE) - ! - RETURN - ! -END SUBROUTINE IBM_AFFECTV diff --git a/src/mesonh/ext/ice_adjust_bis.f90 b/src/mesonh/ext/ice_adjust_bis.f90 deleted file mode 100644 index 44ab0c680b6d689ab050c53ddd39ec799bf0b100..0000000000000000000000000000000000000000 --- a/src/mesonh/ext/ice_adjust_bis.f90 +++ /dev/null @@ -1,160 +0,0 @@ -!MNH_LIC Copyright 2012-2019 CNRS, Meteo-France and Universite Paul Sabatier -!MNH_LIC This is part of the Meso-NH software governed by the CeCILL-C licence -!MNH_LIC version 1. See LICENSE, CeCILL-C_V1-en.txt and CeCILL-C_V1-fr.txt -!MNH_LIC for details. version 1. -!----------------------------------------------------------------- -! ######spl - MODULE MODI_ICE_ADJUST_BIS -! ############################### -! -INTERFACE -! -! ################################################################# - SUBROUTINE ICE_ADJUST_BIS(PP,PTH,PR) -! ################################################################# -! -!! -!* 1.1 Declaration of Arguments -!! - -REAL, DIMENSION(:,:,:), INTENT(IN) :: PP ! Pressure -REAL, DIMENSION(:,:,:), INTENT(INOUT) :: PTH ! thetal to transform into th -REAL, DIMENSION(:,:,:,:),INTENT(INOUT) :: PR ! Total mixing ratios to transform into rv,rc and ri -! -END SUBROUTINE ICE_ADJUST_BIS - -END INTERFACE -! -END MODULE MODI_ICE_ADJUST_BIS -! ######spl - SUBROUTINE ICE_ADJUST_BIS(PP,PTH,PR) -! ################################################################# -! -! -!!**** *ICE_ADJUST_BIS* - computes an adjusted state of thermodynamical variables -!! -!! PURPOSE -!! ------- -!! -!!** METHOD -!! ------ -!! -!! -!! EXTERNAL -!! -------- -!! -!! IMPLICIT ARGUMENTS -!! ------------------ -!! -!! -!! REFERENCE -!! --------- -!! -!! AUTHOR -!! ------ -!! Valery Masson & C. Lac * Meteo-France * -!! -!! MODIFICATIONS -!! ------------- -!! Original 09/2012 -!! M.Moge 08/2015 UPDATE_HALO_ll on PTH, ZRV, ZRC, ZRI -! P. Wautelet 20/05/2019: add name argument to ADDnFIELD_ll + new ADD4DFIELD_ll subroutine -!! -!! -------------------------------------------------------------------------- -! -!* 0. DECLARATIONS -! ------------ -! -USE MODD_CST, ONLY : XCPD, XRD, XP00, CST -USE MODD_NEB, ONLY : NEB -! -USE MODI_COMPUTE_FUNCTION_THERMO -USE MODI_THLRT_FROM_THRVRCRI -! -USE MODE_ll -! -IMPLICIT NONE -! -! -!* 0.1 declarations of arguments -! -REAL, DIMENSION(:,:,:), INTENT(IN) :: PP ! Pressure -REAL, DIMENSION(:,:,:), INTENT(INOUT) :: PTH ! thetal to transform into th -REAL, DIMENSION(:,:,:,:),INTENT(INOUT) :: PR ! Total mixing ratios to transform into rv,rc and ri -! -!------------------------------------------------------------------------------- -! -! 0.2 declaration of local variables -REAL, DIMENSION(SIZE(PTH,1),SIZE(PTH,2),SIZE(PTH,3)) :: ZTHL, ZRW, ZRV, ZRC, & - ZRI, ZWORK -REAL, DIMENSION(SIZE(PTH,1),SIZE(PTH,2),SIZE(PTH,3)) :: ZFRAC_ICE, ZRSATW, ZRSATI -REAL, DIMENSION(SIZE(PTH,1),SIZE(PTH,2),SIZE(PTH,3)) :: ZT, ZEXN, ZLVOCPEXN,ZLSOCPEXN -REAL, DIMENSION(SIZE(PTH,1),SIZE(PTH,2),SIZE(PTH,3), 16) :: ZBUF -INTEGER :: IRR -CHARACTER(LEN=1) :: YFRAC_ICE -! -INTEGER :: IINFO_ll -TYPE(LIST_ll), POINTER :: TZFIELDS_ll=>NULL() ! list of fields to exchange -!---------------------------------------------------------------------------- -! -!* 1 Initialisation -! -------------- -! -IRR = SIZE(PR,4) -! -ZRV(:,:,:)=0. -IF (IRR>=1) & -ZRV(:,:,:)=PR(:,:,:,1) -ZRC(:,:,:)=0. -IF (IRR>=2) & -ZRC(:,:,:)=PR(:,:,:,2) -ZRI(:,:,:)=0. -IF (IRR>=4) & -ZRI(:,:,:)=PR(:,:,:,4) -! -YFRAC_ICE='T' -ZFRAC_ICE(:,:,:) = 0. -! -!* 2 Computation -! ----------- -! -ZEXN(:,:,:)=(PP(:,:,:)/XP00)**(XRD/XCPD) -! -CALL COMPUTE_FUNCTION_THERMO( IRR, & - PTH, PR, ZEXN, PP, & - ZT,ZLVOCPEXN,ZLSOCPEXN ) - -! -CALL THLRT_FROM_THRVRCRI( IRR, PTH, PR, ZLVOCPEXN, ZLSOCPEXN,& - ZTHL, ZRW ) -! -CALL TH_R_FROM_THL_RT(CST, NEB, SIZE(ZFRAC_ICE), YFRAC_ICE,ZFRAC_ICE(:,:,:),PP(:,:,:), & - ZTHL(:,:,:), ZRW(:,:,:), PTH(:,:,:), & - ZRV(:,:,:), ZRC(:,:,:), ZRI(:,:,:), & - ZRSATW(:,:,:), ZRSATI(:,:,:),OOCEAN=.FALSE.,& - PBUF=ZBUF) -CALL ADD3DFIELD_ll( TZFIELDS_ll, PTH, 'ICE_ADJUST_BIS::PTH') -IF (IRR>=1) THEN - CALL ADD3DFIELD_ll( TZFIELDS_ll, ZRV, 'ICE_ADJUST_BIS::ZRV' ) -ENDIF -IF (IRR>=2) THEN - CALL ADD3DFIELD_ll( TZFIELDS_ll, ZRC, 'ICE_ADJUST_BIS::ZRC' ) -ENDIF -IF (IRR>=4) THEN - CALL ADD3DFIELD_ll( TZFIELDS_ll, ZRI, 'ICE_ADJUST_BIS::ZRI' ) -ENDIF -CALL UPDATE_HALO_ll(TZFIELDS_ll,IINFO_ll) -CALL CLEANLIST_ll(TZFIELDS_ll) -! - -IF (IRR>=1) & -PR(:,:,:,1) = ZRV(:,:,:) -IF (IRR>=2) & -PR(:,:,:,2) = ZRC(:,:,:) -IF (IRR>=4) & -PR(:,:,:,4) = ZRI(:,:,:) -! -CONTAINS -INCLUDE "th_r_from_thl_rt.func.h" -INCLUDE "compute_frac_ice.func.h" -END SUBROUTINE ICE_ADJUST_BIS diff --git a/src/mesonh/ext/ini_lesn.f90 b/src/mesonh/ext/ini_lesn.f90 deleted file mode 100644 index 378e43f533ddc33eac977c0cc9a82b5b9e72e6be..0000000000000000000000000000000000000000 --- a/src/mesonh/ext/ini_lesn.f90 +++ /dev/null @@ -1,2007 +0,0 @@ -!MNH_LIC Copyright 2000-2022 CNRS, Meteo-France and Universite Paul Sabatier -!MNH_LIC This is part of the Meso-NH software governed by the CeCILL-C licence -!MNH_LIC version 1. See LICENSE, CeCILL-C_V1-en.txt and CeCILL-C_V1-fr.txt -!MNH_LIC for details. version 1. -!----------------------------------------------------------------- -! #################### - SUBROUTINE INI_LES_n -! #################### -! -! -!!**** *INI_LES_n* initializes the LES variables for model _n -!! -!! PURPOSE -!! ------- -!! -!! EXTERNAL -!! -------- -!! -!! IMPLICIT ARGUMENTS -!! ------------------ -!! -!! REFERENCE -!! --------- -!! -!! AUTHOR -!! ------ -!! V. Masson -!! -!! MODIFICATIONS -!! ------------- -!! Original 07/02/00 -!! Modification 01/02/01 (D.Gazen) add module MODD_NSV for NSV variable -!! 06/11/02 (V. Masson) add LES budgets -!! 10/2016 (C.Lac) Add droplet deposition -!! Philippe Wautelet: 05/2016-04/2018: new data structures and calls for I/O -!! 02/2019 (C. Lac) Add rain fraction as a LES diagnostic -! P. Wautelet 10/04/2019: replace ABORT and STOP calls by Print_msg -! P. Wautelet 13/09/2019: budget: simplify and modernize date/time management -! P. Wautelet 12/08/2020: bugfix: use NUNDEF instead of XUNDEF for integer variables -! P. Wautelet 04/01/2021: bugfix: nles_k was used instead of nspectra_k for a loop index -! P. Wautelet 30/03/2021: budgets: LES cartesian subdomain limits are defined in the physical domain -! P. Wautelet 09/07/2021: bugfix: altitude levels are on the correct grid position (mass point) -! P. Wautelet 22/03/2022: LES averaging periods are more reliable (compute with integers instead of reals) -! -------------------------------------------------------------------------- -! -!* 0. DECLARATIONS -! ------------ -! -USE MODE_ll -USE MODE_GATHER_ll -USE MODE_MSG -USE MODE_MODELN_HANDLER -! -USE MODD_LES -USE MODD_LES_BUDGET -USE MODD_LES_n -! -USE MODD_CONF -USE MODD_PARAMETERS -USE MODD_NESTING -! -USE MODD_LUNIT_n -USE MODD_GRID_n -USE MODD_DYN_n -USE MODD_TIME_n -USE MODD_DIM_n -USE MODD_TURB_n -USE MODD_CONF_n -USE MODD_LBC_n -USE MODD_PARAM_n -USE MODD_DYN -USE MODD_NSV, ONLY: NSV ! update_nsv is done in INI_MODEL -USE MODD_CONDSAMP, ONLY : LCONDSAMP -! -USE MODI_INI_LES_CART_MASKn -USE MODI_COEF_VER_INTERP_LIN -USE MODI_SHUMAN -! -IMPLICIT NONE -! -! -!* 0.1 declarations of arguments -! -! -! -! -! 0.2 declaration of local variables -! -! -! -INTEGER :: ILUOUT, IRESP -INTEGER :: JI,JJ, JK ! loop counters -INTEGER :: IIU_ll ! total domain I size -INTEGER :: IJU_ll ! total domain J size -INTEGER :: IIMAX_ll ! total physical domain I size -INTEGER :: IJMAX_ll ! total physical domain J size -! -REAL, DIMENSION(:,:,:), ALLOCATABLE :: ZZ_LES ! LES altitudes 3D array -REAL, DIMENSION(:,:,:), ALLOCATABLE :: ZZ_SPEC! " for spectra -! -! -REAL, DIMENSION(:), ALLOCATABLE :: ZXHAT_ll ! father model coordinates -REAL, DIMENSION(:), ALLOCATABLE :: ZYHAT_ll ! -INTEGER :: IMI -! -!------------------------------------------------------------------------------- -IMI = GET_CURRENT_MODEL_INDEX() -! -CALL GET_GLOBALDIMS_ll(IIMAX_ll,IJMAX_ll) -IIU_ll = IIMAX_ll+2*JPHEXT -IJU_ll = IJMAX_ll+2*JPHEXT -! -ILUOUT = TLUOUT%NLU -! -!------------------------------------------------------------------------------- -! -!* 1. Does LES computations are used? -! ------------------------------ -! -LLES = LLES_MEAN .OR. LLES_RESOLVED .OR. LLES_SUBGRID .OR. LLES_UPDRAFT & - .OR. LLES_DOWNDRAFT .OR. LLES_SPECTRA -! -! -IF (.NOT. LLES) RETURN -! -IF (L1D) THEN - LLES_RESOLVED = .FALSE. - LLES_UPDRAFT = .FALSE. - LLES_DOWNDRAFT = .FALSE. - LLES_SPECTRA = .FALSE. - LLES_NEB_MASK = .FALSE. - LLES_CORE_MASK = .FALSE. - LLES_CS_MASK = .FALSE. - LLES_MY_MASK = .FALSE. -END IF -! -IF (LLES_RESOLVED ) LLES_MEAN = .TRUE. -IF (LLES_SUBGRID ) LLES_MEAN = .TRUE. -IF (LLES_UPDRAFT ) LLES_MEAN = .TRUE. -IF (LLES_DOWNDRAFT) LLES_MEAN = .TRUE. -IF (LLES_SPECTRA ) LLES_MEAN = .TRUE. -! -IF (CTURB=='NONE') THEN - WRITE(ILUOUT,FMT=*) 'LES diagnostics cannot be done without subgrid turbulence.' - WRITE(ILUOUT,FMT=*) 'You have chosen CTURB="NONE". You must choose a turbulence scheme.' - call Print_msg( NVERB_FATAL, 'GEN', 'WRITE_LB_n', 'LES diagnostics cannot be done without subgrid turbulence' ) -END IF -!------------------------------------------------------------------------------- -! -!* 2. Number and definition of masks -! ------------------------------ -! -!------------------------------------------------------------------------------- -! -!* 2.1 Cartesian (sub-)domain -! ---------------------- -! -!* updates number of masks -! ----------------------- -! -NLES_MASKS = 1 -! -!* For model 1, set default values of cartesian mask, and defines cartesian mask -! ----------------------------------------------------------------------------- -! -IF (IMI==1) THEN - IF ( LLES_CART_MASK ) THEN - !Compute LES diagnostics inside a cartesian mask - - !Set default values to physical domain boundaries - IF ( NLES_IINF == NUNDEF ) NLES_IINF = 1 - IF ( NLES_JINF == NUNDEF ) NLES_JINF = 1 - IF ( NLES_ISUP == NUNDEF ) NLES_ISUP = NIMAX_ll - IF ( NLES_JSUP == NUNDEF ) NLES_JSUP = NJMAX_ll - - !Check that selected indices are in physical domain - IF ( NLES_IINF < 1 ) CALL Print_msg( NVERB_ERROR, 'GEN', 'INI_LES_n', 'NLES_IINF too small (<1)' ) - IF ( NLES_IINF > NIMAX_ll ) CALL Print_msg( NVERB_ERROR, 'GEN', 'INI_LES_n', 'NLES_IINF too large (>NIMAX)' ) - IF ( NLES_ISUP < 1 ) CALL Print_msg( NVERB_ERROR, 'GEN', 'INI_LES_n', 'NLES_ISUP too small (<1)' ) - IF ( NLES_ISUP > NIMAX_ll ) CALL Print_msg( NVERB_ERROR, 'GEN', 'INI_LES_n', 'NLES_ISUP too large (>NIMAX)' ) - IF ( NLES_ISUP < NLES_IINF ) CALL Print_msg( NVERB_ERROR, 'BUD', 'INI_LES_n', 'NLES_ISUP < NLES_IINF' ) - - IF ( NLES_JINF < 1 ) CALL Print_msg( NVERB_ERROR, 'GEN', 'INI_LES_n', 'NLES_JINF too small (<1)' ) - IF ( NLES_JINF > NJMAX_ll ) CALL Print_msg( NVERB_ERROR, 'GEN', 'INI_LES_n', 'NLES_JINF too large (>NJMAX)' ) - IF ( NLES_JSUP < 1 ) CALL Print_msg( NVERB_ERROR, 'GEN', 'INI_LES_n', 'NLES_JSUP too small (<1)' ) - IF ( NLES_JSUP > NJMAX_ll ) CALL Print_msg( NVERB_ERROR, 'GEN', 'INI_LES_n', 'NLES_JSUP too large (>NJMAX)' ) - IF ( NLES_JSUP < NLES_JINF ) CALL Print_msg( NVERB_ERROR, 'BUD', 'INI_LES_n', 'NLES_JSUP < NLES_JINF' ) - - !Set LLES_CART_MASK to false if whole domain is selected - IF ( NLES_IINF == 1 .AND. NLES_JINF == 1 & - .AND. NLES_ISUP == NIMAX_ll .AND. NLES_ISUP == NJMAX_ll ) THEN - LLES_CART_MASK = .FALSE. - END IF - ELSE - !Compute LES diagnostics on whole physical domain - NLES_IINF = 1 - NLES_JINF = 1 - NLES_ISUP = NIMAX_ll - NLES_JSUP = NJMAX_ll - END IF - ! - NLESn_IINF(1)= NLES_IINF - NLESn_ISUP(1)= NLES_ISUP - NLESn_JINF(1)= NLES_JINF - NLESn_JSUP(1)= NLES_JSUP -! -!* For other models, fits cartesian mask on model 1 mask -! ----------------------------------------------------- -! -ELSE - ALLOCATE(ZXHAT_ll(IIU_ll)) - ALLOCATE(ZYHAT_ll(IJU_ll)) - CALL GATHERALL_FIELD_ll('XX',XXHAT,ZXHAT_ll,IRESP) - CALL GATHERALL_FIELD_ll('YY',XYHAT,ZYHAT_ll,IRESP) -! - CALL GOTO_MODEL(NDAD(IMI)) - CALL INI_LES_CART_MASK_n(IMI,ZXHAT_ll,ZYHAT_ll, & - NLESn_IINF(IMI),NLESn_JINF(IMI), & - NLESn_ISUP(IMI),NLESn_JSUP(IMI) ) - CALL GOTO_MODEL(IMI) -! - DEALLOCATE(ZXHAT_ll) - DEALLOCATE(ZYHAT_ll) -END IF -! -!* in non cyclic boundary conditions, limitiation of masks due to u and v grids -! ---------------------------------------------------------------------------- -! -IF ( (.NOT. L1D) .AND. CLBCX(1)/='CYCL') THEN - NLESn_IINF(IMI) = MAX(NLESn_IINF(IMI),2) -END IF -IF ( (.NOT. L1D) .AND. (.NOT. L2D) .AND. CLBCY(1)/='CYCL') THEN - NLESn_JINF(IMI) = MAX(NLESn_JINF(IMI),2) -END IF -! -!* X boundary conditions for 2points correlations computations -! ----------------------------------------------------------- -! -IF ( CLBCX(1) == 'CYCL' .AND. NLESn_IINF(IMI) == 1 .AND. NLESn_ISUP(IMI) == NIMAX_ll ) THEN - CLES_LBCX(:,IMI) = 'CYCL' -ELSE - CLES_LBCX(:,IMI) = 'OPEN' -END IF -! -!* Y boundary conditions for 2points correlations computations -! ----------------------------------------------------------- -! -IF ( CLBCY(1) == 'CYCL' .AND. NLESn_JINF(IMI) == 1 .AND. NLESn_JSUP(IMI) == NJMAX_ll ) THEN - CLES_LBCY(:,IMI) = 'CYCL' -ELSE - CLES_LBCY(:,IMI) = 'OPEN' -END IF -! -!------------------------------------------------------------------------------- -! -!* 2.2 Nebulosity mask -! --------------- -! -IF (.NOT. LUSERC .AND. .NOT. LUSERI) LLES_NEB_MASK = .FALSE. -! -IF (LLES_NEB_MASK) NLES_MASKS = NLES_MASKS + 2 -! -!------------------------------------------------------------------------------- -! -!* 2.3 Cloud core mask -! --------------- -! -IF (.NOT. LUSERC .AND. .NOT. LUSERI) LLES_CORE_MASK = .FALSE. -! -IF (LLES_CORE_MASK) NLES_MASKS = NLES_MASKS + 2 -! -!------------------------------------------------------------------------------- -! -!* 2.4 Conditional sampling mask -! ------------------------- -! -IF (.NOT. LUSERC .AND. .NOT. LCONDSAMP) LLES_CS_MASK = .FALSE. -! -IF (LLES_CS_MASK) NLES_MASKS = NLES_MASKS + 3 -! -!------------------------------------------------------------------------------- -! -!* 2.5 User mask -! --------- -! -IF (LLES_MY_MASK) NLES_MASKS = NLES_MASKS + NLES_MASKS_USER -! -!------------------------------------------------------------------------------- -! -!* 3. Number of temporal LES samplings -! -------------------------------- -! -!* 3.1 Default value -! ------------- -! -IF (XLES_TEMP_SAMPLING == XUNDEF) THEN - IF (CTURBDIM=='3DIM') THEN - XLES_TEMP_SAMPLING = 60. - ELSE - XLES_TEMP_SAMPLING = 300. - END IF -END IF -! -!* 3.2 Number of time steps between two calls -! -------------------------------------- -! -NLES_DTCOUNT = MAX( NINT( XLES_TEMP_SAMPLING / XTSTEP ) , 1) - -! -!* 3.3 Redefinition of the LES sampling time coherent with model time-step -! ------------------------------------------------------------------- -! -! Note that this modifies XLES_TEMP_SAMPLING only for father model (model number 1) -! For nested models (for which integration time step is an integer part of father model) -! the following operation does not change XLES_TEMP_SAMPLING. This way, LEs -! sampling is done at the same instants for all models. -! -XLES_TEMP_SAMPLING = XTSTEP * NLES_DTCOUNT -! -! -!* 3.4 number of temporal calls to LES routines -! ---------------------------------------- -! -! -NLES_TIMES = ( NINT( ( XSEGLEN - DYN_MODEL(1)%XTSTEP ) / XTSTEP ) ) / NLES_DTCOUNT -! -!* 3.5 current LES time counter -! ------------------------ -! -NLES_TCOUNT = 0 -! -!* 3.6 dates array for diachro -! ---------------------- -! -allocate( tles_dates( nles_times ) ) -allocate( xles_times( nles_times ) ) -! -!* 3.7 No data -! ------- -! -IF (NLES_TIMES==0) THEN - LLES=.FALSE. - RETURN -END IF -! -!* 3.8 Averaging -! --------- -IF ( XLES_TEMP_MEAN_END == XUNDEF & - .OR. XLES_TEMP_MEAN_START == XUNDEF & - .OR. XLES_TEMP_MEAN_STEP == XUNDEF ) THEN - !No LES temporal averaging - NLES_MEAN_TIMES = 0 - NLES_MEAN_STEP = NNEGUNDEF - NLES_MEAN_START = NNEGUNDEF - NLES_MEAN_END = NNEGUNDEF -ELSE - !LES temporal averaging is enabled - !Ensure that XLES_TEMP_MEAN_END is not after segment end - XLES_TEMP_MEAN_END = MIN( XLES_TEMP_MEAN_END, XSEGLEN - DYN_MODEL(1)%XTSTEP ) - - NLES_MEAN_START = NINT( XLES_TEMP_MEAN_START / XTSTEP ) - - IF ( MODULO( NLES_MEAN_START, NLES_DTCOUNT ) /= 0 ) THEN - CMNHMSG(1) = 'XLES_TEMP_MEAN_START is not a multiple of XLES_TEMP_SAMPLING' - CMNHMSG(2) = 'LES averaging periods could be wrong' - CALL Print_msg( NVERB_WARNING, 'IO', 'INI_LES_n' ) - END IF - - NLES_MEAN_END = NINT( XLES_TEMP_MEAN_END / XTSTEP ) - - NLES_MEAN_STEP = NINT( XLES_TEMP_MEAN_STEP / XTSTEP ) - - IF ( NLES_MEAN_STEP < NLES_DTCOUNT ) & - CALL Print_msg( NVERB_ERROR, 'IO', 'INI_LES_n', 'XLES_TEMP_MEAN_STEP < XLES_TEMP_SAMPLING not allowed' ) - - IF ( MODULO( NLES_MEAN_STEP, NLES_DTCOUNT ) /= 0 ) THEN - CMNHMSG(1) = 'XLES_TEMP_MEAN_STEP is not a multiple of XLES_TEMP_SAMPLING' - CMNHMSG(2) = 'LES averaging periods could be wrong' - CALL Print_msg( NVERB_WARNING, 'IO', 'INI_LES_n' ) - END IF - - NLES_MEAN_TIMES = ( NLES_MEAN_END - NLES_MEAN_START ) / NLES_MEAN_STEP - !Add 1 averaging period if the last one is incomplete (for example: start=0., end=10., step=3.) - IF ( MODULO( NLES_MEAN_END - NLES_MEAN_START, NLES_MEAN_STEP ) > 0 ) NLES_MEAN_TIMES = NLES_MEAN_TIMES + 1 -END IF -!------------------------------------------------------------------------------- -! -!* 4. Number of vertical levels for local diagnostics -! ----------------------------------------------- -! -NLES_K = 0 -! -!* 4.1 Case of altitude levels (lowest priority) -! ----------------------- -! -IF (ANY(XLES_ALTITUDES(:)/=XUNDEF)) THEN - NLES_K = COUNT (XLES_ALTITUDES(:)/=XUNDEF) - CLES_LEVEL_TYPE='Z' - ! - ALLOCATE(XCOEFLIN_LES(SIZE(XZZ,1),SIZE(XZZ,2),NLES_K)) - ALLOCATE(NKLIN_LES (SIZE(XZZ,1),SIZE(XZZ,2),NLES_K)) - ! - ALLOCATE(ZZ_LES (SIZE(XZZ,1),SIZE(XZZ,2),NLES_K)) - DO JK=1,NLES_K - DO JJ=1,SIZE(XZZ,2) - DO JI=1,SIZE(XZZ,1) - ZZ_LES(JI,JJ,JK) = XLES_ALTITUDES(JK) - END DO - END DO - END DO - CALL COEF_VER_INTERP_LIN(MZF(XZZ),ZZ_LES,NKLIN_LES,XCOEFLIN_LES) - ! - DEALLOCATE(ZZ_LES) -END IF -! -! -!* 4.2 Case of model levels (highest priority) -! -------------------- -! -IF (ANY(NLES_LEVELS(:)/=NUNDEF)) THEN - DO JK = 1, SIZE( NLES_LEVELS ) - IF ( NLES_LEVELS(JK) /= NUNDEF ) THEN - IF ( NLES_LEVELS(JK) < 1 ) CALL Print_msg( NVERB_ERROR, 'GEN', 'INI_LES_n', 'NLES_LEVELS too small (<1)' ) - IF ( NLES_LEVELS(JK) > NKMAX ) CALL Print_msg( NVERB_ERROR, 'GEN', 'INI_LES_n', 'NLES_LEVELS too large (>NKMAX)' ) - END IF - END DO - - NLES_K = COUNT (NLES_LEVELS(:)/=NUNDEF) - CLES_LEVEL_TYPE='K' -ELSE - IF (NLES_K==0) THEN - NLES_K = MIN(SIZE(NLES_LEVELS),NKMAX) - CLES_LEVEL_TYPE='K' - DO JK=1,NLES_K - NLES_LEVELS(JK) = JK - END DO - END IF -END IF -! -!------------------------------------------------------------------------------- -! -!* 5. Number of vertical levels for non-local diagnostics -! --------------------------------------------------- -! -NSPECTRA_K = 0 -CSPECTRA_LEVEL_TYPE='N' -! -! -!* 5.1 Case of altitude levels (medium priority) -! ----------------------- -! -IF (ANY(XSPECTRA_ALTITUDES(:)/=XUNDEF)) THEN - NSPECTRA_K = COUNT (XSPECTRA_ALTITUDES(:)/=XUNDEF) - CSPECTRA_LEVEL_TYPE='Z' - ! - ALLOCATE(XCOEFLIN_SPEC(SIZE(XZZ,1),SIZE(XZZ,2),NSPECTRA_K)) - ALLOCATE(NKLIN_SPEC (SIZE(XZZ,1),SIZE(XZZ,2),NSPECTRA_K)) - ! - ALLOCATE(ZZ_SPEC (SIZE(XZZ,1),SIZE(XZZ,2),NSPECTRA_K)) - DO JK=1,NSPECTRA_K - DO JJ=1,SIZE(XZZ,2) - DO JI=1,SIZE(XZZ,1) - ZZ_SPEC(JI,JJ,JK) = XSPECTRA_ALTITUDES(JK) - END DO - END DO - END DO - CALL COEF_VER_INTERP_LIN(XZZ,ZZ_SPEC,NKLIN_SPEC,XCOEFLIN_SPEC) - ! - DEALLOCATE(ZZ_SPEC) -END IF -! -! -!* 5.2 Case of model levels (highest priority) -! -------------------- -! -IF (ANY(NSPECTRA_LEVELS(:)/=NUNDEF)) THEN - DO JK = 1, SIZE( NSPECTRA_LEVELS ) - IF ( NSPECTRA_LEVELS(JK) /= NUNDEF ) THEN - IF ( NSPECTRA_LEVELS(JK) < 1 ) CALL Print_msg( NVERB_ERROR, 'GEN', 'INI_LES_n', 'NSPECTRA_LEVELS too small (<1)' ) - IF ( NSPECTRA_LEVELS(JK) > NKMAX ) CALL Print_msg( NVERB_ERROR, 'GEN', 'INI_LES_n', 'NSPECTRA_LEVELS too large (>NKMAX)' ) - END IF - END DO - - NSPECTRA_K = COUNT (NSPECTRA_LEVELS(:)/=NUNDEF) - CSPECTRA_LEVEL_TYPE='K' -END IF -! -!------------------------------------------------------------------------------- -! -!* 6. Number of horizontal wavelengths for non-local diagnostics -! ---------------------------------------------------------- -! -NSPECTRA_NI = NLESn_ISUP(IMI) - NLESn_IINF(IMI) + 1 -NSPECTRA_NJ = NLESn_JSUP(IMI) - NLESn_JINF(IMI) + 1 -! -! -!------------------------------------------------------------------------------- -! -!* 7. Allocations of temporal series of local diagnostics -! --------------------------------------------------- -! -!* 7.0 Altitude levels -! --------------- -! -ALLOCATE(XLES_Z (NLES_K)) -! -!* 7.1 Averaging control variables -! --------------------------- -! -ALLOCATE(NLES_AVG_PTS_ll (NLES_K,NLES_TIMES,NLES_MASKS)) -ALLOCATE(NLES_UND_PTS_ll (NLES_K,NLES_TIMES,NLES_MASKS)) -! -NLES_AVG_PTS_ll = NUNDEF -NLES_UND_PTS_ll = NUNDEF -! -! -!* 7.2 Horizontally mean variables -! --------------------------- -! -ALLOCATE(XLES_MEAN_U (NLES_K,NLES_TIMES,NLES_MASKS)) -ALLOCATE(XLES_MEAN_V (NLES_K,NLES_TIMES,NLES_MASKS)) -ALLOCATE(XLES_MEAN_W (NLES_K,NLES_TIMES,NLES_MASKS)) -ALLOCATE(XLES_MEAN_P (NLES_K,NLES_TIMES,NLES_MASKS)) -ALLOCATE(XLES_MEAN_DP (NLES_K,NLES_TIMES,NLES_MASKS)) -ALLOCATE(XLES_MEAN_TP (NLES_K,NLES_TIMES,NLES_MASKS)) -ALLOCATE(XLES_MEAN_TR (NLES_K,NLES_TIMES,NLES_MASKS)) -ALLOCATE(XLES_MEAN_DISS(NLES_K,NLES_TIMES,NLES_MASKS)) -ALLOCATE(XLES_MEAN_LM (NLES_K,NLES_TIMES,NLES_MASKS)) -ALLOCATE(XLES_MEAN_RHO(NLES_K,NLES_TIMES,NLES_MASKS)) -ALLOCATE(XLES_MEAN_Th (NLES_K,NLES_TIMES,NLES_MASKS)) -ALLOCATE(XLES_MEAN_Mf (NLES_K,NLES_TIMES,NLES_MASKS)) -IF (LUSERC ) THEN - ALLOCATE(XLES_MEAN_Thl(NLES_K,NLES_TIMES,NLES_MASKS)) - ALLOCATE(XLES_MEAN_Rt (NLES_K,NLES_TIMES,NLES_MASKS)) - ALLOCATE(XLES_MEAN_KHt(NLES_K,NLES_TIMES,NLES_MASKS)) - ALLOCATE(XLES_MEAN_KHr(NLES_K,NLES_TIMES,NLES_MASKS)) -ELSE - ALLOCATE(XLES_MEAN_Thl(0,0,0)) - ALLOCATE(XLES_MEAN_Rt (0,0,0)) - ALLOCATE(XLES_MEAN_KHt(0,0,0)) - ALLOCATE(XLES_MEAN_KHr(0,0,0)) -END IF -IF (LUSERV) THEN - ALLOCATE(XLES_MEAN_Thv(NLES_K,NLES_TIMES,NLES_MASKS)) -ELSE - ALLOCATE(XLES_MEAN_Thv(0,0,0)) -END IF -! -IF (LUSERV ) THEN - ALLOCATE(XLES_MEAN_Rv (NLES_K,NLES_TIMES,NLES_MASKS)) -ELSE - ALLOCATE(XLES_MEAN_Rv (0,0,0)) -END IF -IF (LUSERV ) THEN - ALLOCATE(XLES_MEAN_Rehu (NLES_K,NLES_TIMES,NLES_MASKS)) -ELSE - ALLOCATE(XLES_MEAN_Rehu (0,0,0)) -ENDIF -IF (LUSERV ) THEN - ALLOCATE(XLES_MEAN_Qs (NLES_K,NLES_TIMES,NLES_MASKS)) -ELSE - ALLOCATE(XLES_MEAN_Qs (0,0,0)) -END IF -IF (LUSERC ) THEN - ALLOCATE(XLES_MEAN_Rc (NLES_K,NLES_TIMES,NLES_MASKS)) -ELSE - ALLOCATE(XLES_MEAN_Rc (0,0,0)) -END IF -IF (LUSERC ) THEN - ALLOCATE(XLES_MEAN_Cf (NLES_K,NLES_TIMES,NLES_MASKS)) - ALLOCATE(XLES_MEAN_INDCf (NLES_K,NLES_TIMES,NLES_MASKS)) - ALLOCATE(XLES_MEAN_INDCf2 (NLES_K,NLES_TIMES,NLES_MASKS)) -ELSE - ALLOCATE(XLES_MEAN_Cf (0,0,0)) - ALLOCATE(XLES_MEAN_INDCf (0,0,0)) - ALLOCATE(XLES_MEAN_INDCf2(0,0,0)) -END IF -IF (LUSERR ) THEN - ALLOCATE(XLES_MEAN_Rr (NLES_K,NLES_TIMES,NLES_MASKS)) - ALLOCATE(XLES_MEAN_RF (NLES_K,NLES_TIMES,NLES_MASKS)) -ELSE - ALLOCATE(XLES_MEAN_Rr (0,0,0)) - ALLOCATE(XLES_MEAN_RF (0,0,0)) -END IF -IF (LUSERI ) THEN - ALLOCATE(XLES_MEAN_Ri (NLES_K,NLES_TIMES,NLES_MASKS)) - ALLOCATE(XLES_MEAN_If (NLES_K,NLES_TIMES,NLES_MASKS)) -ELSE - ALLOCATE(XLES_MEAN_Ri (0,0,0)) - ALLOCATE(XLES_MEAN_If (0,0,0)) -END IF -IF (LUSERS ) THEN - ALLOCATE(XLES_MEAN_Rs (NLES_K,NLES_TIMES,NLES_MASKS)) -ELSE - ALLOCATE(XLES_MEAN_Rs (0,0,0)) -END IF -IF (LUSERG ) THEN - ALLOCATE(XLES_MEAN_Rg (NLES_K,NLES_TIMES,NLES_MASKS)) -ELSE - ALLOCATE(XLES_MEAN_Rg (0,0,0)) -END IF -IF (LUSERH ) THEN - ALLOCATE(XLES_MEAN_Rh (NLES_K,NLES_TIMES,NLES_MASKS)) -ELSE - ALLOCATE(XLES_MEAN_Rh (0,0,0)) -END IF -IF (NSV>0 ) THEN - ALLOCATE(XLES_MEAN_Sv (NLES_K,NLES_TIMES,NLES_MASKS,NSV)) -ELSE - ALLOCATE(XLES_MEAN_Sv (0,0,0,0)) -END IF -ALLOCATE(XLES_MEAN_WIND (NLES_K,NLES_TIMES,NLES_MASKS)) -ALLOCATE(XLES_MEAN_dUdz (NLES_K,NLES_TIMES,NLES_MASKS)) -ALLOCATE(XLES_MEAN_dVdz (NLES_K,NLES_TIMES,NLES_MASKS)) -ALLOCATE(XLES_MEAN_dWdz (NLES_K,NLES_TIMES,NLES_MASKS)) -ALLOCATE(XLES_MEAN_dThldz(NLES_K,NLES_TIMES,NLES_MASKS)) -IF (LUSERV) THEN - ALLOCATE(XLES_MEAN_dRtdz(NLES_K,NLES_TIMES,NLES_MASKS)) -ELSE - ALLOCATE(XLES_MEAN_dRtdz(0,0,0)) -END IF -IF (NSV>0) THEN - ALLOCATE(XLES_MEAN_dSvdz(NLES_K,NLES_TIMES,NLES_MASKS,NSV)) -ELSE - ALLOCATE(XLES_MEAN_dSvdz(0,0,0,0)) -END IF -! -IF (LLES_PDF) THEN -!pdf distributions and jpdf distributions - CALL LES_ALLOCATE('XLES_PDF_TH ',(/NLES_K,NLES_TIMES,NLES_MASKS,NPDF/)) - CALL LES_ALLOCATE('XLES_PDF_W ',(/NLES_K,NLES_TIMES,NLES_MASKS,NPDF/)) - CALL LES_ALLOCATE('XLES_PDF_THV ',(/NLES_K,NLES_TIMES,NLES_MASKS,NPDF/)) - IF (LUSERV) THEN - CALL LES_ALLOCATE('XLES_PDF_RV ',(/NLES_K,NLES_TIMES,NLES_MASKS,NPDF/)) - ELSE - CALL LES_ALLOCATE('XLES_PDF_RV ',(/0,0,0,0/)) - END IF - IF (LUSERC) THEN - CALL LES_ALLOCATE('XLES_PDF_RC ',(/NLES_K,NLES_TIMES,NLES_MASKS,NPDF/)) - CALL LES_ALLOCATE('XLES_PDF_RT ',(/NLES_K,NLES_TIMES,NLES_MASKS,NPDF/)) - CALL LES_ALLOCATE('XLES_PDF_THL',(/NLES_K,NLES_TIMES,NLES_MASKS,NPDF/)) - ELSE - CALL LES_ALLOCATE('XLES_PDF_RC ',(/0,0,0,0/)) - CALL LES_ALLOCATE('XLES_PDF_RT ',(/0,0,0,0/)) - CALL LES_ALLOCATE('XLES_PDF_THL',(/0,0,0,0/)) - ENDIF - IF (LUSERR) THEN - CALL LES_ALLOCATE('XLES_PDF_RR ',(/NLES_K,NLES_TIMES,NLES_MASKS,NPDF/)) - ELSE - CALL LES_ALLOCATE('XLES_PDF_RR ',(/0,0,0,0/)) - ENDIF - IF (LUSERI) THEN - CALL LES_ALLOCATE('XLES_PDF_RI ',(/NLES_K,NLES_TIMES,NLES_MASKS,NPDF/)) - ELSE - CALL LES_ALLOCATE('XLES_PDF_RI ',(/0,0,0,0/)) - END IF - IF (LUSERS) THEN - CALL LES_ALLOCATE('XLES_PDF_RS ',(/NLES_K,NLES_TIMES,NLES_MASKS,NPDF/)) - ELSE - CALL LES_ALLOCATE('XLES_PDF_RS ',(/0,0,0,0/)) - END IF - IF (LUSERG) THEN - CALL LES_ALLOCATE('XLES_PDF_RG ',(/NLES_K,NLES_TIMES,NLES_MASKS,NPDF/)) - ELSE - CALL LES_ALLOCATE('XLES_PDF_RG ',(/0,0,0,0/)) - END IF -ENDIF -! -XLES_MEAN_U = XUNDEF -XLES_MEAN_V = XUNDEF -XLES_MEAN_W = XUNDEF -XLES_MEAN_P = XUNDEF -XLES_MEAN_DP = XUNDEF -XLES_MEAN_TP = XUNDEF -XLES_MEAN_TR = XUNDEF -XLES_MEAN_DISS= XUNDEF -XLES_MEAN_LM = XUNDEF -XLES_MEAN_RHO= XUNDEF -XLES_MEAN_Th = XUNDEF -XLES_MEAN_Mf = XUNDEF -IF (LUSERC ) XLES_MEAN_Thl= XUNDEF -IF (LUSERV ) XLES_MEAN_Thv= XUNDEF -IF (LUSERV ) XLES_MEAN_Rv = XUNDEF -IF (LUSERV ) XLES_MEAN_Rehu = XUNDEF -IF (LUSERV ) XLES_MEAN_Qs = XUNDEF -IF (LUSERC ) XLES_MEAN_KHr = XUNDEF -IF (LUSERC ) XLES_MEAN_KHt = XUNDEF -IF (LUSERC ) XLES_MEAN_Rt = XUNDEF -IF (LUSERC ) XLES_MEAN_Rc = XUNDEF -IF (LUSERC ) XLES_MEAN_Cf = XUNDEF -IF (LUSERC ) XLES_MEAN_RF = XUNDEF -IF (LUSERC ) XLES_MEAN_INDCf = XUNDEF -IF (LUSERC ) XLES_MEAN_INDCf2 = XUNDEF -IF (LUSERR ) XLES_MEAN_Rr = XUNDEF -IF (LUSERI ) XLES_MEAN_Ri = XUNDEF -IF (LUSERI ) XLES_MEAN_If = XUNDEF -IF (LUSERS ) XLES_MEAN_Rs = XUNDEF -IF (LUSERG ) XLES_MEAN_Rg = XUNDEF -IF (LUSERH ) XLES_MEAN_Rh = XUNDEF -IF (NSV>0 ) XLES_MEAN_Sv = XUNDEF -XLES_MEAN_WIND = XUNDEF -XLES_MEAN_WIND = XUNDEF -XLES_MEAN_dUdz = XUNDEF -XLES_MEAN_dVdz = XUNDEF -XLES_MEAN_dWdz = XUNDEF -XLES_MEAN_dThldz= XUNDEF -IF (LUSERV) XLES_MEAN_dRtdz = XUNDEF -IF (NSV>0) XLES_MEAN_dSvdz = XUNDEF -! -IF (LLES_PDF) THEN - XLES_PDF_TH = XUNDEF - XLES_PDF_W = XUNDEF - XLES_PDF_THV = XUNDEF - IF (LUSERV) THEN - XLES_PDF_RV = XUNDEF - END IF - IF (LUSERC) THEN - XLES_PDF_RC = XUNDEF - XLES_PDF_RT = XUNDEF - XLES_PDF_THL = XUNDEF - END IF - IF (LUSERR) THEN - XLES_PDF_RR = XUNDEF - END IF - IF (LUSERI) THEN - XLES_PDF_RI = XUNDEF - END IF - IF (LUSERS) THEN - XLES_PDF_RS = XUNDEF - END IF - IF (LUSERG) THEN - XLES_PDF_RG = XUNDEF - END IF -END IF -! -! -! -!* 7.3 Resolved quantities -! ------------------- -! -ALLOCATE(XLES_RESOLVED_U2 (NLES_K,NLES_TIMES,NLES_MASKS)) ! <u'2> -ALLOCATE(XLES_RESOLVED_V2 (NLES_K,NLES_TIMES,NLES_MASKS)) ! <v'2> -ALLOCATE(XLES_RESOLVED_W2 (NLES_K,NLES_TIMES,NLES_MASKS)) ! <w'2> -ALLOCATE(XLES_RESOLVED_P2 (NLES_K,NLES_TIMES,NLES_MASKS)) ! <p'2> -ALLOCATE(XLES_RESOLVED_Th2 (NLES_K,NLES_TIMES,NLES_MASKS)) ! <Th'2> -IF (LUSERV) THEN - ALLOCATE(XLES_RESOLVED_ThThv (NLES_K,NLES_TIMES,NLES_MASKS)) ! <Th'Thv'> -ELSE - ALLOCATE(XLES_RESOLVED_ThThv (0,0,0)) -END IF -IF (LUSERC) THEN - ALLOCATE(XLES_RESOLVED_Thl2 (NLES_K,NLES_TIMES,NLES_MASKS)) ! <Thl'2> - ALLOCATE(XLES_RESOLVED_ThlThv(NLES_K,NLES_TIMES,NLES_MASKS)) ! <Thl'Thv'> -ELSE - ALLOCATE(XLES_RESOLVED_Thl2 (0,0,0)) - ALLOCATE(XLES_RESOLVED_ThlThv(0,0,0)) -END IF -ALLOCATE(XLES_RESOLVED_Ke (NLES_K,NLES_TIMES,NLES_MASKS)) ! 0.5 <u'2+v'2+w'2> -ALLOCATE(XLES_RESOLVED_UV (NLES_K,NLES_TIMES,NLES_MASKS)) ! <u'v'> -ALLOCATE(XLES_RESOLVED_WU (NLES_K,NLES_TIMES,NLES_MASKS)) ! <w'u'> -ALLOCATE(XLES_RESOLVED_WV (NLES_K,NLES_TIMES,NLES_MASKS)) ! <w'v'> -ALLOCATE(XLES_RESOLVED_UP (NLES_K,NLES_TIMES,NLES_MASKS)) ! <u'p'> -ALLOCATE(XLES_RESOLVED_VP (NLES_K,NLES_TIMES,NLES_MASKS)) ! <v'p'> -ALLOCATE(XLES_RESOLVED_WP (NLES_K,NLES_TIMES,NLES_MASKS)) ! <w'p'> -ALLOCATE(XLES_RESOLVED_UTh (NLES_K,NLES_TIMES,NLES_MASKS)) ! <u'Th'> -ALLOCATE(XLES_RESOLVED_VTh (NLES_K,NLES_TIMES,NLES_MASKS)) ! <v'Th'> -ALLOCATE(XLES_RESOLVED_WTh (NLES_K,NLES_TIMES,NLES_MASKS)) ! <w'Th'> -IF (LUSERC) THEN - ALLOCATE(XLES_RESOLVED_UThl (NLES_K,NLES_TIMES,NLES_MASKS)) ! <u'Thl'> - ALLOCATE(XLES_RESOLVED_VThl (NLES_K,NLES_TIMES,NLES_MASKS)) ! <v'Thl'> - ALLOCATE(XLES_RESOLVED_WThl (NLES_K,NLES_TIMES,NLES_MASKS)) ! <w'Thl'> -ELSE - ALLOCATE(XLES_RESOLVED_UThl(0,0,0)) - ALLOCATE(XLES_RESOLVED_VThl(0,0,0)) - ALLOCATE(XLES_RESOLVED_WThl(0,0,0)) -END IF -IF (LUSERV) THEN - ALLOCATE(XLES_RESOLVED_UThv (NLES_K,NLES_TIMES,NLES_MASKS)) ! <u'Thv'> - ALLOCATE(XLES_RESOLVED_VThv (NLES_K,NLES_TIMES,NLES_MASKS)) ! <v'Thv'> - ALLOCATE(XLES_RESOLVED_WThv (NLES_K,NLES_TIMES,NLES_MASKS)) ! <w'Thv'> -ELSE - ALLOCATE(XLES_RESOLVED_UThv(0,0,0)) - ALLOCATE(XLES_RESOLVED_VThv(0,0,0)) - ALLOCATE(XLES_RESOLVED_WThv(0,0,0)) -END IF -ALLOCATE(XLES_RESOLVED_U3 (NLES_K,NLES_TIMES,NLES_MASKS)) ! <u'3> -ALLOCATE(XLES_RESOLVED_V3 (NLES_K,NLES_TIMES,NLES_MASKS)) ! <v'3> -ALLOCATE(XLES_RESOLVED_W3 (NLES_K,NLES_TIMES,NLES_MASKS)) ! <w'3> -ALLOCATE(XLES_RESOLVED_U4 (NLES_K,NLES_TIMES,NLES_MASKS)) ! <u'4> -ALLOCATE(XLES_RESOLVED_V4 (NLES_K,NLES_TIMES,NLES_MASKS)) ! <v'4> -ALLOCATE(XLES_RESOLVED_W4 (NLES_K,NLES_TIMES,NLES_MASKS)) ! <w'4> -ALLOCATE(XLES_RESOLVED_ThlPz (NLES_K,NLES_TIMES,NLES_MASKS)) ! <Thv'dp'/dz> -ALLOCATE(XLES_RESOLVED_WThl2 (NLES_K,NLES_TIMES,NLES_MASKS)) ! <w'Thl'2> -ALLOCATE(XLES_RESOLVED_W2Thl (NLES_K,NLES_TIMES,NLES_MASKS)) ! <w'2Thl'> -ALLOCATE(XLES_RESOLVED_MASSFX(NLES_K,NLES_TIMES,NLES_MASKS)) ! <upward mass flux> -ALLOCATE(XLES_RESOLVED_UKe (NLES_K,NLES_TIMES,NLES_MASKS)) ! <u'(u'2+v'2+w'2)> -ALLOCATE(XLES_RESOLVED_VKe (NLES_K,NLES_TIMES,NLES_MASKS)) ! <v'(u'2+v'2+w'2)> -ALLOCATE(XLES_RESOLVED_WKe (NLES_K,NLES_TIMES,NLES_MASKS)) ! <w'(u'2+v'2+w'2)> - -IF (LUSERV ) THEN - ALLOCATE(XLES_RESOLVED_Rv2 (NLES_K,NLES_TIMES,NLES_MASKS)) ! <Rv'2> - ALLOCATE(XLES_RESOLVED_ThRv (NLES_K,NLES_TIMES,NLES_MASKS)) ! <Th'Rv'> - ALLOCATE(XLES_RESOLVED_ThvRv (NLES_K,NLES_TIMES,NLES_MASKS)) ! <Thv'Rv'> - ALLOCATE(XLES_RESOLVED_URv (NLES_K,NLES_TIMES,NLES_MASKS)) ! <u'Rv'> - ALLOCATE(XLES_RESOLVED_VRv (NLES_K,NLES_TIMES,NLES_MASKS)) ! <v'Rv'> - ALLOCATE(XLES_RESOLVED_WRv (NLES_K,NLES_TIMES,NLES_MASKS)) ! <w'Rv'> - ALLOCATE(XLES_RESOLVED_WRv2 (NLES_K,NLES_TIMES,NLES_MASKS)) ! <w'Rv'2> - ALLOCATE(XLES_RESOLVED_W2Rv (NLES_K,NLES_TIMES,NLES_MASKS)) ! <w'2Rv'> - ALLOCATE(XLES_RESOLVED_W2Rt (NLES_K,NLES_TIMES,NLES_MASKS)) ! <w'2Rt'> - ALLOCATE(XLES_RESOLVED_WRt2 (NLES_K,NLES_TIMES,NLES_MASKS)) ! <w'Rt2'> - ALLOCATE(XLES_RESOLVED_RvPz (NLES_K,NLES_TIMES,NLES_MASKS)) ! <Rv'dp'/dz> - ALLOCATE(XLES_RESOLVED_WThlRv(NLES_K,NLES_TIMES,NLES_MASKS)) ! <w'Thl'Rv'> - ALLOCATE(XLES_RESOLVED_WThlRt(NLES_K,NLES_TIMES,NLES_MASKS)) ! <w'Thl'Rt'> -ELSE - ALLOCATE(XLES_RESOLVED_Rv2 (0,0,0)) - ALLOCATE(XLES_RESOLVED_ThRv (0,0,0)) - ALLOCATE(XLES_RESOLVED_ThvRv (0,0,0)) - ALLOCATE(XLES_RESOLVED_URv (0,0,0)) - ALLOCATE(XLES_RESOLVED_VRv (0,0,0)) - ALLOCATE(XLES_RESOLVED_WRv (0,0,0)) - ALLOCATE(XLES_RESOLVED_WRv2 (0,0,0)) - ALLOCATE(XLES_RESOLVED_W2Rv (0,0,0)) - ALLOCATE(XLES_RESOLVED_W2Rt (0,0,0)) - ALLOCATE(XLES_RESOLVED_WRt2 (0,0,0)) - ALLOCATE(XLES_RESOLVED_RvPz (0,0,0)) - ALLOCATE(XLES_RESOLVED_WThlRv(0,0,0)) - ALLOCATE(XLES_RESOLVED_WThlRt(0,0,0)) -END IF -IF (LUSERC ) THEN - ALLOCATE(XLES_RESOLVED_ThlRv (NLES_K,NLES_TIMES,NLES_MASKS)) ! <Thl'Rv'> - ! - ALLOCATE(XLES_RESOLVED_Rc2 (NLES_K,NLES_TIMES,NLES_MASKS)) ! <Rc'2> - ALLOCATE(XLES_RESOLVED_ThRc (NLES_K,NLES_TIMES,NLES_MASKS)) ! <Th'Rc'> - ALLOCATE(XLES_RESOLVED_ThlRc (NLES_K,NLES_TIMES,NLES_MASKS)) ! <Thl'Rc'> - ALLOCATE(XLES_RESOLVED_ThvRc (NLES_K,NLES_TIMES,NLES_MASKS)) ! <Thv'Rc'> - ALLOCATE(XLES_RESOLVED_URc (NLES_K,NLES_TIMES,NLES_MASKS)) ! <u'Rc'> - ALLOCATE(XLES_RESOLVED_VRc (NLES_K,NLES_TIMES,NLES_MASKS)) ! <v'Rc'> - ALLOCATE(XLES_RESOLVED_WRc (NLES_K,NLES_TIMES,NLES_MASKS)) ! <w'Rc'> - ALLOCATE(XLES_RESOLVED_WRc2 (NLES_K,NLES_TIMES,NLES_MASKS)) ! <w'Rc'2> - ALLOCATE(XLES_RESOLVED_W2Rc (NLES_K,NLES_TIMES,NLES_MASKS)) ! <w'2Rc'> - ALLOCATE(XLES_RESOLVED_RcPz (NLES_K,NLES_TIMES,NLES_MASKS)) ! <Rc'dp'/dz> - ALLOCATE(XLES_RESOLVED_WThlRc(NLES_K,NLES_TIMES,NLES_MASKS)) ! <w'Thl'Rc'> - ALLOCATE(XLES_RESOLVED_WRvRc (NLES_K,NLES_TIMES,NLES_MASKS)) ! <w'Rv'Rc'> - ALLOCATE(XLES_RESOLVED_WRt (NLES_K,NLES_TIMES,NLES_MASKS)) ! <w'Rt'> - ALLOCATE(XLES_RESOLVED_Rt2 (NLES_K,NLES_TIMES,NLES_MASKS)) ! <Rt'2> - ALLOCATE(XLES_RESOLVED_RtPz (NLES_K,NLES_TIMES,NLES_MASKS)) ! <Rv'dp'/dz> -ELSE - ALLOCATE(XLES_RESOLVED_ThlRv (0,0,0)) - ! - ALLOCATE(XLES_RESOLVED_Rc2 (0,0,0)) - ALLOCATE(XLES_RESOLVED_ThRc (0,0,0)) - ALLOCATE(XLES_RESOLVED_ThlRc (0,0,0)) - ALLOCATE(XLES_RESOLVED_ThvRc (0,0,0)) - ALLOCATE(XLES_RESOLVED_URc (0,0,0)) - ALLOCATE(XLES_RESOLVED_VRc (0,0,0)) - ALLOCATE(XLES_RESOLVED_WRc (0,0,0)) - ALLOCATE(XLES_RESOLVED_WRc2 (0,0,0)) - ALLOCATE(XLES_RESOLVED_W2Rc (0,0,0)) - ALLOCATE(XLES_RESOLVED_RcPz (0,0,0)) - ALLOCATE(XLES_RESOLVED_WThlRc(0,0,0)) - ALLOCATE(XLES_RESOLVED_WRvRc (0,0,0)) - ALLOCATE(XLES_RESOLVED_WRt (0,0,0)) - ALLOCATE(XLES_RESOLVED_Rt2 (0,0,0)) - ALLOCATE(XLES_RESOLVED_RtPz (0,0,0)) -END IF -IF (LUSERI ) THEN - ALLOCATE(XLES_RESOLVED_Ri2 (NLES_K,NLES_TIMES,NLES_MASKS)) ! <Ri'2> - ALLOCATE(XLES_RESOLVED_ThRi (NLES_K,NLES_TIMES,NLES_MASKS)) ! <Th'Ri'> - ALLOCATE(XLES_RESOLVED_ThlRi (NLES_K,NLES_TIMES,NLES_MASKS)) ! <Thl'Ri'> - ALLOCATE(XLES_RESOLVED_ThvRi (NLES_K,NLES_TIMES,NLES_MASKS)) ! <Thv'Ri'> - ALLOCATE(XLES_RESOLVED_URi (NLES_K,NLES_TIMES,NLES_MASKS)) ! <u'Ri'> - ALLOCATE(XLES_RESOLVED_VRi (NLES_K,NLES_TIMES,NLES_MASKS)) ! <v'Ri'> - ALLOCATE(XLES_RESOLVED_WRi (NLES_K,NLES_TIMES,NLES_MASKS)) ! <w'Ri'> - ALLOCATE(XLES_RESOLVED_WRi2 (NLES_K,NLES_TIMES,NLES_MASKS)) ! <w'Ri'2> - ALLOCATE(XLES_RESOLVED_W2Ri (NLES_K,NLES_TIMES,NLES_MASKS)) ! <w'2Ri'> - ALLOCATE(XLES_RESOLVED_RiPz (NLES_K,NLES_TIMES,NLES_MASKS)) ! <Ri'dp'/dz> - ALLOCATE(XLES_RESOLVED_WThlRi(NLES_K,NLES_TIMES,NLES_MASKS)) ! <w'Thl'Ri'> - ALLOCATE(XLES_RESOLVED_WRvRi (NLES_K,NLES_TIMES,NLES_MASKS)) ! <w'Rv'Ri'> -ELSE - ALLOCATE(XLES_RESOLVED_Ri2 (0,0,0)) - ALLOCATE(XLES_RESOLVED_ThRi (0,0,0)) - ALLOCATE(XLES_RESOLVED_ThlRi (0,0,0)) - ALLOCATE(XLES_RESOLVED_ThvRi (0,0,0)) - ALLOCATE(XLES_RESOLVED_URi (0,0,0)) - ALLOCATE(XLES_RESOLVED_VRi (0,0,0)) - ALLOCATE(XLES_RESOLVED_WRi (0,0,0)) - ALLOCATE(XLES_RESOLVED_WRi2 (0,0,0)) - ALLOCATE(XLES_RESOLVED_W2Ri (0,0,0)) - ALLOCATE(XLES_RESOLVED_RiPz (0,0,0)) - ALLOCATE(XLES_RESOLVED_WThlRi(0,0,0)) - ALLOCATE(XLES_RESOLVED_WRvRi (0,0,0)) -END IF -! -IF (LUSERR) THEN - ALLOCATE(XLES_RESOLVED_WRr (NLES_K,NLES_TIMES,NLES_MASKS)) ! <w'Rr'> - ALLOCATE(XLES_INPRR3D (NLES_K,NLES_TIMES,NLES_MASKS)) !precip flux - ALLOCATE(XLES_MAX_INPRR3D (NLES_K,NLES_TIMES,NLES_MASKS)) !precip flux - ALLOCATE(XLES_EVAP3D (NLES_K,NLES_TIMES,NLES_MASKS)) ! evap -ELSE - ALLOCATE(XLES_RESOLVED_WRr (0,0,0)) - ALLOCATE(XLES_INPRR3D (0,0,0)) - ALLOCATE(XLES_MAX_INPRR3D (0,0,0)) - ALLOCATE(XLES_EVAP3D (0,0,0)) -END IF -IF (NSV>0 ) THEN - ALLOCATE(XLES_RESOLVED_Sv2 (NLES_K,NLES_TIMES,NLES_MASKS,NSV)) ! <Sv'2> - ALLOCATE(XLES_RESOLVED_ThSv (NLES_K,NLES_TIMES,NLES_MASKS,NSV)) ! <Th'Sv> - ALLOCATE(XLES_RESOLVED_USv (NLES_K,NLES_TIMES,NLES_MASKS,NSV)) ! <u'Sv'> - ALLOCATE(XLES_RESOLVED_VSv (NLES_K,NLES_TIMES,NLES_MASKS,NSV)) ! <v'Sv'> - ALLOCATE(XLES_RESOLVED_WSv (NLES_K,NLES_TIMES,NLES_MASKS,NSV)) ! <w'Sv'> - ALLOCATE(XLES_RESOLVED_WSv2 (NLES_K,NLES_TIMES,NLES_MASKS,NSV)) ! <w'Sv'2> - ALLOCATE(XLES_RESOLVED_W2Sv (NLES_K,NLES_TIMES,NLES_MASKS,NSV)) ! <w'2Sv'> - ALLOCATE(XLES_RESOLVED_SvPz (NLES_K,NLES_TIMES,NLES_MASKS,NSV)) ! <Sv'dp'/dz> - ALLOCATE(XLES_RESOLVED_WThlSv(NLES_K,NLES_TIMES,NLES_MASKS,NSV)) ! <w'Thl'Sv'> - IF (LUSERV) THEN - ALLOCATE(XLES_RESOLVED_ThvSv (NLES_K,NLES_TIMES,NLES_MASKS,NSV)) ! <Thv'Sv> - ALLOCATE(XLES_RESOLVED_WRvSv (NLES_K,NLES_TIMES,NLES_MASKS,NSV)) ! <w'Rv'Sv'> - ELSE - ALLOCATE(XLES_RESOLVED_ThvSv (0,0,0,0)) - ALLOCATE(XLES_RESOLVED_WRvSv (0,0,0,0)) - END IF - IF (LUSERC) THEN - ALLOCATE(XLES_RESOLVED_ThlSv (NLES_K,NLES_TIMES,NLES_MASKS,NSV)) ! <Thl'Sv> - ELSE - ALLOCATE(XLES_RESOLVED_ThlSv (0,0,0,0)) - END IF -ELSE - ALLOCATE(XLES_RESOLVED_Sv2 (0,0,0,0)) - ALLOCATE(XLES_RESOLVED_ThSv (0,0,0,0)) - ALLOCATE(XLES_RESOLVED_USv (0,0,0,0)) - ALLOCATE(XLES_RESOLVED_VSv (0,0,0,0)) - ALLOCATE(XLES_RESOLVED_WSv (0,0,0,0)) - ALLOCATE(XLES_RESOLVED_WSv2 (0,0,0,0)) - ALLOCATE(XLES_RESOLVED_W2Sv (0,0,0,0)) - ALLOCATE(XLES_RESOLVED_SvPz (0,0,0,0)) - ALLOCATE(XLES_RESOLVED_ThvSv (0,0,0,0)) - ALLOCATE(XLES_RESOLVED_ThlSv (0,0,0,0)) - ALLOCATE(XLES_RESOLVED_WThlSv(0,0,0,0)) - ALLOCATE(XLES_RESOLVED_WRvSv (0,0,0,0)) -END IF -! -! -XLES_RESOLVED_U2 = XUNDEF -XLES_RESOLVED_V2 = XUNDEF -XLES_RESOLVED_W2 = XUNDEF -XLES_RESOLVED_P2 = XUNDEF -XLES_RESOLVED_Th2 = XUNDEF -IF( LUSERC) THEN - XLES_RESOLVED_Thl2= XUNDEF - XLES_RESOLVED_ThlThv= XUNDEF -END IF -IF (LUSERV) THEN - XLES_RESOLVED_ThThv = XUNDEF -END IF -XLES_RESOLVED_Ke = XUNDEF -XLES_RESOLVED_UV = XUNDEF -XLES_RESOLVED_WU = XUNDEF -XLES_RESOLVED_WV = XUNDEF -XLES_RESOLVED_UP = XUNDEF -XLES_RESOLVED_VP = XUNDEF -XLES_RESOLVED_WP = XUNDEF -XLES_RESOLVED_UTh = XUNDEF -XLES_RESOLVED_VTh = XUNDEF -XLES_RESOLVED_WTh = XUNDEF -IF (LUSERC) THEN - XLES_RESOLVED_UThl= XUNDEF - XLES_RESOLVED_VThl= XUNDEF - XLES_RESOLVED_WThl= XUNDEF -END IF -IF (LUSERV) THEN - XLES_RESOLVED_UThv= XUNDEF - XLES_RESOLVED_VThv= XUNDEF - XLES_RESOLVED_WThv= XUNDEF -END IF -XLES_RESOLVED_U3 = XUNDEF -XLES_RESOLVED_V3 = XUNDEF -XLES_RESOLVED_W3 = XUNDEF -XLES_RESOLVED_U4 = XUNDEF -XLES_RESOLVED_V4 = XUNDEF -XLES_RESOLVED_W4 = XUNDEF -XLES_RESOLVED_WThl2 = XUNDEF -XLES_RESOLVED_W2Thl = XUNDEF -XLES_RESOLVED_ThlPz = XUNDEF -! -XLES_RESOLVED_MASSFX = XUNDEF -XLES_RESOLVED_UKe = XUNDEF -XLES_RESOLVED_VKe = XUNDEF -XLES_RESOLVED_WKe = XUNDEF -IF (LUSERV ) THEN - XLES_RESOLVED_Rv2 = XUNDEF - XLES_RESOLVED_ThRv = XUNDEF - IF (LUSERC) XLES_RESOLVED_ThlRv= XUNDEF - XLES_RESOLVED_ThvRv= XUNDEF - XLES_RESOLVED_URv = XUNDEF - XLES_RESOLVED_VRv = XUNDEF - XLES_RESOLVED_WRv = XUNDEF - XLES_RESOLVED_WRv2 = XUNDEF - XLES_RESOLVED_W2Rv = XUNDEF - XLES_RESOLVED_WRt2 = XUNDEF - XLES_RESOLVED_W2Rt = XUNDEF - XLES_RESOLVED_WThlRv= XUNDEF - XLES_RESOLVED_WThlRt= XUNDEF - XLES_RESOLVED_RvPz = XUNDEF -END IF -IF (LUSERC ) THEN - XLES_RESOLVED_Rc2 = XUNDEF - XLES_RESOLVED_ThRc = XUNDEF - XLES_RESOLVED_ThlRc= XUNDEF - XLES_RESOLVED_ThvRc= XUNDEF - XLES_RESOLVED_URc = XUNDEF - XLES_RESOLVED_VRc = XUNDEF - XLES_RESOLVED_WRc = XUNDEF - XLES_RESOLVED_WRc2 = XUNDEF - XLES_RESOLVED_W2Rc = XUNDEF - XLES_RESOLVED_WThlRc= XUNDEF - XLES_RESOLVED_WRvRc = XUNDEF - XLES_RESOLVED_RcPz = XUNDEF - XLES_RESOLVED_RtPz = XUNDEF - XLES_RESOLVED_WRt = XUNDEF - XLES_RESOLVED_Rt2 = XUNDEF -END IF -IF (LUSERI ) THEN - XLES_RESOLVED_Ri2 = XUNDEF - XLES_RESOLVED_ThRi = XUNDEF - XLES_RESOLVED_ThlRi= XUNDEF - XLES_RESOLVED_ThvRi= XUNDEF - XLES_RESOLVED_URi = XUNDEF - XLES_RESOLVED_VRi = XUNDEF - XLES_RESOLVED_WRi = XUNDEF - XLES_RESOLVED_WRi2 = XUNDEF - XLES_RESOLVED_W2Ri = XUNDEF - XLES_RESOLVED_WThlRi= XUNDEF - XLES_RESOLVED_WRvRi = XUNDEF - XLES_RESOLVED_RiPz = XUNDEF -END IF -! -IF (LUSERR) XLES_RESOLVED_WRr = XUNDEF -IF (LUSERR) XLES_MAX_INPRR3D = XUNDEF -IF (LUSERR) XLES_INPRR3D = XUNDEF -IF (LUSERR) XLES_EVAP3D = XUNDEF -IF (NSV>0 ) THEN - XLES_RESOLVED_Sv2 = XUNDEF - XLES_RESOLVED_ThSv = XUNDEF - IF (LUSERC) XLES_RESOLVED_ThlSv= XUNDEF - IF (LUSERV) XLES_RESOLVED_ThvSv= XUNDEF - XLES_RESOLVED_USv = XUNDEF - XLES_RESOLVED_VSv = XUNDEF - XLES_RESOLVED_WSv = XUNDEF - XLES_RESOLVED_WSv2 = XUNDEF - XLES_RESOLVED_W2Sv = XUNDEF - XLES_RESOLVED_WThlSv= XUNDEF - IF (LUSERV) XLES_RESOLVED_WRvSv = XUNDEF - XLES_RESOLVED_SvPz = XUNDEF -END IF -! -! -!* 7.4 interactions of resolved and subgrid quantities -! ----------------------------------------------- -! -ALLOCATE(XLES_RES_U_SBG_Tke (NLES_K,NLES_TIMES,NLES_MASKS))! <u'Tke> -ALLOCATE(XLES_RES_V_SBG_Tke (NLES_K,NLES_TIMES,NLES_MASKS))! <v'Tke> -ALLOCATE(XLES_RES_W_SBG_Tke (NLES_K,NLES_TIMES,NLES_MASKS))! <w'Tke> -! ______ -ALLOCATE(XLES_RES_W_SBG_WThl (NLES_K,NLES_TIMES,NLES_MASKS))! <w'w'Thl'> -! _____ -ALLOCATE(XLES_RES_W_SBG_Thl2 (NLES_K,NLES_TIMES,NLES_MASKS))! <w'Thl'2> -! _____ -ALLOCATE(XLES_RES_ddxa_U_SBG_UaU (NLES_K,NLES_TIMES,NLES_MASKS))! <du'/dxa ua'u'> -! _____ -ALLOCATE(XLES_RES_ddxa_V_SBG_UaV (NLES_K,NLES_TIMES,NLES_MASKS))! <dv'/dxa ua'v'> -! _____ -ALLOCATE(XLES_RES_ddxa_W_SBG_UaW (NLES_K,NLES_TIMES,NLES_MASKS))! <dw'/dxa ua'w'> -! _______ -ALLOCATE(XLES_RES_ddxa_W_SBG_UaThl (NLES_K,NLES_TIMES,NLES_MASKS))! <dw'/dxa ua'Thl'> -! _____ -ALLOCATE(XLES_RES_ddxa_Thl_SBG_UaW (NLES_K,NLES_TIMES,NLES_MASKS))! <dThl'/dxa ua'w'> -! ___ -ALLOCATE(XLES_RES_ddz_Thl_SBG_W2 (NLES_K,NLES_TIMES,NLES_MASKS))! <dThl'/dz w'2> -! _______ -ALLOCATE(XLES_RES_ddxa_Thl_SBG_UaThl(NLES_K,NLES_TIMES,NLES_MASKS))! <dThl'/dxa ua'Thl'> -! -IF (LUSERV) THEN -! _____ - ALLOCATE(XLES_RES_W_SBG_WRt (NLES_K,NLES_TIMES,NLES_MASKS))! <w'w'Rt'> -! ____ - ALLOCATE(XLES_RES_W_SBG_Rt2 (NLES_K,NLES_TIMES,NLES_MASKS))! <w'Rt'2> -! _______ - ALLOCATE(XLES_RES_W_SBG_ThlRt (NLES_K,NLES_TIMES,NLES_MASKS))! <w'Thl'Rt'> -! ______ - ALLOCATE(XLES_RES_ddxa_W_SBG_UaRt (NLES_K,NLES_TIMES,NLES_MASKS))! <dw'/dxa ua'Rt'> -! _____ - ALLOCATE(XLES_RES_ddxa_Rt_SBG_UaW (NLES_K,NLES_TIMES,NLES_MASKS))! <dRt'/dxa ua'w'> -! ___ - ALLOCATE(XLES_RES_ddz_Rt_SBG_W2 (NLES_K,NLES_TIMES,NLES_MASKS))! <dRt'/dz w'2> -! ______ - ALLOCATE(XLES_RES_ddxa_Thl_SBG_UaRt (NLES_K,NLES_TIMES,NLES_MASKS))! <dThl'/dxa ua'Rt'> -! _______ - ALLOCATE(XLES_RES_ddxa_Rt_SBG_UaThl (NLES_K,NLES_TIMES,NLES_MASKS))! <dRt'/dxa ua'Thl'> -! ______ - ALLOCATE(XLES_RES_ddxa_Rt_SBG_UaRt (NLES_K,NLES_TIMES,NLES_MASKS)) ! <dRt'/dxa ua'Rt'> -ELSE - ALLOCATE(XLES_RES_W_SBG_WRt (0,0,0)) - ALLOCATE(XLES_RES_W_SBG_Rt2 (0,0,0)) - ALLOCATE(XLES_RES_W_SBG_ThlRt (0,0,0)) - ALLOCATE(XLES_RES_ddxa_W_SBG_UaRt (0,0,0)) - ALLOCATE(XLES_RES_ddxa_Rt_SBG_UaW (0,0,0)) - ALLOCATE(XLES_RES_ddz_Rt_SBG_W2 (0,0,0)) - ALLOCATE(XLES_RES_ddxa_Thl_SBG_UaRt (0,0,0)) - ALLOCATE(XLES_RES_ddxa_Rt_SBG_UaThl (0,0,0)) - ALLOCATE(XLES_RES_ddxa_Rt_SBG_UaRt (0,0,0)) -END IF -! -! ______ -ALLOCATE(XLES_RES_ddxa_W_SBG_UaSv (NLES_K,NLES_TIMES,NLES_MASKS,NSV)) ! <dw'/dxa ua'Sv'> -! _____ -ALLOCATE(XLES_RES_ddxa_Sv_SBG_UaW (NLES_K,NLES_TIMES,NLES_MASKS,NSV)) ! <dSv'/dxa ua'w'> -! ___ -ALLOCATE(XLES_RES_ddz_Sv_SBG_W2 (NLES_K,NLES_TIMES,NLES_MASKS,NSV)) ! <dSv'/dz w'2> -! ______ -ALLOCATE(XLES_RES_ddxa_Sv_SBG_UaSv(NLES_K,NLES_TIMES,NLES_MASKS,NSV)) ! <dSv'/dxa ua'Sv'> -! _____ -ALLOCATE(XLES_RES_W_SBG_WSv (NLES_K,NLES_TIMES,NLES_MASKS,NSV)) ! <w'w'Sv'> -! ____ -ALLOCATE(XLES_RES_W_SBG_Sv2 (NLES_K,NLES_TIMES,NLES_MASKS,NSV)) ! <w'Sv'2> -! -XLES_RES_U_SBG_Tke= XUNDEF -XLES_RES_V_SBG_Tke= XUNDEF -XLES_RES_W_SBG_Tke= XUNDEF -XLES_RES_W_SBG_WThl = XUNDEF -XLES_RES_W_SBG_Thl2 = XUNDEF -XLES_RES_ddxa_U_SBG_UaU = XUNDEF -XLES_RES_ddxa_V_SBG_UaV = XUNDEF -XLES_RES_ddxa_W_SBG_UaW = XUNDEF -XLES_RES_ddxa_W_SBG_UaThl = XUNDEF -XLES_RES_ddxa_Thl_SBG_UaW = XUNDEF -XLES_RES_ddz_Thl_SBG_W2 = XUNDEF -XLES_RES_ddxa_Thl_SBG_UaThl = XUNDEF -IF (LUSERV) THEN - XLES_RES_W_SBG_WRt = XUNDEF - XLES_RES_W_SBG_Rt2 = XUNDEF - XLES_RES_W_SBG_ThlRt = XUNDEF - XLES_RES_ddxa_W_SBG_UaRt = XUNDEF - XLES_RES_ddxa_Rt_SBG_UaW = XUNDEF - XLES_RES_ddz_Rt_SBG_W2 = XUNDEF - XLES_RES_ddxa_Thl_SBG_UaRt= XUNDEF - XLES_RES_ddxa_Rt_SBG_UaThl= XUNDEF - XLES_RES_ddxa_Rt_SBG_UaRt = XUNDEF -END IF -IF (NSV>0) THEN - XLES_RES_ddxa_W_SBG_UaSv = XUNDEF - XLES_RES_ddxa_Sv_SBG_UaW = XUNDEF - XLES_RES_ddz_Sv_SBG_W2 = XUNDEF - XLES_RES_ddxa_Sv_SBG_UaSv= XUNDEF - XLES_RES_W_SBG_WSv = XUNDEF - XLES_RES_W_SBG_Sv2 = XUNDEF -END IF -! -! -!* 7.5 subgrid quantities -! ------------------ -! -ALLOCATE(XLES_SUBGRID_U2 (NLES_K,NLES_TIMES,NLES_MASKS)) ! <u'2> -ALLOCATE(XLES_SUBGRID_V2 (NLES_K,NLES_TIMES,NLES_MASKS)) ! <v'2> -ALLOCATE(XLES_SUBGRID_W2 (NLES_K,NLES_TIMES,NLES_MASKS)) ! <w'2> -ALLOCATE(XLES_SUBGRID_Tke (NLES_K,NLES_TIMES,NLES_MASKS)) ! <e> -ALLOCATE(XLES_SUBGRID_Thl2 (NLES_K,NLES_TIMES,NLES_MASKS)) ! <Thl'2> -ALLOCATE(XLES_SUBGRID_UV (NLES_K,NLES_TIMES,NLES_MASKS)) ! <u'v'> -ALLOCATE(XLES_SUBGRID_WU (NLES_K,NLES_TIMES,NLES_MASKS)) ! <w'u'> -ALLOCATE(XLES_SUBGRID_WV (NLES_K,NLES_TIMES,NLES_MASKS)) ! <w'v'> -ALLOCATE(XLES_SUBGRID_UThl (NLES_K,NLES_TIMES,NLES_MASKS)) ! <u'Thl'> -ALLOCATE(XLES_SUBGRID_VThl (NLES_K,NLES_TIMES,NLES_MASKS)) ! <v'Thl'> -ALLOCATE(XLES_SUBGRID_WThl (NLES_K,NLES_TIMES,NLES_MASKS)) ! <w'Thl'> -ALLOCATE(XLES_SUBGRID_WThv (NLES_K,NLES_TIMES,NLES_MASKS)) ! <w'Thv'> -ALLOCATE(XLES_SUBGRID_ThlThv (NLES_K,NLES_TIMES,NLES_MASKS)) ! <Thl'Thv'> -ALLOCATE(XLES_SUBGRID_W2Thl (NLES_K,NLES_TIMES,NLES_MASKS)) ! <w'2Thl> -ALLOCATE(XLES_SUBGRID_WThl2 (NLES_K,NLES_TIMES,NLES_MASKS)) ! <w'Thl'2> -ALLOCATE(XLES_SUBGRID_DISS_Tke (NLES_K,NLES_TIMES,NLES_MASKS)) ! <epsilon> -ALLOCATE(XLES_SUBGRID_DISS_Thl2(NLES_K,NLES_TIMES,NLES_MASKS)) ! <epsilon_Thl2> -ALLOCATE(XLES_SUBGRID_WP (NLES_K,NLES_TIMES,NLES_MASKS)) ! <w'p'> -ALLOCATE(XLES_SUBGRID_PHI3 (NLES_K,NLES_TIMES,NLES_MASKS)) ! phi3 -ALLOCATE(XLES_SUBGRID_LMix (NLES_K,NLES_TIMES,NLES_MASKS)) ! mixing length -ALLOCATE(XLES_SUBGRID_LDiss (NLES_K,NLES_TIMES,NLES_MASKS)) ! dissipative length -ALLOCATE(XLES_SUBGRID_Km (NLES_K,NLES_TIMES,NLES_MASKS)) ! Km -ALLOCATE(XLES_SUBGRID_Kh (NLES_K,NLES_TIMES,NLES_MASKS)) ! Kh -ALLOCATE(XLES_SUBGRID_ThlPz (NLES_K,NLES_TIMES,NLES_MASKS)) ! <Thl'dp'/dz> -ALLOCATE(XLES_SUBGRID_UTke (NLES_K,NLES_TIMES,NLES_MASKS)) ! <u'Tke> -ALLOCATE(XLES_SUBGRID_VTke (NLES_K,NLES_TIMES,NLES_MASKS)) ! <v'Tke> -ALLOCATE(XLES_SUBGRID_WTke (NLES_K,NLES_TIMES,NLES_MASKS)) ! <w'Tke> -ALLOCATE(XLES_SUBGRID_ddz_WTke (NLES_K,NLES_TIMES,NLES_MASKS)) ! <dw'Tke/dz> - -ALLOCATE(XLES_SUBGRID_THLUP_MF(NLES_K,NLES_TIMES,NLES_MASKS)) ! Thl of the Updraft -ALLOCATE(XLES_SUBGRID_RTUP_MF (NLES_K,NLES_TIMES,NLES_MASKS)) ! Rt of the Updraft -ALLOCATE(XLES_SUBGRID_RVUP_MF (NLES_K,NLES_TIMES,NLES_MASKS)) ! Rv of the Updraft -ALLOCATE(XLES_SUBGRID_RCUP_MF (NLES_K,NLES_TIMES,NLES_MASKS)) ! Rc of the Updraft -ALLOCATE(XLES_SUBGRID_RIUP_MF (NLES_K,NLES_TIMES,NLES_MASKS)) ! Ri of the Updraft -ALLOCATE(XLES_SUBGRID_WUP_MF (NLES_K,NLES_TIMES,NLES_MASKS)) ! Thl of the Updraft -ALLOCATE(XLES_SUBGRID_MASSFLUX(NLES_K,NLES_TIMES,NLES_MASKS)) ! Mass Flux -ALLOCATE(XLES_SUBGRID_DETR (NLES_K,NLES_TIMES,NLES_MASKS)) ! Detrainment -ALLOCATE(XLES_SUBGRID_ENTR (NLES_K,NLES_TIMES,NLES_MASKS)) ! Entrainment -ALLOCATE(XLES_SUBGRID_FRACUP (NLES_K,NLES_TIMES,NLES_MASKS)) ! Updraft Fraction -ALLOCATE(XLES_SUBGRID_THVUP_MF(NLES_K,NLES_TIMES,NLES_MASKS)) ! Thv of the Updraft -ALLOCATE(XLES_SUBGRID_WTHLMF (NLES_K,NLES_TIMES,NLES_MASKS)) ! Flux of thl -ALLOCATE(XLES_SUBGRID_WRTMF (NLES_K,NLES_TIMES,NLES_MASKS)) ! Flux of rt -ALLOCATE(XLES_SUBGRID_WTHVMF (NLES_K,NLES_TIMES,NLES_MASKS)) ! Flux of thv -ALLOCATE(XLES_SUBGRID_WUMF (NLES_K,NLES_TIMES,NLES_MASKS))! Flux of u -ALLOCATE(XLES_SUBGRID_WVMF (NLES_K,NLES_TIMES,NLES_MASKS))! Flux of v - -IF (LUSERV ) THEN - ALLOCATE(XLES_SUBGRID_Rt2 (NLES_K,NLES_TIMES,NLES_MASKS)) ! <Rt'2> - ALLOCATE(XLES_SUBGRID_ThlRt (NLES_K,NLES_TIMES,NLES_MASKS)) ! <Thl'Rt'> - ALLOCATE(XLES_SUBGRID_URt (NLES_K,NLES_TIMES,NLES_MASKS)) ! <u'Rt'> - ALLOCATE(XLES_SUBGRID_VRt (NLES_K,NLES_TIMES,NLES_MASKS)) ! <v'Rt'> - ALLOCATE(XLES_SUBGRID_WRt (NLES_K,NLES_TIMES,NLES_MASKS)) ! <w'Rt'> - ALLOCATE(XLES_SUBGRID_RtThv (NLES_K,NLES_TIMES,NLES_MASKS)) ! <Rt'Thv'> - ALLOCATE(XLES_SUBGRID_W2Rt (NLES_K,NLES_TIMES,NLES_MASKS)) ! <w'2Rt'> - ALLOCATE(XLES_SUBGRID_WThlRt(NLES_K,NLES_TIMES,NLES_MASKS)) ! <w'Thl'Rt'> - ALLOCATE(XLES_SUBGRID_WRt2 (NLES_K,NLES_TIMES,NLES_MASKS)) ! <w'Rt'2> - ALLOCATE(XLES_SUBGRID_DISS_Rt2 (NLES_K,NLES_TIMES,NLES_MASKS)) ! <epsilon_Rt2> - ALLOCATE(XLES_SUBGRID_DISS_ThlRt(NLES_K,NLES_TIMES,NLES_MASKS)) ! <epsilon_ThlRt> - ALLOCATE(XLES_SUBGRID_RtPz (NLES_K,NLES_TIMES,NLES_MASKS)) ! <Rt'dp'/dz> - ALLOCATE(XLES_SUBGRID_PSI3 (NLES_K,NLES_TIMES,NLES_MASKS)) ! psi3 -ELSE - ALLOCATE(XLES_SUBGRID_Rt2 (0,0,0)) - ALLOCATE(XLES_SUBGRID_ThlRt (0,0,0)) - ALLOCATE(XLES_SUBGRID_URt (0,0,0)) - ALLOCATE(XLES_SUBGRID_VRt (0,0,0)) - ALLOCATE(XLES_SUBGRID_WRt (0,0,0)) - ALLOCATE(XLES_SUBGRID_RtThv (0,0,0)) - ALLOCATE(XLES_SUBGRID_W2Rt (0,0,0)) - ALLOCATE(XLES_SUBGRID_WThlRt(0,0,0)) - ALLOCATE(XLES_SUBGRID_WRt2 (0,0,0)) - ALLOCATE(XLES_SUBGRID_DISS_Rt2 (0,0,0)) - ALLOCATE(XLES_SUBGRID_DISS_ThlRt(0,0,0)) - ALLOCATE(XLES_SUBGRID_RtPz (0,0,0)) - ALLOCATE(XLES_SUBGRID_PSI3 (0,0,0)) -END IF -IF (LUSERC ) THEN - ALLOCATE(XLES_SUBGRID_Rc2 (NLES_K,NLES_TIMES,NLES_MASKS)) ! <Rc'2> - ALLOCATE(XLES_SUBGRID_URc (NLES_K,NLES_TIMES,NLES_MASKS)) ! <u'Rc'> - ALLOCATE(XLES_SUBGRID_VRc (NLES_K,NLES_TIMES,NLES_MASKS)) ! <v'Rc'> - ALLOCATE(XLES_SUBGRID_WRc (NLES_K,NLES_TIMES,NLES_MASKS)) ! <w'Rc'> -ELSE - ALLOCATE(XLES_SUBGRID_Rc2 (0,0,0)) - ALLOCATE(XLES_SUBGRID_URc (0,0,0)) - ALLOCATE(XLES_SUBGRID_VRc (0,0,0)) - ALLOCATE(XLES_SUBGRID_WRc (0,0,0)) -END IF -IF (LUSERI ) THEN - ALLOCATE(XLES_SUBGRID_Ri2 (NLES_K,NLES_TIMES,NLES_MASKS)) ! <Ri'2> -ELSE - ALLOCATE(XLES_SUBGRID_Ri2 (0,0,0)) -END IF -IF (NSV>0 ) THEN - ALLOCATE(XLES_SUBGRID_USv (NLES_K,NLES_TIMES,NLES_MASKS,NSV)) ! <u'Sv'> - ALLOCATE(XLES_SUBGRID_VSv (NLES_K,NLES_TIMES,NLES_MASKS,NSV)) ! <v'Sv'> - ALLOCATE(XLES_SUBGRID_WSv (NLES_K,NLES_TIMES,NLES_MASKS,NSV)) ! <w'Sv'> - ALLOCATE(XLES_SUBGRID_Sv2 (NLES_K,NLES_TIMES,NLES_MASKS,NSV)) ! <Sv'2> - ALLOCATE(XLES_SUBGRID_SvThv (NLES_K,NLES_TIMES,NLES_MASKS,NSV)) ! <Sv'Thv'> - ALLOCATE(XLES_SUBGRID_W2Sv (NLES_K,NLES_TIMES,NLES_MASKS,NSV)) ! <w'2Sv'> - ALLOCATE(XLES_SUBGRID_WSv2 (NLES_K,NLES_TIMES,NLES_MASKS,NSV)) ! <w'Sv'2> - ALLOCATE(XLES_SUBGRID_DISS_Sv2 (NLES_K,NLES_TIMES,NLES_MASKS,NSV)) ! <epsilon_Sv2> - ALLOCATE(XLES_SUBGRID_SvPz (NLES_K,NLES_TIMES,NLES_MASKS,NSV)) ! <Sv'dp'/dz> -ELSE - ALLOCATE(XLES_SUBGRID_USv (0,0,0,0)) - ALLOCATE(XLES_SUBGRID_VSv (0,0,0,0)) - ALLOCATE(XLES_SUBGRID_WSv (0,0,0,0)) - ALLOCATE(XLES_SUBGRID_Sv2 (0,0,0,0)) - ALLOCATE(XLES_SUBGRID_SvThv (0,0,0,0)) - ALLOCATE(XLES_SUBGRID_W2Sv (0,0,0,0)) - ALLOCATE(XLES_SUBGRID_WSv2 (0,0,0,0)) - ALLOCATE(XLES_SUBGRID_DISS_Sv2(0,0,0,0)) - ALLOCATE(XLES_SUBGRID_SvPz (0,0,0,0)) -END IF -! -XLES_SUBGRID_U2 = XUNDEF -XLES_SUBGRID_V2 = XUNDEF -XLES_SUBGRID_W2 = XUNDEF -XLES_SUBGRID_Tke = XUNDEF -XLES_SUBGRID_Thl2= XUNDEF -XLES_SUBGRID_UV = XUNDEF -XLES_SUBGRID_WU = XUNDEF -XLES_SUBGRID_WV = XUNDEF -XLES_SUBGRID_UThl= XUNDEF -XLES_SUBGRID_VThl= XUNDEF -XLES_SUBGRID_WThl= XUNDEF -XLES_SUBGRID_WThv= XUNDEF -XLES_SUBGRID_ThlThv= XUNDEF -XLES_SUBGRID_W2Thl= XUNDEF -XLES_SUBGRID_WThl2 = XUNDEF -XLES_SUBGRID_DISS_Tke = XUNDEF -XLES_SUBGRID_DISS_Thl2= XUNDEF -XLES_SUBGRID_WP = XUNDEF -XLES_SUBGRID_PHI3 = XUNDEF -XLES_SUBGRID_LMix = XUNDEF -XLES_SUBGRID_LDiss = XUNDEF -XLES_SUBGRID_Km = XUNDEF -XLES_SUBGRID_Kh = XUNDEF -XLES_SUBGRID_ThlPz = XUNDEF -XLES_SUBGRID_UTke= XUNDEF -XLES_SUBGRID_VTke= XUNDEF -XLES_SUBGRID_WTke= XUNDEF -XLES_SUBGRID_ddz_WTke = XUNDEF - -XLES_SUBGRID_THLUP_MF = XUNDEF -XLES_SUBGRID_RTUP_MF = XUNDEF -XLES_SUBGRID_RVUP_MF = XUNDEF -XLES_SUBGRID_RCUP_MF = XUNDEF -XLES_SUBGRID_RIUP_MF = XUNDEF -XLES_SUBGRID_WUP_MF = XUNDEF -XLES_SUBGRID_MASSFLUX = XUNDEF -XLES_SUBGRID_DETR = XUNDEF -XLES_SUBGRID_ENTR = XUNDEF -XLES_SUBGRID_FRACUP = XUNDEF -XLES_SUBGRID_THVUP_MF = XUNDEF -XLES_SUBGRID_WTHLMF = XUNDEF -XLES_SUBGRID_WRTMF = XUNDEF -XLES_SUBGRID_WTHVMF = XUNDEF -XLES_SUBGRID_WUMF = XUNDEF -XLES_SUBGRID_WVMF = XUNDEF - -IF (LUSERV ) THEN - XLES_SUBGRID_Rt2 = XUNDEF - XLES_SUBGRID_ThlRt= XUNDEF - XLES_SUBGRID_URt = XUNDEF - XLES_SUBGRID_VRt = XUNDEF - XLES_SUBGRID_WRt = XUNDEF - XLES_SUBGRID_RtThv = XUNDEF - XLES_SUBGRID_W2Rt = XUNDEF - XLES_SUBGRID_WThlRt = XUNDEF - XLES_SUBGRID_WRt2 = XUNDEF - XLES_SUBGRID_DISS_Rt2= XUNDEF - XLES_SUBGRID_DISS_ThlRt= XUNDEF - XLES_SUBGRID_RtPz = XUNDEF - XLES_SUBGRID_PSI3 = XUNDEF -END IF -IF (LUSERC ) THEN - XLES_SUBGRID_Rc2 = XUNDEF - XLES_SUBGRID_URc = XUNDEF - XLES_SUBGRID_VRc = XUNDEF - XLES_SUBGRID_WRc = XUNDEF -END IF -IF (LUSERI ) THEN - XLES_SUBGRID_Ri2 = XUNDEF -END IF -IF (NSV>0 ) THEN - XLES_SUBGRID_USv = XUNDEF - XLES_SUBGRID_VSv = XUNDEF - XLES_SUBGRID_WSv = XUNDEF - XLES_SUBGRID_Sv2 = XUNDEF - XLES_SUBGRID_SvThv = XUNDEF - XLES_SUBGRID_W2Sv = XUNDEF - XLES_SUBGRID_WSv2 = XUNDEF - XLES_SUBGRID_DISS_Sv2= XUNDEF - XLES_SUBGRID_SvPz = XUNDEF -END IF -! -! -!* 7.6 updraft quantities (only on the cartesian mask) -! ------------------ -! -ALLOCATE(XLES_UPDRAFT (NLES_K,NLES_TIMES)) ! updraft fraction -ALLOCATE(XLES_UPDRAFT_W (NLES_K,NLES_TIMES)) ! <w> -ALLOCATE(XLES_UPDRAFT_Th (NLES_K,NLES_TIMES)) ! <theta> -ALLOCATE(XLES_UPDRAFT_Ke (NLES_K,NLES_TIMES)) ! <E> -ALLOCATE(XLES_UPDRAFT_WTh (NLES_K,NLES_TIMES)) ! <w'theta'> -ALLOCATE(XLES_UPDRAFT_Th2 (NLES_K,NLES_TIMES)) ! <th'2> -ALLOCATE(XLES_UPDRAFT_Tke (NLES_K,NLES_TIMES)) ! <e> - -IF (LUSERV) THEN - ALLOCATE(XLES_UPDRAFT_Thv (NLES_K,NLES_TIMES)) ! <thetav> - ALLOCATE(XLES_UPDRAFT_WThv (NLES_K,NLES_TIMES)) ! <w'thv'> - ALLOCATE(XLES_UPDRAFT_ThThv (NLES_K,NLES_TIMES)) ! <th'thv'> -ELSE - ALLOCATE(XLES_UPDRAFT_Thv (0,0)) - ALLOCATE(XLES_UPDRAFT_WThv (0,0)) - ALLOCATE(XLES_UPDRAFT_ThThv (0,0)) -END IF -! -IF (LUSERC) THEN - ALLOCATE(XLES_UPDRAFT_Thl (NLES_K,NLES_TIMES)) ! <thetal> - ALLOCATE(XLES_UPDRAFT_WThl (NLES_K,NLES_TIMES)) ! <w'thetal'> - ALLOCATE(XLES_UPDRAFT_Thl2 (NLES_K,NLES_TIMES)) ! <thl'2> - ALLOCATE(XLES_UPDRAFT_ThlThv(NLES_K,NLES_TIMES)) ! <thl'thv'> -ELSE - ALLOCATE(XLES_UPDRAFT_Thl (0,0)) - ALLOCATE(XLES_UPDRAFT_WThl (0,0)) - ALLOCATE(XLES_UPDRAFT_Thl2 (0,0)) - ALLOCATE(XLES_UPDRAFT_ThlThv(0,0)) -END IF - -IF (LUSERV ) THEN - ALLOCATE(XLES_UPDRAFT_Rv (NLES_K,NLES_TIMES)) ! <Rv> - ALLOCATE(XLES_UPDRAFT_WRv (NLES_K,NLES_TIMES)) ! <w'Rv'> - ALLOCATE(XLES_UPDRAFT_Rv2 (NLES_K,NLES_TIMES)) ! <Rv'2> - ALLOCATE(XLES_UPDRAFT_ThRv (NLES_K,NLES_TIMES)) ! <Th'Rv'> - ALLOCATE(XLES_UPDRAFT_ThvRv (NLES_K,NLES_TIMES)) ! <Thv'Rv'> - IF (LUSERC) THEN - ALLOCATE(XLES_UPDRAFT_ThlRv (NLES_K,NLES_TIMES)) ! <Thl'Rv'> - ELSE - ALLOCATE(XLES_UPDRAFT_ThlRv (0,0)) - END IF -ELSE - ALLOCATE(XLES_UPDRAFT_Rv (0,0)) - ALLOCATE(XLES_UPDRAFT_WRv (0,0)) - ALLOCATE(XLES_UPDRAFT_Rv2 (0,0)) - ALLOCATE(XLES_UPDRAFT_ThRv (0,0)) - ALLOCATE(XLES_UPDRAFT_ThvRv (0,0)) - ALLOCATE(XLES_UPDRAFT_ThlRv (0,0)) -END IF -IF (LUSERC ) THEN - ALLOCATE(XLES_UPDRAFT_Rc (NLES_K,NLES_TIMES)) ! <Rc> - ALLOCATE(XLES_UPDRAFT_WRc (NLES_K,NLES_TIMES)) ! <w'Rc'> - ALLOCATE(XLES_UPDRAFT_Rc2 (NLES_K,NLES_TIMES)) ! <Rc'2> - ALLOCATE(XLES_UPDRAFT_ThRc (NLES_K,NLES_TIMES)) ! <Th'Rc'> - ALLOCATE(XLES_UPDRAFT_ThvRc (NLES_K,NLES_TIMES)) ! <Thv'Rc'> - ALLOCATE(XLES_UPDRAFT_ThlRc (NLES_K,NLES_TIMES)) ! <Thl'Rc'> -ELSE - ALLOCATE(XLES_UPDRAFT_Rc (0,0)) - ALLOCATE(XLES_UPDRAFT_WRc (0,0)) - ALLOCATE(XLES_UPDRAFT_Rc2 (0,0)) - ALLOCATE(XLES_UPDRAFT_ThRc (0,0)) - ALLOCATE(XLES_UPDRAFT_ThvRc (0,0)) - ALLOCATE(XLES_UPDRAFT_ThlRc (0,0)) -END IF -IF (LUSERR ) THEN - ALLOCATE(XLES_UPDRAFT_Rr (NLES_K,NLES_TIMES)) ! <Rr> -ELSE - ALLOCATE(XLES_UPDRAFT_Rr (0,0)) -END IF -IF (LUSERI ) THEN - ALLOCATE(XLES_UPDRAFT_Ri (NLES_K,NLES_TIMES)) ! <Ri> - ALLOCATE(XLES_UPDRAFT_WRi (NLES_K,NLES_TIMES)) ! <w'Ri'> - ALLOCATE(XLES_UPDRAFT_Ri2 (NLES_K,NLES_TIMES)) ! <Ri'2> - ALLOCATE(XLES_UPDRAFT_ThRi (NLES_K,NLES_TIMES)) ! <Th'Ri'> - ALLOCATE(XLES_UPDRAFT_ThvRi (NLES_K,NLES_TIMES)) ! <Thv'Ri'> - ALLOCATE(XLES_UPDRAFT_ThlRi (NLES_K,NLES_TIMES)) ! <Thl'Ri'> -ELSE - ALLOCATE(XLES_UPDRAFT_Ri (0,0)) - ALLOCATE(XLES_UPDRAFT_WRi (0,0)) - ALLOCATE(XLES_UPDRAFT_Ri2 (0,0)) - ALLOCATE(XLES_UPDRAFT_ThRi (0,0)) - ALLOCATE(XLES_UPDRAFT_ThvRi (0,0)) - ALLOCATE(XLES_UPDRAFT_ThlRi (0,0)) -END IF -IF (LUSERS ) THEN - ALLOCATE(XLES_UPDRAFT_Rs (NLES_K,NLES_TIMES)) ! <Rs> -ELSE - ALLOCATE(XLES_UPDRAFT_Rs (0,0)) -END IF -IF (LUSERG ) THEN - ALLOCATE(XLES_UPDRAFT_Rg (NLES_K,NLES_TIMES)) ! <Rg> -ELSE - ALLOCATE(XLES_UPDRAFT_Rg (0,0)) -END IF -IF (LUSERH ) THEN - ALLOCATE(XLES_UPDRAFT_Rh (NLES_K,NLES_TIMES)) ! <Rh> -ELSE - ALLOCATE(XLES_UPDRAFT_Rh (0,0)) -END IF -IF (NSV>0 ) THEN - ALLOCATE(XLES_UPDRAFT_Sv (NLES_K,NLES_TIMES,NSV))! <Sv> - ALLOCATE(XLES_UPDRAFT_WSv (NLES_K,NLES_TIMES,NSV))! <w'Sv'> - ALLOCATE(XLES_UPDRAFT_Sv2 (NLES_K,NLES_TIMES,NSV))! <Sv'2> - ALLOCATE(XLES_UPDRAFT_ThSv (NLES_K,NLES_TIMES,NSV))! <Th'Sv'> - IF (LUSERV) THEN - ALLOCATE(XLES_UPDRAFT_ThvSv (NLES_K,NLES_TIMES,NSV))! <Thv'Sv'> - ELSE - ALLOCATE(XLES_UPDRAFT_ThvSv (0,0,0)) - END IF - IF (LUSERC) THEN - ALLOCATE(XLES_UPDRAFT_ThlSv (NLES_K,NLES_TIMES,NSV))! <Thl'Sv'> - ELSE - ALLOCATE(XLES_UPDRAFT_ThlSv (0,0,0)) - END IF -ELSE - ALLOCATE(XLES_UPDRAFT_Sv (0,0,0)) - ALLOCATE(XLES_UPDRAFT_WSv (0,0,0)) - ALLOCATE(XLES_UPDRAFT_Sv2 (0,0,0)) - ALLOCATE(XLES_UPDRAFT_ThSv (0,0,0)) - ALLOCATE(XLES_UPDRAFT_ThvSv (0,0,0)) - ALLOCATE(XLES_UPDRAFT_ThlSv (0,0,0)) -END IF -! -! -XLES_UPDRAFT = XUNDEF -XLES_UPDRAFT_W = XUNDEF -XLES_UPDRAFT_Th = XUNDEF -XLES_UPDRAFT_Thl = XUNDEF -XLES_UPDRAFT_Tke = XUNDEF -IF (LUSERV ) XLES_UPDRAFT_Thv = XUNDEF -IF (LUSERC ) XLES_UPDRAFT_Thl = XUNDEF -IF (LUSERV ) XLES_UPDRAFT_Rv = XUNDEF -IF (LUSERC ) XLES_UPDRAFT_Rc = XUNDEF -IF (LUSERR ) XLES_UPDRAFT_Rr = XUNDEF -IF (LUSERI ) XLES_UPDRAFT_Ri = XUNDEF -IF (LUSERS ) XLES_UPDRAFT_Rs = XUNDEF -IF (LUSERG ) XLES_UPDRAFT_Rg = XUNDEF -IF (LUSERH ) XLES_UPDRAFT_Rh = XUNDEF -IF (NSV>0 ) XLES_UPDRAFT_Sv = XUNDEF -XLES_UPDRAFT_Ke = XUNDEF -XLES_UPDRAFT_WTh = XUNDEF -IF (LUSERV ) XLES_UPDRAFT_WThv = XUNDEF -IF (LUSERC ) XLES_UPDRAFT_WThl = XUNDEF -IF (LUSERV ) XLES_UPDRAFT_WRv = XUNDEF -IF (LUSERC ) XLES_UPDRAFT_WRc = XUNDEF -IF (LUSERI ) XLES_UPDRAFT_WRi = XUNDEF -IF (NSV>0 ) XLES_UPDRAFT_WSv = XUNDEF -XLES_UPDRAFT_Th2 = XUNDEF -IF (LUSERV ) THEN - XLES_UPDRAFT_ThThv = XUNDEF -END IF -IF (LUSERC ) THEN - XLES_UPDRAFT_Thl2 = XUNDEF - XLES_UPDRAFT_ThlThv = XUNDEF -END IF -IF (LUSERV ) XLES_UPDRAFT_Rv2 = XUNDEF -IF (LUSERC ) XLES_UPDRAFT_Rc2 = XUNDEF -IF (LUSERI ) XLES_UPDRAFT_Ri2 = XUNDEF -IF (NSV>0 ) XLES_UPDRAFT_Sv2 = XUNDEF -IF (LUSERV ) XLES_UPDRAFT_ThRv = XUNDEF -IF (LUSERC ) XLES_UPDRAFT_ThRc = XUNDEF -IF (LUSERI ) XLES_UPDRAFT_ThRi = XUNDEF -IF (LUSERC ) XLES_UPDRAFT_ThlRv= XUNDEF -IF (LUSERC ) XLES_UPDRAFT_ThlRc= XUNDEF -IF (LUSERI ) XLES_UPDRAFT_ThlRi= XUNDEF -IF (NSV>0 ) XLES_UPDRAFT_ThSv = XUNDEF -IF (LUSERV ) XLES_UPDRAFT_ThvRv= XUNDEF -IF (LUSERC ) XLES_UPDRAFT_ThvRc= XUNDEF -IF (LUSERI ) XLES_UPDRAFT_ThvRi= XUNDEF -IF (NSV>0 .AND. LUSERV) XLES_UPDRAFT_ThvSv = XUNDEF -IF (NSV>0 .AND. LUSERC) XLES_UPDRAFT_ThlSv = XUNDEF -! -! -!* 7.7 downdraft quantities (only on the cartesian mask) -! -------------------- -! -ALLOCATE(XLES_DOWNDRAFT (NLES_K,NLES_TIMES)) ! updraft fraction -ALLOCATE(XLES_DOWNDRAFT_W (NLES_K,NLES_TIMES)) ! <w> -ALLOCATE(XLES_DOWNDRAFT_Th (NLES_K,NLES_TIMES)) ! <theta> -ALLOCATE(XLES_DOWNDRAFT_Ke (NLES_K,NLES_TIMES)) ! <E> -ALLOCATE(XLES_DOWNDRAFT_WTh (NLES_K,NLES_TIMES)) ! <w'theta'> -ALLOCATE(XLES_DOWNDRAFT_Th2 (NLES_K,NLES_TIMES)) ! <th'2> -ALLOCATE(XLES_DOWNDRAFT_Tke (NLES_K,NLES_TIMES)) ! <e> - -IF (LUSERV) THEN - ALLOCATE(XLES_DOWNDRAFT_Thv (NLES_K,NLES_TIMES)) ! <thetav> - ALLOCATE(XLES_DOWNDRAFT_WThv (NLES_K,NLES_TIMES)) ! <w'thv'> - ALLOCATE(XLES_DOWNDRAFT_ThThv (NLES_K,NLES_TIMES)) ! <th'thv'> -ELSE - ALLOCATE(XLES_DOWNDRAFT_Thv (0,0)) - ALLOCATE(XLES_DOWNDRAFT_WThv (0,0)) - ALLOCATE(XLES_DOWNDRAFT_ThThv (0,0)) -END IF -! -IF (LUSERC) THEN - ALLOCATE(XLES_DOWNDRAFT_Thl (NLES_K,NLES_TIMES)) ! <thetal> - ALLOCATE(XLES_DOWNDRAFT_WThl (NLES_K,NLES_TIMES)) ! <w'thetal'> - ALLOCATE(XLES_DOWNDRAFT_Thl2 (NLES_K,NLES_TIMES)) ! <thl'2> - ALLOCATE(XLES_DOWNDRAFT_ThlThv(NLES_K,NLES_TIMES)) ! <thl'thv'> -ELSE - ALLOCATE(XLES_DOWNDRAFT_Thl (0,0)) - ALLOCATE(XLES_DOWNDRAFT_WThl (0,0)) - ALLOCATE(XLES_DOWNDRAFT_Thl2 (0,0)) - ALLOCATE(XLES_DOWNDRAFT_ThlThv(0,0)) -END IF - -IF (LUSERV ) THEN - ALLOCATE(XLES_DOWNDRAFT_Rv (NLES_K,NLES_TIMES)) ! <Rv> - ALLOCATE(XLES_DOWNDRAFT_WRv (NLES_K,NLES_TIMES)) ! <w'Rv'> - ALLOCATE(XLES_DOWNDRAFT_Rv2 (NLES_K,NLES_TIMES)) ! <Rv'2> - ALLOCATE(XLES_DOWNDRAFT_ThRv (NLES_K,NLES_TIMES)) ! <Th'Rv'> - ALLOCATE(XLES_DOWNDRAFT_ThvRv (NLES_K,NLES_TIMES)) ! <Thv'Rv'> - IF (LUSERC) THEN - ALLOCATE(XLES_DOWNDRAFT_ThlRv (NLES_K,NLES_TIMES)) ! <Thl'Rv'> - ELSE - ALLOCATE(XLES_DOWNDRAFT_ThlRv (0,0)) - END IF -ELSE - ALLOCATE(XLES_DOWNDRAFT_Rv (0,0)) - ALLOCATE(XLES_DOWNDRAFT_WRv (0,0)) - ALLOCATE(XLES_DOWNDRAFT_Rv2 (0,0)) - ALLOCATE(XLES_DOWNDRAFT_ThRv (0,0)) - ALLOCATE(XLES_DOWNDRAFT_ThvRv (0,0)) - ALLOCATE(XLES_DOWNDRAFT_ThlRv (0,0)) -END IF -IF (LUSERC ) THEN - ALLOCATE(XLES_DOWNDRAFT_Rc (NLES_K,NLES_TIMES)) ! <Rc> - ALLOCATE(XLES_DOWNDRAFT_WRc (NLES_K,NLES_TIMES)) ! <w'Rc'> - ALLOCATE(XLES_DOWNDRAFT_Rc2 (NLES_K,NLES_TIMES)) ! <Rc'2> - ALLOCATE(XLES_DOWNDRAFT_ThRc (NLES_K,NLES_TIMES)) ! <Th'Rc'> - ALLOCATE(XLES_DOWNDRAFT_ThvRc (NLES_K,NLES_TIMES)) ! <Thv'Rc'> - ALLOCATE(XLES_DOWNDRAFT_ThlRc (NLES_K,NLES_TIMES)) ! <Thl'Rc'> -ELSE - ALLOCATE(XLES_DOWNDRAFT_Rc (0,0)) - ALLOCATE(XLES_DOWNDRAFT_WRc (0,0)) - ALLOCATE(XLES_DOWNDRAFT_Rc2 (0,0)) - ALLOCATE(XLES_DOWNDRAFT_ThRc (0,0)) - ALLOCATE(XLES_DOWNDRAFT_ThvRc (0,0)) - ALLOCATE(XLES_DOWNDRAFT_ThlRc (0,0)) -END IF -IF (LUSERR ) THEN - ALLOCATE(XLES_DOWNDRAFT_Rr (NLES_K,NLES_TIMES)) ! <Rr> -ELSE - ALLOCATE(XLES_DOWNDRAFT_Rr (0,0)) -END IF -IF (LUSERI ) THEN - ALLOCATE(XLES_DOWNDRAFT_Ri (NLES_K,NLES_TIMES)) ! <Ri> - ALLOCATE(XLES_DOWNDRAFT_WRi (NLES_K,NLES_TIMES)) ! <w'Ri'> - ALLOCATE(XLES_DOWNDRAFT_Ri2 (NLES_K,NLES_TIMES)) ! <Ri'2> - ALLOCATE(XLES_DOWNDRAFT_ThRi (NLES_K,NLES_TIMES)) ! <Th'Ri'> - ALLOCATE(XLES_DOWNDRAFT_ThvRi (NLES_K,NLES_TIMES)) ! <Thv'Ri'> - ALLOCATE(XLES_DOWNDRAFT_ThlRi (NLES_K,NLES_TIMES)) ! <Thl'Ri'> -ELSE - ALLOCATE(XLES_DOWNDRAFT_Ri (0,0)) - ALLOCATE(XLES_DOWNDRAFT_WRi (0,0)) - ALLOCATE(XLES_DOWNDRAFT_Ri2 (0,0)) - ALLOCATE(XLES_DOWNDRAFT_ThRi (0,0)) - ALLOCATE(XLES_DOWNDRAFT_ThvRi (0,0)) - ALLOCATE(XLES_DOWNDRAFT_ThlRi (0,0)) -END IF -IF (LUSERS ) THEN - ALLOCATE(XLES_DOWNDRAFT_Rs (NLES_K,NLES_TIMES)) ! <Rs> -ELSE - ALLOCATE(XLES_DOWNDRAFT_Rs (0,0)) -END IF -IF (LUSERG ) THEN - ALLOCATE(XLES_DOWNDRAFT_Rg (NLES_K,NLES_TIMES)) ! <Rg> -ELSE - ALLOCATE(XLES_DOWNDRAFT_Rg (0,0)) -END IF -IF (LUSERH ) THEN - ALLOCATE(XLES_DOWNDRAFT_Rh (NLES_K,NLES_TIMES)) ! <Rh> -ELSE - ALLOCATE(XLES_DOWNDRAFT_Rh (0,0)) -END IF -IF (NSV>0 ) THEN - ALLOCATE(XLES_DOWNDRAFT_Sv (NLES_K,NLES_TIMES,NSV))! <Sv> - ALLOCATE(XLES_DOWNDRAFT_WSv (NLES_K,NLES_TIMES,NSV))! <w'Sv'> - ALLOCATE(XLES_DOWNDRAFT_Sv2 (NLES_K,NLES_TIMES,NSV))! <Sv'2> - ALLOCATE(XLES_DOWNDRAFT_ThSv (NLES_K,NLES_TIMES,NSV))! <Th'Sv'> - IF (LUSERV) THEN - ALLOCATE(XLES_DOWNDRAFT_ThvSv (NLES_K,NLES_TIMES,NSV))! <Thv'Sv'> - ELSE - ALLOCATE(XLES_DOWNDRAFT_ThvSv (0,0,0)) - END IF - IF (LUSERC) THEN - ALLOCATE(XLES_DOWNDRAFT_ThlSv (NLES_K,NLES_TIMES,NSV))! <Thl'Sv'> - ELSE - ALLOCATE(XLES_DOWNDRAFT_ThlSv (0,0,0)) - END IF -ELSE - ALLOCATE(XLES_DOWNDRAFT_Sv (0,0,0)) - ALLOCATE(XLES_DOWNDRAFT_WSv (0,0,0)) - ALLOCATE(XLES_DOWNDRAFT_Sv2 (0,0,0)) - ALLOCATE(XLES_DOWNDRAFT_ThSv (0,0,0)) - ALLOCATE(XLES_DOWNDRAFT_ThvSv (0,0,0)) - ALLOCATE(XLES_DOWNDRAFT_ThlSv (0,0,0)) -END IF -! -! -XLES_DOWNDRAFT = XUNDEF -XLES_DOWNDRAFT_W = XUNDEF -XLES_DOWNDRAFT_Th = XUNDEF -XLES_DOWNDRAFT_Thl = XUNDEF -XLES_DOWNDRAFT_Tke = XUNDEF -IF (LUSERV ) XLES_DOWNDRAFT_Thv = XUNDEF -IF (LUSERC ) XLES_DOWNDRAFT_Thl = XUNDEF -IF (LUSERV ) XLES_DOWNDRAFT_Rv = XUNDEF -IF (LUSERC ) XLES_DOWNDRAFT_Rc = XUNDEF -IF (LUSERR ) XLES_DOWNDRAFT_Rr = XUNDEF -IF (LUSERI ) XLES_DOWNDRAFT_Ri = XUNDEF -IF (LUSERS ) XLES_DOWNDRAFT_Rs = XUNDEF -IF (LUSERG ) XLES_DOWNDRAFT_Rg = XUNDEF -IF (LUSERH ) XLES_DOWNDRAFT_Rh = XUNDEF -IF (NSV>0 ) XLES_DOWNDRAFT_Sv = XUNDEF -XLES_DOWNDRAFT_Ke = XUNDEF -XLES_DOWNDRAFT_WTh = XUNDEF -IF (LUSERV ) XLES_DOWNDRAFT_WThv = XUNDEF -IF (LUSERC ) XLES_DOWNDRAFT_WThl = XUNDEF -IF (LUSERV ) XLES_DOWNDRAFT_WRv = XUNDEF -IF (LUSERC ) XLES_DOWNDRAFT_WRc = XUNDEF -IF (LUSERI ) XLES_DOWNDRAFT_WRi = XUNDEF -IF (NSV>0 ) XLES_DOWNDRAFT_WSv = XUNDEF -XLES_DOWNDRAFT_Th2 = XUNDEF -IF (LUSERV ) THEN - XLES_DOWNDRAFT_ThThv = XUNDEF -END IF -IF (LUSERC ) THEN - XLES_DOWNDRAFT_Thl2 = XUNDEF - XLES_DOWNDRAFT_ThlThv = XUNDEF -END IF -IF (LUSERV ) XLES_DOWNDRAFT_Rv2 = XUNDEF -IF (LUSERC ) XLES_DOWNDRAFT_Rc2 = XUNDEF -IF (LUSERI ) XLES_DOWNDRAFT_Ri2 = XUNDEF -IF (NSV>0 ) XLES_DOWNDRAFT_Sv2 = XUNDEF -IF (LUSERV ) XLES_DOWNDRAFT_ThRv = XUNDEF -IF (LUSERC ) XLES_DOWNDRAFT_ThRc = XUNDEF -IF (LUSERI ) XLES_DOWNDRAFT_ThRi = XUNDEF -IF (LUSERC ) XLES_DOWNDRAFT_ThlRv= XUNDEF -IF (LUSERC ) XLES_DOWNDRAFT_ThlRc= XUNDEF -IF (LUSERI ) XLES_DOWNDRAFT_ThlRi= XUNDEF -IF (NSV>0 ) XLES_DOWNDRAFT_ThSv = XUNDEF -IF (LUSERV ) XLES_DOWNDRAFT_ThvRv= XUNDEF -IF (LUSERC ) XLES_DOWNDRAFT_ThvRc= XUNDEF -IF (LUSERI ) XLES_DOWNDRAFT_ThvRi= XUNDEF -IF (NSV>0 .AND. LUSERV) XLES_DOWNDRAFT_ThvSv = XUNDEF -IF (NSV>0 .AND. LUSERC) XLES_DOWNDRAFT_ThlSv = XUNDEF -! -!* 7.8 production terms -! ---------------- -! -ALLOCATE(XLES_BU_RES_KE (NLES_K,NLES_TIMES,NLES_TOT)) -ALLOCATE(XLES_BU_RES_WThl (NLES_K,NLES_TIMES,NLES_TOT)) -ALLOCATE(XLES_BU_RES_Thl2 (NLES_K,NLES_TIMES,NLES_TOT)) -ALLOCATE(XLES_BU_SBG_TKE (NLES_K,NLES_TIMES,NLES_TOT)) -XLES_BU_RES_KE = 0. -XLES_BU_RES_WThl = 0. -XLES_BU_RES_Thl2 = 0. -XLES_BU_SBG_TKE = 0. -IF (LUSERV) THEN - ALLOCATE(XLES_BU_RES_WRt (NLES_K,NLES_TIMES,NLES_TOT)) - ALLOCATE(XLES_BU_RES_Rt2 (NLES_K,NLES_TIMES,NLES_TOT)) - ALLOCATE(XLES_BU_RES_ThlRt(NLES_K,NLES_TIMES,NLES_TOT)) - XLES_BU_RES_WRt = 0. - XLES_BU_RES_Rt2 = 0. - XLES_BU_RES_ThlRt = 0. -END IF -ALLOCATE(XLES_BU_RES_WSv (NLES_K,NLES_TIMES,NLES_TOT,NSV)) -ALLOCATE(XLES_BU_RES_Sv2 (NLES_K,NLES_TIMES,NLES_TOT,NSV)) -IF (NSV>0) THEN - XLES_BU_RES_WSv = 0. - XLES_BU_RES_Sv2 = 0. -END IF -! -!------------------------------------------------------------------------------- -! -!* 8. Allocations of the normalization variables temporal series -! ---------------------------------------------------------- -! -ALLOCATE(XLES_UW0 (NLES_TIMES)) -ALLOCATE(XLES_VW0 (NLES_TIMES)) -ALLOCATE(XLES_USTAR (NLES_TIMES)) -ALLOCATE(XLES_WSTAR (NLES_TIMES)) -ALLOCATE(XLES_Q0 (NLES_TIMES)) -ALLOCATE(XLES_E0 (NLES_TIMES)) -ALLOCATE(XLES_SV0 (NLES_TIMES,NSV)) -ALLOCATE(XLES_BL_HEIGHT (NLES_TIMES)) -ALLOCATE(XLES_MO_LENGTH (NLES_TIMES)) -ALLOCATE(XLES_ZCB (NLES_TIMES)) -ALLOCATE(XLES_CFtot (NLES_TIMES)) -ALLOCATE(XLES_CF2tot (NLES_TIMES)) -ALLOCATE(XLES_LWP (NLES_TIMES)) -ALLOCATE(XLES_LWPVAR (NLES_TIMES)) -ALLOCATE(XLES_RWP (NLES_TIMES)) -ALLOCATE(XLES_IWP (NLES_TIMES)) -ALLOCATE(XLES_SWP (NLES_TIMES)) -ALLOCATE(XLES_GWP (NLES_TIMES)) -ALLOCATE(XLES_HWP (NLES_TIMES)) -ALLOCATE(XLES_INT_TKE (NLES_TIMES)) -ALLOCATE(XLES_ZMAXCF (NLES_TIMES)) -ALLOCATE(XLES_ZMAXCF2 (NLES_TIMES)) -ALLOCATE(XLES_INPRR (NLES_TIMES)) -ALLOCATE(XLES_INPRC (NLES_TIMES)) -ALLOCATE(XLES_INDEP (NLES_TIMES)) -ALLOCATE(XLES_RAIN_INPRR(NLES_TIMES)) -ALLOCATE(XLES_ACPRR (NLES_TIMES)) -ALLOCATE(XLES_PRECFR (NLES_TIMES)) -ALLOCATE(XLES_SWU (NLES_K,NLES_TIMES)) -ALLOCATE(XLES_SWD (NLES_K,NLES_TIMES)) -ALLOCATE(XLES_LWU (NLES_K,NLES_TIMES)) -ALLOCATE(XLES_LWD (NLES_K,NLES_TIMES)) -ALLOCATE(XLES_DTHRADSW (NLES_K,NLES_TIMES)) -ALLOCATE(XLES_DTHRADLW (NLES_K,NLES_TIMES)) -ALLOCATE(XLES_RADEFF (NLES_K,NLES_TIMES)) -! -XLES_UW0 = XUNDEF -XLES_VW0 = XUNDEF -XLES_USTAR = XUNDEF -XLES_WSTAR = XUNDEF -XLES_Q0 = XUNDEF -XLES_E0 = XUNDEF -XLES_SV0 = XUNDEF -XLES_BL_HEIGHT = XUNDEF -XLES_MO_LENGTH = XUNDEF -XLES_ZCB = XUNDEF -XLES_CFtot = XUNDEF -XLES_CF2tot = XUNDEF -XLES_LWP = XUNDEF -XLES_LWPVAR = XUNDEF -XLES_RWP = XUNDEF -XLES_IWP = XUNDEF -XLES_SWP = XUNDEF -XLES_GWP = XUNDEF -XLES_HWP = XUNDEF -XLES_INT_TKE = XUNDEF -XLES_ZMAXCF = XUNDEF -XLES_ZMAXCF2 = XUNDEF -XLES_PRECFR = XUNDEF -XLES_ACPRR = XUNDEF -XLES_INPRR = XUNDEF -XLES_INPRC = XUNDEF -XLES_INDEP = XUNDEF -XLES_RAIN_INPRR = XUNDEF -XLES_SWU = XUNDEF -XLES_SWD = XUNDEF -XLES_LWU = XUNDEF -XLES_LWD = XUNDEF -XLES_DTHRADSW = XUNDEF -XLES_DTHRADLW = XUNDEF -XLES_RADEFF = XUNDEF -! -!------------------------------------------------------------------------------- -! -!* 9. Allocations of the normalization variables temporal series -! ---------------------------------------------------------- -! -! 9.1 Two-points correlations in I direction -! -------------------------------------- -! -ALLOCATE(XCORRi_UU (NSPECTRA_NI,NSPECTRA_K,NLES_TIMES)) ! between u and u -ALLOCATE(XCORRi_VV (NSPECTRA_NI,NSPECTRA_K,NLES_TIMES)) ! between v and v -ALLOCATE(XCORRi_UV (NSPECTRA_NI,NSPECTRA_K,NLES_TIMES)) ! between u and v -ALLOCATE(XCORRi_WU (NSPECTRA_NI,NSPECTRA_K,NLES_TIMES)) ! between w and u -ALLOCATE(XCORRi_WV (NSPECTRA_NI,NSPECTRA_K,NLES_TIMES)) ! between w and v -ALLOCATE(XCORRi_WW (NSPECTRA_NI,NSPECTRA_K,NLES_TIMES)) ! between w and w -ALLOCATE(XCORRi_WTh (NSPECTRA_NI,NSPECTRA_K,NLES_TIMES)) ! between w and theta -ALLOCATE(XCORRi_ThTh (NSPECTRA_NI,NSPECTRA_K,NLES_TIMES)) ! between theta and theta -IF (LUSERC) THEN - ALLOCATE(XCORRi_WThl (NSPECTRA_NI,NSPECTRA_K,NLES_TIMES)) ! between w and thetal - ALLOCATE(XCORRi_ThlThl(NSPECTRA_NI,NSPECTRA_K,NLES_TIMES)) ! between thetal and thetal -ELSE - ALLOCATE(XCORRi_WThl (0,0,0)) - ALLOCATE(XCORRi_ThlThl(0,0,0)) -END IF - - -IF (LUSERV ) THEN - ALLOCATE(XCORRi_WRv (NSPECTRA_NI,NSPECTRA_K,NLES_TIMES)) ! between w and Rv - ALLOCATE(XCORRi_ThRv (NSPECTRA_NI,NSPECTRA_K,NLES_TIMES)) ! between theta and Rv - IF (LUSERC) THEN - ALLOCATE(XCORRi_ThlRv(NSPECTRA_NI,NSPECTRA_K,NLES_TIMES)) ! between thetal and Rv - ELSE - ALLOCATE(XCORRi_ThlRv(0,0,0)) - END IF - ALLOCATE(XCORRi_RvRv (NSPECTRA_NI,NSPECTRA_K,NLES_TIMES)) ! between Rv and Rv -ELSE - ALLOCATE(XCORRi_WRv (0,0,0)) - ALLOCATE(XCORRi_ThRv (0,0,0)) - ALLOCATE(XCORRi_ThlRv(0,0,0)) - ALLOCATE(XCORRi_RvRv (0,0,0)) -END IF - -IF (LUSERC ) THEN - ALLOCATE(XCORRi_WRc (NSPECTRA_NI,NSPECTRA_K,NLES_TIMES)) ! between w and Rc - ALLOCATE(XCORRi_ThRc (NSPECTRA_NI,NSPECTRA_K,NLES_TIMES)) ! between theta and Rc - ALLOCATE(XCORRi_ThlRc(NSPECTRA_NI,NSPECTRA_K,NLES_TIMES)) ! between thetal and Rc - ALLOCATE(XCORRi_RcRc (NSPECTRA_NI,NSPECTRA_K,NLES_TIMES)) ! between Rc and Rc -ELSE - ALLOCATE(XCORRi_WRc (0,0,0)) - ALLOCATE(XCORRi_ThRc (0,0,0)) - ALLOCATE(XCORRi_ThlRc(0,0,0)) - ALLOCATE(XCORRi_RcRc (0,0,0)) -END IF - -IF (LUSERI ) THEN - ALLOCATE(XCORRi_WRi (NSPECTRA_NI,NSPECTRA_K,NLES_TIMES)) ! between w and Ri - ALLOCATE(XCORRi_ThRi (NSPECTRA_NI,NSPECTRA_K,NLES_TIMES)) ! between theta and Rc - ALLOCATE(XCORRi_ThlRi(NSPECTRA_NI,NSPECTRA_K,NLES_TIMES)) ! between thetal and Rc - ALLOCATE(XCORRi_RiRi (NSPECTRA_NI,NSPECTRA_K,NLES_TIMES)) ! between Rc and Rc -ELSE - ALLOCATE(XCORRi_WRi (0,0,0)) - ALLOCATE(XCORRi_ThRi (0,0,0)) - ALLOCATE(XCORRi_ThlRi(0,0,0)) - ALLOCATE(XCORRi_RiRi (0,0,0)) -END IF - -IF (NSV>0 ) THEN - ALLOCATE(XCORRi_WSv (NSPECTRA_NI,NSPECTRA_K,NLES_TIMES,NSV)) ! between w and Sv - ALLOCATE(XCORRi_SvSv (NSPECTRA_NI,NSPECTRA_K,NLES_TIMES,NSV)) ! between Sv and Sv -ELSE - ALLOCATE(XCORRi_WSv (0,0,0,0)) - ALLOCATE(XCORRi_SvSv (0,0,0,0)) -END IF -! -! -XCORRi_UU = XUNDEF -XCORRi_VV = XUNDEF -XCORRi_UV = XUNDEF -XCORRi_WU = XUNDEF -XCORRi_WV = XUNDEF -XCORRi_WW = XUNDEF -XCORRi_WTh = XUNDEF -IF (LUSERC ) XCORRi_WThl= XUNDEF -IF (LUSERV ) XCORRi_WRv = XUNDEF -IF (LUSERC ) XCORRi_WRc = XUNDEF -IF (LUSERI ) XCORRi_WRi = XUNDEF -IF (NSV>0 ) XCORRi_WSv = XUNDEF -XCORRi_ThTh = XUNDEF -IF (LUSERC ) XCORRi_ThlThl= XUNDEF -IF (LUSERV ) XCORRi_ThRv = XUNDEF -IF (LUSERC ) XCORRi_ThRc = XUNDEF -IF (LUSERI ) XCORRi_ThRi = XUNDEF -IF (LUSERC ) XCORRi_ThlRv= XUNDEF -IF (LUSERC ) XCORRi_ThlRc= XUNDEF -IF (LUSERI ) XCORRi_ThlRi= XUNDEF -IF (LUSERV ) XCORRi_RvRv = XUNDEF -IF (LUSERC ) XCORRi_RcRc = XUNDEF -IF (LUSERI ) XCORRi_RiRi = XUNDEF -IF (NSV>0 ) XCORRi_SvSv = XUNDEF -! -! -! 9.2 Two-points correlations in J direction -! -------------------------------------- -! -ALLOCATE(XCORRj_UU (NSPECTRA_NJ,NSPECTRA_K,NLES_TIMES)) ! between u and u -ALLOCATE(XCORRj_VV (NSPECTRA_NJ,NSPECTRA_K,NLES_TIMES)) ! between v and v -ALLOCATE(XCORRj_UV (NSPECTRA_NJ,NSPECTRA_K,NLES_TIMES)) ! between u and v -ALLOCATE(XCORRj_WU (NSPECTRA_NJ,NSPECTRA_K,NLES_TIMES)) ! between w and u -ALLOCATE(XCORRj_WV (NSPECTRA_NJ,NSPECTRA_K,NLES_TIMES)) ! between w and v -ALLOCATE(XCORRj_WW (NSPECTRA_NJ,NSPECTRA_K,NLES_TIMES)) ! between w and w -ALLOCATE(XCORRj_WTh (NSPECTRA_NJ,NSPECTRA_K,NLES_TIMES)) ! between w and theta -ALLOCATE(XCORRj_ThTh (NSPECTRA_NJ,NSPECTRA_K,NLES_TIMES)) ! between theta and theta -IF (LUSERC) THEN - ALLOCATE(XCORRj_WThl (NSPECTRA_NJ,NSPECTRA_K,NLES_TIMES)) ! between w and thetal - ALLOCATE(XCORRj_ThlThl(NSPECTRA_NJ,NSPECTRA_K,NLES_TIMES)) ! between thetal and thetal -ELSE - ALLOCATE(XCORRj_WThl (0,0,0)) - ALLOCATE(XCORRj_ThlThl(0,0,0)) -END IF - -IF (LUSERV ) THEN - ALLOCATE(XCORRj_WRv (NSPECTRA_NJ,NSPECTRA_K,NLES_TIMES)) ! between w and Rv - ALLOCATE(XCORRj_ThRv (NSPECTRA_NJ,NSPECTRA_K,NLES_TIMES)) ! between theta and Rv - IF (LUSERC) THEN - ALLOCATE(XCORRj_ThlRv(NSPECTRA_NJ,NSPECTRA_K,NLES_TIMES)) ! between thetal and Rv - ELSE - ALLOCATE(XCORRj_ThlRv(0,0,0)) - END IF - ALLOCATE(XCORRj_RvRv (NSPECTRA_NJ,NSPECTRA_K,NLES_TIMES)) ! between Rv and Rv -ELSE - ALLOCATE(XCORRj_WRv (0,0,0)) - ALLOCATE(XCORRj_ThRv (0,0,0)) - ALLOCATE(XCORRj_ThlRv(0,0,0)) - ALLOCATE(XCORRj_RvRv (0,0,0)) -END IF - -IF (LUSERC ) THEN - ALLOCATE(XCORRj_WRc (NSPECTRA_NJ,NSPECTRA_K,NLES_TIMES)) ! between w and Rc - ALLOCATE(XCORRj_ThRc (NSPECTRA_NJ,NSPECTRA_K,NLES_TIMES)) ! between theta and Rc - ALLOCATE(XCORRj_ThlRc(NSPECTRA_NJ,NSPECTRA_K,NLES_TIMES)) ! between thetal and Rc - ALLOCATE(XCORRj_RcRc (NSPECTRA_NJ,NSPECTRA_K,NLES_TIMES)) ! between Rc and Rc -ELSE - ALLOCATE(XCORRj_WRc (0,0,0)) - ALLOCATE(XCORRj_ThRc (0,0,0)) - ALLOCATE(XCORRj_ThlRc(0,0,0)) - ALLOCATE(XCORRj_RcRc (0,0,0)) -END IF - -IF (LUSERI ) THEN - ALLOCATE(XCORRj_WRi (NSPECTRA_NJ,NSPECTRA_K,NLES_TIMES)) ! between w and Ri - ALLOCATE(XCORRj_ThRi (NSPECTRA_NJ,NSPECTRA_K,NLES_TIMES)) ! between theta and Rc - ALLOCATE(XCORRj_ThlRi(NSPECTRA_NJ,NSPECTRA_K,NLES_TIMES)) ! between thetal and Rc - ALLOCATE(XCORRj_RiRi (NSPECTRA_NJ,NSPECTRA_K,NLES_TIMES)) ! between Rc and Rc -ELSE - ALLOCATE(XCORRj_WRi (0,0,0)) - ALLOCATE(XCORRj_ThRi (0,0,0)) - ALLOCATE(XCORRj_ThlRi(0,0,0)) - ALLOCATE(XCORRj_RiRi (0,0,0)) -END IF - -IF (NSV>0 ) THEN - ALLOCATE(XCORRj_WSv (NSPECTRA_NJ,NSPECTRA_K,NLES_TIMES,NSV)) ! between w and Sv - ALLOCATE(XCORRj_SvSv (NSPECTRA_NJ,NSPECTRA_K,NLES_TIMES,NSV)) ! between Sv and Sv -ELSE - ALLOCATE(XCORRj_WSv (0,0,0,0)) - ALLOCATE(XCORRj_SvSv (0,0,0,0)) -END IF -! -! -XCORRj_UU = XUNDEF -XCORRj_VV = XUNDEF -XCORRj_UV = XUNDEF -XCORRj_WU = XUNDEF -XCORRj_WV = XUNDEF -XCORRj_WW = XUNDEF -XCORRj_WTh = XUNDEF -IF (LUSERC ) XCORRj_WThl= XUNDEF -IF (LUSERV ) XCORRj_WRv = XUNDEF -IF (LUSERC ) XCORRj_WRc = XUNDEF -IF (LUSERI ) XCORRj_WRi = XUNDEF -IF (NSV>0 ) XCORRj_WSv = XUNDEF -XCORRj_ThTh = XUNDEF -IF (LUSERC ) XCORRj_ThlThl= XUNDEF -IF (LUSERV ) XCORRj_ThRv = XUNDEF -IF (LUSERC ) XCORRj_ThRc = XUNDEF -IF (LUSERI ) XCORRj_ThRi = XUNDEF -IF (LUSERC ) XCORRj_ThlRv= XUNDEF -IF (LUSERC ) XCORRj_ThlRc= XUNDEF -IF (LUSERI ) XCORRj_ThlRi= XUNDEF -IF (LUSERV ) XCORRj_RvRv = XUNDEF -IF (LUSERC ) XCORRj_RcRc = XUNDEF -IF (LUSERI ) XCORRj_RiRi = XUNDEF -IF (NSV>0 ) XCORRj_SvSv = XUNDEF -! -!------------------------------------------------------------------------------- -! -END SUBROUTINE INI_LES_n diff --git a/src/mesonh/ext/ini_radar.f90 b/src/mesonh/ext/ini_radar.f90 deleted file mode 100644 index dbc94a72621630ef82491f6541fd803553260fef..0000000000000000000000000000000000000000 --- a/src/mesonh/ext/ini_radar.f90 +++ /dev/null @@ -1,234 +0,0 @@ -!MNH_LIC Copyright 1994-2014 CNRS, Meteo-France and Universite Paul Sabatier -!MNH_LIC This is part of the Meso-NH software governed by the CeCILL-C licence -!MNH_LIC version 1. See LICENSE, CeCILL-C_V1-en.txt and CeCILL-C_V1-fr.txt -!MNH_LIC for details. version 1. -!----------------------------------------------------------------- -!--------------- special set of characters for RCS information -!----------------------------------------------------------------- -! $Source$ $Revision$ -! masdev4_7 BUG1 2007/06/15 17:47:18 -!----------------------------------------------------------------- -! ######################## - MODULE MODI_INI_RADAR -! ######################## -! -INTERFACE - SUBROUTINE INI_RADAR (HPRISTINE_ICE ) -! -CHARACTER (LEN=4), INTENT(IN) :: HPRISTINE_ICE ! Indicator of ice crystal characteristics -! -! -END SUBROUTINE INI_RADAR -! -END INTERFACE -! -END MODULE MODI_INI_RADAR -! ########################################################### - SUBROUTINE INI_RADAR ( HPRISTINE_ICE ) -! ########################################################### -! -!!**** *INI_RADAR * -!! -!! PURPOSE -!! ------- -!! The purpose of this routine is to initialize the constants used to -!! compute radar reflectivity (radar_rain_ice.f90 or radar_simulator.f90) -!! for DIAG after PREP_REAL_CASE with AROME file (CCLOUD=NONE) -!! -!!** METHOD -!! ------ -!! The constants useful to radar are initialized to their -!! numerical values as in ini_rain_ice.f90 for ICE3 -!! -!! EXTERNAL -!! -------- -!! GAMMA : gamma function -!! -!! -!! IMPLICIT ARGUMENTS -!! ------------------ -!! Module MODD_CST -!! XPI ! -!! XP00 ! Reference pressure -!! XRD ! Gaz constant for dry air -!! XRHOLW ! Liquid water density -!! Module MODD_RAIN_ICE_DESCR -!! -!! -!! AUTHOR -!! ------ -!! G. TANGUY * CNRM * -!! -!! MODIFICATIONS -!! ------------- -!! Original 27/10/2009 -!! P.Scheffknecht 22/04/2015: test missing on already allocated XRTMIN -!! -!------------------------------------------------------------------------------- -! -!* 0. DECLARATIONS -! ------------ -! -USE MODD_CST -USE MODD_RAIN_ICE_DESCR -! -IMPLICIT NONE -! -!* 0.1 Declarations of dummy arguments : -! -! -CHARACTER (LEN=4), INTENT(IN) :: HPRISTINE_ICE ! Indicator of ice crystal caracteristics -! -!------------------------------------------------------------------------------- -! -! -! -!* 1.1 Raindrop characteristics -! -! -! -XAR = (XPI/6.0)*XRHOLW -XBR = 3.0 -XCR = 842. -XDR = 0.8 -XCCR = 8.E6 -! -!* 1.2 Ice crystal characteristics -! -! -SELECT CASE (HPRISTINE_ICE) - CASE('PLAT') - XAI = 0.82 ! Plates - XBI = 2.5 ! Plates - XC_I = 800. ! Plates - XDI = 1.0 ! Plates - CASE('COLU') - XAI = 2.14E-3 ! Columns - XBI = 1.7 ! Columns - XC_I = 2.1E5 ! Columns - XDI = 1.585 ! Columns - CASE('BURO') - XAI = 44.0 ! Bullet rosettes - XBI = 3.0 ! Bullet rosettes - XC_I = 4.3E5 ! Bullet rosettes - XDI = 1.663 ! Bullet rosettes -END SELECT -! -! -!* 1.3 Snowflakes/aggregates characteristics -! -! -XAS = 0.02 -XBS = 1.9 -XCS = 5.1 -XDS = 0.27 -XCCS = 5.0 -XCXS = 1.0 -! -!* 1.4 Graupel/Frozen drop characteristics -! -! -XAG = 19.6 -XBG = 2.8 -XCG = 124. -XDG = 0.66 -XCCG = 5.E5 -XCXG = -0.5 -! -!* 1.5 Hailstone characteristics -! -! -XAH = 470. -XBH = 3.0 -XCH = 207. -XDH = 0.64 -XCCH = 4.E4 -XCXH = -1.0 -! -!------------------------------------------------------------------------------- -! -!* 2. DIMENSIONAL DISTRIBUTIONS OF THE SPECIES -! ---------------------------------------- -! -!* 2.1 Raindrops distribution -! -XALPHAR = 1.0 ! Exponential law -XNUR = 1.0 ! Exponential law -! -!* 2.2 Ice crystal distribution -! -XALPHAI = 3.0 ! Gamma law for the ice crystal volume -XNUI = 3.0 ! Gamma law with little dispersion -! -XALPHAS = 1.0 ! Exponential law -XNUS = 1.0 ! Exponential law -! -XALPHAG = 1.0 ! Exponential law -XNUG = 1.0 ! Exponential law -! -XALPHAH = 1.0 ! Gamma law -XNUH = 8.0 ! Gamma law with little dispersion -! -!* 2.3 Constants for shape parameter -! -XLBEXR = 1.0/(-1.0-XBR) -XLBR = ( XAR*XCCR*MOMG(XALPHAR,XNUR,XBR) )**(-XLBEXR) -! -XLBEXI = 1.0/(-XBI) -XLBI = ( XAI*MOMG(XALPHAI,XNUI,XBI) )**(-XLBEXI) -! -XNS = 1.0/(XAS*MOMG(XALPHAS,XNUS,XBS)) -XLBEXS = 1.0/(XCXS-XBS) -XLBS = ( XAS*XCCS*MOMG(XALPHAS,XNUS,XBS) )**(-XLBEXS) -! -XLBEXG = 1.0/(XCXG-XBG) -XLBG = ( XAG*XCCG*MOMG(XALPHAG,XNUG,XBG) )**(-XLBEXG) -! -XLBEXH = 1.0/(XCXH-XBH) -XLBH = ( XAH*XCCH*MOMG(XALPHAH,XNUH,XBH) )**(-XLBEXH) -! -!* 2.4 Minimal values allowed for the mixing ratios -! ICE3 -IF(.NOT.ASSOCIATED(XRTMIN)) THEN - CALL RAIN_ICE_DESCR_ALLOCATE(6) -END IF -! -XRTMIN(1) = 1.0E-20 -XRTMIN(2) = 1.0E-20 -XRTMIN(3) = 1.0E-20 -XRTMIN(4) = 1.0E-20 -XRTMIN(5) = 1.0E-15 -XRTMIN(6) = 1.0E-15 - -! -CONTAINS -! -!------------------------------------------------------------------------------ -! - FUNCTION MOMG (PALPHA,PNU,PP) RESULT (PMOMG) -! -! auxiliary routine used to compute the Pth moment order of the generalized -! gamma law -! - USE MODI_GAMMA - - IMPLICIT NONE - - REAL :: PALPHA ! first shape parameter of the dimensionnal distribution - REAL :: PNU ! second shape parameter of the dimensionnal distribution - REAL :: PP ! order of the moment - REAL :: PMOMG ! result: moment of order ZP - -!------------------------------------------------------------------------------ - - - PMOMG = GAMMA(PNU+PP/PALPHA)/GAMMA(PNU) - - END FUNCTION MOMG - -!------------------------------------------------------------------------------- -! -! -END SUBROUTINE INI_RADAR - - diff --git a/src/mesonh/ext/ini_segn.f90 b/src/mesonh/ext/ini_segn.f90 deleted file mode 100644 index c581f7c0140586a06e2e0309fff7d0e1ceedd4ca..0000000000000000000000000000000000000000 --- a/src/mesonh/ext/ini_segn.f90 +++ /dev/null @@ -1,494 +0,0 @@ -!MNH_LIC Copyright 1994-2021 CNRS, Meteo-France and Universite Paul Sabatier -!MNH_LIC This is part of the Meso-NH software governed by the CeCILL-C licence -!MNH_LIC version 1. See LICENSE, CeCILL-C_V1-en.txt and CeCILL-C_V1-fr.txt -!MNH_LIC for details. version 1. -!----------------------------------------------------------------- -! ################### - MODULE MODI_INI_SEG_n -! ################### -! -INTERFACE -! -SUBROUTINE INI_SEG_n(KMI,TPINIFILE,HINIFILEPGD,PTSTEP_ALL) -! -USE MODD_IO, ONLY : TFILEDATA -! -INTEGER, INTENT(IN) :: KMI !Model index -TYPE(TFILEDATA), POINTER, INTENT(OUT) :: TPINIFILE !Initial file -CHARACTER (LEN=28), INTENT(OUT) :: HINIFILEPGD -REAL,DIMENSION(:), INTENT(INOUT) :: PTSTEP_ALL ! Time STEP of ALL models -! -END SUBROUTINE INI_SEG_n -! -END INTERFACE -! -END MODULE MODI_INI_SEG_n -! -! -! -! -! ############################################################# - SUBROUTINE INI_SEG_n(KMI,TPINIFILE,HINIFILEPGD,PTSTEP_ALL) -! ############################################################# -! -!!**** *INI_SEG_n * - routine to read and update the descriptor files for -!! model KMI -!! -!! PURPOSE -!! ------- -! The purpose of this routine is to read the descriptor files in the -! following order : -! - DESFM file which gives informations about the initial file -! (i.e. the description of the segment that produced the initial file -! or the description of the preinitialisation that created the initial file) -! - EXSEG file which gives informations about the segment to perform. -! -! Informations in EXSEG file are completed by DESFM file informations -! and if the informations are not in DESFM file, they are set -! to default values. -! -! The descriptor file EXSEG corresponding to the segment of simulation -! to be performed, is then updated with the combined informations. -! We also store in the updated EXSEG file, the informations on the status -! of the different variables ( skip, init, read) in the namelist NAM_GETn, -! which will be read in the INI_MODELn routine to properly initiliaze the -! model n. Except this last namelist, the informations written in this -! EXSEG file, will be identical to the NAMELIST section of the descriptive -! part of the FM files containing the model outputs. -! -! In order not to duplicate the routines called by ini_seg, we use the -! modules modd, corresponding to the first model to store the informations -! read on the different files ( DESFM and EXSEG ). The final filling of -! the modules modd (MODD_CONFn ....) will be realized in the subroutine -! INI_MODELn. The goal of the INI_SEG_n part of the initialization is to -! built the final EXSEG, which will be associated to the LFI files -! generated during the segment ( and therefore not to fill the modd). -! -! -!!** METHOD -!! ------ -!! For a nested model of index KMI : -!! - Logical unit numbers are associated to output-listing file and -!! descriptor EXSEG file by FMATTR. Then these files are opened. -!! The name of the initial file is read in EXSEG file. -!! - Default values are supplied for variables in descriptor files -!! (by DEFAULT_DESFM). -!! - The Initial file (LFIFM + DESFM) is opened by IO_File_open. -!! - The descriptor DESFM file is read (by READ_DESFM_n). -!! - The descriptor file EXSEG is read (by READ_EXSEG_n) and coherence -!! between the initial file and the description of segment is also checked -!! in this routine. -!! - If there is more than one model the EXSEG file is updated -!! (by WRITE_DESFM$n). This routine prints also EXSEG content on -!! output-listing. -!! - If there is only one model (i.e. no grid-nesting), -!! EXSEG file is also closed (logical unit number associated with this -!! file is also released by FMFREE). -!! -!! -!! -!! EXTERNAL -!! -------- -!! FMATTR : to associate a logical unit number to a file -!! IO_File_open : to open descriptor file or LFI file -!! DEFAULT_DESFM1: to set default values -!! READ_DESFM_n : to read a DESFM file -!! READ_EXSEG_n : to read a EXSEG file -!! WRITE_DESFM1 : to write the DESFM part of the future outputs -!! FMFREE : to release a logical unit number linked to a file -!! -!! Module MODI_DEFAULT_DESFM : Interface for routine DEFAULT_DESFM -!! Module MODI_READ_DESFM_n : Interface for routine READ_DESFM_n -!! Module MODI_READ_EXSEG_n : Interface for routine READ_EXSEG_n -!! Module MODI_WRITE_DESFM1 : Interface for routine WRITE_DESFM1 -!! -!! IMPLICIT ARGUMENTS -!! ------------------ -!! Module MODD_LUNIT : contains names and logical unit numbers -!! -!! Module MODD_CONF : contains configuration variables -!! CCONF : Configuration of models -!! NMODEL : Number of nested models -!! NVERB : Level of informations on output-listing -!! 0 for minimum of prints -!! 5 for intermediate level of prints -!! 10 for maximum of prints -!! -!! Module MODN_LUNIT1 : contains declarations of namelist NAMLUNITMN -!! and module MODD_LUNIT1 -!! -!! REFERENCE -!! --------- -!! Book2 of documentation (routine INI_SEG) -!! -!! -!! AUTHOR -!! ------ -!! V. Ducrocq * Meteo France * -!! -!! MODIFICATIONS -!! ------------- -!! Original 07/06/94 -!! Modification 26/10/94 remove the NAM_GETn from the namelist present -!! in the EXSEG file (J.Stein) -!! 11/01/95 change the read_exseg and desfm CALLS to add -!! the G1D switch -!! 15/02/95 add the HTURBLEN information (J. Cuxart) -!! 18/08/95 Time STEP change (J. P. Lafore) -!! 02/10/95 add the radiation control (J. Stein) -!! 18/03/96 remove the no write option for WRITE_DESFM -!! (J. Stein) -!! 11/04/96 add the ice conc. control (J.-P. Pinty) -!! 11/01/97 add the deep convection control (J.-P. Pinty) -!! 17/07/96 correction for WRITE_DESFM1 call (J. P. Lafore) -!! 22/07/96 PTSTEP_ALL introduction for nesting (J. P. Lafore) -!! 7/08/98 // (V. Ducrocq) -!! 02/08/99 remove unused argument for read_desfm (J. Stein) -!! 15/03/99 test on execution program (V. Masson) -!! 15/11/00 Add YCLOUD (J.-P. Pinty) -!! 01/03/01 Add GUSECHEM (D. Gazen) -!! 15/10/01 namelists in different orders (I.Mallet) -!! 25/11/02 Add YELEC (P. Jabouille) -!! 01/2004 externalization of surface (V. Masson) -!! 01/2005 add GDUST, GSALT, and GORILAM (P. Tulet) -!! 04/2010 add GUSECHAQ, GCH_PH (M. Leriche) -!! 09/2010 add GUSECHIC (M. Leriche) -!! 02/2012 add GFOREFIRE (Pialat/Tulet) -!! 05/2014 missing reading of IMASDEV before COUPLING -!! test (Escobar) -!! 10/02/15 remove ABORT in parallel case for SPAWNING -!! J.Escobar : 15/09/2015 : WENO5 & JPHEXT <> 1 -!! 01/2015 add GLNOX_EXPLICIT (C. Barthe) -!! 04/2016 add ABORT if CINIFILEPGD is not specified (G.Delautier) -!! Philippe Wautelet: 05/2016-04/2018: new data structures and calls for I/O -!! 07/2017 add GBLOWSNOW (V. Vionnet) -! P. Wautelet 07/02/2019: force TYPE to a known value for IO_File_add2list -! P. Wautelet 14/02/2019: remove CLUOUT/CLUOUT0 and associated variables -! P. Wautelet 19/06/2019: add Fieldlist_nmodel_resize subroutine + provide KMODEL to INI_FIELD_LIST when known -!------------------------------------------------------------------------------- -! -!* 0. DECLARATIONS -! ------------ -USE MODD_CONF -USE MODD_CONF_n, ONLY: CSTORAGE_TYPE -USE MODN_CONFZ -USE MODD_DYN_n, ONLY : LOCEAN -USE MODD_DYN -USE MODD_IO, ONLY: NVERB_FATAL, NVERB_WARNING, TFILE_OUTPUTLISTING, TFILEDATA -USE MODD_LES, ONLY: LES_ASSOCIATE -USE MODD_LUNIT -USE MODD_LUNIT_n, ONLY: CINIFILE_n=> CINIFILE, TINIFILE_n => TINIFILE, CINIFILEPGD_n=> CINIFILEPGD, TLUOUT, LUNIT_MODEL -USE MODD_PARAM_n, ONLY: CSURF -USE MODD_PARAM_ICE -USE MODD_PARAMETERS -USE MODD_REF, ONLY: LBOUSS -! -use mode_field, only: Fieldlist_nmodel_resize, Ini_field_list, Ini_field_scalars -USE MODE_IO_FIELD_READ, only: IO_Field_read -USE MODE_IO_FILE, ONLY: IO_File_close, IO_File_open -USE MODE_IO, only: IO_Config_set -USE MODE_IO_MANAGE_STRUCT, ONLY: IO_File_add2list -USE MODE_MSG -USE MODE_POS -! -USE MODI_DEFAULT_DESFM_n -USE MODI_READ_DESFM_n -USE MODI_READ_EXSEG_n -USE MODI_WRITE_DESFM_n -! -USE MODN_CONFIO, ONLY: NAM_CONFIO -USE MODN_LUNIT_n -USE MODN_FIRE -! -IMPLICIT NONE -! -!* 0.1 declarations of arguments -! -INTEGER, INTENT(IN) :: KMI !Model index -TYPE(TFILEDATA), POINTER, INTENT(OUT) :: TPINIFILE !Initial file -CHARACTER (LEN=28), INTENT(OUT) :: HINIFILEPGD -REAL,DIMENSION(:), INTENT(INOUT) :: PTSTEP_ALL ! Time STEP of ALL models -! -!* 0.1 declarations of local variables -! -LOGICAL :: GFOUND ! Return code when searching namelist -CHARACTER (LEN=28) :: YINIFILE ! name of initial file -CHARACTER (LEN=2) :: YMI ! string for model index -INTEGER :: ILUOUT ! Logical unit number - ! associated with TLUOUT - ! -INTEGER :: IRESP,ILUSEG ! File management variables -CHARACTER (LEN=5) :: YCONF ! Local variables which have -LOGICAL :: GFLAT ! the same definition as the -LOGICAL :: GUSERV,GUSERC,GUSERR,GUSERI ! variables in module MODD_CONF, -LOGICAL :: GUSERS,GUSERG,GUSERH,GUSECI ! MODD_CONFn, MODD_PARAMn, -LOGICAL :: GUSECHEM ! flag for chemistry -LOGICAL :: GUSECHAQ ! flag for aq. phase chemistry -LOGICAL :: GUSECHIC ! flag for ice phase chemistry -LOGICAL :: GCH_PH ! flag for pH -LOGICAL :: GCH_CONV_LINOX -LOGICAL :: GDUST -LOGICAL,DIMENSION(JPMODELMAX) :: GDEPOS_DST, GDEPOS_SLT, GDEPOS_AER -LOGICAL :: GSALT -LOGICAL :: GORILAM -LOGICAL :: GLG -LOGICAL :: GPASPOL -LOGICAL :: GFIRE -#ifdef MNH_FOREFIRE -LOGICAL :: GFOREFIRE -#endif -LOGICAL :: GCONDSAMP -LOGICAL :: GBLOWSNOW -LOGICAL :: GCHTRANS -LOGICAL :: GLNOX_EXPLICIT ! flag for LNOx - ! These variables - ! are used to locally store -INTEGER :: ISV ! the value read in DESFM -INTEGER :: IRIMX,IRIMY ! number of points for the - ! horizontal relaxation -CHARACTER (LEN=4) :: YTURB ! file in order to check the -CHARACTER (LEN=4) :: YRAD ! corresponding informations -CHARACTER (LEN=4) :: YTOM ! read in EXSEG file. -LOGICAL :: GRMC01 -CHARACTER (LEN=4) :: YDCONV -CHARACTER (LEN=4) :: YSCONV -CHARACTER (LEN=4) :: YCLOUD -CHARACTER (LEN=4) :: YELEC -CHARACTER (LEN=3) :: YEQNSYS -TYPE(TFILEDATA),POINTER :: TZFILE_DES -! -TPINIFILE => NULL() -TZFILE_DES => NULL() -!------------------------------------------------------------------------------- -! -!* 1. OPEN OUPTUT-LISTING FILE AND EXSEG FILE -! --------------------------------------- -! -WRITE(YMI,'(I2.0)') KMI -CALL IO_File_add2list(LUNIT_MODEL(KMI)%TLUOUT,'OUTPUT_LISTING'//ADJUSTL(YMI),'OUTPUTLISTING','WRITE') -TLUOUT => LUNIT_MODEL(KMI)%TLUOUT !Necessary because TLUOUT was initially pointing to NULL -CALL IO_File_open(TLUOUT) -! -!Set output file for PRINT_MSG -TFILE_OUTPUTLISTING => TLUOUT -! -ILUOUT=TLUOUT%NLU -! -WRITE(UNIT=ILUOUT,FMT='(50("*"),/,"*",17X,"MODEL ",I1," LISTING",16X,"*",/, & - & 50("*"))') KMI -! -IF (CPROGRAM=='MESONH') THEN - CALL IO_File_add2list(TZFILE_DES,'EXSEG'//TRIM(ADJUSTL(YMI))//'.nam','NML','READ') - CALL IO_File_open(TZFILE_DES) -! -!* 1.3 SPAWNING or SPEC or REAL program case -! --------------------- -! -ELSE IF (CPROGRAM=='SPAWN ' .OR. CPROGRAM=='REAL '.OR. CPROGRAM=='SPEC ') THEN - YINIFILE = CINIFILE_n - HINIFILEPGD = CINIFILEPGD_n - CALL IO_File_add2list(TPINIFILE,TRIM(YINIFILE),'MNH','READ',KLFITYPE=2,KLFIVERB=NVERB) - CALL IO_File_open(TPINIFILE) - TZFILE_DES => TPINIFILE%TDESFILE -! -!* 1.3bis DIAG program case -! -ELSE IF (CPROGRAM=='DIAG ') THEN - YINIFILE = CINIFILE_n - HINIFILEPGD = CINIFILEPGD_n - CALL IO_File_add2list(TINIFILE_n,TRIM(YINIFILE),'MNH','READ',KLFITYPE=2,KLFIVERB=NVERB) - CALL IO_File_open(TINIFILE_n) - TPINIFILE => TINIFILE_n - TZFILE_DES => TPINIFILE%TDESFILE -! -!* 1.4 Other program cases -! ------------------- -! -ELSE -!callabortstop - CALL PRINT_MSG(NVERB_FATAL,'GEN','INI_SEG_n','should not be called for CPROGRAM='//TRIM(CPROGRAM)) -ENDIF -! -ILUSEG = TZFILE_DES%NLU -! -!------------------------------------------------------------------------------- -! -!* 2. SET DEFAULT VALUES -! ------------------ -! -CALL PARAM_ICE_ASSOCIATE() -CALL LES_ASSOCIATE() -CALL DEFAULT_DESFM_n(KMI) -! -!------------------------------------------------------------------------------- -! -!* 3. READ INITIAL FILE NAME AND OPEN INITIAL FILE -! -------------------------------------------- -! -CALL POSNAM(ILUSEG,'NAM_LUNITN',GFOUND) -IF (GFOUND) THEN - CALL INIT_NAM_LUNITn - READ(UNIT=ILUSEG,NML=NAM_LUNITn) - CALL UPDATE_NAM_LUNITn - IF (LEN_TRIM(CINIFILEPGD)==0 .AND. CSURF=='EXTE') THEN - !callabortstop - CALL PRINT_MSG(NVERB_FATAL,'GEN','INI_SEG_n','error in namelist NAM_LUNITn: you need to specify CINIFILEPGD') - ENDIF -END IF - -IF (CPROGRAM=='MESONH') THEN - IF (KMI.EQ.1) THEN - CALL POSNAM(ILUSEG,'NAM_CONFZ',GFOUND,ILUOUT) - IF (GFOUND) READ(UNIT=ILUSEG,NML=NAM_CONFZ) - CALL POSNAM(ILUSEG,'NAM_CONFIO',GFOUND,ILUOUT) - IF (GFOUND) READ(UNIT=ILUSEG,NML=NAM_CONFIO) - CALL IO_Config_set() - ! read Blaze namelist to get NREFINX and NREFINY before INI_FIELD_LIST - CALL POSNAM(ILUSEG,'NAM_FIRE',GFOUND,ILUOUT) - IF (GFOUND) READ(UNIT=ILUSEG,NML=NAM_FIRE) - END IF - HINIFILEPGD=CINIFILEPGD_n - YINIFILE=CINIFILE_n - - CALL IO_File_add2list(TPINIFILE,TRIM(YINIFILE),'MNH','READ',KLFITYPE=2,KLFIVERB=NVERB) - TINIFILE_n => TPINIFILE !Necessary because TINIFILE was initially pointing to NULL - CALL IO_File_open(TPINIFILE) -END IF -! -!------------------------------------------------------------------------------- -! -!* 4. READ DESFM FILE -! --------------- -! -CALL READ_DESFM_n(KMI,TPINIFILE,YCONF,GFLAT,GUSERV,GUSERC, & - GUSERR,GUSERI,GUSECI,GUSERS,GUSERG,GUSERH,GUSECHEM,GUSECHAQ,& - GUSECHIC,GCH_PH,GCH_CONV_LINOX,GSALT,GDEPOS_SLT,GDUST, & - GDEPOS_DST, GCHTRANS, GORILAM, & - GDEPOS_AER, GLG, GPASPOL,GFIRE, & -#ifdef MNH_FOREFIRE - GFOREFIRE, & -#endif - GLNOX_EXPLICIT, & - GCONDSAMP,GBLOWSNOW, IRIMX,IRIMY,ISV, & - YTURB,YTOM,GRMC01,YRAD,YDCONV,YSCONV,YCLOUD,YELEC,YEQNSYS ) -! -!------------------------------------------------------------------------------- -! -!* 5. Initialize fieldlist -! -------------------- -! -IF (KMI==1) THEN !Do this only 1 time - IF (CPROGRAM=='SPAWN ') THEN - CALL INI_FIELD_LIST(2) - ELSE IF (CPROGRAM=='DIAG ' .OR. CPROGRAM=='SPEC ') THEN - CALL INI_FIELD_LIST(1) - ELSE IF (CPROGRAM/='REAL ' .AND. CPROGRAM/='IDEAL ' ) THEN - CALL INI_FIELD_LIST() - END IF - IF (CPROGRAM=='SPAWN ' .OR. CPROGRAM=='DIAG ' .OR. CPROGRAM=='SPEC ' .OR. CPROGRAM=='MESONH') THEN - CALL INI_FIELD_SCALARS() - END IF -END IF -! -!------------------------------------------------------------------------------- -! -!* 6. READ in the LFI file SOME VARIABLES of MODD_CONF -! ------------------------------------------------ -! -IF (CPROGRAM=='MESONH' .OR. CPROGRAM=='SPAWN ') THEN - IF ((TPINIFILE%NMNHVERSION(1)==4 .AND. TPINIFILE%NMNHVERSION(2)>9) .OR. TPINIFILE%NMNHVERSION(1)>4) THEN - CALL IO_Field_read(TPINIFILE,'COUPLING',LCOUPLING) - IF (LCOUPLING) THEN - WRITE(ILUOUT,*) 'Error with the initial file' - WRITE(ILUOUT,*) 'The file',YINIFILE,' was created with LCOUPLING=.TRUE.' - WRITE(ILUOUT,*) 'You can not use it as initial file, only as coupling file' - WRITE(ILUOUT,*) 'Run PREP_REAL_CASE with LCOUPLING=.FALSE.' - !callabortstop - CALL PRINT_MSG(NVERB_FATAL,'GEN','INI_SEG_n','') - ENDIF - ENDIF -END IF -! -! Read the storage type - CALL IO_Field_read(TPINIFILE,'STORAGE_TYPE',CSTORAGE_TYPE,IRESP) - IF (IRESP /= 0) THEN - WRITE(ILUOUT,FMT=9002) 'STORAGE_TYPE',IRESP -!callabortstop - CALL PRINT_MSG(NVERB_FATAL,'GEN','INI_SEG_n','') - END IF -IF (KMI == 1) THEN -! Read the geometry kind - CALL IO_Field_read(TPINIFILE,'CARTESIAN',LCARTESIAN) -! Read the thinshell approximation - CALL IO_Field_read(TPINIFILE,'THINSHELL',LTHINSHELL) -! - IF ((TPINIFILE%NMNHVERSION(1)==4 .AND. TPINIFILE%NMNHVERSION(2)>=6) .OR. TPINIFILE%NMNHVERSION(1)>4) THEN - CALL IO_Field_read(TPINIFILE,'L1D',L1D,IRESP) - IF (IRESP/=0) L1D=.FALSE. -! - CALL IO_Field_read(TPINIFILE,'L2D',L2D,IRESP) - IF (IRESP/=0) L2D=.FALSE. -! - CALL IO_Field_read(TPINIFILE,'PACK',LPACK,IRESP) - IF (IRESP/=0) LPACK=.TRUE. - ELSE - L1D=.FALSE. - L2D=.FALSE. - LPACK=.TRUE. - END IF - IF ((TPINIFILE%NMNHVERSION(1)==4 .AND. TPINIFILE%NMNHVERSION(2)>=10) .OR. TPINIFILE%NMNHVERSION(1)>4) THEN - CALL IO_Field_read(TPINIFILE,'LBOUSS',LBOUSS) - END IF -! -END IF -! -!------------------------------------------------------------------------------- -! -!* 7. READ EXSEG FILE -! --------------- -! We pass by arguments the informations read in DESFM descriptor to the -! routine which read related informations in the EXSEG descriptor in order to -! check coherence between both informations. -! -CALL IO_Field_read(TPINIFILE,'LOCEAN',LOCEAN,IRESP) -IF ( IRESP /= 0 ) LOCEAN = .FALSE. -! -CALL READ_EXSEG_n(KMI,TZFILE_DES,YCONF,GFLAT,GUSERV,GUSERC, & - GUSERR,GUSERI,GUSECI,GUSERS,GUSERG,GUSERH,GUSECHEM, & - GUSECHAQ,GUSECHIC,GCH_PH, & - GCH_CONV_LINOX,GSALT,GDEPOS_SLT,GDUST,GDEPOS_DST,GCHTRANS, & - GORILAM,GDEPOS_AER,GLG,GPASPOL,GFIRE, & -#ifdef MNH_FOREFIRE - GFOREFIRE, & -#endif - GLNOX_EXPLICIT, & - GCONDSAMP,GBLOWSNOW, IRIMX,IRIMY,ISV, & - YTURB,YTOM,GRMC01,YRAD,YDCONV,YSCONV,YCLOUD,YELEC,YEQNSYS, & - PTSTEP_ALL,CSTORAGE_TYPE,CINIFILEPGD_n ) -! -if ( cprogram == 'MESONH' .and. kmi == 1 ) then !Do this only once - call Fieldlist_nmodel_resize(NMODEL) -end if -! -IF (CPROGRAM=='SPAWN ' .OR. CPROGRAM=='DIAG ' .OR. CPROGRAM=='SPEC ' & - .OR. CPROGRAM=='REAL ') THEN - CINIFILE_n = YINIFILE - CCPLFILE(:) = ' ' - NMODEL=1 - LSTEADYLS=.TRUE. -END IF -! -IF (CPROGRAM=='MESONH') THEN - HINIFILEPGD=CINIFILEPGD_n -END IF -!------------------------------------------------------------------------------- -! -!* 7. CLOSE FILES -! ------------ -! -IF (CPROGRAM=='MESONH') CALL IO_File_close(TZFILE_DES) -! -!------------------------------------------------------------------------------- -9002 FORMAT(/,'FATAL ERROR IN INI_SEG_n: pb to read ',A16,' IRESP=',I3) -! -END SUBROUTINE INI_SEG_n diff --git a/src/mesonh/ext/les_cloud_masksn.f90 b/src/mesonh/ext/les_cloud_masksn.f90 deleted file mode 100644 index 10e9e4093fc35cf7e5d3ba3c0ebcce0047611694..0000000000000000000000000000000000000000 --- a/src/mesonh/ext/les_cloud_masksn.f90 +++ /dev/null @@ -1,419 +0,0 @@ -!MNH_LIC Copyright 2006-2020 CNRS, Meteo-France and Universite Paul Sabatier -!MNH_LIC This is part of the Meso-NH software governed by the CeCILL-C licence -!MNH_LIC version 1. See LICENSE, CeCILL-C_V1-en.txt and CeCILL-C_V1-fr.txt -!MNH_LIC for details. version 1. -!----------------------------------------------------------------- -! ####################### - SUBROUTINE LES_CLOUD_MASKS_n -! ####################### -! -! -!!**** *LES_MASKS_n* initializes the masks for clouds -!! -!! -!! PURPOSE -!! ------- -!! -!! EXTERNAL -!! -------- -!! -!! IMPLICIT ARGUMENTS -!! ------------------ -!! -!! REFERENCE -!! --------- -!! -!! AUTHOR -!! ------ -!! V. Masson -!! -!! MODIFICATIONS -!! ------------- -!! Original 07/2006 -!! P. Aumond 10/2009 Add possibility of user maskS -!! F.Couvreux 06/2011 : Conditional sampling -!! C.Lac 10/2014 : Correction on user masks -!! Q.Rodier 05/2019 : Missing parallelization -!! -!! -------------------------------------------------------------------------- -! -!* 0. DECLARATIONS -! ------------ -! -USE MODD_LES -USE MODD_LES_n -USE MODD_FIELD_n -USE MODD_CONF_n -USE MODD_CST , ONLY : XRD, XRV -USE MODD_NSV , ONLY : NSV_CSBEG, NSV_CSEND, NSV_CS -USE MODD_GRID_n , ONLY : XZHAT -USE MODD_CONDSAMP -! -USE MODE_ll -! -USE MODI_LES_VER_INT -USE MODI_LES_MEAN_ll -USE MODI_SHUMAN -! -IMPLICIT NONE -! -! -! 0.2 declaration of local variables -! -INTEGER :: JK ! vertical loop counter -INTEGER :: JI ! loop index on masks -INTEGER :: IIU, IJU,IIB,IJB,IIE,IJE ! hor. indices -INTEGER :: IKU, KBASE, KTOP ! ver. index -INTEGER :: IRR, IRRC, IRRR, IRRI, IRRS, IRRG ! moist variables indices -INTEGER :: JSV ! ind of scalars -! -REAL, DIMENSION(:,:,:), ALLOCATABLE :: ZRT ! total water -REAL, DIMENSION(:,:,:), ALLOCATABLE :: ZTHV ! Virtual potential temperature -! -REAL, DIMENSION(:,:,:), ALLOCATABLE :: ZW_LES ! W on LES vertical grid -REAL, DIMENSION(:,:,:), ALLOCATABLE :: ZRC_LES ! Rc on LES vertical grid -REAL, DIMENSION(:,:,:), ALLOCATABLE :: ZRI_LES ! Ri on LES vertical grid -REAL, DIMENSION(:,:,:), ALLOCATABLE :: ZRT_LES ! Rt on LES vertical grid -REAL, DIMENSION(:,:,:), ALLOCATABLE :: ZTHV_LES ! thv on LES vertical grid -REAL, DIMENSION(:,:,:,:), ALLOCATABLE :: ZSV_LES ! thv on LES vertical grid -REAL, DIMENSION(:,:,:), ALLOCATABLE :: ZTHV_ANOM ! thv-thv_mean on LES vertical grid -REAL, DIMENSION(:,:,:,:), ALLOCATABLE :: ZSV_ANOM ! sv-sv_mean -REAL, DIMENSION(:,:), ALLOCATABLE :: ZSTD_SV -REAL, DIMENSION(:,:), ALLOCATABLE :: ZSTD_SVTRES ! threshold of sv -REAL, DIMENSION(:,:,:), ALLOCATABLE :: ZWORK3D,ZWORK3DB -REAL, DIMENSION(:), ALLOCATABLE :: ZWORK1D -REAL, DIMENSION(:), ALLOCATABLE :: ZMEANRC -! -! -!------------------------------------------------------------------------------- -! -CALL GET_DIM_EXT_ll('B',IIU,IJU) -CALL GET_INDICE_ll (IIB,IJB,IIE,IJE) -! -IKU = SIZE(XTHT,3) -! -!------------------------------------------------------------------------------- -! -!* 1.0 Thermodynamical computations -! ---------------------------- -! -ALLOCATE(ZRT (IIU,IJU,IKU)) -ALLOCATE(ZMEANRC (IKU)) -ZRT = 0. -! -IRR=0 -IF (LUSERV) THEN - IRR=IRR+1 - ZRT = ZRT + XRT(:,:,:,1) -END IF -IF (LUSERC) THEN - IRR=IRR+1 - IRRC=IRR - ZRT = ZRT + XRT(:,:,:,IRRC) -END IF -IF (LUSERR) THEN - IRR=IRR+1 - IRRR=IRR - ZRT = ZRT + XRT(:,:,:,IRRR) -END IF -IF (LUSERI) THEN - IRR=IRR+1 - IRRI=IRR - ZRT = ZRT + XRT(:,:,:,IRRI) -END IF -IF (LUSERS) THEN - IRR=IRR+1 - IRRS=IRR - ZRT = ZRT + XRT(:,:,:,IRRS) -END IF -IF (LUSERG) THEN - IRR=IRR+1 - IRRG=IRR - ZRT = ZRT + XRT(:,:,:,IRRG) -END IF -! -! -!* computes fields on the LES grid in order to compute masks -! -ALLOCATE(ZTHV (IIU,IJU,IKU)) -ZTHV = XTHT -IF (LUSERV) ZTHV=ZTHV*(1.+XRV/XRD*XRT(:,:,:,1))/(1.+ZRT(:,:,:)) -! -!------------------------------------------------------------------------------- -! -!* 2.0 Fields on LES grid -! ------------------ -! -!* allocates fields on the LES grid -! -! -ALLOCATE(ZW_LES (IIU,IJU,NLES_K)) -ALLOCATE(ZRC_LES (IIU,IJU,NLES_K)) -ALLOCATE(ZRI_LES (IIU,IJU,NLES_K)) -ALLOCATE(ZRT_LES (IIU,IJU,NLES_K)) -ALLOCATE(ZTHV_LES (IIU,IJU,NLES_K)) -ALLOCATE(ZTHV_ANOM(IIU,IJU,NLES_K)) -ALLOCATE(ZSV_LES (IIU,IJU,NLES_K,NSV_CS)) -ALLOCATE(ZSV_ANOM(IIU,IJU,NLES_K,NSV_CS)) -ALLOCATE(ZSTD_SV(NLES_K,NSV_CS)) -ALLOCATE(ZSTD_SVTRES(NLES_K,NSV_CS)) -ALLOCATE(ZWORK1D(NLES_K)) -ALLOCATE(ZWORK3D(IIU,IJU,IKU)) -ALLOCATE(ZWORK3DB(IIU,IJU,NLES_K)) -! -ZWORK1D=0. -ZWORK3D=0. -ZWORK3DB=0. -! -CALL LES_VER_INT(MZF(XWT), ZW_LES) -IF (NSV_CS>0) THEN - DO JSV=NSV_CSBEG, NSV_CSEND - CALL LES_VER_INT( XSVT(:,:,:,JSV), & - ZSV_LES(:,:,:,JSV-NSV_CSBEG+1) ) - END DO -END IF -IF (LUSERC) THEN - CALL LES_VER_INT(XRT(:,:,:,IRRC), ZRC_LES) -ELSE - ZRC_LES = 0. -END IF -IF (LUSERI) THEN - CALL LES_VER_INT(XRT(:,:,:,IRRI), ZRI_LES) -ELSE - ZRI_LES = 0. -END IF -CALL LES_VER_INT(ZRT, ZRT_LES) -CALL LES_VER_INT(ZTHV, ZTHV_LES) -CALL LES_ANOMALY_FIELD(ZTHV,ZTHV_ANOM) -! -IF (NSV_CS>0) THEN - DO JSV=NSV_CSBEG, NSV_CSEND - ZWORK3D(:,:,:)=XSVT(:,:,:,JSV) - CALL LES_ANOMALY_FIELD(ZWORK3D,ZWORK3DB) - ZSV_ANOM(:,:,:,JSV-NSV_CSBEG+1)=ZWORK3DB(:,:,:) - CALL LES_STDEV(ZWORK3DB,ZWORK1D) - ZSTD_SV(:,JSV-NSV_CSBEG+1)=ZWORK1D(:) - DO JK=1,NLES_K - ZSTD_SVTRES(JK,JSV-NSV_CSBEG+1)=SUM(ZSTD_SV(1:JK,JSV-NSV_CSBEG+1))/(1.*JK) - END DO - END DO -END IF -! -DEALLOCATE(ZTHV ) -DEALLOCATE(ZWORK3D) -DEALLOCATE(ZWORK3DB) -DEALLOCATE(ZWORK1D) -! -!------------------------------------------------------------------------------- -! -!* 3.0 Cloud mask -! ---------- -! -IF (LLES_NEB_MASK) THEN - CALL LES_ALLOCATE('LLES_CURRENT_NEB_MASK',(/IIU,IJU,NLES_K/)) - LLES_CURRENT_NEB_MASK (:,:,:) = .FALSE. - WHERE ((ZRC_LES(IIB:IIE,IJB:IJE,:)>1.E-6 .OR. ZRI_LES(IIB:IIE,IJB:IJE,:)>1.E-6) .AND. ZW_LES(IIB:IIE,IJB:IJE,:)>0.) - LLES_CURRENT_NEB_MASK (IIB:IIE,IJB:IJE,:) = .TRUE. - END WHERE -END IF -! -!------------------------------------------------------------------------------- -! -!* 4.0 Cloud core mask -! --------------- -! -IF (LLES_CORE_MASK) THEN - CALL LES_ALLOCATE('LLES_CURRENT_CORE_MASK',(/IIU,IJU,NLES_K/)) - LLES_CURRENT_CORE_MASK (:,:,:) = .FALSE. - WHERE ((ZRC_LES(IIB:IIE,IJB:IJE,:)>1.E-6 .OR. ZRI_LES(IIB:IIE,IJB:IJE,:)>1.E-6) & - .AND. ZW_LES(IIB:IIE,IJB:IJE,:)>0. .AND. ZTHV_ANOM(IIB:IIE,IJB:IJE,:)>0.) - LLES_CURRENT_CORE_MASK (IIB:IIE,IJB:IJE,:) = .TRUE. - END WHERE -END IF -! -!------------------------------------------------------------------------------- -! -!* 4.0 Conditional sampling mask -! ------------------------- -! -IF (LLES_CS_MASK) THEN -! - CALL LES_MEAN_ll(ZRC_LES, LLES_CURRENT_CART_MASK, ZMEANRC ) - CALL LES_ALLOCATE('LLES_CURRENT_CS1_MASK',(/IIU,IJU,NLES_K/)) - LLES_CURRENT_CS1_MASK(:,:,:) = .FALSE. - IF (NSV_CS >= 2) THEN - CALL LES_ALLOCATE('LLES_CURRENT_CS2_MASK',(/IIU,IJU,NLES_K/)) - LLES_CURRENT_CS2_MASK(:,:,:) = .FALSE. - IF (NSV_CS == 3) THEN - CALL LES_ALLOCATE('LLES_CURRENT_CS3_MASK',(/IIU,IJU,NLES_K/)) - LLES_CURRENT_CS3_MASK (:,:,:) = .FALSE. - END IF - END IF - -! -! Cloud top and base computation -! - KBASE=2 - KTOP=NLES_K - DO JK=2,NLES_K - IF ((ZMEANRC(JK) > 1.E-7) .AND. (KBASE == 2)) KBASE=JK - IF ((ZMEANRC(JK) < 1.E-7) .AND. (KBASE > 2) .AND. (KTOP == NLES_K)) & - KTOP=JK-1 - END DO -! - DO JSV=NSV_CSBEG, NSV_CSEND - DO JK=2,NLES_K - IF (ZSTD_SV(JK,JSV-NSV_CSBEG+1) < 0.05*ZSTD_SVTRES(JK,JSV-NSV_CSBEG+1)) & - ZSTD_SV(JK,JSV-NSV_CSBEG+1)=0.05*ZSTD_SVTRES(JK,JSV-NSV_CSBEG+1) -! case no cloud top and base - IF (JSV == NSV_CSBEG) THEN - IF ((KBASE ==2) .AND. (KTOP == NLES_K)) THEN - WHERE (ZW_LES(IIB:IIE,IJB:IJE,JK)>0. .AND. ZSV_ANOM(IIB:IIE,IJB:IJE,JK,JSV-NSV_CSBEG+1) > & - XSCAL(JSV-NSV_CSBEG+1) * ZSTD_SV(JK,JSV-NSV_CSBEG+1)) - LLES_CURRENT_CS1_MASK (IIB:IIE,IJB:IJE,JK) = .TRUE. - END WHERE - END IF -! -! case cloud top and base defined -! - IF (XZHAT(JK) < XZHAT(KBASE)+(XZHAT(KTOP)-XZHAT(KBASE))/4.) THEN - WHERE (ZW_LES(IIB:IIE,IJB:IJE,JK)>0. .AND. ZSV_ANOM(IIB:IIE,IJB:IJE,JK,JSV-NSV_CSBEG+1) > & - XSCAL(JSV-NSV_CSBEG+1) *ZSTD_SV(JK,JSV-NSV_CSBEG+1)) - LLES_CURRENT_CS1_MASK (IIB:IIE,IJB:IJE,JK) = .TRUE. - END WHERE - END IF -! - IF (XZHAT(JK) >= XZHAT(KBASE)+(XZHAT(KTOP)-XZHAT(KBASE))/4.) THEN - WHERE (ZW_LES(IIB:IIE,IJB:IJE,JK)>0. .AND. ZSV_ANOM(IIB:IIE,IJB:IJE,JK,JSV-NSV_CSBEG+1) > & - XSCAL(JSV-NSV_CSBEG+1) * ZSTD_SV(JK,JSV-NSV_CSBEG+1) .AND. & - ZRC_LES(IIB:IIE,IJB:IJE,JK)>1.E-6) - LLES_CURRENT_CS1_MASK (IIB:IIE,IJB:IJE,JK) = .TRUE. - END WHERE - END IF - ELSE IF ( JSV == NSV_CSBEG + 1 ) THEN - IF ((KBASE ==2) .AND. (KTOP == NLES_K)) THEN - WHERE ( ZSV_ANOM(IIB:IIE,IJB:IJE,JK,JSV-NSV_CSBEG+1) > & - XSCAL(JSV-NSV_CSBEG+1) * ZSTD_SV(JK,JSV-NSV_CSBEG+1)) - LLES_CURRENT_CS2_MASK (IIB:IIE,IJB:IJE,JK) = .TRUE. - END WHERE - END IF -! -! case cloud top and base defined -! - IF (XZHAT(JK) < XZHAT(KBASE)+(XZHAT(KTOP)-XZHAT(KBASE))/4.) THEN - WHERE (ZSV_ANOM(IIB:IIE,IJB:IJE,JK,JSV-NSV_CSBEG+1) > & - XSCAL(JSV-NSV_CSBEG+1) *ZSTD_SV(JK,JSV-NSV_CSBEG+1)) - LLES_CURRENT_CS2_MASK (IIB:IIE,IJB:IJE,JK) = .TRUE. - END WHERE - END IF -! - IF (XZHAT(JK) >= XZHAT(KBASE)+(XZHAT(KTOP)-XZHAT(KBASE))/4.) THEN - WHERE (ZSV_ANOM(IIB:IIE,IJB:IJE,JK,JSV-NSV_CSBEG+1) > & - XSCAL(JSV-NSV_CSBEG+1) * ZSTD_SV(JK,JSV-NSV_CSBEG+1)) - LLES_CURRENT_CS2_MASK (IIB:IIE,IJB:IJE,JK) = .TRUE. - END WHERE - END IF -! - ELSE - IF ((KBASE ==2) .AND. (KTOP == NLES_K)) THEN - WHERE ( ZSV_ANOM(IIB:IIE,IJB:IJE,JK,JSV-NSV_CSBEG+1) > & - XSCAL(JSV-NSV_CSBEG+1) * ZSTD_SV(JK,JSV-NSV_CSBEG+1)) - LLES_CURRENT_CS3_MASK (IIB:IIE,IJB:IJE,JK) = .TRUE. - END WHERE - END IF -! -! case cloud top and base defined -! - IF (XZHAT(JK) < XZHAT(KBASE)+(XZHAT(KTOP)-XZHAT(KBASE))/4.) THEN - WHERE (ZSV_ANOM(IIB:IIE,IJB:IJE,JK,JSV-NSV_CSBEG+1) > & - XSCAL(JSV-NSV_CSBEG+1) *ZSTD_SV(JK,JSV-NSV_CSBEG+1)) - LLES_CURRENT_CS3_MASK (IIB:IIE,IJB:IJE,JK) = .TRUE. - END WHERE - END IF -! - IF (XZHAT(JK) >= XZHAT(KBASE)+(XZHAT(KTOP)-XZHAT(KBASE))/4.) THEN - WHERE (ZSV_ANOM(IIB:IIE,IJB:IJE,JK,JSV-NSV_CSBEG+1) > & - XSCAL(JSV-NSV_CSBEG+1) * ZSTD_SV(JK,JSV-NSV_CSBEG+1)) - LLES_CURRENT_CS3_MASK (IIB:IIE,IJB:IJE,JK) = .TRUE. - END WHERE - END IF - END IF - END DO - END DO -END IF -! -!------------------------------------------------------------------------------- -! -!* 5.0 User mask -! --------- -! -IF (LLES_MY_MASK) THEN - CALL LES_ALLOCATE('LLES_CURRENT_MY_MASKS',(/IIU,IJU,NLES_K,NLES_MASKS_USER/)) - DO JI=1,NLES_MASKS_USER - LLES_CURRENT_MY_MASKS (IIB:IIE,IJB:IJE,:,JI) = .FALSE. - END DO -! WHERE ((ZRC_LES + ZRI_LES) > 1.E-06) -! LLES_CURRENT_MY_MASKS (:,:,:,1) = .TRUE. -! END WHERE -! -END IF -!------------------------------------------------------------------------------- -! -DEALLOCATE(ZW_LES ) -DEALLOCATE(ZRC_LES ) -DEALLOCATE(ZRI_LES ) -DEALLOCATE(ZRT_LES ) -DEALLOCATE(ZTHV_LES ) -DEALLOCATE(ZSV_LES ) -DEALLOCATE(ZTHV_ANOM) -DEALLOCATE(ZSV_ANOM) -DEALLOCATE(ZSTD_SV) -DEALLOCATE(ZSTD_SVTRES) -!------------------------------------------------------------------------------- -DEALLOCATE(ZRT ) -DEALLOCATE(ZMEANRC) -!-------------------------------------------------------------------------------- -! -CONTAINS -! -!-------------------------------------------------------------------------------- -! -SUBROUTINE LES_ANOMALY_FIELD(PF,PF_ANOM) -! -REAL, DIMENSION(:,:,:), INTENT(IN) :: PF -REAL, DIMENSION(:,:,:), INTENT(OUT) :: PF_ANOM - -REAL, DIMENSION(SIZE(PF_ANOM,3)) :: ZMEAN -INTEGER :: JI, JJ - -CALL LES_VER_INT(PF, PF_ANOM) -CALL LES_MEAN_ll(PF_ANOM, LLES_CURRENT_CART_MASK, ZMEAN ) -DO JJ=1,SIZE(PF_ANOM,2) - DO JI=1,SIZE(PF_ANOM,1) - PF_ANOM(JI,JJ,:) = PF_ANOM(JI,JJ,:) - ZMEAN(:) - END DO -END DO - -END SUBROUTINE LES_ANOMALY_FIELD -!-------------------------------------------------------------------------------- -! -!-------------------------------------------------------------------------------- -! -SUBROUTINE LES_STDEV(PF_ANOM,PF_STD) -! -REAL, DIMENSION(:,:,:), INTENT(IN) :: PF_ANOM -REAL, DIMENSION(:), INTENT(OUT) :: PF_STD - -REAL, DIMENSION(SIZE(PF_ANOM,1),SIZE(PF_ANOM,2),SIZE(PF_ANOM,3)) :: Z2 -INTEGER :: JK - -Z2(:,:,:)=PF_ANOM(:,:,:)*PF_ANOM(:,:,:) -CALL LES_MEAN_ll(Z2, LLES_CURRENT_CART_MASK, PF_STD ) -DO JK=1,SIZE(PF_ANOM,3) - PF_STD(JK)=SQRT(PF_STD(JK)) -END DO - -END SUBROUTINE LES_STDEV -!------------------------------------------------------------------------------- -! -END SUBROUTINE LES_CLOUD_MASKS_n diff --git a/src/mesonh/ext/les_ini_timestepn.f90 b/src/mesonh/ext/les_ini_timestepn.f90 deleted file mode 100644 index 98c5cd306456bf19b2839c9ee608448392c07078..0000000000000000000000000000000000000000 --- a/src/mesonh/ext/les_ini_timestepn.f90 +++ /dev/null @@ -1,407 +0,0 @@ -!MNH_LIC Copyright 2002-2021 CNRS, Meteo-France and Universite Paul Sabatier -!MNH_LIC This is part of the Meso-NH software governed by the CeCILL-C licence -!MNH_LIC version 1. See LICENSE, CeCILL-C_V1-en.txt and CeCILL-C_V1-fr.txt -!MNH_LIC for details. version 1. -!----------------------------------------------------------------- -! ####################### -MODULE MODI_LES_INI_TIMESTEP_n -! ####################### -! -! -INTERFACE LES_INI_TIMESTEP_n -! - SUBROUTINE LES_INI_TIMESTEP_n(KTCOUNT) -! -INTEGER, INTENT(IN) :: KTCOUNT ! current model time-step -! -END SUBROUTINE LES_INI_TIMESTEP_n -! -END INTERFACE -! -END MODULE MODI_LES_INI_TIMESTEP_n - -! ############################## - SUBROUTINE LES_INI_TIMESTEP_n(KTCOUNT) -! ############################## -! -! -!!**** *LES_INI_TIMESTEP_n* initializes the LES variables for -!! the current time-step of model _n -!! -!! -!! PURPOSE -!! ------- -!! -!! EXTERNAL -!! -------- -!! -!! IMPLICIT ARGUMENTS -!! ------------------ -!! -!! REFERENCE -!! --------- -!! -!! AUTHOR -!! ------ -!! V. Masson -!! -!! MODIFICATIONS -!! ------------- -!! Original 06/11/02 -! P. Wautelet 13/09/2019: budget: simplify and modernize date/time management -! P. Wautelet 30/03/2021: budgets: LES cartesian subdomain limits are defined in the physical domain -! -------------------------------------------------------------------------- -! -!* 0. DECLARATIONS -! ------------ -! -USE MODD_CST -USE MODD_NSV -USE MODD_LES -USE MODD_LES_n -USE MODD_FIELD_n -USE MODD_METRICS_n -USE MODD_REF_n -USE MODD_CONF_n -USE MODD_TIME_n -USE MODD_DYN_n -USE MODD_TIME -USE MODD_CONF -USE MODD_LES_BUDGET -! -use mode_datetime, only: Datetime_distance -USE MODE_ll -USE MODE_MODELN_HANDLER -! -USE MODI_LES_VER_INT -USE MODI_THL_RT_FROM_TH_R -USE MODI_LES_MEAN_ll -USE MODI_SHUMAN -! -USE MODI_SECOND_MNH -USE MODI_LES_CLOUD_MASKS_N -! -IMPLICIT NONE -! -! -!* 0.1 declarations of arguments -! -! -INTEGER, INTENT(IN) :: KTCOUNT ! current model time-step -! -! -! 0.2 declaration of local variables -! -INTEGER :: IXOR_ll, IYOR_ll ! origine point coordinates -! ! of current processor domain -! ! on model domain on all -! ! processors -INTEGER :: IIB_ll, IJB_ll ! SO point coordinates of -! ! current processor phys. domain -! ! on model domain on all -! ! processors -INTEGER :: IIE_ll, IJE_ll ! NE point coordinates of -! ! current processor phys. domain -! ! on model domain on all -! ! processors -INTEGER :: IIINF_MASK, IISUP_MASK ! cart. mask local proc. limits -INTEGER :: IJINF_MASK, IJSUP_MASK ! cart. mask local proc. limits -! -INTEGER :: JK ! vertical loop counter -INTEGER :: IIB, IJB, IIE, IJE ! hor. indices -INTEGER :: IIU, IJU ! hor. indices -INTEGER :: IKU ! ver. index -INTEGER :: IRR, IRRC, IRRR, IRRI, IRRS, IRRG ! moist variables indices -! -INTEGER :: JSV ! scalar variables counter -! -REAL :: ZTIME1, ZTIME2 ! CPU time counters -! -REAL, DIMENSION(:,:,:), ALLOCATABLE :: ZTHL ! theta_l -REAL, DIMENSION(:,:,:), ALLOCATABLE :: ZRT ! total water -REAL, DIMENSION(:,:,:), ALLOCATABLE :: ZL ! Latent heat of vaporization -REAL, DIMENSION(:,:,:), ALLOCATABLE :: ZCP ! Cp -REAL, DIMENSION(:,:,:), ALLOCATABLE :: ZEXN ! Exner function -INTEGER :: IMI ! current model index -!------------------------------------------------------------------------------- -! -!* 1. Does current time-step is a LES time-step? -! ----------------------------------------- -! -LLES_CALL= .FALSE. -! -CALL SECOND_MNH(ZTIME1) -! -IF (NLES_TCOUNT==NLES_TIMES) LLES_CALL=.FALSE. -! -IF ( KTCOUNT>1 .AND. MOD (KTCOUNT-1,NLES_DTCOUNT)==0) LLES_CALL=.TRUE. -! -IF (.NOT. LLES_CALL) RETURN -! -CALL BUDGET_FLAGS(LUSERV, LUSERC, LUSERR, & - LUSERI, LUSERS, LUSERG, LUSERH ) -! -NLES_TCOUNT = NLES_TCOUNT + 1 -! -NLES_CURRENT_TCOUNT = NLES_TCOUNT -! -tles_dates(nles_tcount) = tdtcur -call Datetime_distance( tdtseg, tdtcur, xles_times(nles_tcount) ) -! -!* forward-in-time time-step -! -XCURRENT_TSTEP = XTSTEP -! -!------------------------------------------------------------------------------- -! -CALL GET_OR_ll ('B',IXOR_ll,IYOR_ll) -CALL GET_DIM_EXT_ll('B',IIU,IJU) -CALL GET_INDICE_ll (IIB,IJB,IIE,IJE) -! -IIB_ll=IXOR_ll+IIB-1 -IJB_ll=IYOR_ll+IJB-1 -IIE_ll=IXOR_ll+IIE-1 -IJE_ll=IYOR_ll+IJE-1 -! -IKU = SIZE(XTHT,3) -! -IMI = GET_CURRENT_MODEL_INDEX() -! -!------------------------------------------------------------------------------- -! -!* 2. Definition of masks -! ------------------- -! -!* 2.1 Cartesian (sub-)domain (on local processor) -! ---------------------- -! -CALL LES_ALLOCATE('LLES_CURRENT_CART_MASK',(/IIU,IJU,NLES_K/)) -! -IIINF_MASK = MAX(IIB, NLESn_IINF(IMI)+JPHEXT-(IIB_ll-1-JPHEXT)) -IJINF_MASK = MAX(IJB, NLESn_JINF(IMI)+JPHEXT-(IJB_ll-1-JPHEXT)) -IISUP_MASK = MIN(IIE, NLESn_ISUP(IMI)+JPHEXT-(IIB_ll-1-JPHEXT)) -IJSUP_MASK = MIN(IJE, NLESn_JSUP(IMI)+JPHEXT-(IJB_ll-1-JPHEXT)) -! -! -LLES_CURRENT_CART_MASK(:,:,:) = .FALSE. -LLES_CURRENT_CART_MASK(IIINF_MASK:IISUP_MASK,IJINF_MASK:IJSUP_MASK,:) = .TRUE. -! -CLES_CURRENT_LBCX(:) = CLES_LBCX(:,IMI) -CLES_CURRENT_LBCY(:) = CLES_LBCY(:,IMI) -! -!------------------------------------------------------------------------------- -! -!* 3. Definition of LES vertical grid for this model -! ---------------------------------------------- -! -IF (CLES_LEVEL_TYPE=='Z') THEN - IF (ASSOCIATED(XCOEFLIN_CURRENT_LES)) CALL LES_DEALLOCATE('XCOEFLIN_CURRENT_LES') - IF (ASSOCIATED(NKLIN_CURRENT_LES )) CALL LES_DEALLOCATE('NKLIN_CURRENT_LES') - ! - CALL LES_ALLOCATE('XCOEFLIN_CURRENT_LES',(/IIU,IJU,NLES_K/)) - CALL LES_ALLOCATE('NKLIN_CURRENT_LES',(/IIU,IJU,NLES_K/)) - ! - XCOEFLIN_CURRENT_LES(:,:,:) = XCOEFLIN_LES(:,:,:) - NKLIN_CURRENT_LES (:,:,:) = NKLIN_LES (:,:,:) -END IF -! -!------------------------------------------------------------------------------- -! -!* 4. Definition of variables used in budgets for current model -! --------------------------------------------------------- -! -IF (LUSERC) THEN - ALLOCATE(XCURRENT_L_O_EXN_CP (IIU,IJU,IKU)) -ELSE - ALLOCATE(XCURRENT_L_O_EXN_CP (0,0,0)) -END IF -ALLOCATE(XCURRENT_RHODJ (IIU,IJU,IKU)) -! -!* coefficients for Th to Thl conversion -! -IF (LUSERC) THEN - ALLOCATE(ZL (IIU,IJU,IKU)) - ALLOCATE(ZEXN(IIU,IJU,IKU)) - ALLOCATE(ZCP (IIU,IJU,IKU)) - ! - !* Exner function - ! - ZEXN(:,:,:) = (XPABST/XP00)**(XRD/XCPD) - ! - !* Latent heat of vaporization - ! - ZL(:,:,:) = XLVTT + (XCPD-XCL) * (XTHT(:,:,:)*ZEXN(:,:,:)-XTT) - ! - !* heat capacity at constant pressure of the humid air - ! - ZCP(:,:,:) = XCPD - IRR=2 - ZCP(:,:,:) = ZCP(:,:,:) + XCPV * XRT(:,:,:,1) - ZCP(:,:,:) = ZCP(:,:,:) + XCL * XRT(:,:,:,2) - IF (LUSERR) THEN - IRR=IRR+1 - ZCP(:,:,:) = ZCP(:,:,:) + XCL * XRT(:,:,:,IRR) - END IF - IF (LUSERI) THEN - IRR=IRR+1 - ZCP(:,:,:) = ZCP(:,:,:) + XCI * XRT(:,:,:,IRR) - END IF - IF (LUSERS) THEN - IRR=IRR+1 - ZCP(:,:,:) = ZCP(:,:,:) + XCI * XRT(:,:,:,IRR) - END IF - IF (LUSERG) THEN - IRR=IRR+1 - ZCP(:,:,:) = ZCP(:,:,:) + XCI * XRT(:,:,:,IRR) - END IF - IF (LUSERH) THEN - IRR=IRR+1 - ZCP(:,:,:) = ZCP(:,:,:) + XCI * XRT(:,:,:,IRR) - END IF - ! - !* L / (Exn * Cp) - ! - XCURRENT_L_O_EXN_CP(:,:,:) = ZL(:,:,:) / ZEXN(:,:,:) / ZCP(:,:,:) - ! - DEALLOCATE(ZL ) - DEALLOCATE(ZEXN) - DEALLOCATE(ZCP ) -END IF -! -!* other initializations -! -XCURRENT_RHODJ=XRHODJ -! -LCURRENT_USERV=LUSERV -LCURRENT_USERC=LUSERC -LCURRENT_USERR=LUSERR -LCURRENT_USERI=LUSERI -LCURRENT_USERS=LUSERS -LCURRENT_USERG=LUSERG -LCURRENT_USERH=LUSERH -! -NCURRENT_RR = NRR -! -ALLOCATE(XCURRENT_RUS (IIU,IJU,IKU)) -ALLOCATE(XCURRENT_RVS (IIU,IJU,IKU)) -ALLOCATE(XCURRENT_RWS (IIU,IJU,IKU)) -ALLOCATE(XCURRENT_RTHS (IIU,IJU,IKU)) -ALLOCATE(XCURRENT_RTKES(IIU,IJU,IKU)) -ALLOCATE(XCURRENT_RRS (IIU,IJU,IKU,NRR)) -ALLOCATE(XCURRENT_RSVS (IIU,IJU,IKU,NSV)) -ALLOCATE(XCURRENT_RTHLS(IIU,IJU,IKU)) -ALLOCATE(XCURRENT_RRTS (IIU,IJU,IKU)) -! -XCURRENT_RUS =XRUS -XCURRENT_RVS =XRVS -XCURRENT_RWS =XRWS -XCURRENT_RTHS =XRTHS -XCURRENT_RTKES=XRTKES -XCURRENT_RRS =XRRS -XCURRENT_RSVS =XRSVS -CALL THL_RT_FROM_TH_R(LUSERV, LUSERC, LUSERR, & - LUSERI, LUSERS, LUSERG, LUSERH, & - XCURRENT_L_O_EXN_CP, & - XCURRENT_RTHS, XCURRENT_RRS, & - XCURRENT_RTHLS, XCURRENT_RRTS ) - -ALLOCATE(X_LES_BU_RES_KE (NLES_K,NLES_TOT)) -ALLOCATE(X_LES_BU_RES_WThl (NLES_K,NLES_TOT)) -ALLOCATE(X_LES_BU_RES_Thl2 (NLES_K,NLES_TOT)) -ALLOCATE(X_LES_BU_SBG_Tke (NLES_K,NLES_TOT)) -ALLOCATE(X_LES_BU_RES_WRt (NLES_K,NLES_TOT)) -ALLOCATE(X_LES_BU_RES_Rt2 (NLES_K,NLES_TOT)) -ALLOCATE(X_LES_BU_RES_ThlRt(NLES_K,NLES_TOT)) -ALLOCATE(X_LES_BU_RES_Sv2 (NLES_K,NLES_TOT,NSV)) -ALLOCATE(X_LES_BU_RES_WSv (NLES_K,NLES_TOT,NSV)) - -X_LES_BU_RES_KE = 0. -X_LES_BU_RES_WThl = 0. -X_LES_BU_RES_Thl2 = 0. -X_LES_BU_SBG_Tke = 0. -X_LES_BU_RES_WRt = 0. -X_LES_BU_RES_Rt2 = 0. -X_LES_BU_RES_ThlRt= 0. -X_LES_BU_RES_Sv2 = 0. -X_LES_BU_RES_WSv = 0. -! -!------------------------------------------------------------------------------- -! -!* 4. Definition of anomaly fields -! ---------------------------- -! -ALLOCATE (XU_ANOM (IIU,IJU,NLES_K)) -ALLOCATE (XV_ANOM (IIU,IJU,NLES_K)) -ALLOCATE (XW_ANOM (IIU,IJU,NLES_K)) -ALLOCATE (XTHL_ANOM(IIU,IJU,NLES_K)) -IF (LUSERV) THEN - ALLOCATE (XRT_ANOM (IIU,IJU,NLES_K)) -ELSE - ALLOCATE (XRT_ANOM (0,0,0)) -END IF -ALLOCATE (XSV_ANOM (IIU,IJU,NLES_K,NSV)) -! -!* 4.1 conservative variables -! ---------------------- -! -ALLOCATE(ZTHL(IIU,IJU,IKU)) -ALLOCATE(ZRT (IIU,IJU,IKU)) -CALL THL_RT_FROM_TH_R(LUSERV, LUSERC, LUSERR, & - LUSERI, LUSERS, LUSERG, LUSERH, & - XCURRENT_L_O_EXN_CP, & - XTHT, XRT, & - ZTHL, ZRT ) -! -!* 4.2 anomaly fields on the LES grid -! ------------------------------ -! -CALL LES_ANOMALY_FIELD(MXF(XUT),XU_ANOM) -CALL LES_ANOMALY_FIELD(MYF(XVT),XV_ANOM) -CALL LES_ANOMALY_FIELD(MZF(XWT),XW_ANOM) -CALL LES_ANOMALY_FIELD(ZTHL,XTHL_ANOM) -IF (LUSERV) CALL LES_ANOMALY_FIELD(ZRT,XRT_ANOM) -DO JSV=1,NSV - CALL LES_ANOMALY_FIELD(XSVT(:,:,:,JSV),XSV_ANOM(:,:,:,JSV)) -END DO -! -!------------------------------------------------------------------------------- -! -DEALLOCATE(ZTHL) -DEALLOCATE(ZRT ) -!------------------------------------------------------------------------------- -! -!* 6.0 Nebulosity masks -! ---------------- -! -CALL LES_CLOUD_MASKS_n -! -!------------------------------------------------------------------------------- -CALL SECOND_MNH(ZTIME2) -XTIME_LES_BU = XTIME_LES_BU + ZTIME2 - ZTIME1 -!-------------------------------------------------------------------------------- -! -CONTAINS -! -!-------------------------------------------------------------------------------- -! -SUBROUTINE LES_ANOMALY_FIELD(PF,PF_ANOM) -! -REAL, DIMENSION(:,:,:), INTENT(IN) :: PF -REAL, DIMENSION(:,:,:), INTENT(OUT) :: PF_ANOM - -REAL, DIMENSION(SIZE(PF_ANOM,3)) :: ZMEAN -INTEGER :: JI, JJ - -CALL LES_VER_INT(PF, PF_ANOM) -CALL LES_MEAN_ll(PF_ANOM, LLES_CURRENT_CART_MASK, ZMEAN ) -DO JJ=1,SIZE(PF_ANOM,2) - DO JI=1,SIZE(PF_ANOM,1) - PF_ANOM(JI,JJ,:) = PF_ANOM(JI,JJ,:) - ZMEAN(:) - END DO -END DO - -END SUBROUTINE LES_ANOMALY_FIELD -!-------------------------------------------------------------------------------- -! -END SUBROUTINE LES_INI_TIMESTEP_n - diff --git a/src/mesonh/ext/lesn.f90 b/src/mesonh/ext/lesn.f90 deleted file mode 100644 index f66f89eae81a2f226ff87fd494f3982cc065fc61..0000000000000000000000000000000000000000 --- a/src/mesonh/ext/lesn.f90 +++ /dev/null @@ -1,3580 +0,0 @@ -!MNH_LIC Copyright 2000-2021 CNRS, Meteo-France and Universite Paul Sabatier -!MNH_LIC This is part of the Meso-NH software governed by the CeCILL-C licence -!MNH_LIC version 1. See LICENSE, CeCILL-C_V1-en.txt and CeCILL-C_V1-fr.txt -!MNH_LIC for details. version 1. -!----------------------------------------------------------------- -! ################# - SUBROUTINE LES_n -! ################# -! -! -!!**** *LES_n* computes the current time-step LES diagnostics for model _n -!! -!! -!! PURPOSE -!! ------- -!! -!! EXTERNAL -!! -------- -!! -!! IMPLICIT ARGUMENTS -!! ------------------ -!! -!! REFERENCE -!! --------- -!! -!! AUTHOR -!! ------ -!! V. Masson -!! -!! MODIFICATIONS -!! ------------- -!! Original 07/02/00 -!! 01/02/01 (D. Gazen) add module MODD_NSV for NSV variable -!! 06/11/02 (V. Masson) add LES budgets and use of anomalies -!! in LES quantities computations -!! 01/04/03 (V. Masson and F. Couvreux) bug in BL height loop -!! 10/07 (J.Pergaud) Add mass flux diagnostics -!! 06/08 (O.Thouron) Add radiative diagnostics -!! 12/10 (R.Honnert) Add EDKF mass flux in BL height -!! 10/09 (P. Aumond) Add possibility of user maskS -!! 10/14 (C.Lac) Correction on user masks -!! 10/16 (C.Lac) Add ground droplet deposition amount -!! Philippe Wautelet: 05/2016-04/2018: new data structures and calls for I/O -!! 02/2019 (C. Lac) Add rain fraction as a LES diagnostic -!! -!! -------------------------------------------------------------------------- -! -!* 0. DECLARATIONS -! ------------ -! -USE MODD_CST -USE MODD_CTURB, ONLY : XFTOP_O_FSURF -! -USE MODD_LES -USE MODD_LES_BUDGET -USE MODD_CONF -USE MODD_DIMPHYEX, ONLY: DIMPHYEX_t -USE MODD_LES_n -USE MODD_RADIATIONS_n -USE MODD_GRID_n -USE MODD_REF_n -USE MODD_FIELD_n -USE MODD_CONF_n -USE MODD_PARAM_n -USE MODD_TURB_n -USE MODD_METRICS_n -USE MODD_LUNIT_n, ONLY: TLUOUT -USE MODD_PARAM_n, ONLY: CCLOUD -USE MODD_PRECIP_n, ONLY: XINPRR,XACPRR,XINPRR3D,XEVAP3D,XINPRC,XINDEP -USE MODD_NSV, ONLY : NSV, NSV_CS -USE MODD_PARAM_ICE, ONLY: LDEPOSC,LSEDIC -USE MODD_PARAM_C2R2, ONLY: LDEPOC,LSEDC -USE MODD_PARAM_LIMA, ONLY : MSEDC=>LSEDC -! -USE MODI_SHUMAN -USE MODI_GRADIENT_M -USE MODI_GRADIENT_U -USE MODI_GRADIENT_V -USE MODI_GRADIENT_W -USE MODI_LES_VER_INT -USE MODI_SPEC_VER_INT -USE MODI_LES_MEAN_ll -USE MODI_THL_RT_FROM_TH_R -USE MODI_LES_RES_TR -USE MODI_BUDGET_FLAGS -USE MODI_LES_BUDGET_TEND_n -USE MODE_BL_DEPTH_DIAG -! -USE MODE_ll -USE MODE_MODELN_HANDLER -USE MODE_FILL_DIMPHYEX, ONLY: FILL_DIMPHYEX -! -IMPLICIT NONE -! -! -!* 0.1 declarations of arguments -! -! -! 0.2 declaration of local variables -! -REAL, DIMENSION(:,:,:), ALLOCATABLE :: ZEXN ! Exner function -REAL, DIMENSION(:,:,:), ALLOCATABLE :: ZTHL ! liquid potential temperature -REAL, DIMENSION(:,:,:), ALLOCATABLE :: ZTHV ! virtual potential temperature -REAL, DIMENSION(:,:,:), ALLOCATABLE :: ZRHO ! air density -! -REAL, DIMENSION(:,:,:), ALLOCATABLE :: CHAMPXY1 !tableau intermediaire -REAL, DIMENSION(:,:,:), ALLOCATABLE :: ZTEMP ! Temperature -REAL, DIMENSION(:,:,:), ALLOCATABLE :: ZEW -REAL, DIMENSION(:,:,:), ALLOCATABLE :: ZINDCLD !indice cloud si rc>0 -REAL, DIMENSION(:,:,:), ALLOCATABLE :: ZINDCLD2 !indice cloud rc>1E-5 -REAL, DIMENSION(:,:,:), ALLOCATABLE :: ZCLDFR_LES! CLDFR on LES vertical grid -REAL, DIMENSION(:,:,:), ALLOCATABLE :: ZICEFR_LES! ICEFR on LES vertical grid -REAL, DIMENSION(:,:,:), ALLOCATABLE :: ZRAINFR_LES! RAINFR on LES vertical grid -REAL, DIMENSION(:,:,:), ALLOCATABLE :: ZMASSF ! massflux=rho*w -REAL, DIMENSION(:,:,:), ALLOCATABLE :: ZREHU ! relative humidity - - -REAL, DIMENSION(:,:,:), ALLOCATABLE :: ZZ_LES ! alt. on LES vertical grid -REAL, DIMENSION(:,:,:), ALLOCATABLE ::ZZZ_LES -REAL, DIMENSION(:,:,:), ALLOCATABLE ::ZINPRR3D_LES ! precipitation flux 3D -REAL, DIMENSION(:,:,:), ALLOCATABLE ::ZEVAP3D_LES !evaporation 3D -REAL, DIMENSION(:,:,:), ALLOCATABLE :: ZP_LES ! pres. on LES vertical grid -REAL, DIMENSION(:,:,:), ALLOCATABLE :: ZDP_LES ! dynamical production TKE -REAL, DIMENSION(:,:,:), ALLOCATABLE :: ZTP_LES ! thermal production TKE -REAL, DIMENSION(:,:,:), ALLOCATABLE :: ZTR_LES ! transport production TKE -REAL, DIMENSION(:,:,:), ALLOCATABLE :: ZDISS_LES ! dissipation TKE -REAL, DIMENSION(:,:,:), ALLOCATABLE :: ZLM_LES ! mixing length - -REAL, DIMENSION(:,:,:), ALLOCATABLE :: ZDPDZ_LES ! dp/dz on LES vertical grid -REAL, DIMENSION(:,:,:), ALLOCATABLE :: ZDTHLDZ_LES ! dThl/dz on LES vertical grid -REAL, DIMENSION(:,:,:), ALLOCATABLE :: ZDTHDZ_LES ! dTh/dz on LES vertical grid -REAL, DIMENSION(:,:,:), ALLOCATABLE :: ZDRTDZ_LES ! dRt/dz on LES vertical grid -REAL, DIMENSION(:,:,:,:), ALLOCATABLE :: ZDSvDZ_LES ! dSv/dz on LES vertical grid -REAL, DIMENSION(:,:,:), ALLOCATABLE :: ZDUDZ_LES ! du/dz on LES vertical grid -REAL, DIMENSION(:,:,:), ALLOCATABLE :: ZDVDZ_LES ! dv/dz on LES vertical grid -REAL, DIMENSION(:,:,:), ALLOCATABLE :: ZDWDZ_LES ! dw/dz on LES vertical grid -REAL, DIMENSION(:,:,:), ALLOCATABLE :: ZEXN_LES ! Exner on LES vertical grid -REAL, DIMENSION(:,:,:), ALLOCATABLE :: ZRHO_LES ! rho on LES vertical grid -REAL, DIMENSION(:,:,:), ALLOCATABLE :: ZU_LES ! U on LES vertical grid -REAL, DIMENSION(:,:,:), ALLOCATABLE :: ZV_LES ! V on LES vertical grid -REAL, DIMENSION(:,:,:), ALLOCATABLE :: ZW_LES ! W on LES vertical grid -REAL, DIMENSION(:,:,:), ALLOCATABLE :: ZMF_LES ! mass flux on LES vertical grid -REAL, DIMENSION(:,:,:), ALLOCATABLE :: ZTH_LES ! Theta on LES vertical grid -REAL, DIMENSION(:,:,:), ALLOCATABLE :: ZTHV_LES ! thv on LES vertical grid -REAL, DIMENSION(:,:,:), ALLOCATABLE :: ZTHL_LES ! thl on LES vertical grid -REAL, DIMENSION(:,:,:), ALLOCATABLE :: ZTKE_LES ! tke on LES vertical grid -REAL, DIMENSION(:,:,:), ALLOCATABLE :: ZKE_LES ! ke on LES vertical grid -REAL, DIMENSION(:,:,:), ALLOCATABLE :: ZRV_LES ! Rv on LES vertical grid -REAL, DIMENSION(:,:,:), ALLOCATABLE :: ZREHU_LES ! Rehu on LES vertical grid -REAL, DIMENSION(:,:,:), ALLOCATABLE :: ZRC_LES ! Rc on LES vertical grid -REAL, DIMENSION(:,:,:), ALLOCATABLE :: ZRR_LES ! Rr on LES vertical grid -REAL, DIMENSION(:,:,:), ALLOCATABLE :: ZRI_LES ! Ri on LES vertical grid -REAL, DIMENSION(:,:,:), ALLOCATABLE :: ZRS_LES ! Rs on LES vertical grid -REAL, DIMENSION(:,:,:), ALLOCATABLE :: ZRG_LES ! Rg on LES vertical grid -REAL, DIMENSION(:,:,:), ALLOCATABLE :: ZRH_LES ! Rh on LES vertical grid -REAL, DIMENSION(:,:,:), ALLOCATABLE :: ZRT_LES ! Rt on LES vertical grid -REAL, DIMENSION(:,:,:,:), ALLOCATABLE :: ZSV_LES ! Sv on LES vertical grid -REAL, DIMENSION(:,:,:), ALLOCATABLE :: ZTH_ANOM ! Theta anomaly on LES vertical grid -REAL, DIMENSION(:,:,:), ALLOCATABLE :: ZTHV_ANOM ! thv anomaly on LES vertical grid -REAL, DIMENSION(:,:,:), ALLOCATABLE :: ZRV_ANOM ! Rv anomaly on LES vertical grid -REAL, DIMENSION(:,:,:), ALLOCATABLE :: ZRC_ANOM ! Rc anomaly on LES vertical grid -REAL, DIMENSION(:,:,:), ALLOCATABLE :: ZRI_ANOM ! Ri anomaly on LES vertical grid -REAL, DIMENSION(:,:,:), ALLOCATABLE :: ZRR_ANOM ! Rr anomaly on LES vertical grid -REAL, DIMENSION(:,:,:), ALLOCATABLE :: ZP_ANOM ! p anomaly on LES vertical grid -REAL, DIMENSION(:,:,:), ALLOCATABLE :: ZRHO_ANOM ! rho anomaly on LES vertical grid -REAL, DIMENSION(:,:,:), ALLOCATABLE :: ZDPDZ_ANOM! dp/dz anomaly on LES vertical grid -REAL, DIMENSION(:), ALLOCATABLE :: ZMEAN_DPDZ! dp/dz mean on LES vertical grid -REAL, DIMENSION(:), ALLOCATABLE :: ZLES_MEAN_DRtDZ! drt/dz mean on LES vertical grid -REAL, DIMENSION(:), ALLOCATABLE :: ZLES_MEAN_DTHDZ! dth/dz mean on LES vertical grid -REAL, DIMENSION(:,:), ALLOCATABLE :: ZLES_MEAN_DSVDZ! drt/dz mean on LES vertical grid -REAL, DIMENSION(:,:), ALLOCATABLE :: ZLWP_LES, ZRWP_LES, ZTKET_LES -REAL, DIMENSION(:,:), ALLOCATABLE :: ZIWP_LES, ZSWP_LES, ZGWP_LES, ZHWP_LES -REAL, DIMENSION(:,:), ALLOCATABLE :: ZINDCLD2D ! -REAL, DIMENSION(:,:), ALLOCATABLE :: ZINDCLD2D2 ! -REAL, DIMENSION(:,:), ALLOCATABLE :: ZLWP_ANOM ! lwp anomaly -REAL, DIMENSION(:,:), ALLOCATABLE :: ZMAXWRR2D ! maxwrr2D -! -REAL, DIMENSION(:,:,:), ALLOCATABLE :: ZU_SPEC ! U on SPEC vertical grid -REAL, DIMENSION(:,:,:), ALLOCATABLE :: ZV_SPEC ! V on SPEC vertical grid -REAL, DIMENSION(:,:,:), ALLOCATABLE :: ZW_SPEC ! W on SPEC vertical grid -REAL, DIMENSION(:,:,:), ALLOCATABLE :: ZTH_SPEC ! Theta on SPEC vertical grid -REAL, DIMENSION(:,:,:), ALLOCATABLE :: ZTHL_SPEC ! thl on SPEC vertical grid -REAL, DIMENSION(:,:,:), ALLOCATABLE :: ZRV_SPEC ! Rv on SPEC vertical grid -REAL, DIMENSION(:,:,:), ALLOCATABLE :: ZRC_SPEC ! Rc on SPEC vertical grid -REAL, DIMENSION(:,:,:), ALLOCATABLE :: ZRI_SPEC ! Ri on SPEC vertical grid -REAL, DIMENSION(:,:,:,:), ALLOCATABLE :: ZSV_SPEC ! Sv on SPEC vertical grid -! -REAL, DIMENSION(:,:,:), ALLOCATABLE :: ZRT ! rv+rc+rr+ri+rs+rg+rh -REAL, DIMENSION(:), ALLOCATABLE :: ZWORK1D,ZWORK1DT -REAL, DIMENSION(:,:), ALLOCATABLE :: ZWORK2D -REAL :: ZINPRRm,ZCOUNT -REAL, DIMENSION(:,:,:), ALLOCATABLE :: ZRADEFF_LES ! Re on LES vertical grid -!!fl sw, lw, dthrad on LES vertical grid -REAL, DIMENSION(:,:,:), ALLOCATABLE :: ZSWU_LES ! SWU on LES vertical grid -REAL, DIMENSION(:,:,:), ALLOCATABLE :: ZSWD_LES ! SWD on LES vertical grid -REAL, DIMENSION(:,:,:), ALLOCATABLE :: ZLWU_LES ! LWU on LES vertical grid -REAL, DIMENSION(:,:,:), ALLOCATABLE :: ZLWD_LES ! LWD on LES vertical grid -REAL, DIMENSION(:,:,:), ALLOCATABLE :: ZDTHRADSW_LES ! DTHRADSW on LES vertical grid -REAL, DIMENSION(:,:,:), ALLOCATABLE :: ZDTHRADLW_LES ! DTHRADLW on LES vertical grid -! -REAL, DIMENSION(:), ALLOCATABLE :: ZWORK ! -! -INTEGER :: IRR ! moist variables counter -INTEGER :: JSV ! scalar variables counter -INTEGER :: IIU, IJU ! array sizes -INTEGER :: IKE,IKB -INTEGER :: JI, JJ, JK ! loop counters -INTEGER :: IIU_ll, IJU_ll ! total domain I size (fin) -INTEGER :: IIA_ll, IJA_ll ! total domain I size (debut) -INTEGER :: IINFO_ll ! return code of parallel routine -INTEGER :: IIMAX_ll, IJMAX_ll ! total physical domain I size -INTEGER :: JLOOP -! -INTEGER :: IMASK ! mask counter -INTEGER :: IMASKUSER! mask user number -! -INTEGER :: IRESP, ILUOUT -INTEGER :: IMI ! Current model index -TYPE(DIMPHYEX_t) :: YLDIMPHYEX -!------------------------------------------------------------------------------- -! -IMI = GET_CURRENT_MODEL_INDEX() -! -IF (.NOT. LLES_CALL) RETURN -! -CALL GET_GLOBALDIMS_ll(IIMAX_ll,IJMAX_ll) -IIU_ll = IIMAX_ll+JPHEXT -IJU_ll = IJMAX_ll+JPHEXT -IIA_ll=JPHEXT+1 -IJA_ll=JPHEXT+1 -IKE=SIZE(XVT,3)-JPVEXT -IKB=1+JPVEXT -CALL GET_DIM_EXT_ll('B',IIU,IJU) -CALL FILL_DIMPHYEX(YLDIMPHYEX, SIZE(XTHT,1), SIZE(XTHT,2), SIZE(XTHT,3),.TRUE.) -! -ILUOUT = TLUOUT%NLU -! -!------------------------------------------------------------------------------- -! -!* interpolation coefficients for Z type grid -! -IF (CSPECTRA_LEVEL_TYPE=='Z') THEN - IF (ASSOCIATED(XCOEFLIN_CURRENT_SPEC)) CALL LES_DEALLOCATE('XCOEFLIN_CURRENT_SPEC') - IF (ASSOCIATED(NKLIN_CURRENT_SPEC )) CALL LES_DEALLOCATE('NKLIN_CURRENT_SPEC') - ! - CALL LES_ALLOCATE('XCOEFLIN_CURRENT_SPEC',(/IIU,IJU,NSPECTRA_K/)) - CALL LES_ALLOCATE('NKLIN_CURRENT_SPEC',(/IIU,IJU,NSPECTRA_K/)) - ! - XCOEFLIN_CURRENT_SPEC(:,:,:) = XCOEFLIN_SPEC(:,:,:) - NKLIN_CURRENT_SPEC (:,:,:) = NKLIN_SPEC (:,:,:) -END IF -! -!------------------------------------------------------------------------------- -! -!* 1. Allocations -! ----------- -! -ALLOCATE(ZP_LES (IIU,IJU,NLES_K)) -ALLOCATE(ZDP_LES (IIU,IJU,NLES_K)) -ALLOCATE(ZTP_LES (IIU,IJU,NLES_K)) -ALLOCATE(ZTR_LES (IIU,IJU,NLES_K)) -ALLOCATE(ZDISS_LES (IIU,IJU,NLES_K)) -ALLOCATE(ZLM_LES (IIU,IJU,NLES_K)) -ALLOCATE(ZDTHLDZ_LES(IIU,IJU,NLES_K)) -ALLOCATE(ZDTHDZ_LES(IIU,IJU,NLES_K)) -ALLOCATE(ZDRTDZ_LES(IIU,IJU,NLES_K)) -ALLOCATE(ZDUDZ_LES(IIU,IJU,NLES_K)) -ALLOCATE(ZDVDZ_LES(IIU,IJU,NLES_K)) -ALLOCATE(ZDWDZ_LES(IIU,IJU,NLES_K)) -ALLOCATE(ZDSVDZ_LES(IIU,IJU,NLES_K,NSV)) - -ALLOCATE(ZDPDZ_LES(IIU,IJU,NLES_K)) -ALLOCATE(ZEXN_LES (IIU,IJU,NLES_K)) -ALLOCATE(ZRHO_LES (IIU,IJU,NLES_K)) -ALLOCATE(ZU_LES (IIU,IJU,NLES_K)) -ALLOCATE(ZV_LES (IIU,IJU,NLES_K)) -ALLOCATE(ZW_LES (IIU,IJU,NLES_K)) -ALLOCATE(ZMF_LES (IIU,IJU,NLES_K)) -ALLOCATE(ZTH_LES (IIU,IJU,NLES_K)) -IF (CRAD /= 'NONE') THEN - ALLOCATE(ZRADEFF_LES (IIU,IJU,NLES_K)) - ALLOCATE(ZSWU_LES (IIU,IJU,NLES_K)) - ALLOCATE(ZSWD_LES (IIU,IJU,NLES_K)) - ALLOCATE(ZLWU_LES (IIU,IJU,NLES_K)) - ALLOCATE(ZLWD_LES (IIU,IJU,NLES_K)) - ALLOCATE(ZDTHRADSW_LES (IIU,IJU,NLES_K)) - ALLOCATE(ZDTHRADLW_LES (IIU,IJU,NLES_K)) -ELSE - ALLOCATE(ZRADEFF_LES (0,0,0)) - ALLOCATE(ZSWU_LES (0,0,0)) - ALLOCATE(ZSWD_LES (0,0,0)) - ALLOCATE(ZLWU_LES (0,0,0)) - ALLOCATE(ZLWD_LES (0,0,0)) - ALLOCATE(ZDTHRADSW_LES (0,0,0)) - ALLOCATE(ZDTHRADLW_LES (0,0,0)) -END IF -IF (LUSERV) THEN - ALLOCATE(ZTHV_LES (IIU,IJU,NLES_K)) -ELSE - ALLOCATE(ZTHV_LES (0,0,0)) -END IF -ALLOCATE(ZTHL_LES (IIU,IJU,NLES_K)) -ALLOCATE(ZTKE_LES (IIU,IJU,NLES_K)) -ALLOCATE(ZKE_LES(IIU,IJU,NLES_K)) -ALLOCATE(ZTKET_LES(IIU,IJU)) -ALLOCATE(ZWORK1D (NLES_K)) -ALLOCATE(ZWORK1DT (NLES_K)) -ALLOCATE(ZZZ_LES(IIU,IJU,NLES_K)) -IF (LUSERV) THEN - ALLOCATE(ZRV_LES (IIU,IJU,NLES_K)) - ALLOCATE(ZRT_LES (IIU,IJU,NLES_K)) - ALLOCATE(ZREHU_LES (IIU,IJU,NLES_K)) -ELSE - ALLOCATE(ZRV_LES (0,0,0)) - ALLOCATE(ZRT_LES (0,0,0)) - ALLOCATE(ZREHU_LES (0,0,0)) -END IF -IF (LUSERC) THEN - ALLOCATE(ZRC_LES (IIU,IJU,NLES_K)) - ALLOCATE(ZLWP_LES(IIU,IJU)) - ALLOCATE(ZINDCLD2D(IIU,IJU)) - ALLOCATE(ZINDCLD2D2(IIU,IJU)) - ALLOCATE(ZCLDFR_LES(IIU,IJU,NLES_K)) - ALLOCATE(ZWORK2D(IIU,IJU)) - ALLOCATE(ZLWP_ANOM(IIU,IJU)) -ELSE - ALLOCATE(ZRC_LES (0,0,0)) - ALLOCATE(ZLWP_LES(0,0)) - ALLOCATE(ZINDCLD2D(0,0)) - ALLOCATE(ZINDCLD2D2(0,0)) - ALLOCATE(ZCLDFR_LES(0,0,0)) - ALLOCATE(ZWORK2D(0,0)) - ALLOCATE(ZLWP_ANOM(0,0)) -END IF -IF (LUSERR) THEN - ALLOCATE(ZRR_LES (IIU,IJU,NLES_K)) - ALLOCATE(ZMAXWRR2D(IIU,IJU)) - ALLOCATE(ZRWP_LES(IIU,IJU)) - ALLOCATE(ZINPRR3D_LES (IIU,IJU,NLES_K)) - ALLOCATE(ZEVAP3D_LES (IIU,IJU,NLES_K)) - ALLOCATE(ZRAINFR_LES(IIU,IJU,NLES_K)) -ELSE - ALLOCATE(ZRR_LES (0,0,0)) - ALLOCATE(ZMAXWRR2D(0,0)) - ALLOCATE(ZRWP_LES(0,0)) - ALLOCATE(ZINPRR3D_LES(0,0,0)) - ALLOCATE(ZEVAP3D_LES(0,0,0)) - ALLOCATE(ZRAINFR_LES(0,0,0)) -END IF -IF (LUSERI) THEN - ALLOCATE(ZRI_LES (IIU,IJU,NLES_K)) - ALLOCATE(ZIWP_LES(IIU,IJU)) - ALLOCATE(ZICEFR_LES(IIU,IJU,NLES_K)) -ELSE - ALLOCATE(ZRI_LES (0,0,0)) - ALLOCATE(ZIWP_LES(0,0)) - ALLOCATE(ZICEFR_LES(0,0,0)) -END IF -IF (LUSERS) THEN - ALLOCATE(ZRS_LES (IIU,IJU,NLES_K)) - ALLOCATE(ZSWP_LES(IIU,IJU)) -ELSE - ALLOCATE(ZRS_LES (0,0,0)) - ALLOCATE(ZSWP_LES(0,0)) -END IF -IF (LUSERG) THEN - ALLOCATE(ZRG_LES (IIU,IJU,NLES_K)) - ALLOCATE(ZGWP_LES(IIU,IJU)) -ELSE - ALLOCATE(ZRG_LES (0,0,0)) - ALLOCATE(ZGWP_LES(0,0)) -END IF -IF (LUSERH) THEN - ALLOCATE(ZRH_LES (IIU,IJU,NLES_K)) - ALLOCATE(ZHWP_LES(IIU,IJU)) -ELSE - ALLOCATE(ZRH_LES (0,0,0)) - ALLOCATE(ZHWP_LES(0,0)) -END IF -IF (NSV>0) THEN - ALLOCATE(ZSV_LES (IIU,IJU,NLES_K,NSV)) -ELSE - ALLOCATE(ZSV_LES (0,0,0,0)) -END IF -! -ALLOCATE(ZP_ANOM (IIU,IJU,NLES_K)) -ALLOCATE(ZRHO_ANOM (IIU,IJU,NLES_K)) -ALLOCATE(ZTH_ANOM (IIU,IJU,NLES_K)) -ALLOCATE(ZDPDZ_ANOM(IIU,IJU,NLES_K)) -IF (LUSERV) THEN - ALLOCATE(ZTHV_ANOM(IIU,IJU,NLES_K)) - ALLOCATE(ZRV_ANOM (IIU,IJU,NLES_K)) -ELSE - ALLOCATE(ZTHV_ANOM(0,0,0)) - ALLOCATE(ZRV_ANOM (0,0,0)) -END IF -IF (LUSERC) THEN - ALLOCATE(ZRC_ANOM (IIU,IJU,NLES_K)) -ELSE - ALLOCATE(ZRC_ANOM (0,0,0)) -END IF -IF (LUSERI) THEN - ALLOCATE(ZRI_ANOM (IIU,IJU,NLES_K)) -ELSE - ALLOCATE(ZRI_ANOM (0,0,0)) -END IF -IF (LUSERR) THEN - ALLOCATE(ZRR_ANOM (IIU,IJU,NLES_K)) -ELSE - ALLOCATE(ZRR_ANOM (0,0,0)) -END IF -ALLOCATE(ZMEAN_DPDZ(NLES_K)) -ALLOCATE(ZLES_MEAN_DTHDZ(NLES_K)) -! -! -ALLOCATE(ZU_SPEC (NSPECTRA_NI,NSPECTRA_NJ,NSPECTRA_K)) -ALLOCATE(ZV_SPEC (NSPECTRA_NI,NSPECTRA_NJ,NSPECTRA_K)) -ALLOCATE(ZW_SPEC (NSPECTRA_NI,NSPECTRA_NJ,NSPECTRA_K)) -ALLOCATE(ZTH_SPEC (NSPECTRA_NI,NSPECTRA_NJ,NSPECTRA_K)) -IF (LUSERC) THEN - ALLOCATE(ZTHL_SPEC(NSPECTRA_NI,NSPECTRA_NJ,NSPECTRA_K)) -ELSE - ALLOCATE(ZTHL_SPEC(0,0,0)) -END IF -IF (LUSERV) THEN - ALLOCATE(ZRV_SPEC (NSPECTRA_NI,NSPECTRA_NJ,NSPECTRA_K)) -ELSE - ALLOCATE(ZRV_SPEC (0,0,0)) -END IF -IF (LUSERC) THEN - ALLOCATE(ZRC_SPEC (NSPECTRA_NI,NSPECTRA_NJ,NSPECTRA_K)) -ELSE - ALLOCATE(ZRC_SPEC (0,0,0)) -END IF -IF (LUSERI) THEN - ALLOCATE(ZRI_SPEC (NSPECTRA_NI,NSPECTRA_NJ,NSPECTRA_K)) -ELSE - ALLOCATE(ZRI_SPEC (0,0,0)) -END IF -IF (NSV>0) THEN - ALLOCATE(ZSV_SPEC (NSPECTRA_NI,NSPECTRA_NJ,NSPECTRA_K,NSV)) -ELSE - ALLOCATE(ZSV_SPEC (0,0,0,0)) -END IF -! -! -ALLOCATE(ZEXN (IIU,IJU,SIZE(XTHT,3))) -ALLOCATE(ZRHO (IIU,IJU,SIZE(XTHT,3))) -ALLOCATE(ZRT (IIU,IJU,SIZE(XTHT,3))) -ALLOCATE(ZTHV (IIU,IJU,SIZE(XTHT,3))) -ALLOCATE(ZTHL (IIU,IJU,SIZE(XTHT,3))) -ALLOCATE(ZEW (IIU,IJU,SIZE(XTHT,3))) -ALLOCATE(ZMASSF (IIU,IJU,SIZE(XTHT,3))) -ALLOCATE(ZTEMP (IIU,IJU,SIZE(XTHT,3))) -ALLOCATE(ZREHU (IIU,IJU,SIZE(XTHT,3))) -ALLOCATE(CHAMPXY1 (IIU,IJU,1)) -! -!------------------------------------------------------------------------------- -! -!* 1.2 preliminary calculations -! ------------------------ -! -ZEXN(:,:,:) = (XPABST/XP00)**(XRD/XCPD) -! -! -!* computation of relative humidity -ZTEMP=XTHT*ZEXN -ZEW=EXP (XALPW -XBETAW/ZTEMP-XGAMW*ALOG(ZTEMP)) -IF (LUSERV) THEN - ZREHU(:,:,:)=100.*XRT(:,:,:,1)*XPABST(:,:,:)/((XRD/XRV+XRT(:,:,:,1))*ZEW(:,:,:)) -ELSE - ZREHU(:,:,:)=0. -END IF -! -CALL THL_RT_FROM_TH_R(LUSERV, LUSERC, LUSERR, & - LUSERI, LUSERS, LUSERG, LUSERH, & - XCURRENT_L_O_EXN_CP, & - XTHT, XRT, & - ZTHL, ZRT ) -! -!* computation of density and virtual potential temperature -! -ZTHV=XTHT -IF (LUSERV) ZTHV=ZTHV*(1.+XRV/XRD*XRT(:,:,:,1))/(1.+ZRT(:,:,:)) -! -IF (CEQNSYS=='DUR') THEN - ZRHO=XPABST/(XRD*ZTHV*ZEXN) -ELSE - ZRHO=XRHODREF*( 1. + (XCPD-XRD)/XRD*(ZEXN/XEXNREF - 1.) - (ZTHV/XTHVREF - 1.) ) -END IF -! -! computation of mass flux -ZMASSF=MZM(ZRHO)*XWT -! -!------------------------------------------------------------------------------- -! -!* 2. Vertical interpolations to LES vertical grid -! -------------------------------------------- -! -!* note that velocity fields are first localized on the MASS points -! -! -IF (CRAD /= 'NONE') THEN - CALL LES_VER_INT( XRADEFF, ZRADEFF_LES) - CALL LES_VER_INT( XSWU, ZSWU_LES) - CALL LES_VER_INT( XSWD, ZSWD_LES) - CALL LES_VER_INT( XLWU, ZLWU_LES) - CALL LES_VER_INT( XLWD, ZLWD_LES) - CALL LES_VER_INT( XDTHRADSW, ZDTHRADSW_LES) - CALL LES_VER_INT( XDTHRADLW, ZDTHRADLW_LES) -END IF -! -CALL LES_VER_INT( XZZ , ZZZ_LES) -CALL LES_VER_INT( XPABST, ZP_LES ) -CALL LES_VER_INT( XDYP, ZDP_LES ) -CALL LES_VER_INT( XTHP, ZTP_LES ) -CALL LES_VER_INT( XTR, ZTR_LES ) -CALL LES_VER_INT( XDISS, ZDISS_LES ) -CALL LES_VER_INT( XLEM, ZLM_LES ) -CALL LES_VER_INT( GZ_M_M(XPABST,XDZZ), ZDPDZ_LES ) -! -CALL LES_VER_INT( MXF(XUT) ,ZU_LES ) -CALL LES_VER_INT( MYF(XVT) ,ZV_LES ) -CALL LES_VER_INT( MZF(XWT) ,ZW_LES ) -CALL LES_VER_INT( MZF(ZMASSF) ,ZMF_LES) -CALL LES_VER_INT( XTHT ,ZTH_LES ) -CALL LES_VER_INT( MXF(MZF(GZ_U_UW(XUT,XDZZ))), ZDUDZ_LES ) -CALL LES_VER_INT( MYF(MZF(GZ_V_VW(XVT,XDZZ))), ZDVDZ_LES ) -CALL LES_VER_INT( GZ_W_M(XWT,XDZZ), ZDWDZ_LES ) -CALL LES_VER_INT( ZEXN, ZEXN_LES) -! -CALL LES_VER_INT( GZ_M_M(XTHT,XDZZ), ZDTHDZ_LES ) -! -CALL LES_VER_INT(ZRHO, ZRHO_LES) -! -IF (LUSERV) CALL LES_VER_INT(ZTHV, ZTHV_LES) -CALL LES_VER_INT(ZTHL, ZTHL_LES) -CALL LES_VER_INT( GZ_M_M(ZTHL,XDZZ), ZDTHLDZ_LES ) -! -CALL LES_VER_INT( XTKET ,ZTKE_LES) -IRR = 0 -IF (LUSERV) THEN - IRR = IRR + 1 - CALL LES_VER_INT( XRT(:,:,:,IRR) ,ZRV_LES ) - CALL LES_VER_INT( ZRT(:,:,:) ,ZRT_LES ) - CALL LES_VER_INT( GZ_M_M(ZRT,XDZZ), ZDRTDZ_LES ) - CALL LES_VER_INT( ZREHU(:,:,:) ,ZREHU_LES) -END IF -IF (LUSERC) THEN - IRR = IRR + 1 - CALL LES_VER_INT( XRT(:,:,:,IRR) ,ZRC_LES ) - ALLOCATE(ZINDCLD (IIU,IJU,NLES_K)) - ALLOCATE(ZINDCLD2(IIU,IJU,NLES_K)) - ZINDCLD = CEILING(ZRC_LES-1.E-6) - ZINDCLD2 = CEILING(ZRC_LES-1.E-5) - CALL LES_VER_INT( XCLDFR(:,:,:) ,ZCLDFR_LES ) -ELSE - ALLOCATE(ZINDCLD (0,0,0)) - ALLOCATE(ZINDCLD2(0,0,0)) -END IF -IF (LUSERR) THEN - IRR = IRR + 1 - CALL LES_VER_INT( XRT(:,:,:,IRR) ,ZRR_LES ) - CALL LES_VER_INT( XINPRR3D(:,:,:), ZINPRR3D_LES) - CALL LES_VER_INT( XEVAP3D(:,:,:), ZEVAP3D_LES) - CALL LES_VER_INT( XRAINFR(:,:,:) ,ZRAINFR_LES ) -END IF -IF (LUSERC) THEN - DO JJ=1,IJU - DO JI=1,IIU - ZINDCLD2D(JI,JJ) = maxval(ZINDCLD(JI,JJ,:)) - ZINDCLD2D2(JI,JJ)= maxval(ZINDCLD2(JI,JJ,:)) - END DO - END DO - !* integration of rho rc - !!!ZLWP_LES only for cloud water - ZLWP_LES(:,:) = 0. - DO JK=1,NLES_K-1 - ZLWP_LES(:,:) = ZLWP_LES(:,:) + (ZZZ_LES(:,:,JK+1)-ZZZ_LES(:,:,JK)) & - * (ZRC_LES(:,:,JK)) * ZRHO_LES(:,:,JK) - END DO - CALL LES_MEAN_ll ( ZLWP_LES, LLES_CURRENT_CART_MASK(:,:,1), & - XLES_LWP(NLES_CURRENT_TCOUNT) ) -! -END IF - - !!!ZRWP_LES only for rain water -IF (LUSERR) THEN - ZRWP_LES(:,:)=0. - DO JK=1,NLES_K-1 - ZRWP_LES(:,:) = ZRWP_LES(:,:) + (ZZZ_LES(:,:,JK+1)-ZZZ_LES(:,:,JK)) & - * (ZRR_LES(:,:,JK)) * ZRHO_LES(:,:,JK) - END DO - CALL LES_MEAN_ll ( ZRWP_LES, LLES_CURRENT_CART_MASK(:,:,1), & - XLES_RWP(NLES_CURRENT_TCOUNT) ) -ENDIF -! -IF (LUSERI) THEN - IRR = IRR + 1 - CALL LES_VER_INT( XRT(:,:,:,IRR) ,ZRI_LES ) - ZIWP_LES(:,:)=0. - DO JK=1,NLES_K-1 - ZIWP_LES(:,:) = ZIWP_LES(:,:) + (ZZZ_LES(:,:,JK+1)-ZZZ_LES(:,:,JK)) & - * (ZRI_LES(:,:,JK)) * ZRHO_LES(:,:,JK) - END DO - CALL LES_MEAN_ll ( ZIWP_LES, LLES_CURRENT_CART_MASK(:,:,1), & - XLES_IWP(NLES_CURRENT_TCOUNT) ) - CALL LES_VER_INT( XICEFR(:,:,:) ,ZICEFR_LES ) -END IF -IF (LUSERS) THEN - IRR = IRR + 1 - CALL LES_VER_INT( XRT(:,:,:,IRR) ,ZRS_LES ) - ZSWP_LES(:,:)=0. - DO JK=1,NLES_K-1 - ZSWP_LES(:,:) = ZSWP_LES(:,:) + (ZZZ_LES(:,:,JK+1)-ZZZ_LES(:,:,JK)) & - * (ZRS_LES(:,:,JK)) * ZRHO_LES(:,:,JK) - END DO - CALL LES_MEAN_ll ( ZSWP_LES, LLES_CURRENT_CART_MASK(:,:,1), & - XLES_SWP(NLES_CURRENT_TCOUNT) ) -END IF -IF (LUSERG) THEN - IRR = IRR + 1 - CALL LES_VER_INT( XRT(:,:,:,IRR) ,ZRG_LES ) - ZGWP_LES(:,:)=0. - DO JK=1,NLES_K-1 - ZGWP_LES(:,:) = ZGWP_LES(:,:) + (ZZZ_LES(:,:,JK+1)-ZZZ_LES(:,:,JK)) & - * (ZRG_LES(:,:,JK)) * ZRHO_LES(:,:,JK) - END DO - CALL LES_MEAN_ll ( ZGWP_LES, LLES_CURRENT_CART_MASK(:,:,1), & - XLES_GWP(NLES_CURRENT_TCOUNT) ) -END IF -IF (LUSERH) THEN - IRR = IRR + 1 - CALL LES_VER_INT( XRT(:,:,:,IRR) ,ZRH_LES ) - ZHWP_LES(:,:)=0. - DO JK=1,NLES_K-1 - ZHWP_LES(:,:) = ZHWP_LES(:,:) + (ZZZ_LES(:,:,JK+1)-ZZZ_LES(:,:,JK)) & - * (ZRH_LES(:,:,JK)) * ZRHO_LES(:,:,JK) - END DO - CALL LES_MEAN_ll ( ZHWP_LES, LLES_CURRENT_CART_MASK(:,:,1), & - XLES_HWP(NLES_CURRENT_TCOUNT) ) -END IF -IF (NSV>0) THEN - DO JSV=1,NSV - CALL LES_VER_INT( XSVT(:,:,:,JSV), ZSV_LES(:,:,:,JSV) ) - CALL LES_VER_INT( GZ_M_M(XSVT(:,:,:,JSV),XDZZ), ZDSVDZ_LES(:,:,:,JSV) ) - END DO -END IF -! -!*mean sw and lw fluxes - CALL LES_MEAN_ll ( ZSWU_LES, LLES_CURRENT_CART_MASK, & - XLES_SWU(:,NLES_CURRENT_TCOUNT) ) - CALL LES_MEAN_ll ( ZSWD_LES, LLES_CURRENT_CART_MASK, & - XLES_SWD(:,NLES_CURRENT_TCOUNT) ) - CALL LES_MEAN_ll ( ZLWU_LES, LLES_CURRENT_CART_MASK, & - XLES_LWU(:,NLES_CURRENT_TCOUNT) ) - CALL LES_MEAN_ll ( ZLWD_LES, LLES_CURRENT_CART_MASK, & - XLES_LWD(:,NLES_CURRENT_TCOUNT) ) - CALL LES_MEAN_ll ( ZDTHRADSW_LES, LLES_CURRENT_CART_MASK, & - XLES_DTHRADSW(:,NLES_CURRENT_TCOUNT) ) - CALL LES_MEAN_ll ( ZDTHRADLW_LES, LLES_CURRENT_CART_MASK, & - XLES_DTHRADLW(:,NLES_CURRENT_TCOUNT) ) - CALL LES_MEAN_ll ( ZRADEFF_LES, LLES_CURRENT_CART_MASK, & - XLES_RADEFF(:,NLES_CURRENT_TCOUNT) ) -!* mean vertical profiles on the LES grid -! - CALL LES_MEAN_ll ( ZU_LES, LLES_CURRENT_CART_MASK, & - XLES_MEAN_U(:,NLES_CURRENT_TCOUNT,1) ) -! - CALL LES_MEAN_ll ( ZV_LES, LLES_CURRENT_CART_MASK, & - XLES_MEAN_V(:,NLES_CURRENT_TCOUNT,1) ) -! - CALL LES_MEAN_ll ( ZW_LES, LLES_CURRENT_CART_MASK, & - XLES_MEAN_W(:,NLES_CURRENT_TCOUNT,1) ) -! - CALL LES_MEAN_ll ( ZP_LES, LLES_CURRENT_CART_MASK, & - XLES_MEAN_P(:,NLES_CURRENT_TCOUNT,1) ) -! - CALL LES_MEAN_ll ( ZDP_LES, LLES_CURRENT_CART_MASK, & - XLES_MEAN_DP(:,NLES_CURRENT_TCOUNT,1) ) -! - CALL LES_MEAN_ll ( ZTP_LES, LLES_CURRENT_CART_MASK, & - XLES_MEAN_TP(:,NLES_CURRENT_TCOUNT,1) ) -! - CALL LES_MEAN_ll ( ZTR_LES, LLES_CURRENT_CART_MASK, & - XLES_MEAN_TR(:,NLES_CURRENT_TCOUNT,1) ) -! - CALL LES_MEAN_ll ( ZDISS_LES, LLES_CURRENT_CART_MASK, & - XLES_MEAN_DISS(:,NLES_CURRENT_TCOUNT,1) ) -! - CALL LES_MEAN_ll ( ZLM_LES, LLES_CURRENT_CART_MASK, & - XLES_MEAN_LM(:,NLES_CURRENT_TCOUNT,1) ) -! - CALL LES_MEAN_ll ( ZRHO_LES, LLES_CURRENT_CART_MASK, & - XLES_MEAN_RHO(:,NLES_CURRENT_TCOUNT,1) ) -! - CALL LES_MEAN_ll ( ZMF_LES, LLES_CURRENT_CART_MASK, & - XLES_MEAN_Mf(:,NLES_CURRENT_TCOUNT,1) ) -! - CALL LES_MEAN_ll ( ZTH_LES*ZEXN_LES, LLES_CURRENT_CART_MASK, & - ZWORK1DT(:) ) -! -!computation of es - ZWORK1D(:)=EXP(XALPW - & - XBETAW/ZWORK1DT(:) & - -XGAMW*ALOG(ZWORK1DT(:))) -!computation of qs - - IF (LUSERV) & - XLES_MEAN_Qs(:,NLES_CURRENT_TCOUNT,1)=XRD/XRV*ZWORK1D(:)/ & - (XLES_MEAN_P(:,NLES_CURRENT_TCOUNT,1)-ZWORK1D(:)*(1-XRD/XRV)) -! qs is determined from the temperature average over the current_mask -! - CALL LES_MEAN_ll ( ZTH_LES, LLES_CURRENT_CART_MASK, & - XLES_MEAN_Th(:,NLES_CURRENT_TCOUNT,1) ) -! - IF (LUSERV) & - CALL LES_MEAN_ll ( ZTHV_LES, LLES_CURRENT_CART_MASK, & - XLES_MEAN_Thv(:,NLES_CURRENT_TCOUNT,1) ) -! - IF (LUSERC) & - CALL LES_MEAN_ll ( ZTHL_LES, LLES_CURRENT_CART_MASK, & - XLES_MEAN_Thl(:,NLES_CURRENT_TCOUNT,1) ) -! - IF (LUSERC) & - CALL LES_MEAN_ll ( ZRT_LES, LLES_CURRENT_CART_MASK, & - XLES_MEAN_Rt(:,NLES_CURRENT_TCOUNT,1) ) -! - IF (LUSERV) & - CALL LES_MEAN_ll ( ZRV_LES, LLES_CURRENT_CART_MASK, & - XLES_MEAN_Rv(:,NLES_CURRENT_TCOUNT,1) ) -! - IF (LUSERV) & - CALL LES_MEAN_ll ( ZREHU_LES, LLES_CURRENT_CART_MASK, & - XLES_MEAN_Rehu(:,NLES_CURRENT_TCOUNT,1) ) -! - IF (LUSERC) & - CALL LES_MEAN_ll ( ZRC_LES, LLES_CURRENT_CART_MASK, & - XLES_MEAN_Rc(:,NLES_CURRENT_TCOUNT,1) ) -! - IF (LUSERC) THEN - CALL LES_MEAN_ll ( ZINDCLD, LLES_CURRENT_CART_MASK, & - XLES_MEAN_INDCf(:,NLES_CURRENT_TCOUNT,1) ) - CALL LES_MEAN_ll ( ZINDCLD2, LLES_CURRENT_CART_MASK, & - XLES_MEAN_INDCf2(:,NLES_CURRENT_TCOUNT,1) ) - CALL LES_MEAN_ll ( ZCLDFR_LES, LLES_CURRENT_CART_MASK, & - XLES_MEAN_Cf(:,NLES_CURRENT_TCOUNT,1) ) -! -!* cf total - CALL LES_MEAN_ll( ZINDCLD2D, LLES_CURRENT_CART_MASK(:,:,1) , & - XLES_CFtot(NLES_CURRENT_TCOUNT) ) - CALL LES_MEAN_ll( ZINDCLD2D2, LLES_CURRENT_CART_MASK(:,:,1), & - XLES_CF2tot(NLES_CURRENT_TCOUNT) ) - ENDIF -! - IF (LUSERR) THEN - - CALL LES_MEAN_ll ( XINPRR, LLES_CURRENT_CART_MASK(:,:,1), & - XLES_INPRR(NLES_CURRENT_TCOUNT) ) - ZINPRRm=0. - ZCOUNT=0. - ZINDCLD2D(:,:)=0. - DO JJ=1,IJU - DO JI=1,IIU - IF (ZRR_LES(JI,JJ,1) .GT. 1.E-6) ZINPRRm = ZINPRRm+XINPRR(JI,JJ) - IF (ZRR_LES(JI,JJ,1) .GT. 1.E-6) ZINDCLD2D(JI,JJ)=1. - IF (ZRR_LES(JI,JJ,1) .GT. 1.E-6) ZCOUNT=ZCOUNT+1. - END DO - END DO - IF (ZCOUNT .GE. 1) ZINPRRm=ZINPRRm/ZCOUNT - XLES_RAIN_INPRR(NLES_CURRENT_TCOUNT)=ZINPRRm - CALL LES_MEAN_ll ( ZINDCLD2D, LLES_CURRENT_CART_MASK(:,:,1), & - XLES_PRECFR(NLES_CURRENT_TCOUNT) ) - CALL LES_MEAN_ll ( ZINPRR3D_LES, LLES_CURRENT_CART_MASK, & - XLES_INPRR3D(:,NLES_CURRENT_TCOUNT,1) ) - CALL LES_MEAN_ll ( ZEVAP3D_LES, LLES_CURRENT_CART_MASK, & - XLES_EVAP3D(:,NLES_CURRENT_TCOUNT,1) ) - DO JK=1,NLES_K - CHAMPXY1(:,:,1)=ZINPRR3D_LES(:,:,JK) - XLES_MAX_INPRR3D(JK,NLES_CURRENT_TCOUNT,1)=MAX_ll (CHAMPXY1,IINFO_ll, & - IIA_ll,IJA_ll,1,IIU_ll,IJU_ll,1) - END DO -! - -! conversion de m/s en mm/day - XLES_RAIN_INPRR(NLES_CURRENT_TCOUNT)=XLES_RAIN_INPRR(NLES_CURRENT_TCOUNT)*3.6E6*24. - XLES_INPRR(NLES_CURRENT_TCOUNT)=XLES_INPRR(NLES_CURRENT_TCOUNT)*3.6E6*24. - - CALL LES_MEAN_ll ( XACPRR, LLES_CURRENT_CART_MASK(:,:,1), & - XLES_ACPRR(NLES_CURRENT_TCOUNT) ) -! conversion de m en mm - XLES_ACPRR(NLES_CURRENT_TCOUNT)=XLES_ACPRR(NLES_CURRENT_TCOUNT)*1000. - CALL LES_MEAN_ll ( ZRAINFR_LES, LLES_CURRENT_CART_MASK, & - XLES_MEAN_RF(:,NLES_CURRENT_TCOUNT,1) ) - - ENDIF -! - IF (LUSERC ) THEN - IF (( CCLOUD(1:3) == 'ICE' .AND.LSEDIC) .OR. & - ((CCLOUD=='C2R2' .OR. CCLOUD=='C3R5' .OR. CCLOUD=='KHKO').AND.LSEDC) .OR. & - ( CCLOUD=='LIMA' .AND.MSEDC)) THEN - CALL LES_MEAN_ll ( XINPRC, LLES_CURRENT_CART_MASK(:,:,1), & - XLES_INPRC(NLES_CURRENT_TCOUNT) ) -! conversion from m/s to mm/day - XLES_INPRC(NLES_CURRENT_TCOUNT)=XLES_INPRC(NLES_CURRENT_TCOUNT)*3.6E6*24. - ENDIF - IF ( (((CCLOUD == 'KHKO') .OR.(CCLOUD == 'C2R2')) .AND. LDEPOC) & - .OR. ( (CCLOUD(1:3) == 'ICE') .AND. LDEPOSC) ) THEN - CALL LES_MEAN_ll ( XINDEP, LLES_CURRENT_CART_MASK(:,:,1), & - XLES_INDEP(NLES_CURRENT_TCOUNT) ) -! conversion from m/s to mm/day - XLES_INDEP(NLES_CURRENT_TCOUNT)=XLES_INDEP(NLES_CURRENT_TCOUNT)*3.6E6*24. - ENDIF - ENDIF -! - IF (LUSERR) & - CALL LES_MEAN_ll ( ZRR_LES, LLES_CURRENT_CART_MASK, & - XLES_MEAN_Rr(:,NLES_CURRENT_TCOUNT,1) ) -! - IF (LUSERI) & - CALL LES_MEAN_ll ( ZRI_LES, LLES_CURRENT_CART_MASK, & - XLES_MEAN_Ri(:,NLES_CURRENT_TCOUNT,1) ) - CALL LES_MEAN_ll ( ZICEFR_LES, LLES_CURRENT_CART_MASK, & - XLES_MEAN_If(:,NLES_CURRENT_TCOUNT,1) ) -! - IF (LUSERS) & - CALL LES_MEAN_ll ( ZRS_LES, LLES_CURRENT_CART_MASK, & - XLES_MEAN_Rs(:,NLES_CURRENT_TCOUNT,1) ) -! - IF (LUSERG) & - CALL LES_MEAN_ll ( ZRG_LES, LLES_CURRENT_CART_MASK, & - XLES_MEAN_Rg(:,NLES_CURRENT_TCOUNT,1) ) -! - IF (LUSERH) & - CALL LES_MEAN_ll ( ZRH_LES, LLES_CURRENT_CART_MASK, & - XLES_MEAN_Rh(:,NLES_CURRENT_TCOUNT,1) ) -! - DO JSV=1,NSV - CALL LES_MEAN_ll ( ZSV_LES(:,:,:,JSV), LLES_CURRENT_CART_MASK, & - XLES_MEAN_Sv(:,NLES_CURRENT_TCOUNT,1,JSV) ) - END DO -! - CALL LES_MEAN_ll ( ZDPDZ_LES, LLES_CURRENT_CART_MASK, & - ZMEAN_DPDZ(:) ) - CALL LES_MEAN_ll ( ZDTHDZ_LES, LLES_CURRENT_CART_MASK, & - ZLES_MEAN_DTHDZ(:) ) - -! -!* build the 3D resolved turbulent fields by removing the mean field -! -DO JJ=1,IJU - DO JI=1,IIU - ZP_ANOM(JI,JJ,:) = ZP_LES(JI,JJ,:) - XLES_MEAN_P(:,NLES_CURRENT_TCOUNT,1) - ZDPDZ_ANOM(JI,JJ,:) = ZDPDZ_LES(JI,JJ,:) - ZMEAN_DPDZ(:) - ZTH_ANOM(JI,JJ,:) = ZTH_LES(JI,JJ,:) - XLES_MEAN_Th(:,NLES_CURRENT_TCOUNT,1) - ZRHO_ANOM(JI,JJ,:) = ZRHO_LES(JI,JJ,:) - XLES_MEAN_Rho(:,NLES_CURRENT_TCOUNT,1) - IF (LUSERV) THEN - ZTHV_ANOM(JI,JJ,:) = ZTHV_LES(JI,JJ,:) - XLES_MEAN_Thv(:,NLES_CURRENT_TCOUNT,1) - ZRV_ANOM(JI,JJ,:) = ZRV_LES(JI,JJ,:) - XLES_MEAN_Rv(:,NLES_CURRENT_TCOUNT,1) - END IF - IF (LUSERC) THEN - ZRC_ANOM(JI,JJ,:) = ZRC_LES(JI,JJ,:) - XLES_MEAN_Rc(:,NLES_CURRENT_TCOUNT,1) - ZLWP_ANOM(JI,JJ) =ZLWP_LES(JI,JJ)-XLES_LWP(NLES_CURRENT_TCOUNT) - END IF - IF (LUSERI) THEN - ZRI_ANOM(JI,JJ,:) = ZRI_LES(JI,JJ,:) - XLES_MEAN_Ri(:,NLES_CURRENT_TCOUNT,1) - END IF - IF (LUSERR) THEN - ZRR_ANOM(JI,JJ,:) = ZRR_LES(JI,JJ,:) - XLES_MEAN_Rr(:,NLES_CURRENT_TCOUNT,1) - END IF - END DO -END DO -! -! -!-------------------------------------------------------------------------------- -! -!* vertical grid computed at first LES call for this model -! -IF (NLES_CURRENT_TCOUNT==1) THEN - ALLOCATE(ZZ_LES (IIU,IJU,NLES_K)) - CALL LES_VER_INT( MZF(XZZ) ,ZZ_LES ) - CALL LES_MEAN_ll ( ZZ_LES, LLES_CURRENT_CART_MASK, XLES_Z ) - DEALLOCATE(ZZ_LES) - CALL LES_MEAN_ll ( XZS, LLES_CURRENT_CART_MASK(:,:,1), XLES_ZS ) -END IF -! -!------------------------------------------------------------------------------- -! -!* 3. Vertical interpolations to SECTRA computations vertical grid -! ------------------------------------------------------------ -! -!* note that velocity fields are previously localized on the MASS points -! -CALL SPEC_VER_INT(IMI, MXF(XUT) ,ZU_SPEC ) -CALL SPEC_VER_INT(IMI, MYF(XVT) ,ZV_SPEC ) -CALL SPEC_VER_INT(IMI, MZF(XWT) ,ZW_SPEC ) -CALL SPEC_VER_INT(IMI, XTHT ,ZTH_SPEC ) -IF (LUSERC) CALL SPEC_VER_INT(IMI, ZTHL ,ZTHL_SPEC) -IRR = 0 -IF (LUSERV) THEN - IRR = IRR + 1 - CALL SPEC_VER_INT(IMI, XRT(:,:,:,IRR) ,ZRV_SPEC ) -END IF -IF (LUSERC) THEN - IRR = IRR + 1 - CALL SPEC_VER_INT(IMI, XRT(:,:,:,IRR) ,ZRC_SPEC ) -END IF -IF (LUSERR) THEN - IRR = IRR + 1 -END IF -IF (LUSERI) THEN - IRR = IRR + 1 - CALL SPEC_VER_INT(IMI, XRT(:,:,:,IRR) ,ZRI_SPEC ) -END IF -IF (NSV>0) THEN - DO JSV=1,NSV - CALL SPEC_VER_INT(IMI, XSVT(:,:,:,JSV), ZSV_SPEC(:,:,:,JSV) ) - END DO -END IF -! -!------------------------------------------------------------------------------- -! -!* 4. Call to LES computations on cartesian (sub-)domain -! -------------------------------------------------- -! -IMASK=1 -! -CALL LES(LLES_CURRENT_CART_MASK) -! -!------------------------------------------------------------------------------- -! -!* 5. Call to LES computations on nebulosity mask -! ------------------------------------------- -! -IF (LLES_NEB_MASK) THEN - IMASK=IMASK+1 - CALL LES(LLES_CURRENT_NEB_MASK .AND. LLES_CURRENT_CART_MASK) -! - IMASK=IMASK+1 - CALL LES((.NOT. LLES_CURRENT_NEB_MASK) .AND. LLES_CURRENT_CART_MASK) -END IF -! -!------------------------------------------------------------------------------- -! -!* 6. Call to LES computations on cloud core mask -! ------------------------------------------- -! -IF (LLES_CORE_MASK) THEN - IMASK=IMASK+1 - CALL LES(LLES_CURRENT_CORE_MASK .AND. LLES_CURRENT_CART_MASK) -! - IMASK=IMASK+1 - CALL LES((.NOT. LLES_CURRENT_CORE_MASK) .AND. LLES_CURRENT_CART_MASK) -END IF -! -!------------------------------------------------------------------------------- -! -!* 7. Call to LES computations on user mask -! ------------------------------------- -! -IF (LLES_MY_MASK) THEN - DO JI=1,NLES_MASKS_USER - IMASK=IMASK+1 - CALL LES(LLES_CURRENT_MY_MASKS(:,:,:,JI)) - END DO -END IF -! -!------------------------------------------------------------------------------- -! -!* 7b. Call to LES computations on conditional sampling mask -! ----------------------------------------------------- -! -IF (LLES_CS_MASK) THEN - IMASK=IMASK+1 - CALL LES(LLES_CURRENT_CS1_MASK) - IMASK=IMASK+1 - CALL LES(LLES_CURRENT_CS2_MASK) - IMASK=IMASK+1 - CALL LES(LLES_CURRENT_CS3_MASK) -END IF -! -!------------------------------------------------------------------------------- -! -!* 8. budgets -! ------- -! -!* 8.1 tendencies -! ---------- -! -! -!* 8.2 dynamical production, transport and mean advection -! -------------------------------------------------- -! -ALLOCATE(ZLES_MEAN_DRtDZ(NLES_K)) -ALLOCATE(ZLES_MEAN_DSVDZ(NLES_K,NSV)) -! -IF (LUSERV) THEN - ZLES_MEAN_DRtDZ(:) = XLES_MEAN_DRtDZ(:,NLES_CURRENT_TCOUNT,1) -ELSE - ZLES_MEAN_DRtDZ(:) = XUNDEF -END IF -! -ZLES_MEAN_DSVDZ = 0. -DO JSV=1,NSV - ZLES_MEAN_DSvDZ(:,JSV) = XLES_MEAN_DSvDZ(:,NLES_CURRENT_TCOUNT,1,JSV) -END DO -! -CALL LES_RES_TR(LUSERV, & - XLES_MEAN_DUDZ(:,NLES_CURRENT_TCOUNT,1), & - XLES_MEAN_DVDZ(:,NLES_CURRENT_TCOUNT,1), & - XLES_MEAN_DWDZ(:,NLES_CURRENT_TCOUNT,1), & - XLES_MEAN_DThlDZ(:,NLES_CURRENT_TCOUNT,1), & - ZLES_MEAN_DRtDZ(:), & - ZLES_MEAN_DSvDZ(:,:) ) -! -DEALLOCATE(ZLES_MEAN_DRtDZ) -DEALLOCATE(ZLES_MEAN_DSVDZ) -! -CALL LES_BUDGET_TEND_n -!* 8.3 end of LES budgets computations -! ------------------------------- -! -DO JLOOP=1,NLES_TOT - XLES_BU_RES_KE (:,NLES_CURRENT_TCOUNT,JLOOP) = X_LES_BU_RES_KE (:,JLOOP) - XLES_BU_RES_WThl (:,NLES_CURRENT_TCOUNT,JLOOP) = X_LES_BU_RES_WThl (:,JLOOP) - XLES_BU_RES_Thl2 (:,NLES_CURRENT_TCOUNT,JLOOP) = X_LES_BU_RES_Thl2 (:,JLOOP) - XLES_BU_SBG_Tke (:,NLES_CURRENT_TCOUNT,JLOOP) = X_LES_BU_SBG_Tke (:,JLOOP) - IF (LUSERV) THEN - XLES_BU_RES_WRt (:,NLES_CURRENT_TCOUNT,JLOOP) = X_LES_BU_RES_WRt (:,JLOOP) - XLES_BU_RES_Rt2 (:,NLES_CURRENT_TCOUNT,JLOOP) = X_LES_BU_RES_Rt2 (:,JLOOP) - XLES_BU_RES_ThlRt(:,NLES_CURRENT_TCOUNT,JLOOP) = X_LES_BU_RES_ThlRt(:,JLOOP) - END IF - DO JSV=1,NSV - XLES_BU_RES_Sv2 (:,NLES_CURRENT_TCOUNT,JLOOP,JSV) = X_LES_BU_RES_Sv2 (:,JLOOP,JSV) - XLES_BU_RES_WSv (:,NLES_CURRENT_TCOUNT,JLOOP,JSV) = X_LES_BU_RES_WSv (:,JLOOP,JSV) - END DO -END DO -! -!------------------------------------------------------------------------------- -! -!* 9. Deallocations -! ------------- -! -!* 9.1 local variables -! --------------- -! -DEALLOCATE(ZEXN ) -DEALLOCATE(ZTHL) -DEALLOCATE(ZRT ) -DEALLOCATE(ZTHV ) -DEALLOCATE(ZRHO ) -DEALLOCATE(ZEW ) - -DEALLOCATE(ZINDCLD ) -DEALLOCATE(ZINDCLD2 ) -DEALLOCATE(ZINDCLD2D ) -DEALLOCATE(ZINDCLD2D2) -DEALLOCATE(ZCLDFR_LES) -DEALLOCATE(ZICEFR_LES) -DEALLOCATE(ZRAINFR_LES) -DEALLOCATE(ZMASSF ) -DEALLOCATE(ZTEMP ) -DEALLOCATE(ZREHU ) -DEALLOCATE(CHAMPXY1 ) -! -DEALLOCATE(ZU_LES) -DEALLOCATE(ZV_LES) -DEALLOCATE(ZW_LES) -DEALLOCATE(ZTHL_LES) -DEALLOCATE(ZRT_LES) -DEALLOCATE(ZSV_LES) -DEALLOCATE(ZP_LES ) -DEALLOCATE(ZDP_LES ) -DEALLOCATE(ZTP_LES ) -DEALLOCATE(ZTR_LES ) -DEALLOCATE(ZDISS_LES ) -DEALLOCATE(ZLM_LES ) -DEALLOCATE(ZDPDZ_LES) -DEALLOCATE(ZLWP_ANOM) -DEALLOCATE(ZWORK2D) -DEALLOCATE(ZWORK1D) -DEALLOCATE(ZWORK1DT) -DEALLOCATE(ZMAXWRR2D) -DEALLOCATE(ZDTHLDZ_LES) -DEALLOCATE(ZDTHDZ_LES) -DEALLOCATE(ZDRTDZ_LES) -DEALLOCATE(ZDSVDZ_LES) -DEALLOCATE(ZDUDZ_LES) -DEALLOCATE(ZDVDZ_LES) -DEALLOCATE(ZDWDZ_LES) -DEALLOCATE(ZRHO_LES ) -DEALLOCATE(ZEXN_LES ) -DEALLOCATE(ZTH_LES ) -DEALLOCATE(ZMF_LES ) -DEALLOCATE(ZTHV_LES ) -DEALLOCATE(ZTKE_LES ) -DEALLOCATE(ZKE_LES ) -DEALLOCATE(ZTKET_LES) -DEALLOCATE(ZRV_LES ) -DEALLOCATE(ZREHU_LES ) -DEALLOCATE(ZRC_LES ) -DEALLOCATE(ZRR_LES ) -DEALLOCATE(ZZZ_LES) -DEALLOCATE(ZLWP_LES ) -DEALLOCATE(ZRWP_LES ) -DEALLOCATE(ZIWP_LES ) -DEALLOCATE(ZSWP_LES ) -DEALLOCATE(ZGWP_LES ) -DEALLOCATE(ZHWP_LES ) -DEALLOCATE(ZINPRR3D_LES) -DEALLOCATE(ZEVAP3D_LES) -DEALLOCATE(ZRI_LES ) -DEALLOCATE(ZRS_LES ) -DEALLOCATE(ZRG_LES ) -DEALLOCATE(ZRH_LES ) -DEALLOCATE(ZP_ANOM ) -DEALLOCATE(ZRHO_ANOM) -DEALLOCATE(ZTH_ANOM ) -DEALLOCATE(ZTHV_ANOM) -DEALLOCATE(ZRV_ANOM ) -DEALLOCATE(ZRC_ANOM ) -DEALLOCATE(ZRI_ANOM ) -DEALLOCATE(ZRR_ANOM ) -DEALLOCATE(ZDPDZ_ANOM) -DEALLOCATE(ZMEAN_DPDZ) -DEALLOCATE(ZLES_MEAN_DTHDZ) -! -DEALLOCATE(ZU_SPEC ) -DEALLOCATE(ZV_SPEC ) -DEALLOCATE(ZW_SPEC ) -DEALLOCATE(ZTH_SPEC ) -DEALLOCATE(ZTHL_SPEC ) -DEALLOCATE(ZRV_SPEC ) -DEALLOCATE(ZRC_SPEC ) -DEALLOCATE(ZRI_SPEC ) -DEALLOCATE(ZSV_SPEC ) -! -DEALLOCATE(ZRADEFF_LES ) -DEALLOCATE(ZSWU_LES ) -DEALLOCATE(ZSWD_LES ) -DEALLOCATE(ZLWD_LES ) -DEALLOCATE(ZLWU_LES ) -DEALLOCATE(ZDTHRADSW_LES ) -DEALLOCATE(ZDTHRADLW_LES ) -! -!* 9.2 current time-step LES masks (in MODD_LES) -! --------------------------- -! -CALL LES_DEALLOCATE('LLES_CURRENT_CART_MASK') -IF (LLES_NEB_MASK) CALL LES_DEALLOCATE('LLES_CURRENT_NEB_MASK') -IF (LLES_CORE_MASK) CALL LES_DEALLOCATE('LLES_CURRENT_CORE_MASK') -IF (LLES_MY_MASK) THEN - CALL LES_DEALLOCATE('LLES_CURRENT_MY_MASKS') -END IF -IF (LLES_CS_MASK) THEN - CALL LES_DEALLOCATE('LLES_CURRENT_CS1_MASK') - IF (NSV_CS >= 2) CALL LES_DEALLOCATE('LLES_CURRENT_CS2_MASK') - IF (NSV_CS == 3) CALL LES_DEALLOCATE('LLES_CURRENT_CS3_MASK') -END IF -! -! -!* 9.3 variables in MODD_LES_BUDGET -! ---------------------------- -! - -DEALLOCATE(XU_ANOM ) -DEALLOCATE(XV_ANOM ) -DEALLOCATE(XW_ANOM ) -DEALLOCATE(XTHL_ANOM) -DEALLOCATE(XRT_ANOM ) -DEALLOCATE(XSV_ANOM ) -! -DEALLOCATE(XCURRENT_L_O_EXN_CP) -DEALLOCATE(XCURRENT_RHODJ ) -! -DEALLOCATE(XCURRENT_RUS ) -DEALLOCATE(XCURRENT_RVS ) -DEALLOCATE(XCURRENT_RWS ) -DEALLOCATE(XCURRENT_RTHS ) -DEALLOCATE(XCURRENT_RTKES) -DEALLOCATE(XCURRENT_RRS ) -DEALLOCATE(XCURRENT_RSVS ) -DEALLOCATE(XCURRENT_RTHLS) -DEALLOCATE(XCURRENT_RRTS ) - -DEALLOCATE(X_LES_BU_RES_KE ) -DEALLOCATE(X_LES_BU_RES_WThl ) -DEALLOCATE(X_LES_BU_RES_Thl2 ) -DEALLOCATE(X_LES_BU_RES_WRt ) -DEALLOCATE(X_LES_BU_RES_Rt2 ) -DEALLOCATE(X_LES_BU_RES_ThlRt) -DEALLOCATE(X_LES_BU_RES_Sv2 ) -DEALLOCATE(X_LES_BU_RES_WSv ) -DEALLOCATE(X_LES_BU_SBG_TKE ) -!------------------------------------------------------------------------------- -! -!* 10. end of LES computations for this time-step -! ------------------------------------------ -! -LLES_CALL=.FALSE. -CALL BUDGET_FLAGS(LUSERV, LUSERC, LUSERR, & - LUSERI, LUSERS, LUSERG, LUSERH ) -! -!------------------------------------------------------------------------------- -! -CONTAINS -! -! ########################################################################## - SUBROUTINE LES(OMASK) -! ########################################################################## -! -! -!!**** *LES* computes the current time-step LES diagnostics for one mask. -!! -!! -!! PURPOSE -!! ------- -!! -!! EXTERNAL -!! -------- -!! -!! IMPLICIT ARGUMENTS -!! ------------------ -!! -!! REFERENCE -!! --------- -!! -!! AUTHOR -!! ------ -!! V. Masson -!! -!! MODIFICATIONS -!! ------------- -!! Original 07/02/00 -!! -!! -------------------------------------------------------------------------- -! -!* 0. DECLARATIONS -! ------------ -! -USE MODD_PARAMETERS -! -USE MODI_LES_FLUX_ll -USE MODI_LES_3RD_MOMENT_ll -USE MODI_LES_4TH_MOMENT_ll -USE MODI_LES_MEAN_1PROC -USE MODI_LES_MEAN_MPROC -USE MODI_LES_PDF_ll -! -USE MODI_LES_HOR_CORR -! -IMPLICIT NONE -! -! -!* 0.1 declarations of arguments -! -LOGICAL, DIMENSION(:,:,:), INTENT(IN) :: OMASK ! 2D mask for computations -! -! -! -! 0.2 declaration of local variables -! -INTEGER :: JSV ! scalar variables counter -INTEGER :: JI -INTEGER :: JK ! vertical loop counter -INTEGER :: JPDF ! pdf counter -! -LOGICAL, DIMENSION(SIZE(ZW_LES,1),SIZE(ZW_LES,2),SIZE(ZW_LES,3)) :: GUPDRAFT_MASK -LOGICAL, DIMENSION(SIZE(ZW_LES,1),SIZE(ZW_LES,2),SIZE(ZW_LES,3)) :: GDOWNDRAFT_MASK -REAL, DIMENSION(SIZE(ZW_LES,1),SIZE(ZW_LES,2),SIZE(ZW_LES,3)) :: ZUPDRAFT -REAL, DIMENSION(SIZE(ZW_LES,1),SIZE(ZW_LES,2),SIZE(ZW_LES,3)) :: ZDOWNDRAFT -REAL, DIMENSION(SIZE(ZW_LES,1),SIZE(ZW_LES,2),SIZE(ZW_LES,3)) :: ZW_UP -REAL, DIMENSION(SIZE(ZW_LES,1),SIZE(ZW_LES,2),SIZE(ZW_LES,3)) :: ZWORK_LES -! -INTEGER, DIMENSION(SIZE(ZW_LES,3)) :: IAVG_PTS -INTEGER, DIMENSION(SIZE(ZW_LES,3)) :: IUND_PTS -REAL, DIMENSION(SIZE(ZW_LES,3)) :: ZAVG -! -REAL, DIMENSION(SIZE(ZW_LES,3)) :: ZLES_RESOLVED_U3 -REAL, DIMENSION(SIZE(ZW_LES,3)) :: ZLES_RESOLVED_UV2 -REAL, DIMENSION(SIZE(ZW_LES,3)) :: ZLES_RESOLVED_UW2 -REAL, DIMENSION(SIZE(ZW_LES,3)) :: ZLES_RESOLVED_VU2 -REAL, DIMENSION(SIZE(ZW_LES,3)) :: ZLES_RESOLVED_V3 -REAL, DIMENSION(SIZE(ZW_LES,3)) :: ZLES_RESOLVED_VW2 -REAL, DIMENSION(SIZE(ZW_LES,3)) :: ZLES_RESOLVED_WU2 -REAL, DIMENSION(SIZE(ZW_LES,3)) :: ZLES_RESOLVED_WV2 -REAL, DIMENSION(SIZE(ZW_LES,3)) :: ZLES_UPDRAFT_U2 -REAL, DIMENSION(SIZE(ZW_LES,3)) :: ZLES_UPDRAFT_V2 -REAL, DIMENSION(SIZE(ZW_LES,3)) :: ZLES_UPDRAFT_W2 -REAL, DIMENSION(SIZE(ZW_LES,3)) :: ZLES_DOWNDRAFT_U2 -REAL, DIMENSION(SIZE(ZW_LES,3)) :: ZLES_DOWNDRAFT_V2 -REAL, DIMENSION(SIZE(ZW_LES,3)) :: ZLES_DOWNDRAFT_W2 -REAL, DIMENSION(SIZE(ZW_LES,3),NPDF) :: ZPDF -! -INTEGER, DIMENSION(1) :: IKMIN_FLUX ! vertical index of min. W'thl' -INTEGER, DIMENSION(1) :: IKMAX_TH !vertical index maxdth -INTEGER, DIMENSION(1) :: IKMAX_CF ! vertical index of max. Cf -! -REAL, DIMENSION(SIZE(ZW_LES,3)) :: ZKE_TOT ! total turbulent kinetic energy -REAL :: ZINT_KE_TOT! integral of KE_TOT -REAL :: ZINT_RHOKE! integral of RHO*KE -REAL :: ZFRIC_SURF ! surface friction -REAL, DIMENSION(SIZE(ZW_LES,3)) :: ZFRIC_LES ! friction at all LES levels -! -!------------------------------------------------------------------------------- -! -! 1. local diagnostics (for any mask type) -! ----------------- -! -! -! 1.2 Number of points used for averaging on current processor -! -------------------------------------------------------- -! -!* to be sure to be coherent with other computations, -! a field on LES vertical grid (and horizontal mass point grid) is used. -! This information is necessary for the subgrid fluxes computations, because -! half of the work is already done, but the number of averaging points was -! not kept. -! -CALL LES_MEAN_1PROC ( XW_ANOM, OMASK, & - ZAVG(:), & - IAVG_PTS(:), & - IUND_PTS(:) ) -! -! -! 1.3 Number of points used for averaging on all processor -! ---------------------------------------------------- -! -CALL LES_MEAN_ll ( XW_ANOM, OMASK, & - ZAVG(:), & - NLES_AVG_PTS_ll(:,NLES_CURRENT_TCOUNT,IMASK), & - NLES_UND_PTS_ll(:,NLES_CURRENT_TCOUNT,IMASK) ) -! -! -! 1.4 Mean quantities -! --------------- -! -IF (LLES_MEAN .AND. IMASK > 1) THEN -! -!* horizontal wind velocities -! - CALL LES_MEAN_ll ( ZU_LES, OMASK, & - XLES_MEAN_U(:,NLES_CURRENT_TCOUNT,IMASK) ) -! - CALL LES_MEAN_ll ( ZV_LES, OMASK, & - XLES_MEAN_V(:,NLES_CURRENT_TCOUNT,IMASK) ) -! -!* vertical wind velocity -! - CALL LES_MEAN_ll ( ZW_LES, OMASK, & - XLES_MEAN_W(:,NLES_CURRENT_TCOUNT,IMASK) ) -! -!* pressure -! - CALL LES_MEAN_ll ( ZP_LES, OMASK, & - XLES_MEAN_P(:,NLES_CURRENT_TCOUNT,IMASK) ) -! -!* dynamical production TKE -! - CALL LES_MEAN_ll ( ZDP_LES, OMASK, & - XLES_MEAN_DP(:,NLES_CURRENT_TCOUNT,IMASK) ) -! -!* thermal production TKE -! - CALL LES_MEAN_ll ( ZTP_LES, OMASK, & - XLES_MEAN_TP(:,NLES_CURRENT_TCOUNT,IMASK) ) -! -!* transport TKE -! - CALL LES_MEAN_ll ( ZTR_LES, OMASK, & - XLES_MEAN_TR(:,NLES_CURRENT_TCOUNT,IMASK) ) -! -!* dissipation TKE -! - CALL LES_MEAN_ll ( ZDISS_LES, OMASK, & - XLES_MEAN_DISS(:,NLES_CURRENT_TCOUNT,IMASK) ) -! -!* mixing length -! - CALL LES_MEAN_ll ( ZLM_LES, OMASK, & - XLES_MEAN_LM(:,NLES_CURRENT_TCOUNT,IMASK) ) -! -!* density -! - CALL LES_MEAN_ll ( ZRHO_LES, OMASK, & - XLES_MEAN_RHO(:,NLES_CURRENT_TCOUNT,IMASK) ) -! -! -!* potential temperature -! - CALL LES_MEAN_ll ( ZTH_LES, OMASK, & - XLES_MEAN_Th(:,NLES_CURRENT_TCOUNT,IMASK) ) -! -!* mass flux - CALL LES_MEAN_ll ( ZMF_LES, OMASK, & - XLES_MEAN_Mf(:,NLES_CURRENT_TCOUNT,IMASK) ) -! -! -!* virtual potential temperature -! - IF (LUSERV) & - CALL LES_MEAN_ll ( ZTHV_LES, OMASK, & - XLES_MEAN_Thv(:,NLES_CURRENT_TCOUNT,IMASK) ) -! -!* liquid potential temperature -! - IF (LUSERC) THEN - CALL LES_MEAN_ll ( ZTHL_LES, OMASK, & - XLES_MEAN_Thl(:,NLES_CURRENT_TCOUNT,IMASK) ) - END IF -! -!* vapor mixing ratio -! - IF (LUSERV) THEN - CALL LES_MEAN_ll ( ZRV_LES, OMASK, & - XLES_MEAN_Rv(:,NLES_CURRENT_TCOUNT,IMASK) ) - END IF -! -!*relative humidity -! - IF (LUSERV) THEN - CALL LES_MEAN_ll ( ZREHU_LES, OMASK, & - XLES_MEAN_Rehu(:,NLES_CURRENT_TCOUNT,IMASK) ) - END IF -! -!* cloud mixing ratio -! - IF (LUSERC) THEN - CALL LES_MEAN_ll ( ZRC_LES, OMASK, & - XLES_MEAN_Rc(:,NLES_CURRENT_TCOUNT,IMASK) ) - CALL LES_MEAN_ll ( ZRT_LES, OMASK, & - XLES_MEAN_Rt(:,NLES_CURRENT_TCOUNT,IMASK) ) - END IF -! -!* rain mixing ratio -! - IF (LUSERR) THEN - CALL LES_MEAN_ll ( ZRR_LES, OMASK, & - XLES_MEAN_Rr(:,NLES_CURRENT_TCOUNT,IMASK) ) - END IF -! -!* ice mixing ratio -! - IF (LUSERI) THEN - CALL LES_MEAN_ll ( ZRI_LES, OMASK, & - XLES_MEAN_Ri(:,NLES_CURRENT_TCOUNT,IMASK) ) - END IF -! -!* snow mixing ratio -! - IF (LUSERS) THEN - CALL LES_MEAN_ll ( ZRS_LES, OMASK, & - XLES_MEAN_Rs(:,NLES_CURRENT_TCOUNT,IMASK) ) - END IF -! -!* graupel mixing ratio -! - IF (LUSERG) THEN - CALL LES_MEAN_ll ( ZRG_LES, OMASK, & - XLES_MEAN_Rg(:,NLES_CURRENT_TCOUNT,IMASK) ) - END IF -! -!* hail mixing ratio -! - IF (LUSERH) THEN - CALL LES_MEAN_ll ( ZRH_LES, OMASK, & - XLES_MEAN_Rh(:,NLES_CURRENT_TCOUNT,IMASK) ) - END IF -! -!* scalar variables mixing ratio -! - DO JSV=1,NSV - CALL LES_MEAN_ll ( ZSV_LES(:,:,:,JSV), OMASK, & - XLES_MEAN_Sv(:,NLES_CURRENT_TCOUNT,IMASK,JSV) ) - END DO -END IF -! -!* wind modulus -! -IF (LLES_MEAN) THEN -! - ZWORK_LES =SQRT( ZU_LES**2 +ZV_LES**2 ) - CALL LES_MEAN_ll ( ZWORK_LES, OMASK, & - XLES_MEAN_WIND(:,NLES_CURRENT_TCOUNT,IMASK) ) -! -!* vertical speed larger than mean vertical speed (updraft) -! - DO JK=1,NLES_K - ZW_UP(:,:,JK) = MAX(ZW_LES(:,:,JK), XLES_MEAN_W(JK,NLES_CURRENT_TCOUNT,IMASK)) - END DO -! -!* upward mass flux -! - ZWORK_LES = ZW_UP * ZRHO_LES - CALL LES_MEAN_ll ( ZWORK_LES, OMASK, & - XLES_RESOLVED_MASSFX(:,NLES_CURRENT_TCOUNT,IMASK) ) -! -!* pdf calculation -! - IF (LLES_PDF) THEN - CALL LES_PDF_ll ( ZTH_LES,OMASK,XTH_PDF_MIN,XTH_PDF_MAX, & - ZPDF(:,:) ) - DO JSV=1,NPDF - XLES_PDF_TH(:,NLES_CURRENT_TCOUNT,IMASK,JSV)=ZPDF(:,JSV) - END DO - - CALL LES_PDF_ll ( ZW_LES,OMASK,XW_PDF_MIN,XW_PDF_MAX, & - ZPDF(:,:) ) - DO JSV=1,NPDF - XLES_PDF_W(:,NLES_CURRENT_TCOUNT,IMASK,JSV)=ZPDF(:,JSV) - END DO - CALL LES_PDF_ll ( ZTHV_LES,OMASK,XTHV_PDF_MIN,XTHV_PDF_MAX, & - ZPDF(:,:) ) - DO JSV=1,NPDF - XLES_PDF_THV(:,NLES_CURRENT_TCOUNT,IMASK,JSV)=ZPDF(:,JSV) - END DO - IF (LUSERV) THEN - CALL LES_PDF_ll ( ZRV_LES,OMASK,XRV_PDF_MIN,XRV_PDF_MAX, & - ZPDF(:,:) ) - DO JSV=1,NPDF - XLES_PDF_RV(:,NLES_CURRENT_TCOUNT,IMASK,JSV)=ZPDF(:,JSV) - END DO - END IF - IF (LUSERC) THEN - CALL LES_PDF_ll ( ZRC_LES,OMASK,XRC_PDF_MIN,XRC_PDF_MAX, & - ZPDF(:,:) ) - DO JSV=1,NPDF - XLES_PDF_RC(:,NLES_CURRENT_TCOUNT,IMASK,JSV)=ZPDF(:,JSV) - END DO - CALL LES_PDF_ll ( ZRT_LES,OMASK,XRT_PDF_MIN,XRT_PDF_MAX, & - ZPDF(:,:) ) - DO JSV=1,NPDF - XLES_PDF_RT(:,NLES_CURRENT_TCOUNT,IMASK,JSV)=ZPDF(:,JSV) - END DO - CALL LES_PDF_ll ( ZTHL_LES,OMASK,XTHL_PDF_MIN,XTHL_PDF_MAX, & - ZPDF(:,:) ) - DO JSV=1,NPDF - XLES_PDF_THL(:,NLES_CURRENT_TCOUNT,IMASK,JSV)=ZPDF(:,JSV) - END DO - END IF - IF (LUSERR) THEN - CALL LES_PDF_ll ( ZRR_LES,OMASK,XRR_PDF_MIN,XRR_PDF_MAX, & - ZPDF(:,:) ) - DO JSV=1,NPDF - XLES_PDF_RR(:,NLES_CURRENT_TCOUNT,IMASK,JSV)=ZPDF(:,JSV) - END DO - END IF - IF (LUSERI) THEN - CALL LES_PDF_ll ( ZRI_LES,OMASK,XRI_PDF_MIN,XRI_PDF_MAX, & - ZPDF(:,:) ) - DO JSV=1,NPDF - XLES_PDF_RI(:,NLES_CURRENT_TCOUNT,IMASK,JSV)=ZPDF(:,JSV) - END DO - END IF - IF (LUSERS) THEN - CALL LES_PDF_ll ( ZRS_LES,OMASK,XRS_PDF_MIN,XRS_PDF_MAX, & - ZPDF(:,:) ) - DO JSV=1,NPDF - XLES_PDF_RS(:,NLES_CURRENT_TCOUNT,IMASK,JSV)=ZPDF(:,JSV) - END DO - END IF - IF (LUSERG) THEN - CALL LES_PDF_ll ( ZRG_LES,OMASK,XRG_PDF_MIN,XRG_PDF_MAX, & - ZPDF(:,:) ) - DO JSV=1,NPDF - XLES_PDF_RG(:,NLES_CURRENT_TCOUNT,IMASK,JSV)=ZPDF(:,JSV) - END DO - END IF - END IF -! -!* mean vertical gradients -! - CALL LES_MEAN_ll ( ZDTHLDZ_LES, OMASK, XLES_MEAN_DTHLDZ(:,NLES_CURRENT_TCOUNT,IMASK) ) - CALL LES_MEAN_ll ( ZDUDZ_LES, OMASK, XLES_MEAN_DUDZ(:,NLES_CURRENT_TCOUNT,IMASK) ) - CALL LES_MEAN_ll ( ZDVDZ_LES, OMASK, XLES_MEAN_DVDZ(:,NLES_CURRENT_TCOUNT,IMASK) ) - CALL LES_MEAN_ll ( ZDWDZ_LES, OMASK, XLES_MEAN_DWDZ(:,NLES_CURRENT_TCOUNT,IMASK) ) - IF (LUSERV) CALL LES_MEAN_ll ( ZDRtDZ_LES, OMASK, XLES_MEAN_DRtDZ(:,NLES_CURRENT_TCOUNT,IMASK) ) - DO JSV=1,NSV - CALL LES_MEAN_ll ( ZDSVDZ_LES(:,:,:,JSV), OMASK, XLES_MEAN_DSVDZ(:,NLES_CURRENT_TCOUNT,IMASK,JSV) ) - END DO - -END IF -!------------------------------------------------------------------------------- -! -! 1.5 Resolved quantities -! ------------------- -! -!* horizontal wind variances -! - CALL LES_FLUX_ll ( XU_ANOM, XU_ANOM, & - OMASK, & - XLES_RESOLVED_U2 (:,NLES_CURRENT_TCOUNT,IMASK) ) -! - CALL LES_FLUX_ll ( XV_ANOM, XV_ANOM, & - OMASK, & - XLES_RESOLVED_V2 (:,NLES_CURRENT_TCOUNT,IMASK) ) -! -!* vertical wind variance -! - CALL LES_FLUX_ll ( XW_ANOM, XW_ANOM, & - OMASK, & - XLES_RESOLVED_W2 (:,NLES_CURRENT_TCOUNT,IMASK) ) -! -!* pressure variance -! - CALL LES_FLUX_ll ( ZP_ANOM, ZP_ANOM, & - OMASK, & - XLES_RESOLVED_P2 (:,NLES_CURRENT_TCOUNT,IMASK) ) -! -!* potential temperature variance -! - CALL LES_FLUX_ll ( ZTH_ANOM, ZTH_ANOM, & - OMASK, & - XLES_RESOLVED_TH2(:,NLES_CURRENT_TCOUNT,IMASK) ) - -! -!* resolved turbulent kinetic energy -! - XLES_RESOLVED_Ke(:,NLES_CURRENT_TCOUNT,IMASK) = XUNDEF -! - WHERE(XLES_RESOLVED_U2 (:,NLES_CURRENT_TCOUNT,IMASK) /= XUNDEF) & - XLES_RESOLVED_Ke(:,NLES_CURRENT_TCOUNT,IMASK) = 0.5*( & - XLES_RESOLVED_U2 (:,NLES_CURRENT_TCOUNT,IMASK) & - + XLES_RESOLVED_V2 (:,NLES_CURRENT_TCOUNT,IMASK) & - + XLES_RESOLVED_W2 (:,NLES_CURRENT_TCOUNT,IMASK)) -! -!* potential temperature - virtual potential temperature covariance -! - IF (LUSERV) THEN - CALL LES_FLUX_ll ( ZTH_ANOM, ZTHV_ANOM, & - OMASK, & - XLES_RESOLVED_THTHV(:,NLES_CURRENT_TCOUNT,IMASK) ) - -! -!* vapor mixing ratio variance -! - CALL LES_FLUX_ll ( ZRV_ANOM, ZRV_ANOM, & - OMASK, & - XLES_RESOLVED_Rv2(:,NLES_CURRENT_TCOUNT,IMASK) ) -! -! -!* potential temperature - vapor mixing ratio correlation -! - CALL LES_FLUX_ll ( ZTH_ANOM, ZRV_ANOM, & - OMASK, & - XLES_RESOLVED_ThRv(:,NLES_CURRENT_TCOUNT,IMASK) ) -! -!* virtual potential temperature - vapor mixing ratio correlation -! - CALL LES_FLUX_ll ( ZTHV_ANOM, ZRV_ANOM, & - OMASK, & - XLES_RESOLVED_ThvRv(:,NLES_CURRENT_TCOUNT,IMASK) ) - END IF -! -! -!* liquid potential temperature - virtual potential temperature covariance -! - IF (LUSERC) THEN - CALL LES_FLUX_ll ( XTHL_ANOM, ZTHV_ANOM, & - OMASK, & - XLES_RESOLVED_THLTHV(:,NLES_CURRENT_TCOUNT,IMASK) ) -! -!* liquid potential temperature variance -! - CALL LES_FLUX_ll ( XTHL_ANOM, XTHL_ANOM, & - OMASK, & - XLES_RESOLVED_THL2(:,NLES_CURRENT_TCOUNT,IMASK) ) -! -!* total water mixing ratio variance -! - CALL LES_FLUX_ll ( XRT_ANOM, XRT_ANOM, & - OMASK, & - XLES_RESOLVED_Rt2(:,NLES_CURRENT_TCOUNT,IMASK) ) -! -!* cloud mixing ratio variance -! - CALL LES_FLUX_ll ( ZRC_ANOM, ZRC_ANOM, & - OMASK, & - XLES_RESOLVED_Rc2(:,NLES_CURRENT_TCOUNT,IMASK) ) -! -!* potential temperature - cloud mixing ratio correlation -! - CALL LES_FLUX_ll ( ZTH_ANOM, ZRC_ANOM, & - OMASK, & - XLES_RESOLVED_ThRc(:,NLES_CURRENT_TCOUNT,IMASK) ) -! -!* liquid potential temperature - vapor mixing ratio correlation -! - CALL LES_FLUX_ll ( XTHL_ANOM, ZRV_ANOM, & - OMASK, & - XLES_RESOLVED_ThlRv(:,NLES_CURRENT_TCOUNT,IMASK) ) -! -!* liquid potential temperature - cloud mixing ratio correlation -! - CALL LES_FLUX_ll ( XTHL_ANOM, ZRC_ANOM, & - OMASK, & - XLES_RESOLVED_ThlRc(:,NLES_CURRENT_TCOUNT,IMASK) ) -! -!* virtual potential temperature - cloud mixing ratio correlation -! - CALL LES_FLUX_ll ( ZTHV_ANOM, ZRC_ANOM, & - OMASK, & - XLES_RESOLVED_ThvRc(:,NLES_CURRENT_TCOUNT,IMASK) ) -! -! variance of lwp -! - IF (IMASK .EQ. 1) THEN - CALL LES_FLUX_ll (ZLWP_ANOM, ZLWP_ANOM, & - OMASK(:,:,1), & - XLES_LWPVAR(NLES_CURRENT_TCOUNT) ) - END IF - END IF -! -!* ice mixing ratio variance -! - IF (LUSERI) THEN - CALL LES_FLUX_ll ( ZRI_ANOM, ZRI_ANOM, & - OMASK, & - XLES_RESOLVED_Ri2(:,NLES_CURRENT_TCOUNT,IMASK) ) -! -!* potential temperature - ice mixing ratio correlation -! - CALL LES_FLUX_ll ( ZTH_ANOM, ZRI_ANOM, & - OMASK, & - XLES_RESOLVED_ThRi(:,NLES_CURRENT_TCOUNT,IMASK) ) -! -!* liquid potential temperature - ice mixing ratio correlation -! - CALL LES_FLUX_ll ( XTHL_ANOM, ZRI_ANOM, & - OMASK, & - XLES_RESOLVED_ThlRi(:,NLES_CURRENT_TCOUNT,IMASK) ) -! -!* virtual potential temperature - ice mixing ratio correlation -! - CALL LES_FLUX_ll ( ZTHV_ANOM, ZRI_ANOM, & - OMASK, & - XLES_RESOLVED_ThvRi(:,NLES_CURRENT_TCOUNT,IMASK) ) - END IF -! -!* scalar variable mixing ratio variances -! - DO JSV=1,NSV - CALL LES_FLUX_ll ( XSV_ANOM(:,:,:,JSV), XSV_ANOM(:,:,:,JSV), & - OMASK, & - XLES_RESOLVED_Sv2(:,NLES_CURRENT_TCOUNT,IMASK,JSV) ) -! -!* potential temperature - scalar variables ratio correlation -! - CALL LES_FLUX_ll ( ZTH_ANOM, XSV_ANOM(:,:,:,JSV), & - OMASK, & - XLES_RESOLVED_ThSv(:,NLES_CURRENT_TCOUNT,IMASK,JSV) ) -! -!* liquid potential temperature - scalar variables ratio correlation -! - IF (LUSERC) THEN - CALL LES_FLUX_ll ( XTHL_ANOM, XSV_ANOM(:,:,:,JSV), & - OMASK, & - XLES_RESOLVED_ThlSv(:,NLES_CURRENT_TCOUNT,IMASK,JSV) ) - END IF -! -!* virtual potential temperature - scalar variables ratio correlation -! - IF (LUSERV) THEN - CALL LES_FLUX_ll ( ZTHV_ANOM, XSV_ANOM(:,:,:,JSV), & - OMASK, & - XLES_RESOLVED_ThvSv(:,NLES_CURRENT_TCOUNT,IMASK,JSV) ) - END IF - END DO -! -! -!* wind fluxes -! - CALL LES_FLUX_ll ( XU_ANOM, XV_ANOM, & - OMASK, & - XLES_RESOLVED_UV (:,NLES_CURRENT_TCOUNT,IMASK) ) -! - CALL LES_FLUX_ll ( XW_ANOM, XU_ANOM, & - OMASK, & - XLES_RESOLVED_WU (:,NLES_CURRENT_TCOUNT,IMASK) ) -! - CALL LES_FLUX_ll ( XW_ANOM, XV_ANOM, & - OMASK, & - XLES_RESOLVED_WV (:,NLES_CURRENT_TCOUNT,IMASK) ) -! -!* pressure fluxes -! - CALL LES_FLUX_ll ( XU_ANOM, ZDPDZ_ANOM, & - OMASK, & - XLES_RESOLVED_UP (:,NLES_CURRENT_TCOUNT,IMASK) ) -! - CALL LES_FLUX_ll ( XV_ANOM, ZDPDZ_ANOM, & - OMASK, & - XLES_RESOLVED_VP (:,NLES_CURRENT_TCOUNT,IMASK) ) -! - CALL LES_FLUX_ll ( XW_ANOM, ZDPDZ_ANOM, & - OMASK, & - XLES_RESOLVED_WP (:,NLES_CURRENT_TCOUNT,IMASK) ) -! -!* theta fluxes -! - CALL LES_FLUX_ll ( XU_ANOM, ZTH_ANOM, & - OMASK, & - XLES_RESOLVED_UTh (:,NLES_CURRENT_TCOUNT,IMASK) ) - - CALL LES_FLUX_ll ( XV_ANOM, ZTH_ANOM, & - OMASK, & - XLES_RESOLVED_VTh (:,NLES_CURRENT_TCOUNT,IMASK) ) -! - CALL LES_FLUX_ll ( XW_ANOM, ZTH_ANOM, & - OMASK, & - XLES_RESOLVED_WTh (:,NLES_CURRENT_TCOUNT,IMASK) ) -! -!* virtual theta fluxes -! - IF (LUSERV) THEN - CALL LES_FLUX_ll ( XU_ANOM, ZTHV_ANOM, & - OMASK, & - XLES_RESOLVED_UThv (:,NLES_CURRENT_TCOUNT,IMASK) ) -! - CALL LES_FLUX_ll ( XV_ANOM, ZTHV_ANOM, & - OMASK, & - XLES_RESOLVED_VThv (:,NLES_CURRENT_TCOUNT,IMASK) ) -! - CALL LES_FLUX_ll ( XW_ANOM, ZTHV_ANOM, & - OMASK, & - XLES_RESOLVED_WThv (:,NLES_CURRENT_TCOUNT,IMASK) ) -! -!* vapor mixing ratio fluxes -! - CALL LES_FLUX_ll ( XU_ANOM, ZRV_ANOM, & - OMASK, & - XLES_RESOLVED_URv (:,NLES_CURRENT_TCOUNT,IMASK) ) -! - CALL LES_FLUX_ll ( XV_ANOM, ZRV_ANOM, & - OMASK, & - XLES_RESOLVED_VRv (:,NLES_CURRENT_TCOUNT,IMASK) ) -! - CALL LES_FLUX_ll ( XW_ANOM, ZRV_ANOM, & - OMASK, & - XLES_RESOLVED_WRv (:,NLES_CURRENT_TCOUNT,IMASK) ) - END IF -! -!* cloud water mixing ratio fluxes -! - IF (LUSERC) THEN - CALL LES_FLUX_ll ( XU_ANOM, ZRC_ANOM, & - OMASK, & - XLES_RESOLVED_URc (:,NLES_CURRENT_TCOUNT,IMASK) ) -! - CALL LES_FLUX_ll ( XV_ANOM, ZRC_ANOM, & - OMASK, & - XLES_RESOLVED_VRc (:,NLES_CURRENT_TCOUNT,IMASK) ) -! - CALL LES_FLUX_ll ( XW_ANOM, ZRC_ANOM, & - OMASK, & - XLES_RESOLVED_WRc (:,NLES_CURRENT_TCOUNT,IMASK) ) -! -!* liquid theta fluxes -! - CALL LES_FLUX_ll ( XU_ANOM, XTHL_ANOM, & - OMASK, & - XLES_RESOLVED_UThl (:,NLES_CURRENT_TCOUNT,IMASK) ) -! - CALL LES_FLUX_ll ( XV_ANOM, XTHL_ANOM, & - OMASK, & - XLES_RESOLVED_VThl (:,NLES_CURRENT_TCOUNT,IMASK) ) -! - CALL LES_FLUX_ll ( XW_ANOM, XTHL_ANOM, & - OMASK, & - XLES_RESOLVED_WThl (:,NLES_CURRENT_TCOUNT,IMASK) ) -! -!* total water mixing ratio fluxes -! - CALL LES_FLUX_ll ( XW_ANOM, XRT_ANOM, & - OMASK, & - XLES_RESOLVED_WRt (:,NLES_CURRENT_TCOUNT,IMASK) ) - END IF -! -!* cloud ice mixing ratio fluxes -! - IF (LUSERI) THEN - CALL LES_FLUX_ll ( XU_ANOM, ZRI_ANOM, & - OMASK, & - XLES_RESOLVED_URi (:,NLES_CURRENT_TCOUNT,IMASK) ) -! - CALL LES_FLUX_ll ( XV_ANOM, ZRI_ANOM, & - OMASK, & - XLES_RESOLVED_VRi (:,NLES_CURRENT_TCOUNT,IMASK) ) -! - CALL LES_FLUX_ll ( XW_ANOM, ZRI_ANOM, & - OMASK, & - XLES_RESOLVED_WRi (:,NLES_CURRENT_TCOUNT,IMASK) ) - END IF - IF (LUSERR) THEN - CALL LES_FLUX_ll ( XW_ANOM, ZRR_ANOM, & - OMASK, & - XLES_RESOLVED_WRr (:,NLES_CURRENT_TCOUNT,IMASK) ) - END IF -! - -! -!* scalar variables fluxes -! - DO JSV=1,NSV - CALL LES_FLUX_ll ( XU_ANOM, XSV_ANOM(:,:,:,JSV), & - OMASK, & - XLES_RESOLVED_USv (:,NLES_CURRENT_TCOUNT,IMASK,JSV) ) -! - CALL LES_FLUX_ll ( XV_ANOM, XSV_ANOM(:,:,:,JSV), & - OMASK, & - XLES_RESOLVED_VSv (:,NLES_CURRENT_TCOUNT,IMASK,JSV) ) -! - CALL LES_FLUX_ll ( XW_ANOM, XSV_ANOM(:,:,:,JSV), & - OMASK, & - XLES_RESOLVED_WSv (:,NLES_CURRENT_TCOUNT,IMASK,JSV) ) - END DO -! -!* skewness -! - CALL LES_3RD_MOMENT_ll ( XU_ANOM, XU_ANOM, XU_ANOM, & - OMASK, & - XLES_RESOLVED_U3 (:,NLES_CURRENT_TCOUNT,IMASK) ) - - CALL LES_3RD_MOMENT_ll ( XV_ANOM, XV_ANOM, XV_ANOM, & - OMASK, & - XLES_RESOLVED_V3 (:,NLES_CURRENT_TCOUNT,IMASK) ) - - CALL LES_3RD_MOMENT_ll ( XW_ANOM, XW_ANOM, XW_ANOM, & - OMASK, & - XLES_RESOLVED_W3 (:,NLES_CURRENT_TCOUNT,IMASK) ) -! -!* kurtosis -! - CALL LES_4TH_MOMENT_ll ( XU_ANOM, XU_ANOM, XU_ANOM, XU_ANOM, & - OMASK, & - XLES_RESOLVED_U4 (:,NLES_CURRENT_TCOUNT,IMASK) ) - - CALL LES_4TH_MOMENT_ll ( XV_ANOM, XV_ANOM, XV_ANOM, XV_ANOM, & - OMASK, & - XLES_RESOLVED_V4 (:,NLES_CURRENT_TCOUNT,IMASK) ) - - CALL LES_4TH_MOMENT_ll ( XW_ANOM, XW_ANOM, XW_ANOM, XW_ANOM, & - OMASK, & - XLES_RESOLVED_W4 (:,NLES_CURRENT_TCOUNT,IMASK) ) -! -!* third moments of liquid potential temperature -! - IF (LUSERC) THEN - CALL LES_3RD_MOMENT_ll ( XW_ANOM, XTHL_ANOM, XTHL_ANOM, & - OMASK, & - XLES_RESOLVED_WThl2(:,NLES_CURRENT_TCOUNT,IMASK) ) - - CALL LES_3RD_MOMENT_ll ( XW_ANOM, XW_ANOM, XTHL_ANOM, & - OMASK, & - XLES_RESOLVED_W2Thl(:,NLES_CURRENT_TCOUNT,IMASK) ) - - ELSE - CALL LES_3RD_MOMENT_ll ( XW_ANOM, ZTH_ANOM, ZTH_ANOM, & - OMASK, & - XLES_RESOLVED_WThl2(:,NLES_CURRENT_TCOUNT,IMASK) ) - - CALL LES_3RD_MOMENT_ll ( XW_ANOM, XW_ANOM, ZTH_ANOM, & - OMASK, & - XLES_RESOLVED_W2Thl(:,NLES_CURRENT_TCOUNT,IMASK) ) - END IF -! -!* third moments of water vapor -! - IF (LUSERV) THEN - CALL LES_3RD_MOMENT_ll ( XW_ANOM, ZRV_ANOM, ZRV_ANOM, & - OMASK, & - XLES_RESOLVED_WRv2 (:,NLES_CURRENT_TCOUNT,IMASK) ) - - CALL LES_3RD_MOMENT_ll ( XW_ANOM, XW_ANOM, ZRV_ANOM, & - OMASK, & - XLES_RESOLVED_W2Rv (:,NLES_CURRENT_TCOUNT,IMASK) ) - END IF - - IF (LUSERC) THEN - CALL LES_3RD_MOMENT_ll ( XW_ANOM, XTHL_ANOM, ZRV_ANOM, & - OMASK, & - XLES_RESOLVED_WThlRv(:,NLES_CURRENT_TCOUNT,IMASK) ) - ELSE IF (LUSERV) THEN - CALL LES_3RD_MOMENT_ll ( XW_ANOM, ZTH_ANOM, ZRV_ANOM, & - OMASK, & - XLES_RESOLVED_WThlRv(:,NLES_CURRENT_TCOUNT,IMASK) ) - END IF -! -!* third moments of total water -! - IF (LUSERC) THEN - CALL LES_3RD_MOMENT_ll ( XW_ANOM, XRT_ANOM, XRT_ANOM, & - OMASK, & - XLES_RESOLVED_WRt2 (:,NLES_CURRENT_TCOUNT,IMASK) ) - - CALL LES_3RD_MOMENT_ll ( XW_ANOM, XW_ANOM, XRT_ANOM, & - OMASK, & - XLES_RESOLVED_W2Rt (:,NLES_CURRENT_TCOUNT,IMASK) ) - CALL LES_3RD_MOMENT_ll ( XW_ANOM, XTHL_ANOM, XRT_ANOM, & - OMASK, & - XLES_RESOLVED_WThlRt (:,NLES_CURRENT_TCOUNT,IMASK) ) - ELSE IF (LUSERV) THEN - CALL LES_3RD_MOMENT_ll ( XW_ANOM, ZRV_ANOM, ZRV_ANOM, & - OMASK, & - XLES_RESOLVED_WRt2 (:,NLES_CURRENT_TCOUNT,IMASK) ) - - CALL LES_3RD_MOMENT_ll ( XW_ANOM, XW_ANOM, ZRV_ANOM, & - OMASK, & - XLES_RESOLVED_W2Rt (:,NLES_CURRENT_TCOUNT,IMASK) ) - CALL LES_3RD_MOMENT_ll ( XW_ANOM, ZTH_ANOM, ZRV_ANOM, & - OMASK, & - XLES_RESOLVED_WThlRt (:,NLES_CURRENT_TCOUNT,IMASK) ) - END IF -! -!* third moments of cloud water -! - IF (LUSERC) THEN - CALL LES_3RD_MOMENT_ll ( XW_ANOM, ZRC_ANOM, ZRC_ANOM, & - OMASK, & - XLES_RESOLVED_WRc2 (:,NLES_CURRENT_TCOUNT,IMASK) ) - - CALL LES_3RD_MOMENT_ll ( XW_ANOM, XW_ANOM, ZRC_ANOM, & - OMASK, & - XLES_RESOLVED_W2Rc (:,NLES_CURRENT_TCOUNT,IMASK) ) - - CALL LES_3RD_MOMENT_ll ( XW_ANOM, XTHL_ANOM, ZRC_ANOM, & - OMASK, & - XLES_RESOLVED_WThlRc(:,NLES_CURRENT_TCOUNT,IMASK) ) - - CALL LES_3RD_MOMENT_ll ( XW_ANOM, ZRV_ANOM, ZRC_ANOM, & - OMASK, & - XLES_RESOLVED_WRvRc (:,NLES_CURRENT_TCOUNT,IMASK) ) - END IF -! -!* third moments of cloud ice -! - IF (LUSERI) THEN - CALL LES_3RD_MOMENT_ll ( XW_ANOM, ZRI_ANOM, ZRI_ANOM, & - OMASK, & - XLES_RESOLVED_WRi2 (:,NLES_CURRENT_TCOUNT,IMASK) ) - - CALL LES_3RD_MOMENT_ll ( XW_ANOM, XW_ANOM, ZRI_ANOM, & - OMASK, & - XLES_RESOLVED_W2Ri (:,NLES_CURRENT_TCOUNT,IMASK) ) - - CALL LES_3RD_MOMENT_ll ( XW_ANOM, XTHL_ANOM, ZRI_ANOM, & - OMASK, & - XLES_RESOLVED_WThlRi(:,NLES_CURRENT_TCOUNT,IMASK) ) - - CALL LES_3RD_MOMENT_ll ( XW_ANOM, ZRV_ANOM, ZRI_ANOM, & - OMASK, & - XLES_RESOLVED_WRvRi (:,NLES_CURRENT_TCOUNT,IMASK) ) - END IF -! -!* third moments of scalar variables -! - DO JSV=1,NSV - CALL LES_3RD_MOMENT_ll ( XW_ANOM, XSV_ANOM(:,:,:,JSV), XSV_ANOM(:,:,:,JSV), & - OMASK, & - XLES_RESOLVED_WSv2 (:,NLES_CURRENT_TCOUNT,IMASK,JSV) ) - - CALL LES_3RD_MOMENT_ll ( XW_ANOM, XW_ANOM, XSV_ANOM(:,:,:,JSV), & - OMASK, & - XLES_RESOLVED_W2Sv (:,NLES_CURRENT_TCOUNT,IMASK,JSV) ) - IF (LUSERC) THEN - CALL LES_3RD_MOMENT_ll ( XW_ANOM, XTHL_ANOM, XSV_ANOM(:,:,:,JSV), & - OMASK, & - XLES_RESOLVED_WThlSv(:,NLES_CURRENT_TCOUNT,IMASK,JSV) ) - ELSE - CALL LES_3RD_MOMENT_ll ( XW_ANOM, ZTH_ANOM, XSV_ANOM(:,:,:,JSV), & - OMASK, & - XLES_RESOLVED_WThlSv(:,NLES_CURRENT_TCOUNT,IMASK,JSV) ) - END IF - - IF (LUSERV) THEN - CALL LES_3RD_MOMENT_ll ( XW_ANOM, ZRV_ANOM, XSV_ANOM(:,:,:,JSV), & - OMASK, & - XLES_RESOLVED_WRvSv (:,NLES_CURRENT_TCOUNT,IMASK,JSV) ) - END IF - END DO -! -!* presso-correlations -! -! - CALL LES_FLUX_ll ( XTHL_ANOM, ZDPDZ_ANOM, & - OMASK, & - XLES_RESOLVED_ThlPz(:,NLES_CURRENT_TCOUNT,IMASK) ) - - IF (LUSERV) & - CALL LES_FLUX_ll ( ZRV_ANOM, ZDPDZ_ANOM, & - OMASK, & - XLES_RESOLVED_RvPz(:,NLES_CURRENT_TCOUNT,IMASK) ) - - IF (LUSERC) THEN - CALL LES_FLUX_ll ( XRT_ANOM, ZDPDZ_ANOM, & - OMASK, & - XLES_RESOLVED_RtPz(:,NLES_CURRENT_TCOUNT,IMASK) ) - - CALL LES_FLUX_ll ( ZRC_ANOM, ZDPDZ_ANOM, & - OMASK, & - XLES_RESOLVED_RcPz(:,NLES_CURRENT_TCOUNT,IMASK) ) - END IF - - IF (LUSERI) & - CALL LES_FLUX_ll ( ZRI_ANOM, ZDPDZ_ANOM, & - OMASK, & - XLES_RESOLVED_RiPz(:,NLES_CURRENT_TCOUNT,IMASK) ) - -! -! -!* resolved turbulent kinetic energy fluxes -! - - CALL LES_3RD_MOMENT_ll ( XU_ANOM, XU_ANOM, XU_ANOM, & - OMASK, & - ZLES_RESOLVED_U3 (:) ) - - CALL LES_3RD_MOMENT_ll ( XU_ANOM, XV_ANOM, XV_ANOM, & - OMASK, & - ZLES_RESOLVED_UV2 (:) ) - - CALL LES_3RD_MOMENT_ll ( XU_ANOM, XW_ANOM, XW_ANOM, & - OMASK, & - ZLES_RESOLVED_UW2 (:) ) - - XLES_RESOLVED_UKe(:,NLES_CURRENT_TCOUNT,IMASK) = 0.5*( ZLES_RESOLVED_U3 & - + ZLES_RESOLVED_UV2 & - + ZLES_RESOLVED_UW2 ) - - - - CALL LES_3RD_MOMENT_ll ( XV_ANOM, XU_ANOM, XU_ANOM, & - OMASK, & - ZLES_RESOLVED_VU2 (:) ) - - CALL LES_3RD_MOMENT_ll ( XV_ANOM, XV_ANOM, XV_ANOM, & - OMASK, & - ZLES_RESOLVED_V3 (:) ) - - CALL LES_3RD_MOMENT_ll ( XV_ANOM, XW_ANOM, XW_ANOM, & - OMASK, & - ZLES_RESOLVED_VW2 (:) ) - - XLES_RESOLVED_VKe(:,NLES_CURRENT_TCOUNT,IMASK) = 0.5*( ZLES_RESOLVED_VU2 & - + ZLES_RESOLVED_V3 & - + ZLES_RESOLVED_VW2 ) - - - CALL LES_3RD_MOMENT_ll ( XW_ANOM, XU_ANOM, XU_ANOM, & - OMASK, & - ZLES_RESOLVED_WU2 (:) ) - - CALL LES_3RD_MOMENT_ll ( XW_ANOM, XV_ANOM, XV_ANOM, & - OMASK, & - ZLES_RESOLVED_WV2 (:) ) - - XLES_RESOLVED_WKe(:,NLES_CURRENT_TCOUNT,IMASK) = 0.5*( ZLES_RESOLVED_WU2 & - + ZLES_RESOLVED_WV2 & - + XLES_RESOLVED_W3(:,NLES_CURRENT_TCOUNT,IMASK) ) - -! -! -!------------------------------------------------------------------------------- -! -! 1.6 Subgrid quantities -! ------------------ -! -IF (LLES_SUBGRID) THEN -! -!* wind fluxes and variances -! - CALL LES_MEAN_ll ( ZTKE_LES, OMASK, & - XLES_SUBGRID_Tke(:,NLES_CURRENT_TCOUNT,IMASK) ) - - CALL LES_MEAN_MPROC ( XLES_SUBGRID_UV(:,NLES_CURRENT_TCOUNT,IMASK), & - IAVG_PTS(:), IUND_PTS(:) ) -! - CALL LES_MEAN_MPROC ( XLES_SUBGRID_WU(:,NLES_CURRENT_TCOUNT,IMASK), & - IAVG_PTS(:), IUND_PTS(:) ) -! - CALL LES_MEAN_MPROC ( XLES_SUBGRID_WV(:,NLES_CURRENT_TCOUNT,IMASK), & - IAVG_PTS(:), IUND_PTS(:) ) -! - CALL LES_MEAN_MPROC ( XLES_SUBGRID_U2(:,NLES_CURRENT_TCOUNT,IMASK), & - IAVG_PTS(:), IUND_PTS(:) ) -! - CALL LES_MEAN_MPROC ( XLES_SUBGRID_V2(:,NLES_CURRENT_TCOUNT,IMASK), & - IAVG_PTS(:), IUND_PTS(:) ) -! - CALL LES_MEAN_MPROC ( XLES_SUBGRID_W2(:,NLES_CURRENT_TCOUNT,IMASK), & - IAVG_PTS(:), IUND_PTS(:) ) -! -! -!* liquid potential temperature fluxes -! - CALL LES_MEAN_MPROC ( XLES_SUBGRID_UThl(:,NLES_CURRENT_TCOUNT,IMASK), & - IAVG_PTS(:), IUND_PTS(:) ) -! - CALL LES_MEAN_MPROC ( XLES_SUBGRID_VThl(:,NLES_CURRENT_TCOUNT,IMASK), & - IAVG_PTS(:), IUND_PTS(:) ) -! - CALL LES_MEAN_MPROC ( XLES_SUBGRID_WThl(:,NLES_CURRENT_TCOUNT,IMASK), & - IAVG_PTS(:), IUND_PTS(:) ) -! - -!* liquid potential temperature variance -! - CALL LES_MEAN_MPROC ( XLES_SUBGRID_Thl2(:,NLES_CURRENT_TCOUNT,IMASK), & - IAVG_PTS(:), IUND_PTS(:) ) -! -!* Mass flux scheme of shallow convection -! - CALL LES_MEAN_MPROC ( XLES_SUBGRID_THLUP_MF(:,NLES_CURRENT_TCOUNT,IMASK), & - IAVG_PTS(:), IUND_PTS(:) ) - - CALL LES_MEAN_MPROC ( XLES_SUBGRID_RTUP_MF(:,NLES_CURRENT_TCOUNT,IMASK), & - IAVG_PTS(:), IUND_PTS(:) ) -! - CALL LES_MEAN_MPROC ( XLES_SUBGRID_RVUP_MF(:,NLES_CURRENT_TCOUNT,IMASK), & - IAVG_PTS(:), IUND_PTS(:) ) -! - CALL LES_MEAN_MPROC ( XLES_SUBGRID_RCUP_MF(:,NLES_CURRENT_TCOUNT,IMASK), & - IAVG_PTS(:), IUND_PTS(:) ) -! - CALL LES_MEAN_MPROC ( XLES_SUBGRID_RIUP_MF(:,NLES_CURRENT_TCOUNT,IMASK), & - IAVG_PTS(:), IUND_PTS(:) ) -! - CALL LES_MEAN_MPROC ( XLES_SUBGRID_WUP_MF(:,NLES_CURRENT_TCOUNT,IMASK), & - IAVG_PTS(:), IUND_PTS(:) ) -! - CALL LES_MEAN_MPROC ( XLES_SUBGRID_MASSFLUX(:,NLES_CURRENT_TCOUNT,IMASK), & - IAVG_PTS(:), IUND_PTS(:) ) -! - CALL LES_MEAN_MPROC ( XLES_SUBGRID_DETR(:,NLES_CURRENT_TCOUNT,IMASK), & - IAVG_PTS(:), IUND_PTS(:) ) -! - CALL LES_MEAN_MPROC ( XLES_SUBGRID_ENTR(:,NLES_CURRENT_TCOUNT,IMASK), & - IAVG_PTS(:), IUND_PTS(:) ) -! - CALL LES_MEAN_MPROC ( XLES_SUBGRID_FRACUP(:,NLES_CURRENT_TCOUNT,IMASK), & - IAVG_PTS(:), IUND_PTS(:) ) -! - CALL LES_MEAN_MPROC ( XLES_SUBGRID_THVUP_MF(:,NLES_CURRENT_TCOUNT,IMASK), & - IAVG_PTS(:), IUND_PTS(:) ) -! - CALL LES_MEAN_MPROC ( XLES_SUBGRID_WTHLMF(:,NLES_CURRENT_TCOUNT,IMASK), & - IAVG_PTS(:), IUND_PTS(:) ) -! - CALL LES_MEAN_MPROC ( XLES_SUBGRID_WRTMF(:,NLES_CURRENT_TCOUNT,IMASK), & - IAVG_PTS(:), IUND_PTS(:) ) -! - CALL LES_MEAN_MPROC ( XLES_SUBGRID_WTHVMF(:,NLES_CURRENT_TCOUNT,IMASK), & - IAVG_PTS(:), IUND_PTS(:) ) -! - CALL LES_MEAN_MPROC ( XLES_SUBGRID_WUMF(:,NLES_CURRENT_TCOUNT,IMASK), & - IAVG_PTS(:), IUND_PTS(:) ) -! - CALL LES_MEAN_MPROC ( XLES_SUBGRID_WVMF(:,NLES_CURRENT_TCOUNT,IMASK), & - IAVG_PTS(:), IUND_PTS(:) ) - - -!* total water mixing ratio fluxes, correlation and variance -! - IF (LUSERV) THEN - CALL LES_MEAN_MPROC ( XLES_SUBGRID_URt(:,NLES_CURRENT_TCOUNT,IMASK), & - IAVG_PTS(:), IUND_PTS(:) ) - ! - CALL LES_MEAN_MPROC ( XLES_SUBGRID_VRt(:,NLES_CURRENT_TCOUNT,IMASK), & - IAVG_PTS(:), IUND_PTS(:) ) - ! - CALL LES_MEAN_MPROC ( XLES_SUBGRID_WRt(:,NLES_CURRENT_TCOUNT,IMASK), & - IAVG_PTS(:), IUND_PTS(:) ) - ! - CALL LES_MEAN_MPROC ( XLES_SUBGRID_ThlRt(:,NLES_CURRENT_TCOUNT,IMASK),& - IAVG_PTS(:), IUND_PTS(:) ) - ! - CALL LES_MEAN_MPROC ( XLES_SUBGRID_Rt2(:,NLES_CURRENT_TCOUNT,IMASK), & - IAVG_PTS(:), IUND_PTS(:) ) - END IF -! -!* scalar variances -! - DO JSV=1,NSV - CALL LES_MEAN_MPROC ( XLES_SUBGRID_Sv2(:,NLES_CURRENT_TCOUNT,IMASK,JSV), & - IAVG_PTS(:), IUND_PTS(:) ) - END DO -! -!* cloud water mixing ratio fluxes -! - IF (LUSERC) THEN - CALL LES_MEAN_MPROC ( XLES_SUBGRID_URc(:,NLES_CURRENT_TCOUNT,IMASK), & - IAVG_PTS(:), IUND_PTS(:) ) - ! - CALL LES_MEAN_MPROC ( XLES_SUBGRID_VRc(:,NLES_CURRENT_TCOUNT,IMASK), & - IAVG_PTS(:), IUND_PTS(:) ) - ! - CALL LES_MEAN_MPROC ( XLES_SUBGRID_WRc(:,NLES_CURRENT_TCOUNT,IMASK), & - IAVG_PTS(:), IUND_PTS(:) ) - END IF -! -!* scalar variables fluxes -! - DO JSV=1,NSV - CALL LES_MEAN_MPROC ( XLES_SUBGRID_USv(:,NLES_CURRENT_TCOUNT,IMASK,JSV), & - IAVG_PTS(:), IUND_PTS(:) ) - ! - CALL LES_MEAN_MPROC ( XLES_SUBGRID_VSv(:,NLES_CURRENT_TCOUNT,IMASK,JSV), & - IAVG_PTS(:), IUND_PTS(:) ) - ! - CALL LES_MEAN_MPROC ( XLES_SUBGRID_WSv(:,NLES_CURRENT_TCOUNT,IMASK,JSV), & - IAVG_PTS(:), IUND_PTS(:) ) - END DO -! -!* subgrid turbulent kinetic energy fluxes -! - CALL LES_MEAN_MPROC ( XLES_SUBGRID_UTke(:,NLES_CURRENT_TCOUNT,IMASK), & - IAVG_PTS(:), IUND_PTS(:) ) - ! - CALL LES_MEAN_MPROC ( XLES_SUBGRID_VTke(:,NLES_CURRENT_TCOUNT,IMASK), & - IAVG_PTS(:), IUND_PTS(:) ) - ! - CALL LES_MEAN_MPROC ( XLES_SUBGRID_WTke(:,NLES_CURRENT_TCOUNT,IMASK), & - IAVG_PTS(:), IUND_PTS(:) ) - - CALL LES_MEAN_MPROC ( XLES_SUBGRID_ddz_WTke(:,NLES_CURRENT_TCOUNT,IMASK),& - IAVG_PTS(:), IUND_PTS(:) ) -! -!* fluxes and correlations with virtual potential temperature -! - IF (LUSERV) THEN - CALL LES_MEAN_MPROC ( XLES_SUBGRID_WThv(:,NLES_CURRENT_TCOUNT,IMASK), & - IAVG_PTS(:), IUND_PTS(:) ) - - CALL LES_MEAN_MPROC ( XLES_SUBGRID_ThlThv(:,NLES_CURRENT_TCOUNT,IMASK),& - IAVG_PTS(:), IUND_PTS(:) ) - - CALL LES_MEAN_MPROC ( XLES_SUBGRID_RtThv(:,NLES_CURRENT_TCOUNT,IMASK), & - IAVG_PTS(:), IUND_PTS(:) ) - - DO JSV=1,NSV - CALL LES_MEAN_MPROC ( XLES_SUBGRID_SvThv(:,NLES_CURRENT_TCOUNT,IMASK,JSV), & - IAVG_PTS(:), IUND_PTS(:) ) - END DO - END IF -! -!* third order fluxes -! - CALL LES_MEAN_MPROC ( XLES_SUBGRID_W2Thl(:,NLES_CURRENT_TCOUNT,IMASK), & - IAVG_PTS(:), IUND_PTS(:) ) - - CALL LES_MEAN_MPROC ( XLES_SUBGRID_WThl2(:,NLES_CURRENT_TCOUNT,IMASK), & - IAVG_PTS(:), IUND_PTS(:) ) - - IF (LUSERV) THEN - CALL LES_MEAN_MPROC ( XLES_SUBGRID_W2Rt(:,NLES_CURRENT_TCOUNT,IMASK), & - IAVG_PTS(:), IUND_PTS(:) ) - - CALL LES_MEAN_MPROC ( XLES_SUBGRID_WThlRt(:,NLES_CURRENT_TCOUNT,IMASK),& - IAVG_PTS(:), IUND_PTS(:) ) - - CALL LES_MEAN_MPROC ( XLES_SUBGRID_WRt2(:,NLES_CURRENT_TCOUNT,IMASK), & - IAVG_PTS(:), IUND_PTS(:) ) - - END IF - DO JSV=1,NSV - CALL LES_MEAN_MPROC ( XLES_SUBGRID_W2Sv(:,NLES_CURRENT_TCOUNT,IMASK,JSV), & - IAVG_PTS(:), IUND_PTS(:) ) - - CALL LES_MEAN_MPROC ( XLES_SUBGRID_WSv2(:,NLES_CURRENT_TCOUNT,IMASK,JSV), & - IAVG_PTS(:), IUND_PTS(:) ) - END DO -! -!* dissipative terms -! - CALL LES_MEAN_MPROC ( XLES_SUBGRID_DISS_Tke(:,NLES_CURRENT_TCOUNT,IMASK), & - IAVG_PTS(:), IUND_PTS(:) ) - - CALL LES_MEAN_MPROC ( XLES_SUBGRID_DISS_Thl2(:,NLES_CURRENT_TCOUNT,IMASK), & - IAVG_PTS(:), IUND_PTS(:) ) - - IF (LUSERV) THEN - CALL LES_MEAN_MPROC ( XLES_SUBGRID_DISS_Rt2(:,NLES_CURRENT_TCOUNT,IMASK),& - IAVG_PTS(:), IUND_PTS(:) ) - - CALL LES_MEAN_MPROC ( XLES_SUBGRID_DISS_ThlRt(:,NLES_CURRENT_TCOUNT,IMASK),& - IAVG_PTS(:), IUND_PTS(:) ) - END IF - - DO JSV=1,NSV - CALL LES_MEAN_MPROC ( XLES_SUBGRID_DISS_Sv2(:,NLES_CURRENT_TCOUNT,IMASK,JSV), & - IAVG_PTS(:), IUND_PTS(:) ) - END DO -! -!* presso-correlation terms -! - CALL LES_MEAN_MPROC ( XLES_SUBGRID_WP(:,NLES_CURRENT_TCOUNT,IMASK), & - IAVG_PTS(:), IUND_PTS(:) ) - - CALL LES_MEAN_MPROC ( XLES_SUBGRID_ThlPz(:,NLES_CURRENT_TCOUNT,IMASK), & - IAVG_PTS(:), IUND_PTS(:) ) - - IF (LUSERV) THEN - CALL LES_MEAN_MPROC ( XLES_SUBGRID_RtPz(:,NLES_CURRENT_TCOUNT,IMASK), & - IAVG_PTS(:), IUND_PTS(:) ) - - END IF - - DO JSV=1,NSV - CALL LES_MEAN_MPROC ( XLES_SUBGRID_SvPz(:,NLES_CURRENT_TCOUNT,IMASK,JSV), & - IAVG_PTS(:), IUND_PTS(:) ) - END DO - -!* phi3 and psi3 terms -! - CALL LES_MEAN_MPROC ( XLES_SUBGRID_PHI3(:,NLES_CURRENT_TCOUNT,IMASK), & - IAVG_PTS(:), IUND_PTS(:) ) - - IF (LUSERV) THEN - CALL LES_MEAN_MPROC ( XLES_SUBGRID_PSI3(:,NLES_CURRENT_TCOUNT,IMASK), & - IAVG_PTS(:), IUND_PTS(:) ) - END IF -! -!* subgrid mixing length -! - CALL LES_MEAN_MPROC ( XLES_SUBGRID_LMix(:,NLES_CURRENT_TCOUNT,IMASK), & - IAVG_PTS(:), IUND_PTS(:) ) -! -!* subgrid dissipative length -! - CALL LES_MEAN_MPROC ( XLES_SUBGRID_LDiss(:,NLES_CURRENT_TCOUNT,IMASK), & - IAVG_PTS(:), IUND_PTS(:) ) -! -!* eddy diffusivities -! - CALL LES_MEAN_MPROC ( XLES_SUBGRID_Km(:,NLES_CURRENT_TCOUNT,IMASK), & - IAVG_PTS(:), IUND_PTS(:) ) - - CALL LES_MEAN_MPROC ( XLES_SUBGRID_Kh(:,NLES_CURRENT_TCOUNT,IMASK), & - IAVG_PTS(:), IUND_PTS(:) ) - -END IF -! -! computation of KHT and KHR depending on LLES - IF (LUSERC) THEN - IF (LLES_RESOLVED) THEN - XLES_MEAN_KHt(:,NLES_CURRENT_TCOUNT,IMASK)=0. - WHERE(XLES_MEAN_DTHLDZ(:,NLES_CURRENT_TCOUNT,IMASK)/=0) & - XLES_MEAN_KHt(:,NLES_CURRENT_TCOUNT,IMASK)=-1. & - *XLES_RESOLVED_WThl (:,NLES_CURRENT_TCOUNT,IMASK)/ & - XLES_MEAN_DTHLDZ(:,NLES_CURRENT_TCOUNT,IMASK) - XLES_MEAN_KHr(:,NLES_CURRENT_TCOUNT,IMASK)=0. - WHERE(XLES_MEAN_DRtDZ(:,NLES_CURRENT_TCOUNT,IMASK)/=0) & - XLES_MEAN_KHr(:,NLES_CURRENT_TCOUNT,IMASK)=-1.* & - XLES_RESOLVED_WRt (:,NLES_CURRENT_TCOUNT,IMASK)/ & - XLES_MEAN_DRtDZ(:,NLES_CURRENT_TCOUNT,IMASK) - END IF - IF (LLES_SUBGRID) THEN - XLES_MEAN_KHt(:,NLES_CURRENT_TCOUNT,IMASK)=0. - WHERE(XLES_MEAN_DTHLDZ(:,NLES_CURRENT_TCOUNT,IMASK)/=0) & - XLES_MEAN_KHt(:,NLES_CURRENT_TCOUNT,IMASK)=-1. & - *XLES_SUBGRID_WThl (:,NLES_CURRENT_TCOUNT,IMASK) / & - XLES_MEAN_DTHLDZ(:,NLES_CURRENT_TCOUNT,IMASK) - XLES_MEAN_KHr(:,NLES_CURRENT_TCOUNT,IMASK)=0. - WHERE(XLES_MEAN_DRtDZ(:,NLES_CURRENT_TCOUNT,IMASK)/=0) & - XLES_MEAN_KHr(:,NLES_CURRENT_TCOUNT,IMASK)=-1.* & - XLES_SUBGRID_WRt (:,NLES_CURRENT_TCOUNT,IMASK) / & - XLES_MEAN_DRtDZ(:,NLES_CURRENT_TCOUNT,IMASK) - END IF - IF (LLES_RESOLVED .AND. LLES_SUBGRID) THEN - XLES_MEAN_KHt(:,NLES_CURRENT_TCOUNT,IMASK)=0. - WHERE(XLES_MEAN_DTHLDZ(:,NLES_CURRENT_TCOUNT,IMASK)/=0) & - XLES_MEAN_KHt(:,NLES_CURRENT_TCOUNT,IMASK)=-1. & - *(XLES_RESOLVED_WThl (:,NLES_CURRENT_TCOUNT,IMASK)+ & - XLES_SUBGRID_WThl (:,NLES_CURRENT_TCOUNT,IMASK))/ & - XLES_MEAN_DTHLDZ(:,NLES_CURRENT_TCOUNT,IMASK) - XLES_MEAN_KHr(:,NLES_CURRENT_TCOUNT,IMASK)=0. - WHERE(XLES_MEAN_DRtDZ(:,NLES_CURRENT_TCOUNT,IMASK)/=0) & - XLES_MEAN_KHr(:,NLES_CURRENT_TCOUNT,IMASK)=-1.* & - (XLES_RESOLVED_WRt (:,NLES_CURRENT_TCOUNT,IMASK)+ & - XLES_SUBGRID_WRt (:,NLES_CURRENT_TCOUNT,IMASK)) / & - XLES_MEAN_DRtDZ(:,NLES_CURRENT_TCOUNT,IMASK) - END IF - END IF -!------------------------------------------------------------------------------- -! -! 1.7 Interaction of subgrid and resolved quantities -! ---------------------------------------------- -! -!* WARNING: these terms also contain the term due to the mean flow. -! this mean flow contribution will be removed from them -! when treated in write_les_budgetn.f90 -! -! -!* subgrid turbulent kinetic energy fluxes -! -IF (LLES_RESOLVED) THEN - CALL LES_FLUX_ll ( XU_ANOM, ZTKE_LES, & - OMASK, & - XLES_RES_U_SBG_Tke(:,NLES_CURRENT_TCOUNT,IMASK) ) -! - CALL LES_FLUX_ll ( XV_ANOM, ZTKE_LES, & - OMASK, & - XLES_RES_V_SBG_Tke(:,NLES_CURRENT_TCOUNT,IMASK) ) -! - CALL LES_FLUX_ll ( XW_ANOM, ZTKE_LES, & - OMASK, & - XLES_RES_W_SBG_Tke(:,NLES_CURRENT_TCOUNT,IMASK) ) -END IF -! -!* WARNING: these terms also contain the term due to the mean flow. -! this mean flow contribution will be removed from them -! when treated in write_les_budgetn.f90 -! -!* production terms for subgrid quantities -! -IF (LLES_RESOLVED .AND. LLES_SUBGRID) THEN - CALL LES_MEAN_MPROC ( XLES_RES_ddxa_U_SBG_UaU(:,NLES_CURRENT_TCOUNT,IMASK), & - IAVG_PTS(:), IUND_PTS(:) ) - - CALL LES_MEAN_MPROC ( XLES_RES_ddxa_V_SBG_UaV(:,NLES_CURRENT_TCOUNT,IMASK), & - IAVG_PTS(:), IUND_PTS(:) ) - - CALL LES_MEAN_MPROC ( XLES_RES_ddxa_W_SBG_UaW(:,NLES_CURRENT_TCOUNT,IMASK), & - IAVG_PTS(:), IUND_PTS(:) ) - - CALL LES_MEAN_MPROC ( XLES_RES_ddxa_W_SBG_UaThl(:,NLES_CURRENT_TCOUNT,IMASK), & - IAVG_PTS(:), IUND_PTS(:) ) - - CALL LES_MEAN_MPROC ( XLES_RES_ddxa_Thl_SBG_UaW(:,NLES_CURRENT_TCOUNT,IMASK), & - IAVG_PTS(:), IUND_PTS(:) ) - - CALL LES_MEAN_MPROC ( XLES_RES_ddz_Thl_SBG_W2 (:,NLES_CURRENT_TCOUNT,IMASK), & - IAVG_PTS(:), IUND_PTS(:) ) - - CALL LES_MEAN_MPROC ( XLES_RES_ddxa_Thl_SBG_UaThl(:,NLES_CURRENT_TCOUNT,IMASK), & - IAVG_PTS(:), IUND_PTS(:) ) - - IF (LUSERV) THEN - CALL LES_MEAN_MPROC ( XLES_RES_ddxa_W_SBG_UaRt(:,NLES_CURRENT_TCOUNT,IMASK), & - IAVG_PTS(:), IUND_PTS(:) ) - - CALL LES_MEAN_MPROC ( XLES_RES_ddxa_Rt_SBG_UaW(:,NLES_CURRENT_TCOUNT,IMASK), & - IAVG_PTS(:), IUND_PTS(:) ) - - CALL LES_MEAN_MPROC ( XLES_RES_ddz_Rt_SBG_W2 (:,NLES_CURRENT_TCOUNT,IMASK), & - IAVG_PTS(:), IUND_PTS(:) ) - - CALL LES_MEAN_MPROC ( XLES_RES_ddxa_Thl_SBG_UaRt(:,NLES_CURRENT_TCOUNT,IMASK), & - IAVG_PTS(:), IUND_PTS(:) ) - - CALL LES_MEAN_MPROC ( XLES_RES_ddxa_Rt_SBG_UaThl(:,NLES_CURRENT_TCOUNT,IMASK), & - IAVG_PTS(:), IUND_PTS(:) ) - - CALL LES_MEAN_MPROC ( XLES_RES_ddxa_Rt_SBG_UaRt(:,NLES_CURRENT_TCOUNT,IMASK), & - IAVG_PTS(:), IUND_PTS(:) ) - - END IF -! -!* WARNING: these terms also contain the term due to the mean flow. -! this mean flow contribution will be removed from them -! when treated in write_les_budgetn.f90 -! -!* turbulent transport and advection terms for subgrid quantities -! - CALL LES_MEAN_MPROC ( XLES_RES_W_SBG_WThl(:,NLES_CURRENT_TCOUNT,IMASK), & - IAVG_PTS(:), IUND_PTS(:) ) - - CALL LES_MEAN_MPROC ( XLES_RES_W_SBG_Thl2(:,NLES_CURRENT_TCOUNT,IMASK), & - IAVG_PTS(:), IUND_PTS(:) ) - - IF (LUSERV) THEN - CALL LES_MEAN_MPROC ( XLES_RES_W_SBG_WRt(:,NLES_CURRENT_TCOUNT,IMASK), & - IAVG_PTS(:), IUND_PTS(:) ) - - CALL LES_MEAN_MPROC ( XLES_RES_W_SBG_Rt2(:,NLES_CURRENT_TCOUNT,IMASK), & - IAVG_PTS(:), IUND_PTS(:) ) - - CALL LES_MEAN_MPROC ( XLES_RES_W_SBG_ThlRt(:,NLES_CURRENT_TCOUNT,IMASK), & - IAVG_PTS(:), IUND_PTS(:) ) - - END IF - - DO JSV=1,NSV - CALL LES_MEAN_MPROC ( XLES_RES_W_SBG_WSv(:,NLES_CURRENT_TCOUNT,IMASK,JSV), & - IAVG_PTS(:), IUND_PTS(:) ) - - CALL LES_MEAN_MPROC ( XLES_RES_W_SBG_Sv2(:,NLES_CURRENT_TCOUNT,IMASK,JSV), & - IAVG_PTS(:), IUND_PTS(:) ) - END DO -END IF -! -!------------------------------------------------------------------------------- -! -! 2. The following is for cartesian mask only -! ---------------------------------------- -! -IF (IMASK>1) RETURN -! -!------------------------------------------------------------------------------- -! -! 3. Updraft diagnostics -! ------------------- -! -IF (LLES_UPDRAFT) THEN -! - DO JK=1,NLES_K - GUPDRAFT_MASK(:,:,JK) = (XW_ANOM(:,:,JK) > 0.) .AND. LLES_CURRENT_CART_MASK(:,:,JK) - END DO -! -! -! 3.1 Updraft fraction -! ---------------- -! - ZUPDRAFT(:,:,:) = 0. - WHERE (GUPDRAFT_MASK(:,:,:)) - ZUPDRAFT(:,:,:) = 1. - END WHERE -! - CALL LES_MEAN_ll ( ZUPDRAFT, OMASK, & - XLES_UPDRAFT(:,NLES_CURRENT_TCOUNT) ) -! -! -! 3.2 Updraft mean quantities -! ----------------------- -! -!* vertical wind velocity -! - CALL LES_MEAN_ll ( ZW_LES, GUPDRAFT_MASK, & - XLES_UPDRAFT_W(:,NLES_CURRENT_TCOUNT) ) -! -!* potential temperature -! - CALL LES_MEAN_ll ( ZTH_LES, GUPDRAFT_MASK, & - XLES_UPDRAFT_Th(:,NLES_CURRENT_TCOUNT) ) -! -!* liquid potential temperature -! - IF (LUSERC) & - CALL LES_MEAN_ll ( ZTHL_LES, GUPDRAFT_MASK, & - XLES_UPDRAFT_Thl(:,NLES_CURRENT_TCOUNT) ) -! -!* virtual potential temperature -! - IF (LUSERV) & - CALL LES_MEAN_ll ( ZTHV_LES, GUPDRAFT_MASK, & - XLES_UPDRAFT_Thv(:,NLES_CURRENT_TCOUNT) ) -! -!* vapor mixing ratio -! - IF (LUSERV) & - CALL LES_MEAN_ll ( ZRV_LES, GUPDRAFT_MASK, & - XLES_UPDRAFT_Rv(:,NLES_CURRENT_TCOUNT) ) -! -!* cloud water mixing ratio -! - IF (LUSERC) & - CALL LES_MEAN_ll ( ZRC_LES, GUPDRAFT_MASK, & - XLES_UPDRAFT_Rc(:,NLES_CURRENT_TCOUNT) ) -! -!* rain mixing ratio -! - IF (LUSERR) & - CALL LES_MEAN_ll ( ZRR_LES, GUPDRAFT_MASK, & - XLES_UPDRAFT_Rr(:,NLES_CURRENT_TCOUNT) ) -! -!* cloud ice mixing ratio -! - IF (LUSERI) & - CALL LES_MEAN_ll ( ZRI_LES, GUPDRAFT_MASK, & - XLES_UPDRAFT_Ri(:,NLES_CURRENT_TCOUNT) ) -! -!* snow mixing ratio -! - IF (LUSERS) & - CALL LES_MEAN_ll ( ZRS_LES, GUPDRAFT_MASK, & - XLES_UPDRAFT_Rs(:,NLES_CURRENT_TCOUNT) ) -! -!* graupel mixing ratio -! - IF (LUSERG) & - CALL LES_MEAN_ll ( ZRG_LES, GUPDRAFT_MASK, & - XLES_UPDRAFT_Rg(:,NLES_CURRENT_TCOUNT) ) -! -!* hail mixing ratio -! - IF (LUSERH) & - CALL LES_MEAN_ll ( ZRG_LES, GUPDRAFT_MASK, & - XLES_UPDRAFT_Rh(:,NLES_CURRENT_TCOUNT) ) -! -!* scalar variables -! - DO JSV=1,NSV - CALL LES_MEAN_ll ( ZSV_LES(:,:,:,JSV), GUPDRAFT_MASK, & - XLES_UPDRAFT_Sv(:,NLES_CURRENT_TCOUNT,JSV) ) - END DO -! -!* subgrid turbulent kinetic energy -! - CALL LES_MEAN_ll ( ZTKE_LES, GUPDRAFT_MASK, & - XLES_UPDRAFT_Tke(:,NLES_CURRENT_TCOUNT) ) -! -! -! 3.3 Updraft resolved quantities -! --------------------------- -! -! -!* resolved turbulent kinetic energy -! - CALL LES_FLUX_ll ( XU_ANOM, XU_ANOM, & - GUPDRAFT_MASK, & - ZLES_UPDRAFT_U2(:) ) - - CALL LES_FLUX_ll ( XV_ANOM, XV_ANOM, & - GUPDRAFT_MASK, & - ZLES_UPDRAFT_V2(:) ) - - CALL LES_FLUX_ll ( XW_ANOM, XW_ANOM, & - GUPDRAFT_MASK, & - ZLES_UPDRAFT_W2(:) ) - - XLES_UPDRAFT_Ke(:,NLES_CURRENT_TCOUNT) = 0.5 * ( ZLES_UPDRAFT_U2(:) & - + ZLES_UPDRAFT_V2(:) & - + ZLES_UPDRAFT_W2(:) ) -! -!* vertical potential temperature flux -! - CALL LES_FLUX_ll ( XW_ANOM, ZTH_ANOM, & - GUPDRAFT_MASK, & - XLES_UPDRAFT_WTh(:,NLES_CURRENT_TCOUNT) ) -! -!* vertical liquid potential temperature flux -! - IF (LUSERC) & - CALL LES_FLUX_ll ( XW_ANOM, XTHL_ANOM, & - GUPDRAFT_MASK, & - XLES_UPDRAFT_WThl(:,NLES_CURRENT_TCOUNT) ) -! -!* vertical virtual potential temperature flux -! - IF (LUSERV) & - CALL LES_FLUX_ll ( XW_ANOM, ZTHV_ANOM, & - GUPDRAFT_MASK, & - XLES_UPDRAFT_WThv(:,NLES_CURRENT_TCOUNT) ) -! -!* potential temperature variance -! - CALL LES_FLUX_ll ( ZTH_ANOM, ZTH_ANOM, & - GUPDRAFT_MASK, & - XLES_UPDRAFT_Th2(:,NLES_CURRENT_TCOUNT) ) -! -!* liquid potential temperature variance -! - IF (LUSERC) & - CALL LES_FLUX_ll ( XTHL_ANOM, XTHL_ANOM, & - GUPDRAFT_MASK, & - XLES_UPDRAFT_Thl2(:,NLES_CURRENT_TCOUNT) ) -! -!* potential temperature - virtual potential temperature covariance -! - IF (LUSERV) & - CALL LES_FLUX_ll ( ZTH_ANOM, ZTHV_ANOM, & - GUPDRAFT_MASK, & - XLES_UPDRAFT_ThThv (:,NLES_CURRENT_TCOUNT) ) -! -!* liquid potential temperature - virtual potential temperature covariance -! - IF (LUSERC) & - CALL LES_FLUX_ll ( XTHL_ANOM, ZTHV_ANOM, & - GUPDRAFT_MASK, & - XLES_UPDRAFT_ThlThv(:,NLES_CURRENT_TCOUNT) ) -! -!* water vapor mixing ratio flux, variance and correlations -! - IF (LUSERV) THEN - CALL LES_FLUX_ll ( XW_ANOM, ZRV_ANOM, & - GUPDRAFT_MASK, & - XLES_UPDRAFT_WRv(:,NLES_CURRENT_TCOUNT) ) - ! - CALL LES_FLUX_ll ( ZRV_ANOM, ZRV_ANOM, & - GUPDRAFT_MASK, & - XLES_UPDRAFT_Rv2(:,NLES_CURRENT_TCOUNT) ) - ! - CALL LES_FLUX_ll ( ZTH_ANOM, ZRV_ANOM, & - GUPDRAFT_MASK, & - XLES_UPDRAFT_ThRv (:,NLES_CURRENT_TCOUNT) ) - ! - IF (LUSERC) & - CALL LES_FLUX_ll ( XTHL_ANOM, ZRV_ANOM, & - GUPDRAFT_MASK, & - XLES_UPDRAFT_ThlRv(:,NLES_CURRENT_TCOUNT) ) - - CALL LES_FLUX_ll ( ZTHV_ANOM, ZRV_ANOM, & - GUPDRAFT_MASK, & - XLES_UPDRAFT_ThvRv(:,NLES_CURRENT_TCOUNT) ) - END IF -! -!* cloud water mixing ratio flux -! - IF (LUSERC) THEN - CALL LES_FLUX_ll ( XW_ANOM, ZRC_ANOM, & - GUPDRAFT_MASK, & - XLES_UPDRAFT_WRc(:,NLES_CURRENT_TCOUNT) ) - ! - CALL LES_FLUX_ll ( ZRC_ANOM, ZRC_ANOM, & - GUPDRAFT_MASK, & - XLES_UPDRAFT_Rc2(:,NLES_CURRENT_TCOUNT) ) - ! - CALL LES_FLUX_ll ( ZTH_ANOM, ZRC_ANOM, & - GUPDRAFT_MASK, & - XLES_UPDRAFT_ThRc (:,NLES_CURRENT_TCOUNT) ) - ! - CALL LES_FLUX_ll ( XTHL_ANOM, ZRC_ANOM, & - GUPDRAFT_MASK, & - XLES_UPDRAFT_ThlRc(:,NLES_CURRENT_TCOUNT) ) - ! - CALL LES_FLUX_ll ( ZTHV_ANOM, ZRC_ANOM, & - GUPDRAFT_MASK, & - XLES_UPDRAFT_ThvRc(:,NLES_CURRENT_TCOUNT) ) - END IF -! -!* cloud ice mixing ratio flux -! - IF (LUSERI) THEN - CALL LES_FLUX_ll ( XW_ANOM, ZRI_ANOM, & - GUPDRAFT_MASK, & - XLES_UPDRAFT_WRi(:,NLES_CURRENT_TCOUNT) ) - ! - CALL LES_FLUX_ll ( ZRI_ANOM, ZRI_ANOM, & - GUPDRAFT_MASK, & - XLES_UPDRAFT_Ri2(:,NLES_CURRENT_TCOUNT) ) - ! - CALL LES_FLUX_ll ( ZTH_ANOM, ZRI_ANOM, & - GUPDRAFT_MASK, & - XLES_UPDRAFT_ThRi (:,NLES_CURRENT_TCOUNT) ) - ! - CALL LES_FLUX_ll ( XTHL_ANOM, ZRI_ANOM, & - GUPDRAFT_MASK, & - XLES_UPDRAFT_ThlRi(:,NLES_CURRENT_TCOUNT) ) - ! - CALL LES_FLUX_ll ( ZTHV_ANOM, ZRI_ANOM, & - GUPDRAFT_MASK, & - XLES_UPDRAFT_ThvRi(:,NLES_CURRENT_TCOUNT) ) - END IF -! -!* scalar variables flux -! - DO JSV=1,NSV - CALL LES_FLUX_ll ( XW_ANOM, XSV_ANOM(:,:,:,JSV), & - GUPDRAFT_MASK, & - XLES_UPDRAFT_WSv(:,NLES_CURRENT_TCOUNT,JSV) ) - ! - CALL LES_FLUX_ll ( XSV_ANOM(:,:,:,JSV), XSV_ANOM(:,:,:,JSV), & - GUPDRAFT_MASK, & - XLES_UPDRAFT_Sv2(:,NLES_CURRENT_TCOUNT,JSV) ) - ! - CALL LES_FLUX_ll ( ZTH_ANOM, XSV_ANOM(:,:,:,JSV), & - GUPDRAFT_MASK, & - XLES_UPDRAFT_ThSv(:,NLES_CURRENT_TCOUNT,JSV) ) - ! - IF (LUSERC) & - CALL LES_FLUX_ll ( XTHL_ANOM, XSV_ANOM(:,:,:,JSV), & - GUPDRAFT_MASK, & - XLES_UPDRAFT_ThlSv(:,NLES_CURRENT_TCOUNT,JSV) ) - ! - IF (LUSERV) & - CALL LES_FLUX_ll ( ZTHV_ANOM, XSV_ANOM(:,:,:,JSV), & - GUPDRAFT_MASK, & - XLES_UPDRAFT_ThvSv(:,NLES_CURRENT_TCOUNT,JSV) ) - END DO -! -END IF -! -!------------------------------------------------------------------------------- -! -! 4. Downdraft diagnostics -! --------------------- -! -IF (LLES_DOWNDRAFT) THEN -! - DO JK=1,NLES_K - GDOWNDRAFT_MASK(:,:,JK) = (XW_ANOM(:,:,JK) <= 0.) .AND. LLES_CURRENT_CART_MASK(:,:,JK) - END DO -! -! -! 4.1 Downdraft fraction -! ------------------ -! - ZDOWNDRAFT(:,:,:) = 0. - WHERE (GDOWNDRAFT_MASK(:,:,:)) - ZDOWNDRAFT(:,:,:) = 1. - END WHERE -! - CALL LES_MEAN_ll ( ZDOWNDRAFT, OMASK, & - XLES_DOWNDRAFT(:,NLES_CURRENT_TCOUNT) ) -! -! -! 4.2 Downdraft mean quantities -! ------------------------- -! -!* vertical wind velocity -! - CALL LES_MEAN_ll ( ZW_LES, GDOWNDRAFT_MASK, & - XLES_DOWNDRAFT_W(:,NLES_CURRENT_TCOUNT) ) -! -!* potential temperature -! - CALL LES_MEAN_ll ( ZTH_LES, GDOWNDRAFT_MASK, & - XLES_DOWNDRAFT_Th(:,NLES_CURRENT_TCOUNT) ) -! -!* liquid potential temperature -! - IF (LUSERC) & - CALL LES_MEAN_ll ( ZTHL_LES, GDOWNDRAFT_MASK, & - XLES_DOWNDRAFT_Thl(:,NLES_CURRENT_TCOUNT) ) -! -!* virtual potential temperature -! - IF (LUSERV) & - CALL LES_MEAN_ll ( ZTHV_LES, GDOWNDRAFT_MASK, & - XLES_DOWNDRAFT_Thv(:,NLES_CURRENT_TCOUNT) ) -! -!* vapor mixing ratio -! - IF (LUSERV) & - CALL LES_MEAN_ll ( ZRV_LES, GDOWNDRAFT_MASK, & - XLES_DOWNDRAFT_Rv(:,NLES_CURRENT_TCOUNT) ) -! -!* cloud water mixing ratio -! - IF (LUSERC) & - CALL LES_MEAN_ll ( ZRC_LES, GDOWNDRAFT_MASK, & - XLES_DOWNDRAFT_Rc(:,NLES_CURRENT_TCOUNT) ) -! -!* rain mixing ratio -! - IF (LUSERR) & - CALL LES_MEAN_ll ( ZRR_LES, GDOWNDRAFT_MASK, & - XLES_DOWNDRAFT_Rr(:,NLES_CURRENT_TCOUNT) ) -! -!* cloud ice mixing ratio -! - IF (LUSERI) & - CALL LES_MEAN_ll ( ZRI_LES, GDOWNDRAFT_MASK, & - XLES_DOWNDRAFT_Ri(:,NLES_CURRENT_TCOUNT) ) -! -!* snow mixing ratio -! - IF (LUSERS) & - CALL LES_MEAN_ll ( ZRS_LES, GDOWNDRAFT_MASK, & - XLES_DOWNDRAFT_Rs(:,NLES_CURRENT_TCOUNT) ) -! -!* graupel mixing ratio -! - IF (LUSERG) & - CALL LES_MEAN_ll ( ZRG_LES, GDOWNDRAFT_MASK, & - XLES_DOWNDRAFT_Rg(:,NLES_CURRENT_TCOUNT) ) -! -!* hail mixing ratio -! - IF (LUSERH) & - CALL LES_MEAN_ll ( ZRG_LES, GDOWNDRAFT_MASK, & - XLES_DOWNDRAFT_Rh(:,NLES_CURRENT_TCOUNT) ) -! -!* scalar variables -! - DO JSV=1,NSV - CALL LES_MEAN_ll ( ZSV_LES(:,:,:,JSV), GDOWNDRAFT_MASK, & - XLES_DOWNDRAFT_Sv(:,NLES_CURRENT_TCOUNT,JSV) ) - END DO -! -!* subgrid turbulent kinetic energy -! - CALL LES_MEAN_ll ( ZTKE_LES, GDOWNDRAFT_MASK, & - XLES_DOWNDRAFT_Tke(:,NLES_CURRENT_TCOUNT) ) -! -! -! 4.3 Downdraft resolved quantities -! ----------------------------- -! -!* resolved turbulent kinetic energy -! - CALL LES_FLUX_ll ( XU_ANOM, XU_ANOM, & - GDOWNDRAFT_MASK, & - ZLES_DOWNDRAFT_U2(:) ) - - CALL LES_FLUX_ll ( XV_ANOM, XV_ANOM, & - GDOWNDRAFT_MASK, & - ZLES_DOWNDRAFT_V2(:) ) - - CALL LES_FLUX_ll ( XW_ANOM, XW_ANOM, & - GDOWNDRAFT_MASK, & - ZLES_DOWNDRAFT_W2(:) ) - - XLES_DOWNDRAFT_Ke(:,NLES_CURRENT_TCOUNT) = 0.5 * ( ZLES_DOWNDRAFT_U2(:) & - + ZLES_DOWNDRAFT_V2(:) & - + ZLES_DOWNDRAFT_W2(:) ) -! -!* vertical potential temperature flux -! - CALL LES_FLUX_ll ( XW_ANOM, ZTH_ANOM, & - GDOWNDRAFT_MASK, & - XLES_DOWNDRAFT_WTh(:,NLES_CURRENT_TCOUNT) ) -! -!* vertical liquid potential temperature flux -! - IF (LUSERC) & - CALL LES_FLUX_ll ( XW_ANOM, XTHL_ANOM, & - GDOWNDRAFT_MASK, & - XLES_DOWNDRAFT_WThl(:,NLES_CURRENT_TCOUNT) ) -! -!* vertical virtual potential temperature flux -! - IF (LUSERV) & - CALL LES_FLUX_ll ( XW_ANOM, ZTHV_ANOM, & - GDOWNDRAFT_MASK, & - XLES_DOWNDRAFT_WThv(:,NLES_CURRENT_TCOUNT) ) -! -!* potential temperature variance -! - CALL LES_FLUX_ll ( ZTH_ANOM, ZTH_ANOM, & - GDOWNDRAFT_MASK, & - XLES_DOWNDRAFT_Th2(:,NLES_CURRENT_TCOUNT) ) -! -!* liquid potential temperature variance -! - IF (LUSERC) & - CALL LES_FLUX_ll ( XTHL_ANOM, XTHL_ANOM, & - GDOWNDRAFT_MASK, & - XLES_DOWNDRAFT_Thl2(:,NLES_CURRENT_TCOUNT) ) -! -!* potential temperature - virtual potential temperature covariance -! - IF (LUSERV) & - CALL LES_FLUX_ll ( ZTH_ANOM, ZTHV_ANOM, & - GDOWNDRAFT_MASK, & - XLES_DOWNDRAFT_ThThv (:,NLES_CURRENT_TCOUNT) ) -! -!* liquid potential temperature - virtual potential temperature covariance -! - IF (LUSERC) & - CALL LES_FLUX_ll ( XTHL_ANOM, ZTHV_ANOM, & - GDOWNDRAFT_MASK, & - XLES_DOWNDRAFT_ThlThv(:,NLES_CURRENT_TCOUNT) ) -! -! -!* water vapor mixing ratio flux, variance and correlations -! - IF (LUSERV) THEN - CALL LES_FLUX_ll ( XW_ANOM, ZRV_ANOM, & - GDOWNDRAFT_MASK, & - XLES_DOWNDRAFT_WRv(:,NLES_CURRENT_TCOUNT) ) - ! - CALL LES_FLUX_ll ( ZRV_ANOM, ZRV_ANOM, & - GDOWNDRAFT_MASK, & - XLES_DOWNDRAFT_Rv2(:,NLES_CURRENT_TCOUNT) ) - ! - CALL LES_FLUX_ll ( ZTH_ANOM, ZRV_ANOM, & - GDOWNDRAFT_MASK, & - XLES_DOWNDRAFT_ThRv (:,NLES_CURRENT_TCOUNT) ) - ! - CALL LES_FLUX_ll ( ZTHV_ANOM, ZRV_ANOM, & - GDOWNDRAFT_MASK, & - XLES_DOWNDRAFT_ThvRv(:,NLES_CURRENT_TCOUNT) ) - ! - IF (LUSERC) & - CALL LES_FLUX_ll ( XTHL_ANOM, ZRV_ANOM, & - GDOWNDRAFT_MASK, & - XLES_DOWNDRAFT_ThlRv(:,NLES_CURRENT_TCOUNT) ) - END IF -! -!* cloud water mixing ratio flux -! - IF (LUSERC) THEN - CALL LES_FLUX_ll ( XW_ANOM, ZRC_ANOM, & - GDOWNDRAFT_MASK, & - XLES_DOWNDRAFT_WRc(:,NLES_CURRENT_TCOUNT) ) - ! - CALL LES_FLUX_ll ( ZRC_ANOM, ZRC_ANOM, & - GDOWNDRAFT_MASK, & - XLES_DOWNDRAFT_Rc2(:,NLES_CURRENT_TCOUNT) ) - ! - CALL LES_FLUX_ll ( ZTH_ANOM, ZRC_ANOM, & - GDOWNDRAFT_MASK, & - XLES_DOWNDRAFT_ThRc (:,NLES_CURRENT_TCOUNT) ) - ! - CALL LES_FLUX_ll ( ZTHV_ANOM, ZRC_ANOM, & - GDOWNDRAFT_MASK, & - XLES_DOWNDRAFT_ThvRc(:,NLES_CURRENT_TCOUNT) ) - ! - CALL LES_FLUX_ll ( XTHL_ANOM, ZRC_ANOM, & - GDOWNDRAFT_MASK, & - XLES_DOWNDRAFT_ThlRc(:,NLES_CURRENT_TCOUNT) ) - END IF -! -!* cloud ice mixing ratio flux -! - IF (LUSERI) THEN - CALL LES_FLUX_ll ( XW_ANOM, ZRI_ANOM, & - GDOWNDRAFT_MASK, & - XLES_DOWNDRAFT_WRi(:,NLES_CURRENT_TCOUNT) ) - ! - CALL LES_FLUX_ll ( ZRI_ANOM, ZRI_ANOM, & - GDOWNDRAFT_MASK, & - XLES_DOWNDRAFT_Ri2(:,NLES_CURRENT_TCOUNT) ) - ! - CALL LES_FLUX_ll ( ZTH_ANOM, ZRI_ANOM, & - GDOWNDRAFT_MASK, & - XLES_DOWNDRAFT_ThRi (:,NLES_CURRENT_TCOUNT) ) - ! - CALL LES_FLUX_ll ( ZTHV_ANOM, ZRI_ANOM, & - GDOWNDRAFT_MASK, & - XLES_DOWNDRAFT_ThvRi(:,NLES_CURRENT_TCOUNT) ) - ! - CALL LES_FLUX_ll ( XTHL_ANOM, ZRI_ANOM, & - GDOWNDRAFT_MASK, & - XLES_DOWNDRAFT_ThlRi(:,NLES_CURRENT_TCOUNT) ) - END IF -! -!* scalar variables flux -! - DO JSV=1,NSV - CALL LES_FLUX_ll ( XW_ANOM, XSV_ANOM(:,:,:,JSV), & - GDOWNDRAFT_MASK, & - XLES_DOWNDRAFT_WSv(:,NLES_CURRENT_TCOUNT,JSV) ) - ! - CALL LES_FLUX_ll ( XSV_ANOM(:,:,:,JSV), XSV_ANOM(:,:,:,JSV), & - GDOWNDRAFT_MASK, & - XLES_DOWNDRAFT_Sv2(:,NLES_CURRENT_TCOUNT,JSV) ) - ! - CALL LES_FLUX_ll ( ZTH_ANOM, XSV_ANOM(:,:,:,JSV), & - GDOWNDRAFT_MASK, & - XLES_DOWNDRAFT_ThSv(:,NLES_CURRENT_TCOUNT,JSV) ) - ! - IF (LUSERC) & - CALL LES_FLUX_ll ( XTHL_ANOM, XSV_ANOM(:,:,:,JSV), & - GDOWNDRAFT_MASK, & - XLES_DOWNDRAFT_ThlSv(:,NLES_CURRENT_TCOUNT,JSV) ) - ! - IF (LUSERV) & - CALL LES_FLUX_ll ( ZTHV_ANOM, XSV_ANOM(:,:,:,JSV), & - GDOWNDRAFT_MASK, & - XLES_DOWNDRAFT_ThvSv(:,NLES_CURRENT_TCOUNT,JSV) ) - END DO -! -END IF -! -!------------------------------------------------------------------------------- -! -! 5. surface or 2D variables (only for the cartesian mask) -! ----------------------- -! -!* surface flux of temperature Qo -! -CALL LES_MEAN_MPROC ( XLES_Q0 (NLES_CURRENT_TCOUNT), IAVG_PTS(1), IUND_PTS(1) ) -! -!* surface flux of water vapor Eo -! -CALL LES_MEAN_MPROC ( XLES_E0 (NLES_CURRENT_TCOUNT), IAVG_PTS(1), IUND_PTS(1) ) -! -!* surface flux for scalar variables -! -DO JSV=1,NSV - CALL LES_MEAN_MPROC ( XLES_SV0 (NLES_CURRENT_TCOUNT,JSV), IAVG_PTS(1), IUND_PTS(1) ) -END DO -! -!* surface flux of U wind component -! -CALL LES_MEAN_MPROC ( XLES_UW0 (NLES_CURRENT_TCOUNT), IAVG_PTS(1), IUND_PTS(1) ) -! -!* surface flux of V wind component -! -CALL LES_MEAN_MPROC ( XLES_VW0 (NLES_CURRENT_TCOUNT), IAVG_PTS(1), IUND_PTS(1) ) -! -!* friction velocity u* -! -!* average of local u* -!!CALL LES_MEAN_MPROC ( XLES_USTAR(NLES_CURRENT_TCOUNT), IAVG_PTS(1), IUND_PTS(1) ) -!* or true global u* -XLES_USTAR(NLES_CURRENT_TCOUNT) = SQRT(SQRT(XLES_UW0(NLES_CURRENT_TCOUNT)**2 & - +XLES_VW0(NLES_CURRENT_TCOUNT)**2 )) -! -!* Boundary layer height -! -IF (CBL_HEIGHT_DEF=='WTV') THEN -! -!* level where temperature flux is minimum -! -ALLOCATE(ZWORK(SIZE(XLES_SUBGRID_WTHVMF(:,NLES_CURRENT_TCOUNT,IMASK),1))) -ZWORK=XLES_SUBGRID_WTHVMF(:,NLES_CURRENT_TCOUNT,IMASK) -WHERE(ZWORK==XUNDEF) ZWORK=0. - - IF (LUSERC) THEN - IKMIN_FLUX = MINLOC( XLES_RESOLVED_WThv(:,NLES_CURRENT_TCOUNT,1) & - + XLES_SUBGRID_WThl (:,NLES_CURRENT_TCOUNT,1) & - + ZWORK & ! flux if EDKF - + (XRV/XRD - 1.) *( XLES_SUBGRID_WRt (:,NLES_CURRENT_TCOUNT,1) & - -XLES_SUBGRID_WRc (:,NLES_CURRENT_TCOUNT,1)) ) - ELSE IF (LUSERV) THEN - IKMIN_FLUX = MINLOC( XLES_RESOLVED_WThv(:,NLES_CURRENT_TCOUNT,1) & - + ZWORK & ! flux if EDKF - + XLES_SUBGRID_WThl (:,NLES_CURRENT_TCOUNT,1) & - + (XRV/XRD - 1.) * XLES_SUBGRID_WRt (:,NLES_CURRENT_TCOUNT,1) ) - ELSE - IKMIN_FLUX = MINLOC( XLES_RESOLVED_WTh(:,NLES_CURRENT_TCOUNT,1) & - + ZWORK & ! flux if EDKF - + XLES_SUBGRID_WThl(:,NLES_CURRENT_TCOUNT,1) ) - END IF -DEALLOCATE(ZWORK) -! -!* boundary layer height -! - XLES_BL_HEIGHT(NLES_CURRENT_TCOUNT) = XLES_Z(IKMIN_FLUX(1)) - XLES_ZS -! -ELSE IF (CBL_HEIGHT_DEF=='DTH') THEN - IKMAX_TH=MAXLOC( ZLES_MEAN_DTHDZ(:)) - XLES_BL_HEIGHT(NLES_CURRENT_TCOUNT) = XLES_Z(IKMAX_TH(1)) - XLES_ZS -! -ELSE IF (CBL_HEIGHT_DEF=='KE ') THEN - - XLES_BL_HEIGHT(NLES_CURRENT_TCOUNT) = XLES_Z(NLES_K) - XLES_ZS -! -!* total Turbulent Kinetic Energy -! - ZKE_TOT(:) = 0. -! - ZKE_TOT(:) = ZKE_TOT(:) + XLES_SUBGRID_TKE (:,NLES_CURRENT_TCOUNT,1) -! - IF (CTURBLEN/='BL89' .AND. CTURBLEN/='RM17' .AND. LLES_RESOLVED) & - ZKE_TOT(:) = ZKE_TOT(:) + XLES_RESOLVED_KE(:,NLES_CURRENT_TCOUNT,1) -! - ZINT_KE_TOT = 0. -! -!* integration of total kinetic energy on boundary layer depth -! - ZINT_KE_TOT = ZINT_KE_TOT +XLES_Z(1)*ZKE_TOT(1) - DO JK=1,NLES_K-1 - ZINT_KE_TOT = ZINT_KE_TOT + (XLES_Z(JK+1)-XLES_Z(JK)) & - * 0.5 *( ZKE_TOT(JK+1) + ZKE_TOT(JK) ) -! -!* test of total kinetic energy smaller than 5% of the averaged value below -! - IF ( ZKE_TOT(JK+1) < 0.05 * ZINT_KE_TOT / (XLES_Z(JK+1)-XLES_Z(1)) ) THEN - XLES_BL_HEIGHT(NLES_CURRENT_TCOUNT) = XLES_Z(JK) - XLES_ZS - EXIT - END IF -! - END DO -! -ELSE IF (CBL_HEIGHT_DEF=='TKE') THEN - - XLES_BL_HEIGHT(NLES_CURRENT_TCOUNT) = XLES_Z(NLES_K) - XLES_ZS -! -!* subgrid Turbulent Kinetic Energy -! - ZKE_TOT(:) = XLES_SUBGRID_TKE (:,NLES_CURRENT_TCOUNT,1) -! - ZINT_KE_TOT = 0. -! -!* integration of subgrid kinetic energy on boundary layer depth -! - DO JK=1,NLES_K-1 - ZINT_KE_TOT = ZINT_KE_TOT + (XLES_Z(JK+1)-XLES_Z(JK)) & - * 0.5 *( ZKE_TOT(JK+1) + ZKE_TOT(JK) ) -! -!* test of subgrid kinetic energy smaller than 0.1% of the averaged value below -! - IF ( ZKE_TOT(JK+1) < 0.001 * ZINT_KE_TOT / (XLES_Z(JK+1)-XLES_Z(1)) ) THEN - XLES_BL_HEIGHT(NLES_CURRENT_TCOUNT) = XLES_Z(JK) - XLES_ZS - EXIT - END IF - END DO -ELSE IF (CBL_HEIGHT_DEF=='FRI') THEN - ZFRIC_LES = SQRT( ( XLES_SUBGRID_WU (:,NLES_CURRENT_TCOUNT,1) & - +XLES_RESOLVED_WU(:,NLES_CURRENT_TCOUNT,1))**2 & - +( XLES_SUBGRID_WV (:,NLES_CURRENT_TCOUNT,1) & - +XLES_RESOLVED_WV(:,NLES_CURRENT_TCOUNT,1))**2 ) - ZFRIC_SURF = XLES_USTAR(NLES_CURRENT_TCOUNT)**2 - CALL BL_DEPTH_DIAG(YLDIMPHYEX,ZFRIC_SURF, XLES_ZS, & - ZFRIC_LES, XLES_Z, & - XFTOP_O_FSURF,XLES_BL_HEIGHT(NLES_CURRENT_TCOUNT)) -END IF -! -! -!* integration of total kinetic energy on boundary layer depth -! -XLES_INT_TKE(NLES_CURRENT_TCOUNT)=ZINT_KE_TOT - !* integration of tke - ZTKET_LES(:,:) = 0. - DO JK=1,NLES_K-1 - ZKE_LES(:,:,JK)=0.5*(XU_ANOM(:,:,JK)*XU_ANOM(:,:,JK)+& - XV_ANOM(:,:,JK)*XV_ANOM(:,:,JK)+XW_ANOM(:,:,JK)*XW_ANOM(:,:,JK)) - - ZTKET_LES(:,:) = ZTKET_LES(:,:) + (ZZZ_LES(:,:,JK+1)-ZZZ_LES(:,:,JK)) & - * (ZTKE_LES(:,:,JK)+ZKE_LES(:,:,JK)) - END DO - CALL LES_MEAN_ll ( ZTKET_LES, LLES_CURRENT_CART_MASK(:,:,1), & - XLES_INT_TKE(NLES_CURRENT_TCOUNT) ) -! -!* convective velocity -! -XLES_WSTAR(NLES_CURRENT_TCOUNT) = 0. -! -IF ( XLES_Q0(NLES_CURRENT_TCOUNT) & - + (XRV/XRD-1.)*XLES_E0(NLES_CURRENT_TCOUNT) >0.) THEN - IF (LUSERV) THEN - XLES_WSTAR(NLES_CURRENT_TCOUNT) = & - ( XG / XLES_MEAN_Thv (1,NLES_CURRENT_TCOUNT,1) & - * ( XLES_Q0( NLES_CURRENT_TCOUNT ) & - + (XRV/XRD - 1.) * XLES_E0( NLES_CURRENT_TCOUNT )) & - * XLES_BL_HEIGHT( NLES_CURRENT_TCOUNT ) & - ) ** (1./3.) - ELSE - XLES_WSTAR(NLES_CURRENT_TCOUNT) = & - ( XG / XLES_MEAN_Th (1,NLES_CURRENT_TCOUNT,1) & - * ( XLES_Q0( NLES_CURRENT_TCOUNT ) & - + (XRV/XRD - 1.) * XLES_E0( NLES_CURRENT_TCOUNT )) & - * XLES_BL_HEIGHT( NLES_CURRENT_TCOUNT ) & - ) ** (1./3.) - END IF -END IF -! -!* cloud base height - IF (LUSERC) THEN - ZINT_RHOKE =0. - JJ=1 - DO JI=1,NLES_K - IF ((ZINT_RHOKE .EQ. 0) .AND. & - (XLES_MEAN_RC(JI,NLES_CURRENT_TCOUNT,1) .GT. 1.E-6)) THEN - ZINT_RHOKE=1. - JJ=JI - END IF - END DO - XLES_ZCB(NLES_CURRENT_TCOUNT)= XLES_Z(JJ)-XLES_ZS - ENDIF -! -!* height of max of cf - IF (LUSERC) THEN - IKMAX_CF= MAXLOC( XLES_MEAN_INDCf(:,NLES_CURRENT_TCOUNT,1)) - XLES_ZMAXCF(NLES_CURRENT_TCOUNT) = XLES_Z(IKMAX_CF(1)) - XLES_ZS - IKMAX_CF= MAXLOC( XLES_MEAN_INDCf2(:,NLES_CURRENT_TCOUNT,1)) - XLES_ZMAXCF2(NLES_CURRENT_TCOUNT) = XLES_Z(IKMAX_CF(1)) - XLES_ZS - ENDIF -! -!* Monin-Obukhov length -! -XLES_MO_LENGTH(NLES_CURRENT_TCOUNT) = 0. -! -IF (LUSERV) THEN - IF ( XLES_Q0(NLES_CURRENT_TCOUNT)+(XRV/XRD-1.)*XLES_E0(NLES_CURRENT_TCOUNT) /=0. )& - XLES_MO_LENGTH(NLES_CURRENT_TCOUNT) = (- (XLES_USTAR(NLES_CURRENT_TCOUNT))**3) & - / (XKARMAN*( XLES_Q0(NLES_CURRENT_TCOUNT) & - +(XRV/XRD-1.)*XLES_E0(NLES_CURRENT_TCOUNT)) & - *XG/XLES_MEAN_Thv(1,NLES_CURRENT_TCOUNT,1) ) -ELSE - IF ( XLES_Q0(NLES_CURRENT_TCOUNT) /=0. ) & - XLES_MO_LENGTH(NLES_CURRENT_TCOUNT) = (- (XLES_USTAR(NLES_CURRENT_TCOUNT))**3) & - / (XKARMAN*XLES_Q0(NLES_CURRENT_TCOUNT) & - *XG/XLES_MEAN_Th(1,NLES_CURRENT_TCOUNT,1) ) -END IF -! -!------------------------------------------------------------------------------- -! -! 6. correlations along x and y axes -! ------------------------------- -! -!* u * u -! -DO JK=1,NSPECTRA_K - CALL LES_HOR_CORR( ZU_SPEC(:,:,JK), ZU_SPEC(:,:,JK), & - CLES_LBCX , CLES_LBCY, & - XCORRi_UU(:,JK,NLES_CURRENT_TCOUNT), & - XCORRj_UU(:,JK,NLES_CURRENT_TCOUNT) ) -END DO -! -!* v * v -! -DO JK=1,NSPECTRA_K - CALL LES_HOR_CORR( ZV_SPEC(:,:,JK), ZV_SPEC(:,:,JK), & - CLES_LBCX , CLES_LBCY, & - XCORRi_VV(:,JK,NLES_CURRENT_TCOUNT), & - XCORRj_VV(:,JK,NLES_CURRENT_TCOUNT) ) -END DO -! -!* u * v -! -DO JK=1,NSPECTRA_K - CALL LES_HOR_CORR( ZU_SPEC(:,:,JK), ZV_SPEC(:,:,JK), & - CLES_LBCX , CLES_LBCY, & - XCORRi_UV(:,JK,NLES_CURRENT_TCOUNT), & - XCORRj_UV(:,JK,NLES_CURRENT_TCOUNT) ) -END DO -! -!* w * u -! -DO JK=1,NSPECTRA_K - CALL LES_HOR_CORR( ZW_SPEC(:,:,JK), ZU_SPEC(:,:,JK), & - CLES_LBCX , CLES_LBCY, & - XCORRi_WU(:,JK,NLES_CURRENT_TCOUNT), & - XCORRj_WU(:,JK,NLES_CURRENT_TCOUNT) ) -END DO -! -!* w * v -! -DO JK=1,NSPECTRA_K - CALL LES_HOR_CORR( ZW_SPEC(:,:,JK), ZV_SPEC(:,:,JK), & - CLES_LBCX , CLES_LBCY, & - XCORRi_WV(:,JK,NLES_CURRENT_TCOUNT), & - XCORRj_WV(:,JK,NLES_CURRENT_TCOUNT) ) -END DO -! -!* w * w -! -DO JK=1,NSPECTRA_K - CALL LES_HOR_CORR( ZW_SPEC(:,:,JK), ZW_SPEC(:,:,JK), & - CLES_LBCX , CLES_LBCY, & - XCORRi_WW(:,JK,NLES_CURRENT_TCOUNT), & - XCORRj_WW(:,JK,NLES_CURRENT_TCOUNT) ) -END DO -! -!* w * th -! -DO JK=1,NSPECTRA_K - CALL LES_HOR_CORR( ZW_SPEC(:,:,JK), ZTH_SPEC(:,:,JK), & - CLES_LBCX , CLES_LBCY, & - XCORRi_WTh(:,JK,NLES_CURRENT_TCOUNT), & - XCORRj_WTh(:,JK,NLES_CURRENT_TCOUNT) ) -END DO -! -!* w * thl -! -DO JK=1,NSPECTRA_K - IF (LUSERC) & - CALL LES_HOR_CORR( ZW_SPEC(:,:,JK), ZTHL_SPEC(:,:,JK), & - CLES_LBCX , CLES_LBCY, & - XCORRi_WThl(:,JK,NLES_CURRENT_TCOUNT), & - XCORRj_WThl(:,JK,NLES_CURRENT_TCOUNT) ) -END DO -! -!* th * th -! -DO JK=1,NSPECTRA_K - CALL LES_HOR_CORR( ZTH_SPEC(:,:,JK), ZTH_SPEC(:,:,JK), & - CLES_LBCX , CLES_LBCY, & - XCORRi_ThTh(:,JK,NLES_CURRENT_TCOUNT), & - XCORRj_ThTh(:,JK,NLES_CURRENT_TCOUNT) ) -END DO -! -!* thl * thl -! -DO JK=1,NSPECTRA_K - IF (LUSERC) & - CALL LES_HOR_CORR( ZTHL_SPEC(:,:,JK), ZTHL_SPEC(:,:,JK), & - CLES_LBCX , CLES_LBCY, & - XCORRi_ThlThl(:,JK,NLES_CURRENT_TCOUNT), & - XCORRj_ThlThl(:,JK,NLES_CURRENT_TCOUNT) ) -END DO -! -!* correlations with water vapor -! -IF (LUSERV) THEN - DO JK=1,NSPECTRA_K - CALL LES_HOR_CORR( ZW_SPEC(:,:,JK), ZRV_SPEC(:,:,JK), & - CLES_LBCX , CLES_LBCY, & - XCORRi_WRv(:,JK,NLES_CURRENT_TCOUNT), & - XCORRj_WRv(:,JK,NLES_CURRENT_TCOUNT) ) - END DO - ! - DO JK=1,NSPECTRA_K - CALL LES_HOR_CORR( ZTH_SPEC(:,:,JK), ZRV_SPEC(:,:,JK), & - CLES_LBCX , CLES_LBCY, & - XCORRi_ThRv(:,JK,NLES_CURRENT_TCOUNT), & - XCORRj_ThRv(:,JK,NLES_CURRENT_TCOUNT) ) - END DO - ! - DO JK=1,NSPECTRA_K - IF (LUSERC) & - CALL LES_HOR_CORR( ZTHL_SPEC(:,:,JK), ZRV_SPEC(:,:,JK), & - CLES_LBCX , CLES_LBCY, & - XCORRi_ThlRv(:,JK,NLES_CURRENT_TCOUNT), & - XCORRj_ThlRv(:,JK,NLES_CURRENT_TCOUNT) ) - END DO - ! - DO JK=1,NSPECTRA_K - CALL LES_HOR_CORR( ZRV_SPEC(:,:,JK), ZRV_SPEC(:,:,JK), & - CLES_LBCX , CLES_LBCY, & - XCORRi_RvRv(:,JK,NLES_CURRENT_TCOUNT), & - XCORRj_RvRv(:,JK,NLES_CURRENT_TCOUNT) ) - END DO -END IF -! -! -!* correlations with cloud water -! -IF (LUSERC) THEN - DO JK=1,NSPECTRA_K - CALL LES_HOR_CORR( ZW_SPEC(:,:,JK), ZRC_SPEC(:,:,JK), & - CLES_LBCX , CLES_LBCY, & - XCORRi_WRc(:,JK,NLES_CURRENT_TCOUNT), & - XCORRj_WRc(:,JK,NLES_CURRENT_TCOUNT) ) - END DO - ! - DO JK=1,NSPECTRA_K - CALL LES_HOR_CORR( ZTH_SPEC(:,:,JK), ZRC_SPEC(:,:,JK), & - CLES_LBCX , CLES_LBCY, & - XCORRi_ThRc(:,JK,NLES_CURRENT_TCOUNT), & - XCORRj_ThRc(:,JK,NLES_CURRENT_TCOUNT) ) - END DO - ! - DO JK=1,NSPECTRA_K - CALL LES_HOR_CORR( ZTHL_SPEC(:,:,JK), ZRC_SPEC(:,:,JK), & - CLES_LBCX , CLES_LBCY, & - XCORRi_ThlRc(:,JK,NLES_CURRENT_TCOUNT), & - XCORRj_ThlRc(:,JK,NLES_CURRENT_TCOUNT) ) - END DO - ! - DO JK=1,NSPECTRA_K - CALL LES_HOR_CORR( ZRC_SPEC(:,:,JK), ZRC_SPEC(:,:,JK), & - CLES_LBCX , CLES_LBCY, & - XCORRi_RcRc(:,JK,NLES_CURRENT_TCOUNT), & - XCORRj_RcRc(:,JK,NLES_CURRENT_TCOUNT) ) - END DO -END IF -! -!* correlations with cloud ice -! -IF (LUSERI) THEN - DO JK=1,NSPECTRA_K - CALL LES_HOR_CORR( ZW_SPEC(:,:,JK), ZRI_SPEC(:,:,JK), & - CLES_LBCX , CLES_LBCY, & - XCORRi_WRi(:,JK,NLES_CURRENT_TCOUNT), & - XCORRj_WRi(:,JK,NLES_CURRENT_TCOUNT) ) - END DO - ! - DO JK=1,NSPECTRA_K - CALL LES_HOR_CORR( ZTH_SPEC(:,:,JK), ZRI_SPEC(:,:,JK), & - CLES_LBCX , CLES_LBCY, & - XCORRi_ThRi(:,JK,NLES_CURRENT_TCOUNT), & - XCORRj_ThRi(:,JK,NLES_CURRENT_TCOUNT) ) - END DO - ! - DO JK=1,NSPECTRA_K - CALL LES_HOR_CORR( ZTHL_SPEC(:,:,JK), ZRI_SPEC(:,:,JK), & - CLES_LBCX , CLES_LBCY, & - XCORRi_ThlRi(:,JK,NLES_CURRENT_TCOUNT), & - XCORRj_ThlRi(:,JK,NLES_CURRENT_TCOUNT) ) - END DO - ! - DO JK=1,NSPECTRA_K - CALL LES_HOR_CORR( ZRI_SPEC(:,:,JK), ZRI_SPEC(:,:,JK), & - CLES_LBCX , CLES_LBCY, & - XCORRi_RiRi(:,JK,NLES_CURRENT_TCOUNT), & - XCORRj_RiRi(:,JK,NLES_CURRENT_TCOUNT) ) - END DO -END IF -! -!* correlations with scalar variables -! -DO JSV=1,NSV - DO JK=1,NSPECTRA_K - CALL LES_HOR_CORR( ZW_SPEC(:,:,JK), ZSV_SPEC(:,:,JK,JSV), & - CLES_LBCX , CLES_LBCY, & - XCORRi_WSv(:,JK,NLES_CURRENT_TCOUNT,JSV), & - XCORRj_WSv(:,JK,NLES_CURRENT_TCOUNT,JSV) ) - END DO - ! - DO JK=1,NSPECTRA_K - CALL LES_HOR_CORR( ZSV_SPEC(:,:,JK,JSV), ZSV_SPEC(:,:,JK,JSV), & - CLES_LBCX , CLES_LBCY, & - XCORRi_SvSv(:,JK,NLES_CURRENT_TCOUNT,JSV), & - XCORRj_SvSv(:,JK,NLES_CURRENT_TCOUNT,JSV) ) - END DO -END DO -! -!------------------------------------------------------------------------------- -! -END SUBROUTINE LES -! -!------------------------------------------------------------------------------- -! -END SUBROUTINE LES_n diff --git a/src/mesonh/ext/modn_turbn.f90 b/src/mesonh/ext/modn_turbn.f90 deleted file mode 100644 index 35b271f9cbf2fd0634245e495fa635e44220815b..0000000000000000000000000000000000000000 --- a/src/mesonh/ext/modn_turbn.f90 +++ /dev/null @@ -1,167 +0,0 @@ -!MNH_LIC Copyright 1995-2021 CNRS, Meteo-France and Universite Paul Sabatier -!MNH_LIC This is part of the Meso-NH software governed by the CeCILL-C licence -!MNH_LIC version 1. See LICENSE, CeCILL-C_V1-en.txt and CeCILL-C_V1-fr.txt -!MNH_LIC for details. version 1. -!----------------------------------------------------------------- -! ################### - MODULE MODN_TURB_n -! ################### -! -!!**** *MODN_TURB$n* - declaration of namelist NAM_TURBn -!! -!! PURPOSE -!! ------- -! The purpose of this module is to specify the namelist NAM_TURBn -! which concern the parameters of the turbulence scheme for one nested -! model. -! -!! -!!** IMPLICIT ARGUMENTS -!! ------------------ -!! Module MODD_TURB$n : contains declaration of turbulence scheme -!! variables entering by a namelist -!! -!! XIMPL,CTURBLEN,CTURBDIM,LTURB_FLX -!! LTURB_DIAG,LSUBG_COND,LTGT_FLX -!! -!! REFERENCE -!! --------- -!! Book2 of documentation of Meso-NH (module MODD_TURBn) -!! -!! AUTHOR -!! ------ -!! J. Cuxart and J. Stein * I.N.M. and Meteo-France * -!! -!! MODIFICATIONS -!! ------------- -!! Original January 9, 1995 -!! J.Cuxart February 15, 1995 add the switches for diagnostic storages -!! J. Stein June 14, 1995 add the subgrid condensation switch -!! J. Stein October, 1999 add the tangential fluxes switch -!! M. Tomasini Jul 05, 2001 add the subgrid autoconversion -!! P. Bechtold Feb 11, 2002 add switch for Sigma_s computation -!! P. Jabouille Apr 4, 2002 add switch for Sigma_s convection -!! V. Masson Nov 13 2002 add switch for SBL lengths -!! D. Ricard May, 2021 add switch for Leonard Terms -!------------------------------------------------------------------------------- -! -!* 0. DECLARATIONS -! ------------ -! -USE MODD_TURB_n, ONLY: & - XIMPL_n => XIMPL, & - XKEMIN_n => XKEMIN, & - XCEDIS_n => XCEDIS, & - XCADAP_n => XCADAP, & - CTURBLEN_n => CTURBLEN, & - CTURBDIM_n => CTURBDIM, & - LTURB_FLX_n => LTURB_FLX, & - LTURB_DIAG_n => LTURB_DIAG, & - LSUBG_COND_n => LSUBG_COND, & - LSIGMAS_n => LSIGMAS, & - LSIG_CONV_n => LSIG_CONV, & - LRMC01_n => LRMC01, & - CTOM_n => CTOM, & - CSUBG_AUCV_n => CSUBG_AUCV, & - VSIGQSAT_n => VSIGQSAT, & - CSUBG_AUCV_RI_n => CSUBG_AUCV_RI, & - CCONDENS_n => CCONDENS, & - CLAMBDA3_n => CLAMBDA3, & - CSUBG_MF_PDF_n => CSUBG_MF_PDF, & - LLEONARD_n => LLEONARD, & - XCOEFHGRADTHL_n => XCOEFHGRADTHL, & - XCOEFHGRADRM_n => XCOEFHGRADRM, & - XALTHGRAD_n => XALTHGRAD, & - XCLDTHOLD_n => XCLDTHOLD -! -IMPLICIT NONE -! -REAL,SAVE :: XIMPL -REAL,SAVE :: XKEMIN -REAL,SAVE :: XCEDIS -REAL,SAVE :: XCADAP -CHARACTER (LEN=4),SAVE :: CTURBLEN -CHARACTER (LEN=4),SAVE :: CTURBDIM -LOGICAL,SAVE :: LTURB_FLX -LOGICAL,SAVE :: LTURB_DIAG -LOGICAL,SAVE :: LSUBG_COND -LOGICAL,SAVE :: LSIGMAS -LOGICAL,SAVE :: LSIG_CONV -LOGICAL,SAVE :: LRMC01 -CHARACTER (LEN=4),SAVE :: CTOM -CHARACTER (LEN=4),SAVE :: CSUBG_AUCV -CHARACTER (LEN=80),SAVE :: CSUBG_AUCV_RI -CHARACTER (LEN=80),SAVE :: CCONDENS -CHARACTER (LEN=4),SAVE :: CLAMBDA3 -CHARACTER (LEN=80),SAVE :: CSUBG_MF_PDF -REAL,SAVE :: VSIGQSAT -LOGICAL,SAVE :: LLEONARD -REAL,SAVE :: XCOEFHGRADTHL -REAL,SAVE :: XCOEFHGRADRM -REAL,SAVE :: XALTHGRAD -REAL,SAVE :: XCLDTHOLD -! -NAMELIST/NAM_TURBn/XIMPL,CTURBLEN,CTURBDIM,LTURB_FLX,LTURB_DIAG, & - LSUBG_COND,LSIGMAS,LSIG_CONV,LRMC01,CTOM,CSUBG_AUCV,& - XKEMIN,VSIGQSAT,XCEDIS,XCADAP,CSUBG_AUCV_RI,CCONDENS,& - CLAMBDA3,CSUBG_MF_PDF,LLEONARD,XCOEFHGRADTHL, XCOEFHGRADRM, & - XALTHGRAD, XCLDTHOLD - -! -CONTAINS -! -SUBROUTINE INIT_NAM_TURBn - XIMPL = XIMPL_n - XKEMIN = XKEMIN_n - XCEDIS = XCEDIS_n - XCADAP = XCADAP_n - CTURBLEN = CTURBLEN_n - CTURBDIM = CTURBDIM_n - LTURB_FLX = LTURB_FLX_n - LTURB_DIAG = LTURB_DIAG_n - LSUBG_COND = LSUBG_COND_n - LSIGMAS = LSIGMAS_n - LSIG_CONV = LSIG_CONV_n - LRMC01 = LRMC01_n - CTOM = CTOM_n - CSUBG_AUCV = CSUBG_AUCV_n - VSIGQSAT = VSIGQSAT_n - CSUBG_AUCV_RI = CSUBG_AUCV_RI_n - CCONDENS = CCONDENS_n - CLAMBDA3 = CLAMBDA3_n - CSUBG_MF_PDF = CSUBG_MF_PDF_n - LLEONARD = LLEONARD_n - XCOEFHGRADTHL = XCOEFHGRADTHL_n - XCOEFHGRADRM = XCOEFHGRADRM_n - XALTHGRAD = XALTHGRAD_n - XCLDTHOLD = XCLDTHOLD_n -END SUBROUTINE INIT_NAM_TURBn - -SUBROUTINE UPDATE_NAM_TURBn - XIMPL_n = XIMPL - XKEMIN_n = XKEMIN - XCEDIS_n = XCEDIS - XCADAP_n = XCADAP - CTURBLEN_n = CTURBLEN - CTURBDIM_n = CTURBDIM - LTURB_FLX_n = LTURB_FLX - LTURB_DIAG_n = LTURB_DIAG - LSUBG_COND_n = LSUBG_COND - LSIGMAS_n = LSIGMAS - LSIG_CONV_n = LSIG_CONV - LRMC01_n = LRMC01 - CTOM_n = CTOM - CSUBG_AUCV_n = CSUBG_AUCV - VSIGQSAT_n = VSIGQSAT - CSUBG_AUCV_RI_n = CSUBG_AUCV_RI - CCONDENS_n = CCONDENS - CLAMBDA3_n = CLAMBDA3 - CSUBG_MF_PDF_n = CSUBG_MF_PDF - LLEONARD_n = LLEONARD - XCOEFHGRADTHL_n = XCOEFHGRADTHL - XCOEFHGRADRM_n = XCOEFHGRADRM - XALTHGRAD_n = XALTHGRAD - XCLDTHOLD_n = XCLDTHOLD -END SUBROUTINE UPDATE_NAM_TURBn - -END MODULE MODN_TURB_n diff --git a/src/mesonh/ext/phys_paramn.f90 b/src/mesonh/ext/phys_paramn.f90 deleted file mode 100644 index 2411666072a4afe4840ebd7fa0738139875ebb78..0000000000000000000000000000000000000000 --- a/src/mesonh/ext/phys_paramn.f90 +++ /dev/null @@ -1,1694 +0,0 @@ -!MNH_LIC Copyright 1995-2021 CNRS, Meteo-France and Universite Paul Sabatier -!MNH_LIC This is part of the Meso-NH software governed by the CeCILL-C licence -!MNH_LIC version 1. See LICENSE, CeCILL-C_V1-en.txt and CeCILL-C_V1-fr.txt -!MNH_LIC for details. version 1. -!----------------------------------------------------------------- -! ######################## - MODULE MODI_PHYS_PARAM_n -! ######################## -! -! -INTERFACE -! - SUBROUTINE PHYS_PARAM_n( KTCOUNT, TPFILE, & - PRAD, PSHADOWS, PKAFR, PGROUND, PMAFL, PDRAG,PEOL, PTURB, & - PTRACER, PTIME_BU, PWETDEPAER, OMASKkids, OCLOUD_ONLY ) -! -USE MODD_IO, ONLY: TFILEDATA -use modd_precision, only: MNHTIME -! -INTEGER, INTENT(IN) :: KTCOUNT ! temporal iteration count -TYPE(TFILEDATA), INTENT(IN) :: TPFILE ! Synchronous output file -! advection schemes -REAL(kind=MNHTIME), DIMENSION(2), INTENT(INOUT) :: PRAD,PSHADOWS,PKAFR,PGROUND,PTURB,PMAFL,PDRAG,PTRACER,PEOL ! to store CPU - ! time for computing time -REAL(kind=MNHTIME), DIMENSION(2), INTENT(INOUT) :: PTIME_BU ! time used in budget&LES budgets statistics -REAL, DIMENSION(:,:,:,:), INTENT(INOUT) :: PWETDEPAER -LOGICAL, DIMENSION(:,:), INTENT(IN) :: OMASKkids ! kids domains mask -LOGICAL, INTENT(OUT) :: OCLOUD_ONLY ! conditionnal radiation computations for - ! the only cloudy columns - ! -END SUBROUTINE PHYS_PARAM_n -! -END INTERFACE -! -END MODULE MODI_PHYS_PARAM_n -! -! ######################################################################################## - SUBROUTINE PHYS_PARAM_n( KTCOUNT, TPFILE, & - PRAD, PSHADOWS, PKAFR, PGROUND, PMAFL, PEOL, PDRAG, PTURB, & - PTRACER, PTIME_BU, PWETDEPAER, OMASKkids, OCLOUD_ONLY ) -! ######################################################################################## -! -!!**** *PHYS_PARAM_n * -monitor of the parameterizations used by model _n -!! -!! PURPOSE -!! ------- -! The purpose of this routine is to update the sources by adding the -! parameterized terms. This is realized by sequentially calling the -! specialized routines. -! -!!** METHOD -!! ------ -!! The first parametrization is the radiation scheme: -!! ---------------- -!! * CRAD = 'FIXE' -!! In this case, a temporal interpolation is performed for the downward -!! surface fluxes XFLALWD and XFLASWD. -!! * CRAD = 'ECMWF' -!! Several tests are performed before calling the radiation computations -!! interface with the ECMWF radiation scheme code. A control is made to -!! ensure that: -!! - the full radiation code is called at the first model timestep -!! - there is a priority for calling the full radiation instead of the -!! cloud-only approximation if both must be called at the current -!! timestep -!! - the cloud-only option (approximation) is coherent with the -!! occurence of one cloudy vertical column at least -!! If all the above conditions are fulfilled (GRAD is .TRUE.) then the -!! position of the sun is computed in routine SUNPOS_n and the interfacing -!! routine RADIATIONS is called to update the radiative tendency XDTHRAD -!! and the downward surface fluxes XFLALWD and XFLASWD. Finally, the -!! radiative tendency is integrated as a source term in the THETA prognostic -!! equation. -!! -!! The second parameterization is the soil scheme: -!! ----------- -!! -!! externalized surface -!! -!! The third parameterization is the turbulence scheme: -!! ----------------- -!! * CTURB='NONE' -!! no turbulent mixing is taken into account -!! * CTURB='TKEL' -!! The turbulent fluxes are computed according to a one and half order -!! closure of the hydrodynamical equations. This scheme is based on a -!! prognostic for the turbulent kinetic energy and a mixing length -!! computation ( the mesh size or a physically based length). Other -!! turbulent moments are diagnosed according to a stationarization of the -!! second order turbulent moments. This turbulent scheme forecasts -!! either a purely vertical turbulent mixing or 3-dimensional mixing -!! according to its internal degrees of freedom. -!! -!! -!! The LAST parameterization is the chemistry scheme: -!! ----------------- -!! The chemistry part of MesoNH has two namelists, NAM_SOLVER for the -!! parameters concerning the stiff solver, and NAM_MNHCn concerning the -!! configuration and options of the chemistry module itself. -!! The switch LUSECHEM in NAM_CONF acitvates or deactivates the chemistry. -!! The only variables of MesoNH that are modified by chemistry are the -!! scalar variables. If calculation of chemical surface fluxes is -!! requested, those fluxes are calculated before -!! entering the turbulence scheme, since those fluxes are taken into -!! account by TURB as surface boundary conditions. -!! CAUTION: chemistry has allways to be called AFTER ALL OTHER TERMS -!! that affect the scalar variables (dynamical terms, forcing, -!! parameterizations (like TURB, CONVECTION), since it uses the variables -!! XRSVS as input in case of the time-split option. -!! -!! EXTERNAL -!! -------- -!! Subroutine SUNPOS_n : computes the position of the sun -!! Subroutine RADIATIONS : computes the radiative tendency and fluxes -!! Subroutine TSZ0 : computes the surface from temporally -!! interpolated Ts and given z0 -!! Subroutine ISBA : computes the surface fluxes from a soil scheme -!! Subroutine TURB : computes the turbulence source terms -!! Subroutine CONVECTION : computes the convection source term -!! Subroutine CH_SURFACE_FLUX_n: computes the surface flux for chemical -!! species -!! Subroutine CH_MONITOR_n : computes the chemistry source terms -!! that are applied to the scalar variables -!! -!! IMPLICIT ARGUMENTS -!! ------------------ -!! USE MODD_DYN -!! USE MODD_CONF -!! USE MODD_CONF_n -!! USE MODD_CURVCOR_n -!! USE MODD_DYN_n -!! USE MODD_FIELD_n -!! USE MODD_GR_FIELD_n -!! USE MODD_LSFIELD_n -!! USE MODD_GRID_n -!! USE MODD_LBC_n -!! USE MODD_PARAM_RAD_n -!! USE MODD_RADIATIONS_n -!! USE MODD_REF_n -!! USE MODD_LUNIT_n -!! USE MODD_TIME_n -!! USE MODD_CH_MNHC_n -!! -!! REFERENCE -!! --------- -!! None -!! -!! AUTHOR -!! ------ -!! J. Stein * Meteo-France * -!! -!! MODIFICATIONS -!! ------------- -!! Original 05/01/95 -!! Modifications Feb 14, 1995 (J.Cuxart) add the I/O arguments, -!! the director cosinus and change the names of the surface fluxes -!! Modifications March 21, 1995 (J.M.Carriere) take into account liquid -!! water -!! June 30,1995 (J.Stein) initialize at 0 the surf. fluxes -!! Modifications Sept. 1, 1995 (S.Belair) ISBA scheme -!! Modifications Sept.25, 1995 (J.Stein) switch on the radiation scheme -!! Modifications Sept. 11, 1995 (J.-P. Pinty) radiation scheme -!! Nov. 15, 1995 (J.Stein) cleaning + change the temporal -!! algorithm for the soil scheme-turbulence -!! Jan. 23, 1996 (J.Stein) add a new option for the surface -!! fluxes where Ts and z0 are given -!! March 18, 1996 (J.Stein) add the cloud fraction -!! March 28, 1996 (J.Stein) the soil scheme gives energy -!! fluxes + cleaning -!! June 17, 1996 (Lafore) statistics of computing time -!! August 4, 1996 (K. Suhre) add chemistry -!! Oct. 12, 1996 (J.Stein) use XSRCM in the turbulence -!! scheme -!! Nov. 18, 1996 (J.-P. Pinty) add domain translation -!! change arg. in radiations -!! Fev. 4, 1997 (J.Viviand) change isba's calling for ice -!! Jun. 22, 1997 (J.Stein) change the equation system and use -!! the absolute pressure -!! Jul. 09, 1997 (V.Masson) add directional z0 -!! Jan. 24, 1998 (P.Bechtold) add convective transport for tracers -!! Jan. 24, 1998 (J.-P. Pinty) split SW and LW part for radiation -!! Mai. 10, 1999 (P.Bechtold) shallow convection -!! Oct. 20, 1999 (P.Jabouille) domain translation for turbulence -!! Jan. 04, 2000 (V.Masson) removes TSZ0 case -!! Jan. 04, 2000 (V.Masson) modifies albedo computation -! Jul 02, 2000 (F.Solmon/V.Masson) adaptation for patch approach -!! Nov. 15, 2000 (V.Masson) LES routines -!! Nov. 15, 2000 (V.Masson) effect of slopes on surface fluxes -!! Feb. 02, 2001 (P.Tulet) add friction velocities and aerodynamical -!! resistance (patch approach) -!! Jan. 04, 2000 (V.Masson) modify surf_rad_modif computation -!! Mar. 04, 2002 (F.Solmon) new interface for radiation call -!! Nov. 06, 2002 (V.Masson) LES budgets & budget time counters -!! Jan. 2004 (V.Masson) surface externalization -!! Jan. 13, 2004 (J.Escobar) bug correction : compute "GRAD" in parallel -!! Jan. 20, 2005 (P. Tulet) add dust sedimentation -!! Jan. 20, 2005 (P. Tulet) climatologic SSA -!! Jan. 20, 2005 (P. Tulet) add aerosol / dust scavenging -!! Jul. 2005 (N. Asencio) use the two-way result-fields -!! before ground_param call -!! May 2006 Remove EPS -!! Oct. 2007 (J.Pergaud) Add shallow_MF -!! Oct. 2009 (C.Lac) Introduction of different PTSTEP according to the -!! advection schemes -!! Oct. 2009 (V. MAsson) optimization of Pergaud et al massflux scheme -!! Aug. 2010 (V.Masson, C.Lac) Exchange of SBL_DEPTH for -!! reproducibility -!! Oct. 2010 (J.Escobar) init ZTIME_LES_MF ( pb detected with g95 ) -!! Feb. 2011 (V.Masson, C.Lac) SBL_DEPTH values on outer pts -!! for RMC01 -!! Sept.2011 (J.Escobar) init YINST_SFU ='M' -!! -!! Specific for 2D modeling : -!! -!! 06/2010 (P.Peyrille) add Call to aerozon.f90 if LAERO_FT=T -!! to update -!! aerosols and ozone climatology at each call to -!! phys_param otherwise it is constant to monthly average -!! 03/2013 (C.Lac) FIT temporal scheme -!! 01/2014 (C.Lac) correction for the nesting of 2D surface -!! fields if the number of the son model does not -!! follow the number of the dad model -!! J.Escobar 21/03/2013: for HALOK comment all NHALO=1 test -!! 2014 (M.Faivre) -!! 06/2016 (G.Delautier) phasage surfex 8 -!! 2016 B.VIE LIMA -!! M. Leriche 02/2017 Avoid negative fluxes if sv=0 outside the physics domain -!! C.Lac 10/2017 : ch_monitor and aer_monitor extracted from phys_param -!! to be called directly by modeln as the last process -!! 02/2018 Q.Libois ECRAD -! P. Wautelet 28/03/2018: replace TEMPORAL_DIST by DATETIME_DISTANCE -! P. Wautelet 05/2016-04/2018: new data structures and calls for I/O -! P. Wautelet 28/03/2019: use MNHTIME for time measurement variables -! P. Wautelet 26/04/2019: replace non-standard FLOAT function by REAL function -! P. Wautelet 20/05/2019: add name argument to ADDnFIELD_ll + new ADD4DFIELD_ll subroutine -! P. Wautelet 21/11/2019: ZRG_HOUR and ZRAT_HOUR are now parameter arrays -! C. Lac 11/2019: correction in the drag formula and application to building in addition to tree -! F. Auguste 02/2021: add IBM -! JL Redelsperger 03/2021: add the SW flux penetration for Ocean model case -! A. Costes 12/2021: add Blaze fire model -!!------------------------------------------------------------------------------- -! -!* 0. DECLARATIONS -! ------------ -! -USE MODD_ADV_n, ONLY : XRTKEMS -USE MODD_ARGSLIST_ll, ONLY : LIST_ll -USE MODD_BLOWSNOW, ONLY : LBLOWSNOW,XRSNOW -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, & - LCH_CONV_LINOX -USE MODD_CLOUD_MF_n -USE MODD_CONDSAMP -USE MODD_CONF -USE MODD_CONF_n -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 -USE MODD_DEF_EDDYUV_FLUX_n ! Ajout PP -USE MODD_DIAG_IN_RUN, ONLY: LDIAG_IN_RUN, XCURRENT_TKE_DISS -USE MODD_DIM_n, ONLY: NIMAX_ll, NJMAX_ll -USE MODD_DRAGBLDG_n -USE MODD_DRAGTREE_n -USE MODD_DUST -USE MODD_DYN -USE MODD_DYN_n -USE MODD_EOL_MAIN, ONLY: LMAIN_EOL, CMETH_EOL, NMODEL_EOL -USE MODD_FIELD_n -USE MODD_FRC -USE MODD_FRC_n -USE MODD_GRID -USE MODD_GRID_n -USE MODD_IBM_PARAM_n, ONLY: LIBM, XIBM_EPSI, XIBM_LS, XIBM_XMUT -USE MODD_ICE_C1R3_DESCR, ONLY : XRTMIN_C1R3=>XRTMIN -USE MODD_IO, ONLY: TFILEDATA -USE MODD_LATZ_EDFLX -USE MODD_LBC_n -USE MODD_LES -USE MODD_LES_BUDGET -USE MODD_LSFIELD_n -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, ONLY : NSV, NSV_LGBEG, NSV_LGEND, & - NSV_SLTBEG,NSV_SLTEND,NSV_SLT,& - NSV_AERBEG,NSV_AEREND, & - NSV_DSTBEG,NSV_DSTEND, NSV_DST,& - NSV_LIMA_NR,NSV_LIMA_NS,NSV_LIMA_NG,NSV_LIMA_NH -USE MODD_OCEANH -USE MODD_OUT_n -USE MODD_PARAM_C2R2, ONLY : LSEDC -USE MODD_PARAMETERS -USE MODD_PARAM_ICE, ONLY : LSEDIC -USE MODD_PARAM_KAFR_n -USE MODD_PARAM_LIMA, ONLY : MSEDC => LSEDC, XRTMIN_LIMA=>XRTMIN -USE MODD_PARAM_MFSHALL_n -USE MODD_PARAM_n -USE MODD_PARAM_RAD_n -USE MODD_PASPOL -USE MODD_PASPOL_n -USE MODD_DIMPHYEX, ONLY: DIMPHYEX_t -USE MODD_PRECIP_n -use modd_precision, only: MNHTIME -USE MODD_RADIATIONS_n -USE MODD_RAIN_ICE_DESCR, ONLY: XRTMIN -USE MODD_REF, ONLY: LCOUPLES -USE MODD_REF_n -USE MODD_SALT -USE MODD_SHADOWS_n -USE MODD_SUB_PHYS_PARAM_n -USE MODD_TIME_n -USE MODD_TIME_n -USE MODD_TIME, ONLY : TDTEXP ! Ajout PP -USE MODD_TURB_CLOUD, ONLY : CTURBLEN_CLOUD,NMODEL_CLOUD, & - XCEI,XCEI_MIN,XCEI_MAX,XCOEF_AMPL_SAT -USE MODD_TURB_FLUX_AIRCRAFT_BALLOON, ONLY : XTHW_FLUX, XRCW_FLUX, XSVW_FLUX -USE MODD_TURB_n - -USE MODE_AERO_PSD -use mode_budget, only: Budget_store_end, Budget_store_init -USE MODE_DATETIME -USE MODE_DUST_PSD -USE MODE_ll -USE MODE_GATHER_ll -USE MODE_MNH_TIMING -USE MODE_MODELN_HANDLER -USE MODE_MPPDB -USE MODE_FILL_DIMPHYEX, ONLY: FILL_DIMPHYEX -USE MODE_SALT_PSD - -USE MODI_AEROZON ! Ajout PP -USE MODI_CONDSAMP -USE MODI_CONVECTION -USE MODI_DRAG_BLD -USE MODI_DRAG_VEG -USE MODI_DUST_FILTER -USE MODI_EDDY_FLUX_n ! Ajout PP -USE MODI_EDDY_FLUX_ONE_WAY_n ! Ajout PP -USE MODI_EDDYUV_FLUX_n ! Ajout PP -USE MODI_EDDYUV_FLUX_ONE_WAY_n ! Ajout PP -USE MODI_EOL_MAIN -USE MODI_GROUND_PARAM_n -USE MODI_GRADIENT_M -USE MODI_GRADIENT_W -USE MODI_PASPOL -USE MODI_RADIATIONS -USE MODI_SALT_FILTER -USE MODI_SEDIM_DUST -USE MODI_SEDIM_SALT -USE MODI_SHALLOW_MF_PACK -USE MODI_SUNPOS_n -USE MODI_SURF_RAD_MODIF -USE MODI_SWITCH_SBG_LES_N -USE MODI_TURB - -IMPLICIT NONE -! -!* 0.1 declarations of arguments -! -INTEGER, INTENT(IN) :: KTCOUNT ! temporal iteration count -TYPE(TFILEDATA), INTENT(IN) :: TPFILE ! Synchronous output file -! advection schemes -REAL(kind=MNHTIME), DIMENSION(2), INTENT(INOUT) :: PRAD,PSHADOWS,PKAFR,PGROUND,PTURB,PMAFL,PDRAG,PTRACER,PEOL ! to store CPU - ! time for computing time -REAL(kind=MNHTIME), DIMENSION(2), INTENT(INOUT) :: PTIME_BU ! time used in budget&LES budgets statistics -REAL, DIMENSION(:,:,:,:), INTENT(INOUT) :: PWETDEPAER -LOGICAL, DIMENSION(:,:), INTENT(IN) :: OMASKkids ! kids domains mask -LOGICAL, INTENT(OUT) :: OCLOUD_ONLY ! conditionnal radiation computations for - ! the only cloudy columns - ! -! -!* 0.2 declarations of local variables -! -REAL, DIMENSION(:,:), ALLOCATABLE :: ZSFU ! surface flux of x and -REAL, DIMENSION(:,:), ALLOCATABLE :: ZSFV ! y component of wind -REAL, DIMENSION(:,:), ALLOCATABLE :: ZSFTH ! surface flux of theta -REAL, DIMENSION(:,:), ALLOCATABLE :: ZSFRV ! surface flux of vapor -REAL, DIMENSION(:,:,:), ALLOCATABLE :: ZSFSV ! surface flux of scalars -REAL, DIMENSION(:,:), ALLOCATABLE :: ZSFCO2! surface flux of CO2 -! -REAL, DIMENSION(:,:,:), ALLOCATABLE :: ZDIR_ALB ! direct albedo -REAL, DIMENSION(:,:,:), ALLOCATABLE :: ZSCA_ALB ! diffuse albedo -REAL, DIMENSION(:,:,:), ALLOCATABLE :: ZEMIS ! emissivity -REAL, DIMENSION(:,:), ALLOCATABLE :: ZTSRAD ! surface temperature -REAL, DIMENSION(:,:,:,:), ALLOCATABLE :: ZRGDST,ZSIGDST,ZNDST,ZSVDST -REAL, DIMENSION(:,:,:,:), ALLOCATABLE :: ZRGSLT,ZSIGSLT,ZNSLT,ZSVSLT -REAL, DIMENSION(:,:,:,:), ALLOCATABLE :: ZRGAER,ZSIGAER,ZNAER,ZSVAER -REAL, DIMENSION(:,:,:,:), ALLOCATABLE :: ZSVT -! -REAL, DIMENSION(:,:,:), ALLOCATABLE :: ZEXN ! Atmospheric density and Exner -REAL, DIMENSION(:,:,:), ALLOCATABLE :: ZSIGMF ! MF contribution to XSIGS -! -REAL, DIMENSION(0:24), parameter :: ZRG_HOUR = (/ 0., 0., 0., 0., 0., 32.04, 114.19, & - 228.01, 351.25, 465.49, 557.24, & - 616.82, 638.33, 619.43, 566.56, & - 474.71, 359.20, 230.87, 115.72, & - 32.48, 0., 0., 0., 0., 0. /) -! -REAL, DIMENSION(0:24), parameter :: ZRAT_HOUR = (/ 326.00, 325.93, 325.12, 324.41, & - 323.16, 321.95, 322.51, 325.16, & - 328.01, 331.46, 335.58, 340.00, & - 345.20, 350.32, 354.20, 356.58, & - 356.56, 355.33, 352.79, 351.34, & - 347.00, 342.00, 337.00, 332.00, & - 326.00 /) -! -! -character(len=6) :: ynum -INTEGER :: IHOUR ! parameters necessary for the temporal -REAL :: ZTIME, ZDT ! interpolation -REAL :: ZTEMP_DIST ! time between 2 instants (in seconds) -! -LOGICAL :: GRAD ! conditionnal call for the full radiation - ! computations -REAL :: ZRAD_GLOB_ll ! 'real' global parallel mask of 'GRAD' -INTEGER :: INFO_ll ! error report of parallel routines - ! the only cloudy columns -! -REAL(kind=MNHTIME), DIMENSION(2) :: ZTIME1, ZTIME2, ZTIME3, ZTIME4 ! for computing time analysis -REAL(kind=MNHTIME), DIMENSION(2) :: ZTIME_LES_MF ! time spent in LES computation in shallow conv. -LOGICAL :: GDCONV ! conditionnal call for the deep convection - ! computations -REAL, DIMENSION(:,:,:), ALLOCATABLE :: ZRC, ZRI, ZWT ! additional dummies -REAL, DIMENSION(:,:), ALLOCATABLE :: ZDXDY ! grid area - ! for rc, ri, w required if main variables not allocated -! -INTEGER :: IIU, IJU, IKU ! dimensional indexes -! -INTEGER :: JSV ! Loop index for Scalar Variables -INTEGER :: JSWB ! loop on SW spectral bands -INTEGER :: IIB,IIE,IJB,IJE, IKB, IKE, JI,JJ -INTEGER :: IMODEIDX - ! index values for the Beginning or the End of the physical - ! domain in x and y directions -TYPE(LIST_ll), POINTER :: TZFIELDS_ll ! list of fields to exchange -INTEGER :: IINFO_ll ! return code of parallel routine -! -!* variables for writing in a fm file -! -INTEGER :: IRESP ! IRESP : return-code if a problem appears - !in LFI subroutines at the open of the file -INTEGER :: ILUOUT ! logical unit numbers of output-listing -INTEGER :: IMI ! model index -INTEGER :: JKID ! loop index to look for the KID models -REAL :: ZINIRADIUSI, ZINIRADIUSJ ! ORILAM initial radius -REAL, DIMENSION(NMODE_DST) :: ZINIRADIUS ! DUST initial radius -REAL, DIMENSION(NMODE_SLT) :: ZINIRADIUS_SLT ! Sea Salt initial radius -REAL, DIMENSION(SIZE(XRSVS,1), SIZE(XRSVS,2), SIZE(XRSVS,3), SIZE(XRSVS,4)) :: ZRSVS -LOGICAL :: GCLD ! conditionnal call for dust wet deposition -! * arrays to store the surface fields before radiation and convection scheme -! calls -INTEGER :: IMODSON ! Number of son models of IMI with XWAY=2 -INTEGER :: IKIDM ! index loop -INTEGER :: IGRADIENTS ! Number of horizontal gradients in turb -REAL, DIMENSION(:,:,:), ALLOCATABLE :: ZSAVE_INPRR,ZSAVE_INPRS,ZSAVE_INPRG,ZSAVE_INPRH -REAL, DIMENSION(:,:,:), ALLOCATABLE :: ZSAVE_INPRC,ZSAVE_PRCONV,ZSAVE_PRSCONV -REAL, DIMENSION(:,:,:,:), ALLOCATABLE :: ZSAVE_DIRFLASWD, ZSAVE_SCAFLASWD,ZSAVE_DIRSRFSWD -! for ocean model -INTEGER :: JKM , JSW ! vertical index loop -REAL :: ZSWA,TINTSW ! index for SW interpolation and int time betwenn forcings (ocean model) -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 !OHARAT turb option from AROME (not allocated in MNH) - ! to be moved as optional args for turb -REAL, DIMENSION(:,:,:), ALLOCATABLE :: ZTDIFF, ZTDISS -REAL, DIMENSION(:),ALLOCATABLE :: ZXHAT_ll,ZYHAT_ll ! Position x/y in the conformal - ! plane (array on the complete domain) -REAL, DIMENSION(:,:), ALLOCATABLE :: ZDIST ! distance from the center of the cooling -! -REAL, DIMENSION(:,:,:,:), ALLOCATABLE :: ZHGRAD ! horizontal gradient used in turb -TYPE(DIMPHYEX_t) :: YLDIMPHYEX -LOGICAL :: GCOMPUTE_SRC ! flag to define dimensions of SIGS and SRCT variables -!----------------------------------------------------------------------------- - -NULLIFY(TZFIELDS_ll) -IMI=GET_CURRENT_MODEL_INDEX() -! -ILUOUT = TLUOUT%NLU -CALL GET_DIM_EXT_ll ('B',IIU,IJU) -IKU=SIZE(XTHT,3) -IKB = 1 + JPVEXT -IKE = IKU - JPVEXT -! -CALL GET_INDICE_ll (IIB,IJB,IIE,IJE) -CALL FILL_DIMPHYEX(YLDIMPHYEX, SIZE(XTHT,1), SIZE(XTHT,2), SIZE(XTHT,3),.TRUE.) -! -ZTIME1 = 0.0_MNHTIME -ZTIME2 = 0.0_MNHTIME -ZTIME3 = 0.0_MNHTIME -ZTIME4 = 0.0_MNHTIME -PTIME_BU = 0._MNHTIME -ZTIME_LES_MF = 0.0_MNHTIME -PWETDEPAER(:,:,:,:) = 0. -! -!* allocation of variables used in more than one parameterization -! -ALLOCATE(ZSFU (IIU,IJU)) ! surface schemes + turbulence -ALLOCATE(ZSFV (IIU,IJU)) -ALLOCATE(ZSFTH (IIU,IJU)) -ALLOCATE(ZSFRV (IIU,IJU)) -ALLOCATE(ZSFSV (IIU,IJU,NSV)) -ALLOCATE(ZSFCO2(IIU,IJU)) -! -!* if XWAY(son)=2 save surface fields before radiation or convective scheme -! calls -! -IMODSON = 0 -DO JKID = IMI+1,NMODEL ! min value of the possible kids - IF (IMI == NDAD(JKID) .AND. XWAY(JKID) == 2. .AND. CPROGRAM=='MESONH' & - .AND. (CCONF == 'RESTA' .OR. (CCONF == 'START' .AND. KTCOUNT /= 1))) THEN - IMODSON = IMODSON + 1 - END IF -END DO -! - IF (IMODSON /= 0 ) THEN - IF (LUSERC .AND. ( & - (LSEDIC .AND. CCLOUD(1:3) == 'ICE') .OR. & - (LSEDC .AND. (CCLOUD == 'C2R2' .OR. CCLOUD == 'KHKO')) .OR. & - (MSEDC .AND. CCLOUD=='LIMA') & - )) THEN - ALLOCATE( ZSAVE_INPRC(SIZE(XINPRC,1),SIZE(XINPRC,2),IMODSON)) - ELSE - ALLOCATE( ZSAVE_INPRC(0,0,0)) - END IF - IF (LUSERR) THEN - ALLOCATE( ZSAVE_INPRR(SIZE(XINPRR,1),SIZE(XINPRR,2),IMODSON)) - ELSE - ALLOCATE( ZSAVE_INPRR(0,0,0)) - END IF - IF (LUSERS) THEN - ALLOCATE( ZSAVE_INPRS(SIZE(XINPRS,1),SIZE(XINPRS,2),IMODSON)) - ELSE - ALLOCATE( ZSAVE_INPRS(0,0,0)) - END IF - IF (LUSERG) THEN - ALLOCATE( ZSAVE_INPRG(SIZE(XINPRG,1),SIZE(XINPRG,2),IMODSON)) - ELSE - ALLOCATE( ZSAVE_INPRG(0,0,0)) - END IF - IF (LUSERH) THEN - ALLOCATE( ZSAVE_INPRH(SIZE(XINPRH,1),SIZE(XINPRH,2),IMODSON)) - ELSE - ALLOCATE( ZSAVE_INPRH(0,0,0)) - END IF - IF (CDCONV /= 'NONE') THEN - ALLOCATE( ZSAVE_PRCONV(SIZE(XPRCONV,1),SIZE(XPRCONV,2),IMODSON)) - ALLOCATE( ZSAVE_PRSCONV(SIZE(XPRSCONV,1),SIZE(XPRSCONV,2),IMODSON)) - ELSE - ALLOCATE( ZSAVE_PRCONV(0,0,0)) - ALLOCATE( ZSAVE_PRSCONV(0,0,0)) - END IF - IF (CRAD /= 'NONE') THEN - ALLOCATE( ZSAVE_DIRFLASWD(SIZE(XDIRFLASWD,1),SIZE(XDIRFLASWD,2),SIZE(XDIRFLASWD,3),IMODSON)) - ALLOCATE( ZSAVE_SCAFLASWD(SIZE(XSCAFLASWD,1),SIZE(XSCAFLASWD,2),SIZE(XSCAFLASWD,3),IMODSON)) - ALLOCATE( ZSAVE_DIRSRFSWD(SIZE(XDIRSRFSWD,1),SIZE(XDIRSRFSWD,2),SIZE(XDIRSRFSWD,3),IMODSON)) - ELSE - ALLOCATE( ZSAVE_DIRFLASWD(0,0,0,0)) - ALLOCATE( ZSAVE_SCAFLASWD(0,0,0,0)) - ALLOCATE( ZSAVE_DIRSRFSWD(0,0,0,0)) - END IF - ENDIF -! -IKIDM=0 -DO JKID = IMI+1,NMODEL ! min value of the possible kids - IF (IMI == NDAD(JKID) .AND. XWAY(JKID) == 2. .AND. CPROGRAM=='MESONH' & - .AND. (CCONF == 'RESTA' .OR. (CCONF == 'START' .AND. KTCOUNT /= 1))) THEN -! BUG if number of the son does not follow the number of the dad -! IKIDM = JKID-IMI - IKIDM = IKIDM + 1 - IF (LUSERC .AND. ( & - (LSEDIC .AND. CCLOUD(1:3) == 'ICE') .OR. & - (LSEDC .AND. (CCLOUD == 'C2R2' .OR. CCLOUD == 'KHKO')) .OR. & - (MSEDC .AND. CCLOUD=='LIMA') & - )) THEN - ZSAVE_INPRC(:,:,IKIDM) = XINPRC(:,:) - END IF - IF (LUSERR) THEN - ZSAVE_INPRR(:,:,IKIDM) = XINPRR(:,:) - END IF - IF (LUSERS) THEN - ZSAVE_INPRS(:,:,IKIDM) = XINPRS(:,:) - END IF - IF (LUSERG) THEN - ZSAVE_INPRG(:,:,IKIDM) = XINPRG(:,:) - END IF - IF (LUSERH) THEN - ZSAVE_INPRH(:,:,IKIDM) = XINPRH(:,:) - END IF - IF (CDCONV /= 'NONE') THEN - ZSAVE_PRCONV(:,:,IKIDM) = XPRCONV(:,:) - ZSAVE_PRSCONV(:,:,IKIDM) = XPRSCONV(:,:) - END IF - IF (CRAD /= 'NONE') THEN - ZSAVE_DIRFLASWD(:,:,:,IKIDM) = XDIRFLASWD(:,:,:) - ZSAVE_SCAFLASWD(:,:,:,IKIDM) = XSCAFLASWD(:,:,:) - ZSAVE_DIRSRFSWD(:,:,:,IKIDM) = XDIRSRFSWD(:,:,:) - END IF - ENDIF -END DO -! -!----------------------------------------------------------------------------- -! -!* 1. RADIATION SCHEME -! ---------------- -! -! -XTIME_BU_PROCESS = 0. -XTIME_LES_BU_PROCESS = 0. -! -CALL SECOND_MNH2(ZTIME1) -! -! -!* 1.1 Tests to control how the radiation package should be called (at the current timestep) -! ----------------------------------------------------------- -! -! -GRAD = .FALSE. -OCLOUD_ONLY = .FALSE. -! -IF (CRAD /='NONE') THEN -! -! test to see if the partial radiations for cloudy must be called -! - IF (CRAD =='ECMW' .OR. CRAD =='ECRA') THEN - CALL DATETIME_DISTANCE(TDTRAD_CLONLY,TDTCUR,ZTEMP_DIST) - IF( MOD(NINT(ZTEMP_DIST/XTSTEP),NINT(XDTRAD_CLONLY/XTSTEP))==0 ) THEN - TDTRAD_CLONLY = TDTCUR - GRAD = .TRUE. - OCLOUD_ONLY = .TRUE. - END IF - END IF -! -! test to see if the full radiations must be called -! - CALL DATETIME_DISTANCE(TDTCUR,TDTRAD_FULL,ZTEMP_DIST) - IF( MOD(NINT(ZTEMP_DIST/XTSTEP),NINT(XDTRAD/XTSTEP))==0 ) THEN - TDTRAD_FULL = TDTCUR - GRAD = .TRUE. - OCLOUD_ONLY = .FALSE. - END IF -! -! tests to see if any cloud exists -! - IF (CRAD =='ECMW' .OR. CRAD =='ECRA') THEN - IF (GRAD .AND. NRR.LE.3 ) THEN - IF( MAX(MAXVAL(XCLDFR(:,:,:)),MAXVAL(XICEFR(:,:,:))).LE. 1.E-10 .AND. OCLOUD_ONLY ) THEN - GRAD = .FALSE. ! only the cloudy verticals would be - ! refreshed but there is no clouds - END IF - END IF -! - IF (GRAD .AND. NRR.GE.4 ) THEN - IF( CCLOUD(1:3)=='ICE' )THEN - IF( MAXVAL(XRT(:,:,:,2)).LE.XRTMIN(2) .AND. & - MAXVAL(XRT(:,:,:,4)).LE.XRTMIN(4) .AND. OCLOUD_ONLY ) THEN - GRAD = .FALSE. ! only the cloudy verticals would be - ! refreshed but there is no cloudwater and ice - END IF - END IF - IF( CCLOUD=='C3R5' )THEN - IF( MAXVAL(XRT(:,:,:,2)).LE.XRTMIN_C1R3(2) .AND. & - MAXVAL(XRT(:,:,:,4)).LE.XRTMIN_C1R3(4) .AND. OCLOUD_ONLY ) THEN - GRAD = .FALSE. ! only the cloudy verticals would be - ! refreshed but there is no cloudwater and ice - END IF - END IF - IF( CCLOUD=='LIMA' )THEN - IF( MAXVAL(XRT(:,:,:,2)).LE.XRTMIN_LIMA(2) .AND. & - MAXVAL(XRT(:,:,:,4)).LE.XRTMIN_LIMA(4) .AND. OCLOUD_ONLY ) THEN - GRAD = .FALSE. ! only the cloudy verticals would be - ! refreshed but there is no cloudwater and ice - END IF - END IF - END IF - END IF -! -END IF -! -! global parallel mask for 'GRAD' -ZRAD_GLOB_ll = 0.0 -IF (GRAD) ZRAD_GLOB_ll = 1.0 -CALL REDUCESUM_ll(ZRAD_GLOB_ll,INFO_ll) -if (ZRAD_GLOB_ll .NE. 0.0 ) GRAD = .TRUE. -! -! -IF( GRAD ) THEN - ALLOCATE(ZCOSZEN(IIU,IJU)) - ALLOCATE(ZSINZEN(IIU,IJU)) - ALLOCATE(ZAZIMSOL(IIU,IJU)) -! -! -!* 1.2. Astronomical computations -! ------------------------- -! -! Ajout PP -IF (.NOT. OCLOUD_ONLY .AND. KTCOUNT /= 1) THEN - IF (LAERO_FT) THEN - CALL AEROZON (XPABST,XTHT,XTSRAD,XLAT,XLON,TDTCUR,TDTEXP, & - NDLON,NFLEV,CAER,NAER,NSTATM, & - XSINDEL,XCOSDEL,XTSIDER,XCORSOL, & - XSTATM,XOZON, XAER) - XAER_CLIM = XAER - END IF -END IF -! -CALL SUNPOS_n ( XZENITH, ZCOSZEN, ZSINZEN, ZAZIMSOL ) -! -!* 1.3 Call to radiation scheme -! ------------------------ -! - SELECT CASE ( CRAD ) -! -!* 1.3.1 TOP of Atmposphere radiation -! ---------------------------- - CASE('TOPA') -! - XFLALWD (:,:) = 300. - DO JSWB=1,NSWB_MNH - XDIRFLASWD(:,:,JSWB) = CST%XI0 * MAX(COS(XZENITH(:,:)),0.)/REAL(NSWB_MNH) - XSCAFLASWD(:,:,JSWB) = 0. - END DO - XDTHRAD(:,:,:) = 0. - -! -!* 1.3.1 FIXEd radiative surface fluxes -! ------------------------------ -! - CASE('FIXE') - ZTIME = MOD(TDTCUR%xtime +XLON0*240., CST%XDAY) - IHOUR = INT( ZTIME/3600. ) - IF (IHOUR < 0) IHOUR=IHOUR + 24 - ZDT = ZTIME/3600. - REAL(IHOUR) - XDIRFLASWD(:,:,:) =(( ZRG_HOUR(IHOUR+1)-ZRG_HOUR(IHOUR) )*ZDT + ZRG_HOUR(IHOUR)) / REAL(NSWB_MNH) - XFLALWD (:,:) = (ZRAT_HOUR(IHOUR+1)-ZRAT_HOUR(IHOUR))*ZDT + ZRAT_HOUR(IHOUR) - DO JSWB=1,NSWB_MNH - WHERE(ZCOSZEN(:,:)<0.) XDIRFLASWD(:,:,JSWB) = 0. - END DO - - XSCAFLASWD(:,:,:) = XDIRFLASWD(:,:,:) * 0.2 - XDIRFLASWD(:,:,:) = XDIRFLASWD(:,:,:) * 0.8 - XDTHRAD(:,:,:) = 0. - ! -! -!* 1.3.2 ECMWF or ECRAD radiative surface and atmospheric fluxes -! ---------------------------------------------- -! - CASE('ECMW' , 'ECRA') - IF (LLES_MEAN) OCLOUD_ONLY=.FALSE. - XRADEFF(:,:,:)=0.0 - XSWU(:,:,:)=0.0 - XSWD(:,:,:)=0.0 - XLWU(:,:,:)=0.0 - XLWD(:,:,:)=0.0 - XDTHRADSW(:,:,:)=0.0 - XDTHRADLW(:,:,:)=0.0 - CALL RADIATIONS( TPFILE, & - LCLEAR_SKY, OCLOUD_ONLY, NCLEARCOL_TM1, CEFRADL, CEFRADI, COPWSW, COPISW, & - COPWLW, COPILW, XFUDG, & - NDLON, NFLEV, NRAD_DIAG, NFLUX, NRAD, NAER, NSWB_OLD, NSWB_MNH, NLWB_MNH, & - NSTATM, NRAD_COLNBR, ZCOSZEN, XSEA, XCORSOL, & - XDIR_ALB, XSCA_ALB, XEMIS, MAX(XCLDFR,XICEFR), XCCO2, XTSRAD, XSTATM, XTHT, XRT, & - XPABST, XOZON, XAER,XDST_WL, XAER_CLIM, XSVT, & - XDTHRAD, XFLALWD, XDIRFLASWD, XSCAFLASWD, XRHODREF, XZZ , & - XRADEFF, XSWU, XSWD, XLWU, XLWD, XDTHRADSW, XDTHRADLW ) -! - - WRITE(UNIT=ILUOUT,FMT='(" RADIATIONS called for KTCOUNT=",I6, & - & "with the CLOUD_ONLY option set ",L2)') KTCOUNT,OCLOUD_ONLY -! - ! - WHERE (XDIRFLASWD.LT.0.0) - XDIRFLASWD=0.0 - ENDWHERE - ! - WHERE (XDIRFLASWD.GT.1500.0) - XDIRFLASWD=1500.0 - ENDWHERE - ! - WHERE (XSCAFLASWD.LT.0.0) - XSCAFLASWD=0.0 - ENDWHERE - ! - WHERE (XSCAFLASWD.GT.1500.0) - XSCAFLASWD=1500.0 - ENDWHERE - ! - WHERE( XDIRFLASWD(:,:,1) + XSCAFLASWD(:,:,1) >0. ) - XALBUV(:,:) = ( XDIR_ALB(:,:,1) * XDIRFLASWD(:,:,1) & - + XSCA_ALB(:,:,1) * XSCAFLASWD(:,:,1) ) & - / (XDIRFLASWD(:,:,1) + XSCAFLASWD(:,:,1) ) - ELSEWHERE - XALBUV(:,:) = XDIR_ALB(:,:,1) - END WHERE -! - END SELECT -! - CALL SECOND_MNH2(ZTIME2) -! - PRAD = PRAD + ZTIME2 - ZTIME1 -! - ZTIME1 = ZTIME2 -! - CALL SURF_RAD_MODIF (XMAP, XXHAT, XYHAT, & - ZCOSZEN, ZSINZEN, ZAZIMSOL, XZS, XZS_XY, & - XDIRFLASWD, XDIRSRFSWD ) -! -!* Azimuthal angle to be sent later to surface processes -! Defined in radian, clockwise, from North -! - XAZIM = ZAZIMSOL -! - CALL SECOND_MNH2(ZTIME2) -! - PSHADOWS = PSHADOWS + ZTIME2 - ZTIME1 -! - ZTIME1 = ZTIME2 -! - DEALLOCATE(ZCOSZEN) - DEALLOCATE(ZSINZEN) - DEALLOCATE(ZAZIMSOL) -! -END IF -! -! -!* 1.4 control prints -! -------------- -! -!* 1.5 Radiative tendency integration -! ------------------------------ -! -IF (CRAD /='NONE') THEN - if ( TBUCONF%LBUDGET_th ) call Budget_store_init( TBUDGETS(NBUDGET_TH), 'RAD', xrths(:, :, :) ) - XRTHS(:,:,:) = XRTHS(:,:,:) + XRHODJ(:,:,:)*XDTHRAD(:,:,:) - if ( TBUCONF%LBUDGET_th ) call Budget_store_end ( TBUDGETS(NBUDGET_TH), 'RAD', xrths(:, :, :) ) -END IF -! -! -!* 1.6 Ocean case: -! Sfc turbulent fluxes & Radiative tendency due to SW penetrating ocean -! -IF (LCOUPLES) THEN -ZSFU(:,:)= XSSUFL_C(:,:,1) -ZSFV(:,:)= XSSVFL_C(:,:,1) -ZSFTH(:,:)= XSSTFL_C(:,:,1) -ZSFRV(:,:)=XSSRFL_C(:,:,1) -ELSE -IF (LOCEAN) THEN -! - ALLOCATE( ZIZOCE(IKU)); ZIZOCE(:)=0. - ALLOCATE( ZPROSOL1(IKU)) - ALLOCATE( ZPROSOL2(IKU)) - ALLOCATE(XSSOLA(IIU,IJU)) - ! Time interpolation - JSW = INT(TDTCUR%xtime/REAL(NINFRT)) - ZSWA = TDTCUR%xtime/REAL(NINFRT)-REAL(JSW) - ZSFRV = 0. - ZSFTH = (XSSTFL_T(JSW+1)*(1.-ZSWA)+XSSTFL_T(JSW+2)*ZSWA) - ZSFU = (XSSUFL_T(JSW+1)*(1.-ZSWA)+XSSUFL_T(JSW+2)*ZSWA) - ZSFV = (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) = 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, ZSFTH(2,2), ZSFU(2,2),ZSFV(2,2),ZIZOCE(IKU) - WRITE(ILUOUT,*)'XSSTP1,XSSTP,NINFRT,ZSWA,JSW,TDTCUR%xtime,ZSFT', & - XSSTFL_T(JSW+1),XSSTFL_T(JSW),NINFRT,ZSWA,JSW, TDTCUR%xtime,ZSFTH(2,2) - END IF - 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)/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 ( TBUCONF%LBUDGET_th ) call Budget_store_end ( TBUDGETS(NBUDGET_TH), 'OCEAN', xrths(:, :, :) ) - DEALLOCATE (XSSOLA) - DEALLOCATE( ZIZOCE) - DEALLOCATE (ZPROSOL1) - DEALLOCATE (ZPROSOL2) -END IF! LOCEAN NO LCOUPLES -END IF!NO LCOUPLES -! -! -CALL SECOND_MNH2(ZTIME2) -! -PRAD = PRAD + ZTIME2 - ZTIME1 & - - XTIME_LES_BU_PROCESS - XTIME_BU_PROCESS -! -PTIME_BU = PTIME_BU + XTIME_LES_BU_PROCESS + XTIME_BU_PROCESS -! -! -!----------------------------------------------------------------------------- -! -!* 2. DEEP CONVECTION SCHEME -! ---------------------- -! -ZTIME1 = ZTIME2 -XTIME_BU_PROCESS = 0. -XTIME_LES_BU_PROCESS = 0. -! -CALL SECOND_MNH2(ZTIME1) -! -IF( CDCONV == 'KAFR' .OR. CSCONV == 'KAFR' ) 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) ) - end do - end if -! -! test to see if the deep convection scheme should be called -! - GDCONV = .FALSE. -! - CALL DATETIME_DISTANCE(TDTDCONV,TDTCUR,ZTEMP_DIST) - IF( MOD(NINT(ZTEMP_DIST/XTSTEP),NINT(XDTCONV/XTSTEP))==0 ) THEN - TDTDCONV = TDTCUR - GDCONV = .TRUE. - END IF -! - IF( GDCONV ) THEN - IF (CDCONV == 'KAFR' .OR. CSCONV == 'KAFR' ) THEN - ALLOCATE( ZRC(IIU,IJU,IKU) ) - ALLOCATE( ZRI(IIU,IJU,IKU) ) - ALLOCATE( ZWT(IIU,IJU,IKU) ) - ALLOCATE( ZDXDY(IIU,IJU) ) - ! Compute grid area - ZDXDY(:,:) = SPREAD(XDXHAT(1:IIU),2,IJU) * SPREAD(XDYHAT(1:IJU),1,IIU) - ! - IF( LUSERC .AND. LUSERI ) THEN - ZRC(:,:,:) = XRT(:,:,:,2) - ZRI(:,:,:) = XRT(:,:,:,4) - ELSE IF( LUSERC .AND. (.NOT. LUSERI) ) THEN - ZRC(:,:,:) = XRT(:,:,:,2) - ZRI(:,:,:) = 0.0 - ELSE - ZRC(:,:,:) = 0.0 - ZRI(:,:,:) = 0.0 - END IF - WRITE(UNIT=ILUOUT,FMT='(" CONVECTION called for KTCOUNT=",I6)') & - KTCOUNT - IF ( LFORCING .AND. L1D ) THEN - ZWT(:,:,:) = XWTFRC(:,:,:) - ELSE - ZWT(:,:,:) = XWT(:,:,:) - ENDIF - IF (LDUST) CALL DUST_FILTER(XSVT(:,:,:,NSV_DSTBEG:NSV_DSTEND), XRHODREF(:,:,:)) - IF (LSALT) CALL SALT_FILTER(XSVT(:,:,:,NSV_SLTBEG:NSV_SLTEND), XRHODREF(:,:,:)) - IF (LCH_CONV_LINOX) THEN - CALL CONVECTION( XDTCONV, CDCONV, CSCONV, LREFRESH_ALL, LDOWN, NICE, & - LSETTADJ, XTADJD, XTADJS, LDIAGCONV, NENSM, & - XPABST, XZZ, ZDXDY, & - XTHT, XRT(:,:,:,1), ZRC, ZRI, XUT, XVT, & - ZWT,XTKET(:,:,IKB), & - NCOUNTCONV, XDTHCONV, XDRVCONV, XDRCCONV, XDRICONV, & - XPRCONV, XPRSCONV, & - XUMFCONV,XDMFCONV,XMFCONV,XPRLFLXCONV,XPRSFLXCONV, & - XCAPE, NCLTOPCONV, NCLBASCONV, & - LCHTRANS, XSVT, XDSVCONV, & - LUSECHEM, LCH_CONV_SCAV, LCH_CONV_LINOX, & - LDUST, LSALT, & - XRHODREF, XIC_RATE, XCG_RATE ) - ELSE - CALL CONVECTION( XDTCONV, CDCONV, CSCONV, LREFRESH_ALL, LDOWN, NICE, & - LSETTADJ, XTADJD, XTADJS, LDIAGCONV, NENSM, & - XPABST, XZZ, ZDXDY, & - XTHT, XRT(:,:,:,1), ZRC, ZRI, XUT, XVT, & - ZWT,XTKET(:,:,IKB), & - NCOUNTCONV, XDTHCONV, XDRVCONV, XDRCCONV, XDRICONV, & - XPRCONV, XPRSCONV, & - XUMFCONV,XDMFCONV,XMFCONV,XPRLFLXCONV,XPRSFLXCONV, & - XCAPE, NCLTOPCONV, NCLBASCONV, & - LCHTRANS, XSVT, XDSVCONV, & - LUSECHEM, LCH_CONV_SCAV, LCH_CONV_LINOX, & - LDUST, LSALT, & - XRHODREF ) - END IF -! - DEALLOCATE( ZRC ) - DEALLOCATE( ZRI ) - DEALLOCATE( ZWT ) - DEALLOCATE( ZDXDY ) - END IF - END IF -! -! Deep convection tendency integration -! - XRTHS(:,:,:) = XRTHS(:,:,:) + XRHODJ(:,:,:) * XDTHCONV(:,:,:) - XRRS(:,:,:,1) = XRRS(:,:,:,1) + XRHODJ(:,:,:) * XDRVCONV(:,:,:) -! -! -! Aerosols size distribution -! Compute Rg and sigma before tracers convection tendency (for orilam, dust and sea -! salt) -! - - IF ( LCHTRANS ) THEN ! update tracers for chemical transport - IF (LORILAM) ZRSVS(:,:,:,:) = XRSVS(:,:,:,:) ! - IF ((LDUST)) THEN ! dust convective balance - ALLOCATE(ZSIGDST(IIU,IJU,IKU,NMODE_DST)) - ALLOCATE(ZRGDST(IIU,IJU,IKU,NMODE_DST)) - ALLOCATE(ZNDST(IIU,IJU,IKU,NMODE_DST)) - ALLOCATE(ZSVDST(IIU,IJU,IKU,NSV_DST)) - ! - DO JSV=1,NMODE_DST - IMODEIDX = JPDUSTORDER(JSV) - IF (CRGUNITD=="MASS") THEN - ZINIRADIUS(JSV) = XINIRADIUS(IMODEIDX) * EXP(-3.*(LOG(XINISIG(IMODEIDX)))**2) - ELSE - ZINIRADIUS(JSV) = XINIRADIUS(IMODEIDX) - END IF - ZSIGDST(:,:,:,JSV) = XINISIG(IMODEIDX) - ZRGDST(:,:,:,JSV) = ZINIRADIUS(JSV) - ZNDST(:,:,:,JSV) = XN0MIN(IMODEIDX) - ENDDO - ! - DO JSV=NSV_DSTBEG,NSV_DSTEND - ZSVDST(:,:,:,JSV-NSV_DSTBEG+1) = XRSVS(:,:,:,JSV) * XTSTEP / XRHODJ(:,:,:) - ENDDO - CALL PPP2DUST(ZSVDST(IIB:IIE,IJB:IJE,IKB:IKE,:), XRHODREF(IIB:IIE,IJB:IJE,IKB:IKE),& - PSIG3D=ZSIGDST(IIB:IIE,IJB:IJE,IKB:IKE,:), PRG3D=ZRGDST(IIB:IIE,IJB:IJE,IKB:IKE,:), & - PN3D=ZNDST(IIB:IIE,IJB:IJE,IKB:IKE,:)) - END IF - ! - IF ((LSALT)) THEN ! sea salt convective balance - ALLOCATE(ZSIGSLT(IIU,IJU,IKU,NMODE_SLT)) - ALLOCATE(ZRGSLT(IIU,IJU,IKU,NMODE_SLT)) - ALLOCATE(ZNSLT(IIU,IJU,IKU,NMODE_SLT)) - ALLOCATE(ZSVSLT(IIU,IJU,IKU,NSV_SLT)) - ! - DO JSV=1,NMODE_SLT - IMODEIDX = JPSALTORDER(JSV) - IF (CRGUNITS=="MASS") THEN - ZINIRADIUS_SLT(JSV) = XINIRADIUS_SLT(IMODEIDX) * & - EXP(-3.*(LOG(XINISIG_SLT(IMODEIDX)))**2) - ELSE - ZINIRADIUS_SLT(JSV) = XINIRADIUS_SLT(IMODEIDX) - END IF - ZSIGSLT(:,:,:,JSV) = XINISIG_SLT(IMODEIDX) - ZRGSLT(:,:,:,JSV) = ZINIRADIUS_SLT(JSV) - ZNSLT(:,:,:,JSV) = XN0MIN_SLT(IMODEIDX) - ENDDO - ! - DO JSV=NSV_SLTBEG,NSV_SLTEND - ZSVSLT(:,:,:,JSV-NSV_SLTBEG+1) = XRSVS(:,:,:,JSV) * XTSTEP / XRHODJ(:,:,:) - ENDDO - CALL PPP2SALT(ZSVSLT(IIB:IIE,IJB:IJE,IKB:IKE,:), XRHODREF(IIB:IIE,IJB:IJE,IKB:IKE),& - PSIG3D=ZSIGSLT(IIB:IIE,IJB:IJE,IKB:IKE,:), PRG3D=ZRGSLT(IIB:IIE,IJB:IJE,IKB:IKE,:), & - PN3D=ZNSLT(IIB:IIE,IJB:IJE,IKB:IKE,:)) - END IF - ! -! -! Compute convective tendency for all tracers -! - IF (LCHTRANS) THEN - DO JSV = 1, SIZE(XRSVS,4) - XRSVS(:,:,:,JSV) = XRSVS(:,:,:,JSV) + XRHODJ(:,:,:) * XDSVCONV(:,:,:,JSV) - END DO - IF (LORILAM) THEN - DO JSV = NSV_AERBEG,NSV_AEREND - PWETDEPAER(:,:,:,JSV-NSV_AERBEG+1) = XDSVCONV(:,:,:,JSV) * XRHODJ(:,:,:) - XRSVS(:,:,:,JSV) = ZRSVS(:,:,:,JSV) - END DO - END IF - END IF -! - IF ((LDUST).AND.(LCHTRANS)) THEN ! dust convective balance - IF (CPROGRAM == "MESONH") THEN - DO JSV=NSV_DSTBEG,NSV_DSTEND - ZSVDST(:,:,:,JSV-NSV_DSTBEG+1) = XRSVS(:,:,:,JSV) * XTSTEP / XRHODJ(:,:,:) - ENDDO - ELSE - DO JSV=NSV_DSTBEG,NSV_DSTEND - ZSVDST(:,:,:,JSV-NSV_DSTBEG+1) = XSVT(:,:,:,JSV) - ENDDO - ENDIF - CALL DUST2PPP(ZSVDST(IIB:IIE,IJB:IJE,IKB:IKE,:), & - XRHODREF(IIB:IIE,IJB:IJE,IKB:IKE), ZSIGDST(IIB:IIE,IJB:IJE,IKB:IKE,:),& - ZRGDST(IIB:IIE,IJB:IJE,IKB:IKE,:)) - DO JSV=NSV_DSTBEG,NSV_DSTEND - XRSVS(:,:,:,JSV) = ZSVDST(:,:,:,JSV-NSV_DSTBEG+1) * XRHODJ(:,:,:) / XTSTEP - ENDDO - ! - DEALLOCATE(ZSVDST) - DEALLOCATE(ZNDST) - DEALLOCATE(ZRGDST) - DEALLOCATE(ZSIGDST) - END IF - ! - IF ((LSALT).AND.(LCHTRANS)) THEN ! sea salt convective balance - IF (CPROGRAM == "MESONH") THEN - DO JSV=NSV_SLTBEG,NSV_SLTEND - ZSVSLT(:,:,:,JSV-NSV_SLTBEG+1) = XRSVS(:,:,:,JSV) * XTSTEP / XRHODJ(:,:,:) - ENDDO - ELSE - DO JSV=NSV_SLTBEG,NSV_SLTEND - ZSVSLT(:,:,:,JSV-NSV_SLTBEG+1) = XSVT(:,:,:,JSV) - ENDDO - END IF - CALL SALT2PPP(ZSVSLT(IIB:IIE,IJB:IJE,IKB:IKE,:), & - XRHODREF(IIB:IIE,IJB:IJE,IKB:IKE), ZSIGSLT(IIB:IIE,IJB:IJE,IKB:IKE,:),& - ZRGSLT(IIB:IIE,IJB:IJE,IKB:IKE,:)) - DO JSV=NSV_SLTBEG,NSV_SLTEND - XRSVS(:,:,:,JSV) = ZSVSLT(:,:,:,JSV-NSV_SLTBEG+1) * XRHODJ(:,:,:) / XTSTEP - ENDDO - ! - DEALLOCATE(ZSVSLT) - DEALLOCATE(ZNSLT) - DEALLOCATE(ZRGSLT) - DEALLOCATE(ZSIGSLT) - END IF - ! -END IF -! - IF( LUSERC .AND. LUSERI ) THEN - XRRS(:,:,:,2) = XRRS(:,:,:,2) + XRHODJ(:,:,:) * XDRCCONV(:,:,:) - XRRS(:,:,:,4) = XRRS(:,:,:,4) + XRHODJ(:,:,:) * XDRICONV(:,:,:) -! - ELSE IF ( LUSERC .AND. (.NOT. LUSERI) ) THEN -! -! If only cloud water but no cloud ice is used, the convective tendency -! for cloud ice is added to the tendency for cloud water -! - XRRS(:,:,:,2) = XRRS(:,:,:,2) + XRHODJ(:,:,:) * (XDRCCONV(:,:,:) + & - XDRICONV(:,:,:) ) -! and cloud ice is melted -! - XRTHS(:,:,:) = XRTHS(:,:,:) - XRHODJ(:,:,:) * & - ( XP00/XPABST(:,:,:) )**(XRD/XCPD) * CST%XLMTT / XCPD * XDRICONV(:,:,:) -! - ELSE IF ( (.NOT. LUSERC) .AND. (.NOT. LUSERI) ) THEN -! -! If no cloud water and no cloud ice are used the convective tendencies for these -! variables are added to the water vapor tendency -! - XRRS(:,:,:,1) = XRRS(:,:,:,1) + XRHODJ(:,:,:) * (XDRCCONV(:,:,:) + & - XDRICONV(:,:,:) ) -! and all cloud condensate is evaporated -! - XRTHS(:,:,:) = XRTHS(:,:,:) - XRHODJ(:,:,:) / XCPD * ( & - CST%XLVTT * XDRCCONV(:,:,:) + CST%XLSTT * XDRICONV(:,:,:) ) *& - ( XP00 / XPABST(:,:,:) ) ** ( XRD / XCPD ) - END IF - - 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) ) - end do - end if -END IF -! -CALL SECOND_MNH2(ZTIME2) -! -PKAFR = PKAFR + ZTIME2 - ZTIME1 & - - XTIME_LES_BU_PROCESS - XTIME_BU_PROCESS -! -PTIME_BU = PTIME_BU + XTIME_LES_BU_PROCESS + XTIME_BU_PROCESS -! -!----------------------------------------------------------------------------- -! -!* 3. TURBULENT SURFACE FLUXES -! ------------------------ -! -ZTIME1 = ZTIME2 -! -IF (CSURF=='EXTE') THEN - CALL GOTO_SURFEX(IMI) -! - IF( LTRANS ) THEN - XUT(:,:,1+JPVEXT) = XUT(:,:,1+JPVEXT) + XUTRANS - XVT(:,:,1+JPVEXT) = XVT(:,:,1+JPVEXT) + XVTRANS - END IF - ! - ALLOCATE(ZDIR_ALB(IIU,IJU,NSWB_MNH)) - ALLOCATE(ZSCA_ALB(IIU,IJU,NSWB_MNH)) - ALLOCATE(ZEMIS (IIU,IJU,NLWB_MNH)) - ALLOCATE(ZTSRAD (IIU,IJU)) - ! - IKIDM=0 - DO JKID = IMI+1,NMODEL ! min value of the possible kids - IF (IMI == NDAD(JKID) .AND. XWAY(JKID) == 2. .AND. & - CPROGRAM=='MESONH' .AND. & - (CCONF == 'RESTA' .OR. (CCONF == 'START' .AND. KTCOUNT /= 1))) THEN - ! where kids exist, use the two-way output fields (i.e. OMASKkids true) - ! rather than the farther calculations in radiation and convection schemes -! BUG if number of the son does not follow the number of the dad -! IKIDM = JKID-IMI - IKIDM = IKIDM + 1 - IF (LUSERC .AND. ( & - (LSEDIC .AND. CCLOUD(1:3) == 'ICE') .OR. & - (LSEDC .AND. (CCLOUD == 'C2R2' .OR. CCLOUD == 'KHKO')) .OR. & - (MSEDC .AND. CCLOUD=='LIMA') & - )) THEN - WHERE (OMASKkids(:,:) ) - XINPRC(:,:) = ZSAVE_INPRC(:,:,IKIDM) - ENDWHERE - END IF - IF (LUSERR) THEN - WHERE (OMASKkids(:,:) ) - XINPRR(:,:) = ZSAVE_INPRR(:,:,IKIDM) - ENDWHERE - END IF - IF (LUSERS) THEN - WHERE (OMASKkids(:,:) ) - XINPRS(:,:) = ZSAVE_INPRS(:,:,IKIDM) - ENDWHERE - END IF - IF (LUSERG) THEN - WHERE (OMASKkids(:,:) ) - XINPRG(:,:) = ZSAVE_INPRG(:,:,IKIDM) - ENDWHERE - END IF - IF (LUSERH) THEN - WHERE (OMASKkids(:,:) ) - XINPRH(:,:) = ZSAVE_INPRH(:,:,IKIDM) - ENDWHERE - END IF - IF (CDCONV /= 'NONE') THEN - WHERE (OMASKkids(:,:) ) - XPRCONV(:,:) = ZSAVE_PRCONV(:,:,IKIDM) - XPRSCONV(:,:) = ZSAVE_PRSCONV(:,:,IKIDM) - ENDWHERE - END IF - IF (CRAD /= 'NONE') THEN - DO JSWB=1,NSWB_MNH - WHERE (OMASKkids(:,:) ) - XDIRFLASWD(:,:,JSWB) = ZSAVE_DIRFLASWD(:,:,JSWB,IKIDM) - XSCAFLASWD(:,:,JSWB) = ZSAVE_SCAFLASWD(:,:,JSWB,IKIDM) - XDIRSRFSWD(:,:,JSWB) = ZSAVE_DIRSRFSWD(:,:,JSWB,IKIDM) - ENDWHERE - ENDDO - END IF - ENDIF - END DO - ! - IF (IMODSON /= 0 ) THEN - DEALLOCATE( ZSAVE_INPRR,ZSAVE_INPRS,ZSAVE_INPRG,ZSAVE_INPRH) - DEALLOCATE( ZSAVE_INPRC,ZSAVE_PRCONV,ZSAVE_PRSCONV) - DEALLOCATE( ZSAVE_DIRFLASWD,ZSAVE_SCAFLASWD,ZSAVE_DIRSRFSWD) - END IF - CALL GROUND_PARAM_n(YLDIMPHYEX,ZSFTH, ZSFRV, ZSFSV, ZSFCO2, ZSFU, ZSFV, & - ZDIR_ALB, ZSCA_ALB, ZEMIS, ZTSRAD, KTCOUNT, TPFILE ) - ! - IF (LIBM) THEN - WHERE(XIBM_LS(:,:,IKB,1).GT.-XIBM_EPSI) - ZSFTH(:,:)=0. - ZSFRV(:,:)=0. - ZSFU (:,:)=0. - ZSFV (:,:)=0. - ENDWHERE - IF (NSV>0) THEN - DO JSV = 1 , NSV - WHERE(XIBM_LS(:,:,IKB,1).GT.-XIBM_EPSI) ZSFSV(:,:,JSV)=0. - ENDDO - ENDIF - ENDIF - ! - IF (SIZE(XEMIS)>0) THEN - XDIR_ALB = ZDIR_ALB - XSCA_ALB = ZSCA_ALB - XEMIS = ZEMIS - XTSRAD = ZTSRAD - END IF - ! - DEALLOCATE(ZDIR_ALB) - DEALLOCATE(ZSCA_ALB) - DEALLOCATE(ZEMIS ) - DEALLOCATE(ZTSRAD ) - ! - ! - IF( LTRANS ) THEN - XUT(:,:,1+JPVEXT) = XUT(:,:,1+JPVEXT) - XUTRANS - XVT(:,:,1+JPVEXT) = XVT(:,:,1+JPVEXT) - XVTRANS - END IF -! -ELSE ! case no SURFEX (CSURF logical) - ZSFSV = 0. - ZSFCO2 = 0. - IF (.NOT.LOCEAN) THEN - ZSFTH = 0. - ZSFRV = 0. - ZSFSV = 0. - ZSFCO2 = 0. - ZSFU = 0. - ZSFV = 0. - END IF -END IF !CSURF -! -CALL SECOND_MNH2(ZTIME2) -! -PGROUND = PGROUND + ZTIME2 - ZTIME1 -! -!----------------------------------------------------------------------------- -! -!* 3.1 EDDY FLUXES PARAMETRIZATION -! ------------------ -! -IF (IMI==1) THEN ! On calcule les flus turb. comme preconise par PP - - ! Heat eddy fluxes - IF ( LTH_FLX ) CALL EDDY_FLUX_n(IMI,KTCOUNT,XVT,XTHT,XRHODJ,XRTHS,XVTH_FLUX_M,XWTH_FLUX_M) - ! - ! Momentum eddy fluxes - IF ( LUV_FLX ) CALL EDDYUV_FLUX_n(IMI,KTCOUNT,XVT,XTHT,XRHODJ,XRHODREF,XPABSM,XRVS,XVU_FLUX_M) - -ELSE - ! TEST pour maille infèrieure à 20km ? - ! car pb d'instabilités ? - ! Pour le modèle fils, on spawne les flux du modèle père - ! Heat eddy fluxes - IF ( LTH_FLX ) CALL EDDY_FLUX_ONE_WAY_n (IMI,KTCOUNT,NDXRATIO_ALL(IMI),NDYRATIO_ALL(IMI),CLBCX,CLBCY) - ! - ! Momentum eddy fluxes - IF ( LUV_FLX ) CALL EDDYUV_FLUX_ONE_WAY_n (IMI,KTCOUNT,NDXRATIO_ALL(IMI),NDYRATIO_ALL(IMI),CLBCX,CLBCY) - ! -END IF -!----------------------------------------------------------------------------- -! -!* 4. PASSIVE POLLUTANTS -! ------------------ -! -ZTIME1 = ZTIME2 -! -IF (LPASPOL) CALL PASPOL(XTSTEP, ZSFSV, ILUOUT, NVERB, TPFILE) -! -! -!* 4b. PASSIVE POLLUTANTS FOR MASS-FLUX SCHEME DIAGNOSTICS -! --------------------------------------------------- -! -IF (LCONDSAMP) CALL CONDSAMP(XTSTEP, ZSFSV, ILUOUT, NVERB) -! -CALL SECOND_MNH2(ZTIME2) -! -PTRACER = PTRACER + ZTIME2 - ZTIME1 -!----------------------------------------------------------------------------- -! -!* 5a. Drag force -! ---------- -! -ZTIME1 = ZTIME2 -XTIME_BU_PROCESS = 0. -XTIME_LES_BU_PROCESS = 0. -! -IF (LDRAGTREE) CALL DRAG_VEG( XTSTEP, XUT, XVT, XTKET, LDEPOTREE, XVDEPOTREE, & - CCLOUD, XPABST, XTHT, XRT, XSVT, XRHODJ, XZZ, & - XRUS, XRVS, XRTKES, XRRS, XRSVS ) -! -IF (LDRAGBLDG) CALL DRAG_BLD( XTSTEP, XUT, XVT, XTKET, XRHODJ, XZZ, XRUS, XRVS, XRTKES ) -! -CALL SECOND_MNH2(ZTIME2) -! -PDRAG = PDRAG + ZTIME2 - ZTIME1 & - - XTIME_LES_BU_PROCESS - XTIME_BU_PROCESS -! -PTIME_BU = PTIME_BU + XTIME_LES_BU_PROCESS + XTIME_BU_PROCESS -! -!* 5b. Drag force from wind turbines -! ----------------------- -! -ZTIME1 = ZTIME2 -XTIME_BU_PROCESS = 0. -XTIME_LES_BU_PROCESS = 0. -! -IF (LMAIN_EOL .AND. IMI == NMODEL_EOL) THEN - CALL EOL_MAIN(KTCOUNT,XTSTEP, & - XDXX,XDYY,XDZZ, & - XRHODJ, & - XUT,XVT,XWT, & - XRUS, XRVS, XRWS ) -END IF -! -CALL SECOND_MNH2(ZTIME2) -! -PEOL = PEOL + ZTIME2 - ZTIME1 & - - XTIME_LES_BU_PROCESS - XTIME_BU_PROCESS -! -PTIME_BU = PTIME_BU + XTIME_LES_BU_PROCESS + XTIME_BU_PROCESS -! -!* -!----------------------------------------------------------------------------- -! -!* 6. TURBULENCE SCHEME -! ----------------- -! -ZTIME1 = ZTIME2 -XTIME_BU_PROCESS = 0. -XTIME_LES_BU_PROCESS = 0. -! -ZSFTH(:,:) = ZSFTH(:,:) * XDIRCOSZW(:,:) -ZSFRV(:,:) = ZSFRV(:,:) * XDIRCOSZW(:,:) -DO JSV=1,NSV - ZSFSV(:,:,JSV) = ZSFSV(:,:,JSV) * XDIRCOSZW(:,:) -END DO -! -IF (LLES_CALL) CALL SWITCH_SBG_LES_n -! -! -IF ( CTURB == 'TKEL' ) THEN -! - -!* 6.1 complete surface flux fields on the border -! -!!$ IF(NHALO == 1) THEN - CALL ADD2DFIELD_ll( TZFIELDS_ll, ZSFTH, 'PHYS_PARAM_n::ZSFTH' ) - CALL ADD2DFIELD_ll( TZFIELDS_ll, ZSFRV, 'PHYS_PARAM_n::ZSFRV' ) - CALL ADD2DFIELD_ll( TZFIELDS_ll, ZSFU, 'PHYS_PARAM_n::ZSFU' ) - CALL ADD2DFIELD_ll( TZFIELDS_ll, ZSFV, 'PHYS_PARAM_n::ZSFV' ) - IF(NSV >0)THEN - DO JSV=1,NSV - write ( ynum, '( I6 ) ' ) jsv - CALL ADD2DFIELD_ll( TZFIELDS_ll, ZSFSV(:,:,JSV), 'PHYS_PARAM_n::ZSFSV:'//trim( adjustl( ynum ) ) ) - END DO - END IF - CALL ADD2DFIELD_ll( TZFIELDS_ll, ZSFCO2, 'PHYS_PARAM_n::ZSFCO2' ) - CALL UPDATE_HALO_ll(TZFIELDS_ll,IINFO_ll) - CALL CLEANLIST_ll(TZFIELDS_ll) -!!$ END IF -! - CALL MPPDB_CHECK2D(ZSFU,"phys_param::ZSFU",PRECISION) - ! - IF ( CLBCX(1) /= "CYCL" .AND. LWEST_ll()) THEN - ZSFTH(IIB-1,:)=ZSFTH(IIB,:) - ZSFRV(IIB-1,:)=ZSFRV(IIB,:) - ZSFU(IIB-1,:)=ZSFU(IIB,:) - ZSFV(IIB-1,:)=ZSFV(IIB,:) - IF (NSV>0) THEN - ZSFSV(IIB-1,:,:)=ZSFSV(IIB,:,:) - WHERE ((ZSFSV(IIB-1,:,:).LT.0.).AND.(XSVT(IIB-1,:,IKB,:).EQ.0.)) - ZSFSV(IIB-1,:,:) = 0. - END WHERE - ENDIF - ZSFCO2(IIB-1,:)=ZSFCO2(IIB,:) - END IF - ! - IF ( CLBCX(2) /= "CYCL" .AND. LEAST_ll()) THEN - ZSFTH(IIE+1,:)=ZSFTH(IIE,:) - ZSFRV(IIE+1,:)=ZSFRV(IIE,:) - ZSFU(IIE+1,:)=ZSFU(IIE,:) - ZSFV(IIE+1,:)=ZSFV(IIE,:) - IF (NSV>0) THEN - ZSFSV(IIE+1,:,:)=ZSFSV(IIE,:,:) - WHERE ((ZSFSV(IIE+1,:,:).LT.0.).AND.(XSVT(IIE+1,:,IKB,:).EQ.0.)) - ZSFSV(IIE+1,:,:) = 0. - END WHERE - ENDIF - ZSFCO2(IIE+1,:)=ZSFCO2(IIE,:) - END IF - ! - IF ( CLBCY(1) /= "CYCL" .AND. LSOUTH_ll()) THEN - ZSFTH(:,IJB-1)=ZSFTH(:,IJB) - ZSFRV(:,IJB-1)=ZSFRV(:,IJB) - ZSFU(:,IJB-1)=ZSFU(:,IJB) - ZSFV(:,IJB-1)=ZSFV(:,IJB) - IF (NSV>0) THEN - ZSFSV(:,IJB-1,:)=ZSFSV(:,IJB,:) - WHERE ((ZSFSV(:,IJB-1,:).LT.0.).AND.(XSVT(:,IJB-1,IKB,:).EQ.0.)) - ZSFSV(:,IJB-1,:) = 0. - END WHERE - ENDIF - ZSFCO2(:,IJB-1)=ZSFCO2(:,IJB) - END IF - ! - IF ( CLBCY(2) /= "CYCL" .AND. LNORTH_ll()) THEN - ZSFTH(:,IJE+1)=ZSFTH(:,IJE) - ZSFRV(:,IJE+1)=ZSFRV(:,IJE) - ZSFU(:,IJE+1)=ZSFU(:,IJE) - ZSFV(:,IJE+1)=ZSFV(:,IJE) - IF (NSV>0) THEN - ZSFSV(:,IJE+1,:)=ZSFSV(:,IJE,:) - WHERE ((ZSFSV(:,IJE+1,:).LT.0.).AND.(XSVT(:,IJE+1,IKB,:).EQ.0.)) - ZSFSV(:,IJE+1,:) = 0. - END WHERE - ENDIF - ZSFCO2(:,IJE+1)=ZSFCO2(:,IJE) - END IF -! - IF( LTRANS ) THEN - XUT(:,:,:) = XUT(:,:,:) + XUTRANS - XVT(:,:,:) = XVT(:,:,:) + XVTRANS - END IF -! -! -IF(ALLOCATED(XTHW_FLUX)) THEN - DEALLOCATE(XTHW_FLUX) - ALLOCATE(XTHW_FLUX(SIZE(XTHT,1),SIZE(XTHT,2),SIZE(XTHT,3))) -ELSE - ALLOCATE(XTHW_FLUX(SIZE(XTHT,1),SIZE(XTHT,2),SIZE(XTHT,3))) -END IF - -IF(ALLOCATED(XRCW_FLUX)) THEN - DEALLOCATE(XRCW_FLUX) - ALLOCATE(XRCW_FLUX(SIZE(XTHT,1),SIZE(XTHT,2),SIZE(XTHT,3))) -ELSE - ALLOCATE(XRCW_FLUX(SIZE(XTHT,1),SIZE(XTHT,2),SIZE(XTHT,3))) -END IF -! -IF(ALLOCATED(XSVW_FLUX)) THEN - DEALLOCATE(XSVW_FLUX) - ALLOCATE(XSVW_FLUX(SIZE(XSVT,1),SIZE(XSVT,2),SIZE(XSVT,3),SIZE(XSVT,4))) -ELSE - ALLOCATE(XSVW_FLUX(SIZE(XSVT,1),SIZE(XSVT,2),SIZE(XSVT,3),SIZE(XSVT,4))) -END IF -! -GCOMPUTE_SRC=SIZE(XSIGS, 3)/=0 -! -ALLOCATE(ZTDIFF(IIU,IJU,IKU)) -ALLOCATE(ZTDISS(IIU,IJU,IKU)) -! -!! Compute Shape of sfc flux for Oceanic Deep Conv Case -! -IF (LOCEAN .AND. LDEEPOC) THEN - ALLOCATE(ZDIST(IIU,IJU)) - !* COMPUTES THE PHYSICAL SUBDOMAIN BOUNDS - ALLOCATE(ZXHAT_ll(NIMAX_ll+2*JPHEXT),ZYHAT_ll(NJMAX_ll+2*JPHEXT)) - !compute ZXHAT_ll = position in the (0:Lx) domain 1 (Lx=Size of domain1 ) - !compute XXHAT_ll = position in the (L0_subproc,Lx_subproc) domain for the current subproc - ! L0_subproc as referenced in the full domain 1 - CALL GATHERALL_FIELD_ll('XX',XXHAT,ZXHAT_ll,IRESP) - CALL GATHERALL_FIELD_ll('YY',XYHAT,ZYHAT_ll,IRESP) - CALL GET_DIM_EXT_ll('B',IIU,IJU) - DO JJ = IJB,IJE - DO JI = IIB,IIE - ZDIST(JI,JJ) = SQRT( & - (( (XXHAT(JI)+XXHAT(JI+1))*0.5 - XCENTX_OC ) / XRADX_OC)**2 + & - (( (XYHAT(JJ)+XYHAT(JJ+1))*0.5 - XCENTY_OC ) / XRADY_OC)**2 & - ) - END DO - END DO - DO JJ=IJB,IJE - DO JI=IIB,IIE - IF ( ZDIST(JI,JJ) > 1.) ZSFTH(JI,JJ)=0. - END DO - END DO -END IF !END DEEP OCEAN CONV CASE -! -LSTATNW = .FALSE. -LHARAT = .FALSE. -! -IF(LLEONARD) THEN - IGRADIENTS=6 - ALLOCATE(ZHGRAD(IIU,IJU,IKU,IGRADIENTS)) - ZHGRAD(:,:,:,1) = GX_W_UW(XWT(:,:,:), XDXX,XDZZ,XDZX,1,IKU,1) - ZHGRAD(:,:,:,2) = GY_W_VW(XWT(:,:,:), XDXX,XDZZ,XDZX,1,IKU,1) - ZHGRAD(:,:,:,3) = GX_M_M(XTHT(:,:,:), XDXX,XDZZ,XDZX,1,IKU,1) - ZHGRAD(:,:,:,4) = GY_M_M(XTHT(:,:,:), XDXX,XDZZ,XDZX,1,IKU,1) - ZHGRAD(:,:,:,5) = GX_M_M(XRT(:,:,:,1), XDXX,XDZZ,XDZX,1,IKU,1) - ZHGRAD(:,:,:,6) = GY_M_M(XRT(:,:,:,1), XDXX,XDZZ,XDZX,1,IKU,1) -END IF - CALL TURB( CST,CSTURB, TBUCONF, TURBN,YLDIMPHYEX,TLES, & - IMI, NRR, NRRL, NRRI, CLBCX, CLBCY, IGRADIENTS, NHALO, & - 1, NMODEL_CLOUD, & - NSV, NSV_LGBEG, NSV_LGEND,CPROGRAM, & - NSV_LIMA_NR, NSV_LIMA_NS, NSV_LIMA_NG, NSV_LIMA_NH, & - L2D, LNOMIXLG,LFLAT, & - LCOUPLES, LBLOWSNOW, LIBM, & - GCOMPUTE_SRC, XRSNOW, & - LOCEAN, LDEEPOC, LDIAG_IN_RUN, & - CTURBLEN_CLOUD, CCLOUD, & - XTSTEP, TPFILE, & - XDXX, XDYY, XDZZ, XDZX, XDZY, XZZ, & - XDIRCOSXW, XDIRCOSYW, XDIRCOSZW, XCOSSLOPE, XSINSLOPE, & - XRHODJ, XTHVREF, ZHGRAD, XZS, & - ZSFTH, ZSFRV, ZSFSV, ZSFU, ZSFV, & - XPABST, XUT, XVT, XWT, XTKET, XSVT, XSRCT, & - ZLENGTHM, ZLENGTHH, ZMFMOIST, & - XBL_DEPTH, XSBL_DEPTH, & - XCEI, XCEI_MIN, XCEI_MAX, XCOEF_AMPL_SAT, & - XTHT, XRT, & - XRUS, XRVS, XRWS, XRTHS, XRRS, XRSVS, XRTKES, XSIGS, XWTHVMF, & - XTHW_FLUX, XRCW_FLUX, XSVW_FLUX,XDYP, XTHP, ZTDIFF, ZTDISS, & - TBUDGETS, KBUDGETS=SIZE(TBUDGETS),PLEM=XLEM,PRTKEMS=XRTKEMS, & - PTR=XTR, PDISS=XDISS, PCURRENT_TKE_DISS=XCURRENT_TKE_DISS, & - PIBM_LS=XIBM_LS(:,:,:,1), PIBM_XMUT=XIBM_XMUT, & - PSSTFL=XSSTFL, PSSTFL_C=XSSTFL_C, PSSRFL_C=XSSRFL_C, & - PSSUFL_C=XSSUFL_C, PSSVFL_C=XSSVFL_C, PSSUFL=XSSUFL, PSSVFL=XSSVFL ) -! -DEALLOCATE(ZTDIFF) -DEALLOCATE(ZTDISS) -IF(LLEONARD) DEALLOCATE(ZHGRAD) -! -IF (LRMC01) THEN - CALL ADD2DFIELD_ll( TZFIELDS_ll, XSBL_DEPTH, 'PHYS_PARAM_n::XSBL_DEPTH' ) - CALL UPDATE_HALO_ll(TZFIELDS_ll,IINFO_ll) - CALL CLEANLIST_ll(TZFIELDS_ll) - IF ( CLBCX(1) /= "CYCL" .AND. LWEST_ll()) THEN - XSBL_DEPTH(IIB-1,:)=XSBL_DEPTH(IIB,:) - END IF - IF ( CLBCX(2) /= "CYCL" .AND. LEAST_ll()) THEN - XSBL_DEPTH(IIE+1,:)=XSBL_DEPTH(IIE,:) - END IF - IF ( CLBCY(1) /= "CYCL" .AND. LSOUTH_ll()) THEN - XSBL_DEPTH(:,IJB-1)=XSBL_DEPTH(:,IJB) - END IF - IF ( CLBCY(2) /= "CYCL" .AND. LNORTH_ll()) THEN - XSBL_DEPTH(:,IJE+1)=XSBL_DEPTH(:,IJE) - END IF -END IF -! -CALL SECOND_MNH2(ZTIME3) -! -!----------------------------------------------------------------------------- -! -!* 7. EDMF SCHEME -! ----------- -! -IF (CSCONV == 'EDKF') THEN - ALLOCATE(ZEXN (IIU,IJU,IKU)) - ALLOCATE(ZSIGMF (IIU,IJU,IKU)) - ZSIGMF(:,:,:)=0. - ZEXN(:,:,:)=(XPABST(:,:,:)/XP00)**(XRD/XCPD) - !$20131113 check3d on ZEXN - CALL MPPDB_CHECK3D(ZEXN,"physparan.7::ZEXN",PRECISION) - CALL ADD3DFIELD_ll( TZFIELDS_ll, ZEXN, 'PHYS_PARAM_n::ZEXN' ) - !$20131113 add update_halo_ll - CALL UPDATE_HALO_ll(TZFIELDS_ll,IINFO_ll) - CALL CLEANLIST_ll(TZFIELDS_ll) - CALL MPPDB_CHECK3D(ZEXN,"physparam.7::ZEXN",PRECISION) - ! - CALL SHALLOW_MF_PACK(NRR,NRRL,NRRI, & - LMF_FLX,TPFILE,ZTIME_LES_MF, & - XIMPL_MF, XTSTEP, & - XDZZ, XZZ,XDXHAT(1),XDYHAT(1), & - XRHODJ, XRHODREF, XPABST, ZEXN, ZSFTH, ZSFRV, & - XTHT,XRT,XUT,XVT,XTKET,XSVT, & - XRTHS,XRRS,XRUS,XRVS,XRSVS, & - ZSIGMF,XRC_MF, XRI_MF, XCF_MF, XWTHVMF) -! -ELSE - XWTHVMF(:,:,:)=0. - XRC_MF(:,:,:)=0. - XRI_MF(:,:,:)=0. - XCF_MF(:,:,:)=0. -ENDIF -! -CALL SECOND_MNH2(ZTIME4) - - IF( LTRANS ) THEN - XUT(:,:,:) = XUT(:,:,:) - XUTRANS - XVT(:,:,:) = XVT(:,:,:) - XVTRANS - END IF - IF (CMF_CLOUD == 'STAT') THEN - XSIGS =SQRT( XSIGS**2 + ZSIGMF**2 ) - ENDIF - IF (CSCONV == 'EDKF') THEN - DEALLOCATE(ZSIGMF) - DEALLOCATE(ZEXN) - ENDIF -END IF -! -IF (LLES_CALL) CALL SWITCH_SBG_LES_n -! -CALL SECOND_MNH2(ZTIME2) -! -PTURB = PTURB + ZTIME2 - ZTIME1 - (XTIME_LES-ZTIME_LES_MF) - XTIME_LES_BU_PROCESS & - - XTIME_BU_PROCESS - (ZTIME4 - ZTIME3) -! -PMAFL = PMAFL + ZTIME4 - ZTIME3 - ZTIME_LES_MF -! -PTIME_BU = PTIME_BU + XTIME_LES_BU_PROCESS + XTIME_BU_PROCESS -! -! -!------------------------------------------------------------------------------- -! -!* deallocation of variables used in more than one parameterization -! -DEALLOCATE(ZSFU ) ! surface schemes + turbulence -DEALLOCATE(ZSFV ) -DEALLOCATE(ZSFTH ) -DEALLOCATE(ZSFRV ) -DEALLOCATE(ZSFSV ) -DEALLOCATE(ZSFCO2) -! -!------------------------------------------------------------------------------- -! -END SUBROUTINE PHYS_PARAM_n - diff --git a/src/mesonh/ext/prep_ideal_case.f90 b/src/mesonh/ext/prep_ideal_case.f90 deleted file mode 100644 index 3a340fe6f0ce0330b6727c223f8c1b89204fad26..0000000000000000000000000000000000000000 --- a/src/mesonh/ext/prep_ideal_case.f90 +++ /dev/null @@ -1,1950 +0,0 @@ -!MNH_LIC Copyright 1994-2021 CNRS, Meteo-France and Universite Paul Sabatier -!MNH_LIC This is part of the Meso-NH software governed by the CeCILL-C licence -!MNH_LIC version 1. See LICENSE, CeCILL-C_V1-en.txt and CeCILL-C_V1-fr.txt -!MNH_LIC for details. version 1. -!----------------------------------------------------------------- -! ####################### - PROGRAM PREP_IDEAL_CASE -! ####################### -! -!!**** *PREP_IDEAL_CASE* - program to write an initial FM-file -!! -!! PURPOSE -!! ------- -! The purpose of this program is to prepare an initial meso-NH file -! (LFIFM and DESFM files) filled with some idealized fields. -! -! ---- The present version can provide two types of fields: -! -! 1) CIDEAL = 'CSTN' : 3D fields derived from a vertical profile with -! --------------- n levels of constant moist Brunt Vaisala frequency -! The vertical profile is read in EXPRE file. -! These fields can be used for model runs -! -! 2) CIDEAL = 'RSOU' : 3D fields derived from a radiosounding. -! --------------- -! The radiosounding is read in EXPRE file. -! The following kind of data is permitted : -! YKIND = 'STANDARD' : Zsol, Psol, Tsol, TDsol -! (Pressure, dd, ff) , -! (Pressure, T, Td) -! YKIND = 'PUVTHVMR' : zsol, Psol, Thvsol, Rsol -! (Pressure, U, V) , -! (Pressure, THv, R) -! YKIND = 'PUVTHVHU' : zsol, Psol, Thvsol, Husol -! (Pressure, U, V) , -! (Pressure, THv, Hu) -! YKIND = 'ZUVTHVHU' : zsol, Psol, Thvsol, Husol -! (height, U, V) , -! (height, THv, Hu) -! YKIND = 'ZUVTHVMR' : zsol, Psol, Thvsol, Rsol -! (height, U, V) , -! (height, THv, R) -! YKIND = 'PUVTHDMR' : zsol, Psol, Thdsol, Rsol -! (Pressure, U, V) , -! (Pressure, THd, R) -! YKIND = 'PUVTHDHU' : zsol, Psol, Thdsol, Husol -! (Pressure, U, V) , -! (Pressure, THd, Hu) -! YKIND = 'ZUVTHDMR' : zsol, Psol, Thdsol, Rsol -! (height, U, V) , -! (height, THd, R) -! YKIND = 'ZUVTHLMR' : zsol, Psol, Thdsol, Rsol -! (height, U, V) , -! (height, THl, Rt) -! -! These fields can be used for model runs -! -! Cases (1) and (2) can be balanced -! (geostrophic, hydrostatic and anelastic balances) if desired. -! -! ---- The orography can be flat (YZS='FLAT'), but also -! sine-shaped (YZS='SINE') or bell-shaped (YZS='BELL') -! -! ---- The U(z) profile given in the RSOU and CSTN cases can -! be multiplied (CUFUN="Y*Z") by a function of y (function FUNUY) -! The V(z) profile given in the RSOU and CSTN cases can -! be multiplied (CVFUN="X*Z") by a function of x (function FUNVX). -! If it is not the case, i.e. U(y,z)=U(z) then CUFUN="ZZZ" and -! CVFUN="ZZZ" for V(y,z)=V(z). Instead of these separable forms, -! non-separables functions FUNUYZ (CUFUN="Y,Z") and FUNVXZ (CVFUN="X,Z") -! can be used to specify the wind components. -! -!!** METHOD -!! ------ -!! The directives and data to perform the preparation of the initial FM -!! file are stored in EXPRE file. This file is composed of two parts : -!! - a namelists-format part which is present in all cases -!! - a free-format part which contains data in cases -!! of discretised orography (CZS='DATA') -!! of radiosounding (CIDEAL='RSOU') or Nv=cste profile (CIDEAL='CSTN') -!! of forced version (LFORCING=.TRUE.) -!! -!! -!! The following PREP_IDEAL_CASE program : -!! -!! - initializes physical constants by calling INI_CST -!! -!! - sets default values for global variables which will be -!! written in DESFM file and for variables in EXPRE file (namelists part) -!! which will be written in LFIFM file. -!! -!! - reads the namelists part of EXPRE file which gives -!! informations about the preinitialization to perform, -!! -!! - allocates memory for arrays, -!! -!! - initializes fields depending on the -!! directives (CIDEAL in namelist NAM_CONF_PRE) : -!! -!! * grid variables : -!! The gridpoints are regularly spaced by XDELTAX, XDELTAY. -!! The grid is stretched along the z direction, the mesh varies -!! from XDZGRD near the ground to XDZTOP near the top and the -!! weigthing function is a TANH function characterized by its -!! center and width above and under this center -!! The orography is initialized following the kind of orography -!! (YZS in namelist NAM_CONF_PRE) and the degrees of freedom : -!! sine-shape ---> ZHMAX, IEXPX,IEXPY -!! bell-shape ---> ZHMAX, ZAX,ZAY,IIZS,IJZS -!! The horizontal grid variables are initialized following -!! the kind of geometry (LCARTESIAN in namelist NAM_CONF_PRE) -!! and the grid parameters XLAT0,XLON0,XBETA in both geometries -!! and XRPK,XLONORI,XLATORI in conformal projection. -!! In the case of initialization from a radiosounding, the -!! date and time is read in free-part of the EXPRE file. In other -!! cases year, month and day are set to NUNDEF and time to 0. -!! -!! * prognostic fields : -!! -!! U,V,W, Theta and r. are first determined. They are -!! multiplied by rhoj after the anelastic reference state -!! computation. -!! For the CSTN and RSOU cases, the determination of -!! Theta and rv is performed respectively by SET_RSOU -!! and by SET_CSTN which call the common routine SET_MASS. -!! These three routines have the following actions : -!! --- The input vertical profile is converted in -!! variables (U,V,thetav,r) and interpolated -!! on a mixed grid (with VERT_COORD) as in PREP_REAL_CASE -!! --- A variation of the u-wind component( x-model axis component) -!! is possible in y direction, a variation of the v-wind component -!! (y-model axis component) is possible in x direction. -!! --- Thetav could be computed with thermal wind balance -!! (LGEOSBAL=.TRUE. with call of SET_GEOSBAL) -!! --- The mass fields (theta and r ) and the wind components are -!! then interpolated on the model grid with orography as in -!! PREP_REAL_CASE with the option LSHIFT -!! --- An anelastic correction is applied in PRESSURE_IN_PREP in -!! the case of non-vanishing orography. -!! -!! * anelastic reference state variables : -!! -!! 1D reference state : -!! RSOU and CSTN cases : rhorefz and thvrefz are computed -!! by SET_REFZ (called by SET_MASS). -!! They are deduced from thetav and r on the model grid -!! without orography. -!! The 3D reference state is computed by SET_REF -!! -!! * The total mass of dry air is computed by TOTAL_DMASS -!! -!! - writes the DESFM file, -!! -!! - writes the LFIFM file . -!! -!! EXTERNAL -!! -------- -!! DEFAULT_DESFM : to set default values for variables which can be -!! contained in DESFM file -!! DEFAULT_EXPRE : to set default values for other global variables -!! which can be contained in namelist-part of EXPRE file -!! Module MODE_GRIDPROJ : contains conformal projection routines -!! SM_GRIDPROJ : to compute some grid variables, in -!! case of conformal projection. -!! Module MODE_GRIDCART : contains cartesian geometry routines -!! SM_GRIDCART : to compute some grid variables, in -!! case of cartesian geometry. -!! SET_RSOU : to initialize mass fields from a radiosounding -!! SET_CSTN : to initialize mass fields from a vertical profile of -!! n layers of Nv=cste -!! SET_REF : to compute rhoJ -!! RESSURE_IN_PREP : to apply an anelastic correction in the case of -!! non-vanishing orography -!! IO_File_open : to open a FM-file (DESFM + LFIFM) -!! WRITE_DESFM : to write the DESFM file -!! WRI_LFIFM : to write the LFIFM file -!! IO_File_close : to close a FM-file (DESFM + LFIFM) -!! -!! MXM,MYM,MZM : Shuman operators -!! WGUESS : to compute W with the continuity equation from -!! the U,V values -!! -!! -!! -!! IMPLICIT ARGUMENTS -!! ------------------ -!! Module MODD_PARAMETERS : contains parameters -!! Module MODD_DIM1 : contains dimensions -!! Module MODD_CONF : contains configuration variables for -!! all models -!! Module MODD_CST : contains physical constants -!! Module MODD_GRID : contains grid variables for all models -!! Module MODD_GRID1 : contains grid variables -!! Module MODD_TIME : contains time variables for all models -!! Module MODD_TIME1 : contains time variables -!! Module MODD_REF : contains reference state variables for -!! all models -!! Module MODD_REF1 : contains reference state variables -!! Module MODD_LUNIT : contains variables which concern names -!! and logical unit numbers of files for all models -!! Module MODD_FIELD1 : contains prognostics variables -!! Module MODD_GR_FIELD1 : contains the surface prognostic variables -!! Module MODD_LSFIELD1 : contains Larger Scale fields -!! Module MODD_DYN1 : contains dynamic control variables for model 1 -!! Module MODD_LBC1 : contains lbc control variables for model 1 -!! -!! -!! Module MODN_CONF1 : contains configuration variables for model 1 -!! and the NAMELIST list -!! Module MODN_LUNIT1 : contains variables which concern names -!! and logical unit numbers of files and -!! the NAMELIST list -!! -!! -!! REFERENCE -!! --------- -!! Book2 of MESO-NH documentation (program PREP_IDEAL_CASE) -!! -!! AUTHOR -!! ------ -!! V. Ducrocq *Meteo France* -!! -!! MODIFICATIONS -!! ------------- -!! Original 05/05/94 -!! updated V. Ducrocq 27/06/94 -!! updated P.M. 27/07/94 -!! updated V. Ducrocq 23/08/94 -!! updated V. Ducrocq 01/09/94 -!! namelist changes J. Stein 26/10/94 -!! namelist changes J. Stein 04/11/94 -!! remove the second step of the geostrophic balance 14/11/94 (J.Stein) -!! add grid stretching in the z direction + Larger scale fields + -!! cleaning 6/12/94 (J.Stein) -!! periodize the orography and the grid sizes in the periodic case -!! 19/12/94 (J.Stein) -!! correct a bug in the Larger Scale Fields initialization -!! 19/12/94 (J.Stein) -!! add the vertical grid stretching 02/01/95 (J. Stein) -!! Total mass of dry air computation 02/01/95 (J.P.Lafore) -!! add the 1D switch 13/01/95 (J. Stein) -!! enforce a regular vertical grid if desired 18/01/95 (J. Stein) -!! add the tdtcur initialization 26/01/95 (J. Stein) -!! bug in the test of the type of RS localization 25/02/95 (J. Stein) -!! remove R from the historical variables 16/03/95 (J. Stein) -!! error on the grid stretching 30/06/95 (J. Stein) -!! add the soil fields 01/09/95 (S.Belair) -!! change the streching function and the wind guess -!! (J. Stein and V.Masson) 21/09/95 -!! reset to FALSE LUSERC,..,LUSERH 12/12/95 (J. Stein) -!! enforce the RS localization in 1D and 2D config. -!! + add the 'TSZ0' option for the soil variables 28/01/96 (J. Stein) -!! initialization of domain from center point 31/01/96 (V. Masson) -!! add the constant file reading 05/02/96 (J. Stein) -!! enter vertical model levels values 20/10/95 (T.Montmerle) -!! add LFORCING option 19/02/96 (K. Suhre) -!! modify structure of NAM_CONF_PRE 20/02/96 (J.-P. Pinty) -!! default of the domain center when use of pgd file 12/03/96 (V. Masson) -!! change the surface initialization 20/03/96 ( Stein, -!! Bougeault, Kastendeutsch ) -!! change the DEFAULT_DESFMN CALL 17/04/96 ( Lafore ) -!! set the STORAGE_TYPE to 'TT' (a single instant) 30/04/96 (Stein, -!! Jabouille) -!! new wguess to spread the divergence 15/05/96 (Stein) -!! set LTHINSHELL to TRUE + return to the old wguess 29/08/96 (Stein) -!! MY_NAME and DAD_NAME writing for nesting 30/07/96 (Lafore) -!! MY_NAME and DAD_NAME reading in pgd file 26/09/96 (Masson) -!! and reading of pgd grid in a new routine -!! XXHAT and XYHAT are set to 0. at origine point 02/10/96 (Masson) -!! add LTHINSHELL in namelist NAM_CONF_PRE 08/10/96 (Masson) -!! restores use of TS and T2 26/11/96 (Masson) -!! value XUNDEF for soil and vegetation fields on sea 27/11/96 (Masson) -!! use of HUG and HU2 in both ISBA and TSZ0 cases 04/12/96 (Masson) -!! add initialization of chemical variables 06/08/96 (K. Suhre) -!! add MANUAL option for the terrain elevation 12/12/96 (J.-P. Pinty) -!! set DATA instead of MANUAL for the terrain -!! elevation option -!! add new anelastic equations' systems 29/06/97 (Stein) -!! split mode_lfifm_pgd 29/07/97 (Masson) -!! add directional z0 and subgrid scale orography 31/07/97 (Masson) -!! separates surface treatment in PREP_IDEAL_SURF 15/03/99 (Masson) -!! new PGD fields allocations 15/03/99 (Masson) -!! iterative call to pressure solver 15/03/99 (Masson) -!! removes TSZ0 case 04/01/00 (Masson) -!! parallelization 18/06/00 (Pinty) -!! adaptation for patch approach 02/07/00 (Solmon/Masson) -!! bug in W LB field on Y direction 05/03/01 (Stein) -!! add module MODD_NSV for NSV variable 01/02/01 (D. Gazen) -!! allow namelists in different orders 15/10/01 (I. Mallet) -!! allow LUSERC and LUSERI in 1D configuration 05/06/02 (P. Jabouille) -!! add ZUVTHLMR case (move in set_rsou latter) 05/12/02 Jabouille/Masson -!! move LHORELAX_SV (after INI_NSV) 30/04/04 (Pinty) -!! Correction Parallel bug IBEG & IDEND evalution 13/11/08 J.Escobar -!! add the option LSHIFT for interpolation of 26/10/10 (G.Tanguy) -!! correction for XHAT & parallelizarion of ZSDATA 23/09/11 J.Escobar -!! the vertical profile (as in PREP_REAL_CASE) -!! add use MODI of SURFEX routines 10/10/111 J.Escobar -!! -!! For 2D modeling: -!! Initialization of ADVFRC profiles (SET_ADVFRC) 06/2010 (P.Peyrille) -!! when LDUMMY(2)=T in PRE_IDEA1.nam -!! USE MODDB_ADVFRC_n for grid-nesting 02*2012 (M. Tomasini) -!! LBOUSS in MODD_REF 07/2013 (C.Lac) -!! Correction for ZS in PGD file 04/2014 (G. TANGUY) -!! Bug : remove NC WRITE_HGRID 05/2014 (S. Bielli via J.Escobar ) -!! BUG if ZFRC and ZFRC_ADV or ZFRC_REL are used together 11/2014 (G. Delautier) -!! Bug : detected with cray compiler , -!! missing '&' in continuation string 3/12/2014 J.Escobar -!! J.Escobar : 15/09/2015 : WENO5 & JPHEXT <> 1 -!! 06/2016 (G.Delautier) phasage surfex 8 -!! P.Wautelet : 08/07/2016 : removed MNH_NCWRIT define -!! 01/2018 (G.Delautier) SURFEX 8.1 -! P. Wautelet: 05/2016-04/2018: new data structures and calls for I/O -! P. Wautelet 07/02/2019: force TYPE to a known value for IO_File_add2list -! P. Wautelet 14/02/2019: remove CLUOUT/CLUOUT0 and associated variables -! P. Wautelet 28/03/2019: use MNHTIME for time measurement variables -! P. Wautelet 28/03/2019: use TFILE instead of unit number for set_iluout_timing -! P. Wautelet 19/04/2019: removed unused dummy arguments and variables -! P. Wautelet 26/04/2019: replace non-standard FLOAT function by REAL function -! P. Wautelet 20/05/2019: add name argument to ADDnFIELD_ll + new ADD4DFIELD_ll subroutine -! F. Auguste 02/2021: add IBM -! P. Wautelet 09/03/2021: move some chemistry initializations to ini_nsv -! Jean-Luc Redelsperger 03/2021: ocean LES case -! P. Wautelet 06/07/2021: use FINALIZE_MNH -!------------------------------------------------------------------------------- -! -!* 0. DECLARATIONS -! ------------ -! -USE MODD_PARAMETERS ! Declarative modules -USE MODD_ARGSLIST_ll, ONLY : LIST_ll -USE MODD_DIM_n -USE MODD_CONF -USE MODD_CST -USE MODD_GRID -USE MODD_GRID_n -USE MODD_IBM_LSF, ONLY: CIBM_TYPE, LIBM_LSF, NIBM_SMOOTH, XIBM_SMOOTH -USE MODD_IBM_PARAM_n, ONLY: XIBM_LS -USE MODD_METRICS_n -USE MODD_PGDDIM -USE MODD_PGDGRID -USE MODD_TIME -USE MODD_TIME_n -USE MODD_PARAM_ICE, ONLY: PARAM_ICE_ASSOCIATE -USE MODD_REF -USE MODD_REF_n -USE MODD_LUNIT -USE MODD_FIELD_n -USE MODD_DYN_n -USE MODD_LBC_n -USE MODD_LSFIELD_n -USE MODD_PARAM_n -USE MODD_CH_MNHC_n, ONLY: LUSECHEM, LUSECHAQ, LUSECHIC, LCH_PH, LCH_INIT_FIELD -USE MODD_CH_AEROSOL,ONLY: LORILAM, CORGANIC, LVARSIGI, LVARSIGJ, LINITPM, XINIRADIUSI, & - XINIRADIUSJ, XINISIGI, XINISIGJ, XN0IMIN, XN0JMIN, CRGUNIT -USE MODD_DUST, ONLY: LDUST, NMODE_DST, CRGUNITD, XINISIG, XINIRADIUS, XN0MIN -USE MODD_SALT, ONLY: LSALT, NMODE_SLT, CRGUNITS, XINISIG_SLT, XINIRADIUS_SLT, XN0MIN_SLT -USE MODD_VAR_ll, ONLY: NPROC -USE MODD_LUNIT, ONLY: TLUOUT0, TOUTDATAFILE -USE MODD_LUNIT_n -USE MODD_IO, ONLY: TFILE_DUMMY, TFILE_OUTPUTLISTING -USE MODD_CONF_n -USE MODD_NSV, ONLY: NSV -use modd_precision, only: LFIINT, MNHREAL_MPI, MNHTIME -! -USE MODN_BLANK_n -! -USE MODE_FINALIZE_MNH, only: FINALIZE_MNH -USE MODE_THERMO -USE MODE_POS -USE MODE_GRIDCART ! Executive modules -USE MODE_GRIDPROJ -USE MODE_GATHER_ll -USE MODE_IO, only: IO_Config_set, IO_Init, IO_Pack_set -USE MODE_IO_FIELD_READ, only: IO_Field_read -USE MODE_IO_FIELD_WRITE, only: IO_Field_write, IO_Header_write -USE MODE_IO_FILE, only: IO_File_close, IO_File_open -USE MODE_IO_MANAGE_STRUCT, only: IO_File_add2list -USE MODE_ll -USE MODE_MODELN_HANDLER -use mode_field, only: Alloc_field_scalars, Ini_field_list, Ini_field_scalars -USE MODE_MSG -! -USE MODI_DEFAULT_DESFM_n ! Interface modules -USE MODI_DEFAULT_EXPRE -USE MODI_IBM_INIT_LS -USE MODI_READ_HGRID -USE MODI_SHUMAN -USE MODI_SET_RSOU -USE MODI_SET_CSTN -USE MODI_SET_FRC -USE MODI_PRESSURE_IN_PREP -USE MODI_WRITE_DESFM_n -USE MODI_WRITE_LFIFM_n -USE MODI_METRICS -USE MODI_UPDATE_METRICS -USE MODI_SET_REF -USE MODI_SET_PERTURB -USE MODI_TOTAL_DMASS -USE MODI_CH_INIT_FIELD_n -USE MODI_INI_NSV -USE MODI_READ_PRE_IDEA_NAM_n -USE MODI_ZSMT_PIC -USE MODI_ZSMT_PGD -USE MODI_READ_VER_GRID -USE MODI_READ_ALL_NAMELISTS -USE MODI_PGD_GRID_SURF_ATM -USE MODI_SPLIT_GRID -USE MODI_PGD_SURF_ATM -USE MODI_ICE_ADJUST_BIS -USE MODI_WRITE_PGD_SURF_ATM_n -USE MODI_PREP_SURF_MNH -USE MODI_INIT_SALT -USE MODI_AER2LIMA -USE MODD_PARAM_LIMA -! -!JUAN -USE MODE_SPLITTINGZ_ll -USE MODD_SUB_MODEL_n -USE MODE_MNH_TIMING -USE MODN_CONFZ -!JUAN -! -USE MODI_VERSION -USE MODI_INIT_PGD_SURF_ATM -USE MODI_WRITE_SURF_ATM_N -USE MODD_MNH_SURFEX_n -! Modif ADVFRC -USE MODD_2D_FRC -USE MODD_ADVFRC_n ! Modif for grid-nesting -USE MODI_SETADVFRC -USE MODD_RELFRC_n ! Modif for grid-nesting -USE MODI_SET_RELFRC -! -USE MODI_INI_CST -USE MODI_INI_NEB -USE MODD_NEB, ONLY: NEB -USE MODI_WRITE_HGRID -USE MODD_MPIF -USE MODD_VAR_ll -USE MODD_IO, ONLY: TFILEDATA,TFILE_SURFEX -! -USE MODE_MPPDB -! -USE MODD_GET_n -! -USE MODN_CONFIO, ONLY : NAM_CONFIO -! -IMPLICIT NONE -! -!* 0.1 Declarations of global variables not declared in the modules -! -REAL, DIMENSION(:,:,:), ALLOCATABLE :: XJ ! Jacobian -REAL :: XLATCEN=XUNDEF, XLONCEN=XUNDEF ! latitude and longitude of the center of - ! the domain for initialization. This - ! point is vertical vorticity point - ! ------------------------ -REAL :: XDELTAX=0.5E4, XDELTAY=0.5E4 ! horizontal mesh lengths - ! used to determine XXHAT,XYHAT -! -INTEGER :: NLUPRE,NLUOUT ! Logical unit numbers for EXPRE file - ! and for output_listing file -INTEGER :: NRESP ! return code in FM routines -INTEGER :: NTYPE ! type of file (cpio or not) -INTEGER(KIND=LFIINT) :: NNPRAR ! number of articles predicted in the LFIFM file -LOGICAL :: GFOUND ! Return code when searching namelist -! -INTEGER :: JLOOP,JILOOP,JJLOOP ! Loop indexes -! -INTEGER :: NIB,NJB,NKB ! Begining useful area in x,y,z directions -INTEGER :: NIE,NJE ! Ending useful area in x,y directions -INTEGER :: NIU,NJU,NKU ! Upper bounds in x,y,z directions -CHARACTER(LEN=4) :: CIDEAL ='CSTN' ! kind of idealized fields - ! 'CSTN' : Nv=cste case - ! 'RSOU' : radiosounding case -CHARACTER(LEN=4) :: CZS ='FLAT' ! orography selector - ! 'FLAT' : zero orography - ! 'SINE' : sine-shaped orography - ! 'BELL' : bell-shaped orography -REAL :: XHMAX=XUNDEF ! Maximum height for orography -REAL :: NEXPX=3,NEXPY=1 ! Exponents for orography in case of CZS='SINE' -REAL :: XAX= 1.E4, XAY=1.E4 ! Widths for orography in case CZS='BELL' - ! along x and y -INTEGER :: NIZS = 5, NJZS = 5 ! Localization of the center in - ! case CZS ='BELL' -! -!* 0.1.1 Declarations of local variables for N=cste and -! radiosounding cases : -! -INTEGER :: NYEAR,NMONTH,NDAY ! year, month and day in EXPRE file -REAL :: XTIME ! time in EXPRE file -LOGICAL :: LPERTURB =.FALSE. ! Logical to add a perturbation to - ! a basic state -LOGICAL :: LGEOSBAL =.FALSE. ! Logical to satisfy the geostrophic - ! balance - ! .TRUE. for geostrophic balance - ! .FALSE. to ignore this balance -LOGICAL :: LSHIFT =.FALSE. ! flag to perform vertical shift or not. -CHARACTER(LEN=3) :: CFUNU ='ZZZ' ! CHARACTER STRING for variation of - ! U in y direction - ! 'ZZZ' : U = U(Z) - ! 'Y*Z' : U = F(Y) * U(Z) - ! 'Y,Z' : U = G(Y,Z) -CHARACTER(LEN=3) :: CFUNV ='ZZZ' ! CHARACTER STRING for variation of - ! V in x direction - ! 'ZZZ' : V = V(Z) - ! 'Y*Z' : V = F(X) * V(Z) - ! 'Y,Z' : V = G(X,Z) -CHARACTER(LEN=6) :: CTYPELOC='IJGRID' ! Type of informations used to give the - ! localization of vertical profile - ! 'IJGRID' for (i,j) point on index space - ! 'XYHATM' for (x,y) coordinates on - ! conformal or cartesian plane - ! 'LATLON' for (latitude,longitude) on - ! spherical earth -REAL :: XLATLOC= 45., XLONLOC=0. - ! Latitude and longitude of the vertical - ! profile localization (used in case - ! CTYPELOC='LATLON') -REAL :: XXHATLOC=2.E4, XYHATLOC=2.E4 - ! (x,y) of the vertical profile - ! localization (used in cases - ! CTYPELOC='LATLON' and 'XYHATM') -INTEGER, DIMENSION(1) :: NILOC=4, NJLOC=4 - ! (i,j) of the vertical profile - ! localization -! -! -REAL,DIMENSION(:,:,:),ALLOCATABLE :: XCORIOZ ! Coriolis parameter (this - ! is exceptionnaly a 3D array - ! for computing needs) -! -! -!* 0.1.2 Declarations of local variables used when a PhysioGraphic Data -! file is used : -! -INTEGER :: JSV ! loop index on scalar var. -CHARACTER(LEN=28) :: CPGD_FILE=' ' ! Physio-Graphic Data file name -LOGICAL :: LREAD_ZS = .TRUE., & ! switch to use orography - ! coming from the PGD file - LREAD_GROUND_PARAM = .TRUE. ! switch to use soil parameters - ! useful for the soil scheme - ! coming from the PGD file - -INTEGER :: NSLEVE =12 ! number of iteration for smooth orography -REAL :: XSMOOTH_ZS = XUNDEF ! optional uniform smooth orography for SLEVE coordinate -CHARACTER(LEN=28) :: YPGD_NAME, YPGD_DAD_NAME ! general information -CHARACTER(LEN=2) :: YPGD_TYPE -! -INTEGER :: IINFO_ll ! return code of // routines -TYPE(LIST_ll), POINTER :: TZ_FIELDS_ll ! list of metric coefficient fields -! -INTEGER :: IISIZEXF,IJSIZEXF,IISIZEXFU,IJSIZEXFU ! dimensions of the -INTEGER :: IISIZEX4,IJSIZEX4,IISIZEX2,IJSIZEX2 ! West-east LB arrays -INTEGER :: IISIZEYF,IJSIZEYF,IISIZEYFV,IJSIZEYFV ! dimensions of the -INTEGER :: IISIZEY4,IJSIZEY4,IISIZEY2,IJSIZEY2 ! North-south LB arrays -INTEGER :: IBEG,IEND,IXOR,IXDIM,IYOR,IYDIM,ILBX,ILBY -REAL, DIMENSION(:), ALLOCATABLE :: ZXHAT_ll, ZYHAT_ll -! -REAL, DIMENSION(:,:,:), ALLOCATABLE ::ZTHL,ZT,ZRT,ZFRAC_ICE,& - ZEXN,ZLVOCPEXN,ZLSOCPEXN,ZCPH, & - ZRSATW, ZRSATI -REAL, DIMENSION(:,:,:,:), ALLOCATABLE :: ZBUF - ! variables for adjustement -REAL :: ZDIST -! -!JUAN TIMING -REAL(kind=MNHTIME), DIMENSION(2) :: ZTIME1, ZTIME2, ZEND, ZTOT -CHARACTER :: YMI -INTEGER :: IMI -!JUAN TIMING -! -REAL, DIMENSION(:), ALLOCATABLE :: ZZS_ll -INTEGER :: IJ -! -REAL :: ZZS_MAX, ZZS_MAX_ll -INTEGER :: IJPHEXT -! -TYPE(TFILEDATA),POINTER :: TZEXPREFILE => NULL() -! -! -!* 0.2 Namelist declarations -! -NAMELIST/NAM_CONF_PRE/ LTHINSHELL,LCARTESIAN, &! Declarations in MODD_CONF - LPACK, &! - NVERB,CIDEAL,CZS, &!+global variables initialized - LBOUSS,LOCEAN,LPERTURB, &! at their declarations - LFORCING,CEQNSYS, &! at their declarations - LSHIFT,L2D_ADV_FRC,L2D_REL_FRC, & - NHALO , JPHEXT -NAMELIST/NAM_GRID_PRE/ XLON0,XLAT0, & ! Declarations in MODD_GRID - XBETA,XRPK, & - XLONORI,XLATORI -NAMELIST/NAM_GRIDH_PRE/ XLATCEN,XLONCEN, & ! local variables initialized - XDELTAX,XDELTAY, & ! at their declarations - XHMAX,NEXPX,NEXPY, & - XAX,XAY,NIZS,NJZS -NAMELIST/NAM_VPROF_PRE/LGEOSBAL, CFUNU,CFUNV, &! global variables initialized - CTYPELOC,XLATLOC,XLONLOC, &! at their declarations - XXHATLOC,XYHATLOC,NILOC,NJLOC -NAMELIST/NAM_REAL_PGD/CPGD_FILE, & ! Physio-Graphic Data file - ! name - LREAD_ZS, & ! switch to use orography - ! coming from the PGD file - LREAD_GROUND_PARAM -NAMELIST/NAM_SLEVE/NSLEVE, XSMOOTH_ZS -! -!* 0.3 Auxillary Namelist declarations -! -NAMELIST/NAM_AERO_PRE/ LORILAM, LINITPM, XINIRADIUSI, XINIRADIUSJ, & - XINISIGI, XINISIGJ, XN0IMIN, XN0JMIN, CRGUNIT, & - LDUST, LSALT, CRGUNITD, CRGUNITS,& - NMODE_DST, XINISIG, XINIRADIUS, XN0MIN,& - XINISIG_SLT, XINIRADIUS_SLT, XN0MIN_SLT, & - NMODE_SLT -! -NAMELIST/NAM_IBM_LSF/ LIBM_LSF, CIBM_TYPE, NIBM_SMOOTH, XIBM_SMOOTH -! -!------------------------------------------------------------------------------- -! -!* 0. PROLOGUE -! -------- -CALL MPPDB_INIT() -! -CALL GOTO_MODEL(1) -! -CALL IO_Init() -NULLIFY(TZ_FIELDS_ll) -CALL VERSION -CPROGRAM='IDEAL ' -! -!JUAN TIMING - XT_START = 0.0_MNHTIME - XT_STORE = 0.0_MNHTIME -! - CALL SECOND_MNH2(ZEND) -! -!JUAN TIMING -! -!* 1. INITIALIZE PHYSICAL CONSTANTS : -! ------------------------------ -! -NVERB = 5 -CALL INI_CST -CALL INI_NEB -! -!------------------------------------------------------------------------------- -! -! -!* 2. SET DEFAULT VALUES : -! -------------------- -! -! -!* 2.1 For variables in DESFM file -! -CALL ALLOC_FIELD_SCALARS() -CALL PARAM_ICE_ASSOCIATE() -CALL DEFAULT_DESFM_n(1) -! -CSURF = "NONE" -! -! -!* 2.2 For other global variables in EXPRE file -! -CALL DEFAULT_EXPRE -!------------------------------------------------------------------------------- -! -!* 3. READ THE EXPRE FILE : -! -------------------- -! -!* 3.1 initialize logical unit numbers (EXPRE and output-listing files) -! and open these files : -! -! -CALL IO_File_add2list(TLUOUT0,'OUTPUT_LISTING1','OUTPUTLISTING','WRITE') -CALL IO_File_open(TLUOUT0) -NLUOUT = TLUOUT0%NLU -!Set output files for PRINT_MSG -TLUOUT => TLUOUT0 -TFILE_OUTPUTLISTING => TLUOUT0 -! -CALL IO_File_add2list(TZEXPREFILE,'PRE_IDEA1.nam','NML','READ') -CALL IO_File_open(TZEXPREFILE) -NLUPRE=TZEXPREFILE%NLU -! -!* 3.2 read in NLUPRE the namelist informations -! -WRITE(NLUOUT,FMT=*) 'attempt to read ',TRIM(TZEXPREFILE%CNAME),' file' -CALL POSNAM(NLUPRE,'NAM_REAL_PGD',GFOUND,NLUOUT) -IF (GFOUND) READ(UNIT=NLUPRE,NML=NAM_REAL_PGD) -! -! -CALL POSNAM(NLUPRE,'NAM_CONF_PRE',GFOUND,NLUOUT) -IF (GFOUND) READ(UNIT=NLUPRE,NML=NAM_CONF_PRE) -!JUANZ -CALL POSNAM(NLUPRE,'NAM_CONFZ',GFOUND,NLUOUT) -IF (GFOUND) READ(UNIT=NLUPRE,NML=NAM_CONFZ) -!JUANZ -CALL POSNAM(NLUPRE,'NAM_CONFIO',GFOUND,NLUOUT) -IF (GFOUND) READ(UNIT=NLUPRE,NML=NAM_CONFIO) -CALL IO_Config_set() -CALL POSNAM(NLUPRE,'NAM_GRID_PRE',GFOUND,NLUOUT) -IF (GFOUND) READ(UNIT=NLUPRE,NML=NAM_GRID_PRE) -CALL POSNAM(NLUPRE,'NAM_GRIDH_PRE',GFOUND,NLUOUT) -IF (GFOUND) READ(UNIT=NLUPRE,NML=NAM_GRIDH_PRE) -CALL POSNAM(NLUPRE,'NAM_VPROF_PRE',GFOUND,NLUOUT) -IF (GFOUND) READ(UNIT=NLUPRE,NML=NAM_VPROF_PRE) -CALL POSNAM(NLUPRE,'NAM_BLANKN',GFOUND,NLUOUT) -CALL INIT_NAM_BLANKn -IF (GFOUND) THEN - READ(UNIT=NLUPRE,NML=NAM_BLANKn) - CALL UPDATE_NAM_BLANKn -END IF -CALL READ_PRE_IDEA_NAM_n(NLUPRE,NLUOUT) -CALL POSNAM(NLUPRE,'NAM_AERO_PRE',GFOUND,NLUOUT) -IF (GFOUND) READ(UNIT=NLUPRE,NML=NAM_AERO_PRE) -CALL POSNAM(NLUPRE,'NAM_IBM_LSF' ,GFOUND,NLUOUT) -IF (GFOUND) READ(UNIT=NLUPRE,NML=NAM_IBM_LSF ) -! -CALL INI_FIELD_LIST(1) -! -CALL INI_FIELD_SCALARS() -! Sea salt -CALL INIT_SALT -! -IF( LEN_TRIM(CPGD_FILE) /= 0 ) THEN - ! open the PGD_FILE - CALL IO_File_add2list(TPGDFILE,TRIM(CPGD_FILE),'PGD','READ',KLFINPRAR=NNPRAR,KLFITYPE=2,KLFIVERB=NVERB) - CALL IO_File_open(TPGDFILE) - - ! read the grid in the PGD file - CALL IO_Field_read(TPGDFILE,'IMAX', NIMAX) - CALL IO_Field_read(TPGDFILE,'JMAX', NJMAX) - CALL IO_Field_read(TPGDFILE,'JPHEXT',IJPHEXT) - - IF ( CPGD_FILE /= CINIFILEPGD) THEN - WRITE(NLUOUT,FMT=*) ' WARNING : in PRE_IDEA1.nam, in NAM_LUNITn you& - & have CINIFILEPGD= ',CINIFILEPGD - WRITE(NLUOUT,FMT=*) ' whereas in NAM_REAL_PGD you have CPGD_FILE = '& - ,CPGD_FILE - WRITE(NLUOUT,FMT=*) ' ' - WRITE(NLUOUT,FMT=*) ' CINIFILEPGD HAS BEEN SET TO ',CPGD_FILE - CINIFILEPGD=CPGD_FILE - END IF - IF ( IJPHEXT .NE. JPHEXT ) THEN - WRITE(NLUOUT,FMT=*) ' PREP_IDEAL_CASE : JPHEXT in PRE_IDEA1.nam/NAM_CONF_PRE ( or default value )& - & JPHEXT=',JPHEXT - WRITE(NLUOUT,FMT=*) ' different from PGD files=', CINIFILEPGD,' value JPHEXT=',IJPHEXT - WRITE(NLUOUT,FMT=*) '-> JOB ABORTED' - CALL PRINT_MSG(NVERB_FATAL,'GEN','PREP_IDEAL_CASE','') - !WRITE(NLUOUT,FMT=*) ' JPHEXT HAS BEEN SET TO ', IJPHEXT - !IJPHEXT = JPHEXT - END IF -END IF -! -NIMAX_ll=NIMAX !! _ll variables are global variables -NJMAX_ll=NJMAX !! but the old names are kept in PRE_IDEA1.nam file -! -!* 3.3 check some parameters: -! -L1D=.FALSE. ; L2D=.FALSE. -! -IF ((NIMAX == 1).OR.(NJMAX == 1)) THEN - L2D=.TRUE. - NJMAX_ll=1 - NIMAX_ll=MAX(NIMAX,NJMAX) - WRITE(NLUOUT,FMT=*) ' NJMAX HAS BEEN SET TO 1 SINCE 2D INITIAL FILE IS REQUIRED & - & (L2D=TRUE) )' -END IF -! -IF ((NIMAX == 1).AND.(NJMAX == 1)) THEN - L1D=.TRUE. - NIMAX_ll = 1 - NJMAX_ll = 1 - WRITE(NLUOUT,FMT=*) ' 1D INITIAL FILE IS REQUIRED (L1D=TRUE) ' -END IF -! -IF(.NOT. L1D) THEN - LHORELAX_UVWTH=.TRUE. - LHORELAX_RV=.TRUE. -ENDIF -! -NRIMX= MIN(JPRIMMAX,NIMAX_ll/2) -! -IF (L2D) THEN - NRIMY=0 -ELSE - NRIMY= MIN(JPRIMMAX,NJMAX_ll/2) -END IF -! -IF (L1D) THEN - NRIMX=0 - NRIMY=0 -END IF -! -IF (L1D .AND. ( LPERTURB .OR. LGEOSBAL .OR. & - (.NOT. LCARTESIAN ) .OR. (.NOT. LTHINSHELL) ))THEN - LGEOSBAL = .FALSE. - LPERTURB = .FALSE. - LCARTESIAN = .TRUE. - LTHINSHELL = .TRUE. - WRITE(NLUOUT,FMT=*) ' LGEOSBAL AND LPERTURB HAVE BEEN SET TO FALSE & - & AND LCARTESIAN AND LTHINSHELL TO TRUE & - & SINCE 1D INITIAL FILE IS REQUIRED (L1D=TRUE)' -END IF -! -IF (LGEOSBAL .AND. LSHIFT ) THEN - LSHIFT=.FALSE. - WRITE(NLUOUT,FMT=*) ' LSHIFT HAS BEEN SET TO FALSE SINCE & - & LGEOSBAL=.TRUE. IS REQUIRED ' -END IF -! -!* 3.4 compute the number of moist variables : -! -IF (.NOT.LUSERV) THEN - LUSERV = .TRUE. - WRITE(NLUOUT,FMT=*) ' LUSERV HAS BEEN RESET TO TRUE, SINCE A MOIST VARIABLE & - & IS PRESENT IN EXPRE FILE (CIDEAL = RSOU OR CSTN)' -END IF -! -IF((LUSERI .OR. LUSERC).AND. (CIDEAL /= 'RSOU')) THEN - !callabortstop - CALL PRINT_MSG(NVERB_FATAL,'GEN','PREP_IDEAL_CASE','use of hydrometeors is only allowed in RSOU case') -ENDIF -IF (LUSERI) THEN - LUSERC =.TRUE. - LUSERR =.TRUE. - LUSERI =.TRUE. - LUSERS =.TRUE. - LUSERG =.TRUE. - LUSERH =.FALSE. - CCLOUD='ICE3' -ELSEIF(LUSERC) THEN - LUSERR =.FALSE. - LUSERI =.FALSE. - LUSERS =.FALSE. - LUSERG =.FALSE. - LUSERH =.FALSE. - CCLOUD='REVE' -ELSE - LUSERC =.FALSE. - LUSERR =.FALSE. - LUSERI =.FALSE. - LUSERS =.FALSE. - LUSERG =.FALSE. - LUSERH =.FALSE. - LHORELAX_RC=.FALSE. - LHORELAX_RR=.FALSE. - LHORELAX_RI=.FALSE. - LHORELAX_RS=.FALSE. - LHORELAX_RG=.FALSE. - LHORELAX_RH=.FALSE. - CCLOUD='NONE' -! -END IF -! -NRR=0 -IF (LUSERV) THEN - NRR=NRR+1 - IDX_RVT = NRR -END IF -IF (LUSERC) THEN - NRR=NRR+1 - IDX_RCT = NRR -END IF -IF (LUSERR) THEN - NRR=NRR+1 - IDX_RRT = NRR -END IF -IF (LUSERI) THEN - NRR=NRR+1 - IDX_RIT = NRR -END IF -IF (LUSERS) THEN - NRR=NRR+1 - IDX_RST = NRR -END IF -IF (LUSERG) THEN - NRR=NRR+1 - IDX_RGT = NRR -END IF -IF (LUSERH) THEN - NRR=NRR+1 - IDX_RHT = NRR -END IF -! -! NRR=4 for RSOU case because RI and Rc always computed -IF (CIDEAL == 'RSOU' .AND. NRR < 4 ) NRR=4 -! -! -!* 3.5 Chemistry -! -IF (LORILAM .OR. LCH_INIT_FIELD) THEN - LUSECHEM = .TRUE. - IF (LORILAM) THEN - CORGANIC = "MPMPO" - LVARSIGI = .TRUE. - LVARSIGJ = .TRUE. - END IF -END IF -! initialise NSV_* variables -CALL INI_NSV(1) -LHORELAX_SV(:)=.FALSE. -IF(.NOT. L1D) LHORELAX_SV(1:NSV)=.TRUE. -! -!------------------------------------------------------------------------------- -! -!* 4. ALLOCATE MEMORY FOR ARRAYS : -! ---------------------------- -! -!* 4.1 Vertical Spatial grid -! -CALL READ_VER_GRID(TZEXPREFILE) -! -!* 4.2 Initialize parallel variables and compute array's dimensions -! -! -IF(LGEOSBAL) THEN - CALL SET_SPLITTING_ll('XSPLITTING') ! required for integration of thermal wind balance -ELSE - CALL SET_SPLITTING_ll('BSPLITTING') -ENDIF -CALL SET_JP_ll(1,JPHEXT,JPVEXT,JPHEXT) -CALL SET_DAD0_ll() -CALL SET_DIM_ll(NIMAX_ll, NJMAX_ll, NKMAX) -CALL IO_Pack_set(L1D,L2D,LPACK) -CALL SET_LBX_ll(CLBCX(1), 1) -CALL SET_LBY_ll(CLBCY(1), 1) -CALL SET_XRATIO_ll(1, 1) -CALL SET_YRATIO_ll(1, 1) -CALL SET_XOR_ll(1, 1) -CALL SET_XEND_ll(NIMAX_ll+2*JPHEXT, 1) -CALL SET_YOR_ll(1, 1) -CALL SET_YEND_ll(NJMAX_ll+2*JPHEXT, 1) -CALL SET_DAD_ll(0, 1) -CALL INI_PARAZ_ll(IINFO_ll) -! -! sizes of arrays of the extended sub-domain -! -CALL GET_DIM_EXT_ll('B',NIU,NJU) -CALL GET_DIM_PHYS_ll('B',NIMAX,NJMAX) -CALL GET_INDICE_ll(NIB,NJB,NIE,NJE) -CALL GET_OR_ll('B',IXOR,IYOR) -NKB=1+JPVEXT -NKU=NKMAX+2*JPVEXT -! -!* 4.3 Global variables absent from the modules : -! -ALLOCATE(XJ(NIU,NJU,NKU)) -SELECT CASE(CIDEAL) - CASE('RSOU','CSTN') - IF (LGEOSBAL) ALLOCATE(XCORIOZ(NIU,NJU,NKU)) ! exceptionally a 3D array - CASE DEFAULT ! undefined preinitialization - !callabortstop - CALL PRINT_MSG(NVERB_FATAL,'GEN','PREP_IDEAL_CASE','CIDEAL is not correctly defined') -END SELECT -! -!* 4.4 Prognostic variables at M instant (module MODD_FIELD1): -! -ALLOCATE(XUT(NIU,NJU,NKU)) -ALLOCATE(XVT(NIU,NJU,NKU)) -ALLOCATE(XWT(NIU,NJU,NKU)) -ALLOCATE(XTHT(NIU,NJU,NKU)) -ALLOCATE(XPABST(NIU,NJU,NKU)) -ALLOCATE(XRT(NIU,NJU,NKU,NRR)) -ALLOCATE(XSVT(NIU,NJU,NKU,NSV)) -! -!* 4.5 Grid variables (module MODD_GRID1 and MODD_METRICS1): -! -ALLOCATE(XMAP(NIU,NJU)) -ALLOCATE(XLAT(NIU,NJU)) -ALLOCATE(XLON(NIU,NJU)) -ALLOCATE(XDXHAT(NIU),XDYHAT(NJU)) -IF (LEN_TRIM(CPGD_FILE)==0) ALLOCATE(XZS(NIU,NJU)) -IF (LEN_TRIM(CPGD_FILE)==0) ALLOCATE(ZZS_ll(NIMAX_ll)) -IF (LEN_TRIM(CPGD_FILE)==0) ALLOCATE(XZSMT(NIU,NJU)) -ALLOCATE(XZZ(NIU,NJU,NKU)) -! -ALLOCATE(XDXX(NIU,NJU,NKU)) -ALLOCATE(XDYY(NIU,NJU,NKU)) -ALLOCATE(XDZX(NIU,NJU,NKU)) -ALLOCATE(XDZY(NIU,NJU,NKU)) -ALLOCATE(XDZZ(NIU,NJU,NKU)) -! -!* 4.6 Reference state variables (modules MODD_REF and MODD_REF1): -! -ALLOCATE(XRHODREFZ(NKU),XTHVREFZ(NKU)) -XTHVREFZ(:)=0.0 -IF (LCOUPLES) THEN - ! Arrays for reference state different in ocean and atmosphere - ALLOCATE(XRHODREFZO(NKU),XTHVREFZO(NKU)) - XTHVREFZO(:)=0.0 -END IF -IF(CEQNSYS == 'DUR') THEN - ALLOCATE(XRVREF(NIU,NJU,NKU)) -ELSE - ALLOCATE(XRVREF(0,0,0)) -END IF -ALLOCATE(XRHODREF(NIU,NJU,NKU),XTHVREF(NIU,NJU,NKU),XEXNREF(NIU,NJU,NKU)) -ALLOCATE(XRHODJ(NIU,NJU,NKU)) -! -!* 4.7 Larger Scale fields (modules MODD_LSFIELD1): -! -ALLOCATE(XLSUM(NIU,NJU,NKU)) -ALLOCATE(XLSVM(NIU,NJU,NKU)) -ALLOCATE(XLSWM(NIU,NJU,NKU)) -ALLOCATE(XLSTHM(NIU,NJU,NKU)) -IF ( NRR >= 1) THEN - ALLOCATE(XLSRVM(NIU,NJU,NKU)) -ELSE - ALLOCATE(XLSRVM(0,0,0)) -ENDIF -! -! allocate lateral boundary field used for coupling -! -IF ( L1D) THEN ! 1D case -! - NSIZELBX_ll=0 - NSIZELBXU_ll=0 - NSIZELBY_ll=0 - NSIZELBYV_ll=0 - NSIZELBXTKE_ll=0 - NSIZELBXR_ll=0 - NSIZELBXSV_ll=0 - NSIZELBYTKE_ll=0 - NSIZELBYR_ll=0 - NSIZELBYSV_ll=0 - ALLOCATE(XLBXUM(0,0,0)) - ALLOCATE(XLBYUM(0,0,0)) - ALLOCATE(XLBXVM(0,0,0)) - ALLOCATE(XLBYVM(0,0,0)) - ALLOCATE(XLBXWM(0,0,0)) - ALLOCATE(XLBYWM(0,0,0)) - ALLOCATE(XLBXTHM(0,0,0)) - ALLOCATE(XLBYTHM(0,0,0)) - ALLOCATE(XLBXTKEM(0,0,0)) - ALLOCATE(XLBYTKEM(0,0,0)) - ALLOCATE(XLBXRM(0,0,0,0)) - ALLOCATE(XLBYRM(0,0,0,0)) - ALLOCATE(XLBXSVM(0,0,0,0)) - ALLOCATE(XLBYSVM(0,0,0,0)) -! -ELSEIF( L2D ) THEN ! 2D case (not yet parallelized) -! - CALL GET_SIZEX_LB(NIMAX_ll,NJMAX_ll,NRIMX, & - IISIZEXF,IJSIZEXF,IISIZEXFU,IJSIZEXFU, & - IISIZEX4,IJSIZEX4,IISIZEX2,IJSIZEX2) - NSIZELBY_ll=0 - NSIZELBYV_ll=0 - NSIZELBYTKE_ll=0 - NSIZELBYR_ll=0 - NSIZELBYSV_ll=0 - ALLOCATE(XLBYUM(0,0,0)) - ALLOCATE(XLBYVM(0,0,0)) - ALLOCATE(XLBYWM(0,0,0)) - ALLOCATE(XLBYTHM(0,0,0)) - ALLOCATE(XLBYTKEM(0,0,0)) - ALLOCATE(XLBYRM(0,0,0,0)) - ALLOCATE(XLBYSVM(0,0,0,0)) - ! - IF ( LHORELAX_UVWTH ) THEN -!JUAN A REVOIR TODO_JPHEXT -! <<<<<<< prep_ideal_case.f90 - ! NSIZELBX_ll=2*NRIMX+2 - ! NSIZELBXU_ll=2*NRIMX+2 - ALLOCATE(XLBXUM(IISIZEXFU,NJU,NKU)) - ALLOCATE(XLBXVM(IISIZEXF,NJU,NKU)) - ALLOCATE(XLBXWM(IISIZEXF,NJU,NKU)) - ALLOCATE(XLBXTHM(IISIZEXF,NJU,NKU)) -! ======= - NSIZELBX_ll=2*NRIMX+2*JPHEXT - NSIZELBXU_ll=2*NRIMX+2*JPHEXT - ! ALLOCATE(XLBXUM(2*NRIMX+2*JPHEXT,NJU,NKU)) - ! ALLOCATE(XLBXVM(2*NRIMX+2*JPHEXT,NJU,NKU)) - ! ALLOCATE(XLBXWM(2*NRIMX+2*JPHEXT,NJU,NKU)) - ! ALLOCATE(XLBXTHM(2*NRIMX+2*JPHEXT,NJU,NKU)) -! >>>>>>> 1.3.2.4.2.3.2.14.2.8.2.11.2.2 - ELSE - NSIZELBX_ll= 2*JPHEXT ! 2 - NSIZELBXU_ll=2*(JPHEXT+1) ! 4 - ALLOCATE(XLBXUM(NSIZELBXU_ll,NJU,NKU)) - ALLOCATE(XLBXVM(NSIZELBX_ll,NJU,NKU)) - ALLOCATE(XLBXWM(NSIZELBX_ll,NJU,NKU)) - ALLOCATE(XLBXTHM(NSIZELBX_ll,NJU,NKU)) - END IF - ! - IF ( NRR > 0 ) THEN - IF ( LHORELAX_RV .OR. LHORELAX_RC .OR. LHORELAX_RR .OR. LHORELAX_RI & - .OR. LHORELAX_RS .OR. LHORELAX_RG .OR. LHORELAX_RH & - ) THEN -!JUAN A REVOIR TODO_JPHEXT -! <<<<<<< prep_ideal_case.f90 - ! NSIZELBXR_ll=2* NRIMX+2 - ALLOCATE(XLBXRM(IISIZEXF,NJU,NKU,NRR)) -! ======= - NSIZELBXR_ll=2*NRIMX+2*JPHEXT - ! ALLOCATE(XLBXRM(2*NRIMX+2*JPHEXT,NJU,NKU,NRR)) -! >>>>>>> 1.3.2.4.2.3.2.14.2.8.2.11.2.2 - ELSE - NSIZELBXR_ll=2*JPHEXT ! 2 - ALLOCATE(XLBXRM(NSIZELBXR_ll,NJU,NKU,NRR)) - ENDIF - ELSE - NSIZELBXR_ll=0 - ALLOCATE(XLBXRM(0,0,0,0)) - END IF - ! - IF ( NSV > 0 ) THEN - IF ( ANY( LHORELAX_SV(:)) ) THEN -!JUAN A REVOIR TODO_JPHEXT -! <<<<<<< prep_ideal_case.f90 - ! NSIZELBXSV_ll=2* NRIMX+2 - ALLOCATE(XLBXSVM(IISIZEXF,NJU,NKU,NSV)) -! ======= - NSIZELBXSV_ll=2*NRIMX+2*JPHEXT - ! ALLOCATE(XLBXSVM(2*NRIMX+2*JPHEXT,NJU,NKU,NSV)) -! >>>>>>> 1.3.2.4.2.3.2.14.2.8.2.11.2.2 - ELSE - NSIZELBXSV_ll=2*JPHEXT ! 2 - ALLOCATE(XLBXSVM(NSIZELBXSV_ll,NJU,NKU,NSV)) - END IF - ELSE - NSIZELBXSV_ll=0 - ALLOCATE(XLBXSVM(0,0,0,0)) - END IF -! -ELSE ! 3D case -! - CALL GET_SIZEX_LB(NIMAX_ll,NJMAX_ll,NRIMX, & - IISIZEXF,IJSIZEXF,IISIZEXFU,IJSIZEXFU, & - IISIZEX4,IJSIZEX4,IISIZEX2,IJSIZEX2) - CALL GET_SIZEY_LB(NIMAX_ll,NJMAX_ll,NRIMY, & - IISIZEYF,IJSIZEYF,IISIZEYFV,IJSIZEYFV, & - IISIZEY4,IJSIZEY4,IISIZEY2,IJSIZEY2) -! - IF ( LHORELAX_UVWTH ) THEN - NSIZELBX_ll=2*NRIMX+2*JPHEXT - NSIZELBXU_ll=2*NRIMX+2*JPHEXT - NSIZELBY_ll=2*NRIMY+2*JPHEXT - NSIZELBYV_ll=2*NRIMY+2*JPHEXT - ALLOCATE(XLBXUM(IISIZEXFU,IJSIZEXFU,NKU)) - ALLOCATE(XLBYUM(IISIZEYF,IJSIZEYF,NKU)) - ALLOCATE(XLBXVM(IISIZEXF,IJSIZEXF,NKU)) - ALLOCATE(XLBYVM(IISIZEYFV,IJSIZEYFV,NKU)) - ALLOCATE(XLBXWM(IISIZEXF,IJSIZEXF,NKU)) - ALLOCATE(XLBYWM(IISIZEYF,IJSIZEYF,NKU)) - ALLOCATE(XLBXTHM(IISIZEXF,IJSIZEXF,NKU)) - ALLOCATE(XLBYTHM(IISIZEYF,IJSIZEYF,NKU)) - ELSE - NSIZELBX_ll=2*JPHEXT ! 2 - NSIZELBXU_ll=2*(JPHEXT+1) ! 4 - NSIZELBY_ll=2*JPHEXT ! 2 - NSIZELBYV_ll=2*(JPHEXT+1) ! 4 - ALLOCATE(XLBXUM(IISIZEX4,IJSIZEX4,NKU)) - ALLOCATE(XLBYUM(IISIZEY2,IJSIZEY2,NKU)) - ALLOCATE(XLBXVM(IISIZEX2,IJSIZEX2,NKU)) - ALLOCATE(XLBYVM(IISIZEY4,IJSIZEY4,NKU)) - ALLOCATE(XLBXWM(IISIZEX2,IJSIZEX2,NKU)) - ALLOCATE(XLBYWM(IISIZEY2,IJSIZEY2,NKU)) - ALLOCATE(XLBXTHM(IISIZEX2,IJSIZEX2,NKU)) - ALLOCATE(XLBYTHM(IISIZEY2,IJSIZEY2,NKU)) - END IF - ! - IF ( NRR > 0 ) THEN - IF ( LHORELAX_RV .OR. LHORELAX_RC .OR. LHORELAX_RR .OR. LHORELAX_RI & - .OR. LHORELAX_RS .OR. LHORELAX_RG .OR. LHORELAX_RH & - ) THEN - NSIZELBXR_ll=2*NRIMX+2*JPHEXT - NSIZELBYR_ll=2*NRIMY+2*JPHEXT - ALLOCATE(XLBXRM(IISIZEXF,IJSIZEXF,NKU,NRR)) - ALLOCATE(XLBYRM(IISIZEYF,IJSIZEYF,NKU,NRR)) - ELSE - NSIZELBXR_ll=2*JPHEXT ! 2 - NSIZELBYR_ll=2*JPHEXT ! 2 - ALLOCATE(XLBXRM(IISIZEX2,IJSIZEX2,NKU,NRR)) - ALLOCATE(XLBYRM(IISIZEY2,IJSIZEY2,NKU,NRR)) - ENDIF - ELSE - NSIZELBXR_ll=0 - NSIZELBYR_ll=0 - ALLOCATE(XLBXRM(0,0,0,0)) - ALLOCATE(XLBYRM(0,0,0,0)) - END IF - ! - IF ( NSV > 0 ) THEN - IF ( ANY( LHORELAX_SV(:)) ) THEN - NSIZELBXSV_ll=2*NRIMX+2*JPHEXT - NSIZELBYSV_ll=2*NRIMY+2*JPHEXT - ALLOCATE(XLBXSVM(IISIZEXF,IJSIZEXF,NKU,NSV)) - ALLOCATE(XLBYSVM(IISIZEYF,IJSIZEYF,NKU,NSV)) - ELSE - NSIZELBXSV_ll=2*JPHEXT ! 2 - NSIZELBYSV_ll=2*JPHEXT ! 2 - ALLOCATE(XLBXSVM(IISIZEX2,IJSIZEX2,NKU,NSV)) - ALLOCATE(XLBYSVM(IISIZEY2,IJSIZEY2,NKU,NSV)) - END IF - ELSE - NSIZELBXSV_ll=0 - NSIZELBYSV_ll=0 - ALLOCATE(XLBXSVM(0,0,0,0)) - ALLOCATE(XLBYSVM(0,0,0,0)) - END IF -END IF -! -! -!------------------------------------------------------------------------------- -! -!* 5. INITIALIZE ALL THE MODEL VARIABLES -! ---------------------------------- -! -! -!* 5.1 Grid variables and RS localization: -! -!* 5.1.1 Horizontal Spatial grid : -! -IF( LEN_TRIM(CPGD_FILE) /= 0 ) THEN -!-------------------------------------------------------- -! the MESONH horizontal grid will be read in the PGD_FILE -!-------------------------------------------------------- - CALL READ_HGRID(1,TPGDFILE,YPGD_NAME,YPGD_DAD_NAME,YPGD_TYPE) -! control the cartesian option - IF( LCARTESIAN ) THEN - WRITE(NLUOUT,FMT=*) 'PREP_IDEAL_CASE : IN GENERAL, THE USE OF A PGD_FILE & - & IMPLIES THAT YOU MUST TAKE INTO ACCOUNT THE EARTH SPHERICITY' - WRITE(NLUOUT,FMT=*) 'NEVERTHELESS, LCARTESIAN HAS BEEN KEPT TO TRUE' - END IF -! -!* use of the externalized surface -! - CSURF = "EXTE" -! -! determine whether the model is flat or no -! - ZZS_MAX = ABS( MAXVAL(XZS(NIB:NIU-JPHEXT,NJB:NJU-JPHEXT))) - CALL MPI_ALLREDUCE(ZZS_MAX, ZZS_MAX_ll, 1, MNHREAL_MPI, MPI_MAX, & - NMNH_COMM_WORLD,IINFO_ll) - IF( ABS(ZZS_MAX_ll) < 1.E-10 ) THEN - LFLAT=.TRUE. - ELSE - LFLAT=.FALSE. - END IF -! - -ELSE -!------------------------------------------------------------------------ -! the MESONH horizontal grid is built from the PRE_IDEA1.nam informations -!------------------------------------------------------------------------ -! - ALLOCATE(XXHAT(NIU),XYHAT(NJU)) -! -! define the grid localization at the earth surface by the central point -! coordinates -! - IF (XLONCEN/=XUNDEF .OR. XLATCEN/=XUNDEF) THEN - IF (XLONCEN/=XUNDEF .AND. XLATCEN/=XUNDEF) THEN -! -! it should be noted that XLATCEN and XLONCEN refer to a vertical -! vorticity point and (XLATORI, XLONORI) refer to the mass point of -! conformal coordinates (0,0). This is to allow the centering of the model in -! a non-cyclic configuration regarding to XLATCEN or XLONCEN. -! - ALLOCATE(ZXHAT_ll(NIMAX_ll+2*JPHEXT),ZYHAT_ll(NJMAX_ll+2*JPHEXT)) - ZXHAT_ll=0. - ZYHAT_ll=0. - CALL SM_LATLON(XLATCEN,XLONCEN, & - -XDELTAX*(NIMAX_ll/2-0.5+JPHEXT), & - -XDELTAY*(NJMAX_ll/2-0.5+JPHEXT), & - XLATORI,XLONORI) - DEALLOCATE(ZXHAT_ll,ZYHAT_ll) -! - WRITE(NLUOUT,FMT=*) 'PREP_IDEAL_CASE : XLATORI=' , XLATORI, & - ' XLONORI= ', XLONORI - ELSE - !callabortstop - CALL PRINT_MSG(NVERB_FATAL,'GEN','PREP_IDEAL_CASE',& - 'latitude and longitude of the center point must be initialized alltogether or not') - END IF - END IF -! - IF (NPROC > 1) THEN - CALL GET_DIM_EXT_ll('B',IXDIM,IYDIM) - IBEG = IXOR-JPHEXT-1 - IEND = IBEG+IXDIM-1 - XXHAT(:) = (/ (REAL(JLOOP)*XDELTAX, JLOOP=IBEG,IEND) /) - IBEG = IYOR-JPHEXT-1 - IEND = IBEG+IYDIM-1 - XYHAT(:) = (/ (REAL(JLOOP)*XDELTAY, JLOOP=IBEG,IEND) /) -! - ELSE - XXHAT(:) = (/ (REAL(JLOOP-NIB)*XDELTAX, JLOOP=1,NIU) /) - XYHAT(:) = (/ (REAL(JLOOP-NJB)*XDELTAY, JLOOP=1,NJU) /) - END IF -END IF -! -!* 5.1.2 Orography and Gal-Chen Sommerville transformation : -! -IF ( LEN_TRIM(CPGD_FILE) == 0 .OR. .NOT. LREAD_ZS) THEN - SELECT CASE(CZS) ! 'FLAT' or 'SINE' or 'BELL' - CASE('FLAT') - LFLAT = .TRUE. - IF (XHMAX==XUNDEF) THEN - XZS(:,:) = 0. - ELSE - XZS(:,:) = XHMAX - END IF - CASE('SINE') ! sinus-shaped orography - IF (XHMAX==XUNDEF) XHMAX=300. - LFLAT =.FALSE. - XZS(:,:) = XHMAX & ! three-dimensional case - *SPREAD((/((SIN((XPI/(NIMAX_ll+2*JPHEXT-1))*JLOOP)**2)**NEXPX,JLOOP=IXOR-1,IXOR+NIU-2)/),2,NJU) & - *SPREAD((/((SIN((XPI/(NJMAX_ll+2*JPHEXT-1))*JLOOP)**2)**NEXPY,JLOOP=IYOR-1,IYOR+NJU-2)/),1,NIU) - IF(L1D) THEN ! one-dimensional case - XZS(:,:) = XHMAX - END IF - CASE('BELL') ! bell-shaped orography - IF (XHMAX==XUNDEF) XHMAX=300. - LFLAT = .FALSE. - IF(.NOT.L2D) THEN ! three-dimensional case - XZS(:,:) = XHMAX / ( 1. & - + ( (SPREAD(XXHAT(1:NIU),2,NJU) - REAL(NIZS) * XDELTAX) /XAX ) **2 & - + ( (SPREAD(XYHAT(1:NJU),1,NIU) - REAL(NJZS) * XDELTAY) /XAY ) **2 ) **1.5 - ELSE ! two-dimensional case - XZS(:,:) = XHMAX / ( 1. & - + ( (SPREAD(XXHAT(1:NIU),2,NJU) - REAL(NIZS) * XDELTAX) /XAX ) **2 ) - ENDIF - IF(L1D) THEN ! one-dimensional case - XZS(:,:) = XHMAX - END IF - CASE('COSI') ! (1+cosine)**4 shape - IF (XHMAX==XUNDEF) XHMAX=800. - LFLAT = .FALSE. - IF(L2D) THEN ! two-dimensional case - DO JILOOP = 1, NIU - ZDIST = XXHAT(JILOOP)-REAL(NIZS)*XDELTAX - IF( ABS(ZDIST)<(4.0*XAX) ) THEN - XZS(JILOOP,:) = (XHMAX/16.0)*( 1.0 + COS((XPI*ZDIST)/(4.0*XAX)) )**4 - ELSE - XZS(JILOOP,:) = 0.0 - ENDIF - END DO - ENDIF - CASE('SCHA') ! exp(-(x/a)**2)*cosine(pi*x/lambda)**2 shape - IF (XHMAX==XUNDEF) XHMAX=800. - LFLAT = .FALSE. - IF(L2D) THEN ! two-dimensional case - DO JILOOP = 1, NIU - ZDIST = XXHAT(JILOOP)-REAL(NIZS)*XDELTAX - IF( ABS(ZDIST)<(4.0*XAX) ) THEN - XZS(JILOOP,:) = XHMAX*EXP(-(ZDIST/XAY)**2)*COS((XPI*ZDIST)/XAX)**2 - ELSE - XZS(JILOOP,:) = 0.0 - ENDIF - END DO - ENDIF - CASE('AGNE') ! h*a**2/(x**2+a**2) shape - LFLAT = .FALSE. - IF(L2D) THEN ! two-dimensional case - DO JILOOP = 1, NIU - ZDIST = XXHAT(JILOOP)-REAL(NIZS)*XDELTAX - XZS(JILOOP,:) = XHMAX*(XAX**2)/(XAX**2+ZDIST**2) - END DO - ELSE ! three dimensionnal case - infinite profile in y direction - DO JILOOP = 1, NIU - ZDIST = XXHAT(JILOOP)-REAL(NIZS)*XDELTAX - XZS(JILOOP,:) = XHMAX*(XAX**2)/(XAX**2+ZDIST**2) - END DO - ENDIF - - CASE('DATA') ! discretized orography - LFLAT =.FALSE. - WRITE(NLUOUT,FMT=*) 'CZS="DATA", ATTEMPT TO READ ARRAY & - &XZS(NIB:NIU-JPHEXT:1,NJU-JPHEXT:NJB:-1) & - &starting from the first index' - CALL POSKEY(NLUPRE,NLUOUT,'ZSDATA') - DO JJLOOP = NJMAX_ll+2*JPHEXT-1,JPHEXT+1,-1 ! input like a map prior the sounding - READ(NLUPRE,FMT=*) ZZS_ll - IF ( ( JJLOOP <= ( NJU-JPHEXT + IYOR-1 ) ) .AND. ( JJLOOP >= ( NJB + IYOR-1 ) ) ) THEN - IJ = JJLOOP - ( IYOR-1 ) - XZS(NIB:NIU-JPHEXT,IJ) = ZZS_ll(IXOR:IXOR + NIU-JPHEXT - NIB ) - END IF - END DO -! - CASE DEFAULT ! undefined shape of orography - !callabortstop - CALL PRINT_MSG(NVERB_FATAL,'GEN','PREP_IDEAL_CASE','erroneous ground type') - END SELECT -! - CALL ADD2DFIELD_ll( TZ_FIELDS_ll, XZS, 'PREP_IDEAL_CASE::XZS' ) - CALL UPDATE_HALO_ll(TZ_FIELDS_ll,IINFO_ll) - CALL CLEANLIST_ll(TZ_FIELDS_ll) -! -END IF -! -!IF( ( LEN_TRIM(CPGD_FILE) /= 0 ) .AND. .NOT.LFLAT .AND. & -! ((CLBCX(1) /= "OPEN" ) .OR. & -! (CLBCX(2) /= "OPEN" ) .OR. (CLBCY(1) /= "OPEN" ) .OR. & -! (CLBCY(2) /= "OPEN" )) ) THEN -! !callabortstop -! CALL PRINT_MSG(NVERB_FATAL,'GEN','PREP_IDEAL_CASE','with a PGD file, you cannot be in a cyclic LBC') -!END IF -! -IF (LWEST_ll()) THEN - DO JILOOP = 1,JPHEXT - XZS(JILOOP,:) = XZS(NIB,:) - END DO -END IF -IF (LEAST_ll()) THEN - DO JILOOP = NIU-JPHEXT+1,NIU - XZS(JILOOP,:)=XZS(NIU-JPHEXT,:) - END DO -END IF -IF (LSOUTH_ll()) THEN - DO JJLOOP = 1,JPHEXT - XZS(:,JJLOOP)=XZS(:,NJB) - END DO -END IF -IF (LNORTH_ll()) THEN - DO JJLOOP =NJU-JPHEXT+1,NJU - XZS(:,JJLOOP)=XZS(:,NJU-JPHEXT) - END DO -END IF -! -IF ( LEN_TRIM(CPGD_FILE) == 0 .OR. .NOT. LREAD_ZS) THEN - IF (LSLEVE) THEN - CALL ZSMT_PIC(NSLEVE,XSMOOTH_ZS) - ELSE - XZSMT(:,:) = 0. - END IF -END IF -! -IF (LCARTESIAN) THEN - CALL SM_GRIDCART(XXHAT,XYHAT,XZHAT,XZS,LSLEVE,XLEN1,XLEN2,XZSMT,XDXHAT,XDYHAT,XZZ,XJ) - XMAP=1. -ELSE - CALL SM_GRIDPROJ(XXHAT,XYHAT,XZHAT,XZS,LSLEVE,XLEN1,XLEN2,XZSMT,XLATORI,XLONORI, & - XMAP,XLAT,XLON,XDXHAT,XDYHAT,XZZ,XJ) -END IF -!* 5.4.1 metrics coefficients and update halos: -! -CALL METRICS(XMAP,XDXHAT,XDYHAT,XZZ,XDXX,XDYY,XDZX,XDZY,XDZZ) -! -CALL UPDATE_METRICS(CLBCX,CLBCY,XDXX,XDYY,XDZX,XDZY,XDZZ) -! -!* 5.1.3 Compute the localization in index space of the vertical profile -! in CSTN and RSOU cases : -! -IF (CTYPELOC =='LATLON' ) THEN - IF (.NOT.LCARTESIAN) THEN ! compute (x,y) if - CALL SM_XYHAT(XLATORI,XLONORI, & ! the localization - XLATLOC,XLONLOC,XXHATLOC,XYHATLOC) ! is given in latitude - ELSE ! and longitude - WRITE(NLUOUT,FMT=*) 'CTYPELOC CANNOT BE LATLON IN CARTESIAN GEOMETRY' - WRITE(NLUOUT,FMT=*) '-> JOB ABORTED' - !callabortstop - CALL PRINT_MSG(NVERB_FATAL,'GEN','PREP_IDEAL_CASE','CTYPELOC cannot be LATLON in cartesian geometry') - END IF -END IF -! -ALLOCATE(ZXHAT_ll(NIMAX_ll+ 2 * JPHEXT),ZYHAT_ll(NJMAX_ll+2 * JPHEXT)) -CALL GATHERALL_FIELD_ll('XX',XXHAT,ZXHAT_ll,NRESP) !// -CALL GATHERALL_FIELD_ll('YY',XYHAT,ZYHAT_ll,NRESP) !// -IF (CTYPELOC /= 'IJGRID') THEN - NILOC = MINLOC(ABS(XXHATLOC-ZXHAT_ll(:))) - NJLOC = MINLOC(ABS(XYHATLOC-ZYHAT_ll(:))) -END IF -! -IF ( L1D .AND. ( NILOC(1) /= 1 .OR. NJLOC(1) /= 1 ) ) THEN - NILOC = 1 - NJLOC = 1 - WRITE(NLUOUT,FMT=*) 'FOR 1D CONFIGURATION, THE RS INFORMATIONS ARE TAKEN AT & - & I=1 AND J=1 (CENTRAL VERTICAL WITHOUT HALO)' -END IF -! -IF ( L2D .AND. ( NJLOC(1) /= 1 ) ) THEN - NJLOC = 1 - WRITE(NLUOUT,FMT=*) 'FOR 2D CONFIGURATION, THE RS INFORMATIONS ARE TAKEN AT & - & J=1 (CENTRAL PLANE WITHOUT HALO)' -END IF -! -!* 5.2 Prognostic variables (not multiplied by rhoJ) : u,v,w,theta,r -! and 1D anelastic reference state -! -! -!* 5.2.1 Use a Radiosounding : CIDEAL='RSOU'' -! -IF (CIDEAL == 'RSOU') THEN - WRITE(NLUOUT,FMT=*) 'CIDEAL="RSOU", attempt to read DATE' - CALL POSKEY(NLUPRE,NLUOUT,'RSOU') - READ(NLUPRE,FMT=*) NYEAR,NMONTH,NDAY,XTIME - TDTCUR = DATE_TIME(DATE(NYEAR,NMONTH,NDAY),XTIME) - TDTEXP = TDTCUR - TDTSEG = TDTCUR - TDTMOD = TDTCUR - WRITE(NLUOUT,FMT=*) 'CIDEAL="RSOU", ATTEMPT TO PROCESS THE SOUNDING DATA' - IF (LGEOSBAL) THEN - CALL SET_RSOU(TFILE_DUMMY,TZEXPREFILE,CFUNU,CFUNV,NILOC(1),NJLOC(1),LBOUSS, & - XJ,LSHIFT,XCORIOZ) - ELSE - CALL SET_RSOU(TFILE_DUMMY,TZEXPREFILE,CFUNU,CFUNV,NILOC(1),NJLOC(1),LBOUSS, & - XJ,LSHIFT) - END IF -! -!* 5.2.2 N=cste and U(z) : CIDEAL='CSTN' -! -ELSE IF (CIDEAL == 'CSTN') THEN - WRITE(NLUOUT,FMT=*) 'CIDEAL="CSTN", attempt to read DATE' - CALL POSKEY(NLUPRE,NLUOUT,'CSTN') - READ(NLUPRE,FMT=*) NYEAR,NMONTH,NDAY,XTIME - TDTCUR = DATE_TIME(DATE(NYEAR,NMONTH,NDAY),XTIME) - TDTEXP = TDTCUR - TDTSEG = TDTCUR - TDTMOD = TDTCUR - WRITE(NLUOUT,FMT=*) 'CIDEAL="CSTN", ATTEMPT TO PROCESS THE SOUNDING DATA' - IF (LGEOSBAL) THEN - CALL SET_CSTN(TFILE_DUMMY,TZEXPREFILE,CFUNU,CFUNV,NILOC(1),NJLOC(1),LBOUSS, & - XJ,LSHIFT,XCORIOZ) - ELSE - CALL SET_CSTN(TFILE_DUMMY,TZEXPREFILE,CFUNU,CFUNV,NILOC(1),NJLOC(1),LBOUSS, & - XJ,LSHIFT) - END IF -! -END IF -! -!* 5.3 Forcing variables -! -IF (LFORCING) THEN - WRITE(NLUOUT,FMT=*) 'FORCING IS ENABLED, ATTEMPT TO SET FORCING FIELDS' - CALL POSKEY(NLUPRE,NLUOUT,'ZFRC ','PFRC') - CALL SET_FRC(TZEXPREFILE) -END IF -! -!! --------------------------------------------------------------------- -! Modif PP ADV FRC -! 5.4.2 initialize profiles for adv forcings -IF (L2D_ADV_FRC) THEN - WRITE(NLUOUT,FMT=*) 'L2D_ADV_FRC IS SET TO TRUE' - WRITE(NLUOUT,FMT=*) 'ADVECTING FORCING USED IS USER MADE, NOT STANDARD ONE ' - WRITE(NLUOUT,FMT=*) 'IT IS FOR 2D IDEALIZED WAM STUDY ONLY ' - CALL POSKEY(NLUPRE,NLUOUT,'ZFRC_ADV') - CALL SET_ADVFRC(TZEXPREFILE) -ENDIF -IF (L2D_REL_FRC) THEN - WRITE(NLUOUT,FMT=*) 'L2D_REL_FRC IS SET TO TRUE' - WRITE(NLUOUT,FMT=*) 'RELAXATION FORCING USED IS USER MADE, NOT STANDARD ONE ' - WRITE(NLUOUT,FMT=*) 'IT IS FOR 2D IDEALIZED WAM STUDY ONLY ' - CALL POSKEY(NLUPRE,NLUOUT,'ZFRC_REL') - CALL SET_RELFRC(TZEXPREFILE) -ENDIF -!* 5.4 3D Reference state variables : -! -! -!* 5.4.1 metrics coefficients and update halos: -! -CALL METRICS(XMAP,XDXHAT,XDYHAT,XZZ,XDXX,XDYY,XDZX,XDZY,XDZZ) -! -CALL UPDATE_METRICS(CLBCX,CLBCY,XDXX,XDYY,XDZX,XDZY,XDZZ) -! -!* 5.4.2 3D reference state : -! -CALL SET_REF(0,TFILE_DUMMY, & - XZZ,XZHAT,XJ,XDXX,XDYY,CLBCX,CLBCY, & - XREFMASS,XMASS_O_PHI0,XLINMASS, & - XRHODREF,XTHVREF,XRVREF,XEXNREF,XRHODJ) -! -! -!* 5.5.1 Absolute pressure : -! -! -!* 5.5.2 Total mass of dry air Md computation : -! -CALL TOTAL_DMASS(XJ,XRHODREF,XDRYMASST) -! -! -!* 5.6 Complete prognostic variables (multipliy by rhoJ) at time t : -! -! U grid : gridpoint 2 -IF (LWEST_ll()) XUT(1,:,:) = 2.*XUT(2,:,:) - XUT(3,:,:) -! V grid : gridpoint 3 -IF (LSOUTH_ll()) XVT(:,1,:) = 2.*XVT(:,2,:) - XVT(:,3,:) -! SV : gridpoint 1 -XSVT(:,:,:,:) = 0. -! -! -!* 5.7 Larger scale fields initialization : -! -XLSUM(:,:,:) = XUT(:,:,:) ! these fields do not satisfy the -XLSVM(:,:,:) = XVT(:,:,:) ! lower boundary condition but are -XLSWM(:,:,:) = XWT(:,:,:) ! in equilibrium -XLSTHM(:,:,:)= XTHT(:,:,:) -XLSRVM(:,:,:)= XRT(:,:,:,1) -! -! enforce the vertical homogeneity under the ground and above the top of -! the model for the LS fields -! -XLSUM(:,:,NKB-1)=XLSUM(:,:,NKB) -XLSUM(:,:,NKU)=XLSUM(:,:,NKU-1) -XLSVM(:,:,NKB-1)=XLSVM(:,:,NKB) -XLSVM(:,:,NKU)=XLSVM(:,:,NKU-1) -XLSWM(:,:,NKB-1)=XLSWM(:,:,NKB) -XLSWM(:,:,NKU)=XLSWM(:,:,NKU-1) -XLSTHM(:,:,NKB-1)=XLSTHM(:,:,NKB) -XLSTHM(:,:,NKU)=XLSTHM(:,:,NKU-1) -IF ( NRR > 0 ) THEN - XLSRVM(:,:,NKB-1)=XLSRVM(:,:,NKB) - XLSRVM(:,:,NKU)=XLSRVM(:,:,NKU-1) -END IF -! -ILBX=SIZE(XLBXUM,1) -ILBY=SIZE(XLBYUM,2) -IF(LWEST_ll() .AND. .NOT. L1D) THEN - XLBXUM(1:NRIMX+JPHEXT, :,:) = XUT(2:NRIMX+JPHEXT+1, :,:) - XLBXVM(1:NRIMX+JPHEXT, :,:) = XVT(1:NRIMX+JPHEXT, :,:) - XLBXWM(1:NRIMX+JPHEXT, :,:) = XWT(1:NRIMX+JPHEXT, :,:) - XLBXTHM(1:NRIMX+JPHEXT, :,:) = XTHT(1:NRIMX+JPHEXT, :,:) - XLBXRM(1:NRIMX+JPHEXT, :,:,:) = XRT(1:NRIMX+JPHEXT, :,:,:) -ENDIF -IF(LEAST_ll() .AND. .NOT. L1D) THEN - XLBXUM(ILBX-NRIMX-JPHEXT+1:ILBX,:,:) = XUT(NIU-NRIMX-JPHEXT+1:NIU, :,:) - XLBXVM(ILBX-NRIMX-JPHEXT+1:ILBX,:,:) = XVT(NIU-NRIMX-JPHEXT+1:NIU, :,:) - XLBXWM(ILBX-NRIMX-JPHEXT+1:ILBX,:,:) = XWT(NIU-NRIMX-JPHEXT+1:NIU, :,:) - XLBXTHM(ILBX-NRIMX-JPHEXT+1:ILBX,:,:) = XTHT(NIU-NRIMX-JPHEXT+1:NIU, :,:) - XLBXRM(ILBX-NRIMX-JPHEXT+1:ILBX,:,:,:) = XRT(NIU-NRIMX-JPHEXT+1:NIU, :,:,:) -ENDIF -IF(LSOUTH_ll() .AND. .NOT. L1D .AND. .NOT. L2D) THEN - XLBYUM(:,1:NRIMY+JPHEXT, :) = XUT(:,1:NRIMY+JPHEXT, :) - XLBYVM(:,1:NRIMY+JPHEXT, :) = XVT(:,2:NRIMY+JPHEXT+1, :) - XLBYWM(:,1:NRIMY+JPHEXT, :) = XWT(:,1:NRIMY+JPHEXT, :) - XLBYTHM(:,1:NRIMY+JPHEXT, :) = XTHT(:,1:NRIMY+JPHEXT, :) - XLBYRM(:,1:NRIMY+JPHEXT, :,:) = XRT(:,1:NRIMY+JPHEXT, :,:) -ENDIF -IF(LNORTH_ll().AND. .NOT. L1D .AND. .NOT. L2D) THEN - XLBYUM(:,ILBY-NRIMY-JPHEXT+1:ILBY,:) = XUT(:,NJU-NRIMY-JPHEXT+1:NJU, :) - XLBYVM(:,ILBY-NRIMY-JPHEXT+1:ILBY,:) = XVT(:,NJU-NRIMY-JPHEXT+1:NJU, :) - XLBYWM(:,ILBY-NRIMY-JPHEXT+1:ILBY,:) = XWT(:,NJU-NRIMY-JPHEXT+1:NJU, :) - XLBYTHM(:,ILBY-NRIMY-JPHEXT+1:ILBY,:) = XTHT(:,NJU-NRIMY-JPHEXT+1:NJU, :) - XLBYRM(:,ILBY-NRIMY-JPHEXT+1:ILBY,:,:) = XRT(:,NJU-NRIMY-JPHEXT+1:NJU, :,:) -ENDIF -DO JSV = 1, NSV - IF(LWEST_ll() .AND. .NOT. L1D) & - XLBXSVM(1:NRIMX+JPHEXT, :,:,JSV) = XSVT(1:NRIMX+JPHEXT, :,:,JSV) - IF(LEAST_ll() .AND. .NOT. L1D) & - XLBXSVM(ILBX-NRIMX-JPHEXT+1:ILBX,:,:,JSV) = XSVT(NIU-NRIMX-JPHEXT+1:NIU, :,:,JSV) - IF(LSOUTH_ll() .AND. .NOT. L1D .AND. .NOT. L2D) & - XLBYSVM(:,1:NRIMY+JPHEXT, :,JSV) = XSVT(:,1:NRIMY+JPHEXT, :,JSV) - IF(LNORTH_ll() .AND. .NOT. L1D .AND. .NOT. L2D) & - XLBYSVM(:,ILBY-NRIMY-JPHEXT+1:ILBY,:,JSV) = XSVT(:,NJU-NRIMY-JPHEXT+1:NJU, :,JSV) -END DO -! -! -!* 5.8 Add a perturbation to a basic state : -! -IF(LPERTURB) CALL SET_PERTURB(TZEXPREFILE) -! -! -!* 5.9 Anelastic correction and pressure: -! -IF (.NOT.LOCEAN) THEN - CALL ICE_ADJUST_BIS(XPABST,XTHT,XRT) - IF ( .NOT. L1D ) CALL PRESSURE_IN_PREP(XDXX,XDYY,XDZX,XDZY,XDZZ) - CALL ICE_ADJUST_BIS(XPABST,XTHT,XRT) -END IF -! -! -!* 5.10 Compute THETA, vapor and cloud mixing ratio -! -IF (CIDEAL == 'RSOU') THEN - ALLOCATE(ZEXN(NIU,NJU,NKU)) - ALLOCATE(ZT(NIU,NJU,NKU)) - ALLOCATE(ZTHL(NIU,NJU,NKU)) - ALLOCATE(ZRT(NIU,NJU,NKU)) - ALLOCATE(ZCPH(NIU,NJU,NKU)) - ALLOCATE(ZLVOCPEXN(NIU,NJU,NKU)) - ALLOCATE(ZLSOCPEXN(NIU,NJU,NKU)) - ALLOCATE(ZFRAC_ICE(NIU,NJU,NKU)) - ALLOCATE(ZRSATW(NIU,NJU,NKU)) - ALLOCATE(ZRSATI(NIU,NJU,NKU)) - ALLOCATE(ZBUF(NIU,NJU,NKU,16)) - ZRT=XRT(:,:,:,1)+XRT(:,:,:,2)+XRT(:,:,:,4) -IF (LOCEAN) THEN - ZEXN(:,:,:)= 1. - ZT=XTHT - ZTHL=XTHT - ZCPH=XCPD+ XCPV * XRT(:,:,:,1) - ZLVOCPEXN = XLVTT - ZLSOCPEXN = XLSTT -ELSE - ZEXN=(XPABST/XP00) ** (XRD/XCPD) - ZT=XTHT*(XPABST/XP00)**(XRD/XCPD) - ZCPH=XCPD+ XCPV * XRT(:,:,:,1)+ XCL *XRT(:,:,:,2) + XCI * XRT(:,:,:,4) - ZLVOCPEXN = (XLVTT + (XCPV-XCL) * (ZT-XTT))/(ZCPH*ZEXN) - ZLSOCPEXN = (XLSTT + (XCPV-XCI) * (ZT-XTT))/(ZCPH*ZEXN) - ZTHL=XTHT-ZLVOCPEXN*XRT(:,:,:,2)-ZLSOCPEXN*XRT(:,:,:,4) - CALL TH_R_FROM_THL_RT(CST, NEB, SIZE(ZFRAC_ICE), 'T',ZFRAC_ICE,XPABST,ZTHL,ZRT,XTHT,XRT(:,:,:,1), & - XRT(:,:,:,2),XRT(:,:,:,4),ZRSATW, ZRSATI,OOCEAN=.FALSE.,& - PBUF=ZBUF) -END IF - DEALLOCATE(ZEXN) - DEALLOCATE(ZT) - DEALLOCATE(ZCPH) - DEALLOCATE(ZLVOCPEXN) - DEALLOCATE(ZLSOCPEXN) - DEALLOCATE(ZTHL) - DEALLOCATE(ZRT) - DEALLOCATE(ZBUF) -! Coherence test - IF ((.NOT. LUSERI) ) THEN - IF (MAXVAL(XRT(:,:,:,4))/= 0) THEN - WRITE(NLUOUT,FMT=*) "*********************************" - WRITE(NLUOUT,FMT=*) 'WARNING' - WRITE(NLUOUT,FMT=*) 'YOU HAVE LUSERI=FALSE ' - WRITE(NLUOUT,FMT=*) ' BUT WITH YOUR RADIOSOUNDING Ri/=0' - WRITE(NLUOUT,FMT=*) MINVAL(XRT(:,:,:,4)),MAXVAL(XRT(:,:,:,4)) - WRITE(NLUOUT,FMT=*) "*********************************" - ENDIF - ENDIF - IF ((.NOT. LUSERC)) THEN - IF (MAXVAL(XRT(:,:,:,2))/= 0) THEN - WRITE(NLUOUT,FMT=*) "*********************************" - WRITE(NLUOUT,FMT=*) 'WARNING' - WRITE(NLUOUT,FMT=*) 'YOU HAVE LUSERC=FALSE ' - WRITE(NLUOUT,FMT=*) 'BUT WITH YOUR RADIOSOUNDING RC/=0' - WRITE(NLUOUT,FMT=*) MINVAL(XRT(:,:,:,2)),MAXVAL(XRT(:,:,:,2)) - WRITE(NLUOUT,FMT=*) "*********************************" - ENDIF - ENDIF - ! on remet les bonnes valeurs pour NRR - IF(CCLOUD=='NONE') NRR=1 - IF(CCLOUD=='REVE') NRR=2 -END IF -! -!------------------------------------------------------------------------------- -! -!* 6. INITIALIZE SCALAR VARIABLES FOR CHEMISTRY -! ----------------------------------------- -! -! before calling chemistry -CCONF = 'START' -CSTORAGE_TYPE='TT' -CALL IO_File_close(TZEXPREFILE) ! Close the EXPRE file -! -IF ( LCH_INIT_FIELD ) CALL CH_INIT_FIELD_n(1, NLUOUT, NVERB) -! -! Initialization LIMA variables by ORILAM -IF (CCLOUD == 'LIMA' .AND. ((LORILAM).OR.(LDUST).OR.(LSALT))) & - CALL AER2LIMA(XSVT, XRHODREF, XRT(:,:,:,1), XPABST, XTHT, XZZ) -!------------------------------------------------------------------------------- -! -!* 7. INITIALIZE LEVELSET FOR IBM -! --------------------------- -! -IF (LIBM_LSF) THEN - ! - ! In their current state, the IBM can only be used in - ! combination with cartesian coordinates and flat orography. - ! - IF ((CZS.NE."FLAT").OR.(.NOT.LCARTESIAN)) THEN - CALL PRINT_MSG(NVERB_FATAL,'GEN','PREP_IDEAL_CASE','IBM can only be used with flat ground') - ENDIF - ! - ALLOCATE(XIBM_LS(NIU,NJU,NKU,4)) - ! - CALL IBM_INIT_LS(XIBM_LS) - ! -ENDIF -! -!------------------------------------------------------------------------------- -! -!* 8. WRITE THE FMFILE -! ---------------- -! -CALL SECOND_MNH2(ZTIME1) -! -NNPRAR = 22 + 2*(NRR+NSV) & ! 22 = number of grid variables + reference - + 8 + 17 ! state variables + dimension variables - ! 2*(8+NRR+NSV) + 1 = number of prognostic - ! variables at time t and t-dt -NTYPE=1 -! -CALL IO_File_add2list(TINIFILE,TRIM(CINIFILE),'MNH','WRITE',KLFINPRAR=NNPRAR,KLFITYPE=NTYPE,KLFIVERB=NVERB) -! -CALL IO_File_open(TINIFILE) -! -CALL IO_Header_write(TINIFILE) -! -CALL WRITE_DESFM_n(1,TINIFILE) -! -CALL WRITE_LFIFM_n(TINIFILE,'') ! There is no DAD model for PREP_IDEAL_CASE -! -CALL SECOND_MNH2(ZTIME2) -! -XT_STORE = XT_STORE + ZTIME2 - ZTIME1 -! -!------------------------------------------------------------------------------- -! -!* 9. EXTERNALIZED SURFACE -! -------------------- -! -! -IF (CSURF =='EXTE') THEN - IF (LEN_TRIM(CINIFILEPGD)==0) THEN - IF (LEN_TRIM(CPGD_FILE)/=0) THEN - CINIFILEPGD=CPGD_FILE - ELSE - !callabortstop - CALL PRINT_MSG(NVERB_FATAL,'GEN','PREP_IDEAL_CASE','CINIFILEPGD needed in NAM_LUNITn') - ENDIF - ENDIF - CALL SURFEX_ALLOC_LIST(1) - YSURF_CUR => YSURF_LIST(1) - CALL READ_ALL_NAMELISTS(YSURF_CUR,'MESONH','PRE',.FALSE.) - ! Switch to model 1 surface variables - CALL GOTO_SURFEX(1) - !* definition of physiographic fields - ! computed ... - IF (LEN_TRIM(CPGD_FILE)==0 .OR. .NOT. LREAD_GROUND_PARAM) THEN - TPGDFILE => TINIFILE - CALL PGD_GRID_SURF_ATM(YSURF_CUR%UG, YSURF_CUR%U,YSURF_CUR%GCP,'MESONH',TINIFILE%CNAME,'MESONH',.TRUE.,HDIR='-') - CALL PGD_SURF_ATM (YSURF_CUR,'MESONH',TINIFILE%CNAME,'MESONH',.TRUE.) - CALL IO_File_add2list(TINIFILEPGD,TRIM(CINIFILEPGD),'PGD','WRITE',KLFINPRAR=NNPRAR,KLFITYPE=NTYPE,KLFIVERB=NVERB) - CALL IO_File_open (TINIFILEPGD) - TPGDFILE => TINIFILEPGD - ELSE - ! ... or read from file. - CALL INIT_PGD_SURF_ATM( YSURF_CUR, 'MESONH', 'PGD', & - ' ', ' ', & - TDTCUR%nyear, TDTCUR%nmonth, & - TDTCUR%nday, TDTCUR%xtime ) -! - END IF - ! - !* forces orography from atmospheric file - IF (.NOT. LREAD_ZS) CALL MNHPUT_ZS_n - ! - ! on ecrit un nouveau fichier PGD que s'il n'existe pas - IF (LEN_TRIM(CPGD_FILE)==0 .OR. .NOT. LREAD_GROUND_PARAM) THEN - !* writing of physiographic fields in the file - CSTORAGE_TYPE='PG' - ! - CALL IO_Header_write(TINIFILEPGD) - CALL IO_Field_write(TINIFILEPGD,'JPHEXT', JPHEXT) - CALL IO_Field_write(TINIFILEPGD,'SURF','EXTE') - CALL IO_Field_write(TINIFILEPGD,'L1D', L1D) - CALL IO_Field_write(TINIFILEPGD,'L2D', L2D) - CALL IO_Field_write(TINIFILEPGD,'PACK',LPACK) - CALL WRITE_HGRID(1,TINIFILEPGD) - ! - TOUTDATAFILE => TINIFILEPGD - ! - TFILE_SURFEX => TINIFILEPGD - ALLOCATE(YSURF_CUR%DUO%CSELECT(0)) - CALL WRITE_PGD_SURF_ATM_n(YSURF_CUR,'MESONH') - NULLIFY(TFILE_SURFEX) - CSTORAGE_TYPE='TT' - ENDIF - ! - ! - !* rereading of physiographic fields and definition of prognostic fields - !* writing of all surface fields - TOUTDATAFILE => TINIFILE - TFILE_SURFEX => TINIFILE - CALL PREP_SURF_MNH(' ',' ') - NULLIFY(TFILE_SURFEX) -ELSE - CSURF = "NONE" -END IF -! -!------------------------------------------------------------------------------- -! -!* 10. CLOSES THE FILE -! --------------- -! -IF (CSURF =='EXTE' .AND. (LEN_TRIM(CPGD_FILE)==0 .OR. .NOT. LREAD_GROUND_PARAM)) THEN - CALL IO_File_close(TINIFILEPGD) -ENDIF -CALL IO_File_close(TINIFILE) -IF( LEN_TRIM(CPGD_FILE) /= 0 ) THEN - CALL IO_File_close(TPGDFILE) -ENDIF -! -! -!------------------------------------------------------------------------------- -! -!* 11. PRINTS ON OUTPUT-LISTING -! ------------------------ -! -IF (NVERB >= 5) THEN - WRITE(NLUOUT,FMT=*) 'PREP_IDEAL_CASE: LCARTESIAN,CIDEAL,CZS=', & - LCARTESIAN,CIDEAL,CZS - WRITE(NLUOUT,FMT=*) 'PREP_IDEAL_CASE: LUSERV=',LUSERV - WRITE(NLUOUT,FMT=*) 'PREP_IDEAL_CASE: XLON0,XLAT0,XBETA,XRPK,XLONORI,XLATORI=', & - XLON0,XLAT0,XBETA,XRPK,XLONORI,XLATORI - WRITE(NLUOUT,FMT=*) 'PREP_IDEAL_CASE: XDELTAX,XDELTAY=',XDELTAX,XDELTAY - WRITE(NLUOUT,FMT=*) 'PREP_IDEAL_CASE: NVERB=',NVERB - IF(LCARTESIAN) THEN - WRITE(NLUOUT,FMT=*) 'PREP_IDEAL_CASE: No map projection used.' - ELSE - IF (XRPK == 1.) THEN - WRITE(NLUOUT,FMT=*) 'PREP_IDEAL_CASE: Polar stereo used.' - ELSE IF (XRPK == 0.) THEN - WRITE(NLUOUT,FMT=*) 'PREP_IDEAL_CASE: Mercator used.' - ELSE - WRITE(NLUOUT,FMT=*) 'PREP_IDEAL_CASE: Lambert used, cone factor=',XRPK - END IF - END IF -END IF -! -IF (NVERB >= 5) THEN - WRITE(NLUOUT,FMT=*) 'PREP_IDEAL_CASE: IIB, IJB, IKB=',NIB,NJB,NKB - WRITE(NLUOUT,FMT=*) 'PREP_IDEAL_CASE: IIU, IJU, IKU=',NIU,NJU,NKU -END IF -! -! -!* 28.1 print statistics! -! - ! - CALL SECOND_MNH2(ZTIME2) - XT_START=XT_START+ZTIME2-ZEND - ! - ! Set File Timing OUTPUT - ! - CALL SET_ILUOUT_TIMING(TLUOUT0) - ! - ! Compute global time - ! - CALL TIME_STAT_ll(XT_START,ZTOT) - ! - ! - IMI = 1 - CALL TIME_HEADER_ll(IMI) - ! - CALL TIME_STAT_ll(XT_STORE,ZTOT, ' STORE-FIELDS','=') - CALL TIMING_SEPARATOR('+') - CALL TIMING_SEPARATOR('+') - WRITE(YMI,FMT="(I0)") IMI - CALL TIME_STAT_ll(XT_START,ZTOT, ' MODEL'//YMI,'+') - CALL TIMING_SEPARATOR('+') - CALL TIMING_SEPARATOR('+') - CALL TIMING_SEPARATOR('+') -WRITE(NLUOUT,FMT=*) ' ' -WRITE(NLUOUT,FMT=*) '****************************************************' -WRITE(NLUOUT,FMT=*) '* PREP_IDEAL_CASE: PREP_IDEAL_CASE ENDS CORRECTLY. *' -WRITE(NLUOUT,FMT=*) '****************************************************' -! -CALL FINALIZE_MNH() -! -! -CONTAINS -INCLUDE "th_r_from_thl_rt.func.h" -INCLUDE "compute_frac_ice.func.h" -END PROGRAM PREP_IDEAL_CASE diff --git a/src/mesonh/ext/prep_real_case.f90 b/src/mesonh/ext/prep_real_case.f90 deleted file mode 100644 index 01b3b16db84189f7722de5771b398d9bcd50f45d..0000000000000000000000000000000000000000 --- a/src/mesonh/ext/prep_real_case.f90 +++ /dev/null @@ -1,1421 +0,0 @@ -!MNH_LIC Copyright 1995-2021 CNRS, Meteo-France and Universite Paul Sabatier -!MNH_LIC This is part of the Meso-NH software governed by the CeCILL-C licence -!MNH_LIC version 1. See LICENSE, CeCILL-C_V1-en.txt and CeCILL-C_V1-fr.txt -!MNH_LIC for details. version 1. -!----------------------------------------------------------------- -! ###################### - PROGRAM PREP_REAL_CASE -! ###################### -! -!!**** *PREP_REAL_CASE* - program to write an initial FM file from real case -!! situation. -!! -!! PURPOSE -!! ------- -!! -!! The purpose of this program is to prepare an initial meso-NH file -!! (LFIFM and DESFM files) filled by some fields of a real situation. -!! General data are given by the MESO-NH user in the namelist file -!! 'PRE_REAL1.nam'. The fields are obtained from three sources: -!! - an atmospheric input file, which can be: -!! * an Aladin file, itself obtained from an Arpege file with -!! the Aladin routine "FULLPOS". -!! * a grib file (ECMWF, Grib Arpege or Grib Aladin) -!! * a MESONH file -!! - an physiographic data file. -!! -!! 1) Fields obtained from the Atmospheric file: -!! ----------------------------------------- -!! -!! - the projection parameters (checked with PGD file): -!! reference latitude and longitude -!! parameter of projection -!! angle of rotation of the domain -!! -!! - the horizontal grid definition (checked with PGD file): -!! grid mesh -!! latitude and longitude of the reference point -!! (with data from PRE_REAL1.nam) -!! -!! - thermodynamical 3D and 2D fields: -!! potential temperature -!! vapor mixing ratio -!! -!! - dynamical fields: -!! three components of the wind -!! -!! - reference anelastic state variables: -!! profile of virtual potential temperature -!! profile of dry density -!! Exner function at model top -!! -!! - total dry air mass -!! -!! -!! 2) Fields obtained from the physiographic data file: -!! ------------------------------------------------ -!! -!! - the projection parameters: -!! reference latitude and longitude -!! parameter of projection -!! angle of rotation of the domain -!! -!! - the horizontal grid definition: -!! grid mesh -!! latitude and longitude of the reference point -!! (with data from PRE_REAL1.nam) -!! - physiografic fields: (orographic, vegetation, soil and radiation fields) -!! -!! -!! 3) Data obtained from the namelist file PRE_REAL1.nam: -!! -------------------------------------------------- -!! -!! - type of equations system -!! - vertical grid definition -!! - number of points in x and y directions -!! - level of verbosity -!! - name of the different files -!! -!! -!!** METHOD -!! ------ -!! In this program, once the MESO-NH domain is calculated, all the -!! 2D or 3D fields are computed on the MESO-NH horizontal domain WITH -!! the external points. This is particularly important for the large -!! scale fields during the MESO-NH run. -!! -!! 1) The following PREP_REAL_CASE program: -!! -!! - set default values for global variables which will be written in -!! DESFM file (by calling DEFAULT_DESFM1); lateral boundary conditions -!! are open. -!! -!! - opens the different files (by calling OPEN_PRC_FILES). -!! -!! - initializes physical constants (by calling INI_CST). -!! -!! - initializes the horizontal domain from the data read in the -!! descriptive part of the Aladin file and the directives read in the -!! namelist file (routines READ_GENERAL and SET_SUBDOMAIN in -!! READ_ALL_DATA). This MESO-NH domain is a part of the Aladin domain. -!! -!! - initializes global variables from namelists and the MESO-NH -!! vertical grid definition variables in the namelist file -!! (routine READ_VER_GRID). -!! -!! - initializes the physiographic 2D fields from the physiographic data -!! file, in particular the MESO-NH orography. -!! -!! - reads the 3D and 2D variable fields in the Grib file -!! (routine READ_ALL_DATA_GRIB_CASE), -!! if HATMFILETYPE='GRIBEX': -!! absolute temperature -!! specific humidity -!! horizontal contravariant wind -!! surface pressure -!! large scale orography -!! -!! - reads the 3D and 2D variable fields in the input MESONH file -!! (routine READ_ALL_DATA_MESONH_CASE), if HATMFILETYPE='MESONH': -!! potential temperature -!! vapor mixing ratio -!! horizontal wind -!! other mixing ratios -!! turbulence prognostic and semi-prognostic variables -!! large scale orography -!! -!! - computes some geometric variables (routines SM_GRIDPROJ and METRICS), -!! in particular: -!! * altitude 3D array -!! * metric coefficients -!! * jacobian -!! -!! - initializes MESO-NH thermodynamical fields: -!! * changes of variables (routine VER_PREP_mmmmmm_CASE): -!! absolute temperature --> virtual potential temperature -!! specific humidity --> vapor mixing ratio -!! * interpolates/extrapolates the fields from the large scale -!! orography to the MESO-NH one (routine VER_INT_THERMO in -!! VER_THERMO, by using a shifting function method). -!! in water vapor case, the interpolations are always performed -!! on relative humidity. -!! * the pressure is computed on each grid by integration of the -!! hydrostatic equation from bottom or top. When input atmospheric -!! file is a MESO-NH one, information about the difference between -!! hydrostatic pressure and total pressure is kept and interpolated -!! during the entire PREP_REAL_CASE process. -!! * interpolates the fields to the MESO-NH vertical grid -!! (also by routine VER_INT_THERMO in VER_THERMO). -!! * computes the potential temperature (routine VER_THERMO). -!! * sets to zero the mixing ratios, except the vapor mixing ratio -!! (VER_THERMO). -!! -!! - initializes the reference anelastic state variables (routine SET_REFZ -!! in VER_THERMO). -!! -!! - computes the total dry air mass (routine DRY_MASS in VER_THERMO). -!! -!! - initializes MESO-NH dynamical variables: -!! * changes Aladin contravariant wind into true horizontal wind -!! (in subroutine VER_PREP). -!! * interpolates/extrapolates the momentum from the large scale -!! orography to the MESO-NH one (routine VER_INT_DYN in -!! VER_DYN, by using a shifting function method). -!! * interpolates the fields to the MESO-NH vertical grid -!! (also by routine VER_INT_DYN in VER_DYN). The fields -!! are located on a horizontal Arakawa A-grid, as the Aladin fields. -!! * The momentum is interpolated to the Arakawa C-grid -!! (routine VER_DYN). -!! * A first guess of the vertical momentum, verifying the -!! uncompressible continuity equation and the material lower boundary -!! condition against the ground, is computed (routine WGUESS). -!! * computes the final non-divergent wind field (routine -!! ANEL_BALANCE). -!! -!! - copies the interpolated fields also at t-dt and in the large scale -!! fields (routine INI_PROG_VAR). -!! -!! - writes the DESFM and LFIFM files (routines WRITE_DESFM1 and -!! WRITE_LFIFM1). -!! -!! -!! 2) Some conventions are used in this program and its subroutines because -!! of the number of different grids and fields: -!! -!! - subscripts: -!! * the subscripts I and J are used for all the horizontal grid. -!! * the subcript K is used for the MESO-NH vertical grid (increasing -!! from bottom to top). -!! * the subscript L is used for the Aladin or input Mesonh grids -!! (increasing from bottom to top). -!! -!! - suffixes: -!! * _LS: -!! If used for a geographic or horizontal grid definition variable, -!! this variable is connected to the large horizontal domain. -!! If used for a surface variable, this variable corresponds to -!! the large scale orography, and therefore will be modified. -!! If used for another variable, this variable is discretized -!! on the Aladin or input MESONH file vertical grid -!! (large-scale orography with input vertical discretization, -!! either coming from eta levels or input Gal-Chen grid). -!! * _MX: -!! Such a variable is discretized on the mixed grid. -!! (large-scale orography with output Gal-Chen vertical grid -!! discretization) -!! * _SH: -!! Such a variable is discretized on the shifted grid. -!! (fine orography with a shifted vertical grid, NOT Gal-Chen) -!! * no suffix: -!! The variable is discretized on the MESO-NH grid. -!! (fine orography with output Gal-Chen vertical grid discretization) -!! -!! - additional pre-suffixes: (for pressure, Exner and altitude fields) -!! * MASS: -!! The variable is discretized on a mass point -!! * FLUX: -!! The variable is discretized on a flux point -!! -!! -!! - names of variables: for a physical variable VAR: -!! * pVARs is the variable itself. -!! * pRHODVARs is the variable multiplied by the dry density rhod. -!! * pRHODJVARs is the variable multiplied by the dry density rhod -!! and the Jacobian. -!! * pRVARs is the variable multiplied by rhod_ref, the anelastic -!! reference state dry density and the Jacobian. -!! where p and s are the appropriate prefix and suffix. -!! -!! - allocation of arrays: the arrays are allocated -!! * just before their initialization for the general arrays stored in -!! modules. -!! * in the subroutine in which they are declared for the local arrays -!! in a subroutine. -!! * in the routine in which they are initialized for the arrays -!! defined in the monitor PREP_REAL_CASE. In this case they are in -!! fact passed as pointer to the subroutines to allow their -!! dynamical allocation (exception which confirms the rule: ZJ). -!! -!! -!! EXTERNAL -!! -------- -!! -!! Routine DEFAULT_DESFM1 : to set default values for variables which can be -!! contained in DESFM file. -!! Routine OPEN_PRC_FILES: to open all files. -!! Routine INI_CST : to initialize physical constants. -!! Routine READ_ALL_DATA_GRIB_CASE : to read all input data. -!! Routine READ_ALL_DATA_MESONH_CASE : to read all input data. -!! Routine SM_GRIDPROJ : to compute some grid variables, in case of -!! conformal projection. -!! Routine METRICS : to compute metric coefficients. -!! Routine VER_PREP_GRIBEX_CASE : to prepare the interpolations. -!! Routine VER_PREP_MESONH_CASE : to prepare the interpolations. -!! Routine VER_THERMO : to perform the interpolation of thermodynamical -!! variables. -!! Routine VER_DYN : to perform the interpolation of dynamical -!! variables. -!! Routine INI_PROG_VAR : to initialize the prognostic varaibles not yet -!! initialized -!! Routine WRITE_DESFM1 : to write a DESFM file. -!! Routine WRITE_LFIFM1 : to write a LFIFM file. -!! Routine IO_File_close : to close a FM-file (DESFM + LFIFM). -!! -!! Module MODE_GRIDPROJ : contains conformal projection routines -!! -!! Module MODI_DEFAULT_DESFM1 : interface module for routine DEFAULT_DESFM1 -!! Module MODI_OPEN_PRC_FILES : interface module for routine OPEN_PRC_FILES -!! Module MODI_READ_ALL_DATA_MESONH_CASE : interface module for routine -!! READ_ALL_DATA_MESONH_CASE -!! Module MODI_METRICS : interface module for routine METRICS -!! Module MODI_VER_PREP_GRIBEX_CASE : interface module for routine -!! VER_PREP_GRIBEX_CASE -!! Module MODI_VER_PREP_MESONH_CASE : interface module for routine -!! VER_PREP_MESONH_CASE -!! Module MODI_VER_THERMO : interface module for routine VER_THERMO -!! Module MODI_VER_DYN : interface module for routine VER_DYN -!! Module MODI_INI_PROG_VAR : interface module for routine INI_PROG_VAR -!! Module MODI_WRITE_DESFM1 : interface module for routine WRITE_DESFM1 -!! Module MODI_WRITE_LFIFM1 : interface module for routine WRITE_LFIFM1 -!! -!! -!! IMPLICIT ARGUMENTS -!! ------------------ -!! -!! Module MODD_CONF : contains configuration variables for all models. -!! NVERB : verbosity level for output-listing -!! Module MODD_CONF1 : contains configuration variables for model 1. -!! NRR : number of moist variables -!! Module MODD_LUNIT : contains logical unit and names of files. -!! Module MODD_LUNIT : contains logical unit and names of files (model1). -!! CINIFILE: name of the FM file which will be used for the MESO-NH run. -!! Module MODD_GRID1 : contains grid variables. -!! XLAT : latitude of the grid points -!! XLON : longitudeof the grid points -!! XXHAT : position xhat in the conformal plane -!! XYHAT : position yhat in the conformal plane -!! XDXHAT : horizontal local meshlength on the conformal plane -!! XDYHAT : horizontal local meshlength on the conformal plane -!! XZS : MESO-NH orography -!! XZZ : altitude -!! XZHAT : height zhat -!! XMAP : map factor -!! Module MODD_LBC1 : contains declaration of lateral boundary conditions -!! CLBCX : X-direction LBC type at left(1) and right(2) boundaries -!! CLBCY : Y-direction LBC type at left(1) and right(2) boundaries -!! Module MODD_PARAM1 : contains declaration of the parameterizations' names -!! -!! REFERENCE -!! --------- -!! -!! Book 2 -!! -!! AUTHOR -!! ------ -!! -!! V.Masson Meteo-France -!! -!! MODIFICATIONS -!! ------------- -!! Original 01/01/95 -!! Sept. 21, 1995 (J.Stein and V.Masson) surface pressure -!! Jan. 09, 1996 (V. Masson) pressure function deduced from -!! hydrostatic pressure -!! Jan. 31, 1996 (V. Masson) possibility to initialize -!! atmospheric fields from MESONH file -!! Mar. 18, 1996 (V. Masson) new vertical extrapolation of Ts -!! in case of initialization with MESONH file -!! Apr 17, 1996 (J. Stein ) change the DEFAULT_DESFM CALL -!! May 25, 1996 (V. Masson) Variable CSTORAGE_TYPE -!! Aug 26, 1996 (V. Masson) Only thinshell approximation is -!! currently available. -!! Sept 24, 1996 (V. Masson) add writing of varaibles for -!! nesting ('DAD_NAME', 'DXRATIO', 'DYRATIO') -!! Oct 11, 1996 (V. Masson) L1D and L2D configurations -!! Oct 28, 1996 (V. Masson) add deallocations and NVERB -!! default set to 1 -!! Dec 02, 1996 (V. Masson) vertical interpolation of -!! surface fields in aladin case -!! Dec 12, 1996 (V. Masson) add LS vertical velocity -!! Jan 16, 1997 (J. Stein) Durran's anelastic system -!! May 07, 1997 (V. Masson) add LS tke -!! Jun 27, 1997 (V. Masson) add absolute pressure -!! Jul 09, 1997 (V. Masson) add namelist NAM_REAL_CONF -!! Jul 10, 1997 (V. Masson) add LS epsilon -!! Aug 25, 1997 (V. Masson) add computing time analysis -!! Jan 20, 1998 (J. Stein) add LB and LS fields -!! Apr, 30, 1998 (V. Masson) Large scale VEG and LAI -!! Jun, 04, 1998 (V. Masson) Large scale D2 and Aladin ISBA -!! files -!! Jun, 04, 1998 (V. Masson) Add new soil interface var. -!! Jan 20, 1999 (J. Stein) add a Boundaries call -!! March 15 1999 (J. Pettre, V. Bousquet and V. Masson) -!! initialization from GRIB files -!! Jul 2000 (F.solmon/V.Masson) Adaptation for patch -!! according to GRIB or MESONH case -!! Nov 22, 2000 (P.Tulet, I. Mallet) initialization -!! from GRIB MOCAGE file -!! Fev 01, 2001 (D.Gazen) add module MODD_NSV for NSV variable -!! Jul 02, 2001 (J.Stein) add LCARTESIAN case -!! Oct 15, 2001 (I.Mallet) allow namelists in different orders -!! Dec 2003 (V.Masson) removes surface calls -!! Jun 01, 2002 (O.Nuissier) filtering of tropical cyclone -!! Aou 09, 2005 (D.Barbary) add CDADATMFILE CDADBOGFILE -!! May 2006 Remove KEPS -!! Feb 02, 2012 (C. Mari) interpolation from MOZART -!! add call to READ_CHEM_NETCDF_CASE & -!! VER_PREP_NETCDF_CASE -!! Mar 2012 Add NAM_NCOUT for netcdf output -!! July 2013 (Bosseur & Filippi) Adds Forefire -!! Mars 2014 (J.Escobar) Missing 'full' UPDATE_METRICS for arp2lfi // run -!! April 2014 (G.TANGUY) Add LCOUPLING -!! 2014 (M.Faivre) -!! Fevr 2015 (M.Moge) Cleaning up -!! Aug 2015 (M.Moge) removing EXTRAPOL on XDXX and XDYY in part 8 -!! J.Escobar : 15/09/2015 : WENO5 & JPHEXT <> 1 -!! M.Leriche 2015 : add LUSECHEM dans NAM_CH_CONF -!! Feb 02, 2012 (C. Mari & BV) interpolation from CAMS -!! add call to READ_CAMS_NETCDF_CASE & -!! VER_PREP_NETCDF_CASE -!! Modification 01/2016 (JP Pinty) Add LIMA -!! Modification 02/2016 (JP Pinty) Convert CAMS mix ratio to nbr conc -! -!! 06/2016 (G.Delautier) phasage surfex 8 -!! P.Wautelet : 08/07/2016 : removed MNH_NCWRIT define -!! B.VIE 2016 : LIMA -!! Philippe Wautelet: 05/2016-04/2018: new data structures and calls for I/O -! P. Wautelet 07/02/2019: force TYPE to a known value for IO_File_add2list -! P. Wautelet 14/02/2019: remove CLUOUT/CLUOUT0 and associated variables -! S. Bielli 02/2019: sea salt: significant sea wave height influences salt emission; 5 salt modes -! P. Wautelet 20/03/2019: missing use MODI_INIT_SALT -! P. Wautelet 20/05/2019: add name argument to ADDnFIELD_ll + new ADD4DFIELD_ll subroutine -! T.Nagel 02/2021: add IBM -! P. Wautelet 06/07/2021: use FINALIZE_MNH -!! M. Leriche 26/01/2022: add reading of CAMS reanalysis for chemistry -!! and/or for LIMA -!------------------------------------------------------------------------------- -! -!* 0. DECLARATIONS -! ------------ -! -USE MODD_CH_M9_n -USE MODD_CH_MNHC_n, ONLY: LUSECHAQ_n=>LUSECHAQ,LUSECHIC_n=>LUSECHIC, LUSECHEM_n=>LUSECHEM -USE MODD_CONF -USE MODD_CONF_n -USE MODD_CST -USE MODD_DIM_n -!UPG*PT -USE MODD_CH_AEROSOL -USE MODD_DUST, ONLY: LDUST, NMODE_DST, CRGUNITD, XINISIG, XINIRADIUS, XN0MIN,& - LDSTCAMS -!UPG*PT - -USE MODD_DYN_n, CPRESOPT_n=>CPRESOPT, LRES_n=>LRES, XRES_n=>XRES , NITR_n=>NITR -USE MODD_FIELD_n -USE MODD_GR_FIELD_n -USE MODD_GRID -USE MODD_GRID_n -USE MODD_HURR_CONF -USE MODD_IBM_LSF, ONLY: CIBM_TYPE, LIBM_LSF, NIBM_SMOOTH, XIBM_SMOOTH -USE MODD_IBM_PARAM_n, ONLY: XIBM_LS -USE MODD_IO, ONLY: TFILEDATA, TFILE_SURFEX -USE MODD_LBC_n -USE MODD_LSFIELD_n -USE MODD_LUNIT, ONLY: TPGDFILE,TLUOUT0,TOUTDATAFILE -USE MODD_LUNIT_n, ONLY: CINIFILE,TINIFILE,TLUOUT -USE MODD_METRICS_n -USE MODD_MNH_SURFEX_n -USE MODD_NESTING -USE MODD_NSV -USE MODD_PARAMETERS -USE MODD_PARAM_n -USE MODD_PARAM_ICE, ONLY: PARAM_ICE_ASSOCIATE -USE MODD_PREP_REAL -USE MODD_REF_n -!UPG*PT -USE MODD_SALT, ONLY: LSALT, NMODE_SLT, CRGUNITS, XINISIG_SLT, XINIRADIUS_SLT, XN0MIN_SLT,& - LSLTCAMS -USE MODD_CH_AERO_n, ONLY: XM3D, XRHOP3D, XSIG3D, XRG3D, XN3D, XCTOTA3D -!UPG*PT -USE MODD_TURB_n -! -USE MODE_EXTRAPOL -use mode_field, only: Alloc_field_scalars, Ini_field_list, Ini_field_scalars -USE MODE_FINALIZE_MNH, only: FINALIZE_MNH -USE MODE_GRIDCART -USE MODE_GRIDPROJ -USE MODE_IO, only: IO_Init -USE MODE_IO_FIELD_READ, only: IO_Field_read -USE MODE_IO_FIELD_WRITE, only: IO_Header_write -USE MODE_IO_FILE, only: IO_File_close, IO_File_open -USE MODE_IO_MANAGE_STRUCT, only: IO_File_add2list, IO_File_find_byname -USE MODE_ll -USE MODE_MODELN_HANDLER -USE MODE_MPPDB -USE MODE_MSG -USE MODE_POS -USE MODE_SPLITTINGZ_ll -! -USE MODI_BOUNDARIES -USE MODI_COMPARE_DAD -USE MODI_DEALLOCATE_MODEL1 -USE MODI_DEALLOC_PARA_LL -USE MODI_DEFAULT_DESFM_n -USE MODI_ERROR_ON_TEMPERATURE -USE MODI_IBM_INIT_LS -USE MODI_INI_PROG_VAR -USE MODI_INIT_SALT -USE MODI_LIMA_MIXRAT_TO_NCONC -USE MODI_METRICS -USE MODI_MNHREAD_ZS_DUMMY_n -USE MODI_MNHWRITE_ZS_DUMMY_n -USE MODI_OPEN_PRC_FILES -USE MODI_PREP_SURF_MNH -USE MODI_PRESSURE_IN_PREP -USE MODI_READ_ALL_DATA_GRIB_CASE -USE MODI_READ_ALL_DATA_MESONH_CASE -USE MODI_READ_ALL_NAMELISTS -!UPG*PT -!USE MODI_READ_CAMS_DATA_NETCDF_CASE -!USE MODI_READ_CHEM_DATA_NETCDF_CASE -USE MODI_READ_CHEM_DATA_MOZART_CASE -USE MODI_READ_CHEM_DATA_CAMS_CASE -USE MODI_READ_LIMA_DATA_NETCDF_CASE -USE MODI_AER2LIMA -USE MODI_CH_AER_EQM_INIT_n -!UPG*PT -USE MODI_READ_VER_GRID -USE MODI_SECOND_MNH -USE MODI_SET_REF -USE MODI_UPDATE_METRICS -USE MODI_VER_DYN -USE MODI_VER_PREP_GRIBEX_CASE -USE MODI_VER_PREP_MESONH_CASE -USE MODI_VER_PREP_NETCDF_CASE -USE MODI_VERSION -USE MODI_VER_THERMO -USE MODI_WRITE_DESFM_n -USE MODI_WRITE_LFIFM_n -! -USE MODN_CONF, ONLY: JPHEXT , NHALO -USE MODN_CONFZ -USE MODN_PARAM_LIMA -! -IMPLICIT NONE -! -!* 0.1 Declaration of local variables -! ------------------------------ -! -CHARACTER(LEN=28) :: YATMFILE ! name of the Atmospheric file -CHARACTER(LEN=6) :: YATMFILETYPE! type of the Atmospheric file -CHARACTER(LEN=28) :: YCHEMFILE ! name of the Chemical file -CHARACTER(LEN=6) :: YCHEMFILETYPE! type of the Chemical file -!UP*PT -!CHARACTER(LEN=28) :: YCAMSFILE ! name of the input CAMS file -!CHARACTER(LEN=6) :: YCAMSFILETYPE! type of the input CAMS file -CHARACTER(LEN=28) :: YLIMAFILE ! name of the input MACC file -CHARACTER(LEN=6) :: YLIMAFILETYPE! type of the input MACC file -!UP*PT -CHARACTER(LEN=28) :: YSURFFILE ! name of the Surface file -CHARACTER(LEN=6) :: YSURFFILETYPE! type of the Surface file -CHARACTER(LEN=28) :: YPGDFILE ! name of the physiographic data -! ! file -! -CHARACTER(LEN=28) :: YDAD_NAME ! true name of the atmospheric file -! -!* other variables -! -REAL,DIMENSION(:,:,:), ALLOCATABLE:: ZJ ! Jacobian -! -!* file management variables and counters -! -INTEGER :: ILUOUT0 ! logical unit for listing file -INTEGER :: IPRE_REAL1 ! logical unit for namelist file -INTEGER :: IRESP ! return code in FM routines -LOGICAL :: GFOUND ! Return code when searching namelist -INTEGER :: NIU,NJU,NKU ! Upper bounds in x,y,z directions -! -REAL :: ZSTART, ZEND, ZTIME1, ZTIME2, ZTOT, ZALL ! for computing time analysis -REAL :: ZMISC, ZREAD, ZHORI, ZPREP, ZSURF, ZTHERMO, ZDYN, ZDIAG, ZWRITE -REAL :: ZDG ! diagnostics time in routines -INTEGER :: IINFO_ll ! return code of // routines -! Namelist model variables -CHARACTER(LEN=5) :: CPRESOPT -INTEGER :: NITR -LOGICAL :: LRES -REAL :: XRES -LOGICAL :: LSHIFT ! flag to perform vertical shift or not. -LOGICAL :: LDUMMY_REAL ! flag to read and interpolate - !dummy fields from GRIBex file -INTEGER :: JRR ! loop counter for moist var. -LOGICAL :: LUSECHAQ -LOGICAL :: LUSECHIC -LOGICAL :: LUSECHEM -INTEGER :: JN -! -TYPE(TFILEDATA),POINTER :: TZATMFILE => NULL() -TYPE(TFILEDATA),POINTER :: TZPRE_REAL1FILE => NULL() -! -! -!* 0.3 Declaration of namelists -! ------------------------ -! -NAMELIST/NAM_REAL_CONF/ NVERB, CEQNSYS, CPRESOPT, LSHIFT, LDUMMY_REAL, & - LRES, XRES, NITR,LCOUPLING, NHALO , JPHEXT -! Filtering and balancing of the large-scale and radar tropical cyclone -NAMELIST/NAM_HURR_CONF/ LFILTERING, CFILTERING, & -XLAMBDA, NK, XLATGUESS, XLONGUESS, XBOXWIND, XRADGUESS, NPHIL, NDIAG_FILT, & -NLEVELR0,LBOGUSSING, & -XLATBOG, XLONBOG, XVTMAXSURF, XRADWINDSURF, & -XMAX, XC, XRHO_Z, XRHO_ZZ, XB_0, XBETA_Z, XBETA_ZZ,& -XANGCONV0, XANGCONV1000, XANGCONV2000, & - CDADATMFILE, CDADBOGFILE - NAMELIST/NAM_AERO_CONF/ LORILAM, LINITPM, LDUST, XINIRADIUSI, XINIRADIUSJ,& - XINISIGI, XINISIGJ, XN0IMIN, XN0JMIN, CRGUNIT, CRGUNITD,& - LSALT, CRGUNITS, NMODE_DST, XINISIG, XINIRADIUS, XN0MIN,& -!UPG*PT - XINISIG_SLT, XINIRADIUS_SLT, XN0MIN_SLT, NMODE_SLT, & - LDSTCAMS, LSLTCAMS,CACTCCN,CCLOUD, NMOD_IFN, NMOD_CCN -!UPG*PT - -NAMELIST/NAM_CH_CONF/ LUSECHAQ,LUSECHIC,LUSECHEM -! -NAMELIST/NAM_IBM_LSF/ LIBM_LSF, CIBM_TYPE, NIBM_SMOOTH, XIBM_SMOOTH -! -! name of dad of input FM file -INTEGER :: II, IJ, IGRID, ILENGTH -CHARACTER (LEN=100) :: HCOMMENT -TYPE(LIST_ll), POINTER :: TZFIELDS_ll=>NULL() ! list of fields to exchange -!UPG*PT -REAL, DIMENSION(:,:,:), ALLOCATABLE :: ZLBXRHO, ZLBYRHO -REAL, DIMENSION(:,:,:), ALLOCATABLE :: ZLBXZZ, ZLBYZZ -REAL, DIMENSION(:,:,:), ALLOCATABLE :: ZLBXPABST, ZLBYPABST -INTEGER :: ILBX,ILBY,IIB,IJB,IIE,IJE -!UPG*PT - -!------------------------------------------------------------------------------- -! -CALL MPPDB_INIT() -! -CALL GOTO_MODEL(1,ONOFIELDLIST=.TRUE.) -! -ZDIAG = 0. -CALL SECOND_MNH (ZSTART) -! -ZHORI = 0. -ZSURF = 0. -ZTIME1 = ZSTART -! -!* 1. SET DEFAULT VALUES -! ------------------ -! -CALL VERSION -CPROGRAM='REAL ' -! -CALL ALLOC_FIELD_SCALARS() -CALL PARAM_ICE_ASSOCIATE() -CALL DEFAULT_DESFM_n(1) -NRR=1 -IDX_RVT = 1 -! -!------------------------------------------------------------------------------- -! -!* 2. OPENNING OF THE FILES -! --------------------- -CALL IO_Init() -! -CALL OPEN_PRC_FILES(TZPRE_REAL1FILE,YATMFILE, YATMFILETYPE,TZATMFILE & - ,YCHEMFILE,YCHEMFILETYPE & - ,YSURFFILE,YSURFFILETYPE & - ,YPGDFILE,TPGDFILE & -!UPG*PT -! ,YCAMSFILE,YCAMSFILETYPE) - ,YLIMAFILE,YLIMAFILETYPE) -!UPG*PT -ILUOUT0 = TLUOUT0%NLU -TLUOUT => TLUOUT0 -! -IF (YATMFILETYPE=='MESONH') THEN - LSHIFT = .FALSE. -ELSE IF (YATMFILETYPE=='GRIBEX') THEN - LSHIFT = .TRUE. -ELSE - LSHIFT = .TRUE. - WRITE(ILUOUT0,FMT=*) 'HATMFILETYPE WAS SET TO: '//TRIM(YATMFILETYPE) - WRITE(ILUOUT0,FMT=*) 'ONLY TWO VALUES POSSIBLE FOR HATMFILETYPE:' - WRITE(ILUOUT0,FMT=*) 'EITHER MESONH OR GRIBEX' - WRITE(ILUOUT0,FMT=*) '-> JOB ABORTED' - !callabortstop - CALL PRINT_MSG(NVERB_FATAL,'GEN','PREP_REAL_CASE','') -END IF -! -LCPL_AROME=.FALSE. -LCOUPLING=.FALSE. -! -!------------------------------------------------------------------------------- -! -!* 3. INITIALIZATION OF PHYSICAL CONSTANTS -! ------------------------------------ -! -CALL INI_CST -! -!------------------------------------------------------------------------------- -! -!* 4. READING OF NAMELIST -! ------------------- -! -!* 4.1 reading of configuration variables -! -IPRE_REAL1 = TZPRE_REAL1FILE%NLU -! -CALL INIT_NMLVAR -CALL POSNAM(IPRE_REAL1,'NAM_REAL_CONF',GFOUND,ILUOUT0) -IF (GFOUND) READ(IPRE_REAL1,NAM_REAL_CONF) -CALL POSNAM(IPRE_REAL1,'NAM_PARAM_LIMA',GFOUND,ILUOUT0) -IF (GFOUND) READ(IPRE_REAL1,NAM_PARAM_LIMA) -! -CALL INI_FIELD_LIST(1) -! -CALL INI_FIELD_SCALARS() -! -!* 4.2 reading of values of some configuration variables in namelist -! -! -!JUAN REALZ from prep_surfex -! -IF (YATMFILETYPE == 'GRIBEX') THEN -! -!* 4.1 Vertical Spatial grid -! -CALL INIT_NMLVAR() -CALL READ_VER_GRID(TZPRE_REAL1FILE) -! -CALL IO_Field_read(TPGDFILE,'IMAX',NIMAX) -CALL IO_Field_read(TPGDFILE,'JMAX',NJMAX) -! -NIMAX_ll=NIMAX !! _ll variables are global variables -NJMAX_ll=NJMAX !! but the old names are kept in PRE_IDEA1.nam file -! -CALL SET_JP_ll(JPMODELMAX,JPHEXT,JPVEXT,JPHEXT) -CALL SET_DAD0_ll() -!JUAN 4/04/2014 correction for PREP_REAL_CASE on Gribex files -!CALL SET_DIM_ll(NIMAX_ll, NJMAX_ll, 128) -CALL SET_DIM_ll(NIMAX_ll, NJMAX_ll, NKMAX) -CALL SET_LBX_ll('OPEN',1) -CALL SET_LBY_ll('OPEN', 1) -CALL SET_XRATIO_ll(1, 1) -CALL SET_YRATIO_ll(1, 1) -CALL SET_XOR_ll(1, 1) -CALL SET_XEND_ll(NIMAX_ll+2*JPHEXT, 1) -CALL SET_YOR_ll(1, 1) -CALL SET_YEND_ll(NJMAX_ll+2*JPHEXT, 1) -CALL SET_DAD_ll(0, 1) -!JUANZ -!CALL INI_PARA_ll(IINFO_ll) -CALL INI_PARAZ_ll(IINFO_ll) -!JUANZ - -! -! sizes of arrays of the extended sub-domain -! -CALL GET_DIM_PHYS_ll('B',NIMAX,NJMAX) -!!$CALL GET_DIM_EXT_ll('B',NIU,NJU) -!!$CALL GET_INDICE_ll(NIB,NJB,NIE,NJE) -!!$CALL GET_OR_ll('B',IXOR,IYOR) -ENDIF -!JUAN REALZ -! -LDUMMY_REAL= .FALSE. -LFILTERING= .FALSE. -CFILTERING= 'UVT ' -XLATGUESS= XUNDEF ; XLONGUESS= XUNDEF ; XBOXWIND=XUNDEF; XRADGUESS= XUNDEF -NK=50 ; XLAMBDA=0.2 ; NPHIL=24 -NLEVELR0=15 -NDIAG_FILT=-1 -LBOGUSSING= .FALSE. -XLATBOG= XUNDEF ; XLONBOG= XUNDEF -XVTMAXSURF= XUNDEF ; XRADWINDSURF= XUNDEF -XMAX=16000. ; XC=0.7 ; XRHO_Z=-0.3 ; XRHO_ZZ=0.9 -XB_0=1.65 ; XBETA_Z=-0.5 ; XBETA_ZZ=0.35 -XANGCONV0=0. ; XANGCONV1000=0. ; XANGCONV2000=0. -CDADATMFILE=' ' ; CDADBOGFILE=' ' -! -CALL INIT_NMLVAR -CALL POSNAM(IPRE_REAL1,'NAM_REAL_CONF',GFOUND,ILUOUT0) -IF (GFOUND) READ(IPRE_REAL1,NAM_REAL_CONF) -CALL POSNAM(IPRE_REAL1,'NAM_HURR_CONF',GFOUND,ILUOUT0) -IF (GFOUND) READ(IPRE_REAL1,NAM_HURR_CONF) -CALL POSNAM(IPRE_REAL1,'NAM_CH_CONF',GFOUND,ILUOUT0) -IF (GFOUND) READ(UNIT=IPRE_REAL1,NML=NAM_CH_CONF) -CALL UPDATE_MODD_FROM_NMLVAR -CALL POSNAM(IPRE_REAL1,'NAM_AERO_CONF',GFOUND,ILUOUT0) -IF (GFOUND) READ(IPRE_REAL1,NAM_AERO_CONF) -CALL POSNAM(IPRE_REAL1,'NAM_CONFZ',GFOUND,ILUOUT0) -IF (GFOUND) READ(UNIT=IPRE_REAL1,NML=NAM_CONFZ) -CALL POSNAM(IPRE_REAL1,'NAM_IBM_LSF' ,GFOUND,ILUOUT0) -IF (GFOUND) READ(UNIT=IPRE_REAL1,NML=NAM_IBM_LSF) -! -! Sea salt -CALL INIT_SALT -! -!* 4.3 set soil scheme to ISBA for initialization from GRIB -! -IF (YATMFILETYPE=='GRIBEX') THEN - CLBCX(:) ='OPEN' - CLBCY(:) ='OPEN' -END IF -! -CALL SECOND_MNH(ZTIME2) -ZMISC = ZTIME2 - ZTIME1 -!------------------------------------------------------------------------------- -! -!* 5. READING OF THE INPUT DATA -! ------------------------- -! -ZTIME1 = ZTIME2 -! -IF (YATMFILETYPE=='MESONH') THEN - CALL READ_ALL_DATA_MESONH_CASE(TZPRE_REAL1FILE,YATMFILE,TPGDFILE,YDAD_NAME) -ELSE IF (YATMFILETYPE=='GRIBEX') THEN - IF(LEN_TRIM(YCHEMFILE)>0 .AND. YCHEMFILETYPE=='GRIBEX')THEN - CALL READ_ALL_DATA_GRIB_CASE('ATM1',TZPRE_REAL1FILE,YATMFILE,TPGDFILE,ZHORI,NVERB,LDUMMY_REAL) - ELSE - CALL READ_ALL_DATA_GRIB_CASE('ATM0',TZPRE_REAL1FILE,YATMFILE,TPGDFILE,ZHORI,NVERB,LDUMMY_REAL) - END IF -! - YDAD_NAME=' ' -END IF -! -IF (NIMAX==1 .AND. NJMAX==1) THEN - L1D=.TRUE. - L2D=.FALSE. -ELSE IF (NJMAX==1) THEN - L1D=.FALSE. - L2D=.TRUE. -ELSE - L1D=.FALSE. - L2D=.FALSE. -END IF -! -! UPG*PT -!* 5.1 reading of the input chemical data -! -!IF(LEN_TRIM(YCHEMFILE)>0)THEN -! ! read again Nam_aero_conf -! CALL POSNAM(IPRE_REAL1,'NAM_AERO_CONF',GFOUND,ILUOUT0) -! IF (GFOUND) READ(IPRE_REAL1,NAM_AERO_CONF) -! IF(YCHEMFILETYPE=='GRIBEX') & -! CALL READ_ALL_DATA_GRIB_CASE('CHEM',TZPRE_REAL1FILE,YCHEMFILE,TPGDFILE,ZHORI,NVERB,LDUMMY_REAL) -! IF (YCHEMFILETYPE=='NETCDF') & -! CALL READ_CHEM_DATA_NETCDF_CASE(TZPRE_REAL1FILE,YCHEMFILE,TPGDFILE,ZHORI,NVERB,LDUMMY_REAL) -!END IF -! -!* 5.2 reading the input CAMS data -! -!IF(LEN_TRIM(YCAMSFILE)>0)THEN -! IF(YCAMSFILETYPE=='NETCDF') THEN -! CALL READ_CAMS_DATA_NETCDF_CASE(TZPRE_REAL1FILE,YCAMSFILE,TPGDFILE,ZHORI,NVERB,LDUMMY_REAL) -! ELSE -! CALL PRINT_MSG(NVERB_FATAL,'GEN','PREP_REAL_CASE','CANNOT READ CAMS GRIB FILES YET') -! END IF -!END IF -!* 5.1 reading CAMS or MACC files for init LIMA -! -IF(LEN_TRIM(YLIMAFILE)>0)THEN - IF(YLIMAFILETYPE=='NETCDF') THEN - CALL READ_LIMA_DATA_NETCDF_CASE(TZPRE_REAL1FILE,YLIMAFILE,TPGDFILE,ZHORI,NVERB,LDUMMY_REAL) - ELSE - WRITE(ILUOUT0,FMT=*) - !callabortstop - CALL PRINT_MSG(NVERB_FATAL,'GEN','PREP_REAL_CASE','Pb in MACC/CAMS file') - STOP - END IF -END IF -! -!* 5.2 reading of the input chemical data + dusts + salts if needed -! -IF(LEN_TRIM(YCHEMFILE)>0)THEN - ! read again Nam_aero_conf - CALL POSNAM(IPRE_REAL1,'NAM_AERO_CONF',GFOUND,ILUOUT0) - IF (GFOUND) READ(IPRE_REAL1,NAM_AERO_CONF) - IF(YCHEMFILETYPE=='GRIBEX') & - CALL READ_ALL_DATA_GRIB_CASE('CHEM',TZPRE_REAL1FILE,YCHEMFILE,TPGDFILE,ZHORI,NVERB,LDUMMY_REAL) - IF (YCHEMFILETYPE=='MOZART') & - CALL READ_CHEM_DATA_MOZART_CASE(TZPRE_REAL1FILE,YCHEMFILE,TPGDFILE,ZHORI,NVERB,LDUMMY_REAL) - IF (YCHEMFILETYPE=='CAMSEU') & - CALL READ_CHEM_DATA_CAMS_CASE(TZPRE_REAL1FILE,YCHEMFILE,TPGDFILE,ZHORI,NVERB, & - LDUMMY_REAL,LUSECHEM) -END IF - -!UPG*PT -! -CALL IO_File_close(TZPRE_REAL1FILE) -! -CALL SECOND_MNH(ZTIME2) -ZREAD = ZTIME2 - ZTIME1 - ZHORI -!------------------------------------------------------------------------------- -! -CALL IO_File_add2list(TINIFILE,CINIFILE,'MNH','WRITE',KLFITYPE=1,KLFIVERB=NVERB) -CALL IO_File_open(TINIFILE) -! -ZTIME1=ZTIME2 -! -!* 6. CONFIGURATION VARIABLES -! ----------------------- -! -!* 6.1 imposed values of some other configuration variables -! -CDCONV='NONE' -CSCONV='NONE' -CRAD='NONE' -CCONF='START' -NRIMX=6 -NRIMY=6 -LHORELAX_UVWTH=.TRUE. -LHORELAX_RV=LUSERV -LHORELAX_RC=LUSERC -LHORELAX_RR=LUSERR -LHORELAX_RI=LUSERI -LHORELAX_RS=LUSERS -LHORELAX_RG=LUSERG -LHORELAX_RH=LUSERH -LHORELAX_SV(:)=.FALSE. -LHORELAX_SVC2R2 = (NSV_C2R2 > 0) -LHORELAX_SVC1R3 = (NSV_C1R3 > 0) -LHORELAX_SVLIMA = (NSV_LIMA > 0) -LHORELAX_SVELEC = (NSV_ELEC > 0) -LHORELAX_SVCHEM = (NSV_CHEM > 0) -LHORELAX_SVCHIC = (NSV_CHIC > 0) -LHORELAX_SVDST = (NSV_DST > 0) -LHORELAX_SVSLT = (NSV_SLT > 0) -LHORELAX_SVAER = (NSV_AER > 0) -LHORELAX_SVPP = (NSV_PP > 0) -#ifdef MNH_FOREFIRE -LHORELAX_SVFF = (NSV_FF > 0) -#endif -LHORELAX_SVCS = (NSV_CS > 0) - -LHORELAX_SVLG = .FALSE. -LHORELAX_SV(1:NSV)=.TRUE. -IF ( CTURB /= 'NONE') THEN - LHORELAX_TKE = .TRUE. -ELSE - LHORELAX_TKE = .FALSE. -END IF -! -! -CSTORAGE_TYPE='TT' -!------------------------------------------------------------------------------- -! -!* 8. COMPUTATION OF GEOMETRIC VARIABLES -! ---------------------------------- -! -ZTIME1 = ZTIME2 -! -ALLOCATE(XMAP(SIZE(XXHAT),SIZE(XYHAT))) -ALLOCATE(XLAT(SIZE(XXHAT),SIZE(XYHAT))) -ALLOCATE(XLON(SIZE(XXHAT),SIZE(XYHAT))) -ALLOCATE(XDXHAT(SIZE(XXHAT))) -ALLOCATE(XDYHAT(SIZE(XYHAT))) -ALLOCATE(XZZ(SIZE(XXHAT),SIZE(XYHAT),SIZE(XZHAT))) -ALLOCATE(ZJ(SIZE(XXHAT),SIZE(XYHAT),SIZE(XZHAT))) -! -IF (LCARTESIAN) THEN - CALL SM_GRIDCART(XXHAT,XYHAT,XZHAT,XZS,LSLEVE,XLEN1,XLEN2,XZSMT,XDXHAT,XDYHAT,XZZ,ZJ) - XMAP=1. -ELSE - CALL SM_GRIDPROJ(XXHAT,XYHAT,XZHAT,XZS, & - LSLEVE,XLEN1,XLEN2,XZSMT,XLATORI,XLONORI, & - XMAP,XLAT,XLON,XDXHAT,XDYHAT,XZZ,ZJ ) -END IF -! -CALL MPPDB_CHECK2D(XZS,"prep_real_case8:XZS",PRECISION) -CALL MPPDB_CHECK2D(XMAP,"prep_real_case8:XMAP",PRECISION) -CALL MPPDB_CHECK2D(XLAT,"prep_real_case8:XLAT",PRECISION) -CALL MPPDB_CHECK2D(XLON,"prep_real_case8:XLON",PRECISION) -CALL MPPDB_CHECK3D(XZZ,"prep_real_case8:XZZ",PRECISION) -CALL MPPDB_CHECK3D(ZJ,"prep_real_case8:ZJ",PRECISION) -! -ALLOCATE(XDXX(SIZE(XXHAT),SIZE(XYHAT),SIZE(XZHAT))) -ALLOCATE(XDYY(SIZE(XXHAT),SIZE(XYHAT),SIZE(XZHAT))) -ALLOCATE(XDZX(SIZE(XXHAT),SIZE(XYHAT),SIZE(XZHAT))) -ALLOCATE(XDZY(SIZE(XXHAT),SIZE(XYHAT),SIZE(XZHAT))) -ALLOCATE(XDZZ(SIZE(XXHAT),SIZE(XYHAT),SIZE(XZHAT))) -! -!20131024 add update halo -!=> corrects on PDXX calculation in metrics and XDXX !! -CALL ADD3DFIELD_ll( TZFIELDS_ll, XZZ, 'PREP_REAL_CASE::XZZ' ) -CALL UPDATE_HALO_ll(TZFIELDS_ll,IINFO_ll) -CALL CLEANLIST_ll(TZFIELDS_ll) -! -CALL METRICS(XMAP,XDXHAT,XDYHAT,XZZ,XDXX,XDYY,XDZX,XDZY,XDZZ) -! -CALL MPPDB_CHECK3D(XDXX,"prc8-beforeupdate_metrics:PDXX",PRECISION) -CALL MPPDB_CHECK3D(XDYY,"prc8-beforeupdate_metrics:PDYY",PRECISION) -CALL MPPDB_CHECK3D(XDZX,"prc8-beforeupdate_metrics:PDZX",PRECISION) -CALL MPPDB_CHECK3D(XDZY,"prc8-beforeupdate_metrics:PDZY",PRECISION) -! -CALL UPDATE_METRICS(CLBCX,CLBCY,XDXX,XDYY,XDZX,XDZY,XDZZ) -! -!20131112 add update_halo for XDYY and XDZY!! -CALL ADD3DFIELD_ll( TZFIELDS_ll, XDXX, 'PREP_REAL_CASE::XDXX' ) -CALL ADD3DFIELD_ll( TZFIELDS_ll, XDZX, 'PREP_REAL_CASE::XDZX' ) -CALL ADD3DFIELD_ll( TZFIELDS_ll, XDYY, 'PREP_REAL_CASE::XDYY' ) -CALL ADD3DFIELD_ll( TZFIELDS_ll, XDZY, 'PREP_REAL_CASE::XDZY' ) -CALL UPDATE_HALO_ll(TZFIELDS_ll,IINFO_ll) -CALL CLEANLIST_ll(TZFIELDS_ll) - -!CALL EXTRAPOL('W',XDXX,XDZX) -!CALL EXTRAPOL('S',XDYY,XDZY) - -CALL SECOND_MNH(ZTIME2) - -ZMISC = ZMISC + ZTIME2 - ZTIME1 -!------------------------------------------------------------------------------- -! -!* 9. PREPARATION OF THE VERTICAL SHIFT AND INTERPOLATION -! --------------------------------------------------- -! -ZTIME1 = ZTIME2 -! -IF (YATMFILETYPE=='GRIBEX') THEN - CALL VER_PREP_GRIBEX_CASE('ATM ',ZDG) -ELSE IF (YATMFILETYPE=='MESONH') THEN - CALL VER_PREP_MESONH_CASE(ZDG) -END IF -! -IF (LEN_TRIM(YCHEMFILE)>0 .AND. YCHEMFILETYPE=='GRIBEX') THEN - CALL VER_PREP_GRIBEX_CASE('CHEM',ZDG) -END IF -!UPG*PT -!IF ((LEN_TRIM(YCHEMFILE)>0 .AND. YCHEMFILETYPE=='NETCDF') .OR. & -! (LEN_TRIM(YCAMSFILE)>0 .AND. YCAMSFILETYPE=='NETCDF')) THEN -! CALL VER_PREP_NETCDF_CASE(ZDG) -!END IF -IF (LEN_TRIM(YCHEMFILE)>0 .AND. ((YCHEMFILETYPE=='MOZART').OR. & - (YCHEMFILETYPE=='CAMSEU'))) THEN - CALL VER_PREP_NETCDF_CASE(ZDG,XSV_LS) - - DEALLOCATE(XSV_LS) -END IF -! -IF (LEN_TRIM(YLIMAFILE)>0 .AND. YLIMAFILETYPE=='NETCDF') THEN - CALL VER_PREP_NETCDF_CASE(ZDG,XSV_LS_LIMA) - DEALLOCATE(XSV_LS_LIMA) -END IF -!UPG*PT -! -CALL SECOND_MNH(ZTIME2) -ZPREP = ZTIME2 - ZTIME1 - ZDG -ZDIAG = ZDIAG + ZDG -!------------------------------------------------------------------------------- -! -!* 10. VERTICAL INTERPOLATION OF ALL THERMODYNAMICAL VARIABLES -! ------------------------------------------------------- -! -ZTIME1 = ZTIME2 -! -ALLOCATE(XPSURF(SIZE(XXHAT),SIZE(XYHAT))) -! -CALL EXTRAPOL('E',XEXNTOP2D) -IF (YATMFILETYPE=='GRIBEX') THEN - CALL VER_THERMO(TINIFILE,LSHIFT,XTHV_MX,XR_MX,XZS_LS,XZSMT_LS,XZMASS_MX,XZFLUX_MX,XPMHP_MX,ZJ, & - XDXX,XDYY,XEXNTOP2D,XPSURF,ZDG ) -ELSE IF (YATMFILETYPE=='MESONH') THEN - CALL VER_THERMO(TINIFILE,LSHIFT,XTHV_MX,XR_MX,XZS_LS,XZSMT_LS,XZMASS_MX,XZFLUX_MX,XPMHP_MX,ZJ, & - XDXX,XDYY,XEXNTOP2D,XPSURF,ZDG, & - XLSTH_MX,XLSRV_MX ) -END IF -! -CALL SECOND_MNH(ZTIME2) -ZTHERMO = ZTIME2 - ZTIME1 - ZDG -ZDIAG = ZDIAG + ZDG -!------------------------------------------------------------------------------- -! -!* 12. VERTICAL INTERPOLATION OF DYNAMICAL VARIABLES -! --------------------------------------------- -! -ZTIME1 = ZTIME2 -IF (YATMFILETYPE=='GRIBEX') THEN - CALL VER_DYN(LSHIFT,XU_MX,XV_MX,XW_MX,XRHOD_MX,XZFLUX_MX,XZMASS_MX,XZS_LS, & - XDXX,XDYY,XDZZ,XDZX,XDZY,ZJ,YATMFILETYPE ) -ELSE IF (YATMFILETYPE=='MESONH') THEN - CALL VER_DYN(LSHIFT,XU_MX,XV_MX,XW_MX,XRHOD_MX,XZFLUX_MX,XZMASS_MX,XZS_LS, & - XDXX,XDYY,XDZZ,XDZX,XDZY,ZJ,YATMFILETYPE, & - XLSU_MX,XLSV_MX,XLSW_MX ) -END IF -! -! -IF (ALLOCATED(XTHV_MX)) DEALLOCATE(XTHV_MX) -IF (ALLOCATED(XR_MX)) DEALLOCATE(XR_MX) -IF (ALLOCATED(XPMHP_MX)) DEALLOCATE(XPMHP_MX) -IF (ALLOCATED(XU_MX)) DEALLOCATE(XU_MX) -IF (ALLOCATED(XV_MX)) DEALLOCATE(XV_MX) -IF (ALLOCATED(XW_MX)) DEALLOCATE(XW_MX) -IF (ALLOCATED(XLSTH_MX)) DEALLOCATE(XLSTH_MX) -IF (ALLOCATED(XLSRV_MX)) DEALLOCATE(XLSRV_MX) -IF (ALLOCATED(XLSU_MX)) DEALLOCATE(XLSU_MX) -IF (ALLOCATED(XLSV_MX)) DEALLOCATE(XLSV_MX) -IF (ALLOCATED(XLSW_MX)) DEALLOCATE(XLSW_MX) -IF (ALLOCATED(XZFLUX_MX)) DEALLOCATE(XZFLUX_MX) -IF (ALLOCATED(XZMASS_MX)) DEALLOCATE(XZMASS_MX) -IF (ALLOCATED(XRHOD_MX)) DEALLOCATE(XRHOD_MX) -IF (ALLOCATED(XEXNTOP2D)) DEALLOCATE(XEXNTOP2D) -IF (ALLOCATED(XZS_LS)) DEALLOCATE(XZS_LS) -IF (ALLOCATED(XZSMT_LS)) DEALLOCATE(XZSMT_LS) -! -!------------------------------------------------------------------------------- -! -!* 13. ANELASTIC CORRECTION -! -------------------- -! -CALL PRESSURE_IN_PREP(XDXX,XDYY,XDZX,XDZY,XDZZ) -! -CALL SECOND_MNH(ZTIME2) -ZDYN = ZTIME2 - ZTIME1 -! -!------------------------------------------------------------------------------- -! -!* 14. INITIALIZATION OF THE REMAINING PROGNOSTIC VARIABLES (COPIES) -! ------------------------------------------------------------- -! -ZTIME1 = ZTIME2 -! -IF(LEN_TRIM(YCHEMFILE)>0 .AND. YCHEMFILETYPE=='MESONH')THEN - CALL INI_PROG_VAR(XTKE_MX,XSV_MX,YCHEMFILE) - LHORELAX_SVCHEM = (NSV_CHEM > 0) - LHORELAX_SVCHIC = (NSV_CHIC > 0) - LHORELAX_SVDST = (NSV_DST > 0) - LHORELAX_SVSLT = (NSV_SLT > 0) - LHORELAX_SVAER = (NSV_AER > 0) -ELSE -! -!UPG*PT -!IF (LEN_TRIM(YCAMSFILE)>0 .AND. YCAMSFILETYPE=='NETCDF') THEN -IF (LEN_TRIM(YLIMAFILE)>0 .AND. YLIMAFILETYPE=='NETCDF') THEN -!UPG*PT - CALL LIMA_MIXRAT_TO_NCONC(XPABST, XTHT, XRT(:,:,:,1), XSV_MX) -END IF -! - CALL INI_PROG_VAR(XTKE_MX,XSV_MX) -END IF -! - -! Initialization of ORILAM variables -IF (LORILAM) THEN - IF (.NOT.(ASSOCIATED(XN3D))) ALLOCATE(XN3D(SIZE(XSVT,1),SIZE(XSVT,2),SIZE(XSVT,3),JPMODE)) - IF (.NOT.(ASSOCIATED(XRG3D))) ALLOCATE(XRG3D(SIZE(XSVT,1),SIZE(XSVT,2),SIZE(XSVT,3),JPMODE)) - IF (.NOT.(ASSOCIATED(XSIG3D))) ALLOCATE(XSIG3D(SIZE(XSVT,1),SIZE(XSVT,2),SIZE(XSVT,3),JPMODE)) - IF (.NOT.(ASSOCIATED(XRHOP3D))) ALLOCATE(XRHOP3D(SIZE(XSVT,1),SIZE(XSVT,2),SIZE(XSVT,3),JPMODE)) - IF (.NOT.(ASSOCIATED(XM3D))) ALLOCATE(XM3D(SIZE(XSVT,1),SIZE(XSVT,2),SIZE(XSVT,3),JPMODE*3)) - IF (.NOT.(ASSOCIATED(XCTOTA3D))) & - ALLOCATE(XCTOTA3D(SIZE(XSVT,1),SIZE(XSVT,2),SIZE(XSVT,3),NSP+NCARB+NSOA,JPMODE)) - - CALL CH_AER_EQM_INIT_n(XSVT(:,:,:,NSV_CHEMBEG:NSV_CHEMEND),& - XSVT(:,:,:,NSV_AERBEG:NSV_AEREND),& - XM3D,XRHOP3D,XSIG3D,& - XRG3D,XN3D, XRHODREF, XCTOTA3D) -END IF -! -! Initialization LIMA variables by ORILAM -IF (CCLOUD == 'LIMA' .AND. ((LORILAM).OR.(LDUST).OR.(LSALT))) THEN - - ! Init LIMA by ORILAM - CALL AER2LIMA(XSVT, XRHODREF, XRT(:,:,:,1), XPABST, XTHT,XZZ) - - ! Init LB LIMA by ORILAM - ALLOCATE(ZLBXRHO(SIZE(XLBXSVM,1), SIZE(XLBXSVM,2), SIZE(XLBXSVM,3))) - ALLOCATE(ZLBYRHO(SIZE(XLBYSVM,1), SIZE(XLBYSVM,2), SIZE(XLBYSVM,3))) - ALLOCATE(ZLBXPABST(SIZE(XLBXSVM,1), SIZE(XLBXSVM,2), SIZE(XLBXSVM,3))) - ALLOCATE(ZLBYPABST(SIZE(XLBYSVM,1), SIZE(XLBYSVM,2), SIZE(XLBYSVM,3))) - ALLOCATE(ZLBXZZ(SIZE(XLBXSVM,1), SIZE(XLBXSVM,2), SIZE(XLBXSVM,3))) - ALLOCATE(ZLBYZZ(SIZE(XLBYSVM,1), SIZE(XLBYSVM,2), SIZE(XLBYSVM,3))) - - ILBX=SIZE(XLBXSVM,1)/2-JPHEXT - ILBY=SIZE(XLBYSVM,2)/2-JPHEXT - - CALL GET_INDICE_ll (IIB,IJB,IIE,IJE) - - ZLBXRHO(1:ILBX+1,:,:) = XRHODREF(IIB-1:IIB-1+ILBX,:,:) - ZLBXRHO(ILBX+2:2*ILBX+2,:,:) = XRHODREF(IIE+1-ILBX:IIE+1,:,:) - ZLBYRHO(:,1:ILBY+1,:) = XRHODREF(:,IJB-1:IJB-1+ILBY,:) - ZLBYRHO(:,ILBY+2:2*ILBY+2,:) = XRHODREF(:,IJE+1-ILBY:IJE+1,:) - ZLBXPABST(1:ILBX+1,:,:) = XPABST(IIB-1:IIB-1+ILBX,:,:) - ZLBXPABST(ILBX+2:2*ILBX+2,:,:) = XPABST(IIE+1-ILBX:IIE+1,:,:) - ZLBYPABST(:,1:ILBY+1,:) = XPABST(:,IJB-1:IJB-1+ILBY,:) - ZLBYPABST(:,ILBY+2:2*ILBY+2,:) = XPABST(:,IJE+1-ILBY:IJE+1,:) - ZLBXZZ(1:ILBX+1,:,:) = XZZ(IIB-1:IIB-1+ILBX,:,:) - ZLBXZZ(ILBX+2:2*ILBX+2,:,:) = XZZ(IIE+1-ILBX:IIE+1,:,:) - ZLBYZZ(:,1:ILBY+1,:) = XZZ(:,IJB-1:IJB-1+ILBY,:) - ZLBYZZ(:,ILBY+2:2*ILBY+2,:) = XZZ(:,IJE+1-ILBY:IJE+1,:) - - CALL AER2LIMA(XLBXSVM, ZLBXRHO, XLBXRM(:,:,:,1), ZLBXPABST, XLBXTHM, ZLBXZZ) - CALL AER2LIMA(XLBYSVM, ZLBYRHO, XLBYRM(:,:,:,1), ZLBYPABST, XLBYTHM, ZLBYZZ) - - DEALLOCATE(ZLBXRHO) - DEALLOCATE(ZLBYRHO) - DEALLOCATE(ZLBXPABST) - DEALLOCATE(ZLBYPABST) - DEALLOCATE(ZLBXZZ) - DEALLOCATE(ZLBYZZ) - -END IF -! -IF (ALLOCATED(XSV_MX)) DEALLOCATE(XSV_MX) -IF (ALLOCATED(XTKE_MX)) DEALLOCATE(XTKE_MX) -! -CALL BOUNDARIES ( & - 0.,CLBCX,CLBCY,NRR,NSV,1, & - XLBXUM,XLBXVM,XLBXWM,XLBXTHM,XLBXTKEM,XLBXRM,XLBXSVM, & - XLBYUM,XLBYVM,XLBYWM,XLBYTHM,XLBYTKEM,XLBYRM,XLBYSVM, & - XLBXUM,XLBXVM,XLBXWM,XLBXTHM,XLBXTKEM,XLBXRM,XLBXSVM, & - XLBYUM,XLBYVM,XLBYWM,XLBYTHM,XLBYTKEM,XLBYRM,XLBYSVM, & - XRHODJ,XRHODREF, & - XUT, XVT, XWT, XTHT, XTKET, XRT, XSVT, XSRCT ) -! -CALL SECOND_MNH(ZTIME2) -ZMISC = ZMISC + ZTIME2 - ZTIME1 -! -!------------------------------------------------------------------------------- -! -!* 15. Error on temperature during interpolations -! ------------------------------------------ -! -ZTIME1 = ZTIME2 -! -IF (YATMFILETYPE=='GRIBEX' .AND. NVERB>1) THEN - CALL ERROR_ON_TEMPERATURE(XT_LS,XPMASS_LS,XPABST,XPS_LS,XPSURF) -END IF -! -IF (YATMFILETYPE=='GRIBEX') THEN - DEALLOCATE(XT_LS) - DEALLOCATE(XPMASS_LS) - DEALLOCATE(XPS_LS) -END IF -! -IF (ALLOCATED(XPSURF)) DEALLOCATE(XPSURF) -! -CALL SECOND_MNH(ZTIME2) -ZDIAG = ZDIAG + ZTIME2 - ZTIME1 -!------------------------------------------------------------------------------- -! -!* 16. INITIALIZE LEVELSET FOR IBM -! --------------------------- -! -IF (LIBM_LSF) THEN - ! - IF (.NOT.LCARTESIAN) THEN - CALL PRINT_MSG(NVERB_FATAL,'GEN','PREP_IDEAL_CASE','IBM can only be used with cartesian coordinates') - ENDIF - ! - CALL GET_DIM_EXT_ll('B',NIU,NJU) - NKU=NKMAX+2*JPVEXT - ! - ALLOCATE(XIBM_LS(NIU,NJU,NKU,4)) - ! - CALL IBM_INIT_LS(XIBM_LS) - ! -ENDIF -! -!------------------------------------------------------------------------------- -! -!* 17. WRITING OF THE MESO-NH FM-FILE -! ------------------------------ -! -ZTIME1 = ZTIME2 -! -CSTORAGE_TYPE='TT' -IF (YATMFILETYPE=='GRIBEX') THEN - CSURF = "EXTE" - DO JRR=1,NRR - IF (JRR==1) THEN - LUSERV=.TRUE. - IDX_RVT = JRR - END IF - IF (JRR==2) THEN - LUSERC=.TRUE. - IDX_RCT = JRR - END IF - IF (JRR==3) THEN - LUSERR=.TRUE. - IDX_RRT = JRR - END IF - IF (JRR==4) THEN - LUSERI=.TRUE. - IDX_RIT = JRR - END IF - IF (JRR==5) THEN - LUSERS=.TRUE. - IDX_RST = JRR - END IF - IF (JRR==6) THEN - LUSERG=.TRUE. - IDX_RGT = JRR - END IF - IF (JRR==7) THEN - LUSERH=.TRUE. - IDX_RHT = JRR - END IF - END DO -END IF -! -CALL WRITE_DESFM_n(1,TINIFILE) -CALL IO_Header_write(TINIFILE,HDAD_NAME=YDAD_NAME) -CALL WRITE_LFIFM_n(TINIFILE,YDAD_NAME) -! -CALL SECOND_MNH(ZTIME2) -ZWRITE = ZTIME2 - ZTIME1 -! -!------------------------------------------------------------------------------- -! -!* 18. OROGRAPHIC and DUMMY PHYSIOGRAPHIC FIELDS -! ----------------------------------------- -! -!* reading in the PGD file -! -CALL MNHREAD_ZS_DUMMY_n(TPGDFILE) -! -!* writing in the output file -! -TOUTDATAFILE => TINIFILE -CALL MNHWRITE_ZS_DUMMY_n(TINIFILE) -! -CALL DEALLOCATE_MODEL1(3) -! -IF (YATMFILETYPE=='MESONH'.AND. YATMFILE/=YPGDFILE) THEN - CALL IO_File_find_byname(TRIM(YATMFILE),TZATMFILE,IRESP) - CALL IO_File_close(TZATMFILE) -END IF -!------------------------------------------------------------------------------- -! -!* 19. INTERPOLATION OF SURFACE VARIABLES -! ---------------------------------- -! -IF (.NOT. LCOUPLING ) THEN - ZTIME1 = ZTIME2 -! - IF (CSURF=="EXTE") THEN - IF (YATMFILETYPE/='MESONH') THEN - CALL SURFEX_ALLOC_LIST(1) - YSURF_CUR => YSURF_LIST(1) - CALL READ_ALL_NAMELISTS(YSURF_CUR,'MESONH','PRE',.FALSE.) - ENDIF - CALL GOTO_SURFEX(1) - TFILE_SURFEX => TINIFILE - CALL PREP_SURF_MNH(YSURFFILE,YSURFFILETYPE) - NULLIFY(TFILE_SURFEX) - ENDIF -! - CALL SECOND_MNH(ZTIME2) - ZSURF = ZSURF + ZTIME2 - ZTIME1 -ENDIF -! -!------------------------------------------------------------------------------- -! -!* 20. EPILOGUE -! -------- -! -WRITE(ILUOUT0,*) -WRITE(ILUOUT0,*) -WRITE(ILUOUT0,*) -WRITE(ILUOUT0,*) '**************************************************' -WRITE(ILUOUT0,*) '* PREP_REAL_CASE: PREP_REAL_CASE ends correctly. *' -WRITE(ILUOUT0,*) '**************************************************' -WRITE(ILUOUT0,*) -! -!------------------------------------------------------------------------------- -! -CALL SECOND_MNH (ZEND) -! -ZTOT = ZEND - ZSTART ! for computing time analysis -! -ZALL = ZMISC + ZREAD + ZHORI + ZPREP + ZTHERMO + ZSURF + ZDYN + ZDIAG + ZWRITE -! -WRITE(ILUOUT0,*) -WRITE(ILUOUT0,*) ' ------------------------------------------------------------ ' -WRITE(ILUOUT0,*) '| |' -WRITE(ILUOUT0,*) '| COMPUTING TIME ANALYSIS in PREP_REAL_CASE |' -WRITE(ILUOUT0,*) '| |' -WRITE(ILUOUT0,*) '|------------------------------------------------------------|' -WRITE(ILUOUT0,*) '| | | |' -WRITE(ILUOUT0,*) '| ROUTINE NAME | CPU-TIME | PERCENTAGE % |' -WRITE(ILUOUT0,*) '| | | |' -WRITE(ILUOUT0,*) '|---------------------|-------------------|------------------|' -WRITE(ILUOUT0,*) '| | | |' -WRITE(UNIT=ILUOUT0,FMT=2) ZREAD, 100.*ZREAD/ZTOT -WRITE(UNIT=ILUOUT0,FMT=9) ZHORI, 100.*ZHORI/ZTOT -WRITE(UNIT=ILUOUT0,FMT=3) ZPREP, 100.*ZPREP/ZTOT -WRITE(UNIT=ILUOUT0,FMT=4) ZTHERMO, 100.*ZTHERMO/ZTOT -WRITE(UNIT=ILUOUT0,FMT=6) ZDYN, 100.*ZDYN/ZTOT -WRITE(UNIT=ILUOUT0,FMT=7) ZDIAG, 100.*ZDIAG/ZTOT -WRITE(UNIT=ILUOUT0,FMT=8) ZWRITE, 100.*ZWRITE/ZTOT -WRITE(UNIT=ILUOUT0,FMT=1) ZMISC, 100.*ZMISC/ZTOT -WRITE(UNIT=ILUOUT0,FMT=5) ZSURF, 100.*ZSURF/ZTOT -! -WRITE(UNIT=ILUOUT0,FMT=10) ZTOT , 100.*ZALL/ZTOT -WRITE(ILUOUT0,*) ' ------------------------------------------------------------ ' -! -! FORMATS -! ------- -! -2 FORMAT(' | READING OF DATA | ',F8.3,' | ',F8.3,' |') -9 FORMAT(' | HOR. INTERPOLATIONS | ',F8.3,' | ',F8.3,' |') -3 FORMAT(' | VER_PREP | ',F8.3,' | ',F8.3,' |') -4 FORMAT(' | VER_THERMO | ',F8.3,' | ',F8.3,' |') -6 FORMAT(' | VER_DYN | ',F8.3,' | ',F8.3,' |') -7 FORMAT(' | DIAGNOSTICS | ',F8.3,' | ',F8.3,' |') -8 FORMAT(' | WRITE | ',F8.3,' | ',F8.3,' |') -1 FORMAT(' | MISCELLANEOUS | ',F8.3,' | ',F8.3,' |') -5 FORMAT(' | SURFACE | ',F8.3,' | ',F8.3,' |') -10 FORMAT(' | PREP_REAL_CASE | ',F8.3,' | ',F8.3,' |') -! -!------------------------------------------------------------------------------- -! -IF (LEN_TRIM(YDAD_NAME)>0) THEN - WRITE(ILUOUT0,*) ' ' - WRITE(ILUOUT0,*) ' ------------------------------------------------------------' - WRITE(ILUOUT0,*) '| Nesting allowed |' - WRITE(ILUOUT0,*) '| DAD_NAME="',YDAD_NAME,'" |' - WRITE(ILUOUT0,*) ' ------------------------------------------------------------' - WRITE(ILUOUT0,*) ' ' -ELSE - WRITE(ILUOUT0,*) ' ' - WRITE(ILUOUT0,*) ' ------------------------------------------------------------' - WRITE(ILUOUT0,*) '| Nesting not allowed with a larger-scale model. |' - WRITE(ILUOUT0,*) '| The new file can only be used as model number 1 |' - WRITE(ILUOUT0,*) ' ------------------------------------------------------------' - WRITE(ILUOUT0,*) ' ' -END IF -! -!------------------------------------------------------------------------------- -! -CALL IO_File_close(TINIFILE) -CALL IO_File_close(TPGDFILE) -! -CALL FINALIZE_MNH() -! -!------------------------------------------------------------------------------- -! -CONTAINS - -SUBROUTINE INIT_NMLVAR -CPRESOPT=CPRESOPT_n -LRES=LRES_n -XRES=XRES_n -NITR=NITR_n -LUSECHAQ=LUSECHAQ_n -LUSECHIC=LUSECHIC_n -LUSECHEM=LUSECHEM_n -END SUBROUTINE INIT_NMLVAR - -SUBROUTINE UPDATE_MODD_FROM_NMLVAR -CPRESOPT_n=CPRESOPT -LRES_n=LRES -XRES_n=XRES -NITR_n=NITR -LUSECHAQ_n=LUSECHAQ -LUSECHIC_n=LUSECHIC -LUSECHEM_n=LUSECHEM -END SUBROUTINE UPDATE_MODD_FROM_NMLVAR - -END PROGRAM PREP_REAL_CASE diff --git a/src/mesonh/ext/set_rsou.f90 b/src/mesonh/ext/set_rsou.f90 deleted file mode 100644 index 352af8a53b1efdaca9aa28ef28c9658ef2d27ef5..0000000000000000000000000000000000000000 --- a/src/mesonh/ext/set_rsou.f90 +++ /dev/null @@ -1,1640 +0,0 @@ -!MNH_LIC Copyright 1994-2021 CNRS, Meteo-France and Universite Paul Sabatier -!MNH_LIC This is part of the Meso-NH software governed by the CeCILL-C licence -!MNH_LIC version 1. See LICENSE, CeCILL-C_V1-en.txt and CeCILL-C_V1-fr.txt -!MNH_LIC for details. version 1. -!----------------------------------------------------------------- -! #################### - MODULE MODI_SET_RSOU -! #################### -! -INTERFACE -! - SUBROUTINE SET_RSOU(TPFILE,TPEXPREFILE,HFUNU,HFUNV,KILOC,KJLOC,OBOUSS,& - PJ,OSHIFT,PCORIOZ) -! -USE MODD_IO, ONLY : TFILEDATA -! -TYPE(TFILEDATA), INTENT(IN) :: TPFILE ! outpput data file -TYPE(TFILEDATA), INTENT(IN) :: TPEXPREFILE ! input data file -CHARACTER(LEN=*), INTENT(IN) :: HFUNU ! type of variation of U - ! in y direction -CHARACTER(LEN=*), INTENT(IN) :: HFUNV ! type of variation of V - ! in x direction -INTEGER, INTENT(IN) :: KILOC ! I Localisation of vertical profile -INTEGER, INTENT(IN) :: KJLOC ! J Localisation of vertical profile -LOGICAL, INTENT(IN) :: OBOUSS ! logical switch for Boussinesq version -REAL, DIMENSION(:,:,:), INTENT(IN) :: PJ ! jacobien -LOGICAL, INTENT(IN) :: OSHIFT ! logical switch for vertical shift -! -REAL, DIMENSION(:,:,:), INTENT(OUT), OPTIONAL :: PCORIOZ ! Coriolis parameter - ! (exceptionnaly 3D array) -! -END SUBROUTINE SET_RSOU -! -END INTERFACE -! -END MODULE MODI_SET_RSOU -! -! ######################################################################## - SUBROUTINE SET_RSOU(TPFILE,TPEXPREFILE,HFUNU,HFUNV,KILOC,KJLOC,OBOUSS, & - PJ,OSHIFT,PCORIOZ) -! ######################################################################## -! -!!**** *SET_RSOU * - to initialize mass fiels from a radiosounding -!! -!! PURPOSE -!! ------- -! The purpose of this routine is to initialize the mass field (theta,r, -! thetavrefz,rhorefz) on model grid from a radiosounding located at point -! (KILOC,KJLOC). -! -! The free-formatted part of EXPRE file contains the radiosounding data.The data -! are stored in following order : -! -! - year,month,day, time (these variables are read in PREINIT program) -! - kind of data in EXPRE file (see below for more explanations about -! YKIND) -! - ZGROUND -! - PGROUND -! - temperature variable at ground ( depending on the data Kind ) -! - moist variable at ground ( depending on the data Kind ) -! - number of wind data levels ( variable ILEVELU) -! - height , dd , ff | -! or or | ILEVELU times -! pressure, U , V | -! - number of mass levels ( variable ILEVELM), including the ground -! level -! - height , T , Td | -! or or or | (ILEVELM-1) times -! pressure, THeta_Dry , Mixing Ratio | -! or or | -! THeta_V , relative HUmidity| -! -! NB : the first mass level is at ground -! -! The following kind of data is permitted : -! YKIND = 'STANDARD' : ZGROUND, PGROUND, TGROUND, TDGROUND -! (Pressure, dd, ff) , -! (Pressure, T, Td) -! YKIND = 'PUVTHVMR' : zGROUND, PGROUND, ThvGROUND, RGROUND -! (Pressure, U, V) , -! (Pressure, THv, R) -! YKIND = 'PUVTHVHU' : zGROUND, PGROUND, ThvGROUND, HuGROUND -! (Pressure, U, V) , -! (Pressure, THv, Hu) -! YKIND = 'ZUVTHVHU' : zGROUND, PGROUND, ThvGROUND, HuGROUND -! (height, U, V) , -! (height, THv, Hu) -! YKIND = 'ZUVTHVMR' : zGROUND, PGROUND, ThvGROUND, RGROUND -! (height, U, V) , -! (height, THv, R) -! YKIND = 'PUVTHDMR' : zGROUND, PGROUND, ThdGROUND, RGROUND -! (Pressure, U, V) , -! (Pressure, THd, R) -! YKIND = 'PUVTHDHU' : zGROUND, PGROUND, ThdGROUND, HuGROUND -! (Pressure, U, V) , -! (Pressure, THd, Hu) -! YKIND = 'ZUVTHDMR' : zGROUND, PGROUND, ThdGROUND, -! RGROUND -! (height, U, V) , -! (height, THd, R) -! YKIND = 'PUVTHU' : ZGROUND, PGROUND, TGROUND, HuGROUND -! (Pressure, U, V) , -! (Pressure, T, Hu) -! -! For ocean-LES case the following kind of data is permitted -! -! YKIND = 'IDEALOCE' : ZGROUND (Water depth),PGROUND(Sfc Atmos Press), -! TGROUND (SST), RGROUND (SSS) -! (Depth , U, V) starting from sfc -! (Depth, T, S) -! (Time, LE, H, SW_d,SW_u,LW_d,LW_u,Stress_X,Stress_Y) -! -! YKIND = 'STANDOCE' : (Depth , Temp, Salinity, U, V) starting from sfc -! (Time, LE, H, SW_d,SW_u,LW_d,LW_u,Stress_X,Stress_Y) -! -!!** METHOD -!! ------ -!! The radiosounding is first read, then data are converted in order to -!! always obtain the following variables (case YKIND = 'ZUVTHVMR') : -!! (height,U,V) and (height,Thetav,r) which are the model variables. -!! That is to say : -!! - YKIND = 'STANDARD' : -!! dd,ff converted in U,V -!! Td + pressure ----> r -!! T,r ---> Tv + pressure ----> thetav -!! Pressure + thetav + ZGROUND ----> height (for mass levels) -!! Thetav at mass levels ----> thetav at wind levels -!! Pressure + thetav + ZGROUND + PGROUND ---->height (for wind levels) -!! - YKIND = 'PUVTHVMR' : -!! Pressure + thetav + ZGROUND ----> height (for mass levels) -!! Thetav at mass levels ----> thetav at wind levels -!! Pressure + thetav + ZGROUND + PGROUND ---->height (for wind levels) -!! - YKIND = 'PUVTHVHU' : -!! thetav + pressure ----> Tv +pressure +Hu ----> r -!! Pressure + thetav + ZGROUND ----> height (for mass levels) -!! Thetav at mass levels ----> thetav at wind levels -!! Pressure + thetav + ZGROUND + PGROUND ---->height (for wind levels) -!! - YKIND = 'ZUVTHVHU' : -!! height +thetav + PGROUND -----> pressure (for mass levels) -!! thetav + pressure ----> Tv +pressure +Hu ----> r -!! - YKIND = 'PUVTHDVMR' : -!! thetad + r ----> thetav -!! pressure + thetav + ZGROUND ----> height (for mass levels) -!! Thetav at mass levels ----> thetav at wind levels -!! Pressure + thetav + ZGROUND + PGROUND ---->height (for wind levels) -!! - YKIND = 'PUVTHDHU' : -!! thetad + pressure -----> T -!! T + pressure + Hu -----> r -!! thetad + r -----> thetav -!! pressure + thetav + ZGROUND ----> height (for mass levels) -!! Thetav at mass levels ----> thetav at wind levels -!! Pressure + thetav + ZGROUND + PGROUND ---->height (for wind levels) -!! - YKIND = 'ZUVTHDHU' : -!! thetad + r -----> thetav -!! - YKIND = 'PUVTHU' : -!! T + pressure -----> thetad -!! T + pressure + Hu -----> r -!! thetad + r -----> thetav -!! pressure + thetav + ZGROUND ----> height (for mass levels) -!! Thetav at mass levels ----> thetav at wind levels -!! -!! The following basic formula are used : -!! Rd es(Td) -!! r = -- ---------- -!! Rv P - es(Td) -!! -!! 1 + (Rv/Rd) r -!! Tv = -------------- T -!! 1 + r -!! -!! P00 Rd/Cpd 1 + (Rv/Rd) r -!! Thetav = Tv ( ---- ) = Thetad ( --------------) -!! P 1 + r -!! The integration of hydrostatic relation is used to compute height from -!! pressure and vice-versa. This is done by HEIGHT_PRESS and PRESS_HEIGHT -!! routines. -!! -!! Then, these data are interpolated on a vertical grid which is -!! a mixed grid calaculated with VERT_COORD from the vertical levels of MNH -!! grid and with a constant ororgraphy equal to the altitude of the vertical -!! profile (ZZGROUND) (It permits to keep low levels information with a -!! shifting function (as in PREP_REAL_CASE)) -!! -!! Then, the 3D mass and wind fields are deduced in SET_MASS -!! -!! -!! EXTERNAL -!! -------- -!! SET_MASS : to compute mass field on 3D-model grid -!! Module MODE_THERMO : contains thermodynamic routines -!! SM_FOES : To compute saturation vapor pressure from -!! temperature -!! SM_PMR_HU : to compute vapor mixing ratio from pressure, virtual -!! temperature and relative humidity -!! HEIGHT_PRESS : to compute height from pressure and thetav -!! by integration of hydrostatic relation -!! PRESS_HEIGHT : to compute pressure from height and thetav -!! by integration of hydrostatic relation -!! THETAVPU_THETAVPM : to interpolate thetav on wind levels -!! from thetav on mass levels -!! -!! Module MODI_HEIGHT_PRESS : interface for function HEIGHT_PRESS -!! Module MODI_PRESS_HEIGHT : interface for function PRESS_HEIGHT -!! Module MODI_THETAVPU_THETAVPM : interface for function -!! THETAVPU_THETVPM -!! Module MODI_SET_MASS : interface for subroutine SET_MASS -!! -!! IMPLICIT ARGUMENTS -!! ------------------ -!! Module MODD_CST : contains physical constants -!! XPI : Pi -!! XRV : Gas constant for vapor -!! XRD : Gas constant for dry air -!! XCPD : Specific heat for dry air at constant pressure -!! -!! Module MODD_LUNIT1 : contains logical unit names -!! TLUOUT : name of output-listing -!! -!! Module MODD_CONF : contains configuration variables for all models. -!! NVERB : verbosity level for output-listing -!! -!! Module MODD_GRID1 : contains grid variables -!! XZHAT : height of w-levels of vertical model grid without orography -!! -!! REFERENCE -!! --------- -!! Book2 of MESO-NH documentation (routine SET_RSOU) -!! -!! -!! AUTHOR -!! ------ -!! V. Ducrocq * Meteo France * -!! -!! MODIFICATIONS -!! ------------- -!! Original 25/08/94 -!! J.Stein 06/12/94 change the way to prescribe the horizontal wind -!! variations + cleaning -!! J.Stein 18/01/95 bug corrections in the ILEVELM readings -!! J.Stein 16/04/95 put the same names of the declarative modules -!! in the descriptive part -!! J.Stein 30/01/96 use the RS ground pressure to initialize the -!! hydrostatic pressure computation -!! V.Masson 02/09/96 add allocation of ZTHVU in two cases -!! P.Jabouille 14/02/96 bug in extrapolation of ZMRM below the first level -!! Jabouille/Masson 05/12/02 add ZUVTHLMR case and hydrometeor initialization -!! P.Jabouille 29/10/03 add hydrometeor initialization for ZUVTHDMR case -!! G. Tanguy 26/10/10 change the interpolation of the RS : we use now a -!! mixed grid (PREP_REAL_CASE method) -!! add PUVTHU case -!! V.Masson 12/08/13 Parallelization of the initilization profile -!! J.Escobar : 15/09/2015 : WENO5 & JPHEXT <> 1 -!! Philippe Wautelet: 05/2016-04/2018: new data structures and calls for I/O -! P. Wautelet 19/04/2019: removed unused dummy arguments and variables -! JL Redelsperger 01/2021: Ocean LES cases added -!------------------------------------------------------------------------------- -! -!* 0. DECLARATIONS -! ------------ -! -USE MODD_CONF -USE MODD_CONF_n -USE MODD_CST -USE MODD_NEB, ONLY: NEB -USE MODD_DYN_n, ONLY: LOCEAN -USE MODD_FIELD_n -USE MODD_GRID -USE MODD_GRID_n -USE MODD_LUNIT_n, ONLY: TLUOUT -USE MODD_IO, ONLY: TFILEDATA -USE MODD_NETCDF -USE MODD_OCEANH -USE MODD_PARAMETERS, ONLY: JPHEXT -USE MODD_TYPE_DATE -! -USE MODE_ll -USE MODE_MSG -USE MODE_THERMO -! -USE MODI_COMPUTE_EXNER_FROM_GROUND -USE MODI_HEIGHT_PRESS -USE MODI_PRESS_HEIGHT -USE MODI_SET_MASS -USE MODI_SHUMAN -USE MODI_THETAVPU_THETAVPM -USE MODI_VERT_COORD -! -USE NETCDF ! for reading the NR files -! -IMPLICIT NONE -! -! -!* 0.1 Declarations of arguments : -! -TYPE(TFILEDATA), INTENT(IN) :: TPFILE ! outpput data file -TYPE(TFILEDATA), INTENT(IN) :: TPEXPREFILE ! input data file -CHARACTER(LEN=*), INTENT(IN) :: HFUNU ! type of variation of U - ! in y direction -CHARACTER(LEN=*), INTENT(IN) :: HFUNV ! type of variation of V - ! in x direction -INTEGER, INTENT(IN) :: KILOC ! I Localisation of vertical profile -INTEGER, INTENT(IN) :: KJLOC ! J Localisation of vertical profile -LOGICAL, INTENT(IN) :: OBOUSS ! logical switch for Boussinesq version -LOGICAL, INTENT(IN) :: OSHIFT ! logical switch for vertical shift -REAL, DIMENSION(:,:,:), INTENT(OUT), OPTIONAL :: PCORIOZ ! Coriolis parameter - ! (exceptionnaly 3D array) -REAL, DIMENSION(:,:,:), INTENT(IN) :: PJ ! jacobien -! -! -!* 0.2 Declarations of local variables : -! -INTEGER :: ILUPRE ! logical unit number of the EXPRE return code -INTEGER :: ILUOUT ! Logical unit number for output-listing -! local variables for reading sea sfc flux forcing for ocean model -INTEGER :: IFRCLT -REAL, DIMENSION(:), ALLOCATABLE :: ZSSUFL_T,ZSSVFL_T,ZSSTFL_T,ZSSOLA_T ! -TYPE (DATE_TIME), DIMENSION(:), ALLOCATABLE :: ZFRCLT ! date/time of sea surface forcings -!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! -! variables read in EXPRE file at the RS/CTD levels -!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! -CHARACTER(LEN=8) :: YKIND ! Kind of variables in - ! EXPRE FILE -INTEGER :: ILEVELU ! number of wind levels -REAL, DIMENSION(:), ALLOCATABLE :: ZHEIGHTU ! Height at wind levels -REAL, DIMENSION(:), ALLOCATABLE :: ZPRESSU ! Pressure at wind levels -REAL, DIMENSION(:), ALLOCATABLE :: ZTHVU ! Thetav at wind levels -REAL, DIMENSION(:), ALLOCATABLE :: ZU,ZV ! wind components -REAL, DIMENSION(:), ALLOCATABLE :: ZDD,ZFF ! dd (direction) and ff(force) - ! for wind -REAL :: ZZGROUND,ZPGROUND ! height and Pressure at ground -REAL :: ZTGROUND,ZTHVGROUND,ZTHDGROUND,ZTHLGROUND, & - ZTDGROUND,ZMRGROUND,ZHUGROUND - ! temperature and moisture - ! variables at ground -INTEGER :: ILEVELM ! number of mass levels -REAL, DIMENSION(:), ALLOCATABLE :: ZHEIGHTM ! Height at mass levels -REAL, DIMENSION(:), ALLOCATABLE :: ZPRESSM ! Pressure at mass levels -REAL, DIMENSION(:), ALLOCATABLE :: ZTHV ! Thetav at mass levels -REAL, DIMENSION(:), ALLOCATABLE :: ZTHD ! Theta (dry) at mass levels -REAL, DIMENSION(:), ALLOCATABLE :: ZTHL ! Thetal at mass levels -REAL, DIMENSION(:), ALLOCATABLE :: ZTH ! Theta at mass levels -REAL, DIMENSION(:), ALLOCATABLE :: ZT ! Temperature at mass levels -REAL, DIMENSION(:), ALLOCATABLE :: ZMR ! Vapor mixing ratio at mass levels -REAL, DIMENSION(:), ALLOCATABLE :: ZMRC ! cloud mixing ratio at mass levels -REAL, DIMENSION(:), ALLOCATABLE :: ZMRI ! ice mixing ratio or cloud concentration -REAL, DIMENSION(:), ALLOCATABLE :: ZRT ! total mixing ratio -REAL, DIMENSION(:), ALLOCATABLE :: ZPRESS ! pressure at mass level -REAL, DIMENSION(:), ALLOCATABLE :: ZHU ! relative humidity at mass levels -REAL, DIMENSION(:), ALLOCATABLE :: ZTD ! Td at mass levels -REAL, DIMENSION(:), ALLOCATABLE :: ZTV ! Tv at mass levels -REAL, DIMENSION(:), ALLOCATABLE :: ZEXN -REAL, DIMENSION(:), ALLOCATABLE :: ZCPH -REAL, DIMENSION(:), ALLOCATABLE :: ZLVOCPEXN -REAL, DIMENSION(:), ALLOCATABLE :: ZLSOCPEXN -REAL, DIMENSION(SIZE(XZHAT)) :: ZZFLUX_PROFILE ! altitude of flux points on the initialization columns -REAL, DIMENSION(SIZE(XZHAT)) :: ZZMASS_PROFILE ! altitude of mass points on the initialization columns -! -! fields on the grid of the model without orography -! -REAL, DIMENSION(SIZE(XZHAT)) :: ZUW,ZVW ! Wind at w model grid levels -REAL, DIMENSION(SIZE(XZHAT)) :: ZMRM ! vapor mixing ratio at mass model - !grid levels -REAL, DIMENSION(SIZE(XZHAT)) :: ZMRCM,ZMRIM -REAL, DIMENSION(SIZE(XZHAT)) :: ZTHVM ! Temperature at mass model grid levels -REAL, DIMENSION(SIZE(XZHAT)) :: ZTHLM ! Thetal at mass model grid levels -REAL, DIMENSION(SIZE(XZHAT)) :: ZTHM ! Thetal at mass model grid levels -REAL, DIMENSION(SIZE(XZHAT)) :: ZRHODM ! density at mass model grid level -REAL, DIMENSION(:), ALLOCATABLE :: ZMRT ! Total Vapor mixing ratio at mass levels on mixed grid -REAL, DIMENSION(:), ALLOCATABLE :: ZEXNMASS ! exner fonction at mass level -REAL, DIMENSION(:), ALLOCATABLE :: ZEXNFLUX ! exner fonction at flux level -REAL :: ZEXNSURF ! exner fonction at surface -REAL, DIMENSION(:), ALLOCATABLE :: ZPREFLUX ! pressure at flux model grid level -REAL, DIMENSION(:), ALLOCATABLE :: ZFRAC_ICE ! ice fraction -REAL, DIMENSION(:), ALLOCATABLE :: ZRSATW, ZRSATI -REAL :: ZDZSDH,ZDZ1SDH,ZDZ2SDH ! interpolation - ! working arrays -REAL, DIMENSION(:,:), ALLOCATABLE :: ZBUF -! -INTEGER :: JK,JKLEV,JKU,JKM,JKT,JJ,JI,JO,JLOOP ! Loop indexes -INTEGER :: IKU ! Upper bound in z direction -REAL :: ZRDSCPD,ZRADSDG, & ! Rd/Cpd, Pi/180., - ZRVSRD,ZRDSRV, & ! Rv/Rd, Rd/Rv - ZPTOP ! Pressure at domain top -LOGICAL :: GUSERC ! use of input data cloud -INTEGER :: IIB, IIE, IJB, IJE -INTEGER :: IXOR_ll, IYOR_ll -INTEGER :: IINFO_ll -LOGICAL :: GPROFILE_IN_PROC ! T : initialization profile is in current processor -! -REAL,DIMENSION(SIZE(XXHAT),SIZE(XYHAT)) ::ZZS_LS -REAL,DIMENSION(SIZE(XXHAT),SIZE(XYHAT),SIZE(XZHAT)) ::ZZFLUX_MX,ZZMASS_MX ! mixed grid -!------------------------------------------------------------------------------- -! For standard ocean version, reading external files -CHARACTER(LEN=256) :: yinfile, yinfisf ! files to be read -INTEGER :: IDX -INTEGER(KIND=CDFINT) :: INZ, INLATI, INLONGI -INTEGER(KIND=CDFINT) :: incid, ivarid, idimid, idimlen -REAL, DIMENSION(:,:,:), ALLOCATABLE :: ZOC_TEMPERATURE,ZOC_SALINITY,ZOC_U,ZOC_V -REAL, DIMENSION(:), ALLOCATABLE :: ZOC_DEPTH -REAL, DIMENSION(:), ALLOCATABLE :: ZOC_LE,ZOC_H -REAL, DIMENSION(:), ALLOCATABLE :: ZOC_SW_DOWN,ZOC_SW_UP,ZOC_LW_DOWN,ZOC_LW_UP -REAL, DIMENSION(:), ALLOCATABLE :: ZOC_TAUX,ZOC_TAUY - -!-------------------------------------------------------------------------------- -! -!* 1. PROLOGUE : INITIALIZE SOME CONSTANTS, RETRIEVE LOGICAL -! UNIT NUMBERS AND READ KIND OF DATA IN EXPRE FILE -! ------------------------------------------------------- -! -CALL GET_INDICE_ll(IIB,IJB,IIE,IJE) -CALL GET_OR_ll('B',IXOR_ll,IYOR_ll) -! -!* 1.1 initialize some constants -! -ZRDSCPD = XRD / XCPD -ZRADSDG = XPI/180. -ZRVSRD = XRV/XRD -ZRDSRV = XRD/XRV -! -!* 1.2 Retrieve logical unit numbers -! -ILUPRE = TPEXPREFILE%NLU -ILUOUT = TLUOUT%NLU -! -!* 1.3 Read data kind in EXPRE file -! -READ(ILUPRE,*) YKIND -WRITE(ILUOUT,*) 'YKIND read in set_rsou: ', YKIND -! -IF(LUSERC .AND. YKIND/='PUVTHDMR' .AND. YKIND/='ZUVTHDMR' .AND. YKIND/='ZUVTHLMR') THEN - CALL PRINT_MSG(NVERB_FATAL,'GEN','SET_RSOU','hydrometeors are not allowed for YKIND = '//trim(YKIND)) -ENDIF -! -IF(YKIND=='ZUVTHLMR' .AND. .NOT. LUSERC) THEN -!callabortstop - CALL PRINT_MSG(NVERB_FATAL,'GEN','SET_RSOU','LUSERC=T is required for YKIND=ZUVTHLMR') -ENDIF -! -GUSERC=.FALSE. -IF(LUSERC .AND. (YKIND == 'PUVTHDMR' .OR. YKIND == 'ZUVTHDMR')) GUSERC=.TRUE. -!------------------------------------------------------------------------------- -! -!* 2. READ DATA AND CONVERT IN (height,U,V), (height,Thetav,r) -! -------------------------------------------------------- -! -SELECT CASE(YKIND) -! -! 2.0.1 Ocean case 1 -! - CASE ('IDEALOCE') -! - XP00=XP00OCEAN - ! Read data in PRE_IDEA1.nam - ! Surface - WRITE(ILUOUT,FMT=*) 'Reading data for ideal ocean :IDEALOCE' - READ(ILUPRE,*) ZPTOP ! P_atmosphere at sfc =P top domain - READ(ILUPRE,*) ZTGROUND ! SST - READ(ILUPRE,*) ZMRGROUND ! SSS - WRITE(ILUOUT,FMT=*) 'Patm SST SSS', ZPTOP,ZTGROUND,ZMRGROUND - READ(ILUPRE,*) ILEVELU ! Read number of Current levels - ! Allocate required memory - ALLOCATE(ZHEIGHTU(ILEVELU),ZU(ILEVELU),ZV(ILEVELU)) - ALLOCATE(ZOC_U(ILEVELU,1,1),ZOC_V(ILEVELU,1,1)) - WRITE(ILUOUT,FMT=*) 'Level number for Current in data', ILEVELU - ! Read U and V at each wind level - DO JKU = 1,ILEVELU - READ(ILUPRE,*) ZHEIGHTU(JKU),ZOC_U(JKU,1,1),ZOC_V(JKU,1,1) - ! WRITE(ILUOUT,FMT=*) 'Leveldata D(m) under sfc: U_cur, V_cur', JKU, ZHEIGHTU(JKU),ZU(JKU),ZV(JKU) - END DO - DO JKU=1,ILEVELU - ! Z axis reoriented as in the model - IDX = ILEVELU-JKU+1 - ZU(JKU) = ZOC_U(IDX,1,1) - ZV(JKU) = ZOC_V(IDX,1,1) - ! ZHEIGHT used only in set_ rsou, defined as such ZHEIGHT(ILEVELM)=H_model - ! Z oriented in same time to have a model domain axis going - ! from 0m (ocean bottom/model bottom) towards H (ocean sfc/model top) - END DO - ! Read number of mass levels - READ(ILUPRE,*) ILEVELM - ! Allocate required memory - ALLOCATE(ZOC_DEPTH(ILEVELM)) - ALLOCATE(ZHEIGHTM(ILEVELM)) - ALLOCATE(ZTHL(ILEVELM),ZTH(ILEVELM),ZTHV(ILEVELM)) - ALLOCATE(ZMR(ILEVELM),ZRT(ILEVELM)) - ALLOCATE(ZOC_TEMPERATURE(ILEVELM,1,1),ZOC_SALINITY(ILEVELM,1,1)) - ! Read T and S at each mass level - DO JKM= 2,ILEVELM - READ(ILUPRE,*) ZOC_DEPTH(JKM),ZOC_TEMPERATURE(JKM,1,1),ZOC_SALINITY(JKM,1,1) - END DO - ! Complete the mass arrays with the ground informations read in EXPRE file - ZOC_DEPTH(1) = 0. - ZOC_TEMPERATURE(1,1,1)= ZTGROUND - ZOC_SALINITY(1,1,1)= ZMRGROUND - !!!!!!!!!!!!!!!!!!!!!!!!Inversing Axis!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! - ! Going from the data (axis downward i.e inverse model) grid to the model grid (axis upward) - ! Uniform bathymetry; depth goes from ocean sfc downwards (data grid) - ! ZHEIGHT goes from the model domain bottom up to the sfc ocean (top of model domain) - !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! - ZZGROUND = 0. - ZTGROUND = ZOC_TEMPERATURE(ILEVELM,1,1) - ZMRGROUND = ZOC_SALINITY(ILEVELM,1,1) - DO JKM= 1,ILEVELM - ! Z upward axis (oriented as in the model), i.e. - ! going from 0m (ocean bottom/model bottom) upward to H (ocean sfc/model top) - ! ZHEIGHT used only in set_ rsou, defined as such ZHEIGHT(ILEVELM)=H_model - IDX = ILEVELM-JKM+1 - ZTH(JKM) = ZOC_TEMPERATURE(IDX,1,1) - ZMR(JKM) = ZOC_SALINITY(IDX,1,1) - ZHEIGHTM(JKM)= ZOC_DEPTH(ILEVELM)- ZOC_DEPTH(IDX) - WRITE(ILUOUT,FMT=*) 'Model oriented initial data: JKM IDX depth T S ZHEIGHTM', & - JKM,IDX,ZOC_DEPTH(IDX),ZTH(JKM),ZMR(JKM),ZHEIGHTM(JKM) - END DO - ! mass levels of the RS - ZTHV = ZTH ! TV==THETA=TL - ZTHL = ZTH - ZRT = ZMR - !!!!!!!!!!!!!!!!!!!!!!!!!!!! - ! READ Sea Surface Forcing ! - !!!!!!!!!!!!!!!!!!!!!!!!!!!! - ! Reading the forcings from prep_idea1.nam - READ(ILUPRE,*) IFRCLT ! Number of time-dependent forcing - IF (IFRCLT > 99*8) THEN - ! CAUTION: number of forcing times is limited by the WRITE format 99(8E10.3) - ! and also by the name of forcing variables (format I3.3) - ! You have to modify those if you need more forcing times - CALL PRINT_MSG(NVERB_FATAL,'IO','SET_RSOU','maximum forcing times NFRCLT is 99*8') - END IF -! - WRITE(UNIT=ILUOUT,FMT='(" THERE ARE ",I2," SFC FLUX FORCINGs AT:")') IFRCLT - ALLOCATE(ZFRCLT(IFRCLT)) - ALLOCATE(ZSSUFL_T(IFRCLT)); ZSSUFL_T = 0.0 - ALLOCATE(ZSSVFL_T(IFRCLT)); ZSSVFL_T = 0.0 - ALLOCATE(ZSSTFL_T(IFRCLT)); ZSSTFL_T = 0.0 - ALLOCATE(ZSSOLA_T(IFRCLT)); ZSSOLA_T = 0.0 - DO JKT = 1,IFRCLT - WRITE(ILUOUT,FMT='(A, I4)') "SET_RSOU/Reading Sea Surface forcing: Number=", JKT - READ(ILUPRE,*) ZFRCLT(JKT)%nyear, ZFRCLT(JKT)%nmonth, & - ZFRCLT(JKT)%nday, ZFRCLT(JKT)%xtime - READ(ILUPRE,*) ZSSUFL_T(JKT) - READ(ILUPRE,*) ZSSVFL_T(JKT) - READ(ILUPRE,*) ZSSTFL_T(JKT) - READ(ILUPRE,*) ZSSOLA_T(JKT) - END DO -! - DO JKT = 1 , IFRCLT - WRITE(UNIT=ILUOUT,FMT='(F9.0, "s, date:", I3, "/", I3, "/", I5)') & - ZFRCLT(JKT)%xtime, ZFRCLT(JKT)%nday, & - ZFRCLT(JKT)%nmonth, ZFRCLT(JKT)%nyear - END DO - NINFRT= INT(ZFRCLT(2)%xtime) - WRITE(ILUOUT,FMT='(A)') & - "Number U-Stress, V-Stress, Heat turb Flux, Solar Flux Interval(s)",NINFRT - DO JKT = 1, IFRCLT - WRITE(ILUOUT,FMT='(I10,99(3F10.2))') JKT, ZSSUFL_T(JKT),ZSSVFL_T(JKT),ZSSTFL_T(JKT) - END DO - NFRCLT = IFRCLT - ALLOCATE(TFRCLT(NFRCLT)) - ALLOCATE(XSSUFL_T(NFRCLT));XSSUFL_T(:)=0. - ALLOCATE(XSSVFL_T(NFRCLT));XSSVFL_T(:)=0. - ALLOCATE(XSSTFL_T(NFRCLT));XSSTFL_T(:)=0. - ALLOCATE(XSSOLA_T(NFRCLT));XSSOLA_T(:)=0. -! - DO JKT=1,NFRCLT - TFRCLT(JKT)= ZFRCLT(JKT) - XSSUFL_T(JKT)=ZSSUFL_T(JKT)/XRH00OCEAN - XSSVFL_T(JKT)=ZSSVFL_T(JKT)/XRH00OCEAN - ! working in SI - XSSTFL_T(JKT)=ZSSTFL_T(JKT) /(3900.*XRH00OCEAN) - XSSOLA_T(JKT)=ZSSOLA_T(JKT) /(3900.*XRH00OCEAN) - END DO - DEALLOCATE(ZFRCLT) - DEALLOCATE(ZSSUFL_T) - DEALLOCATE(ZSSVFL_T) - DEALLOCATE(ZSSTFL_T) - DEALLOCATE(ZSSOLA_T) -! -!-------------------------------------------------------------------------------- -! 2.0.2 Ocean standard initialize from netcdf files -! U,V,T,S at Z levels + Forcings at model TOP (sea surface) -!-------------------------------------------------------------------------------- -! - CASE ('STANDOCE') -! - XP00=XP00OCEAN - READ(ILUPRE,*) ZPTOP ! P_atmosphere at sfc =P top domain - READ(ILUPRE,*) YINFILE, YINFISF - WRITE(ILUOUT,FMT=*) 'Netcdf files to read:', YINFILE, YINFISF - ! Open file containing initial profiles - CALL check(nf90_open(yinfile,NF90_NOWRITE,incid), "opening NC file") - ! Reading dimensions and lengths - CALL check( nf90_inq_dimid(incid, "depth",idimid), "getting depth dimension id" ) - CALL check( nf90_inquire_dimension(incid, idimid, len=INZ), "getting INZ" ) - CALL check( nf90_inquire_dimension(incid, INT(2,KIND=CDFINT), len=INLONGI), "getting NLONG" ) - CALL check( nf90_inquire_dimension(incid, INT(1,KIND=CDFINT), len=INLATI), "getting NLAT" ) -! - WRITE(ILUOUT,FMT=*) 'NB LEVLS READ INZ, NLONG NLAT ', INZ, INLONGI,INLATI - ALLOCATE(ZOC_TEMPERATURE(INLATI,INLONGI,INZ),ZOC_SALINITY(INLATI,INLONGI,INZ)) - ALLOCATE(ZOC_U(INLATI,INLONGI,INZ),ZOC_V(INLATI,INLONGI,INZ)) - ALLOCATE(ZOC_DEPTH(INZ)) - WRITE(ILUOUT,FMT=*) 'NETCDF READING ==> Temp' - CALL check(nf90_inq_varid(incid,"temperature",ivarid), "getting temp ivarid") - CALL check(nf90_get_var(incid,ivarid,ZOC_TEMPERATURE), "reading temp") - WRITE(ILUOUT,FMT=*) 'Netcdf Reading ==> salinity' - CALL check(nf90_inq_varid(incid,"salinity",ivarid), "getting salinity ivarid") - CALL check(nf90_get_var(incid,ivarid,ZOC_SALINITY), "reading salinity") - WRITE(ILUOUT,FMT=*) 'Netcdf ==> Reading depth' - CALL check(nf90_inq_varid(incid,"depth",ivarid), "getting depth ivarid") - CALL check(nf90_get_var(incid,ivarid,ZOC_DEPTH), "reading depth") - WRITE(ILUOUT,FMT=*) 'depth: max min ', MAXVAL(ZOC_DEPTH),MINVAL(ZOC_DEPTH) - WRITE(ILUOUT,FMT=*) 'depth 1 nz: ', ZOC_DEPTH(1),ZOC_DEPTH(INZ) - WRITE(ILUOUT,FMT=*) 'Netcdf Reading ==> Currents' - CALL check(nf90_inq_varid(incid,"u",ivarid), "getting u ivarid") - CALL check(nf90_get_var(incid,ivarid,ZOC_U), "reading u") - CALL check(nf90_inq_varid(incid,"v",ivarid), "getting v ivarid") - CALL check(nf90_get_var(incid,ivarid,ZOC_V), "reading v") - CALL check(nf90_close(incid), "closing yinfile") - WRITE(ILUOUT,FMT=*) 'End of initial file reading' -! - DO JKM=1,INZ - ZOC_TEMPERATURE(1,1,JKM)=ZOC_TEMPERATURE(1,1,JKM)+273.15 - WRITE(ILUOUT,FMT=*) 'Z T(Kelvin) S(Sverdup) U V K',& - JKM,ZOC_DEPTH(JKM),ZOC_TEMPERATURE(1,1,JKM),ZOC_SALINITY(1,1,JKM),ZOC_U(1,1,JKM),ZOC_V(1,1,JKM), JKM - ENDDO - ! number of data levels - ILEVELM=INZ - ! Model bottom - ZTGROUND = ZOC_TEMPERATURE(1,1,ILEVELM) - ZMRGROUND = ZOC_SALINITY(1,1,ILEVELM) - ZZGROUND=0. - ! Allocate required memory - ALLOCATE(ZHEIGHTM(ILEVELM)) - ALLOCATE(ZT(ILEVELM)) - ALLOCATE(ZTV(ILEVELM)) - ALLOCATE(ZMR(ILEVELM)) - ALLOCATE(ZTHV(ILEVELM)) - ALLOCATE(ZTHL(ILEVELM)) - ALLOCATE(ZRT(ILEVELM)) - ! Going from the inverse model grid (data) to the normal one - DO JKM= 1,ILEVELM - ! Z axis reoriented as in the model - IDX = ILEVELM-JKM+1 - ZT(JKM) = ZOC_TEMPERATURE(1,1,IDX) - ZMR(JKM) = ZOC_SALINITY(1,1,IDX) - ! ZHEIGHT used only in set_ rsou, defined as such ZHEIGHT(ILEVELM)=H_model - ! Z oriented in same time to have a model domain axis going - ! from 0m (ocean bottom/model bottom) towards H (ocean sfc/model top) - ! translation/inversion - ZHEIGHTM(JKM) = -ZOC_DEPTH(IDX) + ZOC_DEPTH(ILEVELM) - WRITE(ILUOUT,FMT=*) 'End gridmodel comput: JKM IDX depth T S ZHEIGHTM', & - JKM,IDX,ZOC_DEPTH(IDX),ZT(JKM),ZMR(JKM),ZHEIGHTM(JKM) - END DO - ! complete ther variables - ZTV = ZT - ZTHV = ZT - ZRT = ZMR - ZTHL = ZT - ZTH = ZT - ! INIT --- U V ----- - ILEVELU = INZ ! Same nb of levels for u,v,T,S - !Assume that current and temp are given at same level - ALLOCATE(ZHEIGHTU(ILEVELU)) - ALLOCATE(ZU(ILEVELU),ZV(ILEVELU)) - ZHEIGHTU=ZHEIGHTM - DO JKM= 1,ILEVELU - ! Z axis reoriented as in the model - IDX = ILEVELU-JKM+1 - ZU(JKM) = ZOC_U(1,1,IDX) - ZV(JKM) = ZOC_V(1,1,IDX) - ! ZHEIGHT used only in set_ rsou, defined as such ZHEIGHT(ILEVELM)=H_model - ! Z oriented in same time to have a model domain axis going - ! from 0m (ocean bottom/model bottom) towards H (ocean sfc/model top) - END DO -! - DEALLOCATE(ZOC_TEMPERATURE) - DEALLOCATE(ZOC_SALINITY) - DEALLOCATE(ZOC_U) - DEALLOCATE(ZOC_V) - DEALLOCATE(ZOC_DEPTH) -! - ! Reading/initializing surface forcings -! - WRITE(ILUOUT,FMT=*) 'netcdf sfc forcings file to be read:',yinfisf - ! Open of sfc forcing file - CALL check(nf90_open(yinfisf,NF90_NOWRITE,incid), "opening NC file") - ! Reading dimension and length - CALL check( nf90_inq_dimid(incid,"t",idimid), "getting time dimension id" ) - CALL check( nf90_inquire_dimension(incid, idimid, len=idimlen), "getting idimlen " ) -! - WRITE(ILUOUT,FMT=*) 'nb sfc-forcing time idimlen=',idimlen - ALLOCATE(ZOC_LE(idimlen)) - ALLOCATE(ZOC_H(idimlen)) - ALLOCATE(ZOC_SW_DOWN(idimlen)) - ALLOCATE(ZOC_SW_UP(idimlen)) - ALLOCATE(ZOC_LW_DOWN(idimlen)) - ALLOCATE(ZOC_LW_UP(idimlen)) - ALLOCATE(ZOC_TAUX(idimlen)) - ALLOCATE(ZOC_TAUY(idimlen)) -! - WRITE(ILUOUT,FMT=*)'Netcdf Reading ==> LE' - CALL check(nf90_inq_varid(incid,"LE",ivarid), "getting LE ivarid") - CALL check(nf90_get_var(incid,ivarid,ZOC_LE), "reading LE flux") - WRITE(ILUOUT,FMT=*)'Netcdf Reading ==> H' - CALL check(nf90_inq_varid(incid,"H",ivarid), "getting H ivarid") - CALL check(nf90_get_var(incid,ivarid,ZOC_H), "reading H flux") - WRITE(ILUOUT,FMT=*) 'Netcdf Reading ==> SW_DOWN' - CALL check(nf90_inq_varid(incid,"SW_DOWN",ivarid), "getting SW_DOWN ivarid") - CALL check(nf90_get_var(incid,ivarid,ZOC_SW_DOWN), "reading SW_DOWN") - WRITE(ILUOUT,FMT=*) 'Netcdf Reading ==> SW_UP' - CALL check(nf90_inq_varid(incid,"SW_UP",ivarid), "getting SW_UP ivarid") - CALL check(nf90_get_var(incid,ivarid,ZOC_SW_UP), "reading SW_UP") - WRITE(ILUOUT,FMT=*) 'Netcdf Reading ==> LW_DOWN' - CALL check(nf90_inq_varid(incid,"LW_DOWN",ivarid), "getting LW_DOWN ivarid") - CALL check(nf90_get_var(incid,ivarid,ZOC_LW_DOWN), "reading LW_DOWN") - WRITE(ILUOUT,FMT=*) 'Netcdf Reading ==> LW_UP' - CALL check(nf90_inq_varid(incid,"LW_UP",ivarid), "getting LW_UP ivarid") - CALL check(nf90_get_var(incid,ivarid,ZOC_LW_UP), "reading LW_UP") - WRITE(ILUOUT,FMT=*) 'Netcdf Reading ==> TAUX' - CALL check(nf90_inq_varid(incid,"TAUX",ivarid), "getting TAUX ivarid") - CALL check(nf90_get_var(incid,ivarid,ZOC_TAUX), "reading TAUX") - WRITE(ILUOUT,FMT=*) 'Netcdf Reading ==> TAUY' - CALL check(nf90_inq_varid(incid,"TAUY",ivarid), "getting TAUY ivarid") - CALL check(nf90_get_var(incid,ivarid,ZOC_TAUY), "reading TAUY") - CALL check(nf90_close(incid), "closing yinfifs") -! - WRITE(ILUOUT,FMT=*) ' Forcing-Number LE H SW_down SW_up LW_down LW_up TauX TauY' - DO JKM = 1, idimlen - WRITE(ILUOUT,FMT=*) JKM, ZOC_LE(JKM), ZOC_H(JKM),ZOC_SW_DOWN(JKM),ZOC_SW_UP(JKM),& - ZOC_LW_DOWN(JKM),ZOC_LW_UP(JKM),ZOC_TAUX(JKM),ZOC_TAUY(JKM) - ENDDO - ! IFRCLT FORCINGS at sea surface - IFRCLT=idimlen - ALLOCATE(ZFRCLT(IFRCLT)) - ALLOCATE(ZSSUFL_T(IFRCLT)); ZSSUFL_T = 0.0 - ALLOCATE(ZSSVFL_T(IFRCLT)); ZSSVFL_T = 0.0 - ALLOCATE(ZSSTFL_T(IFRCLT)); ZSSTFL_T = 0.0 - ALLOCATE(ZSSOLA_T(IFRCLT)); ZSSOLA_T = 0.0 - DO JKT=1,IFRCLT - ! Initial file for CINDY-DYNAMO: all fluxes correspond to the absolute value (>0) - ! modele ocean: axe z dirigé du bas vers la sfc de l'océan - ! => flux dirigé vers le haut (positif ocean vers l'atmopshere i.e. bas vers le haut) - ZSSOLA_T(JKT)=ZOC_SW_DOWN(JKT)-ZOC_SW_UP(JKT) - ZSSTFL_T(JKT)=(ZOC_LW_DOWN(JKT)-ZOC_LW_UP(JKT)-ZOC_LE(JKT)-ZOC_H(JKT)) - ! assume that Tau given on file is along Ox - ! rho_air UW_air = rho_ocean UW_ocean= N/m2 - ! uw_ocean - ZSSUFL_T(JKT)=ZOC_TAUX(JKT) - ZSSVFL_T(JKT)=ZOC_TAUY(JKT) - WRITE(ILUOUT,FMT=*) 'Forcing Nb Sol NSol UW_oc VW',& - JKT,ZSSOLA_T(JKT),ZSSTFL_T(JKT),ZSSUFL_T(JKT),ZSSVFL_T(JKT) - ENDDO - ! Allocate and Writing the corresponding variables in module MODD_OCEAN_FRC - NFRCLT=IFRCLT - ! value to read later on file ? - NINFRT=600 - ALLOCATE(TFRCLT(NFRCLT)) - ALLOCATE(XSSUFL_T(NFRCLT));XSSUFL_T(:)=0. - ALLOCATE(XSSVFL_T(NFRCLT));XSSVFL_T(:)=0. - ALLOCATE(XSSTFL_T(NFRCLT));XSSTFL_T(:)=0. - ALLOCATE(XSSOLA_T(NFRCLT));XSSOLA_T(:)=0. - ! on passe en unités SI, signe, etc pour le modele ocean - ! W/m2 => SI : /(CP_mer * rho_mer) - ! a revoir dans tt le code pour mettre de svaleurs plus exactes - DO JKT=1,NFRCLT - TFRCLT(JKT)= ZFRCLT(JKT) - XSSUFL_T(JKT)=ZSSUFL_T(JKT)/XRH00OCEAN - XSSVFL_T(JKT)=ZSSVFL_T(JKT)/XRH00OCEAN - XSSTFL_T(JKT)=ZSSTFL_T(JKT) /(3900.*XRH00OCEAN) - XSSOLA_T(JKT)=ZSSOLA_T(JKT) /(3900.*XRH00OCEAN) - END DO - DEALLOCATE(ZFRCLT) - DEALLOCATE(ZSSUFL_T) - DEALLOCATE(ZSSVFL_T) - DEALLOCATE(ZSSTFL_T) - DEALLOCATE(ZSSOLA_T) - DEALLOCATE(ZOC_LE) - DEALLOCATE(ZOC_H) - DEALLOCATE(ZOC_SW_DOWN) - DEALLOCATE(ZOC_SW_UP) - DEALLOCATE(ZOC_LW_DOWN) - DEALLOCATE(ZOC_LW_UP) - DEALLOCATE(ZOC_TAUX) - DEALLOCATE(ZOC_TAUY) - ! END OCEAN STANDARD -! -! -!* 2.1 ATMOSPHERIC STANDARD case : ZGROUND, PGROUND, TGROUND, TDGROUND -! (Pressure, dd, ff) , -! (Pressure, T, Td) -! - CASE ('STANDARD') - - READ(ILUPRE,*) ZZGROUND ! Read data at ground level - READ(ILUPRE,*) ZPGROUND - READ(ILUPRE,*) ZTGROUND - READ(ILUPRE,*) ZTDGROUND -! - READ(ILUPRE,*) ILEVELU ! Read number of wind levels - ALLOCATE(ZPRESSU(ILEVELU)) ! Allocate memory for arrays to be read - ALLOCATE(ZDD(ILEVELU),ZFF(ILEVELU)) - ALLOCATE(ZHEIGHTU(ILEVELU)) ! Allocate memory for needed - ALLOCATE(ZU(ILEVELU),ZV(ILEVELU)) ! arrays - ALLOCATE(ZTHVU(ILEVELU)) ! Allocate memory for intermediate - ! arrays -! - DO JKU = 1,ILEVELU ! Read data at wind levels - READ(ILUPRE,*) ZPRESSU(JKU),ZDD(JKU),ZFF(JKU) - END DO -! - READ(ILUPRE,*) ILEVELM ! Read number of mass levels - ! including the ground level - ALLOCATE(ZPRESSM(ILEVELM)) ! Allocate memory for arrays to be read - ALLOCATE(ZT(ILEVELM)) - ALLOCATE(ZTD(ILEVELM)) - ALLOCATE(ZHEIGHTM(ILEVELM)) ! Allocate memory for needed - ALLOCATE(ZTHV(ILEVELM)) ! arrays - ALLOCATE(ZMR(ILEVELM)) - ALLOCATE(ZTV(ILEVELM)) ! Allocate memory for intermediate arrays - ALLOCATE(ZTHL(ILEVELM)) - ALLOCATE(ZRT(ILEVELM)) -! -! - DO JKM= 2,ILEVELM ! Read data at mass levels - READ(ILUPRE,*) ZPRESSM(JKM),ZT(JKM),ZTD(JKM) - END DO - ZPRESSM(1)=ZPGROUND ! Mass level 1 is at the ground - ZT(1)=ZTGROUND - ZTD(1)=ZTDGROUND -! -! recover the North-South and West-East wind components - ZU(:) = ZFF(:)*COS(ZRADSDG*(270.-ZDD(:)) ) - ZV(:) = ZFF(:)*SIN(ZRADSDG*(270.-ZDD(:)) ) -! -! compute vapor mixing ratio - ZMR(:) = SM_FOES(ZTD(:)) & - / ( (ZPRESSM(:) - SM_FOES(ZTD(:))) * ZRVSRD ) -! -! compute Tv - ZTV(:) = ZT(:) * (1. + ZRVSRD * ZMR(:))/(1.+ZMR(:)) -! -! compute thetav - ZTHV(:) = ZTV(:) * (XP00/ ZPRESSM(:)) **(ZRDSCPD) -! -! compute height at the mass levels of the RS - ZHEIGHTM(:) = HEIGHT_PRESS(ZPRESSM,ZTHV,ZPGROUND,ZTHV(1),ZZGROUND) -! -! compute thetav and height at the wind levels of the RS - ZTHVU(:) = THETAVPU_THETAVPM(ZPRESSM,ZPRESSU,ZTHV) - ZHEIGHTU(:) = HEIGHT_PRESS(ZPRESSU,ZTHVU,ZPGROUND,ZTHV(1),ZZGROUND) -! -! Compute Thetal and Rt - ZRT(:)=ZMR(:) - ZTHL(:)=ZTHV(:)*(1+ZRT(:))/(1+ZRVSRD*ZRT(:)) -! -!* 2.2 PUVTHVMR case : zGROUND, PGROUND, ThvGROUND, RGROUND -! (Pressure, U, V) , -! (Pressure, THv, R) -! - CASE ('PUVTHVMR') -! -! Read data at ground level - READ(ILUPRE,*) ZZGROUND - READ(ILUPRE,*) ZPGROUND - READ(ILUPRE,*) ZTHVGROUND - READ(ILUPRE,*) ZMRGROUND -! -! Read number of wind levels - READ(ILUPRE,*) ILEVELU -! -! Allocate the required memory - ALLOCATE(ZPRESSU(ILEVELU)) - ALLOCATE(ZU(ILEVELU),ZV(ILEVELU)) - ALLOCATE(ZHEIGHTU(ILEVELU)) - ALLOCATE(ZTHVU(ILEVELU)) -! -! Read the data at each wind level of the RS - DO JKU =1,ILEVELU - READ(ILUPRE,*) ZPRESSU(JKU),ZU(JKU),ZV(JKU) - END DO -! -! Read number of mass levels - READ(ILUPRE,*) ILEVELM -! -! Allocate the required memory - ALLOCATE(ZPRESSM(ILEVELM)) - ALLOCATE(ZHEIGHTM(ILEVELM)) - ALLOCATE(ZTHV(ILEVELM)) - ALLOCATE(ZMR(ILEVELM)) - ALLOCATE(ZTHL(ILEVELM)) - ALLOCATE(ZRT(ILEVELM)) -! -! Read the data at each mass level of the RS - DO JKM = 2,ILEVELM - READ(ILUPRE,*) ZPRESSM(JKM),ZTHV(JKM),ZMR(JKM) - END DO -! -! Complete the mass arrays with the ground informations read in EXPRE file - ZPRESSM(1) = ZPGROUND - ZTHV(1) = ZTHVGROUND - ZMR(1) = ZMRGROUND -! -! Compute height of the mass levels of the RS - ZHEIGHTM(:) = HEIGHT_PRESS(ZPRESSM,ZTHV,ZPGROUND,ZTHV(1),ZZGROUND) -! -! Compute thetav and heigth at the wind levels of the RS - ZTHVU(:) = THETAVPU_THETAVPM(ZPRESSM,ZPRESSU,ZTHV) - ZHEIGHTU(:) = HEIGHT_PRESS(ZPRESSU,ZTHVU,ZPGROUND,ZTHV(1),ZZGROUND) -! -! on interpole thetal(=theta quand il n'y a pas d'eau liquide) et r total - ZRT(:)=ZMR(:) - ZTHL(:)=ZTHV(:)*(1+ZRT(:))/(1+ZRVSRD*ZRT(:)) -! -!* 2.3 PUVTHVHU case : zGROUND, PGROUND, ThvGROUND, HuGROUND -! (Pressure, U, V) , -! (Pressure, THv, Hu) -! - CASE ('PUVTHVHU') -! -! Read data at ground level - READ(ILUPRE,*) ZZGROUND - READ(ILUPRE,*) ZPGROUND - READ(ILUPRE,*) ZTHVGROUND - READ(ILUPRE,*) ZHUGROUND -! -! Read number of wind levels - READ(ILUPRE,*) ILEVELU -! -! Allocate the required memory - ALLOCATE(ZPRESSU(ILEVELU)) - ALLOCATE(ZU(ILEVELU),ZV(ILEVELU)) - ALLOCATE(ZHEIGHTU(ILEVELU)) - ALLOCATE(ZTHVU(ILEVELU)) -! -! Read the data at each wind level of the RS - DO JKU =1,ILEVELU - READ(ILUPRE,*) ZPRESSU(JKU),ZU(JKU),ZV(JKU) - END DO -! -! Read number of mass levels - READ(ILUPRE,*) ILEVELM -! -! Allocate the required memory - ALLOCATE(ZPRESSM(ILEVELM)) - ALLOCATE(ZTHV(ILEVELM)) - ALLOCATE(ZHU(ILEVELM)) - ALLOCATE(ZHEIGHTM(ILEVELM)) - ALLOCATE(ZMR(ILEVELM)) - ALLOCATE(ZTV(ILEVELM)) - ALLOCATE(ZTHL(ILEVELM)) - ALLOCATE(ZRT(ILEVELM)) -! -! Read the data at each mass level of the RS - DO JKM = 2,ILEVELM - READ(ILUPRE,*) ZPRESSM(JKM),ZTHV(JKM),ZHU(JKM) - END DO -! -! Complete the mass arrays with the ground informations read in EXPRE file - ZPRESSM(1) = ZPGROUND ! Mass level 1 is at the ground - ZTHV(1) = ZTHVGROUND - ZHU(1) = ZHUGROUND -! -! Compute Tv - ZTV(:)=ZTHV(:) * (ZPRESSM(:) / XP00) ** ZRDSCPD -! -! Compte mixing ratio - ZMR(:)=SM_PMR_HU(ZPRESSM(:),ZTV(:),ZHU(:),SPREAD(ZMR(:),2,1)) -! -! Compute height of the mass levels of the RS - ZHEIGHTM(:) = HEIGHT_PRESS(ZPRESSM,ZTHV,ZPGROUND,ZTHV(1),ZZGROUND) -! -! Compute thetav and height of the wind levels of the RS - ZTHVU(:) = THETAVPU_THETAVPM(ZPRESSM,ZPRESSU,ZTHV) - ZHEIGHTU(:) = HEIGHT_PRESS(ZPRESSU,ZTHVU,ZPGROUND,ZTHV(1),ZZGROUND) -! -! on interpole thetal(=theta quand il n'y a pas d'eau liquide) et r total - ZRT(:)=ZMR(:) - ZTHL(:)=ZTHV(:)*(1+ZRT(:))/(1+ZRVSRD*ZRT(:)) -! -!* 2.4 ZUVTHVHU case : zGROUND, PGROUND, ThvGROUND, HuGROUND -! (height, U, V) , -! (height, THv, Hu) -! - CASE ('ZUVTHVHU') -! Read data at ground level - READ(ILUPRE,*) ZZGROUND - READ(ILUPRE,*) ZPGROUND - READ(ILUPRE,*) ZTHVGROUND - READ(ILUPRE,*) ZHUGROUND -! -! Read number of wind levels - READ(ILUPRE,*) ILEVELU -! -! Allocate the required memory - ALLOCATE(ZPRESSU(ILEVELU)) - ALLOCATE(ZHEIGHTU(ILEVELU)) - ALLOCATE(ZU(ILEVELU),ZV(ILEVELU)) -! -! -! Read the data at each wind level of the RS - DO JKU = 1,ILEVELU - READ(ILUPRE,*) ZHEIGHTU(JKU),ZU(JKU),ZV(JKU) - END DO -! -! Read number of mass levels - READ(ILUPRE,*) ILEVELM -! -! Allocate the required memory - ALLOCATE(ZHEIGHTM(ILEVELM)) - ALLOCATE(ZTHV(ILEVELM)) - ALLOCATE(ZHU(ILEVELM)) - ALLOCATE(ZMR(ILEVELM)) - ALLOCATE(ZPRESSM(ILEVELM)) - ALLOCATE(ZTV(ILEVELM)) - ALLOCATE(ZTHL(ILEVELM)) - ALLOCATE(ZRT(ILEVELM)) -! -! Read the data at each mass level of the RS - DO JKM = 2,ILEVELM - READ(ILUPRE,*) ZHEIGHTM(JKM),ZTHV(JKM),ZHU(JKM) - END DO -! -! Complete the mass arrays with the ground informations read in EXPRE file - ZHEIGHTM(1) = ZZGROUND ! Mass level 1 is at the ground - ZTHV(1) = ZTHVGROUND - ZHU(1) = ZHUGROUND -! -! Compute Pressure at the mass levels of the RS - ZPRESSM= PRESS_HEIGHT(ZHEIGHTM,ZTHV,ZPGROUND,ZTHV(1),ZHEIGHTM(1)) -! -! Compute Tv and the mixing ratio at the mass levels of the RS - ZTV(:)=ZTHV(:) * (ZPRESSM(:) / XP00) ** ZRDSCPD - ZMR(:)=SM_PMR_HU(ZPRESSM(:),ZTV(:),ZHU(:),SPREAD(ZMR(:),2,1)) -! -! on interpole thetal(=theta quand il n'y a pas d'eau liquide) et r total - ZRT(:)=ZMR(:) - ZTHL(:)=ZTHV(:)*(1+ZRT(:))/(1+ZRVSRD*ZRT(:)) -! -! -!* 2.5 ZUVTHVMR case : zGROUND, PGROUND, ThvGROUND, RGROUND -! (height, U, V) , -! (height, THv, R) -! -! - CASE ('ZUVTHVMR') -! Read data at ground level - READ(ILUPRE,*) ZZGROUND - READ(ILUPRE,*) ZPGROUND - READ(ILUPRE,*) ZTHVGROUND - READ(ILUPRE,*) ZMRGROUND -! -! Read number of wind levels - READ(ILUPRE,*) ILEVELU -! -! Allocate the required memory - ALLOCATE(ZHEIGHTU(ILEVELU)) - ALLOCATE(ZU(ILEVELU),ZV(ILEVELU)) -! -! Read the data at each wind level of the RS - DO JKU = 1,ILEVELU - READ(ILUPRE,*) ZHEIGHTU(JKU),ZU(JKU),ZV(JKU) - END DO -! -! Read number of mass levels - READ(ILUPRE,*) ILEVELM -! -! Allocate the required memory - ALLOCATE(ZHEIGHTM(ILEVELM)) - ALLOCATE(ZTHV(ILEVELM)) - ALLOCATE(ZMR(ILEVELM)) - ALLOCATE(ZTHL(ILEVELM)) - ALLOCATE(ZRT(ILEVELM)) -! -! Read the data at each mass level of the RS - DO JKM=2,ILEVELM - READ(ILUPRE,*) ZHEIGHTM(JKM),ZTHV(JKM),ZMR(JKM) - END DO -! -! Complete the mass arrays with the ground informations read in EXPRE file - ZHEIGHTM(1)= ZZGROUND ! Mass level 1 is at the ground - ZTHV(1) = ZTHVGROUND - ZMR(1) = ZMRGROUND -! on interpole thetal(=theta quand il n'y a pas d'eau liquide) et r total - ZRT(:)=ZMR(:) - ZTHL(:)=ZTHV(:)*(1+ZRT(:))/(1+ZRVSRD*ZRT(:)) -! -! -!* 2.6 PUVTHDMR case : zGROUND, PGROUND, ThdGROUND, RGROUND -! (Pressure, U, V) , -! (Pressure, THd, R) -! - CASE ('PUVTHDMR') -! Read data at ground level - READ(ILUPRE,*) ZZGROUND - READ(ILUPRE,*) ZPGROUND - READ(ILUPRE,*) ZTHDGROUND - READ(ILUPRE,*) ZMRGROUND -! -! Read number of wind levels - READ(ILUPRE,*) ILEVELU -! -! Allocate the required memory - ALLOCATE(ZPRESSU(ILEVELU)) - ALLOCATE(ZU(ILEVELU),ZV(ILEVELU)) - ALLOCATE(ZTHVU(ILEVELU)) - ALLOCATE(ZHEIGHTU(ILEVELU)) -! -! Read the data at each wind level of the RS - DO JKU =1,ILEVELU - READ(ILUPRE,*) ZPRESSU(JKU),ZU(JKU),ZV(JKU) - END DO -! -! Read number of mass levels - READ(ILUPRE,*) ILEVELM -! -! Allocate the required memory - ALLOCATE(ZPRESSM(ILEVELM)) - ALLOCATE(ZTHD(ILEVELM)) - ALLOCATE(ZMR(ILEVELM)) - ALLOCATE(ZMRC(ILEVELM)) - ZMRC=0 - ALLOCATE(ZMRI(ILEVELM)) - ZMRI=0 - ALLOCATE(ZHEIGHTM(ILEVELM)) - ALLOCATE(ZTHV(ILEVELM)) - ALLOCATE(ZTHL(ILEVELM)) - ALLOCATE(ZRT(ILEVELM)) -! -! Read the data at each mass level of the RS - DO JKM=2,ILEVELM - IF(LUSERI) THEN - READ(ILUPRE,*) ZPRESSM(JKM),ZTHD(JKM),ZMR(JKM),ZMRC(JKM),ZMRI(JKM) - ELSEIF (GUSERC) THEN - READ(ILUPRE,*) ZPRESSM(JKM),ZTHD(JKM),ZMR(JKM),ZMRC(JKM) - ELSE - READ(ILUPRE,*) ZPRESSM(JKM),ZTHD(JKM),ZMR(JKM) - ENDIF - END DO -! -! Complete the mass arrays with the ground informations read in EXPRE file - ZPRESSM(1) = ZPGROUND ! Mass level 1 is at the ground - ZTHD(1) = ZTHDGROUND - ZMR(1) = ZMRGROUND - IF(GUSERC) ZMRC(1) = ZMRC(2) - IF(LUSERI) ZMRI(1) = ZMRI(2) -! -! Compute thetav at the mass levels of the RS - ZTHV(:) = ZTHD(:) * (1. + ZRVSRD *ZMR(:))/(1.+ZMR(:)+ZMRC(:)+ZMRI(:)) -! -! Compute the heights at the mass levels of the RS - ZHEIGHTM(:) = HEIGHT_PRESS(ZPRESSM,ZTHV,ZPGROUND,ZTHV(1),ZZGROUND) -! -! Compute thetav and heights of the wind levels - ZTHVU(:) = THETAVPU_THETAVPM(ZPRESSM,ZPRESSU,ZTHV) - ZHEIGHTU(:) = HEIGHT_PRESS(ZPRESSU,ZTHVU,ZPGROUND,ZTHV(1),ZZGROUND) -! -! Compute Theta l and Rt - IF (.NOT. GUSERC .AND. .NOT. LUSERI) THEN - ZRT(:)=ZMR(:) - ZTHL(:)=ZTHV(:)*(1+ZRT(:))/(1+ZRVSRD*ZRT(:)) - ELSE - ALLOCATE(ZEXN(ILEVELM)) - ALLOCATE(ZT(ILEVELM)) - ALLOCATE(ZCPH(ILEVELM)) - ALLOCATE(ZLVOCPEXN(ILEVELM)) - ALLOCATE(ZLSOCPEXN(ILEVELM)) - ZRT(:)=ZMR(:)+ZMRI(:)+ZMRC(:) - ZEXN(:)=(ZPRESSM/XP00) ** (XRD/XCPD) - ZT(:)=ZTHV*(ZPRESSM(:)/XP00)**(ZRDSCPD)*(1+ZRT(:))/(1+ZRVSRD*ZRT(:)) - ZCPH(:)=XCPD+ XCPV * ZMR(:)+ XCL *ZMRC(:) + XCI * ZMRI(:) - ZLVOCPEXN(:) = (XLVTT + (XCPV-XCL) * (ZT(:)-XTT))/(ZCPH*ZEXN(:)) - ZLSOCPEXN(:) = (XLSTT + (XCPV-XCI) * (ZT(:)-XTT))/(ZCPH*ZEXN(:)) - ZTHL(:)=ZTHV(:)*(1+ZRT(:))/(1+ZRVSRD*ZRT(:))-ZLVOCPEXN(:)*ZMRC(:)-ZLSOCPEXN(:)*ZMRI(:) - DEALLOCATE(ZEXN) - DEALLOCATE(ZT) - DEALLOCATE(ZCPH) - DEALLOCATE(ZLVOCPEXN) - DEALLOCATE(ZLSOCPEXN) - ENDIF -! -! -!* 2.7 PUVTHDHU case : zGROUND, PGROUND, ThdGROUND, HuGROUND -! (Pressure, U, V) , -! (Pressure, THd, Hu) -! - CASE ('PUVTHDHU') -! Read data at ground level - READ(ILUPRE,*) ZZGROUND - READ(ILUPRE,*) ZPGROUND - READ(ILUPRE,*) ZTHDGROUND - READ(ILUPRE,*) ZHUGROUND -! -! Read number of wind levels - READ(ILUPRE,*) ILEVELU -! -! Allocate the required memory - ALLOCATE(ZPRESSU(ILEVELU)) - ALLOCATE(ZU(ILEVELU),ZV(ILEVELU)) - ALLOCATE(ZTHVU(ILEVELU)) - ALLOCATE(ZHEIGHTU(ILEVELU)) -! -! Read the data at each wind level of the RS - DO JKU = 1,ILEVELU - READ(ILUPRE,*) ZPRESSU(JKU),ZU(JKU),ZV(JKU) - END DO -! -! Read number of mass levels - READ(ILUPRE,*) ILEVELM -! -! Allocate the required memory - ALLOCATE(ZPRESSM(ILEVELM)) - ALLOCATE(ZTHD(ILEVELM)) - ALLOCATE(ZHU(ILEVELM)) - ALLOCATE(ZHEIGHTM(ILEVELM)) - ALLOCATE(ZTHV(ILEVELM)) - ALLOCATE(ZMR(ILEVELM)) - ALLOCATE(ZT(ILEVELM)) - ALLOCATE(ZTHL(ILEVELM)) - ALLOCATE(ZRT(ILEVELM)) -! -! Read the data at each mass level of the RS - DO JKM =2,ILEVELM - READ(ILUPRE,*) ZPRESSM(JKM),ZTHD(JKM), ZHU(JKM) - END DO -! Complete the mass arrays with the ground informations read in EXPRE file - ZPRESSM(1) = ZPGROUND ! Mass level 1 is at the ground - ZTHD(1) = ZTHDGROUND - ZHU(1) = ZHUGROUND -! - ZT(:) = ZTHD(:) * (ZPRESSM(:)/XP00)**ZRDSCPD ! compute T and mixing ratio - ZMR(:) = ZRDSRV*SM_FOES(ZT(:))/((ZPRESSM(:)*100./ZHU(:)) -SM_FOES(ZT(:))) - -! Compute thetav at the mass levels of the RS - ZTHV(:) = ZTHD(:) * (1. + ZRVSRD *ZMR(:))/(1.+ZMR(:)) -! -! Compute height at mass levels - ZHEIGHTM(:) = HEIGHT_PRESS(ZPRESSM,ZTHV,ZPGROUND,ZTHV(1),ZZGROUND) -! -! Compute thetav and heights of the wind levels - ZTHVU(:) = THETAVPU_THETAVPM(ZPRESSM,ZPRESSU,ZTHV) - ZHEIGHTU(:) = HEIGHT_PRESS(ZPRESSU,ZTHVU,ZPGROUND,ZTHV(1),ZZGROUND) -! -! Compute thetal and Rt - ZRT(:)=ZMR(:) - ZTHL(:)=ZTHV(:)*(1+ZRT(:))/(1+ZRVSRD*ZRT(:)) -! -!* 2.8 ZUVTHDMR case : zGROUND, PGROUND, ThdGROUND, RGROUND -! (height, U, V) , -! (height, THd, R) -! - CASE ('ZUVTHDMR') -! Read data at ground level - READ(ILUPRE,*) ZZGROUND - READ(ILUPRE,*) ZPGROUND - READ(ILUPRE,*) ZTHDGROUND - READ(ILUPRE,*) ZMRGROUND -! -! Read number of wind levels - READ(ILUPRE,*) ILEVELU -! -! Allocate required memory - ALLOCATE(ZHEIGHTU(ILEVELU)) - ALLOCATE(ZU(ILEVELU),ZV(ILEVELU)) -! -! Read the data at each wind level of the RS - DO JKU = 1,ILEVELU - READ(ILUPRE,*) ZHEIGHTU(JKU),ZU(JKU),ZV(JKU) - END DO -! -! Read number of mass levels - READ(ILUPRE,*) ILEVELM -! -! Allocate required memory - ALLOCATE(ZHEIGHTM(ILEVELM)) - ALLOCATE(ZTHD(ILEVELM)) - ALLOCATE(ZMR(ILEVELM)) - ALLOCATE(ZTHV(ILEVELM)) - ALLOCATE(ZMRC(ILEVELM)) - ZMRC=0 - ALLOCATE(ZMRI(ILEVELM)) - ZMRI=0 - ALLOCATE(ZTHL(ILEVELM)) - ALLOCATE(ZRT(ILEVELM)) -! -! Read the data at each mass level of the RS - DO JKM= 2,ILEVELM - IF(LUSERI) THEN - READ(ILUPRE,*) ZHEIGHTM(JKM),ZTHD(JKM),ZMR(JKM),ZMRC(JKM),ZMRI(JKM) - ELSEIF (GUSERC) THEN - READ(ILUPRE,*) ZHEIGHTM(JKM),ZTHD(JKM),ZMR(JKM),ZMRC(JKM) - ELSE - READ(ILUPRE,*) ZHEIGHTM(JKM),ZTHD(JKM),ZMR(JKM) - ENDIF - END DO -! Complete the mass arrays with the ground informations read in EXPRE file - ZHEIGHTM(1) = ZZGROUND ! Mass level 1 is at ground - ZTHD(1) = ZTHDGROUND - ZMR(1) = ZMRGROUND - IF(GUSERC) ZMRC(1) = ZMRC(2) - IF(LUSERI) ZMRI(1) = ZMRI(2) -! Compute thetav at the mass levels of the RS - IF(LUSERI) THEN - ZTHV(:) = ZTHD(:) * (1. + ZRVSRD *ZMR(:))/(1.+ZMR(:)+ZMRC(:)+ZMRI(:)) - ELSEIF (GUSERC) THEN - ZTHV(:) = ZTHD(:) * (1. + ZRVSRD *ZMR(:))/(1.+ZMR(:)+ZMRC(:)) - ELSE - ZTHV(:) = ZTHD(:) * (1. + ZRVSRD *ZMR(:))/(1.+ZMR(:)) - ENDIF -! -! Compute Theta l and Rt - IF (.NOT. GUSERC .AND. .NOT. LUSERI) THEN - ZRT(:)=ZMR(:) - ZTHL(:)=ZTHV(:)*(1+ZRT(:))/(1+ZRVSRD*ZRT(:)) - ELSE - ALLOCATE(ZEXN(ILEVELM)) - ALLOCATE(ZEXNFLUX(ILEVELM)) - ALLOCATE(ZT(ILEVELM)) - ALLOCATE(ZCPH(ILEVELM)) - ALLOCATE(ZLVOCPEXN(ILEVELM)) - ALLOCATE(ZLSOCPEXN(ILEVELM)) - ZRT(:)=ZMR(:)+ZMRI(:)+ZMRC(:) - ZEXNSURF=(ZPGROUND/XP00) ** (XRD/XCPD) - CALL COMPUTE_EXNER_FROM_GROUND(ZTHV,ZHEIGHTM,ZEXNSURF,ZEXNFLUX,ZEXN) - ZT(:)=ZTHV*ZEXN(:)*(1+ZRT(:))/(1+ZRVSRD*ZRT(:)) - ZCPH(:)=XCPD+ XCPV * ZMR(:)+ XCL *ZMRC(:) + XCI * ZMRI(:) - ZLVOCPEXN(:) = (XLVTT + (XCPV-XCL) * (ZT(:)-XTT))/(ZCPH*ZEXN(:)) - ZLSOCPEXN(:) = (XLSTT + (XCPV-XCI) * (ZT(:)-XTT))/(ZCPH*ZEXN(:)) - ZTHL(:)=ZTHV(:)*(1+ZRT(:))/(1+ZRVSRD*ZRT(:))-ZLVOCPEXN(:)*ZMRC(:)-ZLSOCPEXN(:)*ZMRI(:) - DEALLOCATE(ZEXN) - DEALLOCATE(ZEXNFLUX) - DEALLOCATE(ZT) - DEALLOCATE(ZCPH) - DEALLOCATE(ZLVOCPEXN) - DEALLOCATE(ZLSOCPEXN) - ENDIF -! -! 2.9 ZUVTHLMR case : zGROUND, PGROUND, ThdGROUND, RGROUND -! (height, U, V) -! (height, THL, Rt) - -! - CASE ('ZUVTHLMR') -! Read data at ground level - READ(ILUPRE,*) ZZGROUND - READ(ILUPRE,*) ZPGROUND - READ(ILUPRE,*) ZTHLGROUND - READ(ILUPRE,*) ZMRGROUND -! -! Read number of wind levels - READ(ILUPRE,*) ILEVELU -! -! Allocate required memory - ALLOCATE(ZHEIGHTU(ILEVELU)) - ALLOCATE(ZU(ILEVELU),ZV(ILEVELU)) -! -! Read the data at each wind level of the RS - DO JKU = 1,ILEVELU - READ(ILUPRE,*) ZHEIGHTU(JKU),ZU(JKU),ZV(JKU) - END DO -! -! Read number of mass levels - READ(ILUPRE,*) ILEVELM -! -! Allocate required memory - ALLOCATE(ZHEIGHTM(ILEVELM)) - ALLOCATE(ZTHL(ILEVELM)) - ALLOCATE(ZTH(ILEVELM)) - ALLOCATE(ZMR(ILEVELM)) - ALLOCATE(ZTHV(ILEVELM)) - ALLOCATE(ZMRC(ILEVELM)) - ZMRC=0 - ALLOCATE(ZMRI(ILEVELM)) - ZMRI=0 - ALLOCATE(ZRT(ILEVELM)) -! -! Read the data at each mass level of the RS - DO JKM= 2,ILEVELM -! IF(LUSERI) THEN -! READ(ILUPRE,*) ZHEIGHTM(JKM),ZTHL(JKM),ZMR(JKM),ZMRC(JKM),ZMRI(JKM) -! ELSEIF (GUSERC) THEN - IF (GUSERC) THEN - READ(ILUPRE,*) ZHEIGHTM(JKM),ZTHL(JKM),ZMR(JKM),ZMRC(JKM) - ELSE - READ(ILUPRE,*) ZHEIGHTM(JKM),ZTHL(JKM),ZMR(JKM) - ENDIF - END DO -! Complete the mass arrays with the ground informations read in EXPRE file - ZHEIGHTM(1) = ZZGROUND ! Mass level 1 is at ground - ZTHL(1) = ZTHLGROUND - ZMR(1) = ZMRGROUND - IF(GUSERC) ZMRC(1) = ZMRC(2) -! IF(LUSERI) ZMRI(1) = ZMRI(2) -! -! Compute Rt - ZRT(:)=ZMR+ZMRC+ZMRI -! -!* 2.10 PUVTHU case : zGROUND, PGROUND, TempGROUND, HuGROUND -! (Pressure, U, V) , -! (Pressure, Temp, Hu) -! - CASE ('PUVTHU') -! Read data at ground level - READ(ILUPRE,*) ZZGROUND - READ(ILUPRE,*) ZPGROUND - READ(ILUPRE,*) ZTGROUND - READ(ILUPRE,*) ZHUGROUND -! -! Read number of wind levels - READ(ILUPRE,*) ILEVELU -! -! Allocate the required memory - ALLOCATE(ZPRESSU(ILEVELU)) - ALLOCATE(ZU(ILEVELU),ZV(ILEVELU)) - ALLOCATE(ZTHVU(ILEVELU)) - ALLOCATE(ZHEIGHTU(ILEVELU)) -! -! Read the data at each wind level of the RS - DO JKU = 1,ILEVELU - READ(ILUPRE,*) ZPRESSU(JKU),ZU(JKU),ZV(JKU) - END DO -! -! Read number of mass levels - READ(ILUPRE,*) ILEVELM -! -! Allocate the required memory - ALLOCATE(ZPRESSM(ILEVELM)) - ALLOCATE(ZTHD(ILEVELM)) - ALLOCATE(ZHU(ILEVELM)) - ALLOCATE(ZHEIGHTM(ILEVELM)) - ALLOCATE(ZTHV(ILEVELM)) - ALLOCATE(ZMR(ILEVELM)) - ALLOCATE(ZT(ILEVELM)) - ALLOCATE(ZTHL(ILEVELM)) - ALLOCATE(ZRT(ILEVELM)) - -! -! Read the data at each mass level of the RS - DO JKM =2,ILEVELM - READ(ILUPRE,*) ZPRESSM(JKM),ZT(JKM), ZHU(JKM) - END DO -! Complete the mass arrays with the ground informations read in EXPRE file - ZPRESSM(1) = ZPGROUND ! Mass level 1 is at the ground - ZT(1) = ZTGROUND - ZHU(1) = ZHUGROUND -! - ZTHD(:) = ZT(:) / (ZPRESSM(:)/XP00)**ZRDSCPD ! compute THD and mixing ratio - ZMR(:) = ZRDSRV*SM_FOES(ZT(:))/((ZPRESSM(:)*100./ZHU(:)) -SM_FOES(ZT(:))) -! Compute thetav at the mass levels of the RS - ZTHV(:) = ZTHD(:) * (1. + ZRVSRD *ZMR(:))/(1.+ZMR(:)) -! -! Compute height at mass levels - ZHEIGHTM(:) = HEIGHT_PRESS(ZPRESSM,ZTHV,ZPGROUND,ZTHV(1),ZZGROUND) -! -! Compute thetav and heights of the wind levels - ZTHVU(:) = THETAVPU_THETAVPM(ZPRESSM,ZPRESSU,ZTHV) - ZHEIGHTU(:) = HEIGHT_PRESS(ZPRESSU,ZTHVU,ZPGROUND,ZTHV(1),ZZGROUND) -! -! on interpole thetal(=theta quand il n'y a pas d'eau liquide) et r total - ZRT(:)=ZMR(:) - ZTHL(:)=ZTHV(:)*(1+ZRT(:))/(1+ZRVSRD*ZRT(:)) - CASE DEFAULT - CALL PRINT_MSG(NVERB_FATAL,'GEN','SET_RSOU','data type YKIND='//TRIM(YKIND)//' in PREFILE unknown') -END SELECT -! -!------------------------------------------------------------------------------- -! -!* 3. INTERPOLATE ON THE VERTICAL MIXED MODEL GRID -! --------------------------------------------------------- -! -! -! -IKU=SIZE(XZHAT) -! -!* 3.1 Compute mixed grid -! -IF (PRESENT(PCORIOZ)) THEN -! LGEOSBAL=T (no shift allowed, MNH grid without ororgraphy) - ZZS_LS(:,:)=0 -ELSE - IF (OSHIFT) THEN - ZZS_LS(:,:)=ZZGROUND - ELSE - ZZS_LS(:,:)=0 - ENDIF -ENDIF -CALL VERT_COORD(LSLEVE,ZZS_LS,ZZS_LS,XLEN1,XLEN2,XZHAT,ZZFLUX_MX) -ZZMASS_MX(:,:,:)=MZF(ZZFLUX_MX) -ZZMASS_MX(:,:,IKU)=1.5*ZZFLUX_MX(:,:,IKU)-0.5*ZZFLUX_MX(:,:,IKU-1) -! -!* 3.2 Interpolate and extrapolate U and V on w- mixed grid levels -! -!* vertical grid at initialization profile location -GPROFILE_IN_PROC=(KILOC+JPHEXT-IXOR_ll+1>=IIB .AND. KILOC+JPHEXT-IXOR_ll+1<=IIE) & - & .AND. (KJLOC+JPHEXT-IYOR_ll+1>=IJB .AND. KJLOC+JPHEXT-IYOR_ll+1<=IJE) -! -IF (GPROFILE_IN_PROC) THEN - ZZMASS_PROFILE(:) = ZZMASS_MX(KILOC+JPHEXT-IXOR_ll+1,KJLOC+JPHEXT-IYOR_ll+1,:) - ZZFLUX_PROFILE(:) = ZZFLUX_MX(KILOC+JPHEXT-IXOR_ll+1,KJLOC+JPHEXT-IYOR_ll+1,:) -ELSE - ZZMASS_PROFILE(:) = 0. - ZZFLUX_PROFILE(:) = 0. -END IF -DO JK = 1,IKU - CALL REDUCESUM_ll(ZZMASS_PROFILE(JK), IINFO_ll) - CALL REDUCESUM_ll(ZZFLUX_PROFILE(JK), IINFO_ll) -END DO - -! interpolation of U and V -DO JK = 1,IKU - IF (ZZFLUX_PROFILE(JK) <= ZHEIGHTU(1)) THEN ! extrapolation below the first level - ZDZSDH = (ZZFLUX_PROFILE(JK) - ZHEIGHTU(1)) / (ZHEIGHTU(2) - ZHEIGHTU(1)) - ZUW(JK) = ZU(1) + (ZU(2) - ZU(1)) * ZDZSDH - ZVW(JK) = ZV(1) + (ZV(2) - ZV(1)) * ZDZSDH - ELSE IF (ZZFLUX_PROFILE(JK) > ZHEIGHTU(ILEVELU) ) THEN ! extrapolation above the last - ZDZSDH = (ZZFLUX_PROFILE(JK) - ZHEIGHTU(ILEVELU)) & ! level - / (ZHEIGHTU(ILEVELU) - ZHEIGHTU(ILEVELU-1)) - ZUW(JK) = ZU(ILEVELU) + (ZU(ILEVELU) -ZU(ILEVELU -1)) * ZDZSDH - ZVW(JK) = ZV(ILEVELU) + (ZV(ILEVELU) -ZV(ILEVELU -1)) * ZDZSDH - ELSE ! interpolation between the first and last levels - DO JKLEV = 1,ILEVELU-1 - IF ( (ZZFLUX_PROFILE(JK) > ZHEIGHTU(JKLEV)).AND. & - (ZZFLUX_PROFILE(JK) <= ZHEIGHTU(JKLEV+1)) )THEN - ZDZ1SDH = (ZZFLUX_PROFILE(JK) - ZHEIGHTU(JKLEV)) & - / (ZHEIGHTU(JKLEV+1)-ZHEIGHTU(JKLEV)) - ZDZ2SDH = (ZHEIGHTU(JKLEV+1) - ZZFLUX_PROFILE(JK) ) & - / (ZHEIGHTU(JKLEV+1)-ZHEIGHTU(JKLEV)) - ZUW(JK) = (ZU(JKLEV) * ZDZ2SDH) + (ZU(JKLEV+1) *ZDZ1SDH) - ZVW(JK) = (ZV(JKLEV) * ZDZ2SDH) + (ZV(JKLEV+1) *ZDZ1SDH) - END IF - END DO - END IF -END DO -! -!* 3.3 Interpolate and extrapolate Thetav and r on mass mixed grid levels -! -ZMRCM=0 -ZMRIM=0 -DO JK = 1,IKU - IF (ZZMASS_PROFILE(JK) <= ZHEIGHTM(1)) THEN ! extrapolation below the first level - ZDZSDH = (ZZMASS_PROFILE(JK) - ZHEIGHTM(1)) / (ZHEIGHTM(2) - ZHEIGHTM(1)) - ZTHLM(JK) = ZTHL(1) + (ZTHL(2) - ZTHL(1)) * ZDZSDH - ZMRM(JK) = ZRT(1) + (ZRT(2) - ZRT(1)) * ZDZSDH - IF (GUSERC) ZMRCM(JK) = ZMRC(1) + (ZMRC(2) - ZMRC(1)) * ZDZSDH - IF (LUSERI) ZMRIM(JK) = ZMRI(1) + (ZMRI(2) - ZMRI(1)) * ZDZSDH - ELSE IF (ZZMASS_PROFILE(JK) > ZHEIGHTM(ILEVELM) ) THEN ! extrapolation above the last - ZDZSDH = (ZZMASS_PROFILE(JK) - ZHEIGHTM(ILEVELM)) & ! level - / (ZHEIGHTM(ILEVELM) - ZHEIGHTM(ILEVELM-1)) - ZTHLM(JK) = ZTHL(ILEVELM) + (ZTHL(ILEVELM) -ZTHL(ILEVELM -1)) * ZDZSDH - ZMRM(JK) = ZRT(ILEVELM) + (ZRT(ILEVELM) -ZRT(ILEVELM -1)) * ZDZSDH - IF (GUSERC) ZMRCM(JK) = ZMRC(ILEVELM) + (ZMRC(ILEVELM) -ZMRC(ILEVELM -1)) * ZDZSDH - IF (LUSERI) ZMRIM(JK) = ZMRI(ILEVELM) + (ZMRI(ILEVELM) -ZMRI(ILEVELM -1)) * ZDZSDH - ELSE ! interpolation between the first and last levels - DO JKLEV = 1,ILEVELM-1 - IF ( (ZZMASS_PROFILE(JK) > ZHEIGHTM(JKLEV)).AND. & - (ZZMASS_PROFILE(JK) <= ZHEIGHTM(JKLEV+1)) )THEN - ZDZ1SDH = (ZZMASS_PROFILE(JK) - ZHEIGHTM(JKLEV)) & - / (ZHEIGHTM(JKLEV+1)-ZHEIGHTM(JKLEV)) - ZDZ2SDH = (ZHEIGHTM(JKLEV+1) - ZZMASS_PROFILE(JK) ) & - / (ZHEIGHTM(JKLEV+1)-ZHEIGHTM(JKLEV)) - ZTHLM(JK) = (ZTHL(JKLEV) * ZDZ2SDH) + (ZTHL(JKLEV+1) *ZDZ1SDH) - ZMRM(JK) = (ZRT(JKLEV) * ZDZ2SDH) + (ZRT(JKLEV+1) *ZDZ1SDH) - IF (GUSERC) ZMRCM(JK) = (ZMRC(JKLEV) * ZDZ2SDH) + (ZMRC(JKLEV+1) *ZDZ1SDH) - IF (LUSERI) ZMRIM(JK) = (ZMRI(JKLEV) * ZDZ2SDH) + (ZMRI(JKLEV+1) *ZDZ1SDH) - END IF - END DO - END IF -END DO -! -! Compute thetaV rv ri and Rc with adjustement -ALLOCATE(ZEXNFLUX(IKU)) -ALLOCATE(ZEXNMASS(IKU)) -ALLOCATE(ZPRESS(IKU)) -ALLOCATE(ZPREFLUX(IKU)) -ALLOCATE(ZFRAC_ICE(IKU)) -ALLOCATE(ZRSATW(IKU)) -ALLOCATE(ZRSATI(IKU)) -ALLOCATE(ZMRT(IKU)) -ALLOCATE(ZBUF(IKU,16)) -ZMRT=ZMRM+ZMRCM+ZMRIM -ZTHVM=ZTHLM -! -IF (LOCEAN) THEN - ZRHODM(:)=XRH00OCEAN*(1.-XALPHAOC*(ZTHLM(:) - XTH00OCEAN)& - +XBETAOC* (ZMRM(:) - XSA00OCEAN)) - ZPREFLUX(IKU)=ZPTOP - DO JK=IKU-1,2,-1 - ZPREFLUX(JK) = ZPREFLUX(JK+1) + XG*ZRHODM(JK)*(ZZFLUX_PROFILE(JK+1)-ZZFLUX_PROFILE(JK)) - END DO - ZPGROUND=ZPREFLUX(2) - WRITE(ILUOUT,FMT=*)'ZPGROUND i.e. Pressure at ocean domain bottom',ZPGROUND - ZTHM=ZTHVM -ELSE -! Atmospheric case - ZEXNSURF=(ZPGROUND/XP00)**(XRD/XCPD) - DO JLOOP=1,20 ! loop for pression - CALL COMPUTE_EXNER_FROM_GROUND(ZTHVM,ZZMASS_PROFILE(:),ZEXNSURF,ZEXNFLUX,ZEXNMASS) - ZPRESS(:)=XP00*(ZEXNMASS(:))**(XCPD/XRD) - CALL TH_R_FROM_THL_RT(CST,NEB,SIZE(ZPRESS,1),'T',ZFRAC_ICE,ZPRESS,ZTHLM,ZMRT,ZTHM,ZMRM,ZMRCM,ZMRIM, & - ZRSATW, ZRSATI,OOCEAN=.FALSE.,& - PBUF=ZBUF) - ZTHVM(:)=ZTHM(:)*(1.+XRV/XRD*ZMRM(:))/(1.+(ZMRM(:)+ZMRIM(:)+ZMRCM(:))) - ENDDO -ENDIF -! -DEALLOCATE(ZEXNFLUX) -DEALLOCATE(ZEXNMASS) -DEALLOCATE(ZPRESS) -DEALLOCATE(ZFRAC_ICE) -DEALLOCATE(ZRSATW) -DEALLOCATE(ZRSATI) -DEALLOCATE(ZMRT) -DEALLOCATE(ZBUF) -!------------------------------------------------------------------------------- -! -!* 4. COMPUTE FIELDS ON THE MODEL GRID (WITH OROGRAPHY) -! ------------------------------------------------- -CALL SET_MASS(TPFILE,GPROFILE_IN_PROC, ZZFLUX_PROFILE, & - KILOC+JPHEXT,KJLOC+JPHEXT,ZZS_LS,ZZMASS_MX,ZZFLUX_MX,ZPGROUND,& - ZTHVM,ZMRM,ZUW,ZVW,OSHIFT,OBOUSS,PJ,HFUNU,HFUNV, & - PMRCM=ZMRCM,PMRIM=ZMRIM,PCORIOZ=PCORIOZ) -! -DEALLOCATE(ZPREFLUX) -DEALLOCATE(ZHEIGHTM) -DEALLOCATE(ZTHV) -DEALLOCATE(ZMR) -DEALLOCATE(ZTHL) -!------------------------------------------------------------------------------- -CONTAINS - SUBROUTINE CHECK( ISTATUS, YLOC ) - INTEGER(KIND=CDFINT), INTENT(IN) :: ISTATUS - CHARACTER(LEN=*), INTENT(IN) :: YLOC - - IF( ISTATUS /= NF90_NOERR ) THEN - CALL PRINT_MSG( NVERB_ERROR, 'IO', 'SET_RSOU', 'error at ' // Trim( yloc) // ': ' // NF90_STRERROR( ISTATUS ) ) - END IF - END SUBROUTINE check - ! - INCLUDE "th_r_from_thl_rt.func.h" - INCLUDE "compute_frac_ice.func.h" - ! -END SUBROUTINE SET_RSOU diff --git a/src/mesonh/ext/shallow_mf_pack.f90 b/src/mesonh/ext/shallow_mf_pack.f90 deleted file mode 100644 index ee2f7e2fb5d794175d12979085583f31a02a53fd..0000000000000000000000000000000000000000 --- a/src/mesonh/ext/shallow_mf_pack.f90 +++ /dev/null @@ -1,383 +0,0 @@ -!MNH_LIC Copyright 2010-2021 CNRS, Meteo-France and Universite Paul Sabatier -!MNH_LIC This is part of the Meso-NH software governed by the CeCILL-C licence -!MNH_LIC version 1. See LICENSE, CeCILL-C_V1-en.txt and CeCILL-C_V1-fr.txt -!MNH_LIC for details. version 1. -!----------------------------------------------------------------- -! ###################### - MODULE MODI_SHALLOW_MF_PACK -! ###################### -! -INTERFACE -! ################################################################# - SUBROUTINE SHALLOW_MF_PACK(KRR,KRRL,KRRI, & - OMF_FLX,TPFILE,PTIME_LES, & - PIMPL_MF, PTSTEP, & - PDZZ, PZZ, PDX,PDY, & - PRHODJ, PRHODREF, & - PPABSM, PEXN, & - PSFTH,PSFRV, & - PTHM,PRM,PUM,PVM,PTKEM,PSVM, & - PRTHS,PRRS,PRUS,PRVS,PRSVS, & - PSIGMF,PRC_MF,PRI_MF,PCF_MF,PFLXZTHVMF ) -! ################################################################# -!! -use MODD_IO, only: TFILEDATA -use modd_precision, only: MNHTIME -! -!* 1.1 Declaration of Arguments -! -! -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. -LOGICAL, INTENT(IN) :: OMF_FLX ! switch to write the - ! MF fluxes in the synchronous FM-file -TYPE(TFILEDATA), INTENT(IN) :: TPFILE ! Output file -REAL(kind=MNHTIME),DIMENSION(2), INTENT(OUT) :: PTIME_LES ! time spent in LES computations -REAL, INTENT(IN) :: PIMPL_MF ! degre of implicitness -REAL, INTENT(IN) :: PTSTEP ! Dynamical timestep - -REAL, DIMENSION(:,:,:), INTENT(IN) :: PZZ ! Height of flux point -REAL, DIMENSION(:,:,:), INTENT(IN) :: PDZZ ! Metric coefficients -REAL, DIMENSION(:,:,:), INTENT(IN) :: PRHODJ ! dry density * Grid size -REAL, DIMENSION(:,:,:), INTENT(IN) :: PRHODREF ! dry density of the - ! reference state -REAL, DIMENSION(:,:,:), INTENT(IN) :: PPABSM ! Pressure at time t-1 -REAL, DIMENSION(:,:,:), INTENT(IN) :: PEXN ! Exner function at t-dt - -REAL, DIMENSION(:,:), INTENT(IN) :: PSFTH,PSFRV ! normal surface fluxes of theta and Rv -REAL, DIMENSION(:,:,:), INTENT(IN) :: PTHM ! Theta at t-dt -REAL, DIMENSION(:,:,:,:),INTENT(IN):: PRM ! water var. at t-dt -REAL, DIMENSION(:,:,:), INTENT(IN) :: PUM,PVM ! wind components at t-dt -REAL, DIMENSION(:,:,:), INTENT(IN) :: PTKEM ! tke at t-dt - -REAL, DIMENSION(:,:,:,:), INTENT(IN) :: PSVM ! scalar variable a t-dt - -REAL, DIMENSION(:,:,:), INTENT(INOUT) :: PRUS,PRVS,PRTHS ! Meso-NH sources -REAL, DIMENSION(:,:,:,:), INTENT(INOUT) :: PRRS -REAL, DIMENSION(:,:,:,:), INTENT(INOUT) :: PRSVS ! Scalar sources -REAL, DIMENSION(:,:,:), INTENT(OUT) :: PSIGMF,PRC_MF,PRI_MF,PCF_MF ! cloud info for the cloud scheme -REAL, DIMENSION(:,:,:), INTENT(OUT) :: PFLXZTHVMF ! Thermal production for TKE scheme -! -REAL, INTENT(IN) :: PDX,PDY ! Size of mesh in X/Y directions -END SUBROUTINE SHALLOW_MF_PACK - -END INTERFACE -! -END MODULE MODI_SHALLOW_MF_PACK - -! ################################################################# - SUBROUTINE SHALLOW_MF_PACK(KRR,KRRL,KRRI, & - OMF_FLX,TPFILE,PTIME_LES, & - PIMPL_MF, PTSTEP, & - PDZZ, PZZ, PDX,PDY, & - PRHODJ, PRHODREF, & - PPABSM, PEXN, & - PSFTH,PSFRV, & - PTHM,PRM,PUM,PVM,PTKEM,PSVM, & - PRTHS,PRRS,PRUS,PRVS,PRSVS, & - PSIGMF,PRC_MF,PRI_MF,PCF_MF,PFLXZTHVMF ) -! ################################################################# -!! -!!**** *SHALLOW_MF_PACK* - -!! -!! -!! PURPOSE -!! ------- -!!**** The purpose of this routine is -!! -! -!!** METHOD -!! ------ -!! -!! EXTERNAL -!! -------- -!! -!! IMPLICIT ARGUMENTS -!! ------------------ -!! -!! REFERENCE -!! --------- -!! -!! -!! AUTHOR -!! ------ -!! V.Masson 09/2010 -! -------------------------------------------------------------------------- -! Modifications: -! R. Honnert 07/2012: introduction of vertical wind for the height of the thermal -! M. Leriche 02/2017: avoid negative values for sv tendencies -! P. Wautelet 05/2016-04/2018: new data structures and calls for I/O -! S. Riette 11/2016: support for CFRAC_ICE_SHALLOW_MF -! P. Wautelet 28/03/2019: use MNHTIME for time measurement variables -! P. Wautelet 02/2020: use the new data structures and subroutines for budgets -! -------------------------------------------------------------------------- -! -!* 0. DECLARATIONS -! ------------ -! -USE MODD_CST, ONLY: CST -USE MODD_NEB, ONLY: NEB -USE MODD_TURB_n, ONLY: TURBN -USE MODD_CTURB, ONLY: CSTURB -USE MODD_PARAM_MFSHALL_n, ONLY: PARAM_MFSHALLN -USE MODD_DIMPHYEX, ONLY: DIMPHYEX_t -! -USE MODE_FILL_DIMPHYEX, ONLY: FILL_DIMPHYEX -! -USE MODD_BUDGET, ONLY: TBUDGETS,TBUCONF,lbudget_th,nbudget_th -USE MODD_CONF -USE MODD_IO, ONLY: TFILEDATA -USE modd_field, ONLY: tfielddata, TYPEREAL -USE MODD_NSV, ONLY: XSVMIN, NSV_LGBEG, NSV_LGEND -USE MODD_PARAMETERS -USE MODD_PARAM_ICE, ONLY: CFRAC_ICE_SHALLOW_MF -USE MODD_PARAM_MFSHALL_n -USE modd_precision, ONLY: MNHTIME - -USE mode_budget, ONLY: Budget_store_init, Budget_store_end, Budget_store_add -USE MODE_IO_FIELD_WRITE, ONLY: IO_Field_write - -USE MODI_DIAGNOS_LES_MF -USE MODI_SHALLOW_MF -USE MODI_SHUMAN -! -IMPLICIT NONE - -!* 0.1 Declaration of Arguments -! -! -! -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. -LOGICAL, INTENT(IN) :: OMF_FLX ! switch to write the - ! MF fluxes in the synchronous FM-file -TYPE(TFILEDATA), INTENT(IN) :: TPFILE ! Output file -REAL(kind=MNHTIME),DIMENSION(2), INTENT(OUT) :: PTIME_LES ! time spent in LES computations -REAL, INTENT(IN) :: PIMPL_MF ! degre of implicitness -REAL, INTENT(IN) :: PTSTEP ! Dynamical timestep - -REAL, DIMENSION(:,:,:), INTENT(IN) :: PZZ ! Height of flux point -REAL, DIMENSION(:,:,:), INTENT(IN) :: PDZZ ! Metric coefficients -REAL, DIMENSION(:,:,:), INTENT(IN) :: PRHODJ ! dry density * Grid size -REAL, DIMENSION(:,:,:), INTENT(IN) :: PRHODREF ! dry density of the - ! reference state -REAL, DIMENSION(:,:,:), INTENT(IN) :: PPABSM ! Pressure at time t-1 -REAL, DIMENSION(:,:,:), INTENT(IN) :: PEXN ! Exner function at t-dt - -REAL, DIMENSION(:,:), INTENT(IN) :: PSFTH,PSFRV ! normal surface fluxes of theta and Rv -REAL, DIMENSION(:,:,:), INTENT(IN) :: PTHM ! Theta at t-dt -REAL, DIMENSION(:,:,:,:),INTENT(IN):: PRM ! water var. at t-dt -REAL, DIMENSION(:,:,:), INTENT(IN) :: PUM,PVM ! wind components at t-dt -REAL, DIMENSION(:,:,:), INTENT(IN) :: PTKEM ! tke at t-dt - -REAL, DIMENSION(:,:,:,:), INTENT(IN) :: PSVM ! scalar variable a t-dt - -REAL, DIMENSION(:,:,:), INTENT(INOUT) :: PRUS,PRVS,PRTHS ! Meso-NH sources -REAL, DIMENSION(:,:,:,:), INTENT(INOUT) :: PRRS -REAL, DIMENSION(:,:,:,:), INTENT(INOUT) :: PRSVS ! Scalar sources -REAL, DIMENSION(:,:,:), INTENT(OUT) :: PSIGMF,PRC_MF,PRI_MF,PCF_MF ! cloud info for the cloud scheme -REAL, DIMENSION(:,:,:), INTENT(OUT) :: PFLXZTHVMF ! Thermal production for TKE scheme -! -REAL, INTENT(IN) :: PDX,PDY ! Size of mesh in X/Y directions -! 0.2 Declaration of local variables -! -REAL, DIMENSION(SIZE(PTHM,1),SIZE(PTHM,2),SIZE(PTHM,3)) :: ZDUDT_TURB ! tendency of U by turbulence only -REAL, DIMENSION(SIZE(PTHM,1),SIZE(PTHM,2),SIZE(PTHM,3)) :: ZDVDT_TURB ! tendency of V by turbulence only -REAL, DIMENSION(SIZE(PTHM,1),SIZE(PTHM,2),SIZE(PTHM,3)) :: ZDTHLDT_TURB ! tendency of thl by turbulence only -REAL, DIMENSION(SIZE(PTHM,1),SIZE(PTHM,2),SIZE(PTHM,3)) :: ZDRTDT_TURB ! tendency of rt by turbulence only -REAL, DIMENSION(SIZE(PTHM,1),SIZE(PTHM,2),SIZE(PTHM,3),SIZE(PSVM,4)) :: ZDSVDT_TURB ! tendency of Sv by turbulence only -REAL, DIMENSION(SIZE(PTHM,1),SIZE(PTHM,2),SIZE(PTHM,3)) :: ZDUDT_MF ! tendency of U by massflux scheme -REAL, DIMENSION(SIZE(PTHM,1),SIZE(PTHM,2),SIZE(PTHM,3)) :: ZDVDT_MF ! tendency of V by massflux scheme -REAL, DIMENSION(SIZE(PTHM,1),SIZE(PTHM,2),SIZE(PTHM,3)) :: ZDTHLDT_MF ! tendency of thl by massflux scheme -REAL, DIMENSION(SIZE(PTHM,1),SIZE(PTHM,2),SIZE(PTHM,3)) :: ZDRTDT_MF ! tendency of Rt by massflux scheme -REAL, DIMENSION(SIZE(PTHM,1),SIZE(PTHM,2),SIZE(PTHM,3),SIZE(PSVM,4)) :: ZDSVDT_MF ! tendency of Sv by massflux scheme -REAL, DIMENSION(SIZE(PTHM,1),SIZE(PTHM,2),SIZE(PTHM,3)) :: ZSIGMF,ZRC_MF,ZRI_MF,ZCF_MF ! cloud info for the cloud scheme -REAL, DIMENSION(SIZE(PTHM,1),SIZE(PTHM,2),SIZE(PTHM,3)) :: ZFLXZTHVMF ! Thermal production for TKE scheme -REAL, DIMENSION(SIZE(PTHM,1),SIZE(PTHM,2),SIZE(PTHM,3)) :: ZFLXZTHMF -REAL, DIMENSION(SIZE(PTHM,1),SIZE(PTHM,2),SIZE(PTHM,3)) :: ZFLXZRMF -REAL, DIMENSION(SIZE(PTHM,1),SIZE(PTHM,2),SIZE(PTHM,3)) :: ZFLXZUMF -REAL, DIMENSION(SIZE(PTHM,1),SIZE(PTHM,2),SIZE(PTHM,3)) :: ZFLXZVMF -REAL, DIMENSION(SIZE(PTHM,1),SIZE(PTHM,2),SIZE(PTHM,3)) :: ZTHL_UP ! updraft characteristics -REAL, DIMENSION(SIZE(PTHM,1),SIZE(PTHM,2),SIZE(PTHM,3)) :: ZRT_UP ! updraft characteristics -REAL, DIMENSION(SIZE(PTHM,1),SIZE(PTHM,2),SIZE(PTHM,3)) :: ZRV_UP ! updraft characteristics -REAL, DIMENSION(SIZE(PTHM,1),SIZE(PTHM,2),SIZE(PTHM,3)) :: ZU_UP ! updraft characteristics -REAL, DIMENSION(SIZE(PTHM,1),SIZE(PTHM,2),SIZE(PTHM,3)) :: ZV_UP ! updraft characteristics -REAL, DIMENSION(SIZE(PTHM,1),SIZE(PTHM,2),SIZE(PTHM,3)) :: ZRC_UP ! updraft characteristics -REAL, DIMENSION(SIZE(PTHM,1),SIZE(PTHM,2),SIZE(PTHM,3)) :: ZRI_UP ! updraft characteristics -REAL, DIMENSION(SIZE(PTHM,1),SIZE(PTHM,2),SIZE(PTHM,3)) :: ZTHV_UP ! updraft characteristics -REAL, DIMENSION(SIZE(PTHM,1),SIZE(PTHM,2),SIZE(PTHM,3)) :: ZW_UP ! updraft characteristics -REAL, DIMENSION(SIZE(PTHM,1),SIZE(PTHM,2),SIZE(PTHM,3)) :: ZFRAC_UP ! updraft characteristics -REAL, DIMENSION(SIZE(PTHM,1),SIZE(PTHM,2),SIZE(PTHM,3)) :: ZEMF ! updraft characteristics -REAL, DIMENSION(SIZE(PTHM,1),SIZE(PTHM,2),SIZE(PTHM,3)) :: ZDETR ! updraft characteristics -REAL, DIMENSION(SIZE(PTHM,1),SIZE(PTHM,2),SIZE(PTHM,3)) :: ZENTR ! updraft characteristics -REAL, DIMENSION(SIZE(PTHM,1),SIZE(PTHM,2),SIZE(PTHM,3)) :: ZUMM ! wind on mass point -REAL, DIMENSION(SIZE(PTHM,1),SIZE(PTHM,2),SIZE(PTHM,3)) :: ZVMM ! wind on mass point -! -INTEGER,DIMENSION(SIZE(PTHM,1)*SIZE(PTHM,2)) :: IKLCL,IKETL,IKCTL ! level of LCL,ETL and CTL -INTEGER :: IIU, IJU, IKU, IKB, IKE, IRR, ISV -INTEGER :: JK,JRR,JSV ! Loop counters - - -LOGICAL :: LSTATNW ! switch for HARMONIE-AROME turb physics option - ! TODO: linked with modd_turbn + init at default_desfmn - -TYPE(TFIELDDATA) :: TZFIELD -TYPE(DIMPHYEX_t) :: YLDIMPHYEXPACK -!------------------------------------------------------------------------ -! -!!! 1. Initialisation -CALL FILL_DIMPHYEX(YLDIMPHYEXPACK, SIZE(PZZ,1), SIZE(PZZ,2), SIZE(PZZ,3)) -! -! Internal Domain -IIU=SIZE(PTHM,1) -IJU=SIZE(PTHM,2) -IKU=SIZE(PTHM,3) -IKB=1+JPVEXT -IKE=IKU-JPVEXT -! -! number of moist var -IRR=SIZE(PRM,4) -! number of scalar var -ISV=SIZE(PSVM,4) -! -! wind on mass points -ZUMM=MXF(PUM) -ZVMM=MYF(PVM) -! -!!! 2. Call of the physical parameterization of massflux vertical transport -! -LSTATNW = .FALSE. -! -CALL SHALLOW_MF(YLDIMPHYEXPACK, CST, NEB, PARAM_MFSHALLN, TURBN, CSTURB,& - KRR,KRRL,KRRI,ISV, & - CFRAC_ICE_SHALLOW_MF,LNOMIXLG,NSV_LGBEG,NSV_LGEND, & - PIMPL_MF, PTSTEP, & - PDZZ, PZZ, & - PRHODJ,PRHODREF, & - PPABSM, PEXN, & - PSFTH,PSFRV, & - PTHM,PRM,ZUMM,ZVMM,PTKEM,PSVM, & - ZDUDT_MF,ZDVDT_MF, & - ZDTHLDT_MF,ZDRTDT_MF,ZDSVDT_MF, & - ZSIGMF,ZRC_MF,ZRI_MF,ZCF_MF,ZFLXZTHVMF, & - ZFLXZTHMF,ZFLXZRMF,ZFLXZUMF,ZFLXZVMF, & - ZTHL_UP,ZRT_UP,ZRV_UP,ZRC_UP,ZRI_UP, & - ZU_UP, ZV_UP, ZTHV_UP, ZW_UP, & - ZFRAC_UP,ZEMF,ZDETR,ZENTR, & - IKLCL,IKETL,IKCTL,PDX,PDY,PRSVS,XSVMIN, & - TBUCONF, TBUDGETS,SIZE(TBUDGETS) ) -! -! Fill non-declared-explicit-dimensions output variables -PSIGMF(:,:,:) = ZSIGMF(:,:,:) -PRC_MF(:,:,:) = ZRC_MF(:,:,:) -PRI_MF(:,:,:) = ZRI_MF(:,:,:) -PCF_MF(:,:,:) = ZCF_MF(:,:,:) -PFLXZTHVMF(:,:,:) = ZFLXZTHVMF(:,:,:) -! -!!! 3. Compute source terms for Meso-NH pronostic variables -!!! ---------------------------------------------------- -! -! As the pronostic variable of Meso-Nh are not (yet) the conservative variables -! the thl tendency is put in th and the rt tendency in rv -! the adjustment will do later the repartition between vapor and cloud -PRTHS(:,:,:) = PRTHS(:,:,:) + & - PRHODJ(:,:,:)*ZDTHLDT_MF(:,:,:) -PRRS(:,:,:,1) = PRRS(:,:,:,1) + & - PRHODJ(:,:,:)*ZDRTDT_MF(:,:,:) -PRUS(:,:,:) = PRUS(:,:,:) +MXM( & - PRHODJ(:,:,:)*ZDUDT_MF(:,:,:)) -PRVS(:,:,:) = PRVS(:,:,:) +MYM( & - PRHODJ(:,:,:)*ZDVDT_MF(:,:,:)) -! -DO JSV=1,ISV - IF (LNOMIXLG .AND. JSV >= NSV_LGBEG .AND. JSV<= NSV_LGEND) CYCLE - PRSVS(:,:,:,JSV) = MAX((PRSVS(:,:,:,JSV) + & - PRHODJ(:,:,:)*ZDSVDT_MF(:,:,:,JSV)),XSVMIN(JSV)) -END DO -! -!!! 4. Prints the fluxes in output file -! -IF ( OMF_FLX .AND. tpfile%lopened ) THEN - ! stores the conservative potential temperature vertical flux - TZFIELD%CMNHNAME = 'MF_THW_FLX' - TZFIELD%CSTDNAME = '' - TZFIELD%CLONGNAME = 'MF_THW_FLX' - TZFIELD%CUNITS = 'K m s-1' - TZFIELD%CDIR = 'XY' - TZFIELD%CCOMMENT = 'X_Y_Z_MF_THW_FLX' - TZFIELD%NGRID = 4 - TZFIELD%NTYPE = TYPEREAL - TZFIELD%NDIMS = 3 - TZFIELD%LTIMEDEP = .TRUE. - CALL IO_Field_write(TPFILE,TZFIELD,ZFLXZTHMF) - ! - ! stores the conservative mixing ratio vertical flux - TZFIELD%CMNHNAME = 'MF_RCONSW_FLX' - TZFIELD%CSTDNAME = '' - TZFIELD%CLONGNAME = 'MF_RCONSW_FLX' - TZFIELD%CUNITS = 'K m s-1' - TZFIELD%CDIR = 'XY' - TZFIELD%CCOMMENT = 'X_Y_Z_MF_RCONSW_FLX' - TZFIELD%NGRID = 4 - TZFIELD%NTYPE = TYPEREAL - TZFIELD%NDIMS = 3 - TZFIELD%LTIMEDEP = .TRUE. - CALL IO_Field_write(TPFILE,TZFIELD,ZFLXZRMF) - ! - ! stores the theta_v vertical flux - TZFIELD%CMNHNAME = 'MF_THVW_FLX' - TZFIELD%CSTDNAME = '' - TZFIELD%CLONGNAME = 'MF_THVW_FLX' - TZFIELD%CUNITS = 'K m s-1' - TZFIELD%CDIR = 'XY' - TZFIELD%CCOMMENT = 'X_Y_Z_MF_THVW_FLX' - TZFIELD%NGRID = 4 - TZFIELD%NTYPE = TYPEREAL - TZFIELD%NDIMS = 3 - TZFIELD%LTIMEDEP = .TRUE. - CALL IO_Field_write(TPFILE,TZFIELD,PFLXZTHVMF) - ! - IF (PARAM_MFSHALLN%LMIXUV) THEN - ! stores the U momentum vertical flux - TZFIELD%CMNHNAME = 'MF_UW_FLX' - TZFIELD%CSTDNAME = '' - TZFIELD%CLONGNAME = 'MF_UW_FLX' - TZFIELD%CUNITS = 'm2 s-2' - TZFIELD%CDIR = 'XY' - TZFIELD%CCOMMENT = 'X_Y_Z_MF_UW_FLX' - TZFIELD%NGRID = 4 - TZFIELD%NTYPE = TYPEREAL - TZFIELD%NDIMS = 3 - TZFIELD%LTIMEDEP = .TRUE. - CALL IO_Field_write(TPFILE,TZFIELD,ZFLXZUMF) - ! - ! stores the V momentum vertical flux - TZFIELD%CMNHNAME = 'MF_VW_FLX' - TZFIELD%CSTDNAME = '' - TZFIELD%CLONGNAME = 'MF_VW_FLX' - TZFIELD%CUNITS = 'm2 s-2' - TZFIELD%CDIR = 'XY' - TZFIELD%CCOMMENT = 'X_Y_Z_MF_VW_FLX' - TZFIELD%NGRID = 4 - TZFIELD%NTYPE = TYPEREAL - TZFIELD%NDIMS = 3 - TZFIELD%LTIMEDEP = .TRUE. - CALL IO_Field_write(TPFILE,TZFIELD,ZFLXZVMF) - ! - END IF -END IF -! -!!! 5. Externalised LES Diagnostic for Mass Flux Scheme -!!! ------------------------------------------------ -! - CALL DIAGNOS_LES_MF(IIU,IJU,IKU,PTIME_LES, & - ZTHL_UP,ZRT_UP,ZRV_UP,ZRC_UP,ZRI_UP, & - ZU_UP,ZV_UP,ZTHV_UP,ZW_UP, & - ZFRAC_UP,ZEMF,ZDETR,ZENTR, & - ZFLXZTHMF,ZFLXZTHVMF,ZFLXZRMF, & - ZFLXZUMF,ZFLXZVMF, & - IKLCL,IKETL,IKCTL ) -! -END SUBROUTINE SHALLOW_MF_PACK diff --git a/src/mesonh/ext/switch_sbg_lesn.f90 b/src/mesonh/ext/switch_sbg_lesn.f90 deleted file mode 100644 index 2920680faff50dbca286eaea17c310b045650675..0000000000000000000000000000000000000000 --- a/src/mesonh/ext/switch_sbg_lesn.f90 +++ /dev/null @@ -1,589 +0,0 @@ -!MNH_LIC Copyright 1994-2014 CNRS, Meteo-France and Universite Paul Sabatier -!MNH_LIC This is part of the Meso-NH software governed by the CeCILL-C licence -!MNH_LIC version 1. See LICENSE, CeCILL-C_V1-en.txt and CeCILL-C_V1-fr.txt -!MNH_LIC for details. version 1. -!----------------------------------------------------------------- -!--------------- special set of characters for RCS information -!----------------------------------------------------------------- -! $Source$ $Revision$ $Date$ -!----------------------------------------------------------------- -!----------------------------------------------------------------- -! ########################## - SUBROUTINE SWITCH_SBG_LES_n -! ########################## -! -!!**** *SWITCH_SBG_LESn* - moves LES subgrid quantities from modd_les -!! to modd_lesn or the contrary. -!! -!! PURPOSE -!! ------- -! -!! -!!** IMPLICIT ARGUMENTS -!! ------------------ -!! -!! REFERENCE -!! --------- -!! -!! -!! AUTHOR -!! ------ -!! V. Masson *Meteo France* -!! -!! MODIFICATIONS -!! ------------- -!! Original June 14, 2002 -!! -!------------------------------------------------------------------------------- -! -!* 0. DECLARATIONS -! ------------ -! -USE MODD_LES -USE MODD_LES_n -USE MODD_CONF_n -USE MODD_NSV -! -USE MODI_SECOND_MNH -! -IMPLICIT NONE -! -REAL :: ZTIME1, ZTIME2 -!------------------------------------------------------------------------------- -! -!* 7.4 interactions of resolved and subgrid quantities -! ----------------------------------------------- -! -CALL SECOND_MNH(ZTIME1) -! -IF (.NOT. ASSOCIATED (X_LES_RES_W_SBG_WThl) ) THEN -! ______ - CALL LES_ALLOCATE('X_LES_RES_W_SBG_WThl',(/NLES_K,NLES_TIMES,NLES_MASKS/))! <w'w'Thl'> -! _____ - CALL LES_ALLOCATE('X_LES_RES_W_SBG_Thl2',(/NLES_K,NLES_TIMES,NLES_MASKS/))! <w'Thl'2> -! _____ - CALL LES_ALLOCATE('X_LES_RES_ddxa_U_SBG_UaU',(/NLES_K,NLES_TIMES,NLES_MASKS/))! <du'/dxa ua'u'> -! _____ - CALL LES_ALLOCATE('X_LES_RES_ddxa_V_SBG_UaV',(/NLES_K,NLES_TIMES,NLES_MASKS/))! <dv'/dxa ua'v'> -! _____ - CALL LES_ALLOCATE('X_LES_RES_ddxa_W_SBG_UaW',(/NLES_K,NLES_TIMES,NLES_MASKS/))! <dw'/dxa ua'w'> -! _______ - CALL LES_ALLOCATE('X_LES_RES_ddxa_W_SBG_UaThl',(/NLES_K,NLES_TIMES,NLES_MASKS/))! <dw'/dxa ua'Thl'> -! _____ - CALL LES_ALLOCATE('X_LES_RES_ddxa_Thl_SBG_UaW',(/NLES_K,NLES_TIMES,NLES_MASKS/))! <dThl'/dxa ua'w'> -! ___ - CALL LES_ALLOCATE('X_LES_RES_ddz_Thl_SBG_W2',(/NLES_K,NLES_TIMES,NLES_MASKS/))! <dThl'/dz w'2> -! _______ - CALL LES_ALLOCATE('X_LES_RES_ddxa_Thl_SBG_UaThl',(/NLES_K,NLES_TIMES,NLES_MASKS/))! <dThl'/dxa ua'Thl'> -! - IF (LUSERV) THEN -! _____ - CALL LES_ALLOCATE('X_LES_RES_W_SBG_WRt',(/NLES_K,NLES_TIMES,NLES_MASKS/))! <w'w'Rt'> -! ____ - CALL LES_ALLOCATE('X_LES_RES_W_SBG_Rt2',(/NLES_K,NLES_TIMES,NLES_MASKS/))! <w'Rt'2> -! _______ - CALL LES_ALLOCATE('X_LES_RES_W_SBG_ThlRt',(/NLES_K,NLES_TIMES,NLES_MASKS/))! <w'Thl'Rt'> -! ______ - CALL LES_ALLOCATE('X_LES_RES_ddxa_W_SBG_UaRt',(/NLES_K,NLES_TIMES,NLES_MASKS/))! <dw'/dxa ua'Rt'> -! _____ - CALL LES_ALLOCATE('X_LES_RES_ddxa_Rt_SBG_UaW',(/NLES_K,NLES_TIMES,NLES_MASKS/))! <dRt'/dxa ua'w'> -! ___ - CALL LES_ALLOCATE('X_LES_RES_ddz_Rt_SBG_W2',(/NLES_K,NLES_TIMES,NLES_MASKS/))! <dRt'/dz w'2> -! ______ - CALL LES_ALLOCATE('X_LES_RES_ddxa_Thl_SBG_UaRt',(/NLES_K,NLES_TIMES,NLES_MASKS/))! <dThl'/dxa ua'Rt'> -! _______ - CALL LES_ALLOCATE('X_LES_RES_ddxa_Rt_SBG_UaThl',(/NLES_K,NLES_TIMES,NLES_MASKS/))! <dRt'/dxa ua'Thl'> -! ______ - CALL LES_ALLOCATE('X_LES_RES_ddxa_Rt_SBG_UaRt',(/NLES_K,NLES_TIMES,NLES_MASKS/)) ! <dRt'/dxa ua'Rt'> - ELSE - CALL LES_ALLOCATE('X_LES_RES_W_SBG_WRt',(/0,0,0/)) - CALL LES_ALLOCATE('X_LES_RES_W_SBG_Rt2',(/0,0,0/)) - CALL LES_ALLOCATE('X_LES_RES_W_SBG_ThlRt',(/0,0,0/)) - CALL LES_ALLOCATE('X_LES_RES_ddxa_W_SBG_UaRt',(/0,0,0/)) - CALL LES_ALLOCATE('X_LES_RES_ddxa_Rt_SBG_UaW',(/0,0,0/)) - CALL LES_ALLOCATE('X_LES_RES_ddz_Rt_SBG_W2',(/0,0,0/)) - CALL LES_ALLOCATE('X_LES_RES_ddxa_Thl_SBG_UaRt',(/0,0,0/)) - CALL LES_ALLOCATE('X_LES_RES_ddxa_Rt_SBG_UaThl',(/0,0,0/)) - CALL LES_ALLOCATE('X_LES_RES_ddxa_Rt_SBG_UaRt',(/0,0,0/)) - END IF -! ______ -CALL LES_ALLOCATE('X_LES_RES_ddxa_W_SBG_UaSv',(/NLES_K,NLES_TIMES,NLES_MASKS,NSV/)) ! <dw'/dxa ua'Sv'> -! _____ -CALL LES_ALLOCATE('X_LES_RES_ddxa_Sv_SBG_UaW',(/NLES_K,NLES_TIMES,NLES_MASKS,NSV/)) ! <dSv'/dxa ua'w'> -! ___ -CALL LES_ALLOCATE('X_LES_RES_ddz_Sv_SBG_W2',(/NLES_K,NLES_TIMES,NLES_MASKS,NSV/) ) ! <dSv'/dz w'2> -! ______ -CALL LES_ALLOCATE('X_LES_RES_ddxa_Sv_SBG_UaSv',(/NLES_K,NLES_TIMES,NLES_MASKS,NSV/)) ! <dSv'/dxa ua'Sv'> -! _____ -CALL LES_ALLOCATE('X_LES_RES_W_SBG_WSv',(/NLES_K,NLES_TIMES,NLES_MASKS,NSV/)) ! <w'w'Sv'> -! ____ -CALL LES_ALLOCATE('X_LES_RES_W_SBG_Sv2',(/NLES_K,NLES_TIMES,NLES_MASKS,NSV/)) ! <w'Sv'2> -! -! - X_LES_RES_W_SBG_WThl = XLES_RES_W_SBG_WThl - X_LES_RES_W_SBG_Thl2 = XLES_RES_W_SBG_Thl2 - X_LES_RES_ddxa_U_SBG_UaU = XLES_RES_ddxa_U_SBG_UaU - X_LES_RES_ddxa_V_SBG_UaV = XLES_RES_ddxa_V_SBG_UaV - X_LES_RES_ddxa_W_SBG_UaW = XLES_RES_ddxa_W_SBG_UaW - X_LES_RES_ddxa_W_SBG_UaThl = XLES_RES_ddxa_W_SBG_UaThl - X_LES_RES_ddxa_Thl_SBG_UaW = XLES_RES_ddxa_Thl_SBG_UaW - X_LES_RES_ddz_Thl_SBG_W2 = XLES_RES_ddz_Thl_SBG_W2 - X_LES_RES_ddxa_Thl_SBG_UaThl = XLES_RES_ddxa_Thl_SBG_UaThl - IF (LUSERV) THEN - X_LES_RES_W_SBG_WRt = XLES_RES_W_SBG_WRt - X_LES_RES_W_SBG_Rt2 = XLES_RES_W_SBG_Rt2 - X_LES_RES_W_SBG_ThlRt = XLES_RES_W_SBG_ThlRt - X_LES_RES_ddxa_W_SBG_UaRt = XLES_RES_ddxa_W_SBG_UaRt - X_LES_RES_ddxa_Rt_SBG_UaW = XLES_RES_ddxa_Rt_SBG_UaW - X_LES_RES_ddz_Rt_SBG_W2 = XLES_RES_ddz_Rt_SBG_W2 - X_LES_RES_ddxa_Thl_SBG_UaRt= XLES_RES_ddxa_Thl_SBG_UaRt - X_LES_RES_ddxa_Rt_SBG_UaThl= XLES_RES_ddxa_Rt_SBG_UaThl - X_LES_RES_ddxa_Rt_SBG_UaRt = XLES_RES_ddxa_Rt_SBG_UaRt - END IF - IF (NSV>0) THEN - X_LES_RES_ddxa_W_SBG_UaSv = XLES_RES_ddxa_W_SBG_UaSv - X_LES_RES_ddxa_Sv_SBG_UaW = XLES_RES_ddxa_Sv_SBG_UaW - X_LES_RES_ddz_Sv_SBG_W2 = XLES_RES_ddz_Sv_SBG_W2 - X_LES_RES_ddxa_Sv_SBG_UaSv = XLES_RES_ddxa_Sv_SBG_UaSv - X_LES_RES_W_SBG_WSv = XLES_RES_W_SBG_WSv - X_LES_RES_W_SBG_Sv2 = XLES_RES_W_SBG_Sv2 - END IF -! -! - CALL LES_ALLOCATE('X_LES_SUBGRID_U2',(/NLES_K,NLES_TIMES,NLES_MASKS/)) ! <u'2> - CALL LES_ALLOCATE('X_LES_SUBGRID_V2',(/NLES_K,NLES_TIMES,NLES_MASKS/)) ! <v'2> - CALL LES_ALLOCATE('X_LES_SUBGRID_W2',(/NLES_K,NLES_TIMES,NLES_MASKS/)) ! <w'2> - CALL LES_ALLOCATE('X_LES_SUBGRID_Thl2',(/NLES_K,NLES_TIMES,NLES_MASKS/)) ! <Thl'2> - CALL LES_ALLOCATE('X_LES_SUBGRID_UV',(/NLES_K,NLES_TIMES,NLES_MASKS/)) ! <u'v'> - CALL LES_ALLOCATE('X_LES_SUBGRID_WU',(/NLES_K,NLES_TIMES,NLES_MASKS/)) ! <w'u'> - CALL LES_ALLOCATE('X_LES_SUBGRID_WV',(/NLES_K,NLES_TIMES,NLES_MASKS/)) ! <w'v'> - CALL LES_ALLOCATE('X_LES_SUBGRID_UThl',(/NLES_K,NLES_TIMES,NLES_MASKS/)) ! <u'Thl'> - CALL LES_ALLOCATE('X_LES_SUBGRID_VThl',(/NLES_K,NLES_TIMES,NLES_MASKS/)) ! <v'Thl'> - CALL LES_ALLOCATE('X_LES_SUBGRID_WThl',(/NLES_K,NLES_TIMES,NLES_MASKS/)) ! <w'Thl'> - CALL LES_ALLOCATE('X_LES_SUBGRID_WThv',(/NLES_K,NLES_TIMES,NLES_MASKS/)) ! <w'Thv'> - CALL LES_ALLOCATE('X_LES_SUBGRID_ThlThv',(/NLES_K,NLES_TIMES,NLES_MASKS/)) ! <Thl'Thv'> - CALL LES_ALLOCATE('X_LES_SUBGRID_W2Thl',(/NLES_K,NLES_TIMES,NLES_MASKS/)) ! <w'2Thl> - CALL LES_ALLOCATE('X_LES_SUBGRID_WThl2',(/NLES_K,NLES_TIMES,NLES_MASKS/)) ! <w'Thl'2> - CALL LES_ALLOCATE('X_LES_SUBGRID_DISS_Tke',(/NLES_K,NLES_TIMES,NLES_MASKS/)) ! <epsilon> - CALL LES_ALLOCATE('X_LES_SUBGRID_DISS_Thl2',(/NLES_K,NLES_TIMES,NLES_MASKS/)) ! <epsilon_Thl2> - CALL LES_ALLOCATE('X_LES_SUBGRID_WP',(/NLES_K,NLES_TIMES,NLES_MASKS/)) ! <w'p'> - CALL LES_ALLOCATE('X_LES_SUBGRID_PHI3',(/NLES_K,NLES_TIMES,NLES_MASKS/)) ! phi3 - CALL LES_ALLOCATE('X_LES_SUBGRID_LMix',(/NLES_K,NLES_TIMES,NLES_MASKS/)) ! Lmix - CALL LES_ALLOCATE('X_LES_SUBGRID_LDiss',(/NLES_K,NLES_TIMES,NLES_MASKS/)) ! Ldiss - CALL LES_ALLOCATE('X_LES_SUBGRID_Km',(/NLES_K,NLES_TIMES,NLES_MASKS/)) ! Km - CALL LES_ALLOCATE('X_LES_SUBGRID_Kh',(/NLES_K,NLES_TIMES,NLES_MASKS/)) ! Kh - CALL LES_ALLOCATE('X_LES_SUBGRID_ThlPz',(/NLES_K,NLES_TIMES,NLES_MASKS/)) ! <Thl'dp'/dz> - CALL LES_ALLOCATE('X_LES_SUBGRID_UTke',(/NLES_K,NLES_TIMES,NLES_MASKS/)) ! <u'Tke> - CALL LES_ALLOCATE('X_LES_SUBGRID_VTke',(/NLES_K,NLES_TIMES,NLES_MASKS/)) ! <v'Tke> - CALL LES_ALLOCATE('X_LES_SUBGRID_WTke',(/NLES_K,NLES_TIMES,NLES_MASKS/)) ! <w'Tke> - CALL LES_ALLOCATE('X_LES_SUBGRID_ddz_WTke',(/NLES_K,NLES_TIMES,NLES_MASKS/)) ! <dw'Tke/dz> - - CALL LES_ALLOCATE('X_LES_SUBGRID_THLUP_MF',(/NLES_K,NLES_TIMES,NLES_MASKS/)) ! Thl of the Updraft - CALL LES_ALLOCATE('X_LES_SUBGRID_RTUP_MF',(/NLES_K,NLES_TIMES,NLES_MASKS/)) ! Rt of the Updraft - CALL LES_ALLOCATE('X_LES_SUBGRID_RVUP_MF',(/NLES_K,NLES_TIMES,NLES_MASKS/)) ! Rv of the Updraft - CALL LES_ALLOCATE('X_LES_SUBGRID_RCUP_MF',(/NLES_K,NLES_TIMES,NLES_MASKS/)) ! Rc of the Updraft - CALL LES_ALLOCATE('X_LES_SUBGRID_RIUP_MF',(/NLES_K,NLES_TIMES,NLES_MASKS/)) ! Ri of the Updraft - CALL LES_ALLOCATE('X_LES_SUBGRID_WUP_MF',(/NLES_K,NLES_TIMES,NLES_MASKS/)) ! Thl of the Updraft - CALL LES_ALLOCATE('X_LES_SUBGRID_MASSFLUX',(/NLES_K,NLES_TIMES,NLES_MASKS/)) ! Mass Flux - CALL LES_ALLOCATE('X_LES_SUBGRID_DETR',(/NLES_K,NLES_TIMES,NLES_MASKS/)) ! Detrainment - CALL LES_ALLOCATE('X_LES_SUBGRID_ENTR',(/NLES_K,NLES_TIMES,NLES_MASKS/)) ! Entrainment - CALL LES_ALLOCATE('X_LES_SUBGRID_FRACUP',(/NLES_K,NLES_TIMES,NLES_MASKS/)) ! Updraft Fraction - CALL LES_ALLOCATE('X_LES_SUBGRID_THVUP_MF',(/NLES_K,NLES_TIMES,NLES_MASKS/)) ! Thv of the Updraft - CALL LES_ALLOCATE('X_LES_SUBGRID_WTHLMF',(/NLES_K,NLES_TIMES,NLES_MASKS/))! Flux of thl - CALL LES_ALLOCATE('X_LES_SUBGRID_WRTMF',(/NLES_K,NLES_TIMES,NLES_MASKS/)) ! Flux of rt - CALL LES_ALLOCATE('X_LES_SUBGRID_WTHVMF',(/NLES_K,NLES_TIMES,NLES_MASKS/)) ! Flux of thv - CALL LES_ALLOCATE('X_LES_SUBGRID_WUMF',(/NLES_K,NLES_TIMES,NLES_MASKS/))! Flux of u - CALL LES_ALLOCATE('X_LES_SUBGRID_WVMF',(/NLES_K,NLES_TIMES,NLES_MASKS/))! Flux of v - - IF (LUSERV ) THEN - CALL LES_ALLOCATE('X_LES_SUBGRID_Rt2',(/NLES_K,NLES_TIMES,NLES_MASKS/)) ! <Rt'2> - CALL LES_ALLOCATE('X_LES_SUBGRID_ThlRt',(/NLES_K,NLES_TIMES,NLES_MASKS/)) ! <Thl'Rt'> - CALL LES_ALLOCATE('X_LES_SUBGRID_URt',(/NLES_K,NLES_TIMES,NLES_MASKS/)) ! <u'Rt'> - CALL LES_ALLOCATE('X_LES_SUBGRID_VRt',(/NLES_K,NLES_TIMES,NLES_MASKS/)) ! <v'Rt'> - CALL LES_ALLOCATE('X_LES_SUBGRID_WRt',(/NLES_K,NLES_TIMES,NLES_MASKS/)) ! <w'Rt'> - CALL LES_ALLOCATE('X_LES_SUBGRID_RtThv',(/NLES_K,NLES_TIMES,NLES_MASKS/)) ! <Rt'Thv'> - CALL LES_ALLOCATE('X_LES_SUBGRID_W2Rt',(/NLES_K,NLES_TIMES,NLES_MASKS/)) ! <w'2Rt'> - CALL LES_ALLOCATE('X_LES_SUBGRID_WThlRt',(/NLES_K,NLES_TIMES,NLES_MASKS/)) ! <w'Thl'Rt'> - CALL LES_ALLOCATE('X_LES_SUBGRID_WRt2',(/NLES_K,NLES_TIMES,NLES_MASKS/)) ! <w'Rt'2> - CALL LES_ALLOCATE('X_LES_SUBGRID_DISS_Rt2',(/NLES_K,NLES_TIMES,NLES_MASKS/)) ! <epsilon_Rt2> - CALL LES_ALLOCATE('X_LES_SUBGRID_DISS_ThlRt',(/NLES_K,NLES_TIMES,NLES_MASKS/)) ! <epsilon_ThlRt> - CALL LES_ALLOCATE('X_LES_SUBGRID_RtPz',(/NLES_K,NLES_TIMES,NLES_MASKS/)) ! <Rt'dp'/dz> - CALL LES_ALLOCATE('X_LES_SUBGRID_PSI3',(/NLES_K,NLES_TIMES,NLES_MASKS/)) ! psi3 - ELSE - CALL LES_ALLOCATE('X_LES_SUBGRID_Rt2',(/0,0,0/)) - CALL LES_ALLOCATE('X_LES_SUBGRID_ThlRt',(/0,0,0/)) - CALL LES_ALLOCATE('X_LES_SUBGRID_URt',(/0,0,0/)) - CALL LES_ALLOCATE('X_LES_SUBGRID_VRt',(/0,0,0/)) - CALL LES_ALLOCATE('X_LES_SUBGRID_WRt',(/0,0,0/)) - CALL LES_ALLOCATE('X_LES_SUBGRID_RtThv',(/0,0,0/)) - CALL LES_ALLOCATE('X_LES_SUBGRID_W2Rt',(/0,0,0/)) - CALL LES_ALLOCATE('X_LES_SUBGRID_WThlRt',(/0,0,0/)) - CALL LES_ALLOCATE('X_LES_SUBGRID_WRt2',(/0,0,0/)) - CALL LES_ALLOCATE('X_LES_SUBGRID_DISS_Rt2',(/0,0,0/)) - CALL LES_ALLOCATE('X_LES_SUBGRID_DISS_ThlRt',(/0,0,0/)) - CALL LES_ALLOCATE('X_LES_SUBGRID_RtPz',(/0,0,0/)) - CALL LES_ALLOCATE('X_LES_SUBGRID_PSI3',(/0,0,0/)) - END IF - IF (LUSERC ) THEN - CALL LES_ALLOCATE('X_LES_SUBGRID_Rc2',(/NLES_K,NLES_TIMES,NLES_MASKS/)) ! <Rc'2> - CALL LES_ALLOCATE('X_LES_SUBGRID_URc',(/NLES_K,NLES_TIMES,NLES_MASKS/)) ! <u'Rc'> - CALL LES_ALLOCATE('X_LES_SUBGRID_VRc',(/NLES_K,NLES_TIMES,NLES_MASKS/)) ! <v'Rc'> - CALL LES_ALLOCATE('X_LES_SUBGRID_WRc',(/NLES_K,NLES_TIMES,NLES_MASKS/)) ! <w'Rc'> - ELSE - CALL LES_ALLOCATE('X_LES_SUBGRID_Rc2',(/0,0,0/)) - CALL LES_ALLOCATE('X_LES_SUBGRID_URc',(/0,0,0/)) - CALL LES_ALLOCATE('X_LES_SUBGRID_VRc',(/0,0,0/)) - CALL LES_ALLOCATE('X_LES_SUBGRID_WRc',(/0,0,0/)) - END IF - IF (LUSERI ) THEN - CALL LES_ALLOCATE('X_LES_SUBGRID_Ri2',(/NLES_K,NLES_TIMES,NLES_MASKS/)) ! <Ri'2> - ELSE - CALL LES_ALLOCATE('X_LES_SUBGRID_Ri2',(/0,0,0/)) - END IF - IF (NSV>0 ) THEN - CALL LES_ALLOCATE('X_LES_SUBGRID_USv',(/NLES_K,NLES_TIMES,NLES_MASKS,NSV/)) ! <u'Sv'> - CALL LES_ALLOCATE('X_LES_SUBGRID_VSv',(/NLES_K,NLES_TIMES,NLES_MASKS,NSV/)) ! <v'Sv'> - CALL LES_ALLOCATE('X_LES_SUBGRID_WSv',(/NLES_K,NLES_TIMES,NLES_MASKS,NSV/)) ! <w'Sv'> - CALL LES_ALLOCATE('X_LES_SUBGRID_Sv2',(/NLES_K,NLES_TIMES,NLES_MASKS,NSV/)) ! <Sv'2> - CALL LES_ALLOCATE('X_LES_SUBGRID_SvThv',(/NLES_K,NLES_TIMES,NLES_MASKS,NSV/)) ! <Sv'Thv'> - CALL LES_ALLOCATE('X_LES_SUBGRID_W2Sv',(/NLES_K,NLES_TIMES,NLES_MASKS,NSV/)) ! <w'2Sv'> - CALL LES_ALLOCATE('X_LES_SUBGRID_WSv2',(/NLES_K,NLES_TIMES,NLES_MASKS,NSV/)) ! <w'Sv'2> - CALL LES_ALLOCATE('X_LES_SUBGRID_DISS_Sv2',(/NLES_K,NLES_TIMES,NLES_MASKS,NSV/)) ! <epsilon_Sv2> - CALL LES_ALLOCATE('X_LES_SUBGRID_SvPz',(/NLES_K,NLES_TIMES,NLES_MASKS,NSV/)) ! <Sv'dp'/dz> - ELSE - CALL LES_ALLOCATE('X_LES_SUBGRID_USv',(/0,0,0,0/)) - CALL LES_ALLOCATE('X_LES_SUBGRID_VSv',(/0,0,0,0/)) - CALL LES_ALLOCATE('X_LES_SUBGRID_WSv',(/0,0,0,0/)) - CALL LES_ALLOCATE('X_LES_SUBGRID_Sv2',(/0,0,0,0/)) - CALL LES_ALLOCATE('X_LES_SUBGRID_SvThv',(/0,0,0,0/)) - CALL LES_ALLOCATE('X_LES_SUBGRID_W2Sv',(/0,0,0,0/)) - CALL LES_ALLOCATE('X_LES_SUBGRID_WSv2',(/0,0,0,0/)) - CALL LES_ALLOCATE('X_LES_SUBGRID_DISS_Sv2',(/0,0,0,0/)) - CALL LES_ALLOCATE('X_LES_SUBGRID_SvPz',(/0,0,0,0/)) - END IF -! - X_LES_SUBGRID_U2 = XLES_SUBGRID_U2 - X_LES_SUBGRID_V2 = XLES_SUBGRID_V2 - X_LES_SUBGRID_W2 = XLES_SUBGRID_W2 - X_LES_SUBGRID_Thl2= XLES_SUBGRID_Thl2 - X_LES_SUBGRID_UV = XLES_SUBGRID_UV - X_LES_SUBGRID_WU = XLES_SUBGRID_WU - X_LES_SUBGRID_WV = XLES_SUBGRID_WV - X_LES_SUBGRID_UThl= XLES_SUBGRID_UThl - X_LES_SUBGRID_VThl= XLES_SUBGRID_VThl - X_LES_SUBGRID_WThl= XLES_SUBGRID_WThl - X_LES_SUBGRID_WThv = XLES_SUBGRID_WThv - X_LES_SUBGRID_ThlThv = XLES_SUBGRID_ThlThv - X_LES_SUBGRID_W2Thl = XLES_SUBGRID_W2Thl - X_LES_SUBGRID_WThl2 = XLES_SUBGRID_WThl2 - X_LES_SUBGRID_DISS_Tke = XLES_SUBGRID_DISS_Tke - X_LES_SUBGRID_DISS_Thl2= XLES_SUBGRID_DISS_Thl2 - X_LES_SUBGRID_WP = XLES_SUBGRID_WP - X_LES_SUBGRID_PHI3 = XLES_SUBGRID_PHI3 - X_LES_SUBGRID_LMix = XLES_SUBGRID_LMix - X_LES_SUBGRID_LDiss = XLES_SUBGRID_LDiss - X_LES_SUBGRID_Km = XLES_SUBGRID_Km - X_LES_SUBGRID_Kh = XLES_SUBGRID_Kh - X_LES_SUBGRID_ThlPz = XLES_SUBGRID_ThlPz - X_LES_SUBGRID_UTke= XLES_SUBGRID_UTke - X_LES_SUBGRID_VTke= XLES_SUBGRID_VTke - X_LES_SUBGRID_WTke= XLES_SUBGRID_WTke - X_LES_SUBGRID_ddz_WTke =XLES_SUBGRID_ddz_WTke - - X_LES_SUBGRID_THLUP_MF = XLES_SUBGRID_THLUP_MF - X_LES_SUBGRID_RTUP_MF = XLES_SUBGRID_RTUP_MF - X_LES_SUBGRID_RVUP_MF = XLES_SUBGRID_RVUP_MF - X_LES_SUBGRID_RCUP_MF = XLES_SUBGRID_RCUP_MF - X_LES_SUBGRID_RIUP_MF = XLES_SUBGRID_RIUP_MF - X_LES_SUBGRID_WUP_MF = XLES_SUBGRID_WUP_MF - X_LES_SUBGRID_MASSFLUX = XLES_SUBGRID_MASSFLUX - X_LES_SUBGRID_DETR = XLES_SUBGRID_DETR - X_LES_SUBGRID_ENTR = XLES_SUBGRID_ENTR - X_LES_SUBGRID_FRACUP = XLES_SUBGRID_FRACUP - X_LES_SUBGRID_THVUP_MF = XLES_SUBGRID_THVUP_MF - X_LES_SUBGRID_WTHLMF = XLES_SUBGRID_WTHLMF - X_LES_SUBGRID_WRTMF = XLES_SUBGRID_WRTMF - X_LES_SUBGRID_WTHVMF = XLES_SUBGRID_WTHVMF - X_LES_SUBGRID_WUMF = XLES_SUBGRID_WUMF - X_LES_SUBGRID_WVMF = XLES_SUBGRID_WVMF - - IF (LUSERV ) THEN - X_LES_SUBGRID_Rt2 = XLES_SUBGRID_Rt2 - X_LES_SUBGRID_ThlRt= XLES_SUBGRID_ThlRt - X_LES_SUBGRID_URt = XLES_SUBGRID_URt - X_LES_SUBGRID_VRt = XLES_SUBGRID_VRt - X_LES_SUBGRID_WRt = XLES_SUBGRID_WRt - X_LES_SUBGRID_RtThv = XLES_SUBGRID_RtThv - X_LES_SUBGRID_W2Rt = XLES_SUBGRID_W2Rt - X_LES_SUBGRID_WThlRt = XLES_SUBGRID_WThlRt - X_LES_SUBGRID_WRt2 = XLES_SUBGRID_WRt2 - X_LES_SUBGRID_DISS_Rt2= XLES_SUBGRID_DISS_Rt2 - X_LES_SUBGRID_DISS_ThlRt= XLES_SUBGRID_DISS_ThlRt - X_LES_SUBGRID_RtPz = XLES_SUBGRID_RtPz - X_LES_SUBGRID_PSI3 = XLES_SUBGRID_PSI3 - END IF - IF (LUSERC ) THEN - X_LES_SUBGRID_Rc2 = XLES_SUBGRID_Rc2 - X_LES_SUBGRID_URc = XLES_SUBGRID_URc - X_LES_SUBGRID_VRc = XLES_SUBGRID_VRc - X_LES_SUBGRID_WRc = XLES_SUBGRID_WRc - END IF - IF (LUSERI ) THEN - X_LES_SUBGRID_Ri2 = XLES_SUBGRID_Ri2 - END IF - IF (NSV>0 ) THEN - X_LES_SUBGRID_USv = XLES_SUBGRID_USv - X_LES_SUBGRID_VSv = XLES_SUBGRID_VSv - X_LES_SUBGRID_WSv = XLES_SUBGRID_WSv - X_LES_SUBGRID_Sv2 = XLES_SUBGRID_Sv2 - X_LES_SUBGRID_SvThv = XLES_SUBGRID_SvThv - X_LES_SUBGRID_W2Sv = XLES_SUBGRID_W2Sv - X_LES_SUBGRID_WSv2 = XLES_SUBGRID_WSv2 - X_LES_SUBGRID_DISS_Sv2 = XLES_SUBGRID_DISS_Sv2 - X_LES_SUBGRID_SvPz = XLES_SUBGRID_SvPz - END IF -! -! - CALL LES_ALLOCATE('X_LES_UW0',(/NLES_TIMES/)) - CALL LES_ALLOCATE('X_LES_VW0',(/NLES_TIMES/)) - CALL LES_ALLOCATE('X_LES_USTAR',(/NLES_TIMES/)) - CALL LES_ALLOCATE('X_LES_Q0',(/NLES_TIMES/)) - CALL LES_ALLOCATE('X_LES_E0',(/NLES_TIMES/)) - CALL LES_ALLOCATE('X_LES_SV0',(/NLES_TIMES,NSV/)) -! - X_LES_UW0 = XLES_UW0 - X_LES_VW0 = XLES_VW0 - X_LES_USTAR = XLES_USTAR - X_LES_Q0 = XLES_Q0 - X_LES_E0 = XLES_E0 - IF (NSV>0) X_LES_SV0 = XLES_SV0 - -ELSE -! - XLES_RES_W_SBG_WThl = X_LES_RES_W_SBG_WThl - XLES_RES_W_SBG_Thl2 = X_LES_RES_W_SBG_Thl2 - XLES_RES_ddxa_U_SBG_UaU = X_LES_RES_ddxa_U_SBG_UaU - XLES_RES_ddxa_V_SBG_UaV = X_LES_RES_ddxa_V_SBG_UaV - XLES_RES_ddxa_W_SBG_UaW = X_LES_RES_ddxa_W_SBG_UaW - XLES_RES_ddxa_W_SBG_UaThl = X_LES_RES_ddxa_W_SBG_UaThl - XLES_RES_ddxa_Thl_SBG_UaW = X_LES_RES_ddxa_Thl_SBG_UaW - XLES_RES_ddz_Thl_SBG_W2 = X_LES_RES_ddz_Thl_SBG_W2 - XLES_RES_ddxa_Thl_SBG_UaThl = X_LES_RES_ddxa_Thl_SBG_UaThl - IF (LUSERV) THEN - XLES_RES_W_SBG_WRt = X_LES_RES_W_SBG_WRt - XLES_RES_W_SBG_Rt2 = X_LES_RES_W_SBG_Rt2 - XLES_RES_W_SBG_ThlRt = X_LES_RES_W_SBG_ThlRt - XLES_RES_ddxa_W_SBG_UaRt = X_LES_RES_ddxa_W_SBG_UaRt - XLES_RES_ddxa_Rt_SBG_UaW = X_LES_RES_ddxa_Rt_SBG_UaW - XLES_RES_ddz_Rt_SBG_W2 = X_LES_RES_ddz_Rt_SBG_W2 - XLES_RES_ddxa_Thl_SBG_UaRt= X_LES_RES_ddxa_Thl_SBG_UaRt - XLES_RES_ddxa_Rt_SBG_UaThl= X_LES_RES_ddxa_Rt_SBG_UaThl - XLES_RES_ddxa_Rt_SBG_UaRt = X_LES_RES_ddxa_Rt_SBG_UaRt - END IF - IF (NSV>0) THEN - XLES_RES_ddxa_W_SBG_UaSv = X_LES_RES_ddxa_W_SBG_UaSv - XLES_RES_ddxa_Sv_SBG_UaW = X_LES_RES_ddxa_Sv_SBG_UaW - XLES_RES_ddz_Sv_SBG_W2 = X_LES_RES_ddz_Sv_SBG_W2 - XLES_RES_ddxa_Sv_SBG_UaSv = X_LES_RES_ddxa_Sv_SBG_UaSv - XLES_RES_W_SBG_WSv = X_LES_RES_W_SBG_WSv - XLES_RES_W_SBG_Sv2 = X_LES_RES_W_SBG_Sv2 - END IF - XLES_SUBGRID_U2 = X_LES_SUBGRID_U2 - XLES_SUBGRID_V2 = X_LES_SUBGRID_V2 - XLES_SUBGRID_W2 = X_LES_SUBGRID_W2 - XLES_SUBGRID_Thl2= X_LES_SUBGRID_Thl2 - XLES_SUBGRID_UV = X_LES_SUBGRID_UV - XLES_SUBGRID_WU = X_LES_SUBGRID_WU - XLES_SUBGRID_WV = X_LES_SUBGRID_WV - XLES_SUBGRID_UThl= X_LES_SUBGRID_UThl - XLES_SUBGRID_VThl= X_LES_SUBGRID_VThl - XLES_SUBGRID_WThl= X_LES_SUBGRID_WThl - XLES_SUBGRID_WThv = X_LES_SUBGRID_WThv - XLES_SUBGRID_ThlThv = X_LES_SUBGRID_ThlThv - XLES_SUBGRID_W2Thl = X_LES_SUBGRID_W2Thl - XLES_SUBGRID_WThl2 = X_LES_SUBGRID_WThl2 - XLES_SUBGRID_DISS_Tke = X_LES_SUBGRID_DISS_Tke - XLES_SUBGRID_DISS_Thl2= X_LES_SUBGRID_DISS_Thl2 - XLES_SUBGRID_WP = X_LES_SUBGRID_WP - XLES_SUBGRID_PHI3 = X_LES_SUBGRID_PHI3 - XLES_SUBGRID_LMix = X_LES_SUBGRID_LMix - XLES_SUBGRID_LDiss = X_LES_SUBGRID_LDiss - XLES_SUBGRID_Km = X_LES_SUBGRID_Km - XLES_SUBGRID_Kh = X_LES_SUBGRID_Kh - XLES_SUBGRID_ThlPz = X_LES_SUBGRID_ThlPz - XLES_SUBGRID_UTke= X_LES_SUBGRID_UTke - XLES_SUBGRID_VTke= X_LES_SUBGRID_VTke - XLES_SUBGRID_WTke= X_LES_SUBGRID_WTke - XLES_SUBGRID_ddz_WTke =X_LES_SUBGRID_ddz_WTke - - XLES_SUBGRID_THLUP_MF = X_LES_SUBGRID_THLUP_MF - XLES_SUBGRID_RTUP_MF = X_LES_SUBGRID_RTUP_MF - XLES_SUBGRID_RVUP_MF = X_LES_SUBGRID_RVUP_MF - XLES_SUBGRID_RCUP_MF = X_LES_SUBGRID_RCUP_MF - XLES_SUBGRID_RIUP_MF = X_LES_SUBGRID_RIUP_MF - XLES_SUBGRID_WUP_MF = X_LES_SUBGRID_WUP_MF - XLES_SUBGRID_MASSFLUX = X_LES_SUBGRID_MASSFLUX - XLES_SUBGRID_DETR = X_LES_SUBGRID_DETR - XLES_SUBGRID_ENTR = X_LES_SUBGRID_ENTR - XLES_SUBGRID_FRACUP = X_LES_SUBGRID_FRACUP - XLES_SUBGRID_THVUP_MF = X_LES_SUBGRID_THVUP_MF - XLES_SUBGRID_WTHLMF = X_LES_SUBGRID_WTHLMF - XLES_SUBGRID_WRTMF = X_LES_SUBGRID_WRTMF - XLES_SUBGRID_WTHVMF = X_LES_SUBGRID_WTHVMF - XLES_SUBGRID_WUMF = X_LES_SUBGRID_WUMF - XLES_SUBGRID_WVMF = X_LES_SUBGRID_WVMF - - IF (LUSERV ) THEN - XLES_SUBGRID_Rt2 = X_LES_SUBGRID_Rt2 - XLES_SUBGRID_ThlRt= X_LES_SUBGRID_ThlRt - XLES_SUBGRID_URt = X_LES_SUBGRID_URt - XLES_SUBGRID_VRt = X_LES_SUBGRID_VRt - XLES_SUBGRID_WRt = X_LES_SUBGRID_WRt - XLES_SUBGRID_RtThv = X_LES_SUBGRID_RtThv - XLES_SUBGRID_W2Rt = X_LES_SUBGRID_W2Rt - XLES_SUBGRID_WThlRt = X_LES_SUBGRID_WThlRt - XLES_SUBGRID_WRt2 = X_LES_SUBGRID_WRt2 - XLES_SUBGRID_DISS_Rt2= X_LES_SUBGRID_DISS_Rt2 - XLES_SUBGRID_DISS_ThlRt= X_LES_SUBGRID_DISS_ThlRt - XLES_SUBGRID_RtPz = X_LES_SUBGRID_RtPz - XLES_SUBGRID_PSI3 = X_LES_SUBGRID_PSI3 - END IF - IF (LUSERC ) THEN - XLES_SUBGRID_Rc2 = X_LES_SUBGRID_Rc2 - XLES_SUBGRID_URc = X_LES_SUBGRID_URc - XLES_SUBGRID_VRc = X_LES_SUBGRID_VRc - XLES_SUBGRID_WRc = X_LES_SUBGRID_WRc - END IF - IF (LUSERI ) THEN - XLES_SUBGRID_Ri2 = X_LES_SUBGRID_Ri2 - END IF - IF (NSV>0 ) THEN - XLES_SUBGRID_USv = X_LES_SUBGRID_USv - XLES_SUBGRID_VSv = X_LES_SUBGRID_VSv - XLES_SUBGRID_WSv = X_LES_SUBGRID_WSv - XLES_SUBGRID_Sv2 = X_LES_SUBGRID_Sv2 - XLES_SUBGRID_SvThv = X_LES_SUBGRID_SvThv - XLES_SUBGRID_W2Sv = X_LES_SUBGRID_W2Sv - XLES_SUBGRID_WSv2 = X_LES_SUBGRID_WSv2 - XLES_SUBGRID_DISS_Sv2 = X_LES_SUBGRID_DISS_Sv2 - XLES_SUBGRID_SvPz = X_LES_SUBGRID_SvPz - END IF - XLES_UW0 = X_LES_UW0 - XLES_VW0 = X_LES_VW0 - XLES_USTAR = X_LES_USTAR - XLES_Q0 = X_LES_Q0 - XLES_E0 = X_LES_E0 - IF (NSV>0) XLES_SV0 = X_LES_SV0 -! - CALL LES_DEALLOCATE('X_LES_RES_W_SBG_WThl') - CALL LES_DEALLOCATE('X_LES_RES_W_SBG_Thl2') - CALL LES_DEALLOCATE('X_LES_RES_ddxa_U_SBG_UaU') - CALL LES_DEALLOCATE('X_LES_RES_ddxa_V_SBG_UaV') - CALL LES_DEALLOCATE('X_LES_RES_ddxa_W_SBG_UaW') - CALL LES_DEALLOCATE('X_LES_RES_ddxa_W_SBG_UaThl') - CALL LES_DEALLOCATE('X_LES_RES_ddxa_Thl_SBG_UaW') - CALL LES_DEALLOCATE('X_LES_RES_ddz_Thl_SBG_W2') - CALL LES_DEALLOCATE('X_LES_RES_ddxa_Thl_SBG_UaThl') - CALL LES_DEALLOCATE('X_LES_RES_W_SBG_WRt') - CALL LES_DEALLOCATE('X_LES_RES_W_SBG_Rt2') - CALL LES_DEALLOCATE('X_LES_RES_W_SBG_ThlRt') - CALL LES_DEALLOCATE('X_LES_RES_ddxa_W_SBG_UaRt') - CALL LES_DEALLOCATE('X_LES_RES_ddxa_Rt_SBG_UaW') - CALL LES_DEALLOCATE('X_LES_RES_ddz_Rt_SBG_W2') - CALL LES_DEALLOCATE('X_LES_RES_ddxa_Thl_SBG_UaRt') - CALL LES_DEALLOCATE('X_LES_RES_ddxa_Rt_SBG_UaThl') - CALL LES_DEALLOCATE('X_LES_RES_ddxa_Rt_SBG_UaRt') - CALL LES_DEALLOCATE('X_LES_RES_ddxa_W_SBG_UaSv') - CALL LES_DEALLOCATE('X_LES_RES_ddxa_Sv_SBG_UaW') - CALL LES_DEALLOCATE('X_LES_RES_ddz_Sv_SBG_W2') - CALL LES_DEALLOCATE('X_LES_RES_ddxa_Sv_SBG_UaSv') - CALL LES_DEALLOCATE('X_LES_RES_W_SBG_WSv') - CALL LES_DEALLOCATE('X_LES_RES_W_SBG_Sv2') -! - CALL LES_DEALLOCATE('X_LES_SUBGRID_U2') - CALL LES_DEALLOCATE('X_LES_SUBGRID_V2') - CALL LES_DEALLOCATE('X_LES_SUBGRID_W2') - CALL LES_DEALLOCATE('X_LES_SUBGRID_Thl2') - CALL LES_DEALLOCATE('X_LES_SUBGRID_UV') - CALL LES_DEALLOCATE('X_LES_SUBGRID_WU') - CALL LES_DEALLOCATE('X_LES_SUBGRID_WV') - CALL LES_DEALLOCATE('X_LES_SUBGRID_UThl') - CALL LES_DEALLOCATE('X_LES_SUBGRID_VThl') - CALL LES_DEALLOCATE('X_LES_SUBGRID_WThl') - CALL LES_DEALLOCATE('X_LES_SUBGRID_WThv') - CALL LES_DEALLOCATE('X_LES_SUBGRID_ThlThv') - CALL LES_DEALLOCATE('X_LES_SUBGRID_W2Thl') - CALL LES_DEALLOCATE('X_LES_SUBGRID_WThl2') - CALL LES_DEALLOCATE('X_LES_SUBGRID_DISS_Tke') - CALL LES_DEALLOCATE('X_LES_SUBGRID_DISS_Thl2') - CALL LES_DEALLOCATE('X_LES_SUBGRID_WP') - CALL LES_DEALLOCATE('X_LES_SUBGRID_PHI3') - CALL LES_DEALLOCATE('X_LES_SUBGRID_LMix') - CALL LES_DEALLOCATE('X_LES_SUBGRID_LDiss') - CALL LES_DEALLOCATE('X_LES_SUBGRID_Km') - CALL LES_DEALLOCATE('X_LES_SUBGRID_Kh') - CALL LES_DEALLOCATE('X_LES_SUBGRID_ThlPz') - CALL LES_DEALLOCATE('X_LES_SUBGRID_UTke') - CALL LES_DEALLOCATE('X_LES_SUBGRID_VTke') - CALL LES_DEALLOCATE('X_LES_SUBGRID_WTke') - CALL LES_DEALLOCATE('X_LES_SUBGRID_ddz_WTke') - - CALL LES_DEALLOCATE('X_LES_SUBGRID_THLUP_MF') - CALL LES_DEALLOCATE('X_LES_SUBGRID_RTUP_MF') - CALL LES_DEALLOCATE('X_LES_SUBGRID_RVUP_MF') - CALL LES_DEALLOCATE('X_LES_SUBGRID_RCUP_MF') - CALL LES_DEALLOCATE('X_LES_SUBGRID_RIUP_MF') - CALL LES_DEALLOCATE('X_LES_SUBGRID_WUP_MF') - CALL LES_DEALLOCATE('X_LES_SUBGRID_MASSFLUX') - CALL LES_DEALLOCATE('X_LES_SUBGRID_DETR') - CALL LES_DEALLOCATE('X_LES_SUBGRID_ENTR') - CALL LES_DEALLOCATE('X_LES_SUBGRID_FRACUP') - CALL LES_DEALLOCATE('X_LES_SUBGRID_THVUP_MF') - CALL LES_DEALLOCATE('X_LES_SUBGRID_WTHLMF') - CALL LES_DEALLOCATE('X_LES_SUBGRID_WRTMF') - CALL LES_DEALLOCATE('X_LES_SUBGRID_WTHVMF') - CALL LES_DEALLOCATE('X_LES_SUBGRID_WUMF') - CALL LES_DEALLOCATE('X_LES_SUBGRID_WVMF') - - CALL LES_DEALLOCATE('X_LES_SUBGRID_Rt2') - CALL LES_DEALLOCATE('X_LES_SUBGRID_ThlRt') - CALL LES_DEALLOCATE('X_LES_SUBGRID_URt') - CALL LES_DEALLOCATE('X_LES_SUBGRID_VRt') - CALL LES_DEALLOCATE('X_LES_SUBGRID_WRt') - CALL LES_DEALLOCATE('X_LES_SUBGRID_RtThv') - CALL LES_DEALLOCATE('X_LES_SUBGRID_W2Rt') - CALL LES_DEALLOCATE('X_LES_SUBGRID_WThlRt') - CALL LES_DEALLOCATE('X_LES_SUBGRID_WRt2') - CALL LES_DEALLOCATE('X_LES_SUBGRID_DISS_Rt2') - CALL LES_DEALLOCATE('X_LES_SUBGRID_DISS_ThlRt') - CALL LES_DEALLOCATE('X_LES_SUBGRID_RtPz') - CALL LES_DEALLOCATE('X_LES_SUBGRID_PSI3') - CALL LES_DEALLOCATE('X_LES_SUBGRID_Rc2') - CALL LES_DEALLOCATE('X_LES_SUBGRID_URc') - CALL LES_DEALLOCATE('X_LES_SUBGRID_VRc') - CALL LES_DEALLOCATE('X_LES_SUBGRID_WRc') - CALL LES_DEALLOCATE('X_LES_SUBGRID_Ri2') - CALL LES_DEALLOCATE('X_LES_SUBGRID_USv') - CALL LES_DEALLOCATE('X_LES_SUBGRID_VSv') - CALL LES_DEALLOCATE('X_LES_SUBGRID_WSv') - CALL LES_DEALLOCATE('X_LES_SUBGRID_Sv2') - CALL LES_DEALLOCATE('X_LES_SUBGRID_SvThv') - CALL LES_DEALLOCATE('X_LES_SUBGRID_W2Sv') - CALL LES_DEALLOCATE('X_LES_SUBGRID_WSv2') - CALL LES_DEALLOCATE('X_LES_SUBGRID_DISS_Sv2') - CALL LES_DEALLOCATE('X_LES_SUBGRID_SvPz') - ! - CALL LES_DEALLOCATE('X_LES_UW0') - CALL LES_DEALLOCATE('X_LES_VW0') - CALL LES_DEALLOCATE('X_LES_USTAR') - CALL LES_DEALLOCATE('X_LES_Q0') - CALL LES_DEALLOCATE('X_LES_E0') - CALL LES_DEALLOCATE('X_LES_SV0') -! -END IF -! -CALL SECOND_MNH(ZTIME2) -! -XTIME_LES = XTIME_LES + ZTIME2 - ZTIME1 -! -END SUBROUTINE SWITCH_SBG_LES_n diff --git a/src/mesonh/ext/write_lesn.f90 b/src/mesonh/ext/write_lesn.f90 deleted file mode 100644 index 9b6b326bc92ca2ebae7d62a7019a319903edebc4..0000000000000000000000000000000000000000 --- a/src/mesonh/ext/write_lesn.f90 +++ /dev/null @@ -1,1319 +0,0 @@ -!MNH_LIC Copyright 2000-2021 CNRS, Meteo-France and Universite Paul Sabatier -!MNH_LIC This is part of the Meso-NH software governed by the CeCILL-C licence -!MNH_LIC version 1. See LICENSE, CeCILL-C_V1-en.txt and CeCILL-C_V1-fr.txt -!MNH_LIC for details. version 1. -!----------------------------------------------------------------- -!###################### -module mode_write_les_n -!###################### - -use modd_field, only: tfield_metadata_base - -implicit none - -private - -public :: Write_les_n - - -character(len=:), allocatable :: cgroup -character(len=:), allocatable :: cgroupcomment - -logical :: ldoavg ! Compute and store time average -logical :: ldonorm ! Compute and store normalized field - -type(tfield_metadata_base) :: tfield -type(tfield_metadata_base) :: tfieldx -type(tfield_metadata_base) :: tfieldy - -interface Les_diachro_write - module procedure Les_diachro_write_1D, Les_diachro_write_2D, Les_diachro_write_3D, Les_diachro_write_4D -end interface - -contains - -!################################### -subroutine Write_les_n( tpdiafile ) -!################################### -! -! -!!**** *WRITE_LES_n* writes the LES final diagnostics for model _n -!! -!! -!! PURPOSE -!! ------- -!! -!! EXTERNAL -!! -------- -!! -!! IMPLICIT ARGUMENTS -!! ------------------ -!! -!! REFERENCE -!! --------- -!! -!! AUTHOR -!! ------ -!! V. Masson -!! -!! MODIFICATIONS -!! ------------- -!! Original 07/02/00 -!! 01/02/01 (D. Gazen) add module MODD_NSV for NSV variable -!! 06/11/02 (V. Masson) some minor bugs -!! 01/04/03 (V. Masson) idem -!! 10/10/09 (P. Aumond) Add user multimaskS -!! 11/15 (C.Lac) Add production terms of TKE -!! 10/2016 (C.Lac) Add droplet deposition -! P. Wautelet 05/2016-04/2018: new data structures and calls for I/O -! C. Lac 02/2019: add rain fraction as a LES diagnostic -! P. Wautelet 13/09/2019: budget: simplify and modernize date/time management -! P. Wautelet 12/10/2020: remove HLES_AVG dummy argument and group all 4 calls -! P. Wautelet 13/10/2020: bugfix: correct some names for LES_DIACHRO_2PT diagnostics (Ri) -! P. Wautelet 26/10/2020: bugfix: correct some comments and conditions + add missing RES_RTPZ -! P. Wautelet 26/10/2020: restructure subroutines to use tfield_metadata_base type -! -------------------------------------------------------------------------- -! -!* 0. DECLARATIONS -! ------------ -! -use modd_conf_n, only: luserv, luserc, luserr, luseri, lusers, luserg, luserh -use modd_io, only: tfiledata -use modd_field, only: NMNHDIM_BUDGET_LES_TIME, NMNHDIM_BUDGET_LES_LEVEL, NMNHDIM_BUDGET_LES_SV, NMNHDIM_BUDGET_LES_MASK, & - NMNHDIM_BUDGET_LES_PDF, & - NMNHDIM_SPECTRA_2PTS_NI, NMNHDIM_SPECTRA_2PTS_NJ, NMNHDIM_SPECTRA_LEVEL, NMNHDIM_UNUSED, & - TYPEREAL -use modd_grid_n, only: xdxhat, xdyhat -use modd_nsv, only: nsv -use modd_les -use modd_les_n -use modd_param_n, only: ccloud -use modd_param_c2r2, only: ldepoc -use modd_param_ice, only: ldeposc -use modd_parameters, only: XUNDEF - -use mode_les_spec_n, only: Les_spec_n -use mode_modeln_handler, only: Get_current_model_index -use mode_write_les_budget_n, only: Write_les_budget_n -use mode_write_les_rt_budget_n, only: Write_les_rt_budget_n -use mode_write_les_sv_budget_n, only: Write_les_sv_budget_n - -IMPLICIT NONE -! -!* 0.1 declarations of arguments -! -TYPE(TFILEDATA), INTENT(IN) :: TPDIAFILE! file to write -! -! -!* 0.2 declaration of local variables -! -INTEGER :: IMASK -! -INTEGER :: JSV ! scalar loop counter -INTEGER :: JI ! loop counter -! -character(len=3) :: ynum -CHARACTER(len=5) :: YGROUP -character(len=7), dimension(nles_masks) :: ymasks -! -logical :: gdoavg ! Compute and store time average -logical :: gdonorm ! Compute and store normalized field -REAL, DIMENSION(:,:,:), ALLOCATABLE :: ZAVG_PTS_ll -REAL, DIMENSION(:,:,:), ALLOCATABLE :: ZUND_PTS_ll -REAL :: ZCART_PTS_ll -INTEGER :: IMI ! Current model inde -! -!------------------------------------------------------------------------------- -! -IF (.NOT. LLES) RETURN -! -! -!* 1. Initializations -! --------------- -! -IMI = GET_CURRENT_MODEL_INDEX() -! -! -!* 1.1 Normalization variables -! ----------------------- -! -IF (CLES_NORM_TYPE/='NONE' ) THEN - CALL LES_ALLOCATE('XLES_NORM_M', (/NLES_TIMES/)) - CALL LES_ALLOCATE('XLES_NORM_S', (/NLES_TIMES/)) - CALL LES_ALLOCATE('XLES_NORM_K', (/NLES_TIMES/)) - CALL LES_ALLOCATE('XLES_NORM_RHO',(/NLES_TIMES/)) - CALL LES_ALLOCATE('XLES_NORM_RV', (/NLES_TIMES/)) - CALL LES_ALLOCATE('XLES_NORM_SV', (/NLES_TIMES,NSV/)) - CALL LES_ALLOCATE('XLES_NORM_P', (/NLES_TIMES/)) - ! - IF (CLES_NORM_TYPE=='CONV') THEN - WHERE (XLES_WSTAR(:)>0.) - XLES_NORM_M(:) = XLES_BL_HEIGHT(:) - XLES_NORM_S(:) = XLES_NORM_M(:) / XLES_WSTAR(:) - XLES_NORM_K(:) = XLES_Q0(:) / XLES_WSTAR(:) - XLES_NORM_RHO(:) = XLES_MEAN_RHO(1,:,1) - XLES_NORM_RV(:) = XLES_E0(:) / XLES_WSTAR(:) - XLES_NORM_P(:) = XLES_MEAN_RHO(1,:,1) * XLES_WSTAR(:)**2 - ELSEWHERE - XLES_NORM_M(:) = 0. - XLES_NORM_S(:) = 0. - XLES_NORM_K(:) = 0. - XLES_NORM_RHO(:) = 0. - XLES_NORM_RV(:) = 0. - XLES_NORM_P(:) = 0. - END WHERE - DO JSV=1,NSV - WHERE (XLES_WSTAR(:)>0.) - XLES_NORM_SV(:,JSV)= XLES_SV0(:,JSV) / XLES_WSTAR(:) - ELSEWHERE - XLES_NORM_SV(:,JSV)= 0. - END WHERE - END DO - ELSE IF (CLES_NORM_TYPE=='EKMA') THEN - WHERE (XLES_USTAR(:)>0.) - XLES_NORM_M(:) = XLES_BL_HEIGHT(:) - XLES_NORM_S(:) = XLES_NORM_M(:) / XLES_USTAR(:) - XLES_NORM_K(:) = XLES_Q0(:) / XLES_USTAR(:) - XLES_NORM_RHO(:) = XLES_MEAN_RHO(1,:,1) - XLES_NORM_RV(:) = XLES_E0(:) / XLES_USTAR(:) - XLES_NORM_P(:) = XLES_MEAN_RHO(1,:,1) * XLES_USTAR(:)**2 - ELSEWHERE - XLES_NORM_M(:) = 0. - XLES_NORM_S(:) = 0. - XLES_NORM_K(:) = 0. - XLES_NORM_RHO(:) = 0. - XLES_NORM_RV(:) = 0. - XLES_NORM_P(:) = 0. - END WHERE - DO JSV=1,NSV - WHERE (XLES_USTAR(:)>0.) - XLES_NORM_SV(:,JSV)= XLES_SV0(:,JSV) / XLES_USTAR(:) - ELSEWHERE - XLES_NORM_SV(:,JSV)= 0. - END WHERE - END DO - ELSE IF (CLES_NORM_TYPE=='MOBU') THEN - XLES_NORM_M(:) = XLES_MO_LENGTH(:) - WHERE (XLES_USTAR(:)>0.) - XLES_NORM_S(:) = XLES_NORM_M(:) / XLES_USTAR(:) - XLES_NORM_K(:) = XLES_Q0(:) / XLES_USTAR(:) - XLES_NORM_RHO(:) = XLES_MEAN_RHO(1,:,1) - XLES_NORM_RV(:) = XLES_E0(:) / XLES_USTAR(:) - XLES_NORM_P(:) = XLES_MEAN_RHO(1,:,1) * XLES_USTAR(:)**2 - ELSEWHERE - XLES_NORM_S(:) = 0. - XLES_NORM_K(:) = 0. - XLES_NORM_RHO(:) = 0. - XLES_NORM_RV(:) = 0. - XLES_NORM_P(:) = 0. - END WHERE - DO JSV=1,NSV - WHERE (XLES_USTAR(:)>0.) - XLES_NORM_SV(:,JSV)= XLES_SV0(:,JSV) / XLES_USTAR(:) - ELSEWHERE - XLES_NORM_SV(:,JSV)= 0. - END WHERE - END DO - END IF -END IF -! -!* 1.2 Initializations for WRITE_DIACHRO -! --------------------------------- -! -NLES_CURRENT_TIMES=NLES_TIMES -! -CALL LES_ALLOCATE('XLES_CURRENT_Z',(/NLES_K/)) - -XLES_CURRENT_Z(:) = XLES_Z(:) -! -XLES_CURRENT_ZS = XLES_ZS -! -NLES_CURRENT_IINF=NLESn_IINF(IMI) -NLES_CURRENT_ISUP=NLESn_ISUP(IMI) -NLES_CURRENT_JINF=NLESn_JINF(IMI) -NLES_CURRENT_JSUP=NLESn_JSUP(IMI) -! -XLES_CURRENT_DOMEGAX=XDXHAT(1) -XLES_CURRENT_DOMEGAY=XDYHAT(1) - -tfield%ngrid = 0 !Not on the Arakawa grid -tfield%ntype = TYPEREAL -! -!* 2. (z,t) profiles (all masks) -! -------------- -IMASK = 1 -ymasks(imask) = 'cart' -IF (LLES_NEB_MASK) THEN - IMASK=IMASK+1 - ymasks(imask) = 'neb' - IMASK=IMASK+1 - ymasks(imask) = 'clear' -END IF -IF (LLES_CORE_MASK) THEN - IMASK=IMASK+1 - ymasks(imask) = 'core' - IMASK=IMASK+1 - ymasks(imask) = 'env' -END IF -IF (LLES_MY_MASK) THEN - DO JI=1,NLES_MASKS_USER - IMASK=IMASK+1 - Write( ynum, '( i3.3 )' ) ji - ymasks(imask) = 'user' // ynum - END DO -END IF -IF (LLES_CS_MASK) THEN - IMASK=IMASK+1 - ymasks(imask) = 'cs1' - IMASK=IMASK+1 - ymasks(imask) = 'cs2' - IMASK=IMASK+1 - ymasks(imask) = 'cs3' -END IF -! -!* 2.0 averaging diagnostics -! --------------------- -! -ALLOCATE(ZAVG_PTS_ll (NLES_K,NLES_TIMES,NLES_MASKS)) -ALLOCATE(ZUND_PTS_ll (NLES_K,NLES_TIMES,NLES_MASKS)) - -ZAVG_PTS_ll(:,:,:) = NLES_AVG_PTS_ll(:,:,:) -ZUND_PTS_ll(:,:,:) = NLES_UND_PTS_ll(:,:,:) -ZCART_PTS_ll = (NLESn_ISUP(IMI)-NLESn_IINF(IMI)+1) * (NLESn_JSUP(IMI)-NLESn_JINF(IMI)+1) - -tfield%ndims = 3 -tfield%ndimlist(1) = NMNHDIM_BUDGET_LES_LEVEL -tfield%ndimlist(2) = NMNHDIM_BUDGET_LES_TIME -tfield%ndimlist(3) = NMNHDIM_BUDGET_LES_MASK -tfield%ndimlist(4:) = NMNHDIM_UNUSED - -ldoavg = xles_temp_mean_start /= XUNDEF .and. xles_temp_mean_end /= XUNDEF -ldonorm = .false. - -cgroup = 'Miscellaneous' -cgroupcomment = 'Miscellaneous terms (geometry, various unclassified averaged terms...)' - -call Les_diachro_write( tpdiafile, zavg_pts_ll, 'AVG_PTS', 'number of points used for averaging', '1', ymasks ) -call Les_diachro_write( tpdiafile, zavg_pts_ll / zcart_pts_ll, 'AVG_PTSF', 'fraction of points used for averaging', '1', ymasks ) -call Les_diachro_write( tpdiafile, zund_pts_ll, 'UND_PTS', 'number of points below orography', '1', ymasks ) -call Les_diachro_write( tpdiafile, zund_pts_ll / zcart_pts_ll, 'UND_PTSF', 'fraction of points below orography', '1', ymasks ) - -DEALLOCATE(ZAVG_PTS_ll) -DEALLOCATE(ZUND_PTS_ll) -! -!* 2.1 mean quantities -! --------------- -! -cgroup = 'Mean' -cgroupcomment = 'Mean vertical profiles of the model variables' - -tfield%ndims = 3 -tfield%ndimlist(1) = NMNHDIM_BUDGET_LES_LEVEL -tfield%ndimlist(2) = NMNHDIM_BUDGET_LES_TIME -tfield%ndimlist(3) = NMNHDIM_BUDGET_LES_MASK -tfield%ndimlist(4:) = NMNHDIM_UNUSED - -ldoavg = xles_temp_mean_start /= XUNDEF .and. xles_temp_mean_end /= XUNDEF -ldonorm = trim(cles_norm_type) /= 'NONE' - -call Les_diachro_write( tpdiafile, XLES_MEAN_U, 'MEAN_U', 'Mean U Profile', 'm s-1', ymasks ) -call Les_diachro_write( tpdiafile, XLES_MEAN_V, 'MEAN_V', 'Mean V Profile', 'm s-1', ymasks ) -call Les_diachro_write( tpdiafile, XLES_MEAN_W, 'MEAN_W', 'Mean W Profile', 'm s-1', ymasks ) -call Les_diachro_write( tpdiafile, XLES_MEAN_P, 'MEAN_PRE', 'Mean pressure Profile', 'Pa', ymasks ) -call Les_diachro_write( tpdiafile, XLES_MEAN_DP, 'MEAN_DP', 'Mean Dyn production TKE Profile', 'm2 s-3', ymasks ) -call Les_diachro_write( tpdiafile, XLES_MEAN_TP, 'MEAN_TP', 'Mean Thermal production TKE Profile', 'm2 s-3', ymasks ) -call Les_diachro_write( tpdiafile, XLES_MEAN_TR, 'MEAN_TR', 'Mean transport production TKE Profile', 'm2 s-3', ymasks ) -call Les_diachro_write( tpdiafile, XLES_MEAN_DISS, 'MEAN_DISS', 'Mean Dissipation TKE Profile', 'm2 s-3', ymasks ) -call Les_diachro_write( tpdiafile, XLES_MEAN_LM, 'MEAN_LM', 'Mean mixing length Profile', 'm', ymasks ) -call Les_diachro_write( tpdiafile, XLES_MEAN_RHO, 'MEAN_RHO', 'Mean density Profile', 'kg m-3', ymasks ) -call Les_diachro_write( tpdiafile, XLES_MEAN_Th, 'MEAN_TH', 'Mean potential temperature Profile', 'K', ymasks ) -call Les_diachro_write( tpdiafile, XLES_MEAN_Mf, 'MEAN_MF', 'Mass-flux Profile', 'm s-1', ymasks ) -if ( luserc ) & -call Les_diachro_write( tpdiafile, XLES_MEAN_Thl, 'MEAN_THL', 'Mean liquid potential temperature Profile', 'K', ymasks ) -if ( luserv ) & -call Les_diachro_write( tpdiafile, XLES_MEAN_Thv, 'MEAN_THV', 'Mean virtual potential temperature Profile', 'K', ymasks ) -if ( luserc ) & -call Les_diachro_write( tpdiafile, XLES_MEAN_Rt, 'MEAN_RT', 'Mean Rt Profile', 'kg kg-1', ymasks ) -if ( luserv ) & -call Les_diachro_write( tpdiafile, XLES_MEAN_Rv, 'MEAN_RV', 'Mean Rv Profile', 'kg kg-1', ymasks ) -if ( luserv ) & -call Les_diachro_write( tpdiafile, XLES_MEAN_Rehu, 'MEAN_REHU', 'Mean Rh Profile', 'percent', ymasks ) -if ( luserv ) & -call Les_diachro_write( tpdiafile, XLES_MEAN_Qs, 'MEAN_QS', 'Mean Qs Profile', 'kg kg-1', ymasks ) -if ( luserc ) & -call Les_diachro_write( tpdiafile, XLES_MEAN_KHt, 'MEAN_KHT', 'Eddy-diffusivity (temperature) Profile', 'm2 s-1', ymasks ) -if ( luserc ) & -call Les_diachro_write( tpdiafile, XLES_MEAN_KHr, 'MEAN_KHR', 'Eddy-diffusivity (vapor) Profile', 'm2 s-1', ymasks ) -if ( luserc ) & -call Les_diachro_write( tpdiafile, XLES_MEAN_Rc, 'MEAN_RC', 'Mean Rc Profile', 'kg kg-1', ymasks ) -if ( luserc ) & -call Les_diachro_write( tpdiafile, XLES_MEAN_Cf, 'MEAN_CF', 'Mean Cf Profile', '1', ymasks ) -if ( luserc ) & -call Les_diachro_write( tpdiafile, XLES_MEAN_INDCf, 'MEAN_INDCF', 'Mean Cf>1-6 Profile (0 or 1)', '1', ymasks ) -if ( luserc ) & -call Les_diachro_write( tpdiafile, XLES_MEAN_INDCf2, 'MEAN_INDCF2', 'Mean Cf>1-5 Profile (0 or 1)', '1', ymasks ) -if ( luserr ) & -call Les_diachro_write( tpdiafile, XLES_MEAN_Rr, 'MEAN_RR', 'Mean Rr Profile', 'kg kg-1', ymasks ) -if ( luserr ) & -call Les_diachro_write( tpdiafile, XLES_MEAN_RF, 'MEAN_RF', 'Mean RF Profile', '1', ymasks ) -if ( luseri ) & -call Les_diachro_write( tpdiafile, XLES_MEAN_Ri, 'MEAN_RI', 'Mean Ri Profile', 'kg kg-1', ymasks ) -if ( luseri ) & -call Les_diachro_write( tpdiafile, XLES_MEAN_If, 'MEAN_IF', 'Mean If Profile', '1', ymasks ) -if ( lusers ) & -call Les_diachro_write( tpdiafile, XLES_MEAN_Rs, 'MEAN_RS', 'Mean Rs Profile', 'kg kg-1', ymasks ) -if ( luserg ) & -call Les_diachro_write( tpdiafile, XLES_MEAN_Rg, 'MEAN_RG', 'Mean Rg Profile', 'kg kg-1', ymasks ) -if ( luserh ) & -call Les_diachro_write( tpdiafile, XLES_MEAN_Rh, 'MEAN_RH', 'Mean Rh Profile', 'kg kg-1', ymasks ) - -if ( nsv > 0 ) then - tfield%ndims = 4 - tfield%ndimlist(1) = NMNHDIM_BUDGET_LES_LEVEL - tfield%ndimlist(2) = NMNHDIM_BUDGET_LES_TIME - tfield%ndimlist(3) = NMNHDIM_BUDGET_LES_MASK - tfield%ndimlist(4) = NMNHDIM_BUDGET_LES_SV - tfield%ndimlist(5:) = NMNHDIM_UNUSED - - call Les_diachro_write( tpdiafile, XLES_MEAN_Sv, 'MEAN_SV', 'Mean Sv Profiles', 'kg kg-1', ymasks ) - - tfield%ndims = 3 - !tfield%ndimlist(1) = NMNHDIM_BUDGET_LES_LEVEL - !tfield%ndimlist(2) = NMNHDIM_BUDGET_LES_TIME - !tfield%ndimlist(3) = NMNHDIM_BUDGET_LES_MASK - tfield%ndimlist(4) = NMNHDIM_UNUSED - !tfield%ndimlist(5:) = NMNHDIM_UNUSED -end if - -call Les_diachro_write( tpdiafile, XLES_MEAN_WIND, 'MEANWIND', 'Profile of Mean Modulus of Wind', 'm s-1', ymasks ) -call Les_diachro_write( tpdiafile, XLES_RESOLVED_MASSFX, 'MEANMSFX', 'Total updraft mass flux', 'kg m-2 s-1', ymasks ) - -if ( lles_pdf ) then - cgroup = 'PDF' - cgroupcomment = '' - - tfield%ndims = 4 - !tfield%ndimlist(1) = NMNHDIM_BUDGET_LES_LEVEL - !tfield%ndimlist(2) = NMNHDIM_BUDGET_LES_TIME - !tfield%ndimlist(3) = NMNHDIM_BUDGET_LES_MASK - tfield%ndimlist(4) = NMNHDIM_BUDGET_LES_PDF - tfield%ndimlist(5:) = NMNHDIM_UNUSED - - call Les_diachro_write( tpdiafile, XLES_PDF_TH, 'PDF_TH', 'Pdf potential temperature Profiles', '1', ymasks ) - call Les_diachro_write( tpdiafile, XLES_PDF_W, 'PDF_W', 'Pdf vertical velocity Profiles', '1', ymasks ) - call Les_diachro_write( tpdiafile, XLES_PDF_THV, 'PDF_THV', 'Pdf virtual pot. temp. Profiles', '1', ymasks ) - if ( luserv ) & - call Les_diachro_write( tpdiafile, XLES_PDF_RV, 'PDF_RV', 'Pdf Rv Profiles', '1', ymasks ) - if ( luserc ) then - call Les_diachro_write( tpdiafile, XLES_PDF_RC, 'PDF_RC', 'Pdf Rc Profiles', '1', ymasks ) - call Les_diachro_write( tpdiafile, XLES_PDF_RT, 'PDF_RT', 'Pdf Rt Profiles', '1', ymasks ) - call Les_diachro_write( tpdiafile, XLES_PDF_THL, 'PDF_THL', 'Pdf Thl Profiles', '1', ymasks ) - end if - if ( luserr ) & - call Les_diachro_write( tpdiafile, XLES_PDF_RR, 'PDF_RR', 'Pdf Rr Profiles', '1', ymasks ) - if ( luseri ) & - call Les_diachro_write( tpdiafile, XLES_PDF_RI, 'PDF_RI', 'Pdf Ri Profiles', '1', ymasks ) - if ( lusers ) & - call Les_diachro_write( tpdiafile, XLES_PDF_RS, 'PDF_RS', 'Pdf Rs Profiles', '1', ymasks ) - if ( luserg ) & - call Les_diachro_write( tpdiafile, XLES_PDF_RG, 'PDF_RG', 'Pdf Rg Profiles', '1', ymasks ) -end if -! -!* 2.2 resolved quantities -! ------------------- -! -if ( lles_resolved ) then - !Prepare metadata (used in Les_diachro_write calls) - ldoavg = xles_temp_mean_start /= XUNDEF .and. xles_temp_mean_end /= XUNDEF - ldonorm = trim(cles_norm_type) /= 'NONE' - - cgroup = 'Resolved' - cgroupcomment = 'Mean vertical profiles of the resolved fluxes, variances and covariances' - - tfield%ndims = 3 - tfield%ndimlist(1) = NMNHDIM_BUDGET_LES_LEVEL - tfield%ndimlist(2) = NMNHDIM_BUDGET_LES_TIME - tfield%ndimlist(3) = NMNHDIM_BUDGET_LES_MASK - tfield%ndimlist(4:) = NMNHDIM_UNUSED - - call Les_diachro_write( tpdiafile, XLES_RESOLVED_U2, 'RES_U2', 'Resolved <u2> variance', 'm2 s-2', ymasks ) - call Les_diachro_write( tpdiafile, XLES_RESOLVED_V2, 'RES_V2', 'Resolved <v2> variance', 'm2 s-2', ymasks ) - call Les_diachro_write( tpdiafile, XLES_RESOLVED_W2, 'RES_W2', 'Resolved <w2> variance', 'm2 s-2', ymasks ) - call Les_diachro_write( tpdiafile, XLES_RESOLVED_UV, 'RES_UV', 'Resolved <uv> Flux', 'm2 s-2', ymasks ) - call Les_diachro_write( tpdiafile, XLES_RESOLVED_WU, 'RES_WU', 'Resolved <wu> Flux', 'm2 s-2', ymasks ) - call Les_diachro_write( tpdiafile, XLES_RESOLVED_WV, 'RES_WV', 'Resolved <wv> Flux', 'm2 s-2', ymasks ) - call Les_diachro_write( tpdiafile, XLES_RESOLVED_Ke, 'RES_KE', 'Resolved TKE Profile', 'm2 s-2', ymasks ) - call Les_diachro_write( tpdiafile, XLES_RESOLVED_P2, 'RES_P2', 'Resolved pressure variance', 'Pa2', ymasks ) - call Les_diachro_write( tpdiafile, XLES_RESOLVED_UP, 'RES_UPZ', 'Resolved <up> horizontal Flux', 'Pa s-1', ymasks ) - call Les_diachro_write( tpdiafile, XLES_RESOLVED_VP, 'RES_VPZ', 'Resolved <vp> horizontal Flux', 'Pa s-1', ymasks ) - call Les_diachro_write( tpdiafile, XLES_RESOLVED_WP, 'RES_WPZ', 'Resolved <wp> vertical Flux', 'Pa s-1', ymasks ) - - if ( luserv ) & - call Les_diachro_write( tpdiafile, XLES_RESOLVED_ThThv, 'RES_THTV', & - 'Resolved potential temperature - virtual potential temperature covariance', 'K2', ymasks ) - if ( luserc ) & - call Les_diachro_write( tpdiafile, XLES_RESOLVED_ThlThv, 'RES_TLTV', & - 'Resolved liquid potential temperature - virtual potential temperature covariance', 'K2', ymasks ) - call Les_diachro_write( tpdiafile, XLES_RESOLVED_Th2, 'RES_TH2', 'Resolved potential temperature variance', 'K2', ymasks ) - if ( luserc ) & - call Les_diachro_write( tpdiafile, XLES_RESOLVED_Thl2, 'RES_THL2', 'Resolved liquid potential temperature variance', 'K2',& - ymasks ) - call Les_diachro_write( tpdiafile, XLES_RESOLVED_UTh, 'RES_UTH', 'Resolved <uth> horizontal Flux', 'm K s-1', ymasks ) - call Les_diachro_write( tpdiafile, XLES_RESOLVED_VTh, 'RES_VTH', 'Resolved <vth> horizontal Flux', 'm K s-1', ymasks ) - call Les_diachro_write( tpdiafile, XLES_RESOLVED_WTh, 'RES_WTH', 'Resolved <wth> vertical Flux', 'm K s-1', ymasks ) - - if ( luserc ) then - call Les_diachro_write( tpdiafile, XLES_RESOLVED_UThl, 'RES_UTHL', 'Resolved <uthl> horizontal Flux', 'm K s-1', ymasks ) - call Les_diachro_write( tpdiafile, XLES_RESOLVED_VThl, 'RES_VTHL', 'Resolved <vthl> horizontal Flux', 'm K s-1', ymasks ) - call Les_diachro_write( tpdiafile, XLES_RESOLVED_WThl, 'RES_WTHL', 'Resolved <wthl> vertical Flux', 'm K s-1', ymasks ) - call Les_diachro_write( tpdiafile, XLES_RESOLVED_Rt2, 'RES_RT2', 'Resolved total water variance', 'kg2 kg-2', ymasks ) - call Les_diachro_write( tpdiafile, XLES_RESOLVED_WRt, 'RES_WRT', 'Resolved <wrt> vertical Flux', 'm kg kg-1 s-1', ymasks ) - end if - - if ( luserv ) then - call Les_diachro_write( tpdiafile, XLES_RESOLVED_UThv, 'RES_UTHV', 'Resolved <uthv> horizontal Flux', 'm K s-1', ymasks ) - call Les_diachro_write( tpdiafile, XLES_RESOLVED_VThv, 'RES_VTHV', 'Resolved <vthv> horizontal Flux', 'm K s-1', ymasks ) - call Les_diachro_write( tpdiafile, XLES_RESOLVED_WThv, 'RES_WTHV', 'Resolved <wthv> vertical Flux', 'm K s-1', ymasks ) - call Les_diachro_write( tpdiafile, XLES_RESOLVED_Rv2, 'RES_RV2', 'Resolved water vapor variance', 'kg2 kg-2', ymasks ) - call Les_diachro_write( tpdiafile, XLES_RESOLVED_ThRv, 'RES_THRV', 'Resolved <thrv> covariance', 'K kg kg-1', ymasks ) - if ( luserc ) & - call Les_diachro_write( tpdiafile, XLES_RESOLVED_ThlRv, 'RES_TLRV', 'Resolved <thlrv> covariance', 'K kg kg-1', ymasks ) - call Les_diachro_write( tpdiafile, XLES_RESOLVED_ThvRv, 'RES_TVRV', 'Resolved <thvrv> covariance', 'K kg kg-1', ymasks ) - call Les_diachro_write( tpdiafile, XLES_RESOLVED_URv, 'RES_URV', 'Resolved <urv> horizontal flux', 'm kg kg-1 s-1', ymasks ) - call Les_diachro_write( tpdiafile, XLES_RESOLVED_VRv, 'RES_VRV', 'Resolved <vrv> horizontal flux', 'm kg kg-1 s-1', ymasks ) - call Les_diachro_write( tpdiafile, XLES_RESOLVED_WRv, 'RES_WRV', 'Resolved <wrv> vertical flux', 'm kg kg-1 s-1', ymasks ) - end if - - if ( luserc ) then - call Les_diachro_write( tpdiafile, XLES_RESOLVED_Rc2, 'RES_RC2', 'Resolved cloud water variance', 'kg2 kg-2', ymasks ) - call Les_diachro_write( tpdiafile, XLES_RESOLVED_ThRc, 'RES_THRC', 'Resolved <thrc> covariance', 'K kg kg-1', ymasks ) - call Les_diachro_write( tpdiafile, XLES_RESOLVED_ThlRc, 'RES_TLRC', 'Resolved <thlrc> covariance', 'K kg kg-1', ymasks ) - call Les_diachro_write( tpdiafile, XLES_RESOLVED_ThvRc, 'RES_TVRC', 'Resolved <thvrc> covariance', 'K kg kg-1', ymasks ) - call Les_diachro_write( tpdiafile, XLES_RESOLVED_URc, 'RES_URC', 'Resolved <urc> horizontal flux', 'm kg kg-1 s-1', ymasks ) - call Les_diachro_write( tpdiafile, XLES_RESOLVED_VRc, 'RES_VRC', 'Resolved <vrc> horizontal flux', 'm kg kg-1 s-1', ymasks ) - call Les_diachro_write( tpdiafile, XLES_RESOLVED_WRc, 'RES_WRC', 'Resolved <wrc> vertical flux', 'm kg kg-1 s-1', ymasks ) - end if - - if ( luseri ) then - call Les_diachro_write( tpdiafile, XLES_RESOLVED_Ri2, 'RES_RI2', 'Resolved cloud ice variance', 'kg2 kg-2', ymasks ) - call Les_diachro_write( tpdiafile, XLES_RESOLVED_ThRi, 'RES_THRI', 'Resolved <thri> covariance', 'K kg kg-1', ymasks ) - call Les_diachro_write( tpdiafile, XLES_RESOLVED_ThlRi, 'RES_TLRI', 'Resolved <thlri> covariance', 'K kg kg-1', ymasks ) - call Les_diachro_write( tpdiafile, XLES_RESOLVED_ThvRi, 'RES_TVRI', 'Resolved <thvri> covariance', 'K kg kg-1', ymasks ) - call Les_diachro_write( tpdiafile, XLES_RESOLVED_URi, 'RES_URI', 'Resolved <uri> horizontal flux', 'm kg kg-1 s-1', ymasks ) - call Les_diachro_write( tpdiafile, XLES_RESOLVED_VRi, 'RES_VRI', 'Resolved <vri> horizontal flux', 'm kg kg-1 s-1', ymasks ) - call Les_diachro_write( tpdiafile, XLES_RESOLVED_WRi, 'RES_WRI', 'Resolved <wri> vertical flux', 'm kg kg-1 s-1', ymasks ) - end if - - if ( luserr ) then - call Les_diachro_write( tpdiafile, XLES_RESOLVED_WRr, 'RES_WRR', 'Resolved <wrr> vertical flux', 'm kg kg-1 s-1', ymasks ) - call Les_diachro_write( tpdiafile, XLES_INPRR3D, 'INPRR3D', 'Precipitation flux', 'm s-1', ymasks ) - call Les_diachro_write( tpdiafile, XLES_MAX_INPRR3D, 'MAXINPR3D', 'Max Precip flux', 'm s-1', ymasks ) - call Les_diachro_write( tpdiafile, XLES_EVAP3D, 'EVAP3D', 'Evaporation profile', 'kg kg-1 s-1', ymasks ) - end if - - if ( nsv > 0 ) then - tfield%ndims = 4 - tfield%ndimlist(1) = NMNHDIM_BUDGET_LES_LEVEL - tfield%ndimlist(2) = NMNHDIM_BUDGET_LES_TIME - tfield%ndimlist(3) = NMNHDIM_BUDGET_LES_MASK - tfield%ndimlist(4) = NMNHDIM_BUDGET_LES_SV - tfield%ndimlist(5:) = NMNHDIM_UNUSED - - call Les_diachro_write( tpdiafile, XLES_RESOLVED_Sv2, 'RES_SV2', 'Resolved scalar variables variances', 'kg2 kg-2', ymasks ) - call Les_diachro_write( tpdiafile, XLES_RESOLVED_ThSv, 'RES_THSV', 'Resolved <ThSv> variance', 'K kg kg-1', ymasks ) - if ( luserc ) & - call Les_diachro_write( tpdiafile, XLES_RESOLVED_ThlSv, 'RES_TLSV', 'Resolved <ThlSv> variance', 'K kg kg-1', ymasks ) - if ( luserv ) & - call Les_diachro_write( tpdiafile, XLES_RESOLVED_ThvSv, 'RES_TVSV', 'Resolved <ThvSv> variance', 'K kg kg-1', ymasks ) - call Les_diachro_write( tpdiafile, XLES_RESOLVED_USv, 'RES_USV', 'Resolved <uSv> horizontal flux', 'm kg kg-1 s-1', ymasks ) - call Les_diachro_write( tpdiafile, XLES_RESOLVED_VSv, 'RES_VSV', 'Resolved <vSv> horizontal flux', 'm kg kg-1 s-1', ymasks ) - call Les_diachro_write( tpdiafile, XLES_RESOLVED_WSv, 'RES_WSV', 'Resolved <wSv> vertical flux', 'm kg kg-1 s-1', ymasks ) - - tfield%ndims = 3 - !tfield%ndimlist(1) = NMNHDIM_BUDGET_LES_LEVEL - !tfield%ndimlist(2) = NMNHDIM_BUDGET_LES_TIME - !tfield%ndimlist(3) = NMNHDIM_BUDGET_LES_MASK - tfield%ndimlist(4) = NMNHDIM_UNUSED - !tfield%ndimlist(5:) = NMNHDIM_UNUSED - end if - - call Les_diachro_write( tpdiafile, XLES_RESOLVED_U3, 'RES_U3', 'Resolved <u3>', 'm3 s-3', ymasks ) - call Les_diachro_write( tpdiafile, XLES_RESOLVED_V3, 'RES_V3', 'Resolved <v3>', 'm3 s-3', ymasks ) - call Les_diachro_write( tpdiafile, XLES_RESOLVED_W3, 'RES_W3', 'Resolved <w3>', 'm3 s-3', ymasks ) - call Les_diachro_write( tpdiafile, XLES_RESOLVED_U4, 'RES_U4', 'Resolved <u4>', 'm4 s-4', ymasks ) - call Les_diachro_write( tpdiafile, XLES_RESOLVED_V4, 'RES_V4', 'Resolved <v4>', 'm4 s-4', ymasks ) - call Les_diachro_write( tpdiafile, XLES_RESOLVED_W4, 'RES_W4', 'Resolved <w4>', 'm4 s-4', ymasks ) - - call Les_diachro_write( tpdiafile, XLES_RESOLVED_WThl2, 'RES_WTL2', 'Resolved <wThl2>', 'm K2 s-1', ymasks ) - call Les_diachro_write( tpdiafile, XLES_RESOLVED_W2Thl, 'RES_W2TL', 'Resolved <w2Thl>', 'm2 K s-2', ymasks ) - - if ( luserv ) then - call Les_diachro_write( tpdiafile, XLES_RESOLVED_WRv2, 'RES_WRV2', 'Resolved <wRv2>', 'm kg2 kg-2 s-1', ymasks ) - call Les_diachro_write( tpdiafile, XLES_RESOLVED_W2Rv, 'RES_W2RV', 'Resolved <w2Rv>', 'm2 kg kg-1 s-2', ymasks ) - call Les_diachro_write( tpdiafile, XLES_RESOLVED_WRt2, 'RES_WRT2', 'Resolved <wRt2>', 'm kg2 kg-2 s-1', ymasks ) - call Les_diachro_write( tpdiafile, XLES_RESOLVED_W2Rt, 'RES_W2RT', 'Resolved <w2Rt>', 'm2 kg kg-1 s-2', ymasks ) - call Les_diachro_write( tpdiafile, XLES_RESOLVED_WThlRv, 'RE_WTLRV', 'Resolved <wThlRv>', 'm K kg kg-1 s-1', ymasks ) - call Les_diachro_write( tpdiafile, XLES_RESOLVED_WThlRt, 'RE_WTLRT', 'Resolved <wThlRt>', 'm K kg kg-1 s-1', ymasks ) - end if - - if ( luserc ) then - call Les_diachro_write( tpdiafile, XLES_RESOLVED_WRc2, 'RES_WRC2', 'Resolved <wRc2>', 'm kg2 kg-2 s-1', ymasks ) - call Les_diachro_write( tpdiafile, XLES_RESOLVED_W2Rc, 'RES_W2RC', 'Resolved <w2Rc>', 'm2 kg kg-1 s-2', ymasks ) - call Les_diachro_write( tpdiafile, XLES_RESOLVED_WThlRc, 'RE_WTLRC', 'Resolved <wThlRc>', 'm K kg kg-1 s-1', ymasks ) - call Les_diachro_write( tpdiafile, XLES_RESOLVED_WRvRc, 'RE_WRVRC', 'Resolved <wRvRc>', 'm kg2 kg-2 s-1', ymasks ) - end if - - if ( luseri ) then - call Les_diachro_write( tpdiafile, XLES_RESOLVED_WRi2, 'RES_WRI2', 'Resolved <wRi2>', 'm kg2 kg-2 s-1', ymasks ) - call Les_diachro_write( tpdiafile, XLES_RESOLVED_W2Ri, 'RES_W2RI', 'Resolved <w2Ri>', 'm2 kg kg-1 s-2', ymasks ) - call Les_diachro_write( tpdiafile, XLES_RESOLVED_WThlRi, 'RE_WTLRI', 'Resolved <wThlRi>', 'm K kg kg-1 s-1', ymasks ) - call Les_diachro_write( tpdiafile, XLES_RESOLVED_WRvRi, 'RE_WRVRI', 'Resolved <wRvRi>', 'm kg2 kg-2 s-1', ymasks ) - end if - - if ( nsv > 0 ) then - tfield%ndims = 4 - tfield%ndimlist(1) = NMNHDIM_BUDGET_LES_LEVEL - tfield%ndimlist(2) = NMNHDIM_BUDGET_LES_TIME - tfield%ndimlist(3) = NMNHDIM_BUDGET_LES_MASK - tfield%ndimlist(4) = NMNHDIM_BUDGET_LES_SV - tfield%ndimlist(5:) = NMNHDIM_UNUSED - - call Les_diachro_write( tpdiafile, XLES_RESOLVED_WSv2, 'RES_WSV2', 'Resolved <wSv2>', 'm kg2 kg-2 s-1', ymasks ) - call Les_diachro_write( tpdiafile, XLES_RESOLVED_W2Sv, 'RES_W2SV', 'Resolved <w2Sv>', 'm2 kg kg-1 s-2', ymasks ) - call Les_diachro_write( tpdiafile, XLES_RESOLVED_WThlSv, 'RE_WTLSV', 'Resolved <wThlSv>', 'm K kg kg-1 s-1', ymasks ) - if ( luserv ) & - call Les_diachro_write( tpdiafile, XLES_RESOLVED_WRvSv, 'RE_WRVSV', 'Resolved <wRvSv>', 'm kg2 kg-2 s-1', ymasks ) - - tfield%ndims = 3 - !tfield%ndimlist(1) = NMNHDIM_BUDGET_LES_LEVEL - !tfield%ndimlist(2) = NMNHDIM_BUDGET_LES_TIME - !tfield%ndimlist(3) = NMNHDIM_BUDGET_LES_MASK - tfield%ndimlist(4) = NMNHDIM_UNUSED - !tfield%ndimlist(5:) = NMNHDIM_UNUSED - end if - - call Les_diachro_write( tpdiafile, XLES_RESOLVED_ThlPz, 'RES_TLPZ', 'Resolved <Thldp/dz>', 'K Pa m-1', ymasks ) - if ( luserc ) & - call Les_diachro_write( tpdiafile, XLES_RESOLVED_RtPz, 'RES_RTPZ', 'Resolved <Rtdp/dz>', 'kg2 kg-2 Pa m-1', ymasks ) - if ( luserv ) & - call Les_diachro_write( tpdiafile, XLES_RESOLVED_RvPz, 'RES_RVPZ', 'Resolved <Rvdp/dz>', 'kg2 kg-2 Pa m-1', ymasks ) - if ( luserc ) & - call Les_diachro_write( tpdiafile, XLES_RESOLVED_RcPz, 'RES_RCPZ', 'Resolved <Rcdp/dz>', 'kg2 kg-2 Pa m-1', ymasks ) - if ( luseri ) & - call Les_diachro_write( tpdiafile, XLES_RESOLVED_RiPz, 'RES_RIPZ', 'Resolved <Ridp/dz>', 'kg2 kg-2 Pa m-1', ymasks ) - - if ( nsv > 0 ) then - tfield%ndims = 4 - tfield%ndimlist(1) = NMNHDIM_BUDGET_LES_LEVEL - tfield%ndimlist(2) = NMNHDIM_BUDGET_LES_TIME - tfield%ndimlist(3) = NMNHDIM_BUDGET_LES_MASK - tfield%ndimlist(4) = NMNHDIM_BUDGET_LES_SV - tfield%ndimlist(5:) = NMNHDIM_UNUSED - - call Les_diachro_write( tpdiafile, XLES_RESOLVED_SvPz, 'RES_SVPZ', 'Resolved <Svdp/dz>', 'kg2 kg-2 Pa m-1', ymasks ) - - tfield%ndims = 3 - !tfield%ndimlist(1) = NMNHDIM_BUDGET_LES_LEVEL - !tfield%ndimlist(2) = NMNHDIM_BUDGET_LES_TIME - !tfield%ndimlist(3) = NMNHDIM_BUDGET_LES_MASK - tfield%ndimlist(4) = NMNHDIM_UNUSED - !tfield%ndimlist(5:) = NMNHDIM_UNUSED - end if - - call Les_diachro_write( tpdiafile, XLES_RESOLVED_UKe, 'RES_UKE', 'Resolved flux of resolved kinetic energy', 'm3 s-3', ymasks ) - call Les_diachro_write( tpdiafile, XLES_RESOLVED_VKe, 'RES_VKE', 'Resolved flux of resolved kinetic energy', 'm3 s-3', ymasks ) - call Les_diachro_write( tpdiafile, XLES_RESOLVED_WKe, 'RES_WKE', 'Resolved flux of resolved kinetic energy', 'm3 s-3', ymasks ) -end if -! -! -!* 2.3 subgrid quantities -! ------------------ -! -if ( lles_subgrid ) then - !Prepare metadata (used in Les_diachro_write calls) - ldoavg = xles_temp_mean_start /= XUNDEF .and. xles_temp_mean_end /= XUNDEF - ldonorm = trim(cles_norm_type) /= 'NONE' - - cgroup = 'Subgrid' - cgroupcomment = 'Mean vertical profiles of the subgrid fluxes, variances and covariances' - - tfield%ndims = 3 - tfield%ndimlist(1) = NMNHDIM_BUDGET_LES_LEVEL - tfield%ndimlist(2) = NMNHDIM_BUDGET_LES_TIME - tfield%ndimlist(3) = NMNHDIM_BUDGET_LES_MASK - tfield%ndimlist(4:) = NMNHDIM_UNUSED - - call Les_diachro_write( tpdiafile, XLES_SUBGRID_Tke, 'SBG_TKE', 'Subgrid TKE', 'm2 s-2', ymasks ) - call Les_diachro_write( tpdiafile, XLES_SUBGRID_U2, 'SBG_U2', 'Subgrid <u2> variance', 'm2 s-2', ymasks ) - call Les_diachro_write( tpdiafile, XLES_SUBGRID_V2, 'SBG_V2', 'Subgrid <v2> variance', 'm2 s-2', ymasks ) - call Les_diachro_write( tpdiafile, XLES_SUBGRID_W2, 'SBG_W2', 'Subgrid <w2> variance', 'm2 s-2', ymasks ) - call Les_diachro_write( tpdiafile, XLES_SUBGRID_UV, 'SBG_UV', 'Subgrid <uv> flux', 'm2 s-2', ymasks ) - call Les_diachro_write( tpdiafile, XLES_SUBGRID_WU, 'SBG_WU', 'Subgrid <wu> flux', 'm2 s-2', ymasks ) - call Les_diachro_write( tpdiafile, XLES_SUBGRID_WV, 'SBG_WV', 'Subgrid <wv> flux', 'm2 s-2', ymasks ) - call Les_diachro_write( tpdiafile, XLES_SUBGRID_Thl2, 'SBG_THL2', 'Subgrid liquid potential temperature variance', & - 'K2', ymasks ) - call Les_diachro_write( tpdiafile, XLES_SUBGRID_UThl, 'SBG_UTHL', 'Subgrid horizontal flux of liquid potential temperature', & - 'm K s-1', ymasks ) - call Les_diachro_write( tpdiafile, XLES_SUBGRID_VThl, 'SBG_VTHL', 'Subgrid horizontal flux of liquid potential temperature', & - 'm K s-1', ymasks ) - call Les_diachro_write( tpdiafile, XLES_SUBGRID_WThl, 'SBG_WTHL', 'Subgrid vertical flux of liquid potential temperature', & - 'm K s-1', ymasks ) - call Les_diachro_write( tpdiafile, XLES_SUBGRID_WP, 'SBG_WP', 'Subgrid <wp> vertical Flux', 'm Pa s-1', ymasks ) - - call Les_diachro_write( tpdiafile, XLES_SUBGRID_THLUP_MF, 'THLUP_MF', 'Subgrid <thl> of updraft', 'K', ymasks ) - call Les_diachro_write( tpdiafile, XLES_SUBGRID_RTUP_MF, 'RTUP_MF', 'Subgrid <rt> of updraft', 'kg kg-1', ymasks ) - call Les_diachro_write( tpdiafile, XLES_SUBGRID_RVUP_MF, 'RVUP_MF', 'Subgrid <rv> of updraft', 'kg kg-1', ymasks ) - call Les_diachro_write( tpdiafile, XLES_SUBGRID_RCUP_MF, 'RCUP_MF', 'Subgrid <rc> of updraft', 'kg kg-1', ymasks ) - call Les_diachro_write( tpdiafile, XLES_SUBGRID_RIUP_MF, 'RIUP_MF', 'Subgrid <ri> of updraft', 'kg kg-1', ymasks ) - call Les_diachro_write( tpdiafile, XLES_SUBGRID_WUP_MF, 'WUP_MF', 'Subgrid <w> of updraft', 'm s-1', ymasks ) - call Les_diachro_write( tpdiafile, XLES_SUBGRID_MASSFLUX, 'MAFLX_MF', 'Subgrid <MF> of updraft', 'kg m-2 s-1', ymasks ) - call Les_diachro_write( tpdiafile, XLES_SUBGRID_DETR, 'DETR_MF', 'Subgrid <detr> of updraft', 'kg m-3 s-1', ymasks ) - call Les_diachro_write( tpdiafile, XLES_SUBGRID_ENTR, 'ENTR_MF', 'Subgrid <entr> of updraft', 'kg m-3 s-1', ymasks ) - call Les_diachro_write( tpdiafile, XLES_SUBGRID_FRACUP, 'FRCUP_MF', 'Subgrid <FracUp> of updraft', '1', ymasks ) - call Les_diachro_write( tpdiafile, XLES_SUBGRID_THVUP_MF, 'THVUP_MF', 'Subgrid <thv> of updraft', 'K', ymasks ) - call Les_diachro_write( tpdiafile, XLES_SUBGRID_WTHLMF, 'WTHL_MF', 'Subgrid <wthl> of mass flux convection scheme', & - 'm K s-1', ymasks ) - call Les_diachro_write( tpdiafile, XLES_SUBGRID_WRTMF, 'WRT_MF', 'Subgrid <wrt> of mass flux convection scheme', & - 'm kg kg-1 s-1', ymasks ) - call Les_diachro_write( tpdiafile, XLES_SUBGRID_WTHVMF, 'WTHV_MF', 'Subgrid <wthv> of mass flux convection scheme', & - 'm K s-1', ymasks ) - call Les_diachro_write( tpdiafile, XLES_SUBGRID_WUMF, 'WU_MF', 'Subgrid <wu> of mass flux convection scheme', & - 'm2 s-2', ymasks ) - call Les_diachro_write( tpdiafile, XLES_SUBGRID_WVMF, 'WV_MF', 'Subgrid <wv> of mass flux convection scheme', & - 'm2 s-2', ymasks ) - - call Les_diachro_write( tpdiafile, XLES_SUBGRID_PHI3, 'SBG_PHI3', 'Subgrid Phi3 function', '1', ymasks ) - call Les_diachro_write( tpdiafile, XLES_SUBGRID_LMix, 'SBG_LMIX', 'Subgrid Mixing Length', '1', ymasks ) - call Les_diachro_write( tpdiafile, XLES_SUBGRID_LDiss, 'SBG_LDIS', 'Subgrid Dissipation Length', '1', ymasks ) - call Les_diachro_write( tpdiafile, XLES_SUBGRID_Km, 'SBG_KM', 'Eddy diffusivity for momentum', 'm2 s-1', ymasks ) - call Les_diachro_write( tpdiafile, XLES_SUBGRID_Kh, 'SBG_KH', 'Eddy diffusivity for heat', 'm2 s-1', ymasks ) - - if ( luserv ) then - call Les_diachro_write( tpdiafile, XLES_SUBGRID_WThv, 'SBG_WTHV', 'Subgrid vertical flux of liquid potential temperature', & - 'm K s-1', ymasks ) - call Les_diachro_write( tpdiafile, XLES_SUBGRID_Rt2, 'SBG_RT2', 'Subgrid total water variance', 'kg2 kg-2', ymasks ) - call Les_diachro_write( tpdiafile, XLES_SUBGRID_ThlRt, 'SBG_TLRT', 'Subgrid <thlrt> covariance', 'K kg kg-1', ymasks ) - call Les_diachro_write( tpdiafile, XLES_SUBGRID_URt, 'SBG_URT', 'Subgrid total water horizontal flux', & - 'm kg kg-1 s-1', ymasks ) - call Les_diachro_write( tpdiafile, XLES_SUBGRID_VRt, 'SBG_VRT', 'Subgrid total water horizontal flux', & - 'm kg kg-1 s-1', ymasks ) - call Les_diachro_write( tpdiafile, XLES_SUBGRID_WRt, 'SBG_WRT', 'Subgrid total water vertical flux', & - 'm kg kg-1 s-1', ymasks ) - call Les_diachro_write( tpdiafile, XLES_SUBGRID_PSI3, 'SBG_PSI3', 'Subgrid Psi3 function', '1', ymasks ) - end if - - if ( luserc ) then - call Les_diachro_write( tpdiafile, XLES_SUBGRID_Rc2, 'SBG_RC2', 'Subgrid cloud water variance', 'kg2 kg-2', ymasks ) - call Les_diachro_write( tpdiafile, XLES_SUBGRID_URc, 'SBG_URC', 'Subgrid cloud water horizontal flux', 'm kg kg-1 s-1', & - ymasks ) - call Les_diachro_write( tpdiafile, XLES_SUBGRID_VRc, 'SBG_VRC', 'Subgrid cloud water horizontal flux', 'm kg kg-1 s-1', & - ymasks ) - call Les_diachro_write( tpdiafile, XLES_SUBGRID_WRc, 'SBG_WRC', 'Subgrid cloud water vertical flux', 'm kg kg-1 s-1', & - ymasks ) - end if - - if ( nsv > 0 ) then - tfield%ndims = 4 - tfield%ndimlist(1) = NMNHDIM_BUDGET_LES_LEVEL - tfield%ndimlist(2) = NMNHDIM_BUDGET_LES_TIME - tfield%ndimlist(3) = NMNHDIM_BUDGET_LES_MASK - tfield%ndimlist(4) = NMNHDIM_BUDGET_LES_SV - tfield%ndimlist(5:) = NMNHDIM_UNUSED - - call Les_diachro_write( tpdiafile, XLES_SUBGRID_USv, 'SBG_USV', 'Subgrid <uSv> horizontal flux', 'm kg kg-1 s-1', ymasks ) - call Les_diachro_write( tpdiafile, XLES_SUBGRID_VSv, 'SBG_VSV', 'Subgrid <vSv> horizontal flux', 'm kg kg-1 s-1', ymasks ) - call Les_diachro_write( tpdiafile, XLES_SUBGRID_WSv, 'SBG_WSV', 'Subgrid <wSv> vertical flux', 'm kg kg-1 s-1', ymasks ) - - tfield%ndims = 3 - !tfield%ndimlist(1) = NMNHDIM_BUDGET_LES_LEVEL - !tfield%ndimlist(2) = NMNHDIM_BUDGET_LES_TIME - !tfield%ndimlist(3) = NMNHDIM_BUDGET_LES_MASK - tfield%ndimlist(4) = NMNHDIM_UNUSED - !tfield%ndimlist(5:) = NMNHDIM_UNUSED - - - end if - - call Les_diachro_write( tpdiafile, XLES_SUBGRID_UTke, 'SBG_UTKE', 'Subgrid flux of subgrid kinetic energy', 'm3 s-3', ymasks ) - call Les_diachro_write( tpdiafile, XLES_SUBGRID_VTke, 'SBG_VTKE', 'Subgrid flux of subgrid kinetic energy', 'm3 s-3', ymasks ) - call Les_diachro_write( tpdiafile, XLES_SUBGRID_WTke, 'SBG_WTKE', 'Subgrid flux of subgrid kinetic energy', 'm3 s-3', ymasks ) - call Les_diachro_write( tpdiafile, XLES_SUBGRID_W2Thl, 'SBG_W2TL', 'Subgrid flux of subgrid kinetic energy', 'm2 K s-2', ymasks ) - call Les_diachro_write( tpdiafile, XLES_SUBGRID_WThl2, 'SBG_WTL2', 'Subgrid flux of subgrid kinetic energy', 'm K2 s-1', ymasks ) -end if - - -!Prepare metadata (used in Les_diachro_write calls) -tfield%ndims = 2 -tfield%ndimlist(1) = NMNHDIM_BUDGET_LES_LEVEL -tfield%ndimlist(2) = NMNHDIM_BUDGET_LES_TIME -tfield%ndimlist(3:) = NMNHDIM_UNUSED - -ldoavg = xles_temp_mean_start /= XUNDEF .and. xles_temp_mean_end /= XUNDEF -ldonorm = trim(cles_norm_type) /= 'NONE' -! -!* 2.4 Updraft quantities -! ------------------ -! -if ( lles_updraft ) then - cgroup = 'Updraft' - cgroupcomment = 'Updraft vertical profiles of some resolved and subgrid fluxes, variances and covariances' - - call Les_diachro_write( tpdiafile, XLES_UPDRAFT, 'UP_FRAC', 'Updraft fraction', '1' ) - call Les_diachro_write( tpdiafile, XLES_UPDRAFT_W, 'UP_W', 'Updraft W mean value', 'm s-1' ) - call Les_diachro_write( tpdiafile, XLES_UPDRAFT_Th, 'UP_TH', 'Updraft potential temperature mean value', 'K' ) - if ( luserc ) & - call Les_diachro_write( tpdiafile, XLES_UPDRAFT_Thl, 'UP_THL', 'Updraft liquid potential temperature mean value', 'K' ) - if ( luserv ) & - call Les_diachro_write( tpdiafile, XLES_UPDRAFT_Thv, 'UP_THV', 'Updraft virtual potential temperature mean value', 'K' ) - call Les_diachro_write( tpdiafile, XLES_UPDRAFT_Ke, 'UP_KE', 'Updraft resolved TKE mean value', 'm2 s-2' ) - call Les_diachro_write( tpdiafile, XLES_UPDRAFT_Tke, 'UP_TKE', 'Updraft subgrid TKE mean value', 'm2 s-2' ) - if ( luserv ) & - call Les_diachro_write( tpdiafile, XLES_UPDRAFT_Rv, 'UP_RV', 'Updraft water vapor mean value', 'kg kg-1' ) - if ( luserc ) & - call Les_diachro_write( tpdiafile, XLES_UPDRAFT_Rc, 'UP_RC', 'Updraft cloud water mean value', 'kg kg-1' ) - if ( luserr ) & - call Les_diachro_write( tpdiafile, XLES_UPDRAFT_Rr, 'UP_RR', 'Updraft rain mean value', 'kg kg-1' ) - if ( luseri ) & - call Les_diachro_write( tpdiafile, XLES_UPDRAFT_Ri, 'UP_RI', 'Updraft ice mean value', 'kg kg-1' ) - if ( lusers ) & - call Les_diachro_write( tpdiafile, XLES_UPDRAFT_Rs, 'UP_RS', 'Updraft snow mean value', 'kg kg-1' ) - if ( luserg ) & - call Les_diachro_write( tpdiafile, XLES_UPDRAFT_Rg, 'UP_RG', 'Updraft graupel mean value', 'kg kg-1' ) - if ( luserh ) & - call Les_diachro_write( tpdiafile, XLES_UPDRAFT_Rh, 'UP_RH', 'Updraft hail mean value', 'kg kg-1' ) - - if ( nsv > 0 ) then - tfield%ndims = 3 - tfield%ndimlist(1) = NMNHDIM_BUDGET_LES_LEVEL - tfield%ndimlist(2) = NMNHDIM_BUDGET_LES_TIME - tfield%ndimlist(3) = NMNHDIM_BUDGET_LES_SV - tfield%ndimlist(4:) = NMNHDIM_UNUSED - - call Les_diachro_write( tpdiafile, XLES_UPDRAFT_Sv, 'UP_SV', 'Updraft scalar variables mean values', 'kg kg-1' ) - - tfield%ndims = 2 - !tfield%ndimlist(1) = NMNHDIM_BUDGET_LES_LEVEL - !tfield%ndimlist(2) = NMNHDIM_BUDGET_LES_TIME - tfield%ndimlist(3) = NMNHDIM_UNUSED - !tfield%ndimlist(4:) = NMNHDIM_UNUSED - end if - - call Les_diachro_write( tpdiafile, XLES_UPDRAFT_Th2, 'UP_TH2', 'Updraft resolved Theta variance', 'K2' ) - if ( luserc ) & - call Les_diachro_write( tpdiafile, XLES_UPDRAFT_Thl2, 'UP_THL2', 'Updraft resolved Theta_l variance', 'K2' ) - if ( luserv ) & - call Les_diachro_write( tpdiafile, XLES_UPDRAFT_ThThv, 'UP_THTV', 'Updraft resolved Theta Theta_v covariance', 'K2' ) - if ( luserc ) & - call Les_diachro_write( tpdiafile, XLES_UPDRAFT_ThlThv, 'UP_TLTV', 'Updraft resolved Theta_l Theta_v covariance', 'K2' ) - call Les_diachro_write( tpdiafile, XLES_UPDRAFT_WTh, 'UP_WTH', 'Updraft resolved WTh flux', 'm K s-1' ) - if ( luserc ) & - call Les_diachro_write( tpdiafile, XLES_UPDRAFT_WThl, 'UP_WTHL', 'Updraft resolved WThl flux', 'm K s-1' ) - if ( luserv ) & - call Les_diachro_write( tpdiafile, XLES_UPDRAFT_WThv, 'UP_WTHV', 'Updraft resolved WThv flux', 'm K s-1' ) - - if ( luserv ) then - call Les_diachro_write( tpdiafile, XLES_UPDRAFT_Rv2, 'UP_RV2', 'Updraft resolved water vapor variance', 'kg2 kg-2' ) - call Les_diachro_write( tpdiafile, XLES_UPDRAFT_ThRv, 'UP_THRV', 'Updraft resolved <thrv> covariance', 'K kg kg-1' ) - if ( luserc ) & - call Les_diachro_write( tpdiafile, XLES_UPDRAFT_ThlRv, 'UP_THLRV', 'Updraft resolved <thlrv> covariance', 'K kg kg-1' ) - call Les_diachro_write( tpdiafile, XLES_UPDRAFT_ThvRv, 'UP_THVRV', 'Updraft resolved <thvrv> covariance', 'K kg kg-1' ) - call Les_diachro_write( tpdiafile, XLES_UPDRAFT_WRv, 'UP_WRV', 'Updraft resolved <wrv> vertical flux', 'm kg kg-1 s-1' ) - end if - - if ( luserc ) then - call Les_diachro_write( tpdiafile, XLES_UPDRAFT_Rc2, 'UP_RC2', 'Updraft resolved cloud water variance', 'kg2 kg-2' ) - call Les_diachro_write( tpdiafile, XLES_UPDRAFT_ThRc, 'UP_THRC', 'Updraft resolved <thrc> covariance', 'K kg kg-1' ) - call Les_diachro_write( tpdiafile, XLES_UPDRAFT_ThlRc, 'UP_THLRC', 'Updraft resolved <thlrc> covariance', 'K kg kg-1' ) - call Les_diachro_write( tpdiafile, XLES_UPDRAFT_ThvRc, 'UP_THVRC', 'Updraft resolved <thvrc> covariance', 'K kg kg-1' ) - call Les_diachro_write( tpdiafile, XLES_UPDRAFT_WRc, 'UP_WRC', 'Updraft resolved <wrc> vertical flux', 'm kg kg-1 s-1' ) - end if - - if ( luseri ) then - call Les_diachro_write( tpdiafile, XLES_UPDRAFT_Ri2, 'UP_RI2', 'Updraft resolved cloud ice variance', 'kg2 kg-2' ) - call Les_diachro_write( tpdiafile, XLES_UPDRAFT_ThRi, 'UP_THRI', 'Updraft resolved <thri> covariance', 'K kg kg-1' ) - call Les_diachro_write( tpdiafile, XLES_UPDRAFT_ThlRi, 'UP_THLRI', 'Updraft resolved <thlri> covariance', 'K kg kg-1' ) - call Les_diachro_write( tpdiafile, XLES_UPDRAFT_ThvRi, 'UP_THVRI', 'Updraft resolved <thvri> covariance', 'K kg kg-1' ) - call Les_diachro_write( tpdiafile, XLES_UPDRAFT_WRi, 'UP_WRI', 'Updraft resolved <wri> vertical flux', 'm kg kg-1 s-1' ) - end if - - - if ( nsv > 0 ) then - tfield%ndims = 3 - tfield%ndimlist(1) = NMNHDIM_BUDGET_LES_LEVEL - tfield%ndimlist(2) = NMNHDIM_BUDGET_LES_TIME - tfield%ndimlist(3) = NMNHDIM_BUDGET_LES_SV - tfield%ndimlist(4:) = NMNHDIM_UNUSED - - call Les_diachro_write( tpdiafile, XLES_UPDRAFT_Sv2, 'UP_SV2', 'Updraft resolved scalar variables variances', 'kg2 kg-2' ) - call Les_diachro_write( tpdiafile, XLES_UPDRAFT_ThSv, 'UP_THSV', 'Updraft resolved <ThSv> variance', 'K kg kg-1' ) - if ( luserc ) & - call Les_diachro_write( tpdiafile, XLES_UPDRAFT_ThlSv, 'UP_THLSV', 'Updraft resolved <ThlSv> variance', 'K kg kg-1' ) - if ( luserv ) & - call Les_diachro_write( tpdiafile, XLES_UPDRAFT_ThvSv, 'UP_THVSV', 'Updraft resolved <ThvSv> variance', 'K kg kg-1' ) - call Les_diachro_write( tpdiafile, XLES_UPDRAFT_WSv, 'UP_WSV', 'Updraft resolved <wSv> vertical flux', 'm kg kg-1 s-1' ) - - tfield%ndims = 2 - !tfield%ndimlist(1) = NMNHDIM_BUDGET_LES_LEVEL - !tfield%ndimlist(2) = NMNHDIM_BUDGET_LES_TIME - tfield%ndimlist(3) = NMNHDIM_UNUSED - !tfield%ndimlist(4:) = NMNHDIM_UNUSED - end if -end if -! -! -!* 2.5 Downdraft quantities -! -------------------- -! -if ( lles_downdraft ) then - cgroup = 'Downdraft' - cgroupcomment = 'Downdraft vertical profiles of some resolved and subgrid fluxes, variances and covariances' - - call Les_diachro_write( tpdiafile, XLES_DOWNDRAFT, 'DW_FRAC', 'Downdraft fraction', '1' ) - call Les_diachro_write( tpdiafile, XLES_DOWNDRAFT_W, 'DW_W', 'Downdraft W mean value', 'm s-1' ) - call Les_diachro_write( tpdiafile, XLES_DOWNDRAFT_Th, 'DW_TH', 'Downdraft potential temperature mean value', 'K' ) - if ( luserc ) & - call Les_diachro_write( tpdiafile, XLES_DOWNDRAFT_Thl, 'DW_THL', 'Downdraft liquid potential temperature mean value', 'K' ) - if ( luserv ) & - call Les_diachro_write( tpdiafile, XLES_DOWNDRAFT_Thv, 'DW_THV', 'Downdraft virtual potential temperature mean value', 'K' ) - call Les_diachro_write( tpdiafile, XLES_DOWNDRAFT_Ke, 'DW_KE', 'Downdraft resolved TKE mean value', 'm2 s-2' ) - call Les_diachro_write( tpdiafile, XLES_DOWNDRAFT_Tke, 'DW_TKE', 'Downdraft subgrid TKE mean value', 'm2 s-2' ) - if ( luserv ) & - call Les_diachro_write( tpdiafile, XLES_DOWNDRAFT_Rv, 'DW_RV', 'Downdraft water vapor mean value', 'kg kg-1' ) - if ( luserc ) & - call Les_diachro_write( tpdiafile, XLES_DOWNDRAFT_Rc, 'DW_RC', 'Downdraft cloud water mean value', 'kg kg-1' ) - if ( luserr ) & - call Les_diachro_write( tpdiafile, XLES_DOWNDRAFT_Rr, 'DW_RR', 'Downdraft rain mean value', 'kg kg-1' ) - if ( luseri ) & - call Les_diachro_write( tpdiafile, XLES_DOWNDRAFT_Ri, 'DW_RI', 'Downdraft ice mean value', 'kg kg-1' ) - if ( lusers ) & - call Les_diachro_write( tpdiafile, XLES_DOWNDRAFT_Rs, 'DW_RS', 'Downdraft snow mean value', 'kg kg-1' ) - if ( luserg ) & - call Les_diachro_write( tpdiafile, XLES_DOWNDRAFT_Rg, 'DW_RG', 'Downdraft graupel mean value', 'kg kg-1' ) - if ( luserh ) & - call Les_diachro_write( tpdiafile, XLES_DOWNDRAFT_Rh, 'DW_RH', 'Downdraft hail mean value', 'kg kg-1' ) - - if ( nsv > 0 ) then - tfield%ndims = 3 - tfield%ndimlist(1) = NMNHDIM_BUDGET_LES_LEVEL - tfield%ndimlist(2) = NMNHDIM_BUDGET_LES_TIME - tfield%ndimlist(3) = NMNHDIM_BUDGET_LES_SV - tfield%ndimlist(4:) = NMNHDIM_UNUSED - - call Les_diachro_write( tpdiafile, XLES_DOWNDRAFT_Sv, 'DW_SV', 'Downdraft scalar variables mean values', 'kg kg-1' ) - - tfield%ndims = 2 - !tfield%ndimlist(1) = NMNHDIM_BUDGET_LES_LEVEL - !tfield%ndimlist(2) = NMNHDIM_BUDGET_LES_TIME - tfield%ndimlist(3) = NMNHDIM_UNUSED - !tfield%ndimlist(4:) = NMNHDIM_UNUSED - end if - - call Les_diachro_write( tpdiafile, XLES_DOWNDRAFT_Th2, 'DW_TH2', 'Downdraft resolved Theta variance', 'K2' ) - if ( luserc ) & - call Les_diachro_write( tpdiafile, XLES_DOWNDRAFT_Thl2, 'DW_THL2', 'Downdraft resolved Theta_l variance', 'K2' ) - if ( luserv ) & - call Les_diachro_write( tpdiafile, XLES_DOWNDRAFT_ThThv, 'DW_THTV', 'Downdraft resolved Theta Theta_v covariance', 'K2' ) - if ( luserc ) & - call Les_diachro_write( tpdiafile, XLES_DOWNDRAFT_ThlThv, 'DW_TLTV', 'Downdraft resolved Theta_l Theta_v covariance', 'K2' ) - call Les_diachro_write( tpdiafile, XLES_DOWNDRAFT_WTh, 'DW_WTH', 'Downdraft resolved WTh flux', 'm K s-1' ) - if ( luserc ) & - call Les_diachro_write( tpdiafile, XLES_DOWNDRAFT_WThl, 'DW_WTHL', 'Downdraft resolved WThl flux', 'm K s-1' ) - if ( luserv ) & - call Les_diachro_write( tpdiafile, XLES_DOWNDRAFT_WThv, 'DW_WTHV', 'Downdraft resolved WThv flux', 'm K s-1' ) - - if ( luserv ) then - call Les_diachro_write( tpdiafile, XLES_DOWNDRAFT_Rv2, 'DW_RV2', 'Downdraft resolved water vapor variance', 'kg2 kg-2' ) - call Les_diachro_write( tpdiafile, XLES_DOWNDRAFT_ThRv, 'DW_THRV', 'Downdraft resolved <thrv> covariance', 'K kg kg-1' ) - if ( luserc ) & - call Les_diachro_write( tpdiafile, XLES_DOWNDRAFT_ThlRv, 'DW_THLRV', 'Downdraft resolved <thlrv> covariance', 'K kg kg-1' ) - call Les_diachro_write( tpdiafile, XLES_DOWNDRAFT_ThvRv, 'DW_THVRV', 'Downdraft resolved <thvrv> covariance', 'K kg kg-1' ) - call Les_diachro_write( tpdiafile, XLES_DOWNDRAFT_WRv, 'DW_WRV', 'Downdraft resolved <wrv> vertical flux', & - 'm kg kg-1 s-1' ) - end if - - if ( luserc ) then - call Les_diachro_write( tpdiafile, XLES_DOWNDRAFT_Rc2, 'DW_RC2', 'Downdraft resolved cloud water variance', 'kg2 kg-2' ) - call Les_diachro_write( tpdiafile, XLES_DOWNDRAFT_ThRc, 'DW_THRC', 'Downdraft resolved <thrc> covariance', 'K kg kg-1' ) - call Les_diachro_write( tpdiafile, XLES_DOWNDRAFT_ThlRc, 'DW_THLRC', 'Downdraft resolved <thlrc> covariance', 'K kg kg-1' ) - call Les_diachro_write( tpdiafile, XLES_DOWNDRAFT_ThvRc, 'DW_THVRC', 'Downdraft resolved <thvrc> covariance', 'K kg kg-1' ) - call Les_diachro_write( tpdiafile, XLES_DOWNDRAFT_WRc, 'DW_WRC', 'Downdraft resolved <wrc> vertical flux', & - 'm kg kg-1 s-1' ) - end if - - if ( luseri ) then - call Les_diachro_write( tpdiafile, XLES_DOWNDRAFT_Ri2, 'DW_RI2', 'Downdraft resolved cloud ice variance', 'kg2 kg-2' ) - call Les_diachro_write( tpdiafile, XLES_DOWNDRAFT_ThRi, 'DW_THRI', 'Downdraft resolved <thri> covariance', 'K kg kg-1' ) - call Les_diachro_write( tpdiafile, XLES_DOWNDRAFT_ThlRi, 'DW_THLRI', 'Downdraft resolved <thlri> covariance', 'K kg kg-1' ) - call Les_diachro_write( tpdiafile, XLES_DOWNDRAFT_ThvRi, 'DW_THVRI', 'Downdraft resolved <thvri> covariance', 'K kg kg-1' ) - call Les_diachro_write( tpdiafile, XLES_DOWNDRAFT_WRi, 'DW_WRI', 'Downdraft resolved <wri> vertical flux', & - 'm kg kg-1 s-1' ) - end if - - - if ( nsv > 0 ) then - tfield%ndims = 3 - tfield%ndimlist(1) = NMNHDIM_BUDGET_LES_LEVEL - tfield%ndimlist(2) = NMNHDIM_BUDGET_LES_TIME - tfield%ndimlist(3) = NMNHDIM_BUDGET_LES_SV - tfield%ndimlist(4:) = NMNHDIM_UNUSED - - call Les_diachro_write( tpdiafile, XLES_DOWNDRAFT_Sv2, 'DW_SV2', 'Downdraft resolved scalar variables variances', & - 'kg2 kg-2' ) - call Les_diachro_write( tpdiafile, XLES_DOWNDRAFT_ThSv, 'DW_THSV', 'Downdraft resolved <ThSv> variance', & - 'K kg kg-1' ) - if ( luserc ) & - call Les_diachro_write( tpdiafile, XLES_DOWNDRAFT_ThlSv, 'DW_THLSV', 'Downdraft resolved <ThlSv> variance', & - 'K kg kg-1' ) - if ( luserv ) & - call Les_diachro_write( tpdiafile, XLES_DOWNDRAFT_ThvSv, 'DW_THVSV', 'Downdraft resolved <ThvSv> variance', & - 'K kg kg-1' ) - call Les_diachro_write( tpdiafile, XLES_DOWNDRAFT_WSv, 'DW_WSV', 'Downdraft resolved <wSv> vertical flux', & - 'm kg kg-1 s-1' ) - - tfield%ndims = 2 - !tfield%ndimlist(1) = NMNHDIM_BUDGET_LES_LEVEL - !tfield%ndimlist(2) = NMNHDIM_BUDGET_LES_TIME - tfield%ndimlist(3) = NMNHDIM_UNUSED - !tfield%ndimlist(4:) = NMNHDIM_UNUSED - end if -end if -! -!------------------------------------------------------------------------------- -! -!* 3. surface normalization parameters -! -------------------------------- -! -cgroup = 'Radiation' -cgroupcomment = 'Radiative terms' - -!Prepare metadata (used in Les_diachro_write calls) -tfield%ndims = 2 -tfield%ndimlist(1) = NMNHDIM_BUDGET_LES_LEVEL -tfield%ndimlist(2) = NMNHDIM_BUDGET_LES_TIME -tfield%ndimlist(3:) = NMNHDIM_UNUSED - -ldoavg = xles_temp_mean_start /= XUNDEF .and. xles_temp_mean_end /= XUNDEF -ldonorm = .false. - -call Les_diachro_write( tpdiafile, XLES_SWU, 'SWU', 'SW upward radiative flux', 'W m-2' ) -call Les_diachro_write( tpdiafile, XLES_SWD, 'SWD', 'SW downward radiative flux', 'W m-2' ) -call Les_diachro_write( tpdiafile, XLES_LWU, 'LWU', 'LW upward radiative flux', 'W m-2' ) -call Les_diachro_write( tpdiafile, XLES_LWD, 'LWD', 'LW downward radiative flux', 'W m-2' ) -call Les_diachro_write( tpdiafile, XLES_DTHRADSW, 'DTHRADSW', 'SW radiative temperature tendency', 'K s-1' ) -call Les_diachro_write( tpdiafile, XLES_DTHRADLW, 'DTHRADLW', 'LW radiative temperature tendency', 'K s-1' ) -!writes mean_effective radius at all levels -call Les_diachro_write( tpdiafile, XLES_RADEFF, 'RADEFF', 'Mean effective radius', 'micron' ) - - -cgroup = 'Surface' -cgroupcomment = 'Averaged surface fields' - -! !Prepare metadate (used in Les_diachro_write calls) -tfield%ndims = 1 -tfield%ndimlist(1) = NMNHDIM_BUDGET_LES_TIME -tfield%ndimlist(2:) = NMNHDIM_UNUSED - -call Les_diachro_write( tpdiafile, XLES_Q0, 'Q0', 'Sensible heat flux at the surface', 'm K s-1' ) -if ( luserv ) & -call Les_diachro_write( tpdiafile, XLES_E0, 'E0', 'Latent heat flux at the surface', 'kg kg-1 m s-1' ) - -if ( nsv > 0 ) then - tfield%ndims = 2 - tfield%ndimlist(1) = NMNHDIM_BUDGET_LES_TIME - tfield%ndimlist(2) = NMNHDIM_BUDGET_LES_SV - tfield%ndimlist(3:) = NMNHDIM_UNUSED - - call Les_diachro_write( tpdiafile, XLES_SV0, 'SV0', 'Scalar variable fluxes at the surface', 'kg kg-1 m s-1' ) - - tfield%ndims = 1 - !tfield%ndimlist(1) = NMNHDIM_BUDGET_LES_TIME - tfield%ndimlist(2) = NMNHDIM_UNUSED - !tfield%ndimlist(3:) = NMNHDIM_UNUSED -end if - -call Les_diachro_write( tpdiafile, XLES_USTAR, 'Ustar', 'Friction velocity', 'm s-1' ) -call Les_diachro_write( tpdiafile, XLES_WSTAR, 'Wstar', 'Convective velocity', 'm s-1' ) -call Les_diachro_write( tpdiafile, XLES_MO_LENGTH, 'L_MO', 'Monin-Obukhov length', 'm' ) -if ( luserr ) & -call Les_diachro_write( tpdiafile, XLES_PRECFR, 'PREC_FRAC', 'Fraction of columns where rain at surface', '1' ) -if ( luserr ) & -call Les_diachro_write( tpdiafile, XLES_INPRR, 'INST_PREC', 'Instantaneous precipitation rate', 'mm day-1' ) -if ( luserc ) & -call Les_diachro_write( tpdiafile, XLES_INPRC, 'INST_SEDIM', 'Instantaneous cloud precipitation rate', 'mm day-1' ) -if ( luserc .and. ( ldeposc .or. ldepoc ) ) & -call Les_diachro_write( tpdiafile, XLES_INDEP, 'INST_DEPOS', 'Instantaneous cloud deposition rate', 'mm day-1' ) -if ( luserr ) & -call Les_diachro_write( tpdiafile, XLES_RAIN_INPRR, 'RAIN_PREC', 'Instantaneous precipitation rate over rainy grid cells', & - 'mm day-1' ) -if ( luserr ) & -call Les_diachro_write( tpdiafile, XLES_ACPRR, 'ACCU_PREC', 'Accumulated precipitation rate', 'mm' ) - - -cgroup = 'Miscellaneous' -cgroupcomment = 'Miscellaneous terms (geometry, various unclassified averaged terms...)' - -call Les_diachro_write( tpdiafile, XLES_BL_HEIGHT, 'BL_H', 'Boundary Layer Height', 'm' ) -call Les_diachro_write( tpdiafile, XLES_INT_TKE, 'INT_TKE', 'Vertical integrated TKE', 'm2 s-2' ) -if ( luserc ) & -call Les_diachro_write( tpdiafile, XLES_ZCB, 'ZCB', 'Cloud base Height', 'm' ) -if ( luserc ) & -call Les_diachro_write( tpdiafile, XLES_CFtot, 'ZCFTOT', 'Total cloud cover (rc>1e-6)', '1' ) -if ( luserc ) & -call Les_diachro_write( tpdiafile, XLES_CF2tot, 'ZCF2TOT', 'Total cloud cover (rc>1e-5)', '1' ) -if ( luserc ) & -call Les_diachro_write( tpdiafile, XLES_LWP, 'LWP', 'Liquid Water path', 'kg m-2' ) -if ( luserc ) & -call Les_diachro_write( tpdiafile, XLES_LWPVAR, 'LWPVAR', 'Liquid Water path variance', 'kg m-4' ) -if ( luserr ) & -call Les_diachro_write( tpdiafile, XLES_RWP, 'RWP', 'Rain Water path', 'kg m-2' ) -if ( luseri ) & -call Les_diachro_write( tpdiafile, XLES_IWP, 'IWP', 'Ice Water path', 'kg m-2' ) -if ( lusers ) & -call Les_diachro_write( tpdiafile, XLES_SWP, 'SWP', 'Snow Water path', 'kg m-2' ) -if ( luserg ) & -call Les_diachro_write( tpdiafile, XLES_GWP, 'GWP', 'Graupel Water path', 'kg m-2' ) -if ( luserh ) & -call Les_diachro_write( tpdiafile, XLES_HWP, 'HWP', 'Hail Water path', 'kg m-2' ) -if ( luserc ) & -call Les_diachro_write( tpdiafile, XLES_ZMAXCF, 'ZMAXCF', 'Height of Cloud fraction maximum (rc>1e-6)', 'm' ) -if ( luserc ) & -call Les_diachro_write( tpdiafile, XLES_ZMAXCF2, 'ZMAXCF2', 'Height of Cloud fraction maximum (rc>1e-5)', 'm' ) - -!------------------------------------------------------------------------------- -! -!* 4. LES budgets -! ----------- -! -call Write_les_budget_n( tpdiafile ) - -if ( luserv ) call Write_les_rt_budget_n( tpdiafile ) - -if ( nsv > 0 ) call Write_les_sv_budget_n( tpdiafile ) -! -!------------------------------------------------------------------------------- -! -!* 5. (ni,z,t) and (nj,z,t) 2points correlations -! ------------------------------------------ -! -if ( nspectra_k > 0 ) then - tfieldx%cstdname = '' - tfieldx%ngrid = 0 !Not on the Arakawa grid - tfieldx%ntype = TYPEREAL - tfieldx%ndims = 3 - tfieldx%ndimlist(1) = NMNHDIM_SPECTRA_2PTS_NI - tfieldx%ndimlist(2) = NMNHDIM_SPECTRA_LEVEL - tfieldx%ndimlist(3) = NMNHDIM_BUDGET_LES_TIME - tfieldx%ndimlist(4:) = NMNHDIM_UNUSED - - tfieldy%cstdname = '' - tfieldy%ngrid = 0 !Not on the Arakawa grid - tfieldy%ntype = TYPEREAL - tfieldy%ndims = 3 - tfieldy%ndimlist(1) = NMNHDIM_SPECTRA_2PTS_NJ - tfieldy%ndimlist(2) = NMNHDIM_SPECTRA_LEVEL - tfieldy%ndimlist(3) = NMNHDIM_BUDGET_LES_TIME - tfieldy%ndimlist(4:) = NMNHDIM_UNUSED - - call Les_diachro_2pt_write( tpdiafile, XCORRi_UU, XCORRj_UU, 'UU', 'U*U 2 points correlations', 'm2 s-2' ) - call Les_diachro_2pt_write( tpdiafile, XCORRi_VV, XCORRj_VV, 'VV', 'V*V 2 points correlations', 'm2 s-2' ) - call Les_diachro_2pt_write( tpdiafile, XCORRi_WW, XCORRj_WW, 'WW', 'W*W 2 points correlations', 'm2 s-2' ) - call Les_diachro_2pt_write( tpdiafile, XCORRi_UV, XCORRj_UV, 'UV', 'U*V 2 points correlations', 'm2 s-2' ) - call Les_diachro_2pt_write( tpdiafile, XCORRi_WU, XCORRj_WU, 'WU', 'W*U 2 points correlations', 'm2 s-2' ) - call Les_diachro_2pt_write( tpdiafile, XCORRi_WV, XCORRj_WV, 'WV', 'W*V 2 points correlations', 'm2 s-2' ) - - call Les_diachro_2pt_write( tpdiafile, XCORRi_ThTh, XCORRj_ThTh, 'THTH', 'Th*Th 2 points correlations', 'K2' ) - if ( luserc ) & - call Les_diachro_2pt_write( tpdiafile, XCORRi_ThlThl, XCORRj_ThlThl, 'TLTL', 'Thl*Thl 2 points correlations', 'K2' ) - call Les_diachro_2pt_write( tpdiafile, XCORRi_WTh, XCORRj_WTh, 'WTH', 'W*Th 2 points correlations', 'm K s-1' ) - if ( luserc ) & - call Les_diachro_2pt_write( tpdiafile, XCORRi_WThl, XCORRj_WThl, 'WTHL', 'W*Thl 2 points correlations', 'm K s-1' ) - - if ( luserv ) then - call Les_diachro_2pt_write( tpdiafile, XCORRi_RvRv, XCORRj_RvRv, 'RVRV', 'rv*rv 2 points correlations', 'kg2 kg-2' ) - call Les_diachro_2pt_write( tpdiafile, XCORRi_ThRv, XCORRj_ThRv, 'THRV', 'TH*RV 2 points correlations', 'K kg kg-1' ) - if ( luserc ) & - call Les_diachro_2pt_write( tpdiafile, XCORRi_ThlRv, XCORRj_ThlRv, 'TLRV', 'thl*rv 2 points correlations', 'K kg kg-1' ) - call Les_diachro_2pt_write( tpdiafile, XCORRi_WRv, XCORRj_WRv, 'WRV', 'W*rv 2 points correlations', 'm kg s-1 kg-1' ) - end if - - if ( luserc ) then - call Les_diachro_2pt_write( tpdiafile, XCORRi_RcRc, XCORRj_RcRc, 'RCRC', 'rc*rc 2 points correlations', 'kg2 kg-2' ) - call Les_diachro_2pt_write( tpdiafile, XCORRi_ThRc, XCORRj_ThRc, 'THRC', 'th*rc 2 points correlations', 'K kg kg-1' ) - call Les_diachro_2pt_write( tpdiafile, XCORRi_ThlRc, XCORRj_ThlRc, 'TLRC', 'thl*rc 2 points correlations', 'K kg kg-1' ) - call Les_diachro_2pt_write( tpdiafile, XCORRi_WRc, XCORRj_WRc, 'WRC', 'W*rc 2 points correlations', 'm kg s-1 kg-1' ) - end if - - if ( luseri ) then - call Les_diachro_2pt_write( tpdiafile, XCORRi_RiRi, XCORRj_RiRi, 'RIRI', 'ri*ri 2 points correlations', 'kg2 kg-2' ) - call Les_diachro_2pt_write( tpdiafile, XCORRi_ThRi, XCORRj_ThRi, 'THRI', 'th*ri 2 points correlations', 'K kg kg-1' ) - call Les_diachro_2pt_write( tpdiafile, XCORRi_ThlRi, XCORRj_ThlRi, 'TLRI', 'thl*ri 2 points correlations', 'K kg kg-1' ) - call Les_diachro_2pt_write( tpdiafile, XCORRi_WRi, XCORRj_WRi, 'WRI', 'W*ri 2 points correlations', 'm kg s-1 kg-1' ) - end if - -!PW: TODO: ameliorer le ygroup (tenir compte de ce qu'est la variable scalaire et pas juste son jsv!) - do jsv = 1, nsv - Write( ygroup, fmt = "( a2, i3.3 )" ) "SS", jsv - call Les_diachro_2pt_write( tpdiafile, XCORRi_SvSv(:,:,:,JSV), XCORRj_SvSv(:,:,:,JSV), ygroup, & - 'Sv*Sv 2 points correlations','kg2 kg-2' ) - end do - -!PW: TODO: ameliorer le ygroup (tenir compte de ce qu'est la variable scalaire et pas juste son jsv!) - do jsv = 1, nsv - Write( ygroup, fmt = "( a2, i3.3 )" ) "WS", jsv - call Les_diachro_2pt_write( tpdiafile, XCORRi_WSv(:,:,:,JSV), XCORRj_WSv(:,:,:,JSV), ygroup, & - 'W*Sv 2 points correlations','m kg s-1 kg-1' ) - end do -end if -! -!------------------------------------------------------------------------------- -! -!* 6. spectra and time-averaged profiles (if first call to WRITE_LES_n) -! ---------------------------------- -! -call Les_spec_n( tpdiafile ) -! -!------------------------------------------------------------------------------- -! -!* 7. deallocations -! ------------- -! -CALL LES_DEALLOCATE('XLES_CURRENT_Z') - -IF (CLES_NORM_TYPE/='NONE' ) THEN - CALL LES_DEALLOCATE('XLES_NORM_M') - CALL LES_DEALLOCATE('XLES_NORM_S') - CALL LES_DEALLOCATE('XLES_NORM_K') - CALL LES_DEALLOCATE('XLES_NORM_RHO') - CALL LES_DEALLOCATE('XLES_NORM_RV') - CALL LES_DEALLOCATE('XLES_NORM_SV') - CALL LES_DEALLOCATE('XLES_NORM_P') -END IF - -end subroutine Write_les_n - -!------------------------------------------------------------------------------ - -subroutine Les_diachro_write_1D( tpdiafile, pdata, hmnhname, hcomment, hunits ) - -use modd_io, only: tfiledata - -use mode_les_diachro, only: Les_diachro - -type(tfiledata), intent(in) :: tpdiafile ! file to write -real, dimension(:), intent(in) :: pdata -character(len=*), intent(in) :: hmnhname -character(len=*), intent(in) :: hcomment -character(len=*), intent(in) :: hunits - -tfield%cmnhname = hmnhname -tfield%clongname = hmnhname -tfield%ccomment = hcomment -tfield%cunits = hunits - -call Les_diachro( tpdiafile, tfield, cgroup, cgroupcomment, ldoavg, ldonorm, pdata ) - -end subroutine Les_diachro_write_1D - -!------------------------------------------------------------------------------ - -subroutine Les_diachro_write_2D( tpdiafile, pdata, hmnhname, hcomment, hunits ) - -use modd_io, only: tfiledata - -use mode_les_diachro, only: Les_diachro - -type(tfiledata), intent(in) :: tpdiafile ! file to write -real, dimension(:,:), intent(in) :: pdata -character(len=*), intent(in) :: hmnhname -character(len=*), intent(in) :: hcomment -character(len=*), intent(in) :: hunits - -tfield%cmnhname = hmnhname -tfield%clongname = hmnhname -tfield%ccomment = hcomment -tfield%cunits = hunits - -call Les_diachro( tpdiafile, tfield, cgroup, cgroupcomment, ldoavg, ldonorm, pdata ) - -end subroutine Les_diachro_write_2D - -!------------------------------------------------------------------------------ - -subroutine Les_diachro_write_3D( tpdiafile, pdata, hmnhname, hcomment, hunits, hmasks ) - -use modd_io, only: tfiledata - -use mode_les_diachro, only: Les_diachro - -type(tfiledata), intent(in) :: tpdiafile ! file to write -real, dimension(:,:,:), intent(in) :: pdata -character(len=*), intent(in) :: hmnhname -character(len=*), intent(in) :: hcomment -character(len=*), intent(in) :: hunits -character(len=*), dimension(:), optional, intent(in) :: hmasks - -tfield%cmnhname = hmnhname -tfield%clongname = hmnhname -tfield%ccomment = hcomment -tfield%cunits = hunits - -call Les_diachro( tpdiafile, tfield, cgroup, cgroupcomment, ldoavg, ldonorm, pdata, hmasks = hmasks ) - -end subroutine Les_diachro_write_3D - -!------------------------------------------------------------------------------ - -subroutine Les_diachro_write_4D( tpdiafile, pdata, hmnhname, hcomment, hunits, hmasks ) - -use modd_io, only: tfiledata - -use mode_les_diachro, only: Les_diachro - -type(tfiledata), intent(in) :: tpdiafile ! file to write -real, dimension(:,:,:,:), intent(in) :: pdata -character(len=*), intent(in) :: hmnhname -character(len=*), intent(in) :: hcomment -character(len=*), intent(in) :: hunits -character(len=*), dimension(:), optional, intent(in) :: hmasks - -tfield%cmnhname = hmnhname -tfield%clongname = hmnhname -tfield%ccomment = hcomment -tfield%cunits = hunits - -call Les_diachro( tpdiafile, tfield, cgroup, cgroupcomment, ldoavg, ldonorm, pdata, hmasks = hmasks ) - -end subroutine Les_diachro_write_4D - -!------------------------------------------------------------------------------ - -subroutine Les_diachro_2pt_write( tpdiafile, zcorri, zcorrj, hmnhname, hcomment, hunits ) - -use modd_io, only: tfiledata - -use mode_les_diachro, only: Les_diachro_2pt - -type(tfiledata), intent(in) :: tpdiafile ! file to write -real, dimension(:,:,:), intent(in) :: zcorri ! 2 pts correlation data -real, dimension(:,:,:), intent(in) :: zcorrj ! 2 pts correlation data -character(len=*), intent(in) :: hmnhname -character(len=*), intent(in) :: hcomment -character(len=*), intent(in) :: hunits - -tfieldx%cmnhname = hmnhname -tfieldx%clongname = hmnhname -tfieldx%ccomment = hcomment -tfieldx%cunits = hunits - -tfieldy%cmnhname = hmnhname -tfieldy%clongname = hmnhname -tfieldy%ccomment = hcomment -tfieldy%cunits = hunits - -call Les_diachro_2pt( tpdiafile, tfieldx, tfieldy, zcorri, zcorrj ) - -end subroutine Les_diachro_2pt_write - -!------------------------------------------------------------------------------ - -end module mode_write_les_n diff --git a/src/mesonh/micro/c2r2_adjust.f90 b/src/mesonh/micro/c2r2_adjust.f90 index b97914d1af619016ef85478e6aa2c275eb31421c..c5e9d27bcd264a39895284056bb1fdaa9c22b715 100644 --- a/src/mesonh/micro/c2r2_adjust.f90 +++ b/src/mesonh/micro/c2r2_adjust.f90 @@ -146,7 +146,7 @@ use modd_budget, only: lbudget_th, lbudget_rv, lbudget_rc, lbudget_sv, tbudgets USE MODD_CONF USE MODD_CST -USE MODD_FIELD, only: tfielddata, TYPEREAL +USE MODD_FIELD, only: tfieldmetadata, TYPEREAL USE MODD_IO, ONLY: TFILEDATA USE MODD_LUNIT_n, ONLY: TLUOUT USE MODD_NSV, ONLY: NSV_C2R2BEG @@ -195,10 +195,10 @@ REAL, DIMENSION(SIZE(PRHODJ,1),SIZE(PRHODJ,2),SIZE(PRHODJ,3)) & ZW1,ZW2,ZW3 ! Work arrays for intermediate ! fields ! -INTEGER :: IRESP ! Return code of FM routines -INTEGER :: JITER,ITERMAX ! iterative loop for first order adjustment -INTEGER :: ILUOUT ! Logical unit of output listing -TYPE(TFIELDDATA) :: TZFIELD +INTEGER :: IRESP ! Return code of FM routines +INTEGER :: JITER,ITERMAX ! iterative loop for first order adjustment +INTEGER :: ILUOUT ! Logical unit of output listing +TYPE(TFIELDMETADATA) :: TZFIELD !------------------------------------------------------------------------------- ! !* 1. PRELIMINARIES @@ -405,16 +405,17 @@ IF ( HRAD /= 'NONE' ) THEN END IF ! IF ( tpfile%lopened ) THEN - TZFIELD%CMNHNAME = 'NEB' - TZFIELD%CSTDNAME = '' - TZFIELD%CLONGNAME = 'NEB' - TZFIELD%CUNITS = '1' - TZFIELD%CDIR = 'XY' - TZFIELD%CCOMMENT = 'X_Y_Z_NEB' - TZFIELD%NGRID = 1 - TZFIELD%NTYPE = TYPEREAL - TZFIELD%NDIMS = 3 - TZFIELD%LTIMEDEP = .TRUE. + TZFIELD = TFIELDMETADATA( & + CMNHNAME = 'NEB', & + CSTDNAME = '', & + CLONGNAME = 'NEB', & + CUNITS = '1', & + CDIR = 'XY', & + CCOMMENT = 'X_Y_Z_NEB', & + NGRID = 1, & + NTYPE = TYPEREAL, & + NDIMS = 3, & + LTIMEDEP = .TRUE. ) CALL IO_Field_write(TPFILE,TZFIELD,ZW1) END IF ! diff --git a/src/mesonh/micro/ini_lima_cold_mixed.f90 b/src/mesonh/micro/ini_lima_cold_mixed.f90 index c06c292124caf83cf1a3854f60f0b4eb44d5f95a..2e3d956a46102eb75e5707369aed815f7f9bb798 100644 --- a/src/mesonh/micro/ini_lima_cold_mixed.f90 +++ b/src/mesonh/micro/ini_lima_cold_mixed.f90 @@ -57,7 +57,8 @@ USE MODD_PARAM_LIMA USE MODD_PARAM_LIMA_WARM USE MODD_PARAM_LIMA_COLD USE MODD_PARAM_LIMA_MIXED -use MODD_RAIN_ICE_PARAM, only: XALPHA1, XALPHA2, XBETA1, XBETA2, IMNU0=>XMNU0, XNU10, XNU20 +USE MODD_RAIN_ICE_PARAM, ONLY: XALPHA1, XALPHA2, XBETA1, XBETA2, IMNU0=>XMNU0, XNU10, XNU20, & + RAIN_ICE_PARAM_ASSOCIATE USE MODD_REF ! use mode_msg @@ -155,6 +156,7 @@ ILUOUT0 = TLUOUT0%NLU !* 1. CHARACTERISTICS OF THE SPECIES ! ------------------------------ ! +CALL RAIN_ICE_PARAM_ASSOCIATE() ! !* 1.2 Ice crystal characteristics ! @@ -341,8 +343,8 @@ IF (GFLAG) THEN WRITE(UNIT=ILUOUT0,FMT='(" XLBEXH =",E13.6," XLBH =",E13.6)') XLBEXH,XLBH END IF ! -XLBDAS_MAX = 500000. ! used only before transforming lambda for non MP PSD -XLBDAS_MIN = 1000. *1.E-10 +XLBDAS_MAX = 1.E7 ! (eq to r~1E-7kg/kg) (for non MP PSD, use conversion XTRANS_MP_GAMMAS) +XLBDAS_MIN = 1. ! (eq to r~0.18kg/kg) (for non MP PSD, use conversion XTRANS_MP_GAMMAS) XLBDAG_MAX = 100000.0 ! ZCONC_MAX = 1.E6 ! Maximal concentration for falling particules set to 1 per cc diff --git a/src/mesonh/micro/ini_rain_ice.f90 b/src/mesonh/micro/ini_rain_ice.f90 index 38f8fed026c66cf7102942d0cb5d9ed0d25fc317..2f3b2b1c4aee01a9703c23f5351d0c27835246ec 100644 --- a/src/mesonh/micro/ini_rain_ice.f90 +++ b/src/mesonh/micro/ini_rain_ice.f90 @@ -442,11 +442,11 @@ XLBH = ( XAH*XCCH*MOMG(XALPHAH,XNUH,XBH) )**(-XLBEXH) XLBDAS_MAX = 100000.0 ! ZCONC_MAX = 1.E6 ! Maximal concentration for falling particules set to 1 per cc -#if defined(REPRO48) || defined(REPRO55) IF(XCCS>0. .AND. XCXS>0. )XLBDAS_MAX = ( ZCONC_MAX/XCCS )**(1./XCXS) +#if defined(REPRO48) || defined(REPRO55) #else -XLBDAS_MAX = 1.E6 -XLBDAS_MIN = 1000. +IF (LSNOW_T) XLBDAS_MAX = 1.E6 +XLBDAS_MIN = 1.E-10 #endif ! XCONC_SEA=1E8 ! 100/cm3 diff --git a/src/mesonh/micro/lima.f90 b/src/mesonh/micro/lima.f90 index 9859c4bd02f194d19caae1e7e1cbd7c522344a7c..0ed11fe4885abca003bda12c21d85a861f293d43 100644 --- a/src/mesonh/micro/lima.f90 +++ b/src/mesonh/micro/lima.f90 @@ -419,6 +419,8 @@ ZHOMFT(:,:,:) = 0. ZHOMFS(:,:,:) = 0. if ( lbu_enable ) then + Z_RR_CVRC(:,:,:) = 0. + Z_CR_CVRC(:,:,:) = 0. allocate( ZTOT_CR_BRKU (size( ptht, 1), size( ptht, 2), size( ptht, 3) ) ); ZTOT_CR_BRKU(:,:,:) = 0. allocate( ZTOT_TH_HONR (size( ptht, 1), size( ptht, 2), size( ptht, 3) ) ); ZTOT_TH_HONR(:,:,:) = 0. allocate( ZTOT_RR_HONR (size( ptht, 1), size( ptht, 2), size( ptht, 3) ) ); ZTOT_RR_HONR(:,:,:) = 0. @@ -679,6 +681,13 @@ ZT(:,:,:) = ZTHT(:,:,:) * ZEXN(:,:,:) ! ------------- ! ! +PINPRC=0. +PINDEP=0. +PINPRR=0. +PINPRI=0. +PINPRS=0. +PINPRG=0. +PINPRH=0. if ( lbu_enable ) then if ( lbudget_th ) call Budget_store_init( tbudgets(NBUDGET_TH), 'SEDI', zths(:, :, :) * prhodj(:, :, :) ) if ( lbudget_rc .and. lwarm .and. lsedc ) call Budget_store_init( tbudgets(NBUDGET_RC), 'SEDI', zrcs(:, :, :) * prhodj(:, :, :) ) @@ -767,8 +776,6 @@ IF (LWARM .AND. LDEPOC) THEN END IF ! ! -!!$Z_RR_CVRC(:,:,:) = 0. -!!$Z_CR_CVRC(:,:,:) = 0. !!$IF (LWARM .AND. LRAIN) THEN !!$ if( lbu_enable ) then !!$ if ( lbudget_rc ) call Budget_store_init( tbudgets(NBUDGET_RC), 'R2C1', zrcs(:, :, :) * prhodj(:, :, :) ) diff --git a/src/mesonh/micro/lima_adjust.f90 b/src/mesonh/micro/lima_adjust.f90 index 189fe45146155c66740f559f4db5c9e2bd006a29..54b749e8be0e1166ef23eda588f09ffb95cc164b 100644 --- a/src/mesonh/micro/lima_adjust.f90 +++ b/src/mesonh/micro/lima_adjust.f90 @@ -151,7 +151,7 @@ use modd_budget, only: lbu_enable, nbumod, tbudgets USE MODD_CONF USE MODD_CST -use modd_field, only: TFIELDDATA, TYPEREAL +use modd_field, only: TFIELDMETADATA, TYPEREAL USE MODD_IO, ONLY: TFILEDATA USE MODD_LUNIT_n, ONLY: TLUOUT USE MODD_NSV @@ -288,7 +288,7 @@ INTEGER :: JL ! and PACK intrinsics INTEGER :: JMOD, JMOD_IFN, JMOD_IMM ! INTEGER , DIMENSION(3) :: BV -TYPE(TFIELDDATA) :: TZFIELD +TYPE(TFIELDMETADATA) :: TZFIELD ! !------------------------------------------------------------------------------- ! @@ -1201,16 +1201,17 @@ IF ( SIZE(PSRCS,3) /= 0 ) THEN END IF ! IF ( tpfile%lopened ) THEN - TZFIELD%CMNHNAME = 'NEB' - TZFIELD%CSTDNAME = '' - TZFIELD%CLONGNAME = 'NEB' - TZFIELD%CUNITS = '1' - TZFIELD%CDIR = 'XY' - TZFIELD%CCOMMENT = 'X_Y_Z_NEB' - TZFIELD%NGRID = 1 - TZFIELD%NTYPE = TYPEREAL - TZFIELD%NDIMS = 3 - TZFIELD%LTIMEDEP = .TRUE. + TZFIELD = TFIELDMETADATA( & + CMNHNAME = 'NEB', & + CSTDNAME = '', & + CLONGNAME = 'NEB', & + CUNITS = '1', & + CDIR = 'XY', & + CCOMMENT = 'X_Y_Z_NEB', & + NGRID = 1, & + NTYPE = TYPEREAL, & + NDIMS = 3, & + LTIMEDEP = .TRUE. ) CALL IO_Field_write(TPFILE,TZFIELD,ZW) END IF ! @@ -1256,16 +1257,17 @@ IF ( tpfile%lopened ) THEN ZW1(:,:,:)= PPABSTT(:,:,:) ZW(:,:,:) = PRVT(:,:,:)*( ZW1(:,:,:)-ZW(:,:,:) ) / ( (XMV/XMD) * ZW(:,:,:) ) - 1.0 - TZFIELD%CMNHNAME = 'SSI' - TZFIELD%CSTDNAME = '' - TZFIELD%CLONGNAME = 'SSI' - TZFIELD%CUNITS = '' - TZFIELD%CDIR = 'XY' - TZFIELD%CCOMMENT = 'X_Y_Z_SSI' - TZFIELD%NGRID = 1 - TZFIELD%NTYPE = TYPEREAL - TZFIELD%NDIMS = 3 - TZFIELD%LTIMEDEP = .TRUE. + TZFIELD = TFIELDMETADATA( & + CMNHNAME = 'SSI', & + CSTDNAME = '', & + CLONGNAME = 'SSI', & + CUNITS = '', & + CDIR = 'XY', & + CCOMMENT = 'X_Y_Z_SSI', & + NGRID = 1, & + NTYPE = TYPEREAL, & + NDIMS = 3, & + LTIMEDEP = .TRUE. ) CALL IO_Field_write(TPFILE,TZFIELD,ZW) END IF ! diff --git a/src/mesonh/micro/lima_adjust_split.f90 b/src/mesonh/micro/lima_adjust_split.f90 index 2b07f24bd486b334074c1c651e7b6475bd2e4bff..d0b3425d8f83bec8cf9010ace6fe2dfab4e71acd 100644 --- a/src/mesonh/micro/lima_adjust_split.f90 +++ b/src/mesonh/micro/lima_adjust_split.f90 @@ -158,7 +158,7 @@ use modd_budget, only: lbu_enable, nbumod, tbudgets USE MODD_CONF USE MODD_CST -use modd_field, only: TFIELDDATA, TYPEREAL +use modd_field, only: TFIELDMETADATA, TYPEREAL USE MODD_IO, ONLY: TFILEDATA USE MODD_LUNIT_n, ONLY: TLUOUT USE MODD_NSV @@ -287,8 +287,8 @@ REAL, DIMENSION(SIZE(PRHODJ,1),SIZE(PRHODJ,2),SIZE(PRHODJ,3)) & ZRI, ZRI_IN, & Z_SIGS, Z_SRCS, & ZW_MF, & - ZCND, ZS, ZVEC1 -REAL, DIMENSION(SIZE(PRHODJ,1),SIZE(PRHODJ,2)) :: ZSIGQSAT2D, ZDUM + ZCND, ZS, ZVEC1,ZDUM +REAL, DIMENSION(SIZE(PRHODJ,1),SIZE(PRHODJ,2)) :: ZSIGQSAT2D ! INTEGER, DIMENSION(SIZE(PRHODJ,1),SIZE(PRHODJ,2),SIZE(PRHODJ,3)) :: IVEC1 ! @@ -302,6 +302,7 @@ INTEGER :: JITER,ITERMAX ! iterative loop for first order adju INTEGER :: ILUOUT ! Logical unit of output listing ! INTEGER :: ISIZE +LOGICAL :: G_SIGMAS, GUSERI REAL, DIMENSION(:), ALLOCATABLE :: ZRTMIN REAL, DIMENSION(:), ALLOCATABLE :: ZCTMIN ! @@ -309,8 +310,7 @@ integer :: idx integer :: JI, JJ, JK, jl INTEGER :: JMOD, JMOD_IFN, JMOD_IMM ! -TYPE(TFIELDDATA) :: TZFIELD -LOGICAL :: G_SIGMAS, GUSERI +TYPE(TFIELDMETADATA) :: TZFIELD ! !------------------------------------------------------------------------------- ! @@ -504,12 +504,11 @@ DO JITER =1,ITERMAX ZRC2=PRCT ZRV_IN=ZRV ZRC_IN=ZRC - ZRI_IN=0. IF (NMOM_I.EQ.1) THEN - ZRI=PRIS*PTSTEP + ZRI_IN=PRIS*PTSTEP GUSERI=.TRUE. ELSE - ZRI=0. + ZRI_IN=0. GUSERI=.FALSE. END IF IF (OSUBG_COND) THEN @@ -683,16 +682,17 @@ ELSE END IF ! IF ( tpfile%lopened ) THEN - TZFIELD%CMNHNAME = 'NEB' - TZFIELD%CSTDNAME = '' - TZFIELD%CLONGNAME = 'NEB' - TZFIELD%CUNITS = '1' - TZFIELD%CDIR = 'XY' - TZFIELD%CCOMMENT = 'X_Y_Z_NEB' - TZFIELD%NGRID = 1 - TZFIELD%NTYPE = TYPEREAL - TZFIELD%NDIMS = 3 - TZFIELD%LTIMEDEP = .TRUE. + TZFIELD = TFIELDMETADATA( & + CMNHNAME = 'NEB', & + CSTDNAME = '', & + CLONGNAME = 'NEB', & + CUNITS = '1', & + CDIR = 'XY', & + CCOMMENT = 'X_Y_Z_NEB', & + NGRID = 1, & + NTYPE = TYPEREAL, & + NDIMS = 3, & + LTIMEDEP = .TRUE. ) CALL IO_Field_write(TPFILE,TZFIELD,PCLDFR) END IF ! @@ -737,16 +737,17 @@ IF ( tpfile%lopened ) THEN ZW1(:,:,:)= PPABSTT(:,:,:) ZW(:,:,:) = PRVT(:,:,:)*( ZW1(:,:,:)-ZW(:,:,:) ) / ( (XMV/XMD) * ZW(:,:,:) ) - 1.0 - TZFIELD%CMNHNAME = 'SSI' - TZFIELD%CSTDNAME = '' - TZFIELD%CLONGNAME = 'SSI' - TZFIELD%CUNITS = '' - TZFIELD%CDIR = 'XY' - TZFIELD%CCOMMENT = 'X_Y_Z_SSI' - TZFIELD%NGRID = 1 - TZFIELD%NTYPE = TYPEREAL - TZFIELD%NDIMS = 3 - TZFIELD%LTIMEDEP = .TRUE. + TZFIELD = TFIELDMETADATA( & + CMNHNAME = 'SSI', & + CSTDNAME = '', & + CLONGNAME = 'SSI', & + CUNITS = '', & + CDIR = 'XY', & + CCOMMENT = 'X_Y_Z_SSI', & + NGRID = 1, & + NTYPE = TYPEREAL, & + NDIMS = 3, & + LTIMEDEP = .TRUE. ) CALL IO_Field_write(TPFILE,TZFIELD,ZW) END IF ! diff --git a/src/mesonh/micro/lima_ccn_activation.f90 b/src/mesonh/micro/lima_ccn_activation.f90 index fa0a276ebcc591f7dc6dbdbdaf505f044d97c6ba..bac576fa00f953074ced8034ceeb6e1271f3aadb 100644 --- a/src/mesonh/micro/lima_ccn_activation.f90 +++ b/src/mesonh/micro/lima_ccn_activation.f90 @@ -98,7 +98,7 @@ END MODULE MODI_LIMA_CCN_ACTIVATION ! ------------ ! USE MODD_CST, ONLY: XALPW, XBETAW, XCL, XCPD, XCPV, XGAMW, XLVTT, XMD, XMNH_EPSILON, XMV, XRV, XTT -use modd_field, only: TFIELDDATA, TYPEREAL +use modd_field, only: TFIELDMETADATA, TYPEREAL USE MODD_IO, ONLY: TFILEDATA USE MODD_LUNIT_n, ONLY: TLUOUT USE MODD_PARAMETERS, ONLY: JPHEXT, JPVEXT @@ -181,7 +181,7 @@ INTEGER :: JMOD INTEGER :: IIB, IIE, IJB, IJE, IKB, IKE ! Physical domain ! INTEGER :: ILUOUT ! Logical unit of output listing -TYPE(TFIELDDATA) :: TZFIELD +TYPE(TFIELDMETADATA) :: TZFIELD !------------------------------------------------------------------------------- ! ILUOUT = TLUOUT%NLU @@ -502,29 +502,30 @@ IF ( tpfile%lopened ) THEN ZW (:,:,:) = 0. ZW2(:,:,:) = 0. END IF - - TZFIELD%CMNHNAME ='SMAX' - TZFIELD%CSTDNAME = '' - TZFIELD%CLONGNAME = TRIM(TZFIELD%CMNHNAME) - TZFIELD%CUNITS = '' - TZFIELD%CDIR = 'XY' - TZFIELD%CCOMMENT = 'X_Y_Z_SMAX' - TZFIELD%NGRID = 1 - TZFIELD%NTYPE = TYPEREAL - TZFIELD%NDIMS = 3 - TZFIELD%LTIMEDEP = .TRUE. + TZFIELD = TFIELDMETADATA( & + CMNHNAME = 'SMAX', & + CSTDNAME = '', & + CLONGNAME = 'SMAX', & + CUNITS = '', & + CDIR = 'XY', & + CCOMMENT = 'X_Y_Z_SMAX', & + NGRID = 1, & + NTYPE = TYPEREAL, & + NDIMS = 3, & + LTIMEDEP = .TRUE. ) CALL IO_Field_write(TPFILE,TZFIELD,ZW) ! - TZFIELD%CMNHNAME ='NACT' - TZFIELD%CSTDNAME = '' - TZFIELD%CLONGNAME = TRIM(TZFIELD%CMNHNAME) - TZFIELD%CUNITS = 'kg-1' - TZFIELD%CDIR = 'XY' - TZFIELD%CCOMMENT = 'X_Y_Z_NACT' - TZFIELD%NGRID = 1 - TZFIELD%NTYPE = TYPEREAL - TZFIELD%NDIMS = 3 - TZFIELD%LTIMEDEP = .TRUE. + TZFIELD = TFIELDMETADATA( & + CMNHNAME = 'NACT', & + CSTDNAME = '', & + CLONGNAME = 'NACT', & + CUNITS = 'kg-1', & + CDIR = 'XY', & + CCOMMENT = 'X_Y_Z_NACT', & + NGRID = 1, & + NTYPE = TYPEREAL, & + NDIMS = 3, & + LTIMEDEP = .TRUE. ) CALL IO_Field_write(TPFILE,TZFIELD,ZW2) END IF ! diff --git a/src/mesonh/micro/lima_cold_sedimentation.f90 b/src/mesonh/micro/lima_cold_sedimentation.f90 index 13e80b57c456b0e61d9a3146a8f3c9fe1b75609e..ce1e7141cb834219582687c600d947c1714ecb4d 100644 --- a/src/mesonh/micro/lima_cold_sedimentation.f90 +++ b/src/mesonh/micro/lima_cold_sedimentation.f90 @@ -233,7 +233,7 @@ END IF END IF ! ISEDIM = COUNTJV( GSEDIM(:,:,:),I1(:),I2(:),I3(:)) - IF( ISEDIM >= 1 ) THEN + IF( ISEDIM >= 0 ) THEN ! IF( JN==1 ) THEN IF( OSEDI ) THEN @@ -477,7 +477,7 @@ END IF IF(NMOM_G.GE.2) PCGS(:,:,:) = PCGS(:,:,:) / PTSTEP IF(NMOM_H.GE.2) PCHS(:,:,:) = PCHS(:,:,:) / PTSTEP END IF - END IF + END IF ! ISEDIM END DO !++cb++ DEALLOCATE(ZRTMIN) diff --git a/src/mesonh/micro/lima_collisional_ice_breakup.f90 b/src/mesonh/micro/lima_collisional_ice_breakup.f90 index 3c22bf960b56fca62f3387524493a3a62438cdf8..a6848d14345bcdf23a70338347f5b8ab66940e7b 100644 --- a/src/mesonh/micro/lima_collisional_ice_breakup.f90 +++ b/src/mesonh/micro/lima_collisional_ice_breakup.f90 @@ -128,7 +128,8 @@ REAL :: ZFACT1_XNDEBRIS, ZFACT2_XNDEBRIS ! !------------------------------------------------------------------------------- -GCIBU(:) = LCIBU .AND. (PRST(:)>XRTMIN(5)) .AND. (PRGT(:)>XRTMIN(6)) .AND. LDCOMPUTE(:) +GCIBU(:) = LCIBU .AND. PRST(:)>XRTMIN(5) .AND. PRGT(:)>XRTMIN(6) .AND. & + LDCOMPUTE(:) .AND. PCST(:)>XCTMIN(5) .AND. PCGT(:)>XCTMIN(6) ICIBU = COUNT( GCIBU(:) ) ! P_RI_CIBU(:)=0. diff --git a/src/mesonh/micro/lima_conversion_melting_snow.f90 b/src/mesonh/micro/lima_conversion_melting_snow.f90 index 454df3eba33b2ef1b975c33c3de003a0c6ac9c64..ef46c794f37aee347aa52ea5bf8c338502b53801 100644 --- a/src/mesonh/micro/lima_conversion_melting_snow.f90 +++ b/src/mesonh/micro/lima_conversion_melting_snow.f90 @@ -64,7 +64,7 @@ END MODULE MODI_LIMA_CONVERSION_MELTING_SNOW ! ------------ ! USE MODD_CST, ONLY : XTT, XMV, XMD, XLVTT, XCPV, XCL, XESTT, XRV -USE MODD_PARAM_LIMA, ONLY : XRTMIN, XNUS, XALPHAS +USE MODD_PARAM_LIMA, ONLY : XRTMIN, XCTMIN, XNUS, XALPHAS USE MODD_PARAM_LIMA_MIXED, ONLY : XFSCVMG USE MODD_PARAM_LIMA_COLD, ONLY : X0DEPS, XEX0DEPS, X1DEPS, XEX1DEPS, XBS, XFVELOS ! @@ -104,7 +104,7 @@ P_RS_CMEL(:)=0. P_CS_CMEL(:)=0. ! ZW(:) = 0.0 -WHERE( (PRST(:)>XRTMIN(5)) .AND. (PT(:)>XTT) .AND. LDCOMPUTE(:) ) +WHERE( PRST(:)>XRTMIN(5) .AND. PCST(:)>XCTMIN(5) .AND. PT(:)>XTT .AND. LDCOMPUTE(:) ) ZW(:) = PRVT(:)*PPRES(:)/((XMV/XMD)+PRVT(:)) ! Vapor pressure ZW(:) = PKA(:)*(XTT-PT(:)) + & ( PDV(:)*(XLVTT + ( XCPV - XCL ) * ( PT(:) - XTT )) & diff --git a/src/mesonh/micro/lima_droplets_accretion.f90 b/src/mesonh/micro/lima_droplets_accretion.f90 index c7a4232fdaf6fc57a7051f15d3c2c6e58afea091..d183953cd21da3563c87d7fc851af9bd76d10539 100644 --- a/src/mesonh/micro/lima_droplets_accretion.f90 +++ b/src/mesonh/micro/lima_droplets_accretion.f90 @@ -116,6 +116,7 @@ ZW4(:) = 0.0 IF ( LKHKO ) THEN ! GACCR(:) = PRRT(:)>XRTMIN(3) .AND. & + PCRT(:)>XCTMIN(3) .AND. & PRCT(:)>XRTMIN(2) .AND. & PCCT(:)>XCTMIN(2) ! @@ -130,8 +131,8 @@ IF ( LKHKO ) THEN END WHERE ! ELSE IF (NMOM_C.EQ.1 .AND. NMOM_R.EQ.1) THEN - GACCR(:) = PRRT(:)>XRTMIN(3) .AND. & - PRCT(:)>XRTMIN(2) + GACCR(:) = PRRT(:)>XRTMIN(3) .AND. PCRT(:)>XCTMIN(3) .AND. & + PRCT(:)>XRTMIN(2) .AND. PCCT(:)>XCTMIN(2) WHERE ( GACCR(:) ) P_RC_ACCR(:) = - XFCACCR * PRCT(:) & * PLBDR(:)**XEXCACCR & diff --git a/src/mesonh/micro/lima_droplets_hom_freezing.f90 b/src/mesonh/micro/lima_droplets_hom_freezing.f90 index 58e12b5f14f1739266ea459c622a3b40a75b81a9..b33d7a3501fdf56c3925db691f50a11af30b2e5f 100644 --- a/src/mesonh/micro/lima_droplets_hom_freezing.f90 +++ b/src/mesonh/micro/lima_droplets_hom_freezing.f90 @@ -98,7 +98,7 @@ P_TH_HONC(:) = 0. P_RC_HONC(:) = 0. P_CC_HONC(:) = 0. ! -WHERE ( (PT(:)<XTT-35.0) .AND. (PCCT(:)>XCTMIN(2)) .AND. (PRCT(:)>XRTMIN(2)) ) +WHERE ( PT(:)<XTT-35.0 .AND. PCCT(:)>XCTMIN(2) .AND. PRCT(:)>XRTMIN(2) ) ZTCELSIUS(:) = PT(:)-XTT ! T [°C] ! ZZW(:) = 0.0 diff --git a/src/mesonh/micro/lima_droplets_riming_snow.f90 b/src/mesonh/micro/lima_droplets_riming_snow.f90 index b9d76536589f3b8752802dc34b3efcc8eb41433e..cd46682388de1ab48cd16f98169998029eb2dca6 100644 --- a/src/mesonh/micro/lima_droplets_riming_snow.f90 +++ b/src/mesonh/micro/lima_droplets_riming_snow.f90 @@ -76,7 +76,7 @@ END MODULE MODI_LIMA_DROPLETS_RIMING_SNOW ! ------------ ! USE MODD_CST, ONLY : XTT -USE MODD_PARAM_LIMA, ONLY : XRTMIN, XCEXVT, XNUS, XALPHAS, LMURAKAMI +USE MODD_PARAM_LIMA, ONLY : XRTMIN, XCTMIN, XCEXVT, XNUS, XALPHAS, LMURAKAMI USE MODD_PARAM_LIMA_MIXED, ONLY : NGAMINC, XRIMINTP1, XRIMINTP2, XGAMINC_RIM1, XGAMINC_RIM2, XGAMINC_RIM4, & XCRIMSS, XEXCRIMSS, XSRIMCG, XEXSRIMCG, XSRIMCG2, XSRIMCG3, XEXSRIMCG2, & XHMLINTP1, XHMLINTP2, XGAMINC_HMC, XHM_FACTS, XHMTMIN, XHMTMAX @@ -129,7 +129,8 @@ DO JI = 1, SIZE(PRCT) !* Cloud droplet riming of the aggregates ! -------------------------------------- ! - IF ( PRCT(JI)>XRTMIN(2) .AND. PRST(JI)>XRTMIN(5) .AND. PT(JI)<XTT .AND. LDCOMPUTE(JI) ) THEN + IF ( PRCT(JI)>XRTMIN(2) .AND. PRST(JI)>XRTMIN(5) .AND. PT(JI)<XTT .AND. & + PCCT(JI)>XCTMIN(2) .AND. PCST(JI)>XCTMIN(5) .AND. LDCOMPUTE(JI) ) THEN ! ZVEC1(JI) = PLBDS(JI) ZVEC1W(JI)= ( XFVELOS**XALPHAS + PLBDS(JI)**XALPHAS ) ** (1./XALPHAS) ! modified equivalent lambda @@ -200,8 +201,8 @@ DO JI = 1, SIZE(PRCT) !* Hallett-Mossop ice production (HMS) ! ----------------------------------- ! - IF ( PT(JI)<XHMTMAX .AND. PT(JI)>XHMTMIN .AND. & - PRST(JI)>XRTMIN(5) .AND. PRCT(JI)>XRTMIN(2) .AND. LDCOMPUTE(JI) ) THEN + IF ( PRST(JI)>XRTMIN(5) .AND. PRCT(JI)>XRTMIN(2) .AND. PT(JI)<XHMTMAX .AND. PT(JI)>XHMTMIN .AND. & + PCST(JI)>XCTMIN(5) .AND. PCCT(JI)>XCTMIN(2) .AND. LDCOMPUTE(JI) ) THEN ! ZVEC1(JI) = PLBDC(JI) ZVEC2(JI) = MAX( 1.0001, MIN( REAL(NGAMINC)-0.0001, & diff --git a/src/mesonh/micro/lima_drops_self_collection.f90 b/src/mesonh/micro/lima_drops_self_collection.f90 index 042cde0842bf74116c47e156ce7d85ed03d5522a..3f064dfcdc0f19a5124562e4d8a5658f2a31a7c5 100644 --- a/src/mesonh/micro/lima_drops_self_collection.f90 +++ b/src/mesonh/micro/lima_drops_self_collection.f90 @@ -105,12 +105,12 @@ ZW1(:) = 0.0 ZW2(:) = 0.0 ZW3(:) = 0.0 ! -WHERE (PCRT(:)>XCTMIN(3) .AND. (ZW4(:)>1.E-4) .AND. LDCOMPUTE(:)) ! analytical integration +WHERE ( PCRT(:)>XCTMIN(3) .AND. ZW4(:)>1.E-4 .AND. LDCOMPUTE(:)) ! analytical integration ZW1(:) = XSCBU2 * PCRT(:)**2 / PLBDR3(:) ! D>100 10-6 m ZW3(:) = ZW1(:)*ZSCBU(:) END WHERE ! -WHERE (PCRT(:)>XCTMIN(3) .AND. (ZW4(:)<=1.E-4) .AND. LDCOMPUTE(:)) +WHERE ( PCRT(:)>XCTMIN(3) .AND. ZW4(:)<=1.E-4 .AND. LDCOMPUTE(:)) ZW2(:) = XSCBU3 *(PCRT(:) / PLBDR3(:))**2 ! D<100 10-6 m ZW3(:) = ZW2(:) END WHERE diff --git a/src/mesonh/micro/lima_graupel.f90 b/src/mesonh/micro/lima_graupel.f90 index 00ad1646afd9a083366e53b0bcab3406a243666e..8c96d2e0957a34003e2c4ff6ff5bf10b7bebcda1 100644 --- a/src/mesonh/micro/lima_graupel.f90 +++ b/src/mesonh/micro/lima_graupel.f90 @@ -146,7 +146,7 @@ END MODULE MODI_LIMA_GRAUPEL ! ------------ ! USE MODD_CST, ONLY : XTT, XMD, XMV, XRD, XRV, XLVTT, XLMTT, XESTT, XCL, XCI, XCPV -USE MODD_PARAM_LIMA, ONLY : XRTMIN, XCEXVT, LHAIL +USE MODD_PARAM_LIMA, ONLY : XRTMIN, XCTMIN, XCEXVT, LHAIL USE MODD_PARAM_LIMA_MIXED, ONLY : XCXG, XDG, X0DEPG, X1DEPG, NGAMINC, & XFCDRYG, XFIDRYG, XCOLIG, XCOLSG, XCOLEXIG, XCOLEXSG, & XFSDRYG, XLBSDRYG1, XLBSDRYG2, XLBSDRYG3, XKER_SDRYG, & @@ -323,7 +323,7 @@ END WHERE !* 1.b Collection of rs in the dry mode ! ------------------------------------ ! -GDRY(:) = PRST(:)>XRTMIN(5) .AND. PRGT(:)>XRTMIN(6) .AND. LDCOMPUTE(:) +GDRY(:) = PRST(:)>XRTMIN(5) .AND. PCST(:)>XCTMIN(5) .AND. PRGT(:)>XRTMIN(6) .AND. PCGT(:)>XCTMIN(6) .AND. LDCOMPUTE(:) ! WHERE( GDRY ) ! @@ -389,7 +389,7 @@ END WHERE !* 1.c Collection of rr in the dry mode ! ------------------------------------- ! -GDRY(:) = PRRT(:)>XRTMIN(3) .AND. PRGT(:)>XRTMIN(6) .AND. LDCOMPUTE(:) +GDRY(:) = PRRT(:)>XRTMIN(3) .AND. PCRT(:)>XCTMIN(3) .AND. PRGT(:)>XRTMIN(6) .AND. PCGT(:)>XCTMIN(6) .AND. LDCOMPUTE(:) ! WHERE( GDRY ) ! @@ -462,7 +462,7 @@ ZRDRYG(:) = ZZW1(:) + ZZW2(:) + ZZW3(:) + ZZW4(:) ! ------------------------------ ! ZZW(:) = 0.0 -WHERE( PRGT(:)>XRTMIN(6) .AND. LDCOMPUTE(:) ) +WHERE( PRGT(:)>XRTMIN(6) .AND. PCGT(:)>XCTMIN(6) .AND. LDCOMPUTE(:) ) ZZW5(:) = ZZW2(:) / (XCOLIG*EXP(XCOLEXIG*(PT(:)-XTT)) ) ! RIWETG ZZW6(:) = ZZW3(:) / (XCOLSG*EXP(XCOLEXSG*(PT(:)-XTT)) ) ! RSWETG ZZW6N(:)= ZZW3N(:)/ (XCOLSG*EXP(XCOLEXSG*(PT(:)-XTT)) ) ! NSWETG @@ -488,7 +488,7 @@ END WHERE ZZW(:) = 0.0 NHAIL = 0. IF (LHAIL) NHAIL = 1. -WHERE( LDCOMPUTE(:) .AND. PRGT(:)>XRTMIN(6) .AND. PT(:)<XTT .AND. & +WHERE( LDCOMPUTE(:) .AND. PRGT(:)>XRTMIN(6) .AND. PCGT(:)>XCTMIN(6) .AND. PT(:)<XTT .AND. & (ZRDRYG(:)-ZZW2(:)-ZZW3(:))>=(ZRWETG(:)-ZZW5(:)-ZZW6(:)) .AND. ZRWETG(:)-ZZW5(:)-ZZW6(:)>0.0 ) ! ! Mass of rain and cloud droplets frozen by graupel in wet mode : RCWETG + RRWETG = RWETG - RIWETG - RSWETG @@ -517,7 +517,7 @@ END WHERE ! 1.g Dry mode ! ------------ ! -WHERE( LDCOMPUTE(:) .AND. PRGT(:)>XRTMIN(6) .AND. PT(:)<XTT .AND. & +WHERE( LDCOMPUTE(:) .AND. PRGT(:)>XRTMIN(6) .AND. PCGT(:)>XCTMIN(6) .AND. PT(:)<XTT .AND. & (ZRDRYG(:)-ZZW2(:)-ZZW3(:))<(ZRWETG(:)-ZZW5(:)-ZZW6(:)) .AND. ZRDRYG(:)>0.0 ) ! P_RC_DRYG(:) = - ZZW1(:) @@ -540,7 +540,7 @@ END WHERE ! BVIE test ZRDRYG<ZZW ????????????????????????? !GDRY(:) = (PT(:)<XHMTMAX) .AND. (PT(:)>XHMTMIN) .AND. (ZRDRYG(:)<ZZW(:))& GDRY(:) = PT(:)<XHMTMAX .AND. PT(:)>XHMTMIN .AND. PRGT(:)>XRTMIN(6) .AND. PRCT(:)>XRTMIN(2) .AND. LDCOMPUTE(:) .AND. & - (ZRDRYG(:)-ZZW2(:)-ZZW3(:))<(ZRWETG(:)-ZZW5(:)-ZZW6(:)) + PCGT(:)>XCTMIN(6) .AND. PCCT(:)>XCTMIN(2) .AND. (ZRDRYG(:)-ZZW2(:)-ZZW3(:))<(ZRWETG(:)-ZZW5(:)-ZZW6(:)) ZZX(:)=9999. ZVEC1(:)=0. @@ -571,7 +571,7 @@ END WHERE ! ------------------- ! ZZX(:) = 0.0 -WHERE( (PRGT(:)>XRTMIN(6)) .AND. (PT(:)>XTT) .AND. LDCOMPUTE(:) ) +WHERE( PRGT(:)>XRTMIN(6) .AND. PCGT(:)>XCTMIN(6) .AND. PT(:)>XTT .AND. LDCOMPUTE(:) ) ZZX(:) = PRVT(:)*PPRES(:)/((XMV/XMD)+PRVT(:)) ! Vapor pressure ZZX(:) = PKA(:)*(XTT-PT(:)) + & ( PDV(:)*(XLVTT + ( XCPV - XCL ) * ( PT(:) - XTT )) & diff --git a/src/mesonh/micro/lima_ice_snow_deposition.f90 b/src/mesonh/micro/lima_ice_snow_deposition.f90 deleted file mode 100644 index 4d92b528ac9aabb0224e61ae9de0c23a5b50f0fb..0000000000000000000000000000000000000000 --- a/src/mesonh/micro/lima_ice_snow_deposition.f90 +++ /dev/null @@ -1,230 +0,0 @@ -!MNH_LIC Copyright 2013-2018 CNRS, Meteo-France and Universite Paul Sabatier -!MNH_LIC This is part of the Meso-NH software governed by the CeCILL-C licence -!MNH_LIC version 1. See LICENSE, CeCILL-C_V1-en.txt and CeCILL-C_V1-fr.txt -!MNH_LIC for details. version 1. -! ##################### - MODULE MODI_LIMA_ICE_SNOW_DEPOSITION -! ##################### -! -INTERFACE - SUBROUTINE LIMA_ICE_SNOW_DEPOSITION (PTSTEP, LDCOMPUTE, & - PRHODREF, PSSI, PAI, PCJ, PLSFACT, & - PRIT, PRST, PCIT, PLBDI, PLBDS, & - P_RI_CNVI, P_CI_CNVI, & - P_TH_DEPS, P_RS_DEPS, & - P_RI_CNVS, P_CI_CNVS, & - PA_TH, PA_RV, PA_RI, PA_CI, PA_RS ) -! -REAL, INTENT(IN) :: PTSTEP -LOGICAL, DIMENSION(:),INTENT(IN) :: LDCOMPUTE -! -REAL, DIMENSION(:), INTENT(IN) :: PRHODREF! Reference density -REAL, DIMENSION(:), INTENT(IN) :: PSSI ! abs. pressure at time t -REAL, DIMENSION(:), INTENT(IN) :: PAI ! abs. pressure at time t -REAL, DIMENSION(:), INTENT(IN) :: PCJ ! abs. pressure at time t -REAL, DIMENSION(:), INTENT(IN) :: PLSFACT ! abs. pressure at time t -! -REAL, DIMENSION(:), INTENT(IN) :: PRIT ! Cloud ice m.r. at t -REAL, DIMENSION(:), INTENT(IN) :: PRST ! Snow/aggregate m.r. at t -! -REAL, DIMENSION(:), INTENT(IN) :: PCIT ! Ice crystal C. at t -! -REAL, DIMENSION(:), INTENT(IN) :: PLBDI ! Graupel m.r. at t -REAL, DIMENSION(:), INTENT(IN) :: PLBDS ! Graupel m.r. at t -! -REAL, DIMENSION(:), INTENT(INOUT) :: P_RI_CNVI -REAL, DIMENSION(:), INTENT(INOUT) :: P_CI_CNVI -REAL, DIMENSION(:), INTENT(INOUT) :: P_TH_DEPS -REAL, DIMENSION(:), INTENT(INOUT) :: P_RS_DEPS -REAL, DIMENSION(:), INTENT(INOUT) :: P_RI_CNVS -REAL, DIMENSION(:), INTENT(INOUT) :: P_CI_CNVS -! -REAL, DIMENSION(:), INTENT(INOUT) :: PA_TH -REAL, DIMENSION(:), INTENT(INOUT) :: PA_RV -REAL, DIMENSION(:), INTENT(INOUT) :: PA_RI -REAL, DIMENSION(:), INTENT(INOUT) :: PA_CI -REAL, DIMENSION(:), INTENT(INOUT) :: PA_RS -! -END SUBROUTINE LIMA_ICE_SNOW_DEPOSITION -END INTERFACE -END MODULE MODI_LIMA_ICE_SNOW_DEPOSITION -! -! ########################################################################## -SUBROUTINE LIMA_ICE_SNOW_DEPOSITION (PTSTEP, LDCOMPUTE, & - PRHODREF, PSSI, PAI, PCJ, PLSFACT, & - PRIT, PRST, PCIT, PLBDI, PLBDS, & - P_RI_CNVI, P_CI_CNVI, & - P_TH_DEPS, P_RS_DEPS, & - P_RI_CNVS, P_CI_CNVS, & - PA_TH, PA_RV, PA_RI, PA_CI, PA_RS ) -! ########################################################################## -! -!! PURPOSE -!! ------- -!! The purpose of this routine is to compute the microphysical sources -!! for slow cold processes : -!! - conversion of snow to ice -!! - deposition of vapor on snow -!! - conversion of ice to snow (Harrington 1995) -!! -!! -!! AUTHOR -!! ------ -!! J.-M. Cohard * Laboratoire d'Aerologie* -!! J.-P. Pinty * Laboratoire d'Aerologie* -!! S. Berthet * Laboratoire d'Aerologie* -!! B. Vié * CNRM * -!! -!! MODIFICATIONS -!! ------------- -!! Original 15/03/2018 -!! -!------------------------------------------------------------------------------- -! -!* 0. DECLARATIONS -! ------------ -! -USE MODD_PARAM_LIMA, ONLY : XRTMIN, XCTMIN, XALPHAI, XALPHAS, XNUI, XNUS -USE MODD_PARAM_LIMA_COLD, ONLY : XCXS, XCCS, & - XLBDAS_MAX, XDSCNVI_LIM, XLBDASCNVI_MAX, & - XC0DEPSI, XC1DEPSI, XR0DEPSI, XR1DEPSI, & - XSCFAC, X1DEPS, X0DEPS, XEX1DEPS, XEX0DEPS, & - XDICNVS_LIM, XLBDAICNVS_LIM, & - XC0DEPIS, XC1DEPIS, XR0DEPIS, XR1DEPIS, & - XCOLEXIS, XAGGS_CLARGE1, XAGGS_CLARGE2, & - XAGGS_RLARGE1, XAGGS_RLARGE2 - -! -IMPLICIT NONE -! -!* 0.1 Declarations of dummy arguments : -! -REAL, INTENT(IN) :: PTSTEP -LOGICAL, DIMENSION(:),INTENT(IN) :: LDCOMPUTE -! -REAL, DIMENSION(:), INTENT(IN) :: PRHODREF! Reference density -REAL, DIMENSION(:), INTENT(IN) :: PSSI ! abs. pressure at time t -REAL, DIMENSION(:), INTENT(IN) :: PAI ! abs. pressure at time t -REAL, DIMENSION(:), INTENT(IN) :: PCJ ! abs. pressure at time t -REAL, DIMENSION(:), INTENT(IN) :: PLSFACT ! abs. pressure at time t -! -REAL, DIMENSION(:), INTENT(IN) :: PRIT ! Cloud ice m.r. at t -REAL, DIMENSION(:), INTENT(IN) :: PRST ! Snow/aggregate m.r. at t -! -REAL, DIMENSION(:), INTENT(IN) :: PCIT ! Ice crystal C. at t -! -REAL, DIMENSION(:), INTENT(IN) :: PLBDI ! Graupel m.r. at t -REAL, DIMENSION(:), INTENT(IN) :: PLBDS ! Graupel m.r. at t -! -REAL, DIMENSION(:), INTENT(INOUT) :: P_RI_CNVI -REAL, DIMENSION(:), INTENT(INOUT) :: P_CI_CNVI -REAL, DIMENSION(:), INTENT(INOUT) :: P_TH_DEPS -REAL, DIMENSION(:), INTENT(INOUT) :: P_RS_DEPS -REAL, DIMENSION(:), INTENT(INOUT) :: P_RI_CNVS -REAL, DIMENSION(:), INTENT(INOUT) :: P_CI_CNVS -! -REAL, DIMENSION(:), INTENT(INOUT) :: PA_TH -REAL, DIMENSION(:), INTENT(INOUT) :: PA_RV -REAL, DIMENSION(:), INTENT(INOUT) :: PA_RI -REAL, DIMENSION(:), INTENT(INOUT) :: PA_CI -REAL, DIMENSION(:), INTENT(INOUT) :: PA_RS -! -!* 0.2 Declarations of local variables : -! -LOGICAL, DIMENSION(SIZE(PRHODREF)) :: GMICRO ! Computations only where necessary -REAL, DIMENSION(SIZE(PRHODREF)) :: ZZW, ZZW2, ZZX ! Work array -! -! -!------------------------------------------------------------------------------- -! -P_RI_CNVI(:) = 0. -P_CI_CNVI(:) = 0. -P_TH_DEPS(:) = 0. -P_RS_DEPS(:) = 0. -P_RI_CNVS(:) = 0. -P_CI_CNVS(:) = 0. -! -! Physical limitations -! -! -! Looking for regions where computations are necessary -! -GMICRO(:) = .FALSE. -GMICRO(:) = LDCOMPUTE(:) .AND. & - (PRIT(:)>XRTMIN(4) .OR. & - PRST(:)>XRTMIN(5)) -! -! -WHERE( GMICRO ) -! -!* 2.1 Conversion of snow to r_i: RSCNVI -! ---------------------------------------- -! -! - ZZW2(:) = 0.0 - ZZW(:) = 0.0 - WHERE ( PLBDS(:)<XLBDASCNVI_MAX .AND. (PRST(:)>XRTMIN(5)) & - .AND. (PSSI(:)<0.0) ) - ZZW(:) = (PLBDS(:)*XDSCNVI_LIM)**(XALPHAS) - ZZX(:) = ( -PSSI(:)/PAI(:) ) * (XCCS*PLBDS(:)**XCXS)/PRHODREF(:) * (ZZW(:)**XNUS) * EXP(-ZZW(:)) -! - ZZW(:) = ( XR0DEPSI+XR1DEPSI*PCJ(:) )*ZZX(:) -! - ZZW2(:) = ZZW(:)*( XC0DEPSI+XC1DEPSI*PCJ(:) )/( XR0DEPSI+XR1DEPSI*PCJ(:) ) - END WHERE -! - P_RI_CNVI(:) = ZZW(:) - P_CI_CNVI(:) = ZZW2(:) -! - PA_RI(:) = PA_RI(:) + P_RI_CNVI(:) - PA_CI(:) = PA_CI(:) + P_CI_CNVI(:) - PA_RS(:) = PA_RS(:) - P_RI_CNVI(:) -! -! -!* 2.2 Deposition of water vapor on r_s: RVDEPS -! ----------------------------------------------- -! -! - ZZW(:) = 0.0 - WHERE ( (PRST(:)>XRTMIN(5)) ) - ZZW(:) = ( PSSI(:)/(PAI(:))/PRHODREF(:) ) * & - ( X0DEPS*PLBDS(:)**XEX0DEPS + X1DEPS*PCJ(:)*PLBDS(:)**XEX1DEPS ) - ZZW(:) = ZZW(:)*(0.5+SIGN(0.5,ZZW(:))) - ABS(ZZW(:))*(0.5-SIGN(0.5,ZZW(:))) - END WHERE -! - P_RS_DEPS(:) = ZZW(:) - P_TH_DEPS(:) = P_RS_DEPS(:) * PLSFACT(:) -! - PA_TH(:) = PA_TH(:) + P_TH_DEPS(:) - PA_RV(:) = PA_RV(:) - P_RS_DEPS(:) - PA_RS(:) = PA_RS(:) + P_RS_DEPS(:) -! -! -!* 2.3 Conversion of pristine ice to r_s: RICNVS -! ------------------------------------------------ -! -! - ZZW(:) = 0.0 - ZZW2(:) = 0.0 - WHERE ( (PLBDI(:)<XLBDAICNVS_LIM) .AND. (PCIT(:)>XCTMIN(4)) & - .AND. (PSSI(:)>0.0) ) - ZZW(:) = (PLBDI(:)*XDICNVS_LIM)**(XALPHAI) - ZZX(:) = ( PSSI(:)/PAI(:) )*PCIT(:) * (ZZW(:)**XNUI) *EXP(-ZZW(:)) -! - ZZW(:) = ( XR0DEPIS + XR1DEPIS*PCJ(:) )*ZZX(:) -! - ZZW2(:) = ZZW(:) * (XC0DEPIS+XC1DEPIS*PCJ(:)) / (XR0DEPIS+XR1DEPIS*PCJ(:)) - END WHERE -! -P_RI_CNVS(:) = - ZZW(:) -P_CI_CNVS(:) = - ZZW2(:) -! -PA_RI(:) = PA_RI(:) + P_RI_CNVS(:) -PA_CI(:) = PA_CI(:) + P_CI_CNVS(:) -PA_RS(:) = PA_RS(:) - P_RI_CNVS(:) -! -! -END WHERE -! -! -END SUBROUTINE LIMA_ICE_SNOW_DEPOSITION diff --git a/src/mesonh/micro/lima_notadjust.f90 b/src/mesonh/micro/lima_notadjust.f90 index 42a0b33d59f64b1be5a978b25edc8970fd9b4331..ddd221297382b329637fea4589002845dcf4a696 100644 --- a/src/mesonh/micro/lima_notadjust.f90 +++ b/src/mesonh/micro/lima_notadjust.f90 @@ -83,7 +83,7 @@ use modd_budget, only: lbu_enable, nbumod, tbudgets USE MODD_CONF USE MODD_CST -USE MODD_FIELD, ONLY: TFIELDDATA,TYPEREAL +USE MODD_FIELD, ONLY: TFIELDMETADATA, TYPEREAL USE MODD_IO, ONLY: TFILEDATA USE MODD_LUNIT_n, ONLY: TLUOUT USE MODD_NSV @@ -168,7 +168,7 @@ REAL, DIMENSION(SIZE(PRHODREF,1),SIZE(PRHODREF,2),SIZE(PRHODREF,3)) ::& ZSAT,ZCCS INTEGER :: JK ! For loop integer :: idx -TYPE(TFIELDDATA) :: TZFIELD +TYPE(TFIELDMETADATA) :: TZFIELD REAL, DIMENSION(:,:,:,:), ALLOCATABLE :: ZNFS ! CCN C. available source REAL, DIMENSION(:,:,:,:), ALLOCATABLE :: ZNAS ! Cloud C. nuclei C. source REAL, DIMENSION(:,:), ALLOCATABLE :: ZZNFS ! CCN C. available source @@ -588,16 +588,17 @@ ENDWHERE ! IF ( tpfile%lopened ) THEN ZW(:,:,:)=SUM(ZNAS,4)-ZW(:,:,:) - TZFIELD%CMNHNAME = 'NACT' - TZFIELD%CSTDNAME = '' - TZFIELD%CLONGNAME = 'NACT' - TZFIELD%CUNITS = '' - TZFIELD%CDIR = 'XY' - TZFIELD%CCOMMENT = 'X_Y_Z_NACT' - TZFIELD%NGRID = 1 - TZFIELD%NTYPE = TYPEREAL - TZFIELD%NDIMS = 3 - TZFIELD%LTIMEDEP = .TRUE. + TZFIELD = TFIELDMETADATA( & + CMNHNAME = 'NACT', & + CSTDNAME = '', & + CLONGNAME = 'NACT', & + CUNITS = 'kg-1', & + CDIR = 'XY', & + CCOMMENT = 'X_Y_Z_NACT', & + NGRID = 1, & + NTYPE = TYPEREAL, & + NDIMS = 3, & + LTIMEDEP = .TRUE. ) CALL IO_Field_write(TPFILE,TZFIELD,ZW) END IF ! diff --git a/src/mesonh/micro/lima_rain_accr_snow.f90 b/src/mesonh/micro/lima_rain_accr_snow.f90 index 7be5e1b4c13a52e8649a1bacf8f686c0f959700a..a63ac24a4b9c776d316c18074682e61dddff53ed 100644 --- a/src/mesonh/micro/lima_rain_accr_snow.f90 +++ b/src/mesonh/micro/lima_rain_accr_snow.f90 @@ -70,7 +70,7 @@ END MODULE MODI_LIMA_RAIN_ACCR_SNOW ! ------------ ! USE MODD_CST, ONLY : XTT -USE MODD_PARAM_LIMA, ONLY : XRTMIN, XCEXVT +USE MODD_PARAM_LIMA, ONLY : XRTMIN, XCTMIN, XCEXVT USE MODD_PARAM_LIMA_WARM, ONLY : XBR USE MODD_PARAM_LIMA_COLD, ONLY : XBS, XTRANS_MP_GAMMAS USE MODD_PARAM_LIMA_MIXED, ONLY : NACCLBDAS, XACCINTP1S, XACCINTP2S, & @@ -134,6 +134,12 @@ ZZW3(:) = 0. ZZW4(:) = 0. ZZW5(:) = 0. ! +ZZWC1(:) = 0. +ZZWC2(:) = 0. +ZZWC3(:) = 0. +ZZWC4(:) = 0. +ZZWC5(:) = 0. +! IVEC1(:) = 0 IVEC2(:) = 0 ZVEC1(:) = 0. @@ -145,7 +151,8 @@ ZVEC3(:) = 0. ! ! GACC(:) = .False. -GACC(:) = (PRRT(:)>XRTMIN(3)) .AND. (PRST(:)>XRTMIN(5)) .AND. (PT(:)<XTT) .AND. LDCOMPUTE(:) +GACC(:) = (PRRT(:)>XRTMIN(3)) .AND. (PRST(:)>XRTMIN(5)) .AND. (PT(:)<XTT) .AND. LDCOMPUTE(:) .AND. & + (PCRT(:)>XCTMIN(3)) .AND. (PCST(:)>XCTMIN(5)) ! WHERE( GACC ) ! @@ -288,7 +295,7 @@ WHERE( GACC ) XLBSACCR2/( PLBDR(:) * PLBDS(:) ) + & XLBSACCR3/( PLBDS(:)**2 ) ) ! - ZZWC5(:)= XFNSACCRG * ZZW3(:) * PCRT(:) * & ! RSACCRG + ZZWC5(:)= XFNSACCRG * ZZWC3(:) * PCRT(:) * & ! RSACCRG PCST(:) * PRHODREF(:)**(1-XCEXVT) * & ( XLBNSACCR1/( PLBDR(:)**2 ) + & XLBNSACCR2/( PLBDR(:) * PLBDS(:) ) + & @@ -303,7 +310,6 @@ WHERE( GACC ) ! END WHERE ! -! !------------------------------------------------------------------------------- ! CONTAINS diff --git a/src/mesonh/micro/lima_rain_freezing.f90 b/src/mesonh/micro/lima_rain_freezing.f90 index a5a9225bc78a8382920f419595afa8b0c4b87b65..a6c9504a1cef696a5003a099c293a41060ed4fa7 100644 --- a/src/mesonh/micro/lima_rain_freezing.f90 +++ b/src/mesonh/micro/lima_rain_freezing.f90 @@ -65,7 +65,7 @@ END MODULE MODI_LIMA_RAIN_FREEZING ! ------------ ! USE MODD_CST, ONLY : XTT -USE MODD_PARAM_LIMA, ONLY : XRTMIN, XCEXVT +USE MODD_PARAM_LIMA, ONLY : XRTMIN, XCTMIN, XCEXVT USE MODD_PARAM_LIMA_MIXED, ONLY : XICFRR, XEXICFRR, XRCFRI, XEXRCFRI ! IMPLICIT NONE @@ -111,7 +111,8 @@ P_CI_CFRZ(:)=0. ZW1(:)=0. ZW2(:)=0. ! -WHERE( (PRIT(:)>XRTMIN(4)) .AND. (PRRT(:)>XRTMIN(3)) .AND. (PT(:)<XTT) .AND. LDCOMPUTE(:) ) +WHERE( PRIT(:)>XRTMIN(4) .AND. PRRT(:)>XRTMIN(3) .AND. PT(:)<XTT .AND. & + PCIT(:)>XCTMIN(4) .AND. PCRT(:)>XCTMIN(3) .AND. LDCOMPUTE(:) ) ! ZW1(:) = XICFRR * PRIT(:) * PCRT(:) & ! RICFRRG * PLBDR(:)**XEXICFRR & diff --git a/src/mesonh/micro/lima_warm_coal.f90 b/src/mesonh/micro/lima_warm_coal.f90 index 66c83de670a5fe35ad95e050c64363f9d6dff4c1..1c264a8fd844abd9c9e484ab25f60fdd5cbc938f 100644 --- a/src/mesonh/micro/lima_warm_coal.f90 +++ b/src/mesonh/micro/lima_warm_coal.f90 @@ -201,7 +201,7 @@ GMICRO(IIB:IIE,IJB:IJE,IKB:IKE) = & ! IMICRO = COUNTJV( GMICRO(:,:,:),I1(:),I2(:),I3(:)) ! -IF( IMICRO >= 1 ) THEN +IF( IMICRO >= 0 ) THEN ALLOCATE(ZRCT(IMICRO)) ALLOCATE(ZRRT(IMICRO)) ALLOCATE(ZCCT(IMICRO)) @@ -254,7 +254,7 @@ IF (LRAIN) THEN GSELF(:) = ZCCT(:)>XCTMIN(2) ISELF = COUNT(GSELF(:)) - IF( ISELF>0 .AND. .NOT.LKHKO) THEN + IF( ISELF>=0 .AND. .NOT.LKHKO) THEN ZZW1(:) = XSELFC*(ZCCT(:)/ZLBDC3(:))**2 * ZRHODREF(:) ! analytical integration WHERE( GSELF(:) ) ZCCS(:) = ZCCS(:) - MIN( ZCCS(:),ZZW1(:) ) @@ -336,7 +336,7 @@ IF (LRAIN) THEN ! GACCR(:) = ZRRT(:)>XRTMIN(3) .AND. ZCRT(:)>XCTMIN(3) IACCR = COUNT(GACCR(:)) - IF( IACCR>0 ) THEN + IF( IACCR >= 0 ) THEN ALLOCATE(ZZW4(IMICRO)); ZZW4(:) = XACCR1/ZLBDR(:) ALLOCATE(GENABLE_ACCR_SCBU(IMICRO)) GENABLE_ACCR_SCBU(:) = ZRRT(:)>1.2*ZZW2(:)/ZRHODREF(:) .OR. & @@ -345,7 +345,7 @@ IF (LRAIN) THEN END IF ! IACCR = COUNT(GACCR(:)) - IF( IACCR>0 ) THEN + IF( IACCR >= 0 ) THEN if ( lbudget_rc ) call Budget_store_init( tbudgets(NBUDGET_RC), 'ACCR', & Unpack( zrcs(:), mask = gmicro(:, :, :), field = prcs(:, :, :) ) * prhodj(:, :, :) ) if ( lbudget_rr ) call Budget_store_init( tbudgets(NBUDGET_RR), 'ACCR', & @@ -406,7 +406,7 @@ IF (LRAIN) THEN ! ----------------------------------------- ! ! - IF( IACCR>0 ) THEN + IF( IACCR >= 0 ) THEN GSCBU(:) = ZCRT(:)>XCTMIN(3) .AND. GENABLE_ACCR_SCBU(:) ISCBU = COUNT(GSCBU(:)) ELSE diff --git a/src/mesonh/micro/lima_warm_evap.f90 b/src/mesonh/micro/lima_warm_evap.f90 index e62660ecdb41c18ec7da4ac2c8d9110384f7bbbb..ac7ff4da9c14532290969bb9d6006e0fc39b3840 100644 --- a/src/mesonh/micro/lima_warm_evap.f90 +++ b/src/mesonh/micro/lima_warm_evap.f90 @@ -193,7 +193,7 @@ GEVAP(IIB:IIE,IJB:IJE,IKB:IKE) = & ! IEVAP = COUNTJV( GEVAP(:,:,:),I1(:),I2(:),I3(:)) ! -IF( IEVAP >= 1 ) THEN +IF( IEVAP >= 0 ) THEN ALLOCATE(ZRVT(IEVAP)) ALLOCATE(ZRCT(IEVAP)) ALLOCATE(ZRRT(IEVAP)) diff --git a/src/mesonh/micro/lima_warm_nucl.f90 b/src/mesonh/micro/lima_warm_nucl.f90 index cf5382b50799966e699e28adabb1054c237fddb6..8591b848e0ade496014c0816624fb589b36b7804 100644 --- a/src/mesonh/micro/lima_warm_nucl.f90 +++ b/src/mesonh/micro/lima_warm_nucl.f90 @@ -108,7 +108,7 @@ END MODULE MODI_LIMA_WARM_NUCL ! ------------ ! USE MODD_CST -use modd_field, only: TFIELDDATA, TYPEREAL +use modd_field, only: TFIELDMETADATA, TYPEREAL USE MODD_IO, ONLY: TFILEDATA USE MODD_LUNIT_n, ONLY: TLUOUT USE MODD_PARAMETERS, ONLY : JPHEXT, JPVEXT @@ -198,7 +198,7 @@ INTEGER :: JMOD INTEGER :: IIB, IIE, IJB, IJE, IKB, IKE ! Physical domain ! INTEGER :: ILUOUT ! Logical unit of output listing -TYPE(TFIELDDATA) :: TZFIELD +TYPE(TFIELDMETADATA) :: TZFIELD !------------------------------------------------------------------------------- ! ILUOUT = TLUOUT%NLU @@ -509,28 +509,30 @@ IF ( tpfile%lopened ) THEN ZW2(:,:,:) = 0. END IF - TZFIELD%CMNHNAME ='SMAX' - TZFIELD%CSTDNAME = '' - TZFIELD%CLONGNAME = TRIM(TZFIELD%CMNHNAME) - TZFIELD%CUNITS = '' - TZFIELD%CDIR = 'XY' - TZFIELD%CCOMMENT = 'X_Y_Z_SMAX' - TZFIELD%NGRID = 1 - TZFIELD%NTYPE = TYPEREAL - TZFIELD%NDIMS = 3 - TZFIELD%LTIMEDEP = .TRUE. + TZFIELD = TFIELDMETADATA( & + CMNHNAME = 'SMAX', & + CSTDNAME = '', & + CLONGNAME = 'SMAX', & + CUNITS = '', & + CDIR = 'XY', & + CCOMMENT = 'X_Y_Z_SMAX', & + NGRID = 1, & + NTYPE = TYPEREAL, & + NDIMS = 3, & + LTIMEDEP = .TRUE. ) CALL IO_Field_write(TPFILE,TZFIELD,ZW) ! - TZFIELD%CMNHNAME ='NACT' - TZFIELD%CSTDNAME = '' - TZFIELD%CLONGNAME = TRIM(TZFIELD%CMNHNAME) - TZFIELD%CUNITS = 'kg-1' - TZFIELD%CDIR = 'XY' - TZFIELD%CCOMMENT = 'X_Y_Z_NACT' - TZFIELD%NGRID = 1 - TZFIELD%NTYPE = TYPEREAL - TZFIELD%NDIMS = 3 - TZFIELD%LTIMEDEP = .TRUE. + TZFIELD = TFIELDMETADATA( & + CMNHNAME = 'NACT', & + CSTDNAME = '', & + CLONGNAME = 'NACT', & + CUNITS = 'kg-1', & + CDIR = 'XY', & + CCOMMENT = 'X_Y_Z_NACT', & + NGRID = 1, & + NTYPE = TYPEREAL, & + NDIMS = 3, & + LTIMEDEP = .TRUE. ) CALL IO_Field_write(TPFILE,TZFIELD,ZW2) END IF ! diff --git a/src/mesonh/micro/radar_rain_ice.f90 b/src/mesonh/micro/radar_rain_ice.f90 index c8ff0e2d5852f8aa36322e6ea2ae6718cf2ee9be..cf97a981ade422f5d257a46c93a48cf234056ce1 100644 --- a/src/mesonh/micro/radar_rain_ice.f90 +++ b/src/mesonh/micro/radar_rain_ice.f90 @@ -112,13 +112,14 @@ USE MODD_RAIN_ICE_DESCR, ONLY: XALPHAR_I=>XALPHAR,XNUR_I=>XNUR,XLBEXR_I=>XLBEXR, XLBI_I=>XLBI,XAI_I=>XAI,XBI_I=>XBI,XC_I_I=>XC_I,XCS_I=>XCS,XDS_I=>XDS,& XRTMIN_I=>XRTMIN,XCONC_LAND,XCONC_SEA,XCR_I=>XCR,XDR_I=>XDR,& XAH_I=>XAH,XLBH_I=>XLBH,XLBEXH_I=>XLBEXH,XCCH_I=>XCCH,& - XALPHAH_I=>XALPHAH,XNUH_I=>XNUH,XCXH_I=>XCXH,XDH_I=>XDH,XCH_I=>XCH,XBH_I=>XBH + XALPHAH_I=>XALPHAH,XNUH_I=>XNUH,XCXH_I=>XCXH,XDH_I=>XDH,XCH_I=>XCH,XBH_I=>XBH, & + XLBDAS_MAX_I=>XLBDAS_MAX,XLBDAS_MIN_I=>XLBDAS_MIN,XTRANS_MP_GAMMAS_I=>XTRANS_MP_GAMMAS USE MODD_PARAM_LIMA_WARM, ONLY: XLBEXR_L=>XLBEXR,XLBR_L=>XLBR,XBR_L=>XBR,XAR_L=>XAR,& XBC_L=>XBC,XAC_L=>XAC,XCR_L=>XCR,XDR_L=>XDR USE MODD_PARAM_LIMA_COLD, ONLY: XDI_L=>XDI,XLBEXI_L=>XLBEXI,XLBI_L=>XLBI,XAI_L=>XAI,XBI_L=>XBI,XC_I_L=>XC_I,& XLBEXS_L=>XLBEXS,XLBS_L=>XLBS,XCCS_L=>XCCS,XNS_L=>XNS,& XAS_L=>XAS,XBS_L=>XBS,XCXS_L=>XCXS,XCS_L=>XCS,XDS_L=>XDS,& - XLBDAS_MIN,XLBDAS_MAX + XLBDAS_MAX_L=>XLBDAS_MAX,XLBDAS_MIN_L=>XLBDAS_MIN,XTRANS_MP_GAMMAS_L=>XTRANS_MP_GAMMAS USE MODD_PARAM_LIMA_MIXED, ONLY:XDG_L=>XDG,XLBEXG_L=>XLBEXG,XLBG_L=>XLBG,XCCG_L=>XCCG,& XAG_L=>XAG,XBG_L=>XBG,XCXG_L=>XCXG,XCG_L=>XCG,& @@ -335,41 +336,43 @@ END IF ! IF (SIZE(PRT,4) >= 5) THEN IF ( (CCLOUD=='LIMA' .AND. LSNOW_T_L) ) THEN - ZDMELT_FACT = ( (6.0*XAS_L)/(XPI*XRHOLW) )**(2.0) - ZEXP = 2.0*XBS_L - WHERE(PTEMP(:,:,:)>-10. .AND. PRT(:,:,:,5).GT.XRTMIN_L(5)) - ZLBDA(:,:,:) = MAX(MIN(XLBDAS_MAX, 10**(14.554-0.0423*(PTEMP(:,:,:)+273.15))),XLBDAS_MIN) - END WHERE - WHERE(PTEMP(:,:,:)<=-10 .AND. PRT(:,:,:,5).GT.XRTMIN_L(5)) - ZLBDA(:,:,:) = MAX(MIN(XLBDAS_MAX, 10**(6.226-0.0106*(PTEMP(:,:,:)+273.15))),XLBDAS_MIN) - END WHERE - IF (NMOM_S.GE.2) THEN - ZN(:,:,:)=PCST(:,:,:) - ELSE - ZN(:,:,:)=XNS_L*PRHODREF(:,:,:)*PRT(:,:,:,5)*ZLBDA(:,:,:)**XBS_L - END IF - WHERE( PRT(:,:,:,5).GT.XRTMIN_L(5) ) - ZW(:,:,:) = ZEQICE*ZDMELT_FACT & - *1.E18*ZN(:,:,:)*(ZLBDA(:,:,:)**(-ZEXP))*MOMG(XALPHAS_L,XNUS_L,ZEXP) - PVDOP(:,:,:) = PVDOP(:,:,:)+ZEQICE*ZDMELT_FACT*MOMG(XALPHAS_L,XNUS_L,ZEXP+XDS_L) & - *1.E18*ZN(:,:,:)*XCS_L*(ZLBDA(:,:,:)**(-ZEXP-XDS_L)) - PRARE(:,:,:) = PRARE(:,:,:) + ZW(:,:,:) - END WHERE + ZDMELT_FACT = ( (6.0*XAS_L)/(XPI*XRHOLW) )**(2.0) + ZEXP = 2.0*XBS_L + WHERE(PTEMP(:,:,:)>263.15 .AND. PRT(:,:,:,5).GT.XRTMIN_L(5)) + ZLBDA(:,:,:) = MAX(MIN(XLBDAS_MAX_L, 10**(14.554-0.0423*PTEMP(:,:,:))),XLBDAS_MIN_L)*XTRANS_MP_GAMMAS_L + END WHERE + WHERE(PTEMP(:,:,:)<=263.15 .AND. PRT(:,:,:,5).GT.XRTMIN_L(5)) + ZLBDA(:,:,:) = MAX(MIN(XLBDAS_MAX_L, 10**(6.226 -0.0106*PTEMP(:,:,:))),XLBDAS_MIN_L)*XTRANS_MP_GAMMAS_L + END WHERE + IF (NMOM_S.GE.2) THEN + ZN(:,:,:)=PCST(:,:,:) + ELSE + WHERE( PRT(:,:,:,5).GT.XRTMIN_L(5) ) + ZN(:,:,:)=XNS_L*PRHODREF(:,:,:)*PRT(:,:,:,5)*ZLBDA(:,:,:)**XBS_L + END WHERE + END IF + WHERE( PRT(:,:,:,5).GT.XRTMIN_L(5) ) + ZW(:,:,:) = ZEQICE*ZDMELT_FACT & + *1.E18*PRHODREF(:,:,:)*ZN(:,:,:)*(ZLBDA(:,:,:)**(-ZEXP))*MOMG(XALPHAS_L,XNUS_L,ZEXP) + PVDOP(:,:,:) = PVDOP(:,:,:)+ZEQICE*ZDMELT_FACT*MOMG(XALPHAS_L,XNUS_L,ZEXP+XDS_L) & + *1.E18*PRHODREF(:,:,:)*ZN(:,:,:)*XCS_L*(ZLBDA(:,:,:)**(-ZEXP-XDS_L)) + PRARE(:,:,:) = PRARE(:,:,:) + ZW(:,:,:) + END WHERE ELSEIF ( (CCLOUD=='ICE3' .AND. LSNOW_T_I) ) THEN ZDMELT_FACT = ( (6.0*XAS_I)/(XPI*XRHOLW) )**(2.0) ZEXP = 2.0*XBS_I - WHERE(PTEMP(:,:,:)>-10. .AND. PRT(:,:,:,5).GT.XRTMIN_I(5)) - ZLBDA(:,:,:) = MAX(MIN(XLBDAS_MAX, 10**(14.554-0.0423*(PTEMP(:,:,:)+273.15))),XLBDAS_MIN) + WHERE(PTEMP(:,:,:)>263.15 .AND. PRT(:,:,:,5).GT.XRTMIN_I(5)) + ZLBDA(:,:,:) = MAX(MIN(XLBDAS_MAX_I, 10**(14.554-0.0423*PTEMP(:,:,:))),XLBDAS_MIN_I)*XTRANS_MP_GAMMAS_I END WHERE - WHERE(PTEMP(:,:,:)<=-10 .AND. PRT(:,:,:,5).GT.XRTMIN_I(5)) - ZLBDA(:,:,:) = MAX(MIN(XLBDAS_MAX, 10**(6.226-0.0106*(PTEMP(:,:,:)+273.15))),XLBDAS_MIN) + WHERE(PTEMP(:,:,:)<=263.15 .AND. PRT(:,:,:,5).GT.XRTMIN_I(5)) + ZLBDA(:,:,:) = MAX(MIN(XLBDAS_MAX_I, 10**(6.226- 0.0106*PTEMP(:,:,:))),XLBDAS_MIN_I)*XTRANS_MP_GAMMAS_I END WHERE ZN(:,:,:)=XNS_I*PRHODREF(:,:,:)*PRT(:,:,:,5)*ZLBDA(:,:,:)**XBS_I WHERE( PRT(:,:,:,5).GT.XRTMIN_I(5) ) ZW(:,:,:) = ZEQICE*ZDMELT_FACT & - *1.E18*ZN(:,:,:)*(ZLBDA(:,:,:)**(-ZEXP))*MOMG(XALPHAS_I,XNUS_I,ZEXP) + *1.E18*PRHODREF(:,:,:)*ZN(:,:,:)*(ZLBDA(:,:,:)**(-ZEXP))*MOMG(XALPHAS_I,XNUS_I,ZEXP) PVDOP(:,:,:) = PVDOP(:,:,:)+ZEQICE*ZDMELT_FACT*MOMG(XALPHAS_I,XNUS_I,ZEXP+XDS_I) & - *1.E18*ZN(:,:,:)*XCS_I*(ZLBDA(:,:,:)**(-ZEXP-XDS_I)) + *1.E18*PRHODREF(:,:,:)*ZN(:,:,:)*XCS_I*(ZLBDA(:,:,:)**(-ZEXP-XDS_I)) PRARE(:,:,:) = PRARE(:,:,:) + ZW(:,:,:) END WHERE ELSEIF (CCLOUD=='LIMA') THEN diff --git a/src/mesonh/micro/rain_c2r2_khko.f90 b/src/mesonh/micro/rain_c2r2_khko.f90 index 5708c0d4c4742afee013137bff42bc0fc1d51c48..cc19dbbf0cc7dc6aa5a287f8dec73f6ba3b46952 100644 --- a/src/mesonh/micro/rain_c2r2_khko.f90 +++ b/src/mesonh/micro/rain_c2r2_khko.f90 @@ -225,7 +225,7 @@ USE MODD_CH_AEROSOL USE MODD_CONF USE MODD_CST USE MODD_DUST -use modd_field, only: tfielddata, TYPEREAL +use modd_field, only: tfieldmetadata, TYPEREAL USE MODD_IO, ONLY: TFILEDATA USE MODD_NSV, ONLY : NSV_C2R2BEG USE MODD_PARAM_C2R2 @@ -415,7 +415,7 @@ REAL :: ZFACT, JSV, ZMU, ZALPHA REAL, DIMENSION(:), ALLOCATABLE :: ZRTMIN REAL, DIMENSION(:), ALLOCATABLE :: ZCTMIN REAL :: ZTMP -TYPE(TFIELDDATA) :: TZFIELD +TYPE(TFIELDMETADATA) :: TZFIELD ! ! ! @@ -595,16 +595,17 @@ end if !! !! ! IF ( tpfile%lopened ) THEN -! TZFIELD%CMNHNAME = 'ZCHEN' -! TZFIELD%CSTDNAME = '' -! TZFIELD%CLONGNAME = 'ZCHEN' -! TZFIELD%CUNITS = '' -! TZFIELD%CDIR = 'XY' -! TZFIELD%CCOMMENT = 'X_Y_Z_ZCHEN' -! TZFIELD%NGRID = 1 -! TZFIELD%NTYPE = TYPEREAL -! TZFIELD%NDIMS = 3 -! TZFIELD%LTIMEDEP = .TRUE. +! TZFIELD = TFIELDMETADATA( & +! CMNHNAME = 'ZCHEN', & +! CSTDNAME = '', & +! CLONGNAME = 'ZCHEN', & +! CUNITS = '', & +! CDIR = 'XY', & +! CCOMMENT = 'X_Y_Z_ZCHEN', & +! NGRID = 1, & +! NTYPE = TYPEREAL, & +! NDIMS = 3, & +! LTIMEDEP = .TRUE. ) ! CALL IO_Field_write(TPFILE,TZFIELD,ZCHEN) ! END IF ! @@ -878,16 +879,17 @@ INUCT = COUNTJV( GNUCT(:,:,:),I1(:),I2(:),I3(:)) ! END IF ! IF ( tpfile%lopened ) THEN - TZFIELD%CMNHNAME = 'SMAX' - TZFIELD%CSTDNAME = '' - TZFIELD%CLONGNAME = 'SMAX' - TZFIELD%CUNITS = '1' - TZFIELD%CDIR = 'XY' - TZFIELD%CCOMMENT = 'X_Y_Z_SMAX' - TZFIELD%NGRID = 1 - TZFIELD%NTYPE = TYPEREAL - TZFIELD%NDIMS = 3 - TZFIELD%LTIMEDEP = .TRUE. + TZFIELD = TFIELDMETADATA( & + CMNHNAME = 'SMAX', & + CSTDNAME = '', & + CLONGNAME = 'SMAX', & + CUNITS = '1', & + CDIR = 'XY', & + CCOMMENT = 'X_Y_Z_SMAX', & + NGRID = 1, & + NTYPE = TYPEREAL, & + NDIMS = 3, & + LTIMEDEP = .TRUE. ) CALL IO_Field_write(TPFILE,TZFIELD,ZZW1LOG) END IF ! @@ -1896,28 +1898,30 @@ DO JN = 1 , KSPLITR END IF ! IF ( OSEDC .AND. tpfile%lopened ) THEN - TZFIELD%CMNHNAME = 'SEDFLUXC' - TZFIELD%CSTDNAME = '' - TZFIELD%CLONGNAME = 'SEDFLUXC' - TZFIELD%CUNITS = '' - TZFIELD%CDIR = 'XY' - TZFIELD%CCOMMENT = 'X_Y_Z_SEDFLUXC' - TZFIELD%NGRID = 1 - TZFIELD%NTYPE = TYPEREAL - TZFIELD%NDIMS = 3 - TZFIELD%LTIMEDEP = .TRUE. + TZFIELD = TFIELDMETADATA( & + CMNHNAME = 'SEDFLUXC', & + CSTDNAME = '', & + CLONGNAME = 'SEDFLUXC', & + CUNITS = '', & + CDIR = 'XY', & + CCOMMENT = 'X_Y_Z_SEDFLUXC', & + NGRID = 1, & + NTYPE = TYPEREAL, & + NDIMS = 3, & + LTIMEDEP = .TRUE. ) CALL IO_Field_write(TPFILE,TZFIELD,ZWSEDC) ! - TZFIELD%CMNHNAME = 'SEDFLUXR' - TZFIELD%CSTDNAME = '' - TZFIELD%CLONGNAME = 'SEDFLUXR' - TZFIELD%CUNITS = '' - TZFIELD%CDIR = 'XY' - TZFIELD%CCOMMENT = 'X_Y_Z_SEDFLUXR' - TZFIELD%NGRID = 1 - TZFIELD%NTYPE = TYPEREAL - TZFIELD%NDIMS = 3 - TZFIELD%LTIMEDEP = .TRUE. + TZFIELD = TFIELDMETADATA( & + CMNHNAME = 'SEDFLUXR', & + CSTDNAME = '', & + CLONGNAME = 'SEDFLUXR', & + CUNITS = '', & + CDIR = 'XY', & + CCOMMENT = 'X_Y_Z_SEDFLUXR', & + NGRID = 1, & + NTYPE = TYPEREAL, & + NDIMS = 3, & + LTIMEDEP = .TRUE. ) CALL IO_Field_write(TPFILE,TZFIELD,ZWSEDR) END IF END DO diff --git a/src/mesonh/turb/mode_ibm_mixinglength.F90 b/src/mesonh/turb/mode_ibm_mixinglength.F90 index 7f74c571a60118414f48f509d1f3b7f95e3d5e26..bc584c94082a6a3b64adb527556d6373f11e944b 100644 --- a/src/mesonh/turb/mode_ibm_mixinglength.F90 +++ b/src/mesonh/turb/mode_ibm_mixinglength.F90 @@ -55,7 +55,7 @@ SUBROUTINE IBM_MIXINGLENGTH(D,PLM,PLEPS,PMU,PHI,PTKE) USE MODD_REF_n, ONLY: XRHODJ,XRHODREF USE MODD_CTURB USE MODD_CST - USE MODD_GRID_n, ONLY: XXHAT,XYHAT,XZZ + USE MODD_GRID_n, ONLY: XZZ ! ! interface !