Skip to content
Snippets Groups Projects
lesn.f90 136 KiB
Newer Older
!MNH_LIC Copyright 2000-2020 CNRS, Meteo-France and Universite Paul Sabatier
!MNH_LIC This is part of the Meso-NH software governed by the CeCILL-C licence
!MNH_LIC version 1. See LICENSE, CeCILL-C_V1-en.txt and CeCILL-C_V1-fr.txt
!MNH_LIC for details. version 1.
!-----------------------------------------------------------------
!     #################
      SUBROUTINE  LES_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 :: 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
IKB=1+JPVEXT
CALL GET_DIM_EXT_ll('B',IIU,IJU)
!
!
!-------------------------------------------------------------------------------
!
!* 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
!
!-------------------------------------------------------------------------------
!
!*      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)        )
!
  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.
!
  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_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,     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),   &