From c468d698d8522e337f2b6a0522ec0d4261ad2636 Mon Sep 17 00:00:00 2001
From: Quentin Rodier <quentin.rodier@meteo.fr>
Date: Tue, 22 Feb 2022 10:48:04 +0100
Subject: [PATCH] Quentin 22/02/022: add ext/phys_param

---
 src/mesonh/ext/phys_paramn.f90 | 1601 ++++++++++++++++++++++++++++++++
 1 file changed, 1601 insertions(+)
 create mode 100644 src/mesonh/ext/phys_paramn.f90

diff --git a/src/mesonh/ext/phys_paramn.f90 b/src/mesonh/ext/phys_paramn.f90
new file mode 100644
index 000000000..327f252f0
--- /dev/null
+++ b/src/mesonh/ext/phys_paramn.f90
@@ -0,0 +1,1601 @@
+!MNH_LIC Copyright 1995-2021 CNRS, Meteo-France and Universite Paul Sabatier
+!MNH_LIC This is part of the Meso-NH software governed by the CeCILL-C licence
+!MNH_LIC version 1. See LICENSE, CeCILL-C_V1-en.txt and CeCILL-C_V1-fr.txt
+!MNH_LIC for details. version 1.
+!-----------------------------------------------------------------
+!    ########################
+     MODULE MODI_PHYS_PARAM_n
+!    ########################
+!
+!
+INTERFACE
+!
+      SUBROUTINE PHYS_PARAM_n( KTCOUNT, TPFILE,                                              &
+                               PRAD, PSHADOWS, PKAFR, PGROUND, PMAFL, PDRAG,PEOL, PTURB,     &
+                               PTRACER, PTIME_BU, PWETDEPAER, OMASKkids, OCLOUD_ONLY         )
+!
+USE MODD_IO,        ONLY: TFILEDATA
+use modd_precision, only: MNHTIME
+!
+INTEGER,           INTENT(IN)     :: KTCOUNT   ! temporal iteration count
+TYPE(TFILEDATA),   INTENT(IN)     :: TPFILE    ! Synchronous output file
+! advection schemes
+REAL(kind=MNHTIME), DIMENSION(2), INTENT(INOUT) :: PRAD,PSHADOWS,PKAFR,PGROUND,PTURB,PMAFL,PDRAG,PTRACER,PEOL ! to store CPU
+                                                                                                         ! time for computing time
+REAL(kind=MNHTIME), DIMENSION(2), INTENT(INOUT) :: PTIME_BU  ! time used in budget&LES budgets statistics
+REAL, DIMENSION(:,:,:,:), INTENT(INOUT)  :: PWETDEPAER
+LOGICAL, DIMENSION(:,:), INTENT(IN) :: OMASKkids ! kids domains mask
+LOGICAL, INTENT(OUT) :: OCLOUD_ONLY ! conditionnal radiation computations for
+                                !      the only cloudy columns
+                                !
+END SUBROUTINE PHYS_PARAM_n
+!
+END INTERFACE
+!
+END MODULE MODI_PHYS_PARAM_n
+!
+!     ########################################################################################
+      SUBROUTINE PHYS_PARAM_n( KTCOUNT, TPFILE,                                              &
+                               PRAD, PSHADOWS, PKAFR, PGROUND, PMAFL, PEOL, PDRAG, PTURB,    &
+                               PTRACER, PTIME_BU, PWETDEPAER, OMASKkids, OCLOUD_ONLY         )
+!     ########################################################################################
+!
+!!****  *PHYS_PARAM_n * -monitor of the parameterizations used by model _n
+!!
+!!    PURPOSE
+!!    -------
+!       The purpose of this routine is to update the sources by adding the
+!     parameterized terms. This is realized by sequentially calling the
+!     specialized routines.
+!    
+!!**  METHOD
+!!    ------
+!!      The first parametrization is the radiation scheme:
+!!                                       ----------------
+!!     *  CRAD = 'FIXE'
+!!     In this case, a temporal interpolation  is performed for the downward
+!!     surface fluxes XFLALWD and XFLASWD.
+!!     *  CRAD = 'ECMWF'
+!!     Several tests are performed before calling the radiation computations
+!!     interface with the ECMWF radiation scheme code. A control is made to
+!!     ensure that:
+!!         - the full radiation code is called at the first model timestep
+!!         - there is a priority for calling the full radiation instead of the
+!!           cloud-only approximation if both must be called at the current
+!!           timestep
+!!         - the cloud-only option (approximation) is coherent with the
+!!           occurence of one cloudy vertical column at least
+!!      If all the above conditions are fulfilled (GRAD is .TRUE.) then the
+!!     position of the sun is computed in routine SUNPOS_n and the interfacing
+!!     routine RADIATIONS is called to update the radiative tendency XDTHRAD
+!!     and the downward surface fluxes XFLALWD and XFLASWD. Finally, the
+!!     radiative tendency is integrated as a source term in the THETA prognostic
+!!     equation.
+!!
+!!      The second parameterization is the soil scheme:
+!!                                         -----------
+!!
+!!     externalized surface
+!!
+!!       The third parameterization is the turbulence scheme:
+!!                                         -----------------
+!!     * CTURB='NONE'
+!!     no turbulent mixing is taken into account
+!!     * CTURB='TKEL'
+!!     The turbulent fluxes are computed according to a one and half order
+!!     closure of the hydrodynamical equations. This scheme is based on a
+!!     prognostic for the turbulent kinetic energy and a mixing length
+!!     computation ( the mesh size or a physically based length). Other
+!!     turbulent moments are diagnosed according to a stationarization of the
+!!     second order turbulent moments. This turbulent scheme forecasts
+!!     either a purely vertical turbulent mixing or 3-dimensional mixing
+!!     according to its internal degrees of freedom.
+!!
+!!
+!!       The LAST parameterization is the chemistry scheme:
+!!                                        -----------------
+!!     The chemistry part of MesoNH has two namelists, NAM_SOLVER for the
+!!     parameters concerning the stiff solver, and NAM_MNHCn concerning the
+!!     configuration and options of the chemistry module itself.
+!!     The switch LUSECHEM in NAM_CONF acitvates or deactivates the chemistry.
+!!     The only variables of MesoNH that are modified by chemistry are the
+!!     scalar variables. If calculation of chemical surface fluxes is
+!!     requested, those fluxes are calculated before
+!!     entering the turbulence scheme, since those fluxes are taken into
+!!     account by TURB as surface boundary conditions.
+!!     CAUTION: chemistry has allways to be called AFTER ALL OTHER TERMS
+!!     that affect the scalar variables (dynamical terms, forcing,
+!!     parameterizations (like TURB, CONVECTION), since it uses the variables
+!!     XRSVS as input in case of the time-split option.
+!!
+!!    EXTERNAL
+!!    --------
+!!      Subroutine SUNPOS_n     : computes the position of the sun
+!!      Subroutine RADIATIONS   : computes the radiative tendency and fluxes
+!!      Subroutine TSZ0         : computes the surface from temporally
+!!                                interpolated Ts and given z0
+!!      Subroutine ISBA         : computes the surface fluxes from a soil scheme
+!!      Subroutine TURB         : computes the turbulence source terms
+!!      Subroutine CONVECTION   : computes the convection source term
+!!      Subroutine CH_SURFACE_FLUX_n: computes the surface flux for chemical
+!!                                species
+!!      Subroutine CH_MONITOR_n : computes the chemistry source terms
+!!                                that are applied to the scalar variables
+!!
+!!    IMPLICIT ARGUMENTS
+!!    ------------------
+!!      USE MODD_DYN
+!!      USE MODD_CONF
+!!      USE MODD_CONF_n
+!!      USE MODD_CURVCOR_n
+!!      USE MODD_DYN_n
+!!      USE MODD_FIELD_n
+!!      USE MODD_GR_FIELD_n
+!!      USE MODD_LSFIELD_n
+!!      USE MODD_GRID_n
+!!      USE MODD_LBC_n
+!!      USE MODD_PARAM_RAD_n
+!!      USE MODD_RADIATIONS_n
+!!      USE MODD_REF_n
+!!      USE MODD_LUNIT_n
+!!      USE MODD_TIME_n
+!!      USE MODD_CH_MNHC_n
+!!
+!!    REFERENCE
+!!    ---------
+!!      None
+!!
+!!    AUTHOR
+!!    ------
+!!      J. Stein           * Meteo-France *
+!!
+!!    MODIFICATIONS
+!!    -------------
+!!      Original    05/01/95
+!!      Modifications  Feb 14, 1995 (J.Cuxart)  add the I/O arguments,
+!!             the director cosinus and change the names of the surface fluxes
+!!      Modifications March 21, 1995 (J.M.Carriere) take into account liquid
+!!                                             water
+!!                    June 30,1995  (J.Stein)  initialize at 0 the surf. fluxes
+!!      Modifications Sept. 1, 1995 (S.Belair) ISBA scheme
+!!      Modifications Sept.25, 1995 (J.Stein)  switch on the radiation scheme
+!!      Modifications Sept. 11, 1995 (J.-P. Pinty) radiation scheme
+!!                    Nov.  15, 1995 (J.Stein) cleaning + change the temporal
+!!                                   algorithm for the soil scheme-turbulence
+!!                    Jan.  23, 1996 (J.Stein) add a new option for the surface
+!!                                   fluxes where Ts and z0 are given
+!!                    March 18, 1996 (J.Stein) add the cloud fraction
+!!                    March 28, 1996 (J.Stein) the soil scheme gives energy
+!!                                             fluxes + cleaning
+!!                    June  17, 1996 (Lafore)  statistics of computing time
+!!                    August 4, 1996 (K. Suhre) add chemistry
+!!                    Oct.  12, 1996 (J.Stein) use XSRCM in the turbulence
+!!                                             scheme
+!!                    Nov.  18, 1996 (J.-P. Pinty) add domain translation
+!!                                                 change arg. in radiations
+!!                    Fev.   4, 1997 (J.Viviand) change isba's calling for ice
+!!                    Jun.  22, 1997 (J.Stein) change the equation system and use
+!!                                             the absolute pressure
+!!                    Jul.  09, 1997 (V.Masson) add directional z0
+!!                    Jan.  24, 1998 (P.Bechtold) add convective transport for tracers
+!!                    Jan.  24, 1998 (J.-P. Pinty) split SW and LW part for radiation
+!!                    Mai.  10, 1999 (P.Bechtold) shallow convection
+!!                    Oct.  20, 1999 (P.Jabouille) domain translation for turbulence
+!!                    Jan.  04, 2000 (V.Masson) removes TSZ0 case
+!!                    Jan.  04, 2000 (V.Masson) modifies albedo computation
+!                     Jul   02, 2000 (F.Solmon/V.Masson) adaptation for patch approach
+!!                    Nov.  15, 2000 (V.Masson) LES routines
+!!                    Nov.  15, 2000 (V.Masson) effect of slopes on surface fluxes
+!!                    Feb.  02, 2001 (P.Tulet) add friction velocities and aerodynamical
+!!                                             resistance (patch approach)
+!!                    Jan.  04, 2000 (V.Masson) modify surf_rad_modif computation
+!!                    Mar.  04, 2002 (F.Solmon) new interface for radiation call
+!!                    Nov.  06, 2002 (V.Masson) LES budgets & budget time counters
+!!                    Jan. 2004      (V.Masson) surface externalization
+!!                    Jan.  13, 2004 (J.Escobar) bug correction : compute "GRAD" in parallel
+!!                    Jan.  20, 2005 (P. Tulet)  add dust sedimentation 
+!!                    Jan.  20, 2005 (P. Tulet)  climatologic SSA
+!!                    Jan.  20, 2005 (P. Tulet)  add aerosol / dust scavenging
+!!                    Jul. 2005       (N. Asencio) use the two-way result-fields
+!!                                  before ground_param call
+!!                    May 2006        Remove EPS
+!!                    Oct. 2007      (J.Pergaud) Add shallow_MF
+!!                    Oct. 2009     (C.Lac) Introduction of different PTSTEP according to the
+!!                              advection schemes
+!!                    Oct. 2009     (V. MAsson) optimization of Pergaud et al massflux scheme
+!!                    Aug. 2010     (V.Masson, C.Lac) Exchange of SBL_DEPTH for
+!!                                  reproducibility
+!!                    Oct. 2010   (J.Escobar) init  ZTIME_LES_MF ( pb detected with g95 )
+!!                    Feb. 2011 (V.Masson, C.Lac) SBL_DEPTH values on outer pts
+!!                               for RMC01
+!!                    Sept.2011 (J.Escobar) init YINST_SFU ='M'
+!!
+!!                        Specific for 2D modeling : 
+!! 
+!!                    06/2010    (P.Peyrille)  add Call to aerozon.f90 if LAERO_FT=T
+!!                                to update 
+!!                                aerosols and ozone climatology at each call to
+!!                                phys_param otherwise it is constant to monthly average
+!!                    03/2013  (C.Lac) FIT temporal scheme
+!!                    01/2014 (C.Lac) correction for the nesting of 2D surface
+!!                           fields if the number of the son model does not
+!!                           follow the number of the dad model
+!!      J.Escobar 21/03/2013: for HALOK comment all NHALO=1 test
+!!                       2014  (M.Faivre)
+!!  06/2016     (G.Delautier) phasage surfex 8
+!!  2016 B.VIE LIMA
+!!      M. Leriche 02/2017 Avoid negative fluxes if sv=0 outside the physics domain
+!!      C.Lac  10/2017 : ch_monitor and aer_monitor extracted from phys_param
+!!                       to be called directly by modeln as the last process 
+!!                   02/2018 Q.Libois ECRAD
+!  P. Wautelet 28/03/2018: replace TEMPORAL_DIST by DATETIME_DISTANCE
+!  P. Wautelet 05/2016-04/2018: new data structures and calls for I/O
+!  P. Wautelet 28/03/2019: use MNHTIME for time measurement variables
+!  P. Wautelet 26/04/2019: replace non-standard FLOAT function by REAL function
+!  P. Wautelet 20/05/2019: add name argument to ADDnFIELD_ll + new ADD4DFIELD_ll subroutine
+!  P. Wautelet 21/11/2019: ZRG_HOUR and ZRAT_HOUR are now parameter arrays
+!  C. Lac         11/2019: correction in the drag formula and application to building in addition to tree
+!  F. Auguste     02/2021: add IBM
+!  JL Redelsperger 03/2021: add the SW flux penetration for Ocean model case
+!!-------------------------------------------------------------------------------
+!
+!*       0.     DECLARATIONS
+!               ------------
+!
+USE MODD_ADV_n,            ONLY : XRTKEMS
+USE MODD_ARGSLIST_ll, ONLY : LIST_ll
+use modd_budget,            only: lbudget_th, lbudget_rv, lbudget_rc, lbudget_ri, lbudget_sv,  &
+                                  NBUDGET_TH, NBUDGET_RV, NBUDGET_RC, NBUDGET_RI, NBUDGET_SV1, &
+                                  tbudgets, xtime_bu_process
+USE MODD_CH_AEROSOL
+USE MODD_CH_MNHC_n, ONLY : LUSECHEM,         &! indicates if chemistry is used
+                           LCH_CONV_SCAV,    &
+                           LCH_CONV_LINOX
+USE MODD_CLOUD_MF_n
+USE MODD_CONDSAMP
+USE MODD_CONF
+USE MODD_CONF_n
+USE MODD_CST
+USE MODD_CURVCOR_n
+USE MODD_DEEP_CONVECTION_n
+USE MODD_DEF_EDDY_FLUX_n           ! Ajout PP
+USE MODD_DEF_EDDYUV_FLUX_n         ! Ajout PP
+USE MODD_DRAGBLDG_n
+USE MODD_DRAGTREE_n
+USE MODD_DUST
+USE MODD_DYN
+USE MODD_DYN_n
+USE MODD_EOL_MAIN, ONLY: LMAIN_EOL, CMETH_EOL, NMODEL_EOL
+USE MODD_FIELD_n
+USE MODD_FRC
+USE MODD_FRC_n
+USE MODD_GRID
+USE MODD_GRID_n
+USE MODD_IBM_PARAM_n,      ONLY: LIBM, XIBM_EPSI, XIBM_LS
+USE MODD_ICE_C1R3_DESCR,  ONLY : XRTMIN_C1R3=>XRTMIN
+USE MODD_IO, ONLY: TFILEDATA
+USE MODD_LATZ_EDFLX
+USE MODD_LBC_n
+USE MODD_LES
+USE MODD_LES_BUDGET
+USE MODD_LSFIELD_n
+USE MODD_LUNIT_n
+USE MODD_METRICS_n
+USE MODD_MNH_SURFEX_n
+USE MODD_NESTING, ONLY : XWAY,NDAD, NDXRATIO_ALL, NDYRATIO_ALL
+USE MODD_NSV
+USE MODD_OCEANH
+USE MODD_OUT_n
+USE MODD_PARAM_C2R2,       ONLY : LSEDC
+USE MODD_PARAMETERS
+USE MODD_PARAM_ICE,        ONLY : LSEDIC
+USE MODD_PARAM_KAFR_n
+USE MODD_PARAM_LIMA,       ONLY : MSEDC => LSEDC, XRTMIN_LIMA=>XRTMIN
+USE MODD_PARAM_MFSHALL_n
+USE MODD_PARAM_n
+USE MODD_PARAM_RAD_n
+USE MODD_PASPOL
+USE MODD_PASPOL_n
+USE MODD_PRECIP_n
+use modd_precision,        only: MNHTIME
+USE MODD_RADIATIONS_n
+USE MODD_RAIN_ICE_DESCR,   ONLY: XRTMIN
+USE MODD_REF,              ONLY: LCOUPLES
+USE MODD_REF_n
+USE MODD_SALT
+USE MODD_SHADOWS_n
+USE MODD_SUB_PHYS_PARAM_n
+USE MODD_TIME_n
+USE MODD_TIME_n
+USE MODD_TIME, ONLY : TDTEXP  ! Ajout PP
+USE MODD_TURB_CLOUD, ONLY : CTURBLEN_CLOUD,NMODEL_CLOUD, &
+                            XCEI,XCEI_MIN,XCEI_MAX,XCOEF_AMPL_SAT
+USE MODD_TURB_FLUX_AIRCRAFT_BALLOON, ONLY : XTHW_FLUX, XRCW_FLUX, XSVW_FLUX
+USE MODD_TURB_n
+
+USE MODE_AERO_PSD
+use mode_budget,            only: Budget_store_end, Budget_store_init
+USE MODE_DATETIME
+USE MODE_DUST_PSD
+USE MODE_ll
+USE MODE_MNH_TIMING
+USE MODE_MODELN_HANDLER
+USE MODE_MPPDB
+USE MODE_SALT_PSD
+
+USE MODI_AEROZON          ! Ajout PP
+USE MODI_CONDSAMP
+USE MODI_CONVECTION
+USE MODI_DRAG_BLD
+USE MODI_DRAG_VEG
+USE MODI_DUST_FILTER
+USE MODI_EDDY_FLUX_n               ! Ajout PP
+USE MODI_EDDY_FLUX_ONE_WAY_n       ! Ajout PP
+USE MODI_EDDYUV_FLUX_n             ! Ajout PP
+USE MODI_EDDYUV_FLUX_ONE_WAY_n     ! Ajout PP
+USE MODI_EOL_MAIN
+USE MODI_GROUND_PARAM_n
+USE MODI_PASPOL
+USE MODI_RADIATIONS
+USE MODI_SALT_FILTER
+USE MODI_SEDIM_DUST
+USE MODI_SEDIM_SALT
+USE MODI_SHALLOW_MF_PACK
+USE MODI_SUNPOS_n
+USE MODI_SURF_RAD_MODIF
+USE MODI_SWITCH_SBG_LES_N
+USE MODI_TURB
+
+IMPLICIT NONE
+!
+!*      0.1    declarations of arguments
+!
+INTEGER,           INTENT(IN)     :: KTCOUNT   ! temporal iteration count
+TYPE(TFILEDATA),   INTENT(IN)     :: TPFILE    ! Synchronous output file
+! advection schemes
+REAL(kind=MNHTIME), DIMENSION(2), INTENT(INOUT) :: PRAD,PSHADOWS,PKAFR,PGROUND,PTURB,PMAFL,PDRAG,PTRACER,PEOL ! to store CPU
+                                                                                                         ! time for computing time
+REAL(kind=MNHTIME), DIMENSION(2), INTENT(INOUT) :: PTIME_BU  ! time used in budget&LES budgets statistics
+REAL, DIMENSION(:,:,:,:), INTENT(INOUT)  :: PWETDEPAER
+LOGICAL, DIMENSION(:,:), INTENT(IN) :: OMASKkids ! kids domains mask
+LOGICAL, INTENT(OUT) :: OCLOUD_ONLY ! conditionnal radiation computations for
+                                !      the only cloudy columns
+                                !
+!
+!*      0.2    declarations of local variables
+!
+REAL, DIMENSION(:,:), ALLOCATABLE     :: ZSFU  ! surface flux of x and
+REAL, DIMENSION(:,:), ALLOCATABLE     :: ZSFV  ! y component of wind
+REAL, DIMENSION(:,:), ALLOCATABLE     :: ZSFTH ! surface flux of theta
+REAL, DIMENSION(:,:), ALLOCATABLE     :: ZSFRV ! surface flux of vapor
+REAL, DIMENSION(:,:,:), ALLOCATABLE   :: ZSFSV ! surface flux of scalars
+REAL, DIMENSION(:,:), ALLOCATABLE     :: ZSFCO2! surface flux of CO2
+!
+REAL, DIMENSION(:,:,:), ALLOCATABLE :: ZDIR_ALB ! direct albedo
+REAL, DIMENSION(:,:,:), ALLOCATABLE :: ZSCA_ALB ! diffuse albedo
+REAL, DIMENSION(:,:,:),   ALLOCATABLE :: ZEMIS    ! emissivity
+REAL, DIMENSION(:,:),   ALLOCATABLE :: ZTSRAD   ! surface temperature
+REAL, DIMENSION(:,:,:,:), ALLOCATABLE  :: ZRGDST,ZSIGDST,ZNDST,ZSVDST
+REAL, DIMENSION(:,:,:,:), ALLOCATABLE  :: ZRGSLT,ZSIGSLT,ZNSLT,ZSVSLT
+REAL, DIMENSION(:,:,:,:), ALLOCATABLE  :: ZRGAER,ZSIGAER,ZNAER,ZSVAER
+REAL, DIMENSION(:,:,:,:), ALLOCATABLE  :: ZSVT
+!
+REAL, DIMENSION(:,:,:), ALLOCATABLE :: ZEXN   ! Atmospheric density and Exner
+REAL, DIMENSION(:,:,:), ALLOCATABLE :: ZSIGMF   ! MF contribution to XSIGS
+!
+REAL, DIMENSION(0:24), parameter :: ZRG_HOUR =  (/ 0., 0., 0., 0., 0., 32.04, 114.19, &
+                                                   228.01, 351.25, 465.49, 557.24,    &
+                                                   616.82, 638.33, 619.43, 566.56,    &
+                                                   474.71, 359.20, 230.87, 115.72,    &
+                                                   32.48, 0., 0., 0., 0., 0. /)
+!
+REAL, DIMENSION(0:24), parameter :: ZRAT_HOUR = (/ 326.00, 325.93, 325.12, 324.41, &
+                                                   323.16, 321.95, 322.51, 325.16, &
+                                                   328.01, 331.46, 335.58, 340.00, &
+                                                   345.20, 350.32, 354.20, 356.58, &
+                                                   356.56, 355.33, 352.79, 351.34, &
+                                                   347.00, 342.00, 337.00, 332.00, &
+                                                   326.00     /)
+!
+!
+character(len=6) :: ynum
+INTEGER  :: IHOUR               ! parameters necessary for the temporal
+REAL     :: ZTIME, ZDT          ! interpolation
+REAL     :: ZTEMP_DIST          ! time between 2 instants (in seconds)
+!
+LOGICAL :: GRAD                 ! conditionnal call for the full radiation
+                                !         computations
+REAL    :: ZRAD_GLOB_ll         ! 'real' global parallel mask of 'GRAD'
+INTEGER :: INFO_ll              ! error report of parallel routines
+                                !      the only cloudy columns
+!
+REAL(kind=MNHTIME), DIMENSION(2) :: ZTIME1, ZTIME2, ZTIME3, ZTIME4 ! for computing time analysis
+REAL(kind=MNHTIME), DIMENSION(2) :: ZTIME_LES_MF                   ! time spent in LES computation in shallow conv.
+LOGICAL :: GDCONV               ! conditionnal call for the deep convection
+                                !         computations
+REAL, DIMENSION(:,:,:), ALLOCATABLE  :: ZRC, ZRI, ZWT ! additional dummies
+REAL, DIMENSION(:,:),   ALLOCATABLE  :: ZDXDY         ! grid area
+                    ! for rc, ri, w required if main variables not allocated
+!
+INTEGER :: IIU, IJU, IKU                              ! dimensional indexes
+!
+INTEGER     :: JSV              ! Loop index for Scalar Variables
+INTEGER     :: JSWB             ! loop on SW spectral bands
+INTEGER     :: IIB,IIE,IJB,IJE, IKB, IKE
+INTEGER     :: IMODEIDX
+              ! index values for the Beginning or the End of the physical
+              ! domain in x and y directions
+TYPE(LIST_ll), POINTER :: TZFIELDS_ll   ! list of fields to exchange
+INTEGER                :: IINFO_ll       ! return code of parallel routine
+!
+!* variables for writing in a fm file
+!
+INTEGER           :: IRESP          ! IRESP  : return-code if a problem appears
+                                    !in LFI subroutines at the open of the file
+INTEGER           :: ILUOUT         ! logical unit numbers of output-listing
+INTEGER           :: IMI            ! model index
+INTEGER           :: JKID           ! loop index to look for the KID models
+REAL              :: ZINIRADIUSI, ZINIRADIUSJ ! ORILAM initial radius
+REAL, DIMENSION(NMODE_DST)    :: ZINIRADIUS  ! DUST initial radius
+REAL, DIMENSION(NMODE_SLT)    :: ZINIRADIUS_SLT  ! Sea Salt initial radius
+REAL, DIMENSION(SIZE(XRSVS,1), SIZE(XRSVS,2), SIZE(XRSVS,3), SIZE(XRSVS,4))  :: ZRSVS
+LOGICAL :: GCLD                     ! conditionnal call for dust wet deposition
+! * arrays to store the surface fields before radiation and convection scheme
+!  calls
+INTEGER           :: IMODSON        ! Number of son models of IMI with XWAY=2
+INTEGER           :: IKIDM          ! index loop                                 
+REAL, DIMENSION(:,:,:),   ALLOCATABLE  :: ZSAVE_INPRR,ZSAVE_INPRS,ZSAVE_INPRG,ZSAVE_INPRH
+REAL, DIMENSION(:,:,:),   ALLOCATABLE  :: ZSAVE_INPRC,ZSAVE_PRCONV,ZSAVE_PRSCONV
+REAL, DIMENSION(:,:,:,:), ALLOCATABLE  :: ZSAVE_DIRFLASWD, ZSAVE_SCAFLASWD,ZSAVE_DIRSRFSWD
+! for ocean model
+INTEGER           :: JKM , JSW         ! vertical index loop                                 
+REAL :: ZSWA,TINTSW     ! index for SW interpolation and int time betwenn forcings (ocean model)
+REAL, DIMENSION(:), ALLOCATABLE :: ZIZOCE(:) ! Solar flux penetrating in ocean
+REAL, DIMENSION(:), ALLOCATABLE :: ZPROSOL1(:),ZPROSOL2(:) ! Funtions for penetrating solar flux
+!
+!-----------------------------------------------------------------------------
+
+NULLIFY(TZFIELDS_ll)
+IMI=GET_CURRENT_MODEL_INDEX()
+!
+ILUOUT = TLUOUT%NLU
+CALL GET_DIM_EXT_ll ('B',IIU,IJU)
+IKU=SIZE(XTHT,3)
+IKB = 1 + JPVEXT
+IKE = IKU - JPVEXT
+CALL GET_INDICE_ll (IIB,IJB,IIE,IJE)
+!
+ZTIME1 = 0.0_MNHTIME
+ZTIME2 = 0.0_MNHTIME
+ZTIME3 = 0.0_MNHTIME
+ZTIME4 = 0.0_MNHTIME
+PTIME_BU = 0._MNHTIME
+ZTIME_LES_MF = 0.0_MNHTIME
+PWETDEPAER(:,:,:,:) = 0.
+!
+!* allocation of variables used in more than one parameterization
+!
+ALLOCATE(ZSFU  (IIU,IJU))         ! surface schemes + turbulence
+ALLOCATE(ZSFV  (IIU,IJU))
+ALLOCATE(ZSFTH (IIU,IJU))
+ALLOCATE(ZSFRV (IIU,IJU))
+ALLOCATE(ZSFSV (IIU,IJU,NSV))
+ALLOCATE(ZSFCO2(IIU,IJU))
+!
+!* if XWAY(son)=2 save surface fields before radiation or convective scheme
+!  calls
+!
+IMODSON = 0
+DO JKID = IMI+1,NMODEL  ! min value of the possible kids
+ IF (IMI == NDAD(JKID) .AND. XWAY(JKID) == 2. .AND. CPROGRAM=='MESONH' &
+  .AND. (CCONF == 'RESTA' .OR. (CCONF == 'START' .AND. KTCOUNT /= 1))) THEN
+  IMODSON = IMODSON + 1
+ END IF
+END DO
+!
+ IF (IMODSON /= 0 ) THEN
+   IF (LUSERC .AND. (                                               &
+       (LSEDIC .AND. CCLOUD(1:3) == 'ICE')                     .OR. &
+       (LSEDC  .AND. (CCLOUD == 'C2R2' .OR. CCLOUD == 'KHKO')) .OR. &
+       (MSEDC  .AND. CCLOUD=='LIMA')                                &
+      )) THEN
+     ALLOCATE( ZSAVE_INPRC(SIZE(XINPRC,1),SIZE(XINPRC,2),IMODSON))
+   ELSE
+     ALLOCATE( ZSAVE_INPRC(0,0,0))
+   END IF
+   IF (LUSERR) THEN
+     ALLOCATE( ZSAVE_INPRR(SIZE(XINPRR,1),SIZE(XINPRR,2),IMODSON))
+   ELSE
+     ALLOCATE( ZSAVE_INPRR(0,0,0))
+   END IF
+   IF (LUSERS) THEN
+     ALLOCATE( ZSAVE_INPRS(SIZE(XINPRS,1),SIZE(XINPRS,2),IMODSON))
+   ELSE
+     ALLOCATE( ZSAVE_INPRS(0,0,0))                              
+   END IF
+   IF (LUSERG) THEN
+     ALLOCATE( ZSAVE_INPRG(SIZE(XINPRG,1),SIZE(XINPRG,2),IMODSON))
+   ELSE
+     ALLOCATE( ZSAVE_INPRG(0,0,0))                                
+   END IF
+   IF (LUSERH) THEN
+     ALLOCATE( ZSAVE_INPRH(SIZE(XINPRH,1),SIZE(XINPRH,2),IMODSON))
+   ELSE
+     ALLOCATE( ZSAVE_INPRH(0,0,0))                               
+   END IF
+   IF (CDCONV /= 'NONE') THEN
+     ALLOCATE( ZSAVE_PRCONV(SIZE(XPRCONV,1),SIZE(XPRCONV,2),IMODSON))
+     ALLOCATE( ZSAVE_PRSCONV(SIZE(XPRSCONV,1),SIZE(XPRSCONV,2),IMODSON))
+   ELSE
+     ALLOCATE( ZSAVE_PRCONV(0,0,0))                                
+     ALLOCATE( ZSAVE_PRSCONV(0,0,0))                                    
+   END IF
+   IF (CRAD /= 'NONE') THEN
+     ALLOCATE( ZSAVE_DIRFLASWD(SIZE(XDIRFLASWD,1),SIZE(XDIRFLASWD,2),SIZE(XDIRFLASWD,3),IMODSON))
+     ALLOCATE( ZSAVE_SCAFLASWD(SIZE(XSCAFLASWD,1),SIZE(XSCAFLASWD,2),SIZE(XSCAFLASWD,3),IMODSON))
+     ALLOCATE( ZSAVE_DIRSRFSWD(SIZE(XDIRSRFSWD,1),SIZE(XDIRSRFSWD,2),SIZE(XDIRSRFSWD,3),IMODSON))
+   ELSE
+     ALLOCATE( ZSAVE_DIRFLASWD(0,0,0,0))
+     ALLOCATE( ZSAVE_SCAFLASWD(0,0,0,0))
+     ALLOCATE( ZSAVE_DIRSRFSWD(0,0,0,0)) 
+   END IF
+ ENDIF
+!
+IKIDM=0
+DO JKID = IMI+1,NMODEL  ! min value of the possible kids
+ IF (IMI == NDAD(JKID) .AND. XWAY(JKID) == 2. .AND. CPROGRAM=='MESONH' &
+  .AND. (CCONF == 'RESTA' .OR. (CCONF == 'START' .AND. KTCOUNT /= 1))) THEN
+! BUG if number of the son does not follow the number of the dad
+! IKIDM = JKID-IMI
+  IKIDM = IKIDM + 1
+   IF (LUSERC .AND. (                                               &
+       (LSEDIC .AND. CCLOUD(1:3) == 'ICE')                     .OR. &
+       (LSEDC  .AND. (CCLOUD == 'C2R2' .OR. CCLOUD == 'KHKO')) .OR. &
+       (MSEDC  .AND. CCLOUD=='LIMA')                                &
+      )) THEN
+     ZSAVE_INPRC(:,:,IKIDM) = XINPRC(:,:)
+   END IF
+   IF (LUSERR) THEN
+     ZSAVE_INPRR(:,:,IKIDM) = XINPRR(:,:)
+   END IF
+   IF (LUSERS) THEN
+     ZSAVE_INPRS(:,:,IKIDM) = XINPRS(:,:)
+   END IF
+   IF (LUSERG) THEN
+     ZSAVE_INPRG(:,:,IKIDM) = XINPRG(:,:)
+   END IF
+   IF (LUSERH) THEN
+     ZSAVE_INPRH(:,:,IKIDM) = XINPRH(:,:)
+   END IF
+   IF (CDCONV /= 'NONE') THEN
+     ZSAVE_PRCONV(:,:,IKIDM) = XPRCONV(:,:)
+     ZSAVE_PRSCONV(:,:,IKIDM) = XPRSCONV(:,:)
+   END IF
+   IF (CRAD /= 'NONE') THEN
+     ZSAVE_DIRFLASWD(:,:,:,IKIDM) = XDIRFLASWD(:,:,:)
+     ZSAVE_SCAFLASWD(:,:,:,IKIDM) = XSCAFLASWD(:,:,:)
+     ZSAVE_DIRSRFSWD(:,:,:,IKIDM) = XDIRSRFSWD(:,:,:)
+   END IF
+ ENDIF
+END DO
+!
+!-----------------------------------------------------------------------------
+!
+!*        1.    RADIATION SCHEME
+!               ----------------
+!
+!
+XTIME_BU_PROCESS = 0.
+XTIME_LES_BU_PROCESS = 0.
+!
+CALL SECOND_MNH2(ZTIME1)
+!
+!
+!*        1.1   Tests to control how the radiation package should be called (at the current timestep)
+!               -----------------------------------------------------------
+!
+!
+GRAD = .FALSE.
+OCLOUD_ONLY = .FALSE.
+!
+IF (CRAD /='NONE') THEN
+!
+!  test to see if the partial radiations for cloudy must be called
+!
+  IF (CRAD =='ECMW' .OR. CRAD =='ECRA') THEN
+    CALL DATETIME_DISTANCE(TDTRAD_CLONLY,TDTCUR,ZTEMP_DIST)
+    IF( MOD(NINT(ZTEMP_DIST/XTSTEP),NINT(XDTRAD_CLONLY/XTSTEP))==0 ) THEN
+      TDTRAD_CLONLY = TDTCUR
+      GRAD = .TRUE.
+      OCLOUD_ONLY = .TRUE.
+    END IF
+  END IF
+!   
+! test to see if the full radiations must be called
+!   
+  CALL DATETIME_DISTANCE(TDTCUR,TDTRAD_FULL,ZTEMP_DIST)
+  IF( MOD(NINT(ZTEMP_DIST/XTSTEP),NINT(XDTRAD/XTSTEP))==0 ) THEN
+    TDTRAD_FULL = TDTCUR
+    GRAD = .TRUE.
+    OCLOUD_ONLY = .FALSE.
+  END IF
+!
+! tests to see if any cloud exists
+!   
+  IF (CRAD =='ECMW' .OR. CRAD =='ECRA') THEN
+    IF (GRAD .AND. NRR.LE.3 ) THEN 
+      IF( MAXVAL(XCLDFR(:,:,:)).LE. 1.E-10 .AND. OCLOUD_ONLY ) THEN
+          GRAD = .FALSE.                ! only the cloudy verticals would be 
+                                        ! refreshed but there is no clouds 
+      END IF
+    END IF
+!
+    IF (GRAD .AND. NRR.GE.4 ) THEN 
+      IF( CCLOUD(1:3)=='ICE' )THEN
+        IF( MAXVAL(XRT(:,:,:,2)).LE.XRTMIN(2) .AND.             &
+            MAXVAL(XRT(:,:,:,4)).LE.XRTMIN(4) .AND. OCLOUD_ONLY ) THEN
+            GRAD = .FALSE.            ! only the cloudy verticals would be 
+                                      ! refreshed but there is no cloudwater and ice
+        END IF
+      END IF
+      IF( CCLOUD=='C3R5' )THEN
+        IF( MAXVAL(XRT(:,:,:,2)).LE.XRTMIN_C1R3(2) .AND.             &
+            MAXVAL(XRT(:,:,:,4)).LE.XRTMIN_C1R3(4) .AND. OCLOUD_ONLY ) THEN
+            GRAD = .FALSE.            ! only the cloudy verticals would be 
+                                      ! refreshed but there is no cloudwater and ice
+        END IF
+      END IF
+      IF( CCLOUD=='LIMA' )THEN
+        IF( MAXVAL(XRT(:,:,:,2)).LE.XRTMIN_LIMA(2) .AND.             &
+            MAXVAL(XRT(:,:,:,4)).LE.XRTMIN_LIMA(4) .AND. OCLOUD_ONLY ) THEN
+            GRAD = .FALSE.            ! only the cloudy verticals would be 
+                                      ! refreshed but there is no cloudwater and ice
+        END IF
+      END IF      
+    END IF
+  END IF
+!
+END IF
+!
+! global parallel mask for 'GRAD'
+ZRAD_GLOB_ll = 0.0
+IF (GRAD) ZRAD_GLOB_ll = 1.0
+CALL REDUCESUM_ll(ZRAD_GLOB_ll,INFO_ll)
+if (ZRAD_GLOB_ll .NE. 0.0 ) GRAD = .TRUE.
+!
+!
+IF( GRAD ) THEN                                 
+  ALLOCATE(ZCOSZEN(IIU,IJU))
+  ALLOCATE(ZSINZEN(IIU,IJU))
+  ALLOCATE(ZAZIMSOL(IIU,IJU))
+!
+!
+!*        1.2.  Astronomical computations
+!               -------------------------
+!
+! Ajout PP
+IF (.NOT. OCLOUD_ONLY .AND. KTCOUNT /= 1)  THEN 
+ IF (LAERO_FT) THEN 
+  CALL AEROZON (XPABST,XTHT,XTSRAD,XLAT,XLON,TDTCUR,TDTEXP,   &
+         NDLON,NFLEV,CAER,NAER,NSTATM,                             &
+         XSINDEL,XCOSDEL,XTSIDER,XCORSOL,                          &
+         XSTATM,XOZON, XAER)
+ END IF
+END IF
+!
+CALL SUNPOS_n   ( XZENITH, ZCOSZEN, ZSINZEN, ZAZIMSOL )
+!
+!*        1.3   Call to radiation scheme
+!               ------------------------
+!
+  SELECT CASE ( CRAD )
+!
+!*        1.3.1 TOP of Atmposphere radiation
+!               ----------------------------
+    CASE('TOPA')
+!
+      XFLALWD   (:,:)   = 300.
+      DO JSWB=1,NSWB_MNH
+        XDIRFLASWD(:,:,JSWB) = XI0 * MAX(COS(XZENITH(:,:)),0.)/REAL(NSWB_MNH)
+        XSCAFLASWD(:,:,JSWB) = 0.
+      END DO
+      XDTHRAD(:,:,:) = 0.
+     
+!
+!*        1.3.1 FIXEd radiative surface fluxes
+!               ------------------------------
+!
+    CASE('FIXE')
+      ZTIME = MOD(TDTCUR%xtime +XLON0*240., XDAY)
+      IHOUR = INT( ZTIME/3600. )
+      IF (IHOUR < 0) IHOUR=IHOUR + 24
+      ZDT = ZTIME/3600. - REAL(IHOUR)
+      XDIRFLASWD(:,:,:) =(( ZRG_HOUR(IHOUR+1)-ZRG_HOUR(IHOUR) )*ZDT + ZRG_HOUR(IHOUR)) / REAL(NSWB_MNH)
+      XFLALWD   (:,:)   = (ZRAT_HOUR(IHOUR+1)-ZRAT_HOUR(IHOUR))*ZDT + ZRAT_HOUR(IHOUR)
+      DO JSWB=1,NSWB_MNH
+        WHERE(ZCOSZEN(:,:)<0.) XDIRFLASWD(:,:,JSWB) = 0.
+      END DO
+
+      XSCAFLASWD(:,:,:) = XDIRFLASWD(:,:,:) * 0.2
+      XDIRFLASWD(:,:,:) = XDIRFLASWD(:,:,:) * 0.8
+      XDTHRAD(:,:,:) = 0.
+      !
+!
+!*        1.3.2 ECMWF or ECRAD radiative surface and atmospheric fluxes
+!               ----------------------------------------------
+!
+    CASE('ECMW' , 'ECRA')
+      IF (LLES_MEAN) OCLOUD_ONLY=.FALSE.
+      XRADEFF(:,:,:)=0.0
+      XSWU(:,:,:)=0.0
+      XSWD(:,:,:)=0.0
+      XLWU(:,:,:)=0.0
+      XLWD(:,:,:)=0.0
+      XDTHRADSW(:,:,:)=0.0
+      XDTHRADLW(:,:,:)=0.0
+      CALL RADIATIONS( TPFILE,                                                                   &
+                       LCLEAR_SKY, OCLOUD_ONLY, NCLEARCOL_TM1, CEFRADL, CEFRADI, COPWSW, COPISW, &
+                       COPWLW, COPILW, XFUDG,                                                    &
+                       NDLON, NFLEV, NRAD_DIAG, NFLUX, NRAD, NAER, NSWB_OLD, NSWB_MNH, NLWB_MNH, &
+                       NSTATM, NRAD_COLNBR, ZCOSZEN, XSEA, XCORSOL,                              &
+                       XDIR_ALB, XSCA_ALB, XEMIS, XCLDFR, XCCO2, XTSRAD, XSTATM, XTHT, XRT,      &
+                       XPABST, XOZON, XAER,XDST_WL, XAER_CLIM, XSVT,                             &
+                       XDTHRAD, XFLALWD, XDIRFLASWD, XSCAFLASWD, XRHODREF, XZZ ,                 &
+                       XRADEFF, XSWU, XSWD, XLWU, XLWD, XDTHRADSW, XDTHRADLW                     )
+!
+
+      WRITE(UNIT=ILUOUT,FMT='("  RADIATIONS called for KTCOUNT=",I6,       &
+         &  "with the CLOUD_ONLY option set ",L2)')   KTCOUNT,OCLOUD_ONLY
+!
+      !
+      WHERE (XDIRFLASWD.LT.0.0)
+         XDIRFLASWD=0.0
+      ENDWHERE
+      !
+      WHERE (XDIRFLASWD.GT.1500.0)
+         XDIRFLASWD=1500.0
+      ENDWHERE
+      !
+      WHERE (XSCAFLASWD.LT.0.0) 
+         XSCAFLASWD=0.0
+      ENDWHERE
+      !
+      WHERE (XSCAFLASWD.GT.1500.0) 
+         XSCAFLASWD=1500.0
+      ENDWHERE
+      !
+      WHERE( XDIRFLASWD(:,:,1) + XSCAFLASWD(:,:,1) >0. )
+        XALBUV(:,:) = (  XDIR_ALB(:,:,1) * XDIRFLASWD(:,:,1)   &
+                       + XSCA_ALB(:,:,1) * XSCAFLASWD(:,:,1) ) &
+                    / (XDIRFLASWD(:,:,1) + XSCAFLASWD(:,:,1) )
+      ELSEWHERE
+        XALBUV(:,:) = XDIR_ALB(:,:,1)
+      END WHERE
+!
+  END SELECT
+!
+  CALL SECOND_MNH2(ZTIME2)
+!
+  PRAD = PRAD + ZTIME2 - ZTIME1
+!
+  ZTIME1 = ZTIME2
+!
+  CALL SURF_RAD_MODIF (XMAP, XXHAT, XYHAT,                 &
+                  ZCOSZEN, ZSINZEN, ZAZIMSOL, XZS, XZS_XY, &
+                  XDIRFLASWD, XDIRSRFSWD                   )
+!
+!* Azimuthal angle to be sent later to surface processes
+!  Defined in radian, clockwise, from North
+!
+  XAZIM = ZAZIMSOL
+!
+  CALL SECOND_MNH2(ZTIME2)
+!
+  PSHADOWS = PSHADOWS + ZTIME2 - ZTIME1
+!
+  ZTIME1 = ZTIME2
+!
+  DEALLOCATE(ZCOSZEN)
+  DEALLOCATE(ZSINZEN)
+  DEALLOCATE(ZAZIMSOL)
+!
+END IF
+!
+!
+!*        1.4   control prints
+!               --------------
+!
+!*        1.5   Radiative tendency integration
+!               ------------------------------
+!
+IF (CRAD /='NONE') THEN
+  if ( lbudget_th ) call Budget_store_init( tbudgets(NBUDGET_TH), 'RAD', xrths(:, :, :) )
+  XRTHS(:,:,:) = XRTHS(:,:,:) + XRHODJ(:,:,:)*XDTHRAD(:,:,:)
+  if ( lbudget_th ) call Budget_store_end ( tbudgets(NBUDGET_TH), 'RAD', xrths(:, :, :) )
+END IF
+!
+!
+!*        1.6   Ocean case:
+! Sfc turbulent fluxes & Radiative tendency due to SW penetrating ocean
+! 
+IF (LOCEAN .AND. (.NOT.LCOUPLES)) THEN
+!
+  ALLOCATE( ZIZOCE(IKU)); ZIZOCE(:)=0. 
+  ALLOCATE( ZPROSOL1(IKU))
+  ALLOCATE( ZPROSOL2(IKU))
+  ALLOCATE(XSSUFL(IIU,IJU))
+  ALLOCATE(XSSVFL(IIU,IJU))
+  ALLOCATE(XSSTFL(IIU,IJU))
+  ALLOCATE(XSSOLA(IIU,IJU))
+  ! Time interpolation
+  JSW     = INT(TDTCUR%xtime/REAL(NINFRT))
+  ZSWA    = TDTCUR%xtime/REAL(NINFRT)-REAL(JSW)
+  XSSTFL  = (XSSTFL_T(JSW+1)*(1.-ZSWA)+XSSTFL_T(JSW+2)*ZSWA) 
+  XSSUFL  = (XSSUFL_T(JSW+1)*(1.-ZSWA)+XSSUFL_T(JSW+2)*ZSWA)
+  XSSVFL  = (XSSVFL_T(JSW+1)*(1.-ZSWA)+XSSVFL_T(JSW+2)*ZSWA)
+!
+  ZIZOCE(IKU)   = XSSOLA_T(JSW+1)*(1.-ZSWA)+XSSOLA_T(JSW+2)*ZSWA
+  ZPROSOL1(IKU) = XROC*ZIZOCE(IKU)
+  ZPROSOL2(IKU) = (1.-XROC)*ZIZOCE(IKU)
+  IF(NVERB >= 5 ) THEN   
+    WRITE(ILUOUT,*)'ZSWA JSW TDTCUR XTSTEP FT FU FV SolarR(IKU)', NINFRT, ZSWA,JSW,&
+       TDTCUR%xtime, XTSTEP, XSSTFL(2,2), XSSUFL(2,2),XSSVFL(2,2),ZIZOCE(IKU)
+  END IF
+  if ( lbudget_th ) call Budget_store_init( tbudgets(NBUDGET_TH), 'OCEAN', xrths(:, :, :) ) 
+  DO JKM=IKU-1,2,-1
+    ZPROSOL1(JKM) = ZPROSOL1(JKM+1)* exp(-XDZZ(2,2,JKM)/XD1)
+    ZPROSOL2(JKM) = ZPROSOL2(JKM+1)* exp(-XDZZ(2,2,JKM)/XD2)
+    ZIZOCE(JKM)   = (ZPROSOL1(JKM+1)-ZPROSOL1(JKM) + ZPROSOL2(JKM+1)-ZPROSOL2(JKM))/XDZZ(2,2,JKM)
+    ! Adding to temperature tendency, the solar radiation penetrating in ocean
+    XRTHS(:,:,JKM) = XRTHS(:,:,JKM) + XRHODJ(:,:,JKM)*ZIZOCE(JKM)
+  END DO
+  if ( lbudget_th ) call Budget_store_end ( tbudgets(NBUDGET_TH), 'OCEAN', xrths(:, :, :) )
+  DEALLOCATE( ZIZOCE) 
+  DEALLOCATE (ZPROSOL1)
+  DEALLOCATE (ZPROSOL2)
+END IF
+!
+!
+CALL SECOND_MNH2(ZTIME2)
+!
+PRAD = PRAD + ZTIME2 - ZTIME1 &
+     - XTIME_LES_BU_PROCESS - XTIME_BU_PROCESS
+!
+PTIME_BU = PTIME_BU + XTIME_LES_BU_PROCESS + XTIME_BU_PROCESS
+!
+!
+!-----------------------------------------------------------------------------
+!
+!*        2.    DEEP CONVECTION SCHEME
+!               ----------------------
+!
+ZTIME1 = ZTIME2
+XTIME_BU_PROCESS = 0.
+XTIME_LES_BU_PROCESS = 0.
+!
+CALL SECOND_MNH2(ZTIME1)
+!
+IF( CDCONV == 'KAFR' .OR. CSCONV == 'KAFR' ) THEN
+
+  if (  lbudget_th ) call Budget_store_init( tbudgets(NBUDGET_TH), 'DCONV', xrths(:, :, :)    )
+  if (  lbudget_rv ) call Budget_store_init( tbudgets(NBUDGET_RV), 'DCONV', xrrs (:, :, :, 1) )
+  if (  lbudget_rc ) call Budget_store_init( tbudgets(NBUDGET_RC), 'DCONV', xrrs (:, :, :, 2) )
+  if (  lbudget_ri ) call Budget_store_init( tbudgets(NBUDGET_RI), 'DCONV', xrrs (:, :, :, 4) )
+  if (  lbudget_sv .and. lchtrans ) then
+    do jsv = 1, size( xrsvs, 4 )
+      call Budget_store_init( tbudgets(NBUDGET_SV1 - 1 + jsv), 'DCONV', xrsvs (:, :, :, jsv) )
+    end do
+  end if
+!
+! test to see if the deep convection scheme should be called
+!
+  GDCONV = .FALSE.
+!
+  CALL DATETIME_DISTANCE(TDTDCONV,TDTCUR,ZTEMP_DIST)
+  IF( MOD(NINT(ZTEMP_DIST/XTSTEP),NINT(XDTCONV/XTSTEP))==0 ) THEN
+    TDTDCONV = TDTCUR
+    GDCONV   = .TRUE.
+  END IF
+!
+  IF( GDCONV ) THEN
+    IF (CDCONV == 'KAFR' .OR. CSCONV == 'KAFR' ) THEN
+        ALLOCATE( ZRC(IIU,IJU,IKU) )
+        ALLOCATE( ZRI(IIU,IJU,IKU) )
+        ALLOCATE( ZWT(IIU,IJU,IKU) )
+        ALLOCATE( ZDXDY(IIU,IJU) )
+        ! Compute grid area
+        ZDXDY(:,:) = SPREAD(XDXHAT(1:IIU),2,IJU) * SPREAD(XDYHAT(1:IJU),1,IIU)
+        !
+        IF( LUSERC .AND. LUSERI ) THEN
+          ZRC(:,:,:) = XRT(:,:,:,2)
+          ZRI(:,:,:) = XRT(:,:,:,4)
+        ELSE IF( LUSERC .AND. (.NOT. LUSERI) ) THEN
+          ZRC(:,:,:) = XRT(:,:,:,2)
+          ZRI(:,:,:) = 0.0
+        ELSE
+          ZRC(:,:,:) = 0.0
+          ZRI(:,:,:) = 0.0
+        END IF
+        WRITE(UNIT=ILUOUT,FMT='("  CONVECTION called for KTCOUNT=",I6)')  &
+                                              KTCOUNT
+        IF ( LFORCING .AND. L1D ) THEN
+          ZWT(:,:,:) = XWTFRC(:,:,:)
+        ELSE
+          ZWT(:,:,:) = XWT(:,:,:)
+        ENDIF
+        IF (LDUST) CALL DUST_FILTER(XSVT(:,:,:,NSV_DSTBEG:NSV_DSTEND), XRHODREF(:,:,:))
+        IF (LSALT) CALL SALT_FILTER(XSVT(:,:,:,NSV_SLTBEG:NSV_SLTEND), XRHODREF(:,:,:))
+        IF (LCH_CONV_LINOX) THEN
+          CALL CONVECTION( XDTCONV, CDCONV, CSCONV, LREFRESH_ALL, LDOWN, NICE, &
+                         LSETTADJ, XTADJD, XTADJS, LDIAGCONV, NENSM,           &
+                         XPABST, XZZ, ZDXDY,                                   &
+                         XTHT, XRT(:,:,:,1), ZRC, ZRI, XUT, XVT,               &
+                         ZWT,XTKET(:,:,IKB),                                   &
+                         NCOUNTCONV, XDTHCONV, XDRVCONV, XDRCCONV, XDRICONV,   &
+                         XPRCONV, XPRSCONV,                                    &
+                         XUMFCONV,XDMFCONV,XMFCONV,XPRLFLXCONV,XPRSFLXCONV,    &
+                         XCAPE, NCLTOPCONV, NCLBASCONV,                        &
+                         LCHTRANS, XSVT, XDSVCONV,                             &
+                         LUSECHEM, LCH_CONV_SCAV, LCH_CONV_LINOX,              &
+                         LDUST, LSALT,                                         &
+                         XRHODREF, XIC_RATE, XCG_RATE                          )
+        ELSE
+          CALL CONVECTION( XDTCONV, CDCONV, CSCONV, LREFRESH_ALL, LDOWN, NICE, &
+                         LSETTADJ, XTADJD, XTADJS, LDIAGCONV, NENSM,           &
+                         XPABST, XZZ, ZDXDY,                                   &
+                         XTHT, XRT(:,:,:,1), ZRC, ZRI, XUT, XVT,               &
+                         ZWT,XTKET(:,:,IKB),                                   &
+                         NCOUNTCONV, XDTHCONV, XDRVCONV, XDRCCONV, XDRICONV,   &
+                         XPRCONV, XPRSCONV,                                    &
+                         XUMFCONV,XDMFCONV,XMFCONV,XPRLFLXCONV,XPRSFLXCONV,    &
+                         XCAPE, NCLTOPCONV, NCLBASCONV,                        &
+                         LCHTRANS, XSVT, XDSVCONV,                             &
+                         LUSECHEM, LCH_CONV_SCAV, LCH_CONV_LINOX,              &
+                         LDUST, LSALT,                                         &
+                         XRHODREF )
+        END IF
+!
+        DEALLOCATE( ZRC )
+        DEALLOCATE( ZRI )
+        DEALLOCATE( ZWT )
+        DEALLOCATE( ZDXDY )
+    END IF    
+  END IF
+!
+!  Deep convection tendency integration
+!
+  XRTHS(:,:,:)  = XRTHS(:,:,:)  + XRHODJ(:,:,:) * XDTHCONV(:,:,:)
+  XRRS(:,:,:,1) = XRRS(:,:,:,1) + XRHODJ(:,:,:) * XDRVCONV(:,:,:)
+!
+!
+! Aerosols size distribution
+! Compute Rg and sigma before tracers convection tendency (for orilam, dust and sea
+! salt)
+!
+
+  IF ( LCHTRANS ) THEN  ! update tracers for chemical transport
+    IF (LORILAM) ZRSVS(:,:,:,:) = XRSVS(:,:,:,:)    !
+    IF ((LDUST)) THEN ! dust convective balance
+      ALLOCATE(ZSIGDST(IIU,IJU,IKU,NMODE_DST))
+      ALLOCATE(ZRGDST(IIU,IJU,IKU,NMODE_DST))
+      ALLOCATE(ZNDST(IIU,IJU,IKU,NMODE_DST))
+      ALLOCATE(ZSVDST(IIU,IJU,IKU,NSV_DST))
+      !
+      DO JSV=1,NMODE_DST
+        IMODEIDX = JPDUSTORDER(JSV)
+        IF (CRGUNITD=="MASS") THEN
+          ZINIRADIUS(JSV) = XINIRADIUS(IMODEIDX) * EXP(-3.*(LOG(XINISIG(IMODEIDX)))**2)
+        ELSE
+          ZINIRADIUS(JSV) = XINIRADIUS(IMODEIDX)
+        END IF
+        ZSIGDST(:,:,:,JSV) = XINISIG(IMODEIDX)
+        ZRGDST(:,:,:,JSV)  = ZINIRADIUS(JSV)
+        ZNDST(:,:,:,JSV)   = XN0MIN(IMODEIDX)
+      ENDDO
+      !
+      DO JSV=NSV_DSTBEG,NSV_DSTEND
+        ZSVDST(:,:,:,JSV-NSV_DSTBEG+1) = XRSVS(:,:,:,JSV) * XTSTEP / XRHODJ(:,:,:) 
+      ENDDO
+      CALL PPP2DUST(ZSVDST(IIB:IIE,IJB:IJE,IKB:IKE,:), XRHODREF(IIB:IIE,IJB:IJE,IKB:IKE),&
+              PSIG3D=ZSIGDST(IIB:IIE,IJB:IJE,IKB:IKE,:), PRG3D=ZRGDST(IIB:IIE,IJB:IJE,IKB:IKE,:),   &
+              PN3D=ZNDST(IIB:IIE,IJB:IJE,IKB:IKE,:))
+    END IF
+    !
+    IF ((LSALT)) THEN ! sea salt convective balance
+      ALLOCATE(ZSIGSLT(IIU,IJU,IKU,NMODE_SLT))
+      ALLOCATE(ZRGSLT(IIU,IJU,IKU,NMODE_SLT))
+      ALLOCATE(ZNSLT(IIU,IJU,IKU,NMODE_SLT))
+      ALLOCATE(ZSVSLT(IIU,IJU,IKU,NSV_SLT))
+      !
+      DO JSV=1,NMODE_SLT
+        IMODEIDX = JPSALTORDER(JSV)
+        IF (CRGUNITS=="MASS") THEN
+          ZINIRADIUS_SLT(JSV) = XINIRADIUS_SLT(IMODEIDX) * &
+                            EXP(-3.*(LOG(XINISIG_SLT(IMODEIDX)))**2)
+        ELSE
+          ZINIRADIUS_SLT(JSV) = XINIRADIUS_SLT(IMODEIDX)
+        END IF
+        ZSIGSLT(:,:,:,JSV) = XINISIG_SLT(IMODEIDX)
+        ZRGSLT(:,:,:,JSV)  = ZINIRADIUS_SLT(JSV)
+        ZNSLT(:,:,:,JSV)   = XN0MIN_SLT(IMODEIDX)
+      ENDDO
+      !
+      DO JSV=NSV_SLTBEG,NSV_SLTEND
+        ZSVSLT(:,:,:,JSV-NSV_SLTBEG+1) = XRSVS(:,:,:,JSV) * XTSTEP / XRHODJ(:,:,:) 
+      ENDDO
+      CALL PPP2SALT(ZSVSLT(IIB:IIE,IJB:IJE,IKB:IKE,:), XRHODREF(IIB:IIE,IJB:IJE,IKB:IKE),&
+              PSIG3D=ZSIGSLT(IIB:IIE,IJB:IJE,IKB:IKE,:), PRG3D=ZRGSLT(IIB:IIE,IJB:IJE,IKB:IKE,:),   &
+              PN3D=ZNSLT(IIB:IIE,IJB:IJE,IKB:IKE,:))
+    END IF
+    !
+!
+! Compute convective tendency for all tracers
+!
+  IF (LCHTRANS) THEN
+    DO JSV = 1, SIZE(XRSVS,4)
+      XRSVS(:,:,:,JSV) = XRSVS(:,:,:,JSV) + XRHODJ(:,:,:) * XDSVCONV(:,:,:,JSV)
+    END DO
+    IF (LORILAM) THEN
+      DO JSV = NSV_AERBEG,NSV_AEREND
+        PWETDEPAER(:,:,:,JSV-NSV_AERBEG+1) = XDSVCONV(:,:,:,JSV) * XRHODJ(:,:,:)
+        XRSVS(:,:,:,JSV) = ZRSVS(:,:,:,JSV) 
+      END DO
+    END IF  
+  END IF
+!
+  IF ((LDUST).AND.(LCHTRANS)) THEN ! dust convective balance
+    IF (CPROGRAM == "MESONH") THEN
+      DO JSV=NSV_DSTBEG,NSV_DSTEND
+          ZSVDST(:,:,:,JSV-NSV_DSTBEG+1) = XRSVS(:,:,:,JSV) * XTSTEP / XRHODJ(:,:,:) 
+      ENDDO
+    ELSE
+      DO JSV=NSV_DSTBEG,NSV_DSTEND
+        ZSVDST(:,:,:,JSV-NSV_DSTBEG+1) = XSVT(:,:,:,JSV)
+      ENDDO
+    ENDIF
+    CALL DUST2PPP(ZSVDST(IIB:IIE,IJB:IJE,IKB:IKE,:), &
+                    XRHODREF(IIB:IIE,IJB:IJE,IKB:IKE), ZSIGDST(IIB:IIE,IJB:IJE,IKB:IKE,:),&
+                    ZRGDST(IIB:IIE,IJB:IJE,IKB:IKE,:))
+    DO JSV=NSV_DSTBEG,NSV_DSTEND
+      XRSVS(:,:,:,JSV) =  ZSVDST(:,:,:,JSV-NSV_DSTBEG+1) * XRHODJ(:,:,:) / XTSTEP
+    ENDDO
+    !
+    DEALLOCATE(ZSVDST)
+    DEALLOCATE(ZNDST)
+    DEALLOCATE(ZRGDST)
+    DEALLOCATE(ZSIGDST)
+  END IF
+    !
+  IF ((LSALT).AND.(LCHTRANS)) THEN ! sea salt convective balance
+    IF (CPROGRAM == "MESONH") THEN
+      DO JSV=NSV_SLTBEG,NSV_SLTEND
+        ZSVSLT(:,:,:,JSV-NSV_SLTBEG+1) = XRSVS(:,:,:,JSV) * XTSTEP / XRHODJ(:,:,:) 
+      ENDDO
+    ELSE
+      DO JSV=NSV_SLTBEG,NSV_SLTEND
+        ZSVSLT(:,:,:,JSV-NSV_SLTBEG+1) = XSVT(:,:,:,JSV)
+      ENDDO
+    END IF
+    CALL SALT2PPP(ZSVSLT(IIB:IIE,IJB:IJE,IKB:IKE,:), &
+                  XRHODREF(IIB:IIE,IJB:IJE,IKB:IKE), ZSIGSLT(IIB:IIE,IJB:IJE,IKB:IKE,:),&
+                  ZRGSLT(IIB:IIE,IJB:IJE,IKB:IKE,:))
+    DO JSV=NSV_SLTBEG,NSV_SLTEND
+      XRSVS(:,:,:,JSV) =  ZSVSLT(:,:,:,JSV-NSV_SLTBEG+1) * XRHODJ(:,:,:) / XTSTEP
+    ENDDO
+    !
+    DEALLOCATE(ZSVSLT)
+    DEALLOCATE(ZNSLT)
+    DEALLOCATE(ZRGSLT)
+    DEALLOCATE(ZSIGSLT)
+  END IF
+  !
+END IF
+!
+  IF( LUSERC .AND. LUSERI ) THEN
+    XRRS(:,:,:,2) = XRRS(:,:,:,2) + XRHODJ(:,:,:) * XDRCCONV(:,:,:)
+    XRRS(:,:,:,4) = XRRS(:,:,:,4) + XRHODJ(:,:,:) * XDRICONV(:,:,:)
+!
+  ELSE IF ( LUSERC .AND. (.NOT. LUSERI) ) THEN
+!
+!  If only cloud water but no cloud ice is used, the convective tendency
+!     for cloud ice is added to the tendency for cloud water
+!
+      XRRS(:,:,:,2) = XRRS(:,:,:,2) + XRHODJ(:,:,:) * (XDRCCONV(:,:,:) + &
+                                                       XDRICONV(:,:,:)   )
+!     and cloud ice is melted
+!
+      XRTHS(:,:,:) = XRTHS(:,:,:) - XRHODJ(:,:,:) *                      &
+         ( XP00/XPABST(:,:,:) )**(XRD/XCPD) * XLMTT / XCPD * XDRICONV(:,:,:)
+!
+  ELSE IF ( (.NOT. LUSERC) .AND. (.NOT. LUSERI) ) THEN
+!
+!  If no cloud water and no cloud ice are used the convective tendencies for these
+!     variables are added to the water vapor tendency
+!
+      XRRS(:,:,:,1) = XRRS(:,:,:,1) + XRHODJ(:,:,:) * (XDRCCONV(:,:,:) + &
+                                                       XDRICONV(:,:,:)   )
+!     and all cloud condensate is evaporated
+!
+      XRTHS(:,:,:) = XRTHS(:,:,:) - XRHODJ(:,:,:) / XCPD * (              &
+                     XLVTT * XDRCCONV(:,:,:) + XLSTT * XDRICONV(:,:,:) ) *&
+                    ( XP00 / XPABST(:,:,:) ) ** ( XRD / XCPD )
+  END IF
+
+  if (  lbudget_th ) call Budget_store_end( tbudgets(NBUDGET_TH), 'DCONV', xrths(:, :, :)    )
+  if (  lbudget_rv ) call Budget_store_end( tbudgets(NBUDGET_RV), 'DCONV', xrrs (:, :, :, 1) )
+  if (  lbudget_rc ) call Budget_store_end( tbudgets(NBUDGET_RC), 'DCONV', xrrs (:, :, :, 2) )
+  if (  lbudget_ri ) call Budget_store_end( tbudgets(NBUDGET_RI), 'DCONV', xrrs (:, :, :, 4) )
+  if (  lbudget_sv .and. lchtrans ) then
+    do jsv = 1, size( xrsvs, 4 )
+      call Budget_store_end( tbudgets(NBUDGET_SV1 - 1 + jsv), 'DCONV', xrsvs (:, :, :, jsv) )
+    end do
+  end if
+END IF
+!
+CALL SECOND_MNH2(ZTIME2)
+!
+PKAFR = PKAFR + ZTIME2 - ZTIME1 &
+       - XTIME_LES_BU_PROCESS - XTIME_BU_PROCESS
+!
+PTIME_BU = PTIME_BU + XTIME_LES_BU_PROCESS + XTIME_BU_PROCESS
+!
+!-----------------------------------------------------------------------------
+!
+!*        3.    TURBULENT SURFACE FLUXES
+!               ------------------------
+!
+ZTIME1 = ZTIME2
+!
+IF (CSURF=='EXTE') THEN
+  CALL GOTO_SURFEX(IMI)
+!
+  IF( LTRANS ) THEN
+    XUT(:,:,1+JPVEXT) = XUT(:,:,1+JPVEXT) + XUTRANS
+    XVT(:,:,1+JPVEXT) = XVT(:,:,1+JPVEXT) + XVTRANS
+  END IF
+  !
+  ALLOCATE(ZDIR_ALB(IIU,IJU,NSWB_MNH))
+  ALLOCATE(ZSCA_ALB(IIU,IJU,NSWB_MNH))
+  ALLOCATE(ZEMIS  (IIU,IJU,NLWB_MNH))
+  ALLOCATE(ZTSRAD (IIU,IJU))
+  !  
+  IKIDM=0
+  DO JKID = IMI+1,NMODEL  ! min value of the possible kids
+    IF (IMI == NDAD(JKID) .AND. XWAY(JKID) == 2. .AND. &
+     CPROGRAM=='MESONH' .AND. &
+     (CCONF == 'RESTA' .OR. (CCONF == 'START' .AND. KTCOUNT /= 1))) THEN
+    !  where kids exist, use the two-way output fields (i.e. OMASKkids true)
+    !  rather than the farther calculations in radiation and convection schemes
+! BUG if number of the son does not follow the number of the dad
+!    IKIDM = JKID-IMI
+      IKIDM = IKIDM + 1
+     IF (LUSERC .AND. (                                               &
+         (LSEDIC .AND. CCLOUD(1:3) == 'ICE')                     .OR. &
+         (LSEDC  .AND. (CCLOUD == 'C2R2' .OR. CCLOUD == 'KHKO')) .OR. &
+         (MSEDC  .AND. CCLOUD=='LIMA')                                &
+        )) THEN
+         WHERE (OMASKkids(:,:) )
+            XINPRC(:,:) = ZSAVE_INPRC(:,:,IKIDM)
+          ENDWHERE
+      END IF
+      IF (LUSERR) THEN
+        WHERE (OMASKkids(:,:) )
+          XINPRR(:,:) = ZSAVE_INPRR(:,:,IKIDM)
+        ENDWHERE
+      END IF
+      IF (LUSERS) THEN
+        WHERE (OMASKkids(:,:) )
+          XINPRS(:,:) = ZSAVE_INPRS(:,:,IKIDM)
+       ENDWHERE
+      END IF
+      IF (LUSERG) THEN
+        WHERE (OMASKkids(:,:) )
+          XINPRG(:,:) = ZSAVE_INPRG(:,:,IKIDM)
+        ENDWHERE
+      END IF
+      IF (LUSERH) THEN
+        WHERE (OMASKkids(:,:) )
+          XINPRH(:,:) = ZSAVE_INPRH(:,:,IKIDM)
+        ENDWHERE
+      END IF
+      IF (CDCONV /= 'NONE') THEN
+        WHERE (OMASKkids(:,:) )
+          XPRCONV(:,:) = ZSAVE_PRCONV(:,:,IKIDM)
+          XPRSCONV(:,:) = ZSAVE_PRSCONV(:,:,IKIDM)
+        ENDWHERE
+      END IF
+      IF (CRAD /= 'NONE') THEN
+        DO JSWB=1,NSWB_MNH
+          WHERE (OMASKkids(:,:) ) 
+            XDIRFLASWD(:,:,JSWB) = ZSAVE_DIRFLASWD(:,:,JSWB,IKIDM)
+            XSCAFLASWD(:,:,JSWB) = ZSAVE_SCAFLASWD(:,:,JSWB,IKIDM)
+            XDIRSRFSWD(:,:,JSWB) = ZSAVE_DIRSRFSWD(:,:,JSWB,IKIDM)
+          ENDWHERE
+        ENDDO
+      END IF
+    ENDIF
+  END DO
+  !
+ IF (IMODSON /= 0 ) THEN
+    DEALLOCATE( ZSAVE_INPRR,ZSAVE_INPRS,ZSAVE_INPRG,ZSAVE_INPRH)
+    DEALLOCATE( ZSAVE_INPRC,ZSAVE_PRCONV,ZSAVE_PRSCONV)
+    DEALLOCATE( ZSAVE_DIRFLASWD,ZSAVE_SCAFLASWD,ZSAVE_DIRSRFSWD)
+ END IF
+  CALL GROUND_PARAM_n(ZSFTH, ZSFRV, ZSFSV, ZSFCO2, ZSFU, ZSFV, &
+                      ZDIR_ALB, ZSCA_ALB, ZEMIS, ZTSRAD        )
+  !
+  IF (LIBM) THEN
+    WHERE(XIBM_LS(:,:,IKB,1).GT.-XIBM_EPSI)
+      ZSFTH(:,:)=0.
+      ZSFRV(:,:)=0. 
+      ZSFU (:,:)=0. 
+      ZSFV (:,:)=0.
+    ENDWHERE
+    IF (NSV>0) THEN
+      DO JSV = 1 , NSV
+         WHERE(XIBM_LS(:,:,IKB,1).GT.-XIBM_EPSI) ZSFSV(:,:,JSV)=0.
+      ENDDO
+    ENDIF 
+  ENDIF
+  !
+  IF (SIZE(XEMIS)>0) THEN
+    XDIR_ALB = ZDIR_ALB
+    XSCA_ALB = ZSCA_ALB
+    XEMIS    = ZEMIS
+    XTSRAD   = ZTSRAD
+  END IF
+  !
+  DEALLOCATE(ZDIR_ALB)
+  DEALLOCATE(ZSCA_ALB)
+  DEALLOCATE(ZEMIS   )
+  DEALLOCATE(ZTSRAD  )
+  !
+  !
+  IF( LTRANS ) THEN
+    XUT(:,:,1+JPVEXT) = XUT(:,:,1+JPVEXT) - XUTRANS
+    XVT(:,:,1+JPVEXT) = XVT(:,:,1+JPVEXT) - XVTRANS
+  END IF
+!
+ELSE
+  ZSFTH    = 0.
+  ZSFRV    = 0.
+  ZSFSV    = 0.
+  ZSFCO2   = 0.
+  ZSFU     = 0.
+  ZSFV     = 0.
+END IF
+!
+CALL SECOND_MNH2(ZTIME2)
+!
+PGROUND = PGROUND + ZTIME2 - ZTIME1
+!
+!-----------------------------------------------------------------------------
+!
+!*        3.1    EDDY FLUXES PARAMETRIZATION
+!               ------------------
+!
+IF (IMI==1) THEN  ! On calcule les flus turb. comme preconise par PP
+
+   ! Heat eddy fluxes
+   IF ( LTH_FLX ) CALL EDDY_FLUX_n(IMI,KTCOUNT,XVT,XTHT,XRHODJ,XRTHS,XVTH_FLUX_M,XWTH_FLUX_M)
+   !
+   ! Momentum eddy fluxes
+   IF ( LUV_FLX ) CALL EDDYUV_FLUX_n(IMI,KTCOUNT,XVT,XTHT,XRHODJ,XRHODREF,XPABSM,XRVS,XVU_FLUX_M)
+
+ELSE
+   ! TEST pour maille infèrieure à 20km ? 
+   !      car pb d'instabilités ?
+   !      Pour le modèle fils, on spawne les flux du modèle père
+   ! Heat eddy fluxes
+   IF ( LTH_FLX ) CALL EDDY_FLUX_ONE_WAY_n (IMI,KTCOUNT,NDXRATIO_ALL(IMI),NDYRATIO_ALL(IMI),CLBCX,CLBCY)
+   !
+   ! Momentum eddy fluxes
+   IF ( LUV_FLX ) CALL EDDYUV_FLUX_ONE_WAY_n (IMI,KTCOUNT,NDXRATIO_ALL(IMI),NDYRATIO_ALL(IMI),CLBCX,CLBCY)
+   !
+END IF
+!-----------------------------------------------------------------------------
+!
+!*        4.    PASSIVE POLLUTANTS
+!               ------------------
+!
+ZTIME1 = ZTIME2
+!
+IF (LPASPOL) CALL PASPOL(XTSTEP, ZSFSV, ILUOUT, NVERB, TPFILE)
+!
+!
+!*        4b.  PASSIVE POLLUTANTS FOR MASS-FLUX SCHEME DIAGNOSTICS
+!              ---------------------------------------------------
+!
+IF (LCONDSAMP) CALL CONDSAMP(XTSTEP, ZSFSV, ILUOUT, NVERB)
+!
+CALL SECOND_MNH2(ZTIME2)
+!
+PTRACER = PTRACER + ZTIME2 - ZTIME1
+!-----------------------------------------------------------------------------
+!
+!*        5a.    Drag force 
+!               ----------
+!
+ZTIME1 = ZTIME2
+XTIME_BU_PROCESS = 0.
+XTIME_LES_BU_PROCESS = 0.
+!
+IF (LDRAGTREE) CALL DRAG_VEG( XTSTEP, XUT, XVT, XTKET, LDEPOTREE, XVDEPOTREE, &
+                              CCLOUD, XPABST, XTHT, XRT, XSVT, XRHODJ, XZZ,   &
+                              XRUS, XRVS, XRTKES, XRRS, XRSVS )
+!
+IF (LDRAGBLDG) CALL DRAG_BLD( XTSTEP, XUT, XVT, XTKET, XRHODJ, XZZ, XRUS, XRVS, XRTKES )
+!
+CALL SECOND_MNH2(ZTIME2)
+!
+PDRAG = PDRAG + ZTIME2 - ZTIME1 &
+             - XTIME_LES_BU_PROCESS - XTIME_BU_PROCESS
+!
+PTIME_BU = PTIME_BU + XTIME_LES_BU_PROCESS + XTIME_BU_PROCESS
+!
+!*        5b.   Drag force from wind turbines 
+!               -----------------------
+!
+ZTIME1 = ZTIME2
+XTIME_BU_PROCESS = 0.
+XTIME_LES_BU_PROCESS = 0.
+!
+IF (LMAIN_EOL .AND. IMI == NMODEL_EOL) THEN
+ CALL EOL_MAIN(KTCOUNT,XTSTEP,     &
+               XDXX,XDYY,XDZZ,     &
+               XRHODJ,             &
+               XUT,XVT,XWT,        &
+               XRUS, XRVS, XRWS    )
+END IF
+!
+CALL SECOND_MNH2(ZTIME2)
+!
+PEOL = PEOL + ZTIME2 - ZTIME1 &
+             - XTIME_LES_BU_PROCESS - XTIME_BU_PROCESS
+!
+PTIME_BU = PTIME_BU + XTIME_LES_BU_PROCESS + XTIME_BU_PROCESS
+!
+!*        
+!-----------------------------------------------------------------------------
+!
+!*        6.    TURBULENCE SCHEME
+!               -----------------
+!
+ZTIME1 = ZTIME2
+XTIME_BU_PROCESS = 0.
+XTIME_LES_BU_PROCESS = 0.
+!
+ZSFTH(:,:)  = ZSFTH(:,:) * XDIRCOSZW(:,:)
+ZSFRV(:,:)  = ZSFRV(:,:) * XDIRCOSZW(:,:)
+DO JSV=1,NSV
+  ZSFSV(:,:,JSV)  = ZSFSV(:,:,JSV) * XDIRCOSZW(:,:)
+END DO
+!
+IF (LLES_CALL) CALL SWITCH_SBG_LES_n
+!
+!
+IF ( CTURB == 'TKEL' ) THEN
+!
+
+!*        6.1 complete surface flux fields on the border
+!
+!!$  IF(NHALO == 1) THEN
+    CALL ADD2DFIELD_ll( TZFIELDS_ll, ZSFTH, 'PHYS_PARAM_n::ZSFTH' )
+    CALL ADD2DFIELD_ll( TZFIELDS_ll, ZSFRV, 'PHYS_PARAM_n::ZSFRV' )
+    CALL ADD2DFIELD_ll( TZFIELDS_ll, ZSFU,  'PHYS_PARAM_n::ZSFU' )
+    CALL ADD2DFIELD_ll( TZFIELDS_ll, ZSFV,  'PHYS_PARAM_n::ZSFV' )
+    IF(NSV >0)THEN
+      DO JSV=1,NSV
+        write ( ynum, '( I6 ) ' ) jsv
+        CALL ADD2DFIELD_ll( TZFIELDS_ll, ZSFSV(:,:,JSV), 'PHYS_PARAM_n::ZSFSV:'//trim( adjustl( ynum ) ) )
+      END DO
+    END IF
+    CALL ADD2DFIELD_ll( TZFIELDS_ll, ZSFCO2, 'PHYS_PARAM_n::ZSFCO2' )
+    CALL UPDATE_HALO_ll(TZFIELDS_ll,IINFO_ll)
+    CALL CLEANLIST_ll(TZFIELDS_ll)
+!!$  END IF
+!
+  CALL MPPDB_CHECK2D(ZSFU,"phys_param::ZSFU",PRECISION)
+  !
+  IF ( CLBCX(1) /= "CYCL" .AND. LWEST_ll()) THEN
+    ZSFTH(IIB-1,:)=ZSFTH(IIB,:)
+    ZSFRV(IIB-1,:)=ZSFRV(IIB,:)
+    ZSFU(IIB-1,:)=ZSFU(IIB,:)
+    ZSFV(IIB-1,:)=ZSFV(IIB,:)
+    IF (NSV>0)  THEN
+      ZSFSV(IIB-1,:,:)=ZSFSV(IIB,:,:)
+      WHERE ((ZSFSV(IIB-1,:,:).LT.0.).AND.(XSVT(IIB-1,:,IKB,:).EQ.0.))
+          ZSFSV(IIB-1,:,:) = 0.
+      END WHERE
+    ENDIF
+    ZSFCO2(IIB-1,:)=ZSFCO2(IIB,:)
+  END IF
+  !
+  IF ( CLBCX(2) /= "CYCL" .AND. LEAST_ll()) THEN
+    ZSFTH(IIE+1,:)=ZSFTH(IIE,:)
+    ZSFRV(IIE+1,:)=ZSFRV(IIE,:)
+    ZSFU(IIE+1,:)=ZSFU(IIE,:)
+    ZSFV(IIE+1,:)=ZSFV(IIE,:)
+    IF (NSV>0) THEN
+      ZSFSV(IIE+1,:,:)=ZSFSV(IIE,:,:)
+      WHERE ((ZSFSV(IIE+1,:,:).LT.0.).AND.(XSVT(IIE+1,:,IKB,:).EQ.0.))
+          ZSFSV(IIE+1,:,:) = 0.
+      END WHERE
+    ENDIF
+    ZSFCO2(IIE+1,:)=ZSFCO2(IIE,:)
+  END IF
+  !
+  IF ( CLBCY(1) /= "CYCL" .AND. LSOUTH_ll()) THEN
+    ZSFTH(:,IJB-1)=ZSFTH(:,IJB)
+    ZSFRV(:,IJB-1)=ZSFRV(:,IJB)
+    ZSFU(:,IJB-1)=ZSFU(:,IJB)
+    ZSFV(:,IJB-1)=ZSFV(:,IJB)
+    IF (NSV>0) THEN
+      ZSFSV(:,IJB-1,:)=ZSFSV(:,IJB,:)
+      WHERE ((ZSFSV(:,IJB-1,:).LT.0.).AND.(XSVT(:,IJB-1,IKB,:).EQ.0.))
+          ZSFSV(:,IJB-1,:) = 0.
+      END WHERE
+    ENDIF
+    ZSFCO2(:,IJB-1)=ZSFCO2(:,IJB)
+  END IF
+  !
+  IF ( CLBCY(2) /= "CYCL" .AND. LNORTH_ll()) THEN
+    ZSFTH(:,IJE+1)=ZSFTH(:,IJE)
+    ZSFRV(:,IJE+1)=ZSFRV(:,IJE)
+    ZSFU(:,IJE+1)=ZSFU(:,IJE)
+    ZSFV(:,IJE+1)=ZSFV(:,IJE)
+    IF (NSV>0) THEN
+      ZSFSV(:,IJE+1,:)=ZSFSV(:,IJE,:)
+      WHERE ((ZSFSV(:,IJE+1,:).LT.0.).AND.(XSVT(:,IJE+1,IKB,:).EQ.0.))
+          ZSFSV(:,IJE+1,:) = 0.
+      END WHERE
+    ENDIF
+    ZSFCO2(:,IJE+1)=ZSFCO2(:,IJE)
+  END IF
+!
+  IF( LTRANS ) THEN
+    XUT(:,:,:) = XUT(:,:,:) + XUTRANS
+    XVT(:,:,:) = XVT(:,:,:) + XVTRANS
+  END IF
+!
+!
+IF(ALLOCATED(XTHW_FLUX))  THEN
+ DEALLOCATE(XTHW_FLUX)
+ ALLOCATE(XTHW_FLUX(SIZE(XTHT,1),SIZE(XTHT,2),SIZE(XTHT,3)))
+ELSE
+ ALLOCATE(XTHW_FLUX(SIZE(XTHT,1),SIZE(XTHT,2),SIZE(XTHT,3)))
+END IF
+
+IF(ALLOCATED(XRCW_FLUX))  THEN
+ DEALLOCATE(XRCW_FLUX)
+ ALLOCATE(XRCW_FLUX(SIZE(XTHT,1),SIZE(XTHT,2),SIZE(XTHT,3)))
+ELSE
+ ALLOCATE(XRCW_FLUX(SIZE(XTHT,1),SIZE(XTHT,2),SIZE(XTHT,3)))
+END IF
+!
+IF(ALLOCATED(XSVW_FLUX))  THEN
+ DEALLOCATE(XSVW_FLUX)
+ ALLOCATE(XSVW_FLUX(SIZE(XSVT,1),SIZE(XSVT,2),SIZE(XSVT,3),SIZE(XSVT,4)))
+ELSE
+ ALLOCATE(XSVW_FLUX(SIZE(XSVT,1),SIZE(XSVT,2),SIZE(XSVT,3),SIZE(XSVT,4)))
+END IF
+!
+   CALL TURB( 1, IKU, 1, IMI, NRR, NRRL, NRRI, CLBCX, CLBCY, 1, NMODEL_CLOUD,        &
+              LTURB_FLX, LTURB_DIAG, LSUBG_COND, LRMC01,                             &
+              CTURBDIM, CTURBLEN, CTOM, CTURBLEN_CLOUD, CCLOUD,XIMPL,                &
+              XTSTEP, TPFILE,                                                        &
+              XDXX, XDYY, XDZZ, XDZX, XDZY, XZZ,                                     &
+              XDIRCOSXW, XDIRCOSYW, XDIRCOSZW, XCOSSLOPE, XSINSLOPE,                 &
+              XRHODJ, XTHVREF,                                                       &
+              ZSFTH, ZSFRV, ZSFSV, ZSFU, ZSFV,                                       &
+              XPABST, XUT, XVT, XWT, XTKET, XSVT, XSRCT, XBL_DEPTH, XSBL_DEPTH,      &
+              XCEI, XCEI_MIN, XCEI_MAX, XCOEF_AMPL_SAT,                              &
+              XTHT, XRT,                                                             &
+              XRUS, XRVS, XRWS, XRTHS, XRRS, XRSVS, XRTKES, XRTKEMS, XSIGS, XWTHVMF, &
+              XTHW_FLUX, XRCW_FLUX, XSVW_FLUX,XDYP, XTHP, XTR, XDISS, XLEM           )
+!
+IF (LRMC01) THEN
+  CALL ADD2DFIELD_ll( TZFIELDS_ll, XSBL_DEPTH, 'PHYS_PARAM_n::XSBL_DEPTH' )
+  CALL UPDATE_HALO_ll(TZFIELDS_ll,IINFO_ll)
+  CALL CLEANLIST_ll(TZFIELDS_ll)
+  IF ( CLBCX(1) /= "CYCL" .AND. LWEST_ll()) THEN
+    XSBL_DEPTH(IIB-1,:)=XSBL_DEPTH(IIB,:)
+  END IF
+  IF ( CLBCX(2) /= "CYCL" .AND. LEAST_ll()) THEN
+    XSBL_DEPTH(IIE+1,:)=XSBL_DEPTH(IIE,:)
+  END IF
+  IF ( CLBCY(1) /= "CYCL" .AND. LSOUTH_ll()) THEN
+    XSBL_DEPTH(:,IJB-1)=XSBL_DEPTH(:,IJB)
+  END IF
+  IF ( CLBCY(2) /= "CYCL" .AND. LNORTH_ll()) THEN
+    XSBL_DEPTH(:,IJE+1)=XSBL_DEPTH(:,IJE)
+  END IF
+END IF
+!
+CALL SECOND_MNH2(ZTIME3)
+!
+!-----------------------------------------------------------------------------
+!
+!*        7.    EDMF SCHEME
+!               -----------
+!
+IF (CSCONV == 'EDKF') THEN
+     ALLOCATE(ZEXN (IIU,IJU,IKU))
+     ALLOCATE(ZSIGMF (IIU,IJU,IKU))
+     ZSIGMF(:,:,:)=0.    
+     ZEXN(:,:,:)=(XPABST(:,:,:)/XP00)**(XRD/XCPD)  
+     !$20131113 check3d on ZEXN
+     CALL MPPDB_CHECK3D(ZEXN,"physparan.7::ZEXN",PRECISION)
+     CALL ADD3DFIELD_ll( TZFIELDS_ll, ZEXN, 'PHYS_PARAM_n::ZEXN' )
+     !$20131113 add update_halo_ll
+     CALL UPDATE_HALO_ll(TZFIELDS_ll,IINFO_ll)
+     CALL CLEANLIST_ll(TZFIELDS_ll)
+     CALL MPPDB_CHECK3D(ZEXN,"physparam.7::ZEXN",PRECISION)
+ !    
+     CALL SHALLOW_MF_PACK(NRR,NRRL,NRRI, CMF_UPDRAFT, CMF_CLOUD, LMIXUV,  &
+                   LMF_FLX,TPFILE,ZTIME_LES_MF,                           &
+                   XIMPL_MF, XTSTEP,                                      &
+                   XDZZ, XZZ,                                             &
+                   XRHODJ, XRHODREF, XPABST, ZEXN, ZSFTH, ZSFRV,          &
+                   XTHT,XRT,XUT,XVT,XWT,XTKET,XSVT,                       &
+                   XRTHS,XRRS,XRUS,XRVS,XRSVS,                            &
+                   ZSIGMF,XRC_MF, XRI_MF, XCF_MF, XWTHVMF)
+!
+ELSE
+    XWTHVMF(:,:,:)=0.
+    XRC_MF(:,:,:)=0.
+    XRI_MF(:,:,:)=0.
+    XCF_MF(:,:,:)=0.
+ENDIF   
+!
+CALL SECOND_MNH2(ZTIME4)
+
+  IF( LTRANS ) THEN
+    XUT(:,:,:) = XUT(:,:,:) - XUTRANS
+    XVT(:,:,:) = XVT(:,:,:) - XVTRANS
+  END IF
+
+  IF (CMF_CLOUD == 'STAT') THEN
+    XSIGS =SQRT( XSIGS**2 + ZSIGMF**2 )
+  ENDIF
+  IF (CSCONV == 'EDKF') THEN
+    DEALLOCATE(ZSIGMF)
+    DEALLOCATE(ZEXN)
+  ENDIF
+END IF
+!
+IF (LLES_CALL) CALL SWITCH_SBG_LES_n
+!
+CALL SECOND_MNH2(ZTIME2)
+!
+PTURB = PTURB + ZTIME2 - ZTIME1 - (XTIME_LES-ZTIME_LES_MF) - XTIME_LES_BU_PROCESS &
+      - XTIME_BU_PROCESS - (ZTIME4 - ZTIME3)
+!
+PMAFL = PMAFL + ZTIME4 - ZTIME3 - ZTIME_LES_MF
+!
+PTIME_BU = PTIME_BU + XTIME_LES_BU_PROCESS + XTIME_BU_PROCESS
+!
+!
+!* deallocate sf flux array for ocean model (in grid nesting, dimensions can vary)
+!
+IF (LOCEAN .AND. (.NOT. LCOUPLES)) THEN
+  DEALLOCATE(XSSUFL)
+  DEALLOCATE(XSSVFL)
+  DEALLOCATE(XSSTFL)
+  DEALLOCATE(XSSOLA)
+END IF
+!-------------------------------------------------------------------------------
+!
+!* deallocation of variables used in more than one parameterization
+!
+DEALLOCATE(ZSFU  )         ! surface schemes + turbulence
+DEALLOCATE(ZSFV  )
+DEALLOCATE(ZSFTH )
+DEALLOCATE(ZSFRV )
+DEALLOCATE(ZSFSV )
+DEALLOCATE(ZSFCO2)
+!
+!-------------------------------------------------------------------------------
+!
+END SUBROUTINE PHYS_PARAM_n
+
-- 
GitLab