From aeb97925c2e65326991dc6ca75e517e32f9dfec4 Mon Sep 17 00:00:00 2001
From: Quentin Rodier <quentin.rodier@meteo.fr>
Date: Sat, 26 Feb 2022 00:24:18 +0100
Subject: [PATCH] Quentin 26/02/2022: Add new files from MNH5.5.0 that will be
 modified

---
 src/mesonh/ext/lesn.f90            | 3569 ++++++++++++++++++++++++++++
 src/mesonh/ext/prep_ideal_case.f90 | 1933 +++++++++++++++
 src/mesonh/ext/set_rsou.f90        | 1633 +++++++++++++
 src/mesonh/ext/shallow_mf_pack.f90 |  481 ++++
 4 files changed, 7616 insertions(+)
 create mode 100644 src/mesonh/ext/lesn.f90
 create mode 100644 src/mesonh/ext/prep_ideal_case.f90
 create mode 100644 src/mesonh/ext/set_rsou.f90
 create mode 100644 src/mesonh/ext/shallow_mf_pack.f90

diff --git a/src/mesonh/ext/lesn.f90 b/src/mesonh/ext/lesn.f90
new file mode 100644
index 000000000..129929246
--- /dev/null
+++ b/src/mesonh/ext/lesn.f90
@@ -0,0 +1,3569 @@
+!MNH_LIC Copyright 2000-2021 CNRS, Meteo-France and Universite Paul Sabatier
+!MNH_LIC This is part of the Meso-NH software governed by the CeCILL-C licence
+!MNH_LIC version 1. See LICENSE, CeCILL-C_V1-en.txt and CeCILL-C_V1-fr.txt
+!MNH_LIC for details. version 1.
+!-----------------------------------------------------------------
+!     #################
+      SUBROUTINE  LES_n
+!     #################
+!
+!
+!!****  *LES_n* computes the current time-step LES diagnostics for model _n
+!!
+!!
+!!    PURPOSE
+!!    -------
+!!
+!!    EXTERNAL
+!!    --------
+!!
+!!    IMPLICIT ARGUMENTS
+!!    ------------------
+!!
+!!    REFERENCE
+!!    ---------
+!!
+!!    AUTHOR
+!!    ------
+!!      V. Masson
+!!
+!!    MODIFICATIONS
+!!    -------------
+!!      Original  07/02/00
+!!                01/02/01 (D. Gazen) add module MODD_NSV for NSV variable
+!!                06/11/02 (V. Masson) add LES budgets and use of anomalies
+!!                         in LES quantities computations
+!!                01/04/03 (V. Masson and F. Couvreux) bug in BL height loop
+!!                   10/07 (J.Pergaud) Add mass flux diagnostics
+!!                06/08    (O.Thouron) Add radiative diagnostics
+!!                12/10    (R.Honnert) Add EDKF mass flux in BL height
+!!                10/09    (P. Aumond) Add possibility of user maskS
+!!                10/14    (C.Lac) Correction on user masks
+!!                10/16    (C.Lac) Add ground droplet deposition amount
+!!  Philippe Wautelet: 05/2016-04/2018: new data structures and calls for I/O
+!!                     02/2019 (C. Lac) Add rain fraction as a LES diagnostic
+!!
+!! --------------------------------------------------------------------------
+!
+!*      0. DECLARATIONS
+!          ------------
+!
+USE MODD_CST
+USE MODD_CTURB, ONLY : XFTOP_O_FSURF
+!
+USE MODD_LES
+USE MODD_LES_BUDGET
+USE MODD_CONF
+USE MODD_LES_n
+USE MODD_RADIATIONS_n
+USE MODD_GRID_n
+USE MODD_REF_n
+USE MODD_FIELD_n
+USE MODD_CONF_n
+USE MODD_PARAM_n
+USE MODD_TURB_n
+USE MODD_METRICS_n
+USE MODD_LUNIT_n, ONLY: TLUOUT
+USE MODD_PARAM_n, ONLY: CCLOUD
+USE MODD_PRECIP_n, ONLY: XINPRR,XACPRR,XINPRR3D,XEVAP3D,XINPRC,XINDEP
+USE MODD_NSV, ONLY : NSV, NSV_CS
+USE MODD_PARAM_ICE, ONLY: LDEPOSC,LSEDIC
+USE MODD_PARAM_C2R2, ONLY: LDEPOC,LSEDC
+USE MODD_PARAM_LIMA, ONLY : MSEDC=>LSEDC
+!
+USE MODI_SHUMAN
+USE MODI_GRADIENT_M
+USE MODI_GRADIENT_U
+USE MODI_GRADIENT_V
+USE MODI_GRADIENT_W
+USE MODI_LES_VER_INT
+USE MODI_SPEC_VER_INT
+USE MODI_LES_MEAN_ll
+USE MODI_THL_RT_FROM_TH_R
+USE MODI_LES_RES_TR
+USE MODI_BUDGET_FLAGS
+USE MODI_LES_BUDGET_TEND_n
+USE MODI_BL_DEPTH_DIAG
+!
+USE MODE_ll
+USE MODE_MODELN_HANDLER
+!
+IMPLICIT NONE
+!
+!
+!*      0.1  declarations of arguments
+!
+!
+!       0.2  declaration of local variables
+!
+REAL, DIMENSION(:,:,:),   ALLOCATABLE :: ZEXN      ! Exner function
+REAL, DIMENSION(:,:,:),   ALLOCATABLE :: ZTHL      ! liquid potential temperature
+REAL, DIMENSION(:,:,:),   ALLOCATABLE :: ZTHV      ! virtual potential temperature
+REAL, DIMENSION(:,:,:),   ALLOCATABLE :: ZRHO      ! air density
+!
+REAL, DIMENSION(:,:,:),    ALLOCATABLE :: CHAMPXY1    !tableau intermediaire
+REAL, DIMENSION(:,:,:),   ALLOCATABLE :: ZTEMP     ! Temperature
+REAL, DIMENSION(:,:,:),   ALLOCATABLE :: ZEW
+REAL, DIMENSION(:,:,:),   ALLOCATABLE :: ZINDCLD   !indice cloud si rc>0
+REAL, DIMENSION(:,:,:),   ALLOCATABLE :: ZINDCLD2  !indice cloud rc>1E-5
+REAL, DIMENSION(:,:,:),   ALLOCATABLE :: ZCLDFR_LES! CLDFR    on LES vertical grid
+REAL, DIMENSION(:,:,:),   ALLOCATABLE :: ZRAINFR_LES! RAINFR   on LES vertical grid
+REAL, DIMENSION(:,:,:),   ALLOCATABLE :: ZMASSF    ! massflux=rho*w
+REAL, DIMENSION(:,:,:),   ALLOCATABLE :: ZREHU     ! relative humidity
+
+
+REAL, DIMENSION(:,:,:),   ALLOCATABLE :: ZZ_LES    ! alt.  on LES vertical grid
+REAL, DIMENSION(:,:,:),   ALLOCATABLE ::ZZZ_LES
+REAL, DIMENSION(:,:,:),   ALLOCATABLE ::ZINPRR3D_LES   ! precipitation flux 3D
+REAL, DIMENSION(:,:,:),   ALLOCATABLE ::ZEVAP3D_LES !evaporation 3D
+REAL, DIMENSION(:,:,:),   ALLOCATABLE :: ZP_LES    ! pres. on LES vertical grid
+REAL, DIMENSION(:,:,:),   ALLOCATABLE :: ZDP_LES   ! dynamical production TKE   
+REAL, DIMENSION(:,:,:),   ALLOCATABLE :: ZTP_LES   ! thermal production TKE    
+REAL, DIMENSION(:,:,:),   ALLOCATABLE :: ZTR_LES   ! transport production TKE    
+REAL, DIMENSION(:,:,:),   ALLOCATABLE :: ZDISS_LES ! dissipation TKE    
+REAL, DIMENSION(:,:,:),   ALLOCATABLE :: ZLM_LES    ! mixing length
+
+REAL, DIMENSION(:,:,:),   ALLOCATABLE :: ZDPDZ_LES   ! dp/dz on LES vertical grid
+REAL, DIMENSION(:,:,:),   ALLOCATABLE :: ZDTHLDZ_LES ! dThl/dz on LES vertical grid
+REAL, DIMENSION(:,:,:),   ALLOCATABLE :: ZDTHDZ_LES ! dTh/dz on LES vertical grid
+REAL, DIMENSION(:,:,:),   ALLOCATABLE :: ZDRTDZ_LES  ! dRt/dz  on LES vertical grid
+REAL, DIMENSION(:,:,:,:), ALLOCATABLE :: ZDSvDZ_LES  ! dSv/dz  on LES vertical grid
+REAL, DIMENSION(:,:,:),   ALLOCATABLE :: ZDUDZ_LES ! du/dz on LES vertical grid
+REAL, DIMENSION(:,:,:),   ALLOCATABLE :: ZDVDZ_LES ! dv/dz on LES vertical grid
+REAL, DIMENSION(:,:,:),   ALLOCATABLE :: ZDWDZ_LES ! dw/dz on LES vertical grid
+REAL, DIMENSION(:,:,:),   ALLOCATABLE :: ZEXN_LES  ! Exner on LES vertical grid
+REAL, DIMENSION(:,:,:),   ALLOCATABLE :: ZRHO_LES  ! rho   on LES vertical grid
+REAL, DIMENSION(:,:,:),   ALLOCATABLE :: ZU_LES    ! U     on LES vertical grid
+REAL, DIMENSION(:,:,:),   ALLOCATABLE :: ZV_LES    ! V     on LES vertical grid
+REAL, DIMENSION(:,:,:),   ALLOCATABLE :: ZW_LES    ! W     on LES vertical grid
+REAL, DIMENSION(:,:,:),   ALLOCATABLE :: ZMF_LES   ! mass flux on LES vertical grid
+REAL, DIMENSION(:,:,:),   ALLOCATABLE :: ZTH_LES   ! Theta on LES vertical grid
+REAL, DIMENSION(:,:,:),   ALLOCATABLE :: ZTHV_LES  ! thv   on LES vertical grid
+REAL, DIMENSION(:,:,:),   ALLOCATABLE :: ZTHL_LES  ! thl   on LES vertical grid
+REAL, DIMENSION(:,:,:),   ALLOCATABLE :: ZTKE_LES  ! tke   on LES vertical grid
+REAL, DIMENSION(:,:,:),   ALLOCATABLE :: ZKE_LES   ! ke   on LES vertical grid
+REAL, DIMENSION(:,:,:),   ALLOCATABLE :: ZRV_LES   ! Rv    on LES vertical grid
+REAL, DIMENSION(:,:,:),   ALLOCATABLE :: ZREHU_LES ! Rehu  on LES vertical grid
+REAL, DIMENSION(:,:,:),   ALLOCATABLE :: ZRC_LES   ! Rc    on LES vertical grid
+REAL, DIMENSION(:,:,:),   ALLOCATABLE :: ZRR_LES   ! Rr    on LES vertical grid
+REAL, DIMENSION(:,:,:),   ALLOCATABLE :: ZRI_LES   ! Ri    on LES vertical grid
+REAL, DIMENSION(:,:,:),   ALLOCATABLE :: ZRS_LES   ! Rs    on LES vertical grid
+REAL, DIMENSION(:,:,:),   ALLOCATABLE :: ZRG_LES   ! Rg    on LES vertical grid
+REAL, DIMENSION(:,:,:),   ALLOCATABLE :: ZRH_LES   ! Rh    on LES vertical grid
+REAL, DIMENSION(:,:,:),   ALLOCATABLE :: ZRT_LES   ! Rt    on LES vertical grid
+REAL, DIMENSION(:,:,:,:), ALLOCATABLE :: ZSV_LES   ! Sv    on LES vertical grid
+REAL, DIMENSION(:,:,:),   ALLOCATABLE :: ZTH_ANOM  ! Theta anomaly on LES vertical grid
+REAL, DIMENSION(:,:,:),   ALLOCATABLE :: ZTHV_ANOM ! thv   anomaly on LES vertical grid
+REAL, DIMENSION(:,:,:),   ALLOCATABLE :: ZRV_ANOM  ! Rv    anomaly on LES vertical grid
+REAL, DIMENSION(:,:,:),   ALLOCATABLE :: ZRC_ANOM  ! Rc    anomaly on LES vertical grid
+REAL, DIMENSION(:,:,:),   ALLOCATABLE :: ZRI_ANOM  ! Ri    anomaly on LES vertical grid
+REAL, DIMENSION(:,:,:),   ALLOCATABLE :: ZRR_ANOM  ! Rr    anomaly on LES vertical grid
+REAL, DIMENSION(:,:,:),   ALLOCATABLE :: ZP_ANOM   ! p     anomaly on LES vertical grid
+REAL, DIMENSION(:,:,:),   ALLOCATABLE :: ZRHO_ANOM ! rho   anomaly on LES vertical grid
+REAL, DIMENSION(:,:,:),   ALLOCATABLE :: ZDPDZ_ANOM! dp/dz anomaly on LES vertical grid
+REAL, DIMENSION(:),       ALLOCATABLE :: ZMEAN_DPDZ! dp/dz mean    on LES vertical grid
+REAL, DIMENSION(:),       ALLOCATABLE :: ZLES_MEAN_DRtDZ! drt/dz mean    on LES vertical grid
+REAL, DIMENSION(:),       ALLOCATABLE :: ZLES_MEAN_DTHDZ! dth/dz mean    on LES vertical grid
+REAL, DIMENSION(:,:),     ALLOCATABLE :: ZLES_MEAN_DSVDZ! drt/dz mean    on LES vertical grid
+REAL, DIMENSION(:,:),     ALLOCATABLE :: ZLWP_LES, ZRWP_LES, ZTKET_LES
+REAL, DIMENSION(:,:),     ALLOCATABLE :: ZIWP_LES, ZSWP_LES, ZGWP_LES, ZHWP_LES
+REAL, DIMENSION(:,:),     ALLOCATABLE :: ZINDCLD2D  !
+REAL, DIMENSION(:,:),     ALLOCATABLE :: ZINDCLD2D2 !
+REAL, DIMENSION(:,:),     ALLOCATABLE :: ZLWP_ANOM ! lwp anomaly
+REAL, DIMENSION(:,:),     ALLOCATABLE :: ZMAXWRR2D ! maxwrr2D
+!
+REAL, DIMENSION(:,:,:),   ALLOCATABLE :: ZU_SPEC   ! U     on SPEC vertical grid
+REAL, DIMENSION(:,:,:),   ALLOCATABLE :: ZV_SPEC   ! V     on SPEC vertical grid
+REAL, DIMENSION(:,:,:),   ALLOCATABLE :: ZW_SPEC   ! W     on SPEC vertical grid
+REAL, DIMENSION(:,:,:),   ALLOCATABLE :: ZTH_SPEC  ! Theta on SPEC vertical grid
+REAL, DIMENSION(:,:,:),   ALLOCATABLE :: ZTHL_SPEC ! thl   on SPEC vertical grid
+REAL, DIMENSION(:,:,:),   ALLOCATABLE :: ZRV_SPEC  ! Rv    on SPEC vertical grid
+REAL, DIMENSION(:,:,:),   ALLOCATABLE :: ZRC_SPEC  ! Rc    on SPEC vertical grid
+REAL, DIMENSION(:,:,:),   ALLOCATABLE :: ZRI_SPEC  ! Ri    on SPEC vertical grid
+REAL, DIMENSION(:,:,:,:), ALLOCATABLE :: ZSV_SPEC  ! Sv    on SPEC vertical grid
+!
+REAL, DIMENSION(:,:,:),   ALLOCATABLE  :: ZRT      ! rv+rc+rr+ri+rs+rg+rh
+REAL, DIMENSION(:),       ALLOCATABLE  :: ZWORK1D,ZWORK1DT
+REAL, DIMENSION(:,:),     ALLOCATABLE  :: ZWORK2D
+REAL :: ZINPRRm,ZCOUNT
+REAL, DIMENSION(:,:,:),   ALLOCATABLE :: ZRADEFF_LES   ! Re on LES vertical grid
+!!fl sw, lw, dthrad on LES vertical grid
+REAL, DIMENSION(:,:,:),   ALLOCATABLE :: ZSWU_LES   ! SWU on LES vertical grid
+REAL, DIMENSION(:,:,:),   ALLOCATABLE :: ZSWD_LES   ! SWD on LES vertical grid
+REAL, DIMENSION(:,:,:),   ALLOCATABLE :: ZLWU_LES   ! LWU on LES vertical grid
+REAL, DIMENSION(:,:,:),   ALLOCATABLE :: ZLWD_LES   ! LWD on LES vertical grid
+REAL, DIMENSION(:,:,:),   ALLOCATABLE :: ZDTHRADSW_LES   ! DTHRADSW on LES vertical grid
+REAL, DIMENSION(:,:,:),   ALLOCATABLE :: ZDTHRADLW_LES   ! DTHRADLW on LES vertical grid
+!
+REAL, DIMENSION(:),   ALLOCATABLE :: ZWORK   ! 
+!
+INTEGER :: IRR      ! moist variables counter
+INTEGER :: JSV      ! scalar variables counter
+INTEGER :: IIU, IJU ! array sizes
+INTEGER :: IKE,IKB
+INTEGER :: JI, JJ, JK   ! loop counters
+INTEGER :: IIU_ll, IJU_ll    ! total domain I size (fin)
+INTEGER :: IIA_ll, IJA_ll    ! total domain I size (debut)
+INTEGER :: IINFO_ll      ! return code of parallel routine
+INTEGER :: IIMAX_ll, IJMAX_ll  ! total physical domain I size
+INTEGER :: JLOOP
+!
+INTEGER :: IMASK    ! mask counter
+INTEGER :: IMASKUSER! mask user number 
+!
+INTEGER :: IRESP, ILUOUT
+INTEGER :: IMI      ! Current model index
+!-------------------------------------------------------------------------------
+!
+IMI = GET_CURRENT_MODEL_INDEX()
+!
+IF (.NOT. LLES_CALL) RETURN
+!
+CALL GET_GLOBALDIMS_ll(IIMAX_ll,IJMAX_ll)
+IIU_ll = IIMAX_ll+JPHEXT
+IJU_ll = IJMAX_ll+JPHEXT
+IIA_ll=JPHEXT+1
+IJA_ll=JPHEXT+1
+IKE=SIZE(XVT,3)-JPVEXT
+IKB=1+JPVEXT
+CALL GET_DIM_EXT_ll('B',IIU,IJU)
+!
+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   )
+  !
+  ALLOCATE(XCOEFLIN_CURRENT_SPEC(IIU,IJU,NSPECTRA_K))
+  ALLOCATE(NKLIN_CURRENT_SPEC   (IIU,IJU,NSPECTRA_K))
+  !
+  XCOEFLIN_CURRENT_SPEC(:,:,:) = XCOEFLIN_SPEC(:,:,:)
+  NKLIN_CURRENT_SPEC   (:,:,:) = NKLIN_SPEC   (:,:,:)
+END IF
+!
+!-------------------------------------------------------------------------------
+!
+!*      1.   Allocations
+!            -----------
+!
+ALLOCATE(ZP_LES   (IIU,IJU,NLES_K))
+ALLOCATE(ZDP_LES   (IIU,IJU,NLES_K))
+ALLOCATE(ZTP_LES   (IIU,IJU,NLES_K))
+ALLOCATE(ZTR_LES   (IIU,IJU,NLES_K))
+ALLOCATE(ZDISS_LES   (IIU,IJU,NLES_K))
+ALLOCATE(ZLM_LES   (IIU,IJU,NLES_K))
+ALLOCATE(ZDTHLDZ_LES(IIU,IJU,NLES_K))
+ALLOCATE(ZDTHDZ_LES(IIU,IJU,NLES_K))
+ALLOCATE(ZDRTDZ_LES(IIU,IJU,NLES_K))
+ALLOCATE(ZDUDZ_LES(IIU,IJU,NLES_K))
+ALLOCATE(ZDVDZ_LES(IIU,IJU,NLES_K))
+ALLOCATE(ZDWDZ_LES(IIU,IJU,NLES_K))
+ALLOCATE(ZDSVDZ_LES(IIU,IJU,NLES_K,NSV))
+
+ALLOCATE(ZDPDZ_LES(IIU,IJU,NLES_K))
+ALLOCATE(ZEXN_LES (IIU,IJU,NLES_K))
+ALLOCATE(ZRHO_LES (IIU,IJU,NLES_K))
+ALLOCATE(ZU_LES   (IIU,IJU,NLES_K))
+ALLOCATE(ZV_LES   (IIU,IJU,NLES_K))
+ALLOCATE(ZW_LES   (IIU,IJU,NLES_K))
+ALLOCATE(ZMF_LES  (IIU,IJU,NLES_K))
+ALLOCATE(ZTH_LES  (IIU,IJU,NLES_K))
+IF (CRAD /= 'NONE') THEN
+  ALLOCATE(ZRADEFF_LES  (IIU,IJU,NLES_K))
+  ALLOCATE(ZSWU_LES  (IIU,IJU,NLES_K))
+  ALLOCATE(ZSWD_LES  (IIU,IJU,NLES_K))
+  ALLOCATE(ZLWU_LES  (IIU,IJU,NLES_K))
+  ALLOCATE(ZLWD_LES  (IIU,IJU,NLES_K))
+  ALLOCATE(ZDTHRADSW_LES  (IIU,IJU,NLES_K))
+  ALLOCATE(ZDTHRADLW_LES  (IIU,IJU,NLES_K))
+ELSE
+  ALLOCATE(ZRADEFF_LES  (0,0,0))
+  ALLOCATE(ZSWU_LES  (0,0,0))
+  ALLOCATE(ZSWD_LES  (0,0,0))
+  ALLOCATE(ZLWU_LES  (0,0,0))
+  ALLOCATE(ZLWD_LES  (0,0,0))
+  ALLOCATE(ZDTHRADSW_LES  (0,0,0))
+  ALLOCATE(ZDTHRADLW_LES  (0,0,0))
+END IF
+IF (LUSERV) THEN
+  ALLOCATE(ZTHV_LES (IIU,IJU,NLES_K))
+ELSE
+  ALLOCATE(ZTHV_LES (0,0,0))
+END IF
+ALLOCATE(ZTHL_LES (IIU,IJU,NLES_K))
+ALLOCATE(ZTKE_LES (IIU,IJU,NLES_K))
+ALLOCATE(ZKE_LES(IIU,IJU,NLES_K))
+ALLOCATE(ZTKET_LES(IIU,IJU))
+ALLOCATE(ZWORK1D (NLES_K))
+ALLOCATE(ZWORK1DT (NLES_K))
+ALLOCATE(ZZZ_LES(IIU,IJU,NLES_K))
+IF (LUSERV) THEN
+  ALLOCATE(ZRV_LES    (IIU,IJU,NLES_K))
+  ALLOCATE(ZRT_LES    (IIU,IJU,NLES_K))
+  ALLOCATE(ZREHU_LES  (IIU,IJU,NLES_K))
+ELSE
+  ALLOCATE(ZRV_LES    (0,0,0))
+  ALLOCATE(ZRT_LES    (0,0,0))
+  ALLOCATE(ZREHU_LES  (0,0,0))
+END IF
+IF (LUSERC) THEN
+  ALLOCATE(ZRC_LES    (IIU,IJU,NLES_K))
+  ALLOCATE(ZLWP_LES(IIU,IJU))
+  ALLOCATE(ZINDCLD2D(IIU,IJU))
+  ALLOCATE(ZINDCLD2D2(IIU,IJU))
+  ALLOCATE(ZCLDFR_LES(IIU,IJU,NLES_K))
+  ALLOCATE(ZWORK2D(IIU,IJU))
+  ALLOCATE(ZLWP_ANOM(IIU,IJU))
+ELSE
+  ALLOCATE(ZRC_LES    (0,0,0))
+  ALLOCATE(ZLWP_LES(0,0))
+  ALLOCATE(ZINDCLD2D(0,0))
+  ALLOCATE(ZINDCLD2D2(0,0))
+  ALLOCATE(ZCLDFR_LES(0,0,0))
+  ALLOCATE(ZWORK2D(0,0))
+  ALLOCATE(ZLWP_ANOM(0,0))
+END IF
+IF (LUSERR) THEN
+  ALLOCATE(ZRR_LES  (IIU,IJU,NLES_K))
+  ALLOCATE(ZMAXWRR2D(IIU,IJU))
+  ALLOCATE(ZRWP_LES(IIU,IJU))
+  ALLOCATE(ZINPRR3D_LES (IIU,IJU,NLES_K))
+  ALLOCATE(ZEVAP3D_LES  (IIU,IJU,NLES_K))
+  ALLOCATE(ZRAINFR_LES(IIU,IJU,NLES_K))
+ELSE
+  ALLOCATE(ZRR_LES  (0,0,0))
+  ALLOCATE(ZMAXWRR2D(0,0))
+  ALLOCATE(ZRWP_LES(0,0))
+  ALLOCATE(ZINPRR3D_LES(0,0,0))
+  ALLOCATE(ZEVAP3D_LES(0,0,0))
+  ALLOCATE(ZRAINFR_LES(0,0,0))
+END IF
+IF (LUSERI) THEN
+  ALLOCATE(ZRI_LES    (IIU,IJU,NLES_K))
+  ALLOCATE(ZIWP_LES(IIU,IJU))
+ELSE
+  ALLOCATE(ZRI_LES    (0,0,0))
+  ALLOCATE(ZIWP_LES(0,0))
+END IF
+IF (LUSERS) THEN
+  ALLOCATE(ZRS_LES  (IIU,IJU,NLES_K))
+  ALLOCATE(ZSWP_LES(IIU,IJU))
+ELSE
+  ALLOCATE(ZRS_LES  (0,0,0))
+  ALLOCATE(ZSWP_LES(0,0))
+END IF
+IF (LUSERG) THEN
+  ALLOCATE(ZRG_LES  (IIU,IJU,NLES_K))
+  ALLOCATE(ZGWP_LES(IIU,IJU))
+ELSE
+  ALLOCATE(ZRG_LES  (0,0,0))
+  ALLOCATE(ZGWP_LES(0,0))
+END IF
+IF (LUSERH) THEN
+  ALLOCATE(ZRH_LES  (IIU,IJU,NLES_K))
+  ALLOCATE(ZHWP_LES(IIU,IJU))
+ELSE
+  ALLOCATE(ZRH_LES  (0,0,0))
+  ALLOCATE(ZHWP_LES(0,0))
+END IF
+IF (NSV>0) THEN
+  ALLOCATE(ZSV_LES  (IIU,IJU,NLES_K,NSV))
+ELSE
+  ALLOCATE(ZSV_LES  (0,0,0,0))
+END IF
+!
+ALLOCATE(ZP_ANOM   (IIU,IJU,NLES_K))
+ALLOCATE(ZRHO_ANOM (IIU,IJU,NLES_K))
+ALLOCATE(ZTH_ANOM  (IIU,IJU,NLES_K))
+ALLOCATE(ZDPDZ_ANOM(IIU,IJU,NLES_K))
+IF (LUSERV) THEN
+  ALLOCATE(ZTHV_ANOM(IIU,IJU,NLES_K))
+  ALLOCATE(ZRV_ANOM (IIU,IJU,NLES_K))
+ELSE
+  ALLOCATE(ZTHV_ANOM(0,0,0))
+  ALLOCATE(ZRV_ANOM (0,0,0))
+END IF
+IF (LUSERC) THEN
+  ALLOCATE(ZRC_ANOM (IIU,IJU,NLES_K))
+ELSE
+  ALLOCATE(ZRC_ANOM (0,0,0))
+END IF
+IF (LUSERI) THEN
+  ALLOCATE(ZRI_ANOM (IIU,IJU,NLES_K))
+ELSE
+  ALLOCATE(ZRI_ANOM (0,0,0))
+END IF
+IF (LUSERR) THEN
+  ALLOCATE(ZRR_ANOM (IIU,IJU,NLES_K))
+ELSE
+  ALLOCATE(ZRR_ANOM (0,0,0))
+END IF
+ALLOCATE(ZMEAN_DPDZ(NLES_K))
+ALLOCATE(ZLES_MEAN_DTHDZ(NLES_K))
+!
+!
+ALLOCATE(ZU_SPEC  (NSPECTRA_NI,NSPECTRA_NJ,NSPECTRA_K))
+ALLOCATE(ZV_SPEC  (NSPECTRA_NI,NSPECTRA_NJ,NSPECTRA_K))
+ALLOCATE(ZW_SPEC  (NSPECTRA_NI,NSPECTRA_NJ,NSPECTRA_K))
+ALLOCATE(ZTH_SPEC (NSPECTRA_NI,NSPECTRA_NJ,NSPECTRA_K))
+IF (LUSERC) THEN
+  ALLOCATE(ZTHL_SPEC(NSPECTRA_NI,NSPECTRA_NJ,NSPECTRA_K))
+ELSE
+  ALLOCATE(ZTHL_SPEC(0,0,0))
+END IF
+IF (LUSERV) THEN
+  ALLOCATE(ZRV_SPEC  (NSPECTRA_NI,NSPECTRA_NJ,NSPECTRA_K))
+ELSE
+  ALLOCATE(ZRV_SPEC  (0,0,0))
+END IF
+IF (LUSERC) THEN
+  ALLOCATE(ZRC_SPEC  (NSPECTRA_NI,NSPECTRA_NJ,NSPECTRA_K))
+ELSE
+  ALLOCATE(ZRC_SPEC  (0,0,0))
+END IF
+IF (LUSERI) THEN
+  ALLOCATE(ZRI_SPEC  (NSPECTRA_NI,NSPECTRA_NJ,NSPECTRA_K))
+ELSE
+  ALLOCATE(ZRI_SPEC  (0,0,0))
+END IF
+IF (NSV>0) THEN
+  ALLOCATE(ZSV_SPEC  (NSPECTRA_NI,NSPECTRA_NJ,NSPECTRA_K,NSV))
+ELSE
+  ALLOCATE(ZSV_SPEC  (0,0,0,0))
+END IF
+!
+!
+ALLOCATE(ZEXN (IIU,IJU,SIZE(XTHT,3)))
+ALLOCATE(ZRHO (IIU,IJU,SIZE(XTHT,3)))
+ALLOCATE(ZRT  (IIU,IJU,SIZE(XTHT,3)))
+ALLOCATE(ZTHV (IIU,IJU,SIZE(XTHT,3)))
+ALLOCATE(ZTHL (IIU,IJU,SIZE(XTHT,3)))
+ALLOCATE(ZEW  (IIU,IJU,SIZE(XTHT,3)))
+ALLOCATE(ZMASSF (IIU,IJU,SIZE(XTHT,3)))
+ALLOCATE(ZTEMP (IIU,IJU,SIZE(XTHT,3)))
+ALLOCATE(ZREHU (IIU,IJU,SIZE(XTHT,3)))
+ALLOCATE(CHAMPXY1 (IIU,IJU,1))
+!
+!-------------------------------------------------------------------------------
+!
+!*      1.2  preliminary calculations
+!            ------------------------
+!
+ZEXN(:,:,:) = (XPABST/XP00)**(XRD/XCPD)
+!
+!
+!* computation of relative humidity
+ZTEMP=XTHT*ZEXN
+ZEW=EXP (XALPW -XBETAW/ZTEMP-XGAMW*ALOG(ZTEMP))
+IF (LUSERV) THEN
+  ZREHU(:,:,:)=100.*XRT(:,:,:,1)*XPABST(:,:,:)/((XRD/XRV+XRT(:,:,:,1))*ZEW(:,:,:))
+ELSE
+  ZREHU(:,:,:)=0.
+END IF
+!
+CALL THL_RT_FROM_TH_R(LUSERV, LUSERC, LUSERR,             &
+                      LUSERI, LUSERS, LUSERG, LUSERH,     &
+                      XCURRENT_L_O_EXN_CP,                &
+                      XTHT, XRT,                          &
+                      ZTHL, ZRT                           )
+!
+!* computation of density and virtual potential temperature
+!
+ZTHV=XTHT
+IF (LUSERV) ZTHV=ZTHV*(1.+XRV/XRD*XRT(:,:,:,1))/(1.+ZRT(:,:,:))
+!
+IF (CEQNSYS=='DUR') THEN
+  ZRHO=XPABST/(XRD*ZTHV*ZEXN)
+ELSE
+  ZRHO=XRHODREF*( 1. + (XCPD-XRD)/XRD*(ZEXN/XEXNREF - 1.) - (ZTHV/XTHVREF - 1.) )
+END IF
+!
+! computation of mass flux
+ZMASSF=MZM(ZRHO)*XWT
+!
+!-------------------------------------------------------------------------------
+!
+!*      2.   Vertical interpolations to LES vertical grid
+!            --------------------------------------------
+!
+!* note that velocity fields are first localized on the MASS points
+!
+!
+IF (CRAD /= 'NONE') THEN
+  CALL LES_VER_INT(   XRADEFF, ZRADEFF_LES)
+  CALL LES_VER_INT(   XSWU, ZSWU_LES)
+  CALL LES_VER_INT(   XSWD, ZSWD_LES)
+  CALL LES_VER_INT(   XLWU, ZLWU_LES)
+  CALL LES_VER_INT(   XLWD, ZLWD_LES)
+  CALL LES_VER_INT(   XDTHRADSW, ZDTHRADSW_LES)
+  CALL LES_VER_INT(   XDTHRADLW, ZDTHRADLW_LES)
+END IF
+!
+CALL LES_VER_INT( XZZ   , ZZZ_LES)
+CALL LES_VER_INT( XPABST, ZP_LES )
+CALL LES_VER_INT( XDYP, ZDP_LES )
+CALL LES_VER_INT( XTHP, ZTP_LES )
+CALL LES_VER_INT( XTR, ZTR_LES )
+CALL LES_VER_INT( XDISS, ZDISS_LES )
+CALL LES_VER_INT( XLEM, ZLM_LES )
+CALL LES_VER_INT( GZ_M_M(XPABST,XDZZ), ZDPDZ_LES )
+!
+CALL LES_VER_INT( MXF(XUT)  ,ZU_LES  )
+CALL LES_VER_INT( MYF(XVT)  ,ZV_LES  )
+CALL LES_VER_INT( MZF(XWT)  ,ZW_LES  )
+CALL LES_VER_INT( MZF(ZMASSF) ,ZMF_LES)
+CALL LES_VER_INT(     XTHT  ,ZTH_LES )
+CALL LES_VER_INT( MXF(MZF(GZ_U_UW(XUT,XDZZ))), ZDUDZ_LES )
+CALL LES_VER_INT( MYF(MZF(GZ_V_VW(XVT,XDZZ))), ZDVDZ_LES )
+CALL LES_VER_INT( GZ_W_M(XWT,XDZZ), ZDWDZ_LES )
+CALL LES_VER_INT( ZEXN, ZEXN_LES)  
+!
+CALL LES_VER_INT( GZ_M_M(XTHT,XDZZ), ZDTHDZ_LES )
+!
+CALL LES_VER_INT(ZRHO, ZRHO_LES)
+!
+IF (LUSERV) CALL LES_VER_INT(ZTHV, ZTHV_LES)
+CALL LES_VER_INT(ZTHL, ZTHL_LES)
+CALL LES_VER_INT( GZ_M_M(ZTHL,XDZZ), ZDTHLDZ_LES )
+!
+CALL LES_VER_INT(     XTKET ,ZTKE_LES)
+IRR = 0
+IF (LUSERV) THEN
+  IRR = IRR + 1
+  CALL LES_VER_INT(     XRT(:,:,:,IRR)  ,ZRV_LES )
+  CALL LES_VER_INT(     ZRT(:,:,:)      ,ZRT_LES )
+  CALL LES_VER_INT( GZ_M_M(ZRT,XDZZ), ZDRTDZ_LES )
+  CALL LES_VER_INT(   ZREHU(:,:,:)     ,ZREHU_LES)
+END IF
+IF (LUSERC) THEN
+  IRR = IRR + 1
+  CALL LES_VER_INT(     XRT(:,:,:,IRR)  ,ZRC_LES )
+  ALLOCATE(ZINDCLD (IIU,IJU,NLES_K))
+  ALLOCATE(ZINDCLD2(IIU,IJU,NLES_K))
+  ZINDCLD = CEILING(ZRC_LES-1.E-6)
+  ZINDCLD2 = CEILING(ZRC_LES-1.E-5)
+  CALL LES_VER_INT( XCLDFR(:,:,:)  ,ZCLDFR_LES )
+ELSE
+  ALLOCATE(ZINDCLD (0,0,0))
+  ALLOCATE(ZINDCLD2(0,0,0))
+END IF
+IF (LUSERR) THEN
+  IRR = IRR + 1
+  CALL LES_VER_INT(     XRT(:,:,:,IRR)  ,ZRR_LES )
+  CALL LES_VER_INT(     XINPRR3D(:,:,:), ZINPRR3D_LES)
+  CALL LES_VER_INT(    XEVAP3D(:,:,:), ZEVAP3D_LES)
+  CALL LES_VER_INT( XRAINFR(:,:,:)  ,ZRAINFR_LES )
+END IF
+IF (LUSERC) THEN
+    DO JJ=1,IJU
+     DO JI=1,IIU
+      ZINDCLD2D(JI,JJ) = maxval(ZINDCLD(JI,JJ,:))
+      ZINDCLD2D2(JI,JJ)= maxval(ZINDCLD2(JI,JJ,:))
+     END DO
+    END DO
+  !* integration of rho rc
+  !!!ZLWP_LES only for cloud water           
+    ZLWP_LES(:,:)  = 0.
+      DO JK=1,NLES_K-1
+    ZLWP_LES(:,:) = ZLWP_LES(:,:) + (ZZZ_LES(:,:,JK+1)-ZZZ_LES(:,:,JK))      &
+                      * (ZRC_LES(:,:,JK)) * ZRHO_LES(:,:,JK)
+      END DO
+  CALL LES_MEAN_ll ( ZLWP_LES, LLES_CURRENT_CART_MASK(:,:,1),               &
+                    XLES_LWP(NLES_CURRENT_TCOUNT)     )    
+!
+END IF
+
+  !!!ZRWP_LES only for rain water   
+IF (LUSERR) THEN
+   ZRWP_LES(:,:)=0.
+  DO JK=1,NLES_K-1
+    ZRWP_LES(:,:) = ZRWP_LES(:,:) + (ZZZ_LES(:,:,JK+1)-ZZZ_LES(:,:,JK))      &
+                    * (ZRR_LES(:,:,JK)) * ZRHO_LES(:,:,JK)
+  END DO
+  CALL LES_MEAN_ll ( ZRWP_LES, LLES_CURRENT_CART_MASK(:,:,1),               &
+                    XLES_RWP(NLES_CURRENT_TCOUNT)     )
+ENDIF
+!                    
+IF (LUSERI) THEN
+  IRR = IRR + 1
+  CALL LES_VER_INT(     XRT(:,:,:,IRR)  ,ZRI_LES )
+  ZIWP_LES(:,:)=0.
+  DO JK=1,NLES_K-1
+    ZIWP_LES(:,:) = ZIWP_LES(:,:) + (ZZZ_LES(:,:,JK+1)-ZZZ_LES(:,:,JK))      &
+                    * (ZRI_LES(:,:,JK)) * ZRHO_LES(:,:,JK)
+  END DO
+  CALL LES_MEAN_ll ( ZIWP_LES, LLES_CURRENT_CART_MASK(:,:,1),               &
+                    XLES_IWP(NLES_CURRENT_TCOUNT)     )
+END IF
+IF (LUSERS) THEN
+  IRR = IRR + 1
+  CALL LES_VER_INT(     XRT(:,:,:,IRR)  ,ZRS_LES )
+  ZSWP_LES(:,:)=0.
+  DO JK=1,NLES_K-1
+    ZSWP_LES(:,:) = ZSWP_LES(:,:) + (ZZZ_LES(:,:,JK+1)-ZZZ_LES(:,:,JK))      &
+                    * (ZRS_LES(:,:,JK)) * ZRHO_LES(:,:,JK)
+  END DO
+  CALL LES_MEAN_ll ( ZSWP_LES, LLES_CURRENT_CART_MASK(:,:,1),               &
+                    XLES_SWP(NLES_CURRENT_TCOUNT)     )
+END IF
+IF (LUSERG) THEN
+  IRR = IRR + 1
+  CALL LES_VER_INT(     XRT(:,:,:,IRR)  ,ZRG_LES )
+  ZGWP_LES(:,:)=0.
+  DO JK=1,NLES_K-1
+    ZGWP_LES(:,:) = ZGWP_LES(:,:) + (ZZZ_LES(:,:,JK+1)-ZZZ_LES(:,:,JK))      &
+                    * (ZRG_LES(:,:,JK)) * ZRHO_LES(:,:,JK)
+  END DO
+  CALL LES_MEAN_ll ( ZGWP_LES, LLES_CURRENT_CART_MASK(:,:,1),               &
+                    XLES_GWP(NLES_CURRENT_TCOUNT)     )
+END IF
+IF (LUSERH) THEN
+  IRR = IRR + 1
+  CALL LES_VER_INT(     XRT(:,:,:,IRR)  ,ZRH_LES )
+  ZHWP_LES(:,:)=0.
+  DO JK=1,NLES_K-1
+    ZHWP_LES(:,:) = ZHWP_LES(:,:) + (ZZZ_LES(:,:,JK+1)-ZZZ_LES(:,:,JK))      &
+                    * (ZRH_LES(:,:,JK)) * ZRHO_LES(:,:,JK)
+  END DO
+  CALL LES_MEAN_ll ( ZHWP_LES, LLES_CURRENT_CART_MASK(:,:,1),               &
+                    XLES_HWP(NLES_CURRENT_TCOUNT)     )
+END IF
+IF (NSV>0) THEN
+  DO JSV=1,NSV
+    CALL LES_VER_INT(  XSVT(:,:,:,JSV), ZSV_LES(:,:,:,JSV) )
+    CALL LES_VER_INT( GZ_M_M(XSVT(:,:,:,JSV),XDZZ), ZDSVDZ_LES(:,:,:,JSV) )
+  END DO
+END IF
+!
+!*mean sw and lw fluxes  
+  CALL LES_MEAN_ll ( ZSWU_LES, LLES_CURRENT_CART_MASK,               &
+                    XLES_SWU(:,NLES_CURRENT_TCOUNT)     )
+  CALL LES_MEAN_ll ( ZSWD_LES, LLES_CURRENT_CART_MASK,               &
+                    XLES_SWD(:,NLES_CURRENT_TCOUNT)     )
+  CALL LES_MEAN_ll ( ZLWU_LES, LLES_CURRENT_CART_MASK,               &
+                    XLES_LWU(:,NLES_CURRENT_TCOUNT)     )
+  CALL LES_MEAN_ll ( ZLWD_LES, LLES_CURRENT_CART_MASK,               &
+                    XLES_LWD(:,NLES_CURRENT_TCOUNT)     )
+  CALL LES_MEAN_ll ( ZDTHRADSW_LES, LLES_CURRENT_CART_MASK,          &
+                    XLES_DTHRADSW(:,NLES_CURRENT_TCOUNT)     )
+  CALL LES_MEAN_ll ( ZDTHRADLW_LES, LLES_CURRENT_CART_MASK,          &
+                    XLES_DTHRADLW(:,NLES_CURRENT_TCOUNT)     )
+  CALL LES_MEAN_ll ( ZRADEFF_LES, LLES_CURRENT_CART_MASK,             &
+                    XLES_RADEFF(:,NLES_CURRENT_TCOUNT)     )
+!* mean vertical profiles on the LES grid
+!
+  CALL LES_MEAN_ll ( ZU_LES, LLES_CURRENT_CART_MASK,                   &
+                     XLES_MEAN_U(:,NLES_CURRENT_TCOUNT,1)     )
+!
+  CALL LES_MEAN_ll ( ZV_LES, LLES_CURRENT_CART_MASK,                   &
+                     XLES_MEAN_V(:,NLES_CURRENT_TCOUNT,1)     )
+!
+  CALL LES_MEAN_ll ( ZW_LES, LLES_CURRENT_CART_MASK,                   &
+                     XLES_MEAN_W(:,NLES_CURRENT_TCOUNT,1)     )
+!
+  CALL LES_MEAN_ll ( ZP_LES, LLES_CURRENT_CART_MASK,                   &
+                     XLES_MEAN_P(:,NLES_CURRENT_TCOUNT,1)     )
+!
+  CALL LES_MEAN_ll ( ZDP_LES, LLES_CURRENT_CART_MASK,                   &
+                     XLES_MEAN_DP(:,NLES_CURRENT_TCOUNT,1)     )
+!
+  CALL LES_MEAN_ll ( ZTP_LES, LLES_CURRENT_CART_MASK,                   &
+                     XLES_MEAN_TP(:,NLES_CURRENT_TCOUNT,1)     )
+!
+  CALL LES_MEAN_ll ( ZTR_LES, LLES_CURRENT_CART_MASK,                   &
+                     XLES_MEAN_TR(:,NLES_CURRENT_TCOUNT,1)     )
+!
+  CALL LES_MEAN_ll ( ZDISS_LES, LLES_CURRENT_CART_MASK,                   &
+                     XLES_MEAN_DISS(:,NLES_CURRENT_TCOUNT,1)     )
+!
+  CALL LES_MEAN_ll ( ZLM_LES, LLES_CURRENT_CART_MASK,                   &
+                     XLES_MEAN_LM(:,NLES_CURRENT_TCOUNT,1)     )
+!
+  CALL LES_MEAN_ll ( ZRHO_LES, LLES_CURRENT_CART_MASK,                 &
+                     XLES_MEAN_RHO(:,NLES_CURRENT_TCOUNT,1)   )
+!
+  CALL LES_MEAN_ll ( ZMF_LES, LLES_CURRENT_CART_MASK,                  &
+                     XLES_MEAN_Mf(:,NLES_CURRENT_TCOUNT,1)     )                             
+!
+  CALL LES_MEAN_ll ( ZTH_LES*ZEXN_LES, LLES_CURRENT_CART_MASK,         &
+                     ZWORK1DT(:)                                 )                    
+!                     
+!computation of es
+  ZWORK1D(:)=EXP(XALPW -                                          &
+                  XBETAW/ZWORK1DT(:)         &
+                  -XGAMW*ALOG(ZWORK1DT(:)))
+!computation of qs
+
+  IF (LUSERV)                                                          &
+  XLES_MEAN_Qs(:,NLES_CURRENT_TCOUNT,1)=XRD/XRV*ZWORK1D(:)/        &
+  (XLES_MEAN_P(:,NLES_CURRENT_TCOUNT,1)-ZWORK1D(:)*(1-XRD/XRV))   
+! qs is determined from the temperature average over the current_mask
+!
+  CALL LES_MEAN_ll ( ZTH_LES, LLES_CURRENT_CART_MASK,                  &
+                     XLES_MEAN_Th(:,NLES_CURRENT_TCOUNT,1)     )
+!
+  IF (LUSERV)                                                          &
+  CALL LES_MEAN_ll ( ZTHV_LES, LLES_CURRENT_CART_MASK,                 &
+                     XLES_MEAN_Thv(:,NLES_CURRENT_TCOUNT,1)    )
+!
+  IF (LUSERC)                                                       &
+  CALL LES_MEAN_ll ( ZTHL_LES, LLES_CURRENT_CART_MASK,              &
+                     XLES_MEAN_Thl(:,NLES_CURRENT_TCOUNT,1)     )
+!
+  IF (LUSERC)                                                       &
+  CALL LES_MEAN_ll ( ZRT_LES, LLES_CURRENT_CART_MASK,               &
+                     XLES_MEAN_Rt(:,NLES_CURRENT_TCOUNT,1)     )
+!
+  IF (LUSERV) &
+  CALL LES_MEAN_ll ( ZRV_LES, LLES_CURRENT_CART_MASK,               &
+                     XLES_MEAN_Rv(:,NLES_CURRENT_TCOUNT,1)     )
+!
+  IF (LUSERV) &
+  CALL LES_MEAN_ll ( ZREHU_LES, LLES_CURRENT_CART_MASK,             &
+                   XLES_MEAN_Rehu(:,NLES_CURRENT_TCOUNT,1)     )
+!
+  IF (LUSERC) &
+  CALL LES_MEAN_ll ( ZRC_LES, LLES_CURRENT_CART_MASK,               &
+                    XLES_MEAN_Rc(:,NLES_CURRENT_TCOUNT,1)     )
+!
+  IF (LUSERC) THEN 
+     CALL LES_MEAN_ll ( ZINDCLD, LLES_CURRENT_CART_MASK,               &
+                    XLES_MEAN_INDCf(:,NLES_CURRENT_TCOUNT,1)     )
+     CALL LES_MEAN_ll ( ZINDCLD2, LLES_CURRENT_CART_MASK,              &
+                    XLES_MEAN_INDCf2(:,NLES_CURRENT_TCOUNT,1)    )
+     CALL LES_MEAN_ll ( ZCLDFR_LES, LLES_CURRENT_CART_MASK,            &
+                    XLES_MEAN_Cf(:,NLES_CURRENT_TCOUNT,1)        )
+!
+!* cf total
+     CALL LES_MEAN_ll( ZINDCLD2D, LLES_CURRENT_CART_MASK(:,:,1) ,      & 
+                   XLES_CFtot(NLES_CURRENT_TCOUNT)      ) 
+     CALL LES_MEAN_ll( ZINDCLD2D2, LLES_CURRENT_CART_MASK(:,:,1),      &
+                    XLES_CF2tot(NLES_CURRENT_TCOUNT)    )
+  ENDIF
+!
+  IF (LUSERR) THEN
+
+    CALL LES_MEAN_ll ( XINPRR, LLES_CURRENT_CART_MASK(:,:,1),    &
+                     XLES_INPRR(NLES_CURRENT_TCOUNT)    )
+    ZINPRRm=0.
+    ZCOUNT=0.
+    ZINDCLD2D(:,:)=0.
+    DO JJ=1,IJU
+     DO JI=1,IIU
+       IF (ZRR_LES(JI,JJ,1) .GT. 1.E-6) ZINPRRm = ZINPRRm+XINPRR(JI,JJ)
+       IF (ZRR_LES(JI,JJ,1) .GT. 1.E-6) ZINDCLD2D(JI,JJ)=1.
+       IF (ZRR_LES(JI,JJ,1) .GT. 1.E-6) ZCOUNT=ZCOUNT+1.
+     END DO
+    END DO                 
+    IF (ZCOUNT .GE. 1) ZINPRRm=ZINPRRm/ZCOUNT
+    XLES_RAIN_INPRR(NLES_CURRENT_TCOUNT)=ZINPRRm
+    CALL  LES_MEAN_ll ( ZINDCLD2D, LLES_CURRENT_CART_MASK(:,:,1),  &
+                     XLES_PRECFR(NLES_CURRENT_TCOUNT)         )   
+    CALL LES_MEAN_ll ( ZINPRR3D_LES, LLES_CURRENT_CART_MASK,  &
+                     XLES_INPRR3D(:,NLES_CURRENT_TCOUNT,1)  )
+    CALL LES_MEAN_ll ( ZEVAP3D_LES, LLES_CURRENT_CART_MASK,  &
+                     XLES_EVAP3D(:,NLES_CURRENT_TCOUNT,1)   )         
+    DO JK=1,NLES_K
+     CHAMPXY1(:,:,1)=ZINPRR3D_LES(:,:,JK)                
+     XLES_MAX_INPRR3D(JK,NLES_CURRENT_TCOUNT,1)=MAX_ll (CHAMPXY1,IINFO_ll, &
+                         IIA_ll,IJA_ll,1,IIU_ll,IJU_ll,1)
+    END DO
+!
+
+!   conversion de m/s en mm/day
+ XLES_RAIN_INPRR(NLES_CURRENT_TCOUNT)=XLES_RAIN_INPRR(NLES_CURRENT_TCOUNT)*3.6E6*24.
+    XLES_INPRR(NLES_CURRENT_TCOUNT)=XLES_INPRR(NLES_CURRENT_TCOUNT)*3.6E6*24.
+
+    CALL LES_MEAN_ll ( XACPRR, LLES_CURRENT_CART_MASK(:,:,1),    &
+                     XLES_ACPRR(NLES_CURRENT_TCOUNT)    )
+!   conversion de m en mm
+    XLES_ACPRR(NLES_CURRENT_TCOUNT)=XLES_ACPRR(NLES_CURRENT_TCOUNT)*1000.
+    CALL LES_MEAN_ll ( ZRAINFR_LES, LLES_CURRENT_CART_MASK,            &
+                    XLES_MEAN_RF(:,NLES_CURRENT_TCOUNT,1)        )
+
+  ENDIF
+!
+  IF (LUSERC ) THEN
+    IF (( CCLOUD(1:3) == 'ICE'                                   .AND.LSEDIC) .OR. &
+    ((CCLOUD=='C2R2' .OR. CCLOUD=='C3R5' .OR. CCLOUD=='KHKO').AND.LSEDC)  .OR. &
+    ( CCLOUD=='LIMA'                                         .AND.MSEDC))  THEN
+      CALL LES_MEAN_ll ( XINPRC, LLES_CURRENT_CART_MASK(:,:,1),    &
+                     XLES_INPRC(NLES_CURRENT_TCOUNT)    )
+!     conversion from m/s to mm/day
+      XLES_INPRC(NLES_CURRENT_TCOUNT)=XLES_INPRC(NLES_CURRENT_TCOUNT)*3.6E6*24.
+    ENDIF
+    IF ( (((CCLOUD == 'KHKO') .OR.(CCLOUD == 'C2R2')) .AND. LDEPOC) &
+         .OR. ( (CCLOUD(1:3) == 'ICE') .AND. LDEPOSC) ) THEN
+        CALL LES_MEAN_ll ( XINDEP, LLES_CURRENT_CART_MASK(:,:,1),    &
+                     XLES_INDEP(NLES_CURRENT_TCOUNT)    )
+!       conversion from m/s to mm/day
+        XLES_INDEP(NLES_CURRENT_TCOUNT)=XLES_INDEP(NLES_CURRENT_TCOUNT)*3.6E6*24.
+    ENDIF
+  ENDIF
+!
+  IF (LUSERR) &
+  CALL LES_MEAN_ll ( ZRR_LES, LLES_CURRENT_CART_MASK,               &
+                     XLES_MEAN_Rr(:,NLES_CURRENT_TCOUNT,1)     )
+!
+  IF (LUSERI) &
+  CALL LES_MEAN_ll ( ZRI_LES, LLES_CURRENT_CART_MASK,               &
+                     XLES_MEAN_Ri(:,NLES_CURRENT_TCOUNT,1)     )
+!
+  IF (LUSERS) &
+  CALL LES_MEAN_ll ( ZRS_LES, LLES_CURRENT_CART_MASK,               &
+                   XLES_MEAN_Rs(:,NLES_CURRENT_TCOUNT,1)     )
+!
+  IF (LUSERG) &
+  CALL LES_MEAN_ll ( ZRG_LES, LLES_CURRENT_CART_MASK,               &
+                   XLES_MEAN_Rg(:,NLES_CURRENT_TCOUNT,1)     )
+!
+  IF (LUSERH) &
+  CALL LES_MEAN_ll ( ZRH_LES, LLES_CURRENT_CART_MASK,               &
+                     XLES_MEAN_Rh(:,NLES_CURRENT_TCOUNT,1)   )
+!
+  DO JSV=1,NSV
+    CALL LES_MEAN_ll ( ZSV_LES(:,:,:,JSV), LLES_CURRENT_CART_MASK,   &
+                       XLES_MEAN_Sv(:,NLES_CURRENT_TCOUNT,1,JSV)     )
+  END DO
+!
+  CALL LES_MEAN_ll ( ZDPDZ_LES, LLES_CURRENT_CART_MASK,      &
+                     ZMEAN_DPDZ(:)                           )
+  CALL LES_MEAN_ll ( ZDTHDZ_LES, LLES_CURRENT_CART_MASK,      &
+                     ZLES_MEAN_DTHDZ(:)                      )
+                     
+!
+!* build the 3D resolved turbulent fields by removing the mean field
+!
+DO JJ=1,IJU
+  DO JI=1,IIU
+    ZP_ANOM(JI,JJ,:) = ZP_LES(JI,JJ,:) - XLES_MEAN_P(:,NLES_CURRENT_TCOUNT,1)
+    ZDPDZ_ANOM(JI,JJ,:) = ZDPDZ_LES(JI,JJ,:) - ZMEAN_DPDZ(:)
+    ZTH_ANOM(JI,JJ,:) = ZTH_LES(JI,JJ,:) - XLES_MEAN_Th(:,NLES_CURRENT_TCOUNT,1)
+    ZRHO_ANOM(JI,JJ,:) = ZRHO_LES(JI,JJ,:) - XLES_MEAN_Rho(:,NLES_CURRENT_TCOUNT,1)
+    IF (LUSERV) THEN
+      ZTHV_ANOM(JI,JJ,:) = ZTHV_LES(JI,JJ,:) - XLES_MEAN_Thv(:,NLES_CURRENT_TCOUNT,1)
+      ZRV_ANOM(JI,JJ,:) = ZRV_LES(JI,JJ,:) - XLES_MEAN_Rv(:,NLES_CURRENT_TCOUNT,1)
+    END IF
+    IF (LUSERC) THEN
+      ZRC_ANOM(JI,JJ,:) = ZRC_LES(JI,JJ,:) - XLES_MEAN_Rc(:,NLES_CURRENT_TCOUNT,1)
+      ZLWP_ANOM(JI,JJ) =ZLWP_LES(JI,JJ)-XLES_LWP(NLES_CURRENT_TCOUNT)
+    END IF
+    IF (LUSERI) THEN
+      ZRI_ANOM(JI,JJ,:) = ZRI_LES(JI,JJ,:) - XLES_MEAN_Ri(:,NLES_CURRENT_TCOUNT,1)
+    END IF
+    IF (LUSERR) THEN
+      ZRR_ANOM(JI,JJ,:) = ZRR_LES(JI,JJ,:) - XLES_MEAN_Rr(:,NLES_CURRENT_TCOUNT,1)
+    END IF
+  END DO
+END DO
+!
+!
+!--------------------------------------------------------------------------------
+!
+!* vertical grid computed at first LES call for this model
+!
+IF (NLES_CURRENT_TCOUNT==1) THEN
+  ALLOCATE(ZZ_LES    (IIU,IJU,NLES_K))
+  CALL LES_VER_INT( MZF(XZZ)  ,ZZ_LES   )
+  CALL LES_MEAN_ll ( ZZ_LES, LLES_CURRENT_CART_MASK, XLES_Z  )
+  DEALLOCATE(ZZ_LES)
+  CALL LES_MEAN_ll ( XZS,    LLES_CURRENT_CART_MASK(:,:,1), XLES_ZS )
+END IF
+!
+!-------------------------------------------------------------------------------
+!
+!*      3.   Vertical interpolations to SECTRA computations vertical grid
+!            ------------------------------------------------------------
+!
+!* note that velocity fields are previously localized on the MASS points
+!
+CALL SPEC_VER_INT(IMI, MXF(XUT)  ,ZU_SPEC  )
+CALL SPEC_VER_INT(IMI, MYF(XVT)  ,ZV_SPEC  )
+CALL SPEC_VER_INT(IMI, MZF(XWT)  ,ZW_SPEC  )
+CALL SPEC_VER_INT(IMI,     XTHT  ,ZTH_SPEC )
+IF (LUSERC) CALL SPEC_VER_INT(IMI,     ZTHL  ,ZTHL_SPEC)
+IRR = 0
+IF (LUSERV) THEN
+  IRR = IRR + 1
+  CALL SPEC_VER_INT(IMI,     XRT(:,:,:,IRR)  ,ZRV_SPEC )
+END IF
+IF (LUSERC) THEN
+  IRR = IRR + 1
+  CALL SPEC_VER_INT(IMI,     XRT(:,:,:,IRR)  ,ZRC_SPEC )
+END IF
+IF (LUSERR) THEN
+  IRR = IRR + 1
+END IF
+IF (LUSERI) THEN
+  IRR = IRR + 1
+  CALL SPEC_VER_INT(IMI,     XRT(:,:,:,IRR)  ,ZRI_SPEC )
+END IF
+IF (NSV>0) THEN
+  DO JSV=1,NSV
+    CALL SPEC_VER_INT(IMI,  XSVT(:,:,:,JSV), ZSV_SPEC(:,:,:,JSV) )
+  END DO
+END IF
+!
+!-------------------------------------------------------------------------------
+!
+!*      4.   Call to LES computations on cartesian (sub-)domain
+!            --------------------------------------------------
+!
+IMASK=1
+!
+CALL LES(LLES_CURRENT_CART_MASK)
+!
+!-------------------------------------------------------------------------------
+!
+!*      5.   Call to LES computations on nebulosity mask
+!            -------------------------------------------
+!
+IF (LLES_NEB_MASK) THEN
+  IMASK=IMASK+1
+  CALL LES(LLES_CURRENT_NEB_MASK .AND. LLES_CURRENT_CART_MASK)
+!
+  IMASK=IMASK+1
+  CALL LES((.NOT. LLES_CURRENT_NEB_MASK) .AND. LLES_CURRENT_CART_MASK)
+END IF
+!
+!-------------------------------------------------------------------------------
+!
+!*      6.   Call to LES computations on cloud core mask
+!            -------------------------------------------
+!
+IF (LLES_CORE_MASK) THEN
+  IMASK=IMASK+1
+  CALL LES(LLES_CURRENT_CORE_MASK .AND. LLES_CURRENT_CART_MASK)
+!
+  IMASK=IMASK+1
+  CALL LES((.NOT. LLES_CURRENT_CORE_MASK) .AND. LLES_CURRENT_CART_MASK)
+END IF
+!
+!-------------------------------------------------------------------------------
+!
+!*      7.   Call to LES computations on user mask
+!            -------------------------------------
+!
+IF (LLES_MY_MASK) THEN
+ DO JI=1,NLES_MASKS_USER
+  IMASK=IMASK+1
+  CALL LES(LLES_CURRENT_MY_MASKS(:,:,:,JI))
+ END DO
+END IF
+!
+!-------------------------------------------------------------------------------
+!
+!*      7b.  Call to LES computations on conditional sampling mask
+!            -----------------------------------------------------
+!
+IF (LLES_CS_MASK) THEN
+  IMASK=IMASK+1
+  CALL LES(LLES_CURRENT_CS1_MASK)
+  IMASK=IMASK+1
+  CALL LES(LLES_CURRENT_CS2_MASK)
+  IMASK=IMASK+1
+  CALL LES(LLES_CURRENT_CS3_MASK)
+END IF
+!
+!-------------------------------------------------------------------------------
+!
+!*      8.   budgets
+!            -------
+!
+!*      8.1  tendencies
+!            ----------
+!
+!
+!*      8.2  dynamical production, transport and mean advection
+!            --------------------------------------------------
+!
+ALLOCATE(ZLES_MEAN_DRtDZ(NLES_K))
+ALLOCATE(ZLES_MEAN_DSVDZ(NLES_K,NSV))
+!
+IF (LUSERV) THEN
+  ZLES_MEAN_DRtDZ(:) = XLES_MEAN_DRtDZ(:,NLES_CURRENT_TCOUNT,1)
+ELSE
+  ZLES_MEAN_DRtDZ(:) = XUNDEF
+END IF
+!
+ZLES_MEAN_DSVDZ = 0.
+DO JSV=1,NSV
+  ZLES_MEAN_DSvDZ(:,JSV) = XLES_MEAN_DSvDZ(:,NLES_CURRENT_TCOUNT,1,JSV)
+END DO
+!
+CALL LES_RES_TR(LUSERV,                                    &
+                XLES_MEAN_DUDZ(:,NLES_CURRENT_TCOUNT,1),   &
+                XLES_MEAN_DVDZ(:,NLES_CURRENT_TCOUNT,1),   &
+                XLES_MEAN_DWDZ(:,NLES_CURRENT_TCOUNT,1),   &
+                XLES_MEAN_DThlDZ(:,NLES_CURRENT_TCOUNT,1), &
+                ZLES_MEAN_DRtDZ(:),                        &
+                ZLES_MEAN_DSvDZ(:,:)                       )
+!
+DEALLOCATE(ZLES_MEAN_DRtDZ)
+DEALLOCATE(ZLES_MEAN_DSVDZ)
+!
+CALL LES_BUDGET_TEND_n
+!*      8.3  end of LES budgets computations
+!            -------------------------------
+!
+DO JLOOP=1,NLES_TOT
+  XLES_BU_RES_KE   (:,NLES_CURRENT_TCOUNT,JLOOP) = X_LES_BU_RES_KE   (:,JLOOP)
+  XLES_BU_RES_WThl (:,NLES_CURRENT_TCOUNT,JLOOP) = X_LES_BU_RES_WThl (:,JLOOP)
+  XLES_BU_RES_Thl2 (:,NLES_CURRENT_TCOUNT,JLOOP) = X_LES_BU_RES_Thl2 (:,JLOOP)
+  XLES_BU_SBG_Tke  (:,NLES_CURRENT_TCOUNT,JLOOP) = X_LES_BU_SBG_Tke  (:,JLOOP)
+  IF (LUSERV) THEN
+    XLES_BU_RES_WRt  (:,NLES_CURRENT_TCOUNT,JLOOP) = X_LES_BU_RES_WRt  (:,JLOOP)
+    XLES_BU_RES_Rt2  (:,NLES_CURRENT_TCOUNT,JLOOP) = X_LES_BU_RES_Rt2  (:,JLOOP)
+    XLES_BU_RES_ThlRt(:,NLES_CURRENT_TCOUNT,JLOOP) = X_LES_BU_RES_ThlRt(:,JLOOP)
+  END IF
+  DO JSV=1,NSV
+    XLES_BU_RES_Sv2  (:,NLES_CURRENT_TCOUNT,JLOOP,JSV) = X_LES_BU_RES_Sv2  (:,JLOOP,JSV)
+    XLES_BU_RES_WSv  (:,NLES_CURRENT_TCOUNT,JLOOP,JSV) = X_LES_BU_RES_WSv  (:,JLOOP,JSV)
+  END DO
+END DO
+!
+!-------------------------------------------------------------------------------
+!
+!*      9.   Deallocations
+!            -------------
+!
+!*      9.1  local variables
+!            ---------------
+!
+DEALLOCATE(ZEXN      )
+DEALLOCATE(ZTHL)
+DEALLOCATE(ZRT       )
+DEALLOCATE(ZTHV      )
+DEALLOCATE(ZRHO      )
+DEALLOCATE(ZEW       )
+
+DEALLOCATE(ZINDCLD   )
+DEALLOCATE(ZINDCLD2  )
+DEALLOCATE(ZINDCLD2D )
+DEALLOCATE(ZINDCLD2D2)
+DEALLOCATE(ZCLDFR_LES)
+DEALLOCATE(ZRAINFR_LES)
+DEALLOCATE(ZMASSF    )  
+DEALLOCATE(ZTEMP     )
+DEALLOCATE(ZREHU     )
+DEALLOCATE(CHAMPXY1  )
+!
+DEALLOCATE(ZU_LES)
+DEALLOCATE(ZV_LES)
+DEALLOCATE(ZW_LES)
+DEALLOCATE(ZTHL_LES)
+DEALLOCATE(ZRT_LES)
+DEALLOCATE(ZSV_LES)
+DEALLOCATE(ZP_LES   )
+DEALLOCATE(ZDP_LES   )
+DEALLOCATE(ZTP_LES   )
+DEALLOCATE(ZTR_LES   )
+DEALLOCATE(ZDISS_LES   )
+DEALLOCATE(ZLM_LES   )
+DEALLOCATE(ZDPDZ_LES)
+DEALLOCATE(ZLWP_ANOM)
+DEALLOCATE(ZWORK2D)
+DEALLOCATE(ZWORK1D)
+DEALLOCATE(ZWORK1DT)
+DEALLOCATE(ZMAXWRR2D)
+DEALLOCATE(ZDTHLDZ_LES)
+DEALLOCATE(ZDTHDZ_LES)
+DEALLOCATE(ZDRTDZ_LES)
+DEALLOCATE(ZDSVDZ_LES)
+DEALLOCATE(ZDUDZ_LES)
+DEALLOCATE(ZDVDZ_LES)
+DEALLOCATE(ZDWDZ_LES)
+DEALLOCATE(ZRHO_LES )
+DEALLOCATE(ZEXN_LES )
+DEALLOCATE(ZTH_LES  )
+DEALLOCATE(ZMF_LES  )
+DEALLOCATE(ZTHV_LES )
+DEALLOCATE(ZTKE_LES )
+DEALLOCATE(ZKE_LES )
+DEALLOCATE(ZTKET_LES)
+DEALLOCATE(ZRV_LES  )
+DEALLOCATE(ZREHU_LES  )
+DEALLOCATE(ZRC_LES  )
+DEALLOCATE(ZRR_LES  )
+DEALLOCATE(ZZZ_LES)
+DEALLOCATE(ZLWP_LES )
+DEALLOCATE(ZRWP_LES )
+DEALLOCATE(ZIWP_LES )
+DEALLOCATE(ZSWP_LES )
+DEALLOCATE(ZGWP_LES )
+DEALLOCATE(ZHWP_LES )
+DEALLOCATE(ZINPRR3D_LES)
+DEALLOCATE(ZEVAP3D_LES)
+DEALLOCATE(ZRI_LES  )
+DEALLOCATE(ZRS_LES  )
+DEALLOCATE(ZRG_LES  )
+DEALLOCATE(ZRH_LES  )
+DEALLOCATE(ZP_ANOM  )
+DEALLOCATE(ZRHO_ANOM)
+DEALLOCATE(ZTH_ANOM )
+DEALLOCATE(ZTHV_ANOM)
+DEALLOCATE(ZRV_ANOM )
+DEALLOCATE(ZRC_ANOM )
+DEALLOCATE(ZRI_ANOM )
+DEALLOCATE(ZRR_ANOM )
+DEALLOCATE(ZDPDZ_ANOM)
+DEALLOCATE(ZMEAN_DPDZ)
+DEALLOCATE(ZLES_MEAN_DTHDZ)
+!
+DEALLOCATE(ZU_SPEC   )
+DEALLOCATE(ZV_SPEC   )
+DEALLOCATE(ZW_SPEC   )
+DEALLOCATE(ZTH_SPEC  )
+DEALLOCATE(ZTHL_SPEC )
+DEALLOCATE(ZRV_SPEC  )
+DEALLOCATE(ZRC_SPEC  )
+DEALLOCATE(ZRI_SPEC  )
+DEALLOCATE(ZSV_SPEC  )
+!
+DEALLOCATE(ZRADEFF_LES  )
+DEALLOCATE(ZSWU_LES  )
+DEALLOCATE(ZSWD_LES  )
+DEALLOCATE(ZLWD_LES  )
+DEALLOCATE(ZLWU_LES  )
+DEALLOCATE(ZDTHRADSW_LES  )
+DEALLOCATE(ZDTHRADLW_LES  )
+!
+!*      9.2  current time-step LES masks (in MODD_LES)
+!            ---------------------------
+!
+DEALLOCATE(LLES_CURRENT_CART_MASK)
+IF (LLES_NEB_MASK)     DEALLOCATE(LLES_CURRENT_NEB_MASK)
+IF (LLES_CORE_MASK)    DEALLOCATE(LLES_CURRENT_CORE_MASK)
+IF (LLES_MY_MASK)   THEN
+   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)
+END IF
+!
+!
+!*      9.3  variables in MODD_LES_BUDGET
+!            ----------------------------
+!
+
+DEALLOCATE(XU_ANOM  )
+DEALLOCATE(XV_ANOM  )
+DEALLOCATE(XW_ANOM  )
+DEALLOCATE(XTHL_ANOM)
+DEALLOCATE(XRT_ANOM )
+DEALLOCATE(XSV_ANOM )
+!
+DEALLOCATE(XCURRENT_L_O_EXN_CP)
+DEALLOCATE(XCURRENT_RHODJ     )
+!
+DEALLOCATE(XCURRENT_RUS  )
+DEALLOCATE(XCURRENT_RVS  )
+DEALLOCATE(XCURRENT_RWS  )
+DEALLOCATE(XCURRENT_RTHS )
+DEALLOCATE(XCURRENT_RTKES)
+DEALLOCATE(XCURRENT_RRS  )
+DEALLOCATE(XCURRENT_RSVS )
+DEALLOCATE(XCURRENT_RTHLS)
+DEALLOCATE(XCURRENT_RRTS )
+
+DEALLOCATE(X_LES_BU_RES_KE   )
+DEALLOCATE(X_LES_BU_RES_WThl )
+DEALLOCATE(X_LES_BU_RES_Thl2 )
+DEALLOCATE(X_LES_BU_RES_WRt  )
+DEALLOCATE(X_LES_BU_RES_Rt2  )
+DEALLOCATE(X_LES_BU_RES_ThlRt)
+DEALLOCATE(X_LES_BU_RES_Sv2  )
+DEALLOCATE(X_LES_BU_RES_WSv  )
+DEALLOCATE(X_LES_BU_SBG_TKE  )
+!-------------------------------------------------------------------------------
+!
+!*      10.  end of LES computations for this time-step
+!            ------------------------------------------
+!
+LLES_CALL=.FALSE.
+CALL BUDGET_FLAGS(LUSERV, LUSERC, LUSERR,         &
+                  LUSERI, LUSERS, LUSERG, LUSERH  )
+!
+!-------------------------------------------------------------------------------
+!
+CONTAINS
+!
+!     ##########################################################################
+      SUBROUTINE  LES(OMASK)
+!     ##########################################################################
+!
+!
+!!****  *LES* computes the current time-step LES diagnostics for one mask.
+!!
+!!
+!!    PURPOSE
+!!    -------
+!!
+!!    EXTERNAL
+!!    --------
+!!
+!!    IMPLICIT ARGUMENTS
+!!    ------------------
+!!
+!!    REFERENCE
+!!    ---------
+!!
+!!    AUTHOR
+!!    ------
+!!      V. Masson
+!!
+!!    MODIFICATIONS
+!!    -------------
+!!      Original         07/02/00
+!!
+!! --------------------------------------------------------------------------
+!
+!*      0. DECLARATIONS
+!          ------------
+!
+USE MODD_PARAMETERS
+!
+USE MODI_LES_FLUX_ll
+USE MODI_LES_3RD_MOMENT_ll
+USE MODI_LES_4TH_MOMENT_ll
+USE MODI_LES_MEAN_1PROC
+USE MODI_LES_MEAN_MPROC
+USE MODI_LES_PDF_ll
+!
+USE MODI_LES_HOR_CORR
+!
+IMPLICIT NONE
+!
+!
+!*      0.1  declarations of arguments
+!
+LOGICAL, DIMENSION(:,:,:),   INTENT(IN) :: OMASK     ! 2D mask for computations
+!
+!
+!
+!       0.2  declaration of local variables
+!
+INTEGER :: JSV      ! scalar variables counter
+INTEGER :: JI
+INTEGER :: JK       ! vertical loop counter
+INTEGER :: JPDF     ! pdf counter
+!
+LOGICAL, DIMENSION(SIZE(ZW_LES,1),SIZE(ZW_LES,2),SIZE(ZW_LES,3)) :: GUPDRAFT_MASK
+LOGICAL, DIMENSION(SIZE(ZW_LES,1),SIZE(ZW_LES,2),SIZE(ZW_LES,3)) :: GDOWNDRAFT_MASK
+REAL,    DIMENSION(SIZE(ZW_LES,1),SIZE(ZW_LES,2),SIZE(ZW_LES,3)) :: ZUPDRAFT
+REAL,    DIMENSION(SIZE(ZW_LES,1),SIZE(ZW_LES,2),SIZE(ZW_LES,3)) :: ZDOWNDRAFT
+REAL,    DIMENSION(SIZE(ZW_LES,1),SIZE(ZW_LES,2),SIZE(ZW_LES,3)) :: ZW_UP
+REAL,    DIMENSION(SIZE(ZW_LES,1),SIZE(ZW_LES,2),SIZE(ZW_LES,3)) :: ZWORK_LES
+!
+INTEGER, DIMENSION(SIZE(ZW_LES,3)) :: IAVG_PTS
+INTEGER, DIMENSION(SIZE(ZW_LES,3)) :: IUND_PTS
+REAL,    DIMENSION(SIZE(ZW_LES,3)) :: ZAVG
+!
+REAL,    DIMENSION(SIZE(ZW_LES,3)) :: ZLES_RESOLVED_U3
+REAL,    DIMENSION(SIZE(ZW_LES,3)) :: ZLES_RESOLVED_UV2
+REAL,    DIMENSION(SIZE(ZW_LES,3)) :: ZLES_RESOLVED_UW2
+REAL,    DIMENSION(SIZE(ZW_LES,3)) :: ZLES_RESOLVED_VU2
+REAL,    DIMENSION(SIZE(ZW_LES,3)) :: ZLES_RESOLVED_V3
+REAL,    DIMENSION(SIZE(ZW_LES,3)) :: ZLES_RESOLVED_VW2
+REAL,    DIMENSION(SIZE(ZW_LES,3)) :: ZLES_RESOLVED_WU2
+REAL,    DIMENSION(SIZE(ZW_LES,3)) :: ZLES_RESOLVED_WV2
+REAL,    DIMENSION(SIZE(ZW_LES,3)) :: ZLES_UPDRAFT_U2
+REAL,    DIMENSION(SIZE(ZW_LES,3)) :: ZLES_UPDRAFT_V2
+REAL,    DIMENSION(SIZE(ZW_LES,3)) :: ZLES_UPDRAFT_W2
+REAL,    DIMENSION(SIZE(ZW_LES,3)) :: ZLES_DOWNDRAFT_U2
+REAL,    DIMENSION(SIZE(ZW_LES,3)) :: ZLES_DOWNDRAFT_V2
+REAL,    DIMENSION(SIZE(ZW_LES,3)) :: ZLES_DOWNDRAFT_W2
+REAL,    DIMENSION(SIZE(ZW_LES,3),NPDF) :: ZPDF
+!
+INTEGER, DIMENSION(1)               :: IKMIN_FLUX ! vertical index of min. W'thl'
+INTEGER, DIMENSION(1)               :: IKMAX_TH !vertical index maxdth
+INTEGER, DIMENSION(1)               :: IKMAX_CF   ! vertical index of max. Cf
+!
+REAL,    DIMENSION(SIZE(ZW_LES,3)) :: ZKE_TOT    ! total turbulent kinetic energy
+REAL                               :: ZINT_KE_TOT! integral of KE_TOT
+REAL                               :: ZINT_RHOKE! integral of RHO*KE
+REAL                               :: ZFRIC_SURF ! surface friction
+REAL,    DIMENSION(SIZE(ZW_LES,3)) :: ZFRIC_LES  ! friction at all LES levels
+!
+!-------------------------------------------------------------------------------
+!
+!       1.   local diagnostics (for any mask type)
+!            -----------------
+!
+!
+!       1.2  Number of points used for averaging on current processor
+!            --------------------------------------------------------
+!
+!* to be sure to be coherent with other computations,
+!  a field on LES vertical grid (and horizontal mass point grid) is used.
+!  This information is necessary for the subgrid fluxes computations, because
+!  half of the work is already done, but the number of averaging points was
+!  not kept.
+!
+CALL LES_MEAN_1PROC ( XW_ANOM, OMASK,                              &
+                      ZAVG(:),                                     &
+                      IAVG_PTS(:),                                 &
+                      IUND_PTS(:)                                  )
+!
+!
+!       1.3  Number of points used for averaging on all processor
+!            ----------------------------------------------------
+!
+CALL LES_MEAN_ll ( XW_ANOM, OMASK,                                  &
+                   ZAVG(:),                                         &
+                   NLES_AVG_PTS_ll(:,NLES_CURRENT_TCOUNT,IMASK),    &
+                   NLES_UND_PTS_ll(:,NLES_CURRENT_TCOUNT,IMASK)     )
+!
+!
+!       1.4  Mean quantities
+!            ---------------
+!
+IF (LLES_MEAN .AND. IMASK > 1) THEN
+!
+!* horizontal wind velocities
+!
+  CALL LES_MEAN_ll ( ZU_LES, OMASK,                               &
+                     XLES_MEAN_U(:,NLES_CURRENT_TCOUNT,IMASK)     )
+!
+  CALL LES_MEAN_ll ( ZV_LES, OMASK,                               &
+                     XLES_MEAN_V(:,NLES_CURRENT_TCOUNT,IMASK)     )
+!
+!* vertical wind velocity
+!
+  CALL LES_MEAN_ll ( ZW_LES, OMASK,                               &
+                     XLES_MEAN_W(:,NLES_CURRENT_TCOUNT,IMASK)     )
+!
+!* pressure
+!
+  CALL LES_MEAN_ll ( ZP_LES, OMASK,                               &
+                     XLES_MEAN_P(:,NLES_CURRENT_TCOUNT,IMASK)     )
+!
+!* dynamical production TKE
+!
+  CALL LES_MEAN_ll ( ZDP_LES, OMASK,                               &
+                     XLES_MEAN_DP(:,NLES_CURRENT_TCOUNT,IMASK)     )
+!
+!* thermal production TKE
+!
+  CALL LES_MEAN_ll ( ZTP_LES, OMASK,                               &
+                     XLES_MEAN_TP(:,NLES_CURRENT_TCOUNT,IMASK)     )
+!
+!* transport TKE
+!
+  CALL LES_MEAN_ll ( ZTR_LES, OMASK,                               &
+                     XLES_MEAN_TR(:,NLES_CURRENT_TCOUNT,IMASK)     )
+!
+!* dissipation TKE
+!
+  CALL LES_MEAN_ll ( ZDISS_LES, OMASK,                               &
+                     XLES_MEAN_DISS(:,NLES_CURRENT_TCOUNT,IMASK)     )
+!
+!* mixing length            
+!
+  CALL LES_MEAN_ll ( ZLM_LES, OMASK,                               &
+                     XLES_MEAN_LM(:,NLES_CURRENT_TCOUNT,IMASK)     )
+!
+!* density
+!
+  CALL LES_MEAN_ll ( ZRHO_LES, OMASK,                             &
+                     XLES_MEAN_RHO(:,NLES_CURRENT_TCOUNT,IMASK)   )
+!
+!
+!* potential temperature
+!
+  CALL LES_MEAN_ll ( ZTH_LES, OMASK,                               &
+                     XLES_MEAN_Th(:,NLES_CURRENT_TCOUNT,IMASK)     )
+!
+!* mass flux
+  CALL LES_MEAN_ll ( ZMF_LES, OMASK,                               &
+                     XLES_MEAN_Mf(:,NLES_CURRENT_TCOUNT,IMASK)     )
+!
+!
+!* virtual potential temperature
+!
+  IF (LUSERV)                                                      &
+  CALL LES_MEAN_ll ( ZTHV_LES, OMASK,                              &
+                     XLES_MEAN_Thv(:,NLES_CURRENT_TCOUNT,IMASK)    )
+!
+!* liquid potential temperature
+!
+  IF (LUSERC) THEN
+    CALL LES_MEAN_ll ( ZTHL_LES, OMASK,                               &
+                       XLES_MEAN_Thl(:,NLES_CURRENT_TCOUNT,IMASK)     )
+  END IF
+!
+!* vapor mixing ratio
+!
+  IF (LUSERV) THEN
+    CALL LES_MEAN_ll ( ZRV_LES, OMASK,                               &
+                       XLES_MEAN_Rv(:,NLES_CURRENT_TCOUNT,IMASK)     )
+  END IF
+!
+!*relative humidity
+!
+  IF (LUSERV) THEN
+    CALL LES_MEAN_ll ( ZREHU_LES, OMASK,                               &
+                       XLES_MEAN_Rehu(:,NLES_CURRENT_TCOUNT,IMASK)     )
+  END IF
+!  
+!* cloud mixing ratio
+!
+  IF (LUSERC) THEN
+    CALL LES_MEAN_ll ( ZRC_LES, OMASK,                              &
+                      XLES_MEAN_Rc(:,NLES_CURRENT_TCOUNT,IMASK)     )
+    CALL LES_MEAN_ll ( ZRT_LES, OMASK,                               &
+                      XLES_MEAN_Rt(:,NLES_CURRENT_TCOUNT,IMASK)     )
+  END IF
+!
+!* rain mixing ratio
+!
+  IF (LUSERR) THEN
+    CALL LES_MEAN_ll ( ZRR_LES, OMASK,                               &
+                       XLES_MEAN_Rr(:,NLES_CURRENT_TCOUNT,IMASK)     )
+  END IF
+!
+!* ice mixing ratio
+!
+  IF (LUSERI) THEN
+    CALL LES_MEAN_ll ( ZRI_LES, OMASK,                               &
+                       XLES_MEAN_Ri(:,NLES_CURRENT_TCOUNT,IMASK)     )
+  END IF
+!
+!* snow mixing ratio
+!
+  IF (LUSERS) THEN
+    CALL LES_MEAN_ll ( ZRS_LES, OMASK,                             &
+                     XLES_MEAN_Rs(:,NLES_CURRENT_TCOUNT,IMASK)     )
+  END IF
+!
+!* graupel mixing ratio
+!
+  IF (LUSERG) THEN
+    CALL LES_MEAN_ll ( ZRG_LES, OMASK,                             &
+                     XLES_MEAN_Rg(:,NLES_CURRENT_TCOUNT,IMASK)     )
+  END IF
+!
+!* hail mixing ratio
+!
+  IF (LUSERH) THEN
+    CALL LES_MEAN_ll ( ZRH_LES, OMASK,                             &
+                       XLES_MEAN_Rh(:,NLES_CURRENT_TCOUNT,IMASK)   )
+  END IF
+!
+!* scalar variables mixing ratio
+!
+  DO JSV=1,NSV
+    CALL LES_MEAN_ll ( ZSV_LES(:,:,:,JSV), OMASK,                        &
+                       XLES_MEAN_Sv(:,NLES_CURRENT_TCOUNT,IMASK,JSV)     )
+  END DO
+END IF
+!
+!* wind modulus
+!
+IF (LLES_MEAN) THEN
+!
+  ZWORK_LES =SQRT( ZU_LES**2 +ZV_LES**2 )
+  CALL LES_MEAN_ll ( ZWORK_LES, OMASK,                           &
+                     XLES_MEAN_WIND(:,NLES_CURRENT_TCOUNT,IMASK) )
+!
+!* vertical speed larger than mean vertical speed (updraft)
+!
+  DO JK=1,NLES_K
+    ZW_UP(:,:,JK) =  MAX(ZW_LES(:,:,JK), XLES_MEAN_W(JK,NLES_CURRENT_TCOUNT,IMASK))
+  END DO
+!
+!* upward mass flux
+!
+  ZWORK_LES = ZW_UP * ZRHO_LES
+  CALL LES_MEAN_ll ( ZWORK_LES, OMASK,                                 &
+                     XLES_RESOLVED_MASSFX(:,NLES_CURRENT_TCOUNT,IMASK) )
+!
+!* pdf calculation
+!
+ IF (LLES_PDF) THEN
+  CALL LES_PDF_ll  ( ZTH_LES,OMASK,XTH_PDF_MIN,XTH_PDF_MAX,    &
+                        ZPDF(:,:) )
+  DO JSV=1,NPDF
+       XLES_PDF_TH(:,NLES_CURRENT_TCOUNT,IMASK,JSV)=ZPDF(:,JSV)
+  END DO
+                        
+  CALL LES_PDF_ll  ( ZW_LES,OMASK,XW_PDF_MIN,XW_PDF_MAX,    &
+                        ZPDF(:,:) )
+  DO JSV=1,NPDF
+       XLES_PDF_W(:,NLES_CURRENT_TCOUNT,IMASK,JSV)=ZPDF(:,JSV)
+  END DO
+  CALL LES_PDF_ll  ( ZTHV_LES,OMASK,XTHV_PDF_MIN,XTHV_PDF_MAX,    &
+                        ZPDF(:,:) )
+  DO JSV=1,NPDF
+       XLES_PDF_THV(:,NLES_CURRENT_TCOUNT,IMASK,JSV)=ZPDF(:,JSV)
+  END DO
+  IF (LUSERV) THEN
+   CALL LES_PDF_ll  ( ZRV_LES,OMASK,XRV_PDF_MIN,XRV_PDF_MAX,    &
+                        ZPDF(:,:) )
+   DO JSV=1,NPDF
+       XLES_PDF_RV(:,NLES_CURRENT_TCOUNT,IMASK,JSV)=ZPDF(:,JSV)
+   END DO
+  END IF
+  IF (LUSERC) THEN
+    CALL LES_PDF_ll  ( ZRC_LES,OMASK,XRC_PDF_MIN,XRC_PDF_MAX,    &
+                        ZPDF(:,:) )
+    DO JSV=1,NPDF
+       XLES_PDF_RC(:,NLES_CURRENT_TCOUNT,IMASK,JSV)=ZPDF(:,JSV)
+    END DO
+    CALL LES_PDF_ll  ( ZRT_LES,OMASK,XRT_PDF_MIN,XRT_PDF_MAX,    &
+                        ZPDF(:,:) )
+    DO JSV=1,NPDF
+       XLES_PDF_RT(:,NLES_CURRENT_TCOUNT,IMASK,JSV)=ZPDF(:,JSV)
+    END DO
+    CALL LES_PDF_ll  ( ZTHL_LES,OMASK,XTHL_PDF_MIN,XTHL_PDF_MAX,    &
+                        ZPDF(:,:) )
+    DO JSV=1,NPDF
+       XLES_PDF_THL(:,NLES_CURRENT_TCOUNT,IMASK,JSV)=ZPDF(:,JSV)
+    END DO
+  END IF
+  IF (LUSERR) THEN
+    CALL LES_PDF_ll  ( ZRR_LES,OMASK,XRR_PDF_MIN,XRR_PDF_MAX,    &
+                        ZPDF(:,:) )
+    DO JSV=1,NPDF
+       XLES_PDF_RR(:,NLES_CURRENT_TCOUNT,IMASK,JSV)=ZPDF(:,JSV)
+    END DO
+  END IF
+  IF (LUSERI) THEN
+    CALL LES_PDF_ll  ( ZRI_LES,OMASK,XRI_PDF_MIN,XRI_PDF_MAX,    &
+                        ZPDF(:,:) )
+    DO JSV=1,NPDF
+       XLES_PDF_RI(:,NLES_CURRENT_TCOUNT,IMASK,JSV)=ZPDF(:,JSV)
+    END DO
+  END IF
+  IF (LUSERS) THEN
+    CALL LES_PDF_ll  ( ZRS_LES,OMASK,XRS_PDF_MIN,XRS_PDF_MAX,    &
+                        ZPDF(:,:) )
+    DO JSV=1,NPDF
+       XLES_PDF_RS(:,NLES_CURRENT_TCOUNT,IMASK,JSV)=ZPDF(:,JSV)
+    END DO
+  END IF
+  IF (LUSERG) THEN
+    CALL LES_PDF_ll  ( ZRG_LES,OMASK,XRG_PDF_MIN,XRG_PDF_MAX,    &
+                        ZPDF(:,:) )
+    DO JSV=1,NPDF
+       XLES_PDF_RG(:,NLES_CURRENT_TCOUNT,IMASK,JSV)=ZPDF(:,JSV)
+    END DO
+  END IF
+ END IF
+!
+!* mean vertical gradients
+!
+  CALL LES_MEAN_ll ( ZDTHLDZ_LES, OMASK, XLES_MEAN_DTHLDZ(:,NLES_CURRENT_TCOUNT,IMASK) )
+  CALL LES_MEAN_ll ( ZDUDZ_LES, OMASK, XLES_MEAN_DUDZ(:,NLES_CURRENT_TCOUNT,IMASK) )
+  CALL LES_MEAN_ll ( ZDVDZ_LES, OMASK, XLES_MEAN_DVDZ(:,NLES_CURRENT_TCOUNT,IMASK) )
+  CALL LES_MEAN_ll ( ZDWDZ_LES, OMASK, XLES_MEAN_DWDZ(:,NLES_CURRENT_TCOUNT,IMASK) )
+  IF (LUSERV) CALL LES_MEAN_ll ( ZDRtDZ_LES, OMASK, XLES_MEAN_DRtDZ(:,NLES_CURRENT_TCOUNT,IMASK) )
+  DO JSV=1,NSV
+    CALL LES_MEAN_ll ( ZDSVDZ_LES(:,:,:,JSV), OMASK, XLES_MEAN_DSVDZ(:,NLES_CURRENT_TCOUNT,IMASK,JSV) )
+  END DO
+
+END IF
+!-------------------------------------------------------------------------------
+!
+!       1.5  Resolved quantities
+!            -------------------
+!
+!* horizontal wind variances
+!
+  CALL LES_FLUX_ll ( XU_ANOM, XU_ANOM,                                 &
+                     OMASK,                                            &
+                     XLES_RESOLVED_U2 (:,NLES_CURRENT_TCOUNT,IMASK)    )
+!
+  CALL LES_FLUX_ll ( XV_ANOM, XV_ANOM,                                 &
+                     OMASK,                                            &
+                     XLES_RESOLVED_V2 (:,NLES_CURRENT_TCOUNT,IMASK)    )
+!
+!* vertical wind variance
+!
+  CALL LES_FLUX_ll ( XW_ANOM, XW_ANOM,                                 &
+                     OMASK,                                            &
+                     XLES_RESOLVED_W2 (:,NLES_CURRENT_TCOUNT,IMASK)    )
+!
+!* pressure variance
+!
+  CALL LES_FLUX_ll ( ZP_ANOM, ZP_ANOM,                                 &
+                     OMASK,                                            &
+                     XLES_RESOLVED_P2 (:,NLES_CURRENT_TCOUNT,IMASK)    )
+!
+!* potential temperature variance
+!
+  CALL LES_FLUX_ll ( ZTH_ANOM, ZTH_ANOM,                               &
+                     OMASK,                                            &
+                     XLES_RESOLVED_TH2(:,NLES_CURRENT_TCOUNT,IMASK)    )
+
+!
+!* resolved turbulent kinetic energy
+!
+  XLES_RESOLVED_Ke(:,NLES_CURRENT_TCOUNT,IMASK) = XUNDEF
+!
+  WHERE(XLES_RESOLVED_U2 (:,NLES_CURRENT_TCOUNT,IMASK) /= XUNDEF) &
+  XLES_RESOLVED_Ke(:,NLES_CURRENT_TCOUNT,IMASK) = 0.5*(           &
+                   XLES_RESOLVED_U2 (:,NLES_CURRENT_TCOUNT,IMASK) &
+                 + XLES_RESOLVED_V2 (:,NLES_CURRENT_TCOUNT,IMASK) &
+                 + XLES_RESOLVED_W2 (:,NLES_CURRENT_TCOUNT,IMASK))
+!
+!* potential temperature - virtual potential temperature covariance
+!
+  IF (LUSERV) THEN
+    CALL LES_FLUX_ll ( ZTH_ANOM, ZTHV_ANOM,                              &
+                       OMASK,                                            &
+                       XLES_RESOLVED_THTHV(:,NLES_CURRENT_TCOUNT,IMASK)  )
+
+!
+!* vapor mixing ratio variance
+!
+    CALL LES_FLUX_ll ( ZRV_ANOM, ZRV_ANOM,                               &
+                       OMASK,                                            &
+                       XLES_RESOLVED_Rv2(:,NLES_CURRENT_TCOUNT,IMASK)    )
+!
+!
+!* potential temperature - vapor mixing ratio correlation
+!
+    CALL LES_FLUX_ll ( ZTH_ANOM, ZRV_ANOM,                               &
+                       OMASK,                                            &
+                       XLES_RESOLVED_ThRv(:,NLES_CURRENT_TCOUNT,IMASK)   )
+!
+!* virtual potential temperature - vapor mixing ratio correlation
+!
+    CALL LES_FLUX_ll ( ZTHV_ANOM, ZRV_ANOM,                              &
+                       OMASK,                                            &
+                       XLES_RESOLVED_ThvRv(:,NLES_CURRENT_TCOUNT,IMASK)  )
+  END IF
+!
+!
+!* liquid potential temperature - virtual potential temperature covariance
+!
+  IF (LUSERC) THEN
+    CALL LES_FLUX_ll ( XTHL_ANOM, ZTHV_ANOM,                             &
+                       OMASK,                                            &
+                       XLES_RESOLVED_THLTHV(:,NLES_CURRENT_TCOUNT,IMASK) )
+!
+!* liquid potential temperature variance
+!
+    CALL LES_FLUX_ll ( XTHL_ANOM, XTHL_ANOM,                             &
+                       OMASK,                                            &
+                       XLES_RESOLVED_THL2(:,NLES_CURRENT_TCOUNT,IMASK)   )
+!
+!* total water mixing ratio variance
+!
+    CALL LES_FLUX_ll ( XRT_ANOM, XRT_ANOM,                               &
+                       OMASK,                                            &
+                       XLES_RESOLVED_Rt2(:,NLES_CURRENT_TCOUNT,IMASK)    )
+!
+!* cloud mixing ratio variance
+!
+    CALL LES_FLUX_ll ( ZRC_ANOM, ZRC_ANOM,                               &
+                       OMASK,                                            &
+                       XLES_RESOLVED_Rc2(:,NLES_CURRENT_TCOUNT,IMASK)    )
+!
+!* potential temperature - cloud mixing ratio correlation
+!
+    CALL LES_FLUX_ll ( ZTH_ANOM, ZRC_ANOM,                               &
+                       OMASK,                                            &
+                       XLES_RESOLVED_ThRc(:,NLES_CURRENT_TCOUNT,IMASK)   )
+!
+!* liquid potential temperature - vapor mixing ratio correlation
+!
+    CALL LES_FLUX_ll ( XTHL_ANOM, ZRV_ANOM,                               &
+                       OMASK,                                             &
+                       XLES_RESOLVED_ThlRv(:,NLES_CURRENT_TCOUNT,IMASK)   )
+!
+!* liquid potential temperature - cloud mixing ratio correlation
+!
+    CALL LES_FLUX_ll ( XTHL_ANOM, ZRC_ANOM,                               &
+                       OMASK,                                             &
+                       XLES_RESOLVED_ThlRc(:,NLES_CURRENT_TCOUNT,IMASK)   )
+!
+!* virtual potential temperature - cloud mixing ratio correlation
+!
+    CALL LES_FLUX_ll ( ZTHV_ANOM, ZRC_ANOM,                              &
+                       OMASK,                                            &
+                       XLES_RESOLVED_ThvRc(:,NLES_CURRENT_TCOUNT,IMASK)  )
+!
+! variance of lwp 
+!
+    IF (IMASK .EQ. 1) THEN
+    CALL LES_FLUX_ll (ZLWP_ANOM, ZLWP_ANOM,                           &
+                      OMASK(:,:,1),                                   &
+                       XLES_LWPVAR(NLES_CURRENT_TCOUNT)  ) 
+    END IF
+  END IF
+!
+!* ice mixing ratio variance
+!
+  IF (LUSERI) THEN
+    CALL LES_FLUX_ll ( ZRI_ANOM, ZRI_ANOM,                               &
+                       OMASK,                                            &
+                       XLES_RESOLVED_Ri2(:,NLES_CURRENT_TCOUNT,IMASK)    )
+!
+!* potential temperature - ice mixing ratio correlation
+!
+    CALL LES_FLUX_ll ( ZTH_ANOM, ZRI_ANOM,                               &
+                       OMASK,                                            &
+                       XLES_RESOLVED_ThRi(:,NLES_CURRENT_TCOUNT,IMASK)   )
+!
+!* liquid potential temperature - ice mixing ratio correlation
+!
+    CALL LES_FLUX_ll ( XTHL_ANOM, ZRI_ANOM,                               &
+                       OMASK,                                             &
+                       XLES_RESOLVED_ThlRi(:,NLES_CURRENT_TCOUNT,IMASK)   )
+!
+!* virtual potential temperature - ice mixing ratio correlation
+!
+    CALL LES_FLUX_ll ( ZTHV_ANOM, ZRI_ANOM,                              &
+                       OMASK,                                            &
+                       XLES_RESOLVED_ThvRi(:,NLES_CURRENT_TCOUNT,IMASK)  )
+  END IF
+!
+!* scalar variable mixing ratio variances
+!
+  DO JSV=1,NSV
+    CALL LES_FLUX_ll ( XSV_ANOM(:,:,:,JSV), XSV_ANOM(:,:,:,JSV),             &
+                       OMASK,                                                &
+                       XLES_RESOLVED_Sv2(:,NLES_CURRENT_TCOUNT,IMASK,JSV)    )
+!
+!* potential temperature - scalar variables ratio correlation
+!
+    CALL LES_FLUX_ll ( ZTH_ANOM, XSV_ANOM(:,:,:,JSV),                      &
+                       OMASK,                                              &
+                       XLES_RESOLVED_ThSv(:,NLES_CURRENT_TCOUNT,IMASK,JSV) )
+!
+!* liquid potential temperature - scalar variables ratio correlation
+!
+    IF (LUSERC) THEN
+      CALL LES_FLUX_ll ( XTHL_ANOM, XSV_ANOM(:,:,:,JSV),                     &
+                         OMASK,                                              &
+                         XLES_RESOLVED_ThlSv(:,NLES_CURRENT_TCOUNT,IMASK,JSV) )
+    END IF
+!
+!* virtual potential temperature - scalar variables ratio correlation
+!
+    IF (LUSERV) THEN
+      CALL LES_FLUX_ll ( ZTHV_ANOM, XSV_ANOM(:,:,:,JSV),                      &
+                         OMASK,                                               &
+                         XLES_RESOLVED_ThvSv(:,NLES_CURRENT_TCOUNT,IMASK,JSV) )
+    END IF
+  END DO
+!
+!
+!* wind fluxes
+!
+  CALL LES_FLUX_ll ( XU_ANOM, XV_ANOM,                                 &
+                     OMASK,                                            &
+                     XLES_RESOLVED_UV (:,NLES_CURRENT_TCOUNT,IMASK)    )
+!
+  CALL LES_FLUX_ll ( XW_ANOM, XU_ANOM,                                 &
+                     OMASK,                                            &
+                     XLES_RESOLVED_WU (:,NLES_CURRENT_TCOUNT,IMASK)    )
+!
+  CALL LES_FLUX_ll ( XW_ANOM, XV_ANOM,                                 &
+                     OMASK,                                            &
+                     XLES_RESOLVED_WV (:,NLES_CURRENT_TCOUNT,IMASK)    )
+!
+!* pressure fluxes
+!
+  CALL LES_FLUX_ll ( XU_ANOM, ZDPDZ_ANOM,                               &
+                     OMASK,                                             &
+                     XLES_RESOLVED_UP  (:,NLES_CURRENT_TCOUNT,IMASK)    )
+!
+  CALL LES_FLUX_ll ( XV_ANOM, ZDPDZ_ANOM,                               &
+                     OMASK,                                             &
+                     XLES_RESOLVED_VP  (:,NLES_CURRENT_TCOUNT,IMASK)    )
+!
+  CALL LES_FLUX_ll ( XW_ANOM, ZDPDZ_ANOM,                               &
+                     OMASK,                                             &
+                     XLES_RESOLVED_WP  (:,NLES_CURRENT_TCOUNT,IMASK)    )
+!
+!* theta fluxes
+!
+  CALL LES_FLUX_ll ( XU_ANOM, ZTH_ANOM,                                 &
+                     OMASK,                                             &
+                     XLES_RESOLVED_UTh (:,NLES_CURRENT_TCOUNT,IMASK)    )
+
+  CALL LES_FLUX_ll ( XV_ANOM, ZTH_ANOM,                                 &
+                     OMASK,                                             &
+                     XLES_RESOLVED_VTh (:,NLES_CURRENT_TCOUNT,IMASK)    )
+!
+  CALL LES_FLUX_ll ( XW_ANOM, ZTH_ANOM,                                 &
+                     OMASK,                                             &
+                     XLES_RESOLVED_WTh (:,NLES_CURRENT_TCOUNT,IMASK)    )
+!
+!* virtual theta fluxes
+!
+  IF (LUSERV) THEN
+    CALL LES_FLUX_ll ( XU_ANOM, ZTHV_ANOM,                                 &
+                       OMASK,                                              &
+                       XLES_RESOLVED_UThv (:,NLES_CURRENT_TCOUNT,IMASK)    )
+!
+    CALL LES_FLUX_ll ( XV_ANOM, ZTHV_ANOM,                                 &
+                       OMASK,                                              &
+                       XLES_RESOLVED_VThv (:,NLES_CURRENT_TCOUNT,IMASK)    )
+!
+    CALL LES_FLUX_ll ( XW_ANOM, ZTHV_ANOM,                                 &
+                       OMASK,                                              &
+                       XLES_RESOLVED_WThv (:,NLES_CURRENT_TCOUNT,IMASK)    )
+!
+!* vapor mixing ratio fluxes
+!
+    CALL LES_FLUX_ll ( XU_ANOM, ZRV_ANOM,                                  &
+                       OMASK,                                              &
+                       XLES_RESOLVED_URv (:,NLES_CURRENT_TCOUNT,IMASK)     )
+!
+    CALL LES_FLUX_ll ( XV_ANOM, ZRV_ANOM,                                  &
+                       OMASK,                                              &
+                       XLES_RESOLVED_VRv (:,NLES_CURRENT_TCOUNT,IMASK)     )
+!
+    CALL LES_FLUX_ll ( XW_ANOM, ZRV_ANOM,                                  &
+                       OMASK,                                              &
+                       XLES_RESOLVED_WRv (:,NLES_CURRENT_TCOUNT,IMASK)     )
+  END IF
+!
+!* cloud water mixing ratio fluxes
+!
+  IF (LUSERC) THEN
+    CALL LES_FLUX_ll ( XU_ANOM, ZRC_ANOM,                                  &
+                       OMASK,                                              &
+                       XLES_RESOLVED_URc (:,NLES_CURRENT_TCOUNT,IMASK)     )
+!
+    CALL LES_FLUX_ll ( XV_ANOM, ZRC_ANOM,                                  &
+                       OMASK,                                              &
+                       XLES_RESOLVED_VRc (:,NLES_CURRENT_TCOUNT,IMASK)     )
+!
+    CALL LES_FLUX_ll ( XW_ANOM, ZRC_ANOM,                                  &
+                       OMASK,                                              &
+                       XLES_RESOLVED_WRc (:,NLES_CURRENT_TCOUNT,IMASK)     )
+!
+!* liquid theta fluxes
+!
+    CALL LES_FLUX_ll ( XU_ANOM, XTHL_ANOM,                                 &
+                       OMASK,                                              &
+                       XLES_RESOLVED_UThl (:,NLES_CURRENT_TCOUNT,IMASK)    )
+!
+    CALL LES_FLUX_ll ( XV_ANOM, XTHL_ANOM,                                 &
+                       OMASK,                                              &
+                       XLES_RESOLVED_VThl (:,NLES_CURRENT_TCOUNT,IMASK)    )
+!
+    CALL LES_FLUX_ll ( XW_ANOM, XTHL_ANOM,                                 &
+                       OMASK,                                              &
+                       XLES_RESOLVED_WThl (:,NLES_CURRENT_TCOUNT,IMASK)    )
+!
+!* total water mixing ratio fluxes
+!
+    CALL LES_FLUX_ll ( XW_ANOM, XRT_ANOM,                                  &
+                       OMASK,                                              &
+                       XLES_RESOLVED_WRt (:,NLES_CURRENT_TCOUNT,IMASK)     )
+  END IF
+!
+!* cloud ice mixing ratio fluxes
+!
+  IF (LUSERI) THEN
+    CALL LES_FLUX_ll ( XU_ANOM, ZRI_ANOM,                                  &
+                       OMASK,                                              &
+                       XLES_RESOLVED_URi (:,NLES_CURRENT_TCOUNT,IMASK)     )
+!
+  CALL LES_FLUX_ll ( XV_ANOM, ZRI_ANOM,                                  &
+                     OMASK,                                              &
+                     XLES_RESOLVED_VRi (:,NLES_CURRENT_TCOUNT,IMASK)     )
+!
+    CALL LES_FLUX_ll ( XW_ANOM, ZRI_ANOM,                                  &
+                       OMASK,                                              &
+                       XLES_RESOLVED_WRi (:,NLES_CURRENT_TCOUNT,IMASK)     )
+  END IF
+  IF (LUSERR) THEN
+     CALL LES_FLUX_ll ( XW_ANOM, ZRR_ANOM,                                  &
+                       OMASK,                                              &
+                       XLES_RESOLVED_WRr (:,NLES_CURRENT_TCOUNT,IMASK)     )
+  END IF
+!
+
+!
+!* scalar variables fluxes
+!
+  DO JSV=1,NSV
+    CALL LES_FLUX_ll ( XU_ANOM, XSV_ANOM(:,:,:,JSV),                           &
+                       OMASK,                                                  &
+                       XLES_RESOLVED_USv (:,NLES_CURRENT_TCOUNT,IMASK,JSV)     )
+!
+   CALL LES_FLUX_ll ( XV_ANOM, XSV_ANOM(:,:,:,JSV),                            &
+                       OMASK,                                                  &
+                       XLES_RESOLVED_VSv (:,NLES_CURRENT_TCOUNT,IMASK,JSV)     )
+!
+    CALL LES_FLUX_ll ( XW_ANOM, XSV_ANOM(:,:,:,JSV),                           &
+                       OMASK,                                                  &
+                       XLES_RESOLVED_WSv (:,NLES_CURRENT_TCOUNT,IMASK,JSV)     )
+  END DO
+!
+!* skewness
+!
+  CALL LES_3RD_MOMENT_ll ( XU_ANOM, XU_ANOM, XU_ANOM,                       &
+                          OMASK,                                            &
+                          XLES_RESOLVED_U3 (:,NLES_CURRENT_TCOUNT,IMASK)    )
+ 
+  CALL LES_3RD_MOMENT_ll ( XV_ANOM, XV_ANOM, XV_ANOM,                       &
+                          OMASK,                                            &
+                          XLES_RESOLVED_V3 (:,NLES_CURRENT_TCOUNT,IMASK)    )
+ 
+  CALL LES_3RD_MOMENT_ll ( XW_ANOM, XW_ANOM, XW_ANOM,                       &
+                          OMASK,                                            &
+                          XLES_RESOLVED_W3 (:,NLES_CURRENT_TCOUNT,IMASK)    )
+!
+!* kurtosis
+!
+  CALL LES_4TH_MOMENT_ll ( XU_ANOM, XU_ANOM, XU_ANOM,  XU_ANOM,              &
+                          OMASK,                                            &
+                          XLES_RESOLVED_U4 (:,NLES_CURRENT_TCOUNT,IMASK)    )
+ 
+  CALL LES_4TH_MOMENT_ll ( XV_ANOM, XV_ANOM, XV_ANOM,  XV_ANOM,             &
+                          OMASK,                                            &
+                          XLES_RESOLVED_V4 (:,NLES_CURRENT_TCOUNT,IMASK)    )
+ 
+  CALL LES_4TH_MOMENT_ll ( XW_ANOM, XW_ANOM, XW_ANOM,   XW_ANOM,            &
+                          OMASK,                                            &
+                          XLES_RESOLVED_W4 (:,NLES_CURRENT_TCOUNT,IMASK)    )
+!
+!* third moments of liquid potential temperature
+!
+  IF (LUSERC) THEN
+    CALL LES_3RD_MOMENT_ll ( XW_ANOM, XTHL_ANOM, XTHL_ANOM,                    &
+                            OMASK,                                             &
+                            XLES_RESOLVED_WThl2(:,NLES_CURRENT_TCOUNT,IMASK)   )
+
+    CALL LES_3RD_MOMENT_ll ( XW_ANOM, XW_ANOM, XTHL_ANOM,                      &
+                            OMASK,                                             &
+                            XLES_RESOLVED_W2Thl(:,NLES_CURRENT_TCOUNT,IMASK)   )
+
+  ELSE
+    CALL LES_3RD_MOMENT_ll ( XW_ANOM, ZTH_ANOM, ZTH_ANOM,                      &
+                            OMASK,                                             &
+                            XLES_RESOLVED_WThl2(:,NLES_CURRENT_TCOUNT,IMASK)   )
+
+    CALL LES_3RD_MOMENT_ll ( XW_ANOM, XW_ANOM, ZTH_ANOM,                       &
+                            OMASK,                                             &
+                            XLES_RESOLVED_W2Thl(:,NLES_CURRENT_TCOUNT,IMASK)   )
+  END IF
+!
+!* third moments of water vapor
+!
+  IF (LUSERV) THEN
+    CALL LES_3RD_MOMENT_ll ( XW_ANOM, ZRV_ANOM, ZRV_ANOM,                      &
+                            OMASK,                                             &
+                            XLES_RESOLVED_WRv2 (:,NLES_CURRENT_TCOUNT,IMASK)   )
+
+    CALL LES_3RD_MOMENT_ll ( XW_ANOM, XW_ANOM, ZRV_ANOM,                       &
+                            OMASK,                                             &
+                            XLES_RESOLVED_W2Rv (:,NLES_CURRENT_TCOUNT,IMASK)   )
+  END IF
+
+  IF (LUSERC) THEN
+    CALL LES_3RD_MOMENT_ll ( XW_ANOM, XTHL_ANOM, ZRV_ANOM,                     &
+                            OMASK,                                             &
+                            XLES_RESOLVED_WThlRv(:,NLES_CURRENT_TCOUNT,IMASK)  )
+  ELSE IF (LUSERV) THEN
+    CALL LES_3RD_MOMENT_ll ( XW_ANOM, ZTH_ANOM, ZRV_ANOM,                      &
+                            OMASK,                                             &
+                            XLES_RESOLVED_WThlRv(:,NLES_CURRENT_TCOUNT,IMASK)  )
+  END IF
+!
+!* third moments of total water
+! 
+  IF (LUSERC) THEN
+    CALL LES_3RD_MOMENT_ll ( XW_ANOM, XRT_ANOM, XRT_ANOM,                      &
+                            OMASK,                                             &
+                            XLES_RESOLVED_WRt2 (:,NLES_CURRENT_TCOUNT,IMASK)   )
+
+    CALL LES_3RD_MOMENT_ll ( XW_ANOM, XW_ANOM, XRT_ANOM,                       &
+                            OMASK,                                             &
+                            XLES_RESOLVED_W2Rt (:,NLES_CURRENT_TCOUNT,IMASK)   )
+    CALL LES_3RD_MOMENT_ll ( XW_ANOM, XTHL_ANOM, XRT_ANOM,                       &
+                            OMASK,                                             &
+                            XLES_RESOLVED_WThlRt (:,NLES_CURRENT_TCOUNT,IMASK)   )                        
+  ELSE IF (LUSERV) THEN
+    CALL LES_3RD_MOMENT_ll ( XW_ANOM, ZRV_ANOM, ZRV_ANOM,                      &
+                            OMASK,                                             &
+                            XLES_RESOLVED_WRt2 (:,NLES_CURRENT_TCOUNT,IMASK)   )
+
+    CALL LES_3RD_MOMENT_ll ( XW_ANOM, XW_ANOM, ZRV_ANOM,                       &
+                            OMASK,                                             &
+                            XLES_RESOLVED_W2Rt (:,NLES_CURRENT_TCOUNT,IMASK)   )
+    CALL LES_3RD_MOMENT_ll ( XW_ANOM, ZTH_ANOM, ZRV_ANOM,                       &
+                            OMASK,                                             &
+                            XLES_RESOLVED_WThlRt (:,NLES_CURRENT_TCOUNT,IMASK)   )                        
+  END IF                            
+!
+!* third moments of cloud water
+!
+  IF (LUSERC) THEN
+    CALL LES_3RD_MOMENT_ll ( XW_ANOM, ZRC_ANOM, ZRC_ANOM,                      &
+                            OMASK,                                             &
+                            XLES_RESOLVED_WRc2 (:,NLES_CURRENT_TCOUNT,IMASK)   )
+
+    CALL LES_3RD_MOMENT_ll ( XW_ANOM, XW_ANOM, ZRC_ANOM,                       &
+                            OMASK,                                             &
+                            XLES_RESOLVED_W2Rc (:,NLES_CURRENT_TCOUNT,IMASK)   )
+
+    CALL LES_3RD_MOMENT_ll ( XW_ANOM, XTHL_ANOM, ZRC_ANOM,                     &
+                            OMASK,                                             &
+                            XLES_RESOLVED_WThlRc(:,NLES_CURRENT_TCOUNT,IMASK)  )
+
+    CALL LES_3RD_MOMENT_ll ( XW_ANOM, ZRV_ANOM, ZRC_ANOM,                      &
+                            OMASK,                                             &
+                            XLES_RESOLVED_WRvRc (:,NLES_CURRENT_TCOUNT,IMASK)  )
+  END IF
+!
+!* third moments of cloud ice
+!
+  IF (LUSERI) THEN
+    CALL LES_3RD_MOMENT_ll ( XW_ANOM, ZRI_ANOM, ZRI_ANOM,                      &
+                            OMASK,                                             &
+                            XLES_RESOLVED_WRi2 (:,NLES_CURRENT_TCOUNT,IMASK)   )
+
+    CALL LES_3RD_MOMENT_ll ( XW_ANOM, XW_ANOM, ZRI_ANOM,                      &
+                           OMASK,                                             &
+                           XLES_RESOLVED_W2Ri (:,NLES_CURRENT_TCOUNT,IMASK)   )
+
+    CALL LES_3RD_MOMENT_ll ( XW_ANOM, XTHL_ANOM, ZRI_ANOM,                     &
+                            OMASK,                                             &
+                            XLES_RESOLVED_WThlRi(:,NLES_CURRENT_TCOUNT,IMASK)  )
+
+    CALL LES_3RD_MOMENT_ll ( XW_ANOM, ZRV_ANOM, ZRI_ANOM,                      &
+                            OMASK,                                             &
+                            XLES_RESOLVED_WRvRi (:,NLES_CURRENT_TCOUNT,IMASK)  )
+  END IF
+!
+!* third moments of scalar variables
+!
+  DO JSV=1,NSV
+    CALL LES_3RD_MOMENT_ll ( XW_ANOM, XSV_ANOM(:,:,:,JSV), XSV_ANOM(:,:,:,JSV),    &
+                            OMASK,                                                 &
+                            XLES_RESOLVED_WSv2 (:,NLES_CURRENT_TCOUNT,IMASK,JSV)   )
+
+    CALL LES_3RD_MOMENT_ll ( XW_ANOM, XW_ANOM, XSV_ANOM(:,:,:,JSV),                &
+                            OMASK,                                                 &
+                            XLES_RESOLVED_W2Sv (:,NLES_CURRENT_TCOUNT,IMASK,JSV)   )
+    IF (LUSERC) THEN
+      CALL LES_3RD_MOMENT_ll ( XW_ANOM, XTHL_ANOM, XSV_ANOM(:,:,:,JSV),              &
+                              OMASK,                                                 &
+                              XLES_RESOLVED_WThlSv(:,NLES_CURRENT_TCOUNT,IMASK,JSV)  )
+    ELSE
+      CALL LES_3RD_MOMENT_ll ( XW_ANOM, ZTH_ANOM, XSV_ANOM(:,:,:,JSV),               &
+                              OMASK,                                                 &
+                              XLES_RESOLVED_WThlSv(:,NLES_CURRENT_TCOUNT,IMASK,JSV)  )
+    END IF
+
+    IF (LUSERV) THEN
+      CALL LES_3RD_MOMENT_ll ( XW_ANOM, ZRV_ANOM, XSV_ANOM(:,:,:,JSV),               &
+                              OMASK,                                                 &
+                              XLES_RESOLVED_WRvSv (:,NLES_CURRENT_TCOUNT,IMASK,JSV)  )
+    END IF
+  END DO
+!
+!* presso-correlations
+!
+!
+  CALL LES_FLUX_ll ( XTHL_ANOM, ZDPDZ_ANOM,                              &
+                     OMASK,                                              &
+                     XLES_RESOLVED_ThlPz(:,NLES_CURRENT_TCOUNT,IMASK)    )
+
+  IF (LUSERV) &
+  CALL LES_FLUX_ll ( ZRV_ANOM, ZDPDZ_ANOM,                               &
+                     OMASK,                                              &
+                     XLES_RESOLVED_RvPz(:,NLES_CURRENT_TCOUNT,IMASK)     )
+
+  IF (LUSERC) THEN
+    CALL LES_FLUX_ll ( XRT_ANOM, ZDPDZ_ANOM,                               &
+                       OMASK,                                              &
+                       XLES_RESOLVED_RtPz(:,NLES_CURRENT_TCOUNT,IMASK)     )
+
+    CALL LES_FLUX_ll ( ZRC_ANOM, ZDPDZ_ANOM,                               &
+                       OMASK,                                              &
+                       XLES_RESOLVED_RcPz(:,NLES_CURRENT_TCOUNT,IMASK)     )
+  END IF
+
+  IF (LUSERI) &
+  CALL LES_FLUX_ll ( ZRI_ANOM, ZDPDZ_ANOM,                               &
+                     OMASK,                                              &
+                     XLES_RESOLVED_RiPz(:,NLES_CURRENT_TCOUNT,IMASK)     )
+
+!
+!
+!* resolved turbulent kinetic energy fluxes
+!
+
+  CALL LES_3RD_MOMENT_ll ( XU_ANOM, XU_ANOM, XU_ANOM,                        &
+                          OMASK,                                             &
+                          ZLES_RESOLVED_U3  (:)                              )
+
+  CALL LES_3RD_MOMENT_ll ( XU_ANOM, XV_ANOM, XV_ANOM,                        &
+                          OMASK,                                             &
+                          ZLES_RESOLVED_UV2 (:)                              )
+
+  CALL LES_3RD_MOMENT_ll ( XU_ANOM, XW_ANOM, XW_ANOM,                        &
+                          OMASK,                                             &
+                          ZLES_RESOLVED_UW2 (:)                              )
+
+  XLES_RESOLVED_UKe(:,NLES_CURRENT_TCOUNT,IMASK) = 0.5*(  ZLES_RESOLVED_U3  &
+                                                        + ZLES_RESOLVED_UV2 &
+                                                        + ZLES_RESOLVED_UW2 )
+
+
+
+  CALL LES_3RD_MOMENT_ll ( XV_ANOM, XU_ANOM, XU_ANOM,                        &
+                          OMASK,                                             &
+                          ZLES_RESOLVED_VU2 (:)                              )
+
+  CALL LES_3RD_MOMENT_ll ( XV_ANOM, XV_ANOM, XV_ANOM,                        &
+                          OMASK,                                             &
+                          ZLES_RESOLVED_V3  (:)                              )
+
+  CALL LES_3RD_MOMENT_ll ( XV_ANOM, XW_ANOM, XW_ANOM,                        &
+                          OMASK,                                             &
+                          ZLES_RESOLVED_VW2 (:)                              )
+
+  XLES_RESOLVED_VKe(:,NLES_CURRENT_TCOUNT,IMASK) = 0.5*(  ZLES_RESOLVED_VU2 &
+                                                        + ZLES_RESOLVED_V3  &
+                                                        + ZLES_RESOLVED_VW2 )
+
+
+  CALL LES_3RD_MOMENT_ll ( XW_ANOM, XU_ANOM, XU_ANOM,                        &
+                          OMASK,                                             &
+                          ZLES_RESOLVED_WU2 (:)                              )
+
+  CALL LES_3RD_MOMENT_ll ( XW_ANOM, XV_ANOM, XV_ANOM,                        &
+                          OMASK,                                             &
+                          ZLES_RESOLVED_WV2 (:)                              )
+
+  XLES_RESOLVED_WKe(:,NLES_CURRENT_TCOUNT,IMASK) = 0.5*(  ZLES_RESOLVED_WU2  &
+                                                        + ZLES_RESOLVED_WV2  &
+                           + XLES_RESOLVED_W3(:,NLES_CURRENT_TCOUNT,IMASK)   )
+
+!
+!
+!-------------------------------------------------------------------------------
+!
+!       1.6  Subgrid quantities
+!            ------------------
+!
+IF (LLES_SUBGRID) THEN
+!
+!* wind fluxes and variances
+!
+  CALL LES_MEAN_ll ( ZTKE_LES, OMASK,                                  &
+                     XLES_SUBGRID_Tke(:,NLES_CURRENT_TCOUNT,IMASK)     )
+
+  CALL LES_MEAN_MPROC ( XLES_SUBGRID_UV(:,NLES_CURRENT_TCOUNT,IMASK),   &
+                        IAVG_PTS(:), IUND_PTS(:)                        )
+!
+  CALL LES_MEAN_MPROC ( XLES_SUBGRID_WU(:,NLES_CURRENT_TCOUNT,IMASK),   &
+                        IAVG_PTS(:), IUND_PTS(:)                        )
+!
+  CALL LES_MEAN_MPROC ( XLES_SUBGRID_WV(:,NLES_CURRENT_TCOUNT,IMASK),   &
+                        IAVG_PTS(:), IUND_PTS(:)                        )
+!
+  CALL LES_MEAN_MPROC ( XLES_SUBGRID_U2(:,NLES_CURRENT_TCOUNT,IMASK),   &
+                        IAVG_PTS(:), IUND_PTS(:)                        )
+!
+  CALL LES_MEAN_MPROC ( XLES_SUBGRID_V2(:,NLES_CURRENT_TCOUNT,IMASK),   &
+                        IAVG_PTS(:), IUND_PTS(:)                        )
+!
+  CALL LES_MEAN_MPROC ( XLES_SUBGRID_W2(:,NLES_CURRENT_TCOUNT,IMASK),   &
+                        IAVG_PTS(:), IUND_PTS(:)                        )
+!
+!
+!* liquid potential temperature fluxes
+!
+  CALL LES_MEAN_MPROC ( XLES_SUBGRID_UThl(:,NLES_CURRENT_TCOUNT,IMASK), &
+                        IAVG_PTS(:), IUND_PTS(:)                        )
+!
+  CALL LES_MEAN_MPROC ( XLES_SUBGRID_VThl(:,NLES_CURRENT_TCOUNT,IMASK), &
+                        IAVG_PTS(:), IUND_PTS(:)                        )
+!
+  CALL LES_MEAN_MPROC ( XLES_SUBGRID_WThl(:,NLES_CURRENT_TCOUNT,IMASK), &
+                        IAVG_PTS(:), IUND_PTS(:)                        )
+!
+
+!* liquid potential temperature variance
+!
+  CALL LES_MEAN_MPROC ( XLES_SUBGRID_Thl2(:,NLES_CURRENT_TCOUNT,IMASK), &
+                        IAVG_PTS(:), IUND_PTS(:)                        )
+!
+!* Mass flux scheme of shallow convection
+!
+  CALL LES_MEAN_MPROC ( XLES_SUBGRID_THLUP_MF(:,NLES_CURRENT_TCOUNT,IMASK), &
+                        IAVG_PTS(:), IUND_PTS(:)                        )  
+                        
+  CALL LES_MEAN_MPROC ( XLES_SUBGRID_RTUP_MF(:,NLES_CURRENT_TCOUNT,IMASK), &
+                        IAVG_PTS(:), IUND_PTS(:)                        )   
+!
+  CALL LES_MEAN_MPROC ( XLES_SUBGRID_RVUP_MF(:,NLES_CURRENT_TCOUNT,IMASK), &
+                        IAVG_PTS(:), IUND_PTS(:)                        )   
+!
+  CALL LES_MEAN_MPROC ( XLES_SUBGRID_RCUP_MF(:,NLES_CURRENT_TCOUNT,IMASK), &
+                        IAVG_PTS(:), IUND_PTS(:)                        )   
+!
+  CALL LES_MEAN_MPROC ( XLES_SUBGRID_RIUP_MF(:,NLES_CURRENT_TCOUNT,IMASK), &
+                        IAVG_PTS(:), IUND_PTS(:)                        )   
+!
+  CALL LES_MEAN_MPROC ( XLES_SUBGRID_WUP_MF(:,NLES_CURRENT_TCOUNT,IMASK), &
+                        IAVG_PTS(:), IUND_PTS(:)                        )    
+!
+  CALL LES_MEAN_MPROC ( XLES_SUBGRID_MASSFLUX(:,NLES_CURRENT_TCOUNT,IMASK), &
+                        IAVG_PTS(:), IUND_PTS(:)                        )  
+!
+  CALL LES_MEAN_MPROC ( XLES_SUBGRID_DETR(:,NLES_CURRENT_TCOUNT,IMASK), &
+                        IAVG_PTS(:), IUND_PTS(:)                        )      
+!
+  CALL LES_MEAN_MPROC ( XLES_SUBGRID_ENTR(:,NLES_CURRENT_TCOUNT,IMASK), &
+                        IAVG_PTS(:), IUND_PTS(:)                        )      
+!
+  CALL LES_MEAN_MPROC ( XLES_SUBGRID_FRACUP(:,NLES_CURRENT_TCOUNT,IMASK), &
+                        IAVG_PTS(:), IUND_PTS(:)                        )     
+!
+  CALL LES_MEAN_MPROC ( XLES_SUBGRID_THVUP_MF(:,NLES_CURRENT_TCOUNT,IMASK), &
+                        IAVG_PTS(:), IUND_PTS(:)                        )  
+!
+  CALL LES_MEAN_MPROC ( XLES_SUBGRID_WTHLMF(:,NLES_CURRENT_TCOUNT,IMASK), &
+                        IAVG_PTS(:), IUND_PTS(:)                        )    
+!
+  CALL LES_MEAN_MPROC ( XLES_SUBGRID_WRTMF(:,NLES_CURRENT_TCOUNT,IMASK), &
+                        IAVG_PTS(:), IUND_PTS(:)                        )  
+!
+  CALL LES_MEAN_MPROC ( XLES_SUBGRID_WTHVMF(:,NLES_CURRENT_TCOUNT,IMASK), &
+                        IAVG_PTS(:), IUND_PTS(:)                        ) 
+!
+  CALL LES_MEAN_MPROC ( XLES_SUBGRID_WUMF(:,NLES_CURRENT_TCOUNT,IMASK), &
+                        IAVG_PTS(:), IUND_PTS(:)                        )   
+!
+  CALL LES_MEAN_MPROC ( XLES_SUBGRID_WVMF(:,NLES_CURRENT_TCOUNT,IMASK), &
+                        IAVG_PTS(:), IUND_PTS(:)                        )   
+
+                        
+!* total water mixing ratio fluxes, correlation and variance
+!
+  IF (LUSERV) THEN
+    CALL LES_MEAN_MPROC ( XLES_SUBGRID_URt(:,NLES_CURRENT_TCOUNT,IMASK),  &
+                          IAVG_PTS(:), IUND_PTS(:)                        )
+    !
+    CALL LES_MEAN_MPROC ( XLES_SUBGRID_VRt(:,NLES_CURRENT_TCOUNT,IMASK),  &
+                          IAVG_PTS(:), IUND_PTS(:)                        )
+    !
+    CALL LES_MEAN_MPROC ( XLES_SUBGRID_WRt(:,NLES_CURRENT_TCOUNT,IMASK),  &
+                          IAVG_PTS(:), IUND_PTS(:)                        )
+    !
+    CALL LES_MEAN_MPROC ( XLES_SUBGRID_ThlRt(:,NLES_CURRENT_TCOUNT,IMASK),&
+                          IAVG_PTS(:), IUND_PTS(:)                        )
+    !
+    CALL LES_MEAN_MPROC ( XLES_SUBGRID_Rt2(:,NLES_CURRENT_TCOUNT,IMASK),  &
+                          IAVG_PTS(:), IUND_PTS(:)                        )
+  END IF
+!
+!* scalar variances
+!
+  DO JSV=1,NSV
+    CALL LES_MEAN_MPROC ( XLES_SUBGRID_Sv2(:,NLES_CURRENT_TCOUNT,IMASK,JSV), &
+                          IAVG_PTS(:), IUND_PTS(:)                           )
+  END DO
+!
+!* cloud water mixing ratio fluxes
+!
+  IF (LUSERC) THEN
+    CALL LES_MEAN_MPROC ( XLES_SUBGRID_URc(:,NLES_CURRENT_TCOUNT,IMASK),  &
+                          IAVG_PTS(:), IUND_PTS(:)                        )
+    !
+    CALL LES_MEAN_MPROC ( XLES_SUBGRID_VRc(:,NLES_CURRENT_TCOUNT,IMASK),  &
+                          IAVG_PTS(:), IUND_PTS(:)                        )
+    !
+    CALL LES_MEAN_MPROC ( XLES_SUBGRID_WRc(:,NLES_CURRENT_TCOUNT,IMASK),  &
+                          IAVG_PTS(:), IUND_PTS(:)                        )
+  END IF
+!
+!* scalar variables fluxes
+!
+  DO JSV=1,NSV
+    CALL LES_MEAN_MPROC ( XLES_SUBGRID_USv(:,NLES_CURRENT_TCOUNT,IMASK,JSV),  &
+                          IAVG_PTS(:), IUND_PTS(:)                            )
+    !
+    CALL LES_MEAN_MPROC ( XLES_SUBGRID_VSv(:,NLES_CURRENT_TCOUNT,IMASK,JSV),  &
+                          IAVG_PTS(:), IUND_PTS(:)                            )
+    !
+    CALL LES_MEAN_MPROC ( XLES_SUBGRID_WSv(:,NLES_CURRENT_TCOUNT,IMASK,JSV),  &
+                          IAVG_PTS(:), IUND_PTS(:)                            )
+  END DO
+!
+!* subgrid turbulent kinetic energy fluxes
+!
+  CALL LES_MEAN_MPROC ( XLES_SUBGRID_UTke(:,NLES_CURRENT_TCOUNT,IMASK),  &
+                        IAVG_PTS(:), IUND_PTS(:)                         )
+  !
+  CALL LES_MEAN_MPROC ( XLES_SUBGRID_VTke(:,NLES_CURRENT_TCOUNT,IMASK),  &
+                        IAVG_PTS(:), IUND_PTS(:)                         )
+  !
+  CALL LES_MEAN_MPROC ( XLES_SUBGRID_WTke(:,NLES_CURRENT_TCOUNT,IMASK),  &
+                        IAVG_PTS(:), IUND_PTS(:)                         )
+
+  CALL LES_MEAN_MPROC ( XLES_SUBGRID_ddz_WTke(:,NLES_CURRENT_TCOUNT,IMASK),&
+                        IAVG_PTS(:), IUND_PTS(:)                           )
+!
+!* fluxes and correlations with virtual potential temperature
+!
+  IF (LUSERV) THEN
+    CALL LES_MEAN_MPROC ( XLES_SUBGRID_WThv(:,NLES_CURRENT_TCOUNT,IMASK),  &
+                          IAVG_PTS(:), IUND_PTS(:)                         )
+
+    CALL LES_MEAN_MPROC ( XLES_SUBGRID_ThlThv(:,NLES_CURRENT_TCOUNT,IMASK),&
+                          IAVG_PTS(:), IUND_PTS(:)                         )
+
+    CALL LES_MEAN_MPROC ( XLES_SUBGRID_RtThv(:,NLES_CURRENT_TCOUNT,IMASK), &
+                          IAVG_PTS(:), IUND_PTS(:)                         )
+
+    DO JSV=1,NSV
+      CALL LES_MEAN_MPROC ( XLES_SUBGRID_SvThv(:,NLES_CURRENT_TCOUNT,IMASK,JSV),  &
+                            IAVG_PTS(:), IUND_PTS(:)                              )
+   END DO
+  END IF
+!
+!* third order fluxes
+!
+  CALL LES_MEAN_MPROC ( XLES_SUBGRID_W2Thl(:,NLES_CURRENT_TCOUNT,IMASK),   &
+                          IAVG_PTS(:), IUND_PTS(:)                         )
+
+  CALL LES_MEAN_MPROC ( XLES_SUBGRID_WThl2(:,NLES_CURRENT_TCOUNT,IMASK),   &
+                          IAVG_PTS(:), IUND_PTS(:)                         )
+
+  IF (LUSERV) THEN
+    CALL LES_MEAN_MPROC ( XLES_SUBGRID_W2Rt(:,NLES_CURRENT_TCOUNT,IMASK),  &
+                          IAVG_PTS(:), IUND_PTS(:)                         )
+
+    CALL LES_MEAN_MPROC ( XLES_SUBGRID_WThlRt(:,NLES_CURRENT_TCOUNT,IMASK),&
+                          IAVG_PTS(:), IUND_PTS(:)                         )
+
+    CALL LES_MEAN_MPROC ( XLES_SUBGRID_WRt2(:,NLES_CURRENT_TCOUNT,IMASK),  &
+                          IAVG_PTS(:), IUND_PTS(:)                         )
+
+  END IF
+    DO JSV=1,NSV
+      CALL LES_MEAN_MPROC ( XLES_SUBGRID_W2Sv(:,NLES_CURRENT_TCOUNT,IMASK,JSV),  &
+                            IAVG_PTS(:), IUND_PTS(:)                             )
+
+      CALL LES_MEAN_MPROC ( XLES_SUBGRID_WSv2(:,NLES_CURRENT_TCOUNT,IMASK,JSV),  &
+                            IAVG_PTS(:), IUND_PTS(:)                             )
+   END DO
+!
+!* dissipative terms
+!
+  CALL LES_MEAN_MPROC ( XLES_SUBGRID_DISS_Tke(:,NLES_CURRENT_TCOUNT,IMASK), &
+                          IAVG_PTS(:), IUND_PTS(:)                          )
+
+  CALL LES_MEAN_MPROC ( XLES_SUBGRID_DISS_Thl2(:,NLES_CURRENT_TCOUNT,IMASK), &
+                          IAVG_PTS(:), IUND_PTS(:)                           )
+
+  IF (LUSERV) THEN
+    CALL LES_MEAN_MPROC ( XLES_SUBGRID_DISS_Rt2(:,NLES_CURRENT_TCOUNT,IMASK),&
+                          IAVG_PTS(:), IUND_PTS(:)                           )
+
+    CALL LES_MEAN_MPROC ( XLES_SUBGRID_DISS_ThlRt(:,NLES_CURRENT_TCOUNT,IMASK),&
+                          IAVG_PTS(:), IUND_PTS(:)                             )
+  END IF
+
+  DO JSV=1,NSV
+    CALL LES_MEAN_MPROC ( XLES_SUBGRID_DISS_Sv2(:,NLES_CURRENT_TCOUNT,IMASK,JSV), &
+                          IAVG_PTS(:), IUND_PTS(:)                                )
+  END DO
+!
+!* presso-correlation terms
+!
+  CALL LES_MEAN_MPROC ( XLES_SUBGRID_WP(:,NLES_CURRENT_TCOUNT,IMASK), &
+                          IAVG_PTS(:), IUND_PTS(:)                    )
+
+  CALL LES_MEAN_MPROC ( XLES_SUBGRID_ThlPz(:,NLES_CURRENT_TCOUNT,IMASK), &
+                          IAVG_PTS(:), IUND_PTS(:)                       )
+
+  IF (LUSERV) THEN
+    CALL LES_MEAN_MPROC ( XLES_SUBGRID_RtPz(:,NLES_CURRENT_TCOUNT,IMASK), &
+                          IAVG_PTS(:), IUND_PTS(:)                        )
+
+  END IF
+
+  DO JSV=1,NSV
+    CALL LES_MEAN_MPROC ( XLES_SUBGRID_SvPz(:,NLES_CURRENT_TCOUNT,IMASK,JSV), &
+                          IAVG_PTS(:), IUND_PTS(:)                            )
+  END DO
+
+!* phi3 and psi3 terms
+!
+  CALL LES_MEAN_MPROC ( XLES_SUBGRID_PHI3(:,NLES_CURRENT_TCOUNT,IMASK), &
+                          IAVG_PTS(:), IUND_PTS(:)                    )
+
+  IF (LUSERV) THEN
+    CALL LES_MEAN_MPROC ( XLES_SUBGRID_PSI3(:,NLES_CURRENT_TCOUNT,IMASK), &
+                            IAVG_PTS(:), IUND_PTS(:)                    )
+  END IF 
+!
+!* subgrid mixing length
+!
+  CALL LES_MEAN_MPROC ( XLES_SUBGRID_LMix(:,NLES_CURRENT_TCOUNT,IMASK), &
+                          IAVG_PTS(:), IUND_PTS(:)                      )
+!
+!* subgrid dissipative length
+!
+  CALL LES_MEAN_MPROC ( XLES_SUBGRID_LDiss(:,NLES_CURRENT_TCOUNT,IMASK), &
+                          IAVG_PTS(:), IUND_PTS(:)                       )
+!
+!* eddy diffusivities
+!
+  CALL LES_MEAN_MPROC ( XLES_SUBGRID_Km(:,NLES_CURRENT_TCOUNT,IMASK), &
+                          IAVG_PTS(:), IUND_PTS(:)                    )
+
+  CALL LES_MEAN_MPROC ( XLES_SUBGRID_Kh(:,NLES_CURRENT_TCOUNT,IMASK), &
+                          IAVG_PTS(:), IUND_PTS(:)                    )
+  
+END IF
+!
+! computation of KHT and KHR depending on LLES
+  IF (LUSERC) THEN 
+   IF (LLES_RESOLVED) THEN 
+    XLES_MEAN_KHt(:,NLES_CURRENT_TCOUNT,IMASK)=0.       
+    WHERE(XLES_MEAN_DTHLDZ(:,NLES_CURRENT_TCOUNT,IMASK)/=0)              &
+          XLES_MEAN_KHt(:,NLES_CURRENT_TCOUNT,IMASK)=-1.                 &
+                      *XLES_RESOLVED_WThl (:,NLES_CURRENT_TCOUNT,IMASK)/ &
+                       XLES_MEAN_DTHLDZ(:,NLES_CURRENT_TCOUNT,IMASK)
+    XLES_MEAN_KHr(:,NLES_CURRENT_TCOUNT,IMASK)=0.                   
+    WHERE(XLES_MEAN_DRtDZ(:,NLES_CURRENT_TCOUNT,IMASK)/=0)               &
+          XLES_MEAN_KHr(:,NLES_CURRENT_TCOUNT,IMASK)=-1.*                &
+                        XLES_RESOLVED_WRt (:,NLES_CURRENT_TCOUNT,IMASK)/ &
+                       XLES_MEAN_DRtDZ(:,NLES_CURRENT_TCOUNT,IMASK)
+   END IF                    
+   IF (LLES_SUBGRID) THEN 
+    XLES_MEAN_KHt(:,NLES_CURRENT_TCOUNT,IMASK)=0.       
+    WHERE(XLES_MEAN_DTHLDZ(:,NLES_CURRENT_TCOUNT,IMASK)/=0)              & 
+          XLES_MEAN_KHt(:,NLES_CURRENT_TCOUNT,IMASK)=-1.                 &
+                      *XLES_SUBGRID_WThl (:,NLES_CURRENT_TCOUNT,IMASK) /  &
+                       XLES_MEAN_DTHLDZ(:,NLES_CURRENT_TCOUNT,IMASK)
+    XLES_MEAN_KHr(:,NLES_CURRENT_TCOUNT,IMASK)=0.                   
+    WHERE(XLES_MEAN_DRtDZ(:,NLES_CURRENT_TCOUNT,IMASK)/=0)               &
+          XLES_MEAN_KHr(:,NLES_CURRENT_TCOUNT,IMASK)=-1.*                &
+                     XLES_SUBGRID_WRt (:,NLES_CURRENT_TCOUNT,IMASK) / &
+                       XLES_MEAN_DRtDZ(:,NLES_CURRENT_TCOUNT,IMASK)
+   END IF
+   IF (LLES_RESOLVED .AND. LLES_SUBGRID) THEN 
+    XLES_MEAN_KHt(:,NLES_CURRENT_TCOUNT,IMASK)=0.       
+    WHERE(XLES_MEAN_DTHLDZ(:,NLES_CURRENT_TCOUNT,IMASK)/=0)              &
+          XLES_MEAN_KHt(:,NLES_CURRENT_TCOUNT,IMASK)=-1.                 &
+                      *(XLES_RESOLVED_WThl (:,NLES_CURRENT_TCOUNT,IMASK)+ &
+                        XLES_SUBGRID_WThl (:,NLES_CURRENT_TCOUNT,IMASK))/ &
+                       XLES_MEAN_DTHLDZ(:,NLES_CURRENT_TCOUNT,IMASK)
+    XLES_MEAN_KHr(:,NLES_CURRENT_TCOUNT,IMASK)=0.                   
+    WHERE(XLES_MEAN_DRtDZ(:,NLES_CURRENT_TCOUNT,IMASK)/=0)               &
+          XLES_MEAN_KHr(:,NLES_CURRENT_TCOUNT,IMASK)=-1.*                &
+                        (XLES_RESOLVED_WRt (:,NLES_CURRENT_TCOUNT,IMASK)+ &
+                     XLES_SUBGRID_WRt (:,NLES_CURRENT_TCOUNT,IMASK)) / &
+                       XLES_MEAN_DRtDZ(:,NLES_CURRENT_TCOUNT,IMASK)
+   END IF
+  END IF
+!-------------------------------------------------------------------------------
+!
+!       1.7  Interaction of subgrid and resolved quantities
+!            ----------------------------------------------
+!
+!* WARNING: these terms also contain the term due to the mean flow.
+!           this mean flow contribution will be removed from them
+!           when treated in write_les_budgetn.f90
+!
+!
+!* subgrid turbulent kinetic energy fluxes
+!
+IF (LLES_RESOLVED) THEN
+  CALL LES_FLUX_ll ( XU_ANOM, ZTKE_LES,                                 &
+                     OMASK,                                             &
+                     XLES_RES_U_SBG_Tke(:,NLES_CURRENT_TCOUNT,IMASK)    )
+!
+  CALL LES_FLUX_ll ( XV_ANOM, ZTKE_LES,                                 &
+                     OMASK,                                             &
+                     XLES_RES_V_SBG_Tke(:,NLES_CURRENT_TCOUNT,IMASK)    )
+!
+  CALL LES_FLUX_ll ( XW_ANOM, ZTKE_LES,                                 &
+                     OMASK,                                             &
+                     XLES_RES_W_SBG_Tke(:,NLES_CURRENT_TCOUNT,IMASK)    )
+END IF
+!
+!* WARNING: these terms also contain the term due to the mean flow.
+!           this mean flow contribution will be removed from them
+!           when treated in write_les_budgetn.f90
+!
+!* production terms for subgrid quantities
+!
+IF (LLES_RESOLVED .AND. LLES_SUBGRID) THEN
+  CALL LES_MEAN_MPROC ( XLES_RES_ddxa_U_SBG_UaU(:,NLES_CURRENT_TCOUNT,IMASK), &
+                        IAVG_PTS(:), IUND_PTS(:)                              )
+
+  CALL LES_MEAN_MPROC ( XLES_RES_ddxa_V_SBG_UaV(:,NLES_CURRENT_TCOUNT,IMASK), &
+                        IAVG_PTS(:), IUND_PTS(:)                              )
+
+  CALL LES_MEAN_MPROC ( XLES_RES_ddxa_W_SBG_UaW(:,NLES_CURRENT_TCOUNT,IMASK), &
+                        IAVG_PTS(:), IUND_PTS(:)                              )
+
+  CALL LES_MEAN_MPROC ( XLES_RES_ddxa_W_SBG_UaThl(:,NLES_CURRENT_TCOUNT,IMASK), &
+                        IAVG_PTS(:), IUND_PTS(:)                                )
+
+  CALL LES_MEAN_MPROC ( XLES_RES_ddxa_Thl_SBG_UaW(:,NLES_CURRENT_TCOUNT,IMASK), &
+                        IAVG_PTS(:), IUND_PTS(:)                                )
+
+  CALL LES_MEAN_MPROC ( XLES_RES_ddz_Thl_SBG_W2  (:,NLES_CURRENT_TCOUNT,IMASK), &
+                        IAVG_PTS(:), IUND_PTS(:)                                )
+
+  CALL LES_MEAN_MPROC ( XLES_RES_ddxa_Thl_SBG_UaThl(:,NLES_CURRENT_TCOUNT,IMASK), &
+                        IAVG_PTS(:), IUND_PTS(:)                                  )
+
+  IF (LUSERV) THEN
+    CALL LES_MEAN_MPROC ( XLES_RES_ddxa_W_SBG_UaRt(:,NLES_CURRENT_TCOUNT,IMASK), &
+                          IAVG_PTS(:), IUND_PTS(:)                               )
+
+    CALL LES_MEAN_MPROC ( XLES_RES_ddxa_Rt_SBG_UaW(:,NLES_CURRENT_TCOUNT,IMASK), &
+                          IAVG_PTS(:), IUND_PTS(:)                               )
+
+    CALL LES_MEAN_MPROC ( XLES_RES_ddz_Rt_SBG_W2  (:,NLES_CURRENT_TCOUNT,IMASK), &
+                          IAVG_PTS(:), IUND_PTS(:)                               )
+
+    CALL LES_MEAN_MPROC ( XLES_RES_ddxa_Thl_SBG_UaRt(:,NLES_CURRENT_TCOUNT,IMASK), &
+                          IAVG_PTS(:), IUND_PTS(:)                                 )
+
+    CALL LES_MEAN_MPROC ( XLES_RES_ddxa_Rt_SBG_UaThl(:,NLES_CURRENT_TCOUNT,IMASK), &
+                          IAVG_PTS(:), IUND_PTS(:)                                 )
+
+    CALL LES_MEAN_MPROC ( XLES_RES_ddxa_Rt_SBG_UaRt(:,NLES_CURRENT_TCOUNT,IMASK), &
+                          IAVG_PTS(:), IUND_PTS(:)                                )
+
+  END IF
+!
+!* WARNING: these terms also contain the term due to the mean flow.
+!           this mean flow contribution will be removed from them
+!           when treated in write_les_budgetn.f90
+!
+!* turbulent transport and advection terms for subgrid quantities
+!
+  CALL LES_MEAN_MPROC ( XLES_RES_W_SBG_WThl(:,NLES_CURRENT_TCOUNT,IMASK), &
+                        IAVG_PTS(:), IUND_PTS(:)                          )
+
+  CALL LES_MEAN_MPROC ( XLES_RES_W_SBG_Thl2(:,NLES_CURRENT_TCOUNT,IMASK), &
+                        IAVG_PTS(:), IUND_PTS(:)                          )
+
+  IF (LUSERV) THEN
+    CALL LES_MEAN_MPROC ( XLES_RES_W_SBG_WRt(:,NLES_CURRENT_TCOUNT,IMASK), &
+                          IAVG_PTS(:), IUND_PTS(:)                         )
+
+    CALL LES_MEAN_MPROC ( XLES_RES_W_SBG_Rt2(:,NLES_CURRENT_TCOUNT,IMASK), &
+                          IAVG_PTS(:), IUND_PTS(:)                         )
+
+    CALL LES_MEAN_MPROC ( XLES_RES_W_SBG_ThlRt(:,NLES_CURRENT_TCOUNT,IMASK), &
+                          IAVG_PTS(:), IUND_PTS(:)                           )
+
+  END IF
+
+  DO JSV=1,NSV
+    CALL LES_MEAN_MPROC ( XLES_RES_W_SBG_WSv(:,NLES_CURRENT_TCOUNT,IMASK,JSV), &
+                          IAVG_PTS(:), IUND_PTS(:)                             )
+
+    CALL LES_MEAN_MPROC ( XLES_RES_W_SBG_Sv2(:,NLES_CURRENT_TCOUNT,IMASK,JSV), &
+                          IAVG_PTS(:), IUND_PTS(:)                             )
+  END DO
+END IF
+!
+!-------------------------------------------------------------------------------
+!
+!       2.   The following is for cartesian mask only
+!            ----------------------------------------
+!
+IF (IMASK>1) RETURN
+!
+!-------------------------------------------------------------------------------
+!
+!       3.   Updraft diagnostics
+!            -------------------
+!
+IF (LLES_UPDRAFT) THEN
+!
+  DO JK=1,NLES_K
+    GUPDRAFT_MASK(:,:,JK) = (XW_ANOM(:,:,JK) > 0.) .AND. LLES_CURRENT_CART_MASK(:,:,JK)
+  END DO
+!
+!
+!       3.1  Updraft fraction
+!            ----------------
+!
+  ZUPDRAFT(:,:,:) = 0.
+  WHERE (GUPDRAFT_MASK(:,:,:))
+    ZUPDRAFT(:,:,:) = 1.
+  END WHERE
+!
+  CALL LES_MEAN_ll ( ZUPDRAFT, OMASK,                        &
+                     XLES_UPDRAFT(:,NLES_CURRENT_TCOUNT)     )
+!
+!
+!       3.2  Updraft mean quantities
+!            -----------------------
+!
+!* vertical wind velocity
+!
+  CALL LES_MEAN_ll ( ZW_LES, GUPDRAFT_MASK,                    &
+                     XLES_UPDRAFT_W(:,NLES_CURRENT_TCOUNT)     )
+!
+!* potential temperature
+!
+  CALL LES_MEAN_ll ( ZTH_LES, GUPDRAFT_MASK,                   &
+                     XLES_UPDRAFT_Th(:,NLES_CURRENT_TCOUNT)    )
+!
+!* liquid potential temperature
+!
+  IF (LUSERC) &
+  CALL LES_MEAN_ll ( ZTHL_LES, GUPDRAFT_MASK,                   &
+                     XLES_UPDRAFT_Thl(:,NLES_CURRENT_TCOUNT)    )
+!
+!* virtual potential temperature
+!
+  IF (LUSERV) &
+  CALL LES_MEAN_ll ( ZTHV_LES, GUPDRAFT_MASK,                   &
+                     XLES_UPDRAFT_Thv(:,NLES_CURRENT_TCOUNT)    )
+!
+!* vapor mixing ratio
+!
+  IF (LUSERV) &
+  CALL LES_MEAN_ll ( ZRV_LES, GUPDRAFT_MASK,                    &
+                     XLES_UPDRAFT_Rv(:,NLES_CURRENT_TCOUNT)     )
+!
+!* cloud water mixing ratio
+!
+  IF (LUSERC) &
+  CALL LES_MEAN_ll ( ZRC_LES, GUPDRAFT_MASK,                    &
+                     XLES_UPDRAFT_Rc(:,NLES_CURRENT_TCOUNT)     )
+!
+!* rain mixing ratio
+!
+  IF (LUSERR) &
+  CALL LES_MEAN_ll ( ZRR_LES, GUPDRAFT_MASK,                    &
+                     XLES_UPDRAFT_Rr(:,NLES_CURRENT_TCOUNT)     )
+!
+!* cloud ice mixing ratio
+!
+  IF (LUSERI) &
+  CALL LES_MEAN_ll ( ZRI_LES, GUPDRAFT_MASK,                    &
+                     XLES_UPDRAFT_Ri(:,NLES_CURRENT_TCOUNT)     )
+!
+!* snow mixing ratio
+!
+  IF (LUSERS) &
+  CALL LES_MEAN_ll ( ZRS_LES, GUPDRAFT_MASK,                    &
+                     XLES_UPDRAFT_Rs(:,NLES_CURRENT_TCOUNT)     )
+!
+!* graupel mixing ratio
+!
+  IF (LUSERG) &
+  CALL LES_MEAN_ll ( ZRG_LES, GUPDRAFT_MASK,                    &
+                     XLES_UPDRAFT_Rg(:,NLES_CURRENT_TCOUNT)     )
+!
+!* hail mixing ratio
+!
+  IF (LUSERH) &
+  CALL LES_MEAN_ll ( ZRG_LES, GUPDRAFT_MASK,                    &
+                     XLES_UPDRAFT_Rh(:,NLES_CURRENT_TCOUNT)     )
+!
+!* scalar variables
+!
+  DO JSV=1,NSV
+    CALL LES_MEAN_ll ( ZSV_LES(:,:,:,JSV), GUPDRAFT_MASK,             &
+                       XLES_UPDRAFT_Sv(:,NLES_CURRENT_TCOUNT,JSV)     )
+  END DO
+!
+!* subgrid turbulent kinetic energy
+!
+  CALL LES_MEAN_ll ( ZTKE_LES, GUPDRAFT_MASK,                    &
+                     XLES_UPDRAFT_Tke(:,NLES_CURRENT_TCOUNT)     )
+!
+!
+!       3.3  Updraft resolved quantities
+!            ---------------------------
+!
+!
+!* resolved turbulent kinetic energy
+!
+  CALL LES_FLUX_ll ( XU_ANOM, XU_ANOM,                           &
+                     GUPDRAFT_MASK,                              &
+                     ZLES_UPDRAFT_U2(:)                          )
+
+  CALL LES_FLUX_ll ( XV_ANOM, XV_ANOM,                           &
+                     GUPDRAFT_MASK,                              &
+                     ZLES_UPDRAFT_V2(:)                          )
+
+  CALL LES_FLUX_ll ( XW_ANOM, XW_ANOM,                           &
+                     GUPDRAFT_MASK,                              &
+                     ZLES_UPDRAFT_W2(:)                          )
+
+  XLES_UPDRAFT_Ke(:,NLES_CURRENT_TCOUNT)  = 0.5 * (  ZLES_UPDRAFT_U2(:) &
+                                                   + ZLES_UPDRAFT_V2(:) &
+                                                   + ZLES_UPDRAFT_W2(:) )
+!
+!* vertical potential temperature flux
+!
+  CALL LES_FLUX_ll ( XW_ANOM, ZTH_ANOM,                          &
+                     GUPDRAFT_MASK,                              &
+                     XLES_UPDRAFT_WTh(:,NLES_CURRENT_TCOUNT)     )
+!
+!* vertical liquid potential temperature flux
+!
+  IF (LUSERC) &
+  CALL LES_FLUX_ll ( XW_ANOM, XTHL_ANOM,                          &
+                     GUPDRAFT_MASK,                               &
+                     XLES_UPDRAFT_WThl(:,NLES_CURRENT_TCOUNT)     )
+!
+!* vertical virtual potential temperature flux
+!
+  IF (LUSERV) &
+  CALL LES_FLUX_ll ( XW_ANOM, ZTHV_ANOM,                          &
+                     GUPDRAFT_MASK,                               &
+                     XLES_UPDRAFT_WThv(:,NLES_CURRENT_TCOUNT)     )
+!
+!* potential temperature variance
+!
+  CALL LES_FLUX_ll ( ZTH_ANOM, ZTH_ANOM,                          &
+                     GUPDRAFT_MASK,                               &
+                     XLES_UPDRAFT_Th2(:,NLES_CURRENT_TCOUNT)      )
+!
+!* liquid potential temperature variance
+!
+  IF (LUSERC) &
+  CALL LES_FLUX_ll ( XTHL_ANOM, XTHL_ANOM,                         &
+                     GUPDRAFT_MASK,                                &
+                     XLES_UPDRAFT_Thl2(:,NLES_CURRENT_TCOUNT)      )
+!
+!* potential temperature - virtual potential temperature covariance
+!
+  IF (LUSERV) &
+  CALL LES_FLUX_ll ( ZTH_ANOM, ZTHV_ANOM,                          &
+                     GUPDRAFT_MASK,                                &
+                     XLES_UPDRAFT_ThThv (:,NLES_CURRENT_TCOUNT)    )
+!
+!* liquid potential temperature - virtual potential temperature covariance
+!
+  IF (LUSERC) &
+  CALL LES_FLUX_ll ( XTHL_ANOM, ZTHV_ANOM,                         &
+                     GUPDRAFT_MASK,                                &
+                     XLES_UPDRAFT_ThlThv(:,NLES_CURRENT_TCOUNT)    )
+!
+!* water vapor mixing ratio flux, variance and correlations
+!
+  IF (LUSERV) THEN
+    CALL LES_FLUX_ll ( XW_ANOM, ZRV_ANOM,                           &
+                       GUPDRAFT_MASK,                               &
+                       XLES_UPDRAFT_WRv(:,NLES_CURRENT_TCOUNT)      )
+    !
+    CALL LES_FLUX_ll ( ZRV_ANOM, ZRV_ANOM,                          &
+                       GUPDRAFT_MASK,                               &
+                       XLES_UPDRAFT_Rv2(:,NLES_CURRENT_TCOUNT)      )
+    !
+    CALL LES_FLUX_ll ( ZTH_ANOM, ZRV_ANOM,                          &
+                       GUPDRAFT_MASK,                               &
+                       XLES_UPDRAFT_ThRv (:,NLES_CURRENT_TCOUNT)    )
+    !
+    IF (LUSERC) &
+    CALL LES_FLUX_ll ( XTHL_ANOM, ZRV_ANOM,                         &
+                       GUPDRAFT_MASK,                               &
+                       XLES_UPDRAFT_ThlRv(:,NLES_CURRENT_TCOUNT)    )
+
+    CALL LES_FLUX_ll ( ZTHV_ANOM, ZRV_ANOM,                         &
+                       GUPDRAFT_MASK,                               &
+                       XLES_UPDRAFT_ThvRv(:,NLES_CURRENT_TCOUNT)    )
+  END IF
+!
+!* cloud water mixing ratio flux
+!
+  IF (LUSERC) THEN
+    CALL LES_FLUX_ll ( XW_ANOM, ZRC_ANOM,                           &
+                       GUPDRAFT_MASK,                               &
+                       XLES_UPDRAFT_WRc(:,NLES_CURRENT_TCOUNT)      )
+    !
+    CALL LES_FLUX_ll ( ZRC_ANOM, ZRC_ANOM,                          &
+                       GUPDRAFT_MASK,                               &
+                       XLES_UPDRAFT_Rc2(:,NLES_CURRENT_TCOUNT)      )
+    !
+    CALL LES_FLUX_ll ( ZTH_ANOM, ZRC_ANOM,                          &
+                       GUPDRAFT_MASK,                               &
+                       XLES_UPDRAFT_ThRc (:,NLES_CURRENT_TCOUNT)    )
+    !
+    CALL LES_FLUX_ll ( XTHL_ANOM, ZRC_ANOM,                         &
+                       GUPDRAFT_MASK,                               &
+                       XLES_UPDRAFT_ThlRc(:,NLES_CURRENT_TCOUNT)    )
+    !
+    CALL LES_FLUX_ll ( ZTHV_ANOM, ZRC_ANOM,                         &
+                       GUPDRAFT_MASK,                               &
+                       XLES_UPDRAFT_ThvRc(:,NLES_CURRENT_TCOUNT)    )
+  END IF
+!
+!* cloud ice mixing ratio flux
+!
+  IF (LUSERI) THEN
+    CALL LES_FLUX_ll ( XW_ANOM, ZRI_ANOM,                           &
+                       GUPDRAFT_MASK,                               &
+                       XLES_UPDRAFT_WRi(:,NLES_CURRENT_TCOUNT)      )
+    !
+    CALL LES_FLUX_ll ( ZRI_ANOM, ZRI_ANOM,                          &
+                       GUPDRAFT_MASK,                               &
+                       XLES_UPDRAFT_Ri2(:,NLES_CURRENT_TCOUNT)      )
+    !
+    CALL LES_FLUX_ll ( ZTH_ANOM, ZRI_ANOM,                          &
+                       GUPDRAFT_MASK,                               &
+                       XLES_UPDRAFT_ThRi (:,NLES_CURRENT_TCOUNT)    )
+    !
+    CALL LES_FLUX_ll ( XTHL_ANOM, ZRI_ANOM,                         &
+                       GUPDRAFT_MASK,                               &
+                       XLES_UPDRAFT_ThlRi(:,NLES_CURRENT_TCOUNT)    )
+    !
+    CALL LES_FLUX_ll ( ZTHV_ANOM, ZRI_ANOM,                         &
+                       GUPDRAFT_MASK,                               &
+                       XLES_UPDRAFT_ThvRi(:,NLES_CURRENT_TCOUNT)    )
+  END IF
+!
+!* scalar variables flux
+!
+  DO JSV=1,NSV
+    CALL LES_FLUX_ll ( XW_ANOM, XSV_ANOM(:,:,:,JSV),                    &
+                       GUPDRAFT_MASK,                                   &
+                       XLES_UPDRAFT_WSv(:,NLES_CURRENT_TCOUNT,JSV)      )
+    !
+    CALL LES_FLUX_ll ( XSV_ANOM(:,:,:,JSV), XSV_ANOM(:,:,:,JSV),        &
+                       GUPDRAFT_MASK,                                   &
+                       XLES_UPDRAFT_Sv2(:,NLES_CURRENT_TCOUNT,JSV)      )
+    !
+    CALL LES_FLUX_ll ( ZTH_ANOM, XSV_ANOM(:,:,:,JSV),                   &
+                       GUPDRAFT_MASK,                                   &
+                       XLES_UPDRAFT_ThSv(:,NLES_CURRENT_TCOUNT,JSV)     )
+    !
+    IF (LUSERC) &
+    CALL LES_FLUX_ll ( XTHL_ANOM, XSV_ANOM(:,:,:,JSV),                  &
+                       GUPDRAFT_MASK,                                   &
+                       XLES_UPDRAFT_ThlSv(:,NLES_CURRENT_TCOUNT,JSV)    )
+    !
+    IF (LUSERV) &
+    CALL LES_FLUX_ll ( ZTHV_ANOM, XSV_ANOM(:,:,:,JSV),                  &
+                       GUPDRAFT_MASK,                                   &
+                       XLES_UPDRAFT_ThvSv(:,NLES_CURRENT_TCOUNT,JSV)    )
+  END DO
+!
+END IF
+!
+!-------------------------------------------------------------------------------
+!
+!       4.   Downdraft diagnostics
+!            ---------------------
+!
+IF (LLES_DOWNDRAFT) THEN
+!
+  DO JK=1,NLES_K
+    GDOWNDRAFT_MASK(:,:,JK) = (XW_ANOM(:,:,JK) <= 0.) .AND. LLES_CURRENT_CART_MASK(:,:,JK)
+  END DO
+!
+!
+!       4.1  Downdraft fraction
+!            ------------------
+!
+  ZDOWNDRAFT(:,:,:) = 0.
+  WHERE (GDOWNDRAFT_MASK(:,:,:))
+    ZDOWNDRAFT(:,:,:) = 1.
+  END WHERE
+!
+  CALL LES_MEAN_ll ( ZDOWNDRAFT, OMASK,                        &
+                     XLES_DOWNDRAFT(:,NLES_CURRENT_TCOUNT)     )
+!
+!
+!       4.2  Downdraft mean quantities
+!            -------------------------
+!
+!* vertical wind velocity
+!
+  CALL LES_MEAN_ll ( ZW_LES, GDOWNDRAFT_MASK,                    &
+                     XLES_DOWNDRAFT_W(:,NLES_CURRENT_TCOUNT)     )
+!
+!* potential temperature
+!
+  CALL LES_MEAN_ll ( ZTH_LES, GDOWNDRAFT_MASK,                   &
+                     XLES_DOWNDRAFT_Th(:,NLES_CURRENT_TCOUNT)    )
+!
+!* liquid potential temperature
+!
+  IF (LUSERC) &
+  CALL LES_MEAN_ll ( ZTHL_LES, GDOWNDRAFT_MASK,                   &
+                     XLES_DOWNDRAFT_Thl(:,NLES_CURRENT_TCOUNT)    )
+!
+!* virtual potential temperature
+!
+  IF (LUSERV) &
+  CALL LES_MEAN_ll ( ZTHV_LES, GDOWNDRAFT_MASK,                   &
+                     XLES_DOWNDRAFT_Thv(:,NLES_CURRENT_TCOUNT)    )
+!
+!* vapor mixing ratio
+!
+  IF (LUSERV) &
+  CALL LES_MEAN_ll ( ZRV_LES, GDOWNDRAFT_MASK,                    &
+                     XLES_DOWNDRAFT_Rv(:,NLES_CURRENT_TCOUNT)     )
+!
+!* cloud water mixing ratio
+!
+  IF (LUSERC) &
+  CALL LES_MEAN_ll ( ZRC_LES, GDOWNDRAFT_MASK,                    &
+                     XLES_DOWNDRAFT_Rc(:,NLES_CURRENT_TCOUNT)     )
+!
+!* rain mixing ratio
+!
+  IF (LUSERR) &
+  CALL LES_MEAN_ll ( ZRR_LES, GDOWNDRAFT_MASK,                    &
+                     XLES_DOWNDRAFT_Rr(:,NLES_CURRENT_TCOUNT)     )
+!
+!* cloud ice mixing ratio
+!
+  IF (LUSERI) &
+  CALL LES_MEAN_ll ( ZRI_LES, GDOWNDRAFT_MASK,                    &
+                     XLES_DOWNDRAFT_Ri(:,NLES_CURRENT_TCOUNT)     )
+!
+!* snow mixing ratio
+!
+  IF (LUSERS) &
+  CALL LES_MEAN_ll ( ZRS_LES, GDOWNDRAFT_MASK,                    &
+                     XLES_DOWNDRAFT_Rs(:,NLES_CURRENT_TCOUNT)     )
+!
+!* graupel mixing ratio
+!
+  IF (LUSERG) &
+  CALL LES_MEAN_ll ( ZRG_LES, GDOWNDRAFT_MASK,                    &
+                     XLES_DOWNDRAFT_Rg(:,NLES_CURRENT_TCOUNT)     )
+!
+!* hail mixing ratio
+!
+  IF (LUSERH) &
+  CALL LES_MEAN_ll ( ZRG_LES, GDOWNDRAFT_MASK,                    &
+                     XLES_DOWNDRAFT_Rh(:,NLES_CURRENT_TCOUNT)     )
+!
+!* scalar variables
+!
+  DO JSV=1,NSV
+    CALL LES_MEAN_ll ( ZSV_LES(:,:,:,JSV), GDOWNDRAFT_MASK,            &
+                       XLES_DOWNDRAFT_Sv(:,NLES_CURRENT_TCOUNT,JSV)    )
+  END DO
+!
+!* subgrid turbulent kinetic energy
+!
+  CALL LES_MEAN_ll ( ZTKE_LES, GDOWNDRAFT_MASK,                    &
+                     XLES_DOWNDRAFT_Tke(:,NLES_CURRENT_TCOUNT)     )
+!
+!
+!       4.3  Downdraft resolved quantities
+!            -----------------------------
+!
+!* resolved turbulent kinetic energy
+!
+  CALL LES_FLUX_ll ( XU_ANOM, XU_ANOM,                             &
+                     GDOWNDRAFT_MASK,                              &
+                     ZLES_DOWNDRAFT_U2(:)                          )
+
+  CALL LES_FLUX_ll ( XV_ANOM, XV_ANOM,                             &
+                     GDOWNDRAFT_MASK,                              &
+                     ZLES_DOWNDRAFT_V2(:)                          )
+
+  CALL LES_FLUX_ll ( XW_ANOM, XW_ANOM,                             &
+                     GDOWNDRAFT_MASK,                              &
+                     ZLES_DOWNDRAFT_W2(:)                          )
+
+  XLES_DOWNDRAFT_Ke(:,NLES_CURRENT_TCOUNT)  = 0.5 * (  ZLES_DOWNDRAFT_U2(:) &
+                                                     + ZLES_DOWNDRAFT_V2(:) &
+                                                     + ZLES_DOWNDRAFT_W2(:) )
+!
+!* vertical potential temperature flux
+!
+  CALL LES_FLUX_ll ( XW_ANOM, ZTH_ANOM,                            &
+                     GDOWNDRAFT_MASK,                              &
+                     XLES_DOWNDRAFT_WTh(:,NLES_CURRENT_TCOUNT)     )
+!
+!* vertical liquid potential temperature flux
+!
+  IF (LUSERC) &
+  CALL LES_FLUX_ll ( XW_ANOM, XTHL_ANOM,                            &
+                     GDOWNDRAFT_MASK,                               &
+                     XLES_DOWNDRAFT_WThl(:,NLES_CURRENT_TCOUNT)     )
+!
+!* vertical virtual potential temperature flux
+!
+  IF (LUSERV) &
+  CALL LES_FLUX_ll ( XW_ANOM, ZTHV_ANOM,                            &
+                     GDOWNDRAFT_MASK,                               &
+                     XLES_DOWNDRAFT_WThv(:,NLES_CURRENT_TCOUNT)     )
+!
+!* potential temperature variance
+!
+  CALL LES_FLUX_ll ( ZTH_ANOM, ZTH_ANOM,                            &
+                     GDOWNDRAFT_MASK,                               &
+                     XLES_DOWNDRAFT_Th2(:,NLES_CURRENT_TCOUNT)      )
+!
+!* liquid potential temperature variance
+!
+  IF (LUSERC) &
+  CALL LES_FLUX_ll ( XTHL_ANOM, XTHL_ANOM,                           &
+                     GDOWNDRAFT_MASK,                                &
+                     XLES_DOWNDRAFT_Thl2(:,NLES_CURRENT_TCOUNT)      )
+!
+!* potential temperature - virtual potential temperature covariance
+!
+  IF (LUSERV) &
+  CALL LES_FLUX_ll ( ZTH_ANOM, ZTHV_ANOM,                            &
+                     GDOWNDRAFT_MASK,                                &
+                     XLES_DOWNDRAFT_ThThv (:,NLES_CURRENT_TCOUNT)    )
+!
+!* liquid potential temperature - virtual potential temperature covariance
+!
+  IF (LUSERC) &
+  CALL LES_FLUX_ll ( XTHL_ANOM, ZTHV_ANOM,                           &
+                     GDOWNDRAFT_MASK,                                &
+                     XLES_DOWNDRAFT_ThlThv(:,NLES_CURRENT_TCOUNT)    )
+!
+!
+!* water vapor mixing ratio flux, variance and correlations
+!
+  IF (LUSERV) THEN
+    CALL LES_FLUX_ll ( XW_ANOM, ZRV_ANOM,                             &
+                       GDOWNDRAFT_MASK,                               &
+                       XLES_DOWNDRAFT_WRv(:,NLES_CURRENT_TCOUNT)      )
+    !
+    CALL LES_FLUX_ll ( ZRV_ANOM, ZRV_ANOM,                            &
+                       GDOWNDRAFT_MASK,                               &
+                       XLES_DOWNDRAFT_Rv2(:,NLES_CURRENT_TCOUNT)      )
+    !
+    CALL LES_FLUX_ll ( ZTH_ANOM, ZRV_ANOM,                            &
+                       GDOWNDRAFT_MASK,                               &
+                       XLES_DOWNDRAFT_ThRv (:,NLES_CURRENT_TCOUNT)    )
+    !
+    CALL LES_FLUX_ll ( ZTHV_ANOM, ZRV_ANOM,                           &
+                       GDOWNDRAFT_MASK,                               &
+                       XLES_DOWNDRAFT_ThvRv(:,NLES_CURRENT_TCOUNT)    )
+    !
+    IF (LUSERC) &
+    CALL LES_FLUX_ll ( XTHL_ANOM, ZRV_ANOM,                           &
+                       GDOWNDRAFT_MASK,                               &
+                       XLES_DOWNDRAFT_ThlRv(:,NLES_CURRENT_TCOUNT)    )
+  END IF
+!
+!* cloud water mixing ratio flux
+!
+  IF (LUSERC) THEN
+    CALL LES_FLUX_ll ( XW_ANOM, ZRC_ANOM,                             &
+                       GDOWNDRAFT_MASK,                               &
+                       XLES_DOWNDRAFT_WRc(:,NLES_CURRENT_TCOUNT)      )
+    !
+    CALL LES_FLUX_ll ( ZRC_ANOM, ZRC_ANOM,                            &
+                       GDOWNDRAFT_MASK,                               &
+                       XLES_DOWNDRAFT_Rc2(:,NLES_CURRENT_TCOUNT)      )
+    !
+    CALL LES_FLUX_ll ( ZTH_ANOM, ZRC_ANOM,                            &
+                       GDOWNDRAFT_MASK,                               &
+                       XLES_DOWNDRAFT_ThRc (:,NLES_CURRENT_TCOUNT)    )
+    !
+    CALL LES_FLUX_ll ( ZTHV_ANOM, ZRC_ANOM,                           &
+                       GDOWNDRAFT_MASK,                               &
+                       XLES_DOWNDRAFT_ThvRc(:,NLES_CURRENT_TCOUNT)    )
+    !
+    CALL LES_FLUX_ll ( XTHL_ANOM, ZRC_ANOM,                           &
+                       GDOWNDRAFT_MASK,                               &
+                       XLES_DOWNDRAFT_ThlRc(:,NLES_CURRENT_TCOUNT)    )
+  END IF
+!
+!* cloud ice mixing ratio flux
+!
+  IF (LUSERI) THEN
+    CALL LES_FLUX_ll ( XW_ANOM, ZRI_ANOM,                             &
+                       GDOWNDRAFT_MASK,                               &
+                       XLES_DOWNDRAFT_WRi(:,NLES_CURRENT_TCOUNT)      )
+    !
+    CALL LES_FLUX_ll ( ZRI_ANOM, ZRI_ANOM,                            &
+                       GDOWNDRAFT_MASK,                               &
+                       XLES_DOWNDRAFT_Ri2(:,NLES_CURRENT_TCOUNT)      )
+    !
+    CALL LES_FLUX_ll ( ZTH_ANOM, ZRI_ANOM,                            &
+                       GDOWNDRAFT_MASK,                               &
+                       XLES_DOWNDRAFT_ThRi (:,NLES_CURRENT_TCOUNT)    )
+    !
+    CALL LES_FLUX_ll ( ZTHV_ANOM, ZRI_ANOM,                           &
+                       GDOWNDRAFT_MASK,                               &
+                       XLES_DOWNDRAFT_ThvRi(:,NLES_CURRENT_TCOUNT)    )
+    !
+    CALL LES_FLUX_ll ( XTHL_ANOM, ZRI_ANOM,                           &
+                       GDOWNDRAFT_MASK,                               &
+                       XLES_DOWNDRAFT_ThlRi(:,NLES_CURRENT_TCOUNT)    )
+  END IF
+!
+!* scalar variables flux
+!
+  DO JSV=1,NSV
+    CALL LES_FLUX_ll ( XW_ANOM, XSV_ANOM(:,:,:,JSV),                      &
+                       GDOWNDRAFT_MASK,                                   &
+                       XLES_DOWNDRAFT_WSv(:,NLES_CURRENT_TCOUNT,JSV)      )
+    !
+    CALL LES_FLUX_ll ( XSV_ANOM(:,:,:,JSV), XSV_ANOM(:,:,:,JSV),          &
+                       GDOWNDRAFT_MASK,                                   &
+                       XLES_DOWNDRAFT_Sv2(:,NLES_CURRENT_TCOUNT,JSV)      )
+    !
+    CALL LES_FLUX_ll ( ZTH_ANOM, XSV_ANOM(:,:,:,JSV),                     &
+                       GDOWNDRAFT_MASK,                                   &
+                       XLES_DOWNDRAFT_ThSv(:,NLES_CURRENT_TCOUNT,JSV)     )
+    !
+    IF (LUSERC) &
+    CALL LES_FLUX_ll ( XTHL_ANOM, XSV_ANOM(:,:,:,JSV),                    &
+                       GDOWNDRAFT_MASK,                                   &
+                       XLES_DOWNDRAFT_ThlSv(:,NLES_CURRENT_TCOUNT,JSV)    )
+    !
+    IF (LUSERV) &
+    CALL LES_FLUX_ll ( ZTHV_ANOM, XSV_ANOM(:,:,:,JSV),                    &
+                       GDOWNDRAFT_MASK,                                   &
+                       XLES_DOWNDRAFT_ThvSv(:,NLES_CURRENT_TCOUNT,JSV)    )
+  END DO
+!
+END IF
+!
+!-------------------------------------------------------------------------------
+!
+!       5.   surface or 2D variables (only for the cartesian mask)
+!            -----------------------
+!
+!* surface flux of temperature Qo
+!
+CALL LES_MEAN_MPROC ( XLES_Q0   (NLES_CURRENT_TCOUNT), IAVG_PTS(1), IUND_PTS(1) )
+!
+!* surface flux of water vapor Eo
+!
+CALL LES_MEAN_MPROC ( XLES_E0   (NLES_CURRENT_TCOUNT), IAVG_PTS(1), IUND_PTS(1) )
+!
+!* surface flux for scalar variables
+!
+DO JSV=1,NSV
+  CALL LES_MEAN_MPROC ( XLES_SV0  (NLES_CURRENT_TCOUNT,JSV), IAVG_PTS(1), IUND_PTS(1) )
+END DO
+!
+!* surface flux of U wind component
+!
+CALL LES_MEAN_MPROC ( XLES_UW0  (NLES_CURRENT_TCOUNT), IAVG_PTS(1), IUND_PTS(1) )
+!
+!* surface flux of V wind component
+!
+CALL LES_MEAN_MPROC ( XLES_VW0  (NLES_CURRENT_TCOUNT), IAVG_PTS(1), IUND_PTS(1) )
+!
+!* friction velocity u*
+!
+!* average of local u*
+!!CALL LES_MEAN_MPROC ( XLES_USTAR(NLES_CURRENT_TCOUNT), IAVG_PTS(1), IUND_PTS(1) )
+!* or true global u*
+XLES_USTAR(NLES_CURRENT_TCOUNT) = SQRT(SQRT(XLES_UW0(NLES_CURRENT_TCOUNT)**2  &
+                                           +XLES_VW0(NLES_CURRENT_TCOUNT)**2 ))
+!
+!* Boundary layer height
+!
+IF (CBL_HEIGHT_DEF=='WTV') THEN
+!
+!* level where temperature flux is minimum
+!
+ALLOCATE(ZWORK(SIZE(XLES_SUBGRID_WTHVMF(:,NLES_CURRENT_TCOUNT,IMASK),1)))
+ZWORK=XLES_SUBGRID_WTHVMF(:,NLES_CURRENT_TCOUNT,IMASK)
+WHERE(ZWORK==XUNDEF) ZWORK=0.
+
+  IF (LUSERC) THEN
+    IKMIN_FLUX = MINLOC(  XLES_RESOLVED_WThv(:,NLES_CURRENT_TCOUNT,1)  &
+                        + XLES_SUBGRID_WThl (:,NLES_CURRENT_TCOUNT,1)  &
+                        + ZWORK                                        & ! flux if EDKF   
+      + (XRV/XRD - 1.) *( XLES_SUBGRID_WRt  (:,NLES_CURRENT_TCOUNT,1)  &
+                         -XLES_SUBGRID_WRc  (:,NLES_CURRENT_TCOUNT,1)) )
+  ELSE IF (LUSERV) THEN
+    IKMIN_FLUX = MINLOC(  XLES_RESOLVED_WThv(:,NLES_CURRENT_TCOUNT,1) &
+                        + ZWORK                                       & ! flux if EDKF 
+                        + XLES_SUBGRID_WThl (:,NLES_CURRENT_TCOUNT,1) &
+      + (XRV/XRD - 1.) *  XLES_SUBGRID_WRt  (:,NLES_CURRENT_TCOUNT,1) )
+  ELSE
+    IKMIN_FLUX = MINLOC(  XLES_RESOLVED_WTh(:,NLES_CURRENT_TCOUNT,1) &
+                        + ZWORK                                      & ! flux if EDKF
+                        + XLES_SUBGRID_WThl(:,NLES_CURRENT_TCOUNT,1) )
+  END IF
+DEALLOCATE(ZWORK)
+!
+!* boundary layer height
+!
+  XLES_BL_HEIGHT(NLES_CURRENT_TCOUNT) = XLES_Z(IKMIN_FLUX(1)) - XLES_ZS
+!
+ELSE IF (CBL_HEIGHT_DEF=='DTH') THEN
+  IKMAX_TH=MAXLOC( ZLES_MEAN_DTHDZ(:)) 
+  XLES_BL_HEIGHT(NLES_CURRENT_TCOUNT) = XLES_Z(IKMAX_TH(1)) - XLES_ZS
+!  
+ELSE IF (CBL_HEIGHT_DEF=='KE ') THEN
+
+  XLES_BL_HEIGHT(NLES_CURRENT_TCOUNT) = XLES_Z(NLES_K) - XLES_ZS
+!
+!* total Turbulent Kinetic Energy
+!
+  ZKE_TOT(:) = 0.
+!
+  ZKE_TOT(:) = ZKE_TOT(:) + XLES_SUBGRID_TKE   (:,NLES_CURRENT_TCOUNT,1)
+!
+  IF (CTURBLEN/='BL89' .AND. CTURBLEN/='RM17' .AND. LLES_RESOLVED) &
+  ZKE_TOT(:) = ZKE_TOT(:) + XLES_RESOLVED_KE(:,NLES_CURRENT_TCOUNT,1)
+!
+  ZINT_KE_TOT = 0.
+!
+!* integration of total kinetic energy on boundary layer depth
+!
+  ZINT_KE_TOT = ZINT_KE_TOT +XLES_Z(1)*ZKE_TOT(1)
+  DO JK=1,NLES_K-1
+    ZINT_KE_TOT = ZINT_KE_TOT + (XLES_Z(JK+1)-XLES_Z(JK))                     &
+                              * 0.5 *( ZKE_TOT(JK+1) + ZKE_TOT(JK) )
+!
+!* test of total kinetic energy smaller than 5% of the averaged value below
+!
+    IF ( ZKE_TOT(JK+1) < 0.05 * ZINT_KE_TOT / (XLES_Z(JK+1)-XLES_Z(1)) ) THEN
+      XLES_BL_HEIGHT(NLES_CURRENT_TCOUNT) = XLES_Z(JK) - XLES_ZS
+      EXIT
+    END IF
+!
+  END DO
+!
+ELSE IF (CBL_HEIGHT_DEF=='TKE') THEN
+
+  XLES_BL_HEIGHT(NLES_CURRENT_TCOUNT) = XLES_Z(NLES_K) - XLES_ZS
+!
+!* subgrid Turbulent Kinetic Energy
+!
+  ZKE_TOT(:) = XLES_SUBGRID_TKE   (:,NLES_CURRENT_TCOUNT,1)
+!
+  ZINT_KE_TOT = 0.
+!
+!* integration of subgrid kinetic energy on boundary layer depth
+!
+  DO JK=1,NLES_K-1
+    ZINT_KE_TOT = ZINT_KE_TOT + (XLES_Z(JK+1)-XLES_Z(JK))                     &
+                              * 0.5 *( ZKE_TOT(JK+1) + ZKE_TOT(JK) )
+!
+!* test of subgrid kinetic energy smaller than 0.1% of the averaged value below
+!
+    IF ( ZKE_TOT(JK+1) < 0.001 * ZINT_KE_TOT / (XLES_Z(JK+1)-XLES_Z(1)) ) THEN
+      XLES_BL_HEIGHT(NLES_CURRENT_TCOUNT) = XLES_Z(JK) - XLES_ZS
+      EXIT
+    END IF
+  END DO
+ELSE IF (CBL_HEIGHT_DEF=='FRI') THEN
+  ZFRIC_LES = SQRT( ( XLES_SUBGRID_WU (:,NLES_CURRENT_TCOUNT,1)      &
+                     +XLES_RESOLVED_WU(:,NLES_CURRENT_TCOUNT,1))**2  &
+                   +( XLES_SUBGRID_WV (:,NLES_CURRENT_TCOUNT,1)      &
+                     +XLES_RESOLVED_WV(:,NLES_CURRENT_TCOUNT,1))**2 )
+  ZFRIC_SURF = XLES_USTAR(NLES_CURRENT_TCOUNT)**2
+  XLES_BL_HEIGHT(NLES_CURRENT_TCOUNT) = BL_DEPTH_DIAG(IKB,IKE,ZFRIC_SURF, XLES_ZS, &
+                                                      ZFRIC_LES,  XLES_Z,  &
+                                                      XFTOP_O_FSURF        )
+END IF
+!
+!
+!* integration of total kinetic energy on boundary layer depth
+!
+XLES_INT_TKE(NLES_CURRENT_TCOUNT)=ZINT_KE_TOT
+    !* integration of tke 
+    ZTKET_LES(:,:)  = 0.
+      DO JK=1,NLES_K-1
+      ZKE_LES(:,:,JK)=0.5*(XU_ANOM(:,:,JK)*XU_ANOM(:,:,JK)+&
+      XV_ANOM(:,:,JK)*XV_ANOM(:,:,JK)+XW_ANOM(:,:,JK)*XW_ANOM(:,:,JK))
+
+    ZTKET_LES(:,:) = ZTKET_LES(:,:) + (ZZZ_LES(:,:,JK+1)-ZZZ_LES(:,:,JK))      &
+                      * (ZTKE_LES(:,:,JK)+ZKE_LES(:,:,JK)) 
+      END DO
+  CALL LES_MEAN_ll ( ZTKET_LES, LLES_CURRENT_CART_MASK(:,:,1),               &
+                    XLES_INT_TKE(NLES_CURRENT_TCOUNT)     )    
+!
+!* convective velocity
+!
+XLES_WSTAR(NLES_CURRENT_TCOUNT) = 0.
+!
+IF (               XLES_Q0(NLES_CURRENT_TCOUNT)                  &
+    + (XRV/XRD-1.)*XLES_E0(NLES_CURRENT_TCOUNT) >0.) THEN
+  IF (LUSERV) THEN
+    XLES_WSTAR(NLES_CURRENT_TCOUNT) =                            &
+     ( XG / XLES_MEAN_Thv (1,NLES_CURRENT_TCOUNT,1)              &
+          * (                    XLES_Q0( NLES_CURRENT_TCOUNT )  &
+              + (XRV/XRD - 1.) * XLES_E0( NLES_CURRENT_TCOUNT )) &
+          * XLES_BL_HEIGHT(  NLES_CURRENT_TCOUNT  )              &
+     ) ** (1./3.)
+  ELSE
+    XLES_WSTAR(NLES_CURRENT_TCOUNT) =                            &
+     ( XG / XLES_MEAN_Th  (1,NLES_CURRENT_TCOUNT,1)              &
+          * (                    XLES_Q0( NLES_CURRENT_TCOUNT )  &
+              + (XRV/XRD - 1.) * XLES_E0( NLES_CURRENT_TCOUNT )) &
+          * XLES_BL_HEIGHT( NLES_CURRENT_TCOUNT  )               &
+     ) ** (1./3.)
+  END IF
+END IF
+!
+!* cloud base height
+ IF (LUSERC) THEN
+  ZINT_RHOKE =0.
+  JJ=1
+  DO JI=1,NLES_K
+  IF ((ZINT_RHOKE .EQ. 0) .AND.  &
+      (XLES_MEAN_RC(JI,NLES_CURRENT_TCOUNT,1) .GT. 1.E-6)) THEN
+     ZINT_RHOKE=1.
+     JJ=JI 
+   END IF
+  END DO
+  XLES_ZCB(NLES_CURRENT_TCOUNT)= XLES_Z(JJ)-XLES_ZS
+ ENDIF
+!
+!* height of max of cf
+ IF (LUSERC) THEN
+  IKMAX_CF= MAXLOC(  XLES_MEAN_INDCf(:,NLES_CURRENT_TCOUNT,1))
+  XLES_ZMAXCF(NLES_CURRENT_TCOUNT) = XLES_Z(IKMAX_CF(1)) - XLES_ZS
+  IKMAX_CF= MAXLOC(  XLES_MEAN_INDCf2(:,NLES_CURRENT_TCOUNT,1))
+  XLES_ZMAXCF2(NLES_CURRENT_TCOUNT) = XLES_Z(IKMAX_CF(1)) - XLES_ZS
+ ENDIF
+!
+!* Monin-Obukhov length
+!
+XLES_MO_LENGTH(NLES_CURRENT_TCOUNT) = 0.
+!
+IF (LUSERV) THEN
+  IF ( XLES_Q0(NLES_CURRENT_TCOUNT)+(XRV/XRD-1.)*XLES_E0(NLES_CURRENT_TCOUNT) /=0. )&
+  XLES_MO_LENGTH(NLES_CURRENT_TCOUNT) = (- (XLES_USTAR(NLES_CURRENT_TCOUNT))**3)  &
+                    / (XKARMAN*(  XLES_Q0(NLES_CURRENT_TCOUNT)                    &
+                                +(XRV/XRD-1.)*XLES_E0(NLES_CURRENT_TCOUNT))       &
+                              *XG/XLES_MEAN_Thv(1,NLES_CURRENT_TCOUNT,1) )
+ELSE
+   IF ( XLES_Q0(NLES_CURRENT_TCOUNT) /=0. )                                       &
+   XLES_MO_LENGTH(NLES_CURRENT_TCOUNT) = (- (XLES_USTAR(NLES_CURRENT_TCOUNT))**3) &
+                    / (XKARMAN*XLES_Q0(NLES_CURRENT_TCOUNT)                       &
+                              *XG/XLES_MEAN_Th(1,NLES_CURRENT_TCOUNT,1) )
+END IF
+!
+!-------------------------------------------------------------------------------
+!
+!       6.   correlations along x and y axes
+!            -------------------------------
+!
+!*  u * u
+!
+DO JK=1,NSPECTRA_K
+  CALL LES_HOR_CORR( ZU_SPEC(:,:,JK), ZU_SPEC(:,:,JK),          &
+                     CLES_LBCX , CLES_LBCY,                     &
+                     XCORRi_UU(:,JK,NLES_CURRENT_TCOUNT),       &
+                     XCORRj_UU(:,JK,NLES_CURRENT_TCOUNT)        )
+END DO
+!
+!*  v * v
+!
+DO JK=1,NSPECTRA_K
+  CALL LES_HOR_CORR( ZV_SPEC(:,:,JK), ZV_SPEC(:,:,JK),          &
+                     CLES_LBCX , CLES_LBCY,                     &
+                     XCORRi_VV(:,JK,NLES_CURRENT_TCOUNT),       &
+                     XCORRj_VV(:,JK,NLES_CURRENT_TCOUNT)        )
+END DO
+!
+!*  u * v
+!
+DO JK=1,NSPECTRA_K
+  CALL LES_HOR_CORR( ZU_SPEC(:,:,JK), ZV_SPEC(:,:,JK),          &
+                     CLES_LBCX , CLES_LBCY,                     &
+                     XCORRi_UV(:,JK,NLES_CURRENT_TCOUNT),       &
+                     XCORRj_UV(:,JK,NLES_CURRENT_TCOUNT)        )
+END DO
+!
+!*  w * u
+!
+DO JK=1,NSPECTRA_K
+  CALL LES_HOR_CORR( ZW_SPEC(:,:,JK), ZU_SPEC(:,:,JK),          &
+                     CLES_LBCX , CLES_LBCY,                     &
+                     XCORRi_WU(:,JK,NLES_CURRENT_TCOUNT),       &
+                     XCORRj_WU(:,JK,NLES_CURRENT_TCOUNT)        )
+END DO
+!
+!*  w * v
+!
+DO JK=1,NSPECTRA_K
+  CALL LES_HOR_CORR( ZW_SPEC(:,:,JK), ZV_SPEC(:,:,JK),          &
+                     CLES_LBCX , CLES_LBCY,                     &
+                     XCORRi_WV(:,JK,NLES_CURRENT_TCOUNT),       &
+                     XCORRj_WV(:,JK,NLES_CURRENT_TCOUNT)        )
+END DO
+!
+!*  w * w
+!
+DO JK=1,NSPECTRA_K
+  CALL LES_HOR_CORR( ZW_SPEC(:,:,JK), ZW_SPEC(:,:,JK),          &
+                     CLES_LBCX , CLES_LBCY,                     &
+                     XCORRi_WW(:,JK,NLES_CURRENT_TCOUNT),       &
+                     XCORRj_WW(:,JK,NLES_CURRENT_TCOUNT)        )
+END DO
+!
+!*  w * th
+!
+DO JK=1,NSPECTRA_K
+  CALL LES_HOR_CORR( ZW_SPEC(:,:,JK), ZTH_SPEC(:,:,JK),         &
+                     CLES_LBCX , CLES_LBCY,                     &
+                     XCORRi_WTh(:,JK,NLES_CURRENT_TCOUNT),      &
+                     XCORRj_WTh(:,JK,NLES_CURRENT_TCOUNT)       )
+END DO
+!
+!*  w * thl
+!
+DO JK=1,NSPECTRA_K
+  IF (LUSERC) &
+  CALL LES_HOR_CORR( ZW_SPEC(:,:,JK), ZTHL_SPEC(:,:,JK),         &
+                     CLES_LBCX , CLES_LBCY,                      &
+                     XCORRi_WThl(:,JK,NLES_CURRENT_TCOUNT),      &
+                     XCORRj_WThl(:,JK,NLES_CURRENT_TCOUNT)       )
+END DO
+!
+!*  th * th
+!
+DO JK=1,NSPECTRA_K
+  CALL LES_HOR_CORR( ZTH_SPEC(:,:,JK), ZTH_SPEC(:,:,JK),          &
+                     CLES_LBCX , CLES_LBCY,                       &
+                     XCORRi_ThTh(:,JK,NLES_CURRENT_TCOUNT),       &
+                     XCORRj_ThTh(:,JK,NLES_CURRENT_TCOUNT)        )
+END DO
+!
+!*  thl * thl
+!
+DO JK=1,NSPECTRA_K
+  IF (LUSERC) &
+  CALL LES_HOR_CORR( ZTHL_SPEC(:,:,JK), ZTHL_SPEC(:,:,JK),        &
+                     CLES_LBCX , CLES_LBCY,                       &
+                     XCORRi_ThlThl(:,JK,NLES_CURRENT_TCOUNT),     &
+                     XCORRj_ThlThl(:,JK,NLES_CURRENT_TCOUNT)      )
+END DO
+!
+!* correlations with water vapor
+!
+IF (LUSERV) THEN
+  DO JK=1,NSPECTRA_K
+    CALL LES_HOR_CORR( ZW_SPEC(:,:,JK), ZRV_SPEC(:,:,JK),        &
+                       CLES_LBCX , CLES_LBCY,                    &
+                       XCORRi_WRv(:,JK,NLES_CURRENT_TCOUNT),     &
+                       XCORRj_WRv(:,JK,NLES_CURRENT_TCOUNT)      )
+  END DO
+  !
+  DO JK=1,NSPECTRA_K
+    CALL LES_HOR_CORR( ZTH_SPEC(:,:,JK), ZRV_SPEC(:,:,JK),       &
+                       CLES_LBCX , CLES_LBCY,                    &
+                       XCORRi_ThRv(:,JK,NLES_CURRENT_TCOUNT),    &
+                       XCORRj_ThRv(:,JK,NLES_CURRENT_TCOUNT)     )
+  END DO
+  !
+  DO JK=1,NSPECTRA_K
+    IF (LUSERC) &
+    CALL LES_HOR_CORR( ZTHL_SPEC(:,:,JK), ZRV_SPEC(:,:,JK),      &
+                       CLES_LBCX , CLES_LBCY,                    &
+                       XCORRi_ThlRv(:,JK,NLES_CURRENT_TCOUNT),   &
+                       XCORRj_ThlRv(:,JK,NLES_CURRENT_TCOUNT)    )
+  END DO
+  !
+  DO JK=1,NSPECTRA_K
+    CALL LES_HOR_CORR( ZRV_SPEC(:,:,JK), ZRV_SPEC(:,:,JK),       &
+                       CLES_LBCX , CLES_LBCY,                    &
+                       XCORRi_RvRv(:,JK,NLES_CURRENT_TCOUNT),    &
+                       XCORRj_RvRv(:,JK,NLES_CURRENT_TCOUNT)     )
+  END DO
+END IF
+!
+!
+!* correlations with cloud water
+!
+IF (LUSERC) THEN
+  DO JK=1,NSPECTRA_K
+    CALL LES_HOR_CORR( ZW_SPEC(:,:,JK), ZRC_SPEC(:,:,JK),        &
+                       CLES_LBCX , CLES_LBCY,                    &
+                       XCORRi_WRc(:,JK,NLES_CURRENT_TCOUNT),     &
+                       XCORRj_WRc(:,JK,NLES_CURRENT_TCOUNT)      )
+  END DO
+  !
+  DO JK=1,NSPECTRA_K
+    CALL LES_HOR_CORR( ZTH_SPEC(:,:,JK), ZRC_SPEC(:,:,JK),       &
+                       CLES_LBCX , CLES_LBCY,                    &
+                       XCORRi_ThRc(:,JK,NLES_CURRENT_TCOUNT),    &
+                       XCORRj_ThRc(:,JK,NLES_CURRENT_TCOUNT)     )
+  END DO
+  !
+  DO JK=1,NSPECTRA_K
+    CALL LES_HOR_CORR( ZTHL_SPEC(:,:,JK), ZRC_SPEC(:,:,JK),      &
+                       CLES_LBCX , CLES_LBCY,                    &
+                       XCORRi_ThlRc(:,JK,NLES_CURRENT_TCOUNT),   &
+                       XCORRj_ThlRc(:,JK,NLES_CURRENT_TCOUNT)    )
+  END DO
+  !
+  DO JK=1,NSPECTRA_K
+    CALL LES_HOR_CORR( ZRC_SPEC(:,:,JK), ZRC_SPEC(:,:,JK),       &
+                       CLES_LBCX , CLES_LBCY,                    &
+                       XCORRi_RcRc(:,JK,NLES_CURRENT_TCOUNT),    &
+                       XCORRj_RcRc(:,JK,NLES_CURRENT_TCOUNT)     )
+  END DO
+END IF
+!
+!* correlations with cloud ice
+!
+IF (LUSERI) THEN
+  DO JK=1,NSPECTRA_K
+    CALL LES_HOR_CORR( ZW_SPEC(:,:,JK), ZRI_SPEC(:,:,JK),        &
+                       CLES_LBCX , CLES_LBCY,                    &
+                       XCORRi_WRi(:,JK,NLES_CURRENT_TCOUNT),     &
+                       XCORRj_WRi(:,JK,NLES_CURRENT_TCOUNT)      )
+  END DO
+  !
+  DO JK=1,NSPECTRA_K
+    CALL LES_HOR_CORR( ZTH_SPEC(:,:,JK), ZRI_SPEC(:,:,JK),       &
+                       CLES_LBCX , CLES_LBCY,                    &
+                       XCORRi_ThRi(:,JK,NLES_CURRENT_TCOUNT),    &
+                       XCORRj_ThRi(:,JK,NLES_CURRENT_TCOUNT)     )
+  END DO
+  !
+  DO JK=1,NSPECTRA_K
+    CALL LES_HOR_CORR( ZTHL_SPEC(:,:,JK), ZRI_SPEC(:,:,JK),      &
+                       CLES_LBCX , CLES_LBCY,                    &
+                       XCORRi_ThlRi(:,JK,NLES_CURRENT_TCOUNT),   &
+                       XCORRj_ThlRi(:,JK,NLES_CURRENT_TCOUNT)    )
+  END DO
+  !
+  DO JK=1,NSPECTRA_K
+    CALL LES_HOR_CORR( ZRI_SPEC(:,:,JK), ZRI_SPEC(:,:,JK),       &
+                       CLES_LBCX , CLES_LBCY,                    &
+                       XCORRi_RiRi(:,JK,NLES_CURRENT_TCOUNT),    &
+                       XCORRj_RiRi(:,JK,NLES_CURRENT_TCOUNT)     )
+  END DO
+END IF
+!
+!* correlations with scalar variables
+!
+DO JSV=1,NSV
+  DO JK=1,NSPECTRA_K
+    CALL LES_HOR_CORR( ZW_SPEC(:,:,JK), ZSV_SPEC(:,:,JK,JSV),       &
+                       CLES_LBCX , CLES_LBCY,                       &
+                       XCORRi_WSv(:,JK,NLES_CURRENT_TCOUNT,JSV),    &
+                       XCORRj_WSv(:,JK,NLES_CURRENT_TCOUNT,JSV)     )
+  END DO
+  !
+  DO JK=1,NSPECTRA_K
+    CALL LES_HOR_CORR( ZSV_SPEC(:,:,JK,JSV), ZSV_SPEC(:,:,JK,JSV),  &
+                       CLES_LBCX , CLES_LBCY,                       &
+                       XCORRi_SvSv(:,JK,NLES_CURRENT_TCOUNT,JSV),   &
+                       XCORRj_SvSv(:,JK,NLES_CURRENT_TCOUNT,JSV)    )
+  END DO
+END DO
+!
+!-------------------------------------------------------------------------------
+!
+END SUBROUTINE LES
+!
+!-------------------------------------------------------------------------------
+!
+END SUBROUTINE LES_n
diff --git a/src/mesonh/ext/prep_ideal_case.f90 b/src/mesonh/ext/prep_ideal_case.f90
new file mode 100644
index 000000000..370e21412
--- /dev/null
+++ b/src/mesonh/ext/prep_ideal_case.f90
@@ -0,0 +1,1933 @@
+!MNH_LIC Copyright 1994-2021 CNRS, Meteo-France and Universite Paul Sabatier
+!MNH_LIC This is part of the Meso-NH software governed by the CeCILL-C licence
+!MNH_LIC version 1. See LICENSE, CeCILL-C_V1-en.txt and CeCILL-C_V1-fr.txt
+!MNH_LIC for details. version 1.
+!-----------------------------------------------------------------
+!     #######################
+      PROGRAM PREP_IDEAL_CASE
+!     #######################
+!
+!!****  *PREP_IDEAL_CASE* - program to write an initial FM-file 
+!!
+!!    PURPOSE
+!!    -------
+!       The purpose of this program is to prepare an initial meso-NH file
+!     (LFIFM and DESFM files) filled with some idealized fields.    
+!
+!      ---- The present version can provide two types of fields:
+!
+!      1) CIDEAL = 'CSTN' : 3D fields derived  from a vertical profile with
+!         ---------------   n levels of constant moist Brunt Vaisala frequency
+!             The vertical profile is read in EXPRE file.                 
+!             These fields can be used for model runs 
+!
+!      2) CIDEAL = 'RSOU' : 3D fields derived from a radiosounding.
+!          --------------- 
+!             The radiosounding is read in EXPRE file. 
+!             The following kind of data  is permitted :
+!                  YKIND = 'STANDARD'  :   Zsol, Psol, Tsol, TDsol
+!                                         (Pressure, dd, ff) , 
+!                                         (Pressure, T, Td)
+!                  YKIND = 'PUVTHVMR'  : zsol, Psol, Thvsol, Rsol
+!                                        (Pressure, U, V) , 
+!                                        (Pressure, THv, R)
+!                  YKIND = 'PUVTHVHU'  :  zsol, Psol, Thvsol, Husol
+!                                         (Pressure, U, V) , 
+!                                         (Pressure, THv, Hu)
+!                  YKIND = 'ZUVTHVHU'  :  zsol, Psol, Thvsol, Husol
+!                                         (height, U, V) , 
+!                                         (height, THv, Hu)
+!                  YKIND = 'ZUVTHVMR'  :  zsol, Psol, Thvsol, Rsol
+!                                         (height, U, V) , 
+!                                         (height, THv, R)
+!                  YKIND = 'PUVTHDMR'  : zsol, Psol, Thdsol, Rsol
+!                                         (Pressure, U, V) , 
+!                                         (Pressure, THd, R)
+!                  YKIND = 'PUVTHDHU'  : zsol, Psol, Thdsol, Husol
+!                                         (Pressure, U, V) , 
+!                                         (Pressure, THd, Hu)
+!                  YKIND = 'ZUVTHDMR'  :  zsol, Psol, Thdsol, Rsol
+!                                         (height, U, V) , 
+!                                         (height, THd, R)
+!                  YKIND = 'ZUVTHLMR'  :  zsol, Psol, Thdsol, Rsol
+!                                         (height, U, V) , 
+!                                         (height, THl, Rt)
+!
+!             These fields can be used for model runs 
+!
+!      Cases (1) and (2) can be balanced
+!      (geostrophic, hydrostatic  and anelastic balances) if desired.
+!
+!      ---- The orography can be flat (YZS='FLAT'), but also 
+!      sine-shaped (YZS='SINE') or  bell-shaped (YZS='BELL')
+!
+!      ---- The U(z)  profile given in the RSOU and CSTN cases can
+!      be multiplied (CUFUN="Y*Z") by a function of y (function FUNUY)  
+!      The V(z) profile  given in the RSOU and CSTN cases can
+!      be multiplied (CVFUN="X*Z") by a function of x (function FUNVX). 
+!      If it is not the case, i.e. U(y,z)=U(z) then CUFUN="ZZZ" and 
+!      CVFUN="ZZZ" for V(y,z)=V(z). Instead of these separable forms,
+!      non-separables functions FUNUYZ (CUFUN="Y,Z")  and FUNVXZ (CVFUN="X,Z") 
+!      can be used to specify the wind components.
+!
+!!**  METHOD
+!!    ------
+!!      The directives and data to perform the preparation of the initial FM
+!!    file are stored in EXPRE file. This file is composed  of two parts : 
+!!          - a namelists-format  part which is present in all cases
+!!          - a free-format  part which contains data in cases 
+!!       of discretised orography (CZS='DATA')
+!!       of radiosounding (CIDEAL='RSOU') or Nv=cste  profile (CIDEAL='CSTN')
+!!       of forced version (LFORCING=.TRUE.)
+!!    
+!!
+!!      The following  PREP_IDEAL_CASE program  :
+!!
+!!             - initializes physical constants by calling INI_CST 
+!!
+!!             - sets default values for global variables which will be 
+!!     written  in DESFM file and for variables in EXPRE file (namelists part)
+!!     which will be written in LFIFM file.    
+!!
+!!             - reads the namelists part of EXPRE file which gives 
+!!     informations about the preinitialization to perform,
+!!
+!!             - allocates memory for arrays, 
+!!
+!!             - initializes fields depending on the 
+!!              directives  (CIDEAL in namelist NAM_CONF_PRE) :
+!!  
+!!                * grid variables : 
+!!                  The gridpoints are regularly spaced by XDELTAX, XDELTAY.
+!!               The grid is stretched along the z direction, the mesh varies 
+!!               from XDZGRD near the ground to XDZTOP near the top and the 
+!!               weigthing function is a TANH function characterized by its 
+!!               center and width above and under this center
+!!                  The orography is initialized following the kind of orography
+!!               (YZS in namelist NAM_CONF_PRE) and the degrees of freedom :
+!!                     sine-shape ---> ZHMAX, IEXPX,IEXPY
+!!                     bell-shape ---> ZHMAX, ZAX,ZAY,IIZS,IJZS
+!!                  The horizontal grid variables are initialized following
+!!                the kind of geometry (LCARTESIAN in namelist NAM_CONF_PRE) 
+!!                and the grid parameters XLAT0,XLON0,XBETA in both geometries
+!!                and XRPK,XLONORI,XLATORI  in conformal projection.
+!!                  In the  case of initialization from a radiosounding, the
+!!                date and time is read in free-part of the EXPRE file. In other
+!!                cases year, month and day are set to NUNDEF and time to 0.
+!!
+!!               * prognostic fields : 
+!!
+!!                     U,V,W, Theta and r. are first determined. They are
+!!                multiplied by rhoj after the anelastic reference state 
+!!                computation.
+!!                     For the CSTN and RSOU cases, the determination of 
+!!                Theta and rv is performed  respectively by SET_RSOU
+!!                and by SET_CSTN which call the common routine SET_MASS. 
+!!                These three routines have  the following actions :
+!!          ---   The input vertical profile   is converted in 
+!!                variables (U,V,thetav,r) and  interpolated
+!!                on a mixed grid (with VERT_COORD) as in PREP_REAL_CASE 
+!!          ---   A variation of the u-wind component( x-model axis component) 
+!!                 is possible in y direction, a variation of the v-wind component 
+!!                (y-model axis component) is possible in x direction.
+!!          ---   Thetav could be computed with thermal wind balance
+!!                (LGEOSBAL=.TRUE. with call of SET_GEOSBAL)                 
+!!          ---   The mass fields (theta and r ) and the wind components are 
+!!                then interpolated on the model grid with orography  as in
+!!                PREP_REAL_CASE with the option LSHIFT                
+!!          ---   An  anelastic correction is  applied in PRESSURE_IN_PREP in
+!!                the case of non-vanishing orography.    
+!!            
+!!               * anelastic reference state variables :
+!!
+!!                   1D reference state : 
+!!                     RSOU and CSTN cases : rhorefz and thvrefz are computed 
+!!                         by   SET_REFZ (called by SET_MASS).
+!!                         They are deduced from thetav and r on the model grid
+!!                         without orography.
+!!                   The 3D reference state is  computed by SET_REF   
+!!            
+!!               * The total mass of dry air is computed by TOTAL_DMASS              
+!!
+!!             - writes the DESFM file, 
+!!
+!!             - writes the LFIFM file . 
+!!
+!!    EXTERNAL
+!!    --------
+!!      DEFAULT_DESFM : to set default values for variables which can be 
+!!                      contained in DESFM file
+!!      DEFAULT_EXPRE : to  set default values for other global variables 
+!!                      which can be contained in namelist-part of EXPRE file
+!!      Module MODE_GRIDPROJ : contains conformal projection routines
+!!           SM_GRIDPROJ   : to compute some grid variables, in
+!!                           case of conformal projection.
+!!      Module MODE_GRIDCART : contains cartesian geometry routines
+!!           SM_GRIDCART   : to compute some grid variables, in
+!!                           case of cartesian geometry.
+!!      SET_RSOU      : to initialize mass fields from a radiosounding
+!!      SET_CSTN      : to initialize mass fields from a vertical profile of 
+!!                      n layers of Nv=cste 
+!!      SET_REF       : to compute  rhoJ 
+!!      RESSURE_IN_PREP : to apply an anelastic correction in the case of
+!!                        non-vanishing orography 
+!!      IO_File_open : to open a FM-file (DESFM + LFIFM)
+!!      WRITE_DESFM   : to write the  DESFM file
+!!      WRI_LFIFM     : to write the   LFIFM file  
+!!      IO_File_close : to close a FM-file (DESFM + LFIFM)
+!!
+!!      MXM,MYM,MZM   : Shuman operators
+!!      WGUESS        : to compute W with the continuity equation from 
+!!                      the U,V values 
+!!
+!!
+!!      
+!!    IMPLICIT ARGUMENTS
+!!    ------------------
+!!      Module MODD_PARAMETERS : contains parameters
+!!      Module MODD_DIM1      : contains dimensions 
+!!      Module MODD_CONF       : contains  configuration variables for 
+!!                                all models
+!!      Module MODD_CST        : contains physical constants
+!!      Module MODD_GRID       : contains grid variables  for all models
+!!      Module MODD_GRID1     : contains grid variables
+!!      Module MODD_TIME      : contains time variables for all models  
+!!      Module MODD_TIME1     : contains time variables  
+!!      Module MODD_REF        : contains reference state variables for
+!!                               all models
+!!      Module MODD_REF1      : contains reference state variables 
+!!      Module MODD_LUNIT      : contains variables which concern names
+!!                            and logical unit numbers of files  for all models
+!!      Module MODD_FIELD1    : contains prognostics  variables
+!!      Module MODD_GR_FIELD1 : contains the surface prognostic variables 
+!!      Module MODD_LSFIELD1    : contains Larger Scale fields
+!!      Module MODD_DYN1        : contains dynamic control variables for model 1
+!!      Module MODD_LBC1        : contains lbc control variables for model 1
+!!
+!!
+!!      Module MODN_CONF1    : contains  configuration variables for model 1
+!!                               and the NAMELIST list
+!!      Module MODN_LUNIT1    : contains variables which concern names
+!!                               and logical unit numbers of files and 
+!!                               the NAMELIST list
+!!
+!!
+!!    REFERENCE
+!!    ---------
+!!      Book2 of MESO-NH documentation (program PREP_IDEAL_CASE)
+!!    
+!!    AUTHOR
+!!    ------
+!!	V. Ducrocq   *Meteo France*
+!!
+!!    MODIFICATIONS
+!!    -------------
+!!      Original                            05/05/94
+!!      updated                V. Ducrocq   27/06/94   
+!!      updated                P.M.         27/07/94
+!!      updated                V. Ducrocq   23/08/94 
+!!      updated                V. Ducrocq   01/09/94 
+!!      namelist changes       J. Stein     26/10/94 
+!!      namelist changes       J. Stein     04/11/94 
+!!      remove the second step of the geostrophic balance 14/11/94 (J.Stein)
+!!      add grid stretching in the z direction + Larger scale fields +
+!!      cleaning                                           6/12/94 (J.Stein) 
+!!      periodize the orography and the grid sizes in the periodic case
+!!                                                        19/12/94 (J.Stein) 
+!!      correct a bug in the Larger Scale Fields initialization
+!!                                                        19/12/94 (J.Stein) 
+!!      add the vertical grid stretching                  02/01/95 (J. Stein)
+!!      Total mass of dry air computation                 02/01/95 (J.P.Lafore) 
+!!      add the 1D switch                                 13/01/95 (J. Stein)
+!!      enforce a regular vertical grid if desired        18/01/95 (J. Stein)
+!!      add the tdtcur initialization                     26/01/95 (J. Stein)
+!!      bug in the test of the type of RS localization    25/02/95 (J. Stein)
+!!      remove R from the historical variables            16/03/95 (J. Stein)
+!!      error on the grid stretching                      30/06/95 (J. Stein)
+!!      add the soil fields                               01/09/95 (S.Belair)
+!!      change the streching function  and the wind guess
+!!        (J. Stein and V.Masson)                         21/09/95 
+!!      reset to FALSE LUSERC,..,LUSERH                   12/12/95 (J. Stein)
+!!      enforce the RS localization in 1D and 2D config.
+!!      + add the 'TSZ0' option for the soil variables    28/01/96 (J. Stein)
+!!      initialization of domain from center point        31/01/96 (V. Masson)
+!!      add the constant file reading                     05/02/96 (J. Stein)
+!!      enter vertical model levels values                20/10/95 (T.Montmerle)
+!!      add LFORCING option                               19/02/96 (K. Suhre)
+!!      modify structure of NAM_CONF_PRE                  20/02/96 (J.-P. Pinty)
+!!      default of the domain center when use of pgd file 12/03/96 (V. Masson)
+!!      change the surface initialization                 20/03/96 ( Stein,
+!!                                                    Bougeault, Kastendeutsch )
+!!      change the DEFAULT_DESFMN CALL                    17/04/96 ( Lafore )
+!!      set the STORAGE_TYPE to 'TT' (a single instant)   30/04/96 (Stein, 
+!!                                                    Jabouille)
+!!      new wguess to spread  the divergence              15/05/96 (Stein)
+!!      set LTHINSHELL to TRUE + return to the old wguess 29/08/96 (Stein)
+!!      MY_NAME and DAD_NAME writing for nesting          30/07/96 (Lafore)
+!!      MY_NAME and DAD_NAME reading in pgd file          26/09/96 (Masson)
+!!       and reading of pgd grid in a new routine
+!!      XXHAT and XYHAT are set to 0. at origine point    02/10/96 (Masson)
+!!      add LTHINSHELL in namelist NAM_CONF_PRE           08/10/96 (Masson)
+!!      restores use of TS and T2                         26/11/96 (Masson)
+!!      value  XUNDEF for soil and vegetation fields on sea 27/11/96 (Masson)
+!!      use of HUG and HU2 in both ISBA and TSZ0 cases    04/12/96 (Masson)
+!!      add initialization of chemical variables          06/08/96 (K. Suhre)
+!!      add MANUAL option for the terrain elevation       12/12/96 (J.-P. Pinty)
+!!      set DATA instead of MANUAL for the terrain
+!!      elevation option
+!!      add new anelastic equations' systems              29/06/97 (Stein)
+!!      split mode_lfifm_pgd                              29/07/97 (Masson)
+!!      add directional z0 and subgrid scale orography    31/07/97 (Masson)
+!!      separates surface treatment in PREP_IDEAL_SURF    15/03/99 (Masson)
+!!      new PGD fields allocations                        15/03/99 (Masson)
+!!      iterative call to pressure solver                 15/03/99 (Masson)
+!!      removes TSZ0 case                                 04/01/00 (Masson)
+!!      parallelization                                   18/06/00 (Pinty)
+!!      adaptation for patch approach                     02/07/00 (Solmon/Masson)
+!!      bug in W LB field on Y direction                  05/03/01 (Stein)
+!!      add module MODD_NSV for NSV variable              01/02/01 (D. Gazen) 
+!!      allow namelists in different orders               15/10/01 (I. Mallet)
+!!      allow LUSERC and LUSERI in 1D configuration       05/06/02 (P. Jabouille)
+!!      add  ZUVTHLMR case (move in set_rsou latter)      05/12/02 Jabouille/Masson
+!!      move LHORELAX_SV (after INI_NSV)                  30/04/04 (Pinty)
+!!      Correction Parallel bug IBEG & IDEND  evalution   13/11/08 J.Escobar
+!!      add the option LSHIFT for interpolation of        26/10/10 (G.Tanguy)
+!!      correction for XHAT & parallelizarion of ZSDATA   23/09/11 J.Escobar
+!!      the vertical profile (as in PREP_REAL_CASE)
+!!      add use MODI of SURFEX routines                   10/10/111 J.Escobar
+!!
+!!      For 2D modeling: 
+!!      Initialization of ADVFRC profiles (SET_ADVFRC)    06/2010 (P.Peyrille)
+!!      when LDUMMY(2)=T in PRE_IDEA1.nam 
+!!      USE MODDB_ADVFRC_n for grid-nesting               02*2012 (M. Tomasini)
+!!      LBOUSS in MODD_REF                                07/2013 (C.Lac)
+!!      Correction for ZS in PGD file                     04/2014 (G. TANGUY)
+!!      Bug : remove NC WRITE_HGRID                       05/2014 (S. Bielli via J.Escobar )
+!!      BUG if ZFRC and ZFRC_ADV or ZFRC_REL are used together  11/2014 (G. Delautier)
+!!      Bug : detected with cray compiler ,
+!!                  missing '&' in continuation string  3/12/2014 J.Escobar
+!!      J.Escobar : 15/09/2015 : WENO5 & JPHEXT <> 1 
+!!  06/2016     (G.Delautier) phasage surfex 8
+!!      P.Wautelet : 08/07/2016 : removed MNH_NCWRIT define
+!!  01/2018      (G.Delautier) SURFEX 8.1
+!  P. Wautelet: 05/2016-04/2018: new data structures and calls for I/O
+!  P. Wautelet 07/02/2019: force TYPE to a known value for IO_File_add2list
+!  P. Wautelet 14/02/2019: remove CLUOUT/CLUOUT0 and associated variables
+!  P. Wautelet 28/03/2019: use MNHTIME for time measurement variables
+!  P. Wautelet 28/03/2019: use TFILE instead of unit number for set_iluout_timing
+!  P. Wautelet 19/04/2019: removed unused dummy arguments and variables
+!  P. Wautelet 26/04/2019: replace non-standard FLOAT function by REAL function
+!  P. Wautelet 20/05/2019: add name argument to ADDnFIELD_ll + new ADD4DFIELD_ll subroutine
+!  F. Auguste     02/2021: add IBM
+!  P. Wautelet 09/03/2021: move some chemistry initializations to ini_nsv
+!  Jean-Luc Redelsperger 03/2021: ocean LES case
+!  P. Wautelet 06/07/2021: use FINALIZE_MNH
+!-------------------------------------------------------------------------------
+!
+!*       0.   DECLARATIONS
+!             ------------
+!
+USE MODD_PARAMETERS       ! Declarative modules
+USE MODD_ARGSLIST_ll, ONLY : LIST_ll
+USE MODD_DIM_n
+USE MODD_CONF
+USE MODD_CST
+USE MODD_GRID
+USE MODD_GRID_n
+USE MODD_IBM_LSF,     ONLY: CIBM_TYPE, LIBM_LSF, NIBM_SMOOTH, XIBM_SMOOTH
+USE MODD_IBM_PARAM_n, ONLY: XIBM_LS
+USE MODD_METRICS_n
+USE MODD_PGDDIM
+USE MODD_PGDGRID
+USE MODD_TIME
+USE MODD_TIME_n
+USE MODD_REF
+USE MODD_REF_n
+USE MODD_LUNIT
+USE MODD_FIELD_n
+USE MODD_DYN_n
+USE MODD_LBC_n
+USE MODD_LSFIELD_n
+USE MODD_PARAM_n
+USE MODD_CH_MNHC_n,        ONLY:  LUSECHEM, LUSECHAQ, LUSECHIC, LCH_PH, LCH_INIT_FIELD
+USE MODD_CH_AEROSOL,ONLY:  LORILAM, CORGANIC, LVARSIGI, LVARSIGJ, LINITPM, XINIRADIUSI, &
+                           XINIRADIUSJ, XINISIGI, XINISIGJ, XN0IMIN, XN0JMIN, CRGUNIT
+USE MODD_DUST,      ONLY:  LDUST, NMODE_DST, CRGUNITD, XINISIG, XINIRADIUS, XN0MIN 
+USE MODD_SALT,      ONLY:  LSALT, NMODE_SLT, CRGUNITS, XINISIG_SLT, XINIRADIUS_SLT, XN0MIN_SLT
+USE MODD_VAR_ll,    ONLY:  NPROC
+USE MODD_LUNIT,     ONLY:  TLUOUT0, TOUTDATAFILE
+USE MODD_LUNIT_n
+USE MODD_IO,        ONLY: TFILE_DUMMY, TFILE_OUTPUTLISTING
+USE MODD_CONF_n
+USE MODD_NSV,       ONLY: NSV
+use modd_precision, only: LFIINT, MNHREAL_MPI, MNHTIME
+!
+USE MODN_BLANK_n
+!
+USE MODE_FINALIZE_MNH,     only: FINALIZE_MNH
+USE MODE_THERMO
+USE MODE_POS
+USE MODE_GRIDCART         ! Executive modules
+USE MODE_GRIDPROJ
+USE MODE_GATHER_ll
+USE MODE_IO,               only: IO_Config_set, IO_Init, IO_Pack_set
+USE MODE_IO_FIELD_READ,    only: IO_Field_read
+USE MODE_IO_FIELD_WRITE,   only: IO_Field_write, IO_Header_write
+USE MODE_IO_FILE,          only: IO_File_close, IO_File_open
+USE MODE_IO_MANAGE_STRUCT, only: IO_File_add2list
+USE MODE_ll
+USE MODE_MODELN_HANDLER
+use mode_field,            only: Alloc_field_scalars, Ini_field_list, Ini_field_scalars
+USE MODE_MSG
+!
+USE MODI_DEFAULT_DESFM_n    ! Interface modules
+USE MODI_DEFAULT_EXPRE
+USE MODI_IBM_INIT_LS
+USE MODI_READ_HGRID
+USE MODI_SHUMAN
+USE MODI_SET_RSOU
+USE MODI_SET_CSTN
+USE MODI_SET_FRC
+USE MODI_PRESSURE_IN_PREP
+USE MODI_WRITE_DESFM_n
+USE MODI_WRITE_LFIFM_n
+USE MODI_METRICS
+USE MODI_UPDATE_METRICS
+USE MODI_SET_REF
+USE MODI_SET_PERTURB
+USE MODI_TOTAL_DMASS
+USE MODI_CH_INIT_FIELD_n
+USE MODI_INI_NSV
+USE MODI_READ_PRE_IDEA_NAM_n
+USE MODI_ZSMT_PIC
+USE MODI_ZSMT_PGD
+USE MODI_READ_VER_GRID
+USE MODI_READ_ALL_NAMELISTS
+USE MODI_PGD_GRID_SURF_ATM
+USE MODI_SPLIT_GRID
+USE MODI_PGD_SURF_ATM
+USE MODI_ICE_ADJUST_BIS
+USE MODI_WRITE_PGD_SURF_ATM_n
+USE MODI_PREP_SURF_MNH
+!
+!JUAN
+USE MODE_SPLITTINGZ_ll
+USE MODD_SUB_MODEL_n
+USE MODE_MNH_TIMING
+USE MODN_CONFZ
+!JUAN
+USE MODI_TH_R_FROM_THL_RT_3D
+!
+USE MODI_VERSION
+USE MODI_INIT_PGD_SURF_ATM
+USE MODI_WRITE_SURF_ATM_N
+USE MODD_MNH_SURFEX_n
+! Modif ADVFRC
+USE MODD_2D_FRC
+USE MODD_ADVFRC_n     ! Modif for grid-nesting
+USE MODI_SETADVFRC
+USE MODD_RELFRC_n     ! Modif for grid-nesting
+USE MODI_SET_RELFRC
+!
+USE MODI_INI_CST
+USE MODI_INI_NEB
+USE MODI_WRITE_HGRID
+USE MODD_MPIF
+USE MODD_VAR_ll
+USE MODD_IO, ONLY: TFILEDATA,TFILE_SURFEX
+!
+USE MODE_MPPDB
+!
+USE MODD_GET_n
+!
+USE MODN_CONFIO, ONLY : NAM_CONFIO
+!
+IMPLICIT NONE
+!
+!*       0.1  Declarations of global variables not declared in the modules
+!
+REAL, DIMENSION(:,:,:), ALLOCATABLE :: XJ ! Jacobian
+REAL :: XLATCEN=XUNDEF, XLONCEN=XUNDEF ! latitude and longitude of the center of
+                                     ! the domain for initialization. This 
+                                     ! point is vertical vorticity point
+                                     !          ------------------------
+REAL :: XDELTAX=0.5E4, XDELTAY=0.5E4 ! horizontal mesh lengths  
+                                     !  used to determine  XXHAT,XYHAT
+!
+INTEGER :: NLUPRE,NLUOUT           ! Logical unit numbers for EXPRE file
+                                   ! and for output_listing file
+INTEGER :: NRESP                   ! return code in FM routines
+INTEGER :: NTYPE                   ! type of file (cpio or not)
+INTEGER(KIND=LFIINT) :: NNPRAR     ! number of articles predicted in the LFIFM file
+LOGICAL :: GFOUND                  ! Return code when searching namelist
+!
+INTEGER :: JLOOP,JILOOP,JJLOOP     ! Loop indexes
+!
+INTEGER :: NIB,NJB,NKB             ! Begining useful area  in x,y,z directions
+INTEGER :: NIE,NJE                 ! Ending useful area  in x,y directions
+INTEGER :: NIU,NJU,NKU             ! Upper bounds in x,y,z directions
+CHARACTER(LEN=4)   :: CIDEAL ='CSTN'     ! kind of idealized fields
+                                         ! 'CSTN' : Nv=cste case 
+                                         ! 'RSOU' : radiosounding case
+CHARACTER(LEN=4)   :: CZS    ='FLAT'     ! orography selector
+                                         ! 'FLAT' : zero orography
+                                         ! 'SINE' : sine-shaped orography 
+                                         ! 'BELL' : bell-shaped orography 
+REAL    :: XHMAX=XUNDEF            ! Maximum height for orography
+REAL    :: NEXPX=3,NEXPY=1         ! Exponents for  orography in case of CZS='SINE'
+REAL    :: XAX= 1.E4, XAY=1.E4     ! Widths for orography in case CZS='BELL'
+                                   ! along x and y 
+INTEGER :: NIZS = 5, NJZS = 5      ! Localization of the center in 
+                                   ! case CZS ='BELL' 
+!
+!*       0.1.1 Declarations of local variables for N=cste and 
+!              radiosounding cases :
+!
+INTEGER            :: NYEAR,NMONTH,NDAY ! year, month and day in EXPRE file
+REAL               :: XTIME             ! time in EXPRE file
+LOGICAL            :: LPERTURB =.FALSE. ! Logical to add a perturbation to 
+                                        ! a basic state 
+LOGICAL            :: LGEOSBAL =.FALSE. ! Logical to satisfy the geostrophic
+                                        ! balance
+                                        ! .TRUE. for geostrophic balance
+                                        ! .FALSE. to ignore this balance
+LOGICAL            :: LSHIFT   =.FALSE.  ! flag to perform vertical shift or not.        
+CHARACTER(LEN=3)   :: CFUNU ='ZZZ'      ! CHARACTER STRING for variation of
+                                        ! U in y direction
+                                        ! 'ZZZ'  : U = U(Z)
+                                        ! 'Y*Z'  : U = F(Y) * U(Z)
+                                        ! 'Y,Z'  : U = G(Y,Z)
+CHARACTER(LEN=3)   :: CFUNV ='ZZZ'      ! CHARACTER STRING for variation of
+                                        ! V in x direction
+                                        ! 'ZZZ'  : V = V(Z)
+                                        ! 'Y*Z'  : V = F(X) * V(Z)
+                                        ! 'Y,Z'  : V = G(X,Z)
+CHARACTER(LEN=6)   :: CTYPELOC='IJGRID' ! Type of informations  used to give the
+                                        ! localization of vertical profile
+                                        ! 'IJGRID'  for (i,j) point  on index space
+                                        ! 'XYHATM' for (x,y) coordinates on
+                                        !  conformal or cartesian plane
+                                        ! 'LATLON' for (latitude,longitude) on
+                                        !   spherical earth  
+REAL               :: XLATLOC= 45., XLONLOC=0.
+                                        ! Latitude and longitude of the vertical
+                                        ! profile localization  (used in case 
+                                        ! CTYPELOC='LATLON') 
+REAL               :: XXHATLOC=2.E4, XYHATLOC=2.E4 
+                                        ! (x,y) of the vertical profile
+                                        ! localization  (used in cases 
+                                        ! CTYPELOC='LATLON' and 'XYHATM') 
+INTEGER, DIMENSION(1) :: NILOC=4, NJLOC=4 
+                                        ! (i,j) of the vertical profile
+                                        ! localization 
+!
+!
+REAL,DIMENSION(:,:,:),ALLOCATABLE   :: XCORIOZ ! Coriolis parameter (this
+                                                 ! is exceptionnaly a 3D array
+                                                 ! for computing needs)
+!
+!
+!*       0.1.2 Declarations of local variables used when a PhysioGraphic Data
+!              file is used :
+!
+INTEGER             :: JSV                      ! loop index on scalar var.
+CHARACTER(LEN=28)   :: CPGD_FILE=' '            ! Physio-Graphic Data file name
+LOGICAL  :: LREAD_ZS = .TRUE.,                & ! switch to use orography 
+                                                ! coming from the PGD file
+            LREAD_GROUND_PARAM = .TRUE.         ! switch to use soil parameters
+                                                ! useful for the soil scheme
+                                                ! coming from the PGD file
+
+INTEGER           :: NSLEVE   =12         ! number of iteration for smooth orography
+REAL              :: XSMOOTH_ZS = XUNDEF  ! optional uniform smooth orography for SLEVE coordinate
+CHARACTER(LEN=28) :: YPGD_NAME, YPGD_DAD_NAME   ! general information
+CHARACTER(LEN=2)  :: YPGD_TYPE
+!
+INTEGER           :: IINFO_ll                   ! return code of // routines
+TYPE(LIST_ll), POINTER :: TZ_FIELDS_ll           ! list of metric coefficient fields
+!
+INTEGER :: IISIZEXF,IJSIZEXF,IISIZEXFU,IJSIZEXFU     ! dimensions of the
+INTEGER :: IISIZEX4,IJSIZEX4,IISIZEX2,IJSIZEX2       ! West-east LB arrays
+INTEGER :: IISIZEYF,IJSIZEYF,IISIZEYFV,IJSIZEYFV     ! dimensions of the
+INTEGER :: IISIZEY4,IJSIZEY4,IISIZEY2,IJSIZEY2       ! North-south LB arrays
+INTEGER :: IBEG,IEND,IXOR,IXDIM,IYOR,IYDIM,ILBX,ILBY
+REAL, DIMENSION(:),   ALLOCATABLE :: ZXHAT_ll, ZYHAT_ll
+!
+REAL, DIMENSION(:,:,:), ALLOCATABLE ::ZTHL,ZT,ZRT,ZFRAC_ICE,&
+                                      ZEXN,ZLVOCPEXN,ZLSOCPEXN,ZCPH, &
+                                      ZRSATW, ZRSATI
+                                 ! variables for adjustement
+REAL                :: ZDIST
+!
+!JUAN TIMING
+REAL(kind=MNHTIME), DIMENSION(2) :: ZTIME1, ZTIME2, ZEND, ZTOT
+CHARACTER                 :: YMI
+INTEGER                   :: IMI
+!JUAN TIMING
+!
+REAL, DIMENSION(:),   ALLOCATABLE :: ZZS_ll
+INTEGER                           :: IJ
+!
+REAL              :: ZZS_MAX, ZZS_MAX_ll
+INTEGER           :: IJPHEXT
+!
+TYPE(TFILEDATA),POINTER :: TZEXPREFILE  => NULL()
+!
+!
+!*       0.2  Namelist declarations
+!
+NAMELIST/NAM_CONF_PRE/ LTHINSHELL,LCARTESIAN,    &! Declarations in MODD_CONF
+                       LPACK,                    &!
+                       NVERB,CIDEAL,CZS,         &!+global variables initialized
+                       LBOUSS,LOCEAN,LPERTURB,   &! at their declarations
+                       LFORCING,CEQNSYS,         &! at their declarations
+                       LSHIFT,L2D_ADV_FRC,L2D_REL_FRC, &
+                       NHALO , JPHEXT
+NAMELIST/NAM_GRID_PRE/ XLON0,XLAT0,            & ! Declarations in MODD_GRID
+                       XBETA,XRPK,             & 
+                       XLONORI,XLATORI
+NAMELIST/NAM_GRIDH_PRE/ XLATCEN,XLONCEN,       & ! local variables  initialized
+                 XDELTAX,XDELTAY,              & ! at their declarations
+                 XHMAX,NEXPX,NEXPY,            &
+                 XAX,XAY,NIZS,NJZS
+NAMELIST/NAM_VPROF_PRE/LGEOSBAL, CFUNU,CFUNV,   &! global variables initialized
+                     CTYPELOC,XLATLOC,XLONLOC,  &!  at their declarations
+                     XXHATLOC,XYHATLOC,NILOC,NJLOC
+NAMELIST/NAM_REAL_PGD/CPGD_FILE,                 & ! Physio-Graphic Data file
+                                                   !  name
+                      LREAD_ZS,                  & ! switch to use orography 
+                                                   ! coming from the PGD file
+                      LREAD_GROUND_PARAM
+NAMELIST/NAM_SLEVE/NSLEVE, XSMOOTH_ZS
+!
+!*       0.3  Auxillary Namelist declarations
+!
+NAMELIST/NAM_AERO_PRE/ LORILAM, LINITPM, XINIRADIUSI, XINIRADIUSJ, &
+                       XINISIGI, XINISIGJ, XN0IMIN, XN0JMIN, CRGUNIT, &
+                       LDUST, LSALT, CRGUNITD, CRGUNITS,&
+                       NMODE_DST, XINISIG, XINIRADIUS, XN0MIN,&
+                       XINISIG_SLT, XINIRADIUS_SLT, XN0MIN_SLT, &
+                       NMODE_SLT
+!
+NAMELIST/NAM_IBM_LSF/ LIBM_LSF, CIBM_TYPE, NIBM_SMOOTH, XIBM_SMOOTH
+!
+!-------------------------------------------------------------------------------
+!
+!*       0.    PROLOGUE
+!              --------
+CALL MPPDB_INIT()
+!
+CALL GOTO_MODEL(1)
+!
+CALL IO_Init()
+NULLIFY(TZ_FIELDS_ll)
+CALL VERSION
+CPROGRAM='IDEAL '
+!
+!JUAN TIMING
+  XT_START     = 0.0_MNHTIME
+  XT_STORE     = 0.0_MNHTIME
+!
+  CALL SECOND_MNH2(ZEND)
+!
+!JUAN TIMING
+!
+!*       1.    INITIALIZE PHYSICAL CONSTANTS :         
+!              ------------------------------
+!
+NVERB = 5
+CALL INI_CST
+CALL INI_NEB
+!
+!-------------------------------------------------------------------------------
+!
+!
+!*  	 2.    SET DEFAULT VALUES  :  
+!              --------------------
+!
+!
+!*       2.1  For variables in DESFM file
+!
+CALL ALLOC_FIELD_SCALARS()
+!
+CALL DEFAULT_DESFM_n(1)
+!
+CSURF = "NONE"
+!
+!
+!*       2.2  For other global variables in EXPRE file
+!
+CALL DEFAULT_EXPRE
+!-------------------------------------------------------------------------------
+!
+!*  	 3.    READ THE EXPRE FILE :  
+!              --------------------
+!
+!*       3.1   initialize logical unit numbers (EXPRE and output-listing files)
+!              and open these files :
+! 
+! 
+CALL IO_File_add2list(TLUOUT0,'OUTPUT_LISTING1','OUTPUTLISTING','WRITE')
+CALL IO_File_open(TLUOUT0)
+NLUOUT = TLUOUT0%NLU
+!Set output files for PRINT_MSG
+TLUOUT              => TLUOUT0
+TFILE_OUTPUTLISTING => TLUOUT0
+!
+CALL IO_File_add2list(TZEXPREFILE,'PRE_IDEA1.nam','NML','READ')
+CALL IO_File_open(TZEXPREFILE)
+NLUPRE=TZEXPREFILE%NLU
+!
+!*       3.2   read in NLUPRE the namelist informations
+!
+WRITE(NLUOUT,FMT=*) 'attempt to read ',TRIM(TZEXPREFILE%CNAME),' file'
+CALL POSNAM(NLUPRE,'NAM_REAL_PGD',GFOUND,NLUOUT)
+IF (GFOUND) READ(UNIT=NLUPRE,NML=NAM_REAL_PGD)
+!
+!
+CALL POSNAM(NLUPRE,'NAM_CONF_PRE',GFOUND,NLUOUT)
+IF (GFOUND) READ(UNIT=NLUPRE,NML=NAM_CONF_PRE)
+!JUANZ
+CALL POSNAM(NLUPRE,'NAM_CONFZ',GFOUND,NLUOUT)
+IF (GFOUND) READ(UNIT=NLUPRE,NML=NAM_CONFZ)
+!JUANZ
+CALL POSNAM(NLUPRE,'NAM_CONFIO',GFOUND,NLUOUT)
+IF (GFOUND) READ(UNIT=NLUPRE,NML=NAM_CONFIO)
+CALL IO_Config_set()
+CALL POSNAM(NLUPRE,'NAM_GRID_PRE',GFOUND,NLUOUT)
+IF (GFOUND) READ(UNIT=NLUPRE,NML=NAM_GRID_PRE)
+CALL POSNAM(NLUPRE,'NAM_GRIDH_PRE',GFOUND,NLUOUT)
+IF (GFOUND) READ(UNIT=NLUPRE,NML=NAM_GRIDH_PRE)
+CALL POSNAM(NLUPRE,'NAM_VPROF_PRE',GFOUND,NLUOUT)
+IF (GFOUND) READ(UNIT=NLUPRE,NML=NAM_VPROF_PRE)
+CALL POSNAM(NLUPRE,'NAM_BLANKN',GFOUND,NLUOUT)
+CALL INIT_NAM_BLANKn
+IF (GFOUND) THEN
+  READ(UNIT=NLUPRE,NML=NAM_BLANKn)
+  CALL UPDATE_NAM_BLANKn
+END IF
+CALL READ_PRE_IDEA_NAM_n(NLUPRE,NLUOUT)
+CALL POSNAM(NLUPRE,'NAM_AERO_PRE',GFOUND,NLUOUT)
+IF (GFOUND) READ(UNIT=NLUPRE,NML=NAM_AERO_PRE)
+CALL POSNAM(NLUPRE,'NAM_IBM_LSF' ,GFOUND,NLUOUT)
+IF (GFOUND) READ(UNIT=NLUPRE,NML=NAM_IBM_LSF )
+!
+CALL INI_FIELD_LIST(1)
+!
+CALL INI_FIELD_SCALARS()
+!
+IF( LEN_TRIM(CPGD_FILE) /= 0 ) THEN 
+  ! open the PGD_FILE
+  CALL IO_File_add2list(TPGDFILE,TRIM(CPGD_FILE),'PGD','READ',KLFINPRAR=NNPRAR,KLFITYPE=2,KLFIVERB=NVERB)
+  CALL IO_File_open(TPGDFILE)
+
+  ! read the grid in the PGD file
+  CALL IO_Field_read(TPGDFILE,'IMAX',  NIMAX)
+  CALL IO_Field_read(TPGDFILE,'JMAX',  NJMAX)
+  CALL IO_Field_read(TPGDFILE,'JPHEXT',IJPHEXT)
+
+  IF ( CPGD_FILE /= CINIFILEPGD) THEN
+     WRITE(NLUOUT,FMT=*) ' WARNING : in PRE_IDEA1.nam, in NAM_LUNITn you&
+          & have CINIFILEPGD= ',CINIFILEPGD
+     WRITE(NLUOUT,FMT=*) ' whereas in NAM_REAL_PGD you have CPGD_FILE = '&
+          ,CPGD_FILE
+     WRITE(NLUOUT,FMT=*) ' '
+     WRITE(NLUOUT,FMT=*) ' CINIFILEPGD HAS BEEN SET TO  ',CPGD_FILE        
+     CINIFILEPGD=CPGD_FILE
+  END IF
+  IF ( IJPHEXT .NE. JPHEXT ) THEN
+     WRITE(NLUOUT,FMT=*) ' PREP_IDEAL_CASE : JPHEXT in PRE_IDEA1.nam/NAM_CONF_PRE ( or default value )&
+        & JPHEXT=',JPHEXT
+     WRITE(NLUOUT,FMT=*) ' different from PGD files=', CINIFILEPGD,' value JPHEXT=',IJPHEXT
+     WRITE(NLUOUT,FMT=*) '-> JOB ABORTED'
+     CALL PRINT_MSG(NVERB_FATAL,'GEN','PREP_IDEAL_CASE','')
+     !WRITE(NLUOUT,FMT=*) ' JPHEXT HAS BEEN SET TO ', IJPHEXT
+     !IJPHEXT = JPHEXT
+  END IF
+END IF
+!
+NIMAX_ll=NIMAX   !! _ll variables are global variables
+NJMAX_ll=NJMAX   !! but the old names are kept in PRE_IDEA1.nam file
+!
+!*       3.3   check some parameters:
+!
+L1D=.FALSE. ; L2D=.FALSE.
+!
+IF ((NIMAX == 1).OR.(NJMAX == 1)) THEN 
+  L2D=.TRUE.
+  NJMAX_ll=1
+  NIMAX_ll=MAX(NIMAX,NJMAX)
+  WRITE(NLUOUT,FMT=*) ' NJMAX HAS BEEN SET TO 1 SINCE 2D INITIAL FILE IS REQUIRED &
+                   & (L2D=TRUE) )' 
+END IF
+!
+IF ((NIMAX == 1).AND.(NJMAX == 1)) THEN 
+  L1D=.TRUE.
+  NIMAX_ll = 1
+  NJMAX_ll = 1
+  WRITE(NLUOUT,FMT=*) ' 1D INITIAL FILE IS REQUIRED (L1D=TRUE) ' 
+END IF
+!
+IF(.NOT. L1D) THEN
+  LHORELAX_UVWTH=.TRUE.
+  LHORELAX_RV=.TRUE.
+ENDIF
+!
+NRIMX= MIN(JPRIMMAX,NIMAX_ll/2)
+!
+IF (L2D) THEN
+  NRIMY=0
+ELSE
+  NRIMY= MIN(JPRIMMAX,NJMAX_ll/2)
+END IF
+!
+IF (L1D) THEN
+  NRIMX=0
+  NRIMY=0
+END IF
+!
+IF (L1D .AND. ( LPERTURB .OR. LGEOSBAL .OR.                &
+               (.NOT. LCARTESIAN ) .OR. (.NOT. LTHINSHELL) ))THEN 
+  LGEOSBAL   = .FALSE.
+  LPERTURB   = .FALSE.
+  LCARTESIAN = .TRUE. 
+  LTHINSHELL = .TRUE. 
+  WRITE(NLUOUT,FMT=*) ' LGEOSBAL AND LPERTURB HAVE BEEN SET TO FALSE &
+                      & AND LCARTESIAN AND LTHINSHELL TO TRUE        &
+                      & SINCE 1D INITIAL FILE IS REQUIRED (L1D=TRUE)' 
+END IF
+!
+IF (LGEOSBAL .AND. LSHIFT ) THEN
+  LSHIFT=.FALSE.
+  WRITE(NLUOUT,FMT=*) ' LSHIFT HAS BEEN SET TO FALSE SINCE &
+                        & LGEOSBAL=.TRUE. IS REQUIRED '
+END IF
+!                      
+!*       3.4   compute the number of moist variables :
+!
+IF (.NOT.LUSERV) THEN
+  LUSERV = .TRUE.
+  WRITE(NLUOUT,FMT=*) ' LUSERV HAS BEEN RESET TO TRUE, SINCE A MOIST VARIABLE &
+                   & IS PRESENT IN EXPRE FILE (CIDEAL = RSOU OR CSTN)' 
+END IF
+!
+IF((LUSERI .OR. LUSERC).AND. (CIDEAL /= 'RSOU')) THEN
+  !callabortstop
+  CALL PRINT_MSG(NVERB_FATAL,'GEN','PREP_IDEAL_CASE','use of hydrometeors is only allowed in RSOU case')
+ENDIF
+IF (LUSERI) THEN
+  LUSERC =.TRUE.
+  LUSERR =.TRUE.
+  LUSERI =.TRUE.
+  LUSERS =.TRUE.
+  LUSERG =.TRUE.
+  LUSERH =.FALSE.
+  CCLOUD='ICE3'
+ELSEIF(LUSERC) THEN
+  LUSERR =.FALSE.
+  LUSERI =.FALSE.
+  LUSERS =.FALSE.
+  LUSERG =.FALSE.
+  LUSERH =.FALSE.
+  CCLOUD='REVE'
+ELSE
+  LUSERC =.FALSE.
+  LUSERR =.FALSE.
+  LUSERI =.FALSE.
+  LUSERS =.FALSE.
+  LUSERG =.FALSE.
+  LUSERH =.FALSE.
+  LHORELAX_RC=.FALSE.
+  LHORELAX_RR=.FALSE.
+  LHORELAX_RI=.FALSE.
+  LHORELAX_RS=.FALSE.
+  LHORELAX_RG=.FALSE.
+  LHORELAX_RH=.FALSE.
+  CCLOUD='NONE'
+!
+END IF
+!
+NRR=0
+IF (LUSERV) THEN
+  NRR=NRR+1
+  IDX_RVT = NRR
+END IF
+IF (LUSERC) THEN
+  NRR=NRR+1
+  IDX_RCT = NRR
+END IF
+IF (LUSERR) THEN
+  NRR=NRR+1
+  IDX_RRT = NRR
+END IF
+IF (LUSERI) THEN
+  NRR=NRR+1
+  IDX_RIT = NRR
+END IF
+IF (LUSERS) THEN
+  NRR=NRR+1
+  IDX_RST = NRR
+END IF
+IF (LUSERG) THEN
+  NRR=NRR+1
+  IDX_RGT = NRR
+END IF
+IF (LUSERH) THEN
+  NRR=NRR+1
+  IDX_RHT = NRR
+END IF
+!
+! NRR=4 for RSOU case because RI and Rc always computed
+IF (CIDEAL == 'RSOU' .AND. NRR < 4 ) NRR=4
+!                   
+!
+!*       3.5   Chemistry
+!
+IF (LORILAM .OR. LCH_INIT_FIELD) THEN
+  LUSECHEM = .TRUE.
+  IF (LORILAM) THEN
+    CORGANIC = "MPMPO"
+    LVARSIGI = .TRUE.
+    LVARSIGJ = .TRUE.
+  END IF
+END IF
+! initialise NSV_* variables
+CALL INI_NSV(1)
+LHORELAX_SV(:)=.FALSE.
+IF(.NOT. L1D) LHORELAX_SV(1:NSV)=.TRUE.
+!
+!-------------------------------------------------------------------------------
+!
+!*       4.    ALLOCATE MEMORY FOR ARRAYS :  
+!   	       ----------------------------
+!
+!*       4.1  Vertical Spatial grid 
+!
+CALL READ_VER_GRID(TZEXPREFILE)
+!
+!*       4.2  Initialize parallel variables and compute array's dimensions
+!
+!
+IF(LGEOSBAL) THEN
+  CALL SET_SPLITTING_ll('XSPLITTING')  ! required for integration of thermal wind balance
+ELSE
+  CALL SET_SPLITTING_ll('BSPLITTING')
+ENDIF
+CALL SET_JP_ll(1,JPHEXT,JPVEXT,JPHEXT)
+CALL SET_DAD0_ll()
+CALL SET_DIM_ll(NIMAX_ll, NJMAX_ll, NKMAX)
+CALL IO_Pack_set(L1D,L2D,LPACK)
+CALL SET_LBX_ll(CLBCX(1), 1)
+CALL SET_LBY_ll(CLBCY(1), 1)
+CALL SET_XRATIO_ll(1, 1)
+CALL SET_YRATIO_ll(1, 1)
+CALL SET_XOR_ll(1, 1)
+CALL SET_XEND_ll(NIMAX_ll+2*JPHEXT, 1)
+CALL SET_YOR_ll(1, 1)
+CALL SET_YEND_ll(NJMAX_ll+2*JPHEXT, 1)
+CALL SET_DAD_ll(0, 1)
+CALL INI_PARAZ_ll(IINFO_ll)
+!
+! sizes of arrays of the extended sub-domain
+!
+CALL GET_DIM_EXT_ll('B',NIU,NJU)
+CALL GET_DIM_PHYS_ll('B',NIMAX,NJMAX)
+CALL GET_INDICE_ll(NIB,NJB,NIE,NJE)
+CALL GET_OR_ll('B',IXOR,IYOR)
+NKB=1+JPVEXT
+NKU=NKMAX+2*JPVEXT
+!
+!*       4.3  Global variables absent from the modules :
+!
+ALLOCATE(XJ(NIU,NJU,NKU))
+SELECT CASE(CIDEAL)
+  CASE('RSOU','CSTN')
+    IF (LGEOSBAL) ALLOCATE(XCORIOZ(NIU,NJU,NKU))  ! exceptionally a 3D array  
+  CASE DEFAULT                      ! undefined preinitialization
+   !callabortstop
+    CALL PRINT_MSG(NVERB_FATAL,'GEN','PREP_IDEAL_CASE','CIDEAL is not correctly defined')
+END SELECT 
+!
+!*       4.4   Prognostic variables at M instant (module MODD_FIELD1):
+!
+ALLOCATE(XUT(NIU,NJU,NKU))
+ALLOCATE(XVT(NIU,NJU,NKU))
+ALLOCATE(XWT(NIU,NJU,NKU))
+ALLOCATE(XTHT(NIU,NJU,NKU))
+ALLOCATE(XPABST(NIU,NJU,NKU))
+ALLOCATE(XRT(NIU,NJU,NKU,NRR))
+ALLOCATE(XSVT(NIU,NJU,NKU,NSV))
+!
+!*       4.5   Grid variables (module MODD_GRID1 and MODD_METRICS1):
+!
+ALLOCATE(XMAP(NIU,NJU))
+ALLOCATE(XLAT(NIU,NJU))
+ALLOCATE(XLON(NIU,NJU))
+ALLOCATE(XDXHAT(NIU),XDYHAT(NJU))
+IF (LEN_TRIM(CPGD_FILE)==0) ALLOCATE(XZS(NIU,NJU))
+IF (LEN_TRIM(CPGD_FILE)==0) ALLOCATE(ZZS_ll(NIMAX_ll))
+IF (LEN_TRIM(CPGD_FILE)==0) ALLOCATE(XZSMT(NIU,NJU))
+ALLOCATE(XZZ(NIU,NJU,NKU))
+!
+ALLOCATE(XDXX(NIU,NJU,NKU))
+ALLOCATE(XDYY(NIU,NJU,NKU))
+ALLOCATE(XDZX(NIU,NJU,NKU))
+ALLOCATE(XDZY(NIU,NJU,NKU))
+ALLOCATE(XDZZ(NIU,NJU,NKU))
+!
+!*       4.6   Reference state variables (modules MODD_REF and MODD_REF1):
+!
+ALLOCATE(XRHODREFZ(NKU),XTHVREFZ(NKU))
+XTHVREFZ(:)=0.0
+IF (LCOUPLES) THEN
+  ! Arrays for reference state different in ocean and atmosphere
+  ALLOCATE(XRHODREFZO(NKU),XTHVREFZO(NKU))
+  XTHVREFZO(:)=0.0
+END IF
+IF(CEQNSYS == 'DUR') THEN
+  ALLOCATE(XRVREF(NIU,NJU,NKU))
+ELSE
+  ALLOCATE(XRVREF(0,0,0))
+END IF
+ALLOCATE(XRHODREF(NIU,NJU,NKU),XTHVREF(NIU,NJU,NKU),XEXNREF(NIU,NJU,NKU))
+ALLOCATE(XRHODJ(NIU,NJU,NKU))
+!
+!*       4.7   Larger Scale fields (modules MODD_LSFIELD1):
+!
+ALLOCATE(XLSUM(NIU,NJU,NKU))
+ALLOCATE(XLSVM(NIU,NJU,NKU))
+ALLOCATE(XLSWM(NIU,NJU,NKU))
+ALLOCATE(XLSTHM(NIU,NJU,NKU))
+IF ( NRR >= 1) THEN
+  ALLOCATE(XLSRVM(NIU,NJU,NKU))
+ELSE
+  ALLOCATE(XLSRVM(0,0,0))
+ENDIF
+!
+!  allocate lateral boundary field used for coupling
+!
+IF ( L1D) THEN                         ! 1D case
+!
+  NSIZELBX_ll=0
+  NSIZELBXU_ll=0
+  NSIZELBY_ll=0
+  NSIZELBYV_ll=0
+  NSIZELBXTKE_ll=0
+  NSIZELBXR_ll=0
+  NSIZELBXSV_ll=0
+  NSIZELBYTKE_ll=0
+  NSIZELBYR_ll=0
+  NSIZELBYSV_ll=0
+  ALLOCATE(XLBXUM(0,0,0))
+  ALLOCATE(XLBYUM(0,0,0))
+  ALLOCATE(XLBXVM(0,0,0))
+  ALLOCATE(XLBYVM(0,0,0))
+  ALLOCATE(XLBXWM(0,0,0))
+  ALLOCATE(XLBYWM(0,0,0))
+  ALLOCATE(XLBXTHM(0,0,0))
+  ALLOCATE(XLBYTHM(0,0,0))
+  ALLOCATE(XLBXTKEM(0,0,0))
+  ALLOCATE(XLBYTKEM(0,0,0))
+  ALLOCATE(XLBXRM(0,0,0,0))
+  ALLOCATE(XLBYRM(0,0,0,0))
+  ALLOCATE(XLBXSVM(0,0,0,0))
+  ALLOCATE(XLBYSVM(0,0,0,0))
+!
+ELSEIF( L2D ) THEN             ! 2D case (not yet parallelized)
+!                                          
+  CALL GET_SIZEX_LB(NIMAX_ll,NJMAX_ll,NRIMX,               &
+                    IISIZEXF,IJSIZEXF,IISIZEXFU,IJSIZEXFU, &
+                    IISIZEX4,IJSIZEX4,IISIZEX2,IJSIZEX2)
+  NSIZELBY_ll=0
+  NSIZELBYV_ll=0
+  NSIZELBYTKE_ll=0
+  NSIZELBYR_ll=0
+  NSIZELBYSV_ll=0
+  ALLOCATE(XLBYUM(0,0,0))
+  ALLOCATE(XLBYVM(0,0,0))
+  ALLOCATE(XLBYWM(0,0,0))
+  ALLOCATE(XLBYTHM(0,0,0))
+  ALLOCATE(XLBYTKEM(0,0,0))
+  ALLOCATE(XLBYRM(0,0,0,0))
+  ALLOCATE(XLBYSVM(0,0,0,0))
+  !
+  IF ( LHORELAX_UVWTH ) THEN
+!JUAN A REVOIR TODO_JPHEXT
+! <<<<<<< prep_ideal_case.f90
+    ! NSIZELBX_ll=2*NRIMX+2
+    ! NSIZELBXU_ll=2*NRIMX+2
+    ALLOCATE(XLBXUM(IISIZEXFU,NJU,NKU))
+    ALLOCATE(XLBXVM(IISIZEXF,NJU,NKU))
+    ALLOCATE(XLBXWM(IISIZEXF,NJU,NKU))
+    ALLOCATE(XLBXTHM(IISIZEXF,NJU,NKU))
+! =======
+    NSIZELBX_ll=2*NRIMX+2*JPHEXT
+    NSIZELBXU_ll=2*NRIMX+2*JPHEXT
+    ! ALLOCATE(XLBXUM(2*NRIMX+2*JPHEXT,NJU,NKU))
+    ! ALLOCATE(XLBXVM(2*NRIMX+2*JPHEXT,NJU,NKU))
+    ! ALLOCATE(XLBXWM(2*NRIMX+2*JPHEXT,NJU,NKU))
+    ! ALLOCATE(XLBXTHM(2*NRIMX+2*JPHEXT,NJU,NKU))
+! >>>>>>> 1.3.2.4.2.3.2.14.2.8.2.11.2.2
+  ELSE
+    NSIZELBX_ll= 2*JPHEXT     ! 2
+    NSIZELBXU_ll=2*(JPHEXT+1) ! 4 
+    ALLOCATE(XLBXUM(NSIZELBXU_ll,NJU,NKU))
+    ALLOCATE(XLBXVM(NSIZELBX_ll,NJU,NKU))
+    ALLOCATE(XLBXWM(NSIZELBX_ll,NJU,NKU))
+    ALLOCATE(XLBXTHM(NSIZELBX_ll,NJU,NKU))
+  END IF  
+  !
+  IF ( NRR > 0 ) THEN
+    IF (       LHORELAX_RV .OR. LHORELAX_RC .OR. LHORELAX_RR .OR. LHORELAX_RI    &
+          .OR. LHORELAX_RS .OR. LHORELAX_RG .OR. LHORELAX_RH                     &
+       ) THEN 
+!JUAN A REVOIR TODO_JPHEXT
+! <<<<<<< prep_ideal_case.f90
+      ! NSIZELBXR_ll=2* NRIMX+2
+      ALLOCATE(XLBXRM(IISIZEXF,NJU,NKU,NRR))
+! =======
+      NSIZELBXR_ll=2*NRIMX+2*JPHEXT
+      ! ALLOCATE(XLBXRM(2*NRIMX+2*JPHEXT,NJU,NKU,NRR))
+! >>>>>>> 1.3.2.4.2.3.2.14.2.8.2.11.2.2
+    ELSE
+      NSIZELBXR_ll=2*JPHEXT ! 2
+      ALLOCATE(XLBXRM(NSIZELBXR_ll,NJU,NKU,NRR))
+    ENDIF
+  ELSE
+    NSIZELBXR_ll=0
+    ALLOCATE(XLBXRM(0,0,0,0))
+  END IF
+  !
+  IF ( NSV > 0 ) THEN 
+    IF ( ANY( LHORELAX_SV(:)) ) THEN
+!JUAN A REVOIR TODO_JPHEXT
+! <<<<<<< prep_ideal_case.f90
+      ! NSIZELBXSV_ll=2* NRIMX+2
+      ALLOCATE(XLBXSVM(IISIZEXF,NJU,NKU,NSV))
+! =======
+      NSIZELBXSV_ll=2*NRIMX+2*JPHEXT
+      ! ALLOCATE(XLBXSVM(2*NRIMX+2*JPHEXT,NJU,NKU,NSV))
+! >>>>>>> 1.3.2.4.2.3.2.14.2.8.2.11.2.2
+    ELSE
+      NSIZELBXSV_ll=2*JPHEXT ! 2
+      ALLOCATE(XLBXSVM(NSIZELBXSV_ll,NJU,NKU,NSV))
+    END IF
+  ELSE
+    NSIZELBXSV_ll=0
+    ALLOCATE(XLBXSVM(0,0,0,0))
+  END IF
+!
+ELSE                                   ! 3D case
+!
+  CALL GET_SIZEX_LB(NIMAX_ll,NJMAX_ll,NRIMX,               &
+                    IISIZEXF,IJSIZEXF,IISIZEXFU,IJSIZEXFU, &
+                    IISIZEX4,IJSIZEX4,IISIZEX2,IJSIZEX2)
+  CALL GET_SIZEY_LB(NIMAX_ll,NJMAX_ll,NRIMY,               &
+                    IISIZEYF,IJSIZEYF,IISIZEYFV,IJSIZEYFV, &
+                    IISIZEY4,IJSIZEY4,IISIZEY2,IJSIZEY2)
+!
+  IF ( LHORELAX_UVWTH ) THEN
+    NSIZELBX_ll=2*NRIMX+2*JPHEXT
+    NSIZELBXU_ll=2*NRIMX+2*JPHEXT
+    NSIZELBY_ll=2*NRIMY+2*JPHEXT
+    NSIZELBYV_ll=2*NRIMY+2*JPHEXT
+    ALLOCATE(XLBXUM(IISIZEXFU,IJSIZEXFU,NKU))
+    ALLOCATE(XLBYUM(IISIZEYF,IJSIZEYF,NKU))
+    ALLOCATE(XLBXVM(IISIZEXF,IJSIZEXF,NKU))
+    ALLOCATE(XLBYVM(IISIZEYFV,IJSIZEYFV,NKU))
+    ALLOCATE(XLBXWM(IISIZEXF,IJSIZEXF,NKU))
+    ALLOCATE(XLBYWM(IISIZEYF,IJSIZEYF,NKU))
+    ALLOCATE(XLBXTHM(IISIZEXF,IJSIZEXF,NKU))
+    ALLOCATE(XLBYTHM(IISIZEYF,IJSIZEYF,NKU))
+  ELSE
+    NSIZELBX_ll=2*JPHEXT      ! 2
+    NSIZELBXU_ll=2*(JPHEXT+1) ! 4
+    NSIZELBY_ll=2*JPHEXT      ! 2
+    NSIZELBYV_ll=2*(JPHEXT+1) ! 4
+    ALLOCATE(XLBXUM(IISIZEX4,IJSIZEX4,NKU))
+    ALLOCATE(XLBYUM(IISIZEY2,IJSIZEY2,NKU))
+    ALLOCATE(XLBXVM(IISIZEX2,IJSIZEX2,NKU))
+    ALLOCATE(XLBYVM(IISIZEY4,IJSIZEY4,NKU))
+    ALLOCATE(XLBXWM(IISIZEX2,IJSIZEX2,NKU))
+    ALLOCATE(XLBYWM(IISIZEY2,IJSIZEY2,NKU))
+    ALLOCATE(XLBXTHM(IISIZEX2,IJSIZEX2,NKU))
+    ALLOCATE(XLBYTHM(IISIZEY2,IJSIZEY2,NKU))
+  END IF  
+  !
+  IF ( NRR > 0 ) THEN
+    IF (       LHORELAX_RV .OR. LHORELAX_RC .OR. LHORELAX_RR .OR. LHORELAX_RI    &
+          .OR. LHORELAX_RS .OR. LHORELAX_RG .OR. LHORELAX_RH                     &
+       ) THEN 
+      NSIZELBXR_ll=2*NRIMX+2*JPHEXT
+      NSIZELBYR_ll=2*NRIMY+2*JPHEXT
+      ALLOCATE(XLBXRM(IISIZEXF,IJSIZEXF,NKU,NRR))
+      ALLOCATE(XLBYRM(IISIZEYF,IJSIZEYF,NKU,NRR))
+    ELSE
+      NSIZELBXR_ll=2*JPHEXT    ! 2
+      NSIZELBYR_ll=2*JPHEXT    ! 2
+      ALLOCATE(XLBXRM(IISIZEX2,IJSIZEX2,NKU,NRR))
+      ALLOCATE(XLBYRM(IISIZEY2,IJSIZEY2,NKU,NRR))
+    ENDIF
+  ELSE
+    NSIZELBXR_ll=0
+    NSIZELBYR_ll=0
+    ALLOCATE(XLBXRM(0,0,0,0))
+    ALLOCATE(XLBYRM(0,0,0,0))
+  END IF
+  !
+  IF ( NSV > 0 ) THEN 
+    IF ( ANY( LHORELAX_SV(:)) ) THEN
+      NSIZELBXSV_ll=2*NRIMX+2*JPHEXT
+      NSIZELBYSV_ll=2*NRIMY+2*JPHEXT
+      ALLOCATE(XLBXSVM(IISIZEXF,IJSIZEXF,NKU,NSV))
+      ALLOCATE(XLBYSVM(IISIZEYF,IJSIZEYF,NKU,NSV))
+    ELSE
+      NSIZELBXSV_ll=2*JPHEXT    ! 2
+      NSIZELBYSV_ll=2*JPHEXT    ! 2
+      ALLOCATE(XLBXSVM(IISIZEX2,IJSIZEX2,NKU,NSV))
+      ALLOCATE(XLBYSVM(IISIZEY2,IJSIZEY2,NKU,NSV))
+    END IF
+  ELSE
+    NSIZELBXSV_ll=0
+    NSIZELBYSV_ll=0
+    ALLOCATE(XLBXSVM(0,0,0,0))
+    ALLOCATE(XLBYSVM(0,0,0,0))
+  END IF
+END IF
+!
+!
+!-------------------------------------------------------------------------------
+!
+!*       5.     INITIALIZE ALL THE MODEL VARIABLES
+!   	        ----------------------------------
+!
+!
+!*       5.1    Grid variables and RS localization:
+!
+!*       5.1.1  Horizontal Spatial grid :
+!
+IF( LEN_TRIM(CPGD_FILE) /= 0 ) THEN 
+!--------------------------------------------------------
+! the MESONH horizontal grid will be read in the PGD_FILE 
+!--------------------------------------------------------
+  CALL READ_HGRID(1,TPGDFILE,YPGD_NAME,YPGD_DAD_NAME,YPGD_TYPE)
+! control the cartesian option
+  IF( LCARTESIAN ) THEN
+     WRITE(NLUOUT,FMT=*) 'PREP_IDEAL_CASE : IN GENERAL, THE USE OF A PGD_FILE &
+                & IMPLIES THAT YOU MUST TAKE INTO ACCOUNT THE EARTH SPHERICITY'
+     WRITE(NLUOUT,FMT=*) 'NEVERTHELESS, LCARTESIAN HAS BEEN KEPT TO TRUE'
+  END IF   
+!
+!* use of the externalized surface
+!
+  CSURF = "EXTE"
+!
+! determine whether the model is flat or no
+!
+  ZZS_MAX = ABS( MAXVAL(XZS(NIB:NIU-JPHEXT,NJB:NJU-JPHEXT)))
+  CALL MPI_ALLREDUCE(ZZS_MAX, ZZS_MAX_ll, 1, MNHREAL_MPI, MPI_MAX,  &
+                     NMNH_COMM_WORLD,IINFO_ll)
+  IF( ABS(ZZS_MAX_ll)  < 1.E-10 ) THEN
+    LFLAT=.TRUE.
+  ELSE
+    LFLAT=.FALSE.
+  END IF
+!
+
+ELSE
+!------------------------------------------------------------------------
+! the MESONH horizontal grid is built from the PRE_IDEA1.nam informations
+!------------------------------------------------------------------------
+!
+  ALLOCATE(XXHAT(NIU),XYHAT(NJU))
+!
+! define the grid localization at the earth surface by the central point
+! coordinates
+!
+  IF (XLONCEN/=XUNDEF .OR. XLATCEN/=XUNDEF) THEN
+    IF (XLONCEN/=XUNDEF .AND. XLATCEN/=XUNDEF) THEN 
+!
+! it should be noted that XLATCEN and XLONCEN refer to a vertical
+! vorticity point and (XLATORI, XLONORI) refer to the mass point of
+! conformal coordinates (0,0). This is to allow the centering of the model in
+! a non-cyclic  configuration regarding to XLATCEN or XLONCEN.
+!
+      ALLOCATE(ZXHAT_ll(NIMAX_ll+2*JPHEXT),ZYHAT_ll(NJMAX_ll+2*JPHEXT))
+      ZXHAT_ll=0.
+      ZYHAT_ll=0.
+      CALL SM_LATLON(XLATCEN,XLONCEN,                     &
+                       -XDELTAX*(NIMAX_ll/2-0.5+JPHEXT),  &
+                       -XDELTAY*(NJMAX_ll/2-0.5+JPHEXT),  &
+                       XLATORI,XLONORI)
+        DEALLOCATE(ZXHAT_ll,ZYHAT_ll)
+!
+      WRITE(NLUOUT,FMT=*) 'PREP_IDEAL_CASE : XLATORI=' , XLATORI, &
+                          ' XLONORI= ', XLONORI
+    ELSE
+   !callabortstop
+      CALL PRINT_MSG(NVERB_FATAL,'GEN','PREP_IDEAL_CASE',&
+                     'latitude and longitude of the center point must be initialized alltogether or not')
+    END IF
+  END IF
+!
+  IF (NPROC > 1) THEN
+    CALL GET_DIM_EXT_ll('B',IXDIM,IYDIM)
+    IBEG = IXOR-JPHEXT-1
+    IEND = IBEG+IXDIM-1
+    XXHAT(:) = (/ (REAL(JLOOP)*XDELTAX, JLOOP=IBEG,IEND) /)
+    IBEG = IYOR-JPHEXT-1
+    IEND = IBEG+IYDIM-1
+    XYHAT(:) = (/ (REAL(JLOOP)*XDELTAY, JLOOP=IBEG,IEND) /)
+!
+  ELSE
+    XXHAT(:) = (/ (REAL(JLOOP-NIB)*XDELTAX, JLOOP=1,NIU) /)
+    XYHAT(:) = (/ (REAL(JLOOP-NJB)*XDELTAY, JLOOP=1,NJU) /)
+  END IF
+END IF
+!
+!*       5.1.2  Orography and Gal-Chen Sommerville transformation :
+!
+IF (    LEN_TRIM(CPGD_FILE) == 0  .OR. .NOT. LREAD_ZS) THEN
+  SELECT CASE(CZS)     ! 'FLAT' or 'SINE' or 'BELL'
+  CASE('FLAT')
+    LFLAT = .TRUE.
+    IF (XHMAX==XUNDEF) THEN
+      XZS(:,:) = 0.
+    ELSE
+      XZS(:,:) = XHMAX
+    END IF
+  CASE('SINE')       ! sinus-shaped orography 
+    IF (XHMAX==XUNDEF) XHMAX=300.
+    LFLAT    =.FALSE.
+    XZS(:,:) = XHMAX          &      ! three-dimensional case   
+    *SPREAD((/((SIN((XPI/(NIMAX_ll+2*JPHEXT-1))*JLOOP)**2)**NEXPX,JLOOP=IXOR-1,IXOR+NIU-2)/),2,NJU) &
+    *SPREAD((/((SIN((XPI/(NJMAX_ll+2*JPHEXT-1))*JLOOP)**2)**NEXPY,JLOOP=IYOR-1,IYOR+NJU-2)/),1,NIU)
+    IF(L1D) THEN                     ! one-dimensional case
+      XZS(:,:) = XHMAX 
+    END IF        
+  CASE('BELL')       ! bell-shaped orography 
+    IF (XHMAX==XUNDEF) XHMAX=300.
+    LFLAT = .FALSE.
+    IF(.NOT.L2D) THEN                ! three-dimensional case
+      XZS(:,:) = XHMAX  / ( 1.                                           &
+        + ( (SPREAD(XXHAT(1:NIU),2,NJU) - REAL(NIZS) * XDELTAX) /XAX ) **2  &
+        + ( (SPREAD(XYHAT(1:NJU),1,NIU) - REAL(NJZS) * XDELTAY) /XAY ) **2  ) **1.5
+    ELSE                             ! two-dimensional case
+      XZS(:,:) = XHMAX  / ( 1.                                          &
+        + ( (SPREAD(XXHAT(1:NIU),2,NJU) - REAL(NIZS) * XDELTAX) /XAX ) **2 )
+    ENDIF
+    IF(L1D) THEN                     ! one-dimensional case
+      XZS(:,:) = XHMAX 
+    END IF        
+  CASE('COSI')       ! (1+cosine)**4 shape
+    IF (XHMAX==XUNDEF) XHMAX=800.
+    LFLAT = .FALSE.
+    IF(L2D) THEN                     ! two-dimensional case
+      DO JILOOP = 1, NIU
+        ZDIST = XXHAT(JILOOP)-REAL(NIZS)*XDELTAX
+        IF( ABS(ZDIST)<(4.0*XAX) ) THEN
+          XZS(JILOOP,:) = (XHMAX/16.0)*( 1.0 + COS((XPI*ZDIST)/(4.0*XAX)) )**4
+        ELSE
+          XZS(JILOOP,:) = 0.0
+        ENDIF
+      END DO
+    ENDIF
+  CASE('SCHA')       ! exp(-(x/a)**2)*cosine(pi*x/lambda)**2 shape
+    IF (XHMAX==XUNDEF) XHMAX=800.
+    LFLAT = .FALSE.
+    IF(L2D) THEN                     ! two-dimensional case
+      DO JILOOP = 1, NIU
+        ZDIST = XXHAT(JILOOP)-REAL(NIZS)*XDELTAX
+        IF( ABS(ZDIST)<(4.0*XAX) ) THEN
+          XZS(JILOOP,:) = XHMAX*EXP(-(ZDIST/XAY)**2)*COS((XPI*ZDIST)/XAX)**2
+        ELSE
+          XZS(JILOOP,:) = 0.0
+        ENDIF
+      END DO
+    ENDIF
+  CASE('AGNE')       ! h*a**2/(x**2+a**2) shape
+    LFLAT = .FALSE.
+    IF(L2D) THEN                     ! two-dimensional case
+      DO JILOOP = 1, NIU
+        ZDIST = XXHAT(JILOOP)-REAL(NIZS)*XDELTAX
+          XZS(JILOOP,:) = XHMAX*(XAX**2)/(XAX**2+ZDIST**2)
+      END DO
+		ELSE		! three dimensionnal case - infinite profile in y direction
+			DO JILOOP = 1, NIU
+        ZDIST = XXHAT(JILOOP)-REAL(NIZS)*XDELTAX
+          XZS(JILOOP,:) = XHMAX*(XAX**2)/(XAX**2+ZDIST**2)
+      END DO
+    ENDIF
+
+  CASE('DATA')       ! discretized orography
+    LFLAT    =.FALSE.
+    WRITE(NLUOUT,FMT=*) 'CZS="DATA",   ATTEMPT TO READ ARRAY     &
+                    &XZS(NIB:NIU-JPHEXT:1,NJU-JPHEXT:NJB:-1) &
+                    &starting from the first index'
+    CALL POSKEY(NLUPRE,NLUOUT,'ZSDATA')
+    DO JJLOOP = NJMAX_ll+2*JPHEXT-1,JPHEXT+1,-1    ! input like a map prior the sounding
+      READ(NLUPRE,FMT=*) ZZS_ll
+      IF ( ( JJLOOP <= ( NJU-JPHEXT + IYOR-1 ) ) .AND. ( JJLOOP >= ( NJB + IYOR-1 ) ) ) THEN
+         IJ    = JJLOOP - ( IYOR-1 )
+         XZS(NIB:NIU-JPHEXT,IJ) = ZZS_ll(IXOR:IXOR + NIU-JPHEXT - NIB )
+      END IF
+    END DO
+!
+  CASE DEFAULT   ! undefined  shape of orography
+   !callabortstop
+    CALL PRINT_MSG(NVERB_FATAL,'GEN','PREP_IDEAL_CASE','erroneous ground type')
+  END SELECT
+!
+  CALL ADD2DFIELD_ll( TZ_FIELDS_ll, XZS, 'PREP_IDEAL_CASE::XZS' )
+  CALL UPDATE_HALO_ll(TZ_FIELDS_ll,IINFO_ll)
+  CALL CLEANLIST_ll(TZ_FIELDS_ll)
+!
+END IF
+!
+!IF( ( LEN_TRIM(CPGD_FILE) /= 0 ) .AND. .NOT.LFLAT .AND. &
+! ((CLBCX(1) /= "OPEN" ) .OR. &
+! (CLBCX(2) /= "OPEN" ) .OR. (CLBCY(1) /= "OPEN" ) .OR. &
+! (CLBCY(2) /= "OPEN" )) )  THEN 
+!   !callabortstop
+!  CALL PRINT_MSG(NVERB_FATAL,'GEN','PREP_IDEAL_CASE','with a PGD file, you cannot be in a cyclic LBC')
+!END IF
+!
+IF (LWEST_ll())  THEN
+  DO JILOOP = 1,JPHEXT
+    XZS(JILOOP,:) = XZS(NIB,:)
+  END DO
+END IF
+IF (LEAST_ll()) THEN
+  DO JILOOP = NIU-JPHEXT+1,NIU
+    XZS(JILOOP,:)=XZS(NIU-JPHEXT,:)
+  END DO
+END IF
+IF (LSOUTH_ll()) THEN
+  DO JJLOOP = 1,JPHEXT
+    XZS(:,JJLOOP)=XZS(:,NJB)
+  END DO
+END IF
+IF (LNORTH_ll()) THEN
+  DO JJLOOP =NJU-JPHEXT+1,NJU
+    XZS(:,JJLOOP)=XZS(:,NJU-JPHEXT)
+  END DO
+END IF
+!
+IF ( LEN_TRIM(CPGD_FILE) == 0  .OR. .NOT. LREAD_ZS) THEN
+  IF (LSLEVE) THEN
+    CALL ZSMT_PIC(NSLEVE,XSMOOTH_ZS)
+  ELSE
+    XZSMT(:,:) = 0.
+  END IF
+END IF
+!
+IF (LCARTESIAN) THEN
+  CALL SM_GRIDCART(XXHAT,XYHAT,XZHAT,XZS,LSLEVE,XLEN1,XLEN2,XZSMT,XDXHAT,XDYHAT,XZZ,XJ)
+  XMAP=1.
+ELSE
+  CALL SM_GRIDPROJ(XXHAT,XYHAT,XZHAT,XZS,LSLEVE,XLEN1,XLEN2,XZSMT,XLATORI,XLONORI, &
+                   XMAP,XLAT,XLON,XDXHAT,XDYHAT,XZZ,XJ)
+END IF
+!*       5.4.1  metrics coefficients and update halos:
+!
+CALL METRICS(XMAP,XDXHAT,XDYHAT,XZZ,XDXX,XDYY,XDZX,XDZY,XDZZ)
+!
+CALL UPDATE_METRICS(CLBCX,CLBCY,XDXX,XDYY,XDZX,XDZY,XDZZ)                         
+!
+!*       5.1.3  Compute the localization in index space of the vertical profile
+!               in CSTN and RSOU cases  :
+!
+IF (CTYPELOC =='LATLON' ) THEN  
+  IF (.NOT.LCARTESIAN) THEN                            ! compute (x,y) if 
+    CALL SM_XYHAT(XLATORI,XLONORI,                 &   ! the localization 
+                  XLATLOC,XLONLOC,XXHATLOC,XYHATLOC)   ! is given in latitude 
+  ELSE                                                 ! and longitude
+    WRITE(NLUOUT,FMT=*) 'CTYPELOC CANNOT BE LATLON IN CARTESIAN GEOMETRY'
+    WRITE(NLUOUT,FMT=*) '-> JOB ABORTED'
+   !callabortstop
+    CALL PRINT_MSG(NVERB_FATAL,'GEN','PREP_IDEAL_CASE','CTYPELOC cannot be LATLON in cartesian geometry')
+  END IF 
+END IF  
+!
+ALLOCATE(ZXHAT_ll(NIMAX_ll+ 2 * JPHEXT),ZYHAT_ll(NJMAX_ll+2 * JPHEXT))
+CALL GATHERALL_FIELD_ll('XX',XXHAT,ZXHAT_ll,NRESP) !//
+CALL GATHERALL_FIELD_ll('YY',XYHAT,ZYHAT_ll,NRESP) !//
+IF (CTYPELOC /= 'IJGRID') THEN                                               
+  NILOC = MINLOC(ABS(XXHATLOC-ZXHAT_ll(:)))
+  NJLOC = MINLOC(ABS(XYHATLOC-ZYHAT_ll(:)))
+END IF
+!
+IF ( L1D .AND. ( NILOC(1) /= 1 .OR. NJLOC(1) /= 1 ) ) THEN
+  NILOC = 1
+  NJLOC = 1
+  WRITE(NLUOUT,FMT=*) 'FOR 1D CONFIGURATION, THE RS INFORMATIONS ARE TAKEN AT &
+                      & I=1 AND J=1 (CENTRAL VERTICAL WITHOUT HALO)'
+END IF
+!
+IF ( L2D .AND. ( NJLOC(1) /= 1 ) ) THEN
+  NJLOC = 1
+  WRITE(NLUOUT,FMT=*) 'FOR 2D CONFIGURATION, THE RS INFORMATIONS ARE TAKEN AT &
+                      & J=1 (CENTRAL PLANE WITHOUT HALO)'
+END IF
+!
+!*       5.2    Prognostic variables (not multiplied by  rhoJ) : u,v,w,theta,r
+!               and 1D anelastic reference state
+!
+!
+!*       5.2.1  Use a Radiosounding : CIDEAL='RSOU''
+!
+IF (CIDEAL == 'RSOU') THEN
+  WRITE(NLUOUT,FMT=*) 'CIDEAL="RSOU", attempt to read DATE'
+  CALL POSKEY(NLUPRE,NLUOUT,'RSOU')
+  READ(NLUPRE,FMT=*)  NYEAR,NMONTH,NDAY,XTIME
+  TDTCUR = DATE_TIME(DATE(NYEAR,NMONTH,NDAY),XTIME)
+  TDTEXP = TDTCUR
+  TDTSEG = TDTCUR
+  TDTMOD = TDTCUR
+  WRITE(NLUOUT,FMT=*) 'CIDEAL="RSOU", ATTEMPT TO PROCESS THE SOUNDING DATA'
+  IF (LGEOSBAL) THEN
+    CALL SET_RSOU(TFILE_DUMMY,TZEXPREFILE,CFUNU,CFUNV,NILOC(1),NJLOC(1),LBOUSS, &
+                  XJ,LSHIFT,XCORIOZ)
+  ELSE
+    CALL SET_RSOU(TFILE_DUMMY,TZEXPREFILE,CFUNU,CFUNV,NILOC(1),NJLOC(1),LBOUSS, &
+                  XJ,LSHIFT)
+  END IF
+!
+!*       5.2.2  N=cste  and U(z) : CIDEAL='CSTN'
+!
+ELSE IF (CIDEAL == 'CSTN') THEN
+  WRITE(NLUOUT,FMT=*) 'CIDEAL="CSTN", attempt to read DATE'
+  CALL POSKEY(NLUPRE,NLUOUT,'CSTN')
+  READ(NLUPRE,FMT=*)  NYEAR,NMONTH,NDAY,XTIME
+  TDTCUR = DATE_TIME(DATE(NYEAR,NMONTH,NDAY),XTIME)
+  TDTEXP = TDTCUR
+  TDTSEG = TDTCUR
+  TDTMOD = TDTCUR
+  WRITE(NLUOUT,FMT=*) 'CIDEAL="CSTN", ATTEMPT TO PROCESS THE SOUNDING DATA'
+  IF (LGEOSBAL) THEN
+    CALL SET_CSTN(TFILE_DUMMY,TZEXPREFILE,CFUNU,CFUNV,NILOC(1),NJLOC(1),LBOUSS, &
+                  XJ,LSHIFT,XCORIOZ)
+  ELSE
+    CALL SET_CSTN(TFILE_DUMMY,TZEXPREFILE,CFUNU,CFUNV,NILOC(1),NJLOC(1),LBOUSS, &
+                  XJ,LSHIFT)
+  END IF
+!
+END IF 
+!
+!*       5.3    Forcing variables
+!
+IF (LFORCING) THEN
+  WRITE(NLUOUT,FMT=*) 'FORCING IS ENABLED, ATTEMPT TO SET FORCING FIELDS'
+  CALL POSKEY(NLUPRE,NLUOUT,'ZFRC ','PFRC')
+  CALL SET_FRC(TZEXPREFILE)
+END IF
+!
+!! ---------------------------------------------------------------------
+! Modif PP ADV FRC
+! 5.4.2 initialize profiles for adv forcings
+IF (L2D_ADV_FRC) THEN
+    WRITE(NLUOUT,FMT=*) 'L2D_ADV_FRC IS SET TO  TRUE'
+    WRITE(NLUOUT,FMT=*) 'ADVECTING FORCING USED IS USER MADE, NOT STANDARD ONE ' 
+    WRITE(NLUOUT,FMT=*) 'IT IS FOR 2D IDEALIZED WAM STUDY ONLY ' 
+   CALL POSKEY(NLUPRE,NLUOUT,'ZFRC_ADV')
+   CALL SET_ADVFRC(TZEXPREFILE)
+ENDIF
+IF (L2D_REL_FRC) THEN
+    WRITE(NLUOUT,FMT=*) 'L2D_REL_FRC IS SET TO  TRUE'
+    WRITE(NLUOUT,FMT=*) 'RELAXATION FORCING USED IS USER MADE, NOT STANDARD ONE ' 
+    WRITE(NLUOUT,FMT=*) 'IT IS FOR 2D IDEALIZED WAM STUDY ONLY ' 
+   CALL POSKEY(NLUPRE,NLUOUT,'ZFRC_REL')
+   CALL SET_RELFRC(TZEXPREFILE)
+ENDIF
+!*       5.4    3D Reference state variables :
+!
+!
+!*       5.4.1  metrics coefficients and update halos:
+!
+CALL METRICS(XMAP,XDXHAT,XDYHAT,XZZ,XDXX,XDYY,XDZX,XDZY,XDZZ)
+!
+CALL UPDATE_METRICS(CLBCX,CLBCY,XDXX,XDYY,XDZX,XDZY,XDZZ)
+!
+!*       5.4.2  3D reference state :
+!
+CALL SET_REF(0,TFILE_DUMMY,                        &
+             XZZ,XZHAT,XJ,XDXX,XDYY,CLBCX,CLBCY,   &
+             XREFMASS,XMASS_O_PHI0,XLINMASS,       &
+             XRHODREF,XTHVREF,XRVREF,XEXNREF,XRHODJ)
+!
+!
+!*       5.5.1  Absolute pressure :
+!
+!
+!*       5.5.2  Total mass of dry air Md computation :
+!
+CALL TOTAL_DMASS(XJ,XRHODREF,XDRYMASST)
+!
+!
+!*       5.6    Complete prognostic variables (multipliy by  rhoJ) at time t :
+!
+! U grid   : gridpoint 2
+IF (LWEST_ll())  XUT(1,:,:)    = 2.*XUT(2,:,:) - XUT(3,:,:)
+! V grid   : gridpoint 3
+IF (LSOUTH_ll())  XVT(:,1,:)    = 2.*XVT(:,2,:) - XVT(:,3,:)
+! SV : gridpoint 1
+XSVT(:,:,:,:) = 0.
+!
+!
+!*       5.7   Larger scale fields initialization :
+!
+XLSUM(:,:,:) = XUT(:,:,:)        ! these fields do not satisfy the 
+XLSVM(:,:,:) = XVT(:,:,:)        ! lower boundary condition but are 
+XLSWM(:,:,:) = XWT(:,:,:)        ! in equilibrium
+XLSTHM(:,:,:)= XTHT(:,:,:)
+XLSRVM(:,:,:)= XRT(:,:,:,1)
+!
+! enforce the vertical homogeneity under the ground and above the top of
+! the model for the LS fields
+!
+XLSUM(:,:,NKB-1)=XLSUM(:,:,NKB)
+XLSUM(:,:,NKU)=XLSUM(:,:,NKU-1)
+XLSVM(:,:,NKB-1)=XLSVM(:,:,NKB)
+XLSVM(:,:,NKU)=XLSVM(:,:,NKU-1)
+XLSWM(:,:,NKB-1)=XLSWM(:,:,NKB)
+XLSWM(:,:,NKU)=XLSWM(:,:,NKU-1)
+XLSTHM(:,:,NKB-1)=XLSTHM(:,:,NKB)
+XLSTHM(:,:,NKU)=XLSTHM(:,:,NKU-1)
+IF ( NRR > 0 ) THEN
+  XLSRVM(:,:,NKB-1)=XLSRVM(:,:,NKB)
+  XLSRVM(:,:,NKU)=XLSRVM(:,:,NKU-1)
+END IF
+!
+ILBX=SIZE(XLBXUM,1)
+ILBY=SIZE(XLBYUM,2)
+IF(LWEST_ll() .AND. .NOT. L1D) THEN
+  XLBXUM(1:NRIMX+JPHEXT,        :,:)     = XUT(2:NRIMX+JPHEXT+1,        :,:)
+  XLBXVM(1:NRIMX+JPHEXT,        :,:)     = XVT(1:NRIMX+JPHEXT,        :,:)
+  XLBXWM(1:NRIMX+JPHEXT,        :,:)     = XWT(1:NRIMX+JPHEXT,        :,:)
+  XLBXTHM(1:NRIMX+JPHEXT,        :,:)   = XTHT(1:NRIMX+JPHEXT,        :,:)
+  XLBXRM(1:NRIMX+JPHEXT,        :,:,:)   = XRT(1:NRIMX+JPHEXT,        :,:,:)
+ENDIF
+IF(LEAST_ll() .AND. .NOT. L1D) THEN
+  XLBXUM(ILBX-NRIMX-JPHEXT+1:ILBX,:,:)     = XUT(NIU-NRIMX-JPHEXT+1:NIU,    :,:)
+  XLBXVM(ILBX-NRIMX-JPHEXT+1:ILBX,:,:)     = XVT(NIU-NRIMX-JPHEXT+1:NIU,    :,:)
+  XLBXWM(ILBX-NRIMX-JPHEXT+1:ILBX,:,:)     = XWT(NIU-NRIMX-JPHEXT+1:NIU,    :,:)
+  XLBXTHM(ILBX-NRIMX-JPHEXT+1:ILBX,:,:)   = XTHT(NIU-NRIMX-JPHEXT+1:NIU,    :,:)
+  XLBXRM(ILBX-NRIMX-JPHEXT+1:ILBX,:,:,:)   = XRT(NIU-NRIMX-JPHEXT+1:NIU,    :,:,:)
+ENDIF
+IF(LSOUTH_ll() .AND. .NOT. L1D .AND. .NOT. L2D) THEN
+  XLBYUM(:,1:NRIMY+JPHEXT,        :)     = XUT(:,1:NRIMY+JPHEXT,      :)
+  XLBYVM(:,1:NRIMY+JPHEXT,        :)     = XVT(:,2:NRIMY+JPHEXT+1,      :)
+  XLBYWM(:,1:NRIMY+JPHEXT,        :)     = XWT(:,1:NRIMY+JPHEXT,  :)
+  XLBYTHM(:,1:NRIMY+JPHEXT,        :)    = XTHT(:,1:NRIMY+JPHEXT,      :)
+  XLBYRM(:,1:NRIMY+JPHEXT,        :,:)   = XRT(:,1:NRIMY+JPHEXT,      :,:)
+ENDIF
+IF(LNORTH_ll().AND. .NOT. L1D .AND. .NOT. L2D) THEN
+  XLBYUM(:,ILBY-NRIMY-JPHEXT+1:ILBY,:)     = XUT(:,NJU-NRIMY-JPHEXT+1:NJU,  :)
+  XLBYVM(:,ILBY-NRIMY-JPHEXT+1:ILBY,:)     = XVT(:,NJU-NRIMY-JPHEXT+1:NJU,  :)
+  XLBYWM(:,ILBY-NRIMY-JPHEXT+1:ILBY,:)     = XWT(:,NJU-NRIMY-JPHEXT+1:NJU,  :)
+  XLBYTHM(:,ILBY-NRIMY-JPHEXT+1:ILBY,:)    = XTHT(:,NJU-NRIMY-JPHEXT+1:NJU,  :)
+  XLBYRM(:,ILBY-NRIMY-JPHEXT+1:ILBY,:,:)   = XRT(:,NJU-NRIMY-JPHEXT+1:NJU,  :,:)
+ENDIF
+DO JSV = 1, NSV
+  IF(LWEST_ll() .AND. .NOT. L1D) &
+  XLBXSVM(1:NRIMX+JPHEXT,        :,:,JSV)   = XSVT(1:NRIMX+JPHEXT,        :,:,JSV)
+  IF(LEAST_ll() .AND. .NOT. L1D) &
+  XLBXSVM(ILBX-NRIMX-JPHEXT+1:ILBX,:,:,JSV)   = XSVT(NIU-NRIMX-JPHEXT+1:NIU,    :,:,JSV)
+  IF(LSOUTH_ll() .AND. .NOT. L1D .AND. .NOT. L2D) &
+  XLBYSVM(:,1:NRIMY+JPHEXT,        :,JSV)   = XSVT(:,1:NRIMY+JPHEXT,      :,JSV)
+  IF(LNORTH_ll() .AND. .NOT. L1D .AND. .NOT. L2D) &
+  XLBYSVM(:,ILBY-NRIMY-JPHEXT+1:ILBY,:,JSV)   = XSVT(:,NJU-NRIMY-JPHEXT+1:NJU,  :,JSV)
+END DO
+!
+!
+!*       5.8   Add a perturbation to a basic state :
+!
+IF(LPERTURB) CALL SET_PERTURB(TZEXPREFILE)
+!
+!
+!*       5.9   Anelastic correction and pressure:
+!
+IF (.NOT.LOCEAN) THEN
+  CALL ICE_ADJUST_BIS(XPABST,XTHT,XRT)
+  IF ( .NOT. L1D ) CALL PRESSURE_IN_PREP(XDXX,XDYY,XDZX,XDZY,XDZZ)
+  CALL ICE_ADJUST_BIS(XPABST,XTHT,XRT)
+END IF
+!
+!
+!*       5.10  Compute THETA, vapor and cloud mixing ratio
+!
+IF (CIDEAL == 'RSOU') THEN
+    ALLOCATE(ZEXN(NIU,NJU,NKU))         
+  ALLOCATE(ZT(NIU,NJU,NKU))  
+  ALLOCATE(ZTHL(NIU,NJU,NKU))              
+  ALLOCATE(ZRT(NIU,NJU,NKU))              
+  ALLOCATE(ZCPH(NIU,NJU,NKU))        
+  ALLOCATE(ZLVOCPEXN(NIU,NJU,NKU))        
+  ALLOCATE(ZLSOCPEXN(NIU,NJU,NKU))  
+  ALLOCATE(ZFRAC_ICE(NIU,NJU,NKU))
+  ALLOCATE(ZRSATW(NIU,NJU,NKU))
+  ALLOCATE(ZRSATI(NIU,NJU,NKU))             
+  ZRT=XRT(:,:,:,1)+XRT(:,:,:,2)+XRT(:,:,:,4)
+IF (LOCEAN) THEN
+  ZEXN(:,:,:)= 1.
+  ZT=XTHT
+  ZTHL=XTHT
+  ZCPH=XCPD+ XCPV * XRT(:,:,:,1)
+  ZLVOCPEXN = XLVTT
+  ZLSOCPEXN = XLSTT
+ELSE
+  ZEXN=(XPABST/XP00) ** (XRD/XCPD)
+  ZT=XTHT*(XPABST/XP00)**(XRD/XCPD)
+  ZCPH=XCPD+ XCPV * XRT(:,:,:,1)+ XCL *XRT(:,:,:,2)  + XCI * XRT(:,:,:,4)
+  ZLVOCPEXN = (XLVTT + (XCPV-XCL) * (ZT-XTT))/(ZCPH*ZEXN)
+  ZLSOCPEXN = (XLSTT + (XCPV-XCI) * (ZT-XTT))/(ZCPH*ZEXN)
+  ZTHL=XTHT-ZLVOCPEXN*XRT(:,:,:,2)-ZLSOCPEXN*XRT(:,:,:,4)
+  CALL TH_R_FROM_THL_RT_3D('T',ZFRAC_ICE,XPABST,ZTHL,ZRT,XTHT,XRT(:,:,:,1), &
+                            XRT(:,:,:,2),XRT(:,:,:,4),ZRSATW, ZRSATI)
+END IF
+  DEALLOCATE(ZEXN)         
+  DEALLOCATE(ZT)       
+  DEALLOCATE(ZCPH)        
+  DEALLOCATE(ZLVOCPEXN)        
+  DEALLOCATE(ZLSOCPEXN)
+  DEALLOCATE(ZTHL) 
+  DEALLOCATE(ZRT)
+! Coherence test
+  IF ((.NOT. LUSERI) ) THEN
+    IF (MAXVAL(XRT(:,:,:,4))/= 0) THEN
+       WRITE(NLUOUT,FMT=*) "*********************************"             
+       WRITE(NLUOUT,FMT=*) 'WARNING'      
+       WRITE(NLUOUT,FMT=*) 'YOU HAVE LUSERI=FALSE '
+       WRITE(NLUOUT,FMT=*) ' BUT WITH YOUR RADIOSOUNDING Ri/=0'
+       WRITE(NLUOUT,FMT=*) MINVAL(XRT(:,:,:,4)),MAXVAL(XRT(:,:,:,4))
+       WRITE(NLUOUT,FMT=*) "*********************************"       
+    ENDIF  
+  ENDIF
+  IF ((.NOT. LUSERC)) THEN
+    IF (MAXVAL(XRT(:,:,:,2))/= 0) THEN          
+      WRITE(NLUOUT,FMT=*) "*********************************"
+      WRITE(NLUOUT,FMT=*) 'WARNING'    
+      WRITE(NLUOUT,FMT=*) 'YOU HAVE LUSERC=FALSE '
+      WRITE(NLUOUT,FMT=*) 'BUT WITH YOUR RADIOSOUNDING RC/=0'
+      WRITE(NLUOUT,FMT=*) MINVAL(XRT(:,:,:,2)),MAXVAL(XRT(:,:,:,2))      
+      WRITE(NLUOUT,FMT=*) "*********************************"
+    ENDIF  
+  ENDIF
+      ! on remet les bonnes valeurs pour NRR
+  IF(CCLOUD=='NONE') NRR=1
+  IF(CCLOUD=='REVE') NRR=2
+END IF
+!
+!-------------------------------------------------------------------------------
+!
+!*  	 6.    INITIALIZE SCALAR VARIABLES FOR CHEMISTRY
+!   	       -----------------------------------------
+!
+!  before calling chemistry
+CCONF = 'START'
+CSTORAGE_TYPE='TT'                  
+CALL IO_File_close(TZEXPREFILE)  ! Close the EXPRE file
+!
+IF ( LCH_INIT_FIELD ) CALL CH_INIT_FIELD_n(1, NLUOUT, NVERB)
+!
+!-------------------------------------------------------------------------------
+!
+!*  	 7.    INITIALIZE LEVELSET FOR IBM
+!   	       ---------------------------
+!
+IF (LIBM_LSF) THEN
+  !
+  ! In their current state, the IBM can only be used in
+  ! combination with cartesian coordinates and flat orography.
+  !
+  IF ((CZS.NE."FLAT").OR.(.NOT.LCARTESIAN)) THEN
+    CALL PRINT_MSG(NVERB_FATAL,'GEN','PREP_IDEAL_CASE','IBM can only be used with flat ground')
+  ENDIF
+  !
+  ALLOCATE(XIBM_LS(NIU,NJU,NKU,4))
+  !
+  CALL IBM_INIT_LS(XIBM_LS)
+  !
+ENDIF
+!
+!-------------------------------------------------------------------------------
+!
+!*   	 8.    WRITE THE FMFILE 
+!   	       ----------------
+!
+CALL SECOND_MNH2(ZTIME1)
+!
+NNPRAR = 22 + 2*(NRR+NSV)   &    ! 22 = number of grid variables + reference 
+       + 8 + 17                  ! state variables + dimension variables
+                                 ! 2*(8+NRR+NSV) + 1 = number of prognostic
+                                 ! variables at time t and t-dt
+NTYPE=1
+!
+CALL IO_File_add2list(TINIFILE,TRIM(CINIFILE),'MNH','WRITE',KLFINPRAR=NNPRAR,KLFITYPE=NTYPE,KLFIVERB=NVERB)
+!
+CALL IO_File_open(TINIFILE)
+!
+CALL IO_Header_write(TINIFILE)
+!
+CALL WRITE_DESFM_n(1,TINIFILE)
+!
+CALL WRITE_LFIFM_n(TINIFILE,'')  ! There is no DAD model for PREP_IDEAL_CASE
+!
+CALL SECOND_MNH2(ZTIME2)
+!
+XT_STORE = XT_STORE + ZTIME2 - ZTIME1
+!
+!-------------------------------------------------------------------------------
+!
+!*     9.     EXTERNALIZED SURFACE
+!             --------------------
+!
+!
+IF (CSURF =='EXTE') THEN
+  IF (LEN_TRIM(CINIFILEPGD)==0) THEN
+    IF (LEN_TRIM(CPGD_FILE)/=0) THEN
+      CINIFILEPGD=CPGD_FILE
+    ELSE
+      !callabortstop
+      CALL PRINT_MSG(NVERB_FATAL,'GEN','PREP_IDEAL_CASE','CINIFILEPGD needed in NAM_LUNITn')
+    ENDIF      
+  ENDIF
+  CALL SURFEX_ALLOC_LIST(1)
+  YSURF_CUR => YSURF_LIST(1)
+  CALL READ_ALL_NAMELISTS(YSURF_CUR,'MESONH','PRE',.FALSE.)              
+  ! Switch to model 1 surface variables
+  CALL GOTO_SURFEX(1)
+  !* definition of physiographic fields
+  ! computed ...
+  IF (LEN_TRIM(CPGD_FILE)==0 .OR. .NOT. LREAD_GROUND_PARAM) THEN
+    TPGDFILE => TINIFILE
+    CALL PGD_GRID_SURF_ATM(YSURF_CUR%UG, YSURF_CUR%U,YSURF_CUR%GCP,'MESONH',TINIFILE%CNAME,'MESONH',.TRUE.,HDIR='-')
+    CALL PGD_SURF_ATM     (YSURF_CUR,'MESONH',TINIFILE%CNAME,'MESONH',.TRUE.)
+    CALL IO_File_add2list(TINIFILEPGD,TRIM(CINIFILEPGD),'PGD','WRITE',KLFINPRAR=NNPRAR,KLFITYPE=NTYPE,KLFIVERB=NVERB)
+    CALL IO_File_open (TINIFILEPGD)
+    TPGDFILE => TINIFILEPGD
+  ELSE
+  ! ... or read from file.
+    CALL INIT_PGD_SURF_ATM( YSURF_CUR, 'MESONH', 'PGD',               &
+                            '                            ', '      ', &
+                            TDTCUR%nyear, TDTCUR%nmonth,              &
+                            TDTCUR%nday, TDTCUR%xtime                 )
+!
+  END IF
+  !
+  !* forces orography from atmospheric file
+  IF (.NOT. LREAD_ZS) CALL MNHPUT_ZS_n
+  !
+  ! on ecrit un nouveau fichier PGD que s'il n'existe pas
+  IF (LEN_TRIM(CPGD_FILE)==0 .OR. .NOT. LREAD_GROUND_PARAM) THEN
+    !* writing of physiographic fields in the file
+    CSTORAGE_TYPE='PG'
+    !
+    CALL IO_Header_write(TINIFILEPGD)
+    CALL IO_Field_write(TINIFILEPGD,'JPHEXT', JPHEXT)    
+    CALL IO_Field_write(TINIFILEPGD,'SURF','EXTE')
+    CALL IO_Field_write(TINIFILEPGD,'L1D', L1D)
+    CALL IO_Field_write(TINIFILEPGD,'L2D', L2D)
+    CALL IO_Field_write(TINIFILEPGD,'PACK',LPACK)
+    CALL WRITE_HGRID(1,TINIFILEPGD)
+    !
+    TOUTDATAFILE => TINIFILEPGD
+    !
+    TFILE_SURFEX => TINIFILEPGD
+    ALLOCATE(YSURF_CUR%DUO%CSELECT(0))    
+    CALL WRITE_PGD_SURF_ATM_n(YSURF_CUR,'MESONH')
+    NULLIFY(TFILE_SURFEX)
+    CSTORAGE_TYPE='TT'
+  ENDIF
+  !
+  !
+  !* rereading of physiographic fields and definition of prognostic fields
+  !* writing of all surface fields
+  TOUTDATAFILE => TINIFILE
+  TFILE_SURFEX => TINIFILE
+  CALL PREP_SURF_MNH('                            ','      ')
+  NULLIFY(TFILE_SURFEX)
+ELSE
+  CSURF = "NONE"
+END IF
+!
+!-------------------------------------------------------------------------------
+!
+!*     10.     CLOSES THE FILE
+!             ---------------
+!
+IF (CSURF =='EXTE' .AND. (LEN_TRIM(CPGD_FILE)==0 .OR. .NOT. LREAD_GROUND_PARAM)) THEN
+  CALL IO_File_close(TINIFILEPGD)
+ENDIF
+CALL IO_File_close(TINIFILE)
+IF( LEN_TRIM(CPGD_FILE) /= 0 ) THEN
+  CALL IO_File_close(TPGDFILE)
+ENDIF
+!
+!
+!-------------------------------------------------------------------------------
+!
+!*      11.    PRINTS ON OUTPUT-LISTING
+!              ------------------------
+!
+IF (NVERB >= 5) THEN
+  WRITE(NLUOUT,FMT=*) 'PREP_IDEAL_CASE: LCARTESIAN,CIDEAL,CZS=', &
+                                    LCARTESIAN,CIDEAL,CZS 
+  WRITE(NLUOUT,FMT=*) 'PREP_IDEAL_CASE: LUSERV=',LUSERV
+  WRITE(NLUOUT,FMT=*) 'PREP_IDEAL_CASE: XLON0,XLAT0,XBETA,XRPK,XLONORI,XLATORI=', &
+                                    XLON0,XLAT0,XBETA,XRPK,XLONORI,XLATORI
+  WRITE(NLUOUT,FMT=*) 'PREP_IDEAL_CASE: XDELTAX,XDELTAY=',XDELTAX,XDELTAY
+  WRITE(NLUOUT,FMT=*) 'PREP_IDEAL_CASE: NVERB=',NVERB
+  IF(LCARTESIAN) THEN
+    WRITE(NLUOUT,FMT=*) 'PREP_IDEAL_CASE: No map projection used.'
+  ELSE
+    IF (XRPK == 1.) THEN
+      WRITE(NLUOUT,FMT=*) 'PREP_IDEAL_CASE: Polar stereo used.'
+    ELSE IF (XRPK == 0.) THEN
+      WRITE(NLUOUT,FMT=*) 'PREP_IDEAL_CASE: Mercator used.'
+    ELSE
+      WRITE(NLUOUT,FMT=*) 'PREP_IDEAL_CASE: Lambert used, cone factor=',XRPK 
+    END IF
+  END IF
+END IF
+!
+IF (NVERB >= 5) THEN
+  WRITE(NLUOUT,FMT=*) 'PREP_IDEAL_CASE: IIB, IJB, IKB=',NIB,NJB,NKB
+  WRITE(NLUOUT,FMT=*) 'PREP_IDEAL_CASE: IIU, IJU, IKU=',NIU,NJU,NKU
+END IF
+!
+!
+!*       28.1   print statistics!
+!
+  !
+  CALL SECOND_MNH2(ZTIME2)
+  XT_START=XT_START+ZTIME2-ZEND
+  !
+  ! Set File Timing OUTPUT
+  !
+  CALL SET_ILUOUT_TIMING(TLUOUT0)
+  !
+  ! Compute global time
+  !
+  CALL TIME_STAT_ll(XT_START,ZTOT)
+  !
+  !
+  IMI = 1
+  CALL TIME_HEADER_ll(IMI)
+  !
+  CALL TIME_STAT_ll(XT_STORE,ZTOT,      ' STORE-FIELDS','=')
+  CALL  TIMING_SEPARATOR('+')
+  CALL  TIMING_SEPARATOR('+')  
+  WRITE(YMI,FMT="(I0)") IMI
+  CALL TIME_STAT_ll(XT_START,ZTOT,      ' MODEL'//YMI,'+')
+  CALL  TIMING_SEPARATOR('+')
+  CALL  TIMING_SEPARATOR('+')
+  CALL  TIMING_SEPARATOR('+')
+WRITE(NLUOUT,FMT=*) ' '
+WRITE(NLUOUT,FMT=*) '****************************************************'
+WRITE(NLUOUT,FMT=*) '* PREP_IDEAL_CASE: PREP_IDEAL_CASE ENDS CORRECTLY. *'
+WRITE(NLUOUT,FMT=*) '****************************************************'
+!
+CALL FINALIZE_MNH()
+!
+END PROGRAM PREP_IDEAL_CASE
diff --git a/src/mesonh/ext/set_rsou.f90 b/src/mesonh/ext/set_rsou.f90
new file mode 100644
index 000000000..c0aca1504
--- /dev/null
+++ b/src/mesonh/ext/set_rsou.f90
@@ -0,0 +1,1633 @@
+!MNH_LIC Copyright 1994-2021 CNRS, Meteo-France and Universite Paul Sabatier
+!MNH_LIC This is part of the Meso-NH software governed by the CeCILL-C licence
+!MNH_LIC version 1. See LICENSE, CeCILL-C_V1-en.txt and CeCILL-C_V1-fr.txt
+!MNH_LIC for details. version 1.
+!-----------------------------------------------------------------
+!     ####################
+      MODULE MODI_SET_RSOU
+!     ####################
+!
+INTERFACE
+!
+      SUBROUTINE SET_RSOU(TPFILE,TPEXPREFILE,HFUNU,HFUNV,KILOC,KJLOC,OBOUSS,&
+                          PJ,OSHIFT,PCORIOZ)
+!
+USE MODD_IO, ONLY : TFILEDATA
+!
+TYPE(TFILEDATA),        INTENT(IN)  :: TPFILE ! outpput data file
+TYPE(TFILEDATA),        INTENT(IN)  :: TPEXPREFILE ! input data file
+CHARACTER(LEN=*),       INTENT(IN)  :: HFUNU  ! type of variation of U
+                                              ! in y direction
+CHARACTER(LEN=*),       INTENT(IN)  :: HFUNV  ! type of variation of V
+                                              ! in x direction
+INTEGER,                INTENT(IN)  :: KILOC  ! I Localisation of vertical profile
+INTEGER,                INTENT(IN)  :: KJLOC  ! J Localisation of vertical profile
+LOGICAL,                INTENT(IN)  :: OBOUSS ! logical switch for Boussinesq version
+REAL, DIMENSION(:,:,:), INTENT(IN) :: PJ ! jacobien 
+LOGICAL,                INTENT(IN)  :: OSHIFT ! logical switch for vertical shift
+!
+REAL, DIMENSION(:,:,:), INTENT(OUT), OPTIONAL :: PCORIOZ ! Coriolis parameter
+                                               ! (exceptionnaly 3D array)
+!
+END SUBROUTINE SET_RSOU
+!
+END INTERFACE
+!
+END MODULE MODI_SET_RSOU
+!
+!     ########################################################################
+      SUBROUTINE SET_RSOU(TPFILE,TPEXPREFILE,HFUNU,HFUNV,KILOC,KJLOC,OBOUSS, &
+                          PJ,OSHIFT,PCORIOZ)
+!     ########################################################################
+!
+!!****  *SET_RSOU * -  to initialize mass fiels from a radiosounding 
+!!
+!!    PURPOSE
+!!    -------
+!       The purpose of this routine is  to initialize the mass field (theta,r,
+!     thetavrefz,rhorefz) on model grid from a radiosounding located at point 
+!     (KILOC,KJLOC).
+!
+!        The free-formatted part of EXPRE file contains the radiosounding data.The data 
+!     are stored in following order :
+!        
+!         - year,month,day, time (these variables are read in PREINIT program)
+!         - kind of data in EXPRE file (see below for more explanations about
+!                                       YKIND)
+!         - ZGROUND
+!         - PGROUND
+!         - temperature variable at ground ( depending on the data Kind )
+!         - moist variable  at ground ( depending on the data Kind )
+!         - number of wind data levels  ( variable ILEVELU)
+!         - height  ,  dd  , ff   |
+!            or           or      |  ILEVELU times
+!           pressure,  U   , V    |
+!         - number of mass levels  ( variable ILEVELM), including the ground
+!           level
+!         - height  ,  T  ,          Td              |
+!            or        or            or              |  (ILEVELM-1) times
+!           pressure,  THeta_Dry  , Mixing Ratio     |
+!                      or            or              |
+!                      THeta_V    , relative HUmidity|  
+!
+!       NB : the first mass level is at ground
+! 
+!       The following kind of data  is permitted :
+!                  YKIND = 'STANDARD'  :   ZGROUND, PGROUND, TGROUND, TDGROUND
+!                                         (Pressure, dd, ff) , 
+!                                         (Pressure, T, Td)
+!                  YKIND = 'PUVTHVMR'  : zGROUND, PGROUND, ThvGROUND, RGROUND
+!                                        (Pressure, U, V) , 
+!                                        (Pressure, THv, R)
+!                  YKIND = 'PUVTHVHU'  :  zGROUND, PGROUND, ThvGROUND, HuGROUND
+!                                         (Pressure, U, V) , 
+!                                         (Pressure, THv, Hu)
+!                  YKIND = 'ZUVTHVHU'  :  zGROUND, PGROUND, ThvGROUND, HuGROUND
+!                                         (height, U, V) , 
+!                                         (height, THv, Hu)
+!                  YKIND = 'ZUVTHVMR'  :  zGROUND, PGROUND, ThvGROUND, RGROUND
+!                                         (height, U, V) , 
+!                                         (height, THv, R)
+!                  YKIND = 'PUVTHDMR'  : zGROUND, PGROUND, ThdGROUND, RGROUND
+!                                         (Pressure, U, V) , 
+!                                         (Pressure, THd, R)
+!                  YKIND = 'PUVTHDHU'  : zGROUND, PGROUND, ThdGROUND, HuGROUND
+!                                         (Pressure, U, V) , 
+!                                         (Pressure, THd, Hu)
+!                  YKIND = 'ZUVTHDMR'  :  zGROUND, PGROUND, ThdGROUND,
+!                  RGROUND
+!                                         (height, U, V) , 
+!                                         (height, THd, R)
+!                  YKIND = 'PUVTHU'  :   ZGROUND, PGROUND, TGROUND, HuGROUND
+!                                         (Pressure, U, V) , 
+!                                         (Pressure, T, Hu)
+!
+!  For ocean-LES case  the following kind of data is permitted
+!         
+!                  YKIND = 'IDEALOCE' : ZGROUND (Water depth),PGROUND(Sfc Atmos Press),
+!                                        TGROUND (SST), RGROUND (SSS)
+!                                         (Depth , U, V) starting from sfc   
+!                                         (Depth,  T, S)
+!                                     (Time, LE, H, SW_d,SW_u,LW_d,LW_u,Stress_X,Stress_Y)
+!
+!                  YKIND = 'STANDOCE' :  (Depth , Temp, Salinity, U, V) starting from sfc   
+!                                        (Time, LE, H, SW_d,SW_u,LW_d,LW_u,Stress_X,Stress_Y)     
+!        
+!!**  METHOD
+!!    ------
+!!      The radiosounding is first read, then data are converted in order to
+!!    always obtain  the following variables  (case YKIND = 'ZUVTHVMR') :
+!!       (height,U,V) and (height,Thetav,r) which are the model variables.
+!!      That is to say : 
+!!         - YKIND = 'STANDARD' : 
+!!           dd,ff converted in U,V
+!!           Td + pressure ----> r
+!!           T,r ---> Tv  + pressure ----> thetav
+!!           Pressure + thetav + ZGROUND ----> height (for mass levels)
+!!           Thetav at mass levels ----> thetav at wind levels
+!!           Pressure + thetav + ZGROUND + PGROUND ---->height (for wind levels)
+!!         - YKIND = 'PUVTHVMR' : 
+!!           Pressure + thetav + ZGROUND ----> height (for mass levels)
+!!           Thetav at mass levels ----> thetav at wind levels
+!!           Pressure + thetav + ZGROUND + PGROUND ---->height (for wind levels)
+!!         - YKIND = 'PUVTHVHU' : 
+!!           thetav + pressure ----> Tv +pressure +Hu ----> r 
+!!           Pressure + thetav + ZGROUND ----> height (for mass levels)
+!!           Thetav at mass levels ----> thetav at wind levels
+!!           Pressure + thetav + ZGROUND + PGROUND ---->height (for wind levels)
+!!         - YKIND = 'ZUVTHVHU' : 
+!!           height +thetav + PGROUND -----> pressure (for mass levels)
+!!           thetav + pressure ----> Tv +pressure +Hu ----> r 
+!!         - YKIND = 'PUVTHDVMR' : 
+!!           thetad + r ----> thetav
+!!           pressure + thetav + ZGROUND ----> height (for mass levels)
+!!           Thetav at mass levels ----> thetav at wind levels
+!!           Pressure + thetav + ZGROUND + PGROUND ---->height (for wind levels)
+!!         - YKIND = 'PUVTHDHU' :  
+!!           thetad + pressure -----> T
+!!           T + pressure + Hu -----> r 
+!!           thetad + r -----> thetav
+!!           pressure + thetav + ZGROUND ----> height (for mass levels)
+!!           Thetav at mass levels ----> thetav at wind levels
+!!           Pressure + thetav + ZGROUND + PGROUND ---->height (for wind levels)
+!!         - YKIND = 'ZUVTHDHU' :  
+!!           thetad + r -----> thetav
+!!         - YKIND = 'PUVTHU' :  
+!!           T + pressure -----> thetad
+!!           T + pressure + Hu  -----> r
+!!           thetad + r -----> thetav
+!!           pressure + thetav + ZGROUND ----> height (for mass levels)
+!!           Thetav at mass levels ----> thetav at wind levels
+!!           
+!!      The following basic formula are used :
+!!                Rd  es(Td)
+!!            r = --  ----------
+!!                Rv  P - es(Td)
+!!
+!!                 1 + (Rv/Rd) r
+!!            Tv = --------------  T  
+!!                    1 + r
+!!
+!!                          P00    Rd/Cpd             1 + (Rv/Rd) r
+!!            Thetav = Tv ( ---- )         = Thetad ( --------------)
+!!                           P                           1 + r
+!!       The integration of hydrostatic relation is used to compute height from
+!!   pressure  and vice-versa. This is done by HEIGHT_PRESS and PRESS_HEIGHT 
+!!   routines.  
+!!   
+!!      Then, these data are interpolated on a vertical grid which is  
+!!    a mixed grid calaculated with VERT_COORD from the vertical levels of MNH
+!!    grid and with a constant ororgraphy equal to the altitude of the vertical
+!!    profile (ZZGROUND) (It permits to keep low levels information with a
+!!    shifting function (as in PREP_REAL_CASE))
+!!
+!!      Then, the 3D mass and wind fields are deduced in SET_MASS
+!!     
+!!
+!!    EXTERNAL
+!!    --------
+!!      SET_MASS : to compute mass field on 3D-model grid
+!!      Module MODE_THERMO : contains thermodynamic routines
+!!         SM_FOES : To compute saturation vapor pressure from 
+!!                   temperature
+!!         SM_PMR_HU : to compute vapor mixing ratio from pressure, virtual
+!!                    temperature and relative humidity
+!!      HEIGHT_PRESS : to compute height from pressure and thetav 
+!!                    by integration of hydrostatic relation
+!!      PRESS_HEIGHT : to compute pressure from height and thetav
+!!                    by integration of hydrostatic relation
+!!      THETAVPU_THETAVPM : to interpolate thetav on wind levels
+!!                          from thetav on mass levels
+!!
+!!      Module MODI_HEIGHT_PRESS      : interface for function HEIGHT_PRESS
+!!      Module MODI_PRESS_HEIGHT      : interface for function PRESS_HEIGHT
+!!      Module MODI_THETAVPU_THETAVPM : interface for function
+!!                                      THETAVPU_THETVPM
+!!      Module MODI_SET_MASS          : interface for subroutine SET_MASS
+!!
+!!    IMPLICIT ARGUMENTS
+!!    ------------------
+!!      Module MODD_CST     : contains physical constants
+!!        XPI  : Pi
+!!        XRV  : Gas constant for vapor 
+!!        XRD  : Gas constant for dry air
+!!        XCPD : Specific heat for dry air at constant pressure
+!!
+!!      Module MODD_LUNIT1  : contains logical unit names 
+!!        TLUOUT : name of output-listing
+!!
+!!      Module MODD_CONF    : contains configuration variables for all models. 
+!!        NVERB : verbosity level for output-listing
+!!
+!!      Module MODD_GRID1  : contains grid variables
+!!        XZHAT : height of w-levels of vertical model grid without orography
+!!
+!!    REFERENCE
+!!    ---------
+!!      Book2 of MESO-NH documentation (routine SET_RSOU)
+!!    
+!!
+!!    AUTHOR
+!!    ------
+!!	V. Ducrocq       * Meteo France *
+!!
+!!    MODIFICATIONS
+!!    -------------
+!!      Original    25/08/94
+!!      J.Stein     06/12/94  change the way to prescribe the horizontal wind
+!!                            variations + cleaning
+!!      J.Stein     18/01/95  bug corrections in the ILEVELM readings
+!!      J.Stein     16/04/95  put the same names of the declarative modules
+!!                            in the descriptive part
+!!      J.Stein     30/01/96  use the RS ground pressure to initialize the
+!!                            hydrostatic pressure computation
+!!      V.Masson    02/09/96  add allocation of ZTHVU in two cases
+!!      P.Jabouille 14/02/96  bug in extrapolation of ZMRM below the first level
+!! Jabouille/Masson 05/12/02  add  ZUVTHLMR case and hydrometeor initialization
+!!      P.Jabouille 29/10/03  add  hydrometeor initialization for ZUVTHDMR case
+!!      G. Tanguy   26/10/10  change the interpolation of the RS : we use now a
+!!                            mixed grid (PREP_REAL_CASE method)
+!!                            add PUVTHU case
+!!      V.Masson    12/08/13  Parallelization of the initilization profile
+!!      J.Escobar : 15/09/2015 : WENO5 & JPHEXT <> 1 
+!!  Philippe Wautelet: 05/2016-04/2018: new data structures and calls for I/O
+!  P. Wautelet 19/04/2019: removed unused dummy arguments and variables
+!  JL Redelsperger 01/2021: Ocean LES cases added
+!-------------------------------------------------------------------------------
+!
+!*       0.    DECLARATIONS
+!              ------------
+!
+USE MODD_CONF
+USE MODD_CONF_n
+USE MODD_CST
+USE MODD_DYN_n,      ONLY: LOCEAN
+USE MODD_FIELD_n
+USE MODD_GRID
+USE MODD_GRID_n
+USE MODD_LUNIT_n,    ONLY: TLUOUT
+USE MODD_IO,         ONLY: TFILEDATA
+USE MODD_NETCDF
+USE MODD_OCEANH
+USE MODD_PARAMETERS, ONLY: JPHEXT
+USE MODD_TYPE_DATE
+!
+USE MODE_ll
+USE MODE_MSG
+USE MODE_THERMO
+!
+USE MODI_COMPUTE_EXNER_FROM_GROUND
+USE MODI_HEIGHT_PRESS
+USE MODI_PRESS_HEIGHT
+USE MODI_SET_MASS
+USE MODI_SHUMAN
+USE MODI_THETAVPU_THETAVPM
+USE MODI_TH_R_FROM_THL_RT_1D
+USE MODI_VERT_COORD
+!
+USE NETCDF          ! for reading the NR files 
+!
+IMPLICIT NONE
+!  
+!  
+!*       0.1   Declarations of arguments :
+!
+TYPE(TFILEDATA),        INTENT(IN)  :: TPFILE ! outpput data file
+TYPE(TFILEDATA),        INTENT(IN)  :: TPEXPREFILE ! input data file
+CHARACTER(LEN=*),       INTENT(IN)  :: HFUNU  ! type of variation of U
+                                              ! in y direction
+CHARACTER(LEN=*),       INTENT(IN)  :: HFUNV  ! type of variation of V
+                                              ! in x direction
+INTEGER,                INTENT(IN)  :: KILOC  ! I Localisation of vertical profile
+INTEGER,                INTENT(IN)  :: KJLOC  ! J Localisation of vertical profile
+LOGICAL,                INTENT(IN)  :: OBOUSS ! logical switch for Boussinesq version
+LOGICAL,                INTENT(IN)  :: OSHIFT ! logical switch for vertical shift
+REAL, DIMENSION(:,:,:), INTENT(OUT), OPTIONAL :: PCORIOZ ! Coriolis parameter
+                                               ! (exceptionnaly 3D array)
+REAL, DIMENSION(:,:,:), INTENT(IN) :: PJ ! jacobien 
+!
+!
+!*       0.2   Declarations of local variables :
+!
+INTEGER                         :: ILUPRE ! logical unit number of the EXPRE return code
+INTEGER                         :: ILUOUT    ! Logical unit number for output-listing
+! local variables for reading sea sfc flux forcing for ocean model
+INTEGER                   :: IFRCLT 
+REAL, DIMENSION(:), ALLOCATABLE :: ZSSUFL_T,ZSSVFL_T,ZSSTFL_T,ZSSOLA_T !
+TYPE (DATE_TIME), DIMENSION(:), ALLOCATABLE :: ZFRCLT ! date/time of sea surface forcings
+!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
+!  variables read in EXPRE file at the RS/CTD levels
+!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
+CHARACTER(LEN=8)                :: YKIND     ! Kind of  variables in 
+                                             ! EXPRE FILE
+INTEGER                         :: ILEVELU   ! number of wind levels 
+REAL, DIMENSION(:), ALLOCATABLE :: ZHEIGHTU  ! Height at wind levels 
+REAL, DIMENSION(:), ALLOCATABLE :: ZPRESSU   ! Pressure at wind levels
+REAL, DIMENSION(:), ALLOCATABLE :: ZTHVU     ! Thetav at wind levels
+REAL, DIMENSION(:), ALLOCATABLE :: ZU,ZV     ! wind components
+REAL, DIMENSION(:), ALLOCATABLE :: ZDD,ZFF   ! dd (direction) and ff(force)
+                                             !     for wind
+REAL                            :: ZZGROUND,ZPGROUND ! height and Pressure at ground  
+REAL                            :: ZTGROUND,ZTHVGROUND,ZTHDGROUND,ZTHLGROUND,    & 
+                                   ZTDGROUND,ZMRGROUND,ZHUGROUND        
+                                                  ! temperature and moisture
+                                                  ! variables at ground
+INTEGER                         :: ILEVELM   ! number of mass levels
+REAL, DIMENSION(:), ALLOCATABLE :: ZHEIGHTM  ! Height at mass levels
+REAL, DIMENSION(:), ALLOCATABLE :: ZPRESSM   ! Pressure at mass levels
+REAL, DIMENSION(:), ALLOCATABLE :: ZTHV      ! Thetav at mass levels
+REAL, DIMENSION(:), ALLOCATABLE :: ZTHD      ! Theta (dry) at mass levels
+REAL, DIMENSION(:), ALLOCATABLE :: ZTHL      ! Thetal at mass levels  
+REAL, DIMENSION(:), ALLOCATABLE :: ZTH       ! Theta at mass levels
+REAL, DIMENSION(:), ALLOCATABLE :: ZT        ! Temperature at mass levels
+REAL, DIMENSION(:), ALLOCATABLE :: ZMR       ! Vapor mixing ratio at mass levels
+REAL, DIMENSION(:), ALLOCATABLE :: ZMRC      ! cloud mixing ratio at mass levels
+REAL, DIMENSION(:), ALLOCATABLE :: ZMRI      ! ice mixing ratio or cloud concentration
+REAL, DIMENSION(:), ALLOCATABLE :: ZRT       ! total mixing ratio  
+REAL, DIMENSION(:), ALLOCATABLE :: ZPRESS    ! pressure at mass level 
+REAL, DIMENSION(:), ALLOCATABLE :: ZHU       ! relative humidity at mass levels
+REAL, DIMENSION(:), ALLOCATABLE :: ZTD       ! Td at mass levels
+REAL, DIMENSION(:), ALLOCATABLE :: ZTV       ! Tv at mass levels
+REAL, DIMENSION(:), ALLOCATABLE :: ZEXN      
+REAL, DIMENSION(:), ALLOCATABLE :: ZCPH     
+REAL, DIMENSION(:), ALLOCATABLE :: ZLVOCPEXN     
+REAL, DIMENSION(:), ALLOCATABLE :: ZLSOCPEXN    
+REAL, DIMENSION(SIZE(XZHAT))    :: ZZFLUX_PROFILE ! altitude of flux points on the initialization columns
+REAL, DIMENSION(SIZE(XZHAT))    :: ZZMASS_PROFILE ! altitude of mass points on the initialization columns
+!
+!  fields on the grid of the model without orography
+!
+REAL, DIMENSION(SIZE(XZHAT))    :: ZUW,ZVW ! Wind at w model grid levels
+REAL, DIMENSION(SIZE(XZHAT))    :: ZMRM   ! vapor mixing ratio at mass model
+                                          !grid levels 
+REAL, DIMENSION(SIZE(XZHAT))    :: ZMRCM,ZMRIM
+REAL, DIMENSION(SIZE(XZHAT))    :: ZTHVM  ! Temperature at mass model grid levels
+REAL, DIMENSION(SIZE(XZHAT))    :: ZTHLM  ! Thetal at mass model grid levels
+REAL, DIMENSION(SIZE(XZHAT))    :: ZTHM  ! Thetal at mass model grid levels
+REAL, DIMENSION(SIZE(XZHAT))    :: ZRHODM   ! density at mass model grid level
+REAL, DIMENSION(:), ALLOCATABLE :: ZMRT    ! Total Vapor mixing ratio at mass levels on mixed grid
+REAL, DIMENSION(:), ALLOCATABLE :: ZEXNMASS  ! exner fonction at mass level
+REAL, DIMENSION(:), ALLOCATABLE :: ZEXNFLUX  ! exner fonction at flux level
+REAL                            :: ZEXNSURF  ! exner fonction at surface
+REAL, DIMENSION(:), ALLOCATABLE :: ZPREFLUX   ! pressure at flux model grid level
+REAL, DIMENSION(:), ALLOCATABLE :: ZFRAC_ICE ! ice fraction
+REAL, DIMENSION(:), ALLOCATABLE :: ZRSATW, ZRSATI             
+REAL                            :: ZDZSDH,ZDZ1SDH,ZDZ2SDH ! interpolation
+                                                          ! working arrays
+!
+INTEGER         :: JK,JKLEV,JKU,JKM,JKT,JJ,JI,JO,JLOOP  ! Loop indexes
+INTEGER         :: IKU                ! Upper bound in z direction
+REAL            :: ZRDSCPD,ZRADSDG, & ! Rd/Cpd, Pi/180.,
+                   ZRVSRD,ZRDSRV,   & ! Rv/Rd, Rd/Rv
+                   ZPTOP              ! Pressure at domain top 
+LOGICAL         :: GUSERC             ! use of input data cloud
+INTEGER         :: IIB, IIE, IJB, IJE
+INTEGER         :: IXOR_ll, IYOR_ll
+INTEGER         :: IINFO_ll
+LOGICAL         :: GPROFILE_IN_PROC   ! T : initialization profile is in current processor
+!
+REAL,DIMENSION(SIZE(XXHAT),SIZE(XYHAT))   ::ZZS_LS
+REAL,DIMENSION(SIZE(XXHAT),SIZE(XYHAT),SIZE(XZHAT)) ::ZZFLUX_MX,ZZMASS_MX ! mixed grid
+!-------------------------------------------------------------------------------
+! For standard ocean version, reading external files
+CHARACTER(LEN=256) :: yinfile, yinfisf ! files to be read
+INTEGER :: IDX
+INTEGER(KIND=CDFINT) :: INZ, INLATI, INLONGI
+INTEGER(KIND=CDFINT) :: incid, ivarid, idimid, idimlen
+REAL, DIMENSION(:,:,:),     ALLOCATABLE :: ZOC_TEMPERATURE,ZOC_SALINITY,ZOC_U,ZOC_V
+REAL, DIMENSION(:),     ALLOCATABLE :: ZOC_DEPTH  
+REAL, DIMENSION(:),     ALLOCATABLE :: ZOC_LE,ZOC_H
+REAL, DIMENSION(:),     ALLOCATABLE :: ZOC_SW_DOWN,ZOC_SW_UP,ZOC_LW_DOWN,ZOC_LW_UP
+REAL, DIMENSION(:),     ALLOCATABLE :: ZOC_TAUX,ZOC_TAUY
+
+!--------------------------------------------------------------------------------
+!
+!*	 1.     PROLOGUE : INITIALIZE SOME CONSTANTS, RETRIEVE LOGICAL
+!               UNIT NUMBERS AND READ KIND OF DATA IN EXPRE FILE
+!	        -------------------------------------------------------
+!
+CALL GET_INDICE_ll(IIB,IJB,IIE,IJE)
+CALL GET_OR_ll('B',IXOR_ll,IYOR_ll)
+!
+!*       1.1  initialize some constants 
+!
+ZRDSCPD = XRD / XCPD
+ZRADSDG = XPI/180.
+ZRVSRD  = XRV/XRD
+ZRDSRV = XRD/XRV
+!
+!*       1.2  Retrieve logical unit numbers 
+!                         
+ILUPRE = TPEXPREFILE%NLU
+ILUOUT = TLUOUT%NLU
+!
+!*       1.3  Read data kind in EXPRE file 
+!
+READ(ILUPRE,*) YKIND
+WRITE(ILUOUT,*) 'YKIND read in set_rsou: ', YKIND
+!
+IF(LUSERC .AND. YKIND/='PUVTHDMR' .AND. YKIND/='ZUVTHDMR' .AND.  YKIND/='ZUVTHLMR') THEN 
+  CALL PRINT_MSG(NVERB_FATAL,'GEN','SET_RSOU','hydrometeors are not allowed for YKIND = '//trim(YKIND))
+ENDIF
+!
+IF(YKIND=='ZUVTHLMR' .AND. .NOT. LUSERC) THEN
+!callabortstop
+  CALL PRINT_MSG(NVERB_FATAL,'GEN','SET_RSOU','LUSERC=T is required for YKIND=ZUVTHLMR')
+ENDIF
+!
+GUSERC=.FALSE.
+IF(LUSERC .AND. (YKIND == 'PUVTHDMR' .OR. YKIND == 'ZUVTHDMR')) GUSERC=.TRUE.
+!-------------------------------------------------------------------------------
+!
+!*	 2.     READ DATA AND CONVERT IN (height,U,V), (height,Thetav,r)
+!	        --------------------------------------------------------
+!
+SELECT CASE(YKIND)
+!   
+!     2.0.1 Ocean case 1
+!   
+  CASE ('IDEALOCE')
+!
+    XP00=XP00OCEAN
+    ! Read data in PRE_IDEA1.nam
+    ! Surface      
+    WRITE(ILUOUT,FMT=*) 'Reading data for ideal ocean :IDEALOCE'   
+    READ(ILUPRE,*) ZPTOP           ! P_atmosphere at sfc =P top domain
+    READ(ILUPRE,*) ZTGROUND        ! SST 
+    READ(ILUPRE,*) ZMRGROUND       ! SSS
+    WRITE(ILUOUT,FMT=*) 'Patm SST SSS', ZPTOP,ZTGROUND,ZMRGROUND
+    READ(ILUPRE,*) ILEVELU         ! Read number of Current levels
+    ! Allocate required memory 
+    ALLOCATE(ZHEIGHTU(ILEVELU),ZU(ILEVELU),ZV(ILEVELU))
+    ALLOCATE(ZOC_U(ILEVELU,1,1),ZOC_V(ILEVELU,1,1))
+    WRITE(ILUOUT,FMT=*) 'Level number for Current in data', ILEVELU
+    ! Read U and V at each wind level
+    DO JKU = 1,ILEVELU
+      READ(ILUPRE,*) ZHEIGHTU(JKU),ZOC_U(JKU,1,1),ZOC_V(JKU,1,1)
+      ! WRITE(ILUOUT,FMT=*) 'Leveldata D(m) under sfc: U_cur, V_cur', JKU, ZHEIGHTU(JKU),ZU(JKU),ZV(JKU)
+    END DO
+    DO JKU=1,ILEVELU
+      ! Z axis reoriented as in the model
+      IDX     = ILEVELU-JKU+1
+      ZU(JKU) = ZOC_U(IDX,1,1)
+      ZV(JKU) = ZOC_V(IDX,1,1)
+      ! ZHEIGHT used only in set_ rsou, defined as such ZHEIGHT(ILEVELM)=H_model
+      ! Z oriented in same time to have a model domain axis going
+      ! from 0m (ocean bottom/model bottom) towards H (ocean sfc/model top)
+    END DO
+    ! Read number of mass levels  
+    READ(ILUPRE,*) ILEVELM
+    ! Allocate required memory 
+    ALLOCATE(ZOC_DEPTH(ILEVELM))
+    ALLOCATE(ZHEIGHTM(ILEVELM))           
+    ALLOCATE(ZTHL(ILEVELM),ZTH(ILEVELM),ZTHV(ILEVELM)) 
+    ALLOCATE(ZMR(ILEVELM),ZRT(ILEVELM))
+    ALLOCATE(ZOC_TEMPERATURE(ILEVELM,1,1),ZOC_SALINITY(ILEVELM,1,1))
+    ! Read T and S at each mass level 
+    DO JKM= 2,ILEVELM
+      READ(ILUPRE,*) ZOC_DEPTH(JKM),ZOC_TEMPERATURE(JKM,1,1),ZOC_SALINITY(JKM,1,1)
+    END DO
+    ! Complete the mass arrays with the ground informations read in EXPRE file
+    ZOC_DEPTH(1)    = 0.                    
+    ZOC_TEMPERATURE(1,1,1)= ZTGROUND
+    ZOC_SALINITY(1,1,1)= ZMRGROUND
+    !!!!!!!!!!!!!!!!!!!!!!!!Inversing Axis!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
+    ! Going from the data (axis downward i.e inverse model) grid to the model grid (axis upward)
+    ! Uniform bathymetry; depth goes from ocean sfc downwards  (data grid)
+    ! ZHEIGHT goes from the model domain bottom up to the sfc ocean (top of model domain)
+    !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
+    ZZGROUND   = 0.
+    ZTGROUND   = ZOC_TEMPERATURE(ILEVELM,1,1) 
+    ZMRGROUND  = ZOC_SALINITY(ILEVELM,1,1)
+    DO JKM= 1,ILEVELM
+      ! Z upward axis (oriented as in the model), i.e.
+      ! going from 0m (ocean bottom/model bottom) upward to H (ocean sfc/model top)
+      ! ZHEIGHT used only in set_ rsou, defined as such ZHEIGHT(ILEVELM)=H_model
+      IDX          = ILEVELM-JKM+1
+      ZTH(JKM)      = ZOC_TEMPERATURE(IDX,1,1)
+      ZMR(JKM)     = ZOC_SALINITY(IDX,1,1)
+      ZHEIGHTM(JKM)= ZOC_DEPTH(ILEVELM)- ZOC_DEPTH(IDX)
+      WRITE(ILUOUT,FMT=*) 'Model oriented initial data: JKM IDX depth T S ZHEIGHTM', &
+                      JKM,IDX,ZOC_DEPTH(IDX),ZTH(JKM),ZMR(JKM),ZHEIGHTM(JKM)
+    END DO
+    ! mass levels of the RS
+    ZTHV = ZTH ! TV==THETA=TL
+    ZTHL = ZTH
+    ZRT  = ZMR  
+    !!!!!!!!!!!!!!!!!!!!!!!!!!!!
+    ! READ Sea Surface Forcing !
+    !!!!!!!!!!!!!!!!!!!!!!!!!!!!
+    ! Reading the forcings from prep_idea1.nam
+    READ(ILUPRE,*) IFRCLT  ! Number of time-dependent forcing 
+    IF (IFRCLT > 99*8) THEN
+      ! CAUTION: number of forcing times is limited by the WRITE format 99(8E10.3)
+      !          and also by the name of forcing variables (format I3.3)
+      !          You have to modify those if you need more forcing times
+     CALL PRINT_MSG(NVERB_FATAL,'IO','SET_RSOU','maximum forcing times NFRCLT is 99*8')
+    END IF
+!
+    WRITE(UNIT=ILUOUT,FMT='(" THERE ARE ",I2," SFC FLUX FORCINGs AT:")') IFRCLT
+    ALLOCATE(ZFRCLT(IFRCLT))
+    ALLOCATE(ZSSUFL_T(IFRCLT)); ZSSUFL_T = 0.0
+    ALLOCATE(ZSSVFL_T(IFRCLT)); ZSSVFL_T = 0.0
+    ALLOCATE(ZSSTFL_T(IFRCLT)); ZSSTFL_T = 0.0
+    ALLOCATE(ZSSOLA_T(IFRCLT)); ZSSOLA_T = 0.0
+    DO JKT = 1,IFRCLT
+      WRITE(ILUOUT,FMT='(A, I4)') "SET_RSOU/Reading Sea Surface forcing: Number=", JKT
+      READ(ILUPRE,*) ZFRCLT(JKT)%nyear, ZFRCLT(JKT)%nmonth, &
+                     ZFRCLT(JKT)%nday,  ZFRCLT(JKT)%xtime
+      READ(ILUPRE,*) ZSSUFL_T(JKT)
+      READ(ILUPRE,*) ZSSVFL_T(JKT)
+      READ(ILUPRE,*) ZSSTFL_T(JKT)
+      READ(ILUPRE,*) ZSSOLA_T(JKT)
+    END DO
+!
+    DO JKT = 1 , IFRCLT
+      WRITE(UNIT=ILUOUT,FMT='(F9.0, "s, date:", I3, "/", I3, "/", I5)') &
+                 ZFRCLT(JKT)%xtime,         ZFRCLT(JKT)%nday,   &
+                 ZFRCLT(JKT)%nmonth, ZFRCLT(JKT)%nyear
+    END DO
+    NINFRT= INT(ZFRCLT(2)%xtime)
+    WRITE(ILUOUT,FMT='(A)') &
+         "Number U-Stress, V-Stress, Heat turb Flux, Solar Flux Interval(s)",NINFRT
+    DO JKT = 1, IFRCLT
+      WRITE(ILUOUT,FMT='(I10,99(3F10.2))') JKT, ZSSUFL_T(JKT),ZSSVFL_T(JKT),ZSSTFL_T(JKT) 
+    END DO
+    NFRCLT = IFRCLT
+    ALLOCATE(TFRCLT(NFRCLT))
+    ALLOCATE(XSSUFL_T(NFRCLT));XSSUFL_T(:)=0.
+    ALLOCATE(XSSVFL_T(NFRCLT));XSSVFL_T(:)=0.
+    ALLOCATE(XSSTFL_T(NFRCLT));XSSTFL_T(:)=0.
+    ALLOCATE(XSSOLA_T(NFRCLT));XSSOLA_T(:)=0.
+!
+    DO JKT=1,NFRCLT
+      TFRCLT(JKT)= ZFRCLT(JKT)
+      XSSUFL_T(JKT)=ZSSUFL_T(JKT)/XRH00OCEAN
+      XSSVFL_T(JKT)=ZSSVFL_T(JKT)/XRH00OCEAN
+      ! working in SI
+      XSSTFL_T(JKT)=ZSSTFL_T(JKT) /(3900.*XRH00OCEAN)
+      XSSOLA_T(JKT)=ZSSOLA_T(JKT) /(3900.*XRH00OCEAN)
+    END DO   
+    DEALLOCATE(ZFRCLT)
+    DEALLOCATE(ZSSUFL_T)
+    DEALLOCATE(ZSSVFL_T)
+    DEALLOCATE(ZSSTFL_T)
+    DEALLOCATE(ZSSOLA_T)
+!
+!--------------------------------------------------------------------------------   
+! 2.0.2  Ocean standard initialize from netcdf files
+!        U,V,T,S at Z levels + Forcings at model TOP (sea surface) 
+!--------------------------------------------------------------------------------   
+!
+  CASE ('STANDOCE')
+!   
+    XP00=XP00OCEAN
+    READ(ILUPRE,*) ZPTOP           ! P_atmosphere at sfc =P top domain
+    READ(ILUPRE,*) YINFILE, YINFISF
+    WRITE(ILUOUT,FMT=*) 'Netcdf files to read:', YINFILE, YINFISF
+    ! Open file containing initial profiles
+    CALL check(nf90_open(yinfile,NF90_NOWRITE,incid), "opening NC file")
+    ! Reading dimensions and lengths
+    CALL check( nf90_inq_dimid(incid, "depth",idimid), "getting depth  dimension id" )
+    CALL check( nf90_inquire_dimension(incid, idimid,             len=INZ),     "getting INZ"   )
+    CALL check( nf90_inquire_dimension(incid, INT(2,KIND=CDFINT), len=INLONGI), "getting NLONG" )
+    CALL check( nf90_inquire_dimension(incid, INT(1,KIND=CDFINT), len=INLATI),  "getting NLAT"  )
+!   
+    WRITE(ILUOUT,FMT=*) 'NB LEVLS READ INZ, NLONG NLAT ', INZ, INLONGI,INLATI
+    ALLOCATE(ZOC_TEMPERATURE(INLATI,INLONGI,INZ),ZOC_SALINITY(INLATI,INLONGI,INZ))
+    ALLOCATE(ZOC_U(INLATI,INLONGI,INZ),ZOC_V(INLATI,INLONGI,INZ))
+    ALLOCATE(ZOC_DEPTH(INZ))
+    WRITE(ILUOUT,FMT=*) 'NETCDF READING ==> Temp'
+    CALL check(nf90_inq_varid(incid,"temperature",ivarid), "getting temp ivarid")
+    CALL check(nf90_get_var(incid,ivarid,ZOC_TEMPERATURE), "reading temp")
+    WRITE(ILUOUT,FMT=*) 'Netcdf Reading ==> salinity'
+    CALL check(nf90_inq_varid(incid,"salinity",ivarid), "getting salinity ivarid")
+    CALL check(nf90_get_var(incid,ivarid,ZOC_SALINITY), "reading salinity")
+    WRITE(ILUOUT,FMT=*) 'Netcdf ==> Reading depth'
+    CALL check(nf90_inq_varid(incid,"depth",ivarid), "getting depth ivarid")
+    CALL check(nf90_get_var(incid,ivarid,ZOC_DEPTH), "reading depth")
+    WRITE(ILUOUT,FMT=*) 'depth: max min ', MAXVAL(ZOC_DEPTH),MINVAL(ZOC_DEPTH)
+    WRITE(ILUOUT,FMT=*) 'depth 1 nz: ', ZOC_DEPTH(1),ZOC_DEPTH(INZ)
+    WRITE(ILUOUT,FMT=*) 'Netcdf Reading ==> Currents'
+    CALL check(nf90_inq_varid(incid,"u",ivarid), "getting u ivarid")
+    CALL check(nf90_get_var(incid,ivarid,ZOC_U), "reading u")
+    CALL check(nf90_inq_varid(incid,"v",ivarid), "getting v ivarid")
+    CALL check(nf90_get_var(incid,ivarid,ZOC_V), "reading v")
+    CALL check(nf90_close(incid), "closing yinfile")
+    WRITE(ILUOUT,FMT=*) 'End of initial file reading'
+!
+    DO JKM=1,INZ
+     ZOC_TEMPERATURE(1,1,JKM)=ZOC_TEMPERATURE(1,1,JKM)+273.15
+     WRITE(ILUOUT,FMT=*) 'Z T(Kelvin) S(Sverdup) U V K',&
+     JKM,ZOC_DEPTH(JKM),ZOC_TEMPERATURE(1,1,JKM),ZOC_SALINITY(1,1,JKM),ZOC_U(1,1,JKM),ZOC_V(1,1,JKM), JKM
+    ENDDO
+    !  number of data levels
+    ILEVELM=INZ
+    ! Model bottom
+    ZTGROUND  = ZOC_TEMPERATURE(1,1,ILEVELM)
+    ZMRGROUND = ZOC_SALINITY(1,1,ILEVELM)
+    ZZGROUND=0.
+    ! Allocate required memory
+    ALLOCATE(ZHEIGHTM(ILEVELM))           
+    ALLOCATE(ZT(ILEVELM))
+    ALLOCATE(ZTV(ILEVELM))
+    ALLOCATE(ZMR(ILEVELM))
+    ALLOCATE(ZTHV(ILEVELM)) 
+    ALLOCATE(ZTHL(ILEVELM))
+    ALLOCATE(ZRT(ILEVELM))
+    !  Going from the inverse model grid (data) to the normal one
+    DO JKM= 1,ILEVELM
+      ! Z axis reoriented as in the model
+      IDX     = ILEVELM-JKM+1
+      ZT(JKM) = ZOC_TEMPERATURE(1,1,IDX)
+      ZMR(JKM)  =  ZOC_SALINITY(1,1,IDX)
+      ! ZHEIGHT used only in set_ rsou, defined as such ZHEIGHT(ILEVELM)=H_model
+      ! Z oriented in same time to have a model domain axis going
+      ! from 0m (ocean bottom/model bottom) towards H (ocean sfc/model top)
+      ! translation/inversion
+      ZHEIGHTM(JKM) = -ZOC_DEPTH(IDX) + ZOC_DEPTH(ILEVELM)
+      WRITE(ILUOUT,FMT=*) 'End gridmodel comput: JKM IDX depth T S ZHEIGHTM', &
+      JKM,IDX,ZOC_DEPTH(IDX),ZT(JKM),ZMR(JKM),ZHEIGHTM(JKM)
+    END DO
+    ! complete ther variables
+    ZTV  = ZT
+    ZTHV = ZT
+    ZRT  = ZMR
+    ZTHL = ZT
+    ZTH  = ZT
+    ! INIT --- U V -----
+    ILEVELU = INZ               ! Same nb of levels for u,v,T,S
+    !Assume that current and temp are given at same level
+    ALLOCATE(ZHEIGHTU(ILEVELU))           
+    ALLOCATE(ZU(ILEVELU),ZV(ILEVELU))
+    ZHEIGHTU=ZHEIGHTM
+    DO JKM= 1,ILEVELU
+      ! Z axis reoriented as in the model
+      IDX     = ILEVELU-JKM+1
+      ZU(JKM) = ZOC_U(1,1,IDX)
+      ZV(JKM) = ZOC_V(1,1,IDX)
+      ! ZHEIGHT used only in set_ rsou, defined as such ZHEIGHT(ILEVELM)=H_model
+      ! Z oriented in same time to have a model domain axis going
+      ! from 0m (ocean bottom/model bottom) towards H (ocean sfc/model top)
+    END DO
+!
+    DEALLOCATE(ZOC_TEMPERATURE)
+    DEALLOCATE(ZOC_SALINITY)
+    DEALLOCATE(ZOC_U)
+    DEALLOCATE(ZOC_V)
+    DEALLOCATE(ZOC_DEPTH)
+!
+    ! Reading/initializing  surface forcings
+!
+    WRITE(ILUOUT,FMT=*) 'netcdf sfc forcings file to be read:',yinfisf
+    ! Open of sfc forcing file
+    CALL check(nf90_open(yinfisf,NF90_NOWRITE,incid), "opening NC file")
+    ! Reading dimension and length
+    CALL check( nf90_inq_dimid(incid,"t",idimid), "getting  time dimension id" )
+    CALL check( nf90_inquire_dimension(incid, idimid, len=idimlen), "getting idimlen "  )
+!
+    WRITE(ILUOUT,FMT=*) 'nb sfc-forcing time idimlen=',idimlen
+    ALLOCATE(ZOC_LE(idimlen))
+    ALLOCATE(ZOC_H(idimlen))
+    ALLOCATE(ZOC_SW_DOWN(idimlen))
+    ALLOCATE(ZOC_SW_UP(idimlen))
+    ALLOCATE(ZOC_LW_DOWN(idimlen))
+    ALLOCATE(ZOC_LW_UP(idimlen))
+    ALLOCATE(ZOC_TAUX(idimlen))
+    ALLOCATE(ZOC_TAUY(idimlen))
+!
+    WRITE(ILUOUT,FMT=*)'Netcdf Reading ==> LE'  
+    CALL check(nf90_inq_varid(incid,"LE",ivarid), "getting LE ivarid")
+    CALL check(nf90_get_var(incid,ivarid,ZOC_LE), "reading LE flux")
+    WRITE(ILUOUT,FMT=*)'Netcdf Reading ==> H'  
+    CALL check(nf90_inq_varid(incid,"H",ivarid), "getting H ivarid")
+    CALL check(nf90_get_var(incid,ivarid,ZOC_H), "reading H flux")
+    WRITE(ILUOUT,FMT=*) 'Netcdf Reading ==> SW_DOWN'  
+    CALL check(nf90_inq_varid(incid,"SW_DOWN",ivarid), "getting SW_DOWN ivarid")
+    CALL check(nf90_get_var(incid,ivarid,ZOC_SW_DOWN), "reading SW_DOWN")
+    WRITE(ILUOUT,FMT=*) 'Netcdf Reading ==> SW_UP'  
+    CALL check(nf90_inq_varid(incid,"SW_UP",ivarid), "getting SW_UP ivarid")
+    CALL check(nf90_get_var(incid,ivarid,ZOC_SW_UP), "reading SW_UP")
+    WRITE(ILUOUT,FMT=*) 'Netcdf Reading ==> LW_DOWN'  
+    CALL check(nf90_inq_varid(incid,"LW_DOWN",ivarid), "getting LW_DOWN ivarid")
+    CALL check(nf90_get_var(incid,ivarid,ZOC_LW_DOWN), "reading LW_DOWN")
+    WRITE(ILUOUT,FMT=*) 'Netcdf Reading ==> LW_UP'  
+    CALL check(nf90_inq_varid(incid,"LW_UP",ivarid), "getting LW_UP ivarid")
+    CALL check(nf90_get_var(incid,ivarid,ZOC_LW_UP), "reading LW_UP")
+    WRITE(ILUOUT,FMT=*) 'Netcdf Reading ==> TAUX'  
+    CALL check(nf90_inq_varid(incid,"TAUX",ivarid), "getting TAUX ivarid")
+    CALL check(nf90_get_var(incid,ivarid,ZOC_TAUX), "reading TAUX")
+    WRITE(ILUOUT,FMT=*) 'Netcdf Reading ==> TAUY'  
+    CALL check(nf90_inq_varid(incid,"TAUY",ivarid), "getting TAUY ivarid")
+    CALL check(nf90_get_var(incid,ivarid,ZOC_TAUY), "reading TAUY")
+    CALL check(nf90_close(incid), "closing yinfifs")
+!
+    WRITE(ILUOUT,FMT=*) '  Forcing-Number    LE     H     SW_down     SW_up    LW_down   LW_up TauX TauY' 
+    DO JKM = 1, idimlen
+      WRITE(ILUOUT,FMT=*) JKM, ZOC_LE(JKM), ZOC_H(JKM),ZOC_SW_DOWN(JKM),ZOC_SW_UP(JKM),&
+                          ZOC_LW_DOWN(JKM),ZOC_LW_UP(JKM),ZOC_TAUX(JKM),ZOC_TAUY(JKM)   
+    ENDDO
+    ! IFRCLT FORCINGS at sea surface
+    IFRCLT=idimlen
+    ALLOCATE(ZFRCLT(IFRCLT)) 
+    ALLOCATE(ZSSUFL_T(IFRCLT)); ZSSUFL_T = 0.0
+    ALLOCATE(ZSSVFL_T(IFRCLT)); ZSSVFL_T = 0.0
+    ALLOCATE(ZSSTFL_T(IFRCLT)); ZSSTFL_T = 0.0
+    ALLOCATE(ZSSOLA_T(IFRCLT)); ZSSOLA_T = 0.0
+    DO JKT=1,IFRCLT
+      ! Initial file for CINDY-DYNAMO: all fluxes correspond to the absolute value (>0)
+      ! modele ocean: axe z dirigé du bas vers la sfc de l'océan
+      ! => flux dirigé vers le haut (positif ocean vers l'atmopshere i.e. bas vers le haut)
+      ZSSOLA_T(JKT)=ZOC_SW_DOWN(JKT)-ZOC_SW_UP(JKT)
+      ZSSTFL_T(JKT)=(ZOC_LW_DOWN(JKT)-ZOC_LW_UP(JKT)-ZOC_LE(JKT)-ZOC_H(JKT))
+      ! assume that Tau given on file is along Ox
+      ! rho_air UW_air = rho_ocean UW_ocean= N/m2
+      ! uw_ocean
+      ZSSUFL_T(JKT)=ZOC_TAUX(JKT)
+      ZSSVFL_T(JKT)=ZOC_TAUY(JKT)
+      WRITE(ILUOUT,FMT=*) 'Forcing Nb Sol NSol UW_oc VW',&
+                          JKT,ZSSOLA_T(JKT),ZSSTFL_T(JKT),ZSSUFL_T(JKT),ZSSVFL_T(JKT) 
+    ENDDO
+    ! Allocate and Writing the corresponding variables in module MODD_OCEAN_FRC
+    NFRCLT=IFRCLT
+    ! value to read later on file ? 
+    NINFRT=600
+    ALLOCATE(TFRCLT(NFRCLT))
+    ALLOCATE(XSSUFL_T(NFRCLT));XSSUFL_T(:)=0.
+    ALLOCATE(XSSVFL_T(NFRCLT));XSSVFL_T(:)=0.
+    ALLOCATE(XSSTFL_T(NFRCLT));XSSTFL_T(:)=0.
+    ALLOCATE(XSSOLA_T(NFRCLT));XSSOLA_T(:)=0.
+    ! on passe en unités SI, signe, etc pour le modele ocean
+    !  W/m2 => SI :  /(CP_mer * rho_mer)
+    ! a revoir dans tt le code pour mettre de svaleurs plus exactes
+    DO JKT=1,NFRCLT
+      TFRCLT(JKT)= ZFRCLT(JKT)
+      XSSUFL_T(JKT)=ZSSUFL_T(JKT)/XRH00OCEAN
+      XSSVFL_T(JKT)=ZSSVFL_T(JKT)/XRH00OCEAN
+      XSSTFL_T(JKT)=ZSSTFL_T(JKT) /(3900.*XRH00OCEAN)
+      XSSOLA_T(JKT)=ZSSOLA_T(JKT) /(3900.*XRH00OCEAN)
+    END DO   
+    DEALLOCATE(ZFRCLT)
+    DEALLOCATE(ZSSUFL_T)
+    DEALLOCATE(ZSSVFL_T)
+    DEALLOCATE(ZSSTFL_T)
+    DEALLOCATE(ZSSOLA_T)
+    DEALLOCATE(ZOC_LE)    
+    DEALLOCATE(ZOC_H)    
+    DEALLOCATE(ZOC_SW_DOWN)    
+    DEALLOCATE(ZOC_SW_UP)    
+    DEALLOCATE(ZOC_LW_DOWN)    
+    DEALLOCATE(ZOC_LW_UP)    
+    DEALLOCATE(ZOC_TAUX)
+    DEALLOCATE(ZOC_TAUY)
+    ! END OCEAN STANDARD
+!
+!
+!*       2.1  ATMOSPHERIC STANDARD case : ZGROUND, PGROUND, TGROUND, TDGROUND
+!                               (Pressure, dd, ff) , 
+!                               (Pressure, T, Td)
+!
+  CASE ('STANDARD')
+    
+    READ(ILUPRE,*) ZZGROUND                 ! Read data at ground level
+    READ(ILUPRE,*) ZPGROUND
+    READ(ILUPRE,*) ZTGROUND
+    READ(ILUPRE,*) ZTDGROUND
+!
+    READ(ILUPRE,*) ILEVELU               ! Read number of wind levels
+    ALLOCATE(ZPRESSU(ILEVELU))           ! Allocate memory for arrays to be read
+    ALLOCATE(ZDD(ILEVELU),ZFF(ILEVELU))  
+    ALLOCATE(ZHEIGHTU(ILEVELU))          ! Allocate memory for needed 
+    ALLOCATE(ZU(ILEVELU),ZV(ILEVELU))    !  arrays
+    ALLOCATE(ZTHVU(ILEVELU))             ! Allocate memory for intermediate
+                                         !  arrays 
+!
+    DO JKU = 1,ILEVELU                   ! Read data at wind levels
+      READ(ILUPRE,*) ZPRESSU(JKU),ZDD(JKU),ZFF(JKU)  
+    END DO  
+!
+    READ(ILUPRE,*) ILEVELM           ! Read number of mass levels
+                                     ! including the ground level
+    ALLOCATE(ZPRESSM(ILEVELM))     ! Allocate memory for arrays to be read
+    ALLOCATE(ZT(ILEVELM))                                   
+    ALLOCATE(ZTD(ILEVELM))                                  
+    ALLOCATE(ZHEIGHTM(ILEVELM))    ! Allocate memory for needed 
+    ALLOCATE(ZTHV(ILEVELM))        !  arrays
+    ALLOCATE(ZMR(ILEVELM))
+    ALLOCATE(ZTV(ILEVELM))         ! Allocate memory for intermediate arrays
+    ALLOCATE(ZTHL(ILEVELM))
+    ALLOCATE(ZRT(ILEVELM))                                              
+!
+!   
+    DO JKM= 2,ILEVELM                ! Read data at mass levels
+      READ(ILUPRE,*) ZPRESSM(JKM),ZT(JKM),ZTD(JKM)
+    END DO
+    ZPRESSM(1)=ZPGROUND                 ! Mass level 1 is at the ground
+    ZT(1)=ZTGROUND
+    ZTD(1)=ZTDGROUND 
+!   
+!     recover the North-South and West-East wind components
+    ZU(:) = ZFF(:)*COS(ZRADSDG*(270.-ZDD(:)) )              
+    ZV(:) = ZFF(:)*SIN(ZRADSDG*(270.-ZDD(:)) )
+!
+!     compute vapor mixing ratio 
+    ZMR(:)  = SM_FOES(ZTD(:))                            &      
+            / ( (ZPRESSM(:) - SM_FOES(ZTD(:))) * ZRVSRD )       
+! 
+!     compute Tv
+    ZTV(:) = ZT(:) * (1. + ZRVSRD * ZMR(:))/(1.+ZMR(:))         
+!
+!     compute thetav
+    ZTHV(:) = ZTV(:) * (XP00/ ZPRESSM(:)) **(ZRDSCPD)         
+!
+!     compute height at the mass levels of the RS
+    ZHEIGHTM(:) = HEIGHT_PRESS(ZPRESSM,ZTHV,ZPGROUND,ZTHV(1),ZZGROUND) 
+!
+!     compute thetav and height at the wind levels of the RS
+    ZTHVU(:) = THETAVPU_THETAVPM(ZPRESSM,ZPRESSU,ZTHV)        
+    ZHEIGHTU(:) = HEIGHT_PRESS(ZPRESSU,ZTHVU,ZPGROUND,ZTHV(1),ZZGROUND)
+!
+!   Compute Thetal and Rt
+    ZRT(:)=ZMR(:)
+    ZTHL(:)=ZTHV(:)*(1+ZRT(:))/(1+ZRVSRD*ZRT(:))
+!
+!*       2.2  PUVTHVMR case : zGROUND, PGROUND, ThvGROUND, RGROUND
+!                               (Pressure, U, V) , 
+!                               (Pressure, THv, R)
+!
+  CASE ('PUVTHVMR') 
+!  
+!     Read data at ground level      
+    READ(ILUPRE,*) ZZGROUND                       
+    READ(ILUPRE,*) ZPGROUND
+    READ(ILUPRE,*) ZTHVGROUND
+    READ(ILUPRE,*) ZMRGROUND
+!
+!     Read number of wind levels
+    READ(ILUPRE,*) ILEVELU  
+! 
+!     Allocate the required memory               
+    ALLOCATE(ZPRESSU(ILEVELU))              
+    ALLOCATE(ZU(ILEVELU),ZV(ILEVELU))    
+    ALLOCATE(ZHEIGHTU(ILEVELU))             
+    ALLOCATE(ZTHVU(ILEVELU))                
+!
+!     Read the data at each wind level of the RS   
+    DO JKU =1,ILEVELU
+      READ(ILUPRE,*) ZPRESSU(JKU),ZU(JKU),ZV(JKU)   
+    END DO
+! 
+!     Read number of mass levels
+    READ(ILUPRE,*) ILEVELM
+!
+!     Allocate the required memory     
+    ALLOCATE(ZPRESSM(ILEVELM))          
+    ALLOCATE(ZHEIGHTM(ILEVELM))
+    ALLOCATE(ZTHV(ILEVELM))
+    ALLOCATE(ZMR(ILEVELM))
+    ALLOCATE(ZTHL(ILEVELM))
+    ALLOCATE(ZRT(ILEVELM))
+!   
+!     Read the data at each mass level of the RS   
+    DO JKM = 2,ILEVELM
+      READ(ILUPRE,*) ZPRESSM(JKM),ZTHV(JKM),ZMR(JKM)
+    END DO
+!
+!     Complete the mass arrays with the ground informations read in EXPRE file
+    ZPRESSM(1) = ZPGROUND
+    ZTHV(1)    = ZTHVGROUND
+    ZMR(1)     = ZMRGROUND 
+!
+!     Compute height of the mass levels of the RS
+    ZHEIGHTM(:) = HEIGHT_PRESS(ZPRESSM,ZTHV,ZPGROUND,ZTHV(1),ZZGROUND) 
+!                                                                 
+!     Compute thetav and heigth at the wind levels of the RS 
+    ZTHVU(:) = THETAVPU_THETAVPM(ZPRESSM,ZPRESSU,ZTHV)         
+    ZHEIGHTU(:) = HEIGHT_PRESS(ZPRESSU,ZTHVU,ZPGROUND,ZTHV(1),ZZGROUND)
+!
+! on interpole thetal(=theta quand il n'y a pas d'eau liquide) et r total
+    ZRT(:)=ZMR(:)
+    ZTHL(:)=ZTHV(:)*(1+ZRT(:))/(1+ZRVSRD*ZRT(:))
+!
+!*       2.3  PUVTHVHU case :  zGROUND, PGROUND, ThvGROUND, HuGROUND
+!                               (Pressure, U, V) , 
+!                               (Pressure, THv, Hu)
+!
+  CASE ('PUVTHVHU')
+! 
+!     Read data at ground level      
+    READ(ILUPRE,*) ZZGROUND                
+    READ(ILUPRE,*) ZPGROUND
+    READ(ILUPRE,*) ZTHVGROUND
+    READ(ILUPRE,*) ZHUGROUND
+!
+!     Read number of wind levels
+    READ(ILUPRE,*) ILEVELU
+!
+!     Allocate the required memory     
+    ALLOCATE(ZPRESSU(ILEVELU))             
+    ALLOCATE(ZU(ILEVELU),ZV(ILEVELU))
+    ALLOCATE(ZHEIGHTU(ILEVELU))            
+    ALLOCATE(ZTHVU(ILEVELU))               
+!                                           
+!     Read the data at each wind level of the RS   
+    DO JKU =1,ILEVELU
+      READ(ILUPRE,*) ZPRESSU(JKU),ZU(JKU),ZV(JKU)   
+    END DO
+! 
+!     Read number of mass levels
+    READ(ILUPRE,*) ILEVELM
+!
+!     Allocate the required memory  
+    ALLOCATE(ZPRESSM(ILEVELM))           
+    ALLOCATE(ZTHV(ILEVELM))
+    ALLOCATE(ZHU(ILEVELM))
+    ALLOCATE(ZHEIGHTM(ILEVELM))          
+    ALLOCATE(ZMR(ILEVELM))
+    ALLOCATE(ZTV(ILEVELM))     
+    ALLOCATE(ZTHL(ILEVELM))
+    ALLOCATE(ZRT(ILEVELM))
+!   
+!     Read the data at each mass level of the RS   
+    DO JKM = 2,ILEVELM
+      READ(ILUPRE,*) ZPRESSM(JKM),ZTHV(JKM),ZHU(JKM)
+    END DO
+!
+!     Complete the mass arrays with the ground informations read in EXPRE file
+    ZPRESSM(1) = ZPGROUND                    ! Mass level 1 is at the ground
+    ZTHV(1)    = ZTHVGROUND
+    ZHU(1)     = ZHUGROUND
+! 
+!     Compute Tv
+    ZTV(:)=ZTHV(:) * (ZPRESSM(:) / XP00) ** ZRDSCPD  
+!
+!     Compte mixing ratio      
+    ZMR(:)=SM_PMR_HU(ZPRESSM(:),ZTV(:),ZHU(:),SPREAD(ZMR(:),2,1))     
+!                                                          
+!     Compute height of the mass levels of the RS
+    ZHEIGHTM(:) = HEIGHT_PRESS(ZPRESSM,ZTHV,ZPGROUND,ZTHV(1),ZZGROUND)
+!                                                                 
+!     Compute thetav and height of the wind levels of the RS                                                                
+    ZTHVU(:) = THETAVPU_THETAVPM(ZPRESSM,ZPRESSU,ZTHV)   
+    ZHEIGHTU(:) = HEIGHT_PRESS(ZPRESSU,ZTHVU,ZPGROUND,ZTHV(1),ZZGROUND)
+! 
+! on interpole thetal(=theta quand il n'y a pas d'eau liquide) et r total
+    ZRT(:)=ZMR(:)
+    ZTHL(:)=ZTHV(:)*(1+ZRT(:))/(1+ZRVSRD*ZRT(:))
+!
+!*       2.4  ZUVTHVHU case :  zGROUND, PGROUND, ThvGROUND, HuGROUND
+!                               (height, U, V) , 
+!                               (height, THv, Hu)
+!
+  CASE ('ZUVTHVHU')
+!     Read data at ground level      
+    READ(ILUPRE,*) ZZGROUND                
+    READ(ILUPRE,*) ZPGROUND
+    READ(ILUPRE,*) ZTHVGROUND
+    READ(ILUPRE,*) ZHUGROUND
+!
+!     Read number of wind levels
+    READ(ILUPRE,*) ILEVELU
+!
+!     Allocate the required memory 
+    ALLOCATE(ZPRESSU(ILEVELU))
+    ALLOCATE(ZHEIGHTU(ILEVELU))           
+    ALLOCATE(ZU(ILEVELU),ZV(ILEVELU))
+!
+!
+!     Read the data at each wind level of the RS   
+    DO JKU = 1,ILEVELU
+      READ(ILUPRE,*) ZHEIGHTU(JKU),ZU(JKU),ZV(JKU)  
+    END DO
+! 
+!     Read number of mass levels
+    READ(ILUPRE,*) ILEVELM
+!
+!     Allocate the required memory 
+    ALLOCATE(ZHEIGHTM(ILEVELM))          
+    ALLOCATE(ZTHV(ILEVELM))
+    ALLOCATE(ZHU(ILEVELM))
+    ALLOCATE(ZMR(ILEVELM))               
+    ALLOCATE(ZPRESSM(ILEVELM))           
+    ALLOCATE(ZTV(ILEVELM))
+    ALLOCATE(ZTHL(ILEVELM))
+    ALLOCATE(ZRT(ILEVELM))    
+!   
+!     Read the data at each mass level of the RS
+    DO JKM = 2,ILEVELM
+      READ(ILUPRE,*) ZHEIGHTM(JKM),ZTHV(JKM),ZHU(JKM)
+    END DO 
+!
+!     Complete the mass arrays with the ground informations read in EXPRE file
+    ZHEIGHTM(1) = ZZGROUND                   ! Mass level 1 is at the ground 
+    ZTHV(1)    = ZTHVGROUND
+    ZHU(1)     = ZHUGROUND
+!
+!     Compute Pressure at the mass levels of the RS
+    ZPRESSM= PRESS_HEIGHT(ZHEIGHTM,ZTHV,ZPGROUND,ZTHV(1),ZHEIGHTM(1)) 
+!                                                       
+!     Compute Tv and the mixing ratio at the mass levels of the RS
+    ZTV(:)=ZTHV(:) * (ZPRESSM(:) / XP00) ** ZRDSCPD   
+    ZMR(:)=SM_PMR_HU(ZPRESSM(:),ZTV(:),ZHU(:),SPREAD(ZMR(:),2,1)) 
+!
+! on interpole thetal(=theta quand il n'y a pas d'eau liquide) et r total
+    ZRT(:)=ZMR(:)
+    ZTHL(:)=ZTHV(:)*(1+ZRT(:))/(1+ZRVSRD*ZRT(:))
+!
+!
+!*       2.5  ZUVTHVMR case :  zGROUND, PGROUND, ThvGROUND, RGROUND
+!                               (height, U, V) , 
+!                               (height, THv, R)
+!
+!
+  CASE ('ZUVTHVMR')
+!     Read data at ground level      
+    READ(ILUPRE,*) ZZGROUND
+    READ(ILUPRE,*) ZPGROUND
+    READ(ILUPRE,*) ZTHVGROUND
+    READ(ILUPRE,*) ZMRGROUND
+!
+!     Read number of wind levels
+    READ(ILUPRE,*) ILEVELU
+!
+!     Allocate the required memory 
+    ALLOCATE(ZHEIGHTU(ILEVELU))         
+    ALLOCATE(ZU(ILEVELU),ZV(ILEVELU))
+!
+!     Read the data at each wind level of the RS
+    DO JKU = 1,ILEVELU
+      READ(ILUPRE,*) ZHEIGHTU(JKU),ZU(JKU),ZV(JKU)  
+    END DO
+! 
+!     Read number of mass levels
+    READ(ILUPRE,*) ILEVELM
+!
+!     Allocate the required memory 
+    ALLOCATE(ZHEIGHTM(ILEVELM))           
+    ALLOCATE(ZTHV(ILEVELM))
+    ALLOCATE(ZMR(ILEVELM))
+    ALLOCATE(ZTHL(ILEVELM))
+    ALLOCATE(ZRT(ILEVELM))    
+!
+!     Read the data at each mass level of the RS
+    DO JKM=2,ILEVELM    
+      READ(ILUPRE,*) ZHEIGHTM(JKM),ZTHV(JKM),ZMR(JKM) 
+    END DO
+!
+!     Complete the mass arrays with the ground informations read in EXPRE file
+    ZHEIGHTM(1)= ZZGROUND                      ! Mass level 1 is at the ground
+    ZTHV(1)    = ZTHVGROUND
+    ZMR(1)     = ZMRGROUND
+! on interpole thetal(=theta quand il n'y a pas d'eau liquide) et r total
+    ZRT(:)=ZMR(:)
+    ZTHL(:)=ZTHV(:)*(1+ZRT(:))/(1+ZRVSRD*ZRT(:))    
+!
+!
+!*       2.6  PUVTHDMR case : zGROUND, PGROUND, ThdGROUND, RGROUND
+!                               (Pressure, U, V) , 
+!                               (Pressure, THd, R)
+!
+  CASE ('PUVTHDMR')
+!     Read data at ground level      
+    READ(ILUPRE,*) ZZGROUND               
+    READ(ILUPRE,*) ZPGROUND
+    READ(ILUPRE,*) ZTHDGROUND
+    READ(ILUPRE,*) ZMRGROUND
+!
+!     Read number of wind levels
+    READ(ILUPRE,*) ILEVELU
+!
+!     Allocate the required memory 
+    ALLOCATE(ZPRESSU(ILEVELU))          
+    ALLOCATE(ZU(ILEVELU),ZV(ILEVELU))
+    ALLOCATE(ZTHVU(ILEVELU))
+    ALLOCATE(ZHEIGHTU(ILEVELU))         
+!
+!     Read the data at each wind level of the RS
+    DO JKU =1,ILEVELU    
+      READ(ILUPRE,*) ZPRESSU(JKU),ZU(JKU),ZV(JKU)
+    END DO
+!
+!     Read number of mass levels 
+    READ(ILUPRE,*) ILEVELM
+!
+!     Allocate the required memory 
+    ALLOCATE(ZPRESSM(ILEVELM))         
+    ALLOCATE(ZTHD(ILEVELM))
+    ALLOCATE(ZMR(ILEVELM))
+    ALLOCATE(ZMRC(ILEVELM))
+    ZMRC=0
+    ALLOCATE(ZMRI(ILEVELM))
+    ZMRI=0
+    ALLOCATE(ZHEIGHTM(ILEVELM))        
+    ALLOCATE(ZTHV(ILEVELM))
+    ALLOCATE(ZTHL(ILEVELM))
+    ALLOCATE(ZRT(ILEVELM))     
+!
+!     Read the data at each mass level of the RS
+    DO JKM=2,ILEVELM
+      IF(LUSERI) THEN
+        READ(ILUPRE,*) ZPRESSM(JKM),ZTHD(JKM),ZMR(JKM),ZMRC(JKM),ZMRI(JKM)
+      ELSEIF (GUSERC) THEN
+        READ(ILUPRE,*) ZPRESSM(JKM),ZTHD(JKM),ZMR(JKM),ZMRC(JKM)
+      ELSE
+        READ(ILUPRE,*) ZPRESSM(JKM),ZTHD(JKM),ZMR(JKM)
+      ENDIF
+    END DO
+!
+!     Complete the mass arrays with the ground informations read in EXPRE file
+    ZPRESSM(1) = ZPGROUND                     ! Mass level 1 is at  the ground
+    ZTHD(1)    = ZTHDGROUND
+    ZMR(1)     = ZMRGROUND 
+    IF(GUSERC) ZMRC(1) = ZMRC(2)
+    IF(LUSERI) ZMRI(1) = ZMRI(2)
+!
+!     Compute thetav at the mass levels of the RS
+      ZTHV(:) = ZTHD(:) * (1. + ZRVSRD *ZMR(:))/(1.+ZMR(:)+ZMRC(:)+ZMRI(:))
+!
+!     Compute the heights at the mass levels of the RS
+    ZHEIGHTM(:) = HEIGHT_PRESS(ZPRESSM,ZTHV,ZPGROUND,ZTHV(1),ZZGROUND)
+!
+!     Compute thetav and heights of the wind levels
+    ZTHVU(:) = THETAVPU_THETAVPM(ZPRESSM,ZPRESSU,ZTHV)   
+    ZHEIGHTU(:) = HEIGHT_PRESS(ZPRESSU,ZTHVU,ZPGROUND,ZTHV(1),ZZGROUND)
+!
+!    Compute Theta l and Rt  
+    IF (.NOT. GUSERC  .AND. .NOT. LUSERI) THEN
+      ZRT(:)=ZMR(:)
+      ZTHL(:)=ZTHV(:)*(1+ZRT(:))/(1+ZRVSRD*ZRT(:))   
+    ELSE
+       ALLOCATE(ZEXN(ILEVELM))         
+       ALLOCATE(ZT(ILEVELM))       
+       ALLOCATE(ZCPH(ILEVELM))        
+       ALLOCATE(ZLVOCPEXN(ILEVELM))        
+       ALLOCATE(ZLSOCPEXN(ILEVELM))               
+       ZRT(:)=ZMR(:)+ZMRI(:)+ZMRC(:)
+       ZEXN(:)=(ZPRESSM/XP00) ** (XRD/XCPD)
+       ZT(:)=ZTHV*(ZPRESSM(:)/XP00)**(ZRDSCPD)*(1+ZRT(:))/(1+ZRVSRD*ZRT(:))
+       ZCPH(:)=XCPD+ XCPV * ZMR(:)+ XCL *ZMRC(:)  + XCI * ZMRI(:)
+       ZLVOCPEXN(:) = (XLVTT + (XCPV-XCL) * (ZT(:)-XTT))/(ZCPH*ZEXN(:))
+       ZLSOCPEXN(:) = (XLSTT + (XCPV-XCI) * (ZT(:)-XTT))/(ZCPH*ZEXN(:))
+       ZTHL(:)=ZTHV(:)*(1+ZRT(:))/(1+ZRVSRD*ZRT(:))-ZLVOCPEXN(:)*ZMRC(:)-ZLSOCPEXN(:)*ZMRI(:)
+       DEALLOCATE(ZEXN)         
+       DEALLOCATE(ZT)       
+       DEALLOCATE(ZCPH)        
+       DEALLOCATE(ZLVOCPEXN)        
+       DEALLOCATE(ZLSOCPEXN)
+    ENDIF   
+!
+!
+!*       2.7  PUVTHDHU case :  zGROUND, PGROUND, ThdGROUND, HuGROUND
+!                               (Pressure, U, V) , 
+!                               (Pressure, THd, Hu)
+!
+  CASE ('PUVTHDHU')
+!     Read data at ground level      
+    READ(ILUPRE,*) ZZGROUND              
+    READ(ILUPRE,*) ZPGROUND
+    READ(ILUPRE,*) ZTHDGROUND
+    READ(ILUPRE,*) ZHUGROUND
+!
+!     Read number of wind levels  
+    READ(ILUPRE,*) ILEVELU
+!
+!     Allocate the required memory
+    ALLOCATE(ZPRESSU(ILEVELU))         
+    ALLOCATE(ZU(ILEVELU),ZV(ILEVELU))
+    ALLOCATE(ZTHVU(ILEVELU))
+    ALLOCATE(ZHEIGHTU(ILEVELU))        
+!
+!     Read the data at each wind level of the RS
+    DO JKU = 1,ILEVELU
+      READ(ILUPRE,*) ZPRESSU(JKU),ZU(JKU),ZV(JKU)
+    END DO
+!
+!     Read number of mass levels 
+    READ(ILUPRE,*) ILEVELM
+!
+! Allocate the required memory
+    ALLOCATE(ZPRESSM(ILEVELM))          
+    ALLOCATE(ZTHD(ILEVELM))
+    ALLOCATE(ZHU(ILEVELM))
+    ALLOCATE(ZHEIGHTM(ILEVELM))          
+    ALLOCATE(ZTHV(ILEVELM))
+    ALLOCATE(ZMR(ILEVELM))
+    ALLOCATE(ZT(ILEVELM)) 
+    ALLOCATE(ZTHL(ILEVELM))
+    ALLOCATE(ZRT(ILEVELM))                                          
+!   
+!     Read the data at each mass level of the RS
+    DO JKM =2,ILEVELM
+      READ(ILUPRE,*) ZPRESSM(JKM),ZTHD(JKM), ZHU(JKM)
+    END DO
+!     Complete the mass arrays with the ground informations read in EXPRE file
+    ZPRESSM(1) = ZPGROUND                     ! Mass level 1 is at the  ground
+    ZTHD(1)    = ZTHDGROUND
+    ZHU(1)     = ZHUGROUND
+! 
+    ZT(:) = ZTHD(:) * (ZPRESSM(:)/XP00)**ZRDSCPD  ! compute T and mixing ratio
+    ZMR(:) = ZRDSRV*SM_FOES(ZT(:))/((ZPRESSM(:)*100./ZHU(:)) -SM_FOES(ZT(:)))
+                         
+!     Compute thetav at the mass levels of the RS
+    ZTHV(:) = ZTHD(:)  * (1. + ZRVSRD *ZMR(:))/(1.+ZMR(:)) 
+!
+!     Compute height at mass levels
+    ZHEIGHTM(:) = HEIGHT_PRESS(ZPRESSM,ZTHV,ZPGROUND,ZTHV(1),ZZGROUND) 
+!
+!     Compute thetav and heights of the wind levels 
+    ZTHVU(:) = THETAVPU_THETAVPM(ZPRESSM,ZPRESSU,ZTHV) 
+    ZHEIGHTU(:) = HEIGHT_PRESS(ZPRESSU,ZTHVU,ZPGROUND,ZTHV(1),ZZGROUND)   
+!
+!   Compute thetal and Rt
+    ZRT(:)=ZMR(:)
+    ZTHL(:)=ZTHV(:)*(1+ZRT(:))/(1+ZRVSRD*ZRT(:))      
+!
+!*       2.8  ZUVTHDMR case :  zGROUND, PGROUND, ThdGROUND, RGROUND
+!                               (height, U, V) , 
+!                               (height, THd, R)
+!
+  CASE ('ZUVTHDMR')
+! Read data at ground level
+    READ(ILUPRE,*) ZZGROUND                  
+    READ(ILUPRE,*) ZPGROUND
+    READ(ILUPRE,*) ZTHDGROUND
+    READ(ILUPRE,*) ZMRGROUND
+!
+!     Read number of wind levels  
+    READ(ILUPRE,*) ILEVELU
+!
+!   Allocate required memory 
+    ALLOCATE(ZHEIGHTU(ILEVELU))           
+    ALLOCATE(ZU(ILEVELU),ZV(ILEVELU))
+!
+!     Read the data at each wind level of the RS
+    DO JKU = 1,ILEVELU
+      READ(ILUPRE,*) ZHEIGHTU(JKU),ZU(JKU),ZV(JKU)
+    END DO
+! 
+!     Read number of mass levels  
+     READ(ILUPRE,*) ILEVELM
+!
+!   Allocate required memory 
+    ALLOCATE(ZHEIGHTM(ILEVELM))           
+    ALLOCATE(ZTHD(ILEVELM))
+    ALLOCATE(ZMR(ILEVELM))
+    ALLOCATE(ZTHV(ILEVELM)) 
+    ALLOCATE(ZMRC(ILEVELM))
+    ZMRC=0
+    ALLOCATE(ZMRI(ILEVELM))
+    ZMRI=0
+    ALLOCATE(ZTHL(ILEVELM))
+    ALLOCATE(ZRT(ILEVELM))
+!
+!     Read the data at each mass level of the RS
+    DO JKM= 2,ILEVELM
+      IF(LUSERI) THEN
+        READ(ILUPRE,*) ZHEIGHTM(JKM),ZTHD(JKM),ZMR(JKM),ZMRC(JKM),ZMRI(JKM)
+      ELSEIF (GUSERC) THEN
+        READ(ILUPRE,*) ZHEIGHTM(JKM),ZTHD(JKM),ZMR(JKM),ZMRC(JKM)
+      ELSE
+        READ(ILUPRE,*) ZHEIGHTM(JKM),ZTHD(JKM),ZMR(JKM)
+      ENDIF
+    END DO
+!     Complete the mass arrays with the ground informations read in EXPRE file
+    ZHEIGHTM(1) = ZZGROUND                     ! Mass level 1 is at ground
+    ZTHD(1)     = ZTHDGROUND
+    ZMR(1)      = ZMRGROUND
+    IF(GUSERC) ZMRC(1) = ZMRC(2)
+    IF(LUSERI) ZMRI(1) = ZMRI(2)
+!     Compute thetav at the mass levels of the RS
+    IF(LUSERI) THEN
+      ZTHV(:) = ZTHD(:) * (1. + ZRVSRD *ZMR(:))/(1.+ZMR(:)+ZMRC(:)+ZMRI(:))
+    ELSEIF (GUSERC) THEN
+      ZTHV(:) = ZTHD(:) * (1. + ZRVSRD *ZMR(:))/(1.+ZMR(:)+ZMRC(:))
+    ELSE
+      ZTHV(:) = ZTHD(:) * (1. + ZRVSRD *ZMR(:))/(1.+ZMR(:))
+    ENDIF    
+!    
+!    Compute Theta l and Rt  
+    IF (.NOT. GUSERC  .AND. .NOT. LUSERI) THEN
+      ZRT(:)=ZMR(:)
+      ZTHL(:)=ZTHV(:)*(1+ZRT(:))/(1+ZRVSRD*ZRT(:))   
+    ELSE
+       ALLOCATE(ZEXN(ILEVELM))  
+       ALLOCATE(ZEXNFLUX(ILEVELM))        
+       ALLOCATE(ZT(ILEVELM))       
+       ALLOCATE(ZCPH(ILEVELM))        
+       ALLOCATE(ZLVOCPEXN(ILEVELM))        
+       ALLOCATE(ZLSOCPEXN(ILEVELM))  
+       ZRT(:)=ZMR(:)+ZMRI(:)+ZMRC(:)
+       ZEXNSURF=(ZPGROUND/XP00) ** (XRD/XCPD)
+       CALL COMPUTE_EXNER_FROM_GROUND(ZTHV,ZHEIGHTM,ZEXNSURF,ZEXNFLUX,ZEXN)
+       ZT(:)=ZTHV*ZEXN(:)*(1+ZRT(:))/(1+ZRVSRD*ZRT(:))
+       ZCPH(:)=XCPD+ XCPV * ZMR(:)+ XCL *ZMRC(:)  + XCI * ZMRI(:)
+       ZLVOCPEXN(:) = (XLVTT + (XCPV-XCL) * (ZT(:)-XTT))/(ZCPH*ZEXN(:))
+       ZLSOCPEXN(:) = (XLSTT + (XCPV-XCI) * (ZT(:)-XTT))/(ZCPH*ZEXN(:))
+       ZTHL(:)=ZTHV(:)*(1+ZRT(:))/(1+ZRVSRD*ZRT(:))-ZLVOCPEXN(:)*ZMRC(:)-ZLSOCPEXN(:)*ZMRI(:)
+       DEALLOCATE(ZEXN)         
+       DEALLOCATE(ZEXNFLUX)         
+       DEALLOCATE(ZT)       
+       DEALLOCATE(ZCPH)        
+       DEALLOCATE(ZLVOCPEXN)        
+       DEALLOCATE(ZLSOCPEXN)
+    ENDIF  
+!
+! 2.9 ZUVTHLMR case : zGROUND, PGROUND, ThdGROUND, RGROUND
+!                               (height, U, V)
+!                               (height, THL, Rt)
+
+!
+  CASE ('ZUVTHLMR')
+! Read data at ground level
+    READ(ILUPRE,*) ZZGROUND                  
+    READ(ILUPRE,*) ZPGROUND
+    READ(ILUPRE,*) ZTHLGROUND
+    READ(ILUPRE,*) ZMRGROUND
+!
+!   Read number of wind levels  
+    READ(ILUPRE,*) ILEVELU
+!
+!   Allocate required memory 
+    ALLOCATE(ZHEIGHTU(ILEVELU))           
+    ALLOCATE(ZU(ILEVELU),ZV(ILEVELU))
+!
+!   Read the data at each wind level of the RS
+    DO JKU = 1,ILEVELU
+      READ(ILUPRE,*) ZHEIGHTU(JKU),ZU(JKU),ZV(JKU)
+    END DO
+! 
+!   Read number of mass levels  
+    READ(ILUPRE,*) ILEVELM
+!
+!   Allocate required memory 
+    ALLOCATE(ZHEIGHTM(ILEVELM))           
+    ALLOCATE(ZTHL(ILEVELM))
+    ALLOCATE(ZTH(ILEVELM))
+    ALLOCATE(ZMR(ILEVELM))
+    ALLOCATE(ZTHV(ILEVELM)) 
+    ALLOCATE(ZMRC(ILEVELM))
+    ZMRC=0
+    ALLOCATE(ZMRI(ILEVELM))
+    ZMRI=0    
+    ALLOCATE(ZRT(ILEVELM))
+!
+!   Read the data at each mass level of the RS
+    DO JKM= 2,ILEVELM
+!     IF(LUSERI) THEN
+!       READ(ILUPRE,*) ZHEIGHTM(JKM),ZTHL(JKM),ZMR(JKM),ZMRC(JKM),ZMRI(JKM)
+!     ELSEIF (GUSERC) THEN
+      IF (GUSERC) THEN
+        READ(ILUPRE,*) ZHEIGHTM(JKM),ZTHL(JKM),ZMR(JKM),ZMRC(JKM)
+      ELSE
+        READ(ILUPRE,*) ZHEIGHTM(JKM),ZTHL(JKM),ZMR(JKM)
+      ENDIF
+    END DO
+!   Complete the mass arrays with the ground informations read in EXPRE file
+    ZHEIGHTM(1) = ZZGROUND                     ! Mass level 1 is at ground
+    ZTHL(1)     = ZTHLGROUND
+    ZMR(1)      = ZMRGROUND
+    IF(GUSERC) ZMRC(1) = ZMRC(2)
+!   IF(LUSERI) ZMRI(1) = ZMRI(2)
+!
+!   Compute Rt
+    ZRT(:)=ZMR+ZMRC+ZMRI
+!
+!*       2.10  PUVTHU case :  zGROUND, PGROUND, TempGROUND, HuGROUND
+!                               (Pressure, U, V) , 
+!                               (Pressure, Temp, Hu)
+!
+  CASE ('PUVTHU')
+!     Read data at ground level      
+    READ(ILUPRE,*) ZZGROUND              
+    READ(ILUPRE,*) ZPGROUND
+    READ(ILUPRE,*) ZTGROUND
+    READ(ILUPRE,*) ZHUGROUND
+!
+!     Read number of wind levels  
+    READ(ILUPRE,*) ILEVELU
+!
+!     Allocate the required memory
+    ALLOCATE(ZPRESSU(ILEVELU))         
+    ALLOCATE(ZU(ILEVELU),ZV(ILEVELU))
+    ALLOCATE(ZTHVU(ILEVELU))
+    ALLOCATE(ZHEIGHTU(ILEVELU))        
+!
+!     Read the data at each wind level of the RS
+    DO JKU = 1,ILEVELU
+      READ(ILUPRE,*) ZPRESSU(JKU),ZU(JKU),ZV(JKU)
+    END DO
+!
+!     Read number of mass levels 
+    READ(ILUPRE,*) ILEVELM
+!
+! Allocate the required memory
+    ALLOCATE(ZPRESSM(ILEVELM))          
+    ALLOCATE(ZTHD(ILEVELM))
+    ALLOCATE(ZHU(ILEVELM))
+    ALLOCATE(ZHEIGHTM(ILEVELM))          
+    ALLOCATE(ZTHV(ILEVELM))
+    ALLOCATE(ZMR(ILEVELM))
+    ALLOCATE(ZT(ILEVELM))  
+    ALLOCATE(ZTHL(ILEVELM))
+    ALLOCATE(ZRT(ILEVELM))
+
+!   
+!     Read the data at each mass level of the RS
+    DO JKM =2,ILEVELM
+      READ(ILUPRE,*) ZPRESSM(JKM),ZT(JKM), ZHU(JKM)
+    END DO
+!     Complete the mass arrays with the ground informations read in EXPRE file
+    ZPRESSM(1) = ZPGROUND                     ! Mass level 1 is at the  ground
+    ZT(1)    = ZTGROUND
+    ZHU(1)     = ZHUGROUND
+! 
+    ZTHD(:) = ZT(:) / (ZPRESSM(:)/XP00)**ZRDSCPD  ! compute THD and mixing ratio
+    ZMR(:) = ZRDSRV*SM_FOES(ZT(:))/((ZPRESSM(:)*100./ZHU(:)) -SM_FOES(ZT(:)))
+!     Compute thetav at the mass levels of the RS
+    ZTHV(:) = ZTHD(:)  * (1. + ZRVSRD *ZMR(:))/(1.+ZMR(:)) 
+!
+!     Compute height at mass levels
+    ZHEIGHTM(:) = HEIGHT_PRESS(ZPRESSM,ZTHV,ZPGROUND,ZTHV(1),ZZGROUND) 
+!
+!     Compute thetav and heights of the wind levels 
+    ZTHVU(:) = THETAVPU_THETAVPM(ZPRESSM,ZPRESSU,ZTHV) 
+    ZHEIGHTU(:) = HEIGHT_PRESS(ZPRESSU,ZTHVU,ZPGROUND,ZTHV(1),ZZGROUND)   
+!
+! on interpole thetal(=theta quand il n'y a pas d'eau liquide) et r total
+     ZRT(:)=ZMR(:)
+     ZTHL(:)=ZTHV(:)*(1+ZRT(:))/(1+ZRVSRD*ZRT(:))
+  CASE DEFAULT
+    CALL PRINT_MSG(NVERB_FATAL,'GEN','SET_RSOU','data type YKIND='//TRIM(YKIND)//' in PREFILE unknown')
+END SELECT
+!
+!-------------------------------------------------------------------------------
+!
+!*	 3.     INTERPOLATE ON THE  VERTICAL MIXED MODEL GRID 
+!	        ---------------------------------------------------------
+!
+!
+! 
+IKU=SIZE(XZHAT)
+!
+!*       3.1    Compute mixed grid
+! 
+IF (PRESENT(PCORIOZ)) THEN 
+! LGEOSBAL=T (no shift allowed, MNH grid without ororgraphy)
+  ZZS_LS(:,:)=0
+ELSE
+  IF (OSHIFT) THEN
+    ZZS_LS(:,:)=ZZGROUND
+  ELSE
+    ZZS_LS(:,:)=0
+  ENDIF
+ENDIF
+CALL VERT_COORD(LSLEVE,ZZS_LS,ZZS_LS,XLEN1,XLEN2,XZHAT,ZZFLUX_MX)
+ZZMASS_MX(:,:,:)=MZF(ZZFLUX_MX)
+ZZMASS_MX(:,:,IKU)=1.5*ZZFLUX_MX(:,:,IKU)-0.5*ZZFLUX_MX(:,:,IKU-1)
+!
+!*        3.2  Interpolate and extrapolate U and V on w- mixed grid levels
+!
+!* vertical grid at initialization profile location
+GPROFILE_IN_PROC=(KILOC+JPHEXT-IXOR_ll+1>=IIB .AND. KILOC+JPHEXT-IXOR_ll+1<=IIE) &
+         & .AND. (KJLOC+JPHEXT-IYOR_ll+1>=IJB .AND. KJLOC+JPHEXT-IYOR_ll+1<=IJE)
+!
+IF (GPROFILE_IN_PROC) THEN
+  ZZMASS_PROFILE(:) = ZZMASS_MX(KILOC+JPHEXT-IXOR_ll+1,KJLOC+JPHEXT-IYOR_ll+1,:)
+  ZZFLUX_PROFILE(:) = ZZFLUX_MX(KILOC+JPHEXT-IXOR_ll+1,KJLOC+JPHEXT-IYOR_ll+1,:)
+ELSE
+  ZZMASS_PROFILE(:) = 0.
+  ZZFLUX_PROFILE(:) = 0.
+END IF
+DO JK = 1,IKU
+  CALL REDUCESUM_ll(ZZMASS_PROFILE(JK), IINFO_ll)
+  CALL REDUCESUM_ll(ZZFLUX_PROFILE(JK), IINFO_ll)
+END DO
+
+! interpolation of U and V
+DO JK = 1,IKU
+  IF (ZZFLUX_PROFILE(JK) <= ZHEIGHTU(1)) THEN      ! extrapolation below the first level
+          ZDZSDH  = (ZZFLUX_PROFILE(JK) - ZHEIGHTU(1)) / (ZHEIGHTU(2) - ZHEIGHTU(1))
+          ZUW(JK) = ZU(1) + (ZU(2) - ZU(1)) * ZDZSDH
+          ZVW(JK) = ZV(1) + (ZV(2) - ZV(1)) * ZDZSDH 
+  ELSE IF (ZZFLUX_PROFILE(JK) > ZHEIGHTU(ILEVELU) ) THEN  ! extrapolation above the last
+    ZDZSDH  = (ZZFLUX_PROFILE(JK) - ZHEIGHTU(ILEVELU))                   &   ! level
+            / (ZHEIGHTU(ILEVELU) - ZHEIGHTU(ILEVELU-1))
+    ZUW(JK) = ZU(ILEVELU) + (ZU(ILEVELU) -ZU(ILEVELU -1)) * ZDZSDH
+    ZVW(JK) = ZV(ILEVELU) + (ZV(ILEVELU) -ZV(ILEVELU -1)) * ZDZSDH
+  ELSE                       ! interpolation between the first and last levels
+    DO JKLEV = 1,ILEVELU-1
+      IF ( (ZZFLUX_PROFILE(JK) > ZHEIGHTU(JKLEV)).AND.                  &
+           (ZZFLUX_PROFILE(JK) <= ZHEIGHTU(JKLEV+1)) )THEN 
+        ZDZ1SDH = (ZZFLUX_PROFILE(JK) - ZHEIGHTU(JKLEV))                &
+              / (ZHEIGHTU(JKLEV+1)-ZHEIGHTU(JKLEV)) 
+        ZDZ2SDH = (ZHEIGHTU(JKLEV+1) - ZZFLUX_PROFILE(JK) )             &
+              / (ZHEIGHTU(JKLEV+1)-ZHEIGHTU(JKLEV)) 
+        ZUW(JK) = (ZU(JKLEV) * ZDZ2SDH) + (ZU(JKLEV+1) *ZDZ1SDH)
+        ZVW(JK) = (ZV(JKLEV) * ZDZ2SDH) + (ZV(JKLEV+1) *ZDZ1SDH)
+      END IF        
+    END DO
+  END IF
+END DO
+!
+!*       3.3    Interpolate and extrapolate Thetav and r on  mass mixed grid levels
+!
+ZMRCM=0
+ZMRIM=0
+DO JK = 1,IKU
+  IF (ZZMASS_PROFILE(JK) <= ZHEIGHTM(1)) THEN    ! extrapolation below the first level
+    ZDZSDH  = (ZZMASS_PROFILE(JK) - ZHEIGHTM(1)) / (ZHEIGHTM(2) - ZHEIGHTM(1))
+    ZTHLM(JK) = ZTHL(1) + (ZTHL(2) - ZTHL(1)) * ZDZSDH
+    ZMRM(JK)  = ZRT(1) + (ZRT(2) - ZRT(1)) * ZDZSDH 
+    IF (GUSERC) ZMRCM(JK)  = ZMRC(1) + (ZMRC(2) - ZMRC(1)) * ZDZSDH 
+    IF (LUSERI) ZMRIM(JK)  = ZMRI(1) + (ZMRI(2) - ZMRI(1)) * ZDZSDH 
+  ELSE IF (ZZMASS_PROFILE(JK) > ZHEIGHTM(ILEVELM) ) THEN  ! extrapolation above the last
+    ZDZSDH  = (ZZMASS_PROFILE(JK) - ZHEIGHTM(ILEVELM))                   &  ! level
+            / (ZHEIGHTM(ILEVELM) - ZHEIGHTM(ILEVELM-1))
+    ZTHLM(JK) = ZTHL(ILEVELM) + (ZTHL(ILEVELM) -ZTHL(ILEVELM -1)) * ZDZSDH
+    ZMRM(JK) = ZRT(ILEVELM) + (ZRT(ILEVELM) -ZRT(ILEVELM -1)) * ZDZSDH
+    IF (GUSERC) ZMRCM(JK) = ZMRC(ILEVELM) + (ZMRC(ILEVELM) -ZMRC(ILEVELM -1)) * ZDZSDH
+    IF (LUSERI) ZMRIM(JK) = ZMRI(ILEVELM) + (ZMRI(ILEVELM) -ZMRI(ILEVELM -1)) * ZDZSDH
+  ELSE  ! interpolation between the first and last levels
+    DO JKLEV = 1,ILEVELM-1
+      IF ( (ZZMASS_PROFILE(JK) > ZHEIGHTM(JKLEV)).AND.                  &
+           (ZZMASS_PROFILE(JK) <= ZHEIGHTM(JKLEV+1)) )THEN 
+        ZDZ1SDH = (ZZMASS_PROFILE(JK) - ZHEIGHTM(JKLEV))                 &
+              / (ZHEIGHTM(JKLEV+1)-ZHEIGHTM(JKLEV)) 
+        ZDZ2SDH = (ZHEIGHTM(JKLEV+1) - ZZMASS_PROFILE(JK) )              &
+              / (ZHEIGHTM(JKLEV+1)-ZHEIGHTM(JKLEV)) 
+        ZTHLM(JK) = (ZTHL(JKLEV) * ZDZ2SDH) + (ZTHL(JKLEV+1) *ZDZ1SDH)
+        ZMRM(JK)  = (ZRT(JKLEV) * ZDZ2SDH) + (ZRT(JKLEV+1) *ZDZ1SDH)
+        IF (GUSERC) ZMRCM(JK)  = (ZMRC(JKLEV) * ZDZ2SDH) + (ZMRC(JKLEV+1) *ZDZ1SDH)
+        IF (LUSERI) ZMRIM(JK)  = (ZMRI(JKLEV) * ZDZ2SDH) + (ZMRI(JKLEV+1) *ZDZ1SDH)
+      END IF 
+    END DO
+  END IF
+END DO
+!
+! Compute thetaV rv ri and Rc with adjustement
+ALLOCATE(ZEXNFLUX(IKU))
+ALLOCATE(ZEXNMASS(IKU))
+ALLOCATE(ZPRESS(IKU))
+ALLOCATE(ZPREFLUX(IKU))
+ALLOCATE(ZFRAC_ICE(IKU))
+ALLOCATE(ZRSATW(IKU))
+ALLOCATE(ZRSATI(IKU))
+ALLOCATE(ZMRT(IKU))
+ZMRT=ZMRM+ZMRCM+ZMRIM
+ZTHVM=ZTHLM
+!
+IF (LOCEAN) THEN
+  ZRHODM(:)=XRH00OCEAN*(1.-XALPHAOC*(ZTHLM(:) - XTH00OCEAN)&
+          +XBETAOC* (ZMRM(:)  - XSA00OCEAN))
+  ZPREFLUX(IKU)=ZPTOP
+  DO JK=IKU-1,2,-1
+    ZPREFLUX(JK) = ZPREFLUX(JK+1) + XG*ZRHODM(JK)*(ZZFLUX_PROFILE(JK+1)-ZZFLUX_PROFILE(JK))
+  END DO
+  ZPGROUND=ZPREFLUX(2)
+  WRITE(ILUOUT,FMT=*)'ZPGROUND i.e. Pressure at ocean domain bottom',ZPGROUND
+  ZTHM=ZTHVM
+ELSE
+! Atmospheric case   
+  ZEXNSURF=(ZPGROUND/XP00)**(XRD/XCPD)
+  DO JLOOP=1,20 ! loop for pression 
+    CALL COMPUTE_EXNER_FROM_GROUND(ZTHVM,ZZMASS_PROFILE(:),ZEXNSURF,ZEXNFLUX,ZEXNMASS)
+    ZPRESS(:)=XP00*(ZEXNMASS(:))**(XCPD/XRD)
+    CALL TH_R_FROM_THL_RT_1D('T',ZFRAC_ICE,ZPRESS,ZTHLM,ZMRT,ZTHM,ZMRM,ZMRCM,ZMRIM, &
+                              ZRSATW, ZRSATI)
+     ZTHVM(:)=ZTHM(:)*(1.+XRV/XRD*ZMRM(:))/(1.+(ZMRM(:)+ZMRIM(:)+ZMRCM(:)))
+  ENDDO
+ENDIF
+!
+DEALLOCATE(ZEXNFLUX)
+DEALLOCATE(ZEXNMASS)
+DEALLOCATE(ZPRESS)
+DEALLOCATE(ZFRAC_ICE)
+DEALLOCATE(ZRSATW)
+DEALLOCATE(ZRSATI)       
+DEALLOCATE(ZMRT)
+!-------------------------------------------------------------------------------
+!
+!* 4.     COMPUTE FIELDS ON THE MODEL GRID (WITH OROGRAPHY)
+!         -------------------------------------------------
+CALL SET_MASS(TPFILE,GPROFILE_IN_PROC, ZZFLUX_PROFILE,                      &
+              KILOC+JPHEXT,KJLOC+JPHEXT,ZZS_LS,ZZMASS_MX,ZZFLUX_MX,ZPGROUND,&
+              ZTHVM,ZMRM,ZUW,ZVW,OSHIFT,OBOUSS,PJ,HFUNU,HFUNV,              &
+              PMRCM=ZMRCM,PMRIM=ZMRIM,PCORIOZ=PCORIOZ)
+!
+DEALLOCATE(ZPREFLUX)
+DEALLOCATE(ZHEIGHTM)          
+DEALLOCATE(ZTHV)
+DEALLOCATE(ZMR)
+DEALLOCATE(ZTHL)
+!-------------------------------------------------------------------------------
+CONTAINS
+  SUBROUTINE CHECK( ISTATUS, YLOC )
+    INTEGER(KIND=CDFINT), INTENT(IN) :: ISTATUS
+    CHARACTER(LEN=*),     INTENT(IN) :: YLOC
+
+    IF( ISTATUS /= NF90_NOERR ) THEN
+      CALL PRINT_MSG( NVERB_ERROR, 'IO', 'SET_RSOU', 'error at ' // Trim( yloc) // ': ' // NF90_STRERROR( ISTATUS ) )
+    END IF
+  END SUBROUTINE check
+!
+END SUBROUTINE SET_RSOU
diff --git a/src/mesonh/ext/shallow_mf_pack.f90 b/src/mesonh/ext/shallow_mf_pack.f90
new file mode 100644
index 000000000..d5c0bbdfe
--- /dev/null
+++ b/src/mesonh/ext/shallow_mf_pack.f90
@@ -0,0 +1,481 @@
+!MNH_LIC Copyright 2010-2021 CNRS, Meteo-France and Universite Paul Sabatier
+!MNH_LIC This is part of the Meso-NH software governed by the CeCILL-C licence
+!MNH_LIC version 1. See LICENSE, CeCILL-C_V1-en.txt and CeCILL-C_V1-fr.txt
+!MNH_LIC for details. version 1.
+!-----------------------------------------------------------------
+!    ######################
+     MODULE MODI_SHALLOW_MF_PACK
+!    ######################
+!
+INTERFACE
+!     #################################################################
+      SUBROUTINE SHALLOW_MF_PACK(KRR,KRRL,KRRI,                       &
+                HMF_UPDRAFT, HMF_CLOUD, OMIXUV,                       &
+                OMF_FLX,TPFILE,PTIME_LES,                             &
+                PIMPL_MF, PTSTEP,                                     &
+                PDZZ, PZZ,                                            &
+                PRHODJ, PRHODREF,                                     &
+                PPABSM, PEXN,                                         &
+                PSFTH,PSFRV,                                          &
+                PTHM,PRM,PUM,PVM,PWM,PTKEM,PSVM,                      &
+                PRTHS,PRRS,PRUS,PRVS,PRSVS,                           &
+                PSIGMF,PRC_MF,PRI_MF,PCF_MF,PFLXZTHVMF  )
+!     #################################################################
+!!
+use MODD_IO,        only: TFILEDATA
+use modd_precision, only: MNHTIME
+!
+!*               1.1  Declaration of Arguments
+!
+!
+INTEGER,                INTENT(IN)   :: KRR        ! number of moist var.
+INTEGER,                INTENT(IN)   :: KRRL       ! number of liquid water var.
+INTEGER,                INTENT(IN)   :: KRRI       ! number of ice water var.
+CHARACTER (LEN=4),      INTENT(IN)   :: HMF_UPDRAFT! Type of Mass Flux Scheme
+                                     ! 'NONE' if no parameterization 
+CHARACTER (LEN=4),      INTENT(IN)   :: HMF_CLOUD  ! Type of statistical cloud
+                                                   ! scheme
+LOGICAL,                INTENT(IN)   :: OMIXUV     ! True if mixing of momentum
+LOGICAL,                INTENT(IN)   :: OMF_FLX    ! switch to write the
+                                                   ! MF fluxes in the synchronous FM-file
+TYPE(TFILEDATA),        INTENT(IN)   :: TPFILE     ! Output file
+REAL(kind=MNHTIME),DIMENSION(2), INTENT(OUT)  :: PTIME_LES  ! time spent in LES computations
+REAL,                   INTENT(IN)   :: PIMPL_MF   ! degre of implicitness
+REAL,                   INTENT(IN)   :: PTSTEP     ! Dynamical timestep 
+
+REAL, DIMENSION(:,:,:), INTENT(IN) ::  PZZ         ! Height of flux point
+REAL, DIMENSION(:,:,:), INTENT(IN) ::  PDZZ        ! Metric coefficients
+REAL, DIMENSION(:,:,:), INTENT(IN) ::  PRHODJ      ! dry density * Grid size
+REAL, DIMENSION(:,:,:), INTENT(IN) ::  PRHODREF    ! dry density of the
+                                                     ! reference state
+REAL, DIMENSION(:,:,:), INTENT(IN) ::  PPABSM      ! Pressure at time t-1
+REAL, DIMENSION(:,:,:), INTENT(IN) ::  PEXN        ! Exner function at t-dt
+
+REAL, DIMENSION(:,:),   INTENT(IN) ::  PSFTH,PSFRV ! normal surface fluxes of theta and Rv 
+REAL, DIMENSION(:,:,:), INTENT(IN) ::  PTHM        ! Theta at t-dt
+REAL, DIMENSION(:,:,:,:),INTENT(IN)::  PRM         ! water var. at t-dt
+REAL, DIMENSION(:,:,:), INTENT(IN) ::  PUM,PVM,PWM ! wind components at t-dt
+REAL, DIMENSION(:,:,:), INTENT(IN) ::  PTKEM       ! tke at t-dt
+
+REAL, DIMENSION(:,:,:,:), INTENT(IN) ::  PSVM      ! scalar variable a t-dt
+
+REAL, DIMENSION(:,:,:),   INTENT(INOUT) ::  PRUS,PRVS,PRTHS ! Meso-NH sources
+REAL, DIMENSION(:,:,:,:), INTENT(INOUT) ::  PRRS 
+REAL, DIMENSION(:,:,:,:), INTENT(INOUT) ::  PRSVS            ! Scalar sources 
+REAL, DIMENSION(:,:,:), INTENT(OUT)     ::  PSIGMF,PRC_MF,PRI_MF,PCF_MF ! cloud info for the cloud scheme
+REAL, DIMENSION(:,:,:), INTENT(OUT)     ::  PFLXZTHVMF           ! Thermal production for TKE scheme
+
+
+END SUBROUTINE SHALLOW_MF_PACK
+
+END INTERFACE
+!
+END MODULE MODI_SHALLOW_MF_PACK
+
+!     #################################################################
+      SUBROUTINE SHALLOW_MF_PACK(KRR,KRRL,KRRI,                       &
+                HMF_UPDRAFT, HMF_CLOUD, OMIXUV,                       &
+                OMF_FLX,TPFILE,PTIME_LES,                             &
+                PIMPL_MF, PTSTEP,                                     &
+                PDZZ, PZZ,                                            &
+                PRHODJ, PRHODREF,                                     &
+                PPABSM, PEXN,                                         &
+                PSFTH,PSFRV,                                          &
+                PTHM,PRM,PUM,PVM,PWM,PTKEM,PSVM,                      &
+                PRTHS,PRRS,PRUS,PRVS,PRSVS,                           &
+                PSIGMF,PRC_MF,PRI_MF,PCF_MF,PFLXZTHVMF  )
+!     #################################################################
+!!
+!!****  *SHALLOW_MF_PACK* - 
+!!       
+!!
+!!    PURPOSE
+!!    -------
+!!****  The purpose of this routine is
+!!
+!
+!!**  METHOD
+!!    ------
+!!
+!!    EXTERNAL
+!!    --------
+!!      
+!!    IMPLICIT ARGUMENTS
+!!    ------------------
+!!
+!!     REFERENCE
+!!     ---------
+!!
+!!
+!!     AUTHOR
+!!     ------
+!!      V.Masson 09/2010
+! --------------------------------------------------------------------------
+! Modifications:
+!  R. Honnert     07/2012: introduction of vertical wind for the height of the thermal
+!  M. Leriche     02/2017: avoid negative values for sv tendencies
+!  P. Wautelet 05/2016-04/2018: new data structures and calls for I/O
+!  S. Riette      11/2016: support for CFRAC_ICE_SHALLOW_MF
+!  P. Wautelet 28/03/2019: use MNHTIME for time measurement variables
+!  P. Wautelet    02/2020: use the new data structures and subroutines for budgets
+! --------------------------------------------------------------------------
+!
+!*      0. DECLARATIONS
+!          ------------
+!
+use modd_budget,          only: lbudget_u, lbudget_v, lbudget_th, lbudget_rv, lbudget_sv,  &
+                                NBUDGET_U, NBUDGET_V, NBUDGET_TH, NBUDGET_RV, NBUDGET_SV1, &
+                                tbudgets
+USE MODD_CONF
+USE MODD_CST
+USE MODD_IO,              ONLY: TFILEDATA
+use modd_field,           only: tfielddata, TYPEREAL
+USE MODD_NSV
+USE MODD_PARAMETERS
+USE MODD_PARAM_ICE,       ONLY: CFRAC_ICE_SHALLOW_MF
+USE MODD_PARAM_MFSHALL_n
+use modd_precision,       only: MNHTIME
+
+use mode_budget,          only: Budget_store_init, Budget_store_end
+USE MODE_IO_FIELD_WRITE,  only: IO_Field_write
+
+USE MODI_DIAGNOS_LES_MF
+USE MODI_SHALLOW_MF
+USE MODI_SHUMAN
+!
+IMPLICIT NONE
+
+!*                    0.1  Declaration of Arguments
+!
+!
+!
+INTEGER,                INTENT(IN)   :: KRR        ! number of moist var.
+INTEGER,                INTENT(IN)   :: KRRL       ! number of liquid water var.
+INTEGER,                INTENT(IN)   :: KRRI       ! number of ice water var.
+CHARACTER (LEN=4),      INTENT(IN)   :: HMF_UPDRAFT! Type of Mass Flux Scheme
+                                     ! 'NONE' if no parameterization 
+CHARACTER (LEN=4),      INTENT(IN)   :: HMF_CLOUD  ! Type of statistical cloud
+                                                   ! scheme
+LOGICAL,                INTENT(IN)   :: OMIXUV     ! True if mixing of momentum
+LOGICAL,                INTENT(IN)   :: OMF_FLX    ! switch to write the
+                                                   ! MF fluxes in the synchronous FM-file
+TYPE(TFILEDATA),        INTENT(IN)   :: TPFILE     ! Output file
+REAL(kind=MNHTIME),DIMENSION(2), INTENT(OUT)  :: PTIME_LES  ! time spent in LES computations
+REAL,                   INTENT(IN)   :: PIMPL_MF   ! degre of implicitness
+REAL,                   INTENT(IN)   :: PTSTEP     ! Dynamical timestep 
+
+REAL, DIMENSION(:,:,:), INTENT(IN) ::  PZZ         ! Height of flux point
+REAL, DIMENSION(:,:,:), INTENT(IN) ::  PDZZ        ! Metric coefficients
+REAL, DIMENSION(:,:,:), INTENT(IN) ::  PRHODJ      ! dry density * Grid size
+REAL, DIMENSION(:,:,:), INTENT(IN) ::  PRHODREF    ! dry density of the
+                                                     ! reference state
+REAL, DIMENSION(:,:,:), INTENT(IN) ::  PPABSM      ! Pressure at time t-1
+REAL, DIMENSION(:,:,:), INTENT(IN) ::  PEXN        ! Exner function at t-dt
+
+REAL, DIMENSION(:,:),   INTENT(IN) ::  PSFTH,PSFRV ! normal surface fluxes of theta and Rv 
+REAL, DIMENSION(:,:,:), INTENT(IN) ::  PTHM        ! Theta at t-dt
+REAL, DIMENSION(:,:,:,:),INTENT(IN)::  PRM         ! water var. at t-dt
+REAL, DIMENSION(:,:,:), INTENT(IN) ::  PUM,PVM,PWM ! wind components at t-dt
+REAL, DIMENSION(:,:,:), INTENT(IN) ::  PTKEM       ! tke at t-dt
+
+REAL, DIMENSION(:,:,:,:), INTENT(IN) ::  PSVM        ! scalar variable a t-dt
+
+REAL, DIMENSION(:,:,:),   INTENT(INOUT) ::  PRUS,PRVS,PRTHS ! Meso-NH sources
+REAL, DIMENSION(:,:,:,:), INTENT(INOUT) ::  PRRS 
+REAL, DIMENSION(:,:,:,:), INTENT(INOUT) ::  PRSVS            ! Scalar sources 
+REAL, DIMENSION(:,:,:), INTENT(OUT)     ::  PSIGMF,PRC_MF,PRI_MF,PCF_MF ! cloud info for the cloud scheme
+REAL, DIMENSION(:,:,:), INTENT(OUT)     ::  PFLXZTHVMF           ! Thermal production for TKE scheme
+!
+!                     0.2  Declaration of local variables
+!
+REAL, DIMENSION(SIZE(PTHM,1)*SIZE(PTHM,2),SIZE(PTHM,3)) ::  ZZZ         ! Height of flux point
+REAL, DIMENSION(SIZE(PTHM,1)*SIZE(PTHM,2),SIZE(PTHM,3)) ::  ZDZZ        ! Metric coefficients
+REAL, DIMENSION(SIZE(PTHM,1)*SIZE(PTHM,2),SIZE(PTHM,3)) ::  ZRHODJ      ! dry density * Grid size
+REAL, DIMENSION(SIZE(PTHM,1)*SIZE(PTHM,2),SIZE(PTHM,3)) ::  ZRHODREF    ! dry density of the
+                                                     ! reference state
+REAL, DIMENSION(SIZE(PTHM,1)*SIZE(PTHM,2),SIZE(PTHM,3)) ::  ZPABSM      ! Pressure at time t-1
+REAL, DIMENSION(SIZE(PTHM,1)*SIZE(PTHM,2),SIZE(PTHM,3)) ::  ZEXN        ! Exner function at t-dt
+
+REAL, DIMENSION(SIZE(PTHM,1)*SIZE(PTHM,2),SIZE(PTHM,3)) ::  ZTHM        ! Theta at t-dt
+REAL, DIMENSION(SIZE(PTHM,1)*SIZE(PTHM,2),SIZE(PTHM,3),SIZE(PRM,4)) ::  ZRM         ! water var. at t-dt
+REAL, DIMENSION(SIZE(PTHM,1)*SIZE(PTHM,2),SIZE(PTHM,3)) ::  ZUM,ZVM,ZWM ! wind components at t-dt
+REAL, DIMENSION(SIZE(PTHM,1)*SIZE(PTHM,2),SIZE(PTHM,3)) ::  ZTKEM       ! tke at t-dt
+
+REAL, DIMENSION(SIZE(PTHM,1)*SIZE(PTHM,2),SIZE(PTHM,3),SIZE(PSVM,4)) ::  ZSVM        ! scalar variable a t-dt
+
+REAL, DIMENSION(SIZE(PTHM,1)*SIZE(PTHM,2),SIZE(PTHM,3)) ::  ZDUDT_TURB   ! tendency of U   by turbulence only
+REAL, DIMENSION(SIZE(PTHM,1)*SIZE(PTHM,2),SIZE(PTHM,3)) ::  ZDVDT_TURB   ! tendency of V   by turbulence only
+REAL, DIMENSION(SIZE(PTHM,1)*SIZE(PTHM,2),SIZE(PTHM,3)) ::  ZDTHLDT_TURB ! tendency of thl by turbulence only
+REAL, DIMENSION(SIZE(PTHM,1)*SIZE(PTHM,2),SIZE(PTHM,3)) ::  ZDRTDT_TURB  ! tendency of rt  by turbulence only
+REAL, DIMENSION(SIZE(PTHM,1)*SIZE(PTHM,2),SIZE(PTHM,3),SIZE(PSVM,4)) ::  ZDSVDT_TURB  ! tendency of Sv  by turbulence only
+REAL, DIMENSION(SIZE(PTHM,1)*SIZE(PTHM,2),SIZE(PTHM,3)) ::  ZDUDT_MF   ! tendency of U   by massflux scheme
+REAL, DIMENSION(SIZE(PTHM,1)*SIZE(PTHM,2),SIZE(PTHM,3)) ::  ZDVDT_MF   ! tendency of V   by massflux scheme
+REAL, DIMENSION(SIZE(PTHM,1)*SIZE(PTHM,2),SIZE(PTHM,3)) ::  ZDTHLDT_MF ! tendency of thl by massflux scheme
+REAL, DIMENSION(SIZE(PTHM,1)*SIZE(PTHM,2),SIZE(PTHM,3)) ::  ZDRTDT_MF  ! tendency of Rt by massflux scheme
+REAL, DIMENSION(SIZE(PTHM,1)*SIZE(PTHM,2),SIZE(PTHM,3),SIZE(PSVM,4)) ::  ZDSVDT_MF  ! tendency of Sv by massflux scheme
+REAL, DIMENSION(SIZE(PTHM,1)*SIZE(PTHM,2),SIZE(PTHM,3)) ::  ZSIGMF,ZRC_MF,ZRI_MF,ZCF_MF ! cloud info for the cloud scheme
+REAL, DIMENSION(SIZE(PTHM,1)*SIZE(PTHM,2),SIZE(PTHM,3)) ::  ZFLXZTHVMF           ! Thermal production for TKE scheme
+REAL, DIMENSION(SIZE(PTHM,1)*SIZE(PTHM,2),SIZE(PTHM,3)) ::  ZFLXZTHMF
+REAL, DIMENSION(SIZE(PTHM,1)*SIZE(PTHM,2),SIZE(PTHM,3)) ::  ZFLXZRMF
+REAL, DIMENSION(SIZE(PTHM,1)*SIZE(PTHM,2),SIZE(PTHM,3)) ::  ZFLXZUMF
+REAL, DIMENSION(SIZE(PTHM,1)*SIZE(PTHM,2),SIZE(PTHM,3)) ::  ZFLXZVMF
+REAL, DIMENSION(SIZE(PTHM,1)*SIZE(PTHM,2),SIZE(PTHM,3)) ::  ZTHL_UP   ! updraft characteristics
+REAL, DIMENSION(SIZE(PTHM,1)*SIZE(PTHM,2),SIZE(PTHM,3)) ::  ZRT_UP    ! updraft characteristics
+REAL, DIMENSION(SIZE(PTHM,1)*SIZE(PTHM,2),SIZE(PTHM,3)) ::  ZRV_UP    ! updraft characteristics
+REAL, DIMENSION(SIZE(PTHM,1)*SIZE(PTHM,2),SIZE(PTHM,3)) ::  ZU_UP     ! updraft characteristics
+REAL, DIMENSION(SIZE(PTHM,1)*SIZE(PTHM,2),SIZE(PTHM,3)) ::  ZV_UP     ! updraft characteristics
+REAL, DIMENSION(SIZE(PTHM,1)*SIZE(PTHM,2),SIZE(PTHM,3)) ::  ZRC_UP    ! updraft characteristics
+REAL, DIMENSION(SIZE(PTHM,1)*SIZE(PTHM,2),SIZE(PTHM,3)) ::  ZRI_UP    ! updraft characteristics
+REAL, DIMENSION(SIZE(PTHM,1)*SIZE(PTHM,2),SIZE(PTHM,3)) ::  ZTHV_UP   ! updraft characteristics
+
+REAL, DIMENSION(SIZE(PTHM,1)*SIZE(PTHM,2),SIZE(PTHM,3)) ::  ZTHL_DO   ! downdraft characteristics
+REAL, DIMENSION(SIZE(PTHM,1)*SIZE(PTHM,2),SIZE(PTHM,3)) ::  ZTHV_DO   ! downdraft characteristics
+REAL, DIMENSION(SIZE(PTHM,1)*SIZE(PTHM,2),SIZE(PTHM,3)) ::  ZRT_DO    ! downdraft characteristics
+REAL, DIMENSION(SIZE(PTHM,1)*SIZE(PTHM,2),SIZE(PTHM,3)) ::  ZU_DO     ! downdraft characteristics
+REAL, DIMENSION(SIZE(PTHM,1)*SIZE(PTHM,2),SIZE(PTHM,3)) ::  ZV_DO     ! downdraft characteristics
+
+REAL, DIMENSION(SIZE(PTHM,1)*SIZE(PTHM,2),SIZE(PTHM,3)) ::  ZW_UP     ! updraft characteristics
+REAL, DIMENSION(SIZE(PTHM,1)*SIZE(PTHM,2),SIZE(PTHM,3)) ::  ZFRAC_UP  ! updraft characteristics
+REAL, DIMENSION(SIZE(PTHM,1)*SIZE(PTHM,2),SIZE(PTHM,3)) ::  ZEMF      ! updraft characteristics
+REAL, DIMENSION(SIZE(PTHM,1)*SIZE(PTHM,2),SIZE(PTHM,3)) ::  ZDETR     ! updraft characteristics
+REAL, DIMENSION(SIZE(PTHM,1)*SIZE(PTHM,2),SIZE(PTHM,3)) ::  ZENTR     ! updraft characteristics
+INTEGER,DIMENSION(SIZE(PTHM,1)*SIZE(PTHM,2))     :: IKLCL,IKETL,IKCTL ! level of LCL,ETL and CTL
+REAL, DIMENSION(SIZE(PTHM,1)*SIZE(PTHM,2)) ::  ZSFTH    ! Surface sensible heat flux
+REAL, DIMENSION(SIZE(PTHM,1)*SIZE(PTHM,2)) ::  ZSFRV    ! Surface latent   heat flux
+!
+!
+!* 3D arrays
+REAL, DIMENSION(SIZE(PTHM,1),SIZE(PTHM,2),SIZE(PTHM,3)) ::  ZWORK    ! work array
+REAL, DIMENSION(SIZE(PTHM,1),SIZE(PTHM,2),SIZE(PTHM,3)) ::  ZUMM     ! wind on mass point
+REAL, DIMENSION(SIZE(PTHM,1),SIZE(PTHM,2),SIZE(PTHM,3)) ::  ZVMM     ! wind on mass point
+REAL, DIMENSION(SIZE(PTHM,1),SIZE(PTHM,2),SIZE(PTHM,3)) ::  ZWMM     ! wind on mass point
+REAL, DIMENSION(SIZE(PTHM,1),SIZE(PTHM,2),SIZE(PTHM,3)) ::  ZDUDT    ! tendency of U   by massflux scheme
+REAL, DIMENSION(SIZE(PTHM,1),SIZE(PTHM,2),SIZE(PTHM,3)) ::  ZDVDT    ! tendency of V   by massflux scheme
+REAL, DIMENSION(SIZE(PTHM,1),SIZE(PTHM,2),SIZE(PTHM,3)) ::  ZDTHLDT  ! tendency of thl by massflux scheme
+REAL, DIMENSION(SIZE(PTHM,1),SIZE(PTHM,2),SIZE(PTHM,3)) ::  ZDRTDT   ! tendency of Rt by massflux scheme
+REAL, DIMENSION(SIZE(PTHM,1),SIZE(PTHM,2),SIZE(PTHM,3),SIZE(PSVM,4)) ::  ZDSVDT  ! tendency of Sv by massflux scheme
+
+INTEGER :: IIU, IJU, IKU, IKB, IKE, IRR, ISV  
+INTEGER :: JK,JRR,JSV                          ! Loop counters
+
+TYPE(TFIELDDATA) :: TZFIELD
+!------------------------------------------------------------------------
+
+!!! 1. Initialisation
+
+! Internal Domain
+IIU=SIZE(PTHM,1)
+IJU=SIZE(PTHM,2)
+IKU=SIZE(PTHM,3)
+IKB=1+JPVEXT
+IKE=IKU-JPVEXT
+
+! number of moist  var
+IRR=SIZE(PRM,4)
+! number of scalar var
+ISV=SIZE(PSVM,4)
+
+if ( lbudget_u  ) call Budget_store_init( tbudgets(NBUDGET_U ), 'MAFL', prus (:, :, :)    )
+if ( lbudget_v  ) call Budget_store_init( tbudgets(NBUDGET_V ), 'MAFL', prvs (:, :, :)    )
+if ( lbudget_th ) call Budget_store_init( tbudgets(NBUDGET_TH), 'MAFL', prths(:, :, :)    )
+if ( lbudget_rv ) call Budget_store_init( tbudgets(NBUDGET_RV), 'MAFL', prrs (:, :, :, 1) )
+if ( lbudget_sv ) then
+  do jsv = 1, isv
+    call Budget_store_init( tbudgets(NBUDGET_SV1 - 1 + jsv), 'MAFL', prsvs(:, :, :, jsv) )
+  end do
+end if
+
+ZSVM(:,:,:) = 0.
+!
+!
+! wind on mass points
+ZUMM=MXF(PUM)
+ZVMM=MYF(PVM)
+ZWMM=MZF(PWM)
+!
+!!! 2. Pack input variables
+!
+DO JK=1,IKU
+  ZZZ    (:,JK) = RESHAPE(PZZ    (:,:,JK),(/ IIU*IJU /) )
+  ZDZZ   (:,JK) = RESHAPE(PDZZ    (:,:,JK),(/ IIU*IJU /) )  
+  ZRHODJ (:,JK) = RESHAPE(PRHODJ  (:,:,JK),(/ IIU*IJU /) )  
+  ZTHM   (:,JK) = RESHAPE(PTHM   (:,:,JK),(/ IIU*IJU /) )
+  ZTKEM  (:,JK) = RESHAPE(PTKEM  (:,:,JK),(/ IIU*IJU /) )
+  ZPABSM (:,JK) = RESHAPE(PPABSM (:,:,JK),(/ IIU*IJU /) )
+  ZEXN   (:,JK) = RESHAPE(PEXN   (:,:,JK),(/ IIU*IJU /) )
+  ZRHODJ (:,JK) = RESHAPE(PRHODJ (:,:,JK),(/ IIU*IJU /) )  
+  ZRHODREF(:,JK) = RESHAPE(PRHODREF(:,:,JK),(/ IIU*IJU /) )  
+  ZUM    (:,JK) = RESHAPE(ZUMM   (:,:,JK),(/ IIU*IJU /) )
+  ZVM    (:,JK) = RESHAPE(ZVMM   (:,:,JK),(/ IIU*IJU /) )
+  ZWM    (:,JK) = RESHAPE(ZWMM   (:,:,JK),(/ IIU*IJU /) )
+  DO JRR=1,IRR
+    ZRM   (:,JK,JRR) = RESHAPE(PRM    (:,:,JK,JRR),(/ IIU*IJU /) ) 
+  END DO
+  DO JSV=1,ISV 
+    IF (LNOMIXLG .AND. JSV >= NSV_LGBEG .AND. JSV<= NSV_LGEND) CYCLE
+    ZSVM(:,JK,JSV)   = RESHAPE(PSVM  (:,:,JK,JSV),(/ IIU*IJU /) ) 
+  END DO  
+END DO
+
+ZSFTH(:)=RESHAPE(PSFTH(:,:),(/ IIU*IJU /) )
+ZSFRV(:)=RESHAPE(PSFRV(:,:),(/ IIU*IJU /) )
+
+!!! 3. Call of the physical parameterization of massflux vertical transport
+
+CALL SHALLOW_MF(1,IKU,1,KRR,KRRL,KRRI,                              &
+                HMF_UPDRAFT, HMF_CLOUD, CFRAC_ICE_SHALLOW_MF, OMIXUV,                  &
+                LNOMIXLG,NSV_LGBEG,NSV_LGEND,                         &
+                PIMPL_MF, PTSTEP,                                     &
+                ZDZZ, ZZZ,                                            &
+                ZRHODJ,ZRHODREF,                                      &
+                ZPABSM, ZEXN,                                         &
+                ZSFTH,ZSFRV,                                          &
+                ZTHM,ZRM,ZUM,ZVM,ZWM,ZTKEM,ZSVM,                      &
+                ZDUDT_MF,ZDVDT_MF,                                    &
+                ZDTHLDT_MF,ZDRTDT_MF,ZDSVDT_MF,                       &
+                ZSIGMF,ZRC_MF,ZRI_MF,ZCF_MF,ZFLXZTHVMF,               &
+                ZFLXZTHMF,ZFLXZRMF,ZFLXZUMF,ZFLXZVMF,                 &
+                ZTHL_UP,ZRT_UP,ZRV_UP,ZRC_UP,ZRI_UP,                  &
+                ZU_UP, ZV_UP, ZTHV_UP, ZW_UP,                         &
+                ZTHL_DO,ZTHV_DO,ZRT_DO,ZU_DO, ZV_DO,                  &
+                ZFRAC_UP,ZEMF,ZDETR,ZENTR,                            &
+                IKLCL,IKETL,IKCTL                                     )
+
+!!! 4. Unpack output variables
+
+ZDTHLDT(:,:,:)=RESHAPE(ZDTHLDT_MF(:,:),(/ IIU,IJU,IKU /) )
+ZDRTDT(:,:,:)=RESHAPE(ZDRTDT_MF(:,:),(/ IIU,IJU,IKU /) )
+ZDUDT(:,:,:)=RESHAPE(ZDUDT_MF(:,:),(/ IIU,IJU,IKU /) )
+ZDVDT(:,:,:)=RESHAPE(ZDVDT_MF(:,:),(/ IIU,IJU,IKU /) )
+PSIGMF(:,:,:)=RESHAPE(ZSIGMF(:,:),(/ IIU,IJU,IKU /) )
+PRC_MF(:,:,:)=RESHAPE(ZRC_MF(:,:),(/ IIU,IJU,IKU /) )
+PRI_MF(:,:,:)=RESHAPE(ZRI_MF(:,:),(/ IIU,IJU,IKU /) )
+PCF_MF(:,:,:)=RESHAPE(ZCF_MF(:,:),(/ IIU,IJU,IKU /) )
+PFLXZTHVMF(:,:,:)=RESHAPE(ZFLXZTHVMF(:,:),(/ IIU,IJU,IKU /) )
+DO JSV=1,ISV 
+  IF (LNOMIXLG .AND. JSV >= NSV_LGBEG .AND. JSV<= NSV_LGEND) CYCLE
+    ZDSVDT(:,:,:,JSV)   = RESHAPE(ZDSVDT_MF(:,:,JSV),(/ IIU,IJU,IKU /) ) 
+END DO  
+!
+!!! 5. Compute source terms for Meso-NH pronostic variables
+!!!    ----------------------------------------------------
+
+
+! As the pronostic variable of Meso-Nh are not (yet) the conservative variables
+! the thl tendency is put in th and the rt tendency in rv
+! the adjustment will do later the repartition between vapor and cloud
+PRTHS(:,:,:)  = PRTHS(:,:,:)  +   &
+                  PRHODJ(:,:,:)*ZDTHLDT(:,:,:)
+PRRS(:,:,:,1) = PRRS(:,:,:,1) +   &
+                  PRHODJ(:,:,:)*ZDRTDT(:,:,:)
+PRUS(:,:,:)   = PRUS(:,:,:)  +MXM(  &
+                  PRHODJ(:,:,:)*ZDUDT(:,:,:))
+PRVS(:,:,:)   = PRVS(:,:,:)  +MYM(  &
+                  PRHODJ(:,:,:)*ZDVDT(:,:,:))
+
+DO JSV=1,ISV 
+  IF (LNOMIXLG .AND. JSV >= NSV_LGBEG .AND. JSV<= NSV_LGEND) CYCLE
+  PRSVS(:,:,:,JSV)   = MAX((PRSVS(:,:,:,JSV)  +    &
+                  PRHODJ(:,:,:)*ZDSVDT(:,:,:,JSV)),XSVMIN(JSV))
+END DO     
+
+!!! 7. call to MesoNH budgets
+if ( lbudget_u  ) call Budget_store_end( tbudgets(NBUDGET_U ), 'MAFL', prus (:, :, :)    )
+if ( lbudget_v  ) call Budget_store_end( tbudgets(NBUDGET_V ), 'MAFL', prvs (:, :, :)    )
+if ( lbudget_th ) call Budget_store_end( tbudgets(NBUDGET_TH), 'MAFL', prths(:, :, :)    )
+if ( lbudget_rv ) call Budget_store_end( tbudgets(NBUDGET_RV), 'MAFL', prrs (:, :, :, 1) )
+if ( lbudget_sv ) then
+  do jsv = 1, isv
+    call Budget_store_end( tbudgets(NBUDGET_SV1 - 1 + jsv), 'MAFL', prsvs(:, :, :, jsv) )
+  end do
+end if
+
+!!! 8. Prints the fluxes in output file
+!
+IF ( OMF_FLX .AND. tpfile%lopened ) THEN
+  ! stores the conservative potential temperature vertical flux
+  ZWORK(:,:,:)=RESHAPE(ZFLXZTHMF (:,:),(/ IIU,IJU,IKU /) )
+  TZFIELD%CMNHNAME   = 'MF_THW_FLX'
+  TZFIELD%CSTDNAME   = ''
+  TZFIELD%CLONGNAME  = 'MF_THW_FLX'
+  TZFIELD%CUNITS     = 'K m s-1'
+  TZFIELD%CDIR       = 'XY'
+  TZFIELD%CCOMMENT   = 'X_Y_Z_MF_THW_FLX'
+  TZFIELD%NGRID      = 4
+  TZFIELD%NTYPE      = TYPEREAL
+  TZFIELD%NDIMS      = 3
+  TZFIELD%LTIMEDEP   = .TRUE.
+  CALL IO_Field_write(TPFILE,TZFIELD,ZWORK)
+  !
+  ! stores the conservative mixing ratio vertical flux
+  ZWORK(:,:,:)=RESHAPE(ZFLXZRMF(:,:),(/ IIU,IJU,IKU /) )
+  TZFIELD%CMNHNAME   = 'MF_RCONSW_FLX'
+  TZFIELD%CSTDNAME   = ''
+  TZFIELD%CLONGNAME  = 'MF_RCONSW_FLX'
+  TZFIELD%CUNITS     = 'K m s-1'
+  TZFIELD%CDIR       = 'XY'
+  TZFIELD%CCOMMENT   = 'X_Y_Z_MF_RCONSW_FLX'
+  TZFIELD%NGRID      = 4
+  TZFIELD%NTYPE      = TYPEREAL
+  TZFIELD%NDIMS      = 3
+  TZFIELD%LTIMEDEP   = .TRUE.
+  CALL IO_Field_write(TPFILE,TZFIELD,ZWORK)
+  !
+  ! stores the theta_v vertical flux
+  TZFIELD%CMNHNAME   = 'MF_THVW_FLX'
+  TZFIELD%CSTDNAME   = ''
+  TZFIELD%CLONGNAME  = 'MF_THVW_FLX'
+  TZFIELD%CUNITS     = 'K m s-1'
+  TZFIELD%CDIR       = 'XY'
+  TZFIELD%CCOMMENT   = 'X_Y_Z_MF_THVW_FLX'
+  TZFIELD%NGRID      = 4
+  TZFIELD%NTYPE      = TYPEREAL
+  TZFIELD%NDIMS      = 3
+  TZFIELD%LTIMEDEP   = .TRUE.
+  CALL IO_Field_write(TPFILE,TZFIELD,PFLXZTHVMF)
+  !
+ IF (OMIXUV) THEN
+  ! stores the U momentum vertical flux
+  ZWORK(:,:,:)=RESHAPE(ZFLXZUMF(:,:),(/ IIU,IJU,IKU /) )
+  TZFIELD%CMNHNAME   = 'MF_UW_FLX'
+  TZFIELD%CSTDNAME   = ''
+  TZFIELD%CLONGNAME  = 'MF_UW_FLX'
+  TZFIELD%CUNITS     = 'm2 s-2'
+  TZFIELD%CDIR       = 'XY'
+  TZFIELD%CCOMMENT   = 'X_Y_Z_MF_UW_FLX'
+  TZFIELD%NGRID      = 4
+  TZFIELD%NTYPE      = TYPEREAL
+  TZFIELD%NDIMS      = 3
+  TZFIELD%LTIMEDEP   = .TRUE.
+  CALL IO_Field_write(TPFILE,TZFIELD,ZWORK)
+  !
+  ! stores the V momentum vertical flux
+  ZWORK(:,:,:)=RESHAPE(ZFLXZVMF(:,:),(/ IIU,IJU,IKU /) )
+  TZFIELD%CMNHNAME   = 'MF_VW_FLX'
+  TZFIELD%CSTDNAME   = ''
+  TZFIELD%CLONGNAME  = 'MF_VW_FLX'
+  TZFIELD%CUNITS     = 'm2 s-2'
+  TZFIELD%CDIR       = 'XY'
+  TZFIELD%CCOMMENT   = 'X_Y_Z_MF_VW_FLX'
+  TZFIELD%NGRID      = 4
+  TZFIELD%NTYPE      = TYPEREAL
+  TZFIELD%NDIMS      = 3
+  TZFIELD%LTIMEDEP   = .TRUE.
+  CALL IO_Field_write(TPFILE,TZFIELD,ZWORK)
+  !
+ END IF
+END IF
+
+!!! 9. Externalised LES Diagnostic for Mass Flux Scheme
+!!!    ------------------------------------------------
+
+      CALL DIAGNOS_LES_MF(IIU,IJU,IKU,PTIME_LES,               &
+                          ZTHL_UP,ZRT_UP,ZRV_UP,ZRC_UP,ZRI_UP, &
+                          ZU_UP,ZV_UP,ZTHV_UP,ZW_UP,           &
+                          ZFRAC_UP,ZEMF,ZDETR,ZENTR,           &
+                          ZFLXZTHMF,ZFLXZTHVMF,ZFLXZRMF,       &
+                          ZFLXZUMF,ZFLXZVMF,                   &
+                          IKLCL,IKETL,IKCTL )
+               
+
+END SUBROUTINE SHALLOW_MF_PACK
-- 
GitLab