diff --git a/src/arome/ext/aro_turb_mnh.F90 b/src/arome/ext/aro_turb_mnh.F90 index 261b4fd27ebe4881803f4bd1e6150f160e3ffdab..7863269a6893d3f19329cdd160a6367ce9de4f60 100644 --- a/src/arome/ext/aro_turb_mnh.F90 +++ b/src/arome/ext/aro_turb_mnh.F90 @@ -72,7 +72,7 @@ USE MODD_CONF USE MODD_NSV, ONLY: NSV_LIMA_NR, NSV_LIMA_NS, NSV_LIMA_NG, NSV_LIMA_NH USE MODD_CST, ONLY:CST USE MODD_CTURB, ONLY:CSTURB -USE MODD_LES, ONLY:LLES_CALL +USE MODD_LES, ONLY:TLES USE MODD_PARAMETERS USE MODD_DIMPHYEX, ONLY: DIMPHYEX_t USE MODD_IO, ONLY: TFILEDATA @@ -425,11 +425,11 @@ DO JRR=1, NBUDGET_RI YLBUDGET(JRR)%YDMDDH=>YDMDDH ENDDO OCOMPUTE_SRC=SIZE(PSIGS, 3)/=0 -CALL TURB (CST,CSTURB,TBUCONF,TURBN, YLDIMPHYEX,& - & IMI, KRR, KRRL, KRRI, HLBCX, HLBCY, KGRADIENTS, 1, & +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, LLES_CALL,OCOUPLES,OBLOWSNOW,& + & O2D, ONOMIXLG, OFLAT, TLES%LLES_CALL,OCOUPLES,OBLOWSNOW,& & OCOMPUTE_SRC, 1.0, & & OOCEAN,ODEEPOC, .FALSE., & & 'NONE',CMICRO, & diff --git a/src/arome/ext/aroini_turb.F90 b/src/arome/ext/aroini_turb.F90 index 5ba42b5abeffc1f4fdf82688db61331f673689bc..b5d06b2109c6e9590dc3ee664d9f82501b0ecea7 100644 --- a/src/arome/ext/aroini_turb.F90 +++ b/src/arome/ext/aroini_turb.F90 @@ -41,7 +41,7 @@ USE YOMHOOK , ONLY : LHOOK, DR_HOOK ! Original : 03-12-12 ! ------------------------------------------------------------------ -USE MODD_LES, ONLY : LLES, LLES_CALL +USE MODD_LES, ONLY : TLES USE MODD_CTURB, ONLY : XLINI USE MODD_TURB_n, ONLY: LHARAT, LSTATNW, CTURBLEN, TURB_GOTO_MODEL, LTURB_FLX, LTURB_DIAG, & LSUBG_COND, LRMC01, CTURBDIM, XIMPL @@ -67,7 +67,6 @@ IF (LHOOK) CALL DR_HOOK('AROINI_TURB',0,ZHOOK_HANDLE) CALL TURB_GOTO_MODEL(1,1) ! CALL INI_CTURB - ! 1bis. Modification of MODD_CTURB values XLINI=PLINI LHARAT=OHARATU @@ -75,8 +74,8 @@ LSTATNW=OSTATNW ! 2. Set implicit default values for MODD_LES -LLES=.FALSE. -LLES_CALL=.FALSE. +TLES%LLES=.FALSE. +TLES%LLES_CALL=.FALSE. ! 3. Set implicit default values for MODD_TURB_n diff --git a/src/arome/micro/ini_rain_ice.F90 b/src/arome/micro/ini_rain_ice.F90 index ba3e4075a2ee6693bcbaaf54797d7b7d7104367b..3e01f18fd0cea9b93207fd63a40fffacc59d5fb6 100644 --- a/src/arome/micro/ini_rain_ice.F90 +++ b/src/arome/micro/ini_rain_ice.F90 @@ -448,8 +448,8 @@ XLBDAS_MAX = 100000.0 XLBDAG_MAX = 100000.0 ! ZCONC_MAX = 1.E6 ! Maximal concentration for falling particules set to 1 per cc -IF(XCCS>0. .AND. XCXS>0. )XLBDAS_MAX = ( ZCONC_MAX/XCCS )**(1./XCXS) #if defined(REPRO48) || defined(REPRO55) +IF(XCCS>0. .AND. XCXS>0. )XLBDAS_MAX = ( ZCONC_MAX/XCCS )**(1./XCXS) #else XLBDAS_MAX = 1.E6 XLBDAS_MIN = 1000. @@ -511,7 +511,7 @@ XEXSEDS = (XBS+XDS-XCXS)/(XBS-XCXS) XFSEDS = XCS*XAS*XCCS*MOMG(XALPHAS,XNUS,XBS+XDS)* & (XAS*XCCS*MOMG(XALPHAS,XNUS,XBS))**(-XEXSEDS)*(ZRHO00)**XCEXVT #else -IF (LRED) THEN +IF (HCLOUD == 'ICE3' .OR. HCLOUD == 'ICE4') THEN XEXSEDS = -XDS-XBS XFSEDS = XCS*MOMG(XALPHAS,XNUS,XBS+XDS)/(MOMG(XALPHAS,XNUS,XBS)) & *(ZRHO00)**XCEXVT @@ -822,12 +822,12 @@ IF( (KACCLBDAS/=RAIN_ICE_PARAM%NACCLBDAS) .OR. (KACCLBDAR/=RAIN_ICE_PARAM%NACCLB (PACCLBDAS_MIN/=RAIN_ICE_PARAM%XACCLBDAS_MIN) .OR. (PACCLBDAR_MIN/=RAIN_ICE_PARAM%XACCLBDAR_MIN) .OR. & (PFDINFTY/=ZFDINFTY) ) THEN CALL RRCOLSS ( IND, XALPHAS, XNUS, XALPHAR, XNUR, & - ZESR, XBR, XCS, XDS, XFVELOS, XCR, XDR, & + ZESR, XBR, XCS, XDS, XFVELOS, XCR, XDR, & RAIN_ICE_PARAM%XACCLBDAS_MAX, RAIN_ICE_PARAM%XACCLBDAR_MAX, & RAIN_ICE_PARAM%XACCLBDAS_MIN, RAIN_ICE_PARAM%XACCLBDAR_MIN, & ZFDINFTY, XKER_RACCSS, XAG, XBS, XAS ) CALL RZCOLX ( IND, XALPHAS, XNUS, XALPHAR, XNUR, & - ZESR, XBR, XCS, XDS, XFVELOS, XCR, XDR, 0., & + ZESR, XBR, XCS, XDS, XFVELOS, XCR, XDR, 0., & RAIN_ICE_PARAM%XACCLBDAS_MAX, RAIN_ICE_PARAM%XACCLBDAR_MAX, & RAIN_ICE_PARAM%XACCLBDAS_MIN, RAIN_ICE_PARAM%XACCLBDAR_MIN, & ZFDINFTY, XKER_RACCS ) @@ -1033,7 +1033,7 @@ IF( (KDRYLBDAG/=RAIN_ICE_PARAM%NDRYLBDAG) .OR. (KDRYLBDAS/=RAIN_ICE_PARAM%NDRYLB (PALPHAG/=XALPHAG) .OR. (PNUG/=XNUG) .OR. & (PALPHAS/=XALPHAS) .OR. (PNUS/=XNUS) .OR. & (PEGS/=ZEGS) .OR. (PBS/=XBS) .OR. & - (PCG/=XCG) .OR. (PDG/=XDG) .OR. (PCS/=XCS) .OR. (PDS/=XDS) .OR. & + (PCG/=XCG) .OR. (PDG/=XDG) .OR. (PCS/=XCS) .OR. (PDS/=XDS) .OR. (PFVELOS/=XFVELOS) .OR. & (PDRYLBDAG_MAX/=RAIN_ICE_PARAM%XDRYLBDAG_MAX) .OR. (PDRYLBDAS_MAX/=RAIN_ICE_PARAM%XDRYLBDAS_MAX) .OR. & (PDRYLBDAG_MIN/=RAIN_ICE_PARAM%XDRYLBDAG_MIN) .OR. (PDRYLBDAS_MIN/=RAIN_ICE_PARAM%XDRYLBDAS_MIN) .OR. & (PFDINFTY/=ZFDINFTY) ) THEN diff --git a/src/common/aux/modd_les.F90 b/src/common/aux/modd_les.F90 index 389e2b1a35b949d75779e3bd8d384eeaf8967b63..d4c91693e2326d7ce29c37f158b16db813b7f7c9 100644 --- a/src/common/aux/modd_les.F90 +++ b/src/common/aux/modd_les.F90 @@ -53,6 +53,16 @@ USE MODD_PARAMETERS ! IMPLICIT NONE ! +PUBLIC :: LES_ALLOCATE_DIM +INTERFACE LES_ALLOCATE_DIM + MODULE PROCEDURE LES_ALLOCATE_1DIMX, LES_ALLOCATE_2DIMX, & + LES_ALLOCATE_3DIMX, LES_ALLOCATE_4DIMX, & + LES_ALLOCATE_3DIML, LES_ALLOCATE_4DIML, & + LES_ALLOCATE_3DIMI, LES_ALLOCATE_1DIMI, & + LES_ALLOCATE_2DIMC +END INTERFACE LES_ALLOCATE_DIM + +TYPE TLES_t !------------------------------------------------------------------------------- ! !* namelist variables @@ -70,9 +80,9 @@ REAL, DIMENSION(900) :: XLES_ALTITUDES ! alt. levels for LES comp. INTEGER, DIMENSION(900) :: NSPECTRA_LEVELS ! physical model levels for spectra comp. REAL, DIMENSION(900) :: XSPECTRA_ALTITUDES ! alt. levels for spectra comp. ! -INTEGER, DIMENSION( 10) :: NLES_TEMP_SERIE_I ! I, J and Z point -INTEGER, DIMENSION( 10) :: NLES_TEMP_SERIE_J ! localizations to -INTEGER, DIMENSION( 10) :: NLES_TEMP_SERIE_Z ! record temporal data +INTEGER, DIMENSION(10) :: NLES_TEMP_SERIE_I ! I, J and Z point +INTEGER, DIMENSION(10) :: NLES_TEMP_SERIE_J ! localizations to +INTEGER, DIMENSION(10) :: NLES_TEMP_SERIE_Z ! record temporal data CHARACTER(LEN=4) :: CLES_NORM_TYPE ! type of turbulence normalization CHARACTER(LEN=3) :: CBL_HEIGHT_DEF ! definition of the boundary layer height @@ -452,7 +462,1373 @@ REAL, DIMENSION(:,:,:,:), ALLOCATABLE :: XLES_PDF_RG ! rg pdf REAL, DIMENSION(:,:,:,:), ALLOCATABLE :: XLES_PDF_RT ! rt pdf REAL, DIMENSION(:,:,:,:), ALLOCATABLE :: XLES_PDF_THL ! thetal pdf ! +END TYPE TLES_t +! +TYPE(TLES_t), SAVE, TARGET :: TLES ! !------------------------------------------------------------------------------- ! +!* namelist variables +! +LOGICAL, POINTER :: LLES_MEAN => NULL() ! flag to activate the mean computations +LOGICAL, POINTER :: LLES_RESOLVED => NULL() ! flag to activate the resolved var. computations +LOGICAL, POINTER :: LLES_SUBGRID => NULL() ! flag to activate the subgrid var. computations +LOGICAL, POINTER :: LLES_UPDRAFT => NULL() ! flag to activate the computations in updrafts +LOGICAL, POINTER :: LLES_DOWNDRAFT=> NULL() ! flag to activate the computations in downdrafts +LOGICAL, POINTER :: LLES_SPECTRA => NULL() ! flag to activate the spectra computations +LOGICAL, POINTER :: LLES_PDF => NULL() ! flag to activate the pdf computations +! +INTEGER, DIMENSION(:), POINTER :: NLES_LEVELS => NULL() ! physical model levels for LES comp. +REAL, DIMENSION(:), POINTER :: XLES_ALTITUDES => NULL() ! alt. levels for LES comp. +INTEGER, DIMENSION(:), POINTER :: NSPECTRA_LEVELS => NULL() ! physical model levels for spectra comp. +REAL, DIMENSION(:), POINTER :: XSPECTRA_ALTITUDES => NULL() ! alt. levels for spectra comp. +! +INTEGER, DIMENSION(:), POINTER :: NLES_TEMP_SERIE_I => NULL() ! I, J and Z point +INTEGER, DIMENSION(:), POINTER :: NLES_TEMP_SERIE_J => NULL() ! localizations to +INTEGER, DIMENSION(:), POINTER :: NLES_TEMP_SERIE_Z => NULL() ! record temporal data + +CHARACTER(LEN=4), POINTER :: CLES_NORM_TYPE=> NULL() ! type of turbulence normalization +CHARACTER(LEN=3), POINTER :: CBL_HEIGHT_DEF=> NULL() ! definition of the boundary layer height + +REAL, POINTER :: XLES_TEMP_SAMPLING => NULL() ! temporal sampling between each computation +REAL, POINTER :: XLES_TEMP_MEAN_START => NULL() ! time (in s) from the beginning of the simulation +REAL, POINTER :: XLES_TEMP_MEAN_END => NULL() ! for start and end of the temporal averaged comp. +REAL, POINTER :: XLES_TEMP_MEAN_STEP => NULL() ! time step for each averaging + +LOGICAL, POINTER :: LLES_CART_MASK => NULL() ! flag to use a cartesian mask +INTEGER, POINTER :: NLES_IINF => NULL() ! definition of the cartesians mask in physical domain +INTEGER, POINTER :: NLES_ISUP => NULL() ! for NLES_CART_MODNBR model +INTEGER, POINTER :: NLES_JINF => NULL() ! " +INTEGER, POINTER :: NLES_JSUP => NULL() ! " +LOGICAL, POINTER :: LLES_NEB_MASK => NULL() ! flag to use a 2D nebulosity mask +LOGICAL, POINTER :: LLES_CORE_MASK => NULL() ! flag to use a 3D cloud core mask +LOGICAL, POINTER :: LLES_MY_MASK => NULL() ! flag to use its own mask (must be coded by user) +INTEGER, POINTER :: NLES_MASKS_USER => NULL() ! number of user masks for LES computations +LOGICAL, POINTER :: LLES_CS_MASK => NULL() ! flag to use conditional sampling mask +INTEGER, POINTER :: NPDF => NULL() ! number of pdf intervals +! +!------------------------------------------------------------------------------- +! +INTEGER, DIMENSION(:), POINTER :: NLESn_IINF=> NULL() ! definition of the cartesians mask in physical domain +INTEGER, DIMENSION(:), POINTER :: NLESn_ISUP=> NULL() ! for all models +INTEGER, DIMENSION(:), POINTER :: NLESn_JINF=> NULL() ! " +INTEGER, DIMENSION(:), POINTER :: NLESn_JSUP=> NULL() ! " +! +CHARACTER(LEN=4), DIMENSION(:,:), POINTER :: CLES_LBCX=> NULL() +! X boundary conditions for 2 points correlations computations for all models +! +CHARACTER(LEN=4), DIMENSION(:,:), POINTER :: CLES_LBCY=> NULL() +! Y boundary conditions for 2 points correlations computations for all models +! +!------------------------------------------------------------------------------- +! +LOGICAL, POINTER :: LLES => NULL() ! flag to compute the LES diagnostics +! +LOGICAL, POINTER :: LLES_CALL => NULL() ! flag to compute the LES diagnostics at current +! => NULL() ! time step +! +! +LOGICAL, DIMENSION(:,:,:), POINTER :: LLES_CURRENT_CART_MASK=> NULL() +! 2D cartesian mask of the current model +! +LOGICAL, DIMENSION(:,:,:), POINTER :: LLES_CURRENT_NEB_MASK=> NULL() +! 2D nebulosity mask of the current model +! +LOGICAL, DIMENSION(:,:,:), POINTER :: LLES_CURRENT_CORE_MASK=> NULL() +! 2D surface precipitations mask of the current model +! +! 2D owner mask of the current model +LOGICAL, DIMENSION(:,:,:,:), POINTER :: LLES_CURRENT_MY_MASKS=> NULL() +! +LOGICAL, DIMENSION(:,:,:), POINTER :: LLES_CURRENT_CS1_MASK=> NULL() +LOGICAL, DIMENSION(:,:,:), POINTER :: LLES_CURRENT_CS2_MASK=> NULL() +LOGICAL, DIMENSION(:,:,:), POINTER :: LLES_CURRENT_CS3_MASK=> NULL() +! 2D conditional sampling mask of the current model +! +INTEGER, POINTER :: NLES_CURRENT_TCOUNT=> NULL() +! current model LES time counter +! +INTEGER, POINTER :: NLES_CURRENT_TIMES=> NULL() +! current model NLES_TIMES (number of LES samplings) +! +INTEGER, POINTER :: NLES_CURRENT_IINF=> NULL(), NLES_CURRENT_ISUP=> NULL(), & + NLES_CURRENT_JINF=> NULL(), NLES_CURRENT_JSUP=> NULL() +! coordinates (in physical domain) for write_diachro, set to NLESn_IINF(current model), etc... +! +REAL, POINTER :: XLES_CURRENT_DOMEGAX=> NULL(), XLES_CURRENT_DOMEGAY=> NULL() +! minimum wavelength in spectra analysis +! +CHARACTER(LEN=4), DIMENSION(:), POINTER :: CLES_CURRENT_LBCX=> NULL() +! current model X boundary conditions for 2 points correlations computations +! +CHARACTER(LEN=4), DIMENSION(:), POINTER :: CLES_CURRENT_LBCY=> NULL() +! current model Y boundary conditions for 2 points correlations computations +! +REAL, DIMENSION(:), POINTER :: XLES_CURRENT_Z=> NULL() +! altitudes for diachro +! +REAL, POINTER :: XLES_CURRENT_ZS=> NULL() +! orography (used for normalization of altitudes) +! +INTEGER, DIMENSION(:,:,:), POINTER :: NKLIN_CURRENT_LES=> NULL() +! levels for vertical interpolation +! +REAL, DIMENSION(:,:,:), POINTER :: XCOEFLIN_CURRENT_LES=> NULL() +! coefficients for vertical interpolation +! +INTEGER, DIMENSION(:,:,:), POINTER :: NKLIN_CURRENT_SPEC=> NULL() +! levels for vertical interpolation +! +REAL, DIMENSION(:,:,:), POINTER :: XCOEFLIN_CURRENT_SPEC=> NULL() +! coefficients for vertical interpolation +! +REAL,DIMENSION(:), POINTER :: XTIME_LES=> NULL() +! time spent in subgrid LES computations in this time-step in TURB +! +!------------------------------------------------------------------------------- +! +!* normalization variables +! +REAL, DIMENSION(:), POINTER :: XLES_NORM_M=> NULL() +! normalization coefficient for distances (Meters) +! +REAL, DIMENSION(:), POINTER :: XLES_NORM_K=> NULL() +! normalization coefficient for temperatures (Kelvin) +! +REAL, DIMENSION(:), POINTER :: XLES_NORM_S=> NULL() +! normalization coefficient for times (Seconds) +! +REAL, DIMENSION(:), POINTER :: XLES_NORM_RHO=> NULL() +! normalization coefficient for densities +! +REAL, DIMENSION(:), POINTER :: XLES_NORM_RV=> NULL() +! normalization coefficient for mixing ratio +! +REAL, DIMENSION(:,:), POINTER :: XLES_NORM_SV=> NULL() +! normalization coefficient for scalar variables +! +REAL, DIMENSION(:), POINTER :: XLES_NORM_P=> NULL() +! normalization coefficient for pressure +! +!------------------------------------------------------------------------------- +! +!* monitoring variables +! +INTEGER, POINTER :: NLES_MASKS => NULL() ! number of masks for LES computations +INTEGER, POINTER :: NLES_K => NULL() ! number of vertical levels for local diagnostics +INTEGER, POINTER :: NSPECTRA_K => NULL() ! number of vertical levels for spectra +! +CHARACTER(LEN=1), POINTER :: CLES_LEVEL_TYPE => NULL() ! type of vertical levels for local diag. +CHARACTER(LEN=1), POINTER :: CSPECTRA_LEVEL_TYPE=> NULL() ! type of vertical levels for spectra +! +!------------------------------------------------------------------------------- +! +!* subgrid variables for current model +! +! ______ +REAL, DIMENSION(:,:,:), POINTER :: X_LES_RES_W_SBG_WThl=> NULL() ! <w'w'Thl'> +! _____ +REAL, DIMENSION(:,:,:), POINTER :: X_LES_RES_W_SBG_WRt => NULL() ! <w'w'Rt'> +! _____ +REAL, DIMENSION(:,:,:), POINTER :: X_LES_RES_W_SBG_Thl2=> NULL() ! <w'Thl'2> +! ____ +REAL, DIMENSION(:,:,:), POINTER :: X_LES_RES_W_SBG_Rt2 => NULL() ! <w'Rt'2> +! _______ +REAL, DIMENSION(:,:,:), POINTER :: X_LES_RES_W_SBG_ThlRt=> NULL()! <w'Thl'Rt'> +! _____ +REAL, DIMENSION(:,:,:,:), POINTER :: X_LES_RES_W_SBG_WSv => NULL() ! <w'w'Sv'> +! ____ +REAL, DIMENSION(:,:,:,:), POINTER :: X_LES_RES_W_SBG_Sv2=> NULL() ! <w'Sv'2> +! +REAL, DIMENSION(:,:,:), POINTER :: XLES_SUBGRID_RCSIGS=> NULL() ! rc sigmas +! +REAL, DIMENSION(:,:,:), POINTER :: XLES_SUBGRID_RCSIGC=> NULL() ! rc sigmac +! _____ +REAL, DIMENSION(:,:,:), POINTER :: X_LES_RES_ddxa_U_SBG_UaU => NULL() ! <du'/dxa ua'u'> +! _____ +REAL, DIMENSION(:,:,:), POINTER :: X_LES_RES_ddxa_V_SBG_UaV => NULL() ! <dv'/dxa ua'v'> +! _____ +REAL, DIMENSION(:,:,:), POINTER :: X_LES_RES_ddxa_W_SBG_UaW => NULL() ! <dw'/dxa ua'w'> +! _______ +REAL, DIMENSION(:,:,:), POINTER :: X_LES_RES_ddxa_W_SBG_UaThl=> NULL() ! <dw'/dxa ua'Thl'> +! _____ +REAL, DIMENSION(:,:,:), POINTER :: X_LES_RES_ddxa_Thl_SBG_UaW=> NULL() ! <dThl'/dxa ua'w'> +! ___ +REAL, DIMENSION(:,:,:), POINTER :: X_LES_RES_ddz_Thl_SBG_W2 => NULL() ! <dThl'/dz w'2> +! ______ +REAL, DIMENSION(:,:,:), POINTER :: X_LES_RES_ddxa_W_SBG_UaRt => NULL() ! <dw'/dxa ua'Rt'> +! _____ +REAL, DIMENSION(:,:,:), POINTER :: X_LES_RES_ddxa_Rt_SBG_UaW => NULL() ! <dRt'/dxa ua'w'> +! ___ +REAL, DIMENSION(:,:,:), POINTER :: X_LES_RES_ddz_Rt_SBG_W2 => NULL() ! <dRt'/dz w'2> +! ______ +REAL, DIMENSION(:,:,:), POINTER :: X_LES_RES_ddxa_Thl_SBG_UaRt=> NULL()! <dThl'/dxa ua'Rt'> +! _______ +REAL, DIMENSION(:,:,:), POINTER :: X_LES_RES_ddxa_Rt_SBG_UaThl=> NULL()! <dRt'/dxa ua'Thl'> +! _______ +REAL, DIMENSION(:,:,:), POINTER :: X_LES_RES_ddxa_Thl_SBG_UaThl=> NULL()! <dThl'/dxa ua'Thl'> +! ______ +REAL, DIMENSION(:,:,:), POINTER :: X_LES_RES_ddxa_Rt_SBG_UaRt=> NULL() ! <dRt'/dxa ua'Rt'> +! ______ +REAL, DIMENSION(:,:,:,:), POINTER :: X_LES_RES_ddxa_W_SBG_UaSv => NULL() ! <dw'/dxa ua'Sv'> +! _____ +REAL, DIMENSION(:,:,:,:), POINTER :: X_LES_RES_ddxa_Sv_SBG_UaW => NULL() ! <dSv'/dxa ua'w'> +! ___ +REAL, DIMENSION(:,:,:,:), POINTER :: X_LES_RES_ddz_Sv_SBG_W2 => NULL() ! <dSv'/dz w'2> +! ______ +REAL, DIMENSION(:,:,:,:), POINTER :: X_LES_RES_ddxa_Sv_SBG_UaSv=> NULL() ! <dSv'/dxa ua'Sv'> +! +! ___ +REAL, DIMENSION(:,:,:), POINTER :: X_LES_SUBGRID_U2 => NULL() ! <u'2> +! ___ +REAL, DIMENSION(:,:,:), POINTER :: X_LES_SUBGRID_V2 => NULL() ! <v'2> +! ___ +REAL, DIMENSION(:,:,:), POINTER :: X_LES_SUBGRID_W2 => NULL() ! <w'2> +! _____ +REAL, DIMENSION(:,:,:), POINTER :: X_LES_SUBGRID_Thl2 => NULL() ! <Thl'2> +! ____ +REAL, DIMENSION(:,:,:), POINTER :: X_LES_SUBGRID_Rt2 => NULL() ! <Rt'2> +! ____ +REAL, DIMENSION(:,:,:), POINTER :: X_LES_SUBGRID_Rc2 => NULL() ! <Rc'2> +! ____ +REAL, DIMENSION(:,:,:), POINTER :: X_LES_SUBGRID_Ri2 => NULL() ! <Ri'2> +! _______ +REAL, DIMENSION(:,:,:), POINTER :: X_LES_SUBGRID_ThlRt=> NULL() ! <Thl'Rt'> +! ____ +REAL, DIMENSION(:,:,:,:), POINTER :: X_LES_SUBGRID_Sv2 => NULL() ! <Sv'2> +! ____ +REAL, DIMENSION(:,:,:), POINTER :: X_LES_SUBGRID_UV => NULL() ! <u'v'> +! ____ +REAL, DIMENSION(:,:,:), POINTER :: X_LES_SUBGRID_WU => NULL() ! <w'u'> +! ____ +REAL, DIMENSION(:,:,:), POINTER :: X_LES_SUBGRID_WV => NULL() ! <w'v'> +! ______ +REAL, DIMENSION(:,:,:), POINTER :: X_LES_SUBGRID_UThl => NULL() ! <u'Thl'> +! ______ +REAL, DIMENSION(:,:,:), POINTER :: X_LES_SUBGRID_VThl => NULL() ! <v'Thl'> +! ______ +REAL, DIMENSION(:,:,:), POINTER :: X_LES_SUBGRID_WThl => NULL() ! <w'Thl'> +! _____ +REAL, DIMENSION(:,:,:), POINTER :: X_LES_SUBGRID_URt => NULL() ! <u'Rt'> +! _____ +REAL, DIMENSION(:,:,:), POINTER :: X_LES_SUBGRID_VRt => NULL() ! <v'Rt'> +! _____ +REAL, DIMENSION(:,:,:), POINTER :: X_LES_SUBGRID_WRt => NULL() ! <w'Rt'> +! _____ +REAL, DIMENSION(:,:,:), POINTER :: X_LES_SUBGRID_URc => NULL() ! <u'Rc'> +! _____ +REAL, DIMENSION(:,:,:), POINTER :: X_LES_SUBGRID_VRc => NULL() ! <v'Rc'> +! _____ +REAL, DIMENSION(:,:,:), POINTER :: X_LES_SUBGRID_WRc => NULL() ! <w'Rc'> +! _____ +REAL, DIMENSION(:,:,:,:), POINTER :: X_LES_SUBGRID_USv=> NULL() ! <u'Sv'> +! _____ +REAL, DIMENSION(:,:,:,:), POINTER :: X_LES_SUBGRID_VSv=> NULL() ! <v'Sv'> +! _____ +REAL, DIMENSION(:,:,:,:), POINTER :: X_LES_SUBGRID_WSv=> NULL() ! <w'Sv'> +! ___ +REAL, DIMENSION(:,:,:), POINTER :: X_LES_SUBGRID_UTke => NULL() ! <u'e> +! ___ +REAL, DIMENSION(:,:,:), POINTER :: X_LES_SUBGRID_VTke => NULL() ! <v'e> +! ___ +REAL, DIMENSION(:,:,:), POINTER :: X_LES_SUBGRID_WTke => NULL() ! <w'e> +! ___ +REAL, DIMENSION(:,:,:), POINTER :: X_LES_SUBGRID_ddz_WTke => NULL() ! <dw'e/dz> +! ______ +REAL, DIMENSION(:,:,:), POINTER :: X_LES_SUBGRID_WThv => NULL() ! <w'Thv'> +! ________ +REAL, DIMENSION(:,:,:), POINTER :: X_LES_SUBGRID_ThlThv=> NULL() ! <Thl'Thv'> +! _______ +REAL, DIMENSION(:,:,:), POINTER :: X_LES_SUBGRID_RtThv => NULL() ! <Rt'Thv'> +! _______ +REAL, DIMENSION(:,:,:,:), POINTER :: X_LES_SUBGRID_SvThv => NULL() ! <Sv'Thv'> +! ______ +REAL, DIMENSION(:,:,:), POINTER :: X_LES_SUBGRID_W2Thl => NULL() ! <w'2Thl> +! _____ +REAL, DIMENSION(:,:,:), POINTER :: X_LES_SUBGRID_W2Rt => NULL() ! <w'2Rt> +! _____ +REAL, DIMENSION(:,:,:,:), POINTER :: X_LES_SUBGRID_W2Sv => NULL() ! <w'2Sv> +! _______ +REAL, DIMENSION(:,:,:), POINTER :: X_LES_SUBGRID_WThlRt=> NULL() ! <w'ThlRt> +! ______ +REAL, DIMENSION(:,:,:), POINTER :: X_LES_SUBGRID_WThl2 => NULL() ! <w'Thl2> +! _____ +REAL, DIMENSION(:,:,:), POINTER :: X_LES_SUBGRID_WRt2 => NULL() ! <w'Rt2> +! _____ +REAL, DIMENSION(:,:,:,:), POINTER :: X_LES_SUBGRID_WSv2 => NULL() ! <w'Sv2> +! _______ +REAL, DIMENSION(:,:,:), POINTER :: X_LES_SUBGRID_DISS_Tke=> NULL() ! <epsilon> +! ____________ +REAL, DIMENSION(:,:,:), POINTER :: X_LES_SUBGRID_DISS_Thl2=> NULL() ! <epsilon_Thl2> +! ___________ +REAL, DIMENSION(:,:,:), POINTER :: X_LES_SUBGRID_DISS_Rt2 => NULL() ! <epsilon_Rt2> +! ______________ +REAL, DIMENSION(:,:,:), POINTER :: X_LES_SUBGRID_DISS_ThlRt=> NULL()! <epsilon_ThlRt> +! ___________ +REAL, DIMENSION(:,:,:,:), POINTER :: X_LES_SUBGRID_DISS_Sv2 => NULL() ! <epsilon_Sv2> +! +REAL, DIMENSION(:,:,:), POINTER :: X_LES_SUBGRID_WP => NULL() ! <w'p'> +! +REAL, DIMENSION(:,:,:), POINTER :: X_LES_SUBGRID_ThlPz => NULL() ! <Thl'dp'/dz> +! +REAL, DIMENSION(:,:,:), POINTER :: X_LES_SUBGRID_RtPz => NULL() ! <Rt'dp'/dz> +! +REAL, DIMENSION(:,:,:,:), POINTER :: X_LES_SUBGRID_SvPz => NULL() ! <Sv'dp'/dz> +! +REAL, DIMENSION(:,:,:), POINTER :: X_LES_SUBGRID_PHI3 => NULL() ! phi3 +! +REAL, DIMENSION(:,:,:), POINTER :: X_LES_SUBGRID_PSI3 => NULL() ! psi3 +! +REAL, DIMENSION(:,:,:), POINTER :: X_LES_SUBGRID_LMix => NULL() ! mixing length +! +REAL, DIMENSION(:,:,:), POINTER :: X_LES_SUBGRID_LDiss => NULL() ! dissipative length +! +REAL, DIMENSION(:,:,:), POINTER :: X_LES_SUBGRID_Km => NULL() ! eddy diffusivity for momentum +! +REAL, DIMENSION(:,:,:), POINTER :: X_LES_SUBGRID_Kh => NULL() ! eddy diffusivity for heat +! +REAL, DIMENSION(:,:,:), POINTER :: X_LES_SUBGRID_THLUP_MF => NULL() ! Thl of the Updraft +! +REAL, DIMENSION(:,:,:), POINTER :: X_LES_SUBGRID_RTUP_MF => NULL() ! Rt of the Updraft +! +REAL, DIMENSION(:,:,:), POINTER :: X_LES_SUBGRID_RVUP_MF => NULL() ! Rv of the Updraft +! +REAL, DIMENSION(:,:,:), POINTER :: X_LES_SUBGRID_RCUP_MF => NULL() ! Rc of the Updraft +! +REAL, DIMENSION(:,:,:), POINTER :: X_LES_SUBGRID_RIUP_MF => NULL() ! Ri of the Updraft +! +REAL, DIMENSION(:,:,:), POINTER :: X_LES_SUBGRID_WUP_MF => NULL() ! Thl of the Updraft +! +REAL, DIMENSION(:,:,:), POINTER :: X_LES_SUBGRID_MASSFLUX => NULL() ! Mass Flux +! +REAL, DIMENSION(:,:,:), POINTER :: X_LES_SUBGRID_DETR => NULL() ! Detrainment +! +REAL, DIMENSION(:,:,:), POINTER :: X_LES_SUBGRID_ENTR => NULL() ! Entrainment +! +REAL, DIMENSION(:,:,:), POINTER :: X_LES_SUBGRID_FRACUP => NULL() ! Updraft Fraction +! +REAL, DIMENSION(:,:,:), POINTER :: X_LES_SUBGRID_THVUP_MF => NULL() ! Thv of the Updraft +! +REAL, DIMENSION(:,:,:), POINTER :: X_LES_SUBGRID_WTHLMF=> NULL() ! Flux of thl +! +REAL, DIMENSION(:,:,:), POINTER :: X_LES_SUBGRID_WRTMF => NULL() ! Flux of rt +! +REAL, DIMENSION(:,:,:), POINTER :: X_LES_SUBGRID_WTHVMF=> NULL() ! Flux of thv +! +REAL, DIMENSION(:,:,:), POINTER :: X_LES_SUBGRID_WUMF => NULL() ! Flux of u +! +REAL, DIMENSION(:,:,:), POINTER :: X_LES_SUBGRID_WVMF => NULL() ! Flux of v +! +!* surface variables +! +REAL, DIMENSION(:), POINTER :: X_LES_USTAR => NULL() ! local u* temporal series +REAL, DIMENSION(:), POINTER :: X_LES_UW0 => NULL() ! uw temporal series +REAL, DIMENSION(:), POINTER :: X_LES_VW0 => NULL() ! vw temporal series +REAL, DIMENSION(:), POINTER :: X_LES_Q0 => NULL() ! Qo temporal series +REAL, DIMENSION(:), POINTER :: X_LES_E0 => NULL() ! Eo temporal series +REAL, DIMENSION(:,:), POINTER :: X_LES_SV0 => NULL() ! scalar surface fluxes +! +!* pdf variables +REAL , POINTER :: XRV_PDF_MIN => NULL() ! min of rv pdf +REAL , POINTER :: XRV_PDF_MAX => NULL() ! max of rv pdf +REAL , POINTER :: XTH_PDF_MIN => NULL() ! min of theta pdf +REAL , POINTER :: XTH_PDF_MAX => NULL() ! max of theta pdf +REAL , POINTER :: XW_PDF_MIN => NULL() ! min of w pdf +REAL , POINTER :: XW_PDF_MAX => NULL() ! max of w pdf +REAL , POINTER :: XTHV_PDF_MIN => NULL() ! min of thetav pdf +REAL , POINTER :: XTHV_PDF_MAX => NULL() ! max of thetav pdf +REAL , POINTER :: XRC_PDF_MIN => NULL() ! min of rc pdf +REAL , POINTER :: XRC_PDF_MAX => NULL() ! max of rc pdf +REAL , POINTER :: XRR_PDF_MIN => NULL() ! min of rr pdf +REAL , POINTER :: XRR_PDF_MAX => NULL() ! max of rr pdf +REAL , POINTER :: XRI_PDF_MIN => NULL() ! min of ri pdf +REAL , POINTER :: XRI_PDF_MAX => NULL() ! max of ri pdf +REAL , POINTER :: XRS_PDF_MIN => NULL() ! min of rs pdf +REAL , POINTER :: XRS_PDF_MAX => NULL() ! max of rs pdf +REAL , POINTER :: XRG_PDF_MIN => NULL() ! min of rg pdf +REAL , POINTER :: XRG_PDF_MAX => NULL() ! max of rg pdf +REAL , POINTER :: XRT_PDF_MIN => NULL() ! min of rt pdf +REAL , POINTER :: XRT_PDF_MAX => NULL() ! max of rt pdf +REAL , POINTER :: XTHL_PDF_MIN => NULL() ! min of thetal pdf +REAL , POINTER :: XTHL_PDF_MAX => NULL() ! max of thetal pdf +!------------------------------------------------------------------------------- +!* pdf distribution +! +REAL, DIMENSION(:,:,:,:), POINTER :: XLES_PDF_RV => NULL() ! rv pdf +REAL, DIMENSION(:,:,:,:), POINTER :: XLES_PDF_TH => NULL() ! theta pdf +REAL, DIMENSION(:,:,:,:), POINTER :: XLES_PDF_W => NULL() ! w pdf +REAL, DIMENSION(:,:,:,:), POINTER :: XLES_PDF_THV => NULL() ! thetav pdf +REAL, DIMENSION(:,:,:,:), POINTER :: XLES_PDF_RC => NULL() ! rc pdf +REAL, DIMENSION(:,:,:,:), POINTER :: XLES_PDF_RR => NULL() ! rr pdf +REAL, DIMENSION(:,:,:,:), POINTER :: XLES_PDF_RI => NULL() ! ri pdf +REAL, DIMENSION(:,:,:,:), POINTER :: XLES_PDF_RS => NULL() ! rs pdf +REAL, DIMENSION(:,:,:,:), POINTER :: XLES_PDF_RG => NULL() ! rg pdf +REAL, DIMENSION(:,:,:,:), POINTER :: XLES_PDF_RT => NULL() ! rt pdf +REAL, DIMENSION(:,:,:,:), POINTER :: XLES_PDF_THL => NULL() ! thetal pdf +!------------------------------------------------------------------------------- +!! +CONTAINS +SUBROUTINE LES_ASSOCIATE() + ! Associate all LES non-allocatable variables to the TYPE LES + IMPLICIT NONE + NLES_LEVELS => TLES%NLES_LEVELS + XLES_ALTITUDES => TLES%XLES_ALTITUDES + NSPECTRA_LEVELS => TLES%NSPECTRA_LEVELS + XSPECTRA_ALTITUDES => TLES%XSPECTRA_ALTITUDES + XTIME_LES => TLES%XTIME_LES + CLES_LBCX => TLES%CLES_LBCX + CLES_LBCY => TLES%CLES_LBCY + CLES_CURRENT_LBCY => TLES%CLES_CURRENT_LBCY + CLES_CURRENT_LBCX => TLES%CLES_CURRENT_LBCX + NLESn_IINF => TLES%NLESn_IINF + NLESn_ISUP => TLES%NLESn_ISUP + NLESn_JINF => TLES%NLESn_JINF + NLESn_JSUP => TLES%NLESn_JSUP + NLES_TEMP_SERIE_I => TLES%NLES_TEMP_SERIE_I + NLES_TEMP_SERIE_J => TLES%NLES_TEMP_SERIE_J + NLES_TEMP_SERIE_Z => TLES%NLES_TEMP_SERIE_Z + LLES_MEAN => TLES%LLES_MEAN + LLES_RESOLVED => TLES%LLES_RESOLVED + LLES_SUBGRID => TLES%LLES_SUBGRID + LLES_UPDRAFT => TLES%LLES_UPDRAFT + LLES_DOWNDRAFT => TLES%LLES_DOWNDRAFT + LLES_SPECTRA => TLES%LLES_SPECTRA + LLES_PDF => TLES%LLES_PDF + CLES_NORM_TYPE => TLES%CLES_NORM_TYPE + CBL_HEIGHT_DEF => TLES%CBL_HEIGHT_DEF + XLES_TEMP_SAMPLING => TLES%XLES_TEMP_SAMPLING + XLES_TEMP_MEAN_START => TLES%XLES_TEMP_MEAN_START + XLES_TEMP_MEAN_END => TLES%XLES_TEMP_MEAN_END + XLES_TEMP_MEAN_STEP => TLES%XLES_TEMP_MEAN_STEP + LLES_CART_MASK => TLES%LLES_CART_MASK + NLES_IINF => TLES%NLES_IINF + NLES_ISUP => TLES%NLES_ISUP + NLES_JINF => TLES%NLES_JINF + NLES_JSUP => TLES%NLES_JSUP + LLES_NEB_MASK => TLES%LLES_NEB_MASK + LLES_CORE_MASK => TLES%LLES_CORE_MASK + LLES_MY_MASK => TLES%LLES_MY_MASK + NLES_MASKS_USER => TLES%NLES_MASKS_USER + LLES_CS_MASK => TLES%LLES_CS_MASK + NPDF => TLES%NPDF + LLES => TLES%LLES + LLES_CALL => TLES%LLES_CALL + NLES_CURRENT_TCOUNT => TLES%NLES_CURRENT_TCOUNT + NLES_CURRENT_TIMES => TLES%NLES_CURRENT_TIMES + NLES_CURRENT_IINF => TLES%NLES_CURRENT_IINF + NLES_CURRENT_ISUP => TLES%NLES_CURRENT_ISUP + NLES_CURRENT_JINF => TLES%NLES_CURRENT_JINF + NLES_CURRENT_JSUP => TLES%NLES_CURRENT_JSUP + XLES_CURRENT_DOMEGAX => TLES%XLES_CURRENT_DOMEGAX + XLES_CURRENT_DOMEGAY => TLES%XLES_CURRENT_DOMEGAY + XLES_CURRENT_ZS => TLES%XLES_CURRENT_ZS + NLES_MASKS => TLES%NLES_MASKS + NLES_K => TLES%NLES_K + NSPECTRA_K => TLES%NSPECTRA_K + CLES_LEVEL_TYPE => TLES%CLES_LEVEL_TYPE + CSPECTRA_LEVEL_TYPE => TLES%CSPECTRA_LEVEL_TYPE + XRV_PDF_MIN => TLES%XRV_PDF_MIN + XRV_PDF_MAX => TLES%XRV_PDF_MAX + XTH_PDF_MIN => TLES%XTH_PDF_MIN + XTH_PDF_MAX => TLES%XTH_PDF_MAX + XW_PDF_MIN => TLES%XW_PDF_MIN + XW_PDF_MAX => TLES%XW_PDF_MAX + XTHV_PDF_MIN => TLES%XTHV_PDF_MIN + XTHV_PDF_MAX => TLES%XTHV_PDF_MAX + XRC_PDF_MIN => TLES%XRC_PDF_MIN + XRC_PDF_MAX => TLES%XRC_PDF_MAX + XRR_PDF_MIN => TLES%XRR_PDF_MIN + XRR_PDF_MAX => TLES%XRR_PDF_MAX + XRI_PDF_MIN => TLES%XRI_PDF_MIN + XRI_PDF_MAX => TLES%XRI_PDF_MAX + XRS_PDF_MIN => TLES%XRS_PDF_MIN + XRS_PDF_MAX => TLES%XRS_PDF_MAX + XRG_PDF_MIN => TLES%XRG_PDF_MIN + XRG_PDF_MAX => TLES%XRG_PDF_MAX + XRT_PDF_MIN => TLES%XRT_PDF_MIN + XRT_PDF_MAX => TLES%XRT_PDF_MAX + XTHL_PDF_MIN => TLES%XTHL_PDF_MIN + XTHL_PDF_MAX => TLES%XTHL_PDF_MAX +END SUBROUTINE LES_ASSOCIATE +! +SUBROUTINE LES_ALLOCATE(HNAME,NDIMS) + IMPLICIT NONE + CHARACTER(LEN=*), INTENT(IN) :: HNAME + INTEGER, DIMENSION(:) :: NDIMS + ! + SELECT CASE(HNAME) + ! + CASE('LLES_CURRENT_CART_MASK') + CALL LES_ALLOCATE_DIM(TLES%LLES_CURRENT_CART_MASK,NDIMS) + LLES_CURRENT_CART_MASK=>TLES%LLES_CURRENT_CART_MASK + CASE('LLES_CURRENT_NEB_MASK') + CALL LES_ALLOCATE_DIM(TLES%LLES_CURRENT_NEB_MASK,NDIMS) + LLES_CURRENT_NEB_MASK=>TLES%LLES_CURRENT_NEB_MASK + CASE('LLES_CURRENT_CORE_MASK') + CALL LES_ALLOCATE_DIM(TLES%LLES_CURRENT_CORE_MASK,NDIMS) + LLES_CURRENT_CORE_MASK=>TLES%LLES_CURRENT_CORE_MASK + CASE('LLES_CURRENT_MY_MASKS') + CALL LES_ALLOCATE_DIM(TLES%LLES_CURRENT_MY_MASKS,NDIMS) + LLES_CURRENT_MY_MASKS=>TLES%LLES_CURRENT_MY_MASKS + CASE('LLES_CURRENT_CS1_MASK') + CALL LES_ALLOCATE_DIM(TLES%LLES_CURRENT_CS1_MASK,NDIMS) + LLES_CURRENT_CS1_MASK=>TLES%LLES_CURRENT_CS1_MASK + CASE('LLES_CURRENT_CS2_MASK') + CALL LES_ALLOCATE_DIM(TLES%LLES_CURRENT_CS2_MASK,NDIMS) + LLES_CURRENT_CS2_MASK=>TLES%LLES_CURRENT_CS2_MASK + CASE('LLES_CURRENT_CS3_MASK') + CALL LES_ALLOCATE_DIM(TLES%LLES_CURRENT_CS3_MASK,NDIMS) + LLES_CURRENT_CS3_MASK=>TLES%LLES_CURRENT_CS3_MASK + CASE('XLES_CURRENT_Z') + CALL LES_ALLOCATE_DIM(TLES%XLES_CURRENT_Z,NDIMS) + XLES_CURRENT_Z=>TLES%XLES_CURRENT_Z + CASE('NKLIN_CURRENT_LES') + CALL LES_ALLOCATE_DIM(TLES%NKLIN_CURRENT_LES,NDIMS) + NKLIN_CURRENT_LES=>TLES%NKLIN_CURRENT_LES + CASE('XCOEFLIN_CURRENT_LES') + CALL LES_ALLOCATE_DIM(TLES%XCOEFLIN_CURRENT_LES,NDIMS) + XCOEFLIN_CURRENT_LES=>TLES%XCOEFLIN_CURRENT_LES + CASE('NKLIN_CURRENT_SPEC') + CALL LES_ALLOCATE_DIM(TLES%NKLIN_CURRENT_SPEC,NDIMS) + NKLIN_CURRENT_SPEC=>TLES%NKLIN_CURRENT_SPEC + CASE('XCOEFLIN_CURRENT_SPEC') + CALL LES_ALLOCATE_DIM(TLES%XCOEFLIN_CURRENT_SPEC,NDIMS) + XCOEFLIN_CURRENT_SPEC=>TLES%XCOEFLIN_CURRENT_SPEC + CASE('XLES_NORM_M') + CALL LES_ALLOCATE_DIM(TLES%XLES_NORM_M,NDIMS) + XLES_NORM_M=>TLES%XLES_NORM_M + CASE('XLES_NORM_K') + CALL LES_ALLOCATE_DIM(TLES%XLES_NORM_K,NDIMS) + XLES_NORM_K=>TLES%XLES_NORM_K + CASE('XLES_NORM_S') + CALL LES_ALLOCATE_DIM(TLES%XLES_NORM_S,NDIMS) + XLES_NORM_S=>TLES%XLES_NORM_S + CASE('XLES_NORM_RHO') + CALL LES_ALLOCATE_DIM(TLES%XLES_NORM_RHO,NDIMS) + XLES_NORM_RHO=>TLES%XLES_NORM_RHO + CASE('XLES_NORM_RV') + CALL LES_ALLOCATE_DIM(TLES%XLES_NORM_RV,NDIMS) + XLES_NORM_RV=>TLES%XLES_NORM_RV + CASE('XLES_NORM_SV') + CALL LES_ALLOCATE_DIM(TLES%XLES_NORM_SV,NDIMS) + XLES_NORM_SV=>TLES%XLES_NORM_SV + CASE('XLES_NORM_P') + CALL LES_ALLOCATE_DIM(TLES%XLES_NORM_P,NDIMS) + XLES_NORM_P=>TLES%XLES_NORM_P + CASE('X_LES_RES_W_SBG_WThl') + CALL LES_ALLOCATE_DIM(TLES%X_LES_RES_W_SBG_WThl,NDIMS) + X_LES_RES_W_SBG_WThl=>TLES%X_LES_RES_W_SBG_WThl + CASE('X_LES_RES_W_SBG_WRt') + CALL LES_ALLOCATE_DIM(TLES%X_LES_RES_W_SBG_WRt,NDIMS) + X_LES_RES_W_SBG_WRt=>TLES%X_LES_RES_W_SBG_WRt + CASE('X_LES_RES_W_SBG_Thl2') + CALL LES_ALLOCATE_DIM(TLES%X_LES_RES_W_SBG_Thl2,NDIMS) + X_LES_RES_W_SBG_Thl2=>TLES%X_LES_RES_W_SBG_Thl2 + CASE('X_LES_RES_W_SBG_Rt2') + CALL LES_ALLOCATE_DIM(TLES%X_LES_RES_W_SBG_Rt2,NDIMS) + X_LES_RES_W_SBG_Rt2=>TLES%X_LES_RES_W_SBG_Rt2 + CASE('X_LES_RES_W_SBG_ThlRt') + CALL LES_ALLOCATE_DIM(TLES%X_LES_RES_W_SBG_ThlRt,NDIMS) + X_LES_RES_W_SBG_ThlRt=>TLES%X_LES_RES_W_SBG_ThlRt + CASE('X_LES_RES_W_SBG_WSv') + CALL LES_ALLOCATE_DIM(TLES%X_LES_RES_W_SBG_WSv,NDIMS) + X_LES_RES_W_SBG_WSv=>TLES%X_LES_RES_W_SBG_WSv + CASE('X_LES_RES_W_SBG_Sv2') + CALL LES_ALLOCATE_DIM(TLES%X_LES_RES_W_SBG_Sv2,NDIMS) + X_LES_RES_W_SBG_Sv2=>TLES%X_LES_RES_W_SBG_Sv2 + CASE('XLES_SUBGRID_RCSIGS') + CALL LES_ALLOCATE_DIM(TLES%XLES_SUBGRID_RCSIGS,NDIMS) + XLES_SUBGRID_RCSIGS=>TLES%XLES_SUBGRID_RCSIGS + CASE('XLES_SUBGRID_RCSIGC') + CALL LES_ALLOCATE_DIM(TLES%XLES_SUBGRID_RCSIGC,NDIMS) + XLES_SUBGRID_RCSIGC=>TLES%XLES_SUBGRID_RCSIGC + CASE('X_LES_RES_ddxa_U_SBG_UaU') + CALL LES_ALLOCATE_DIM(TLES%X_LES_RES_ddxa_U_SBG_UaU,NDIMS) + X_LES_RES_ddxa_U_SBG_UaU=>TLES%X_LES_RES_ddxa_U_SBG_UaU + CASE('X_LES_RES_ddxa_V_SBG_UaV') + CALL LES_ALLOCATE_DIM(TLES%X_LES_RES_ddxa_V_SBG_UaV,NDIMS) + X_LES_RES_ddxa_V_SBG_UaV=>TLES%X_LES_RES_ddxa_V_SBG_UaV + CASE('X_LES_RES_ddxa_W_SBG_UaW') + CALL LES_ALLOCATE_DIM(TLES%X_LES_RES_ddxa_W_SBG_UaW,NDIMS) + X_LES_RES_ddxa_W_SBG_UaW=>TLES%X_LES_RES_ddxa_W_SBG_UaW + CASE('X_LES_RES_ddxa_W_SBG_UaThl') + CALL LES_ALLOCATE_DIM(TLES%X_LES_RES_ddxa_W_SBG_UaThl,NDIMS) + X_LES_RES_ddxa_W_SBG_UaThl=>TLES%X_LES_RES_ddxa_W_SBG_UaThl + CASE('X_LES_RES_ddxa_Thl_SBG_UaW') + CALL LES_ALLOCATE_DIM(TLES%X_LES_RES_ddxa_Thl_SBG_UaW,NDIMS) + X_LES_RES_ddxa_Thl_SBG_UaW=>TLES%X_LES_RES_ddxa_Thl_SBG_UaW + CASE('X_LES_RES_ddz_Thl_SBG_W2') + CALL LES_ALLOCATE_DIM(TLES%X_LES_RES_ddz_Thl_SBG_W2,NDIMS) + X_LES_RES_ddz_Thl_SBG_W2=>TLES%X_LES_RES_ddz_Thl_SBG_W2 + CASE('X_LES_RES_ddxa_W_SBG_UaRt') + CALL LES_ALLOCATE_DIM(TLES%X_LES_RES_ddxa_W_SBG_UaRt,NDIMS) + X_LES_RES_ddxa_W_SBG_UaRt=>TLES%X_LES_RES_ddxa_W_SBG_UaRt + CASE('X_LES_RES_ddxa_Rt_SBG_UaW') + CALL LES_ALLOCATE_DIM(TLES%X_LES_RES_ddxa_Rt_SBG_UaW,NDIMS) + X_LES_RES_ddxa_Rt_SBG_UaW=>TLES%X_LES_RES_ddxa_Rt_SBG_UaW + CASE('X_LES_RES_ddz_Rt_SBG_W2') + CALL LES_ALLOCATE_DIM(TLES%X_LES_RES_ddz_Rt_SBG_W2,NDIMS) + X_LES_RES_ddz_Rt_SBG_W2=>TLES%X_LES_RES_ddz_Rt_SBG_W2 + CASE('X_LES_RES_ddxa_Thl_SBG_UaRt') + CALL LES_ALLOCATE_DIM(TLES%X_LES_RES_ddxa_Thl_SBG_UaRt,NDIMS) + X_LES_RES_ddxa_Thl_SBG_UaRt=>TLES%X_LES_RES_ddxa_Thl_SBG_UaRt + CASE('X_LES_RES_ddxa_Rt_SBG_UaThl') + CALL LES_ALLOCATE_DIM(TLES%X_LES_RES_ddxa_Rt_SBG_UaThl,NDIMS) + X_LES_RES_ddxa_Rt_SBG_UaThl=>TLES%X_LES_RES_ddxa_Rt_SBG_UaThl + CASE('X_LES_RES_ddxa_Thl_SBG_UaThl') + CALL LES_ALLOCATE_DIM(TLES%X_LES_RES_ddxa_Thl_SBG_UaThl,NDIMS) + X_LES_RES_ddxa_Thl_SBG_UaThl=>TLES%X_LES_RES_ddxa_Thl_SBG_UaThl + CASE('X_LES_RES_ddxa_Rt_SBG_UaRt') + CALL LES_ALLOCATE_DIM(TLES%X_LES_RES_ddxa_Rt_SBG_UaRt,NDIMS) + X_LES_RES_ddxa_Rt_SBG_UaRt=>TLES%X_LES_RES_ddxa_Rt_SBG_UaRt + CASE('X_LES_RES_ddxa_W_SBG_UaSv') + CALL LES_ALLOCATE_DIM(TLES%X_LES_RES_ddxa_W_SBG_UaSv,NDIMS) + X_LES_RES_ddxa_W_SBG_UaSv=>TLES%X_LES_RES_ddxa_W_SBG_UaSv + CASE('X_LES_RES_ddxa_Sv_SBG_UaW') + CALL LES_ALLOCATE_DIM(TLES%X_LES_RES_ddxa_Sv_SBG_UaW,NDIMS) + X_LES_RES_ddxa_Sv_SBG_UaW=>TLES%X_LES_RES_ddxa_Sv_SBG_UaW + CASE('X_LES_RES_ddz_Sv_SBG_W2') + CALL LES_ALLOCATE_DIM(TLES%X_LES_RES_ddz_Sv_SBG_W2,NDIMS) + X_LES_RES_ddz_Sv_SBG_W2=>TLES%X_LES_RES_ddz_Sv_SBG_W2 + CASE('X_LES_RES_ddxa_Sv_SBG_UaSv') + CALL LES_ALLOCATE_DIM(TLES%X_LES_RES_ddxa_Sv_SBG_UaSv,NDIMS) + X_LES_RES_ddxa_Sv_SBG_UaSv=>TLES%X_LES_RES_ddxa_Sv_SBG_UaSv + CASE('X_LES_SUBGRID_U2') + CALL LES_ALLOCATE_DIM(TLES%X_LES_SUBGRID_U2,NDIMS) + X_LES_SUBGRID_U2=>TLES%X_LES_SUBGRID_U2 + CASE('X_LES_SUBGRID_V2') + CALL LES_ALLOCATE_DIM(TLES%X_LES_SUBGRID_V2,NDIMS) + X_LES_SUBGRID_V2=>TLES%X_LES_SUBGRID_V2 + CASE('X_LES_SUBGRID_W2') + CALL LES_ALLOCATE_DIM(TLES%X_LES_SUBGRID_W2,NDIMS) + X_LES_SUBGRID_W2=>TLES%X_LES_SUBGRID_W2 + CASE('X_LES_SUBGRID_Thl2') + CALL LES_ALLOCATE_DIM(TLES%X_LES_SUBGRID_Thl2,NDIMS) + X_LES_SUBGRID_Thl2=>TLES%X_LES_SUBGRID_Thl2 + CASE('X_LES_SUBGRID_Rt2') + CALL LES_ALLOCATE_DIM(TLES%X_LES_SUBGRID_Rt2,NDIMS) + X_LES_SUBGRID_Rt2=>TLES%X_LES_SUBGRID_Rt2 + CASE('X_LES_SUBGRID_Rc2') + CALL LES_ALLOCATE_DIM(TLES%X_LES_SUBGRID_Rc2,NDIMS) + X_LES_SUBGRID_Rc2=>TLES%X_LES_SUBGRID_Rc2 + CASE('X_LES_SUBGRID_Ri2') + CALL LES_ALLOCATE_DIM(TLES%X_LES_SUBGRID_Ri2,NDIMS) + X_LES_SUBGRID_Ri2=>TLES%X_LES_SUBGRID_Ri2 + CASE('X_LES_SUBGRID_ThlRt') + CALL LES_ALLOCATE_DIM(TLES%X_LES_SUBGRID_ThlRt,NDIMS) + X_LES_SUBGRID_ThlRt=>TLES%X_LES_SUBGRID_ThlRt + CASE('X_LES_SUBGRID_Sv2') + CALL LES_ALLOCATE_DIM(TLES%X_LES_SUBGRID_Sv2,NDIMS) + X_LES_SUBGRID_Sv2=>TLES%X_LES_SUBGRID_Sv2 + CASE('X_LES_SUBGRID_UV') + CALL LES_ALLOCATE_DIM(TLES%X_LES_SUBGRID_UV,NDIMS) + X_LES_SUBGRID_UV=>TLES%X_LES_SUBGRID_UV + CASE('X_LES_SUBGRID_WU') + CALL LES_ALLOCATE_DIM(TLES%X_LES_SUBGRID_WU,NDIMS) + X_LES_SUBGRID_WU=>TLES%X_LES_SUBGRID_WU + CASE('X_LES_SUBGRID_WV') + CALL LES_ALLOCATE_DIM(TLES%X_LES_SUBGRID_WV,NDIMS) + X_LES_SUBGRID_WV=>TLES%X_LES_SUBGRID_WV + CASE('X_LES_SUBGRID_UThl') + CALL LES_ALLOCATE_DIM(TLES%X_LES_SUBGRID_UThl,NDIMS) + X_LES_SUBGRID_UThl=>TLES%X_LES_SUBGRID_UThl + CASE('X_LES_SUBGRID_VThl') + CALL LES_ALLOCATE_DIM(TLES%X_LES_SUBGRID_VThl,NDIMS) + X_LES_SUBGRID_VThl=>TLES%X_LES_SUBGRID_VThl + CASE('X_LES_SUBGRID_WThl') + CALL LES_ALLOCATE_DIM(TLES%X_LES_SUBGRID_WThl,NDIMS) + X_LES_SUBGRID_WThl=>TLES%X_LES_SUBGRID_WThl + CASE('X_LES_SUBGRID_URt') + CALL LES_ALLOCATE_DIM(TLES%X_LES_SUBGRID_URt,NDIMS) + X_LES_SUBGRID_URt=>TLES%X_LES_SUBGRID_URt + CASE('X_LES_SUBGRID_VRt') + CALL LES_ALLOCATE_DIM(TLES%X_LES_SUBGRID_VRt,NDIMS) + X_LES_SUBGRID_VRt=>TLES%X_LES_SUBGRID_VRt + CASE('X_LES_SUBGRID_WRt') + CALL LES_ALLOCATE_DIM(TLES%X_LES_SUBGRID_WRt,NDIMS) + X_LES_SUBGRID_WRt=>TLES%X_LES_SUBGRID_WRt + CASE('X_LES_SUBGRID_URc') + CALL LES_ALLOCATE_DIM(TLES%X_LES_SUBGRID_URc,NDIMS) + X_LES_SUBGRID_URc=>TLES%X_LES_SUBGRID_URc + CASE('X_LES_SUBGRID_VRc') + CALL LES_ALLOCATE_DIM(TLES%X_LES_SUBGRID_VRc,NDIMS) + X_LES_SUBGRID_VRc=>TLES%X_LES_SUBGRID_VRc + CASE('X_LES_SUBGRID_WRc') + CALL LES_ALLOCATE_DIM(TLES%X_LES_SUBGRID_WRc,NDIMS) + X_LES_SUBGRID_WRc=>TLES%X_LES_SUBGRID_WRc + CASE('X_LES_SUBGRID_USv') + CALL LES_ALLOCATE_DIM(TLES%X_LES_SUBGRID_USv,NDIMS) + X_LES_SUBGRID_USv=>TLES%X_LES_SUBGRID_USv + CASE('X_LES_SUBGRID_VSv') + CALL LES_ALLOCATE_DIM(TLES%X_LES_SUBGRID_VSv,NDIMS) + X_LES_SUBGRID_VSv=>TLES%X_LES_SUBGRID_VSv + CASE('X_LES_SUBGRID_WSv') + CALL LES_ALLOCATE_DIM(TLES%X_LES_SUBGRID_WSv,NDIMS) + X_LES_SUBGRID_WSv=>TLES%X_LES_SUBGRID_WSv + CASE('X_LES_SUBGRID_UTke') + CALL LES_ALLOCATE_DIM(TLES%X_LES_SUBGRID_UTke,NDIMS) + X_LES_SUBGRID_UTke=>TLES%X_LES_SUBGRID_UTke + CASE('X_LES_SUBGRID_VTke') + CALL LES_ALLOCATE_DIM(TLES%X_LES_SUBGRID_VTke,NDIMS) + X_LES_SUBGRID_VTke=>TLES%X_LES_SUBGRID_VTke + CASE('X_LES_SUBGRID_WTke') + CALL LES_ALLOCATE_DIM(TLES%X_LES_SUBGRID_WTke,NDIMS) + X_LES_SUBGRID_WTke=>TLES%X_LES_SUBGRID_WTke + CASE('X_LES_SUBGRID_ddz_WTke') + CALL LES_ALLOCATE_DIM(TLES%X_LES_SUBGRID_ddz_WTke,NDIMS) + X_LES_SUBGRID_ddz_WTke=>TLES%X_LES_SUBGRID_ddz_WTke + CASE('X_LES_SUBGRID_WThv') + CALL LES_ALLOCATE_DIM(TLES%X_LES_SUBGRID_WThv,NDIMS) + X_LES_SUBGRID_WThv=>TLES%X_LES_SUBGRID_WThv + CASE('X_LES_SUBGRID_ThlThv') + CALL LES_ALLOCATE_DIM(TLES%X_LES_SUBGRID_ThlThv,NDIMS) + X_LES_SUBGRID_ThlThv=>TLES%X_LES_SUBGRID_ThlThv + CASE('X_LES_SUBGRID_RtThv') + CALL LES_ALLOCATE_DIM(TLES%X_LES_SUBGRID_RtThv,NDIMS) + X_LES_SUBGRID_RtThv=>TLES%X_LES_SUBGRID_RtThv + CASE('X_LES_SUBGRID_SvThv') + CALL LES_ALLOCATE_DIM(TLES%X_LES_SUBGRID_SvThv,NDIMS) + X_LES_SUBGRID_SvThv=>TLES%X_LES_SUBGRID_SvThv + CASE('X_LES_SUBGRID_W2Thl') + CALL LES_ALLOCATE_DIM(TLES%X_LES_SUBGRID_W2Thl,NDIMS) + X_LES_SUBGRID_W2Thl=>TLES%X_LES_SUBGRID_W2Thl + CASE('X_LES_SUBGRID_W2Rt') + CALL LES_ALLOCATE_DIM(TLES%X_LES_SUBGRID_W2Rt,NDIMS) + X_LES_SUBGRID_W2Rt=>TLES%X_LES_SUBGRID_W2Rt + CASE('X_LES_SUBGRID_W2Sv') + CALL LES_ALLOCATE_DIM(TLES%X_LES_SUBGRID_W2Sv,NDIMS) + X_LES_SUBGRID_W2Sv=>TLES%X_LES_SUBGRID_W2Sv + CASE('X_LES_SUBGRID_WThlRt') + CALL LES_ALLOCATE_DIM(TLES%X_LES_SUBGRID_WThlRt,NDIMS) + X_LES_SUBGRID_WThlRt=>TLES%X_LES_SUBGRID_WThlRt + CASE('X_LES_SUBGRID_WThl2') + CALL LES_ALLOCATE_DIM(TLES%X_LES_SUBGRID_WThl2,NDIMS) + X_LES_SUBGRID_WThl2=>TLES%X_LES_SUBGRID_WThl2 + CASE('X_LES_SUBGRID_WRt2') + CALL LES_ALLOCATE_DIM(TLES%X_LES_SUBGRID_WRt2,NDIMS) + X_LES_SUBGRID_WRt2=>TLES%X_LES_SUBGRID_WRt2 + CASE('X_LES_SUBGRID_WSv2') + CALL LES_ALLOCATE_DIM(TLES%X_LES_SUBGRID_WSv2,NDIMS) + X_LES_SUBGRID_WSv2=>TLES%X_LES_SUBGRID_WSv2 + CASE('X_LES_SUBGRID_DISS_Tke') + CALL LES_ALLOCATE_DIM(TLES%X_LES_SUBGRID_DISS_Tke,NDIMS) + X_LES_SUBGRID_DISS_Tke=>TLES%X_LES_SUBGRID_DISS_Tke + CASE('X_LES_SUBGRID_DISS_Thl2') + CALL LES_ALLOCATE_DIM(TLES%X_LES_SUBGRID_DISS_Thl2,NDIMS) + X_LES_SUBGRID_DISS_Thl2=>TLES%X_LES_SUBGRID_DISS_Thl2 + CASE('X_LES_SUBGRID_DISS_Rt2') + CALL LES_ALLOCATE_DIM(TLES%X_LES_SUBGRID_DISS_Rt2,NDIMS) + X_LES_SUBGRID_DISS_Rt2=>TLES%X_LES_SUBGRID_DISS_Rt2 + CASE('X_LES_SUBGRID_DISS_ThlRt') + CALL LES_ALLOCATE_DIM(TLES%X_LES_SUBGRID_DISS_ThlRt,NDIMS) + X_LES_SUBGRID_DISS_ThlRt=>TLES%X_LES_SUBGRID_DISS_ThlRt + CASE('X_LES_SUBGRID_DISS_Sv2') + CALL LES_ALLOCATE_DIM(TLES%X_LES_SUBGRID_DISS_Sv2,NDIMS) + X_LES_SUBGRID_DISS_Sv2=>TLES%X_LES_SUBGRID_DISS_Sv2 + CASE('X_LES_SUBGRID_WP') + CALL LES_ALLOCATE_DIM(TLES%X_LES_SUBGRID_WP,NDIMS) + X_LES_SUBGRID_WP=>TLES%X_LES_SUBGRID_WP + CASE('X_LES_SUBGRID_ThlPz') + CALL LES_ALLOCATE_DIM(TLES%X_LES_SUBGRID_ThlPz,NDIMS) + X_LES_SUBGRID_ThlPz=>TLES%X_LES_SUBGRID_ThlPz + CASE('X_LES_SUBGRID_RtPz') + CALL LES_ALLOCATE_DIM(TLES%X_LES_SUBGRID_RtPz,NDIMS) + X_LES_SUBGRID_RtPz=>TLES%X_LES_SUBGRID_RtPz + CASE('X_LES_SUBGRID_SvPz') + CALL LES_ALLOCATE_DIM(TLES%X_LES_SUBGRID_SvPz,NDIMS) + X_LES_SUBGRID_SvPz=>TLES%X_LES_SUBGRID_SvPz + CASE('X_LES_SUBGRID_PHI3') + CALL LES_ALLOCATE_DIM(TLES%X_LES_SUBGRID_PHI3,NDIMS) + X_LES_SUBGRID_PHI3=>TLES%X_LES_SUBGRID_PHI3 + CASE('X_LES_SUBGRID_PSI3') + CALL LES_ALLOCATE_DIM(TLES%X_LES_SUBGRID_PSI3,NDIMS) + X_LES_SUBGRID_PSI3=>TLES%X_LES_SUBGRID_PSI3 + CASE('X_LES_SUBGRID_LMix') + CALL LES_ALLOCATE_DIM(TLES%X_LES_SUBGRID_LMix,NDIMS) + X_LES_SUBGRID_LMix=>TLES%X_LES_SUBGRID_LMix + CASE('X_LES_SUBGRID_LDiss') + CALL LES_ALLOCATE_DIM(TLES%X_LES_SUBGRID_LDiss,NDIMS) + X_LES_SUBGRID_LDiss=>TLES%X_LES_SUBGRID_LDiss + CASE('X_LES_SUBGRID_Km') + CALL LES_ALLOCATE_DIM(TLES%X_LES_SUBGRID_Km,NDIMS) + X_LES_SUBGRID_Km=>TLES%X_LES_SUBGRID_Km + CASE('X_LES_SUBGRID_Kh') + CALL LES_ALLOCATE_DIM(TLES%X_LES_SUBGRID_Kh,NDIMS) + X_LES_SUBGRID_Kh=>TLES%X_LES_SUBGRID_Kh + CASE('X_LES_SUBGRID_THLUP_MF') + CALL LES_ALLOCATE_DIM(TLES%X_LES_SUBGRID_THLUP_MF,NDIMS) + X_LES_SUBGRID_THLUP_MF=>TLES%X_LES_SUBGRID_THLUP_MF + CASE('X_LES_SUBGRID_RTUP_MF') + CALL LES_ALLOCATE_DIM(TLES%X_LES_SUBGRID_RTUP_MF,NDIMS) + X_LES_SUBGRID_RTUP_MF=>TLES%X_LES_SUBGRID_RTUP_MF + CASE('X_LES_SUBGRID_RVUP_MF') + CALL LES_ALLOCATE_DIM(TLES%X_LES_SUBGRID_RVUP_MF,NDIMS) + X_LES_SUBGRID_RVUP_MF=>TLES%X_LES_SUBGRID_RVUP_MF + CASE('X_LES_SUBGRID_RCUP_MF') + CALL LES_ALLOCATE_DIM(TLES%X_LES_SUBGRID_RCUP_MF,NDIMS) + X_LES_SUBGRID_RCUP_MF=>TLES%X_LES_SUBGRID_RCUP_MF + CASE('X_LES_SUBGRID_RIUP_MF') + CALL LES_ALLOCATE_DIM(TLES%X_LES_SUBGRID_RIUP_MF,NDIMS) + X_LES_SUBGRID_RIUP_MF=>TLES%X_LES_SUBGRID_RIUP_MF + CASE('X_LES_SUBGRID_WUP_MF') + CALL LES_ALLOCATE_DIM(TLES%X_LES_SUBGRID_WUP_MF,NDIMS) + X_LES_SUBGRID_WUP_MF=>TLES%X_LES_SUBGRID_WUP_MF + CASE('X_LES_SUBGRID_MASSFLUX') + CALL LES_ALLOCATE_DIM(TLES%X_LES_SUBGRID_MASSFLUX,NDIMS) + X_LES_SUBGRID_MASSFLUX=>TLES%X_LES_SUBGRID_MASSFLUX + CASE('X_LES_SUBGRID_DETR') + CALL LES_ALLOCATE_DIM(TLES%X_LES_SUBGRID_DETR,NDIMS) + X_LES_SUBGRID_DETR=>TLES%X_LES_SUBGRID_DETR + CASE('X_LES_SUBGRID_ENTR') + CALL LES_ALLOCATE_DIM(TLES%X_LES_SUBGRID_ENTR,NDIMS) + X_LES_SUBGRID_ENTR=>TLES%X_LES_SUBGRID_ENTR + CASE('X_LES_SUBGRID_FRACUP') + CALL LES_ALLOCATE_DIM(TLES%X_LES_SUBGRID_FRACUP,NDIMS) + X_LES_SUBGRID_FRACUP=>TLES%X_LES_SUBGRID_FRACUP + CASE('X_LES_SUBGRID_THVUP_MF') + CALL LES_ALLOCATE_DIM(TLES%X_LES_SUBGRID_THVUP_MF,NDIMS) + X_LES_SUBGRID_THVUP_MF=>TLES%X_LES_SUBGRID_THVUP_MF + CASE('X_LES_SUBGRID_WTHLMF') + CALL LES_ALLOCATE_DIM(TLES%X_LES_SUBGRID_WTHLMF,NDIMS) + X_LES_SUBGRID_WTHLMF=>TLES%X_LES_SUBGRID_WTHLMF + CASE('X_LES_SUBGRID_WRTMF') + CALL LES_ALLOCATE_DIM(TLES%X_LES_SUBGRID_WRTMF,NDIMS) + X_LES_SUBGRID_WRTMF=>TLES%X_LES_SUBGRID_WRTMF + CASE('X_LES_SUBGRID_WTHVMF') + CALL LES_ALLOCATE_DIM(TLES%X_LES_SUBGRID_WTHVMF,NDIMS) + X_LES_SUBGRID_WTHVMF=>TLES%X_LES_SUBGRID_WTHVMF + CASE('X_LES_SUBGRID_WUMF') + CALL LES_ALLOCATE_DIM(TLES%X_LES_SUBGRID_WUMF,NDIMS) + X_LES_SUBGRID_WUMF=>TLES%X_LES_SUBGRID_WUMF + CASE('X_LES_SUBGRID_WVMF') + CALL LES_ALLOCATE_DIM(TLES%X_LES_SUBGRID_WVMF,NDIMS) + X_LES_SUBGRID_WVMF=>TLES%X_LES_SUBGRID_WVMF + CASE('X_LES_USTAR') + CALL LES_ALLOCATE_DIM(TLES%X_LES_USTAR,NDIMS) + X_LES_USTAR=>TLES%X_LES_USTAR + CASE('X_LES_UW0') + CALL LES_ALLOCATE_DIM(TLES%X_LES_UW0,NDIMS) + X_LES_UW0=>TLES%X_LES_UW0 + CASE('X_LES_VW0') + CALL LES_ALLOCATE_DIM(TLES%X_LES_VW0,NDIMS) + X_LES_VW0=>TLES%X_LES_VW0 + CASE('X_LES_Q0') + CALL LES_ALLOCATE_DIM(TLES%X_LES_Q0,NDIMS) + X_LES_Q0=>TLES%X_LES_Q0 + CASE('X_LES_E0') + CALL LES_ALLOCATE_DIM(TLES%X_LES_E0,NDIMS) + X_LES_E0=>TLES%X_LES_E0 + CASE('X_LES_SV0') + CALL LES_ALLOCATE_DIM(TLES%X_LES_SV0,NDIMS) + X_LES_SV0=>TLES%X_LES_SV0 + CASE('XLES_PDF_RV') + CALL LES_ALLOCATE_DIM(TLES%XLES_PDF_RV,NDIMS) + XLES_PDF_RV=>TLES%XLES_PDF_RV + CASE('XLES_PDF_TH') + CALL LES_ALLOCATE_DIM(TLES%XLES_PDF_TH,NDIMS) + XLES_PDF_TH=>TLES%XLES_PDF_TH + CASE('XLES_PDF_W') + CALL LES_ALLOCATE_DIM(TLES%XLES_PDF_W,NDIMS) + XLES_PDF_W=>TLES%XLES_PDF_W + CASE('XLES_PDF_THV') + CALL LES_ALLOCATE_DIM(TLES%XLES_PDF_THV,NDIMS) + XLES_PDF_THV=>TLES%XLES_PDF_THV + CASE('XLES_PDF_RC') + CALL LES_ALLOCATE_DIM(TLES%XLES_PDF_RC,NDIMS) + XLES_PDF_RC=>TLES%XLES_PDF_RC + CASE('XLES_PDF_RR') + CALL LES_ALLOCATE_DIM(TLES%XLES_PDF_RR,NDIMS) + XLES_PDF_RR=>TLES%XLES_PDF_RR + CASE('XLES_PDF_RI') + CALL LES_ALLOCATE_DIM(TLES%XLES_PDF_RI,NDIMS) + XLES_PDF_RI=>TLES%XLES_PDF_RI + CASE('XLES_PDF_RS') + CALL LES_ALLOCATE_DIM(TLES%XLES_PDF_RS,NDIMS) + XLES_PDF_RS=>TLES%XLES_PDF_RS + CASE('XLES_PDF_RG') + CALL LES_ALLOCATE_DIM(TLES%XLES_PDF_RG,NDIMS) + XLES_PDF_RG=>TLES%XLES_PDF_RG + CASE('XLES_PDF_RT') + CALL LES_ALLOCATE_DIM(TLES%XLES_PDF_RT,NDIMS) + XLES_PDF_RT=>TLES%XLES_PDF_RT + CASE('XLES_PDF_THL') + CALL LES_ALLOCATE_DIM(TLES%XLES_PDF_THL,NDIMS) + XLES_PDF_THL=>TLES%XLES_PDF_THL + END SELECT + ! +END SUBROUTINE LES_ALLOCATE +! +SUBROUTINE LES_DEALLOCATE(HNAME) + IMPLICIT NONE + CHARACTER(LEN=*), INTENT(IN) :: HNAME +! + SELECT CASE(HNAME) + CASE('LLES_CURRENT_CART_MASK') + LLES_CURRENT_CART_MASK=>NULL() + DEALLOCATE(TLES%LLES_CURRENT_CART_MASK) + CASE('LLES_CURRENT_NEB_MASK') + LLES_CURRENT_NEB_MASK=>NULL() + DEALLOCATE(TLES%LLES_CURRENT_NEB_MASK) + CASE('LLES_CURRENT_CORE_MASK') + LLES_CURRENT_CORE_MASK=>NULL() + DEALLOCATE(TLES%LLES_CURRENT_CORE_MASK) + CASE('LLES_CURRENT_MY_MASKS') + LLES_CURRENT_MY_MASKS=>NULL() + DEALLOCATE(TLES%LLES_CURRENT_MY_MASKS) + CASE('LLES_CURRENT_CS1_MASK') + LLES_CURRENT_CS1_MASK=>NULL() + DEALLOCATE(TLES%LLES_CURRENT_CS1_MASK) + CASE('LLES_CURRENT_CS2_MASK') + LLES_CURRENT_CS2_MASK=>NULL() + DEALLOCATE(TLES%LLES_CURRENT_CS2_MASK) + CASE('LLES_CURRENT_CS3_MASK') + LLES_CURRENT_CS3_MASK=>NULL() + DEALLOCATE(TLES%LLES_CURRENT_CS3_MASK) + CASE('XLES_CURRENT_Z') + XLES_CURRENT_Z=>NULL() + DEALLOCATE(TLES%XLES_CURRENT_Z) + CASE('NKLIN_CURRENT_LES') + NKLIN_CURRENT_LES=>NULL() + DEALLOCATE(TLES%NKLIN_CURRENT_LES) + CASE('XCOEFLIN_CURRENT_LES') + XCOEFLIN_CURRENT_LES=>NULL() + DEALLOCATE(TLES%XCOEFLIN_CURRENT_LES) + CASE('NKLIN_CURRENT_SPEC') + NKLIN_CURRENT_SPEC=>NULL() + DEALLOCATE(TLES%NKLIN_CURRENT_SPEC) + CASE('XCOEFLIN_CURRENT_SPEC') + XCOEFLIN_CURRENT_SPEC=>NULL() + DEALLOCATE(TLES%XCOEFLIN_CURRENT_SPEC) + CASE('XLES_NORM_M') + XLES_NORM_M=>NULL() + DEALLOCATE(TLES%XLES_NORM_M) + CASE('XLES_NORM_K') + XLES_NORM_K=>NULL() + DEALLOCATE(TLES%XLES_NORM_K) + CASE('XLES_NORM_S') + XLES_NORM_S=>NULL() + DEALLOCATE(TLES%XLES_NORM_S) + CASE('XLES_NORM_RHO') + XLES_NORM_RHO=>NULL() + DEALLOCATE(TLES%XLES_NORM_RHO) + CASE('XLES_NORM_RV') + XLES_NORM_RV=>NULL() + DEALLOCATE(TLES%XLES_NORM_RV) + CASE('XLES_NORM_SV') + XLES_NORM_SV=>NULL() + DEALLOCATE(TLES%XLES_NORM_SV) + CASE('XLES_NORM_P') + XLES_NORM_P=>NULL() + DEALLOCATE(TLES%XLES_NORM_P) + CASE('X_LES_RES_W_SBG_WThl') + X_LES_RES_W_SBG_WThl=>NULL() + DEALLOCATE(TLES%X_LES_RES_W_SBG_WThl) + CASE('X_LES_RES_W_SBG_WRt') + X_LES_RES_W_SBG_WRt=>NULL() + DEALLOCATE(TLES%X_LES_RES_W_SBG_WRt) + CASE('X_LES_RES_W_SBG_Thl2') + X_LES_RES_W_SBG_Thl2=>NULL() + DEALLOCATE(TLES%X_LES_RES_W_SBG_Thl2) + CASE('X_LES_RES_W_SBG_Rt2') + X_LES_RES_W_SBG_Rt2=>NULL() + DEALLOCATE(TLES%X_LES_RES_W_SBG_Rt2) + CASE('X_LES_RES_W_SBG_ThlRt') + X_LES_RES_W_SBG_ThlRt=>NULL() + DEALLOCATE(TLES%X_LES_RES_W_SBG_ThlRt) + CASE('X_LES_RES_W_SBG_WSv') + X_LES_RES_W_SBG_WSv=>NULL() + DEALLOCATE(TLES%X_LES_RES_W_SBG_WSv) + CASE('X_LES_RES_W_SBG_Sv2') + X_LES_RES_W_SBG_Sv2=>NULL() + DEALLOCATE(TLES%X_LES_RES_W_SBG_Sv2) + CASE('XLES_SUBGRID_RCSIGS') + XLES_SUBGRID_RCSIGS=>NULL() + DEALLOCATE(TLES%XLES_SUBGRID_RCSIGS) + CASE('XLES_SUBGRID_RCSIGC') + XLES_SUBGRID_RCSIGC=>NULL() + DEALLOCATE(TLES%XLES_SUBGRID_RCSIGC) + CASE('X_LES_RES_ddxa_U_SBG_UaU') + X_LES_RES_ddxa_U_SBG_UaU=>NULL() + DEALLOCATE(TLES%X_LES_RES_ddxa_U_SBG_UaU) + CASE('X_LES_RES_ddxa_V_SBG_UaV') + X_LES_RES_ddxa_V_SBG_UaV=>NULL() + DEALLOCATE(TLES%X_LES_RES_ddxa_V_SBG_UaV) + CASE('X_LES_RES_ddxa_W_SBG_UaW') + X_LES_RES_ddxa_W_SBG_UaW=>NULL() + DEALLOCATE(TLES%X_LES_RES_ddxa_W_SBG_UaW) + CASE('X_LES_RES_ddxa_W_SBG_UaThl') + X_LES_RES_ddxa_W_SBG_UaThl=>NULL() + DEALLOCATE(TLES%X_LES_RES_ddxa_W_SBG_UaThl) + CASE('X_LES_RES_ddxa_Thl_SBG_UaW') + X_LES_RES_ddxa_Thl_SBG_UaW=>NULL() + DEALLOCATE(TLES%X_LES_RES_ddxa_Thl_SBG_UaW) + CASE('X_LES_RES_ddz_Thl_SBG_W2') + X_LES_RES_ddz_Thl_SBG_W2=>NULL() + DEALLOCATE(TLES%X_LES_RES_ddz_Thl_SBG_W2) + CASE('X_LES_RES_ddxa_W_SBG_UaRt') + X_LES_RES_ddxa_W_SBG_UaRt=>NULL() + DEALLOCATE(TLES%X_LES_RES_ddxa_W_SBG_UaRt) + CASE('X_LES_RES_ddxa_Rt_SBG_UaW') + X_LES_RES_ddxa_Rt_SBG_UaW=>NULL() + DEALLOCATE(TLES%X_LES_RES_ddxa_Rt_SBG_UaW) + CASE('X_LES_RES_ddz_Rt_SBG_W2') + X_LES_RES_ddz_Rt_SBG_W2=>NULL() + DEALLOCATE(TLES%X_LES_RES_ddz_Rt_SBG_W2) + CASE('X_LES_RES_ddxa_Thl_SBG_UaRt') + X_LES_RES_ddxa_Thl_SBG_UaRt=>NULL() + DEALLOCATE(TLES%X_LES_RES_ddxa_Thl_SBG_UaRt) + CASE('X_LES_RES_ddxa_Rt_SBG_UaThl') + X_LES_RES_ddxa_Rt_SBG_UaThl=>NULL() + DEALLOCATE(TLES%X_LES_RES_ddxa_Rt_SBG_UaThl) + CASE('X_LES_RES_ddxa_Thl_SBG_UaThl') + X_LES_RES_ddxa_Thl_SBG_UaThl=>NULL() + DEALLOCATE(TLES%X_LES_RES_ddxa_Thl_SBG_UaThl) + CASE('X_LES_RES_ddxa_Rt_SBG_UaRt') + X_LES_RES_ddxa_Rt_SBG_UaRt=>NULL() + DEALLOCATE(TLES%X_LES_RES_ddxa_Rt_SBG_UaRt) + CASE('X_LES_RES_ddxa_W_SBG_UaSv') + X_LES_RES_ddxa_W_SBG_UaSv=>NULL() + DEALLOCATE(TLES%X_LES_RES_ddxa_W_SBG_UaSv) + CASE('X_LES_RES_ddxa_Sv_SBG_UaW') + X_LES_RES_ddxa_Sv_SBG_UaW=>NULL() + DEALLOCATE(TLES%X_LES_RES_ddxa_Sv_SBG_UaW) + CASE('X_LES_RES_ddz_Sv_SBG_W2') + X_LES_RES_ddz_Sv_SBG_W2=>NULL() + DEALLOCATE(TLES%X_LES_RES_ddz_Sv_SBG_W2) + CASE('X_LES_RES_ddxa_Sv_SBG_UaSv') + X_LES_RES_ddxa_Sv_SBG_UaSv=>NULL() + DEALLOCATE(TLES%X_LES_RES_ddxa_Sv_SBG_UaSv) + CASE('X_LES_SUBGRID_U2') + X_LES_SUBGRID_U2=>NULL() + DEALLOCATE(TLES%X_LES_SUBGRID_U2) + CASE('X_LES_SUBGRID_V2') + X_LES_SUBGRID_V2=>NULL() + DEALLOCATE(TLES%X_LES_SUBGRID_V2) + CASE('X_LES_SUBGRID_W2') + X_LES_SUBGRID_W2=>NULL() + DEALLOCATE(TLES%X_LES_SUBGRID_W2) + CASE('X_LES_SUBGRID_Thl2') + X_LES_SUBGRID_Thl2=>NULL() + DEALLOCATE(TLES%X_LES_SUBGRID_Thl2) + CASE('X_LES_SUBGRID_Rt2') + X_LES_SUBGRID_Rt2=>NULL() + DEALLOCATE(TLES%X_LES_SUBGRID_Rt2) + CASE('X_LES_SUBGRID_Rc2') + X_LES_SUBGRID_Rc2=>NULL() + DEALLOCATE(TLES%X_LES_SUBGRID_Rc2) + CASE('X_LES_SUBGRID_Ri2') + X_LES_SUBGRID_Ri2=>NULL() + DEALLOCATE(TLES%X_LES_SUBGRID_Ri2) + CASE('X_LES_SUBGRID_ThlRt') + X_LES_SUBGRID_ThlRt=>NULL() + DEALLOCATE(TLES%X_LES_SUBGRID_ThlRt) + CASE('X_LES_SUBGRID_Sv2') + X_LES_SUBGRID_Sv2=>NULL() + DEALLOCATE(TLES%X_LES_SUBGRID_Sv2) + CASE('X_LES_SUBGRID_UV') + X_LES_SUBGRID_UV=>NULL() + DEALLOCATE(TLES%X_LES_SUBGRID_UV) + CASE('X_LES_SUBGRID_WU') + X_LES_SUBGRID_WU=>NULL() + DEALLOCATE(TLES%X_LES_SUBGRID_WU) + CASE('X_LES_SUBGRID_WV') + X_LES_SUBGRID_WV=>NULL() + DEALLOCATE(TLES%X_LES_SUBGRID_WV) + CASE('X_LES_SUBGRID_UThl') + X_LES_SUBGRID_UThl=>NULL() + DEALLOCATE(TLES%X_LES_SUBGRID_UThl) + CASE('X_LES_SUBGRID_VThl') + X_LES_SUBGRID_VThl=>NULL() + DEALLOCATE(TLES%X_LES_SUBGRID_VThl) + CASE('X_LES_SUBGRID_WThl') + X_LES_SUBGRID_WThl=>NULL() + DEALLOCATE(TLES%X_LES_SUBGRID_WThl) + CASE('X_LES_SUBGRID_URt') + X_LES_SUBGRID_URt=>NULL() + DEALLOCATE(TLES%X_LES_SUBGRID_URt) + CASE('X_LES_SUBGRID_VRt') + X_LES_SUBGRID_VRt=>NULL() + DEALLOCATE(TLES%X_LES_SUBGRID_VRt) + CASE('X_LES_SUBGRID_WRt') + X_LES_SUBGRID_WRt=>NULL() + DEALLOCATE(TLES%X_LES_SUBGRID_WRt) + CASE('X_LES_SUBGRID_URc') + X_LES_SUBGRID_URc=>NULL() + DEALLOCATE(TLES%X_LES_SUBGRID_URc) + CASE('X_LES_SUBGRID_VRc') + X_LES_SUBGRID_VRc=>NULL() + DEALLOCATE(TLES%X_LES_SUBGRID_VRc) + CASE('X_LES_SUBGRID_WRc') + X_LES_SUBGRID_WRc=>NULL() + DEALLOCATE(TLES%X_LES_SUBGRID_WRc) + CASE('X_LES_SUBGRID_USv') + X_LES_SUBGRID_USv=>NULL() + DEALLOCATE(TLES%X_LES_SUBGRID_USv) + CASE('X_LES_SUBGRID_VSv') + X_LES_SUBGRID_VSv=>NULL() + DEALLOCATE(TLES%X_LES_SUBGRID_VSv) + CASE('X_LES_SUBGRID_WSv') + X_LES_SUBGRID_WSv=>NULL() + DEALLOCATE(TLES%X_LES_SUBGRID_WSv) + CASE('X_LES_SUBGRID_UTke') + X_LES_SUBGRID_UTke=>NULL() + DEALLOCATE(TLES%X_LES_SUBGRID_UTke) + CASE('X_LES_SUBGRID_VTke') + X_LES_SUBGRID_VTke=>NULL() + DEALLOCATE(TLES%X_LES_SUBGRID_VTke) + CASE('X_LES_SUBGRID_WTke') + X_LES_SUBGRID_WTke=>NULL() + DEALLOCATE(TLES%X_LES_SUBGRID_WTke) + CASE('X_LES_SUBGRID_ddz_WTke') + X_LES_SUBGRID_ddz_WTke=>NULL() + DEALLOCATE(TLES%X_LES_SUBGRID_ddz_WTke) + CASE('X_LES_SUBGRID_WThv') + X_LES_SUBGRID_WThv=>NULL() + DEALLOCATE(TLES%X_LES_SUBGRID_WThv) + CASE('X_LES_SUBGRID_ThlThv') + X_LES_SUBGRID_ThlThv=>NULL() + DEALLOCATE(TLES%X_LES_SUBGRID_ThlThv) + CASE('X_LES_SUBGRID_RtThv') + X_LES_SUBGRID_RtThv=>NULL() + DEALLOCATE(TLES%X_LES_SUBGRID_RtThv) + CASE('X_LES_SUBGRID_SvThv') + X_LES_SUBGRID_SvThv=>NULL() + DEALLOCATE(TLES%X_LES_SUBGRID_SvThv) + CASE('X_LES_SUBGRID_W2Thl') + X_LES_SUBGRID_W2Thl=>NULL() + DEALLOCATE(TLES%X_LES_SUBGRID_W2Thl) + CASE('X_LES_SUBGRID_W2Rt') + X_LES_SUBGRID_W2Rt=>NULL() + DEALLOCATE(TLES%X_LES_SUBGRID_W2Rt) + CASE('X_LES_SUBGRID_W2Sv') + X_LES_SUBGRID_W2Sv=>NULL() + DEALLOCATE(TLES%X_LES_SUBGRID_W2Sv) + CASE('X_LES_SUBGRID_WThlRt') + X_LES_SUBGRID_WThlRt=>NULL() + DEALLOCATE(TLES%X_LES_SUBGRID_WThlRt) + CASE('X_LES_SUBGRID_WThl2') + X_LES_SUBGRID_WThl2=>NULL() + DEALLOCATE(TLES%X_LES_SUBGRID_WThl2) + CASE('X_LES_SUBGRID_WRt2') + X_LES_SUBGRID_WRt2=>NULL() + DEALLOCATE(TLES%X_LES_SUBGRID_WRt2) + CASE('X_LES_SUBGRID_WSv2') + X_LES_SUBGRID_WSv2=>NULL() + DEALLOCATE(TLES%X_LES_SUBGRID_WSv2) + CASE('X_LES_SUBGRID_DISS_Tke') + X_LES_SUBGRID_DISS_Tke=>NULL() + DEALLOCATE(TLES%X_LES_SUBGRID_DISS_Tke) + CASE('X_LES_SUBGRID_DISS_Thl2') + X_LES_SUBGRID_DISS_Thl2=>NULL() + DEALLOCATE(TLES%X_LES_SUBGRID_DISS_Thl2) + CASE('X_LES_SUBGRID_DISS_Rt2') + X_LES_SUBGRID_DISS_Rt2=>NULL() + DEALLOCATE(TLES%X_LES_SUBGRID_DISS_Rt2) + CASE('X_LES_SUBGRID_DISS_ThlRt') + X_LES_SUBGRID_DISS_ThlRt=>NULL() + DEALLOCATE(TLES%X_LES_SUBGRID_DISS_ThlRt) + CASE('X_LES_SUBGRID_DISS_Sv2') + X_LES_SUBGRID_DISS_Sv2=>NULL() + DEALLOCATE(TLES%X_LES_SUBGRID_DISS_Sv2) + CASE('X_LES_SUBGRID_WP') + X_LES_SUBGRID_WP=>NULL() + DEALLOCATE(TLES%X_LES_SUBGRID_WP) + CASE('X_LES_SUBGRID_ThlPz') + X_LES_SUBGRID_ThlPz=>NULL() + DEALLOCATE(TLES%X_LES_SUBGRID_ThlPz) + CASE('X_LES_SUBGRID_RtPz') + X_LES_SUBGRID_RtPz=>NULL() + DEALLOCATE(TLES%X_LES_SUBGRID_RtPz) + CASE('X_LES_SUBGRID_SvPz') + X_LES_SUBGRID_SvPz=>NULL() + DEALLOCATE(TLES%X_LES_SUBGRID_SvPz) + CASE('X_LES_SUBGRID_PHI3') + X_LES_SUBGRID_PHI3=>NULL() + DEALLOCATE(TLES%X_LES_SUBGRID_PHI3) + CASE('X_LES_SUBGRID_PSI3') + X_LES_SUBGRID_PSI3=>NULL() + DEALLOCATE(TLES%X_LES_SUBGRID_PSI3) + CASE('X_LES_SUBGRID_LMix') + X_LES_SUBGRID_LMix=>NULL() + DEALLOCATE(TLES%X_LES_SUBGRID_LMix) + CASE('X_LES_SUBGRID_LDiss') + X_LES_SUBGRID_LDiss=>NULL() + DEALLOCATE(TLES%X_LES_SUBGRID_LDiss) + CASE('X_LES_SUBGRID_Km') + X_LES_SUBGRID_Km=>NULL() + DEALLOCATE(TLES%X_LES_SUBGRID_Km) + CASE('X_LES_SUBGRID_Kh') + X_LES_SUBGRID_Kh=>NULL() + DEALLOCATE(TLES%X_LES_SUBGRID_Kh) + CASE('X_LES_SUBGRID_THLUP_MF') + X_LES_SUBGRID_THLUP_MF=>NULL() + DEALLOCATE(TLES%X_LES_SUBGRID_THLUP_MF) + CASE('X_LES_SUBGRID_RTUP_MF') + X_LES_SUBGRID_RTUP_MF=>NULL() + DEALLOCATE(TLES%X_LES_SUBGRID_RTUP_MF) + CASE('X_LES_SUBGRID_RVUP_MF') + X_LES_SUBGRID_RVUP_MF=>NULL() + DEALLOCATE(TLES%X_LES_SUBGRID_RVUP_MF) + CASE('X_LES_SUBGRID_RCUP_MF') + X_LES_SUBGRID_RCUP_MF=>NULL() + DEALLOCATE(TLES%X_LES_SUBGRID_RCUP_MF) + CASE('X_LES_SUBGRID_RIUP_MF') + X_LES_SUBGRID_RIUP_MF=>NULL() + DEALLOCATE(TLES%X_LES_SUBGRID_RIUP_MF) + CASE('X_LES_SUBGRID_WUP_MF') + X_LES_SUBGRID_WUP_MF=>NULL() + DEALLOCATE(TLES%X_LES_SUBGRID_WUP_MF) + CASE('X_LES_SUBGRID_MASSFLUX') + X_LES_SUBGRID_MASSFLUX=>NULL() + DEALLOCATE(TLES%X_LES_SUBGRID_MASSFLUX) + CASE('X_LES_SUBGRID_DETR') + X_LES_SUBGRID_DETR=>NULL() + DEALLOCATE(TLES%X_LES_SUBGRID_DETR) + CASE('X_LES_SUBGRID_ENTR') + X_LES_SUBGRID_ENTR=>NULL() + DEALLOCATE(TLES%X_LES_SUBGRID_ENTR) + CASE('X_LES_SUBGRID_FRACUP') + X_LES_SUBGRID_FRACUP=>NULL() + DEALLOCATE(TLES%X_LES_SUBGRID_FRACUP) + CASE('X_LES_SUBGRID_THVUP_MF') + X_LES_SUBGRID_THVUP_MF=>NULL() + DEALLOCATE(TLES%X_LES_SUBGRID_THVUP_MF) + CASE('X_LES_SUBGRID_WTHLMF') + X_LES_SUBGRID_WTHLMF=>NULL() + DEALLOCATE(TLES%X_LES_SUBGRID_WTHLMF) + CASE('X_LES_SUBGRID_WRTMF') + X_LES_SUBGRID_WRTMF=>NULL() + DEALLOCATE(TLES%X_LES_SUBGRID_WRTMF) + CASE('X_LES_SUBGRID_WTHVMF') + X_LES_SUBGRID_WTHVMF=>NULL() + DEALLOCATE(TLES%X_LES_SUBGRID_WTHVMF) + CASE('X_LES_SUBGRID_WUMF') + X_LES_SUBGRID_WUMF=>NULL() + DEALLOCATE(TLES%X_LES_SUBGRID_WUMF) + CASE('X_LES_SUBGRID_WVMF') + X_LES_SUBGRID_WVMF=>NULL() + DEALLOCATE(TLES%X_LES_SUBGRID_WVMF) + CASE('X_LES_USTAR') + X_LES_USTAR=>NULL() + DEALLOCATE(TLES%X_LES_USTAR) + CASE('X_LES_UW0') + X_LES_UW0=>NULL() + DEALLOCATE(TLES%X_LES_UW0) + CASE('X_LES_VW0') + X_LES_VW0=>NULL() + DEALLOCATE(TLES%X_LES_VW0) + CASE('X_LES_Q0') + X_LES_Q0=>NULL() + DEALLOCATE(TLES%X_LES_Q0) + CASE('X_LES_E0') + X_LES_E0=>NULL() + DEALLOCATE(TLES%X_LES_E0) + CASE('X_LES_SV0') + X_LES_SV0=>NULL() + DEALLOCATE(TLES%X_LES_SV0) + CASE('XLES_PDF_RV') + XLES_PDF_RV=>NULL() + DEALLOCATE(TLES%XLES_PDF_RV) + CASE('XLES_PDF_TH') + XLES_PDF_TH=>NULL() + DEALLOCATE(TLES%XLES_PDF_TH) + CASE('XLES_PDF_W') + XLES_PDF_W=>NULL() + DEALLOCATE(TLES%XLES_PDF_W) + CASE('XLES_PDF_THV') + XLES_PDF_THV=>NULL() + DEALLOCATE(TLES%XLES_PDF_THV) + CASE('XLES_PDF_RC') + XLES_PDF_RC=>NULL() + DEALLOCATE(TLES%XLES_PDF_RC) + CASE('XLES_PDF_RR') + XLES_PDF_RR=>NULL() + DEALLOCATE(TLES%XLES_PDF_RR) + CASE('XLES_PDF_RI') + XLES_PDF_RI=>NULL() + DEALLOCATE(TLES%XLES_PDF_RI) + CASE('XLES_PDF_RS') + XLES_PDF_RS=>NULL() + DEALLOCATE(TLES%XLES_PDF_RS) + CASE('XLES_PDF_RG') + XLES_PDF_RG=>NULL() + DEALLOCATE(TLES%XLES_PDF_RG) + CASE('XLES_PDF_RT') + XLES_PDF_RT=>NULL() + DEALLOCATE(TLES%XLES_PDF_RT) + CASE('XLES_PDF_THL') + XLES_PDF_THL=>NULL() + DEALLOCATE(TLES%XLES_PDF_THL) + END SELECT +END SUBROUTINE LES_DEALLOCATE +!! +!SUBROUTINE LES_INI_TIMESTEP_DEALLOCATE() +! IMPLICIT NONE +! XCOEFLIN_CURRENT_SPEC=>NULL() +! DEALLOCATE(TLES%XCOEFLIN_CURRENT_SPEC) +!END SUBROUTINE LES_INI_TIMESTEP_DEALLOCATE +! +SUBROUTINE LES_ALLOCATE_1DIMX(PVAR,KDIM) + IMPLICIT NONE + REAL, DIMENSION(:),ALLOCATABLE, INTENT(OUT) :: PVAR + INTEGER, DIMENSION(1), INTENT(IN) :: KDIM + ALLOCATE(PVAR(KDIM(1))) +END SUBROUTINE LES_ALLOCATE_1DIMX +! +SUBROUTINE LES_ALLOCATE_2DIMX(PVAR,KDIM) + IMPLICIT NONE + REAL, DIMENSION(:,:),ALLOCATABLE, INTENT(OUT) :: PVAR + INTEGER, DIMENSION(2), INTENT(IN) :: KDIM + ALLOCATE(PVAR(KDIM(1),KDIM(2))) +END SUBROUTINE LES_ALLOCATE_2DIMX +! +SUBROUTINE LES_ALLOCATE_3DIMX(PVAR,KDIM) + IMPLICIT NONE + REAL, DIMENSION(:,:,:),ALLOCATABLE, INTENT(OUT) :: PVAR + INTEGER, DIMENSION(3), INTENT(IN) :: KDIM + ALLOCATE(PVAR(KDIM(1),KDIM(2),KDIM(3))) +END SUBROUTINE LES_ALLOCATE_3DIMX +! +SUBROUTINE LES_ALLOCATE_4DIMX(PVAR,KDIM) + IMPLICIT NONE + REAL, DIMENSION(:,:,:,:),ALLOCATABLE, INTENT(OUT) :: PVAR + INTEGER, DIMENSION(4), INTENT(IN) :: KDIM + ALLOCATE(PVAR(KDIM(1),KDIM(2),KDIM(3),KDIM(4))) +END SUBROUTINE LES_ALLOCATE_4DIMX +! +SUBROUTINE LES_ALLOCATE_1DIMI(KVAR,KDIM) + IMPLICIT NONE + INTEGER, DIMENSION(:),ALLOCATABLE, INTENT(OUT) :: KVAR + INTEGER, DIMENSION(1), INTENT(IN) :: KDIM + ALLOCATE(KVAR(KDIM(1))) +END SUBROUTINE LES_ALLOCATE_1DIMI +! +SUBROUTINE LES_ALLOCATE_3DIMI(KVAR,KDIM) + IMPLICIT NONE + INTEGER, DIMENSION(:,:,:),ALLOCATABLE, INTENT(OUT) :: KVAR + INTEGER, DIMENSION(3), INTENT(IN) :: KDIM + ALLOCATE(KVAR(KDIM(1),KDIM(2),KDIM(3))) +END SUBROUTINE LES_ALLOCATE_3DIMI +! +SUBROUTINE LES_ALLOCATE_3DIML(OVAR,KDIM) + IMPLICIT NONE + LOGICAL, DIMENSION(:,:,:),ALLOCATABLE, INTENT(OUT) :: OVAR + INTEGER, DIMENSION(3), INTENT(IN) :: KDIM + ALLOCATE(OVAR(KDIM(1),KDIM(2),KDIM(3))) +END SUBROUTINE LES_ALLOCATE_3DIML +! +SUBROUTINE LES_ALLOCATE_4DIML(OVAR,KDIM) + IMPLICIT NONE + LOGICAL, DIMENSION(:,:,:,:),ALLOCATABLE, INTENT(OUT) :: OVAR + INTEGER, DIMENSION(4), INTENT(IN) :: KDIM + ALLOCATE(OVAR(KDIM(1),KDIM(2),KDIM(3),KDIM(4))) +END SUBROUTINE LES_ALLOCATE_4DIML +! +SUBROUTINE LES_ALLOCATE_2DIMC(HVAR,KDIM) + IMPLICIT NONE + LOGICAL, DIMENSION(:,:),ALLOCATABLE, INTENT(OUT) :: HVAR + INTEGER, DIMENSION(2), INTENT(IN) :: KDIM + ALLOCATE(HVAR(KDIM(1),KDIM(2))) +END SUBROUTINE LES_ALLOCATE_2DIMC +! END MODULE MODD_LES diff --git a/src/common/micro/ini_rain_ice.F90 b/src/common/micro/ini_rain_ice.F90 index 71b021f84f0e88547b3fa576c27214b2fe0d6df2..daf8625c134f7b7fe8f34c669b2800d6c06622ca 100644 --- a/src/common/micro/ini_rain_ice.F90 +++ b/src/common/micro/ini_rain_ice.F90 @@ -79,6 +79,7 @@ !! S. Riette 2016-11: new ICE3/ICE4 options !! P. Wautelet 22/01/2019 bug correction: incorrect write ! P. Wautelet 26/04/2019: replace non-standard FLOAT function by REAL function +! J. Wurtz 03/2022: New snow characteristics with LSNOW_T ! !------------------------------------------------------------------------------- ! @@ -155,7 +156,7 @@ REAL :: PALPHAR,PALPHAS,PALPHAG,PALPHAH REAL :: PNUR,PNUS,PNUG,PNUH REAL :: PBR,PBS,PBG REAL :: PCR,PCS,PCG,PCH -REAL :: PDR,PDS,PDG,PDH +REAL :: PDR,PDS,PFVELOS,PDG,PDH REAL :: PESR,PEGS,PEGR,PEHS,PEHG,PEHR REAL :: PFDINFTY REAL :: PACCLBDAS_MAX,PACCLBDAR_MAX,PACCLBDAS_MIN,PACCLBDAR_MIN @@ -266,11 +267,25 @@ XF2I = 0.14 ! XAS = 0.02 XBS = 1.9 -XCS = 5.1 -XDS = 0.27 +IF (LSNOW_T) THEN + !Cas Gamma generalisee + XCS = 11.52 + XDS = 0.39 + XFVELOS =0.097 + !Cas MP + !XCS = 13.2 + !XDS = 0.423 + !XFVELOS = 25.14 +ELSE + XCS = 5.1 + XDS = 0.27 + XFVELOS = 0. +END IF ! -XCCS = 5.0 -XCXS = 1.0 +IF (.NOT. LSNOW_T) THEN + XCCS = 5.0 + XCXS = 1.0 +END IF ! XF0S = 0.86 XF1S = 0.28 @@ -346,8 +361,17 @@ XNUR = 1.0 ! Exponential law 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 +IF (LSNOW_T) THEN +!Cas GAMMAGEN + XALPHAS = .214 ! Generalized gamma law + XNUS = 43.7 ! Generalized gamma law + XTRANS_MP_GAMMAS = SQRT( ( GAMMA(XNUS + 2./XALPHAS)*GAMMA(XNUS + 4./XALPHAS) ) / & + ( 8.* GAMMA(XNUS + 1./XALPHAS)*GAMMA(XNUS + 3./XALPHAS) ) ) +ELSE + XALPHAS = 1.0 ! Exponential law + XNUS = 1.0 ! Exponential law + XTRANS_MP_GAMMAS = 1. +END IF ! XALPHAG = 1.0 ! Exponential law XNUG = 1.0 ! Exponential law @@ -369,6 +393,10 @@ XLBR = ( XAR*XCCR*MOMG(XALPHAR,XNUR,XBR) )**(-XLBEXR) XLBEXI = 1.0/(-XBI) XLBI = ( XAI*MOMG(XALPHAI,XNUI,XBI) )**(-XLBEXI) ! +#if defined(REPRO48) || defined(REPRO55) +#else +XNS = 1.0/(XAS*MOMG(XALPHAS,XNUS,XBS)) +#endif XLBEXS = 1.0/(XCXS-XBS) XLBS = ( XAS*XCCS*MOMG(XALPHAS,XNUS,XBS) )**(-XLBEXS) ! @@ -385,7 +413,12 @@ XLBDAS_MAX = 100000.0 XLBDAG_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) +#else +XLBDAS_MAX = 1.E6 +XLBDAS_MIN = 1000. +#endif ! XCONC_SEA=1E8 ! 100/cm3 XCONC_LAND=3E8 ! 300/cm3 @@ -438,9 +471,21 @@ XEXCSEDI =-0.9324*3.0 WRITE (KLUOUT,FMT=*)' PRISTINE ICE SEDIMENTATION for columns XFSEDI =',XFSEDI ! ! +#if defined(REPRO48) || defined(REPRO55) XEXSEDS = (XBS+XDS-XCXS)/(XBS-XCXS) XFSEDS = XCS*XAS*XCCS*MOMG(XALPHAS,XNUS,XBS+XDS)* & + (XAS*XCCS*MOMG(XALPHAS,XNUS,XBS))**(-XEXSEDS)*(ZRHO00)**XCEXVT +#else +IF (HCLOUD == 'ICE3' .OR. HCLOUD == 'ICE4') THEN + XEXSEDS = -XDS-XBS + XFSEDS = XCS*MOMG(XALPHAS,XNUS,XBS+XDS)/(MOMG(XALPHAS,XNUS,XBS)) & + *(ZRHO00)**XCEXVT +ELSE + XEXSEDS = (XBS+XDS-XCXS)/(XBS-XCXS) + XFSEDS = XCS*XAS*XCCS*MOMG(XALPHAS,XNUS,XBS+XDS)* & (XAS*XCCS*MOMG(XALPHAS,XNUS,XBS))**(-XEXSEDS)*(ZRHO00)**XCEXVT +END IF +#endif ! XEXSEDG = (XBG+XDG-XCXG)/(XBG-XCXG) XFSEDG = XCG*XAG*XCCG*MOMG(XALPHAG,XNUG,XBG+XDG)* & @@ -513,10 +558,17 @@ XSCFAC = (0.63**(1./3.))*SQRT((ZRHO00)**XCEXVT) ! One assumes Sc=0.63 X0DEPI = (4.0*XPI)*XC1I*XF0I*MOMG(XALPHAI,XNUI,1.) X2DEPI = (4.0*XPI)*XC1I*XF2I*XC_I*MOMG(XALPHAI,XNUI,XDI+2.0) ! +#if defined(REPRO48) || defined(REPRO55) X0DEPS = (4.0*XPI)*XCCS*XC1S*XF0S*MOMG(XALPHAS,XNUS,1.) X1DEPS = (4.0*XPI)*XCCS*XC1S*XF1S*SQRT(XCS)*MOMG(XALPHAS,XNUS,0.5*XDS+1.5) XEX0DEPS = XCXS-1.0 XEX1DEPS = XCXS-0.5*(XDS+3.0) +#else +X0DEPS = XNS*(4.0*XPI)*XC1S*XF0S*MOMG(XALPHAS,XNUS,1.) +X1DEPS = XNS*(4.0*XPI)*XC1S*XF1S*SQRT(XCS)*MOMG(XALPHAS,XNUS,0.5*XDS+1.5) +XEX0DEPS = -1.0 +XEX1DEPS = -0.5*(XDS+3.0) +#endif XRDEPSRED = 1.0 ! X0DEPG = (4.0*XPI)*XCCG*XC1G*XF0G*MOMG(XALPHAG,XNUG,1.) @@ -566,8 +618,13 @@ END IF ! XCOLIS = 0.25 ! Collection efficiency of I+S XCOLEXIS = 0.05 ! Temperature factor of the I+S collection efficiency +#if defined(REPRO48) || defined(REPRO55) XFIAGGS = (XPI/4.0)*XCOLIS*XCCS*XCS*(ZRHO00**XCEXVT)*MOMG(XALPHAS,XNUS,XDS+2.0) XEXIAGGS = XCXS-XDS-2.0 +#else +XFIAGGS = XNS*(XPI/4.0)*XCOLIS*XCS*(ZRHO00**XCEXVT)*MOMG(XALPHAS,XNUS,XDS+2.0) +XEXIAGGS = -XDS - 2.0 ! GAMMGEN LH_EXTENDED +#endif ! GFLAG = .TRUE. IF (GFLAG) THEN @@ -618,15 +675,28 @@ XEX1EVAR = -1.0-0.5*(XDR+3.0) ! XDCSLIM = 0.007 ! D_cs^lim = 7 mm as suggested by Farley et al. (1989) XCOLCS = 1.0 +#if defined(REPRO48) || defined(REPRO55) XEXCRIMSS= XCXS-XDS-2.0 XCRIMSS = (XPI/4.0)*XCOLCS*XCCS*XCS*(ZRHO00**XCEXVT)*MOMG(XALPHAS,XNUS,XDS+2.0) +#else +XEXCRIMSS= -XDS-2.0 +XCRIMSS = XNS * (XPI/4.0)*XCOLCS*XCS*(ZRHO00**XCEXVT)*MOMG(XALPHAS,XNUS,XDS+2.0) +#endif XEXCRIMSG= XEXCRIMSS XCRIMSG = XCRIMSS +#if defined(REPRO48) || defined(REPRO55) XSRIMCG = XCCS*XAS*MOMG(XALPHAS,XNUS,XBS) XEXSRIMCG= XCXS-XBS XSRIMCG2 = XCCS*XAG*MOMG(XALPHAS,XNUS,XBG) XSRIMCG3 = XFRACM90 XEXSRIMCG2=XCXS-XBG +#else +XSRIMCG = XNS*XAS*MOMG(XALPHAS,XNUS,XBS) +XEXSRIMCG = -XBS +XSRIMCG2 = XNS*XAG*MOMG(XALPHAS,XNUS,XBG) +XSRIMCG3 = XFRACM90 +XEXSRIMCG2=XBS-XBG +#endif ! GFLAG = .TRUE. IF (GFLAG) THEN @@ -656,13 +726,21 @@ XRIMINTP2 = 1.0 + XRIMINTP1*LOG( XDCSLIM/(XGAMINC_BOUND_MIN)**(1.0/XALPHAS) ) ! !* 7.2 Constants for the accretion of raindrops onto aggregates ! +#if defined(REPRO48) || defined(REPRO55) XFRACCSS = ((XPI**2)/24.0)*XCCS*XCCR*XRHOLW*(ZRHO00**XCEXVT) +#else +XFRACCSS = XNS*((XPI**2)/24.0)*XCCR*XRHOLW*(ZRHO00**XCEXVT) +#endif ! XLBRACCS1 = MOMG(XALPHAS,XNUS,2.)*MOMG(XALPHAR,XNUR,3.) XLBRACCS2 = 2.*MOMG(XALPHAS,XNUS,1.)*MOMG(XALPHAR,XNUR,4.) XLBRACCS3 = MOMG(XALPHAR,XNUR,5.) ! +#if defined(REPRO48) || defined(REPRO55) XFSACCRG = (XPI/4.0)*XAS*XCCS*XCCR*(ZRHO00**XCEXVT) +#else +XFSACCRG = XNS*(XPI/4.0)*XAS*XCCR*(ZRHO00**XCEXVT) +#endif ! XLBSACCR1 = MOMG(XALPHAR,XNUR,2.)*MOMG(XALPHAS,XNUS,XBS) XLBSACCR2 = 2.*MOMG(XALPHAR,XNUR,1.)*MOMG(XALPHAS,XNUS,XBS+1.) @@ -696,28 +774,28 @@ IF( .NOT.ASSOCIATED(XKER_RACCSS) ) CALL RAIN_ICE_PARAM_ALLOCATE('XKER_RACCSS', N IF( .NOT.ASSOCIATED(XKER_RACCS ) ) CALL RAIN_ICE_PARAM_ALLOCATE('XKER_RACCS', NACCLBDAS,NACCLBDAR) IF( .NOT.ASSOCIATED(XKER_SACCRG) ) CALL RAIN_ICE_PARAM_ALLOCATE('XKER_SACCRG', NACCLBDAR,NACCLBDAS) ! -CALL READ_XKER_RACCS (KACCLBDAS,KACCLBDAR,KND, & - PALPHAS,PNUS,PALPHAR,PNUR,PESR,PBS,PBR,PCS,PDS,PCR,PDR, & - PACCLBDAS_MAX,PACCLBDAR_MAX,PACCLBDAS_MIN,PACCLBDAR_MIN,& - PFDINFTY ) +CALL READ_XKER_RACCS (KACCLBDAS,KACCLBDAR,KND, & + PALPHAS,PNUS,PALPHAR,PNUR,PESR,PBS,PBR,PCS,PDS,PFVELOS,PCR,PDR, & + PACCLBDAS_MAX,PACCLBDAR_MAX,PACCLBDAS_MIN,PACCLBDAR_MIN, & + PFDINFTY ) IF( (KACCLBDAS/=NACCLBDAS) .OR. (KACCLBDAR/=NACCLBDAR) .OR. (KND/=IND) .OR. & (PALPHAS/=XALPHAS) .OR. (PNUS/=XNUS) .OR. & (PALPHAR/=XALPHAR) .OR. (PNUR/=XNUR) .OR. & (PESR/=ZESR) .OR. (PBS/=XBS) .OR. (PBR/=XBR) .OR. & - (PCS/=XCS) .OR. (PDS/=XDS) .OR. (PCR/=XCR) .OR. (PDR/=XDR) .OR. & + (PCS/=XCS) .OR. (PDS/=XDS) .OR. (PFVELOS/=XFVELOS) .OR. (PCR/=XCR) .OR. (PDR/=XDR) .OR. & (PACCLBDAS_MAX/=XACCLBDAS_MAX) .OR. (PACCLBDAR_MAX/=XACCLBDAR_MAX) .OR. & (PACCLBDAS_MIN/=XACCLBDAS_MIN) .OR. (PACCLBDAR_MIN/=XACCLBDAR_MIN) .OR. & (PFDINFTY/=ZFDINFTY) ) THEN CALL RRCOLSS ( IND, XALPHAS, XNUS, XALPHAR, XNUR, & - ZESR, XBR, XCS, XDS, XCR, XDR, & + ZESR, XBR, XCS, XDS, XFVELOS, XCR, XDR, & XACCLBDAS_MAX, XACCLBDAR_MAX, XACCLBDAS_MIN, XACCLBDAR_MIN, & ZFDINFTY, XKER_RACCSS, XAG, XBS, XAS ) CALL RZCOLX ( IND, XALPHAS, XNUS, XALPHAR, XNUR, & - ZESR, XBR, XCS, XDS, XCR, XDR, & + ZESR, XBR, XCS, XDS, XFVELOS, XCR, XDR, 0., & XACCLBDAS_MAX, XACCLBDAR_MAX, XACCLBDAS_MIN, XACCLBDAR_MIN, & ZFDINFTY, XKER_RACCS ) CALL RSCOLRG ( IND, XALPHAS, XNUS, XALPHAR, XNUR, & - ZESR, XBS, XCS, XDS, XCR, XDR, & + ZESR, XBS, XCS, XDS, XFVELOS, XCR, XDR, & XACCLBDAS_MAX, XACCLBDAR_MAX, XACCLBDAS_MIN, XACCLBDAR_MIN, & ZFDINFTY, XKER_SACCRG, XAG, XBS, XAS ) WRITE(UNIT=KLUOUT,FMT='("*****************************************")') @@ -738,6 +816,7 @@ IF( (KACCLBDAS/=NACCLBDAS) .OR. (KACCLBDAR/=NACCLBDAR) .OR. (KND/=IND) .OR. & WRITE(UNIT=KLUOUT,FMT='("PBR=",E13.6)') XBR WRITE(UNIT=KLUOUT,FMT='("PCS=",E13.6)') XCS WRITE(UNIT=KLUOUT,FMT='("PDS=",E13.6)') XDS + WRITE(UNIT=KLUOUT,FMT='("PFVELOS=",E13.6)') XFVELOS WRITE(UNIT=KLUOUT,FMT='("PCR=",E13.6)') XCR WRITE(UNIT=KLUOUT,FMT='("PDR=",E13.6)') XDR WRITE(UNIT=KLUOUT,FMT='("PACCLBDAS_MAX=",E13.6)') & @@ -777,10 +856,10 @@ IF( (KACCLBDAS/=NACCLBDAS) .OR. (KACCLBDAR/=NACCLBDAR) .OR. (KND/=IND) .OR. & END DO WRITE(UNIT=KLUOUT,FMT='("END IF")') ELSE - CALL READ_XKER_RACCS (KACCLBDAS,KACCLBDAR,KND, & - PALPHAS,PNUS,PALPHAR,PNUR,PESR,PBS,PBR,PCS,PDS,PCR,PDR, & - PACCLBDAS_MAX,PACCLBDAR_MAX,PACCLBDAS_MIN,PACCLBDAR_MIN,& - PFDINFTY,XKER_RACCSS,XKER_RACCS,XKER_SACCRG ) + CALL READ_XKER_RACCS (KACCLBDAS,KACCLBDAR,KND, & + PALPHAS,PNUS,PALPHAR,PNUR,PESR,PBS,PBR,PCS,PDS,PFVELOS,PCR,PDR, & + PACCLBDAS_MAX,PACCLBDAR_MAX,PACCLBDAS_MIN,PACCLBDAR_MIN, & + PFDINFTY,XKER_RACCSS,XKER_RACCS,XKER_SACCRG ) WRITE(UNIT=KLUOUT,FMT='(" Read XKER_RACCSS")') WRITE(UNIT=KLUOUT,FMT='(" Read XKER_RACCS ")') WRITE(UNIT=KLUOUT,FMT='(" Read XKER_SACCRG")') @@ -854,7 +933,11 @@ XCOLSG = 0.01 ! Collection efficiency of S+G XCOLEXSG = 0.1 ! Temperature factor of the S+G collection efficiency WRITE (KLUOUT, FMT=*) ' NEW Constants for the aggregate collection by the graupeln' WRITE (KLUOUT, FMT=*) ' XCOLSG, XCOLEXSG = ',XCOLSG,XCOLEXSG +#if defined(REPRO48) || defined(REPRO55) XFSDRYG = (XPI/4.0)*XCOLSG*XCCG*XCCS*XAS*(ZRHO00**XCEXVT) +#else +XFSDRYG = XNS*(XPI/4.0)*XCOLSG*XCCG*XAS*(ZRHO00**XCEXVT) +#endif ! XLBSDRYG1 = MOMG(XALPHAG,XNUG,2.)*MOMG(XALPHAS,XNUS,XBS) XLBSDRYG2 = 2.*MOMG(XALPHAG,XNUG,1.)*MOMG(XALPHAS,XNUS,XBS+1.) @@ -905,19 +988,19 @@ ZFDINFTY = 20.0 ! computing the kernels XKER_SDRYG IF( .NOT.ASSOCIATED(XKER_SDRYG) ) CALL RAIN_ICE_PARAM_ALLOCATE('XKER_SDRYG', NDRYLBDAG,NDRYLBDAS) ! CALL READ_XKER_SDRYG (KDRYLBDAG,KDRYLBDAS,KND, & - PALPHAG,PNUG,PALPHAS,PNUS,PEGS,PBS,PCG,PDG,PCS,PDS, & + PALPHAG,PNUG,PALPHAS,PNUS,PEGS,PBS,PCG,PDG,PCS,PDS,PFVELOS, & PDRYLBDAG_MAX,PDRYLBDAS_MAX,PDRYLBDAG_MIN,PDRYLBDAS_MIN, & PFDINFTY ) IF( (KDRYLBDAG/=NDRYLBDAG) .OR. (KDRYLBDAS/=NDRYLBDAS) .OR. (KND/=IND) .OR. & (PALPHAG/=XALPHAG) .OR. (PNUG/=XNUG) .OR. & (PALPHAS/=XALPHAS) .OR. (PNUS/=XNUS) .OR. & (PEGS/=ZEGS) .OR. (PBS/=XBS) .OR. & - (PCG/=XCG) .OR. (PDG/=XDG) .OR. (PCS/=XCS) .OR. (PDS/=XDS) .OR. & + (PCG/=XCG) .OR. (PDG/=XDG) .OR. (PCS/=XCS) .OR. (PDS/=XDS) .OR. (PFVELOS/=XFVELOS) .OR. & (PDRYLBDAG_MAX/=XDRYLBDAG_MAX) .OR. (PDRYLBDAS_MAX/=XDRYLBDAS_MAX) .OR. & (PDRYLBDAG_MIN/=XDRYLBDAG_MIN) .OR. (PDRYLBDAS_MIN/=XDRYLBDAS_MIN) .OR. & (PFDINFTY/=ZFDINFTY) ) THEN CALL RZCOLX ( IND, XALPHAG, XNUG, XALPHAS, XNUS, & - ZEGS, XBS, XCG, XDG, XCS, XDS, & + ZEGS, XBS, XCG, XDG, 0., XCS, XDS, XFVELOS, & XDRYLBDAG_MAX, XDRYLBDAS_MAX, XDRYLBDAG_MIN, XDRYLBDAS_MIN, & ZFDINFTY, XKER_SDRYG ) WRITE(UNIT=KLUOUT,FMT='("*****************************************")') @@ -937,6 +1020,7 @@ IF( (KDRYLBDAG/=NDRYLBDAG) .OR. (KDRYLBDAS/=NDRYLBDAS) .OR. (KND/=IND) .OR. & WRITE(UNIT=KLUOUT,FMT='("PDG=",E13.6)') XDG WRITE(UNIT=KLUOUT,FMT='("PCS=",E13.6)') XCS WRITE(UNIT=KLUOUT,FMT='("PDS=",E13.6)') XDS + WRITE(UNIT=KLUOUT,FMT='("PFVELOS=",E13.6)') XFVELOS WRITE(UNIT=KLUOUT,FMT='("PDRYLBDAG_MAX=",E13.6)') & XDRYLBDAG_MAX WRITE(UNIT=KLUOUT,FMT='("PDRYLBDAS_MAX=",E13.6)') & @@ -957,7 +1041,7 @@ IF( (KDRYLBDAG/=NDRYLBDAG) .OR. (KDRYLBDAS/=NDRYLBDAS) .OR. (KND/=IND) .OR. & WRITE(UNIT=KLUOUT,FMT='("END IF")') ELSE CALL READ_XKER_SDRYG (KDRYLBDAG,KDRYLBDAS,KND, & - PALPHAG,PNUG,PALPHAS,PNUS,PEGS,PBS,PCG,PDG,PCS,PDS, & + PALPHAG,PNUG,PALPHAS,PNUS,PEGS,PBS,PCG,PDG,PCS,PDS,PFVELOS, & PDRYLBDAG_MAX,PDRYLBDAS_MAX,PDRYLBDAG_MIN,PDRYLBDAS_MIN, & PFDINFTY,XKER_SDRYG ) WRITE(UNIT=KLUOUT,FMT='(" Read XKER_SDRYG")') @@ -983,7 +1067,7 @@ IF( (KDRYLBDAG/=NDRYLBDAG) .OR. (KDRYLBDAR/=NDRYLBDAR) .OR. (KND/=IND) .OR. & (PDRYLBDAG_MIN/=XDRYLBDAG_MIN) .OR. (PDRYLBDAR_MIN/=XDRYLBDAR_MIN) .OR. & (PFDINFTY/=ZFDINFTY) ) THEN CALL RZCOLX ( IND, XALPHAG, XNUG, XALPHAR, XNUR, & - ZEGR, XBR, XCG, XDG, XCR, XDR, & + ZEGR, XBR, XCG, XDG, 0., XCR, XDR, 0., & XDRYLBDAG_MAX, XDRYLBDAR_MAX, XDRYLBDAG_MIN, XDRYLBDAR_MIN, & ZFDINFTY, XKER_RDRYG ) WRITE(UNIT=KLUOUT,FMT='("*****************************************")') @@ -1036,12 +1120,18 @@ END IF XFRMIN(7:9)=1. XFRMIN(10) =10. XFRMIN(11) =1. - XFRMIN(12) =100. + XFRMIN(12) =100. !0 in suparar XFRMIN(13) =1.0E-15 XFRMIN(14) =120. XFRMIN(15) =1.0E-4 XFRMIN(16:20)=0. - XFRMIN(21)=1. + XFRMIN(21:22)=1. + XFRMIN(23)=0.5 + XFRMIN(24)=1.5 + XFRMIN(25)=30. + XFRMIN(26:38)=0. + XFRMIN(39)=0.25 + XFRMIN(40)=0.15 ! ! !------------------------------------------------------------------------------- @@ -1063,7 +1153,11 @@ XFWETH = (XPI/4.0)*XCCH*XCH*(ZRHO00**XCEXVT)*MOMG(XALPHAH,XNUH,XDH+2.0) ! XCOLSH = 0.01 ! Collection efficiency of S+H XCOLEXSH = 0.1 ! Temperature factor of the S+H collection efficiency +#if defined(REPRO48) || defined(REPRO55) XFSWETH = (XPI/4.0)*XCCH*XCCS*XAS*(ZRHO00**XCEXVT) +#else +XFSWETH = XNS*(XPI/4.0)*XCCH*XAS*(ZRHO00**XCEXVT) ! Wurtz +#endif ! XLBSWETH1 = MOMG(XALPHAH,XNUH,2.)*MOMG(XALPHAS,XNUS,XBS) XLBSWETH2 = 2.*MOMG(XALPHAH,XNUH,1.)*MOMG(XALPHAS,XNUS,XBS+1.) @@ -1123,19 +1217,19 @@ ZFDINFTY = 20.0 ! computing the kernels XKER_SWETH IF( .NOT.ASSOCIATED(XKER_SWETH) ) CALL RAIN_ICE_PARAM_ALLOCATE('XKER_SWETH', NWETLBDAH,NWETLBDAS) ! CALL READ_XKER_SWETH (KWETLBDAH,KWETLBDAS,KND, & - PALPHAH,PNUH,PALPHAS,PNUS,PEHS,PBS,PCH,PDH,PCS,PDS, & + PALPHAH,PNUH,PALPHAS,PNUS,PEHS,PBS,PCH,PDH,PCS,PDS,PFVELOS, & PWETLBDAH_MAX,PWETLBDAS_MAX,PWETLBDAH_MIN,PWETLBDAS_MIN, & PFDINFTY ) IF( (KWETLBDAH/=NWETLBDAH) .OR. (KWETLBDAS/=NWETLBDAS) .OR. (KND/=IND) .OR. & (PALPHAH/=XALPHAH) .OR. (PNUH/=XNUH) .OR. & (PALPHAS/=XALPHAS) .OR. (PNUS/=XNUS) .OR. & (PEHS/=ZEHS) .OR. (PBS/=XBS) .OR. & - (PCH/=XCH) .OR. (PDH/=XDH) .OR. (PCS/=XCS) .OR. (PDS/=XDS) .OR. & + (PCH/=XCH) .OR. (PDH/=XDH) .OR. (PCS/=XCS) .OR. (PDS/=XDS) .OR. (PFVELOS/=XFVELOS) .OR. & (PWETLBDAH_MAX/=XWETLBDAH_MAX) .OR. (PWETLBDAS_MAX/=XWETLBDAS_MAX) .OR. & (PWETLBDAH_MIN/=XWETLBDAH_MIN) .OR. (PWETLBDAS_MIN/=XWETLBDAS_MIN) .OR. & (PFDINFTY/=ZFDINFTY) ) THEN CALL RZCOLX ( IND, XALPHAH, XNUH, XALPHAS, XNUS, & - ZEHS, XBS, XCH, XDH, XCS, XDS, & + ZEHS, XBS, XCH, XDH, 0., XCS, XDS, XFVELOS, & XWETLBDAH_MAX, XWETLBDAS_MAX, XWETLBDAH_MIN, XWETLBDAS_MIN, & ZFDINFTY, XKER_SWETH ) WRITE(UNIT=KLUOUT,FMT='("*****************************************")') @@ -1155,6 +1249,7 @@ IF( (KWETLBDAH/=NWETLBDAH) .OR. (KWETLBDAS/=NWETLBDAS) .OR. (KND/=IND) .OR. & WRITE(UNIT=KLUOUT,FMT='("PDH=",E13.6)') XDH WRITE(UNIT=KLUOUT,FMT='("PCS=",E13.6)') XCS WRITE(UNIT=KLUOUT,FMT='("PDS=",E13.6)') XDS + WRITE(UNIT=KLUOUT,FMT='("PFVELOS=",E13.6)') XFVELOS WRITE(UNIT=KLUOUT,FMT='("PWETLBDAH_MAX=",E13.6)') & XWETLBDAH_MAX WRITE(UNIT=KLUOUT,FMT='("PWETLBDAS_MAX=",E13.6)') & @@ -1175,7 +1270,7 @@ IF( (KWETLBDAH/=NWETLBDAH) .OR. (KWETLBDAS/=NWETLBDAS) .OR. (KND/=IND) .OR. & WRITE(UNIT=KLUOUT,FMT='("END IF")') ELSE CALL READ_XKER_SWETH (KWETLBDAH,KWETLBDAS,KND, & - PALPHAH,PNUH,PALPHAS,PNUS,PEHS,PBS,PCH,PDH,PCS,PDS, & + PALPHAH,PNUH,PALPHAS,PNUS,PEHS,PBS,PCH,PDH,PCS,PDS,PFVELOS, & PWETLBDAH_MAX,PWETLBDAS_MAX,PWETLBDAH_MIN,PWETLBDAS_MIN, & PFDINFTY,XKER_SWETH ) WRITE(UNIT=KLUOUT,FMT='(" Read XKER_SWETH")') @@ -1201,7 +1296,7 @@ IF( (KWETLBDAH/=NWETLBDAH) .OR. (KWETLBDAG/=NWETLBDAG) .OR. (KND/=IND) .OR. & (PWETLBDAH_MIN/=XWETLBDAH_MIN) .OR. (PWETLBDAG_MIN/=XWETLBDAG_MIN) .OR. & (PFDINFTY/=ZFDINFTY) ) THEN CALL RZCOLX ( IND, XALPHAH, XNUH, XALPHAG, XNUG, & - ZEHG, XBG, XCH, XDH, XCG, XDG, & + ZEHG, XBG, XCH, XDH, 0., XCG, XDG, 0., & XWETLBDAH_MAX, XWETLBDAG_MAX, XWETLBDAH_MIN, XWETLBDAG_MIN, & ZFDINFTY, XKER_GWETH ) WRITE(UNIT=KLUOUT,FMT='("*****************************************")') @@ -1267,7 +1362,7 @@ IF( (KWETLBDAH/=NWETLBDAH) .OR. (KWETLBDAR/=NWETLBDAR) .OR. (KND/=IND) .OR. & (PWETLBDAH_MIN/=XWETLBDAH_MIN) .OR. (PWETLBDAR_MIN/=XWETLBDAR_MIN) .OR. & (PFDINFTY/=ZFDINFTY) ) THEN CALL RZCOLX ( IND, XALPHAH, XNUH, XALPHAR, XNUR, & - ZEHR, XBR, XCH, XDH, XCR, XDR, & + ZEHR, XBR, XCH, XDH, 0., XCR, XDR, 0., & XWETLBDAH_MAX, XWETLBDAR_MAX, XWETLBDAH_MIN, XWETLBDAR_MIN, & ZFDINFTY, XKER_RWETH ) WRITE(UNIT=KLUOUT,FMT='("*****************************************")') diff --git a/src/common/turb/les_mean_subgrid.F90 b/src/common/turb/les_mean_subgrid.F90 new file mode 100644 index 0000000000000000000000000000000000000000..c36a69883ebb1be589e9fbc44c2a9a8b46d93204 --- /dev/null +++ b/src/common/turb/les_mean_subgrid.F90 @@ -0,0 +1,74 @@ +!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 les 2006/08/30 18:41:10 +!----------------------------------------------------------------- +! +MODULE MODI_LES_MEAN_SUBGRID +! ##################### +! +INTERFACE LES_MEAN_SUBGRID +! + SUBROUTINE LES_MEAN_SUBGRID_3D(PA, PA_MEAN, OSUM) + +REAL, DIMENSION(:,:,:), INTENT(IN) :: PA +! +REAL, DIMENSION(:,:,:), INTENT(INOUT) :: PA_MEAN +! +LOGICAL, OPTIONAL, INTENT(IN) :: OSUM +! +END SUBROUTINE LES_MEAN_SUBGRID_3D +! + + SUBROUTINE LES_MEAN_SUBGRID_SURF(PA, PA_MEAN, OSUM) + +REAL, DIMENSION(:,:), INTENT(IN) :: PA +! +REAL, DIMENSION(:), INTENT(INOUT) :: PA_MEAN +! +LOGICAL, OPTIONAL, INTENT(IN) :: OSUM +! +END SUBROUTINE LES_MEAN_SUBGRID_SURF +! +END INTERFACE +! +END MODULE MODI_LES_MEAN_SUBGRID +! +! ############################################## + SUBROUTINE LES_MEAN_SUBGRID_3D(PA, PA_MEAN, OSUM) +! ############################################## +! +IMPLICIT NONE +! +! +!* 0.1 declarations of arguments +! +REAL, DIMENSION(:,:,:), INTENT(IN) :: PA +REAL, DIMENSION(:,:,:), INTENT(INOUT) :: PA_MEAN +LOGICAL, OPTIONAL, INTENT(IN) :: OSUM +! +CALL ABORT ! AROME should not used this mesonh routine, if yes, check LLES_CALL +! +END SUBROUTINE LES_MEAN_SUBGRID_3D +! +! ############################################## + SUBROUTINE LES_MEAN_SUBGRID_SURF(PA, PA_MEAN, OSUM) +! ############################################## +! +IMPLICIT NONE +! +!* 0.1 declarations of arguments +! +REAL, DIMENSION(:,:), INTENT(IN) :: PA +REAL, DIMENSION(:), INTENT(INOUT) :: PA_MEAN +LOGICAL, OPTIONAL, INTENT(IN) :: OSUM +! +! +CALL ABORT ! AROME should not used this mesonh routine, if yes, check LLES_CALL +! +END SUBROUTINE LES_MEAN_SUBGRID_SURF diff --git a/src/common/turb/les_mean_subgrid_3d.F90 b/src/common/turb/les_mean_subgrid_3d.F90 deleted file mode 100644 index d091f03c8f28c7d5b059832229c353c631275c15..0000000000000000000000000000000000000000 --- a/src/common/turb/les_mean_subgrid_3d.F90 +++ /dev/null @@ -1,2 +0,0 @@ -SUBROUTINE LES_MEAN_SUBGRID_3D -END SUBROUTINE LES_MEAN_SUBGRID_3D diff --git a/src/common/turb/les_mean_subgrid_phy.F90 b/src/common/turb/les_mean_subgrid_phy.F90 index 66f29f61ecd04493e5eba3d8e9c9307faa673b6f..f34cd613a8453aac7c4d89de44fcbe967a671118 100644 --- a/src/common/turb/les_mean_subgrid_phy.F90 +++ b/src/common/turb/les_mean_subgrid_phy.F90 @@ -15,25 +15,28 @@ MODULE MODI_LES_MEAN_SUBGRID_PHY INTERFACE LES_MEAN_SUBGRID_PHY ! -SUBROUTINE LES_MEAN_SUBGRID_3D_PHY(D,PA, PA_MEAN, OSUM) +SUBROUTINE LES_MEAN_SUBGRID_3D_PHY(D,TLES,PA, PA_MEAN, OSUM) USE MODD_DIMPHYEX, ONLY: DIMPHYEX_t -USE MODD_LES, ONLY: NLES_CURRENT_TCOUNT +USE MODD_LES, ONLY: TLES_t ! IMPLICIT NONE ! TYPE(DIMPHYEX_t), INTENT(IN) :: D +TYPE(TLES_t), INTENT(IN) :: TLES REAL, DIMENSION(:,:), INTENT(IN) :: PA REAL, DIMENSION(:,:,:), INTENT(INOUT) :: PA_MEAN LOGICAL, OPTIONAL, INTENT(IN) :: OSUM ! END SUBROUTINE LES_MEAN_SUBGRID_3D_PHY ! -SUBROUTINE LES_MEAN_SUBGRID_SURF_PHY(D,PA, PA_MEAN, OSUM) +SUBROUTINE LES_MEAN_SUBGRID_SURF_PHY(D,TLES,PA, PA_MEAN, OSUM) USE MODD_DIMPHYEX, ONLY: DIMPHYEX_t +USE MODD_LES, ONLY: TLES_t ! IMPLICIT NONE ! TYPE(DIMPHYEX_t), INTENT(IN) :: D +TYPE(TLES_t), INTENT(IN) :: TLES REAL, DIMENSION(:), INTENT(IN) :: PA REAL, DIMENSION(:), INTENT(INOUT) :: PA_MEAN LOGICAL, OPTIONAL, INTENT(IN) :: OSUM @@ -45,34 +48,40 @@ END INTERFACE LES_MEAN_SUBGRID_PHY END MODULE MODI_LES_MEAN_SUBGRID_PHY ! ! ############################################## - SUBROUTINE LES_MEAN_SUBGRID_3D_PHY(D, PA, PA_MEAN, OSUM) + SUBROUTINE LES_MEAN_SUBGRID_3D_PHY(D,TLES, PA, PA_MEAN, OSUM) ! ############################################## ! USE MODD_DIMPHYEX, ONLY: DIMPHYEX_t +USE MODD_LES, ONLY: TLES_t ! IMPLICIT NONE ! TYPE(DIMPHYEX_t), INTENT(IN) :: D +TYPE(TLES_t), INTENT(IN) :: TLES REAL, DIMENSION(:,:), INTENT(IN) :: PA REAL, DIMENSION(:,:,:), INTENT(INOUT) :: PA_MEAN LOGICAL, OPTIONAL, INTENT(IN) :: OSUM ! +CALL ABORT !not used in AROME END SUBROUTINE LES_MEAN_SUBGRID_3D_PHY ! ! ############################################## - SUBROUTINE LES_MEAN_SUBGRID_SURF_PHY(D, PA, PA_MEAN, OSUM) + SUBROUTINE LES_MEAN_SUBGRID_SURF_PHY(D,TLES, PA, PA_MEAN, OSUM) ! ############################################## ! !* 0. DECLARATIONS ! ------------ ! USE MODD_DIMPHYEX, ONLY: DIMPHYEX_t +USE MODD_LES, ONLY: TLES_t ! IMPLICIT NONE ! TYPE(DIMPHYEX_t), INTENT(IN) :: D +TYPE(TLES_t), INTENT(IN) :: TLES REAL, DIMENSION(:), INTENT(IN) :: PA REAL, DIMENSION(:), INTENT(INOUT) :: PA_MEAN LOGICAL, OPTIONAL, INTENT(IN) :: OSUM ! +CALL ABORT !not used in AROME END SUBROUTINE LES_MEAN_SUBGRID_SURF_PHY diff --git a/src/common/turb/les_mean_subgrid_surf.F90 b/src/common/turb/les_mean_subgrid_surf.F90 deleted file mode 100644 index 407cb7f5130ecd9ab9b64d99bcb2c61965dd9ee0..0000000000000000000000000000000000000000 --- a/src/common/turb/les_mean_subgrid_surf.F90 +++ /dev/null @@ -1,2 +0,0 @@ -SUBROUTINE LES_MEAN_SUBGRID_SURF -END SUBROUTINE LES_MEAN_SUBGRID_SURF diff --git a/src/common/turb/mode_tke_eps_sources.F90 b/src/common/turb/mode_tke_eps_sources.F90 index 1b16c4619620c1deb4c8986863910bbcc94c65a1..c17f91d839c6e9b5d5c9177d4991b0fdec7ca989 100644 --- a/src/common/turb/mode_tke_eps_sources.F90 +++ b/src/common/turb/mode_tke_eps_sources.F90 @@ -5,11 +5,11 @@ MODULE MODE_TKE_EPS_SOURCES IMPLICIT NONE CONTAINS - SUBROUTINE TKE_EPS_SOURCES(D,CST,CSTURB,BUCONF,TURBN, & + SUBROUTINE TKE_EPS_SOURCES(D,CST,CSTURB,BUCONF,TURBN,TLES, & & HPROGRAM, KMI,PTKEM,PLM,PLEPS,PDP, & & PTRH,PRHODJ,PDZZ,PDXX,PDYY,PDZX,PDZY,PZZ, & & PTSTEP,PEXPL, & - & TPFILE,OLES_CALL,ODIAG_IN_RUN,OOCEAN, & + & TPFILE,ODIAG_IN_RUN,OOCEAN, & & PSFUM,PSFVM, & & PTP,PRTKES,PRTHLS,PCOEF_DISS,PTDIFF,PTDISS,PRTKEMS,& & TBUDGETS, KBUDGETS, & @@ -138,7 +138,7 @@ 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 +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 @@ -148,10 +148,6 @@ USE MODE_ll USE SHUMAN_PHY, ONLY: MZM_PHY, MZF_PHY, DZF_PHY, DZM_PHY ! USE MODI_GET_HALO -!USE MODI_GRADIENT_M -!USE MODI_GRADIENT_U -!USE MODI_GRADIENT_V -!USE MODI_GRADIENT_W USE MODI_LES_MEAN_SUBGRID_PHY USE MODE_TRIDIAG_TKE, ONLY: TRIDIAG_TKE ! @@ -167,6 +163,7 @@ TYPE(CST_t), INTENT(IN) :: CST TYPE(CSTURB_t), INTENT(IN) :: CSTURB TYPE(TBUDGETCONF_t), INTENT(IN) :: BUCONF TYPE(TURB_t), INTENT(IN) :: TURBN +TYPE(TLES_t), INTENT(INOUT):: TLES 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 @@ -179,7 +176,6 @@ 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) :: OLES_CALL ! 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 @@ -345,7 +341,7 @@ PTDISS(IIJB:IIJE,1:D%NKT) = - ZFLX(IIJB:IIJE,1:D%NKT)*(PEXPL*PTKEM(IIJB:IIJE,1:D + TURBN%XIMPL*ZRES(IIJB:IIJE,1:D%NKT)) !$mnh_end_expand_array(JIJ=IIJB:IIJE,JK=1:D%NKT) ! -IF ( OLES_CALL .OR. & +IF ( TLES%LLES_CALL .OR. & (TURBN%LTURB_DIAG .AND. TPFILE%LOPENED) ) THEN ! ! Compute the cartesian vertical flux of TKE in ZFLX @@ -378,10 +374,10 @@ IF ( OLES_CALL .OR. & ! ! Storage in the LES configuration ! - IF (OLES_CALL) THEN + IF (TLES%LLES_CALL) THEN CALL MZF_PHY(D,ZFLX,ZMWORK1) - CALL LES_MEAN_SUBGRID_PHY(D,ZMWORK1, X_LES_SUBGRID_WTke ) - CALL LES_MEAN_SUBGRID_PHY(D, -ZTR, X_LES_SUBGRID_ddz_WTke ) + CALL LES_MEAN_SUBGRID_PHY(D,TLES,ZMWORK1, TLES%X_LES_SUBGRID_WTke ) + CALL LES_MEAN_SUBGRID_PHY(D,TLES, -ZTR, TLES%X_LES_SUBGRID_ddz_WTke ) END IF ! END IF @@ -535,8 +531,8 @@ END IF ! Storage in the LES configuration of the Dynamic Production of TKE and ! the dissipation of TKE ! -IF (OLES_CALL ) THEN - CALL LES_MEAN_SUBGRID_PHY(D, PDISS, X_LES_SUBGRID_DISS_Tke ) +IF (TLES%LLES_CALL ) THEN + CALL LES_MEAN_SUBGRID_PHY(D,TLES, PDISS, TLES%X_LES_SUBGRID_DISS_Tke ) END IF ! !---------------------------------------------------------------------------- diff --git a/src/common/turb/mode_turb_hor.F90 b/src/common/turb/mode_turb_hor.F90 index bdaab01061d6bb8ddc7f6274b8f34e6446f39f48..892580aff988854eb1ad31e066ffc77f0ade9c4c 100644 --- a/src/common/turb/mode_turb_hor.F90 +++ b/src/common/turb/mode_turb_hor.F90 @@ -5,7 +5,7 @@ MODULE MODE_TURB_HOR IMPLICIT NONE CONTAINS - SUBROUTINE TURB_HOR(D,CST,CSTURB,TURBN, & + SUBROUTINE TURB_HOR(D,CST,CSTURB,TURBN,TLES, & KSPLT, KRR, KRRL, KRRI, PTSTEP, & KSV, KSV_LGBEG, KSV_LGEND, OFLAT,O2D,ONOMIXLG, & OOCEAN,OCOMPUTE_SRC,OBLOWSNOW, & @@ -144,7 +144,7 @@ USE MODD_TURB_n, ONLY: TURB_t USE MODD_DIMPHYEX, ONLY: DIMPHYEX_t USE MODD_IO, ONLY: TFILEDATA USE MODD_PARAMETERS -USE MODD_LES +USE MODD_LES, ONLY: TLES_t ! USE MODE_TURB_HOR_THERMO_FLUX, ONLY: TURB_HOR_THERMO_FLUX USE MODE_TURB_HOR_THERMO_CORR, ONLY: TURB_HOR_THERMO_CORR @@ -165,6 +165,7 @@ TYPE(DIMPHYEX_t), INTENT(IN) :: D 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) :: KSPLT ! current split index INTEGER, INTENT(IN) :: KRR ! number of moist var. INTEGER, INTENT(IN) :: KRRL ! number of liquid water var. @@ -261,7 +262,7 @@ REAL, DIMENSION(:,:,:), INTENT(INOUT) :: PSIGS !* 6. < V' R'np > !* 7. < V' TPV' > ! - CALL TURB_HOR_THERMO_FLUX(TURBN,KSPLT, KRR, KRRL, KRRI, & + CALL TURB_HOR_THERMO_FLUX(TURBN,TLES,KSPLT, KRR, KRRL, KRRI,& TPFILE,OFLAT, O2D, & PK,PINV_PDXX,PINV_PDYY,PINV_PDZZ,PMZM_PRHODJ, & PDXX,PDYY,PDZZ,PDZX,PDZY, & @@ -276,7 +277,7 @@ REAL, DIMENSION(:,:,:), INTENT(INOUT) :: PSIGS !* 8. TURBULENT CORRELATIONS : <THl THl>, <THl Rnp>, <Rnp Rnp>, Sigma_s ! IF (KSPLT==1) & - CALL TURB_HOR_THERMO_CORR(D,CST,TURBN, & + CALL TURB_HOR_THERMO_CORR(D,CST,TURBN,TLES, & KRR, KRRL, KRRI, & OOCEAN,OCOMPUTE_SRC, & TPFILE, & @@ -293,7 +294,7 @@ REAL, DIMENSION(:,:,:), INTENT(INOUT) :: PSIGS !* 10. < V'V'> !* 11. < W'W'> ! - CALL TURB_HOR_DYN_CORR(TURBN,KSPLT, PTSTEP, & + CALL TURB_HOR_DYN_CORR(TURBN,TLES,KSPLT, PTSTEP, & KRR,KSV,OFLAT, O2D, & TPFILE, & PK,PINV_PDZZ, & @@ -311,7 +312,7 @@ REAL, DIMENSION(:,:,:), INTENT(INOUT) :: PSIGS ! !* 12. < U'V'> ! - CALL TURB_HOR_UV(TURBN,KSPLT,OFLAT,O2D, & + CALL TURB_HOR_UV(TURBN,TLES,KSPLT,OFLAT,O2D, & TPFILE, & PK,PINV_PDXX,PINV_PDYY,PINV_PDZZ,PMZM_PRHODJ, & PDXX,PDYY,PDZZ,PDZX,PDZY, & @@ -326,7 +327,7 @@ REAL, DIMENSION(:,:,:), INTENT(INOUT) :: PSIGS ! !* 13. < U'W'> ! - CALL TURB_HOR_UW(TURBN,KSPLT, & + CALL TURB_HOR_UW(TURBN,TLES,KSPLT, & KRR,KSV,OFLAT, & TPFILE, & PK,PINV_PDXX,PINV_PDZZ,PMZM_PRHODJ, & @@ -340,7 +341,7 @@ REAL, DIMENSION(:,:,:), INTENT(INOUT) :: PSIGS ! !* 14. < V'W'> ! - CALL TURB_HOR_VW(TURBN,KSPLT, & + CALL TURB_HOR_VW(TURBN,TLES,KSPLT, & KRR,KSV,OFLAT,O2D, & TPFILE, & PK,PINV_PDYY,PINV_PDZZ,PMZM_PRHODJ, & @@ -355,7 +356,7 @@ REAL, DIMENSION(:,:,:), INTENT(INOUT) :: PSIGS ! !* 15. HORIZONTAL FLUXES OF PASSIVE SCALARS ! - CALL TURB_HOR_SV_FLUX(TURBN,KSPLT,OBLOWSNOW,OFLAT, & + CALL TURB_HOR_SV_FLUX(TURBN,TLES,KSPLT,OBLOWSNOW,OFLAT, & TPFILE,KSV_LGBEG,KSV_LGEND,O2D,ONOMIXLG, & PK,PINV_PDXX,PINV_PDYY,PINV_PDZZ,PMZM_PRHODJ, & PDXX,PDYY,PDZZ,PDZX,PDZY,PRSNOW, & @@ -365,7 +366,7 @@ REAL, DIMENSION(:,:,:), INTENT(INOUT) :: PSIGS PSVM, & PRSVS ) ! - IF (KSPLT==1 .AND. LLES_CALL) & + IF (KSPLT==1 .AND. TLES%LLES_CALL) & CALL TURB_HOR_SV_CORR(D,CST,CSTURB,KSV,KSV_LGBEG,KSV_LGEND,& KRR,KRRL,KRRI,OOCEAN,OCOMPUTE_SRC,OBLOWSNOW, & ONOMIXLG,O2D, & diff --git a/src/common/turb/mode_turb_hor_dyn_corr.F90 b/src/common/turb/mode_turb_hor_dyn_corr.F90 index d9f4d2a61d3de07502b24fe37ac4791ac8b45bb1..6bfd6f98ef8d968586fcd46d5bea23844f4855f1 100644 --- a/src/common/turb/mode_turb_hor_dyn_corr.F90 +++ b/src/common/turb/mode_turb_hor_dyn_corr.F90 @@ -6,7 +6,7 @@ MODULE MODE_TURB_HOR_DYN_CORR IMPLICIT NONE CONTAINS - SUBROUTINE TURB_HOR_DYN_CORR(TURBN,KSPLT, PTSTEP, & + SUBROUTINE TURB_HOR_DYN_CORR(TURBN,TLES,KSPLT, PTSTEP, & KRR, KSV,OFLAT,O2D, & TPFILE, & PK,PINV_PDZZ, & @@ -78,7 +78,7 @@ USE MODD_CTURB USE MODD_FIELD, ONLY: TFIELDDATA, TYPEREAL USE MODD_IO, ONLY: TFILEDATA USE MODD_PARAMETERS -USE MODD_LES +USE MODD_LES, ONLY: TLES_t ! USE MODE_ll USE MODE_IO_FIELD_WRITE, ONLY: IO_FIELD_WRITE @@ -103,6 +103,7 @@ IMPLICIT NONE ! ! TYPE(TURB_t), INTENT(IN) :: TURBN +TYPE(TLES_t), INTENT(INOUT) :: TLES ! modd_les structure INTEGER, INTENT(IN) :: KSPLT ! split process index REAL, INTENT(IN) :: PTSTEP ! timestep INTEGER, INTENT(IN) :: KRR ! number of moist var. @@ -343,12 +344,12 @@ END IF ! ! Storage in the LES configuration ! -IF (LLES_CALL .AND. KSPLT==1) THEN +IF (TLES%LLES_CALL .AND. KSPLT==1) THEN CALL SECOND_MNH(ZTIME1) - CALL LES_MEAN_SUBGRID( ZFLX, X_LES_SUBGRID_U2 ) - CALL LES_MEAN_SUBGRID( -ZWORK, X_LES_RES_ddxa_U_SBG_UaU , .TRUE.) + CALL LES_MEAN_SUBGRID( ZFLX, TLES%X_LES_SUBGRID_U2 ) + CALL LES_MEAN_SUBGRID( -ZWORK, TLES%X_LES_RES_ddxa_U_SBG_UaU , .TRUE.) CALL SECOND_MNH(ZTIME2) - XTIME_LES = XTIME_LES + ZTIME2 - ZTIME1 + TLES%XTIME_LES = TLES%XTIME_LES + ZTIME2 - ZTIME1 END IF ! @@ -439,12 +440,12 @@ END IF ! ! Storage in the LES configuration ! -IF (LLES_CALL .AND. KSPLT==1) THEN +IF (TLES%LLES_CALL .AND. KSPLT==1) THEN CALL SECOND_MNH(ZTIME1) - CALL LES_MEAN_SUBGRID( ZFLX, X_LES_SUBGRID_V2 ) - CALL LES_MEAN_SUBGRID( -ZWORK, X_LES_RES_ddxa_V_SBG_UaV , .TRUE.) + CALL LES_MEAN_SUBGRID( ZFLX, TLES%X_LES_SUBGRID_V2 ) + CALL LES_MEAN_SUBGRID( -ZWORK, TLES%X_LES_RES_ddxa_V_SBG_UaV , .TRUE.) CALL SECOND_MNH(ZTIME2) - XTIME_LES = XTIME_LES + ZTIME2 - ZTIME1 + TLES%XTIME_LES = TLES%XTIME_LES + ZTIME2 - ZTIME1 END IF ! !* 11. < W'W'> @@ -529,26 +530,26 @@ END IF ! Storage in the LES configuration ! ! -IF (LLES_CALL .AND. KSPLT==1) THEN +IF (TLES%LLES_CALL .AND. KSPLT==1) THEN CALL SECOND_MNH(ZTIME1) - CALL LES_MEAN_SUBGRID( ZFLX, X_LES_SUBGRID_W2 ) - CALL LES_MEAN_SUBGRID( -ZWORK, X_LES_RES_ddxa_W_SBG_UaW , .TRUE.) - CALL LES_MEAN_SUBGRID( GZ_M_M(PTHLM,PDZZ)*ZFLX, X_LES_RES_ddxa_Thl_SBG_UaW , .TRUE.) - CALL LES_MEAN_SUBGRID(ZFLX*MZF(GZ_M_W(1,IKU,1,PTHLM,PDZZ)),X_LES_RES_ddz_Thl_SBG_W2) + CALL LES_MEAN_SUBGRID( ZFLX, TLES%X_LES_SUBGRID_W2 ) + CALL LES_MEAN_SUBGRID( -ZWORK, TLES%X_LES_RES_ddxa_W_SBG_UaW , .TRUE.) + CALL LES_MEAN_SUBGRID( GZ_M_M(PTHLM,PDZZ)*ZFLX, TLES%X_LES_RES_ddxa_Thl_SBG_UaW , .TRUE.) + CALL LES_MEAN_SUBGRID(ZFLX*MZF(GZ_M_W(1,IKU,1,PTHLM,PDZZ)),TLES%X_LES_RES_ddz_Thl_SBG_W2) IF (KRR>=1) THEN CALL LES_MEAN_SUBGRID( GZ_M_M(PRM(:,:,:,1),PDZZ)*ZFLX, & - X_LES_RES_ddxa_Rt_SBG_UaW , .TRUE.) + TLES%X_LES_RES_ddxa_Rt_SBG_UaW , .TRUE.) CALL LES_MEAN_SUBGRID(ZFLX*MZF(GZ_M_W(1,IKU,1,PRM(:,:,:,1),PDZZ)), & - X_LES_RES_ddz_Rt_SBG_W2) + TLES%X_LES_RES_ddz_Rt_SBG_W2) END IF DO JSV=1,KSV CALL LES_MEAN_SUBGRID( GZ_M_M(PSVM(:,:,:,JSV),PDZZ)*ZFLX, & - X_LES_RES_ddxa_Sv_SBG_UaW(:,:,:,JSV) , .TRUE.) + TLES%X_LES_RES_ddxa_Sv_SBG_UaW(:,:,:,JSV) , .TRUE.) CALL LES_MEAN_SUBGRID(ZFLX*MZF(GZ_M_W(1,IKU,1,PSVM(:,:,:,JSV),PDZZ)), & - X_LES_RES_ddz_Sv_SBG_W2(:,:,:,JSV)) + TLES%X_LES_RES_ddz_Sv_SBG_W2(:,:,:,JSV)) END DO CALL SECOND_MNH(ZTIME2) - XTIME_LES = XTIME_LES + ZTIME2 - ZTIME1 + TLES%XTIME_LES = TLES%XTIME_LES + ZTIME2 - ZTIME1 END IF ! CALL CLEANLIST_ll(TZFIELDS_ll) diff --git a/src/common/turb/mode_turb_hor_splt.F90 b/src/common/turb/mode_turb_hor_splt.F90 index d50a7bfb8688f47166bde43ba6544e4f81cebcc0..83fdd1ed2d39f76780a3613955029e4f50e1dfa5 100644 --- a/src/common/turb/mode_turb_hor_splt.F90 +++ b/src/common/turb/mode_turb_hor_splt.F90 @@ -5,7 +5,7 @@ MODULE MODE_TURB_HOR_SPLT IMPLICIT NONE CONTAINS - SUBROUTINE TURB_HOR_SPLT(D,CST,CSTURB,TURBN, & + SUBROUTINE TURB_HOR_SPLT(D,CST,CSTURB,TURBN,TLES, & KSPLIT, KRR,KRRL,KRRI,KSV, KSV_LGBEG,KSV_LGEND,& PTSTEP,HLBCX,HLBCY, OFLAT, O2D, ONOMIXLG, & OOCEAN,OCOMPUTE_SRC,OBLOWSNOW,PRSNOW, & @@ -160,6 +160,7 @@ CONTAINS USE MODD_CST, ONLY: CST_t USE MODD_CTURB, ONLY: CSTURB_t USE MODD_DIMPHYEX, ONLY : DIMPHYEX_t +USE MODD_LES, ONLY: TLES_t USE MODD_TURB_n, ONLY: TURB_t ! USE MODD_IO, ONLY: TFILEDATA @@ -182,6 +183,7 @@ TYPE(DIMPHYEX_t), INTENT(IN) :: D 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) :: KSPLIT ! number of time splitting INTEGER, INTENT(IN) :: KRR ! number of moist var. INTEGER, INTENT(IN) :: KRRL ! number of liquid water var. @@ -370,7 +372,7 @@ IF (KSPLIT>1 .AND. HPROGRAM=='MESONH') THEN DO JSPLT=1,KSPLIT ! ! compute the turbulent tendencies for the small time step - CALL TURB_HOR(D,CST,CSTURB,TURBN, & + CALL TURB_HOR(D,CST,CSTURB,TURBN,TLES, & JSPLT, KRR, KRRL, KRRI, PTSTEP, & KSV, KSV_LGBEG, KSV_LGEND, OFLAT,O2D, ONOMIXLG,& OOCEAN,OCOMPUTE_SRC,OBLOWSNOW, & @@ -391,7 +393,7 @@ IF (KSPLIT>1 .AND. HPROGRAM=='MESONH') THEN ! ! horizontal transport of Tke ! - CALL TURB_HOR_TKE(JSPLT,OFLAT,O2D, & + CALL TURB_HOR_TKE(JSPLT,TLES,OFLAT,O2D, & PDXX,PDYY,PDZZ,PDZX,PDZY, & ZINV_PDXX, ZINV_PDYY, ZINV_PDZZ, ZMZM_PRHODJ, & ZK, PRHODJ, ZTKEM, & @@ -513,7 +515,7 @@ IF (KSPLIT>1 .AND. HPROGRAM=='MESONH') THEN ! ELSE ! - CALL TURB_HOR(D,CST,CSTURB,TURBN, & + CALL TURB_HOR(D,CST,CSTURB,TURBN,TLES, & 1, KRR, KRRL, KRRI, PTSTEP, & KSV, KSV_LGBEG, KSV_LGEND, OFLAT,O2D, ONOMIXLG,& OOCEAN,OCOMPUTE_SRC,OBLOWSNOW, & @@ -535,7 +537,7 @@ ELSE ! horizontal transport of Tke ! - CALL TURB_HOR_TKE(1,OFLAT,O2D, & + CALL TURB_HOR_TKE(1,TLES,OFLAT,O2D, & PDXX,PDYY,PDZZ,PDZX,PDZY, & ZINV_PDXX, ZINV_PDYY, ZINV_PDZZ, ZMZM_PRHODJ, & ZK, PRHODJ, PTKEM, & diff --git a/src/common/turb/mode_turb_hor_sv_corr.F90 b/src/common/turb/mode_turb_hor_sv_corr.F90 index cd776d573299e3c8ef5071e39d3c0fee9c217bdc..1ebc83f7fdef805bfb4504376260aecb9009c9bb 100644 --- a/src/common/turb/mode_turb_hor_sv_corr.F90 +++ b/src/common/turb/mode_turb_hor_sv_corr.F90 @@ -5,7 +5,7 @@ MODULE MODE_TURB_HOR_SV_CORR IMPLICIT NONE CONTAINS - SUBROUTINE TURB_HOR_SV_CORR(D,CST,CSTURB,KSV,KSV_LGBEG,KSV_LGEND,& + SUBROUTINE TURB_HOR_SV_CORR(D,CST,CSTURB,TLES,KSV,KSV_LGBEG,KSV_LGEND,& KRR,KRRL,KRRI,OOCEAN,OCOMPUTE_SRC,OBLOWSNOW, & ONOMIXLG,O2D, & PDXX,PDYY,PDZZ,PDZX,PDZY,PRSNOW, & @@ -53,7 +53,7 @@ USE MODD_CST, ONLY: CST_t USE MODD_CTURB, ONLY : CSTURB_t USE MODD_DIMPHYEX, ONLY: DIMPHYEX_t USE MODD_PARAMETERS -USE MODD_LES +USE MODD_LES, ONLY: TLES_t ! USE MODI_GRADIENT_M USE MODI_GRADIENT_U @@ -76,6 +76,7 @@ IMPLICIT NONE TYPE(DIMPHYEX_t), INTENT(IN) :: D TYPE(CST_t), INTENT(IN) :: CST TYPE(CSTURB_t), INTENT(IN) :: CSTURB +TYPE(TLES_t), INTENT(INOUT) :: TLES ! modd_les structure INTEGER, INTENT(IN) :: KRR ! number of moist var. INTEGER, INTENT(IN) :: KRRL ! number of liquid var. INTEGER, INTENT(IN) :: KRRI ! number of ice var. @@ -137,7 +138,7 @@ DO JSV=1,KSV ! ! variance Sv2 ! - IF (LLES_CALL) THEN + IF (TLES%LLES_CALL) THEN IF (.NOT. O2D) THEN ZFLX(:,:,:) = ZCSV / ZCSVD * PLM(:,:,:) * PLEPS(:,:,:) * & ( GX_M_M(PSVM(:,:,:,JSV),PDXX,PDZZ,PDZX)**2 & @@ -147,13 +148,13 @@ DO JSV=1,KSV GX_M_M(PSVM(:,:,:,JSV),PDXX,PDZZ,PDZX)**2 END IF CALL LES_MEAN_SUBGRID( -2.*ZCSVD*SQRT(PTKEM)*ZFLX/PLEPS, & - X_LES_SUBGRID_DISS_Sv2(:,:,:,JSV), .TRUE. ) - CALL LES_MEAN_SUBGRID( MZF(PWM)*ZFLX, X_LES_RES_W_SBG_Sv2(:,:,:,JSV), .TRUE. ) + TLES%X_LES_SUBGRID_DISS_Sv2(:,:,:,JSV), .TRUE. ) + CALL LES_MEAN_SUBGRID( MZF(PWM)*ZFLX, TLES%X_LES_RES_W_SBG_Sv2(:,:,:,JSV), .TRUE. ) END IF ! ! covariance SvThv ! - IF (LLES_CALL) THEN + IF (TLES%LLES_CALL) THEN CALL ETHETA(D,CST,KRR,KRRI,PTHLM,PRM,PLOCPEXNM,PATHETA,PSRCM,OOCEAN,OCOMPUTE_SRC,ZA) IF (.NOT. O2D) THEN ZFLX(:,:,:)= PLM(:,:,:) * PLEPS(:,:,:) & @@ -165,8 +166,8 @@ DO JSV=1,KSV * GX_M_M(PTHLM,PDXX,PDZZ,PDZX) * GX_M_M(PSVM(:,:,:,JSV),PDXX,PDZZ,PDZX) & * (CSTURB%XCSHF+ZCSV) / (2.*ZCTSVD) END IF - CALL LES_MEAN_SUBGRID( ZA*ZFLX, X_LES_SUBGRID_SvThv(:,:,:,JSV) , .TRUE.) - CALL LES_MEAN_SUBGRID( -CST%XG/PTHVREF/3.*ZA*ZFLX, X_LES_SUBGRID_SvPz(:,:,:,JSV), .TRUE. ) + CALL LES_MEAN_SUBGRID( ZA*ZFLX, TLES%X_LES_SUBGRID_SvThv(:,:,:,JSV) , .TRUE.) + CALL LES_MEAN_SUBGRID( -CST%XG/PTHVREF/3.*ZA*ZFLX, TLES%X_LES_SUBGRID_SvPz(:,:,:,JSV), .TRUE. ) ! IF (KRR>=1) THEN CALL EMOIST(D,CST,KRR,KRRI,PTHLM,PRM,PLOCPEXNM,PAMOIST,PSRCM,OOCEAN,ZA) @@ -180,15 +181,15 @@ DO JSV=1,KSV * GX_M_M(PRM(:,:,:,1),PDXX,PDZZ,PDZX) * GX_M_M(PSVM(:,:,:,JSV),PDXX,PDZZ,PDZX) & * (CSTURB%XCHF+ZCSV) / (2.*ZCQSVD) END IF - CALL LES_MEAN_SUBGRID( ZA*ZFLX, X_LES_SUBGRID_SvThv(:,:,:,JSV) , .TRUE.) - CALL LES_MEAN_SUBGRID( -CST%XG/PTHVREF/3.*ZA*ZFLX, X_LES_SUBGRID_SvPz(:,:,:,JSV), .TRUE. ) + CALL LES_MEAN_SUBGRID( ZA*ZFLX, TLES%X_LES_SUBGRID_SvThv(:,:,:,JSV) , .TRUE.) + CALL LES_MEAN_SUBGRID( -CST%XG/PTHVREF/3.*ZA*ZFLX, TLES%X_LES_SUBGRID_SvPz(:,:,:,JSV), .TRUE. ) END IF END IF ! END DO ! end loop JSV ! CALL SECOND_MNH(ZTIME2) -XTIME_LES = XTIME_LES + ZTIME2 - ZTIME1 +TLES%XTIME_LES = TLES%XTIME_LES + ZTIME2 - ZTIME1 ! END SUBROUTINE TURB_HOR_SV_CORR END MODULE MODE_TURB_HOR_SV_CORR diff --git a/src/common/turb/mode_turb_hor_sv_flux.F90 b/src/common/turb/mode_turb_hor_sv_flux.F90 index a53b160b900286be9024b98d0d36d1698712f768..ae50bb870a833b4b7553d7eb95c33ba992679fcd 100644 --- a/src/common/turb/mode_turb_hor_sv_flux.F90 +++ b/src/common/turb/mode_turb_hor_sv_flux.F90 @@ -6,7 +6,7 @@ MODULE MODE_TURB_HOR_SV_FLUX IMPLICIT NONE CONTAINS - SUBROUTINE TURB_HOR_SV_FLUX(TURBN,KSPLT,OBLOWSNOW,OFLAT, & + SUBROUTINE TURB_HOR_SV_FLUX(TURBN,TLES,KSPLT,OBLOWSNOW,OFLAT, & TPFILE,KSV_LGBEG,KSV_LGEND,O2D,ONOMIXLG, & PK,PINV_PDXX,PINV_PDYY,PINV_PDZZ,PMZM_PRHODJ, & PDXX,PDYY,PDZZ,PDZX,PDZY,PRSNOW, & @@ -66,7 +66,7 @@ USE MODD_CTURB USE MODD_FIELD, ONLY: TFIELDDATA, TYPEREAL USE MODD_IO, ONLY: TFILEDATA USE MODD_PARAMETERS -USE MODD_LES +USE MODD_LES, ONLY: TLES_t ! USE MODE_IO_FIELD_WRITE, ONLY: IO_FIELD_WRITE ! @@ -88,6 +88,7 @@ IMPLICIT NONE ! ! TYPE(TURB_t), INTENT(IN) :: TURBN +TYPE(TLES_t), INTENT(INOUT) :: TLES ! modd_les structure INTEGER, INTENT(IN) :: KSPLT ! split process index TYPE(TFILEDATA), INTENT(IN) :: TPFILE ! Output file INTEGER, INTENT(IN) :: KSV_LGBEG,KSV_LGEND ! number of sv var. @@ -214,15 +215,15 @@ DO JSV=1,ISV CALL IO_FIELD_WRITE(TPFILE,TZFIELD,ZFLXX) END IF ! - IF (LLES_CALL .AND. KSPLT==1) THEN + IF (TLES%LLES_CALL .AND. KSPLT==1) THEN CALL SECOND_MNH(ZTIME1) - CALL LES_MEAN_SUBGRID( MXF(ZFLXX), X_LES_SUBGRID_USv(:,:,:,JSV) ) + CALL LES_MEAN_SUBGRID( MXF(ZFLXX), TLES%X_LES_SUBGRID_USv(:,:,:,JSV) ) CALL LES_MEAN_SUBGRID( MZF(MXF(GX_W_UW(PWM,PDXX,PDZZ,PDZX)*MZM(ZFLXX))), & - X_LES_RES_ddxa_W_SBG_UaSv(:,:,:,JSV) , .TRUE. ) + TLES%X_LES_RES_ddxa_W_SBG_UaSv(:,:,:,JSV) , .TRUE. ) CALL LES_MEAN_SUBGRID( GX_M_M(PSVM(:,:,:,JSV),PDXX,PDZZ,PDZX)*MXF(ZFLXX), & - X_LES_RES_ddxa_Sv_SBG_UaSv(:,:,:,JSV), .TRUE. ) + TLES%X_LES_RES_ddxa_Sv_SBG_UaSv(:,:,:,JSV), .TRUE. ) CALL SECOND_MNH(ZTIME2) - XTIME_LES = XTIME_LES + ZTIME2 - ZTIME1 + TLES%XTIME_LES = TLES%XTIME_LES + ZTIME2 - ZTIME1 END IF ! ! 15.2 <V' SVth'> @@ -269,15 +270,15 @@ DO JSV=1,ISV ZFLXY=0. END IF ! - IF (LLES_CALL .AND. KSPLT==1) THEN + IF (TLES%LLES_CALL .AND. KSPLT==1) THEN CALL SECOND_MNH(ZTIME1) - CALL LES_MEAN_SUBGRID( MYF(ZFLXY), X_LES_SUBGRID_VSv(:,:,:,JSV) ) + CALL LES_MEAN_SUBGRID( MYF(ZFLXY), TLES%X_LES_SUBGRID_VSv(:,:,:,JSV) ) CALL LES_MEAN_SUBGRID( MZF(MYF(GY_W_VW(PWM,PDYY,PDZZ,PDZY)*MZM(ZFLXY))), & - X_LES_RES_ddxa_W_SBG_UaSv(:,:,:,JSV) , .TRUE. ) + TLES%X_LES_RES_ddxa_W_SBG_UaSv(:,:,:,JSV) , .TRUE. ) CALL LES_MEAN_SUBGRID( GY_M_M(PSVM(:,:,:,JSV),PDYY,PDZZ,PDZY)*MYF(ZFLXY), & - X_LES_RES_ddxa_Sv_SBG_UaSv(:,:,:,JSV) , .TRUE. ) + TLES%X_LES_RES_ddxa_Sv_SBG_UaSv(:,:,:,JSV) , .TRUE. ) CALL SECOND_MNH(ZTIME2) - XTIME_LES = XTIME_LES + ZTIME2 - ZTIME1 + TLES%XTIME_LES = TLES%XTIME_LES + ZTIME2 - ZTIME1 END IF ! ! diff --git a/src/common/turb/mode_turb_hor_thermo_corr.F90 b/src/common/turb/mode_turb_hor_thermo_corr.F90 index 6e724513e414f6d1f4ffc9b0cbc850270a6e5cb0..33d7fbd4949741c7ebd0fcf6051fed4fb7723692 100644 --- a/src/common/turb/mode_turb_hor_thermo_corr.F90 +++ b/src/common/turb/mode_turb_hor_thermo_corr.F90 @@ -6,7 +6,7 @@ MODULE MODE_TURB_HOR_THERMO_CORR IMPLICIT NONE CONTAINS - SUBROUTINE TURB_HOR_THERMO_CORR(D,CST,TURBN, & + SUBROUTINE TURB_HOR_THERMO_CORR(D,CST,TURBN,TLES, & KRR, KRRL, KRRI, & OOCEAN,OCOMPUTE_SRC, & TPFILE, & @@ -67,7 +67,7 @@ USE MODD_DIMPHYEX, ONLY: DIMPHYEX_t USE MODD_TURB_n, ONLY: TURB_t USE MODD_IO, ONLY: TFILEDATA USE MODD_PARAMETERS -USE MODD_LES +USE MODD_LES, ONLY: TLES_t ! USE MODE_IO_FIELD_WRITE, ONLY: IO_FIELD_WRITE ! @@ -93,6 +93,7 @@ IMPLICIT NONE TYPE(DIMPHYEX_t), INTENT(IN) :: D TYPE(CST_t), INTENT(IN) :: CST TYPE(TURB_t), INTENT(IN) :: TURBN +TYPE(TLES_t), INTENT(INOUT):: TLES ! modd_les structure 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. @@ -169,7 +170,7 @@ ZCOEFF(:,:,IKB)= - (PDZZ(:,:,IKB+2)+2.*PDZZ(:,:,IKB+1)) / & ! ! IF ( ( KRRL > 0 .AND. TURBN%LSUBG_COND) .OR. ( TURBN%LTURB_FLX .AND. TPFILE%LOPENED ) & - .OR. ( LLES_CALL ) ) THEN + .OR. ( TLES%LLES_CALL ) ) THEN ! !* 8.1 <THl THl> ! @@ -225,16 +226,16 @@ IF ( ( KRRL > 0 .AND. TURBN%LSUBG_COND) .OR. ( TURBN%LTURB_FLX .AND. TPFILE%LOPE ! ! Storage in the LES configuration (addition to TURB_VER computation) ! - IF (LLES_CALL) THEN + IF (TLES%LLES_CALL) THEN CALL SECOND_MNH(ZTIME1) - CALL LES_MEAN_SUBGRID( ZFLX, X_LES_SUBGRID_Thl2, .TRUE. ) - CALL LES_MEAN_SUBGRID( MZF(PWM)*ZFLX, X_LES_RES_W_SBG_Thl2, .TRUE. ) - CALL LES_MEAN_SUBGRID( -2.*XCTD*SQRT(PTKEM)*ZFLX/PLEPS ,X_LES_SUBGRID_DISS_Thl2, .TRUE. ) + CALL LES_MEAN_SUBGRID( ZFLX, TLES%X_LES_SUBGRID_Thl2, .TRUE. ) + CALL LES_MEAN_SUBGRID( MZF(PWM)*ZFLX, TLES%X_LES_RES_W_SBG_Thl2, .TRUE. ) + CALL LES_MEAN_SUBGRID( -2.*XCTD*SQRT(PTKEM)*ZFLX/PLEPS ,TLES%X_LES_SUBGRID_DISS_Thl2, .TRUE. ) CALL ETHETA(D,CST,KRR,KRRI,PTHLM,PRM,PLOCPEXNM,PATHETA,PSRCM,OOCEAN,OCOMPUTE_SRC,ZA) - CALL LES_MEAN_SUBGRID( ZA*ZFLX, X_LES_SUBGRID_ThlThv, .TRUE. ) - CALL LES_MEAN_SUBGRID( -CST%XG/PTHVREF/3.*ZA*ZFLX, X_LES_SUBGRID_ThlPz, .TRUE. ) + CALL LES_MEAN_SUBGRID( ZA*ZFLX, TLES%X_LES_SUBGRID_ThlThv, .TRUE. ) + CALL LES_MEAN_SUBGRID( -CST%XG/PTHVREF/3.*ZA*ZFLX, TLES%X_LES_SUBGRID_ThlPz, .TRUE. ) CALL SECOND_MNH(ZTIME2) - XTIME_LES = XTIME_LES + ZTIME2 - ZTIME1 + TLES%XTIME_LES = TLES%XTIME_LES + ZTIME2 - ZTIME1 END IF ! IF ( KRR /= 0 ) THEN @@ -313,18 +314,18 @@ IF ( ( KRRL > 0 .AND. TURBN%LSUBG_COND) .OR. ( TURBN%LTURB_FLX .AND. TPFILE%LOPE ! ! Storage in the LES configuration (addition to TURB_VER computation) ! - IF (LLES_CALL) THEN + IF (TLES%LLES_CALL) THEN CALL SECOND_MNH(ZTIME1) - CALL LES_MEAN_SUBGRID( ZFLX, X_LES_SUBGRID_ThlRt, .TRUE. ) - CALL LES_MEAN_SUBGRID( MZF(PWM)*ZFLX, X_LES_RES_W_SBG_ThlRt, .TRUE. ) - CALL LES_MEAN_SUBGRID( -XCTD*SQRT(PTKEM)*ZFLX/PLEPS ,X_LES_SUBGRID_DISS_ThlRt, .TRUE. ) - CALL LES_MEAN_SUBGRID( ZA*ZFLX, X_LES_SUBGRID_RtThv, .TRUE. ) - CALL LES_MEAN_SUBGRID( -CST%XG/PTHVREF/3.*ZA*ZFLX, X_LES_SUBGRID_RtPz,.TRUE.) + CALL LES_MEAN_SUBGRID( ZFLX, TLES%X_LES_SUBGRID_ThlRt, .TRUE. ) + CALL LES_MEAN_SUBGRID( MZF(PWM)*ZFLX, TLES%X_LES_RES_W_SBG_ThlRt, .TRUE. ) + CALL LES_MEAN_SUBGRID( -XCTD*SQRT(PTKEM)*ZFLX/PLEPS ,TLES%X_LES_SUBGRID_DISS_ThlRt, .TRUE. ) + CALL LES_MEAN_SUBGRID( ZA*ZFLX, TLES%X_LES_SUBGRID_RtThv, .TRUE. ) + CALL LES_MEAN_SUBGRID( -CST%XG/PTHVREF/3.*ZA*ZFLX, TLES%X_LES_SUBGRID_RtPz,.TRUE.) CALL EMOIST(D,CST,KRR,KRRI,PTHLM,PRM,PLOCPEXNM,PAMOIST,PSRCM,OOCEAN,ZA) - CALL LES_MEAN_SUBGRID( ZA*ZFLX, X_LES_SUBGRID_ThlThv, .TRUE. ) - CALL LES_MEAN_SUBGRID( -CST%XG/PTHVREF/3.*ZA*ZFLX, X_LES_SUBGRID_ThlPz,.TRUE.) + CALL LES_MEAN_SUBGRID( ZA*ZFLX, TLES%X_LES_SUBGRID_ThlThv, .TRUE. ) + CALL LES_MEAN_SUBGRID( -CST%XG/PTHVREF/3.*ZA*ZFLX, TLES%X_LES_SUBGRID_ThlPz,.TRUE.) CALL SECOND_MNH(ZTIME2) - XTIME_LES = XTIME_LES + ZTIME2 - ZTIME1 + TLES%XTIME_LES = TLES%XTIME_LES + ZTIME2 - ZTIME1 END IF ! !* 8.4 <Rnp Rnp> @@ -381,15 +382,15 @@ IF ( ( KRRL > 0 .AND. TURBN%LSUBG_COND) .OR. ( TURBN%LTURB_FLX .AND. TPFILE%LOPE ! ! Storage in the LES configuration (addition to TURB_VER computation) ! - IF (LLES_CALL) THEN + IF (TLES%LLES_CALL) THEN CALL SECOND_MNH(ZTIME1) - CALL LES_MEAN_SUBGRID( ZFLX, X_LES_SUBGRID_Rt2, .TRUE. ) - CALL LES_MEAN_SUBGRID( MZF(PWM)*ZFLX, X_LES_RES_W_SBG_Rt2, .TRUE. ) - CALL LES_MEAN_SUBGRID( ZA*ZFLX, X_LES_SUBGRID_RtThv, .TRUE. ) - CALL LES_MEAN_SUBGRID( -CST%XG/PTHVREF/3.*ZA*ZFLX, X_LES_SUBGRID_RtPz,.TRUE.) - CALL LES_MEAN_SUBGRID( -2.*XCTD*SQRT(PTKEM)*ZFLX/PLEPS, X_LES_SUBGRID_DISS_Rt2, .TRUE. ) + CALL LES_MEAN_SUBGRID( ZFLX, TLES%X_LES_SUBGRID_Rt2, .TRUE. ) + CALL LES_MEAN_SUBGRID( MZF(PWM)*ZFLX, TLES%X_LES_RES_W_SBG_Rt2, .TRUE. ) + CALL LES_MEAN_SUBGRID( ZA*ZFLX, TLES%X_LES_SUBGRID_RtThv, .TRUE. ) + CALL LES_MEAN_SUBGRID( -CST%XG/PTHVREF/3.*ZA*ZFLX, TLES%X_LES_SUBGRID_RtPz,.TRUE.) + CALL LES_MEAN_SUBGRID( -2.*XCTD*SQRT(PTKEM)*ZFLX/PLEPS, TLES%X_LES_SUBGRID_DISS_Rt2, .TRUE. ) CALL SECOND_MNH(ZTIME2) - XTIME_LES = XTIME_LES + ZTIME2 - ZTIME1 + TLES%XTIME_LES = TLES%XTIME_LES + ZTIME2 - ZTIME1 END IF ! 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 b28fa9996105e15d9ddfd692a4c485245b060ec1..93313669a3ffc01ca0ddf57ed8b0a999e541259f 100644 --- a/src/common/turb/mode_turb_hor_thermo_flux.F90 +++ b/src/common/turb/mode_turb_hor_thermo_flux.F90 @@ -7,7 +7,7 @@ MODULE MODE_TURB_HOR_THERMO_FLUX IMPLICIT NONE CONTAINS ! ################################################################ - SUBROUTINE TURB_HOR_THERMO_FLUX(TURBN, KSPLT, KRR, KRRL, KRRI, & + SUBROUTINE TURB_HOR_THERMO_FLUX(TURBN, TLES,KSPLT, KRR, KRRL, KRRI, & TPFILE,OFLAT,O2D, & PK,PINV_PDXX,PINV_PDYY,PINV_PDZZ,PMZM_PRHODJ, & PDXX,PDYY,PDZZ,PDZX,PDZY, & @@ -68,7 +68,7 @@ USE MODD_CTURB USE MODD_FIELD, ONLY: TFIELDDATA, TYPEREAL USE MODD_IO, ONLY: TFILEDATA USE MODD_PARAMETERS -USE MODD_LES +USE MODD_LES, ONLY: TLES_t ! USE MODE_IO_FIELD_WRITE, ONLY: IO_FIELD_WRITE ! @@ -91,6 +91,7 @@ IMPLICIT NONE ! ! TYPE(TURB_t), INTENT(IN) :: TURBN +TYPE(TLES_t), INTENT(INOUT) :: TLES ! modd_les structure INTEGER, INTENT(IN) :: KSPLT ! split process index INTEGER, INTENT(IN) :: KRR ! number of moist var. INTEGER, INTENT(IN) :: KRRL ! number of liquid water var. @@ -258,19 +259,19 @@ IF ( TPFILE%LOPENED .AND. TURBN%LTURB_FLX ) THEN CALL IO_FIELD_WRITE(TPFILE,TZFIELD,ZFLX) END IF ! -IF (KSPLT==1 .AND. LLES_CALL) THEN +IF (KSPLT==1 .AND. TLES%LLES_CALL) THEN CALL SECOND_MNH(ZTIME1) - CALL LES_MEAN_SUBGRID( MXF(ZFLX), X_LES_SUBGRID_UThl ) + CALL LES_MEAN_SUBGRID( MXF(ZFLX), TLES%X_LES_SUBGRID_UThl ) CALL LES_MEAN_SUBGRID( MZF(MXF(GX_W_UW(PWM,PDXX,PDZZ,PDZX)*MZM(ZFLX))),& - X_LES_RES_ddxa_W_SBG_UaThl , .TRUE. ) + TLES%X_LES_RES_ddxa_W_SBG_UaThl , .TRUE. ) CALL LES_MEAN_SUBGRID( GX_M_M(PTHLM,PDXX,PDZZ,PDZX)*MXF(ZFLX),& - X_LES_RES_ddxa_Thl_SBG_UaThl , .TRUE. ) + TLES%X_LES_RES_ddxa_Thl_SBG_UaThl , .TRUE. ) IF (KRR>=1) THEN CALL LES_MEAN_SUBGRID( GX_M_M(PRM(:,:,:,1),PDXX,PDZZ,PDZX)*MXF(ZFLX), & - X_LES_RES_ddxa_Rt_SBG_UaThl , .TRUE. ) + TLES%X_LES_RES_ddxa_Rt_SBG_UaThl , .TRUE. ) END IF CALL SECOND_MNH(ZTIME2) - XTIME_LES = XTIME_LES + ZTIME2 - ZTIME1 + TLES%XTIME_LES = TLES%XTIME_LES + ZTIME2 - ZTIME1 END IF ! !* 3. < U' R'np > @@ -361,25 +362,25 @@ IF (KRR/=0) THEN CALL IO_FIELD_WRITE(TPFILE,TZFIELD,ZFLX) END IF ! - IF (KSPLT==1 .AND. LLES_CALL) THEN + IF (KSPLT==1 .AND. TLES%LLES_CALL) THEN CALL SECOND_MNH(ZTIME1) - CALL LES_MEAN_SUBGRID( MXF(ZFLX), X_LES_SUBGRID_URt ) + CALL LES_MEAN_SUBGRID( MXF(ZFLX), TLES%X_LES_SUBGRID_URt ) CALL LES_MEAN_SUBGRID( MZF(MXF(GX_W_UW(PWM,PDXX,PDZZ,PDZX)*MZM(ZFLX))),& - X_LES_RES_ddxa_W_SBG_UaRt , .TRUE. ) + TLES%X_LES_RES_ddxa_W_SBG_UaRt , .TRUE. ) CALL LES_MEAN_SUBGRID( GX_M_M(PTHLM,PDXX,PDZZ,PDZX)*MXF(ZFLX),& - X_LES_RES_ddxa_Thl_SBG_UaRt , .TRUE. ) + TLES%X_LES_RES_ddxa_Thl_SBG_UaRt , .TRUE. ) CALL LES_MEAN_SUBGRID( GX_M_M(PRM(:,:,:,1),PDXX,PDZZ,PDZX)*MXF(ZFLX),& - X_LES_RES_ddxa_Rt_SBG_UaRt , .TRUE. ) + TLES%X_LES_RES_ddxa_Rt_SBG_UaRt , .TRUE. ) CALL SECOND_MNH(ZTIME2) - XTIME_LES = XTIME_LES + ZTIME2 - ZTIME1 + TLES%XTIME_LES = TLES%XTIME_LES + ZTIME2 - ZTIME1 END IF ! ! - IF (KRRL>0 .AND. KSPLT==1 .AND. LLES_CALL) THEN + IF (KRRL>0 .AND. KSPLT==1 .AND. TLES%LLES_CALL) THEN CALL SECOND_MNH(ZTIME1) - CALL LES_MEAN_SUBGRID(MXF(ZFLXC), X_LES_SUBGRID_URc ) + CALL LES_MEAN_SUBGRID(MXF(ZFLXC), TLES%X_LES_SUBGRID_URc ) CALL SECOND_MNH(ZTIME2) - XTIME_LES = XTIME_LES + ZTIME2 - ZTIME1 + TLES%XTIME_LES = TLES%XTIME_LES + ZTIME2 - ZTIME1 END IF ! END IF @@ -513,19 +514,19 @@ IF ( TPFILE%LOPENED .AND. TURBN%LTURB_FLX ) THEN CALL IO_FIELD_WRITE(TPFILE,TZFIELD,ZFLX) END IF ! -IF (KSPLT==1 .AND. LLES_CALL) THEN +IF (KSPLT==1 .AND. TLES%LLES_CALL) THEN CALL SECOND_MNH(ZTIME1) - CALL LES_MEAN_SUBGRID( MYF(ZFLX), X_LES_SUBGRID_VThl ) + CALL LES_MEAN_SUBGRID( MYF(ZFLX), TLES%X_LES_SUBGRID_VThl ) CALL LES_MEAN_SUBGRID( MZF(MYF(GY_W_VW(PWM,PDYY,PDZZ,PDZY)*MZM(ZFLX))),& - X_LES_RES_ddxa_W_SBG_UaThl , .TRUE. ) + TLES%X_LES_RES_ddxa_W_SBG_UaThl , .TRUE. ) CALL LES_MEAN_SUBGRID( GY_M_M(PTHLM,PDYY,PDZZ,PDZY)*MYF(ZFLX),& - X_LES_RES_ddxa_Thl_SBG_UaThl , .TRUE. ) + TLES%X_LES_RES_ddxa_Thl_SBG_UaThl , .TRUE. ) IF (KRR>=1) THEN CALL LES_MEAN_SUBGRID( GY_M_M(PRM(:,:,:,1),PDYY,PDZZ,PDZY)*MYF(ZFLX),& - X_LES_RES_ddxa_Rt_SBG_UaThl , .TRUE. ) + TLES%X_LES_RES_ddxa_Rt_SBG_UaThl , .TRUE. ) END IF CALL SECOND_MNH(ZTIME2) - XTIME_LES = XTIME_LES + ZTIME2 - ZTIME1 + TLES%XTIME_LES = TLES%XTIME_LES + ZTIME2 - ZTIME1 END IF ! ! @@ -625,25 +626,25 @@ IF (KRR/=0) THEN CALL IO_FIELD_WRITE(TPFILE,TZFIELD,ZFLX) END IF ! - IF (KSPLT==1 .AND. LLES_CALL) THEN + IF (KSPLT==1 .AND. TLES%LLES_CALL) THEN CALL SECOND_MNH(ZTIME1) - CALL LES_MEAN_SUBGRID( MYF(ZFLX), X_LES_SUBGRID_VRt ) + CALL LES_MEAN_SUBGRID( MYF(ZFLX), TLES%X_LES_SUBGRID_VRt ) CALL LES_MEAN_SUBGRID( MZF(MYF(GY_W_VW(PWM,PDYY,PDZZ,PDZY)*MZM(ZFLX))),& - X_LES_RES_ddxa_W_SBG_UaRt , .TRUE. ) + TLES%X_LES_RES_ddxa_W_SBG_UaRt , .TRUE. ) CALL LES_MEAN_SUBGRID( GY_M_M(PTHLM,PDYY,PDZZ,PDZY)*MYF(ZFLX), & - X_LES_RES_ddxa_Thl_SBG_UaRt , .TRUE. ) + TLES%X_LES_RES_ddxa_Thl_SBG_UaRt , .TRUE. ) CALL LES_MEAN_SUBGRID( GY_M_M(PRM(:,:,:,1),PDYY,PDZZ,PDZY)*MYF(ZFLX), & - X_LES_RES_ddxa_Rt_SBG_UaRt , .TRUE. ) + TLES%X_LES_RES_ddxa_Rt_SBG_UaRt , .TRUE. ) CALL SECOND_MNH(ZTIME2) - XTIME_LES = XTIME_LES + ZTIME2 - ZTIME1 + TLES%XTIME_LES = TLES%XTIME_LES + ZTIME2 - ZTIME1 END IF ! ! - IF (KRRL>0 .AND. KSPLT==1 .AND. LLES_CALL) THEN + IF (KRRL>0 .AND. KSPLT==1 .AND. TLES%LLES_CALL) THEN CALL SECOND_MNH(ZTIME1) - CALL LES_MEAN_SUBGRID(MYF(ZFLXC), X_LES_SUBGRID_VRc ) + CALL LES_MEAN_SUBGRID(MYF(ZFLXC), TLES%X_LES_SUBGRID_VRc ) CALL SECOND_MNH(ZTIME2) - XTIME_LES = XTIME_LES + ZTIME2 - ZTIME1 + TLES%XTIME_LES = TLES%XTIME_LES + ZTIME2 - ZTIME1 END IF ! END IF diff --git a/src/common/turb/mode_turb_hor_tke.F90 b/src/common/turb/mode_turb_hor_tke.F90 index 5266601b269410b2a841beb684ceb9b96f7db3da..4c4006d546d34baf3d5640a4c1b515437fa7bc62 100644 --- a/src/common/turb/mode_turb_hor_tke.F90 +++ b/src/common/turb/mode_turb_hor_tke.F90 @@ -6,7 +6,7 @@ MODULE MODE_TURB_HOR_TKE IMPLICIT NONE CONTAINS - SUBROUTINE TURB_HOR_TKE(KSPLT,OFLAT,O2D, & + SUBROUTINE TURB_HOR_TKE(KSPLT,TLES,OFLAT,O2D, & PDXX, PDYY, PDZZ,PDZX,PDZY, & PINV_PDXX, PINV_PDYY, PINV_PDZZ, PMZM_PRHODJ, & PK, PRHODJ, PTKEM, & @@ -51,7 +51,7 @@ CONTAINS USE MODD_CST USE MODD_CTURB USE MODD_PARAMETERS -USE MODD_LES +USE MODD_LES, ONLY: TLES_t ! ! USE MODI_SHUMAN @@ -66,6 +66,7 @@ IMPLICIT NONE !* 0.1 declaration of arguments ! ! +TYPE(TLES_t), INTENT(INOUT) :: TLES ! modd_les structure INTEGER, INTENT(IN) :: KSPLT ! current split index LOGICAL, INTENT(IN) :: OFLAT ! Logical for zero ororography LOGICAL, INTENT(IN) :: O2D ! Logical for 2D model version (modd_conf) @@ -151,11 +152,11 @@ ELSE ) /PRHODJ END IF ! -IF (LLES_CALL .AND. KSPLT==1) THEN +IF (TLES%LLES_CALL .AND. KSPLT==1) THEN CALL SECOND_MNH(ZTIME1) - CALL LES_MEAN_SUBGRID( MXF(ZFLX), X_LES_SUBGRID_UTke ) + CALL LES_MEAN_SUBGRID( MXF(ZFLX), TLES%X_LES_SUBGRID_UTke ) CALL SECOND_MNH(ZTIME2) - XTIME_LES = XTIME_LES + ZTIME2 - ZTIME1 + TLES%XTIME_LES = TLES%XTIME_LES + ZTIME2 - ZTIME1 END IF ! ! @@ -198,11 +199,11 @@ IF (.NOT. O2D) THEN ) /PRHODJ END IF ! - IF (LLES_CALL .AND. KSPLT==1) THEN + IF (TLES%LLES_CALL .AND. KSPLT==1) THEN CALL SECOND_MNH(ZTIME1) - CALL LES_MEAN_SUBGRID( MYF(ZFLX), X_LES_SUBGRID_VTke ) + CALL LES_MEAN_SUBGRID( MYF(ZFLX), TLES%X_LES_SUBGRID_VTke ) CALL SECOND_MNH(ZTIME2) - XTIME_LES = XTIME_LES + ZTIME2 - ZTIME1 + TLES%XTIME_LES = TLES%XTIME_LES + ZTIME2 - ZTIME1 END IF ! END IF diff --git a/src/common/turb/mode_turb_hor_uv.F90 b/src/common/turb/mode_turb_hor_uv.F90 index fccdc2934e45df83ac2a8b0ae7522ebd34aae9a5..cd9a3f32a3147c77477cbd5c035ad92d62a56d75 100644 --- a/src/common/turb/mode_turb_hor_uv.F90 +++ b/src/common/turb/mode_turb_hor_uv.F90 @@ -7,7 +7,7 @@ MODULE MODE_TURB_HOR_UV IMPLICIT NONE CONTAINS ! ################################################################ - SUBROUTINE TURB_HOR_UV(TURBN,KSPLT,OFLAT,O2D, & + SUBROUTINE TURB_HOR_UV(TURBN,TLES,KSPLT,OFLAT,O2D, & TPFILE, & PK,PINV_PDXX,PINV_PDYY,PINV_PDZZ,PMZM_PRHODJ, & PDXX,PDYY,PDZZ,PDZX,PDZY, & @@ -65,7 +65,7 @@ USE MODD_CTURB USE MODD_FIELD, ONLY: TFIELDDATA, TYPEREAL USE MODD_IO, ONLY: TFILEDATA USE MODD_PARAMETERS -USE MODD_LES +USE MODD_LES, ONLY: TLES_t ! USE MODE_IO_FIELD_WRITE, ONLY: IO_FIELD_WRITE ! @@ -87,6 +87,7 @@ IMPLICIT NONE ! ! TYPE(TURB_t), INTENT(IN) :: TURBN +TYPE(TLES_t), INTENT(INOUT) :: TLES ! modd_les structure INTEGER, INTENT(IN) :: KSPLT ! split process index TYPE(TFILEDATA), INTENT(IN) :: TPFILE ! Output file LOGICAL, INTENT(IN) :: OFLAT ! Logical for zero ororography @@ -279,13 +280,13 @@ END IF ! ! Storage in the LES configuration ! -IF (LLES_CALL .AND. KSPLT==1) THEN +IF (TLES%LLES_CALL .AND. KSPLT==1) THEN CALL SECOND_MNH(ZTIME1) - CALL LES_MEAN_SUBGRID( MXF(MYF(ZFLX)), X_LES_SUBGRID_UV ) - CALL LES_MEAN_SUBGRID( MXF(MYF(GY_U_UV(PUM,PDYY,PDZZ,PDZY)*ZFLX)), X_LES_RES_ddxa_U_SBG_UaU , .TRUE.) - CALL LES_MEAN_SUBGRID( MXF(MYF(GX_V_UV(PVM,PDXX,PDZZ,PDZX)*ZFLX)), X_LES_RES_ddxa_V_SBG_UaV , .TRUE.) + CALL LES_MEAN_SUBGRID( MXF(MYF(ZFLX)), TLES%X_LES_SUBGRID_UV ) + CALL LES_MEAN_SUBGRID( MXF(MYF(GY_U_UV(PUM,PDYY,PDZZ,PDZY)*ZFLX)), TLES%X_LES_RES_ddxa_U_SBG_UaU , .TRUE.) + CALL LES_MEAN_SUBGRID( MXF(MYF(GX_V_UV(PVM,PDXX,PDZZ,PDZX)*ZFLX)), TLES%X_LES_RES_ddxa_V_SBG_UaV , .TRUE.) CALL SECOND_MNH(ZTIME2) - XTIME_LES = XTIME_LES + ZTIME2 - ZTIME1 + TLES%XTIME_LES = TLES%XTIME_LES + ZTIME2 - ZTIME1 END IF ! ! diff --git a/src/common/turb/mode_turb_hor_uw.F90 b/src/common/turb/mode_turb_hor_uw.F90 index d4a20a20bcc2b1fd6908811eaf995192b2e05e18..b13acfaa287d3038bec942634f4c1b85dcde385a 100644 --- a/src/common/turb/mode_turb_hor_uw.F90 +++ b/src/common/turb/mode_turb_hor_uw.F90 @@ -7,7 +7,7 @@ MODULE MODE_TURB_HOR_UW IMPLICIT NONE CONTAINS ! ################################################################ - SUBROUTINE TURB_HOR_UW(TURBN,KSPLT, & + SUBROUTINE TURB_HOR_UW(TURBN,TLES,KSPLT, & KRR,KSV,OFLAT, & TPFILE, & PK,PINV_PDXX,PINV_PDZZ,PMZM_PRHODJ, & @@ -69,7 +69,7 @@ USE MODD_CTURB USE MODD_FIELD, ONLY: TFIELDDATA, TYPEREAL USE MODD_IO, ONLY: TFILEDATA USE MODD_PARAMETERS -USE MODD_LES +USE MODD_LES, ONLY: TLES_t ! USE MODE_IO_FIELD_WRITE, ONLY: IO_FIELD_WRITE ! @@ -91,6 +91,7 @@ IMPLICIT NONE ! ! TYPE(TURB_t), INTENT(IN) :: TURBN +TYPE(TLES_t), INTENT(INOUT) :: TLES ! modd_les structure INTEGER, INTENT(IN) :: KSPLT ! split process index INTEGER, INTENT(IN) :: KRR ! number of moist var. INTEGER, INTENT(IN) :: KSV ! number of sv var. @@ -225,23 +226,23 @@ END IF ! ! Storage in the LES configuration (addition to TURB_VER computation) ! -IF (LLES_CALL .AND. KSPLT==1) THEN +IF (TLES%LLES_CALL .AND. KSPLT==1) THEN CALL SECOND_MNH(ZTIME1) - CALL LES_MEAN_SUBGRID( MZF(MXF(ZFLX)), X_LES_SUBGRID_WU , .TRUE. ) - CALL LES_MEAN_SUBGRID( MZF(MXF(GZ_U_UW(PUM,PDZZ)*ZFLX)), X_LES_RES_ddxa_U_SBG_UaU , .TRUE.) - CALL LES_MEAN_SUBGRID( MZF(MXF(GX_W_UW_PWM*ZFLX)), X_LES_RES_ddxa_W_SBG_UaW , .TRUE.) + CALL LES_MEAN_SUBGRID( MZF(MXF(ZFLX)), TLES%X_LES_SUBGRID_WU , .TRUE. ) + CALL LES_MEAN_SUBGRID( MZF(MXF(GZ_U_UW(PUM,PDZZ)*ZFLX)), TLES%X_LES_RES_ddxa_U_SBG_UaU , .TRUE.) + CALL LES_MEAN_SUBGRID( MZF(MXF(GX_W_UW_PWM*ZFLX)), TLES%X_LES_RES_ddxa_W_SBG_UaW , .TRUE.) CALL LES_MEAN_SUBGRID( MXF(GX_M_U(1,IKU,1,PTHLM,PDXX,PDZZ,PDZX)*MZF(ZFLX)),& - X_LES_RES_ddxa_Thl_SBG_UaW , .TRUE.) + TLES%X_LES_RES_ddxa_Thl_SBG_UaW , .TRUE.) IF (KRR>=1) THEN CALL LES_MEAN_SUBGRID( MXF(GX_M_U(1,IKU,1,PRM(:,:,:,1),PDXX,PDZZ,PDZX)*MZF(ZFLX)), & - X_LES_RES_ddxa_Rt_SBG_UaW , .TRUE.) + TLES%X_LES_RES_ddxa_Rt_SBG_UaW , .TRUE.) END IF DO JSV=1,KSV CALL LES_MEAN_SUBGRID( MXF(GX_M_U(1,IKU,1,PSVM(:,:,:,JSV),PDXX,PDZZ,PDZX)*MZF(ZFLX)), & - X_LES_RES_ddxa_Sv_SBG_UaW(:,:,:,JSV) , .TRUE.) + TLES%X_LES_RES_ddxa_Sv_SBG_UaW(:,:,:,JSV) , .TRUE.) END DO CALL SECOND_MNH(ZTIME2) - XTIME_LES = XTIME_LES + ZTIME2 - ZTIME1 + TLES%XTIME_LES = TLES%XTIME_LES + ZTIME2 - ZTIME1 END IF ! diff --git a/src/common/turb/mode_turb_hor_vw.F90 b/src/common/turb/mode_turb_hor_vw.F90 index 807e229c48abc8f90ea7a0800a9ea8c9decd5f44..196734ea63a19cd4b31ef7e735e9fc2a50c89104 100644 --- a/src/common/turb/mode_turb_hor_vw.F90 +++ b/src/common/turb/mode_turb_hor_vw.F90 @@ -6,7 +6,7 @@ MODULE MODE_TURB_HOR_VW IMPLICIT NONE CONTAINS - SUBROUTINE TURB_HOR_VW(TURBN,KSPLT, & + SUBROUTINE TURB_HOR_VW(TURBN,TLES,KSPLT, & KRR,KSV,OFLAT,O2D, & TPFILE, & PK,PINV_PDYY,PINV_PDZZ,PMZM_PRHODJ, & @@ -68,7 +68,7 @@ USE MODD_CTURB USE MODD_FIELD, ONLY: TFIELDDATA, TYPEREAL USE MODD_IO, ONLY: TFILEDATA USE MODD_PARAMETERS -USE MODD_LES +USE MODD_LES, ONLY: TLES_t ! USE MODE_IO_FIELD_WRITE, ONLY: IO_FIELD_WRITE ! @@ -90,6 +90,7 @@ IMPLICIT NONE ! ! TYPE(TURB_t), INTENT(IN) :: TURBN +TYPE(TLES_t), INTENT(INOUT) :: TLES ! modd_les structure INTEGER, INTENT(IN) :: KSPLT ! split process index INTEGER, INTENT(IN) :: KRR ! number of moist var. INTEGER, INTENT(IN) :: KSV ! number of sv var. @@ -234,25 +235,25 @@ END IF ! ! Storage in the LES configuration (addition to TURB_VER computation) ! -IF (LLES_CALL .AND. KSPLT==1) THEN +IF (TLES%LLES_CALL .AND. KSPLT==1) THEN CALL SECOND_MNH(ZTIME1) - CALL LES_MEAN_SUBGRID( MZF(MYF(ZFLX)), X_LES_SUBGRID_WV , .TRUE. ) + CALL LES_MEAN_SUBGRID( MZF(MYF(ZFLX)), TLES%X_LES_SUBGRID_WV , .TRUE. ) CALL LES_MEAN_SUBGRID( MZF(MYF(GZ_V_VW(PVM,PDZZ)*ZFLX)),& - X_LES_RES_ddxa_V_SBG_UaV , .TRUE.) + TLES%X_LES_RES_ddxa_V_SBG_UaV , .TRUE.) CALL LES_MEAN_SUBGRID( MZF(MYF(GY_W_VW(PWM,PDYY,PDZZ,PDZY)*ZFLX)),& - X_LES_RES_ddxa_W_SBG_UaW , .TRUE.) + TLES%X_LES_RES_ddxa_W_SBG_UaW , .TRUE.) CALL LES_MEAN_SUBGRID( MXF(GY_M_V(1,IKU,1,PTHLM,PDYY,PDZZ,PDZY)*MZF(ZFLX)),& - X_LES_RES_ddxa_Thl_SBG_UaW , .TRUE.) + TLES%X_LES_RES_ddxa_Thl_SBG_UaW , .TRUE.) IF (KRR>=1) THEN CALL LES_MEAN_SUBGRID( MXF(GY_M_V(1,IKU,1,PRM(:,:,:,1),PDYY,PDZZ,PDZY)*MZF(ZFLX)), & - X_LES_RES_ddxa_Rt_SBG_UaW , .TRUE.) + TLES%X_LES_RES_ddxa_Rt_SBG_UaW , .TRUE.) END IF DO JSV=1,KSV CALL LES_MEAN_SUBGRID( MXF(GY_M_V(1,IKU,1,PSVM(:,:,:,JSV),PDYY,PDZZ,PDZY)*MZF(ZFLX)), & - X_LES_RES_ddxa_Sv_SBG_UaW(:,:,:,JSV), .TRUE.) + TLES%X_LES_RES_ddxa_Sv_SBG_UaW(:,:,:,JSV), .TRUE.) END DO CALL SECOND_MNH(ZTIME2) - XTIME_LES = XTIME_LES + ZTIME2 - ZTIME1 + TLES%XTIME_LES = TLES%XTIME_LES + ZTIME2 - ZTIME1 END IF ! ! diff --git a/src/common/turb/mode_turb_ver.F90 b/src/common/turb/mode_turb_ver.F90 index fba0b8c272a56d73590dc84981c2475769402f54..f7726a4ac475080fbdebed93f1a8171af41a5e11 100644 --- a/src/common/turb/mode_turb_ver.F90 +++ b/src/common/turb/mode_turb_ver.F90 @@ -5,11 +5,11 @@ MODULE MODE_TURB_VER IMPLICIT NONE CONTAINS -SUBROUTINE TURB_VER(D,CST,CSTURB,TURBN,KRR,KRRL,KRRI,KGRADIENTS, & +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, & - OLES_CALL,OCOUPLES,OBLOWSNOW,PRSNOW, & + OCOUPLES,OBLOWSNOW,PRSNOW, & PTSTEP, TPFILE, & PDXX,PDYY,PDZZ,PDZX,PDZY,PDIRCOSZW,PZZ, & PCOSSLOPE,PSINSLOPE, & @@ -218,7 +218,7 @@ 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 +USE MODD_LES, ONLY: TLES_t USE MODD_TURB_n, ONLY: TURB_t ! USE MODE_EMOIST, ONLY: EMOIST @@ -244,6 +244,7 @@ TYPE(DIMPHYEX_t), INTENT(IN) :: D 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) :: KRRL ! number of liquid water var. @@ -253,7 +254,6 @@ LOGICAL, INTENT(IN) :: OOCEAN ! switch for Ocean model v LOGICAL, INTENT(IN) :: ODEEPOC ! activates sfc forcing for ideal ocean deep conv 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) :: OLES_CALL ! compute the LES diagnostics at current time-step LOGICAL, INTENT(IN) :: OCOUPLES ! switch to activate atmos-ocean LES version LOGICAL, INTENT(IN) :: OBLOWSNOW ! switch to activate pronostic blowing snow REAL, INTENT(IN) :: PRSNOW ! Ratio for diffusion coeff. scalar (blowing snow) @@ -469,14 +469,14 @@ CALL PSI_SV(D,CSTURB,KSV,ZREDTH1,ZREDR1,ZREDS1,ZRED2THS,ZRED2RS,ZPHI3,ZPSI3,ZPSI ! ! LES diagnostics ! -IF (OLES_CALL) THEN +IF (TLES%LLES_CALL) THEN CALL SECOND_MNH(ZTIME1) - CALL LES_MEAN_SUBGRID_PHY(D,ZPHI3,X_LES_SUBGRID_PHI3) + CALL LES_MEAN_SUBGRID_PHY(D,TLES,ZPHI3,TLES%X_LES_SUBGRID_PHI3) IF(KRR/=0) THEN - CALL LES_MEAN_SUBGRID_PHY(D,ZPSI3,X_LES_SUBGRID_PSI3) + CALL LES_MEAN_SUBGRID_PHY(D,TLES,ZPSI3,TLES%X_LES_SUBGRID_PSI3) END IF CALL SECOND_MNH(ZTIME2) - XTIME_LES = XTIME_LES + ZTIME2 - ZTIME1 + TLES%XTIME_LES = TLES%XTIME_LES + ZTIME2 - ZTIME1 END IF !---------------------------------------------------------------------------- ! @@ -499,10 +499,10 @@ ELSE ZLM(:,:)=PLM(:,:) ENDIF ! - CALL TURB_VER_THERMO_FLUX(D,CST,CSTURB,TURBN, & + CALL TURB_VER_THERMO_FLUX(D,CST,CSTURB,TURBN,TLES, & KRR,KRRL,KRRI,KSV,KGRADIENTS, & OOCEAN,ODEEPOC, & - OCOUPLES,OLES_CALL,OCOMPUTE_SRC, & + OCOUPLES,OCOMPUTE_SRC, & PEXPL,PTSTEP,HPROGRAM,TPFILE, & PDXX,PDYY,PDZZ,PDZX,PDZY,PDIRCOSZW,PZZ, & PRHODJ,PTHVREF,PHGRAD,PZS, & @@ -518,10 +518,10 @@ ENDIF PRTHLS,PRRS,ZTHLP,ZRP,PTP,PWTH,PWRC, & PSSTFL, PSSTFL_C, PSSRFL_C ) ! - CALL TURB_VER_THERMO_CORR(D,CST,CSTURB,TURBN, & + CALL TURB_VER_THERMO_CORR(D,CST,CSTURB,TURBN,TLES, & KRR,KRRL,KRRI,KSV, & OCOMPUTE_SRC, & - OCOUPLES,OLES_CALL, & + OCOUPLES, & PEXPL,TPFILE, & PDXX,PDYY,PDZZ,PDZX,PDZY,PDIRCOSZW, & PRHODJ,PTHVREF, & @@ -551,8 +551,8 @@ ENDIF ! IF (TURBN%LHARAT) ZLM(:,:)=PLENGTHM(:,:) ! -CALL TURB_VER_DYN_FLUX(D,CST,CSTURB,TURBN,KSV,O2D,OFLAT, & - KRR,OOCEAN,OCOUPLES,OLES_CALL, & +CALL TURB_VER_DYN_FLUX(D,CST,CSTURB,TURBN,TLES,KSV,O2D,OFLAT, & + KRR,OOCEAN,OCOUPLES, & PEXPL,PTSTEP,TPFILE, & PDXX,PDYY,PDZZ,PDZX,PDZY,PDIRCOSZW,PZZ, & PCOSSLOPE,PSINSLOPE, & @@ -572,9 +572,9 @@ CALL TURB_VER_DYN_FLUX(D,CST,CSTURB,TURBN,KSV,O2D,OFLAT, & IF (TURBN%LHARAT) ZLM(:,:)=PLENGTHH(:,:) ! IF (KSV>0) & -CALL TURB_VER_SV_FLUX(D,CST,CSTURB,TURBN,ONOMIXLG, & +CALL TURB_VER_SV_FLUX(D,CST,CSTURB,TURBN,TLES,ONOMIXLG, & KSV,KSV_LGBEG,KSV_LGEND, & - OBLOWSNOW,OLES_CALL, & + OBLOWSNOW, & PEXPL,PTSTEP,TPFILE,PRSNOW, & PDZZ,PDIRCOSZW, & PRHODJ,PWM, & @@ -584,10 +584,10 @@ CALL TURB_VER_SV_FLUX(D,CST,CSTURB,TURBN,ONOMIXLG, & PRSVS,PWSV ) ! ! -IF (KSV>0 .AND. OLES_CALL) & -CALL TURB_VER_SV_CORR(D,CST,CSTURB,KRR,KRRL,KRRI,OOCEAN, & +IF (KSV>0 .AND. TLES%LLES_CALL) & +CALL TURB_VER_SV_CORR(D,CST,CSTURB,TLES,KRR,KRRL,KRRI,OOCEAN, & PDZZ,KSV,KSV_LGBEG,KSV_LGEND,ONOMIXLG, & - OBLOWSNOW,OLES_CALL,OCOMPUTE_SRC,PRSNOW, & + OBLOWSNOW,OCOMPUTE_SRC,PRSNOW, & PTHLM,PRM,PTHVREF, & PLOCPEXNM,PATHETA,PAMOIST,PSRCM,ZPHI3,ZPSI3, & PWM,PSVM, & diff --git a/src/common/turb/mode_turb_ver_dyn_flux.F90 b/src/common/turb/mode_turb_ver_dyn_flux.F90 index 5157b5ac3bd74f8d739bb8eb3201ecb832fd3c38..2c635afa156c770b8d79809b5d5fc2fe411eefeb 100644 --- a/src/common/turb/mode_turb_ver_dyn_flux.F90 +++ b/src/common/turb/mode_turb_ver_dyn_flux.F90 @@ -5,8 +5,8 @@ MODULE MODE_TURB_VER_DYN_FLUX IMPLICIT NONE CONTAINS -SUBROUTINE TURB_VER_DYN_FLUX(D,CST,CSTURB,TURBN,KSV,O2D,OFLAT, & - KRR,OOCEAN,OCOUPLES,OLES_CALL, & +SUBROUTINE TURB_VER_DYN_FLUX(D,CST,CSTURB,TURBN,TLES,KSV,O2D,OFLAT, & + KRR,OOCEAN,OCOUPLES, & PEXPL,PTSTEP,TPFILE, & PDXX,PDYY,PDZZ,PDZX,PDZY,PDIRCOSZW,PZZ, & PCOSSLOPE,PSINSLOPE, & @@ -212,7 +212,7 @@ 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_LES +USE MODD_LES, ONLY: TLES_t USE MODD_PARAMETERS, ONLY: JPVEXT_TURB,XUNDEF USE MODD_TURB_n, ONLY: TURB_t ! @@ -240,11 +240,11 @@ TYPE(DIMPHYEX_t), INTENT(IN) :: D 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) :: KSV ! number of scalar variables LOGICAL, INTENT(IN) :: OOCEAN ! switch for Ocean model version LOGICAL, INTENT(IN) :: O2D ! Logical for 2D model version (modd_conf) LOGICAL, INTENT(IN) :: OFLAT ! Logical for zero ororography -LOGICAL, INTENT(IN) :: OLES_CALL ! compute the LES diagnostics at current time-step LOGICAL, INTENT(IN) :: OCOUPLES ! switch to activate atmos-ocean LES version INTEGER, INTENT(IN) :: KRR ! number of moist var. REAL, INTENT(IN) :: PEXPL ! Coef. for temporal disc. @@ -570,12 +570,12 @@ END IF ! ! Storage in the LES configuration ! -IF (OLES_CALL) THEN +IF (TLES%LLES_CALL) THEN CALL SECOND_MNH(ZTIME1) ! CALL MXF_PHY(D,ZFLXZ,ZWORK1) CALL MZF_PHY(D,ZWORK1,ZWORK2) - CALL LES_MEAN_SUBGRID_PHY(D,ZWORK2, X_LES_SUBGRID_WU ) + CALL LES_MEAN_SUBGRID_PHY(D,TLES,ZWORK2, TLES%X_LES_SUBGRID_WU ) ! CALL GZ_U_UW_PHY(D,PUM,PDZZ,ZWORK1) !$mnh_expand_array(JIJ=IIJB:IIJE,JK=1:D%NKT) @@ -583,15 +583,15 @@ IF (OLES_CALL) THEN !$mnh_end_expand_array(JIJ=IIJB:IIJE,JK=1:D%NKT) CALL MXF_PHY(D,ZWORK1,ZWORK2) CALL MZF_PHY(D,ZWORK2,ZWORK3) - CALL LES_MEAN_SUBGRID_PHY(D,ZWORK3, X_LES_RES_ddxa_U_SBG_UaU ) + CALL LES_MEAN_SUBGRID_PHY(D,TLES,ZWORK3, TLES%X_LES_RES_ddxa_U_SBG_UaU ) ! !$mnh_expand_array(JIJ=IIJB:IIJE,JK=1:D%NKT) ZWORK1(IIJB:IIJE,1:D%NKT) = ZCMFS * ZKEFF(IIJB:IIJE,1:D%NKT) !$mnh_end_expand_array(JIJ=IIJB:IIJE,JK=1:D%NKT) - CALL LES_MEAN_SUBGRID_PHY(D, ZWORK1, X_LES_SUBGRID_Km ) + CALL LES_MEAN_SUBGRID_PHY(D,TLES, ZWORK1, TLES%X_LES_SUBGRID_Km ) ! CALL SECOND_MNH(ZTIME2) - XTIME_LES = XTIME_LES + ZTIME2 - ZTIME1 + TLES%XTIME_LES = TLES%XTIME_LES + ZTIME2 - ZTIME1 END IF ! !* 5.3 Source of W wind component @@ -697,7 +697,7 @@ IF(TURBN%CTURBDIM=='3DIM') THEN ! ! Storage in the LES configuration ! - IF (OLES_CALL) THEN + IF (TLES%LLES_CALL) THEN CALL SECOND_MNH(ZTIME1) ! CALL GX_W_UW_PHY(D,OFLAT,PWM,PDXX,PDZZ,PDZX,ZWORK1) @@ -706,7 +706,7 @@ IF(TURBN%CTURBDIM=='3DIM') THEN !$mnh_end_expand_array(JIJ=IIJB:IIJE,JK=1:D%NKT) CALL MXF_PHY(D,ZWORK1,ZWORK2) CALL MZF_PHY(D,ZWORK2,ZWORK1) - CALL LES_MEAN_SUBGRID_PHY(D,ZWORK1, X_LES_RES_ddxa_W_SBG_UaW ) + CALL LES_MEAN_SUBGRID_PHY(D,TLES,ZWORK1, TLES%X_LES_RES_ddxa_W_SBG_UaW ) ! CALL GX_M_U_PHY(D,OFLAT,PTHLM,PDXX,PDZZ,PDZX,ZWORK1) CALL MZF_PHY(D,ZFLXZ,ZWORK2) @@ -714,7 +714,7 @@ IF(TURBN%CTURBDIM=='3DIM') THEN ZWORK2(IIJB:IIJE,1:D%NKT) = ZWORK2(IIJB:IIJE,1:D%NKT) * ZWORK1(IIJB:IIJE,1:D%NKT) !$mnh_end_expand_array(JIJ=IIJB:IIJE,JK=1:D%NKT) CALL MXF_PHY(D,ZWORK2,ZWORK1) - CALL LES_MEAN_SUBGRID_PHY(D,ZWORK1, X_LES_RES_ddxa_Thl_SBG_UaW ) + CALL LES_MEAN_SUBGRID_PHY(D,TLES,ZWORK1, TLES%X_LES_RES_ddxa_Thl_SBG_UaW ) ! IF (KRR>=1) THEN CALL GX_U_M_PHY(D,OFLAT,PRM(:,:,1),PDXX,PDZZ,PDZX,ZWORK1) @@ -723,7 +723,7 @@ IF(TURBN%CTURBDIM=='3DIM') THEN ZWORK1(IIJB:IIJE,1:D%NKT) = ZWORK1(IIJB:IIJE,1:D%NKT) * ZWORK2(IIJB:IIJE,1:D%NKT) !$mnh_end_expand_array(JIJ=IIJB:IIJE,JK=1:D%NKT) CALL MXF_PHY(D,ZWORK1,ZWORK2) - CALL LES_MEAN_SUBGRID_PHY(D,ZWORK2,X_LES_RES_ddxa_Rt_SBG_UaW ) + CALL LES_MEAN_SUBGRID_PHY(D,TLES,ZWORK2,TLES%X_LES_RES_ddxa_Rt_SBG_UaW ) END IF DO JSV=1,KSV CALL GX_U_M_PHY(D,OFLAT,PSVM(:,:,JSV),PDXX,PDZZ,PDZX,ZWORK1) @@ -732,10 +732,10 @@ IF(TURBN%CTURBDIM=='3DIM') THEN ZWORK1(IIJB:IIJE,1:D%NKT) = ZWORK1(IIJB:IIJE,1:D%NKT) * ZWORK2(IIJB:IIJE,1:D%NKT) !$mnh_end_expand_array(JIJ=IIJB:IIJE,JK=1:D%NKT) CALL MXF_PHY(D,ZWORK1,ZWORK2) - CALL LES_MEAN_SUBGRID_PHY(D,ZWORK2,X_LES_RES_ddxa_Sv_SBG_UaW(:,:,:,JSV) ) + CALL LES_MEAN_SUBGRID_PHY(D,TLES,ZWORK2,TLES%X_LES_RES_ddxa_Sv_SBG_UaW(:,:,:,JSV) ) END DO CALL SECOND_MNH(ZTIME2) - XTIME_LES = XTIME_LES + ZTIME2 - ZTIME1 + TLES%XTIME_LES = TLES%XTIME_LES + ZTIME2 - ZTIME1 END IF END IF ! @@ -940,12 +940,12 @@ PDP(IIJB:IIJE,1:D%NKT)=PDP(IIJB:IIJE,1:D%NKT)+ZA(IIJB:IIJE,1:D%NKT) ! ! Storage in the LES configuration ! -IF (OLES_CALL) THEN +IF (TLES%LLES_CALL) THEN CALL SECOND_MNH(ZTIME1) ! CALL MYF_PHY(D,ZFLXZ,ZWORK1) CALL MZF_PHY(D,ZWORK1,ZWORK2) - CALL LES_MEAN_SUBGRID_PHY(D,ZWORK2, X_LES_SUBGRID_WV ) + CALL LES_MEAN_SUBGRID_PHY(D,TLES,ZWORK2, TLES%X_LES_SUBGRID_WV ) ! CALL GZ_V_VW_PHY(D,PVM,PDZZ,ZWORK1) !$mnh_expand_array(JIJ=IIJB:IIJE,JK=1:D%NKT) @@ -953,10 +953,10 @@ IF (OLES_CALL) THEN !$mnh_end_expand_array(JIJ=IIJB:IIJE,JK=1:D%NKT) CALL MYF_PHY(D,ZWORK1,ZWORK2) CALL MZF_PHY(D,ZWORK2,ZWORK1) - CALL LES_MEAN_SUBGRID_PHY(D,ZWORK1, X_LES_RES_ddxa_V_SBG_UaV ) + CALL LES_MEAN_SUBGRID_PHY(D,TLES,ZWORK1, TLES%X_LES_RES_ddxa_V_SBG_UaV ) ! CALL SECOND_MNH(ZTIME2) - XTIME_LES = XTIME_LES + ZTIME2 - ZTIME1 + TLES%XTIME_LES = TLES%XTIME_LES + ZTIME2 - ZTIME1 END IF ! ! @@ -1065,7 +1065,7 @@ IF(TURBN%CTURBDIM=='3DIM') THEN ! ! Storage in the LES configuration ! - IF (OLES_CALL) THEN + IF (TLES%LLES_CALL) THEN CALL SECOND_MNH(ZTIME1) ! CALL GY_W_VW_PHY(D,OFLAT,PWM,PDYY,PDZZ,PDZY,ZWORK1) @@ -1074,7 +1074,7 @@ IF(TURBN%CTURBDIM=='3DIM') THEN !$mnh_end_expand_array(JIJ=IIJB:IIJE,JK=1:D%NKT) CALL MYF_PHY(D,ZWORK1,ZWORK2) CALL MZF_PHY(D,ZWORK2,ZWORK1) - CALL LES_MEAN_SUBGRID_PHY(D,ZWORK1,X_LES_RES_ddxa_W_SBG_UaW , .TRUE. ) + CALL LES_MEAN_SUBGRID_PHY(D,TLES,ZWORK1,TLES%X_LES_RES_ddxa_W_SBG_UaW , .TRUE. ) ! CALL GY_M_V_PHY(D,OFLAT,PTHLM,PDYY,PDZZ,PDZY,ZWORK1) CALL MZF_PHY(D,ZFLXZ,ZWORK2) @@ -1082,7 +1082,7 @@ IF(TURBN%CTURBDIM=='3DIM') THEN ZWORK2(IIJB:IIJE,1:D%NKT) = ZWORK2(IIJB:IIJE,1:D%NKT) * ZWORK1(IIJB:IIJE,1:D%NKT) !$mnh_end_expand_array(JIJ=IIJB:IIJE,JK=1:D%NKT) CALL MYF_PHY(D,ZWORK2,ZWORK1) - CALL LES_MEAN_SUBGRID_PHY(D,ZWORK1,X_LES_RES_ddxa_Thl_SBG_UaW , .TRUE. ) + CALL LES_MEAN_SUBGRID_PHY(D,TLES,ZWORK1,TLES%X_LES_RES_ddxa_Thl_SBG_UaW , .TRUE. ) ! IF (KRR>=1) THEN CALL GY_V_M_PHY(D,OFLAT,PRM(:,:,1),PDYY,PDZZ,PDZY,ZWORK1) @@ -1091,11 +1091,11 @@ IF(TURBN%CTURBDIM=='3DIM') THEN ZWORK1(IIJB:IIJE,1:D%NKT) = ZWORK1(IIJB:IIJE,1:D%NKT) * ZWORK2(IIJB:IIJE,1:D%NKT) !$mnh_end_expand_array(JIJ=IIJB:IIJE,JK=1:D%NKT) CALL MYF_PHY(D,ZWORK1,ZWORK2) - CALL LES_MEAN_SUBGRID_PHY(D,ZWORK2,X_LES_RES_ddxa_Rt_SBG_UaW , .TRUE. ) + CALL LES_MEAN_SUBGRID_PHY(D,TLES,ZWORK2,TLES%X_LES_RES_ddxa_Rt_SBG_UaW , .TRUE. ) END IF ! CALL SECOND_MNH(ZTIME2) - XTIME_LES = XTIME_LES + ZTIME2 - ZTIME1 + TLES%XTIME_LES = TLES%XTIME_LES + ZTIME2 - ZTIME1 END IF ! END IF diff --git a/src/common/turb/mode_turb_ver_sv_corr.F90 b/src/common/turb/mode_turb_ver_sv_corr.F90 index 2438f08f5c2491e707f84563961e0dc7e0b9be96..e790136bdbfd742e9f2af41640ea8244866ce6f5 100644 --- a/src/common/turb/mode_turb_ver_sv_corr.F90 +++ b/src/common/turb/mode_turb_ver_sv_corr.F90 @@ -5,9 +5,9 @@ MODULE MODE_TURB_VER_SV_CORR IMPLICIT NONE CONTAINS -SUBROUTINE TURB_VER_SV_CORR(D,CST,CSTURB,KRR,KRRL,KRRI,OOCEAN,& +SUBROUTINE TURB_VER_SV_CORR(D,CST,CSTURB,TLES,KRR,KRRL,KRRI,OOCEAN, & PDZZ,KSV,KSV_LGBEG,KSV_LGEND,ONOMIXLG, & - OBLOWSNOW,OLES_CALL,OCOMPUTE_SRC,PRSNOW, & + OBLOWSNOW,OCOMPUTE_SRC,PRSNOW, & PTHLM,PRM,PTHVREF, & PLOCPEXNM,PATHETA,PAMOIST,PSRCM,PPHI3,PPSI3, & PWM,PSVM, & @@ -60,7 +60,7 @@ USE MODD_CST, ONLY: CST_t USE MODD_CTURB, ONLY: CSTURB_t USE MODD_DIMPHYEX, ONLY: DIMPHYEX_t USE MODD_PARAMETERS, ONLY: JPVEXT_TURB -USE MODD_LES +USE MODD_LES, ONLY: TLES_t ! USE SHUMAN_PHY, ONLY: MZF_PHY USE MODE_GRADIENT_M_PHY, ONLY : GZ_M_W_PHY @@ -79,10 +79,10 @@ IMPLICIT NONE TYPE(DIMPHYEX_t), INTENT(IN) :: D TYPE(CST_t), INTENT(IN) :: CST TYPE(CSTURB_t), INTENT(IN) :: CSTURB +TYPE(TLES_t), INTENT(INOUT):: TLES ! modd_les structure INTEGER, INTENT(IN) :: KSV, KSV_LGBEG, KSV_LGEND ! number of scalar variables LOGICAL, INTENT(IN) :: OOCEAN ! switch for Ocean model version LOGICAL, INTENT(IN) :: ONOMIXLG ! to use turbulence for lagrangian variables (modd_conf) -LOGICAL, INTENT(IN) :: OLES_CALL ! compute the LES diagnostics at current time-step LOGICAL, INTENT(IN) :: OBLOWSNOW ! switch to activate pronostic blowing snow LOGICAL, INTENT(IN) :: OCOMPUTE_SRC ! flag to define dimensions of SIGS and REAL, INTENT(IN) :: PRSNOW ! Ratio for diffusion coeff. scalar (blowing snow) @@ -152,7 +152,7 @@ DO JSV=1,KSV ! ! variance Sv2 ! - IF (OLES_CALL) THEN + IF (TLES%LLES_CALL) THEN ! approximation: diagnosed explicitely (without implicit term) CALL GZ_M_W_PHY(D,PSVM(:,:,JSV),PDZZ,ZWORK1) CALL MZF_PHY(D,ZFLXZ,ZWORK2) @@ -163,13 +163,13 @@ DO JSV=1,KSV ZWORK1(IIJB:IIJE,1:D%NKT) = -2.*ZCSVD*SQRT(PTKEM(IIJB:IIJE,1:D%NKT))*ZFLXZ(IIJB:IIJE,1:D%NKT)/PLEPS(IIJB:IIJE,1:D%NKT) ZWORK2(IIJB:IIJE,1:D%NKT) = ZWORK3(IIJB:IIJE,1:D%NKT)*ZFLXZ(IIJB:IIJE,1:D%NKT) !$mnh_end_expand_array(JIJ=IIJB:IIJE,JK=1:D%NKT) - CALL LES_MEAN_SUBGRID_PHY(D,ZWORK1, X_LES_SUBGRID_DISS_Sv2(:,:,:,JSV) ) - CALL LES_MEAN_SUBGRID_PHY(D,ZWORK2, X_LES_RES_W_SBG_Sv2(:,:,:,JSV) ) + CALL LES_MEAN_SUBGRID_PHY(D,TLES,ZWORK1, TLES%X_LES_SUBGRID_DISS_Sv2(:,:,:,JSV) ) + CALL LES_MEAN_SUBGRID_PHY(D,TLES,ZWORK2, TLES%X_LES_RES_W_SBG_Sv2(:,:,:,JSV) ) END IF ! ! covariance ThvSv ! - IF (OLES_CALL) THEN + IF (TLES%LLES_CALL) THEN ! approximation: diagnosed explicitely (without implicit term) CALL ETHETA(D,CST,KRR,KRRI,PTHLM,PRM,PLOCPEXNM,PATHETA,PSRCM,OOCEAN,OCOMPUTE_SRC,ZA) ! @@ -188,8 +188,8 @@ DO JSV=1,KSV ZWORK2(IIJB:IIJE,1:D%NKT) = -CST%XG/PTHVREF(IIJB:IIJE,1:D%NKT)/3.*ZA(IIJB:IIJE,1:D%NKT)*ZFLXZ(IIJB:IIJE,1:D%NKT) !$mnh_end_expand_array(JIJ=IIJB:IIJE,JK=1:D%NKT) ! - CALL LES_MEAN_SUBGRID_PHY(D, ZWORK1, X_LES_SUBGRID_SvThv(:,:,:,JSV) ) - CALL LES_MEAN_SUBGRID_PHY(D, ZWORK2, X_LES_SUBGRID_SvPz(:,:,:,JSV), .TRUE.) + CALL LES_MEAN_SUBGRID_PHY(D,TLES, ZWORK1, TLES%X_LES_SUBGRID_SvThv(:,:,:,JSV) ) + CALL LES_MEAN_SUBGRID_PHY(D,TLES, ZWORK2, TLES%X_LES_SUBGRID_SvPz(:,:,:,JSV), .TRUE.) ! IF (KRR>=1) THEN CALL EMOIST(D,CST,KRR,KRRI,PTHLM,PRM,PLOCPEXNM,PAMOIST,PSRCM,OOCEAN,ZA) @@ -205,15 +205,15 @@ DO JSV=1,KSV ZWORK1(IIJB:IIJE,1:D%NKT) = ZA(IIJB:IIJE,1:D%NKT)*ZFLXZ(IIJB:IIJE,1:D%NKT) ZWORK2(IIJB:IIJE,1:D%NKT) = -CST%XG/PTHVREF(IIJB:IIJE,1:D%NKT)/3.*ZA(IIJB:IIJE,1:D%NKT)*ZFLXZ(IIJB:IIJE,1:D%NKT) !$mnh_end_expand_array(JIJ=IIJB:IIJE,JK=1:D%NKT) - CALL LES_MEAN_SUBGRID_PHY(D, ZWORK1, X_LES_SUBGRID_SvThv(:,:,:,JSV) , .TRUE.) - CALL LES_MEAN_SUBGRID_PHY(D, ZWORK2, X_LES_SUBGRID_SvPz(:,:,:,JSV), .TRUE.) + CALL LES_MEAN_SUBGRID_PHY(D,TLES, ZWORK1, TLES%X_LES_SUBGRID_SvThv(:,:,:,JSV) , .TRUE.) + CALL LES_MEAN_SUBGRID_PHY(D,TLES, ZWORK2, TLES%X_LES_SUBGRID_SvPz(:,:,:,JSV), .TRUE.) END IF END IF ! END DO ! end of scalar loop ! CALL SECOND_MNH(ZTIME2) -IF(OLES_CALL) XTIME_LES = XTIME_LES + ZTIME2 - ZTIME1 +IF(TLES%LLES_CALL) TLES%XTIME_LES = TLES%XTIME_LES + ZTIME2 - ZTIME1 !---------------------------------------------------------------------------- ! IF (LHOOK) CALL DR_HOOK('TURB_VER_SV_CORR',1,ZHOOK_HANDLE) diff --git a/src/common/turb/mode_turb_ver_sv_flux.F90 b/src/common/turb/mode_turb_ver_sv_flux.F90 index cc38eae30136b5f6f04a68ab237e6d4ce8efd851..d5e75f639495484bb152ecaa9be1b0b960aed452 100644 --- a/src/common/turb/mode_turb_ver_sv_flux.F90 +++ b/src/common/turb/mode_turb_ver_sv_flux.F90 @@ -5,9 +5,9 @@ MODULE MODE_TURB_VER_SV_FLUX IMPLICIT NONE CONTAINS -SUBROUTINE TURB_VER_SV_FLUX(D,CST,CSTURB,TURBN,ONOMIXLG, & +SUBROUTINE TURB_VER_SV_FLUX(D,CST,CSTURB,TURBN,TLES,ONOMIXLG, & KSV,KSV_LGBEG,KSV_LGEND, & - OBLOWSNOW,OLES_CALL, & + OBLOWSNOW, & PEXPL,PTSTEP,TPFILE,PRSNOW, & PDZZ,PDIRCOSZW, & PRHODJ,PWM, & @@ -218,7 +218,7 @@ 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 +USE MODD_LES, ONLY: TLES_t USE MODE_IO_FIELD_WRITE, ONLY: IO_FIELD_WRITE_PHY ! @@ -241,10 +241,10 @@ TYPE(DIMPHYEX_t), INTENT(IN) :: D 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) :: KSV, & KSV_LGBEG, KSV_LGEND ! number of scalar variables LOGICAL, INTENT(IN) :: ONOMIXLG ! to use turbulence for lagrangian variables (modd_conf) -LOGICAL, INTENT(IN) :: OLES_CALL ! compute the LES diagnostics at current time-step LOGICAL, INTENT(IN) :: OBLOWSNOW ! switch to activate pronostic blowing snow REAL, INTENT(IN) :: PRSNOW ! Ratio for diffusion coeff. scalar (blowing snow) REAL, INTENT(IN) :: PEXPL ! Coef. for temporal disc. @@ -390,7 +390,7 @@ DO JSV=1,KSV PRHODJ(IIJB:IIJE,IKB:IKE)*(ZRES(IIJB:IIJE,IKB:IKE)-PSVM(IIJB:IIJE,IKB:IKE,JSV))/PTSTEP !$mnh_end_expand_array(JIJ=IIJB:IIJE,JK=1:D%NKT) ! - IF ( (TURBN%LTURB_FLX .AND. TPFILE%LOPENED) .OR. OLES_CALL ) THEN + IF ( (TURBN%LTURB_FLX .AND. TPFILE%LOPENED) .OR. TLES%LLES_CALL ) THEN ! Diagnostic of the cartesian vertical flux ! !$mnh_expand_array(JIJ=IIJB:IIJE,JK=1:D%NKT) @@ -456,39 +456,39 @@ DO JSV=1,KSV ! ! Storage in the LES configuration ! - IF (OLES_CALL) THEN + IF (TLES%LLES_CALL) THEN CALL SECOND_MNH(ZTIME1) ! CALL MZF_PHY(D,ZFLXZ,ZWORK1) - CALL LES_MEAN_SUBGRID_PHY(D,ZWORK1, X_LES_SUBGRID_WSv(:,:,:,JSV) ) + CALL LES_MEAN_SUBGRID_PHY(D,TLES,ZWORK1, TLES%X_LES_SUBGRID_WSv(:,:,:,JSV) ) ! CALL GZ_W_M_PHY(D,PWM,PDZZ,ZWORK2) !$mnh_expand_array(JIJ=IIJB:IIJE,JK=1:D%NKT) ZWORK3(IIJB:IIJE,1:D%NKT) = ZWORK2(IIJB:IIJE,1:D%NKT) * ZWORK1(IIJB:IIJE,1:D%NKT) !$mnh_end_expand_array(JIJ=IIJB:IIJE,JK=1:D%NKT) - CALL LES_MEAN_SUBGRID_PHY(D,ZWORK3, X_LES_RES_ddxa_W_SBG_UaSv(:,:,:,JSV) ) + CALL LES_MEAN_SUBGRID_PHY(D,TLES,ZWORK3, TLES%X_LES_RES_ddxa_W_SBG_UaSv(:,:,:,JSV) ) ! CALL GZ_M_W_PHY(D,PSVM(:,:,JSV),PDZZ,ZWORK1) !$mnh_expand_array(JIJ=IIJB:IIJE,JK=1:D%NKT) ZWORK2(IIJB:IIJE,1:D%NKT) = ZWORK1(IIJB:IIJE,1:D%NKT) * ZFLXZ(IIJB:IIJE,1:D%NKT) !$mnh_end_expand_array(JIJ=IIJB:IIJE,JK=1:D%NKT) CALL MZF_PHY(D,ZWORK2,ZWORK3) - CALL LES_MEAN_SUBGRID_PHY(D,ZWORK3, X_LES_RES_ddxa_Sv_SBG_UaSv(:,:,:,JSV) ) + CALL LES_MEAN_SUBGRID_PHY(D,TLES,ZWORK3, TLES%X_LES_RES_ddxa_Sv_SBG_UaSv(:,:,:,JSV) ) ! CALL MZF_PHY(D,ZFLXZ,ZWORK1) !$mnh_expand_array(JIJ=IIJB:IIJE,JK=1:D%NKT) ZWORK2(IIJB:IIJE,1:D%NKT) = -ZCSVP*SQRT(PTKEM(IIJB:IIJE,1:D%NKT))/PLM(IIJB:IIJE,1:D%NKT)*ZWORK1(IIJB:IIJE,1:D%NKT) !$mnh_end_expand_array(JIJ=IIJB:IIJE,JK=1:D%NKT) - CALL LES_MEAN_SUBGRID_PHY(D,ZWORK2, X_LES_SUBGRID_SvPz(:,:,:,JSV) ) + CALL LES_MEAN_SUBGRID_PHY(D,TLES,ZWORK2, TLES%X_LES_SUBGRID_SvPz(:,:,:,JSV) ) ! !$mnh_expand_array(JIJ=IIJB:IIJE,JK=1:D%NKT) ZWORK1(IIJB:IIJE,1:D%NKT) = PWM(IIJB:IIJE,1:D%NKT)*ZFLXZ(IIJB:IIJE,1:D%NKT) !$mnh_end_expand_array(JIJ=IIJB:IIJE,JK=1:D%NKT) CALL MZF_PHY(D,ZWORK1,ZWORK2) - CALL LES_MEAN_SUBGRID_PHY(D,ZWORK2, X_LES_RES_W_SBG_WSv(:,:,:,JSV) ) + CALL LES_MEAN_SUBGRID_PHY(D,TLES,ZWORK2, TLES%X_LES_RES_W_SBG_WSv(:,:,:,JSV) ) ! CALL SECOND_MNH(ZTIME2) - XTIME_LES = XTIME_LES + ZTIME2 - ZTIME1 + TLES%XTIME_LES = TLES%XTIME_LES + ZTIME2 - ZTIME1 END IF ! END DO ! end of scalar loop diff --git a/src/common/turb/mode_turb_ver_thermo_corr.F90 b/src/common/turb/mode_turb_ver_thermo_corr.F90 index 5e4479849272247b2ff41ceab5fd63bc3789afa8..a535dfb9c654ba15db362b3f509dddde05b223ed 100644 --- a/src/common/turb/mode_turb_ver_thermo_corr.F90 +++ b/src/common/turb/mode_turb_ver_thermo_corr.F90 @@ -5,9 +5,9 @@ MODULE MODE_TURB_VER_THERMO_CORR IMPLICIT NONE CONTAINS -SUBROUTINE TURB_VER_THERMO_CORR(D,CST,CSTURB,TURBN, & +SUBROUTINE TURB_VER_THERMO_CORR(D,CST,CSTURB,TURBN,TLES, & KRR,KRRL,KRRI,KSV, & - OCOMPUTE_SRC,OCOUPLES,OLES_CALL, & + OCOMPUTE_SRC,OCOUPLES, & PEXPL,TPFILE, & PDXX,PDYY,PDZZ,PDZX,PDZY,PDIRCOSZW, & PRHODJ,PTHVREF, & @@ -212,7 +212,7 @@ 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 +USE MODD_LES, ONLY: TLES_t ! USE MODI_LES_MEAN_SUBGRID_PHY ! @@ -232,11 +232,11 @@ TYPE(DIMPHYEX_t), INTENT(IN) :: D 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) :: 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. -LOGICAL, INTENT(IN) :: OLES_CALL ! compute the LES diagnostics at current time-step LOGICAL, INTENT(IN) :: OCOUPLES ! switch to activate atmos-ocean LES LOGICAL, INTENT(IN) :: OCOMPUTE_SRC ! flag to define dimensions of SIGS and version REAL, INTENT(IN) :: PEXPL ! Coef. for temporal disc. @@ -624,36 +624,36 @@ END IF ! ! and we store in LES configuration ! - IF (OLES_CALL) THEN + IF (TLES%LLES_CALL) THEN CALL SECOND_MNH(ZTIME1) ! - CALL LES_MEAN_SUBGRID_PHY(D,ZFLXZ, X_LES_SUBGRID_Thl2 ) + CALL LES_MEAN_SUBGRID_PHY(D,TLES,ZFLXZ, TLES%X_LES_SUBGRID_Thl2 ) ! CALL MZF_PHY(D,PWM,ZWORK1) !$mnh_expand_array(JIJ=IIJB:IIJE,JK=1:D%NKT) ZWORK2(IIJB:IIJE,1:D%NKT) = ZWORK1(IIJB:IIJE,1:D%NKT) * ZFLXZ(IIJB:IIJE,1:D%NKT) !$mnh_end_expand_array(JIJ=IIJB:IIJE,JK=1:D%NKT) - CALL LES_MEAN_SUBGRID_PHY(D,ZWORK2, X_LES_RES_W_SBG_Thl2 ) + CALL LES_MEAN_SUBGRID_PHY(D,TLES,ZWORK2, TLES%X_LES_RES_W_SBG_Thl2 ) ! !$mnh_expand_array(JIJ=IIJB:IIJE,JK=1:D%NKT) ZWORK1(IIJB:IIJE,1:D%NKT) = -2.*CSTURB%XCTD*PSQRT_TKE(IIJB:IIJE,1:D%NKT)*ZFLXZ(IIJB:IIJE,1:D%NKT) & / PLEPS(IIJB:IIJE,1:D%NKT) !$mnh_end_expand_array(JIJ=IIJB:IIJE,JK=1:D%NKT) - CALL LES_MEAN_SUBGRID_PHY(D,ZWORK1, X_LES_SUBGRID_DISS_Thl2 ) + CALL LES_MEAN_SUBGRID_PHY(D,TLES,ZWORK1, TLES%X_LES_SUBGRID_DISS_Thl2 ) ! !$mnh_expand_array(JIJ=IIJB:IIJE,JK=1:D%NKT) ZWORK1(IIJB:IIJE,1:D%NKT) = PETHETA(IIJB:IIJE,1:D%NKT)*ZFLXZ(IIJB:IIJE,1:D%NKT) !$mnh_end_expand_array(JIJ=IIJB:IIJE,JK=1:D%NKT) - CALL LES_MEAN_SUBGRID_PHY(D,ZWORK1, X_LES_SUBGRID_ThlThv ) + CALL LES_MEAN_SUBGRID_PHY(D,TLES,ZWORK1, TLES%X_LES_SUBGRID_ThlThv ) ! !$mnh_expand_array(JIJ=IIJB:IIJE,JK=1:D%NKT) ZWORK1(IIJB:IIJE,1:D%NKT) = -CSTURB%XA3*PBETA(IIJB:IIJE,1:D%NKT)*PETHETA(IIJB:IIJE,1:D%NKT) & * ZFLXZ(IIJB:IIJE,1:D%NKT) !$mnh_end_expand_array(JIJ=IIJB:IIJE,JK=1:D%NKT) - CALL LES_MEAN_SUBGRID_PHY(D,ZWORK1, X_LES_SUBGRID_ThlPz, .TRUE. ) + CALL LES_MEAN_SUBGRID_PHY(D,TLES,ZWORK1, TLES%X_LES_SUBGRID_ThlPz, .TRUE. ) ! CALL SECOND_MNH(ZTIME2) - XTIME_LES = XTIME_LES + ZTIME2 - ZTIME1 + TLES%XTIME_LES = TLES%XTIME_LES + ZTIME2 - ZTIME1 END IF ! IF ( KRR /= 0 ) THEN @@ -937,47 +937,47 @@ END IF ! ! and we store in LES configuration ! -IF (OLES_CALL) THEN +IF (TLES%LLES_CALL) THEN CALL SECOND_MNH(ZTIME1) ! - CALL LES_MEAN_SUBGRID_PHY(D,ZFLXZ, X_LES_SUBGRID_THlRt ) + CALL LES_MEAN_SUBGRID_PHY(D,TLES,ZFLXZ, TLES%X_LES_SUBGRID_THlRt ) ! CALL MZF_PHY(D,PWM,ZWORK1) !$mnh_expand_array(JIJ=IIJB:IIJE,JK=1:D%NKT) ZWORK2(IIJB:IIJE,1:D%NKT) = ZWORK1(IIJB:IIJE,1:D%NKT) * ZFLXZ(IIJB:IIJE,1:D%NKT) !$mnh_end_expand_array(JIJ=IIJB:IIJE,JK=1:D%NKT) - CALL LES_MEAN_SUBGRID_PHY(D,ZWORK2, X_LES_RES_W_SBG_ThlRt ) + CALL LES_MEAN_SUBGRID_PHY(D,TLES,ZWORK2, TLES%X_LES_RES_W_SBG_ThlRt ) ! !$mnh_expand_array(JIJ=IIJB:IIJE,JK=1:D%NKT) ZWORK1(IIJB:IIJE,1:D%NKT) = -2.*CSTURB%XCTD*PSQRT_TKE(IIJB:IIJE,1:D%NKT)*ZFLXZ(IIJB:IIJE,1:D%NKT) & / PLEPS(IIJB:IIJE,1:D%NKT) !$mnh_end_expand_array(JIJ=IIJB:IIJE,JK=1:D%NKT) - CALL LES_MEAN_SUBGRID_PHY(D,ZWORK1, X_LES_SUBGRID_DISS_ThlRt ) + CALL LES_MEAN_SUBGRID_PHY(D,TLES,ZWORK1, TLES%X_LES_SUBGRID_DISS_ThlRt ) ! !$mnh_expand_array(JIJ=IIJB:IIJE,JK=1:D%NKT) ZWORK1(IIJB:IIJE,1:D%NKT) = PETHETA(IIJB:IIJE,1:D%NKT)*ZFLXZ(IIJB:IIJE,1:D%NKT) !$mnh_end_expand_array(JIJ=IIJB:IIJE,JK=1:D%NKT) - CALL LES_MEAN_SUBGRID_PHY(D,ZWORK1, X_LES_SUBGRID_RtThv ) + CALL LES_MEAN_SUBGRID_PHY(D,TLES,ZWORK1, TLES%X_LES_SUBGRID_RtThv ) ! !$mnh_expand_array(JIJ=IIJB:IIJE,JK=1:D%NKT) ZWORK1(IIJB:IIJE,1:D%NKT) = -CSTURB%XA3*PBETA(IIJB:IIJE,1:D%NKT)*PETHETA(IIJB:IIJE,1:D%NKT) & * ZFLXZ(IIJB:IIJE,1:D%NKT) !$mnh_end_expand_array(JIJ=IIJB:IIJE,JK=1:D%NKT) - CALL LES_MEAN_SUBGRID_PHY(D,ZWORK1, X_LES_SUBGRID_RtPz, .TRUE. ) + CALL LES_MEAN_SUBGRID_PHY(D,TLES,ZWORK1, TLES%X_LES_SUBGRID_RtPz, .TRUE. ) ! !$mnh_expand_array(JIJ=IIJB:IIJE,JK=1:D%NKT) ZWORK1(IIJB:IIJE,1:D%NKT) = PEMOIST(IIJB:IIJE,1:D%NKT)*ZFLXZ(IIJB:IIJE,1:D%NKT) !$mnh_end_expand_array(JIJ=IIJB:IIJE,JK=1:D%NKT) - CALL LES_MEAN_SUBGRID_PHY(D,ZWORK1, X_LES_SUBGRID_ThlThv , .TRUE. ) + CALL LES_MEAN_SUBGRID_PHY(D,TLES,ZWORK1, TLES%X_LES_SUBGRID_ThlThv , .TRUE. ) ! !$mnh_expand_array(JIJ=IIJB:IIJE,JK=1:D%NKT) ZWORK1(IIJB:IIJE,1:D%NKT) = -CSTURB%XA3*PBETA(IIJB:IIJE,1:D%NKT)*PEMOIST(IIJB:IIJE,1:D%NKT) & * ZFLXZ(IIJB:IIJE,1:D%NKT) !$mnh_end_expand_array(JIJ=IIJB:IIJE,JK=1:D%NKT) - CALL LES_MEAN_SUBGRID_PHY(D,ZWORK1, X_LES_SUBGRID_ThlPz, .TRUE. ) + CALL LES_MEAN_SUBGRID_PHY(D,TLES,ZWORK1, TLES%X_LES_SUBGRID_ThlPz, .TRUE. ) ! CALL SECOND_MNH(ZTIME2) - XTIME_LES = XTIME_LES + ZTIME2 - ZTIME1 + TLES%XTIME_LES = TLES%XTIME_LES + ZTIME2 - ZTIME1 END IF ! ! @@ -1202,36 +1202,36 @@ ENDIF ! ! and we store in LES configuration ! - IF (OLES_CALL) THEN + IF (TLES%LLES_CALL) THEN CALL SECOND_MNH(ZTIME1) ! - CALL LES_MEAN_SUBGRID_PHY(D,ZFLXZ, X_LES_SUBGRID_Rt2 ) + CALL LES_MEAN_SUBGRID_PHY(D,TLES,ZFLXZ, TLES%X_LES_SUBGRID_Rt2 ) ! CALL MZF_PHY(D,PWM,ZWORK1) !$mnh_expand_array(JIJ=IIJB:IIJE,JK=1:D%NKT) ZWORK2(IIJB:IIJE,1:D%NKT) = ZWORK1(IIJB:IIJE,1:D%NKT) * ZFLXZ(IIJB:IIJE,1:D%NKT) !$mnh_end_expand_array(JIJ=IIJB:IIJE,JK=1:D%NKT) - CALL LES_MEAN_SUBGRID_PHY(D,ZWORK2, X_LES_RES_W_SBG_Rt2 ) + CALL LES_MEAN_SUBGRID_PHY(D,TLES,ZWORK2, TLES%X_LES_RES_W_SBG_Rt2 ) ! !$mnh_expand_array(JIJ=IIJB:IIJE,JK=1:D%NKT) ZWORK1(IIJB:IIJE,1:D%NKT) = PEMOIST(IIJB:IIJE,1:D%NKT)*ZFLXZ(IIJB:IIJE,1:D%NKT) !$mnh_end_expand_array(JIJ=IIJB:IIJE,JK=1:D%NKT) - CALL LES_MEAN_SUBGRID_PHY(D,ZWORK1, X_LES_SUBGRID_RtThv , .TRUE. ) + CALL LES_MEAN_SUBGRID_PHY(D,TLES,ZWORK1, TLES%X_LES_SUBGRID_RtThv , .TRUE. ) ! !$mnh_expand_array(JIJ=IIJB:IIJE,JK=1:D%NKT) ZWORK1(IIJB:IIJE,1:D%NKT) = -CSTURB%XA3*PBETA(IIJB:IIJE,1:D%NKT)*PEMOIST(IIJB:IIJE,1:D%NKT) & * ZFLXZ(IIJB:IIJE,1:D%NKT) !$mnh_end_expand_array(JIJ=IIJB:IIJE,JK=1:D%NKT) - CALL LES_MEAN_SUBGRID_PHY(D,ZWORK1, X_LES_SUBGRID_RtPz, .TRUE. ) + CALL LES_MEAN_SUBGRID_PHY(D,TLES,ZWORK1, TLES%X_LES_SUBGRID_RtPz, .TRUE. ) ! !$mnh_expand_array(JIJ=IIJB:IIJE,JK=1:D%NKT) ZWORK1(IIJB:IIJE,1:D%NKT) = -2.*CSTURB%XCTD*PSQRT_TKE(IIJB:IIJE,1:D%NKT)*ZFLXZ(IIJB:IIJE,1:D%NKT) & / PLEPS(IIJB:IIJE,1:D%NKT) !$mnh_end_expand_array(JIJ=IIJB:IIJE,JK=1:D%NKT) - CALL LES_MEAN_SUBGRID_PHY(D,ZWORK1, X_LES_SUBGRID_DISS_Rt2 ) + CALL LES_MEAN_SUBGRID_PHY(D,TLES,ZWORK1, TLES%X_LES_SUBGRID_DISS_Rt2 ) ! CALL SECOND_MNH(ZTIME2) - XTIME_LES = XTIME_LES + ZTIME2 - ZTIME1 + TLES%XTIME_LES = TLES%XTIME_LES + ZTIME2 - ZTIME1 END IF ! END IF ! end if KRR ne 0 diff --git a/src/common/turb/mode_turb_ver_thermo_flux.F90 b/src/common/turb/mode_turb_ver_thermo_flux.F90 index 669349c12ba2957af57d558c2e736689a52b9215..cb84c52a5c31ee58ca192dc23f958c17167ec19d 100644 --- a/src/common/turb/mode_turb_ver_thermo_flux.F90 +++ b/src/common/turb/mode_turb_ver_thermo_flux.F90 @@ -5,10 +5,10 @@ MODULE MODE_TURB_VER_THERMO_FLUX IMPLICIT NONE CONTAINS -SUBROUTINE TURB_VER_THERMO_FLUX(D,CST,CSTURB,TURBN, & +SUBROUTINE TURB_VER_THERMO_FLUX(D,CST,CSTURB,TURBN,TLES, & KRR,KRRL,KRRI,KSV,KGRADIENTS, & OOCEAN,ODEEPOC, & - OCOUPLES,OLES_CALL, OCOMPUTE_SRC, & + OCOUPLES, OCOMPUTE_SRC, & PEXPL,PTSTEP,HPROGRAM, & TPFILE, & PDXX,PDYY,PDZZ,PDZX,PDZY,PDIRCOSZW,PZZ, & @@ -237,7 +237,7 @@ 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 +USE MODD_LES, ONLY: TLES_t USE MODD_TURB_n, ONLY: TURB_t ! USE MODI_LES_MEAN_SUBGRID_PHY @@ -262,6 +262,7 @@ TYPE(DIMPHYEX_t), INTENT(IN) :: D 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. @@ -274,7 +275,6 @@ CHARACTER(LEN=6), INTENT(IN) :: HPROGRAM ! CPROGRAM is the program currently run REAL, INTENT(IN) :: PEXPL ! Coef. for temporal disc. REAL, INTENT(IN) :: PTSTEP ! Double Time Step TYPE(TFILEDATA), INTENT(IN) :: TPFILE ! Output file -LOGICAL, INTENT(IN) :: OLES_CALL ! compute the LES diagnostics at current time-step LOGICAL, INTENT(IN) :: OCOUPLES ! switch to activate atmos-ocean LES version ! REAL, DIMENSION(D%NIJT,D%NKT), INTENT(IN) :: PDZZ, PDXX, PDYY, PDZX, PDZY @@ -778,50 +778,50 @@ END IF ! !* 2.4 Storage in LES configuration ! -IF (OLES_CALL) THEN +IF (TLES%LLES_CALL) THEN CALL SECOND_MNH(ZTIME1) ! CALL MZF_PHY(D,ZFLXZ,ZWORK1) ! - CALL LES_MEAN_SUBGRID_PHY(D,ZWORK1, X_LES_SUBGRID_WThl ) + CALL LES_MEAN_SUBGRID_PHY(D,TLES,ZWORK1, TLES%X_LES_SUBGRID_WThl ) ! !$mnh_expand_array(JIJ=IIJB:IIJE,JK=1:D%NKT) ZWORK2(IIJB:IIJE,1:D%NKT) = PWM(IIJB:IIJE,1:D%NKT)*ZFLXZ(IIJB:IIJE,1:D%NKT) !$mnh_end_expand_array(JIJ=IIJB:IIJE,JK=1:D%NKT) CALL MZF_PHY(D,ZWORK2,ZWORK3) - CALL LES_MEAN_SUBGRID_PHY(D,ZWORK3, X_LES_RES_W_SBG_WThl ) + CALL LES_MEAN_SUBGRID_PHY(D,TLES,ZWORK3, TLES%X_LES_RES_W_SBG_WThl ) ! CALL GZ_W_M_PHY(D,PWM,PDZZ,ZWORK2) !$mnh_expand_array(JIJ=IIJB:IIJE,JK=1:D%NKT) ZWORK3(IIJB:IIJE,1:D%NKT) = ZWORK2(IIJB:IIJE,1:D%NKT) * ZWORK1(IIJB:IIJE,1:D%NKT) !$mnh_end_expand_array(JIJ=IIJB:IIJE,JK=1:D%NKT) - CALL LES_MEAN_SUBGRID_PHY(D,ZWORK3, X_LES_RES_ddxa_W_SBG_UaThl ) + CALL LES_MEAN_SUBGRID_PHY(D,TLES,ZWORK3, TLES%X_LES_RES_ddxa_W_SBG_UaThl ) ! !$mnh_expand_array(JIJ=IIJB:IIJE,JK=1:D%NKT) ZWORK2(IIJB:IIJE,1:D%NKT) = PDTH_DZ(IIJB:IIJE,1:D%NKT)*ZFLXZ(IIJB:IIJE,1:D%NKT) !$mnh_end_expand_array(JIJ=IIJB:IIJE,JK=1:D%NKT) CALL MZF_PHY(D,ZWORK2,ZWORK3) - CALL LES_MEAN_SUBGRID_PHY(D,ZWORK3, X_LES_RES_ddxa_Thl_SBG_UaThl ) + CALL LES_MEAN_SUBGRID_PHY(D,TLES,ZWORK3, TLES%X_LES_RES_ddxa_Thl_SBG_UaThl ) ! CALL MZM_PHY(D,PETHETA,ZWORK2) !$mnh_expand_array(JIJ=IIJB:IIJE,JK=1:D%NKT) ZWORK3(IIJB:IIJE,1:D%NKT) = ZWORK2(IIJB:IIJE,1:D%NKT) * ZFLXZ(IIJB:IIJE,1:D%NKT) !$mnh_end_expand_array(JIJ=IIJB:IIJE,JK=1:D%NKT) CALL MZF_PHY(D,ZWORK3,ZWORK4) - CALL LES_MEAN_SUBGRID_PHY(D,ZWORK4, X_LES_SUBGRID_WThv , .TRUE. ) + CALL LES_MEAN_SUBGRID_PHY(D,TLES,ZWORK4, TLES%X_LES_SUBGRID_WThv , .TRUE. ) ! !$mnh_expand_array(JIJ=IIJB:IIJE,JK=1:D%NKT) ZWORK2(IIJB:IIJE,1:D%NKT) = -CSTURB%XCTP*PSQRT_TKE(IIJB:IIJE,1:D%NKT)/PLM(IIJB:IIJE,1:D%NKT) & *ZWORK1(IIJB:IIJE,1:D%NKT) !$mnh_end_expand_array(JIJ=IIJB:IIJE,JK=1:D%NKT) - CALL LES_MEAN_SUBGRID_PHY(D,ZWORK2, X_LES_SUBGRID_ThlPz ) + CALL LES_MEAN_SUBGRID_PHY(D,TLES,ZWORK2, TLES%X_LES_SUBGRID_ThlPz ) ! IF (KRR>=1) THEN !$mnh_expand_array(JIJ=IIJB:IIJE,JK=1:D%NKT) ZWORK2(IIJB:IIJE,1:D%NKT) = PDR_DZ(IIJB:IIJE,1:D%NKT)*ZFLXZ(IIJB:IIJE,1:D%NKT) !$mnh_end_expand_array(JIJ=IIJB:IIJE,JK=1:D%NKT) CALL MZF_PHY(D,ZWORK2,ZWORK3) - CALL LES_MEAN_SUBGRID_PHY(D,ZWORK3, X_LES_RES_ddxa_Rt_SBG_UaThl ) + CALL LES_MEAN_SUBGRID_PHY(D,TLES,ZWORK3, TLES%X_LES_RES_ddxa_Rt_SBG_UaThl ) END IF ! !* diagnostic of mixing coefficient for heat @@ -841,10 +841,10 @@ IF (OLES_CALL) THEN !$mnh_expand_array(JIJ=IIJB:IIJE,JK=1:D%NKT) ZA(IIJB:IIJE,1:D%NKT) = MIN(MAX(ZA(IIJB:IIJE,1:D%NKT),-1000.),1000.) !$mnh_end_expand_array(JIJ=IIJB:IIJE,JK=1:D%NKT) - CALL LES_MEAN_SUBGRID_PHY(D,ZA, X_LES_SUBGRID_Kh ) + CALL LES_MEAN_SUBGRID_PHY(D,TLES,ZA, TLES%X_LES_SUBGRID_Kh ) ! CALL SECOND_MNH(ZTIME2) - XTIME_LES = XTIME_LES + ZTIME2 - ZTIME1 + TLES%XTIME_LES = TLES%XTIME_LES + ZTIME2 - ZTIME1 END IF ! !* 2.5 New boundary layer depth for TOMs @@ -1164,51 +1164,51 @@ END IF ! !* 3.4 Storage in LES configuration ! - IF (OLES_CALL) THEN + IF (TLES%LLES_CALL) THEN CALL SECOND_MNH(ZTIME1) ! CALL MZF_PHY(D,ZFLXZ,ZWORK1) ! - CALL LES_MEAN_SUBGRID_PHY(D,ZWORK1, X_LES_SUBGRID_WRt ) + CALL LES_MEAN_SUBGRID_PHY(D,TLES,ZWORK1, TLES%X_LES_SUBGRID_WRt ) ! !$mnh_expand_array(JIJ=IIJB:IIJE,JK=1:D%NKT) ZWORK2(IIJB:IIJE,1:D%NKT) = PWM(IIJB:IIJE,1:D%NKT)*ZFLXZ(IIJB:IIJE,1:D%NKT) !$mnh_end_expand_array(JIJ=IIJB:IIJE,JK=1:D%NKT) CALL MZF_PHY(D,ZWORK2,ZWORK3) - CALL LES_MEAN_SUBGRID_PHY(D,ZWORK3, X_LES_RES_W_SBG_WRt ) + CALL LES_MEAN_SUBGRID_PHY(D,TLES,ZWORK3, TLES%X_LES_RES_W_SBG_WRt ) ! CALL GZ_W_M_PHY(D,PWM,PDZZ,ZWORK2) !$mnh_expand_array(JIJ=IIJB:IIJE,JK=1:D%NKT) ZWORK3(IIJB:IIJE,1:D%NKT) = ZWORK2(IIJB:IIJE,1:D%NKT) * ZWORK1(IIJB:IIJE,1:D%NKT) !$mnh_end_expand_array(JIJ=IIJB:IIJE,JK=1:D%NKT) - CALL LES_MEAN_SUBGRID_PHY(D,ZWORK3, X_LES_RES_ddxa_W_SBG_UaRt ) + CALL LES_MEAN_SUBGRID_PHY(D,TLES,ZWORK3, TLES%X_LES_RES_ddxa_W_SBG_UaRt ) ! !$mnh_expand_array(JIJ=IIJB:IIJE,JK=1:D%NKT) ZWORK2(IIJB:IIJE,1:D%NKT) = PDTH_DZ(IIJB:IIJE,1:D%NKT)*ZFLXZ(IIJB:IIJE,1:D%NKT) !$mnh_end_expand_array(JIJ=IIJB:IIJE,JK=1:D%NKT) CALL MZF_PHY(D,ZWORK2,ZWORK3) - CALL LES_MEAN_SUBGRID_PHY(D,ZWORK3, X_LES_RES_ddxa_Thl_SBG_UaRt ) + CALL LES_MEAN_SUBGRID_PHY(D,TLES,ZWORK3, TLES%X_LES_RES_ddxa_Thl_SBG_UaRt ) ! !$mnh_expand_array(JIJ=IIJB:IIJE,JK=1:D%NKT) ZWORK2(IIJB:IIJE,1:D%NKT) = PDR_DZ(IIJB:IIJE,1:D%NKT)*ZFLXZ(IIJB:IIJE,1:D%NKT) !$mnh_end_expand_array(JIJ=IIJB:IIJE,JK=1:D%NKT) CALL MZF_PHY(D,ZWORK2,ZWORK3) - CALL LES_MEAN_SUBGRID_PHY(D,ZWORK3, X_LES_RES_ddxa_Rt_SBG_UaRt ) + CALL LES_MEAN_SUBGRID_PHY(D,TLES,ZWORK3, TLES%X_LES_RES_ddxa_Rt_SBG_UaRt ) ! CALL MZM_PHY(D,PEMOIST,ZWORK2) !$mnh_expand_array(JIJ=IIJB:IIJE,JK=1:D%NKT) ZWORK3(IIJB:IIJE,1:D%NKT) = ZWORK2(IIJB:IIJE,1:D%NKT) * ZFLXZ(IIJB:IIJE,1:D%NKT) !$mnh_end_expand_array(JIJ=IIJB:IIJE,JK=1:D%NKT) CALL MZF_PHY(D,ZWORK3,ZWORK4) - CALL LES_MEAN_SUBGRID_PHY(D,ZWORK4, X_LES_SUBGRID_WThv , .TRUE. ) + CALL LES_MEAN_SUBGRID_PHY(D,TLES,ZWORK4, TLES%X_LES_SUBGRID_WThv , .TRUE. ) ! !$mnh_expand_array(JIJ=IIJB:IIJE,JK=1:D%NKT) ZWORK2(IIJB:IIJE,1:D%NKT) = -CSTURB%XCTP*PSQRT_TKE(IIJB:IIJE,1:D%NKT)/PLM(IIJB:IIJE,1:D%NKT) & *ZWORK1(IIJB:IIJE,1:D%NKT) !$mnh_end_expand_array(JIJ=IIJB:IIJE,JK=1:D%NKT) - CALL LES_MEAN_SUBGRID_PHY(D,ZWORK2, X_LES_SUBGRID_RtPz ) + CALL LES_MEAN_SUBGRID_PHY(D,TLES,ZWORK2, TLES%X_LES_SUBGRID_RtPz ) CALL SECOND_MNH(ZTIME2) - XTIME_LES = XTIME_LES + ZTIME2 - ZTIME1 + TLES%XTIME_LES = TLES%XTIME_LES + ZTIME2 - ZTIME1 END IF ! END IF @@ -1222,7 +1222,7 @@ END IF ! !* 4.1 <w Rc> ! -IF ( ((TURBN%LTURB_FLX .AND. TPFILE%LOPENED) .OR. OLES_CALL) .AND. (KRRL > 0) ) THEN +IF ( ((TURBN%LTURB_FLX .AND. TPFILE%LOPENED) .OR. TLES%LLES_CALL) .AND. (KRRL > 0) ) THEN ! ! recover the Conservative potential temperature flux : ! With TURBN%LHARAT is true tke and length scales at half levels @@ -1282,12 +1282,12 @@ IF ( ((TURBN%LTURB_FLX .AND. TPFILE%LOPENED) .OR. OLES_CALL) .AND. (KRRL > 0) ) ! ! and we store in LES configuration this subgrid flux <w'rc'> ! - IF (OLES_CALL) THEN + IF (TLES%LLES_CALL) THEN CALL SECOND_MNH(ZTIME1) CALL MZF_PHY(D,ZFLXZ,ZWORK1) - CALL LES_MEAN_SUBGRID_PHY(D,ZWORK1, X_LES_SUBGRID_WRc ) + CALL LES_MEAN_SUBGRID_PHY(D,TLES,ZWORK1, TLES%X_LES_SUBGRID_WRc ) CALL SECOND_MNH(ZTIME2) - XTIME_LES = XTIME_LES + ZTIME2 - ZTIME1 + TLES%XTIME_LES = TLES%XTIME_LES + ZTIME2 - ZTIME1 END IF ! END IF !end of <w Rc> diff --git a/src/common/turb/modi_turb.F90 b/src/common/turb/modi_turb.F90 index f03211008e41d80b5d1aef437cc5e01fcd6444e5..404de57d6fc6f257402e960af8fa23592b9de888 100644 --- a/src/common/turb/modi_turb.F90 +++ b/src/common/turb/modi_turb.F90 @@ -4,11 +4,11 @@ ! INTERFACE ! - SUBROUTINE TURB(CST,CSTURB,BUCONF,TURBN,D, & + SUBROUTINE TURB(CST,CSTURB,BUCONF,TURBN,D,TLES, & & 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,OLES_CALL,OCOUPLES,OBLOWSNOW, & + & O2D,ONOMIXLG,OFLAT,OCOUPLES,OBLOWSNOW, & & OCOMPUTE_SRC, PRSNOW, & & OOCEAN,ODEEPOC,ODIAG_IN_RUN, & & HTURBLEN_CL,HCLOUD, & @@ -38,12 +38,14 @@ 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 -! -TYPE(DIMPHYEX_t), INTENT(IN) :: D -TYPE(CST_t), INTENT(IN) :: CST -TYPE(CSTURB_t), INTENT(IN) :: CSTURB -TYPE(TBUDGETCONF_t), INTENT(IN) :: BUCONF -TYPE(TURB_t), INTENT(IN) :: TURBN +USE MODD_LES, ONLY: TLES_t +! +TYPE(DIMPHYEX_t), INTENT(IN) :: D ! PHYEX variables dimensions structure +TYPE(CST_t), INTENT(IN) :: CST ! modd_cst general constant structure +TYPE(CSTURB_t), INTENT(IN) :: CSTURB ! modd_csturb turb constant structure +TYPE(TBUDGETCONF_t), INTENT(IN) :: BUCONF ! budget structure +TYPE(TURB_t), INTENT(IN) :: TURBN ! modn_turbn (turb namelist) structure +TYPE(TLES_t), INTENT(IN) :: TLES ! modd_les structure INTEGER, INTENT(IN) :: KGRADIENTS ! Number of stored horizontal gradients INTEGER, INTENT(IN) :: KMI ! model index number INTEGER, INTENT(IN) :: KRR ! number of moist var. @@ -59,7 +61,6 @@ LOGICAL, INTENT(IN) :: OCOMPUTE_SRC ! flag to define dimension LOGICAL, INTENT(IN) :: OOCEAN ! switch for Ocean model version LOGICAL, INTENT(IN) :: ODEEPOC ! activates sfc forcing for ideal ocean deep conv LOGICAL, INTENT(IN) :: OFLAT ! Logical for zero ororography -LOGICAL, INTENT(IN) :: OLES_CALL ! compute the LES diagnostics at current time-step LOGICAL, INTENT(IN) :: OCOUPLES ! switch to activate atmos-ocean LES version LOGICAL, INTENT(IN) :: OBLOWSNOW ! switch to activate pronostic blowing snow LOGICAL, INTENT(IN) :: ODIAG_IN_RUN ! switch to activate online diagnostics (mesonh) diff --git a/src/common/turb/turb.F90 b/src/common/turb/turb.F90 index 919199a4a67fc004c982ad95f6d958dc815b5bf9..a6e511f70948dfcafee4a3f40a8e35d1404c059f 100644 --- a/src/common/turb/turb.F90 +++ b/src/common/turb/turb.F90 @@ -3,11 +3,11 @@ !MNH_LIC version 1. See LICENSE, CeCILL-C_V1-en.txt and CeCILL-C_V1-fr.txt !MNH_LIC for details. version 1. !----------------------------------------------------------------- - SUBROUTINE TURB(CST,CSTURB,BUCONF,TURBN,D, & + SUBROUTINE TURB(CST,CSTURB,BUCONF,TURBN,D,TLES, & & 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,OLES_CALL,OCOUPLES,OBLOWSNOW, & + & O2D,ONOMIXLG,OFLAT,OCOUPLES,OBLOWSNOW, & & OCOMPUTE_SRC, PRSNOW, & & OOCEAN,ODEEPOC,ODIAG_IN_RUN, & & HTURBLEN_CL,HCLOUD, & @@ -250,7 +250,7 @@ USE MODD_BUDGET, ONLY: NBUDGET_U, NBUDGET_V, NBUDGET_W, NBUDGET_TH, NBUD USE MODD_FIELD, ONLY: TFIELDDATA,TYPEREAL USE MODD_IO, ONLY: TFILEDATA ! -USE MODD_LES +USE MODD_LES, ONLY : TLES_t USE MODD_IBM_PARAM_n, ONLY: LIBM, XIBM_LS, XIBM_XMUT USE MODD_DIMPHYEX, ONLY: DIMPHYEX_t USE MODD_TURB_n, ONLY: TURB_t @@ -286,11 +286,12 @@ IMPLICIT NONE ! ! ! -TYPE(DIMPHYEX_t), INTENT(IN) :: D -TYPE(CST_t), INTENT(IN) :: CST -TYPE(CSTURB_t), INTENT(IN) :: CSTURB -TYPE(TBUDGETCONF_t), INTENT(IN) :: BUCONF -TYPE(TURB_t), INTENT(IN) :: TURBN +TYPE(DIMPHYEX_t), INTENT(IN) :: D ! PHYEX variables dimensions structure +TYPE(CST_t), INTENT(IN) :: CST ! modd_cst general constant structure +TYPE(CSTURB_t), INTENT(IN) :: CSTURB ! modd_csturb turb constant structure +TYPE(TBUDGETCONF_t), INTENT(IN) :: BUCONF ! budget structure +TYPE(TURB_t), INTENT(IN) :: TURBN ! modn_turbn (turb namelist) structure +TYPE(TLES_t), INTENT(INOUT) :: TLES ! modd_les structure INTEGER, INTENT(IN) :: KGRADIENTS ! Number of stored horizontal gradients INTEGER, INTENT(IN) :: KMI ! model index number INTEGER, INTENT(IN) :: KRR ! number of moist var. @@ -305,7 +306,6 @@ LOGICAL, INTENT(IN) :: OCOMPUTE_SRC ! flag to define dimension LOGICAL, INTENT(IN) :: OOCEAN ! switch for Ocean model version LOGICAL, INTENT(IN) :: ODEEPOC ! activates sfc forcing for ideal ocean deep conv LOGICAL, INTENT(IN) :: OFLAT ! Logical for zero ororography -LOGICAL, INTENT(IN) :: OLES_CALL ! compute the LES diagnostics at current time-step LOGICAL, INTENT(IN) :: OCOUPLES ! switch to activate atmos-ocean LES version LOGICAL, INTENT(IN) :: OBLOWSNOW ! switch to activate pronostic blowing snow LOGICAL, INTENT(IN) :: ODIAG_IN_RUN ! switch to activate online diagnostics (mesonh) @@ -509,7 +509,7 @@ IF (LHOOK) CALL DR_HOOK('TURB',0,ZHOOK_HANDLE) IF (TURBN%LHARAT .AND. TURBN%CTURBDIM /= '1DIM') THEN CALL ABOR1('TURBN%LHARATU only implemented for option TURBN%CTURBDIM=1DIM!') ENDIF -IF (TURBN%LHARAT .AND. OLES_CALL) THEN +IF (TURBN%LHARAT .AND. TLES%LLES_CALL) THEN CALL ABOR1('TURBN%LHARATU not implemented for option LLES_CALL') ENDIF ! @@ -993,11 +993,12 @@ IF( BUCONF%LBUDGET_SV ) THEN END DO END IF -CALL TURB_VER(D,CST,CSTURB,TURBN,KRR,KRRL,KRRI,KGRADIENTS,& +CALL TURB_VER(D,CST,CSTURB,TURBN,TLES, & + KRR,KRRL,KRRI,KGRADIENTS, & OOCEAN, ODEEPOC, OCOMPUTE_SRC, & KSV,KSV_LGBEG,KSV_LGEND, & ZEXPL,HPROGRAM, O2D, ONOMIXLG, OFLAT, & - OLES_CALL,OCOUPLES,OBLOWSNOW, PRSNOW, & + OCOUPLES,OBLOWSNOW, PRSNOW, & PTSTEP,TPFILE, & PDXX,PDYY,PDZZ,PDZX,PDZY,PDIRCOSZW,PZZ, & PCOSSLOPE,PSINSLOPE, & @@ -1097,7 +1098,7 @@ IF( TURBN%CTURBDIM == '3DIM' ) THEN !à supprimer une fois le précédent ifdef REPRO48 validé #ifdef REPRO48 #else - CALL TURB_HOR_SPLT(D,CST,CSTURB, TURBN, & + CALL TURB_HOR_SPLT(D,CST,CSTURB, TURBN, TLES, & KSPLIT, KRR, KRRL, KRRI, KSV,KSV_LGBEG,KSV_LGEND, & PTSTEP,HLBCX,HLBCY, OFLAT,O2D, ONOMIXLG, & OOCEAN,OCOMPUTE_SRC,OBLOWSNOW,PRSNOW, & @@ -1199,11 +1200,11 @@ ELSE ZRTKEMS(:,:)=0. END IF ! -CALL TKE_EPS_SOURCES(D,CST,CSTURB,BUCONF,TURBN,HPROGRAM, & +CALL TKE_EPS_SOURCES(D,CST,CSTURB,BUCONF,TURBN,TLES,HPROGRAM, & & KMI,PTKET,ZLM,ZLEPS,PDP,ZTRH, & & PRHODJ,PDZZ,PDXX,PDYY,PDZX,PDZY,PZZ, & & PTSTEP,ZEXPL, & - & TPFILE,OLES_CALL,ODIAG_IN_RUN,OOCEAN, & + & TPFILE,ODIAG_IN_RUN,OOCEAN, & & PSFU,PSFV, & & PTP,PRTKES,PRTHLS,ZCOEF_DISS,PTDIFF,PTDISS,ZRTKEMS,& & TBUDGETS,KBUDGETS, PEDR=PEDR, PTR=PTR,PDISS=PDISS, & @@ -1325,31 +1326,31 @@ CALL SOURCES_NEG_CORRECT_PHY(D,KSV,HCLOUD, 'NETUR',KRR,PTSTEP,PPABST,PTHLT,PRT,P !* 9. LES averaged surface fluxes ! --------------------------- ! -IF (OLES_CALL) THEN +IF (TLES%LLES_CALL) THEN CALL SECOND_MNH(ZTIME1) - CALL LES_MEAN_SUBGRID_PHY(D,PSFTH,X_LES_Q0) - CALL LES_MEAN_SUBGRID_PHY(D,PSFRV,X_LES_E0) + CALL LES_MEAN_SUBGRID_PHY(D,TLES,PSFTH,TLES%X_LES_Q0) + CALL LES_MEAN_SUBGRID_PHY(D,TLES,PSFRV,TLES%X_LES_E0) DO JSV=1,KSV - CALL LES_MEAN_SUBGRID_PHY(D,PSFSV(:,JSV),X_LES_SV0(:,JSV)) + CALL LES_MEAN_SUBGRID_PHY(D,TLES,PSFSV(:,JSV),TLES%X_LES_SV0(:,JSV)) END DO - CALL LES_MEAN_SUBGRID_PHY(D,PSFU,X_LES_UW0) - CALL LES_MEAN_SUBGRID_PHY(D,PSFV,X_LES_VW0) + CALL LES_MEAN_SUBGRID_PHY(D,TLES,PSFU,TLES%X_LES_UW0) + CALL LES_MEAN_SUBGRID_PHY(D,TLES,PSFV,TLES%X_LES_VW0) ! !$mnh_expand_array(JIJ=IIJB:IIJE) ZWORK2D(IIJB:IIJE) = (PSFU(IIJB:IIJE)*PSFU(IIJB:IIJE)+PSFV(IIJB:IIJE)*PSFV(IIJB:IIJE))**0.25 !$mnh_end_expand_array(JIJ=IIJB:IIJE) - CALL LES_MEAN_SUBGRID_PHY(D,ZWORK2D,X_LES_USTAR) + CALL LES_MEAN_SUBGRID_PHY(D,TLES,ZWORK2D,TLES%X_LES_USTAR) !---------------------------------------------------------------------------- ! !* 10. LES for 3rd order moments ! ------------------------- ! - CALL LES_MEAN_SUBGRID_PHY(D,ZMWTH,X_LES_SUBGRID_W2Thl) - CALL LES_MEAN_SUBGRID_PHY(D,ZMTH2,X_LES_SUBGRID_WThl2) + CALL LES_MEAN_SUBGRID_PHY(D,TLES,ZMWTH,TLES%X_LES_SUBGRID_W2Thl) + CALL LES_MEAN_SUBGRID_PHY(D,TLES,ZMTH2,TLES%X_LES_SUBGRID_WThl2) IF (KRR>0) THEN - CALL LES_MEAN_SUBGRID_PHY(D,ZMWR,X_LES_SUBGRID_W2Rt) - CALL LES_MEAN_SUBGRID_PHY(D,ZMTHR,X_LES_SUBGRID_WThlRt) - CALL LES_MEAN_SUBGRID_PHY(D,ZMR2,X_LES_SUBGRID_WRt2) + CALL LES_MEAN_SUBGRID_PHY(D,TLES,ZMWR,TLES%X_LES_SUBGRID_W2Rt) + CALL LES_MEAN_SUBGRID_PHY(D,TLES,ZMTHR,TLES%X_LES_SUBGRID_WThlRt) + CALL LES_MEAN_SUBGRID_PHY(D,TLES,ZMR2,TLES%X_LES_SUBGRID_WRt2) END IF ! !---------------------------------------------------------------------------- @@ -1362,16 +1363,16 @@ IF (OLES_CALL) THEN !$mnh_expand_array(JIJ=IIJB:IIJE,JK=1:D%NKT) ZWORK1(IIJB:IIJE,1:D%NKT) = 2./3.*PTKET(IIJB:IIJE,1:D%NKT) !$mnh_end_expand_array(JIJ=IIJB:IIJE,JK=1:D%NKT) - CALL LES_MEAN_SUBGRID_PHY(D,ZWORK1,X_LES_SUBGRID_U2) - X_LES_SUBGRID_V2(:,:,:) = X_LES_SUBGRID_U2(:,:,:) - X_LES_SUBGRID_W2(:,:,:) = X_LES_SUBGRID_U2(:,:,:) + CALL LES_MEAN_SUBGRID_PHY(D,TLES,ZWORK1,TLES%X_LES_SUBGRID_U2) + TLES%X_LES_SUBGRID_V2(:,:,:) = TLES%X_LES_SUBGRID_U2(:,:,:) + TLES%X_LES_SUBGRID_W2(:,:,:) = TLES%X_LES_SUBGRID_U2(:,:,:) ! CALL GZ_M_W_PHY(D,PTHLT,PDZZ,ZWORK1) CALL MZF_PHY(D,ZWORK1,ZWORK2) !$mnh_expand_array(JIJ=IIJB:IIJE,JK=1:D%NKT) ZWORK2(IIJB:IIJE,1:D%NKT) = 2./3.*PTKET(IIJB:IIJE,1:D%NKT) *ZWORK2(IIJB:IIJE,1:D%NKT) !$mnh_end_expand_array(JIJ=IIJB:IIJE,JK=1:D%NKT) - CALL LES_MEAN_SUBGRID_PHY(D,ZWORK2,X_LES_RES_ddz_Thl_SBG_W2) + CALL LES_MEAN_SUBGRID_PHY(D,TLES,ZWORK2,TLES%X_LES_RES_ddz_Thl_SBG_W2) ! IF (KRR>=1) THEN CALL GZ_M_W_PHY(D,PRT(:,:,1),PDZZ,ZWORK1) @@ -1379,7 +1380,7 @@ IF (OLES_CALL) THEN !$mnh_expand_array(JIJ=IIJB:IIJE,JK=1:D%NKT) ZWORK2(IIJB:IIJE,1:D%NKT) = 2./3.*PTKET(IIJB:IIJE,1:D%NKT) *ZWORK2(IIJB:IIJE,1:D%NKT) !$mnh_end_expand_array(JIJ=IIJB:IIJE,JK=1:D%NKT) - CALL LES_MEAN_SUBGRID_PHY(D,ZWORK2,X_LES_RES_ddz_Rt_SBG_W2) + CALL LES_MEAN_SUBGRID_PHY(D,TLES,ZWORK2,TLES%X_LES_RES_ddz_Rt_SBG_W2) END IF DO JSV=1,KSV CALL GZ_M_W_PHY(D,PSVT(:,:,JSV),PDZZ,ZWORK1) @@ -1387,7 +1388,7 @@ IF (OLES_CALL) THEN !$mnh_expand_array(JIJ=IIJB:IIJE,JK=1:D%NKT) ZWORK2(IIJB:IIJE,1:D%NKT) = 2./3.*PTKET(IIJB:IIJE,1:D%NKT) *ZWORK2(IIJB:IIJE,1:D%NKT) !$mnh_end_expand_array(JIJ=IIJB:IIJE,JK=1:D%NKT) - CALL LES_MEAN_SUBGRID_PHY(D,ZWORK2, X_LES_RES_ddz_Sv_SBG_W2(:,:,:,JSV)) + CALL LES_MEAN_SUBGRID_PHY(D,TLES,ZWORK2, TLES%X_LES_RES_ddz_Sv_SBG_W2(:,:,:,JSV)) END DO END IF @@ -1396,16 +1397,16 @@ IF (OLES_CALL) THEN !* 12. LES mixing end dissipative lengths, presso-correlations ! ------------------------------------------------------- ! - CALL LES_MEAN_SUBGRID_PHY(D,ZLM,X_LES_SUBGRID_LMix) - CALL LES_MEAN_SUBGRID_PHY(D,ZLEPS,X_LES_SUBGRID_LDiss) + CALL LES_MEAN_SUBGRID_PHY(D,TLES,ZLM,TLES%X_LES_SUBGRID_LMix) + CALL LES_MEAN_SUBGRID_PHY(D,TLES,ZLEPS,TLES%X_LES_SUBGRID_LDiss) ! !* presso-correlations for subgrid Tke are equal to zero. ! ZLEPS(:,:) = 0. !ZLEPS is used as a work array (not used anymore) - CALL LES_MEAN_SUBGRID_PHY(D,ZLEPS,X_LES_SUBGRID_WP) + CALL LES_MEAN_SUBGRID_PHY(D,TLES,ZLEPS,TLES%X_LES_SUBGRID_WP) ! CALL SECOND_MNH(ZTIME2) - XTIME_LES = XTIME_LES + ZTIME2 - ZTIME1 + TLES%XTIME_LES = TLES%XTIME_LES + ZTIME2 - ZTIME1 END IF ! IF(PRESENT(PLEM)) PLEM(IIJB:IIJE,IKTB:IKTE) = ZLM(IIJB:IIJE,IKTB:IKTE) diff --git a/src/mesonh/ext/ini_lesn.f90 b/src/mesonh/ext/ini_lesn.f90 new file mode 100644 index 0000000000000000000000000000000000000000..378e43f533ddc33eac977c0cc9a82b5b9e72e6be --- /dev/null +++ b/src/mesonh/ext/ini_lesn.f90 @@ -0,0 +1,2007 @@ +!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_segn.f90 b/src/mesonh/ext/ini_segn.f90 index 73a688ce0d4950903855cae513f2d5443be8b943..c581f7c0140586a06e2e0309fff7d0e1ceedd4ca 100644 --- a/src/mesonh/ext/ini_segn.f90 +++ b/src/mesonh/ext/ini_segn.f90 @@ -175,6 +175,7 @@ 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 @@ -316,6 +317,7 @@ ILUSEG = TZFILE_DES%NLU ! ------------------ ! CALL PARAM_ICE_ASSOCIATE() +CALL LES_ASSOCIATE() CALL DEFAULT_DESFM_n(KMI) ! !------------------------------------------------------------------------------- diff --git a/src/mesonh/ext/les_cloud_masksn.f90 b/src/mesonh/ext/les_cloud_masksn.f90 new file mode 100644 index 0000000000000000000000000000000000000000..10e9e4093fc35cf7e5d3ba3c0ebcce0047611694 --- /dev/null +++ b/src/mesonh/ext/les_cloud_masksn.f90 @@ -0,0 +1,419 @@ +!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 new file mode 100644 index 0000000000000000000000000000000000000000..98c5cd306456bf19b2839c9ee608448392c07078 --- /dev/null +++ b/src/mesonh/ext/les_ini_timestepn.f90 @@ -0,0 +1,407 @@ +!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 index 7983b1217436ded08e54ac96f760572f8cd20495..f66f89eae81a2f226ff87fd494f3982cc065fc61 100644 --- a/src/mesonh/ext/lesn.f90 +++ b/src/mesonh/ext/lesn.f90 @@ -240,11 +240,11 @@ ILUOUT = TLUOUT%NLU !* interpolation coefficients for Z type grid ! IF (CSPECTRA_LEVEL_TYPE=='Z') THEN - IF (ALLOCATED(XCOEFLIN_CURRENT_SPEC)) DEALLOCATE(XCOEFLIN_CURRENT_SPEC) - IF (ALLOCATED(NKLIN_CURRENT_SPEC )) DEALLOCATE(NKLIN_CURRENT_SPEC ) + IF (ASSOCIATED(XCOEFLIN_CURRENT_SPEC)) CALL LES_DEALLOCATE('XCOEFLIN_CURRENT_SPEC') + IF (ASSOCIATED(NKLIN_CURRENT_SPEC )) CALL LES_DEALLOCATE('NKLIN_CURRENT_SPEC') ! - ALLOCATE(XCOEFLIN_CURRENT_SPEC(IIU,IJU,NSPECTRA_K)) - ALLOCATE(NKLIN_CURRENT_SPEC (IIU,IJU,NSPECTRA_K)) + 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 (:,:,:) @@ -1146,16 +1146,16 @@ DEALLOCATE(ZDTHRADLW_LES ) !* 9.2 current time-step LES masks (in MODD_LES) ! --------------------------- ! -DEALLOCATE(LLES_CURRENT_CART_MASK) -IF (LLES_NEB_MASK) DEALLOCATE(LLES_CURRENT_NEB_MASK) -IF (LLES_CORE_MASK) DEALLOCATE(LLES_CURRENT_CORE_MASK) +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 - DEALLOCATE(LLES_CURRENT_MY_MASKS) + CALL LES_DEALLOCATE('LLES_CURRENT_MY_MASKS') END IF IF (LLES_CS_MASK) THEN - DEALLOCATE(LLES_CURRENT_CS1_MASK) - IF (NSV_CS >= 2) DEALLOCATE(LLES_CURRENT_CS2_MASK) - IF (NSV_CS == 3) DEALLOCATE(LLES_CURRENT_CS3_MASK) + 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 ! ! diff --git a/src/mesonh/ext/phys_paramn.f90 b/src/mesonh/ext/phys_paramn.f90 index 4dfac6d8acd37a94a03d72389d2ff5b03727aaa3..8a16b6df6ea4d303072c5044c3bdff06e0bd6668 100644 --- a/src/mesonh/ext/phys_paramn.f90 +++ b/src/mesonh/ext/phys_paramn.f90 @@ -868,12 +868,12 @@ IF (LOCEAN) THEN 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 + 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 + 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) @@ -1564,7 +1564,7 @@ IF(LLEONARD) THEN 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,& + 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, & diff --git a/src/mesonh/ext/switch_sbg_lesn.f90 b/src/mesonh/ext/switch_sbg_lesn.f90 new file mode 100644 index 0000000000000000000000000000000000000000..2920680faff50dbca286eaea17c310b045650675 --- /dev/null +++ b/src/mesonh/ext/switch_sbg_lesn.f90 @@ -0,0 +1,589 @@ +!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 new file mode 100644 index 0000000000000000000000000000000000000000..9b6b326bc92ca2ebae7d62a7019a319903edebc4 --- /dev/null +++ b/src/mesonh/ext/write_lesn.f90 @@ -0,0 +1,1319 @@ +!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/ini_rain_ice.f90 b/src/mesonh/micro/ini_rain_ice.f90 index b82b51d2049279137762e857576db41862f72151..38f8fed026c66cf7102942d0cb5d9ed0d25fc317 100644 --- a/src/mesonh/micro/ini_rain_ice.f90 +++ b/src/mesonh/micro/ini_rain_ice.f90 @@ -1149,12 +1149,18 @@ END IF XFRMIN(7:9)=1. XFRMIN(10) =10. XFRMIN(11) =1. - XFRMIN(12) =100. + XFRMIN(12) =100. !0 in suparar XFRMIN(13) =1.0E-15 XFRMIN(14) =120. XFRMIN(15) =1.0E-4 XFRMIN(16:20)=0. - XFRMIN(21)=1. + XFRMIN(21:22)=1. + XFRMIN(23)=0.5 + XFRMIN(24)=1.5 + XFRMIN(25)=30. + XFRMIN(26:38)=0. + XFRMIN(39)=0.25 + XFRMIN(40)=0.15 ! ! !------------------------------------------------------------------------------- diff --git a/src/mesonh/turb/les_mean_subgrid.f90 b/src/mesonh/turb/les_mean_subgrid.f90 new file mode 100644 index 0000000000000000000000000000000000000000..24895fdb06e56b851a2297c1c025eb9881da7c3c --- /dev/null +++ b/src/mesonh/turb/les_mean_subgrid.f90 @@ -0,0 +1,362 @@ +!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 les 2006/08/30 18:41:10 +!----------------------------------------------------------------- +! ##################### +MODULE MODI_LES_MEAN_SUBGRID +! ##################### +! +INTERFACE LES_MEAN_SUBGRID +! + SUBROUTINE LES_MEAN_SUBGRID_3D(PA, PA_MEAN, OSUM) + +REAL, DIMENSION(:,:,:), INTENT(IN) :: PA +! +REAL, DIMENSION(:,:,:), INTENT(INOUT) :: PA_MEAN +! +LOGICAL, OPTIONAL, INTENT(IN) :: OSUM +! +END SUBROUTINE LES_MEAN_SUBGRID_3D +! + + SUBROUTINE LES_MEAN_SUBGRID_SURF(PA, PA_MEAN, OSUM) + +REAL, DIMENSION(:,:), INTENT(IN) :: PA +! +REAL, DIMENSION(:), INTENT(INOUT) :: PA_MEAN +! +LOGICAL, OPTIONAL, INTENT(IN) :: OSUM +! +END SUBROUTINE LES_MEAN_SUBGRID_SURF +! +END INTERFACE +! +END MODULE MODI_LES_MEAN_SUBGRID +! +! ############################################## + SUBROUTINE LES_MEAN_SUBGRID_3D(PA, PA_MEAN, OSUM) +! ############################################## +! +! +!!**** *LES_MEAN_SUBGRID* computes the average of one subgrid +!! field on one processor +!! +!! PURPOSE +!! ------- +!! +!! EXTERNAL +!! -------- +!! +!! IMPLICIT ARGUMENTS +!! ------------------ +!! +!! REFERENCE +!! --------- +!! +!! AUTHOR +!! ------ +!! V. Masson +!! +!! MODIFICATIONS +!! ------------- +!! Original 07/02/00 +!! V. Masson 06/11/02 use of 2D masks +!! C.Lac 10/2014 : Correction on user masks +!! +!! -------------------------------------------------------------------------- +! +!* 0. DECLARATIONS +! ------------ +! +USE MODD_LES +! +USE MODI_LES_VER_INT +USE MODI_LES_MEAN_1PROC +! +IMPLICIT NONE +! +! +!* 0.1 declarations of arguments +! +REAL, DIMENSION(:,:,:), INTENT(IN) :: PA +! +REAL, DIMENSION(:,:,:), INTENT(INOUT) :: PA_MEAN +! +LOGICAL, OPTIONAL, INTENT(IN) :: OSUM +! +! +! 0.2 declaration of local variables +! +REAL, DIMENSION(SIZE(PA,1),SIZE(PA,2),SIZE(PA_MEAN,1)) :: ZA_LES +REAL, DIMENSION(SIZE(PA_MEAN,1)) :: ZA_MEAN +REAL, DIMENSION(SIZE(PA_MEAN,1)) :: ZA_MEAN_OLD +LOGICAL, DIMENSION(SIZE(PA,1),SIZE(PA,2),SIZE(PA_MEAN,1)) :: GMASK +! +INTEGER, DIMENSION(SIZE(PA_MEAN,1)) :: IAVG_PTS +INTEGER, DIMENSION(SIZE(PA_MEAN,1)) :: IUND_PTS +! +INTEGER :: IMASK ! mask counter +INTEGER :: JI ! loop control +!------------------------------------------------------------------------------- +! +IF (.NOT. LLES_CALL) RETURN +! +ZA_MEAN_OLD(:) = 0. +!------------------------------------------------------------------------------- +! +!* interpolation on LES vertical levels. +! +CALL LES_VER_INT(PA,ZA_LES) +! +!* subgrid computations on cartesian mask +! -------------------------------------- +! +IMASK = 1 +! +!* averaging on the current processor domain of the subgrid variable +! +CALL LES_MEAN_1PROC(ZA_LES, LLES_CURRENT_CART_MASK(:,:,:), ZA_MEAN, IAVG_PTS, IUND_PTS) +! +IF (PRESENT(OSUM)) THEN + IF (OSUM) ZA_MEAN_OLD(:) = PA_MEAN(:,NLES_CURRENT_TCOUNT,IMASK) +END IF +PA_MEAN(:,NLES_CURRENT_TCOUNT,IMASK) = ZA_MEAN_OLD(:) + ZA_MEAN(:) +! +!------------------------------------------------------------------------------- +! +!* subgrid computations on nebulosity/clear-sky masks +! -------------------------------------------------- +! +IF (LLES_NEB_MASK) THEN +! +!* on nebulosity mask +! ------------------ +! + IMASK = IMASK + 1 +! + GMASK(:,:,:) = LLES_CURRENT_NEB_MASK (:,:,:) .AND. LLES_CURRENT_CART_MASK(:,:,:) +! +!* averaging on the current processor domain of the subgrid variable +! + CALL LES_MEAN_1PROC(ZA_LES, GMASK, ZA_MEAN, IAVG_PTS, IUND_PTS) +! + IF (PRESENT(OSUM)) THEN + IF (OSUM) ZA_MEAN_OLD(:) = PA_MEAN(:,NLES_CURRENT_TCOUNT,IMASK) + END IF + PA_MEAN(:,NLES_CURRENT_TCOUNT,IMASK) = ZA_MEAN_OLD(:) + ZA_MEAN(:) +! +!* on clear-sky mask +! ----------------- +! + IMASK = IMASK + 1 +! + GMASK(:,:,:) = (.NOT. LLES_CURRENT_NEB_MASK (:,:,:)) .AND. LLES_CURRENT_CART_MASK(:,:,:) +! +!* averaging on the current processor domain of the subgrid variable +! + CALL LES_MEAN_1PROC(ZA_LES, GMASK, ZA_MEAN, IAVG_PTS, IUND_PTS) +! + IF (PRESENT(OSUM)) THEN + IF (OSUM) ZA_MEAN_OLD(:) = PA_MEAN(:,NLES_CURRENT_TCOUNT,IMASK) + END IF + PA_MEAN(:,NLES_CURRENT_TCOUNT,IMASK) = ZA_MEAN_OLD(:) + ZA_MEAN(:) +! +END IF +! +!------------------------------------------------------------------------------- +! +!* subgrid computations on core/no core masks +! -------------------------------------------------------------- +! +IF (LLES_CORE_MASK) THEN +! +!* on core mask +! ------------ +! + IMASK = IMASK + 1 +! + GMASK(:,:,:) = LLES_CURRENT_CORE_MASK(:,:,:) .AND. LLES_CURRENT_CART_MASK(:,:,:) +! +!* averaging on the current processor domain of the subgrid variable +! + CALL LES_MEAN_1PROC(ZA_LES, GMASK, ZA_MEAN, IAVG_PTS, IUND_PTS) +! + IF (PRESENT(OSUM)) THEN + IF (OSUM) ZA_MEAN_OLD(:) = PA_MEAN(:,NLES_CURRENT_TCOUNT,IMASK) + END IF + PA_MEAN(:,NLES_CURRENT_TCOUNT,IMASK) = ZA_MEAN_OLD(:) + ZA_MEAN(:) +! +!* on NO core mask +! ------------------------ +! + IMASK = IMASK + 1 +! + GMASK(:,:,:) = (.NOT. LLES_CURRENT_CORE_MASK(:,:,:)) .AND. LLES_CURRENT_CART_MASK(:,:,:) +! +!* averaging on the current processor domain of the subgrid variable +! + CALL LES_MEAN_1PROC(ZA_LES, GMASK, ZA_MEAN, IAVG_PTS, IUND_PTS) +! + IF (PRESENT(OSUM)) THEN + IF (OSUM) ZA_MEAN_OLD(:) = PA_MEAN(:,NLES_CURRENT_TCOUNT,IMASK) + END IF + PA_MEAN(:,NLES_CURRENT_TCOUNT,IMASK) = ZA_MEAN_OLD(:) + ZA_MEAN(:) +END IF +! +!------------------------------------------------------------------------------- +! +!* subgrid computations on conditional sampling mask +! ------------------------------------------------- +! +IF (LLES_CS_MASK) THEN + IMASK = IMASK + 1 +! + GMASK(:,:,:) = LLES_CURRENT_CS1_MASK(:,:,:) +! +!* averaging on the current processor domain of the subgrid variable +! + CALL LES_MEAN_1PROC(ZA_LES, GMASK, ZA_MEAN, IAVG_PTS, IUND_PTS) +! + IF (PRESENT(OSUM)) THEN + IF (OSUM) ZA_MEAN_OLD(:) = PA_MEAN(:,NLES_CURRENT_TCOUNT,IMASK) + END IF + PA_MEAN(:,NLES_CURRENT_TCOUNT,IMASK) = ZA_MEAN_OLD(:) + ZA_MEAN(:) +! + IMASK = IMASK + 1 +! + GMASK(:,:,:) = LLES_CURRENT_CS2_MASK(:,:,:) +! +!* averaging on the current processor domain of the subgrid variable +! + CALL LES_MEAN_1PROC(ZA_LES, GMASK, ZA_MEAN, IAVG_PTS, IUND_PTS) +! + IF (PRESENT(OSUM)) THEN + IF (OSUM) ZA_MEAN_OLD(:) = PA_MEAN(:,NLES_CURRENT_TCOUNT,IMASK) + END IF + PA_MEAN(:,NLES_CURRENT_TCOUNT,IMASK) = ZA_MEAN_OLD(:) + ZA_MEAN(:) +! + IMASK = IMASK + 1 +! + GMASK(:,:,:) = LLES_CURRENT_CS3_MASK(:,:,:) +! +!* averaging on the current processor domain of the subgrid variable +! + CALL LES_MEAN_1PROC(ZA_LES, GMASK, ZA_MEAN, IAVG_PTS, IUND_PTS) +! + IF (PRESENT(OSUM)) THEN + IF (OSUM) ZA_MEAN_OLD(:) = PA_MEAN(:,NLES_CURRENT_TCOUNT,IMASK) + END IF + PA_MEAN(:,NLES_CURRENT_TCOUNT,IMASK) = ZA_MEAN_OLD(:) + ZA_MEAN(:) +END IF +! +!------------------------------------------------------------------------------- +! +!* subgrid computations on user mask +! --------------------------------- +! +IF (LLES_MY_MASK) THEN + DO JI=1,NLES_MASKS_USER + IMASK = IMASK + 1 +! + GMASK(:,:,:) = LLES_CURRENT_MY_MASKS(:,:,:,JI) +! +!* averaging on the current processor domain of the subgrid variable +! + CALL LES_MEAN_1PROC(ZA_LES, GMASK, ZA_MEAN, IAVG_PTS, IUND_PTS) +! + IF (PRESENT(OSUM)) THEN + IF (OSUM) ZA_MEAN_OLD(:) = PA_MEAN(:,NLES_CURRENT_TCOUNT,IMASK) + END IF + PA_MEAN(:,NLES_CURRENT_TCOUNT,IMASK) = ZA_MEAN_OLD(:) + ZA_MEAN(:) + END DO +END IF +! +!------------------------------------------------------------------------------- +! +END SUBROUTINE LES_MEAN_SUBGRID_3D +! +! ############################################## + SUBROUTINE LES_MEAN_SUBGRID_SURF(PA, PA_MEAN, OSUM) +! ############################################## +! +! +!!**** *LES_MEAN_SUBGRID* computes the average of one subgrid +!! field on one processor +!! +!! PURPOSE +!! ------- +!! +!! EXTERNAL +!! -------- +!! +!! IMPLICIT ARGUMENTS +!! ------------------ +!! +!! REFERENCE +!! --------- +!! +!! AUTHOR +!! ------ +!! V. Masson +!! +!! MODIFICATIONS +!! ------------- +!! Original 07/02/00 +!! +!! -------------------------------------------------------------------------- +! +!* 0. DECLARATIONS +! ------------ +! +USE MODD_LES +! +USE MODI_LES_MEAN_1PROC +! +IMPLICIT NONE +! +! +!* 0.1 declarations of arguments +! +REAL, DIMENSION(:,:), INTENT(IN) :: PA +! +REAL, DIMENSION(:), INTENT(INOUT) :: PA_MEAN +! +LOGICAL, OPTIONAL, INTENT(IN) :: OSUM +! +! +! 0.2 declaration of local variables +! +REAL :: ZA_MEAN +REAL :: ZA_MEAN_OLD +! +INTEGER :: IAVG_PTS +INTEGER :: IUND_PTS +! +!------------------------------------------------------------------------------- +! +IF (.NOT. LLES_CALL) RETURN +! +ZA_MEAN_OLD = 0. +IF (PRESENT(OSUM)) THEN + IF (OSUM) ZA_MEAN_OLD = PA_MEAN(NLES_CURRENT_TCOUNT) +END IF +!------------------------------------------------------------------------------- +! +!* subgrid computations on cartesian mask +! -------------------------------------- +! +!* averaging on the current processor domain of the subgrid variable +! +CALL LES_MEAN_1PROC(PA, LLES_CURRENT_CART_MASK(:,:,1), ZA_MEAN, IAVG_PTS, IUND_PTS) +! +PA_MEAN(NLES_CURRENT_TCOUNT) = ZA_MEAN_OLD + ZA_MEAN +! +!------------------------------------------------------------------------------- +! +END SUBROUTINE LES_MEAN_SUBGRID_SURF diff --git a/src/mesonh/turb/les_mean_subgrid_phy.f90 b/src/mesonh/turb/les_mean_subgrid_phy.f90 index 637d1cc7326f4a9e0181dfdedba578d7e3adcabf..88a7d2c7260c6756fca71fcaabaebfbaa19b0f34 100644 --- a/src/mesonh/turb/les_mean_subgrid_phy.f90 +++ b/src/mesonh/turb/les_mean_subgrid_phy.f90 @@ -15,31 +15,33 @@ MODULE MODI_LES_MEAN_SUBGRID_PHY INTERFACE LES_MEAN_SUBGRID_PHY ! -SUBROUTINE LES_MEAN_SUBGRID_3D_PHY(D,PA, PA_MEAN, OSUM) +SUBROUTINE LES_MEAN_SUBGRID_3D_PHY(D, TLES, PA, PA_MEAN, OSUM) USE MODD_DIMPHYEX, ONLY: DIMPHYEX_t -USE MODD_LES, ONLY: NLES_CURRENT_TCOUNT +USE MODD_LES, ONLY: TLES_t ! IMPLICIT NONE ! TYPE(DIMPHYEX_t), INTENT(IN) :: D +TYPE(TLES_t), INTENT(IN) :: TLES REAL, DIMENSION(D%NIJT,D%NKT), INTENT(IN) :: PA ! -REAL, DIMENSION(D%NKLES,NLES_CURRENT_TCOUNT,D%NLESMASK), INTENT(INOUT) :: PA_MEAN +REAL, DIMENSION(D%NKLES,TLES%NLES_CURRENT_TCOUNT,D%NLESMASK), INTENT(INOUT) :: PA_MEAN ! LOGICAL, OPTIONAL, INTENT(IN) :: OSUM ! END SUBROUTINE LES_MEAN_SUBGRID_3D_PHY ! -SUBROUTINE LES_MEAN_SUBGRID_SURF_PHY(D,PA, PA_MEAN, OSUM) +SUBROUTINE LES_MEAN_SUBGRID_SURF_PHY(D, TLES, PA, PA_MEAN, OSUM) USE MODD_DIMPHYEX, ONLY: DIMPHYEX_t -USE MODD_LES, ONLY: NLES_CURRENT_TCOUNT +USE MODD_LES, ONLY: TLES_t ! IMPLICIT NONE ! TYPE(DIMPHYEX_t), INTENT(IN) :: D +TYPE(TLES_t), INTENT(IN) :: TLES REAL, DIMENSION(D%NIJT), INTENT(IN) :: PA ! -REAL, DIMENSION(NLES_CURRENT_TCOUNT), INTENT(INOUT) :: PA_MEAN +REAL, DIMENSION(TLES%NLES_CURRENT_TCOUNT), INTENT(INOUT) :: PA_MEAN ! LOGICAL, OPTIONAL, INTENT(IN) :: OSUM ! @@ -50,57 +52,60 @@ END INTERFACE LES_MEAN_SUBGRID_PHY END MODULE MODI_LES_MEAN_SUBGRID_PHY ! ! ############################################## - SUBROUTINE LES_MEAN_SUBGRID_3D_PHY(D, PA, PA_MEAN, OSUM) + SUBROUTINE LES_MEAN_SUBGRID_3D_PHY(D, TLES,PA, PA_MEAN, OSUM) ! ############################################## ! USE MODD_DIMPHYEX, ONLY: DIMPHYEX_t -USE MODD_LES, ONLY: NLES_CURRENT_TCOUNT +USE MODD_LES, ONLY: TLES_t ! IMPLICIT NONE ! TYPE(DIMPHYEX_t), INTENT(IN) :: D +TYPE(TLES_t), INTENT(IN) :: TLES REAL, DIMENSION(D%NIJT,D%NKT), INTENT(IN) :: PA -REAL, DIMENSION(D%NKLES,NLES_CURRENT_TCOUNT,D%NLESMASK), INTENT(INOUT) :: PA_MEAN +REAL, DIMENSION(D%NKLES,TLES%NLES_CURRENT_TCOUNT,D%NLESMASK), INTENT(INOUT) :: PA_MEAN LOGICAL, OPTIONAL, INTENT(IN) :: OSUM ! -CALL LES_MEAN_SUBGRID_unpack3D(D,PA, PA_MEAN, OSUM) +CALL LES_MEAN_SUBGRID_unpack3D(D,TLES, PA, PA_MEAN, OSUM) ! END SUBROUTINE LES_MEAN_SUBGRID_3D_PHY ! ! ############################################## - SUBROUTINE LES_MEAN_SUBGRID_SURF_PHY(D, PA, PA_MEAN, OSUM) + SUBROUTINE LES_MEAN_SUBGRID_SURF_PHY(D, TLES,PA, PA_MEAN, OSUM) ! ############################################## ! !* 0. DECLARATIONS ! ------------ ! USE MODD_DIMPHYEX, ONLY: DIMPHYEX_t -USE MODD_LES, ONLY: NLES_CURRENT_TCOUNT +USE MODD_LES, ONLY: TLES_t ! IMPLICIT NONE ! TYPE(DIMPHYEX_t), INTENT(IN) :: D +TYPE(TLES_t), INTENT(IN) :: TLES REAL, DIMENSION(D%NIJT), INTENT(IN) :: PA -REAL, DIMENSION(NLES_CURRENT_TCOUNT), INTENT(INOUT) :: PA_MEAN +REAL, DIMENSION(TLES%NLES_CURRENT_TCOUNT), INTENT(INOUT) :: PA_MEAN LOGICAL, OPTIONAL, INTENT(IN) :: OSUM ! -CALL LES_MEAN_SUBGRID_unpackSURF(D,PA, PA_MEAN, OSUM) +CALL LES_MEAN_SUBGRID_unpackSURF(D, TLES, PA, PA_MEAN, OSUM) ! END SUBROUTINE LES_MEAN_SUBGRID_SURF_PHY ! ! ############################################## - SUBROUTINE LES_MEAN_SUBGRID_unpack3D(D, PA, PA_MEAN, OSUM) + SUBROUTINE LES_MEAN_SUBGRID_unpack3D(D, TLES,PA, PA_MEAN, OSUM) ! ############################################## ! USE MODD_DIMPHYEX, ONLY: DIMPHYEX_t -USE MODD_LES, ONLY: NLES_CURRENT_TCOUNT +USE MODD_LES, ONLY: TLES_t USE MODI_LES_MEAN_SUBGRID ! IMPLICIT NONE ! TYPE(DIMPHYEX_t), INTENT(IN) :: D +TYPE(TLES_t), INTENT(IN) :: TLES REAL, DIMENSION(D%NIT,D%NJT,D%NKT), INTENT(IN) :: PA -REAL, DIMENSION(D%NKLES,NLES_CURRENT_TCOUNT,D%NLESMASK), INTENT(INOUT) :: PA_MEAN +REAL, DIMENSION(D%NKLES,TLES%NLES_CURRENT_TCOUNT,D%NLESMASK), INTENT(INOUT) :: PA_MEAN LOGICAL, OPTIONAL, INTENT(IN) :: OSUM ! CALL LES_MEAN_SUBGRID_3D(PA, PA_MEAN, OSUM) @@ -108,21 +113,22 @@ CALL LES_MEAN_SUBGRID_3D(PA, PA_MEAN, OSUM) END SUBROUTINE LES_MEAN_SUBGRID_unpack3D ! ! ############################################## - SUBROUTINE LES_MEAN_SUBGRID_unpackSURF(D, PA, PA_MEAN, OSUM) + SUBROUTINE LES_MEAN_SUBGRID_unpackSURF(D, TLES,PA, PA_MEAN, OSUM) ! ############################################## ! !* 0. DECLARATIONS ! ------------ ! USE MODD_DIMPHYEX, ONLY: DIMPHYEX_t -USE MODD_LES, ONLY: NLES_CURRENT_TCOUNT +USE MODD_LES, ONLY: TLES_t USE MODI_LES_MEAN_SUBGRID ! IMPLICIT NONE ! TYPE(DIMPHYEX_t), INTENT(IN) :: D +TYPE(TLES_t), INTENT(IN) :: TLES REAL, DIMENSION(D%NIT,D%NJT), INTENT(IN) :: PA -REAL, DIMENSION(NLES_CURRENT_TCOUNT), INTENT(INOUT) :: PA_MEAN +REAL, DIMENSION(TLES%NLES_CURRENT_TCOUNT), INTENT(INOUT) :: PA_MEAN LOGICAL, OPTIONAL, INTENT(IN) :: OSUM ! CALL LES_MEAN_SUBGRID_SURF(PA, PA_MEAN, OSUM) diff --git a/tools/PHYEX2IAL.sh b/tools/PHYEX2IAL.sh new file mode 100755 index 0000000000000000000000000000000000000000..94d7b28fe81367e4d26f67f6ebaabe78d57650a6 --- /dev/null +++ b/tools/PHYEX2IAL.sh @@ -0,0 +1,96 @@ +#!/bin/bash + +set -e +set -x + +################################ +#Command line arguments and help + +full_command="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)/$(basename "${BASH_SOURCE[0]}") $@" + +function usage { + echo "Usage: $0 [-h] [--phyex-repo-user PHYEXREPOuser] [--phyex-repo-protocol PHYEXREPOprotocol]" + echo " IALDIRECTORY:IALVERSION PHYEXVERSION BRANCH" + echo + echo "--phyex-repo-user PHYEXREPOuser user hosting the PHYEX repository on github," + echo " defaults to the env variable PHYEXREOuser (=$PHYEXREPOuser)" + echo "--phyex-repo-protocol PHYEXREPOprotocol protocol (https or ssh) to reach the PHYEX repository on github," + echo " defaults to the env variable PHYEXREOprotocol (=$PHYEXREPOprotocol)" + echo "IALDIRECTORY local directory containing the IAL repository" + echo "IALVERSION version to checkout in the IAL repository" + echo "PHYEXVERSION commit, tag (as tags/<tag>) of PHYEX to use" + echo + echo "The scripts builds a pack using PHYEX (with the help of the check_commit_ial.sh script)" + echo "and puts the content of the pack in the IAL repository." + echo "It is important that the PHYEXVERSION is based on the same version as the selected IALVERSION." +} + +IALDIRECTORY='' +IALVERSION='' +PHYEXVERSION='' +BRANCH='' + +positional=0 +while [ -n "$1" ]; do + case "$1" in + '-h') usage; exit;; + '--phyex-repo-user') export PHYEXREPOuser="$2"; shift;; + '--phyex-repo-protocol') export PHYEXREPOprotocol="$2"; shift;; + *) positional=$(($positional + 1)) + case $positional in + 1) if echo "$1" | grep ':'; then + IALDIRECTORY=$(echo "$1" | cut -d: -f1) + IALVERSION=$(echo "$1" | cut -d: -f2-) + else + echo "First mandatory argument must take the form IALDIRECTORY:IALVERSION with ':' as separator" + exit 1 + fi;; + 2) PHYEXVERSION="$1";; + 3) BRANCH="$1";; + *) echo "Only three positional arguments are allowed" + exit 2;; + esac + esac + shift +done + +if [ -z "${BRANCH-}" ]; then + echo "This script needs positional arguments, you can use the -h option to get help" + exit 3 +fi + +################################################## +#Create a gmkpack's pack and filling it with PHYEX + +# Create temporary directory and set up its automatic destruction +export TMP_LOC=$(mktemp -d --tmpdir=$TMP XXXXXX) +trap "echo Removing now temporary directory $TMP_LOC ; \rm -rf $TMP_LOC" EXIT + +# Creates a pack using check_commit_ial.sh script +echo "Creating pack in $TMP_LOC using $PHYEXVERSION PHYEX version with" +echo "PHYEXREPOuser=$PHYEXREPOuser and PHYEXREPOprotocol=$PHYEXREPOprotocol" +HOMEPACK=$TMP_LOC check_commit_ial.sh -p -f "${PHYEXVERSION}" + +######################################### +#Create branch in IAL, fill it and commit + +# Create the branch in the IAL repository +cd "${IALDIRECTORY}" +if [ ! -z "$(git status --porcelain)" ]; then + echo "The IAL repository ($IALDIRECTORY) cannot be used as it is not clean" + exit 4 +fi +git checkout -b "${BRANCH}" "${IALVERSION}" + +# copy the pack created with PHYEX into the IAL branch +cd $TMP_LOC/PHYEX/*/src/local/ +for rep in *; do + rsync -r --delete $rep /home/riette/IAL/ +done + +# commit +cd "${IALDIRECTORY}" +git add . +git commit -m "Integration of PHYEX version $PHYEXVERSION in IAL" \ + -m "PHYEXREPOuser=$PHYEXREPOuser PHYEXREPOprotocol=$PHYEXREPOprotocol $full_command" + diff --git a/tools/compare.py b/tools/compare.py index 816cac5f7e2090166bbc9995741d47e36f2d8c39..34f2084051c94187541a190eecf7883284b2e982 100755 --- a/tools/compare.py +++ b/tools/compare.py @@ -4,28 +4,17 @@ import xarray as xr avail_groups=['Stations/sta1', 'LES_budgets/Miscellaneous/Cartesian/Not_time_averaged/Not_normalized/cart/', -'LES_budgets/Miscellaneous/Cartesian/Time_averaged/Not_normalized/cart/', 'LES_budgets/Mean/Cartesian/Not_time_averaged/Not_normalized/cart/', -'LES_budgets/Mean/Cartesian/Time_averaged/Not_normalized/cart/', 'LES_budgets/Resolved/Cartesian/Not_time_averaged/Not_normalized/cart/', -'LES_budgets/Resolved/Cartesian/Time_averaged/Not_normalized/cart/', 'LES_budgets/Subgrid/Cartesian/Not_time_averaged/Not_normalized/cart/', -'LES_budgets/Subgrid/Cartesian/Time_averaged/Not_normalized/cart/', 'LES_budgets/Surface/Cartesian/Not_time_averaged/Not_normalized/cart/', -'LES_budgets/Surface/Cartesian/Time_averaged/Not_normalized/cart/', 'LES_budgets/BU_KE/Cartesian/Not_time_averaged/Not_normalized/cart/', -'LES_budgets/BU_KE/Cartesian/Time_averaged/Not_normalized/cart/', 'LES_budgets/BU_THL2/Cartesian/Not_time_averaged/Not_normalized/cart/', -'LES_budgets/BU_THL2/Cartesian/Time_averaged/Not_normalized/cart/', 'LES_budgets/BU_WTHL/Cartesian/Not_time_averaged/Not_normalized/cart/', -'LES_budgets/BU_WTHL/Cartesian/Time_averaged/Not_normalized/cart/', 'LES_budgets/BU_RT2/Cartesian/Not_time_averaged/Not_normalized/cart/', -'LES_budgets/BU_RT2/Cartesian/Time_averaged/Not_normalized/cart/', 'LES_budgets/BU_WRT/Cartesian/Not_time_averaged/Not_normalized/cart/', -'LES_budgets/BU_WRT/Cartesian/Time_averaged/Not_normalized/cart/', 'LES_budgets/BU_THLR/Cartesian/Not_time_averaged/Not_normalized/cart/', -'LES_budgets/BU_THLR/Cartesian/Time_averaged/Not_normalized/cart/'] - +] def compareBACKUPFiles(file_user, file_ref): @@ -73,6 +62,10 @@ def compareTSERIESFiles(file_user, file_ref): da = xr.open_dataset(file_user) da2 = xr.open_dataset(file_ref) variables = list(da.keys()) + try: + nk=len(da['level_les']) + except: + pass for var in variables: try: ecart_min = float(da2[var].min())-float(da[var].min()) @@ -86,11 +79,9 @@ def compareTSERIESFiles(file_user, file_ref): # Groups comparison for grp in avail_groups: try: - nk=len(da['level_les']) da = xr.open_dataset(file_user, group=grp) da2 = xr.open_dataset(file_ref, group=grp) variables = list(da.keys()) - print(grp) for var in variables: try: ecart_min = float(da2[var][:,:nk-JPVEXT].min())-float(da[var][:,:nk-JPVEXT].min())