diff --git a/src/PHYEX/aux/gamma.f90 b/src/PHYEX/aux/gamma.f90
new file mode 100644
index 0000000000000000000000000000000000000000..6e3b9dd0916d63dfeece78666a25eb175d0d8bad
--- /dev/null
+++ b/src/PHYEX/aux/gamma.f90
@@ -0,0 +1,225 @@
+!MNH_LIC Copyright 1994-2014 CNRS, Meteo-France and Universite Paul Sabatier
+!MNH_LIC This is part of the Meso-NH software governed by the CeCILL-C licence
+!MNH_LIC version 1. See LICENSE, CeCILL-C_V1-en.txt and CeCILL-C_V1-fr.txt  
+!MNH_LIC for details. version 1.
+!########################
+!
+!--------------------------------------------------------------------------
+!
+!
+!*       1.   FUNCTION GAMMA FOR SCALAR VARIABLE
+! 
+!
+!     ######################################
+      FUNCTION GAMMA_X0D(PX)  RESULT(PGAMMA)
+      USE YOMHOOK , ONLY : LHOOK, DR_HOOK, JPHOOK
+!     ######################################
+!
+!
+!!****  *GAMMA * -  Gamma  function
+!!
+!!
+!!    PURPOSE
+!!    -------
+!       The purpose of this function is to compute the Generalized gamma
+!    function of its argument.
+!
+!
+!!**  METHOD
+!!    ------
+!!
+!!    EXTERNAL
+!!    --------
+!!      NONE
+!!
+!!    IMPLICIT ARGUMENTS
+!!    ------------------
+!!      None
+!!
+!!    REFERENCE
+!!    ---------
+!!      Press, Teukolsky, Vetterling and Flannery: Numerical Recipes, 206-207
+!!
+!!    AUTHOR
+!!    ------
+!!      Jean-Pierre Pinty *LA/OMP*
+!!
+!!    MODIFICATIONS
+!!    -------------
+!!      Original     7/11/95
+!!      C. Barthe    9/11/09  add a function for 1D arguments
+!
+!*       0. DECLARATIONS
+!           ------------
+!
+IMPLICIT NONE
+!
+!*       0.1 declarations of arguments and result
+!
+REAL, INTENT(IN)                     :: PX
+REAL                                 :: PGAMMA
+!
+!*       0.2 declarations of local variables
+!
+INTEGER                              :: JJ ! Loop index
+REAL                                 :: ZSER,ZSTP,ZTMP,ZX,ZY,ZCOEF(6)
+REAL                                 :: ZPI
+!
+REAL(KIND=JPHOOK) :: ZHOOK_HANDLE
+IF (LHOOK) CALL DR_HOOK('GAMMA_X0D',0,ZHOOK_HANDLE)
+!-------------------------------------------------------------------------------
+!
+!*       1. SOME CONSTANTS
+!           --------------
+!
+ZCOEF(1) = 76.18009172947146
+ZCOEF(2) =-86.50532032941677
+ZCOEF(3) = 24.01409824083091
+ZCOEF(4) = -1.231739572450155
+ZCOEF(5) =  0.1208650973866179E-2
+ZCOEF(6) = -0.5395239384953E-5
+ZSTP     =  2.5066282746310005
+!
+ZPI = 3.141592654
+!
+!-------------------------------------------------------------------------------
+!
+!*       2. COMPUTE GAMMA
+!           -------------
+!
+IF (PX .LT. 0.) THEN
+  ZX = 1. - PX
+ELSE 
+  ZX = PX
+END IF
+ZY = ZX
+ZTMP =  ZX + 5.5
+ZTMP = (ZX + 0.5) * ALOG(ZTMP) - ZTMP
+ZSER = 1.000000000190015
+!
+DO JJ = 1, 6
+  ZY = ZY + 1.0
+  ZSER = ZSER + ZCOEF(JJ) / ZY
+END DO
+!
+IF (PX .LT. 0.) THEN
+  PGAMMA = ZPI / SIN(ZPI*PX) / EXP(ZTMP + ALOG(ZSTP*ZSER/ZX))
+ELSE
+  PGAMMA = EXP(ZTMP + ALOG(ZSTP*ZSER/ZX))
+END IF
+IF (LHOOK) CALL DR_HOOK('GAMMA_X0D',1,ZHOOK_HANDLE)
+RETURN
+!
+END FUNCTION GAMMA_X0D
+!
+!-------------------------------------------------------------------------------
+!
+!
+!*       1.   FUNCTION GAMMA FOR 1D ARRAY
+! 
+!
+!     ######################################
+      FUNCTION GAMMA_X1D(PX)  RESULT(PGAMMA)
+      USE YOMHOOK , ONLY : LHOOK, DR_HOOK, JPHOOK
+!     ######################################
+!
+!
+!!****  *GAMMA * -  Gamma  function
+!!
+!!
+!!    PURPOSE
+!!    -------
+!       The purpose of this function is to compute the Generalized gamma
+!    function of its argument.
+!
+!
+!!**  METHOD
+!!    ------
+!!
+!!    EXTERNAL
+!!    --------
+!!      NONE
+!!
+!!    IMPLICIT ARGUMENTS
+!!    ------------------
+!!      None
+!!
+!!    REFERENCE
+!!    ---------
+!!      Press, Teukolsky, Vetterling and Flannery: Numerical Recipes, 206-207
+!!
+!!    AUTHOR
+!!    ------
+!!      Jean-Pierre Pinty *LA/OMP*
+!!
+!!    MODIFICATIONS
+!!    -------------
+!!      Original     7/11/95
+!!
+!-------------------------------------------------------------------------------
+!
+!*       0. DECLARATIONS
+!           ------------
+!
+IMPLICIT NONE
+!
+!*       0.1 declarations of arguments and result
+!
+REAL, DIMENSION(:), INTENT(IN)       :: PX
+REAL, DIMENSION(SIZE(PX))            :: PGAMMA
+!
+!*       0.2 declarations of local variables
+!
+INTEGER                              :: JJ ! Loop index
+INTEGER                              :: JI ! Loop index
+REAL                                 :: ZSER, ZSTP, ZTMP, ZX, ZY, ZCOEF(6)
+REAL                                 :: ZPI
+!
+REAL(KIND=JPHOOK) :: ZHOOK_HANDLE
+IF (LHOOK) CALL DR_HOOK('GAMMA_X1D',0,ZHOOK_HANDLE)
+!-------------------------------------------------------------------------------
+!
+!*       1. SOME CONSTANTS
+!           --------------
+!
+ZCOEF(1) = 76.18009172947146
+ZCOEF(2) =-86.50532032941677
+ZCOEF(3) = 24.01409824083091
+ZCOEF(4) = -1.231739572450155
+ZCOEF(5) =  0.1208650973866179E-2
+ZCOEF(6) = -0.5395239384953E-5
+ZSTP     =  2.5066282746310005
+!
+ZPI = 3.141592654
+!
+!-------------------------------------------------------------------------------
+!
+!*       2. COMPUTE GAMMA
+!           -------------
+!  
+DO JI = 1, SIZE(PX)
+  IF (PX(JI) .LT. 0.) THEN
+    ZX = 1. - PX(JI)
+  ELSE 
+    ZX = PX(JI)
+  END IF
+  ZY = ZX
+  ZTMP =  ZX + 5.5
+  ZTMP = (ZX + 0.5) * ALOG(ZTMP) - ZTMP
+  ZSER = 1.000000000190015
+!
+  DO JJ = 1, 6
+    ZY = ZY + 1.0
+    ZSER = ZSER + ZCOEF(JJ) / ZY
+  END DO
+!
+  IF (PX(JI) .LT. 0.) THEN
+    PGAMMA = ZPI / SIN(ZPI*PX(JI)) / EXP(ZTMP + ALOG(ZSTP*ZSER/ZX))
+  ELSE
+    PGAMMA = EXP(ZTMP + ALOG(ZSTP*ZSER/ZX))
+  END IF
+END DO
+IF (LHOOK) CALL DR_HOOK('GAMMA_X1D',1,ZHOOK_HANDLE)
+RETURN
+!
+END FUNCTION GAMMA_X1D
diff --git a/src/PHYEX/aux/gamma_inc.f90 b/src/PHYEX/aux/gamma_inc.f90
new file mode 100644
index 0000000000000000000000000000000000000000..cff80e38169f0c45f7e0c18ece4a4ced3949fccc
--- /dev/null
+++ b/src/PHYEX/aux/gamma_inc.f90
@@ -0,0 +1,137 @@
+!MNH_LIC Copyright 1995-2019 CNRS, Meteo-France and Universite Paul Sabatier
+!MNH_LIC This is part of the Meso-NH software governed by the CeCILL-C licence
+!MNH_LIC version 1. See LICENSE, CeCILL-C_V1-en.txt and CeCILL-C_V1-fr.txt
+!MNH_LIC for details. version 1.
+      FUNCTION GAMMA_INC(PA,PX)  RESULT(PGAMMA_INC)
+      USE YOMHOOK , ONLY : LHOOK, DR_HOOK, JPHOOK
+!     #############################################
+!
+!
+!!****  *GAMMA_INC * -  Generalized gamma  function
+!!
+!!
+!!    PURPOSE
+!!    -------
+!       The purpose of this function is to compute the generalized
+!!   incomplete Gamma function of its argument.
+!!
+!!                             /X
+!!                       1     |
+!!    GAMMA_INC(A,X)= -------- | Z**(A-1) EXP(-Z) dZ
+!!                    GAMMA(A) |
+!!                             /0
+!!
+!!**  METHOD
+!!    ------
+!!
+!!    EXTERNAL
+!!    --------
+!!      NONE
+!!
+!!    IMPLICIT ARGUMENTS
+!!    ------------------
+!!      MODULE MODI_GAMMA : computation of the Gamma function
+!!
+!!    REFERENCE
+!!    ---------
+!!      Press, Teukolsky, Vetterling and Flannery: Numerical Recipes, 209-213
+!!
+!!
+!!    AUTHOR
+!!    ------
+!!     Jean-Pierre Pinty *LA/OMP*
+!!
+!!    MODIFICATIONS
+!!    -------------
+!!      Original     7/12/95
+!  P. Wautelet 10/04/2019: replace ABORT and STOP calls by Print_msg
+!  P. Wautelet 26/04/2019: replace non-standard FLOAT function by REAL function
+!
+!*       0. DECLARATIONS
+!           ------------
+!
+USE MODE_MSG
+!
+USE MODI_GAMMA
+!
+IMPLICIT NONE
+!
+!*       0.1 declarations of arguments and result
+!
+REAL, INTENT(IN)                     :: PA
+REAL, INTENT(IN)                     :: PX
+REAL                                 :: PGAMMA_INC
+!
+!*       0.2 declarations of local variables
+!
+INTEGER                              :: JN
+INTEGER                              :: ITMAX=100
+REAL                                 :: ZEPS=3.E-7
+REAL                                 :: ZFPMIN=1.E-30
+REAL                                 :: ZAP,ZDEL,ZSUM
+REAL                                 :: ZAN,ZB,ZC,ZD,ZH
+!
+REAL(KIND=JPHOOK) :: ZHOOK_HANDLE
+IF (LHOOK) CALL DR_HOOK('GAMMA_INC',0,ZHOOK_HANDLE)
+IF(PX<0.0 .OR. PA<=0.0) THEN
+  CALL PRINT_MSG(NVERB_FATAL, 'GEN', 'GAMMA_INC', 'invalid arguments: PX<0.0 .OR. PA<=0.0')
+END IF
+!
+IF( (PX.LT.PA+1.0) ) THEN
+  ZAP = PA
+  ZSUM = 1.0/PA
+  ZDEL = ZSUM
+  JN = 1
+!
+  LOOP_SERIES: DO
+    ZAP = ZAP +1.0
+    ZDEL = ZDEL*PX/ZAP
+    ZSUM = ZSUM + ZDEL
+    IF( ABS(ZDEL).LT.ABS(ZSUM)*ZEPS ) EXIT LOOP_SERIES
+    JN = JN + 1
+    IF( JN.GT.ITMAX ) THEN
+      CALL PRINT_MSG(NVERB_FATAL, 'GEN', 'GAMMA_INC', 'PA argument is too large or ITMAX is too small,'// &
+                     ' the incomplete GAMMA_INC function cannot be evaluated correctly'// &
+                     ' by the series method')
+    END IF
+  END DO LOOP_SERIES
+  PGAMMA_INC = ZSUM * EXP( -PX+PA*ALOG(PX)-ALOG(GAMMA(PA)) )
+!
+  ELSE
+!
+  ZB = PX + 1.0 - PA
+  ZC = 1.0/TINY(PX)
+  ZD = 1.0/ZB
+  ZH = ZD
+  JN = 1
+!
+  LOOP_FRACTION: DO
+    ZAN = -REAL(JN)*(REAL(JN)-PA)
+    ZB = ZB + 2.0
+    ZD = ZAN*ZD + ZB
+    IF( ABS(ZD).LT.TINY(PX) ) THEN
+      ZD = ZFPMIN
+    END IF
+    ZC = ZB + ZAN/ZC
+    IF( ABS(ZC).LT.TINY(PX) ) THEN
+      ZC = ZFPMIN
+    END IF
+    ZD = 1.0/ZD
+    ZDEL = ZD*ZC
+    ZH = ZH*ZDEL
+    IF( ABS(ZDEL-1.0).LT.ZEPS ) EXIT LOOP_FRACTION
+    JN = JN + 1
+    IF( JN.GT.ITMAX ) THEN
+      CALL PRINT_MSG(NVERB_FATAL, 'GEN', 'GAMMA_INC', 'PA argument is too large or ITMAX is too small,'// &
+                     ' the incomplete GAMMA_INC function cannot be evaluated correctly'// &
+                     ' by the continuous fraction method')
+    END IF
+  END DO LOOP_FRACTION
+  PGAMMA_INC = 1.0 - ZH*EXP( -PX+PA*ALOG(PX)-ALOG(GAMMA(PA)) )
+!
+END IF
+!
+IF (LHOOK) CALL DR_HOOK('GAMMA_INC',1,ZHOOK_HANDLE)
+RETURN
+!
+END FUNCTION GAMMA_INC
diff --git a/src/PHYEX/aux/general_gamma.f90 b/src/PHYEX/aux/general_gamma.f90
new file mode 100644
index 0000000000000000000000000000000000000000..c86a5fc1f3bd6a60f8c2b10af7f735aa6f0e3108
--- /dev/null
+++ b/src/PHYEX/aux/general_gamma.f90
@@ -0,0 +1,71 @@
+!MNH_LIC Copyright 1994-2014 CNRS, Meteo-France and Universite Paul Sabatier
+!MNH_LIC This is part of the Meso-NH software governed by the CeCILL-C licence
+!MNH_LIC version 1. See LICENSE, CeCILL-C_V1-en.txt and CeCILL-C_V1-fr.txt  
+!MNH_LIC for details. version 1.
+      FUNCTION GENERAL_GAMMA(PALPHA,PNU,PLBDA,PX)  RESULT(PGENERAL_GAMMA)
+      USE YOMHOOK , ONLY : LHOOK, DR_HOOK, JPHOOK
+!     ###################################################################
+!
+!
+!!****  *GENERAL_GAMMA * -  Generalized gamma  function
+!!
+!!
+!!    PURPOSE
+!!    -------
+!       The purpose of this function is to compute the Generalized gamma
+!    function of its argument.
+!
+!
+!!**  METHOD
+!!    ------
+!!
+!!    EXTERNAL
+!!    --------
+!!      NONE
+!!
+!!    IMPLICIT ARGUMENTS
+!!    ------------------
+!!      MODULE MODI_GAMMA : computation of the Gamma function
+!!
+!!    REFERENCE
+!!    ---------
+!!      Book2 of documentation (routine CONDENS)
+!!
+!!
+!!    AUTHOR
+!!    ------
+!!      Jean-Pierre Pinty *LA/OMP*
+!!
+!!    MODIFICATIONS
+!!    -------------
+!!      Original     7/11/95
+!
+!*       0. DECLARATIONS
+!           ------------
+!
+USE MODI_GAMMA
+!
+IMPLICIT NONE
+!
+!*       0.1 declarations of arguments and result
+!
+REAL, INTENT(IN)                     :: PALPHA
+REAL, INTENT(IN)                     :: PNU
+REAL, INTENT(IN)                     :: PLBDA
+REAL, INTENT(IN)                     :: PX
+REAL                                 :: PGENERAL_GAMMA
+!
+!*       0.2 declarations of local variables
+!
+REAL                                 :: ZARG,ZPOWER
+!
+REAL(KIND=JPHOOK) :: ZHOOK_HANDLE
+IF (LHOOK) CALL DR_HOOK('GENERAL_GAMMA',0,ZHOOK_HANDLE)
+ZARG   = PLBDA*PX
+ZPOWER = PALPHA*PNU - 1.0
+!
+PGENERAL_GAMMA = (PALPHA/GAMMA(PNU))*(ZARG**ZPOWER)*PLBDA*EXP(-(ZARG**PALPHA))
+IF (LHOOK) CALL DR_HOOK('GENERAL_GAMMA',1,ZHOOK_HANDLE)
+RETURN
+!
+END FUNCTION GENERAL_GAMMA
diff --git a/src/PHYEX/aux/get_halo.f90 b/src/PHYEX/aux/get_halo.f90
new file mode 100644
index 0000000000000000000000000000000000000000..21f55183e5e1c9b6cce33e60321fba4bfb72ab84
--- /dev/null
+++ b/src/PHYEX/aux/get_halo.f90
@@ -0,0 +1,203 @@
+!MNH_LIC Copyright 1994-2019 CNRS, Meteo-France and Universite Paul Sabatier
+!MNH_LIC This is part of the Meso-NH software governed by the CeCILL-C licence
+!MNH_LIC version 1. See LICENSE, CeCILL-C_V1-en.txt and CeCILL-C_V1-fr.txt
+!MNH_LIC for details. version 1.
+!-----------------------------------------------------------------
+! Modifications:
+!  P. Wautelet 20/05/2019: add name argument to ADDnFIELD_ll + new ADD4DFIELD_ll subroutine
+!-----------------------------------------------------------------
+!     ####################
+      MODULE MODI_GET_HALO
+!     ####################
+!
+IMPLICIT NONE
+INTERFACE
+!
+SUBROUTINE GET_HALO2(PSRC,TP_PSRC_HALO2_ll)
+!
+USE MODD_ARGSLIST_ll, ONLY : HALO2LIST_ll
+IMPLICIT NONE
+REAL, DIMENSION(:,:,:), INTENT(IN)  :: PSRC    ! variable at t
+TYPE(HALO2LIST_ll), POINTER, INTENT(INOUT)         :: TP_PSRC_HALO2_ll          ! halo2 for SRC
+!
+END SUBROUTINE GET_HALO2
+!
+SUBROUTINE GET_HALO(PSRC)
+!
+IMPLICIT NONE
+REAL, DIMENSION(:,:,:), INTENT(IN)  :: PSRC    ! variable at t
+!
+END SUBROUTINE GET_HALO
+!
+SUBROUTINE GET_HALO_PHY(D,PSRC)
+USE MODD_DIMPHYEX, ONLY: DIMPHYEX_t
+IMPLICIT NONE
+!
+TYPE(DIMPHYEX_t),        INTENT(IN)   :: D
+REAL, DIMENSION(D%NIT,D%NJT,D%NKT), INTENT(IN)  :: PSRC    ! variable at t
+!
+END SUBROUTINE GET_HALO_PHY
+!
+SUBROUTINE DEL_HALO2_ll(TPHALO2LIST)
+!
+USE MODD_ARGSLIST_ll, ONLY : HALO2LIST_ll
+IMPLICIT NONE
+TYPE(HALO2LIST_ll), POINTER, INTENT(INOUT) :: TPHALO2LIST ! list of HALO2_lls
+!
+END SUBROUTINE DEL_HALO2_ll
+!
+END INTERFACE
+!
+END MODULE MODI_GET_HALO         
+!
+!     ###########################################
+      SUBROUTINE GET_HALO2(PSRC,TP_PSRC_HALO2_ll)
+!     ###########################################
+!
+USE MODE_ll
+USE MODD_ARGSLIST_ll, ONLY : LIST_ll, HALO2LIST_ll
+!
+IMPLICIT NONE
+!
+REAL, DIMENSION(:,:,:), INTENT(IN)  :: PSRC    ! variable at t
+TYPE(HALO2LIST_ll), POINTER, INTENT(INOUT)         :: TP_PSRC_HALO2_ll          ! halo2 for SRC
+!
+INTEGER                          :: IIU,IJU,IKU            ! domain sizes
+TYPE(LIST_ll)     , POINTER      :: TZ_PSRC_ll               ! halo
+INTEGER                          :: IERROR                 ! error return code 
+!
+IIU = SIZE(PSRC,1)
+IJU = SIZE(PSRC,2)
+IKU = SIZE(PSRC,3)
+!
+NULLIFY( TZ_PSRC_ll,TP_PSRC_HALO2_ll)
+CALL INIT_HALO2_ll(TP_PSRC_HALO2_ll,1,IIU,IJU,IKU)
+!
+CALL ADD3DFIELD_ll( TZ_PSRC_ll, PSRC, 'GET_HALO2::PSRC' )
+CALL UPDATE_HALO_ll(TZ_PSRC_ll,IERROR)
+CALL UPDATE_HALO2_ll(TZ_PSRC_ll,TP_PSRC_HALO2_ll,IERROR)
+!
+!   clean local halo list
+!
+CALL CLEANLIST_ll(TZ_PSRC_ll)
+!
+END SUBROUTINE GET_HALO2
+!-------------------------------------------------------------------------------
+!-------------------------------------------------------------------------------
+!     #########################
+      SUBROUTINE GET_HALO(PSRC)
+!     #########################
+!
+USE MODE_ll
+USE MODD_ARGSLIST_ll, ONLY : LIST_ll
+!
+IMPLICIT NONE
+!
+REAL, DIMENSION(:,:,:), INTENT(IN)  :: PSRC    ! variable at t
+!
+TYPE(LIST_ll)     , POINTER      :: TZ_PSRC_ll               ! halo
+INTEGER                          :: IERROR                 ! error return code 
+!
+NULLIFY( TZ_PSRC_ll)
+!
+CALL ADD3DFIELD_ll( TZ_PSRC_ll, PSRC, 'GET_HALO::PSRC' )
+CALL UPDATE_HALO_ll(TZ_PSRC_ll,IERROR)
+CALL CLEANLIST_ll(TZ_PSRC_ll)
+!
+END SUBROUTINE GET_HALO
+!-------------------------------------------------------------------------------
+!-------------------------------------------------------------------------------
+!     #########################
+      SUBROUTINE GET_HALO_PHY(D,PSRC)
+!     #########################
+!
+USE MODD_DIMPHYEX, ONLY: DIMPHYEX_t
+USE MODE_ll
+USE MODD_ARGSLIST_ll, ONLY : LIST_ll
+!
+IMPLICIT NONE
+!
+TYPE(DIMPHYEX_t),        INTENT(IN)   :: D
+REAL, DIMENSION(D%NIT,D%NJT,D%NKT), INTENT(IN)  :: PSRC    ! variable at t
+!
+TYPE(LIST_ll)     , POINTER      :: TZ_PSRC_ll               ! halo
+INTEGER                          :: IERROR                 ! error return code 
+!
+NULLIFY( TZ_PSRC_ll)
+!
+CALL ADD3DFIELD_ll( TZ_PSRC_ll, PSRC, 'GET_HALO::PSRC' )
+CALL UPDATE_HALO_ll(TZ_PSRC_ll,IERROR)
+CALL CLEANLIST_ll(TZ_PSRC_ll)
+!
+END SUBROUTINE GET_HALO_PHY
+!-----------------------------------------------------------------------
+!
+!     ####################################
+      SUBROUTINE DEL_HALO2_ll(TPHALO2LIST)
+!     ####################################
+!
+!!****  *DEL_HALO2_ll* delete the second layer of the halo
+!!
+!!
+!!    Purpose
+!!    -------
+!       The purpose of this routine is to deallocate the 
+!     TPHALO2LIST variable which contains the second layer of the
+!     halo for each variable.
+! 
+!!    Implicit Arguments
+!!    ------------------
+!     Module MODD_ARGSLIST_ll
+!       type HALO2LIST_ll
+!!
+!!    Reference
+!!    ---------
+! 
+!!    Author
+!!    ------
+!     J. Escobar                 * LA - CNRS *
+!
+!     Modification :
+!     -------------
+!     Juan  11/03/2010 : Memory Leak add DEALLOCATE(TZHALO2LIST%HALO2)     
+! 
+!-------------------------------------------------------------------------------
+!
+!*       0.    DECLARATIONS
+!              ------------
+!
+  USE MODD_ARGSLIST_ll, ONLY : HALO2LIST_ll
+!
+  IMPLICIT NONE
+!
+!*       0.1   Declarations of dummy arguments :
+!
+  TYPE(HALO2LIST_ll), POINTER, INTENT(INOUT) :: TPHALO2LIST ! list of HALO2_lls
+!
+!
+!*       0.2   Declarations of local variables :
+!
+  TYPE(HALO2LIST_ll), POINTER :: TZHALO2LIST
+!
+!-------------------------------------------------------------------------------
+!
+!*       1.    Deallocate the list of HALO2_lls
+!
+  TZHALO2LIST => TPHALO2LIST
+!
+  DO WHILE(ASSOCIATED(TZHALO2LIST))
+!
+    TPHALO2LIST => TZHALO2LIST%NEXT
+    DEALLOCATE(TZHALO2LIST%HALO2%WEST)
+    DEALLOCATE(TZHALO2LIST%HALO2%EAST)
+    DEALLOCATE(TZHALO2LIST%HALO2%SOUTH)
+    DEALLOCATE(TZHALO2LIST%HALO2%NORTH)
+    DEALLOCATE(TZHALO2LIST%HALO2)
+    DEALLOCATE(TZHALO2LIST)
+    TZHALO2LIST => TPHALO2LIST
+!
+  ENDDO
+!
+!-------------------------------------------------------------------------------
+!
+      END SUBROUTINE DEL_HALO2_ll
diff --git a/src/PHYEX/aux/gradient_m.f90 b/src/PHYEX/aux/gradient_m.f90
new file mode 100644
index 0000000000000000000000000000000000000000..6a9d2f033c5813a4f6469abc75af2af4b070701b
--- /dev/null
+++ b/src/PHYEX/aux/gradient_m.f90
@@ -0,0 +1,758 @@
+!MNH_LIC Copyright 1994-2020 CNRS, Meteo-France and Universite Paul Sabatier
+!MNH_LIC This is part of the Meso-NH software governed by the CeCILL-C licence
+!MNH_LIC version 1. See LICENSE, CeCILL-C_V1-en.txt and CeCILL-C_V1-fr.txt
+!MNH_LIC for details. version 1.
+!-----------------------------------------------------------------
+!     ######################
+      MODULE MODI_GRADIENT_M
+!     ###################### 
+!
+IMPLICIT NONE
+INTERFACE
+!
+!
+FUNCTION GX_M_M(PA,PDXX,PDZZ,PDZX,KKA,KKU,KL)      RESULT(PGX_M_M)
+IMPLICIT NONE
+!
+REAL, DIMENSION(:,:,:),  INTENT(IN)  :: PA      ! variable at the mass point
+REAL, DIMENSION(:,:,:),  INTENT(IN)  :: PDXX    ! metric coefficient dxx
+REAL, DIMENSION(:,:,:),  INTENT(IN)  :: PDZZ    ! metric coefficient dzz
+REAL, DIMENSION(:,:,:),  INTENT(IN)  :: PDZX    ! metric coefficient dzx
+INTEGER, INTENT(IN),OPTIONAL     :: KKA, KKU ! near ground and uppest atmosphere array indexes (AROME)
+INTEGER, INTENT(IN),OPTIONAL     :: KL     ! +1 if grid goes from ground to atmosphere top, -1 otherwise (AROME)
+!
+REAL, DIMENSION(SIZE(PA,1),SIZE(PA,2),SIZE(PA,3)) :: PGX_M_M ! result mass point
+!
+END FUNCTION GX_M_M
+!
+!
+FUNCTION GY_M_M(PA,PDYY,PDZZ,PDZY,KKA,KKU,KL)      RESULT(PGY_M_M)
+IMPLICIT NONE
+!
+REAL, DIMENSION(:,:,:),  INTENT(IN)  :: PA      ! variable at the mass point
+REAL, DIMENSION(:,:,:),  INTENT(IN)  :: PDYY    ! metric coefficient dyy
+REAL, DIMENSION(:,:,:),  INTENT(IN)  :: PDZZ    ! metric coefficient dzz
+REAL, DIMENSION(:,:,:),  INTENT(IN)  :: PDZY    ! metric coefficient dzy
+!
+INTEGER, INTENT(IN),OPTIONAL     :: KKA, KKU ! near ground and uppest atmosphere array indexes (AROME)
+INTEGER, INTENT(IN),OPTIONAL     :: KL     ! +1 if grid goes from ground to atmosphere top, -1 otherwise (AROME)
+REAL, DIMENSION(SIZE(PA,1),SIZE(PA,2),SIZE(PA,3)) :: PGY_M_M ! result mass point
+!
+END FUNCTION GY_M_M
+!
+!
+FUNCTION GZ_M_M(PA,PDZZ,KKA,KKU,KL)      RESULT(PGZ_M_M)
+IMPLICIT NONE
+!
+REAL, DIMENSION(:,:,:),  INTENT(IN)  :: PA      ! variable at the mass point
+REAL, DIMENSION(:,:,:),  INTENT(IN)  :: PDZZ    ! metric coefficient dzz
+!
+INTEGER, INTENT(IN),OPTIONAL     :: KKA, KKU ! near ground and uppest atmosphere array indexes (AROME)
+INTEGER, INTENT(IN),OPTIONAL     :: KL     ! +1 if grid goes from ground to atmosphere top, -1 otherwise (AROME)
+REAL, DIMENSION(SIZE(PA,1),SIZE(PA,2),SIZE(PA,3)) :: PGZ_M_M ! result mass point
+!
+END FUNCTION GZ_M_M
+!
+      FUNCTION GX_M_U(KKA,KKU,KL,PY,PDXX,PDZZ,PDZX) RESULT(PGX_M_U)
+!  
+IMPLICIT NONE
+!
+INTEGER,              INTENT(IN)     :: KKA, KKU ! near ground and uppest atmosphere array indexes
+INTEGER,              INTENT(IN)     :: KL     ! +1 if grid goes from ground to atmosphere top, -1 otherwise
+REAL, DIMENSION(:,:,:), INTENT(IN)  :: PDXX                   ! d*xx
+REAL, DIMENSION(:,:,:), INTENT(IN)  :: PDZX                   ! d*zx 
+REAL, DIMENSION(:,:,:), INTENT(IN)  :: PDZZ                   ! d*zz
+!
+REAL, DIMENSION(:,:,:), INTENT(IN)                :: PY       ! variable at mass
+                                                              ! localization
+REAL, DIMENSION(SIZE(PY,1),SIZE(PY,2),SIZE(PY,3)) :: PGX_M_U  ! result at flux
+                                                              ! side
+END FUNCTION GX_M_U
+!
+!
+      FUNCTION GY_M_V(KKA,KKU,KL,PY,PDYY,PDZZ,PDZY) RESULT(PGY_M_V)
+!
+IMPLICIT NONE
+!
+INTEGER,              INTENT(IN)     :: KKA, KKU ! near ground and uppest atmosphere array indexes
+INTEGER,              INTENT(IN)     :: KL     ! +1 if grid goes from ground to atmosphere top, -1 otherwise
+REAL, DIMENSION(:,:,:), INTENT(IN)  :: PDYY                   !d*yy
+REAL, DIMENSION(:,:,:), INTENT(IN)  :: PDZY                   !d*zy 
+REAL, DIMENSION(:,:,:), INTENT(IN)  :: PDZZ                   !d*zz
+!
+REAL, DIMENSION(:,:,:), INTENT(IN)                :: PY       ! variable at mass
+                                                              ! localization
+REAL, DIMENSION(SIZE(PY,1),SIZE(PY,2),SIZE(PY,3)) :: PGY_M_V  ! result at flux
+                                                              ! side
+END FUNCTION GY_M_V
+!
+      FUNCTION GZ_M_W(KKA, KKU, KL,PY,PDZZ) RESULT(PGZ_M_W)
+!  
+IMPLICIT NONE
+!
+                                                          ! Metric coefficient:
+INTEGER,              INTENT(IN)     :: KKA, KKU ! near ground and uppest atmosphere array indexes
+INTEGER,              INTENT(IN)     :: KL     ! +1 if grid goes from ground to atmosphere top, -1 otherwise
+REAL, DIMENSION(:,:,:), INTENT(IN)  :: PDZZ                   !d*zz
+!
+REAL, DIMENSION(:,:,:), INTENT(IN)                :: PY       ! variable at mass
+                                                              ! localization
+REAL, DIMENSION(SIZE(PY,1),SIZE(PY,2),SIZE(PY,3)) :: PGZ_M_W  ! result at flux
+                                                              ! side
+!
+END FUNCTION GZ_M_W
+!
+END INTERFACE
+!
+END MODULE MODI_GRADIENT_M
+!
+!
+!
+!     #######################################################
+      FUNCTION GX_M_M(PA,PDXX,PDZZ,PDZX,KKA,KKU,KL)      RESULT(PGX_M_M)
+!     #######################################################
+!
+!!****  *GX_M_M* - Cartesian Gradient operator: 
+!!                          computes the gradient in the cartesian X
+!!                          direction for a variable placed at the 
+!!                          mass point and the result is placed at
+!!                          the mass point.
+!!    PURPOSE
+!!    -------
+!       The purpose of this function is to compute the discrete gradient 
+!     along the X cartesian direction for a field PA placed at the 
+!     mass point. The result is placed at the mass point.
+!
+!
+!                       (          ______________z )
+!                       (          (___x         ) )
+!                    1  (    _x    (d*zx dzm(PA) ) ) 
+!      PGX_M_M =   ---- (dxf(PA) - (------------)) )
+!                  ___x (          (             ) )
+!                  d*xx (          (      d*zz   ) )     
+!
+!       
+!
+!!**  METHOD
+!!    ------
+!!      The Chain rule of differencing is applied to variables expressed
+!!    in the Gal-Chen & Somerville coordinates to obtain the gradient in
+!!    the cartesian system
+!!        
+!!    EXTERNAL
+!!    --------
+!!      MXM,MXF,MZF     : Shuman functions (mean operators)
+!!      DXF,DZF         : Shuman functions (finite difference operators)
+!!
+!!    IMPLICIT ARGUMENTS
+!!    ------------------
+!!      MODD_CONF : LFLAT
+!!
+!!    REFERENCE
+!!    ---------
+!!      Book2 of documentation of Meso-NH (GRAD_CAR operators)
+!!      A Turbulence scheme for the Meso-NH model (Chapter 6)
+!!
+!!    AUTHOR
+!!    ------
+!!      Joan Cuxart        *INM and Meteo-France*
+!!
+!!    MODIFICATIONS
+!!    -------------
+!!      Original    18/07/94
+!!                  19/07/00  add the LFLAT switch (J. Stein)
+!!      J.Escobar : 15/09/2015 : WENO5 & JPHEXT <> 1 
+!-------------------------------------------------------------------------
+!
+!*       0.    DECLARATIONS
+!
+!
+USE MODI_SHUMAN, ONLY: DXF, MZF, DZM, MXF, MXM
+USE MODD_CONF, ONLY:LFLAT
+!
+IMPLICIT NONE
+!
+!
+!*       0.1   declarations of arguments and result
+!
+REAL, DIMENSION(:,:,:),  INTENT(IN)  :: PA      ! variable at the mass point
+REAL, DIMENSION(:,:,:),  INTENT(IN)  :: PDXX    ! metric coefficient dxx
+REAL, DIMENSION(:,:,:),  INTENT(IN)  :: PDZZ    ! metric coefficient dzz
+REAL, DIMENSION(:,:,:),  INTENT(IN)  :: PDZX    ! metric coefficient dzx
+!
+INTEGER, INTENT(IN),OPTIONAL     :: KKA, KKU ! near ground and uppest atmosphere array indexes (AROME)
+INTEGER, INTENT(IN),OPTIONAL     :: KL     ! +1 if grid goes from ground to atmosphere top, -1 otherwise (AROME)
+REAL, DIMENSION(SIZE(PA,1),SIZE(PA,2),SIZE(PA,3)) :: PGX_M_M ! result mass point
+!
+!
+!*       0.2   declaration of local variables
+!
+!              NONE
+!
+!----------------------------------------------------------------------------
+!
+!*       1.    DEFINITION of GX_M_M
+!              --------------------
+!
+IF (.NOT. LFLAT) THEN 
+  PGX_M_M(:,:,:)= (DXF(MXM(PA(:,:,:)))   -                     &
+                   MZF(MXF(PDZX)*DZM(PA(:,:,:)) &
+                  /PDZZ(:,:,:)) )        /MXF(PDXX(:,:,:))
+ELSE
+  PGX_M_M(:,:,:)=DXF(MXM(PA(:,:,:))) / MXF(PDXX(:,:,:)) 
+END IF
+!
+!----------------------------------------------------------------------------
+!
+END FUNCTION GX_M_M
+!
+!
+!     #######################################################
+      FUNCTION GY_M_M(PA,PDYY,PDZZ,PDZY,KKA,KKU,KL)      RESULT(PGY_M_M)
+!     #######################################################
+!
+!!****  *GY_M_M* - Cartesian Gradient operator: 
+!!                          computes the gradient in the cartesian Y
+!!                          direction for a variable placed at the 
+!!                          mass point and the result is placed at
+!!                          the mass point.
+!!    PURPOSE
+!!    -------
+!       The purpose of this function is to compute the discrete gradient 
+!     along the Y cartesian direction for a field PA placed at the 
+!     mass point. The result is placed at the mass point.
+!
+!
+!                       (          ______________z )
+!                       (          (___y         ) )
+!                    1  (    _y    (d*zy dzm(PA) ) ) 
+!      PGY_M_M =   ---- (dyf(PA) - (------------)) )
+!                  ___y (          (             ) )
+!                  d*yy (          (      d*zz   ) )     
+!
+!       
+!!**  METHOD
+!!    ------
+!!      The Chain rule of differencing is applied to variables expressed
+!!    in the Gal-Chen & Somerville coordinates to obtain the gradient in
+!!    the cartesian system
+!!        
+!!    EXTERNAL
+!!    --------
+!!      MYM,MYF,MZF     : Shuman functions (mean operators)
+!!      DYF,DZF         : Shuman functions (finite difference operators)
+!!
+!!    IMPLICIT ARGUMENTS
+!!    ------------------
+!!      MODD_CONF : LFLAT
+!!
+!!    REFERENCE
+!!    ---------
+!!      Book2 of documentation of Meso-NH (GRAD_CAR operators)
+!!      A Turbulence scheme for the Meso-NH model (Chapter 6)
+!!
+!!    AUTHOR
+!!    ------
+!!      Joan Cuxart        *INM and Meteo-France*
+!!
+!!    MODIFICATIONS
+!!    -------------
+!!      Original    18/07/94
+!!                  19/07/00  add the LFLAT switch (J. Stein)
+!-------------------------------------------------------------------------
+!
+!*       0.    DECLARATIONS
+!
+!
+USE MODD_CONF, ONLY:LFLAT
+USE MODI_SHUMAN
+!
+IMPLICIT NONE
+!
+!
+!*       0.1   declarations of arguments and result
+!
+REAL, DIMENSION(:,:,:),  INTENT(IN)  :: PA      ! variable at the mass point
+REAL, DIMENSION(:,:,:),  INTENT(IN)  :: PDYY    ! metric coefficient dyy
+REAL, DIMENSION(:,:,:),  INTENT(IN)  :: PDZZ    ! metric coefficient dzz
+REAL, DIMENSION(:,:,:),  INTENT(IN)  :: PDZY    ! metric coefficient dzy
+!
+INTEGER, INTENT(IN),OPTIONAL     :: KKA, KKU ! near ground and uppest atmosphere array indexes (AROME)
+INTEGER, INTENT(IN),OPTIONAL     :: KL     ! +1 if grid goes from ground to atmosphere top, -1 otherwise (AROME)
+REAL, DIMENSION(SIZE(PA,1),SIZE(PA,2),SIZE(PA,3)) :: PGY_M_M ! result mass point
+!
+!
+!*       0.2   declaration of local variables
+!
+!              NONE
+!
+!----------------------------------------------------------------------------
+!
+!*       1.    DEFINITION of GY_M_M
+!              --------------------
+!
+!
+IF (.NOT. LFLAT) THEN 
+  PGY_M_M(:,:,:)= (DYF(MYM(PA))-MZF(MYF(PDZY)*DZM(PA)&
+                /PDZZ) ) /MYF(PDYY)
+ELSE
+  PGY_M_M(:,:,:)= DYF(MYM(PA))/MYF(PDYY)
+ENDIF  
+!
+!----------------------------------------------------------------------------
+!
+END FUNCTION GY_M_M
+
+!
+!
+!
+!     #############################################
+      FUNCTION GZ_M_M(PA,PDZZ)      RESULT(PGZ_M_M)
+!     #############################################
+!
+!!****  *GZ_M_M* - Cartesian Gradient operator: 
+!!                          computes the gradient in the cartesian Z
+!!                          direction for a variable placed at the 
+!!                          mass point and the result is placed at
+!!                          the mass point.
+!!    PURPOSE
+!!    -------
+!       The purpose of this function is to compute the discrete gradient 
+!     along the Z cartesian direction for a field PA placed at the 
+!     mass point. The result is placed at the mass point.
+!
+!                 _________z
+!                 (dzm(PA))
+!      PGZ_M_M =  (------ )
+!                 ( d*zz  )
+!
+!       
+!!**  METHOD
+!!    ------
+!!      The Chain rule of differencing is applied to variables expressed
+!!    in the Gal-Chen & Somerville coordinates to obtain the gradient in
+!!    the cartesian system
+!!        
+!!    EXTERNAL
+!!    --------
+!!      MZF     : Shuman functions (mean operators)
+!!      DZM     : Shuman functions (finite difference operators)
+!!
+!!    IMPLICIT ARGUMENTS
+!!    ------------------
+!!      NONE
+!!
+!!    REFERENCE
+!!    ---------
+!!      Book2 of documentation of Meso-NH (GRAD_CAR operators)
+!!      A Turbulence scheme for the Meso-NH model (Chapter 6)
+!!
+!!    AUTHOR
+!!    ------
+!!      Joan Cuxart        *INM and Meteo-France*
+!!
+!!    MODIFICATIONS
+!!    -------------
+!!      Original    18/07/94
+!-------------------------------------------------------------------------
+!
+!*       0.    DECLARATIONS
+!
+!
+USE MODI_SHUMAN
+!
+IMPLICIT NONE
+!
+!
+!*       0.1   declarations of arguments and result
+!
+REAL, DIMENSION(:,:,:),  INTENT(IN)  :: PA      ! variable at the mass point
+REAL, DIMENSION(:,:,:),  INTENT(IN)  :: PDZZ    ! metric coefficient dzz
+!
+REAL, DIMENSION(SIZE(PA,1),SIZE(PA,2),SIZE(PA,3)) :: PGZ_M_M ! result mass point
+!
+!
+!*       0.2   declaration of local variables
+!
+!              NONE
+!
+!----------------------------------------------------------------------------
+!
+!*       1.    DEFINITION of GZ_M_M
+!              --------------------
+!
+PGZ_M_M(:,:,:)= MZF( DZM(PA(:,:,:))/PDZZ(:,:,:) )
+!
+!----------------------------------------------------------------------------
+!
+END FUNCTION GZ_M_M
+!
+!
+!     ##################################################
+      FUNCTION GX_M_U(KKA,KKU,KL,PY,PDXX,PDZZ,PDZX) RESULT(PGX_M_U)
+!     ##################################################
+!
+!!****  *GX_M_U * - Compute the gradient along x for a variable localized at 
+!!                  a mass point
+!!
+!!    PURPOSE
+!!    -------
+!       The purpose of this routine is to compute a gradient along x 
+!     direction for a field PY localized at a mass point. The result PGX_M_U
+!     is localized at a x-flux point (u point).
+!
+!                    (           ____________z )
+!                    (               ________x )
+!                 1  (                dzm(PY)  ) 
+!   PGX_M_U =   ---- (dxm(PY) - d*zx --------  )
+!               d*xx (                 d*zz    )     
+!
+!       
+!
+!!**  METHOD
+!!    ------
+!!      We employ the Shuman operators to compute the derivatives and the 
+!!    averages. The metric coefficients PDXX,PDZX,PDZZ are dummy arguments.
+!!
+!!
+!!    EXTERNAL
+!!    --------
+!!      FUNCTION DXM: compute a finite difference along the x direction for 
+!!      a variable at a mass localization
+!!      FUNCTION DZM: compute a finite difference along the y direction for 
+!!      a variable at a mass localization
+!!      FUNCTION MXM: compute an average in the x direction for a variable  
+!!      at a mass localization
+!!      FUNCTION MZF: compute an average in the z direction for a variable
+!!      at a flux side
+!!
+!!    IMPLICIT ARGUMENTS
+!!    ------------------
+!!      MODD_CONF : LFLAT
+!!
+!!    REFERENCE
+!!    ---------
+!!      Book2 of documentation (function GX_M_U)
+!!
+!!
+!!    AUTHOR
+!!    ------
+!!	P. Hereil and J. Stein       * Meteo France *
+!!
+!!    MODIFICATIONS
+!!    -------------
+!!      Original           05/07/94
+!!      Modification       16/03/95  change the order of the arguments
+!!                         19/07/00  add the LFLAT switch  + inlining(J. Stein)
+!!                         20/08/00  optimization (J. Escobar)
+!-------------------------------------------------------------------------------
+!
+!*       0.    DECLARATIONS
+!              ------------
+!
+USE MODI_SHUMAN
+USE MODD_CONF, ONLY:LFLAT
+USE MODD_PARAMETERS
+!
+IMPLICIT NONE
+!
+!*       0.1   Declarations of arguments and result
+!              ------------------------------------
+!
+INTEGER,                INTENT(IN)  :: KKA, KKU ! near ground and uppest atmosphere array indexes
+INTEGER,                INTENT(IN)  :: KL     ! +1 if grid goes from ground to atmosphere top, -1 otherwise
+REAL, DIMENSION(:,:,:), INTENT(IN)  :: PDXX                   ! d*xx
+REAL, DIMENSION(:,:,:), INTENT(IN)  :: PDZX                   ! d*zx
+REAL, DIMENSION(:,:,:), INTENT(IN)  :: PDZZ                   ! d*zz
+!
+REAL, DIMENSION(:,:,:), INTENT(IN)                :: PY       ! variable at mass
+                                                              ! localization
+REAL, DIMENSION(SIZE(PY,1),SIZE(PY,2),SIZE(PY,3)) :: PGX_M_U  ! result at flux
+                                                              ! side
+INTEGER  IIU,IKU,JI,JK
+!
+INTEGER :: JJK,IJU
+INTEGER :: JIJK,JIJKOR,JIJKEND
+INTEGER :: JI_1JK, JIJK_1, JI_1JK_1, JIJKP1, JI_1JKP1
+!
+!
+!-------------------------------------------------------------------------------
+!
+!*       1.    COMPUTE THE GRADIENT ALONG X
+!              -----------------------------
+!
+IIU=SIZE(PY,1)
+IJU=SIZE(PY,2)
+IKU=SIZE(PY,3)
+IF (.NOT. LFLAT) THEN
+! PGX_M_U = (   DXM(PY)  -  MZF (   MXM(  DZM(PY) /PDZZ  ) * PDZX   )   )/PDXX
+!!  DO JK=1+JPVEXT_TURB,IKU-JPVEXT_TURB
+!!    DO JI=1+JPHEXT,IIU
+!!        PGX_M_U(JI,:,JK)=                                                 &
+!!           (  PY(JI,:,JK)-PY(JI-1,:,JK)                                   &
+!!             -(  (PY(JI,:,JK)-PY(JI,:,JK-1))     / PDZZ(JI,:,JK)          &
+!!                +(PY(JI-1,:,JK)-PY(JI-1,:,JK-1)) / PDZZ(JI-1,:,JK)        &
+!!              ) * PDZX(JI,:,JK)* 0.25                                     &
+!!             -(  (PY(JI,:,JK+1)-PY(JI,:,JK))     / PDZZ(JI,:,JK+1)        &
+!!                +(PY(JI-1,:,JK+1)-PY(JI-1,:,JK)) / PDZZ(JI-1,:,JK+1)      &
+!!              ) * PDZX(JI,:,JK+1)* 0.25                                   &
+!!            )  / PDXX(JI,:,JK)
+!!    END DO
+!!  END DO
+  JIJKOR  = 1 + JPHEXT + IIU*IJU*(JPVEXT_TURB+1 - 1)
+  JIJKEND = IIU*IJU*(IKU-JPVEXT_TURB)
+!CDIR NODEP
+!OCL NOVREC
+  DO JIJK=JIJKOR , JIJKEND
+! indexation
+    JI_1JK   = JIJK - 1
+    JIJK_1   = JIJK     - IIU*IJU*KL
+    JI_1JK_1 = JIJK - 1 - IIU*IJU*KL
+    JIJKP1   = JIJK     + IIU*IJU*KL
+    JI_1JKP1 = JIJK - 1 + IIU*IJU*KL
+!
+    PGX_M_U(JIJK,1,1)=                                              &
+       (  PY(JIJK,1,1)-PY(JI_1JK,1,1)                               &
+       -(  (PY(JIJK,1,1)-PY(JIJK_1,1,1))     / PDZZ(JIJK,1,1)       &
+       +(PY(JI_1JK,1,1)-PY(JI_1JK_1,1,1)) / PDZZ(JI_1JK,1,1)        &
+       ) * PDZX(JIJK,1,1)* 0.25                                     &
+       -(  (PY(JIJKP1,1,1)-PY(JIJK,1,1))     / PDZZ(JIJKP1,1,1)     &
+       +(PY(JI_1JKP1,1,1)-PY(JI_1JK,1,1)) / PDZZ(JI_1JKP1,1,1)      &
+       ) * PDZX(JIJKP1,1,1)* 0.25                                   &
+        )  / PDXX(JIJK,1,1)
+  END DO
+
+!
+  DO JI=1+JPHEXT,IIU
+    PGX_M_U(JI,:,KKU)=  ( PY(JI,:,KKU)-PY(JI-1,:,KKU)  )  / PDXX(JI,:,KKU)
+    PGX_M_U(JI,:,KKA)=   PGX_M_U(JI,:,KKU) ! -999.
+  END DO
+ELSE
+!  PGX_M_U = DXM(PY) / PDXX
+  PGX_M_U(1+1:IIU,:,:) = ( PY(1+1:IIU,:,:)-PY(1:IIU-1,:,:) ) & ! +JPHEXT
+                             / PDXX(1+1:IIU,:,:)
+ENDIF
+DO JI=1,JPHEXT
+  PGX_M_U(JI,:,:)=PGX_M_U(IIU-2*JPHEXT+JI,:,:) ! for reprod JPHEXT <> 1
+END DO  
+!
+!-------------------------------------------------------------------------------
+!
+END FUNCTION GX_M_U
+!
+!
+!     ##################################################
+      FUNCTION GY_M_V(KKA,KKU,KL,PY,PDYY,PDZZ,PDZY) RESULT(PGY_M_V)
+!     ##################################################
+!
+!!****  *GY_M_V * - Compute the gradient along y for a variable localized at 
+!!                  a mass point
+!!
+!!    PURPOSE
+!!    -------
+!       The purpose of this routine is to compute a gradient along y
+!     direction for a field PY localized at a mass point. The result PGY_M_V 
+!     is localized at a y-flux point (v point).
+!
+!                    (           ____________z )
+!                    (               ________y )
+!                 1  (                dzm(PY)  ) 
+!   PGY_M_V =   ---- (dym(PY) - d*zy --------  )
+!               d*yy (                 d*zz    )     
+!
+!
+!       
+!
+!!**  METHOD
+!!    ------
+!!      We employ the Shuman operators to compute the derivatives and the 
+!!    averages. The metric coefficients PDYY,PDZY,PDZZ are dummy arguments.
+!!
+!!
+!!    EXTERNAL
+!!    --------
+!!      FUNCTION DYM: compute a finite difference along the y direction for 
+!!      a variable at a mass localization
+!!      FUNCTION DZM: compute a finite difference along the y direction for 
+!!      a variable at a mass localization
+!!      FUNCTION MYM: compute an average in the x direction for a variable  
+!!      at a mass localization
+!!      FUNCTION MZF: compute an average in the z direction for a variable 
+!!      at a flux side
+!!
+!!    IMPLICIT ARGUMENTS
+!!    ------------------ 
+!!      MODD_CONF : LFLAT                                        
+!!
+!!    REFERENCE
+!!    ---------
+!!      Book2 of documentation (function GY_M_V)
+!!      
+!!
+!!    AUTHOR
+!!    ------
+!!	P. Hereil and J. Stein       * Meteo France *
+!!
+!!    MODIFICATIONS
+!!    -------------
+!!      Original    05/07/94 
+!!      Modification       16/03/95  change the order of the arguments
+!!                         19/07/00  add the LFLAT switch + inlining(J. Stein)
+!-------------------------------------------------------------------------------
+!
+!*       0.    DECLARATIONS
+!              ------------
+!
+USE MODI_SHUMAN
+USE MODD_CONF, ONLY:LFLAT
+USE MODD_PARAMETERS
+!
+IMPLICIT NONE
+!
+!*       0.1   Declarations of arguments and results
+!              -------------------------------------
+!
+INTEGER,                INTENT(IN)  :: KKA, KKU ! near ground and uppest atmosphere array indexes
+INTEGER,                INTENT(IN)  :: KL     ! +1 if grid goes from ground to atmosphere top, -1 otherwise
+REAL, DIMENSION(:,:,:), INTENT(IN)  :: PDYY                   !d*yy
+REAL, DIMENSION(:,:,:), INTENT(IN)  :: PDZY                   !d*zy 
+REAL, DIMENSION(:,:,:), INTENT(IN)  :: PDZZ                   !d*zz
+!
+REAL, DIMENSION(:,:,:), INTENT(IN)                :: PY       ! variable at mass
+                                                              ! localization
+REAL, DIMENSION(SIZE(PY,1),SIZE(PY,2),SIZE(PY,3)) :: PGY_M_V  ! result at flux
+                                                              ! side
+INTEGER  IJU,IKU,JJ,JK
+!
+!-------------------------------------------------------------------------------
+!
+!*       1.    COMPUTE THE GRADIENT ALONG Y
+!              ----------------------------
+!
+IJU=SIZE(PY,2)
+IKU=SIZE(PY,3)
+IF (.NOT. LFLAT) THEN 
+!  PGY_M_V = (   DYM(PY)  -  MZF (   MYM(  DZM(PY) /PDZZ  ) * PDZY   )   )/PDYY
+  DO JK=1+JPVEXT_TURB,IKU-JPVEXT_TURB
+    DO JJ=1+JPHEXT,IJU
+        PGY_M_V(:,JJ,JK)=                                                 &
+           (  PY(:,JJ,JK)-PY(:,JJ-1,JK)                                   &
+             -(  (PY(:,JJ,JK)-PY(:,JJ,JK-KL))     / PDZZ(:,JJ,JK)          &
+                +(PY(:,JJ-1,JK)-PY(:,JJ-KL,JK-KL)) / PDZZ(:,JJ-1,JK)        &
+              ) * PDZY(:,JJ,JK)* 0.25                                     &
+             -(  (PY(:,JJ,JK+KL)-PY(:,JJ,JK))     / PDZZ(:,JJ,JK+KL)        &
+                +(PY(:,JJ-1,JK+KL)-PY(:,JJ-1,JK)) / PDZZ(:,JJ-1,JK+KL)      &
+              ) * PDZY(:,JJ,JK+KL)* 0.25                                   &
+            )  / PDYY(:,JJ,JK)
+    END DO
+  END DO
+!
+  DO JJ=1+JPHEXT,IJU
+    PGY_M_V(:,JJ,KKU)=  ( PY(:,JJ,KKU)-PY(:,JJ-1,KKU)  )  / PDYY(:,JJ,KKU) 
+    PGY_M_V(:,JJ,KKA)=  PGY_M_V(:,JJ,KKU) ! -999.
+  END DO
+ELSE
+!  PGY_M_V = DYM(PY)/PDYY
+  PGY_M_V(:,1+1:IJU,:) = ( PY(:,1+1:IJU,:)-PY(:,1:IJU-1,:) ) & ! +JPHEXT
+                               / PDYY(:,1+1:IJU,:)
+ENDIF  
+DO JJ=1,JPHEXT
+  PGY_M_V(:,JJ,:)=PGY_M_V(:,IJU-2*JPHEXT+JJ,:)
+END DO
+!
+!-------------------------------------------------------------------------------
+!
+END FUNCTION GY_M_V
+!
+!
+!     #########################################
+      FUNCTION GZ_M_W(KKA,KKU,KL,PY,PDZZ) RESULT(PGZ_M_W)
+!     #########################################
+!
+!!****  *GZ_M_W * - Compute the gradient along z direction for a 
+!!       variable localized at a mass point
+!!
+!!    PURPOSE
+!!    -------
+!       The purpose of this routine is to compute a gradient along x,y,z 
+!     directions for a field PY localized at a mass point. The result PGZ_M_W
+!     is localized at a z-flux point (w point)
+!
+!              
+!                    dzm(PY)  
+!       PGZ_M_W =    ------- 
+!                     d*zz        
+!
+!!**  METHOD
+!!    ------
+!!      We employ the Shuman operators to compute the derivatives and the 
+!!    averages. The metric coefficients PDZZ are dummy arguments.
+!!
+!!
+!!    EXTERNAL
+!!    --------
+!!      FUNCTION DZM : compute a finite difference along the z 
+!!    direction for a variable at a mass localization
+!!
+!!    IMPLICIT ARGUMENTS
+!!    ------------------  
+!!      Module MODI_SHUMAN : interface for the Shuman functions
+!!
+!!    REFERENCE
+!!    ---------
+!!      Book2 of documentation (function GZ_M_W)
+!!      
+!!
+!!    AUTHOR
+!!    ------
+!!	P. Hereil and J. Stein       * Meteo France *
+!!
+!!    MODIFICATIONS
+!!    -------------
+!!      Original    05/07/94 
+!!      Modification       16/03/95  change the order of the arguments
+!!                         19/07/00  inlining(J. Stein)
+!-------------------------------------------------------------------------------
+!
+!*       0.    DECLARATIONS
+!              ------------
+!
+USE MODI_SHUMAN
+USE MODD_PARAMETERS
+!
+IMPLICIT NONE
+!
+!*       0.1   Declarations of arguments and results
+!              -------------------------------------
+!
+INTEGER,           INTENT(IN)     :: KKA, KKU ! near ground and uppest atmosphere array indexes
+INTEGER,           INTENT(IN)     :: KL     ! +1 if grid goes from ground to atmosphere top, -1 otherwise
+
+                                                          ! Metric coefficient:
+REAL, DIMENSION(:,:,:), INTENT(IN)  :: PDZZ                   !d*zz
+!
+REAL, DIMENSION(:,:,:), INTENT(IN)                :: PY       ! variable at mass
+                                                              ! localization
+REAL, DIMENSION(SIZE(PY,1),SIZE(PY,2),SIZE(PY,3)) :: PGZ_M_W  ! result at flux
+                                                              ! side
+!
+INTEGER :: IKT,IKTB,IKTE
+!-------------------------------------------------------------------------------
+!
+!*       1.    COMPUTE THE GRADIENT ALONG Z
+!              -----------------------------
+!
+IKT=SIZE(PY,3)
+IKTB=1+JPVEXT_TURB              
+IKTE=IKT-JPVEXT_TURB
+
+PGZ_M_W(:,:,IKTB:IKTE) =  (PY(:,:,IKTB:IKTE)-PY(:,:,IKTB-KL:IKTE-KL))  &
+                           / PDZZ(:,:,IKTB:IKTE)
+PGZ_M_W(:,:,KKU)=  (PY(:,:,KKU)-PY(:,:,KKU-KL))  &
+                           / PDZZ(:,:,KKU)
+PGZ_M_W(:,:,KKA)= PGZ_M_W(:,:,KKU) ! -999.
+!
+!-------------------------------------------------------------------------------
+!
+END FUNCTION GZ_M_W
+
diff --git a/src/PHYEX/aux/gradient_u.f90 b/src/PHYEX/aux/gradient_u.f90
new file mode 100644
index 0000000000000000000000000000000000000000..e956012164590438e124e4ea1fdf153a63d86519
--- /dev/null
+++ b/src/PHYEX/aux/gradient_u.f90
@@ -0,0 +1,338 @@
+!MNH_LIC Copyright 1994-2020 CNRS, Meteo-France and Universite Paul Sabatier
+!MNH_LIC This is part of the Meso-NH software governed by the CeCILL-C licence
+!MNH_LIC version 1. See LICENSE, CeCILL-C_V1-en.txt and CeCILL-C_V1-fr.txt
+!MNH_LIC for details. version 1.
+!-----------------------------------------------------------------
+!     ######################
+      MODULE MODI_GRADIENT_U
+!     ######################
+!
+IMPLICIT NONE
+INTERFACE
+!
+!     
+FUNCTION GX_U_M(PA,PDXX,PDZZ,PDZX, KKA, KKU, KL)      RESULT(PGX_U_M)
+IMPLICIT NONE
+INTEGER,              INTENT(IN),OPTIONAL     :: KKA, KKU ! near ground and uppest atmosphere array indexes
+INTEGER,              INTENT(IN),OPTIONAL     :: KL     ! +1 if grid goes from ground to atmosphere top, -1 otherwise
+REAL, DIMENSION(:,:,:),  INTENT(IN)  :: PA      ! variable at the U point
+REAL, DIMENSION(:,:,:),  INTENT(IN)  :: PDXX    ! metric coefficient dxx
+REAL, DIMENSION(:,:,:),  INTENT(IN)  :: PDZZ    ! metric coefficient dzz
+REAL, DIMENSION(:,:,:),  INTENT(IN)  :: PDZX    ! metric coefficient dzx
+!
+REAL, DIMENSION(SIZE(PA,1),SIZE(PA,2),SIZE(PA,3)) :: PGX_U_M ! result mass point
+!
+END FUNCTION GX_U_M
+!
+!     
+FUNCTION GY_U_UV(PA,PDYY,PDZZ,PDZY, KKA, KKU, KL)      RESULT(PGY_U_UV)
+IMPLICIT NONE
+!
+INTEGER,              INTENT(IN),OPTIONAL     :: KKA, KKU ! near ground and uppest atmosphere array indexes
+INTEGER,              INTENT(IN),OPTIONAL     :: KL     ! +1 if grid goes from ground to atmosphere top, -1 otherwise
+REAL, DIMENSION(:,:,:),  INTENT(IN)  :: PA      ! variable at the U point
+REAL, DIMENSION(:,:,:),  INTENT(IN)  :: PDYY    ! metric coefficient dyy
+REAL, DIMENSION(:,:,:),  INTENT(IN)  :: PDZZ    ! metric coefficient dzz
+REAL, DIMENSION(:,:,:),  INTENT(IN)  :: PDZY    ! metric coefficient dzy
+!
+REAL, DIMENSION(SIZE(PA,1),SIZE(PA,2),SIZE(PA,3)) :: PGY_U_UV ! result UV point
+!
+END FUNCTION GY_U_UV
+!
+!     
+FUNCTION GZ_U_UW(PA,PDZZ, KKA, KKU, KL)      RESULT(PGZ_U_UW)
+IMPLICIT NONE
+!
+INTEGER,              INTENT(IN),OPTIONAL     :: KKA, KKU ! near ground and uppest atmosphere array indexes
+INTEGER,              INTENT(IN),OPTIONAL     :: KL     ! +1 if grid goes from ground to atmosphere top, -1 otherwise
+REAL, DIMENSION(:,:,:),  INTENT(IN)  :: PA      ! variable at the U point
+REAL, DIMENSION(:,:,:),  INTENT(IN)  :: PDZZ    ! metric coefficient dzz
+!
+REAL, DIMENSION(SIZE(PA,1),SIZE(PA,2),SIZE(PA,3)) :: PGZ_U_UW ! result UW point
+!
+END FUNCTION GZ_U_UW
+!
+END INTERFACE
+!
+END MODULE MODI_GRADIENT_U
+!
+!
+!
+!
+!     #######################################################
+      FUNCTION GX_U_M(PA,PDXX,PDZZ,PDZX, KKA, KKU, KL)      RESULT(PGX_U_M)
+!     #######################################################
+!
+!!****  *GX_U_M* - Cartesian Gradient operator: 
+!!                          computes the gradient in the cartesian X
+!!                          direction for a variable placed at the 
+!!                          U point and the result is placed at
+!!                          the mass point.
+!!    PURPOSE
+!!    -------
+!       The purpose of this function is to compute the discrete gradient 
+!     along the X cartesian direction for a field PA placed at the 
+!     U point. The result is placed at the mass point.
+!
+!
+!                       (          ______________z )
+!                       (          (___________x ) )
+!                    1  (          (d*zx dzm(PA) ) ) 
+!      PGX_U_M =   ---- (dxf(PA) - (------------)) )
+!                  ___x (          (             ) )
+!                  d*xx (          (      d*zz   ) )     
+!
+!       
+!
+!!**  METHOD
+!!    ------
+!!      The Chain rule of differencing is applied to variables expressed
+!!    in the Gal-Chen & Somerville coordinates to obtain the gradient in
+!!    the cartesian system
+!!        
+!!    EXTERNAL
+!!    --------
+!!      MXF,MZF         : Shuman functions (mean operators)
+!!      DXF,DZF         : Shuman functions (finite difference operators)
+!!
+!!    IMPLICIT ARGUMENTS
+!!    ------------------
+!!      NONE
+!!
+!!    REFERENCE
+!!    ---------
+!!      Book2 of documentation of Meso-NH (GRAD_CAR operators)
+!!      A Turbulence scheme for the Meso-NH model (Chapter 6)
+!!
+!!    AUTHOR
+!!    ------
+!!      Joan Cuxart        *INM and Meteo-France*
+!!
+!!    MODIFICATIONS
+!!    -------------
+!!      Original    19/07/94
+!!                  18/10/00 (V.Masson) add LFLAT switch
+!-------------------------------------------------------------------------
+!
+!*       0.    DECLARATIONS
+!
+!
+USE MODI_SHUMAN
+USE MODD_CONF
+!
+IMPLICIT NONE
+!
+!
+!*       0.1   declarations of arguments and result
+!
+INTEGER,                 INTENT(IN),OPTIONAL   :: KKA, KKU ! near ground and uppest atmosphere array indexes
+INTEGER,                 INTENT(IN),OPTIONAL   :: KL     ! +1 if grid goes from ground to atmosphere top, -1 otherwise
+REAL, DIMENSION(:,:,:),  INTENT(IN)  :: PA      ! variable at the U point
+REAL, DIMENSION(:,:,:),  INTENT(IN)  :: PDXX    ! metric coefficient dxx
+REAL, DIMENSION(:,:,:),  INTENT(IN)  :: PDZZ    ! metric coefficient dzz
+REAL, DIMENSION(:,:,:),  INTENT(IN)  :: PDZX    ! metric coefficient dzx
+!
+REAL, DIMENSION(SIZE(PA,1),SIZE(PA,2),SIZE(PA,3)) :: PGX_U_M ! result mass point
+!
+!
+!*       0.2   declaration of local variables
+!
+!              NONE
+!
+!----------------------------------------------------------------------------
+!
+!*       1.    DEFINITION of GX_U_M
+!              --------------------
+!
+IF (.NOT. LFLAT) THEN
+  PGX_U_M(:,:,:)= ( DXF(PA)        -                 &
+                    MZF(MXF(PDZX*DZM(PA)) / PDZZ )  &
+                  ) / MXF(PDXX)
+ELSE
+  PGX_U_M(:,:,:)= DXF(PA) /  MXF(PDXX)
+END IF
+!
+!----------------------------------------------------------------------------
+!
+END FUNCTION GX_U_M
+!
+! 
+!     #########################################################
+      FUNCTION GY_U_UV(PA,PDYY,PDZZ,PDZY, KKA, KKU, KL)      RESULT(PGY_U_UV)
+!     #########################################################
+!
+!!****  *GY_U_UV* - Cartesian Gradient operator: 
+!!                          computes the gradient in the cartesian Y
+!!                          direction for a variable placed at the 
+!!                          U point and the result is placed at
+!!                          the UV vorticity point.
+!!    PURPOSE
+!!    -------
+!       The purpose of this function is to compute the discrete gradient 
+!     along the Y cartesian direction for a field PA placed at the 
+!     U point. The result is placed at the UV vorticity point.
+!
+!
+!
+!                       (          _________________z )
+!                       (          (___x _________y ) )
+!                    1  (          (d*zy (dzm(PA))) ) )
+!      PGY_U_UV=   ---- (dym(PA) - (     (------  ) ) )
+!                  ___x (          (     ( ___x   ) ) )
+!                  d*yy (          (     ( d*zz   ) ) )    
+!
+!       
+!
+!!**  METHOD
+!!    ------
+!!      The Chain rule of differencing is applied to variables expressed
+!!    in the Gal-Chen & Somerville coordinates to obtain the gradient in
+!!    the cartesian system
+!!        
+!!    EXTERNAL
+!!    --------
+!!      MXM,MYM,MZF     : Shuman functions (mean operators)
+!!      DYM,DZM         : Shuman functions (finite difference operators)
+!!
+!!    IMPLICIT ARGUMENTS
+!!    ------------------
+!!      NONE
+!!
+!!    REFERENCE
+!!    ---------
+!!      Book2 of documentation of Meso-NH (GRAD_CAR operators)
+!!      A Turbulence scheme for the Meso-NH model (Chapter 6)
+!!
+!!    AUTHOR
+!!    ------
+!!      Joan Cuxart        *INM and Meteo-France*
+!!
+!!    MODIFICATIONS
+!!    -------------
+!!      Original    20/07/94
+!!                  18/10/00 (V.Masson) add LFLAT switch
+!-------------------------------------------------------------------------
+!
+!*       0.    DECLARATIONS
+!
+!
+USE MODI_SHUMAN
+USE MODD_CONF
+!
+IMPLICIT NONE
+!
+!
+!*       0.1   declarations of arguments and result
+!
+INTEGER,                 INTENT(IN),OPTIONAL   :: KKA, KKU ! near ground and uppest atmosphere array indexes
+INTEGER,                 INTENT(IN),OPTIONAL   :: KL     ! +1 if grid goes from ground to atmosphere top, -1 otherwise
+REAL, DIMENSION(:,:,:),  INTENT(IN)  :: PA      ! variable at the U point
+REAL, DIMENSION(:,:,:),  INTENT(IN)  :: PDYY    ! metric coefficient dyy
+REAL, DIMENSION(:,:,:),  INTENT(IN)  :: PDZZ    ! metric coefficient dzz
+REAL, DIMENSION(:,:,:),  INTENT(IN)  :: PDZY    ! metric coefficient dzy
+!
+REAL, DIMENSION(SIZE(PA,1),SIZE(PA,2),SIZE(PA,3)) :: PGY_U_UV ! result UV point
+!
+!
+!*       0.2   declaration of local variables
+!
+!              NONE
+!
+!----------------------------------------------------------------------------
+!
+!*       1.    DEFINITION of GY_U_UV
+!              ---------------------
+!
+IF (.NOT. LFLAT) THEN
+  PGY_U_UV(:,:,:)=  (DYM(PA)- MZF( MYM( DZM(PA)/&
+                 MXM(PDZZ) ) *MXM(PDZY) )   ) / MXM(PDYY)
+ELSE
+  PGY_U_UV(:,:,:)= DYM(PA) / MXM(PDYY)
+END IF
+!
+!----------------------------------------------------------------------------
+!
+END FUNCTION GY_U_UV
+!
+!
+!     #######################################################
+      FUNCTION GZ_U_UW(PA,PDZZ, KKA, KKU, KL)      RESULT(PGZ_U_UW)
+!     #######################################################
+!
+!!****  *GZ_U_UW - Cartesian Gradient operator: 
+!!                          computes the gradient in the cartesian Z
+!!                          direction for a variable placed at the 
+!!                          U point and the result is placed at
+!!                          the UW vorticity point.
+!!    PURPOSE
+!!    -------
+!       The purpose of this function is to compute the discrete gradient 
+!     along the Z cartesian direction for a field PA placed at the 
+!     U point. The result is placed at the UW vorticity point.
+!
+!                   dzm(PA) 
+!      PGZ_U_UW =   ------  
+!                    ____x
+!                    d*zz   
+!
+!!**  METHOD
+!!    ------
+!!      The Chain rule of differencing is applied to variables expressed
+!!    in the Gal-Chen & Somerville coordinates to obtain the gradient in
+!!    the cartesian system
+!!        
+!!    EXTERNAL
+!!    --------
+!!      MXM     : Shuman functions (mean operators)
+!!      DZM     : Shuman functions (finite difference operators)
+!!
+!!    IMPLICIT ARGUMENTS
+!!    ------------------
+!!      NONE
+!!
+!!    REFERENCE
+!!    ---------
+!!      Book2 of documentation of Meso-NH (GRAD_CAR operators)
+!!      A Turbulence scheme for the Meso-NH model (Chapter 6)
+!!
+!!    AUTHOR
+!!    ------
+!!      Joan Cuxart        *INM and Meteo-France*
+!!
+!!    MODIFICATIONS
+!!    -------------
+!!      Original    20/07/94
+!-------------------------------------------------------------------------
+!
+!*       0.    DECLARATIONS
+!
+!
+USE MODI_SHUMAN
+!
+IMPLICIT NONE
+!
+!
+!*       0.1   declarations of arguments and result
+!
+INTEGER,              INTENT(IN),OPTIONAL      :: KKA, KKU ! near ground and uppest atmosphere array indexes
+INTEGER,              INTENT(IN),OPTIONAL      :: KL     ! +1 if grid goes from ground to atmosphere top, -1 otherwise
+REAL, DIMENSION(:,:,:),  INTENT(IN)  :: PA      ! variable at the U point
+REAL, DIMENSION(:,:,:),  INTENT(IN)  :: PDZZ    ! metric coefficient dzz
+!
+REAL, DIMENSION(SIZE(PA,1),SIZE(PA,2),SIZE(PA,3)) :: PGZ_U_UW ! result UW point
+!
+!
+!*       0.2   declaration of local variables
+!
+!              NONE
+!
+!----------------------------------------------------------------------------
+!
+!*       1.    DEFINITION of GZ_U_UW
+!              ---------------------
+!
+PGZ_U_UW(:,:,:)= DZM(PA) / MXM(PDZZ)
+!
+!----------------------------------------------------------------------------
+!
+END FUNCTION GZ_U_UW
diff --git a/src/PHYEX/aux/gradient_v.f90 b/src/PHYEX/aux/gradient_v.f90
new file mode 100644
index 0000000000000000000000000000000000000000..59cae056c54d6020df8288b3fb4e37487db59684
--- /dev/null
+++ b/src/PHYEX/aux/gradient_v.f90
@@ -0,0 +1,337 @@
+!MNH_LIC Copyright 1994-2020 CNRS, Meteo-France and Universite Paul Sabatier
+!MNH_LIC This is part of the Meso-NH software governed by the CeCILL-C licence
+!MNH_LIC version 1. See LICENSE, CeCILL-C_V1-en.txt and CeCILL-C_V1-fr.txt
+!MNH_LIC for details. version 1.
+!-----------------------------------------------------------------
+!     ######################
+      MODULE MODI_GRADIENT_V
+!     ######################
+!
+IMPLICIT NONE
+INTERFACE
+!
+!           
+FUNCTION GY_V_M(PA,PDYY,PDZZ,PDZY, KKA, KKU, KL)      RESULT(PGY_V_M)
+IMPLICIT NONE
+!
+INTEGER,              INTENT(IN),OPTIONAL     :: KKA, KKU ! near ground and uppest atmosphere array indexes
+INTEGER,              INTENT(IN),OPTIONAL     :: KL     ! +1 if grid goes from ground to atmosphere top, -1 otherwise
+REAL, DIMENSION(:,:,:),  INTENT(IN)  :: PA      ! variable at the V point
+REAL, DIMENSION(:,:,:),  INTENT(IN)  :: PDYY    ! metric coefficient dyy
+REAL, DIMENSION(:,:,:),  INTENT(IN)  :: PDZZ    ! metric coefficient dzz
+REAL, DIMENSION(:,:,:),  INTENT(IN)  :: PDZY    ! metric coefficient dzy
+!
+REAL, DIMENSION(SIZE(PA,1),SIZE(PA,2),SIZE(PA,3)) :: PGY_V_M ! result mass point
+!
+END FUNCTION GY_V_M
+!           
+FUNCTION GX_V_UV(PA,PDXX,PDZZ,PDZX, KKA, KKU, KL)      RESULT(PGX_V_UV)
+IMPLICIT NONE
+!
+INTEGER,              INTENT(IN),OPTIONAL     :: KKA, KKU ! near ground and uppest atmosphere array indexes
+INTEGER,              INTENT(IN),OPTIONAL     :: KL     ! +1 if grid goes from ground to atmosphere top, -1 otherwise
+REAL, DIMENSION(:,:,:),  INTENT(IN)  :: PA      ! variable at the V point
+REAL, DIMENSION(:,:,:),  INTENT(IN)  :: PDXX    ! metric coefficient dxx
+REAL, DIMENSION(:,:,:),  INTENT(IN)  :: PDZZ    ! metric coefficient dzz
+REAL, DIMENSION(:,:,:),  INTENT(IN)  :: PDZX    ! metric coefficient dzx
+!
+REAL, DIMENSION(SIZE(PA,1),SIZE(PA,2),SIZE(PA,3)) :: PGX_V_UV ! result UV point
+!
+END FUNCTION GX_V_UV
+!
+!           
+FUNCTION GZ_V_VW(PA,PDZZ, KKA, KKU, KL)      RESULT(PGZ_V_VW)
+IMPLICIT NONE
+!
+INTEGER,              INTENT(IN),OPTIONAL     :: KKA, KKU ! near ground and uppest atmosphere array indexes
+INTEGER,              INTENT(IN),OPTIONAL     :: KL     ! +1 if grid goes from ground to atmosphere top, -1 otherwise
+REAL, DIMENSION(:,:,:),  INTENT(IN)  :: PA      ! variable at the V point
+REAL, DIMENSION(:,:,:),  INTENT(IN)  :: PDZZ    ! metric coefficient dzz
+!
+REAL, DIMENSION(SIZE(PA,1),SIZE(PA,2),SIZE(PA,3)) :: PGZ_V_VW ! result VW point
+!
+END FUNCTION GZ_V_VW
+!
+!
+END INTERFACE
+!
+END MODULE MODI_GRADIENT_V
+!
+!
+!
+!     #######################################################
+      FUNCTION GY_V_M(PA,PDYY,PDZZ,PDZY, KKA, KKU, KL)      RESULT(PGY_V_M)
+!     #######################################################
+!
+!!****  *GY_V_M* - Cartesian Gradient operator: 
+!!                          computes the gradient in the cartesian Y
+!!                          direction for a variable placed at the 
+!!                          V point and the result is placed at
+!!                          the mass point.
+!!    PURPOSE
+!!    -------
+!       The purpose of this function is to compute the discrete gradient 
+!     along the Y cartesian direction for a field PA placed at the 
+!     V point. The result is placed at the mass point.
+!
+!
+!                       (          ______________z )
+!                       (          (___________y ) )
+!                    1  (          (d*zy dzm(PA) ) ) 
+!      PGY_V_M =   ---- (dyf(PA) - (------------)) )
+!                  ___y (          (             ) )
+!                  d*yy (          (      d*zz   ) )     
+!
+!       
+!!**  METHOD
+!!    ------
+!!      The Chain rule of differencing is applied to variables expressed
+!!    in the Gal-Chen & Somerville coordinates to obtain the gradient in
+!!    the cartesian system
+!!        
+!!    EXTERNAL
+!!    --------
+!!      MYF,MZF         : Shuman functions (mean operators)
+!!      DYF,DZF         : Shuman functions (finite difference operators)
+!!
+!!    IMPLICIT ARGUMENTS
+!!    ------------------
+!!      NONE
+!!
+!!    REFERENCE
+!!    ---------
+!!      Book2 of documentation of Meso-NH (GRAD_CAR operators)
+!!      A Turbulence scheme for the Meso-NH model (Chapter 6)
+!!
+!!    AUTHOR
+!!    ------
+!!      Joan Cuxart        *INM and Meteo-France*
+!!
+!!    MODIFICATIONS
+!!    -------------
+!!      Original    19/07/94
+!!                  18/10/00 (V.Masson) add LFLAT switch
+!-------------------------------------------------------------------------
+!
+!*       0.    DECLARATIONS
+!
+!
+USE MODI_SHUMAN
+USE MODD_CONF
+!
+IMPLICIT NONE
+!
+!
+!*       0.1   declarations of arguments and result
+!
+INTEGER,                 INTENT(IN),OPTIONAL  :: KKA, KKU ! near ground and uppest atmosphere array indexes
+INTEGER,                 INTENT(IN),OPTIONAL  :: KL     ! +1 if grid goes from ground to atmosphere top, -1 otherwise
+REAL, DIMENSION(:,:,:),  INTENT(IN)  :: PA      ! variable at the V point
+REAL, DIMENSION(:,:,:),  INTENT(IN)  :: PDYY    ! metric coefficient dyy
+REAL, DIMENSION(:,:,:),  INTENT(IN)  :: PDZZ    ! metric coefficient dzz
+REAL, DIMENSION(:,:,:),  INTENT(IN)  :: PDZY    ! metric coefficient dzy
+!
+REAL, DIMENSION(SIZE(PA,1),SIZE(PA,2),SIZE(PA,3)) :: PGY_V_M ! result mass point
+!
+!
+!*       0.2   declaration of local variables
+!
+!              NONE
+!
+!----------------------------------------------------------------------------
+!
+!*       1.    DEFINITION of GY_V_M
+!              --------------------
+!
+IF (.NOT. LFLAT) THEN
+  PGY_V_M(:,:,:)= (DYF(PA)        -                      &
+                   MZF( MYF(PDZY*DZM(PA))/PDZZ )         &
+                  ) / MYF(PDYY)
+ELSE
+  PGY_V_M(:,:,:)= DYF(PA) / MYF(PDYY)
+END IF
+!
+!----------------------------------------------------------------------------
+!
+END FUNCTION GY_V_M
+!
+! 
+!     #########################################################
+      FUNCTION GX_V_UV(PA,PDXX,PDZZ,PDZX, KKA, KKU, KL)      RESULT(PGX_V_UV)
+!     #########################################################
+!
+!!****  *GX_V_UV* - Cartesian Gradient operator: 
+!!                          computes the gradient in the cartesian X
+!!                          direction for a variable placed at the 
+!!                          V point and the result is placed at
+!!                          the UV vorticity point.
+!!    PURPOSE
+!!    -------
+!       The purpose of this function is to compute the discrete gradient 
+!     along the X cartesian direction for a field PA placed at the 
+!     V point. The result is placed at the UV vorticity point.
+!
+!
+!                       (          _________________z )
+!                       (          (___y _________x ) )
+!                    1  (          (d*zx (dzm(PA))) ) )
+!      PGX_V_UV=   ---- (dxm(PA) - (     (------  ) ) )
+!                  ___y (          (     ( ___y   ) ) )
+!                  d*xx (          (     ( d*zz   ) ) )    
+!
+!       
+!
+!!**  METHOD
+!!    ------
+!!      The Chain rule of differencing is applied to variables expressed
+!!    in the Gal-Chen & Somerville coordinates to obtain the gradient in
+!!    the cartesian system
+!!        
+!!    EXTERNAL
+!!    --------
+!!      MXM,MZF,MYM     : Shuman functions (mean operators)
+!!      DXM,DZM         : Shuman functions (finite difference operators)
+!!
+!!    IMPLICIT ARGUMENTS
+!!    ------------------
+!!      NONE
+!!
+!!    REFERENCE
+!!    ---------
+!!      Book2 of documentation of Meso-NH (GRAD_CAR operators)
+!!      A Turbulence scheme for the Meso-NH model (Chapter 6)
+!!
+!!    AUTHOR
+!!    ------
+!!      Joan Cuxart        *INM and Meteo-France*
+!!
+!!    MODIFICATIONS
+!!    -------------
+!!      Original    20/07/94
+!!                  18/10/00 (V.Masson) add LFLAT switch
+!-------------------------------------------------------------------------
+!
+!*       0.    DECLARATIONS
+!
+!
+USE MODI_SHUMAN
+USE MODD_CONF
+!
+IMPLICIT NONE
+!
+!
+!*       0.1   declarations of arguments and result
+!
+INTEGER,                 INTENT(IN),OPTIONAL  :: KKA, KKU ! near ground and uppest atmosphere array indexes
+INTEGER,                 INTENT(IN),OPTIONAL  :: KL     ! +1 if grid goes from ground to atmosphere top, -1 otherwise
+REAL, DIMENSION(:,:,:),  INTENT(IN)  :: PA      ! variable at the V point
+REAL, DIMENSION(:,:,:),  INTENT(IN)  :: PDXX    ! metric coefficient dxx
+REAL, DIMENSION(:,:,:),  INTENT(IN)  :: PDZZ    ! metric coefficient dzz
+REAL, DIMENSION(:,:,:),  INTENT(IN)  :: PDZX    ! metric coefficient dzx
+!
+REAL, DIMENSION(SIZE(PA,1),SIZE(PA,2),SIZE(PA,3)) :: PGX_V_UV ! result UV point
+!
+!
+!*       0.2   declaration of local variables
+!
+!              NONE
+!
+!----------------------------------------------------------------------------
+!
+!*       1.    DEFINITION of GX_V_UV
+!              ---------------------
+!
+IF (.NOT. LFLAT) THEN
+  PGX_V_UV(:,:,:)= ( DXM(PA)- MZF( MXM( DZM(PA)/&
+                    MYM(PDZZ) ) *MYM(PDZX) )   )   / MYM(PDXX)
+ELSE
+  PGX_V_UV(:,:,:)= DXM(PA) / MYM(PDXX)
+END IF
+!
+!----------------------------------------------------------------------------
+!
+END FUNCTION GX_V_UV
+!
+!
+!     #######################################################
+      FUNCTION GZ_V_VW(PA,PDZZ, KKA, KKU, KL)      RESULT(PGZ_V_VW)
+!     #######################################################
+!
+!!****  *GZ_V_VW - Cartesian Gradient operator: 
+!!                          computes the gradient in the cartesian Z
+!!                          direction for a variable placed at the 
+!!                          V point and the result is placed at
+!!                          the VW vorticity point.
+!!    PURPOSE
+!!    -------
+!       The purpose of this function is to compute the discrete gradient 
+!     along the Z cartesian direction for a field PA placed at the 
+!     V point. The result is placed at the VW vorticity point.
+!
+!
+!                   dzm(PA) 
+!      PGZ_V_VW =   ------  
+!                    ____y
+!                    d*zz   
+!
+!!**  METHOD
+!!    ------
+!!      The Chain rule of differencing is applied to variables expressed
+!!    in the Gal-Chen & Somerville coordinates to obtain the gradient in
+!!    the cartesian system
+!!        
+!!    EXTERNAL
+!!    --------
+!!      MYM     : Shuman functions (mean operators)
+!!      DZM     : Shuman functions (finite difference operators)
+!!
+!!    IMPLICIT ARGUMENTS
+!!    ------------------
+!!      NONE
+!!
+!!    REFERENCE
+!!    ---------
+!!      Book2 of documentation of Meso-NH (GRAD_CAR operators)
+!!      A Turbulence scheme for the Meso-NH model (Chapter 6)
+!!
+!!    AUTHOR
+!!    ------
+!!      Joan Cuxart        *INM and Meteo-France*
+!!
+!!    MODIFICATIONS
+!!    -------------
+!!      Original    20/07/94
+!-------------------------------------------------------------------------
+!
+!*       0.    DECLARATIONS
+!
+!
+USE MODI_SHUMAN
+!
+IMPLICIT NONE
+!
+!
+!*       0.1   declarations of arguments and result
+!
+INTEGER,              INTENT(IN),OPTIONAL     :: KKA, KKU ! near ground and uppest atmosphere array indexes
+INTEGER,              INTENT(IN),OPTIONAL     :: KL     ! +1 if grid goes from ground to atmosphere top, -1 otherwise
+REAL, DIMENSION(:,:,:),  INTENT(IN)  :: PA      ! variable at the V point
+REAL, DIMENSION(:,:,:),  INTENT(IN)  :: PDZZ    ! metric coefficient dzz
+!
+REAL, DIMENSION(SIZE(PA,1),SIZE(PA,2),SIZE(PA,3)) :: PGZ_V_VW ! result VW point
+!
+!
+!*       0.2   declaration of local variables
+!
+!              NONE
+!
+!----------------------------------------------------------------------------
+!
+!*       1.    DEFINITION of GZ_V_VW
+!              ---------------------
+!
+PGZ_V_VW(:,:,:)= DZM(PA) / MYM(PDZZ)
+!
+!----------------------------------------------------------------------------
+!
+END FUNCTION GZ_V_VW
diff --git a/src/PHYEX/aux/gradient_w.f90 b/src/PHYEX/aux/gradient_w.f90
new file mode 100644
index 0000000000000000000000000000000000000000..5ca99724eb71d7dc42e1130af2cfd17848fd3975
--- /dev/null
+++ b/src/PHYEX/aux/gradient_w.f90
@@ -0,0 +1,313 @@
+!MNH_LIC Copyright 1994-2020 CNRS, Meteo-France and Universite Paul Sabatier
+!MNH_LIC This is part of the Meso-NH software governed by the CeCILL-C licence
+!MNH_LIC version 1. See LICENSE, CeCILL-C_V1-en.txt and CeCILL-C_V1-fr.txt
+!MNH_LIC for details. version 1.
+!-----------------------------------------------------------------
+!     ######################
+      MODULE MODI_GRADIENT_W
+!     ######################
+!
+IMPLICIT NONE
+INTERFACE
+!
+!            
+FUNCTION GZ_W_M(PA,PDZZ, KKA, KKU, KL)      RESULT(PGZ_W_M)
+IMPLICIT NONE
+!
+INTEGER,              INTENT(IN),OPTIONAL     :: KKA, KKU ! near ground and uppest atmosphere array indexes
+INTEGER,              INTENT(IN),OPTIONAL     :: KL     ! +1 if grid goes from ground to atmosphere top, -1 otherwise
+REAL, DIMENSION(:,:,:),  INTENT(IN)  :: PA      ! variable at the W point
+REAL, DIMENSION(:,:,:),  INTENT(IN)  :: PDZZ    ! metric coefficient dzz
+!
+REAL, DIMENSION(SIZE(PA,1),SIZE(PA,2),SIZE(PA,3)) :: PGZ_W_M ! result mass point
+!
+END FUNCTION GZ_W_M
+!            
+FUNCTION GX_W_UW(PA,PDXX,PDZZ,PDZX, KKA, KKU, KL)      RESULT(PGX_W_UW)
+IMPLICIT NONE
+!
+INTEGER,              INTENT(IN),OPTIONAL     :: KKA, KKU ! near ground and uppest atmosphere array indexes
+INTEGER,              INTENT(IN),OPTIONAL     :: KL     ! +1 if grid goes from ground to atmosphere top, -1 otherwise
+REAL, DIMENSION(:,:,:),  INTENT(IN)  :: PA      ! variable at the W point
+REAL, DIMENSION(:,:,:),  INTENT(IN)  :: PDXX    ! metric coefficient dxx
+REAL, DIMENSION(:,:,:),  INTENT(IN)  :: PDZZ    ! metric coefficient dzz
+REAL, DIMENSION(:,:,:),  INTENT(IN)  :: PDZX    ! metric coefficient dzx
+!
+REAL, DIMENSION(SIZE(PA,1),SIZE(PA,2),SIZE(PA,3)) :: PGX_W_UW ! result UW point
+!
+END FUNCTION GX_W_UW
+!
+!            
+FUNCTION GY_W_VW(PA,PDYY,PDZZ,PDZY, KKA, KKU, KL)      RESULT(PGY_W_VW)
+IMPLICIT NONE
+!
+INTEGER,              INTENT(IN),OPTIONAL     :: KKA, KKU ! near ground and uppest atmosphere array indexes
+INTEGER,              INTENT(IN),OPTIONAL     :: KL     ! +1 if grid goes from ground to atmosphere top, -1 otherwise
+REAL, DIMENSION(:,:,:),  INTENT(IN)  :: PA      ! variable at the W point
+REAL, DIMENSION(:,:,:),  INTENT(IN)  :: PDYY    ! metric coefficient dyy
+REAL, DIMENSION(:,:,:),  INTENT(IN)  :: PDZZ    ! metric coefficient dzz
+REAL, DIMENSION(:,:,:),  INTENT(IN)  :: PDZY    ! metric coefficient dzy
+!
+REAL, DIMENSION(SIZE(PA,1),SIZE(PA,2),SIZE(PA,3)) :: PGY_W_VW ! result VW point
+!
+END FUNCTION GY_W_VW
+!
+!
+END INTERFACE
+!
+END MODULE MODI_GRADIENT_W
+!
+!
+!
+!     #######################################################
+      FUNCTION GZ_W_M(PA,PDZZ, KKA, KKU, KL)      RESULT(PGZ_W_M)
+!     #######################################################
+!
+!!****  *GZ_W_M* - Cartesian Gradient operator: 
+!!                          computes the gradient in the cartesian Z
+!!                          direction for a variable placed at the 
+!!                          W point and the result is placed at
+!!                          the mass point.
+!!    PURPOSE
+!!    -------
+!       The purpose of this function is to compute the discrete gradient 
+!     along the Z cartesian direction for a field PA placed at the 
+!     W point. The result is placed at the mass point.
+!
+!!**  METHOD
+!!    ------
+!!      The Chain rule of differencing is applied to variables expressed
+!!    in the Gal-Chen & Somerville coordinates to obtain the gradient in
+!!    the cartesian system
+!!        
+!!    EXTERNAL
+!!    --------
+!!      MZF     : Shuman functions (mean operators)
+!!      DZF     : Shuman functions (finite difference operators)
+!!
+!!    IMPLICIT ARGUMENTS
+!!    ------------------
+!!      NONE
+!!
+!!    REFERENCE
+!!    ---------
+!!      Book2 of documentation of Meso-NH (GRAD_CAR operators)
+!!      A Turbulence scheme for the Meso-NH model (Chapter 6)
+!!
+!!    AUTHOR
+!!    ------
+!!      Joan Cuxart        *INM and Meteo-France*
+!!
+!!    MODIFICATIONS
+!!    -------------
+!!      Original    19/07/94
+!-------------------------------------------------------------------------
+!
+!*       0.    DECLARATIONS
+!
+!
+USE MODI_SHUMAN
+!
+IMPLICIT NONE
+!
+!
+!*       0.1   declarations of arguments and result
+!
+INTEGER,                 INTENT(IN),OPTIONAL  :: KKA, KKU ! near ground and uppest atmosphere array indexes
+INTEGER,                 INTENT(IN),OPTIONAL  :: KL     ! +1 if grid goes from ground to atmosphere top, -1 otherwise
+REAL, DIMENSION(:,:,:),  INTENT(IN)  :: PA      ! variable at the W point
+REAL, DIMENSION(:,:,:),  INTENT(IN)  :: PDZZ    ! metric coefficient dzz
+!
+REAL, DIMENSION(SIZE(PA,1),SIZE(PA,2),SIZE(PA,3)) :: PGZ_W_M ! result mass point
+!
+!
+!*       0.2   declaration of local variables
+!
+!              NONE
+!
+!----------------------------------------------------------------------------
+!
+!*       1.    DEFINITION of GZ_W_M
+!              --------------------
+!
+PGZ_W_M(:,:,:)= DZF(PA(:,:,:))/(MZF(PDZZ(:,:,:)))
+!
+!----------------------------------------------------------------------------
+!
+END FUNCTION GZ_W_M
+!
+!
+!     #########################################################
+      FUNCTION GX_W_UW(PA,PDXX,PDZZ,PDZX, KKA, KKU, KL)      RESULT(PGX_W_UW)
+!     #########################################################
+!
+!!****  *GX_W_UW* - Cartesian Gradient operator: 
+!!                          computes the gradient in the cartesian X
+!!                          direction for a variable placed at the 
+!!                          V point and the result is placed at
+!!                          the UW vorticity point.
+!!    PURPOSE
+!!    -------
+!       The purpose of this function is to compute the discrete gradient 
+!     along the X cartesian direction for a field PA placed at the 
+!     W point. The result is placed at the UW vorticity point.
+!
+!!**  METHOD
+!!    ------
+!!      The Chain rule of differencing is applied to variables expressed
+!!    in the Gal-Chen & Somerville coordinates to obtain the gradient in
+!!    the cartesian system
+!!        
+!!    EXTERNAL
+!!    --------
+!!      MXM,MZM,MZF     : Shuman functions (mean operators)
+!!      DXM,DZM         : Shuman functions (finite difference operators)
+!!
+!!    IMPLICIT ARGUMENTS
+!!    ------------------
+!!      NONE
+!!
+!!    REFERENCE
+!!    ---------
+!!      Book2 of documentation of Meso-NH (GRAD_CAR operators)
+!!      A Turbulence scheme for the Meso-NH model (Chapter 6)
+!!
+!!    AUTHOR
+!!    ------
+!!      Joan Cuxart        *INM and Meteo-France*
+!!
+!!    MODIFICATIONS
+!!    -------------
+!!      Original    20/07/94
+!!                  18/10/00 (V.Masson) add LFLAT switch
+!-------------------------------------------------------------------------
+!
+!*       0.    DECLARATIONS
+!
+!
+USE MODI_SHUMAN
+USE MODD_CONF
+!
+IMPLICIT NONE
+!
+!
+!*       0.1   declarations of arguments and result
+!
+INTEGER,                 INTENT(IN),OPTIONAL  :: KKA, KKU ! near ground and uppest atmosphere array indexes
+INTEGER,                 INTENT(IN),OPTIONAL  :: KL     ! +1 if grid goes from ground to atmosphere top, -1 otherwise
+REAL, DIMENSION(:,:,:),  INTENT(IN)  :: PA      ! variable at the W point
+REAL, DIMENSION(:,:,:),  INTENT(IN)  :: PDXX    ! metric coefficient dxx
+REAL, DIMENSION(:,:,:),  INTENT(IN)  :: PDZZ    ! metric coefficient dzz
+REAL, DIMENSION(:,:,:),  INTENT(IN)  :: PDZX    ! metric coefficient dzx
+!
+REAL, DIMENSION(SIZE(PA,1),SIZE(PA,2),SIZE(PA,3)) :: PGX_W_UW ! result UW point
+!
+!
+!*       0.2   declaration of local variables
+!
+!              NONE
+!
+!----------------------------------------------------------------------------
+!
+!*       1.    DEFINITION of GX_W_UW
+!              ---------------------
+!
+IF (.NOT. LFLAT) THEN
+  PGX_W_UW(:,:,:)= DXM(PA(:,:,:))/(MZM(PDXX(:,:,:)))    &
+                 -DZM(MXM(MZF(PA(:,:,:))))*PDZX(:,:,:)  &
+                  /( MZM(PDXX(:,:,:))*MXM(PDZZ(:,:,:)) )
+ELSE
+  PGX_W_UW(:,:,:)= DXM(PA(:,:,:))/(MZM(PDXX(:,:,:)))
+END IF
+!
+!----------------------------------------------------------------------------
+!
+END FUNCTION GX_W_UW
+!
+!
+!     #########################################################
+      FUNCTION GY_W_VW(PA,PDYY,PDZZ,PDZY, KKA, KKU, KL)      RESULT(PGY_W_VW)
+!     #########################################################
+!
+!!****  *GY_W_VW* - Cartesian Gradient operator: 
+!!                          computes the gradient in the cartesian Y
+!!                          direction for a variable placed at the 
+!!                          W point and the result is placed at
+!!                          the VW vorticity point.
+!!    PURPOSE
+!!    -------
+!       The purpose of this function is to compute the discrete gradient 
+!     along the Y cartesian direction for a field PA placed at the 
+!     W point. The result is placed at the VW vorticity point.
+!
+!!**  METHOD
+!!    ------
+!!      The Chain rule of differencing is applied to variables expressed
+!!    in the Gal-Chen & Somerville coordinates to obtain the gradient in
+!!    the cartesian system
+!!        
+!!    EXTERNAL
+!!    --------
+!!      MYM,MZM,MZF     : Shuman functions (mean operators)
+!!      DYM,DZM         : Shuman functions (finite difference operators)
+!!
+!!    IMPLICIT ARGUMENTS
+!!    ------------------
+!!      NONE
+!!
+!!    REFERENCE
+!!    ---------
+!!      Book2 of documentation of Meso-NH (GRAD_CAR operators)
+!!      A Turbulence scheme for the Meso-NH model (Chapter 6)
+!!
+!!    AUTHOR
+!!    ------
+!!      Joan Cuxart        *INM and Meteo-France*
+!!
+!!    MODIFICATIONS
+!!    -------------
+!!      Original    20/07/94
+!!                  18/10/00 (V.Masson) add LFLAT switch
+!-------------------------------------------------------------------------
+!
+!*       0.    DECLARATIONS
+!
+!
+USE MODI_SHUMAN
+USE MODD_CONF
+!
+IMPLICIT NONE
+!
+!
+!*       0.1   declarations of arguments and result
+!
+INTEGER,              INTENT(IN),OPTIONAL     :: KKA, KKU ! near ground and uppest atmosphere array indexes
+INTEGER,              INTENT(IN),OPTIONAL     :: KL     ! +1 if grid goes from ground to atmosphere top, -1 otherwise
+REAL, DIMENSION(:,:,:),  INTENT(IN)  :: PA      ! variable at the W point
+REAL, DIMENSION(:,:,:),  INTENT(IN)  :: PDYY    ! metric coefficient dxx
+REAL, DIMENSION(:,:,:),  INTENT(IN)  :: PDZZ    ! metric coefficient dzz
+REAL, DIMENSION(:,:,:),  INTENT(IN)  :: PDZY    ! metric coefficient dzx
+!
+REAL, DIMENSION(SIZE(PA,1),SIZE(PA,2),SIZE(PA,3)) :: PGY_W_VW ! result VW point
+!
+!
+!*       0.2   declaration of local variables
+!
+!              NONE
+!
+!----------------------------------------------------------------------------
+!
+!*       1.    DEFINITION of GY_W_VW
+!              ---------------------
+!
+IF (.NOT. LFLAT) THEN
+  PGY_W_VW(:,:,:)= DYM(PA(:,:,:))/(MZM(PDYY(:,:,:)))    &
+                 -DZM(MYM(MZF(PA(:,:,:))))*PDZY(:,:,:)  &
+                  /( MZM(PDYY(:,:,:))*MYM(PDZZ(:,:,:)) )
+ELSE
+  PGY_W_VW(:,:,:)= DYM(PA(:,:,:))/(MZM(PDYY(:,:,:)))
+END IF
+!
+!----------------------------------------------------------------------------
+!
+END FUNCTION GY_W_VW
diff --git a/src/PHYEX/aux/modd_cst.f90 b/src/PHYEX/aux/modd_cst.f90
new file mode 100644
index 0000000000000000000000000000000000000000..35ae497930324b5dd9f586e3380c13966da0cad4
--- /dev/null
+++ b/src/PHYEX/aux/modd_cst.f90
@@ -0,0 +1,317 @@
+!MNH_LIC Copyright 1994-2023 CNRS, Meteo-France and Universite Paul Sabatier
+!MNH_LIC This is part of the Meso-NH software governed by the CeCILL-C licence
+!MNH_LIC version 1. See LICENSE, CeCILL-C_V1-en.txt and CeCILL-C_V1-fr.txt
+!MNH_LIC for details. version 1.
+!-----------------------------------------------------------------
+!     ###############
+      MODULE MODD_CST
+!     ###############
+!
+!!****  *MODD_CST* - declaration of Physic constants 
+!!
+!!    PURPOSE
+!!    -------
+!       The purpose of this declarative module is to declare  the 
+!     Physics constants.
+!
+!!
+!!**  IMPLICIT ARGUMENTS
+!!    ------------------
+!!      None 
+!!
+!!    REFERENCE
+!!    ---------
+!!      Book2 of documentation of Meso-NH (MODD_CST)
+!!          
+!!    AUTHOR
+!!    ------
+!!      V. Ducrocq   *Meteo France*
+!!
+!!    MODIFICATIONS
+!!    -------------
+!!      Original    16/05/94  
+!!      J. Stein    02/01/95  add xrholw                    
+!!      J.-P. Pinty 13/12/95  add XALPI,XBETAI,XGAMI
+!!      J. Stein    25/07/97  add XTH00                    
+!!      V. Masson   05/10/98  add XRHOLI
+!!      C. Mari     31/10/00  add NDAYSEC
+!!      V. Masson   01/03/03  add conductivity of ice
+!!      R. El Khatib 04/08/14 add pre-computed quantities
+!!      J.Escobar : 10/2017 : for real*4 , add XMNH_HUGE_12_LOG
+!  J.L. Redelsperger 03/2021: add constants for ocean penetrating solar
+!  S. Riette      01/2022: introduction of a structure
+!  P. Wautelet 20/05/2022: add RASTA cloud radar wavelength
+!-------------------------------------------------------------------------------
+!
+!*       0.   DECLARATIONS
+!             ------------
+!
+IMPLICIT NONE 
+
+REAL, PARAMETER :: XLAM_CRAD = 3.154E-3 ! RASTA cloud radar wavelength (m) <=> 95.04 GHz
+
+TYPE CST_t
+  !
+  !*       1.     FUNDAMENTAL CONSTANTS
+  !	        ---------------------
+  REAL :: XPI                !< Pi
+  REAL :: XKARMAN            !< von karman constant
+  REAL :: XLIGHTSPEED        !< light speed
+  REAL :: XPLANCK            !< Planck constant
+  REAL :: XBOLTZ             !< Boltzman constant
+  REAL :: XAVOGADRO          !< Avogadro number
+  !
+  !*       2.     ASTRONOMICAL CONSTANTS
+  !	        ----------------------
+  REAL :: XDAY,XSIYEA,XSIDAY !< day duration, sideral year duration, sideral day duration
+  INTEGER :: NDAYSEC         !< Number of seconds in a day
+  REAL :: XOMEGA             !< Earth rotation
+  !
+  !*       3.     TERRESTRIAL GEOIDE CONSTANTS
+  !	        ----------------------------
+  REAL :: XRADIUS            !< Earth radius
+  REAL :: XG                 !< Gravity constant
+  !
+  !*       4.     REFERENCE PRESSURE
+  !	        -------------------
+  REAL :: XP00               !< Reference pressure
+  REAL :: XP00OCEAN          !< Reference pressure for ocean model
+  REAL :: XRH00OCEAN         !< Reference density for ocean model
+  REAL :: XTH00              !< reference value  for the potential temperature
+  REAL :: XTH00OCEAN         !< Ref value for pot temp in ocean model
+  REAL :: XSA00OCEAN         !< Ref value for SAlinity in ocean model
+  !
+  !*       5.     RADIATION CONSTANTS
+  !	        -------------------
+  REAL :: XSTEFAN,XI0        !< Stefan-Boltzman constant, solar constant
+  !
+  !*       6.     THERMODYNAMIC CONSTANTS
+  !	        -----------------------
+  REAL :: XMD,XMV            !< Molar mass of dry air and molar mass of vapor
+  REAL :: XRD,XRV            !< Gaz constant for dry air, gaz constant for vapor
+  REAL :: XEPSILO            !< XMV/XMD
+  REAL :: XCPD,XCPV          !< Cpd (dry air), Cpv (vapor)
+  REAL :: XRHOLW             !< Volumic mass of liquid water
+  REAL :: XCL,XCI            !< Cl (liquid), Ci (ice)
+  REAL :: XTT                !< Triple point temperature
+  REAL :: XLVTT              !< Vaporization heat constant
+  REAL :: XLSTT              !< Sublimation heat constant
+  REAL :: XLMTT              !< Melting heat constant
+  REAL :: XESTT              !< Saturation vapor pressure  at triple point temperature
+  REAL :: XALPW,XBETAW,XGAMW !< Constants for saturation vapor pressure function
+  REAL :: XALPI,XBETAI,XGAMI !< Constants for saturation vapor pressure function over solid ice
+  REAL :: XCONDI             !< thermal conductivity of ice (W m-1 K-1)
+  REAL :: XALPHAOC           !< thermal expansion coefficient for ocean (K-1)
+  REAL :: XBETAOC            !< Haline contraction coeff for ocean (S-1)
+  REAL :: XROC=0.69          !< coeff for SW penetration in  Ocean (Hoecker et al)
+  REAL :: XD1=1.1            !< coeff for SW penetration in  Ocean (Hoecker et al)
+  REAL :: XD2=23.            !< coeff for SW penetration in  Ocean (Hoecker et al)
+  ! Values used in SURFEX CMO
+  !REAL :: XROC=0.58
+  !REAL :: XD1=0.35
+  !REAL :: XD2=23.
+  REAL :: XRHOLI             !< Volumic mass of ice
+  !
+  !*       7.     PRECOMPUTED CONSTANTS
+  !	        ---------------------
+  REAL :: RDSRV              !< XRD/XRV
+  REAL :: RDSCPD             !< XRD/XCPD
+  REAL :: RINVXP00           !< 1./XP00
+  !
+  !*       8.     MACHINE PRECISION VALUE DEPENDING of REAL4/8 USE
+  !	        ---------------------
+  REAL :: XMNH_TINY          !< minimum real on this machine
+  REAL :: XMNH_TINY_12       !< sqrt(minimum real on this machine)
+  REAL :: XMNH_EPSILON       !< minimum space with 1.0
+  REAL :: XMNH_HUGE          !< maximum real on this machine
+  REAL :: XMNH_HUGE_12_LOG   !< maximum log(sqrt(real)) on this machine
+  REAL :: XEPS_DT            !< default value for DT test
+  REAL :: XRES_FLAT_CART     !< default     flat&cart residual tolerance
+  REAL :: XRES_OTHER         !< default not flat&cart residual tolerance
+  REAL :: XRES_PREP          !< default     prep      residual tolerance
+END TYPE CST_t
+
+TYPE(CST_t), TARGET, SAVE :: CST
+
+REAL, POINTER :: XPI=>NULL()
+REAL, POINTER :: XDAY=>NULL(), XSIYEA=>NULL(), XSIDAY=>NULL()
+REAL, POINTER :: XKARMAN=>NULL()
+REAL, POINTER :: XLIGHTSPEED=>NULL()
+REAL, POINTER :: XPLANCK=>NULL()
+REAL, POINTER :: XBOLTZ=>NULL()
+REAL, POINTER :: XAVOGADRO=>NULL()
+REAL, POINTER :: XRADIUS=>NULL(), XOMEGA=>NULL()
+REAL, POINTER :: XG=>NULL()
+REAL, POINTER :: XP00=>NULL()
+REAL, POINTER :: XP00OCEAN=>NULL()
+REAL, POINTER :: XRH00OCEAN=>NULL()
+REAL, POINTER :: XSTEFAN=>NULL(), XI0=>NULL()
+REAL, POINTER :: XMD=>NULL(), XMV=>NULL()
+REAL, POINTER :: XRD=>NULL(), XRV=>NULL()
+REAL, POINTER :: XEPSILO=>NULL()
+REAL, POINTER :: XCPD=>NULL(), XCPV=>NULL()
+REAL, POINTER :: XRHOLW=>NULL()
+REAL, POINTER :: XCL=>NULL(), XCI=>NULL()
+REAL, POINTER :: XTT=>NULL()
+REAL, POINTER :: XLVTT=>NULL()
+REAL, POINTER :: XLSTT=>NULL()
+REAL, POINTER :: XLMTT=>NULL()
+REAL, POINTER :: XESTT=>NULL()
+REAL, POINTER :: XALPW=>NULL(), XBETAW=>NULL(), XGAMW=>NULL()
+REAL, POINTER :: XALPI=>NULL(), XBETAI=>NULL(), XGAMI=>NULL()
+REAL, POINTER :: XCONDI=>NULL()
+REAL, POINTER :: XALPHAOC=>NULL()
+REAL, POINTER :: XBETAOC=>NULL()
+REAL, POINTER :: XTH00=>NULL()
+REAL, POINTER :: XTH00OCEAN=>NULL()
+REAL, POINTER :: XSA00OCEAN=>NULL()
+REAL, POINTER :: XROC=>NULL()
+REAL, POINTER :: XD1=>NULL()
+REAL, POINTER :: XD2=>NULL()
+REAL, POINTER :: XRHOLI=>NULL()
+INTEGER, POINTER :: NDAYSEC=>NULL()
+REAL, POINTER :: RDSRV=>NULL()
+REAL, POINTER :: RDSCPD=>NULL()
+REAL, POINTER :: RINVXP00=>NULL()
+REAL, POINTER :: XMNH_TINY=>NULL()
+REAL, POINTER :: XMNH_TINY_12=>NULL()
+REAL, POINTER :: XMNH_EPSILON=>NULL()
+REAL, POINTER :: XMNH_HUGE=>NULL()
+REAL, POINTER :: XMNH_HUGE_12_LOG=>NULL()
+REAL, POINTER :: XEPS_DT=>NULL()
+REAL, POINTER :: XRES_FLAT_CART=>NULL()
+REAL, POINTER :: XRES_OTHER=>NULL()
+REAL, POINTER :: XRES_PREP=>NULL()
+!
+CONTAINS
+
+SUBROUTINE CST_ASSOCIATE()
+  IMPLICIT NONE
+  XPI=>CST%XPI
+  XDAY=>CST%XDAY
+  XSIYEA=>CST%XSIYEA
+  XSIDAY=>CST%XSIDAY
+  XKARMAN=>CST%XKARMAN
+  XLIGHTSPEED=>CST%XLIGHTSPEED
+  XPLANCK=>CST%XPLANCK
+  XBOLTZ=>CST%XBOLTZ
+  XAVOGADRO=>CST%XAVOGADRO
+  XRADIUS=>CST%XRADIUS
+  XOMEGA=>CST%XOMEGA
+  XG=>CST%XG
+  XP00=>CST%XP00
+  XP00OCEAN=>CST%XP00OCEAN
+  XRH00OCEAN=>CST%XRH00OCEAN
+  XSTEFAN=>CST%XSTEFAN
+  XI0=>CST%XI0
+  XMD=>CST%XMD
+  XMV=>CST%XMV
+  XRD=>CST%XRD
+  XRV=>CST%XRV
+  XEPSILO=>CST%XEPSILO
+  XCPD=>CST%XCPD
+  XCPV=>CST%XCPV
+  XRHOLW=>CST%XRHOLW
+  XCL=>CST%XCL
+  XCI=>CST%XCI
+  XTT=>CST%XTT
+  XLVTT=>CST%XLVTT
+  XLSTT=>CST%XLSTT
+  XLMTT=>CST%XLMTT
+  XESTT=>CST%XESTT
+  XALPW=>CST%XALPW
+  XBETAW=>CST%XBETAW
+  XGAMW=>CST%XGAMW
+  XALPI=>CST%XALPI
+  XBETAI=>CST%XBETAI
+  XGAMI=>CST%XGAMI
+  XCONDI=>CST%XCONDI
+  XALPHAOC=>CST%XALPHAOC
+  XBETAOC=>CST%XBETAOC
+  XTH00=>CST%XTH00
+  XTH00OCEAN=>CST%XTH00OCEAN
+  XSA00OCEAN=>CST%XSA00OCEAN
+  XROC=>CST%XROC
+  XD1=>CST%XD1
+  XD2=>CST%XD2
+  XRHOLI=>CST%XRHOLI
+  NDAYSEC=>CST%NDAYSEC
+  RDSRV=>CST%RDSRV
+  RDSCPD=>CST%RDSCPD
+  RINVXP00=>CST%RINVXP00
+  XMNH_TINY=>CST%XMNH_TINY
+  XMNH_TINY_12=>CST%XMNH_TINY_12
+  XMNH_EPSILON=>CST%XMNH_EPSILON
+  XMNH_HUGE=>CST%XMNH_HUGE
+  XMNH_HUGE_12_LOG=>CST%XMNH_HUGE_12_LOG
+  XEPS_DT=>CST%XEPS_DT
+  XRES_FLAT_CART=>CST%XRES_FLAT_CART
+  XRES_OTHER=>CST%XRES_OTHER
+  XRES_PREP=>CST%XRES_PREP
+END SUBROUTINE CST_ASSOCIATE
+!
+SUBROUTINE PRINT_CST(KULOUT)
+INTEGER, INTENT(IN) :: KULOUT
+
+WRITE(UNIT=KULOUT,FMT='('' MODD_CST: FUNDAMENTAL CONSTANTS '')')
+WRITE(UNIT=KULOUT,FMT='('' XPI = '',E10.4,'' XKARMAN = '',E10.4,'' XLIGHTSPEED = '',E10.4,/, &
+     &'' XPLANCK = '',E10.4,'' XBOLTZ = '',E10.4,'' XAVOGADRO = '',E10.4)')&
+     &XPI,XKARMAN,XLIGHTSPEED,&
+     &XPLANCK,XBOLTZ,XAVOGADRO
+
+WRITE(UNIT=KULOUT,FMT='('' MODD_CST: ASTRONOMICAL CONSTANTS '')')
+WRITE(UNIT=KULOUT,FMT='('' XDAY = '',E10.4,'' XSIYEA = '',E10.4,'' XSIDAY = '',E10.4,/,&
+     &'' XOMEGA = '',E10.4,'' NDAYSEC = '', I6)')&
+     &XDAY,XSIYEA,XSIDAY,&
+     &XOMEGA,NDAYSEC
+
+WRITE(UNIT=KULOUT,FMT='('' MODD_CST: TERRESTRIAL GEOIDE CONSTANTS '')')
+WRITE(UNIT=KULOUT,FMT='('' XRADIUS = '',E10.4,'' XG = '',E10.4)')&
+     &XRADIUS,XG
+
+WRITE(UNIT=KULOUT,FMT='('' MODD_CST: REFERENCE '')')
+WRITE(UNIT=KULOUT,FMT='('' XRH00OCEAN = '',E10.4,'' XTH00OCEAN = '',E10.4,'' XSA00OCEAN = '',E10.4,/,&
+     &'' XP00OCEAN = '',E10.4,'' XP00 = '',E10.4,'' XTH00 = '',E10.4)')&
+     &XRH00OCEAN,XTH00OCEAN,XSA00OCEAN,&
+     &XP00OCEAN,XP00,XTH00 
+
+WRITE(UNIT=KULOUT,FMT='('' MODD_CST: RADIATION CONSTANTS '')')
+WRITE(UNIT=KULOUT,FMT='('' XSTEFAN = '',E10.4,'' XIO = '',E10.4)')&
+     &XSTEFAN,XI0
+
+WRITE(UNIT=KULOUT,FMT='('' MODD_CST: THERMODYNAMIC CONSTANTS '')')
+WRITE(UNIT=KULOUT,FMT='('' XMD = '',E10.4,'' XMV = '',E10.4,'' XRD = '',E10.4,/,&
+     &'' XRV = '',E10.4,'' XEPSILO = '',E10.4,'' XCPD = '',E10.4,/,&
+     &'' XCPV = '',E10.4,'' XRHOLW = '',E10.4,'' XRHOLI = '',E10.4,/,&
+     &'' XCONDI = '',E10.4,'' XCL = '',E10.4,'' XCI = '',E10.4,/,&
+     &'' XTT = '',E10.4,'' XLVTT = '',E10.4,'' XLSTT = '',E10.4,/,&
+     &'' XLMTT = '',E10.4,'' XESTT = '',E10.4,'' XGAMW = '',E10.4,/,&
+     &'' XBETAW = '',E10.4,'' XALPW = '',E10.4,'' XGAMI = '',E10.4,/,&
+     &'' XBETAI = '',E10.4,'' XALPI = '',E10.4,'' XALPHAOC = '',E10.4,/,&
+     &'' XBETAOC = '',E10.4)')&
+     &XMD,XMV,XRD,&
+     &XRV,XEPSILO,XCPD,&
+     &XCPV,XRHOLW,XRHOLI,&
+     &XCONDI,XCL,XCI,&
+     &XTT,XLVTT,XLSTT,&
+     &XLMTT,XESTT,XGAMW,&
+     &XBETAW,XALPW,XGAMI,&
+     &XBETAI,XALPI,XALPHAOC,&
+     &XBETAOC
+
+WRITE(UNIT=KULOUT,FMT='('' MODD_CST: PRECOMPUTED CONSTANTS '')')
+WRITE(UNIT=KULOUT,FMT='('' RDSRV = '',E10.4,'' RDSCPD = '',E10.4,'' RINVXP00 = '',E10.4)')&
+     &RDSRV,RDSCPD,RINVXP00
+
+WRITE(UNIT=KULOUT,FMT='('' MODD_CST: MACHINE PRECISION VALUE DEPENDING of REAL4/8 USE '')')
+WRITE(UNIT=KULOUT,FMT='('' XMNH_EPSILON = '',E10.4,'' XMNH_HUGE = '',E10.4,'' XMNH_HUGE_12_LOG = '',E10.4,/,&
+     &'' XMNH_TINY = '',E10.4,'' XEPS_DT '',E10.4,'' XRES_FLAT_CART = '',E10.4,/,&
+     &'' XRES_OTHER = '',E10.4,'' XRES_PREP = '',E10.4,'' XMNH_TINY_12 = '',E10.4)')&
+     &XMNH_EPSILON,XMNH_HUGE,XMNH_HUGE_12_LOG,&
+     &XMNH_TINY,XEPS_DT,XRES_FLAT_CART,&
+     &XRES_OTHER,XRES_PREP,XMNH_TINY_12
+!
+END SUBROUTINE PRINT_CST
+!
+END MODULE MODD_CST
+
diff --git a/src/PHYEX/aux/modd_les.f90 b/src/PHYEX/aux/modd_les.f90
new file mode 100644
index 0000000000000000000000000000000000000000..46be47e7a6f647ee51c8b8203bd360283a80e2f7
--- /dev/null
+++ b/src/PHYEX/aux/modd_les.f90
@@ -0,0 +1,1834 @@
+!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 MODD_LES
+!     ###############
+!
+!!****  *MODD_LES* - declaration of prognostic variables
+!!
+!!    PURPOSE
+!!    -------
+!       The purpose of this declarative module is to specify  the
+!     resolved fluxes and the spectra computed in LES mode
+!
+!!
+!!**  IMPLICIT ARGUMENTS
+!!    ------------------
+!!      None
+!!
+!!    REFERENCE
+!!    ---------
+!!      Book2 of documentation of Meso-NH (module MODD_LES)
+!!      Technical Specifications Report of the Meso-NH (chapters 2 and 3)
+!!
+!!
+!!    AUTHOR
+!!    ------
+!!      J. Cuxart   *INM and Meteo France*
+!!
+!!    MODIFICATIONS
+!!    -------------
+!!      Original    March 10, 1995
+!!
+!!       (J.Stein)  Sept. 25, 1995  add the model number in LES mode
+!!       J. Cuxart  Oct.   4, 1996  New time series
+!!       V. Masson  Jan.  20, 2000  New LES routines variables & //
+!!       V. Masson  Nov.   6, 2002  LES budgets
+!!       F. Couvreux Oct   1, 2006  LES PDF
+!!       J.Pergaud   Oct    , 2007  MF LES
+!!       P. Aumond   Oct     ,2009  User multimaskS + 4th order
+!!       C.Lac       Oct     ,2014  Correction on user masks
+!  P. Wautelet 05/2016-04/2018: new data structures and calls for I/O
+!  P. Wautelet 13/09/2019: budget: simplify and modernize date/time management
+!  P. Wautelet 30/03/2021: budgets: LES cartesian subdomain limits are defined in the physical domain
+!-------------------------------------------------------------------------------
+!
+!*       0.   DECLARATIONS
+!             ------------
+!
+USE MODD_PARAMETERS
+!
+IMPLICIT NONE
+!
+PUBLIC :: LES_ALLOCATE_DIM
+INTERFACE LES_ALLOCATE_DIM
+  MODULE PROCEDURE LES_ALLOCATE_1DIMX, LES_ALLOCATE_2DIMX, &
+                   LES_ALLOCATE_3DIMX, LES_ALLOCATE_4DIMX, &
+                   LES_ALLOCATE_3DIML, LES_ALLOCATE_4DIML, &
+                   LES_ALLOCATE_3DIMI, LES_ALLOCATE_1DIMI,  &
+                   LES_ALLOCATE_2DIMC
+END INTERFACE LES_ALLOCATE_DIM
+
+TYPE TLES_t
+!-------------------------------------------------------------------------------
+!
+!* namelist variables
+!
+LOGICAL :: LLES_MEAN      ! flag to activate the mean computations
+LOGICAL :: LLES_RESOLVED  ! flag to activate the resolved var. computations
+LOGICAL :: LLES_SUBGRID   ! flag to activate the subgrid var.  computations
+LOGICAL :: LLES_UPDRAFT   ! flag to activate the computations in updrafts
+LOGICAL :: LLES_DOWNDRAFT ! flag to activate the computations in downdrafts
+LOGICAL :: LLES_SPECTRA   ! flag to activate the spectra computations
+LOGICAL :: LLES_PDF      ! flag to activate the pdf computations
+!
+INTEGER, DIMENSION(900) :: NLES_LEVELS         ! physical model levels for LES comp.
+REAL,    DIMENSION(900) :: XLES_ALTITUDES      ! alt.  levels for LES comp.
+INTEGER, DIMENSION(900) :: NSPECTRA_LEVELS     ! physical model levels for spectra comp.
+REAL,    DIMENSION(900) :: XSPECTRA_ALTITUDES  ! alt.  levels for spectra comp.
+!
+INTEGER, DIMENSION(10) :: NLES_TEMP_SERIE_I   ! I, J and Z point
+INTEGER, DIMENSION(10) :: NLES_TEMP_SERIE_J   ! localizations to
+INTEGER, DIMENSION(10) :: NLES_TEMP_SERIE_Z   ! record temporal data
+
+CHARACTER(LEN=4) :: CLES_NORM_TYPE ! type of turbulence normalization
+CHARACTER(LEN=3) :: CBL_HEIGHT_DEF ! definition of the boundary layer height
+
+REAL :: XLES_TEMP_SAMPLING    ! temporal sampling between each computation
+REAL :: XLES_TEMP_MEAN_START  ! time (in s) from the beginning of the simulation
+REAL :: XLES_TEMP_MEAN_END    ! for start and end of the temporal averaged comp.
+REAL :: XLES_TEMP_MEAN_STEP   ! time step for each averaging
+
+LOGICAL :: LLES_CART_MASK     ! flag to use a cartesian mask
+INTEGER :: NLES_IINF          ! definition of the cartesians mask in physical domain
+INTEGER :: NLES_ISUP          !     for NLES_CART_MODNBR model
+INTEGER :: NLES_JINF          !               "
+INTEGER :: NLES_JSUP          !               "
+LOGICAL :: LLES_NEB_MASK      ! flag to use a 2D nebulosity mask
+LOGICAL :: LLES_CORE_MASK     ! flag to use a 3D cloud core mask
+LOGICAL :: LLES_MY_MASK       ! flag to use its own mask (must be coded by user)
+INTEGER :: NLES_MASKS_USER    ! number of user masks for LES computations
+LOGICAL :: LLES_CS_MASK       ! flag to use conditional sampling mask
+INTEGER :: NPDF         ! number of pdf intervals
+!
+!-------------------------------------------------------------------------------
+!
+INTEGER, DIMENSION(JPMODELMAX) :: NLESn_IINF ! definition of the cartesians mask in physical domain
+INTEGER, DIMENSION(JPMODELMAX) :: NLESn_ISUP !          for all models
+INTEGER, DIMENSION(JPMODELMAX) :: NLESn_JINF !               "
+INTEGER, DIMENSION(JPMODELMAX) :: NLESn_JSUP !               "
+!
+CHARACTER(LEN=4), DIMENSION(2,JPMODELMAX) :: CLES_LBCX
+! X boundary conditions for 2 points correlations computations for all models
+!
+CHARACTER(LEN=4), DIMENSION(2,JPMODELMAX) :: CLES_LBCY
+! Y boundary conditions for 2 points correlations computations for all models
+!
+!-------------------------------------------------------------------------------
+!
+LOGICAL :: LLES               ! flag to compute the LES diagnostics
+!
+LOGICAL :: LLES_CALL          ! flag to compute the LES diagnostics at current
+!                             ! time step
+!
+!
+LOGICAL, DIMENSION(:,:,:), ALLOCATABLE :: LLES_CURRENT_CART_MASK
+! 2D cartesian mask of the current model
+!
+LOGICAL, DIMENSION(:,:,:), ALLOCATABLE :: LLES_CURRENT_NEB_MASK
+! 2D nebulosity mask of the current model
+!
+LOGICAL, DIMENSION(:,:,:), ALLOCATABLE :: LLES_CURRENT_CORE_MASK
+! 2D surface precipitations mask of the current model
+!
+! 2D owner mask of the current model
+LOGICAL, DIMENSION(:,:,:,:), ALLOCATABLE :: LLES_CURRENT_MY_MASKS
+!
+LOGICAL, DIMENSION(:,:,:), ALLOCATABLE :: LLES_CURRENT_CS1_MASK
+LOGICAL, DIMENSION(:,:,:), ALLOCATABLE :: LLES_CURRENT_CS2_MASK
+LOGICAL, DIMENSION(:,:,:), ALLOCATABLE :: LLES_CURRENT_CS3_MASK
+! 2D conditional sampling mask of the current model
+!
+INTEGER :: NLES_CURRENT_TCOUNT
+! current model LES time counter
+!
+INTEGER :: NLES_CURRENT_TIMES
+! current model NLES_TIMES (number of LES samplings)
+!
+INTEGER :: NLES_CURRENT_IINF, NLES_CURRENT_ISUP, NLES_CURRENT_JINF, NLES_CURRENT_JSUP
+! coordinates (in physical domain) for write_diachro, set to NLESn_IINF(current model), etc...
+!
+REAL :: XLES_CURRENT_DOMEGAX, XLES_CURRENT_DOMEGAY
+! minimum wavelength in spectra analysis
+!
+CHARACTER(LEN=4), DIMENSION(2) :: CLES_CURRENT_LBCX
+! current model X boundary conditions for 2 points correlations computations
+!
+CHARACTER(LEN=4), DIMENSION(2) :: CLES_CURRENT_LBCY
+! current model Y boundary conditions for 2 points correlations computations
+!
+REAL, DIMENSION(:),   ALLOCATABLE :: XLES_CURRENT_Z
+! altitudes for diachro
+!
+REAL :: XLES_CURRENT_ZS
+! orography (used for normalization of altitudes)
+!
+INTEGER, DIMENSION(:,:,:), ALLOCATABLE :: NKLIN_CURRENT_LES
+! levels for vertical interpolation
+!
+REAL, DIMENSION(:,:,:), ALLOCATABLE :: XCOEFLIN_CURRENT_LES
+! coefficients for vertical interpolation
+!
+INTEGER, DIMENSION(:,:,:), ALLOCATABLE :: NKLIN_CURRENT_SPEC
+! levels for vertical interpolation
+!
+REAL, DIMENSION(:,:,:), ALLOCATABLE :: XCOEFLIN_CURRENT_SPEC
+! coefficients for vertical interpolation
+!
+REAL,DIMENSION(2) :: XTIME_LES
+! time spent in subgrid LES computations in this time-step in TURB
+!
+!-------------------------------------------------------------------------------
+!
+!* normalization variables
+!
+REAL, DIMENSION(:), ALLOCATABLE :: XLES_NORM_M
+! normalization coefficient for distances (Meters)
+!
+REAL, DIMENSION(:), ALLOCATABLE :: XLES_NORM_K
+! normalization coefficient for temperatures (Kelvin)
+!
+REAL, DIMENSION(:), ALLOCATABLE :: XLES_NORM_S
+! normalization coefficient for times (Seconds)
+!
+REAL, DIMENSION(:), ALLOCATABLE :: XLES_NORM_RHO
+! normalization coefficient for densities
+!
+REAL, DIMENSION(:), ALLOCATABLE :: XLES_NORM_RV
+! normalization coefficient for mixing ratio
+!
+REAL, DIMENSION(:,:), ALLOCATABLE :: XLES_NORM_SV
+! normalization coefficient for scalar variables
+!
+REAL, DIMENSION(:), ALLOCATABLE :: XLES_NORM_P
+! normalization coefficient for pressure
+!
+!-------------------------------------------------------------------------------
+!
+!* monitoring variables
+!
+INTEGER :: NLES_MASKS         ! number of masks for LES computations
+INTEGER :: NLES_K             ! number of vertical levels for local diagnostics
+INTEGER :: NSPECTRA_K         ! number of vertical levels for spectra
+!
+CHARACTER(LEN=1) :: CLES_LEVEL_TYPE     ! type of vertical levels for local diag.
+CHARACTER(LEN=1) :: CSPECTRA_LEVEL_TYPE ! type of vertical levels for spectra
+!
+!-------------------------------------------------------------------------------
+!
+!* subgrid variables for current model
+!
+!                                                                ______
+REAL, DIMENSION(:,:,:), ALLOCATABLE :: X_LES_RES_W_SBG_WThl !  <w'w'Thl'>
+!                                                                _____
+REAL, DIMENSION(:,:,:), ALLOCATABLE :: X_LES_RES_W_SBG_WRt  !  <w'w'Rt'>
+!                                                                _____
+REAL, DIMENSION(:,:,:), ALLOCATABLE :: X_LES_RES_W_SBG_Thl2 !  <w'Thl'2>
+!                                                                ____
+REAL, DIMENSION(:,:,:), ALLOCATABLE :: X_LES_RES_W_SBG_Rt2  !  <w'Rt'2>
+!                                                                _______
+REAL, DIMENSION(:,:,:), ALLOCATABLE :: X_LES_RES_W_SBG_ThlRt!  <w'Thl'Rt'>
+!                                                                _____
+REAL, DIMENSION(:,:,:,:),ALLOCATABLE:: X_LES_RES_W_SBG_WSv  !  <w'w'Sv'>
+!                                                                ____
+REAL, DIMENSION(:,:,:,:),ALLOCATABLE:: X_LES_RES_W_SBG_Sv2 !  <w'Sv'2>
+!
+REAL, DIMENSION(:,:,:), ALLOCATABLE :: XLES_SUBGRID_RCSIGS ! rc sigmas
+!
+REAL, DIMENSION(:,:,:), ALLOCATABLE :: XLES_SUBGRID_RCSIGC ! rc sigmac
+!                                                                            _____
+REAL, DIMENSION(:,:,:), ALLOCATABLE :: X_LES_RES_ddxa_U_SBG_UaU   !  <du'/dxa ua'u'>
+!                                                                            _____
+REAL, DIMENSION(:,:,:), ALLOCATABLE :: X_LES_RES_ddxa_V_SBG_UaV   !  <dv'/dxa ua'v'>
+!                                                                            _____
+REAL, DIMENSION(:,:,:), ALLOCATABLE :: X_LES_RES_ddxa_W_SBG_UaW   !  <dw'/dxa ua'w'>
+!                                                                            _______
+REAL, DIMENSION(:,:,:), ALLOCATABLE :: X_LES_RES_ddxa_W_SBG_UaThl !  <dw'/dxa ua'Thl'>
+!                                                                              _____
+REAL, DIMENSION(:,:,:), ALLOCATABLE :: X_LES_RES_ddxa_Thl_SBG_UaW !  <dThl'/dxa ua'w'>
+!                                                                              ___
+REAL, DIMENSION(:,:,:), ALLOCATABLE :: X_LES_RES_ddz_Thl_SBG_W2   !  <dThl'/dz w'2>
+!                                                                            ______
+REAL, DIMENSION(:,:,:), ALLOCATABLE :: X_LES_RES_ddxa_W_SBG_UaRt  !  <dw'/dxa ua'Rt'>
+!                                                                             _____
+REAL, DIMENSION(:,:,:), ALLOCATABLE :: X_LES_RES_ddxa_Rt_SBG_UaW  !  <dRt'/dxa ua'w'>
+!                                                                             ___
+REAL, DIMENSION(:,:,:), ALLOCATABLE :: X_LES_RES_ddz_Rt_SBG_W2    !  <dRt'/dz w'2>
+!                                                                              ______
+REAL, DIMENSION(:,:,:), ALLOCATABLE :: X_LES_RES_ddxa_Thl_SBG_UaRt!  <dThl'/dxa ua'Rt'>
+!                                                                             _______
+REAL, DIMENSION(:,:,:), ALLOCATABLE :: X_LES_RES_ddxa_Rt_SBG_UaThl!  <dRt'/dxa ua'Thl'>
+!                                                                              _______
+REAL, DIMENSION(:,:,:), ALLOCATABLE :: X_LES_RES_ddxa_Thl_SBG_UaThl! <dThl'/dxa ua'Thl'>
+!                                                                             ______
+REAL, DIMENSION(:,:,:), ALLOCATABLE :: X_LES_RES_ddxa_Rt_SBG_UaRt !  <dRt'/dxa ua'Rt'>
+!                                                                              ______
+REAL, DIMENSION(:,:,:,:), ALLOCATABLE :: X_LES_RES_ddxa_W_SBG_UaSv  ! <dw'/dxa ua'Sv'>
+!                                                                               _____
+REAL, DIMENSION(:,:,:,:), ALLOCATABLE :: X_LES_RES_ddxa_Sv_SBG_UaW  ! <dSv'/dxa ua'w'>
+!                                                                              ___
+REAL, DIMENSION(:,:,:,:), ALLOCATABLE :: X_LES_RES_ddz_Sv_SBG_W2    ! <dSv'/dz w'2>
+!                                                                               ______
+REAL, DIMENSION(:,:,:,:), ALLOCATABLE :: X_LES_RES_ddxa_Sv_SBG_UaSv ! <dSv'/dxa ua'Sv'>
+!
+!                                                            ___
+REAL, DIMENSION(:,:,:), ALLOCATABLE :: X_LES_SUBGRID_U2    ! <u'2>
+!                                                            ___
+REAL, DIMENSION(:,:,:), ALLOCATABLE :: X_LES_SUBGRID_V2    ! <v'2>
+!                                                            ___
+REAL, DIMENSION(:,:,:), ALLOCATABLE :: X_LES_SUBGRID_W2    ! <w'2>
+!                                                            _____
+REAL, DIMENSION(:,:,:), ALLOCATABLE :: X_LES_SUBGRID_Thl2  ! <Thl'2>
+!                                                            ____
+REAL, DIMENSION(:,:,:), ALLOCATABLE :: X_LES_SUBGRID_Rt2   ! <Rt'2>
+!                                                            ____
+REAL, DIMENSION(:,:,:), ALLOCATABLE :: X_LES_SUBGRID_Rc2   ! <Rc'2>
+!                                                            ____
+REAL, DIMENSION(:,:,:), ALLOCATABLE :: X_LES_SUBGRID_Ri2   ! <Ri'2>
+!                                                            _______
+REAL, DIMENSION(:,:,:), ALLOCATABLE :: X_LES_SUBGRID_ThlRt ! <Thl'Rt'>
+!                                                             ____
+REAL, DIMENSION(:,:,:,:),ALLOCATABLE:: X_LES_SUBGRID_Sv2   ! <Sv'2>
+!                                                            ____
+REAL, DIMENSION(:,:,:), ALLOCATABLE :: X_LES_SUBGRID_UV    ! <u'v'>
+!                                                            ____
+REAL, DIMENSION(:,:,:), ALLOCATABLE :: X_LES_SUBGRID_WU    ! <w'u'>
+!                                                            ____
+REAL, DIMENSION(:,:,:), ALLOCATABLE :: X_LES_SUBGRID_WV    ! <w'v'>
+!                                                            ______
+REAL, DIMENSION(:,:,:), ALLOCATABLE :: X_LES_SUBGRID_UThl  ! <u'Thl'>
+!                                                            ______
+REAL, DIMENSION(:,:,:), ALLOCATABLE :: X_LES_SUBGRID_VThl  ! <v'Thl'>
+!                                                            ______
+REAL, DIMENSION(:,:,:), ALLOCATABLE :: X_LES_SUBGRID_WThl  ! <w'Thl'>
+!                                                            _____
+REAL, DIMENSION(:,:,:), ALLOCATABLE :: X_LES_SUBGRID_URt   ! <u'Rt'>
+!                                                            _____
+REAL, DIMENSION(:,:,:), ALLOCATABLE :: X_LES_SUBGRID_VRt   ! <v'Rt'>
+!                                                            _____
+REAL, DIMENSION(:,:,:), ALLOCATABLE :: X_LES_SUBGRID_WRt   ! <w'Rt'>
+!                                                            _____
+REAL, DIMENSION(:,:,:), ALLOCATABLE :: X_LES_SUBGRID_URc   ! <u'Rc'>
+!                                                            _____
+REAL, DIMENSION(:,:,:), ALLOCATABLE :: X_LES_SUBGRID_VRc   ! <v'Rc'>
+!                                                            _____
+REAL, DIMENSION(:,:,:), ALLOCATABLE :: X_LES_SUBGRID_WRc   ! <w'Rc'>
+!                                                            _____
+REAL, DIMENSION(:,:,:,:), ALLOCATABLE :: X_LES_SUBGRID_USv ! <u'Sv'>
+!                                                            _____
+REAL, DIMENSION(:,:,:,:), ALLOCATABLE :: X_LES_SUBGRID_VSv ! <v'Sv'>
+!                                                            _____
+REAL, DIMENSION(:,:,:,:), ALLOCATABLE :: X_LES_SUBGRID_WSv ! <w'Sv'>
+!                                                            ___
+REAL, DIMENSION(:,:,:), ALLOCATABLE :: X_LES_SUBGRID_UTke  ! <u'e>
+!                                                            ___
+REAL, DIMENSION(:,:,:), ALLOCATABLE :: X_LES_SUBGRID_VTke  ! <v'e>
+!                                                            ___
+REAL, DIMENSION(:,:,:), ALLOCATABLE :: X_LES_SUBGRID_WTke  ! <w'e>
+!                                                                   ___
+REAL, DIMENSION(:,:,:), ALLOCATABLE :: X_LES_SUBGRID_ddz_WTke  !  <dw'e/dz>
+!                                                             ______
+REAL, DIMENSION(:,:,:), ALLOCATABLE :: X_LES_SUBGRID_WThv   ! <w'Thv'>
+!                                                             ________
+REAL, DIMENSION(:,:,:), ALLOCATABLE :: X_LES_SUBGRID_ThlThv ! <Thl'Thv'>
+!                                                             _______
+REAL, DIMENSION(:,:,:), ALLOCATABLE :: X_LES_SUBGRID_RtThv  ! <Rt'Thv'>
+!                                                             _______
+REAL, DIMENSION(:,:,:,:),ALLOCATABLE:: X_LES_SUBGRID_SvThv  ! <Sv'Thv'>
+!                                                             ______
+REAL, DIMENSION(:,:,:), ALLOCATABLE :: X_LES_SUBGRID_W2Thl  ! <w'2Thl>
+!                                                              _____
+REAL, DIMENSION(:,:,:), ALLOCATABLE :: X_LES_SUBGRID_W2Rt   ! <w'2Rt>
+!                                                              _____
+REAL, DIMENSION(:,:,:,:),ALLOCATABLE:: X_LES_SUBGRID_W2Sv   ! <w'2Sv>
+!                                                             _______
+REAL, DIMENSION(:,:,:), ALLOCATABLE :: X_LES_SUBGRID_WThlRt ! <w'ThlRt>
+!                                                             ______
+REAL, DIMENSION(:,:,:), ALLOCATABLE :: X_LES_SUBGRID_WThl2  ! <w'Thl2>
+!                                                             _____
+REAL, DIMENSION(:,:,:), ALLOCATABLE :: X_LES_SUBGRID_WRt2   ! <w'Rt2>
+!                                                              _____
+REAL, DIMENSION(:,:,:,:),ALLOCATABLE:: X_LES_SUBGRID_WSv2   ! <w'Sv2>
+!                                                               _______
+REAL, DIMENSION(:,:,:), ALLOCATABLE :: X_LES_SUBGRID_DISS_Tke ! <epsilon>
+!                                                                 ____________
+REAL, DIMENSION(:,:,:), ALLOCATABLE :: X_LES_SUBGRID_DISS_Thl2 ! <epsilon_Thl2>
+!                                                                 ___________
+REAL, DIMENSION(:,:,:), ALLOCATABLE :: X_LES_SUBGRID_DISS_Rt2  ! <epsilon_Rt2>
+!                                                                ______________
+REAL, DIMENSION(:,:,:), ALLOCATABLE :: X_LES_SUBGRID_DISS_ThlRt! <epsilon_ThlRt>
+!                                                                ___________
+REAL, DIMENSION(:,:,:,:),ALLOCATABLE:: X_LES_SUBGRID_DISS_Sv2  ! <epsilon_Sv2>
+!
+REAL, DIMENSION(:,:,:), ALLOCATABLE :: X_LES_SUBGRID_WP     ! <w'p'>
+!
+REAL, DIMENSION(:,:,:), ALLOCATABLE :: X_LES_SUBGRID_ThlPz  ! <Thl'dp'/dz>
+!
+REAL, DIMENSION(:,:,:), ALLOCATABLE :: X_LES_SUBGRID_RtPz   ! <Rt'dp'/dz>
+!
+REAL, DIMENSION(:,:,:,:),ALLOCATABLE:: X_LES_SUBGRID_SvPz   ! <Sv'dp'/dz>
+!
+REAL, DIMENSION(:,:,:), ALLOCATABLE :: X_LES_SUBGRID_PHI3   ! phi3
+!
+REAL, DIMENSION(:,:,:), ALLOCATABLE :: X_LES_SUBGRID_PSI3   ! psi3
+!
+REAL, DIMENSION(:,:,:), ALLOCATABLE :: X_LES_SUBGRID_LMix   ! mixing length
+!
+REAL, DIMENSION(:,:,:), ALLOCATABLE :: X_LES_SUBGRID_LDiss  ! dissipative length
+!
+REAL, DIMENSION(:,:,:), ALLOCATABLE :: X_LES_SUBGRID_Km     ! eddy diffusivity for momentum
+!
+REAL, DIMENSION(:,:,:), ALLOCATABLE :: X_LES_SUBGRID_Kh     ! eddy diffusivity for heat
+!
+REAL, DIMENSION(:,:,:), ALLOCATABLE :: X_LES_SUBGRID_THLUP_MF  ! Thl of the Updraft
+!
+REAL, DIMENSION(:,:,:), ALLOCATABLE :: X_LES_SUBGRID_RTUP_MF   ! Rt of the Updraft
+!
+REAL, DIMENSION(:,:,:), ALLOCATABLE :: X_LES_SUBGRID_RVUP_MF   ! Rv of the Updraft
+!
+REAL, DIMENSION(:,:,:), ALLOCATABLE :: X_LES_SUBGRID_RCUP_MF   ! Rc of the Updraft
+!
+REAL, DIMENSION(:,:,:), ALLOCATABLE :: X_LES_SUBGRID_RIUP_MF   ! Ri of the Updraft
+!
+REAL, DIMENSION(:,:,:), ALLOCATABLE :: X_LES_SUBGRID_WUP_MF    ! Thl of the Updraft
+!
+REAL, DIMENSION(:,:,:), ALLOCATABLE :: X_LES_SUBGRID_MASSFLUX  ! Mass Flux
+!
+REAL, DIMENSION(:,:,:), ALLOCATABLE :: X_LES_SUBGRID_DETR      ! Detrainment
+!
+REAL, DIMENSION(:,:,:), ALLOCATABLE :: X_LES_SUBGRID_ENTR      ! Entrainment
+!
+REAL, DIMENSION(:,:,:), ALLOCATABLE :: X_LES_SUBGRID_FRACUP    ! Updraft Fraction
+!
+REAL, DIMENSION(:,:,:), ALLOCATABLE :: X_LES_SUBGRID_THVUP_MF  ! Thv of the Updraft
+!
+REAL, DIMENSION(:,:,:), ALLOCATABLE :: X_LES_SUBGRID_WTHLMF ! Flux of thl
+!
+REAL, DIMENSION(:,:,:), ALLOCATABLE :: X_LES_SUBGRID_WRTMF  ! Flux of rt
+!
+REAL, DIMENSION(:,:,:), ALLOCATABLE :: X_LES_SUBGRID_WTHVMF ! Flux of thv
+!
+REAL, DIMENSION(:,:,:), ALLOCATABLE :: X_LES_SUBGRID_WUMF   ! Flux of u
+!
+REAL, DIMENSION(:,:,:), ALLOCATABLE :: X_LES_SUBGRID_WVMF   ! Flux of v
+!
+!* surface variables
+!
+REAL, DIMENSION(:), ALLOCATABLE :: X_LES_USTAR     ! local u* temporal series
+REAL, DIMENSION(:), ALLOCATABLE :: X_LES_UW0       ! uw temporal series
+REAL, DIMENSION(:), ALLOCATABLE :: X_LES_VW0       ! vw temporal series
+REAL, DIMENSION(:), ALLOCATABLE :: X_LES_Q0        ! Qo temporal series
+REAL, DIMENSION(:), ALLOCATABLE :: X_LES_E0        ! Eo temporal series
+REAL, DIMENSION(:,:), ALLOCATABLE :: X_LES_SV0     ! scalar surface fluxes
+!
+!* pdf variables
+REAL                              :: XRV_PDF_MIN       ! min of rv pdf
+REAL                              :: XRV_PDF_MAX       ! max of rv pdf
+REAL                              :: XTH_PDF_MIN       ! min of theta pdf
+REAL                              :: XTH_PDF_MAX       ! max of theta pdf
+REAL                              :: XW_PDF_MIN       ! min of w pdf
+REAL                              :: XW_PDF_MAX       ! max of w pdf
+REAL                              :: XTHV_PDF_MIN       ! min of thetav pdf
+REAL                              :: XTHV_PDF_MAX       ! max of thetav pdf
+REAL                              :: XRC_PDF_MIN       ! min of rc pdf
+REAL                              :: XRC_PDF_MAX       ! max of rc pdf
+REAL                              :: XRR_PDF_MIN       ! min of rr pdf
+REAL                              :: XRR_PDF_MAX       ! max of rr pdf
+REAL                              :: XRI_PDF_MIN       ! min of ri pdf
+REAL                              :: XRI_PDF_MAX       ! max of ri pdf
+REAL                              :: XRS_PDF_MIN       ! min of rs pdf
+REAL                              :: XRS_PDF_MAX       ! max of rs pdf
+REAL                              :: XRG_PDF_MIN       ! min of rg pdf
+REAL                              :: XRG_PDF_MAX       ! max of rg pdf
+REAL                              :: XRT_PDF_MIN       ! min of rt pdf
+REAL                              :: XRT_PDF_MAX       ! max of rt pdf
+REAL                              :: XTHL_PDF_MIN       ! min of thetal pdf
+REAL                              :: XTHL_PDF_MAX       ! max of thetal pdf
+!-------------------------------------------------------------------------------
+!* pdf distribution
+!
+REAL, DIMENSION(:,:,:,:), ALLOCATABLE :: XLES_PDF_RV   ! rv  pdf
+REAL, DIMENSION(:,:,:,:), ALLOCATABLE :: XLES_PDF_TH   ! theta pdf
+REAL, DIMENSION(:,:,:,:), ALLOCATABLE :: XLES_PDF_W    ! w  pdf
+REAL, DIMENSION(:,:,:,:), ALLOCATABLE :: XLES_PDF_THV  ! thetav pdf
+REAL, DIMENSION(:,:,:,:), ALLOCATABLE :: XLES_PDF_RC   ! rc  pdf
+REAL, DIMENSION(:,:,:,:), ALLOCATABLE :: XLES_PDF_RR   ! rr pdf
+REAL, DIMENSION(:,:,:,:), ALLOCATABLE :: XLES_PDF_RI   ! ri  pdf
+REAL, DIMENSION(:,:,:,:), ALLOCATABLE :: XLES_PDF_RS   ! rs pdf
+REAL, DIMENSION(:,:,:,:), ALLOCATABLE :: XLES_PDF_RG   ! rg pdf
+REAL, DIMENSION(:,:,:,:), ALLOCATABLE :: XLES_PDF_RT   ! rt  pdf
+REAL, DIMENSION(:,:,:,:), ALLOCATABLE :: XLES_PDF_THL  ! thetal pdf
+!
+END TYPE TLES_t
+!
+TYPE(TLES_t), SAVE, TARGET :: TLES
+!
+!-------------------------------------------------------------------------------
+!
+!* namelist variables
+!
+LOGICAL, POINTER :: LLES_MEAN     => NULL() ! flag to activate the mean computations
+LOGICAL, POINTER :: LLES_RESOLVED => NULL() ! flag to activate the resolved var. computations
+LOGICAL, POINTER :: LLES_SUBGRID  => NULL() ! flag to activate the subgrid var.  computations
+LOGICAL, POINTER :: LLES_UPDRAFT  => NULL() ! flag to activate the computations in updrafts
+LOGICAL, POINTER :: LLES_DOWNDRAFT=> NULL() ! flag to activate the computations in downdrafts
+LOGICAL, POINTER :: LLES_SPECTRA  => NULL() ! flag to activate the spectra computations
+LOGICAL, POINTER :: LLES_PDF     => NULL() ! flag to activate the pdf computations
+!
+INTEGER, DIMENSION(:), POINTER :: NLES_LEVELS        => NULL() ! physical model levels for LES comp.
+REAL,    DIMENSION(:), POINTER :: XLES_ALTITUDES     => NULL() ! alt.  levels for LES comp.
+INTEGER, DIMENSION(:), POINTER :: NSPECTRA_LEVELS    => NULL() ! physical model levels for spectra comp.
+REAL,    DIMENSION(:), POINTER :: XSPECTRA_ALTITUDES => NULL() ! alt.  levels for spectra comp.
+!
+INTEGER, DIMENSION(:), POINTER :: NLES_TEMP_SERIE_I  => NULL() ! I, J and Z point
+INTEGER, DIMENSION(:), POINTER :: NLES_TEMP_SERIE_J  => NULL() ! localizations to
+INTEGER, DIMENSION(:), POINTER :: NLES_TEMP_SERIE_Z  => NULL() ! record temporal data
+
+CHARACTER(LEN=4), POINTER :: CLES_NORM_TYPE=> NULL() ! type of turbulence normalization
+CHARACTER(LEN=3), POINTER :: CBL_HEIGHT_DEF=> NULL() ! definition of the boundary layer height
+
+REAL, POINTER :: XLES_TEMP_SAMPLING   => NULL() ! temporal sampling between each computation
+REAL, POINTER :: XLES_TEMP_MEAN_START => NULL() ! time (in s) from the beginning of the simulation
+REAL, POINTER :: XLES_TEMP_MEAN_END   => NULL() ! for start and end of the temporal averaged comp.
+REAL, POINTER :: XLES_TEMP_MEAN_STEP  => NULL() ! time step for each averaging
+
+LOGICAL, POINTER :: LLES_CART_MASK    => NULL() ! flag to use a cartesian mask
+INTEGER, POINTER :: NLES_IINF         => NULL() ! definition of the cartesians mask in physical domain
+INTEGER, POINTER :: NLES_ISUP         => NULL() !     for NLES_CART_MODNBR model
+INTEGER, POINTER :: NLES_JINF         => NULL() !               "
+INTEGER, POINTER :: NLES_JSUP         => NULL() !               "
+LOGICAL, POINTER :: LLES_NEB_MASK     => NULL() ! flag to use a 2D nebulosity mask
+LOGICAL, POINTER :: LLES_CORE_MASK    => NULL() ! flag to use a 3D cloud core mask
+LOGICAL, POINTER :: LLES_MY_MASK      => NULL() ! flag to use its own mask (must be coded by user)
+INTEGER, POINTER :: NLES_MASKS_USER   => NULL() ! number of user masks for LES computations
+LOGICAL, POINTER :: LLES_CS_MASK      => NULL() ! flag to use conditional sampling mask
+INTEGER, POINTER :: NPDF        => NULL() ! number of pdf intervals
+!
+!-------------------------------------------------------------------------------
+!
+INTEGER, DIMENSION(:), POINTER :: NLESn_IINF=> NULL() ! definition of the cartesians mask in physical domain
+INTEGER, DIMENSION(:), POINTER :: NLESn_ISUP=> NULL() !          for all models
+INTEGER, DIMENSION(:), POINTER :: NLESn_JINF=> NULL() !               "
+INTEGER, DIMENSION(:), POINTER :: NLESn_JSUP=> NULL() !               "
+!
+CHARACTER(LEN=4), DIMENSION(:,:), POINTER :: CLES_LBCX=> NULL()
+! X boundary conditions for 2 points correlations computations for all models
+!
+CHARACTER(LEN=4), DIMENSION(:,:), POINTER :: CLES_LBCY=> NULL()
+! Y boundary conditions for 2 points correlations computations for all models
+!
+!-------------------------------------------------------------------------------
+!
+LOGICAL, POINTER :: LLES              => NULL() ! flag to compute the LES diagnostics
+!
+LOGICAL, POINTER :: LLES_CALL         => NULL() ! flag to compute the LES diagnostics at current
+!                            => NULL() ! time step
+!
+!
+LOGICAL, DIMENSION(:,:,:), POINTER :: LLES_CURRENT_CART_MASK=> NULL()
+! 2D cartesian mask of the current model
+!
+LOGICAL, DIMENSION(:,:,:), POINTER :: LLES_CURRENT_NEB_MASK=> NULL()
+! 2D nebulosity mask of the current model
+!
+LOGICAL, DIMENSION(:,:,:), POINTER :: LLES_CURRENT_CORE_MASK=> NULL()
+! 2D surface precipitations mask of the current model
+!
+! 2D owner mask of the current model
+LOGICAL, DIMENSION(:,:,:,:), POINTER :: LLES_CURRENT_MY_MASKS=> NULL()
+!
+LOGICAL, DIMENSION(:,:,:), POINTER :: LLES_CURRENT_CS1_MASK=> NULL()
+LOGICAL, DIMENSION(:,:,:), POINTER :: LLES_CURRENT_CS2_MASK=> NULL()
+LOGICAL, DIMENSION(:,:,:), POINTER :: LLES_CURRENT_CS3_MASK=> NULL()
+! 2D conditional sampling mask of the current model
+!
+INTEGER, POINTER :: NLES_CURRENT_TCOUNT=> NULL()
+! current model LES time counter
+!
+INTEGER, POINTER :: NLES_CURRENT_TIMES=> NULL()
+! current model NLES_TIMES (number of LES samplings)
+!
+INTEGER, POINTER :: NLES_CURRENT_IINF=> NULL(), NLES_CURRENT_ISUP=> NULL(), &
+                    NLES_CURRENT_JINF=> NULL(), NLES_CURRENT_JSUP=> NULL()
+! coordinates (in physical domain) for write_diachro, set to NLESn_IINF(current model), etc...
+!
+REAL, POINTER :: XLES_CURRENT_DOMEGAX=> NULL(), XLES_CURRENT_DOMEGAY=> NULL()
+! minimum wavelength in spectra analysis
+!
+CHARACTER(LEN=4), DIMENSION(:), POINTER :: CLES_CURRENT_LBCX=> NULL()
+! current model X boundary conditions for 2 points correlations computations
+!
+CHARACTER(LEN=4), DIMENSION(:), POINTER :: CLES_CURRENT_LBCY=> NULL()
+! current model Y boundary conditions for 2 points correlations computations
+!
+REAL, DIMENSION(:),   POINTER :: XLES_CURRENT_Z=> NULL()
+! altitudes for diachro
+!
+REAL, POINTER :: XLES_CURRENT_ZS=> NULL()
+! orography (used for normalization of altitudes)
+!
+INTEGER, DIMENSION(:,:,:), POINTER :: NKLIN_CURRENT_LES=> NULL()
+! levels for vertical interpolation
+!
+REAL, DIMENSION(:,:,:), POINTER :: XCOEFLIN_CURRENT_LES=> NULL()
+! coefficients for vertical interpolation
+!
+INTEGER, DIMENSION(:,:,:), POINTER :: NKLIN_CURRENT_SPEC=> NULL()
+! levels for vertical interpolation
+!
+REAL, DIMENSION(:,:,:), POINTER :: XCOEFLIN_CURRENT_SPEC=> NULL()
+! coefficients for vertical interpolation
+!
+REAL,DIMENSION(:), POINTER :: XTIME_LES=> NULL()
+! time spent in subgrid LES computations in this time-step in TURB
+!
+!-------------------------------------------------------------------------------
+!
+!* normalization variables
+!
+REAL, DIMENSION(:), POINTER :: XLES_NORM_M=> NULL()
+! normalization coefficient for distances (Meters)
+!
+REAL, DIMENSION(:), POINTER :: XLES_NORM_K=> NULL()
+! normalization coefficient for temperatures (Kelvin)
+!
+REAL, DIMENSION(:), POINTER :: XLES_NORM_S=> NULL()
+! normalization coefficient for times (Seconds)
+!
+REAL, DIMENSION(:), POINTER :: XLES_NORM_RHO=> NULL()
+! normalization coefficient for densities
+!
+REAL, DIMENSION(:), POINTER :: XLES_NORM_RV=> NULL()
+! normalization coefficient for mixing ratio
+!
+REAL, DIMENSION(:,:), POINTER :: XLES_NORM_SV=> NULL()
+! normalization coefficient for scalar variables
+!
+REAL, DIMENSION(:), POINTER :: XLES_NORM_P=> NULL()
+! normalization coefficient for pressure
+!
+!-------------------------------------------------------------------------------
+!
+!* monitoring variables
+!
+INTEGER, POINTER :: NLES_MASKS        => NULL() ! number of masks for LES computations
+INTEGER, POINTER :: NLES_K            => NULL() ! number of vertical levels for local diagnostics
+INTEGER, POINTER :: NSPECTRA_K        => NULL() ! number of vertical levels for spectra
+!
+CHARACTER(LEN=1), POINTER :: CLES_LEVEL_TYPE    => NULL() ! type of vertical levels for local diag.
+CHARACTER(LEN=1), POINTER :: CSPECTRA_LEVEL_TYPE=> NULL() ! type of vertical levels for spectra
+!
+!-------------------------------------------------------------------------------
+!
+!* subgrid variables for current model
+!
+!                                                                ______
+REAL, DIMENSION(:,:,:), POINTER :: X_LES_RES_W_SBG_WThl=> NULL() !  <w'w'Thl'>
+!                                                                _____
+REAL, DIMENSION(:,:,:), POINTER :: X_LES_RES_W_SBG_WRt => NULL() !  <w'w'Rt'>
+!                                                                _____
+REAL, DIMENSION(:,:,:), POINTER :: X_LES_RES_W_SBG_Thl2=> NULL() !  <w'Thl'2>
+!                                                                ____
+REAL, DIMENSION(:,:,:), POINTER :: X_LES_RES_W_SBG_Rt2 => NULL() !  <w'Rt'2>
+!                                                                _______
+REAL, DIMENSION(:,:,:), POINTER :: X_LES_RES_W_SBG_ThlRt=> NULL()!  <w'Thl'Rt'>
+!                                                                _____
+REAL, DIMENSION(:,:,:,:), POINTER :: X_LES_RES_W_SBG_WSv => NULL() !  <w'w'Sv'>
+!                                                                ____
+REAL, DIMENSION(:,:,:,:), POINTER :: X_LES_RES_W_SBG_Sv2=> NULL() !  <w'Sv'2>
+!
+REAL, DIMENSION(:,:,:), POINTER :: XLES_SUBGRID_RCSIGS=> NULL() ! rc sigmas
+!
+REAL, DIMENSION(:,:,:), POINTER :: XLES_SUBGRID_RCSIGC=> NULL() ! rc sigmac
+!                                                                            _____
+REAL, DIMENSION(:,:,:), POINTER :: X_LES_RES_ddxa_U_SBG_UaU  => NULL() !  <du'/dxa ua'u'>
+!                                                                            _____
+REAL, DIMENSION(:,:,:), POINTER :: X_LES_RES_ddxa_V_SBG_UaV  => NULL() !  <dv'/dxa ua'v'>
+!                                                                            _____
+REAL, DIMENSION(:,:,:), POINTER :: X_LES_RES_ddxa_W_SBG_UaW  => NULL() !  <dw'/dxa ua'w'>
+!                                                                            _______
+REAL, DIMENSION(:,:,:), POINTER :: X_LES_RES_ddxa_W_SBG_UaThl=> NULL() !  <dw'/dxa ua'Thl'>
+!                                                                              _____
+REAL, DIMENSION(:,:,:), POINTER :: X_LES_RES_ddxa_Thl_SBG_UaW=> NULL() !  <dThl'/dxa ua'w'>
+!                                                                              ___
+REAL, DIMENSION(:,:,:), POINTER :: X_LES_RES_ddz_Thl_SBG_W2  => NULL() !  <dThl'/dz w'2>
+!                                                                            ______
+REAL, DIMENSION(:,:,:), POINTER :: X_LES_RES_ddxa_W_SBG_UaRt => NULL() !  <dw'/dxa ua'Rt'>
+!                                                                             _____
+REAL, DIMENSION(:,:,:), POINTER :: X_LES_RES_ddxa_Rt_SBG_UaW => NULL() !  <dRt'/dxa ua'w'>
+!                                                                             ___
+REAL, DIMENSION(:,:,:), POINTER :: X_LES_RES_ddz_Rt_SBG_W2   => NULL() !  <dRt'/dz w'2>
+!                                                                              ______
+REAL, DIMENSION(:,:,:), POINTER :: X_LES_RES_ddxa_Thl_SBG_UaRt=> NULL()!  <dThl'/dxa ua'Rt'>
+!                                                                             _______
+REAL, DIMENSION(:,:,:), POINTER :: X_LES_RES_ddxa_Rt_SBG_UaThl=> NULL()!  <dRt'/dxa ua'Thl'>
+!                                                                              _______
+REAL, DIMENSION(:,:,:), POINTER :: X_LES_RES_ddxa_Thl_SBG_UaThl=> NULL()! <dThl'/dxa ua'Thl'>
+!                                                                             ______
+REAL, DIMENSION(:,:,:), POINTER :: X_LES_RES_ddxa_Rt_SBG_UaRt=> NULL() !  <dRt'/dxa ua'Rt'>
+!                                                                              ______
+REAL, DIMENSION(:,:,:,:), POINTER :: X_LES_RES_ddxa_W_SBG_UaSv => NULL() ! <dw'/dxa ua'Sv'>
+!                                                                               _____
+REAL, DIMENSION(:,:,:,:), POINTER :: X_LES_RES_ddxa_Sv_SBG_UaW => NULL() ! <dSv'/dxa ua'w'>
+!                                                                              ___
+REAL, DIMENSION(:,:,:,:), POINTER :: X_LES_RES_ddz_Sv_SBG_W2   => NULL() ! <dSv'/dz w'2>
+!                                                                               ______
+REAL, DIMENSION(:,:,:,:), POINTER :: X_LES_RES_ddxa_Sv_SBG_UaSv=> NULL() ! <dSv'/dxa ua'Sv'>
+!
+!                                                            ___
+REAL, DIMENSION(:,:,:), POINTER :: X_LES_SUBGRID_U2   => NULL() ! <u'2>
+!                                                            ___
+REAL, DIMENSION(:,:,:), POINTER :: X_LES_SUBGRID_V2   => NULL() ! <v'2>
+!                                                            ___
+REAL, DIMENSION(:,:,:), POINTER :: X_LES_SUBGRID_W2   => NULL() ! <w'2>
+!                                                            _____
+REAL, DIMENSION(:,:,:), POINTER :: X_LES_SUBGRID_Thl2 => NULL() ! <Thl'2>
+!                                                            ____
+REAL, DIMENSION(:,:,:), POINTER :: X_LES_SUBGRID_Rt2  => NULL() ! <Rt'2>
+!                                                            ____
+REAL, DIMENSION(:,:,:), POINTER :: X_LES_SUBGRID_Rc2  => NULL() ! <Rc'2>
+!                                                            ____
+REAL, DIMENSION(:,:,:), POINTER :: X_LES_SUBGRID_Ri2  => NULL() ! <Ri'2>
+!                                                            _______
+REAL, DIMENSION(:,:,:), POINTER :: X_LES_SUBGRID_ThlRt=> NULL() ! <Thl'Rt'>
+!                                                             ____
+REAL, DIMENSION(:,:,:,:), POINTER :: X_LES_SUBGRID_Sv2  => NULL() ! <Sv'2>
+!                                                            ____
+REAL, DIMENSION(:,:,:), POINTER :: X_LES_SUBGRID_UV   => NULL() ! <u'v'>
+!                                                            ____
+REAL, DIMENSION(:,:,:), POINTER :: X_LES_SUBGRID_WU   => NULL() ! <w'u'>
+!                                                            ____
+REAL, DIMENSION(:,:,:), POINTER :: X_LES_SUBGRID_WV   => NULL() ! <w'v'>
+!                                                            ______
+REAL, DIMENSION(:,:,:), POINTER :: X_LES_SUBGRID_UThl => NULL() ! <u'Thl'>
+!                                                            ______
+REAL, DIMENSION(:,:,:), POINTER :: X_LES_SUBGRID_VThl => NULL() ! <v'Thl'>
+!                                                            ______
+REAL, DIMENSION(:,:,:), POINTER :: X_LES_SUBGRID_WThl => NULL() ! <w'Thl'>
+!                                                            _____
+REAL, DIMENSION(:,:,:), POINTER :: X_LES_SUBGRID_URt  => NULL() ! <u'Rt'>
+!                                                            _____
+REAL, DIMENSION(:,:,:), POINTER :: X_LES_SUBGRID_VRt  => NULL() ! <v'Rt'>
+!                                                            _____
+REAL, DIMENSION(:,:,:), POINTER :: X_LES_SUBGRID_WRt  => NULL() ! <w'Rt'>
+!                                                            _____
+REAL, DIMENSION(:,:,:), POINTER :: X_LES_SUBGRID_URc  => NULL() ! <u'Rc'>
+!                                                            _____
+REAL, DIMENSION(:,:,:), POINTER :: X_LES_SUBGRID_VRc  => NULL() ! <v'Rc'>
+!                                                            _____
+REAL, DIMENSION(:,:,:), POINTER :: X_LES_SUBGRID_WRc  => NULL() ! <w'Rc'>
+!                                                            _____
+REAL, DIMENSION(:,:,:,:), POINTER :: X_LES_SUBGRID_USv=> NULL() ! <u'Sv'>
+!                                                            _____
+REAL, DIMENSION(:,:,:,:), POINTER :: X_LES_SUBGRID_VSv=> NULL() ! <v'Sv'>
+!                                                            _____
+REAL, DIMENSION(:,:,:,:), POINTER :: X_LES_SUBGRID_WSv=> NULL() ! <w'Sv'>
+!                                                            ___
+REAL, DIMENSION(:,:,:), POINTER :: X_LES_SUBGRID_UTke => NULL() ! <u'e>
+!                                                            ___
+REAL, DIMENSION(:,:,:), POINTER :: X_LES_SUBGRID_VTke => NULL() ! <v'e>
+!                                                            ___
+REAL, DIMENSION(:,:,:), POINTER :: X_LES_SUBGRID_WTke => NULL() ! <w'e>
+!                                                                   ___
+REAL, DIMENSION(:,:,:), POINTER :: X_LES_SUBGRID_ddz_WTke => NULL() !  <dw'e/dz>
+!                                                             ______
+REAL, DIMENSION(:,:,:), POINTER :: X_LES_SUBGRID_WThv  => NULL() ! <w'Thv'>
+!                                                             ________
+REAL, DIMENSION(:,:,:), POINTER :: X_LES_SUBGRID_ThlThv=> NULL() ! <Thl'Thv'>
+!                                                             _______
+REAL, DIMENSION(:,:,:), POINTER :: X_LES_SUBGRID_RtThv => NULL() ! <Rt'Thv'>
+!                                                             _______
+REAL, DIMENSION(:,:,:,:), POINTER :: X_LES_SUBGRID_SvThv => NULL() ! <Sv'Thv'>
+!                                                             ______
+REAL, DIMENSION(:,:,:), POINTER :: X_LES_SUBGRID_W2Thl => NULL() ! <w'2Thl>
+!                                                              _____
+REAL, DIMENSION(:,:,:), POINTER :: X_LES_SUBGRID_W2Rt  => NULL() ! <w'2Rt>
+!                                                              _____
+REAL, DIMENSION(:,:,:,:), POINTER :: X_LES_SUBGRID_W2Sv  => NULL() ! <w'2Sv>
+!                                                             _______
+REAL, DIMENSION(:,:,:), POINTER :: X_LES_SUBGRID_WThlRt=> NULL() ! <w'ThlRt>
+!                                                             ______
+REAL, DIMENSION(:,:,:), POINTER :: X_LES_SUBGRID_WThl2 => NULL() ! <w'Thl2>
+!                                                             _____
+REAL, DIMENSION(:,:,:), POINTER :: X_LES_SUBGRID_WRt2  => NULL() ! <w'Rt2>
+!                                                              _____
+REAL, DIMENSION(:,:,:,:), POINTER :: X_LES_SUBGRID_WSv2  => NULL() ! <w'Sv2>
+!                                                               _______
+REAL, DIMENSION(:,:,:), POINTER :: X_LES_SUBGRID_DISS_Tke=> NULL() ! <epsilon>
+!                                                                 ____________
+REAL, DIMENSION(:,:,:), POINTER :: X_LES_SUBGRID_DISS_Thl2=> NULL() ! <epsilon_Thl2>
+!                                                                 ___________
+REAL, DIMENSION(:,:,:), POINTER :: X_LES_SUBGRID_DISS_Rt2 => NULL() ! <epsilon_Rt2>
+!                                                                ______________
+REAL, DIMENSION(:,:,:), POINTER :: X_LES_SUBGRID_DISS_ThlRt=> NULL()! <epsilon_ThlRt>
+!                                                                ___________
+REAL, DIMENSION(:,:,:,:), POINTER :: X_LES_SUBGRID_DISS_Sv2 => NULL() ! <epsilon_Sv2>
+!
+REAL, DIMENSION(:,:,:), POINTER :: X_LES_SUBGRID_WP    => NULL() ! <w'p'>
+!
+REAL, DIMENSION(:,:,:), POINTER :: X_LES_SUBGRID_ThlPz => NULL() ! <Thl'dp'/dz>
+!
+REAL, DIMENSION(:,:,:), POINTER :: X_LES_SUBGRID_RtPz  => NULL() ! <Rt'dp'/dz>
+!
+REAL, DIMENSION(:,:,:,:), POINTER :: X_LES_SUBGRID_SvPz  => NULL() ! <Sv'dp'/dz>
+!
+REAL, DIMENSION(:,:,:), POINTER :: X_LES_SUBGRID_PHI3  => NULL() ! phi3
+!
+REAL, DIMENSION(:,:,:), POINTER :: X_LES_SUBGRID_PSI3  => NULL() ! psi3
+!
+REAL, DIMENSION(:,:,:), POINTER :: X_LES_SUBGRID_LMix  => NULL() ! mixing length
+!
+REAL, DIMENSION(:,:,:), POINTER :: X_LES_SUBGRID_LDiss => NULL() ! dissipative length
+!
+REAL, DIMENSION(:,:,:), POINTER :: X_LES_SUBGRID_Km    => NULL() ! eddy diffusivity for momentum
+!
+REAL, DIMENSION(:,:,:), POINTER :: X_LES_SUBGRID_Kh    => NULL() ! eddy diffusivity for heat
+!
+REAL, DIMENSION(:,:,:), POINTER :: X_LES_SUBGRID_THLUP_MF => NULL() ! Thl of the Updraft
+!
+REAL, DIMENSION(:,:,:), POINTER :: X_LES_SUBGRID_RTUP_MF  => NULL() ! Rt of the Updraft
+!
+REAL, DIMENSION(:,:,:), POINTER :: X_LES_SUBGRID_RVUP_MF  => NULL() ! Rv of the Updraft
+!
+REAL, DIMENSION(:,:,:), POINTER :: X_LES_SUBGRID_RCUP_MF  => NULL() ! Rc of the Updraft
+!
+REAL, DIMENSION(:,:,:), POINTER :: X_LES_SUBGRID_RIUP_MF  => NULL() ! Ri of the Updraft
+!
+REAL, DIMENSION(:,:,:), POINTER :: X_LES_SUBGRID_WUP_MF   => NULL() ! Thl of the Updraft
+!
+REAL, DIMENSION(:,:,:), POINTER :: X_LES_SUBGRID_MASSFLUX => NULL() ! Mass Flux
+!
+REAL, DIMENSION(:,:,:), POINTER :: X_LES_SUBGRID_DETR     => NULL() ! Detrainment
+!
+REAL, DIMENSION(:,:,:), POINTER :: X_LES_SUBGRID_ENTR     => NULL() ! Entrainment
+!
+REAL, DIMENSION(:,:,:), POINTER :: X_LES_SUBGRID_FRACUP   => NULL() ! Updraft Fraction
+!
+REAL, DIMENSION(:,:,:), POINTER :: X_LES_SUBGRID_THVUP_MF => NULL() ! Thv of the Updraft
+!
+REAL, DIMENSION(:,:,:), POINTER :: X_LES_SUBGRID_WTHLMF=> NULL() ! Flux of thl
+!
+REAL, DIMENSION(:,:,:), POINTER :: X_LES_SUBGRID_WRTMF => NULL() ! Flux of rt
+!
+REAL, DIMENSION(:,:,:), POINTER :: X_LES_SUBGRID_WTHVMF=> NULL() ! Flux of thv
+!
+REAL, DIMENSION(:,:,:), POINTER :: X_LES_SUBGRID_WUMF  => NULL() ! Flux of u
+!
+REAL, DIMENSION(:,:,:), POINTER :: X_LES_SUBGRID_WVMF  => NULL() ! Flux of v
+!
+!* surface variables
+!
+REAL, DIMENSION(:), POINTER :: X_LES_USTAR    => NULL() ! local u* temporal series
+REAL, DIMENSION(:), POINTER :: X_LES_UW0      => NULL() ! uw temporal series
+REAL, DIMENSION(:), POINTER :: X_LES_VW0      => NULL() ! vw temporal series
+REAL, DIMENSION(:), POINTER :: X_LES_Q0       => NULL() ! Qo temporal series
+REAL, DIMENSION(:), POINTER :: X_LES_E0       => NULL() ! Eo temporal series
+REAL, DIMENSION(:,:), POINTER :: X_LES_SV0    => NULL() ! scalar surface fluxes
+!
+!* pdf variables
+REAL                             , POINTER :: XRV_PDF_MIN      => NULL() ! min of rv pdf
+REAL                             , POINTER :: XRV_PDF_MAX      => NULL() ! max of rv pdf
+REAL                             , POINTER :: XTH_PDF_MIN      => NULL() ! min of theta pdf
+REAL                             , POINTER :: XTH_PDF_MAX      => NULL() ! max of theta pdf
+REAL                             , POINTER :: XW_PDF_MIN       => NULL() ! min of w pdf
+REAL                             , POINTER :: XW_PDF_MAX       => NULL() ! max of w pdf
+REAL                             , POINTER :: XTHV_PDF_MIN     => NULL() ! min of thetav pdf
+REAL                             , POINTER :: XTHV_PDF_MAX     => NULL() ! max of thetav pdf
+REAL                             , POINTER :: XRC_PDF_MIN      => NULL() ! min of rc pdf
+REAL                             , POINTER :: XRC_PDF_MAX      => NULL() ! max of rc pdf
+REAL                             , POINTER :: XRR_PDF_MIN      => NULL() ! min of rr pdf
+REAL                             , POINTER :: XRR_PDF_MAX      => NULL() ! max of rr pdf
+REAL                             , POINTER :: XRI_PDF_MIN      => NULL() ! min of ri pdf
+REAL                             , POINTER :: XRI_PDF_MAX      => NULL() ! max of ri pdf
+REAL                             , POINTER :: XRS_PDF_MIN      => NULL() ! min of rs pdf
+REAL                             , POINTER :: XRS_PDF_MAX      => NULL() ! max of rs pdf
+REAL                             , POINTER :: XRG_PDF_MIN      => NULL() ! min of rg pdf
+REAL                             , POINTER :: XRG_PDF_MAX      => NULL() ! max of rg pdf
+REAL                             , POINTER :: XRT_PDF_MIN      => NULL() ! min of rt pdf
+REAL                             , POINTER :: XRT_PDF_MAX      => NULL() ! max of rt pdf
+REAL                             , POINTER :: XTHL_PDF_MIN     => NULL() ! min of thetal pdf
+REAL                             , POINTER :: XTHL_PDF_MAX     => NULL() ! max of thetal pdf
+!-------------------------------------------------------------------------------
+!* pdf distribution
+!
+REAL, DIMENSION(:,:,:,:), POINTER :: XLES_PDF_RV  => NULL() ! rv  pdf
+REAL, DIMENSION(:,:,:,:), POINTER :: XLES_PDF_TH  => NULL() ! theta pdf
+REAL, DIMENSION(:,:,:,:), POINTER :: XLES_PDF_W   => NULL() ! w  pdf
+REAL, DIMENSION(:,:,:,:), POINTER :: XLES_PDF_THV => NULL() ! thetav pdf
+REAL, DIMENSION(:,:,:,:), POINTER :: XLES_PDF_RC  => NULL() ! rc  pdf
+REAL, DIMENSION(:,:,:,:), POINTER :: XLES_PDF_RR  => NULL() ! rr pdf
+REAL, DIMENSION(:,:,:,:), POINTER :: XLES_PDF_RI  => NULL() ! ri  pdf
+REAL, DIMENSION(:,:,:,:), POINTER :: XLES_PDF_RS  => NULL() ! rs pdf
+REAL, DIMENSION(:,:,:,:), POINTER :: XLES_PDF_RG  => NULL() ! rg pdf
+REAL, DIMENSION(:,:,:,:), POINTER :: XLES_PDF_RT  => NULL() ! rt  pdf
+REAL, DIMENSION(:,:,:,:), POINTER :: XLES_PDF_THL => NULL() ! thetal pdf
+!-------------------------------------------------------------------------------
+!!
+CONTAINS
+SUBROUTINE LES_ASSOCIATE()
+  ! Associate all LES non-allocatable variables to the TYPE LES
+  IMPLICIT NONE
+  NLES_LEVELS => TLES%NLES_LEVELS
+  XLES_ALTITUDES => TLES%XLES_ALTITUDES
+  NSPECTRA_LEVELS => TLES%NSPECTRA_LEVELS
+  XSPECTRA_ALTITUDES => TLES%XSPECTRA_ALTITUDES
+  XTIME_LES => TLES%XTIME_LES
+  CLES_LBCX => TLES%CLES_LBCX
+  CLES_LBCY => TLES%CLES_LBCY
+  CLES_CURRENT_LBCY => TLES%CLES_CURRENT_LBCY
+  CLES_CURRENT_LBCX => TLES%CLES_CURRENT_LBCX
+  NLESn_IINF => TLES%NLESn_IINF
+  NLESn_ISUP => TLES%NLESn_ISUP
+  NLESn_JINF => TLES%NLESn_JINF
+  NLESn_JSUP => TLES%NLESn_JSUP
+  NLES_TEMP_SERIE_I => TLES%NLES_TEMP_SERIE_I
+  NLES_TEMP_SERIE_J => TLES%NLES_TEMP_SERIE_J
+  NLES_TEMP_SERIE_Z => TLES%NLES_TEMP_SERIE_Z
+  LLES_MEAN => TLES%LLES_MEAN
+  LLES_RESOLVED => TLES%LLES_RESOLVED
+  LLES_SUBGRID => TLES%LLES_SUBGRID
+  LLES_UPDRAFT => TLES%LLES_UPDRAFT
+  LLES_DOWNDRAFT => TLES%LLES_DOWNDRAFT
+  LLES_SPECTRA => TLES%LLES_SPECTRA
+  LLES_PDF => TLES%LLES_PDF
+  CLES_NORM_TYPE => TLES%CLES_NORM_TYPE
+  CBL_HEIGHT_DEF => TLES%CBL_HEIGHT_DEF
+  XLES_TEMP_SAMPLING => TLES%XLES_TEMP_SAMPLING
+  XLES_TEMP_MEAN_START => TLES%XLES_TEMP_MEAN_START
+  XLES_TEMP_MEAN_END => TLES%XLES_TEMP_MEAN_END
+  XLES_TEMP_MEAN_STEP => TLES%XLES_TEMP_MEAN_STEP
+  LLES_CART_MASK => TLES%LLES_CART_MASK
+  NLES_IINF => TLES%NLES_IINF
+  NLES_ISUP => TLES%NLES_ISUP
+  NLES_JINF => TLES%NLES_JINF
+  NLES_JSUP => TLES%NLES_JSUP
+  LLES_NEB_MASK => TLES%LLES_NEB_MASK
+  LLES_CORE_MASK => TLES%LLES_CORE_MASK
+  LLES_MY_MASK => TLES%LLES_MY_MASK
+  NLES_MASKS_USER => TLES%NLES_MASKS_USER
+  LLES_CS_MASK => TLES%LLES_CS_MASK
+  NPDF => TLES%NPDF
+  LLES => TLES%LLES
+  LLES_CALL => TLES%LLES_CALL
+  NLES_CURRENT_TCOUNT => TLES%NLES_CURRENT_TCOUNT
+  NLES_CURRENT_TIMES => TLES%NLES_CURRENT_TIMES
+  NLES_CURRENT_IINF => TLES%NLES_CURRENT_IINF
+  NLES_CURRENT_ISUP => TLES%NLES_CURRENT_ISUP
+  NLES_CURRENT_JINF => TLES%NLES_CURRENT_JINF
+  NLES_CURRENT_JSUP => TLES%NLES_CURRENT_JSUP
+  XLES_CURRENT_DOMEGAX => TLES%XLES_CURRENT_DOMEGAX
+  XLES_CURRENT_DOMEGAY => TLES%XLES_CURRENT_DOMEGAY
+  XLES_CURRENT_ZS => TLES%XLES_CURRENT_ZS
+  NLES_MASKS => TLES%NLES_MASKS
+  NLES_K => TLES%NLES_K
+  NSPECTRA_K => TLES%NSPECTRA_K
+  CLES_LEVEL_TYPE => TLES%CLES_LEVEL_TYPE
+  CSPECTRA_LEVEL_TYPE => TLES%CSPECTRA_LEVEL_TYPE
+  XRV_PDF_MIN => TLES%XRV_PDF_MIN
+  XRV_PDF_MAX => TLES%XRV_PDF_MAX
+  XTH_PDF_MIN => TLES%XTH_PDF_MIN
+  XTH_PDF_MAX => TLES%XTH_PDF_MAX
+  XW_PDF_MIN => TLES%XW_PDF_MIN
+  XW_PDF_MAX => TLES%XW_PDF_MAX
+  XTHV_PDF_MIN => TLES%XTHV_PDF_MIN
+  XTHV_PDF_MAX => TLES%XTHV_PDF_MAX
+  XRC_PDF_MIN => TLES%XRC_PDF_MIN
+  XRC_PDF_MAX => TLES%XRC_PDF_MAX
+  XRR_PDF_MIN => TLES%XRR_PDF_MIN
+  XRR_PDF_MAX => TLES%XRR_PDF_MAX
+  XRI_PDF_MIN => TLES%XRI_PDF_MIN
+  XRI_PDF_MAX => TLES%XRI_PDF_MAX
+  XRS_PDF_MIN => TLES%XRS_PDF_MIN
+  XRS_PDF_MAX => TLES%XRS_PDF_MAX
+  XRG_PDF_MIN => TLES%XRG_PDF_MIN
+  XRG_PDF_MAX => TLES%XRG_PDF_MAX
+  XRT_PDF_MIN => TLES%XRT_PDF_MIN
+  XRT_PDF_MAX => TLES%XRT_PDF_MAX
+  XTHL_PDF_MIN => TLES%XTHL_PDF_MIN
+  XTHL_PDF_MAX => TLES%XTHL_PDF_MAX
+END SUBROUTINE LES_ASSOCIATE
+!
+SUBROUTINE LES_ALLOCATE(HNAME,NDIMS)
+  IMPLICIT NONE
+  CHARACTER(LEN=*), INTENT(IN) :: HNAME
+  INTEGER, DIMENSION(:), INTENT(IN) :: NDIMS
+  !
+  SELECT CASE(HNAME)
+  !
+  CASE('LLES_CURRENT_CART_MASK')
+    CALL LES_ALLOCATE_DIM(TLES%LLES_CURRENT_CART_MASK,NDIMS)
+    LLES_CURRENT_CART_MASK=>TLES%LLES_CURRENT_CART_MASK
+  CASE('LLES_CURRENT_NEB_MASK')
+    CALL LES_ALLOCATE_DIM(TLES%LLES_CURRENT_NEB_MASK,NDIMS)
+    LLES_CURRENT_NEB_MASK=>TLES%LLES_CURRENT_NEB_MASK
+  CASE('LLES_CURRENT_CORE_MASK')
+    CALL LES_ALLOCATE_DIM(TLES%LLES_CURRENT_CORE_MASK,NDIMS)
+    LLES_CURRENT_CORE_MASK=>TLES%LLES_CURRENT_CORE_MASK
+  CASE('LLES_CURRENT_MY_MASKS')
+    CALL LES_ALLOCATE_DIM(TLES%LLES_CURRENT_MY_MASKS,NDIMS)
+    LLES_CURRENT_MY_MASKS=>TLES%LLES_CURRENT_MY_MASKS
+  CASE('LLES_CURRENT_CS1_MASK')
+    CALL LES_ALLOCATE_DIM(TLES%LLES_CURRENT_CS1_MASK,NDIMS)
+    LLES_CURRENT_CS1_MASK=>TLES%LLES_CURRENT_CS1_MASK
+  CASE('LLES_CURRENT_CS2_MASK')
+    CALL LES_ALLOCATE_DIM(TLES%LLES_CURRENT_CS2_MASK,NDIMS)
+    LLES_CURRENT_CS2_MASK=>TLES%LLES_CURRENT_CS2_MASK
+  CASE('LLES_CURRENT_CS3_MASK')
+    CALL LES_ALLOCATE_DIM(TLES%LLES_CURRENT_CS3_MASK,NDIMS)
+    LLES_CURRENT_CS3_MASK=>TLES%LLES_CURRENT_CS3_MASK
+  CASE('XLES_CURRENT_Z')
+    CALL LES_ALLOCATE_DIM(TLES%XLES_CURRENT_Z,NDIMS)
+    XLES_CURRENT_Z=>TLES%XLES_CURRENT_Z
+  CASE('NKLIN_CURRENT_LES')
+    CALL LES_ALLOCATE_DIM(TLES%NKLIN_CURRENT_LES,NDIMS)
+    NKLIN_CURRENT_LES=>TLES%NKLIN_CURRENT_LES
+  CASE('XCOEFLIN_CURRENT_LES')
+    CALL LES_ALLOCATE_DIM(TLES%XCOEFLIN_CURRENT_LES,NDIMS)
+    XCOEFLIN_CURRENT_LES=>TLES%XCOEFLIN_CURRENT_LES
+  CASE('NKLIN_CURRENT_SPEC')
+    CALL LES_ALLOCATE_DIM(TLES%NKLIN_CURRENT_SPEC,NDIMS)
+    NKLIN_CURRENT_SPEC=>TLES%NKLIN_CURRENT_SPEC
+  CASE('XCOEFLIN_CURRENT_SPEC')
+    CALL LES_ALLOCATE_DIM(TLES%XCOEFLIN_CURRENT_SPEC,NDIMS)
+    XCOEFLIN_CURRENT_SPEC=>TLES%XCOEFLIN_CURRENT_SPEC
+  CASE('XLES_NORM_M')
+    CALL LES_ALLOCATE_DIM(TLES%XLES_NORM_M,NDIMS)
+    XLES_NORM_M=>TLES%XLES_NORM_M
+  CASE('XLES_NORM_K')
+    CALL LES_ALLOCATE_DIM(TLES%XLES_NORM_K,NDIMS)
+    XLES_NORM_K=>TLES%XLES_NORM_K
+  CASE('XLES_NORM_S')
+    CALL LES_ALLOCATE_DIM(TLES%XLES_NORM_S,NDIMS)
+    XLES_NORM_S=>TLES%XLES_NORM_S
+  CASE('XLES_NORM_RHO')
+    CALL LES_ALLOCATE_DIM(TLES%XLES_NORM_RHO,NDIMS)
+    XLES_NORM_RHO=>TLES%XLES_NORM_RHO
+  CASE('XLES_NORM_RV')
+    CALL LES_ALLOCATE_DIM(TLES%XLES_NORM_RV,NDIMS)
+    XLES_NORM_RV=>TLES%XLES_NORM_RV
+  CASE('XLES_NORM_SV')
+    CALL LES_ALLOCATE_DIM(TLES%XLES_NORM_SV,NDIMS)
+    XLES_NORM_SV=>TLES%XLES_NORM_SV
+  CASE('XLES_NORM_P')
+    CALL LES_ALLOCATE_DIM(TLES%XLES_NORM_P,NDIMS)
+    XLES_NORM_P=>TLES%XLES_NORM_P
+  CASE('X_LES_RES_W_SBG_WThl')
+    CALL LES_ALLOCATE_DIM(TLES%X_LES_RES_W_SBG_WThl,NDIMS)
+    X_LES_RES_W_SBG_WThl=>TLES%X_LES_RES_W_SBG_WThl
+  CASE('X_LES_RES_W_SBG_WRt')
+    CALL LES_ALLOCATE_DIM(TLES%X_LES_RES_W_SBG_WRt,NDIMS)
+    X_LES_RES_W_SBG_WRt=>TLES%X_LES_RES_W_SBG_WRt
+  CASE('X_LES_RES_W_SBG_Thl2')
+    CALL LES_ALLOCATE_DIM(TLES%X_LES_RES_W_SBG_Thl2,NDIMS)
+    X_LES_RES_W_SBG_Thl2=>TLES%X_LES_RES_W_SBG_Thl2
+  CASE('X_LES_RES_W_SBG_Rt2')
+    CALL LES_ALLOCATE_DIM(TLES%X_LES_RES_W_SBG_Rt2,NDIMS)
+    X_LES_RES_W_SBG_Rt2=>TLES%X_LES_RES_W_SBG_Rt2
+  CASE('X_LES_RES_W_SBG_ThlRt')
+    CALL LES_ALLOCATE_DIM(TLES%X_LES_RES_W_SBG_ThlRt,NDIMS)
+    X_LES_RES_W_SBG_ThlRt=>TLES%X_LES_RES_W_SBG_ThlRt
+  CASE('X_LES_RES_W_SBG_WSv')
+    CALL LES_ALLOCATE_DIM(TLES%X_LES_RES_W_SBG_WSv,NDIMS)
+    X_LES_RES_W_SBG_WSv=>TLES%X_LES_RES_W_SBG_WSv
+  CASE('X_LES_RES_W_SBG_Sv2')
+    CALL LES_ALLOCATE_DIM(TLES%X_LES_RES_W_SBG_Sv2,NDIMS)
+    X_LES_RES_W_SBG_Sv2=>TLES%X_LES_RES_W_SBG_Sv2
+  CASE('XLES_SUBGRID_RCSIGS')
+    CALL LES_ALLOCATE_DIM(TLES%XLES_SUBGRID_RCSIGS,NDIMS)
+    XLES_SUBGRID_RCSIGS=>TLES%XLES_SUBGRID_RCSIGS
+  CASE('XLES_SUBGRID_RCSIGC')
+    CALL LES_ALLOCATE_DIM(TLES%XLES_SUBGRID_RCSIGC,NDIMS)
+    XLES_SUBGRID_RCSIGC=>TLES%XLES_SUBGRID_RCSIGC
+  CASE('X_LES_RES_ddxa_U_SBG_UaU')
+    CALL LES_ALLOCATE_DIM(TLES%X_LES_RES_ddxa_U_SBG_UaU,NDIMS)
+    X_LES_RES_ddxa_U_SBG_UaU=>TLES%X_LES_RES_ddxa_U_SBG_UaU
+  CASE('X_LES_RES_ddxa_V_SBG_UaV')
+    CALL LES_ALLOCATE_DIM(TLES%X_LES_RES_ddxa_V_SBG_UaV,NDIMS)
+    X_LES_RES_ddxa_V_SBG_UaV=>TLES%X_LES_RES_ddxa_V_SBG_UaV
+  CASE('X_LES_RES_ddxa_W_SBG_UaW')
+    CALL LES_ALLOCATE_DIM(TLES%X_LES_RES_ddxa_W_SBG_UaW,NDIMS)
+    X_LES_RES_ddxa_W_SBG_UaW=>TLES%X_LES_RES_ddxa_W_SBG_UaW
+  CASE('X_LES_RES_ddxa_W_SBG_UaThl')
+    CALL LES_ALLOCATE_DIM(TLES%X_LES_RES_ddxa_W_SBG_UaThl,NDIMS)
+    X_LES_RES_ddxa_W_SBG_UaThl=>TLES%X_LES_RES_ddxa_W_SBG_UaThl
+  CASE('X_LES_RES_ddxa_Thl_SBG_UaW')
+    CALL LES_ALLOCATE_DIM(TLES%X_LES_RES_ddxa_Thl_SBG_UaW,NDIMS)
+    X_LES_RES_ddxa_Thl_SBG_UaW=>TLES%X_LES_RES_ddxa_Thl_SBG_UaW
+  CASE('X_LES_RES_ddz_Thl_SBG_W2')
+    CALL LES_ALLOCATE_DIM(TLES%X_LES_RES_ddz_Thl_SBG_W2,NDIMS)
+    X_LES_RES_ddz_Thl_SBG_W2=>TLES%X_LES_RES_ddz_Thl_SBG_W2
+  CASE('X_LES_RES_ddxa_W_SBG_UaRt')
+    CALL LES_ALLOCATE_DIM(TLES%X_LES_RES_ddxa_W_SBG_UaRt,NDIMS)
+    X_LES_RES_ddxa_W_SBG_UaRt=>TLES%X_LES_RES_ddxa_W_SBG_UaRt
+  CASE('X_LES_RES_ddxa_Rt_SBG_UaW')
+    CALL LES_ALLOCATE_DIM(TLES%X_LES_RES_ddxa_Rt_SBG_UaW,NDIMS)
+    X_LES_RES_ddxa_Rt_SBG_UaW=>TLES%X_LES_RES_ddxa_Rt_SBG_UaW
+  CASE('X_LES_RES_ddz_Rt_SBG_W2')
+    CALL LES_ALLOCATE_DIM(TLES%X_LES_RES_ddz_Rt_SBG_W2,NDIMS)
+    X_LES_RES_ddz_Rt_SBG_W2=>TLES%X_LES_RES_ddz_Rt_SBG_W2
+  CASE('X_LES_RES_ddxa_Thl_SBG_UaRt')
+    CALL LES_ALLOCATE_DIM(TLES%X_LES_RES_ddxa_Thl_SBG_UaRt,NDIMS)
+    X_LES_RES_ddxa_Thl_SBG_UaRt=>TLES%X_LES_RES_ddxa_Thl_SBG_UaRt
+  CASE('X_LES_RES_ddxa_Rt_SBG_UaThl')
+    CALL LES_ALLOCATE_DIM(TLES%X_LES_RES_ddxa_Rt_SBG_UaThl,NDIMS)
+    X_LES_RES_ddxa_Rt_SBG_UaThl=>TLES%X_LES_RES_ddxa_Rt_SBG_UaThl
+  CASE('X_LES_RES_ddxa_Thl_SBG_UaThl')
+    CALL LES_ALLOCATE_DIM(TLES%X_LES_RES_ddxa_Thl_SBG_UaThl,NDIMS)
+    X_LES_RES_ddxa_Thl_SBG_UaThl=>TLES%X_LES_RES_ddxa_Thl_SBG_UaThl
+  CASE('X_LES_RES_ddxa_Rt_SBG_UaRt')
+    CALL LES_ALLOCATE_DIM(TLES%X_LES_RES_ddxa_Rt_SBG_UaRt,NDIMS)
+    X_LES_RES_ddxa_Rt_SBG_UaRt=>TLES%X_LES_RES_ddxa_Rt_SBG_UaRt
+  CASE('X_LES_RES_ddxa_W_SBG_UaSv')
+    CALL LES_ALLOCATE_DIM(TLES%X_LES_RES_ddxa_W_SBG_UaSv,NDIMS)
+    X_LES_RES_ddxa_W_SBG_UaSv=>TLES%X_LES_RES_ddxa_W_SBG_UaSv
+  CASE('X_LES_RES_ddxa_Sv_SBG_UaW')
+    CALL LES_ALLOCATE_DIM(TLES%X_LES_RES_ddxa_Sv_SBG_UaW,NDIMS)
+    X_LES_RES_ddxa_Sv_SBG_UaW=>TLES%X_LES_RES_ddxa_Sv_SBG_UaW
+  CASE('X_LES_RES_ddz_Sv_SBG_W2')
+    CALL LES_ALLOCATE_DIM(TLES%X_LES_RES_ddz_Sv_SBG_W2,NDIMS)
+    X_LES_RES_ddz_Sv_SBG_W2=>TLES%X_LES_RES_ddz_Sv_SBG_W2
+  CASE('X_LES_RES_ddxa_Sv_SBG_UaSv')
+    CALL LES_ALLOCATE_DIM(TLES%X_LES_RES_ddxa_Sv_SBG_UaSv,NDIMS)
+    X_LES_RES_ddxa_Sv_SBG_UaSv=>TLES%X_LES_RES_ddxa_Sv_SBG_UaSv
+  CASE('X_LES_SUBGRID_U2')
+    CALL LES_ALLOCATE_DIM(TLES%X_LES_SUBGRID_U2,NDIMS)
+    X_LES_SUBGRID_U2=>TLES%X_LES_SUBGRID_U2
+  CASE('X_LES_SUBGRID_V2')
+    CALL LES_ALLOCATE_DIM(TLES%X_LES_SUBGRID_V2,NDIMS)
+    X_LES_SUBGRID_V2=>TLES%X_LES_SUBGRID_V2
+  CASE('X_LES_SUBGRID_W2')
+    CALL LES_ALLOCATE_DIM(TLES%X_LES_SUBGRID_W2,NDIMS)
+    X_LES_SUBGRID_W2=>TLES%X_LES_SUBGRID_W2
+  CASE('X_LES_SUBGRID_Thl2')
+    CALL LES_ALLOCATE_DIM(TLES%X_LES_SUBGRID_Thl2,NDIMS)
+    X_LES_SUBGRID_Thl2=>TLES%X_LES_SUBGRID_Thl2
+  CASE('X_LES_SUBGRID_Rt2')
+    CALL LES_ALLOCATE_DIM(TLES%X_LES_SUBGRID_Rt2,NDIMS)
+    X_LES_SUBGRID_Rt2=>TLES%X_LES_SUBGRID_Rt2
+  CASE('X_LES_SUBGRID_Rc2')
+    CALL LES_ALLOCATE_DIM(TLES%X_LES_SUBGRID_Rc2,NDIMS)
+    X_LES_SUBGRID_Rc2=>TLES%X_LES_SUBGRID_Rc2
+  CASE('X_LES_SUBGRID_Ri2')
+    CALL LES_ALLOCATE_DIM(TLES%X_LES_SUBGRID_Ri2,NDIMS)
+    X_LES_SUBGRID_Ri2=>TLES%X_LES_SUBGRID_Ri2
+  CASE('X_LES_SUBGRID_ThlRt')
+    CALL LES_ALLOCATE_DIM(TLES%X_LES_SUBGRID_ThlRt,NDIMS)
+    X_LES_SUBGRID_ThlRt=>TLES%X_LES_SUBGRID_ThlRt
+  CASE('X_LES_SUBGRID_Sv2')
+    CALL LES_ALLOCATE_DIM(TLES%X_LES_SUBGRID_Sv2,NDIMS)
+    X_LES_SUBGRID_Sv2=>TLES%X_LES_SUBGRID_Sv2
+  CASE('X_LES_SUBGRID_UV')
+    CALL LES_ALLOCATE_DIM(TLES%X_LES_SUBGRID_UV,NDIMS)
+    X_LES_SUBGRID_UV=>TLES%X_LES_SUBGRID_UV
+  CASE('X_LES_SUBGRID_WU')
+    CALL LES_ALLOCATE_DIM(TLES%X_LES_SUBGRID_WU,NDIMS)
+    X_LES_SUBGRID_WU=>TLES%X_LES_SUBGRID_WU
+  CASE('X_LES_SUBGRID_WV')
+    CALL LES_ALLOCATE_DIM(TLES%X_LES_SUBGRID_WV,NDIMS)
+    X_LES_SUBGRID_WV=>TLES%X_LES_SUBGRID_WV
+  CASE('X_LES_SUBGRID_UThl')
+    CALL LES_ALLOCATE_DIM(TLES%X_LES_SUBGRID_UThl,NDIMS)
+    X_LES_SUBGRID_UThl=>TLES%X_LES_SUBGRID_UThl
+  CASE('X_LES_SUBGRID_VThl')
+    CALL LES_ALLOCATE_DIM(TLES%X_LES_SUBGRID_VThl,NDIMS)
+    X_LES_SUBGRID_VThl=>TLES%X_LES_SUBGRID_VThl
+  CASE('X_LES_SUBGRID_WThl')
+    CALL LES_ALLOCATE_DIM(TLES%X_LES_SUBGRID_WThl,NDIMS)
+    X_LES_SUBGRID_WThl=>TLES%X_LES_SUBGRID_WThl
+  CASE('X_LES_SUBGRID_URt')
+    CALL LES_ALLOCATE_DIM(TLES%X_LES_SUBGRID_URt,NDIMS)
+    X_LES_SUBGRID_URt=>TLES%X_LES_SUBGRID_URt
+  CASE('X_LES_SUBGRID_VRt')
+    CALL LES_ALLOCATE_DIM(TLES%X_LES_SUBGRID_VRt,NDIMS)
+    X_LES_SUBGRID_VRt=>TLES%X_LES_SUBGRID_VRt
+  CASE('X_LES_SUBGRID_WRt')
+    CALL LES_ALLOCATE_DIM(TLES%X_LES_SUBGRID_WRt,NDIMS)
+    X_LES_SUBGRID_WRt=>TLES%X_LES_SUBGRID_WRt
+  CASE('X_LES_SUBGRID_URc')
+    CALL LES_ALLOCATE_DIM(TLES%X_LES_SUBGRID_URc,NDIMS)
+    X_LES_SUBGRID_URc=>TLES%X_LES_SUBGRID_URc
+  CASE('X_LES_SUBGRID_VRc')
+    CALL LES_ALLOCATE_DIM(TLES%X_LES_SUBGRID_VRc,NDIMS)
+    X_LES_SUBGRID_VRc=>TLES%X_LES_SUBGRID_VRc
+  CASE('X_LES_SUBGRID_WRc')
+    CALL LES_ALLOCATE_DIM(TLES%X_LES_SUBGRID_WRc,NDIMS)
+    X_LES_SUBGRID_WRc=>TLES%X_LES_SUBGRID_WRc
+  CASE('X_LES_SUBGRID_USv')
+    CALL LES_ALLOCATE_DIM(TLES%X_LES_SUBGRID_USv,NDIMS)
+    X_LES_SUBGRID_USv=>TLES%X_LES_SUBGRID_USv
+  CASE('X_LES_SUBGRID_VSv')
+    CALL LES_ALLOCATE_DIM(TLES%X_LES_SUBGRID_VSv,NDIMS)
+    X_LES_SUBGRID_VSv=>TLES%X_LES_SUBGRID_VSv
+  CASE('X_LES_SUBGRID_WSv')
+    CALL LES_ALLOCATE_DIM(TLES%X_LES_SUBGRID_WSv,NDIMS)
+    X_LES_SUBGRID_WSv=>TLES%X_LES_SUBGRID_WSv
+  CASE('X_LES_SUBGRID_UTke')
+    CALL LES_ALLOCATE_DIM(TLES%X_LES_SUBGRID_UTke,NDIMS)
+    X_LES_SUBGRID_UTke=>TLES%X_LES_SUBGRID_UTke
+  CASE('X_LES_SUBGRID_VTke')
+    CALL LES_ALLOCATE_DIM(TLES%X_LES_SUBGRID_VTke,NDIMS)
+    X_LES_SUBGRID_VTke=>TLES%X_LES_SUBGRID_VTke
+  CASE('X_LES_SUBGRID_WTke')
+    CALL LES_ALLOCATE_DIM(TLES%X_LES_SUBGRID_WTke,NDIMS)
+    X_LES_SUBGRID_WTke=>TLES%X_LES_SUBGRID_WTke
+  CASE('X_LES_SUBGRID_ddz_WTke')
+    CALL LES_ALLOCATE_DIM(TLES%X_LES_SUBGRID_ddz_WTke,NDIMS)
+    X_LES_SUBGRID_ddz_WTke=>TLES%X_LES_SUBGRID_ddz_WTke
+  CASE('X_LES_SUBGRID_WThv')
+    CALL LES_ALLOCATE_DIM(TLES%X_LES_SUBGRID_WThv,NDIMS)
+    X_LES_SUBGRID_WThv=>TLES%X_LES_SUBGRID_WThv
+  CASE('X_LES_SUBGRID_ThlThv')
+    CALL LES_ALLOCATE_DIM(TLES%X_LES_SUBGRID_ThlThv,NDIMS)
+    X_LES_SUBGRID_ThlThv=>TLES%X_LES_SUBGRID_ThlThv
+  CASE('X_LES_SUBGRID_RtThv')
+    CALL LES_ALLOCATE_DIM(TLES%X_LES_SUBGRID_RtThv,NDIMS)
+    X_LES_SUBGRID_RtThv=>TLES%X_LES_SUBGRID_RtThv
+  CASE('X_LES_SUBGRID_SvThv')
+    CALL LES_ALLOCATE_DIM(TLES%X_LES_SUBGRID_SvThv,NDIMS)
+    X_LES_SUBGRID_SvThv=>TLES%X_LES_SUBGRID_SvThv
+  CASE('X_LES_SUBGRID_W2Thl')
+    CALL LES_ALLOCATE_DIM(TLES%X_LES_SUBGRID_W2Thl,NDIMS)
+    X_LES_SUBGRID_W2Thl=>TLES%X_LES_SUBGRID_W2Thl
+  CASE('X_LES_SUBGRID_W2Rt')
+    CALL LES_ALLOCATE_DIM(TLES%X_LES_SUBGRID_W2Rt,NDIMS)
+    X_LES_SUBGRID_W2Rt=>TLES%X_LES_SUBGRID_W2Rt
+  CASE('X_LES_SUBGRID_W2Sv')
+    CALL LES_ALLOCATE_DIM(TLES%X_LES_SUBGRID_W2Sv,NDIMS)
+    X_LES_SUBGRID_W2Sv=>TLES%X_LES_SUBGRID_W2Sv
+  CASE('X_LES_SUBGRID_WThlRt')
+    CALL LES_ALLOCATE_DIM(TLES%X_LES_SUBGRID_WThlRt,NDIMS)
+    X_LES_SUBGRID_WThlRt=>TLES%X_LES_SUBGRID_WThlRt
+  CASE('X_LES_SUBGRID_WThl2')
+    CALL LES_ALLOCATE_DIM(TLES%X_LES_SUBGRID_WThl2,NDIMS)
+    X_LES_SUBGRID_WThl2=>TLES%X_LES_SUBGRID_WThl2
+  CASE('X_LES_SUBGRID_WRt2')
+    CALL LES_ALLOCATE_DIM(TLES%X_LES_SUBGRID_WRt2,NDIMS)
+    X_LES_SUBGRID_WRt2=>TLES%X_LES_SUBGRID_WRt2
+  CASE('X_LES_SUBGRID_WSv2')
+    CALL LES_ALLOCATE_DIM(TLES%X_LES_SUBGRID_WSv2,NDIMS)
+    X_LES_SUBGRID_WSv2=>TLES%X_LES_SUBGRID_WSv2
+  CASE('X_LES_SUBGRID_DISS_Tke')
+    CALL LES_ALLOCATE_DIM(TLES%X_LES_SUBGRID_DISS_Tke,NDIMS)
+    X_LES_SUBGRID_DISS_Tke=>TLES%X_LES_SUBGRID_DISS_Tke
+  CASE('X_LES_SUBGRID_DISS_Thl2')
+    CALL LES_ALLOCATE_DIM(TLES%X_LES_SUBGRID_DISS_Thl2,NDIMS)
+    X_LES_SUBGRID_DISS_Thl2=>TLES%X_LES_SUBGRID_DISS_Thl2
+  CASE('X_LES_SUBGRID_DISS_Rt2')
+    CALL LES_ALLOCATE_DIM(TLES%X_LES_SUBGRID_DISS_Rt2,NDIMS)
+    X_LES_SUBGRID_DISS_Rt2=>TLES%X_LES_SUBGRID_DISS_Rt2
+  CASE('X_LES_SUBGRID_DISS_ThlRt')
+    CALL LES_ALLOCATE_DIM(TLES%X_LES_SUBGRID_DISS_ThlRt,NDIMS)
+    X_LES_SUBGRID_DISS_ThlRt=>TLES%X_LES_SUBGRID_DISS_ThlRt
+  CASE('X_LES_SUBGRID_DISS_Sv2')
+    CALL LES_ALLOCATE_DIM(TLES%X_LES_SUBGRID_DISS_Sv2,NDIMS)
+    X_LES_SUBGRID_DISS_Sv2=>TLES%X_LES_SUBGRID_DISS_Sv2
+  CASE('X_LES_SUBGRID_WP')
+    CALL LES_ALLOCATE_DIM(TLES%X_LES_SUBGRID_WP,NDIMS)
+    X_LES_SUBGRID_WP=>TLES%X_LES_SUBGRID_WP
+  CASE('X_LES_SUBGRID_ThlPz')
+    CALL LES_ALLOCATE_DIM(TLES%X_LES_SUBGRID_ThlPz,NDIMS)
+    X_LES_SUBGRID_ThlPz=>TLES%X_LES_SUBGRID_ThlPz
+  CASE('X_LES_SUBGRID_RtPz')
+    CALL LES_ALLOCATE_DIM(TLES%X_LES_SUBGRID_RtPz,NDIMS)
+    X_LES_SUBGRID_RtPz=>TLES%X_LES_SUBGRID_RtPz
+  CASE('X_LES_SUBGRID_SvPz')
+    CALL LES_ALLOCATE_DIM(TLES%X_LES_SUBGRID_SvPz,NDIMS)
+    X_LES_SUBGRID_SvPz=>TLES%X_LES_SUBGRID_SvPz
+  CASE('X_LES_SUBGRID_PHI3')
+    CALL LES_ALLOCATE_DIM(TLES%X_LES_SUBGRID_PHI3,NDIMS)
+    X_LES_SUBGRID_PHI3=>TLES%X_LES_SUBGRID_PHI3
+  CASE('X_LES_SUBGRID_PSI3')
+    CALL LES_ALLOCATE_DIM(TLES%X_LES_SUBGRID_PSI3,NDIMS)
+    X_LES_SUBGRID_PSI3=>TLES%X_LES_SUBGRID_PSI3
+  CASE('X_LES_SUBGRID_LMix')
+    CALL LES_ALLOCATE_DIM(TLES%X_LES_SUBGRID_LMix,NDIMS)
+    X_LES_SUBGRID_LMix=>TLES%X_LES_SUBGRID_LMix
+  CASE('X_LES_SUBGRID_LDiss')
+    CALL LES_ALLOCATE_DIM(TLES%X_LES_SUBGRID_LDiss,NDIMS)
+    X_LES_SUBGRID_LDiss=>TLES%X_LES_SUBGRID_LDiss
+  CASE('X_LES_SUBGRID_Km')
+    CALL LES_ALLOCATE_DIM(TLES%X_LES_SUBGRID_Km,NDIMS)
+    X_LES_SUBGRID_Km=>TLES%X_LES_SUBGRID_Km
+  CASE('X_LES_SUBGRID_Kh')
+    CALL LES_ALLOCATE_DIM(TLES%X_LES_SUBGRID_Kh,NDIMS)
+    X_LES_SUBGRID_Kh=>TLES%X_LES_SUBGRID_Kh
+  CASE('X_LES_SUBGRID_THLUP_MF')
+    CALL LES_ALLOCATE_DIM(TLES%X_LES_SUBGRID_THLUP_MF,NDIMS)
+    X_LES_SUBGRID_THLUP_MF=>TLES%X_LES_SUBGRID_THLUP_MF
+  CASE('X_LES_SUBGRID_RTUP_MF')
+    CALL LES_ALLOCATE_DIM(TLES%X_LES_SUBGRID_RTUP_MF,NDIMS)
+    X_LES_SUBGRID_RTUP_MF=>TLES%X_LES_SUBGRID_RTUP_MF
+  CASE('X_LES_SUBGRID_RVUP_MF')
+    CALL LES_ALLOCATE_DIM(TLES%X_LES_SUBGRID_RVUP_MF,NDIMS)
+    X_LES_SUBGRID_RVUP_MF=>TLES%X_LES_SUBGRID_RVUP_MF
+  CASE('X_LES_SUBGRID_RCUP_MF')
+    CALL LES_ALLOCATE_DIM(TLES%X_LES_SUBGRID_RCUP_MF,NDIMS)
+    X_LES_SUBGRID_RCUP_MF=>TLES%X_LES_SUBGRID_RCUP_MF
+  CASE('X_LES_SUBGRID_RIUP_MF')
+    CALL LES_ALLOCATE_DIM(TLES%X_LES_SUBGRID_RIUP_MF,NDIMS)
+    X_LES_SUBGRID_RIUP_MF=>TLES%X_LES_SUBGRID_RIUP_MF
+  CASE('X_LES_SUBGRID_WUP_MF')
+    CALL LES_ALLOCATE_DIM(TLES%X_LES_SUBGRID_WUP_MF,NDIMS)
+    X_LES_SUBGRID_WUP_MF=>TLES%X_LES_SUBGRID_WUP_MF
+  CASE('X_LES_SUBGRID_MASSFLUX')
+    CALL LES_ALLOCATE_DIM(TLES%X_LES_SUBGRID_MASSFLUX,NDIMS)
+    X_LES_SUBGRID_MASSFLUX=>TLES%X_LES_SUBGRID_MASSFLUX
+  CASE('X_LES_SUBGRID_DETR')
+    CALL LES_ALLOCATE_DIM(TLES%X_LES_SUBGRID_DETR,NDIMS)
+    X_LES_SUBGRID_DETR=>TLES%X_LES_SUBGRID_DETR
+  CASE('X_LES_SUBGRID_ENTR')
+    CALL LES_ALLOCATE_DIM(TLES%X_LES_SUBGRID_ENTR,NDIMS)
+    X_LES_SUBGRID_ENTR=>TLES%X_LES_SUBGRID_ENTR
+  CASE('X_LES_SUBGRID_FRACUP')
+    CALL LES_ALLOCATE_DIM(TLES%X_LES_SUBGRID_FRACUP,NDIMS)
+    X_LES_SUBGRID_FRACUP=>TLES%X_LES_SUBGRID_FRACUP
+  CASE('X_LES_SUBGRID_THVUP_MF')
+    CALL LES_ALLOCATE_DIM(TLES%X_LES_SUBGRID_THVUP_MF,NDIMS)
+    X_LES_SUBGRID_THVUP_MF=>TLES%X_LES_SUBGRID_THVUP_MF
+  CASE('X_LES_SUBGRID_WTHLMF')
+    CALL LES_ALLOCATE_DIM(TLES%X_LES_SUBGRID_WTHLMF,NDIMS)
+    X_LES_SUBGRID_WTHLMF=>TLES%X_LES_SUBGRID_WTHLMF
+  CASE('X_LES_SUBGRID_WRTMF')
+    CALL LES_ALLOCATE_DIM(TLES%X_LES_SUBGRID_WRTMF,NDIMS)
+    X_LES_SUBGRID_WRTMF=>TLES%X_LES_SUBGRID_WRTMF
+  CASE('X_LES_SUBGRID_WTHVMF')
+    CALL LES_ALLOCATE_DIM(TLES%X_LES_SUBGRID_WTHVMF,NDIMS)
+    X_LES_SUBGRID_WTHVMF=>TLES%X_LES_SUBGRID_WTHVMF
+  CASE('X_LES_SUBGRID_WUMF')
+    CALL LES_ALLOCATE_DIM(TLES%X_LES_SUBGRID_WUMF,NDIMS)
+    X_LES_SUBGRID_WUMF=>TLES%X_LES_SUBGRID_WUMF
+  CASE('X_LES_SUBGRID_WVMF')
+    CALL LES_ALLOCATE_DIM(TLES%X_LES_SUBGRID_WVMF,NDIMS)
+    X_LES_SUBGRID_WVMF=>TLES%X_LES_SUBGRID_WVMF
+  CASE('X_LES_USTAR')
+    CALL LES_ALLOCATE_DIM(TLES%X_LES_USTAR,NDIMS)
+    X_LES_USTAR=>TLES%X_LES_USTAR
+  CASE('X_LES_UW0')
+    CALL LES_ALLOCATE_DIM(TLES%X_LES_UW0,NDIMS)
+    X_LES_UW0=>TLES%X_LES_UW0
+  CASE('X_LES_VW0')
+    CALL LES_ALLOCATE_DIM(TLES%X_LES_VW0,NDIMS)
+    X_LES_VW0=>TLES%X_LES_VW0
+  CASE('X_LES_Q0')
+    CALL LES_ALLOCATE_DIM(TLES%X_LES_Q0,NDIMS)
+    X_LES_Q0=>TLES%X_LES_Q0
+  CASE('X_LES_E0')
+    CALL LES_ALLOCATE_DIM(TLES%X_LES_E0,NDIMS)
+    X_LES_E0=>TLES%X_LES_E0
+  CASE('X_LES_SV0')
+    CALL LES_ALLOCATE_DIM(TLES%X_LES_SV0,NDIMS)
+    X_LES_SV0=>TLES%X_LES_SV0
+  CASE('XLES_PDF_RV')
+    CALL LES_ALLOCATE_DIM(TLES%XLES_PDF_RV,NDIMS)
+    XLES_PDF_RV=>TLES%XLES_PDF_RV
+  CASE('XLES_PDF_TH')
+    CALL LES_ALLOCATE_DIM(TLES%XLES_PDF_TH,NDIMS)
+    XLES_PDF_TH=>TLES%XLES_PDF_TH
+  CASE('XLES_PDF_W')
+    CALL LES_ALLOCATE_DIM(TLES%XLES_PDF_W,NDIMS)
+    XLES_PDF_W=>TLES%XLES_PDF_W
+  CASE('XLES_PDF_THV')
+    CALL LES_ALLOCATE_DIM(TLES%XLES_PDF_THV,NDIMS)
+    XLES_PDF_THV=>TLES%XLES_PDF_THV
+  CASE('XLES_PDF_RC')
+    CALL LES_ALLOCATE_DIM(TLES%XLES_PDF_RC,NDIMS)
+    XLES_PDF_RC=>TLES%XLES_PDF_RC
+  CASE('XLES_PDF_RR')
+    CALL LES_ALLOCATE_DIM(TLES%XLES_PDF_RR,NDIMS)
+    XLES_PDF_RR=>TLES%XLES_PDF_RR
+  CASE('XLES_PDF_RI')
+    CALL LES_ALLOCATE_DIM(TLES%XLES_PDF_RI,NDIMS)
+    XLES_PDF_RI=>TLES%XLES_PDF_RI
+  CASE('XLES_PDF_RS')
+    CALL LES_ALLOCATE_DIM(TLES%XLES_PDF_RS,NDIMS)
+    XLES_PDF_RS=>TLES%XLES_PDF_RS
+  CASE('XLES_PDF_RG')
+    CALL LES_ALLOCATE_DIM(TLES%XLES_PDF_RG,NDIMS)
+    XLES_PDF_RG=>TLES%XLES_PDF_RG
+  CASE('XLES_PDF_RT')
+    CALL LES_ALLOCATE_DIM(TLES%XLES_PDF_RT,NDIMS)
+    XLES_PDF_RT=>TLES%XLES_PDF_RT
+  CASE('XLES_PDF_THL')
+    CALL LES_ALLOCATE_DIM(TLES%XLES_PDF_THL,NDIMS)
+    XLES_PDF_THL=>TLES%XLES_PDF_THL
+  END SELECT
+  !
+END SUBROUTINE LES_ALLOCATE
+!
+SUBROUTINE LES_DEALLOCATE(HNAME)
+  IMPLICIT NONE
+  CHARACTER(LEN=*), INTENT(IN) :: HNAME
+!
+  SELECT CASE(HNAME)
+  CASE('LLES_CURRENT_CART_MASK')
+    LLES_CURRENT_CART_MASK=>NULL()
+    DEALLOCATE(TLES%LLES_CURRENT_CART_MASK)
+  CASE('LLES_CURRENT_NEB_MASK')
+    LLES_CURRENT_NEB_MASK=>NULL()
+    DEALLOCATE(TLES%LLES_CURRENT_NEB_MASK)
+  CASE('LLES_CURRENT_CORE_MASK')
+    LLES_CURRENT_CORE_MASK=>NULL()
+    DEALLOCATE(TLES%LLES_CURRENT_CORE_MASK)
+  CASE('LLES_CURRENT_MY_MASKS')
+    LLES_CURRENT_MY_MASKS=>NULL()
+    DEALLOCATE(TLES%LLES_CURRENT_MY_MASKS)
+  CASE('LLES_CURRENT_CS1_MASK')
+    LLES_CURRENT_CS1_MASK=>NULL()
+    DEALLOCATE(TLES%LLES_CURRENT_CS1_MASK)
+  CASE('LLES_CURRENT_CS2_MASK')
+    LLES_CURRENT_CS2_MASK=>NULL()
+    DEALLOCATE(TLES%LLES_CURRENT_CS2_MASK)
+  CASE('LLES_CURRENT_CS3_MASK')
+    LLES_CURRENT_CS3_MASK=>NULL()
+    DEALLOCATE(TLES%LLES_CURRENT_CS3_MASK)
+  CASE('XLES_CURRENT_Z')
+    XLES_CURRENT_Z=>NULL()
+    DEALLOCATE(TLES%XLES_CURRENT_Z)
+  CASE('NKLIN_CURRENT_LES')
+    NKLIN_CURRENT_LES=>NULL()
+    DEALLOCATE(TLES%NKLIN_CURRENT_LES)
+  CASE('XCOEFLIN_CURRENT_LES')
+    XCOEFLIN_CURRENT_LES=>NULL()
+    DEALLOCATE(TLES%XCOEFLIN_CURRENT_LES)
+  CASE('NKLIN_CURRENT_SPEC')
+    NKLIN_CURRENT_SPEC=>NULL()
+    DEALLOCATE(TLES%NKLIN_CURRENT_SPEC)
+  CASE('XCOEFLIN_CURRENT_SPEC')
+    XCOEFLIN_CURRENT_SPEC=>NULL()
+    DEALLOCATE(TLES%XCOEFLIN_CURRENT_SPEC)
+  CASE('XLES_NORM_M')
+    XLES_NORM_M=>NULL()
+    DEALLOCATE(TLES%XLES_NORM_M)
+  CASE('XLES_NORM_K')
+    XLES_NORM_K=>NULL()
+    DEALLOCATE(TLES%XLES_NORM_K)
+  CASE('XLES_NORM_S')
+    XLES_NORM_S=>NULL()
+    DEALLOCATE(TLES%XLES_NORM_S)
+  CASE('XLES_NORM_RHO')
+    XLES_NORM_RHO=>NULL()
+    DEALLOCATE(TLES%XLES_NORM_RHO)
+  CASE('XLES_NORM_RV')
+    XLES_NORM_RV=>NULL()
+    DEALLOCATE(TLES%XLES_NORM_RV)
+  CASE('XLES_NORM_SV')
+    XLES_NORM_SV=>NULL()
+    DEALLOCATE(TLES%XLES_NORM_SV)
+  CASE('XLES_NORM_P')
+    XLES_NORM_P=>NULL()
+    DEALLOCATE(TLES%XLES_NORM_P)
+  CASE('X_LES_RES_W_SBG_WThl')
+    X_LES_RES_W_SBG_WThl=>NULL()
+    DEALLOCATE(TLES%X_LES_RES_W_SBG_WThl)
+  CASE('X_LES_RES_W_SBG_WRt')
+    X_LES_RES_W_SBG_WRt=>NULL()
+    DEALLOCATE(TLES%X_LES_RES_W_SBG_WRt)
+  CASE('X_LES_RES_W_SBG_Thl2')
+    X_LES_RES_W_SBG_Thl2=>NULL()
+    DEALLOCATE(TLES%X_LES_RES_W_SBG_Thl2)
+  CASE('X_LES_RES_W_SBG_Rt2')
+    X_LES_RES_W_SBG_Rt2=>NULL()
+    DEALLOCATE(TLES%X_LES_RES_W_SBG_Rt2)
+  CASE('X_LES_RES_W_SBG_ThlRt')
+    X_LES_RES_W_SBG_ThlRt=>NULL()
+    DEALLOCATE(TLES%X_LES_RES_W_SBG_ThlRt)
+  CASE('X_LES_RES_W_SBG_WSv')
+    X_LES_RES_W_SBG_WSv=>NULL()
+    DEALLOCATE(TLES%X_LES_RES_W_SBG_WSv)
+  CASE('X_LES_RES_W_SBG_Sv2')
+    X_LES_RES_W_SBG_Sv2=>NULL()
+    DEALLOCATE(TLES%X_LES_RES_W_SBG_Sv2)
+  CASE('XLES_SUBGRID_RCSIGS')
+    XLES_SUBGRID_RCSIGS=>NULL()
+    DEALLOCATE(TLES%XLES_SUBGRID_RCSIGS)
+  CASE('XLES_SUBGRID_RCSIGC')
+    XLES_SUBGRID_RCSIGC=>NULL()
+    DEALLOCATE(TLES%XLES_SUBGRID_RCSIGC)
+  CASE('X_LES_RES_ddxa_U_SBG_UaU')
+    X_LES_RES_ddxa_U_SBG_UaU=>NULL()
+    DEALLOCATE(TLES%X_LES_RES_ddxa_U_SBG_UaU)
+  CASE('X_LES_RES_ddxa_V_SBG_UaV')
+    X_LES_RES_ddxa_V_SBG_UaV=>NULL()
+    DEALLOCATE(TLES%X_LES_RES_ddxa_V_SBG_UaV)
+  CASE('X_LES_RES_ddxa_W_SBG_UaW')
+    X_LES_RES_ddxa_W_SBG_UaW=>NULL()
+    DEALLOCATE(TLES%X_LES_RES_ddxa_W_SBG_UaW)
+  CASE('X_LES_RES_ddxa_W_SBG_UaThl')
+    X_LES_RES_ddxa_W_SBG_UaThl=>NULL()
+    DEALLOCATE(TLES%X_LES_RES_ddxa_W_SBG_UaThl)
+  CASE('X_LES_RES_ddxa_Thl_SBG_UaW')
+    X_LES_RES_ddxa_Thl_SBG_UaW=>NULL()
+    DEALLOCATE(TLES%X_LES_RES_ddxa_Thl_SBG_UaW)
+  CASE('X_LES_RES_ddz_Thl_SBG_W2')
+    X_LES_RES_ddz_Thl_SBG_W2=>NULL()
+    DEALLOCATE(TLES%X_LES_RES_ddz_Thl_SBG_W2)
+  CASE('X_LES_RES_ddxa_W_SBG_UaRt')
+    X_LES_RES_ddxa_W_SBG_UaRt=>NULL()
+    DEALLOCATE(TLES%X_LES_RES_ddxa_W_SBG_UaRt)
+  CASE('X_LES_RES_ddxa_Rt_SBG_UaW')
+    X_LES_RES_ddxa_Rt_SBG_UaW=>NULL()
+    DEALLOCATE(TLES%X_LES_RES_ddxa_Rt_SBG_UaW)
+  CASE('X_LES_RES_ddz_Rt_SBG_W2')
+    X_LES_RES_ddz_Rt_SBG_W2=>NULL()
+    DEALLOCATE(TLES%X_LES_RES_ddz_Rt_SBG_W2)
+  CASE('X_LES_RES_ddxa_Thl_SBG_UaRt')
+    X_LES_RES_ddxa_Thl_SBG_UaRt=>NULL()
+    DEALLOCATE(TLES%X_LES_RES_ddxa_Thl_SBG_UaRt)
+  CASE('X_LES_RES_ddxa_Rt_SBG_UaThl')
+    X_LES_RES_ddxa_Rt_SBG_UaThl=>NULL()
+    DEALLOCATE(TLES%X_LES_RES_ddxa_Rt_SBG_UaThl)
+  CASE('X_LES_RES_ddxa_Thl_SBG_UaThl')
+    X_LES_RES_ddxa_Thl_SBG_UaThl=>NULL()
+    DEALLOCATE(TLES%X_LES_RES_ddxa_Thl_SBG_UaThl)
+  CASE('X_LES_RES_ddxa_Rt_SBG_UaRt')
+    X_LES_RES_ddxa_Rt_SBG_UaRt=>NULL()
+    DEALLOCATE(TLES%X_LES_RES_ddxa_Rt_SBG_UaRt)
+  CASE('X_LES_RES_ddxa_W_SBG_UaSv')
+    X_LES_RES_ddxa_W_SBG_UaSv=>NULL()
+    DEALLOCATE(TLES%X_LES_RES_ddxa_W_SBG_UaSv)
+  CASE('X_LES_RES_ddxa_Sv_SBG_UaW')
+    X_LES_RES_ddxa_Sv_SBG_UaW=>NULL()
+    DEALLOCATE(TLES%X_LES_RES_ddxa_Sv_SBG_UaW)
+  CASE('X_LES_RES_ddz_Sv_SBG_W2')
+    X_LES_RES_ddz_Sv_SBG_W2=>NULL()
+    DEALLOCATE(TLES%X_LES_RES_ddz_Sv_SBG_W2)
+  CASE('X_LES_RES_ddxa_Sv_SBG_UaSv')
+    X_LES_RES_ddxa_Sv_SBG_UaSv=>NULL()
+    DEALLOCATE(TLES%X_LES_RES_ddxa_Sv_SBG_UaSv)
+  CASE('X_LES_SUBGRID_U2')
+    X_LES_SUBGRID_U2=>NULL()
+    DEALLOCATE(TLES%X_LES_SUBGRID_U2)
+  CASE('X_LES_SUBGRID_V2')
+    X_LES_SUBGRID_V2=>NULL()
+    DEALLOCATE(TLES%X_LES_SUBGRID_V2)
+  CASE('X_LES_SUBGRID_W2')
+    X_LES_SUBGRID_W2=>NULL()
+    DEALLOCATE(TLES%X_LES_SUBGRID_W2)
+  CASE('X_LES_SUBGRID_Thl2')
+    X_LES_SUBGRID_Thl2=>NULL()
+    DEALLOCATE(TLES%X_LES_SUBGRID_Thl2)
+  CASE('X_LES_SUBGRID_Rt2')
+    X_LES_SUBGRID_Rt2=>NULL()
+    DEALLOCATE(TLES%X_LES_SUBGRID_Rt2)
+  CASE('X_LES_SUBGRID_Rc2')
+    X_LES_SUBGRID_Rc2=>NULL()
+    DEALLOCATE(TLES%X_LES_SUBGRID_Rc2)
+  CASE('X_LES_SUBGRID_Ri2')
+    X_LES_SUBGRID_Ri2=>NULL()
+    DEALLOCATE(TLES%X_LES_SUBGRID_Ri2)
+  CASE('X_LES_SUBGRID_ThlRt')
+    X_LES_SUBGRID_ThlRt=>NULL()
+    DEALLOCATE(TLES%X_LES_SUBGRID_ThlRt)
+  CASE('X_LES_SUBGRID_Sv2')
+    X_LES_SUBGRID_Sv2=>NULL()
+    DEALLOCATE(TLES%X_LES_SUBGRID_Sv2)
+  CASE('X_LES_SUBGRID_UV')
+    X_LES_SUBGRID_UV=>NULL()
+    DEALLOCATE(TLES%X_LES_SUBGRID_UV)
+  CASE('X_LES_SUBGRID_WU')
+    X_LES_SUBGRID_WU=>NULL()
+    DEALLOCATE(TLES%X_LES_SUBGRID_WU)
+  CASE('X_LES_SUBGRID_WV')
+    X_LES_SUBGRID_WV=>NULL()
+    DEALLOCATE(TLES%X_LES_SUBGRID_WV)
+  CASE('X_LES_SUBGRID_UThl')
+    X_LES_SUBGRID_UThl=>NULL()
+    DEALLOCATE(TLES%X_LES_SUBGRID_UThl)
+  CASE('X_LES_SUBGRID_VThl')
+    X_LES_SUBGRID_VThl=>NULL()
+    DEALLOCATE(TLES%X_LES_SUBGRID_VThl)
+  CASE('X_LES_SUBGRID_WThl')
+    X_LES_SUBGRID_WThl=>NULL()
+    DEALLOCATE(TLES%X_LES_SUBGRID_WThl)
+  CASE('X_LES_SUBGRID_URt')
+    X_LES_SUBGRID_URt=>NULL()
+    DEALLOCATE(TLES%X_LES_SUBGRID_URt)
+  CASE('X_LES_SUBGRID_VRt')
+    X_LES_SUBGRID_VRt=>NULL()
+    DEALLOCATE(TLES%X_LES_SUBGRID_VRt)
+  CASE('X_LES_SUBGRID_WRt')
+    X_LES_SUBGRID_WRt=>NULL()
+    DEALLOCATE(TLES%X_LES_SUBGRID_WRt)
+  CASE('X_LES_SUBGRID_URc')
+    X_LES_SUBGRID_URc=>NULL()
+    DEALLOCATE(TLES%X_LES_SUBGRID_URc)
+  CASE('X_LES_SUBGRID_VRc')
+    X_LES_SUBGRID_VRc=>NULL()
+    DEALLOCATE(TLES%X_LES_SUBGRID_VRc)
+  CASE('X_LES_SUBGRID_WRc')
+    X_LES_SUBGRID_WRc=>NULL()
+    DEALLOCATE(TLES%X_LES_SUBGRID_WRc)
+  CASE('X_LES_SUBGRID_USv')
+    X_LES_SUBGRID_USv=>NULL()
+    DEALLOCATE(TLES%X_LES_SUBGRID_USv)
+  CASE('X_LES_SUBGRID_VSv')
+    X_LES_SUBGRID_VSv=>NULL()
+    DEALLOCATE(TLES%X_LES_SUBGRID_VSv)
+  CASE('X_LES_SUBGRID_WSv')
+    X_LES_SUBGRID_WSv=>NULL()
+    DEALLOCATE(TLES%X_LES_SUBGRID_WSv)
+  CASE('X_LES_SUBGRID_UTke')
+    X_LES_SUBGRID_UTke=>NULL()
+    DEALLOCATE(TLES%X_LES_SUBGRID_UTke)
+  CASE('X_LES_SUBGRID_VTke')
+    X_LES_SUBGRID_VTke=>NULL()
+    DEALLOCATE(TLES%X_LES_SUBGRID_VTke)
+  CASE('X_LES_SUBGRID_WTke')
+    X_LES_SUBGRID_WTke=>NULL()
+    DEALLOCATE(TLES%X_LES_SUBGRID_WTke)
+  CASE('X_LES_SUBGRID_ddz_WTke')
+    X_LES_SUBGRID_ddz_WTke=>NULL()
+    DEALLOCATE(TLES%X_LES_SUBGRID_ddz_WTke)
+  CASE('X_LES_SUBGRID_WThv')
+    X_LES_SUBGRID_WThv=>NULL()
+    DEALLOCATE(TLES%X_LES_SUBGRID_WThv)
+  CASE('X_LES_SUBGRID_ThlThv')
+    X_LES_SUBGRID_ThlThv=>NULL()
+    DEALLOCATE(TLES%X_LES_SUBGRID_ThlThv)
+  CASE('X_LES_SUBGRID_RtThv')
+    X_LES_SUBGRID_RtThv=>NULL()
+    DEALLOCATE(TLES%X_LES_SUBGRID_RtThv)
+  CASE('X_LES_SUBGRID_SvThv')
+    X_LES_SUBGRID_SvThv=>NULL()
+    DEALLOCATE(TLES%X_LES_SUBGRID_SvThv)
+  CASE('X_LES_SUBGRID_W2Thl')
+    X_LES_SUBGRID_W2Thl=>NULL()
+    DEALLOCATE(TLES%X_LES_SUBGRID_W2Thl)
+  CASE('X_LES_SUBGRID_W2Rt')
+    X_LES_SUBGRID_W2Rt=>NULL()
+    DEALLOCATE(TLES%X_LES_SUBGRID_W2Rt)
+  CASE('X_LES_SUBGRID_W2Sv')
+    X_LES_SUBGRID_W2Sv=>NULL()
+    DEALLOCATE(TLES%X_LES_SUBGRID_W2Sv)
+  CASE('X_LES_SUBGRID_WThlRt')
+    X_LES_SUBGRID_WThlRt=>NULL()
+    DEALLOCATE(TLES%X_LES_SUBGRID_WThlRt)
+  CASE('X_LES_SUBGRID_WThl2')
+    X_LES_SUBGRID_WThl2=>NULL()
+    DEALLOCATE(TLES%X_LES_SUBGRID_WThl2)
+  CASE('X_LES_SUBGRID_WRt2')
+    X_LES_SUBGRID_WRt2=>NULL()
+    DEALLOCATE(TLES%X_LES_SUBGRID_WRt2)
+  CASE('X_LES_SUBGRID_WSv2')
+    X_LES_SUBGRID_WSv2=>NULL()
+    DEALLOCATE(TLES%X_LES_SUBGRID_WSv2)
+  CASE('X_LES_SUBGRID_DISS_Tke')
+    X_LES_SUBGRID_DISS_Tke=>NULL()
+    DEALLOCATE(TLES%X_LES_SUBGRID_DISS_Tke)
+  CASE('X_LES_SUBGRID_DISS_Thl2')
+    X_LES_SUBGRID_DISS_Thl2=>NULL()
+    DEALLOCATE(TLES%X_LES_SUBGRID_DISS_Thl2)
+  CASE('X_LES_SUBGRID_DISS_Rt2')
+    X_LES_SUBGRID_DISS_Rt2=>NULL()
+    DEALLOCATE(TLES%X_LES_SUBGRID_DISS_Rt2)
+  CASE('X_LES_SUBGRID_DISS_ThlRt')
+    X_LES_SUBGRID_DISS_ThlRt=>NULL()
+    DEALLOCATE(TLES%X_LES_SUBGRID_DISS_ThlRt)
+  CASE('X_LES_SUBGRID_DISS_Sv2')
+    X_LES_SUBGRID_DISS_Sv2=>NULL()
+    DEALLOCATE(TLES%X_LES_SUBGRID_DISS_Sv2)
+  CASE('X_LES_SUBGRID_WP')
+    X_LES_SUBGRID_WP=>NULL()
+    DEALLOCATE(TLES%X_LES_SUBGRID_WP)
+  CASE('X_LES_SUBGRID_ThlPz')
+    X_LES_SUBGRID_ThlPz=>NULL()
+    DEALLOCATE(TLES%X_LES_SUBGRID_ThlPz)
+  CASE('X_LES_SUBGRID_RtPz')
+    X_LES_SUBGRID_RtPz=>NULL()
+    DEALLOCATE(TLES%X_LES_SUBGRID_RtPz)
+  CASE('X_LES_SUBGRID_SvPz')
+    X_LES_SUBGRID_SvPz=>NULL()
+    DEALLOCATE(TLES%X_LES_SUBGRID_SvPz)
+  CASE('X_LES_SUBGRID_PHI3')
+    X_LES_SUBGRID_PHI3=>NULL()
+    DEALLOCATE(TLES%X_LES_SUBGRID_PHI3)
+  CASE('X_LES_SUBGRID_PSI3')
+    X_LES_SUBGRID_PSI3=>NULL()
+    DEALLOCATE(TLES%X_LES_SUBGRID_PSI3)
+  CASE('X_LES_SUBGRID_LMix')
+    X_LES_SUBGRID_LMix=>NULL()
+    DEALLOCATE(TLES%X_LES_SUBGRID_LMix)
+  CASE('X_LES_SUBGRID_LDiss')
+    X_LES_SUBGRID_LDiss=>NULL()
+    DEALLOCATE(TLES%X_LES_SUBGRID_LDiss)
+  CASE('X_LES_SUBGRID_Km')
+    X_LES_SUBGRID_Km=>NULL()
+    DEALLOCATE(TLES%X_LES_SUBGRID_Km)
+  CASE('X_LES_SUBGRID_Kh')
+    X_LES_SUBGRID_Kh=>NULL()
+    DEALLOCATE(TLES%X_LES_SUBGRID_Kh)
+  CASE('X_LES_SUBGRID_THLUP_MF')
+    X_LES_SUBGRID_THLUP_MF=>NULL()
+    DEALLOCATE(TLES%X_LES_SUBGRID_THLUP_MF)
+  CASE('X_LES_SUBGRID_RTUP_MF')
+    X_LES_SUBGRID_RTUP_MF=>NULL()
+    DEALLOCATE(TLES%X_LES_SUBGRID_RTUP_MF)
+  CASE('X_LES_SUBGRID_RVUP_MF')
+    X_LES_SUBGRID_RVUP_MF=>NULL()
+    DEALLOCATE(TLES%X_LES_SUBGRID_RVUP_MF)
+  CASE('X_LES_SUBGRID_RCUP_MF')
+    X_LES_SUBGRID_RCUP_MF=>NULL()
+    DEALLOCATE(TLES%X_LES_SUBGRID_RCUP_MF)
+  CASE('X_LES_SUBGRID_RIUP_MF')
+    X_LES_SUBGRID_RIUP_MF=>NULL()
+    DEALLOCATE(TLES%X_LES_SUBGRID_RIUP_MF)
+  CASE('X_LES_SUBGRID_WUP_MF')
+    X_LES_SUBGRID_WUP_MF=>NULL()
+    DEALLOCATE(TLES%X_LES_SUBGRID_WUP_MF)
+  CASE('X_LES_SUBGRID_MASSFLUX')
+    X_LES_SUBGRID_MASSFLUX=>NULL()
+    DEALLOCATE(TLES%X_LES_SUBGRID_MASSFLUX)
+  CASE('X_LES_SUBGRID_DETR')
+    X_LES_SUBGRID_DETR=>NULL()
+    DEALLOCATE(TLES%X_LES_SUBGRID_DETR)
+  CASE('X_LES_SUBGRID_ENTR')
+    X_LES_SUBGRID_ENTR=>NULL()
+    DEALLOCATE(TLES%X_LES_SUBGRID_ENTR)
+  CASE('X_LES_SUBGRID_FRACUP')
+    X_LES_SUBGRID_FRACUP=>NULL()
+    DEALLOCATE(TLES%X_LES_SUBGRID_FRACUP)
+  CASE('X_LES_SUBGRID_THVUP_MF')
+    X_LES_SUBGRID_THVUP_MF=>NULL()
+    DEALLOCATE(TLES%X_LES_SUBGRID_THVUP_MF)
+  CASE('X_LES_SUBGRID_WTHLMF')
+    X_LES_SUBGRID_WTHLMF=>NULL()
+    DEALLOCATE(TLES%X_LES_SUBGRID_WTHLMF)
+  CASE('X_LES_SUBGRID_WRTMF')
+    X_LES_SUBGRID_WRTMF=>NULL()
+    DEALLOCATE(TLES%X_LES_SUBGRID_WRTMF)
+  CASE('X_LES_SUBGRID_WTHVMF')
+    X_LES_SUBGRID_WTHVMF=>NULL()
+    DEALLOCATE(TLES%X_LES_SUBGRID_WTHVMF)
+  CASE('X_LES_SUBGRID_WUMF')
+    X_LES_SUBGRID_WUMF=>NULL()
+    DEALLOCATE(TLES%X_LES_SUBGRID_WUMF)
+  CASE('X_LES_SUBGRID_WVMF')
+    X_LES_SUBGRID_WVMF=>NULL()
+    DEALLOCATE(TLES%X_LES_SUBGRID_WVMF)
+  CASE('X_LES_USTAR')
+    X_LES_USTAR=>NULL()
+    DEALLOCATE(TLES%X_LES_USTAR)
+  CASE('X_LES_UW0')
+    X_LES_UW0=>NULL()
+    DEALLOCATE(TLES%X_LES_UW0)
+  CASE('X_LES_VW0')
+    X_LES_VW0=>NULL()
+    DEALLOCATE(TLES%X_LES_VW0)
+  CASE('X_LES_Q0')
+    X_LES_Q0=>NULL()
+    DEALLOCATE(TLES%X_LES_Q0)
+  CASE('X_LES_E0')
+    X_LES_E0=>NULL()
+    DEALLOCATE(TLES%X_LES_E0)
+  CASE('X_LES_SV0')
+    X_LES_SV0=>NULL()
+    DEALLOCATE(TLES%X_LES_SV0)
+  CASE('XLES_PDF_RV')
+    XLES_PDF_RV=>NULL()
+    DEALLOCATE(TLES%XLES_PDF_RV)
+  CASE('XLES_PDF_TH')
+    XLES_PDF_TH=>NULL()
+    DEALLOCATE(TLES%XLES_PDF_TH)
+  CASE('XLES_PDF_W')
+    XLES_PDF_W=>NULL()
+    DEALLOCATE(TLES%XLES_PDF_W)
+  CASE('XLES_PDF_THV')
+    XLES_PDF_THV=>NULL()
+    DEALLOCATE(TLES%XLES_PDF_THV)
+  CASE('XLES_PDF_RC')
+    XLES_PDF_RC=>NULL()
+    DEALLOCATE(TLES%XLES_PDF_RC)
+  CASE('XLES_PDF_RR')
+    XLES_PDF_RR=>NULL()
+    DEALLOCATE(TLES%XLES_PDF_RR)
+  CASE('XLES_PDF_RI')
+    XLES_PDF_RI=>NULL()
+    DEALLOCATE(TLES%XLES_PDF_RI)
+  CASE('XLES_PDF_RS')
+    XLES_PDF_RS=>NULL()
+    DEALLOCATE(TLES%XLES_PDF_RS)
+  CASE('XLES_PDF_RG')
+    XLES_PDF_RG=>NULL()
+    DEALLOCATE(TLES%XLES_PDF_RG)
+  CASE('XLES_PDF_RT')
+    XLES_PDF_RT=>NULL()
+    DEALLOCATE(TLES%XLES_PDF_RT)
+  CASE('XLES_PDF_THL')
+    XLES_PDF_THL=>NULL()
+    DEALLOCATE(TLES%XLES_PDF_THL)
+  END SELECT
+END SUBROUTINE LES_DEALLOCATE
+!!
+!SUBROUTINE LES_INI_TIMESTEP_DEALLOCATE()
+!  IMPLICIT NONE
+!  XCOEFLIN_CURRENT_SPEC=>NULL()
+!  DEALLOCATE(TLES%XCOEFLIN_CURRENT_SPEC)
+!END SUBROUTINE LES_INI_TIMESTEP_DEALLOCATE
+!
+SUBROUTINE LES_ALLOCATE_1DIMX(PVAR,KDIM)
+  IMPLICIT NONE
+  REAL, DIMENSION(:),ALLOCATABLE,  INTENT(OUT) :: PVAR
+  INTEGER, DIMENSION(1), INTENT(IN) :: KDIM
+  ALLOCATE(PVAR(KDIM(1)))
+END SUBROUTINE LES_ALLOCATE_1DIMX
+!
+SUBROUTINE LES_ALLOCATE_2DIMX(PVAR,KDIM)
+  IMPLICIT NONE
+  REAL, DIMENSION(:,:),ALLOCATABLE, INTENT(OUT) :: PVAR
+  INTEGER, DIMENSION(2), INTENT(IN) :: KDIM
+  ALLOCATE(PVAR(KDIM(1),KDIM(2)))
+END SUBROUTINE LES_ALLOCATE_2DIMX
+!
+SUBROUTINE LES_ALLOCATE_3DIMX(PVAR,KDIM)
+  IMPLICIT NONE
+  REAL, DIMENSION(:,:,:),ALLOCATABLE,  INTENT(OUT) :: PVAR
+  INTEGER, DIMENSION(3), INTENT(IN) :: KDIM
+  ALLOCATE(PVAR(KDIM(1),KDIM(2),KDIM(3)))
+END SUBROUTINE LES_ALLOCATE_3DIMX
+!
+SUBROUTINE LES_ALLOCATE_4DIMX(PVAR,KDIM)
+  IMPLICIT NONE
+  REAL, DIMENSION(:,:,:,:),ALLOCATABLE,  INTENT(OUT) :: PVAR
+  INTEGER, DIMENSION(4), INTENT(IN) :: KDIM
+  ALLOCATE(PVAR(KDIM(1),KDIM(2),KDIM(3),KDIM(4)))
+END SUBROUTINE LES_ALLOCATE_4DIMX
+!
+SUBROUTINE LES_ALLOCATE_1DIMI(KVAR,KDIM)
+  IMPLICIT NONE
+  INTEGER, DIMENSION(:),ALLOCATABLE,  INTENT(OUT) :: KVAR
+  INTEGER, DIMENSION(1), INTENT(IN) :: KDIM
+  ALLOCATE(KVAR(KDIM(1)))
+END SUBROUTINE LES_ALLOCATE_1DIMI
+!
+SUBROUTINE LES_ALLOCATE_3DIMI(KVAR,KDIM)
+  IMPLICIT NONE
+  INTEGER, DIMENSION(:,:,:),ALLOCATABLE,  INTENT(OUT) :: KVAR
+  INTEGER, DIMENSION(3), INTENT(IN) :: KDIM
+  ALLOCATE(KVAR(KDIM(1),KDIM(2),KDIM(3)))
+END SUBROUTINE LES_ALLOCATE_3DIMI
+!
+SUBROUTINE LES_ALLOCATE_3DIML(OVAR,KDIM)
+  IMPLICIT NONE
+  LOGICAL, DIMENSION(:,:,:),ALLOCATABLE,  INTENT(OUT) :: OVAR
+  INTEGER, DIMENSION(3), INTENT(IN) :: KDIM
+  ALLOCATE(OVAR(KDIM(1),KDIM(2),KDIM(3)))
+END SUBROUTINE LES_ALLOCATE_3DIML
+!
+SUBROUTINE LES_ALLOCATE_4DIML(OVAR,KDIM)
+  IMPLICIT NONE
+  LOGICAL, DIMENSION(:,:,:,:),ALLOCATABLE,  INTENT(OUT) :: OVAR
+  INTEGER, DIMENSION(4), INTENT(IN) :: KDIM
+  ALLOCATE(OVAR(KDIM(1),KDIM(2),KDIM(3),KDIM(4)))
+END SUBROUTINE LES_ALLOCATE_4DIML
+!
+SUBROUTINE LES_ALLOCATE_2DIMC(HVAR,KDIM)
+  IMPLICIT NONE
+  LOGICAL, DIMENSION(:,:),ALLOCATABLE,  INTENT(OUT) :: HVAR
+  INTEGER, DIMENSION(2), INTENT(IN) :: KDIM
+  ALLOCATE(HVAR(KDIM(1),KDIM(2)))
+END SUBROUTINE LES_ALLOCATE_2DIMC
+!
+END MODULE MODD_LES
diff --git a/src/PHYEX/aux/modd_misc.f90 b/src/PHYEX/aux/modd_misc.f90
new file mode 100644
index 0000000000000000000000000000000000000000..4947773b5260f6089cdf52d0230c1800cc3e7ab5
--- /dev/null
+++ b/src/PHYEX/aux/modd_misc.f90
@@ -0,0 +1,5 @@
+MODULE MODD_MISC
+IMPLICIT NONE
+TYPE MISC_t
+END TYPE MISC_t
+END MODULE MODD_MISC
diff --git a/src/PHYEX/aux/modd_nsv.f90 b/src/PHYEX/aux/modd_nsv.f90
new file mode 100644
index 0000000000000000000000000000000000000000..958d1f4dfb1a180767ae8c7738cca3a33ad18a5a
--- /dev/null
+++ b/src/PHYEX/aux/modd_nsv.f90
@@ -0,0 +1,650 @@
+!MNH_LIC Copyright 2001-2023 CNRS, Meteo-France and Universite Paul Sabatier
+!MNH_LIC This is part of the Meso-NH software governed by the CeCILL-C licence
+!MNH_LIC version 1. See LICENSE, CeCILL-C_V1-en.txt and CeCILL-C_V1-fr.txt
+!MNH_LIC for details. version 1.
+!-------------------------------------------------------------------------------
+!        ###############
+         MODULE MODD_NSV
+!        ###############
+!
+!!****  *MODD_NSV* - declaration of scalar variables numbers
+!!
+!!    PURPOSE
+!!    -------
+!!       Arrays to store the per-model NSV_* values number (suffix _A denote an array)
+!!
+!!    AUTHOR
+!!    ------
+!!      D. Gazen   L.A.
+!!
+!!    MODIFICATIONS
+!!    -------------
+!!      Original  01/02/01
+!!       J.-P. Pinty   29/11/02 add C3R5, ELEC
+!!       V. Masson     01/2004  add scalar names
+!!       M. Leriche    12/04/07 add aqueous chemistry
+!!       M. Leriche    08/07/10 add ice phase chemistry
+!!       C.Lac         07/11    add conditional sampling
+!!       Pialat/Tulet  15/02/12 add ForeFire
+!!      Modification    01/2016  (JP Pinty) Add LIMA
+!!       V. Vionnet     07/17   add blowing snow
+!  B. Vie         06/2021: add prognostic supersaturation for LIMA
+!  P. Wautelet 26/11/2021: add TSVLIST and TSVLIST_A to store the metadata of all the scalar variables
+!  A. Costes      12/2021: add Blaze fire model smoke
+!  P. Wautelet 14/01/2022: add CSV_CHEM_LIST(_A) to store the list of all chemical variables
+!                          + NSV_CHEM_LIST(_A) the size of the list
+!-------------------------------------------------------------------------------
+!
+!*       0.   DECLARATIONS
+!             ------------
+!
+USE MODD_FIELD,      ONLY: tfieldmetadata
+USE MODD_PARAMETERS, ONLY: JPMODELMAX, &     ! Maximum allowed number of nested models
+                           JPSVMAX,    &     ! Maximum number of scalar variables
+                           JPSVNAMELGTMAX, & ! Maximum length of a scalar variable name
+                           NMNHNAMELGTMAX
+!
+IMPLICIT NONE
+TYPE NSV_t
+!
+REAL,DIMENSION(JPSVMAX) :: XSVMIN ! minimum value for SV variables
+!
+LOGICAL :: LINI_NSV(JPMODELMAX) = .FALSE. ! becomes True when routine INI_NSV is called
+!
+CHARACTER(LEN=NMNHNAMELGTMAX), DIMENSION(:,:), ALLOCATABLE :: CSV_CHEM_LIST_A !Names of all the chemical variables
+CHARACTER(LEN=6),              DIMENSION(:,:), ALLOCATABLE :: CSV_A           !Names of the scalar variables
+TYPE(tfieldmetadata), DIMENSION(:,:), ALLOCATABLE :: TSVLIST_A !Metadata of all the scalar variables
+
+INTEGER,DIMENSION(JPMODELMAX)::NSV_A = 0 ! total number of scalar variables
+                                         ! NSV_A = NSV_USER_A+NSV_C2R2_A+NSV_CHEM_A+..
+INTEGER,DIMENSION(JPMODELMAX)::NSV_CHEM_LIST_A = 0 ! total number of chemical variables (including dust, salt...)
+INTEGER,DIMENSION(JPMODELMAX)::NSV_USER_A = 0  ! number of user scalar variables with 
+                                               ! indices in the range : 1...NSV_USER_A
+!
+INTEGER,DIMENSION(JPMODELMAX)::NSV_C2R2_A = 0    ! number of liq scalar in C2R2
+                                                 !                  and in C3R5
+INTEGER,DIMENSION(JPMODELMAX)::NSV_C2R2BEG_A = 0 ! with indices in the range :
+INTEGER,DIMENSION(JPMODELMAX)::NSV_C2R2END_A = 0 ! NSV_C2R2BEG_A...NSV_C2R2END_A
+!
+INTEGER,DIMENSION(JPMODELMAX)::NSV_C1R3_A = 0    ! number of ice scalar in C3R5
+INTEGER,DIMENSION(JPMODELMAX)::NSV_C1R3BEG_A = 0 ! with indices in the range :
+INTEGER,DIMENSION(JPMODELMAX)::NSV_C1R3END_A = 0 ! NSV_C1R3BEG_A...NSV_C1R3END_A
+!
+INTEGER,DIMENSION(JPMODELMAX)::NSV_ELEC_A = 0    ! number of scalar in ELEC
+INTEGER,DIMENSION(JPMODELMAX)::NSV_ELECBEG_A = 0 ! with indices in the range :
+INTEGER,DIMENSION(JPMODELMAX)::NSV_ELECEND_A = 0 ! NSV_ELECBEG_A...NSV_ELECEND_A
+!
+INTEGER,DIMENSION(JPMODELMAX)::NSV_CHEM_A = 0    ! number of chemical scalar
+INTEGER,DIMENSION(JPMODELMAX)::NSV_CHEMBEG_A = 0 ! with indices in the range :
+INTEGER,DIMENSION(JPMODELMAX)::NSV_CHEMEND_A = 0 ! NSV_CHEMBEG_A...NSV_CHEMEND_A
+!
+INTEGER,DIMENSION(JPMODELMAX)::NSV_CHGS_A = 0    ! number of gaseous chemcial species
+INTEGER,DIMENSION(JPMODELMAX)::NSV_CHGSBEG_A = 0 ! with indices
+INTEGER,DIMENSION(JPMODELMAX)::NSV_CHGSEND_A = 0 ! NSV_CHGSBEG_
+!
+INTEGER,DIMENSION(JPMODELMAX)::NSV_CHAC_A = 0    ! number of aqueous chemical species
+INTEGER,DIMENSION(JPMODELMAX)::NSV_CHACBEG_A = 0 ! with indices
+INTEGER,DIMENSION(JPMODELMAX)::NSV_CHACEND_A = 0 ! NSV_CHACBEG
+!
+INTEGER,DIMENSION(JPMODELMAX)::NSV_CHIC_A = 0    ! number of ice phase chemical species
+INTEGER,DIMENSION(JPMODELMAX)::NSV_CHICBEG_A = 0 ! with indices
+INTEGER,DIMENSION(JPMODELMAX)::NSV_CHICEND_A = 0 ! NSV_CHICBEG
+!
+INTEGER,DIMENSION(JPMODELMAX)::NSV_LG_A = 0    ! number of LaGrangian 
+INTEGER,DIMENSION(JPMODELMAX)::NSV_LGBEG_A = 0 ! with indices in the range :
+INTEGER,DIMENSION(JPMODELMAX)::NSV_LGEND_A = 0 ! NSV_LGBEG_A...NSV_LGEND_A
+!
+INTEGER,DIMENSION(JPMODELMAX)::NSV_LNOX_A = 0    ! number of lightning NOx
+INTEGER,DIMENSION(JPMODELMAX)::NSV_LNOXBEG_A = 0 ! with indices in the range :
+INTEGER,DIMENSION(JPMODELMAX)::NSV_LNOXEND_A = 0 ! NSV_LNOXBEG_A...NSV_LNOXEND_A
+INTEGER,DIMENSION(JPMODELMAX)::NSV_DST_A = 0    ! number of dust scalar
+INTEGER,DIMENSION(JPMODELMAX)::NSV_DSTBEG_A = 0 ! with indices in the range :
+INTEGER,DIMENSION(JPMODELMAX)::NSV_DSTEND_A = 0 ! NSV_DSTBEG_A...NSV_DSTEND_A
+!
+INTEGER,DIMENSION(JPMODELMAX)::NSV_SLT_A = 0    ! number of sea salt scalar
+INTEGER,DIMENSION(JPMODELMAX)::NSV_SLTBEG_A = 0 ! with indices in the range :
+INTEGER,DIMENSION(JPMODELMAX)::NSV_SLTEND_A = 0 ! NSV_SLTBEG_A...NSV_SLTEND_A
+!
+INTEGER,DIMENSION(JPMODELMAX)::NSV_AER_A = 0    ! number of aerosol scalar
+INTEGER,DIMENSION(JPMODELMAX)::NSV_AERBEG_A = 0 ! with indices in the range :
+INTEGER,DIMENSION(JPMODELMAX)::NSV_AEREND_A = 0 ! NSV_AERBEG_A...NSV_AEREND_A
+!
+INTEGER,DIMENSION(JPMODELMAX)::NSV_DSTDEP_A    = 0    ! number of aerosol scalar
+INTEGER,DIMENSION(JPMODELMAX)::NSV_DSTDEPBEG_A = 0 ! with indices in the range :
+INTEGER,DIMENSION(JPMODELMAX)::NSV_DSTDEPEND_A = 0 ! NSV_AERBEG_A...NSV_AEREND_A
+!
+INTEGER,DIMENSION(JPMODELMAX)::NSV_AERDEP_A    = 0    ! number of aerosol scalar
+INTEGER,DIMENSION(JPMODELMAX)::NSV_AERDEPBEG_A = 0 ! with indices in the range :
+INTEGER,DIMENSION(JPMODELMAX)::NSV_AERDEPEND_A = 0 ! NSV_AERBEG_A...NSV_AEREND_A
+!
+INTEGER,DIMENSION(JPMODELMAX)::NSV_SLTDEP_A    = 0    ! number of aerosol scalar
+INTEGER,DIMENSION(JPMODELMAX)::NSV_SLTDEPBEG_A = 0 ! with indices in the range :
+INTEGER,DIMENSION(JPMODELMAX)::NSV_SLTDEPEND_A = 0 ! NSV_SLTBEG_A...NSV_SLTEND_A
+!
+INTEGER,DIMENSION(JPMODELMAX)::NSV_PP_A = 0    ! number of passive pol.
+INTEGER,DIMENSION(JPMODELMAX)::NSV_PPBEG_A = 0 ! with indices in the range :
+INTEGER,DIMENSION(JPMODELMAX)::NSV_PPEND_A = 0 ! NSV_PPBEG_A...NSV_PPEND_A
+!
+INTEGER,DIMENSION(JPMODELMAX)::NSV_CS_A = 0    ! number of condit.samplings
+INTEGER,DIMENSION(JPMODELMAX)::NSV_CSBEG_A = 0 ! with indices in the range :
+INTEGER,DIMENSION(JPMODELMAX)::NSV_CSEND_A = 0 ! NSV_CSBEG_A...NSV_CSEND_A
+!
+INTEGER,DIMENSION(JPMODELMAX)::NSV_LIMA_A = 0     ! number of scalar in LIMA
+INTEGER,DIMENSION(JPMODELMAX)::NSV_LIMA_BEG_A = 0 ! with indices in the range :
+INTEGER,DIMENSION(JPMODELMAX)::NSV_LIMA_END_A = 0 ! NSV_LIMA_BEG_A...NSV_LIMA_END_A
+INTEGER,DIMENSION(JPMODELMAX)::NSV_LIMA_NC_A = 0       ! First Nc variable
+INTEGER,DIMENSION(JPMODELMAX)::NSV_LIMA_NR_A = 0       ! First Nr variable
+INTEGER,DIMENSION(JPMODELMAX)::NSV_LIMA_CCN_FREE_A = 0 ! First Free CCN conc.
+INTEGER,DIMENSION(JPMODELMAX)::NSV_LIMA_CCN_ACTI_A = 0 ! First Acti. CNN conc.
+INTEGER,DIMENSION(JPMODELMAX)::NSV_LIMA_SCAVMASS_A = 0 ! Scavenged mass variable
+INTEGER,DIMENSION(JPMODELMAX)::NSV_LIMA_NI_A = 0       ! First Ni var.
+INTEGER,DIMENSION(JPMODELMAX)::NSV_LIMA_NS_A = 0       ! First Ns var.
+INTEGER,DIMENSION(JPMODELMAX)::NSV_LIMA_NG_A = 0       ! First Ng var.
+INTEGER,DIMENSION(JPMODELMAX)::NSV_LIMA_NH_A = 0       ! First Nh var.
+INTEGER,DIMENSION(JPMODELMAX)::NSV_LIMA_IFN_FREE_A = 0 ! First Free IFN conc.
+INTEGER,DIMENSION(JPMODELMAX)::NSV_LIMA_IFN_NUCL_A = 0 ! First Nucl. IFN conc.
+INTEGER,DIMENSION(JPMODELMAX)::NSV_LIMA_IMM_NUCL_A = 0 ! First Nucl. IMM conc.
+INTEGER,DIMENSION(JPMODELMAX)::NSV_LIMA_HOM_HAZE_A = 0 ! Hom. freezing of CCN
+INTEGER,DIMENSION(JPMODELMAX)::NSV_LIMA_SPRO_A = 0     ! Supersaturation
+!
+#ifdef MNH_FOREFIRE
+INTEGER,DIMENSION(JPMODELMAX)::NSV_FF_A = 0    ! number of ForeFire scalar variables
+INTEGER,DIMENSION(JPMODELMAX)::NSV_FFBEG_A = 0 ! with indices in the range :
+INTEGER,DIMENSION(JPMODELMAX)::NSV_FFEND_A = 0 ! NSV_FFBEG_A...NSV_FFEND_A
+!
+#endif
+! Blaze smoke indexes
+INTEGER,DIMENSION(JPMODELMAX)::NSV_FIRE_A = 0    ! number of Blaze smoke scalar variables
+INTEGER,DIMENSION(JPMODELMAX)::NSV_FIREBEG_A = 0 ! with indices in the range :
+INTEGER,DIMENSION(JPMODELMAX)::NSV_FIREEND_A = 0 ! NSV_FIREBEG_A...NSV_FIREEND_A
+!
+INTEGER,DIMENSION(JPMODELMAX)::NSV_SNW_A = 0    ! number of blowing snow scalar
+INTEGER,DIMENSION(JPMODELMAX)::NSV_SNWBEG_A = 0 ! with indices in the range :
+INTEGER,DIMENSION(JPMODELMAX)::NSV_SNWEND_A = 0 ! NSV_SNWBEG_A...NSV_SNWEND_A
+!
+!###############################################################################
+!
+! variables updated for the current model
+!
+CHARACTER(LEN=NMNHNAMELGTMAX), DIMENSION(:), POINTER :: CSV_CHEM_LIST !Names of all the chemical variables
+CHARACTER(LEN=6),              DIMENSION(:), POINTER :: CSV           !Names of the scalar variables
+
+TYPE(tfieldmetadata), DIMENSION(:), POINTER :: TSVLIST !Metadata of all the scalar variables
+
+INTEGER :: NSV         = 0 ! total number of user scalar variables
+!
+INTEGER :: NSV_CHEM_LIST = 0 ! total number of chemical variables (including dust, salt...)
+!
+INTEGER :: NSV_USER    = 0 ! number of user scalar variables with indices
+                           ! in the range : 1...NSV_USER
+INTEGER :: NSV_C2R2    = 0 ! number of liq scalar used in C2R2 and in C3R5
+INTEGER :: NSV_C2R2BEG = 0 ! with indices in the range :
+INTEGER :: NSV_C2R2END = 0 ! NSV_C2R2BEG...NSV_C2R2END
+!
+INTEGER :: NSV_C1R3    = 0 ! number of ice scalar used in C3R5
+INTEGER :: NSV_C1R3BEG = 0 ! with indices in the range :
+INTEGER :: NSV_C1R3END = 0 ! NSV_C1R3BEG...NSV_C1R3END
+!
+INTEGER :: NSV_ELEC    = 0 ! number of scalar variables used in ELEC
+INTEGER :: NSV_ELECBEG = 0 ! with indices in the range :
+INTEGER :: NSV_ELECEND = 0 ! NSV_ELECBEG...NSV_ELECEND
+!
+INTEGER :: NSV_CHEM    = 0 ! number of chemical scalar variables
+INTEGER :: NSV_CHEMBEG = 0 ! with indices in the range :
+INTEGER :: NSV_CHEMEND = 0 ! NSV_CHEMBEG...NSV_CHEMEND
+!
+INTEGER :: NSV_CHGS    = 0 ! number of gas-phase chemicals 
+INTEGER :: NSV_CHGSBEG = 0 ! with indices in the range :
+INTEGER :: NSV_CHGSEND = 0 ! NSV_CHGSBEG...NSV_CHGSEND         
+!
+INTEGER :: NSV_CHAC    = 0 ! number of aqueous-phase chemicals
+INTEGER :: NSV_CHACBEG = 0 ! with indices in the range :
+INTEGER :: NSV_CHACEND = 0 ! NSV_CHACBEG...NSV_CHACEND
+!
+INTEGER :: NSV_CHIC    = 0 ! number of ice-phase chemicals
+INTEGER :: NSV_CHICBEG = 0 ! with indices in the range :
+INTEGER :: NSV_CHICEND = 0 ! NSV_CHICBEG...NSV_CHICEND
+!
+INTEGER :: NSV_LG    = 0 ! number of lagrangian
+INTEGER :: NSV_LGBEG = 0 ! with indices in the range :
+INTEGER :: NSV_LGEND = 0 ! NSV_LGBEG...NSV_LGEND
+!
+INTEGER :: NSV_LNOX    = 0 ! number of lightning NOx variables
+INTEGER :: NSV_LNOXBEG = 0 ! with indices in the range :
+INTEGER :: NSV_LNOXEND = 0 ! NSV_LNOXBEG...NSV_LNOXEND
+!
+INTEGER :: NSV_DST     = 0 ! number of dust scalar variables
+INTEGER :: NSV_DSTBEG  = 0 ! with indices in the range :
+INTEGER :: NSV_DSTEND  = 0 ! NSV_DSTBEG...NSV_DSTEND
+
+INTEGER :: NSV_SLT     = 0 ! number of sea salt scalar variables
+INTEGER :: NSV_SLTBEG  = 0 ! with indices in the range :
+INTEGER :: NSV_SLTEND  = 0 ! NSV_SLTBEG...NSV_SLTEND
+
+INTEGER :: NSV_AER     = 0 ! number of aerosol scalar variables
+INTEGER :: NSV_AERBEG  = 0 ! with indices in the range :
+INTEGER :: NSV_AEREND  = 0 ! NSV_AERBEG...NSV_AEREND
+
+INTEGER :: NSV_DSTDEP  = 0 ! number of aerosol scalar variables
+INTEGER :: NSV_DSTDEPBEG  = 0 ! with indices in the range :
+INTEGER :: NSV_DSTDEPEND  = 0 ! NSV_AERBEG...NSV_AEREND
+!
+INTEGER :: NSV_AERDEP  = 0 ! number of aerosol scalar variables
+INTEGER :: NSV_AERDEPBEG  = 0 ! with indices in the range :
+INTEGER :: NSV_AERDEPEND  = 0 ! NSV_AERBEG...NSV_AEREND
+
+INTEGER :: NSV_SLTDEP  = 0 ! number of aerosol scalar variables
+INTEGER :: NSV_SLTDEPBEG  = 0 ! with indices in the range :
+INTEGER :: NSV_SLTDEPEND  = 0 ! NSV_AERBEG...NSV_AEREND
+!
+INTEGER :: NSV_PP    = 0 ! number of passive pollutants       
+INTEGER :: NSV_PPBEG = 0 ! with indices in the range :
+INTEGER :: NSV_PPEND = 0 ! NSV_PPBEG...NSV_PPEND
+!
+INTEGER :: NSV_CS    = 0 ! number of condit.samplings         
+INTEGER :: NSV_CSBEG = 0 ! with indices in the range :
+INTEGER :: NSV_CSEND = 0 ! NSV_CSBEG...NSV_CSEND
+!
+INTEGER :: NSV_LIMA     ! number of scalar in LIMA
+INTEGER :: NSV_LIMA_BEG ! with indices in the range :
+INTEGER :: NSV_LIMA_END ! NSV_LIMA_BEG_A...NSV_LIMA_END_A
+INTEGER :: NSV_LIMA_NC       !
+INTEGER :: NSV_LIMA_NR       !
+INTEGER :: NSV_LIMA_CCN_FREE !
+INTEGER :: NSV_LIMA_CCN_ACTI !
+INTEGER :: NSV_LIMA_SCAVMASS !
+INTEGER :: NSV_LIMA_NI       !
+INTEGER :: NSV_LIMA_NS       !
+INTEGER :: NSV_LIMA_NG       !
+INTEGER :: NSV_LIMA_NH       !
+INTEGER :: NSV_LIMA_IFN_FREE !
+INTEGER :: NSV_LIMA_IFN_NUCL !
+INTEGER :: NSV_LIMA_IMM_NUCL !
+INTEGER :: NSV_LIMA_HOM_HAZE !
+INTEGER :: NSV_LIMA_SPRO     !
+!
+#ifdef MNH_FOREFIRE
+INTEGER :: NSV_FF    = 0 ! number of ForeFire scalar variables
+INTEGER :: NSV_FFBEG = 0 ! with indices in the range :
+INTEGER :: NSV_FFEND = 0 ! NSV_FFBEG...NSV_FFEND
+!
+#endif
+! Blaze smoke
+INTEGER :: NSV_FIRE    = 0 ! number of Blaze smoke scalar variables
+INTEGER :: NSV_FIREBEG = 0 ! with indices in the range :
+INTEGER :: NSV_FIREEND = 0 ! NSV_FIREBEG...NSV_FIREEND
+!
+INTEGER :: NSV_SNW     = 0 ! number of blowing snow scalar variables
+INTEGER :: NSV_SNWBEG  = 0 ! with indices in the range :
+INTEGER :: NSV_SNWEND  = 0 ! NSV_SNWBEG...NSV_SNWEND
+!
+INTEGER :: NSV_CO2     = 0  ! index for CO2
+END TYPE NSV_t
+!
+TYPE(NSV_t), TARGET, SAVE :: TNSV
+!
+
+REAL, POINTER, DIMENSION(:) :: XSVMIN => NULL()
+
+LOGICAL, POINTER :: LINI_NSV(:) => NULL()
+!
+CHARACTER(LEN=NMNHNAMELGTMAX), DIMENSION(:,:), POINTER :: CSV_CHEM_LIST_A => NULL()
+CHARACTER(LEN=6),              DIMENSION(:,:), POINTER :: CSV_A => NULL()
+TYPE(tfieldmetadata), DIMENSION(:,:), POINTER :: TSVLIST_A => NULL()
+
+INTEGER, DIMENSION(:), POINTER ::NSV_A => NULL(), &
+                                 NSV_CHEM_LIST_A => NULL(), &
+                                 NSV_USER_A => NULL(), &
+                                 NSV_C2R2_A => NULL(), &
+                                 NSV_C2R2BEG_A => NULL(), &
+                                 NSV_C2R2END_A => NULL(), &
+                                 NSV_C1R3_A => NULL(), &
+                                 NSV_C1R3BEG_A => NULL(), &
+                                 NSV_C1R3END_A => NULL(), &
+                                 NSV_ELEC_A => NULL(), &
+                                 NSV_ELECBEG_A => NULL(), &
+                                 NSV_ELECEND_A => NULL(), &
+                                 NSV_CHEM_A => NULL(), &
+                                 NSV_CHEMBEG_A => NULL(), &
+                                 NSV_CHEMEND_A => NULL(), &
+                                 NSV_CHGS_A => NULL(), &
+                                 NSV_CHGSBEG_A => NULL(), &
+                                 NSV_CHGSEND_A => NULL(), &
+                                 NSV_CHAC_A => NULL(), &
+                                 NSV_CHACBEG_A => NULL(), &
+                                 NSV_CHACEND_A => NULL(), &
+                                 NSV_CHIC_A => NULL(), &
+                                 NSV_CHICBEG_A => NULL(), &
+                                 NSV_CHICEND_A => NULL(), &
+                                 NSV_LG_A => NULL(), &
+                                 NSV_LGBEG_A => NULL(), &
+                                 NSV_LGEND_A => NULL(), &
+                                 NSV_LNOX_A => NULL(), &
+                                 NSV_LNOXBEG_A => NULL(), &
+                                 NSV_LNOXEND_A => NULL(), &
+                                 NSV_DST_A => NULL(), &
+                                 NSV_DSTBEG_A => NULL(), &
+                                 NSV_DSTEND_A => NULL(), &
+                                 NSV_SLT_A => NULL(), &
+                                 NSV_SLTBEG_A => NULL(), &
+                                 NSV_SLTEND_A => NULL(), &
+                                 NSV_AER_A => NULL(), &
+                                 NSV_AERBEG_A => NULL(), &
+                                 NSV_AEREND_A => NULL(), &
+                                 NSV_DSTDEP_A    => NULL(), &
+                                 NSV_DSTDEPBEG_A => NULL(), &
+                                 NSV_DSTDEPEND_A => NULL(), &
+                                 NSV_AERDEP_A    => NULL(), &
+                                 NSV_AERDEPBEG_A => NULL(), &
+                                 NSV_AERDEPEND_A => NULL(), &
+                                 NSV_SLTDEP_A    => NULL(), &
+                                 NSV_SLTDEPBEG_A => NULL(), &
+                                 NSV_SLTDEPEND_A => NULL(), &
+                                 NSV_PP_A => NULL(), &
+                                 NSV_PPBEG_A => NULL(), &
+                                 NSV_PPEND_A => NULL(), &
+                                 NSV_CS_A => NULL(), &
+                                 NSV_CSBEG_A => NULL(), &
+                                 NSV_CSEND_A => NULL(), &
+                                 NSV_LIMA_A => NULL(), &
+                                 NSV_LIMA_BEG_A => NULL(), &
+                                 NSV_LIMA_END_A => NULL(), &
+                                 NSV_LIMA_NC_A => NULL(), &
+                                 NSV_LIMA_NR_A => NULL(), &
+                                 NSV_LIMA_CCN_FREE_A => NULL(), &
+                                 NSV_LIMA_CCN_ACTI_A => NULL(), &
+                                 NSV_LIMA_SCAVMASS_A => NULL(), &
+                                 NSV_LIMA_NI_A => NULL(), &
+                                 NSV_LIMA_NS_A => NULL(), &
+                                 NSV_LIMA_NG_A => NULL(), &
+                                 NSV_LIMA_NH_A => NULL(), &
+                                 NSV_LIMA_IFN_FREE_A => NULL(), &
+                                 NSV_LIMA_IFN_NUCL_A => NULL(), &
+                                 NSV_LIMA_IMM_NUCL_A => NULL(), &
+                                 NSV_LIMA_HOM_HAZE_A => NULL(), &
+                                 NSV_LIMA_SPRO_A => NULL(), &
+#ifdef MNH_FOREFIRE
+                                 NSV_FF_A => NULL(), &
+                                 NSV_FFBEG_A => NULL(), &
+                                 NSV_FFEND_A => NULL(), &
+#endif
+                                 NSV_FIRE_A => NULL(), &
+                                 NSV_FIREBEG_A => NULL(), &
+                                 NSV_FIREEND_A => NULL(), &
+                                 NSV_SNW_A => NULL(), &
+                                 NSV_SNWBEG_A => NULL(), &
+                                 NSV_SNWEND_A => NULL()
+
+CHARACTER(LEN=NMNHNAMELGTMAX), DIMENSION(:), POINTER :: CSV_CHEM_LIST => NULL()
+CHARACTER(LEN=6),              DIMENSION(:), POINTER :: CSV           => NULL()
+
+TYPE(tfieldmetadata), DIMENSION(:), POINTER :: TSVLIST => NULL()
+
+INTEGER, POINTER :: NSV         => NULL(), &
+                    NSV_CHEM_LIST => NULL(), &
+                    NSV_USER    => NULL(), &
+                    NSV_C2R2    => NULL(), &
+                    NSV_C2R2BEG => NULL(), &
+                    NSV_C2R2END => NULL(), &
+                    NSV_C1R3    => NULL(), &
+                    NSV_C1R3BEG => NULL(), &
+                    NSV_C1R3END => NULL(), &
+                    NSV_ELEC    => NULL(), &
+                    NSV_ELECBEG => NULL(), &
+                    NSV_ELECEND => NULL(), &
+                    NSV_CHEM    => NULL(), &
+                    NSV_CHEMBEG => NULL(), &
+                    NSV_CHEMEND => NULL(), &
+                    NSV_CHGS    => NULL(), &
+                    NSV_CHGSBEG => NULL(), &
+                    NSV_CHGSEND => NULL(), &
+                    NSV_CHAC    => NULL(), &
+                    NSV_CHACBEG => NULL(), &
+                    NSV_CHACEND => NULL(), &
+                    NSV_CHIC    => NULL(), &
+                    NSV_CHICBEG => NULL(), &
+                    NSV_CHICEND => NULL(), &
+                    NSV_LG    => NULL(), &
+                    NSV_LGBEG => NULL(), &
+                    NSV_LGEND => NULL(), &
+                    NSV_LNOX    => NULL(), &
+                    NSV_LNOXBEG => NULL(), &
+                    NSV_LNOXEND => NULL(), &
+                    NSV_DST     => NULL(), &
+                    NSV_DSTBEG  => NULL(), &
+                    NSV_DSTEND  => NULL(), &
+                    NSV_SLT     => NULL(), &
+                    NSV_SLTBEG  => NULL(), &
+                    NSV_SLTEND  => NULL(), &
+                    NSV_AER     => NULL(), &
+                    NSV_AERBEG  => NULL(), &
+                    NSV_AEREND  => NULL(), &
+                    NSV_DSTDEP  => NULL(), &
+                    NSV_DSTDEPBEG  => NULL(), &
+                    NSV_DSTDEPEND  => NULL(), &
+                    NSV_AERDEP  => NULL(), &
+                    NSV_AERDEPBEG  => NULL(), &
+                    NSV_AERDEPEND  => NULL(), &
+                    NSV_SLTDEP  => NULL(), &
+                    NSV_SLTDEPBEG  => NULL(), &
+                    NSV_SLTDEPEND  => NULL(), &
+                    NSV_PP    => NULL(), &
+                    NSV_PPBEG => NULL(), &
+                    NSV_PPEND => NULL(), &
+                    NSV_CS    => NULL(), &
+                    NSV_CSBEG => NULL(), &
+                    NSV_CSEND => NULL(), &
+                    NSV_LIMA  => NULL(), &
+                    NSV_LIMA_BEG => NULL(), &
+                    NSV_LIMA_END => NULL(), &
+                    NSV_LIMA_NC       => NULL(), &
+                    NSV_LIMA_NR       => NULL(), &
+                    NSV_LIMA_CCN_FREE => NULL(), &
+                    NSV_LIMA_CCN_ACTI => NULL(), &
+                    NSV_LIMA_SCAVMASS => NULL(), &
+                    NSV_LIMA_NI       => NULL(), &
+                    NSV_LIMA_NS       => NULL(), &
+                    NSV_LIMA_NG       => NULL(), &
+                    NSV_LIMA_NH       => NULL(), &
+                    NSV_LIMA_IFN_FREE => NULL(), &
+                    NSV_LIMA_IFN_NUCL => NULL(), &
+                    NSV_LIMA_IMM_NUCL => NULL(), &
+                    NSV_LIMA_HOM_HAZE => NULL(), &
+                    NSV_LIMA_SPRO     => NULL(), &
+#ifdef MNH_FOREFIRE
+                    NSV_FF    => NULL(), &
+                    NSV_FFBEG => NULL(), &
+                    NSV_FFEND => NULL(), &
+#endif
+                    NSV_FIRE    => NULL(), &
+                    NSV_FIREBEG => NULL(), &
+                    NSV_FIREEND => NULL(), &
+                    NSV_SNW     => NULL(), &
+                    NSV_SNWBEG  => NULL(), &
+                    NSV_SNWEND  => NULL(), &
+                    NSV_CO2     => NULL()
+!
+CONTAINS
+!
+SUBROUTINE NSV_ASSOCIATE()
+IMPLICIT NONE
+
+IF(.NOT. ASSOCIATED(NSV)) THEN
+  XSVMIN              =>  TNSV%XSVMIN                
+  LINI_NSV            =>  TNSV%LINI_NSV
+
+  NSV_A               =>  TNSV%NSV_A 
+  NSV_CHEM_LIST_A     =>  TNSV%NSV_CHEM_LIST_A 
+  NSV_USER_A          =>  TNSV%NSV_USER_A 
+  NSV_C2R2_A          =>  TNSV%NSV_C2R2_A 
+  NSV_C2R2BEG_A       =>  TNSV%NSV_C2R2BEG_A 
+  NSV_C2R2END_A       =>  TNSV%NSV_C2R2END_A 
+  NSV_C1R3_A          =>  TNSV%NSV_C1R3_A 
+  NSV_C1R3BEG_A       =>  TNSV%NSV_C1R3BEG_A 
+  NSV_C1R3END_A       =>  TNSV%NSV_C1R3END_A 
+  NSV_ELEC_A          =>  TNSV%NSV_ELEC_A 
+  NSV_ELECBEG_A       =>  TNSV%NSV_ELECBEG_A 
+  NSV_ELECEND_A       =>  TNSV%NSV_ELECEND_A 
+  NSV_CHEM_A          =>  TNSV%NSV_CHEM_A 
+  NSV_CHEMBEG_A       =>  TNSV%NSV_CHEMBEG_A 
+  NSV_CHEMEND_A       =>  TNSV%NSV_CHEMEND_A 
+  NSV_CHGS_A          =>  TNSV%NSV_CHGS_A 
+  NSV_CHGSBEG_A       =>  TNSV%NSV_CHGSBEG_A 
+  NSV_CHGSEND_A       =>  TNSV%NSV_CHGSEND_A 
+  NSV_CHAC_A          =>  TNSV%NSV_CHAC_A 
+  NSV_CHACBEG_A       =>  TNSV%NSV_CHACBEG_A 
+  NSV_CHACEND_A       =>  TNSV%NSV_CHACEND_A 
+  NSV_CHIC_A          =>  TNSV%NSV_CHIC_A 
+  NSV_CHICBEG_A       =>  TNSV%NSV_CHICBEG_A 
+  NSV_CHICEND_A       =>  TNSV%NSV_CHICEND_A 
+  NSV_LG_A            =>  TNSV%NSV_LG_A 
+  NSV_LGBEG_A         =>  TNSV%NSV_LGBEG_A 
+  NSV_LGEND_A         =>  TNSV%NSV_LGEND_A 
+  NSV_LNOX_A          =>  TNSV%NSV_LNOX_A 
+  NSV_LNOXBEG_A       =>  TNSV%NSV_LNOXBEG_A 
+  NSV_LNOXEND_A       =>  TNSV%NSV_LNOXEND_A 
+  NSV_DST_A           =>  TNSV%NSV_DST_A 
+  NSV_DSTBEG_A        =>  TNSV%NSV_DSTBEG_A 
+  NSV_DSTEND_A        =>  TNSV%NSV_DSTEND_A 
+  NSV_SLT_A           =>  TNSV%NSV_SLT_A 
+  NSV_SLTBEG_A        =>  TNSV%NSV_SLTBEG_A 
+  NSV_SLTEND_A        =>  TNSV%NSV_SLTEND_A 
+  NSV_AER_A           =>  TNSV%NSV_AER_A 
+  NSV_AERBEG_A        =>  TNSV%NSV_AERBEG_A 
+  NSV_AEREND_A        =>  TNSV%NSV_AEREND_A 
+  NSV_DSTDEP_A        =>  TNSV%NSV_DSTDEP_A    
+  NSV_DSTDEPBEG_A     =>  TNSV%NSV_DSTDEPBEG_A 
+  NSV_DSTDEPEND_A     =>  TNSV%NSV_DSTDEPEND_A 
+  NSV_AERDEP_A        =>  TNSV%NSV_AERDEP_A    
+  NSV_AERDEPBEG_A     =>  TNSV%NSV_AERDEPBEG_A 
+  NSV_AERDEPEND_A     =>  TNSV%NSV_AERDEPEND_A 
+  NSV_SLTDEP_A        =>  TNSV%NSV_SLTDEP_A    
+  NSV_SLTDEPBEG_A     =>  TNSV%NSV_SLTDEPBEG_A 
+  NSV_SLTDEPEND_A     =>  TNSV%NSV_SLTDEPEND_A 
+  NSV_PP_A            =>  TNSV%NSV_PP_A 
+  NSV_PPBEG_A         =>  TNSV%NSV_PPBEG_A 
+  NSV_PPEND_A         =>  TNSV%NSV_PPEND_A 
+  NSV_CS_A            =>  TNSV%NSV_CS_A 
+  NSV_CSBEG_A         =>  TNSV%NSV_CSBEG_A 
+  NSV_CSEND_A         =>  TNSV%NSV_CSEND_A 
+  NSV_LIMA_A          =>  TNSV%NSV_LIMA_A 
+  NSV_LIMA_BEG_A      =>  TNSV%NSV_LIMA_BEG_A 
+  NSV_LIMA_END_A      =>  TNSV%NSV_LIMA_END_A 
+  NSV_LIMA_NC_A       =>  TNSV%NSV_LIMA_NC_A 
+  NSV_LIMA_NR_A       =>  TNSV%NSV_LIMA_NR_A 
+  NSV_LIMA_CCN_FREE_A =>  TNSV%NSV_LIMA_CCN_FREE_A 
+  NSV_LIMA_CCN_ACTI_A =>  TNSV%NSV_LIMA_CCN_ACTI_A 
+  NSV_LIMA_SCAVMASS_A =>  TNSV%NSV_LIMA_SCAVMASS_A 
+  NSV_LIMA_NI_A       =>  TNSV%NSV_LIMA_NI_A 
+  NSV_LIMA_NS_A       =>  TNSV%NSV_LIMA_NS_A 
+  NSV_LIMA_NG_A       =>  TNSV%NSV_LIMA_NG_A 
+  NSV_LIMA_NH_A       =>  TNSV%NSV_LIMA_NH_A 
+  NSV_LIMA_IFN_FREE_A =>  TNSV%NSV_LIMA_IFN_FREE_A 
+  NSV_LIMA_IFN_NUCL_A =>  TNSV%NSV_LIMA_IFN_NUCL_A 
+  NSV_LIMA_IMM_NUCL_A =>  TNSV%NSV_LIMA_IMM_NUCL_A 
+  NSV_LIMA_HOM_HAZE_A =>  TNSV%NSV_LIMA_HOM_HAZE_A 
+  NSV_LIMA_SPRO_A     =>  TNSV%NSV_LIMA_SPRO_A 
+#ifdef MNH_FOREFIRE
+  NSV_FF_A            =>  TNSV%NSV_FF_A 
+  NSV_FFBEG_A         =>  TNSV%NSV_FFBEG_A 
+  NSV_FFEND_A         =>  TNSV%NSV_FFEND_A 
+#endif
+  NSV_FIRE_A          =>  TNSV%NSV_FIRE_A 
+  NSV_FIREBEG_A       =>  TNSV%NSV_FIREBEG_A 
+  NSV_FIREEND_A       =>  TNSV%NSV_FIREEND_A 
+  NSV_SNW_A           =>  TNSV%NSV_SNW_A 
+  NSV_SNWBEG_A        =>  TNSV%NSV_SNWBEG_A 
+  NSV_SNWEND_A        =>  TNSV%NSV_SNWEND_A 
+
+  CSV_CHEM_LIST       =>  TNSV%CSV_CHEM_LIST 
+  CSV                 =>  TNSV%CSV           
+  TSVLIST             =>  TNSV%TSVLIST 
+
+  NSV                 =>  TNSV%NSV         
+  NSV_CHEM_LIST       =>  TNSV%NSV_CHEM_LIST 
+  NSV_USER            =>  TNSV%NSV_USER    
+  NSV_C2R2            =>  TNSV%NSV_C2R2    
+  NSV_C2R2BEG         =>  TNSV%NSV_C2R2BEG 
+  NSV_C2R2END         =>  TNSV%NSV_C2R2END 
+  NSV_C1R3            =>  TNSV%NSV_C1R3    
+  NSV_C1R3BEG         =>  TNSV%NSV_C1R3BEG 
+  NSV_C1R3END         =>  TNSV%NSV_C1R3END 
+  NSV_ELEC            =>  TNSV%NSV_ELEC    
+  NSV_ELECBEG         =>  TNSV%NSV_ELECBEG 
+  NSV_ELECEND         =>  TNSV%NSV_ELECEND 
+  NSV_CHEM            =>  TNSV%NSV_CHEM    
+  NSV_CHEMBEG         =>  TNSV%NSV_CHEMBEG 
+  NSV_CHEMEND         =>  TNSV%NSV_CHEMEND 
+  NSV_CHGS            =>  TNSV%NSV_CHGS    
+  NSV_CHGSBEG         =>  TNSV%NSV_CHGSBEG 
+  NSV_CHGSEND         =>  TNSV%NSV_CHGSEND 
+  NSV_CHAC            =>  TNSV%NSV_CHAC    
+  NSV_CHACBEG         =>  TNSV%NSV_CHACBEG 
+  NSV_CHACEND         =>  TNSV%NSV_CHACEND 
+  NSV_CHIC            =>  TNSV%NSV_CHIC    
+  NSV_CHICBEG         =>  TNSV%NSV_CHICBEG 
+  NSV_CHICEND         =>  TNSV%NSV_CHICEND 
+  NSV_LG              =>  TNSV%NSV_LG    
+  NSV_LGBEG           =>  TNSV%NSV_LGBEG 
+  NSV_LGEND           =>  TNSV%NSV_LGEND 
+  NSV_LNOX            =>  TNSV%NSV_LNOX    
+  NSV_LNOXBEG         =>  TNSV%NSV_LNOXBEG 
+  NSV_LNOXEND         =>  TNSV%NSV_LNOXEND 
+  NSV_DST             =>  TNSV%NSV_DST     
+  NSV_DSTBEG          =>  TNSV%NSV_DSTBEG  
+  NSV_DSTEND          =>  TNSV%NSV_DSTEND  
+  NSV_SLT             =>  TNSV%NSV_SLT     
+  NSV_SLTBEG          =>  TNSV%NSV_SLTBEG  
+  NSV_SLTEND          =>  TNSV%NSV_SLTEND  
+  NSV_AER             =>  TNSV%NSV_AER     
+  NSV_AERBEG          =>  TNSV%NSV_AERBEG  
+  NSV_AEREND          =>  TNSV%NSV_AEREND  
+  NSV_DSTDEP          =>  TNSV%NSV_DSTDEP  
+  NSV_DSTDEPBEG       =>  TNSV%NSV_DSTDEPBEG  
+  NSV_DSTDEPEND       =>  TNSV%NSV_DSTDEPEND  
+  NSV_AERDEP          =>  TNSV%NSV_AERDEP  
+  NSV_AERDEPBEG       =>  TNSV%NSV_AERDEPBEG  
+  NSV_AERDEPEND       =>  TNSV%NSV_AERDEPEND  
+  NSV_SLTDEP          =>  TNSV%NSV_SLTDEP  
+  NSV_SLTDEPBEG       =>  TNSV%NSV_SLTDEPBEG  
+  NSV_SLTDEPEND       =>  TNSV%NSV_SLTDEPEND  
+  NSV_PP              =>  TNSV%NSV_PP    
+  NSV_PPBEG           =>  TNSV%NSV_PPBEG 
+  NSV_PPEND           =>  TNSV%NSV_PPEND 
+  NSV_CS              =>  TNSV%NSV_CS    
+  NSV_CSBEG           =>  TNSV%NSV_CSBEG 
+  NSV_CSEND           =>  TNSV%NSV_CSEND 
+  NSV_LIMA            =>  TNSV%NSV_LIMA  
+  NSV_LIMA_BEG        =>  TNSV%NSV_LIMA_BEG 
+  NSV_LIMA_END        =>  TNSV%NSV_LIMA_END 
+  NSV_LIMA_NC         =>  TNSV%NSV_LIMA_NC       
+  NSV_LIMA_NR         =>  TNSV%NSV_LIMA_NR       
+  NSV_LIMA_CCN_FREE   =>  TNSV%NSV_LIMA_CCN_FREE 
+  NSV_LIMA_CCN_ACTI   =>  TNSV%NSV_LIMA_CCN_ACTI 
+  NSV_LIMA_SCAVMASS   =>  TNSV%NSV_LIMA_SCAVMASS 
+  NSV_LIMA_NI         =>  TNSV%NSV_LIMA_NI       
+  NSV_LIMA_NS         =>  TNSV%NSV_LIMA_NS       
+  NSV_LIMA_NG         =>  TNSV%NSV_LIMA_NG       
+  NSV_LIMA_NH         =>  TNSV%NSV_LIMA_NH       
+  NSV_LIMA_IFN_FREE   =>  TNSV%NSV_LIMA_IFN_FREE 
+  NSV_LIMA_IFN_NUCL   =>  TNSV%NSV_LIMA_IFN_NUCL 
+  NSV_LIMA_IMM_NUCL   =>  TNSV%NSV_LIMA_IMM_NUCL 
+  NSV_LIMA_HOM_HAZE   =>  TNSV%NSV_LIMA_HOM_HAZE 
+  NSV_LIMA_SPRO       =>  TNSV%NSV_LIMA_SPRO     
+#ifdef MNH_FOREFIRE
+  NSV_FF              =>  TNSV%NSV_FF    
+  NSV_FFBEG           =>  TNSV%NSV_FFBEG 
+  NSV_FFEND           =>  TNSV%NSV_FFEND 
+#endif
+  NSV_FIRE            =>  TNSV%NSV_FIRE    
+  NSV_FIREBEG         =>  TNSV%NSV_FIREBEG 
+  NSV_FIREEND         =>  TNSV%NSV_FIREEND 
+  NSV_SNW             =>  TNSV%NSV_SNW     
+  NSV_SNWBEG          =>  TNSV%NSV_SNWBEG  
+  NSV_SNWEND          =>  TNSV%NSV_SNWEND  
+  NSV_CO2             =>  TNSV%NSV_CO2     
+ENDIF
+!
+END SUBROUTINE NSV_ASSOCIATE
+!
+END MODULE MODD_NSV
diff --git a/src/PHYEX/aux/modd_phyex.f90 b/src/PHYEX/aux/modd_phyex.f90
new file mode 100644
index 0000000000000000000000000000000000000000..6b8ddb985f6e7736b12ae3c805788d684e4c377a
--- /dev/null
+++ b/src/PHYEX/aux/modd_phyex.f90
@@ -0,0 +1,61 @@
+MODULE MODD_PHYEX
+!
+!> @file 
+!!    MODD_PHYEX - decalration of the PHYEX structure gathering all the parametrisation strucutres of PHYEX
+!! 
+!!    PURPOSE 
+!!    ------- 
+!!       The purpose of this declarative module is to declare the 
+!!       the PHYEX type that allows to gather all the different structures used
+!!       by the paramteriation available in PHYEX
+!! 
+!!    AUTHOR
+!!    ------
+!!      S. Riette
+!!
+!!    MODIFICATIONS
+!!    -------------
+!!      Original    Mar 2023
+!!
+!-------------------------------------------------------------------------------
+!
+USE MODD_CST, ONLY: CST_t
+USE MODD_PARAM_ICE_n, ONLY: PARAM_ICE_t
+USE MODD_RAIN_ICE_DESCR_n, ONLY: RAIN_ICE_DESCR_t
+USE MODD_RAIN_ICE_PARAM_n, ONLY: RAIN_ICE_PARAM_t
+USE MODD_CLOUDPAR_N, ONLY: CLOUDPAR_t
+USE MODD_PARAM_MFSHALL_N, ONLY: PARAM_MFSHALL_t
+USE MODD_TURB_n, ONLY: TURB_t
+USE MODD_CTURB, ONLY: CSTURB_t
+USE MODD_NEB_n, ONLY: NEB_t
+USE MODD_PARAM_LIMA, ONLY: PARAM_LIMA_t
+USE MODD_PARAM_LIMA_WARM, ONLY: PARAM_LIMA_WARM_t
+USE MODD_PARAM_LIMA_COLD, ONLY: PARAM_LIMA_COLD_t
+USE MODD_PARAM_LIMA_MIXED, ONLY: PARAM_LIMA_MIXED_t
+USE MODD_NSV, ONLY: NSV_t
+USE MODD_MISC, ONLY: MISC_t
+!
+IMPLICIT NONE
+!
+TYPE PHYEX_t
+  ! Structures for the different parametrisations
+  TYPE(CST_t)            :: CST              !< Physical constants
+  TYPE(PARAM_ICE_t)      :: PARAM_ICEN       !< Control parameters for microphysics
+  TYPE(RAIN_ICE_DESCR_t) :: RAIN_ICE_DESCRN  !< Microphysical descriptive constants
+  TYPE(RAIN_ICE_PARAM_t) :: RAIN_ICE_PARAMN  !< Microphysical factors
+  TYPE(CLOUDPAR_t)       :: CLOUDPARN        !< Some other microphysical values
+  TYPE(PARAM_MFSHALL_t)  :: PARAM_MFSHALLN   !< Mass flux scheme free parameters
+  TYPE(CSTURB_t)         :: CSTURB           !< Turbulence scheme constants
+  TYPE(TURB_t)           :: TURBN            !< Turbulence scheme constants set by namelist
+  TYPE(NEB_t)            :: NEBN             !< Cloud scheme constants
+  TYPE(PARAM_LIMA_t)     :: PARAM_LIMA       !< Control parameters for LIMA microphysics
+  TYPE(PARAM_LIMA_WARM_t):: PARAM_LIMA_WARM  !< Microphysical factors for LIMA (warm processes)
+  TYPE(PARAM_LIMA_COLD_t):: PARAM_LIMA_COLD  !< Microphysical factors for LIMA (cold processes)
+  TYPE(PARAM_LIMA_MIXED_t):: PARAM_LIMA_MIXED !< Microphysical factors for LIMA (mixed processes)
+  TYPE(NSV_t)            :: TNSV             !< NSV indexes
+  !
+  ! Supplementary strucuture to hold model specific values
+  TYPE(MISC_t)           :: MISC             !< Model specific values
+END TYPE PHYEX_t
+!
+END MODULE MODD_PHYEX
diff --git a/src/PHYEX/aux/mode_argslist_ll_phy.f90 b/src/PHYEX/aux/mode_argslist_ll_phy.f90
new file mode 100644
index 0000000000000000000000000000000000000000..ed9b07274ca4b1ff58daa7274324c9b949fd4fdc
--- /dev/null
+++ b/src/PHYEX/aux/mode_argslist_ll_phy.f90
@@ -0,0 +1,60 @@
+!MNH_LIC Copyright 2023-2023 CNRS, Meteo-France and Universite Paul Sabatier
+!MNH_LIC This is part of the Meso-NH software governed by the CeCILL-C licence
+!MNH_LIC version 1. See LICENSE, CeCILL-C_V1-en.txt and CeCILL-C_V1-fr.txt
+!MNH_LIC for details. version 1.
+!-----------------------------------------------------------------
+!
+!!    #######################
+MODULE MODE_ARGSLIST_ll_PHY
+!
+ USE MODE_ll
+ USE MODD_ARGSLIST_ll, ONLY : LIST_ll
+ USE MODD_DIMPHYEX,       ONLY: DIMPHYEX_t
+!
+ CONTAINS
+!
+ SUBROUTINE ADD3DFIELD_ll_PHY(D, TPLIST, PFIELD, HNAME)
+!!    ###############################################
+!
+!!****  *ADD3DFIELD_ll_PHY* -
+!
+!!    Purpose
+!!    -------
+!     This routine is used as an interface to ADD3DFIELD_ll for
+!     unpacking horizontal dimensions
+!
+!!    Reference
+!!    ---------
+!
+!     see PHYEX documentation
+!
+!!    Implicit Arguments
+!!    ------------------
+!
+!     Module MODD_ARGSLIST :
+!         LIST_ll : list of fields
+!         DIMPHYEX_t: PHYEX dimensions
+!
+!!    Author
+!!    ------
+!
+!     Q.Rodier
+!
+!!    Modifications
+!!    -------------
+!     Original    August, 3, 2023
+!
+!-------------------------------------------------------------------------------
+!
+  IMPLICIT NONE
+!
+  TYPE(DIMPHYEX_t),        INTENT(IN)   :: D
+  TYPE(LIST_ll), POINTER         :: TPLIST   ! list of fields
+  REAL, DIMENSION(D%NIT,D%NJT,D%NKT), TARGET :: PFIELD   ! field which is unpaked here
+!                                              of fields
+  CHARACTER(LEN=*), INTENT(IN) :: HNAME ! Name of the field to be added
+
+  CALL ADD3DFIELD_ll(TPLIST, PFIELD, HNAME)
+              
+ END SUBROUTINE ADD3DFIELD_ll_PHY
+END MODULE MODE_ARGSLIST_ll_PHY
diff --git a/src/PHYEX/aux/mode_check_nam_val.f90 b/src/PHYEX/aux/mode_check_nam_val.f90
new file mode 100644
index 0000000000000000000000000000000000000000..9066b32515d2861d29d7bc4ab9f78a08b115cbab
--- /dev/null
+++ b/src/PHYEX/aux/mode_check_nam_val.f90
@@ -0,0 +1,298 @@
+MODULE MODE_CHECK_NAM_VAL
+!> @file
+!!      *MODE_CHECK_NAM_VAL" - Module containing the routines to control the different kind of variables
+!!                             read from namelist
+!!
+USE MODE_MSG, ONLY: PRINT_MSG, NVERB_FATAL
+IMPLICIT NONE
+CONTAINS
+SUBROUTINE CHECK_NAM_VAL_CHAR(KLUOUT, HNAME, HVAR, HVALUE1, HVALUE2, HVALUE3, HVALUE4, HVALUE5, &
+                             &HVALUE6, HVALUE7, HVALUE8, HVALUE9, HVALUE10, HVALUE11, HVALUE12)
+!!
+!!      *CHECK_NAM_VAL* - Control of CHARACTER variables
+!!
+!!    PURPOSE
+!!    -------
+!!      The purpose of this routine is to control the validity of CHARACTER variables
+!!
+!!
+!!    AUTHOR
+!!    ------
+!!     S. Riette
+!!
+!!    MODIFICATIONS
+!!    -------------
+!!
+!!    -  Original      Feb 2023, from Méso-NH code
+!!
+!-------------------------------------------------------------------------------
+!
+!**       DECLARATIONS
+!
+IMPLICIT NONE
+INTEGER,          INTENT(IN)           :: KLUOUT   !< output listing logical unit
+CHARACTER(LEN=*), INTENT(IN)           :: HNAME    !< name of the variable to test
+CHARACTER(LEN=*), INTENT(IN)           :: HVAR     !< variable to test
+CHARACTER(LEN=*), INTENT(IN), OPTIONAL :: HVALUE1  !< Authorised value 1
+CHARACTER(LEN=*), INTENT(IN), OPTIONAL :: HVALUE2  !< Authorised value 2
+CHARACTER(LEN=*), INTENT(IN), OPTIONAL :: HVALUE3  !< Authorised value 3
+CHARACTER(LEN=*), INTENT(IN), OPTIONAL :: HVALUE4  !< Authorised value 4
+CHARACTER(LEN=*), INTENT(IN), OPTIONAL :: HVALUE5  !< Authorised value 5
+CHARACTER(LEN=*), INTENT(IN), OPTIONAL :: HVALUE6  !< Authorised value 6
+CHARACTER(LEN=*), INTENT(IN), OPTIONAL :: HVALUE7  !< Authorised value 7
+CHARACTER(LEN=*), INTENT(IN), OPTIONAL :: HVALUE8  !< Authorised value 8
+CHARACTER(LEN=*), INTENT(IN), OPTIONAL :: HVALUE9  !< Authorised value 9
+CHARACTER(LEN=*), INTENT(IN), OPTIONAL :: HVALUE10 !< Authorised value 10
+CHARACTER(LEN=*), INTENT(IN), OPTIONAL :: HVALUE11 !< Authorised value 11
+CHARACTER(LEN=*), INTENT(IN), OPTIONAL :: HVALUE12 !< Authorised value 12
+!
+!**       CONTROLS
+!
+IF ( PRESENT (HVALUE1) ) THEN
+  IF ( HVAR==HVALUE1 ) RETURN
+END IF
+!
+IF ( PRESENT (HVALUE2) ) THEN
+  IF ( HVAR==HVALUE2 ) RETURN
+END IF
+!
+IF ( PRESENT (HVALUE3) ) THEN
+  IF ( HVAR==HVALUE3 ) RETURN
+END IF
+!
+IF ( PRESENT (HVALUE4) ) THEN
+  IF ( HVAR==HVALUE4 ) RETURN
+END IF
+!
+IF ( PRESENT (HVALUE5) ) THEN
+  IF ( HVAR==HVALUE5 ) RETURN
+END IF
+!
+IF ( PRESENT (HVALUE6) ) THEN
+  IF ( HVAR==HVALUE6 ) RETURN
+END IF
+!
+IF ( PRESENT (HVALUE7) ) THEN
+  IF ( HVAR==HVALUE7 ) RETURN
+END IF
+!
+IF ( PRESENT (HVALUE8) ) THEN
+  IF ( HVAR==HVALUE8 ) RETURN
+END IF
+!
+IF ( PRESENT (HVALUE9) ) THEN
+  IF ( HVAR==HVALUE9 ) RETURN
+END IF
+!
+IF ( PRESENT (HVALUE10) ) THEN
+  IF ( HVAR==HVALUE10 ) RETURN
+END IF
+!
+IF ( PRESENT (HVALUE11) ) THEN
+  IF ( HVAR==HVALUE11 ) RETURN
+END IF
+!
+IF ( PRESENT (HVALUE12) ) THEN
+  IF ( HVAR==HVALUE12 ) RETURN
+END IF
+!
+!** PRINTS AND ABORT
+!
+WRITE (KLUOUT,*) ' '
+WRITE (KLUOUT,*) 'FATAL ERROR:'
+WRITE (KLUOUT,*) '-----------'
+WRITE (KLUOUT,*) ' '
+WRITE (KLUOUT,*) 'Value "', HVAR, '" is not allowed for variable ', HNAME
+WRITE (KLUOUT,*) ' '
+WRITE (KLUOUT,*) 'Possible values are:'
+IF ( PRESENT (HVALUE1) ) WRITE (KLUOUT,*) '"',HVALUE1,'"'
+IF ( PRESENT (HVALUE2) ) WRITE (KLUOUT,*) '"',HVALUE2,'"'
+IF ( PRESENT (HVALUE3) ) WRITE (KLUOUT,*) '"',HVALUE3,'"'
+IF ( PRESENT (HVALUE4) ) WRITE (KLUOUT,*) '"',HVALUE4,'"'
+IF ( PRESENT (HVALUE5) ) WRITE (KLUOUT,*) '"',HVALUE5,'"'
+IF ( PRESENT (HVALUE6) ) WRITE (KLUOUT,*) '"',HVALUE6,'"'
+IF ( PRESENT (HVALUE7) ) WRITE (KLUOUT,*) '"',HVALUE7,'"'
+IF ( PRESENT (HVALUE8) ) WRITE (KLUOUT,*) '"',HVALUE8,'"'
+IF ( PRESENT (HVALUE9) ) WRITE (KLUOUT,*) '"',HVALUE9,'"'
+IF ( PRESENT (HVALUE10) ) WRITE (KLUOUT,*) '"',HVALUE10,'"'
+IF ( PRESENT (HVALUE11) ) WRITE (KLUOUT,*) '"',HVALUE11,'"'
+IF ( PRESENT (HVALUE12) ) WRITE (KLUOUT,*) '"',HVALUE12,'"'
+FLUSH(UNIT=KLUOUT)
+!
+CALL PRINT_MSG(NVERB_FATAL, 'GEN', 'CHECK_NAM_VAL_CHAR', TRIM(HVAR) // ' is not allowed for variable ' // TRIM(HNAME))
+!
+END SUBROUTINE CHECK_NAM_VAL_CHAR
+
+SUBROUTINE CHECK_NAM_VAL_REAL(KLUOUT, HNAME, PVALUE, CDSIGN1, PVAL1, CDSIGN2, PVAL2)
+!!
+!!      *CHECK_NAM_VAL* - Control of CHARACTER variables
+!!
+!!    PURPOSE
+!!    -------
+!!      The purpose of this routine is to control the validity of REAL variables
+!!
+!!
+!!    AUTHOR
+!!    ------
+!!     S. Riette
+!!
+!!    MODIFICATIONS
+!!    -------------
+!!
+!!    -  Original      Feb 2023
+!!
+!-------------------------------------------------------------------------------
+!
+!**       DECLARATIONS
+!
+IMPLICIT NONE
+INTEGER,          INTENT(IN)           :: KLUOUT   !< output listing logical unit
+CHARACTER(LEN=*), INTENT(IN)           :: HNAME    !< name of the variable to test
+REAL,             INTENT(IN)           :: PVALUE   !< variable to test
+CHARACTER(LEN=*), INTENT(IN)           :: CDSIGN1  !< sign for the first verification
+REAL,             INTENT(IN)           :: PVAL1    !< bound for the first verification
+CHARACTER(LEN=*), INTENT(IN), OPTIONAL :: CDSIGN2  !< sign for the second verification
+REAL,             INTENT(IN), OPTIONAL :: PVAL2    !< bound for the second verification
+
+INTEGER :: II, INUM
+REAL :: ZVAL
+CHARACTER(LEN=2) :: CSIGN
+LOGICAL :: LOK
+CHARACTER(LEN=10) :: CHAR_VAL
+!
+!**       CONTROLS
+!
+LOK=.TRUE.
+INUM=1
+IF(PRESENT(CDSIGN2)) INUM=2
+DO II=1, INUM
+  IF(II==1) THEN
+    ZVAL=PVAL1
+    CSIGN=CDSIGN1(1:MIN(2, LEN(CDSIGN1)))
+  ELSE
+    ZVAL=PVAL2
+    CSIGN=CDSIGN2(1:MIN(2, LEN(CDSIGN2)))
+  ENDIF
+  SELECT CASE (CSIGN)
+    CASE ('<') 
+      LOK=LOK .AND. PVALUE < ZVAL
+    CASE ('<=')
+      LOK=LOK .AND. PVALUE <= ZVAL
+    CASE ('>') 
+      LOK=LOK .AND. PVALUE > ZVAL
+    CASE ('>=')
+      LOK=LOK .AND. PVALUE >= ZVAL
+    CASE ('==')
+      LOK=LOK .AND. PVALUE == ZVAL
+    CASE DEFAULT
+       CALL PRINT_MSG(NVERB_FATAL, 'GEN', 'CHECK_NAM_VAL_REAL', TRIM(CSIGN) // ' is not allowed as comparator')
+  END SELECT
+ENDDO
+!
+!** PRINTS AND ABORT
+!
+IF(.NOT. LOK) THEN
+  WRITE(KLUOUT,*) ' '
+  WRITE(KLUOUT,*) 'FATAL ERROR:'
+  WRITE(KLUOUT,*) '-----------'
+  WRITE(KLUOUT,*) ' '
+  WRITE(KLUOUT,*) 'Value "', PVALUE, '" is not allowed for variable ', HNAME
+  WRITE(KLUOUT,*) ' '
+  WRITE(KLUOUT,*) 'Possible values are such as:'
+  WRITE(KLUOUT,*) CDSIGN1, PVAL1
+  IF (PRESENT(CDSIGN2)) WRITE(KLUOUT, *) CDSIGN2, PVAL2
+  FLUSH(UNIT=KLUOUT)
+  !
+  WRITE(UNIT=CHAR_VAL, FMT=*) PVALUE
+  CALL PRINT_MSG(NVERB_FATAL, 'GEN', 'CHECK_NAM_VAL_REAL', TRIM(CHAR_VAL) // ' is not allowed for variable ' // TRIM(HNAME))
+ENDIF
+!
+END SUBROUTINE CHECK_NAM_VAL_REAL
+
+SUBROUTINE CHECK_NAM_VAL_INT(KLUOUT, HNAME, KVALUE, CDSIGN1, KVAL1, CDSIGN2, KVAL2)
+!!
+!!      *CHECK_NAM_VAL* - Control of CHARACTER variables
+!!
+!!    PURPOSE
+!!    -------
+!!      The purpose of this routine is to control the validity of REAL variables
+!!
+!!
+!!    AUTHOR
+!!    ------
+!!     S. Riette
+!!
+!!    MODIFICATIONS
+!!    -------------
+!!
+!!    -  Original      Feb 2023
+!!
+!-------------------------------------------------------------------------------
+!
+!**       DECLARATIONS
+!
+IMPLICIT NONE
+INTEGER,          INTENT(IN)           :: KLUOUT   !< output listing logical unit
+CHARACTER(LEN=*), INTENT(IN)           :: HNAME    !< name of the variable to test
+INTEGER,          INTENT(IN)           :: KVALUE   !< variable to test
+CHARACTER(LEN=*), INTENT(IN)           :: CDSIGN1  !< sign for the first verification
+INTEGER,          INTENT(IN)           :: KVAL1    !< bound for the first verification
+CHARACTER(LEN=*), INTENT(IN), OPTIONAL :: CDSIGN2  !< sign for the second verification
+INTEGER,          INTENT(IN), OPTIONAL :: KVAL2    !< bound for the second verification
+
+INTEGER :: II, INUM
+INTEGER :: IVAL
+CHARACTER(LEN=2) :: CSIGN
+LOGICAL :: LOK
+CHARACTER(LEN=10) :: CHAR_VAL
+!
+!**       CONTROLS
+!
+LOK=.TRUE.
+INUM=1
+IF(PRESENT(CDSIGN2)) INUM=2
+DO II=1, INUM
+  IF(II==1) THEN
+    IVAL=KVAL1
+    CSIGN=CDSIGN1(1:MIN(2, LEN(CDSIGN1)))
+  ELSE
+    IVAL=KVAL2
+    CSIGN=CDSIGN2(1:MIN(2, LEN(CDSIGN2)))
+  ENDIF
+  SELECT CASE (CSIGN)
+    CASE ('<') 
+      LOK=LOK .AND. KVALUE < IVAL
+    CASE ('<=')
+      LOK=LOK .AND. KVALUE <= IVAL
+    CASE ('>') 
+      LOK=LOK .AND. KVALUE > IVAL
+    CASE ('>=')
+      LOK=LOK .AND. KVALUE >= IVAL
+    CASE ('==')
+      LOK=LOK .AND. KVALUE == IVAL
+    CASE DEFAULT
+       CALL PRINT_MSG(NVERB_FATAL, 'GEN', 'CHECK_NAM_VAL_REAL', TRIM(CSIGN) // ' is not allowed as comparator')
+  END SELECT
+ENDDO
+!
+!** PRINTS AND ABORT
+!
+IF(.NOT. LOK) THEN
+  WRITE(KLUOUT,*) ' '
+  WRITE(KLUOUT,*) 'FATAL ERROR:'
+  WRITE(KLUOUT,*) '-----------'
+  WRITE(KLUOUT,*) ' '
+  WRITE(KLUOUT,*) 'Value "', KVALUE, '" is not allowed for variable ', HNAME
+  WRITE(KLUOUT,*) ' '
+  WRITE(KLUOUT,*) 'Possible values are such as:'
+  WRITE(KLUOUT,*) CDSIGN1, KVAL1
+  IF (PRESENT(CDSIGN2)) WRITE(KLUOUT, *) CDSIGN2, KVAL2
+  FLUSH(UNIT=KLUOUT)
+  !
+  WRITE(UNIT=CHAR_VAL, FMT=*) KVALUE
+  CALL PRINT_MSG(NVERB_FATAL, 'GEN', 'CHECK_NAM_VAL_REAL', TRIM(CHAR_VAL) // ' is not allowed for variable ' // TRIM(HNAME))
+ENDIF
+!
+END SUBROUTINE CHECK_NAM_VAL_INT
+!
+END MODULE MODE_CHECK_NAM_VAL
diff --git a/src/PHYEX/aux/mode_gradient_m_phy.f90 b/src/PHYEX/aux/mode_gradient_m_phy.f90
index de27a253baa2139a0f9b9a6aba94d87b6e71b390..e4df65f930da03f27b8d6f9bf524d49349f0a865 100644
--- a/src/PHYEX/aux/mode_gradient_m_phy.f90
+++ b/src/PHYEX/aux/mode_gradient_m_phy.f90
@@ -106,8 +106,7 @@ PGZ_M_W(IIB:IIE,IJB:IJE,IKA)= PGZ_M_W(IIB:IIE,IJB:IJE,IKU) ! -999.
 END SUBROUTINE GZ_M_W_PHY
 !
 SUBROUTINE GX_M_M_PHY(D,OFLAT,PA,PDXX,PDZZ,PDZX,PGX_M_M)
-      USE PARKIND1, ONLY : JPRB
-      USE YOMHOOK , ONLY : LHOOK, DR_HOOK
+      USE YOMHOOK , ONLY : LHOOK, DR_HOOK, JPHOOK
 !     #######################################################
 !
 !!****  *GX_M_M* - Cartesian Gradient operator: 
@@ -195,7 +194,7 @@ INTEGER :: JI,JJ,JK
 !*       1.    DEFINITION of GX_M_M
 !              --------------------
 !
-REAL(KIND=JPRB) :: ZHOOK_HANDLE
+REAL(KIND=JPHOOK) :: ZHOOK_HANDLE
 IF (LHOOK) CALL DR_HOOK('GX_M_M',0,ZHOOK_HANDLE)
 !
 IIE=D%NIEC
@@ -232,8 +231,7 @@ IF (LHOOK) CALL DR_HOOK('GX_M_M',1,ZHOOK_HANDLE)
 END SUBROUTINE GX_M_M_PHY
 !
       SUBROUTINE GY_M_M_PHY(D,OFLAT,PA,PDYY,PDZZ,PDZY,PGY_M_M)
-      USE PARKIND1, ONLY : JPRB
-      USE YOMHOOK , ONLY : LHOOK, DR_HOOK
+      USE YOMHOOK , ONLY : LHOOK, DR_HOOK, JPHOOK
 !     #######################################################
 !
 !!****  *GY_M_M* - Cartesian Gradient operator: 
@@ -312,7 +310,7 @@ INTEGER :: JI,JJ,JK
 !
 !*       0.2   declaration of local variables
 !
-REAL(KIND=JPRB) :: ZHOOK_HANDLE
+REAL(KIND=JPHOOK) :: ZHOOK_HANDLE
 IF (LHOOK) CALL DR_HOOK('GY_M_M',0,ZHOOK_HANDLE)
 !
 IIE=D%NIEC
@@ -356,8 +354,7 @@ END SUBROUTINE GY_M_M_PHY
 !
 !     #######################################################
       SUBROUTINE GX_M_U_PHY(D,OFLAT,PY,PDXX,PDZZ,PDZX,PGX_M_U)
-      USE PARKIND1, ONLY : JPRB
-      USE YOMHOOK , ONLY : LHOOK, DR_HOOK
+      USE YOMHOOK , ONLY : LHOOK, DR_HOOK, JPHOOK
 !     ##################################################
 !
 !!****  *GX_M_U * - Compute the gradient along x for a variable localized at
@@ -439,7 +436,7 @@ REAL, DIMENSION(D%NIT*D%NJT*D%NKT) :: ZGX_M_U
 REAL, DIMENSION(D%NIT,D%NJT,D%NKT):: ZY, ZDXX
 INTEGER  IIU,IKU,JI,JK,IKL, IKA
 !
-INTEGER :: JJK,IJU
+INTEGER :: IJU
 INTEGER :: JIJK,JIJKOR,JIJKEND
 INTEGER :: JI_1JK, JIJK_1, JI_1JK_1, JIJKP1, JI_1JKP1
 !
@@ -449,7 +446,7 @@ INTEGER :: JI_1JK, JIJK_1, JI_1JK_1, JIJKP1, JI_1JKP1
 !*       1.    COMPUTE THE GRADIENT ALONG X
 !              -----------------------------
 !
-REAL(KIND=JPRB) :: ZHOOK_HANDLE
+REAL(KIND=JPHOOK) :: ZHOOK_HANDLE
 IF (LHOOK) CALL DR_HOOK('GX_M_U',0,ZHOOK_HANDLE)
 IIU=D%NIT
 IJU=D%NJT
@@ -506,8 +503,7 @@ IF (LHOOK) CALL DR_HOOK('GX_M_U',1,ZHOOK_HANDLE)
 END SUBROUTINE GX_M_U_PHY
 !
       SUBROUTINE GY_M_V_PHY(D,OFLAT,PY,PDYY,PDZZ,PDZY,PGY_M_V)
-      USE PARKIND1, ONLY : JPRB
-      USE YOMHOOK , ONLY : LHOOK, DR_HOOK
+      USE YOMHOOK , ONLY : LHOOK, DR_HOOK, JPHOOK
 !     ##################################################
 !
 !!****  *GY_M_V * - Compute the gradient along y for a variable localized at
@@ -595,7 +591,7 @@ INTEGER  IJU,IKU,JI,JJ,JK,IKL, IKA
 !*       1.    COMPUTE THE GRADIENT ALONG Y
 !              ----------------------------
 !
-REAL(KIND=JPRB) :: ZHOOK_HANDLE
+REAL(KIND=JPHOOK) :: ZHOOK_HANDLE
 IF (LHOOK) CALL DR_HOOK('GY_M_V',0,ZHOOK_HANDLE)
 IJU=D%NJT
 IKU=D%NKT
diff --git a/src/PHYEX/aux/mode_gradient_u_phy.f90 b/src/PHYEX/aux/mode_gradient_u_phy.f90
index ded89cd72bb39d1127422fec064b8b9efda576a9..f2c85adc9f846dbdd2a2aca207f64450372fdd60 100644
--- a/src/PHYEX/aux/mode_gradient_u_phy.f90
+++ b/src/PHYEX/aux/mode_gradient_u_phy.f90
@@ -100,8 +100,7 @@ PGZ_U_UW(IIB:IIE,IJB:IJE,:)= PA_WORK(IIB:IIE,IJB:IJE,:) &
 END SUBROUTINE GZ_U_UW_PHY
 !
       SUBROUTINE GX_U_M_PHY(D,OFLAT,PA,PDXX,PDZZ,PDZX,PGX_U_M)
-      USE PARKIND1, ONLY : JPRB
-      USE YOMHOOK , ONLY : LHOOK, DR_HOOK
+      USE YOMHOOK , ONLY : LHOOK, DR_HOOK, JPHOOK
 !     #######################################################
 !
 !!****  *GX_U_M* - Cartesian Gradient operator: 
@@ -174,7 +173,7 @@ REAL, DIMENSION(D%NIT,D%NJT,D%NKT),  INTENT(IN)  :: PDXX    ! metric coefficient
 REAL, DIMENSION(D%NIT,D%NJT,D%NKT),  INTENT(IN)  :: PDZZ    ! metric coefficient dzz
 REAL, DIMENSION(D%NIT,D%NJT,D%NKT),  INTENT(IN)  :: PDZX    ! metric coefficient dzx
 !
-REAL, DIMENSION(D%NIT,D%NJT,D%NKT) :: PGX_U_M ! result mass point
+REAL, DIMENSION(D%NIT,D%NJT,D%NKT),  INTENT(OUT) :: PGX_U_M ! result mass point
 !
 REAL, DIMENSION(D%NIT,D%NJT,D%NKT)  :: ZWORK1, ZWORK2, ZWORK3, ZWORK4
 INTEGER :: IIB,IJB,IIE,IJE,IKT
@@ -189,7 +188,7 @@ INTEGER :: JI,JJ,JK
 !*       1.    DEFINITION of GX_U_M
 !              --------------------
 !
-REAL(KIND=JPRB) :: ZHOOK_HANDLE
+REAL(KIND=JPHOOK) :: ZHOOK_HANDLE
 IF (LHOOK) CALL DR_HOOK('GX_U_M',0,ZHOOK_HANDLE)
 !
 IIE=D%NIEC
diff --git a/src/PHYEX/aux/mode_gradient_v_phy.f90 b/src/PHYEX/aux/mode_gradient_v_phy.f90
index 37832eae6c5e8da6d0f69f71fa3261e868f53e4f..7f5c35d70656109979206b5e3df4c9c50739a7c9 100644
--- a/src/PHYEX/aux/mode_gradient_v_phy.f90
+++ b/src/PHYEX/aux/mode_gradient_v_phy.f90
@@ -97,8 +97,7 @@ PGZ_V_VW(IIB:IIE,IJB:IJE,:)= PA_WORK(IIB:IIE,IJB:IJE,:) &
 !
 END SUBROUTINE GZ_V_VW_PHY
       SUBROUTINE GY_V_M_PHY(D,OFLAT,PA,PDYY,PDZZ,PDZY,PGY_V_M)
-      USE PARKIND1, ONLY : JPRB
-      USE YOMHOOK , ONLY : LHOOK, DR_HOOK
+      USE YOMHOOK , ONLY : LHOOK, DR_HOOK, JPHOOK
 !     #######################################################
 !
 !!****  *GY_V_M* - Cartesian Gradient operator: 
@@ -170,7 +169,7 @@ REAL, DIMENSION(D%NIT,D%NJT,D%NKT),  INTENT(IN)  :: PDYY    ! metric coefficient
 REAL, DIMENSION(D%NIT,D%NJT,D%NKT),  INTENT(IN)  :: PDZZ    ! metric coefficient dzz
 REAL, DIMENSION(D%NIT,D%NJT,D%NKT),  INTENT(IN)  :: PDZY    ! metric coefficient dzy
 !
-REAL, DIMENSION(D%NIT,D%NJT,D%NKT) :: PGY_V_M ! result mass point
+REAL, DIMENSION(D%NIT,D%NJT,D%NKT), INTENT(OUT)  :: PGY_V_M ! result mass point
 !
 REAL, DIMENSION(D%NIT,D%NJT,D%NKT)  :: ZWORK1, ZWORK2, ZWORK3, ZWORK4
 INTEGER :: IIB,IJB,IIE,IJE,IKT
@@ -178,7 +177,7 @@ INTEGER :: JI,JJ,JK
 !
 !*       0.2   declaration of local variables
 !
-REAL(KIND=JPRB) :: ZHOOK_HANDLE
+REAL(KIND=JPHOOK) :: ZHOOK_HANDLE
 IF (LHOOK) CALL DR_HOOK('GY_V_M',0,ZHOOK_HANDLE)
 !
 IIE=D%NIEC
diff --git a/src/PHYEX/aux/mode_gradient_w_phy.f90 b/src/PHYEX/aux/mode_gradient_w_phy.f90
index 924491117970a70303cf00b0b4542b488c4ddeba..dcce7fcf58ce6e99276009981e9d0ce841f09097 100644
--- a/src/PHYEX/aux/mode_gradient_w_phy.f90
+++ b/src/PHYEX/aux/mode_gradient_w_phy.f90
@@ -2,8 +2,7 @@ MODULE MODE_GRADIENT_W_PHY
 IMPLICIT NONE
 CONTAINS
       SUBROUTINE GX_W_UW_PHY(D,OFLAT,PA,PDXX,PDZZ,PDZX,PGX_W_UW)
-      USE PARKIND1, ONLY : JPRB
-      USE YOMHOOK , ONLY : LHOOK, DR_HOOK
+      USE YOMHOOK , ONLY : LHOOK, DR_HOOK, JPHOOK
 !     #########################################################
 !
 !!****  *GX_W_UW* - Cartesian Gradient operator: 
@@ -50,7 +49,7 @@ CONTAINS
 !*       0.    DECLARATIONS
 !
 !
-USE MODE_SHUMAN_PHY,    ONLY: MZF_PHY, DZF_PHY, MXM_PHY, DXM_PHY, MZM_PHY, DZM_PHY
+USE MODE_SHUMAN_PHY,    ONLY: MZF_PHY, MXM_PHY, DXM_PHY, MZM_PHY, DZM_PHY
 USE MODD_DIMPHYEX, ONLY: DIMPHYEX_t
 !
 IMPLICIT NONE
@@ -80,7 +79,7 @@ INTEGER :: JI,JJ,JK
 !*       1.    DEFINITION of GX_W_UW
 !              ---------------------
 !
-REAL(KIND=JPRB) :: ZHOOK_HANDLE
+REAL(KIND=JPHOOK) :: ZHOOK_HANDLE
 IF (LHOOK) CALL DR_HOOK('GX_W_UW',0,ZHOOK_HANDLE)
 IIE=D%NIEC
 IIB=D%NIBC
@@ -114,8 +113,7 @@ IF (LHOOK) CALL DR_HOOK('GX_W_UW',1,ZHOOK_HANDLE)
 END SUBROUTINE GX_W_UW_PHY
 !
       SUBROUTINE GY_W_VW_PHY(D,OFLAT,PA,PDYY,PDZZ,PDZY,PGY_W_VW)
-      USE PARKIND1, ONLY : JPRB
-      USE YOMHOOK , ONLY : LHOOK, DR_HOOK
+      USE YOMHOOK , ONLY : LHOOK, DR_HOOK, JPHOOK
 !     #########################################################
 !
 !!****  *GY_W_VW* - Cartesian Gradient operator: 
@@ -162,7 +160,7 @@ END SUBROUTINE GX_W_UW_PHY
 !*       0.    DECLARATIONS
 !
 !
-USE MODE_SHUMAN_PHY,    ONLY: MZF_PHY, DZF_PHY, MYM_PHY, DYM_PHY, MZM_PHY, DZM_PHY
+USE MODE_SHUMAN_PHY,    ONLY: MZF_PHY, MYM_PHY, DYM_PHY, MZM_PHY, DZM_PHY
 USE MODD_DIMPHYEX, ONLY: DIMPHYEX_t
 !
 IMPLICIT NONE
@@ -191,7 +189,7 @@ INTEGER :: JI,JJ,JK
 !*       1.    DEFINITION of GY_W_VW
 !              ---------------------
 !
-REAL(KIND=JPRB) :: ZHOOK_HANDLE
+REAL(KIND=JPHOOK) :: ZHOOK_HANDLE
 IF (LHOOK) CALL DR_HOOK('GY_W_VW',0,ZHOOK_HANDLE)
 !IF (.NOT. LFLAT) THEN
 !  PGY_W_VW(:,:,:)= DYM(PA(:,:,:))/(MZM(PDYY(:,:,:), KKA, KKU, KL))    &
@@ -233,8 +231,7 @@ IF (LHOOK) CALL DR_HOOK('GY_W_VW',1,ZHOOK_HANDLE)
 END SUBROUTINE GY_W_VW_PHY
 !
       SUBROUTINE GZ_W_M_PHY(D,PA,PDZZ,PGZ_W_M)
-      USE PARKIND1, ONLY : JPRB
-      USE YOMHOOK , ONLY : LHOOK, DR_HOOK
+      USE YOMHOOK , ONLY : LHOOK, DR_HOOK, JPHOOK
 !     #######################################################
 !
 !!****  *GZ_W_M* - Cartesian Gradient operator: 
@@ -307,7 +304,7 @@ INTEGER :: JI,JJ,JK
 !*       1.    DEFINITION of GZ_W_M
 !              --------------------
 !
-REAL(KIND=JPRB) :: ZHOOK_HANDLE
+REAL(KIND=JPHOOK) :: ZHOOK_HANDLE
 IF (LHOOK) CALL DR_HOOK('GZ_W_M',0,ZHOOK_HANDLE)
 IIE=D%NIEC
 IIB=D%NIBC
diff --git a/src/PHYEX/aux/mode_ini_cst.f90 b/src/PHYEX/aux/mode_ini_cst.f90
new file mode 100644
index 0000000000000000000000000000000000000000..89eef4a6023da4a4be1ea9a11f9d65aff426d3e6
--- /dev/null
+++ b/src/PHYEX/aux/mode_ini_cst.f90
@@ -0,0 +1,200 @@
+!MNH_LIC Copyright 1994-2021 CNRS, Meteo-France and Universite Paul Sabatier
+!MNH_LIC This is part of the Meso-NH software governed by the CeCILL-C licence
+!MNH_LIC version 1. See LICENSE, CeCILL-C_V1-en.txt and CeCILL-C_V1-fr.txt
+!MNH_LIC for details. version 1.
+!     ##################
+MODULE MODE_INI_CST
+IMPLICIT NONE
+CONTAINS
+      SUBROUTINE INI_CST 
+!     ##################
+!
+!!****  *INI_CST * - routine to initialize the module MODD_CST
+!!
+!!    PURPOSE
+!!    -------
+!       The purpose of this routine is to initialize  the physical constants
+!     stored in  module MODD_CST.
+!      
+!
+!!**  METHOD
+!!    ------
+!!      The physical constants are set to their numerical values 
+!!     
+!!
+!!    EXTERNAL
+!!    --------
+!!
+!!    IMPLICIT ARGUMENTS
+!!    ------------------
+!!      Module MODD_CST     : contains physical constants
+!!
+!!    REFERENCE
+!!    ---------
+!!      Book2 of the documentation (module MODD_CST, routine INI_CST)
+!!      
+!!
+!!    AUTHOR
+!!    ------
+!!  	V. Ducrocq       * Meteo France *
+!!
+!!    MODIFICATIONS
+!!    -------------
+!!      Original    18/05/94 
+!!      J. Stein    02/01/95  add the volumic mass of liquid water
+!!      J.-P. Pinty 13/12/95  add the water vapor pressure over solid ice
+!!      J. Stein    29/06/97  add XTH00
+!!      V. Masson   05/10/98  add XRHOLI
+!!      C. Mari     31/10/00  add NDAYSEC
+!!      V. Masson   01/03/03  add XCONDI
+!!      J. Escobar  28/03/2014 for pb with emissivity/aerosol reset XMNH_TINY=1.0e-80 in real8 case
+!!      R. El Khatib 04/08/14 add pre-computed quantities
+!!      P. Marguinaud 04/10/16 Port to single precision
+!!      J.Escobar : 10/2017 : for real*4 , add XMNH_HUGE_12_LOG
+!!  Philippe Wautelet: 05/2016-04/2018: new data structures and calls for I/O
+!!      J.Escobar : 5/10/2018 : for real*4 ,higher value for XEPS_DT = 1.5e-4
+!!
+!-------------------------------------------------------------------------------
+!
+!*       0.    DECLARATIONS
+!              ------------
+!
+USE MODD_CST
+USE MODD_PRECISION, ONLY: MNHREAL, MNHREAL32, MNHREAL64
+USE MODE_MSG,       ONLY: PRINT_MSG, NVERB_FATAL
+USE YOMHOOK , ONLY : LHOOK, DR_HOOK, JPHOOK
+!
+IMPLICIT NONE
+!  
+REAL(KIND=JPHOOK) :: ZHOOK_HANDLE
+!-------------------------------------------------------------------------------
+IF (LHOOK) CALL DR_HOOK('INI_CST',0,ZHOOK_HANDLE)
+CALL CST_ASSOCIATE()
+!
+!*       1.     FUNDAMENTAL CONSTANTS
+!	        ---------------------
+!
+XPI         = 2.*ASIN(1.)
+XKARMAN     = 0.4
+XLIGHTSPEED = 299792458.
+XPLANCK     = 6.6260755E-34
+XBOLTZ      = 1.380658E-23
+XAVOGADRO   = 6.0221367E+23
+!
+!-------------------------------------------------------------------------------
+!
+!*       2.     ASTRONOMICAL CONSTANTS
+!	        ----------------------
+!
+XDAY   = 86400.
+XSIYEA = 365.25*XDAY*2.*XPI/ 6.283076
+XSIDAY = XDAY/(1.+XDAY/XSIYEA)
+XOMEGA = 2.*XPI/XSIDAY
+NDAYSEC = 24*3600 ! Number of seconds in a day
+!
+!-------------------------------------------------------------------------------!
+!
+!
+!*       3.     TERRESTRIAL GEOIDE CONSTANTS
+!	        ----------------------------
+!
+XRADIUS = 6371229.
+XG      = 9.80665
+!
+!-------------------------------------------------------------------------------
+!
+!*       4.     REFERENCE PRESSURE
+!	        -------------------
+!
+! Ocean model cst same as in 1D/CMO SURFEX
+! values used in ini_cst to overwrite XP00 and XTH00
+XRH00OCEAN =1024.
+XTH00OCEAN = 286.65
+XSA00OCEAN= 32.6
+XP00OCEAN = 201.E5
+!Atmospheric model
+XP00 = 1.E5
+XTH00 = 300.
+!-------------------------------------------------------------------------------
+!
+!*       5.     RADIATION CONSTANTS
+!	        -------------------
+!
+! Original: XSTEFAN = 2.* XPI**5 * XBOLTZ**4 / (15.* XLIGHTSPEED**2 * XPLANCK**3)
+! Juan: XSTEFAN = ( 2.* XPI**5 / 15. ) * ( (XBOLTZ / XPLANCK) * XBOLTZ ) * (XBOLTZ/(XLIGHTSPEED*XPLANCK))**2
+! Philippe Marguinaud: XSTEFAN = REAL (2._8* REAL (XPI, 8)**5 * REAL (XBOLTZ, 8)**4 / (15._8* REAL (XLIGHTSPEED, 8)**2 * REAL (XPLANCK, 8)**3))
+XSTEFAN = REAL (2._MNHREAL64* REAL (XPI, MNHREAL64)**5 * REAL (XBOLTZ, MNHREAL64)**4 / &
+        & (15._MNHREAL64* REAL (XLIGHTSPEED, MNHREAL64)**2 * REAL (XPLANCK, MNHREAL64)**3))
+XI0     = 1370.
+!
+!-------------------------------------------------------------------------------
+!
+!*       6.     THERMODYNAMIC CONSTANTS
+!	        -----------------------
+!
+XMD    = 28.9644E-3
+XMV    = 18.0153E-3
+XRD    = XAVOGADRO * XBOLTZ / XMD
+XRV    = XAVOGADRO * XBOLTZ / XMV
+XEPSILO= XMV/XMD
+XCPD   = 7.* XRD /2.
+XCPV   = 4.* XRV
+XRHOLW = 1000.
+XRHOLI = 900.
+XCONDI = 2.22
+XCL    = 4.218E+3
+XCI    = 2.106E+3
+XTT    = 273.16
+XLVTT  = 2.5008E+6
+XLSTT  = 2.8345E+6
+XLMTT  = XLSTT - XLVTT
+XESTT  = 611.14
+XGAMW  = (XCL - XCPV) / XRV
+XBETAW = (XLVTT/XRV) + (XGAMW * XTT)
+XALPW  = LOG(XESTT) + (XBETAW /XTT) + (XGAMW *LOG(XTT))
+XGAMI  = (XCI - XCPV) / XRV
+XBETAI = (XLSTT/XRV) + (XGAMI * XTT)
+XALPI  = LOG(XESTT) + (XBETAI /XTT) + (XGAMI *LOG(XTT))
+! Values identical to ones used in CMO1D in SURFEX /could be modified
+! Coefficient of thermal expansion of water (K-1)
+XALPHAOC = 1.9E-4
+! Coeff of Haline contraction coeff (S-1)
+XBETAOC= 7.7475E-4
+!
+!*       7.     PRECOMPUTED CONSTANTS
+!	        ---------------------
+!
+RDSRV = XRD/XRV
+RDSCPD = XRD/XCPD
+RINVXP00 =  1./XP00
+!
+!*       8.     MACHINE PRECISION VALUE DEPENDING of REAL4/8 USE
+!	        ---------------------
+!
+XMNH_EPSILON = EPSILON (XMNH_EPSILON )
+XMNH_HUGE    = HUGE    (XMNH_HUGE )
+XMNH_HUGE_12_LOG = LOG ( SQRT(XMNH_HUGE)  )
+
+IF (MNHREAL == MNHREAL64) THEN
+XMNH_TINY      = 1.0e-80_MNHREAL
+XEPS_DT        = 1.0e-5_MNHREAL
+XRES_FLAT_CART = 1.0e-12_MNHREAL
+XRES_OTHER     = 1.0e-9_MNHREAL
+XRES_PREP      = 1.0e-8_MNHREAL
+ELSEIF (MNHREAL == MNHREAL32) THEN
+XMNH_TINY      = TINY    (XMNH_TINY    )
+XEPS_DT        = 1.5e-4_MNHREAL
+XRES_FLAT_CART = 1.0e-12_MNHREAL
+XRES_OTHER     = 1.0e-7_MNHREAL
+XRES_PREP      = 1.0e-4_MNHREAL
+ELSE
+CALL PRINT_MSG(NVERB_FATAL, 'GEN', 'INI_CST', 'Invalid MNH_REAL')
+ENDIF
+XMNH_TINY_12 = SQRT    (XMNH_TINY    )
+!
+!-------------------------------------------------------------------------------
+!
+IF (LHOOK) CALL DR_HOOK('INI_CST',1,ZHOOK_HANDLE)
+END SUBROUTINE INI_CST 
+
+END MODULE MODE_INI_CST
diff --git a/src/PHYEX/aux/mode_posnam_phy.f90 b/src/PHYEX/aux/mode_posnam_phy.f90
new file mode 100644
index 0000000000000000000000000000000000000000..692ade32693b100f3b984d76bf0d0acc487cb84d
--- /dev/null
+++ b/src/PHYEX/aux/mode_posnam_phy.f90
@@ -0,0 +1,26 @@
+MODULE MODE_POSNAM_PHY
+IMPLICIT NONE
+PRIVATE
+PUBLIC :: POSNAM_PHY
+CONTAINS
+SUBROUTINE POSNAM_PHY(KULNAM, CDNAML, LDNEEDNAM, LDFOUND, KLUOUT)
+
+!Wrapper to call the Meso-NH version of posnam
+
+USE MODE_MSG, ONLY: NVERB_FATAL, PRINT_MSG
+USE MODE_POS, ONLY: POSNAM
+
+IMPLICIT NONE
+
+INTEGER,          INTENT(IN)    :: KULNAM    !< Logical unit to access the namelist
+CHARACTER(LEN=*), INTENT(IN)    :: CDNAML    !< Namelist name
+LOGICAL,          INTENT(IN)    :: LDNEEDNAM !< True to abort if namelist is absent
+LOGICAL,          INTENT(OUT)   :: LDFOUND   !< True if namelist has been found
+INTEGER,          INTENT(IN)    :: KLUOUT    !< Logical unit for output
+
+CALL POSNAM(KULNAM, CDNAML, LDFOUND, KLUOUT)
+IF(LDNEEDNAM .AND. .NOT. LDFOUND) CALL PRINT_MSG(NVERB_FATAL, 'GEN', 'POSNAM_PHY', 'CANNOT LOCATE '//CDNAML)
+
+END SUBROUTINE POSNAM_PHY
+
+END MODULE MODE_POSNAM_PHY
diff --git a/src/PHYEX/aux/modi_gamma.f90 b/src/PHYEX/aux/modi_gamma.f90
index 4f10dab67e1a8d1d68ade60fa71f6f5cb19f9767..56868045c848d74b01174f04df2a2258df660264 100644
--- a/src/PHYEX/aux/modi_gamma.f90
+++ b/src/PHYEX/aux/modi_gamma.f90
@@ -6,14 +6,17 @@
         MODULE MODI_GAMMA
 !       #################
 !
+IMPLICIT NONE
 INTERFACE GAMMA
 !
 FUNCTION GAMMA_X0D(PX)  RESULT(PGAMMA)
+IMPLICIT NONE
 REAL, INTENT(IN)                                  :: PX
 REAL                                              :: PGAMMA
 END FUNCTION GAMMA_X0D
 !
 FUNCTION GAMMA_X1D(PX)  RESULT(PGAMMA)
+IMPLICIT NONE
 REAL, DIMENSION(:), INTENT(IN)        :: PX
 REAL, DIMENSION(SIZE(PX))             :: PGAMMA
 END FUNCTION GAMMA_X1D
diff --git a/src/PHYEX/aux/modi_gamma_inc.f90 b/src/PHYEX/aux/modi_gamma_inc.f90
index 2b54c25acdd9fa4d45c450acf758e1bce0f0f0aa..e88526e5bf8b097493d3ae391751600f2e93ccf4 100644
--- a/src/PHYEX/aux/modi_gamma_inc.f90
+++ b/src/PHYEX/aux/modi_gamma_inc.f90
@@ -6,9 +6,11 @@
 MODULE MODI_GAMMA_INC
 !####################
 !
+IMPLICIT NONE
 INTERFACE
 !
 FUNCTION GAMMA_INC(PA,PX)  RESULT(PGAMMA_INC)
+IMPLICIT NONE
 REAL, INTENT(IN)                                  :: PA
 REAL, INTENT(IN)                                  :: PX
 REAL                                              :: PGAMMA_INC
diff --git a/src/PHYEX/aux/modi_general_gamma.f90 b/src/PHYEX/aux/modi_general_gamma.f90
index 7868333a612a9b5866f88c6d856d071ae1eb1773..041c7f0b797226b2f7346b9dbe33c35fff56401d 100644
--- a/src/PHYEX/aux/modi_general_gamma.f90
+++ b/src/PHYEX/aux/modi_general_gamma.f90
@@ -6,9 +6,11 @@
 MODULE MODI_GENERAL_GAMMA
 !########################
 !
+IMPLICIT NONE
 INTERFACE
 !
 FUNCTION GENERAL_GAMMA(PALPHA,PNU,PLBDA,PX)  RESULT(PGENERAL_GAMMA)
+IMPLICIT NONE
 REAL, INTENT(IN)                                  :: PALPHA
 REAL, INTENT(IN)                                  :: PNU
 REAL, INTENT(IN)                                  :: PLBDA
diff --git a/src/PHYEX/aux/modi_ini_cst.f90 b/src/PHYEX/aux/modi_ini_cst.f90
deleted file mode 100644
index 08f587f77df0ce8b2b6db1b487af365ea20cf9d5..0000000000000000000000000000000000000000
--- a/src/PHYEX/aux/modi_ini_cst.f90
+++ /dev/null
@@ -1,12 +0,0 @@
-!     ######spl
-      MODULE MODI_INI_CST
-!     ###################
-!
-INTERFACE
-!
-SUBROUTINE INI_CST
-END SUBROUTINE INI_CST 
-!
-END INTERFACE
-!
-END MODULE MODI_INI_CST
diff --git a/src/PHYEX/aux/modi_ini_phyex.f90 b/src/PHYEX/aux/modi_ini_phyex.f90
new file mode 100644
index 0000000000000000000000000000000000000000..70e2c41ff8bb9941c8439ec64b1d7768d7ad7e4c
--- /dev/null
+++ b/src/PHYEX/aux/modi_ini_phyex.f90
@@ -0,0 +1,54 @@
+MODULE MODI_INI_PHYEX
+IMPLICIT NONE
+INTERFACE
+SUBROUTINE INI_PHYEX(HPROGRAM, KUNITNML, LDNEEDNAM, KLUOUT, KFROM, KTO, &
+                    &PTSTEP, PDZMIN, &
+                    &CMICRO, CSCONV, CTURB, &
+                    &LDCHANGEMODEL, LDDEFAULTVAL, LDREADNAM, LDCHECK, KPRINT, LDINIT, &
+                    &PHYEX_IN, PHYEX_OUT)
+!
+USE MODD_PHYEX, ONLY: PHYEX_t
+USE MODD_CST, ONLY: CST_t
+USE MODD_PARAM_ICE_n, ONLY: PARAM_ICE_t
+USE MODD_RAIN_ICE_DESCR_n, ONLY: RAIN_ICE_DESCR_t
+USE MODD_RAIN_ICE_PARAM_n, ONLY: RAIN_ICE_PARAM_t
+USE MODD_CLOUDPAR_N,     ONLY: CLOUDPAR_t
+USE MODD_PARAM_MFSHALL_N,ONLY: PARAM_MFSHALL_t
+USE MODD_TURB_N,         ONLY: TURB_t
+USE MODD_CTURB,          ONLY: CSTURB_t
+USE MODD_NEB_N,          ONLY: NEB_t
+!
+IMPLICIT NONE
+
+CHARACTER(LEN=6),  INTENT(IN) :: HPROGRAM     !< Current program
+INTEGER,           INTENT(IN) :: KUNITNML     !< Logical unit to access the namelist
+LOGICAL,           INTENT(IN) :: LDNEEDNAM    !< True to abort if namelist is absent
+INTEGER,           INTENT(IN) :: KLUOUT       !< Logical unit for outputs
+INTEGER,           INTENT(IN) :: KFROM        !< Old model number
+INTEGER,           INTENT(IN) :: KTO          !< New model number
+REAL,              INTENT(IN) :: PTSTEP       !< Timestep
+REAL,              INTENT(IN) :: PDZMIN       !< Minimum thickness
+CHARACTER(LEN=4),  INTENT(IN) :: CMICRO       !< Microphysical scheme to use
+CHARACTER(LEN=4),  INTENT(IN) :: CTURB        !< Turbulence scheme to use
+CHARACTER(LEN=4),  INTENT(IN) :: CSCONV       !< Shallow convection scheme to use
+LOGICAL, OPTIONAL, INTENT(IN) :: LDCHANGEMODEL!< Must we change the active model
+LOGICAL, OPTIONAL, INTENT(IN) :: LDDEFAULTVAL !< Must we initialize variables with default values (defaults to .TRUE.)
+LOGICAL, OPTIONAL, INTENT(IN) :: LDREADNAM    !< Must we read the namelist (defaults to .TRUE.)
+LOGICAL, OPTIONAL, INTENT(IN) :: LDCHECK      !< Must we perform some checks on values (defaults to .TRUE.)
+INTEGER, OPTIONAL, INTENT(IN) :: KPRINT       !< Print level (defaults to 0): 0 for no print, 1 to safely print namelist,
+                                              !! 2 to print informative messages
+LOGICAL, OPTIONAL, INTENT(IN) :: LDINIT       !< Must we call the init routines
+TYPE(PHYEX_t), OPTIONAL, INTENT(IN)    :: PHYEX_IN    !< Structure for constants (IN)
+TYPE(PHYEX_t), OPTIONAL, INTENT(INOUT) :: PHYEX_OUT   !< Structure for constants (OUT)
+
+!IMPORTANT NOTE on PHYEX_OUT arguments.
+!Logically this argument should be declared with INTENT(OUT) but in this case ifort (at least) breaks the
+!execution when the same structure is given for the PHYEX_IN and the PHYEX_OUT argument.
+!When INITENT(INOUT) is used, execution is OK on ifort.
+
+
+
+
+END SUBROUTINE INI_PHYEX
+END INTERFACE
+END MODULE MODI_INI_PHYEX
diff --git a/src/PHYEX/aux/shuman.f90 b/src/PHYEX/aux/shuman.f90
new file mode 100644
index 0000000000000000000000000000000000000000..96aa554f66cc1d0cc27b3fbb8474f19404e39db8
--- /dev/null
+++ b/src/PHYEX/aux/shuman.f90
@@ -0,0 +1,1304 @@
+!MNH_LIC Copyright 1994-2014 CNRS, Meteo-France and Universite Paul Sabatier
+!MNH_LIC This is part of the Meso-NH software governed by the CeCILL-C licence
+!MNH_LIC version 1. See LICENSE, CeCILL-C_V1-en.txt and CeCILL-C_V1-fr.txt  
+!MNH_LIC for details. version 1.
+!-----------------------------------------------------------------
+!--------------- special set of characters for RCS information
+!-----------------------------------------------------------------
+! $Source$ $Revision$
+!-----------------------------------------------------------------
+!     ##################
+      MODULE MODI_SHUMAN
+!     ##################
+!
+IMPLICIT NONE
+INTERFACE
+!
+FUNCTION DXF(PA)  RESULT(PDXF)
+IMPLICIT NONE
+REAL, DIMENSION(:,:,:), INTENT(IN)                :: PA     ! variable at flux
+                                                            !  side
+REAL, DIMENSION(SIZE(PA,1),SIZE(PA,2),SIZE(PA,3)) :: PDXF   ! result at mass
+                                                            ! localization 
+END FUNCTION DXF
+!
+FUNCTION DXM(PA)  RESULT(PDXM)
+IMPLICIT NONE
+REAL, DIMENSION(:,:,:), INTENT(IN)                :: PA     ! variable at mass
+                                                            ! localization
+REAL, DIMENSION(SIZE(PA,1),SIZE(PA,2),SIZE(PA,3)) :: PDXM   ! result at flux
+                                                            ! side
+END FUNCTION DXM
+!
+FUNCTION DYF(PA)  RESULT(PDYF)
+IMPLICIT NONE
+REAL, DIMENSION(:,:,:), INTENT(IN)                :: PA     ! variable at flux
+                                                            !  side
+REAL, DIMENSION(SIZE(PA,1),SIZE(PA,2),SIZE(PA,3)) :: PDYF   ! result at mass
+                                                            ! localization 
+END FUNCTION DYF
+!
+FUNCTION DYM(PA)  RESULT(PDYM)
+IMPLICIT NONE
+REAL, DIMENSION(:,:,:), INTENT(IN)                :: PA     ! variable at mass
+                                                            ! localization
+REAL, DIMENSION(SIZE(PA,1),SIZE(PA,2),SIZE(PA,3)) :: PDYM   ! result at flux
+                                                            ! side
+END FUNCTION DYM
+!
+FUNCTION DZF(PA, KKA, KKU, KL)  RESULT(PDZF)
+IMPLICIT NONE
+REAL, DIMENSION(:,:,:), INTENT(IN)                :: PA     ! variable at flux
+                                                            !  side
+REAL, DIMENSION(SIZE(PA,1),SIZE(PA,2),SIZE(PA,3)) :: PDZF   ! result at mass
+                                                            ! localization
+INTEGER, INTENT(IN),OPTIONAL         :: KKA, KKU ! near ground and uppest atmosphere array indexes (AROME)
+INTEGER, INTENT(IN),OPTIONAL         :: KL     ! +1 if grid goes from ground to atmosphere top, -1 otherwise (AROME)                                                            
+END FUNCTION DZF
+!
+FUNCTION DZM(PA, KKA, KKU, KL)  RESULT(PDZM)
+IMPLICIT NONE
+REAL, DIMENSION(:,:,:), INTENT(IN)                :: PA     ! variable at mass
+                                                            ! localization
+REAL, DIMENSION(SIZE(PA,1),SIZE(PA,2),SIZE(PA,3)) :: PDZM   ! result at flux
+                                                            ! side
+INTEGER, INTENT(IN),OPTIONAL         :: KKA, KKU ! near ground and uppest atmosphere array indexes (AROME)
+INTEGER, INTENT(IN),OPTIONAL         :: KL     ! +1 if grid goes from ground to atmosphere top, -1 otherwise (AROME)                                                            
+END FUNCTION DZM
+!
+FUNCTION MXF(PA)  RESULT(PMXF)
+IMPLICIT NONE
+REAL, DIMENSION(:,:,:), INTENT(IN)                :: PA     ! variable at flux
+                                                            !  side
+REAL, DIMENSION(SIZE(PA,1),SIZE(PA,2),SIZE(PA,3)) :: PMXF   ! result at mass
+                                                            ! localization 
+END FUNCTION MXF
+!
+FUNCTION MXM(PA)  RESULT(PMXM)
+IMPLICIT NONE
+REAL, DIMENSION(:,:,:), INTENT(IN)                :: PA     ! variable at mass localization
+REAL, DIMENSION(SIZE(PA,1),SIZE(PA,2),SIZE(PA,3)) :: PMXM   ! result at flux localization 
+END FUNCTION MXM
+
+FUNCTION MYF(PA)  RESULT(PMYF)
+IMPLICIT NONE
+REAL, DIMENSION(:,:,:), INTENT(IN)                :: PA     ! variable at flux
+                                                            !   side
+REAL, DIMENSION(SIZE(PA,1),SIZE(PA,2),SIZE(PA,3)) :: PMYF   ! result at mass 
+                                                            ! localization 
+END FUNCTION MYF
+!
+FUNCTION MYM(PA)  RESULT(PMYM)
+IMPLICIT NONE
+REAL, DIMENSION(:,:,:), INTENT(IN)                :: PA     ! variable at mass localization
+REAL, DIMENSION(SIZE(PA,1),SIZE(PA,2),SIZE(PA,3)) :: PMYM   ! result at flux localization 
+END  FUNCTION MYM
+!
+FUNCTION MZF(PA,KKA,KKU,KL)  RESULT(PMZF)
+IMPLICIT NONE
+REAL, DIMENSION(:,:,:), INTENT(IN)                :: PA     ! variable at flux
+                                                            !  side
+REAL, DIMENSION(SIZE(PA,1),SIZE(PA,2),SIZE(PA,3)) :: PMZF   ! result at mass
+                                                            ! localization
+INTEGER, INTENT(IN),OPTIONAL         :: KKA, KKU ! near ground and uppest atmosphere array indexes (AROME)
+INTEGER, INTENT(IN),OPTIONAL         :: KL     ! +1 if grid goes from ground to atmosphere top, -1 otherwise (AROME)                                                            
+END FUNCTION MZF
+!
+FUNCTION MZM(PA,KKA,KKU,KL)  RESULT(PMZM)
+IMPLICIT NONE
+REAL, DIMENSION(:,:,:), INTENT(IN)                :: PA     ! variable at mass localization
+REAL, DIMENSION(SIZE(PA,1),SIZE(PA,2),SIZE(PA,3)) :: PMZM   ! result at flux localization 
+INTEGER, INTENT(IN),OPTIONAL         :: KKA, KKU ! near ground and uppest atmosphere array indexes (AROME)
+INTEGER, INTENT(IN),OPTIONAL         :: KL     ! +1 if grid goes from ground to atmosphere top, -1 otherwise (AROME)
+END FUNCTION MZM
+!
+END INTERFACE
+!
+END MODULE MODI_SHUMAN
+!
+!
+!     ###############################
+      FUNCTION MXF(PA)  RESULT(PMXF)
+!     ###############################
+!
+!!****  *MXF* -  Shuman operator : mean operator in x direction for a 
+!!                                 variable at a flux side
+!!
+!!    PURPOSE
+!!    -------
+!       The purpose of this function  is to compute a mean 
+!     along the x direction (I index) for a field PA localized at a x-flux
+!     point (u point). The result is localized at a mass point.
+!
+!!**  METHOD
+!!    ------ 
+!!        The result PMXF(i,:,:) is defined by 0.5*(PA(i,:,:)+PA(i+1,:,:))
+!!        At i=size(PA,1), PMXF(i,:,:) are replaced by the values of PMXF,
+!!    which are the right values in the x-cyclic case
+!!    
+!!
+!!    EXTERNAL
+!!    --------
+!!      NONE
+!!
+!!    IMPLICIT ARGUMENTS
+!!    ------------------
+!!      Module MODD_PARAMETERS: declaration of parameter variables
+!!        JPHEXT: define the number of marginal points out of the 
+!!        physical domain along the horizontal directions.
+!!
+!!    REFERENCE
+!!    ---------
+!!      Book2 of documentation of Meso-NH (SHUMAN operators)
+!!      Technical specifications Report of The Meso-NH (chapters 3)  
+!!
+!!
+!!    AUTHOR
+!!    ------
+!!	V. Ducrocq       * Meteo France *
+!!
+!!    MODIFICATIONS
+!!    -------------
+!!      Original    04/07/94 
+!!      Modification to include the periodic case 13/10/94 J.Stein 
+!!                   optimisation                 20/08/00 J. Escobar
+!!      correction of in halo/pseudo-cyclic calculation for JPHEXT<> 1   
+!!      J.Escobar : 15/09/2015 : WENO5 & JPHEXT <> 1 
+!-------------------------------------------------------------------------------
+!
+!*       0.    DECLARATIONS
+!              ------------
+!
+USE MODD_PARAMETERS
+!
+IMPLICIT NONE
+!
+!*       0.1   Declarations of argument and result
+!              ------------------------------------
+!
+REAL, DIMENSION(:,:,:), INTENT(IN)                :: PA     ! variable at flux
+                                                            !  side
+REAL, DIMENSION(SIZE(PA,1),SIZE(PA,2),SIZE(PA,3)) :: PMXF   ! result at mass
+                                                            ! localization 
+!
+!*       0.2   Declarations of local variables
+!              -------------------------------
+!
+INTEGER :: JI             ! Loop index in x direction
+INTEGER :: IIU            ! upper bound in x direction of PA 
+!         
+INTEGER :: JJK,IJU,IKU
+INTEGER :: JIJK,JIJKOR,JIJKEND
+!          
+!
+!-------------------------------------------------------------------------------
+!
+!*       1.    DEFINITION OF MXF
+!              ------------------
+!
+IIU = SIZE(PA,1)
+IJU = SIZE(PA,2)
+IKU = SIZE(PA,3)
+!
+JIJKOR  = 1 + 1 
+JIJKEND = IIU*IJU*IKU
+!
+!CDIR NODEP
+!OCL NOVREC
+DO JIJK=JIJKOR , JIJKEND
+  PMXF(JIJK-1,1,1) = 0.5*( PA(JIJK-1,1,1)+PA(JIJK,1,1) )
+END DO
+!
+!CDIR NODEP
+!OCL NOVREC
+DO JI=1,JPHEXT
+   DO JJK=1,IJU*IKU
+      PMXF(IIU-JPHEXT+JI,JJK,1) = PMXF(JPHEXT+JI,JJK,1) ! for reprod JPHEXT <> 1
+   END DO
+END DO
+!
+!-------------------------------------------------------------------------------
+!
+END FUNCTION MXF
+!     ###############################
+      FUNCTION MXM(PA)  RESULT(PMXM)
+!     ###############################
+!
+!!****  *MXM* -  Shuman operator : mean operator in x direction for a 
+!!                                 mass variable 
+!!
+!!    PURPOSE
+!!    -------
+!       The purpose of this function  is to compute a mean 
+!     along the x direction (I index) for a field PA localized at a mass
+!     point. The result is localized at a x-flux point (u point).
+!
+!!**  METHOD
+!!    ------ 
+!!        The result PMXM(i,:,:) is defined by 0.5*(PA(i,:,:)+PA(i-1,:,:))
+!!    At i=1, PMXM(1,:,:) are replaced by the values of PMXM,
+!!    which are the right values in the x-cyclic case. 
+!!    
+!!
+!!    EXTERNAL
+!!    --------
+!!      NONE
+!!
+!!    IMPLICIT ARGUMENTS
+!!    ------------------
+!!      Module MODD_PARAMETERS: declaration of parameter variables
+!!        JPHEXT: define the number of marginal points out of the 
+!!        physical domain along the horizontal directions.
+!!
+!!    REFERENCE
+!!    ---------
+!!      Book2 of documentation of Meso-NH (SHUMAN operators)
+!!      Technical specifications Report of The Meso-NH (chapters 3)  
+!!
+!!
+!!    AUTHOR
+!!    ------
+!!	V. Ducrocq       * Meteo France *
+!!
+!!    MODIFICATIONS
+!!    -------------
+!!      Original    04/07/94
+!!      Modification to include the periodic case 13/10/94 J.Stein 
+!!                   optimisation                 20/08/00 J. Escobar
+!!      correction of in halo/pseudo-cyclic calculation for JPHEXT<> 1 
+!!      J.Escobar : 15/09/2015 : WENO5 & JPHEXT <> 1 
+!-------------------------------------------------------------------------------
+!
+!*       0.    DECLARATIONS
+!              ------------
+!
+USE MODD_PARAMETERS
+!
+IMPLICIT NONE
+!
+!*       0.1   Declarations of argument and result
+!              ------------------------------------
+!
+REAL, DIMENSION(:,:,:), INTENT(IN)                :: PA     ! variable at mass localization
+REAL, DIMENSION(SIZE(PA,1),SIZE(PA,2),SIZE(PA,3)) :: PMXM   ! result at flux localization 
+!
+!*       0.2   Declarations of local variables
+!              -------------------------------
+!
+INTEGER :: JI             ! Loop index in x direction
+INTEGER :: IIU            ! Size of the array in the x direction
+!          
+INTEGER :: JJK,IJU,IKU
+INTEGER :: JIJK,JIJKOR,JIJKEND
+!                     
+!
+!-------------------------------------------------------------------------------
+!
+!*       1.    DEFINITION OF MXM
+!              ------------------
+!
+IIU = SIZE(PA,1)
+IJU = SIZE(PA,2)
+IKU = SIZE(PA,3)
+!
+JIJKOR  = 1 + 1 
+JIJKEND = IIU*IJU*IKU
+!
+!CDIR NODEP
+!OCL NOVREC
+DO JIJK=JIJKOR , JIJKEND
+   PMXM(JIJK,1,1) = 0.5*( PA(JIJK,1,1)+PA(JIJK-1,1,1) )
+END DO
+!
+!CDIR NODEP
+!OCL NOVREC
+DO JI=1,JPHEXT
+   DO JJK=1,IJU*IKU
+      PMXM(JI,JJK,1) = PMXM(IIU-2*JPHEXT+JI,JJK,1) ! for reprod JPHEXT <> 1
+   END DO
+END DO
+!
+!-------------------------------------------------------------------------------
+!
+END FUNCTION MXM
+!     ###############################
+      FUNCTION MYF(PA)  RESULT(PMYF)
+!     ###############################
+!
+!!****  *MYF* -  Shuman operator : mean operator in y direction for a 
+!!                                 variable at a flux side
+!!
+!!    PURPOSE
+!!    -------
+!       The purpose of this function  is to compute a mean 
+!     along the y direction (J index) for a field PA localized at a y-flux
+!     point (v point). The result is localized at a mass point.
+!
+!!**  METHOD
+!!    ------ 
+!!        The result PMYF(i,:,:) is defined by 0.5*(PA(:,j,:)+PA(:,j+1,:))
+!!        At j=size(PA,2), PMYF(:,j,:) are replaced by the values of PMYF,
+!!    which are the right values in the y-cyclic case
+!!    
+!!
+!!    EXTERNAL
+!!    --------
+!!      NONE
+!!
+!!    IMPLICIT ARGUMENTS
+!!    ------------------
+!!      Module MODD_PARAMETERS: declaration of parameter variables
+!!        JPHEXT: define the number of marginal points out of the 
+!!        physical domain along the horizontal directions.
+!!
+!!    REFERENCE
+!!    ---------
+!!      Book2 of documentation of Meso-NH (SHUMAN operators)
+!!      Technical specifications Report of The Meso-NH (chapters 3)  
+!!
+!!
+!!    AUTHOR
+!!    ------
+!!	V. Ducrocq       * Meteo France *
+!!
+!!    MODIFICATIONS
+!!    -------------
+!!      Original    04/07/94 
+!!      Modification to include the periodic case 13/10/94 J.Stein 
+!!                   optimisation                 20/08/00 J. Escobar
+!!      correction of in halo/pseudo-cyclic calculation for JPHEXT<> 1   
+!!      J.Escobar : 15/09/2015 : WENO5 & JPHEXT <> 1  
+!-------------------------------------------------------------------------------
+!
+!*       0.    DECLARATIONS
+!              ------------
+!
+USE MODD_PARAMETERS
+!
+IMPLICIT NONE
+!
+!*       0.1   Declarations of argument and result
+!              ------------------------------------
+!
+REAL, DIMENSION(:,:,:), INTENT(IN)                :: PA     ! variable at flux
+                                                            !   side
+REAL, DIMENSION(SIZE(PA,1),SIZE(PA,2),SIZE(PA,3)) :: PMYF   ! result at mass 
+                                                            ! localization 
+!
+!*       0.2   Declarations of local variables
+!              -------------------------------
+!
+INTEGER :: JJ             ! Loop index in y direction
+INTEGER :: IJU            ! upper bound in y direction of PA 
+!           
+INTEGER :: IIU,IKU
+INTEGER :: JIJK,JIJKOR,JIJKEND
+!                
+!
+!-------------------------------------------------------------------------------
+!
+!*       1.    DEFINITION OF MYF
+!              ------------------
+!
+IIU = SIZE(PA,1)
+IJU = SIZE(PA,2)
+IKU = SIZE(PA,3)
+!
+JIJKOR  = 1 + IIU
+JIJKEND = IIU*IJU*IKU
+!
+!CDIR NODEP
+!OCL NOVREC
+DO JIJK=JIJKOR , JIJKEND
+   PMYF(JIJK-IIU,1,1) = 0.5*( PA(JIJK-IIU,1,1)+PA(JIJK,1,1) )
+END DO
+!
+DO JJ=1,JPHEXT
+   PMYF(:,IJU-JPHEXT+JJ,:) = PMYF(:,JPHEXT+JJ,:) ! for reprod JPHEXT <> 1
+END DO
+!
+!
+!-------------------------------------------------------------------------------
+!
+END FUNCTION MYF
+!     ###############################
+      FUNCTION MYM(PA)  RESULT(PMYM)
+!     ###############################
+!
+!!****  *MYM* -  Shuman operator : mean operator in y direction for a 
+!!                                 mass variable 
+!!
+!!    PURPOSE
+!!    -------
+!       The purpose of this function  is to compute a mean 
+!     along the y direction (J index) for a field PA localized at a mass
+!     point. The result is localized at a y-flux point (v point).
+!
+!!**  METHOD
+!!    ------ 
+!!        The result PMYM(:,j,:) is defined by 0.5*(PA(:,j,:)+PA(:,j-1,:))
+!!    At j=1, PMYM(:,j,:) are replaced by the values of PMYM,
+!!    which are the right values in the y-cyclic case. 
+!!    
+!!
+!!    EXTERNAL
+!!    --------
+!!      NONE
+!!
+!!    IMPLICIT ARGUMENTS
+!!    ------------------
+!!      Module MODD_PARAMETERS: declaration of parameter variables
+!!        JPHEXT: define the number of marginal points out of the 
+!!        physical domain along the horizontal directions.
+!!
+!!    REFERENCE
+!!    ---------
+!!      Book2 of documentation of Meso-NH (SHUMAN operators)
+!!      Technical specifications Report of The Meso-NH (chapters 3)  
+!!
+!!
+!!    AUTHOR
+!!    ------
+!!	V. Ducrocq       * Meteo France *
+!!
+!!    MODIFICATIONS
+!!    -------------
+!!      Original    04/07/94 
+!!      Modification to include the periodic case 13/10/94 J.Stein 
+!!                   optimisation                 20/08/00 J. Escobar
+!!      correction of in halo/pseudo-cyclic calculation for JPHEXT<> 1    
+!!      J.Escobar : 15/09/2015 : WENO5 & JPHEXT <> 1 
+!-------------------------------------------------------------------------------
+!
+!*       0.    DECLARATIONS
+!              ------------
+!
+USE MODD_PARAMETERS
+!
+IMPLICIT NONE
+!
+!*       0.1   Declarations of argument and result
+!              ------------------------------------
+!
+REAL, DIMENSION(:,:,:), INTENT(IN)                :: PA     ! variable at mass localization
+REAL, DIMENSION(SIZE(PA,1),SIZE(PA,2),SIZE(PA,3)) :: PMYM   ! result at flux localization 
+!
+!*       0.2   Declarations of local variables
+!              -------------------------------
+!
+INTEGER :: JJ             ! Loop index in y direction
+INTEGER :: IJU            ! Size of the array in the y direction
+!
+!          
+INTEGER :: IIU,IKU
+INTEGER :: JIJK,JIJKOR,JIJKEND
+!            
+!-------------------------------------------------------------------------------
+!
+!*       1.    DEFINITION OF MYM
+!              ------------------
+!
+IIU=SIZE(PA,1)
+IJU=SIZE(PA,2)
+IKU=SIZE(PA,3)
+!
+JIJKOR  = 1 + IIU
+JIJKEND = IIU*IJU*IKU
+!CDIR NODEP
+!OCL NOVREC
+DO JIJK=JIJKOR , JIJKEND
+   PMYM(JIJK,1,1) = 0.5*( PA(JIJK,1,1)+PA(JIJK-IIU,1,1) )
+END DO
+!
+DO JJ=1,JPHEXT
+   PMYM(:,JJ,:)  = PMYM(:,IJU-2*JPHEXT+JJ,:) ! for reprod JPHEXT <> 1
+END DO
+!
+!-------------------------------------------------------------------------------
+!
+END FUNCTION MYM
+!     ###############################
+      FUNCTION MZF(PA,KKA,KKU,KL)  RESULT(PMZF)
+!     ###############################
+!
+!!****  *MZF* -  Shuman operator : mean operator in z direction for a 
+!!                                 variable at a flux side
+!!
+!!    PURPOSE
+!!    -------
+!       The purpose of this function  is to compute a mean 
+!     along the z direction (K index) for a field PA localized at a z-flux
+!     point (w point). The result is localized at a mass point.
+!
+!!**  METHOD
+!!    ------ 
+!!        The result PMZF(:,:,k) is defined by 0.5*(PA(:,:,k)+PA(:,:,k+1))
+!!        At k=size(PA,3), PMZF(:,:,k) is defined by -999.
+!!    
+!!
+!!    EXTERNAL
+!!    --------
+!!      NONE
+!!
+!!    IMPLICIT ARGUMENTS
+!!    ------------------
+!!      NONE
+!!
+!!    REFERENCE
+!!    ---------
+!!      Book2 of documentation of Meso-NH (SHUMAN operators)
+!!      Technical specifications Report of The Meso-NH (chapters 3)  
+!!
+!!
+!!    AUTHOR
+!!    ------
+!!	V. Ducrocq       * Meteo France *
+!!
+!!    MODIFICATIONS
+!!    -------------
+!!      Original    04/07/94 
+!!                   optimisation                 20/08/00 J. Escobar
+!-------------------------------------------------------------------------------
+!
+!*       0.    DECLARATIONS
+!              ------------
+!
+IMPLICIT NONE
+!
+!*       0.1   Declarations of argument and result
+!              ------------------------------------
+!
+REAL, DIMENSION(:,:,:), INTENT(IN)                :: PA     ! variable at flux
+                                                            !  side
+REAL, DIMENSION(SIZE(PA,1),SIZE(PA,2),SIZE(PA,3)) :: PMZF   ! result at mass
+                                                            ! localization 
+INTEGER,              INTENT(IN),OPTIONAL         :: KKA, KKU ! near ground and uppest atmosphere array indexes (for AROME only)
+INTEGER,              INTENT(IN),OPTIONAL         :: KL     ! +1 if grid goes from ground to atmosphere top, -1 otherwise (for AROME only)
+!
+!*       0.2   Declarations of local variables
+!              -------------------------------
+!
+INTEGER :: JK             ! Loop index in z direction
+INTEGER :: IKU          ! upper bound in z direction of PA 
+!     
+INTEGER :: IIU,IJU
+INTEGER :: JIJ
+INTEGER :: JIJK,JIJKOR,JIJKEND
+!            
+!
+!-------------------------------------------------------------------------------
+!
+!*       1.    DEFINITION OF MZF
+!              ------------------
+!
+IIU = SIZE(PA,1)
+IJU = SIZE(PA,2)
+IKU = SIZE(PA,3)
+!
+JIJKOR  = 1 + IIU*IJU
+JIJKEND = IIU*IJU*IKU
+!
+!CDIR NODEP
+!OCL NOVREC
+DO JIJK=JIJKOR , JIJKEND
+   PMZF(JIJK-IIU*IJU,1,1) = 0.5*( PA(JIJK-IIU*IJU,1,1)+PA(JIJK,1,1) )
+END DO
+!
+!CDIR NODEP
+!OCL NOVREC
+DO JIJ=1,IIU*IJU
+   PMZF(JIJ,1,IKU)    = PMZF(JIJ,1,IKU-1) !-999.
+END DO
+!
+!-------------------------------------------------------------------------------
+!
+END FUNCTION MZF
+!     ###############################
+      FUNCTION MZM(PA,KKA,KKU,KL)  RESULT(PMZM)
+!     ###############################
+!
+!!****  *MZM* -  Shuman operator : mean operator in z direction for a 
+!!                                 mass variable 
+!!
+!!    PURPOSE
+!!    -------
+!       The purpose of this function  is to compute a mean
+!     along the z direction (K index) for a field PA localized at a mass
+!     point. The result is localized at a z-flux point (w point).
+!
+!!**  METHOD
+!!    ------ 
+!!        The result PMZM(:,:,k) is defined by 0.5*(PA(:,:,k)+PA(:,:,k-1))
+!!        At k=1, PMZM(:,:,1) is defined by -999.
+!!    
+!!
+!!    EXTERNAL
+!!    --------
+!!      NONE
+!!
+!!    IMPLICIT ARGUMENTS
+!!    ------------------
+!!      NONE
+!!
+!!    REFERENCE
+!!    ---------
+!!      Book2 of documentation of Meso-NH (SHUMAN operators)
+!!      Technical specifications Report of The Meso-NH (chapters 3)  
+!!
+!!
+!!    AUTHOR
+!!    ------
+!!	V. Ducrocq       * Meteo France *
+!!
+!!    MODIFICATIONS
+!!    -------------
+!!      Original    04/07/94 
+!!                   optimisation                 20/08/00 J. Escobar
+!-------------------------------------------------------------------------------
+!
+!*       0.    DECLARATIONS
+!              ------------
+!
+IMPLICIT NONE
+!
+!*       0.1   Declarations of argument and result
+!              ------------------------------------
+!
+REAL, DIMENSION(:,:,:), INTENT(IN)                :: PA     ! variable at mass localization
+REAL, DIMENSION(SIZE(PA,1),SIZE(PA,2),SIZE(PA,3)) :: PMZM   ! result at flux localization 
+INTEGER,              INTENT(IN),OPTIONAL         :: KKA, KKU ! near ground and uppest atmosphere array indexes (for AROME only)
+INTEGER,              INTENT(IN),OPTIONAL         :: KL     ! +1 if grid goes from ground to atmosphere top, -1 otherwise (for AROME only)
+!
+!*       0.2   Declarations of local variables
+!              -------------------------------
+!
+INTEGER :: JK             ! Loop index in z direction
+INTEGER :: IKU            ! upper bound in z direction of PA
+!           
+INTEGER :: IIU,IJU
+INTEGER :: JIJ,JI,JJ
+INTEGER :: JIJK,JIJKOR,JIJKEND
+!           
+!
+!-------------------------------------------------------------------------------
+!
+!*       1.    DEFINITION OF MZM
+!              ------------------
+!
+IIU = SIZE(PA,1)
+IJU = SIZE(PA,2)
+IKU = SIZE(PA,3)
+!
+JIJKOR  = 1 + IIU*IJU
+JIJKEND = IIU*IJU*IKU
+!
+!CDIR NODEP
+!OCL NOVREC
+DO JIJK=JIJKOR , JIJKEND
+   PMZM(JIJK,1,1) = 0.5*( PA(JIJK,1,1)+PA(JIJK-IIU*IJU,1,1) )
+END DO
+!
+!CDIR NODEP
+!OCL NOVREC
+DO JIJ=1,IIU*IJU
+   PMZM(JIJ,1,1)    = -999.
+END DO
+!
+!-------------------------------------------------------------------------------
+!
+END FUNCTION MZM
+!     ###############################
+      FUNCTION DXF(PA)  RESULT(PDXF)
+!     ###############################
+!
+!!****  *DXF* -  Shuman operator : finite difference operator in x direction
+!!                                  for a variable at a flux side
+!!
+!!    PURPOSE
+!!    -------
+!       The purpose of this function  is to compute a finite difference 
+!     along the x direction (I index) for a field PA localized at a x-flux
+!     point (u point). The result is localized at a mass point.
+!
+!!**  METHOD
+!!    ------ 
+!!        The result PDXF(i,:,:) is defined by (PA(i+1,:,:)-PA(i,:,:))
+!!        At i=size(PA,1), PDXF(i,:,:) are replaced by the values of PDXF,
+!!    which are the right values in the x-cyclic case
+!!    
+!!
+!!    EXTERNAL
+!!    --------
+!!      NONE
+!!
+!!    IMPLICIT ARGUMENTS
+!!    ------------------
+!!      Module MODD_PARAMETERS: declaration of parameter variables
+!!        JPHEXT: define the number of marginal points out of the 
+!!        physical domain along the horizontal directions.
+!!
+!!    REFERENCE
+!!    ---------
+!!      Book2 of documentation of Meso-NH (SHUMAN operators)
+!!      Technical specifications Report of The Meso-NH (chapters 3)  
+!!
+!!
+!!    AUTHOR
+!!    ------
+!!	V. Ducrocq       * Meteo France *
+!!
+!!    MODIFICATIONS
+!!    -------------
+!!      Original    05/07/94 
+!!      Modification to include the periodic case 13/10/94 J.Stein 
+!!                   optimisation                 20/08/00 J. Escobar
+!!      correction of in halo/pseudo-cyclic calculation for JPHEXT<> 1    
+!!      J.Escobar : 15/09/2015 : WENO5 & JPHEXT <> 1 
+!-------------------------------------------------------------------------------
+!
+!*       0.    DECLARATIONS
+!              ------------
+!
+USE MODD_PARAMETERS
+!
+IMPLICIT NONE
+!
+!*       0.1   Declarations of argument and result
+!              ------------------------------------
+!
+REAL, DIMENSION(:,:,:), INTENT(IN)                :: PA     ! variable at flux
+                                                            !  side
+REAL, DIMENSION(SIZE(PA,1),SIZE(PA,2),SIZE(PA,3)) :: PDXF   ! result at mass
+                                                            ! localization 
+!
+!*       0.2   Declarations of local variables
+!              -------------------------------
+!
+INTEGER :: JI             ! Loop index in x direction
+INTEGER :: IIU            ! upper bound in x direction of PA 
+!             
+INTEGER :: JJK,IJU,IKU
+INTEGER :: JIJK,JIJKOR,JIJKEND
+!             
+!
+!-------------------------------------------------------------------------------
+!
+!*       1.    DEFINITION OF DXF
+!              ------------------
+!
+IIU = SIZE(PA,1)
+IJU = SIZE(PA,2)
+IKU = SIZE(PA,3)
+!
+JIJKOR  = 1 + 1
+JIJKEND = IIU*IJU*IKU
+!
+!CDIR NODEP
+!OCL NOVREC
+DO JIJK=JIJKOR , JIJKEND
+   PDXF(JIJK-1,1,1) = PA(JIJK,1,1) - PA(JIJK-1,1,1) 
+END DO
+!
+!CDIR NODEP
+!OCL NOVREC
+DO JI=1,JPHEXT
+   DO JJK=1,IJU*IKU
+      PDXF(IIU-JPHEXT+JI,JJK,1) = PDXF(JPHEXT+JI,JJK,1) ! for reprod JPHEXT <> 1
+   END DO
+END DO
+!
+!-------------------------------------------------------------------------------
+!
+END FUNCTION DXF
+!     ###############################
+      FUNCTION DXM(PA)  RESULT(PDXM)
+!     ###############################
+!
+!!****  *DXM* -  Shuman operator : finite difference operator in x direction
+!!                                  for a variable at a mass localization
+!!
+!!    PURPOSE
+!!    -------
+!       The purpose of this function  is to compute a finite difference 
+!     along the x direction (I index) for a field PA localized at a mass
+!     point. The result is localized at a x-flux point (u point).
+!
+!!**  METHOD
+!!    ------ 
+!!        The result PDXM(i,:,:) is defined by (PA(i,:,:)-PA(i-1,:,:))
+!!    At i=1, PDXM(1,:,:) are replaced by the values of PDXM,
+!!    which are the right values in the x-cyclic case. 
+!!    
+!!
+!!    EXTERNAL
+!!    --------
+!!      NONE
+!!
+!!    IMPLICIT ARGUMENTS
+!!    ------------------
+!!      Module MODD_PARAMETERS: declaration of parameter variables
+!!        JPHEXT: define the number of marginal points out of the 
+!!        physical domain along the horizontal directions.
+!!
+!!    REFERENCE
+!!    ---------
+!!      Book2 of documentation of Meso-NH (SHUMAN operators)
+!!      Technical specifications Report of The Meso-NH (chapters 3)  
+!!
+!!
+!!    AUTHOR
+!!    ------
+!!	V. Ducrocq       * Meteo France *
+!!
+!!    MODIFICATIONS
+!!    -------------
+!!      Original    05/07/94 
+!!      Modification to include the periodic case 13/10/94 J.Stein 
+!!                   optimisation                 20/08/00 J. Escobar
+!-------------------------------------------------------------------------------
+!
+!*       0.    DECLARATIONS
+!              ------------
+!
+USE MODD_PARAMETERS
+!
+IMPLICIT NONE
+!
+!*       0.1   Declarations of argument and result
+!              ------------------------------------
+!
+REAL, DIMENSION(:,:,:), INTENT(IN)                :: PA     ! variable at mass
+                                                            ! localization
+REAL, DIMENSION(SIZE(PA,1),SIZE(PA,2),SIZE(PA,3)) :: PDXM   ! result at flux
+                                                            ! side
+!
+!*       0.2   Declarations of local variables
+!              -------------------------------
+!
+INTEGER :: JI             ! Loop index in x direction
+INTEGER :: IIU            ! Size of the array in the x direction
+!
+!          
+INTEGER :: JJK,IJU,IKU
+INTEGER :: JIJK,JIJKOR,JIJKEND
+!            
+!-------------------------------------------------------------------------------
+!
+!*       1.    DEFINITION OF DXM
+!              ------------------
+!
+IIU = SIZE(PA,1)
+IJU = SIZE(PA,2)
+IKU = SIZE(PA,3)
+!
+JIJKOR  = 1 + 1
+JIJKEND = IIU*IJU*IKU
+!
+!CDIR NODEP
+!OCL NOVREC
+DO JIJK=JIJKOR , JIJKEND
+   PDXM(JIJK,1,1) = PA(JIJK,1,1) - PA(JIJK-1,1,1) 
+END DO
+!
+!CDIR NODEP
+!OCL NOVREC
+DO JI=1,JPHEXT
+   DO JJK=1,IJU*IKU
+      PDXM(JI,JJK,1) = PDXM(IIU-2*JPHEXT+JI,JJK,1) ! for reprod JPHEXT <> 1
+   END DO
+END DO
+!
+!-------------------------------------------------------------------------------
+!
+END FUNCTION DXM
+!     ###############################
+      FUNCTION DYF(PA)  RESULT(PDYF)
+!     ###############################
+!
+!!****  *DYF* -  Shuman operator : finite difference operator in y direction
+!!                                  for a variable at a flux side
+!!
+!!    PURPOSE
+!!    -------
+!       The purpose of this function  is to compute a finite difference 
+!     along the y direction (J index) for a field PA localized at a y-flux
+!     point (v point). The result is localized at a mass point.
+!
+!!**  METHOD
+!!    ------ 
+!!        The result PDYF(:,j,:) is defined by (PA(:,j+1,:)-PA(:,j,:))
+!!        At j=size(PA,2), PDYF(:,j,:) are replaced by the values of PDYM,
+!!    which are the right values in the y-cyclic case
+!!    
+!!
+!!    EXTERNAL
+!!    --------
+!!      NONE
+!!
+!!    IMPLICIT ARGUMENTS
+!!    ------------------
+!!      Module MODD_PARAMETERS: declaration of parameter variables
+!!        JPHEXT: define the number of marginal points out of the 
+!!        physical domain along the horizontal directions.
+!!
+!!    REFERENCE
+!!    ---------
+!!      Book2 of documentation of Meso-NH (SHUMAN operators)
+!!      Technical specifications Report of The Meso-NH (chapters 3)  
+!!
+!!
+!!    AUTHOR
+!!    ------
+!!	V. Ducrocq       * Meteo France *
+!!
+!!    MODIFICATIONS
+!!    -------------
+!!      Original    05/07/94 
+!!      Modification to include the periodic case 13/10/94 J.Stein 
+!!                   optimisation                 20/08/00 J. Escobar
+!!      correction of in halo/pseudo-cyclic calculation for JPHEXT<> 1 
+!!      J.Escobar : 15/09/2015 : WENO5 & JPHEXT <> 1 
+!-------------------------------------------------------------------------------
+!
+!*       0.    DECLARATIONS
+!              ------------
+!
+USE MODD_PARAMETERS
+!
+IMPLICIT NONE
+!
+!*       0.1   Declarations of argument and result
+!              ------------------------------------
+!
+REAL, DIMENSION(:,:,:), INTENT(IN)                :: PA     ! variable at flux
+                                                            !  side
+REAL, DIMENSION(SIZE(PA,1),SIZE(PA,2),SIZE(PA,3)) :: PDYF   ! result at mass
+                                                            ! localization 
+!
+!*       0.2   Declarations of local variables
+!              -------------------------------
+!
+INTEGER :: JJ            ! Loop index in y direction
+INTEGER :: IJU           ! upper bound in y direction of PA 
+!
+!          
+INTEGER :: IIU,IKU
+INTEGER :: JIJK,JIJKOR,JIJKEND
+!            
+!-------------------------------------------------------------------------------
+!
+!*       1.    DEFINITION OF DYF
+!              ------------------
+!
+IIU = SIZE(PA,1)
+IJU = SIZE(PA,2)
+IKU = SIZE(PA,3)
+!
+JIJKOR  = 1 + IIU
+JIJKEND = IIU*IJU*IKU
+!
+!CDIR NODEP
+!OCL NOVREC
+DO JIJK=JIJKOR , JIJKEND
+   PDYF(JIJK-IIU,1,1)         = PA(JIJK,1,1)  -  PA(JIJK-IIU,1,1) 
+END DO
+!
+DO JJ=1,JPHEXT
+   PDYF(:,IJU-JPHEXT+JJ,:) = PDYF(:,JPHEXT+JJ,:) ! for reprod JPHEXT <> 1
+END DO
+!
+!-------------------------------------------------------------------------------
+!
+END FUNCTION DYF
+!     ###############################
+      FUNCTION DYM(PA)  RESULT(PDYM)
+!     ###############################
+!
+!!****  *DYM* -  Shuman operator : finite difference operator in y direction
+!!                                  for a variable at a mass localization
+!!
+!!    PURPOSE
+!!    -------
+!       The purpose of this function  is to compute a finite difference 
+!     along the y direction (J index) for a field PA localized at a mass
+!     point. The result is localized at a y-flux point (v point).
+!
+!!**  METHOD
+!!    ------ 
+!!        The result PDYM(:,j,:) is defined by (PA(:,j,:)-PA(:,j-1,:))
+!!    At j=1, PDYM(:,1,:) are replaced by the values of PDYM,
+!!    which are the right values in the y-cyclic case. 
+!!    
+!!
+!!    EXTERNAL
+!!    --------
+!!      NONE
+!!
+!!    IMPLICIT ARGUMENTS
+!!    ------------------
+!!      Module MODD_PARAMETERS: declaration of parameter variables
+!!        JPHEXT: define the number of marginal points out of the 
+!!        physical domain along the horizontal directions.
+!!
+!!    REFERENCE
+!!    ---------
+!!      Book2 of documentation of Meso-NH (SHUMAN operators)
+!!      Technical specifications Report of The Meso-NH (chapters 3)  
+!!
+!!
+!!    AUTHOR
+!!    ------
+!!	V. Ducrocq       * Meteo France *
+!!
+!!    MODIFICATIONS
+!!    -------------
+!!      Original    05/07/94 
+!!      Modification to include the periodic case 13/10/94 J.Stein 
+!!                   optimisation                 20/08/00 J. Escobar
+!!      correction of in halo/pseudo-cyclic calculation for JPHEXT<> 1 
+!!      J.Escobar : 15/09/2015 : WENO5 & JPHEXT <> 1 
+!-------------------------------------------------------------------------------
+!
+!*       0.    DECLARATIONS
+!              ------------
+!
+USE MODD_PARAMETERS
+!
+IMPLICIT NONE
+!
+!*       0.1   Declarations of argument and result
+!              ------------------------------------
+!
+REAL, DIMENSION(:,:,:), INTENT(IN)                :: PA     ! variable at mass
+                                                            ! localization
+REAL, DIMENSION(SIZE(PA,1),SIZE(PA,2),SIZE(PA,3)) :: PDYM   ! result at flux
+                                                            ! side
+!
+!*       0.2   Declarations of local variables
+!              -------------------------------
+!
+INTEGER :: JJ             ! Loop index in y direction
+INTEGER :: IJU            ! Size of the array in the y direction
+!
+!    
+INTEGER :: IIU,IKU
+INTEGER :: JIJK,JIJKOR,JIJKEND
+!     
+!-------------------------------------------------------------------------------
+!
+!*       1.    DEFINITION OF DYM
+!              ------------------
+!
+IIU=SIZE(PA,1)
+IJU=SIZE(PA,2)
+IKU=SIZE(PA,3)
+!
+JIJKOR  = 1 + IIU
+JIJKEND = IIU*IJU*IKU
+!
+!CDIR NODEP
+!OCL NOVREC
+DO JIJK=JIJKOR , JIJKEND
+   PDYM(JIJK,1,1)           = PA(JIJK,1,1)  -  PA(JIJK-IIU,1,1) 
+END DO
+!
+DO JJ=1,JPHEXT
+   PDYM(:,JJ,:) = PDYM(:,IJU-2*JPHEXT+JJ,:) ! for reprod JPHEXT <> 1
+END DO
+!
+!
+!-------------------------------------------------------------------------------
+!
+END FUNCTION DYM
+!     ###############################
+      FUNCTION DZF(PA, KKA, KKU, KL)  RESULT(PDZF)
+!     ###############################
+!
+!!****  *DZF* -  Shuman operator : finite difference operator in z direction
+!!                                  for a variable at a flux side
+!!
+!!    PURPOSE
+!!    -------
+!       The purpose of this function  is to compute a finite difference 
+!     along the z direction (K index) for a field PA localized at a z-flux
+!     point (w point). The result is localized at a mass point.
+!
+!!**  METHOD
+!!    ------ 
+!!        The result PDZF(:,:,k) is defined by (PA(:,:,k+1)-PA(:,:,k))
+!!        At k=size(PA,3), PDZF(:,:,k) is defined by -999.
+!!    
+!!
+!!    EXTERNAL
+!!    --------
+!!      NONE
+!!
+!!    IMPLICIT ARGUMENTS
+!!    ------------------
+!!      NONE
+!!
+!!    REFERENCE
+!!    ---------
+!!      Book2 of documentation of Meso-NH (SHUMAN operators)
+!!      Technical specifications Report of The Meso-NH (chapters 3)  
+!!
+!!
+!!    AUTHOR
+!!    ------
+!!	V. Ducrocq       * Meteo France *
+!!
+!!    MODIFICATIONS
+!!    -------------
+!!      Original    05/07/94 
+!!                   optimisation                 20/08/00 J. Escobar
+!-------------------------------------------------------------------------------
+!
+!*       0.    DECLARATIONS
+!              ------------
+!
+IMPLICIT NONE
+!
+!*       0.1   Declarations of argument and result
+!              ------------------------------------
+!
+REAL, DIMENSION(:,:,:), INTENT(IN)                :: PA     ! variable at flux
+                                                            !  side
+REAL, DIMENSION(SIZE(PA,1),SIZE(PA,2),SIZE(PA,3)) :: PDZF   ! result at mass
+                                                            ! localization 
+INTEGER, INTENT(IN),OPTIONAL         :: KKA, KKU ! near ground and uppest atmosphere array indexes (AROME)
+INTEGER, INTENT(IN),OPTIONAL         :: KL     ! +1 if grid goes from ground to atmosphere top, -1 otherwise (AROME)
+!
+!*       0.2   Declarations of local variables
+!              -------------------------------
+!
+INTEGER :: JK           ! Loop index in z direction
+INTEGER :: IKU          ! upper bound in z direction of PA 
+!
+!           
+INTEGER :: IIU,IJU
+INTEGER :: JIJ
+INTEGER :: JIJK,JIJKOR,JIJKEND
+!         
+!-------------------------------------------------------------------------------
+!
+!*       1.    DEFINITION OF DZF
+!              ------------------
+!
+IIU = SIZE(PA,1)
+IJU = SIZE(PA,2)
+IKU = SIZE(PA,3)
+!
+JIJKOR  = 1 + IIU*IJU
+JIJKEND = IIU*IJU*IKU
+!
+!CDIR NODEP
+!OCL NOVREC
+DO JIJK=JIJKOR , JIJKEND
+   PDZF(JIJK-IIU*IJU,1,1)     = PA(JIJK,1,1)-PA(JIJK-IIU*IJU,1,1)
+END DO
+!
+!CDIR NODEP
+!OCL NOVREC
+DO JIJ=1,IIU*IJU
+   PDZF(JIJ,1,IKU)    = -999.
+END DO
+!
+!-------------------------------------------------------------------------------
+!
+END FUNCTION DZF
+!     ###############################
+      FUNCTION DZM(PA, KKA, KKU, KL)  RESULT(PDZM)
+!     ###############################
+!
+!!****  *DZM* -  Shuman operator : finite difference operator in z direction
+!!                                  for a variable at a mass localization
+!!
+!!    PURPOSE
+!!    -------
+!       The purpose of this function  is to compute a finite difference 
+!     along the z direction (K index) for a field PA localized at a mass
+!     point. The result is localized at a z-flux point (w point).
+!
+!!**  METHOD
+!!    ------ 
+!!        The result PDZM(:,j,:) is defined by (PA(:,:,k)-PA(:,:,k-1))
+!!        At k=1, PDZM(:,:,k) is defined by -999.
+!!    
+!!
+!!    EXTERNAL
+!!    --------
+!!      NONE
+!!
+!!    IMPLICIT ARGUMENTS
+!!    ------------------
+!!      NONE
+!!
+!!    REFERENCE
+!!    ---------
+!!      Book2 of documentation of Meso-NH (SHUMAN operators)
+!!      Technical specifications Report of The Meso-NH (chapters 3)  
+!!
+!!
+!!    AUTHOR
+!!    ------
+!!	V. Ducrocq       * Meteo France *
+!!
+!!    MODIFICATIONS
+!!    -------------
+!!      Original    05/07/94 
+!!                   optimisation                 20/08/00 J. Escobar
+!-------------------------------------------------------------------------------
+!
+!*       0.    DECLARATIONS
+!              ------------
+!
+IMPLICIT NONE
+!
+!*       0.1   Declarations of argument and result
+!              ------------------------------------
+!
+REAL, DIMENSION(:,:,:), INTENT(IN)                :: PA     ! variable at mass
+                                                            ! localization
+REAL, DIMENSION(SIZE(PA,1),SIZE(PA,2),SIZE(PA,3)) :: PDZM   ! result at flux
+                                                            ! side
+INTEGER, INTENT(IN),OPTIONAL         :: KKA, KKU ! near ground and uppest atmosphere array indexes (AROME)
+INTEGER, INTENT(IN),OPTIONAL         :: KL     ! +1 if grid goes from ground to atmosphere top, -1 otherwise (AROME)
+!
+!*       0.2   Declarations of local variables
+!              -------------------------------
+!
+INTEGER :: JK            ! Loop index in z direction
+INTEGER :: IKU           ! upper bound in z direction of PA
+!
+!         
+INTEGER :: IIU,IJU
+INTEGER :: JIJ
+INTEGER :: JIJK,JIJKOR,JIJKEND
+!           
+!-------------------------------------------------------------------------------
+!
+!*       1.    DEFINITION OF DZM
+!              ------------------
+!
+IIU = SIZE(PA,1)
+IJU = SIZE(PA,2)
+IKU = SIZE(PA,3)
+!
+JIJKOR  = 1 + IIU*IJU
+JIJKEND = IIU*IJU*IKU
+!
+!CDIR NODEP
+!OCL NOVREC
+DO JIJK=JIJKOR , JIJKEND
+   PDZM(JIJK,1,1) = PA(JIJK,1,1)-PA(JIJK-IIU*IJU,1,1)
+END DO
+!
+!CDIR NODEP
+!OCL NOVREC
+DO JIJ=1,IIU*IJU
+   PDZM(JIJ,1,1)    = -999.
+END DO
+!
+!-------------------------------------------------------------------------------
+!
+END FUNCTION DZM
diff --git a/src/PHYEX/aux/shuman_phy.f90 b/src/PHYEX/aux/shuman_phy.f90
index e3e493afe37c2a8414312116367dfad2c3c0bbc1..69f793542be2f229603988822277fb711da29aed 100644
--- a/src/PHYEX/aux/shuman_phy.f90
+++ b/src/PHYEX/aux/shuman_phy.f90
@@ -552,7 +552,7 @@ IMPLICIT NONE
 TYPE(DIMPHYEX_t),       INTENT(IN)  :: D
 REAL, DIMENSION(D%NIT,D%NJT,D%NKT), INTENT(IN)                :: PA     ! variable at mass
                                                             ! localization
-REAL, DIMENSION(D%NIT,D%NJT,D%NKT) :: PDZM   ! result at flux
+REAL, DIMENSION(D%NIT,D%NJT,D%NKT), INTENT(OUT) :: PDZM   ! result at flux
                                                             ! side
 !
 !*       0.2   Declarations of local variables
diff --git a/src/PHYEX/conv/deep_convection.f90 b/src/PHYEX/conv/deep_convection.f90
index 2a6b30b5531b2dac28bbf5cee664245f10faf5ff..004cd7033fc8c973db46cbab925d0df1289afa0b 100644
--- a/src/PHYEX/conv/deep_convection.f90
+++ b/src/PHYEX/conv/deep_convection.f90
@@ -52,7 +52,7 @@ REAL, DIMENSION(KLON,KLEV), INTENT(IN) :: PWT      ! grid scale vertical
                                                    ! velocity (m/s)
 REAL, DIMENSION(KLON,KLEV), INTENT(IN) :: PPABST   ! grid scale pressure at t
 REAL, DIMENSION(KLON,KLEV), INTENT(IN) :: PZZ      ! height of model layer (m) 
-REAL, DIMENSION(KLON),      INTENT(IN) :: PDXDY    ! horizontal grid area (m-a2)
+REAL, DIMENSION(KLON),      INTENT(IN) :: PDXDY    ! horizontal grid area (m**2)
 REAL, DIMENSION(KLON),      INTENT(IN) :: PTIMEC   ! value of convective adjustment
                                                    ! time if OSETTADJ=.TRUE.
 !   
@@ -261,7 +261,7 @@ REAL, DIMENSION(KLON,KLEV), INTENT(IN) :: PWT      ! grid scale vertical
                                                    ! velocity (m/s)
 REAL, DIMENSION(KLON,KLEV), INTENT(IN) :: PPABST   ! grid scale pressure at t
 REAL, DIMENSION(KLON,KLEV), INTENT(IN) :: PZZ      ! height of model layer (m) 
-REAL, DIMENSION(KLON),      INTENT(IN) :: PDXDY    ! horizontal grid area (m-a2)
+REAL, DIMENSION(KLON),      INTENT(IN) :: PDXDY    ! horizontal grid area (**2)
 REAL, DIMENSION(KLON),      INTENT(IN) :: PTIMEC   ! value of convective adjustment
                                                    ! time if OSETTADJ=.TRUE.
 !   
@@ -667,7 +667,7 @@ ALLOCATE( ILCL(ICONV) )
 ALLOCATE( ICTL(ICONV) )
 ALLOCATE( IETL(ICONV) )
 !
-	 ! grid scale variables
+     ! grid scale variables
 !
 ALLOCATE( ZZ(ICONV,IKS) )     ;   ZZ  = 0.0
 ALLOCATE( ZPRES(ICONV,IKS) )  ;   ZPRES = 0.0
diff --git a/src/PHYEX/ext/advection_metsv.f90 b/src/PHYEX/ext/advection_metsv.f90
new file mode 100644
index 0000000000000000000000000000000000000000..8473c5a3b9f58609ef24a788a49f2153056a0380
--- /dev/null
+++ b/src/PHYEX/ext/advection_metsv.f90
@@ -0,0 +1,719 @@
+!MNH_LIC Copyright 1994-2023 CNRS, Meteo-France and Universite Paul Sabatier
+!MNH_LIC This is part of the Meso-NH software governed by the CeCILL-C licence
+!MNH_LIC version 1. See LICENSE, CeCILL-C_V1-en.txt and CeCILL-C_V1-fr.txt
+!MNH_LIC for details. version 1.
+!-----------------------------------------------------------------
+!     ###########################
+      MODULE MODI_ADVECTION_METSV
+!     ###########################
+!
+INTERFACE
+      SUBROUTINE ADVECTION_METSV (TPFILE, HUVW_ADV_SCHEME,                     &
+                            HMET_ADV_SCHEME,HSV_ADV_SCHEME, HCLOUD, KSPLIT,    &
+                            OSPLIT_CFL, PSPLIT_CFL, OCFL_WRIT,                 &
+                            HLBCX, HLBCY, KRR, KSV, TPDTCUR, PTSTEP,           &
+                            PUT, PVT, PWT, PTHT, PRT, PTKET, PSVT, PPABST,     &
+                            PTHVREF, PRHODJ, PDXX, PDYY, PDZZ, PDZX, PDZY,     &
+                            PRTHS, PRRS, PRTKES, PRSVS,                        &
+                            PRTHS_CLD, PRRS_CLD, PRSVS_CLD, PRTKES_ADV         )
+!
+USE MODD_IO,        ONLY: TFILEDATA
+USE MODD_TYPE_DATE, ONLY: DATE_TIME
+!
+TYPE(TFILEDATA),        INTENT(IN)   ::  TPFILE       ! Output file
+CHARACTER(LEN=6),       INTENT(IN)   :: HMET_ADV_SCHEME, & ! Control of the 
+                                        HSV_ADV_SCHEME, &  ! scheme applied 
+                                        HUVW_ADV_SCHEME
+CHARACTER (LEN=4),      INTENT(IN)   :: HCLOUD      ! Kind of cloud parameterization                                
+!
+INTEGER,                INTENT(INOUT):: KSPLIT       ! Number of time splitting
+                                                     ! for PPM advection
+LOGICAL,                INTENT(IN)   :: OSPLIT_CFL   ! flag to automatically chose number of iterations
+REAL,                   INTENT(IN)   :: PSPLIT_CFL   ! maximum CFL to automatically chose number of iterations
+LOGICAL,                INTENT(IN)   :: OCFL_WRIT    ! flag to write CFL fields in output files            
+!
+CHARACTER(LEN=4),DIMENSION(2),INTENT(IN):: HLBCX, HLBCY  ! X- and Y-direc LBC
+!
+INTEGER,                  INTENT(IN)    :: KRR  ! Number of moist variables
+INTEGER,                  INTENT(IN)    :: KSV  ! Number of Scalar Variables
+!
+TYPE (DATE_TIME),         INTENT(IN)    :: TPDTCUR ! current date and time
+REAL,                     INTENT(IN)    :: PTSTEP
+!
+REAL, DIMENSION(:,:,:),   INTENT(IN)    :: PUT , PVT  , PWT
+REAL, DIMENSION(:,:,:),   INTENT(IN)    :: PTHT, PTKET, PRHODJ
+REAL, DIMENSION(:,:,:),   INTENT(IN)    :: PPABST                 
+REAL, DIMENSION(:,:,:,:), INTENT(IN)    :: PRT , PSVT
+                                                  ! Variables at t
+REAL, DIMENSION(:,:,:),   INTENT(IN)    :: PTHVREF   ! Virtual Temperature
+                                          ! of the reference state
+REAL, DIMENSION(:,:,:),   INTENT(IN)    :: PDXX,PDYY,PDZZ
+REAL, DIMENSION(:,:,:),   INTENT(INOUT) :: PDZX,PDZY
+                                                  !  metric coefficients
+REAL, DIMENSION(:,:,:),   INTENT(INOUT) :: PRTHS, PRTKES
+REAL, DIMENSION(:,:,:,:), INTENT(INOUT) :: PRRS , PRSVS
+                                                  ! Sources terms 
+REAL, DIMENSION(:,:,:),   INTENT(IN)    :: PRTHS_CLD
+REAL, DIMENSION(:,:,:,:), INTENT(IN)    :: PRRS_CLD,PRSVS_CLD
+REAL, DIMENSION(:,:,:),   INTENT(OUT)   :: PRTKES_ADV  ! Advection TKE source term 
+!
+END SUBROUTINE ADVECTION_METSV
+!
+END INTERFACE
+!
+END MODULE MODI_ADVECTION_METSV
+!     ##########################################################################
+      SUBROUTINE ADVECTION_METSV (TPFILE, HUVW_ADV_SCHEME,                     &
+                            HMET_ADV_SCHEME,HSV_ADV_SCHEME, HCLOUD, KSPLIT,    &
+                            OSPLIT_CFL, PSPLIT_CFL, OCFL_WRIT,                 &
+                            HLBCX, HLBCY, KRR, KSV, TPDTCUR, PTSTEP,           &
+                            PUT, PVT, PWT, PTHT, PRT, PTKET, PSVT, PPABST,     &
+                            PTHVREF, PRHODJ, PDXX, PDYY, PDZZ, PDZX, PDZY,     &
+                            PRTHS, PRRS, PRTKES, PRSVS,                        &
+                            PRTHS_CLD, PRRS_CLD, PRSVS_CLD, PRTKES_ADV         )
+!     ##########################################################################
+!
+!!****  *ADVECTION_METSV * - routine to call the specialized advection routines
+!!
+!!    PURPOSE
+!!    -------
+!!      The purpose of this routine is to control the advection routines.
+!!    For that, it is first necessary to compute the metric coefficients
+!!    and the contravariant components of the momentum.
+!!
+!!**  METHOD
+!!    ------
+!!      Once the scheme is selected, it is applied to the following group of
+!!    variables: METeorologicals (temperature, water substances, TKE,
+!!    dissipation TKE) and Scalar Variables. It is possible to select different
+!!    advection schemes for each group of variables.
+!!
+!!    EXTERNAL
+!!    --------
+!!      CONTRAV              : computes the contravariant components.
+!!      ADVECUVW             : computes the advection terms for momentum.
+!!      ADVECSCALAR          : computes the advection terms for scalar fields.
+!!      ADD3DFIELD_ll        : add a field to 3D-list
+!!      ADVEC_4TH_ORDER      : 4th order advection scheme
+!!
+!!    IMPLICIT ARGUMENTS
+!!    ------------------
+!!      NONE
+!!
+!!    REFERENCE
+!!    ---------
+!!      Book1 and book2 ( routine ADVECTION )
+!!
+!!    AUTHOR
+!!    ------
+!!	J.-P. Pinty      * Laboratoire d'Aerologie*
+!!	J.-P. Lafore     * Meteo France *
+!!
+!!    MODIFICATIONS
+!!    -------------
+!!      Original    06/07/94 
+!!                  01/04/95 (Ph. Hereil J. Nicolau) add the model number
+!!                  23/10/95 (J. Vila and JP Lafore) advection schemes scalar
+!!                  16/01/97 (JP Pinty)              change presentation 
+!!                  30/04/98 (J. Stein P Jabouille)  extrapolation for the cyclic
+!!                                                   case and parallelisation
+!!                  24/06/99 (P Jabouille)           case of NHALO>1
+!!                  25/10/05 (JP Pinty)              4th order scheme
+!!                  24/04/06 (C.Lac)                 Split scalar and passive
+!!                                                   tracer routines
+!!                  08/06    (T.Maric)               PPM scheme
+!!                  04/2011  (V.Masson & C. Lac)     splits the routine and add time splitting
+!!                  04/2014  (C.Lac)                 adaptation of time
+!!                                                   splitting for L1D and L2D
+!!                  09/2014  (G.Delautier)              close OUTPUT_LISTING before STOP
+!!                  04/2015  (J.Escobar) remove/commente some NHALO=1 test
+!!                  J.Escobar : 15/09/2015 : WENO5 & JPHEXT <> 1 
+!!                  J.Escobar : 01/10/2015 : add computation of CFL for L1D case
+!!                  04/2016  (C.Lac)       : correction of negativity for KHKO
+!!                  10/2016  (C.Lac) Correction on the flag for Strang splitting
+!!                                  to insure reproducibility between START and RESTA
+!  V. Vionnet     07/2017: add advection of 2D variables at the surface for the blowing snow scheme
+!  P. Wautelet 05/2016-04/2018: new data structures and calls for I/O
+!  P. Wautelet    02/2020: use the new data structures and subroutines for budgets
+!  B. Vie         03/2020: LIMA negativity checks after turbulence, advection and microphysics budgets
+!  P. Wautelet 20/05/2019: add name argument to ADDnFIELD_ll + new ADD4DFIELD_ll subroutine
+!  P. Wautelet 11/06/2020: bugfix: correct PRSVS array indices
+!  P. Wautelet + Benoît Vié 06/2020: improve removal of negative scalar variables + adapt the corresponding budgets
+!  P. Wautelet 30/06/2020: move removal of negative scalar variables to Sources_neg_correct
+!-------------------------------------------------------------------------------
+!
+!*       0.    DECLARATIONS
+!              ------------
+!
+use modd_budget,     only: lbudget_th, lbudget_tke, lbudget_rv, lbudget_rc,                          &
+                           lbudget_rr, lbudget_ri,  lbudget_rs, lbudget_rg, lbudget_rh, lbudget_sv,  &
+                           NBUDGET_TH, NBUDGET_TKE, NBUDGET_RV, NBUDGET_RC,                          &
+                           NBUDGET_RR, NBUDGET_RI,  NBUDGET_RS, NBUDGET_RG, NBUDGET_RH, NBUDGET_SV1, &
+                           tbudgets
+USE MODD_CST
+USE MODD_TURB_n,         ONLY: XTKEMIN
+USE MODD_CONF,           ONLY: LNEUTRAL,NHALO,L1D, L2D
+use modd_field,          only: tfieldmetadata, TYPEREAL
+USE MODD_IBM_PARAM_n,    ONLY: LIBM,XIBM_LS,XIBM_EPSI
+USE MODD_IO,             ONLY: TFILEDATA
+USE MODD_LUNIT_n,        ONLY: TLUOUT
+USE MODD_NSV
+USE MODD_PARAM_LIMA
+USE MODD_PARAM_n
+USE MODD_TYPE_DATE,      ONLY: DATE_TIME
+USE MODD_BLOWSNOW
+USE MODD_BLOWSNOW_n
+USE MODD_PARAMETERS
+USE MODD_REF_n,          ONLY: XRHODJ,XRHODREF
+!
+use mode_budget,         only: Budget_store_init, Budget_store_end
+USE MODE_IO_FIELD_WRITE, only: IO_Field_write
+USE MODE_ll
+USE MODE_MSG
+use mode_sources_neg_correct, only: Sources_neg_correct
+!
+USE MODI_ADV_BOUNDARIES
+USE MODI_CONTRAV
+USE MODI_GET_HALO
+USE MODI_PPM_RHODJ
+USE MODI_PPM_MET
+USE MODI_PPM_SCALAR
+!
+!
+!-------------------------------------------------------------------------------
+!
+IMPLICIT NONE
+!
+!*       0.1   Declarations of dummy arguments :
+!
+TYPE(TFILEDATA),        INTENT(IN)   ::  TPFILE       ! Output file
+CHARACTER(LEN=6),       INTENT(IN)   :: HMET_ADV_SCHEME, & ! Control of the 
+                                        HSV_ADV_SCHEME, &  ! scheme applied 
+                                        HUVW_ADV_SCHEME
+CHARACTER (LEN=4),      INTENT(IN)   :: HCLOUD      ! Kind of cloud parameterization                                
+!
+INTEGER,                INTENT(INOUT):: KSPLIT       ! Number of time splitting
+                                                     ! for PPM advection
+LOGICAL,                INTENT(IN)   :: OSPLIT_CFL   ! flag to automatically chose number of iterations
+REAL,                   INTENT(IN)   :: PSPLIT_CFL   ! maximum CFL to automatically chose number of iterations
+LOGICAL,                INTENT(IN)   :: OCFL_WRIT    ! flag to write CFL fields in output files            
+!
+CHARACTER(LEN=4),DIMENSION(2),INTENT(IN):: HLBCX, HLBCY  ! X- and Y-direc LBC
+!
+INTEGER,                  INTENT(IN)    :: KRR  ! Number of moist variables
+INTEGER,                  INTENT(IN)    :: KSV  ! Number of Scalar Variables
+!
+TYPE (DATE_TIME),         INTENT(IN)    :: TPDTCUR ! current date and time
+REAL,                     INTENT(IN)    :: PTSTEP
+!
+REAL, DIMENSION(:,:,:),   INTENT(IN)    :: PUT , PVT  , PWT
+REAL, DIMENSION(:,:,:),   INTENT(IN)    :: PTHT, PTKET, PRHODJ
+REAL, DIMENSION(:,:,:),   INTENT(IN)    :: PPABST                 
+REAL, DIMENSION(:,:,:,:), INTENT(IN)    :: PRT , PSVT
+                                                  ! Variables at t
+REAL, DIMENSION(:,:,:),   INTENT(IN)    :: PTHVREF   ! Virtual Temperature
+                                          ! of the reference state
+REAL, DIMENSION(:,:,:),   INTENT(IN)    :: PDXX,PDYY,PDZZ
+REAL, DIMENSION(:,:,:),   INTENT(INOUT) :: PDZX,PDZY
+                                                  !  metric coefficients
+REAL, DIMENSION(:,:,:),   INTENT(INOUT) :: PRTHS, PRTKES
+REAL, DIMENSION(:,:,:,:), INTENT(INOUT) :: PRRS , PRSVS
+                                                  ! Sources terms 
+REAL, DIMENSION(:,:,:),   INTENT(IN)    :: PRTHS_CLD
+REAL, DIMENSION(:,:,:,:), INTENT(IN)    :: PRRS_CLD, PRSVS_CLD
+REAL, DIMENSION(:,:,:),   INTENT(OUT)   :: PRTKES_ADV  ! Advection TKE source term 
+!
+!
+!*       0.2   declarations of local variables
+!
+!
+REAL, DIMENSION(SIZE(PUT,1),SIZE(PUT,2),SIZE(PUT,3)) :: ZRUCPPM
+REAL, DIMENSION(SIZE(PUT,1),SIZE(PUT,2),SIZE(PUT,3)) :: ZRVCPPM
+REAL, DIMENSION(SIZE(PUT,1),SIZE(PUT,2),SIZE(PUT,3)) :: ZRWCPPM
+                                                  ! contravariant
+                                                  ! components
+                                                  ! of momentum
+REAL, DIMENSION(SIZE(PUT,1),SIZE(PUT,2),SIZE(PUT,3)) :: ZCFLU
+REAL, DIMENSION(SIZE(PUT,1),SIZE(PUT,2),SIZE(PUT,3)) :: ZCFLV
+REAL, DIMENSION(SIZE(PUT,1),SIZE(PUT,2),SIZE(PUT,3)) :: ZCFLW
+!                                                 ! CFL numbers on each direction
+REAL, DIMENSION(SIZE(PUT,1),SIZE(PUT,2),SIZE(PUT,3)) :: ZCFL
+!                                                 ! CFL number
+!
+REAL :: ZCFLU_MAX, ZCFLV_MAX, ZCFLW_MAX, ZCFL_MAX ! maximum CFL numbers
+!
+REAL, DIMENSION(SIZE(PTHT,1), SIZE(PTHT,2), SIZE(PTHT,3) ) :: ZTH
+REAL, DIMENSION(SIZE(PTKET,1),SIZE(PTKET,2),SIZE(PTKET,3)) :: ZTKE
+REAL, DIMENSION(SIZE(PTHT,1), SIZE(PTHT,2), SIZE(PTHT,3) ) :: ZRTHS_OTHER
+REAL, DIMENSION(SIZE(PTKET,1),SIZE(PTKET,2),SIZE(PTKET,3)) :: ZRTKES_OTHER
+REAL, DIMENSION(SIZE(PTHT,1), SIZE(PTHT,2), SIZE(PTHT,3) ) :: ZRTHS_PPM
+REAL, DIMENSION(SIZE(PTKET,1),SIZE(PTKET,2),SIZE(PTKET,3)) :: ZRTKES_PPM
+REAL, DIMENSION(SIZE(PRT,1), SIZE(PRT,2), SIZE(PRT,3), SIZE(PRT,4) ) :: ZR
+REAL, DIMENSION(SIZE(PSVT,1),SIZE(PSVT,2),SIZE(PSVT,3),SIZE(PSVT,4)) :: ZSV
+REAL, DIMENSION(SIZE(PSVT,1),SIZE(PSVT,2),SIZE(PSVT,3), NBLOWSNOW_2D) :: ZSNWC
+REAL, DIMENSION(SIZE(PSVT,1),SIZE(PSVT,2),SIZE(PSVT,3), NBLOWSNOW_2D) :: ZSNWC_INIT
+REAL, DIMENSION(SIZE(PSVT,1),SIZE(PSVT,2),SIZE(PSVT,3), NBLOWSNOW_2D) :: ZRSNWCS
+! Guess at the sub time step
+REAL, DIMENSION(SIZE(PRT,1), SIZE(PRT,2), SIZE(PRT,3), SIZE(PRT,4) ) :: ZRRS_OTHER
+REAL, DIMENSION(SIZE(PSVT,1),SIZE(PSVT,2),SIZE(PSVT,3),SIZE(PSVT,4)) :: ZRSVS_OTHER
+REAL, DIMENSION(SIZE(PSVT,1),SIZE(PSVT,2),SIZE(PSVT,3),NBLOWSNOW_2D) ::  ZRSNWCS_OTHER
+! Tendencies since the beginning of the time step
+REAL, DIMENSION(SIZE(PRT,1), SIZE(PRT,2), SIZE(PRT,3), SIZE(PRT,4) ) :: ZRRS_PPM
+REAL, DIMENSION(SIZE(PSVT,1),SIZE(PSVT,2),SIZE(PSVT,3),SIZE(PSVT,4)) :: ZRSVS_PPM
+REAL, DIMENSION(SIZE(PSVT,1),SIZE(PSVT,2),SIZE(PSVT,3),NBLOWSNOW_2D) :: ZRSNWCS_PPM
+! Guess at the end of the sub time step
+REAL, DIMENSION(SIZE(PUT,1),SIZE(PUT,2),SIZE(PUT,3)) :: ZRHOX1,ZRHOX2
+REAL, DIMENSION(SIZE(PUT,1),SIZE(PUT,2),SIZE(PUT,3)) :: ZRHOY1,ZRHOY2
+REAL, DIMENSION(SIZE(PUT,1),SIZE(PUT,2),SIZE(PUT,3)) :: ZRHOZ1,ZRHOZ2
+REAL, DIMENSION(SIZE(PUT,1),SIZE(PUT,2),SIZE(PUT,3)):: ZT,ZEXN,ZLV,ZLS,ZCPH,ZCOR
+! Temporary advected rhodj for PPM routines
+!
+INTEGER :: JS,JR,JSV,JSPL, JI, JJ  ! Loop index
+REAL    :: ZTSTEP_PPM ! Sub Time step 
+LOGICAL :: GTKE
+!
+INTEGER                     :: IINFO_ll    ! return code of parallel routine
+TYPE(LIST_ll), POINTER      :: TZFIELDS0_ll ! list of fields to exchange
+TYPE(LIST_ll), POINTER      :: TZFIELDS1_ll ! list of fields to exchange
+!
+!
+INTEGER              :: IRESP        ! Return code of FM routines
+INTEGER              :: ILUOUT       ! logical unit
+INTEGER              :: ISPLIT_PPM   ! temporal time splitting
+INTEGER              :: IIB, IIE, IJB, IJE,IKB,IKE
+TYPE(TFIELDMETADATA) :: TZFIELD
+!-------------------------------------------------------------------------------
+!
+!*       0.     INITIALIZATION                        
+!	        --------------
+
+GTKE=(SIZE(PTKET)/=0)
+
+if ( lbudget_th  ) call Budget_store_init( tbudgets(NBUDGET_TH ), 'ADV', prths (:, :, :)    )
+if ( lbudget_tke ) call Budget_store_init( tbudgets(NBUDGET_TKE), 'ADV', prtkes(:, :, :)    )
+if ( lbudget_rv  ) call Budget_store_init( tbudgets(NBUDGET_RV ), 'ADV', prrs  (:, :, :, 1) )
+if ( lbudget_rc  ) call Budget_store_init( tbudgets(NBUDGET_RC ), 'ADV', prrs  (:, :, :, 2) )
+if ( lbudget_rr  ) call Budget_store_init( tbudgets(NBUDGET_RR ), 'ADV', prrs  (:, :, :, 3) )
+if ( lbudget_ri  ) call Budget_store_init( tbudgets(NBUDGET_RI ), 'ADV', prrs  (:, :, :, 4) )
+if ( lbudget_rs  ) call Budget_store_init( tbudgets(NBUDGET_RS ), 'ADV', prrs  (:, :, :, 5) )
+if ( lbudget_rg  ) call Budget_store_init( tbudgets(NBUDGET_RG ), 'ADV', prrs  (:, :, :, 6) )
+if ( lbudget_rh  ) call Budget_store_init( tbudgets(NBUDGET_RH ), 'ADV', prrs  (:, :, :, 7) )
+if ( lbudget_sv) then
+  do jsv = 1, ksv
+    call Budget_store_init( tbudgets(NBUDGET_SV1 - 1 + jsv ), 'ADV', prsvs(:, :, :, jsv) )
+  end do
+end if
+
+ILUOUT = TLUOUT%NLU
+!
+CALL GET_INDICE_ll(IIB,IJB,IIE,IJE)
+IKB=1+JPVEXT
+IKE=SIZE(PSVT,3) - JPVEXT
+!
+IF(LBLOWSNOW) THEN    ! Put 2D Canopy blowing snow variables into a 3D array for advection
+  ZSNWC_INIT = 0.
+  ZRSNWCS = 0.
+
+  DO JSV=1,(NBLOWSNOW_2D)
+     ZSNWC_INIT(:,:,IKB,JSV) = XSNWCANO(:,:,JSV)
+     ZRSNWCS(:,:,IKB,JSV)    = XRSNWCANOS(:,:,JSV)
+  END DO
+ENDIF
+!
+!
+!-------------------------------------------------------------------------------
+!
+!*       2.     COMPUTES THE CONTRAVARIANT COMPONENTS (FOR PPM ONLY)
+!	        --------------------------------------
+!
+!*       2.1 computes contravariant components
+!
+IF (HUVW_ADV_SCHEME=='CEN2ND' ) THEN
+ CALL CONTRAV (HLBCX,HLBCY,PUT,PVT,PWT,PDXX,PDYY,PDZZ,PDZX,PDZY,ZRUCPPM,ZRVCPPM,ZRWCPPM,2)
+ELSE
+ CALL CONTRAV (HLBCX,HLBCY,PUT,PVT,PWT,PDXX,PDYY,PDZZ,PDZX,PDZY,ZRUCPPM,ZRVCPPM,ZRWCPPM,4)
+END IF
+!
+!
+!*       2.2 computes CFL numbers
+!
+
+IF (.NOT. L1D) THEN
+  ZCFLU = 0.0 ; ZCFLV = 0.0 ;  ZCFLW = 0.0
+  ZCFLU(IIB:IIE,IJB:IJE,:) = ABS(ZRUCPPM(IIB:IIE,IJB:IJE,:) * PTSTEP)
+  ZCFLV(IIB:IIE,IJB:IJE,:) = ABS(ZRVCPPM(IIB:IIE,IJB:IJE,:) * PTSTEP)
+  ZCFLW(IIB:IIE,IJB:IJE,:) = ABS(ZRWCPPM(IIB:IIE,IJB:IJE,:) * PTSTEP)
+   IF (LIBM) THEN
+    ZCFLU(IIB:IIE,IJB:IJE,:) = ZCFLU(IIB:IIE,IJB:IJE,:)*(1.-exp(-(XIBM_LS(IIB:IIE,IJB:IJE,:,2)/&
+                                                        (XRHODJ(IIB:IIE,IJB:IJE,:)/XRHODREF(IIB:IIE,IJB:IJE,:))**(1./3.))**2.))
+    ZCFLV(IIB:IIE,IJB:IJE,:) = ZCFLV(IIB:IIE,IJB:IJE,:)*(1.-exp(-(XIBM_LS(IIB:IIE,IJB:IJE,:,3)/&
+                                                        (XRHODJ(IIB:IIE,IJB:IJE,:)/XRHODREF(IIB:IIE,IJB:IJE,:))**(1./3.))**2.))
+    ZCFLW(IIB:IIE,IJB:IJE,:) = ZCFLW(IIB:IIE,IJB:IJE,:)*(1.-exp(-(XIBM_LS(IIB:IIE,IJB:IJE,:,4)/&
+                                                        (XRHODJ(IIB:IIE,IJB:IJE,:)/XRHODREF(IIB:IIE,IJB:IJE,:))**(1./3.))**2.))
+    WHERE (XIBM_LS(IIB:IIE,IJB:IJE,:,2).GT.(-XIBM_EPSI)) ZCFLU(IIB:IIE,IJB:IJE,:)=0.
+    WHERE (XIBM_LS(IIB:IIE,IJB:IJE,:,3).GT.(-XIBM_EPSI)) ZCFLV(IIB:IIE,IJB:IJE,:)=0.
+    WHERE (XIBM_LS(IIB:IIE,IJB:IJE,:,4).GT.(-XIBM_EPSI)) ZCFLW(IIB:IIE,IJB:IJE,:)=0.
+  ENDIF 
+  IF (.NOT. L2D) THEN
+    ZCFL  = SQRT(ZCFLU**2+ZCFLV**2+ZCFLW**2)
+  ELSE
+    ZCFL  = SQRT(ZCFLU**2+ZCFLW**2)
+  END IF
+ELSE
+   ZCFLU = 0.0 ; ZCFLV = 0.0 ;  ZCFLW = 0.0 
+   ZCFLW(IIB:IIE,IJB:IJE,:) = ABS(ZRWCPPM(IIB:IIE,IJB:IJE,:) * PTSTEP)
+   ZCFL = SQRT(ZCFLW**2)
+END IF
+!
+!* prints in the file the 3D Courant numbers (one should flag this)
+!
+IF ( tpfile%lopened .AND. OCFL_WRIT .AND. (.NOT. L1D) ) THEN
+    TZFIELD = TFIELDMETADATA(    &
+      CMNHNAME   = 'CFLU',       &
+      CSTDNAME   = '',           &
+      CLONGNAME  = 'CFLU',       &
+      CUNITS     = '1',          &
+      CDIR       = 'XY',         &
+      CCOMMENT   = 'X_Y_Z_CFLU', &
+      NGRID      = 1,            &
+      NTYPE      = TYPEREAL,     &
+      NDIMS      = 3,            &
+      LTIMEDEP   = .TRUE.        )
+    CALL IO_Field_write(TPFILE,TZFIELD,ZCFLU)
+!
+  IF (.NOT. L2D) THEN
+    TZFIELD = TFIELDMETADATA(    &
+      CMNHNAME   = 'CFLV',       &
+      CSTDNAME   = '',           &
+      CLONGNAME  = 'CFLV',       &
+      CUNITS     = '1',          &
+      CDIR       = 'XY',         &
+      CCOMMENT   = 'X_Y_Z_CFLV', &
+      NGRID      = 1,            &
+      NTYPE      = TYPEREAL,     &
+      NDIMS      = 3,            &
+      LTIMEDEP   = .TRUE.        )
+    CALL IO_Field_write(TPFILE,TZFIELD,ZCFLV)
+  END IF
+!
+    TZFIELD = TFIELDMETADATA(    &
+      CMNHNAME   = 'CFLW',       &
+      CSTDNAME   = '',           &
+      CLONGNAME  = 'CFLW',       &
+      CUNITS     = '1',          &
+      CDIR       = 'XY',         &
+      CCOMMENT   = 'X_Y_Z_CFLW', &
+      NGRID      = 1,            &
+      NTYPE      = TYPEREAL,     &
+      NDIMS      = 3,            &
+      LTIMEDEP   = .TRUE.        )
+    CALL IO_Field_write(TPFILE,TZFIELD,ZCFLW)
+!
+    TZFIELD = TFIELDMETADATA(   &
+      CMNHNAME   = 'CFL',       &
+      CSTDNAME   = '',          &
+      CLONGNAME  = 'CFL',       &
+      CUNITS     = '1',         &
+      CDIR       = 'XY',        &
+      CCOMMENT   = 'X_Y_Z_CFL', &
+      NGRID      = 1,           &
+      NTYPE      = TYPEREAL,    &
+      NDIMS      = 3,           &
+      LTIMEDEP   = .TRUE.       )
+    CALL IO_Field_write(TPFILE,TZFIELD,ZCFL)
+END IF
+!
+!* prints in the output file the maximum CFL
+!
+ZCFLU_MAX = MAX_ll(ZCFLU,IINFO_ll)
+ZCFLV_MAX = MAX_ll(ZCFLV,IINFO_ll)
+ZCFLW_MAX = MAX_ll(ZCFLW,IINFO_ll)
+ZCFL_MAX  = MAX_ll(ZCFL,IINFO_ll)
+!
+WRITE(ILUOUT,FMT='(A24,F10.2,A5,F10.2,A5,F10.2,A9,F10.2)') &
+                'Max. CFL number for U : ',ZCFLU_MAX,  &
+                '  V : ',ZCFLV_MAX,'  W : ', ZCFLW_MAX,&
+                'global : ',ZCFL_MAX
+!
+!
+!*       2.3 updates time step splitting loop
+!
+IF (OSPLIT_CFL .AND. (.NOT.L1D)  ) THEN
+!
+ ISPLIT_PPM = INT(ZCFL_MAX/PSPLIT_CFL)+1
+ IF ( KSPLIT /= ISPLIT_PPM )                                    &
+ WRITE(ILUOUT,FMT='(A37,I2,A4,I2,A11)')                         &
+                  'PPM  time spliting loop changed from ',      &
+                  KSPLIT,' to ',ISPLIT_PPM, ' iterations'
+!
+ KSPLIT =     ISPLIT_PPM                      
+!
+END IF
+! ---------------------------------------------------------------
+IF (( (ZCFLU_MAX>=3.) .AND. (.NOT.L1D) ) .OR. &
+    ( (ZCFLV_MAX>=3.) .AND. (.NOT.L1D) .AND. (.NOT.L2D) ) .OR. &
+    ( (ZCFLW_MAX>=8.) .AND. (.NOT.L1D) ) ) THEN
+  WRITE(ILUOUT,*) ' '
+  WRITE(ILUOUT,*) ' +---------------------------------------------------+'
+  WRITE(ILUOUT,*) ' |                   MODEL ERROR                     |'
+  WRITE(ILUOUT,*) ' +---------------------------------------------------+'
+  WRITE(ILUOUT,*) ' |                                                   |'
+  WRITE(ILUOUT,*) ' |       The model wind speed becomes too high       |'
+  WRITE(ILUOUT,*) ' |                                                   |'
+  IF ( ZCFLU_MAX>=3. .OR. ZCFLV_MAX>=3. ) &
+  WRITE(ILUOUT,*) ' |    The  horizontal CFL value reaches 3. or more   |'
+  IF ( ZCFLW_MAX>=8.                    ) &
+  WRITE(ILUOUT,*) ' |    The  vertical   CFL value reaches 8. or more   |'
+  WRITE(ILUOUT,*) ' |                                                   |'
+  WRITE(ILUOUT,*) ' |    This can be due either to :                    |'
+  WRITE(ILUOUT,*) ' |     - a numerical explosion of the model          |'
+  WRITE(ILUOUT,*) ' |     - or a too high wind speed for an             |'
+  WRITE(ILUOUT,*) ' |       acceptable accuracy of the advection        |'
+  WRITE(ILUOUT,*) ' |                                                   |'
+  WRITE(ILUOUT,*) ' |        Please decrease your time-step             |'
+  WRITE(ILUOUT,*) ' |                                                   |'
+  WRITE(ILUOUT,*) ' +---------------------------------------------------+'
+  WRITE(ILUOUT,*) ' '
+  WRITE(ILUOUT,*) ' +---------------------------------------------------+'
+  WRITE(ILUOUT,*) ' |                   MODEL STOPS                     |'
+  WRITE(ILUOUT,*) ' +---------------------------------------------------+'
+  CALL PRINT_MSG(NVERB_FATAL,'GEN','ADVECTION_METSV','')
+END IF
+!
+!
+ZTSTEP_PPM = PTSTEP / REAL(KSPLIT)
+!
+!
+!*      2.4 normalized contravariant components for split PPM time-step
+!
+ZRUCPPM = ZRUCPPM*ZTSTEP_PPM
+ZRVCPPM = ZRVCPPM*ZTSTEP_PPM
+ZRWCPPM = ZRWCPPM*ZTSTEP_PPM
+!
+!
+!-------------------------------------------------------------------------------
+!
+!
+!*       3.     COMPUTES THE TENDENCIES SINCE THE BEGINNING OF THE TIME STEP
+!	        ------------------------------------------------------------
+!
+!* This represent the effects of all OTHER processes
+!  Clouds    related processes from previous time-step are     taken into account in PRTHS_CLD
+!  Advection related processes from previous time-step will be taken into account in ZRTHS_PPM
+!
+ZRTHS_OTHER = PRTHS - PTHT * PRHODJ / PTSTEP
+IF (GTKE) ZRTKES_OTHER = PRTKES - PTKET * PRHODJ / PTSTEP                      
+DO JR = 1, KRR
+ ZRRS_OTHER(:,:,:,JR) = PRRS(:,:,:,JR) - PRT(:,:,:,JR) * PRHODJ(:,:,:) / PTSTEP
+END DO
+DO JSV = 1, KSV
+ ZRSVS_OTHER(:,:,:,JSV) = PRSVS(:,:,:,JSV) - PSVT(:,:,:,JSV) * PRHODJ / PTSTEP
+END DO
+IF(LBLOWSNOW) THEN
+   DO JSV = 1, (NBLOWSNOW_2D)        
+     ZRSNWCS_OTHER(:,:,:,JSV) = ZRSNWCS(:,:,:,JSV) - ZSNWC_INIT(:,:,:,JSV) * PRHODJ / PTSTEP
+   END DO   
+ENDIF
+!
+! Top and bottom Boundaries 
+!
+CALL ADV_BOUNDARIES (HLBCX, HLBCY, ZRTHS_OTHER)
+IF (GTKE) CALL ADV_BOUNDARIES (HLBCX, HLBCY, ZRTKES_OTHER)
+DO JR = 1, KRR
+  CALL ADV_BOUNDARIES (HLBCX, HLBCY, ZRRS_OTHER(:,:,:,JR))
+END DO
+DO JSV = 1, KSV
+  CALL ADV_BOUNDARIES (HLBCX, HLBCY, ZRSVS_OTHER(:,:,:,JSV))
+END DO
+IF(LBLOWSNOW) THEN
+  DO JSV = 1, (NBLOWSNOW_2D)        
+    CALL ADV_BOUNDARIES (HLBCX, HLBCY, ZRSNWCS_OTHER(:,:,:,JSV))
+  END DO 
+END IF
+!
+! Exchanges on processors
+!
+NULLIFY(TZFIELDS0_ll)
+!!$IF(NHALO == 1) THEN
+  CALL ADD3DFIELD_ll( TZFIELDS0_ll, ZRTHS_OTHER, 'ADVECTION_METSV::ZRTHS_OTHER' )
+  IF (GTKE) CALL ADD3DFIELD_ll( TZFIELDS0_ll, ZRTKES_OTHER, 'ADVECTION_METSV::ZRTKES_OTHER' )
+  IF ( KRR>0 )  CALL ADD4DFIELD_ll( TZFIELDS0_ll, ZRRS_OTHER(:,:,:,1:KRR),             'ADVECTION_METSV::ZRRS_OTHER'    )
+  IF ( KSV>0 )  CALL ADD4DFIELD_ll( TZFIELDS0_ll, ZRSVS_OTHER(:,:,:,1:KSV),            'ADVECTION_METSV::ZRSVS_OTHER'   )
+  IF(LBLOWSNOW) CALL ADD4DFIELD_ll( TZFIELDS0_ll, ZRSNWCS_OTHER(:,:,:,1:NBLOWSNOW_2D), 'ADVECTION_METSV::ZRSNWCS_OTHER' )
+  CALL UPDATE_HALO_ll(TZFIELDS0_ll,IINFO_ll)
+  CALL CLEANLIST_ll(TZFIELDS0_ll)
+!!$END IF
+!
+!
+
+!-------------------------------------------------------------------------------
+!
+!*       4.     CALLS THE PPM ADVECTION INSIDE A TIME SPLITTING         
+!	        --------------------------------------
+!
+CALL PPM_RHODJ(HLBCX,HLBCY, ZRUCPPM, ZRVCPPM, ZRWCPPM,              &
+               ZTSTEP_PPM, PRHODJ, ZRHOX1, ZRHOX2, ZRHOY1, ZRHOY2,  &
+               ZRHOZ1, ZRHOZ2                                       )
+!
+!* values of the fields at the beginning of the time splitting loop
+ZTH   = PTHT
+ZTKE   = PTKET
+IF (KRR /=0 ) ZR    = PRT
+IF (KSV /=0 ) ZSV   = PSVT
+IF(LBLOWSNOW) THEN
+    DO JSV = 1, (NBLOWSNOW_2D)
+        ZSNWC(:,:,:,JSV) = ZRSNWCS(:,:,:,JSV)* PTSTEP/ PRHODJ
+        CALL ADV_BOUNDARIES (HLBCX, HLBCY, ZSNWC(:,:,:,JSV))
+    END DO
+    ZSNWC_INIT=ZSNWC
+ENDIF
+!
+IF (GTKE)    PRTKES_ADV(:,:,:)  = 0.              
+!
+!* time splitting loop
+DO JSPL=1,KSPLIT
+!
+   !ZRTHS_PPM(:,:,:)   = 0.
+   !ZRTKES_PPM(:,:,:)   = 0.
+   !IF (KRR /=0) ZRRS_PPM(:,:,:,:)   = 0.
+   !IF (KSV /=0) ZRSVS_PPM(:,:,:,:)   = 0.
+!
+   IF (LNEUTRAL) ZTH=ZTH-PTHVREF  !* To be removed with the new PPM scheme ?
+   CALL PPM_MET (HLBCX,HLBCY, KRR, TPDTCUR,ZRUCPPM, ZRVCPPM, ZRWCPPM, PTSTEP,ZTSTEP_PPM, &
+              PRHODJ,  ZRHOX1, ZRHOX2, ZRHOY1, ZRHOY2,  ZRHOZ1, ZRHOZ2,                  &
+              ZTH, ZTKE, ZR, ZRTHS_PPM, ZRTKES_PPM, ZRRS_PPM, HMET_ADV_SCHEME)
+   IF (LNEUTRAL) ZTH=ZTH+PTHVREF  !* To be removed with the new PPM scheme ?
+!
+   CALL PPM_SCALAR (HLBCX,HLBCY, KSV, TPDTCUR, ZRUCPPM, ZRVCPPM, ZRWCPPM, PTSTEP,     &
+                 ZTSTEP_PPM, PRHODJ, ZRHOX1, ZRHOX2, ZRHOY1, ZRHOY2,  ZRHOZ1, ZRHOZ2, &
+                 ZSV, ZRSVS_PPM, HSV_ADV_SCHEME                                       )
+!
+! Tendencies of PPM
+!
+   PRTHS(:,:,:)                      = PRTHS     (:,:,:)   + ZRTHS_PPM (:,:,:)   / KSPLIT
+   IF (GTKE)     PRTKES_ADV(:,:,:)   = PRTKES_ADV(:,:,:)   + ZRTKES_PPM(:,:,:)   / KSPLIT
+   IF (KRR /=0)  PRRS      (:,:,:,:) = PRRS      (:,:,:,:) + ZRRS_PPM  (:,:,:,:) / KSPLIT
+   IF (KSV /=0 ) PRSVS     (:,:,:,:) = PRSVS     (:,:,:,:) + ZRSVS_PPM (:,:,:,:) / KSPLIT
+!
+   IF (JSPL<KSPLIT) THEN
+!
+!  Guesses of the field inside the time splitting loop
+!
+   ZTH = ZTH + ( ZRTHS_PPM(:,:,:) + ZRTHS_OTHER(:,:,:) + PRTHS_CLD(:,:,:)) * &
+           ZTSTEP_PPM / PRHODJ(:,:,:)
+   IF (GTKE) ZTKE = ZTKE + ( ZRTKES_PPM(:,:,:) + ZRTKES_OTHER(:,:,:) ) * ZTSTEP_PPM / PRHODJ(:,:,:)
+   DO JR = 1, KRR
+    ZR(:,:,:,JR) = ZR(:,:,:,JR) + ( ZRRS_PPM(:,:,:,JR) + ZRRS_OTHER(:,:,:,JR) + PRRS_CLD(:,:,:,JR) ) &
+                    * ZTSTEP_PPM / PRHODJ(:,:,:)
+   END DO
+   DO JSV = 1, KSV
+    ZSV(:,:,:,JSV) = ZSV(:,:,:,JSV) + ( ZRSVS_PPM(:,:,:,JSV) + ZRSVS_OTHER(:,:,:,JSV) +  &
+                     PRSVS_CLD(:,:,:,JSV) ) * ZTSTEP_PPM / PRHODJ(:,:,:)
+   END DO
+!
+! Top and bottom Boundaries and LBC for the guesses
+!
+   CALL ADV_BOUNDARIES (HLBCX, HLBCY, ZTH, PTHT )    
+    IF (GTKE) CALL ADV_BOUNDARIES (HLBCX, HLBCY, ZTKE, PTKET)
+   DO JR = 1, KRR
+     CALL ADV_BOUNDARIES (HLBCX, HLBCY, ZR(:,:,:,JR), PRT(:,:,:,JR))
+   END DO
+   DO JSV = 1, KSV
+     CALL ADV_BOUNDARIES (HLBCX, HLBCY, ZSV(:,:,:,JSV), PSVT(:,:,:,JSV))
+   END DO
+
+   IF(LBLOWSNOW) THEN ! Advection of Canopy mass at the 1st atmospheric level
+      ZRSNWCS_PPM(:,:,:,:) = 0.
+   !
+
+      CALL PPM_SCALAR (HLBCX,HLBCY, NBLOWSNOW_2D, TPDTCUR, ZRUCPPM, ZRVCPPM, ZRWCPPM,PTSTEP,    &
+                 ZTSTEP_PPM, PRHODJ, ZRHOX1, ZRHOX2, ZRHOY1, ZRHOY2,  ZRHOZ1, ZRHOZ2,          &
+                 ZSNWC, ZRSNWCS_PPM, HSV_ADV_SCHEME)
+
+
+! Tendencies of PPM
+      ZRSNWCS(:,:,:,:)        =    ZRSNWCS(:,:,:,:)  + ZRSNWCS_PPM (:,:,:,:)   / KSPLIT
+!  Guesses of the field inside the time splitting loop 
+      DO JSV = 1, ( NBLOWSNOW_2D)
+          ZSNWC(:,:,:,JSV) = ZSNWC(:,:,:,JSV) + ZRSNWCS_PPM(:,:,:,JSV)*ZTSTEP_PPM/ PRHODJ(:,:,:)  
+      END DO
+
+! Top and bottom Boundaries and LBC for the guesses      
+      DO JSV = 1, (NBLOWSNOW_2D)
+          CALL ADV_BOUNDARIES (HLBCX, HLBCY, ZSNWC(:,:,:,JSV), ZSNWC_INIT(:,:,:,JSV))
+      END DO
+   END IF   
+!
+!  Exchanges fields between processors
+!
+   NULLIFY(TZFIELDS1_ll)
+!!$   IF(NHALO == 1) THEN
+    CALL ADD3DFIELD_ll( TZFIELDS1_ll, ZTH, 'ZTH' )
+    IF (GTKE)        CALL ADD3DFIELD_ll( TZFIELDS1_ll, ZTKE,                        'ADVECTION_METSV::ZTKE' )
+    IF ( KRR>0 )     CALL ADD4DFIELD_ll( TZFIELDS1_ll, ZR (:,:,:,1:KRR),            'ADVECTION_METSV::ZR'    )
+    IF ( KSV>0 )     CALL ADD4DFIELD_ll( TZFIELDS1_ll, ZSV(:,:,:,1:KSV),            'ADVECTION_METSV::ZSV'   )
+    IF ( LBLOWSNOW ) CALL ADD4DFIELD_ll( TZFIELDS1_ll, ZSNWC(:,:,:,1:NBLOWSNOW_2D), 'ADVECTION_METSV::ZSNWC' )
+    CALL UPDATE_HALO_ll(TZFIELDS1_ll,IINFO_ll)
+    CALL CLEANLIST_ll(TZFIELDS1_ll)
+!!$   END IF
+   END IF
+!
+END DO
+!
+!-------------------------------------------------------------------------------
+!
+!  TKE special case: advection is the last process for TKE
+!
+! TKE must be greater than its minimum value
+! (previously done in tke_eps_sources)
+!
+IF (GTKE) THEN
+   PRTKES(:,:,:)  = PRTKES(:,:,:) + PRTKES_ADV(:,:,:)
+   PRTKES(:,:,:) = MAX (PRTKES(:,:,:) , XTKEMIN * PRHODJ(:,:,:) / PTSTEP )
+END IF
+!
+!
+!-------------------------------------------------------------------------------
+! Update tendency for cano variables : from 3D to 2D
+! 
+IF(LBLOWSNOW) THEN
+
+    DO JSV=1,(NBLOWSNOW_2D) 
+       DO JI=1,SIZE(PSVT,1)
+         DO JJ=1,SIZE(PSVT,2)
+             XRSNWCANOS(JI,JJ,JSV) = SUM(ZRSNWCS(JI,JJ,IKB:IKE,JSV))
+         END DO
+       END DO
+    END DO
+IF(LWEST_ll())  XRSNWCANOS(IIB,:,:)  = ZRSNWCS(IIB,:,IKB,:)
+IF(LEAST_ll())  XRSNWCANOS(IIE,:,:)  = ZRSNWCS(IIE,:,IKB,:)
+IF(LSOUTH_ll()) XRSNWCANOS(:,IJB,:)  = ZRSNWCS(:,IJB,IKB,:)
+IF(LNORTH_ll()) XRSNWCANOS(:,IJE,:)  = ZRSNWCS(:,IJE,IKB,:)
+
+END IF
+!-------------------------------------------------------------------------------
+!
+!*       5.     BUDGETS                                                 
+!	        -------
+!
+if ( lbudget_th  ) call Budget_store_end( tbudgets(NBUDGET_TH ), 'ADV', prths (:, :, :)    )
+if ( lbudget_tke ) call Budget_store_end( tbudgets(NBUDGET_TKE), 'ADV', prtkes(:, :, :)    )
+if ( lbudget_rv  ) call Budget_store_end( tbudgets(NBUDGET_RV ), 'ADV', prrs  (:, :, :, 1) )
+if ( lbudget_rc  ) call Budget_store_end( tbudgets(NBUDGET_RC ), 'ADV', prrs  (:, :, :, 2) )
+if ( lbudget_rr  ) call Budget_store_end( tbudgets(NBUDGET_RR ), 'ADV', prrs  (:, :, :, 3) )
+if ( lbudget_ri  ) call Budget_store_end( tbudgets(NBUDGET_RI ), 'ADV', prrs  (:, :, :, 4) )
+if ( lbudget_rs  ) call Budget_store_end( tbudgets(NBUDGET_RS ), 'ADV', prrs  (:, :, :, 5) )
+if ( lbudget_rg  ) call Budget_store_end( tbudgets(NBUDGET_RG ), 'ADV', prrs  (:, :, :, 6) )
+if ( lbudget_rh  ) call Budget_store_end( tbudgets(NBUDGET_RH ), 'ADV', prrs  (:, :, :, 7) )
+if ( lbudget_sv) then
+  do jsv = 1, ksv
+    call Budget_store_end( tbudgets(NBUDGET_SV1 - 1 + jsv ), 'ADV', prsvs(:, :, :, jsv) )
+  end do
+end if
+
+! Remove non-physical negative values (unnecessary in a perfect world) + corresponding budgets
+call Sources_neg_correct( hcloud, 'NEADV', krr, ptstep, ppabst, ptht, prt, prths, prrs, prsvs )
+
+!-------------------------------------------------------------------------------
+!
+END SUBROUTINE ADVECTION_METSV
diff --git a/src/PHYEX/ext/aer_effic.f90 b/src/PHYEX/ext/aer_effic.f90
new file mode 100644
index 0000000000000000000000000000000000000000..7b91959ce7cac78848bdefcdb50673cf811955ae
--- /dev/null
+++ b/src/PHYEX/ext/aer_effic.f90
@@ -0,0 +1,257 @@
+!ORILAM_LIC Copyright 1994-2018 CNRS, Meteo-France and Universite Paul Sabatier
+!ORILAM_LIC This is part of the ORILAM software governed by the CeCILL-C licence
+!ORILAM_LIC version 1. See LICENSE, CeCILL-C_V1-en.txt and CeCILL-C_V1-fr.txt
+!ORILAM_LIC for details.
+!     ######spl
+      MODULE MODI_AER_EFFIC
+!!    ########################
+!!
+!
+INTERFACE
+!!
+SUBROUTINE AER_EFFIC(PRG,PVGG,      & !aerosol radius/fall speed (m/s)
+                PRHODREF,           & !Air density     
+                PMUW, PMU,          & !mu water/air
+                PDPG, PEFC,         & !diffusivity, efficiency
+                PRRS,               & ! Rain water m.r. at time 
+                KMODE,              & ! Number of aerosol modes
+                PTEMP, PCOR,        & ! air temp, cunningham corr factor
+                PDENSITY_AER,       & ! aerosol density
+                PRR, PNT            ) ! radius and number of rain drops
+!
+IMPLICIT NONE
+REAL, DIMENSION(:,:), INTENT(IN) ::  PRG,  PVGG
+REAL, DIMENSION(:),   INTENT(IN) ::  PRHODREF
+REAL, DIMENSION(:,:), INTENT(IN) ::  PDPG
+REAL, DIMENSION(:),   INTENT(IN) ::  PMU, PMUW
+REAL, DIMENSION(:,:), INTENT(INOUT) :: PEFC
+REAL, DIMENSION(:),   INTENT(IN)    :: PRRS
+REAL, DIMENSION(:),   INTENT(IN)    :: PTEMP
+REAL, DIMENSION(:,:), INTENT(IN)    :: PCOR
+REAL, DIMENSION(:),   INTENT(IN)    :: PRR, PNT
+INTEGER, INTENT(IN)                 :: KMODE
+REAL, DIMENSION(:,:), INTENT(IN)    :: PDENSITY_AER
+
+
+END SUBROUTINE  AER_EFFIC 
+!!
+END INTERFACE
+END MODULE MODI_AER_EFFIC
+!     ######spl
+SUBROUTINE AER_EFFIC(PRG,PVGG,      & !aerosol radius/fall speed (m/s)
+                PRHODREF,           & !Air density     
+                PMUW, PMU,          & !mu water/air
+                PDPG, PEFC,         & !diffusivity, efficiency
+                PRRT,               & ! Rain water m.r. at time t 
+                KMODE,              & ! Number of aerosol modes
+                PTEMP, PCOR,        & ! air temp, cunningham corr factor
+                PDENSITY_AER,       & ! aerosol density
+                PRR, PNT            ) ! radius and number of rain drops
+!!   #######################################
+!!**********AER_EFFIC********** 
+!!   PURPOSE
+!!   -------
+!!  Calculate the collection efficiency of
+!   a falling drop interacting with a dust aerosol
+!   for use with aer_wet_dep_kmt_warm.f90
+!!
+!!**  METHOD
+!!    ------
+!!    Using basic theory, and the one dimensional variables sent 
+!!    from aer_wet_dep_kmt_warm.f90, calculation of the average 
+!!    fall speed calculations, chapter 17.3.4, MESONH Handbook
+!!    droplet number based on the Marshall_Palmer distribution
+!!    and Stokes number, Reynolds number, etc. based on theory
+!!    (S&P, p.1019)
+!!
+!!   REFERENCE
+!!   ---------
+!!   Seinfeld and Pandis p.1019
+!!   MESONH Handbook chapter 17.3.4
+!!
+!!   AUTHOR
+!!    ------
+!!   K. Crahan Kaku / P. Tulet (CNRM/GMEI)
+!!
+!!   MODIFICATIONS
+!!   -------------
+!!   T. Hoarau (LACy) 15/05/17   add LIMA
+!!   Philippe Wautelet 28/05/2018: corrected truncated integer division (1/12 -> 1./12.)
+!!   P. Tulet and C. Barthe (LAERO) 15/01/22   correction for lima 
+!!
+!-----------------------------------------------------------------
+!       
+!*      0. DECLARATIONS
+!          ------------
+!
+USE MODD_RAIN_ICE_PARAM_n,  ONLY : YFSEDR => XFSEDR, YEXSEDR => XEXSEDR
+!++cb++
+!++th++
+USE MODD_RAIN_ICE_DESCR_n,  ONLY : YCCR => XCCR, YLBR => XLBR, YLBEXR => XLBEXR, &
+                                 YCEXVT => XCEXVT
+USE MODD_PARAM_LIMA_WARM, ONLY : WCCR => XCCR, WLBR => XLBR, WLBEXR => XLBEXR, &
+                                 XFSEDRR, XFSEDRC 
+USE MODD_PARAM_LIMA,      ONLY : WCEXVT => XCEXVT, WFSEDR => XFSEDR, WFSEDC=>XFSEDC, &
+                                 XRTMIN
+!--cb--
+USE MODD_PARAM_n,        ONLY: CCLOUD
+!--th--
+USE MODD_CST,            ONLY : XPI, XRHOLW, XP00, XRD
+USE MODD_PARAMETERS ,    ONLY : JPVEXT
+USE MODD_REF,            ONLY : XTHVREFZ
+!
+IMPLICIT NONE
+!
+!*      0.1  declarations of arguments
+REAL, DIMENSION(:,:), INTENT(IN) ::  PRG,  PVGG
+REAL, DIMENSION(:),   INTENT(IN) ::  PRHODREF
+REAL, DIMENSION(:,:), INTENT(IN) ::  PDPG
+REAL, DIMENSION(:),   INTENT(IN) ::  PMU, PMUW
+REAL, DIMENSION(:,:), INTENT(INOUT) :: PEFC
+REAL, DIMENSION(:),   INTENT(IN)    :: PRRT
+REAL, DIMENSION(:),   INTENT(IN)    :: PTEMP
+REAL, DIMENSION(:),   INTENT(IN)    :: PRR, PNT
+REAL, DIMENSION(:,:), INTENT(IN)    :: PCOR
+INTEGER, INTENT(IN)                 :: KMODE
+REAL, DIMENSION(:,:), INTENT(IN)    :: PDENSITY_AER
+!
+!
+!*      0.2  declaration of local variables
+!
+INTEGER :: IKB                ! Coordinates of the first physical 
+                              ! points along z
+REAL :: ZRHO00                ! Surface reference air density
+!viscosity ratio, Reynolds number
+REAL, DIMENSION(SIZE(PRG,1)) :: ZOMG, ZREY
+!rain radius, m, and rain fall speed, m/s; aerosol radius (m),
+REAL, DIMENSION(SIZE(PRG,1)) :: ZRR, ZVR 
+!lambda, number concentration according to marshall palmer, 
+REAL, DIMENSION(SIZE(PRG,1)) :: ZNT, ZLBDA1
+!RHO_dref*r_r, Rain LWC
+REAL, DIMENSION(SIZE(PRG,1)) :: RLWC
+! schmidts number
+REAL, DIMENSION(SIZE(PRG,1),KMODE) ::  ZSCH
+!
+!Stokes number, ratio of diameters,aerosol radius
+REAL, DIMENSION(SIZE(PRG,1),KMODE) :: ZSTO, ZPHI, ZRG
+! S Star Term
+REAL, DIMENSION(SIZE(PRG,1)) :: ZSTA, ZDIFF, ZTAU
+!
+!Term 1, Term 2, Term 3, Term 4 such that
+! E = Term1 * Term 2 + Term 3 + Term 4
+REAL, DIMENSION(SIZE(PRG,1),KMODE) :: ZT1, ZT2
+REAL, DIMENSION(SIZE(PRG,1),KMODE) :: ZT3, ZT4      
+!
+INTEGER :: JI,JK
+!++th++
+REAL :: KLBEXR, KLBR, KCEXVT, KCCR, ZFSEDR, ZBR, ZDR, ZEXSEDR
+!--th--
+!
+!-----------------------------------------------------------------
+IKB = 1 + JPVEXT
+ZRHO00 = XP00 / (XRD * XTHVREFZ(IKB))                                        
+ZRG(:,:) = PRG(:,:) * 1.E-6 !change units to meters
+ZVR(:) = 0.
+
+SELECT CASE(CCLOUD)
+CASE('ICE3')
+  KLBEXR  = YLBEXR
+  KLBR    = YLBR
+  KCEXVT  = YCEXVT 
+  KCCR    = YCCR
+  ZFSEDR  = YFSEDR
+  ZEXSEDR = YEXSEDR
+
+!Fall Speed calculations
+!similar to rain_ice.f90, chapter 17.3.4, MESONH Handbook
+  ZVR(:) = ZFSEDR * PRRT(:)**(ZEXSEDR-1) *   &
+         PRHODREF(:)**(ZEXSEDR-KCEXVT) 
+
+CASE('LIMA')
+  KLBEXR  = WLBEXR
+  KLBR    = WLBR
+  KCEXVT  = WCEXVT     
+  KCCR    = WCCR
+  ZFSEDR  = XFSEDRR
+  ZBR = 3.0
+  ZDR = 0.8
+  ZEXSEDR = (ZBR + ZDR + 1.0) / (ZBR + 1.0)
+  WHERE (PRRT(:) > XRTMIN(3) .AND. PNT(:) > 0.)
+    ZLBDA1(:) = (KLBR * PNT(:) / PRRT(:))**KLBEXR
+    ZVR(:) = XFSEDRR * PRHODREF(:)**(1.-KCEXVT) * ZLBDA1(:)**(-ZDR)
+  END WHERE
+END SELECT
+
+
+!Fall speed cannot be faster than 7 m/s
+ZVR(:) = MIN(ZVR(:), 7.)   
+
+KCCR = 8.E6
+
+
+!Ref SEINFELD AND PANDIS p.1019
+! Viscosity Ratio      
+ZOMG(:) = PMUW(:) / PMU(:)
+!!Reynolds number
+ZREY(:) = PRR(:) * ZVR(:) * PRHODREF(:) / PMU(:)
+ZREY(:) =  MAX(ZREY(:), 1.E-2)
+!
+!S Star
+ZSTA(:) = (1.2 + 1./12. * LOG(1.+ZREY(:))) / (1. + LOG(1.+ZREY(:)))
+
+PEFC(:,:) = 0.0
+!
+DO JI = 1, KMODE
+!Scmidts number
+  ZSCH(:,JI) = PMU(:) / PRHODREF(:) / PDPG(:,JI)      
+!
+! Rain-Aerosol relative velocity 
+  ZDIFF(:) = MAX(ZVR(:)-PVGG(:,JI), 0.)
+!
+! Relaxation time 
+  ZTAU(:) = (ZRG(:,JI)*2.)**2. * PDENSITY_AER(:,JI) * PCOR(:,JI) / (18. * PMU(:))
+!
+! Stockes number
+  ZSTO(:,JI) = ZTAU(:) * ZDIFF(:) / PRR(:)
+!
+!Ratio of diameters  
+  ZPHI(:,JI) = ZRG(:,JI) / PRR(:)
+  ZPHI(:,JI) = MIN(ZPHI(:,JI), 1.)
+!
+!Term 1
+  ZT1(:,JI) = 4.0 / ZREY(:) / ZSCH(:,JI)
+!
+!Term 2
+  ZT2(:,JI) = 1.0 + 0.4  * ZREY(:)**(0.5) * ZSCH(:,JI)**(1./3.) + &
+                    0.16 * ZREY(:)**(0.5) * ZSCH(:,JI)**(0.5)   
+!     
+!Brownian diffusion          
+  ZT1(:,JI) = ZT1(:,JI) * ZT2(:,JI)
+!
+!Term 3 - interception
+  ZT3(:,JI) = 4. * ZPHI(:,JI) * (1. / ZOMG(:) + &
+             (1.0 + 2.0 * ZREY(:)**0.5) * ZPHI(:,JI))
+!
+  ZT4(:,JI) = 0.0     
+!      
+  WHERE(ZSTO(:,JI) .GT. ZSTA(:)) 
+!Term 4 - impaction
+    ZT4(:,JI) = ((ZSTO(:,JI) - ZSTA(:)) /                     &
+                 (ZSTO(:,JI) - ZSTA(:) + 2. / 3.))**(3./2.) * &
+                 (XRHOLW / PDENSITY_AER(:,JI))**(1./2.)
+              
+  END WHERE
+!
+!Collision Efficiancy 
+  PEFC(:,JI) = ZT1(:,JI) + ZT3(:,JI) + ZT4(:,JI)     
+!
+! Physical radius of a rain collector droplet up than 20 um
+  WHERE (PRR(:) .LE. 20.E-6)
+    PEFC(:,JI) = 0.
+  END WHERE
+ENDDO
+!
+PEFC(:,:) = MIN(PEFC(:,:), 1.0)
+PEFC(:,:) = MAX(PEFC(:,:), 0.0)
+
+END SUBROUTINE AER_EFFIC
diff --git a/src/PHYEX/ext/aer_effic3D.f90 b/src/PHYEX/ext/aer_effic3D.f90
new file mode 100644
index 0000000000000000000000000000000000000000..568965581e10742596a7f9c730a8564659c955a6
--- /dev/null
+++ b/src/PHYEX/ext/aer_effic3D.f90
@@ -0,0 +1,225 @@
+!ORILAM_LIC Copyright 1994-2018 CNRS, Meteo-France and Universite Paul Sabatier
+!ORILAM_LIC This is part of the ORILAM software governed by the CeCILL-C licence
+!ORILAM_LIC version 1. See LICENSE, CeCILL-C_V1-en.txt and CeCILL-C_V1-fr.txt
+!ORILAM_LIC for details.
+!
+!     ######spll
+      MODULE MODI_AER_EFFIC3D
+!!    ########################
+!!
+!
+INTERFACE
+!!
+SUBROUTINE AER_EFFIC3D(PRG,PVGG,    & !aerosol radius/fall speed (m/s)
+                PRHODREF,           & !Air density     
+                PMUW, PMU,          & !mu water/air
+                PDPG,               & !diffusivity
+                PURR,               & ! Rain water m.r. at time t 
+                NMODE_DST,          & ! Number of aerosol modes
+                PTEMP, PCOR,        & ! air temp, cunningham corr factor
+                PDENSITY_AER,       & ! aerosol density
+                PEFFIC )              ! scavenging efficiency
+!
+IMPLICIT NONE
+REAL, DIMENSION(:,:,:,:), INTENT(IN) ::  PRG,  PVGG
+REAL, DIMENSION(:,:,:),   INTENT(IN) ::  PRHODREF
+REAL, DIMENSION(:,:,:,:), INTENT(IN) ::  PDPG
+REAL, DIMENSION(:,:,:),   INTENT(IN) ::  PMU, PMUW
+REAL, DIMENSION(:,:,:),   INTENT(IN) :: PURR
+REAL, DIMENSION(:,:,:),   INTENT(IN) :: PTEMP
+REAL, DIMENSION(:,:,:,:), INTENT(IN) :: PCOR
+INTEGER, INTENT(IN)                  :: NMODE_DST
+REAL, DIMENSION(:,:,:,:), INTENT(IN) :: PDENSITY_AER
+REAL, DIMENSION(:,:,:,:), INTENT(INOUT):: PEFFIC
+
+
+
+END SUBROUTINE  AER_EFFIC3D 
+!!
+END INTERFACE
+END MODULE MODI_AER_EFFIC3D
+!     ######spll
+SUBROUTINE AER_EFFIC3D(PRG,PVGG,    & !aerosol radius/fall speed (m/s)
+                PRHODREF,           & !Air density     
+                PMUW, PMU,          & !mu water/air
+                PDPG,               & !diffusivity
+                PURR,               & ! Rain water m.r. at time t 
+                NMODE_DST,          & ! Number of aerosol modes
+                PTEMP, PCOR,        & ! air temp, cunningham corr factor
+                PDENSITY_AER,       & ! aerosol density
+                PEFFIC )              ! scavenging efficiency
+!!   #######################################
+!!**********AER_EFFIC3D********** 
+!!   PURPOSE
+!!   -------
+!!  Calculate the collection efficiency of
+!   a falling drop interacting with a dust aerosol
+!   for use with aer_wet_dep_kmt_warm.f90
+!!
+!!**  METHOD
+!!    ------
+!!    Using basic theory, and the one dimensional variables sent 
+!!    from aer_wet_dep_kmt_warm.f90, calculation of the average 
+!!    fall speed calculations, chapter 17.3.4, MESONH Handbook
+!!    droplet number based on the Marshall_Palmer distribution
+!!    and Stokes number, Reynolds number, etc. based on theory
+!!    (S&P, p.1019)
+!!
+!!   REFERENCE
+!!   ---------
+!!   Seinfeld and Pandis p.1019
+!!   MESONH Handbook chapter 17.3.4
+!!
+!!   AUTHOR
+!!    ------
+!!   K. Crahan Kaku / P. Tulet (CNRM/GMEI)
+!!
+!!   MODIFICATIONS
+!!    -------------
+!!  Philippe Wautelet 28/05/2018: corrected truncated integer division (1/12 -> 1./12.)
+!!
+!-----------------------------------------------------------------
+!       
+!*      0. DECLARATIONS
+!          ------------
+!
+USE MODD_RAIN_ICE_PARAM_n
+USE MODD_RAIN_ICE_DESCR_n
+USE MODD_CST,         ONLY : XPI, XRHOLW, XP00, XRD
+USE MODD_PARAMETERS , ONLY : JPVEXT
+USE MODD_REF,         ONLY : XTHVREFZ
+!
+IMPLICIT NONE
+!
+!*      0.1  declarations of arguments
+!
+REAL, DIMENSION(:,:,:,:), INTENT(IN) ::  PRG,  PVGG
+REAL, DIMENSION(:,:,:),   INTENT(IN) ::  PRHODREF
+REAL, DIMENSION(:,:,:,:), INTENT(IN) ::  PDPG
+REAL, DIMENSION(:,:,:),   INTENT(IN) ::  PMU, PMUW
+REAL, DIMENSION(:,:,:),   INTENT(IN) :: PURR
+REAL, DIMENSION(:,:,:),   INTENT(IN) :: PTEMP
+REAL, DIMENSION(:,:,:,:), INTENT(IN) :: PCOR
+INTEGER, INTENT(IN)                  :: NMODE_DST
+REAL, DIMENSION(:,:,:,:), INTENT(IN) :: PDENSITY_AER
+REAL, DIMENSION(:,:,:,:), INTENT(INOUT):: PEFFIC
+!
+!*      0.2  declaration of local variables
+!
+INTEGER :: IKB                ! Coordinates of the first physical 
+                              ! points along z
+REAL :: ZRHO00                ! Surface reference air density
+!viscosity ratio, Reynolds number
+REAL, DIMENSION(SIZE(PRG,1),SIZE(PRG,2),SIZE(PRG,3)) :: ZOMG, ZREY
+!rain radius, m, and rain fall speed, m/s; aerosol radius (m),
+REAL, DIMENSION(SIZE(PRG,1),SIZE(PRG,2),SIZE(PRG,3)) :: ZRR, ZVR 
+!lambda, number concentration according to marshall palmer, 
+REAL, DIMENSION(SIZE(PRG,1),SIZE(PRG,2),SIZE(PRG,3)) :: ZNT, ZLBDA
+! Rain water m.r. source
+REAL, DIMENSION(SIZE(PRG,1),SIZE(PRG,2),SIZE(PRG,3)) :: ZRRS
+!RHO_dref*r_r, Rain LWC
+REAL, DIMENSION(SIZE(PRG,1),SIZE(PRG,2),SIZE(PRG,3)) :: ZRLWC
+! schmidts number
+REAL, DIMENSION(SIZE(PRG,1),SIZE(PRG,2),SIZE(PRG,3),NMODE_DST) ::  ZSCH
+!
+!Stokes number, ratio of diameters,aerosol radius
+REAL, DIMENSION(SIZE(PRG,1),SIZE(PRG,2),SIZE(PRG,3),NMODE_DST) :: ZSTO, ZPHI, ZRG
+! S Star Term
+REAL, DIMENSION(SIZE(PRG,1),SIZE(PRG,2),SIZE(PRG,3)) :: ZSTA, ZDIFF, ZTAU
+!
+!Term 1, Term 2, Term 3, Term 4 such that
+! E = Term1 * Term 2 + Term 3 + Term 4
+REAL, DIMENSION(SIZE(PRG,1),SIZE(PRG,2),SIZE(PRG,3),NMODE_DST) :: ZT1, ZT2
+REAL, DIMENSION(SIZE(PRG,1),SIZE(PRG,2),SIZE(PRG,3),NMODE_DST) :: ZT3, ZT4      
+!
+INTEGER :: JI,JK
+!
+!-----------------------------------------------------------------
+ZLBDA = 1E20
+ZNT = 1E-20
+ZRR = 10E-6
+ZRRS(:,:,:)=PURR(:,:,:)
+IKB = 1 + JPVEXT
+ZRHO00 = XP00/(XRD*XTHVREFZ(IKB))                                        
+ZRG(:,:,:,:)=PRG(:,:,:,:)*1.E-6 !change units to meters
+!
+!Fall Speed calculations
+!similar to rain_ice.f90, chapter 17.3.4, MESONH Handbook
+!
+ZVR (:,:,:)=  XFSEDR  * ZRRS(:,:,:)**(XEXSEDR-1) *   &
+          PRHODREF(:,:,:)**(XEXSEDR-XCEXVT-1) 
+
+! Drop Radius calculation in m 
+!lbda = pi*No*rho(lwc)/(rho(dref)*rain rate) p.212 MESONH Handbook
+! compute the slope parameter Lbda_r
+
+WHERE((ZRRS(:,:,:).GT. 0.).AND.(PRHODREF(:,:,:) .GT. 0.))
+
+ZLBDA(:,:,:)  = XLBR*(PRHODREF(:,:,:)*ZRRS(:,:,:))**XLBEXR
+!Number concentration NT=No/lbda   p. 415 Jacobson
+ZNT(:,:,:) = XCCR/ZLBDA(:,:,:)  
+!rain  lwc (kg/m3) =  rain m.r.(kg/kg) * rho_air(kg/m3)
+ZRLWC(:,:,:)=ZRRS(:,:,:)*PRHODREF(:,:,:)
+!4/3 *pi *r**3*NT*rho_eau(kg/m3) =rho(lwc)=rho(air)* qc(kg/kg)
+ZRR(:,:,:) =  (ZRLWC(:,:,:)/(XRHOLW*ZNT(:,:,:)*4./3.*XPI))**(1./3.)
+END WHERE
+
+ZRR(:,:,:) = MIN(ZRR(:,:,:), 100.E-6)
+!Fall speed cannot be faster than 7 m/s
+ZVR (:,:,:)=MIN(ZVR (:,:,:),7.)   
+
+!Ref SEINFELD AND PANDIS p.1019
+! Viscosity Ratio      
+ZOMG(:,:,:)=PMUW(:,:,:)/PMU(:,:,:)
+!!Reynolds number
+ZREY(:,:,:)=ZRR(:,:,:)*ZVR(:,:,:)*PRHODREF(:,:,:)/PMU(:,:,:)
+ZREY(:,:,:)= MAX(ZREY(:,:,:), 1E-2)
+
+
+!S Star
+ZSTA(:,:,:)=(1.2+(1./12.)*LOG(1.+ZREY(:,:,:)))/(1.+LOG(1.+ZREY(:,:,:)))
+PEFFIC(:,:,:,:)=0.0
+DO JI=1,NMODE_DST
+!
+!Scmidts number
+  ZSCH(:,:,:,JI)=PMU(:,:,:)/PRHODREF(:,:,:)/PDPG(:,:,:,JI)      
+! Rain-Aerosol relative velocity 
+  ZDIFF(:,:,:) = MAX(ZVR(:,:,:)-PVGG(:,:,:,JI),0.)
+! Relaxation time 
+  ZTAU(:,:,:) = (ZRG(:,:,:,JI)*2.)**2. * PDENSITY_AER(:,:,:,JI) * PCOR(:,:,:,JI) / (18.*PMU(:,:,:))
+! Stockes number
+  ZSTO(:,:,:,JI)= ZTAU(:,:,:) * ZDIFF(:,:,:) / ZRR(:,:,:)
+!Ratio of diameters  
+  ZPHI(:,:,:,JI)=ZRG(:,:,:,JI)/ZRR(:,:,:)
+  ZPHI(:,:,:,JI)=MIN(ZPHI(:,:,:,JI), 1.)
+!Term 1
+  ZT1(:,:,:,JI)=4.0/ZREY(:,:,:)/ZSCH(:,:,:,JI)
+!Term 2
+  ZT2(:,:,:,JI)=1.0+(0.4*ZREY(:,:,:)**(0.5)*ZSCH(:,:,:,JI)**(1./3.))+ &
+            (0.16*ZREY(:,:,:)**(0.5)*ZSCH(:,:,:,JI)**(0.5))   
+     
+!Brownian diffusion          
+  ZT1(:,:,:,JI)= ZT1(:,:,:,JI)*ZT2(:,:,:,JI)
+!Term 3 - interception
+  ZT3(:,:,:,JI)=4.*ZPHI(:,:,:,JI)*(1./ZOMG(:,:,:)+        &
+             (1.0+(2.0*ZREY(:,:,:)**0.5))*ZPHI(:,:,:,JI))
+
+  ZT4(:,:,:,JI)=0.0           
+ WHERE(ZSTO(:,:,:,JI).GT.ZSTA(:,:,:)) 
+!Term 4 - impaction
+   ZT4(:,:,:,JI)=((ZSTO(:,:,:,JI)-ZSTA(:,:,:))/            &
+              (ZSTO(:,:,:,JI)-ZSTA(:,:,:)+2./3.))**(3./2.) &
+             *((XRHOLW/PDENSITY_AER(:,:,:,JI))**(1./2.))
+
+  END WHERE
+!Collision Efficiancy 
+   PEFFIC(:,:,:,JI)=ZT1(:,:,:,JI)+  ZT3(:,:,:,JI)+ZT4(:,:,:,JI)     
+! Physical radius of a rain collector droplet up than 20 um
+WHERE (ZRR(:,:,:) .LE. 9.9E-6)
+  PEFFIC(:,:,:,JI)= 0.
+END WHERE
+ENDDO
+PEFFIC(:,:,:,:)=MIN(PEFFIC(:,:,:,:),1.0)
+PEFFIC(:,:,:,:)=MAX(PEFFIC(:,:,:,:),0.0)
+
+END SUBROUTINE AER_EFFIC3D
diff --git a/src/PHYEX/ext/aer_wet_dep_kmt_warm.f90 b/src/PHYEX/ext/aer_wet_dep_kmt_warm.f90
new file mode 100644
index 0000000000000000000000000000000000000000..441484721eb49a50eede482f07cf7d23bb3c7dd1
--- /dev/null
+++ b/src/PHYEX/ext/aer_wet_dep_kmt_warm.f90
@@ -0,0 +1,1060 @@
+!ORILAM_LIC Copyright 2007-2023 CNRS, Meteo-France and Universite Paul Sabatier
+!ORILAM_LIC This is part of the ORILAM software governed by the CeCILL-C licence
+!ORILAM_LIC version 1. See LICENSE, CeCILL-C_V1-en.txt and CeCILL-C_V1-fr.txt
+!ORILAM_LIC for details.
+!-----------------------------------------------------------------
+!     ################################
+      MODULE MODI_AER_WET_DEP_KMT_WARM
+!!    ################################
+!!
+!
+INTERFACE
+!!
+SUBROUTINE AER_WET_DEP_KMT_WARM(KSPLITR, PTSTEP, PZZ, PRHODREF,       &
+                                PRCT, PRRT,                           &
+                                PSVT, PTHT,                           &
+                                PPABST, PRGAER, PEVAP3D, KMODE,       &
+                                PDENSITY_AER, PMASSMIN, PSEA, PTOWN,  &
+                                PCCT, PCRT )
+!
+IMPLICIT NONE
+INTEGER,                  INTENT(IN)    :: KSPLITR ! Number of small time step 
+                                                   ! integration for  rain sedimendation
+REAL,                     INTENT(IN)    :: PTSTEP  ! Time step          
+!
+REAL, DIMENSION(:,:,:),   INTENT(IN)    :: PZZ     ! Height (z)
+REAL, DIMENSION(:,:,:),   INTENT(IN)    :: PRHODREF! Reference [kg/m3] air density
+!
+!
+REAL, DIMENSION(:,:,:),   INTENT(IN)    :: PRCT    ! Cloud water m.r. at t 
+REAL, DIMENSION(:,:,:),   INTENT(IN)    :: PRRT    ! Rain water m.r. at t 
+REAL, DIMENSION(:,:,:,:), INTENT(INOUT) :: PSVT    ! Tracer m.r. at t
+!
+REAL, DIMENSION(:,:,:),   INTENT(IN)    :: PEVAP3D ! Instantaneous 3D Rain Evaporation flux (KG/KG/S)
+!
+REAL, DIMENSION(:,:,:),   INTENT(IN)    :: PTHT       !Potential temp
+REAL, DIMENSION(:,:,:),   INTENT(IN)    :: PPABST     ! [Pa] pressure
+REAL, DIMENSION(:,:,:,:), INTENT(IN)    :: PRGAER     ! Aerosol radius (um)
+INTEGER,                  INTENT(IN)    :: KMODE      ! Nb aerosols mode
+REAL, DIMENSION(:,:,:,:), INTENT(IN)    :: PDENSITY_AER ! Begin Index for aerosol in cloud
+REAL, DIMENSION(:,:,:,:), INTENT(IN)    :: PMASSMIN   ! Aerosol mass minimum value
+REAL, DIMENSION(:,:),OPTIONAL, INTENT(IN)   :: PSEA  ! Sea mask
+REAL, DIMENSION(:,:),OPTIONAL, INTENT(IN)   :: PTOWN ! Town mask
+REAL, DIMENSION(:,:,:),OPTIONAL, INTENT(IN) :: PCCT   ! Cloud water concentration
+REAL, DIMENSION(:,:,:),OPTIONAL, INTENT(IN) :: PCRT   ! Rain water concentration
+!
+END SUBROUTINE  AER_WET_DEP_KMT_WARM 
+!!
+END INTERFACE
+END MODULE MODI_AER_WET_DEP_KMT_WARM
+
+!     ###############################################################
+      SUBROUTINE AER_WET_DEP_KMT_WARM (KSPLITR, PTSTEP, PZZ,      &
+                            PRHODREF, PRCT, PRRT,                 &
+                            PSVT, PTHT,                           &
+                            PPABST, PRGAER, PEVAP3D, KMODE,       &
+                            PDENSITY_AER, PMASSMIN, PSEA, PTOWN,  &
+                            PCCT, PCRT )
+!     ###############################################################
+!
+!!****  * -  compute the explicit microphysical processes involved in the
+!!***   * -  wet deposition of aerosols species in mixed clouds
+!!
+!!    PURPOSE
+!!    -------
+!!
+!!  The purpose of this subroutine is to calculate the mass transfer
+!!  of aerosol species between cloud hydrometeors.
+!! 
+!!
+!!
+!!**  METHOD
+!!    ------
+!!      Aerosols mass are dissolved into the cloud water and rain
+!!      drops, it is subject to transfer through the microphysical processes
+!!      that affect the parent hydrometeor [Rutledge et al., 1986].
+!!      Aerosol mass transfer has been computed using scavenging coefficient 
+!!      and brownian nucleation scavenging coefficient (Seinfeld and Pandis,
+!!      1998; Tost et al, 2006).
+!!
+!!      The sedimentation rate is computed with a time spliting technique and
+!!      an upstream scheme, written as a difference of non-advective fluxes.
+!!
+!!     KMODE: Number of aerosol modes (lognormal, bin..)
+!!     PSVT : 1 => KMODE          : dry aerosol mass
+!!     PSVT : KMODE+1 => 2*KMODE  : aerosol mass in cloud
+!!     PSVT : 2*KMODE+1 => 3*KMODE: aerosol mass in rain
+
+!!
+!!    EXTERNAL
+!!    --------
+!!      None
+!!     
+!!
+!!    IMPLICIT ARGUMENTS
+!!    ------------------
+!!      Module MODD_CST     
+!!          XP00               ! Reference pressure
+!!          XRD,XRV            ! Gaz  constant for dry air, vapor
+!!          XMD,XMV            ! Molecular weight for dry air, vapor
+!!          XCPD               ! Cpd (dry air)
+!!
+!!    REFERENCE
+!!    ---------
+!!
+!!    AUTHOR
+!!    ------
+!!      P. Tulet & K. Crahan-Kaku      * CNRM * 
+!!
+!!      Based on rain_ice.f90 and ch_wet_dep_kmt_warm.f90
+!!      from C. Mari & J.P. Pinty  * LA*
+!!
+!!
+!!    MODIFICATIONS
+!!    -------------
+!!      Original    09/05/07
+!  P. Wautelet 26/04/2019: replace non-standard FLOAT function by REAL function
+!  P. Wautelet 28/05/2019: move COUNTJV function to tools.f90
+!-------------------------------------------------------------------------------
+!
+!*       0.    DECLARATIONS
+!              ------------
+!
+USE MODD_CST
+USE MODD_RAIN_ICE_PARAM_n, ONLY : YEXCACCR=>XEXCACCR, XFSEDC, XFCACCR,&
+                                XEXSEDR, XCRIAUTC, XFSEDR, XTIMAUTC,&
+                                YFCACCR => XFCACCR
+!++th++ 10/05/17
+USE MODD_RAIN_ICE_DESCR_n, ONLY : YRTMIN => XRTMIN, YCEXVT => XCEXVT, &
+                                XCONC_LAND, XCONC_SEA, XCONC_URBAN, &
+                                XNUC2, XALPHAC2, XNUC, XALPHAC,     &
+                                YLBC => XLBC, XLBEXC,               &
+                                XCCR,                               &
+                                YLBR => XLBR, YLBEXR => XLBEXR
+!--th--
+USE MODD_PRECIP_n
+USE MODI_AER_VELGRAV
+USE MODI_AER_EFFIC
+USE MODI_GAMMA
+!++th++ 10/05/17
+USE MODD_PARAM_LIMA,      ONLY : XCTMIN, WRTMIN => XRTMIN, WCEXVT => XCEXVT
+USE MODD_PARAM_LIMA_WARM, ONLY : WLBR => XLBR, WLBEXR => XLBEXR,          & ! for
+                                 XFSEDRR, XDR, XBR,                       & ! sedim.
+                                 XAUTO1, XAUTO2, XCAUTR, XITAUTR, XLAUTR, & ! for
+                                 XLAUTR_THRESHOLD, XITAUTR_THRESHOLD,     & ! autoconv.
+                                 WLBC => XLBC,                            &
+                                 XACCR1, XACCR2, XACCR3, XACCR4, XACCR5,  & ! for
+                                 XACCR_RLARGE1, XACCR_RLARGE2,            & ! accr.
+                                 XACCR_RSMALL1, XACCR_RSMALL2,            &
+                                 WEXCACCR=>XEXCACCR, WFCACCR=>XFCACCR
+USE MODD_PARAM_n,         ONLY: CCLOUD
+!--th--
+
+!
+IMPLICIT NONE
+!
+!*       0.1   Declarations of dummy arguments :
+!
+INTEGER,                  INTENT(IN)    :: KSPLITR ! Number of small time step 
+                                      ! integration for  rain sedimendation
+REAL,                     INTENT(IN)    :: PTSTEP  ! Time step          
+!
+REAL, DIMENSION(:,:,:),   INTENT(IN)    :: PZZ     ! Height (z)
+REAL, DIMENSION(:,:,:),   INTENT(IN)    :: PRHODREF! Reference [kg/m3] air density
+!
+REAL, DIMENSION(:,:,:),   INTENT(IN)    :: PRCT    ! Cloud water m.r. at t 
+REAL, DIMENSION(:,:,:),   INTENT(IN)    :: PRRT    ! Rain water m.r. at t 
+REAL, DIMENSION(:,:,:,:), INTENT(INOUT) :: PSVT    ! Tracer m.r. at t
+!
+REAL, DIMENSION(:,:,:),   INTENT(IN)    :: PEVAP3D ! Instantaneous 3D Rain Evaporation flux (KG/KG/S) 
+!
+REAL, DIMENSION(:,:,:),   INTENT(IN)    :: PTHT     ! Potential temp
+REAL, DIMENSION(:,:,:),   INTENT(IN)    :: PPABST   ! [Pa] pressure
+REAL, DIMENSION(:,:,:,:), INTENT(IN)    :: PRGAER   ! Aerosols radius (um)
+INTEGER,                  INTENT(IN)    :: KMODE    ! Nb aerosols mode
+REAL, DIMENSION(:,:,:,:), INTENT(IN)    :: PDENSITY_AER ! Begin Index for aerosol in cloud
+REAL, DIMENSION(:,:,:,:), INTENT(IN)    :: PMASSMIN     ! Aerosol mass minimum value 
+REAL, DIMENSION(:,:),OPTIONAL, INTENT(IN)   :: PSEA  ! Sea mask
+REAL, DIMENSION(:,:),OPTIONAL, INTENT(IN)   :: PTOWN ! Town mask
+REAL, DIMENSION(:,:,:),OPTIONAL, INTENT(IN) :: PCCT   ! Cloud water concentration
+REAL, DIMENSION(:,:,:),OPTIONAL, INTENT(IN) :: PCRT   ! Rain water concentration
+
+!
+!*       0.2   Declarations of local variables :
+!
+INTEGER :: JK            ! Vertical loop index for the rain sedimentation 
+INTEGER :: JN            ! Temporal loop index for the rain sedimentation
+INTEGER :: JJ            ! Loop index for the interpolation
+!
+REAL    :: ZTSPLITR      ! Small time step for rain sedimentation
+!
+REAL,  DIMENSION(:,:), ALLOCATABLE :: ZEFC  !efficiency factor [unitless]
+!
+!Declaration of Dust Variables
+!
+INTEGER :: ICLOUD, IRAIN
+! Case number of sedimentation, T>0 (for HEN)
+                         ! and r_x>0 locations
+LOGICAL, DIMENSION(SIZE(PSVT,1),SIZE(PSVT,2),SIZE(PSVT,3)) &
+                    :: GRAIN, GCLOUD ! Test where to compute all processes
+ ! Test where to compute the SED/EVAP processes
+!++cb++ 15/05/17
+!REAL,    DIMENSION(SIZE(PSVT,1),SIZE(PSVT,2),SIZE(PSVT,3))   &
+!                                  :: ZW, ZZW1, ZZW2, ZZW4 ! work array
+REAL,    DIMENSION(SIZE(PSVT,1),SIZE(PSVT,2),SIZE(PSVT,3))   &
+                                  :: ZW, ZZW1, ZZW2, ZZW4, & ! work array
+                                     ZZW3, ZZW5
+REAL,    DIMENSION(SIZE(PSVT,1),SIZE(PSVT,2),SIZE(PSVT,3)) &
+                                  :: ZDIM,                 &
+                                     ZLBDC3, ZLBDC,      &
+                                     ZLBDR3, ZLBDR
+!--cb--
+REAL,    DIMENSION(SIZE(PSVT,1),SIZE(PSVT,2),SIZE(PSVT,3))   &
+                                  :: ZWEVAP ! sedimentation fluxes
+REAL,    DIMENSION(SIZE(PSVT,1),SIZE(PSVT,2),SIZE(PSVT,3)+1)   &
+                                  :: ZWSED ! sedimentation fluxes
+REAL,    DIMENSION(SIZE(PSVT,1),SIZE(PSVT,2),SIZE(PSVT,3)) :: ZLBDAR
+! Slope parameter of the raindrop  distribution                                  
+REAL,    DIMENSION(SIZE(PSVT,1),SIZE(PSVT,2),SIZE(PSVT,3))   &
+                                  :: ZZRCT, ZZEVAP, ZMASK
+REAL,    DIMENSION(SIZE(PSVT,1),SIZE(PSVT,2),SIZE(PSVT,3))   &
+                                  :: ZRAY,   & ! Mean radius
+                                     ZNRT,   & ! Number of rain droplets
+                                     ZLBC ,  & ! XLBC weighted by sea fraction
+                                     ZFSEDC
+REAL,    DIMENSION(SIZE(PSVT,1),SIZE(PSVT,2)) :: ZCONC_TMP
+REAL,    DIMENSION(SIZE(PSVT,1),SIZE(PSVT,2),SIZE(PSVT,3)) :: ZCONC
+!
+REAL, DIMENSION(:,:), ALLOCATABLE :: ZSVT  ! Tracer m.r. concentration
+!
+REAL, DIMENSION(:,:), ALLOCATABLE :: ZVGG, ZDPG  !aerosol velocity [m/s], diffusivity [m2/s]
+REAL, DIMENSION(:,:), ALLOCATABLE :: ZRG    !Dust R[\b5m]
+REAL, DIMENSION(:,:), ALLOCATABLE :: ZCOR   !Cunningham correction factor [unitless]
+REAL, DIMENSION(:,:), ALLOCATABLE :: ZMASSMIN ! Aerosol mass minimum value
+REAL, DIMENSION(:,:), ALLOCATABLE :: ZDENSITY_AER ! Aerosol density
+!
+REAL, DIMENSION(:), ALLOCATABLE &
+               :: ZRHODREF,   &  ! RHO Dry REFerence
+                  ZTHT,       &  ! Potential temp
+                  ZPABST,     &  ! Pressure [Pa]
+                  ZZW,        &  ! Work array
+                  ZTEMP,      &  ! Air Temp [K]
+                  ZRC,        &  ! Cloud radius [m]
+                  ZRCT,       &  ! Cloud water
+                  ZRR,        &  ! Rain radius [m]
+                  ZNT,        &  ! Rain droplets number 
+                  ZRRT,       &  ! Rain water
+                  ZMU,ZMUW,   &  ! viscosity aerosol, water [Pa s] 
+                  ZFLUX,      &  ! Effective precipitation flux (kg.m-2.s-1)
+                  ZCONC1D,    &  ! Weighted droplets concentration
+                  ZWLBDC,     &  ! Slope parameter of the droplet  distribution
+                  ZGAMMA,     &  ! scavenging coefficient
+                  ZLBDA          ! lambda parameter for lima distribution
+REAL, DIMENSION(:), ALLOCATABLE :: ZW1 ! Work arrays 
+
+INTEGER                           :: JL  ! and PACK intrinsics
+!
+INTEGER                           :: JKAQ, JSV
+!
+REAL  :: A0, A1, A2, A3             ! Constants for computing viscocity
+INTEGER :: IKE
+!
+REAL, DIMENSION(:), ALLOCATABLE :: KRTMIN 
+REAL :: KCEXVT, KLBR, KLBEXR, KLBC, ZLBEXC
+REAL, DIMENSION(2) :: ZXLBC
+REAL :: ZEXSEDR, ZDR, ZEXCACCR, ZFCACCR
+!  
+!-------------------------------------------------------------------------------
+!
+!*       0.   Initialize work array
+!             ---------------------
+!
+!++cb++ 15/05/17 gestion des parametres redondants entre lima et ice3
+! ATTENTION : pour le moment, les autres schemas microphysiques ne sont pas geres
+! NOTE : les noms sont changes dans toute la routine X... --> K...
+SELECT CASE(CCLOUD)
+CASE('ICE3')
+  ALLOCATE(KRTMIN(SIZE(YRTMIN)))
+  KRTMIN(:) = YRTMIN(:)
+  KCEXVT = YCEXVT
+  KLBR   = YLBR
+  KLBEXR = YLBEXR
+  ZXLBC(:) = YLBC(:)
+  ZLBEXC = XLBEXC
+  ZEXCACCR = YEXCACCR
+  ZFCACCR = YFCACCR
+CASE('LIMA')
+  ALLOCATE(KRTMIN(SIZE(WRTMIN)))
+  KRTMIN = WRTMIN
+  KCEXVT = WCEXVT
+  KLBR   = WLBR
+  KLBEXR = WLBEXR
+  KLBC   = WLBC
+  ZLBEXC = 1.0 / 3.0
+  ZDR = 0.8
+  ZEXCACCR = WEXCACCR
+  ZFCACCR = WFCACCR
+END SELECT
+!--cb--
+!
+! Compute Effective cloud radius 
+ZRAY(:,:,:) = 0.
+ZLBC(:,:,:) = 0.
+!
+!++th++ 05/05/17 test thomas
+IF (PRESENT(PCCT)) THEN  ! case KHKO, C2R2, C3R5, LIMA (two moments schemes)
+!
+  WHERE (PCCT(:,:,:) .GT. 0. .AND. PRCT(:,:,:) .GT. 0.)
+    ZRAY(:,:,:) = 3. * PRCT(:,:,:) / (4. * XPI * XRHOLW * PCCT(:,:,:))
+    ZRAY(:,:,:)  = ZRAY(:,:,:)**(1./3.) ! Cloud mean radius in m
+  ELSEWHERE
+    ZRAY(:,:,:) = 30.  ! Cloud mean radius in m
+  ENDWHERE
+!--th--
+!
+ELSE IF (PRESENT(PSEA)) THEN ! Case ICE3, REVE, KESS, ..
+  ZLBC(:,:,:)    = ZXLBC(1)
+  ZFSEDC(:,:,:)  = XFSEDC(1)
+  ZCONC(:,:,:)   = XCONC_LAND
+  ZCONC_TMP(:,:) = PSEA(:,:) * XCONC_SEA + (1. - PSEA(:,:)) * XCONC_LAND
+!
+  DO JK = 1, SIZE(PRHODREF,3)
+    ZLBC(:,:,JK)   = PSEA(:,:) * ZXLBC(2) + (1. - PSEA(:,:)) * ZXLBC(1)
+    ZFSEDC(:,:,JK) = (PSEA(:,:) * XFSEDC(2) + (1. - PSEA(:,:)) * XFSEDC(1))
+    ZFSEDC(:,:,JK) = MAX(MIN(XFSEDC(1),XFSEDC(2)),ZFSEDC(:,:,JK))
+    ZCONC(:,:,JK)  = (1. - PTOWN(:,:)) * ZCONC_TMP(:,:) + PTOWN(:,:) * XCONC_URBAN
+    ZRAY(:,:,JK)   = 0.5 * ((1. - PSEA(:,:)) * GAMMA(XNUC+1.0/XALPHAC)   / (GAMMA(XNUC)) + &
+                                  PSEA(:,:)  * GAMMA(XNUC2+1.0/XALPHAC2) / (GAMMA(XNUC2)))
+  END DO
+  ZRAY(:,:,:) = MAX(1., ZRAY(:,:,:))
+  ZLBC(:,:,:) = MAX(MIN(ZXLBC(1),ZXLBC(2)), ZLBC(:,:,:))
+ELSE
+  ZRAY(:,:,:) = 30. ! default value for cloud radius
+END IF
+!
+ZNRT(:,:,:) = 0.
+IF (PRESENT(PCRT)) THEN ! case KHKO, C2R2, C3R5, LIMA
+! Transfert Number of rain droplets
+  ZNRT(:,:,:)  = PCRT(:,:,:)      
+END IF
+!-------------------------------------------------------------------------------
+!
+!*       1.     COMPUTE THE AEROSOL/CLOUD-RAIN MASS TRANSFER
+!              ----------------------------------------------
+!
+CALL AER_WET_MASS_TRANSFER
+!
+!-------------------------------------------------------------------------------
+!
+!*       2.     COMPUTE THE SEDIMENTATION (RS) SOURCE
+!              -------------------------------------
+!
+CALL AER_WET_DEP_KMT_WARM_SEDIMENT
+!
+!-------------------------------------------------------------------------------
+!
+!*       3.     COMPUTES THE SLOW WARM PROCESS SOURCES 
+!               --------------------------------------
+!
+CALL AER_WET_DEP_KMT_ICE_WARM
+!
+!-------------------------------------------------------------------------------
+!*       4.     COMPUTES EVAPORATION PROCESS
+!               ----------------------------
+!
+CALL AER_WET_DEP_KMT_EVAP   
+!
+DEALLOCATE(KRTMIN)
+!
+!-------------------------------------------------------------------------------
+!
+!
+CONTAINS
+!
+!
+!-------------------------------------------------------------------------------
+!
+SUBROUTINE AER_WET_MASS_TRANSFER
+!
+!*      0. DECLARATIONS
+!          ------------
+!
+use mode_tools, only: Countjv
+
+IMPLICIT NONE
+!
+!*       0.2  declaration of local variables
+!
+!
+INTEGER , DIMENSION(SIZE(GCLOUD)) :: I1C,I2C,I3C! Used to replace the COUNT
+INTEGER , DIMENSION(SIZE(GRAIN))  :: I1R,I2R,I3R ! Used to replace the COUNT
+INTEGER                           :: JL       ! and PACK intrinsics
+INTEGER                           :: JKAQ     ! counter for chemistry
+!  
+!
+!  1 Mass transfer Aerosol to cloud (Tost et al., 2006)
+!
+GCLOUD(:,:,:) = .FALSE.
+!
+IF (PRESENT(PCCT)) THEN ! case KHKO, C2R2, C3R5, LIMA (2-moment schemes)
+  GCLOUD(:,:,:) = PRCT(:,:,:) > KRTMIN(2) .AND. PCCT(:,:,:) > XCTMIN(2)
+ELSE                    ! Case ICE3, REVE, KESS, ... (1-moment schemes)
+  GCLOUD(:,:,:) = PRCT(:,:,:) > KRTMIN(2)
+END IF
+
+ICLOUD = COUNTJV( GCLOUD(:,:,:),I1C(:),I2C(:),I3C(:))
+IF( ICLOUD >= 1 ) THEN   
+  ALLOCATE(ZSVT(ICLOUD,KMODE*3)) 
+  ALLOCATE(ZRHODREF(ICLOUD))
+  ALLOCATE(ZTHT(ICLOUD))
+  ALLOCATE(ZRC(ICLOUD))
+  ALLOCATE(ZPABST(ICLOUD))
+  ALLOCATE(ZRG(ICLOUD,KMODE))    
+  ALLOCATE(ZTEMP(ICLOUD))
+  ALLOCATE(ZMU(ICLOUD))
+  ALLOCATE(ZRCT(ICLOUD))
+  ALLOCATE(ZVGG(ICLOUD,KMODE))
+  ALLOCATE(ZDPG(ICLOUD,KMODE))
+  ALLOCATE(ZGAMMA(ICLOUD))
+  ALLOCATE(ZW1(ICLOUD))    
+  ALLOCATE(ZCOR(ICLOUD,KMODE))
+  ALLOCATE(ZMASSMIN(ICLOUD,KMODE))
+  ALLOCATE(ZWLBDC(ICLOUD))
+  ALLOCATE(ZCONC1D(ICLOUD))
+  ALLOCATE(ZDENSITY_AER(ICLOUD,KMODE))
+!
+  ZSVT(:,:) = 0.
+!
+  DO JL = 1, ICLOUD
+    DO JKAQ = 1, KMODE
+      ZRG(JL,JKAQ) = PRGAER(I1C(JL),I2C(JL),I3C(JL),JKAQ)  
+    ENDDO
+    DO JKAQ = 1, KMODE*3
+      ZSVT(JL,JKAQ) = PSVT(I1C(JL),I2C(JL),I3C(JL),JKAQ) 
+    END DO
+     !
+    ZTHT(JL)           = PTHT(I1C(JL),I2C(JL),I3C(JL))
+    ZRC(JL)            = ZRAY(I1C(JL),I2C(JL),I3C(JL))
+    ZPABST(JL)         = PPABST(I1C(JL),I2C(JL),I3C(JL))
+    ZRCT(JL)           = PRCT(I1C(JL),I2C(JL),I3C(JL)) 
+    ZRHODREF(JL)       = PRHODREF(I1C(JL),I2C(JL),I3C(JL))   
+    ZMASSMIN(JL,:)     = PMASSMIN(I1C(JL),I2C(JL),I3C(JL),:)   
+    ZWLBDC(JL)         = ZLBC(I1C(JL),I2C(JL),I3C(JL))
+    ZCONC1D(JL)        = ZCONC(I1C(JL),I2C(JL),I3C(JL))
+    ZDENSITY_AER(JL,:) = PDENSITY_AER(I1C(JL),I2C(JL),I3C(JL),:)
+  END DO
+!
+  IF (ANY(ZWLBDC(:) /= 0.)) THEN ! case one moments
+ ! On calcule Rc a partir de M(3) car c'est le seul moment indt de alpha et nu
+ ! Rho_air * Rc / (Pi/6 * Rho_eau * Nc) =  M(3) = 1/ (Lambda**3 * rapport des
+ ! gamma)
+    ZWLBDC(:) = ZWLBDC(:) * ZCONC1D(:) / (ZRHODREF(:) * ZRCT(:))
+    ZWLBDC(:) = ZWLBDC(:)**ZLBEXC
+    ZRC(:) = ZRC(:) / ZWLBDC(:)
+  END IF
+!   
+! initialize temperature
+  ZTEMP(:) = ZTHT(:) * (ZPABST(:) / XP00)**(XRD/XCPD)
+!
+! compute diffusion and gravitation velocity
+  CALL AER_VELGRAV(ZRG(:,:),  ZPABST(:),           &
+                   KMODE, ZMU(:), ZVGG(:,:),       &
+                   ZDPG(:,:),ZTEMP(:),ZCOR(:,:),   &
+                   ZDENSITY_AER(:,:))
+
+  DO JKAQ = 1, KMODE
+! Browninan nucleation scavenging (Pruppacher and Klett, 2000, p723) 
+    ZGAMMA(:) = 1.35 * ZRCT(:) * ZRHODREF(:) * 1.E-3 * ZDPG(:,JKAQ) / &
+                (ZRC(:) * ZRC(:))
+!               
+    ZW1(:) = ZSVT(:,JKAQ) * EXP(-ZGAMMA(:) * PTSTEP)
+    ZW1(:) = MAX(ZW1(:), ZMASSMIN(:,JKAQ))
+!    ZW1(:) = MIN(ZW1(:), ZSVT(:,JKAQ))
+! Aerosol mass in cloud
+    ZSVT(:,KMODE+JKAQ) = ZSVT(:,KMODE+JKAQ) + ZSVT(:,JKAQ) - ZW1(:)
+! New aerosol mass 
+    ZSVT(:,JKAQ) = ZW1(:)
+! Return in 3D
+    PSVT(:,:,:,JKAQ) = &
+       UNPACK(ZSVT(:,JKAQ),MASK=GCLOUD(:,:,:),FIELD=PSVT(:,:,:,JKAQ))
+    PSVT(:,:,:,KMODE+JKAQ) = &
+       UNPACK(ZSVT(:,KMODE+JKAQ),MASK=GCLOUD(:,:,:),FIELD=PSVT(:,:,:,KMODE+JKAQ))
+  ENDDO
+!
+  DEALLOCATE(ZSVT) 
+  DEALLOCATE(ZRHODREF)
+  DEALLOCATE(ZTHT)
+  DEALLOCATE(ZRC)
+  DEALLOCATE(ZPABST)
+  DEALLOCATE(ZRG)    
+  DEALLOCATE(ZTEMP)
+  DEALLOCATE(ZMU)
+  DEALLOCATE(ZRCT)
+  DEALLOCATE(ZVGG)
+  DEALLOCATE(ZDPG)
+  DEALLOCATE(ZGAMMA)
+  DEALLOCATE(ZW1)    
+  DEALLOCATE(ZCOR)
+  DEALLOCATE(ZMASSMIN)
+  DEALLOCATE(ZWLBDC)
+  DEALLOCATE(ZCONC1D)
+  DEALLOCATE(ZDENSITY_AER)
+END IF
+!
+!  2 Mass transfer Aerosol to Rain (Seinfeld and Pandis, 1998, Tost et al., 2006)
+!
+GRAIN(:,:,:) = .FALSE.
+!
+IF (PRESENT(PCRT)) THEN ! case KHKO, C2R2, C3R5, LIMA (2-moment schemes)
+  GRAIN(:,:,:) = PRRT(:,:,:) > KRTMIN(3) .AND. PCRT(:,:,:) > XCTMIN(3)
+ELSE                    ! Case ICE3, REVE, KESS, ... (1-moment schemes)
+  GRAIN(:,:,:) = PRRT(:,:,:) > KRTMIN(3)
+END IF
+
+IRAIN = COUNTJV( GRAIN(:,:,:),I1R(:),I2R(:),I3R(:))
+IF( IRAIN >= 1 ) THEN   
+! 
+  ALLOCATE(ZRRT(IRAIN))
+  ALLOCATE(ZSVT(IRAIN,3*KMODE)) 
+  ALLOCATE(ZRHODREF(IRAIN))
+  ALLOCATE(ZTHT(IRAIN))
+  ALLOCATE(ZRR(IRAIN))
+  ALLOCATE(ZNT(IRAIN))
+  ALLOCATE(ZPABST(IRAIN))
+  ALLOCATE(ZRG(IRAIN,KMODE))    
+  ALLOCATE(ZCOR(IRAIN,KMODE))
+  ALLOCATE(ZTEMP(IRAIN))
+  ALLOCATE(ZMU(IRAIN))
+  ALLOCATE(ZVGG(IRAIN,KMODE))
+  ALLOCATE(ZDPG(IRAIN,KMODE))
+  ALLOCATE(ZMUW(IRAIN))
+  ALLOCATE(ZEFC(IRAIN,KMODE))
+  ALLOCATE(ZW1(IRAIN))
+  ALLOCATE(ZFLUX(IRAIN))
+  ALLOCATE(ZGAMMA(IRAIN))
+  ALLOCATE(ZMASSMIN(IRAIN,KMODE))
+  ALLOCATE(ZDENSITY_AER(IRAIN,KMODE))
+  ALLOCATE(ZLBDA(IRAIN))
+!
+  ZSVT(:,:) = 0.
+!
+  DO JL = 1, IRAIN    
+    DO JKAQ = 1, KMODE
+      ZRG(JL,JKAQ)  = PRGAER(I1R(JL),I2R(JL),I3R(JL),JKAQ )  
+      ZSVT(JL,JKAQ) = PSVT(I1R(JL),I2R(JL),I3R(JL),JKAQ)
+      ZSVT(JL,KMODE*2+JKAQ) = PSVT(I1R(JL),I2R(JL),I3R(JL),KMODE*2+JKAQ) 
+    END DO
+!
+    ZTHT(JL)           = PTHT(I1R(JL),I2R(JL),I3R(JL))
+    ZPABST(JL)         = PPABST(I1R(JL),I2R(JL),I3R(JL))
+    ZRRT(JL)           = PRRT(I1R(JL),I2R(JL),I3R(JL)) 
+    ZRHODREF(JL)       = PRHODREF(I1R(JL),I2R(JL),I3R(JL))   
+    ZMASSMIN(JL,:)     = PMASSMIN(I1R(JL),I2R(JL),I3R(JL),:)   
+    ZNT(JL)            = ZNRT(I1R(JL),I2R(JL),I3R(JL))   
+    ZDENSITY_AER(JL,:) = PDENSITY_AER(I1R(JL),I2R(JL),I3R(JL),:)   
+  ENDDO
+
+! Compute scavenging coefficient
+  ZFLUX(:) = 0.
+  ZRRT(:) = MAX(ZRRT(:), 0.)
+!
+! Effective precipitation flux (kg.m-2.s-1)
+  IF (PRESENT(PCRT)) THEN ! cf lima_precip_scavenging.f90 (l. 751)
+    ZEXSEDR = (XBR + XDR + 1.0) / (XBR + 1.0)
+
+    ZLBDA(:) = (KLBR * ZNT(:) / ZRRT(:))**KLBEXR
+    ZFLUX(:) = XFSEDRR * ZRRT(:) * ZRHODREF(:)**(1.-KCEXVT) * ZLBDA(:)**(-ZDR)
+
+  ELSE ! cf ZWSED dans rain_ice.f90 (l. 1077)
+    ZFLUX(:) = XFSEDR  * ZRRT(:)**(XEXSEDR) * ZRHODREF(:)**(XEXSEDR-KCEXVT)
+  END IF
+  ZFLUX(:) = MAX(ZFLUX(:), 0.)
+
+  IF (ALL(ZNT(:) == 0.)) THEN ! case one moments
+! Number concentration NT=No/lbda   p. 415 Jacobson
+! 4/3 *pi *r\b3*NT*rho_eau(kg/m3) =rho(lwc)=rho(air)* qc(kg/kg)
+    ZNT(:) = XCCR / (KLBR * (ZRHODREF(:) * ZRRT(:))**KLBEXR)
+  END IF
+!
+  ZRR(:) = (ZRRT(:) * ZRHODREF(:) / &
+           (XRHOLW * ZNT(:) * 4. / 3. * XPI))**(1./3.)
+
+  CALL AER_WET_DEP_KMT_EFFIC
+
+  DO JKAQ = 1, KMODE
+    ! Tost et al, 2006
+    ZGAMMA(:) = 0.75 * ZEFC(:,JKAQ) * ZFLUX(:) / (ZRR(:) * 1.E3)
+
+    ZW1(:) = ZSVT(:,JKAQ) * EXP(-ZGAMMA(:)*PTSTEP)
+    ZW1(:) = MAX(ZW1(:), ZMASSMIN(:,JKAQ))
+
+    ! Aerosol mass in rain
+    ZSVT(:,KMODE*2+JKAQ) = ZSVT(:,KMODE*2+JKAQ) + ZSVT(:,JKAQ) - ZW1(:)
+
+    ! New aerosol mass 
+    ZSVT(:,JKAQ) = ZW1(:)
+
+    ! Return to 3D
+    PSVT(:,:,:,JKAQ) = &
+       UNPACK(ZSVT(:,JKAQ),MASK=GRAIN(:,:,:),FIELD=PSVT(:,:,:,JKAQ))
+    PSVT(:,:,:,KMODE*2+JKAQ) = &
+       UNPACK(ZSVT(:,KMODE*2+JKAQ),MASK=GRAIN(:,:,:),FIELD=PSVT(:,:,:,KMODE*2+JKAQ))
+  ENDDO
+!
+  DEALLOCATE(ZRRT)
+  DEALLOCATE(ZSVT) 
+  DEALLOCATE(ZRHODREF)
+  DEALLOCATE(ZTHT)
+  DEALLOCATE(ZRR)
+  DEALLOCATE(ZNT)
+  DEALLOCATE(ZPABST)
+  DEALLOCATE(ZRG)    
+  DEALLOCATE(ZCOR)
+  DEALLOCATE(ZTEMP)
+  DEALLOCATE(ZMU)
+  DEALLOCATE(ZVGG)
+  DEALLOCATE(ZDPG)
+  DEALLOCATE(ZMUW)
+  DEALLOCATE(ZEFC)
+  DEALLOCATE(ZW1)
+  DEALLOCATE(ZFLUX)
+  DEALLOCATE(ZGAMMA)
+  DEALLOCATE(ZMASSMIN)
+  DEALLOCATE(ZDENSITY_AER)
+  DEALLOCATE(ZLBDA)
+END IF 
+!
+END SUBROUTINE AER_WET_MASS_TRANSFER
+!
+!-------------------------------------------------------------------------------
+!
+SUBROUTINE AER_WET_DEP_KMT_WARM_SEDIMENT
+!
+!*         Sedimentation of aerosol in rain droplets
+!
+!*      0. DECLARATIONS
+!          ------------
+!
+use mode_tools, only: Countjv
+!
+IMPLICIT NONE
+!
+!*        declaration of local variables
+!
+INTEGER :: JL       ! and PACK intrinsics
+INTEGER :: JKAQ     ! counter for acquous aerosols
+INTEGER :: IRAIN, ILISTLENR
+INTEGER                            :: ILENALLOCR
+INTEGER, SAVE                      :: IOLDALLOCR = 6000
+INTEGER, DIMENSION(SIZE(PZZ))      :: IR1,IR2,IR3 ! Used to replace the COUNT
+INTEGER, DIMENSION(:), ALLOCATABLE :: ILISTR
+REAL, DIMENSION(:),    ALLOCATABLE :: ZLAMBDA, ZRHODREF, ZCRT, ZRRT
+REAL, DIMENSION(:,:),  ALLOCATABLE :: ZSVT
+!  
+!-------------------------------------------------------------------------------
+!
+!*         Time splitting initialization
+!
+ZTSPLITR = PTSTEP / REAL(KSPLITR)
+!
+ZW(:,:,:)=0.
+ZWSED(:,:,:) = 0.
+IKE = SIZE(PRCT,3)
+ILENALLOCR = 0
+
+DO JK = 1 , SIZE(PZZ,3)-1
+  ZW(:,:,JK) = ZTSPLITR / ((PZZ(:,:,JK+1) - PZZ(:,:,JK)))
+END DO
+
+IF (PRESENT(PCRT)) THEN !two moments
+  WHERE (PRRT(:,:,:) > KRTMIN(3) .AND. PCRT(:,:,:) > XCTMIN(3))
+  ZW(:,:,:) = 0.
+  END WHERE
+ELSE  ! one moment 
+  WHERE (PRRT(:,:,:) <= KRTMIN(3))    
+  ZW(:,:,:) = 0.
+  END WHERE
+END IF
+
+GRAIN(:,:,:) = .FALSE.
+
+IF (PRESENT(PCRT)) THEN ! case KHKO, C2R2, C3R5, LIMA (2-moment schemes)
+  GRAIN(:,:,:) = PRRT(:,:,:) > KRTMIN(3) .AND. PCRT(:,:,:) > XCTMIN(3)
+ELSE                    ! Case ICE3, REVE, KESS, ... (1-moment schemes)
+  GRAIN(:,:,:) = PRRT(:,:,:) > KRTMIN(3)
+END IF
+
+IRAIN = COUNTJV( GRAIN(:,:,:),IR1(:),IR2(:),IR3(:))
+
+IF( IRAIN >= 1 ) THEN
+DO JN = 1 , KSPLITR
+  IF( JN==1 ) THEN
+    DO JKAQ = 1,KMODE
+      DO JK = 1, IKE
+       PSVT(:,:,JK,KMODE*2+JKAQ) = PSVT(:,:,JK,KMODE*2+JKAQ) / FLOAT(KSPLITR)
+      END DO
+    END DO
+  END IF
+     IF ( IRAIN .GT. ILENALLOCR ) THEN
+        IF ( ILENALLOCR .GT. 0 ) THEN
+          DEALLOCATE (ILISTR,ZSVT,ZRHODREF,ZCRT,ZRRT,ZLAMBDA)
+        END IF
+        ILENALLOCR = MAX (IOLDALLOCR, 2*IRAIN )
+        IOLDALLOCR = ILENALLOCR
+        ALLOCATE(ILISTR(ILENALLOCR), ZRHODREF(ILENALLOCR), ZSVT(ILENALLOCR,3*KMODE),&
+                 ZCRT(ILENALLOCR), ZRRT(ILENALLOCR), ZLAMBDA(ILENALLOCR))
+     END IF
+
+     DO JL = 1, IRAIN
+      DO JKAQ = 1, KMODE
+        ZSVT(JL,KMODE*2+JKAQ) = PSVT(IR1(JL),IR2(JL),IR3(JL),KMODE*2+JKAQ)
+      END DO
+!
+      IF (PRESENT(PCRT)) ZCRT(JL) = PCRT(IR1(JL),IR2(JL),IR3(JL))
+      ZRRT(JL)           = PRRT(IR1(JL),IR2(JL),IR3(JL))
+      ZRHODREF(JL)       = PRHODREF(IR1(JL),IR2(JL),IR3(JL))
+     ENDDO
+
+     ILISTLENR = 0
+     DO JL=1,IRAIN
+      IF (PRESENT(PCRT)) THEN !two moments
+        IF (ZRRT(JL) > KRTMIN(3) .AND. ZCRT(JL) > XCTMIN(3)) THEN
+          ILISTLENR = ILISTLENR + 1
+          ILISTR(ILISTLENR) = JL
+        END IF
+      ELSE  ! one moment
+        IF (ZRRT(JL) > KRTMIN(3)) THEN
+          ILISTLENR = ILISTLENR + 1
+          ILISTR(ILISTLENR) = JL
+        END IF
+      END IF
+     END DO
+
+! 
+! Flux mass aerosol in rain droplets = 
+! Flux mass rain water * Mass aerosol in rain / Mass rain water
+    DO JKAQ = 1,KMODE
+      DO JJ = 1, ILISTLENR
+         JL = ILISTR(JJ)
+         IF (PRESENT(PCRT)) THEN !two moments
+          IF (ZRRT(JL) > KRTMIN(3) .AND. ZCRT(JL) > XCTMIN(3)) THEN
+           ZLAMBDA(JL) = (KLBR * ZCRT(JL) / ZRRT(JL))**KLBEXR
+
+           ZWSED(IR1(JL),IR2(JL),IR3(JL)) = XFSEDRR * ZRHODREF(JL)**(1.-KCEXVT)  &
+                                          * ZLAMBDA(JL)**(-ZDR)                  & 
+                                          * ZSVT(JL,KMODE*2+JKAQ)
+          END IF
+         ELSE ! one moments
+! cf rain_ice.f90 : l. 1077 (zwsed * psvt(kmode+2+jkaq) / zrrs)
+         IF (ZRRT(JL) > KRTMIN(3)) THEN
+
+           ZWSED(IR1(JL),IR2(JL),IR3(JL)) = XFSEDR                         &
+                                          * ZRRT(JL)**(XEXSEDR-1.)         &
+                                          * ZRHODREF(JL)**(XEXSEDR-KCEXVT) &
+                                          * ZSVT(JL,KMODE*2+JKAQ)
+         END IF 
+        END IF ! moments
+      END DO ! JJ
+
+      DO JK = 1, IKE
+        PSVT(:,:,JK,KMODE*2+JKAQ) = PSVT(:,:,JK,KMODE*2+JKAQ) + &
+                                  ZW(:,:,JK)*(ZWSED(:,:,JK+1)-ZWSED(:,:,JK))
+      END DO 
+    END DO ! JKAQ
+
+END DO ! JN - time splitting
+
+ DO JKAQ = 1,KMODE
+! Aerosol mass in rain droplets need to be positive
+   PSVT(:,:,:,KMODE*2+JKAQ) = MAX(PSVT(:,:,:,KMODE*2+JKAQ), 0.)
+ END DO  ! KKAQ
+END IF !(IRAIN)
+!  
+IF (ALLOCATED(ILISTR))   DEALLOCATE(ILISTR)
+IF (ALLOCATED(ZSVT))     DEALLOCATE(ZSVT)
+IF (ALLOCATED(ZRHODREF)) DEALLOCATE(ZRHODREF)
+IF (ALLOCATED(ZCRT))     DEALLOCATE(ZCRT)
+IF (ALLOCATED(ZRRT))     DEALLOCATE(ZRRT)
+IF (ALLOCATED(ZLAMBDA))  DEALLOCATE(ZLAMBDA)
+
+!  
+END SUBROUTINE AER_WET_DEP_KMT_WARM_SEDIMENT
+!
+!-------------------------------------------------------------------------------
+!
+  SUBROUTINE AER_WET_DEP_KMT_ICE_WARM
+!
+!*      0. DECLARATIONS
+!
+USE MODD_CST, ONLY: XMNH_HUGE
+
+IMPLICIT NONE
+!
+!-------------------------------------------------------------------------------
+!
+!*       1.    compute the autoconversion of r_c for r_r production: RCAUTR
+!    
+ZZW4(:,:,:) = 0.0
+! to be sure no division by zero in case of ZZRCT = 0.
+ZZRCT(:,:,:) = PRCT(:,:,:)
+ZZRCT(:,:,:) = MAX(ZZRCT(:,:,:), KRTMIN(2)/2.)
+!
+IF (PRESENT(PCRT)) THEN  ! 2-moment schemes
+!
+! from lima_warm_coal.f90 (AUTO)
+  ZLBDC3(:,:,:) = 1E40
+  ! ZLBDC3(:,:,:) = XMNH_HUGE
+  ZLBDC(:,:,:)  = 1.E15
+  WHERE (ZZRCT(:,:,:) > KRTMIN(2) .AND. PCCT(:,:,:) > XCTMIN(2))
+    ZLBDC3(:,:,:) = KLBC * PCCT(:,:,:) / ZZRCT(:,:,:)
+    ! ZLBDC3(:,:,:) = KLBC * PCCT(:,:,:) / PRCT(:,:,:)
+    ZLBDC(:,:,:)  = ZLBDC3(:,:,:)**ZLBEXC
+  END WHERE
+!
+  ZZW3(:,:,:) = 0.
+  WHERE (ZZRCT(:,:,:) > KRTMIN(2))
+    ZZW3(:,:,:) = MAX(0.0, XLAUTR*PRHODREF(:,:,:)*ZZRCT(:,:,:)*             &
+                           (XAUTO1/ZLBDC3(:,:,:)**4-XLAUTR_THRESHOLD)) ! L 
+    ZZW4(:,:,:) = MIN(PRCT(:,:,:), MAX(0.0, XITAUTR*ZZW3(:,:,:)*ZZRCT(:,:,:)*  &
+                           (XAUTO2/ZLBDC3(:,:,:)-XITAUTR_THRESHOLD))) ! L/tau
+  END WHERE
+!
+ELSE                     ! 1-moment scheme
+!
+  WHERE ((ZZRCT(:,:,:) > KRTMIN(2)) .AND. (PRCT(:,:,:) > 0.0)) 
+    ZZW4(:,:,:) = MIN(PRCT(:,:,:), XTIMAUTC* &
+                    MAX((ZZRCT(:,:,:)-XCRIAUTC/PRHODREF(:,:,:)), 0.0))
+  END WHERE
+!
+END IF 
+!--cb--
+
+DO JKAQ = 1,KMODE
+  ZZW2(:,:,:) = 0.0   
+  ZZW2(:,:,:) = ZZW4(:,:,:) * PSVT(:,:,:,KMODE+JKAQ) / ZZRCT(:,:,:) * PTSTEP
+  ZZW2(:,:,:) = MAX(MIN(ZZW2(:,:,:), PSVT(:,:,:,KMODE+JKAQ)), 0.0)
+
+! For rain - Increase the aerosol conc in rain
+  PSVT(:,:,:,KMODE*2+JKAQ) = PSVT(:,:,:,KMODE*2+JKAQ) + ZZW2(:,:,:)
+! For Cloud Decrease the aerosol conc in cloud
+  PSVT(:,:,:,KMODE+JKAQ)   = PSVT(:,:,:,KMODE+JKAQ)   - ZZW2(:,:,:)
+ENDDO
+!
+! 
+!*       2.    compute the accretion of r_c for r_r production: RCACCR
+!
+ZZW4(:,:,:) = 0.0
+ZZW5(:,:,:) = 0.
+ZDIM(:,:,:) = 0.
+ZLBDAR(:,:,:)=0.
+
+!
+IF (PRESENT(PCRT)) THEN ! 2-moment schemes
+!
+! from lima_warm_coal.f90 (ACCR)
+  ZLBDR3(:,:,:) = 1.E30
+  ZLBDR(:,:,:)  = 1.E10
+
+
+  WHERE (PRRT(:,:,:) > KRTMIN(3) .AND. PCRT(:,:,:) > XCTMIN(3))
+    ZLBDAR(:,:,:) = KLBR * (PRHODREF(:,:,:) * PRRT(:,:,:))**KLBEXR
+    ZLBDR3(:,:,:) = KLBR * PCRT(:,:,:) / PRRT(:,:,:)
+    ZLBDR(:,:,:)  = ZLBDR3(:,:,:)**KLBEXR
+    ZZW4(:,:,:) = MIN(PRCT(:,:,:), ZFCACCR * ZZRCT(:,:,:)            &
+                                         * ZLBDAR(:,:,:)**ZEXCACCR &
+                                         * PRHODREF(:,:,:)**(-KCEXVT) )
+    ZDIM(:,:,:) = XACCR1 / ZLBDAR(:,:,:)
+  END WHERE
+!
+! Accretion for D > 100 10-6 m
+  WHERE (PRRT(:,:,:) > KRTMIN(3)  .AND. PCRT(:,:,:) > XCTMIN(3) .AND. &
+         ZZRCT(:,:,:) > KRTMIN(2) .AND. ZZW4(:,:,:) > 1.E-4     .AND. &
+        (PRRT(:,:,:) > 1.2*ZZW3(:,:,:)/PRHODREF(:,:,:) .OR.           &
+         ZDIM(:,:,:) >= MAX(XACCR2,XACCR3/(XACCR4/ZLBDC(:,:,:)-XACCR5))))
+    ZZW5(:,:,:) = ZLBDC3(:,:,:) / ZLBDR3(:,:,:)
+    ZZW1(:,:,:) = (PCCT(:,:,:) * PCRT(:,:,:) / ZLBDC3(:,:,:)**2) * PRHODREF(:,:,:)
+    ZZW4(:,:,:) = MIN(ZZW1(:,:,:)*(XACCR_RLARGE1+XACCR_RLARGE2*ZZW5(:,:,:)), &
+                      PRCT(:,:,:))
+  END WHERE
+! Accretion for D < 100 10-6 m
+  WHERE (PRRT(:,:,:) > KRTMIN(3)  .AND. PCRT(:,:,:) > XCTMIN(3) .AND. &
+         ZZRCT(:,:,:) > KRTMIN(2) .AND. ZZW4(:,:,:) <= 1.E-4    .AND. &
+        (PRRT(:,:,:) > (1.2*ZZW2(:,:,:)/PRHODREF(:,:,:)) .OR.         &
+         ZDIM(:,:,:) >= MAX(XACCR2,XACCR3/(XACCR4/ZLBDC(:,:,:)-XACCR5))))
+    ZZW5(:,:,:) = (ZLBDC3(:,:,:) / ZLBDR3(:,:,:))**2
+    ZZW1(:,:,:) = (PCCT(:,:,:) * PCRT(:,:,:) / ZLBDC3(:,:,:)**3) * PRHODREF(:,:,:)
+    ZZW4(:,:,:) = MIN(ZZW1(:,:,:)*(XACCR_RSMALL1+XACCR_RSMALL2*ZZW5(:,:,:)), &
+                      PRCT(:,:,:))
+  END WHERE
+!
+ELSE                    ! 1-moment schemes
+!
+  ZLBDR(:,:,:) = 0.0
+  WHERE ((ZZRCT(:,:,:) > KRTMIN(2)) .AND. (PRRT(:,:,:) > KRTMIN(3)) &
+                                    .AND. (PRCT(:,:,:) > 0.0))      
+    ZLBDR(:,:,:) = KLBR * (PRHODREF(:,:,:) * PRRT(:,:,:))**KLBEXR
+    ZZW4(:,:,:) = MIN(PRCT(:,:,:), ZFCACCR * ZZRCT(:,:,:)            &
+                                           * ZLBDR(:,:,:)**ZEXCACCR &
+                                           * PRHODREF(:,:,:)**(-KCEXVT) )
+  END WHERE
+END IF
+!--cb--                    
+!
+DO JKAQ = 1, KMODE
+  ZZW2(:,:,:) = 0.0
+  ZZW2(:,:,:) = ZZW4(:,:,:) * PSVT(:,:,:,KMODE+JKAQ) / ZZRCT(:,:,:) * PTSTEP
+  ZZW2(:,:,:) = MAX(MIN(ZZW2(:,:,:), PSVT(:,:,:,KMODE+JKAQ)), 0.0)
+!
+!
+!*       3.    compute the new acqueous aerosol mass
+!
+! For rain - Increase the aerosol conc in rain
+  PSVT(:,:,:,KMODE*2+JKAQ) = PSVT(:,:,:,KMODE*2+JKAQ) + ZZW2(:,:,:)
+! For Cloud Decrease the aerosol conc in cloud
+  PSVT(:,:,:,KMODE+JKAQ)   = PSVT(:,:,:,KMODE+JKAQ)   - ZZW2(:,:,:)
+ENDDO
+!                
+END SUBROUTINE AER_WET_DEP_KMT_ICE_WARM
+!
+!---------------------------------------------------------------------------------------
+!
+  SUBROUTINE AER_WET_DEP_KMT_EVAP
+!
+!*            COMPUTES THE EVAPORATION OF CLOUD-RAIN FOR THE 
+!*             RE-RELEASE OF AER INTO THE ENVIRONMENT
+!                --------------------------------------
+!
+!
+!*      0. DECLARATIONS
+!          ------------
+!
+IMPLICIT NONE
+!
+!*         declaration of local variables
+!
+INTEGER    :: JKAQ     ! counter for aerosols
+!
+!-------------------------------------------------------------------------------
+!
+!*       1.    compute the evaporation of r_r: RREVAV 
+!         
+!When partial reevaporation of precip takes place, the fraction of 
+!tracer precipitating form above is reevaporated is equal to
+!half of the evaporation rate of water
+!
+! Rain water evaporated during PTSTEP in kg/kg
+ZZEVAP(:,:,:) = PEVAP3D(:,:,:) * PTSTEP  
+!
+! Fraction of rain water evaporated 
+! at this stage (bulk), we consider that the flux of evaporated aerosol
+! is a ratio of the evaporated rain water. 
+! It will interested to calculate with a two moment scheme (C2R2 or C3R5)
+! the complete evaporation of rain droplet to use it for the compuation
+! of the evaporated aerosol flux.
+ZWEVAP(:,:,:) = 0.0
+WHERE(PRRT(:,:,:) .GT. KRTMIN(3))
+  ZWEVAP(:,:,:) = ZZEVAP(:,:,:) / (PRRT(:,:,:))  
+END WHERE
+ZWEVAP(:,:,:) = MIN(ZWEVAP(:,:,:), 1.0)
+ZWEVAP(:,:,:) = MAX(ZWEVAP(:,:,:), 0.0)
+!
+!
+!*       2.    compute the mask of r_c evaporation : all cloud is evaporated
+!              no partial cloud evaporation at this stage
+!
+ZMASK(:,:,:) = 0.
+WHERE(PRCT(:,:,:) .LT. KRTMIN(2))
+  ZMASK(:,:,:) = 1.
+END WHERE
+!
+DO JKAQ = 1, KMODE       
+  ZZW1(:,:,:) = ZMASK(:,:,:)  * PSVT(:,:,:,KMODE+JKAQ)
+  ZZW2(:,:,:) = ZWEVAP(:,:,:) * PSVT(:,:,:,KMODE*2+JKAQ)
+!
+  ZZW1(:,:,:) = MIN(ZZW1(:,:,:),PSVT(:,:,:,KMODE+JKAQ))
+  ZZW2(:,:,:) = MIN(ZZW2(:,:,:),PSVT(:,:,:,KMODE*2+JKAQ))
+!
+!     3.   New dry aerosol mass
+!
+  PSVT(:,:,:,JKAQ) = PSVT(:,:,:,JKAQ) + ZZW2(:,:,:) + ZZW1(:,:,:)
+!
+!
+!     4.  New cloud aerosol mass
+!
+  PSVT(:,:,:,KMODE+JKAQ) = PSVT(:,:,:,KMODE+JKAQ) - ZZW1(:,:,:)
+! 
+!
+!     5.  New rain aerosol mass
+!     
+  PSVT(:,:,:,KMODE*2+JKAQ) = PSVT(:,:,:,KMODE*2+JKAQ) - ZZW2(:,:,:)
+END DO      
+!   
+END SUBROUTINE AER_WET_DEP_KMT_EVAP
+!
+!---------------------------------------------------------------------------------------
+!
+  SUBROUTINE AER_WET_DEP_KMT_EFFIC
+!
+!*            COMPUTES THE EFFICIENCY FACTOR 
+!             ------------------------------
+!
+!
+!*      0. DECLARATIONS
+!          ------------
+!
+IMPLICIT NONE
+!
+!-------------------------------------------------------------------------------
+!
+!*       1.     COMPUTES THE EFFICIENCY FACTOR 
+!                 --------------------------------------
+!
+!*       1.1   compute gravitational velocities
+!   
+!initialize
+ZTEMP(:) = ZTHT(:) * (ZPABST(:) / XP00)**(XRD/XCPD)
+ZTEMP(:) = MAX(ZTEMP(:), 1.e-12)
+!
+CALL AER_VELGRAV(ZRG(:,:), ZPABST(:), KMODE,  &
+                 ZMU(:), ZVGG(:,:),           &
+                 ZDPG(:,:),ZTEMP(:),          &
+                 ZCOR(:,:), ZDENSITY_AER(:,:))
+
+! Above gives mu (ZMU), v(aerosol)(PVGG, m/s), diffusion (ZDPG, m2/s)
+!
+!*      1.2   Compute Water Viscocity in kg/m/s Prup. & Klett, p.95
+!
+A0 = 1.76
+A1 = -5.5721e-2
+A2 = -1.3943e-3
+A3 = -4.3015e-5
+ZMUW(:) = A0 * EXP(A1*(ZTEMP(:)-273.15) &
+                 + A2*(ZTEMP(:)-273.15) + A3*(ZTEMP(:)-273.15)) * 1.e-3
+!
+A1 = -3.5254e-2
+A2 = 4.7163e-4
+A3 = -6.0667e-6
+WHERE (ZTEMP(:) > 273.15) 
+  ZMUW(:) = A0 * EXP(A1*(ZTEMP(:)-273.15) &
+                   + A2*(ZTEMP(:)-273.15) + A3*(ZTEMP(:)-273.15)) * 1.e-3
+END WHERE
+ZMUW(:) = MAX(ZMUW(:), 1.e-12)
+!
+!*       1.3   compute efficiency factor
+!
+! This gives aerosol collection efficiency by calculating Reynolds number
+! schmidt number, stokes number, etc
+CALL AER_EFFIC(ZRG(:,:), ZVGG(:,:),   & !aerosol radius/velocity
+               ZRHODREF(:),           & !Air density
+               ZMUW(:), ZMU(:),       & !mu water/air
+               ZDPG(:,:), ZEFC(:,:),  & !diffusivity, efficiency
+               ZRRT(:), KMODE,        & !Rain water, nb aerosols modes
+               ZTEMP(:),ZCOR(:,:),    & ! Temperature, Cunnimgham coeff
+               ZDENSITY_AER(:,:),    &  ! aerosol density
+               ZRR, ZNT              )  ! radius and number of rain drops
+!
+END SUBROUTINE AER_WET_DEP_KMT_EFFIC
+!
+!-------------------------------------------------------------------------------
+!
+END SUBROUTINE AER_WET_DEP_KMT_WARM
diff --git a/src/PHYEX/ext/aero_effic3D.f90 b/src/PHYEX/ext/aero_effic3D.f90
new file mode 100644
index 0000000000000000000000000000000000000000..05d5e2ce113b62c25577b3a085670c1e4766cc38
--- /dev/null
+++ b/src/PHYEX/ext/aero_effic3D.f90
@@ -0,0 +1,247 @@
+!MNH_LIC Copyright 1994-2018 CNRS, Meteo-France and Universite Paul Sabatier
+!MNH_LIC This is part of the Meso-NH software governed by the CeCILL-C licence
+!MNH_LIC version 1. See LICENSE, CeCILL-C_V1-en.txt and CeCILL-C_V1-fr.txt  
+!MNH_LIC for details. version 1.
+!
+!     ######spll
+      MODULE MODI_AERO_EFFIC3D
+!!    ########################
+!!
+!
+INTERFACE
+!!
+SUBROUTINE AERO_EFFIC3D(PRG,PVGG,    & !aerosol radius/fall speed (m/s)
+                PRHODREF,           & !Air density     
+                PMUW, PMU,          & !mu water/air
+                PDPG,               & !diffusivity
+                PURR,               & ! Rain water m.r. at time t 
+                KMODE,             & ! Number of aerosol modes
+                PTEMP, PCOR,        & ! air temp, cunningham corr factor
+                PDENSITY_AER,       & ! aerosol density
+                PEFFIC_AER )          ! scavenging efficiency for aerosol
+!
+IMPLICIT NONE
+REAL, DIMENSION(:,:,:,:), INTENT(IN) ::  PRG,  PVGG
+REAL, DIMENSION(:,:,:),   INTENT(IN) ::  PRHODREF
+REAL, DIMENSION(:,:,:,:), INTENT(IN) ::  PDPG
+REAL, DIMENSION(:,:,:),   INTENT(IN) ::  PMU, PMUW
+REAL, DIMENSION(:,:,:),   INTENT(IN) :: PURR
+REAL, DIMENSION(:,:,:),   INTENT(IN) :: PTEMP
+REAL, DIMENSION(:,:,:,:), INTENT(IN) :: PCOR
+INTEGER, INTENT(IN)                  :: KMODE
+REAL, DIMENSION(:,:,:,:), INTENT(IN) :: PDENSITY_AER
+REAL, DIMENSION(:,:,:,:), INTENT(INOUT):: PEFFIC_AER
+
+
+
+END SUBROUTINE  AERO_EFFIC3D 
+!!
+END INTERFACE
+END MODULE MODI_AERO_EFFIC3D
+!     ######spll
+SUBROUTINE AERO_EFFIC3D(PRG,PVGG,    & !aerosol radius/fall speed (m/s)
+                PRHODREF,           & !Air density     
+                PMUW, PMU,          & !mu water/air
+                PDPG,               & !diffusivity
+                PURR,               & ! Rain water m.r. at time t 
+                KMODE,              & ! Number of aerosol modes
+                PTEMP, PCOR,        & ! air temp, cunningham corr factor
+                PDENSITY_AER,       & ! aerosol density
+                PEFFIC_AER )          ! scavenging efficiency for aerosol
+!!   #######################################
+!!**********AERO_EFFIC3D********** 
+!!   PURPOSE
+!!   -------
+!!  Calculate the collection efficiency of
+!   a falling drop interacting with a dust aerosol
+!   for use with aer_wet_dep_kmt_warm.f90
+!!
+!!**  METHOD
+!!    ------
+!!    Using basic theory, and the one dimensional variables sent 
+!!    from aer_wet_dep_kmt_warm.f90, calculation of the average 
+!!    fall speed calculations, chapter 17.3.4, MESONH Handbook
+!!    droplet number based on the Marshall_Palmer distribution
+!!    and Stokes number, Reynolds number, etc. based on theory
+!!    (S&P, p.1019)
+!!
+!!   REFERENCE
+!!   ---------
+!!   Seinfeld and Pandis p.1019
+!!   MESONH Handbook chapter 17.3.4
+!!
+!!   AUTHOR
+!!    ------
+!!   K. Crahan Kaku / P. Tulet (CNRM/GMEI)
+!!
+!!   MODIFICATIONS
+!!    -------------
+!!  Philippe Wautelet 28/05/2018: corrected truncated integer division (1/12 -> 1./12.)
+!!
+!-----------------------------------------------------------------
+!       
+!*      0. DECLARATIONS
+!          ------------
+!
+USE MODD_RAIN_ICE_PARAM_n
+USE MODD_RAIN_ICE_DESCR_n
+USE MODD_CST,         ONLY : XPI, XRHOLW, XP00, XRD
+USE MODD_PARAMETERS , ONLY : JPVEXT
+USE MODD_REF,         ONLY : XTHVREFZ
+!
+IMPLICIT NONE
+!
+!*      0.1  declarations of arguments
+!
+REAL, DIMENSION(:,:,:,:), INTENT(IN) ::  PRG,  PVGG
+REAL, DIMENSION(:,:,:),   INTENT(IN) ::  PRHODREF
+REAL, DIMENSION(:,:,:,:), INTENT(IN) ::  PDPG
+REAL, DIMENSION(:,:,:),   INTENT(IN) ::  PMU, PMUW
+REAL, DIMENSION(:,:,:),   INTENT(IN) :: PURR
+REAL, DIMENSION(:,:,:),   INTENT(IN) :: PTEMP
+REAL, DIMENSION(:,:,:,:), INTENT(IN) :: PCOR
+INTEGER, INTENT(IN)                  :: KMODE
+REAL, DIMENSION(:,:,:,:), INTENT(IN) :: PDENSITY_AER
+REAL, DIMENSION(:,:,:,:), INTENT(INOUT):: PEFFIC_AER
+!
+!*      0.2  declaration of local variables
+!
+INTEGER :: IKB                ! Coordinates of the first physical 
+                              ! points along z
+REAL :: ZRHO00                ! Surface reference air density
+!viscosity ratio, Reynolds number
+REAL, DIMENSION(SIZE(PRG,1),SIZE(PRG,2),SIZE(PRG,3)) :: ZOMG, ZREY
+!rain radius, m, and rain fall speed, m/s; aerosol radius (m),
+REAL, DIMENSION(SIZE(PRG,1),SIZE(PRG,2),SIZE(PRG,3)) :: ZRR, ZVR 
+!lambda, number concentration according to marshall palmer, 
+REAL, DIMENSION(SIZE(PRG,1),SIZE(PRG,2),SIZE(PRG,3)) :: ZNT, ZLBDA
+! Rain water m.r. source
+REAL, DIMENSION(SIZE(PRG,1),SIZE(PRG,2),SIZE(PRG,3)) :: ZRRS
+!RHO_dref*r_r, Rain LWC
+REAL, DIMENSION(SIZE(PRG,1),SIZE(PRG,2),SIZE(PRG,3)) :: ZRLWC
+! schmidts number
+REAL, DIMENSION(SIZE(PRG,1),SIZE(PRG,2),SIZE(PRG,3),KMODE) ::  ZSCH
+!
+!Stokes number, ratio of diameters,aerosol radius
+REAL, DIMENSION(SIZE(PRG,1),SIZE(PRG,2),SIZE(PRG,3),KMODE) :: ZSTO, ZPHI, ZRG
+! S Star Term
+REAL, DIMENSION(SIZE(PRG,1),SIZE(PRG,2),SIZE(PRG,3)) :: ZSTA, ZDIFF, ZTAU
+!
+!Term 1, Term 2, Term 3, Term 4 such that
+! E = Term1 * Term 2 + Term 3 + Term 4
+REAL, DIMENSION(SIZE(PRG,1),SIZE(PRG,2),SIZE(PRG,3),KMODE) :: ZT1, ZT2
+REAL, DIMENSION(SIZE(PRG,1),SIZE(PRG,2),SIZE(PRG,3),KMODE) :: ZT3, ZT4      
+!
+INTEGER :: JI,JK
+!
+!-----------------------------------------------------------------
+ZLBDA = 1E20
+ZNT = 1E-20
+ZRR = 10E-6
+ZRRS(:,:,:)=PURR(:,:,:)
+IKB = 1 + JPVEXT
+ZRHO00 = XP00/(XRD*XTHVREFZ(IKB))                                        
+ZRG(:,:,:,:)=PRG(:,:,:,:)*1.E-6 !change units to meters
+!
+!Fall Speed calculations
+!similar to rain_ice.f90, chapter 17.3.4, MESONH Handbook
+!
+ZVR (:,:,:)=  XFSEDR  * ZRRS(:,:,:)**(XEXSEDR-1) *   &
+          PRHODREF(:,:,:)**(XEXSEDR-XCEXVT-1) 
+
+! Drop Radius calculation in m 
+!lbda = pi*No*rho(lwc)/(rho(dref)*rain rate) p.212 MESONH Handbook
+! compute the slope parameter Lbda_r
+
+WHERE((ZRRS(:,:,:).GT. 0.).AND.(PRHODREF(:,:,:) .GT. 0.))
+
+ZLBDA(:,:,:)  = XLBR*(PRHODREF(:,:,:)*ZRRS(:,:,:))**XLBEXR
+!Number concentration NT=No/lbda   p. 415 Jacobson
+ZNT(:,:,:) = XCCR/ZLBDA(:,:,:)  
+!rain  lwc (kg/m3) =  rain m.r.(kg/kg) * rho_air(kg/m3)
+ZRLWC(:,:,:)=ZRRS(:,:,:)*PRHODREF(:,:,:)
+!4/3 *pi *r**3*NT*rho_eau(kg/m3) =rho(lwc)=rho(air)* qc(kg/kg)
+ZRR(:,:,:) =  (ZRLWC(:,:,:)/(XRHOLW*ZNT(:,:,:)*4./3.*XPI))**(1./3.)
+END WHERE
+
+ZRR(:,:,:) = MIN(ZRR(:,:,:), 100.E-6)
+
+
+!Fall speed cannot be faster than 7 m/s
+ZVR (:,:,:)=MIN(ZVR (:,:,:),7.)   
+
+
+!Ref SEINFELD AND PANDIS p.1019
+! Viscosity Ratio      
+ZOMG(:,:,:)=PMUW(:,:,:)/PMU(:,:,:)
+!!Reynolds number
+ZREY(:,:,:)=ZRR(:,:,:)*ZVR(:,:,:)*PRHODREF(:,:,:)/PMU(:,:,:)
+ZREY(:,:,:)= MAX(ZREY(:,:,:), 1E-2)
+
+
+!S Star
+ZSTA(:,:,:)=(1.2+(1./12.)*LOG(1.+ZREY(:,:,:)))/(1.+LOG(1.+ZREY(:,:,:)))
+
+PEFFIC_AER(:,:,:,:)=0.0
+
+DO JI=1,KMODE
+
+!
+!Scmidts number
+  ZSCH(:,:,:,JI)=PMU(:,:,:)/PRHODREF(:,:,:)/PDPG(:,:,:,JI)      
+! Rain-Aerosol relative velocity 
+  ZDIFF(:,:,:) = MAX(ZVR(:,:,:)-PVGG(:,:,:,JI),0.)
+
+
+! Relaxation time 
+  ZTAU(:,:,:) = (ZRG(:,:,:,JI)*2.)**2. * PDENSITY_AER(:,:,:,JI) * PCOR(:,:,:,JI) / (18.*PMU(:,:,:))
+
+
+! Stockes number
+  ZSTO(:,:,:,JI)= ZTAU(:,:,:) * ZDIFF(:,:,:) / ZRR(:,:,:)
+
+
+
+!Ratio of diameters  
+  ZPHI(:,:,:,JI)=ZRG(:,:,:,JI)/ZRR(:,:,:)
+  ZPHI(:,:,:,JI)=MIN(ZPHI(:,:,:,JI), 1.)
+!Term 1
+  ZT1(:,:,:,JI)=4.0/ZREY(:,:,:)/ZSCH(:,:,:,JI)
+
+!Term 2
+  ZT2(:,:,:,JI)=1.0+(0.4*ZREY(:,:,:)**(0.5)*ZSCH(:,:,:,JI)**(1./3.))+ &
+            (0.16*ZREY(:,:,:)**(0.5)*ZSCH(:,:,:,JI)**(0.5))   
+     
+!Brownian diffusion          
+  ZT1(:,:,:,JI)= ZT1(:,:,:,JI)*ZT2(:,:,:,JI)
+
+!Term 3 - interception
+  ZT3(:,:,:,JI)=4.*ZPHI(:,:,:,JI)*(1./ZOMG(:,:,:)+        &
+             (1.0+(2.0*ZREY(:,:,:)**0.5))*ZPHI(:,:,:,JI))
+
+  ZT4(:,:,:,JI)=0.0           
+ WHERE(ZSTO(:,:,:,JI).GT.ZSTA(:,:,:)) 
+!Term 4 - impaction
+   ZT4(:,:,:,JI)=((ZSTO(:,:,:,JI)-ZSTA(:,:,:))/            &
+              (ZSTO(:,:,:,JI)-ZSTA(:,:,:)+2./3.))**(3./2.) &
+             *((XRHOLW/PDENSITY_AER(:,:,:,JI))**(1./2.))
+
+  END WHERE
+
+!Collision Efficiancy 
+
+
+   PEFFIC_AER(:,:,:,JI)=ZT1(:,:,:,JI)+  ZT3(:,:,:,JI)+ZT4(:,:,:,JI)     
+
+! Physical radius of a rain collector droplet up than 20 um
+
+WHERE (ZRR(:,:,:) .LE. 9.9E-6)
+  PEFFIC_AER(:,:,:,JI)= 0.
+END WHERE
+
+ENDDO
+
+PEFFIC_AER(:,:,:,:)=MIN(PEFFIC_AER(:,:,:,:),1.0)
+PEFFIC_AER(:,:,:,:)=MAX(PEFFIC_AER(:,:,:,:),0.0)
+
+END SUBROUTINE AERO_EFFIC3D
diff --git a/src/PHYEX/ext/aircraft_balloon_evol.f90 b/src/PHYEX/ext/aircraft_balloon_evol.f90
new file mode 100644
index 0000000000000000000000000000000000000000..d59b33721819904ac9baabd7719c0572b91a2433
--- /dev/null
+++ b/src/PHYEX/ext/aircraft_balloon_evol.f90
@@ -0,0 +1,1037 @@
+!MNH_LIC Copyright 2000-2023 CNRS, Meteo-France and Universite Paul Sabatier
+!MNH_LIC This is part of the Meso-NH software governed by the CeCILL-C licence
+!MNH_LIC version 1. See LICENSE, CeCILL-C_V1-en.txt and CeCILL-C_V1-fr.txt
+!MNH_LIC for details. version 1.
+!-----------------------------------------------------------------
+! Author: Valery Masson (Meteo-France *)
+!     Original 15/05/2000
+! Modifications:
+!  G. Jaubert  19/04/2001: add CVBALL type
+!  P. Lacarrere   03/2008: add 3D fluxes
+!  M. Leriche  12/12/2008: move ZTDIST out from if.not.(tpflyer%fly)
+!  V. Masson   15/12/2008: correct do while aircraft move
+!  O. Caumont     03/2013: add radar reflectivities
+!  C. Lac         04/2014: allow RARE calculation only if CCLOUD=ICE3
+!  O. Caumont     05/2014: modify RARE for hydrometeors containing ice + add bright band calculation for RARE
+!  C. Lac 02/2015: correction to prevent aircraft crash
+!  O. Nuissier/F. Duffourg 07/2015: add microphysics diagnostic for aircraft, ballon and profiler
+!  G. Delautier   10/2016: LIMA
+!  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 13/09/2019: budget: simplify and modernize date/time management
+!  P. Wautelet 01/10/2020: bugfix: initialize GSTORE
+!  P. Wautelet 14/01/2021: bugfixes: -ZXCOEF and ZYCOEF were not computed if CVBALL
+!                                    -PCIT was used if CCLOUD/=ICEx (not allocated)
+!                                    -PSEA was always used even if not allocated (CSURF/=EXTE)
+!                                    -do not use PMAP if cartesian domain
+!  P. Wautelet    06/2022: reorganize flyers
+!  P. Wautelet 01/06/2023: deduplicate code => moved to modd/mode_sensors.f90
+!-----------------------------------------------------------------
+!      ##########################
+MODULE MODE_AIRCRAFT_BALLOON_EVOL
+!      ##########################
+
+USE MODE_MSG
+
+IMPLICIT NONE
+
+PRIVATE
+
+PUBLIC :: AIRCRAFT_BALLOON_EVOL
+
+PUBLIC :: AIRCRAFT_COMPUTE_POSITION
+
+PUBLIC :: FLYER_GET_RANK_MODEL_ISCRASHED
+
+CONTAINS
+!     ########################################################
+      SUBROUTINE AIRCRAFT_BALLOON_EVOL(PTSTEP,               &
+                       PZ, PMAP, PLONOR, PLATOR,             &
+                       PU, PV, PW, PP, PTH, PR, PSV, PTKE,   &
+                       PTS, PRHODREF, PCIT, TPFLYER,         &
+                       KRANK_CUR, KRANK_NXT, PSEA            )
+!     ########################################################
+!
+!
+!!****  *AIRCRAFT_BALLOON_EVOL* - (advects and) stores
+!!                                balloons/aircrafts in the model
+!!
+!!    PURPOSE
+!!    -------
+!
+!
+!!**  METHOD
+!!    ------
+!!
+!! 1) All the balloons are tested. If the current balloon is
+!!     a) in the current model
+!!     b) not crashed
+!!   the following computations are done.
+!!
+!! 2) The balloon position is computed.
+!!       Interpolations at balloon positions are performed according to mass
+!! points (because density is computed here for iso-density balloons).
+!! Therefore, all model variables are used at mass points. Shuman averaging
+!! are performed on X, Y, Z, U, V, W.
+!!
+!! 3) Storage of balloon data
+!!       If storage is asked for this time-step, the data are recorded in the
+!! balloon time-series.
+!!
+!! 4) Balloon advection
+!!       If the balloon is launched, it is advected according its type
+!!    a) iso-density balloons are advected following horizontal wind.
+!!          the slope of the iso-density surfaces is neglected.
+!!    b) radio-sounding balloons are advected according to all wind velocities.
+!!          the vertical ascent speed is added to the vertical wind speed.
+!!    c) Constant Volume balloons are advected according to all wind velocities.
+!!          the vertical ascent speed is computed using the balloon equation
+!!
+!!
+!!    EXTERNAL
+!!    --------
+!!
+!!    IMPLICIT ARGUMENTS
+!!    ------------------
+!!
+!!    REFERENCE
+!!    ---------
+!!
+!! --------------------------------------------------------------------------
+!
+!*      0. DECLARATIONS
+!          ------------
+!
+USE MODD_AIRCRAFT_BALLOON
+USE MODD_CST,              ONLY: XCPD, XLVTT
+USE MODD_IO,               ONLY: ISP
+USE MODD_TIME_n,           ONLY: TDTCUR
+USE MODD_TURB_FLUX_AIRCRAFT_BALLOON, ONLY: XRCW_FLUX, XSVW_FLUX, XTHW_FLUX
+!
+USE MODE_DATETIME
+USE MODE_NEST_ll,          ONLY: GET_MODEL_NUMBER_ll
+!
+IMPLICIT NONE
+!
+!
+!*      0.1  declarations of arguments
+!
+!
+REAL,                     INTENT(IN)     :: PTSTEP ! time step
+REAL, DIMENSION(:,:,:),   INTENT(IN)     :: PZ     ! z array
+REAL, DIMENSION(:,:),     INTENT(IN)     :: PMAP   ! map factor
+REAL,                     INTENT(IN)     :: PLONOR ! origine longitude
+REAL,                     INTENT(IN)     :: PLATOR ! origine latitude
+REAL, DIMENSION(:,:,:),   INTENT(IN)     :: PU     ! horizontal wind X component
+REAL, DIMENSION(:,:,:),   INTENT(IN)     :: PV     ! horizontal wind Y component
+REAL, DIMENSION(:,:,:),   INTENT(IN)     :: PW     ! vertical wind
+REAL, DIMENSION(:,:,:),   INTENT(IN)     :: PP     ! pressure
+REAL, DIMENSION(:,:,:),   INTENT(IN)     :: PTH    ! potential temperature
+REAL, DIMENSION(:,:,:,:), INTENT(IN)     :: PR     ! water mixing ratios
+REAL, DIMENSION(:,:,:,:), INTENT(IN)     :: PSV    ! Scalar variables
+REAL, DIMENSION(:,:,:),   INTENT(IN)     :: PTKE   ! turbulent kinetic energy
+REAL, DIMENSION(:,:),     INTENT(IN)     :: PTS    ! surface temperature
+REAL, DIMENSION(:,:,:),   INTENT(IN)     :: PRHODREF ! dry air density of the reference state
+REAL, DIMENSION(:,:,:),   INTENT(IN)     :: PCIT     ! pristine ice concentration
+!
+CLASS(TFLYERDATA),        INTENT(INOUT)  :: TPFLYER ! balloon/aircraft
+INTEGER,                  INTENT(IN)     :: KRANK_CUR
+INTEGER,                  INTENT(OUT)    :: KRANK_NXT
+REAL, DIMENSION(:,:), OPTIONAL, INTENT(IN) :: PSEA
+!
+!-------------------------------------------------------------------------------
+!
+!       0.2  declaration of local variables
+!
+!
+INTEGER :: IMI        ! model index
+INTEGER :: IKB        ! vertical domain sizes
+INTEGER :: IKE
+INTEGER :: IKU
+!
+REAL, DIMENSION(2,2,SIZE(PZ,3))     :: ZZM    ! mass point coordinates
+REAL, DIMENSION(2,2,SIZE(PZ,3))     :: ZZU    ! U points z coordinates
+REAL, DIMENSION(2,2,SIZE(PZ,3))     :: ZZV    ! V points z coordinates
+REAL, DIMENSION(2,2,SIZE(PZ,3))     :: ZWM    ! mass point wind
+!
+REAL, DIMENSION(2,2,SIZE(PTH,3))    :: ZEXN   ! Exner function
+REAL, DIMENSION(2,2,SIZE(PTH,3))    :: ZTH_EXN ! potential temperature multiplied by Exner function
+REAL, DIMENSION(2,2,SIZE(PTH,3))    :: ZRHO   ! air density
+REAL                                :: ZFLYER_EXN ! balloon/aircraft Exner func.
+REAL, DIMENSION(2,2,SIZE(PTH,3))    :: ZTHW_FLUX  !
+REAL, DIMENSION(2,2,SIZE(PTH,3))    :: ZRCW_FLUX  !
+REAL, DIMENSION(2,2,SIZE(PSV,3),SIZE(PSV,4)) :: ZSVW_FLUX
+!
+LOGICAL :: GLAUNCH  ! launch/takeoff is effective at this time-step (if true)
+LOGICAL :: GOWNER_CUR ! The process is the current owner of the flyer
+!
+INTEGER :: II_M     ! mass balloon position (x index)
+INTEGER :: IJ_M     ! mass balloon position (y index)
+INTEGER :: II_U     ! U flux point balloon position (x index)
+INTEGER :: IJ_V     ! V flux point balloon position (y index)
+!
+INTEGER :: ISTORE          ! time index for storage
+!
+REAL    :: ZTSTEP
+TYPE(DATE_TIME) :: TZNEXT ! Time for next position
+!----------------------------------------------------------------------------
+IKU = SIZE(PZ,3)
+
+CALL GET_MODEL_NUMBER_ll(IMI)
+
+! Set initial value for KRANK_NXT
+! It needs to be 0 on all processes except the one where it is when this subroutine is called
+! If the flyer flies to an other process, KRANK_NXT will be set accordingly by the current owner
+IF ( TPFLYER%NRANK_CUR == ISP ) THEN
+  GOWNER_CUR = .TRUE. ! This variable is set and used because NRANK_CUR could change in this subroutine
+  KRANK_NXT = ISP
+ELSE
+  GOWNER_CUR = .FALSE.
+  KRANK_NXT = 0
+END IF
+
+SELECT TYPE ( TPFLYER )
+  CLASS IS ( TAIRCRAFTDATA)
+    ! Take-off?
+    TAKEOFF: IF ( .NOT. TPFLYER%LTOOKOFF ) THEN
+      ! Do the take-off positioning only once
+      ! (on model 1 for 'MOB', if aircraft is on an other model, data will be available on the right one anyway)
+      IF (      ( TPFLYER%CMODEL == 'MOB' .AND. IMI == 1              ) &
+           .OR. ( TPFLYER%CMODEL == 'FIX' .AND. IMI == TPFLYER%NMODEL ) ) THEN
+        ! Is the aircraft in flight ?
+        IF ( TDTCUR >= TPFLYER%TLAUNCH .AND. TDTCUR <= TPFLYER%TLAND ) THEN
+          TPFLYER%LFLY     = .TRUE.
+          TPFLYER%LTOOKOFF = .TRUE.
+        END IF
+      END IF
+    END IF TAKEOFF
+
+    !Do we have to store aircraft data?
+    IF ( IMI == TPFLYER%NMODEL ) THEN
+      TPFLYER%LSTORE = TPFLYER%TFLYER_TIME%STORESTEP_CHECK_AND_SET( ISTORE )
+      IF ( TPFLYER%LSTORE ) TPFLYER%NSTORE_CUR = ISTORE
+    END IF
+
+
+    ! For aircrafts, data has only to be computed at store moments
+    IF ( IMI == TPFLYER%NMODEL .AND. TPFLYER%LFLY .AND. TPFLYER%LSTORE ) THEN
+      ! Check if it is the right moment to store data
+      IF ( ABS( TDTCUR - TPFLYER%TFLYER_TIME%TPDATES(ISTORE) ) < 1e-10 ) THEN
+        ISOWNERAIR: IF ( TPFLYER%NRANK_CUR == ISP ) THEN
+          CALL FLYER_INTERP_TO_MASSPOINTS()
+
+          ZEXN(:,:,:) = FLYER_COMPUTE_EXNER( )
+          ZRHO(:,:,:) = FLYER_COMPUTE_RHO( )
+
+          ZTHW_FLUX(:,:,:) = ZRHO(:,:,:)*XCPD *XTHW_FLUX(II_M:II_M+1,IJ_M:IJ_M+1,:)
+          ZRCW_FLUX(:,:,:) = ZRHO(:,:,:)*XLVTT*XRCW_FLUX(II_M:II_M+1,IJ_M:IJ_M+1,:)
+          ZSVW_FLUX(:,:,:,:) = XSVW_FLUX(II_M:II_M+1,IJ_M:IJ_M+1,:,:)
+
+          ! Compute coefficents for horizontal interpolations
+          CALL FLYER_COMPUTE_INTERP_COEFF_HOR_STAGE1( )
+          ! Compute coefficents for vertical interpolations
+          CALL FLYER_COMPUTE_INTERP_COEFF_VER( )
+          ! Compute coefficents for horizontal interpolations
+          CALL FLYER_COMPUTE_INTERP_COEFF_HOR_STAGE2( )
+
+          CALL FLYER_RECORD_DATA( )
+        END IF ISOWNERAIR
+
+        ! Store has been done
+        TPFLYER%LSTORE = .FALSE.
+      END IF
+    END IF
+
+    ! Compute next position if the previous store has just been done (right moment on right model)
+    IF ( IMI == TPFLYER%NMODEL .AND. ISTORE > 0 ) THEN
+      ! This condition may only be tested if ISTORE > 0
+      IF (ABS( TDTCUR - TPFLYER%TFLYER_TIME%TPDATES(ISTORE) ) < 1e-10 ) THEN
+        ! Next store moment
+        TZNEXT = TDTCUR + TPFLYER%TFLYER_TIME%XTSTEP
+
+        ! Is the aircraft in flight ?
+        IF ( TZNEXT >= TPFLYER%TLAUNCH .AND. TZNEXT <= TPFLYER%TLAND ) THEN
+          TPFLYER%LFLY = .TRUE.
+          ! Force LTOOKOFF to prevent to do it again (at a next timestep)
+          TPFLYER%LTOOKOFF = .TRUE.
+
+          ! Compute next position
+          CALL AIRCRAFT_COMPUTE_POSITION( TZNEXT, TPFLYER )
+
+          ! Get rank of the process where the aircraft is and the model number
+          CALL FLYER_GET_RANK_MODEL_ISCRASHED( TPFLYER )
+        ELSE
+          TPFLYER%LFLY = .FALSE.
+        END IF
+      END IF
+    END IF
+
+    IF ( GOWNER_CUR ) KRANK_NXT = TPFLYER%NRANK_CUR
+
+  CLASS IS ( TBALLOONDATA)
+    GLAUNCH = .FALSE. !Set to true only at the launch instant (set to false in flight after launch)
+
+    ! Launch?
+    LAUNCH: IF ( .NOT. TPFLYER%LFLY .AND. .NOT. TPFLYER%LCRASH .AND. TPFLYER%NMODEL == IMI ) THEN
+      ! Check if it is launchtime
+      LAUNCHTIME: IF ( ( TDTCUR - TPFLYER%TLAUNCH ) >= -1.e-10 ) THEN
+        TPFLYER%LFLY = .TRUE.
+        GLAUNCH = .TRUE.
+
+        TPFLYER%XX_CUR = TPFLYER%XXLAUNCH
+        TPFLYER%XY_CUR = TPFLYER%XYLAUNCH
+        TPFLYER%TPOS_CUR = TDTCUR
+      END IF LAUNCHTIME
+    END IF LAUNCH
+
+    ! Check if it is time to store data. This has also to be checked if the balloon
+    ! is not yet launched or is crashed (data is also written in these cases, but with default values)
+    IF ( TPFLYER%NMODEL == IMI .AND. &
+          ( .NOT. TPFLYER%LFLY .OR. TPFLYER%LCRASH .OR. ABS( TPFLYER%TPOS_CUR - TDTCUR ) < 1.e-8 ) ) THEN
+      !Do we have to store balloon data?
+      TPFLYER%LSTORE = TPFLYER%TFLYER_TIME%STORESTEP_CHECK_AND_SET( ISTORE )
+      IF ( TPFLYER%LSTORE ) TPFLYER%NSTORE_CUR = ISTORE
+    END IF
+
+    ! In flight
+    INFLIGHTONMODEL: IF ( TPFLYER%LFLY .AND. .NOT. TPFLYER%LCRASH .AND. TPFLYER%NMODEL == IMI &
+                          .AND. ABS( TPFLYER%TPOS_CUR - TDTCUR ) < 1.e-8 ) THEN
+      ISOWNERBAL: IF ( TPFLYER%NRANK_CUR == ISP ) THEN
+        CALL FLYER_INTERP_TO_MASSPOINTS()
+
+        ZEXN(:,:,:) = FLYER_COMPUTE_EXNER( )
+        ZRHO(:,:,:) = FLYER_COMPUTE_RHO( )
+
+        ZTHW_FLUX(:,:,:) = ZRHO(:,:,:)*XCPD *XTHW_FLUX(II_M:II_M+1,IJ_M:IJ_M+1,:)
+        ZRCW_FLUX(:,:,:) = ZRHO(:,:,:)*XLVTT*XRCW_FLUX(II_M:II_M+1,IJ_M:IJ_M+1,:)
+        ZSVW_FLUX(:,:,:,:) = XSVW_FLUX(II_M:II_M+1,IJ_M:IJ_M+1,:,:)
+
+        ! Compute coefficents for horizontal interpolations
+        CALL FLYER_COMPUTE_INTERP_COEFF_HOR_STAGE1( )
+
+        IF ( GLAUNCH ) CALL BALLOON_COMPUTE_INITIAL_VERTICAL_POSITION( TPFLYER )
+
+        ! Compute coefficents for vertical interpolations
+        CALL FLYER_COMPUTE_INTERP_COEFF_VER( )
+
+        CRASH_VERT: IF ( TPFLYER%LCRASH ) THEN
+          TPFLYER%LFLY = .FALSE.
+          WRITE( CMNHMSG(1), "( 'Balloon ', A, ' crashed the ', I2, '/', I2, '/', I4, ' at ', F18.12, &
+                                's (too low or too high)' )" )                                        &
+                 TRIM( TPFLYER%CNAME ), TDTCUR%NDAY, TDTCUR%NMONTH, TDTCUR%NYEAR, TDTCUR%XTIME
+          CALL PRINT_MSG( NVERB_WARNING, 'GEN', 'AIRCRAFT_BALLOON_EVOL', OLOCAL = .TRUE. )
+        ELSE CRASH_VERT
+          !No vertical crash
+
+          ! Compute coefficents for horizontal interpolations
+          CALL FLYER_COMPUTE_INTERP_COEFF_HOR_STAGE2( )
+
+          ! Check if it is the right moment to store data
+          IF ( TPFLYER%LSTORE ) THEN
+            ISTORE = TPFLYER%TFLYER_TIME%N_CUR
+            IF ( ABS( TDTCUR - TPFLYER%TFLYER_TIME%TPDATES(ISTORE) ) < 1e-10 ) THEN
+              CALL FLYER_RECORD_DATA( )
+            END IF
+          END IF
+
+          ! Compute next horizontal position (balloon advection)
+          CALL BALLOON_ADVECTION_HOR( TPFLYER )
+
+          ! Compute next vertical position (balloon advection)
+          CALL BALLOON_ADVECTION_VER( TPFLYER )
+
+          TPFLYER%TPOS_CUR = TDTCUR + ZTSTEP
+        END IF CRASH_VERT !end of no vertical crash branch
+      END IF ISOWNERBAL
+    END IF INFLIGHTONMODEL
+
+    IF ( GOWNER_CUR ) KRANK_NXT = TPFLYER%NRANK_CUR
+END SELECT
+
+CONTAINS
+
+!----------------------------------------------------------------------------
+!----------------------------------------------------------------------------
+SUBROUTINE BALLOON_COMPUTE_INITIAL_VERTICAL_POSITION( TPBALLOON )
+
+USE MODD_CST, ONLY: XCPD, XP00, XRD
+
+IMPLICIT NONE
+
+CLASS(TBALLOONDATA), INTENT(INOUT) :: TPBALLOON
+
+LOGICAL :: GLOW, GHIGH
+
+SELECT CASE ( TPBALLOON%CTYPE )
+  !
+  ! Iso-density balloon
+  !
+  CASE ( 'ISODEN' )
+    IF ( TPBALLOON%XALTLAUNCH /= XNEGUNDEF ) THEN
+      CALL TPBALLOON%COMPUTE_VERTICAL_INTERP_COEFF( 'MASS', TPBALLOON%XALTLAUNCH, ZZM, GLOW, GHIGH )
+      TPBALLOON%XRHO = TPBALLOON%INTERP_FROM_MASSPOINT( ZRHO )
+    ELSE IF ( TPBALLOON%XPRES /= XNEGUNDEF ) THEN
+      ZFLYER_EXN = (TPBALLOON%XPRES/XP00)**(XRD/XCPD)
+      CALL TPBALLOON%COMPUTE_VERTICAL_INTERP_COEFF( 'MASS', ZFLYER_EXN, ZEXN, GLOW, GHIGH )
+      TPBALLOON%XRHO = TPBALLOON%INTERP_FROM_MASSPOINT( ZRHO )
+    ELSE
+      CMNHMSG(1) = 'Error in balloon initial position (balloon ' // TRIM(TPBALLOON%CNAME) // ' )'
+      CMNHMSG(2) = 'neither initial ALTITUDE or PRESsure is given'
+      CMNHMSG(3) = 'Check your INI_BALLOON routine'
+      CALL PRINT_MSG( NVERB_FATAL, 'GEN', 'AIRCRAFT_BALLOON_EVOL', OLOCAL = .TRUE. )
+    END IF
+  !
+  ! Radiosounding balloon
+  !
+  CASE ( 'RADIOS' )
+    TPBALLOON%XZ_CUR = TPBALLOON%XALTLAUNCH
+    TPBALLOON%XZ_CUR = MAX ( TPBALLOON%XZ_CUR , ZZM(1,1,IKB) )
+    TPBALLOON%XZ_CUR = MAX ( TPBALLOON%XZ_CUR , ZZM(2,1,IKB) )
+    TPBALLOON%XZ_CUR = MAX ( TPBALLOON%XZ_CUR , ZZM(1,2,IKB) )
+    TPBALLOON%XZ_CUR = MAX ( TPBALLOON%XZ_CUR , ZZM(2,2,IKB) )
+    IF ( TPBALLOON%XZ_CUR > TPBALLOON%XALTLAUNCH ) THEN
+      WRITE( CMNHMSG(1), '(A)' ) 'initial vertical position of ' // TRIM( TPBALLOON%CNAME ) // ' was too low'
+      WRITE( CMNHMSG(2), '( "forced to ", EN12.3, " (instead of ", EN12.3, ")" )' ) TPBALLOON%XZ_CUR, TPBALLOON%XALTLAUNCH
+      CALL PRINT_MSG( NVERB_WARNING, 'GEN', 'BALLOON_COMPUTE_INITIAL_VERTICAL_POSITION', OLOCAL = .TRUE. )
+    END IF
+  !
+  ! Constant Volume Balloon
+  !
+  CASE ( 'CVBALL' )
+    IF ( TPBALLOON%XALTLAUNCH /= XNEGUNDEF ) THEN
+      CALL TPBALLOON%COMPUTE_VERTICAL_INTERP_COEFF( 'MASS', TPBALLOON%XALTLAUNCH, ZZM, GLOW, GHIGH )
+      IF ( GLOW ) THEN
+        TPBALLOON%XZ_CUR = TPBALLOON%XALTLAUNCH
+        TPBALLOON%XZ_CUR = MAX ( TPBALLOON%XZ_CUR , ZZM(1,1,IKB) )
+        TPBALLOON%XZ_CUR = MAX ( TPBALLOON%XZ_CUR , ZZM(2,1,IKB) )
+        TPBALLOON%XZ_CUR = MAX ( TPBALLOON%XZ_CUR , ZZM(1,2,IKB) )
+        TPBALLOON%XZ_CUR = MAX ( TPBALLOON%XZ_CUR , ZZM(2,2,IKB) )
+
+        WRITE( CMNHMSG(1), '(A)' ) 'initial vertical position of ' // TRIM( TPBALLOON%CNAME ) // ' was too low'
+        WRITE( CMNHMSG(2), '( "forced to ", EN12.3, " (instead of ", EN12.3, ")" )' ) TPBALLOON%XZ_CUR, TPBALLOON%XALTLAUNCH
+        CALL PRINT_MSG( NVERB_WARNING, 'GEN', 'BALLOON_COMPUTE_INITIAL_VERTICAL_POSITION', OLOCAL = .TRUE. )
+
+        !Recompute the vertical interpolation coefficients at the corrected vertical position
+        CALL TPBALLOON%COMPUTE_VERTICAL_INTERP_COEFF( 'MASS', TPBALLOON%XALTLAUNCH, ZZM, GLOW, GHIGH )
+      ELSE
+        TPBALLOON%XZ_CUR = TPBALLOON%INTERP_FROM_MASSPOINT( ZZM )
+      END IF
+      TPBALLOON%XRHO     = TPBALLOON%INTERP_FROM_MASSPOINT( ZRHO )
+    ELSE IF ( TPBALLOON%XPRES /= XNEGUNDEF ) THEN
+      ZFLYER_EXN = (TPBALLOON%XPRES/XP00)**(XRD/XCPD)
+      CALL TPBALLOON%COMPUTE_VERTICAL_INTERP_COEFF( 'MASS', ZFLYER_EXN, ZEXN, GLOW, GHIGH )
+      IF ( GLOW ) THEN
+        TPBALLOON%XZ_CUR = ZZM(1,1,IKB)
+        TPBALLOON%XZ_CUR = MAX ( TPBALLOON%XZ_CUR , ZZM(2,1,IKB) )
+        TPBALLOON%XZ_CUR = MAX ( TPBALLOON%XZ_CUR , ZZM(1,2,IKB) )
+        TPBALLOON%XZ_CUR = MAX ( TPBALLOON%XZ_CUR , ZZM(2,2,IKB) )
+
+        WRITE( CMNHMSG(1), '(A)' ) 'initial vertical position of ' // TRIM( TPBALLOON%CNAME ) // ' was too low'
+        WRITE( CMNHMSG(2), '( "forced to ", EN12.3 )' ) TPBALLOON%XZ_CUR
+        CALL PRINT_MSG( NVERB_WARNING, 'GEN', 'BALLOON_COMPUTE_INITIAL_VERTICAL_POSITION', OLOCAL = .TRUE. )
+
+        !Recompute the vertical interpolation coefficients at the corrected vertical position
+        CALL TPBALLOON%COMPUTE_VERTICAL_INTERP_COEFF( 'MASS', TPBALLOON%XZ_CUR, ZZM, GLOW, GHIGH )
+      ELSE
+        TPBALLOON%XZ_CUR = TPBALLOON%INTERP_FROM_MASSPOINT( ZZM )
+      END IF
+      TPBALLOON%XRHO     = TPBALLOON%INTERP_FROM_MASSPOINT( ZRHO )
+    ELSE
+      TPBALLOON%XRHO = TPBALLOON%XMASS / TPBALLOON%XVOLUME
+      CALL TPBALLOON%COMPUTE_VERTICAL_INTERP_COEFF( 'MASS', TPBALLOON%XRHO, ZRHO, GLOW, GHIGH )
+      IF ( GLOW ) THEN
+        TPBALLOON%XZ_CUR = ZZM(1,1,IKB)
+        TPBALLOON%XZ_CUR = MAX ( TPBALLOON%XZ_CUR , ZZM(2,1,IKB) )
+        TPBALLOON%XZ_CUR = MAX ( TPBALLOON%XZ_CUR , ZZM(1,2,IKB) )
+        TPBALLOON%XZ_CUR = MAX ( TPBALLOON%XZ_CUR , ZZM(2,2,IKB) )
+
+        WRITE( CMNHMSG(1), '(A)' ) 'initial vertical position of ' // TRIM( TPBALLOON%CNAME ) // ' was too low'
+        WRITE( CMNHMSG(2), '( "forced to ", EN12.3 )' ) TPBALLOON%XZ_CUR
+        CALL PRINT_MSG( NVERB_WARNING, 'GEN', 'BALLOON_COMPUTE_INITIAL_VERTICAL_POSITION', OLOCAL = .TRUE. )
+
+        !Recompute the vertical interpolation coefficients at the corrected vertical position
+        CALL TPBALLOON%COMPUTE_VERTICAL_INTERP_COEFF( 'MASS', TPBALLOON%XZ_CUR, ZZM, GLOW, GHIGH )
+      ELSE
+        TPBALLOON%XZ_CUR = TPBALLOON%INTERP_FROM_MASSPOINT( ZZM )
+      END IF
+    END IF
+END SELECT
+
+END SUBROUTINE BALLOON_COMPUTE_INITIAL_VERTICAL_POSITION
+!----------------------------------------------------------------------------
+!----------------------------------------------------------------------------
+SUBROUTINE BALLOON_ADVECTION_HOR( TPBALLOON )
+
+USE MODD_AIRCRAFT_BALLOON, ONLY: TBALLOONDATA
+USE MODD_CONF,             ONLY: LCARTESIAN
+USE MODD_NESTING,          ONLY: NDAD, NDTRATIO
+USE MODD_TIME,             only: TDTSEG
+USE MODD_TIME_n,           ONLY: TDTCUR
+
+IMPLICIT NONE
+
+CLASS(TBALLOONDATA), INTENT(INOUT) :: TPBALLOON
+
+INTEGER :: IMODEL
+INTEGER :: IMODEL_OLD
+REAL    :: ZX_OLD, ZY_OLD
+REAL    :: ZDELTATIME
+REAL    :: ZDIVTMP
+REAL    :: ZMAP     ! map factor at balloon location
+REAL    :: ZU_BAL   ! horizontal wind speed at balloon location (along x)
+REAL    :: ZV_BAL   ! horizontal wind speed at balloon location (along y)
+
+ZTSTEP = PTSTEP
+
+ZU_BAL = TPBALLOON%INTERP_FROM_UPOINT( PU )
+ZV_BAL = TPBALLOON%INTERP_FROM_VPOINT( PV )
+if ( .not. lcartesian ) then
+  ZMAP = TPBALLOON%INTERP_HOR_FROM_MASSPOINT( PMAP )
+else
+  ZMAP = 1.
+end if
+!
+ZX_OLD = TPBALLOON%XX_CUR
+ZY_OLD = TPBALLOON%XY_CUR
+
+TPBALLOON%XX_CUR = TPBALLOON%XX_CUR + ZU_BAL * ZTSTEP * ZMAP
+TPBALLOON%XY_CUR = TPBALLOON%XY_CUR + ZV_BAL * ZTSTEP * ZMAP
+
+! Compute rank and model for next position
+! This is done here because we need to check if there is a change of model (for 'MOB' balloons)
+! because position has to be adapted to the timestep of a coarser model (if necessary)
+IMODEL_OLD = TPBALLOON%NMODEL
+
+! Get rank of the process where the balloon is and the model number
+CALL FLYER_GET_RANK_MODEL_ISCRASHED( TPBALLOON )
+
+IF ( TPBALLOON%LCRASH ) THEN
+  WRITE( CMNHMSG(1), "( 'Balloon ', A, ' crashed the ', I2, '/', I2, '/', I4, ' at ', F18.12, &
+                      's (out of the horizontal boundaries)' )" ) &
+    TRIM( TPBALLOON%CNAME ), TDTCUR%NDAY, TDTCUR%NMONTH, TDTCUR%NYEAR, TDTCUR%XTIME
+  CALL PRINT_MSG( NVERB_WARNING, 'GEN', 'AIRCRAFT_BALLOON_EVOL', OLOCAL = .TRUE. )
+END IF
+
+IF ( TPBALLOON%NMODEL /= IMODEL_OLD .AND. .NOT. TPBALLOON%LCRASH ) THEN
+  ! Balloon has changed of model
+  IF ( NDAD(TPBALLOON%NMODEL ) == IMODEL_OLD ) THEN
+    ! Nothing special to do when going to child model
+  ELSE IF ( TPBALLOON%NMODEL == NDAD(IMODEL_OLD) ) THEN
+    ! Balloon go to parent model
+    ! Recompute position to be compatible with parent timestep
+    ! Parent timestep could be bigger (factor NDTRATIO) and therefore next position is not the one computed just before
+
+    ! Determine step compatible with parent model at next parent timestep
+    ZDELTATIME = TDTCUR - TDTSEG
+    ZDIVTMP = ZDELTATIME / ( PTSTEP * NDTRATIO(IMODEL_OLD) )
+    IF ( ABS( ZDIVTMP - NINT( ZDIVTMP ) ) < 1E-6 * PTSTEP * NDTRATIO(IMODEL_OLD) ) THEN
+      ! Current time is a multiple of parent timestep => next position is parent timestep
+      ZTSTEP = ZTSTEP * NDTRATIO(IMODEL_OLD)
+    ELSE
+      ! Current time is not a multiple of parent timestep
+      ! Next position must be a multiple of parent timestep
+      ! NINT( NDTRATIO(IMODEL_OLD) * ( 1 - ( ZDIVTMP - INT( ZDIVTMP ) ) ) ) corresponds to the number
+      ! of child timesteps to go to the next parent timestep
+      ! We skip one timestep (+NDTRATIO(IMODEL_OLD)) because it has already been computed for the parent model
+      ZTSTEP = ZTSTEP * ( NINT( NDTRATIO(IMODEL_OLD) * ( 1 - ( ZDIVTMP - INT( ZDIVTMP ) ) ) ) + NDTRATIO(IMODEL_OLD) )
+
+      ! Detect if we need to skip a store (if time of next position is after time of next store)
+      ! This can happen when a ballon goes to its parent model
+      IF ( TDTCUR + ZTSTEP > TPBALLOON%TFLYER_TIME%TPDATES(TPBALLOON%TFLYER_TIME%N_CUR) + TPBALLOON%TFLYER_TIME%XTSTEP + 1e-6 ) THEN
+        !Force a dummy store (nothing is computed, therefore default/initial values will be stored)
+        TPBALLOON%LSTORE = .TRUE.
+
+        TPBALLOON%TFLYER_TIME%N_CUR = TPBALLOON%TFLYER_TIME%N_CUR + 1
+        ISTORE = TPBALLOON%TFLYER_TIME%N_CUR
+
+        !Remark: by construction here, ISTORE is always > 1 => no risk with ISTORE-1 value
+        TPBALLOON%TFLYER_TIME%TPDATES(ISTORE) = TPBALLOON%TFLYER_TIME%TPDATES(ISTORE-1) + TPBALLOON%TFLYER_TIME%XTSTEP
+
+        WRITE( CMNHMSG(1), "( 'Balloon ', A, ': store skipped at ', I2, '/', I2, '/', I4, ' at ', F18.12, 's' )" ) &
+               TRIM( TPBALLOON%CNAME ),                                                                            &
+               TPBALLOON%TFLYER_TIME%TPDATES(ISTORE)%NDAY,  TPBALLOON%TFLYER_TIME%TPDATES(ISTORE)%NMONTH,          &
+               TPBALLOON%TFLYER_TIME%TPDATES(ISTORE)%NYEAR, TPBALLOON%TFLYER_TIME%TPDATES(ISTORE)%XTIME
+        CMNHMSG(2) = 'due to change of model (child to its parent)'
+        CALL PRINT_MSG( NVERB_WARNING, 'GEN', 'AIRCRAFT_BALLOON_EVOL', OLOCAL = .TRUE. )
+      END IF
+    END IF
+
+    ! Compute new horizontal position
+    TPBALLOON%XX_CUR = TPBALLOON%XX_CUR + ZU_BAL * ZTSTEP * ZMAP
+    TPBALLOON%XY_CUR = TPBALLOON%XY_CUR + ZV_BAL * ZTSTEP * ZMAP
+
+    ! Get rank of the process where the balloon is and the model number
+    ! Model number is now imposed
+    IMODEL = TPBALLOON%NMODEL
+    CALL FLYER_GET_RANK_MODEL_ISCRASHED( TPBALLOON, KMODEL = IMODEL )
+    IF ( TPBALLOON%LCRASH ) THEN
+      WRITE( CMNHMSG(1), "( 'Balloon ', A, ' crashed the ', I2, '/', I2, '/', I4, ' at ', F18.12, &
+                         's (out of the horizontal boundaries)' )" ) &
+        TRIM( TPBALLOON%CNAME ), TDTCUR%NDAY, TDTCUR%NMONTH, TDTCUR%NYEAR, TDTCUR%XTIME
+      CALL PRINT_MSG( NVERB_WARNING, 'GEN', 'AIRCRAFT_BALLOON_EVOL', OLOCAL = .TRUE. )
+    END IF
+  ELSE
+    ! Special case not-managed (different dads, change of several models in 1 step (going to grand parent/grand children)...)
+    ! This situation should be very infrequent => reasonable risk, error on the trajectory should be relatively small in most cases
+    CMNHMSG(1) = 'unmanaged change of model for ballon ' // TPBALLOON%CNAME
+    CMNHMSG(2) = 'its trajectory might be wrong'
+    CALL PRINT_MSG( NVERB_WARNING, 'GEN', 'AIRCRAFT_BALLOON_EVOL', OLOCAL = .TRUE. )
+  END IF
+END IF
+
+END SUBROUTINE BALLOON_ADVECTION_HOR
+!----------------------------------------------------------------------------
+!----------------------------------------------------------------------------
+SUBROUTINE BALLOON_ADVECTION_VER( TPBALLOON )
+
+USE MODD_AIRCRAFT_BALLOON, ONLY: TBALLOONDATA
+USE MODD_CST,              ONLY: XG
+
+IMPLICIT NONE
+
+CLASS(TBALLOONDATA), INTENT(INOUT) :: TPBALLOON
+
+INTEGER :: JK ! loop index
+REAL    :: ZRO_BAL  ! air density at balloon location
+REAL    :: ZW_BAL   ! vertical   wind speed at balloon location (along z)
+
+IF ( TPBALLOON%CTYPE == 'RADIOS' ) THEN
+  ZW_BAL = TPBALLOON%INTERP_FROM_MASSPOINT( ZWM )
+  TPBALLOON%XZ_CUR = TPBALLOON%XZ_CUR + ( ZW_BAL + TPBALLOON%XWASCENT ) * ZTSTEP
+END IF
+
+IF ( TPBALLOON%CTYPE == 'CVBALL' ) THEN
+  ZW_BAL  = TPBALLOON%INTERP_FROM_MASSPOINT( ZWM )
+  ZRO_BAL = TPBALLOON%INTERP_FROM_MASSPOINT( ZRHO )
+  ! calculation with a time step of 1 second or less
+  IF (INT(ZTSTEP) .GT. 1 ) THEN
+    DO JK=1,INT(ZTSTEP)
+      TPBALLOON%XWASCENT = TPBALLOON%XWASCENT &
+        -  ( 1. / (1. + TPBALLOON%XINDDRAG ) ) * 1. * &
+           ( XG * ( ( TPBALLOON%XMASS / TPBALLOON%XVOLUME ) - ZRO_BAL ) / ( TPBALLOON%XMASS / TPBALLOON%XVOLUME ) &
+              + TPBALLOON%XWASCENT * ABS ( TPBALLOON%XWASCENT ) * &
+                TPBALLOON%XDIAMETER * TPBALLOON%XAERODRAG / ( 2. * TPBALLOON%XVOLUME ) &
+            )
+      TPBALLOON%XZ_CUR = TPBALLOON%XZ_CUR + ( ZW_BAL + TPBALLOON%XWASCENT ) * 1.
+    END DO
+  END IF
+  IF (ZTSTEP .GT. INT(ZTSTEP)) THEN
+    TPBALLOON%XWASCENT = TPBALLOON%XWASCENT &
+      -  ( 1. / (1. + TPBALLOON%XINDDRAG ) ) * (ZTSTEP-INT(ZTSTEP)) * &
+         ( XG * ( ( TPBALLOON%XMASS / TPBALLOON%XVOLUME ) - ZRO_BAL ) / ( TPBALLOON%XMASS / TPBALLOON%XVOLUME ) &
+            + TPBALLOON%XWASCENT * ABS ( TPBALLOON%XWASCENT ) * &
+              TPBALLOON%XDIAMETER * TPBALLOON%XAERODRAG / ( 2. * TPBALLOON%XVOLUME ) &
+          )
+    TPBALLOON%XZ_CUR = TPBALLOON%XZ_CUR + ( ZW_BAL + TPBALLOON%XWASCENT ) * (ZTSTEP-INT(ZTSTEP))
+  END IF
+END IF
+
+END SUBROUTINE BALLOON_ADVECTION_VER
+!----------------------------------------------------------------------------
+!----------------------------------------------------------------------------
+SUBROUTINE FLYER_INTERP_TO_MASSPOINTS()
+
+USE MODD_GRID_n,     ONLY: XXHAT, XXHATM, XYHAT, XYHATM
+USE MODD_PARAMETERS, ONLY: JPVEXT
+
+IMPLICIT NONE
+
+INTEGER :: IDU      ! difference between II_U and II_M
+INTEGER :: IDV      ! difference between IJ_V and IJ_M
+
+! Indices
+IKB =   1   + JPVEXT
+IKE = SIZE(PZ,3) - JPVEXT
+
+! Interpolations of model variables to mass points
+! ------------------------------------------------
+
+! X position
+TPFLYER%NI_U = COUNT( XXHAT (:) <= TPFLYER%XX_CUR )
+TPFLYER%NI_M = COUNT( XXHATM(:) <= TPFLYER%XX_CUR )
+II_U = TPFLYER%NI_U
+II_M = TPFLYER%NI_M
+
+! Y position
+TPFLYER%NJ_V = COUNT( XYHAT (:)<=TPFLYER%XY_CUR )
+TPFLYER%NJ_M = COUNT( XYHATM(:)<=TPFLYER%XY_CUR )
+IJ_V = TPFLYER%NJ_V
+IJ_M = TPFLYER%NJ_M
+
+ZZM(:,:,1:IKU-1)=0.5 *PZ(II_M  :II_M+1,IJ_M  :IJ_M+1,1:IKU-1)+0.5 *PZ(II_M  :II_M+1,IJ_M  :IJ_M+1,2:IKU  )
+ZZM(:,:,  IKU  )=1.5 *PZ(II_M  :II_M+1,IJ_M  :IJ_M+1,  IKU-1)-0.5 *PZ(II_M  :II_M+1,IJ_M  :IJ_M+1,  IKU-2)
+
+IDU = II_U - II_M
+ZZU(:,:,1:IKU-1)=0.25*PZ(IDU+II_M-1:IDU+II_M,  IJ_M  :IJ_M+1,1:IKU-1)+0.25*PZ(IDU+II_M-1:IDU+II_M  ,IJ_M  :IJ_M+1,2:IKU  ) &
+                +0.25*PZ(IDU+II_M  :IDU+II_M+1,IJ_M  :IJ_M+1,1:IKU-1)+0.25*PZ(IDU+II_M  :IDU+II_M+1,IJ_M  :IJ_M+1,2:IKU  )
+ZZU(:,:,  IKU  )=0.75*PZ(IDU+II_M-1:IDU+II_M  ,IJ_M  :IJ_M+1,  IKU-1)-0.25*PZ(IDU+II_M-1:IDU+II_M  ,IJ_M  :IJ_M+1,  IKU-2) &
+                +0.75*PZ(IDU+II_M  :IDU+II_M+1,IJ_M  :IJ_M+1,  IKU-1)-0.25*PZ(IDU+II_M  :IDU+II_M+1,IJ_M  :IJ_M+1,  IKU-2)
+
+IDV = IJ_V - IJ_M
+ZZV(:,:,1:IKU-1)=0.25*PZ(II_M  :II_M+1,IDV+IJ_M-1:IDV+IJ_M  ,1:IKU-1)+0.25*PZ(II_M  :II_M+1,IDV+IJ_M-1:IDV+IJ_M  ,2:IKU  ) &
+                +0.25*PZ(II_M  :II_M+1,IDV+IJ_M  :IDV+IJ_M+1,1:IKU-1)+0.25*PZ(II_M  :II_M+1,IDV+IJ_M  :IDV+IJ_M+1,2:IKU  )
+ZZV(:,:,  IKU  )=0.75*PZ(II_M  :II_M+1,IDV+IJ_M-1:IDV+IJ_M  ,  IKU-1)-0.25*PZ(II_M  :II_M+1,IDV+IJ_M-1:IDV+IJ_M  ,  IKU-2) &
+                +0.75*PZ(II_M  :II_M+1,IDV+IJ_M  :IDV+IJ_M+1,  IKU-1)-0.25*PZ(II_M  :II_M+1,IDV+IJ_M  :IDV+IJ_M+1,  IKU-2)
+
+ZWM(:,:,1:IKU-1)=0.5*PW(II_M:II_M+1,IJ_M:IJ_M+1,1:IKU-1)+0.5*PW(II_M:II_M+1,IJ_M:IJ_M+1,2:IKU  )
+ZWM(:,:,  IKU  )=1.5*PW(II_M:II_M+1,IJ_M:IJ_M+1,  IKU-1)-0.5*PW(II_M:II_M+1,IJ_M:IJ_M+1,  IKU-2)
+
+END SUBROUTINE FLYER_INTERP_TO_MASSPOINTS
+!----------------------------------------------------------------------------
+!----------------------------------------------------------------------------
+PURE FUNCTION FLYER_COMPUTE_EXNER( ) RESULT( PEXN )
+
+USE MODD_CST, ONLY: XCPD, XP00, XRD
+
+IMPLICIT NONE
+
+REAL, DIMENSION(2,2,SIZE(PTH,3)) :: PEXN
+
+INTEGER :: JK
+
+PEXN(:,:,:) = ( PP(II_M:II_M+1, IJ_M:IJ_M+1, :) / XP00) ** ( XRD / XCPD )
+DO JK = IKB-1, 1, -1
+  PEXN(:,:,JK) = 1.5 * PEXN(:,:,JK+1) - 0.5 * PEXN(:,:,JK+2)
+END DO
+DO JK = IKE+1, IKU
+  PEXN(:,:,JK) = 1.5 * PEXN(:,:,JK-1) - 0.5 * PEXN(:,:,JK-2)
+END DO
+
+END FUNCTION FLYER_COMPUTE_EXNER
+!----------------------------------------------------------------------------
+!----------------------------------------------------------------------------
+PURE FUNCTION FLYER_COMPUTE_RHO( ) RESULT( PRHO )
+
+USE MODD_CST, ONLY: XRD, XRV
+
+USE MODI_WATER_SUM
+
+IMPLICIT NONE
+
+REAL, DIMENSION(2,2,SIZE(PTH,3)) :: PRHO
+
+INTEGER                          :: JK
+REAL, DIMENSION(2,2,SIZE(PTH,3)) :: ZTHV ! virtual potential temperature
+
+ZTHV(:,:,:) = PTH(II_M:II_M+1, IJ_M:IJ_M+1, :)
+IF ( SIZE( PR, 4 ) > 0 )                                                              &
+  ZTHV(:,:,:) = ZTHV(:,:,:) * ( 1. + XRV / XRD * PR(II_M:II_M+1, IJ_M:IJ_M+1, :, 1) ) &
+                            / ( 1. + WATER_SUM( PR(II_M:II_M+1, IJ_M:IJ_M+1, :, :)) )
+!
+PRHO(:,:,:) = PP(II_M:II_M+1, IJ_M:IJ_M+1, :) / ( XRD * ZTHV(:,:,:) * ZEXN(:,:,:) )
+DO JK = IKB-1, 1, -1
+  PRHO(:,:,JK) = 1.5 * PRHO(:,:,JK+1) - 0.5 * PRHO(:,:,JK+2)
+END DO
+DO JK = IKE+1, IKU
+  PRHO(:,:,JK) = 1.5 * PRHO(:,:,JK-1) - 0.5 * PRHO(:,:,JK-2)
+END DO
+
+END FUNCTION FLYER_COMPUTE_RHO
+!----------------------------------------------------------------------------
+!----------------------------------------------------------------------------
+SUBROUTINE FLYER_COMPUTE_INTERP_COEFF_HOR_STAGE1( )
+! Compute coefficents for horizontal interpolations (1st stage)
+
+USE MODD_GRID_n, ONLY: XXHAT, XXHATM, XYHAT, XYHATM
+
+IMPLICIT NONE
+
+! Interpolation coefficient for X
+TPFLYER%XXMCOEF = ( TPFLYER%XX_CUR - XXHATM(II_M) ) / ( XXHATM(II_M+1) - XXHATM(II_M) )
+TPFLYER%XXMCOEF = MAX( 0., MIN( TPFLYER%XXMCOEF, 1. ) )
+
+! Interpolation coefficient for y
+TPFLYER%XYMCOEF = ( TPFLYER%XY_CUR - XYHATM(IJ_M) ) / ( XYHATM(IJ_M+1) - XYHATM(IJ_M) )
+TPFLYER%XYMCOEF = MAX( 0., MIN( TPFLYER%XYMCOEF, 1. ) )
+
+! Interpolation coefficient for X (for U)
+TPFLYER%XXUCOEF = ( TPFLYER%XX_CUR - XXHAT(II_U) ) / ( XXHAT(II_U+1) - XXHAT(II_U) )
+TPFLYER%XXUCOEF = MAX( 0., MIN( TPFLYER%XXUCOEF, 1. ) )
+
+! Interpolation coefficient for y (for V)
+TPFLYER%XYVCOEF = ( TPFLYER%XY_CUR - XYHAT(IJ_V) ) / ( XYHAT(IJ_V+1) - XYHAT(IJ_V) )
+TPFLYER%XYVCOEF = MAX( 0., MIN( TPFLYER%XYVCOEF, 1. ) )
+
+END SUBROUTINE FLYER_COMPUTE_INTERP_COEFF_HOR_STAGE1
+!----------------------------------------------------------------------------
+!----------------------------------------------------------------------------
+SUBROUTINE FLYER_COMPUTE_INTERP_COEFF_VER( )
+! Compute coefficent for vertical interpolations
+
+USE MODD_CST,    ONLY: XCPD, XP00, XRD
+USE MODD_TIME_n, ONLY: TDTCUR
+
+IMPLICIT NONE
+
+LOGICAL :: GLOW, GHIGH
+
+! Find indices surrounding the vertical box where the flyer is
+SELECT TYPE ( TPFLYER )
+  CLASS IS ( TAIRCRAFTDATA)
+    IF ( TPFLYER%LALTDEF ) THEN
+      ZFLYER_EXN = (TPFLYER%XP_CUR/XP00)**(XRD/XCPD)
+      CALL TPFLYER%COMPUTE_VERTICAL_INTERP_COEFF( 'MASS', ZFLYER_EXN,     ZEXN, GLOW, GHIGH, ODONOLOWCRASH = .TRUE. )
+    ELSE
+      CALL TPFLYER%COMPUTE_VERTICAL_INTERP_COEFF( 'MASS', TPFLYER%XZ_CUR, ZZM,  GLOW, GHIGH, ODONOLOWCRASH = .TRUE. )
+    END IF
+
+  CLASS IS ( TBALLOONDATA)
+    IF ( TPFLYER%CTYPE == 'ISODEN' ) THEN
+      CALL TPFLYER%COMPUTE_VERTICAL_INTERP_COEFF( 'MASS', TPFLYER%XRHO,   ZRHO, GLOW, GHIGH, ODONOLOWCRASH = .TRUE. )
+    ELSE IF ( TPFLYER%CTYPE == 'RADIOS' .OR. TPFLYER%CTYPE == 'CVBALL' ) THEN
+      CALL TPFLYER%COMPUTE_VERTICAL_INTERP_COEFF( 'MASS', TPFLYER%XZ_CUR, ZZM,  GLOW, GHIGH, ODONOLOWCRASH = .TRUE. )
+    END IF
+
+END SELECT
+
+! Check if the flyer crashed vertically (higher bound)
+IF ( GHIGH ) THEN
+  TPFLYER%LCRASH = .TRUE.
+  TPFLYER%NCRASH = NCRASH_OUT_HIGH
+END IF
+
+SELECT TYPE ( TPFLYER )
+  CLASS IS ( TAIRCRAFTDATA)
+    IF ( TPFLYER%LALTDEF ) THEN
+      TPFLYER%XZ_CUR = TPFLYER%INTERP_FROM_MASSPOINT( ZZM )
+    ELSE
+      TPFLYER%XP_CUR = TPFLYER%INTERP_FROM_MASSPOINT( PP )
+    END IF
+
+  CLASS IS ( TBALLOONDATA)
+    IF ( TPFLYER%CTYPE == 'ISODEN' ) THEN
+      TPFLYER%XZ_CUR = TPFLYER%INTERP_FROM_MASSPOINT( ZZM )
+    ELSE IF ( TPFLYER%CTYPE == 'RADIOS' .OR. TPFLYER%CTYPE == 'CVBALL' ) THEN
+      !Nothing to do
+    END IF
+
+END SELECT
+
+END SUBROUTINE FLYER_COMPUTE_INTERP_COEFF_VER
+!----------------------------------------------------------------------------
+!----------------------------------------------------------------------------
+SUBROUTINE FLYER_COMPUTE_INTERP_COEFF_HOR_STAGE2( )
+! Compute coefficents for horizontal interpolations (2nd stage)
+! This stage must be done after FLYER_COMPUTE_INTERP_COEFF_VER because we should need XZ_CUR computed in it
+
+IMPLICIT NONE
+
+LOGICAL :: GLOW, GHIGH
+
+! Interpolation coefficients for the 4 surroundings verticals (for U)
+! ODONOLOWCRASH = .TRUE. because check for low crash has already been done
+CALL TPFLYER%COMPUTE_VERTICAL_INTERP_COEFF( 'U', TPFLYER%XZ_CUR, ZZU, GLOW, GHIGH, ODONOLOWCRASH = .TRUE. )
+
+! Interpolation coefficients for the 4 suroundings verticals (for V)
+CALL TPFLYER%COMPUTE_VERTICAL_INTERP_COEFF( 'V', TPFLYER%XZ_CUR, ZZV, GLOW, GHIGH, ODONOLOWCRASH = .TRUE. )
+
+END SUBROUTINE FLYER_COMPUTE_INTERP_COEFF_HOR_STAGE2
+!----------------------------------------------------------------------------
+!----------------------------------------------------------------------------
+SUBROUTINE FLYER_RECORD_DATA( )
+
+USE MODD_CST,              ONLY: XP00, XPI, XRD
+USE MODD_DIAG_IN_RUN,      ONLY: XCURRENT_TKE_DISS
+USE MODD_GRID,             ONLY: XBETA, XLON0, XRPK
+USE MODD_NSV,              ONLY: NSV_LIMA_NC, NSV_LIMA_NR, NSV_LIMA_NI
+USE MODD_PARAMETERS,       ONLY: JPVEXT
+USE MODD_PARAM_n,          ONLY: CCLOUD, CRAD
+
+USE MODE_GRIDPROJ,         ONLY: SM_LATLON
+USE MODE_SENSOR,           ONLY: Sensor_rare_compute, Sensor_wc_compute
+
+IMPLICIT NONE
+
+INTEGER                        :: JLOOP    ! loop counter
+REAL                           :: ZGAM     ! rotation between meso-nh base and spherical lat-lon base.
+REAL                           :: ZU_BAL   ! horizontal wind speed at balloon location (along x)
+REAL                           :: ZV_BAL   ! horizontal wind speed at balloon location (along y)
+REAL, DIMENSION(SIZE(PZ,3))    :: ZZ       ! altitude of model levels at station location
+REAL, DIMENSION(SIZE(PR,1),SIZE(PR,2),SIZE(PR,3))    :: ZR
+
+TPFLYER%NMODELHIST(ISTORE) = TPFLYER%NMODEL
+
+TPFLYER%XX(ISTORE) = TPFLYER%XX_CUR
+TPFLYER%XY(ISTORE) = TPFLYER%XY_CUR
+TPFLYER%XZ(ISTORE) = TPFLYER%XZ_CUR
+!
+CALL SM_LATLON( PLATOR, PLONOR,                    &
+                TPFLYER%XX_CUR,   TPFLYER%XY_CUR,  &
+                TPFLYER%XLAT_CUR, TPFLYER%XLON_CUR )
+TPFLYER%XLAT(ISTORE) = TPFLYER%XLAT_CUR
+TPFLYER%XLON(ISTORE) = TPFLYER%XLON_CUR
+!
+ZU_BAL = TPFLYER%INTERP_FROM_UPOINT( PU )
+ZV_BAL = TPFLYER%INTERP_FROM_VPOINT( PV )
+ZGAM   = (XRPK * (TPFLYER%XLON_CUR - XLON0) - XBETA)*(XPI/180.)
+TPFLYER%XZON (1,ISTORE) = ZU_BAL * COS(ZGAM) + ZV_BAL * SIN(ZGAM)
+TPFLYER%XMER (1,ISTORE) = - ZU_BAL * SIN(ZGAM) + ZV_BAL * COS(ZGAM)
+!
+TPFLYER%XW   (1,ISTORE) = TPFLYER%INTERP_FROM_MASSPOINT( ZWM )
+TPFLYER%XTH  (1,ISTORE) = TPFLYER%INTERP_FROM_MASSPOINT( PTH )
+!
+ZFLYER_EXN = TPFLYER%INTERP_FROM_MASSPOINT( ZEXN )
+TPFLYER%XP   (1,ISTORE) = XP00 * ZFLYER_EXN**(XCPD/XRD)
+
+ZR(:,:,:) = 0.
+DO JLOOP=1,SIZE(PR,4)
+  TPFLYER%XR   (1,ISTORE,JLOOP) = TPFLYER%INTERP_FROM_MASSPOINT( PR(:,:,:,JLOOP) )
+  IF (JLOOP>=2) ZR(:,:,:) = ZR(:,:,:) + PR(:,:,:,JLOOP)
+END DO
+DO JLOOP=1,SIZE(PSV,4)
+  TPFLYER%XSV  (1,ISTORE,JLOOP) = TPFLYER%INTERP_FROM_MASSPOINT( PSV(:,:,:,JLOOP) )
+END DO
+TPFLYER%XRTZ  (:,ISTORE) = TPFLYER%INTERP_HOR_FROM_MASSPOINT( ZR(:,:,:) )
+DO JLOOP=1,SIZE(PR,4)
+  TPFLYER%XRZ  (:,ISTORE,JLOOP) = TPFLYER%INTERP_HOR_FROM_MASSPOINT( PR(:,:,:,JLOOP) )
+END DO
+
+TPFLYER%XFFZ  (:,ISTORE) = TPFLYER%INTERP_HOR_FROM_MASSPOINT( SQRT(PU**2+PV**2) )
+
+TPFLYER%XRHOD (:,ISTORE) = TPFLYER%INTERP_HOR_FROM_MASSPOINT( PRHODREF )
+
+IF (CCLOUD=="LIMA") THEN
+  TPFLYER%XCIZ  (:,ISTORE) = TPFLYER%INTERP_HOR_FROM_MASSPOINT( PSV(:,:,:,NSV_LIMA_NI) )
+  TPFLYER%XCCZ  (:,ISTORE) = TPFLYER%INTERP_HOR_FROM_MASSPOINT( PSV(:,:,:,NSV_LIMA_NC) )
+  TPFLYER%XCRZ  (:,ISTORE) = TPFLYER%INTERP_HOR_FROM_MASSPOINT( PSV(:,:,:,NSV_LIMA_NR) )
+ELSE IF ( CCLOUD=="ICE3" .OR. CCLOUD=="ICE4" ) THEN
+  TPFLYER%XCIZ  (:,ISTORE) = TPFLYER%INTERP_HOR_FROM_MASSPOINT( PCIT(:,:,:) )
+END IF
+
+ZTH_EXN(:,:,:) = PTH(TPFLYER%NI_M:TPFLYER%NI_M+1, TPFLYER%NJ_M:TPFLYER%NJ_M+1, :) * ZEXN(:,:,:)
+ZZ(:) = TPFLYER%INTERP_HOR_FROM_MASSPOINT( ZZM(:,:,:) )
+TPFLYER%XZZ(:,ISTORE) = ZZ(:)
+
+CALL Sensor_wc_compute(   TPFLYER, ISTORE, PR, PRHODREF )
+CALL Sensor_rare_compute( TPFLYER, ISTORE, PR, PSV, PRHODREF, PCIT, ZTH_EXN, ZZ, PSEA )
+
+! vertical wind
+TPFLYER%XWZ  (:,ISTORE) = TPFLYER%INTERP_HOR_FROM_MASSPOINT( ZWM(:,:,:) )
+
+! Dry air density at flyer position
+TPFLYER%XRHOD_SENSOR(ISTORE) = TPFLYER%INTERP_FROM_MASSPOINT( PRHODREF )
+
+IF (SIZE(PTKE)>0) TPFLYER%XTKE  (1,ISTORE) = TPFLYER%INTERP_FROM_MASSPOINT( PTKE )
+IF ( CRAD /= 'NONE' ) TPFLYER%XTSRAD(ISTORE) = TPFLYER%INTERP_HOR_FROM_MASSPOINT(PTS )
+TPFLYER%XTKE_DISS(ISTORE) = TPFLYER%INTERP_FROM_MASSPOINT( XCURRENT_TKE_DISS )
+TPFLYER%XZS(ISTORE)       = TPFLYER%INTERP_HOR_FROM_MASSPOINT( PZ(:,:,1+JPVEXT) )
+TPFLYER%XTHW_FLUX(ISTORE) = TPFLYER%INTERP_FROM_MASSPOINT( ZTHW_FLUX )
+TPFLYER%XRCW_FLUX(ISTORE) = TPFLYER%INTERP_FROM_MASSPOINT( ZRCW_FLUX )
+DO JLOOP=1,SIZE(PSV,4)
+TPFLYER%XSVW_FLUX(ISTORE,JLOOP) = TPFLYER%INTERP_FROM_MASSPOINT( ZSVW_FLUX(:,:,:,JLOOP) )
+END DO
+
+END SUBROUTINE FLYER_RECORD_DATA
+!----------------------------------------------------------------------------
+!----------------------------------------------------------------------------
+END SUBROUTINE AIRCRAFT_BALLOON_EVOL
+!----------------------------------------------------------------------------
+!----------------------------------------------------------------------------
+SUBROUTINE AIRCRAFT_COMPUTE_POSITION( TPDATE, TPAIRCRAFT )
+
+USE MODD_AIRCRAFT_BALLOON, ONLY: TAIRCRAFTDATA
+USE MODD_TYPE_DATE,        ONLY: DATE_TIME
+
+USE MODE_DATETIME
+USE MODE_POSITION_TOOLS,   ONLY: FIND_PROCESS_AND_MODEL_FROM_XY_POS
+
+IMPLICIT NONE
+
+TYPE(DATE_TIME),      INTENT(IN)    :: TPDATE
+CLASS(TAIRCRAFTDATA), INTENT(INOUT) :: TPAIRCRAFT !aircraft
+
+INTEGER :: IL        ! flight segment index
+REAL    :: ZTDIST    ! time since launch (sec)
+REAL    :: ZSEG_FRAC ! fraction of flight in the current segment
+
+! Find the flight segment
+ZTDIST = TPDATE - TPAIRCRAFT%TLAUNCH
+IL = TPAIRCRAFT%NPOSCUR
+DO WHILE ( ZTDIST > TPAIRCRAFT%XPOSTIME(IL+1) )
+  IL = IL + 1
+  IF ( IL > TPAIRCRAFT%NPOS-1 ) THEN
+    !Security (should not happen)
+    IL = TPAIRCRAFT%NPOS-1
+    EXIT
+  END IF
+END DO
+TPAIRCRAFT%NPOSCUR = IL
+
+! Compute the current position
+ZSEG_FRAC = ( ZTDIST - TPAIRCRAFT%XPOSTIME(IL) ) / ( TPAIRCRAFT%XPOSTIME(IL+1) - TPAIRCRAFT%XPOSTIME(IL) )
+
+TPAIRCRAFT%XX_CUR = (1.-ZSEG_FRAC) * TPAIRCRAFT%XPOSX(IL  ) &
+               +     ZSEG_FRAC  * TPAIRCRAFT%XPOSX(IL+1)
+TPAIRCRAFT%XY_CUR = (1.-ZSEG_FRAC) * TPAIRCRAFT%XPOSY(IL  ) &
+               +     ZSEG_FRAC  * TPAIRCRAFT%XPOSY(IL+1)
+
+IF (TPAIRCRAFT%LALTDEF) THEN
+  TPAIRCRAFT%XP_CUR = (1.-ZSEG_FRAC) * TPAIRCRAFT%XPOSP(IL  ) &
+                 +     ZSEG_FRAC  * TPAIRCRAFT%XPOSP(IL+1)
+ELSE
+  TPAIRCRAFT%XZ_CUR = (1.-ZSEG_FRAC) * TPAIRCRAFT%XPOSZ(IL ) &
+                 +     ZSEG_FRAC  * TPAIRCRAFT%XPOSZ(IL +1)
+END IF
+
+END SUBROUTINE AIRCRAFT_COMPUTE_POSITION
+!----------------------------------------------------------------------------
+!----------------------------------------------------------------------------
+SUBROUTINE FLYER_GET_RANK_MODEL_ISCRASHED( TPFLYER, PX, PY, KMODEL )
+
+USE MODD_AIRCRAFT_BALLOON, ONLY: NCRASH_NO, NCRASH_OUT_HORIZ, TFLYERDATA
+
+USE MODE_POSITION_TOOLS,   ONLY: FIND_PROCESS_AND_MODEL_FROM_XY_POS
+
+IMPLICIT NONE
+
+CLASS(TFLYERDATA), INTENT(INOUT) :: TPFLYER ! balloon/aircraft
+REAL,    OPTIONAL, INTENT(IN)    :: PX      ! X position (if not provided, takes current flyer position)
+REAL,    OPTIONAL, INTENT(IN)    :: PY      ! Y position (if not provided, takes current flyer position)
+INTEGER, OPTIONAL, INTENT(IN)    :: KMODEL  ! if provided, model number is imposed (if not 0)
+
+INTEGER :: IMODEL
+INTEGER :: IRANK
+REAL    :: ZX, ZY
+
+IF ( PRESENT( KMODEL ) ) THEN
+  IMODEL = KMODEL
+ELSE
+  IF ( TPFLYER%CMODEL == 'FIX' ) THEN
+    IMODEL = TPFLYER%NMODEL
+  ELSE
+    IMODEL = 0
+  END IF
+END IF
+
+IF ( PRESENT( PX ) ) THEN
+  ZX = PX
+ELSE
+  ZX = TPFLYER%XX_CUR
+END IF
+
+IF ( PRESENT( PY ) ) THEN
+  ZY = PY
+ELSE
+  ZY = TPFLYER%XY_CUR
+END IF
+
+CALL FIND_PROCESS_AND_MODEL_FROM_XY_POS( ZX, ZY, IRANK, IMODEL )
+
+IF ( IRANK < 1 ) THEN
+  ! Flyer is outside of horizontal domain
+  ! TPFLYER%NMODEL !Do not change to keep a valid value
+  TPFLYER%LCRASH    = .TRUE.
+  TPFLYER%NCRASH    = NCRASH_OUT_HORIZ
+  TPFLYER%LFLY      = .FALSE.
+ELSE
+  TPFLYER%NMODEL    = IMODEL
+  TPFLYER%LCRASH    = .FALSE.
+  TPFLYER%NCRASH    = NCRASH_NO
+  !TPFLYER%LFLY      = !Do not touch LFLY (flyer could be in flight or not)
+  TPFLYER%NRANK_CUR = IRANK
+END IF
+
+END SUBROUTINE FLYER_GET_RANK_MODEL_ISCRASHED
+!----------------------------------------------------------------------------
+
+END MODULE MODE_AIRCRAFT_BALLOON_EVOL
diff --git a/src/PHYEX/ext/boundaries.f90 b/src/PHYEX/ext/boundaries.f90
new file mode 100644
index 0000000000000000000000000000000000000000..04860f27e0b15748eb3c9d075427d97f3dc803b9
--- /dev/null
+++ b/src/PHYEX/ext/boundaries.f90
@@ -0,0 +1,1281 @@
+!MNH_LIC Copyright 1994-2021 CNRS, Meteo-France and Universite Paul Sabatier
+!MNH_LIC This is part of the Meso-NH software governed by the CeCILL-C licence
+!MNH_LIC version 1. See LICENSE, CeCILL-C_V1-en.txt and CeCILL-C_V1-fr.txt
+!MNH_LIC for details. version 1.
+!-----------------------------------------------------------------
+!#####################
+MODULE MODI_BOUNDARIES
+!#####################
+!
+INTERFACE
+!
+      SUBROUTINE BOUNDARIES (                                       &
+            PTSTEP,HLBCX,HLBCY,KRR,KSV,KTCOUNT,                     &
+            PLBXUM,PLBXVM,PLBXWM,PLBXTHM,PLBXTKEM,PLBXRM,PLBXSVM,   &
+            PLBYUM,PLBYVM,PLBYWM,PLBYTHM,PLBYTKEM,PLBYRM,PLBYSVM,   &
+            PLBXUS,PLBXVS,PLBXWS,PLBXTHS,PLBXTKES,PLBXRS,PLBXSVS,   &
+            PLBYUS,PLBYVS,PLBYWS,PLBYTHS,PLBYTKES,PLBYRS,PLBYSVS,   &
+            PRHODJ,PRHODREF,                                        &
+            PUT,PVT,PWT,PTHT,PTKET,PRT,PSVT,PSRCT                   )
+!
+REAL,                  INTENT(IN) :: PTSTEP        ! time step dt
+CHARACTER(LEN=4), DIMENSION(2), INTENT(IN) :: HLBCX,HLBCY   ! X and Y-direc. LBC type
+!
+INTEGER,               INTENT(IN) :: KRR           ! Number of moist  variables
+INTEGER,               INTENT(IN) :: KSV           ! Number of Scalar Variables
+INTEGER,               INTENT(IN) :: KTCOUNT       ! Temporal loop COUNTer
+                                                   ! (=1 at the segment beginning)
+!
+! Lateral Boundary fields at time t
+REAL, DIMENSION(:,:,:),          INTENT(IN) :: PLBXUM,PLBXVM,PLBXWM ! Wind
+REAL, DIMENSION(:,:,:),          INTENT(IN) :: PLBXTHM              ! Mass
+REAL, DIMENSION(:,:,:),          INTENT(IN) :: PLBYUM,PLBYVM,PLBYWM ! Wind
+REAL, DIMENSION(:,:,:),          INTENT(IN) :: PLBYTHM              ! Mass
+REAL, DIMENSION(:,:,:),          INTENT(IN) :: PLBXTKEM          ! TKE
+REAL, DIMENSION(:,:,:),          INTENT(IN) :: PLBYTKEM
+REAL, DIMENSION(:,:,:,:),        INTENT(IN) :: PLBXRM  ,PLBXSVM  ! Moisture and SV
+REAL, DIMENSION(:,:,:,:),        INTENT(IN) :: PLBYRM  ,PLBYSVM  ! in x and y-dir.
+! temporal derivative of the Lateral Boundary fields
+REAL, DIMENSION(:,:,:),          INTENT(IN) :: PLBXUS,PLBXVS,PLBXWS ! Wind
+REAL, DIMENSION(:,:,:),          INTENT(IN) :: PLBXTHS              ! Mass
+REAL, DIMENSION(:,:,:),          INTENT(IN) :: PLBYUS,PLBYVS,PLBYWS ! Wind
+REAL, DIMENSION(:,:,:),          INTENT(IN) :: PLBYTHS              ! Mass
+REAL, DIMENSION(:,:,:),          INTENT(IN) :: PLBXTKES          ! TKE
+REAL, DIMENSION(:,:,:),          INTENT(IN) :: PLBYTKES
+REAL, DIMENSION(:,:,:,:),        INTENT(IN) :: PLBXRS  ,PLBXSVS  ! Moisture and SV
+REAL, DIMENSION(:,:,:,:),        INTENT(IN) :: PLBYRS  ,PLBYSVS  ! in x and y-dir.
+!
+REAL, DIMENSION(:,:,:),   INTENT(IN) :: PRHODJ    ! Jacobian * dry density of
+                                                  !  the reference state
+REAL, DIMENSION(:,:,:),   INTENT(IN) :: PRHODREF
+!
+REAL, DIMENSION(:,:,:),   INTENT(INOUT) :: PUT,PVT,PWT,PTHT,PTKET,PSRCT
+REAL, DIMENSION(:,:,:,:), INTENT(INOUT) :: PRT,PSVT
+                                                      ! Variables at t
+!
+END SUBROUTINE BOUNDARIES
+!
+END INTERFACE
+!
+
+END MODULE MODI_BOUNDARIES
+!
+!
+!     ####################################################################
+      SUBROUTINE BOUNDARIES (                                       &
+            PTSTEP,HLBCX,HLBCY,KRR,KSV,KTCOUNT,                     &
+            PLBXUM,PLBXVM,PLBXWM,PLBXTHM,PLBXTKEM,PLBXRM,PLBXSVM,   &
+            PLBYUM,PLBYVM,PLBYWM,PLBYTHM,PLBYTKEM,PLBYRM,PLBYSVM,   &
+            PLBXUS,PLBXVS,PLBXWS,PLBXTHS,PLBXTKES,PLBXRS,PLBXSVS,   &
+            PLBYUS,PLBYVS,PLBYWS,PLBYTHS,PLBYTKES,PLBYRS,PLBYSVS,   &
+            PRHODJ,PRHODREF,                                        &
+            PUT,PVT,PWT,PTHT,PTKET,PRT,PSVT,PSRCT                   )
+!     ####################################################################
+!
+!!****  *BOUNDARIES* - routine to prepare the Lateral Boundary Conditions for
+!!                 all variables at a scalar localization relative to the 
+!!                 considered boundary.
+!!
+!!    PURPOSE
+!!    -------
+!       Fill up the left and right lateral EXTernal zones, for all prognostic
+!       variables, at time t and t-dt, to avoid particular cases close to
+!       the Lateral Boundaries in routines computing the evolution terms, in
+!       particular in the advection routines.
+!
+!!**  METHOD
+!!    ------
+!!      3 different options are proposed: 'WALL' 'CYCL' 'OPEN'
+!!                    to define the Boundary Condition type,
+!!      though the variables HLBCX and HLBCY (for the X and Y-directions
+!!      respectively).
+!!       For the 'OPEN' type of LBC, the treatment depends
+!!      on the flow configuration: i.e. INFLOW or OUTFLOW conditions.
+!!   
+!!    EXTERNAL 
+!!    --------  
+!!    GET_INDICE_ll  : get physical sub-domain bounds
+!!    LWEAST_ll,LEAST_ll,LNORTH_ll,LSOUTH_ll : position functions
+!!
+!!    IMPLICIT ARGUMENTS
+!!    ------------------  
+!!      Module MODD_PARAMETERS : 
+!!        JPHEXT ,JPVEXT 
+!!
+!!      Module MODD_CONF :
+!!        CCONF
+!!
+!!      Module MODE_UPDATE_NSV :
+!!        NSV_CHEM, NSV_CHEMBEG, NSV_CHEMEND
+!!
+!!      Module MODD_CTURB :
+!!        XTKEMIN 
+!!
+!!    REFERENCE
+!!    ---------
+!!      Book1 and book2 of documentation (routine BOUNDARIES)
+!!
+!!    AUTHOR
+!!    ------
+!!	J.-P. Lafore J. Stein     * Meteo France *
+!!
+!!    MODIFICATIONS
+!!    -------------
+!!      Original        17/10/94 
+!!      Modification    02/11/94  (J.Stein) copy for t-dt at the external points
+!!                                          + change the copy formulation
+!!      Modification    18/11/94  (J.Stein) bug correction in the normal velocity
+!!                                          prescription in the WALL cases
+!!      Modification    13/02/95  (Lafore)  to account for the OPEN case and
+!!                                          for the LS fields introduction
+!!      Modification    03/03/95  (Mallet)  corrections in variables names in 
+!!                                          the Y-OPEN case
+!!                      16/03/95  (J.Stein) remove R from the historical variables
+!!      Modification    31/05/95  (Lafore)  MASTER_DEV2.1 preparation after the
+!!                                          LBC tests performed by I. Mallet
+!!      Modification    15/03/96  (Richard) bug correction for OPEN CASE: (TOP Y-LBC)
+!!                                          Rv case 
+!!      Modification    15/03/96  (Shure)   bug correction for SV variable in
+!!                                          open x  right case
+!!      Modification    24/10/96  (Masson)  initialization of outer points in
+!!                                          wall cases for spawning interpolations
+!!      Modification    13/03/97  (Lafore)  "surfacic" LS-fields introduction
+!!      Modification    10/04/97  (Lafore)  proper treatment of minima for TKE and EPS
+!!      Modification    01/09/97  (Masson)  minimum value for water and passive
+!!                                          scalars set to zero at instants M,T
+!!      Modification    20/10/97  (Lafore)  introduction of DAVI type of lbc
+!!                                           suppression of NEST type
+!!      Modification    12/11/97  ( Stein ) use the lB fields
+!!      Modification    02/06/98  (Lafore)  declaration of local variables (PLBXUM
+!!                                          and PLBXWM do'nt have the same size)
+!!      Modification    24/08/98   (Jabouille) parallelize the code 
+!!      Modification    20/04/99  ( Stein ) use the same conditions for times t
+!!                                          and t-dt
+!!      Modification    11/04/00  (Mari)    special conditions for chemical variables
+!!      Modification    10/01/01  (Tulet)   update for MOCAGE boundary conditions
+!!      Modification    22/01/01  (Gazen)   use NSV_CHEM,NSV_CHEMBEG,NSV_CHEMEND variables
+!!      Modification    22/06/01(Jabouille) use XSVMIN
+!!      Modification    20/11/01(Gazen & Escobar) rewrite GCHBOUNDARY for portability
+!!      Modification    14/03/05 (Tulet)    bug : in case of CYCL do not call ch_boundaries
+!!      Modification    14/05/05 (Tulet)    add aerosols / dust
+!!      Modification    05/06               Suppression of DAVI type of lbc
+!!      Modification    05/06               Remove EPS
+!!      Modification    12/2010  (Chong)    Add boundary condition for ions
+!!                                          (fair weather profiles)
+!!      Modification    07/2013  (Bosseur & Filippi) adds Forefire
+!!      Modification    04/2013  (C.Lac)    Remove instant M               
+!!      Modification    01/2015  (JL Redelsperger) Introduction of ponderation
+!!                                 for non normal velocity and potential temp
+!!      J.Escobar : 15/09/2015 : WENO5 & JPHEXT <> 1
+!!      Redelsperger & Pianezze : 08/2015 : add XPOND coefficient
+!!      Modification    01/2016  (JP Pinty) Add LIMA that is LBC for CCN and IFN
+!!      Modification    18/07/17 (Vionnet)  Add blowing snow variables 
+!!      Modification    01/2018  (JL Redelsperger) Correction for TKE treatment
+!!      Modification    03/02/2020 (B. Vié)  Correction for SV with LIMA
+!  P. Wautelet 04/06/2020: correct call to Set_conc_lima
+!-------------------------------------------------------------------------------
+!
+!*       0.    DECLARATIONS
+!         
+USE MODD_BLOWSNOW,  ONLY : LBLOWSNOW,NBLOWSNOW_2D
+USE MODD_BLOWSNOW_n
+USE MODD_CH_AEROSOL , ONLY : LORILAM
+USE MODD_CH_MNHC_n,   ONLY : LUSECHEM, LUSECHIC
+USE MODD_CONDSAMP,    ONLY : LCONDSAMP
+USE MODD_CONF
+USE MODD_TURB_n,      ONLY : XTKEMIN
+USE MODD_DUST
+USE MODD_GRID_n,    ONLY : XZZ
+USE MODD_ELEC_DESCR
+USE MODD_ELEC_n
+#ifdef MNH_FOREFIRE
+USE MODD_FOREFIRE,   ONLY : LFOREFIRE
+#endif
+USE MODD_LBC_n,      ONLY : XPOND
+USE MODE_ll
+USE MODD_NESTING,      ONLY : NDAD
+USE MODD_NSV
+USE MODD_PARAMETERS
+USE MODD_PARAM_LIMA, ONLY : NMOD_CCN, NMOD_IFN
+USE MODD_PARAM_n,    ONLY : CELEC,CCLOUD
+USE MODD_PASPOL,      ONLY : LPASPOL
+USE MODD_PRECISION,   ONLY: MNHREAL32
+USE MODD_REF_n
+USE MODD_SALT,        ONLY : LSALT
+
+USE MODE_MODELN_HANDLER
+USE MODE_SET_CONC_LIMA
+
+USE MODI_CH_BOUNDARIES
+USE MODI_INIT_AEROSOL_CONCENTRATION
+USE MODI_ION_BOUNDARIES
+
+IMPLICIT NONE
+!
+!
+!*       0.1   declarations of arguments
+!
+!
+!
+!
+REAL,                  INTENT(IN) :: PTSTEP        ! time step dt
+CHARACTER(LEN=4), DIMENSION(2), INTENT(IN) :: HLBCX,HLBCY   ! X and Y-direc. LBC type
+!
+INTEGER,               INTENT(IN) :: KRR           ! Number of moist  variables
+INTEGER,               INTENT(IN) :: KSV           ! Number of Scalar Variables
+INTEGER,               INTENT(IN) :: KTCOUNT       ! Temporal loop COUNTer
+                                                   ! (=1 at the segment beginning)
+!
+! Lateral Boundary fields at time t
+REAL, DIMENSION(:,:,:),          INTENT(IN) :: PLBXUM,PLBXVM,PLBXWM ! Wind
+REAL, DIMENSION(:,:,:),          INTENT(IN) :: PLBXTHM              ! Mass
+REAL, DIMENSION(:,:,:),          INTENT(IN) :: PLBYUM,PLBYVM,PLBYWM ! Wind
+REAL, DIMENSION(:,:,:),          INTENT(IN) :: PLBYTHM              ! Mass
+REAL, DIMENSION(:,:,:),          INTENT(IN) :: PLBXTKEM          ! TKE
+REAL, DIMENSION(:,:,:),          INTENT(IN) :: PLBYTKEM
+REAL, DIMENSION(:,:,:,:),        INTENT(IN) :: PLBXRM  ,PLBXSVM  ! Moisture and SV
+REAL, DIMENSION(:,:,:,:),        INTENT(IN) :: PLBYRM  ,PLBYSVM  ! in x and y-dir.
+! temporal derivative of the Lateral Boundary fields
+REAL, DIMENSION(:,:,:),          INTENT(IN) :: PLBXUS,PLBXVS,PLBXWS ! Wind
+REAL, DIMENSION(:,:,:),          INTENT(IN) :: PLBXTHS              ! Mass
+REAL, DIMENSION(:,:,:),          INTENT(IN) :: PLBYUS,PLBYVS,PLBYWS ! Wind
+REAL, DIMENSION(:,:,:),          INTENT(IN) :: PLBYTHS              ! Mass
+REAL, DIMENSION(:,:,:),          INTENT(IN) :: PLBXTKES          ! TKE
+REAL, DIMENSION(:,:,:),          INTENT(IN) :: PLBYTKES
+REAL, DIMENSION(:,:,:,:),        INTENT(IN) :: PLBXRS  ,PLBXSVS  ! Moisture and SV
+REAL, DIMENSION(:,:,:,:),        INTENT(IN) :: PLBYRS  ,PLBYSVS  ! in x and y-dir.
+!
+REAL, DIMENSION(:,:,:),   INTENT(IN) :: PRHODJ    ! Jacobian * dry density of
+                                                  !  the reference state
+REAL, DIMENSION(:,:,:),   INTENT(IN) :: PRHODREF
+!
+REAL, DIMENSION(:,:,:),   INTENT(INOUT) :: PUT,PVT,PWT,PTHT,PTKET,PSRCT
+REAL, DIMENSION(:,:,:,:), INTENT(INOUT) :: PRT,PSVT
+                                                      ! Variables at t
+!
+!*       0.2   declarations of local variables
+!
+INTEGER             :: IIB       ! indice I Beginning in x direction
+INTEGER             :: IJB       ! indice J Beginning in y direction
+INTEGER             :: IKB       ! indice K Beginning in z direction
+INTEGER             :: IIE       ! indice I End       in x direction 
+INTEGER             :: IJE       ! indice J End       in y direction 
+INTEGER             :: IKE       ! indice K End       in z direction 
+INTEGER             :: JEXT      ! Loop index for EXTernal points
+INTEGER             :: JRR       ! Loop index for RR variables (water)
+INTEGER             :: JSV       ! Loop index for Scalar Variables
+INTEGER             :: IMI       ! Model Index
+REAL                :: ZTSTEP    ! effective time step
+REAL                :: ZPOND      !  Coeff PONDERATION LS 
+INTEGER             :: ILBX,ILBY ! size of LB fields' arrays
+LOGICAL, SAVE, DIMENSION(:), ALLOCATABLE :: GCHBOUNDARY, GAERBOUNDARY,&
+                    GDSTBOUNDARY, GSLTBOUNDARY, GPPBOUNDARY,          &
+                    GCSBOUNDARY, GICBOUNDARY, GLIMABOUNDARY,GSNWBOUNDARY 
+LOGICAL, SAVE        :: GFIRSTCALL1 = .TRUE.
+LOGICAL, SAVE        :: GFIRSTCALL2 = .TRUE.
+LOGICAL, SAVE        :: GFIRSTCALL3 = .TRUE.
+LOGICAL, SAVE        :: GFIRSTCALL5 = .TRUE. 
+LOGICAL, SAVE        :: GFIRSTCALLPP = .TRUE.                         
+LOGICAL, SAVE        :: GFIRSTCALLCS = .TRUE.                         
+LOGICAL, SAVE        :: GFIRSTCALLIC = .TRUE.                 
+LOGICAL, SAVE        :: GFIRSTCALLLIMA = .TRUE.                 
+!
+REAL, DIMENSION(SIZE(PLBXWM,1),SIZE(PLBXWM,2),SIZE(PLBXWM,3)) ::  &
+                       ZLBXVT,ZLBXWT,ZLBXTHT
+REAL, DIMENSION(SIZE(PLBYWM,1),SIZE(PLBYWM,2),SIZE(PLBYWM,3)) ::  &
+                       ZLBYUT,ZLBYWT,ZLBYTHT
+REAL, DIMENSION(SIZE(PLBXTKEM,1),SIZE(PLBXTKEM,2),SIZE(PLBXTKEM,3)) ::  &
+                       ZLBXTKET
+REAL, DIMENSION(SIZE(PLBYTKEM,1),SIZE(PLBYTKEM,2),SIZE(PLBYTKEM,3)) ::  &
+                       ZLBYTKET
+REAL, DIMENSION(SIZE(PLBXRM,1),SIZE(PLBXRM,2),SIZE(PLBXRM,3),SIZE(PLBXRM,4)) :: &
+                       ZLBXRT
+REAL, DIMENSION(SIZE(PLBYRM,1),SIZE(PLBYRM,2),SIZE(PLBYRM,3),SIZE(PLBYRM,4)) :: &
+                       ZLBYRT
+REAL, DIMENSION(SIZE(PLBXSVM,1),SIZE(PLBXSVM,2),SIZE(PLBXSVM,3),SIZE(PLBXSVM,4)) :: &
+                       ZLBXSVT
+REAL, DIMENSION(SIZE(PLBYSVM,1),SIZE(PLBYSVM,2),SIZE(PLBYSVM,3),SIZE(PLBYSVM,4)) :: &
+                       ZLBYSVT
+LOGICAL              :: GCHTMP
+LOGICAL              :: GPPTMP
+LOGICAL              :: GCSTMP
+!
+LOGICAL, SAVE        :: GFIRSTCALL4 = .TRUE.
+!
+#ifdef MNH_FOREFIRE
+LOGICAL, SAVE, DIMENSION(:), ALLOCATABLE ::  GFFBOUNDARY
+LOGICAL, SAVE        :: GFIRSTCALLFF = .TRUE.                         
+LOGICAL              :: GFFTMP
+#endif
+!
+INTEGER              :: JI,JJ
+!
+REAL, DIMENSION(SIZE(PSVT,1),SIZE(PSVT,2),SIZE(PSVT,3),SIZE(PSVT,4)) :: ZSVT
+REAL, DIMENSION(SIZE(PRT,1),SIZE(PRT,2),SIZE(PRT,3),SIZE(PRT,4)) :: ZRT
+!
+!-------------------------------------------------------------------------------
+!
+!*       1.    COMPUTE DIMENSIONS OF ARRAYS AND OTHER INDICES:
+!              ----------------------------------------------
+CALL GET_INDICE_ll (IIB,IJB,IIE,IJE)
+IKB = 1 + JPVEXT
+IKE = SIZE(PUT,3) - JPVEXT
+IMI = GET_CURRENT_MODEL_INDEX()
+!
+!-------------------------------------------------------------------------------
+!
+!*       2.    UPPER AND LOWER BC FILLING:   
+!              ---------------------------
+!
+!*       2.1    COMPUTE THE FIELD EXTRAPOLATIONS AT THE GROUND
+!
+
+!
+!          at the instant t
+!
+IF(SIZE(PUT) /= 0) PUT  (:,:,IKB-1)   = PUT  (:,:,IKB) 
+IF(SIZE(PVT) /= 0) PVT  (:,:,IKB-1)   = PVT  (:,:,IKB) 
+IF(SIZE(PWT) /= 0) PWT  (:,:,IKB-1)   = PWT  (:,:,IKB)  
+IF(SIZE(PTHT) /= 0) PTHT (:,:,IKB-1)  = PTHT (:,:,IKB) 
+IF(SIZE(PTKET) /= 0) PTKET(:,:,IKB-1) = PTKET(:,:,IKB)
+IF(SIZE(PRT) /= 0)  PRT  (:,:,IKB-1,:)= PRT  (:,:,IKB,:)
+IF(SIZE(PSVT)/= 0)  PSVT (:,:,IKB-1,:)= PSVT (:,:,IKB,:)
+IF(SIZE(PSRCT) /= 0) PSRCT(:,:,IKB-1)   = PSRCT(:,:,IKB)
+!
+!
+!*       2.2    COMPUTE THE FIELD EXTRAPOLATIONS AT THE TOP
+!
+!          at the instant t
+!
+IF(SIZE(PWT) /= 0) PWT  (:,:,IKE+1)   = 0.           
+IF(SIZE(PUT) /= 0) PUT  (:,:,IKE+1)   = PUT  (:,:,IKE) 
+IF(SIZE(PVT) /= 0) PVT  (:,:,IKE+1)   = PVT  (:,:,IKE)
+IF(SIZE(PTHT) /= 0) PTHT (:,:,IKE+1)  = PTHT (:,:,IKE)
+IF(SIZE(PTKET) /= 0) PTKET(:,:,IKE+1) = PTKET(:,:,IKE)
+IF(SIZE(PRT) /= 0) PRT  (:,:,IKE+1,:) = PRT  (:,:,IKE,:)
+IF(SIZE(PSVT)/= 0) PSVT (:,:,IKE+1,:) = PSVT (:,:,IKE,:)
+IF(SIZE(PSRCT) /= 0) PSRCT(:,:,IKE+1)   = PSRCT(:,:,IKE)
+
+! specific for positive and negative ions mixing ratios (1/kg)
+
+IF (NSV_ELEC .NE. 0) THEN
+!
+   IF (SIZE(PWT) /= 0) THEN
+     WHERE ( PWT(:,:,IKE+1)  .GE. 0.)    ! Outflow
+         PSVT (:,:,IKE+1,NSV_ELECBEG) = 2.*PSVT (:,:,IKE,NSV_ELECBEG) -  &
+                                           PSVT (:,:,IKE-1,NSV_ELECBEG)
+         PSVT (:,:,IKE+1,NSV_ELECEND) = 2.*PSVT (:,:,IKE,NSV_ELECEND) -  &
+                                           PSVT (:,:,IKE-1,NSV_ELECEND)
+     ELSE WHERE                         ! Inflow from the top
+         PSVT (:,:,IKE+1,NSV_ELECBEG) = XCION_POS_FW(:,:,IKE+1)
+         PSVT (:,:,IKE+1,NSV_ELECEND) = XCION_NEG_FW(:,:,IKE+1)
+     END WHERE
+   ENDIF
+!
+END IF
+
+!
+!
+!-------------------------------------------------------------------------------
+!
+!*       3.    COMPUTE LB FIELDS AT TIME T
+!              ---------------------------
+!
+!
+IF ( KTCOUNT == 1) THEN
+  ZTSTEP = 0.
+ELSE
+  ZTSTEP = PTSTEP
+END IF
+!
+!
+IF ( SIZE(PLBXTHS,1) /= 0 .AND.                      &
+   (     HLBCX(1)=='OPEN' .OR. HLBCX(2)=='OPEN')     ) THEN            
+  ZLBXVT(:,:,:) = PLBXVM(:,:,:) + ZTSTEP * PLBXVS(:,:,:)
+  ZLBXWT(:,:,:) = PLBXWM(:,:,:) + ZTSTEP * PLBXWS(:,:,:)
+  ZLBXTHT(:,:,:) = PLBXTHM(:,:,:) + ZTSTEP * PLBXTHS(:,:,:)
+  IF ( SIZE(PTKET,1) /= 0 ) THEN
+    ZLBXTKET(:,:,:) = PLBXTKEM(:,:,:) + ZTSTEP * PLBXTKES(:,:,:)
+  END IF
+  IF ( KRR > 0) THEN
+    ZLBXRT(:,:,:,:) = PLBXRM(:,:,:,:) + ZTSTEP * PLBXRS(:,:,:,:)
+  END IF
+  IF ( KSV > 0) THEN
+    ZLBXSVT(:,:,:,:) = PLBXSVM(:,:,:,:) + ZTSTEP * PLBXSVS(:,:,:,:)
+  END IF
+!
+ELSE
+!
+  ZLBXVT(:,:,:) = PLBXVM(:,:,:)
+  ZLBXWT(:,:,:) = PLBXWM(:,:,:)
+  ZLBXTHT(:,:,:) = PLBXTHM(:,:,:)
+  IF ( SIZE(PTKET,1) /= 0 ) THEN
+    ZLBXTKET(:,:,:) = PLBXTKEM(:,:,:) 
+  END IF
+  IF ( KRR > 0) THEN
+    ZLBXRT(:,:,:,:) = PLBXRM(:,:,:,:) 
+  END IF
+  IF ( KSV > 0) THEN
+    ZLBXSVT(:,:,:,:) = PLBXSVM(:,:,:,:) 
+  END IF
+!
+END IF
+!
+!     ============================================================    
+!
+!  Reproductibility for RSTART -> truncate ZLB to real(knd=4) to have reproductible result
+!
+ZLBXVT(:,:,:)  = real(ZLBXVT(:,:,:),kind=MNHREAL32)
+ZLBXWT(:,:,:)  = real(ZLBXWT(:,:,:),kind=MNHREAL32)
+ZLBXTHT(:,:,:) = real(ZLBXTHT(:,:,:),kind=MNHREAL32)
+IF ( SIZE(PTKET,1) /= 0 ) THEN
+   ZLBXTKET(:,:,:) = real(ZLBXTKET(:,:,:),kind=MNHREAL32)
+END IF
+IF ( KRR > 0) THEN
+   ZLBXRT(:,:,:,:) = real(ZLBXRT(:,:,:,:),kind=MNHREAL32)
+END IF
+IF ( KSV > 0) THEN
+   ZLBXSVT(:,:,:,:) = real(ZLBXSVT(:,:,:,:),kind=MNHREAL32)
+END IF
+!     ============================================================ 
+!
+IF ( SIZE(PLBYTHS,1) /= 0 .AND.                       &
+     (    HLBCY(1)=='OPEN' .OR. HLBCY(2)=='OPEN'    ))  THEN          
+  ZLBYUT(:,:,:) = PLBYUM(:,:,:) + ZTSTEP * PLBYUS(:,:,:)
+  ZLBYWT(:,:,:) = PLBYWM(:,:,:) + ZTSTEP * PLBYWS(:,:,:)
+  ZLBYTHT(:,:,:) = PLBYTHM(:,:,:) + ZTSTEP * PLBYTHS(:,:,:)
+  IF ( SIZE(PTKET,1) /= 0 ) THEN
+    ZLBYTKET(:,:,:) = PLBYTKEM(:,:,:) + ZTSTEP * PLBYTKES(:,:,:)
+  END IF
+  IF ( KRR > 0) THEN
+    ZLBYRT(:,:,:,:) = PLBYRM(:,:,:,:) + ZTSTEP * PLBYRS(:,:,:,:)
+  END IF
+  IF ( KSV > 0) THEN
+    ZLBYSVT(:,:,:,:) = PLBYSVM(:,:,:,:) + ZTSTEP * PLBYSVS(:,:,:,:)
+  END IF
+!
+ELSE
+!
+  ZLBYUT(:,:,:) = PLBYUM(:,:,:)
+  ZLBYWT(:,:,:) = PLBYWM(:,:,:)
+  ZLBYTHT(:,:,:) = PLBYTHM(:,:,:)
+  IF ( SIZE(PTKET,1) /= 0 ) THEN
+    ZLBYTKET(:,:,:) = PLBYTKEM(:,:,:) 
+  END IF
+  IF ( KRR > 0) THEN
+    ZLBYRT(:,:,:,:) = PLBYRM(:,:,:,:) 
+  END IF
+  IF ( KSV > 0) THEN
+    ZLBYSVT(:,:,:,:) = PLBYSVM(:,:,:,:) 
+  END IF
+!
+END IF
+!
+!
+!     ============================================================    
+!
+!  Reproductibility for RSTART -> truncate ZLB to real(knd=4) to have reproductible result
+!
+ZLBYUT(:,:,:)  = real(ZLBYUT(:,:,:),kind=MNHREAL32)
+ZLBYWT(:,:,:)  = real(ZLBYWT(:,:,:),kind=MNHREAL32)
+ZLBYTHT(:,:,:) = real(ZLBYTHT(:,:,:),kind=MNHREAL32)
+IF ( SIZE(PTKET,1) /= 0 ) THEN
+   ZLBYTKET(:,:,:) = real(ZLBYTKET(:,:,:),kind=MNHREAL32)
+END IF
+IF ( KRR > 0) THEN
+   ZLBYRT(:,:,:,:) = real(ZLBYRT(:,:,:,:),kind=MNHREAL32)
+END IF
+IF ( KSV > 0) THEN
+   ZLBYSVT(:,:,:,:) = real(ZLBYSVT(:,:,:,:),kind=MNHREAL32)
+END IF
+!     ============================================================ 
+!
+!-------------------------------------------------------------------------------
+! PONDERATION COEFF for  Non-Normal velocities and pot temperature
+!
+ZPOND = XPOND
+!
+!*       4.    LBC FILLING IN THE X DIRECTION (LEFT WEST SIDE):   
+!              ------------------------------------------------
+IF (LWEST_ll( )) THEN
+!
+!
+SELECT CASE ( HLBCX(1) )  
+!
+!*       4.1  WALL CASE:  
+!             ========= 
+!
+  CASE ('WALL')
+!
+    DO JEXT=1,JPHEXT
+       IF(SIZE(PUT) /= 0) PUT  (IIB-JEXT,:,:)   = PUT  (IIB       ,:,:)   ! never used during run
+       IF(SIZE(PVT) /= 0) PVT  (IIB-JEXT,:,:)   = PVT  (IIB-1+JEXT,:,:)
+       IF(SIZE(PWT) /= 0) PWT  (IIB-JEXT,:,:)   = PWT  (IIB-1+JEXT,:,:)
+       IF(SIZE(PTHT) /= 0) PTHT(IIB-JEXT,:,:)   = PTHT (IIB-1+JEXT,:,:)
+       IF(SIZE(PTKET)/= 0) PTKET(IIB-JEXT,:,:)  = PTKET(IIB-1+JEXT,:,:)
+       IF(SIZE(PRT) /= 0) PRT  (IIB-JEXT,:,:,:) = PRT  (IIB-1+JEXT,:,:,:)
+       IF(SIZE(PSVT) /= 0) PSVT(IIB-JEXT,:,:,:) = PSVT (IIB-1+JEXT,:,:,:)
+       IF(SIZE(PSRCT) /= 0) PSRCT (IIB-JEXT,:,:)   = PSRCT (IIB-1+JEXT,:,:)
+       IF(LBLOWSNOW) XSNWCANO(IIB-JEXT,:,:)     = XSNWCANO(IIB-1+JEXT,:,:)            
+!
+    END DO
+!
+    IF(SIZE(PUT) /= 0) PUT(IIB     ,:,:)   = 0.    ! set the normal velocity
+!
+!
+!*       4.2  OPEN CASE:
+!             =========
+!
+  CASE ('OPEN')
+!
+    IF(SIZE(PUT) /= 0) THEN
+       DO JI=JPHEXT,1,-1
+          PUT(JI,:,:)=0.
+          WHERE ( PUT(IIB,:,:) <= 0. )               !  OUTFLOW condition
+             PVT  (JI,:,:) = 2.*PVT  (JI+1,:,:)  -PVT  (JI+2,:,:)
+             PWT  (JI,:,:) = 2.*PWT  (JI+1,:,:)  -PWT  (JI+2,:,:)
+             PTHT (JI,:,:) = 2.*PTHT (JI+1,:,:)  -PTHT (JI+2,:,:)
+             !
+          ELSEWHERE                                   !  INFLOW  condition
+             PVT  (JI,:,:) = ZPOND*ZLBXVT   (JI,:,:) + (1.-ZPOND)* PVT(JI+1,:,:) ! 1 
+             PWT  (JI,:,:) = ZPOND*ZLBXWT   (JI,:,:) + (1.-ZPOND)* PWT(JI+1,:,:) ! 1
+             PTHT (JI,:,:) = ZPOND*ZLBXTHT  (JI,:,:) + (1.-ZPOND)* PTHT(JI+1,:,:)! 1
+          ENDWHERE
+       ENDDO
+    ENDIF
+!
+!
+  IF(SIZE(PTKET) /= 0) THEN
+     DO JI=JPHEXT,1,-1
+        WHERE ( PUT(IIB,:,:) <= 0. )               !  OUTFLOW condition
+           PTKET(JI,:,:) = MAX(XTKEMIN, 2.*PTKET(JI+1,:,:)-PTKET(JI+2,:,:))  
+        ELSEWHERE                                  !  INFLOW  condition
+           PTKET(JI,:,:) = MAX(XTKEMIN, ZPOND*ZLBXTKET(JI,:,:) + (1.-ZPOND)*PTKET(JI+1,:,:))
+        ENDWHERE
+     ENDDO
+  END IF
+    !
+!                      Case with KRR moist variables 
+! 
+! 
+!
+  DO JRR =1 ,KRR
+     IF(SIZE(PUT) /= 0) THEN
+        DO JI=JPHEXT,1,-1
+           WHERE ( PUT(IIB,:,:) <= 0. )         !  OUTFLOW condition
+              PRT(JI,:,:,JRR) = MAX(0.,2.*PRT(JI+1,:,:,JRR) -PRT(JI+2,:,:,JRR))
+           ELSEWHERE                            !  INFLOW  condition
+              PRT(JI,:,:,JRR) = MAX(0.,ZLBXRT(JI,:,:,JRR)) ! 1
+           END WHERE
+        END DO
+     END IF
+     !
+  END DO
+!
+  IF(SIZE(PSRCT) /= 0) THEN
+     DO JI=JPHEXT,1,-1
+        PSRCT (JI,:,:)   = PSRCT (JI+1,:,:)
+     END DO
+  END IF
+!
+!                       Case with KSV scalar variables  
+  DO JSV=1 ,KSV
+    IF(SIZE(PUT) /= 0) THEN
+       DO JI=JPHEXT,1,-1
+          WHERE ( PUT(IIB,:,:) <= 0. )         !  OUTFLOW condition
+             PSVT(JI,:,:,JSV) = MAX(XSVMIN(JSV),2.*PSVT(JI+1,:,:,JSV) - &
+                  PSVT(JI+2,:,:,JSV))
+          ELSEWHERE                            !  INFLOW  condition
+             PSVT(JI,:,:,JSV) = MAX(XSVMIN(JSV),ZLBXSVT(JI,:,:,JSV)) ! 1
+          END WHERE
+       END DO
+    END IF
+    !
+  END DO
+  !
+    IF(LBLOWSNOW) THEN
+    DO JSV=1 ,NBLOWSNOW_2D
+      WHERE ( PUT(IIB,:,IKB) <= 0. )         !  OUTFLOW condition
+        XSNWCANO(IIB-1,:,JSV) = MAX(0.,2.*XSNWCANO(IIB,:,JSV) - &
+                                             XSNWCANO(IIB+1,:,JSV))
+      ELSEWHERE                            !  INFLOW  condition
+        XSNWCANO(IIB-1,:,JSV) = 0.         ! Assume no snow enter throug
+                                           ! boundaries
+      END WHERE
+    END DO
+   DO JSV=NSV_SNWBEG ,NSV_SNWEND
+    IF(SIZE(PUT) /= 0) THEN
+      WHERE ( PUT(IIB,:,:) <= 0. )         !  OUTFLOW condition
+        PSVT(IIB-1,:,:,JSV) = MAX(0.,2.*PSVT(IIB,:,:,JSV) - &
+                                               PSVT(IIB+1,:,:,JSV))
+      ELSEWHERE                            !  INFLOW  condition
+        PSVT(IIB-1,:,:,JSV) = 0.           ! Assume no snow enter throug
+                                           ! boundaries
+      END WHERE
+    END IF
+    !
+   END DO
+  ENDIF  
+!
+!
+END SELECT
+!
+END IF
+!-------------------------------------------------------------------------------
+!
+!*       5    LBC FILLING IN THE X DIRECTION (RIGHT EAST SIDE): 
+!              ===============--------------------------------
+!
+IF (LEAST_ll( )) THEN
+!
+SELECT CASE ( HLBCX(2) ) 
+!
+!*       5.1  WALL CASE:
+!             =========
+!
+  CASE ('WALL')
+!
+    DO JEXT=1,JPHEXT
+       IF(SIZE(PUT) /= 0) PUT  (IIE+JEXT,:,:)   = PUT  (IIE       ,:,:)   ! never used during run
+       IF(SIZE(PVT) /= 0) PVT  (IIE+JEXT,:,:)   = PVT  (IIE+1-JEXT,:,:)
+       IF(SIZE(PWT) /= 0) PWT  (IIE+JEXT,:,:)   = PWT  (IIE+1-JEXT,:,:)
+       IF(SIZE(PTHT) /= 0) PTHT (IIE+JEXT,:,:)  = PTHT (IIE+1-JEXT,:,:)
+       IF(SIZE(PTKET) /= 0) PTKET(IIE+JEXT,:,:) = PTKET(IIE+1-JEXT,:,:)
+       IF(SIZE(PRT) /= 0) PRT  (IIE+JEXT,:,:,:) = PRT  (IIE+1-JEXT,:,:,:)
+       IF(SIZE(PSVT) /= 0) PSVT(IIE+JEXT,:,:,:) = PSVT (IIE+1-JEXT,:,:,:)
+       IF(SIZE(PSRCT) /= 0) PSRCT (IIE+JEXT,:,:)= PSRCT (IIE+1-JEXT,:,:)
+       IF(LBLOWSNOW) XSNWCANO(IIE+JEXT,:,:) = XSNWCANO(IIE+1-JEXT,:,:)           
+!
+    END DO
+!
+    IF(SIZE(PUT) /= 0) PUT(IIE+1   ,:,:)   = 0.     ! set the normal velocity
+!
+!*       5.2  OPEN CASE:
+!             =========
+!
+  CASE ('OPEN')
+!
+     ILBX = SIZE(PLBXVM,1)
+     IF(SIZE(PUT) /= 0) THEN
+        DO JI=1,JPHEXT
+           WHERE ( PUT(IIE+1,:,:) >= 0. )               !  OUTFLOW condition
+              PVT  (IIE+JI,:,:) = 2.*PVT  (IIE+JI-1,:,:)   -PVT  (IIE+JI-2,:,:)
+              PWT  (IIE+JI,:,:) = 2.*PWT  (IIE+JI-1,:,:)   -PWT  (IIE+JI-2,:,:)
+              PTHT (IIE+JI,:,:) = 2.*PTHT (IIE+JI-1,:,:)   -PTHT (IIE+JI-2,:,:)
+              !
+           ELSEWHERE                                   !  INFLOW  condition
+              PVT  (IIE+JI,:,:) = ZPOND*ZLBXVT   (ILBX-JPHEXT+JI,:,:) + (1.-ZPOND)* PVT(IIE+JI-1,:,:)
+              PWT  (IIE+JI,:,:) = ZPOND*ZLBXWT   (ILBX-JPHEXT+JI,:,:) + (1.-ZPOND)* PWT(IIE+JI-1,:,:)
+              PTHT (IIE+JI,:,:) = ZPOND*ZLBXTHT  (ILBX-JPHEXT+JI,:,:) + (1.-ZPOND)* PTHT(IIE+JI-1,:,:)
+           ENDWHERE
+        END DO
+     ENDIF
+     !
+     IF(SIZE(PTKET) /= 0) THEN
+        ILBX = SIZE(PLBXTKEM,1)
+        DO JI=1,JPHEXT
+           WHERE ( PUT(IIE+1,:,:) >= 0. )             !  OUTFLOW condition
+              PTKET(IIE+JI,:,:) = MAX(XTKEMIN, 2.*PTKET(IIE+JI-1,:,:)-PTKET(IIE+JI-2,:,:))  
+           ELSEWHERE                                  !  INFLOW  condition
+              PTKET(IIE+JI,:,:) =  MAX(XTKEMIN, ZPOND*ZLBXTKET(ILBX-JPHEXT+JI,:,:) + &
+                                   (1.-ZPOND)*PTKET(IIE+JI-1,:,:))
+           ENDWHERE
+        END DO
+     END IF
+    !
+!
+!                      Case with KRR moist variables 
+! 
+! 
+  DO JRR =1 ,KRR
+    ILBX=SIZE(PLBXRM,1)
+    !
+    IF(SIZE(PUT) /= 0) THEN
+       DO JI=1,JPHEXT  
+          WHERE ( PUT(IIE+1,:,:) >= 0. )       !  OUTFLOW condition
+             PRT(IIE+JI,:,:,JRR) = MAX(0.,2.*PRT(IIE+JI-1,:,:,JRR) -PRT(IIE+JI-2,:,:,JRR))
+          ELSEWHERE                            !  INFLOW  condition
+             PRT(IIE+JI,:,:,JRR) = MAX(0.,ZLBXRT(ILBX-JPHEXT+JI,:,:,JRR))
+          END WHERE
+       END DO
+    END IF
+    !
+  END DO
+!
+  IF(SIZE(PSRCT) /= 0) THEN
+     DO JI=1,JPHEXT 
+        PSRCT (IIE+JI,:,:)   = PSRCT (IIE+JI-1,:,:)
+     END DO
+  END IF
+!                       Case with KSV scalar variables  
+  DO JSV=1 ,KSV
+    ILBX=SIZE(PLBXSVM,1)
+    IF(SIZE(PUT) /= 0) THEN
+       DO JI=1,JPHEXT 
+          WHERE ( PUT(IIE+1,:,:) >= 0. )       !  OUTFLOW condition
+             PSVT(IIE+JI,:,:,JSV) = MAX(XSVMIN(JSV),2.*PSVT(IIE+JI-1,:,:,JSV) - &
+                  PSVT(IIE+JI-2,:,:,JSV))
+          ELSEWHERE                            !  INFLOW  condition
+             PSVT(IIE+JI,:,:,JSV) = MAX(XSVMIN(JSV),ZLBXSVT(ILBX-JPHEXT+JI,:,:,JSV))
+          END WHERE
+       END DO
+    END IF
+    !
+  END DO
+!
+  IF(LBLOWSNOW) THEN
+    DO JSV=1 ,3
+      WHERE ( PUT(IIE+1,:,IKB) >= 0. )       !  OUTFLOW condition
+        XSNWCANO(IIE+1,:,JSV) = MAX(0.,2.*XSNWCANO(IIE,:,JSV) - &
+                                              XSNWCANO(IIE-1,:,JSV))
+      ELSEWHERE                            !  INFLOW  condition
+        XSNWCANO(IIE+1,:,JSV) = 0.         ! Assume no snow enter throug
+                                           ! boundaries
+      END WHERE
+    END DO
+    DO JSV=NSV_SNWBEG ,NSV_SNWEND
+    IF(SIZE(PUT) /= 0) THEN
+      WHERE ( PUT(IIE+1,:,:) >= 0. )       !  OUTFLOW condition
+        PSVT(IIE+1,:,:,JSV) = MAX(0.,2.*PSVT(IIE,:,:,JSV) - &
+                                               PSVT(IIE-1,:,:,JSV))
+      ELSEWHERE                            !  INFLOW  condition
+        PSVT(IIE+1,:,:,JSV) = 0.           ! Assume no snow enter throug
+                                           ! boundaries
+      END WHERE
+    END IF
+    !
+  END DO
+  END IF
+!
+END SELECT
+!
+END IF
+!-------------------------------------------------------------------------------
+!
+!*       6.    LBC FILLING IN THE Y DIRECTION (BOTTOM SOUTH SIDE): 
+!              ------------------------------
+IF (LSOUTH_ll( )) THEN
+!
+SELECT CASE ( HLBCY(1) )              
+!
+!*       6.1  WALL CASE:
+!             ========= 
+!
+  CASE ('WALL')
+!
+    DO JEXT=1,JPHEXT
+       IF(SIZE(PUT) /= 0) PUT  (:,IJB-JEXT,:)   = PUT  (:,IJB-1+JEXT,:)
+       IF(SIZE(PVT) /= 0) PVT  (:,IJB-JEXT,:)   = PVT  (:,IJB       ,:)   ! never used during run
+       IF(SIZE(PWT) /= 0) PWT  (:,IJB-JEXT,:)   = PWT  (:,IJB-1+JEXT,:)
+       IF(SIZE(PTHT) /= 0) PTHT (:,IJB-JEXT,:)  = PTHT (:,IJB-1+JEXT,:)
+       IF(SIZE(PTKET) /= 0) PTKET(:,IJB-JEXT,:) = PTKET(:,IJB-1+JEXT,:)
+       IF(SIZE(PRT) /= 0) PRT  (:,IJB-JEXT,:,:) = PRT  (:,IJB-1+JEXT,:,:)
+       IF(SIZE(PSVT) /= 0) PSVT (:,IJB-JEXT,:,:)= PSVT (:,IJB-1+JEXT,:,:)
+       IF(SIZE(PSRCT) /= 0) PSRCT(:,IJB-JEXT,:) = PSRCT(:,IJB-1+JEXT,:)
+       IF(LBLOWSNOW) XSNWCANO(:,IJB-JEXT,:)     = XSNWCANO(:,IJB-1+JEXT,:)     
+!
+    END DO
+!
+    IF(SIZE(PVT) /= 0) PVT(:,IJB     ,:)   = 0.       ! set the normal velocity
+!
+!*       6.2  OPEN CASE:
+!             =========
+!
+  CASE ('OPEN')
+!
+    IF(SIZE(PVT) /= 0) THEN
+       DO JJ=JPHEXT,1,-1
+          PVT(:,JJ,:)=0.
+          WHERE ( PVT(:,IJB,:) <= 0. )               !  OUTFLOW condition
+             PUT  (:,JJ,:) = 2.*PUT  (:,JJ+1,:)   -PUT  (:,JJ+2,:)
+             PWT  (:,JJ,:) = 2.*PWT  (:,JJ+1,:)   -PWT  (:,JJ+2,:)
+             PTHT (:,JJ,:) = 2.*PTHT (:,JJ+1,:)   -PTHT (:,JJ+2,:)
+          ELSEWHERE                                   !  INFLOW  condition
+             PUT  (:,JJ,:) = ZPOND*ZLBYUT   (:,JJ,:) + (1.-ZPOND)* PUT(:,JJ+1,:)
+             PWT  (:,JJ,:) = ZPOND*ZLBYWT   (:,JJ,:) + (1.-ZPOND)* PWT(:,JJ+1,:)
+             PTHT (:,JJ,:) = ZPOND*ZLBYTHT  (:,JJ,:) + (1.-ZPOND)* PTHT(:,JJ+1,:)
+          ENDWHERE
+       END DO
+    ENDIF
+!
+  IF(SIZE(PTKET) /= 0) THEN
+     DO JJ=JPHEXT,1,-1
+        WHERE ( PVT(:,IJB,:) <= 0. )             !  OUTFLOW condition
+           PTKET(:,JJ,:) = MAX(XTKEMIN, 2.*PTKET(:,JJ+1,:)-PTKET(:,JJ+2,:))  
+        ELSEWHERE                                !  INFLOW  condition
+           PTKET(:,JJ,:) =  MAX(XTKEMIN,ZPOND*ZLBYTKET(:,JJ,:) +  &
+                            (1.-ZPOND)*PTKET(:,JJ+1,:))
+        ENDWHERE
+     END DO
+  END IF
+    !
+!
+!                      Case with KRR moist variables 
+! 
+! 
+  DO JRR =1 ,KRR
+    IF(SIZE(PVT) /= 0) THEN
+       DO JJ=JPHEXT,1,-1
+          WHERE ( PVT(:,IJB,:) <= 0. )         !  OUTFLOW condition
+             PRT(:,JJ,:,JRR) = MAX(0.,2.*PRT(:,JJ+1,:,JRR) -PRT(:,JJ+2,:,JRR))
+          ELSEWHERE                            !  INFLOW  condition
+             PRT(:,JJ,:,JRR) = MAX(0.,ZLBYRT(:,JJ,:,JRR))
+          END WHERE
+       END DO
+    END IF
+    !
+  END DO
+!
+  IF(SIZE(PSRCT) /= 0) THEN
+     DO JJ=JPHEXT,1,-1
+        PSRCT(:,JJ,:)   = PSRCT(:,JJ+1,:)
+     END DO
+  END IF
+!
+!                       Case with KSV scalar variables  
+!
+  DO JSV=1 ,KSV
+    IF(SIZE(PVT) /= 0) THEN
+       DO JJ=JPHEXT,1,-1
+          WHERE ( PVT(:,IJB,:) <= 0. )         !  OUTFLOW condition
+             PSVT(:,JJ,:,JSV) = MAX(XSVMIN(JSV),2.*PSVT(:,JJ+1,:,JSV) - &
+                  PSVT(:,JJ+2,:,JSV))
+          ELSEWHERE                            !  INFLOW  condition
+             PSVT(:,JJ,:,JSV) = MAX(XSVMIN(JSV),ZLBYSVT(:,JJ,:,JSV))
+          END WHERE
+       END DO
+    END IF
+    !
+  END DO
+!
+   IF(LBLOWSNOW) THEN
+    DO JSV=1 ,3
+      WHERE ( PVT(:,IJB,IKB) <= 0. )         !  OUTFLOW condition
+        XSNWCANO(:,IJB-1,JSV) = MAX(0.,2.*XSNWCANO(:,IJB,JSV) - &
+                                             XSNWCANO(:,IJB+1,JSV))
+      ELSEWHERE                            !  INFLOW  condition
+        XSNWCANO(:,IJB-1,JSV) = 0.         ! Assume no snow enter throug
+                                           ! boundaries
+      END WHERE
+    END DO
+   DO JSV=NSV_SNWBEG ,NSV_SNWEND
+    IF(SIZE(PVT) /= 0) THEN
+      WHERE ( PVT(:,IJB,:) <= 0. )         !  OUTFLOW condition
+        PSVT(:,IJB-1,:,JSV) = MAX(0.,2.*PSVT(:,IJB,:,JSV) - &
+                                               PSVT(:,IJB+1,:,JSV))
+      ELSEWHERE                            !  INFLOW  condition
+        PSVT(:,IJB-1,:,JSV) = 0.           ! Assume no snow enter throug
+                                           ! boundaries
+      END WHERE
+    END IF
+    !
+  END DO
+  END IF 
+!
+!
+END SELECT
+!
+END IF
+!-------------------------------------------------------------------------------
+!
+!*       7.    LBC FILLING IN THE Y DIRECTION (TOP NORTH SIDE): 
+!              ===============
+!
+IF (LNORTH_ll( )) THEN
+!
+SELECT CASE ( HLBCY(2) ) 
+!
+!*       4.3.1  WALL CASE:
+!               ========= 
+!
+  CASE ('WALL')
+!
+    DO JEXT=1,JPHEXT
+       IF(SIZE(PUT) /= 0) PUT  (:,IJE+JEXT,:)   = PUT  (:,IJE+1-JEXT,:)
+       IF(SIZE(PVT) /= 0) PVT  (:,IJE+JEXT,:)   = PVT  (:,IJE       ,:)   ! never used during run
+       IF(SIZE(PWT) /= 0) PWT  (:,IJE+JEXT,:)   = PWT  (:,IJE+1-JEXT,:)
+       IF(SIZE(PTHT) /= 0) PTHT (:,IJE+JEXT,:)  = PTHT (:,IJE+1-JEXT,:)
+       IF(SIZE(PTKET) /= 0) PTKET(:,IJE+JEXT,:) = PTKET(:,IJE+1-JEXT,:)
+       IF(SIZE(PRT) /= 0) PRT  (:,IJE+JEXT,:,:) = PRT  (:,IJE+1-JEXT,:,:)
+       IF(SIZE(PSVT) /= 0) PSVT (:,IJE+JEXT,:,:)= PSVT (:,IJE+1-JEXT,:,:)
+       IF(SIZE(PSRCT) /= 0) PSRCT(:,IJE+JEXT,:) = PSRCT(:,IJE+1-JEXT,:)
+       IF(LBLOWSNOW) XSNWCANO(:,IJE+JEXT,:)     = XSNWCANO(:,IJE+1-JEXT,:)   
+!
+    END DO
+!
+    IF(SIZE(PVT) /= 0) PVT(:,IJE+1   ,:)   = 0.    ! set the normal velocity
+!
+!*       4.3.2  OPEN CASE:
+!               ========= 
+!
+  CASE ('OPEN')
+!
+!
+    ILBY=SIZE(PLBYUM,2)
+    IF(SIZE(PVT) /= 0) THEN
+       DO JJ=1,JPHEXT
+          WHERE ( PVT(:,IJE+1,:) >= 0. )               !  OUTFLOW condition
+             PUT  (:,IJE+JJ,:) = 2.*PUT  (:,IJE+JJ-1,:)   -PUT  (:,IJE+JJ-2,:)
+             PWT  (:,IJE+JJ,:) = 2.*PWT  (:,IJE+JJ-1,:)   -PWT  (:,IJE+JJ-2,:)
+             PTHT (:,IJE+JJ,:) = 2.*PTHT (:,IJE+JJ-1,:)   -PTHT (:,IJE+JJ-2,:)
+          ELSEWHERE                                   !  INFLOW  condition
+             PUT  (:,IJE+JJ,:) = ZPOND*ZLBYUT   (:,ILBY-JPHEXT+JJ,:) + (1.-ZPOND)* PUT(:,IJE+JJ-1,:)
+             PWT  (:,IJE+JJ,:) = ZPOND*ZLBYWT   (:,ILBY-JPHEXT+JJ,:) + (1.-ZPOND)* PWT(:,IJE+JJ-1,:)
+             PTHT (:,IJE+JJ,:) = ZPOND*ZLBYTHT  (:,ILBY-JPHEXT+JJ,:) + (1.-ZPOND)* PTHT(:,IJE+JJ-1,:)
+          ENDWHERE
+       END DO
+    ENDIF
+!
+  IF(SIZE(PTKET) /= 0) THEN
+    ILBY=SIZE(PLBYTKEM,2)
+    DO JJ=1,JPHEXT
+       WHERE ( PVT(:,IJE+1,:) >= 0. )             !  OUTFLOW condition
+          PTKET(:,IJE+JJ,:) = MAX(XTKEMIN, 2.*PTKET(:,IJE+JJ-1,:)-PTKET(:,IJE+JJ-2,:))  
+       ELSEWHERE                                  !  INFLOW  condition
+          PTKET(:,IJE+JJ,:) = MAX(XTKEMIN,ZPOND*ZLBYTKET(:,ILBY-JPHEXT+JJ,:) + &
+                              (1.-ZPOND)*PTKET(:,IJE+JJ-1,:))
+       ENDWHERE
+    END DO
+  ENDIF
+    !
+!                      Case with KRR moist variables 
+! 
+! 
+  DO JRR =1 ,KRR
+    ILBY=SIZE(PLBYRM,2)
+    !
+    IF(SIZE(PVT) /= 0) THEN
+       DO JJ=1,JPHEXT
+          WHERE ( PVT(:,IJE+1,:) >= 0. )         !  OUTFLOW condition
+             PRT(:,IJE+JJ,:,JRR) = MAX(0.,2.*PRT(:,IJE+JJ-1,:,JRR) -PRT(:,IJE+JJ-2,:,JRR))
+          ELSEWHERE                            !  INFLOW  condition
+             PRT(:,IJE+JJ,:,JRR) = MAX(0.,ZLBYRT(:,ILBY-JPHEXT+JJ,:,JRR))
+          END WHERE
+       END DO
+    END IF
+    !
+  END DO
+!
+  IF(SIZE(PSRCT) /= 0) THEN
+      DO JJ=1,JPHEXT
+         PSRCT(:,IJE+JJ,:)   = PSRCT(:,IJE+JJ-1,:)
+      END DO
+  END IF
+!
+!                       Case with KSV scalar variables  
+  DO JSV=1 ,KSV
+    ILBY=SIZE(PLBYSVM,2)
+    !
+    IF(SIZE(PVT) /= 0) THEN
+       DO JJ=1,JPHEXT
+          WHERE ( PVT(:,IJE+1,:) >= 0. )         !  OUTFLOW condition
+             PSVT(:,IJE+JJ,:,JSV) = MAX(XSVMIN(JSV),2.*PSVT(:,IJE+JJ-1,:,JSV) - &
+                  PSVT(:,IJE+JJ-2,:,JSV))
+          ELSEWHERE                            !  INFLOW  condition
+             PSVT(:,IJE+JJ,:,JSV) = MAX(XSVMIN(JSV),ZLBYSVT(:,ILBY-JPHEXT+JJ,:,JSV))
+          END WHERE
+       END DO
+    END IF
+    !
+  END DO
+!
+    IF(LBLOWSNOW) THEN
+  DO JSV=1 ,3
+    WHERE ( PVT(:,IJE+1,IKB) >= 0. )         !  OUTFLOW condition
+      XSNWCANO(:,IJE+1,JSV) = MAX(0.,2.*XSNWCANO(:,IJE,JSV) - &
+                                            XSNWCANO(:,IJE-1,JSV))
+    ELSEWHERE                            !  INFLOW  condition
+      XSNWCANO(:,IJE+1,JSV) = 0.         ! Assume no snow enter throug
+                                         ! boundaries
+    END WHERE
+  END DO
+  DO JSV=NSV_SNWBEG ,NSV_SNWEND
+    !
+    IF(SIZE(PVT) /= 0) THEN
+      WHERE ( PVT(:,IJE+1,:) >= 0. )         !  OUTFLOW condition
+        PSVT(:,IJE+1,:,JSV) = MAX(0.,2.*PSVT(:,IJE,:,JSV) - &
+                                               PSVT(:,IJE-1,:,JSV))
+      ELSEWHERE                            !  INFLOW  condition
+        PSVT(:,IJE+1,:,JSV) = 0.           ! Assume no snow enter throug
+                                           ! boundaries
+      END WHERE
+    END IF
+    !
+  END DO
+  ENDIF
+!
+END SELECT
+END IF
+!
+!
+IF (CCLOUD == 'LIMA' .AND. IMI == 1 .AND. CPROGRAM=='MESONH') THEN
+
+   ZSVT=PSVT
+   ZRT=PRT
+
+  IF (GFIRSTCALLLIMA) THEN
+    ALLOCATE(GLIMABOUNDARY(NSV_LIMA))
+    GFIRSTCALLLIMA = .FALSE.
+    DO JSV=NSV_LIMA_BEG,NSV_LIMA_END
+       GCHTMP = .FALSE.
+       IF (LWEST_ll().AND.HLBCX(1)=='OPEN')  GCHTMP = GCHTMP .OR. ALL(PLBXSVM(JPHEXT,:,:,JSV)==0)
+       IF (LEAST_ll().AND.HLBCX(2)=='OPEN')  GCHTMP = GCHTMP .OR. ALL(PLBXSVM(ILBX-JPHEXT+1,:,:,JSV)==0)
+       IF (LSOUTH_ll().AND.HLBCY(1)=='OPEN') GCHTMP = GCHTMP .OR. ALL(PLBYSVM(:,JPHEXT,:,JSV)==0)
+       IF (LNORTH_ll().AND.HLBCY(2)=='OPEN') GCHTMP = GCHTMP .OR. ALL(PLBYSVM(:,ILBY-JPHEXT+1,:,JSV)==0)
+       GLIMABOUNDARY(JSV-NSV_LIMA_BEG+1) = GCHTMP
+    ENDDO
+  ENDIF
+  CALL INIT_AEROSOL_CONCENTRATION(PRHODREF,ZSVT,XZZ)
+  DO JSV=NSV_LIMA_CCN_FREE,NSV_LIMA_CCN_FREE+NMOD_CCN-1 ! LBC for CCN
+     IF (GLIMABOUNDARY(JSV-NSV_LIMA_BEG+1)) THEN
+        PSVT(IIB-1,:,:,JSV)=ZSVT(IIB-1,:,:,JSV)
+        PSVT(IIE+1,:,:,JSV)=ZSVT(IIE+1,:,:,JSV)
+        PSVT(:,IJB-1,:,JSV)=ZSVT(:,IJB-1,:,JSV)
+        PSVT(:,IJE+1,:,JSV)=ZSVT(:,IJE+1,:,JSV)
+     ENDIF
+  END DO
+  DO JSV=NSV_LIMA_IFN_FREE,NSV_LIMA_IFN_FREE+NMOD_IFN-1 ! LBC for IFN
+     IF (GLIMABOUNDARY(JSV-NSV_LIMA_BEG+1)) THEN
+        PSVT(IIB-1,:,:,JSV)=ZSVT(IIB-1,:,:,JSV)
+        PSVT(IIE+1,:,:,JSV)=ZSVT(IIE+1,:,:,JSV)
+        PSVT(:,IJB-1,:,JSV)=ZSVT(:,IJB-1,:,JSV)
+        PSVT(:,IJE+1,:,JSV)=ZSVT(:,IJE+1,:,JSV)
+     ENDIF
+  END DO
+
+  CALL SET_CONC_LIMA( IMI, 'NONE', PRHODREF, ZRT(:, :, :, :), ZSVT(:, :, :, NSV_LIMA_BEG:NSV_LIMA_END) )
+  IF (NSV_LIMA_NC.GE.1) THEN
+     IF (GLIMABOUNDARY(NSV_LIMA_NC-NSV_LIMA_BEG+1)) THEN
+        PSVT(IIB-1,:,:,NSV_LIMA_NC)=ZSVT(IIB-1,:,:,NSV_LIMA_NC) ! cloud
+        PSVT(IIE+1,:,:,NSV_LIMA_NC)=ZSVT(IIE+1,:,:,NSV_LIMA_NC)
+        PSVT(:,IJB-1,:,NSV_LIMA_NC)=ZSVT(:,IJB-1,:,NSV_LIMA_NC)
+        PSVT(:,IJE+1,:,NSV_LIMA_NC)=ZSVT(:,IJE+1,:,NSV_LIMA_NC)
+     ENDIF
+  ENDIF
+  IF (NSV_LIMA_NR.GE.1) THEN
+     IF (GLIMABOUNDARY(NSV_LIMA_NR-NSV_LIMA_BEG+1)) THEN
+        PSVT(IIB-1,:,:,NSV_LIMA_NR)=ZSVT(IIB-1,:,:,NSV_LIMA_NR) ! rain
+        PSVT(IIE+1,:,:,NSV_LIMA_NR)=ZSVT(IIE+1,:,:,NSV_LIMA_NR)
+        PSVT(:,IJB-1,:,NSV_LIMA_NR)=ZSVT(:,IJB-1,:,NSV_LIMA_NR)
+        PSVT(:,IJE+1,:,NSV_LIMA_NR)=ZSVT(:,IJE+1,:,NSV_LIMA_NR)
+     ENDIF
+  ENDIF
+  IF (NSV_LIMA_NI.GE.1) THEN
+     IF (GLIMABOUNDARY(NSV_LIMA_NI-NSV_LIMA_BEG+1)) THEN
+        PSVT(IIB-1,:,:,NSV_LIMA_NI)=ZSVT(IIB-1,:,:,NSV_LIMA_NI) ! ice
+        PSVT(IIE+1,:,:,NSV_LIMA_NI)=ZSVT(IIE+1,:,:,NSV_LIMA_NI)
+        PSVT(:,IJB-1,:,NSV_LIMA_NI)=ZSVT(:,IJB-1,:,NSV_LIMA_NI)
+        PSVT(:,IJE+1,:,NSV_LIMA_NI)=ZSVT(:,IJE+1,:,NSV_LIMA_NI)
+     ENDIF
+  END IF
+END IF
+!
+!
+IF (LUSECHEM .AND. IMI == 1) THEN
+  IF (GFIRSTCALL1) THEN
+    ALLOCATE(GCHBOUNDARY(NSV_CHEM))
+    GFIRSTCALL1 = .FALSE.
+    DO JSV=NSV_CHEMBEG,NSV_CHEMEND
+       GCHTMP = .FALSE.
+       IF (LWEST_ll().AND.HLBCX(1)=='OPEN')  GCHTMP = GCHTMP .OR. ALL(PLBXSVM(JPHEXT,:,:,JSV)==0)
+       IF (LEAST_ll().AND.HLBCX(2)=='OPEN')  GCHTMP = GCHTMP .OR. ALL(PLBXSVM(ILBX-JPHEXT+1,:,:,JSV)==0)
+       IF (LSOUTH_ll().AND.HLBCY(1)=='OPEN') GCHTMP = GCHTMP .OR. ALL(PLBYSVM(:,JPHEXT,:,JSV)==0)
+       IF (LNORTH_ll().AND.HLBCY(2)=='OPEN') GCHTMP = GCHTMP .OR. ALL(PLBYSVM(:,ILBY-JPHEXT+1,:,JSV)==0)
+       GCHBOUNDARY(JSV-NSV_CHEMBEG+1) = GCHTMP
+    ENDDO
+  ENDIF
+
+  DO JSV=NSV_CHEMBEG,NSV_CHEMEND
+    IF (GCHBOUNDARY(JSV-NSV_CHEMBEG+1))  THEN
+      IF (SIZE(PSVT)>0) THEN
+        CALL CH_BOUNDARIES (HLBCX,HLBCY,PUT,PVT,PSVT(:,:,:,JSV),XSVMIN(JSV))
+      ENDIF
+    ENDIF
+  ENDDO
+ENDIF
+!
+IF (LUSECHIC .AND. IMI == 1) THEN
+  IF (GFIRSTCALLIC) THEN
+    ALLOCATE(GICBOUNDARY(NSV_CHIC))
+    GFIRSTCALLIC = .FALSE.
+    DO JSV=NSV_CHICBEG,NSV_CHICEND
+       GCHTMP = .FALSE.
+       IF (LWEST_ll().AND.HLBCX(1)=='OPEN')  GCHTMP = GCHTMP .OR. ALL(PLBXSVM(JPHEXT,:,:,JSV)==0)
+       IF (LEAST_ll().AND.HLBCX(2)=='OPEN')  GCHTMP = GCHTMP .OR. ALL(PLBXSVM(ILBX-JPHEXT+1,:,:,JSV)==0)
+       IF (LSOUTH_ll().AND.HLBCY(1)=='OPEN') GCHTMP = GCHTMP .OR. ALL(PLBYSVM(:,JPHEXT,:,JSV)==0)
+       IF (LNORTH_ll().AND.HLBCY(2)=='OPEN') GCHTMP = GCHTMP .OR. ALL(PLBYSVM(:,ILBY-JPHEXT+1,:,JSV)==0)
+       GICBOUNDARY(JSV-NSV_CHICBEG+1) = GCHTMP
+    ENDDO
+  ENDIF
+
+  DO JSV=NSV_CHICBEG,NSV_CHICEND
+    IF (GICBOUNDARY(JSV-NSV_CHICBEG+1))  THEN
+      IF (SIZE(PSVT)>0) THEN
+        CALL CH_BOUNDARIES (HLBCX,HLBCY,PUT,PVT,PSVT(:,:,:,JSV),XSVMIN(JSV))
+      ENDIF
+    ENDIF
+  ENDDO
+ENDIF
+IF (LORILAM .AND. IMI == 1) THEN
+  IF (GFIRSTCALL2) THEN
+    ALLOCATE(GAERBOUNDARY(NSV_AER))
+    GFIRSTCALL2 = .FALSE.
+    DO JSV=NSV_AERBEG,NSV_AEREND
+       GCHTMP = .FALSE.
+       IF (LWEST_ll().AND.HLBCX(1)=='OPEN')  GCHTMP = GCHTMP .OR. ALL(PLBXSVM(JPHEXT,:,:,JSV)==0)
+       IF (LEAST_ll().AND.HLBCX(2)=='OPEN')  GCHTMP = GCHTMP .OR. ALL(PLBXSVM(ILBX-JPHEXT+1,:,:,JSV)==0)
+       IF (LSOUTH_ll().AND.HLBCY(1)=='OPEN') GCHTMP = GCHTMP .OR. ALL(PLBYSVM(:,JPHEXT,:,JSV)==0)
+       IF (LNORTH_ll().AND.HLBCY(2)=='OPEN') GCHTMP = GCHTMP .OR. ALL(PLBYSVM(:,ILBY-JPHEXT+1,:,JSV)==0)
+       GAERBOUNDARY(JSV-NSV_AERBEG+1) = GCHTMP
+    ENDDO
+  ENDIF
+
+  DO JSV=NSV_AERBEG,NSV_AEREND
+    IF (GAERBOUNDARY(JSV-NSV_AERBEG+1)) THEN
+      IF (SIZE(PSVT)>0) THEN
+        CALL CH_BOUNDARIES (HLBCX,HLBCY,PUT,PVT,PSVT(:,:,:,JSV),XSVMIN(JSV))
+      ENDIF
+    ENDIF
+  ENDDO
+ENDIF
+!
+IF (LDUST .AND. IMI == 1) THEN
+  IF (GFIRSTCALL3) THEN
+    ALLOCATE(GDSTBOUNDARY(NSV_DST))
+    GFIRSTCALL3 = .FALSE.
+    DO JSV=NSV_DSTBEG,NSV_DSTEND
+       GCHTMP = .FALSE.
+       IF (LWEST_ll().AND.HLBCX(1)=='OPEN')  GCHTMP = GCHTMP .OR. ALL(PLBXSVM(JPHEXT,:,:,JSV)==0)
+       IF (LEAST_ll().AND.HLBCX(2)=='OPEN')  GCHTMP = GCHTMP .OR. ALL(PLBXSVM(ILBX-JPHEXT+1,:,:,JSV)==0)
+       IF (LSOUTH_ll().AND.HLBCY(1)=='OPEN') GCHTMP = GCHTMP .OR. ALL(PLBYSVM(:,JPHEXT,:,JSV)==0)
+       IF (LNORTH_ll().AND.HLBCY(2)=='OPEN') GCHTMP = GCHTMP .OR. ALL(PLBYSVM(:,ILBY-JPHEXT+1,:,JSV)==0)
+       GDSTBOUNDARY(JSV-NSV_DSTBEG+1) = GCHTMP
+    ENDDO
+    ENDIF
+
+  DO JSV=NSV_DSTBEG,NSV_DSTEND
+    IF (GDSTBOUNDARY(JSV-NSV_DSTBEG+1)) THEN
+      IF (SIZE(PSVT)>0) THEN
+        CALL CH_BOUNDARIES (HLBCX,HLBCY,PUT,PVT,PSVT(:,:,:,JSV),XSVMIN(JSV))
+      ENDIF
+    ENDIF
+  ENDDO 
+ENDIF
+!
+IF (LSALT .AND. IMI == 1) THEN
+  IF (GFIRSTCALL5) THEN
+    ALLOCATE(GSLTBOUNDARY(NSV_SLT))
+    GFIRSTCALL5 = .FALSE.
+    DO JSV=NSV_SLTBEG,NSV_SLTEND
+       GCHTMP = .FALSE.
+       IF (LWEST_ll().AND.HLBCX(1)=='OPEN')  GCHTMP = GCHTMP .OR. ALL(PLBXSVM(JPHEXT,:,:,JSV)==0)
+       IF (LEAST_ll().AND.HLBCX(2)=='OPEN')  GCHTMP = GCHTMP .OR. ALL(PLBXSVM(ILBX-JPHEXT+1,:,:,JSV)==0)
+       IF (LSOUTH_ll().AND.HLBCY(1)=='OPEN') GCHTMP = GCHTMP .OR. ALL(PLBYSVM(:,JPHEXT,:,JSV)==0)
+       IF (LNORTH_ll().AND.HLBCY(2)=='OPEN') GCHTMP = GCHTMP .OR. ALL(PLBYSVM(:,ILBY-JPHEXT+1,:,JSV)==0)
+       GSLTBOUNDARY(JSV-NSV_SLTBEG+1) = GCHTMP
+    ENDDO
+  ENDIF
+
+  DO JSV=NSV_SLTBEG,NSV_SLTEND
+    IF (GSLTBOUNDARY(JSV-NSV_SLTBEG+1)) THEN
+      IF (SIZE(PSVT)>0) THEN
+        CALL CH_BOUNDARIES (HLBCX,HLBCY,PUT,PVT,PSVT(:,:,:,JSV),XSVMIN(JSV))
+      ENDIF
+    ENDIF
+  ENDDO
+ENDIF
+!
+IF ( LPASPOL .AND. IMI == 1) THEN
+  IF (GFIRSTCALLPP) THEN
+    ALLOCATE(GPPBOUNDARY(NSV_PP))
+    GFIRSTCALLPP = .FALSE.
+    DO JSV=NSV_PPBEG,NSV_PPEND
+      GPPTMP = .FALSE.
+      IF (LWEST_ll().AND.HLBCX(1)=='OPEN') GPPTMP = GPPTMP .OR. ALL(PLBXSVM(JPHEXT,:,:,JSV)==0)
+      IF (LEAST_ll().AND.HLBCX(2)=='OPEN') GPPTMP = GPPTMP .OR. ALL(PLBXSVM(ILBX-JPHEXT+1,:,:,JSV)==0)
+      IF (LSOUTH_ll().AND.HLBCY(1)=='OPEN') GPPTMP = GPPTMP .OR. ALL(PLBYSVM(:,JPHEXT,:,JSV)==0)
+      IF (LNORTH_ll().AND.HLBCY(2)=='OPEN') GPPTMP = GPPTMP .OR. ALL(PLBYSVM(:,ILBY-JPHEXT+1,:,JSV)==0)
+      GPPBOUNDARY(JSV-NSV_PPBEG+1) = GPPTMP
+    ENDDO
+  ENDIF
+
+  DO JSV=NSV_PPBEG,NSV_PPEND
+    IF (GPPBOUNDARY(JSV-NSV_PPBEG+1)) THEN
+      IF (SIZE(PSVT)>0) THEN
+        CALL CH_BOUNDARIES (HLBCX,HLBCY,PUT,PVT,PSVT(:,:,:,JSV),XSVMIN(JSV))
+      ENDIF
+    ENDIF
+  ENDDO
+ENDIF
+!
+IF ( LCONDSAMP .AND. IMI == 1) THEN
+  IF (GFIRSTCALLCS) THEN
+    ALLOCATE(GCSBOUNDARY(NSV_CS))
+    GFIRSTCALLCS = .FALSE.
+    DO JSV=NSV_CSBEG,NSV_CSEND
+      GCSTMP = .FALSE.
+      IF (LWEST_ll().AND.HLBCX(1)=='OPEN') GCSTMP = GCSTMP .OR. ALL(PLBXSVM(JPHEXT,:,:,JSV)==0)
+      IF (LEAST_ll().AND.HLBCX(2)=='OPEN') GCSTMP = GCSTMP .OR. ALL(PLBXSVM(ILBX-JPHEXT+1,:,:,JSV)==0)
+      IF (LSOUTH_ll().AND.HLBCY(1)=='OPEN') GCSTMP = GCSTMP .OR. ALL(PLBYSVM(:,JPHEXT,:,JSV)==0)
+      IF (LNORTH_ll().AND.HLBCY(2)=='OPEN') GCSTMP = GCSTMP .OR. ALL(PLBYSVM(:,ILBY-JPHEXT+1,:,JSV)==0)
+      GCSBOUNDARY(JSV-NSV_CSBEG+1) = GCSTMP
+    ENDDO
+  ENDIF
+
+  DO JSV=NSV_CSBEG,NSV_CSEND
+    IF (GCSBOUNDARY(JSV-NSV_CSBEG+1)) THEN
+      IF (SIZE(PSVT)>0) THEN
+        CALL CH_BOUNDARIES (HLBCX,HLBCY,PUT,PVT,PSVT(:,:,:,JSV),XSVMIN(JSV))
+      ENDIF
+    ENDIF
+  ENDDO
+ENDIF
+
+IF (LBLOWSNOW .AND. IMI == 1) THEN
+  IF (GFIRSTCALL3) THEN
+    ALLOCATE(GSNWBOUNDARY(NSV_SNW))
+    GFIRSTCALL3 = .FALSE.
+    DO JSV=NSV_SNWBEG,NSV_SNWEND
+       GCHTMP = .FALSE.
+       IF (LWEST_ll().AND.HLBCX(1)=='OPEN')  GCHTMP = GCHTMP .OR. ALL(PLBXSVM(1,:,:,JSV)==0)
+       IF (LEAST_ll().AND.HLBCX(2)=='OPEN')  GCHTMP = GCHTMP .OR. ALL(PLBXSVM(ILBX,:,:,JSV)==0)
+       IF (LSOUTH_ll().AND.HLBCY(1)=='OPEN') GCHTMP = GCHTMP .OR. ALL(PLBYSVM(:,1,:,JSV)==0)
+       IF (LNORTH_ll().AND.HLBCY(2)=='OPEN') GCHTMP = GCHTMP .OR. ALL(PLBYSVM(:,ILBY,:,JSV)==0)
+       GSNWBOUNDARY(JSV-NSV_SNWBEG+1) = GCHTMP
+    ENDDO
+  ENDIF
+ENDIF
+
+#ifdef MNH_FOREFIRE
+!ForeFire 
+IF ( LFOREFIRE .AND. IMI == 1) THEN
+  IF (GFIRSTCALLFF) THEN
+    ALLOCATE(GFFBOUNDARY(NSV_FF))
+    GFIRSTCALLFF = .FALSE.
+    DO JSV=NSV_FFBEG,NSV_FFEND
+      GFFTMP = .FALSE.
+      IF (LWEST_ll().AND.HLBCX(1)=='OPEN') GFFTMP = GFFTMP .OR. ALL(PLBXSVM(JPHEXT,:,:,JSV)==0)
+      IF (LEAST_ll().AND.HLBCX(2)=='OPEN') GFFTMP = GFFTMP .OR. ALL(PLBXSVM(ILBX-JPHEXT+1,:,:,JSV)==0)
+      IF (LSOUTH_ll().AND.HLBCY(1)=='OPEN') GFFTMP = GFFTMP .OR. ALL(PLBYSVM(:,JPHEXT,:,JSV)==0)
+      IF (LNORTH_ll().AND.HLBCY(2)=='OPEN') GFFTMP = GFFTMP .OR. ALL(PLBYSVM(:,ILBY-JPHEXT+1,:,JSV)==0)
+      GFFBOUNDARY(JSV-NSV_FFBEG+1) = GFFTMP
+    ENDDO
+  ENDIF
+
+  DO JSV=NSV_FFBEG,NSV_FFEND
+    IF (GFFBOUNDARY(JSV-NSV_FFBEG+1)) THEN
+      IF (SIZE(PSVT)>0) THEN
+        CALL CH_BOUNDARIES (HLBCX,HLBCY,PUT,PVT,PSVT(:,:,:,JSV),XSVMIN(JSV))
+      ENDIF
+    ENDIF
+  ENDDO
+ENDIF
+#endif
+!
+IF ( CELEC /= 'NONE' .AND. (NSV_ELEC_A(NDAD(IMI)) == 0 .OR. IMI == 1)) THEN
+  CALL ION_BOUNDARIES (HLBCX,HLBCY,PUT,PVT,PSVT)
+ENDIF
+!
+!-------------------------------------------------------------------------------
+!
+END SUBROUTINE BOUNDARIES
diff --git a/src/PHYEX/ext/ch_aqueous_sedim1mom.f90 b/src/PHYEX/ext/ch_aqueous_sedim1mom.f90
new file mode 100644
index 0000000000000000000000000000000000000000..ba0b6ffd5418befa08bfb5c44cdb761c3856a448
--- /dev/null
+++ b/src/PHYEX/ext/ch_aqueous_sedim1mom.f90
@@ -0,0 +1,382 @@
+!MNH_LIC Copyright 2007-2019 CNRS, Meteo-France and Universite Paul Sabatier
+!MNH_LIC This is part of the Meso-NH software governed by the CeCILL-C licence
+!MNH_LIC version 1. See LICENSE, CeCILL-C_V1-en.txt and CeCILL-C_V1-fr.txt
+!MNH_LIC for details. version 1.
+!-------------------------------------------------------------------------------
+!      ################################
+       MODULE MODI_CH_AQUEOUS_SEDIM1MOM
+!      ################################
+!
+INTERFACE
+      SUBROUTINE CH_AQUEOUS_SEDIM1MOM (KSPLITR, HCLOUD, OUSECHIC, PTSTEP,  &
+                                       PZZ, PRHODREF, PRHODJ, PRRS,        &
+                                       PRSS, PRGS, PRRSVS, PSGRSVS, PINPRR )
+!
+CHARACTER (LEN=4),        INTENT(IN)    :: HCLOUD  ! Cloud parameterization
+INTEGER,                  INTENT(IN)    :: KSPLITR ! Current time
+REAL,                     INTENT(IN)    :: PTSTEP  ! Time step          
+LOGICAL,                  INTENT(IN)    :: OUSECHIC ! flag for ice chem.
+!
+REAL, DIMENSION(:,:,:),   INTENT(IN)    :: PZZ     ! Height (z)
+REAL, DIMENSION(:,:,:),   INTENT(IN)    :: PRHODREF! Reference density
+REAL, DIMENSION(:,:,:),   INTENT(IN)    :: PRHODJ  ! Dry density * Jacobian
+REAL, DIMENSION(:,:,:),   INTENT(IN)    :: PRRS    ! Rainwater m.r. source
+REAL, DIMENSION(:,:,:),   INTENT(IN)    :: PRSS    ! Snow m.r. source
+REAL, DIMENSION(:,:,:),   INTENT(IN)    :: PRGS    ! Graupel m.r. source
+REAL, DIMENSION(:,:,:,:), INTENT(INOUT) :: PRRSVS  ! Rainwater aq. species source
+REAL, DIMENSION(:,:,:,:), INTENT(INOUT) :: PSGRSVS ! Precip. ice species source
+REAL, DIMENSION(:,:),     INTENT(OUT)   :: PINPRR  ! instantaneaous precip.
+!
+END SUBROUTINE CH_AQUEOUS_SEDIM1MOM
+END INTERFACE
+END MODULE MODI_CH_AQUEOUS_SEDIM1MOM
+!
+!     ######################################################################
+      SUBROUTINE CH_AQUEOUS_SEDIM1MOM (KSPLITR, HCLOUD, OUSECHIC, PTSTEP,  &
+                                       PZZ, PRHODREF, PRHODJ, PRRS,        &
+                                       PRSS, PRGS, PRRSVS, PSGRSVS, PINPRR )
+!     ######################################################################
+!
+!!****  * -  compute the explicit microphysical sources 
+!!
+!!    PURPOSE
+!!    -------
+!!      The purpose of this routine is to compute the sedimentation
+!!   of chemical species in the raindrops for the Kessler, ICE2, ICE3 and
+!!   ICE4 cloud microphysical scheme
+!!      The sedimentation rates are computed with a time spliting technique: 
+!!    an upstream scheme, written as a difference of non-advective fluxes. 
+!!    This source term is added to the next coming time step (split-implicit 
+!!    process). see rain_ice.f90
+!!
+!!
+!!**  METHOD
+!!    ------
+!!
+!!    EXTERNAL
+!!    --------
+!!      None
+!!     
+!!    IMPLICIT ARGUMENTS
+!!    ------------------
+!!      Module MODD_PARAMETERS
+!!          JPHEXT       : Horizontal external points number
+!!          JPVEXT       : Vertical external points number
+!!      Module MODD_CONF :
+!!          CCONF configuration of the model for the first time step
+!!
+!!    REFERENCE
+!!    ---------
+!!      Book1 of the documentation ( routine CH_AQUEOUS_SEDIM1MOM )
+!!
+!!    AUTHOR
+!!    ------
+!!      J.-P. Pinty      * Laboratoire d'Aerologie*
+!!
+!!    MODIFICATIONS
+!!    -------------
+!!    Original    22/07/07
+!!    04/11/08 (M Leriche) add ICE3    
+!!    17/09/10 (M Leriche) add LUSECHIC flag
+!!    J.Escobar : 15/09/2015 : WENO5 & JPHEXT <> 1 
+!!    16/12/15 (M Leriche) compute instantaneous rain at the surface
+!  P. Wautelet 12/02/2019: bugfix: ZRR_SEDIM was not initialized everywhere
+!  P. Wautelet 26/04/2019: replace non-standard FLOAT function by REAL function
+!  P. Wautelet 28/05/2019: move COUNTJV function to tools.f90
+!
+!-------------------------------------------------------------------------------
+!
+!*       0.    DECLARATIONS
+!              ------------
+!
+USE MODD_PARAMETERS,      ONLY : JPHEXT, JPVEXT
+USE MODD_CONF
+USE MODD_CST,             ONLY : XRHOLW
+USE MODD_CLOUDPAR,        ONLY : VCEXVT=>XCEXVT, XCRS, XCEXRS
+USE MODD_RAIN_ICE_DESCR_n,  ONLY : WCEXVT=>XCEXVT, WRTMIN=>XRTMIN
+USE MODD_RAIN_ICE_PARAM_n,  ONLY : XFSEDR, XEXSEDR, &
+                                 XFSEDS, XEXSEDS, &
+                                 XFSEDG, XEXSEDG
+
+use mode_tools,           only: Countjv
+use mode_tools_ll,        only: GET_INDICE_ll
+
+IMPLICIT NONE
+!
+!*       0.1   Declarations of dummy arguments :
+!
+!
+CHARACTER (LEN=4),        INTENT(IN)    :: HCLOUD  ! Cloud parameterization
+INTEGER,                  INTENT(IN)    :: KSPLITR ! Current time
+REAL,                     INTENT(IN)    :: PTSTEP  ! Time step          
+LOGICAL,                  INTENT(IN)    :: OUSECHIC ! flag for ice chem.
+!
+REAL, DIMENSION(:,:,:),   INTENT(IN)    :: PZZ     ! Height (z)
+REAL, DIMENSION(:,:,:),   INTENT(IN)    :: PRHODREF! Reference density
+REAL, DIMENSION(:,:,:),   INTENT(IN)    :: PRHODJ  ! Dry density * Jacobian
+REAL, DIMENSION(:,:,:),   INTENT(IN)    :: PRRS    ! Rainwater m.r. source
+REAL, DIMENSION(:,:,:),   INTENT(IN)    :: PRSS    ! Snow m.r. source
+REAL, DIMENSION(:,:,:),   INTENT(IN)    :: PRGS    ! Graupel m.r. source
+REAL, DIMENSION(:,:,:,:), INTENT(INOUT) :: PRRSVS  ! Rainwater aq. species source
+REAL, DIMENSION(:,:,:,:), INTENT(INOUT) :: PSGRSVS ! Precip. ice species source
+REAL, DIMENSION(:,:),     INTENT(OUT)   :: PINPRR  ! instantaneaous precip.
+!
+!*       0.2   Declarations of local variables :
+!
+INTEGER :: JK,JI,JJ            ! Vertical loop index for the rain sedimentation 
+INTEGER :: JN            ! Temporal loop index for the rain sedimentation
+INTEGER :: IIB           !  Define the domain where is 
+INTEGER :: IIE           !  the microphysical sources have to be computed
+INTEGER :: IJB           ! 
+INTEGER :: IJE           !
+INTEGER :: IKB           ! 
+INTEGER :: IKE           !
+!
+REAL    :: ZTSPLITR      ! Small time step for rain sedimentation
+!
+INTEGER :: ISEDIMR, ISEDIMS, ISEDIMG ! Case number of sedimentation
+LOGICAL, DIMENSION(SIZE(PZZ,1),SIZE(PZZ,2),SIZE(PZZ,3)) &
+                                :: GSEDIMR ! where to compute the SED processes
+LOGICAL, DIMENSION(SIZE(PZZ,1),SIZE(PZZ,2),SIZE(PZZ,3)) &
+                                :: GSEDIMS ! where to compute the SED processes
+LOGICAL, DIMENSION(SIZE(PZZ,1),SIZE(PZZ,2),SIZE(PZZ,3)) &
+                                :: GSEDIMG ! where to compute the SED processes
+REAL,    DIMENSION(SIZE(PZZ,1),SIZE(PZZ,2),SIZE(PZZ,3))   &
+                                :: ZRRS     ! rainwater m.r.source phys.tendency
+REAL,    DIMENSION(SIZE(PZZ,1),SIZE(PZZ,2),SIZE(PZZ,3))   &
+                                :: ZRSS     ! snow m.r.source phys.tendency
+REAL,    DIMENSION(SIZE(PZZ,1),SIZE(PZZ,2),SIZE(PZZ,3))   &
+                                :: ZRGS     ! graupel m.r.source phys.tendency
+REAL,    DIMENSION(SIZE(PZZ,1),SIZE(PZZ,2),SIZE(PZZ,3))   &
+                                :: ZW     ! work array
+REAL,    DIMENSION(SIZE(PZZ,1),SIZE(PZZ,2),SIZE(PZZ,3))   &
+                                :: ZWSED  ! sedimentation fluxes
+REAL,    DIMENSION(SIZE(PZZ,1),SIZE(PZZ,2),SIZE(PZZ,3))   &
+                                :: ZZRRS  ! Rainwater m.r. source phys.tendency *dt
+REAL,    DIMENSION(SIZE(PZZ,1),SIZE(PZZ,2),SIZE(PZZ,3))   &
+                                :: ZZRSS  ! Snow m.r. source phys.tendency *dt
+REAL,    DIMENSION(SIZE(PZZ,1),SIZE(PZZ,2),SIZE(PZZ,3))   &
+                                :: ZZRGS  ! Graupel m.r. source phys.tendency *dt
+REAL,    DIMENSION(SIZE(PZZ,1),SIZE(PZZ,2),SIZE(PZZ,3))   &
+                                :: ZRR_SEDIM       ! Drain/Dt sur ZTSPLIT
+REAL,    DIMENSION(SIZE(PZZ,1),SIZE(PZZ,2),SIZE(PZZ,3))   &
+                                :: ZSV_SEDIM_FACTR  ! Cumul des Dsv/DT
+REAL,    DIMENSION(SIZE(PZZ,1),SIZE(PZZ,2),SIZE(PZZ,3))   &
+                                :: ZSV_SEDIM_FACTS  ! Cumul des Dsv/DT
+REAL,    DIMENSION(SIZE(PZZ,1),SIZE(PZZ,2),SIZE(PZZ,3))   &
+                                :: ZSV_SEDIM_FACTG  ! Cumul des Dsv/DT
+REAL, DIMENSION(:), ALLOCATABLE :: ZZZRRS  ! Rainwater m.r. source
+REAL, DIMENSION(:), ALLOCATABLE :: ZZZRSS  ! Snow m.r. source
+REAL, DIMENSION(:), ALLOCATABLE :: ZZZRGS  ! Graupel m.r. source
+!
+REAL, DIMENSION(:), ALLOCATABLE :: ZRHODREF, & ! RHO Dry REFerence
+                                   ZZW         ! Work array
+REAL, DIMENSION(7), SAVE        :: Z_XRTMIN
+!
+REAL                            :: ZVTRMAX, ZT
+LOGICAL, SAVE                   :: GSFIRSTCALL = .TRUE.
+REAL,    SAVE                   :: ZFSEDR, ZEXSEDR, ZCEXVT
+!
+INTEGER , DIMENSION(SIZE(GSEDIMR)) :: IR1,IR2,IR3 ! Used to replace the COUNT
+INTEGER , DIMENSION(SIZE(GSEDIMS)) :: IS1,IS2,IS3 ! Used to replace the COUNT
+INTEGER , DIMENSION(SIZE(GSEDIMG)) :: IG1,IG2,IG3 ! Used to replace the COUNT
+INTEGER                           :: JL       ! and PACK intrinsics
+!  
+!-------------------------------------------------------------------------------
+!
+!*       1.     COMPUTE THE LOOP BOUNDS
+!   	        -----------------------
+!
+CALL GET_INDICE_ll (IIB,IJB,IIE,IJE)
+IKB=1+JPVEXT
+IKE=SIZE(PZZ,3) - JPVEXT
+PINPRR(:,:) = 0. ! initialize instantaneous precip.
+!
+!-------------------------------------------------------------------------------
+!
+!!*       2.     TRANSFORMATION INTO PHYSICAL TENDENCIES
+!               ---------------------------------------
+!
+ZRRS(:,:,:)  = PRRS(:,:,:) / PRHODJ(:,:,:)
+IF (HCLOUD(1:3) == 'ICE') THEN
+  ZRSS(:,:,:)  = PRSS(:,:,:) / PRHODJ(:,:,:)
+  ZRGS(:,:,:)  = PRGS(:,:,:) / PRHODJ(:,:,:)
+ENDIF
+!
+!-------------------------------------------------------------------------------
+!
+!*       3.     COMPUTE THE SEDIMENTATION (RS) SOURCE
+!	        -------------------------------------
+!
+!*       3.1    Initialize some constants
+!  
+firstcall : IF (GSFIRSTCALL) THEN
+  GSFIRSTCALL = .FALSE.
+  SELECT CASE ( HCLOUD)
+    CASE('KESS')
+      ZVTRMAX = 20.                          
+    CASE('ICE3')
+      ZVTRMAX = 10.
+    CASE('ICE4')
+      ZVTRMAX = 40.
+  END SELECT
+!
+  SELECT CASE ( HCLOUD )  ! constants for rain sedimentation
+    CASE('KESS')
+      Z_XRTMIN(2:3) = 1.0E-20     ! Default values
+      ZFSEDR  = XCRS
+      ZEXSEDR = XCEXRS
+      ZCEXVT  = VCEXVT
+    CASE('ICE3','ICE4')
+      Z_XRTMIN(1:SIZE(WRTMIN)) = WRTMIN ! Values given in ICEx schemes
+      ZFSEDR  = XFSEDR
+      ZEXSEDR = XEXSEDR
+      ZCEXVT  = WCEXVT
+  END SELECT
+END IF firstcall
+!
+!*       3.2    time splitting loop initialization
+!
+ZTSPLITR = PTSTEP / REAL(KSPLITR)       ! Small time step
+!
+!*       3.3    compute the fluxes
+!
+ZSV_SEDIM_FACTR(:,:,:) = 1.0
+ZZRRS(:,:,:) = ZRRS(:,:,:) * PTSTEP
+IF (HCLOUD(1:3) == 'ICE') THEN
+  ZZRSS(:,:,:) = ZRSS(:,:,:) * PTSTEP
+  ZZRGS(:,:,:) = ZRGS(:,:,:) * PTSTEP
+  ZSV_SEDIM_FACTS(:,:,:) = 1.0
+  ZSV_SEDIM_FACTG(:,:,:) = 1.0
+ENDIF
+DO JN = 1 , KSPLITR
+  IF( JN==1 ) THEN
+    ZW(:,:,:) = 0.0
+    DO JK = IKB , IKE-1
+      ZW(:,:,JK) =ZTSPLITR*2./(PRHODREF(:,:,JK)*(PZZ(:,:,JK+2)-PZZ(:,:,JK)))
+    END DO
+    ZW(:,:,IKE)  =ZTSPLITR/(PRHODREF(:,:,IKE)*(PZZ(:,:,IKE+1)-PZZ(:,:,IKE)))
+  END IF
+!
+!*       3.3.1   for rain
+!
+  GSEDIMR(:,:,:) = .FALSE.
+  GSEDIMR(IIB:IIE,IJB:IJE,IKB:IKE) = ZZRRS(IIB:IIE,IJB:IJE,IKB:IKE) > Z_XRTMIN(3)
+  ISEDIMR = COUNTJV( GSEDIMR(:,:,:),IR1(:),IR2(:),IR3(:))
+!
+  IF ( ISEDIMR >= 1 ) THEN
+    ALLOCATE(ZZZRRS(ISEDIMR)) 
+    ALLOCATE(ZRHODREF(ISEDIMR))
+    DO JL=1,ISEDIMR
+      ZZZRRS(JL) = ZZRRS(IR1(JL),IR2(JL),IR3(JL))
+      ZRHODREF(JL) =  PRHODREF(IR1(JL),IR2(JL),IR3(JL))
+    ENDDO
+    ALLOCATE(ZZW(ISEDIMR)) ; ZZW(:) = 0.0
+!
+    ZZW(:) = ZFSEDR * ZZZRRS(:)**(ZEXSEDR) * ZRHODREF(:)**(ZEXSEDR-ZCEXVT)
+    ZWSED(:,:,:) = UNPACK( ZZW(:),MASK=GSEDIMR(:,:,:),FIELD=0.0 )
+    ZRR_SEDIM(:,:,:) = 0.0
+    DO JK = IKB , IKE
+      ZRR_SEDIM(:,:,JK) = ZW(:,:,JK)*(ZWSED(:,:,JK+1)-ZWSED(:,:,JK))
+    END DO
+    ZZRRS(:,:,:) = ZZRRS(:,:,:) + ZRR_SEDIM(:,:,:)
+    PINPRR(:,:) = PINPRR(:,:) + ZWSED(:,:,IKB)/XRHOLW/KSPLITR
+!
+    ZZW(:) = ZFSEDR * ZZZRRS(:)**(ZEXSEDR-1.0) * ZRHODREF(:)**(ZEXSEDR-ZCEXVT)
+    ZWSED(:,:,:) = UNPACK( ZZW(:),MASK=GSEDIMR(:,:,:),FIELD=0.0 )
+    ZRR_SEDIM(:,:,:) = 0.0
+    DO JK = IKB , IKE
+      ZRR_SEDIM(:,:,JK) = ZW(:,:,JK)*(ZWSED(:,:,JK+1)-ZWSED(:,:,JK))
+    END DO
+    DEALLOCATE(ZRHODREF)
+    DEALLOCATE(ZZZRRS)
+    DEALLOCATE(ZZW)
+    ZSV_SEDIM_FACTR(:,:,:) =   ZSV_SEDIM_FACTR(:,:,:) * (1.0 + ZRR_SEDIM(:,:,:))
+!!                       (1.0 + ZRR_SEDIM(:,:,:)/MAX(ZZRRS(:,:,:),XRTMIN_AQ))
+  END IF      
+  IF (HCLOUD == 'KESS') EXIT
+!
+!*       3.3.1   for iced precip.hydrometeors
+!
+  GSEDIMS(:,:,:) = .FALSE.
+  GSEDIMG(:,:,:) = .FALSE.
+  GSEDIMS(IIB:IIE,IJB:IJE,IKB:IKE) = ZZRSS(IIB:IIE,IJB:IJE,IKB:IKE) > Z_XRTMIN(5)
+  GSEDIMG(IIB:IIE,IJB:IJE,IKB:IKE) = ZZRGS(IIB:IIE,IJB:IJE,IKB:IKE) > Z_XRTMIN(6)
+  ISEDIMS = COUNTJV( GSEDIMS(:,:,:),IS1(:),IS2(:),IS3(:))
+  ISEDIMG = COUNTJV( GSEDIMG(:,:,:),IG1(:),IG2(:),IG3(:))
+! for snow
+  IF ( ISEDIMS >= 1) THEN
+    ALLOCATE(ZZZRSS(ISEDIMS))
+    ALLOCATE(ZRHODREF(ISEDIMS))
+    DO JL=1,ISEDIMS
+      ZZZRSS(JL) = ZZRSS(IS1(JL),IS2(JL),IS3(JL))
+      ZRHODREF(JL) =  PRHODREF(IS1(JL),IS2(JL),IS3(JL))
+    ENDDO
+    ALLOCATE(ZZW(ISEDIMS)) ; ZZW(:) = 0.0
+!
+    ZZW(:) = XFSEDS * ZZZRSS(:)**(XEXSEDS) * ZRHODREF(:)**(XEXSEDS-ZCEXVT)
+    ZWSED(:,:,:) = UNPACK( ZZW(:),MASK=GSEDIMS(:,:,:),FIELD=0.0 )
+    ZRR_SEDIM(:,:,:) = 0.0
+    DO JK = IKB , IKE
+      ZRR_SEDIM(:,:,JK) = ZW(:,:,JK)*(ZWSED(:,:,JK+1)-ZWSED(:,:,JK))
+    END DO
+    ZZRSS(:,:,:) = ZZRSS(:,:,:) + ZRR_SEDIM(:,:,:)
+!
+    ZZW(:) = XFSEDS * ZZZRSS(:)**(XEXSEDS-1.0) * ZRHODREF(:)**(XEXSEDS-ZCEXVT)
+    ZWSED(:,:,:) = UNPACK( ZZW(:),MASK=GSEDIMS(:,:,:),FIELD=0.0 )
+    ZRR_SEDIM(:,:,:) = 0.0
+    DO JK = IKB , IKE
+      ZRR_SEDIM(:,:,JK) = ZW(:,:,JK)*(ZWSED(:,:,JK+1)-ZWSED(:,:,JK))
+    END DO
+    DEALLOCATE(ZRHODREF)
+    DEALLOCATE(ZZZRSS)
+    DEALLOCATE(ZZW)
+    ZSV_SEDIM_FACTS(:,:,:) =   ZSV_SEDIM_FACTS(:,:,:) * (1.0 + ZRR_SEDIM(:,:,:))
+  ENDIF
+! for graupel
+  IF ( ISEDIMG >= 1) THEN
+    ALLOCATE(ZZZRGS(ISEDIMG))
+    ALLOCATE(ZRHODREF(ISEDIMG))
+    DO JL=1,ISEDIMG
+      ZZZRGS(JL) = ZZRGS(IG1(JL),IG2(JL),IG3(JL))
+      ZRHODREF(JL) =  PRHODREF(IG1(JL),IG2(JL),IG3(JL))
+    ENDDO
+    ALLOCATE(ZZW(ISEDIMG)) ; ZZW(:) = 0.0
+!
+    ZZW(:) = XFSEDG * ZZZRGS(:)**(XEXSEDG) * ZRHODREF(:)**(XEXSEDG-ZCEXVT)
+    ZWSED(:,:,:) = UNPACK( ZZW(:),MASK=GSEDIMG(:,:,:),FIELD=0.0 )
+    ZRR_SEDIM(:,:,:) = 0.0
+    DO JK = IKB , IKE
+      ZRR_SEDIM(:,:,JK) = ZW(:,:,JK)*(ZWSED(:,:,JK+1)-ZWSED(:,:,JK))
+    END DO
+    ZZRGS(:,:,:) = ZZRGS(:,:,:) + ZRR_SEDIM(:,:,:)
+!
+    ZZW(:) = XFSEDG * ZZZRGS(:)**(XEXSEDG-1.0) * ZRHODREF(:)**(XEXSEDG-ZCEXVT)
+    ZWSED(:,:,:) = UNPACK( ZZW(:),MASK=GSEDIMG(:,:,:),FIELD=0.0 )
+    ZRR_SEDIM(:,:,:) = 0.0
+    DO JK = IKB , IKE
+      ZRR_SEDIM(:,:,JK) = ZW(:,:,JK)*(ZWSED(:,:,JK+1)-ZWSED(:,:,JK))
+    END DO
+    DEALLOCATE(ZRHODREF)
+    DEALLOCATE(ZZZRGS)
+    DEALLOCATE(ZZW)
+    ZSV_SEDIM_FACTG(:,:,:) =   ZSV_SEDIM_FACTG(:,:,:) * (1.0 + ZRR_SEDIM(:,:,:))
+  ENDIF
+END DO
+!
+! Apply the rain sedimentation rate to the WR_xxx aqueous species
+DO JL= 1, SIZE(PRRSVS,4)
+  PRRSVS(:,:,:,JL) = MAX( 0.0,ZSV_SEDIM_FACTR(:,:,:)*PRRSVS(:,:,:,JL) )
+ENDDO
+!ice phase
+IF (OUSECHIC) THEN
+  DO JL= 1, SIZE(PSGRSVS,4)
+    PSGRSVS(:,:,:,JL) = MAX( 0.0, &
+                      ((ZSV_SEDIM_FACTS(:,:,:)+ZSV_SEDIM_FACTG(:,:,:))/2.) &
+                                        *PSGRSVS(:,:,:,JL) )
+  ENDDO
+ENDIF
+!
+!-------------------------------------------------------------------------------
+!
+END SUBROUTINE CH_AQUEOUS_SEDIM1MOM
diff --git a/src/PHYEX/ext/ch_aqueous_tmicice.f90 b/src/PHYEX/ext/ch_aqueous_tmicice.f90
new file mode 100644
index 0000000000000000000000000000000000000000..51255f6fd86cc99c6db1de25b0a21483f0edde7f
--- /dev/null
+++ b/src/PHYEX/ext/ch_aqueous_tmicice.f90
@@ -0,0 +1,1304 @@
+!MNH_LIC Copyright 2008-2019 CNRS, Meteo-France and Universite Paul Sabatier
+!MNH_LIC This is part of the Meso-NH software governed by the CeCILL-C licence
+!MNH_LIC version 1. See LICENSE, CeCILL-C_V1-en.txt and CeCILL-C_V1-fr.txt
+!MNH_LIC for details. version 1.
+!-----------------------------------------------------------------
+!      ####################################
+       MODULE MODI_CH_AQUEOUS_TMICICE
+!      ####################################
+!
+INTERFACE
+      SUBROUTINE CH_AQUEOUS_TMICICE( PTSTEP, PRHODREF, PRHODJ, PTHT, PPABST,      &
+                                     PRTMIN_AQ, OUSECHIC, OCH_RET_ICE, HNAMES,    &
+                                     HICNAMES, KEQ, KEQAQ, PRVT, PRCT, PRRT, PRIT,&
+                                     PRST, PRGT, PCIT, PRCS, PRRS, PRIS, PRSS,    &
+                                     PRGS, PGSVT, PGRSVS, PCSVT, PCRSVS, PRSVT,   &
+                                     PRRSVS, PSGSVT, PSGRSVS                      )   
+!
+REAL,                     INTENT(IN)    :: PTSTEP    ! Time step          
+REAL,                     INTENT(IN)    :: PRTMIN_AQ ! LWC threshold liq. chem.
+INTEGER,                  INTENT(IN)    :: KEQ   ! Number of chem. spec.
+INTEGER,                  INTENT(IN)    :: KEQAQ   ! Number of liq. chem. spec.
+LOGICAL,                  INTENT(IN)    :: OUSECHIC ! flag for ice chem.
+LOGICAL,                  INTENT(IN)    :: OCH_RET_ICE ! flag for retention in ice
+!
+CHARACTER(LEN=32), DIMENSION(:), INTENT(IN) :: HNAMES ! name of chem. species
+CHARACTER(LEN=32), DIMENSION(:), INTENT(IN) :: HICNAMES ! name of ice chem. species
+!
+REAL, DIMENSION(:,:,:),   INTENT(IN)    :: PRHODREF! Reference density
+REAL, DIMENSION(:,:,:),   INTENT(IN)    :: PRHODJ  ! Dry density * Jacobian
+REAL, DIMENSION(:,:,:),   INTENT(IN)    :: PPABST  ! absolute pressure at t
+REAL, DIMENSION(:,:,:),   INTENT(IN)    :: PTHT    ! Theta at time t
+REAL, DIMENSION(:,:,:),   INTENT(IN)    :: PRVT    ! Vapor m.r. at t
+REAL, DIMENSION(:,:,:),   INTENT(IN)    :: PRCT    ! cloud water m.r. at t
+REAL, DIMENSION(:,:,:),   INTENT(IN)    :: PRRT    ! Rainwater m.r. at t
+REAL, DIMENSION(:,:,:),   INTENT(IN)    :: PRIT    ! Pristine m.r. at t
+REAL, DIMENSION(:,:,:),   INTENT(IN)    :: PRST    ! Snow m.r. at t
+REAL, DIMENSION(:,:,:),   INTENT(IN)    :: PRGT    ! Graupel m.r. at t
+REAL, DIMENSION(:,:,:),   INTENT(IN)    :: PCIT    ! Pristine conc. at t
+REAL, DIMENSION(:,:,:),   INTENT(IN)    :: PRCS    ! cloud water m.r. source
+REAL, DIMENSION(:,:,:),   INTENT(IN)    :: PRRS    ! Rainwater m.r. source
+REAL, DIMENSION(:,:,:),   INTENT(IN)    :: PRIS    ! Pristine m.r. source
+REAL, DIMENSION(:,:,:),   INTENT(IN)    :: PRSS    ! Snow m.r. source
+REAL, DIMENSION(:,:,:),   INTENT(IN)    :: PRGS    ! graupel m.r. source
+REAL, DIMENSION(:,:,:,:), INTENT(IN)    :: PGSVT   ! gas species at t
+REAL, DIMENSION(:,:,:,:), INTENT(INOUT) :: PGRSVS  ! gas species source
+REAL, DIMENSION(:,:,:,:), INTENT(IN)    :: PCSVT   ! cloud water aq. species at t
+REAL, DIMENSION(:,:,:,:), INTENT(INOUT) :: PCRSVS  ! cloud water aq. species source
+REAL, DIMENSION(:,:,:,:), INTENT(IN)    :: PRSVT   ! Rainwater aq. species at t
+REAL, DIMENSION(:,:,:,:), INTENT(INOUT) :: PRRSVS  ! Rainwater aq. species source
+REAL, DIMENSION(:,:,:,:), INTENT(IN)    :: PSGSVT  ! ice species at t
+REAL, DIMENSION(:,:,:,:), INTENT(INOUT) :: PSGRSVS ! ice species source
+!
+END SUBROUTINE CH_AQUEOUS_TMICICE
+END INTERFACE
+END MODULE MODI_CH_AQUEOUS_TMICICE
+!
+!     ################################################################################
+      SUBROUTINE CH_AQUEOUS_TMICICE( PTSTEP, PRHODREF, PRHODJ, PTHT, PPABST,      &
+                                     PRTMIN_AQ, OUSECHIC, OCH_RET_ICE, HNAMES,    &
+                                     HICNAMES, KEQ, KEQAQ, PRVT, PRCT, PRRT, PRIT,&
+                                     PRST, PRGT, PCIT, PRCS, PRRS, PRIS, PRSS,    &
+                                     PRGS, PGSVT, PGRSVS, PCSVT, PCRSVS, PRSVT,   &
+                                     PRRSVS, PSGSVT, PSGRSVS                      )   
+!     ################################################################################
+!
+!!****  * -  compute the explicit microphysical sources 
+!!
+!!    PURPOSE
+!!    -------
+!!      The purpose of this routine is to compute the microphysical sources
+!!    corresponding to collision/coalescence processes (autoconversion + accretion)
+!!    and to the freezing, rimin and melting processes for snow and graupel
+!!    for the ICE3(4) cloud microphysics parameterization (see rain_ice)
+!!
+!!
+!!**  METHOD
+!!    ------
+!!
+!!    EXTERNAL
+!!    --------
+!!      None
+!!     
+!!    IMPLICIT ARGUMENTS
+!!    ------------------
+!!      Module MODD_PARAMETERS
+!!          JPHEXT       : Horizontal external points number
+!!          JPVEXT       : Vertical external points number
+!!
+!!    REFERENCE
+!!    ---------
+!!      Book1 of the documentation ( routine CH_AQUEOUS_TMICICE )
+!!
+!!    AUTHOR
+!!    ------
+!!      C. Mari J.P. Pinty M. Leriche      * Laboratoire d'Aerologie*
+!!
+!!    MODIFICATIONS
+!!    -------------
+!!      Original    26/03/08
+!!    M. Leriche 19/07/2010 add riming, freezing and melting for ice phase(ICE3)
+!!    M. Leriche 17/09/2010 add OUSECHIC flag
+!!    Juan 24/09/2012: for BUG Pgi rewrite PACK function on mode_pack_pgi
+!!    J.Escobar : 15/09/2015 : WENO5 & JPHEXT <> 1
+!!    M.Leriche 2015 correction bug
+!  P. Wautelet 26/04/2019: replace non-standard FLOAT function by REAL function
+!  P. Wautelet 28/05/2019: move COUNTJV function to tools.f90
+!
+!-------------------------------------------------------------------------------
+!
+!*       0.    DECLARATIONS
+!              ------------
+!
+USE MODD_PARAMETERS,      ONLY : JPHEXT,    &! number of horizontal External points
+                                 JPVEXT      ! number of vertical External points
+USE MODD_CST,             ONLY : XP00, XRD, XRV, XCPD, XTT, XLMTT, XLVTT, XCPV, &
+                                 XCL, XCI, XESTT, XMV, XMD
+USE MODD_RAIN_ICE_DESCR_n,  ONLY : XLBR, XLBEXR, XCEXVT, XLBDAS_MAX, XLBS, XLBEXS, &
+                                 XLBG, XLBEXG, XCXS, XCXG, XDG, XBS
+USE MODD_RAIN_ICE_PARAM_n,  ONLY : XTIMAUTC, XCRIAUTC, XFCACCR, XEXCACCR, &
+                                 XRIMINTP1, XRIMINTP2, XCRIMSS, XCRIMSG,&
+                                 XEXCRIMSS, XEXCRIMSG, NGAMINC, XGAMINC_RIM1, &
+                                 XFRACCSS, XLBRACCS1, XLBRACCS2, XLBRACCS3,    &
+                                 XACCINTP1S, XACCINTP2S, XACCINTP1R, XACCINTP2R, &
+                                 NACCLBDAS, NACCLBDAR, XKER_RACCSS, XKER_RACCS, &
+                                 XEXRCFRI, XRCFRI, X0DEPG, XEX0DEPG, X1DEPG,    &
+                                 XEX1DEPG, XSCFAC, XFCDRYG, XFIDRYG, XCOLEXIG,  &
+                                 XCOLEXSG, XFSDRYG, NDRYLBDAG, XDRYINTP1G,      &
+                                 XDRYINTP2G, NDRYLBDAS, XDRYINTP1S, XDRYINTP2S, &
+                                 XKER_SDRYG, XLBSDRYG1, XLBSDRYG2, XLBSDRYG3,   &
+                                 XFRDRYG, NDRYLBDAR, XDRYINTP1R, XDRYINTP2R,    &
+                                 XKER_RDRYG, XLBRDRYG1, XLBRDRYG2, XLBRDRYG3,   &
+                                 XCOLIG, XCOLEXIG, XCOLSG, XCOLEXSG
+USE MODD_CH_ICE                              ! value of retention coefficient
+USE MODD_CH_ICE_n                            ! index for ice phase chemistry with IC3/4
+!
+#ifdef MNH_PGI
+USE MODE_PACK_PGI
+#endif
+use mode_tools,           only: Countjv
+use mode_tools_ll,        only: GET_INDICE_ll
+!
+IMPLICIT NONE
+!
+!*       0.1   Declarations of dummy arguments :
+!
+!
+REAL,                     INTENT(IN)    :: PTSTEP    ! Time step          
+REAL,                     INTENT(IN)    :: PRTMIN_AQ ! LWC threshold liq. chem.
+INTEGER,                  INTENT(IN)    :: KEQ   ! Number of chem. spec.
+INTEGER,                  INTENT(IN)    :: KEQAQ   ! Number of liq. chem. spec.
+LOGICAL,                  INTENT(IN)    :: OUSECHIC ! flag for ice chem.
+LOGICAL,                  INTENT(IN)    :: OCH_RET_ICE ! flag for retention in ice
+!
+CHARACTER(LEN=32), DIMENSION(:), INTENT(IN) :: HNAMES ! name of chem. species
+CHARACTER(LEN=32), DIMENSION(:), INTENT(IN) :: HICNAMES ! name of ice chem. species
+!
+REAL, DIMENSION(:,:,:),   INTENT(IN)    :: PRHODREF! Reference density
+REAL, DIMENSION(:,:,:),   INTENT(IN)    :: PRHODJ  ! Dry density * Jacobian
+REAL, DIMENSION(:,:,:),   INTENT(IN)    :: PPABST  ! absolute pressure at t
+REAL, DIMENSION(:,:,:),   INTENT(IN)    :: PTHT    ! Theta at time t
+REAL, DIMENSION(:,:,:),   INTENT(IN)    :: PRVT    ! Vapor m.r. at t
+REAL, DIMENSION(:,:,:),   INTENT(IN)    :: PRCT    ! cloud water m.r. at t
+REAL, DIMENSION(:,:,:),   INTENT(IN)    :: PRRT    ! Rainwater m.r. at t
+REAL, DIMENSION(:,:,:),   INTENT(IN)    :: PRIT    ! Pristine m.r. at t
+REAL, DIMENSION(:,:,:),   INTENT(IN)    :: PRST    ! Snow m.r. at t
+REAL, DIMENSION(:,:,:),   INTENT(IN)    :: PRGT    ! Graupel m.r. at t
+REAL, DIMENSION(:,:,:),   INTENT(IN)    :: PCIT    ! Pristine conc. at t
+REAL, DIMENSION(:,:,:),   INTENT(IN)    :: PRCS    ! cloud water m.r. source
+REAL, DIMENSION(:,:,:),   INTENT(IN)    :: PRRS    ! Rainwater m.r. source
+REAL, DIMENSION(:,:,:),   INTENT(IN)    :: PRIS    ! Pristine m.r. source
+REAL, DIMENSION(:,:,:),   INTENT(IN)    :: PRSS    ! Snow m.r. source
+REAL, DIMENSION(:,:,:),   INTENT(IN)    :: PRGS    ! graupel m.r. source
+REAL, DIMENSION(:,:,:,:), INTENT(IN)    :: PGSVT   ! gas species at t
+REAL, DIMENSION(:,:,:,:), INTENT(INOUT) :: PGRSVS  ! gas species source
+REAL, DIMENSION(:,:,:,:), INTENT(IN)    :: PCSVT   ! cloud water aq. species at t
+REAL, DIMENSION(:,:,:,:), INTENT(INOUT) :: PCRSVS  ! cloud water aq. species source
+REAL, DIMENSION(:,:,:,:), INTENT(IN)    :: PRSVT   ! Rainwater aq. species at t
+REAL, DIMENSION(:,:,:,:), INTENT(INOUT) :: PRRSVS  ! Rainwater aq. species source
+REAL, DIMENSION(:,:,:,:), INTENT(IN)    :: PSGSVT  ! ice species at t
+REAL, DIMENSION(:,:,:,:), INTENT(INOUT) :: PSGRSVS ! ice species source
+!
+!*       0.2   Declarations of local variables :
+!
+INTEGER :: JLC, JLR, JLI, JLG, JLW ! Loop index for cloud water, rainwater and ice species
+INTEGER :: JJ                 ! Loop index 
+INTEGER :: IIB                !  Define the domain where is 
+INTEGER :: IIE                !  the microphysical sources have to be computed
+INTEGER :: IJB            
+INTEGER :: IJE           
+INTEGER :: IKB           
+INTEGER :: IKE           
+!
+INTEGER :: IMICRO        ! case number of r_x>0 locations
+LOGICAL, DIMENSION(SIZE(PRCT,1),SIZE(PRCT,2),SIZE(PRCT,3))   &
+                                :: GMICRO   ! where to compute mic. processes
+REAL,    DIMENSION(SIZE(PRCT,1),SIZE(PRCT,2),SIZE(PRCT,3))   &
+                                :: ZT     ! Temperature
+REAL,    DIMENSION(SIZE(PRCT,1),SIZE(PRCT,2),SIZE(PRCT,3))   &
+                                :: ZRCS   ! Cloud water m.r. source phys.tendency
+REAL,    DIMENSION(SIZE(PRCT,1),SIZE(PRCT,2),SIZE(PRCT,3))   &
+                                :: ZRRS   ! Rain water m.r. source phys. tendency
+REAL,    DIMENSION(SIZE(PRCT,1),SIZE(PRCT,2),SIZE(PRCT,3))   &
+                                :: ZRIS   ! Pristine m.r. source phys. tendency
+REAL,    DIMENSION(SIZE(PRCT,1),SIZE(PRCT,2),SIZE(PRCT,3))   &
+                                :: ZRSS   ! Snow m.r. source phys. tendency
+REAL,    DIMENSION(SIZE(PRCT,1),SIZE(PRCT,2),SIZE(PRCT,3))   &
+                                :: ZRGS   ! Graupel m.r. source phys. tendency
+REAL,    DIMENSION(SIZE(PGRSVS,1),SIZE(PGRSVS,2),SIZE(PGRSVS,3),SIZE(PGRSVS,4))   &
+                                :: ZZGRSVS   ! Gas species source
+REAL,    DIMENSION(SIZE(PCRSVS,1),SIZE(PCRSVS,2),SIZE(PCRSVS,3),SIZE(PCRSVS,4))   &
+                                :: ZZCRSVS   ! Cloud water aq. species source
+REAL,    DIMENSION(SIZE(PRRSVS,1),SIZE(PRRSVS,2),SIZE(PRRSVS,3),SIZE(PRRSVS,4))   &
+                                :: ZZRRSVS   ! Rain water aq. species source
+REAL,    DIMENSION(SIZE(PSGRSVS,1),SIZE(PSGRSVS,2),SIZE(PSGRSVS,3),SIZE(PSGRSVS,4))   &
+                                :: ZZSGRSVS   !  Ice (snow+graupel) species source
+REAL,    DIMENSION(SIZE(PRCT,1),SIZE(PRCT,2),SIZE(PRCT,3))   &
+                                :: ZCW      ! work array
+REAL,    DIMENSION(SIZE(PRCT,1),SIZE(PRCT,2),SIZE(PRCT,3))   &
+                                :: ZRW      ! work array
+REAL,    DIMENSION(SIZE(PRCT,1),SIZE(PRCT,2),SIZE(PRCT,3))   &
+                                :: ZSGW      ! work array
+REAL,    DIMENSION(SIZE(PRCT,1),SIZE(PRCT,2),SIZE(PRCT,3))   &
+                                :: ZGW      ! work array
+REAL, DIMENSION(:),   ALLOCATABLE :: ZZT    ! Temperature
+REAL, DIMENSION(:),   ALLOCATABLE :: ZPRES  ! Pressure
+REAL, DIMENSION(:),   ALLOCATABLE :: ZRVT   ! Vapor m.r. at t
+REAL, DIMENSION(:),   ALLOCATABLE :: ZRCT   ! Cloud water m.r. at t
+REAL, DIMENSION(:),   ALLOCATABLE :: ZRRT   ! Rain water m.r. at t
+REAL, DIMENSION(:),   ALLOCATABLE :: ZRIT   ! Pristine m.r. at t
+REAL, DIMENSION(:),   ALLOCATABLE :: ZRST   ! Snow m.r. at t
+REAL, DIMENSION(:),   ALLOCATABLE :: ZRGT   ! Graupel m.r. at t
+REAL, DIMENSION(:),   ALLOCATABLE :: ZCIT   ! Pristine conc. at t
+REAL, DIMENSION(:),   ALLOCATABLE :: ZZRCS  ! Cloud water m.r. source
+REAL, DIMENSION(:),   ALLOCATABLE :: ZZRRS  ! Rain water m.r. source
+REAL, DIMENSION(:),   ALLOCATABLE :: ZZRIS  ! Pristine m.r. source
+REAL, DIMENSION(:),   ALLOCATABLE :: ZZRSS  ! snow m.r. source
+REAL, DIMENSION(:),   ALLOCATABLE :: ZZRGS  ! graupel m.r. source
+REAL, DIMENSION(:,:), ALLOCATABLE :: ZCSVT  ! Cloud water aq. species at t
+REAL, DIMENSION(:,:), ALLOCATABLE :: ZRSVT  ! Rain water aq. species at t
+REAL, DIMENSION(:,:), ALLOCATABLE :: ZSGSVT ! Ice (snow + graupel) species at t
+REAL, DIMENSION(:,:), ALLOCATABLE :: ZGRSVS ! Gas species source
+REAL, DIMENSION(:,:), ALLOCATABLE :: ZCRSVS ! Cloud water aq. species source
+REAL, DIMENSION(:,:), ALLOCATABLE :: ZRRSVS ! Rain water aq. species source
+REAL, DIMENSION(:,:), ALLOCATABLE :: ZSGRSVS! Ice (snow+graupel) species source
+REAL, DIMENSION(:),   ALLOCATABLE :: ZCJ    ! Function to compute the ventilation coefficient
+REAL, DIMENSION(:),   ALLOCATABLE :: ZKA    ! Thermal conductivity of the air
+REAL, DIMENSION(:),   ALLOCATABLE :: ZDV    ! Diffusivity of water vapor in the air
+!
+REAL, DIMENSION(:),   ALLOCATABLE :: ZRHODREF, & ! RHO Dry REFerence
+                                     ZZW,      & ! Work array
+                                     ZLBDAR,   & ! Slope parameter of the raindrop distribution
+                                     ZLBDAS,   & ! Slope parameter of the snow distribution
+                                     ZLBDAG,   & ! Slope parameter of the graupel distribution
+                                     ZRDRYG,   & ! Dry growth rate of the graupel
+                                     ZRWETG      ! Wet growth rate of the graupel
+!
+INTEGER :: IGRIM, IGACC                    ! Case number of riming, accretion
+INTEGER :: IGDRY
+!, IGWET                    ! dry growth and wet growth locations for graupels
+LOGICAL, DIMENSION(:), ALLOCATABLE :: GRIM ! Test where to compute riming
+LOGICAL, DIMENSION(:), ALLOCATABLE :: GACC ! Test where to compute accretion
+LOGICAL, DIMENSION(:), ALLOCATABLE :: GDRY ! Test where to compute dry growth
+!LOGICAL, DIMENSION(:), ALLOCATABLE :: GWET  ! Test where to compute wet growt
+INTEGER, DIMENSION(:), ALLOCATABLE :: IVEC1,IVEC2       ! Vectors of indices for
+                                                        ! interpolations
+REAL,    DIMENSION(:), ALLOCATABLE :: ZVEC1,ZVEC2,ZVEC3 ! Work vectors for
+                                                        ! interpolations
+REAL, DIMENSION(:,:), ALLOCATABLE :: ZZW1, ZZW2, ZZW3, ZZW4   ! Work arrays
+!
+INTEGER , DIMENSION(SIZE(GMICRO)) :: I1,I2,I3 ! Used to replace the COUNT
+INTEGER                           :: JL       ! and PACK intrinsics
+!
+!
+!  compute the temperature
+!
+ZT(:,:,:) = PTHT(:,:,:) * ( PPABST(:,:,:) / XP00 ) ** (XRD/XCPD)
+!  
+!-------------------------------------------------------------------------------
+!
+!*       1.     COMPUTE THE LOOP BOUNDS
+!   	        -----------------------
+!
+CALL GET_INDICE_ll (IIB,IJB,IIE,IJE)
+IKB=1+JPVEXT
+IKE=SIZE(PRCT,3) - JPVEXT
+!
+!-------------------------------------------------------------------------------
+!
+!!*       2.     TRANSFORMATION INTO PHYSICAL TENDENCIES
+!                ---------------------------------------
+!
+ZRCS(:,:,:)  = PRCS(:,:,:) / PRHODJ(:,:,:)
+ZRRS(:,:,:)  = PRRS(:,:,:) / PRHODJ(:,:,:)
+ZRSS(:,:,:)  = PRSS(:,:,:) / PRHODJ(:,:,:)
+ZRIS(:,:,:)  = PRIS(:,:,:) / PRHODJ(:,:,:)
+ZRGS(:,:,:)  = PRGS(:,:,:) / PRHODJ(:,:,:)
+!
+DO JLC= 1, SIZE(PCRSVS,4)
+  ZZCRSVS(:,:,:,JLC) = PCRSVS(:,:,:,JLC) / PRHODJ(:,:,:)
+ENDDO
+DO JLR= 1, SIZE(PRRSVS,4)
+  ZZRRSVS(:,:,:,JLR) = PRRSVS(:,:,:,JLR) / PRHODJ(:,:,:)
+ENDDO
+IF (OUSECHIC) THEN
+  DO JLG= 1, SIZE(PGRSVS,4)
+    ZZGRSVS(:,:,:,JLG) = PGRSVS(:,:,:,JLG) / PRHODJ(:,:,:)
+  ENDDO
+  DO JLI= 1, SIZE(PSGRSVS,4)
+    ZZSGRSVS(:,:,:,JLI) = PSGRSVS(:,:,:,JLI) / PRHODJ(:,:,:)
+  ENDDO
+ELSE
+  IF (.NOT.(OCH_RET_ICE)) THEN
+    DO JLG= 1, SIZE(PGRSVS,4)
+      ZZGRSVS(:,:,:,JLG) = PGRSVS(:,:,:,JLG) / PRHODJ(:,:,:)
+    ENDDO
+  ENDIF
+ENDIF
+!
+!-------------------------------------------------------------------------------
+!
+!*       3.     OPTIMIZATION: looking for locations where m.r. hydro. > min value
+!   	        -----------------------------------------------------------------
+!
+GMICRO(:,:,:) = .FALSE.
+GMICRO(IIB:IIE,IJB:IJE,IKB:IKE) =                                                           &
+      (PRCT(IIB:IIE,IJB:IJE,IKB:IKE)>PRTMIN_AQ*1.e3/PRHODREF(IIB:IIE,IJB:IJE,IKB:IKE)) .OR. &
+      (PRRT(IIB:IIE,IJB:IJE,IKB:IKE)>PRTMIN_AQ*1.e3/PRHODREF(IIB:IIE,IJB:IJE,IKB:IKE)) .OR. &
+      (PRST(IIB:IIE,IJB:IJE,IKB:IKE)>PRTMIN_AQ*1.e3/PRHODREF(IIB:IIE,IJB:IJE,IKB:IKE)) .OR. &
+      (PRGT(IIB:IIE,IJB:IJE,IKB:IKE)>PRTMIN_AQ*1.e3/PRHODREF(IIB:IIE,IJB:IJE,IKB:IKE))
+!
+IMICRO = COUNTJV( GMICRO(:,:,:),I1(:),I2(:),I3(:))
+IF( IMICRO >= 1 ) THEN
+  ALLOCATE(ZZT(IMICRO))
+  ALLOCATE(ZPRES(IMICRO))
+  ALLOCATE(ZRVT(IMICRO))
+  ALLOCATE(ZRCT(IMICRO))
+  ALLOCATE(ZRRT(IMICRO))  
+  ALLOCATE(ZRIT(IMICRO))  
+  ALLOCATE(ZRST(IMICRO))  
+  ALLOCATE(ZRGT(IMICRO))  
+  ALLOCATE(ZCIT(IMICRO))  
+  ALLOCATE(ZCSVT(IMICRO,SIZE(PCSVT,4)))
+  ALLOCATE(ZRSVT(IMICRO,SIZE(PRSVT,4)))
+  ALLOCATE(ZZRCS(IMICRO)) 
+  ALLOCATE(ZZRRS(IMICRO)) 
+  ALLOCATE(ZZRIS(IMICRO)) 
+  ALLOCATE(ZZRSS(IMICRO)) 
+  ALLOCATE(ZZRGS(IMICRO)) 
+  ALLOCATE(ZCRSVS(IMICRO,SIZE(PCRSVS,4)))
+  ALLOCATE(ZRRSVS(IMICRO,SIZE(PRRSVS,4)))
+  ALLOCATE(ZRHODREF(IMICRO)) 
+  ALLOCATE(ZZW(IMICRO))
+  ALLOCATE(ZZW2(IMICRO,SIZE(PCSVT,4)))
+  ALLOCATE(ZZW4(IMICRO,SIZE(PCSVT,4)))
+  ALLOCATE(ZZW1(IMICRO,6))
+  ALLOCATE(ZLBDAR(IMICRO))
+  ALLOCATE(ZLBDAS(IMICRO))
+  ALLOCATE(ZLBDAG(IMICRO))
+  ALLOCATE(ZRDRYG(IMICRO))
+  ALLOCATE(ZRWETG(IMICRO))
+  ALLOCATE(ZKA(IMICRO))
+  ALLOCATE(ZDV(IMICRO))
+  ALLOCATE(ZCJ(IMICRO))
+  DO JL=1,IMICRO   
+    ZCSVT(JL,:) = PCSVT(I1(JL),I2(JL),I3(JL),:)
+    ZCRSVS(JL,:) = ZZCRSVS(I1(JL),I2(JL),I3(JL),:)
+    ZRSVT(JL,:) = PRSVT(I1(JL),I2(JL),I3(JL),:)
+    ZRRSVS(JL,:) = ZZRRSVS(I1(JL),I2(JL),I3(JL),:)
+!
+    ZRVT(JL) = PRVT(I1(JL),I2(JL),I3(JL))
+    ZRCT(JL) = PRCT(I1(JL),I2(JL),I3(JL))
+    ZRRT(JL) = PRRT(I1(JL),I2(JL),I3(JL))
+    ZRIT(JL) = PRIT(I1(JL),I2(JL),I3(JL))
+    ZRST(JL) = PRST(I1(JL),I2(JL),I3(JL))
+    ZRGT(JL) = PRGT(I1(JL),I2(JL),I3(JL))
+    ZCIT(JL) = PCIT(I1(JL),I2(JL),I3(JL))
+!
+    ZZRCS(JL) = ZRCS(I1(JL),I2(JL),I3(JL))
+    ZZRRS(JL) = ZRRS(I1(JL),I2(JL),I3(JL))
+    ZZRIS(JL) = ZRIS(I1(JL),I2(JL),I3(JL))
+    ZZRSS(JL) = ZRSS(I1(JL),I2(JL),I3(JL))
+    ZZRGS(JL) = ZRGS(I1(JL),I2(JL),I3(JL))
+!
+    ZZT(JL) = ZT(I1(JL),I2(JL),I3(JL))
+    ZRHODREF(JL) = PRHODREF(I1(JL),I2(JL),I3(JL))
+    ZPRES(JL) = PPABST(I1(JL),I2(JL),I3(JL))
+  ENDDO
+  IF (OUSECHIC) THEN
+    ALLOCATE(ZSGSVT(IMICRO,SIZE(PSGSVT,4)))
+    ALLOCATE(ZGRSVS(IMICRO,SIZE(PGRSVS,4)))
+    ALLOCATE(ZSGRSVS(IMICRO,SIZE(PSGRSVS,4)))
+    ALLOCATE(ZZW3(IMICRO,SIZE(PSGSVT,4)))
+    DO JL=1,IMICRO   
+      ZGRSVS(JL,:) = ZZGRSVS(I1(JL),I2(JL),I3(JL),:)
+      ZSGSVT(JL,:) = PSGSVT(I1(JL),I2(JL),I3(JL),:)
+      ZSGRSVS(JL,:) = ZZSGRSVS(I1(JL),I2(JL),I3(JL),:)
+    ENDDO
+  ELSE
+    IF (.NOT.(OCH_RET_ICE)) THEN
+      ALLOCATE(ZGRSVS(IMICRO,SIZE(PGRSVS,4)))
+      DO JL=1,IMICRO   
+        ZGRSVS(JL,:) = ZZGRSVS(I1(JL),I2(JL),I3(JL),:)
+      ENDDO
+    ENDIF
+  ENDIF
+!
+!
+!-------------------------------------------------------------------------------
+!
+!*       4.     COMPUTES THE SLOW WARM PROCESS SOURCES
+!   	        --------------------------------------
+!
+!*       4.1    compute the slope parameter Lbda_r
+!
+  WHERE( ZRRT(:)>0.0 )
+    ZLBDAR(:)  = XLBR*( ZRHODREF(:)*MAX( ZRRT(:),PRTMIN_AQ*1.e3/ZRHODREF(:)) )**XLBEXR
+  END WHERE
+!
+!*       4.2    compute the autoconversion of r_c for r_r production: RCAUTR
+!
+    ZZW(:) = 0.0
+    ZZW2(:,:) = 0.0
+!
+  DO JL=1,IMICRO
+    IF ( (ZRCT(JL)>0.0) .AND. (ZZRCS(JL)>0.0) ) THEN
+      ZZW(JL) = MIN( ZZRCS(JL),XTIMAUTC*MAX( ZRCT(JL)-XCRIAUTC/ZRHODREF(JL),0.0))
+!
+      ZZW2(JL,:) = ZZW(JL) * ZCSVT(JL,:)/ZRCT(JL)
+      ZZW2(JL,:) = MAX(MIN(ZZW2(JL,:),(ZCSVT(JL,:)/PTSTEP)),0.0)
+      ZCRSVS(JL,:)  = ZCRSVS(JL,:) - ZZW2(JL,:) 
+      ZRRSVS(JL,:)  = ZRRSVS(JL,:) + ZZW2(JL,:) 
+    END IF
+  END DO 
+!
+!*       4.3    compute the accretion of r_c for r_r production: RCACCR
+!
+    ZZW(:) = 0.0
+    ZZW2(:,:) = 0.0
+!    
+  DO JL = 1,IMICRO
+    IF( (ZRCT(JL)>0.0) .AND. (ZRRT(JL)>0.0) .AND. (ZZRCS(JL)>0.0) ) THEN
+      ZZW(JL) = MIN( ZZRCS(JL),XFCACCR * ZRCT(JL)                &
+                                    * ZLBDAR(JL)**XEXCACCR      &
+                                    * ZRHODREF(JL)**(-XCEXVT) )
+!
+      ZZW2(JL,:) = ZZW(JL) * ZCSVT(JL,:)/ZRCT(JL)
+      ZZW2(JL,:) = MAX(MIN(ZZW2(JL,:),(ZCSVT(JL,:)/PTSTEP)),0.0)
+      ZCRSVS(JL,:)  = ZCRSVS(JL,:) - ZZW2(JL,:) 
+      ZRRSVS(JL,:)  = ZRRSVS(JL,:) + ZZW2(JL,:)
+    END IF
+  END DO
+!
+!
+!*       4.4    compute the evaporation of r_r: RREVAV
+!
+! calculated by the kinetic mass transfer equation (BASIC.f90)
+!
+!
+!-------------------------------------------------------------------------------
+!
+!*       5.     COMPUTES THE SLOW COLD PROCESS SOURCES
+!               --------------------------------------
+!
+!*       5.1    compute the spontaneous freezing source: RRHONG
+!
+ ZZW(:) = 0.0
+ ZZW2(:,:) = 0.0
+! 
+ DO JL = 1,IMICRO
+   IF( (ZZT(JL)<XTT-35.0) .AND. (ZRRT(JL)>0.) .AND. (ZZRRS(JL)>0.) ) THEN
+     ZZW(JL) = MIN( ZZRRS(JL),ZRRT(JL)/PTSTEP )
+     ZZW2(JL,:) = ZZW(JL) * ZRSVT(JL,:)/ZRRT(JL)
+     ZZW2(JL,:) = MAX(MIN(ZZW2(JL,:),(ZRSVT(JL,:)/PTSTEP)),0.0)
+     ZRRSVS(JL,:) = ZRRSVS(JL,:) - ZZW2(JL,:)
+     IF (OUSECHIC) THEN
+     DO JLI = 1, SIZE(PSGRSVS,4)
+       IF (TRIM(HICNAMES(JLI)) == 'IC_HNO3' .OR. TRIM(HICNAMES(JLI)) == 'IC_SULF' &
+          .OR. TRIM(HICNAMES(JLI)) == 'IC_H2SO4' &
+          .OR. TRIM(HICNAMES(JLI)) == 'IC_NH3' .OR. TRIM(HICNAMES(JLI)) == 'IC_HCL' &
+          .OR. HICNAMES(JLI)(1:4) == 'IC_A' .OR. HICNAMES(JLI)(1:4) == 'IC_B' &
+          .OR. NINDEXGI(JLI).EQ.0) THEN
+         ZSGRSVS(JL,JLI) = ZSGRSVS(JL,JLI) + XRETNA * ZZW2(JL,NINDEXWI(JLI))           
+       ELSE IF (TRIM(HICNAMES(JLI)) == 'IC_H2O2' .OR. TRIM(HICNAMES(JLI)) == 'IC_HO2' &
+          .OR. TRIM(HICNAMES(JLI)) == 'IC_HONO' .OR. TRIM(HICNAMES(JLI)) == 'IC_HNO4'&
+          .OR. TRIM(HICNAMES(JLI)) == 'IC_HCHO' .OR. TRIM(HICNAMES(JLI)) == 'IC_ORA1'&
+          .OR. TRIM(HICNAMES(JLI)) == 'IC_ORA2') THEN
+         ZSGRSVS(JL,JLI) = ZSGRSVS(JL,JLI) + XRETHP * ZZW2(JL,NINDEXWI(JLI))
+         ZGRSVS(JL,NINDEXGI(JLI)) = ZGRSVS(JL,NINDEXGI(JLI)) +                        &
+                                   (1. - XRETHP) * ZZW2(JL,NINDEXWI(JLI))  
+       ELSE IF (TRIM(HICNAMES(JLI)) == 'IC_SO2' .OR. TRIM(HICNAMES(JLI)) == 'IC_OH' &
+          .OR. TRIM(HICNAMES(JLI)) == 'IC_MO2' .OR. &
+               TRIM(HICNAMES(JLI)) == 'IC_OP1') THEN
+         ZSGRSVS(JL,JLI) = ZSGRSVS(JL,JLI) + XRETSU * ZZW2(JL,NINDEXWI(JLI))
+         ZGRSVS(JL,NINDEXGI(JLI)) = ZGRSVS(JL,NINDEXGI(JLI)) +                        &
+                                   (1. - XRETSU) * ZZW2(JL,NINDEXWI(JLI))
+       ELSE
+         ZSGRSVS(JL,JLI) = ZSGRSVS(JL,JLI) + XRETDF * ZZW2(JL,NINDEXWI(JLI))
+         ZGRSVS(JL,NINDEXGI(JLI)) = ZGRSVS(JL,NINDEXGI(JLI)) +                        &
+                                   (1. - XRETDF) * ZZW2(JL,NINDEXWI(JLI))
+       ENDIF
+     ENDDO
+     ELSE
+       IF (.NOT.(OCH_RET_ICE)) THEN
+         DO JLW = 1, SIZE(PRRSVS,4)
+            IF (.NOT.(NINDEXWG(JLW).EQ.0)) THEN
+              ZGRSVS(JL,NINDEXWG(JLW)) = ZGRSVS(JL,NINDEXWG(JLW)) + ZZW2(JL,JLW)
+            ENDIF
+         ENDDO
+       ENDIF
+     ENDIF
+   ENDIF  
+ ENDDO
+!
+!
+!-------------------------------------------------------------------------------
+!
+!*       6.     COMPUTES THE FAST COLD PROCESS SOURCES
+!               --------------------------------------
+!
+!*       6.1    compute the slope parameter Lbda_s and Lbda_g
+!
+ WHERE ( ZRST(:)>0.0 )
+   ZLBDAS(:)  = MIN( XLBDAS_MAX,                                           &
+                     XLBS*( ZRHODREF(:)*MAX( ZRST(:),PRTMIN_AQ*1.e3/ZRHODREF(:)) )**XLBEXS )
+ END WHERE
+!
+ WHERE ( ZRGT(:)>0.0 )
+   ZLBDAG(:)  = XLBG*( ZRHODREF(:)*MAX( ZRGT(:),PRTMIN_AQ*1.e3/ZRHODREF(:)))**XLBEXG
+ END WHERE
+!
+!*       6.2    cloud droplet riming of the aggregates
+!
+ ZZW1(:,:) = 0.0
+ ZZW(:) = 0.0
+
+ ALLOCATE(GRIM(IMICRO))
+ GRIM(:) = (ZRCT(:)>PRTMIN_AQ*1.e3/ZRHODREF(:)) .AND. & 
+           (ZRST(:)>PRTMIN_AQ*1.e3/ZRHODREF(:)) .AND. &
+           (ZZRCS(:)>0.0) .AND. (ZZT(:)<XTT)
+ IGRIM = COUNT( GRIM(:) )
+!
+ IF( IGRIM>0 ) THEN
+!
+!        6.2.0  allocations
+!
+   ALLOCATE(ZVEC1(IGRIM))
+   ALLOCATE(ZVEC2(IGRIM))
+   ALLOCATE(IVEC1(IGRIM))
+   ALLOCATE(IVEC2(IGRIM))
+!
+!        6.2.1  select the ZLBDAS
+!
+   ZVEC1(:) = PACK( ZLBDAS(:),MASK=GRIM(:) )
+!
+!        6.2.2  find the next lower indice for the ZLBDAS in the geometrical
+!               set of Lbda_s used to tabulate some moments of the incomplete
+!               gamma function
+!
+   ZVEC2(1:IGRIM) = MAX( 1.00001, MIN( REAL(NGAMINC)-0.00001,           &
+                         XRIMINTP1 * LOG( ZVEC1(1:IGRIM) ) + XRIMINTP2 ) )
+   IVEC2(1:IGRIM) = INT( ZVEC2(1:IGRIM) )
+   ZVEC2(1:IGRIM) = ZVEC2(1:IGRIM) - REAL( IVEC2(1:IGRIM) )
+!
+!        6.2.3  perform the linear interpolation of the normalized
+!               "2+XDS"-moment of the incomplete gamma function
+!
+   ZVEC1(1:IGRIM) =   XGAMINC_RIM1( IVEC2(1:IGRIM)+1 )* ZVEC2(1:IGRIM)      &
+                    - XGAMINC_RIM1( IVEC2(1:IGRIM)   )*(ZVEC2(1:IGRIM) - 1.0)
+   ZZW(:) = UNPACK( VECTOR=ZVEC1(:),MASK=GRIM,FIELD=0.0 )
+!
+!        6.2.4  riming of the small sized aggregates
+!
+   ZZW2(:,:) = 0.0
+   DO JL = 1,IMICRO
+     IF ( GRIM(JL) ) THEN
+       ZZW1(JL,1) = MIN( ZZRCS(JL), XCRIMSS * ZZW(JL) * ZRCT(JL) * ZRST(JL)  & ! RCRIMSS
+                         * ZLBDAS(JL)**(XBS+XEXCRIMSS) * ZRHODREF(JL)**(-XCEXVT+1) )
+       ZZW2(JL,:) = ZZW1(JL,1) * ZCSVT(JL,:)/ZRCT(JL)
+       ZZW2(JL,:) = MAX(MIN(ZZW2(JL,:),(ZCSVT(JL,:)/PTSTEP)),0.0)
+       ZCRSVS(JL,:) = ZCRSVS(JL,:) - ZZW2(JL,:)
+       IF (OUSECHIC) THEN
+       DO JLI = 1, SIZE(PSGRSVS,4)
+         IF (TRIM(HICNAMES(JLI)) == 'IC_HNO3' .OR. TRIM(HICNAMES(JLI)) == 'IC_SULF' &
+            .OR. TRIM(HICNAMES(JLI)) == 'IC_H2SO4' &
+            .OR. TRIM(HICNAMES(JLI)) == 'IC_NH3' .OR. TRIM(HICNAMES(JLI)) == 'IC_HCL' &
+            .OR. HICNAMES(JLI)(1:4) == 'IC_A' .OR. HICNAMES(JLI)(1:4) == 'IC_B' &
+            .OR. NINDEXGI(JLI).EQ.0) THEN
+           ZSGRSVS(JL,JLI) = ZSGRSVS(JL,JLI) + XRETNA * ZZW2(JL,NINDEXWI(JLI))
+         ELSE IF (TRIM(HICNAMES(JLI)) == 'IC_H2O2' .OR. TRIM(HICNAMES(JLI)) == 'IC_HO2' &
+            .OR. TRIM(HICNAMES(JLI)) == 'IC_HONO' .OR. TRIM(HICNAMES(JLI)) == 'IC_HNO4'&
+            .OR. TRIM(HICNAMES(JLI)) == 'IC_HCHO' .OR. TRIM(HICNAMES(JLI)) == 'IC_ORA1'&
+            .OR. TRIM(HICNAMES(JLI)) == 'IC_ORA2') THEN
+           ZSGRSVS(JL,JLI) = ZSGRSVS(JL,JLI) + XRETHP * ZZW2(JL,NINDEXWI(JLI))
+           ZGRSVS(JL,NINDEXGI(JLI)) = ZGRSVS(JL,NINDEXGI(JLI)) +                        &
+                                     (1. - XRETHP) * ZZW2(JL,NINDEXWI(JLI))
+         ELSE IF (TRIM(HICNAMES(JLI)) == 'IC_SO2' .OR. TRIM(HICNAMES(JLI)) == 'IC_OH' &
+            .OR. TRIM(HICNAMES(JLI)) == 'IC_MO2' .OR. &
+                 TRIM(HICNAMES(JLI)) == 'IC_OP1') THEN
+           ZSGRSVS(JL,JLI) = ZSGRSVS(JL,JLI) + XRETSU * ZZW2(JL,NINDEXWI(JLI))
+           ZGRSVS(JL,NINDEXGI(JLI)) = ZGRSVS(JL,NINDEXGI(JLI)) +                        &
+                                     (1. - XRETSU) * ZZW2(JL,NINDEXWI(JLI))
+         ELSE
+           ZSGRSVS(JL,JLI) = ZSGRSVS(JL,JLI) + XRETDF * ZZW2(JL,NINDEXWI(JLI))
+           ZGRSVS(JL,NINDEXGI(JLI)) = ZGRSVS(JL,NINDEXGI(JLI)) +                        &
+                                     (1. - XRETDF) * ZZW2(JL,NINDEXWI(JLI))
+         ENDIF
+       ENDDO
+       ELSE
+         IF (.NOT.(OCH_RET_ICE)) THEN
+           DO JLW = 1, SIZE(PCRSVS,4)
+             IF (.NOT.(NINDEXWG(JLW).EQ.0)) THEN
+               ZGRSVS(JL,NINDEXWG(JLW)) = ZGRSVS(JL,NINDEXWG(JLW)) + ZZW2(JL,JLW)
+             ENDIF
+           ENDDO
+         ENDIF
+       ENDIF
+     ENDIF
+   ENDDO
+!
+!        6.2.5  riming-conversion of the large sized aggregates into graupel
+!
+   ZZW2(:,:) = 0.0
+   DO JL = 1,IMICRO
+     IF ( GRIM(JL) .AND. (ZZRSS(JL)>0.0) ) THEN
+       ZZW1(JL,2) = MIN( ZZRCS(JL), XCRIMSG * ZRCT(JL) * ZRST(JL) * ZLBDAS(JL)**(XBS+XEXCRIMSG)  & ! RCRIMSG
+                        * ZRHODREF(JL)**(-XCEXVT+1) - ZZW1(JL,1) )
+       ZZW2(JL,:) = ZZW1(JL,2) * ZCSVT(JL,:)/ZRCT(JL)
+       ZZW2(JL,:) = MAX(MIN(ZZW2(JL,:),(ZCSVT(JL,:)/PTSTEP)),0.0)
+       ZCRSVS(JL,:) = ZCRSVS(JL,:) - ZZW2(JL,:)
+       IF (OUSECHIC) THEN
+       DO JLI = 1, SIZE(PSGRSVS,4)
+         IF (TRIM(HICNAMES(JLI)) == 'IC_HNO3' .OR. TRIM(HICNAMES(JLI)) == 'IC_SULF' &
+            .OR. TRIM(HICNAMES(JLI)) == 'IC_H2SO4' &
+            .OR. TRIM(HICNAMES(JLI)) == 'IC_NH3' .OR. TRIM(HICNAMES(JLI)) == 'IC_HCL' &
+            .OR. HICNAMES(JLI)(1:4) == 'IC_A' .OR. HICNAMES(JLI)(1:4) == 'IC_B' &
+            .OR. NINDEXGI(JLI).EQ.0) THEN
+           ZSGRSVS(JL,JLI) = ZSGRSVS(JL,JLI) + XRETNA * ZZW2(JL,NINDEXWI(JLI))
+         ELSE IF (TRIM(HICNAMES(JLI)) == 'IC_H2O2' .OR. TRIM(HICNAMES(JLI)) == 'IC_HO2' &
+            .OR. TRIM(HICNAMES(JLI)) == 'IC_HONO' .OR. TRIM(HICNAMES(JLI)) == 'IC_HNO4'&
+            .OR. TRIM(HICNAMES(JLI)) == 'IC_HCHO' .OR. TRIM(HICNAMES(JLI)) == 'IC_ORA1'&
+            .OR. TRIM(HICNAMES(JLI)) == 'IC_ORA2') THEN
+           ZSGRSVS(JL,JLI) = ZSGRSVS(JL,JLI) + XRETHP * ZZW2(JL,NINDEXWI(JLI))
+           ZGRSVS(JL,NINDEXGI(JLI)) = ZGRSVS(JL,NINDEXGI(JLI)) +                        &
+                                     (1. - XRETHP) * ZZW2(JL,NINDEXWI(JLI))
+         ELSE IF (TRIM(HICNAMES(JLI)) == 'IC_SO2' .OR. TRIM(HICNAMES(JLI)) == 'IC_OH' &
+            .OR. TRIM(HICNAMES(JLI)) == 'IC_MO2' .OR. &
+                 TRIM(HICNAMES(JLI)) == 'IC_OP1') THEN
+           ZSGRSVS(JL,JLI) = ZSGRSVS(JL,JLI) + XRETSU * ZZW2(JL,NINDEXWI(JLI))
+           ZGRSVS(JL,NINDEXGI(JLI)) = ZGRSVS(JL,NINDEXGI(JLI)) +                        &
+                                     (1. - XRETSU) * ZZW2(JL,NINDEXWI(JLI))
+         ELSE
+           ZSGRSVS(JL,JLI) = ZSGRSVS(JL,JLI) + XRETDF * ZZW2(JL,NINDEXWI(JLI))
+           ZGRSVS(JL,NINDEXGI(JLI)) = ZGRSVS(JL,NINDEXGI(JLI)) +                        &
+                                     (1. - XRETDF) * ZZW2(JL,NINDEXWI(JLI))
+         ENDIF
+       ENDDO
+       ELSE
+         IF (.NOT.(OCH_RET_ICE)) THEN
+           DO JLW = 1, SIZE(PCRSVS,4)
+             IF (.NOT.(NINDEXWG(JLW).EQ.0)) THEN
+               ZGRSVS(JL,NINDEXWG(JLW)) = ZGRSVS(JL,NINDEXWG(JLW)) + ZZW2(JL,JLW)
+             ENDIF
+           ENDDO
+         ENDIF
+       ENDIF
+     ENDIF
+   ENDDO
+
+   DEALLOCATE(IVEC2)
+   DEALLOCATE(IVEC1)
+   DEALLOCATE(ZVEC2)
+   DEALLOCATE(ZVEC1)
+ END IF
+ DEALLOCATE(GRIM)
+!
+!*       6.3    rain accretion onto the aggregates
+!
+ ZZW(:) = 0.0
+ ZZW1(:,2:3) = 0.0
+ ALLOCATE(GACC(IMICRO))
+ GACC(:) = (ZRRT(:)>PRTMIN_AQ*1.e3/ZRHODREF(:)) .AND. &
+           (ZRST(:)>PRTMIN_AQ*1.e3/ZRHODREF(:)) .AND. &
+           (ZZRRS(:)>0.0) .AND. (ZZT(:)<XTT)
+ IGACC = COUNT( GACC(:) )
+!
+ IF( IGACC>0 ) THEN
+!
+!        6.3.0  allocations
+!
+   ALLOCATE(ZVEC1(IGACC))
+   ALLOCATE(ZVEC2(IGACC))
+   ALLOCATE(ZVEC3(IGACC))
+   ALLOCATE(IVEC1(IGACC))
+   ALLOCATE(IVEC2(IGACC))
+!
+!        6.3.1  select the (ZLBDAS,ZLBDAR) couplet
+!
+   ZVEC1(:) = PACK( ZLBDAS(:),MASK=GACC(:) )
+   ZVEC2(:) = PACK( ZLBDAR(:),MASK=GACC(:) )
+!
+!        6.3.2  find the next lower indice for the ZLBDAS and for the ZLBDAR
+!               in the geometrical set of (Lbda_s,Lbda_r) couplet use to
+!               tabulate the RACCSS-kernel
+!
+   ZVEC1(1:IGACC) = MAX( 1.00001, MIN( REAL(NACCLBDAS)-0.00001,           &
+                         XACCINTP1S * LOG( ZVEC1(1:IGACC) ) + XACCINTP2S ) )
+   IVEC1(1:IGACC) = INT( ZVEC1(1:IGACC) )
+   ZVEC1(1:IGACC) = ZVEC1(1:IGACC) - REAL( IVEC1(1:IGACC) )
+!
+   ZVEC2(1:IGACC) = MAX( 1.00001, MIN( REAL(NACCLBDAR)-0.00001,           &
+                         XACCINTP1R * LOG( ZVEC2(1:IGACC) ) + XACCINTP2R ) )
+   IVEC2(1:IGACC) = INT( ZVEC2(1:IGACC) )
+   ZVEC2(1:IGACC) = ZVEC2(1:IGACC) - REAL( IVEC2(1:IGACC) )
+!
+!        6.3.3  perform the bilinear interpolation of the normalized
+!               RACCSS-kernel
+!
+   DO JJ = 1,IGACC
+     ZVEC3(JJ) =  (  XKER_RACCSS(IVEC1(JJ)+1,IVEC2(JJ)+1)* ZVEC2(JJ)          &
+                   - XKER_RACCSS(IVEC1(JJ)+1,IVEC2(JJ)  )*(ZVEC2(JJ) - 1.0) ) &
+                                                                  * ZVEC1(JJ) &
+                - (  XKER_RACCSS(IVEC1(JJ)  ,IVEC2(JJ)+1)* ZVEC2(JJ)          &
+                   - XKER_RACCSS(IVEC1(JJ)  ,IVEC2(JJ)  )*(ZVEC2(JJ) - 1.0) ) &
+                                                            * (ZVEC1(JJ) - 1.0)
+   END DO
+   ZZW(:) = UNPACK( VECTOR=ZVEC3(:),MASK=GACC,FIELD=0.0 )
+!
+!        6.3.4  raindrop accretion on the small sized aggregates
+!
+   ZZW2(:,:) = 0.0
+   DO JL = 1,IMICRO
+     IF ( GACC(JL) ) THEN
+       ZZW1(JL,2) =                                            & !! coef of RRACCS
+              XFRACCSS*( ZRST(JL)*ZLBDAS(JL)**XBS )*( ZRHODREF(JL)**(-XCEXVT) ) &
+         *( XLBRACCS1/((ZLBDAS(JL)**2)               ) +                  &
+            XLBRACCS2/( ZLBDAS(JL)    * ZLBDAR(JL)    ) +                  &
+            XLBRACCS3/(               (ZLBDAR(JL)**2)) )/ZLBDAR(JL)**4
+       ZZW1(JL,4) = MIN( ZZRRS(JL),ZZW1(JL,2)*ZZW(JL) )           ! RRACCSS
+       ZZW2(JL,:) = ZZW1(JL,4) * ZRSVT(JL,:)/ZRRT(JL)
+       ZZW2(JL,:) = MAX(MIN(ZZW2(JL,:),(ZRSVT(JL,:)/PTSTEP)),0.0)
+       ZRRSVS(JL,:) = ZRRSVS(JL,:) - ZZW2(JL,:) 
+       IF (OUSECHIC) THEN
+       DO JLI = 1, SIZE(PSGRSVS,4)
+         IF (TRIM(HICNAMES(JLI)) == 'IC_HNO3' .OR. TRIM(HICNAMES(JLI)) == 'IC_SULF' &
+            .OR. TRIM(HICNAMES(JLI)) == 'IC_H2SO4' &
+            .OR. TRIM(HICNAMES(JLI)) == 'IC_NH3' .OR. TRIM(HICNAMES(JLI)) == 'IC_HCL' &
+            .OR. HICNAMES(JLI)(1:4) == 'IC_A' .OR. HICNAMES(JLI)(1:4) == 'IC_B' &
+            .OR. NINDEXGI(JLI).EQ.0) THEN
+           ZSGRSVS(JL,JLI) = ZSGRSVS(JL,JLI) + XRETNA * ZZW2(JL,NINDEXWI(JLI))
+         ELSE IF (TRIM(HICNAMES(JLI)) == 'IC_H2O2' .OR. TRIM(HICNAMES(JLI)) == 'IC_HO2' &
+            .OR. TRIM(HICNAMES(JLI)) == 'IC_HONO' .OR. TRIM(HICNAMES(JLI)) == 'IC_HNO4'&
+            .OR. TRIM(HICNAMES(JLI)) == 'IC_HCHO' .OR. TRIM(HICNAMES(JLI)) == 'IC_ORA1'&
+            .OR. TRIM(HICNAMES(JLI)) == 'IC_ORA2') THEN
+           ZSGRSVS(JL,JLI) = ZSGRSVS(JL,JLI) + XRETHP * ZZW2(JL,NINDEXWI(JLI))
+           ZGRSVS(JL,NINDEXGI(JLI)) = ZGRSVS(JL,NINDEXGI(JLI)) +                        &
+                                     (1. - XRETHP) * ZZW2(JL,NINDEXWI(JLI))
+         ELSE IF (TRIM(HICNAMES(JLI)) == 'IC_SO2' .OR. TRIM(HICNAMES(JLI)) == 'IC_OH' &
+            .OR. TRIM(HICNAMES(JLI)) == 'IC_MO2' .OR. &
+                 TRIM(HICNAMES(JLI)) == 'IC_OP1') THEN
+           ZSGRSVS(JL,JLI) = ZSGRSVS(JL,JLI) + XRETSU * ZZW2(JL,NINDEXWI(JLI))
+           ZGRSVS(JL,NINDEXGI(JLI)) = ZGRSVS(JL,NINDEXGI(JLI)) +                        &
+                                     (1. - XRETSU) * ZZW2(JL,NINDEXWI(JLI))
+         ELSE
+           ZSGRSVS(JL,JLI) = ZSGRSVS(JL,JLI) + XRETDF * ZZW2(JL,NINDEXWI(JLI))
+           ZGRSVS(JL,NINDEXGI(JLI)) = ZGRSVS(JL,NINDEXGI(JLI)) +                        &
+                                     (1. - XRETDF) * ZZW2(JL,NINDEXWI(JLI))
+         ENDIF
+       ENDDO
+       ELSE
+         IF (.NOT.(OCH_RET_ICE)) THEN
+           DO JLW = 1, SIZE(PRRSVS,4)
+             IF (.NOT.(NINDEXWG(JLW).EQ.0)) THEN
+               ZGRSVS(JL,NINDEXWG(JLW)) = ZGRSVS(JL,NINDEXWG(JLW)) + ZZW2(JL,JLW)
+             ENDIF
+           ENDDO
+         ENDIF
+       ENDIF
+     ENDIF
+   ENDDO
+!
+!        6.3.4b perform the bilinear interpolation of the normalized
+!               RACCS-kernel
+!
+   DO JJ = 1,IGACC
+     ZVEC3(JJ) =  (   XKER_RACCS(IVEC2(JJ)+1,IVEC1(JJ)+1)* ZVEC1(JJ)          &
+                   -  XKER_RACCS(IVEC2(JJ)+1,IVEC1(JJ)  )*(ZVEC1(JJ) - 1.0) ) &
+                                                                  * ZVEC2(JJ) &
+                - (   XKER_RACCS(IVEC2(JJ)  ,IVEC1(JJ)+1)* ZVEC1(JJ)          &
+                   -  XKER_RACCS(IVEC2(JJ)  ,IVEC1(JJ)  )*(ZVEC1(JJ) - 1.0) ) &
+                                                          * (ZVEC2(JJ) - 1.0)
+   END DO
+   ZZW1(:,2) = ZZW1(:,2)*UNPACK( VECTOR=ZVEC3(:),MASK=GACC(:),FIELD=0.0 )
+!
+!        6.3.5  raindrop accretion-conversion of the large sized aggregates
+!               into graupeln
+!
+   ZZW2(:,:) = 0.0
+   WHERE ( GACC(:) .AND. (ZZRSS(:)>0.0) )
+     ZZW1(:,2) = MAX( MIN( ZZRRS(:),ZZW1(:,2)-ZZW1(:,4) ),0.0 )       ! RRACCSG
+   END WHERE
+   DO JL = 1,IMICRO
+     IF ( GACC(JL) .AND. (ZZRSS(JL)>0.0) .AND. ZZW1(JL,2)>0.0 ) THEN
+       ZZW2(JL,:) = ZZW1(JL,2) * ZRSVT(JL,:)/ZRRT(JL)
+       ZZW2(JL,:) = MAX(MIN(ZZW2(JL,:),(ZRSVT(JL,:)/PTSTEP)),0.0)
+       ZRRSVS(JL,:) = ZRRSVS(JL,:) - ZZW2(JL,:) 
+       IF (OUSECHIC) THEN
+       DO JLI = 1, SIZE(PSGRSVS,4)
+         IF (TRIM(HICNAMES(JLI)) == 'IC_HNO3' .OR. TRIM(HICNAMES(JLI)) == 'IC_SULF' &
+            .OR. TRIM(HICNAMES(JLI)) == 'IC_H2SO4' &
+            .OR. TRIM(HICNAMES(JLI)) == 'IC_NH3' .OR. TRIM(HICNAMES(JLI)) == 'IC_HCL' &
+            .OR. HICNAMES(JLI)(1:4) == 'IC_A' .OR. HICNAMES(JLI)(1:4) == 'IC_B' &
+            .OR. NINDEXGI(JLI).EQ.0) THEN
+           ZSGRSVS(JL,JLI) = ZSGRSVS(JL,JLI) + XRETNA * ZZW2(JL,NINDEXWI(JLI))
+         ELSE IF (TRIM(HICNAMES(JLI)) == 'IC_H2O2' .OR. TRIM(HICNAMES(JLI)) == 'IC_HO2' &
+            .OR. TRIM(HICNAMES(JLI)) == 'IC_HONO' .OR. TRIM(HICNAMES(JLI)) == 'IC_HNO4'&
+            .OR. TRIM(HICNAMES(JLI)) == 'IC_HCHO' .OR. TRIM(HICNAMES(JLI)) == 'IC_ORA1'&
+            .OR. TRIM(HICNAMES(JLI)) == 'IC_ORA2') THEN
+           ZSGRSVS(JL,JLI) = ZSGRSVS(JL,JLI) + XRETHP * ZZW2(JL,NINDEXWI(JLI))
+           ZGRSVS(JL,NINDEXGI(JLI)) = ZGRSVS(JL,NINDEXGI(JLI)) +                        &
+                                     (1. - XRETHP) * ZZW2(JL,NINDEXWI(JLI))
+         ELSE IF (TRIM(HICNAMES(JLI)) == 'IC_SO2' .OR. TRIM(HICNAMES(JLI)) == 'IC_OH' &
+            .OR. TRIM(HICNAMES(JLI)) == 'IC_MO2' .OR. &
+                 TRIM(HICNAMES(JLI)) == 'IC_OP1') THEN
+           ZSGRSVS(JL,JLI) = ZSGRSVS(JL,JLI) + XRETSU * ZZW2(JL,NINDEXWI(JLI))
+           ZGRSVS(JL,NINDEXGI(JLI)) = ZGRSVS(JL,NINDEXGI(JLI)) +                        &
+                                     (1. - XRETSU) * ZZW2(JL,NINDEXWI(JLI))
+         ELSE
+           ZSGRSVS(JL,JLI) = ZSGRSVS(JL,JLI) + XRETDF * ZZW2(JL,NINDEXWI(JLI))
+           ZGRSVS(JL,NINDEXGI(JLI)) = ZGRSVS(JL,NINDEXGI(JLI)) +                        &
+                                     (1. - XRETDF) * ZZW2(JL,NINDEXWI(JLI))
+         ENDIF
+       ENDDO
+       ELSE
+         IF (.NOT.(OCH_RET_ICE)) THEN
+           DO JLW = 1, SIZE(PRRSVS,4)
+             IF (.NOT.(NINDEXWG(JLW).EQ.0)) THEN
+               ZGRSVS(JL,NINDEXWG(JLW)) = ZGRSVS(JL,NINDEXWG(JLW)) + ZZW2(JL,JLW)
+             ENDIF
+           ENDDO
+         ENDIF
+       ENDIF
+     ENDIF
+   ENDDO
+!                                                           
+   DEALLOCATE(IVEC2)
+   DEALLOCATE(IVEC1)
+   DEALLOCATE(ZVEC3)
+   DEALLOCATE(ZVEC2)
+   DEALLOCATE(ZVEC1)
+ END IF
+ DEALLOCATE(GACC)
+!
+!*       6.4    rain contact freezing
+!
+ ZZW1(:,4) = 0.0
+ ZZW2(:,:) = 0.0
+ DO JL = 1,IMICRO
+   IF ( (ZRIT(JL)>PRTMIN_AQ*1.e3/ZRHODREF(JL)) .AND.  &
+        (ZRRT(JL)>PRTMIN_AQ*1.e3/ZRHODREF(JL)) .AND.  &
+        (ZZRIS(JL)>0.0) .AND. (ZZRRS(JL)>0.0) ) THEN
+     ZZW1(JL,4) = MIN( ZZRRS(JL), XRCFRI * ZCIT(JL)       & ! RRCFRIG
+                                 * ZLBDAR(JL)**XEXRCFRI    &
+                                 * ZRHODREF(JL)**(-XCEXVT-1.) )
+     ZZW2(JL,:) = ZZW1(JL,4) * ZRSVT(JL,:)/ZRRT(JL)
+     ZZW2(JL,:) = MAX(MIN(ZZW2(JL,:),(ZRSVT(JL,:)/PTSTEP)),0.0)
+     ZRRSVS(JL,:) = ZRRSVS(JL,:) - ZZW2(JL,:) 
+     IF (OUSECHIC) THEN
+     DO JLI = 1, SIZE(PSGRSVS,4)
+       IF (TRIM(HICNAMES(JLI)) == 'IC_HNO3' .OR. TRIM(HICNAMES(JLI)) == 'IC_SULF' &
+          .OR. TRIM(HICNAMES(JLI)) == 'IC_H2SO4' &
+          .OR. TRIM(HICNAMES(JLI)) == 'IC_NH3' .OR. TRIM(HICNAMES(JLI)) == 'IC_HCL' &
+          .OR. HICNAMES(JLI)(1:4) == 'IC_A' .OR. HICNAMES(JLI)(1:4) == 'IC_B' &
+          .OR. NINDEXGI(JLI).EQ.0) THEN
+         ZSGRSVS(JL,JLI) = ZSGRSVS(JL,JLI) + XRETNA * ZZW2(JL,NINDEXWI(JLI))
+       ELSE IF (TRIM(HICNAMES(JLI)) == 'IC_H2O2' .OR. TRIM(HICNAMES(JLI)) == 'IC_HO2' &
+          .OR. TRIM(HICNAMES(JLI)) == 'IC_HONO' .OR. TRIM(HICNAMES(JLI)) == 'IC_HNO4'&
+          .OR. TRIM(HICNAMES(JLI)) == 'IC_HCHO' .OR. TRIM(HICNAMES(JLI)) == 'IC_ORA1'&
+          .OR. TRIM(HICNAMES(JLI)) == 'IC_ORA2') THEN
+         ZSGRSVS(JL,JLI) = ZSGRSVS(JL,JLI) + XRETHP * ZZW2(JL,NINDEXWI(JLI))
+         ZGRSVS(JL,NINDEXGI(JLI)) = ZGRSVS(JL,NINDEXGI(JLI)) +                        &
+                                   (1. - XRETHP) * ZZW2(JL,NINDEXWI(JLI))
+       ELSE IF (TRIM(HICNAMES(JLI)) == 'IC_SO2' .OR. TRIM(HICNAMES(JLI)) == 'IC_OH' &
+          .OR. TRIM(HICNAMES(JLI)) == 'IC_MO2' .OR. &
+               TRIM(HICNAMES(JLI)) == 'IC_OP1') THEN
+         ZSGRSVS(JL,JLI) = ZSGRSVS(JL,JLI) + XRETSU * ZZW2(JL,NINDEXWI(JLI))
+         ZGRSVS(JL,NINDEXGI(JLI)) = ZGRSVS(JL,NINDEXGI(JLI)) +                        &
+                                   (1. - XRETSU) * ZZW2(JL,NINDEXWI(JLI))
+       ELSE
+         ZSGRSVS(JL,JLI) = ZSGRSVS(JL,JLI) + XRETDF * ZZW2(JL,NINDEXWI(JLI))
+         ZGRSVS(JL,NINDEXGI(JLI)) = ZGRSVS(JL,NINDEXGI(JLI)) +                        &
+                                   (1. - XRETDF) * ZZW2(JL,NINDEXWI(JLI))
+       ENDIF
+     ENDDO
+     ELSE
+       IF (.NOT.(OCH_RET_ICE)) THEN
+         DO JLW = 1, SIZE(PRRSVS,4)
+           IF (.NOT.(NINDEXWG(JLW).EQ.0)) THEN
+             ZGRSVS(JL,NINDEXWG(JLW)) = ZGRSVS(JL,NINDEXWG(JLW)) + ZZW2(JL,JLW)
+           ENDIF
+         ENDDO
+       ENDIF
+     ENDIF
+   ENDIF
+ ENDDO
+!
+!*       6.5    compute the Dry growth case of graupel
+!
+ ZZW(:) = 0.0
+ ZZW1(:,:) = 0.0
+ WHERE( (ZRGT(:)>PRTMIN_AQ*1.e3/ZRHODREF(:)) .AND.   &
+        ((ZRCT(:)>PRTMIN_AQ*1.e3/ZRHODREF(:) .AND. ZZRCS(:)>0.0)) )
+   ZZW(:) = ZLBDAG(:)**(XCXG-XDG-2.0) * ZRHODREF(:)**(-XCEXVT)
+   ZZW1(:,1) = MIN( ZZRCS(:),XFCDRYG * ZRCT(:) * ZZW(:) )             ! RCDRYG
+ END WHERE
+ WHERE( (ZRGT(:)>PRTMIN_AQ*1.e3/ZRHODREF(:)) .AND. &
+        ((ZRIT(:)>PRTMIN_AQ*1.e3/ZRHODREF(:) .AND. ZZRIS(:)>0.0)) )
+   ZZW(:) = ZLBDAG(:)**(XCXG-XDG-2.0) * ZRHODREF(:)**(-XCEXVT)
+   ZZW1(:,2) = MIN( ZZRIS(:),XFIDRYG * EXP( XCOLEXIG*(ZZT(:)-XTT) ) &
+                                    * ZRIT(:) * ZZW(:) )             ! RIDRYG
+ END WHERE
+!
+!        6.5.1  accretion of aggregates on the graupeln
+!
+ ALLOCATE(GDRY(IMICRO))
+ GDRY(:) = (ZRST(:)>PRTMIN_AQ*1.e3/ZRHODREF(:)) .AND. &
+           (ZRGT(:)>PRTMIN_AQ*1.e3/ZRHODREF(:)) .AND. (ZZRSS(:)>0.0)
+ IGDRY = COUNT( GDRY(:) )
+!
+ IF( IGDRY>0 ) THEN
+!
+!        6.5.2  allocations
+!
+   ALLOCATE(ZVEC1(IGDRY))
+   ALLOCATE(ZVEC2(IGDRY))
+   ALLOCATE(ZVEC3(IGDRY))
+   ALLOCATE(IVEC1(IGDRY))
+   ALLOCATE(IVEC2(IGDRY))
+!
+!        6.5.3  select the (ZLBDAG,ZLBDAS) couplet
+!
+   ZVEC1(:) = PACK( ZLBDAG(:),MASK=GDRY(:) )
+   ZVEC2(:) = PACK( ZLBDAS(:),MASK=GDRY(:) )
+!
+!        6.5.4  find the next lower indice for the ZLBDAG and for the ZLBDAS
+!               in the geometrical set of (Lbda_g,Lbda_s) couplet use to
+!               tabulate the SDRYG-kernel
+!
+   ZVEC1(1:IGDRY) = MAX( 1.00001, MIN( REAL(NDRYLBDAG)-0.00001,           &
+                         XDRYINTP1G * LOG( ZVEC1(1:IGDRY) ) + XDRYINTP2G ) )
+   IVEC1(1:IGDRY) = INT( ZVEC1(1:IGDRY) )
+   ZVEC1(1:IGDRY) = ZVEC1(1:IGDRY) - REAL( IVEC1(1:IGDRY) )
+!
+   ZVEC2(1:IGDRY) = MAX( 1.00001, MIN( REAL(NDRYLBDAS)-0.00001,           &
+                         XDRYINTP1S * LOG( ZVEC2(1:IGDRY) ) + XDRYINTP2S ) )
+   IVEC2(1:IGDRY) = INT( ZVEC2(1:IGDRY) )
+   ZVEC2(1:IGDRY) = ZVEC2(1:IGDRY) - REAL( IVEC2(1:IGDRY) )
+!
+!        6.5.5  perform the bilinear interpolation of the normalized
+!               SDRYG-kernel
+!
+   DO JJ = 1,IGDRY
+     ZVEC3(JJ) =  (  XKER_SDRYG(IVEC1(JJ)+1,IVEC2(JJ)+1)* ZVEC2(JJ)          &
+                   - XKER_SDRYG(IVEC1(JJ)+1,IVEC2(JJ)  )*(ZVEC2(JJ) - 1.0) ) &
+                                                                 * ZVEC1(JJ) &
+                - (  XKER_SDRYG(IVEC1(JJ)  ,IVEC2(JJ)+1)* ZVEC2(JJ)          &
+                   - XKER_SDRYG(IVEC1(JJ)  ,IVEC2(JJ)  )*(ZVEC2(JJ) - 1.0) ) &
+                                                           * (ZVEC1(JJ) - 1.0)
+   END DO
+   ZZW(:) = UNPACK( VECTOR=ZVEC3(:),MASK=GDRY,FIELD=0.0 )
+!
+   WHERE( GDRY(:) )
+     ZZW1(:,3) = MIN( ZZRSS(:),XFSDRYG*ZZW(:)                         & ! RSDRYG
+                                     * EXP( XCOLEXSG*(ZZT(:)-XTT) )  &
+                   *ZRST(:)*( ZLBDAG(:)**XCXG )    &
+                   *( ZRHODREF(:)**(-XCEXVT) )                    &
+                        *( XLBSDRYG1/( ZLBDAG(:)**2              ) + &
+                           XLBSDRYG2/( ZLBDAG(:)   * ZLBDAS(:)   ) + &
+                           XLBSDRYG3/(               ZLBDAS(:)**2) ) )
+   END WHERE
+   DEALLOCATE(IVEC2)
+   DEALLOCATE(IVEC1)
+   DEALLOCATE(ZVEC3)
+   DEALLOCATE(ZVEC2)
+   DEALLOCATE(ZVEC1)
+ END IF
+!
+!        6.5.6  accretion of raindrops on the graupeln
+!
+ GDRY(:) = (ZRRT(:)>PRTMIN_AQ*1.e3/ZRHODREF(:)) .AND. &
+           (ZRGT(:)>PRTMIN_AQ*1.e3/ZRHODREF(:)) .AND. (ZZRRS(:)>0.0)
+ IGDRY = COUNT( GDRY(:) )
+!
+ IF( IGDRY>0 ) THEN
+!
+!        6.5.7  allocations
+!
+   ALLOCATE(ZVEC1(IGDRY))
+   ALLOCATE(ZVEC2(IGDRY))
+   ALLOCATE(ZVEC3(IGDRY))
+   ALLOCATE(IVEC1(IGDRY))
+   ALLOCATE(IVEC2(IGDRY))
+!
+!        6.5.8  select the (ZLBDAG,ZLBDAR) couplet
+!
+   ZVEC1(:) = PACK( ZLBDAG(:),MASK=GDRY(:) )
+   ZVEC2(:) = PACK( ZLBDAR(:),MASK=GDRY(:) )
+!
+!        6.5.9  find the next lower indice for the ZLBDAG and for the ZLBDAR
+!               in the geometrical set of (Lbda_g,Lbda_r) couplet use to
+!               tabulate the RDRYG-kernel
+!
+   ZVEC1(1:IGDRY) = MAX( 1.00001, MIN( REAL(NDRYLBDAG)-0.00001,           &
+                         XDRYINTP1G * LOG( ZVEC1(1:IGDRY) ) + XDRYINTP2G ) )
+   IVEC1(1:IGDRY) = INT( ZVEC1(1:IGDRY) )
+   ZVEC1(1:IGDRY) = ZVEC1(1:IGDRY) - REAL( IVEC1(1:IGDRY) )
+!
+   ZVEC2(1:IGDRY) = MAX( 1.00001, MIN( REAL(NDRYLBDAR)-0.00001,           &
+                         XDRYINTP1R * LOG( ZVEC2(1:IGDRY) ) + XDRYINTP2R ) )
+   IVEC2(1:IGDRY) = INT( ZVEC2(1:IGDRY) )
+   ZVEC2(1:IGDRY) = ZVEC2(1:IGDRY) - REAL( IVEC2(1:IGDRY) )
+!
+!        6.5.10 perform the bilinear interpolation of the normalized
+!               RDRYG-kernel
+!
+   DO JJ = 1,IGDRY
+     ZVEC3(JJ) =  (  XKER_RDRYG(IVEC1(JJ)+1,IVEC2(JJ)+1)* ZVEC2(JJ)          &
+                   - XKER_RDRYG(IVEC1(JJ)+1,IVEC2(JJ)  )*(ZVEC2(JJ) - 1.0) ) &
+                                                                 * ZVEC1(JJ) &
+                - (  XKER_RDRYG(IVEC1(JJ)  ,IVEC2(JJ)+1)* ZVEC2(JJ)          &
+                   - XKER_RDRYG(IVEC1(JJ)  ,IVEC2(JJ)  )*(ZVEC2(JJ) - 1.0) ) &
+                                                            * (ZVEC1(JJ) - 1.0)
+   END DO
+   ZZW(:) = UNPACK( VECTOR=ZVEC3(:),MASK=GDRY,FIELD=0.0 )
+!
+   WHERE( GDRY(:) )
+     ZZW1(:,4) = MIN( ZZRRS(:), XFRDRYG*ZZW(:)                  & ! RRDRYG
+                       *( ZLBDAR(:)**(-4) )*( ZLBDAG(:)**XCXG ) &
+                               *( ZRHODREF(:)**(-XCEXVT-1.) )   &
+                   *( XLBRDRYG1/( ZLBDAG(:)**2              ) + &
+                      XLBRDRYG2/( ZLBDAG(:)   * ZLBDAR(:)   ) + &
+                      XLBRDRYG3/(               ZLBDAR(:)**2) ) )
+   END WHERE
+   DEALLOCATE(IVEC2)
+   DEALLOCATE(IVEC1)
+   DEALLOCATE(ZVEC3)
+   DEALLOCATE(ZVEC2)
+   DEALLOCATE(ZVEC1)
+ END IF
+!
+ ZRDRYG(:) = ZZW1(:,1) + ZZW1(:,2) + ZZW1(:,3) + ZZW1(:,4)
+ DEALLOCATE(GDRY)
+!
+!*       6.6    compute the Wet growth case of the graupel
+!
+ ZZW(:) = 0.0
+ ZRWETG(:) = 0.0
+!
+ ZKA(:) = 2.38E-2 + 0.0071E-2 * ( ZZT(:) - XTT )          ! k_a
+ ZDV(:) = 0.211E-4 * (ZZT(:)/XTT)**1.94 * (XP00/ZPRES(:)) ! D_v
+ ZCJ(:) = XSCFAC * ZRHODREF(:)**0.3 / SQRT( 1.718E-5+0.0049E-5*(ZZT(:)-XTT) )
+                                         !c^prime_j (in the ventilation factor)
+ WHERE( ZRGT(:)>PRTMIN_AQ*1.e3/ZRHODREF(:) )
+   ZZW1(:,5) = MIN( ZZRIS(:),                                   &
+               ZZW1(:,2) / (XCOLIG*EXP(XCOLEXIG*(ZZT(:)-XTT)) ) ) ! RIWETG
+   ZZW1(:,6) = MIN( ZZRSS(:),                                    &
+               ZZW1(:,3) / (XCOLSG*EXP(XCOLEXSG*(ZZT(:)-XTT)) ) ) ! RSWETG
+!
+   ZZW(:) = ZRVT(:)*ZPRES(:)/((XMV/XMD)+ZRVT(:)) ! Vapor pressure
+   ZZW(:) =   ZKA(:)*(XTT-ZZT(:)) +                              &
+            ( ZDV(:)*(XLVTT + ( XCPV - XCL ) * ( ZZT(:) - XTT )) &
+                          *(XESTT-ZZW(:))/(XRV*ZZT(:))           )
+! compute RWETG
+!
+   ZRWETG(:)=MAX( 0.0,                                               &
+                ( ZZW(:) * ( X0DEPG*       ZLBDAG(:)**XEX0DEPG +     &
+                             X1DEPG*ZCJ(:)*ZLBDAG(:)**XEX1DEPG ) +   &
+                ( ZZW1(:,5)+ZZW1(:,6) ) *                            &
+                ( ZRHODREF(:)*(XLMTT+(XCI-XCL)*(XTT-ZZT(:)))   ) ) / &
+                                ( ZRHODREF(:)*(XLMTT-XCL*(XTT-ZZT(:))) )   )
+ END WHERE
+!
+!*       6.7    Select Wet or Dry case for the growth of the graupel
+!
+ ZZW(:) = 0.0
+ ZZW2(:,:) = 0.0
+ ZZW4(:,:) = 0.0
+ DO JL = 1,IMICRO
+   IF ( (ZRGT(JL)>PRTMIN_AQ*1.e3/ZRHODREF(JL)) .AND.     &    ! wet case
+         ZZT(JL)<XTT .AND. ZRDRYG(JL)>=ZRWETG(JL) .AND.  &
+         ZRWETG(JL)>0.0 .AND. ZRCT(JL)>0.0 .AND. ZRRT(JL)>0.0)  THEN 
+     ZZW(JL)  = ZRWETG(JL)
+     ZZW2(JL,:) = ZZW(JL) * ZRSVT(JL,:)/ZRRT(JL)
+     ZZW2(JL,:) = MAX(MIN(ZZW2(JL,:),(ZRSVT(JL,:)/PTSTEP)),0.0)
+     ZRRSVS(JL,:) = ZRRSVS(JL,:) - ZZW2(JL,:)  ! rain -> graupel
+     IF (OUSECHIC) THEN
+     ZZW3(:,:) = 0.0
+     DO JLI = 1, SIZE(PSGRSVS,4)
+       IF (TRIM(HICNAMES(JLI)) == 'IC_HNO3' .OR. TRIM(HICNAMES(JLI)) == 'IC_SULF' &
+          .OR. TRIM(HICNAMES(JLI)) == 'IC_H2SO4' &
+          .OR. TRIM(HICNAMES(JLI)) == 'IC_NH3' .OR. TRIM(HICNAMES(JLI)) == 'IC_HCL' &
+          .OR. HICNAMES(JLI)(1:4) == 'IC_A' .OR. HICNAMES(JLI)(1:4) == 'IC_B' &
+          .OR. NINDEXGI(JLI).EQ.0) THEN
+         ZSGRSVS(JL,JLI) = ZSGRSVS(JL,JLI) + XRETNA * ZZW2(JL,NINDEXWI(JLI))
+       ELSE IF (TRIM(HICNAMES(JLI)) == 'IC_H2O2' .OR. TRIM(HICNAMES(JLI)) == 'IC_HO2' &
+          .OR. TRIM(HICNAMES(JLI)) == 'IC_HONO' .OR. TRIM(HICNAMES(JLI)) == 'IC_HNO4'&
+          .OR. TRIM(HICNAMES(JLI)) == 'IC_HCHO' .OR. TRIM(HICNAMES(JLI)) == 'IC_ORA1'&
+          .OR. TRIM(HICNAMES(JLI)) == 'IC_ORA2') THEN
+         ZSGRSVS(JL,JLI) = ZSGRSVS(JL,JLI) + XRETHP * ZZW2(JL,NINDEXWI(JLI))
+         ZGRSVS(JL,NINDEXGI(JLI)) = ZGRSVS(JL,NINDEXGI(JLI)) +                        &
+                                   (1. - XRETHP) * ZZW2(JL,NINDEXWI(JLI))
+       ELSE IF (TRIM(HICNAMES(JLI)) == 'IC_SO2' .OR. TRIM(HICNAMES(JLI)) == 'IC_OH' &
+          .OR. TRIM(HICNAMES(JLI)) == 'IC_MO2' .OR. &
+               TRIM(HICNAMES(JLI)) == 'IC_OP1') THEN
+         ZSGRSVS(JL,JLI) = ZSGRSVS(JL,JLI) + XRETSU * ZZW2(JL,NINDEXWI(JLI))
+         ZGRSVS(JL,NINDEXGI(JLI)) = ZGRSVS(JL,NINDEXGI(JLI)) +                        &
+                                   (1. - XRETSU) * ZZW2(JL,NINDEXWI(JLI))
+       ELSE
+         ZSGRSVS(JL,JLI) = ZSGRSVS(JL,JLI) + XRETDF * ZZW2(JL,NINDEXWI(JLI))
+         ZGRSVS(JL,NINDEXGI(JLI)) = ZGRSVS(JL,NINDEXGI(JLI)) +                        &
+                                   (1. - XRETDF) * ZZW2(JL,NINDEXWI(JLI))
+       ENDIF
+     ENDDO
+     IF (ZRST(JL)>0.0) THEN
+       ZZW3(JL,:) = ZZW1(JL,6) * ZSGSVT(JL,:)/ZRST(JL)
+       ZZW3(JL,:) = MAX(MIN(ZZW3(JL,:),(ZSGSVT(JL,:)/PTSTEP)),0.0)
+       ZSGRSVS(JL,:) = ZSGRSVS(JL,:) - ZZW3(JL,:) !snow->rain
+       DO JLI = 1, SIZE(PSGRSVS,4)
+         ZRRSVS(JL,NINDEXWI(JLI)) = ZRRSVS(JL,NINDEXWI(JLI)) + ZZW3(JL,JLI)
+       ENDDO
+     ENDIF
+     ELSE
+       IF (.NOT.(OCH_RET_ICE)) THEN
+         DO JLW = 1, SIZE(PRRSVS,4)
+           IF (.NOT.(NINDEXWG(JLW).EQ.0)) THEN
+             ZGRSVS(JL,NINDEXWG(JLW)) = ZGRSVS(JL,NINDEXWG(JLW)) + ZZW2(JL,JLW)
+           ENDIF
+         ENDDO
+       ENDIF
+     ENDIF
+     ZZW4(JL,:) = ZZW1(JL,1) * ZCSVT(JL,:)/ZRCT(JL)
+     ZZW4(JL,:) = MAX(MIN(ZZW4(JL,:),(ZCSVT(JL,:)/PTSTEP)),0.0)
+     ZCRSVS(JL,:) = ZCRSVS(JL,:) - ZZW4(JL,:) !cloud->rain 
+     ZRRSVS(JL,:) = ZRRSVS(JL,:) + ZZW4(JL,:) 
+   ELSE IF ( (ZRGT(JL)>PRTMIN_AQ*1.e3/ZRHODREF(JL)) .AND.     &        ! dry case
+              ZZT(JL)<XTT .AND. ZRDRYG(JL)<ZRWETG(JL) .AND.  &
+              ZRDRYG(JL)>0.0 .AND. ZRCT(JL)>0.0 .AND. ZRRT(JL)>0.0) THEN
+     ZZW2(JL,:) = ZZW1(JL,1) * ZCSVT(JL,:)/ZRCT(JL)
+     ZZW2(JL,:) = MAX(MIN(ZZW2(JL,:),(ZCSVT(JL,:)/PTSTEP)),0.0)
+     ZZW4(JL,:) = ZZW1(JL,4) * ZRSVT(JL,:)/ZRRT(JL) 
+     ZZW4(JL,:) = MAX(MIN(ZZW4(JL,:),(ZRSVT(JL,:)/PTSTEP)),0.0)
+     ZCRSVS(JL,:) = ZCRSVS(JL,:) - ZZW2(JL,:) 
+     ZRRSVS(JL,:) = ZRRSVS(JL,:) - ZZW4(JL,:)
+     IF (OUSECHIC) THEN
+     DO JLI = 1, SIZE(PSGRSVS,4)
+       IF (TRIM(HICNAMES(JLI)) == 'IC_HNO3' .OR. TRIM(HICNAMES(JLI)) == 'IC_SULF' &
+          .OR. TRIM(HICNAMES(JLI)) == 'IC_H2SO4' &
+          .OR. TRIM(HICNAMES(JLI)) == 'IC_NH3' .OR. TRIM(HICNAMES(JLI)) == 'IC_HCL' &
+          .OR. HICNAMES(JLI)(1:4) == 'IC_A' .OR. HICNAMES(JLI)(1:4) == 'IC_B' &
+          .OR. NINDEXGI(JLI).EQ.0) THEN
+         ZSGRSVS(JL,JLI) = ZSGRSVS(JL,JLI) + XRETNA * (        &
+                           ZZW2(JL,NINDEXWI(JLI)) +  ZZW4(JL,NINDEXWI(JLI)) )
+       ELSE IF (TRIM(HICNAMES(JLI)) == 'IC_H2O2' .OR. TRIM(HICNAMES(JLI)) == 'IC_HO2' &
+          .OR. TRIM(HICNAMES(JLI)) == 'IC_HONO' .OR. TRIM(HICNAMES(JLI)) == 'IC_HNO4'&
+          .OR. TRIM(HICNAMES(JLI)) == 'IC_HCHO' .OR. TRIM(HICNAMES(JLI)) == 'IC_ORA1'&
+          .OR. TRIM(HICNAMES(JLI)) == 'IC_ORA2') THEN
+         ZSGRSVS(JL,JLI) = ZSGRSVS(JL,JLI) + XRETHP *  (       &
+                           ZZW2(JL,NINDEXWI(JLI)) +  ZZW4(JL,NINDEXWI(JLI)) )
+         ZGRSVS(JL,NINDEXGI(JLI)) = ZGRSVS(JL,NINDEXGI(JLI)) + (1. - XRETHP) * (  &
+                           ZZW2(JL,NINDEXWI(JLI)) +  ZZW4(JL,NINDEXWI(JLI)) )
+       ELSE IF (TRIM(HICNAMES(JLI)) == 'IC_SO2' .OR. TRIM(HICNAMES(JLI)) == 'IC_OH' &
+          .OR. TRIM(HICNAMES(JLI)) == 'IC_MO2' .OR. &
+               TRIM(HICNAMES(JLI)) == 'IC_OP1') THEN
+         ZSGRSVS(JL,JLI) = ZSGRSVS(JL,JLI) + XRETSU *  (       &
+                           ZZW2(JL,NINDEXWI(JLI)) +  ZZW4(JL,NINDEXWI(JLI)) )
+         ZGRSVS(JL,NINDEXGI(JLI)) = ZGRSVS(JL,NINDEXGI(JLI)) + (1. - XRETSU) * (  &
+                           ZZW2(JL,NINDEXWI(JLI)) +  ZZW4(JL,NINDEXWI(JLI)) )
+       ELSE
+         ZSGRSVS(JL,JLI) = ZSGRSVS(JL,JLI) + XRETDF *  (       &
+                           ZZW2(JL,NINDEXWI(JLI)) +  ZZW4(JL,NINDEXWI(JLI)) )
+         ZGRSVS(JL,NINDEXGI(JLI)) = ZGRSVS(JL,NINDEXGI(JLI)) + (1. - XRETDF) * (  &
+                           ZZW2(JL,NINDEXWI(JLI)) +  ZZW4(JL,NINDEXWI(JLI)) )
+       ENDIF
+     ENDDO
+     ELSE
+       IF (.NOT.(OCH_RET_ICE)) THEN
+         DO JLW = 1, SIZE(PRRSVS,4)
+           IF (.NOT.(NINDEXWG(JLW).EQ.0)) THEN
+             ZGRSVS(JL,NINDEXWG(JLW)) = ZGRSVS(JL,NINDEXWG(JLW)) + ZZW2(JL,JLW) &
+                                                              + ZZW4(JL,JLW)
+           ENDIF
+         ENDDO
+       ENDIF
+     ENDIF
+   ENDIF
+ ENDDO
+!
+!*       6.8    Melting of the graupel
+!
+ IF (OUSECHIC) THEN
+ ZZW(:) = 0.0
+ ZZW3(:,:) = 0.0
+ DO JL = 1,IMICRO
+   IF ( (ZRGT(JL)>PRTMIN_AQ*1.e3/ZRHODREF(JL)) .AND.  &
+        (ZZRGS(JL)>0.0) .AND. (ZZT(JL)>XTT) ) THEN
+     ZZW(JL) = ZRVT(JL)*ZPRES(JL)/((XMV/XMD)+ZRVT(JL)) ! Vapor pressure
+     ZZW(JL) = ZKA(JL)*(XTT-ZZT(JL)) +                                 &
+             ( ZDV(JL)*(XLVTT + ( XCPV - XCL ) * ( ZZT(JL) - XTT )) &
+                           *(XESTT-ZZW(JL))/(XRV*ZZT(JL))             )
+! compute RGMLTR
+     ZZW(JL)  = MIN( ZZRGS(JL), MAX( 0.0,( -ZZW(JL) *                     &
+                           ( X0DEPG*       ZLBDAG(JL)**XEX0DEPG +     &
+                             X1DEPG*ZCJ(JL)*ZLBDAG(JL)**XEX1DEPG ) -   &
+                                     ( ZZW1(JL,1)+ZZW1(JL,4) ) *       &
+                            ( ZRHODREF(JL)*XCL*(XTT-ZZT(JL))) ) /    &
+                                             ( ZRHODREF(JL)*XLMTT ) ) )
+     ZZW3(JL,:) = ZZW(JL) * ZSGSVT(JL,:)/ZRGT(JL)
+     ZZW3(JL,:) = MAX(MIN(ZZW3(JL,:),(ZSGSVT(JL,:)/PTSTEP)),0.0)
+     ZSGRSVS(JL,:) = ZSGRSVS(JL,:) - ZZW3(JL,:) !graupel->rain
+     DO JLI = 1, SIZE(PSGRSVS,4)
+       ZRRSVS(JL,NINDEXWI(JLI)) = ZRRSVS(JL,NINDEXWI(JLI)) + ZZW3(JL,JLI)
+     ENDDO
+   ENDIF
+ ENDDO
+ ENDIF
+!
+!
+!-------------------------------------------------------------------------------
+!
+!*       7.     UNPACK RESULTS AND DEALLOCATE ARRAYS
+!               ------------------------------------
+
+
+ DO JLC= 1, SIZE(PCRSVS,4)
+   ZCW(:,:,:) = ZZCRSVS(:,:,:,JLC)
+   ZZCRSVS(:,:,:,JLC) = UNPACK(ZCRSVS(:,JLC), MASK=GMICRO(:,:,:), FIELD=ZCW(:,:,:))
+   PCRSVS(:,:,:,JLC) = ZZCRSVS(:,:,:,JLC) * PRHODJ(:,:,:)
+ END DO
+ DO JLR= 1, SIZE(PRRSVS,4)
+   ZRW(:,:,:) = ZZRRSVS(:,:,:,JLR)
+   ZZRRSVS(:,:,:,JLR) = UNPACK(ZRRSVS(:,JLR), MASK=GMICRO(:,:,:), FIELD=ZRW(:,:,:))
+   PRRSVS(:,:,:,JLR) = ZZRRSVS(:,:,:,JLR) * PRHODJ(:,:,:)
+ END DO
+ IF (OUSECHIC) THEN
+   DO JLI= 1, SIZE(PSGRSVS,4)
+     ZSGW(:,:,:) = ZZSGRSVS(:,:,:,JLI)
+     ZZSGRSVS(:,:,:,JLI) = UNPACK(ZSGRSVS(:,JLI), MASK=GMICRO(:,:,:), FIELD=ZSGW(:,:,:))
+     PSGRSVS(:,:,:,JLI) = ZZSGRSVS(:,:,:,JLI) * PRHODJ(:,:,:)
+   END DO
+   DO JLG= 1, SIZE(PGRSVS,4)
+     ZGW(:,:,:) = ZZGRSVS(:,:,:,JLG)
+     ZZGRSVS(:,:,:,JLG) = UNPACK(ZGRSVS(:,JLG), MASK=GMICRO(:,:,:), FIELD=ZGW(:,:,:))
+     PGRSVS(:,:,:,JLG) = ZZGRSVS(:,:,:,JLG) * PRHODJ(:,:,:)
+   END DO
+   DEALLOCATE(ZGRSVS)
+   DEALLOCATE(ZSGRSVS)
+   DEALLOCATE(ZSGSVT)
+   DEALLOCATE(ZZW3)
+ ELSE
+   IF (.NOT.(OCH_RET_ICE)) THEN
+     DO JLG= 1, SIZE(PGRSVS,4)
+       ZGW(:,:,:) = ZZGRSVS(:,:,:,JLG)
+       ZZGRSVS(:,:,:,JLG) = UNPACK(ZGRSVS(:,JLG), MASK=GMICRO(:,:,:), FIELD=ZGW(:,:,:))
+       PGRSVS(:,:,:,JLG) = ZZGRSVS(:,:,:,JLG) * PRHODJ(:,:,:)
+     END DO
+     DEALLOCATE(ZGRSVS)
+   ENDIF
+ ENDIF
+
+  DEALLOCATE(ZRHODREF) 
+  DEALLOCATE(ZZT) 
+  DEALLOCATE(ZPRES) 
+  DEALLOCATE(ZKA) 
+  DEALLOCATE(ZDV) 
+  DEALLOCATE(ZCJ) 
+  DEALLOCATE(ZZW) 
+  DEALLOCATE(ZZW1) 
+  DEALLOCATE(ZZW2) 
+  DEALLOCATE(ZZW4)
+  DEALLOCATE(ZZRCS)
+  DEALLOCATE(ZZRRS)
+  DEALLOCATE(ZZRIS)
+  DEALLOCATE(ZZRSS)
+  DEALLOCATE(ZZRGS)
+  DEALLOCATE(ZCRSVS)
+  DEALLOCATE(ZRRSVS)
+  DEALLOCATE(ZRVT)
+  DEALLOCATE(ZRCT)
+  DEALLOCATE(ZRRT)
+  DEALLOCATE(ZRIT)
+  DEALLOCATE(ZRST)
+  DEALLOCATE(ZRGT)
+  DEALLOCATE(ZCIT)
+  DEALLOCATE(ZCSVT)
+  DEALLOCATE(ZRSVT)
+  DEALLOCATE(ZLBDAR)
+  DEALLOCATE(ZLBDAS)
+  DEALLOCATE(ZLBDAG)
+  DEALLOCATE(ZRDRYG)
+!
+END IF
+!
+!-------------------------------------------------------------------------------
+!
+END SUBROUTINE CH_AQUEOUS_TMICICE
diff --git a/src/PHYEX/ext/ch_meteo_trans_kess.f90 b/src/PHYEX/ext/ch_meteo_trans_kess.f90
new file mode 100644
index 0000000000000000000000000000000000000000..debd6ae61a8107d41da8ba5870e267cb73c5a0d1
--- /dev/null
+++ b/src/PHYEX/ext/ch_meteo_trans_kess.f90
@@ -0,0 +1,351 @@
+!MNH_LIC Copyright 1995-2019 CNRS, Meteo-France and Universite Paul Sabatier
+!MNH_LIC This is part of the Meso-NH software governed by the CeCILL-C licence
+!MNH_LIC version 1. See LICENSE, CeCILL-C_V1-en.txt and CeCILL-C_V1-fr.txt
+!MNH_LIC for details. version 1.
+!-----------------------------------------------------------------
+!!    ############################### 
+      MODULE MODI_CH_METEO_TRANS_KESS
+!!    ############################### 
+!!
+!
+INTERFACE
+!!
+SUBROUTINE CH_METEO_TRANS_KESS(KL, PRHODJ, PRHODREF, PRTSM, PTHT, PABST, &
+                               KVECNPT, KVECMASK, TPM, KDAY, KMONTH,     &
+                               KYEAR, PLAT, PLON, PLAT0, PLON0, OUSERV,  &
+                               OUSERC, OUSERR, KLUOUT, HCLOUD, PTSTEP    )
+!
+USE MODD_CH_M9_n, ONLY: METEOTRANSTYPE
+!
+IMPLICIT NONE
+REAL,                     INTENT(IN), OPTIONAL    :: PTSTEP  !timestep
+CHARACTER (LEN=4),        INTENT(IN)    :: HCLOUD  ! Cloud parameterization
+REAL, DIMENSION(:,:,:),   INTENT(IN)    :: PRHODJ  ! Dry density * Jacobian
+REAL, DIMENSION(:,:,:),   INTENT(IN)    :: PRHODREF    ! air density
+REAL, DIMENSION(:,:,:,:), INTENT(IN)    :: PRTSM  ! moist variables at t or t-dt or water m.r. source
+REAL, DIMENSION(:,:,:),   INTENT(IN)    :: PTHT, PABST ! theta and pressure at t
+INTEGER, DIMENSION(:,:),  INTENT(IN)    :: KVECMASK
+!
+TYPE(METEOTRANSTYPE), DIMENSION(:), INTENT(INOUT) :: TPM
+                                                   ! meteo variable for CCS
+INTEGER,                  INTENT(IN)    :: KYEAR       ! Current Year
+INTEGER,                  INTENT(IN)    :: KMONTH      ! Current Month
+INTEGER,                  INTENT(IN)    :: KDAY        ! Current Day
+INTEGER,                  INTENT(IN)    :: KLUOUT     ! channel for output listing
+INTEGER,                  INTENT(IN)    :: KL, KVECNPT
+REAL, DIMENSION(:,:),     INTENT(IN)    :: PLAT, PLON
+REAL,                     INTENT(IN)    :: PLAT0, PLON0
+LOGICAL,                  INTENT(IN)    :: OUSERV, OUSERC, OUSERR
+END SUBROUTINE CH_METEO_TRANS_KESS
+!!
+END INTERFACE
+!!
+END MODULE MODI_CH_METEO_TRANS_KESS
+!!
+!!    ####################################################################
+SUBROUTINE CH_METEO_TRANS_KESS(KL, PRHODJ, PRHODREF, PRTSM, PTHT, PABST, &
+                               KVECNPT, KVECMASK, TPM, KDAY, KMONTH,     &
+                               KYEAR, PLAT, PLON, PLAT0, PLON0, OUSERV,  &
+                               OUSERC, OUSERR, KLUOUT, HCLOUD, PTSTEP    )
+!!    ####################################################################
+!!
+!!*** *CH_METEO_TRANS_KESS*
+!!
+!!    PURPOSE
+!!    -------
+!     Transfer of meteorological data, such as temperature, pressure
+!     and water vapor mixing ratio for one point into the variable TPM(JM+1)
+!     here LWC, LWR and mean radius computed from Kessler or ICEx schemes
+!!
+!!    METHOD
+!!    ------
+!!    For the given grid-point KI,KJ,KK, the meteorological parameters
+!!    will be transfered for use by CH_SET_RATES and CH_SET_PHOTO_RATES.
+!!    Presently, the variables altitude, air density, temperature,
+!!    water vapor mixing ratio, cloud water, longitude, latitude and date
+!!    will be transfered. In the chemical definition file (.chf)
+!!    these variables have to be transfered into variables like O2, H2O etc.
+!!    Also, consistency is checked between the number of
+!!    variables expected by the CCS (as defined in the .chf file) and
+!!    the number of variables to be transfered here. If you change
+!!    the meaning of XMETEOVARS in your .chf file, make sure to modify
+!!    this subroutine accordingly.
+!!      If the model is run in 1D mode, the model level instead of altitude
+!!    is passed. In 2D and 3D, altitude is passed with a negative sign
+!!    so that the radiation scheme TUV can make the difference between
+!!    model levels and altitude.
+!!
+!!    AUTHOR
+!!    ------
+!!    K. Suhre    *Laboratoire d'Aerologie*
+!!
+!!    MODIFICATIONS
+!!    -------------
+!!    Original 24/05/95
+!!    04/08/96 (K. Suhre) restructured
+!!    21/02/97 (K. Suhre) add XLAT0 and XLON0 for LCARTESIAN=T case
+!!    27/08/98 (P. Tulet) add temperature at t for kinetic coefficient
+!!    09/03/99 (V. Crassier & K. Suhre) vectorization
+!!    09/03/99 (K. Suhre) modification for TUV
+!!    09/03/99 (C. Mari & J. Escobar) Code optimization 
+!!    01/12/03 (D. Gazen)   change Chemical scheme interface
+!!    01/12/03 (D. Gazen)   change Chemical scheme interface
+!!    01/12/04 (P. Tulet)   update ch_meteo_transn.f90 for Arome
+!!    01/12/07 (M. Leriche) include rain
+!!    14/05/08 (M. Leriche) include raindrops and cloud droplets mean radius
+!!    05/06/08 (M. Leriche) calculate LWC and LWR in coherence with time spliting scheme
+!!    05/11/08 (M. Leriche) split in two routines for 1-moment and 2-moment cloud schemes
+!  P. Wautelet 10/04/2019: replace ABORT and STOP calls by Print_msg
+!  P. Wautelet 26/04/2019: replace non-standard FLOAT function by REAL function
+!!
+!!    EXTERNAL
+!!    --------
+!!    GAMMA    :  gamma function
+!!
+!!    IMPLICIT ARGUMENTS
+!!    ------------------
+!!
+!!
+USE MODD_CH_M9_n,     ONLY: NMETEOVARS,    & ! number of meteorological variables
+                            METEOTRANSTYPE   !type for meteo . transfer
+!!
+USE MODD_CST,         ONLY: XP00,          & ! Surface pressure
+                          XRD,             & ! R gas constant
+                          XCPD,            & !specific heat for dry air
+                          XPI,             & !pie
+                          XRHOLW             !density of water
+!!
+USE MODD_CONF,        ONLY: LCARTESIAN     ! Logical for cartesian geometry
+!!
+USE MODD_RAIN_ICE_DESCR_n,  ONLY: XNUC, XALPHAC,  & !Cloud droplets distrib. param.
+                                XRTMIN,         & ! min values of the water m. r.
+                                XLBC,  XLBEXC,  & !shape param. of the cloud droplets
+                                XLBR,  XLBEXR,  & !shape param. of the raindrops
+                                XCONC_LAND
+!!
+use mode_msg
+
+USE MODI_GAMMA
+!
+!-------------------------------------------------------------------------------
+!
+!*       0.     DECLARATIONS
+!               ------------
+IMPLICIT NONE
+!
+!*      0.1    declarations of arguments
+!
+REAL,                     INTENT(IN), OPTIONAL    :: PTSTEP  ! Double timestep
+CHARACTER (LEN=4),        INTENT(IN)    :: HCLOUD  ! Cloud parameterization
+REAL, DIMENSION(:,:,:),   INTENT(IN)    :: PRHODJ  ! Dry density * Jacobian
+REAL, DIMENSION(:,:,:),   INTENT(IN)    :: PRHODREF    ! air density
+REAL, DIMENSION(:,:,:,:), INTENT(IN)    :: PRTSM  ! moist variables at t or t-dt or water m.r. source
+REAL, DIMENSION(:,:,:),   INTENT(IN)    :: PTHT, PABST ! theta and pressure at t
+INTEGER, DIMENSION(:,:),  INTENT(IN)    :: KVECMASK
+!
+TYPE(METEOTRANSTYPE), DIMENSION(:), INTENT(INOUT) :: TPM
+                                                   ! meteo variable for CCS
+INTEGER,                  INTENT(IN)    :: KYEAR       ! Current Year
+INTEGER,                  INTENT(IN)    :: KMONTH      ! Current Month
+INTEGER,                  INTENT(IN)    :: KDAY        ! Current Day
+INTEGER,                  INTENT(IN)    :: KLUOUT     ! channel for output listing
+INTEGER,                  INTENT(IN)    :: KL, KVECNPT
+REAL, DIMENSION(:,:),     INTENT(IN)    :: PLAT, PLON
+REAL,                     INTENT(IN)    :: PLAT0, PLON0
+LOGICAL,                  INTENT(IN)    :: OUSERV, OUSERC, OUSERR
+!
+!*      0.2    declarations of local variables
+!
+REAL,DIMENSION(SIZE(PRTSM,1),SIZE(PRTSM,2),SIZE(PRTSM,3),3) :: ZRTSM
+REAL,DIMENSION(SIZE(PRTSM,1),SIZE(PRTSM,2))                 :: ZLAT, ZLON
+REAL,DIMENSION(SIZE(PRTSM,1),SIZE(PRTSM,2),SIZE(PRTSM,3))   :: ZRAYC, ZWLBDC, &
+                                                               ZWLBDC3, ZCONC
+REAL,DIMENSION(SIZE(PRTSM,1),SIZE(PRTSM,2),SIZE(PRTSM,3))   :: ZRAYR, ZWLBDR, ZWLBDR3
+LOGICAL, SAVE :: GSFIRSTCALL = .TRUE.
+INTEGER :: JI,JJ,JK,JM
+INTEGER :: IDTI,IDTJ,IDTK
+!
+!
+!-------------------------------------------------------------------------------
+!
+!*       1.    INITIALIZE METEO VARIABLE TRANSFER
+!              ----------------------------------
+!
+firstcall : IF (GSFIRSTCALL) THEN
+!
+  GSFIRSTCALL = .FALSE.
+!
+!*       1.1   check if number of variables NMETEOVARS
+!              corresponds to what the CCS expects
+!
+  IF (NMETEOVARS /= 13) THEN
+    WRITE(KLUOUT,*) "CH_METEO_TRANS ERROR: number of meteovars to transfer"
+    WRITE(KLUOUT,*) "does not correspond to the number expected by the CCS:"
+    WRITE(KLUOUT,*) "     meteovars to transfer: ", 13
+    WRITE(KLUOUT,*) "     NMETEOVARS expected:   ", NMETEOVARS
+    WRITE(KLUOUT,*) "Check the definition of NMETEOVARS in your .chf file."
+    WRITE(KLUOUT,*) "The program will be stopped now!"
+    call Print_msg( NVERB_FATAL, 'GEN', 'CH_METEO_TRANS_KESS', &
+                    'number of meteovars to transfer does not correspond to the expected number.' )
+  END IF
+!
+!*       1.2   initialize names of meteo vars
+!
+  TPM(:)%CMETEOVAR(1) = "Model level"
+  TPM(:)%CMETEOVAR(2) = "Air density  (kg/m3)"
+  TPM(:)%CMETEOVAR(3) = "Temperature  (K)"
+  TPM(:)%CMETEOVAR(4) = "Water vapor  (kg/kg)"
+  TPM(:)%CMETEOVAR(5) = "Cloud water  (kg/kg)"
+  TPM(:)%CMETEOVAR(6) = "Latitude     (rad)"
+  TPM(:)%CMETEOVAR(7) = "Longitude    (rad)"
+  TPM(:)%CMETEOVAR(8) = "Current date (year)"
+  TPM(:)%CMETEOVAR(9) = "Current date (month)"
+  TPM(:)%CMETEOVAR(10)= "Current date (day)"
+  TPM(:)%CMETEOVAR(11)= "Rain water   (kg/kg)"
+  TPM(:)%CMETEOVAR(12)= "Mean cloud droplets radius (m)"
+  TPM(:)%CMETEOVAR(13)= "Mean raindrops radius      (m)"
+!
+ENDIF firstcall
+!
+! "Water vapor (kg/kg)"
+!
+IF (OUSERV) THEN
+! if split option, use tendency
+  IF (PRESENT(PTSTEP)) THEN
+    ZRTSM(:,:,:,1) = (PRTSM(:,:,:, 1)/ PRHODJ(:,:,:))*PTSTEP
+  ELSE
+    ZRTSM(:,:,:,1) = PRTSM(:,:,:, 1)
+  ENDIF
+ELSE
+  ZRTSM(:,:,:,1) = 0.0
+ENDIF
+!
+! "Cloud water (kg/kg)" and  "Mean cloud droplets radius (m)"
+!
+IF (OUSERC) THEN
+  IF (PRESENT(PTSTEP)) THEN    
+    ZRTSM(:,:,:,2) = (PRTSM(:,:,:, 2)/ PRHODJ(:,:,:))*PTSTEP
+  ELSE
+    ZRTSM(:,:,:,2) = PRTSM(:,:,:, 2)
+  ENDIF
+  ZRAYC(:,:,:) = 10.e-6 ! avoid division by zero
+  SELECT CASE (HCLOUD)
+  CASE ('KESS')
+    WHERE (ZRTSM(:,:,:, 2)>1.e-20) !default value for Kessler
+      ZRAYC(:,:,:) = 10.e-6 ! assume a cloud droplet radius of 10 µm
+    ENDWHERE
+  CASE ('ICE3','ICE4')
+    WHERE (ZRTSM(:,:,:, 2)>XRTMIN(2))
+      ZCONC(:,:,:) = XCONC_LAND
+      ZWLBDC3(:,:,:) = XLBC(1) * ZCONC(:,:,:) / (PRHODREF(:,:,:) * ZRTSM(:,:,:, 2))
+      ZWLBDC(:,:,:)  = ZWLBDC3(:,:,:)**XLBEXC
+      ZRAYC(:,:,:) = 0.5*GAMMA(XNUC+1./XALPHAC)/(GAMMA(XNUC)*ZWLBDC(:,:,:))
+!      ZRAYC(:,:,:) = 10.e-6 ! assume a cloud droplet radius of 10 µm
+    ENDWHERE
+  END SELECT
+ELSE
+  ZRTSM(:,:,:,2) = 0.0
+  ZRAYC(:,:,:) = 10.e-6 ! avoid division by zero
+ENDIF
+!
+! "Rain water (kg/kg)" and "Mean raindrops radius (m)"
+!
+IF (OUSERR) THEN
+  IF (PRESENT(PTSTEP)) THEN
+    ZRTSM(:,:,:,3) = (PRTSM(:,:,:, 3)/ PRHODJ(:,:,:))*PTSTEP
+  ELSE
+    ZRTSM(:,:,:,3) = PRTSM(:,:,:, 3)
+  ENDIF
+  ZRAYR(:,:,:) = 500.e-6 ! avoid division by zero
+  SELECT CASE (HCLOUD)
+  CASE ('KESS')
+    WHERE (ZRTSM(:,:,:, 3)>1.e-20) !default value for Kessler
+      ZRAYR(:,:,:) = 0.5*((XPI*XRHOLW*1.E7)/ &
+                     (PRHODREF(:,:,:)*ZRTSM(:,:,:,3)))**(-1./4.)
+    ENDWHERE
+  CASE ('ICE3','ICE4')
+    WHERE (ZRTSM(:,:,:, 3)>XRTMIN(3))
+      ZRAYR(:,:,:) = 0.5*(1./(XLBR*(PRHODREF(:,:,:)*ZRTSM(:,:,:,3))**XLBEXR))
+    ENDWHERE
+  END SELECT
+ELSE
+  ZRTSM(:,:,:,3) = 0.0
+  ZRAYR(:,:,:) = 500.e-6 ! avoid division by zero
+ENDIF
+
+IF(LCARTESIAN) THEN
+!  "Latitude (rad)"
+  ZLAT(:,:) = PLAT0
+!  "Longitude (rad)"
+  ZLON(:,:) = PLON0
+ELSE
+!  "Latitude (rad)"
+  ZLAT(:,:) = PLAT(:,:)
+!  "Longitude (rad)"
+  ZLON(:,:) = PLON(:,:)
+END IF
+!!
+!*       2.    TRANSFER METEO VARIABLES
+!              ------------------------
+!
+IDTI=KVECMASK(2,KL)-KVECMASK(1,KL)+1
+IDTJ=KVECMASK(4,KL)-KVECMASK(3,KL)+1
+IDTK=KVECMASK(6,KL)-KVECMASK(5,KL)+1
+!Vectorization:
+!ocl novrec
+!cdir nodep
+DO JM=0,KVECNPT-1
+  JI=JM-IDTI*(JM/IDTI)+KVECMASK(1,KL)
+  JJ=JM/IDTI-IDTJ*(JM/(IDTI*IDTJ))+KVECMASK(3,KL)
+  JK=JM/(IDTI*IDTJ)-IDTK*(JM/(IDTI*IDTJ*IDTK))+KVECMASK(5,KL)
+!
+!"Model Altitude"
+!
+  TPM(JM+1)%XMETEOVAR(1) = JK-1 ! assuming first model level is level 2
+!   TPM(JM+1)%XMETEOVAR(1) = JK ! assuming first model level is level 1
+!
+! "Air density (kg/m3)"
+!
+  TPM(JM+1)%XMETEOVAR(2) = PRHODREF(JI, JJ, JK)
+!
+! "Temperature (K)"
+!
+  TPM(JM+1)%XMETEOVAR(3) = PTHT(JI,JJ,JK)*((PABST(JI,JJ,JK)/XP00)**(XRD/XCPD))
+!
+! "Water vapor (kg/kg)"
+!
+  TPM(JM+1)%XMETEOVAR(4) = ZRTSM(JI, JJ, JK, 1)
+!
+! "Cloud water (kg/kg)"
+!
+  TPM(JM+1)%XMETEOVAR(5) = ZRTSM(JI, JJ, JK, 2)
+!
+!  "Latitude (rad)"
+!
+  TPM(JM+1)%XMETEOVAR(6) = ZLAT(JI, JJ)
+!
+!  "Longitude (rad)"
+!
+  TPM(JM+1)%XMETEOVAR(7) = ZLON(JI, JJ)
+!
+!  "Current date"
+!
+  TPM(JM+1)%XMETEOVAR(8) = REAL(KYEAR)
+  TPM(JM+1)%XMETEOVAR(9) = REAL(KMONTH)
+  TPM(JM+1)%XMETEOVAR(10)= REAL(KDAY)
+!
+! "Rain water (kg/kg)"
+!
+  TPM(JM+1)%XMETEOVAR(11) = ZRTSM(JI, JJ, JK, 3)
+!
+! "Mean cloud droplets radius (m)"
+!
+  TPM(JM+1)%XMETEOVAR(12) = ZRAYC(JI, JJ, JK)
+!
+! "Mean raindrops radius (m)"
+!
+  TPM(JM+1)%XMETEOVAR(13) = ZRAYR(JI, JJ, JK)
+!
+ENDDO
+!
+END SUBROUTINE CH_METEO_TRANS_KESS
diff --git a/src/PHYEX/ext/cphase_profile.f90 b/src/PHYEX/ext/cphase_profile.f90
new file mode 100644
index 0000000000000000000000000000000000000000..f403e5447f35bf807c2a92cf68c92885ae3d71d8
--- /dev/null
+++ b/src/PHYEX/ext/cphase_profile.f90
@@ -0,0 +1,140 @@
+!MNH_LIC Copyright 1994-2014 CNRS, Meteo-France and Universite Paul Sabatier
+!MNH_LIC This is part of the Meso-NH software governed by the CeCILL-C licence
+!MNH_LIC version 1. See LICENSE, CeCILL-C_V1-en.txt and CeCILL-C_V1-fr.txt  
+!MNH_LIC for details. version 1.
+!#########################
+MODULE MODI_CPHASE_PROFILE
+!#########################
+!
+INTERFACE
+!
+      SUBROUTINE CPHASE_PROFILE (PZHAT,PCPHASE,PCPHASE_PBL,PCPHASE_PROFILE,PTKEM)
+! 
+REAL, DIMENSION(:)              ,  INTENT(IN)  :: PZHAT       ! height level without orography
+REAL                            ,  INTENT(IN)  :: PCPHASE     ! prescribed phase velocity
+REAL                            ,  INTENT(IN)  :: PCPHASE_PBL ! prescribed phase velocity
+REAL, DIMENSION(:,:)            ,  INTENT(OUT) :: PCPHASE_PROFILE ! profile of Cphase speed
+REAL, DIMENSION(:,:),OPTIONAL   ,  INTENT(IN)  :: PTKEM ! TKE at t-dt
+!
+END SUBROUTINE CPHASE_PROFILE
+!
+END INTERFACE
+!
+END MODULE MODI_CPHASE_PROFILE
+!
+!     ##########################################################################
+      SUBROUTINE CPHASE_PROFILE (PZHAT,PCPHASE,PCPHASE_PBL,PCPHASE_PROFILE,PTKEM)
+!     ##########################################################################
+!
+!!****  *CPHASE_PROFILE* - defines a non-constant vertical profile for Cphase
+!!                         velocity
+!!
+!!    PURPOSE
+!!    -------
+!
+!!**  METHOD
+!!    ------
+!!   
+!!        
+!!    REFERENCE
+!!    ---------
+!!
+!!    AUTHOR
+!!    ------
+!!	V. Masson & C. Lac     * Meteo France *
+!!
+!!    MODIFICATIONS
+!!    -------------
+!!      Original    08/2010
+!!      Escobar     9/11/2010 : array bound problem if NO Turb =>  PTKEM optional 
+!!      C.Lac       06/2013   : correction and introduction of PCPHASE_PBL
+!!      
+!-------------------------------------------------------------------------------
+!
+!*       0.    DECLARATIONS
+!              ------------
+!
+USE MODD_TURB_n, ONLY: XTKEMIN
+USE MODD_PARAMETERS
+!
+IMPLICIT NONE
+!
+!
+!*       0.1   declarations of arguments
+! 
+! 
+! 
+REAL, DIMENSION(:)              ,  INTENT(IN)  :: PZHAT       ! height level without orography
+REAL                            ,  INTENT(IN)  :: PCPHASE     ! prescribed phase velocity
+REAL                            ,  INTENT(IN)  :: PCPHASE_PBL ! prescribed phase velocity
+REAL, DIMENSION(:,:)            ,  INTENT(OUT) :: PCPHASE_PROFILE ! profile of Cphase speed
+REAL, DIMENSION(:,:),OPTIONAL   ,  INTENT(IN)  :: PTKEM ! TKE at t-dt
+!
+!*       0.2   declarations of local variables
+!
+INTEGER             :: IKB       ! indice K Beginning in z direction 
+INTEGER             :: IKE       ! indice K End       in z direction 
+! 
+REAL, DIMENSION(SIZE(PCPHASE_PROFILE,1)) :: ZTKE, ZTKEMIN           
+INTEGER                                  :: JL,JK,JKTKE
+!
+!-------------------------------------------------------------------------------
+!
+!*       1.    PROLOGUE
+!              --------
+!
+!*       1.1  Compute dimensions of arrays and other indices
+! 
+IKB = 1 + JPVEXT
+IKE = SIZE(PCPHASE_PROFILE,2) - JPVEXT
+!
+!
+!*       1.2  Initializations
+!
+!
+PCPHASE_PROFILE   = 0.0
+ZTKEMIN           = PZHAT(IKE)
+ZTKE              = PZHAT(IKE-1)
+!-------------------------------------------------------------------------------
+!-------------------------------------------------------------------------------
+!
+    IF (PRESENT(PTKEM)) THEN
+!
+     DO JL = 1,SIZE(PCPHASE_PROFILE,1)
+      JKTKE=IKE-1
+      DO JK = IKB, IKE-1 
+       IF (PTKEM(JL,JK) < 5.*XTKEMIN ) THEN
+           ZTKE (JL) = PZHAT (JK)
+           JKTKE = JK
+           EXIT
+        END IF
+      END DO
+      DO JK = JKTKE+1,IKE
+       IF (PTKEM(JL,JK) == XTKEMIN ) THEN
+           ZTKEMIN (JL) = PZHAT (JK)
+           EXIT
+        END IF
+      END DO
+     END DO
+!
+    ELSE 
+      ZTKE (:) = 1000.
+      ZTKEMIN (:) = 2000.
+    END IF
+!
+    DO JL = 1,SIZE(PCPHASE_PROFILE,1)
+     DO JK = IKB, IKE
+      IF (PZHAT(JK) > ZTKEMIN (JL) ) THEN
+        PCPHASE_PROFILE(JL,JK) = PCPHASE
+      ELSE IF  (PZHAT(JK) < ZTKE (JL) ) THEN
+        PCPHASE_PROFILE(JL,JK) = PCPHASE_PBL
+      ELSE 
+        PCPHASE_PROFILE(JL,JK) = 1./(ZTKEMIN (JL) - ZTKE (JL)) * &
+         ((PZHAT(JK) - ZTKE(JL)) * PCPHASE + (ZTKEMIN (JL) - PZHAT(JK)) * PCPHASE_PBL )
+      END IF
+     END DO
+    END DO
+!
+!-------------------------------------------------------------------------------
+!
+END SUBROUTINE CPHASE_PROFILE
diff --git a/src/PHYEX/ext/deallocate_model1.f90 b/src/PHYEX/ext/deallocate_model1.f90
new file mode 100644
index 0000000000000000000000000000000000000000..8b8f572144596c81b071b80cc4352ff347790191
--- /dev/null
+++ b/src/PHYEX/ext/deallocate_model1.f90
@@ -0,0 +1,705 @@
+!MNH_LIC Copyright 1997-2023 CNRS, Meteo-France and Universite Paul Sabatier
+!MNH_LIC This is part of the Meso-NH software governed by the CeCILL-C licence
+!MNH_LIC version 1. See LICENSE, CeCILL-C_V1-en.txt and CeCILL-C_V1-fr.txt
+!MNH_LIC for details. version 1.
+!-----------------------------------------------------------------
+!############################
+MODULE MODI_DEALLOCATE_MODEL1
+!############################
+!
+INTERFACE
+!
+SUBROUTINE DEALLOCATE_MODEL1 (KCALL)
+!
+INTEGER, INTENT(IN) :: KCALL
+!
+END SUBROUTINE DEALLOCATE_MODEL1
+!
+END INTERFACE 
+!
+END MODULE MODI_DEALLOCATE_MODEL1
+!
+!
+!     ####################################
+      SUBROUTINE DEALLOCATE_MODEL1 (KCALL)
+!     ####################################
+!
+!!****  *DEALLOCATE_MODEL1* - deallocate all model1 fields
+!!
+!!    PURPOSE
+!!    -------
+!       deallocate all model #1 fields in order to spare memory in spawning
+!
+!!**  METHOD
+!!    ------
+!!   
+!!    KCALL = 1   --> deallocates all SOURCES, LES, FORCING and SOLVER variables
+!!
+!!    KCALL = 2   --> deallocates all METRIC, RADIATION and CORIOLIS variables
+!!
+!!    KCALL = 3   --> deallocates all other variables of model1
+!!
+!!    KCALL = 4   --> deallocates all variables common to ALL models
+!!
+!!    1 + 2         --> all variables used in spawning
+!!    1 + 2 + 3 + 4 --> in diag after a file has been treated
+!!
+!!    EXTERNAL
+!!    --------
+!!
+!!    REFERENCE
+!!    ---------
+!!      
+!!
+!!    AUTHOR
+!!    ------
+!!  	V. Masson       * Meteo France *
+!!
+!!    MODIFICATIONS
+!!    -------------
+!!      Original     08/12/97
+!!
+!!                   20/05/98  use the LB fields
+!!                   15/03/99 new PGD fields
+!!                   08/03/01 D.Gazen add chemical emission field
+!!                   01/2004 V. Masson surface externalization
+!!                   06/2012 M.Tomasini add 2D nesting ADVFRC
+!!                   10/2016 M.Mazoyer New KHKO output fields
+!  P. Wautelet 05/2016-04/2018: new data structures and calls for I/O
+!  C. Lac         02/2019: add rain fraction as an output field
+!  P. Wautelet 07/06/2019: bugfix: deallocate XLSRVM only if allocated
+!  S. Riette      04/2020: XHL* fields
+!  A. Costes      12:2021: Blaze Fire model variables
+!-------------------------------------------------------------------------------
+!
+!*       0.    DECLARATIONS
+!              ------------
+USE MODD_REF
+!
+USE MODD_METRICS_n
+USE MODD_FIELD_n
+USE MODD_FIRE_n
+USE MODD_DUMMY_GR_FIELD_n
+USE MODD_LSFIELD_n
+USE MODD_GRID_n
+USE MODD_REF_n
+USE MODD_CURVCOR_n
+USE MODD_DYN_n
+USE MODD_DEEP_CONVECTION_n
+USE MODD_RADIATIONS_n
+USE MODD_FRC
+USE MODD_PRECIP_n
+USE MODD_ELEC_n
+USE MODD_PASPOL_n
+USE MODD_RAIN_ICE_PARAM_n
+USE MODD_RAIN_ICE_DESCR_n
+USE MODD_PARAM_n , ONLY : CCLOUD
+USE MODE_MODELN_HANDLER
+!
+! Modif 2D
+USE MODD_LATZ_EDFLX                      ! For ADVFRC and EDDY FLUXES
+USE MODD_DEF_EDDY_FLUX_n           ! For EDDY FLUXES
+USE MODD_DEF_EDDYUV_FLUX_n         ! For EDDY FLUXES
+!
+USE MODD_2D_FRC
+USE MODD_ADVFRC_n                  ! For ADVFRC and EDDY FLUXES
+USE MODD_RELFRC_n
+USE MODD_ADV_n
+USE MODD_PAST_FIELD_n
+USE MODD_TURB_n
+USE MODD_PARAM_C2R2, ONLY :LSUPSAT
+!
+IMPLICIT NONE
+!
+!*       0.1   declarations of arguments
+!
+INTEGER, INTENT(IN) :: KCALL ! number of times this routine has been called
+INTEGER :: IMI ! Current Model index
+!
+!*       0.2   declarations of local variables
+!
+!-------------------------------------------------------------------------------
+!
+! Save current Model index and switch to model 1 variables
+IMI = GET_CURRENT_MODEL_INDEX()
+CALL GOTO_MODEL(1)
+!*       1.    Module MODD_FIELD$n
+!
+IF ( KCALL==3 ) THEN
+  IF (CUVW_ADV_SCHEME(1:3)=='CEN'.AND. CTEMP_SCHEME=='LEFR') THEN
+    DEALLOCATE(XUM)
+    DEALLOCATE(XVM)
+    DEALLOCATE(XWM)
+    DEALLOCATE(XDUM)
+    DEALLOCATE(XDVM)
+    DEALLOCATE(XDWM)
+  END IF
+  DEALLOCATE(XUT)
+  DEALLOCATE(XVT)
+  DEALLOCATE(XWT)
+  DEALLOCATE(XTHT)
+  IF (L2D_ADV_FRC) THEN
+    IF (ASSOCIATED(XDTHFRC)) DEALLOCATE(XDTHFRC)
+    IF (ASSOCIATED(XDRVFRC)) DEALLOCATE(XDRVFRC)
+    IF (ASSOCIATED(TDTADVFRC)) DEALLOCATE(TDTADVFRC)
+  END IF
+    IF (L2D_REL_FRC) THEN
+    IF (ASSOCIATED(XTHREL)) DEALLOCATE(XTHREL)
+    IF (ASSOCIATED(XRVREL)) DEALLOCATE(XRVREL)
+    IF (ASSOCIATED(TDTRELFRC)) DEALLOCATE(TDTRELFRC)
+  END IF
+  ! DEALLOCATE EDDY FLUXES 
+  IF (LTH_FLX) THEN
+    DEALLOCATE(XVTH_FLUX_M)
+    DEALLOCATE(XWTH_FLUX_M)
+  END IF
+  IF (LUV_FLX) THEN
+    DEALLOCATE(XVU_FLUX_M)
+  END IF
+END IF
+IF ( KCALL==1 ) THEN
+  DEALLOCATE(XRUS)
+  DEALLOCATE(XRVS)
+  DEALLOCATE(XRWS)
+  DEALLOCATE(XRTHS)
+  DEALLOCATE(XRUS_PRES, XRVS_PRES, XRWS_PRES )                
+  DEALLOCATE(XRTHS_CLD )
+END IF
+!
+IF ( KCALL==3 ) THEN
+  IF (ASSOCIATED(XTKET)) DEALLOCATE(XTKET)
+END IF
+IF ( ASSOCIATED(XRTKES) .AND. KCALL==1 ) THEN
+  DEALLOCATE(XRTKES)
+END IF
+!
+IF ( KCALL==3 ) THEN
+  DEALLOCATE(XPABST)
+!
+  DEALLOCATE(XRT)
+END IF
+!
+IF ( KCALL==1 ) THEN
+  DEALLOCATE(XRRS)
+  DEALLOCATE(XRRS_CLD)
+END IF
+!
+IF ( ASSOCIATED(XSRCT) .AND. KCALL==3 ) THEN
+  DEALLOCATE(XSRCT)
+  DEALLOCATE(XSIGS)
+END IF   
+!
+IF ( ASSOCIATED(XHLC_HRC) .AND. KCALL==3 ) THEN
+  DEALLOCATE(XHLC_HRC)
+  DEALLOCATE(XHLC_HCF)
+  DEALLOCATE(XHLI_HRI)
+  DEALLOCATE(XHLI_HCF)
+END IF
+!
+IF ( ASSOCIATED(XCLDFR) .AND. KCALL==2 ) THEN
+  DEALLOCATE(XCLDFR)
+END IF   
+!
+IF ( ASSOCIATED(XICEFR) .AND. KCALL==2 ) THEN
+  DEALLOCATE(XICEFR)
+END IF   
+!
+IF ( ASSOCIATED(XRAINFR) .AND. KCALL==2 ) THEN
+  DEALLOCATE(XRAINFR)
+END IF   
+!
+IF ( KCALL == 3 ) THEN
+  DEALLOCATE(XSVT)
+END IF
+IF ( KCALL == 1 ) THEN
+  DEALLOCATE(XRSVS)
+  DEALLOCATE(XRSVS_CLD)
+END IF
+!
+IF ((CCLOUD == 'KHKO') .AND. LSUPSAT)  THEN
+    DEALLOCATE(XSUPSAT)
+    DEALLOCATE(XNACT)
+    DEALLOCATE(XNPRO)
+    DEALLOCATE(XSSPRO)
+END IF
+!
+IF (ASSOCIATED(XDUMMY_GR_FIELDS) .AND. KCALL==3 ) THEN
+  DEALLOCATE(XDUMMY_GR_FIELDS)
+END IF
+
+IF (ASSOCIATED(XLSPHI)) THEN
+  DEALLOCATE(XLSPHI)
+END IF
+
+IF (ASSOCIATED(XBMAP)) THEN
+  DEALLOCATE(XBMAP)
+END IF
+
+IF (ASSOCIATED(XFMRFA)) THEN
+  DEALLOCATE(XFMRFA)
+END IF
+
+IF (ASSOCIATED(XFMWF0)) THEN
+  DEALLOCATE(XFMWF0)
+END IF
+
+IF (ASSOCIATED(XFMR0)) THEN
+  DEALLOCATE(XFMR0)
+END IF
+
+IF (ASSOCIATED(XFMR00)) THEN
+  DEALLOCATE(XFMR00)
+END IF
+
+IF (ASSOCIATED(XFMIGNITION)) THEN
+  DEALLOCATE(XFMIGNITION)
+END IF
+
+IF (ASSOCIATED(XFMFUELTYPE)) THEN
+  DEALLOCATE(XFMFUELTYPE)
+END IF
+
+IF (ASSOCIATED(XFIRETAU)) THEN
+  DEALLOCATE(XFIRETAU)
+END IF
+
+IF (ASSOCIATED(XFLUXPARAMH)) THEN
+  DEALLOCATE(XFLUXPARAMH)
+END IF
+
+IF (ASSOCIATED(XFLUXPARAMW)) THEN
+  DEALLOCATE(XFLUXPARAMW)
+END IF
+
+IF (ASSOCIATED(XFIRERW)) THEN
+  DEALLOCATE(XFIRERW)
+END IF
+
+IF (ASSOCIATED(XFMASE)) THEN
+  DEALLOCATE(XFMASE)
+END IF
+
+IF (ASSOCIATED(XFMAWC)) THEN
+  DEALLOCATE(XFMAWC)
+END IF
+
+IF (ASSOCIATED(XFMWALKIG)) THEN
+  DEALLOCATE(XFMWALKIG)
+END IF
+
+IF (ASSOCIATED(XFMFLUXHDH)) THEN
+  DEALLOCATE(XFMFLUXHDH)
+END IF
+
+IF (ASSOCIATED(XFMFLUXHDW)) THEN
+  DEALLOCATE(XFMFLUXHDW)
+END IF
+
+IF (ASSOCIATED(XFMHWS)) THEN
+  DEALLOCATE(XFMHWS)
+END IF
+
+IF (ASSOCIATED(XFMWINDU)) THEN
+  DEALLOCATE(XFMWINDU)
+END IF
+
+IF (ASSOCIATED(XFMWINDV)) THEN
+  DEALLOCATE(XFMWINDV)
+END IF
+
+IF (ASSOCIATED(XFMWINDW)) THEN
+  DEALLOCATE(XFMWINDW)
+END IF
+
+IF (ASSOCIATED(XFMGRADOROX)) THEN
+  DEALLOCATE(XFMGRADOROX)
+END IF
+
+IF (ASSOCIATED(XFMGRADOROY)) THEN
+  DEALLOCATE(XFMGRADOROY)
+END IF
+
+IF (ASSOCIATED(XGRADLSPHIX)) THEN
+  DEALLOCATE(XGRADLSPHIX)
+END IF
+
+IF (ASSOCIATED(XGRADLSPHIY)) THEN
+  DEALLOCATE(XGRADLSPHIY)
+END IF
+
+IF (ASSOCIATED(XFIREWIND)) THEN
+  DEALLOCATE(XFIREWIND)
+END IF
+
+IF (ASSOCIATED(XLSPHI2D)) THEN
+  DEALLOCATE(XLSPHI2D)
+END IF
+
+IF (ASSOCIATED(XGRADLSPHIX2D)) THEN
+  DEALLOCATE(XGRADLSPHIX2D)
+END IF
+
+IF (ASSOCIATED(XGRADLSPHIY2D)) THEN
+  DEALLOCATE(XGRADLSPHIY2D)
+END IF
+
+IF (ASSOCIATED(XGRADMASKX)) THEN
+  DEALLOCATE(XGRADMASKX)
+END IF
+
+IF (ASSOCIATED(XGRADMASKY)) THEN
+  DEALLOCATE(XGRADMASKY)
+END IF
+
+IF (ASSOCIATED(XSURFRATIO2D)) THEN
+  DEALLOCATE(XSURFRATIO2D)
+END IF
+
+IF (ASSOCIATED(XLSDIFFUX2D)) THEN
+  DEALLOCATE(XLSDIFFUX2D)
+END IF
+
+IF (ASSOCIATED(XLSDIFFUY2D)) THEN
+  DEALLOCATE(XLSDIFFUY2D)
+END IF
+
+IF (ASSOCIATED(XFIRERW2D)) THEN
+  DEALLOCATE(XFIRERW2D)
+END IF
+!
+!*       3.    Module MODD_GRID$n
+!
+IF ( ASSOCIATED(XLON) .AND. KCALL == 3 ) THEN
+  DEALLOCATE(XLON)
+  DEALLOCATE(XLAT)
+  DEALLOCATE(XMAP)
+END IF
+!
+IF ( KCALL == 3 ) THEN
+  !Philippe W.: do not deallocate XXHAT, XYHAT and XZHAT because they are needed later on
+  !As they are 1D, their memory footprint is negligible
+  ! DEALLOCATE(XXHAT)
+  DEALLOCATE(XDXHAT)
+  ! DEALLOCATE(XYHAT)
+  DEALLOCATE(XDYHAT)
+  DEALLOCATE(XZS)
+  DEALLOCATE(XZSMT)
+  DEALLOCATE(XZZ)
+  ! DEALLOCATE(XZHAT)
+END IF
+!
+IF ( KCALL == 2 ) THEN
+  DEALLOCATE(XDIRCOSZW)
+  DEALLOCATE(XDIRCOSXW)
+  DEALLOCATE(XDIRCOSYW)
+  DEALLOCATE(XCOSSLOPE)
+  DEALLOCATE(XSINSLOPE)
+END IF
+
+IF ( KCALL == 2 ) THEN
+  DEALLOCATE(XDXX)
+  DEALLOCATE(XDYY)
+  DEALLOCATE(XDZX)
+  DEALLOCATE(XDZY)
+  DEALLOCATE(XDZZ)
+END IF
+!
+!*       4.    Modules MODD_REF and  MODD_REF$n
+!
+IF ( KCALL == 4 ) THEN
+  DEALLOCATE(XRHODREFZ)
+  DEALLOCATE(XTHVREFZ)
+END IF
+!
+IF ( KCALL == 3 ) THEN
+  DEALLOCATE(XRHODREF)
+  DEALLOCATE(XTHVREF)
+  DEALLOCATE(XEXNREF)
+  DEALLOCATE(XRHODJ)
+  IF ( ASSOCIATED(XRVREF) ) THEN
+    DEALLOCATE(XRVREF)  
+  END IF
+END IF
+!
+!*       5.    Module MODD_CURVCOR$n
+!
+IF ( ASSOCIATED(XCORIOX) .AND. KCALL == 2 ) THEN
+  DEALLOCATE(XCORIOX)
+  DEALLOCATE(XCORIOY)
+END IF
+IF ( KCALL == 2 ) THEN
+  DEALLOCATE(XCORIOZ)
+END IF
+IF ( ASSOCIATED(XCURVX) .AND. KCALL == 2) THEN
+  DEALLOCATE(XCURVX)
+  DEALLOCATE(XCURVY)
+END IF
+!
+!*       6.    Module MODD_DYN$n
+!
+IF ( KCALL == 1 ) THEN
+  DEALLOCATE(XBFY)
+  DEALLOCATE(XAF,XCF)
+  DEALLOCATE(XTRIGSX)
+  DEALLOCATE(XTRIGSY)
+  DEALLOCATE(XRHOM)
+  DEALLOCATE(XALK)
+  DEALLOCATE(XALKW)
+  DEALLOCATE(XALKBAS)
+  DEALLOCATE(XALKWBAS)
+  IF ( ASSOCIATED(XKURELAX) ) THEN
+    DEALLOCATE(XKURELAX)
+    DEALLOCATE(XKVRELAX)
+    DEALLOCATE(XKWRELAX)
+    DEALLOCATE(LMASK_RELAX)
+  END IF
+END IF
+!
+!*       7.    Larger Scale variables (Module MODD_LSFIELD$n)
+!
+IF ( KCALL == 3 ) THEN
+  DEALLOCATE(XLSUM)
+  DEALLOCATE(XLSVM)
+  DEALLOCATE(XLSWM)
+  DEALLOCATE(XLSTHM)
+  IF(ASSOCIATED(XLSRVM)) DEALLOCATE(XLSRVM)
+  IF (ASSOCIATED(XLBXUM)) THEN
+    DEALLOCATE(XLBXUM)
+    DEALLOCATE(XLBYUM)
+    DEALLOCATE(XLBXVM)
+    DEALLOCATE(XLBYVM)
+    DEALLOCATE(XLBXWM)
+    DEALLOCATE(XLBYWM)
+    DEALLOCATE(XLBXTHM)
+    DEALLOCATE(XLBYTHM)
+  END IF
+  IF (ASSOCIATED(XLBXTKEM)) THEN
+    DEALLOCATE(XLBXTKEM)
+    DEALLOCATE(XLBYTKEM)
+  END IF
+  IF (ASSOCIATED(XLBXRM)) THEN
+    DEALLOCATE(XLBXRM)
+    DEALLOCATE(XLBYRM)
+  END IF
+  IF (ASSOCIATED(XLBXSVM)) THEN
+    DEALLOCATE(XLBXSVM)
+    DEALLOCATE(XLBYSVM)
+  END IF
+END IF
+!
+                  ! steady LS fields only for model 1 or independent models
+!
+IF( ASSOCIATED(XLSUS) .AND. KCALL == 3 ) THEN
+    DEALLOCATE(XLSUS)
+    DEALLOCATE(XLSVS)
+    DEALLOCATE(XLSWS)
+    DEALLOCATE(XLSTHS)
+    IF(ASSOCIATED(XLSRVS))  DEALLOCATE(XLSRVS)
+!
+    IF ( ASSOCIATED(XLBXUS) ) THEN
+      DEALLOCATE(XLBXUS)
+      DEALLOCATE(XLBYUS)
+      DEALLOCATE(XLBXVS)
+      DEALLOCATE(XLBYVS)
+      DEALLOCATE(XLBXWS)
+      DEALLOCATE(XLBYWS)
+      DEALLOCATE(XLBXTHS)
+      DEALLOCATE(XLBYTHS)
+    END IF
+    IF ( ASSOCIATED(XLBXTKES) ) THEN
+      DEALLOCATE(XLBXTKES)
+      DEALLOCATE(XLBYTKES)
+    END IF
+!
+    IF ( ASSOCIATED(XLBXRS) ) THEN
+      DEALLOCATE(XLBXRS)
+      DEALLOCATE(XLBYRS)
+    END IF
+!
+    IF ( ASSOCIATED(XLBXSVS) ) THEN
+      DEALLOCATE(XLBXSVS)
+      DEALLOCATE(XLBYSVS)
+    END IF
+!
+    IF ( ASSOCIATED(XCOEFLIN_LBXM) ) THEN
+      DEALLOCATE(XCOEFLIN_LBXM)
+      DEALLOCATE(NKLIN_LBXM)
+    END IF
+
+    IF ( ASSOCIATED(XCOEFLIN_LBYM) ) THEN
+      DEALLOCATE(XCOEFLIN_LBYM)
+      DEALLOCATE(NKLIN_LBYM)
+    END IF
+
+    IF ( ASSOCIATED(XCOEFLIN_LBXU) ) THEN
+      DEALLOCATE(XCOEFLIN_LBXU)
+      DEALLOCATE(NKLIN_LBXU)
+      DEALLOCATE(XCOEFLIN_LBYU)
+      DEALLOCATE(NKLIN_LBYU)
+      DEALLOCATE(XCOEFLIN_LBXV)
+      DEALLOCATE(NKLIN_LBXV)
+      DEALLOCATE(XCOEFLIN_LBYV)
+      DEALLOCATE(NKLIN_LBYV)
+      DEALLOCATE(XCOEFLIN_LBXW)
+      DEALLOCATE(NKLIN_LBXW)
+      DEALLOCATE(XCOEFLIN_LBYW)
+      DEALLOCATE(NKLIN_LBYW)
+    END IF 
+END IF
+!
+!*       8.    L.E.S. variables 
+!
+
+!
+!*       9.    Module MODD_RADIATIONS$n
+!
+!
+IF ( ASSOCIATED(XSLOPANG) .AND. KCALL == 2 ) THEN
+  DEALLOCATE(XSLOPANG)
+  DEALLOCATE(XSLOPAZI)
+  DEALLOCATE(XDTHRAD)
+  DEALLOCATE(XFLALWD)
+  DEALLOCATE(XDIRFLASWD)
+  DEALLOCATE(XSCAFLASWD)
+  DEALLOCATE(XDIRSRFSWD)
+  DEALLOCATE(XSWU)
+  DEALLOCATE(XSWD)
+  DEALLOCATE(XLWU)
+  DEALLOCATE(XLWD)
+  DEALLOCATE(XDTHRADSW)
+  DEALLOCATE(XDTHRADLW)
+  DEALLOCATE(XRADEFF)
+  DEALLOCATE(NCLEARCOL_TM1)
+END IF
+IF (ASSOCIATED(XSTATM)) DEALLOCATE(XSTATM)
+!
+!*      10.    Module MODD_DEEP_CONVECTION$n
+!
+IF ( ASSOCIATED(XDTHCONV) .AND. KCALL == 2 ) THEN
+  DEALLOCATE(NCOUNTCONV)
+  DEALLOCATE(XDTHCONV)
+  DEALLOCATE(XDRVCONV)
+  DEALLOCATE(XDRCCONV)
+  DEALLOCATE(XDRICONV)
+END IF
+!
+IF ( ASSOCIATED(XPRCONV) .AND. KCALL == 2 ) THEN
+  DEALLOCATE(XPRCONV)
+  DEALLOCATE(XPACCONV)
+END IF
+IF ( ASSOCIATED(XPRSCONV) .AND. KCALL == 2  ) THEN
+  DEALLOCATE(XPRSCONV)
+END IF
+!
+IF ( ASSOCIATED(XDSVCONV) .AND. KCALL == 2 ) THEN
+  DEALLOCATE(XDSVCONV)
+END IF
+!
+!*     11.   Forcing variables (Module MODD_FRC)
+!
+IF ( ALLOCATED(XUFRC) .AND. KCALL == 4 ) THEN
+    DEALLOCATE(TDTFRC)
+    DEALLOCATE(XUFRC)
+    DEALLOCATE(XVFRC)
+    DEALLOCATE(XWFRC)
+    DEALLOCATE(XTHFRC)
+    DEALLOCATE(XRVFRC)
+    DEALLOCATE(XTENDTHFRC)
+    DEALLOCATE(XTENDRVFRC)
+    DEALLOCATE(XGXTHFRC)
+    DEALLOCATE(XGYTHFRC)
+    DEALLOCATE(XPGROUNDFRC)
+END IF
+!
+!*     12.     Module MODD_ICE_CONC$n
+!
+IF ( ASSOCIATED(XCIT) .AND. KCALL == 2 ) THEN
+  DEALLOCATE(XCIT)
+END IF
+!
+!*     13.     Module MODD_PRECIP$n
+!
+IF ( ASSOCIATED(XINPRC) .AND. KCALL == 3 ) THEN
+  DEALLOCATE(XINPRC)
+  DEALLOCATE(XACPRC)
+END IF
+!
+IF ( ASSOCIATED(XINPRR) .AND. KCALL == 3 ) THEN
+  DEALLOCATE(XINPRR)
+  DEALLOCATE(XACPRR)
+END IF
+!
+IF ( ASSOCIATED(XINPRR3D) .AND. KCALL == 3 ) THEN
+  DEALLOCATE(XINPRR3D)
+  DEALLOCATE(XEVAP3D)
+END IF
+!
+IF ( ASSOCIATED(XINPRS) .AND. KCALL == 3 ) THEN
+  DEALLOCATE(XINPRS)
+  DEALLOCATE(XACPRS)
+  DEALLOCATE(XINPRG)
+  DEALLOCATE(XACPRG)
+END IF
+!
+IF ( ASSOCIATED(XINPRH) .AND. KCALL == 3 ) THEN
+  DEALLOCATE(XINPRH)
+  DEALLOCATE(XACPRH)
+END IF
+!
+!*     13b.     Module MODD_ELEC$n
+!
+IF ( ASSOCIATED(XNI_SDRYG) .AND. KCALL == 3 ) THEN
+  DEALLOCATE(XNI_SDRYG)
+  DEALLOCATE(XNI_IDRYG)
+  DEALLOCATE(XNI_IAGGS)
+  DEALLOCATE(XEW)
+  DEALLOCATE(XIND_RATE)
+END IF
+!
+IF ( ASSOCIATED(XEFIELDU) .AND. KCALL == 3 ) THEN
+  DEALLOCATE(XEFIELDU)
+  DEALLOCATE(XEFIELDV)
+  DEALLOCATE(XEFIELDW)
+  DEALLOCATE(XESOURCEFW)
+  DEALLOCATE(XIONSOURCEFW)
+  DEALLOCATE(XCION_POS_FW)
+  DEALLOCATE(XCION_NEG_FW)
+  DEALLOCATE(XMOBIL_POS)  
+  DEALLOCATE(XMOBIL_NEG)  
+END IF
+!
+IF ( ASSOCIATED(XRHOM_E) .AND. KCALL == 3 ) THEN
+  DEALLOCATE (XRHOM_E)
+  DEALLOCATE (XAF_E)
+  DEALLOCATE (XCF_E)
+  DEALLOCATE (XBFY_E)
+END IF
+!
+!*     14.     Modules RAIN_ICE_DESCR and MODD_RAIN_ICE_PARAM
+!
+IF (  ASSOCIATED(XRTMIN) .AND. KCALL == 4 ) THEN
+  CALL RAIN_ICE_DESCR_DEALLOCATE()
+  CALL RAIN_ICE_PARAM_DEALLOCATE()
+END IF
+!
+!*     15.     Module PASPOLn           
+!
+IF ( ASSOCIATED(XATC) .AND. KCALL == 3 ) THEN
+  DEALLOCATE(XATC)
+END IF
+!
+!*     16.     Module TURBn           
+!
+IF ( KCALL==3 ) THEN
+  IF (ASSOCIATED(XDYP)) DEALLOCATE(XDYP)
+  IF (ASSOCIATED(XTHP)) DEALLOCATE(XTHP)
+  IF (ASSOCIATED(XTR)) DEALLOCATE(XTR)
+  IF (ASSOCIATED(XDISS)) DEALLOCATE(XDISS)
+  IF (ASSOCIATED(XLEM)) DEALLOCATE(XLEM)
+  IF (ASSOCIATED(XCEI)) DEALLOCATE(XCEI)
+END IF
+!-------------------------------------------------------------------------------
+!
+CALL GOTO_MODEL(IMI)
+!
+END SUBROUTINE DEALLOCATE_MODEL1
diff --git a/src/PHYEX/ext/default_desfmn.f90 b/src/PHYEX/ext/default_desfmn.f90
new file mode 100644
index 0000000000000000000000000000000000000000..33466cf0a528ecca3559fcc0713d498b6249d33e
--- /dev/null
+++ b/src/PHYEX/ext/default_desfmn.f90
@@ -0,0 +1,1327 @@
+!MNH_LIC Copyright 1994-2023 CNRS, Meteo-France and Universite Paul Sabatier
+!MNH_LIC This is part of the Meso-NH software governed by the CeCILL-C licence
+!MNH_LIC version 1. See LICENSE, CeCILL-C_V1-en.txt and CeCILL-C_V1-fr.txt
+!MNH_LIC for details. version 1.
+!-----------------------------------------------------------------
+!     ###########################
+      MODULE MODI_DEFAULT_DESFM_n
+!     ###########################
+!
+INTERFACE
+!
+SUBROUTINE DEFAULT_DESFM_n(KMI)
+INTEGER,         INTENT(IN)  :: KMI       ! Model index
+END SUBROUTINE DEFAULT_DESFM_n
+!
+END INTERFACE
+!
+END MODULE MODI_DEFAULT_DESFM_n
+!
+!
+!
+!     ###############################
+      SUBROUTINE DEFAULT_DESFM_n(KMI)
+!     ###############################
+!
+!!****  *DEFAULT_DESFM_n * - set default values for descriptive variables of
+!!                         model KMI
+!!
+!!    PURPOSE
+!!    -------
+!       The purpose of this routine is to set default values for the variables
+!     in descriptor files by filling the corresponding variables which
+!     are stored in modules.
+!
+!
+!!**  METHOD
+!!    ------
+!!      Each variable in modules, which can be initialized by  reading its
+!!    value in the descriptor file is set to a default value.
+!!     When this routine is used during INIT, the modules of the first model
+!!   are used to temporarily store  the variables associated with a nested
+!!   model.
+!!     When this routine is used during  SPAWNING, the modules of a second
+!!   model must be initialized.
+!!     Default values for variables common to all models are set only
+!!   at the first call of DEFAULT_DESFM_n (i.e. when KMI=1)
+!!
+!!
+!!    EXTERNAL
+!!    --------
+!!     NONE
+!!
+!!    IMPLICIT ARGUMENTS
+!!    ------------------
+!!      Module MODD_PARAMETERS : JPHEXT,JPVEXT
+!!
+!!      Module MODD_CONF       : CCONF,L2D,L1D,LFLAT,NMODEL,NVERB
+!!
+!!      Module MODD_DYN        : XSEGLEN,XASSELIN,LCORIO,LNUMDIFF
+!!                               XALKTOP,XALZBOT
+!!
+!!      Module MODD_BAKOUT
+!!
+!!      Module MODD_NESTING    : NDAD(m),NDTRATIO(m),XWAY(m)
+!!
+!!      Module MODD_CONF_n    : LUSERV,LUSERC,LUSERR,LUSERI,LUSERS
+!!                              LUSERG,LUSERH,CSEG,CEXP
+!!
+!!      Module MODD_LUNIT_n   : CINIFILE,CCPLFILE
+!!
+!!
+!!      Module MODD_DYN_n     : XTSTEP,CPRESOPT,NITR,XRELAX,LHO_RELAX
+!!         LVE_RELAX,XRIMKMAX,NRIMX,NRIMY
+!!
+!!      Module MODD_ADV_n : CUVW_ADV_SCHEME,CMET_ADV_SCHEME,CSV_ADV_SCHEME,NLITER
+!!
+!!      Module MODD_PARAM_n : CTURB,CRAD,CDCONV,CSCONV
+!!
+!!      Module MODD_LBC_n : CLBCX, CLBCY,NLBLX,NLBLY,XCPHASE,XCPHASE_PBL,XPOND
+!!
+!!      Module MODD_TURB_n : XIMPL,CTURBLEN,CTURBDIM,LTURB_FLX,LTURB_DIAG,LSUBG_COND
+!!                           LTGT_FLX
+!!
+!!
+!!      Module MODD_PARAM_RAD_n:
+!!          XDTRAD,XDTRAD_CLONLY,LCLEAR_SKY,NRAD_COLNBR, NRAD_DIAG
+!!
+!!      Module MODD_BUDGET : CBUTYPE,NBUMOD,XBULEN,NBUKL, NBUKH,LBU_KCP,XBUWRI
+!!         NBUIL, NBUIH,NBUJL, NBUJH,LBU_ICP,LBU_JCP,NBUMASK
+!!
+!!      Module MODD_BLANK_n:
+!!
+!!          XDUMMYi, NDUMMYi, LDUMMYi, CDUMMYi
+!!
+!!      Module MODD_FRC :
+!!
+!!          LGEOST_UV_FRC,LGEOST_TH_FRC,LTEND_THRV_FRC
+!!          LVERT_MOTION_FRC,LRELAX_THRV_FRC,LRELAX_UV_FRC,LRELAX_UVMEAN_FRC,
+!!          XRELAX_TIME_FRC
+!!          XRELAX_HEIGHT_FRC,CRELAX_HEIGHT_TYPE,LTRANS,XUTRANS,XVTRANS,
+!!          LPGROUND_FRC
+!!
+!!      Module MODD_PARAM_ICE :
+!!
+!!          LWARM,CPRISTINE_ICE
+!!
+!!      Module MODD_PARAM_KAFR_n :
+!!
+!!          XDTCONV,LREFRESH_ALL,LDOWN,NICE,LCHTRANS
+!!
+!!      Module MODD_PARAM_MFSHALL_n :
+!!
+!!         CMF_UPDRAFT,LMIXUV,CMF_CLOUD,XIMPL_MF,LMF_FLX              
+!!
+!!
+!!
+!!
+!!    REFERENCE
+!!    ---------
+!!      Book2 of the documentation (routine DEFAULT_DESFM_n)
+!!
+!!
+!!    AUTHOR
+!!    ------
+!!      V. Ducrocq       * Meteo France *
+!!
+!!    MODIFICATIONS
+!!    -------------
+!!      Original      02/06/94
+!!      Modifications 17/10/94  (Stein)  For LCORIO
+!!      Modifications 06/12/94  (Stein)  remove LBOUSS+add LABSLAYER, LNUMDIFF
+!!                                       ,LSTEADYLS
+!!      Modifications 06/12/94  (Stein)  remove LABSLAYER, add LHO_RELAX,
+!!                                       LVE_RELAX, NRIMX, NRIMY, XRIMKMAX
+!!      Modifications 09/01/95  (Lafore) add LSTEADY_DMASS
+!!      Modifications 09/01/95  (Stein)  add the turbulence scheme namelist
+!!      Modifications 09/01/95  (Stein)  add the 1D switch
+!!      Modifications 10/03/95  (Mallet) add the coupling files
+!!                    29/06/95  ( Stein, Nicolau, Hereil) add the budgets
+!!      Modifications 25/09/95  ( Stein )add the LES tools
+!!      Modifications 25/10/95  ( Stein )add the radiations
+!!      Modifications 23/10/95  (Vila, lafore) new scalar advection scheme
+!!      Modifications 24/02/96  (Stein)  change the default value for CCPLFILE
+!!      Modifications 12/02/96  (Lafore) transformation to DEFAULT_DESFM_n for
+!!                                       spawning
+!!      Modifications 25/04/96  (Suhre)  add the blank module
+!!      Modifications 29/07/96  (Pinty&Suhre) add module MODD_FRC
+!!      Modifications 11/04/96  (Pinty)  add the rain-ice scheme and modify
+!!                                       the split arrays in MODD_PARAM_RAD_n
+!!      Modifications 11/01/97  (Pinty)  add the deep convection scheme
+!!      Modifications 24/11/96  (Masson)  add LREFRESH_ALL in deep convection
+!!      Modifications 12/02/96  (Lafore) transformation to DEFAULT_DESFM_n for spawning
+!!      Modifications 22/07/96  (Lafore) gridnesting implementation
+!!      Modifications 29/07/96  (Lafore) add the module MODD_FMOUT (renamed MODD_BAKOUT)
+!!      Modifications 23/06/97  (Stein)  add the equation system name
+!!      Modifications 10/07/97  (Masson) add MODD_PARAM_GROUNDn : CROUGH
+!!      Modifications 28/07/97  (Masson) remove LREFRESH_ALL and LSTEADY_DMASS
+!!      Modifications 08/10/97  (Stein)  switch (_n=1) to initialize the
+!!                                       parameters common to all models
+!!      Modifications 24/01/98 (Bechtold) add LREFRESH_ALL, LCHTRANS,
+!!                                         LTEND_THRV_FR and LSST_FRC
+!!      Modifications 18/07/99  (Stein)  add LRAD_DIAG
+!!      Modification  15/03/99 (Masson)  use of XUNDEF
+!!      Modification  11/12/00 (Tomasini) Add CSEA_FLUX to MODD_PARAMn
+!!      Modification  22/01/01 (Gazen) delete NSV and add LHORELAX_SVC2R2
+!!                                     LHORELAX_SVCHEM,LHORELAX_SVLG
+!!      Modification 15/03/02 (Solmon) radiation scheme: remove NSPOT and add
+!!                                   default for aerosol and cloud rad. prop. control
+!!      Modification 22/05/02 (Jabouille) put chimical default here
+!!      Modification 01/2004  (Masson) removes surface (externalization)
+!!                      09/04 (M. Tomasini) New namelist to modify the
+!!                                             Cloud mixing length
+!!                   07/05 (P.Tulet) New namelists for dust and aerosol
+!!      Modification 01/2007  (Malardel, Pergaud) Add MODD_PARAM_MFSHALL_n
+!!      Modification 10/2009  (Aumond) Add user multimasks for LES
+!!      Modification 10/2009  (Aumond) Add MEAN_FIELD              
+!!      Modification 12/04/07 (Leriche) add LUSECHAQ for aqueous chemistry
+!!      Modification 30/05/07 (Leriche) add LCH_PH and XCH_PHINIT for pH
+!!      Modification 25/04/08 (Leriche) add XRTMIN_AQ LWC threshold for aq. chemistry
+!!                   16/07/10           add LHORELAX_SVIC
+!!                   16/09/10           add LUSECHIC
+!!                   13/01/11           add LCH_RET_ICE
+!!                   01/07/11 (F.Couvreux) Add CONDSAMP
+!!                   01/07/11 (B.Aouizerats) Add CAOP    
+!!                   07/2013  (C.Lac) add WENO, LCHECK              
+!!                   07/2013  (Bosseur & Filippi) adds Forefire
+!!                   08/2015  (Redelsperger & Pianezze) add XPOND coefficient for LBC
+!!      Modification 24/03/16 (Leriche) remove LCH_SURFACE_FLUX 
+!!                                      put NCH_VEC_LENGTH = 50 instead of 1000
+!!
+!!                   04/2016 (C.LAC) negative contribution to the budget split between advection, turbulence and microphysics for KHKO/C2R2
+!!      Modification    01/2016  (JP Pinty) Add LIMA
+!!      Modification 24/03/16 (Leriche) remove LCH_SURFACE_FLUX 
+!!                                      put NCH_VEC_LENGTH = 50 instead of 1000
+!!                   10/2016 (C.Lac) VSIGQSAT change from 0 to 0.02 for coherence with AROME
+!!                    10/2016 (C.Lac) Add droplet deposition
+!!                   10/2016  (R.Honnert and S.Riette) : Improvement of EDKF and adaptation to the grey zone
+!!                   10/2016  (F Brosse) add prod/loss terms computation for chemistry
+!!                   07/2017  (V. Masson) adds time step for output files writing.
+!!                   09/2017 Q.Rodier add LTEND_UV_FRC
+!!                   02/2018 Q.Libois ECRAD
+!  Philippe Wautelet: 05/2016-04/2018: new data structures and calls for I/O
+!!                   01/2018  (S. Riette) new budgets and variables for ICE3/ICE4
+!!                   01/2018 (J.Colin) add VISC and DRAG
+!!                   07/2017 (V. Vionnet) add blowing snow variables
+!!                   01/2019 (R. Honnert) add reduction of the mass-flux surface closure with the resolution
+!!      Bielli S. 02/2019  Sea salt : significant sea wave height influences salt emission; 5 salt modes
+!!                   05/2019 F.Brient add tracer emission from the top of the boundary-layer
+!!                   11/2019 C.Lac correction in the drag formula and application to building in addition to tree
+!  P. Wautelet 17/04/2020: move budgets switch values into modd_budget
+!  P. Wautelet 30/06/2020: add NNETURSV, NNEADVSV and NNECONSV variables
+!  F. Auguste, T. Nagel 02/2021: add IBM defaults parameters
+!  T. Nagel       02/2021: add turbulence recycling defaults parameters
+!  P-A Joulin  21/05/2021: add Wind turbines
+!  S. Riette   21/05/2021: add options to PDF subgrid scheme
+!  D. Ricard      05/2021: add the contribution of Leonard terms in the turbulence scheme
+!  JL Redelsperger 06/2021: add parameters allowing to active idealized oceanic convection
+!  B. Vie         06/2021: add prognostic supersaturation for LIMA
+!  Q. Rodier      06/2021: modify default value to LGZ=F (grey-zone corr.), LSEDI and OSEDC=T (LIMA sedimentation)
+!  F. Couvreux    06/2021: add LRELAX_UVMEAN_FRC
+!  Q. Rodier      07/2021: modify XPOND=1
+!  R. Schoetter    12/2021  multi-level coupling between MesoNH and SURFEX  
+!  A. Costes      12/2021: Blaze fire model
+!  C. Barthe      03/2022: add CIBU and RDSF options in LIMA
+!  Delbeke/Vie    03/2022: KHKO option in LIMA
+!  P. Wautelet 27/04/2022: add namelist for profilers
+!-------------------------------------------------------------------------------
+!
+!*       0.    DECLARATIONS
+!              ------------
+USE MODD_PARAMETERS
+USE MODD_LUNIT_n,          ONLY: TLUOUT
+USE MODD_CONF             !        For INIT only DEFAULT_DESFM1
+USE MODD_CONFZ
+USE MODD_DYN
+USE MODD_NESTING
+USE MODD_BAKOUT
+USE MODD_SERIES
+USE MODD_CONF_n           ! modules used to set the default values is only
+USE MODD_LUNIT_n          ! the one corresponding to model 1. These memory
+USE MODD_DIM_n            ! addresses will then be filled by the values read in
+USE MODD_DYN_n            ! the DESFM corresponding to model n which may have
+USE MODD_ADV_n            ! missing values. This is why we affect default values.
+USE MODD_PARAM_n          !      For SPAWNING DEFAULT_DESFM2 is also used
+USE MODD_LBC_n
+USE MODD_OUT_n
+USE MODD_TURB_n, ONLY: TURBN_INIT
+USE MODD_NEB_n, ONLY: NEBN_INIT
+USE MODD_BUDGET
+USE MODD_LES
+USE MODD_PARAM_RAD_n
+#ifdef MNH_ECRAD
+USE MODD_PARAM_ECRAD_n
+#if ( VER_ECRAD == 140 ) 
+USE MODD_RADIATIONS_n , ONLY : NSWB_MNH, NLWB_MNH
+#endif
+#endif
+USE MODD_BLANK_n
+USE MODD_FRC
+USE MODD_PARAM_ICE_n, ONLY: PARAM_ICEN_INIT
+USE MODD_PARAM_LIMA, ONLY: PARAM_LIMA_INIT
+USE MODD_PARAM_C2R2
+USE MODD_PARAM_KAFR_n
+USE MODD_PARAM_MFSHALL_n, ONLY: PARAM_MFSHALLN_INIT
+USE MODD_CH_MNHC_n
+USE MODD_SERIES_n
+USE MODD_NUDGING_n
+USE MODD_CH_AEROSOL
+USE MODD_DUST
+USE MODD_SALT
+USE MODD_PASPOL
+USE MODD_CONDSAMP
+USE MODD_MEAN_FIELD
+USE MODD_DRAGTREE_n
+USE MODD_DRAGBLDG_n
+USE MODD_COUPLING_LEVELS_n
+USE MODD_EOL_MAIN
+USE MODD_EOL_ADNR
+USE MODD_EOL_ALM
+USE MODD_EOL_SHARED_IO
+USE MODD_ALLPROFILER_n
+USE MODD_ALLSTATION_n
+!
+USE MODD_LATZ_EDFLX
+USE MODD_2D_FRC
+USE MODD_BLOWSNOW
+USE MODD_BLOWSNOW_n
+USE MODD_DRAG_n
+USE MODD_VISCOSITY
+USE MODD_RECYCL_PARAM_n
+USE MODD_IBM_PARAM_n
+USE MODD_IBM_LSF
+#ifdef MNH_FOREFIRE
+USE MODD_FOREFIRE
+#endif
+USE MODD_FIRE_n
+USE MODD_IO, ONLY: TFILEDATA
+!
+IMPLICIT NONE
+!
+!*       0.1   declarations of arguments
+!
+INTEGER,         INTENT(IN)  :: KMI       ! Model index
+!
+!*       0.2   declaration of local variables
+!
+INTEGER             :: JM      ! loop index
+TYPE(TFILEDATA)    TFILENAM    ! Empty file to satisfy interface of PHYEX_init routines which may calls POSNAM (but do not)
+!
+!-------------------------------------------------------------------------------
+!
+!*      1.    SET DEFAULT VALUES FOR MODD_LUNIT_n :
+!             ----------------------------------
+!
+! CINIFILE='INIFILE'
+CINIFILEPGD='' !Necessary to keep this line to prevent problems with spawning
+CCPLFILE(:)='    '
+!
+!-------------------------------------------------------------------------------
+!
+!*      2.    SET DEFAULT VALUES FOR MODD_CONF AND MODD_CONF_n :
+!             ------------------------------------------------
+!
+IF (KMI == 1) THEN
+  CCONF      ='START'
+  LTHINSHELL = .FALSE.
+  L2D        = .FALSE.
+  L1D        = .FALSE.
+  LFLAT      = .FALSE.
+  NMODEL     = 1
+  CEQNSYS    = 'DUR'
+  NVERB      = 5
+  CEXP       = 'EXP01'
+  CSEG       = 'SEG01'
+  LFORCING   = .FALSE.
+  L2D_ADV_FRC= .FALSE.
+  L2D_REL_FRC= .FALSE. 
+  XRELAX_HEIGHT_BOT = 0.
+  XRELAX_HEIGHT_TOP = 30000.
+  XRELAX_TIME = 864000.
+  LPACK      = .TRUE.
+  NHALO      = 1
+#ifdef MNH_SX5
+  CSPLIT     ='YSPLITTING'   ! NEC vectoriel architecture , low number of PROC
+#else
+  CSPLIT     ='BSPLITTING'   ! Scalaire architecture , high number of PROC
+#endif
+  NZ_PROC    = 0               !JUAN Z_SPLITTING :: number of proc in Z splitting
+  NZ_SPLITTING = 10            !JUAN Z_SPLITTING :: for debug NZ=1=flat_inv;  NZ=10=flat_invz; NZ=1+2 the two
+  LLG        = .FALSE.
+  LINIT_LG   = .FALSE.
+  CINIT_LG   = 'FMOUT'
+  LNOMIXLG   = .FALSE.
+  LCHECK     = .FALSE.
+END IF
+!
+CCLOUD    = 'NONE'
+LUSERV    = .TRUE.
+LUSERC    = .FALSE.
+LUSERR    = .FALSE.
+LUSERI    = .FALSE.
+LUSERS    = .FALSE.
+LUSERG    = .FALSE.
+LUSERH    = .FALSE.
+LOCEAN    = .FALSE.
+!NSV      = 0
+!NSV_USER = 0
+LUSECI    = .FALSE.
+!
+!-------------------------------------------------------------------------------
+!
+!*      3.    SET DEFAULT VALUES FOR MODD_DYN AND MODD_DYN_n :
+!             -----------------------------------------------
+!
+IF (KMI == 1) THEN
+  XSEGLEN   = 43200.
+  XASSELIN  = 0.2
+  XASSELIN_SV = 0.02
+  LCORIO    = .TRUE.
+  LNUMDIFU  = .TRUE.
+  LNUMDIFTH = .FALSE.
+  LNUMDIFSV = .FALSE.
+  XALZBOT   = 4000.
+  XALKTOP   = 0.01
+  XALKGRD   = 0.01
+  XALZBAS   = 0.01
+END IF
+!
+XTSTEP    = 60.
+CPRESOPT  = 'CRESI'
+NITR      = 4
+LITRADJ   = .TRUE.
+LRES      = .FALSE.
+XRES      = 1.E-07
+XRELAX    = 1.
+LVE_RELAX = .FALSE.
+LVE_RELAX_GRD = .FALSE.
+XRIMKMAX  = 0.01 / XTSTEP
+XT4DIFU   = 1800.          
+XT4DIFTH  = 1800.           
+XT4DIFSV  = 1800.           
+!
+IF (KMI == 1) THEN   ! for model 1 we have a Large scale information
+  NRIMX = JPRIMMAX   ! for U,V,W,TH,Rv used for the hor. relaxation
+  NRIMY = JPRIMMAX
+ELSE
+  NRIMX = 0          ! for inner models we use only surfacic fields to
+  NRIMY = 0          ! give the lbc and no hor. relaxation is used
+END IF
+!
+LHORELAX_UVWTH = .FALSE.
+LHORELAX_RV = .FALSE.
+LHORELAX_RC = .FALSE. ! for all these fields, no large scale is usally available
+LHORELAX_RR = .FALSE. ! for model 1 and for inner models, we only use surfacic
+LHORELAX_RS = .FALSE. ! fiels ( no hor. relax. )
+LHORELAX_RI = .FALSE.
+LHORELAX_RG = .FALSE.
+LHORELAX_RH = .FALSE.
+LHORELAX_TKE = .FALSE.
+LHORELAX_SV(:) = .FALSE.
+LHORELAX_SVC2R2 = .FALSE.
+LHORELAX_SVC1R3 = .FALSE.
+LHORELAX_SVELEC = .FALSE.
+LHORELAX_SVLG   = .FALSE.
+LHORELAX_SVCHEM = .FALSE.
+LHORELAX_SVCHIC = .FALSE.
+LHORELAX_SVDST  = .FALSE.
+LHORELAX_SVSLT  = .FALSE.
+LHORELAX_SVPP   = .FALSE.
+LHORELAX_SVCS   = .FALSE.
+LHORELAX_SVAER  = .FALSE.
+!
+LHORELAX_SVLIMA = .FALSE.
+!
+#ifdef MNH_FOREFIRE
+LHORELAX_SVFF   = .FALSE.
+#endif
+LHORELAX_SVSNW  = .FALSE.
+LHORELAX_SVFIRE = .FALSE.
+!
+!
+!-------------------------------------------------------------------------------
+!
+!*      4.    SET DEFAULT VALUES FOR MODD_NESTING :
+!             -----------------------------------
+!
+IF (KMI == 1) THEN
+  NDAD(1)=1
+  DO JM=2,JPMODELMAX
+    NDAD(JM)  = JM - 1
+  END DO
+  NDTRATIO(:) = 1
+  XWAY(:)     = 2.      ! two-way interactive gridnesting
+  XWAY(1)     = 0.      ! except for model 1
+END IF
+!
+!-------------------------------------------------------------------------------
+!
+!*      5.    SET DEFAULT VALUES FOR MODD_ADV_n :
+!             ----------------------------------
+!
+CUVW_ADV_SCHEME =  'CEN4TH'
+CMET_ADV_SCHEME =  'PPM_01'
+CSV_ADV_SCHEME  =  'PPM_01'
+CTEMP_SCHEME    =  'RKC4'        
+NWENO_ORDER = 3
+NSPLIT      = 1
+LSPLIT_CFL  = .TRUE.
+LSPLIT_WENO = .TRUE.
+XSPLIT_CFL  = 0.8
+LCFL_WRIT   = .FALSE.
+!
+!-------------------------------------------------------------------------------
+!
+!*      6.    SET DEFAULT VALUES FOR MODD_PARAM_n :
+!             -----------------------------------
+!
+CTURB   = 'NONE'
+CRAD    = 'NONE'
+CDCONV  = 'NONE'
+CSCONV  = 'NONE'
+CELEC   = 'NONE'
+CACTCCN = 'NONE'
+!
+!-------------------------------------------------------------------------------
+!
+!*      7.    SET DEFAULT VALUES FOR MODD_LBC_n :
+!             ---------------------------------
+!
+CLBCX(1) ='CYCL'
+CLBCX(2) ='CYCL'
+CLBCY(1) ='CYCL'
+CLBCY(2) ='CYCL'
+NLBLX(:) = 1
+NLBLY(:) = 1
+XCPHASE = 20.
+XCPHASE_PBL = 0.
+XCARPKMAX = XUNDEF
+XPOND = 1.0
+!
+!-------------------------------------------------------------------------------
+!
+!*      8.    SET DEFAULT VALUES FOR MODD_NUDGING_n :
+!             ---------------------------------
+!
+LNUDGING = .FALSE.
+XTNUDGING = 21600.
+!
+!-------------------------------------------------------------------------------
+!
+!*      9.    SET DEFAULT VALUES FOR MODD_BAKOUT and MODD_OUT_n :
+!             ------------------------------------------------
+!
+!
+!
+!-------------------------------------------------------------------------------
+!
+!*      10.   SET DEFAULT VALUES FOR MODD_TURB_n :
+!             ----------------------------------
+!
+CALL TURBN_INIT(CPROGRAM, TFILENAM, .FALSE., TLUOUT%NLU, &
+               &LDDEFAULTVAL=.TRUE., LDREADNAM=.FALSE., LDCHECK=.FALSE., KPRINT=0)
+!-------------------------------------------------------------------------------
+!
+!*      10a.   SET DEFAULT VALUES FOR MODD_NEB_n :
+!             ----------------------------------
+!
+CALL NEBN_INIT(CPROGRAM, TFILENAM, .FALSE., TLUOUT%NLU, &
+              &LDDEFAULTVAL=.TRUE., LDREADNAM=.FALSE., LDCHECK=.FALSE., KPRINT=0)
+!-------------------------------------------------------------------------------
+!
+!*      10b.   SET DEFAULT VALUES FOR MODD_DRAGTREE :
+!             ----------------------------------
+!
+LDRAGTREE = .FALSE.
+LDEPOTREE = .FALSE.
+XVDEPOTREE = 0.02 ! 2 cm/s 
+!------------------------------------------------------------------------------
+!
+!*      10b.   SET DEFAULT VALUES FOR MODD_DRAGBLDG_n :
+!             ----------------------------------
+!
+LDRAGBLDG   = .FALSE.
+LFLUXBLDG   = .FALSE.
+LDRAGURBVEG = .FALSE.
+!
+!*      10c.   SET DEFAULT VALUES FOR MODD_COUPLING_LEVELS_n :
+!             ----------------------------------
+!
+NLEV_COUPLE = 1
+!------------------------------------------------------------------------------
+!
+!*      10c.   SET DEFAULT VALUES FOR MODD_DRAGB
+!             ----------------------------------
+!
+LDRAGBLDG = .FALSE.
+!
+!*      10d.   SET DEFAULT VALUES FOR MODD_EOL* :
+!             ----------------------------------
+!
+!       10d.i) MODD_EOL_MAIN
+!
+LMAIN_EOL  = .FALSE.
+CMETH_EOL  = 'ADNR'
+CSMEAR     = '3LIN'
+NMODEL_EOL = 1
+!
+!       10d.ii) MODD_EOL_SHARED_IO
+!
+CFARM_CSVDATA     = 'data_farm.csv'
+CTURBINE_CSVDATA  = 'data_turbine.csv'
+CBLADE_CSVDATA    = 'data_blade.csv' 
+CAIRFOIL_CSVDATA  = 'data_airfoil.csv'
+!
+CINTERP           = 'CLS'
+!
+!       10d.iii) MODD_EOL_ALM
+!
+NNB_BLAELT        =  42
+LTIMESPLIT        = .FALSE.
+LTIPLOSSG         = .TRUE.
+LTECOUTPTS        = .FALSE.
+!
+!------------------------------------------------------------------------------
+!*      10.e   SET DEFAULT VALUES FOR MODD_ALLPROFILER_n :
+!             ----------------------------------
+!
+NNUMB_PROF    = 0
+XSTEP_PROF    = 60.0
+XX_PROF(:)    = XUNDEF
+XY_PROF(:)    = XUNDEF
+XZ_PROF(:)    = XUNDEF
+XLAT_PROF(:)  = XUNDEF
+XLON_PROF(:)  = XUNDEF
+CNAME_PROF(:) = ''
+CFILE_PROF    = 'NO_INPUT_CSV'
+LDIAG_SURFRAD_PROF = .TRUE.
+!------------------------------------------------------------------------------
+!*      10.f   SET DEFAULT VALUES FOR MODD_ALLSTATION_n :
+!             ----------------------------------
+!
+NNUMB_STAT    = 0
+XSTEP_STAT    = 60.0
+XX_STAT(:)    = XUNDEF
+XY_STAT(:)    = XUNDEF
+XZ_STAT(:)    = XUNDEF
+XLAT_STAT(:)  = XUNDEF
+XLON_STAT(:)  = XUNDEF
+CNAME_STAT(:) = ''
+CFILE_STAT    = 'NO_INPUT_CSV'
+LDIAG_SURFRAD_STAT = .TRUE.
+!
+!-------------------------------------------------------------------------------
+!
+!*      11.   SET DEFAULT VALUES FOR MODD_BUDGET :
+!             ------------------------------------
+!
+!       11.1 General  budget variables
+!
+IF (KMI == 1) THEN
+  CBUTYPE = 'NONE'
+  NBUMOD = 1
+  XBULEN = XSEGLEN
+  XBUWRI = XSEGLEN
+  NBUKL  = 1
+  NBUKH  = 0        
+  LBU_KCP = .TRUE.
+!
+!       11.2 Variables for the cartesian box
+!
+  NBUIL = 1
+  NBUIH = 0      
+  NBUJL = 1
+  NBUJH = 0          
+  LBU_ICP = .TRUE.
+  LBU_JCP = .TRUE.
+!
+!       11.3 Variables for the mask
+!
+  NBUMASK = 1
+END IF
+!
+!-------------------------------------------------------------------------------
+!
+!*      12.    SET DEFAULT VALUES FOR MODD_LES :
+!             ---------------------------------
+!
+IF (KMI == 1) THEN
+  LLES_MEAN               = .FALSE.
+  LLES_RESOLVED           = .FALSE.
+  LLES_SUBGRID            = .FALSE.
+  LLES_UPDRAFT            = .FALSE.
+  LLES_DOWNDRAFT          = .FALSE.
+  LLES_SPECTRA            = .FALSE.
+!
+  NLES_LEVELS             = NUNDEF
+  XLES_ALTITUDES          = XUNDEF
+  NSPECTRA_LEVELS         = NUNDEF
+  XSPECTRA_ALTITUDES      = XUNDEF
+  NLES_TEMP_SERIE_I       = NUNDEF
+  NLES_TEMP_SERIE_J       = NUNDEF
+  NLES_TEMP_SERIE_Z       = NUNDEF
+  CLES_NORM_TYPE          = 'NONE'
+  CBL_HEIGHT_DEF          = 'KE'
+  XLES_TEMP_SAMPLING      = XUNDEF
+  XLES_TEMP_MEAN_START    = XUNDEF
+  XLES_TEMP_MEAN_END      = XUNDEF
+  XLES_TEMP_MEAN_STEP     = 3600.
+  LLES_CART_MASK          = .FALSE.
+  NLES_IINF               = NUNDEF
+  NLES_ISUP               = NUNDEF
+  NLES_JINF               = NUNDEF
+  NLES_JSUP               = NUNDEF
+  LLES_NEB_MASK           = .FALSE.
+  LLES_CORE_MASK          = .FALSE.
+  LLES_MY_MASK            = .FALSE.
+  NLES_MASKS_USER         = NUNDEF
+  LLES_CS_MASK            = .FALSE.
+
+  LLES_PDF               = .FALSE.
+  NPDF                   = 1
+  XTH_PDF_MIN            = 270.
+  XTH_PDF_MAX            = 350.
+  XW_PDF_MIN             = -10.
+  XW_PDF_MAX             = 10.
+  XTHV_PDF_MIN           = 270.
+  XTHV_PDF_MAX           = 350.
+  XRV_PDF_MIN            = 0.
+  XRV_PDF_MAX            = 20.
+  XRC_PDF_MIN            = 0.
+  XRC_PDF_MAX            = 1.
+  XRR_PDF_MIN            = 0.
+  XRR_PDF_MAX            = 1.
+  XRI_PDF_MIN            = 0.
+  XRI_PDF_MAX            = 1.
+  XRS_PDF_MIN            = 0.
+  XRS_PDF_MAX            = 1.
+  XRG_PDF_MIN            = 0.
+  XRG_PDF_MAX            = 1.
+  XRT_PDF_MIN            = 0.
+  XRT_PDF_MAX            = 20.
+  XTHL_PDF_MIN           = 270.
+  XTHL_PDF_MAX           = 350.
+END IF
+!
+!-------------------------------------------------------------------------------
+!
+!*      13.   SET DEFAULT VALUES FOR MODD_PARAM_RAD_n :
+!             ---------------------------------------
+!
+XDTRAD        = XTSTEP
+XDTRAD_CLONLY = XTSTEP
+LCLEAR_SKY    =.FALSE.
+NRAD_COLNBR   = 1000
+NRAD_DIAG     = 0
+CLW ='RRTM'
+CAER='SURF'
+CAOP='CLIM'
+CEFRADL='MART'
+CEFRADI='LIOU'
+COPWSW = 'FOUQ'
+COPISW = 'EBCU'
+COPWLW = 'SMSH'
+COPILW = 'EBCU'
+XFUDG = 1.
+LAERO_FT=.FALSE.
+LFIX_DAT=.FALSE.
+!
+#ifdef MNH_ECRAD
+!*      13bis.   SET DEFAULT VALUES FOR MODD_PARAM_ECRAD_n :
+!             ---------------------------------------
+!
+#if ( VER_ECRAD == 101 )
+NSWSOLVER = 0           ! 0: 'McICA 1: 'SPARTACUS' 2: 'SPARTACUS' + 3D effect                            
+NLWSOLVER = 0           ! 0: 'McICA 1: 'SPARTACUS' 2: 'SPARTACUS' + 3D effect 
+#endif
+#if ( VER_ECRAD == 140 )
+LSPEC_ALB = .FALSE.
+LSPEC_EMISS = .FALSE.
+
+
+!ALLOCATE(USER_ALB_DIFF(NSWB_MNH))
+!ALLOCATE(USER_ALB_DIR(NSWB_MNH))
+!ALLOCATE(USER_EMISS(NLWB_MNH))
+!PRINT*,USER_ALB_DIFF
+!USER_ALB_DIFF = (/0,0,0,0,0,0,0,0,0,0,0,0,0,0/)
+!USER_ALB_DIR = (/0,0,0,0,0,0,0,0,0,0,0,0,0,0/)
+!USER_EMISS = (/0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0/)
+SURF_TYPE="SNOW"
+
+NLWSOLVER = 1           ! 0: 'McICA 1: 'SPARTACUS' 2: 'SPARTACUS' + 3D effect 
+NSWSOLVER = 1          ! 0: 'McICA 1: 'SPARTACUS' 2: 'SPARTACUS' + 3D effect                            
+#endif
+! LEFF3D         = .TRUE.
+! LSIDEM         = .TRUE.
+NREG           = 3            ! Number of cloudy regions (3=TripleClouds)
+! LLWCSCA        = .TRUE.       ! LW cloud scattering
+! LLWASCA        = .TRUE.       ! LW aerosols scattering
+NLWSCATTERING = 2
+NAERMACC = 0
+! CGAS           = 'RRTMG-IFS'  ! Gas optics model
+NOVLP          = 1     ! overlap assumption ; 0= 'Max-Ran' ; 1= 'Exp-Ran'; 2 = 'Exp-Exp'
+NLIQOPT        = 3            ! 1: 'Monochromatic', 2: 'HuStamnes', 3: 'SOCRATES', 4: 'Slingo' 
+NICEOPT        = 3            ! 1: 'Monochromatic', 2: 'Fu-PSRAD', 3: 'Fu-IFS', 4: 'Baran', 5: 'Baran2016', 6: 'Baran2017' 
+! LSW_ML_E       = .FALSE.
+! LLW_ML_E       = .FALSE.
+! LPSRAD         = .FALSE.
+! 
+NRADLP = 1                    ! 0: ERA-15, 1: Zhang and Rossow, 2: Martin (1994) et Woods (2000)
+NRADIP = 1                    ! 0: 40 mum, 1: Liou and Ou (1994), 2: Liou and Ou (1994) improved, 3: Sun and Rikus (1999)
+XCLOUD_FRAC_STD = 1.0_JPRB ! change to 0.75 for more realistic distribution
+#endif
+!-------------------------------------------------------------------------------
+!
+!*      14.   SET DEFAULT VALUES FOR MODD_BLANK_n :
+!             -----------------------------------
+!
+XDUMMY1       = 0.
+XDUMMY2       = 0.
+XDUMMY3       = 0.
+XDUMMY4       = 0.
+XDUMMY5       = 0.
+XDUMMY6       = 0.
+XDUMMY7       = 0.
+XDUMMY8       = 0.
+!
+NDUMMY1       = 0
+NDUMMY2       = 0
+NDUMMY3       = 0
+NDUMMY4       = 0
+NDUMMY5       = 0
+NDUMMY6       = 0
+NDUMMY7       = 0
+NDUMMY8       = 0
+!
+LDUMMY1       = .TRUE.
+LDUMMY2       = .TRUE.
+LDUMMY3       = .TRUE.
+LDUMMY4       = .TRUE.
+LDUMMY5       = .TRUE.
+LDUMMY6       = .TRUE.
+LDUMMY7       = .TRUE.
+LDUMMY8       = .TRUE.
+!
+CDUMMY1       = ' '
+CDUMMY2       = ' '
+CDUMMY3       = ' '
+CDUMMY4       = ' '
+CDUMMY5       = ' '
+CDUMMY6       = ' '
+CDUMMY7       = ' '
+CDUMMY8       = ' '
+!
+!------------------------------------------------------------------------------
+!
+!*      15.   SET DEFAULT VALUES FOR MODD_FRC :
+!             ---------------------------------
+!
+IF (KMI == 1) THEN
+  LGEOST_UV_FRC      = .FALSE.
+  LGEOST_TH_FRC      = .FALSE.
+  LTEND_THRV_FRC      = .FALSE.
+  LTEND_UV_FRC       = .FALSE. 
+  LVERT_MOTION_FRC   = .FALSE.
+  LRELAX_THRV_FRC    = .FALSE.
+  LRELAX_UV_FRC      = .FALSE.
+  LRELAX_UVMEAN_FRC  = .FALSE.
+  XRELAX_TIME_FRC    = 10800.
+  XRELAX_HEIGHT_FRC  = 0.
+  CRELAX_HEIGHT_TYPE = "FIXE"
+  LTRANS             = .FALSE.
+  XUTRANS            = 0.0
+  XVTRANS            = 0.0
+  LPGROUND_FRC       = .FALSE.
+  LDEEPOC   = .FALSE.
+  XCENTX_OC = 16000.
+  XCENTY_OC = 16000.
+  XRADX_OC  =  8000.  
+  XRADY_OC  =  8000.
+END IF
+!
+!-------------------------------------------------------------------------------
+!
+!
+!*      16.   SET DEFAULT VALUES FOR MODD_PARAM_ICE :
+!             ---------------------------------------
+!
+CALL PARAM_ICEN_INIT(CPROGRAM, TFILENAM, .FALSE., TLUOUT%NLU, &
+                    &LDDEFAULTVAL=.TRUE., LDREADNAM=.FALSE., LDCHECK=.FALSE., KPRINT=0)
+!
+!-------------------------------------------------------------------------------
+!
+!
+!*      17.   SET DEFAULT VALUES FOR MODD_PARAM_KAFR_n :
+!             --------------------------------------------
+!
+XDTCONV       = MAX( 300.0,XTSTEP )
+NICE          = 1
+LREFRESH_ALL  = .TRUE.
+LCHTRANS      = .FALSE.
+LDOWN         = .TRUE.
+LSETTADJ      = .FALSE.
+XTADJD        = 3600.
+XTADJS        = 10800.
+LDIAGCONV     = .FALSE.
+NENSM         = 0
+!
+!-------------------------------------------------------------------------------
+!
+!
+!*      18.   SET DEFAULT VALUES FOR MODD_PARAM_MFSHALL_n :
+!             --------------------------------------------
+!
+CALL PARAM_MFSHALLN_INIT(CPROGRAM, TFILENAM, .FALSE., TLUOUT%NLU, &
+                        &LDDEFAULTVAL=.TRUE., LDREADNAM=.FALSE., LDCHECK=.FALSE., KPRINT=0)
+!
+!-------------------------------------------------------------------------------
+!
+!*      19.   SET DEFAULT VALUES FOR MODD_PARAM_C2R2 :
+!             ----------------------------------------
+!
+IF (KMI == 1) THEN
+  XNUC    = 1.0
+  XALPHAC = 3.0
+  XNUR    = 2.0
+  XALPHAR = 1.0
+!
+  LRAIN   = .TRUE.
+  LSEDC   = .TRUE.
+  LACTIT  = .FALSE.
+  LSUPSAT = .FALSE.
+  LDEPOC  = .FALSE.
+  XVDEPOC = 0.02 ! 2 cm/s
+  LACTTKE = .TRUE.
+!
+  HPARAM_CCN = 'XXX'
+  HINI_CCN   = 'XXX'
+  HTYPE_CCN  = 'X'
+!
+  XCHEN      = 0.0
+  XKHEN      = 0.0
+  XMUHEN     = 0.0
+  XBETAHEN   = 0.0
+!
+  XCONC_CCN   = 0.0
+  XAERDIFF    = 0.0
+  XAERHEIGHT  = 2000
+  XR_MEAN_CCN = 0.0
+  XLOGSIG_CCN = 0.0
+  XFSOLUB_CCN = 1.0
+  XACTEMP_CCN = 280.
+ENDIF
+!
+!-------------------------------------------------------------------------------
+!
+!*      19.BIS   SET DEFAULT VALUES FOR MODD_PARAM_LIMA :
+!                ----------------------------------------
+!
+IF (KMI == 1) THEN
+  CALL PARAM_LIMA_INIT(CPROGRAM, TFILENAM, .FALSE., TLUOUT%NLU, &
+                      &LDDEFAULTVAL=.TRUE., LDREADNAM=.FALSE., LDCHECK=.FALSE., KPRINT=0)
+ENDIF
+!
+!-------------------------------------------------------------------------------
+!
+!*      20.   SET DEFAULT VALUES FOR MODD_CH_MNHC_n
+!             -------------------------------------
+!
+LUSECHEM            = .FALSE.
+LUSECHAQ            = .FALSE.
+LUSECHIC            = .FALSE.
+LCH_INIT_FIELD      = .FALSE.
+LCH_CONV_SCAV       = .FALSE.
+LCH_CONV_LINOX      = .FALSE.
+LCH_PH              = .FALSE.
+LCH_RET_ICE         = .FALSE.
+XCH_PHINIT          = 5.2
+XRTMIN_AQ           = 5.e-8
+CCHEM_INPUT_FILE    = 'MNHC.input'
+CCH_TDISCRETIZATION = 'SPLIT'
+NCH_SUBSTEPS        = 1
+LCH_TUV_ONLINE      = .FALSE.
+CCH_TUV_LOOKUP      = 'PHOTO.TUV39'
+CCH_TUV_CLOUDS      = 'NONE'
+XCH_TUV_ALBNEW      = -1.
+XCH_TUV_DOBNEW      = -1.
+XCH_TUV_TUPDATE     = 600.
+CCH_VEC_METHOD      = 'MAX'
+NCH_VEC_LENGTH      = 50
+XCH_TS1D_TSTEP      = 600.
+CCH_TS1D_COMMENT    = 'no comment'
+CCH_TS1D_FILENAME   = 'IO1D'
+CSPEC_PRODLOSS      = ''
+CSPEC_BUDGET        = ''
+!
+!-------------------------------------------------------------------------------
+!
+!*      21.   SET DEFAULT VALUES FOR MODD_SERIES AND MODD_SERIE_n
+!             ---------------------------------------------------
+!
+IF (KMI == 1) THEN
+  LSERIES      = .FALSE.
+  LMASKLANDSEA = .FALSE.
+  LWMINMAX     = .FALSE.
+  LSURF        = .FALSE.
+ENDIF
+!
+NIBOXL = 1 !+ JPHEXT
+NIBOXH = 1 !+ 2*JPHEXT
+NJBOXL = 1 !+ JPHEXT
+NJBOXH = 1 !+ 2*JPHEXT
+NKCLS  = 1 !+ JPVEXT
+NKLOW  = 1 !+ JPVEXT
+NKMID  = 1 !+ JPVEXT
+NKUP   = 1 !+ JPVEXT
+NKCLA  = 1 !+ JPVEXT
+NBJSLICE = 1
+NJSLICEL(:) = 1 !+ JPHEXT
+NJSLICEH(:) = 1 !+ 2*JPHEXT
+NFREQSERIES  = INT(XSEGLEN /(100.*XTSTEP) )
+NFREQSERIES  = MAX(NFREQSERIES,1)
+!
+!-------------------------------------------------------------------------------
+!
+!*      22.   SET DEFAULT VALUES FOR MODD_MEAN_FIELD
+!             --------------------------------------
+!
+IF (KMI == 1) THEN
+  LMEAN_FIELD = .FALSE.
+  LCOV_FIELD  = .FALSE.
+ENDIF
+!
+!-------------------------------------------------------------------------------
+!
+!*      22.   SET DEFAULT VALUES FOR MODD_AEROSOL
+!             -----------------------------------
+IF (KMI == 1) THEN ! other values are defined in modd_ch_aerosol
+!
+! aerosol lognormal parameterization
+
+LVARSIGI  = .FALSE.   ! switch to active pronostic dispersion for I mode
+LVARSIGJ  = .FALSE.   ! switch to active pronostic dispersion for J mode
+LHETEROSO4 = .FALSE.  ! switch to active sulfates heteronegeous
+                      ! production
+LSEDIMAERO = .FALSE.  ! switch to active aerosol sedimentation
+LAERINIT   = .FALSE.  ! switch to initialize aerosol in arome
+CMINERAL      = "EQSAM"   ! mineral equilibrium scheme
+CORGANIC      = "MPMPO"   ! mineral equilibrium scheme
+CNUCLEATION   = "NONE" ! sulfates nucleation scheme
+LDEPOS_AER(:) = .FALSE.
+
+ENDIF
+
+!*      23.   SET DEFAULT VALUES FOR MODD_DUST and MODD_SALT
+!             ----------------------------------------------
+!
+IF (KMI == 1) THEN ! other values initialized in modd_dust
+  LDUST      = .FALSE.
+  NMODE_DST  = 3
+  LVARSIG    = .FALSE.
+  LSEDIMDUST = .FALSE.
+  LDEPOS_DST(:) = .FALSE.
+
+  LSALT      = .FALSE.
+  LVARSIG_SLT= .FALSE.
+  LSEDIMSALT = .FALSE.
+  LDEPOS_SLT(:)     = .FALSE.
+ENDIF
+!
+!-------------------------------------------------------------------------------
+!
+!
+!*      24.   SET DEFAULT VALUES FOR MODD_PASPOL           
+!             ----------------------------------
+!
+! other values initialized in modd_paspol
+!
+IF (KMI == 1) THEN 
+  LPASPOL    = .FALSE.
+  NRELEASE   = 0
+  CPPINIT(:) ='1PT'
+  XPPLAT(:)  = 0.
+  XPPLON (:) = 0.
+  XPPMASS(:) = 0.
+  XPPBOT(:)  = 0.
+  XPPTOP(:)  = 0.
+  CPPT1(:)   = "20010921090000"
+  CPPT2(:)   = "20010921090000"
+  CPPT3(:)   = "20010921091500"
+  CPPT4(:)   = "20010921091500"
+ENDIF
+!
+!-------------------------------------------------------------------------------
+!
+!
+!*      25.   SET DEFAULT VALUES FOR MODD_CONDSAMP         
+!             ----------------------------------
+!
+! other values initialized in modd_condsamp
+!
+IF (KMI == 1) THEN 
+  LCONDSAMP  = .FALSE.
+  NCONDSAMP  = 3
+  XRADIO(:)  = 900.
+  XSCAL(:)   = 1.
+  XHEIGHT_BASE = 100.
+  XDEPTH_BASE  = 100.
+  XHEIGHT_TOP  = 100.
+  XDEPTH_TOP   = 100.
+  NFINDTOP     = 0
+  XTHVP        = 0.25
+  LTPLUS       = .TRUE.
+ENDIF  
+!-------------------------------------------------------------------------------
+!
+!
+!*      26.   SET DEFAULT VALUES FOR MODD_LATZ_EDFLX      
+!             ----------------------------------
+!
+IF (KMI == 1) THEN 
+  LUV_FLX=.FALSE.
+  XUV_FLX1=3.E+14
+  XUV_FLX2=0.
+  LTH_FLX=.FALSE.
+  XTH_FLX=0.75
+ENDIF  
+#ifdef MNH_FOREFIRE
+!-------------------------------------------------------------------------------
+!
+!*      27.   SET DEFAULT VALUES FOR MODD_FOREFIRE         
+!             ----------------------------------
+!
+! other values initialized in modd_forefire
+!
+IF (KMI == 1) THEN 
+  LFOREFIRE = .FALSE.
+  LFFCHEM = .FALSE.
+  COUPLINGRES = 100.
+  NFFSCALARS = 0
+ENDIF  
+#endif                 
+!-------------------------------------------------------------------------------
+!
+!*      28.   SET DEFAULT VALUES FOR MODD_BLOWSNOW AND  MODD_BLOWSNOW_n       
+!             ----------------------------------------
+! 
+IF (KMI == 1) THEN
+   LBLOWSNOW  = .FALSE.
+   XALPHA_SNOW  = 3.
+   XRSNOW       = 4.
+   CSNOWSEDIM  = 'TABC'
+END IF
+LSNOWSUBL = .FALSE.
+!
+!
+!-------------------------------------------------------------------------------
+!
+!*      29.   SET DEFAULT VALUES FOR MODD_VISC           
+!             ----------------------------------
+!
+! other values initialized in modd_VISC
+!
+IF (KMI == 1) THEN
+  LVISC    = .FALSE.
+  LVISC_UVW    = .FALSE.
+  LVISC_TH    = .FALSE.
+  LVISC_SV    = .FALSE.
+  LVISC_R    = .FALSE.
+  XMU_V   = 0.
+  XPRANDTL = 0.
+ENDIF
+!
+!-------------------------------------------------------------------------------
+!
+!
+!*      30.   SET DEFAULT VALUES FOR MODD_DRAG           
+!             ----------------------------------
+!
+! other values initialized in modd_DRAG
+!
+IF (KMI == 1) THEN
+  LDRAG    = .FALSE.
+  LMOUNT   = .FALSE.
+  NSTART = 1
+  XHSTART = 0.
+ENDIF
+!
+!-------------------------------------------------------------------------------
+!
+!*      31.   SET DEFAULT VALUES FOR MODD_IBM_PARAMn         
+!             --------------------------------------
+!                                                           
+  LIBM           = .FALSE.
+  LIBM_TROUBLE   = .FALSE.
+  CIBM_ADV       = 'NOTHIN'
+  XIBM_EPSI      = 1.E-9
+  XIBM_IEPS      = 1.E+9
+  NIBM_ITR       = 8  
+  XIBM_RUG       = 0.01    ! (m^1.s^-0)
+  XIBM_VISC      = 1.56e-5 ! (m^2.s^-1)
+  XIBM_CNU       = 0.06    ! (m^0.s^-0)  
+
+  NIBM_LAYER_P = 2
+  NIBM_LAYER_Q = 2
+  NIBM_LAYER_R = 2
+  NIBM_LAYER_S = 2
+  NIBM_LAYER_T = 2
+  NIBM_LAYER_E = 2
+  NIBM_LAYER_V = 2
+
+  XIBM_RADIUS_P = 2.
+  XIBM_RADIUS_Q = 2.
+  XIBM_RADIUS_R = 2.
+  XIBM_RADIUS_S = 2.
+  XIBM_RADIUS_T = 2.
+  XIBM_RADIUS_E = 2.
+  XIBM_RADIUS_V = 2.
+
+  XIBM_POWERS_P = 1.
+  XIBM_POWERS_Q = 1.
+  XIBM_POWERS_R = 1.
+  XIBM_POWERS_S = 1.
+  XIBM_POWERS_T = 1.
+  XIBM_POWERS_E = 1.
+  XIBM_POWERS_V = 1.
+
+  CIBM_MODE_INTE3_P = 'LAI'
+  CIBM_MODE_INTE3_Q = 'LAI'
+  CIBM_MODE_INTE3_R = 'LAI'
+  CIBM_MODE_INTE3_S = 'LAI'
+  CIBM_MODE_INTE3_T = 'LAI'
+  CIBM_MODE_INTE3_E = 'LAI'
+  CIBM_MODE_INTE3_V = 'LAI'
+
+  CIBM_MODE_INTE1_P = 'CL2'
+  CIBM_MODE_INTE1_Q = 'CL2'
+  CIBM_MODE_INTE1_R = 'CL2'
+  CIBM_MODE_INTE1_S = 'CL2'
+  CIBM_MODE_INTE1_T = 'CL2'
+  CIBM_MODE_INTE1_E = 'CL2'
+  CIBM_MODE_INTE1NV = 'CL2'
+  CIBM_MODE_INTE1TV = 'CL2'
+  CIBM_MODE_INTE1CV = 'CL2'
+
+  CIBM_MODE_BOUND_P = 'SYM'
+  CIBM_MODE_BOUND_Q = 'SYM'
+  CIBM_MODE_BOUND_R = 'SYM'
+  CIBM_MODE_BOUND_S = 'SYM'
+  CIBM_MODE_BOUND_T = 'SYM'
+  CIBM_MODE_BOUND_E = 'SYM'
+  CIBM_MODE_BOUNT_V = 'ASY'
+  CIBM_MODE_BOUNN_V = 'ASY'
+  CIBM_MODE_BOUNC_V = 'ASY'
+
+  XIBM_FORC_BOUND_P = 0.
+  XIBM_FORC_BOUND_Q = 0.
+  XIBM_FORC_BOUND_R = 0.
+  XIBM_FORC_BOUND_S = 0. 
+  XIBM_FORC_BOUND_T = 0.
+  XIBM_FORC_BOUND_E = 0.
+  XIBM_FORC_BOUNN_V = 0.
+  XIBM_FORC_BOUNT_V = 0.
+  XIBM_FORC_BOUNC_V = 0.
+
+  CIBM_TYPE_BOUND_P = 'NEU'
+  CIBM_TYPE_BOUND_Q = 'NEU'
+  CIBM_TYPE_BOUND_R = 'NEU'
+  CIBM_TYPE_BOUND_S = 'NEU'
+  CIBM_TYPE_BOUND_T = 'NEU'
+  CIBM_TYPE_BOUND_E = 'NEU'
+  CIBM_TYPE_BOUNT_V = 'DIR'
+  CIBM_TYPE_BOUNN_V = 'DIR'
+  CIBM_TYPE_BOUNC_V = 'DIR'
+
+  CIBM_FORC_BOUND_P = 'CST'
+  CIBM_FORC_BOUND_Q = 'CST'
+  CIBM_FORC_BOUND_R = 'CST'
+  CIBM_FORC_BOUND_S = 'CST'
+  CIBM_FORC_BOUND_T = 'CST'
+  CIBM_FORC_BOUND_E = 'CST'
+  CIBM_FORC_BOUNN_V = 'CST'
+  CIBM_FORC_BOUNT_V = 'CST'
+  CIBM_FORC_BOUNC_V = 'CST'
+  CIBM_FORC_BOUNR_V = 'CST'
+
+!
+!-------------------------------------------------------------------------------
+!
+!*      32.   SET DEFAULT VALUES FOR MODD_RECYCL_PARAMn         
+!             --------------------------------------
+!
+  LRECYCL  = .FALSE.
+  LRECYCLN = .FALSE.
+  LRECYCLW = .FALSE.
+  LRECYCLE = .FALSE.
+  LRECYCLS = .FALSE.
+  XDRECYCLN  = 0.
+  XARECYCLN  = 0.
+  XDRECYCLW  = 0.
+  XARECYCLW  = 0.
+  XDRECYCLS  = 0.
+  XARECYCLS  = 0.
+  XDRECYCLE  = 0.
+  XARECYCLE  = 0.
+  NTMOY      = 0
+  NTMOYCOUNT = 0
+  NNUMBELT   = 28
+  XRCOEFF    = 0.2
+  XTBVTOP    = 500.
+  XTBVBOT    = 300.
+!
+!-------------------------------------------------------------------------------
+!
+!*      33.   SET DEFAULT VALUES FOR MODD_FIRE_n
+!             ----------------------------------
+!
+! Blaze fire model namelist
+!
+LBLAZE = .FALSE.              ! Flag for Fire model use, default FALSE
+!
+CPROPAG_MODEL = 'SANTONI2011' ! Fire propagation model (default SANTONI2011)
+!
+CHEAT_FLUX_MODEL   = 'EXS'    ! Sensible heat flux injection model (default EXS)
+CLATENT_FLUX_MODEL = 'EXP'    ! latent heat flux injection model (default EXP)
+XFERR = 0.8                   ! Energy released in flamming stage (only for EXP)
+!
+CFIRE_CPL_MODE = '2WAYCPL'    ! Coupling mode (default 2way coupled)
+CBMAPFILE = CINIFILE          ! File name of BMAP for FIR2ATM mode
+LINTERPWIND = .TRUE.          ! Horizontal interpolation of wind
+LSGBAWEIGHT = .FALSE.         ! Flag for use of weighted average method for SubGrid Burning Area computation
+!
+NFIRE_WENO_ORDER = 3          ! Weno order (1,3,5)
+NFIRE_RK_ORDER = 3            ! Runge Kutta order (1,2,3,4)
+!
+NREFINX = 1                   ! Refinement ratio X
+NREFINY = 1                   ! Refinement ratio Y
+!
+XCFLMAXFIRE = 0.8             ! Max CFL on fire mesh
+XLSDIFFUSION = 0.1            ! Numerical diffusion of LevelSet
+XROSDIFFUSION = 0.05          ! Numerical diffusion of ROS
+!
+XFLUXZEXT = 3.                ! Flux distribution on vertical caracteristic length
+XFLUXZMAX = 4. * XFLUXZEXT    ! Flux distribution on vertical max injetion height
+!
+XFLXCOEFTMP = 1.              ! Flux multiplicator. For testing
+!
+LWINDFILTER = .FALSE.         ! Fire wind filtering flag
+CWINDFILTER = 'EWAM'          ! Wind filter method (EWAM or WLIM)
+XEWAMTAU    = 20.             ! Time averaging constant for EWAM method (s)
+XWLIMUTH    = 8.              ! Thresehold wind value for WLIM method (m/s)
+XWLIMUTMAX  = 9.              ! Maximum wind value for WLIM method (m/s) (needs to be >= XWLIMUTH )
+!
+NNBSMOKETRACER = 1            ! Nb of smoke tracers
+!
+NWINDSLOPECPLMODE = 0         ! Flag for use of wind/slope in ROS (0 = wind + slope, 1 = wind only, 2 = slope only (U0=0))
+!
+!
+!
+!! DO NOT CHANGE BELOW PARAMETERS
+XFIREMESHSIZE(:) = 0.         ! Fire mesh size (dxf,dyf)
+LRESTA_ASE = .FALSE.          ! Flag for using ASE in RESTA file
+LRESTA_AWC = .FALSE.          ! Flag for using AWC in RESTA file
+LRESTA_EWAM = .FALSE.         ! Flag for using EWAM in RESTA file
+LRESTA_WLIM = .FALSE.         ! Flag for using WLIM in RESTA file
+
+!-------------------------------------------------------------------------------
+END SUBROUTINE DEFAULT_DESFM_n
diff --git a/src/PHYEX/ext/diagnos_les_mf.f90 b/src/PHYEX/ext/diagnos_les_mf.f90
new file mode 100644
index 0000000000000000000000000000000000000000..665d1ea7666f6047ab2a4d8e9343253fb2852446
--- /dev/null
+++ b/src/PHYEX/ext/diagnos_les_mf.f90
@@ -0,0 +1,244 @@
+!MNH_LIC Copyright 2009-2020 CNRS, Meteo-France and Universite Paul Sabatier
+!MNH_LIC This is part of the Meso-NH software governed by the CeCILL-C licence
+!MNH_LIC version 1. See LICENSE, CeCILL-C_V1-en.txt and CeCILL-C_V1-fr.txt
+!MNH_LIC for details. version 1.
+!-----------------------------------------------------------------
+!    ###########################
+     MODULE MODI_DIAGNOS_LES_MF
+!    ###########################
+!
+INTERFACE
+!
+!     #################################################################
+      SUBROUTINE DIAGNOS_LES_MF(KIU,KJU,KKU,PTIME_LES,               &
+                                PTHL_UP,PRT_UP,PRV_UP,PRC_UP,PRI_UP, &
+                                PU_UP, PV_UP, PTHV_UP, PW_UP,        &
+                                PFRAC_UP,PEMF,PDETR,PENTR,           &
+                                PWTHMF,PWTHVMF,PWRTMF,               &
+                                PWUMF,PWVMF,                         &
+                                KKLCL,KKETL,KKCTL)
+!     #################################################################
+!
+!*                    1.1  Declaration of Arguments
+!
+use modd_precision, only: MNHTIME
+!
+INTEGER,                INTENT(IN)  :: KIU, KJU, KKU ! 3D grid size
+REAL(kind=MNHTIME), DIMENSION(2), INTENT(OUT) :: PTIME_LES
+REAL, DIMENSION(:,:,:),   INTENT(IN)  :: PTHL_UP,PRT_UP,PRV_UP,&
+                                       PRC_UP,PRI_UP   ! updraft properties
+REAL, DIMENSION(:,:,:),   INTENT(IN)  :: PU_UP, PV_UP
+REAL, DIMENSION(:,:,:),   INTENT(IN)  :: PTHV_UP,PW_UP,&
+                                       PFRAC_UP,PEMF,PDETR,PENTR
+REAL, DIMENSION(:,:,:),   INTENT(IN)  :: PWTHMF,PWTHVMF,PWRTMF, &
+                                       PWUMF,PWVMF
+INTEGER, DIMENSION(:),  INTENT(IN)  :: KKLCL,KKETL,KKCTL
+                                           
+
+END SUBROUTINE DIAGNOS_LES_MF
+
+END INTERFACE
+!
+END MODULE MODI_DIAGNOS_LES_MF
+!
+!     #################################################################
+      SUBROUTINE DIAGNOS_LES_MF(KIU,KJU,KKU,PTIME_LES,               &
+                                PTHL_UP,PRT_UP,PRV_UP,PRC_UP,PRI_UP, &
+                                PU_UP, PV_UP, PTHV_UP, PW_UP,        &
+                                PFRAC_UP,PEMF,PDETR,PENTR,           &
+                                PWTHMF,PWTHVMF,PWRTMF,               &
+                                PWUMF,PWVMF,                         &
+                                KKLCL,KKETL,KKCTL)
+!     #################################################################
+!!
+!!****  *DIAGNOS_LES_MF* - Edit in File the updraft properties as
+!!                         LES diagnostics 
+!!
+!!    PURPOSE
+!!    -------
+!!****  The purpose of this routine is to write updraft variable as
+!!       LES diagnostics         
+!
+!!**  METHOD
+!!    ------
+!!
+!!    EXTERNAL
+!!    --------
+!!      
+!!    IMPLICIT ARGUMENTS
+!!    ------------------
+!!
+!!     REFERENCE
+!!     ---------
+!!      
+!!
+!!     AUTHOR
+!!     ------
+!!     J.pergaud
+!
+! Modifications:
+!  V. Masson      09/2010: Optimization
+!  P. Wautelet 28/03/2019: use MNHTIME for time measurement variables
+!! --------------------------------------------------------------------------
+!
+!*      0. DECLARATIONS
+!          ------------
+!
+USE MODD_LES
+use modd_precision, only: MNHTIME
+!
+USE MODE_MNH_TIMING
+!
+USE MODI_LES_VER_INT
+USE MODI_LES_MEAN_ll
+USE MODI_SHUMAN
+!
+IMPLICIT NONE
+
+!*                    0.1  Declaration of Arguments
+!
+!
+INTEGER,                INTENT(IN)  :: KIU, KJU, KKU ! 3D grid size
+REAL(kind=MNHTIME), DIMENSION(2), INTENT(OUT) :: PTIME_LES
+REAL, DIMENSION(:,:,:),   INTENT(IN)  :: PTHL_UP,PRT_UP,PRV_UP,&
+                                       PRC_UP,PRI_UP   ! updraft properties
+REAL, DIMENSION(:,:,:),   INTENT(IN)  :: PU_UP, PV_UP
+REAL, DIMENSION(:,:,:),   INTENT(IN)  :: PTHV_UP,PW_UP,&
+                                       PFRAC_UP,PEMF,PDETR,PENTR
+REAL, DIMENSION(:,:,:),   INTENT(IN)  :: PWTHMF,PWTHVMF,PWRTMF, &
+                                       PWUMF,PWVMF
+INTEGER, DIMENSION(:),  INTENT(IN)  :: KKLCL,KKETL,KKCTL
+                                           
+!
+!
+!                     0.2  Declaration of local variables
+!
+REAL, DIMENSION(:,:,:), ALLOCATABLE   :: ZTHLMFFLX_LES,ZRTMFFLX_LES, &
+                                         ZTHVMFFLX_LES,ZUMFFLX_LES, &
+                                         ZVMFFLX_LES
+REAL, DIMENSION(:,:,:), ALLOCATABLE   :: ZTHLUP_MF_LES,ZRTUP_MF_LES, &
+                                         ZRCUP_MF_LES,ZEMF_MF_LES,   &
+                                         ZDETR_MF_LES, ZENTR_MF_LES, & 
+                                         ZWUP_MF_LES,ZFRACUP_MF_LES, &
+                                         ZTHVUP_MF_LES,ZRVUP_MF_LES, &
+                                         ZRIUP_MF_LES
+REAL(kind=MNHTIME), DIMENSION(2) :: ZTIME1, ZTIME2
+!------------------------------------------------------------------------
+!
+
+CALL SECOND_MNH2(ZTIME1)
+
+ IF (LLES_CALL) THEN
+
+    ALLOCATE( ZTHLUP_MF_LES(KIU,KJU,NLES_K) )
+    ALLOCATE( ZRTUP_MF_LES(KIU,KJU,NLES_K) )
+    ALLOCATE( ZRVUP_MF_LES(KIU,KJU,NLES_K) )
+    ALLOCATE( ZRCUP_MF_LES(KIU,KJU,NLES_K) )
+    ALLOCATE( ZRIUP_MF_LES(KIU,KJU,NLES_K) )
+    ALLOCATE( ZEMF_MF_LES(KIU,KJU,NLES_K) )
+    ALLOCATE( ZDETR_MF_LES(KIU,KJU,NLES_K) )
+    ALLOCATE( ZENTR_MF_LES(KIU,KJU,NLES_K) )
+    ALLOCATE( ZWUP_MF_LES(KIU,KJU,NLES_K) )
+    ALLOCATE( ZFRACUP_MF_LES(KIU,KJU,NLES_K) )
+    ALLOCATE( ZTHVUP_MF_LES(KIU,KJU,NLES_K) )
+
+    ALLOCATE( ZTHLMFFLX_LES(KIU,KJU,NLES_K) )
+    ALLOCATE( ZRTMFFLX_LES (KIU,KJU,NLES_K) )
+    ALLOCATE( ZTHVMFFLX_LES(KIU,KJU,NLES_K) )
+    ALLOCATE( ZUMFFLX_LES  (KIU,KJU,NLES_K) )
+    ALLOCATE( ZVMFFLX_LES  (KIU,KJU,NLES_K) )
+
+    
+    CALL LES_VER_INT(MZF(PWTHMF)  ,ZTHLMFFLX_LES  )
+    CALL LES_MEAN_ll(ZTHLMFFLX_LES,LLES_CURRENT_CART_MASK, &
+                    X_LES_SUBGRID_WTHLMF(:,NLES_CURRENT_TCOUNT,1))
+    
+    CALL LES_VER_INT( MZF(PWRTMF)  ,ZRTMFFLX_LES  )
+    CALL LES_MEAN_ll (ZRTMFFLX_LES , LLES_CURRENT_CART_MASK,          &
+                    X_LES_SUBGRID_WRTMF(:,NLES_CURRENT_TCOUNT,1)     )
+                    
+    CALL LES_VER_INT( MZF(PWUMF)  ,ZUMFFLX_LES  )
+    CALL LES_MEAN_ll (ZUMFFLX_LES , LLES_CURRENT_CART_MASK,              &
+                    X_LES_SUBGRID_WUMF(:,NLES_CURRENT_TCOUNT,1)     )
+                    
+    CALL LES_VER_INT( MZF(PWVMF)  ,ZVMFFLX_LES  )
+    CALL LES_MEAN_ll (ZVMFFLX_LES , LLES_CURRENT_CART_MASK,                   &
+                    X_LES_SUBGRID_WVMF(:,NLES_CURRENT_TCOUNT,1)     )
+                    
+    CALL LES_VER_INT( MZF(PWTHVMF)  ,ZTHVMFFLX_LES  )
+    CALL LES_MEAN_ll (ZTHVMFFLX_LES , LLES_CURRENT_CART_MASK,    &
+                    X_LES_SUBGRID_WTHVMF(:,NLES_CURRENT_TCOUNT,1)     )
+                    
+
+    CALL LES_VER_INT( MZF(PTHL_UP)  ,ZTHLUP_MF_LES  )
+    CALL LES_MEAN_ll (ZTHLUP_MF_LES , LLES_CURRENT_CART_MASK,    &
+                   X_LES_SUBGRID_THLUP_MF(:,NLES_CURRENT_TCOUNT,1)     )
+                   
+    CALL LES_VER_INT( MZF(PRT_UP)  ,ZRTUP_MF_LES  )
+    CALL LES_MEAN_ll (ZRTUP_MF_LES , LLES_CURRENT_CART_MASK,       &
+                    X_LES_SUBGRID_RTUP_MF(:,NLES_CURRENT_TCOUNT,1)     )
+                    
+    CALL LES_VER_INT( MZF(PRV_UP)  ,ZRVUP_MF_LES  )
+    CALL LES_MEAN_ll (ZRVUP_MF_LES , LLES_CURRENT_CART_MASK,       &
+                    X_LES_SUBGRID_RVUP_MF(:,NLES_CURRENT_TCOUNT,1)     )
+                    
+    CALL LES_VER_INT( MZF(PRC_UP)  ,ZRCUP_MF_LES  )
+    CALL LES_MEAN_ll (ZRCUP_MF_LES , LLES_CURRENT_CART_MASK,        &
+                    X_LES_SUBGRID_RCUP_MF(:,NLES_CURRENT_TCOUNT,1)     )
+                    
+    CALL LES_VER_INT( MZF(PRI_UP)  ,ZRIUP_MF_LES  )
+    CALL LES_MEAN_ll (ZRIUP_MF_LES , LLES_CURRENT_CART_MASK,        &
+                    X_LES_SUBGRID_RIUP_MF(:,NLES_CURRENT_TCOUNT,1)     )            
+                    
+    CALL LES_VER_INT( MZF(PEMF)  ,ZEMF_MF_LES  )
+    CALL LES_MEAN_ll (ZEMF_MF_LES , LLES_CURRENT_CART_MASK,       &
+                   X_LES_SUBGRID_MASSFLUX(:,NLES_CURRENT_TCOUNT,1)     )
+                   
+    CALL LES_VER_INT( MZF(PDETR)  ,ZDETR_MF_LES  )
+    CALL LES_MEAN_ll (ZDETR_MF_LES , LLES_CURRENT_CART_MASK,       &
+                   X_LES_SUBGRID_DETR(:,NLES_CURRENT_TCOUNT,1)         )
+                   
+    CALL LES_VER_INT( MZF(PENTR)  ,ZENTR_MF_LES  )
+    CALL LES_MEAN_ll (ZENTR_MF_LES , LLES_CURRENT_CART_MASK,       &
+                   X_LES_SUBGRID_ENTR(:,NLES_CURRENT_TCOUNT,1)     )
+                   
+    CALL LES_VER_INT( MZF(PW_UP)  ,ZWUP_MF_LES  )
+    CALL LES_MEAN_ll (ZWUP_MF_LES , LLES_CURRENT_CART_MASK,       &
+                   X_LES_SUBGRID_WUP_MF(:,NLES_CURRENT_TCOUNT,1)     )
+                   
+    CALL LES_VER_INT( MZF(PFRAC_UP)  ,ZFRACUP_MF_LES  )
+    CALL LES_MEAN_ll (ZFRACUP_MF_LES , LLES_CURRENT_CART_MASK,       &
+                   X_LES_SUBGRID_FRACUP(:,NLES_CURRENT_TCOUNT,1)     )
+                   
+    CALL LES_VER_INT( MZF(PTHV_UP)  ,ZTHVUP_MF_LES  )
+    CALL LES_MEAN_ll (ZTHVUP_MF_LES , LLES_CURRENT_CART_MASK,       &
+                   X_LES_SUBGRID_THVUP_MF(:,NLES_CURRENT_TCOUNT,1)     )
+                   
+     
+        
+    DEALLOCATE( ZTHLMFFLX_LES )
+    DEALLOCATE( ZRTMFFLX_LES )
+    DEALLOCATE( ZTHVMFFLX_LES )
+    DEALLOCATE( ZUMFFLX_LES  )
+    DEALLOCATE( ZVMFFLX_LES  )
+
+    
+    DEALLOCATE( ZTHLUP_MF_LES )
+    DEALLOCATE( ZRTUP_MF_LES )
+    DEALLOCATE( ZRVUP_MF_LES )    
+    DEALLOCATE( ZRCUP_MF_LES )
+    DEALLOCATE( ZRIUP_MF_LES )
+    DEALLOCATE( ZENTR_MF_LES )
+    DEALLOCATE( ZDETR_MF_LES )
+    DEALLOCATE( ZEMF_MF_LES )
+    DEALLOCATE( ZWUP_MF_LES )
+    DEALLOCATE( ZFRACUP_MF_LES )
+    DEALLOCATE( ZTHVUP_MF_LES )
+    
+ENDIF
+
+CALL SECOND_MNH2(ZTIME2)
+PTIME_LES =             ZTIME2 - ZTIME1
+XTIME_LES = XTIME_LES + ZTIME2 - ZTIME1
+
+END SUBROUTINE DIAGNOS_LES_MF           
diff --git a/src/PHYEX/ext/endstep.f90 b/src/PHYEX/ext/endstep.f90
new file mode 100644
index 0000000000000000000000000000000000000000..97734d72bd8ecad1aa8e4163c203fbfe7ab5fe57
--- /dev/null
+++ b/src/PHYEX/ext/endstep.f90
@@ -0,0 +1,668 @@
+!MNH_LIC Copyright 1994-2021 CNRS, Meteo-France and Universite Paul Sabatier
+!MNH_LIC This is part of the Meso-NH software governed by the CeCILL-C licence
+!MNH_LIC version 1. See LICENSE, CeCILL-C_V1-en.txt and CeCILL-C_V1-fr.txt
+!MNH_LIC for details. version 1.
+!-----------------------------------------------------------------
+!     ###################
+      MODULE MODI_ENDSTEP
+!     ###################
+!
+INTERFACE
+!
+      SUBROUTINE ENDSTEP        (PTSTEP,KRR,KSV,KTCOUNT,KMI,               &
+                                 HUVW_ADV_SCHEME,HTEMP_SCHEME, PRHODJ,     &
+                                 PUS,PVS,PWS,PDRYMASSS,                    &
+                                 PTHS,PRS,PTKES,PSVS,                      &
+                                 PLSUS,PLSVS,PLSWS,                        &
+                                 PLSTHS,PLSRVS,PLSZWSS,                    &
+                                 PLBXUS,PLBXVS,PLBXWS,                     &
+                                 PLBXTHS,PLBXRS,PLBXTKES,PLBXSVS,          &
+                                 PLBYUS,PLBYVS,PLBYWS,                     &
+                                 PLBYTHS,PLBYRS,PLBYTKES,PLBYSVS,          &
+                                 PUM,PVM,PWM,PZWS,                         &
+                                 PUT,PVT,PWT,PPABST,PDRYMASST,             &
+                                 PTHT,PRT,PTHM,PRCM,PPABSM,PTKET,PSVT,     &
+                                 PLSUM,PLSVM,PLSWM,                        &
+                                 PLSTHM,PLSRVM,PLSZWSM,                    &
+                                 PLBXUM,PLBXVM,PLBXWM,                     &
+                                 PLBXTHM,PLBXRM,PLBXTKEM,PLBXSVM,          &
+                                 PLBYUM,PLBYVM,PLBYWM,                     &
+                                 PLBYTHM,PLBYRM,PLBYTKEM,PLBYSVM           )
+!
+REAL,                     INTENT(IN) :: PTSTEP        !  Time step
+INTEGER,                  INTENT(IN) :: KRR           !  Number of water var.
+INTEGER,                  INTENT(IN) :: KSV           !  Number of scal. var.
+INTEGER,                  INTENT(IN) :: KTCOUNT       !  Temporal loop COUNTer
+INTEGER,                  INTENT(IN) :: KMI           !  Model index
+CHARACTER(LEN=6),         INTENT(IN) :: HUVW_ADV_SCHEME ! advection scheme for wind
+CHARACTER(LEN=4),         INTENT(IN) :: HTEMP_SCHEME  ! Temporal scheme
+REAL, DIMENSION(:,:,:),   INTENT(IN) :: PRHODJ        ! (Rho) dry * Jacobian
+!
+REAL, DIMENSION(:,:,:),   INTENT(IN) :: PUS,PVS,PWS,   & ! 
+                                        PTHS,PTKES       ! variables at 
+REAL, DIMENSION(:,:,:,:), INTENT(IN) :: PRS,PSVS         !    t+dt
+!
+REAL,                     INTENT(IN) :: PDRYMASSS           !   Md source
+!
+REAL, DIMENSION(:,:,:),   INTENT(IN) :: PLSUS,PLSVS,PLSWS,& ! Large Scale 
+                                        PLSTHS,PLSRVS       ! fields tendencies
+!
+REAL, DIMENSION(:,:),     INTENT(IN) :: PLSZWSS               ! Large Scale fields tendencies
+REAL, DIMENSION(:,:,:),   INTENT(IN) :: PLBXUS,PLBXVS,PLBXWS,  &  !
+                                        PLBXTHS,PLBXTKES          ! LBX tendancy 
+REAL, DIMENSION(:,:,:,:), INTENT(IN) :: PLBXRS,PLBXSVS            ! 
+!
+REAL, DIMENSION(:,:,:),   INTENT(IN) :: PLBYUS,PLBYVS,PLBYWS,&    !     
+                                        PLBYTHS,PLBYTKES          ! LBY tendancy 
+REAL, DIMENSION(:,:,:,:), INTENT(IN) :: PLBYRS,PLBYSVS            !  
+!  
+REAL, DIMENSION(:,:,:), INTENT(INOUT) :: PUM,PVM,PWM! Variables at t-dt
+REAL, DIMENSION(:,:,:), INTENT(INOUT) :: PUT,PVT,PWT,PPABST,PTHT,&!
+                                         PTKET              ! Variables at
+REAL, DIMENSION(:,:,:,:),INTENT(INOUT):: PRT,PSVT                 !     t
+REAL, DIMENSION(:,:,:), INTENT(INOUT) :: PTHM, PRCM,PPABSM  ! Variables at t-Dt
+REAL,                    INTENT(INOUT):: PDRYMASST                !
+!
+REAL, DIMENSION(:,:,:), INTENT(INOUT) :: PLSUM,PLSVM,PLSWM,& ! Large Scale fields
+                                         PLSTHM,PLSRVM       !     at t-dt
+REAL, DIMENSION(:,:),   INTENT(INOUT) :: PLSZWSM  ! Large Scale fields at t-dt
+!
+REAL, DIMENSION(:,:,:), INTENT(INOUT)  :: PLBXUM,PLBXVM,PLBXWM,   & ! 
+                                          PLBXTHM,PLBXTKEM          ! LBX fields
+REAL, DIMENSION(:,:,:,:), INTENT(INOUT):: PLBXRM,PLBXSVM            !
+!
+REAL, DIMENSION(:,:,:), INTENT(INOUT)  :: PLBYUM,PLBYVM,PLBYWM,   & ! 
+                                          PLBYTHM,PLBYTKEM          ! LBY fields
+REAL, DIMENSION(:,:,:,:), INTENT(INOUT):: PLBYRM,PLBYSVM            ! 
+REAL, DIMENSION(:,:),     INTENT(INOUT) :: PZWS                  ! significant wave height
+!
+END SUBROUTINE ENDSTEP
+!
+END INTERFACE
+!
+END MODULE MODI_ENDSTEP
+!
+!
+!
+!     ######################################################################
+      SUBROUTINE ENDSTEP        (PTSTEP,KRR,KSV,KTCOUNT,KMI,               &
+                                 HUVW_ADV_SCHEME,HTEMP_SCHEME, PRHODJ,     &
+                                 PUS,PVS,PWS,PDRYMASSS,                    &
+                                 PTHS,PRS,PTKES,PSVS,                      &
+                                 PLSUS,PLSVS,PLSWS,                        &
+                                 PLSTHS,PLSRVS,PLSZWSS,                    &
+                                 PLBXUS,PLBXVS,PLBXWS,                     &
+                                 PLBXTHS,PLBXRS,PLBXTKES,PLBXSVS,          &
+                                 PLBYUS,PLBYVS,PLBYWS,                     &
+                                 PLBYTHS,PLBYRS,PLBYTKES,PLBYSVS,          &
+                                 PUM,PVM,PWM,PZWS,                         &
+                                 PUT,PVT,PWT,PPABST,PDRYMASST,             &
+                                 PTHT,PRT,PTHM,PRCM,PPABSM,PTKET,PSVT,     &
+                                 PLSUM,PLSVM,PLSWM,                        &
+                                 PLSTHM,PLSRVM,PLSZWSM,                    &
+                                 PLBXUM,PLBXVM,PLBXWM,                     &
+                                 PLBXTHM,PLBXRM,PLBXTKEM,PLBXSVM,          &
+                                 PLBYUM,PLBYVM,PLBYWM,                     &
+                                 PLBYTHM,PLBYRM,PLBYTKEM,PLBYSVM           )
+!     ######################################################################
+!
+!!****  *ENDSTEP* - temporal advance and asselin filter for all variables
+!!        (replaces the previous endstep_dyn and endstep_scalar subroutines)
+!!
+!!    PURPOSE
+!!    -------
+!!
+!!    The purpose of ENDSTEP is to apply the asselin filter, perform
+!!    the time advance and thereby finalize the time step.
+!
+!
+!!**  METHOD
+!!    ------
+!!    
+!!    The filtered values of the prognostic variables at t is obtained
+!!    by linear combination of variables at t-dt, t, and t+dt.
+!!    This value is put into the array containing the t-dt value.
+!!    To perform the time swapping, the t+dt values are put into the arrays 
+!!    containing the t values.
+!!
+!!    In case of cold start (first time step), indicated by the value 'START'
+!!    of CCONF in module MODD_CONF, a simple time advance is performed.
+!!
+!!    The swapping for the absolute pressure function is only a copy of time t in
+!!    time (t-dt).
+!!
+!!    Temporal advances of large scale, lateral boundarie and SST fields
+!!    are also made in this subroutine.
+!!
+!!    The different sources terms are stored for the budget computations.
+!!    
+!!    EXTERNAL
+!!    --------
+!!      BUDGET      : Stores the different budget components
+!!
+!!    IMPLICIT ARGUMENTS
+!!    ------------------
+!!    MODULE MODD_DYN containing XASSELIN
+!!    MODULE MODD_CONF containing CCONF
+!!    MODULE MODD_CTURB containing XTKEMIN, XEPSMIN
+!!    MODULE MODD_BUDGET:
+!!         NBUMOD       : model in which budget is calculated
+!!         NBUTSHIFT    : temporal shift for budgets writing
+!!
+!!    REFERENCE
+!!    ---------
+!!    Book2 of documentation
+!!
+!!    AUTHOR
+!!    ------
+!!    P. Bougeault  Meteo France
+!!
+!!    MODIFICATIONS
+!!    -------------
+!!
+!!    original     22/06/94
+!!    corrections  01/09/94 (J. P. Lafore)
+!!     "           07/11/94 (J.Stein)   pressure function swapping
+!!    update       03/01/94 (J. P. Lafore) Total mass of dry air Md evolution
+!!                 20/03/95 (J.Stein )   remove R from the historical variables
+!!                                      + switch for TKE unused
+!!                 01/04/95 (Ph. Hereil J. Nicolau) add the budget computation
+!!                 30/08/95 (J.Stein)    remove the positivity control and 
+!!                        correct the bug for PRM and PSVM for the cold start
+!!                 16/10/95 (J. Stein)     change the budget calls 
+!!                 12/10/96 (J. Stein)     add the SRC temporal evolution
+!!                 20/12/96 (J.-P. Pinty)  update the CALL BUDGET
+!!                 03/09/96 (J. P. Lafore) temporal advance of LS scalar fields
+!!                 22/06/97 (J. Stein)     add the absolute pressure
+!!                 13/03/97 (J. P. Lafore) add "surfacic" LS fields
+!!                 24/09/97 (V. Masson)    positive values for ls fields
+!!                 10/01/98 (J. Stein)     use the LB fields
+!!                 20/04/98 (P. Josse)     temporal evolution of SST
+!!                 18/09/98 (P. Jabouille) merge endstep_dyn and endstep_scalar
+!!                 08/12/00 (P. Jabouille) minimum values for hydrometeors
+!!                 22/06/01 (P. Jabouille) use XSVMIN
+!!                 06/11/02 (V. Masson)    update the budget calls
+!!                 01/2004  (V. Masson)  surface externalization
+!!                 05/2006                Remove KEPS
+!!                 10/2006  (Maric, Lac)  modification for PPM schemes
+!!                 10/2009  (C.Lac)       Correction on FIT temporal scheme for variables
+!!                                         advected with PPM
+!!                 04/2013  (C.Lac)       FIT for all the variables     
+!!                 04/2014  (C.Lac)       Check on the positivity of PSVT
+!!                 J.Escobar : 15/09/2015 : WENO5 & JPHEXT <> 1
+!!                 02/2019  (S. Bielli)  Sea salt : significant sea wave height influences salt emission; 5 salt modes
+!  P. Wautelet    02/2020: use the new data structures and subroutines for budgets
+!  P. Wautelet    02/2022:  add sea salt
+!------------------------------------------------------------------------------
+!
+!*      0.   DECLARATIONS
+!            ------------
+!
+USE MODD_BLOWSNOW
+USE MODD_BLOWSNOW_n
+use modd_budget,     only: lbudget_u,  lbudget_v,  lbudget_w,  lbudget_th, lbudget_tke, lbudget_rv,  lbudget_rc, &
+                           lbudget_rr, lbudget_ri, lbudget_rs, lbudget_rg, lbudget_rh,  lbudget_sv,  lbu_enable, &
+                           NBUDGET_U,  NBUDGET_V,  NBUDGET_W,  NBUDGET_TH, NBUDGET_TKE, NBUDGET_RV,  NBUDGET_RC, &
+                           NBUDGET_RR, NBUDGET_RI, NBUDGET_RS, NBUDGET_RG, NBUDGET_RH,  NBUDGET_SV1,             &
+                           nbustep, tbudgets
+USE MODD_CH_AEROSOL, ONLY: LORILAM
+USE MODD_CONF
+USE MODD_TURB_n,     ONLY: XTKEMIN
+USE MODD_DUST,       ONLY: LDUST
+USE MODD_SALT,       ONLY: LSALT
+USE MODD_DYN
+USE MODD_GRID_n
+USE MODD_LBC_n,      ONLY: CLBCX, CLBCY
+USE MODD_NSV,        ONLY: XSVMIN, NSV_CHEMBEG, NSV_CHEMEND, &
+                           NSV_AERBEG, NSV_AEREND,&
+                           NSV_DSTBEG, NSV_DSTEND,&
+                           NSV_SLTBEG, NSV_SLTEND,&
+                           NSV_SNWBEG, NSV_SNWEND
+USE MODD_PARAM_C2R2, ONLY: LACTIT
+USE MODD_PARAM_LIMA, ONLY: LACTIT_LIMA=>LACTIT
+
+use mode_budget,     only: Budget_store_end, Budget_store_init
+
+USE MODI_SHUMAN
+!
+USE MODE_ll
+!
+IMPLICIT NONE
+!
+!*      0.1  DECLARATIONS OF ARGUMENTS
+!
+!
+REAL,                     INTENT(IN) :: PTSTEP        !  Time step
+INTEGER,                  INTENT(IN) :: KRR           !  Number of water var.
+INTEGER,                  INTENT(IN) :: KSV           !  Number of scal. var.
+INTEGER,                  INTENT(IN) :: KTCOUNT       !  Temporal loop COUNTer
+INTEGER,                  INTENT(IN) :: KMI           !  Model index
+CHARACTER(LEN=6),         INTENT(IN) :: HUVW_ADV_SCHEME ! advection scheme for wind
+CHARACTER(LEN=4),         INTENT(IN) :: HTEMP_SCHEME  ! Temporal scheme
+REAL, DIMENSION(:,:,:),   INTENT(IN) :: PRHODJ        ! (Rho) dry * Jacobian
+!
+REAL, DIMENSION(:,:,:),   INTENT(IN) :: PUS,PVS,PWS,   & ! 
+                                        PTHS,PTKES       ! variables at 
+REAL, DIMENSION(:,:,:,:), INTENT(IN) :: PRS,PSVS         !    t+dt
+!
+REAL,                     INTENT(IN) :: PDRYMASSS           !   Md source
+!
+REAL, DIMENSION(:,:,:),   INTENT(IN) :: PLSUS,PLSVS,PLSWS,& !    Large Scale 
+                                        PLSTHS,PLSRVS       ! fields tendencies
+REAL, DIMENSION(:,:),     INTENT(IN) :: PLSZWSS               ! Large Scale fields tendencies
+!
+REAL, DIMENSION(:,:,:),   INTENT(IN) :: PLBXUS,PLBXVS,PLBXWS,  &  !
+                                        PLBXTHS,PLBXTKES          ! LBX tendancy 
+REAL, DIMENSION(:,:,:,:), INTENT(IN) :: PLBXRS,PLBXSVS            ! 
+!
+REAL, DIMENSION(:,:,:),   INTENT(IN) :: PLBYUS,PLBYVS,PLBYWS,&    !     
+                                        PLBYTHS,PLBYTKES          ! LBY tendancy 
+REAL, DIMENSION(:,:,:,:), INTENT(IN) :: PLBYRS,PLBYSVS            !  
+!  
+REAL, DIMENSION(:,:,:), INTENT(INOUT) :: PUM,PVM,PWM! Variables at t-dt
+REAL, DIMENSION(:,:,:), INTENT(INOUT) :: PUT,PVT,PWT,PPABST,PTHT,&!
+                                         PTKET              ! Variables at
+REAL, DIMENSION(:,:,:), INTENT(INOUT) :: PTHM, PRCM, PPABSM  ! Variables at t-Dt
+REAL, DIMENSION(:,:,:,:),INTENT(INOUT):: PRT,PSVT                 !     t
+REAL,                    INTENT(INOUT):: PDRYMASST                ! 
+!
+REAL, DIMENSION(:,:,:), INTENT(INOUT) :: PLSUM,PLSVM,PLSWM,& ! Large Scale fields
+                                         PLSTHM,PLSRVM       !     at t-dt
+!
+REAL, DIMENSION(:,:),   INTENT(INOUT) :: PLSZWSM  ! Large Scale fields at t-dt
+!
+REAL, DIMENSION(:,:,:), INTENT(INOUT)  :: PLBXUM,PLBXVM,PLBXWM,   & ! 
+                                          PLBXTHM,PLBXTKEM          ! LBX fields
+REAL, DIMENSION(:,:,:,:), INTENT(INOUT):: PLBXRM,PLBXSVM            !
+!
+REAL, DIMENSION(:,:,:), INTENT(INOUT)  :: PLBYUM,PLBYVM,PLBYWM,   & ! 
+                                          PLBYTHM,PLBYTKEM          ! LBY fields
+REAL, DIMENSION(:,:,:,:), INTENT(INOUT):: PLBYRM,PLBYSVM            !   
+!
+REAL, DIMENSION(:,:),     INTENT(INOUT) :: PZWS                  ! significant wave height
+!
+!*      0.2  DECLARATIONS OF LOCAL VARIABLES
+!
+INTEGER:: JSV                  ! loop counters
+INTEGER :: IIB, IIE  ! index of first and last inner mass points along x
+INTEGER :: IJB, IJE  ! index of first and last inner mass points along y
+real, dimension(:,:,:), allocatable :: zrhodjontime
+real, dimension(:,:,:), allocatable :: zwork
+!
+!------------------------------------------------------------------------------
+!
+CALL GET_INDICE_ll (IIB,IJB,IIE,IJE)
+!
+!*      1.   ASSELIN FILTER
+!
+IF ((HUVW_ADV_SCHEME(1:3)=='CEN').AND. (HTEMP_SCHEME == 'LEFR')) THEN
+  IF( KTCOUNT /= 1 .OR. CCONF /= 'START' ) THEN
+     PUM(:,:,:)=(1.-XASSELIN)*PUT(:,:,:)+0.5*XASSELIN*(PUM(:,:,:)+PUS(:,:,:))
+     PVM(:,:,:)=(1.-XASSELIN)*PVT(:,:,:)+0.5*XASSELIN*(PVM(:,:,:)+PVS(:,:,:))
+     PWM(:,:,:)=(1.-XASSELIN)*PWT(:,:,:)+0.5*XASSELIN*(PWM(:,:,:)+PWS(:,:,:))
+  END IF
+END IF
+
+!*      1.   TEMPORAL ADVANCE OF PROGNOSTIC VARIABLES
+!
+PPABSM(:,:,:) = PPABST(:,:,:)
+!
+IF (LACTIT .OR. LACTIT_LIMA) THEN
+   PTHM(:,:,:)   = PTHT(:,:,:)
+   PRCM(:,:,:)   = PRT(:,:,:,2)
+END IF
+
+PUT(:,:,:)=PUS(:,:,:)
+PVT(:,:,:)=PVS(:,:,:)
+PWT(:,:,:)=PWS(:,:,:)
+!
+PDRYMASST = PDRYMASST + PTSTEP * PDRYMASSS
+!
+PTHT(:,:,:)=PTHS(:,:,:)
+!
+! Moisture
+!
+PRT(:,:,:,1:KRR)=PRS(:,:,:,1:KRR)
+!
+! Turbulence
+!
+IF (SIZE(PTKET,1) /= 0) PTKET(:,:,:)=PTKES(:,:,:)
+!
+! Other scalars
+!
+PSVT(:,:,:,1:KSV)=PSVS(:,:,:,1:KSV)
+!
+IF(LBLOWSNOW) THEN
+   DO JSV=1,(NBLOWSNOW_2D)
+       XSNWCANO(:,:,JSV) = XRSNWCANOS(:,:,JSV)
+   END DO
+!*         MINIMUM VALUE FOR BLOWING SNOW
+!
+   WHERE(XSNWCANO(:,:,:)<1.E-20)
+       XSNWCANO(:,:,:)=0.
+   END WHERE
+
+   IF (SIZE(PSVT,4) > 1) THEN
+     WHERE(PSVT(:,:,:,NSV_SNWBEG:NSV_SNWEND)<1.E-20)
+       PSVT(:,:,:,NSV_SNWBEG:NSV_SNWEND)=0.
+     END WHERE
+   END IF
+!
+END IF
+!
+IF (LWEST_ll( ) .AND. CLBCX(1)=='OPEN') THEN
+ DO JSV=1,KSV
+   PSVT(IIB,:,:,JSV)=MAX(PSVT(IIB,:,:,JSV),XSVMIN(JSV))
+   PSVT(IIB-1,:,:,JSV)=MAX(PSVT(IIB-1,:,:,JSV),XSVMIN(JSV))
+ END DO
+END IF
+!
+IF (LEAST_ll( ) .AND. CLBCX(2)=='OPEN') THEN
+ DO JSV=1,KSV
+   PSVT(IIE,:,:,JSV)=MAX(PSVT(IIE,:,:,JSV),XSVMIN(JSV))
+   PSVT(IIE+1,:,:,JSV)=MAX(PSVT(IIE+1,:,:,JSV),XSVMIN(JSV))
+ END DO
+END IF
+!
+IF (LSOUTH_ll( ) .AND. CLBCY(1)=='OPEN') THEN
+ DO JSV=1,KSV
+   PSVT(:,IJB,:,JSV)=MAX(PSVT(:,IJB,:,JSV),XSVMIN(JSV))
+   PSVT(:,IJB-1,:,JSV)=MAX(PSVT(:,IJB-1,:,JSV),XSVMIN(JSV))
+ END DO
+END IF
+!
+IF (LNORTH_ll( ) .AND. CLBCY(2)=='OPEN') THEN
+ DO JSV=1,KSV
+   PSVT(:,IJE,:,JSV)=MAX(PSVT(:,IJE,:,JSV),XSVMIN(JSV))
+   PSVT(:,IJE+1,:,JSV)=MAX(PSVT(:,IJE+1,:,JSV),XSVMIN(JSV))
+ END DO
+END IF
+!------------------------------------------------------------------------------
+!
+!*      4.   TEMPORAL ADVANCE OF THE LARGE SCALE FIELDS
+!
+!
+IF (SIZE(PLSUS,1) /= 0) THEN
+  PLSUM(:,:,:)  = PLSUM(:,:,:)  + PTSTEP * PLSUS(:,:,:)
+  PLSVM(:,:,:)  = PLSVM(:,:,:)  + PTSTEP * PLSVS(:,:,:)
+  PLSWM(:,:,:)  = PLSWM(:,:,:)  + PTSTEP * PLSWS(:,:,:)
+END IF
+!
+IF (SIZE(PLSTHS,1) /= 0) THEN
+  PLSTHM(:,:,:) = PLSTHM(:,:,:) + PTSTEP * PLSTHS(:,:,:)
+ENDIF
+!
+IF (SIZE(PLSRVS,1) /= 0) THEN
+  PLSRVM(:,:,:) = MAX( PLSRVM(:,:,:) + PTSTEP * PLSRVS(:,:,:) , 0.)
+ENDIF
+
+IF (SIZE(PLSZWSS,1) /= 0) THEN
+  PLSZWSM(:,:) = MAX( PLSZWSM(:,:) + PTSTEP * PLSZWSS(:,:) , 0.)
+  PZWS(:,:) = PLSZWSM(:,:)
+ENDIF
+!
+!------------------------------------------------------------------------------
+!
+!*      5.   TEMPORAL ADVANCE OF THE LATERAL BOUNDARIES FIELDS
+!
+IF (SIZE(PLBXUS,1) /= 0) THEN
+  PLBXUM(:,:,:)  = PLBXUM(:,:,:)  + PTSTEP * PLBXUS(:,:,:)
+  PLBXVM(:,:,:)  = PLBXVM(:,:,:)  + PTSTEP * PLBXVS(:,:,:)
+  PLBXWM(:,:,:)  = PLBXWM(:,:,:)  + PTSTEP * PLBXWS(:,:,:)
+ENDIF
+IF (SIZE(PLBYUS,1) /= 0) THEN
+  PLBYUM(:,:,:)  = PLBYUM(:,:,:)  + PTSTEP * PLBYUS(:,:,:)
+  PLBYVM(:,:,:)  = PLBYVM(:,:,:)  + PTSTEP * PLBYVS(:,:,:)
+  PLBYWM(:,:,:)  = PLBYWM(:,:,:)  + PTSTEP * PLBYWS(:,:,:)
+ENDIF
+!
+IF (SIZE(PLBXTHS,1) /= 0) THEN
+  PLBXTHM(:,:,:) = PLBXTHM(:,:,:) + PTSTEP * PLBXTHS(:,:,:)
+END IF
+IF (SIZE(PLBYTHS,1) /= 0) THEN
+  PLBYTHM(:,:,:) = PLBYTHM(:,:,:) + PTSTEP * PLBYTHS(:,:,:)
+END IF
+!
+IF (SIZE(PLBXTKES,1) /= 0) THEN
+  PLBXTKEM(:,:,:) = MAX( PLBXTKEM(:,:,:) + PTSTEP * PLBXTKES(:,:,:), XTKEMIN)
+END IF
+IF (SIZE(PLBYTKES,1) /= 0) THEN
+  PLBYTKEM(:,:,:) = MAX( PLBYTKEM(:,:,:) + PTSTEP * PLBYTKES(:,:,:), XTKEMIN)
+END IF
+!
+IF (SIZE(PLBXRS,1) /= 0) THEN
+  PLBXRM(:,:,:,:) = MAX( PLBXRM(:,:,:,:) + PTSTEP * PLBXRS(:,:,:,:), 0.)
+END IF
+IF (SIZE(PLBYRS,1) /= 0) THEN
+  PLBYRM(:,:,:,:) = MAX( PLBYRM(:,:,:,:) + PTSTEP * PLBYRS(:,:,:,:), 0.)
+END IF
+!
+IF (SIZE(PLBXSVS,1) /= 0) THEN
+  DO JSV = 1,KSV
+    PLBXSVM(:,:,:,JSV) = MAX( PLBXSVM(:,:,:,JSV) + PTSTEP * PLBXSVS(:,:,:,JSV),XSVMIN(JSV))
+  ENDDO
+ENDIF
+IF (SIZE(PLBYSVS,1) /= 0) THEN
+  DO JSV = 1,KSV
+    PLBYSVM(:,:,:,JSV) = MAX( PLBYSVM(:,:,:,JSV) + PTSTEP * PLBYSVS(:,:,:,JSV),XSVMIN(JSV))
+  ENDDO
+END IF
+!
+!------------------------------------------------------------------------------
+!
+!*      6.   MINIMUM VALUE FOR HYDROMETEORS
+!
+IF (SIZE(PRT,4) > 1) THEN
+  WHERE(PRT(:,:,:,2:)<1.E-20)
+    PRT(:,:,:,2:)=0.
+  END WHERE
+END IF
+IF (SIZE(PLBXRM,4) > 1) THEN
+  WHERE(PLBXRM(:,:,:,2:)<1.E-20)
+    PLBXRM(:,:,:,2:)=0.
+  END WHERE
+END IF
+IF (SIZE(PLBYRM,4) > 1) THEN
+  WHERE(PLBYRM(:,:,:,2:)<1.E-20)
+    PLBYRM(:,:,:,2:)=0.
+  END WHERE
+END IF
+!
+!------------------------------------------------------------------------------
+!
+!*      7.   MINIMUM VALUE FOR CHEMISTRY
+!
+IF ((SIZE(PLBXSVM,4) > NSV_CHEMEND-1).AND.(SIZE(PLBXSVM,1) /= 0))  THEN
+  DO JSV=NSV_CHEMBEG, NSV_CHEMEND
+    PLBXSVM(:,:,:,JSV) = MAX(PLBXSVM(:,:,:,JSV), XSVMIN(JSV))
+  END DO
+END IF
+IF ((SIZE(PLBYSVM,4) > NSV_CHEMEND-1).AND.(SIZE(PLBYSVM,1) /= 0)) THEN
+  DO JSV=NSV_CHEMBEG, NSV_CHEMEND
+    PLBYSVM(:,:,:,JSV) = MAX(PLBYSVM(:,:,:,JSV), XSVMIN(JSV))
+  END DO
+END IF
+!
+!------------------------------------------------------------------------------
+!
+!*      8.   MINIMUM VALUE FOR AEROSOLS
+!
+IF (LORILAM) THEN
+  IF ((SIZE(PLBXSVM,4) > NSV_AEREND-1).AND.(SIZE(PLBXSVM,1) /= 0))  THEN
+    DO JSV=NSV_AERBEG, NSV_AEREND
+      PLBXSVM(:,:,:,JSV) = MAX(PLBXSVM(:,:,:,JSV), XSVMIN(JSV))
+    END DO
+  END IF
+  IF ((SIZE(PLBYSVM,4) > NSV_AEREND-1).AND.(SIZE(PLBYSVM,1) /= 0)) THEN
+    DO JSV=NSV_AERBEG, NSV_AEREND
+      PLBYSVM(:,:,:,JSV) = MAX(PLBYSVM(:,:,:,JSV), XSVMIN(JSV))
+    END DO
+  END IF
+END IF
+!
+!------------------------------------------------------------------------------
+!
+!*      9.   MINIMUM VALUE FOR DUSTS
+!
+IF (LDUST) THEN
+  IF ((SIZE(PLBXSVM,4) > NSV_DSTEND-1).AND.(SIZE(PLBXSVM,1) /= 0))  THEN
+    DO JSV=NSV_DSTBEG, NSV_DSTEND
+      PLBXSVM(:,:,:,JSV) = MAX(PLBXSVM(:,:,:,JSV), XSVMIN(JSV))
+    END DO
+  END IF
+  IF ((SIZE(PLBYSVM,4) > NSV_DSTEND-1).AND.(SIZE(PLBYSVM,1) /= 0)) THEN
+    DO JSV=NSV_DSTBEG, NSV_DSTEND
+      PLBYSVM(:,:,:,JSV) = MAX(PLBYSVM(:,:,:,JSV), XSVMIN(JSV))
+    END DO
+  END IF
+END IF
+!
+!------------------------------------------------------------------------------
+!
+!*      9.   MINIMUM VALUE FOR SEA SALTS
+!
+IF (LSALT) THEN
+  IF ((SIZE(PLBXSVM,4) > NSV_SLTEND-1).AND.(SIZE(PLBXSVM,1) /= 0))  THEN
+    DO JSV=NSV_SLTBEG, NSV_SLTEND
+      PLBXSVM(:,:,:,JSV) = MAX(PLBXSVM(:,:,:,JSV), XSVMIN(JSV))
+    END DO
+  END IF
+  IF ((SIZE(PLBYSVM,4) > NSV_SLTEND-1).AND.(SIZE(PLBYSVM,1) /= 0)) THEN
+    DO JSV=NSV_SLTBEG, NSV_SLTEND
+      PLBYSVM(:,:,:,JSV) = MAX(PLBYSVM(:,:,:,JSV), XSVMIN(JSV))
+    END DO
+  END IF
+END IF
+!
+!------------------------------------------------------------------------------
+!
+!*      11.   STORAGE IN BUDGET ARRAYS
+!
+IF (LBU_ENABLE) THEN
+  !Division by nbustep to compute average on the selected time period
+  if (      lbudget_u   .or. lbudget_v  .or. lbudget_w  .or. lbudget_th                 &
+       .or. lbudget_tke .or. lbudget_rv .or. lbudget_rc .or. lbudget_rr .or. lbudget_ri &
+       .or. lbudget_rs  .or. lbudget_rg .or. lbudget_rh .or. lbudget_sv                 ) then
+    Allocate( zrhodjontime, mold = prhodj )
+    Allocate( zwork,        mold = prhodj )
+    zrhodjontime(:, :, :) = prhodj(:, :, :) / ( ptstep * nbustep )
+  end if
+
+  if ( lbudget_u   ) call Budget_store_end( tbudgets(NBUDGET_U  ), 'AVEF', put  (:, :, :)    * zrhodjontime(:, :, :) )
+  if ( lbudget_v   ) call Budget_store_end( tbudgets(NBUDGET_V  ), 'AVEF', pvt  (:, :, :)    * zrhodjontime(:, :, :) )
+  if ( lbudget_w   ) call Budget_store_end( tbudgets(NBUDGET_W  ), 'AVEF', pwt  (:, :, :)    * zrhodjontime(:, :, :) )
+  if ( lbudget_th  ) call Budget_store_end( tbudgets(NBUDGET_TH ), 'AVEF', ptht (:, :, :)    * zrhodjontime(:, :, :) )
+  if ( lbudget_tke ) call Budget_store_end( tbudgets(NBUDGET_TKE), 'AVEF', ptket(:, :, :)    * zrhodjontime(:, :, :) )
+  if ( lbudget_rv  ) call Budget_store_end( tbudgets(NBUDGET_RV ), 'AVEF', prt  (:, :, :, 1) * zrhodjontime(:, :, :) )
+  if ( lbudget_rc  ) call Budget_store_end( tbudgets(NBUDGET_RC ), 'AVEF', prt  (:, :, :, 2) * zrhodjontime(:, :, :) )
+  if ( lbudget_rr  ) call Budget_store_end( tbudgets(NBUDGET_RR ), 'AVEF', prt  (:, :, :, 3) * zrhodjontime(:, :, :) )
+  if ( lbudget_ri  ) call Budget_store_end( tbudgets(NBUDGET_RI ), 'AVEF', prt  (:, :, :, 4) * zrhodjontime(:, :, :) )
+  if ( lbudget_rs  ) call Budget_store_end( tbudgets(NBUDGET_RS ), 'AVEF', prt  (:, :, :, 5) * zrhodjontime(:, :, :) )
+  if ( lbudget_rg  ) call Budget_store_end( tbudgets(NBUDGET_RG ), 'AVEF', prt  (:, :, :, 6) * zrhodjontime(:, :, :) )
+  if ( lbudget_rh  ) call Budget_store_end( tbudgets(NBUDGET_RH ), 'AVEF', prt  (:, :, :, 7) * zrhodjontime(:, :, :) )
+  if ( lbudget_sv  ) then
+    do jsv = 1, ksv
+      call Budget_store_end( tbudgets(jsv + NBUDGET_SV1 - 1), 'AVEF', psvt(:, :, :, jsv) * zrhodjontime(:, :, :) )
+    end do
+  end if
+
+  if ( lbudget_u   ) then
+    zwork(:, :, :) = pus  (:, :, :) * Mxm( prhodj(:, :, :) ) / ptstep
+    call Budget_store_end(  tbudgets(NBUDGET_U  ), 'ENDF', zwork )
+    call Budget_store_init( tbudgets(NBUDGET_U  ), 'ASSE', zwork )
+  end if
+
+  if ( lbudget_v   ) then
+    zwork(:, :, :) = pvs  (:, :, :) * Mym( prhodj(:, :, :) ) / ptstep
+    call Budget_store_end(  tbudgets(NBUDGET_V  ), 'ENDF', zwork )
+    call Budget_store_init( tbudgets(NBUDGET_V  ), 'ASSE', zwork )
+  end if
+
+  if ( lbudget_w   ) then
+    zwork(:, :, :) = pws  (:, :, :) * Mzm( prhodj(:, :, :) ) / ptstep
+    call Budget_store_end(  tbudgets(NBUDGET_W  ), 'ENDF', zwork )
+    call Budget_store_init( tbudgets(NBUDGET_W  ), 'ASSE', zwork )
+  end if
+
+  if (      lbudget_th .or. lbudget_tke .or. lbudget_rv .or. lbudget_rc .or. lbudget_rr &
+       .or. lbudget_ri .or. lbudget_rs  .or. lbudget_rg .or. lbudget_rh .or. lbudget_sv ) then
+    zrhodjontime(:, :, :) = prhodj(:, :, :) / ptstep
+  end if
+
+  if ( lbudget_th  ) then
+    zwork(:, :, :) = pths (:, :, :)    * zrhodjontime(:, :, :)
+    call Budget_store_end(  tbudgets(NBUDGET_TH ), 'ENDF', zwork )
+    call Budget_store_init( tbudgets(NBUDGET_TH ), 'ASSE', zwork )
+  end if
+
+  if ( lbudget_tke ) then
+    zwork(:, :, :) = ptkes(:, :, :)    * zrhodjontime(:, :, :)
+    call Budget_store_end(  tbudgets(NBUDGET_TKE), 'ENDF', zwork )
+    call Budget_store_init( tbudgets(NBUDGET_TKE), 'ASSE', zwork )
+  end if
+
+  if ( lbudget_rv  ) then
+    zwork(:, :, :) = prs  (:, :, :, 1) * zrhodjontime(:, :, :)
+    call Budget_store_end(  tbudgets(NBUDGET_RV ), 'ENDF', zwork )
+    call Budget_store_init( tbudgets(NBUDGET_RV ), 'ASSE', zwork )
+  end if
+
+  if ( lbudget_rc  ) then
+    zwork(:, :, :) = prs  (:, :, :, 2) * zrhodjontime(:, :, :)
+    call Budget_store_end(  tbudgets(NBUDGET_RC ), 'ENDF', zwork )
+    call Budget_store_init( tbudgets(NBUDGET_RC ), 'ASSE', zwork )
+  end if
+
+  if ( lbudget_rr  ) then
+    zwork(:, :, :) = prs  (:, :, :, 3) * zrhodjontime(:, :, :)
+    call Budget_store_end(  tbudgets(NBUDGET_RR ), 'ENDF', zwork )
+    call Budget_store_init( tbudgets(NBUDGET_RR ), 'ASSE', zwork )
+  end if
+
+  if ( lbudget_ri  ) then
+    zwork(:, :, :) = prs  (:, :, :, 4) * zrhodjontime(:, :, :)
+    call Budget_store_end(  tbudgets(NBUDGET_RI ), 'ENDF', zwork )
+    call Budget_store_init( tbudgets(NBUDGET_RI ), 'ASSE', zwork )
+  end if
+
+  if ( lbudget_rs  ) then
+    zwork(:, :, :) = prs  (:, :, :, 5) * zrhodjontime(:, :, :)
+    call Budget_store_end(  tbudgets(NBUDGET_RS ), 'ENDF', zwork )
+    call Budget_store_init( tbudgets(NBUDGET_RS ), 'ASSE', zwork )
+  end if
+
+  if ( lbudget_rg  ) then
+    zwork(:, :, :) = prs  (:, :, :, 6) * zrhodjontime(:, :, :)
+    call Budget_store_end(  tbudgets(NBUDGET_RG ), 'ENDF', zwork )
+    call Budget_store_init( tbudgets(NBUDGET_RG ), 'ASSE', zwork )
+  end if
+
+  if ( lbudget_rh  ) then
+    zwork(:, :, :) = prs  (:, :, :, 7) * zrhodjontime(:, :, :)
+    call Budget_store_end(  tbudgets(NBUDGET_RH ), 'ENDF', zwork )
+    call Budget_store_init( tbudgets(NBUDGET_RH ), 'ASSE', zwork )
+  end if
+
+  if ( lbudget_sv  ) then
+    do jsv = 1, ksv
+      zwork(:, :, :) = psvs(:, :, :, jsv) * zrhodjontime(:, :, :)
+      call Budget_store_end(  tbudgets(jsv + NBUDGET_SV1 - 1), 'ENDF', zwork )
+      call Budget_store_init( tbudgets(jsv + NBUDGET_SV1 - 1), 'ASSE', zwork )
+    end do
+  end if
+
+  if ( Allocated( zwork ) )        Deallocate( zwork )
+  if ( Allocated( zrhodjontime ) ) Deallocate( zrhodjontime )
+END IF
+!
+!------------------------------------------------------------------------------
+!
+!*      12.  COMPUTATION OF PHASE VELOCITY
+!            -----------------------------
+!
+!   It is temporarily set to a constant value
+!
+!------------------------------------------------------------------------------
+!
+!
+END SUBROUTINE ENDSTEP
diff --git a/src/PHYEX/ext/flash_geom_elec.f90 b/src/PHYEX/ext/flash_geom_elec.f90
new file mode 100644
index 0000000000000000000000000000000000000000..e6eea2d03c113ae02451da51869d6ce8c6da983f
--- /dev/null
+++ b/src/PHYEX/ext/flash_geom_elec.f90
@@ -0,0 +1,2873 @@
+!MNH_LIC Copyright 2010-2022 CNRS, Meteo-France and Universite Paul Sabatier
+!MNH_LIC This is part of the Meso-NH software governed by the CeCILL-C licence
+!MNH_LIC version 1. See LICENSE, CeCILL-C_V1-en.txt and CeCILL-C_V1-fr.txt
+!MNH_LIC for details. version 1.
+!-----------------------------------------------------------------
+!     #############################
+      MODULE MODI_FLASH_GEOM_ELEC_n
+!     #############################
+!
+INTERFACE
+    SUBROUTINE FLASH_GEOM_ELEC_n (KTCOUNT, KMI, KRR, PTSTEP, OEXIT,                      &
+                                  PRHODJ, PRHODREF, PRT, PCIT, PRSVS, PRS, PTHT, PPABST, &
+                                  PEFIELDU, PEFIELDV, PEFIELDW, PZZ, PSVS_LINOX,         &
+                                  TPFILE_FGEOM_DIAG, TPFILE_FGEOM_COORD, TPFILE_LMA,     &
+                                  PTOWN, PSEA                                            )
+!
+USE MODD_IO, ONLY: TFILEDATA
+!
+INTEGER,                  INTENT(IN)    :: KTCOUNT  ! Temporal loop counter
+INTEGER,                  INTENT(IN)    :: KMI      ! current model index
+INTEGER,                  INTENT(IN)    :: KRR      ! number of moist variables
+REAL,                     INTENT(IN)    :: PTSTEP   ! Double time step except for
+                                                    ! cold start
+LOGICAL,                  INTENT(IN)    :: OEXIT    ! switch for the end of the temporal loop
+REAL, DIMENSION(:,:,:),   INTENT(IN)    :: PRHODREF ! Reference dry air density
+REAL, DIMENSION(:,:,:),   INTENT(IN)    :: PRHODJ   ! Dry density * Jacobian
+REAL, DIMENSION(:,:,:,:), INTENT(IN)    :: PRT      ! Moist variables at time t
+REAL, DIMENSION(:,:,:),   INTENT(INOUT) :: PCIT     ! Pristine ice n.c. at t
+REAL, DIMENSION(:,:,:,:), INTENT(INOUT) :: PRSVS    ! Scalar variables source term
+REAL, DIMENSION(:,:,:),   INTENT(INOUT) :: PEFIELDU ! x-component of the electric field
+REAL, DIMENSION(:,:,:),   INTENT(INOUT) :: PEFIELDV ! y-component of the electric field
+REAL, DIMENSION(:,:,:),   INTENT(INOUT) :: PEFIELDW ! z-component of the electric field
+REAL, DIMENSION(:,:,:,:), INTENT(INOUT) :: PRS      ! Moist variables vol. source
+REAL, DIMENSION(:,:,:),   INTENT(IN)    :: PTHT     ! Theta (K) at time t
+REAL, DIMENSION(:,:,:),   INTENT(IN)    :: PPABST   ! Absolute pressure at t
+REAL, DIMENSION(:,:,:),   INTENT(IN)    :: PZZ      ! height
+REAL, DIMENSION(:,:,:),   INTENT(INOUT) :: PSVS_LINOX ! NOx source term
+TYPE(TFILEDATA),          INTENT(IN)    :: TPFILE_FGEOM_DIAG
+TYPE(TFILEDATA),          INTENT(IN)    :: TPFILE_FGEOM_COORD
+TYPE(TFILEDATA),          INTENT(IN)    :: TPFILE_LMA
+REAL, DIMENSION(:,:), OPTIONAL, INTENT(IN) :: PTOWN ! town fraction
+REAL, DIMENSION(:,:), OPTIONAL, INTENT(IN) :: PSEA  ! Land-sea mask
+!
+END SUBROUTINE FLASH_GEOM_ELEC_n
+END INTERFACE
+END MODULE MODI_FLASH_GEOM_ELEC_n
+!
+!
+!   ######################################################################################
+    SUBROUTINE FLASH_GEOM_ELEC_n (KTCOUNT, KMI, KRR, PTSTEP, OEXIT,                      &
+                                  PRHODJ, PRHODREF, PRT, PCIT, PRSVS, PRS, PTHT, PPABST, &
+                                  PEFIELDU, PEFIELDV, PEFIELDW, PZZ, PSVS_LINOX,         &
+                                  TPFILE_FGEOM_DIAG, TPFILE_FGEOM_COORD, TPFILE_LMA,     &
+                                  PTOWN, PSEA                                            )
+!   ######################################################################################
+!
+!!****  * -
+!!
+!!    PURPOSE
+!!    -------
+!!      The purpose of this routine is to compute the lightning flash path,
+!!    and to neutralize the electric charge along the lightning channel.
+!!
+!!
+!!    METHOD
+!!    ------
+!!
+!!    EXTERNAL
+!!    --------
+!!
+!!    IMPLICIT ARGUMENTS
+!!    ------------------
+!!
+!!    REFERENCE
+!!    ---------
+!!
+!!    AUTHOR
+!!    ------
+!!      C. Barthe   * LACy * 
+!!
+!!    MODIFICATIONS
+!!    -------------
+!!      Original : Jan. 2010
+!!      Modifications:
+!!      M. Chong  * LA *  Juin 2010 : add small ions
+!!      J-P Pinty * LA *  Feb. 2013 : add LMA storage
+!!      J-P Pinty * LA *  Nov. 2013 : add flash map storage
+!!      M. Chong  * LA *  Juin 2010 : add LiNOx
+!!      C. Barthe * LACy * Jan. 2015 : convert trig. pt into lat,lon in ascii file
+!!      J.Escobar : 18/12/2015 : Correction of bug in bound in // for NHALO <>1 
+!!      J.Escobar : 28/03/2018 : Correction of multiple // bug & compiler indepedent mnh_random_number
+!!      J.Escobar : 20/06/2018 : Correction of computation of global index I8VECT
+!!      J.Escobar : 10/12/2018 : // Correction , mpi_bcast CG & CG_POS parameter 
+!!                               & initialize INBLIGHT on all proc for filling/saving AREA* arrays
+!  P. Wautelet 10/01/2019: use NEWUNIT argument of OPEN
+!  P. Wautelet 22/01/2019: use standard FLUSH statement instead of non standard intrinsics!!
+!  P. Wautelet 22/02/2019: use MOD intrinsics with same kind for all arguments (to respect Fortran standard)
+!  P. Wautelet 10/04/2019: replace ABORT and STOP calls by Print_msg
+!  P. Wautelet 19/04/2019: use modd_precision kinds
+!  P. Wautelet 26/04/2019: use modd_precision parameters for datatypes of MPI communications
+!  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 18/09/2019: correct support of 64bit integers (MNH_INT=8)
+!  P. Wautelet 31/08/2022: remove ZXMASS and ZYMASS (use XXHATM and XYHATM instead)
+!-------------------------------------------------------------------------------
+!
+!*      0.      DECLARATIONS
+!               ------------
+!
+USE MODD_ARGSLIST_ll,    ONLY: LIST_ll
+USE MODD_CONF,           ONLY: CEXP, LCARTESIAN
+USE MODD_CST,            ONLY: XAVOGADRO, XMD
+USE MODD_DYN_n,          ONLY: XDXHATM, XDYHATM, NSTOP
+USE MODD_ELEC_DESCR
+USE MODD_ELEC_FLASH
+USE MODD_ELEC_PARAM,     ONLY: XFQLIGHTR, XEXQLIGHTR, &
+                               XFQLIGHTI, XEXQLIGHTI, &
+                               XFQLIGHTS, XEXQLIGHTS, &
+                               XFQLIGHTG, XEXQLIGHTG, &
+                               XFQLIGHTH, XEXQLIGHTH, &
+                               XFQLIGHTC
+USE MODD_GRID,           ONLY: XLATORI,XLONORI
+USE MODD_GRID_n,         ONLY: XXHATM, XYHATM, XZHAT
+USE MODD_IO,             ONLY: TFILEDATA
+USE MODD_LMA_SIMULATOR
+USE MODD_METRICS_n,      ONLY: XDXX, XDYY, XDZZ ! in linox_production
+USE MODD_NSV,            ONLY: NSV_ELECBEG, NSV_ELECEND, NSV_ELEC
+USE MODD_PARAMETERS,     ONLY: JPHEXT, JPVEXT
+use MODD_PRECISION,      only: MNHINT_MPI, MNHLOG_MPI, MNHREAL_MPI
+USE MODD_RAIN_ICE_DESCR_n, ONLY: XLBR, XLBEXR, XLBS, XLBEXS, &
+                               XLBG, XLBEXG, XLBH, XLBEXH, &
+                               XRTMIN
+USE MODD_SUB_ELEC_n
+USE MODD_TIME_n
+USE MODD_VAR_ll,         ONLY: NPROC,NMNH_COMM_WORLD
+!
+USE MODE_ELEC_ll
+USE MODE_GRIDPROJ
+USE MODE_ll
+USE MODE_MPPDB
+#ifdef MNH_PGI
+USE MODE_PACK_PGI
+#endif
+!
+USE MODI_ION_ATTACH_ELEC
+USE MODI_SHUMAN
+USE MODI_TO_ELEC_FIELD_n
+!
+IMPLICIT NONE
+!
+!
+!       0.1     Declaration of arguments
+!
+INTEGER,                  INTENT(IN)    :: KTCOUNT  ! Temporal loop counter
+INTEGER,                  INTENT(IN)    :: KMI      ! current model index
+INTEGER,                  INTENT(IN)    :: KRR      ! number of moist variables
+REAL,                     INTENT(IN)    :: PTSTEP   ! Double time step except for
+                                                    ! cold start
+LOGICAL,                  INTENT(IN)    :: OEXIT    ! switch for the end of the temporal loop
+REAL, DIMENSION(:,:,:),   INTENT(IN)    :: PRHODREF ! Reference dry air density
+REAL, DIMENSION(:,:,:),   INTENT(IN)    :: PRHODJ   ! Dry density * Jacobian
+REAL, DIMENSION(:,:,:,:), INTENT(IN)    :: PRT      ! Moist variables at time t
+REAL, DIMENSION(:,:,:),   INTENT(INOUT) :: PCIT     ! Pristine ice n.c. at t
+REAL, DIMENSION(:,:,:,:), INTENT(INOUT) :: PRSVS    ! Scalar variables source term
+REAL, DIMENSION(:,:,:),   INTENT(INOUT) :: PEFIELDU ! x-component of the electric field
+REAL, DIMENSION(:,:,:),   INTENT(INOUT) :: PEFIELDV ! y-component of the electric field
+REAL, DIMENSION(:,:,:),   INTENT(INOUT) :: PEFIELDW ! z-component of the electric field
+REAL, DIMENSION(:,:,:,:), INTENT(INOUT) :: PRS      ! Moist variables vol. source
+REAL, DIMENSION(:,:,:),   INTENT(IN)    :: PTHT     ! Theta (K) at time t
+REAL, DIMENSION(:,:,:),   INTENT(IN)    :: PPABST   ! Absolute pressure at t
+REAL, DIMENSION(:,:,:),   INTENT(IN)    :: PZZ      ! height
+REAL, DIMENSION(:,:,:),   INTENT(INOUT) :: PSVS_LINOX ! NOx source term
+TYPE(TFILEDATA),          INTENT(IN)    :: TPFILE_FGEOM_DIAG
+TYPE(TFILEDATA),          INTENT(IN)    :: TPFILE_FGEOM_COORD
+TYPE(TFILEDATA),          INTENT(IN)    :: TPFILE_LMA
+REAL, DIMENSION(:,:), OPTIONAL, INTENT(IN) :: PTOWN ! town fraction
+REAL, DIMENSION(:,:), OPTIONAL, INTENT(IN) :: PSEA  ! Land-sea mask
+!
+!
+!       0.2     Declaration of local variables
+!
+INTEGER :: IIB, IIE  ! index values of the first and last inner mass points along x
+INTEGER :: IJB, IJE  ! index values of the first and last inner mass points along y
+INTEGER :: IKB, IKE  ! index values of the first and last inner mass points along z
+INTEGER :: II, IJ, IK, IL, IM, IPOINT  ! loop indexes
+INTEGER :: IX, IY, IZ
+INTEGER :: IXOR, IYOR  ! origin of the extended subdomain
+INTEGER :: INB_CELL    ! Number of detected electrified cells
+INTEGER :: IPROC_CELL  ! Proc with the center of the cell
+INTEGER :: IICOORD, IJCOORD, IKCOORD ! local indexes of the cell center / max electric field
+INTEGER :: IPROC       ! my proc number
+INTEGER :: IINFO_ll    ! return code of parallel routine
+INTEGER :: COUNT_BEF   ! nb of pts in zcell before testing neighbour pts
+INTEGER :: COUNT_AFT   ! nb of pts in zcell after testing neighbour pts
+INTEGER :: INBFTS_MAX  ! Max number of flashes per time step / cell 
+INTEGER :: IIBL_LOC    ! local i index of the ongoing bi-leader segment
+INTEGER :: IJBL_LOC    ! local j index of the ongoing bi-leader segment
+INTEGER :: IKBL        ! k index of the ongoing bi-leader segment
+INTEGER :: II_TRIG_LOC  ! local i index of the triggering point
+INTEGER :: IJ_TRIG_LOC  ! local j index of the triggering point
+INTEGER :: II_TRIG_GLOB ! global i index of the potential triggering pt
+INTEGER :: IJ_TRIG_GLOB ! global j index of the potential triggering pt
+INTEGER :: IK_TRIG      ! k index of the triggering point
+INTEGER :: ISIGN_LEADER ! sign of the leader
+INTEGER :: IPROC_AUX    ! proc number for max_ll and min_ll
+INTEGER :: IIND_MAX   ! max nb of indexes between the trig. pt and the possible branches
+INTEGER :: IIND_MIN   ! min nb of indexes between the trig. pt and the possible branches
+INTEGER :: IDELTA_IND   ! number of indexes between iind_max and iind_min
+INTEGER :: IPT_DIST     ! nb of possible pts for branching on each proc
+INTEGER :: IPT_DIST_GLOB  ! global nb of possible pts for branching
+INTEGER :: IFOUND         ! if =1, then the random selection is successful 
+INTEGER :: ICHOICE_LOCX   ! local i indice for random choice
+INTEGER :: ICHOICE_LOCY   ! local j indice for random choice
+INTEGER :: ICHOICE_Z      !       k indice for random choice
+INTEGER :: INB_PROP       ! nb of pts where the flash can propagate
+INTEGER :: INB_NEUT       ! nb of pts to neutralize
+INTEGER :: INB_NEUT_OK    ! nb of effective flash neutralization
+INTEGER :: ISTOP
+INTEGER :: IERR         ! error status
+INTEGER :: IWORK
+INTEGER :: ICHOICE
+INTEGER :: IIMIN, IIMAX, IJMIN, IJMAX, IKMIN, IKMAX
+INTEGER :: IPOS_LEADER, INEG_LEADER
+INTEGER :: INBLIGHT
+INTEGER, DIMENSION(:), ALLOCATABLE, SAVE :: ITYPE   ! flash type (IC, CGN or CGP)
+INTEGER, DIMENSION(:), ALLOCATABLE :: INBSEG_LEADER ! number of segments in the leader
+INTEGER, DIMENSION(:), ALLOCATABLE :: ISIGNE_EZ     ! sign of the vertical electric field 
+                                                    ! component at the trig. pt
+INTEGER, DIMENSION(:), ALLOCATABLE :: IPROC_TRIG    ! proc that contains the triggering point
+INTEGER, DIMENSION(:), ALLOCATABLE :: INBSEG        ! Number of segments per flash
+INTEGER, DIMENSION(:), ALLOCATABLE :: INBSEG_ALL    ! Number of segments, all processes
+INTEGER, DIMENSION(NPROC)          :: INBSEG_PROC   ! ------------------ per process
+INTEGER, DIMENSION(:), ALLOCATABLE :: INB_FLASH     ! Number of flashes per time step / cell
+INTEGER, DIMENSION(:), ALLOCATABLE :: INB_FL_REAL   ! Effective Number of flashes per timestep/cell
+INTEGER, DIMENSION(:), ALLOCATABLE :: IHIST_LOC     ! local nb of possible branches at [r,r+dr]
+INTEGER, DIMENSION(:), ALLOCATABLE :: IHIST_GLOB    ! global nb of possible branches at [r,r+dr]
+                                                    ! at [r,r+dr] on each proc
+INTEGER, DIMENSION(:), ALLOCATABLE :: IMAX_BRANCH   ! max nb of branches at [r,r+dr]
+                                                    ! proportional to the percentage of 
+                                                    ! available pts / proc at this distance
+INTEGER, DIMENSION(:,:), ALLOCATABLE :: ISEG_LOC    ! Local indexes of the flash segments
+INTEGER, DIMENSION(:,:), ALLOCATABLE :: ICELL_LOC   ! local indexes + proc of the cell 'center'
+INTEGER, DIMENSION(:,:,:), ALLOCATABLE :: IMASKQ_DIST ! contains the distance/indice 
+                                                      ! from the triggering pt
+!
+LOGICAL :: GPOSITIVE    ! if T, positive charge regions where the negative part 
+                        ! of the leader propagates
+LOGICAL :: GEND_DOMAIN  ! no more points with E > E_threshold
+LOGICAL :: GEND_CELL    ! if T, end of the cell
+LOGICAL :: GCG          ! if true, the flash is a CG
+LOGICAL :: GCG_POS      ! if true, the flash is a +CG
+LOGICAL :: GNEUTRALIZATION
+LOGICAL :: GNEW_FLASH_GLOB
+LOGICAL, DIMENSION(:), ALLOCATABLE :: GNEW_FLASH
+LOGICAL, DIMENSION(:,:,:),   ALLOCATABLE :: GATTACH  ! if T, ion recombination and
+                                                     ! attachment
+LOGICAL, DIMENSION(:,:,:),   ALLOCATABLE :: GPOSS    ! if T, new cell possible at this pt
+LOGICAL, DIMENSION(:,:,:,:), ALLOCATABLE :: GPROP    ! if T, propagation possible at this pt
+!
+REAL :: ZE_TRIG_THRES ! Triggering Electric field threshold corrected for
+                      !  pressure   
+REAL :: ZMAXE         ! Max electric field module (V/m)
+REAL :: ZEMOD_BL      ! E module at the tip of the last segment of the leader (V/m)
+REAL :: ZMEAN_GRID    ! mean grid size
+REAL :: ZMAX_DIST     ! max distance between the triggering pt and the possible branches
+REAL :: ZMIN_DIST     ! min distance between the triggering pt and the possible branches
+REAL :: ZRANDOM       ! random number
+REAL :: ZQNET         ! net charge carried by the flash (C/kg)
+REAL :: ZCLOUDLIM     ! cloud limit
+REAL :: ZSIGMIN       ! min efficient cross section
+REAL :: ZLAT, ZLON    ! lat,lon coordinates of the triggering points if not lcartesian
+!
+REAL, DIMENSION(:,:,:,:), ALLOCATABLE :: ZQMT   ! mass charge density (C/kg)
+REAL, DIMENSION(:,:,:,:), ALLOCATABLE :: ZCELL  ! define the electrified cells
+REAL, DIMENSION(:,:,:,:), ALLOCATABLE :: ZSIGMA ! efficient cross section of hydrometeors
+REAL, DIMENSION(:,:,:,:), ALLOCATABLE :: ZDQDT  ! charge to neutralize at each pt (C/kg)
+REAL, DIMENSION(:,:,:,:), ALLOCATABLE :: ZFLASH ! = 1 if the flash leader reaches this pt
+                                                ! = 2 if the flash branch is concerned
+REAL, DIMENSION(:,:,:), ALLOCATABLE :: ZLBDAR   ! Lambda for rain
+REAL, DIMENSION(:,:,:), ALLOCATABLE :: ZLBDAS   ! Lambda for snow
+REAL, DIMENSION(:,:,:), ALLOCATABLE :: ZLBDAG   ! Lambda for graupel
+REAL, DIMENSION(:,:,:), ALLOCATABLE :: ZLBDAH   ! Lambda for hail
+REAL, DIMENSION(:,:,:), ALLOCATABLE :: ZQMTOT   ! total mass charge density (C/kg)
+REAL, DIMENSION(:,:,:), ALLOCATABLE :: ZCLOUD   ! total mixing ratio (kg/kg)
+REAL, DIMENSION(:,:,:), ALLOCATABLE :: ZEMODULE ! Electric field module (V/m)
+REAL, DIMENSION(:,:,:), ALLOCATABLE :: ZDIST    ! distance between the trig. pt and the cell pts (m)
+REAL, DIMENSION(:,:,:), ALLOCATABLE :: ZSIGLOB  ! sum of the cross sections
+REAL, DIMENSION(:,:,:), ALLOCATABLE :: ZQFLASH  ! total charge in excess of xqexcess (C/kg)
+REAL, DIMENSION(:,:), ALLOCATABLE :: ZCOORD_TRIG ! Global coordinates of triggering point
+REAL, DIMENSION(:,:), ALLOCATABLE :: ZCOORD_SEG ! Global coordinates of segments
+REAL, DIMENSION(:), ALLOCATABLE :: ZEM_TRIG     ! Electric field module at the triggering pt
+REAL, DIMENSION(:), ALLOCATABLE :: ZNEUT_POS    ! Positive charge neutralized at each segment
+REAL, DIMENSION(:), ALLOCATABLE :: ZNEUT_NEG    ! Negative charge neutralized at each segment
+INTEGER, DIMENSION(:,:), ALLOCATABLE :: ISEG_GLOB  ! Global indexes of LMA segments
+INTEGER, DIMENSION(:,:), ALLOCATABLE :: ILMA_SEG_ALL   ! Global indexes of LMA segments
+REAL, DIMENSION(:,:), ALLOCATABLE :: ZLMA_QMT ! Particle charge at neutralization point
+REAL, DIMENSION(:,:), ALLOCATABLE :: ZLMA_PRT ! Particle mixing ratio at neutralization point
+REAL, DIMENSION(:,:), ALLOCATABLE :: ZLMA_NEUT_POS
+REAL, DIMENSION(:,:), ALLOCATABLE :: ZLMA_NEUT_NEG
+REAL, DIMENSION(:,:), ALLOCATABLE :: ZCOORD_SEG_ALL
+REAL, DIMENSION(:), ALLOCATABLE :: ZEMAX        ! Max electric field in each cell
+REAL, DIMENSION(:), ALLOCATABLE :: ZHIST_PERCENT ! percentage of possible branches at [r,r+dr] on each proc
+REAL, DIMENSION(:), ALLOCATABLE :: ZMAX_BRANCH  ! max nb of branches at [r,r+dr]
+REAL, DIMENSION(:), ALLOCATABLE :: ZVECT
+!
+! Storage for nflash_write flashes before writing output files (denoted xSxxx)
+INTEGER, SAVE :: ISAVE_STATUS ! 0: print and save
+                              ! 1: save only
+                              ! 2: print only
+!
+TYPE(LIST_ll), POINTER :: TZFIELDS_ll=> NULL()   ! list of fields to exchange
+!
+! Storage for the localization of the flashes
+LOGICAL :: GFIRSTFLASH
+INTEGER,DIMENSION(SIZE(PRT,1),SIZE(PRT,2)) :: IMAP2D
+!
+!  Storage for the NOx production terms
+REAL, DIMENSION(:,:,:), ALLOCATABLE :: ZLNOX
+REAL    :: ZLGHTLENGTH, ZCOEF
+INTEGER :: IFLASH_COUNT, IFLASH_COUNT_GLOB  ! Total number of flashes within the timestep
+!
+REAL,DIMENSION(SIZE(PRT,1),SIZE(PRT,2)) :: ZCELL_NEW
+!
+INTEGER :: ILJ
+INTEGER :: NIMAX_ll, NJMAX_ll,IIU_ll,IJU_ll    ! dimensions of global domain
+!
+!-------------------------------------------------------------------------------
+!
+!*      1.      INITIALIZATION
+!               --------------
+CALL MYPROC_ELEC_ll(IPROC)
+!
+!*      1.1     subdomains indexes
+!
+! beginning and end indexes of the physical subdomain
+CALL GET_INDICE_ll (IIB,IJB,IIE,IJE)
+IKB = 1 + JPVEXT
+IKE = SIZE(PRT,3) - JPVEXT
+!
+! global indexes of the local subdomains origin
+CALL GET_GLOBALDIMS_ll (NIMAX_ll,NJMAX_ll)
+CALL GET_OR_ll('B',IXOR,IYOR)
+IIU_ll = NIMAX_ll + 2*JPHEXT
+IJU_ll = NJMAX_ll + 2*JPHEXT
+!
+!
+!*      1.2     allocations and initializations
+!
+!
+! from the litterature, the max number of flash per minute is ~ 1000
+! this value is used here as the max number of flash per minute per cell
+INBFTS_MAX = ANINT(1000 * PTSTEP / 60)
+!
+IF (GEFIRSTCALL) THEN
+  GEFIRSTCALL = .FALSE.
+  ALLOCATE (ZZMASS(SIZE(PZZ,1), SIZE(PZZ,2), SIZE(PZZ,3)))
+  ALLOCATE (ZPRES_COEF(SIZE(PZZ,1), SIZE(PZZ,2), SIZE(PZZ,3)))
+  IF(LLMA) THEN
+    ALLOCATE (ZLMA_LAT(NFLASH_WRITE, NBRANCH_MAX))
+    ALLOCATE (ZLMA_LON(NFLASH_WRITE, NBRANCH_MAX))
+    ALLOCATE (ZSLMA_NEUT_POS(NFLASH_WRITE, NBRANCH_MAX))
+    ALLOCATE (ZSLMA_NEUT_NEG(NFLASH_WRITE, NBRANCH_MAX))
+    ALLOCATE (ISLMA_SEG_GLOB(NFLASH_WRITE, NBRANCH_MAX, 3))
+    ALLOCATE (ZSLMA_QMT(NFLASH_WRITE, NBRANCH_MAX, SIZE(PRSVS,4)))
+    ALLOCATE (ZSLMA_PRT(NFLASH_WRITE, NBRANCH_MAX, SIZE(PRSVS,4)))
+    ISLMA_SEG_GLOB(:,:,:) = 0
+  END IF
+  ALLOCATE (ZSCOORD_SEG(NFLASH_WRITE, NBRANCH_MAX, 3))  ! NFLASH_WRITE nb of flash to be stored
+                                            ! before writing in files
+                                            ! NBRANCH_MAX=5000 default
+  ALLOCATE (ISFLASH_NUMBER(0:NFLASH_WRITE))
+  ALLOCATE (ISNB_FLASH(NFLASH_WRITE))
+  ALLOCATE (ISCELL_NUMBER(NFLASH_WRITE))
+  ALLOCATE (ISNBSEG(NFLASH_WRITE))
+  ALLOCATE (ISTCOUNT_NUMBER(NFLASH_WRITE))
+  ALLOCATE (ISTYPE(NFLASH_WRITE))
+  ALLOCATE (ZSEM_TRIG(NFLASH_WRITE))
+  ALLOCATE (ZSNEUT_POS(NFLASH_WRITE))
+  ALLOCATE (ZSNEUT_NEG(NFLASH_WRITE))
+!
+  ZZMASS = MZF(PZZ)
+  ZPRES_COEF = EXP(ZZMASS/8400.)
+  ZSCOORD_SEG(:,:,:) = 0.0
+  ISAVE_STATUS = 1
+  ISFLASH_NUMBER(:) = 0
+END IF
+!
+ALLOCATE (ZQMT(SIZE(PRSVS,1),SIZE(PRSVS,2),SIZE(PRSVS,3),SIZE(PRSVS,4)))
+ALLOCATE (ZQMTOT(SIZE(PRSVS,1),SIZE(PRSVS,2),SIZE(PRSVS,3)))
+ALLOCATE (ZCLOUD(SIZE(PRT,1),SIZE(PRT,2),SIZE(PRT,3)))
+ALLOCATE (GPOSS(SIZE(PRT,1),SIZE(PRT,2),SIZE(PRT,3)))
+ALLOCATE (ZEMODULE(SIZE(PRT,1),SIZE(PRT,2),SIZE(PRT,3)))
+ALLOCATE (ZCELL(SIZE(PRT,1),SIZE(PRT,2),SIZE(PRT,3),NMAX_CELL))
+
+!
+ZQMT(:,:,:,:) = 0.
+ZQMTOT(:,:,:) = 0.
+ZCLOUD(:,:,:) = 0.
+GPOSS(:,:,:) = .FALSE.
+GPOSS(IIB:IIE,IJB:IJE,IKB:IKE) = .TRUE.
+ZEMODULE(:,:,:) = 0.
+ZCELL(:,:,:,:) = 0.
+!
+!
+!*      1.3     point discharge (Corona)
+!
+PRSVS(:,:,:,1) = XECHARGE * PRSVS(:,:,:,1)             ! C /(m3 s)
+PRSVS(:,:,:,NSV_ELEC) = -1. * XECHARGE * PRSVS(:,:,:,NSV_ELEC)  ! C /(m3 s)
+!
+CALL PT_DISCHARGE
+!
+!
+!*      1.4     total charge density and mixing ratio
+!
+DO II = 1, NSV_ELEC
+! transform the source term (C/s) into the updated charge density (C/kg)
+  ZQMT(:,:,:,II) = PRSVS(:,:,:,II) * PTSTEP / PRHODJ(:,:,:)
+!
+! total mass charge density (C/kg)
+  ZQMTOT(:,:,:)  = ZQMTOT(:,:,:) + PRSVS(:,:,:,II) * PTSTEP / PRHODJ(:,:,:)
+END DO
+!
+! total mixing ratio (g/kg)
+DO II = 2, KRR
+  ZCLOUD(:,:,:) = ZCLOUD(:,:,:) + PRT(:,:,:,II)
+END DO
+!
+!
+!*      1.5     constants
+!
+ZCLOUDLIM = 1.E-5 
+ZSIGMIN   = 1.E-12
+!
+!
+!-------------------------------------------------------------------------------
+!
+!*      2.      FIND AND COUNT THE ELECTRIFIED CELLS
+!               ------------------------------------
+!
+ALLOCATE (ZEMAX(NMAX_CELL))
+ALLOCATE (ICELL_LOC(4,NMAX_CELL))
+!
+ZEMAX(:) = 0.
+ICELL_LOC(:,:) = 0
+!
+WHERE (ZCLOUD(IIB:IIE,IJB:IJE,IKB:IKE) .LE. ZCLOUDLIM)
+  GPOSS(IIB:IIE,IJB:IJE,IKB:IKE) = .FALSE.
+END WHERE
+!
+!
+!*      2.1     find the maximum electric field
+!
+GEND_DOMAIN = .FALSE.
+GEND_CELL = .FALSE.
+INB_CELL = 0
+ZE_TRIG_THRES = XETRIG * (1. - XEBALANCE)
+!
+CALL MPPDB_CHECK3DM("flash:: PRHODJ,PRT",PRECISION,&
+     PRHODJ,PRT(:,:,:,1),PRT(:,:,:,2),PRT(:,:,:,3),PRT(:,:,:,4),&
+     PRT(:,:,:,5),PRT(:,:,:,6))
+CALL MPPDB_CHECK3DM("flash:: ZQMT",PRECISION,&
+     ZQMT(:,:,:,1),ZQMT(:,:,:,2),ZQMT(:,:,:,3),ZQMT(:,:,:,4),&
+     ZQMT(:,:,:,5),ZQMT(:,:,:,6),ZQMT(:,:,:,7))
+
+CALL TO_ELEC_FIELD_n (PRT, ZQMT, PRHODJ, KTCOUNT, KRR, &
+                      PEFIELDU, PEFIELDV, PEFIELDW)
+CALL MPPDB_CHECK3DM("flash:: PEFIELDU, PEFIELDV, PEFIELDW",PRECISION,&
+                     PEFIELDU, PEFIELDV, PEFIELDW)
+!
+! electric field module including pressure effect
+ZEMODULE(IIB:IIE,IJB:IJE,IKB:IKE) = ZPRES_COEF(IIB:IIE,IJB:IJE,IKB:IKE)*    &
+                                    (PEFIELDU(IIB:IIE,IJB:IJE,IKB:IKE)**2 + &
+                                     PEFIELDV(IIB:IIE,IJB:IJE,IKB:IKE)**2 + &
+                                     PEFIELDW(IIB:IIE,IJB:IJE,IKB:IKE)**2)**0.5 
+!
+DO WHILE (.NOT. GEND_DOMAIN .AND. INB_CELL .LT. NMAX_CELL)  
+!
+! find the maximum electric field on each proc
+  IF (COUNT(GPOSS(IIB:IIE,IJB:IJE,IKB:IKE)) .GT. 0) THEN
+    ZMAXE = MAXVAL(ZEMODULE(IIB:IIE,IJB:IJE,IKB:IKE), MASK=GPOSS(IIB:IIE,IJB:IJE,IKB:IKE))
+  ELSE
+    ZMAXE = 0.
+  END IF
+!
+! find the max electric field on the whole domain + the proc that contains this value
+  CALL MAX_ELEC_ll (ZMAXE, IPROC_CELL)
+!
+  IF (ZMAXE .GT. ZE_TRIG_THRES) THEN
+    INB_CELL = INB_CELL + 1  ! one cell is detected
+    ZEMAX(INB_CELL) = ZMAXE
+! local coordinates of the maximum electric field
+    ICELL_LOC(1:3,INB_CELL) = MAXLOC(ZEMODULE, MASK=GPOSS )
+    IICOORD = ICELL_LOC(1,INB_CELL)
+    IJCOORD = ICELL_LOC(2,INB_CELL)
+    ICELL_LOC(1,INB_CELL) = IICOORD + IXOR -1
+    ICELL_LOC(2,INB_CELL) = IJCOORD + IYOR -1
+    IKCOORD = ICELL_LOC(3,INB_CELL) 
+    ICELL_LOC(4,INB_CELL) = IPROC_CELL
+! 
+! Broadcast the center of the cell to all procs
+    CALL MPI_BCAST (ICELL_LOC(:,INB_CELL), 4, MNHINT_MPI, IPROC_CELL, &
+                    NMNH_COMM_WORLD, IERR)
+!
+!
+!*      2.2     horizontal extension of the cell 
+!
+    DO IK = IKB, IKE 
+      IF (IPROC_CELL .EQ. IPROC) THEN
+        IF (GPOSS(IICOORD,IJCOORD,IK)) THEN
+          ZCELL(IICOORD,IJCOORD,IK,INB_CELL) = 1.
+          GPOSS(IICOORD,IJCOORD,IK) = .FALSE.
+        END IF
+      END IF
+!
+!*      2.2.1   do the neighbour points have q_tot > q_thresh?
+!
+      GEND_CELL = .FALSE.
+      DO WHILE (.NOT. GEND_CELL)
+!
+        CALL ADD2DFIELD_ll  ( TZFIELDS_ll, ZCELL(:,:,IK,INB_CELL), 'FLASH_GEOM_ELEC_n::ZCELL(:,:,IK,INB_CELL)' )
+        CALL UPDATE_HALO_ll ( TZFIELDS_ll, IINFO_ll )
+        CALL CLEANLIST_ll   ( TZFIELDS_ll )
+!
+        COUNT_BEF = COUNT(ZCELL(IIB:IIE,IJB:IJE,IK,INB_CELL) .EQ. 1.)
+        CALL SUM_ELEC_ll (COUNT_BEF)
+!
+        ZCELL_NEW = ZCELL(:,:,IK,INB_CELL)
+        DO II = IIB, IIE
+          DO IJ = IJB, IJE
+            IF ((ZCELL(II,IJ,IK,INB_CELL) .EQ. 0.) .AND.  &
+                (GPOSS(II,IJ,IK)) .AND.                   &
+                (ZCLOUD(II,IJ,IK) .GT. 1.E-5) .AND.       &
+                ((ABS(ZQMT(II,IJ,IK,2)) * PRHODREF(II,IJ,IK) .GT. XQEXCES).OR. &
+                 (ABS(ZQMT(II,IJ,IK,3)) * PRHODREF(II,IJ,IK) .GT. XQEXCES).OR. &
+                 (ABS(ZQMT(II,IJ,IK,4)) * PRHODREF(II,IJ,IK) .GT. XQEXCES).OR. &
+                 (ABS(ZQMT(II,IJ,IK,5)) * PRHODREF(II,IJ,IK) .GT. XQEXCES).OR. &
+                 (ABS(ZQMT(II,IJ,IK,6)) * PRHODREF(II,IJ,IK) .GT. XQEXCES)) )THEN
+!
+              IF ((ZCELL(II-1,IJ,  IK,INB_CELL) .EQ. 1.) .OR. &
+                  (ZCELL(II+1,IJ,  IK,INB_CELL) .EQ. 1.) .OR. &
+                  (ZCELL(II,  IJ-1,IK,INB_CELL) .EQ. 1.) .OR. &
+                  (ZCELL(II,  IJ+1,IK,INB_CELL) .EQ. 1.) .OR. &
+                  (ZCELL(II-1,IJ-1,IK,INB_CELL) .EQ. 1.) .OR. &
+                  (ZCELL(II-1,IJ+1,IK,INB_CELL) .EQ. 1.) .OR. &
+                  (ZCELL(II+1,IJ+1,IK,INB_CELL) .EQ. 1.) .OR. &
+                  (ZCELL(II+1,IJ-1,IK,INB_CELL) .EQ. 1.)) THEN
+                GPOSS(II,IJ,IK) = .FALSE.
+                ZCELL_NEW(II,IJ) = 1.
+              END IF
+            END IF
+          END DO
+        END DO
+        ZCELL(:,:,IK,INB_CELL) = ZCELL_NEW  
+!
+        COUNT_AFT = COUNT(ZCELL(IIB:IIE,IJB:IJE,IK,INB_CELL) .EQ. 1.)
+        CALL SUM_ELEC_ll(COUNT_AFT)
+!
+        IF (COUNT_BEF .EQ. COUNT_AFT) THEN
+          GEND_CELL = .TRUE.  ! no more point in the cell at this level
+        ELSE
+          GEND_CELL = .FALSE.
+        END IF
+      END DO  ! end loop gend_cell
+    END DO  ! end loop ik
+!
+! avoid cell detection in the colums where a previous cell is already present 
+    DO II = IIB, IIE
+      DO IJ = IJB, IJE
+        DO IK = IKB, IKE
+          IF (ZCELL(II,IJ,IK,INB_CELL) .EQ. 1.) GPOSS(II,IJ,:) = .FALSE.
+        END DO
+      END DO
+    END DO
+  ELSE  
+    GEND_DOMAIN = .TRUE.    ! no more points with E > E_threshold
+  END IF  ! max E
+END DO  ! end loop gend_domain
+!
+DEALLOCATE (GPOSS)
+DEALLOCATE (ZEMAX)
+!
+!
+!*      2.3     if at least 1 cell, allocate arrays
+!
+IF (INB_CELL .GE. 1) THEN
+!
+! mean mesh size
+  ZMEAN_GRID = (XDXHATM**2 + XDYHATM**2 +                                       &
+                ( ( XZHAT(UBOUND(XZHAT,1)) - XZHAT(1) ) / (SIZE(PRT,3)-1.) )**2 )**0.5
+! chaque proc calcule son propre zmean_grid
+! mais cette valeur peut etre differente sur chaque proc (ex: relief)
+! laisse tel quel pour le moment
+!
+  ALLOCATE (ISEG_LOC(3*SIZE(PRT,3), INB_CELL)) ! 3 coord indices of the leader
+  ALLOCATE (ZCOORD_TRIG(3, INB_CELL))
+  ALLOCATE (ZCOORD_SEG(NBRANCH_MAX*3, INB_CELL))
+                                         ! NBRANCH_MAX=5000 default
+                                         ! 3= 3 coord index
+  ALLOCATE (ZCOORD_SEG_ALL(NBRANCH_MAX*3, INB_CELL))
+  ALLOCATE (ISEG_GLOB(NBRANCH_MAX*3, INB_CELL))
+  ISEG_GLOB(:,:) = 0
+!
+  IF(LLMA) THEN
+    ALLOCATE (ILMA_SEG_ALL (NBRANCH_MAX*3, INB_CELL))
+    ALLOCATE (ZLMA_QMT(NBRANCH_MAX*NSV_ELEC, INB_CELL))  ! charge des part.
+                                                  ! a neutraliser
+    ALLOCATE (ZLMA_PRT(NBRANCH_MAX*NSV_ELEC, INB_CELL))  ! mixing ratio
+    ALLOCATE (ZLMA_NEUT_POS(NBRANCH_MAX, INB_CELL))
+    ALLOCATE (ZLMA_NEUT_NEG(NBRANCH_MAX, INB_CELL))
+    ZLMA_QMT(:,:) = 0.
+    ZLMA_PRT(:,:) = 0.
+    ZLMA_NEUT_POS(:,:) = 0.
+    ZLMA_NEUT_NEG(:,:) = 0.
+  END IF
+!
+  IF (LLNOX_EXPLICIT) THEN
+    ALLOCATE (ZLNOX(SIZE(PRT,1),SIZE(PRT,2),SIZE(PRT,3)))
+    ZLNOX(:,:,:) = 0.
+  END IF
+!
+  ALLOCATE (ZEM_TRIG(INB_CELL))
+  ALLOCATE (INB_FLASH(INB_CELL))
+  ALLOCATE (INB_FL_REAL(INB_CELL))
+  ALLOCATE (INBSEG(INB_CELL)) 
+  ALLOCATE (INBSEG_ALL(INB_CELL))
+  ALLOCATE (ITYPE(INB_CELL)) 
+  ALLOCATE (INBSEG_LEADER(INB_CELL))
+  ALLOCATE (ZDQDT(SIZE(PRT,1),SIZE(PRT,2),SIZE(PRT,3),SIZE(PRT,4)+1))
+  ALLOCATE (ZSIGMA(SIZE(PRT,1),SIZE(PRT,2),SIZE(PRT,3),SIZE(PRT,4)-1))
+  ALLOCATE (ZLBDAR(SIZE(PRT,1),SIZE(PRT,2),SIZE(PRT,3)))
+  ALLOCATE (ZLBDAS(SIZE(PRT,1),SIZE(PRT,2),SIZE(PRT,3)))
+  ALLOCATE (ZLBDAG(SIZE(PRT,1),SIZE(PRT,2),SIZE(PRT,3)))
+  IF (KRR == 7) ALLOCATE (ZLBDAH(SIZE(PRT,1),SIZE(PRT,2),SIZE(PRT,3)))
+  ALLOCATE (ZSIGLOB(SIZE(PRT,1),SIZE(PRT,2),SIZE(PRT,3)))
+  ALLOCATE (ZFLASH(SIZE(PRT,1),SIZE(PRT,2),SIZE(PRT,3),INB_CELL))
+  ALLOCATE (ZDIST(SIZE(PRT,1),SIZE(PRT,2),SIZE(PRT,3)))
+  ALLOCATE (ZQFLASH(SIZE(PRT,1),SIZE(PRT,2),SIZE(PRT,3)))
+  ALLOCATE (GATTACH(SIZE(PRT,1),SIZE(PRT,2),SIZE(PRT,3)))
+!
+  ISEG_LOC(:,:) = 0
+  ZCOORD_TRIG(:,:) = 0.
+  ZCOORD_SEG(:,:) = 0.
+  ZDQDT(:,:,:,:) = 0.
+  ZSIGMA(:,:,:,:) = 0.
+  ZLBDAR(:,:,:) = 0.
+  ZLBDAS(:,:,:) = 0.
+  ZLBDAG(:,:,:) = 0. 
+  ZSIGLOB(:,:,:) = 0.
+  ZFLASH(:,:,:,:) = 0.
+  ZDIST(:,:,:) = 0.
+  ZQFLASH(:,:,:) = 0.
+  ZEM_TRIG(:) = 0.
+  INB_FLASH(:) = 0
+  INB_FL_REAL(:) = 0
+  INBSEG(:) = 0
+  INBSEG_ALL(:) = 0 
+  INBSEG_PROC(:) = 0 
+  INBSEG_LEADER(:) = 0
+  ITYPE(:) = 1  ! default = IC
+!
+!
+!-------------------------------------------------------------------------------
+!
+!*      3.      COMPUTE THE EFFICIENT CROSS SECTIONS OF HYDROMETEORS
+!               ----------------------------------------------------
+!
+!*      3.1     for cloud droplets
+!
+  WHERE (PRT(:,:,:,2) > ZCLOUDLIM)
+    ZSIGMA(:,:,:,1) = XFQLIGHTC * PRHODREF(:,:,:) * PRT(:,:,:,2)
+  ENDWHERE
+!
+!
+!*      3.2     for raindrops
+!
+  WHERE (PRT(:,:,:,3) > 0.0)
+    ZLBDAR(:,:,:) = XLBR * (PRHODREF(:,:,:) * &
+                            MAX(PRT(:,:,:,3),XRTMIN(3)))**XLBEXR
+  END WHERE
+!
+  WHERE (PRT(:,:,:,3) > ZCLOUDLIM .AND. ZLBDAR(:,:,:) < XLBDAR_MAXE .AND. &
+                                        ZLBDAR(:,:,:) > 0.)
+    ZSIGMA(:,:,:,2) = XFQLIGHTR * ZLBDAR(:,:,:)**XEXQLIGHTR
+  END WHERE
+!
+!
+!*      3.3     for ice crystals
+!
+  WHERE (PRT(:,:,:,4) > ZCLOUDLIM .AND. PCIT(:,:,:) > 1.E4)
+    ZSIGMA(:,:,:,3) = XFQLIGHTI * PCIT(:,:,:)**(1.-XEXQLIGHTI) * &
+                     ((PRHODREF(:,:,:) * PRT(:,:,:,4))**XEXQLIGHTI)
+  ENDWHERE
+!
+!
+!*      3.4     for snow
+!
+  WHERE (PRT(:,:,:,5) > 0.0)
+    ZLBDAS(:,:,:) = MIN(XLBDAS_MAXE,               &
+                        XLBS * (PRHODREF(:,:,:) *  &
+                        MAX(PRT(:,:,:,5),XRTMIN(5)))**XLBEXS)
+  END WHERE
+!
+  WHERE (PRT(:,:,:,5) > ZCLOUDLIM .AND. ZLBDAS(:,:,:) < XLBDAS_MAXE .AND. &
+                                        ZLBDAS(:,:,:) > 0.)
+    ZSIGMA(:,:,:,4) = XFQLIGHTS * ZLBDAS(:,:,:)**XEXQLIGHTS
+  ENDWHERE
+!
+!
+!*      3.5     for graupel
+!
+  WHERE (PRT(:,:,:,6) > 0.0)
+    ZLBDAG(:,:,:) = XLBG * (PRHODREF(:,:,:) * MAX(PRT(:,:,:,6),XRTMIN(6)))**XLBEXG
+  END WHERE
+!
+  WHERE (PRT(:,:,:,6) > ZCLOUDLIM .AND. ZLBDAG(:,:,:) < XLBDAG_MAXE .AND. &
+                                        ZLBDAG(:,:,:) > 0.)
+    ZSIGMA(:,:,:,5) = XFQLIGHTG * ZLBDAG(:,:,:)**XEXQLIGHTG
+  ENDWHERE
+!
+!
+!*      3.6     for hail
+!
+  IF (KRR == 7) THEN
+    WHERE (PRT(:,:,:,7) > 0.0)
+      ZLBDAH(:,:,:) = XLBH * (PRHODREF(:,:,:) * &
+                      MAX(PRT(:,:,:,7), XRTMIN(7)))**XLBEXH
+    END WHERE
+!
+    WHERE (PRT(:,:,:,7) > ZCLOUDLIM .AND. ZLBDAH(:,:,:) < XLBDAH_MAXE .AND. &
+                                          ZLBDAH(:,:,:) > 0.)
+      ZSIGMA(:,:,:,6) = XFQLIGHTH * ZLBDAH(:,:,:)**XEXQLIGHTH
+    ENDWHERE
+  END IF
+!
+!
+!*      3.7     sum of the efficient cross sections
+!
+  ZSIGLOB(:,:,:) = ZSIGMA(:,:,:,1) + ZSIGMA(:,:,:,2) + ZSIGMA(:,:,:,3) + &
+                   ZSIGMA(:,:,:,4) + ZSIGMA(:,:,:,5)
+!
+  IF (KRR == 7) ZSIGLOB(:,:,:) = ZSIGLOB(:,:,:) + ZSIGMA(:,:,:,6)
+!
+IF (KRR == 7) THEN
+   CALL MPPDB_CHECK3DM("flash:: ZLBDAR,ZLBDAS,ZLBDAG,ZLBDAH",PRECISION,&
+        ZLBDAR,ZLBDAS,ZLBDAG,ZLBDAH,&
+        ZSIGMA(:,:,:,1),ZSIGMA(:,:,:,2),ZSIGMA(:,:,:,3),ZSIGMA(:,:,:,4),&
+        ZSIGMA(:,:,:,5),ZSIGMA(:,:,:,6))
+ELSE
+   CALL MPPDB_CHECK3DM("flash:: ZLBDAR,ZLBDAS,ZLBDAG",PRECISION,&
+        ZLBDAR,ZLBDAS,ZLBDAG,&
+        ZSIGMA(:,:,:,1),ZSIGMA(:,:,:,2),ZSIGMA(:,:,:,3),ZSIGMA(:,:,:,4),&
+        ZSIGMA(:,:,:,5))
+ENDIF
+!
+!-------------------------------------------------------------------------------
+!
+!*      4.      FIND THE TRIGGERING POINT IN EACH CELL
+!               --------------------------------------
+!
+  ALLOCATE (IPROC_TRIG(INB_CELL))
+  ALLOCATE (ISIGNE_EZ(INB_CELL))
+  ALLOCATE (GNEW_FLASH(INB_CELL))
+  ALLOCATE (ZNEUT_POS(INB_CELL))
+  ALLOCATE (ZNEUT_NEG(INB_CELL))
+!
+  IPROC_TRIG(:) = 0
+  ISIGNE_EZ(:) = 0
+  GNEW_FLASH(:) = .FALSE.
+  ZNEUT_POS(:) = 0.
+  ZNEUT_NEG(:) = 0.
+!
+  CALL TRIG_POINT
+!
+!
+!-------------------------------------------------------------------------------
+!
+!*      4.      FLASH TRIGGERING
+!               ----------------
+!
+  IFLASH_COUNT = 0
+  IFLASH_COUNT_GLOB = 0
+!
+  DO WHILE (GNEW_FLASH_GLOB)
+!
+    GATTACH(:,:,:) = .FALSE.
+!
+    DO IL = 1, INB_CELL
+      IF (GNEW_FLASH(IL)) THEN
+        ZFLASH(:,:,:,IL) = 0.
+! update lightning informations
+        INB_FLASH(IL) = INB_FLASH(IL) + 1   ! nb of flashes / cell / time step
+        INB_FL_REAL(IL) = INB_FL_REAL(IL) + 1   ! nb of flashes / cell / time step
+        INBSEG(IL) = 0        ! nb of segments / flash
+        ITYPE(IL) = 1
+!
+        IF (IPROC .EQ. IPROC_TRIG(IL)) THEN 
+           ZEMOD_BL = ZEM_TRIG(IL)
+           IIBL_LOC = ISEG_LOC(1,IL)    
+           IJBL_LOC = ISEG_LOC(2,IL)
+           IKBL     = ISEG_LOC(3,IL) 
+!
+           INBSEG(IL) = 1        ! nb of segments / flash
+           ZFLASH(IIBL_LOC,IJBL_LOC,IKBL,IL) = 1.
+        ENDIF
+!
+        GCG = .FALSE.
+        GCG_POS = .FALSE.
+
+        CALL MPPDB_CHECK3DM("flash:: 4. ZFLASH(IL)",PRECISION,&
+             ZFLASH(:,:,:,IL))
+!
+!
+!-------------------------------------------------------------------------------
+!
+!*      5.      PROPAGATE THE BIDIRECTIONAL LEADER
+!               ----------------------------------
+!
+! it is assumed that the leader propagates only along the vertical
+!
+!*      5.1     positive segments
+!
+! the positive leader propagates parallel to the electric field
+        ISIGN_LEADER = 1
+        CALL ONE_LEADER
+        IPOS_LEADER = INBSEG(IL) -1
+!
+!
+!*      5.2     negative segments
+!
+! the negative leader propagates anti-parallel to the electric field
+        ZEMOD_BL = ZEM_TRIG(IL)
+        IKBL     = ISEG_LOC(3,IL)
+        ISIGN_LEADER = -1
+        CALL ONE_LEADER
+!
+        INBSEG_LEADER(IL) = INBSEG(IL)
+        INEG_LEADER = INBSEG_LEADER(IL) - IPOS_LEADER - 1
+!
+! Eliminate this flash if only positive or negative leader exists        
+        IF (IPROC .EQ. IPROC_TRIG(IL)) THEN 
+          IF (IPOS_LEADER .EQ. 0 .OR. INEG_LEADER .EQ. 0) THEN
+            ZFLASH(IIBL_LOC,IJBL_LOC,IKB:IKE,IL) = 0.
+            INB_FL_REAL(IL) = INB_FL_REAL(IL) - 1
+            GNEW_FLASH(IL) = .FALSE.
+          ELSE    ! return to actual Triggering electrical field
+            IIBL_LOC = ISEG_LOC(1,IL)
+            IJBL_LOC = ISEG_LOC(2,IL)
+            IKBL     = ISEG_LOC(3,IL)
+            ZEM_TRIG(IL) = ZEM_TRIG(IL)/ZPRES_COEF(IIBL_LOC,IJBL_LOC,IKBL)
+          ENDIF
+        ENDIF
+
+       CALL MPPDB_CHECK3DM("flash:: 5. ZFLASH(IL)",PRECISION,&
+             ZFLASH(:,:,:,IL))
+!
+        CALL MPI_BCAST (GNEW_FLASH(IL),1,   MNHLOG_MPI, IPROC_TRIG(IL), &
+                        NMNH_COMM_WORLD, IERR)
+        CALL MPI_BCAST (ZEM_TRIG(IL), 1,    MNHREAL_MPI, IPROC_TRIG(IL), &
+                        NMNH_COMM_WORLD, IERR)
+        CALL MPI_BCAST (INB_FL_REAL(IL), 1, MNHINT_MPI, IPROC_TRIG(IL), &
+                        NMNH_COMM_WORLD, IERR)
+      END IF
+    END DO  ! end loop il
+!
+!
+!-------------------------------------------------------------------------------
+!
+!*      6.      POSITIVE AND NEGATIVE REGIONS WHERE THE FLASH CAN PROPAGATE
+!               -----------------------------------------------------------
+!
+! Note: this is done to avoid branching in a third charge region:
+! the branches 'stay' in the 2 charge regions where the bileader started to propagate
+!
+!*      6.1     positive charge region associated to the negative leader
+!
+    ALLOCATE (GPROP(SIZE(PRT,1),SIZE(PRT,2),SIZE(PRT,3),INB_CELL))
+    GPROP(:,:,:,:) = .FALSE.
+!
+    GPOSITIVE = .TRUE.
+    CALL CHARGE_POCKET
+!
+!
+!*      6.2     negative charge region associated to the positive leader
+!
+    GPOSITIVE = .FALSE.
+    CALL CHARGE_POCKET
+!
+! => a point can be added to the flash only if gprop = true
+!
+!
+!-------------------------------------------------------------------------------
+!
+!*      7.      NUMBER OF POINTS TO REDISTRIBUTE AT DISTANCE D
+!               ----------------------------------------------
+!
+!*      7.1     distance between the triggering point and each point of the mask
+!*              global coordinates: only points possibly contributing to branches
+!
+    INB_NEUT_OK = 0
+!
+    DO IL = 1, INB_CELL
+      IF (GNEW_FLASH(IL)) THEN
+        INB_PROP = COUNT(GPROP(IIB:IIE,IJB:IJE,IKB:IKE,IL))
+        CALL SUM_ELEC_ll(INB_PROP)
+!
+        IF (INB_PROP .GT. 0) THEN
+          ZDIST(:,:,:) = 0.
+          DO II = IIB, IIE
+            DO IJ = IJB, IJE
+              DO IK = IKB, IKE
+                IF (GPROP(II,IJ,IK,IL)) THEN
+                  ZDIST(II,IJ,IK) = ((XXHATM(II) - ZCOORD_TRIG(1,IL))**2 + &
+                                     (XYHATM(IJ) - ZCOORD_TRIG(2,IL))**2 + &
+                                     (ZZMASS(II,IJ,IK) - ZCOORD_TRIG(3,IL))**2)**0.5
+                END IF
+              END DO
+            END DO
+          END DO
+!
+!
+!*      7.3     compute the min and max distance from the triggering point - global
+!
+          ZMIN_DIST = 0.0
+          ZMAX_DIST = MAX_ll(ZDIST,IPROC_AUX)
+!
+! transform the min and max distances into min and max increments 
+          IIND_MIN = 1
+          IIND_MAX = MAX(1, INT((ZMAX_DIST-ZMIN_DIST)/ZMEAN_GRID +1.))
+          IDELTA_IND = IIND_MAX + 1
+!
+          ALLOCATE (IHIST_LOC(IDELTA_IND))
+          ALLOCATE (ZHIST_PERCENT(IDELTA_IND))
+          ALLOCATE (IHIST_GLOB(IDELTA_IND))
+          ALLOCATE (ZMAX_BRANCH(IDELTA_IND))
+          ALLOCATE (IMAX_BRANCH(IDELTA_IND))
+          ALLOCATE (IMASKQ_DIST(SIZE(PRT,1),SIZE(PRT,2),SIZE(PRT,3)))
+!
+          IHIST_LOC(:) = 0
+          ZHIST_PERCENT(:) = 0.
+          IHIST_GLOB(:) = 0
+          ZMAX_BRANCH(:) = 0.
+          IMAX_BRANCH(:) = 0
+          IMASKQ_DIST(:,:,:) = 0
+!
+!
+!*      7.4     histogram: number of points between r and r+dr
+!*              for each proc
+!
+! build an array with the possible points: IMASKQ_DIST contains the distance 
+! rank of points contributing to branches, excluding the leader points
+!
+          DO II = IIB, IIE 
+            DO IJ = IJB, IJE
+              DO IK = IKB, IKE
+                IF (ZDIST(II,IJ,IK) .NE. 0.) THEN
+                  IM = INT( (ZDIST(II,IJ,IK)-ZMIN_DIST)/ZMEAN_GRID + 1.)
+                  IHIST_LOC(IM) = IHIST_LOC(IM) + 1
+                  IMASKQ_DIST(II,IJ,IK) = IM
+                ENDIF
+              END DO
+            END DO
+          END DO
+!
+!
+!*      7.5     global histogram
+!
+          IHIST_GLOB(:) = IHIST_LOC(:) 
+          CALL SUM_ELEC_ll(IHIST_GLOB)
+!
+!
+!*      7.6     normalization
+!
+          ZHIST_PERCENT(:) = 0.
+          ZMAX_BRANCH(:) = 0.
+          IMAX_BRANCH(:) = 0
+!
+          DO IM = 1, IDELTA_IND
+            IF (IHIST_GLOB(IM) .GT. 0) THEN
+              ZHIST_PERCENT(IM) = REAL(IHIST_LOC(IM)) / REAL(IHIST_GLOB(IM))
+            END IF
+!
+!
+!-------------------------------------------------------------------------------
+!
+!*      8.      BRANCHES
+!               --------
+!
+!*      8.1     max number of branches at distance d from the triggering point
+!
+            ZMAX_BRANCH(IM) = (XDFRAC_L / ZMEAN_GRID) * &
+                              REAL(IIND_MIN+IM-1)**(XDFRAC_ECLAIR - 1.)
+            ZMAX_BRANCH(IM) = ANINT(ZMAX_BRANCH(IM))
+! all procs know the max total number of branches at distance d
+! => the max number of branches / proc is proportional to the percentage of 
+! available points / proc at this distance
+!
+            IMAX_BRANCH(IM) = INT(ANINT(ZMAX_BRANCH(IM)))
+          END DO
+!
+          DEALLOCATE (IHIST_LOC)
+          DEALLOCATE (ZHIST_PERCENT)
+          DEALLOCATE (IHIST_GLOB)
+          DEALLOCATE (ZMAX_BRANCH)
+!
+!
+!*      8.3     distribute the branches
+!
+!
+          CALL BRANCH_GEOM(IKB, IKE)
+!
+          DEALLOCATE (IMAX_BRANCH)
+          DEALLOCATE (IMASKQ_DIST)
+        END IF   ! end if count(gprop)
+!
+!
+!-------------------------------------------------------------------------------
+!
+!*      9.      NEUTRALIZATION
+!               --------------
+        CALL MPPDB_CHECK3DM("flash:: 9. ZQMTOT",PRECISION,ZQMTOT)
+        CALL MPPDB_CHECK3DM("flash:: 9. ZFLASH",PRECISION,ZFLASH(:,:,:,IL))
+!
+!*      9.1     charge carried by the lightning flash
+!
+        ZQFLASH(:,:,:) = 0.
+        WHERE (ZFLASH(IIB:IIE,IJB:IJE,IKB:IKE,IL) .GT. 0. .AND.          &
+               ABS(ZQMTOT(IIB:IIE,IJB:IJE,IKB:IKE) *                     &
+                   PRHODREF(IIB:IIE,IJB:IJE,IKB:IKE)) .GT. XQNEUT .AND. &
+               ZSIGLOB(IIB:IIE,IJB:IJE,IKB:IKE) .GE. ZSIGMIN)
+          ZQFLASH(IIB:IIE,IJB:IJE,IKB:IKE) = -1. *               &             
+                         (ABS(ZQMTOT(IIB:IIE,IJB:IJE,IKB:IKE)) / &
+                              ZQMTOT(IIB:IIE,IJB:IJE,IKB:IKE)) * &
+                         (ABS(ZQMTOT(IIB:IIE,IJB:IJE,IKB:IKE)) - &
+                         (XQNEUT / PRHODREF(IIB:IIE,IJB:IJE,IKB:IKE)))
+          GATTACH(IIB:IIE,IJB:IJE,IKB:IKE) = .TRUE.
+
+        END WHERE
+!
+! net charge carried by the flash (for charge conservation / IC)
+        ZQNET = SUM3D_ll(ZQFLASH*PRHODJ, IINFO_ll)
+!
+!
+!*      9.2     number of points to neutralize
+!
+        INB_NEUT = COUNT(ZSIGLOB(IIB:IIE,IJB:IJE,IKB:IKE) .GE. ZSIGMIN .AND. &
+                         ZQFLASH(IIB:IIE,IJB:IJE,IKB:IKE) .NE. 0.)
+        CALL SUM_ELEC_ll(INB_NEUT)
+
+!
+!
+!*      9.3     ensure total charge conservation for IC
+!
+        IF (INB_NEUT .GE. 3) THEN
+          GNEUTRALIZATION = .TRUE.
+        ELSE
+          GNEUTRALIZATION = .FALSE.
+          GNEW_FLASH(IL) = .FALSE. 
+          INB_FL_REAL(IL) = INB_FL_REAL(IL) - 1
+        END IF
+!
+        IF (GNEUTRALIZATION .AND. (.NOT. GCG) .AND. ZQNET .NE. 0.) THEN
+          ZQNET = ZQNET / REAL(INB_NEUT) 
+          WHERE (ZSIGLOB(IIB:IIE,IJB:IJE,IKB:IKE) .GE. ZSIGMIN .AND. &
+                 ZQFLASH(IIB:IIE,IJB:IJE,IKB:IKE) .NE. 0.)
+            ZQFLASH(IIB:IIE,IJB:IJE,IKB:IKE) = ZQFLASH(IIB:IIE,IJB:IJE,IKB:IKE) - &
+                                       ZQNET / PRHODJ(IIB:IIE,IJB:IJE,IKB:IKE) 
+          ENDWHERE
+        END IF
+!
+!
+!*      9.4     charge neutralization 
+!
+        CALL MPPDB_CHECK3DM("flash:: 9.4 ZQFLASH,ZSIGLOB",PRECISION,&
+             ZQFLASH,ZSIGLOB)
+
+        ZDQDT(:,:,:,:) = 0.
+!  
+        IF (GNEUTRALIZATION) THEN
+          IF (ITYPE(IL) .EQ. 1.) THEN         
+            WHERE (ZQFLASH(IIB:IIE,IJB:IJE,IKB:IKE) < 0.)
+                       !  increase negative ion charge
+              ZDQDT(IIB:IIE,IJB:IJE,IKB:IKE,NSV_ELEC) =         &
+                     ZDQDT(IIB:IIE,IJB:IJE,IKB:IKE,NSV_ELEC) +  &
+                     ZQFLASH(IIB:IIE,IJB:IJE,IKB:IKE)
+            ENDWHERE
+!
+            WHERE (ZQFLASH(IIB:IIE,IJB:IJE,IKB:IKE) > 0.)
+                     ! Increase positive ion charge
+              ZDQDT(IIB:IIE,IJB:IJE,IKB:IKE,1) =         &
+                     ZDQDT(IIB:IIE,IJB:IJE,IKB:IKE,1) +  &
+                     ZQFLASH(IIB:IIE,IJB:IJE,IKB:IKE)
+            ENDWHERE
+!
+!
+!*      9.4.2   cloud-to-ground flashes
+!
+          ELSE   
+!
+! Neutralization of the charge on positive CG flashes
+            IF (ITYPE(IL) .EQ. 3) THEN   
+              DO II = 1, NSV_ELEC
+                WHERE (ZQFLASH(IIB:IIE,IJB:IJE,IKB:IKE) > 0.)
+                  ZDQDT(IIB:IIE,IJB:IJE,IKB:IKE,II) =    &
+                     ZDQDT(IIB:IIE,IJB:IJE,IKB:IKE,II) - &
+                     ZQMT(IIB:IIE,IJB:IJE,IKB:IKE,II)
+                END WHERE
+              ENDDO
+!
+              WHERE (ZQFLASH(IIB:IIE,IJB:IJE,IKB:IKE) > 0.) 
+                ZQFLASH(IIB:IIE,IJB:IJE,IKB:IKE)=0.
+              END WHERE
+!
+              WHERE (ZQFLASH(IIB:IIE,IJB:IJE,IKB:IKE) < 0.)
+! Increase negative ion charge
+                ZDQDT(IIB:IIE,IJB:IJE,IKB:IKE,NSV_ELEC) =         &
+                       ZDQDT(IIB:IIE,IJB:IJE,IKB:IKE,NSV_ELEC) +  &
+                       ZQFLASH(IIB:IIE,IJB:IJE,IKB:IKE)
+              ENDWHERE
+            ELSE
+!
+! Neutralization of the charge on negative CG flashes
+!
+              DO II = 1, NSV_ELEC
+                WHERE (ZQFLASH(IIB:IIE,IJB:IJE,IKB:IKE) < 0.)
+                  ZDQDT(IIB:IIE,IJB:IJE,IKB:IKE,II) =      &
+                       ZDQDT(IIB:IIE,IJB:IJE,IKB:IKE,II) - &
+                       ZQMT(IIB:IIE,IJB:IJE,IKB:IKE,II)
+                END WHERE
+              ENDDO
+!
+              WHERE (ZQFLASH(IIB:IIE,IJB:IJE,IKB:IKE) < 0.)
+                ZQFLASH(IIB:IIE,IJB:IJE,IKB:IKE)=0.
+              END WHERE
+!
+              WHERE (ZQFLASH(IIB:IIE,IJB:IJE,IKB:IKE) > 0.)
+                        ! Increase positive ion charge
+                ZDQDT(IIB:IIE,IJB:IJE,IKB:IKE,1) =         &
+                       ZDQDT(IIB:IIE,IJB:IJE,IKB:IKE,1) +  &
+                       ZQFLASH(IIB:IIE,IJB:IJE,IKB:IKE)
+              ENDWHERE
+            END IF        ! GCG_POS
+          END IF          ! NOT(GCG)
+!
+! Counting the total number of points neutralized in the cell
+          IF (IPROC .EQ. IPROC_TRIG(IL)) THEN
+             INB_NEUT_OK = INB_NEUT_OK + INB_NEUT
+          END IF
+!
+          CALL MPI_BCAST (INB_NEUT_OK,1, MNHINT_MPI, IPROC_TRIG(IL), &
+                    NMNH_COMM_WORLD, IERR)
+!
+!*      9.5     Gather lightning information from all processes
+!*              Save the particule charge and total pos/neg charge neutralization points.
+!*                   the coordinates of all flash branch points
+!
+          CALL MPI_ALLGATHER(INBSEG(IL), 1, MNHINT_MPI, &
+                             INBSEG_PROC,  1, MNHINT_MPI, NMNH_COMM_WORLD, IERR)
+
+          INBSEG_ALL(IL) = INBSEG(IL)
+          CALL SUM_ELEC_ll(INBSEG_ALL(IL))
+
+          CALL GATHER_ALL_BRANCH
+!
+!*      9.6     update the source term
+!
+          CALL MPPDB_CHECK3DM("flash:: 9.6 PRSVS",PRECISION,&
+               PRSVS(:,:,:,1),PRSVS(:,:,:,2),PRSVS(:,:,:,3),PRSVS(:,:,:,4),&
+               PRSVS(:,:,:,5),PRSVS(:,:,:,6),PRSVS(:,:,:,7))
+          CALL MPPDB_CHECK3DM("flash:: 9.6 ZDQDT",PRECISION,&
+               ZDQDT(:,:,:,1),ZDQDT(:,:,:,2),ZDQDT(:,:,:,3),ZDQDT(:,:,:,4),&
+               ZDQDT(:,:,:,5),ZDQDT(:,:,:,6),ZDQDT(:,:,:,7))
+
+          DO II = IIB, IIE
+            DO IJ = IJB, IJE
+              DO IK = IKB, IKE
+                DO IM = 1, NSV_ELEC
+                  IF (ZDQDT(II,IJ,IK,IM) .NE. 0.) THEN
+                    PRSVS(II,IJ,IK,IM) = PRSVS(II,IJ,IK,IM) + &
+                                         ZDQDT(II,IJ,IK,IM) * &
+                                         PRHODJ(II,IJ,IK) / PTSTEP
+                  END IF
+!
+!
+!*      9.7     update the positive and negative charge neutralized
+!
+                  IF (ZDQDT(II,IJ,IK,IM) .LT. 0.) THEN
+                    ZNEUT_NEG(IL) = ZNEUT_NEG(IL) + ZDQDT(II,IJ,IK,IM) * &
+                                                    PRHODJ(II,IJ,IK) 
+                  ELSE IF (ZDQDT(II,IJ,IK,IM) .GT. 0.) THEN
+                    ZNEUT_POS(IL) = ZNEUT_POS(IL) + ZDQDT(II,IJ,IK,IM) * &
+                                                    PRHODJ(II,IJ,IK) 
+                  END IF
+                END DO
+              END DO
+            END DO
+          END DO
+!
+          CALL SUM_ELEC_ll(ZNEUT_POS(IL))
+          CALL SUM_ELEC_ll(ZNEUT_NEG(IL))
+!
+!
+!*      9.8     compute the NOx production
+!
+!!   The lightning length is first computed. The number of NOx molecules per
+!! meter of lightning flash is taken from Wang et al. (1998). It is a linear
+!! function of the pressure. No distinction is made between ICs and CGs.
+
+          IF (LLNOX_EXPLICIT) THEN
+            IFLASH_COUNT_GLOB = IFLASH_COUNT_GLOB + 1
+            IF (INBSEG(IL) .NE. 0) THEN
+              DO II = 0, INBSEG(IL)-1
+                IM = 3 * II
+                IX = ISEG_GLOB(IM+1,IL) - IXOR + 1
+                IY = ISEG_GLOB(IM+2,IL) - IYOR + 1
+                IZ = ISEG_GLOB(IM+3,IL)
+                ZLGHTLENGTH = (XDXX(IX,IY,IZ) * XDYY(IX,IY,IZ) * &
+                               XDZZ(IX,IY,IZ))**(1./3.)
+                ZLNOX(IX, IY, IZ) = ZLNOX(IX, IY, IZ) +                     &
+                                   (XWANG_A + XWANG_B * PPABST(IX,IY,IZ)) * &
+                                    ZLGHTLENGTH
+              ENDDO
+              IFLASH_COUNT = IFLASH_COUNT + 1
+            END IF
+          END IF
+        END IF            !  GNEUTRALIZATION
+      END IF    ! end if gnew_flash
+    END DO    ! end loop il
+!
+    DEALLOCATE (GPROP)
+!
+!
+!----------------------------------------------------------------------------
+!
+!*      10.     PRINT OR SAVE (before print) LIGHTNING INFORMATIONS
+!               ---------------------------------------------------
+!
+! Synchronizing all processes
+!   CALL MPI_BARRIER(NMNH_COMM_WORLD, IERR)   ! A ACTIVER SI PB.
+!
+    INBLIGHT = COUNT(GNEW_FLASH(1:INB_CELL))
+    IF (IPROC .EQ. 0) THEN
+      IF (INBLIGHT .NE. 0) THEN
+        IF ((NNBLIGHT+INBLIGHT) .LE. NFLASH_WRITE) THEN       ! SAVE
+          ISAVE_STATUS = 1
+          DO IL = 1, INB_CELL
+            IF (GNEW_FLASH(IL)) THEN
+              NNBLIGHT = NNBLIGHT + 1
+              ISFLASH_NUMBER(NNBLIGHT) = ISFLASH_NUMBER(NNBLIGHT-1) + 1
+              ISNB_FLASH(NNBLIGHT) = INB_FL_REAL(IL)
+              ISNBSEG(NNBLIGHT) = INBSEG_ALL(IL)
+              ISCELL_NUMBER(NNBLIGHT) = IL
+              ISTCOUNT_NUMBER(NNBLIGHT) = KTCOUNT
+              ISTYPE(NNBLIGHT) = ITYPE(IL)
+              ZSEM_TRIG(NNBLIGHT) = ZEM_TRIG(IL) / 1000.
+              ZSNEUT_POS(NNBLIGHT) = ZNEUT_POS(IL) 
+              ZSNEUT_NEG(NNBLIGHT) = ZNEUT_NEG(IL)
+!
+              DO II = 1, INBSEG_ALL(IL)
+                IM = 3 * (II - 1)
+                ZSCOORD_SEG(NNBLIGHT,II,1:3) = ZCOORD_SEG_ALL(IM+1:IM+3,IL)
+              ENDDO
+!
+              IF(LLMA) THEN
+                DO II = 1, INBSEG_ALL(IL)
+                  IM = 3 * (II - 1)
+                  ISLMA_SEG_GLOB(NNBLIGHT,II,1:3) = ILMA_SEG_ALL(IM+1:IM+3,IL)
+                  IM = NSV_ELEC * (II - 1)
+                  ZSLMA_QMT(NNBLIGHT,II,2:6) = ZLMA_QMT(IM+2:IM+6,IL)
+                  ZSLMA_PRT(NNBLIGHT,II,2:6) = ZLMA_PRT(IM+2:IM+6,IL)
+                  ZSLMA_NEUT_POS(NNBLIGHT,II) = ZLMA_NEUT_POS(II,IL)
+                  ZSLMA_NEUT_NEG(NNBLIGHT,II) = ZLMA_NEUT_NEG(II,IL)
+                END DO
+              END IF   ! llma
+            END IF   ! gnew_flash
+          END DO   ! end loop il
+!
+          IF (NNBLIGHT .EQ. NFLASH_WRITE) ISAVE_STATUS = 0
+!
+        ELSE    ! Print in output files
+          ISAVE_STATUS = 2
+        END IF
+!      
+        IF (ISAVE_STATUS .EQ. 0 .OR. ISAVE_STATUS .EQ. 2) THEN
+          CALL WRITE_OUT_ASCII
+          IF(LLMA) THEN
+            CALL WRITE_OUT_LMA
+          END IF
+          ISFLASH_NUMBER(0) = ISFLASH_NUMBER(NNBLIGHT)
+        END IF
+!
+        IF (ISAVE_STATUS .EQ. 2) THEN   ! Save flashes of the temporal loop
+          NNBLIGHT = 0
+          DO IL = 1, INB_CELL
+            IF (GNEW_FLASH(IL)) THEN
+              NNBLIGHT = NNBLIGHT + 1
+              ISFLASH_NUMBER(NNBLIGHT) = ISFLASH_NUMBER(NNBLIGHT-1) + 1
+              ISNB_FLASH(NNBLIGHT) = INB_FL_REAL(IL)
+              ISNBSEG(NNBLIGHT) = INBSEG_ALL(IL)
+              ISCELL_NUMBER(NNBLIGHT) = IL
+              ISTCOUNT_NUMBER(NNBLIGHT) = KTCOUNT
+              ISTYPE(NNBLIGHT) = ITYPE(IL)
+              ZSEM_TRIG(NNBLIGHT) = ZEM_TRIG(IL) / 1000.
+              ZSNEUT_POS(NNBLIGHT) = ZNEUT_POS(IL) 
+              ZSNEUT_NEG(NNBLIGHT) = ZNEUT_NEG(IL)
+!
+              DO II = 1, INBSEG_ALL(IL)
+                IM = 3 * (II - 1)
+                ZSCOORD_SEG(NNBLIGHT, II, 1:3) = ZCOORD_SEG_ALL(IM+1:IM+3, IL)
+              ENDDO
+!
+              IF(LLMA) THEN
+                DO II = 1, INBSEG_ALL(IL)
+                  IM = 3 * (II - 1)
+                  ISLMA_SEG_GLOB(NNBLIGHT,II,1:3) = ILMA_SEG_ALL(IM+1:IM+3,IL)
+                  IM = NSV_ELEC*(II-1)
+                  ZSLMA_QMT(NNBLIGHT,II,2:6) = ZLMA_QMT(IM+2:IM+6,IL)
+                  ZSLMA_PRT(NNBLIGHT,II,2:6) = ZLMA_PRT(IM+2:IM+6,IL)
+                  ZSLMA_NEUT_POS(NNBLIGHT,II) = ZLMA_NEUT_POS(II,IL)
+                  ZSLMA_NEUT_NEG(NNBLIGHT,II) = ZLMA_NEUT_NEG(II,IL)
+                END DO
+              END IF
+            END IF
+          ENDDO
+        END IF
+!
+        IF (ISAVE_STATUS .EQ. 0) THEN
+          NNBLIGHT = 0
+        END IF
+      END IF   ! INBLIGHT
+    END IF   ! IPROC
+!
+! Save flash location statistics in all processes
+    IF (INBLIGHT .NE. 0) THEN
+      DO IL = 1, INB_CELL
+        IF (GNEW_FLASH(IL)) THEN
+          IMAP2D(:,:)   = 0
+          DO IK = IKB, IKE
+            IMAP2D(:,:) = IMAP2D(:,:) + ZFLASH(:,:,IK,IL)
+          END DO
+!
+! Detect Trig/Impact X,Y location
+          IX = 0
+          IY = 0
+          GFIRSTFLASH = .FALSE.
+          DO II = IIB, IIE
+            DO IJ = IJB, IJE
+              DO IK = IKB, IKE
+                IF (GFIRSTFLASH) EXIT
+                IF (ZFLASH(II,IJ,IK,IL)==1.) THEN
+                  IX = II
+                  IY = IJ
+                  GFIRSTFLASH = .TRUE.
+                END IF
+              END DO
+            END DO
+          END DO
+!
+! Store
+          IF (ITYPE(IL)==1) THEN ! IC
+            IF (IX*IY/=0) NMAP_TRIG_IC(IX,IY) = NMAP_TRIG_IC(IX,IY) + 1
+            NMAP_2DAREA_IC(:,:) = NMAP_2DAREA_IC(:,:) + MIN(1,IMAP2D(:,:))
+            NMAP_3DIC(:,:,:)    = NMAP_3DIC(:,:,:) + ZFLASH(:,:,:,IL)
+          ELSE ! CGN & CGP
+            IF (IX*IY/=0) NMAP_IMPACT_CG(IX,IY) = NMAP_IMPACT_CG(IX,IY) + 1
+            NMAP_2DAREA_CG(:,:) = NMAP_2DAREA_CG(:,:) + MIN(1,IMAP2D(:,:))
+            NMAP_3DCG(:,:,:)    = NMAP_3DCG(:,:,:) + ZFLASH(:,:,:,IL)
+          END IF
+        END IF
+      ENDDO
+    END IF   ! INBLIGHT
+!
+!------------------------------------------------------------------------------
+!
+!*    11.      ATTACHMENT AFTER CHARGE NEUTRALIZATION
+!              --------------------------------------
+!
+!*    11.1     ion attachment
+!
+    IF (INB_NEUT_OK .NE. 0) THEN
+
+       CALL MPPDB_CHECK3DM("flash:: PRSVS",PRECISION,&
+            PRSVS(:,:,:,1),PRSVS(:,:,:,2),PRSVS(:,:,:,3),PRSVS(:,:,:,4),&
+            PRSVS(:,:,:,5),PRSVS(:,:,:,6),PRSVS(:,:,:,7))
+
+      PRSVS(:,:,:,1) = PRSVS(:,:,:,1) / XECHARGE
+      PRSVS(:,:,:,NSV_ELEC) = - PRSVS(:,:,:,NSV_ELEC) / XECHARGE
+!
+      CALL ION_ATTACH_ELEC(KTCOUNT, KRR, PTSTEP, PRHODREF,                   &
+                           PRHODJ, PRSVS, PRS, PTHT, PCIT, PPABST, PEFIELDU, &
+                           PEFIELDV, PEFIELDW, GATTACH, PTOWN, PSEA          )
+!
+      PRSVS(:,:,:,1) = PRSVS(:,:,:,1) * XECHARGE
+      PRSVS(:,:,:,NSV_ELEC) = - PRSVS(:,:,:,NSV_ELEC) * XECHARGE
+
+       CALL MPPDB_CHECK3DM("flash:: after ION PRSVS",PRECISION,&
+            PRSVS(:,:,:,1),PRSVS(:,:,:,2),PRSVS(:,:,:,3),PRSVS(:,:,:,4),&
+            PRSVS(:,:,:,5),PRSVS(:,:,:,6),PRSVS(:,:,:,7))
+    ENDIF
+!
+!
+!*    11.2    update the charge density to check if another flash can be triggered
+!
+    ZQMTOT(:,:,:) = 0.  
+    DO II = 1, NSV_ELEC
+! transform the source term (C/s) into the updated charge density (C/kg)
+      ZQMT(:,:,:,II) = PRSVS(:,:,:,II) * PTSTEP / PRHODJ(:,:,:)
+!
+! total charge density (C/kg)
+      ZQMTOT(:,:,:)  = ZQMTOT(:,:,:) + PRSVS(:,:,:,II) * PTSTEP / PRHODJ(:,:,:)
+    END DO
+!
+!
+!-------------------------------------------------------------------------------
+!
+!*      12.     CHECK IF ANOTHER FLASH CAN BE TRIGGERED
+!               ---------------------------------------
+!
+
+    IF ((MAXVAL(INB_FLASH(:))+1) < INBFTS_MAX) THEN
+      IF (INB_NEUT_OK .NE. 0) THEN
+         CALL MPPDB_CHECK3DM("flash:: PRHODJ,PRT",PRECISION,&
+              PRHODJ,PRT(:,:,:,1),PRT(:,:,:,2),PRT(:,:,:,3),PRT(:,:,:,4),&
+              PRT(:,:,:,5),PRT(:,:,:,6))
+         CALL MPPDB_CHECK3DM("flash:: ZQMT",PRECISION,&
+              ZQMT(:,:,:,1),ZQMT(:,:,:,2),ZQMT(:,:,:,3),ZQMT(:,:,:,4),&
+              ZQMT(:,:,:,5),ZQMT(:,:,:,6),ZQMT(:,:,:,7))
+        CALL TO_ELEC_FIELD_n (PRT, ZQMT, PRHODJ, KTCOUNT, KRR, &
+                              PEFIELDU, PEFIELDV, PEFIELDW)
+        CALL MPPDB_CHECK3DM("flash:: PEFIELDU, PEFIELDV, PEFIELDW",PRECISION,&
+             PEFIELDU, PEFIELDV, PEFIELDW)
+! electric field module including pressure effect
+        ZEMODULE(IIB:IIE,IJB:IJE,IKB:IKE) = ZPRES_COEF(IIB:IIE,IJB:IJE,IKB:IKE)*    &
+                                            (PEFIELDU(IIB:IIE,IJB:IJE,IKB:IKE)**2 + &
+                                             PEFIELDV(IIB:IIE,IJB:IJE,IKB:IKE)**2 + &
+                                             PEFIELDW(IIB:IIE,IJB:IJE,IKB:IKE)**2)**0.5
+      ENDIF
+!
+      ISEG_LOC(:,:) = 0
+      ZCOORD_TRIG(:,:) = 0.
+      ZCOORD_SEG(:,:) = 0.
+      IPROC_TRIG(:) = 0
+      ISIGNE_EZ(:) = 0
+!
+      CALL TRIG_POINT
+    ELSE
+      GNEW_FLASH_GLOB = .FALSE.
+    END IF
+!
+    ZNEUT_POS(:) = 0.
+    ZNEUT_NEG(:) = 0.
+!
+    IF (LLMA) THEN
+      ZLMA_NEUT_POS(:,:) = 0.
+      ZLMA_NEUT_NEG(:,:) = 0.
+    END IF
+  END DO   ! end loop do while
+!
+!
+!-------------------------------------------------------------------------------
+!
+!*      13.     COMPUTE THE NOX SOURCE TERM
+!               ---------------------------
+!
+  IF (LLNOX_EXPLICIT) THEN
+    IF (IFLASH_COUNT_GLOB .NE. 0) THEN
+      ZCOEF = XMD / XAVOGADRO
+      XLNOX_ECLAIR = 0.
+      IF (IFLASH_COUNT .NE. 0) THEN
+        XLNOX_ECLAIR = SUM(ZLNOX(:,:,:))
+        PSVS_LINOX(:,:,:) = PSVS_LINOX(:,:,:) + ZLNOX(:,:,:) * ZCOEF ! PRHODJ is
+                                                                     ! implicit
+      END IF
+      CALL SUM_ELEC_ll (XLNOX_ECLAIR)
+      XLNOX_ECLAIR = XLNOX_ECLAIR / (XAVOGADRO * REAL(IFLASH_COUNT_GLOB))
+    END IF
+    DEALLOCATE (ZLNOX)
+  END IF
+!
+  DEALLOCATE (ZNEUT_POS)
+  DEALLOCATE (ZNEUT_NEG)
+  DEALLOCATE (ZSIGMA)
+  DEALLOCATE (ZLBDAR)
+  DEALLOCATE (ZLBDAS)
+  DEALLOCATE (ZLBDAG)
+  IF (KRR == 7) DEALLOCATE (ZLBDAH)
+  DEALLOCATE (ZSIGLOB)
+  DEALLOCATE (ZDQDT)
+  DEALLOCATE (ZDIST)
+  DEALLOCATE (ZFLASH)
+  DEALLOCATE (ZQFLASH)
+  DEALLOCATE (IPROC_TRIG)
+  DEALLOCATE (ISIGNE_EZ)
+  DEALLOCATE (GNEW_FLASH)
+  DEALLOCATE (INBSEG)
+  DEALLOCATE (INBSEG_ALL)
+  DEALLOCATE (INBSEG_LEADER)
+  DEALLOCATE (INB_FLASH)
+  DEALLOCATE (INB_FL_REAL)
+  DEALLOCATE (ZEM_TRIG)
+  DEALLOCATE (ITYPE)
+  DEALLOCATE (ISEG_LOC)
+  DEALLOCATE (ZCOORD_TRIG)
+  DEALLOCATE (ZCOORD_SEG)
+  DEALLOCATE (ZCOORD_SEG_ALL)
+  DEALLOCATE (ISEG_GLOB)
+  DEALLOCATE (GATTACH)
+  IF(LLMA) THEN
+    DEALLOCATE (ILMA_SEG_ALL)
+    DEALLOCATE (ZLMA_QMT)
+    DEALLOCATE (ZLMA_PRT)
+    DEALLOCATE (ZLMA_NEUT_POS)
+    DEALLOCATE (ZLMA_NEUT_NEG)
+  END IF
+END IF   ! (inb_cell .ge. 1)
+!
+!
+!-------------------------------------------------------------------------------
+!
+!*      13.     PRINT LIGHTNING INFORMATIONS FOR THE LAST TIMESTEP
+!               OR LMA_TIME_SAVE IS REACHED IF LLMA OPTION IS USED
+!               --------------------------------------------------
+!
+IF (LLMA) THEN
+  IF( IPROC .EQ. 0 .AND. TDTCUR%xtime >= TDTLMA%xtime - PTSTEP ) THEN
+    CALL WRITE_OUT_ASCII
+    CALL WRITE_OUT_LMA
+    ISFLASH_NUMBER(0) = ISFLASH_NUMBER(NNBLIGHT)
+    NNBLIGHT = 0
+  END IF
+END IF
+!
+IF (NNBLIGHT .NE. 0 .AND. ((IPROC .EQ. 0 .AND. OEXIT) .OR. &
+                           (KTCOUNT == NSTOP .AND. KMI==1))) THEN
+  CALL WRITE_OUT_ASCII
+  IF(LLMA) CALL WRITE_OUT_LMA
+END IF
+!
+!
+!-------------------------------------------------------------------------------
+!
+!*      14.     DEALLOCATE
+!               ----------
+!
+DEALLOCATE (ICELL_LOC)
+DEALLOCATE (ZQMT)
+DEALLOCATE (ZQMTOT)
+DEALLOCATE (ZCLOUD)
+DEALLOCATE (ZCELL)
+DEALLOCATE (ZEMODULE)
+!
+!
+!-------------------------------------------------------------------------------
+!
+!*      14.     BACK TO INPUT UNITS (per kg and per (m3 s)) FOR IONS
+!               ----------------------------------------------------
+!
+PRSVS(:,:,:,1) = PRSVS(:,:,:,1) / XECHARGE          ! 1 /(m3 s)
+PRSVS(:,:,:,NSV_ELEC) = -PRSVS(:,:,:,NSV_ELEC) / XECHARGE    ! 1 /(m3 s)
+!
+!
+!-------------------------------------------------------------------------------
+!
+CONTAINS
+!
+!-------------------------------------------------------------------------------
+!
+  SUBROUTINE TRIG_POINT ()
+!
+! Goal : find randomly a triggering point where E > E_trig
+!
+!*      0.      DECLARATIONS
+!               ------------
+!
+IMPLICIT NONE
+!
+!*      0.1     declaration of dummy arguments
+!
+!*      0.2     declaration of local variables
+!
+LOGICAL, DIMENSION(SIZE(PRT,1),SIZE(PRT,2),SIZE(PRT,3),INB_CELL) :: &
+           GTRIG  ! mask for the triggering pts
+INTEGER :: INB_TRIG  ! Nb of pts where triggering is possible
+INTEGER :: IWEST_GLOB_TRIG   ! western  global limit of possible triggering
+INTEGER :: IEAST_GLOB_TRIG   ! eastern  global limit of possible triggering
+INTEGER :: ISOUTH_GLOB_TRIG  ! southern global limit of possible triggering
+INTEGER :: INORTH_GLOB_TRIG  ! northern global limit of possible triggering
+INTEGER :: IUP_TRIG          ! upper limit of possible triggering
+INTEGER :: IDOWN_TRIG        ! down limit of possible triggering
+!
+!
+!*      1.      INITIALIZATIONS 
+!               -----------
+!
+GTRIG(:,:,:,:) = .FALSE.
+GNEW_FLASH(:) = .FALSE.
+GNEW_FLASH_GLOB = .FALSE.
+!
+!
+!*      2.      FIND THE POSSIBLE TRIGGERING POINTS 
+!               -----------------------------------
+!
+DO IL = 1, INB_CELL
+  WHERE (ZEMODULE(IIB:IIE,IJB:IJE,IKB:IKE) > ZE_TRIG_THRES .AND. &
+         ZCELL(IIB:IIE,IJB:IJE,IKB:IKE,IL) .GT. 0.)
+    GTRIG(IIB:IIE,IJB:IJE,IKB:IKE,IL) = .TRUE.
+  ENDWHERE
+END DO
+!
+!
+!*      3.     CHOICE OF THE TRIGGERING POINT 
+!              ------------------------------
+!
+!*      3.1    number and coordinates of the possible triggering points
+!
+INB_TRIG = 0
+DO IL = 1, INB_CELL
+  INB_TRIG = COUNT(GTRIG(IIB:IIE,IJB:IJE,IKB:IKE,IL))
+  CALL SUM_ELEC_ll(INB_TRIG)
+!
+!
+!*      3.2    random choice of the triggering point
+!
+ IF (INB_TRIG .GT. 0) THEN
+    IFOUND = 0
+!
+! find the global limits where GTRIG = T
+    CALL EXTREMA_ELEC_ll(GTRIG(:,:,:,IL), IWEST_GLOB_TRIG,  IEAST_GLOB_TRIG,  &
+                                          ISOUTH_GLOB_TRIG, INORTH_GLOB_TRIG, &
+                                          IDOWN_TRIG, IUP_TRIG)
+!
+    DO WHILE (IFOUND .NE. 1)
+!
+! random choice of the 3 global ind.
+      CALL MNH_RANDOM_NUMBER(ZRANDOM)
+      II_TRIG_GLOB = IWEST_GLOB_TRIG + &
+                      INT(ANINT(ZRANDOM * (IEAST_GLOB_TRIG - IWEST_GLOB_TRIG)))
+      CALL MNH_RANDOM_NUMBER(ZRANDOM)
+      IJ_TRIG_GLOB = ISOUTH_GLOB_TRIG + &
+                      INT(ANINT(ZRANDOM * (INORTH_GLOB_TRIG - ISOUTH_GLOB_TRIG)))
+      CALL MNH_RANDOM_NUMBER(ZRANDOM)
+      IK_TRIG = IDOWN_TRIG + INT(ANINT(ZRANDOM * (IUP_TRIG - IDOWN_TRIG)))
+!
+! global ind. --> local ind. of the potential triggering pt
+      II_TRIG_LOC = II_TRIG_GLOB - IXOR + 1
+      IJ_TRIG_LOC = IJ_TRIG_GLOB - IYOR + 1
+!
+! test if the randomly chosen pt meets all conditions for triggering
+      IF ((II_TRIG_LOC .LE. IIE) .AND. (II_TRIG_LOC .GE. IIB) .AND. &
+          (IJ_TRIG_LOC .LE. IJE) .AND. (IJ_TRIG_LOC .GE. IJB) .AND. &
+          (IK_TRIG     .LE. IKE) .AND. (IK_TRIG     .GE. IKB)) THEN
+        IF (GTRIG(II_TRIG_LOC,IJ_TRIG_LOC,IK_TRIG,IL)) THEN
+          IFOUND = 1
+!
+! update the local coordinates of the flash segments
+          ISEG_LOC(1,IL) = II_TRIG_LOC
+          ISEG_LOC(2,IL) = IJ_TRIG_LOC
+          ISEG_LOC(3,IL) = IK_TRIG
+!
+          ISEG_GLOB(1,IL) = II_TRIG_GLOB
+          ISEG_GLOB(2,IL) = IJ_TRIG_GLOB
+          ISEG_GLOB(3,IL) = IK_TRIG
+!
+          ZCOORD_TRIG(1,IL) = XXHATM(II_TRIG_LOC)
+          ZCOORD_TRIG(2,IL) = XYHATM(IJ_TRIG_LOC)
+          ZCOORD_TRIG(3,IL) = ZZMASS(II_TRIG_LOC, IJ_TRIG_LOC, IK_TRIG)
+!
+          ZCOORD_SEG(1:3,IL) = ZCOORD_TRIG(1:3,IL)
+!
+! electric field module at the triggering point
+          ZEM_TRIG(IL) = ZEMODULE(II_TRIG_LOC,IJ_TRIG_LOC,IK_TRIG)
+!
+! sign of Ez at the triggering point
+          ISIGNE_EZ(IL) = 0
+          IF (PEFIELDW(II_TRIG_LOC,IJ_TRIG_LOC,IK_TRIG) .GT. 0.) THEN
+            ISIGNE_EZ(IL) = 1
+          ELSE IF (PEFIELDW(II_TRIG_LOC,IJ_TRIG_LOC,IK_TRIG) .LT. 0.) THEN
+            ISIGNE_EZ(IL) = -1
+          END IF
+        END IF
+      END IF
+!
+! broadcast IFOUND and find the proc where IFOUND = 1
+      CALL MAX_ELEC_ll (IFOUND, IPROC_TRIG(IL))
+!
+    END DO
+!
+!
+!
+!*      4.      BROADCAST USEFULL PARAMETERS
+!               ----------------------------
+!
+    CALL MPI_BCAST (ZEM_TRIG(IL), 1, &
+                    MNHREAL_MPI, IPROC_TRIG(IL), NMNH_COMM_WORLD, IERR)
+    CALL MPI_BCAST (ISEG_LOC(:,IL), 3*SIZE(PRT,3), &
+                    MNHINT_MPI, IPROC_TRIG(IL), NMNH_COMM_WORLD, IERR)
+    CALL MPI_BCAST (ZCOORD_TRIG(:,IL), 3, &
+                    MNHREAL_MPI, IPROC_TRIG(IL), NMNH_COMM_WORLD, IERR)
+    CALL MPI_BCAST (ISIGNE_EZ(IL), 1, &
+                    MNHINT_MPI, IPROC_TRIG(IL), NMNH_COMM_WORLD, IERR)
+!
+!
+!*      5.      CHECK IF THE FLASH CAN DEVELOP
+!               ------------------------------
+!
+    IF (INB_FLASH(IL) < INBFTS_MAX) THEN
+      IF (IPROC.EQ.IPROC_TRIG(IL)) THEN  
+        ZCELL(II_TRIG_LOC,IJ_TRIG_LOC,IK_TRIG,IL) = 0.
+      END IF
+!
+      GNEW_FLASH(IL) = .TRUE.
+      GNEW_FLASH_GLOB = .TRUE.
+      CALL MPI_BCAST (GNEW_FLASH(IL),1, MNHLOG_MPI, IPROC_TRIG(IL), &
+                      NMNH_COMM_WORLD, IERR)
+      CALL MPI_BCAST (GNEW_FLASH_GLOB,1, MNHLOG_MPI, IPROC_TRIG(IL), &
+                      NMNH_COMM_WORLD, IERR)
+    END IF
+  END IF 
+END DO
+!
+!
+END SUBROUTINE TRIG_POINT
+!
+!-------------------------------------------------------------------------------
+!
+  SUBROUTINE ONE_LEADER ()
+!
+!! Purpose: propagates the bidirectional leader along the vertical
+!
+!*      0.      DECLARATIONS
+!               ------------
+!
+IMPLICIT NONE
+!
+INTEGER :: IKSTEP, IIDECAL         
+!
+!*      1.      BUILD THE POSITIVE/NEGATIVE LEADER
+!               ----------------------------------
+CALL MPPDB_CHECK3DM("flash:: one_leader ZFLASH",PRECISION,ZFLASH(:,:,:,IL))
+!
+IKSTEP = ISIGN_LEADER * ISIGNE_EZ(IL)
+    ! the positive leader propagates parallel to the electric field
+    ! while the negative leader propagates anti// to the electric field
+ISTOP = 0
+!
+!
+IF (IPROC .EQ. IPROC_TRIG(IL)) THEN
+
+  DO WHILE (ZEMOD_BL > XEPROP .AND. IKBL > IKB .AND. &
+            IKBL < IKE .AND. ISTOP .EQ. 0 .AND.      &
+            INBSEG(IL) .LE. (NLEADER_MAX-1))  
+!
+! local coordinates of the new segment
+    IIBL_LOC = ISEG_LOC(1,IL)
+    IJBL_LOC = ISEG_LOC(2,IL)
+    IKBL     = IKBL + IKSTEP
+    IIDECAL = INBSEG(IL) * 3
+!
+    ISEG_LOC(IIDECAL+1,IL) = IIBL_LOC
+    ISEG_LOC(IIDECAL+2,IL) = IJBL_LOC
+    ISEG_LOC(IIDECAL+3,IL) = IKBL
+!
+    ISEG_GLOB(IIDECAL+1,IL) = IIBL_LOC + IXOR - 1
+    ISEG_GLOB(IIDECAL+2,IL) = IJBL_LOC + IYOR - 1
+    ISEG_GLOB(IIDECAL+3,IL) = IKBL
+!
+    ZCOORD_SEG(IIDECAL+1,IL) = XXHATM(IIBL_LOC)
+    ZCOORD_SEG(IIDECAL+2,IL) = XYHATM(IJBL_LOC)
+    ZCOORD_SEG(IIDECAL+3,IL) = ZZMASS(IIBL_LOC, IJBL_LOC, IKBL)
+!
+    INBSEG(IL) = INBSEG(IL) + 1
+!
+!
+!*      1.3     test if Ez keeps the same sign
+!
+    IF (PEFIELDW(IIBL_LOC,IJBL_LOC,IKBL) .EQ. 0. .OR. &
+        INT(ABS(PEFIELDW(IIBL_LOC,IJBL_LOC,IKBL)) / &
+                PEFIELDW(IIBL_LOC,IJBL_LOC,IKBL)) /= ISIGNE_EZ(IL) .OR. &
+                ZCELL(IIBL_LOC,IJBL_LOC,IKBL,IL) .EQ. 0.) THEN
+      ISTOP = 1
+! then this segment is not part of the leader
+      INBSEG(IL) = INBSEG(IL) - 1
+    END IF
+!
+!
+!*      1.4     sign of the induced charge
+!
+    IF (ISTOP .EQ. 0) THEN
+      ZFLASH(IIBL_LOC,IJBL_LOC,IKBL,IL) = 1.
+      ZCELL(IIBL_LOC,IJBL_LOC,IKBL,IL) = 0.   
+!
+!
+!*      1.6     electric field module at the tip of the leader
+!
+      ZEMOD_BL = ZEMODULE(IIBL_LOC,IJBL_LOC,IKBL)
+!
+!
+!*      1.7     test if the domain boundaries are reached
+!
+      IF ((IIBL_LOC < IIB .AND. LWEST_ll())  .OR. &
+          (IIBL_LOC > IIE .AND. LEAST_ll())  .OR. &
+          (IJBL_LOC < IJB .AND. LSOUTH_ll()) .OR. &
+          (IJBL_LOC > IJE .AND. LNORTH_ll())) THEN
+        PRINT*,'DOMAIN BOUNDARIES REACHED BY THE LIGHTNING ' 
+        ISTOP = 1
+      ENDIF
+!
+      IF (IKBL .LE. IKB) THEN
+        PRINT*,'THE LIGHTNING FLASH HAS REACHED THE GROUND ' 
+        ISTOP = 1
+        GCG = .TRUE.
+        NNB_CG = NNB_CG + 1
+        IF (ISIGN_LEADER > 0) THEN
+          GCG_POS = .TRUE.
+          ITYPE(IL) = 3 ! CGP
+          NNB_CG_POS = NNB_CG_POS + 1 
+        ELSE
+          ITYPE(IL) = 2 ! CGN
+        END IF
+      ENDIF
+!
+      IF (IKBL .GE. IKE) THEN
+        PRINT*,'THE LIGHTNING FLASH HAS REACHED THE TOP OF THE DOMAIN ' 
+        ISTOP = 1
+      ENDIF
+!
+!
+!*      2.      TEST IF THE FLASH IS A CG
+!               -------------------------
+!
+      IF (.NOT. GCG) THEN
+        IF ( (ZZMASS(IIBL_LOC,IJBL_LOC,IKBL)-PZZ(IIBL_LOC,IJBL_LOC,IKB)) <=   &
+             XALT_CG .AND. INBSEG(IL) .GT. 1  .AND. IKSTEP .LT. 0) THEN
+!
+!
+!*      2.1    the channel is prolongated to the ground if 
+!*             one segment reaches the altitude XALT_CG
+!
+          DO WHILE (IKBL > IKB)
+            IKBL = IKBL - 1
+!
+! local coordinates of the new segment
+            IIDECAL = INBSEG(IL) * 3
+!
+            ISEG_LOC(IIDECAL+1,IL) = IIBL_LOC
+            ISEG_LOC(IIDECAL+2,IL) = IJBL_LOC
+            ISEG_LOC(IIDECAL+3,IL) = IKBL
+!
+            ISEG_GLOB(IIDECAL+1:IIDECAL+2,IL) = ISEG_GLOB(IIDECAL-2:IIDECAL-1,IL)
+            ISEG_GLOB(IIDECAL+3,IL) = IKBL
+!
+            ZCOORD_SEG(IIDECAL+1:IIDECAL+2,IL) = ZCOORD_SEG(IIDECAL-2:IIDECAL-1,IL)
+            ZCOORD_SEG(IIDECAL+3,IL) = ZZMASS(IIBL_LOC, IJBL_LOC, IKBL)
+!
+!  Increment number of segments
+            INBSEG(IL) = INBSEG(IL) + 1 ! Nb of segments
+            ZFLASH(IIBL_LOC,IJBL_LOC,IKBL,IL) = 1.
+            ZCELL(IIBL_LOC,IJBL_LOC,IKBL,IL) = 0.   
+          END DO
+!
+!
+!*      2.2    update the number of CG flashes
+!
+          GCG = .TRUE.
+          NNB_CG = NNB_CG + 1 
+          ISTOP = 1
+!
+          IF (ISIGN_LEADER > 0) THEN
+            GCG_POS = .TRUE.
+            NNB_CG_POS = NNB_CG_POS + 1 
+            ITYPE(IL) = 3
+          ELSE
+            ITYPE(IL) = 2
+          END IF
+        END IF
+      END IF
+    END IF     ! end if ISTOP=0
+  END DO   ! end loop leader
+END IF  ! only iproc_trig was working
+!
+!
+!*      3.     BROADCAST THE INFORMATIONS TO ALL PROCS
+!              ---------------------------------------
+!
+CALL MPI_BCAST (ISEG_LOC(:,IL), 3*SIZE(PRT,3), &  
+                MNHINT_MPI, IPROC_TRIG(IL), NMNH_COMM_WORLD, IERR)
+CALL MPI_BCAST (ITYPE(IL), 1, &
+                MNHINT_MPI, IPROC_TRIG(IL), NMNH_COMM_WORLD, IERR)
+
+CALL MPI_BCAST (GCG, 1, &
+                MNHLOG_MPI, IPROC_TRIG(IL), NMNH_COMM_WORLD, IERR)
+CALL MPI_BCAST (GCG_POS, 1, &
+                MNHLOG_MPI, IPROC_TRIG(IL), NMNH_COMM_WORLD, IERR)
+CALL MPI_BCAST (NNB_CG, 1, &
+                MNHINT_MPI, IPROC_TRIG(IL), NMNH_COMM_WORLD, IERR)
+CALL MPI_BCAST (NNB_CG_POS, 1, &
+                MNHINT_MPI, IPROC_TRIG(IL), NMNH_COMM_WORLD, IERR)
+
+!
+CALL MPPDB_CHECK3DM("flash:: one_leader end ZFLASH",PRECISION,ZFLASH(:,:,:,IL))
+!
+END SUBROUTINE ONE_LEADER
+!
+!-------------------------------------------------------------------------------
+!
+  SUBROUTINE CHARGE_POCKET
+!
+!!
+!! Purpose: limit flash propagation into the positive and negative charge layers
+!!          located immediatly above and below the triggering point
+!!
+!*       0.      DECLARATIONS
+!                ------------
+!
+IMPLICIT NONE
+!
+REAL, DIMENSION(SIZE(PRT,1),SIZE(PRT,2),SIZE(PRT,3)) :: ZSIGN_AREA,ZSIGN_AREA_NEW
+
+REAL, DIMENSION(INB_CELL) :: ZSIGN  ! sign of the charge immediatly below/above the triggering pt 
+!
+INTEGER, DIMENSION(INB_CELL) :: IEND  ! if 1, no more neighbour pts meeting the conditions
+INTEGER, DIMENSION(INB_CELL) :: COUNT_BEF2
+INTEGER, DIMENSION(INB_CELL) :: COUNT_AFT2
+INTEGER :: IPROC_END
+INTEGER :: IEND_GLOB
+INTEGER :: IIDECAL, IKMIN, IKMAX
+REAL :: ZFACT
+!
+!
+!*       1.      SEARCH THE POINTS BELONGING TO THE LAYERS 
+!                -----------------------------------------
+!
+ZFACT = -1.
+IF(GPOSITIVE) ZFACT = 1.
+
+ZSIGN_AREA(:,:,:) = 0.
+ZSIGN(:) = 0.
+IEND(:) = 0
+IEND_GLOB = 0
+!
+!
+DO IL = 1, INB_CELL
+  IF (.NOT. GNEW_FLASH(IL)) THEN
+    IEND(IL) = 1
+    IEND_GLOB = IEND_GLOB + IEND(IL)
+  END IF
+  IF (GNEW_FLASH(IL) .AND. IPROC .EQ. IPROC_TRIG(IL)) THEN
+    DO II = 1, INBSEG(IL)
+      IIDECAL = 3 * (II - 1)
+      IIBL_LOC = ISEG_LOC(IIDECAL+1,IL)
+      IJBL_LOC = ISEG_LOC(IIDECAL+2,IL)
+      IKBL     = ISEG_LOC(IIDECAL+3,IL)
+!
+      IF (ZQMTOT(IIBL_LOC,IJBL_LOC,IKBL) .GT. 0. .AND. GPOSITIVE) THEN
+        ZSIGN_AREA(IIBL_LOC,IJBL_LOC,IKBL) = 1. * REAL(IL)
+        ZSIGN(IL) = ZSIGN_AREA(IIBL_LOC,IJBL_LOC,IKBL)
+      ELSE IF (ZQMTOT(IIBL_LOC,IJBL_LOC,IKBL) .LT. 0. .AND. .NOT.GPOSITIVE) THEN
+        ZSIGN_AREA(IIBL_LOC,IJBL_LOC,IKBL) = -1. * REAL(IL)
+        ZSIGN(IL) = ZSIGN_AREA(IIBL_LOC,IJBL_LOC,IKBL)
+      END IF
+    END DO
+  END IF
+!
+  CALL MPI_BCAST (ZSIGN(IL), 1, MNHREAL_MPI, IPROC_TRIG(IL), &
+                  NMNH_COMM_WORLD, IERR)
+END DO
+!
+DO WHILE (IEND_GLOB .NE. INB_CELL)
+  DO IL = 1, INB_CELL
+    CALL ADD3DFIELD_ll  ( TZFIELDS_ll, ZSIGN_AREA, 'FLASH_GEOM_ELEC_n::ZSIGN_AREA' )
+    CALL UPDATE_HALO_ll ( TZFIELDS_ll, IINFO_ll)
+    CALL CLEANLIST_ll   ( TZFIELDS_ll)
+!
+    IF (GNEW_FLASH(IL) .AND. (IEND(IL) .NE. 1)) THEN
+      COUNT_BEF2(IL) = COUNT(ZSIGN_AREA(IIB:IIE,IJB:IJE,IKB:IKE) .EQ. ZSIGN(IL))
+      CALL SUM_ELEC_ll (COUNT_BEF2(IL))
+!
+      IF (ISIGNE_EZ(IL).EQ.1) THEN
+        IF (GPOSITIVE) THEN
+          IKMIN = IKB
+          IKMAX = ISEG_LOC(3, IL)
+        ELSE
+          IKMIN = ISEG_LOC(3, IL)
+          IKMAX = IKE
+        ENDIF
+      ENDIF
+!
+      IF (ISIGNE_EZ(IL).EQ.-1) THEN
+        IF (GPOSITIVE) THEN
+          IKMIN = ISEG_LOC(3, IL)
+          IKMAX = IKE
+        ELSE
+          IKMIN = IKB
+          IKMAX = ISEG_LOC(3, IL)
+        ENDIF
+      ENDIF
+!
+      ZSIGN_AREA_NEW(:,:,IKMIN:IKMAX) = ZSIGN_AREA (:,:,IKMIN:IKMAX)
+      DO II = IIB, IIE
+        DO IJ = IJB, IJE
+          DO IK = IKMIN, IKMAX
+            IF ((ZSIGN_AREA(II,  IJ,  IK)   .EQ. 0.) .AND.   &
+                (ZCELL(II,IJ,IK,IL) .EQ. 1.) .AND.           &
+                (.NOT. GPROP(II,IJ,IK,IL)) .AND.             &
+                (ZQMTOT(II,IJ,IK)*ZFACT .GT. 0.) .AND.       &
+                (ABS(ZQMTOT(II,IJ,IK) *                      &
+                     PRHODREF(II,IJ,IK)) .GT. XQNEUT)) THEN
+!
+              IF ((ZSIGN_AREA(II-1,IJ,  IK)   .EQ. ZSIGN(IL)) .OR. &
+                  (ZSIGN_AREA(II+1,IJ,  IK)   .EQ. ZSIGN(IL)) .OR. &
+                  (ZSIGN_AREA(II,  IJ-1,IK)   .EQ. ZSIGN(IL)) .OR. &
+                  (ZSIGN_AREA(II,  IJ+1,IK)   .EQ. ZSIGN(IL)) .OR. &
+                  (ZSIGN_AREA(II-1,IJ-1,IK)   .EQ. ZSIGN(IL)) .OR. &
+                  (ZSIGN_AREA(II-1,IJ+1,IK)   .EQ. ZSIGN(IL)) .OR. &
+                  (ZSIGN_AREA(II+1,IJ+1,IK)   .EQ. ZSIGN(IL)) .OR. &
+                  (ZSIGN_AREA(II+1,IJ-1,IK)   .EQ. ZSIGN(IL)) .OR. &
+                  (ZSIGN_AREA(II,  IJ,  IK+1) .EQ. ZSIGN(IL)) .OR. &
+                  (ZSIGN_AREA(II-1,IJ,  IK+1) .EQ. ZSIGN(IL)) .OR. &
+                  (ZSIGN_AREA(II+1,IJ,  IK+1) .EQ. ZSIGN(IL)) .OR. &
+                  (ZSIGN_AREA(II,  IJ-1,IK+1) .EQ. ZSIGN(IL)) .OR. &
+                  (ZSIGN_AREA(II,  IJ+1,IK+1) .EQ. ZSIGN(IL)) .OR. &
+                  (ZSIGN_AREA(II-1,IJ-1,IK+1) .EQ. ZSIGN(IL)) .OR. &
+                  (ZSIGN_AREA(II-1,IJ+1,IK+1) .EQ. ZSIGN(IL)) .OR. &
+                  (ZSIGN_AREA(II+1,IJ+1,IK+1) .EQ. ZSIGN(IL)) .OR. &
+                  (ZSIGN_AREA(II+1,IJ-1,IK+1) .EQ. ZSIGN(IL)) .OR. &
+                  (ZSIGN_AREA(II,  IJ,  IK-1) .EQ. ZSIGN(IL)) .OR. &
+                  (ZSIGN_AREA(II-1,IJ,  IK-1) .EQ. ZSIGN(IL)) .OR. &
+                  (ZSIGN_AREA(II+1,IJ,  IK-1) .EQ. ZSIGN(IL)) .OR. &
+                  (ZSIGN_AREA(II,  IJ-1,IK-1) .EQ. ZSIGN(IL)) .OR. &
+                  (ZSIGN_AREA(II,  IJ+1,IK-1) .EQ. ZSIGN(IL)) .OR. &
+                  (ZSIGN_AREA(II-1,IJ-1,IK-1) .EQ. ZSIGN(IL)) .OR. &
+                  (ZSIGN_AREA(II-1,IJ+1,IK-1) .EQ. ZSIGN(IL)) .OR. &
+                  (ZSIGN_AREA(II+1,IJ+1,IK-1) .EQ. ZSIGN(IL)) .OR. &
+                  (ZSIGN_AREA(II+1,IJ-1,IK-1) .EQ. ZSIGN(IL))) THEN
+                ZSIGN_AREA_NEW(II,IJ,IK) = ZSIGN(IL)
+                GPROP(II,IJ,IK,IL) = .TRUE.
+              END IF
+            END IF
+          END DO
+        END DO
+      END DO
+      ZSIGN_AREA (:,:,IKMIN:IKMAX) = ZSIGN_AREA_NEW(:,:,IKMIN:IKMAX)
+!
+      COUNT_AFT2(IL) = COUNT(ZSIGN_AREA(IIB:IIE,IJB:IJE,IKB:IKE) .EQ. ZSIGN(IL))
+      CALL SUM_ELEC_ll(COUNT_AFT2(IL))
+!
+      IF (COUNT_BEF2(IL) .EQ. COUNT_AFT2(IL)) THEN
+        IEND(IL) = 1
+      ELSE
+        IEND(IL) = 0
+      END IF
+! broadcast IEND and find the proc where IEND = 1
+      CALL MAX_ELEC_ll (IEND(IL), IPROC_END)
+      IEND_GLOB = IEND_GLOB + IEND(IL)
+    END IF
+  END DO
+END DO  ! end do while
+!
+END SUBROUTINE CHARGE_POCKET
+!
+!-------------------------------------------------------------------------------
+!
+  SUBROUTINE BRANCH_GEOM (IKMIN, IKMAX)
+!
+! Goal : find randomly flash branch points
+!
+!*      0.      DECLARATIONS
+!               ------------
+!
+use modd_precision, only: MNHINT64, MNHINT64_MPI
+
+IMPLICIT NONE
+!
+!*      0.1     declaration of dummy arguments
+!
+INTEGER, INTENT(IN) :: IKMIN, IKMAX
+!
+!*      0.2     declaration of local variables
+!
+INTEGER :: IIDECALB
+INTEGER :: IPLOOP  ! loop index for the proc number
+INTEGER :: IMIN, IMAX
+INTEGER :: IAUX
+INTEGER :: INB_SEG_BEF  ! nb of segments before branching
+INTEGER :: INB_SEG_AFT  ! nb of segments after branching
+INTEGER :: INB_SEG_TO_BRANCH ! = NBRANCH_MAX-INB_SEG_BEF
+LOGICAL :: GRANDOM           ! T = the gridpoints are chosen randomly
+INTEGER, DIMENSION(NPROC) :: INBPT_PROC
+REAL, DIMENSION(:), ALLOCATABLE :: ZAUX
+!
+INTEGER                                           :: JI,JJ,JK,JIL , ICHOICE,IPOINT
+INTEGER,                DIMENSION(NPROC+1)        :: IDISPL
+INTEGER(kind=MNHINT64), DIMENSION(:), ALLOCATABLE :: I8VECT , I8VECT_LL
+INTEGER,                DIMENSION(:), ALLOCATABLE :: IRANK  , IRANK_LL , IORDER_LL
+!
+!
+!
+!*      1.      ON EACH PROC, COUNT THE NUMBER OF POINTS AT DISTANCE D 
+!*              THAT CAN RECEIVE A BRANCH
+!               ------------------------------------------------------
+CALL MPPDB_CHECK3DM("flash:: branch ZFLASH,IMASKQ_DIST",PRECISION,&
+     ZFLASH(:,:,:,IL),IMASKQ_DIST*1.0)
+!
+IM = 1
+ISTOP = 0
+INB_SEG_BEF = COUNT(ZFLASH(IIB:IIE,IJB:IJE,IKB:IKE,IL) .NE. 0.)
+CALL SUM_ELEC_ll(INB_SEG_BEF)
+!
+INB_SEG_TO_BRANCH = NBRANCH_MAX - INB_SEG_BEF
+!
+DO WHILE (IM .LE. IDELTA_IND .AND. ISTOP .NE. 1)
+! number of points that can receive a branch in each proc
+  IPT_DIST = COUNT(IMASKQ_DIST(IIB:IIE,IJB:IJE,IKB:IKE) .EQ. IM)
+! global number of points that can receive a branch
+  IPT_DIST_GLOB = IPT_DIST
+  CALL SUM_ELEC_ll (IPT_DIST_GLOB)
+!
+  IF (IPT_DIST_GLOB .LE. INB_SEG_TO_BRANCH) THEN
+    IF (IPT_DIST_GLOB .LE. IMAX_BRANCH(IM)) THEN
+      GRANDOM = .FALSE.
+    ELSE
+      GRANDOM = .TRUE.
+    END IF
+  ELSE
+    GRANDOM = .TRUE.
+  END IF
+!
+!
+!*      2.      DISTRIBUTE THE BRANCHES
+!               -----------------------
+!
+  IF (IPT_DIST_GLOB .GT. 0 .AND. INB_SEG_TO_BRANCH .NE. 0) THEN
+    IF (.NOT. GRANDOM) THEN
+      INB_SEG_TO_BRANCH = INB_SEG_TO_BRANCH - IPT_DIST_GLOB
+!
+!*      2.1     all points are selected
+!
+      IF(IPT_DIST .GT. 0) THEN 
+        WHERE (IMASKQ_DIST(IIB:IIE,IJB:IJE,IKB:IKE) .EQ. IM)
+          ZFLASH(IIB:IIE,IJB:IJE,IKB:IKE,IL) = 2.
+          ZCELL(IIB:IIE,IJB:IJE,IKB:IKE,IL) = 0.
+        END WHERE
+      END IF
+    ELSE
+!
+!*      2.2      the gridpoints are chosen randomly
+!
+      IF (IMAX_BRANCH(IM) .GT. 0) THEN
+        INBPT_PROC(:) = 0
+        CALL MPI_ALLGATHER(IPT_DIST, 1, MNHINT_MPI, &
+                   INBPT_PROC, 1, MNHINT_MPI, NMNH_COMM_WORLD, IERR)
+!
+        IDISPL(1) = 0
+        DO JI=2, NPROC+1
+           IDISPL(JI) = IDISPL(JI-1)+INBPT_PROC(JI-1)
+        ENDDO
+!
+        ALLOCATE (I8VECT(IPT_DIST))
+        ALLOCATE (IRANK(IPT_DIST))
+        IF (IPT_DIST .GT. 0) THEN 
+           JIL=0
+           DO JK=IKB,IKE
+              DO JJ=IJB,IJE
+                 DO JI=IIB,IIE
+                    IF (IMASKQ_DIST(JI,JJ,JK) .EQ. IM) THEN
+                       JIL = JIL + 1
+                       I8VECT(JIL) = IJU_ll*IIU_ll*(JK-1) + IIU_ll*(JJ-1 +IYOR-1) + (JI +IXOR-1)
+                       !print*,"IN  => I8VECT(JIL    )=",I8VECT(JIL),JI,JJ,JK,JIL
+                    END IF
+                 END DO
+              END DO
+           END DO
+           !
+           IRANK(:)  = IPROC           
+        END IF
+!
+        ALLOCATE(I8VECT_LL(IPT_DIST_GLOB))
+        ALLOCATE(IRANK_LL(IPT_DIST_GLOB))
+        ALLOCATE(IORDER_LL(IPT_DIST_GLOB))
+        CALL MPI_ALLGATHERV(I8VECT,IPT_DIST, MNHINT64_MPI,I8VECT_LL , &
+                        INBPT_PROC, IDISPL, MNHINT64_MPI, NMNH_COMM_WORLD, IERR)
+        CALL MPI_ALLGATHERV(IRANK,IPT_DIST, MNHINT_MPI,IRANK_LL , &
+                        INBPT_PROC, IDISPL, MNHINT_MPI, NMNH_COMM_WORLD, IERR)
+        CALL N8QUICK_SORT(I8VECT_LL, IORDER_LL)
+!
+        DO IPOINT = 1, MIN(IMAX_BRANCH(IM), INB_SEG_TO_BRANCH)
+           IFOUND = 0
+           DO WHILE (IFOUND .NE. 1)
+              ! randomly chose points in zvect
+              CALL MNH_RANDOM_NUMBER(ZRANDOM)
+              ICHOICE = INT(ANINT(ZRANDOM * IPT_DIST_GLOB)) 
+              IF (ICHOICE .EQ. 0) ICHOICE = 1
+              IF (I8VECT_LL(ICHOICE) .NE. 0 ) THEN
+                 IFOUND = 1               
+                 ! The points is in this processors  , get is coord and set it
+                 IF (IRANK_LL(IORDER_LL(ICHOICE)) .EQ. IPROC) THEN
+                    JK = 1 +     (I8VECT_LL(ICHOICE)-1) / ( IJU_ll*IIU_ll ) 
+                    JJ = 1 + (   (I8VECT_LL(ICHOICE)-1) - IJU_ll*IIU_ll*(JK-1) ) / IIU_ll  - IYOR +1
+                    JI = 1 + MOD((I8VECT_LL(ICHOICE)-1)                          , int(IIU_ll,kind(I8VECT_LL(1)))) - IXOR +1
+                    !print*,"OUT => I8VECT_LL(ICHOICE)=",I8VECT_ll(ICHOICE),JI,JJ,JK,ICHOICE
+                    ZFLASH(JI,JJ,JK,IL) = 2.
+                 END IF
+                 I8VECT_LL(ICHOICE) = 0
+              ENDIF
+           END DO
+        END DO
+!
+        INB_SEG_TO_BRANCH = INB_SEG_TO_BRANCH - MIN(IMAX_BRANCH(IM), INB_SEG_TO_BRANCH)
+!
+        DEALLOCATE(I8VECT,I8VECT_LL,IRANK,IRANK_LL,IORDER_LL)
+        CALL MPPDB_CHECK3DM("flash:: branch IPT_DIST ZFLASH",PRECISION,&
+             ZFLASH(:,:,:,IL))
+      END IF
+    END IF                   !IPT_DIST .LE. IMAX_BRANCH(IM)
+  ELSE
+! if no pt available at r, then no branching possible at r+dr !
+      ISTOP = 1
+  END IF  ! end if ipt_dist > 0
+!
+! next distance
+  CALL MPPDB_CHECK3DM("flash:: branch IM+1 ZFLASH",PRECISION,ZFLASH(:,:,:,IL))
+  IM = IM + 1
+END DO   ! end loop / do while / radius IM
+!
+INB_SEG_AFT = COUNT (ZFLASH(IIB:IIE,IJB:IJE,IKB:IKE,IL) .NE. 0.)
+CALL SUM_ELEC_ll(INB_SEG_AFT)
+!
+IF (INB_SEG_AFT .GT. INB_SEG_BEF) THEN
+  DO II = IIB, IIE
+    DO IJ = IJB, IJE
+      DO IK = IKB, IKE
+        IF (ZFLASH(II,IJ,IK,IL) .EQ. 2.) THEN 
+          IIDECALB = INBSEG(IL) * 3
+!
+          ISEG_GLOB(IIDECALB+1,IL) = II + IXOR - 1
+          ISEG_GLOB(IIDECALB+2,IL) = IJ + IYOR - 1
+          ISEG_GLOB(IIDECALB+3,IL) = IK
+!
+          ZCOORD_SEG(IIDECALB+1,IL) = XXHATM(II)
+          ZCOORD_SEG(IIDECALB+2,IL) = XYHATM(IJ)
+          ZCOORD_SEG(IIDECALB+3,IL) = ZZMASS(II,IJ,IK)
+          INBSEG(IL) = INBSEG(IL) + 1
+        END IF
+      END DO
+    END DO
+  END DO
+END IF
+!
+CALL MPPDB_CHECK3DM("flash:: end branch ZFLASH",PRECISION,ZFLASH(:,:,:,IL))
+!
+END SUBROUTINE BRANCH_GEOM
+!
+!--------------------------------------------------------------------------------
+!
+  SUBROUTINE GATHER_ALL_BRANCH
+!
+!!
+!! Purpose:
+!!
+!
+!*      0.     DECLARATIONS
+!              ------------
+!
+IMPLICIT NONE
+!
+INTEGER :: INSEGPROC, INSEGCELL  ! number of segments in the process,
+                                 ! and number of segments in the cell
+INTEGER :: ISAVEDECAL
+INTEGER :: INSEGTRIG, IPROCTRIG
+REAL, DIMENSION(:), ALLOCATABLE :: ZLMAQMT, ZLMAPRT, ZLMAPOS, ZLMANEG
+REAL, DIMENSION(:), ALLOCATABLE :: ZSEND, ZRECV
+INTEGER, DIMENSION(:), ALLOCATABLE :: ISEND, IRECV
+INTEGER, DIMENSION(NPROC) :: IDECAL, IDECAL3, IDECALN
+INTEGER, DIMENSION(NPROC) :: INBSEG_PROC_X3, INBSEG_PROC_XNSV
+!
+!
+IPROCTRIG = IPROC_TRIG(IL)
+INSEGCELL = INBSEG_ALL(IL)
+INSEGPROC = INBSEG_PROC(IPROC+1)
+INSEGTRIG = INBSEG_PROC(IPROCTRIG+1)
+!
+IDECAL(1) = INSEGTRIG
+DO IK = 2, NPROC
+  IDECAL(IK) = IDECAL(IK-1) + INBSEG_PROC(IK-1)
+END DO
+!
+IF(IPROCTRIG .EQ. 0) ISAVEDECAL = IDECAL(IPROCTRIG+1)
+!
+IDECAL(IPROCTRIG+1) = 0
+DO IK = IPROCTRIG+2, NPROC
+  IF(IPROCTRIG .EQ. 0) THEN
+    IDECAL(IK) = IDECAL(IK) - ISAVEDECAL
+  ELSE
+    IDECAL(IK) = IDECAL(IK) - IDECAL(1)
+  END IF
+END DO
+!
+IDECAL3(:) = 3 * IDECAL(:)
+!
+!
+!*      1.     BRANCH COORDINATES
+!
+ALLOCATE (ZRECV(INSEGCELL*3))
+ALLOCATE (ZSEND(INSEGPROC*3))
+!
+IF (INSEGPROC .NE. 0) THEN
+  ZSEND(1:3*INSEGPROC) = ZCOORD_SEG(1:3*INSEGPROC,IL)
+END IF
+!
+IF (IPROC .EQ. 0) THEN
+  INBSEG_PROC_X3(:) = 3 * INBSEG_PROC(:)
+END IF
+!
+CALL MPI_GATHERV (ZSEND, 3*INSEGPROC, MNHREAL_MPI, ZRECV, INBSEG_PROC_X3, &
+                  IDECAL3, MNHREAL_MPI, 0, NMNH_COMM_WORLD, IERR)
+!
+IF (IPROC .EQ. 0) THEN
+  ZCOORD_SEG_ALL(1:3*INSEGCELL,IL) = ZRECV(1:3*INSEGCELL)
+END IF
+!
+DEALLOCATE (ZRECV)
+DEALLOCATE (ZSEND)
+!
+!
+!*      2.     FOR LMA-LIKE RESULTS: Charge, mixing ratio,
+!*                        neutralized positive/negative charge
+!*                        and grid index
+!
+IF (LLMA) THEN
+  ALLOCATE (ISEND(3*INSEGPROC))
+  ALLOCATE (ZLMAQMT(INSEGPROC*NSV_ELEC))
+  ALLOCATE (ZLMAPRT(INSEGPROC*NSV_ELEC))
+  ALLOCATE (ZLMAPOS(INSEGPROC))
+  ALLOCATE (ZLMANEG(INSEGPROC))
+!
+  ISEND  (:) = 0
+  ZLMAPOS(:) = 0.
+  ZLMANEG(:) = 0.
+  ZLMAQMT(:) = 0.
+  ZLMAPRT(:) = 0.
+!
+  IF (INSEGPROC .NE. 0) THEN
+    DO II = 1, INSEGPROC
+      IM = 3 * (II - 1)
+      IX = ISEG_GLOB(IM+1,IL) - IXOR + 1
+      IY = ISEG_GLOB(IM+2,IL) - IYOR + 1
+      IZ = ISEG_GLOB(IM+3,IL)
+!
+      IM = NSV_ELEC * (II - 1)
+      IF (IX .LE. IIE .AND. IX .GE. IIB .AND. &
+          IY .LE. IJE .AND. IY .GE. IJB) THEN
+        ZLMAQMT(IM+2:IM+6) = ZQMT(IX,IY,IZ,2:6)
+        ZLMAPRT(IM+2:IM+6) =  PRT(IX,IY,IZ,2:6)
+        DO IJ = 1, NSV_ELEC
+          IF (ZDQDT(IX,IY,IZ,IJ) .GT. 0.) THEN
+            ZLMAPOS(II) = ZLMAPOS(II) + &
+                          ZDQDT(IX,IY,IZ,IJ) * PRHODJ(IX,IY,IZ)
+          ELSE IF (ZDQDT(IX,IY,IZ,IJ) .LT. 0.) THEN
+            ZLMANEG(II) = ZLMANEG(II) + &
+                          ZDQDT(IX,IY,IZ,IJ) * PRHODJ(IX,IY,IZ)
+          END IF
+        END DO
+      END IF
+    END DO
+!
+    ISEND(1:3*INSEGPROC) = ISEG_GLOB(1:3*INSEGPROC, IL)
+  END IF
+!
+! Grid Indexes
+!
+  ALLOCATE (IRECV(3*INSEGCELL))
+!
+  CALL MPI_GATHERV (ISEND, 3*INSEGPROC, MNHINT_MPI, IRECV, INBSEG_PROC_X3, &
+                    IDECAL3, MNHINT_MPI, 0, NMNH_COMM_WORLD, IERR)
+!
+  IF (IPROC .EQ. 0) THEN
+    ILMA_SEG_ALL(1:3*INSEGCELL,IL) = IRECV(1:3*INSEGCELL)
+  END IF
+!
+  DEALLOCATE (IRECV)
+  DEALLOCATE (ISEND)
+!
+! Neutralized charge at grid points
+!
+  ALLOCATE (ZRECV(INSEGCELL))
+!
+  CALL MPI_GATHERV (ZLMAPOS, INSEGPROC, MNHREAL_MPI, ZRECV, INBSEG_PROC,  &
+                    IDECAL, MNHREAL_MPI, 0, NMNH_COMM_WORLD, IERR)
+!
+  IF (IPROC .EQ. 0) THEN
+    ZLMA_NEUT_POS(1:INSEGCELL,IL) = ZRECV(1:INSEGCELL)
+  END IF
+!
+  CALL MPI_GATHERV (ZLMANEG, INSEGPROC, MNHREAL_MPI, ZRECV, INBSEG_PROC,  &
+                    IDECAL, MNHREAL_MPI, 0, NMNH_COMM_WORLD, IERR)
+!
+  IF (IPROC .EQ. 0) THEN
+    ZLMA_NEUT_NEG(1:INSEGCELL,IL) = ZRECV(1:INSEGCELL)
+  END IF
+!
+  DEALLOCATE (ZLMAPOS)
+  DEALLOCATE (ZLMANEG)
+  DEALLOCATE (ZRECV)
+!
+! Charge and mixing ratios at neutralized points
+!
+  ALLOCATE (ZRECV(NSV_ELEC*INSEGCELL))
+!
+  IDECALN(:) = IDECAL(:) * NSV_ELEC
+!
+  IF (IPROC .EQ. 0) THEN
+    INBSEG_PROC_XNSV(:) = NSV_ELEC * INBSEG_PROC(:)
+  END IF
+!
+  CALL MPI_GATHERV (ZLMAQMT, NSV_ELEC*INSEGPROC, MNHREAL_MPI, ZRECV, &
+                    INBSEG_PROC_XNSV,                                &
+                    IDECALN, MNHREAL_MPI, 0, NMNH_COMM_WORLD, IERR   )
+!
+  IF (IPROC .EQ. 0) THEN
+    ZLMA_QMT(1:NSV_ELEC*INSEGCELL,IL) = ZRECV(1:NSV_ELEC*INSEGCELL)
+  END IF
+!
+  CALL MPI_GATHERV (ZLMAPRT, NSV_ELEC*INSEGPROC, MNHREAL_MPI, ZRECV, &
+                    INBSEG_PROC_XNSV,                                &
+                    IDECALN, MNHREAL_MPI, 0, NMNH_COMM_WORLD, IERR   )
+!
+  IF (IPROC .EQ. 0) THEN
+    ZLMA_PRT(1:NSV_ELEC*INSEGCELL,IL) = ZRECV(1:NSV_ELEC*INSEGCELL)
+  END IF
+!
+  DEALLOCATE (ZLMAQMT)
+  DEALLOCATE (ZLMAPRT)
+  DEALLOCATE (ZRECV)
+!
+END IF
+!
+END SUBROUTINE GATHER_ALL_BRANCH
+!
+!--------------------------------------------------------------------------------
+!
+  SUBROUTINE PT_DISCHARGE
+!
+!!
+!! Purpose:
+!!
+!
+!*      0.     DECLARATIONS
+!              ------------
+!
+IMPLICIT NONE
+!
+!
+WHERE (ABS(PEFIELDW(:,:,IKB)) > XECORONA .AND. PEFIELDW(:,:,IKB) > 0.)
+  PRSVS(:,:,IKB,1) = PRSVS(:,:,IKB,1) +                                       &
+                     XFCORONA * PEFIELDW(:,:,IKB) * (ABS(PEFIELDW(:,:,IKB)) - &
+                     XECORONA)**2 / (PZZ(:,:,IKB+1) - PZZ(:,:,IKB))
+ENDWHERE
+!
+WHERE (ABS(PEFIELDW(:,:,IKB)) > XECORONA .AND. PEFIELDW(:,:,IKB) < 0.)
+  PRSVS(:,:,IKB,NSV_ELEC) = PRSVS(:,:,IKB,NSV_ELEC) +                         &
+                     XFCORONA * PEFIELDW(:,:,IKB) * (ABS(PEFIELDW(:,:,IKB)) - &
+                     XECORONA)**2 / (PZZ(:,:,IKB+1) - PZZ(:,:,IKB))
+ENDWHERE
+!
+END SUBROUTINE PT_DISCHARGE
+!
+!----------------------------------------------------------------------------------
+!
+  SUBROUTINE WRITE_OUT_ASCII
+!
+!!
+!! Purpose:
+!!
+!
+!*      0.     DECLARATIONS
+!              ------------
+!
+IMPLICIT NONE
+!
+INTEGER :: I1, I2
+INTEGER :: ILU ! unit number for IO
+!
+!
+!*      1.     FLASH PARAMETERS
+!              ----------------
+!
+ILU = TPFILE_FGEOM_DIAG%NLU
+!
+! Ecriture ascii dans CEXP//'_fgeom_diag.asc" defini dans RESOLVED_ELEC
+!
+IF (LCARTESIAN) THEN
+  DO I1 = 1, NNBLIGHT
+    WRITE (UNIT=ILU,FMT='(I8,F9.1,I4,I6,I4,I6,F9.3,F12.3,F12.3,F9.3,F8.2,F9.2,f9.4)') &
+          ISFLASH_NUMBER(I1),              &
+          ISTCOUNT_NUMBER(I1) * PTSTEP,    &
+          ISCELL_NUMBER(I1),               &
+          ISNB_FLASH(I1),                  &
+          ISTYPE(I1),                      &
+          ISNBSEG(I1),                     &
+          ZSEM_TRIG(I1),                   &
+          ZSCOORD_SEG(I1,1,1)*1.E-3,       &
+          ZSCOORD_SEG(I1,1,2)*1.E-3,       &
+          ZSCOORD_SEG(I1,1,3)*1.E-3,       &
+          ZSNEUT_POS(I1),                  &
+          ZSNEUT_NEG(I1), ZSNEUT_POS(I1)+ZSNEUT_NEG(I1)
+  END DO
+ELSE
+  DO I1 = 1, NNBLIGHT
+! compute latitude and longitude of the triggering point
+    CALL SM_LATLON(XLATORI,XLONORI,ZSCOORD_SEG(I1,1,1),&
+                                   ZSCOORD_SEG(I1,1,2),&
+                                   ZLAT,ZLON)
+!
+    WRITE (UNIT=ILU,FMT='(I8,F9.1,I4,I6,I4,I6,F9.3,F12.3,F12.3,F9.3,F8.2,F9.2,f9.4)') &
+          ISFLASH_NUMBER(I1),              &
+          ISTCOUNT_NUMBER(I1) * PTSTEP,    &
+          ISCELL_NUMBER(I1),               &
+          ISNB_FLASH(I1),                  &
+          ISTYPE(I1),                      &
+          ISNBSEG(I1),                     &
+          ZSEM_TRIG(I1),                   &
+          ZLAT,                            &
+          ZLON,                            &
+          ZSCOORD_SEG(I1,1,3)*1.E-3,       &
+          ZSNEUT_POS(I1),                  &
+          ZSNEUT_NEG(I1), ZSNEUT_POS(I1)+ZSNEUT_NEG(I1)
+  END DO
+END IF
+!
+FLUSH(UNIT=ILU)
+!
+!
+!*      2.     FLASH SEGMENT COORDINATES
+!              -------------------------
+!
+IF (LSAVE_COORD) THEN
+!
+! Ecriture ascii dans CEXP//'_fgeom_coord.asc" defini dans RESOLVED_ELEC
+!
+  ILU = TPFILE_FGEOM_COORD%NLU
+!
+  DO I1 = 1, NNBLIGHT
+    DO I2 = 1, ISNBSEG(I1)
+      WRITE (ILU, FMT='(I4,F9.1,I4,F12.3,F12.3,F12.3)') &
+                 ISFLASH_NUMBER(I1),           & 
+                 ISTCOUNT_NUMBER(I1) * PTSTEP, & 
+                 ISTYPE(I1),                   &
+                 ZSCOORD_SEG(I1,I2,1)*1.E-3,   &
+                 ZSCOORD_SEG(I1,I2,2)*1.E-3,   &
+                 ZSCOORD_SEG(I1,I2,3)*1.E-3
+    END DO
+  END DO
+!
+  FLUSH(UNIT=ILU)
+END IF
+!
+END SUBROUTINE WRITE_OUT_ASCII
+!
+!-------------------------------------------------------------------------------
+!
+SUBROUTINE WRITE_OUT_LMA
+!
+!!
+!! Purpose:
+!!
+!
+!*      0.     DECLARATIONS
+!              ------------
+!
+IMPLICIT NONE
+!
+INTEGER :: I1, I2
+INTEGER :: ILU ! unit number for IO
+!
+!
+!*      1.     LMA SIMULATOR
+!              -------------
+!
+CALL SM_LATLON(XLATORI,XLONORI,ZSCOORD_SEG(:,:,1),ZSCOORD_SEG(:,:,2), &
+                               ZLMA_LAT(:,:),ZLMA_LON(:,:))
+!
+ILU = TPFILE_LMA%NLU
+!
+DO I1 = 1, NNBLIGHT
+  DO I2 = 1, ISNBSEG(I1)
+    WRITE (UNIT=ILU,FMT='(I6,F12.1,I6,2(F15.6),3(F15.3),3(I6),12(E15.4))') &
+               ISFLASH_NUMBER(I1),           &
+               ISTCOUNT_NUMBER(I1) * PTSTEP, &
+               ISTYPE(I1),                   &
+               ZLMA_LAT(I1,I2),              &
+               ZLMA_LON(I1,I2),              &
+               ZSCOORD_SEG(I1,I2,1)*1.E-3,   &
+               ZSCOORD_SEG(I1,I2,2)*1.E-3,   &
+               ZSCOORD_SEG(I1,I2,3)*1.E-3,   &
+               ISLMA_SEG_GLOB(I1,I2,1),      &
+               ISLMA_SEG_GLOB(I1,I2,2),      &
+               ISLMA_SEG_GLOB(I1,I2,3),      &
+               ZSLMA_PRT(I1,I2,2),           &
+               ZSLMA_PRT(I1,I2,3),           &
+               ZSLMA_PRT(I1,I2,4),           &
+               ZSLMA_PRT(I1,I2,5),           &
+               ZSLMA_PRT(I1,I2,6),           &
+               ZSLMA_QMT(I1,I2,2),           &
+               ZSLMA_QMT(I1,I2,3),           &
+               ZSLMA_QMT(I1,I2,4),           &
+               ZSLMA_QMT(I1,I2,5),           &
+               ZSLMA_QMT(I1,I2,6),           &
+               ZSLMA_NEUT_POS(I1,I2),        &
+               ZSLMA_NEUT_NEG(I1,I2)
+  END DO
+END DO
+!
+FLUSH(UNIT=ILU)
+!
+END SUBROUTINE WRITE_OUT_LMA
+!
+!-------------------------------------------------------------------------------
+!
+RECURSIVE SUBROUTINE N8QUICK_SORT(PLIST, KORDER)
+
+! Quick sort routine from:
+! Brainerd, W.S., Goldberg, C.H. & Adams, J.C. (1990) "Programmer's Guide to
+! Fortran 90", McGraw-Hill  ISBN 0-07-000248-7, pages 149-150.
+! Modified by Alan Miller to include an associated integer array which gives
+! the positions of the elements in the original order.
+!
+use modd_precision, only: MNHINT64
+
+IMPLICIT NONE
+!
+INTEGER(kind=MNHINT64), DIMENSION (:), INTENT(INOUT)  :: PLIST
+INTEGER, DIMENSION (:), INTENT(OUT)  :: KORDER
+!
+! Local variable
+INTEGER :: JI
+
+DO JI = 1, SIZE(PLIST)
+  KORDER(JI) = JI
+END DO
+
+CALL N8QUICK_SORT_1(1, SIZE(PLIST), PLIST, KORDER)
+
+END SUBROUTINE N8QUICK_SORT
+!
+!-------------------------------------------------------------------------------
+!
+RECURSIVE SUBROUTINE N8QUICK_SORT_1(KLEFT_END, KRIGHT_END, PLIST1, KORDER1)
+
+use modd_precision, only: MNHINT64
+
+implicit none
+
+INTEGER,                               INTENT(IN)    :: KLEFT_END, KRIGHT_END
+INTEGER(kind=MNHINT64), DIMENSION (:), INTENT(INOUT) :: PLIST1
+INTEGER,                DIMENSION (:), INTENT(INOUT) :: KORDER1
+!     Local variables
+INTEGER, PARAMETER     :: IMAX_SIMPLE_SORT_SIZE = 6
+
+INTEGER                :: JI, JJ, ITEMP
+INTEGER(kind=MNHINT64) :: ZREF, ZTEMP
+
+IF (KRIGHT_END < KLEFT_END + IMAX_SIMPLE_SORT_SIZE) THEN
+  ! Use interchange sort for small PLISTs
+  CALL N8INTERCHANGE_SORT(KLEFT_END, KRIGHT_END, PLIST1, KORDER1)
+  !
+ELSE
+  !
+  ! Use partition ("quick") sort
+  ! valeur au centre du tableau
+  ZREF = PLIST1((KLEFT_END + KRIGHT_END)/2)
+  JI = KLEFT_END - 1
+  JJ = KRIGHT_END + 1
+
+  DO
+    ! Scan PLIST from left end until element >= ZREF is found
+    DO
+      JI = JI + 1
+      IF (PLIST1(JI) >= ZREF) EXIT
+    END DO
+    ! Scan PLIST from right end until element <= ZREF is found
+    DO
+      JJ = JJ - 1
+      IF (PLIST1(JJ) <= ZREF) EXIT
+    END DO
+
+
+    IF (JI < JJ) THEN
+      ! Swap two out-of-order elements
+      ZTEMP = PLIST1(JI)
+      PLIST1(JI) = PLIST1(JJ)
+      PLIST1(JJ) = ZTEMP
+      ITEMP = KORDER1(JI)
+      KORDER1(JI) = KORDER1(JJ)
+      KORDER1(JJ) = ITEMP
+    ELSE IF (JI == JJ) THEN
+      JI = JI + 1
+      EXIT
+    ELSE
+      EXIT
+    END IF
+  END DO
+
+  IF ( KLEFT_END < JJ )         CALL N8QUICK_SORT_1( KLEFT_END, JJ,         PLIST1, KORDER1 )
+  IF ( JI        < KRIGHT_END ) CALL N8QUICK_SORT_1( JI,        KRIGHT_END, PLIST1, KORDER1 )
+END IF
+
+END SUBROUTINE N8QUICK_SORT_1
+!
+!-------------------------------------------------------------------------------
+!
+SUBROUTINE N8INTERCHANGE_SORT(KLEFT_END, KRIGHT_END, PLIST2, KORDER2)
+
+use modd_precision, only: MNHINT64
+
+implicit none
+
+INTEGER,                              INTENT(IN)    :: KLEFT_END, KRIGHT_END
+INTEGER(kind=MNHINT64), DIMENSION(:), INTENT(INOUT) :: PLIST2
+INTEGER,                DIMENSION(:), INTENT(INOUT) :: KORDER2
+!     Local variables
+INTEGER                :: JI, JJ, ITEMP
+INTEGER(kind=MNHINT64) :: ZTEMP
+
+! boucle sur tous les points
+DO JI = KLEFT_END, KRIGHT_END - 1
+  !
+  ! boucle sur les points suivants le point JI
+  DO JJ = JI+1, KRIGHT_END
+    !
+    ! si la distance de JI au point est plus grande que celle de JJ
+    IF (PLIST2(JI) > PLIST2(JJ)) THEN
+      ! distance de JI au point (la plus grande)
+      ZTEMP = PLIST2(JI)
+      ! le point JJ est déplacé à l'indice JI dans le tableau 
+      PLIST2(JI) = PLIST2(JJ)
+      ! le point JI est déplacé à l'indice JJ dans le tableau
+      PLIST2(JJ) = ZTEMP
+      ! indice du point JI dans le tableau
+      ITEMP = KORDER2(JI)
+      ! l'indice du point JJ est mis à la place JI
+      KORDER2(JI) = KORDER2(JJ)
+      ! l'indice du point JI est mis à la place JJ
+      KORDER2(JJ) = ITEMP
+    END IF
+    !
+  END DO
+  !
+END DO
+
+END SUBROUTINE N8INTERCHANGE_SORT
+!-------------------------------------------------------------------------------
+  SUBROUTINE MNH_RANDOM_NUMBER(ZRANDOM)
+
+    use modd_precision, only: MNHINT32
+
+    REAL, INTENT(OUT)            :: ZRANDOM
+    INTEGER(kind=MNHINT32), SAVE :: NSEED_MNH = 26032012_MNHINT32
+
+    ZRANDOM = real( r8_uniform_01( NSEED_MNH ), kind(ZRANDOM) )
+
+  END SUBROUTINE MNH_RANDOM_NUMBER
+
+!------------------------------------------------------------------------------------------
+
+  FUNCTION r8_uniform_01 ( seed )
+
+    !*****************************************************************************80
+    !
+    !! R8_UNIFORM_01 returns a unit pseudorandom R8.
+    !
+    !  Discussion:
+    !
+    !    An R8 is a real ( kind = 8 ) value.
+    !
+    !    For now, the input quantity SEED is an integer variable.
+    !
+    !    This routine implements the recursion
+    !
+    !      seed = ( 16807 * seed ) mod ( 2^31 - 1 )
+    !      r8_uniform_01 = seed / ( 2^31 - 1 )
+    !
+    !    The integer arithmetic never requires more than 32 bits,
+    !    including a sign bit.
+    !
+    !    If the initial seed is 12345, then the first three computations are
+    !
+    !      Input     Output      R8_UNIFORM_01
+    !      SEED      SEED
+    !
+    !         12345   207482415  0.096616
+    !     207482415  1790989824  0.833995
+    !    1790989824  2035175616  0.947702
+    !
+    !  Licensing:
+    !
+    !    This code is distributed under the GNU LGPL license.     
+    !    Souce here : https://people.sc.fsu.edu/~jburkardt/f_src/uniform/uniform.f90
+    !
+    !  Modified:
+    !
+    !    31 May 2007
+    !
+    !  Author:
+    !
+    !    John Burkardt
+    !
+    !  Reference:
+    !
+    !    Paul Bratley, Bennett Fox, Linus Schrage,
+    !    A Guide to Simulation,
+    !    Second Edition,
+    !    Springer, 1987,
+    !    ISBN: 0387964673,
+    !    LC: QA76.9.C65.B73.
+    !
+    !    Bennett Fox,
+    !    Algorithm 647:
+    !    Implementation and Relative Efficiency of Quasirandom
+    !    Sequence Generators,
+    !    ACM Transactions on Mathematical Software,
+    !    Volume 12, Number 4, December 1986, pages 362-376.
+    !
+    !    Pierre L'Ecuyer,
+    !    Random Number Generation,
+    !    in Handbook of Simulation,
+    !    edited by Jerry Banks,
+    !    Wiley, 1998,
+    !    ISBN: 0471134031,
+    !    LC: T57.62.H37.
+    !
+    !    Peter Lewis, Allen Goodman, James Miller,
+    !    A Pseudo-Random Number Generator for the System/360,
+    !    IBM Systems Journal,
+    !    Volume 8, Number 2, 1969, pages 136-143.
+    !
+    !  Parameters:
+    !
+    !    Input/output, integer ( kind = MNHINT32 ) SEED, the "seed" value, which should
+    !    NOT be 0. On output, SEED has been updated.
+    !
+    !    Output, real ( kind = MNHREAL64 ) R8_UNIFORM_01, a new pseudorandom variate,
+    !    strictly between 0 and 1.
+    !
+    use modd_precision, only: MNHINT32, MNHREAL64
+
+    implicit none
+
+    integer(kind = MNHINT32), intent(inout) :: seed
+    real(kind=MNHREAL64)                    :: r8_uniform_01
+
+    integer(kind = MNHINT32), parameter :: i4_huge = 2147483647_MNHINT32
+
+    integer(kind = MNHINT32) :: k
+
+    if ( seed == 0_MNHINT32 ) THEN
+      call Print_msg( NVERB_FATAL, 'GEN', 'r8_uniform_01', 'seed dummy argument must be different of 0' )
+    end if
+
+    k = seed / 127773_MNHINT32
+
+    seed = 16807_MNHINT32 * ( seed - k * 127773_MNHINT32 ) - k * 2836_MNHINT32
+
+    if ( seed < 0_MNHINT32 ) then
+       seed = seed + i4_huge
+    end if
+
+    r8_uniform_01 = real(seed) * 4.656612875d-10
+
+    return
+  end function r8_uniform_01
+!
+END SUBROUTINE FLASH_GEOM_ELEC_n
+!
+!-------------------------------------------------------------------------------
diff --git a/src/PHYEX/ext/goto_model_wrapper.f90 b/src/PHYEX/ext/goto_model_wrapper.f90
new file mode 100644
index 0000000000000000000000000000000000000000..e869230e24429a0a260fcba70bceade88bb9ea62
--- /dev/null
+++ b/src/PHYEX/ext/goto_model_wrapper.f90
@@ -0,0 +1,252 @@
+!MNH_LIC Copyright 1994-2023 CNRS, Meteo-France and Universite Paul Sabatier
+!MNH_LIC This is part of the Meso-NH software governed by the CeCILL-C licence
+!MNH_LIC version 1. See LICENSE, CeCILL-C_V1-en.txt and CeCILL-C_V1-fr.txt
+!MNH_LIC for details. version 1.
+!-----------------------------------------------------------------
+!!    MODIFICATIONS
+!!    -------------
+!!      06/12 (Tomasini) Grid-nesting of ADVFRC and EDDY_FLUX
+!!      07/13 (Bosseur & Filippi) adds Forefire
+!!      2014 (Faivre)
+!!      2016  (Leriche) Add MODD_CH_ICE Suppress MODD_CH_DEP_n
+!!      Modification    01/2016  (JP Pinty) Add LIMA
+!!  10/2016     (F Brosse) Add prod/loss terms computation for chemistry 
+!!                      07/2017 (M.Leriche) Add DIAG chimical surface fluxes
+!                   02/2018 Q.Libois ECRAD
+!!  Philippe Wautelet: 05/2016-04/2018: new data structures and calls for I/O
+!                  2017 V.Vionnet blow snow
+!                  11/2019 C.Lac correction in the drag formula and application to building in addition to tree
+!  F. Auguste     02/21: add IBM
+!  T. Nagel       02/21: add turbulence recycling
+!  R. Schoetter    12/2021  multi-level coupling between MesoNH and SURFEX  
+!  P. Wautelet 27/04/2022: add namelist for profilers
+!  P. Wautelet 10/02/2023: add Blaze variables
+!-----------------------------------------------------------------
+MODULE MODI_GOTO_MODEL_WRAPPER
+
+INTERFACE 
+SUBROUTINE GOTO_MODEL_WRAPPER(KFROM, KTO, ONOFIELDLIST)
+INTEGER,           INTENT(IN) :: KFROM, KTO
+LOGICAL, OPTIONAL, INTENT(IN) :: ONOFIELDLIST
+END SUBROUTINE GOTO_MODEL_WRAPPER
+END INTERFACE
+
+END MODULE MODI_GOTO_MODEL_WRAPPER
+
+SUBROUTINE GOTO_MODEL_WRAPPER(KFROM, KTO, ONOFIELDLIST)
+! all USE modd*_n modules
+USE MODD_ADVFRC_n
+USE MODD_ADV_n
+USE MODD_ALLPROFILER_n
+USE MODD_ALLSTATION_n
+USE MODD_BIKHARDT_n
+USE MODD_BLANK_n
+USE MODD_BLOWSNOW_n
+USE MODD_CH_AERO_n
+USE MODD_CH_BUDGET_n
+USE MODD_CH_FLX_n
+USE MODD_CH_ICE_n
+USE MODD_CH_JVALUES_n
+USE MODD_CH_M9_n
+USE MODD_CH_MNHC_n
+USE MODD_CH_PH_n
+USE MODD_CH_PRODLOSSTOT_n
+USE MODD_CH_ROSENBROCK_n
+USE MODD_CH_SOLVER_n
+USE MODD_CLOUDPAR_n
+USE MODD_PARAM_ICE_n
+USE MODD_PARAM_LIMA, ONLY: PARAM_LIMA_ASSOCIATE !not yet a '_n' module
+USE MODD_RAIN_ICE_PARAM_n
+USE MODD_RAIN_ICE_DESCR_n
+USE MODD_CLOUD_MF_n
+USE MODD_CONF_n
+USE MODD_CURVCOR_n
+USE MODD_DIM_n
+USE MODD_DRAG_n
+USE MODD_DRAGTREE_n
+USE MODD_DRAGBLDG_n
+USE MODD_COUPLING_LEVELS_n
+USE MODD_DUMMY_GR_FIELD_n
+USE MODD_DYN_n
+USE MODD_DYNZD_n
+USE MODD_ELEC_n
+USE MODD_FIELD_n
+USE MODD_FIRE_n
+#ifdef MNH_FOREFIRE
+USE MODD_FOREFIRE_n
+#endif
+USE MODD_FRC_n
+USE MODD_GET_n
+USE MODD_GR_FIELD_n
+USE MODD_IBM_LSF
+USE MODD_IBM_PARAM_n
+USE MODD_IO_SURF_MNH
+USE MODD_LBC_n
+USE MODD_LES_n
+USE MODD_LSFIELD_n
+USE MODD_LUNIT_n
+USE MODD_MEAN_FIELD_n
+USE MODD_METRICS_n
+USE MODD_NEST_PGD_n
+USE MODD_NUDGING_n
+USE MODD_OUT_n
+USE MODD_PACK_GR_FIELD_n
+USE MODD_PARAM_KAFR_n
+USE MODD_PARAM_MFSHALL_n
+USE MODD_PARAM_n
+USE MODD_PARAM_RAD_n
+USE MODD_PARAM_ECRAD_n
+USE MODD_PASPOL_n
+USE MODD_PAST_FIELD_n
+USE MODD_PRECIP_n
+USE MODD_PROFILER_n
+USE MODD_RADIATIONS_n
+USE MODD_RBK90_Global_n
+USE MODD_RBK90_JacobianSP_n
+USE MODD_RBK90_Parameters_n
+USE MODD_RECYCL_PARAM_n
+USE MODD_REF_n
+USE MODD_RELFRC_n
+USE MODD_SECPGD_FIELD_n
+USE MODD_SERIES_n
+USE MODD_SHADOWS_n
+USE MODD_STATION_n
+USE MODD_SUB_CH_FIELD_VALUE_n
+USE MODD_SUB_CH_MONITOR_n
+USE MODD_SUB_ELEC_n
+USE MODD_SUB_MODEL_n
+USE MODD_SUB_PASPOL_n
+USE MODD_SUB_PHYS_PARAM_n
+USE MODD_TIMEZ
+USE MODD_TURB_n
+USE MODD_NEB_n, ONLY: NEB_GOTO_MODEL
+!
+!
+use mode_field,             only: Fieldlist_goto_model
+use mode_msg
+!
+!
+IMPLICIT NONE 
+!
+INTEGER,           INTENT(IN) :: KFROM, KTO
+LOGICAL, OPTIONAL, INTENT(IN) :: ONOFIELDLIST
+!
+CHARACTER(LEN=64) :: YMSG
+LOGICAL           :: GNOFIELDLIST
+!
+WRITE(YMSG,'( I4,"->",I4 )') KFROM,KTO
+CALL PRINT_MSG(NVERB_DEBUG,'GEN','GOTO_MODEL_WRAPPER',TRIM(YMSG))
+!
+IF (PRESENT(ONOFIELDLIST)) THEN
+  GNOFIELDLIST = ONOFIELDLIST
+ELSE
+  GNOFIELDLIST = .FALSE.
+END IF
+!
+! All calls to specific modd_*n goto_model routines
+!
+CALL ADV_GOTO_MODEL(KFROM, KTO)
+CALL BIKHARDT_GOTO_MODEL(KFROM, KTO)
+CALL BLANK_GOTO_MODEL(KFROM,KTO)
+CALL CH_AERO_GOTO_MODEL(KFROM,KTO)
+CALL CH_FLX_GOTO_MODEL(KFROM, KTO)
+CALL CH_JVALUES_GOTO_MODEL(KFROM, KTO)
+CALL CH_MNHC_GOTO_MODEL(KFROM, KTO)
+CALL CH_SOLVER_GOTO_MODEL(KFROM, KTO)
+CALL CLOUDPAR_GOTO_MODEL(KFROM, KTO)
+CALL PARAM_ICE_GOTO_MODEL(KFROM, KTO)
+CALL PARAM_LIMA_ASSOCIATE() !Not yet a goto_model but put here for simplicity and to prepare the transformation into a '_n' module
+CALL RAIN_ICE_PARAM_GOTO_MODEL(KFROM, KTO)
+CALL RAIN_ICE_DESCR_GOTO_MODEL(KFROM, KTO)
+CALL CLOUD_MF_GOTO_MODEL(KFROM, KTO)
+CALL CONF_GOTO_MODEL(KFROM, KTO)
+CALL CURVCOR_GOTO_MODEL(KFROM, KTO)
+!CALL DEEP_CONVECTION_GOTO_MODEL(KFROM, KTO)
+CALL DIM_GOTO_MODEL(KFROM, KTO)
+CALL DRAGTREE_GOTO_MODEL(KFROM, KTO)
+CALL DRAGBLDG_GOTO_MODEL(KFROM, KTO)
+CALL COUPLING_MULT_GOTO_MODEL(KFROM, KTO)
+CALL DUMMY_GR_FIELD_GOTO_MODEL(KFROM, KTO)
+CALL DYN_GOTO_MODEL(KFROM, KTO)
+CALL DYNZD_GOTO_MODEL(KFROM,KTO)
+CALL FIELD_GOTO_MODEL(KFROM, KTO)
+!CALL PAST_FIELD_GOTO_MODEL(KFROM, KTO)
+CALL GET_GOTO_MODEL(KFROM, KTO)
+!CALL GR_FIELD_GOTO_MODEL(KFROM, KTO)
+!$20140403 add grid_conf_proj_goto_model
+!CALL GRID_CONF_PROJ_GOTO_MODEL(KFROM,KTO)
+!$
+!CALL GRID_GOTO_MODEL(KFROM, KTO)
+!CALL HURR_FIELD_GOTO_MODEL(KFROM, KTO)
+!$20140403 add io_surf_mnh_goto_model!!
+CALL IO_SURF_MNH_GOTO_MODEL(KFROM, KTO)
+!$
+CALL LBC_GOTO_MODEL(KFROM, KTO)
+CALL LES_GOTO_MODEL(KFROM, KTO)
+CALL LSFIELD_GOTO_MODEL(KFROM, KTO)
+CALL LUNIT_GOTO_MODEL(KFROM, KTO)
+CALL MEAN_FIELD_GOTO_MODEL(KFROM, KTO)
+CALL METRICS_GOTO_MODEL(KFROM, KTO)
+CALL NEST_PGD_GOTO_MODEL(KFROM, KTO)
+CALL NUDGING_GOTO_MODEL(KFROM, KTO)
+CALL OUT_GOTO_MODEL(KFROM, KTO)
+CALL PACK_GR_FIELD_GOTO_MODEL(KFROM, KTO)
+CALL PARAM_KAFR_GOTO_MODEL(KFROM, KTO)
+CALL PARAM_MFSHALL_GOTO_MODEL(KFROM, KTO)
+CALL PARAM_GOTO_MODEL(KFROM, KTO)
+CALL PARAM_RAD_GOTO_MODEL(KFROM, KTO)
+#ifdef MNH_ECRAD
+CALL PARAM_ECRAD_GOTO_MODEL(KFROM, KTO)
+#endif
+CALL PASPOL_GOTO_MODEL(KFROM, KTO)
+#ifdef MNH_FOREFIRE
+CALL FOREFIRE_GOTO_MODEL(KFROM, KTO)
+#endif
+CALL FIRE_GOTO_MODEL( KFROM, KTO )
+!CALL PRECIP_GOTO_MODEL(KFROM, KTO)
+CALL ELEC_GOTO_MODEL(KFROM, KTO)
+CALL RADIATIONS_GOTO_MODEL(KFROM, KTO)
+CALL SHADOWS_GOTO_MODEL(KFROM, KTO)
+CALL REF_GOTO_MODEL(KFROM, KTO)
+CALL FRC_GOTO_MODEL(KFROM, KTO)
+CALL SECPGD_FIELD_GOTO_MODEL(KFROM, KTO)
+CALL SERIES_GOTO_MODEL(KFROM, KTO)
+CALL PROFILER_GOTO_MODEL(KFROM, KTO)
+CALL STATION_GOTO_MODEL(KFROM, KTO)
+CALL ALLPROFILER_GOTO_MODEL(KFROM, KTO)
+CALL ALLSTATION_GOTO_MODEL(KFROM, KTO)
+CALL SUB_CH_FIELD_VALUE_GOTO_MODEL(KFROM, KTO)
+CALL SUB_CH_MONITOR_GOTO_MODEL(KFROM, KTO)
+CALL SUB_MODEL_GOTO_MODEL(KFROM, KTO)
+CALL SUB_PHYS_PARAM_GOTO_MODEL(KFROM, KTO)
+CALL SUB_PASPOL_GOTO_MODEL(KFROM, KTO)
+CALL SUB_ELEC_GOTO_MODEL(KFROM, KTO)
+!CALL TIME_GOTO_MODEL(KFROM, KTO)
+CALL TURB_GOTO_MODEL(KFROM, KTO)
+CALL NEB_GOTO_MODEL(KFROM, KTO)
+CALL DRAG_GOTO_MODEL(KFROM, KTO)
+CALL TIMEZ_GOTO_MODEL(KFROM, KTO)
+CALL CH_PH_GOTO_MODEL(KFROM, KTO)
+CALL CH_ICE_GOTO_MODEL(KFROM, KTO)
+CALL CH_M9_GOTO_MODEL(KFROM, KTO)
+CALL CH_ROSENBROCK_GOTO_MODEL(KFROM, KTO)
+CALL RBK90_Global_GOTO_MODEL(KFROM, KTO)
+CALL RBK90_JacobianSP_GOTO_MODEL(KFROM, KTO)
+CALL RBK90_Parameters_GOTO_MODEL(KFROM, KTO)
+!
+!CALL LIMA_PRECIP_SCAVENGING_GOTO_MODEL(KFROM, KTO)
+!
+!CALL EDDY_FLUX_GOTO_MODEL(KFROM, KTO)
+!CALL EDDYUV_FLUX_GOTO_MODEL(KFROM, KTO)
+CALL ADVFRC_GOTO_MODEL(KFROM, KTO)
+CALL RELFRC_GOTO_MODEL(KFROM, KTO)
+CALL CH_PRODLOSSTOT_GOTO_MODEL(KFROM,KTO)
+CALL CH_BUDGET_GOTO_MODEL(KFROM,KTO)
+CALL BLOWSNOW_GOTO_MODEL(KFROM, KTO)
+CALL IBM_GOTO_MODEL(KFROM, KTO)
+CALL RECYCL_GOTO_MODEL(KFROM, KTO)
+CALL LSF_GOTO_MODEL(KFROM, KTO)
+!
+IF (.NOT.GNOFIELDLIST) CALL FIELDLIST_GOTO_MODEL(KFROM, KTO)
+!
+END SUBROUTINE GOTO_MODEL_WRAPPER
diff --git a/src/PHYEX/ext/ground_paramn.f90 b/src/PHYEX/ext/ground_paramn.f90
new file mode 100644
index 0000000000000000000000000000000000000000..598dcdeec67df2619ef469760a903376eaadd98a
--- /dev/null
+++ b/src/PHYEX/ext/ground_paramn.f90
@@ -0,0 +1,1521 @@
+!MNH_LIC Copyright 1995-2023 CNRS, Meteo-France and Universite Paul Sabatier
+!MNH_LIC This is part of the Meso-NH software governed by the CeCILL-C licence
+!MNH_LIC version 1. See LICENSE, CeCILL-C_V1-en.txt and CeCILL-C_V1-fr.txt
+!MNH_LIC for details. version 1.
+!-----------------------------------------------------------------
+!     ##########
+MODULE MODI_GROUND_PARAM_n
+!     ##########
+!
+INTERFACE 
+!
+      SUBROUTINE GROUND_PARAM_n(D, PSFTH, PSFTH_WALL, PSFTH_ROOF, PCD_ROOF, PSFRV, PSFRV_WALL, &
+                                 PSFRV_ROOF, PSFSV, PSFCO2, PSFU, PSFV, PDIR_ALB, PSCA_ALB,  &
+                                 PEMIS, PTSRAD, KTCOUNT, TPFILE )
+!
+USE MODD_DIMPHYEX,   ONLY: DIMPHYEX_t
+!
+!* surface fluxes
+!  --------------
+!
+USE MODD_DIMPHYEX, ONLY: DIMPHYEX_t
+USE MODD_IO,       ONLY: TFILEDATA
+!
+TYPE(DIMPHYEX_t),     INTENT(IN)   :: D
+REAL, DIMENSION(:,:), INTENT(OUT) :: PSFTH ! Total surface flux of potential temperature (Km/s)
+REAL, DIMENSION(:,:), INTENT(OUT) :: PSFTH_WALL ! Wall surface flux of potential temperature (Km/s)
+REAL, DIMENSION(:,:), INTENT(OUT) :: PSFTH_ROOF ! Roof surface flux of potential temperature (Km/s)
+REAL, DIMENSION(:,:), INTENT(OUT) :: PCD_ROOF ! Drag coefficient for roofs (-)
+REAL, DIMENSION(:,:), INTENT(OUT) :: PSFRV ! Total surface flux of water vapor           (m/s*kg/kg)
+REAL, DIMENSION(:,:), INTENT(OUT) :: PSFRV_WALL ! Wall surface flux of water vapor           (m/s*kg/kg)
+REAL, DIMENSION(:,:), INTENT(OUT) :: PSFRV_ROOF ! Roof surface flux of water vapor           (m/s*kg/kg)
+REAL, DIMENSION(:,:,:),INTENT(OUT):: PSFSV ! surface flux of scalar                (m/s*kg/kg)
+                                           ! flux of chemical var.                 (ppv.m/s)
+REAL, DIMENSION(:,:), INTENT(OUT) :: PSFCO2! surface flux of CO2                   (m/s*kg/kg)
+REAL, DIMENSION(:,:), INTENT(OUT) :: PSFU  ! surface fluxes of horizontal   
+REAL, DIMENSION(:,:), INTENT(OUT) :: PSFV  ! momentum in x and y directions        (m2/s2)
+!
+!* Radiative parameters
+!  --------------------
+!
+REAL, DIMENSION(:,:,:), INTENT(OUT) :: PDIR_ALB  ! direct  albedo for each spectral band (-)
+REAL, DIMENSION(:,:,:), INTENT(OUT) :: PSCA_ALB  ! diffuse albedo for each spectral band (-)
+REAL, DIMENSION(:,:,:), INTENT(OUT) :: PEMIS     ! surface emissivity                    (-)
+REAL, DIMENSION(:,:),   INTENT(OUT) :: PTSRAD    ! surface radiative temperature         (K)
+!
+INTEGER,                INTENT(IN)  :: KTCOUNT   ! temporal iteration count
+TYPE(TFILEDATA),        INTENT(IN)  :: TPFILE    ! Synchronous output file
+END SUBROUTINE GROUND_PARAM_n
+!
+END INTERFACE
+!
+END MODULE MODI_GROUND_PARAM_n
+!
+!     ######################################################################
+      SUBROUTINE GROUND_PARAM_n(D, PSFTH, PSFTH_WALL, PSFTH_ROOF, PCD_ROOF, PSFRV,  &
+                                 PSFRV_WALL, PSFRV_ROOF, PSFSV, PSFCO2, PSFU,     &
+                                 PSFV, PDIR_ALB, PSCA_ALB, PEMIS, PTSRAD, KTCOUNT, TPFILE )
+!     #######################################################################
+!
+!
+!!****  *GROUND_PARAM*  
+!!
+!!    PURPOSE
+!!    -------
+!       Monitor to call the externalized surface
+!     
+!!**  METHOD
+!!    ------
+!
+!!    EXTERNAL
+!!    --------
+!!
+!!    IMPLICIT ARGUMENTS
+!!    ------------------
+!!
+!!
+!!    REFERENCE
+!!    ---------
+!!
+!!    Noilhan and Planton (1989)
+!!      
+!!    AUTHOR
+!!    ------
+!!	S. Belair           * Meteo-France *
+!!
+!!    MODIFICATIONS
+!!    -------------
+!!      Original    10/03/95 
+!!      (J.Stein)   25/10/95  add the rain flux computation at the ground
+!!                            and the lbc
+!!      (J.Stein)   15/11/95  include the strong slopes cases
+!!      (J.Stein)   06/02/96  bug correction for the precipitation flux writing 
+!!      (J.Stein)   20/05/96  set the right IGRID value for the rain rate
+!!      (J.Viviand) 04/02/97  add cold and convective precipitation rate
+!!      (J.Stein)   22/06/97  use the absolute pressure    
+!!      (V.Masson)  09/07/97  add directional z0 computations and RESA correction     
+!!      (V.Masson)  13/02/98  merge the ISBA and TSZ0 routines,
+!!                            rename the routine as a monitor, called by PHYS_PARAMn
+!!                            add the town parameterization
+!!                            recomputes z0 where snow is.
+!!                            pack and unpack of 2D fields into 1D fields
+!!      (V.Masson)  04/01/00  removes the TSZ0 case
+!       (F.Solmon/V.Masson)   adapatation for patch approach
+!                             modification of internal subroutine pack/ allocation in function 
+!                              of patch indices
+!                             calling of isba for each defined patch
+!                             averaging of patch fluxes to get nat fluxes 
+!       (P. Tulet/G.Guenais)  04/02/01  separation of vegetatives class
+!                                           for friction velocity and 
+!                                           aerodynamical resistance
+!      (S Donnier)            09/12/02  add specific humidity at 2m for diagnostic
+!      (V.Masson)             01/03/03  externalisation of the surface schemes!
+!      (P.Tulet )             01/11/03  externalisation of the surface chemistry!
+!!     (D.Gazen)              01/12/03  change emissions handling for surf. externalization
+!!     (J.escobar)            18/10/2012 missing USE MODI_COUPLING_SURF_ATM_n & MODI_DIAG_SURF_ATM_n
+!      (J.escobar)            02/2014 add Forefire coupling
+!!     (G.Delautier)          06/2016 phasage surfex 8
+!!     (B.Vie)                2016 LIMA
+!!     (J.Pianezze)           08/2016 add send/recv oasis functions
+!!      (M.Leriche)            24/03/16 remove flag for chemical surface fluxes
+!!      (M.Leriche)           01/07/2017 Add DIAG chimical surface fluxes
+!!  01/2018      (G.Delautier) SURFEX 8.1
+!!                   02/2018 Q.Libois ECRAD
+!!     (P.Wautelet) 28/03/2018 replace TEMPORAL_DIST by DATETIME_DISTANCE
+
+!!     (V. Vionnet)           18/07/2017 add coupling for blowing snow module 
+!!     (Bielli S.) 02/2019  Sea salt : significant sea wave height influences salt emission; 5 salt modes
+!  P. Wautelet 20/05/2019: add name argument to ADDnFIELD_ll + new ADD4DFIELD_ll subroutine
+!  R. Schoetter    12/2021  multi-level coupling between MesoNH and SURFEX  
+!  A. Costes      12/2021: Blaze Fire model
+!  P. Wautelet 09/02/2022: bugfix: add missing XCURRENT_LEI computation
+!  P. Wautelet 30/09/2022: bugfix: missing communications for SWDIFF, SWDIR and LEI
+!  P. Wautelet 30/09/2022: bugfix: use XUNDEF from SURFEX for surface variables computed by SURFEX
+!  P. Wautelet 21/10/2022: bugfix: communicate halo values between processes for OUT variables
+!-------------------------------------------------------------------------------
+!
+!*       0.     DECLARATIONS
+!               ------------
+!
+USE MODD_ALLPROFILER_n,     ONLY: LDIAG_SURFRAD_PROF
+USE MODD_ALLSTATION_n,      ONLY: LDIAG_SURFRAD_STAT
+USE MODD_ARGSLIST_ll,       ONLY: LIST_ll
+USE MODD_BLOWSNOW,          ONLY: LBLOWSNOW, NBLOWSNOW_2D, YPBLOWSNOW_2D
+USE MODD_BLOWSNOW_n,        ONLY: XRSNWCANOS
+USE MODD_BUDGET,            ONLY: LBUDGET_TH, LBUDGET_RV, NBUDGET_RV, NBUDGET_TH, TBUDGETS
+USE MODD_CH_AEROSOL,        ONLY: LORILAM
+USE MODD_CH_FLX_n,          ONLY: XCHFLX
+USE MODD_CH_MNHC_n,         ONLY: LUSECHEM
+USE MODD_CONF,              ONLY: CPROGRAM, LCARTESIAN, NHALO
+USE MODD_COUPLING_LEVELS_n
+USE MODD_CONF_n,            ONLY: NRR
+USE MODD_CST,               ONLY: XP00, XCPD, XRD, XRV, XRHOLW, XDAY, XPI, XMD, XAVOGADRO
+USE MODD_CSTS_DUST,         ONLY: XMOLARWEIGHT_DUST
+USE MODD_CSTS_SALT,         ONLY: XMOLARWEIGHT_SALT
+USE MODD_DEEP_CONVECTION_n, ONLY: XPRCONV, XPRSCONV
+USE MODD_DRAGBLDG_n,        ONLY : LFLUXBLDG
+USE MODD_DIAG_FLAG,         ONLY: LCHEMDIAG
+USE MODD_DIAG_IN_RUN
+USE MODD_DIM_n,             ONLY: NKMAX
+USE MODD_DIMPHYEX,          ONLY: DIMPHYEX_t
+USE MODD_DUST,              ONLY: LDUST 
+USE MODD_DYN_n,             ONLY: XTSTEP
+USE MODD_FIELD_n,           ONLY: XUT, XVT, XWT, XTHT, XRT, XPABST, XSVT, XTKET, XZWS, XRTHS, XRRS
+USE MODD_FIRE_n,            ONLY: XLSPHI, XBMAP, XFMR0, XFMRFA, XFMWF0, XFMR00, XFMIGNITION, XFMFUELTYPE,    &
+                                  XFIRETAU, XFLUXPARAMH, XFLUXPARAMW, XFIRERW, XFMASE, XFMAWC, XFMWALKIG,    &
+                                  XFMFLUXHDH, XFMFLUXHDW, XFMHWS, XFMWINDU, XFMWINDV, XFMWINDW, XGRADLSPHIX, &
+                                  XGRADLSPHIY, XFIREWIND, XFMGRADOROX, XFMGRADOROY
+USE MODD_GRID,              ONLY: XLON0, XRPK, XBETA
+USE MODD_GRID_n,            ONLY: XLON, XZZ, XDIRCOSXW, XDIRCOSYW, XDIRCOSZW, &
+                                  XCOSSLOPE, XSINSLOPE, XZS
+USE MODD_IO,                ONLY: TFILEDATA
+USE MODD_LUNIT_n,           ONLY: TLUOUT
+USE MODD_METRICS_n,         ONLY: XDXX, XDYY, XDZZ
+USE MODD_MNH_SURFEX_n,      ONLY: YSURF_CUR
+USE MODD_NSV,               ONLY: CSV, NSV, NSV_AERBEG, NSV_AEREND, NSV_CHEMBEG, NSV_CHEMEND, NSV_DSTBEG, NSV_DSTEND, &
+                                  NSV_SLTBEG, NSV_SLTEND, NSV_SNWBEG, NSV_SNWEND
+USE MODD_PARAM_C2R2,        ONLY: LSEDC
+USE MODD_PREP_SNOW,         ONLY: NIMPUR
+USE MODD_PARAMETERS,        ONLY: JPVEXT
+USE MODD_PARAM_ICE_n,         ONLY: LSEDIC
+USE MODD_PARAM_LIMA,        ONLY: MSEDC=>LSEDC
+USE MODD_PARAM_n,           ONLY: CDCONV, CCLOUD, CRAD, CTURB
+USE MODD_PRECIP_n,          ONLY: XINPRC, XINPRR, XINPRS, XINPRG, XINPRH
+USE MODD_PRECISION,         ONLY: MNHTIME
+USE MODD_PROFILER_n,        ONLY: LPROFILER
+USE MODD_RADIATIONS_n,      ONLY: XFLALWD, XCCO2, XTSIDER, &
+                                  XSW_BANDS, XDIRSRFSWD, XSCAFLASWD, &
+                                  XZENITH, XAZIM, XAER, XSWU, XLWU
+USE MODD_REF_n,             ONLY: XEXNREF, XRHODREF, XRHODJ
+USE MODD_SALT,              ONLY: LSALT
+USE MODD_STATION_n,         ONLY: LSTATION
+USE MODD_SURF_PAR,          ONLY: XUNDEF_SFX => XUNDEF
+USE MODD_TIME,              ONLY: TDTSEG
+USE MODD_TIME_n,            ONLY: TDTCUR
+#ifdef CPLOASIS
+USE MODD_SFX_OASIS,         ONLY: LOASIS
+USE MODD_DYN,               ONLY: XSEGLEN
+USE MODD_DYN_n,             ONLY: DYN_MODEL
+#endif
+#ifdef MNH_FOREFIRE
+USE MODD_FOREFIRE
+USE MODD_FOREFIRE_n
+#endif
+
+USE MODE_BUDGET,            ONLY: BUDGET_STORE_INIT, BUDGET_STORE_END
+USE MODE_DATETIME
+USE MODE_FIRE_MODEL
+USE MODE_ll
+USE MODE_MNH_TIMING,       ONLY: SECOND_MNH2
+USE MODE_MSG
+USE MODE_ROTATE_WIND,      ONLY: ROTATE_WIND
+
+USE MODI_COUPLING_SURF_ATM_n
+USE MODI_DIAG_SURF_ATM_n
+USE MODI_MNHGET_SURF_PARAM_n
+USE MODI_NORMAL_INTERPOL
+USE MODI_SHUMAN
+#ifdef CPLOASIS
+USE MODI_GET_HALO
+USE MODI_MNH_OASIS_RECV
+USE MODI_MNH_OASIS_SEND
+#endif
+#ifdef MNH_FOREFIRE
+USE MODI_COUPLING_FOREFIRE_n
+#endif
+!
+IMPLICIT NONE
+!
+!*      0.1    declarations of arguments
+!
+!* surface fluxes
+!  --------------
+!
+TYPE(DIMPHYEX_t),     INTENT(IN)   :: D
+REAL, DIMENSION(:,:), INTENT(OUT) :: PSFTH      ! Total surface flux of potential temperature (Km/s)
+REAL, DIMENSION(:,:), INTENT(OUT) :: PSFTH_WALL ! Wall surface flux of potential temperature (Km/s)
+REAL, DIMENSION(:,:), INTENT(OUT) :: PSFTH_ROOF ! Roof surface flux of potential temperature (Km/s)
+REAL, DIMENSION(:,:), INTENT(OUT) :: PCD_ROOF   ! Drag coefficient for roofs (-)
+REAL, DIMENSION(:,:), INTENT(OUT) :: PSFRV      ! Total surface flux of water vapor (m/s*kg/kg)
+REAL, DIMENSION(:,:), INTENT(OUT) :: PSFRV_WALL ! Wall surface flux of water vapor (m/s*kg/kg)
+REAL, DIMENSION(:,:), INTENT(OUT) :: PSFRV_ROOF ! Roof surface flux of water vapor (m/s*kg/kg)
+REAL, DIMENSION(:,:,:),INTENT(OUT):: PSFSV ! surface flux of scalar                (m/s*kg/kg)
+                                           ! flux of chemical var.                 (ppv.m/s)
+REAL, DIMENSION(:,:), INTENT(OUT) :: PSFCO2! surface flux of CO2                   (m/s*kg/kg)
+REAL, DIMENSION(:,:), INTENT(OUT) :: PSFU  ! surface fluxes of horizontal   
+REAL, DIMENSION(:,:), INTENT(OUT) :: PSFV  ! momentum in x and y directions        (m2/s2)
+!
+!* Radiative parameters
+!  --------------------
+!
+REAL, DIMENSION(:,:,:), INTENT(OUT) :: PDIR_ALB  ! direct  albedo for each spectral band (-)
+REAL, DIMENSION(:,:,:), INTENT(OUT) :: PSCA_ALB  ! diffuse albedo for each spectral band (-)
+REAL, DIMENSION(:,:,:), INTENT(OUT) :: PEMIS     ! surface emissivity                    (-)
+REAL, DIMENSION(:,:),   INTENT(OUT) :: PTSRAD    ! surface radiative temperature         (K)
+!
+INTEGER,                INTENT(IN)  :: KTCOUNT   ! temporal iteration count
+TYPE(TFILEDATA),        INTENT(IN)  :: TPFILE    ! Synchronous output file
+!
+!-------------------------------------------------------------------------------
+!
+!
+!
+!*      0.2    declarations of local variables
+!              -------------------------------
+!
+!
+!* Atmospheric variables
+!  ---------------------
+!
+REAL, DIMENSION(:,:,:), ALLOCATABLE         :: ZRV    ! vapor mixing ratio
+!
+!            suffix 'A' stands for atmospheric variable at first model level
+!
+REAL, DIMENSION(SIZE(PSFTH,1),SIZE(PSFTH,2))  :: ZRAIN  ! liquid precipitation (kg/m2/s)
+REAL, DIMENSION(SIZE(PSFTH,1),SIZE(PSFTH,2))  :: ZSNOW  ! solid precipitation  (kg/m2/s)
+REAL, DIMENSION(SIZE(PSFTH,1),SIZE(PSFTH,2))  :: ZTSUN  ! solar time           (s since midnight)
+REAL, DIMENSION(SIZE(PSFTH,1),SIZE(PSFTH,2))  :: ZPS    ! Surface pressure
+REAL, DIMENSION(SIZE(PSFTH,1),SIZE(PSFTH,2))  :: ZEXNS  ! Surface Exner function
+REAL, DIMENSION(SIZE(PSFTH,1),SIZE(PSFTH,2))  :: ZCO2   ! CO2 concentration (kg/kg)
+!
+! Variables for which multiple levels are sent to SURFEX and related ancilliary variables
+!
+REAL, DIMENSION(:,:,:), ALLOCATABLE :: ZZREF  ! Forcing height
+REAL, DIMENSION(:,:,:), ALLOCATABLE :: ZTA    ! Temperature
+REAL, DIMENSION(:,:,:), ALLOCATABLE :: ZRVA   ! vapor mixing ratio
+REAL, DIMENSION(:,:,:), ALLOCATABLE :: ZQA    ! humidity (kg/m3)
+REAL, DIMENSION(:,:,:), ALLOCATABLE :: ZPA    ! Pressure
+REAL, DIMENSION(:,:,:), ALLOCATABLE :: ZEXNA  ! Exner function
+REAL, DIMENSION(:,:,:), ALLOCATABLE :: ZTHA   ! potential temperature
+REAL, DIMENSION(:,:,:), ALLOCATABLE :: ZUA    ! u component of the wind parallel to the orography
+REAL, DIMENSION(:,:,:), ALLOCATABLE :: ZVA    ! v component of the wind parallel to the orography
+REAL, DIMENSION(:,:,:), ALLOCATABLE :: ZU     ! zonal wind
+REAL, DIMENSION(:,:,:), ALLOCATABLE :: ZV     ! meridian wind
+REAL, DIMENSION(:,:,:), ALLOCATABLE :: ZWIND  ! wind parallel to the orography
+REAL, DIMENSION(:,:,:), ALLOCATABLE :: ZRHOA  ! air density
+REAL, DIMENSION(:,:,:), ALLOCATABLE :: ZTKE   ! Subgrid turbulent kinetic energy
+REAL, DIMENSION(:,:,:), ALLOCATABLE :: ZDIR   ! wind direction (rad from N clockwise)
+REAL, DIMENSION(:,:,:), ALLOCATABLE :: ZALFA  ! angle between the wind and the x axis
+REAL, DIMENSION(:,:,:), ALLOCATABLE :: ZU2D   ! u and v component of the
+REAL, DIMENSION(:,:,:), ALLOCATABLE :: ZV2D   ! wind at mass point
+!
+! SURFEX output fluxes
+!
+REAL, DIMENSION(SIZE(PSFTH,1),SIZE(PSFTH,2))  :: ZSFU       ! zonal momentum flux
+REAL, DIMENSION(SIZE(PSFTH,1),SIZE(PSFTH,2))  :: ZSFV       ! meridian momentum flux
+REAL, DIMENSION(SIZE(PSFTH,1),SIZE(PSFTH,2))  :: ZSFTH      ! Total turbulent flux of heat
+REAL, DIMENSION(SIZE(PSFTH,1),SIZE(PSFTH,2))  :: ZSFTH_SURF ! Surface turbulent flux of heat
+REAL, DIMENSION(SIZE(PSFTH,1),SIZE(PSFTH,2))  :: ZSFTH_WALL ! Wall turbulent flux of heat
+REAL, DIMENSION(SIZE(PSFTH,1),SIZE(PSFTH,2))  :: ZSFTH_ROOF ! Roof turbulent flux of heat
+REAL, DIMENSION(SIZE(PSFTH,1),SIZE(PSFTH,2))  :: ZCD_ROOF   ! Drag coefficient for roofs
+REAL, DIMENSION(SIZE(PSFTH,1),SIZE(PSFTH,2))  :: ZSFTQ      ! Total turbulent flux of water
+REAL, DIMENSION(SIZE(PSFTH,1),SIZE(PSFTH,2))  :: ZSFTQ_SURF ! Surface turbulent flux of water
+REAL, DIMENSION(SIZE(PSFTH,1),SIZE(PSFTH,2))  :: ZSFTQ_WALL ! Wall turbulent flux of water
+REAL, DIMENSION(SIZE(PSFTH,1),SIZE(PSFTH,2))  :: ZSFTQ_ROOF ! Roof turbulent flux of water
+REAL, DIMENSION(SIZE(PSFTH,1),SIZE(PSFTH,2))  :: ZSFCO2     ! Turbulent flux of CO2
+REAL, DIMENSION(SIZE(PSFTH,1),SIZE(PSFTH,2),NSV):: ZSFTS    ! Turbulent flux of scalar
+REAL, DIMENSION(SIZE(PSFTH,1),SIZE(PSFTH,2),NBLOWSNOW_2D)  :: ZBLOWSNOW_2D  ! 2D blowing snow variables
+                                                                            ! after advection
+                                  ! They refer to the 2D fields advected by MNH including:
+                                  !             - total number concentration in Canopy
+                                  !             - total mass concentration in Canopy
+                                  !             - equivalent concentration in the saltation layer
+
+!
+! Anxiliary variables
+!
+REAL, DIMENSION(SIZE(PSFTH,1),SIZE(PSFTH,2)) :: ZZREF_DIST
+REAL, DIMENSION(SIZE(PSFTH,1),SIZE(PSFTH,2)) :: ZZREF_VERT
+REAL, DIMENSION(SIZE(PSFTH,1),SIZE(PSFTH,2)) :: ZWEIGHT_VERT
+REAL, DIMENSION(SIZE(PSFTH,1),SIZE(PSFTH,2)) :: ZAGLW_ILEV
+REAL, DIMENSION(SIZE(PSFTH,1),SIZE(PSFTH,2)) :: ZAGLW_ILEVP1
+REAL, DIMENSION(SIZE(PSFTH,1),SIZE(PSFTH,2)) :: ZAGLSCAL_ILEV
+!
+!* Dimensions
+!  ----------
+!
+INTEGER :: IIB  ! physical boundary
+INTEGER :: IIE  ! physical boundary
+INTEGER :: IJB  ! physical boundary
+INTEGER :: IJE  ! physical boundary
+INTEGER :: IKB  ! physical boundary
+INTEGER :: IKE  ! physical boundary
+INTEGER :: IKU  ! vertical array sizes
+!
+INTEGER :: JLAYER ! loop counter
+INTEGER :: JSV    ! loop counter
+INTEGER :: JI,JJ,JK ! loop index
+!
+INTEGER :: IDIM1 ! X physical dimension
+INTEGER :: IDIM2 ! Y physical dimension
+INTEGER :: IDIM1D! total physical dimension
+INTEGER :: IKRAD
+!
+INTEGER :: KSV_SURF  ! Number of scalar variables sent to SURFEX
+!
+!* Arrays put in 1D vectors
+!  ------------------------
+!
+! Pure surface variables or variables forced at only one level
+!
+REAL, DIMENSION(:),   ALLOCATABLE :: ZP_CO2      ! air CO2 concentration
+REAL, DIMENSION(:,:), ALLOCATABLE :: ZP_SV       ! scalar at first atmospheric level
+REAL, DIMENSION(:),   ALLOCATABLE :: ZP_RAIN     ! liquid precipitation
+REAL, DIMENSION(:),   ALLOCATABLE :: ZP_SNOW     ! solid precipitation
+REAL, DIMENSION(:),   ALLOCATABLE :: ZP_LW       ! incoming longwave
+REAL, DIMENSION(:,:), ALLOCATABLE :: ZP_DIR_SW   ! direct incoming shortwave
+REAL, DIMENSION(:,:), ALLOCATABLE :: ZP_SCA_SW   ! diffuse incoming shortwave
+REAL, DIMENSION(:),   ALLOCATABLE :: ZP_ZWS      ! significant wave height (m)
+REAL, DIMENSION(:),   ALLOCATABLE :: ZP_PS       ! surface pressure
+REAL, DIMENSION(:),   ALLOCATABLE :: ZP_TSUN     ! solar time
+REAL, DIMENSION(:),   ALLOCATABLE :: ZP_ZENITH   ! zenithal angle
+REAL, DIMENSION(:),   ALLOCATABLE :: ZP_AZIM     ! azimuthal angle
+REAL, DIMENSION(:),   ALLOCATABLE :: ZP_ZS       ! orography
+!
+! Variables that are forced at multiple levels
+!
+REAL, DIMENSION(:,:), ALLOCATABLE :: ZP_ZREF     ! forcing height
+REAL, DIMENSION(:,:), ALLOCATABLE :: ZP_U        ! zonal wind
+REAL, DIMENSION(:,:), ALLOCATABLE :: ZP_V        ! meridian wind
+REAL, DIMENSION(:,:), ALLOCATABLE :: ZP_QA       ! air humidity  (kg/m3)
+REAL, DIMENSION(:,:), ALLOCATABLE :: ZP_TA       ! air temperature
+REAL, DIMENSION(:,:), ALLOCATABLE :: ZP_RHOA     ! air density
+REAL, DIMENSION(:,:), ALLOCATABLE :: ZP_PA       ! pressure at first atmospheric level
+REAL, DIMENSION(:,:), ALLOCATABLE :: ZP_TKE      ! Subgrid turbulent kinetic energy
+!
+! SURFEX output variables
+!
+REAL, DIMENSION(:),   ALLOCATABLE :: ZP_SFTQ      ! Total water vapor flux
+REAL, DIMENSION(:),   ALLOCATABLE :: ZP_SFTQ_SURF ! Surface water vapor flux
+REAL, DIMENSION(:),   ALLOCATABLE :: ZP_SFTQ_WALL ! Wall water vapor flux
+REAL, DIMENSION(:),   ALLOCATABLE :: ZP_SFTQ_ROOF ! Roof water vapor flux
+REAL, DIMENSION(:),   ALLOCATABLE :: ZP_SFTH      ! Total potential temperature flux
+REAL, DIMENSION(:),   ALLOCATABLE :: ZP_SFTH_SURF ! Surface potential temperature flux
+REAL, DIMENSION(:),   ALLOCATABLE :: ZP_SFTH_WALL ! Wall potential temperature flux
+REAL, DIMENSION(:),   ALLOCATABLE :: ZP_SFTH_ROOF ! Roof potential temperature flux
+REAL, DIMENSION(:),   ALLOCATABLE :: ZP_CD_ROOF   ! Drag coefficient for roofs
+REAL, DIMENSION(:,:), ALLOCATABLE :: ZP_SFTS     ! scalar flux
+REAL, DIMENSION(:),   ALLOCATABLE :: ZP_SFCO2    ! CO2 flux
+REAL, DIMENSION(:),   ALLOCATABLE :: ZP_SFU      ! zonal momentum flux
+REAL, DIMENSION(:),   ALLOCATABLE :: ZP_SFV      ! meridian momentum flux
+REAL, DIMENSION(:),   ALLOCATABLE :: ZP_TSRAD    ! radiative surface temperature
+REAL, DIMENSION(:,:), ALLOCATABLE :: ZP_DIR_ALB  ! direct albedo
+REAL, DIMENSION(:,:), ALLOCATABLE :: ZP_SCA_ALB  ! diffuse albedo
+REAL, DIMENSION(:),   ALLOCATABLE :: ZP_EMIS     ! emissivity
+REAL, DIMENSION(:),   ALLOCATABLE :: ZP_TSURF
+REAL, DIMENSION(:),   ALLOCATABLE :: ZP_Z0
+REAL, DIMENSION(:),   ALLOCATABLE :: ZP_Z0H
+REAL, DIMENSION(:),   ALLOCATABLE :: ZP_QSURF
+!
+REAL, DIMENSION(:),   ALLOCATABLE :: ZP_PEW_A_COEF ! coefficients for
+REAL, DIMENSION(:),   ALLOCATABLE :: ZP_PEW_B_COEF ! implicit coupling
+REAL, DIMENSION(:),   ALLOCATABLE :: ZP_PET_A_COEF
+REAL, DIMENSION(:),   ALLOCATABLE :: ZP_PEQ_A_COEF
+REAL, DIMENSION(:),   ALLOCATABLE :: ZP_PET_B_COEF
+REAL, DIMENSION(:),   ALLOCATABLE :: ZP_PEQ_B_COEF
+REAL, DIMENSION(:),   ALLOCATABLE :: ZP_RN        ! net radiation           (W/m2)
+REAL, DIMENSION(:),   ALLOCATABLE :: ZP_H         ! sensible heat flux      (W/m2)
+REAL, DIMENSION(:),   ALLOCATABLE :: ZP_LE        ! Total latent heat flux  (W/m2)
+REAL, DIMENSION(:),   ALLOCATABLE :: ZP_LEI       ! Solid Latent heat flux  (W/m2)
+REAL, DIMENSION(:),   ALLOCATABLE :: ZP_GFLUX     ! ground flux             (W/m2)
+REAL, DIMENSION(:),   ALLOCATABLE :: ZP_T2M       ! Air temperature at 2 meters (K)
+REAL, DIMENSION(:),   ALLOCATABLE :: ZP_Q2M       ! Air humidity at 2 meters    (kg/kg)
+REAL, DIMENSION(:),   ALLOCATABLE :: ZP_HU2M      ! Air relative humidity at 2 meters (-)
+REAL, DIMENSION(:),   ALLOCATABLE :: ZP_ZON10M    ! zonal Wind at 10 meters     (m/s)
+REAL, DIMENSION(:),   ALLOCATABLE :: ZP_MER10M    ! meridian Wind at 10 meters  (m/s)
+REAL, DIMENSION(:,:), ALLOCATABLE :: ZP_ZIMPWET   ! wet deposit coefficient for each impurity type (g)
+REAL, DIMENSION(:,:), ALLOCATABLE :: ZP_ZIMPDRY   ! dry deposit coefficient for each impurity type (g)
+
+TYPE(LIST_ll), POINTER            :: TZFIELDSURF_ll    ! list of fields to exchange
+INTEGER                           :: IINFO_ll       ! return code of parallel routine
+!
+!
+CHARACTER(LEN=6) :: YJSV
+CHARACTER(LEN=6), DIMENSION(:), ALLOCATABLE :: YSV_SURF ! name of the scalar variables
+                                                        ! sent to SURFEX
+!                                                        
+LOGICAL :: GSTATPROF_SURF ! TRUE if station or profiler need to write surface or radiation data
+REAL    :: ZTIMEC
+INTEGER :: ILUOUT         ! logical unit
+!
+! New variables for coupling at several levels
+!
+REAL    :: ZAGLW_JK
+REAL    :: ZAGLW_JKP1
+REAL    :: ZAGLSCAL_JK
+INTEGER :: ICOUNT, ILEV
+!
+! Fire model
+REAL(KIND=MNHTIME), DIMENSION(2)      :: ZFIRETIME1, ZFIRETIME2           ! CPU time for Blaze perf profiling
+REAL(KIND=MNHTIME), DIMENSION(2)      :: ZGRADTIME1, ZGRADTIME2           ! CPU time for Blaze perf profiling
+REAL(KIND=MNHTIME), DIMENSION(2)      :: ZPROPAGTIME1, ZPROPAGTIME2       ! CPU time for Blaze perf profiling
+REAL(KIND=MNHTIME), DIMENSION(2)      :: ZFLUXTIME1, ZFLUXTIME2           ! CPU time for Blaze perf profiling
+REAL(KIND=MNHTIME), DIMENSION(2)      :: ZROSWINDTIME1, ZROSWINDTIME2     ! CPU time for Blaze perf profiling
+REAL, DIMENSION(:,:,:,:), ALLOCATABLE :: ZFIREFUELMAP                     ! Fuel map
+CHARACTER(LEN=7)                      :: YFUELMAPFILE                     ! Fuel Map file name
+TYPE(LIST_ll), POINTER                :: TZFIELDFIRE_ll                   ! list of fields to exchange
+!
+!-------------------------------------------------------------------------------
+!
+!
+ILUOUT=TLUOUT%NLU
+IKB= 1+JPVEXT
+IKU=NKMAX + 2* JPVEXT
+IKE=IKU-JPVEXT
+!
+CALL GET_INDICE_ll (IIB,IJB,IIE,IJE)
+!
+PSFTH      = XUNDEF_SFX
+PSFTH_WALL = XUNDEF_SFX
+PSFTH_ROOF = XUNDEF_SFX
+PCD_ROOF   = XUNDEF_SFX
+PSFRV      = XUNDEF_SFX
+PSFRV_WALL = XUNDEF_SFX
+PSFRV_ROOF = XUNDEF_SFX
+!
+PSFSV    = XUNDEF_SFX
+PSFCO2   = XUNDEF_SFX
+PSFU     = XUNDEF_SFX
+PSFV     = XUNDEF_SFX
+PDIR_ALB = XUNDEF_SFX
+PSCA_ALB = XUNDEF_SFX
+PEMIS    = XUNDEF_SFX
+PTSRAD   = XUNDEF_SFX
+!
+! Allocation of the local variables
+!
+ALLOCATE(ZZREF(SIZE(PSFTH,1),SIZE(PSFTH,2),NLEV_COUPLE))
+ALLOCATE(ZTA(SIZE(PSFTH,1),SIZE(PSFTH,2),NLEV_COUPLE))
+ALLOCATE(ZRVA(SIZE(PSFTH,1),SIZE(PSFTH,2),NLEV_COUPLE))
+ALLOCATE(ZQA(SIZE(PSFTH,1),SIZE(PSFTH,2),NLEV_COUPLE))
+ALLOCATE(ZPA(SIZE(PSFTH,1),SIZE(PSFTH,2),NLEV_COUPLE))
+ALLOCATE(ZEXNA(SIZE(PSFTH,1),SIZE(PSFTH,2),NLEV_COUPLE))
+ALLOCATE(ZTHA(SIZE(PSFTH,1),SIZE(PSFTH,2),NLEV_COUPLE))
+ALLOCATE(ZUA(SIZE(PSFTH,1),SIZE(PSFTH,2),NLEV_COUPLE))
+ALLOCATE(ZVA(SIZE(PSFTH,1),SIZE(PSFTH,2),NLEV_COUPLE))
+ALLOCATE(ZU(SIZE(PSFTH,1),SIZE(PSFTH,2),NLEV_COUPLE))
+ALLOCATE(ZV(SIZE(PSFTH,1),SIZE(PSFTH,2),NLEV_COUPLE))
+ALLOCATE(ZWIND(SIZE(PSFTH,1),SIZE(PSFTH,2),NLEV_COUPLE))
+ALLOCATE(ZRHOA(SIZE(PSFTH,1),SIZE(PSFTH,2),NLEV_COUPLE))
+IF(CTURB/='NONE') ALLOCATE(ZTKE(SIZE(PSFTH,1),SIZE(PSFTH,2),NLEV_COUPLE))
+ALLOCATE(ZDIR(SIZE(PSFTH,1),SIZE(PSFTH,2),NLEV_COUPLE))
+ALLOCATE(ZALFA(SIZE(PSFTH,1),SIZE(PSFTH,2),NLEV_COUPLE))
+ALLOCATE(ZU2D(SIZE(PSFTH,1),SIZE(PSFTH,2),NLEV_COUPLE))
+ALLOCATE(ZV2D(SIZE(PSFTH,1),SIZE(PSFTH,2),NLEV_COUPLE))
+!
+GSTATPROF_SURF = ( LPROFILER .AND. LDIAG_SURFRAD_PROF ) .OR. ( LSTATION .AND. LDIAG_SURFRAD_STAT )
+!
+!-------------------------------------------------------------------------------
+!
+!*       1.     CONVERSION OF THE ATMOSPHERIC VARIABLES
+!               --------------------------------------- 
+!
+!        1.1    water vapor
+!               -----------
+
+!
+ALLOCATE(ZRV(SIZE(PSFTH,1),SIZE(PSFTH,2),IKU))
+!
+IF(NRR>0) THEN
+  ZRV(:,:,:)=XRT(:,:,:,1)
+ELSE
+  ZRV(:,:,:)=0.
+END IF
+!
+!        1.2    Horizontal wind direction (rad from N clockwise)
+!               -------------------------
+!
+ZU2D(:,:,:)=MXF(XUT(:,:,IKB:(IKB+NLEV_COUPLE-1)))
+ZV2D(:,:,:)=MYF(XVT(:,:,IKB:(IKB+NLEV_COUPLE-1)))
+!
+!* angle between Y axis and wind (rad., clockwise)
+!
+ZALFA = 0.
+!
+DO ILEV=1,NLEV_COUPLE
+   !
+   WHERE(ZU2D(:,:,ILEV)/=0. .OR. ZV2D(:,:,ILEV)/=0.)
+      ZALFA(:,:,ILEV)=ATAN2(ZU2D(:,:,ILEV),ZV2D(:,:,ILEV))
+   END WHERE
+   !
+   WHERE(ZALFA(:,:,ILEV)<0.) ZALFA(:,:,ILEV) = ZALFA(:,:,ILEV) + 2. * XPI
+   !
+   !* angle between North and wind (rad., clockwise)
+   !
+   IF (.NOT. LCARTESIAN) THEN
+      ZDIR(:,:,ILEV) = ( (XRPK*(XLON(:,:)-XLON0)) - XBETA ) * XPI/180.  + ZALFA(:,:,ILEV)
+   ELSE
+      ZDIR(:,:,ILEV) = - XBETA   * XPI/180.  + ZALFA(:,:,ILEV)
+   ENDIF
+   !
+   !        1.3    Rotate the wind 
+   !               Only for the first forcing level, used for friction force direction.
+   !               ---------------
+   !
+   IF (ILEV.EQ.1) THEN
+      !
+      CALL ROTATE_WIND(D,XUT,XVT,XWT,         &
+           XDIRCOSXW, XDIRCOSYW, XDIRCOSZW,   &
+           XCOSSLOPE,XSINSLOPE,               &
+           XDXX,XDYY,XDZZ,                    &
+           ZUA(:,:,ILEV),ZVA(:,:,ILEV)        )
+      !
+   ELSE
+      !
+      ZUA(:,:,ILEV) = XUT(:,:,IKB+ILEV-1)
+      ZVA(:,:,ILEV) = XVT(:,:,IKB+ILEV-1)
+      !
+   ENDIF
+   !
+   !        1.4    zonal and meridian components of the wind parallel to the slope
+   !               ---------------------------------------------------------------
+   !
+   ZWIND(:,:,ILEV) = SQRT( ZUA(:,:,ILEV)**2 + ZVA(:,:,ILEV)**2 )
+   !
+   ZU(:,:,ILEV) = ZWIND(:,:,ILEV) * SIN(ZDIR(:,:,ILEV))
+   ZV(:,:,ILEV) = ZWIND(:,:,ILEV) * COS(ZDIR(:,:,ILEV))
+   !
+ENDDO
+   !
+   !        1.5   Horizontal interpolation of the thermodynamic fields
+   !              -------------------------------------------------
+   !
+   ! This horizontal interpolation is only made if the forcing is located at the first level
+   !
+IF (NLEV_COUPLE.EQ.1) THEN
+   !
+   CALL NORMAL_INTERPOL(XTHT,ZRV,XPABST,                    &
+        XDIRCOSXW, XDIRCOSYW, XDIRCOSZW,                    &
+        XCOSSLOPE,XSINSLOPE,                                &
+        XDXX,XDYY,XDZZ,                                     &
+        ZTHA(:,:,1),ZRVA(:,:,1),ZEXNA(:,:,1)                )
+   !
+ELSE
+   !
+   ZEXNA (:,:,1:NLEV_COUPLE) = (XPABST(:,:,IKB:(IKB+NLEV_COUPLE-1))/XP00) ** (XRD/XCPD)
+   ZTHA  (:,:,1:NLEV_COUPLE) = XTHT(:,:,IKB:(IKB+NLEV_COUPLE-1))
+   ZRVA  (:,:,1:NLEV_COUPLE) = ZRV (:,:,IKB:(IKB+NLEV_COUPLE-1))
+   !
+ENDIF
+!
+DEALLOCATE(ZRV)
+!
+!
+!        1.6    Pressure and Exner function
+!               ---------------------------
+!
+ZPA(:,:,:) = XP00 * ZEXNA(:,:,:) ** (XCPD/XRD)
+!
+ZEXNS(:,:) = 0.5 * ( (XPABST(:,:,IKB-1)/XP00)**(XRD/XCPD)  &
+                    +(XPABST(:,:,IKB  )/XP00)**(XRD/XCPD)  &
+                   )
+ZPS(:,:) = XP00 * ZEXNS(:,:) **(XCPD/XRD)
+!
+!        1.7    humidity in kg/m3 from the mixing ratio
+!               ---------------------------------------
+!
+ZQA(:,:,:) = ZRVA(:,:,:) * XRHODREF(:,:,IKB:(IKB+NLEV_COUPLE-1))
+!
+!        1.8    Temperature from the potential temperature
+!               ------------------------------------------
+!
+ZTA(:,:,:) = ZTHA(:,:,:) * ZEXNA(:,:,:)
+!
+!        1.9    Air density
+!               -----------
+!
+ZRHOA(:,:,:) = ZPA(:,:,:)/(XRD * ZTA(:,:,:) * &
+   ((1. + (XRD/XRV)*ZRVA(:,:,:)) / (1. + ZRVA(:,:,:))))
+!
+! Subgrid turbulent kinetic energy
+!
+IF(CTURB/='NONE') ZTKE(:,:,:) = XTKET(:,:,IKB:(IKB+NLEV_COUPLE-1))
+!
+!        1.10   Precipitations
+!               --------------
+!
+ZRAIN=0.
+ZSNOW=0.
+IF (NRR>2 .AND. SIZE(XINPRR)>0 ) THEN
+  IF (( CCLOUD(1:3) == 'ICE'                                          .AND. LSEDIC) .OR. &
+      ((CCLOUD == 'C2R2' .OR. CCLOUD == 'C3R5' .OR. CCLOUD == 'KHKO') .AND. LSEDC)  .OR. &
+      ( CCLOUD=='LIMA'                                                .AND. MSEDC))   THEN
+    ZRAIN = ZRAIN + XINPRR * XRHOLW + XINPRC * XRHOLW
+  ELSE
+    ZRAIN = ZRAIN + XINPRR * XRHOLW
+  END IF
+END IF
+IF (CDCONV == 'KAFR')  THEN
+  ZRAIN = ZRAIN + (XPRCONV - XPRSCONV)  * XRHOLW
+  ZSNOW = ZSNOW + XPRSCONV * XRHOLW
+END IF
+IF( NRR    >= 5    .AND. SIZE(XINPRS)>0 ) ZSNOW = ZSNOW + XINPRS * XRHOLW
+IF( NRR    >= 6    .AND. SIZE(XINPRG)>0 ) ZSNOW = ZSNOW + XINPRG * XRHOLW
+IF( NRR    >= 7    .AND. SIZE(XINPRH)>0 ) ZSNOW = ZSNOW + XINPRH * XRHOLW
+!
+!
+!        1.11   Solar time
+!               ----------
+!
+IF (.NOT. LCARTESIAN) THEN
+  ZTSUN(:,:) = MOD(TDTCUR%xtime -XTSIDER*3600. +XLON(:,:)*240., XDAY)
+ELSE
+  ZTSUN(:,:) = MOD(TDTCUR%xtime -XTSIDER*3600. +XLON0    *240., XDAY)
+END IF
+!
+!        1.12   Forcing level
+!               -------------
+!
+! A smooth transition between vertical height above ground and
+! distance to the surface is implemented here.
+! We assume that for katabatic winds located in the first meters above
+! ground, the distance to the surface is the most relevant whereas 
+! for most other processes it will be the vertical distance to the surface
+!
+DO ILEV=1,NLEV_COUPLE
+   !
+   ! Height above ground of w-levels
+   !
+   ZAGLW_ILEV   (:,:) = XZZ(:,:,JPVEXT+ILEV  ) - XZZ(:,:,1+JPVEXT)
+   ZAGLW_ILEVP1 (:,:) = XZZ(:,:,JPVEXT+ILEV+1) - XZZ(:,:,1+JPVEXT)
+   !
+   ! Height above ground of scalar variables and (u,v)
+   !
+   ZAGLSCAL_ILEV(:,:) = 0.5 * ( ZAGLW_ILEV(:,:) + ZAGLW_ILEVP1(:,:) )
+   !
+   ! Distance to the inclined surface and vertical distance
+   !
+   ZZREF_DIST(:,:) = ZAGLSCAL_ILEV(:,:) * XDIRCOSZW(:,:)
+   !
+   ZZREF_VERT(:,:) = ZAGLSCAL_ILEV(:,:)
+   !
+   ! Scaling between 5 m and 20 m height
+   !
+   ZWEIGHT_VERT(:,:) = MIN(1.0,MAX(ZZREF_VERT(:,:)-5.0,0.0)/15.0)
+   !
+   IF (MAXVAL(ZWEIGHT_VERT).GT.1.0) STOP ("Wrong weight")
+   IF (MINVAL(ZWEIGHT_VERT).LT.0.0) STOP ("Wrong weight")
+   !
+   ZZREF(:,:,ILEV) = ZWEIGHT_VERT(:,:) * ZZREF_VERT(:,:) + (1.0 - ZWEIGHT_VERT(:,:)) * ZZREF_DIST(:,:)
+   !
+ENDDO
+!
+!        1.13   CO2 concentration (kg/m3)
+!               -----------------
+!
+ZCO2(:,:) = XCCO2 * XRHODREF(:,:,IKB)
+!
+!
+!
+!        1.14   Blowing snow scheme (optional)
+!               -----------------
+!
+ZBLOWSNOW_2D=0.
+
+IF(LBLOWSNOW) THEN
+    KSV_SURF = NSV+NBLOWSNOW_2D ! When blowing snow scheme is used
+                  ! NBLOWSN0W_2D variables are sent to SURFEX through ZP_SV.
+                  ! They refer to the 2D fields advected by MNH including:
+                  !             - total number concentration in Canopy
+                  !             - total mass concentration in Canopy
+                  !             - equivalent concentration in the saltation layer
+    ! Initialize array of scalar to be sent to SURFEX including 2D blowing snow fields
+    ALLOCATE(YSV_SURF(KSV_SURF))
+    YSV_SURF(1:NSV)          = CSV(:)
+    YSV_SURF(NSV+1:KSV_SURF) = YPBLOWSNOW_2D(:)
+
+
+    DO JSV=1,NBLOWSNOW_2D 
+       ZBLOWSNOW_2D(:,:,JSV) = XRSNWCANOS(:,:,JSV)*XTSTEP/XRHODJ(:,:,IKB)
+    END DO
+
+ELSE
+    KSV_SURF = NSV
+    ALLOCATE(YSV_SURF(KSV_SURF))
+    YSV_SURF(:)     = CSV(1:NSV)
+ENDIF
+!
+!
+!-------------------------------------------------------------------------------
+!
+!*       2.     Call to surface monitor with 2D variables
+!               -----------------------------------------
+!
+!
+! initial values:
+!
+IDIM1       = IIE-IIB+1
+IDIM2       = IJE-IJB+1
+IDIM1D      = IDIM1*IDIM2
+!
+!
+! Transform 2D input fields into 1D:
+!
+CALL RESHAPE_SURF(IDIM1D)
+!
+! call to have the cumulated time since beginning of simulation
+!
+CALL DATETIME_DISTANCE(TDTSEG,TDTCUR,ZTIMEC)
+
+#ifdef CPLOASIS
+IF (LOASIS) THEN
+  IF ( MOD(ZTIMEC,1.0) .LE. 1E-2 .OR. (1.0 - MOD(ZTIMEC,1.0)) .LE. 1E-2 ) THEN
+    IF ( NINT(ZTIMEC-(XSEGLEN-DYN_MODEL(1)%XTSTEP)) .LT. 0 ) THEN
+      WRITE(ILUOUT,*) '----------------------------'
+      WRITE(ILUOUT,*) ' Reception des champs avec OASIS'
+      WRITE(ILUOUT,*) 'NINT(ZTIMEC)=', NINT(ZTIMEC)
+      CALL MNH_OASIS_RECV(CPROGRAM,IDIM1D,SIZE(XSW_BANDS),ZTIMEC+XTSTEP,XTSTEP,         &
+                        ZP_ZENITH,XSW_BANDS                                         ,         &
+                        ZP_TSRAD,ZP_DIR_ALB,ZP_SCA_ALB,ZP_EMIS,ZP_TSURF)
+      WRITE(ILUOUT,*) '----------------------------'
+    END IF
+  END IF
+END IF
+#endif
+!
+! Call to surface schemes
+!
+CALL COUPLING_SURF_ATM_MULTI_LEVEL_n(YSURF_CUR,'MESONH', 'E',ZTIMEC, XTSTEP,                   &
+               TDTCUR%nyear, TDTCUR%nmonth, TDTCUR%nday, TDTCUR%xtime,                         &
+               IDIM1D,KSV_SURF,SIZE(XSW_BANDS), NLEV_COUPLE, ZP_TSUN, ZP_ZENITH,ZP_ZENITH,     &
+               ZP_AZIM, ZP_ZREF, ZP_ZREF, ZP_ZS, ZP_U, ZP_V, ZP_QA, ZP_TA, ZP_RHOA, ZP_SV,     &
+               ZP_CO2, ZP_ZIMPWET, ZP_ZIMPDRY, YSV_SURF,                                       &
+               ZP_RAIN, ZP_SNOW, ZP_LW, ZP_DIR_SW, ZP_SCA_SW, XSW_BANDS,                       &
+               ZP_PS, ZP_PA, ZP_TKE, ZP_SFTQ, ZP_SFTQ_SURF, ZP_SFTQ_WALL, ZP_SFTQ_ROOF,        &
+               ZP_SFTH, ZP_SFTH_SURF, ZP_SFTH_WALL, ZP_SFTH_ROOF, ZP_CD_ROOF, ZP_SFTS,         &
+               ZP_SFCO2, ZP_SFU, ZP_SFV, ZP_TSRAD, ZP_DIR_ALB, ZP_SCA_ALB, ZP_EMIS, ZP_TSURF,  &
+               ZP_Z0, ZP_Z0H, ZP_QSURF, ZP_PEW_A_COEF, ZP_PEW_B_COEF, ZP_PET_A_COEF,           &
+               ZP_PEQ_A_COEF, ZP_PET_B_COEF, ZP_PEQ_B_COEF, ZP_ZWS, 'OK' )
+
+!
+#ifdef CPLOASIS
+IF (LOASIS) THEN
+  IF ( MOD(ZTIMEC,1.0) .LE. 1E-2 .OR. (1.0 - MOD(ZTIMEC,1.0)) .LE. 1E-2 ) THEN
+    IF (NINT(ZTIMEC-(XSEGLEN-DYN_MODEL(1)%XTSTEP)) .LT. 0) THEN
+      WRITE(ILUOUT,*) '----------------------------'
+      WRITE(ILUOUT,*) ' Envoi des champs avec OASIS'
+      WRITE(ILUOUT,*) 'NINT(ZTIMEC)=', NINT(ZTIMEC)
+      CALL MNH_OASIS_SEND(CPROGRAM,IDIM1D,ZTIMEC+XTSTEP,XTSTEP)
+      WRITE(ILUOUT,*) '----------------------------'
+    END IF
+  END IF
+END IF
+#endif
+!
+IF ( CPROGRAM == 'DIAG' .OR. GSTATPROF_SURF ) THEN
+  CALL DIAG_SURF_ATM_n( YSURF_CUR, 'MESONH' )
+  IF ( CPROGRAM == 'DIAG' ) THEN
+    CALL  MNHGET_SURF_PARAM_n(PZON10M=ZP_ZON10M, PMER10M=ZP_MER10M)
+  ELSE
+    CALL  MNHGET_SURF_PARAM_n( PRN=ZP_RN, PH=ZP_H, PLE=ZP_LE, PLEI=ZP_LEI, &
+                               PGFLUX=ZP_GFLUX, PT2M=ZP_T2M, PQ2M=ZP_Q2M, PHU2M=ZP_HU2M, &
+                               PZON10M=ZP_ZON10M, PMER10M=ZP_MER10M)
+  END IF
+END IF
+!
+! Transform 1D output fields into 2D:
+!
+CALL UNSHAPE_SURF(IDIM1,IDIM2)
+#ifdef MNH_FOREFIRE
+!------------------------!
+! COUPLING WITH FOREFIRE !
+!------------------------!
+
+IF ( LFOREFIRE ) THEN
+	CALL FOREFIRE_DUMP_FIELDS_n(XUT, XVT, XWT, XSVT&
+	           , XTHT, XRT(:,:,:,1), XPABST, XTKET&
+	           , IDIM1+2, IDIM2+2, NKMAX+2)
+END IF
+
+IF ( FFCOUPLING ) THEN
+
+	CALL SEND_GROUND_WIND_n(XUT, XVT, IKB, IINFO_ll)
+	
+	CALL FOREFIRE_RECEIVE_PARAL_n()
+   
+   CALL COUPLING_FOREFIRE_n(XTSTEP, ZSFTH, ZSFTQ, ZSFTS)
+	
+	CALL FOREFIRE_SEND_PARAL_n(IINFO_ll)
+   
+END IF
+
+FF_TIME = FF_TIME + XTSTEP
+#endif
+!
+! Friction of components along slope axes (U: largest local slope axis, V: zero slope axis)
+!
+PSFU(:,:) = 0.
+PSFV(:,:) = 0.
+!
+WHERE (ZSFU(:,:)/=XUNDEF_SFX .AND. ZWIND(:,:,1)>0.)
+  PSFU(:,:) = - SQRT(ZSFU**2+ZSFV**2) * ZUA(:,:,1) / ZWIND(:,:,1) / XRHODREF(:,:,IKB)
+  PSFV(:,:) = - SQRT(ZSFU**2+ZSFV**2) * ZVA(:,:,1) / ZWIND(:,:,1) / XRHODREF(:,:,IKB)
+END WHERE
+!
+PCD_ROOF(:,:) = ZCD_ROOF(:,:)
+!
+
+!*       2.1    Blaze Fire Model
+!               ----------------
+!
+IF (LBLAZE) THEN
+  ! get start time
+  CALL SECOND_MNH2( ZFIRETIME1 )
+
+  !*       2.1.1  Local variables allocation
+  !               --------------------------
+  !
+
+  ! Parallel fuel
+  NULLIFY(TZFIELDFIRE_ll)
+  IF (KTCOUNT <= 1) THEN
+    ! fuelmap
+    SELECT CASE (CPROPAG_MODEL)
+    CASE('SANTONI2011')
+      !
+      ALLOCATE( ZFIREFUELMAP(SIZE(XLSPHI,1), SIZE(XLSPHI,2), SIZE(XLSPHI,3), 22) );
+      ! Parallel fuel
+      CALL ADD4DFIELD_ll( TZFIELDFIRE_ll, ZFIREFUELMAP(:,:,:,1::22), 'MODEL_n::ZFIREFUELMAP' )
+      ! Default value
+      ZFIREFUELMAP(:,:,:,:) = 0.
+    END SELECT
+
+    !*       2.1.2  Read fuel map file
+    !               ------------------
+    !
+    ! Fuel map file name
+    YFUELMAPFILE = 'FuelMap'
+    !
+    CALL FIRE_READFUEL( TPFILE, ZFIREFUELMAP, XFMIGNITION, XFMWALKIG )
+
+    !*       2.1.3  Ignition LS function with ignition map
+    !               --------------------------------------
+    !
+    SELECT CASE (CFIRE_CPL_MODE)
+    CASE('2WAYCPL', 'ATM2FIR')
+      ! force ignition
+      WHERE (XFMIGNITION <= TDTCUR%XTIME ) XLSPHI = 1.
+      ! walking ignition
+      CALL FIRE_LS_RECONSTRUCTION_FROM_BMAP( XLSPHI, XFMWALKIG, 0.)
+      !
+      !*       2.1.4  Update BMAP
+      !               -----------
+      !
+      WHERE (XLSPHI >= .5 .AND. XBMAP < 0) XBMAP = TDTCUR%XTIME
+      !
+    CASE('FIR2ATM')
+      CALL FIRE_READBMAP(TPFILE,XBMAP)
+      
+    END SELECT
+    !
+    !*       2.1.5  Compute R0, A, Wf0, R00
+    !               -----------------------
+    !
+    SELECT CASE (CPROPAG_MODEL)
+    CASE('SANTONI2011')
+      CALL FIRE_NOWINDROS( ZFIREFUELMAP, XFMR0, XFMRFA, XFMWF0, XFMR00, XFMFUELTYPE, XFIRETAU, XFLUXPARAMH, &
+                           XFLUXPARAMW, XFMASE, XFMAWC )
+    END SELECT
+    !
+    !*       2.1.6  Compute orographic gradient
+    !               ---------------------------
+    CALL FIRE_GRAD_OROGRAPHY( XZS, XFMGRADOROX, XFMGRADOROY )
+    !
+    !*       2.1.7  Test halo size
+    !               --------------
+    IF (NHALO < 2 .AND. NFIRE_WENO_ORDER == 3) THEN
+      CALL PRINT_MSG( NVERB_FATAL, 'GEN', 'GROUND_PARAM_n', 'BLAZE-FIRE: WENO3 fire gradient calculation needs NHALO >= 2' )
+    ELSE IF (NHALO < 3 .AND. NFIRE_WENO_ORDER == 5) THEN
+      CALL PRINT_MSG( NVERB_FATAL, 'GEN', 'GROUND_PARAM_n', 'BLAZE-FIRE: WENO5 fire gradient calculation needs NHALO >= 3' )
+    END IF
+    !
+  END IF
+  !
+  !*       2.1.6  Compute grad of level set function phi
+  !               --------------------------------------
+  !
+  SELECT CASE (CFIRE_CPL_MODE)
+  CASE('2WAYCPL', 'ATM2FIR')
+    ! get time 1
+    CALL SECOND_MNH2( ZGRADTIME1 )
+    CALL FIRE_GRADPHI( XLSPHI, XGRADLSPHIX, XGRADLSPHIY )
+
+    ! get time 2
+    CALL SECOND_MNH2( ZGRADTIME2 )
+    XGRADPERF = XGRADPERF + ZGRADTIME2 - ZGRADTIME1
+    !
+    !*       2.1.7  Get horizontal wind speed projected on LS gradient direction
+    !               ------------------------------------------------------------
+    !
+    CALL FIRE_GETWIND( XUT, XVT, XWT, XGRADLSPHIX, XGRADLSPHIY, XFIREWIND, KTCOUNT, XTSTEP, XFMGRADOROX, XFMGRADOROY )
+    !
+    !*       2.1.8  Compute ROS XFIRERW with wind
+    !               -----------------------------
+    !
+    !
+    SELECT CASE (CPROPAG_MODEL)
+    CASE('SANTONI2011')
+      CALL FIRE_RATEOFSPREAD( XFMFUELTYPE, XFMR0, XFMRFA, XFMWF0, XFMR00, XFIREWIND, XGRADLSPHIX, XGRADLSPHIY, &
+                              XFMGRADOROX, XFMGRADOROY, XFIRERW )
+    END SELECT
+    CALL SECOND_MNH2( ZROSWINDTIME2 )
+    XROSWINDPERF = XROSWINDPERF + ZROSWINDTIME2 - ZGRADTIME2
+    !
+    !*       2.1.8  Integrate model on atm time step to propagate
+    !               ---------------------------------------------
+    !
+    SELECT CASE (CPROPAG_MODEL)
+    CASE('SANTONI2011')
+      CALL FIRE_PROPAGATE( XLSPHI, XBMAP, XFMIGNITION, XFMWALKIG, XGRADLSPHIX, XGRADLSPHIY, XTSTEP, XFIRERW )
+    END SELECT
+    CALL SECOND_MNH2( ZPROPAGTIME2 )
+    XPROPAGPERF = XPROPAGPERF + ZPROPAGTIME2 - ZROSWINDTIME2
+    !
+  CASE('FIR2ATM')
+    !
+    CALL SECOND_MNH2( ZPROPAGTIME1 )
+    CALL FIRE_LS_RECONSTRUCTION_FROM_BMAP( XLSPHI, XBMAP, XTSTEP )
+    CALL SECOND_MNH2( ZPROPAGTIME2 )
+    XPROPAGPERF = XPROPAGPERF + ZPROPAGTIME2 - ZPROPAGTIME1
+    XGRADPERF(:) = 0.
+    !
+  END SELECT
+  !
+  !*       2.1.8  Compute fluxes
+  !               --------------
+  !
+  IF (LBUDGET_RV) CALL BUDGET_STORE_INIT(TBUDGETS(NBUDGET_RV), 'BLAZE', XRRS(:,:,:,1))
+  IF (LBUDGET_TH) CALL BUDGET_STORE_INIT(TBUDGETS(NBUDGET_TH), 'BLAZE', XRTHS(:,:,:))
+  !
+  SELECT CASE (CFIRE_CPL_MODE)
+  CASE('2WAYCPL','FIR2ATM')
+    CALL SECOND_MNH2( ZFLUXTIME1 )
+    ! 2 way coupling
+    CALL FIRE_HEATFLUXES( XLSPHI, XBMAP, XFIRETAU, XTSTEP, XFLUXPARAMH, XFLUXPARAMW, XFMFLUXHDH, XFMFLUXHDW, XFMASE, XFMAWC )
+    !
+    ! vertical distribution of fire heat fluxes
+    CALL FIRE_VERTICALFLUXDISTRIB( XFMFLUXHDH, XFMFLUXHDW, XRTHS, XRRS, ZSFTS, XEXNREF, XRHODJ, XRT, XRHODREF )
+    !
+    CALL SECOND_MNH2( ZFLUXTIME2 )
+    XFLUXPERF = XFLUXPERF + ZFLUXTIME2 - ZFLUXTIME1
+  CASE DEFAULT
+    XFLUXPERF(:) = 0.
+  END SELECT
+  !
+  IF (LBUDGET_RV) CALL BUDGET_STORE_END(TBUDGETS(NBUDGET_RV), 'BLAZE', XRRS(:,:,:,1))
+  IF (LBUDGET_TH) CALL BUDGET_STORE_END(TBUDGETS(NBUDGET_TH), 'BLAZE', XRTHS(:,:,:))
+  !
+  ! get end time
+  CALL SECOND_MNH2( ZFIRETIME2 )
+  ! add to Blaze time
+  XFIREPERF = XFIREPERF + ZFIRETIME2 - ZFIRETIME1
+END IF
+!* conversion from H (W/m2) to w'Theta'
+!
+! Unit conversions:
+!
+!* H:  (W/m2) to w'Theta'
+!
+!* Water flux: (kg/m2/s) to w'rv'
+!
+IF (LFLUXBLDG) THEN
+   !
+   ! Robert: Here the wall and roof fluxes are substracted from the surface fluxes
+   !         since they will be applied in drag_bld.F90
+   !
+   PSFTH(:,:) = ( ZSFTH(:,:) - ZSFTH_WALL(:,:) - ZSFTH_ROOF(:,:) ) / XCPD / XRHODREF(:,:,IKB)
+   PSFRV(:,:) = ( ZSFTQ(:,:) - ZSFTQ_WALL(:,:) - ZSFTQ_ROOF(:,:) ) / XRHODREF(:,:,IKB)
+   !
+   ! Wall and roof fluxes are written on separate variables
+   !
+   PSFTH_WALL(:,:) = ZSFTH_WALL(:,:) / XCPD / XRHODREF(:,:,IKB)
+   PSFTH_ROOF(:,:) = ZSFTH_ROOF(:,:) / XCPD / XRHODREF(:,:,IKB)
+   !
+   PSFRV_WALL(:,:) = ZSFTQ_WALL(:,:) / XRHODREF(:,:,IKB)
+   PSFRV_ROOF(:,:) = ZSFTQ_ROOF(:,:) / XRHODREF(:,:,IKB)
+   !
+   ! Test conservation of fluxes
+   !
+   IF (MAXVAL(ABS(ZSFTH(:,:)/XCPD/XRHODREF(:,:,IKB) - PSFTH(:,:) - PSFTH_WALL(:,:)& 
+           - PSFTH_ROOF(:,:))).GT.1.0E-6) STOP ("Wrong H flux partition")
+   IF (MAXVAL(ABS(ZSFTQ(:,:)/XRHODREF(:,:,IKB)      - PSFRV(:,:) - PSFRV_WALL(:,:)&
+           - PSFRV_ROOF(:,:))).GT.1.0E-6) STOP ("Wrong Q flux partition")
+   !
+ELSE
+   !
+   ! Otherwise the full surface fluxes are taken
+   !
+   PSFTH(:,:) = ZSFTH(:,:) / XCPD / XRHODREF(:,:,IKB)
+   PSFRV(:,:) = ZSFTQ(:,:) / XRHODREF(:,:,IKB)
+   !
+   PSFTH_WALL(:,:) = 0.0
+   PSFTH_ROOF(:,:) = 0.0
+   !
+   PSFRV_WALL(:,:) = 0.0
+   PSFRV_ROOF(:,:) = 0.0
+   !
+ENDIF
+!
+!* conversion from scalar flux (kg/m2/s) to w'rsv'
+!
+IF(NSV .GT. 0) THEN
+   DO JSV=1,NSV
+     PSFSV(:,:,JSV) = ZSFTS(:,:,JSV) / XRHODREF(:,:,IKB)
+   END DO
+END IF
+!
+!* conversion from chemistry flux (molec/m2/s) to (ppv.m.s-1)
+!
+IF (LUSECHEM) THEN
+   DO JSV=NSV_CHEMBEG,NSV_CHEMEND
+      PSFSV(:,:,JSV) = ZSFTS(:,:,JSV) * XMD / ( XAVOGADRO * XRHODREF(:,:,IKB))
+      IF ((LCHEMDIAG).AND.(CPROGRAM == 'DIAG  ')) XCHFLX(:,:,JSV-NSV_CHEMBEG+1) = PSFSV(:,:,JSV)    
+   END DO
+ELSE
+  PSFSV(:,:,NSV_CHEMBEG:NSV_CHEMEND) = 0.
+END IF
+!
+!* conversion from dust flux (kg/m2/s) to (ppv.m.s-1)
+!
+IF (LDUST) THEN
+  DO JSV=NSV_DSTBEG,NSV_DSTEND
+     PSFSV(:,:,JSV) = ZSFTS(:,:,JSV) * XMD / (XMOLARWEIGHT_DUST * XRHODREF(:,:,IKB))
+  END DO
+ELSE
+  PSFSV(:,:,NSV_DSTBEG:NSV_DSTEND) = 0.
+END IF
+!
+!* conversion from sea salt flux (kg/m2/s) to (ppv.m.s-1)
+!
+IF (LSALT) THEN
+  DO JSV=NSV_SLTBEG,NSV_SLTEND
+     PSFSV(:,:,JSV) = ZSFTS(:,:,JSV) * XMD / (XMOLARWEIGHT_SALT * XRHODREF(:,:,IKB))
+  END DO
+ELSE
+  PSFSV(:,:,NSV_SLTBEG:NSV_SLTEND) = 0.
+END IF
+!
+!* conversion from aerosol flux (molec/m2/s) to (ppv.m.s-1)
+!
+IF (LORILAM) THEN
+  DO JSV=NSV_AERBEG,NSV_AEREND
+    PSFSV(:,:,JSV) = ZSFTS(:,:,JSV) * XMD / ( XAVOGADRO * XRHODREF(:,:,IKB))
+  END DO
+ELSE
+  PSFSV(:,:,NSV_AERBEG:NSV_AEREND) = 0.
+END IF
+!
+!* conversion from blowing snow flux (kg/m2/s) to [kg(snow)/kg(dry air).m.s-1]
+!
+IF (LBLOWSNOW) THEN
+  DO JSV=NSV_SNWBEG,NSV_SNWEND
+     PSFSV(:,:,JSV) = ZSFTS(:,:,JSV)/ (ZRHOA(:,:,1))
+  END DO
+  !* Update tendency for blowing snow 2D fields
+  DO JSV=1,(NBLOWSNOW_2D)
+     XRSNWCANOS(:,:,JSV) = ZBLOWSNOW_2D(:,:,JSV)*XRHODJ(:,:,IKB)/(XTSTEP*ZRHOA(:,:,1))
+  END DO
+
+ELSE
+  PSFSV(:,:,NSV_SNWBEG:NSV_SNWEND) = 0.
+END IF
+!
+!* conversion from CO2 flux (kg/m2/s) to w'CO2'
+!
+PSFCO2(:,:) = ZSFCO2(:,:) / XRHODREF(:,:,IKB)
+!
+!  Communicate halo values
+!
+NULLIFY(TZFIELDSURF_ll)
+!The commented communications are done in PHYS_PARAM_n
+! CALL ADD2DFIELD_ll( TZFIELDSURF_ll,PSFTH,  'GROUND_PARAM_n::PSFTH'  )
+! CALL ADD2DFIELD_ll( TZFIELDSURF_ll,PSFRV,  'GROUND_PARAM_n::PSFRV'  )
+! DO JSV = 1, NSV
+!   WRITE( YJSV, '( I6.6 )' ) JSV
+!   CALL ADD2DFIELD_ll( TZFIELDSURF_ll,PSFSV(:,:,JSV), 'GROUND_PARAM_n::PSFSV'//YJSV )
+! END DO
+! CALL ADD2DFIELD_ll( TZFIELDSURF_ll,PSFCO2, 'GROUND_PARAM_n::PSFCO2' )
+! CALL ADD2DFIELD_ll( TZFIELDSURF_ll,PSFU,   'GROUND_PARAM_n::PSFU'   )
+! CALL ADD2DFIELD_ll( TZFIELDSURF_ll,PSFV,   'GROUND_PARAM_n::PSFV'   )
+DO JLAYER = 1, SIZE( PDIR_ALB, 3 )
+  WRITE( YJSV, '( I6.6 )' ) JLAYER
+  CALL ADD2DFIELD_ll( TZFIELDSURF_ll,PDIR_ALB(:,:,JLAYER), 'GROUND_PARAM_n::PDIR_ALB'//YJSV )
+  CALL ADD2DFIELD_ll( TZFIELDSURF_ll,PSCA_ALB(:,:,JLAYER), 'GROUND_PARAM_n::PSCA_ALB'//YJSV )
+END DO
+DO JLAYER = 1, SIZE( PEMIS, 3 )
+  WRITE( YJSV, '( I6.6 )' ) JLAYER
+  CALL ADD2DFIELD_ll( TZFIELDSURF_ll,PEMIS(:,:,JLAYER), 'GROUND_PARAM_n::PEMIS'//YJSV )
+END DO
+CALL ADD2DFIELD_ll( TZFIELDSURF_ll,PTSRAD, 'GROUND_PARAM_n::PTSRAD'  )
+
+CALL UPDATE_HALO_ll(TZFIELDSURF_ll,IINFO_ll)
+CALL CLEANLIST_ll(TZFIELDSURF_ll)
+!
+!*  Diagnostics
+!   -----------
+!
+!
+IF ( CPROGRAM == 'DIAG' .OR. GSTATPROF_SURF ) THEN
+  XCURRENT_SFCO2(:,:) = ZSFCO2(:,:)
+  IF ( CRAD /= 'NONE' ) THEN
+    XCURRENT_LWD  (:,:) = XFLALWD(:,:)
+    XCURRENT_SWD  (:,:) = SUM( XDIRSRFSWD(:,:,:) + XSCAFLASWD(:,:,:), DIM=3 )
+    XCURRENT_LWU  (:,:) = XLWU(:,:,IKB)
+    XCURRENT_SWU  (:,:) = XSWU(:,:,IKB)
+    IF ( GSTATPROF_SURF .AND. CPROGRAM /= 'DIAG' ) THEN
+      XCURRENT_SWDIR(:,:)  = SUM( XDIRSRFSWD(:,:,:), DIM=3 )
+      XCURRENT_SWDIFF(:,:) = SUM( XSCAFLASWD(:,:,:), DIM=3 )
+      XCURRENT_DSTAOD(:,:) = 0.0
+      XCURRENT_SLTAOD(:,:) = 0.0
+      DO JK=IKB,IKE
+        IKRAD = JK - 1
+        DO JJ = IJB, IJE
+          DO JI = IIB, IIE
+            XCURRENT_DSTAOD(JI,JJ) = XCURRENT_DSTAOD(JI,JJ) + XAER(JI,JJ,IKRAD,3)
+            XCURRENT_SLTAOD(JI,JJ) = XCURRENT_SLTAOD(JI,JJ) + XAER(JI,JJ,IKRAD,2)
+          END DO
+        END DO
+      END DO
+    END IF
+  END IF
+  NULLIFY(TZFIELDSURF_ll)
+
+  CALL ADD2DFIELD_ll( TZFIELDSURF_ll,XCURRENT_SFCO2,      'GROUND_PARAM_n::XCURRENT_SFCO2'  )
+  IF ( CRAD /= 'NONE' ) THEN
+    CALL ADD2DFIELD_ll( TZFIELDSURF_ll,XCURRENT_LWD,      'GROUND_PARAM_n::XCURRENT_LWD'    )
+    CALL ADD2DFIELD_ll( TZFIELDSURF_ll,XCURRENT_SWD,      'GROUND_PARAM_n::XCURRENT_SWD'    )
+    CALL ADD2DFIELD_ll( TZFIELDSURF_ll,XCURRENT_LWU,      'GROUND_PARAM_n::XCURRENT_LWU'    )
+    CALL ADD2DFIELD_ll( TZFIELDSURF_ll,XCURRENT_SWU,      'GROUND_PARAM_n::XCURRENT_SWU'    )
+    IF ( GSTATPROF_SURF .AND. CPROGRAM /= 'DIAG' ) THEN
+      CALL ADD2DFIELD_ll( TZFIELDSURF_ll,XCURRENT_SWDIR,  'GROUND_PARAM_n::XCURRENT_SWDIR'  )
+      CALL ADD2DFIELD_ll( TZFIELDSURF_ll,XCURRENT_SWDIFF, 'GROUND_PARAM_n::XCURRENT_SWDIFF' )
+      CALL ADD2DFIELD_ll( TZFIELDSURF_ll,XCURRENT_DSTAOD, 'GROUND_PARAM_n::XCURRENT_DSTAOD' )
+      CALL ADD2DFIELD_ll( TZFIELDSURF_ll,XCURRENT_SLTAOD, 'GROUND_PARAM_n::XCURRENT_SLTAOD' )
+    END IF
+  END IF
+  CALL ADD2DFIELD_ll( TZFIELDSURF_ll,XCURRENT_ZON10M,     'GROUND_PARAM_n::XCURRENT_ZON10M' )
+  CALL ADD2DFIELD_ll( TZFIELDSURF_ll,XCURRENT_MER10M,     'GROUND_PARAM_n::XCURRENT_MER10M' )
+  IF ( GSTATPROF_SURF .AND. CPROGRAM /= 'DIAG' ) THEN
+    CALL ADD2DFIELD_ll( TZFIELDSURF_ll,XCURRENT_RN,       'GROUND_PARAM_n::XCURRENT_RN'     )
+    CALL ADD2DFIELD_ll( TZFIELDSURF_ll,XCURRENT_H,        'GROUND_PARAM_n::XCURRENT_H'      )
+    CALL ADD2DFIELD_ll( TZFIELDSURF_ll,XCURRENT_LE,       'GROUND_PARAM_n::XCURRENT_LE'     )
+    CALL ADD2DFIELD_ll( TZFIELDSURF_ll,XCURRENT_LEI,      'GROUND_PARAM_n::XCURRENT_LEI'    )
+    CALL ADD2DFIELD_ll( TZFIELDSURF_ll,XCURRENT_GFLUX,    'GROUND_PARAM_n::XCURRENT_GFLUX'  )
+    CALL ADD2DFIELD_ll( TZFIELDSURF_ll,XCURRENT_T2M,      'GROUND_PARAM_n::XCURRENT_T2M'    )
+    CALL ADD2DFIELD_ll( TZFIELDSURF_ll,XCURRENT_Q2M,      'GROUND_PARAM_n::XCURRENT_Q2M'    )
+    CALL ADD2DFIELD_ll( TZFIELDSURF_ll,XCURRENT_HU2M,     'GROUND_PARAM_n::XCURRENT_HU2M'   )
+  END IF
+  ! CALL ADD2DFIELD_ll( TZFIELDSURF_ll,XCURRENT_ZWS,      'GROUND_PARAM_n::XCURRENT_ZWS'    )
+
+  CALL UPDATE_HALO_ll(TZFIELDSURF_ll,IINFO_ll)
+  CALL CLEANLIST_ll(TZFIELDSURF_ll)
+  !
+END IF
+!
+IF (LBLAZE) THEN
+  IF (KTCOUNT <= 1) THEN
+      DEALLOCATE(ZFIREFUELMAP)
+  END IF
+  CALL CLEANLIST_ll(TZFIELDFIRE_ll)
+END IF
+!==================================================================================
+!
+CONTAINS
+!
+!==================================================================================
+!
+SUBROUTINE RESHAPE_SURF(KDIM1D)
+!
+INTEGER, INTENT(IN)   :: KDIM1D
+INTEGER, DIMENSION(1) :: ISHAPE_1
+!
+ISHAPE_1 = (/KDIM1D/)
+!
+! Variables that are coupled at multiple levels
+!
+ALLOCATE(ZP_ZREF (KDIM1D,NLEV_COUPLE))
+ALLOCATE(ZP_U    (KDIM1D,NLEV_COUPLE))
+ALLOCATE(ZP_V    (KDIM1D,NLEV_COUPLE))
+ALLOCATE(ZP_QA   (KDIM1D,NLEV_COUPLE))
+ALLOCATE(ZP_TA   (KDIM1D,NLEV_COUPLE))
+ALLOCATE(ZP_PA   (KDIM1D,NLEV_COUPLE))
+ALLOCATE(ZP_RHOA (KDIM1D,NLEV_COUPLE))
+ALLOCATE(ZP_TKE  (KDIM1D,NLEV_COUPLE))
+!
+! 2D Variables and variables that are coupled at the surface only
+!
+ALLOCATE(ZP_TSUN    (KDIM1D))
+ALLOCATE(ZP_ZENITH  (KDIM1D))
+ALLOCATE(ZP_AZIM    (KDIM1D))
+ALLOCATE(ZP_ZS      (KDIM1D))
+ALLOCATE(ZP_SV      (KDIM1D,KSV_SURF))
+ALLOCATE(ZP_CO2     (KDIM1D))
+ALLOCATE(ZP_RAIN    (KDIM1D))
+ALLOCATE(ZP_SNOW    (KDIM1D))
+ALLOCATE(ZP_LW      (KDIM1D))
+ALLOCATE(ZP_DIR_SW  (KDIM1D,SIZE(XDIRSRFSWD,3)))
+ALLOCATE(ZP_SCA_SW  (KDIM1D,SIZE(XSCAFLASWD,3)))
+ALLOCATE(ZP_PS      (KDIM1D))
+ALLOCATE(ZP_ZWS     (KDIM1D))
+!
+! 2D SURFEX output fields
+!
+ALLOCATE(ZP_SFTQ      (KDIM1D))
+ALLOCATE(ZP_SFTQ_SURF (KDIM1D))
+ALLOCATE(ZP_SFTQ_WALL (KDIM1D))
+ALLOCATE(ZP_SFTQ_ROOF (KDIM1D))
+ALLOCATE(ZP_SFTH      (KDIM1D))
+ALLOCATE(ZP_SFTH_SURF (KDIM1D))
+ALLOCATE(ZP_SFTH_WALL (KDIM1D))
+ALLOCATE(ZP_SFTH_ROOF (KDIM1D))
+ALLOCATE(ZP_CD_ROOF   (KDIM1D))
+ALLOCATE(ZP_SFU     (KDIM1D))
+ALLOCATE(ZP_SFV     (KDIM1D))
+ALLOCATE(ZP_SFTS    (KDIM1D,KSV_SURF))
+ALLOCATE(ZP_SFCO2   (KDIM1D))
+ALLOCATE(ZP_TSRAD   (KDIM1D))
+ALLOCATE(ZP_DIR_ALB (KDIM1D,SIZE(PDIR_ALB,3)))
+ALLOCATE(ZP_SCA_ALB (KDIM1D,SIZE(PSCA_ALB,3)))
+ALLOCATE(ZP_EMIS    (KDIM1D))
+ALLOCATE(ZP_TSURF   (KDIM1D))
+ALLOCATE(ZP_Z0      (KDIM1D))
+ALLOCATE(ZP_Z0H     (KDIM1D))
+ALLOCATE(ZP_QSURF   (KDIM1D))
+IF ( GSTATPROF_SURF ) THEN
+  ALLOCATE(ZP_RN      (KDIM1D))
+  ALLOCATE(ZP_H       (KDIM1D))
+  ALLOCATE(ZP_LE      (KDIM1D))
+  ALLOCATE(ZP_LEI     (KDIM1D))
+  ALLOCATE(ZP_GFLUX   (KDIM1D))
+  ALLOCATE(ZP_T2M     (KDIM1D))
+  ALLOCATE(ZP_Q2M     (KDIM1D))
+  ALLOCATE(ZP_HU2M    (KDIM1D))
+END IF
+IF ( CPROGRAM == 'DIAG' .OR. GSTATPROF_SURF ) THEN
+  ALLOCATE(ZP_ZON10M  (KDIM1D))
+  ALLOCATE(ZP_MER10M  (KDIM1D))
+END IF
+!
+!* explicit coupling only
+ALLOCATE(ZP_PEW_A_COEF  (KDIM1D))
+ALLOCATE(ZP_PEW_B_COEF  (KDIM1D))
+ALLOCATE(ZP_PET_A_COEF  (KDIM1D))
+ALLOCATE(ZP_PEQ_A_COEF  (KDIM1D))
+ALLOCATE(ZP_PET_B_COEF  (KDIM1D))
+ALLOCATE(ZP_PEQ_B_COEF  (KDIM1D))
+!
+! 2D variables or surface only
+!
+ZP_TSUN(:) = RESHAPE(ZTSUN(IIB:IIE,IJB:IJE), ISHAPE_1)
+ZP_PS(:)   = RESHAPE(ZPS(IIB:IIE,IJB:IJE),   ISHAPE_1)
+ZP_ZS(:)   = RESHAPE(XZS(IIB:IIE,IJB:IJE),   ISHAPE_1)
+ZP_CO2(:)  = RESHAPE(ZCO2(IIB:IIE,IJB:IJE),  ISHAPE_1)
+ZP_SNOW(:) = RESHAPE(ZSNOW(IIB:IIE,IJB:IJE), ISHAPE_1)
+ZP_RAIN(:) = RESHAPE(ZRAIN(IIB:IIE,IJB:IJE), ISHAPE_1)
+ZP_ZWS(:)  = RESHAPE(XZWS(IIB:IIE,IJB:IJE),  ISHAPE_1)
+!
+! Variables that are coupled on multiple levels
+!
+DO JLAYER=1,NLEV_COUPLE
+   ZP_ZREF(:,JLAYER) = RESHAPE(ZZREF(IIB:IIE,IJB:IJE,JLAYER), ISHAPE_1)
+   ZP_PA(:,JLAYER)   = RESHAPE(ZPA(IIB:IIE,IJB:IJE,JLAYER),   ISHAPE_1)
+   ZP_TA(:,JLAYER)   = RESHAPE(ZTA(IIB:IIE,IJB:IJE,JLAYER),   ISHAPE_1)
+   ZP_QA(:,JLAYER)   = RESHAPE(ZQA(IIB:IIE,IJB:IJE,JLAYER),   ISHAPE_1)
+   ZP_RHOA(:,JLAYER) = RESHAPE(ZRHOA(IIB:IIE,IJB:IJE,JLAYER), ISHAPE_1)
+   IF(CTURB/='NONE') ZP_TKE(:,JLAYER)  = RESHAPE(ZTKE(IIB:IIE,IJB:IJE,JLAYER),  ISHAPE_1)
+   ZP_U(:,JLAYER)    = RESHAPE(ZU(IIB:IIE,IJB:IJE,JLAYER),    ISHAPE_1)
+   ZP_V(:,JLAYER)    = RESHAPE(ZV(IIB:IIE,IJB:IJE,JLAYER),    ISHAPE_1)
+END DO
+!
+DO JLAYER=1,NSV
+  ZP_SV(:,JLAYER) = RESHAPE(XSVT(IIB:IIE,IJB:IJE,IKB,JLAYER), ISHAPE_1)
+END DO
+!
+IF(LBLOWSNOW) THEN
+  DO JLAYER=1,NBLOWSNOW_2D
+      ZP_SV(:,NSV+JLAYER) = RESHAPE(ZBLOWSNOW_2D(IIB:IIE,IJB:IJE,JLAYER), ISHAPE_1)
+  END DO
+END IF
+!
+!chemical conversion : from part/part to molec./m3
+DO JLAYER=NSV_CHEMBEG,NSV_CHEMEND
+  ZP_SV(:,JLAYER) = ZP_SV(:,JLAYER) * XAVOGADRO * ZP_RHOA(:,1) / XMD
+END DO
+DO JLAYER=NSV_AERBEG,NSV_AEREND
+  ZP_SV(:,JLAYER) = ZP_SV(:,JLAYER) * XAVOGADRO * ZP_RHOA(:,1) / XMD
+END DO
+!dust  conversion : from part/part to kg/m3
+DO JLAYER=NSV_DSTBEG,NSV_DSTEND
+ ZP_SV(:,JLAYER) = ZP_SV(:,JLAYER) *  XMOLARWEIGHT_DUST* ZP_RHOA(:,1) / XMD
+END DO
+!sea salt  conversion : from part/part to kg/m3
+DO JLAYER=NSV_SLTBEG,NSV_SLTEND
+ ZP_SV(:,JLAYER) = ZP_SV(:,JLAYER) *  XMOLARWEIGHT_SALT* ZP_RHOA(:,1) / XMD
+END DO
+!
+!blowing snow conversion : from kg(snow)/kg(dry air) to kg(snow)/m3
+DO JLAYER=NSV_SNWBEG,NSV_SNWEND
+ ZP_SV(:,JLAYER) = ZP_SV(:,JLAYER) * ZP_RHOA(:,1)
+END DO
+
+IF(LBLOWSNOW) THEN ! Convert 2D blowing snow fields
+                    ! from kg(snow)/kg(dry air) to kg(snow)/m3
+  DO JLAYER=(NSV+1),KSV_SURF
+     ZP_SV(:,JLAYER) = ZP_SV(:,JLAYER) * ZP_RHOA(:,1)
+  END DO
+END IF
+!
+ZP_ZENITH(:)      = RESHAPE(XZENITH(IIB:IIE,IJB:IJE),      ISHAPE_1)
+ZP_AZIM  (:)      = RESHAPE(XAZIM  (IIB:IIE,IJB:IJE),      ISHAPE_1)
+ZP_LW(:)          = RESHAPE(XFLALWD(IIB:IIE,IJB:IJE),      ISHAPE_1)
+DO JLAYER=1,SIZE(XDIRSRFSWD,3)
+  ZP_DIR_SW(:,JLAYER)  = RESHAPE(XDIRSRFSWD(IIB:IIE,IJB:IJE,JLAYER),  ISHAPE_1)
+  ZP_SCA_SW(:,JLAYER)  = RESHAPE(XSCAFLASWD(IIB:IIE,IJB:IJE,JLAYER),  ISHAPE_1)
+END DO
+!
+ZP_PEW_A_COEF = 0.
+ZP_PEW_B_COEF = 0.
+ZP_PET_A_COEF = 0.
+ZP_PEQ_A_COEF = 0.
+ZP_PET_B_COEF = 0.
+ZP_PEQ_B_COEF = 0.
+!
+END SUBROUTINE RESHAPE_SURF
+!================================================i=================================
+SUBROUTINE UNSHAPE_SURF(KDIM1,KDIM2)
+!
+INTEGER, INTENT(IN)   :: KDIM1, KDIM2
+INTEGER, DIMENSION(2) :: ISHAPE_2
+!
+ISHAPE_2 = (/KDIM1,KDIM2/)
+!
+! Arguments in call to surface:
+!
+ZSFTH      = XUNDEF_SFX
+ZSFTH_SURF = XUNDEF_SFX
+ZSFTH_WALL = XUNDEF_SFX
+ZSFTH_ROOF = XUNDEF_SFX
+ZCD_ROOF   = XUNDEF_SFX
+ZSFTQ      = XUNDEF_SFX
+ZSFTQ_SURF = XUNDEF_SFX
+ZSFTQ_WALL = XUNDEF_SFX
+ZSFTQ_ROOF = XUNDEF_SFX
+!
+IF (NSV>0) ZSFTS = XUNDEF_SFX
+ZSFCO2 = XUNDEF_SFX
+ZSFU = XUNDEF_SFX
+ZSFV = XUNDEF_SFX
+!
+ZSFTH      (IIB:IIE,IJB:IJE) = RESHAPE(ZP_SFTH(:),      ISHAPE_2)
+ZSFTH_SURF (IIB:IIE,IJB:IJE) = RESHAPE(ZP_SFTH_SURF(:), ISHAPE_2)
+ZSFTH_WALL (IIB:IIE,IJB:IJE) = RESHAPE(ZP_SFTH_WALL(:), ISHAPE_2)
+ZSFTH_ROOF (IIB:IIE,IJB:IJE) = RESHAPE(ZP_SFTH_ROOF(:), ISHAPE_2)
+ZCD_ROOF   (IIB:IIE,IJB:IJE) = RESHAPE(ZP_CD_ROOF(:),   ISHAPE_2)
+ZSFTQ      (IIB:IIE,IJB:IJE) = RESHAPE(ZP_SFTQ(:),      ISHAPE_2)
+ZSFTQ_SURF (IIB:IIE,IJB:IJE) = RESHAPE(ZP_SFTQ_SURF(:), ISHAPE_2)
+ZSFTQ_WALL (IIB:IIE,IJB:IJE) = RESHAPE(ZP_SFTQ_WALL(:), ISHAPE_2)
+ZSFTQ_ROOF (IIB:IIE,IJB:IJE) = RESHAPE(ZP_SFTQ_ROOF(:), ISHAPE_2)
+!
+DO JLAYER=1,SIZE(PSFSV,3)
+  ZSFTS   (IIB:IIE,IJB:IJE,JLAYER) = RESHAPE(ZP_SFTS(:,JLAYER),  ISHAPE_2)
+END DO
+!
+ZSFCO2  (IIB:IIE,IJB:IJE)       = RESHAPE(ZP_SFCO2(:),    ISHAPE_2)
+ZSFU    (IIB:IIE,IJB:IJE)       = RESHAPE(ZP_SFU(:),      ISHAPE_2)
+ZSFV    (IIB:IIE,IJB:IJE)       = RESHAPE(ZP_SFV(:),      ISHAPE_2)
+DO JLAYER=1,SIZE(PEMIS,3)
+    PEMIS   (IIB:IIE,IJB:IJE,JLAYER)     = RESHAPE(ZP_EMIS(:),     ISHAPE_2)
+END DO
+PTSRAD  (IIB:IIE,IJB:IJE)       = RESHAPE(ZP_TSRAD(:),    ISHAPE_2)
+IF(LBLOWSNOW) THEN
+  DO JLAYER=1,NBLOWSNOW_2D
+    ZBLOWSNOW_2D(IIB:IIE,IJB:IJE,JLAYER)  =  RESHAPE(ZP_SFTS(:,NSV+JLAYER),  ISHAPE_2)
+  END DO
+END IF
+!
+IF ( GSTATPROF_SURF .AND. CPROGRAM /= 'DIAG' ) THEN
+  XCURRENT_RN      (IIB:IIE,IJB:IJE)  = RESHAPE(ZP_RN(:),     ISHAPE_2)
+  XCURRENT_H       (IIB:IIE,IJB:IJE)  = RESHAPE(ZP_H (:),     ISHAPE_2)
+  XCURRENT_LE      (IIB:IIE,IJB:IJE)  = RESHAPE(ZP_LE(:),     ISHAPE_2)
+  XCURRENT_LEI     (IIB:IIE,IJB:IJE)  = RESHAPE(ZP_LEI(:),    ISHAPE_2)
+  XCURRENT_GFLUX   (IIB:IIE,IJB:IJE)  = RESHAPE(ZP_GFLUX(:),  ISHAPE_2)
+  XCURRENT_T2M     (IIB:IIE,IJB:IJE)  = RESHAPE(ZP_T2M(:),    ISHAPE_2)
+  XCURRENT_Q2M     (IIB:IIE,IJB:IJE)  = RESHAPE(ZP_Q2M(:),    ISHAPE_2)
+  XCURRENT_HU2M    (IIB:IIE,IJB:IJE)  = RESHAPE(ZP_HU2M(:),   ISHAPE_2)
+END IF
+IF ( GSTATPROF_SURF .OR. CPROGRAM == 'DIAG' ) THEN
+  XCURRENT_ZON10M  (IIB:IIE,IJB:IJE)  = RESHAPE(ZP_ZON10M(:), ISHAPE_2)
+  XCURRENT_MER10M  (IIB:IIE,IJB:IJE)  = RESHAPE(ZP_MER10M(:), ISHAPE_2)
+  ! XCURRENT_ZWS     (IIB:IIE,IJB:IJE)  = RESHAPE(ZP_ZWS(:),    ISHAPE_2)
+END IF
+!
+DO JLAYER=1,SIZE(PDIR_ALB,3)
+  PDIR_ALB(IIB:IIE,IJB:IJE,JLAYER) = RESHAPE(ZP_DIR_ALB(:,JLAYER), ISHAPE_2)
+  PSCA_ALB(IIB:IIE,IJB:IJE,JLAYER) = RESHAPE(ZP_SCA_ALB(:,JLAYER), ISHAPE_2)
+END DO
+!
+DEALLOCATE(ZP_TSUN    )
+DEALLOCATE(ZP_ZENITH  )
+DEALLOCATE(ZP_AZIM    )
+DEALLOCATE(ZP_ZREF    )
+DEALLOCATE(ZP_ZS      )
+DEALLOCATE(ZP_U       )
+DEALLOCATE(ZP_V       )
+DEALLOCATE(ZP_QA      )
+DEALLOCATE(ZP_TA      )
+DEALLOCATE(ZP_RHOA    )
+DEALLOCATE(ZP_TKE     )
+DEALLOCATE(ZP_SV      )
+DEALLOCATE(ZP_CO2     )
+DEALLOCATE(ZP_RAIN    )
+DEALLOCATE(ZP_SNOW    )
+DEALLOCATE(ZP_LW      )
+DEALLOCATE(ZP_DIR_SW  )
+DEALLOCATE(ZP_SCA_SW  )
+DEALLOCATE(ZP_PS      )
+DEALLOCATE(ZP_PA      )
+DEALLOCATE(ZP_ZWS     )
+!
+DEALLOCATE(ZP_SFTQ     )
+DEALLOCATE(ZP_SFTQ_SURF)
+DEALLOCATE(ZP_SFTQ_WALL)
+DEALLOCATE(ZP_SFTQ_ROOF)
+DEALLOCATE(ZP_SFTH     )
+DEALLOCATE(ZP_SFTH_SURF)
+DEALLOCATE(ZP_SFTH_WALL)
+DEALLOCATE(ZP_SFTH_ROOF)
+DEALLOCATE(ZP_CD_ROOF)
+DEALLOCATE(ZP_SFTS    )
+DEALLOCATE(ZP_SFCO2   )
+DEALLOCATE(ZP_SFU     )
+DEALLOCATE(ZP_SFV     )
+DEALLOCATE(ZP_TSRAD   )
+DEALLOCATE(ZP_DIR_ALB )
+DEALLOCATE(ZP_SCA_ALB )
+DEALLOCATE(ZP_EMIS    )
+IF ( GSTATPROF_SURF ) THEN
+  DEALLOCATE(ZP_RN      )
+  DEALLOCATE(ZP_H       )
+  DEALLOCATE(ZP_LE      )
+  DEALLOCATE(ZP_LEI     )
+  DEALLOCATE(ZP_GFLUX   )
+  DEALLOCATE(ZP_T2M     )
+  DEALLOCATE(ZP_Q2M     )
+  DEALLOCATE(ZP_HU2M    )
+END IF
+IF ( CPROGRAM == 'DIAG' .OR. GSTATPROF_SURF ) THEN
+  DEALLOCATE(ZP_ZON10M  )
+  DEALLOCATE(ZP_MER10M  )
+END IF
+
+DEALLOCATE(ZP_PEW_A_COEF  )
+DEALLOCATE(ZP_PEW_B_COEF  )
+DEALLOCATE(ZP_PET_A_COEF  )
+DEALLOCATE(ZP_PEQ_A_COEF  )
+DEALLOCATE(ZP_PET_B_COEF  )
+DEALLOCATE(ZP_PEQ_B_COEF  )
+!
+END SUBROUTINE UNSHAPE_SURF
+!==================================================================================
+!
+END SUBROUTINE GROUND_PARAM_n
diff --git a/src/PHYEX/ext/ibm_affectv.f90 b/src/PHYEX/ext/ibm_affectv.f90
new file mode 100644
index 0000000000000000000000000000000000000000..fee54c3e094d852b8eba6a7df25ce569c094b4f3
--- /dev/null
+++ b/src/PHYEX/ext/ibm_affectv.f90
@@ -0,0 +1,402 @@
+!MNH_LIC Copyright 2019-2022 CNRS, Meteo-France and Universite Paul Sabatier
+!MNH_LIC This is part of the Meso-NH software governed by the CeCILL-C licence
+!MNH_LIC version 1. See LICENSE, CeCILL-C_V1-en.txt and CeCILL-C_V1-fr.txt
+!MNH_LIC for details. version 1.
+!-----------------------------------------------------------------
+!
+!    #######################
+MODULE MODI_IBM_AFFECTV  
+  !    ####################### 
+  !
+  INTERFACE
+     !
+     SUBROUTINE IBM_AFFECTV(PVAR,PVAR2,PVAR3,HVAR,KIBM_LAYER,HIBM_MODE_INTE3,&
+          HIBM_FORC_BOUNR,PRADIUS,PPOWERS,&
+          HIBM_MODE_INT1N,HIBM_TYPE_BOUNN,HIBM_MODE_BOUNN,HIBM_FORC_BOUNN,PIBM_FORC_BOUNN,&
+          HIBM_MODE_INT1T,HIBM_TYPE_BOUNT,HIBM_MODE_BOUNT,HIBM_FORC_BOUNT,PIBM_FORC_BOUNT,&
+          HIBM_MODE_INT1C,HIBM_TYPE_BOUNC,HIBM_MODE_BOUNC,HIBM_FORC_BOUNC,PIBM_FORC_BOUNC,PXMU,PDIV)
+       !
+       REAL, DIMENSION(:,:,:)   ,INTENT(INOUT) :: PVAR
+       REAL, DIMENSION(:,:,:,:) ,INTENT(IN)    :: PVAR2,PVAR3
+       CHARACTER(LEN=1)         ,INTENT(IN)    :: HVAR
+       INTEGER                  ,INTENT(IN)    :: KIBM_LAYER
+       REAL                     ,INTENT(IN)    :: PRADIUS
+       REAL                     ,INTENT(IN)    :: PPOWERS
+       CHARACTER(LEN=3)         ,INTENT(IN)    :: HIBM_FORC_BOUNR
+       CHARACTER(LEN=3)         ,INTENT(IN)    :: HIBM_MODE_INTE3
+       CHARACTER(LEN=3)         ,INTENT(IN)    :: HIBM_MODE_INT1N
+       CHARACTER(LEN=3)         ,INTENT(IN)    :: HIBM_TYPE_BOUNN
+       CHARACTER(LEN=3)         ,INTENT(IN)    :: HIBM_MODE_BOUNN 
+       CHARACTER(LEN=3)         ,INTENT(IN)    :: HIBM_FORC_BOUNN
+       REAL                     ,INTENT(IN)    :: PIBM_FORC_BOUNN
+       CHARACTER(LEN=3)         ,INTENT(IN)    :: HIBM_MODE_INT1T
+       CHARACTER(LEN=3)         ,INTENT(IN)    :: HIBM_TYPE_BOUNT
+       CHARACTER(LEN=3)         ,INTENT(IN)    :: HIBM_MODE_BOUNT
+       CHARACTER(LEN=3)         ,INTENT(IN)    :: HIBM_FORC_BOUNT
+       REAL                     ,INTENT(IN)    :: PIBM_FORC_BOUNT
+       CHARACTER(LEN=3)         ,INTENT(IN)    :: HIBM_MODE_INT1C
+       CHARACTER(LEN=3)         ,INTENT(IN)    :: HIBM_TYPE_BOUNC
+       CHARACTER(LEN=3)         ,INTENT(IN)    :: HIBM_MODE_BOUNC
+       CHARACTER(LEN=3)         ,INTENT(IN)    :: HIBM_FORC_BOUNC
+       REAL                     ,INTENT(IN)    :: PIBM_FORC_BOUNC
+       REAL, DIMENSION(:,:,:)   ,INTENT(IN)    :: PXMU
+       REAL, DIMENSION(:,:,:)   ,INTENT(IN)    :: PDIV
+       !
+     END SUBROUTINE IBM_AFFECTV
+     !
+  END INTERFACE
+  !
+END MODULE MODI_IBM_AFFECTV
+!
+!     ########################################################
+SUBROUTINE IBM_AFFECTV(PVAR,PVAR2,PVAR3,HVAR,KIBM_LAYER,HIBM_MODE_INTE3,&
+     HIBM_FORC_BOUNR,PRADIUS,PPOWERS,&
+     HIBM_MODE_INT1N,HIBM_TYPE_BOUNN,HIBM_MODE_BOUNN,HIBM_FORC_BOUNN,PIBM_FORC_BOUNN,&
+     HIBM_MODE_INT1T,HIBM_TYPE_BOUNT,HIBM_MODE_BOUNT,HIBM_FORC_BOUNT,PIBM_FORC_BOUNT,&
+     HIBM_MODE_INT1C,HIBM_TYPE_BOUNC,HIBM_MODE_BOUNC,HIBM_FORC_BOUNC,PIBM_FORC_BOUNC,PXMU,PDIV)
+  !     ########################################################
+  !
+  !
+  !****  IBM_AFFECTV computes the variable PVAR on desired ghost points :
+  !                 - the V type of the ghost/image 
+  !                 - the 3D interpolation mode (HIBM_MODE_INTE3)
+  !                 - the 1D interpolation mode (HIBM_MODE_INTE1)
+  !                 - the boundary condition    (HIBM_TYPE_BOUND)  
+  !                 - the symmetry character    (HIBM_MODE_BOUND)
+  !                 - the forcing type          (HIBM_FORC_BOUND)    
+  !                 - the forcing term          (HIBM_FORC_BOUND)
+  !       Choice of forcing type is depending on 
+  !                 the normal, binormal, tangent vectors (N,C,T)
+  !                   
+  !                
+  !    PURPOSE
+  !    -------
+  !****  Ghosts (resp. Images) locations are stored in KIBM_STOR_GHOST (resp. KIBM_STOR_IMAGE).
+  !      Solutions are computed in regard of the symmetry character of the solution:
+  !                                      HIBM_MODE_BOUND = 'SYM' (Symmetrical)
+  !                                      HIBM_MODE_BOUND = 'ASY' (Anti-symmetrical)
+  !      The ghost value is depending on the variable value at the interface:
+  !                                      HIBM_TYPE_BOUND = "CST" (constant value)
+  !                                      HIBM_TYPE_BOUND = "LAW" (wall models)
+  !                                      HIBM_TYPE_BOUND = "LIN" (linear evolution, only IMAGE2 type)
+  !                                      HIBM_TYPE_BOUND = "LOG" (logarithmic evol, only IMAGE2 type)
+  !      Three 3D interpolations exists  HIBM_MODE_INTE3 = "IDW" (Inverse  Distance Weighting)
+  !                                      HIBM_MODE_INTE3 = "MDW" (Modified Distance Weighting)
+  !                                      HIBM_MODE_INTE3 = "LAG" (Trilinear Lagrange interp. )
+  !      Three 1D interpolations exists  HIBM_MODE_INTE1 = "CL0" (Lagrange Polynomials - 1 points - MIRROR)
+  !                                      HIBM_MODE_INTE1 = "CL1" (Lagrange Polynomials - 2 points - IMAGE1)
+  !                                      HIBM_MODE_INTE1 = "CL2" (Lagrange Polynomials - 3 points - IMAGE2)
+  !    METHOD
+  !    ------
+  !      - loop on ghosts
+  !      - functions storage
+  !      - computations of the location of the corners cell containing MIRROR/IMAGE1/IMAGE2
+  !      - 3D interpolation (IDW, MDW, CLI)  to obtain the MIRROR/IMAGE1/IMAGE2 values
+  !      - computation of the value at the interface 
+  !      - 1D interpolation (CLI1,CLI2,CLI3) to obtain the GHOSTS values
+  !      - Affectation
+  !
+  !    EXTERNAL
+  !    --------
+  !      SUBROUTINE ?
+  !
+  !    IMPLICIT ARGUMENTS
+  !    ------------------
+  !       MODD_?   
+  !
+  !    REFERENCE
+  !    ---------
+  !
+  !    AUTHOR
+  !    ------
+  !      Franck Auguste (CERFACS-AE)
+  !
+  !    MODIFICATIONS
+  !    -------------
+  !      Original         01/01/2019
+  !
+  !------------------------------------------------------------------------------
+  !       
+  !**** 0. DECLARATIONS
+  !     ---------------
+  ! module
+  USE MODE_POS
+  USE MODE_ll
+  USE MODE_IO
+  USE MODD_ARGSLIST_ll, ONLY : LIST_ll
+  !
+  ! declaration
+  USE MODD_IBM_PARAM_n
+  USE MODD_FIELD_n
+  USE MODD_PARAM_n, ONLY: CTURB
+  USE MODD_GRID_n,  ONLY: XDXHAT, XDYHAT
+  USE MODD_VAR_ll,  ONLY: IP
+  USE MODD_LBC_n
+  USE MODD_REF_n, ONLY: XRHODJ,XRHODREF
+  !
+  ! interface
+  USE MODI_IBM_VALUECORN
+  USE MODI_IBM_LOCATCORN
+  USE MODI_IBM_3DINT
+  USE MODI_IBM_1DINT
+  USE MODI_IBM_0DINT
+  USE MODI_IBM_VALUEMAT1
+  USE MODI_IBM_VALUEMAT2
+  USE MODI_SHUMAN
+  USE MODD_DYN_n
+  USE MODD_FIELD_n
+  USE MODD_CST
+  USE MODD_CTURB
+  USE MODD_RADIATIONS_n
+  !
+  IMPLICIT NONE
+  !
+  !------------------------------------------------------------------------------
+  !
+  !       0.1  declarations of arguments
+  !
+  REAL, DIMENSION(:,:,:)   ,INTENT(INOUT) :: PVAR
+  REAL, DIMENSION(:,:,:,:) ,INTENT(IN)    :: PVAR2,PVAR3
+  CHARACTER(LEN=1)         ,INTENT(IN)    :: HVAR
+  INTEGER                  ,INTENT(IN)    :: KIBM_LAYER
+  REAL                     ,INTENT(IN)    :: PRADIUS
+  REAL                     ,INTENT(IN)    :: PPOWERS
+  CHARACTER(LEN=3)         ,INTENT(IN)    :: HIBM_FORC_BOUNR
+  CHARACTER(LEN=3)         ,INTENT(IN)    :: HIBM_MODE_INTE3
+  CHARACTER(LEN=3)         ,INTENT(IN)    :: HIBM_MODE_INT1N
+  CHARACTER(LEN=3)         ,INTENT(IN)    :: HIBM_TYPE_BOUNN
+  CHARACTER(LEN=3)         ,INTENT(IN)    :: HIBM_MODE_BOUNN
+  CHARACTER(LEN=3)         ,INTENT(IN)    :: HIBM_FORC_BOUNN
+  REAL                     ,INTENT(IN)    :: PIBM_FORC_BOUNN
+  CHARACTER(LEN=3)         ,INTENT(IN)    :: HIBM_MODE_INT1T
+  CHARACTER(LEN=3)         ,INTENT(IN)    :: HIBM_TYPE_BOUNT
+  CHARACTER(LEN=3)         ,INTENT(IN)    :: HIBM_MODE_BOUNT
+  CHARACTER(LEN=3)         ,INTENT(IN)    :: HIBM_FORC_BOUNT
+  REAL                     ,INTENT(IN)    :: PIBM_FORC_BOUNT
+  CHARACTER(LEN=3)         ,INTENT(IN)    :: HIBM_MODE_INT1C
+  CHARACTER(LEN=3)         ,INTENT(IN)    :: HIBM_TYPE_BOUNC
+  CHARACTER(LEN=3)         ,INTENT(IN)    :: HIBM_MODE_BOUNC
+  CHARACTER(LEN=3)         ,INTENT(IN)    :: HIBM_FORC_BOUNC
+  REAL                     ,INTENT(IN)    :: PIBM_FORC_BOUNC
+  REAL, DIMENSION(:,:,:)   ,INTENT(IN)    :: PXMU
+  REAL, DIMENSION(:,:,:)   ,INTENT(IN)    :: PDIV
+  !
+  !------------------------------------------------------------------------------
+  !
+  !       0.2  declaration of local variables
+  !
+  INTEGER                                    :: JI,JJ,JK,JL,JM,JMM,JN,JNN,JH,JLL         ! loop index
+  INTEGER, DIMENSION(:)  , ALLOCATABLE       :: I_INDEX_CORN                             ! reference corner index 
+  INTEGER                                    :: I_GHOST_NUMB                             ! ghost number per layer
+  REAL   , DIMENSION(:,:), ALLOCATABLE       :: Z_LOCAT_CORN,Z_LOCAT_IMAG                ! corners coordinates
+  REAL   , DIMENSION(:)  , ALLOCATABLE       :: Z_TESTS_CORN                             ! interface distance dependence 
+  REAL   , DIMENSION(:)  , ALLOCATABLE       :: Z_VALUE_CORN                             ! value variables at corners
+  REAL   , DIMENSION(:,:), ALLOCATABLE       :: Z_VALUE_IMAG,Z_VALUE_TEMP,Z_VALUE_ZLKE   ! value at mirror/image1/image2 
+  REAL   , DIMENSION(:)  , ALLOCATABLE       :: Z_LOCAT_BOUN,Z_LOCAT_GHOS,Z_TEMP_ZLKE    ! location of bound and ghost
+  REAL                                       :: Z_DELTA_IMAG,ZIBM_VISC,ZIBM_DIVK
+  CHARACTER(LEN=3),DIMENSION(:), ALLOCATABLE :: Y_TYPE_BOUND,Y_FORC_BOUND,Y_MODE_BOUND,Y_MODE_INTE1
+  REAL   , DIMENSION(:)  , ALLOCATABLE       :: Z_FORC_BOUND,Z_VALUE_GHOS
+  REAL   , DIMENSION(:,:), ALLOCATABLE       :: Z_VALUE_MAT1,Z_VALUE_MAT2
+  REAL                                       :: ZIBM_HALO
+  !
+  !------------------------------------------------------------------------------
+  !
+  !       0.3  Allocation
+  !
+  ALLOCATE(I_INDEX_CORN(3))
+  ALLOCATE(Z_LOCAT_CORN(8,3))
+  ALLOCATE(Z_VALUE_CORN(8))
+  ALLOCATE(Z_TESTS_CORN(8))
+  ALLOCATE(Z_LOCAT_IMAG(3,3))
+  ALLOCATE(Z_VALUE_IMAG(4,3))
+  ALLOCATE(Z_VALUE_TEMP(4,3))
+  ALLOCATE(Z_LOCAT_BOUN(3))
+  ALLOCATE(Z_LOCAT_GHOS(3))
+  ALLOCATE(Z_VALUE_GHOS(3))
+  ALLOCATE(Y_TYPE_BOUND(3),Y_FORC_BOUND(3))
+  ALLOCATE(Y_MODE_BOUND(3),Y_MODE_INTE1(3))
+  ALLOCATE(Z_FORC_BOUND(3))
+  ALLOCATE(Z_VALUE_MAT1(3,3))
+  ALLOCATE(Z_VALUE_MAT2(3,3))
+  !
+  !------------------------------------------------------------------------------
+  !
+  !**** 1. PRELIMINARIES
+  !     ----------------
+  I_INDEX_CORN(:)    = 0
+  Z_LOCAT_CORN(:,:)  = 0.
+  Z_VALUE_CORN(:)    = 0.
+  Z_TESTS_CORN(:)    = 0.
+  Z_LOCAT_IMAG(:,:)  = 0.
+  Z_VALUE_IMAG(:,:)  = 0.
+  Z_VALUE_TEMP(:,:)  = 0.
+  Z_LOCAT_GHOS(:)    = 0.
+  Z_LOCAT_BOUN(:)    = 0.
+  Z_VALUE_GHOS(:)    = 0.
+  Z_VALUE_MAT1(:,:)  = 0.
+  Z_VALUE_MAT2(:,:)  = 0.
+  IF (HVAR=='U') JH = 1
+  IF (HVAR=='V') JH = 2
+  IF (HVAR=='W') JH = 3
+  Y_TYPE_BOUND(1) = HIBM_TYPE_BOUNN
+  Y_TYPE_BOUND(2) = HIBM_TYPE_BOUNT
+  Y_TYPE_BOUND(3) = HIBM_TYPE_BOUNC
+  Y_FORC_BOUND(1) = HIBM_FORC_BOUNN
+  Y_FORC_BOUND(2) = HIBM_FORC_BOUNT
+  Y_FORC_BOUND(3) = HIBM_FORC_BOUNC
+  Y_MODE_BOUND(1) = HIBM_MODE_BOUNN
+  Y_MODE_BOUND(2) = HIBM_MODE_BOUNT
+  Y_MODE_BOUND(3) = HIBM_MODE_BOUNC
+  Y_MODE_INTE1(1) = HIBM_MODE_INT1N
+  Y_MODE_INTE1(2) = HIBM_MODE_INT1T
+  Y_MODE_INTE1(3) = HIBM_MODE_INT1C
+  Z_FORC_BOUND(1) = PIBM_FORC_BOUNN
+  Z_FORC_BOUND(2) = PIBM_FORC_BOUNT
+  Z_FORC_BOUND(3) = PIBM_FORC_BOUNC
+  !
+  ALLOCATE(Z_VALUE_ZLKE(4,3))
+  ALLOCATE(Z_TEMP_ZLKE(3))
+  Z_VALUE_ZLKE(:,:) = 0.
+  Z_TEMP_ZLKE(:)  = 0.
+  !
+  DO JMM=1,KIBM_LAYER
+     !
+     ! searching number of ghosts 
+     JM = size(NIBM_GHOST_V,1)
+     JI = 0
+     JJ = 0
+     JK = 0
+     DO WHILE ((JI==0.and.JJ==0.and.JK==0).and.JM>0)
+        JI = NIBM_GHOST_V(JM,JMM,JH,1)
+        JJ = NIBM_GHOST_V(JM,JMM,JH,2)
+        JK = NIBM_GHOST_V(JM,JMM,JH,3)
+        IF (JI==0.and.JJ==0.and.JK==0) JM = JM - 1
+     ENDDO
+     I_GHOST_NUMB = JM
+     !
+     ! Loop on each P Ghosts 
+     IF (I_GHOST_NUMB<=0) GO TO 666
+     DO JM = 1,I_GHOST_NUMB
+        !
+        ! ghost index/ls
+        JI = NIBM_GHOST_V(JM,JMM,JH,1)
+        JJ = NIBM_GHOST_V(JM,JMM,JH,2)
+        JK = NIBM_GHOST_V(JM,JMM,JH,3)
+        IF (JI==0.or.JJ==0.or.JK==0) GO TO 777 
+        Z_LOCAT_GHOS(:) =  XIBM_GHOST_V(JM,JMM,JH,:)
+        Z_LOCAT_BOUN(:) = 2.0*XIBM_IMAGE_V(JM,JMM,JH,1,:)-1.0*XIBM_IMAGE_V(JM,JMM,JH,2,:) 
+        ZIBM_HALO = 1.
+        !
+        DO JN = 1,3
+           !
+           Z_LOCAT_IMAG(JN,:)= XIBM_IMAGE_V(JM,JMM,JH  ,JN,:)
+           Z_DELTA_IMAG      = ( XDXHAT(JI) * XDYHAT(JJ) ) ** 0.5
+           !
+           DO JLL=1,3
+              I_INDEX_CORN(:)       = NIBM_IMAGE_V(JM,JMM,JH,JLL,JN,:)
+              IF (I_INDEX_CORN(1)==0.AND.JN==2) ZIBM_HALO=0.
+              IF (I_INDEX_CORN(2)==0.AND.JN==2) ZIBM_HALO=0.
+              Z_LOCAT_CORN(:,:)     = IBM_LOCATCORN(I_INDEX_CORN,JLL+1)
+              Z_TESTS_CORN(:)       = XIBM_TESTI_V(JM,JMM,JH,JLL,JN,:)
+              Z_VALUE_CORN(:)       = IBM_VALUECORN(PVAR2(:,:,:,JLL),I_INDEX_CORN)          
+              Z_VALUE_IMAG(JN,JLL)  = IBM_3DINT(JN,Z_VALUE_IMAG(:,JLL),Z_LOCAT_BOUN,Z_TESTS_CORN,&
+                   Z_LOCAT_CORN,Z_VALUE_CORN,Z_LOCAT_IMAG(JN,:),&
+                   HIBM_MODE_INTE3,PRADIUS,PPOWERS)
+           ENDDO
+           !
+        ENDDO
+        ZIBM_VISC = PXMU(JI,JJ,JK)
+        ZIBM_DIVK = PDIV(JI,JJ,JK)
+        !
+        ! projection step
+        Z_VALUE_MAT1(:,:) = IBM_VALUEMAT1(Z_LOCAT_IMAG(1,:),Z_LOCAT_BOUN,Z_VALUE_IMAG,HIBM_FORC_BOUNR)
+        DO JN=1,3 
+           Z_VALUE_TEMP(JN,:)= Z_VALUE_MAT1(:,1)*Z_VALUE_IMAG(JN,1) +&
+                Z_VALUE_MAT1(:,2)*Z_VALUE_IMAG(JN,2) +&
+                Z_VALUE_MAT1(:,3)*Z_VALUE_IMAG(JN,3) 
+        ENDDO
+        !
+        ! === BOUND computation ===
+        !
+        JN=4
+        DO JLL=1,3
+           Z_VALUE_TEMP(JN,JLL)  = IBM_0DINT(Z_DELTA_IMAG,Z_VALUE_TEMP(:,JLL),Y_TYPE_BOUND(JLL),Y_FORC_BOUND(JLL), & 
+                Z_FORC_BOUND(JLL),ZIBM_VISC,ZIBM_DIVK)
+        ENDDO
+        !
+        ! inverse projection step
+        Z_VALUE_MAT2(:,:) = IBM_VALUEMAT2(Z_VALUE_MAT1)
+        Z_VALUE_IMAG(JN,:)= Z_VALUE_MAT2(:,1)*Z_VALUE_TEMP(JN,1) +&
+             Z_VALUE_MAT2(:,2)*Z_VALUE_TEMP(JN,2) +&
+             Z_VALUE_MAT2(:,3)*Z_VALUE_TEMP(JN,3)
+        !
+        ! === GHOST computation ===
+        !
+        ! functions storage
+        Z_LOCAT_IMAG(1,3) = ((XIBM_GHOST_V(JM,JMM,JH,1)-Z_LOCAT_BOUN(1))**2.+&
+             (XIBM_GHOST_V(JM,JMM,JH,2)-Z_LOCAT_BOUN(2))**2.+&
+             (XIBM_GHOST_V(JM,JMM,JH,3)-Z_LOCAT_BOUN(3))**2.)**0.5
+        IF (Z_LOCAT_IMAG(1,3)>Z_DELTA_IMAG.AND.ZIBM_HALO>0.5) THEN
+           Z_LOCAT_IMAG(1,1) = ((XIBM_IMAGE_V(JM,JMM,JH,1,1)-Z_LOCAT_BOUN(1))**2.+&
+                (XIBM_IMAGE_V(JM,JMM,JH,1,2)-Z_LOCAT_BOUN(2))**2.+&
+                (XIBM_IMAGE_V(JM,JMM,JH,1,3)-Z_LOCAT_BOUN(3))**2.)**0.5
+           Z_LOCAT_IMAG(1,2) = ((XIBM_IMAGE_V(JM,JMM,JH,2,1)-Z_LOCAT_BOUN(1))**2.+&
+                (XIBM_IMAGE_V(JM,JMM,JH,2,2)-Z_LOCAT_BOUN(2))**2.+&
+                (XIBM_IMAGE_V(JM,JMM,JH,2,3)-Z_LOCAT_BOUN(3))**2.)**0.5
+        ELSE
+           Z_LOCAT_IMAG(1,1) = ((XIBM_IMAGE_V(JM,JMM,JH,3,1)-Z_LOCAT_BOUN(1))**2.+&
+                (XIBM_IMAGE_V(JM,JMM,JH,3,2)-Z_LOCAT_BOUN(2))**2.+&
+                (XIBM_IMAGE_V(JM,JMM,JH,3,3)-Z_LOCAT_BOUN(3))**2.)**0.5
+           Z_LOCAT_IMAG(1,2) = ((XIBM_IMAGE_V(JM,JMM,JH,1,1)-Z_LOCAT_BOUN(1))**2.+&
+                (XIBM_IMAGE_V(JM,JMM,JH,1,2)-Z_LOCAT_BOUN(2))**2.+&
+                (XIBM_IMAGE_V(JM,JMM,JH,1,3)-Z_LOCAT_BOUN(3))**2.)**0.5
+           Z_VALUE_TEMP(2,:) = Z_VALUE_TEMP(1,:)
+           Z_VALUE_TEMP(1,:) = Z_VALUE_TEMP(3,:)
+        ENDIF
+        ! 
+        DO JLL=1,3
+           Z_VALUE_GHOS(JLL) = IBM_1DINT(Z_LOCAT_IMAG(1,:),Z_VALUE_TEMP(:,JLL),Y_MODE_INTE1(JLL))
+           IF (Y_MODE_BOUND(JLL)=='SYM') Z_VALUE_GHOS(JLL) = +Z_VALUE_GHOS(JLL)
+           IF (Y_MODE_BOUND(JLL)=='ASY') Z_VALUE_GHOS(JLL) = -Z_VALUE_GHOS(JLL) + 2.*Z_VALUE_TEMP(4,JLL)
+           IF (Y_MODE_BOUND(JLL)=='CST') Z_VALUE_GHOS(JLL) = Z_VALUE_TEMP(4,JLL) 
+        ENDDO
+        !
+        PVAR(JI,JJ,JK) =  Z_VALUE_MAT2(JH,1)*Z_VALUE_GHOS(1) +&
+             Z_VALUE_MAT2(JH,2)*Z_VALUE_GHOS(2) +&
+             Z_VALUE_MAT2(JH,3)*Z_VALUE_GHOS(3)
+        !
+        IF ((JH==3).AND.(JK==2)) THEN
+           PVAR(JI,JJ,JK) = 0.
+        ENDIF
+        !
+777     CONTINUE
+        !
+     ENDDO
+  ENDDO
+  !
+666 CONTINUE
+  !
+  !**** X. DEALLOCATIONS/CLOSES
+  !     -----------------------
+  !
+  DEALLOCATE(I_INDEX_CORN)
+  DEALLOCATE(Z_LOCAT_CORN)
+  DEALLOCATE(Z_VALUE_CORN)
+  DEALLOCATE(Z_LOCAT_IMAG)
+  DEALLOCATE(Z_VALUE_IMAG)
+  DEALLOCATE(Z_VALUE_TEMP)
+  DEALLOCATE(Z_LOCAT_BOUN)
+  DEALLOCATE(Z_LOCAT_GHOS)
+  DEALLOCATE(Z_VALUE_GHOS)
+  DEALLOCATE(Z_TESTS_CORN)
+  DEALLOCATE(Y_TYPE_BOUND,Y_FORC_BOUND)
+  DEALLOCATE(Y_MODE_BOUND,Y_MODE_INTE1)
+  DEALLOCATE(Z_FORC_BOUND)
+  DEALLOCATE(Z_VALUE_MAT1)
+  DEALLOCATE(Z_VALUE_MAT2)
+  DEALLOCATE(Z_VALUE_ZLKE)
+  DEALLOCATE(Z_TEMP_ZLKE)
+  ! 
+  RETURN
+  !
+END SUBROUTINE IBM_AFFECTV
diff --git a/src/PHYEX/ext/ibm_forcing.f90 b/src/PHYEX/ext/ibm_forcing.f90
new file mode 100644
index 0000000000000000000000000000000000000000..aebf45609f2e854eaedb797480f641390f21738b
--- /dev/null
+++ b/src/PHYEX/ext/ibm_forcing.f90
@@ -0,0 +1,314 @@
+!MNH_LIC Copyright 2019-2021 CNRS, Meteo-France and Universite Paul Sabatier
+!MNH_LIC This is part of the Meso-NH software governed by the CeCILL-C licence
+!MNH_LIC version 1. See LICENSE, CeCILL-C_V1-en.txt and CeCILL-C_V1-fr.txt
+!MNH_LIC for details. version 1.
+!-----------------------------------------------------------------
+!
+!       #######################
+MODULE MODI_IBM_FORCING
+  !       #######################
+  !
+  INTERFACE
+     !
+     SUBROUTINE IBM_FORCING(PRUS,PRVS,PRWS,PTHS,PRRS,PSVS,PTKS)
+       !
+       REAL, DIMENSION(:,:,:)  ,INTENT(INOUT)           :: PRUS,PRVS,PRWS
+       REAL, DIMENSION(:,:,:)  ,INTENT(INOUT)           :: PTHS
+       REAL, DIMENSION(:,:,:,:),INTENT(INOUT), OPTIONAL :: PRRS
+       REAL, DIMENSION(:,:,:,:),INTENT(INOUT), OPTIONAL :: PSVS
+       REAL, DIMENSION(:,:,:)  ,INTENT(INOUT), OPTIONAL :: PTKS
+       !
+     END SUBROUTINE IBM_FORCING
+     !
+  END INTERFACE
+  !
+END MODULE MODI_IBM_FORCING
+!
+!       ##########################################################
+SUBROUTINE IBM_FORCING(PRUS,PRVS,PRWS,PTHS,PRRS,PSVS,PTKS)
+  !       ##########################################################
+  !
+  !!****     *IBM_FORCING*  - routine to force all desired fields 
+  !!
+  !!      PURPOSE
+  !!      -------
+  !         The purpose of this routine is to compute variables in the virtual
+  !         embedded solid region in regard of variables computed in the real
+  !         fluid region
+  !
+  !!      METHOD
+  !!      ------
+  !!
+  !!      EXTERNAL
+  !!      --------
+  !!        NONE
+  !!
+  !!      IMPLICIT ARGUMENTS
+  !!      ------------------
+  !!
+  !!      REFERENCE
+  !!      ---------
+  !!
+  !!      AUTHOR
+  !!      ------
+  !!        Franck Auguste       * CERFACS(AE) *
+  !!
+  !!      MODIFICATIONS
+  !!      -------------
+  !!        Original          01/01/2019
+  !!
+  !-----------------------------------------------------------------------------
+  !       
+  !**** 0. DECLARATIONS
+  !     ---------------
+  !
+  ! module
+  USE MODE_POS
+  USE MODE_ll
+  USE MODE_IO
+  USE MODD_ARGSLIST_ll, ONLY : LIST_ll
+  !
+  ! declaration
+  USE MODD_CST
+  USE MODD_FIELD_n
+  USE MODD_REF
+  USE MODD_REF_n, ONLY: XRHODJ,XRHODREF,XTHVREF,XEXNREF,XRVREF
+  USE MODD_PARAMETERS, ONLY: JPVEXT,JPHEXT
+  USE MODD_IBM_PARAM_n
+  USE MODD_LBC_n
+  USE MODD_CONF
+  USE MODD_CONF_n
+  USE MODD_NSV
+  USE MODD_TURB_n, ONLY: XTKEMIN
+  USE MODD_PARAM_n
+  USE MODD_DYN_n, ONLY: XTSTEP
+  !
+  ! interface
+  USE MODI_IBM_AFFECTV
+  USE MODI_IBM_AFFECTP
+  USE MODI_SHUMAN
+  !
+  IMPLICIT NONE
+  !
+  !-----------------------------------------------------------------------------
+  !
+  !       0.1  declarations of arguments
+  !
+  REAL, DIMENSION(:,:,:)  ,INTENT(INOUT) :: PRUS,PRVS,PRWS
+  REAL, DIMENSION(:,:,:)  ,INTENT(INOUT) :: PTHS
+  REAL, DIMENSION(:,:,:,:),INTENT(INOUT), OPTIONAL :: PRRS
+  REAL, DIMENSION(:,:,:,:),INTENT(INOUT), OPTIONAL :: PSVS
+  REAL, DIMENSION(:,:,:)  ,INTENT(INOUT), OPTIONAL :: PTKS
+  !
+  !-----------------------------------------------------------------------------
+  !
+  !       0.2  declaration of local variables
+  REAL, DIMENSION(:,:,:)  , ALLOCATABLE :: ZTMP,ZXMU,ZDIV,ZTKE
+  REAL, DIMENSION(:,:,:,:), ALLOCATABLE :: ZTMU,ZTRY
+  INTEGER                               :: IIU,IJU,IKU,IKB,IKE
+  INTEGER                               :: JRR,JSV
+  TYPE(LIST_ll), POINTER                :: TZFIELDS_ll   
+  INTEGER                               :: IINFO_ll
+  !
+  !-----------------------------------------------------------------------------
+  !
+  !**** 0. ALLOCATIONS
+  !     --------------
+  !
+  IIU = SIZE(PRUS,1)
+  IJU = SIZE(PRVS,2)
+  IKU = SIZE(PRWS,3)
+  !
+  ALLOCATE(ZTMU(IIU,IJU,IKU,3),ZTMP(IIU,IJU,IKU),ZTRY(IIU,IJU,IKU,3), &
+       ZXMU(IIU,IJU,IKU),ZDIV(IIU,IJU,IKU),ZTKE(IIU,IJU,IKU))
+  !
+  ZTMU=0.
+  ZXMU=0.
+  ZDIV=0.
+  ZTMP=0.
+  ZTRY=0.
+  !
+  IKB =   1 + JPVEXT
+  IKE = IKU - JPVEXT
+  !
+  !-----------------------------------------------------------------------------
+  !       
+  !**** 1. PRELIMINARIES
+  !     ----------------
+  IF (NSV>=1) THEN
+     !
+     DO JSV=1,NSV
+        WHERE (XIBM_LS(:,:,:,1).GT.XIBM_EPSI) PSVS(:,:,:,JSV) = XIBM_EPSI**1.5
+     ENDDO
+     !
+  ENDIF
+  !
+  WHERE (XIBM_LS(:,:,:,1).GT.XIBM_EPSI) PTHS(:,:,:) = XTHVREF(:,:,:)
+  !
+  IF (NRR>=1) THEN
+     WHERE (XIBM_LS(:,:,:,1).GT.XIBM_EPSI)  
+        PRRS(:,:,:,1) = XRVREF(:,:,:)
+        PTHS(:,:,:) = XTHVREF(:,:,:)/(1.+XRD/XRV*XRVREF(:,:,:))
+     ENDWHERE
+  ENDIF
+  IF (NRR>=2) THEN
+     DO JRR=2,NRR
+        WHERE (XIBM_LS(:,:,:,1).GT.XIBM_EPSI) PRRS(:,:,:,JRR) = XIBM_EPSI
+     ENDDO
+  ENDIF
+  !
+  WHERE (XIBM_LS(:,:,:,2).GT.XIBM_EPSI) PRUS(:,:,:) = XIBM_EPSI
+  WHERE (XIBM_LS(:,:,:,3).GT.XIBM_EPSI) PRVS(:,:,:) = XIBM_EPSI
+  WHERE (XIBM_LS(:,:,:,4).GT.XIBM_EPSI) PRWS(:,:,:) = XIBM_EPSI
+  IF (CTURB/='NONE') WHERE (XIBM_LS(:,:,:,1).GT.XIBM_EPSI) PTKS(:,:,:) = XTKEMIN
+  !
+  !**** 2. EXECUTIONS
+  !     -------------
+  !
+  ! ======================
+  ! === SCALAR FORCING ===
+  ! ======================
+  !
+  IF (CTURB/='NONE') THEN
+     ZTMP(:,:,:) = PTKS(:,:,:)
+     ZTMP(:,:,IKB-1)=ZTMP(:,:,IKB)
+     ZTMP(:,:,IKE+1)=ZTMP(:,:,IKE)
+     ZXMU(:,:,:) = XIBM_XMUT(:,:,:)
+     ZDIV(:,:,:) = XIBM_CURV(:,:,:)
+     CALL IBM_AFFECTP(ZTMP,NIBM_LAYER_E,XIBM_RADIUS_E,XIBM_POWERS_E,&
+          CIBM_MODE_INTE1_E,CIBM_MODE_INTE3_E,&
+          CIBM_TYPE_BOUND_E,CIBM_MODE_BOUND_E,&
+          CIBM_FORC_BOUND_E,XIBM_FORC_BOUND_E,ZXMU,ZDIV)
+     ZTMP(:,:,IKB-1)=ZTMP(:,:,IKB)
+     ZTMP(:,:,IKE+1)=XTKEMIN
+     PTKS(:,:,:)=MAX(XTKEMIN,ZTMP(:,:,:))
+  ENDIF
+  !
+  ZTMP(:,:,:) = PTHS(:,:,:)
+  ZTMP(:,:,IKB-1)=ZTMP(:,:,IKB)
+  ZTMP(:,:,IKE+1)=ZTMP(:,:,IKE)
+  CALL IBM_AFFECTP(ZTMP,NIBM_LAYER_T,XIBM_RADIUS_T,XIBM_POWERS_T,&
+       CIBM_MODE_INTE1_T,CIBM_MODE_INTE3_T,&
+       CIBM_TYPE_BOUND_T,CIBM_MODE_BOUND_T,&
+       CIBM_FORC_BOUND_T,XIBM_FORC_BOUND_T,ZXMU,ZDIV)
+  ZTMP(:,:,:) =  ZTMP(:,:,:)
+  ZTMP(:,:,IKB-1)=ZTMP(:,:,IKB)
+  ZTMP(:,:,IKE+1)=ZTMP(:,:,IKE)
+  PTHS(:,:,:) = MAX(ZTMP(:,:,:),250.)
+  !
+  IF (NRR>=1) THEN
+     DO JRR=1,NRR
+        ZTMP(:,:,:) = PRRS(:,:,:,JRR)
+        ZTMP(:,:,IKB-1)=ZTMP(:,:,IKB)
+        ZTMP(:,:,IKE+1)=ZTMP(:,:,IKE)
+        CALL IBM_AFFECTP(ZTMP,NIBM_LAYER_R,XIBM_RADIUS_R,XIBM_POWERS_R,&
+             CIBM_MODE_INTE1_R,CIBM_MODE_INTE3_R,&
+             CIBM_TYPE_BOUND_R,CIBM_MODE_BOUND_R,&
+             CIBM_FORC_BOUND_R,XIBM_FORC_BOUND_R,ZXMU,ZDIV)
+        ZTMP(:,:,IKB-1)=ZTMP(:,:,IKB)
+        ZTMP(:,:,IKE+1)=ZTMP(:,:,IKE)
+        PRRS(:,:,:,JRR) = ZTMP(:,:,:)
+     ENDDO
+  ENDIF
+  !
+  IF (NSV>=1) THEN 
+     DO JSV=1,NSV
+        ZTMP(:,:,:) = PSVS(:,:,:,JSV)
+        ZTMP(:,:,IKB-1)=ZTMP(:,:,IKB)
+        ZTMP(:,:,IKE+1)=ZTMP(:,:,IKE)
+        CALL IBM_AFFECTP(ZTMP,NIBM_LAYER_S,XIBM_RADIUS_S,XIBM_POWERS_S,&
+             CIBM_MODE_INTE1_S,CIBM_MODE_INTE3_S,&
+             CIBM_TYPE_BOUND_S,CIBM_MODE_BOUND_S,&
+             CIBM_FORC_BOUND_S,XIBM_FORC_BOUND_S,ZXMU,ZDIV) 
+        ZTMP(:,:,:) = MAX(XIBM_EPSI**1.5,ZTMP(:,:,:))
+        ZTMP(:,:,IKB-1)=ZTMP(:,:,IKB)
+        ZTMP(:,:,IKE+1)=ZTMP(:,:,IKE)
+        PSVS(:,:,:,JSV) = ZTMP(:,:,:)
+     ENDDO
+  ENDIF
+  !
+  !=======================
+  ! === VECTOR FORCING ===
+  ! ======================
+  !
+  PRUS(:,:,IKB-1)=PRUS(:,:,IKB)
+  PRUS(:,:,IKE+1)=PRUS(:,:,IKE)
+  PRVS(:,:,IKB-1)=PRVS(:,:,IKB)
+  PRVS(:,:,IKE+1)=PRVS(:,:,IKE)
+  PRWS(:,:,IKB-1)=0.
+  PRWS(:,:,IKE+1)=0.
+  !
+  ZTMU(:,:,:,1) = PRUS(:,:,:)
+  ZTMU(:,:,:,2) = PRVS(:,:,:)
+  ZTMU(:,:,:,3) = PRWS(:,:,:)
+  !
+  ZTMP(:,:,:) = PRUS(:,:,:)
+  ZXMU(:,:,:) = MXM(XIBM_XMUT(:,:,:))
+  ZDIV(:,:,:) = MXM(XIBM_CURV(:,:,:))
+  CALL IBM_AFFECTV(ZTMP,ZTMU,ZTRY,'U',NIBM_LAYER_V,CIBM_MODE_INTE3_V,&
+       CIBM_FORC_BOUNR_V,XIBM_RADIUS_V,XIBM_POWERS_V,&
+       CIBM_MODE_INTE1NV,CIBM_TYPE_BOUNN_V,CIBM_MODE_BOUNN_V,CIBM_FORC_BOUNN_V ,XIBM_FORC_BOUNN_V,&
+       CIBM_MODE_INTE1TV,CIBM_TYPE_BOUNT_V,CIBM_MODE_BOUNT_V,CIBM_FORC_BOUNT_V ,XIBM_FORC_BOUNT_V,&
+       CIBM_MODE_INTE1CV,CIBM_TYPE_BOUNC_V,CIBM_MODE_BOUNC_V,CIBM_FORC_BOUNC_V ,XIBM_FORC_BOUNC_V,ZXMU,ZDIV)
+  PRUS(:,:,:) = ZTMP(:,:,:)
+  ZTMP(:,:,:) = PRVS(:,:,:)
+  ZXMU(:,:,:) = MYM(XIBM_XMUT(:,:,:))
+  ZDIV(:,:,:) = MYM(XIBM_CURV(:,:,:))
+  CALL IBM_AFFECTV(ZTMP,ZTMU,ZTRY,'V',NIBM_LAYER_V,CIBM_MODE_INTE3_V,&
+       CIBM_FORC_BOUNR_V,XIBM_RADIUS_V,XIBM_POWERS_V,&
+       CIBM_MODE_INTE1NV,CIBM_TYPE_BOUNN_V,CIBM_MODE_BOUNN_V,CIBM_FORC_BOUNN_V ,XIBM_FORC_BOUNN_V,&
+       CIBM_MODE_INTE1TV,CIBM_TYPE_BOUNT_V,CIBM_MODE_BOUNT_V,CIBM_FORC_BOUNT_V ,XIBM_FORC_BOUNT_V,&
+       CIBM_MODE_INTE1CV,CIBM_TYPE_BOUNC_V,CIBM_MODE_BOUNC_V,CIBM_FORC_BOUNC_V ,XIBM_FORC_BOUNC_V,ZXMU,ZDIV)
+  PRVS(:,:,:) = ZTMP(:,:,:)
+  ZTMP(:,:,:) = PRWS(:,:,:)
+  ZXMU(:,:,:) = MZM(XIBM_XMUT(:,:,:))
+  ZDIV(:,:,:) = MZM(XIBM_CURV(:,:,:))
+  CALL IBM_AFFECTV(ZTMP,ZTMU,ZTRY,'W',NIBM_LAYER_V,CIBM_MODE_INTE3_V,&
+       CIBM_FORC_BOUNR_V,XIBM_RADIUS_V,XIBM_POWERS_V,&
+       CIBM_MODE_INTE1NV,CIBM_TYPE_BOUNN_V,CIBM_MODE_BOUNN_V,CIBM_FORC_BOUNN_V ,XIBM_FORC_BOUNN_V,&
+       CIBM_MODE_INTE1TV,CIBM_TYPE_BOUNT_V,CIBM_MODE_BOUNT_V,CIBM_FORC_BOUNT_V ,XIBM_FORC_BOUNT_V,&
+       CIBM_MODE_INTE1CV,CIBM_TYPE_BOUNC_V,CIBM_MODE_BOUNC_V,CIBM_FORC_BOUNC_V ,XIBM_FORC_BOUNC_V,ZXMU,ZDIV)
+  PRWS(:,:,:) = ZTMP(:,:,:)
+  PRUS(:,:,IKB-1)=PRUS(:,:,IKB)
+  PRUS(:,:,IKE+1)=PRUS(:,:,IKE)
+  PRVS(:,:,IKB-1)=PRVS(:,:,IKB)
+  PRVS(:,:,IKE+1)=PRVS(:,:,IKE)
+  PRWS(:,:,IKB-1)=0.
+  PRWS(:,:,IKB)  =0.
+  PRWS(:,:,IKE+1)=0.
+  !
+  !**** 3. COMMUNICATIONS 
+  !     -----------------
+  !
+  IF (.NOT. LIBM_TROUBLE) THEN
+     !
+     NULLIFY(TZFIELDS_ll)
+     CALL ADD3DFIELD_ll(TZFIELDS_ll,PTHS(:,:,:),'IBM_FORCING::PTHS')
+     IF (CTURB/='NONE') CALL ADD3DFIELD_ll(TZFIELDS_ll,PTKS(:,:,:),'IBM_FORCING::PTKS')
+     CALL ADD3DFIELD_ll(TZFIELDS_ll,PRUS(:,:,:),'IBM_FORCING::PRUS')
+     CALL ADD3DFIELD_ll(TZFIELDS_ll,PRVS(:,:,:),'IBM_FORCING::PRVS')
+     CALL ADD3DFIELD_ll(TZFIELDS_ll,PRWS(:,:,:),'IBM_FORCING::PRWS')
+     IF (NRR>=1) THEN
+        DO JRR=1,NRR
+           CALL ADD3DFIELD_ll(TZFIELDS_ll,PRRS(:,:,:,JRR),'IBM_FORCING::PRRS')
+        ENDDO
+     ENDIF
+     IF (NSV>=1) THEN
+        DO JSV=1,NSV
+           CALL ADD3DFIELD_ll(TZFIELDS_ll,PSVS(:,:,:,JSV),'IBM_FORCING::PSVS')
+        ENDDO
+     ENDIF
+     !
+     CALL UPDATE_HALO_ll(TZFIELDS_ll,IINFO_ll)
+     CALL CLEANLIST_ll(TZFIELDS_ll)
+     !
+  ENDIF
+  !
+  !**** 4. DEALLOCATIONS
+  !     ----------------
+  !
+  DEALLOCATE(ZTMP,ZTMU,ZTRY,ZXMU,ZDIV,ZTKE)
+  !
+  RETURN
+  ! 
+END SUBROUTINE IBM_FORCING
diff --git a/src/PHYEX/ext/ibm_forcing_tr.f90 b/src/PHYEX/ext/ibm_forcing_tr.f90
new file mode 100644
index 0000000000000000000000000000000000000000..c14ac2aa61fadced5c1759f7043002c727492670
--- /dev/null
+++ b/src/PHYEX/ext/ibm_forcing_tr.f90
@@ -0,0 +1,410 @@
+!MNH_LIC Copyright 2019-2021 CNRS, Meteo-France and Universite Paul Sabatier
+!MNH_LIC This is part of the Meso-NH software governed by the CeCILL-C licence
+!MNH_LIC version 1. See LICENSE, CeCILL-C_V1-en.txt and CeCILL-C_V1-fr.txt
+!MNH_LIC for details. version 1.
+!-----------------------------------------------------------------
+!
+!       ##########################
+MODULE MODI_IBM_FORCING_TR
+  !       ##########################
+  !
+  INTERFACE
+     !
+     SUBROUTINE IBM_FORCING_TR(PRUS,PRVS,PRWS,PTHS,PRRS,PSVS,PTKS)
+       !
+       REAL, DIMENSION(:,:,:)   ,INTENT(INOUT)          :: PRUS,PRVS,PRWS
+       REAL, DIMENSION(:,:,:)   ,INTENT(INOUT)          :: PTHS
+       REAL, DIMENSION(:,:,:,:) ,INTENT(INOUT),OPTIONAL :: PRRS
+       REAL, DIMENSION(:,:,:,:) ,INTENT(INOUT),OPTIONAL :: PSVS
+       REAL, DIMENSION(:,:,:)   ,INTENT(INOUT),OPTIONAL :: PTKS
+       !
+     END SUBROUTINE IBM_FORCING_TR
+     !
+  END INTERFACE
+  !
+END MODULE MODI_IBM_FORCING_TR
+!
+!
+!       #############################################################
+SUBROUTINE IBM_FORCING_TR(PRUS,PRVS,PRWS,PTHS,PRRS,PSVS,PTKS)
+  !       #############################################################
+  !
+  !!****     *IBM_FORCING_TR*  - routine to force all desired fields 
+  !!
+  !!      PURPOSE
+  !!      -------
+  !         The purpose of this routine is to compute variables in the virtual
+  !         embedded solid region in regard of variables computed in the real
+  !         fluid region
+  !
+  !!      METHOD
+  !!      ------
+  !!
+  !!      EXTERNAL
+  !!      --------
+  !!        NONE
+  !!
+  !!      IMPLICIT ARGUMENTS
+  !!      ------------------
+  !!
+  !!      REFERENCE
+  !!      ---------
+  !!
+  !!      AUTHOR
+  !!      ------
+  !!        Franck Auguste       * CERFACS(AE) *
+  !!
+  !!      MODIFICATIONS
+  !!      -------------
+  !!        Original          01/01/2019
+  !!
+  !------------------------------------------------------------------------------
+  !       
+  !**** 0. DECLARATIONS
+  !     ---------------
+  !
+  ! module
+  USE MODE_POS
+  USE MODE_ll
+  USE MODE_IO
+  USE MODD_ARGSLIST_ll, ONLY: LIST_ll
+  !
+  ! declaration
+  USE MODD_CST, ONLY: XRD,XRV
+  USE MODD_REF_n, ONLY: XRHODJ,XRHODREF,XTHVREF,XRVREF
+  USE MODD_PARAMETERS, ONLY: JPVEXT,JPHEXT
+  USE MODD_IBM_PARAM_n
+  USE MODD_LBC_n
+  USE MODD_CONF
+  USE MODD_CONF_n
+  USE MODD_NSV
+  USE MODD_TURB_n, ONLY: XTKEMIN
+  USE MODD_PARAM_n
+  !
+  ! interface
+  !
+  IMPLICIT NONE
+  !
+  !-----------------------------------------------------------------------------
+  !
+  !       0.1  declarations of arguments
+  !
+  REAL, DIMENSION(:,:,:)  ,INTENT(INOUT)          :: PRUS,PRVS,PRWS
+  REAL, DIMENSION(:,:,:)  ,INTENT(INOUT)          :: PTHS
+  REAL, DIMENSION(:,:,:,:),INTENT(INOUT),OPTIONAL :: PRRS
+  REAL, DIMENSION(:,:,:,:),INTENT(INOUT),OPTIONAL :: PSVS
+  REAL, DIMENSION(:,:,:)  ,INTENT(INOUT),OPTIONAL :: PTKS
+  !
+  !-----------------------------------------------------------------------------
+  !
+  !       0.2  declaration of local variables
+  INTEGER                         :: JI,JJ,JK,JI2,JJ2,JK2,IIU,IJU,IKU,JL
+  INTEGER                         :: JIM1,JJM1,JKM1,JIP1,JJP1,JKP1
+  INTEGER                         :: IIE,IIB,IJE,IJB,IKB,IKE
+  REAL                            :: ZSUM1,ZSUM2,ZSUM4
+  REAL, DIMENSION(:), ALLOCATABLE :: ZSUM3,ZSUM5
+  TYPE(LIST_ll), POINTER          :: TZFIELDS_ll   
+  INTEGER                         :: IINFO_ll
+  !
+  !-----------------------------------------------------------------------------
+  !
+  !**** 0. ALLOCATIONS
+  !     --------------
+  CALL GET_INDICE_ll(IIB,IJB,IIE,IJE)
+  IIU = SIZE(PRUS,1)
+  IJU = SIZE(PRUS,2)
+  IKU = SIZE(PRUS,3)
+  IKB =   1 + JPVEXT
+  IKE = SIZE(PRUS,3) - JPVEXT
+  !
+  !-----------------------------------------------------------------------------
+  ! 
+  ! Problems in GCT ? => imposition of the adjacent value
+  DO JI=IIB,IIE
+     DO JJ=IJB,IJE
+        DO JK=IKB,IKE
+           !
+           IF (XIBM_SUTR(JI,JJ,JK,1).LT.0.5) THEN
+              !
+              JIM1 = JI-1
+              JJM1 = JJ-1
+              JKM1 = JK-1
+              JIP1 = JI+1
+              JJP1 = JJ+1
+              JKP1 = JK+1
+              ZSUM1 = 0.
+              ZSUM2 = 0.
+              IF (NSV>=1) ALLOCATE(ZSUM3(NSV))
+              ZSUM3 = 0.
+              ZSUM4 = 0.
+              IF (NRR>=1) ALLOCATE(ZSUM5(NRR))
+              ZSUM5 = 0.
+              !
+              DO JI2=JIM1,JIP1
+                 DO JJ2=JJM1,JJP1
+                    DO JK2=JKM1,JKP1
+                       !
+                       ZSUM1 = ZSUM1 + (XIBM_SUTR(JI2,JJ2,JK2,1))
+                       ZSUM2 = ZSUM2 + (XIBM_SUTR(JI2,JJ2,JK2,1))*PTHS(JI2,JJ2,JK2)
+                       IF (NRR>=1) THEN
+                          DO JL = 1,NRR
+                             ZSUM5(JL) = ZSUM5(JL) + (XIBM_SUTR(JI2,JJ2,JK2,1))*PRRS(JI2,JJ2,JK2,JL)
+                          ENDDO
+                       ENDIF
+                       IF (NSV>=1) THEN
+                          DO JL = 1,NSV
+                             ZSUM3(JL) = ZSUM3(JL) + (XIBM_SUTR(JI2,JJ2,JK2,1))*PSVS(JI2,JJ2,JK2,JL)
+                          ENDDO
+                       ENDIF
+                       IF (CTURB/='NONE') ZSUM4 = ZSUM4 + (XIBM_SUTR(JI2,JJ2,JK2,1))*PTKS(JI2,JJ2,JK2)
+                       !
+                    ENDDO
+                 ENDDO
+              ENDDO
+              !
+              PTHS(JI,JJ,JK) = XTHVREF(JI,JJ,JK)
+              IF (NRR>=1) PTHS(JI,JJ,JK) = XTHVREF(JI,JJ,JK)/(1.+XRD/XRV*XRVREF(JI,JJ,JK))
+              IF (ZSUM1.GT.XIBM_EPSI)     PTHS(JI,JJ,JK) =  ZSUM2/ZSUM1
+              IF (NRR>=1) THEN
+                 PRRS(JI,JJ,JK,1) = XRVREF(JI,JJ,JK)
+                 IF (ZSUM1.GT.XIBM_EPSI) PRRS(JI,JJ,JK,1) = ZSUM5(1)/ZSUM1
+                 IF (NRR>=2) THEN
+                    DO JL = 2,NRR
+                       PRRS(JI,JJ,JK,JL) = 0.
+                       IF (ZSUM1.GT.XIBM_EPSI) PRRS(JI,JJ,JK,JL) = ZSUM5(JL)/ZSUM1
+                    ENDDO
+                 ENDIF
+              ENDIF
+              !
+              IF (NSV>=1) THEN
+                 DO JL = 1,NSV
+                    PSVS(JI,JJ,JK,JL) = 0.
+                    IF (ZSUM1.GT.XIBM_EPSI) PSVS(JI,JJ,JK,JL) = ZSUM3(JL)/ZSUM1
+                 ENDDO
+              ENDIF
+              !
+              IF (CTURB/='NONE') PTKS(JI,JJ,JK) = XTKEMIN
+              IF (ZSUM1.GT.XIBM_EPSI.AND.(CTURB/='NONE'))   PTKS(JI,JJ,JK) = ZSUM4/ZSUM1
+              IF (NSV>=1) DEALLOCATE(ZSUM3)
+              IF (NRR>=1) DEALLOCATE(ZSUM5)
+              !
+           ENDIF
+           !
+           IF (XIBM_SUTR(JI,JJ,JK,2).LT.0.5) THEN
+              !
+              JIM1 = JI-1
+              JJM1 = JJ-1
+              JKM1 = JK-1
+              JIP1 = JI+1
+              JJP1 = JJ+1
+              JKP1 = JK+1
+              ZSUM1 = 0.
+              ZSUM2 = 0.
+              !
+              DO JI2=JIM1,JIP1
+                 DO JJ2=JJM1,JJP1
+                    DO JK2=JKM1,JKP1
+                       ZSUM1 = ZSUM1 + (XIBM_SUTR(JI2,JJ2,JK2,2))
+                       ZSUM2 = ZSUM2 + (XIBM_SUTR(JI2,JJ2,JK2,2))*PRUS(JI2,JJ2,JK2)
+                    ENDDO
+                 ENDDO
+              ENDDO
+              !
+              PRUS(JI,JJ,JK) = 0.
+              IF (ZSUM1.GT.XIBM_EPSI) PRUS(JI,JJ,JK) =  ZSUM2/ZSUM1
+              !
+           ENDIF
+           !
+           IF (XIBM_SUTR(JI,JJ,JK,3).LT.0.5) THEN
+              !
+              JIM1 = JI-1
+              JJM1 = JJ-1
+              JKM1 = JK-1
+              JIP1 = JI+1
+              JJP1 = JJ+1
+              JKP1 = JK+1
+              ZSUM1 = 0.
+              ZSUM2 = 0.
+              !
+              DO JI2=JIM1,JIP1
+                 DO JJ2=JJM1,JJP1
+                    DO JK2=JKM1,JKP1
+                       ZSUM1 = ZSUM1 + (XIBM_SUTR(JI2,JJ2,JK2,3))
+                       ZSUM2 = ZSUM2 + (XIBM_SUTR(JI2,JJ2,JK2,3))*PRVS(JI2,JJ2,JK2)
+                    ENDDO
+                 ENDDO
+              ENDDO
+              !
+              PRVS(JI,JJ,JK) = 0.
+              IF (ZSUM1.GT.XIBM_EPSI)     PRVS(JI,JJ,JK) =  ZSUM2/ZSUM1
+              !
+           ENDIF
+           !
+           IF (XIBM_SUTR(JI,JJ,JK,4).LT.0.5) THEN
+              !
+              JIM1 = JI-1
+              JJM1 = JJ-1
+              JKM1 = JK-1
+              JIP1 = JI+1
+              JJP1 = JJ+1
+              JKP1 = JK+1
+              ZSUM1 = 0.
+              ZSUM2 = 0.
+              !
+              DO JI2=JIM1,JIP1
+                 DO JJ2=JJM1,JJP1
+                    DO JK2=JKM1,JKP1
+                       ZSUM1 = ZSUM1 + (XIBM_SUTR(JI2,JJ2,JK2,4))
+                       ZSUM2 = ZSUM2 + (XIBM_SUTR(JI2,JJ2,JK2,4))*PRWS(JI2,JJ2,JK2)
+                    ENDDO
+                 ENDDO
+              ENDDO
+              !
+              PRWS(JI,JJ,JK) = 0.
+              IF (ZSUM1.GT.XIBM_EPSI)     PRWS(JI,JJ,JK) =  ZSUM2/ZSUM1
+              !
+           ENDIF
+        ENDDO
+     ENDDO
+  ENDDO
+  !
+  PTHS(:,:,IKB-1)=PTHS(:,:,IKB)
+  PTHS(:,:,IKE+1)=PTHS(:,:,IKE)
+  IF (CTURB/='NONE') PTKS(:,:,IKB-1)=PTKS(:,:,IKB)
+  IF (CTURB/='NONE') PTKS(:,:,IKE+1)=PTKS(:,:,IKE)
+  IF (NSV>=1) PSVS(:,:,IKB-1,:)=PSVS(:,:,IKB,:)
+  IF (NSV>=1) PSVS(:,:,IKE+1,:)=PSVS(:,:,IKE,:)
+  IF (NRR>=1) PRRS(:,:,IKB-1,:)=PRRS(:,:,IKB,:)
+  IF (NRR>=1) PRRS(:,:,IKE+1,:)=PRRS(:,:,IKE,:)
+  PRUS(:,:,IKB-1)=PRUS(:,:,IKB)
+  PRUS(:,:,IKE+1)=PRUS(:,:,IKE)
+  PRVS(:,:,IKB-1)=PRVS(:,:,IKB)
+  PRVS(:,:,IKE+1)=PRVS(:,:,IKE)
+  PRWS(:,:,IKB-1)=0.
+  PRWS(:,:,IKB)  =0.
+  PRWS(:,:,IKE+1)=0.
+  !
+  NULLIFY(TZFIELDS_ll)
+  CALL ADD3DFIELD_ll(TZFIELDS_ll,PTHS(:,:,:),'IBM_FORCING_TR::PTHS')
+  IF (CTURB/='NONE') CALL ADD3DFIELD_ll(TZFIELDS_ll,PTKS(:,:,:),'IBM_FORCING_TR::PTKS')
+  CALL ADD3DFIELD_ll(TZFIELDS_ll,PRUS(:,:,:),'IBM_FORCING_TR::PRUS')
+  CALL ADD3DFIELD_ll(TZFIELDS_ll,PRVS(:,:,:),'IBM_FORCING_TR::PRVS')
+  CALL ADD3DFIELD_ll(TZFIELDS_ll,PRWS(:,:,:),'IBM_FORCING_TR::PRWS')
+  IF (NSV>=1) THEN
+     DO JL=1,NSV
+        CALL ADD3DFIELD_ll(TZFIELDS_ll,PSVS(:,:,:,JL),'IBM_FORCING_TR::PSVS')
+     ENDDO
+  ENDIF
+  IF (NRR>=1) THEN
+     DO JL=1,NRR
+        CALL ADD3DFIELD_ll(TZFIELDS_ll,PRRS(:,:,:,JL),'IBM_FORCING_TR::PRRS')
+     ENDDO
+  ENDIF
+  CALL UPDATE_HALO_ll(TZFIELDS_ll,IINFO_ll)
+  CALL CLEANLIST_ll(TZFIELDS_ll)
+  !
+  ! Problems on corners ? => imposition of the adjacent value
+  !
+  DO JI=IIB,IIE
+     DO JJ=IJB,IJE
+        DO JK=IKB,IKE
+           !
+           IF (XIBM_LS(JI,JJ,JK,2).GT.XIBM_EPSI) THEN
+              !
+              ZSUM1 = (XIBM_CURV(JI,JJ,JK)+XIBM_CURV(JI-1,JJ,JK))/2.
+              ZSUM1 = ABS(ZSUM1)
+              ZSUM1 = MIN(1.,ZSUM1)
+              !
+              JIM1 = JI-1
+              JJM1 = JJ-1
+              JKM1 = JK-1
+              JIP1 = JI+1
+              JJP1 = JJ+1
+              JKP1 = JK+1
+              ZSUM2 = 0.
+              !
+              DO JI2=JIM1,JIP1
+                 DO JJ2=JJM1,JJP1
+                    DO JK2=JKM1,JKP1
+                       ZSUM2 = ZSUM2 + PRUS(JI2,JJ2,JK2)
+                    ENDDO
+                 ENDDO
+              ENDDO
+              !
+              PRUS(JI,JJ,JK) = (1.-ZSUM1)*PRUS(JI,JJ,JK)+ZSUM1*ZSUM2/27.
+              !
+           ENDIF
+           !
+           IF (XIBM_LS(JI,JJ,JK,3).GT.XIBM_EPSI) THEN
+              !
+              ZSUM1 = (XIBM_CURV(JI,JJ,JK)+XIBM_CURV(JI,JJ-1,JK))/2.
+              ZSUM1 = ABS(ZSUM1)
+              ZSUM1 = MIN(1.,ZSUM1)
+              !
+              JIM1 = JI-1
+              JJM1 = JJ-1
+              JKM1 = JK-1
+              JIP1 = JI+1
+              JJP1 = JJ+1
+              JKP1 = JK+1
+              ZSUM2 = 0.
+              !
+              DO JI2=JIM1,JIP1
+                 DO JJ2=JJM1,JJP1
+                    DO JK2=JKM1,JKP1
+                       ZSUM2 = ZSUM2 + PRVS(JI2,JJ2,JK2)
+                    ENDDO
+                 ENDDO
+              ENDDO
+              !
+              PRVS(JI,JJ,JK) =   (1.-ZSUM1)*PRVS(JI,JJ,JK)+ZSUM1*ZSUM2/27.
+              !
+           ENDIF
+           !
+           IF (XIBM_LS(JI,JJ,JK,4).GT.XIBM_EPSI) THEN
+              !
+              ZSUM1 = (XIBM_CURV(JI,JJ,JK)+XIBM_CURV(JI,JJ,JK-1))/2.
+              ZSUM1 = ABS(ZSUM1)
+              ZSUM1 = MIN(1.,ZSUM1)
+              !
+              JIM1 = JI-1
+              JJM1 = JJ-1
+              JKM1 = JK-1
+              JIP1 = JI+1
+              JJP1 = JJ+1
+              JKP1 = JK+1
+              ZSUM2 = 0.
+              !
+              DO JI2=JIM1,JIP1
+                 DO JJ2=JJM1,JJP1
+                    DO JK2=JKM1,JKP1
+                       ZSUM2 = ZSUM2 + PRWS(JI2,JJ2,JK2)
+                    ENDDO
+                 ENDDO
+              ENDDO
+              !
+              PRWS(JI,JJ,JK) = (1.-ZSUM1)*PRWS(JI,JJ,JK)+ZSUM1*ZSUM2/27.
+              !
+           ENDIF
+        ENDDO
+     ENDDO
+  ENDDO
+  !
+  PRUS(:,:,IKB-1)=PRUS(:,:,IKB)
+  PRUS(:,:,IKE+1)=PRUS(:,:,IKE)
+  PRVS(:,:,IKB-1)=PRVS(:,:,IKB)
+  PRVS(:,:,IKE+1)=PRVS(:,:,IKE)
+  PRWS(:,:,IKB-1)=0.
+  PRWS(:,:,IKB)  =0.
+  PRWS(:,:,IKE+1)=0.
+  !
+  NULLIFY(TZFIELDS_ll)
+  CALL ADD3DFIELD_ll(TZFIELDS_ll,PRUS(:,:,:),'IBM_FORCING_TR::PRUS')
+  CALL ADD3DFIELD_ll(TZFIELDS_ll,PRVS(:,:,:),'IBM_FORCING_TR::PRVS')
+  CALL ADD3DFIELD_ll(TZFIELDS_ll,PRWS(:,:,:),'IBM_FORCING_TR::PRWS')
+  CALL UPDATE_HALO_ll(TZFIELDS_ll,IINFO_ll)
+  CALL CLEANLIST_ll(TZFIELDS_ll)
+  !
+  RETURN
+  !
+END SUBROUTINE IBM_FORCING_TR
diff --git a/src/PHYEX/ext/ibm_generls.f90 b/src/PHYEX/ext/ibm_generls.f90
new file mode 100644
index 0000000000000000000000000000000000000000..f8d7f9d7f079de236167627a7fc3add8c9152baf
--- /dev/null
+++ b/src/PHYEX/ext/ibm_generls.f90
@@ -0,0 +1,541 @@
+!MNH_LIC Copyright 2021-2022 CNRS, Meteo-France and Universite Paul Sabatier
+!MNH_LIC This is part of the Meso-NH software governed by the CeCILL-C licence
+!MNH_LIC version 1. See LICENSE, CeCILL-C_V1-en.txt and CeCILL-C_V1-fr.txt
+!MNH_LIC for details. version 1.
+!-----------------------------------------------------------------
+!
+!    #######################
+MODULE MODI_IBM_GENERLS  
+  !    ####################### 
+  !
+  INTERFACE
+     !
+     SUBROUTINE IBM_GENERLS(PIBM_FACES,PNORM_FACES,PV1,PV2,PV3,PX_MIN,PY_MIN,PX_MAX,PY_MAX,PPHI)
+       !
+       REAL, DIMENSION(:,:,:)   ,INTENT(IN)    :: PIBM_FACES  
+       REAL, DIMENSION(:,:)     ,INTENT(IN)    :: PNORM_FACES,PV1,PV2,PV3
+       REAL, DIMENSION(:,:,:,:) ,INTENT(INOUT) :: PPHI
+       REAL                     ,INTENT(IN)    :: PX_MIN,PY_MIN,PX_MAX,PY_MAX
+       !
+     END SUBROUTINE IBM_GENERLS
+     !
+  END INTERFACE
+  !
+END MODULE MODI_IBM_GENERLS
+!
+!     #####################################
+SUBROUTINE IBM_GENERLS(PIBM_FACES,PNORM_FACES,PV1,PV2,PV3,PX_MIN,PY_MIN,PX_MAX,PY_MAX,PPHI)
+  !     #####################################
+  !
+  !
+  !****  IBM_GENERLS computes the Level Set function for any surface       
+  !                
+  !    PURPOSE
+  !    -------
+  !****  The purpose of this routine is to estimate the level set
+  !      containing XYZ minimalisation interface locations
+
+  !    METHOD
+  !    ------
+  !****  Iterative system and minimization of the interface distance
+  !
+  !    EXTERNAL
+  !    --------
+  !      SUBROUTINE ?
+  !
+  !    IMPLICIT ARGUMENTS
+  !    ------------------
+  !       MODD_?   
+  !
+  !    REFERENCE
+  !    ---------
+  !    The method is based on '3D Distance from a Point to a Triangle'
+  !    a technical report from Mark W. Jones, University of Wales Swansea
+  !
+  !    AUTHORS
+  !    ------
+  !      Tim Nagel, Valéry Masson & Robert Schoetter 
+  !
+  !    MODIFICATIONS
+  !    -------------
+  !      Original         01/06/2021
+  !
+  !------------------------------------------------------------------------------
+  !       
+  !**** 0. DECLARATIONS
+  !     ---------------
+  !
+  ! module
+  USE MODE_POS
+  USE MODE_ll
+  USE MODE_IO
+  USE MODD_ARGSLIST_ll, ONLY : LIST_ll
+  !
+  ! declaration
+  USE MODD_IBM_PARAM_n
+  USE MODD_IBM_LSF
+  USE MODD_DIM_n, ONLY: NIMAX,NJMAX,NKMAX
+  USE MODD_PARAMETERS, ONLY: JPVEXT,JPHEXT,XUNDEF
+  USE MODD_METRICS_n, ONLY: XDXX,XDYY,XDZZ
+  USE MODD_VAR_ll, ONLY: IP
+  USE MODD_CST, ONLY: XMNH_EPSILON 
+  !
+  ! interface
+  USE MODI_SHUMAN
+  USE MODI_IBM_INTERPOS
+  USE MODI_IBM_DETECT
+  !
+  IMPLICIT NONE
+  !
+  !       0.1  declarations of arguments
+  !                                      
+  REAL, DIMENSION(:,:,:)   ,INTENT(IN)    :: PIBM_FACES     !faces coordinates
+  REAL, DIMENSION(:,:)     ,INTENT(IN)    :: PNORM_FACES    !normal
+  REAL, DIMENSION(:,:)     ,INTENT(IN)    :: PV1,PV2,PV3
+  REAL, DIMENSION(:,:,:,:) ,INTENT(INOUT) :: PPHI           ! LS functions
+  REAL                     ,INTENT(IN)    :: PX_MIN,PY_MIN,PX_MAX,PY_MAX           
+  !
+  !------------------------------------------------------------------------------
+  !
+  !       0.2  declaration of local variables
+  !
+  INTEGER :: JI,JJ,JK,JN,JM,JI2,JJ2,JK2                                       ! loop index
+  INTEGER :: JI_MIN,JI_MAX,JJ_MIN,JJ_MAX,JK_MIN,JK_MAX,IIU,IJU,IKU            ! loop boundaries
+  REAL                                :: Z_DIST_TEST1,Z_DIST_TEST2            ! saving distances  
+  REAL                                :: Z_DIST_TEST3,Z_DIST_TEST4,ZDIST_REF0
+  INTEGER                             :: INUMB_FACES                          ! number of faces 
+  REAL, DIMENSION(:,:,:), ALLOCATABLE :: ZXHATM,ZYHATM,ZZHATM,ZDP0PP0PAST 
+  CHARACTER(LEN=1)                    :: YPOS
+  REAL, DIMENSION(3)                  :: ZP1P0,ZP1P2,ZP0PP0,ZP1PP0,ZP2PP0,ZP3PP0,ZPP0P1,ZPP0P2,ZPP0P3
+  REAL, DIMENSION(3)                  :: ZPP0PPP0,ZPPP0P1,ZPPP0P2,ZP2P1,ZP2P0,ZP2P3,ZP3P2,ZP3P1
+  REAL, DIMENSION(3)                  :: ZPP0,ZFT1,ZFT2,ZFT3,ZFT1B,ZFT2B,ZFT3B,ZR,ZPPP0,ZP3P0,ZP0P1
+  REAL, DIMENSION(3)                  :: ZPPP0P3,ZP1P3,ZPCP0,ZR0
+  REAL, DIMENSION(:), ALLOCATABLE     :: ZSTEMP,ZRDIR,ZVECTDISTPLUS,ZVECTDISTMOINS,ZVECTDIST!,ZFACE
+  REAL, DIMENSION(:,:), ALLOCATABLE   :: ZC
+  REAL                                :: ZF1,ZF2,ZF3,ZF1B,ZF2B,ZF3B,ZDPP0PPP0
+  REAL                                :: ZT,ZSIGN,ZS,ZDIST,ZDP0PP0,ZNNORM,ZRN,ZPHI_OLD
+  TYPE(LIST_ll), POINTER              :: TZFIELDS_ll   ! list of fields to exchange
+  INTEGER                             :: IINFO_ll,IMI  ! return code of parallel routine
+  INTEGER                             :: IIE,IIB,IJB,IJE,IKE,IKB,ZBPLUS
+  LOGICAL                             :: GABOVE_ROOF,LFACE,LDZ
+  LOGICAL, DIMENSION(:), ALLOCATABLE  :: ZFACE
+  INTEGER                             :: ZCOUNT,ZIDX,ZII,ZCHANGE,ZCHANGE1
+  REAL                                :: ZDIFF,ZMIN_DIFF,ZDX
+  !
+  !------------------------------------------------------------------------------
+  !   
+  !       0.3 allocation
+  !
+  NULLIFY(TZFIELDS_ll)
+  IIU = SIZE(PPHI,1)
+  IJU = SIZE(PPHI,2)
+  IKU = SIZE(PPHI,3)
+  IIB=1+JPHEXT
+  IIE=IIU-JPHEXT
+  IJB=1+JPHEXT
+  IJE=IJU-JPHEXT
+  IKB=1+JPVEXT
+  IKE=IKU-JPVEXT
+  !
+  JK_MIN = 1 + JPVEXT
+  JK_MAX = IKU - JPVEXT
+  !
+  CALL GET_INDICE_ll (JI_MIN,JJ_MIN,JI_MAX,JJ_MAX)
+  !
+  ALLOCATE(ZXHATM(IIU,IJU,IKU))
+  ALLOCATE(ZYHATM(IIU,IJU,IKU))
+  ALLOCATE(ZZHATM(IIU,IJU,IKU))
+  !
+  !-------------------------------------------------------------------------------
+  !
+  !**** 1. PRELIMINARIES
+  !     ----------------
+  !
+  INUMB_FACES = SIZE(PIBM_FACES,1)
+  ALLOCATE(ZC(INUMB_FACES,3))
+  ALLOCATE(ZSTEMP(1))
+  ALLOCATE(ZRDIR(1))  
+  PPHI = -XUNDEF
+  ALLOCATE(ZDP0PP0PAST(IIU,IJU,IKU))
+  ZDP0PP0PAST = 0.
+  ALLOCATE(ZVECTDIST(10000))
+  ALLOCATE(ZVECTDISTPLUS(10000))
+  ALLOCATE(ZVECTDISTMOINS(10000))
+  ALLOCATE(ZFACE(10000))
+  ZFACE=.FALSE.
+  !      
+  !-------------------------------------------------------------------------------
+  !
+  !**** 2. EXECUTIONS
+  !     -------------
+  !
+  JM=1
+  YPOS = 'P'
+  !
+  CALL IBM_INTERPOS(ZXHATM,ZYHATM,ZZHATM,YPOS)
+  ZDX = ZXHATM(JI_MIN+1,JJ_MIN,JK_MIN)-ZXHATM(JI_MIN,JJ_MIN,JK_MIN)
+  !
+  DO JK = JK_MIN,JK_MAX
+     DO JJ = JJ_MIN,JJ_MAX
+        DO JI = JI_MIN,JI_MAX
+           ZCOUNT = 1
+           ZVECTDIST = -999.
+           DO JN = 1,INUMB_FACES
+              LFACE=.FALSE.
+              !***Calcul of the face center
+              ZC(JN,1)=(PIBM_FACES(JN,1,1)+PIBM_FACES(JN,2,1)+PIBM_FACES(JN,3,1))/3.
+              ZC(JN,2)=(PIBM_FACES(JN,1,2)+PIBM_FACES(JN,2,2)+PIBM_FACES(JN,3,2))/3.
+              ZC(JN,3)=(PIBM_FACES(JN,1,3)+PIBM_FACES(JN,2,3)+PIBM_FACES(JN,3,3))/3.
+              !***Norm normalization
+              ZNNORM = SQRT(PNORM_FACES(JN,1)**2+PNORM_FACES(JN,2)**2+PNORM_FACES(JN,3)**2)
+              !***Vector between the face center and the current grid point
+              ZPCP0(1) = ZXHATM(JI,JJ,JK)-ZC(JN,1)
+              ZPCP0(2) = ZYHATM(JI,JJ,JK)-ZC(JN,2)
+              ZPCP0(3) = ZZHATM(JI,JJ,JK)-ZC(JN,3)
+              ZSIGN = ZPCP0(1)*PNORM_FACES(JN,1)+ &
+                      ZPCP0(2)*PNORM_FACES(JN,2)+ &
+                      ZPCP0(3)*PNORM_FACES(JN,3)
+              !***Various vectors
+              ZP1P0(1) = ZXHATM(JI,JJ,JK)-PIBM_FACES(JN,1,1)
+              ZP1P0(2) = ZYHATM(JI,JJ,JK)-PIBM_FACES(JN,1,2)
+              ZP1P0(3) = ZZHATM(JI,JJ,JK)-PIBM_FACES(JN,1,3)
+              ZP3P0(1) = ZXHATM(JI,JJ,JK)-PIBM_FACES(JN,3,1)
+              ZP3P0(2) = ZYHATM(JI,JJ,JK)-PIBM_FACES(JN,3,2)
+              ZP3P0(3) = ZZHATM(JI,JJ,JK)-PIBM_FACES(JN,3,3)
+              ZP0P1(1) = PIBM_FACES(JN,1,1)-ZXHATM(JI,JJ,JK)
+              ZP0P1(2) = PIBM_FACES(JN,1,2)-ZYHATM(JI,JJ,JK)
+              ZP0P1(3) = PIBM_FACES(JN,1,3)-ZZHATM(JI,JJ,JK)
+              ZP2P0(1) = ZXHATM(JI,JJ,JK)-PIBM_FACES(JN,2,1)
+              ZP2P0(2) = ZYHATM(JI,JJ,JK)-PIBM_FACES(JN,2,2)
+              ZP2P0(3) = ZZHATM(JI,JJ,JK)-PIBM_FACES(JN,2,3)
+              !***Equation (3) of Jones (1995)
+              IF(ZP1P0(1)==0.AND.ZP1P0(2)==0.AND.ZP1P0(3)==0) THEN
+                 WRITE(*,*) 'ZP1P0(1,2,3)',ZP1P0(1),ZP1P0(2),ZP1P0(3)
+                 ZDP0PP0 = 0.
+              ELSE
+                 ZDP0PP0 = SQRT(ZP0P1(1)**2+ZP0P1(2)**2+ZP0P1(3)**2)* &
+                        ((ZP1P0(1)*PNORM_FACES(JN,1)+ZP1P0(2)*PNORM_FACES(JN,2)+&
+                         ZP1P0(3)*PNORM_FACES(JN,3))/( &
+                        SQRT((ZP1P0(1))**2+(ZP1P0(2))**2+(ZP1P0(3))**2)*ZNNORM))
+              END IF
+              !***Equation (4) of Jones (1995)
+              ZP0PP0(1) = -ZDP0PP0*(PNORM_FACES(JN,1)/ZNNORM)
+              ZP0PP0(2) = -ZDP0PP0*(PNORM_FACES(JN,2)/ZNNORM)
+              ZP0PP0(3) = -ZDP0PP0*(PNORM_FACES(JN,3)/ZNNORM)
+              !***Equation (5) of Jones (1995)
+              ZPP0(1) = ZXHATM(JI,JJ,JK)+ZP0PP0(1)
+              ZPP0(2) = ZYHATM(JI,JJ,JK)+ZP0PP0(2)
+              ZPP0(3) = ZZHATM(JI,JJ,JK)+ZP0PP0(3)
+              !
+              ZP1PP0(1)=ZPP0(1)-PIBM_FACES(JN,1,1)
+              ZP1PP0(2)=ZPP0(2)-PIBM_FACES(JN,1,2)
+              ZP1PP0(3)=ZPP0(3)-PIBM_FACES(JN,1,3)
+              !
+              ZP2PP0(1)=ZPP0(1)-PIBM_FACES(JN,2,1)
+              ZP2PP0(2)=ZPP0(2)-PIBM_FACES(JN,2,2)
+              ZP2PP0(3)=ZPP0(3)-PIBM_FACES(JN,2,3)
+              !
+              ZP3PP0(1)=ZPP0(1)-PIBM_FACES(JN,3,1)
+              ZP3PP0(2)=ZPP0(2)-PIBM_FACES(JN,3,2)
+              ZP3PP0(3)=ZPP0(3)-PIBM_FACES(JN,3,3)
+              !
+              ZPP0P1(1)=PIBM_FACES(JN,1,1)-ZPP0(1)
+              ZPP0P1(2)=PIBM_FACES(JN,1,2)-ZPP0(2)
+              ZPP0P1(3)=PIBM_FACES(JN,1,3)-ZPP0(3)
+              !
+              ZPP0P2(1)=PIBM_FACES(JN,2,1)-ZPP0(1)
+              ZPP0P2(2)=PIBM_FACES(JN,2,2)-ZPP0(2)
+              ZPP0P2(3)=PIBM_FACES(JN,2,3)-ZPP0(3)
+              !
+              ZPP0P3(1)=PIBM_FACES(JN,3,1)-ZPP0(1)
+              ZPP0P3(2)=PIBM_FACES(JN,3,2)-ZPP0(2)
+              ZPP0P3(3)=PIBM_FACES(JN,3,3)-ZPP0(3)
+              !
+              !***Calculation of f1,f2,f3 (Jones (1995))
+              ZFT1= CROSSPRODUCT(PV1(JN,:),ZP1PP0)
+              ZFT2= CROSSPRODUCT(PV2(JN,:),ZP2PP0)
+              ZFT3= CROSSPRODUCT(PV3(JN,:),ZP3PP0)
+
+              ZF1 =ZFT1(1)*PNORM_FACES(JN,1)+ &
+                   ZFT1(2)*PNORM_FACES(JN,2)+ &
+                   ZFT1(3)*PNORM_FACES(JN,3)
+
+              ZF2 =ZFT2(1)*PNORM_FACES(JN,1)+ &
+                   ZFT2(2)*PNORM_FACES(JN,2)+ &
+                   ZFT2(3)*PNORM_FACES(JN,3)
+
+              ZF3 =ZFT3(1)*PNORM_FACES(JN,1)+ &
+                   ZFT3(2)*PNORM_FACES(JN,2)+ &
+                   ZFT3(3)*PNORM_FACES(JN,3)
+              !***Point anticlockwise of V1 and clockwise of V2
+              IF (ZF1.GE.0.AND.ZF2.LE.0) THEN
+                 ZFT1B = CROSSPRODUCT(ZPP0P1,ZPP0P2)
+                 ZF1B = ZFT1B(1)*PNORM_FACES(JN,1)+ &
+                      ZFT1B(2)*PNORM_FACES(JN,2)+ &
+                      ZFT1B(3)*PNORM_FACES(JN,3)
+                 IF (ZF1B<0) THEN
+                    ZP1P2(:) = PIBM_FACES(JN,2,:)-PIBM_FACES(JN,1,:)
+                    ZR = CROSSPRODUCT(CROSSPRODUCT(ZPP0P2,ZPP0P1),ZP1P2)
+                    ZRN = SQRT(ZR(1)**2+ZR(2)**2+ZR(3)**2)    
+                    !***Eq. (10) of Jones(1995)
+                    ZDPP0PPP0 = SQRT(ZPP0P1(1)**2+ZPP0P1(2)**2+ZPP0P1(3)**2)* &
+                                ((ZPP0P1(1)*ZR(1)+ZPP0P1(2)*ZR(2)+ZPP0P1(3)*ZR(3))/( &
+                                SQRT(ZPP0P1(1)**2+ZPP0P1(2)**2+ZPP0P1(3)**2)*ZRN))! &
+                    ZPP0PPP0 = ZDPP0PPP0*(ZR/ZRN)
+                    ZPPP0 = ZPP0+ZPP0PPP0
+                    ZPPP0P1 = PIBM_FACES(JN,1,:)-ZPPP0
+                    ZP2P1 = PIBM_FACES(JN,1,:)-PIBM_FACES(JN,2,:)
+                    ZRDIR = SIGN(1.,SCALPRODUCT(ZPPP0P1,ZP2P1))
+                    ZT = SQRT(ZPPP0P1(1)**2+ZPPP0P1(2)**2+ZPPP0P1(3)**2)/ &
+                         SQRT(ZP2P1(1)**2+ZP2P1(2)**2+ZP2P1(3)**2)*ZRDIR(1)
+                    IF (ZT.GE.0.AND.ZT.LE.1) THEN
+                       ZDIST =SQRT(ZDPP0PPP0**2+ZDP0PP0**2)
+                    ELSEIF (ZT<0.) THEN
+                       ZDIST = SQRT(ZP1P0(1)**2+ZP1P0(2)**2+ZP1P0(3)**2)
+                    ELSEIF (ZT>1.) THEN
+                       ZDIST = SQRT(ZP2P0(1)**2+ZP2P0(2)**2+ZP2P0(3)**2)
+                    ELSE
+                       call Print_msg( NVERB_FATAL, 'GEN', 'IBM_PREP_LS', 'Error in ZT calculation' )
+                    ENDIF
+                 ELSE
+                    ZDIST = ZDP0PP0 
+                    LFACE = .TRUE.                    
+                 ENDIF
+              !***Point anticlockwise of V2 and clockwise of V3
+              ELSEIF (ZF2.GE.0.AND.ZF3.LE.0) THEN
+                 ZFT2B = CROSSPRODUCT(ZPP0P2,ZPP0P3)
+                 ZF2B = ZFT2B(1)*PNORM_FACES(JN,1)+ &
+                      ZFT2B(2)*PNORM_FACES(JN,2)+ &
+                      ZFT2B(3)*PNORM_FACES(JN,3)
+                 IF (ZF2B<0) THEN
+                    ZP2P3(:) = PIBM_FACES(JN,3,:)-PIBM_FACES(JN,2,:)
+                    ZR = CROSSPRODUCT(CROSSPRODUCT(ZPP0P3,ZPP0P2),ZP2P3)
+                    ZRN = SQRT(ZR(1)**2+ZR(2)**2+ZR(3)**2)
+                    ZDPP0PPP0 = SQRT(ZPP0P2(1)**2+ZPP0P2(2)**2+ZPP0P2(3)**2)* &
+                         ((ZPP0P2(1)*ZR(1)+ZPP0P2(2)*ZR(2)+ZPP0P2(3)*ZR(3))/( &
+                         SQRT(ZPP0P2(1)**2+ZPP0P2(2)**2+ZPP0P2(3)**2)*ZRN))! &
+                    ZPP0PPP0 = ZDPP0PPP0*(ZR/ZRN)
+                    ZPPP0 = ZPP0+ZPP0PPP0
+                    ZPPP0P2 = PIBM_FACES(JN,2,:)-ZPPP0
+                    ZP3P2 = PIBM_FACES(JN,2,:)-PIBM_FACES(JN,3,:)
+                    ZRDIR = SIGN(1.,SCALPRODUCT(ZPPP0P2,ZP3P2))
+                    ZT = SQRT(ZPPP0P2(1)**2+ZPPP0P2(2)**2+ZPPP0P2(3)**2)/ &
+                         SQRT(ZP3P2(1)**2+ZP3P2(2)**2+ZP3P2(3)**2)*ZRDIR(1)
+                    IF (ZT.GE.0.AND.ZT.LE.1) THEN
+                       ZDIST = SQRT(ZDPP0PPP0**2+ZDP0PP0**2)
+                    ELSEIF (ZT<0.) THEN
+                       ZDIST = SQRT(ZP2P0(1)**2+ZP2P0(2)**2+ZP2P0(3)**2)
+                    ELSEIF (ZT>1.) THEN
+                       ZDIST = SQRT(ZP3P0(1)**2+ZP3P0(2)**2+ZP3P0(3)**2)
+                    ELSE
+                       call Print_msg( NVERB_FATAL, 'GEN', 'IBM_PREP_LS', 'Error in ZT calculation' )
+                    ENDIF
+                 ELSE
+                    ZDIST = ZDP0PP0
+                    LFACE = .TRUE.                    
+                 ENDIF
+              !***Point anticlockwise of V3 and clockwise of V1
+              ELSEIF (ZF3.GE.0.AND.ZF1.LE.0) THEN
+                 ZFT3B = CROSSPRODUCT(ZPP0P3,ZPP0P1)
+                 ZF3B = ZFT3B(1)*PNORM_FACES(JN,1)+ &
+                      ZFT3B(2)*PNORM_FACES(JN,2)+ &
+                      ZFT3B(3)*PNORM_FACES(JN,3)
+                 IF (ZF3B<0) THEN
+                    ZP3P1(:) = PIBM_FACES(JN,1,:)-PIBM_FACES(JN,3,:)
+                    ZR = CROSSPRODUCT(CROSSPRODUCT(ZPP0P1,ZPP0P3),ZP3P1)
+                    ZRN = SQRT(ZR(1)**2+ZR(2)**2+ZR(3)**2)
+                    ZDPP0PPP0 = SQRT(ZPP0P3(1)**2+ZPP0P3(2)**2+ZPP0P3(3)**2)* &
+                         ((ZPP0P3(1)*ZR(1)+ZPP0P3(2)*ZR(2)+ZPP0P3(3)*ZR(3))/( &
+                         SQRT((ZPP0P3(1))**2+(ZPP0P3(2))**2+(ZPP0P3(3))**2)*ZRN))! &
+                    ZPP0PPP0 = ZDPP0PPP0*(ZR/ZRN)
+                    ZPPP0 = ZPP0+ZPP0PPP0
+                    ZPPP0P3 = PIBM_FACES(JN,3,:)-ZPPP0
+                    ZP1P3 = PIBM_FACES(JN,3,:)-PIBM_FACES(JN,1,:)
+                    ZRDIR = SIGN(1.,SCALPRODUCT(ZPPP0P3,ZP1P3))
+                    ZT = SQRT(ZPPP0P3(1)**2+ZPPP0P3(2)**2+ZPPP0P3(3)**2)/ &
+                         SQRT(ZP1P3(1)**2+ZP1P3(2)**2+ZP1P3(3)**2)*ZRDIR(1)
+                    IF (ZT.GE.0.AND.ZT.LE.1) THEN
+                       ZDIST = SQRT(ZDPP0PPP0**2+ZDP0PP0**2)
+                    ELSEIF (ZT<0.) THEN
+                       ZDIST = SQRT(ZP3P0(1)**2+ZP3P0(2)**2+ZP3P0(3)**2)
+                    ELSEIF (ZT>1.) THEN
+                       ZDIST = SQRT(ZP1P0(1)**2+ZP1P0(2)**2+ZP1P0(3)**2)
+                    ELSE
+                       call Print_msg( NVERB_FATAL, 'GEN', 'IBM_PREP_LS', 'Error in ZT calculation' )
+                    ENDIF
+                 ELSE
+                    ZDIST = ZDP0PP0
+                    LFACE = .TRUE.
+                 ENDIF
+              ELSE
+                 call Print_msg( NVERB_FATAL, 'GEN', 'IBM_PREP_LS', 'Error in ZF instruction' )
+              ENDIF
+              ZDIST = SIGN(ZDIST,-ZSIGN)
+              ZDIST = ANINT(ZDIST*10.E5) / 10.E5
+              PPHI(JI,JJ,JK,JM) = ANINT(PPHI(JI,JJ,JK,JM)*10.E5) / 10.E5
+              IF (ABS(ZDIST).LE.ABS(PPHI(JI,JJ,JK,JM))) THEN
+                 ZPHI_OLD = PPHI(JI,JJ,JK,JM)
+                 IF (ABS(ZDIST)==ABS(PPHI(JI,JJ,JK,JM))) THEN
+                    IF (ABS(ZDP0PP0).GT.ABS(ZDP0PP0PAST(JI,JJ,JK))) THEN
+                       PPHI(JI,JJ,JK,JM) = ZDIST
+                       ZDP0PP0PAST(JI,JJ,JK) = ZDP0PP0
+                    ENDIF
+                 ELSE
+                    PPHI(JI,JJ,JK,JM) = ZDIST
+                 ENDIF
+                 IF (ABS(ZDIST).LT.ABS(ZPHI_OLD)) THEN        
+                    ZDP0PP0PAST(JI,JJ,JK) = ZDP0PP0
+                 ENDIF
+              ENDIF
+              IF (ABS(PPHI(JI,JJ,JK,JM)).GT.(SQRT(3.)*4.)) THEN
+                 PPHI(JI,JJ,JK,JM) = -999.
+              ENDIF
+              IF (ABS(ZDIST).LT.(SQRT(3.)*4.)) THEN
+                 ZVECTDIST(ZCOUNT)=ZDIST
+                 ZFACE(ZCOUNT)=LFACE
+                 ZCOUNT = ZCOUNT +1
+              ENDIF
+           ENDDO
+           ZVECTDISTPLUS=ZVECTDIST
+           ZVECTDISTMOINS=ZVECTDIST
+           WHERE (ZVECTDIST.GT.0)
+                 ZVECTDISTMOINS=-999. 
+           ENDWHERE
+           WHERE (ZVECTDIST.LT.0)
+                 ZVECTDISTPLUS=999.
+           ENDWHERE
+           IF (ANY(ZVECTDIST.GT.0.).AND.(ABS(ABS(MINVAL(ZVECTDISTPLUS))-ABS(MAXVAL(ZVECTDISTMOINS))).LT.10.E-6)) THEN
+              ZMIN_DIFF = 1.
+              ZIDX = 0
+              DO ZII = 1, SIZE(ZVECTDIST)
+                 ZDIFF = ABS(ZVECTDIST(ZII)-MINVAL(ZVECTDISTPLUS))
+                 IF ( ZDIFF < ZMIN_DIFF) THEN
+                    ZIDX = ZII
+                    ZMIN_DIFF = ZDIFF
+                 ENDIF
+               ENDDO
+               IF (ZFACE(ZIDX)) THEN
+                  PPHI(JI,JJ,JK,JM) = MINVAL(ZVECTDISTPLUS)
+               ENDIF   
+           ENDIF
+        ENDDO
+     ENDDO
+  ENDDO
+
+DO JJ=JJ_MIN,JJ_MAX
+DO JI=JI_MIN,JI_MAX
+GABOVE_ROOF=.FALSE.
+DO JK=IKB, IKE
+  ! check if point is flagged as not calculated
+  IF (PPHI(JI,JJ,JK,JM)==-999.) THEN
+     ! check if point is already above a point that encountered a point near the
+     ! surface (that can be outside or inside a building)
+     ! check if that point was inside (if outside, the value of the levelset
+     ! stays at -999.)
+     IF (GABOVE_ROOF .AND. PPHI(JI,JJ,JK-1,JM) > XIBM_EPSI) THEN
+       PPHI(JI,JJ,JK,JM) = 999.
+       CYCLE
+     END IF
+    ! check if the point of the column have not encoutered a near-building
+    ! surface point with a physical value of the level set
+    IF (.NOT. GABOVE_ROOF) THEN
+      ! if the point above has a physical value for the level set, then the
+      ! status inside (999) or outside (-999) is given to all points below,
+      ! depending if this point above (that needs not to be the point at the top
+      ! of the model!) is inside or outside
+      ! checks if the point above has a physical value for the levelset                   
+      IF (JK<IKE .AND. ABS (PPHI(JI,JJ,JK+1,JM)) < 900.) THEN
+         ! if the point above is inside, all points below are set inside
+         IF (PPHI(JI,JJ,JK+1,JM)>XIBM_EPSI) PPHI(JI,JJ,IKB:JK,JM) = 999.
+         ! indicate for further processing of points above the current point
+         ! that we have encountered a physical value of the level set, near the
+         ! surface building
+         GABOVE_ROOF = .TRUE.
+      END IF
+      CYCLE
+    ENDIF
+  END IF
+  ! if we have never encoutered a roof or point near a building form above,
+  ! then, we are outside, and nothing is changed (value -999 kept)
+  END DO
+  PPHI(JI,JJ,IKB-1,JM) = PPHI(JI,JJ,IKB,JM)
+  PPHI(JI,JJ,IKE+1,JM) = PPHI(JI,JJ,IKE,JM)
+END DO
+END DO
+
+
+JN=1
+PPHI(:,:,IKB-1,JN)=2*PPHI(:,:,IKB,JN)-PPHI(:,:,IKB+1,JN)
+PPHI(:,:,IKE+1,JN)=2*PPHI(:,:,IKE,JN)-PPHI(:,:,IKE-1,JN)
+PPHI(IIB-1,:,:,JN) = PPHI(    IIB  ,:,:,JN)
+PPHI(IIE+1,:,:,JN) = PPHI(    IIE  ,:,:,JN)
+PPHI(:,IJB-1,:,JN) = PPHI(:,    IJB  ,:,JN)
+PPHI(:,IJE+1,:,JN) = PPHI(:,    IJE  ,:,JN)
+
+PPHI(:,:,:,2)=MXM(PPHI(:,:,:,1))
+PPHI(:,:,:,3)=MYM(PPHI(:,:,:,1))
+PPHI(:,:,:,4)=MZM(PPHI(:,:,:,1))
+
+NULLIFY(TZFIELDS_ll)
+DO JN=2,4
+  PPHI(:,:,IKB-1,JN)=2*PPHI(:,:,IKB,JN)-PPHI(:,:,IKB+1,JN)
+  PPHI(:,:,IKE+1,JN)=2*PPHI(:,:,IKE,JN)-PPHI(:,:,IKE-1,JN)
+    PPHI(IIB-1,:,:,JN) = PPHI(    IIB  ,:,:,JN)
+    PPHI(IIE+1,:,:,JN) = PPHI(    IIE  ,:,:,JN)
+    PPHI(:,IJB-1,:,JN) = PPHI(:,    IJB  ,:,JN)
+    PPHI(:,IJE+1,:,JN) = PPHI(:,    IJE  ,:,JN)
+ENDDO
+
+PPHI(:,:,:,5)=MYM(PPHI(:,:,:,2))
+PPHI(:,:,:,6)=MXM(PPHI(:,:,:,4))
+PPHI(:,:,:,7)=MYM(PPHI(:,:,:,4))
+NULLIFY(TZFIELDS_ll)
+DO JN=5,7
+  PPHI(:,:,IKB-1,JN)=2*PPHI(:,:,IKB,JN)-PPHI(:,:,IKB+1,JN)
+  PPHI(:,:,IKE+1,JN)=2*PPHI(:,:,IKE,JN)-PPHI(:,:,IKE-1,JN)
+    PPHI(IIB-1,:,:,JN) = PPHI(    IIB  ,:,:,JN)
+    PPHI(IIE+1,:,:,JN) = PPHI(    IIE  ,:,:,JN)
+    PPHI(:,IJB-1,:,JN) = PPHI(:,    IJB  ,:,JN)
+    PPHI(:,IJE+1,:,JN) = PPHI(:,    IJE  ,:,JN)
+ENDDO
+WHERE (ABS(PPHI(:,:,:,:)).LT.XIBM_EPSI) PPHI(:,:,:,:)=2.*XIBM_EPSI
+
+
+  !COMPLETE PPHI ON THE HALO OF EACH SUBDOMAINS
+  DO JN=1,7
+     CALL ADD3DFIELD_ll(TZFIELDS_ll,PPHI(:,:,:,JN),'IBM_GENERLS::PPHI')
+  ENDDO
+  CALL UPDATE_HALO_ll(TZFIELDS_ll,IINFO_ll)
+  CALL CLEANLIST_ll(TZFIELDS_ll)
+
+  !
+  !-------------------------------------------------------------------------------
+  !
+  !**** X. DEALLOCATIONS/CLOSES
+  !     -----------------------
+  !  
+  !DEALLOCATE(ZDP0PP0,ZDIST,ZC,ZSTEMP)
+  DEALLOCATE(ZC,ZSTEMP)
+  DEALLOCATE(ZXHATM,ZYHATM,ZZHATM)              
+  !
+  RETURN
+  !
+CONTAINS
+  !
+  FUNCTION CROSSPRODUCT(PA,PB) RESULT(CROSS)
+    !
+    REAL, DIMENSION(3)             :: CROSS
+    REAL, DIMENSION(3), INTENT(IN) :: PA, PB
+    CROSS(1) = PA(2) * PB(3) - PA(3) * PB(2)
+    CROSS(2) = PA(3) * PB(1) - PA(1) * PB(3)
+    CROSS(3) = PA(1) * PB(2) - PA(2) * PB(1)
+  END FUNCTION CROSSPRODUCT
+
+  FUNCTION SCALPRODUCT(PA,PB) RESULT(SCAL)
+    !
+    REAL                           :: SCAL
+    REAL, DIMENSION(3), INTENT(IN) :: PA, PB
+    SCAL = PA(1)*PB(1)+PA(2)*PB(2)+PA(3)*PB(3)
+  END FUNCTION SCALPRODUCT
+
+END SUBROUTINE IBM_GENERLS
diff --git a/src/PHYEX/ext/ice_adjust_bis.f90 b/src/PHYEX/ext/ice_adjust_bis.f90
new file mode 100644
index 0000000000000000000000000000000000000000..e530d5c21f91b7e143b2d7240f669e4df7c181bd
--- /dev/null
+++ b/src/PHYEX/ext/ice_adjust_bis.f90
@@ -0,0 +1,160 @@
+!MNH_LIC Copyright 2012-2019 CNRS, Meteo-France and Universite Paul Sabatier
+!MNH_LIC This is part of the Meso-NH software governed by the CeCILL-C licence
+!MNH_LIC version 1. See LICENSE, CeCILL-C_V1-en.txt and CeCILL-C_V1-fr.txt
+!MNH_LIC for details. version 1.
+!-----------------------------------------------------------------
+!     ######spl
+     MODULE MODI_ICE_ADJUST_BIS
+!    ###############################
+!
+INTERFACE
+!
+!     #################################################################
+      SUBROUTINE ICE_ADJUST_BIS(PP,PTH,PR)
+!     #################################################################
+!
+!!               
+!*               1.1  Declaration of Arguments
+!! 
+
+REAL, DIMENSION(:,:,:),  INTENT(IN)     :: PP     ! Pressure
+REAL, DIMENSION(:,:,:),  INTENT(INOUT)  :: PTH    ! thetal to transform into th
+REAL, DIMENSION(:,:,:,:),INTENT(INOUT)  :: PR     ! Total mixing ratios to transform into rv,rc and ri
+!
+END SUBROUTINE ICE_ADJUST_BIS
+
+END INTERFACE
+!
+END MODULE MODI_ICE_ADJUST_BIS
+!     ######spl
+      SUBROUTINE ICE_ADJUST_BIS(PP,PTH,PR)
+!     #################################################################
+!
+!
+!!****  *ICE_ADJUST_BIS* - computes an adjusted state of thermodynamical variables
+!!
+!!    PURPOSE
+!!    -------
+!!
+!!**  METHOD
+!!    ------
+!!
+!!
+!!    EXTERNAL
+!!    --------
+!!
+!!    IMPLICIT ARGUMENTS
+!!    ------------------
+!!
+!!
+!!    REFERENCE
+!!    ---------
+!!
+!!    AUTHOR
+!!    ------
+!!      Valery Masson & C. Lac * Meteo-France *
+!!
+!!    MODIFICATIONS
+!!    -------------
+!!      Original         09/2012
+!!      M.Moge           08/2015 UPDATE_HALO_ll on PTH, ZRV, ZRC, ZRI
+!  P. Wautelet 20/05/2019: add name argument to ADDnFIELD_ll + new ADD4DFIELD_ll subroutine
+!!
+!! --------------------------------------------------------------------------
+!
+!*      0. DECLARATIONS
+!          ------------
+!
+USE MODD_CST, ONLY : XCPD, XRD, XP00, CST
+USE MODD_NEB_n, ONLY : NEBN
+!
+USE MODI_COMPUTE_FUNCTION_THERMO
+USE MODI_THLRT_FROM_THRVRCRI
+!
+USE MODE_ll
+!
+IMPLICIT NONE
+!
+!
+!*      0.1  declarations of arguments
+!
+REAL, DIMENSION(:,:,:),  INTENT(IN)     :: PP    ! Pressure
+REAL, DIMENSION(:,:,:),  INTENT(INOUT)  :: PTH   ! thetal to transform into th
+REAL, DIMENSION(:,:,:,:),INTENT(INOUT)  :: PR    ! Total mixing ratios to transform into rv,rc and ri
+!
+!-------------------------------------------------------------------------------
+!
+!       0.2  declaration of local variables
+REAL, DIMENSION(SIZE(PTH,1),SIZE(PTH,2),SIZE(PTH,3)) :: ZTHL, ZRW, ZRV, ZRC, &
+                                                        ZRI, ZWORK
+REAL, DIMENSION(SIZE(PTH,1),SIZE(PTH,2),SIZE(PTH,3)) :: ZFRAC_ICE, ZRSATW, ZRSATI
+REAL, DIMENSION(SIZE(PTH,1),SIZE(PTH,2),SIZE(PTH,3)) :: ZT, ZEXN, ZLVOCPEXN,ZLSOCPEXN
+REAL, DIMENSION(SIZE(PTH,1),SIZE(PTH,2),SIZE(PTH,3), 16) :: ZBUF
+INTEGER :: IRR
+CHARACTER(LEN=1) :: YFRAC_ICE
+!
+INTEGER :: IINFO_ll
+TYPE(LIST_ll), POINTER :: TZFIELDS_ll=>NULL()   ! list of fields to exchange
+!----------------------------------------------------------------------------
+!
+!*      1 Initialisation
+!         --------------
+!
+IRR = SIZE(PR,4)
+!
+ZRV(:,:,:)=0.
+IF (IRR>=1) &
+ZRV(:,:,:)=PR(:,:,:,1)
+ZRC(:,:,:)=0.
+IF (IRR>=2) &
+ZRC(:,:,:)=PR(:,:,:,2)
+ZRI(:,:,:)=0.
+IF (IRR>=4) &
+ZRI(:,:,:)=PR(:,:,:,4)
+!
+YFRAC_ICE='T'
+ZFRAC_ICE(:,:,:) = 0.
+!
+!*      2 Computation
+!         -----------
+!
+ZEXN(:,:,:)=(PP(:,:,:)/XP00)**(XRD/XCPD)
+!
+CALL COMPUTE_FUNCTION_THERMO( IRR,                                &
+                              PTH, PR, ZEXN, PP,                  &
+                              ZT,ZLVOCPEXN,ZLSOCPEXN              )
+
+!
+CALL THLRT_FROM_THRVRCRI( IRR, PTH, PR, ZLVOCPEXN, ZLSOCPEXN,&
+                          ZTHL, ZRW                          )
+!
+CALL TH_R_FROM_THL_RT(CST, NEBN, SIZE(ZFRAC_ICE), YFRAC_ICE,ZFRAC_ICE(:,:,:),PP(:,:,:), &
+                         ZTHL(:,:,:), ZRW(:,:,:), PTH(:,:,:),  &
+                         ZRV(:,:,:), ZRC(:,:,:), ZRI(:,:,:),   &
+                         ZRSATW(:,:,:), ZRSATI(:,:,:),OOCEAN=.FALSE.,&
+                         PBUF=ZBUF)
+CALL ADD3DFIELD_ll( TZFIELDS_ll, PTH, 'ICE_ADJUST_BIS::PTH')
+IF (IRR>=1) THEN
+  CALL ADD3DFIELD_ll( TZFIELDS_ll, ZRV, 'ICE_ADJUST_BIS::ZRV' )
+ENDIF
+IF (IRR>=2) THEN
+  CALL ADD3DFIELD_ll( TZFIELDS_ll, ZRC, 'ICE_ADJUST_BIS::ZRC' )
+ENDIF
+IF (IRR>=4) THEN
+  CALL ADD3DFIELD_ll( TZFIELDS_ll, ZRI, 'ICE_ADJUST_BIS::ZRI' )
+ENDIF
+CALL UPDATE_HALO_ll(TZFIELDS_ll,IINFO_ll)
+CALL CLEANLIST_ll(TZFIELDS_ll)
+!
+
+IF (IRR>=1) &
+PR(:,:,:,1) = ZRV(:,:,:)
+IF (IRR>=2) &
+PR(:,:,:,2) = ZRC(:,:,:)
+IF (IRR>=4) &
+PR(:,:,:,4) = ZRI(:,:,:)
+!
+CONTAINS
+INCLUDE "th_r_from_thl_rt.func.h"
+INCLUDE "compute_frac_ice.func.h"
+END SUBROUTINE ICE_ADJUST_BIS
diff --git a/src/PHYEX/ext/ini_budget.f90 b/src/PHYEX/ext/ini_budget.f90
new file mode 100644
index 0000000000000000000000000000000000000000..6e8895afca14422904c7d7c6af66ad6a8063dd10
--- /dev/null
+++ b/src/PHYEX/ext/ini_budget.f90
@@ -0,0 +1,4898 @@
+!MNH_LIC Copyright 1995-2023 CNRS, Meteo-France and Universite Paul Sabatier
+!MNH_LIC This is part of the Meso-NH software governed by the CeCILL-C licence
+!MNH_LIC version 1. See LICENSE, CeCILL-C_V1-en.txt and CeCILL-C_V1-fr.txt
+!MNH_LIC for details. version 1.
+!-----------------------------------------------------------------
+! Modifications:
+!  P. Wautelet 17/08/2020: add Budget_preallocate subroutine
+!-----------------------------------------------------------------
+module mode_ini_budget
+
+  use mode_msg
+
+  implicit none
+
+  private
+
+  public :: Budget_preallocate, Ini_budget
+
+  integer, parameter :: NSOURCESMAX = 60 !Maximum number of sources in a budget
+
+contains
+
+subroutine Budget_preallocate()
+
+use modd_budget, only: nbudgets, tbudgets,                                         &
+                       NBUDGET_U, NBUDGET_V, NBUDGET_W, NBUDGET_TH, NBUDGET_TKE,   &
+                       NBUDGET_RV, NBUDGET_RC, NBUDGET_RR, NBUDGET_RI, NBUDGET_RS, &
+                       NBUDGET_RG, NBUDGET_RH, NBUDGET_SV1
+use modd_nsv,    only: nsv, tsvlist
+
+integer          :: ibudget
+integer          :: jsv
+
+call Print_msg( NVERB_DEBUG, 'BUD', 'Budget_preallocate', 'called' )
+
+if ( allocated( tbudgets ) ) then
+  call Print_msg( NVERB_WARNING, 'BUD', 'Budget_preallocate', 'tbudgets already allocated' )
+  return
+end if
+
+nbudgets = NBUDGET_SV1 - 1 + nsv
+allocate( tbudgets( nbudgets ) )
+
+tbudgets(NBUDGET_U)%cname    = "UU"
+tbudgets(NBUDGET_U)%ccomment = "Budget for U"
+tbudgets(NBUDGET_U)%nid      = NBUDGET_U
+
+tbudgets(NBUDGET_V)%cname    = "VV"
+tbudgets(NBUDGET_V)%ccomment = "Budget for V"
+tbudgets(NBUDGET_V)%nid      = NBUDGET_V
+
+tbudgets(NBUDGET_W)%cname    = "WW"
+tbudgets(NBUDGET_W)%ccomment = "Budget for W"
+tbudgets(NBUDGET_W)%nid      = NBUDGET_W
+
+tbudgets(NBUDGET_TH)%cname    = "TH"
+tbudgets(NBUDGET_TH)%ccomment = "Budget for potential temperature"
+tbudgets(NBUDGET_TH)%nid      = NBUDGET_TH
+
+tbudgets(NBUDGET_TKE)%cname    = "TK"
+tbudgets(NBUDGET_TKE)%ccomment = "Budget for turbulent kinetic energy"
+tbudgets(NBUDGET_TKE)%nid      = NBUDGET_TKE
+
+tbudgets(NBUDGET_RV)%cname    = "RV"
+tbudgets(NBUDGET_RV)%ccomment = "Budget for water vapor mixing ratio"
+tbudgets(NBUDGET_RV)%nid      = NBUDGET_RV
+
+tbudgets(NBUDGET_RC)%cname    = "RC"
+tbudgets(NBUDGET_RC)%ccomment = "Budget for cloud water mixing ratio"
+tbudgets(NBUDGET_RC)%nid      = NBUDGET_RC
+
+tbudgets(NBUDGET_RR)%cname    = "RR"
+tbudgets(NBUDGET_RR)%ccomment = "Budget for rain water mixing ratio"
+tbudgets(NBUDGET_RR)%nid      = NBUDGET_RR
+
+tbudgets(NBUDGET_RI)%cname    = "RI"
+tbudgets(NBUDGET_RI)%ccomment = "Budget for cloud ice mixing ratio"
+tbudgets(NBUDGET_RI)%nid      = NBUDGET_RI
+
+tbudgets(NBUDGET_RS)%cname    = "RS"
+tbudgets(NBUDGET_RS)%ccomment = "Budget for snow/aggregate mixing ratio"
+tbudgets(NBUDGET_RS)%nid      = NBUDGET_RS
+
+tbudgets(NBUDGET_RG)%cname    = "RG"
+tbudgets(NBUDGET_RG)%ccomment = "Budget for graupel mixing ratio"
+tbudgets(NBUDGET_RG)%nid      = NBUDGET_RG
+
+tbudgets(NBUDGET_RH)%cname    = "RH"
+tbudgets(NBUDGET_RH)%ccomment = "Budget for hail mixing ratio"
+tbudgets(NBUDGET_RH)%nid      = NBUDGET_RH
+
+do jsv = 1, nsv
+  ibudget = NBUDGET_SV1 - 1 + jsv
+  tbudgets(ibudget)%cname    = Trim( tsvlist(jsv)%cmnhname )
+  tbudgets(ibudget)%ccomment = 'Budget for scalar variable ' // Trim( tsvlist(jsv)%cmnhname )
+  tbudgets(ibudget)%nid      = ibudget
+end do
+
+
+end subroutine Budget_preallocate
+
+
+!     #################################################################
+      SUBROUTINE Ini_budget(KLUOUT,PTSTEP,KSV,KRR,                    &
+      ONUMDIFU,ONUMDIFTH,ONUMDIFSV,                                   &
+      OHORELAX_UVWTH,OHORELAX_RV,OHORELAX_RC,OHORELAX_RR,             &
+      OHORELAX_RI,OHORELAX_RS, OHORELAX_RG, OHORELAX_RH,OHORELAX_TKE, &
+      OHORELAX_SV, OVE_RELAX, ove_relax_grd, OCHTRANS,                &
+      ONUDGING,ODRAGTREE,ODEPOTREE, ODRAGBLDG, OAERO_EOL,             &
+      HRAD,HDCONV,HSCONV,HTURB,HTURBDIM,HCLOUD                        )
+!     #################################################################
+!
+!!****  *INI_BUDGET* - routine to initialize the parameters for the budgets
+!!
+!!    PURPOSE
+!!    -------
+!       The purpose of this routine is to set or compute the parameters used
+!     by the MESONH budgets. Names of files for budget recording are processed 
+!     and storage arrays are initialized.               
+!
+!!**  METHOD
+!!    ------
+!!      The essential of information is passed by modules. The choice of budgets 
+!!    and processes set by the user as integers is converted in "actions" 
+!!    readable  by the subroutine BUDGET under the form of string characters. 
+!!    For each complete process composed of several elementary processes, names 
+!!    of elementary processes are concatenated in order to have an explicit name
+!!    in the comment of the recording file for budget. 
+!!
+!!      
+!!    EXTERNAL
+!!    --------   
+!!      None
+!!
+!!    IMPLICIT ARGUMENTS
+!!    ------------------ 
+!!      Modules MODD_*
+!!
+!!    REFERENCE
+!!    ---------
+!!      Book2 of documentation (routine INI_BUDGET)
+!!      
+!!
+!!    AUTHOR
+!!    ------
+!!	P. Hereil      * Meteo France *
+!!
+!!    MODIFICATIONS
+!!    -------------
+!!      Original        01/03/95 
+!!      J. Stein        25/06/95  put the sources in phase with the code
+!!      J. Stein        20/07/95  reset to FALSE of all the switches when
+!!                                CBUTYPE /= MASK or CART
+!!      J. Stein        26/06/96  add the new sources + add the increment between
+!!                                2 active processes
+!!      J.-P. Pinty     13/12/96  Allowance of multiple SVs
+!!      J.-P. Pinty     11/01/97  Includes deep convection ice and forcing processes
+!!      J.-P. Lafore    10/02/98  Allocation of the RHODJs for budget
+!!      V. Ducrocq      04/06/99  //  
+!!      N. Asencio      18/06/99  // MASK case : delete KIMAX and KJMAX arguments,
+!!                                GET_DIM_EXT_ll initializes the dimensions of the
+!!                                extended local domain.
+!!                                LBU_MASK and NBUSURF are allocated on the extended
+!!                                local domain.
+!!                                add 3 local variables IBUDIM1,IBUDIM2,IBUDIM3
+!!                                to define the dimensions of the budget arrays
+!!                                in the different cases CART and MASK
+!!      J.-P. Pinty     23/09/00  add budget for C2R2
+!!      V. Masson       18/11/02  add budget for 2way nesting
+!!      O.Geoffroy      03/2006   Add KHKO scheme
+!!      J.-P. Pinty     22/04/97  add the explicit hail processes
+!!      C.Lac           10/08/07  Add ADV for PPM without contribution
+!!                                of each direction
+!!      C. Barthe       19/11/09  Add atmospheric electricity
+!!      C.Lac           01/07/11  Add vegetation drag        
+!!      P. Peyrille, M. Tomasini : include in the forcing term the 2D forcing
+!!                                terms in term 2DFRC search for modif PP . but Not very clean! 
+!!      C .Lac          27/05/14    add negativity corrections for chemical species
+!!      C.Lac           29/01/15  Correction for NSV_USER
+!!      J.Escobar       02/10/2015 modif for JPHEXT(JPVEXT) variable  
+!!      C.Lac           04/12/15  Correction for LSUPSAT 
+!  C. Lac         04/2016: negative contribution to the budget split between advection, turbulence and microphysics for KHKO/C2R2
+!  C. Barthe      01/2016: add budget for LIMA
+!  C. Lac         10/2016: add budget for droplet deposition
+!  S. Riette      11/2016: new budgets for ICE3/ICE4
+!  P. Wautelet 05/2016-04/2018: new data structures and calls for I/O
+!  P. Wautelet 10/04/2019: replace ABORT and STOP calls by Print_msg
+!  P. Wautelet 15/11/2019: remove unused CBURECORD variable
+!  P. Wautelet 24/02/2020: bugfix: corrected condition for budget NCDEPITH
+!  P. Wautelet 26/02/2020: bugfix: rename CEVA->REVA for budget for raindrop evaporation in C2R2 (necessary after commit 4ed805fc)
+!  P. Wautelet 26/02/2020: bugfix: add missing condition on OCOLD for NSEDIRH budget in LIMA case
+!  P. Wautelet 02-03/2020: use the new data structures and subroutines for budgets
+!  B. Vie      02/03/2020: LIMA negativity checks after turbulence, advection and microphysics budgets
+!  P .Wautelet 09/03/2020: add missing budgets for electricity
+!  P. Wautelet 25/03/2020: add missing ove_relax_grd
+!  P. Wautelet 23/04/2020: add nid in tbudgetdata datatype
+!  P. Wautelet + Benoit Vié 11/06/2020: improve removal of negative scalar variables + adapt the corresponding budgets
+!  P. Wautelet 30/06/2020: use NADVSV when possible
+!  P. Wautelet 30/06/2020: add NNETURSV, NNEADVSV and NNECONSV variables
+!  P. Wautelet 06/07/2020: bugfix: add condition on HTURB for NETUR sources for SV budgets
+!  P. Wautelet 08/12/2020: add nbusubwrite and nbutotwrite
+!  P. Wautelet 11/01/2021: ignore xbuwri for cartesian boxes (write at every xbulen interval)
+!  P. Wautelet 01/02/2021: bugfix: add missing CEDS source terms for SV budgets
+!  P. Wautelet 02/02/2021: budgets: add missing source terms for SV budgets in LIMA
+!  P. Wautelet 03/02/2021: budgets: add new source if LIMA splitting: CORR2
+!  P. Wautelet 10/02/2021: budgets: add missing sources for NSV_C2R2BEG+3 budget
+!  P. Wautelet 11/02/2021: budgets: add missing term SCAV for NSV_LIMA_SCAVMASS budget
+!  P. Wautelet 02/03/2021: budgets: add terms for blowing snow
+!  P. Wautelet 04/03/2021: budgets: add terms for drag due to buildings
+!  P. Wautelet 17/03/2021: choose source terms for budgets with character strings instead of multiple integer variables
+! R. Schoetter    12/2021  multi-level coupling between MesoNH and SURFEX  
+!  C. Barthe   14/03/2022: budgets: add terms for CIBU and RDSF in LIMA
+!  M. Taufour  01/07/2022: budgets: add concentration for snow, graupel, hail
+!-------------------------------------------------------------------------------
+!
+!*       0.    DECLARATIONS
+!              ------------ 
+!
+use modd_2d_frc,        only: l2d_adv_frc, l2d_rel_frc
+use modd_blowsnow,      only: lblowsnow
+use modd_blowsnow_n,    only: lsnowsubl
+use modd_budget
+use modd_ch_aerosol,    only: lorilam
+use modd_conf,          only: l1d, lcartesian, lforcing, lthinshell, nmodel
+use modd_dim_n,         only: nimax_ll, njmax_ll, nkmax
+use modd_dragbldg_n,    only: ldragbldg
+use modd_dust,          only: ldust
+use modd_dyn,           only: lcorio, xseglen
+use modd_dyn_n,         only: xtstep, locean
+use modd_elec_descr,    only: linductive, lrelax2fw_ion
+use modd_field,         only: TYPEREAL
+use modd_fire_n,        only: lblaze
+use modd_nsv,           only: nsv_aerbeg, nsv_aerend, nsv_aerdepbeg, nsv_aerdepend, nsv_c2r2beg, nsv_c2r2end,      &
+                              nsv_chembeg, nsv_chemend, nsv_chicbeg, nsv_chicend, nsv_csbeg, nsv_csend,            &
+                              nsv_dstbeg, nsv_dstend, nsv_dstdepbeg, nsv_dstdepend, nsv_elecbeg, nsv_elecend,      &
+#ifdef MNH_FOREFIRE
+                              nsv_ffbeg, nsv_ffend,                                                                &
+#endif
+                              nsv_lgbeg, nsv_lgend,                                                                &
+                              nsv_lima_beg, nsv_lima_end, nsv_lima_ccn_acti, nsv_lima_ccn_free, nsv_lima_hom_haze, &
+                              nsv_lima_ifn_free, nsv_lima_ifn_nucl, nsv_lima_imm_nucl,                             &
+                              nsv_lima_nc, nsv_lima_nr, nsv_lima_ni, nsv_lima_ns, nsv_lima_ng, nsv_lima_nh,        &
+                              nsv_lima_scavmass, nsv_lima_spro,                                                    &
+                              nsv_lnoxbeg, nsv_lnoxend, nsv_ppbeg, nsv_ppend,                                      &
+                              nsv_sltbeg, nsv_sltend, nsv_sltdepbeg, nsv_sltdepend, nsv_snwbeg, nsv_snwend,        &
+                              nsv_user, tsvlist
+use modd_parameters,   only: jphext
+use modd_param_c2r2,   only: ldepoc_c2r2 => ldepoc, lrain_c2r2 => lrain, lsedc_c2r2 => lsedc, lsupsat_c2r2 => lsupsat
+use modd_param_ice_n,  only: ladj_after, ladj_before, ldeposc_ice => ldeposc, lred, lsedic_ice => lsedic, lwarm_ice => lwarm
+use modd_param_n,      only: cactccn, celec
+use modd_param_lima,   only: laero_mass_lima => laero_mass, lacti_lima => lacti, ldepoc_lima => ldepoc, &
+                             lhhoni_lima => lhhoni, lmeyers_lima => lmeyers, lnucl_lima => lnucl,       &
+                             lptsplit,                                                                                       &
+                             lscav_lima => lscav, lsedc_lima => lsedc, lsedi_lima => lsedi,             &
+                             lspro_lima => lspro,  lcibu, lrdsf,           &
+                             nmom_c, nmom_r, nmom_i, nmom_s, nmom_g, nmom_h, nmod_ccn, nmod_ifn, nmod_imm
+use modd_ref,          only: lcouples
+use modd_salt,         only: lsalt
+use modd_neb_n,        only: lsubg_cond
+use modd_viscosity,    only: lvisc, lvisc_r, lvisc_sv, lvisc_th, lvisc_uvw
+
+USE MODE_ll
+
+IMPLICIT NONE
+!
+!*       0.1   declarations of argument
+!
+!
+INTEGER,         INTENT(IN) :: KLUOUT   ! Logical unit number for prints
+REAL, INTENT(IN)    :: PTSTEP           ! time step
+INTEGER, INTENT(IN) :: KSV              ! number of scalar variables
+INTEGER, INTENT(IN) :: KRR              ! number of moist variables
+LOGICAL, INTENT(IN) :: ONUMDIFU         ! switch to activate the numerical
+                                        ! diffusion for momentum
+LOGICAL, INTENT(IN) :: ONUMDIFTH        ! for meteorological scalar variables
+LOGICAL, INTENT(IN) :: ONUMDIFSV        ! for tracer scalar variables
+LOGICAL, INTENT(IN) :: OHORELAX_UVWTH  ! switch for the
+                       ! horizontal relaxation for U,V,W,TH
+LOGICAL, INTENT(IN) :: OHORELAX_RV     ! switch for the
+                       ! horizontal relaxation for Rv
+LOGICAL, INTENT(IN) :: OHORELAX_RC     ! switch for the
+                       ! horizontal relaxation for Rc
+LOGICAL, INTENT(IN) :: OHORELAX_RR     ! switch for the
+                       ! horizontal relaxation for Rr
+LOGICAL, INTENT(IN) :: OHORELAX_RI     ! switch for the
+                       ! horizontal relaxation for Ri
+LOGICAL, INTENT(IN) :: OHORELAX_RS     ! switch for the
+                       ! horizontal relaxation for Rs
+LOGICAL, INTENT(IN) :: OHORELAX_RG     ! switch for the
+                       ! horizontal relaxation for Rg
+LOGICAL, INTENT(IN) :: OHORELAX_RH     ! switch for the
+                       ! horizontal relaxation for Rh
+LOGICAL, INTENT(IN) :: OHORELAX_TKE    ! switch for the
+                       ! horizontal relaxation for tke
+LOGICAL,DIMENSION(:),INTENT(IN):: OHORELAX_SV     ! switch for the
+                       ! horizontal relaxation for scalar variables
+LOGICAL, INTENT(IN) :: OVE_RELAX        ! switch to activate the vertical
+                                        ! relaxation
+logical, intent(in) :: ove_relax_grd    ! switch to activate the vertical
+                                        ! relaxation to the lowest verticals
+LOGICAL, INTENT(IN) :: OCHTRANS         ! switch to activate convective
+                                        !transport for SV
+LOGICAL, INTENT(IN) :: ONUDGING         ! switch to activate nudging
+LOGICAL, INTENT(IN) :: ODRAGTREE        ! switch to activate vegetation drag
+LOGICAL, INTENT(IN) :: ODEPOTREE        ! switch to activate droplet deposition on tree
+LOGICAL, INTENT(IN) :: ODRAGBLDG        ! switch to activate building drag
+LOGICAL, INTENT(IN) :: OAERO_EOL        ! switch to activate wind turbine wake
+CHARACTER (LEN=*), INTENT(IN) :: HRAD   ! type of the radiation scheme
+CHARACTER (LEN=*), INTENT(IN) :: HDCONV ! type of the deep convection scheme
+CHARACTER (LEN=*), INTENT(IN) :: HSCONV ! type of the shallow convection scheme
+CHARACTER (LEN=*), INTENT(IN) :: HTURB  ! type of the turbulence scheme
+CHARACTER (LEN=*), INTENT(IN) :: HTURBDIM! dimensionnality of the turbulence 
+                                        ! scheme
+CHARACTER (LEN=*), INTENT(IN) :: HCLOUD ! type of microphysical scheme
+!
+!*       0.2   declarations of local variables
+!
+real, parameter :: ITOL = 1e-6
+
+INTEGER :: JI, JJ                                         ! loop indices
+INTEGER :: IIMAX_ll, IJMAX_ll ! size of the physical global domain
+INTEGER :: IIU, IJU                                       ! size along x and y directions
+                                                          ! of the extended subdomain
+INTEGER :: IBUDIM1                                        ! first dimension of the budget arrays
+                                                          ! = NBUIMAX in CART case
+                                                          ! = NBUKMAX in MASK case
+INTEGER :: IBUDIM2                                        ! second dimension of the budget arrays
+                                                          ! = NBUJMAX in CART case
+                                                          ! = nbusubwrite in MASK case
+INTEGER :: IBUDIM3                                        ! third dimension of the budget arrays
+                                                          ! = NBUKMAX in CART case
+                                                          ! = NBUMASK in MASK case
+INTEGER             :: JSV               ! loop indice for the SVs
+INTEGER             :: IINFO_ll ! return status of the interface routine
+integer             :: ibudget
+logical             :: gtmp
+type(tbusourcedata) :: tzsource ! Used to prepare metadate of source terms
+
+call Print_msg( NVERB_DEBUG, 'BUD', 'Ini_budget', 'called' )
+!
+!*       1.    COMPUTE BUDGET VARIABLES
+!              ------------------------
+!
+NBUSTEP = NINT (XBULEN / PTSTEP)
+NBUTSHIFT=0
+!
+!  common dimension for all CBUTYPE values
+!
+IF (LBU_KCP) THEN
+  NBUKMAX = 1
+ELSE
+  NBUKMAX = NBUKH - NBUKL +1
+END IF
+!
+if ( cbutype == 'CART' .or. cbutype == 'MASK' ) then
+  !Check if xbulen is a multiple of xtstep (within tolerance)
+  if ( Abs( Nint( xbulen / xtstep ) * xtstep - xbulen ) > ( ITOL * xtstep ) ) &
+    call Print_msg( NVERB_WARNING, 'BUD', 'Ini_budget', 'xbulen is not a multiple of xtstep' )
+
+  if ( cbutype == 'CART' ) then
+    !Check if xseglen is a multiple of xbulen (within tolerance)
+    if ( Abs( Nint( xseglen / xbulen ) * xbulen - xseglen ) > ( ITOL * xseglen ) ) &
+      call Print_msg( NVERB_WARNING, 'BUD', 'Ini_budget', 'xseglen is not a multiple of xbulen' )
+
+    !Write cartesian budgets every xbulen time period (do not take xbuwri into account)
+    xbuwri = xbulen
+
+    nbusubwrite = 1                                      !Number of budget time average periods for each write
+    nbutotwrite = nbusubwrite * Nint( xseglen / xbulen ) !Total number of budget time average periods
+  else if ( cbutype == 'MASK' ) then
+    !Check if xbuwri is a multiple of xtstep (within tolerance)
+    if ( Abs( Nint( xbuwri / xtstep ) * xtstep - xbuwri ) > ( ITOL * xtstep ) ) &
+      call Print_msg( NVERB_WARNING, 'BUD', 'Ini_budget', 'xbuwri is not a multiple of xtstep' )
+
+    !Check if xbuwri is a multiple of xbulen (within tolerance)
+    if ( Abs( Nint( xbuwri / xbulen ) * xbulen - xbuwri ) > ( ITOL * xbulen ) ) &
+      call Print_msg( NVERB_WARNING, 'BUD', 'Ini_budget', 'xbuwri is not a multiple of xbulen' )
+
+    !Check if xseglen is a multiple of xbuwri (within tolerance)
+    if ( Abs( Nint( xseglen / xbuwri ) * xbuwri - xseglen ) > ( ITOL * xseglen ) ) &
+      call Print_msg( NVERB_WARNING, 'BUD', 'Ini_budget', 'xseglen is not a multiple of xbuwri' )
+
+    nbusubwrite = Nint ( xbuwri / xbulen )               !Number of budget time average periods for each write
+    nbutotwrite = nbusubwrite * Nint( xseglen / xbuwri ) !Total number of budget time average periods
+  end if
+end if
+
+IF (CBUTYPE=='CART') THEN              ! cartesian case only
+!
+  IF ( NBUIL < 1 )        CALL Print_msg( NVERB_ERROR, 'BUD', 'Ini_budget', 'NBUIL too small (<1)' )
+  IF ( NBUIL > NIMAX_ll ) CALL Print_msg( NVERB_ERROR, 'BUD', 'Ini_budget', 'NBUIL too large (>NIMAX)' )
+  IF ( NBUIH < 1 )        CALL Print_msg( NVERB_ERROR, 'BUD', 'Ini_budget', 'NBUIH too small (<1)' )
+  IF ( NBUIH > NIMAX_ll ) CALL Print_msg( NVERB_ERROR, 'BUD', 'Ini_budget', 'NBUIH too large (>NIMAX)' )
+  IF ( NBUIH < NBUIL )    CALL Print_msg( NVERB_ERROR, 'BUD', 'Ini_budget', 'NBUIH < NBUIL' )
+  IF (LBU_ICP) THEN
+    NBUIMAX_ll = 1
+  ELSE
+    NBUIMAX_ll = NBUIH - NBUIL +1
+  END IF
+
+  IF ( NBUJL < 1 )        CALL Print_msg( NVERB_ERROR, 'BUD', 'Ini_budget', 'NBUJL too small (<1)' )
+  IF ( NBUJL > NJMAX_ll ) CALL Print_msg( NVERB_ERROR, 'BUD', 'Ini_budget', 'NBUJL too large (>NJMAX)' )
+  IF ( NBUJH < 1 )        CALL Print_msg( NVERB_ERROR, 'BUD', 'Ini_budget', 'NBUJH too small (<1)' )
+  IF ( NBUJH > NJMAX_ll ) CALL Print_msg( NVERB_ERROR, 'BUD', 'Ini_budget', 'NBUJH too large (>NJMAX)' )
+  IF ( NBUJH < NBUJL )    CALL Print_msg( NVERB_ERROR, 'BUD', 'Ini_budget', 'NBUJH < NBUJL' )
+  IF (LBU_JCP) THEN
+    NBUJMAX_ll = 1
+  ELSE
+    NBUJMAX_ll = NBUJH - NBUJL +1
+  END IF
+
+  IF ( NBUKL < 1 )     CALL Print_msg( NVERB_ERROR, 'BUD', 'Ini_budget', 'NBUKL too small (<1)' )
+  IF ( NBUKL > NKMAX ) CALL Print_msg( NVERB_ERROR, 'BUD', 'Ini_budget', 'NBUKL too large (>NKMAX)' )
+  IF ( NBUKH < 1 )     CALL Print_msg( NVERB_ERROR, 'BUD', 'Ini_budget', 'NBUKH too small (<1)' )
+  IF ( NBUKH > NKMAX ) CALL Print_msg( NVERB_ERROR, 'BUD', 'Ini_budget', 'NBUKH too large (>NKMAX)' )
+  IF ( NBUKH < NBUKL ) CALL Print_msg( NVERB_ERROR, 'BUD', 'Ini_budget', 'NBUKH < NBUKL' )
+
+  CALL GET_INTERSECTION_ll(NBUIL+JPHEXT,NBUJL+JPHEXT,NBUIH+JPHEXT,NBUJH+JPHEXT, &
+      NBUSIL,NBUSJL,NBUSIH,NBUSJH,"PHYS",IINFO_ll)
+  IF ( IINFO_ll /= 1 ) THEN ! 
+    IF (LBU_ICP) THEN 
+      NBUIMAX = 1
+    ELSE
+      NBUIMAX = NBUSIH - NBUSIL +1
+    END IF
+    IF (LBU_JCP) THEN 
+      NBUJMAX = 1
+    ELSE
+      NBUJMAX =  NBUSJH - NBUSJL +1
+    END IF
+  ELSE ! the intersection is void 
+    CBUTYPE='SKIP'  ! no budget on this processor       
+    NBUIMAX = 0     ! in order to allocate void arrays
+    NBUJMAX = 0
+  ENDIF
+! three first dimensions of budget arrays in cart and skip cases
+   IBUDIM1=NBUIMAX
+   IBUDIM2=NBUJMAX
+   IBUDIM3=NBUKMAX
+! these variables are not be used 
+   NBUMASK=-1
+!
+ELSEIF (CBUTYPE=='MASK') THEN          ! mask case only 
+!
+  LBU_ENABLE=.TRUE.
+                                    ! result on the FM_FILE
+  NBUTIME = 1
+
+  CALL GET_DIM_EXT_ll ('B', IIU,IJU)
+  ALLOCATE( LBU_MASK( IIU ,IJU, NBUMASK) )
+  LBU_MASK(:,:,:)=.FALSE.
+  ALLOCATE( NBUSURF( IIU, IJU, NBUMASK, nbusubwrite) )
+  NBUSURF(:,:,:,:) = 0
+!
+! three first dimensions of budget arrays in mask case
+!  the order of the dimensions are the order expected in WRITE_DIACHRO routine:
+!  x,y,z,time,mask,processus  and in this case x and y are missing
+!  first dimension of the arrays : dimension along K
+!  second dimension of the arrays : number of the budget time period
+!  third dimension of the arrays : number of the budget masks zones
+  IBUDIM1=NBUKMAX
+  IBUDIM2=nbusubwrite
+  IBUDIM3=NBUMASK
+! these variables are not used in this case
+  NBUIMAX=-1
+  NBUJMAX=-1
+! the beginning and the end along x and y direction : global extended domain
+ ! get dimensions of the physical global domain
+   CALL GET_GLOBALDIMS_ll (IIMAX_ll,IJMAX_ll)
+   NBUIL=1
+   NBUIH=IIMAX_ll + 2 * JPHEXT
+   NBUJL=1 
+   NBUJH=IJMAX_ll + 2 * JPHEXT
+!
+ELSE                      ! default case
+!
+  LBU_ENABLE=.FALSE.
+  NBUIMAX = -1
+  NBUJMAX = -1
+  LBU_RU = .FALSE.
+  LBU_RV = .FALSE.
+  LBU_RW = .FALSE.
+  LBU_RTH= .FALSE.
+  LBU_RTKE= .FALSE.
+  LBU_RRV= .FALSE.
+  LBU_RRC= .FALSE.
+  LBU_RRR= .FALSE.
+  LBU_RRI= .FALSE.
+  LBU_RRS= .FALSE.
+  LBU_RRG= .FALSE.
+  LBU_RRH= .FALSE.
+  LBU_RSV= .FALSE.
+!
+! three first dimensions of budget arrays in default case
+  IBUDIM1=0
+  IBUDIM2=0
+  IBUDIM3=0
+!
+END IF  
+!
+!
+!-------------------------------------------------------------------------------
+!
+!*       2.    ALLOCATE MEMORY FOR BUDGET ARRAYS AND INITIALIZE
+!              ------------------------------------------------
+!
+LBU_BEG =.TRUE. 
+!
+!-------------------------------------------------------------------------------
+!
+!*       3.    INITALIZE VARIABLES
+!              -------------------
+!
+!Create intermediate variable to store rhodj for scalar variables
+if ( lbu_rth .or. lbu_rtke .or. lbu_rrv .or. lbu_rrc .or. lbu_rrr .or. &
+     lbu_rri .or. lbu_rrs  .or. lbu_rrg .or. lbu_rrh .or. lbu_rsv      ) then
+  allocate( tburhodj )
+
+  tburhodj%cmnhname  = 'RhodJS'
+  tburhodj%cstdname  = ''
+  tburhodj%clongname = 'RhodJS'
+  tburhodj%cunits    = 'kg'
+  tburhodj%ccomment  = 'RhodJ for Scalars variables'
+  tburhodj%ngrid     = 1
+  tburhodj%ntype     = TYPEREAL
+  tburhodj%ndims     = 3
+
+  allocate( tburhodj%xdata(ibudim1, ibudim2, ibudim3) )
+  tburhodj%xdata(:, :, :) = 0.
+end if
+
+
+tzsource%ntype    = TYPEREAL
+tzsource%ndims    = 3
+
+! Budget of RU
+tbudgets(NBUDGET_U)%lenabled = lbu_ru
+
+if ( lbu_ru ) then
+  allocate( tbudgets(NBUDGET_U)%trhodj )
+
+  tbudgets(NBUDGET_U)%trhodj%cmnhname  = 'RhodJX'
+  tbudgets(NBUDGET_U)%trhodj%cstdname  = ''
+  tbudgets(NBUDGET_U)%trhodj%clongname = 'RhodJX'
+  tbudgets(NBUDGET_U)%trhodj%cunits    = 'kg'
+  tbudgets(NBUDGET_U)%trhodj%ccomment  = 'RhodJ for momentum along X axis'
+  tbudgets(NBUDGET_U)%trhodj%ngrid     = 2
+  tbudgets(NBUDGET_U)%trhodj%ntype     = TYPEREAL
+  tbudgets(NBUDGET_U)%trhodj%ndims     = 3
+
+  allocate( tbudgets(NBUDGET_U)%trhodj%xdata(ibudim1, ibudim2, ibudim3) )
+  tbudgets(NBUDGET_U)%trhodj%xdata(:, :, :) = 0.
+
+  !Allocate all basic source terms (used or not)
+  !The size should be large enough (bigger than necessary is OK)
+  tbudgets(NBUDGET_U)%nsourcesmax = NSOURCESMAX
+  allocate( tbudgets(NBUDGET_U)%tsources(NSOURCESMAX) )
+
+  allocate( tbudgets(NBUDGET_U)%xtmpstore(ibudim1, ibudim2, ibudim3) )
+
+  tbudgets(NBUDGET_U)%tsources(:)%ngroup = 0
+
+  tzsource%ccomment = 'Budget of momentum along X axis'
+  tzsource%ngrid    = 2
+
+  tzsource%cunits   = 'm s-1'
+
+  tzsource%cmnhname   = 'INIF'
+  tzsource%clongname  = 'initial state'
+  tzsource%lavailable = .true.
+  call Budget_source_add( tbudgets(NBUDGET_U), tzsource, odonotinit = .true., ooverwrite = .true. )
+
+  tzsource%cmnhname   = 'ENDF'
+  tzsource%clongname  = 'final state'
+  tzsource%lavailable = .true.
+  call Budget_source_add( tbudgets(NBUDGET_U), tzsource, odonotinit = .true., ooverwrite = .true. )
+
+  tzsource%cmnhname   = 'AVEF'
+  tzsource%clongname  = 'averaged state'
+  tzsource%lavailable = .true.
+  call Budget_source_add( tbudgets(NBUDGET_U), tzsource, odonotinit = .true., ooverwrite = .false. )
+
+  tzsource%cunits   = 'm s-2'
+
+  tzsource%cmnhname   = 'ASSE'
+  tzsource%clongname  = 'time filter (Asselin)'
+  tzsource%lavailable = .true.
+  call Budget_source_add( tbudgets(NBUDGET_U), tzsource )
+
+  tzsource%cmnhname   = 'NEST'
+  tzsource%clongname  = 'nesting'
+  tzsource%lavailable = nmodel > 1
+  call Budget_source_add( tbudgets(NBUDGET_U), tzsource )
+
+  tzsource%cmnhname   = 'FRC'
+  tzsource%clongname  = 'forcing'
+  tzsource%lavailable = lforcing
+  call Budget_source_add( tbudgets(NBUDGET_U), tzsource )
+
+  tzsource%cmnhname   = 'NUD'
+  tzsource%clongname  = 'nudging'
+  tzsource%lavailable = onudging
+  call Budget_source_add( tbudgets(NBUDGET_U), tzsource )
+
+  tzsource%cmnhname   = 'CURV'
+  tzsource%clongname  = 'curvature'
+  tzsource%lavailable = .not.l1d .and. .not.lcartesian
+  call Budget_source_add( tbudgets(NBUDGET_U), tzsource )
+
+  tzsource%cmnhname   = 'COR'
+  tzsource%clongname  = 'Coriolis'
+  tzsource%lavailable = lcorio
+  call Budget_source_add( tbudgets(NBUDGET_U), tzsource )
+
+  tzsource%cmnhname   = 'DIF'
+  tzsource%clongname  = 'numerical diffusion'
+  tzsource%lavailable = onumdifu
+  call Budget_source_add( tbudgets(NBUDGET_U), tzsource )
+
+  tzsource%cmnhname   = 'REL'
+  tzsource%clongname  = 'relaxation'
+  tzsource%lavailable = ohorelax_uvwth .or. ove_relax .or. ove_relax_grd
+  call Budget_source_add( tbudgets(NBUDGET_U), tzsource )
+
+  tzsource%cmnhname   = 'DRAG'
+  tzsource%clongname  = 'drag force due to trees'
+  tzsource%lavailable = odragtree
+  call Budget_source_add( tbudgets(NBUDGET_U), tzsource )
+
+  tzsource%cmnhname   = 'DRAGEOL'
+  tzsource%clongname  = 'drag force due to wind turbine'
+  tzsource%lavailable = OAERO_EOL
+  call Budget_source_add( tbudgets(NBUDGET_U), tzsource )
+
+  tzsource%cmnhname   = 'DRAGB'
+  tzsource%clongname  = 'drag force due to buildings'
+  tzsource%lavailable = ldragbldg
+  call Budget_source_add( tbudgets(NBUDGET_U), tzsource )
+
+  tzsource%cmnhname   = 'VTURB'
+  tzsource%clongname  = 'vertical turbulent diffusion'
+  tzsource%lavailable = hturb == 'TKEL'
+  call Budget_source_add( tbudgets(NBUDGET_U), tzsource )
+
+  tzsource%cmnhname   = 'HTURB'
+  tzsource%clongname  = 'horizontal turbulent diffusion'
+  tzsource%lavailable = hturb == 'TKEL' .and. HTURBDIM == '3DIM'
+  call Budget_source_add( tbudgets(NBUDGET_U), tzsource )
+
+  tzsource%cmnhname   = 'MAFL'
+  tzsource%clongname  = 'mass flux'
+  tzsource%lavailable = hsconv == 'EDKF'
+  call Budget_source_add( tbudgets(NBUDGET_U), tzsource )
+
+  tzsource%cmnhname   = 'VISC'
+  tzsource%clongname  = 'viscosity'
+  tzsource%lavailable = lvisc .and. lvisc_uvw
+  call Budget_source_add( tbudgets(NBUDGET_U), tzsource )
+
+  tzsource%cmnhname   = 'ADV'
+  tzsource%clongname  = 'advection'
+  tzsource%lavailable = .true.
+  call Budget_source_add( tbudgets(NBUDGET_U), tzsource )
+
+  tzsource%cmnhname   = 'PRES'
+  tzsource%clongname  = 'pressure'
+  tzsource%lavailable = .true.
+  call Budget_source_add( tbudgets(NBUDGET_U), tzsource )
+
+
+  call Sourcelist_sort_compact( tbudgets(NBUDGET_U) )
+
+  call Sourcelist_scan( tbudgets(NBUDGET_U), cbulist_ru )
+end if
+
+! Budget of RV
+tbudgets(NBUDGET_V)%lenabled = lbu_rv
+
+if ( lbu_rv ) then
+  allocate( tbudgets(NBUDGET_V)%trhodj )
+
+  tbudgets(NBUDGET_V)%trhodj%cmnhname  = 'RhodJY'
+  tbudgets(NBUDGET_V)%trhodj%cstdname  = ''
+  tbudgets(NBUDGET_V)%trhodj%clongname = 'RhodJY'
+  tbudgets(NBUDGET_V)%trhodj%cunits    = 'kg'
+  tbudgets(NBUDGET_V)%trhodj%ccomment  = 'RhodJ for momentum along Y axis'
+  tbudgets(NBUDGET_V)%trhodj%ngrid     = 3
+  tbudgets(NBUDGET_V)%trhodj%ntype     = TYPEREAL
+  tbudgets(NBUDGET_V)%trhodj%ndims     = 3
+
+  allocate( tbudgets(NBUDGET_V)%trhodj%xdata(ibudim1, ibudim2, ibudim3) )
+  tbudgets(NBUDGET_V)%trhodj%xdata(:, :, :) = 0.
+
+  !Allocate all basic source terms (used or not)
+  !The size should be large enough (bigger than necessary is OK)
+  tbudgets(NBUDGET_V)%nsourcesmax = NSOURCESMAX
+  allocate( tbudgets(NBUDGET_V)%tsources(NSOURCESMAX) )
+
+  allocate( tbudgets(NBUDGET_V)%xtmpstore(ibudim1, ibudim2, ibudim3) )
+
+  tbudgets(NBUDGET_V)%tsources(:)%ngroup = 0
+
+  tzsource%ccomment = 'Budget of momentum along Y axis'
+  tzsource%ngrid    = 3
+
+  tzsource%cunits   = 'm s-1'
+
+  tzsource%cmnhname   = 'INIF'
+  tzsource%clongname  = 'initial state'
+  tzsource%lavailable = .true.
+  call Budget_source_add( tbudgets(NBUDGET_V), tzsource, odonotinit = .true., ooverwrite = .true. )
+
+  tzsource%cmnhname   = 'ENDF'
+  tzsource%clongname  = 'final state'
+  tzsource%lavailable = .true.
+  call Budget_source_add( tbudgets(NBUDGET_V), tzsource, odonotinit = .true., ooverwrite = .true. )
+
+  tzsource%cmnhname   = 'AVEF'
+  tzsource%clongname  = 'averaged state'
+  tzsource%lavailable = .true.
+  call Budget_source_add( tbudgets(NBUDGET_V), tzsource, odonotinit = .true., ooverwrite = .false. )
+
+  tzsource%cunits   = 'm s-2'
+
+  tzsource%cmnhname   = 'ASSE'
+  tzsource%clongname  = 'time filter (Asselin)'
+  tzsource%lavailable = .true.
+  call Budget_source_add( tbudgets(NBUDGET_V), tzsource )
+
+  tzsource%cmnhname   = 'NEST'
+  tzsource%clongname  = 'nesting'
+  tzsource%lavailable = nmodel > 1
+  call Budget_source_add( tbudgets(NBUDGET_V), tzsource )
+
+  tzsource%cmnhname   = 'FRC'
+  tzsource%clongname  = 'forcing'
+  tzsource%lavailable = lforcing
+  call Budget_source_add( tbudgets(NBUDGET_V), tzsource )
+
+  tzsource%cmnhname   = 'NUD'
+  tzsource%clongname  = 'nudging'
+  tzsource%lavailable = onudging
+  call Budget_source_add( tbudgets(NBUDGET_V), tzsource )
+
+  tzsource%cmnhname   = 'CURV'
+  tzsource%clongname  = 'curvature'
+  tzsource%lavailable = .not.l1d .and. .not.lcartesian
+  call Budget_source_add( tbudgets(NBUDGET_V), tzsource )
+
+  tzsource%cmnhname   = 'COR'
+  tzsource%clongname  = 'Coriolis'
+  tzsource%lavailable = lcorio
+  call Budget_source_add( tbudgets(NBUDGET_V), tzsource )
+
+  tzsource%cmnhname   = 'DIF'
+  tzsource%clongname  = 'numerical diffusion'
+  tzsource%lavailable = onumdifu
+  call Budget_source_add( tbudgets(NBUDGET_V), tzsource )
+
+  tzsource%cmnhname   = 'REL'
+  tzsource%clongname  = 'relaxation'
+  tzsource%lavailable = ohorelax_uvwth .or. ove_relax .or. ove_relax_grd
+  call Budget_source_add( tbudgets(NBUDGET_V), tzsource )
+
+  tzsource%cmnhname   = 'DRAG'
+  tzsource%clongname  = 'drag force due to trees'
+  tzsource%lavailable = odragtree
+  call Budget_source_add( tbudgets(NBUDGET_V), tzsource )
+
+  tzsource%cmnhname   = 'DRAGEOL'
+  tzsource%clongname  = 'drag force due to wind turbine'
+  tzsource%lavailable = OAERO_EOL
+  call Budget_source_add( tbudgets(NBUDGET_V), tzsource )
+
+  tzsource%cmnhname   = 'DRAGB'
+  tzsource%clongname  = 'drag force due to buildings'
+  tzsource%lavailable = ldragbldg
+  call Budget_source_add( tbudgets(NBUDGET_V), tzsource )
+
+  tzsource%cmnhname   = 'VTURB'
+  tzsource%clongname  = 'vertical turbulent diffusion'
+  tzsource%lavailable = hturb == 'TKEL'
+  call Budget_source_add( tbudgets(NBUDGET_V), tzsource )
+
+  tzsource%cmnhname   = 'HTURB'
+  tzsource%clongname  = 'horizontal turbulent diffusion'
+  tzsource%lavailable = hturb == 'TKEL' .and. HTURBDIM == '3DIM'
+  call Budget_source_add( tbudgets(NBUDGET_V), tzsource )
+
+  tzsource%cmnhname   = 'MAFL'
+  tzsource%clongname  = 'mass flux'
+  tzsource%lavailable = hsconv == 'EDKF'
+  call Budget_source_add( tbudgets(NBUDGET_V), tzsource )
+
+  tzsource%cmnhname   = 'VISC'
+  tzsource%clongname  = 'viscosity'
+  tzsource%lavailable = lvisc .and. lvisc_uvw
+  call Budget_source_add( tbudgets(NBUDGET_V), tzsource )
+
+  tzsource%cmnhname   = 'ADV'
+  tzsource%clongname  = 'advection'
+  tzsource%lavailable = .true.
+  call Budget_source_add( tbudgets(NBUDGET_V), tzsource )
+
+  tzsource%cmnhname   = 'PRES'
+  tzsource%clongname  = 'pressure'
+  tzsource%lavailable = .true.
+  call Budget_source_add( tbudgets(NBUDGET_V), tzsource )
+
+
+  call Sourcelist_sort_compact( tbudgets(NBUDGET_V) )
+
+  call Sourcelist_scan( tbudgets(NBUDGET_V), cbulist_rv )
+end if
+
+! Budget of RW
+tbudgets(NBUDGET_W)%lenabled = lbu_rw
+
+if ( lbu_rw ) then
+  allocate( tbudgets(NBUDGET_W)%trhodj )
+
+  tbudgets(NBUDGET_W)%trhodj%cmnhname  = 'RhodJZ'
+  tbudgets(NBUDGET_W)%trhodj%cstdname  = ''
+  tbudgets(NBUDGET_W)%trhodj%clongname = 'RhodJZ'
+  tbudgets(NBUDGET_W)%trhodj%cunits    = 'kg'
+  tbudgets(NBUDGET_W)%trhodj%ccomment  = 'RhodJ for momentum along Z axis'
+  tbudgets(NBUDGET_W)%trhodj%ngrid     = 4
+  tbudgets(NBUDGET_W)%trhodj%ntype     = TYPEREAL
+  tbudgets(NBUDGET_W)%trhodj%ndims     = 3
+
+  allocate( tbudgets(NBUDGET_W)%trhodj%xdata(ibudim1, ibudim2, ibudim3) )
+  tbudgets(NBUDGET_W)%trhodj%xdata(:, :, :) = 0.
+
+  !Allocate all basic source terms (used or not)
+  !The size should be large enough (bigger than necessary is OK)
+  tbudgets(NBUDGET_W)%nsourcesmax = NSOURCESMAX
+  allocate( tbudgets(NBUDGET_W)%tsources(NSOURCESMAX) )
+
+  allocate( tbudgets(NBUDGET_W)%xtmpstore(ibudim1, ibudim2, ibudim3) )
+
+  tbudgets(NBUDGET_W)%tsources(:)%ngroup = 0
+
+  tzsource%ccomment = 'Budget of momentum along Z axis'
+  tzsource%ngrid    = 4
+
+  tzsource%cunits   = 'm s-1'
+
+  tzsource%cmnhname   = 'INIF'
+  tzsource%clongname  = 'initial state'
+  tzsource%lavailable = .true.
+  call Budget_source_add( tbudgets(NBUDGET_W), tzsource, odonotinit = .true., ooverwrite = .true. )
+
+  tzsource%cmnhname   = 'ENDF'
+  tzsource%clongname  = 'final state'
+  tzsource%lavailable = .true.
+  call Budget_source_add( tbudgets(NBUDGET_W), tzsource, odonotinit = .true., ooverwrite = .true. )
+
+  tzsource%cmnhname   = 'AVEF'
+  tzsource%clongname  = 'averaged state'
+  tzsource%lavailable = .true.
+  call Budget_source_add( tbudgets(NBUDGET_W), tzsource, odonotinit = .true., ooverwrite = .false. )
+
+  tzsource%cunits   = 'm s-2'
+
+  tzsource%cmnhname   = 'ASSE'
+  tzsource%clongname  = 'time filter (Asselin)'
+  tzsource%lavailable = .true.
+  call Budget_source_add( tbudgets(NBUDGET_W), tzsource )
+
+  tzsource%cmnhname   = 'NEST'
+  tzsource%clongname  = 'nesting'
+  tzsource%lavailable = nmodel > 1
+  call Budget_source_add( tbudgets(NBUDGET_W), tzsource )
+
+  tzsource%cmnhname   = 'FRC'
+  tzsource%clongname  = 'forcing'
+  tzsource%lavailable = lforcing
+  call Budget_source_add( tbudgets(NBUDGET_W), tzsource )
+
+  tzsource%cmnhname   = 'NUD'
+  tzsource%clongname  = 'nudging'
+  tzsource%lavailable = onudging
+  call Budget_source_add( tbudgets(NBUDGET_W), tzsource )
+
+  tzsource%cmnhname   = 'CURV'
+  tzsource%clongname  = 'curvature'
+  tzsource%lavailable = .not.l1d .and. .not.lcartesian .and. .not.lthinshell
+  call Budget_source_add( tbudgets(NBUDGET_W), tzsource )
+
+  tzsource%cmnhname   = 'COR'
+  tzsource%clongname  = 'Coriolis'
+  tzsource%lavailable = lcorio .and. .not.l1d .and. .not.lthinshell
+  call Budget_source_add( tbudgets(NBUDGET_W), tzsource )
+
+  tzsource%cmnhname   = 'DIF'
+  tzsource%clongname  = 'numerical diffusion'
+  tzsource%lavailable = onumdifu
+  call Budget_source_add( tbudgets(NBUDGET_W), tzsource )
+
+  tzsource%cmnhname   = 'REL'
+  tzsource%clongname  = 'relaxation'
+  tzsource%lavailable = ohorelax_uvwth .or. ove_relax .or. ove_relax_grd
+  call Budget_source_add( tbudgets(NBUDGET_W), tzsource )
+
+  tzsource%cmnhname   = 'VTURB'
+  tzsource%clongname  = 'vertical turbulent diffusion'
+  tzsource%lavailable = hturb == 'TKEL'
+  call Budget_source_add( tbudgets(NBUDGET_W), tzsource )
+
+  tzsource%cmnhname   = 'HTURB'
+  tzsource%clongname  = 'horizontal turbulent diffusion'
+  tzsource%lavailable = hturb == 'TKEL' .and. HTURBDIM == '3DIM'
+  call Budget_source_add( tbudgets(NBUDGET_W), tzsource )
+
+  tzsource%cmnhname   = 'VISC'
+  tzsource%clongname  = 'viscosity'
+  tzsource%lavailable = lvisc .and. lvisc_uvw
+  call Budget_source_add( tbudgets(NBUDGET_W), tzsource )
+
+  tzsource%cmnhname   = 'GRAV'
+  tzsource%clongname  = 'gravity'
+  tzsource%lavailable = .true.
+  call Budget_source_add( tbudgets(NBUDGET_W), tzsource )
+
+  tzsource%cmnhname   = 'ADV'
+  tzsource%clongname  = 'advection'
+  tzsource%lavailable = .true.
+  call Budget_source_add( tbudgets(NBUDGET_W), tzsource )
+
+  tzsource%cmnhname   = 'PRES'
+  tzsource%clongname  = 'pressure'
+  tzsource%lavailable = .true.
+  call Budget_source_add( tbudgets(NBUDGET_W), tzsource )
+
+  tzsource%cmnhname   = 'DRAGEOL'
+  tzsource%clongname  = 'drag force due to wind turbine'
+  tzsource%lavailable = OAERO_EOL
+  call Budget_source_add( tbudgets(NBUDGET_W), tzsource )
+
+  call Sourcelist_sort_compact( tbudgets(NBUDGET_W) )
+
+  call Sourcelist_scan( tbudgets(NBUDGET_W), cbulist_rw )
+end if
+
+! Budget of RTH
+tbudgets(NBUDGET_TH)%lenabled = lbu_rth
+
+if ( lbu_rth ) then
+  tbudgets(NBUDGET_TH)%trhodj => tburhodj
+
+  !Allocate all basic source terms (used or not)
+  !The size should be large enough (bigger than necessary is OK)
+  tbudgets(NBUDGET_TH)%nsourcesmax = NSOURCESMAX
+  allocate( tbudgets(NBUDGET_TH)%tsources(NSOURCESMAX) )
+
+  allocate( tbudgets(NBUDGET_TH)%xtmpstore(ibudim1, ibudim2, ibudim3) )
+
+  tbudgets(NBUDGET_TH)%tsources(:)%ngroup = 0
+
+  tzsource%ccomment = 'Budget of potential temperature'
+  tzsource%ngrid    = 1
+
+  tzsource%cunits   = 'K'
+
+  tzsource%cmnhname   = 'INIF'
+  tzsource%clongname  = 'initial state'
+  tzsource%lavailable = .true.
+  call Budget_source_add( tbudgets(NBUDGET_TH), tzsource, odonotinit = .true., ooverwrite = .true. )
+
+  tzsource%cmnhname   = 'ENDF'
+  tzsource%clongname  = 'final state'
+  tzsource%lavailable = .true.
+  call Budget_source_add( tbudgets(NBUDGET_TH), tzsource, odonotinit = .true., ooverwrite = .true. )
+
+  tzsource%cmnhname   = 'AVEF'
+  tzsource%clongname  = 'averaged state'
+  tzsource%lavailable = .true.
+  call Budget_source_add( tbudgets(NBUDGET_TH), tzsource, odonotinit = .true., ooverwrite = .false. )
+
+  tzsource%cunits   = 'K s-1'
+
+  tzsource%cmnhname   = 'ASSE'
+  tzsource%clongname  = 'time filter (Asselin)'
+  tzsource%lavailable = .true.
+  call Budget_source_add( tbudgets(NBUDGET_TH), tzsource )
+
+  tzsource%cmnhname   = 'NEST'
+  tzsource%clongname  = 'nesting'
+  tzsource%lavailable = nmodel > 1
+  call Budget_source_add( tbudgets(NBUDGET_TH), tzsource )
+
+  tzsource%cmnhname   = 'FRC'
+  tzsource%clongname  = 'forcing'
+  tzsource%lavailable = lforcing
+  call Budget_source_add( tbudgets(NBUDGET_TH), tzsource )
+
+  tzsource%cmnhname   = '2DADV'
+  tzsource%clongname  = 'advective forcing'
+  tzsource%lavailable = l2d_adv_frc
+  call Budget_source_add( tbudgets(NBUDGET_TH), tzsource )
+
+  tzsource%cmnhname   = '2DREL'
+  tzsource%clongname  = 'relaxation forcing'
+  tzsource%lavailable = l2d_rel_frc
+  call Budget_source_add( tbudgets(NBUDGET_TH), tzsource )
+
+  tzsource%cmnhname   = 'NUD'
+  tzsource%clongname  = 'nudging'
+  tzsource%lavailable = onudging
+  call Budget_source_add( tbudgets(NBUDGET_TH), tzsource )
+
+  tzsource%cmnhname   = 'PREF'
+  tzsource%clongname  = 'reference pressure'
+  tzsource%lavailable = krr > 0 .and. .not.l1d
+  call Budget_source_add( tbudgets(NBUDGET_TH), tzsource )
+
+  tzsource%cmnhname   = 'DIF'
+  tzsource%clongname  = 'numerical diffusion'
+  tzsource%lavailable = onumdifth
+  call Budget_source_add( tbudgets(NBUDGET_TH), tzsource )
+
+  tzsource%cmnhname   = 'REL'
+  tzsource%clongname  = 'relaxation'
+  tzsource%lavailable = ohorelax_uvwth .or. ove_relax .or. ove_relax_grd
+  call Budget_source_add( tbudgets(NBUDGET_TH), tzsource )
+
+  tzsource%cmnhname   = 'RAD'
+  tzsource%clongname  = 'radiation'
+  tzsource%lavailable = hrad /= 'NONE'
+  call Budget_source_add( tbudgets(NBUDGET_TH), tzsource )
+
+  tzsource%cmnhname   = 'DCONV'
+  tzsource%clongname  = 'KAFR convection'
+  tzsource%lavailable = hdconv == 'KAFR' .OR. hsconv == 'KAFR'
+
+  call Budget_source_add( tbudgets(NBUDGET_TH), tzsource )
+
+  tzsource%cmnhname   = 'BLAZE'
+  tzsource%clongname  = 'blaze fire model contribution'
+  tzsource%lavailable = lblaze
+  call Budget_source_add( tbudgets(NBUDGET_TH), tzsource )
+
+  tzsource%cmnhname   = 'DRAGB'
+  tzsource%clongname  = 'heat released by buildings'
+  tzsource%lavailable = ldragbldg
+  call Budget_source_add( tbudgets(NBUDGET_TH), tzsource )
+
+  tzsource%cmnhname   = 'VTURB'
+  tzsource%clongname  = 'vertical turbulent diffusion'
+  tzsource%lavailable = hturb == 'TKEL'
+  call Budget_source_add( tbudgets(NBUDGET_TH), tzsource )
+
+  tzsource%cmnhname   = 'HTURB'
+  tzsource%clongname  = 'horizontal turbulent diffusion'
+  tzsource%lavailable = hturb == 'TKEL' .and. HTURBDIM == '3DIM'
+  call Budget_source_add( tbudgets(NBUDGET_TH), tzsource )
+
+  tzsource%cmnhname   = 'DISSH'
+  tzsource%clongname  = 'dissipation'
+  tzsource%lavailable = hturb == 'TKEL'
+  call Budget_source_add( tbudgets(NBUDGET_TH), tzsource )
+
+  tzsource%cmnhname   = 'NETUR'
+  tzsource%clongname  = 'negativity correction induced by turbulence'
+  tzsource%lavailable = hturb == 'TKEL' .and. (      hcloud == 'KESS' .or. hcloud == 'ICE3' .or. hcloud == 'ICE4' &
+                                                .or. hcloud == 'KHKO' .or. hcloud == 'C2R2' .or. hcloud == 'LIMA' )
+  call Budget_source_add( tbudgets(NBUDGET_TH), tzsource )
+
+  tzsource%cmnhname   = 'MAFL'
+  tzsource%clongname  = 'mass flux'
+  tzsource%lavailable = hsconv == 'EDKF'
+  call Budget_source_add( tbudgets(NBUDGET_TH), tzsource )
+
+  tzsource%cmnhname   = 'SNSUB'
+  tzsource%clongname  = 'blowing snow sublimation'
+  tzsource%lavailable = lblowsnow .and. lsnowsubl
+  call Budget_source_add( tbudgets(NBUDGET_TH), tzsource )
+
+  tzsource%cmnhname   = 'VISC'
+  tzsource%clongname  = 'viscosity'
+  tzsource%lavailable = lvisc .and. lvisc_th
+  call Budget_source_add( tbudgets(NBUDGET_TH), tzsource )
+
+  tzsource%cmnhname   = 'OCEAN'
+  tzsource%clongname  = 'radiative tendency due to SW penetrating ocean'
+  tzsource%lavailable = locean .and. (.not. lcouples)
+  call Budget_source_add( tbudgets(NBUDGET_TH), tzsource )
+
+  tzsource%cmnhname   = 'ADV'
+  tzsource%clongname  = 'total advection'
+  tzsource%lavailable = .true.
+  call Budget_source_add( tbudgets(NBUDGET_TH), tzsource )
+
+  tzsource%cmnhname   = 'NEADV'
+  tzsource%clongname  = 'negativity correction induced by advection'
+  tzsource%lavailable =       hcloud == 'KESS' .or. hcloud == 'ICE3' .or. hcloud == 'ICE4' &
+                         .or. hcloud == 'KHKO' .or. hcloud == 'C2R2' .or. hcloud == 'LIMA'
+  call Budget_source_add( tbudgets(NBUDGET_TH), tzsource )
+
+  tzsource%cmnhname   = 'NEGA'
+  tzsource%clongname  = 'negativity correction'
+  tzsource%lavailable =       hcloud == 'KESS' .or. hcloud == 'ICE3' .or. hcloud == 'ICE4' &
+                         .or. hcloud == 'KHKO' .or. hcloud == 'C2R2' .or. hcloud == 'LIMA'
+  call Budget_source_add( tbudgets(NBUDGET_TH), tzsource )
+
+  tzsource%cmnhname   = 'SEDI'
+  tzsource%clongname  = 'heat transport by hydrometeors sedimentation'
+  tzsource%lavailable = hcloud == 'LIMA' .and. lptsplit
+  call Budget_source_add( tbudgets(NBUDGET_TH), tzsource )
+
+  tzsource%cmnhname   = 'HENU'
+  tzsource%clongname  = 'heterogeneous nucleation'
+  gtmp = cactccn == 'ABRK' .and. (lorilam .or. ldust .or. lsalt )
+  tzsource%lavailable =      ( hcloud      == 'LIMA' .and. nmom_c.ge.1 .and. lacti_lima .and. nmod_ccn >= 1   &
+                                                     .and. ( .not.lptsplit .or. .not.lsubg_cond )          ) &
+                        .or. ( hcloud      == 'C2R2' .and. ( gtmp .or. .not.lsupsat_c2r2 ) )                 &
+                        .or. ( hcloud      == 'KHKO' .and. ( gtmp .or. .not.lsupsat_c2r2 ) )
+  call Budget_source_add( tbudgets(NBUDGET_TH), tzsource )
+
+  tzsource%cmnhname   = 'REVA'
+  tzsource%clongname  = 'rain evaporation'
+  tzsource%lavailable =     ( hcloud      == 'LIMA' .and. ( ( .not. lptsplit .and. nmom_r.ge.1 ) .or. lptsplit ) ) &
+                       .or. ( hcloud(1:3) == 'ICE'  .and. lwarm_ice )                                              &
+                       .or. ( hcloud      == 'C2R2' .and. lrain_c2r2 )                                             &
+                       .or. ( hcloud      == 'KHKO' .and. lrain_c2r2 )                                             &
+                       .or.   hcloud      == 'KESS'
+  call Budget_source_add( tbudgets(NBUDGET_TH), tzsource )
+
+  tzsource%cmnhname   = 'HIN'
+  tzsource%clongname  = 'heterogeneous ice nucleation'
+  tzsource%lavailable = hcloud(1:3) == 'ICE' .or. (hcloud == 'LIMA' .and. nmom_i == 1)
+  call Budget_source_add( tbudgets(NBUDGET_TH), tzsource )
+
+  tzsource%cmnhname   = 'HIND'
+  tzsource%clongname  = 'heterogeneous nucleation by deposition'
+  tzsource%lavailable = hcloud == 'LIMA' .and. nmom_i.ge.1 .and. lnucl_lima
+  call Budget_source_add( tbudgets(NBUDGET_TH), tzsource )
+
+  tzsource%cmnhname   = 'HINC'
+  tzsource%clongname  = 'heterogeneous nucleation by contact'
+  tzsource%lavailable = hcloud == 'LIMA' .and. nmom_i.ge.1 .and. lnucl_lima
+  call Budget_source_add( tbudgets(NBUDGET_TH), tzsource )
+
+  tzsource%cmnhname   = 'HON'
+  tzsource%clongname  = 'homogeneous nucleation'
+  tzsource%lavailable = hcloud(1:3) == 'ICE'
+  call Budget_source_add( tbudgets(NBUDGET_TH), tzsource )
+
+  tzsource%cmnhname   = 'HONH'
+  tzsource%clongname  = 'haze homogeneous nucleation'
+  tzsource%lavailable = hcloud == 'LIMA' .and. nmom_i.ge.1 .and. lnucl_lima .and. lhhoni_lima .and. nmod_ccn >= 1
+  call Budget_source_add( tbudgets(NBUDGET_TH), tzsource )
+
+  tzsource%cmnhname   = 'HONC'
+  tzsource%clongname  = 'droplet homogeneous freezing'
+  tzsource%lavailable = hcloud == 'LIMA' .and. ( lptsplit .or. ( nmom_i.ge.1 .and. nmom_c.ge.1 .and. lnucl_lima ) )
+  call Budget_source_add( tbudgets(NBUDGET_TH), tzsource )
+
+  tzsource%cmnhname   = 'HONR'
+  tzsource%clongname  = 'raindrop homogeneous freezing'
+  tzsource%lavailable = hcloud == 'LIMA' .and. ( lptsplit .or. ( nmom_i.ge.1 .and. lnucl_lima .and. nmom_r.ge.1 ) )
+  call Budget_source_add( tbudgets(NBUDGET_TH), tzsource )
+
+  tzsource%cmnhname   = 'SFR'
+  tzsource%clongname  = 'spontaneous freezing'
+  tzsource%lavailable = hcloud(1:3) == 'ICE'
+  call Budget_source_add( tbudgets(NBUDGET_TH), tzsource )
+
+  tzsource%cmnhname   = 'DEPS'
+  tzsource%clongname  = 'deposition on snow'
+  tzsource%lavailable = ( hcloud == 'LIMA' .and. ( lptsplit .or. ( nmom_i.ge.1 .and. nmom_s.ge.1 ) ) ) .or. hcloud(1:3) == 'ICE'
+  call Budget_source_add( tbudgets(NBUDGET_TH), tzsource )
+
+  tzsource%cmnhname   = 'DEPG'
+  tzsource%clongname  = 'deposition on graupel'
+  tzsource%lavailable =    ( hcloud == 'LIMA' .and. ( lptsplit .or. ( nmom_i.ge.1 .and. nmom_c.ge.1 .and. nmom_s.ge.1 ) ) ) &
+                        .or. hcloud(1:3) == 'ICE'
+  call Budget_source_add( tbudgets(NBUDGET_TH), tzsource )
+
+  tzsource%cmnhname   = 'DEPH'
+  tzsource%clongname  = 'deposition on hail'
+  tzsource%lavailable =    ( hcloud == 'LIMA' .and. ( lptsplit .or. nmom_h.ge.1 ) ) &
+                        .or. hcloud == 'ICE4'
+  call Budget_source_add( tbudgets(NBUDGET_TH), tzsource )
+
+  tzsource%cmnhname   = 'IMLT'
+  tzsource%clongname  = 'melting of ice'
+  tzsource%lavailable = ( hcloud == 'LIMA' .and. ( lptsplit .or. ( nmom_i.ge.1 .and. nmom_c.ge.1 ) ) ) .or. hcloud(1:3) == 'ICE'
+  call Budget_source_add( tbudgets(NBUDGET_TH), tzsource )
+
+  tzsource%cmnhname   = 'BERFI'
+  tzsource%clongname  = 'Bergeron-Findeisen'
+  tzsource%lavailable = ( hcloud == 'LIMA' .and. ( lptsplit .or. ( nmom_i.ge.1 .and. nmom_c.ge.1 ) ) ) .or. hcloud(1:3) == 'ICE'
+  call Budget_source_add( tbudgets(NBUDGET_TH), tzsource )
+
+  tzsource%cmnhname   = 'RIM'
+  tzsource%clongname  = 'riming of cloud water'
+  tzsource%lavailable =    ( hcloud == 'LIMA' .and. ( lptsplit .or. ( nmom_i.ge.1 .and. nmom_c.ge.1 .and. nmom_s.ge.1 ) ) ) &
+                        .or. hcloud(1:3) == 'ICE'
+  call Budget_source_add( tbudgets(NBUDGET_TH), tzsource )
+
+  tzsource%cmnhname   = 'ACC'
+  tzsource%clongname  = 'accretion of rain on aggregates'
+  tzsource%lavailable =      ( hcloud == 'LIMA' .and. (        lptsplit                                                            &
+                                                        .or. ( nmom_s.ge.1 .and. nmom_r.ge.1 ) ) ) &
+                        .or.   hcloud(1:3) == 'ICE'
+  call Budget_source_add( tbudgets(NBUDGET_TH), tzsource )
+
+  tzsource%cmnhname   = 'CFRZ'
+  tzsource%clongname  = 'conversion freezing of rain'
+  tzsource%lavailable =    ( hcloud == 'LIMA' .and. ( lptsplit .or. ( nmom_i.ge.1 .and. nmom_c.ge.1 .and. nmom_s.ge.1 ) ) ) &
+                        .or. hcloud(1:3) == 'ICE'
+  call Budget_source_add( tbudgets(NBUDGET_TH), tzsource )
+
+  tzsource%cmnhname   = 'WETG'
+  tzsource%clongname  = 'wet growth of graupel'
+  tzsource%lavailable =    ( hcloud == 'LIMA' .and. ( lptsplit .or. ( nmom_i.ge.1 .and. nmom_c.ge.1 .and. nmom_s.ge.1 ) ) ) &
+                        .or. hcloud(1:3) == 'ICE'
+  call Budget_source_add( tbudgets(NBUDGET_TH), tzsource )
+
+  tzsource%cmnhname   = 'DRYG'
+  tzsource%clongname  = 'dry growth of graupel'
+  tzsource%lavailable =    ( hcloud == 'LIMA' .and. ( lptsplit .or. ( nmom_i.ge.1 .and. nmom_c.ge.1 .and. nmom_s.ge.1 ) ) ) &
+                        .or. hcloud(1:3) == 'ICE'
+  call Budget_source_add( tbudgets(NBUDGET_TH), tzsource )
+
+  tzsource%cmnhname   = 'GMLT'
+  tzsource%clongname  = 'graupel melting'
+  tzsource%lavailable =    ( hcloud == 'LIMA' .and. ( lptsplit .or. ( nmom_i.ge.1 .and. nmom_c.ge.1 .and. nmom_s.ge.1 ) ) ) &
+                        .or. hcloud(1:3) == 'ICE'
+  call Budget_source_add( tbudgets(NBUDGET_TH), tzsource )
+
+  tzsource%cmnhname   = 'WETH'
+  tzsource%clongname  = 'wet growth of hail'
+  tzsource%lavailable =      ( hcloud == 'LIMA' .and. .not.lptsplit .and. nmom_h.ge.1 .and. nmom_i.ge.1 &
+                                                .and. nmom_c.ge.1    .and. nmom_s.ge.1 )                   &
+                        .or. ( hcloud == 'LIMA' .and. lptsplit ) &
+                        .or.   hcloud == 'ICE4' 
+  call Budget_source_add( tbudgets(NBUDGET_TH), tzsource )
+
+  tzsource%cmnhname   = 'DRYH'
+  tzsource%clongname  = 'dry growth of hail'
+  tzsource%lavailable = hcloud == 'ICE4' .and. lred .and. celec == 'NONE'
+  call Budget_source_add( tbudgets(NBUDGET_TH), tzsource )
+
+  tzsource%cmnhname   = 'HMLT'
+  tzsource%clongname  = 'melting of hail'
+  tzsource%lavailable =      ( hcloud == 'LIMA' .and. .not.lptsplit .and. nmom_h.ge.1 .and. nmom_i.ge.1 &
+                                                .and. nmom_c.ge.1    .and. nmom_s.ge.1 ) &
+                        .or. ( hcloud == 'LIMA' .and. lptsplit ) &
+                        .or.   hcloud == 'ICE4'
+  call Budget_source_add( tbudgets(NBUDGET_TH), tzsource )
+
+  tzsource%cmnhname   = 'CORR'
+  tzsource%clongname  = 'correction'
+  tzsource%lavailable = hcloud(1:3) == 'ICE' .and. lred .and. celec == 'NONE'
+  call Budget_source_add( tbudgets(NBUDGET_TH), tzsource )
+
+  tzsource%cmnhname   = 'CEDS'
+  tzsource%clongname  = 'adjustment to saturation'
+  tzsource%lavailable = hcloud == 'LIMA'
+  call Budget_source_add( tbudgets(NBUDGET_TH), tzsource )
+
+  tzsource%cmnhname   = 'ADJU'
+  tzsource%clongname  = 'adjustment to saturation'
+  tzsource%lavailable = hcloud(1:3) == 'ICE' .and. lred .and. ladj_before .and. celec == 'NONE'
+  call Budget_source_add( tbudgets(NBUDGET_TH), tzsource )
+
+  tzsource%cmnhname   = 'DEPI'
+  tzsource%clongname  = 'deposition on ice'
+  tzsource%lavailable =      ( hcloud(1:3) == 'ICE' .and. ( .not. lred .or. ( lred .and. ladj_after ) .or. celec /= 'NONE') ) &
+                        .or. ( hcloud == 'LIMA' .and. lptsplit )
+  call Budget_source_add( tbudgets(NBUDGET_TH), tzsource )
+
+  tzsource%cmnhname   = 'COND'
+  tzsource%clongname  = 'vapor condensation or cloud water evaporation'
+  tzsource%lavailable = hcloud == 'C2R2' .or. hcloud == 'KHKO' .or. hcloud == 'KESS' .or. hcloud == 'REVE'
+  call Budget_source_add( tbudgets(NBUDGET_TH), tzsource )
+
+  tzsource%cmnhname   = 'NECON'
+  tzsource%clongname  = 'negativity correction induced by condensation'
+  tzsource%lavailable = (      hcloud == 'KESS' .or. hcloud == 'ICE3' .or. hcloud == 'ICE4'   &
+                          .or. hcloud == 'KHKO' .or. hcloud == 'C2R2' .or. hcloud == 'LIMA' ) &
+                        .and. celec == 'NONE'
+  call Budget_source_add( tbudgets(NBUDGET_TH), tzsource )
+
+
+  call Sourcelist_sort_compact( tbudgets(NBUDGET_TH) )
+
+  call Sourcelist_scan( tbudgets(NBUDGET_TH), cbulist_rth )
+end if
+
+! Budget of RTKE
+tbudgets(NBUDGET_TKE)%lenabled = lbu_rtke
+
+if ( lbu_rtke ) then
+  tbudgets(NBUDGET_TKE)%trhodj => tburhodj
+
+  !Allocate all basic source terms (used or not)
+  !The size should be large enough (bigger than necessary is OK)
+  tbudgets(NBUDGET_TKE)%nsourcesmax = NSOURCESMAX
+  allocate( tbudgets(NBUDGET_TKE)%tsources(NSOURCESMAX) )
+
+  allocate( tbudgets(NBUDGET_TKE)%xtmpstore(ibudim1, ibudim2, ibudim3) )
+
+  tbudgets(NBUDGET_TKE)%tsources(:)%ngroup = 0
+
+  tzsource%ccomment = 'Budget of turbulent kinetic energy'
+  tzsource%ngrid    = 1
+
+  tzsource%cunits   = 'm2 s-1'
+
+  tzsource%cmnhname   = 'INIF'
+  tzsource%clongname  = 'initial state'
+  tzsource%lavailable = .true.
+  call Budget_source_add( tbudgets(NBUDGET_TKE), tzsource, odonotinit = .true., ooverwrite = .true. )
+
+  tzsource%cmnhname   = 'ENDF'
+  tzsource%clongname  = 'final state'
+  tzsource%lavailable = .true.
+  call Budget_source_add( tbudgets(NBUDGET_TKE), tzsource, odonotinit = .true., ooverwrite = .true. )
+
+  tzsource%cmnhname   = 'AVEF'
+  tzsource%clongname  = 'averaged state'
+  tzsource%lavailable = .true.
+  call Budget_source_add( tbudgets(NBUDGET_TKE), tzsource, odonotinit = .true., ooverwrite = .false. )
+
+  tzsource%cunits   = 'm2 s-3'
+
+  tzsource%cmnhname   = 'ASSE'
+  tzsource%clongname  = 'time filter (Asselin)'
+  tzsource%lavailable = .true.
+  call Budget_source_add( tbudgets(NBUDGET_TKE), tzsource )
+
+  tzsource%cmnhname   = 'FRC'
+  tzsource%clongname  = 'forcing'
+  tzsource%lavailable = lforcing
+  call Budget_source_add( tbudgets(NBUDGET_TKE), tzsource )
+
+  tzsource%cmnhname   = 'DIF'
+  tzsource%clongname  = 'numerical diffusion'
+  tzsource%lavailable = onumdifth
+  call Budget_source_add( tbudgets(NBUDGET_TKE), tzsource )
+
+  tzsource%cmnhname   = 'REL'
+  tzsource%clongname  = 'relaxation'
+  tzsource%lavailable = ohorelax_tke
+  call Budget_source_add( tbudgets(NBUDGET_TKE), tzsource )
+
+  tzsource%cmnhname   = 'DRAG'
+  tzsource%clongname  = 'drag force'
+  tzsource%lavailable = odragtree
+  call Budget_source_add( tbudgets(NBUDGET_TKE), tzsource )
+
+  tzsource%cmnhname   = 'DRAGB'
+  tzsource%clongname  = 'drag force due to buildings'
+  tzsource%lavailable = ldragbldg
+  call Budget_source_add( tbudgets(NBUDGET_TKE), tzsource )
+
+  tzsource%cmnhname   = 'DP'
+  tzsource%clongname  = 'dynamic production'
+  tzsource%lavailable = .true.
+  call Budget_source_add( tbudgets(NBUDGET_TKE), tzsource )
+
+  tzsource%cmnhname   = 'TP'
+  tzsource%clongname  = 'thermal production'
+  tzsource%lavailable = .true.
+  call Budget_source_add( tbudgets(NBUDGET_TKE), tzsource )
+
+  tzsource%cmnhname   = 'DISS'
+  tzsource%clongname  = 'dissipation of TKE'
+  tzsource%lavailable = .true.
+  call Budget_source_add( tbudgets(NBUDGET_TKE), tzsource )
+
+  tzsource%cmnhname   = 'TR'
+  tzsource%clongname  = 'turbulent transport'
+  tzsource%lavailable = .true.
+  call Budget_source_add( tbudgets(NBUDGET_TKE), tzsource )
+
+  tzsource%cmnhname   = 'ADV'
+  tzsource%clongname  = 'total advection'
+  tzsource%lavailable = .true.
+  call Budget_source_add( tbudgets(NBUDGET_TKE), tzsource )
+
+
+  call Sourcelist_sort_compact( tbudgets(NBUDGET_TKE) )
+
+  call Sourcelist_scan( tbudgets(NBUDGET_TKE), cbulist_rtke )
+end if
+
+! Budget of RRV
+tbudgets(NBUDGET_RV)%lenabled = lbu_rrv .and. krr >= 1
+
+if ( tbudgets(NBUDGET_RV)%lenabled ) then
+  tbudgets(NBUDGET_RV)%trhodj => tburhodj
+
+  !Allocate all basic source terms (used or not)
+  !The size should be large enough (bigger than necessary is OK)
+  tbudgets(NBUDGET_RV)%nsourcesmax = NSOURCESMAX
+  allocate( tbudgets(NBUDGET_RV)%tsources(NSOURCESMAX) )
+
+  allocate( tbudgets(NBUDGET_RV)%xtmpstore(ibudim1, ibudim2, ibudim3) )
+
+  tbudgets(NBUDGET_RV)%tsources(:)%ngroup = 0
+
+  tzsource%ccomment = 'Budget of water vapor mixing ratio'
+  tzsource%ngrid    = 1
+
+  tzsource%cunits   = 'kg kg-1'
+
+  tzsource%cmnhname   = 'INIF'
+  tzsource%clongname  = 'initial state'
+  tzsource%lavailable = .true.
+  call Budget_source_add( tbudgets(NBUDGET_RV), tzsource, odonotinit = .true., ooverwrite = .true. )
+
+  tzsource%cmnhname   = 'ENDF'
+  tzsource%clongname  = 'final state'
+  tzsource%lavailable = .true.
+  call Budget_source_add( tbudgets(NBUDGET_RV), tzsource, odonotinit = .true., ooverwrite = .true. )
+
+  tzsource%cmnhname   = 'AVEF'
+  tzsource%clongname  = 'averaged state'
+  tzsource%lavailable = .true.
+  call Budget_source_add( tbudgets(NBUDGET_RV), tzsource, odonotinit = .true., ooverwrite = .false. )
+
+  tzsource%cunits   = 's-1'
+
+  tzsource%cmnhname   = 'ASSE'
+  tzsource%clongname  = 'time filter (Asselin)'
+  tzsource%lavailable = .true.
+  call Budget_source_add( tbudgets(NBUDGET_RV), tzsource )
+
+  tzsource%cmnhname   = 'NEST'
+  tzsource%clongname  = 'nesting'
+  tzsource%lavailable = nmodel > 1
+  call Budget_source_add( tbudgets(NBUDGET_RV), tzsource )
+
+  tzsource%cmnhname   = 'FRC'
+  tzsource%clongname  = 'forcing'
+  tzsource%lavailable = lforcing
+  call Budget_source_add( tbudgets(NBUDGET_RV), tzsource )
+
+  tzsource%cmnhname   = '2DADV'
+  tzsource%clongname  = 'advective forcing'
+  tzsource%lavailable = l2d_adv_frc
+  call Budget_source_add( tbudgets(NBUDGET_RV), tzsource )
+
+  tzsource%cmnhname   = '2DREL'
+  tzsource%clongname  = 'relaxation forcing'
+  tzsource%lavailable = l2d_rel_frc
+  call Budget_source_add( tbudgets(NBUDGET_RV), tzsource )
+
+  tzsource%cmnhname   = 'NUD'
+  tzsource%clongname  = 'nudging'
+  tzsource%lavailable = onudging
+  call Budget_source_add( tbudgets(NBUDGET_RV), tzsource )
+
+  tzsource%cmnhname   = 'DIF'
+  tzsource%clongname  = 'numerical diffusion'
+  tzsource%lavailable = onumdifth
+  call Budget_source_add( tbudgets(NBUDGET_RV), tzsource )
+
+  tzsource%cmnhname   = 'REL'
+  tzsource%clongname  = 'relaxation'
+  tzsource%lavailable = ohorelax_rv
+  call Budget_source_add( tbudgets(NBUDGET_RV), tzsource )
+
+  tzsource%cmnhname   = 'DCONV'
+  tzsource%clongname  = 'KAFR convection'
+  tzsource%lavailable = hdconv == 'KAFR' .OR. hsconv == 'KAFR'
+  call Budget_source_add( tbudgets(NBUDGET_RV), tzsource )
+
+  tzsource%cmnhname   = 'DRAGB'
+  tzsource%clongname  = 'vapor released by buildings'
+  tzsource%lavailable = ldragbldg
+  call Budget_source_add( tbudgets(NBUDGET_RV), tzsource )
+  
+  tzsource%cmnhname   = 'BLAZE'
+  tzsource%clongname  = 'blaze fire model contribution'
+  tzsource%lavailable = lblaze
+  call Budget_source_add( tbudgets(NBUDGET_RV), tzsource )
+
+  tzsource%cmnhname   = 'VTURB'
+  tzsource%clongname  = 'vertical turbulent diffusion'
+  tzsource%lavailable = hturb == 'TKEL'
+  call Budget_source_add( tbudgets(NBUDGET_RV), tzsource )
+
+  tzsource%cmnhname   = 'HTURB'
+  tzsource%clongname  = 'horizontal turbulent diffusion'
+  tzsource%lavailable = hturb == 'TKEL' .and. HTURBDIM == '3DIM'
+  call Budget_source_add( tbudgets(NBUDGET_RV), tzsource )
+
+  tzsource%cmnhname   = 'NETUR'
+  tzsource%clongname  = 'negativity correction induced by turbulence'
+  tzsource%lavailable = hturb == 'TKEL' .and. (      hcloud == 'KESS' .or. hcloud == 'ICE3' .or. hcloud == 'ICE4' &
+                                                .or. hcloud == 'KHKO' .or. hcloud == 'C2R2' .or. hcloud == 'LIMA' )
+  call Budget_source_add( tbudgets(NBUDGET_RV), tzsource )
+
+  tzsource%cmnhname   = 'MAFL'
+  tzsource%clongname  = 'mass flux'
+  tzsource%lavailable = hsconv == 'EDKF'
+  call Budget_source_add( tbudgets(NBUDGET_RV), tzsource )
+
+  tzsource%cmnhname   = 'SNSUB'
+  tzsource%clongname  = 'blowing snow sublimation'
+  tzsource%lavailable = lblowsnow .and. lsnowsubl
+  call Budget_source_add( tbudgets(NBUDGET_RV), tzsource )
+
+  tzsource%cmnhname   = 'VISC'
+  tzsource%clongname  = 'viscosity'
+  tzsource%lavailable = lvisc .and. lvisc_r
+  call Budget_source_add( tbudgets(NBUDGET_RV), tzsource )
+
+  tzsource%cmnhname   = 'ADV'
+  tzsource%clongname  = 'total advection'
+  tzsource%lavailable = .true.
+  call Budget_source_add( tbudgets(NBUDGET_RV), tzsource )
+
+  tzsource%cmnhname   = 'NEADV'
+  tzsource%clongname  = 'negativity correction induced by advection'
+  tzsource%lavailable =       hcloud == 'KESS' .or. hcloud == 'ICE3' .or. hcloud == 'ICE4' &
+                         .or. hcloud == 'KHKO' .or. hcloud == 'C2R2' .or. hcloud == 'LIMA'
+  call Budget_source_add( tbudgets(NBUDGET_RV), tzsource )
+
+  tzsource%cmnhname   = 'NEGA'
+  tzsource%clongname  = 'negativity correction'
+  tzsource%lavailable =       hcloud == 'KESS' .or. hcloud == 'ICE3' .or. hcloud == 'ICE4' &
+                         .or. hcloud == 'KHKO' .or. hcloud == 'C2R2' .or. hcloud == 'LIMA'
+  call Budget_source_add( tbudgets(NBUDGET_RV), tzsource )
+
+  tzsource%cmnhname   = 'HENU'
+  tzsource%clongname  = 'heterogeneous nucleation'
+  gtmp = cactccn == 'ABRK' .and. (lorilam .or. ldust .or. lsalt )
+  tzsource%lavailable =      ( hcloud      == 'LIMA' .and. nmom_c.ge.1 .and. lacti_lima .and. nmod_ccn >= 1   &
+                                                     .and. ( .not.lptsplit .or. .not.lsubg_cond )          ) &
+                        .or. ( hcloud      == 'C2R2' .and. ( gtmp .or. .not.lsupsat_c2r2 ) )                 &
+                        .or. ( hcloud      == 'KHKO' .and. ( gtmp .or. .not.lsupsat_c2r2 ) )
+  call Budget_source_add( tbudgets(NBUDGET_RV), tzsource )
+
+  tzsource%cmnhname   = 'REVA'
+  tzsource%clongname  = 'rain evaporation'
+  tzsource%lavailable =      ( hcloud      == 'LIMA' .and. ( ( .not. lptsplit .and. nmom_c.ge.1 .and. nmom_r.ge.1 ) &
+                                                             .or.    lptsplit ) )                                 &
+                        .or. ( hcloud(1:3) == 'ICE'  .and. lwarm_ice )                                            &
+                        .or. ( hcloud      == 'C2R2' .and. lrain_c2r2 )                                           &
+                        .or. ( hcloud      == 'KHKO' .and. lrain_c2r2 )                                           &
+                        .or.   hcloud      == 'KESS'
+  call Budget_source_add( tbudgets(NBUDGET_RV), tzsource )
+
+  tzsource%cmnhname   = 'HIN'
+  tzsource%clongname  = 'heterogeneous ice nucleation'
+  tzsource%lavailable = hcloud(1:3) == 'ICE' .or. ( hcloud == 'LIMA' .and. nmom_i == 1 )
+  call Budget_source_add( tbudgets(NBUDGET_RV), tzsource )
+
+  tzsource%cmnhname   = 'HIND'
+  tzsource%clongname  = 'heterogeneous nucleation by deposition'
+  tzsource%lavailable = hcloud == 'LIMA' .and. nmom_i.ge.1 .and. lnucl_lima
+  call Budget_source_add( tbudgets(NBUDGET_RV), tzsource )
+
+  tzsource%cmnhname   = 'HONH'
+  tzsource%clongname  = 'haze homogeneous nucleation'
+  tzsource%lavailable = hcloud == 'LIMA' .and. nmom_i.ge.1 .and. lnucl_lima .and. lhhoni_lima .and. nmod_ccn >= 1
+  call Budget_source_add( tbudgets(NBUDGET_RV), tzsource )
+
+  tzsource%cmnhname   = 'DEPS'
+  tzsource%clongname  = 'deposition on snow'
+  tzsource%lavailable = ( hcloud == 'LIMA' .and. ( lptsplit .or. ( nmom_i.ge.1 .and. nmom_s.ge.1 ) ) ) .or. hcloud(1:3) == 'ICE'
+  call Budget_source_add( tbudgets(NBUDGET_RV), tzsource )
+
+  tzsource%cmnhname   = 'DEPG'
+  tzsource%clongname  = 'deposition on graupel'
+  tzsource%lavailable =    ( hcloud == 'LIMA' .and. ( lptsplit .or. ( nmom_i.ge.1 .and. nmom_c.ge.1 .and. nmom_s.ge.1 ) ) ) &
+                        .or. hcloud(1:3) == 'ICE'
+  call Budget_source_add( tbudgets(NBUDGET_RV), tzsource )
+
+  tzsource%cmnhname   = 'DEPH'
+  tzsource%clongname  = 'deposition on HAIL'
+  tzsource%lavailable =    ( hcloud == 'LIMA' .and. ( lptsplit .or. nmom_h.ge.1 )  &
+                        .or. hcloud == 'ICE4' )
+  call Budget_source_add( tbudgets(NBUDGET_RV), tzsource )
+
+  tzsource%cmnhname   = 'CEDS'
+  tzsource%clongname  = 'adjustment to saturation'
+  tzsource%lavailable = hcloud == 'LIMA'
+  call Budget_source_add( tbudgets(NBUDGET_RV), tzsource )
+
+  tzsource%cmnhname   = 'ADJU'
+  tzsource%clongname  = 'adjustment to saturation'
+  tzsource%lavailable = hcloud(1:3) == 'ICE' .and. lred .and. ladj_before .and. celec == 'NONE'
+  call Budget_source_add( tbudgets(NBUDGET_RV), tzsource )
+
+  tzsource%cmnhname   = 'COND'
+  tzsource%clongname  = 'vapor condensation or cloud water evaporation'
+  tzsource%lavailable = hcloud == 'C2R2' .or. hcloud == 'KHKO' .or. hcloud == 'KESS' .or. hcloud == 'REVE'
+  call Budget_source_add( tbudgets(NBUDGET_RV), tzsource )
+
+  tzsource%cmnhname   = 'CORR'
+  tzsource%clongname  = 'correction'
+  tzsource%lavailable = hcloud(1:3) == 'ICE' .and. lred .and. celec == 'NONE'
+  call Budget_source_add( tbudgets(NBUDGET_RV), tzsource )
+
+  tzsource%cmnhname   = 'DEPI'
+  tzsource%clongname  = 'deposition on ice'
+  tzsource%lavailable =      ( hcloud(1:3) == 'ICE' .and. ( .not. lred .or. ( lred .and. ladj_after ) .or. celec /= 'NONE') ) &
+                        .or. ( hcloud == 'LIMA' .and. lptsplit )
+  call Budget_source_add( tbudgets(NBUDGET_RV), tzsource )
+
+  tzsource%cmnhname   = 'CORR2'
+  tzsource%clongname  = 'supplementary correction inside LIMA splitting'
+  tzsource%lavailable = hcloud == 'LIMA' .and. lptsplit
+  call Budget_source_add( tbudgets(NBUDGET_RV), tzsource )
+
+  tzsource%cmnhname   = 'NECON'
+  tzsource%clongname  = 'negativity correction induced by condensation'
+  tzsource%lavailable = (      hcloud == 'KESS' .or. hcloud == 'ICE3' .or. hcloud == 'ICE4'   &
+                          .or. hcloud == 'KHKO' .or. hcloud == 'C2R2' .or. hcloud == 'LIMA' ) &
+                        .and. celec == 'NONE'
+  call Budget_source_add( tbudgets(NBUDGET_RV), tzsource )
+
+
+  call Sourcelist_sort_compact( tbudgets(NBUDGET_RV) )
+
+  call Sourcelist_scan( tbudgets(NBUDGET_RV), cbulist_rrv )
+end if
+
+! Budget of RRC
+tbudgets(NBUDGET_RC)%lenabled = lbu_rrc .and. krr >= 2
+
+if ( tbudgets(NBUDGET_RC)%lenabled ) then
+  if ( hcloud(1:3) == 'ICE' .and. lred .and. lsedic_ice .and. ldeposc_ice ) &
+    call Print_msg( NVERB_WARNING, 'BUD', 'Ini_budget', 'lred=T + lsedic=T + ldeposc=T:'// &
+                                                        'DEPO and SEDI source terms are mixed and stored in SEDI' )
+
+  tbudgets(NBUDGET_RC)%trhodj => tburhodj
+
+  !Allocate all basic source terms (used or not)
+  !The size should be large enough (bigger than necessary is OK)
+  tbudgets(NBUDGET_RC)%nsourcesmax = NSOURCESMAX
+  allocate( tbudgets(NBUDGET_RC)%tsources(NSOURCESMAX) )
+
+  allocate( tbudgets(NBUDGET_RC)%xtmpstore(ibudim1, ibudim2, ibudim3) )
+
+  tbudgets(NBUDGET_RC)%tsources(:)%ngroup = 0
+
+  tzsource%ccomment = 'Budget of cloud water mixing ratio'
+  tzsource%ngrid    = 1
+
+  tzsource%cunits   = 'kg kg-1'
+
+  tzsource%cmnhname   = 'INIF'
+  tzsource%clongname  = 'initial state'
+  tzsource%lavailable = .true.
+  call Budget_source_add( tbudgets(NBUDGET_RC), tzsource, odonotinit = .true., ooverwrite = .true. )
+
+  tzsource%cmnhname   = 'ENDF'
+  tzsource%clongname  = 'final state'
+  tzsource%lavailable = .true.
+  call Budget_source_add( tbudgets(NBUDGET_RC), tzsource, odonotinit = .true., ooverwrite = .true. )
+
+  tzsource%cmnhname   = 'AVEF'
+  tzsource%clongname  = 'averaged state'
+  tzsource%lavailable = .true.
+  call Budget_source_add( tbudgets(NBUDGET_RC), tzsource, odonotinit = .true., ooverwrite = .false. )
+
+  tzsource%cunits   = 's-1'
+
+  tzsource%cmnhname   = 'ASSE'
+  tzsource%clongname  = 'time filter (Asselin)'
+  tzsource%lavailable = .true.
+  call Budget_source_add( tbudgets(NBUDGET_RC), tzsource )
+
+  tzsource%cmnhname   = 'NEST'
+  tzsource%clongname  = 'nesting'
+  tzsource%lavailable = nmodel > 1
+  call Budget_source_add( tbudgets(NBUDGET_RC), tzsource )
+
+  tzsource%cmnhname   = 'FRC'
+  tzsource%clongname  = 'forcing'
+  tzsource%lavailable = lforcing
+  call Budget_source_add( tbudgets(NBUDGET_RC), tzsource )
+
+  tzsource%cmnhname   = 'DIF'
+  tzsource%clongname  = 'numerical diffusion'
+  tzsource%lavailable = onumdifth
+  call Budget_source_add( tbudgets(NBUDGET_RC), tzsource )
+
+  tzsource%cmnhname   = 'REL'
+  tzsource%clongname  = 'relaxation'
+  tzsource%lavailable = ohorelax_rc
+  call Budget_source_add( tbudgets(NBUDGET_RC), tzsource )
+
+  tzsource%cmnhname   = 'DCONV'
+  tzsource%clongname  = 'KAFR convection'
+  tzsource%lavailable = hdconv == 'KAFR' .OR. hsconv == 'KAFR'
+  call Budget_source_add( tbudgets(NBUDGET_RC), tzsource )
+
+  tzsource%cmnhname   = 'DEPOTR'
+  tzsource%clongname  = 'tree droplet deposition'
+  tzsource%lavailable = odragtree .and. odepotree
+  call Budget_source_add( tbudgets(NBUDGET_RC), tzsource )
+
+  tzsource%cmnhname   = 'VTURB'
+  tzsource%clongname  = 'vertical turbulent diffusion'
+  tzsource%lavailable = hturb == 'TKEL'
+  call Budget_source_add( tbudgets(NBUDGET_RC), tzsource )
+
+  tzsource%cmnhname   = 'HTURB'
+  tzsource%clongname  = 'horizontal turbulent diffusion'
+  tzsource%lavailable = hturb == 'TKEL' .and. HTURBDIM == '3DIM'
+  call Budget_source_add( tbudgets(NBUDGET_RC), tzsource )
+
+  tzsource%cmnhname   = 'NETUR'
+  tzsource%clongname  = 'negativity correction induced by turbulence'
+  tzsource%lavailable = hturb == 'TKEL' .and. (      hcloud == 'KESS' .or. hcloud == 'ICE3' .or. hcloud == 'ICE4' &
+                                                .or. hcloud == 'KHKO' .or. hcloud == 'C2R2' .or. hcloud == 'LIMA' )
+  call Budget_source_add( tbudgets(NBUDGET_RC), tzsource )
+
+  tzsource%cmnhname   = 'VISC'
+  tzsource%clongname  = 'viscosity'
+  tzsource%lavailable = lvisc .and. lvisc_r
+  call Budget_source_add( tbudgets(NBUDGET_RC), tzsource )
+
+  tzsource%cmnhname   = 'ADV'
+  tzsource%clongname  = 'total advection'
+  tzsource%lavailable = .true.
+  call Budget_source_add( tbudgets(NBUDGET_RC), tzsource )
+
+  tzsource%cmnhname   = 'NEADV'
+  tzsource%clongname  = 'negativity correction induced by advection'
+  tzsource%lavailable =       hcloud == 'KESS' .or. hcloud == 'ICE3' .or. hcloud == 'ICE4' &
+                         .or. hcloud == 'KHKO' .or. hcloud == 'C2R2' .or. hcloud == 'LIMA'
+  call Budget_source_add( tbudgets(NBUDGET_RC), tzsource )
+
+  tzsource%cmnhname   = 'NEGA'
+  tzsource%clongname  = 'negativity correction'
+  tzsource%lavailable =       hcloud == 'KESS' .or. hcloud == 'ICE3' .or. hcloud == 'ICE4' &
+                         .or. hcloud == 'KHKO' .or. hcloud == 'C2R2' .or. hcloud == 'LIMA'
+  call Budget_source_add( tbudgets(NBUDGET_RC), tzsource )
+
+  tzsource%cmnhname   = 'CORR'
+  tzsource%clongname  = 'correction'
+!   tzsource%lavailable =       ( hcloud      == 'LIMA' .and. lptsplit .and. nmom_c.ge.1 .and. nmom_r.ge.1 ) &
+!                          .or. ( hcloud(1:3) == 'ICE' .and. lred .and. celec == 'NONE' )
+  tzsource%lavailable =  hcloud(1:3) == 'ICE' .and. lred .and. celec == 'NONE'
+  call Budget_source_add( tbudgets(NBUDGET_RC), tzsource )
+
+  tzsource%cmnhname   = 'SEDI'
+  tzsource%clongname  = 'sedimentation of cloud'
+  tzsource%lavailable =    ( hcloud      == 'LIMA' .and. nmom_c.ge.1 .and. lsedc_lima ) &
+                      .or. ( hcloud(1:3) == 'ICE'  .and. lsedic_ice )                  &
+                      .or. ( hcloud      == 'C2R2' .and. lsedc_c2r2 )                  &
+                      .or. ( hcloud      == 'KHKO' .and. lsedc_c2r2 )
+  call Budget_source_add( tbudgets(NBUDGET_RC), tzsource )
+
+  tzsource%cmnhname   = 'DEPO'
+  tzsource%clongname  = 'surface droplet deposition'
+  tzsource%lavailable =      ( hcloud == 'LIMA' .and. nmom_c.ge.1 .and. ldepoc_lima ) &
+                        .or. ( hcloud      == 'C2R2' .and. ldepoc_c2r2 )             &
+                        .or. ( hcloud      == 'KHKO' .and. ldepoc_c2r2 )             &
+                        .or. ( hcloud(1:3) == 'ICE'  .and. ldeposc_ice .and. celec == 'NONE' )
+  call Budget_source_add( tbudgets(NBUDGET_RC), tzsource )
+
+  tzsource%cmnhname   = 'R2C1'
+  tzsource%clongname  = 'rain to cloud change after sedimentation'
+  tzsource%lavailable = hcloud == 'LIMA' .and. lptsplit .and. nmom_c.ge.1 .and. nmom_r.ge.1
+  call Budget_source_add( tbudgets(NBUDGET_RC), tzsource )
+
+  tzsource%cmnhname   = 'HENU'
+  tzsource%clongname  = 'CCN activation'
+  gtmp = cactccn == 'ABRK' .and. (lorilam .or. ldust .or. lsalt )
+  tzsource%lavailable =      ( hcloud      == 'LIMA' .and. nmom_c.ge.1 .and. lacti_lima .and. nmod_ccn >= 1   &
+                                                     .and. ( .not.lptsplit .or. .not.lsubg_cond )          ) &
+                        .or. ( hcloud      == 'C2R2' .and. ( gtmp .or. .not.lsupsat_c2r2 ) )                 &
+                        .or. ( hcloud      == 'KHKO' .and. ( gtmp .or. .not.lsupsat_c2r2 ) )
+  call Budget_source_add( tbudgets(NBUDGET_RC), tzsource )
+
+  tzsource%cmnhname   = 'HINC'
+  tzsource%clongname  = 'heterogeneous nucleation by contact'
+  tzsource%lavailable = hcloud == 'LIMA' .and. nmom_i.ge.1 .and. lnucl_lima
+  call Budget_source_add( tbudgets(NBUDGET_RC), tzsource )
+
+  tzsource%cmnhname   = 'ADJU'
+  tzsource%clongname  = 'adjustment to saturation'
+  tzsource%lavailable = hcloud(1:3) == 'ICE' .and. lred .and. ladj_before .and. celec == 'NONE'
+  call Budget_source_add( tbudgets(NBUDGET_RC), tzsource )
+
+  tzsource%cmnhname   = 'HON'
+  tzsource%clongname  = 'homogeneous nucleation'
+  tzsource%lavailable = hcloud(1:3) == 'ICE'
+  call Budget_source_add( tbudgets(NBUDGET_RC), tzsource )
+
+  tzsource%cmnhname   = 'AUTO'
+  tzsource%clongname  = 'autoconversion into rain'
+  tzsource%lavailable =       ( hcloud      == 'LIMA' .and. ( lptsplit .or. ( nmom_c.ge.1 .and. nmom_r.ge.1 ) ) ) &
+                         .or.   hcloud      == 'KESS'                                                           &
+                         .or. ( hcloud(1:3) == 'ICE'  .and. lwarm_ice )                                         &
+                         .or. ( hcloud      == 'C2R2' .and. lrain_c2r2 )                                        &
+                         .or. ( hcloud      == 'KHKO' .and. lrain_c2r2 )
+  call Budget_source_add( tbudgets(NBUDGET_RC), tzsource )
+
+  tzsource%cmnhname   = 'ACCR'
+  tzsource%clongname  = 'accretion of cloud droplets'
+  tzsource%lavailable =       ( hcloud == 'LIMA' .and. ( lptsplit .or. ( nmom_c.ge.1 .and. nmom_r.ge.1 ) ) ) &
+                         .or.   hcloud      == 'KESS'                                                      &
+                         .or. ( hcloud(1:3) == 'ICE'  .and. lwarm_ice )                                    &
+                         .or. ( hcloud      == 'C2R2' .and. lrain_c2r2 )                                   &
+                         .or. ( hcloud      == 'KHKO' .and. lrain_c2r2 )
+  call Budget_source_add( tbudgets(NBUDGET_RC), tzsource )
+
+  tzsource%cmnhname   = 'REVA'
+  tzsource%clongname  = 'rain evaporation'
+  tzsource%lavailable =  hcloud == 'LIMA' .and. ( lptsplit .or. ( nmom_c.ge.1 .and. nmom_r.ge.1 ) )
+  call Budget_source_add( tbudgets(NBUDGET_RC), tzsource )
+
+  tzsource%cmnhname   = 'HONC'
+  tzsource%clongname  = 'droplet homogeneous freezing'
+  tzsource%lavailable = hcloud == 'LIMA' .and. ( lptsplit .or. ( nmom_i.ge.1 .and. nmom_c.ge.1 .and. lnucl_lima ) )
+  call Budget_source_add( tbudgets(NBUDGET_RC), tzsource )
+
+  tzsource%cmnhname   = 'IMLT'
+  tzsource%clongname  = 'melting of ice'
+  tzsource%lavailable = ( hcloud == 'LIMA' .and. ( lptsplit .or. ( nmom_i.ge.1 .and. nmom_c.ge.1 ) ) ) .or. hcloud(1:3) == 'ICE'
+  call Budget_source_add( tbudgets(NBUDGET_RC), tzsource )
+
+  tzsource%cmnhname   = 'BERFI'
+  tzsource%clongname  = 'Bergeron-Findeisen'
+  tzsource%lavailable = ( hcloud == 'LIMA' .and. ( lptsplit .or. (nmom_i.ge.1 .and. nmom_c.ge.1) ) ) .or. hcloud(1:3) == 'ICE'
+  call Budget_source_add( tbudgets(NBUDGET_RC), tzsource )
+
+  tzsource%cmnhname   = 'RIM'
+  tzsource%clongname  = 'riming of cloud water'
+  tzsource%lavailable =    ( hcloud == 'LIMA' .and. ( lptsplit .or. ( nmom_i.ge.1 .and. nmom_c.ge.1 .and. nmom_s.ge.1 ) ) ) &
+                        .or. hcloud(1:3) == 'ICE'
+  call Budget_source_add( tbudgets(NBUDGET_RC), tzsource )
+
+  tzsource%cmnhname   = 'CMEL'
+  tzsource%clongname  = 'collection by snow and conversion into rain with T>XTT on ice'
+  tzsource%lavailable = hcloud(1:3) == 'ICE' .and. lred .and. celec == 'NONE'
+  call Budget_source_add( tbudgets(NBUDGET_RC), tzsource )
+
+  tzsource%cmnhname   = 'WETG'
+  tzsource%clongname  = 'wet growth of graupel'
+  tzsource%lavailable =    ( hcloud == 'LIMA' .and. ( lptsplit .or. (nmom_i.ge.1 .and. nmom_c.ge.1 .and. nmom_s.ge.1) ) ) &
+                        .or. hcloud(1:3) == 'ICE'
+  call Budget_source_add( tbudgets(NBUDGET_RC), tzsource )
+
+  tzsource%cmnhname   = 'DRYG'
+  tzsource%clongname  = 'dry growth of graupel'
+  tzsource%lavailable =    ( hcloud == 'LIMA' .and. ( lptsplit .or. (nmom_i.ge.1 .and. nmom_c.ge.1 .and. nmom_s.ge.1) ) ) &
+                        .or. hcloud(1:3) == 'ICE'
+  call Budget_source_add( tbudgets(NBUDGET_RC), tzsource )
+
+  tzsource%cmnhname   = 'CVRC'
+  tzsource%clongname  = 'rain to cloud change after other microphysical processes'
+  tzsource%lavailable = hcloud == 'LIMA' .and. lptsplit
+  call Budget_source_add( tbudgets(NBUDGET_RC), tzsource )
+
+  tzsource%cmnhname   = 'WETH'
+  tzsource%clongname  = 'wet growth of hail'
+  tzsource%lavailable =      ( hcloud == 'LIMA' .and. .not.lptsplit .and. nmom_h.ge.1 .and. nmom_i.ge.1  &
+                                                .and. nmom_c.ge.1    .and. nmom_s.ge.1 )                 &
+                        .or. ( hcloud == 'LIMA' .and. lptsplit ) &
+                        .or.   hcloud == 'ICE4'
+  call Budget_source_add( tbudgets(NBUDGET_RC), tzsource )
+
+  tzsource%cmnhname   = 'DRYH'
+  tzsource%clongname  = 'dry growth of hail'
+  tzsource%lavailable = hcloud == 'ICE4' .and. lred .and. celec == 'NONE'
+  call Budget_source_add( tbudgets(NBUDGET_RC), tzsource )
+
+  tzsource%cmnhname   = 'CEDS'
+  tzsource%clongname  = 'adjustment to saturation'
+  tzsource%lavailable = hcloud == 'LIMA'
+  call Budget_source_add( tbudgets(NBUDGET_RC), tzsource )
+
+  tzsource%cmnhname   = 'DEPI'
+  tzsource%clongname  = 'condensation/deposition on ice'
+  tzsource%lavailable = hcloud(1:3) == 'ICE' .and. ( .not. lred .or. ( lred .and. ladj_after ) .or. celec /= 'NONE' )
+  call Budget_source_add( tbudgets(NBUDGET_RC), tzsource )
+
+  tzsource%cmnhname   = 'COND'
+  tzsource%clongname  = 'vapor condensation or cloud water evaporation'
+  tzsource%lavailable = hcloud == 'C2R2' .or. hcloud == 'KHKO' .or. hcloud == 'KESS' .or. hcloud == 'REVE'
+  call Budget_source_add( tbudgets(NBUDGET_RC), tzsource )
+
+  tzsource%cmnhname   = 'CORR2'
+  tzsource%clongname  = 'supplementary correction inside LIMA splitting'
+  tzsource%lavailable = hcloud == 'LIMA' .and. lptsplit
+  call Budget_source_add( tbudgets(NBUDGET_RC), tzsource )
+
+  tzsource%cmnhname   = 'NECON'
+  tzsource%clongname  = 'negativity correction induced by condensation'
+  tzsource%lavailable = (      hcloud == 'KESS' .or. hcloud == 'ICE3' .or. hcloud == 'ICE4'   &
+                          .or. hcloud == 'KHKO' .or. hcloud == 'C2R2' .or. hcloud == 'LIMA' ) &
+                        .and. celec == 'NONE'
+  call Budget_source_add( tbudgets(NBUDGET_RC), tzsource )
+
+
+  call Sourcelist_sort_compact( tbudgets(NBUDGET_RC) )
+
+  call Sourcelist_scan( tbudgets(NBUDGET_RC), cbulist_rrc )
+end if
+
+! Budget of RRR
+tbudgets(NBUDGET_RR)%lenabled = lbu_rrr .and. krr >= 3
+
+if ( tbudgets(NBUDGET_RR)%lenabled ) then
+  tbudgets(NBUDGET_RR)%trhodj => tburhodj
+
+  !Allocate all basic source terms (used or not)
+  !The size should be large enough (bigger than necessary is OK)
+  tbudgets(NBUDGET_RR)%nsourcesmax = NSOURCESMAX
+  allocate( tbudgets(NBUDGET_RR)%tsources(NSOURCESMAX) )
+
+  allocate( tbudgets(NBUDGET_RR)%xtmpstore(ibudim1, ibudim2, ibudim3) )
+
+  tbudgets(NBUDGET_RR)%tsources(:)%ngroup = 0
+
+  tzsource%ccomment = 'Budget of rain water mixing ratio'
+  tzsource%ngrid    = 1
+
+  tzsource%cunits   = 'kg kg-1'
+
+  tzsource%cmnhname   = 'INIF'
+  tzsource%clongname  = 'initial state'
+  tzsource%lavailable = .true.
+  call Budget_source_add( tbudgets(NBUDGET_RR), tzsource, odonotinit = .true., ooverwrite = .true. )
+
+  tzsource%cmnhname   = 'ENDF'
+  tzsource%clongname  = 'final state'
+  tzsource%lavailable = .true.
+  call Budget_source_add( tbudgets(NBUDGET_RR), tzsource, odonotinit = .true., ooverwrite = .true. )
+
+  tzsource%cmnhname   = 'AVEF'
+  tzsource%clongname  = 'averaged state'
+  tzsource%lavailable = .true.
+  call Budget_source_add( tbudgets(NBUDGET_RR), tzsource, odonotinit = .true., ooverwrite = .false. )
+
+  tzsource%cunits   = 's-1'
+
+  tzsource%cmnhname   = 'ASSE'
+  tzsource%clongname  = 'time filter (Asselin)'
+  tzsource%lavailable = .true.
+  call Budget_source_add( tbudgets(NBUDGET_RR), tzsource )
+
+  tzsource%cmnhname   = 'NEST'
+  tzsource%clongname  = 'nesting'
+  tzsource%lavailable = nmodel > 1
+  call Budget_source_add( tbudgets(NBUDGET_RR), tzsource )
+
+  tzsource%cmnhname   = 'FRC'
+  tzsource%clongname  = 'forcing'
+  tzsource%lavailable = lforcing
+  call Budget_source_add( tbudgets(NBUDGET_RR), tzsource )
+
+  tzsource%cmnhname   = 'DIF'
+  tzsource%clongname  = 'numerical diffusion'
+  tzsource%lavailable = onumdifth
+  call Budget_source_add( tbudgets(NBUDGET_RR), tzsource )
+
+  tzsource%cmnhname   = 'REL'
+  tzsource%clongname  = 'relaxation'
+  tzsource%lavailable = ohorelax_rr
+  call Budget_source_add( tbudgets(NBUDGET_RR), tzsource )
+
+  tzsource%cmnhname   = 'NETUR'
+  tzsource%clongname  = 'negativity correction induced by turbulence'
+  tzsource%lavailable = hturb == 'TKEL' .and. ( hcloud == 'KHKO' .or. hcloud == 'C2R2' .or. hcloud == 'LIMA' )
+  call Budget_source_add( tbudgets(NBUDGET_RR), tzsource )
+
+  tzsource%cmnhname   = 'VISC'
+  tzsource%clongname  = 'viscosity'
+  tzsource%lavailable = lvisc .and. lvisc_r
+  call Budget_source_add( tbudgets(NBUDGET_RR), tzsource )
+
+  tzsource%cmnhname   = 'ADV'
+  tzsource%clongname  = 'total advection'
+  tzsource%lavailable = .true.
+  call Budget_source_add( tbudgets(NBUDGET_RR), tzsource )
+
+  tzsource%cmnhname   = 'NEADV'
+  tzsource%clongname  = 'negativity correction induced by advection'
+  tzsource%lavailable =       hcloud == 'KESS' .or. hcloud == 'ICE3' .or. hcloud == 'ICE4' &
+                         .or. hcloud == 'KHKO' .or. hcloud == 'C2R2' .or. hcloud == 'LIMA'
+  call Budget_source_add( tbudgets(NBUDGET_RR), tzsource )
+
+  tzsource%cmnhname   = 'NEGA'
+  tzsource%clongname  = 'negativity correction'
+  tzsource%lavailable =       hcloud == 'KESS' .or. hcloud == 'ICE3' .or. hcloud == 'ICE4' &
+                         .or. hcloud == 'KHKO' .or. hcloud == 'C2R2' .or. hcloud == 'LIMA'
+  call Budget_source_add( tbudgets(NBUDGET_RR), tzsource )
+
+  tzsource%cmnhname   = 'CORR'
+  tzsource%clongname  = 'correction'
+!   tzsource%lavailable =       ( hcloud      == 'LIMA' .and. lptsplit .and. nmom_c.ge.1 .and. nmom_r.ge.1 ) &
+!                          .or. ( hcloud(1:3) == 'ICE' .and. lred .and. celec == 'NONE' )
+  tzsource%lavailable = hcloud(1:3) == 'ICE' .and. lred .and. celec == 'NONE'
+  call Budget_source_add( tbudgets(NBUDGET_RR), tzsource )
+
+  tzsource%cmnhname   = 'SEDI'
+  tzsource%clongname  = 'sedimentation of rain drops'
+  tzsource%lavailable =      ( hcloud      == 'LIMA' .and. nmom_c.ge.1 .and. nmom_r.ge.1 ) &
+                        .or.   hcloud      == 'KESS'                                     &
+                        .or.   hcloud(1:3) == 'ICE'                                      &
+                        .or.   hcloud      == 'C2R2'                                     &
+                        .or.   hcloud      == 'KHKO'
+  call Budget_source_add( tbudgets(NBUDGET_RR), tzsource )
+
+  tzsource%cmnhname   = 'R2C1'
+  tzsource%clongname  = 'rain to cloud change after sedimentation'
+  tzsource%lavailable = hcloud == 'LIMA' .and. lptsplit .and. nmom_c.ge.1 .and. nmom_r.ge.1
+  call Budget_source_add( tbudgets(NBUDGET_RR), tzsource )
+
+  tzsource%cmnhname   = 'AUTO'
+  tzsource%clongname  = 'autoconversion into rain'
+  tzsource%lavailable =       ( hcloud      == 'LIMA' .and. ( lptsplit .or. ( nmom_c.ge.1 .and. nmom_r.ge.1 ) ) ) &
+                         .or.   hcloud      == 'KESS'                                                           &
+                         .or. ( hcloud(1:3) == 'ICE'  .and. lwarm_ice )                                         &
+                         .or. ( hcloud      == 'C2R2' .and. lrain_c2r2 )                                        &
+                         .or. ( hcloud      == 'KHKO' .and. lrain_c2r2 )
+  call Budget_source_add( tbudgets(NBUDGET_RR), tzsource )
+
+  tzsource%cmnhname   = 'ACCR'
+  tzsource%clongname  = 'accretion of cloud droplets'
+  tzsource%lavailable =       ( hcloud == 'LIMA' .and. ( lptsplit .or. ( nmom_c.ge.1 .and. nmom_r.ge.1 ) ) ) &
+                         .or.   hcloud      == 'KESS'                                                      &
+                         .or. ( hcloud(1:3) == 'ICE'  .and. lwarm_ice )                                    &
+                         .or. ( hcloud      == 'C2R2' .and. lrain_c2r2 )                                   &
+                         .or. ( hcloud      == 'KHKO' .and. lrain_c2r2 )
+  call Budget_source_add( tbudgets(NBUDGET_RR), tzsource )
+
+  tzsource%cmnhname   = 'REVA'
+  tzsource%clongname  = 'rain evaporation'
+  tzsource%lavailable =      ( hcloud      == 'LIMA' .and. ( lptsplit .or. ( nmom_c.ge.1 .and. nmom_r.ge.1 ) ) ) &
+                        .or.   hcloud      == 'KESS'                                                           &
+                        .or. ( hcloud(1:3) == 'ICE'  .and. lwarm_ice )                                         &
+                        .or. ( hcloud      == 'C2R2' .and. lrain_c2r2 )                                        &
+                        .or. ( hcloud      == 'KHKO' .and. lrain_c2r2 )
+  call Budget_source_add( tbudgets(NBUDGET_RR), tzsource )
+
+  tzsource%cmnhname   = 'HONR'
+  tzsource%clongname  = 'rain homogeneous freezing'
+  tzsource%lavailable = hcloud == 'LIMA' .and. ( lptsplit .or. ( nmom_i.ge.1 .and. lnucl_lima .and. nmom_r.ge.1 ) )
+  call Budget_source_add( tbudgets(NBUDGET_RR), tzsource )
+
+
+  tzsource%cmnhname   = 'ACC'
+  tzsource%clongname  = 'accretion of rain on aggregates'
+  tzsource%lavailable =      ( hcloud == 'LIMA' .and. ( lptsplit .or. (       nmom_i.ge.1 .and. nmom_c.ge.1      &
+                                                                        .and. nmom_s.ge.1 .and. nmom_r.ge.1) ) ) &
+                        .or.   hcloud(1:3) == 'ICE'
+  call Budget_source_add( tbudgets(NBUDGET_RR), tzsource )
+
+  tzsource%cmnhname   = 'CMEL'
+  tzsource%clongname  = 'collection of droplets by snow and conversion into rain'
+  tzsource%lavailable = hcloud(1:3) == 'ICE' .and. lred .and. celec == 'NONE'
+  call Budget_source_add( tbudgets(NBUDGET_RR), tzsource )
+
+  tzsource%cmnhname   = 'CFRZ'
+  tzsource%clongname  = 'conversion freezing of rain'
+  tzsource%lavailable =    ( hcloud == 'LIMA' .and. ( lptsplit .or. (nmom_i.ge.1 .and. nmom_c.ge.1 .and. nmom_s.ge.1) ) ) &
+                        .or. hcloud(1:3) == 'ICE'
+  call Budget_source_add( tbudgets(NBUDGET_RR), tzsource )
+
+  tzsource%cmnhname   = 'WETG'
+  tzsource%clongname  = 'wet growth of graupel'
+  tzsource%lavailable =    ( hcloud == 'LIMA' .and. ( lptsplit .or. (nmom_i.ge.1 .and. nmom_c.ge.1 .and. nmom_s.ge.1) ) ) &
+                        .or. hcloud(1:3) == 'ICE'
+  call Budget_source_add( tbudgets(NBUDGET_RR), tzsource )
+
+  tzsource%cmnhname   = 'DRYG'
+  tzsource%clongname  = 'dry growth of graupel'
+  tzsource%lavailable =    ( hcloud == 'LIMA' .and. ( lptsplit .or. (nmom_i.ge.1 .and. nmom_c.ge.1 .and. nmom_s.ge.1) ) ) &
+                        .or. hcloud(1:3) == 'ICE'
+  call Budget_source_add( tbudgets(NBUDGET_RR), tzsource )
+
+  tzsource%cmnhname   = 'GMLT'
+  tzsource%clongname  = 'graupel melting'
+  tzsource%lavailable =    ( hcloud == 'LIMA' .and. ( lptsplit .or. (nmom_i.ge.1 .and. nmom_c.ge.1 .and. nmom_s.ge.1) ) ) &
+                        .or. hcloud(1:3) == 'ICE'
+  call Budget_source_add( tbudgets(NBUDGET_RR), tzsource )
+
+  tzsource%cmnhname   = 'CVRC'
+  tzsource%clongname  = 'rain to cloud change after other microphysical processes'
+  tzsource%lavailable = hcloud == 'LIMA' .and. lptsplit
+  call Budget_source_add( tbudgets(NBUDGET_RR), tzsource )
+
+  tzsource%cmnhname   = 'WETH'
+  tzsource%clongname  = 'wet growth of hail'
+  tzsource%lavailable =      ( hcloud == 'LIMA' .and. .not.lptsplit .and. nmom_h.ge.1 .and. nmom_i.ge.1 &
+                                                .and. nmom_c.ge.1    .and. nmom_s.ge.1 )                &
+                        .or. ( hcloud == 'LIMA' .and. lptsplit ) &
+                        .or.   hcloud == 'ICE4'
+  call Budget_source_add( tbudgets(NBUDGET_RR), tzsource )
+
+  tzsource%cmnhname   = 'DRYH'
+  tzsource%clongname  = 'dry growth of hail'
+  tzsource%lavailable = hcloud == 'ICE4' .and. lred .and. celec == 'NONE'
+  call Budget_source_add( tbudgets(NBUDGET_RR), tzsource )
+
+  tzsource%cmnhname   = 'HMLT'
+  tzsource%clongname  = 'melting of hail'
+  tzsource%lavailable =       ( hcloud == 'LIMA' .and. .not.lptsplit .and. nmom_h.ge.1 .and. nmom_i.ge.1 &
+                                                .and. nmom_c.ge.1    .and. nmom_s.ge.1 )                &
+                        .or. ( hcloud == 'LIMA' .and. lptsplit ) &
+                         .or.   hcloud == 'ICE4'
+  call Budget_source_add( tbudgets(NBUDGET_RR), tzsource )
+
+  tzsource%cmnhname   = 'SFR'
+  tzsource%clongname  = 'spontaneous freezing'
+  tzsource%lavailable = hcloud(1:3) == 'ICE'
+  call Budget_source_add( tbudgets(NBUDGET_RR), tzsource )
+
+!PW: a documenter
+  tzsource%cmnhname   = 'CORR2'
+  tzsource%clongname  = 'supplementary correction inside LIMA splitting'
+  tzsource%lavailable = hcloud == 'LIMA' .and. lptsplit
+  call Budget_source_add( tbudgets(NBUDGET_RR), tzsource )
+
+  tzsource%cmnhname   = 'NECON'
+  tzsource%clongname  = 'negativity correction induced by condensation'
+  tzsource%lavailable = (      hcloud == 'KESS' .or. hcloud == 'ICE3' .or. hcloud == 'ICE4'   &
+                          .or. hcloud == 'KHKO' .or. hcloud == 'C2R2' .or. hcloud == 'LIMA' ) &
+                        .and. celec == 'NONE'
+  call Budget_source_add( tbudgets(NBUDGET_RR), tzsource )
+
+
+  call Sourcelist_sort_compact( tbudgets(NBUDGET_RR) )
+
+  call Sourcelist_scan( tbudgets(NBUDGET_RR), cbulist_rrr )
+end if
+
+! Budget of RRI
+tbudgets(NBUDGET_RI)%lenabled = lbu_rri .and. krr >= 4
+
+if ( tbudgets(NBUDGET_RI)%lenabled ) then
+  tbudgets(NBUDGET_RI)%trhodj => tburhodj
+
+  !Allocate all basic source terms (used or not)
+  !The size should be large enough (bigger than necessary is OK)
+  tbudgets(NBUDGET_RI)%nsourcesmax = NSOURCESMAX
+  allocate( tbudgets(NBUDGET_RI)%tsources(NSOURCESMAX) )
+
+  allocate( tbudgets(NBUDGET_RI)%xtmpstore(ibudim1, ibudim2, ibudim3) )
+
+  tbudgets(NBUDGET_RI)%tsources(:)%ngroup = 0
+
+  tzsource%ccomment = 'Budget of cloud ice mixing ratio'
+  tzsource%ngrid    = 1
+
+  tzsource%cunits   = 'kg kg-1'
+
+  tzsource%cmnhname   = 'INIF'
+  tzsource%clongname  = 'initial state'
+  tzsource%lavailable = .true.
+  call Budget_source_add( tbudgets(NBUDGET_RI), tzsource, odonotinit = .true., ooverwrite = .true. )
+
+  tzsource%cmnhname   = 'ENDF'
+  tzsource%clongname  = 'final state'
+  tzsource%lavailable = .true.
+  call Budget_source_add( tbudgets(NBUDGET_RI), tzsource, odonotinit = .true., ooverwrite = .true. )
+
+  tzsource%cmnhname   = 'AVEF'
+  tzsource%clongname  = 'averaged state'
+  tzsource%lavailable = .true.
+  call Budget_source_add( tbudgets(NBUDGET_RI), tzsource, odonotinit = .true., ooverwrite = .false. )
+
+  tzsource%cunits   = 's-1'
+
+  tzsource%cmnhname   = 'ASSE'
+  tzsource%clongname  = 'time filter (Asselin)'
+  tzsource%lavailable = .true.
+  call Budget_source_add( tbudgets(NBUDGET_RI), tzsource )
+
+  tzsource%cmnhname   = 'NEST'
+  tzsource%clongname  = 'nesting'
+  tzsource%lavailable = nmodel > 1
+  call Budget_source_add( tbudgets(NBUDGET_RI), tzsource )
+
+  tzsource%cmnhname   = 'FRC'
+  tzsource%clongname  = 'forcing'
+  tzsource%lavailable = lforcing
+  call Budget_source_add( tbudgets(NBUDGET_RI), tzsource )
+
+  tzsource%cmnhname   = 'DIF'
+  tzsource%clongname  = 'numerical diffusion'
+  tzsource%lavailable = onumdifth
+  call Budget_source_add( tbudgets(NBUDGET_RI), tzsource )
+
+  tzsource%cmnhname   = 'REL'
+  tzsource%clongname  = 'relaxation'
+  tzsource%lavailable = ohorelax_ri
+  call Budget_source_add( tbudgets(NBUDGET_RI), tzsource )
+
+  tzsource%cmnhname   = 'DCONV'
+  tzsource%clongname  = 'KAFR convection'
+  tzsource%lavailable = hdconv == 'KAFR' .OR. hsconv == 'KAFR'
+  call Budget_source_add( tbudgets(NBUDGET_RI), tzsource )
+
+  tzsource%cmnhname   = 'VTURB'
+  tzsource%clongname  = 'vertical turbulent diffusion'
+  tzsource%lavailable = hturb == 'TKEL'
+  call Budget_source_add( tbudgets(NBUDGET_RI), tzsource )
+
+  tzsource%cmnhname   = 'HTURB'
+  tzsource%clongname  = 'horizontal turbulent diffusion'
+  tzsource%lavailable = hturb == 'TKEL' .and. HTURBDIM == '3DIM'
+  call Budget_source_add( tbudgets(NBUDGET_RI), tzsource )
+
+  tzsource%cmnhname   = 'NETUR'
+  tzsource%clongname  = 'negativity correction induced by turbulence'
+  tzsource%lavailable = hturb == 'TKEL' .and. ( hcloud == 'ICE3' .or. hcloud == 'ICE4' .or. hcloud == 'LIMA' )
+  call Budget_source_add( tbudgets(NBUDGET_RI), tzsource )
+
+  tzsource%cmnhname   = 'VISC'
+  tzsource%clongname  = 'viscosity'
+  tzsource%lavailable = lvisc .and. lvisc_r
+  call Budget_source_add( tbudgets(NBUDGET_RI), tzsource )
+
+  tzsource%cmnhname   = 'ADV'
+  tzsource%clongname  = 'total advection'
+  tzsource%lavailable = .true.
+  call Budget_source_add( tbudgets(NBUDGET_RI), tzsource )
+
+  tzsource%cmnhname   = 'NEADV'
+  tzsource%clongname  = 'negativity correction induced by advection'
+  tzsource%lavailable =  .true.
+  call Budget_source_add( tbudgets(NBUDGET_RI), tzsource )
+
+  tzsource%cmnhname   = 'NEGA'
+  tzsource%clongname  = 'negativity correction'
+  tzsource%lavailable =  .true.
+  call Budget_source_add( tbudgets(NBUDGET_RI), tzsource )
+
+  tzsource%cmnhname   = 'CORR'
+  tzsource%clongname  = 'correction'
+!   tzsource%lavailable =       ( hcloud      == 'LIMA' .and. lptsplit .and. nmom_i.ge.1 .and. nmom_s.ge.1 ) &
+!                          .or. ( hcloud(1:3) == 'ICE' .and. lred .and. celec == 'NONE' )
+  tzsource%lavailable = hcloud(1:3) == 'ICE' .and. lred .and. celec == 'NONE'
+  call Budget_source_add( tbudgets(NBUDGET_RI), tzsource )
+
+  tzsource%cmnhname   = 'ADJU'
+  tzsource%clongname  = 'adjustment to saturation'
+  tzsource%lavailable = hcloud(1:3) == 'ICE' .and. lred .and. ladj_before .and. celec == 'NONE'
+  call Budget_source_add( tbudgets(NBUDGET_RI), tzsource )
+
+  tzsource%cmnhname   = 'SEDI'
+  tzsource%clongname  = 'sedimentation of rain drops'
+  tzsource%lavailable =      ( hcloud      == 'LIMA' .and. nmom_i.ge.1 .and. lsedi_lima ) &
+                        .or.   hcloud(1:3) == 'ICE'
+  call Budget_source_add( tbudgets(NBUDGET_RI), tzsource )
+
+  tzsource%cmnhname   = 'HIN'
+  tzsource%clongname  = 'heterogeneous ice nucleation'
+  tzsource%lavailable =  hcloud(1:3) == 'ICE' .or. ( hcloud == 'LIMA' .and. nmom_i == 1)
+  call Budget_source_add( tbudgets(NBUDGET_RI), tzsource )
+
+  tzsource%cmnhname   = 'HIND'
+  tzsource%clongname  = 'heterogeneous nucleation by deposition'
+  tzsource%lavailable = hcloud == 'LIMA' .and. nmom_i.ge.1 .and. lnucl_lima
+  call Budget_source_add( tbudgets(NBUDGET_RI), tzsource )
+
+  tzsource%cmnhname   = 'HINC'
+  tzsource%clongname  = 'heterogeneous nucleation by contact'
+  tzsource%lavailable = hcloud == 'LIMA' .and. nmom_i.ge.1 .and. lnucl_lima
+  call Budget_source_add( tbudgets(NBUDGET_RI), tzsource )
+
+  tzsource%cmnhname   = 'HON'
+  tzsource%clongname  = 'homogeneous nucleation'
+  tzsource%lavailable = hcloud(1:3) == 'ICE'
+  call Budget_source_add( tbudgets(NBUDGET_RI), tzsource )
+
+  tzsource%cmnhname   = 'HONH'
+  tzsource%clongname  = 'haze homogeneous nucleation'
+  tzsource%lavailable = hcloud == 'LIMA' .and. nmom_i.ge.1 .and. lnucl_lima .and. lhhoni_lima .and. nmod_ccn >= 1
+  call Budget_source_add( tbudgets(NBUDGET_RI), tzsource )
+
+  tzsource%cmnhname   = 'HONC'
+  tzsource%clongname  = 'droplet homogeneous freezing'
+  tzsource%lavailable = hcloud == 'LIMA' .and. ( lptsplit .or. ( nmom_i.ge.1 .and. nmom_c.ge.1 .and. lnucl_lima ) )
+  call Budget_source_add( tbudgets(NBUDGET_RI), tzsource )
+
+  tzsource%cmnhname   = 'CNVI'
+  tzsource%clongname  = 'conversion of snow to cloud ice'
+  tzsource%lavailable = hcloud == 'LIMA' .and. ( lptsplit .or. ( nmom_i.ge.1 .and. nmom_s.ge.1 ) )
+  call Budget_source_add( tbudgets(NBUDGET_RI), tzsource )
+
+  tzsource%cmnhname   = 'CNVS'
+  tzsource%clongname  = 'conversion of pristine ice to snow'
+  tzsource%lavailable = hcloud == 'LIMA' .and. ( lptsplit .or. ( nmom_i.ge.1 .and. nmom_s.ge.1 ) )
+  call Budget_source_add( tbudgets(NBUDGET_RI), tzsource )
+
+  tzsource%cmnhname   = 'AGGS'
+  tzsource%clongname  = 'aggregation of snow'
+  tzsource%lavailable = ( hcloud == 'LIMA' .and. ( lptsplit .or. ( nmom_i.ge.1 .and. nmom_s.ge.1 ) ) ) .or. hcloud(1:3) == 'ICE'
+  call Budget_source_add( tbudgets(NBUDGET_RI), tzsource )
+
+  tzsource%cmnhname   = 'AUTS'
+  tzsource%clongname  = 'autoconversion of ice'
+  tzsource%lavailable = hcloud(1:3) == 'ICE'
+  call Budget_source_add( tbudgets(NBUDGET_RI), tzsource )
+
+  tzsource%cmnhname   = 'IMLT'
+  tzsource%clongname  = 'melting of ice'
+  tzsource%lavailable = ( hcloud == 'LIMA' .and. ( lptsplit .or. ( nmom_i.ge.1 .and. nmom_c.ge.1 ) ) ) .or. hcloud(1:3) == 'ICE'
+  call Budget_source_add( tbudgets(NBUDGET_RI), tzsource )
+
+  tzsource%cmnhname   = 'BERFI'
+  tzsource%clongname  = 'Bergeron-Findeisen'
+  tzsource%lavailable = ( hcloud == 'LIMA' .and. ( lptsplit .or. ( nmom_i.ge.1 .and. nmom_c.ge.1 ) ) ) .or. hcloud(1:3) == 'ICE'
+  call Budget_source_add( tbudgets(NBUDGET_RI), tzsource )
+
+  tzsource%cmnhname   = 'HMS'
+  tzsource%clongname  = 'Hallett-Mossop ice multiplication process due to snow riming'
+  tzsource%lavailable = hcloud == 'LIMA' .and. ( lptsplit .or. ( nmom_i.ge.1 .and. nmom_c.ge.1 .and. nmom_s.ge.1 ) )
+  call Budget_source_add( tbudgets(NBUDGET_RI), tzsource )
+
+  tzsource%cmnhname   = 'CIBU'
+  tzsource%clongname  = 'ice multiplication process due to ice collisional breakup'
+  tzsource%lavailable = hcloud == 'LIMA' .and. ( lptsplit .or. ( nmom_i.ge.1 .and. nmom_c.ge.1 .and. nmom_s.ge.1 .and. lcibu ) )
+  call Budget_source_add( tbudgets(NBUDGET_RI), tzsource )
+
+  tzsource%cmnhname   = 'CFRZ'
+  tzsource%clongname  = 'conversion freezing of rain'
+  tzsource%lavailable =    ( hcloud == 'LIMA' .and. ( lptsplit .or. ( nmom_i.ge.1 .and. nmom_c.ge.1 .and. nmom_s.ge.1 ) ) ) &
+                        .or. hcloud(1:3) == 'ICE'
+  call Budget_source_add( tbudgets(NBUDGET_RI), tzsource )
+
+  tzsource%cmnhname   = 'RDSF'
+  tzsource%clongname  = 'ice multiplication process following rain contact freezing'
+  tzsource%lavailable = hcloud == 'LIMA' .and. ( lptsplit .or. ( nmom_i.ge.1 .and. nmom_c.ge.1 .and. nmom_s.ge.1 .and. lrdsf ) )
+  call Budget_source_add( tbudgets(NBUDGET_RI), tzsource )
+
+  tzsource%cmnhname   = 'WETG'
+  tzsource%clongname  = 'wet growth of graupel'
+  tzsource%lavailable =    ( hcloud == 'LIMA' .and. ( lptsplit .or. ( nmom_i.ge.1 .and. nmom_c.ge.1 .and. nmom_s.ge.1 ) ) ) &
+                        .or. hcloud(1:3) == 'ICE'
+  call Budget_source_add( tbudgets(NBUDGET_RI), tzsource )
+
+  tzsource%cmnhname   = 'DRYG'
+  tzsource%clongname  = 'dry growth of graupel'
+  tzsource%lavailable =    ( hcloud == 'LIMA' .and. ( lptsplit .or. ( nmom_i.ge.1 .and. nmom_c.ge.1 .and. nmom_s.ge.1 ) ) ) &
+                        .or. hcloud(1:3) == 'ICE'
+  call Budget_source_add( tbudgets(NBUDGET_RI), tzsource )
+
+  tzsource%cmnhname   = 'HMG'
+  tzsource%clongname  = 'Hallett-Mossop ice multiplication process due to graupel riming'
+  tzsource%lavailable = hcloud == 'LIMA' .and. ( lptsplit .or. ( nmom_i.ge.1 .and. nmom_c.ge.1 .and. nmom_s.ge.1 ) )
+  call Budget_source_add( tbudgets(NBUDGET_RI), tzsource )
+
+  tzsource%cmnhname   = 'WETH'
+  tzsource%clongname  = 'wet growth of hail'
+  tzsource%lavailable =      ( hcloud == 'LIMA' .and. .not.lptsplit .and. nmom_h.ge.1 .and. nmom_i.ge.1 &
+                                                .and. nmom_c.ge.1    .and. nmom_s.ge.1 )                &
+                        .or. ( hcloud == 'LIMA' .and. lptsplit ) &
+                        .or.   hcloud == 'ICE4'
+  call Budget_source_add( tbudgets(NBUDGET_RI), tzsource )
+
+  tzsource%cmnhname   = 'DRYH'
+  tzsource%clongname  = 'dry growth of hail'
+  tzsource%lavailable = hcloud == 'ICE4' .and. lred .and. celec == 'NONE'
+  call Budget_source_add( tbudgets(NBUDGET_RI), tzsource )
+
+  tzsource%cmnhname   = 'CEDS'
+  tzsource%clongname  = 'adjustment to saturation'
+  tzsource%lavailable = hcloud == 'LIMA'
+  call Budget_source_add( tbudgets(NBUDGET_RI), tzsource )
+
+  tzsource%cmnhname   = 'DEPI'
+  tzsource%clongname  = 'condensation/deposition on ice'
+  tzsource%lavailable =      ( hcloud(1:3) == 'ICE' .and. ( .not. lred .or. ( lred .and. ladj_after ) .or. celec /= 'NONE') ) &
+                        .or. ( hcloud == 'LIMA' .and. lptsplit )
+  call Budget_source_add( tbudgets(NBUDGET_RI), tzsource )
+
+  tzsource%cmnhname   = 'CORR2'
+  tzsource%clongname  = 'supplementary correction inside LIMA splitting'
+  tzsource%lavailable = hcloud == 'LIMA' .and. lptsplit
+  call Budget_source_add( tbudgets(NBUDGET_RI), tzsource )
+
+  tzsource%cmnhname   = 'NECON'
+  tzsource%clongname  = 'negativity correction induced by condensation'
+  tzsource%lavailable = celec == 'NONE'
+  call Budget_source_add( tbudgets(NBUDGET_RI), tzsource )
+
+
+  call Sourcelist_sort_compact( tbudgets(NBUDGET_RI) )
+
+  call Sourcelist_scan( tbudgets(NBUDGET_RI), cbulist_rri )
+end if
+
+! Budget of RRS
+tbudgets(NBUDGET_RS)%lenabled = lbu_rrs .and. krr >= 5
+
+if ( tbudgets(NBUDGET_RS)%lenabled ) then
+  tbudgets(NBUDGET_RS)%trhodj => tburhodj
+
+  !Allocate all basic source terms (used or not)
+  !The size should be large enough (bigger than necessary is OK)
+  tbudgets(NBUDGET_RS)%nsourcesmax = NSOURCESMAX
+  allocate( tbudgets(NBUDGET_RS)%tsources(NSOURCESMAX) )
+
+  allocate( tbudgets(NBUDGET_RS)%xtmpstore(ibudim1, ibudim2, ibudim3) )
+
+  tbudgets(NBUDGET_RS)%tsources(:)%ngroup = 0
+
+  tzsource%ccomment = 'Budget of snow/aggregate mixing ratio'
+  tzsource%ngrid    = 1
+
+  tzsource%cunits   = 'kg kg-1'
+
+  tzsource%cmnhname   = 'INIF'
+  tzsource%clongname  = 'initial state'
+  tzsource%lavailable = .true.
+  call Budget_source_add( tbudgets(NBUDGET_RS), tzsource, odonotinit = .true., ooverwrite = .true. )
+
+  tzsource%cmnhname   = 'ENDF'
+  tzsource%clongname  = 'final state'
+  tzsource%lavailable = .true.
+  call Budget_source_add( tbudgets(NBUDGET_RS), tzsource, odonotinit = .true., ooverwrite = .true. )
+
+  tzsource%cmnhname   = 'AVEF'
+  tzsource%clongname  = 'averaged state'
+  tzsource%lavailable = .true.
+  call Budget_source_add( tbudgets(NBUDGET_RS), tzsource, odonotinit = .true., ooverwrite = .false. )
+
+  tzsource%cunits   = 's-1'
+
+  tzsource%cmnhname   = 'ASSE'
+  tzsource%clongname  = 'time filter (Asselin)'
+  tzsource%lavailable = .true.
+  call Budget_source_add( tbudgets(NBUDGET_RS), tzsource )
+
+  tzsource%cmnhname   = 'NEST'
+  tzsource%clongname  = 'nesting'
+  tzsource%lavailable = nmodel > 1
+  call Budget_source_add( tbudgets(NBUDGET_RS), tzsource )
+
+  tzsource%cmnhname   = 'FRC'
+  tzsource%clongname  = 'forcing'
+  tzsource%lavailable = lforcing
+  call Budget_source_add( tbudgets(NBUDGET_RS), tzsource )
+
+  tzsource%cmnhname   = 'DIF'
+  tzsource%clongname  = 'numerical diffusion'
+  tzsource%lavailable = onumdifth
+  call Budget_source_add( tbudgets(NBUDGET_RS), tzsource )
+
+  tzsource%cmnhname   = 'REL'
+  tzsource%clongname  = 'relaxation'
+  tzsource%lavailable = ohorelax_rs
+  call Budget_source_add( tbudgets(NBUDGET_RS), tzsource )
+
+!   tzsource%cmnhname   = 'NETUR'
+!   tzsource%clongname  = 'negativity correction induced by turbulence'
+!   tzsource%lavailable = hturb == 'TKEL' .and. (      hcloud == 'ICE3' .or. hcloud == 'ICE4' &
+!                                   .or. hcloud == 'KHKO' .or. hcloud == 'C2R2' .or. hcloud == 'LIMA' )
+!   call Budget_source_add( tbudgets(NBUDGET_RS), tzsource nneturrs )
+
+  tzsource%cmnhname   = 'VISC'
+  tzsource%clongname  = 'viscosity'
+  tzsource%lavailable = lvisc .and. lvisc_r
+  call Budget_source_add( tbudgets(NBUDGET_RS), tzsource )
+
+  tzsource%cmnhname   = 'ADV'
+  tzsource%clongname  = 'total advection'
+  tzsource%lavailable = .true.
+  call Budget_source_add( tbudgets(NBUDGET_RS), tzsource )
+
+  tzsource%cmnhname   = 'NEADV'
+  tzsource%clongname  = 'negativity correction induced by advection'
+  tzsource%lavailable =  .true.
+  call Budget_source_add( tbudgets(NBUDGET_RS), tzsource )
+
+  tzsource%cmnhname   = 'NEGA'
+  tzsource%clongname  = 'negativity correction'
+  tzsource%lavailable = .true.
+  call Budget_source_add( tbudgets(NBUDGET_RS), tzsource )
+
+  tzsource%cmnhname   = 'CORR'
+  tzsource%clongname  = 'correction'
+!   tzsource%lavailable =       ( hcloud      == 'LIMA' .and. lptsplit .and. nmom_i.ge.1 .and. nmom_s.ge.1 ) &
+!                          .or. ( hcloud(1:3) == 'ICE' .and. lred .and. celec == 'NONE' )
+  tzsource%lavailable = hcloud(1:3) == 'ICE' .and. lred .and. celec == 'NONE'
+  call Budget_source_add( tbudgets(NBUDGET_RS), tzsource )
+
+  tzsource%cmnhname   = 'SEDI'
+  tzsource%clongname  = 'sedimentation'
+  tzsource%lavailable =      ( hcloud      == 'LIMA' .and. nmom_i.ge.1 .and. nmom_s.ge.1 ) &
+                        .or.   hcloud(1:3) == 'ICE'
+  call Budget_source_add( tbudgets(NBUDGET_RS), tzsource )
+
+  tzsource%cmnhname   = 'CNVI'
+  tzsource%clongname  = 'conversion of snow to cloud ice'
+  tzsource%lavailable = hcloud == 'LIMA' .and. ( lptsplit .or. ( nmom_i.ge.1 .and. nmom_s.ge.1 ) )
+  call Budget_source_add( tbudgets(NBUDGET_RS), tzsource )
+
+  tzsource%cmnhname   = 'DEPS'
+  tzsource%clongname  = 'deposition on snow'
+  tzsource%lavailable = ( hcloud == 'LIMA' .and. ( lptsplit .or. ( nmom_i.ge.1 .and. nmom_s.ge.1 ) ) ) .or. hcloud(1:3) == 'ICE'
+  call Budget_source_add( tbudgets(NBUDGET_RS), tzsource )
+
+  tzsource%cmnhname   = 'CNVS'
+  tzsource%clongname  = 'conversion of pristine ice to snow'
+  tzsource%lavailable = hcloud == 'LIMA' .and. ( lptsplit .or. ( nmom_i.ge.1 .and. nmom_s.ge.1 ) )
+  call Budget_source_add( tbudgets(NBUDGET_RS), tzsource )
+
+  tzsource%cmnhname   = 'AGGS'
+  tzsource%clongname  = 'aggregation of snow'
+  tzsource%lavailable = ( hcloud == 'LIMA' .and. ( lptsplit .or. ( nmom_i.ge.1 .and. nmom_s.ge.1 ) ) ) .or. hcloud(1:3) == 'ICE'
+  call Budget_source_add( tbudgets(NBUDGET_RS), tzsource )
+
+  tzsource%cmnhname   = 'AUTS'
+  tzsource%clongname  = 'autoconversion of ice'
+  tzsource%lavailable = hcloud(1:3) == 'ICE'
+  call Budget_source_add( tbudgets(NBUDGET_RS), tzsource )
+
+  tzsource%cmnhname   = 'RIM'
+  tzsource%clongname  = 'riming of cloud water'
+  tzsource%lavailable =    ( hcloud == 'LIMA' .and. ( lptsplit .or. ( nmom_i.ge.1 .and. nmom_c.ge.1 .and. nmom_s.ge.1 ) ) ) &
+                        .or. hcloud(1:3) == 'ICE'
+  call Budget_source_add( tbudgets(NBUDGET_RS), tzsource )
+
+  tzsource%cmnhname   = 'HMS'
+  tzsource%clongname  = 'Hallett-Mossop ice multiplication process due to snow riming'
+  tzsource%lavailable = hcloud == 'LIMA' .and. ( lptsplit .or. (nmom_i.ge.1 .and. nmom_c.ge.1 .and. nmom_s.ge.1 ) )
+  call Budget_source_add( tbudgets(NBUDGET_RS), tzsource )
+
+  tzsource%cmnhname   = 'CIBU'
+  tzsource%clongname  = 'ice multiplication process due to ice collisional breakup'
+  tzsource%lavailable = hcloud == 'LIMA' .and. ( lptsplit .or. ( nmom_i.ge.1 .and. nmom_c.ge.1 .and. nmom_s.ge.1 .and. lcibu ) )
+  call Budget_source_add( tbudgets(NBUDGET_RS), tzsource )
+
+  tzsource%cmnhname   = 'ACC'
+  tzsource%clongname  = 'accretion of rain on snow'
+  tzsource%lavailable =       ( hcloud == 'LIMA' .and. ( lptsplit .or. (       nmom_i.ge.1 .and. nmom_c.ge.1      &
+                                                                         .and. nmom_s.ge.1 .and. nmom_r.ge.1) ) ) &
+                         .or.   hcloud(1:3) == 'ICE'
+  call Budget_source_add( tbudgets(NBUDGET_RS), tzsource )
+
+  tzsource%cmnhname   = 'CMEL'
+  tzsource%clongname  = 'conversion melting'
+  tzsource%lavailable =    ( hcloud == 'LIMA' .and. ( lptsplit .or. ( nmom_i.ge.1 .and. nmom_c.ge.1 .and. nmom_s.ge.1 ) ) ) &
+                        .or. hcloud(1:3) == 'ICE'
+  call Budget_source_add( tbudgets(NBUDGET_RS), tzsource )
+
+  tzsource%cmnhname   = 'WETG'
+  tzsource%clongname  = 'wet growth of graupel'
+  tzsource%lavailable =    ( hcloud == 'LIMA' .and. ( lptsplit .or. ( nmom_i.ge.1 .and. nmom_c.ge.1 .and. nmom_s.ge.1 ) ) ) &
+                        .or. hcloud(1:3) == 'ICE'
+  call Budget_source_add( tbudgets(NBUDGET_RS), tzsource )
+
+  tzsource%cmnhname   = 'DRYG'
+  tzsource%clongname  = 'dry growth of graupel'
+  tzsource%lavailable =    ( hcloud == 'LIMA' .and. ( lptsplit .or. ( nmom_i.ge.1 .and. nmom_c.ge.1 .and. nmom_s.ge.1 ) ) ) &
+                        .or. hcloud(1:3) == 'ICE'
+  call Budget_source_add( tbudgets(NBUDGET_RS), tzsource )
+
+  tzsource%cmnhname   = 'WETH'
+  tzsource%clongname  = 'wet growth of hail'
+  tzsource%lavailable =      ( hcloud == 'LIMA' .and. .not.lptsplit .and. nmom_h.ge.1 .and. nmom_i.ge.1 &
+                                                .and. nmom_c.ge.1    .and. nmom_s.ge.1 )                &
+                        .or. ( hcloud == 'LIMA' .and. lptsplit ) &
+                        .or.   hcloud == 'ICE4'
+  call Budget_source_add( tbudgets(NBUDGET_RS), tzsource )
+
+  tzsource%cmnhname   = 'DRYH'
+  tzsource%clongname  = 'dry growth of hail'
+  tzsource%lavailable = hcloud == 'ICE4' .and. lred .and. celec == 'NONE'
+  call Budget_source_add( tbudgets(NBUDGET_RS), tzsource )
+
+  tzsource%cmnhname   = 'NECON'
+  tzsource%clongname  = 'negativity correction induced by condensation'
+  tzsource%lavailable = celec == 'NONE'
+  call Budget_source_add( tbudgets(NBUDGET_RS), tzsource )
+
+
+  call Sourcelist_sort_compact( tbudgets(NBUDGET_RS) )
+
+  call Sourcelist_scan( tbudgets(NBUDGET_RS), cbulist_rrs )
+end if
+
+! Budget of RRG
+tbudgets(NBUDGET_RG)%lenabled = lbu_rrg .and. krr >= 6
+
+if ( tbudgets(NBUDGET_RG)%lenabled ) then
+  tbudgets(NBUDGET_RG)%trhodj => tburhodj
+
+  !Allocate all basic source terms (used or not)
+  !The size should be large enough (bigger than necessary is OK)
+  tbudgets(NBUDGET_RG)%nsourcesmax = NSOURCESMAX
+  allocate( tbudgets(NBUDGET_RG)%tsources(NSOURCESMAX) )
+
+  allocate( tbudgets(NBUDGET_RG)%xtmpstore(ibudim1, ibudim2, ibudim3) )
+
+  tbudgets(NBUDGET_RG)%tsources(:)%ngroup = 0
+
+  tzsource%ccomment = 'Budget of graupel mixing ratio'
+  tzsource%ngrid    = 1
+
+  tzsource%cunits   = 'kg kg-1'
+
+  tzsource%cmnhname   = 'INIF'
+  tzsource%clongname  = 'initial state'
+  tzsource%lavailable = .true.
+  call Budget_source_add( tbudgets(NBUDGET_RG), tzsource, odonotinit = .true., ooverwrite = .true. )
+
+  tzsource%cmnhname   = 'ENDF'
+  tzsource%clongname  = 'final state'
+  tzsource%lavailable = .true.
+  call Budget_source_add( tbudgets(NBUDGET_RG), tzsource, odonotinit = .true., ooverwrite = .true. )
+
+  tzsource%cmnhname   = 'AVEF'
+  tzsource%clongname  = 'averaged state'
+  tzsource%lavailable = .true.
+  call Budget_source_add( tbudgets(NBUDGET_RG), tzsource, odonotinit = .true., ooverwrite = .false. )
+
+  tzsource%cunits   = 's-1'
+
+  tzsource%cmnhname   = 'ASSE'
+  tzsource%clongname  = 'time filter (Asselin)'
+  tzsource%lavailable = .true.
+  call Budget_source_add( tbudgets(NBUDGET_RG), tzsource )
+
+  tzsource%cmnhname   = 'NEST'
+  tzsource%clongname  = 'nesting'
+  tzsource%lavailable = nmodel > 1
+  call Budget_source_add( tbudgets(NBUDGET_RG), tzsource )
+
+  tzsource%cmnhname   = 'FRC'
+  tzsource%clongname  = 'forcing'
+  tzsource%lavailable = lforcing
+  call Budget_source_add( tbudgets(NBUDGET_RG), tzsource )
+
+  tzsource%cmnhname   = 'DIF'
+  tzsource%clongname  = 'numerical diffusion'
+  tzsource%lavailable = onumdifth
+  call Budget_source_add( tbudgets(NBUDGET_RG), tzsource )
+
+  tzsource%cmnhname   = 'REL'
+  tzsource%clongname  = 'relaxation'
+  tzsource%lavailable = ohorelax_rg
+  call Budget_source_add( tbudgets(NBUDGET_RG), tzsource )
+
+!   tzsource%cmnhname   = 'NETUR'
+!   tzsource%clongname  = 'negativity correction induced by turbulence'
+!   tzsource%lavailable = hturb == 'TKEL' .and. (      hcloud == 'ICE3' .or. hcloud == 'ICE4' &
+!                                   .or. hcloud == 'KHKO' .or. hcloud == 'C2R2' .or. hcloud == 'LIMA' )
+!   call Budget_source_add( tbudgets(NBUDGET_RG), tzsource nneturrg )
+
+  tzsource%cmnhname   = 'VISC'
+  tzsource%clongname  = 'viscosity'
+  tzsource%lavailable = lvisc .and. lvisc_r
+  call Budget_source_add( tbudgets(NBUDGET_RG), tzsource )
+
+  tzsource%cmnhname   = 'ADV'
+  tzsource%clongname  = 'total advection'
+  tzsource%lavailable = .true.
+  call Budget_source_add( tbudgets(NBUDGET_RG), tzsource )
+
+  tzsource%cmnhname   = 'NEADV'
+  tzsource%clongname  = 'negativity correction induced by advection'
+  tzsource%lavailable =  hcloud == 'ICE3' .or. hcloud == 'ICE4' .or. hcloud == 'LIMA'
+  call Budget_source_add( tbudgets(NBUDGET_RG), tzsource )
+
+  tzsource%cmnhname   = 'NEGA'
+  tzsource%clongname  = 'negativity correction'
+  tzsource%lavailable =  hcloud == 'ICE3' .or. hcloud == 'ICE4' .or. hcloud == 'LIMA'
+  call Budget_source_add( tbudgets(NBUDGET_RG), tzsource )
+
+  tzsource%cmnhname   = 'CORR'
+  tzsource%clongname  = 'correction'
+  tzsource%lavailable = hcloud(1:3) == 'ICE' .and. lred .and. celec == 'NONE'
+  call Budget_source_add( tbudgets(NBUDGET_RG), tzsource )
+
+  tzsource%cmnhname   = 'SEDI'
+  tzsource%clongname  = 'sedimentation'
+  tzsource%lavailable =      ( hcloud      == 'LIMA' .and. nmom_i.ge.1 .and. nmom_s.ge.1 ) &
+                        .or.   hcloud(1:3) == 'ICE'
+  call Budget_source_add( tbudgets(NBUDGET_RG), tzsource )
+
+  tzsource%cmnhname   = 'HONR'
+  tzsource%clongname  = 'rain homogeneous freezing'
+  tzsource%lavailable = hcloud == 'LIMA' .and. ( lptsplit .or. ( nmom_i.ge.1 .and. lnucl_lima .and. nmom_r.ge.1 ) )
+  call Budget_source_add( tbudgets(NBUDGET_RG), tzsource )
+
+  tzsource%cmnhname   = 'SFR'
+  tzsource%clongname  = 'spontaneous freezing'
+  tzsource%lavailable = hcloud(1:3) == 'ICE'
+  call Budget_source_add( tbudgets(NBUDGET_RG), tzsource )
+
+  tzsource%cmnhname   = 'DEPG'
+  tzsource%clongname  = 'deposition on graupel'
+  tzsource%lavailable =    ( hcloud == 'LIMA' .and. ( lptsplit .or. ( nmom_i.ge.1 .and. nmom_c.ge.1 .and. nmom_s.ge.1 ) ) ) &
+                        .or. hcloud(1:3) == 'ICE'
+  call Budget_source_add( tbudgets(NBUDGET_RG), tzsource )
+
+  tzsource%cmnhname   = 'RIM'
+  tzsource%clongname  = 'riming of cloud water'
+  tzsource%lavailable =    ( hcloud == 'LIMA' .and. ( lptsplit .or. ( nmom_i.ge.1 .and. nmom_c.ge.1 .and. nmom_s.ge.1 ) ) ) &
+                        .or. hcloud(1:3) == 'ICE'
+  call Budget_source_add( tbudgets(NBUDGET_RG), tzsource )
+
+  tzsource%cmnhname   = 'ACC'
+  tzsource%clongname  = 'accretion of rain on graupel'
+  tzsource%lavailable =      ( hcloud == 'LIMA' .and. ( lptsplit .or. (       nmom_i.ge.1 .and. nmom_c.ge.1      &
+                                                                        .and. nmom_s.ge.1 .and. nmom_r.ge.1) ) ) &
+                        .or.   hcloud(1:3) == 'ICE'
+  call Budget_source_add( tbudgets(NBUDGET_RG), tzsource )
+
+  tzsource%cmnhname   = 'CMEL'
+  tzsource%clongname  = 'conversion melting of snow'
+  tzsource%lavailable =    ( hcloud == 'LIMA' .and. ( lptsplit .or. (nmom_i.ge.1 .and. nmom_c.ge.1 .and. nmom_s.ge.1) ) ) &
+                        .or. hcloud(1:3) == 'ICE'
+  call Budget_source_add( tbudgets(NBUDGET_RG), tzsource )
+
+  tzsource%cmnhname   = 'CFRZ'
+  tzsource%clongname  = 'conversion freezing of rain'
+  tzsource%lavailable =    ( hcloud == 'LIMA' .and. ( lptsplit .or. (nmom_i.ge.1 .and. nmom_c.ge.1 .and. nmom_s.ge.1) ) ) &
+                        .or. hcloud(1:3) == 'ICE'
+  call Budget_source_add( tbudgets(NBUDGET_RG), tzsource )
+
+  tzsource%cmnhname   = 'RDSF'
+  tzsource%clongname  = 'ice multiplication process following rain contact freezing'
+  tzsource%lavailable = hcloud == 'LIMA' .and. ( lptsplit .or. ( nmom_i.ge.1 .and. nmom_c.ge.1 .and. nmom_s.ge.1 .and. lrdsf ) )
+  call Budget_source_add( tbudgets(NBUDGET_RG), tzsource )  
+
+  tzsource%cmnhname   = 'WETG'
+  tzsource%clongname  = 'wet growth of graupel'
+  tzsource%lavailable =    ( hcloud == 'LIMA' .and. ( lptsplit .or. (nmom_i.ge.1 .and. nmom_c.ge.1 .and. nmom_s.ge.1) ) ) &
+                        .or. hcloud(1:3) == 'ICE'
+  call Budget_source_add( tbudgets(NBUDGET_RG), tzsource )
+
+  tzsource%cmnhname   = 'GHCV'
+  tzsource%clongname  = 'graupel to hail conversion'
+  tzsource%lavailable = hcloud == 'ICE4' .and. lred .and. celec == 'NONE'
+  call Budget_source_add( tbudgets(NBUDGET_RG), tzsource )
+
+  tzsource%cmnhname   = 'DRYG'
+  tzsource%clongname  = 'dry growth of graupel'
+  tzsource%lavailable =    ( hcloud == 'LIMA' .and. ( lptsplit .or. (nmom_i.ge.1 .and. nmom_c.ge.1 .and. nmom_s.ge.1) ) ) &
+                        .or. hcloud(1:3) == 'ICE'
+  call Budget_source_add( tbudgets(NBUDGET_RG), tzsource )
+
+  tzsource%cmnhname   = 'HMG'
+  tzsource%clongname  = 'Hallett-Mossop ice multiplication process due to graupel riming'
+  tzsource%lavailable = hcloud == 'LIMA' .and. ( lptsplit .or. (nmom_i.ge.1 .and. nmom_c.ge.1 .and. nmom_s.ge.1 ) )
+  call Budget_source_add( tbudgets(NBUDGET_RG), tzsource )
+
+  tzsource%cmnhname   = 'GMLT'
+  tzsource%clongname  = 'graupel melting'
+  tzsource%lavailable =    ( hcloud == 'LIMA' .and. ( lptsplit .or. (nmom_i.ge.1 .and. nmom_c.ge.1 .and. nmom_s.ge.1) ) ) &
+                        .or. hcloud(1:3) == 'ICE'
+  call Budget_source_add( tbudgets(NBUDGET_RG), tzsource )
+
+  tzsource%cmnhname   = 'WETH'
+  tzsource%clongname  = 'wet growth of hail'
+  tzsource%lavailable =      ( hcloud == 'LIMA' .and. .not.lptsplit .and. nmom_h.ge.1 .and. nmom_i.ge.1 &
+                                                .and. nmom_c.ge.1    .and. nmom_s.ge.1 )                &
+                        .or. ( hcloud == 'LIMA' .and. lptsplit ) &
+                        .or.   hcloud == 'ICE4'
+  call Budget_source_add( tbudgets(NBUDGET_RG), tzsource )
+
+  tzsource%cmnhname   = 'COHG'
+  tzsource%clongname  = 'conversion of hail to graupel'
+  tzsource%lavailable = hcloud == 'LIMA' .and. (lptsplit .or. (nmom_h.ge.1 .and. nmom_i.ge.1 .and. nmom_c.ge.1 .and. nmom_s.ge.1) )
+  call Budget_source_add( tbudgets(NBUDGET_RG), tzsource )
+
+  tzsource%cmnhname   = 'HGCV'
+  tzsource%clongname  = 'hail to graupel conversion'
+  tzsource%lavailable = hcloud == 'ICE4' .and. lred .and. celec == 'NONE'
+  call Budget_source_add( tbudgets(NBUDGET_RG), tzsource )
+
+  tzsource%cmnhname   = 'DRYH'
+  tzsource%clongname  = 'dry growth of hail'
+  tzsource%lavailable = hcloud == 'ICE4' .and. lred .and. celec == 'NONE'
+  call Budget_source_add( tbudgets(NBUDGET_RG), tzsource )
+
+  tzsource%cmnhname   = 'NECON'
+  tzsource%clongname  = 'negativity correction induced by condensation'
+  tzsource%lavailable = (      hcloud == 'KESS' .or. hcloud == 'ICE3' .or. hcloud == 'ICE4'   &
+                          .or. hcloud == 'KHKO' .or. hcloud == 'C2R2' .or. hcloud == 'LIMA' ) &
+                        .and. celec == 'NONE'
+  call Budget_source_add( tbudgets(NBUDGET_RG), tzsource )
+
+
+  call Sourcelist_sort_compact( tbudgets(NBUDGET_RG) )
+
+  call Sourcelist_scan( tbudgets(NBUDGET_RG), cbulist_rrg )
+end if
+
+! Budget of RRH
+tbudgets(NBUDGET_RH)%lenabled = lbu_rrh .and. krr >= 7
+
+if ( tbudgets(NBUDGET_RH)%lenabled ) then
+  tbudgets(NBUDGET_RH)%trhodj => tburhodj
+
+  !Allocate all basic source terms (used or not)
+  !The size should be large enough (bigger than necessary is OK)
+  tbudgets(NBUDGET_RH)%nsourcesmax = NSOURCESMAX
+  allocate( tbudgets(NBUDGET_RH)%tsources(NSOURCESMAX) )
+
+  allocate( tbudgets(NBUDGET_RH)%xtmpstore(ibudim1, ibudim2, ibudim3) )
+
+  tbudgets(NBUDGET_RH)%tsources(:)%ngroup = 0
+
+  tzsource%ccomment = 'Budget of hail mixing ratio'
+  tzsource%ngrid    = 1
+
+  tzsource%cunits   = 'kg kg-1'
+
+  tzsource%cmnhname   = 'INIF'
+  tzsource%clongname  = 'initial state'
+  tzsource%lavailable = .true.
+  call Budget_source_add( tbudgets(NBUDGET_RH), tzsource, odonotinit = .true., ooverwrite = .true. )
+
+  tzsource%cmnhname   = 'ENDF'
+  tzsource%clongname  = 'final state'
+  tzsource%lavailable = .true.
+  call Budget_source_add( tbudgets(NBUDGET_RH), tzsource, odonotinit = .true., ooverwrite = .true. )
+
+  tzsource%cmnhname   = 'AVEF'
+  tzsource%clongname  = 'averaged state'
+  tzsource%lavailable = .true.
+  call Budget_source_add( tbudgets(NBUDGET_RH), tzsource, odonotinit = .true., ooverwrite = .false. )
+
+  tzsource%cunits   = 's-1'
+
+  tzsource%cmnhname   = 'ASSE'
+  tzsource%clongname  = 'time filter (Asselin)'
+  tzsource%lavailable = .true.
+  call Budget_source_add( tbudgets(NBUDGET_RH), tzsource )
+
+  tzsource%cmnhname   = 'NEST'
+  tzsource%clongname  = 'nesting'
+  tzsource%lavailable = nmodel > 1
+  call Budget_source_add( tbudgets(NBUDGET_RH), tzsource )
+
+  tzsource%cmnhname   = 'FRC'
+  tzsource%clongname  = 'forcing'
+  tzsource%lavailable = lforcing
+  call Budget_source_add( tbudgets(NBUDGET_RH), tzsource )
+
+  tzsource%cmnhname   = 'DIF'
+  tzsource%clongname  = 'numerical diffusion'
+  tzsource%lavailable = onumdifth
+  call Budget_source_add( tbudgets(NBUDGET_RH), tzsource )
+
+  tzsource%cmnhname   = 'REL'
+  tzsource%clongname  = 'relaxation'
+  tzsource%lavailable = ohorelax_rh
+  call Budget_source_add( tbudgets(NBUDGET_RH), tzsource )
+
+!   tzsource%cmnhname   = 'NETUR'
+!   tzsource%clongname  = 'negativity correction induced by turbulence'
+!   tzsource%lavailable = hturb == 'TKEL' .and. (      hcloud == 'ICE3' .or. hcloud == 'ICE4' &
+!                                   .or. hcloud == 'KHKO' .or. hcloud == 'C2R2' .or. hcloud == 'LIMA' )
+!   call Budget_source_add( tbudgets(NBUDGET_RH), tzsource nneturrh )
+
+  tzsource%cmnhname   = 'VISC'
+  tzsource%clongname  = 'viscosity'
+  tzsource%lavailable = lvisc .and. lvisc_r
+  call Budget_source_add( tbudgets(NBUDGET_RH), tzsource )
+
+  tzsource%cmnhname   = 'ADV'
+  tzsource%clongname  = 'total advection'
+  tzsource%lavailable = .true.
+  call Budget_source_add( tbudgets(NBUDGET_RH), tzsource )
+
+  tzsource%cmnhname   = 'NEADV'
+  tzsource%clongname  = 'negativity correction induced by advection'
+  tzsource%lavailable = .true.
+  call Budget_source_add( tbudgets(NBUDGET_RH), tzsource )
+
+  tzsource%cmnhname   = 'NEGA'
+  tzsource%clongname  = 'negativity correction'
+  tzsource%lavailable =  .true.
+  call Budget_source_add( tbudgets(NBUDGET_RH), tzsource )
+
+  tzsource%cmnhname   = 'SEDI'
+  tzsource%clongname  = 'sedimentation'
+  tzsource%lavailable =      ( hcloud == 'LIMA' .and. nmom_i.ge.1 .and. nmom_h.ge.1 ) &
+                        .or.   hcloud == 'ICE4'
+  call Budget_source_add( tbudgets(NBUDGET_RH), tzsource )
+
+  tzsource%cmnhname   = 'DEPH'
+  tzsource%clongname  = 'deposition on hail'
+  tzsource%lavailable =      ( hcloud == 'LIMA' .and. nmom_h.ge.1 ) 
+  call Budget_source_add( tbudgets(NBUDGET_RH), tzsource )
+
+
+  tzsource%cmnhname   = 'GHCV'
+  tzsource%clongname  = 'graupel to hail conversion'
+  tzsource%lavailable = hcloud == 'ICE4' .and. lred .and. celec == 'NONE'
+  call Budget_source_add( tbudgets(NBUDGET_RH), tzsource )
+
+  tzsource%cmnhname   = 'WETG'
+  tzsource%clongname  = 'wet growth of graupel'
+  tzsource%lavailable =      ( hcloud == 'LIMA' .and. nmom_h.ge.1                                                            &
+                                                .and. ( lptsplit .or. ( nmom_i.ge.1 .and. nmom_c.ge.1 .and. nmom_s.ge.1 ) ) ) &
+                        .or. ( hcloud == 'ICE4' .and. ( .not. lred .or. celec /= 'NONE' ) )
+  call Budget_source_add( tbudgets(NBUDGET_RH), tzsource )
+
+  tzsource%cmnhname   = 'WETH'
+  tzsource%clongname  = 'wet growth of hail'
+  tzsource%lavailable =      ( hcloud == 'LIMA' .and. .not.lptsplit .and. nmom_h.ge.1 .and. nmom_i.ge.1    &
+                                                                    .and. nmom_c.ge.1 .and. nmom_s.ge.1 ) &
+                        .or. ( hcloud == 'LIMA' .and. lptsplit ) &
+                        .or.   hcloud == 'ICE4'
+  call Budget_source_add( tbudgets(NBUDGET_RH), tzsource )
+
+  tzsource%cmnhname   = 'COHG'
+  tzsource%clongname  = 'conversion from hail to graupel'
+  tzsource%lavailable = hcloud == 'LIMA' .and. ( lptsplit .or. (nmom_h.ge.1 .and. nmom_i.ge.1 &
+                                                             .and. nmom_c.ge.1 .and. nmom_s.ge.1) )
+  call Budget_source_add( tbudgets(NBUDGET_RH), tzsource )
+
+  tzsource%cmnhname   = 'HGCV'
+  tzsource%clongname  = 'hail to graupel conversion'
+  tzsource%lavailable = hcloud == 'ICE4' .and. lred .and. celec == 'NONE'
+  call Budget_source_add( tbudgets(NBUDGET_RH), tzsource )
+
+  tzsource%cmnhname   = 'DRYH'
+  tzsource%clongname  = 'dry growth of hail'
+  tzsource%lavailable = hcloud == 'ICE4' .and. lred .and. celec == 'NONE'
+  call Budget_source_add( tbudgets(NBUDGET_RH), tzsource )
+
+  tzsource%cmnhname   = 'HMLT'
+  tzsource%clongname  = 'melting of hail'
+  tzsource%lavailable =      ( hcloud == 'LIMA' .and. .not. lptsplit .and. nmom_h.ge.1 .and. nmom_i.ge.1   &
+                                                                     .and. nmom_c.ge.1 .and. nmom_s.ge.1 ) &
+                        .or. ( hcloud == 'LIMA' .and. lptsplit ) &
+                        .or.   hcloud == 'ICE4'
+  call Budget_source_add( tbudgets(NBUDGET_RH), tzsource )
+
+  tzsource%cmnhname   = 'CORR'
+  tzsource%clongname  = 'correction'
+  tzsource%lavailable = hcloud == 'ICE4' .and. lred .and. celec == 'NONE'
+  call Budget_source_add( tbudgets(NBUDGET_RH), tzsource )
+
+  tzsource%cmnhname   = 'NECON'
+  tzsource%clongname  = 'negativity correction induced by condensation'
+  tzsource%lavailable = celec == 'NONE'
+  call Budget_source_add( tbudgets(NBUDGET_RH), tzsource )
+
+
+  call Sourcelist_sort_compact( tbudgets(NBUDGET_RH) )
+
+  call Sourcelist_scan( tbudgets(NBUDGET_RH), cbulist_rrh )
+end if
+
+! Budgets of RSV (scalar variables)
+
+if ( ksv > 999 ) call Print_msg( NVERB_FATAL, 'BUD', 'Ini_budget', 'number of scalar variables > 999' )
+
+SV_BUDGETS: do jsv = 1, ksv
+  ibudget = NBUDGET_SV1 - 1 + jsv
+
+  tbudgets(ibudget)%lenabled = lbu_rsv
+
+  if ( lbu_rsv ) then
+    tbudgets(ibudget)%trhodj => tburhodj
+
+    !Allocate all basic source terms (used or not)
+    !The size should be large enough (bigger than necessary is OK)
+    tbudgets(ibudget)%nsourcesmax = NSOURCESMAX
+    allocate( tbudgets(ibudget)%tsources(NSOURCESMAX) )
+
+    allocate( tbudgets(ibudget)%xtmpstore(ibudim1, ibudim2, ibudim3) )
+
+    tbudgets(ibudget)%tsources(:)%ngroup = 0
+
+    tzsource%ccomment = 'Budget of scalar variable ' // tsvlist(jsv)%cmnhname
+    tzsource%ngrid    = 1
+
+    tzsource%cunits   = '1'
+
+    tzsource%cmnhname   = 'INIF'
+    tzsource%clongname  = 'initial state'
+    tzsource%lavailable = .true.
+    call Budget_source_add( tbudgets(ibudget), tzsource, odonotinit = .true., ooverwrite = .true. )
+
+    tzsource%cmnhname   = 'ENDF'
+    tzsource%clongname  = 'final state'
+    tzsource%lavailable = .true.
+    call Budget_source_add( tbudgets(ibudget), tzsource, odonotinit = .true., ooverwrite = .true. )
+
+    tzsource%cmnhname   = 'AVEF'
+    tzsource%clongname  = 'averaged state'
+    tzsource%lavailable = .true.
+    call Budget_source_add( tbudgets(ibudget), tzsource, odonotinit = .true., ooverwrite = .false. )
+
+    tzsource%cunits   = 's-1'
+
+    tzsource%cmnhname   = 'ASSE'
+    tzsource%clongname  = 'time filter (Asselin)'
+    tzsource%lavailable = .true.
+    call Budget_source_add( tbudgets(ibudget), tzsource )
+
+    tzsource%cmnhname   = 'NEST'
+    tzsource%clongname  = 'nesting'
+    tzsource%lavailable = nmodel > 1
+    call Budget_source_add( tbudgets(ibudget), tzsource )
+
+    tzsource%cmnhname   = 'FRC'
+    tzsource%clongname  = 'forcing'
+    tzsource%lavailable = lforcing
+    call Budget_source_add( tbudgets(ibudget), tzsource )
+
+    tzsource%cmnhname   = 'DIF'
+    tzsource%clongname  = 'numerical diffusion'
+    tzsource%lavailable = onumdifsv
+    call Budget_source_add( tbudgets(ibudget), tzsource )
+
+    tzsource%cmnhname   = 'REL'
+    tzsource%clongname  = 'relaxation'
+    tzsource%lavailable = ohorelax_sv( jsv ) .or. ( celec /= 'NONE' .and. lrelax2fw_ion                 &
+                                                    .and. (jsv == nsv_elecbeg .or. jsv == nsv_elecend ) )
+    call Budget_source_add( tbudgets(ibudget), tzsource )
+
+    tzsource%cmnhname   = 'DCONV'
+    tzsource%clongname  = 'KAFR convection'
+    tzsource%lavailable = ( hdconv == 'KAFR' .or. hsconv == 'KAFR' ) .and. ochtrans
+    call Budget_source_add( tbudgets(ibudget), tzsource )
+
+    tzsource%cmnhname   = 'VTURB'
+    tzsource%clongname  = 'vertical turbulent diffusion'
+    tzsource%lavailable = hturb == 'TKEL'
+    call Budget_source_add( tbudgets(ibudget), tzsource )
+
+    tzsource%cmnhname   = 'HTURB'
+    tzsource%clongname  = 'horizontal turbulent diffusion'
+    tzsource%lavailable = hturb == 'TKEL' .and. HTURBDIM == '3DIM'
+    call Budget_source_add( tbudgets(ibudget), tzsource )
+
+    tzsource%cmnhname   = 'MAFL'
+    tzsource%clongname  = 'mass flux'
+    tzsource%lavailable = hsconv == 'EDKF'
+    call Budget_source_add( tbudgets(ibudget), tzsource )
+
+    tzsource%cmnhname   = 'VISC'
+    tzsource%clongname  = 'viscosity'
+    tzsource%lavailable = lvisc .and. lvisc_sv
+    call Budget_source_add( tbudgets(ibudget), tzsource )
+
+    tzsource%cmnhname   = 'ADV'
+    tzsource%clongname  = 'total advection'
+    tzsource%lavailable = .true.
+    call Budget_source_add( tbudgets(ibudget), tzsource )
+
+    tzsource%cmnhname   = 'NEGA2'
+    tzsource%clongname  = 'negativity correction'
+    tzsource%lavailable = .true.
+    call Budget_source_add( tbudgets(ibudget), tzsource )
+
+    ! Add specific source terms to different scalar variables
+    SV_VAR: if ( jsv <= nsv_user ) then
+      ! nsv_user case
+      ! Nothing to do
+
+    else if ( jsv >= nsv_c2r2beg .and. jsv <= nsv_c2r2end ) then SV_VAR
+      ! C2R2 or KHKO Case
+
+      ! Source terms in common for all C2R2/KHKO budgets
+      tzsource%cmnhname   = 'NETUR'
+      tzsource%clongname  = 'negativity correction induced by turbulence'
+      tzsource%lavailable = hturb == 'TKEL'
+      call Budget_source_add( tbudgets(ibudget), tzsource )
+
+      tzsource%cmnhname   = 'NEADV'
+      tzsource%clongname  = 'negativity correction induced by advection'
+      tzsource%lavailable = .true.
+      call Budget_source_add( tbudgets(ibudget), tzsource )
+
+      tzsource%cmnhname   = 'NEGA'
+      tzsource%clongname  = 'negativity correction'
+      tzsource%lavailable = .true.
+      call Budget_source_add( tbudgets(ibudget), tzsource )
+
+      tzsource%cmnhname   = 'NECON'
+      tzsource%clongname  = 'negativity correction induced by condensation'
+      tzsource%lavailable = .true.
+      call Budget_source_add( tbudgets(ibudget), tzsource )
+
+      ! Source terms specific to each budget
+      SV_C2R2: select case( jsv - nsv_c2r2beg + 1 )
+        case ( 1 ) SV_C2R2
+          ! Concentration of activated nuclei
+          tzsource%cmnhname   = 'HENU'
+          tzsource%clongname  = 'CCN activation'
+          gtmp = cactccn == 'ABRK' .and. (lorilam .or. ldust .or. lsalt )
+          tzsource%lavailable =  gtmp .or. ( .not.gtmp .and. .not.lsupsat_c2r2 )
+          call Budget_source_add( tbudgets(ibudget), tzsource )
+
+          tzsource%cmnhname   = 'CEVA'
+          tzsource%clongname  = 'evaporation'
+          tzsource%lavailable = .true.
+          call Budget_source_add( tbudgets(ibudget), tzsource )
+
+
+        case ( 2 ) SV_C2R2
+          ! Concentration of cloud droplets
+          tzsource%cmnhname   = 'DEPOTR'
+          tzsource%clongname  = 'tree droplet deposition'
+          tzsource%lavailable = odragtree .and. odepotree
+          call Budget_source_add( tbudgets(ibudget), tzsource)
+
+          tzsource%cmnhname   = 'HENU'
+          tzsource%clongname  = 'CCN activation'
+          gtmp = cactccn == 'ABRK' .and. (lorilam .or. ldust .or. lsalt )
+          tzsource%lavailable =  gtmp .or. ( .not.gtmp .and. .not.lsupsat_c2r2 )
+          call Budget_source_add( tbudgets(ibudget), tzsource )
+
+          tzsource%cmnhname   = 'SELF'
+          tzsource%clongname  = 'self-collection of cloud droplets'
+          tzsource%lavailable = lrain_c2r2
+          call Budget_source_add( tbudgets(ibudget), tzsource )
+
+          tzsource%cmnhname   = 'ACCR'
+          tzsource%clongname  = 'accretion of cloud droplets'
+          tzsource%lavailable = lrain_c2r2
+          call Budget_source_add( tbudgets(ibudget), tzsource )
+
+          tzsource%cmnhname   = 'SEDI'
+          tzsource%clongname  = 'sedimentation'
+          tzsource%lavailable = lsedc_c2r2
+          call Budget_source_add( tbudgets(ibudget), tzsource )
+
+          tzsource%cmnhname   = 'DEPO'
+          tzsource%clongname  = 'surface droplet deposition'
+          tzsource%lavailable = ldepoc_c2r2
+          call Budget_source_add( tbudgets(ibudget), tzsource )
+
+          tzsource%cmnhname   = 'CEVA'
+          tzsource%clongname  = 'evaporation'
+          tzsource%lavailable = .true.
+          call Budget_source_add( tbudgets(ibudget), tzsource )
+
+
+        case ( 3 ) SV_C2R2
+          ! Concentration of raindrops
+          tzsource%cmnhname   = 'AUTO'
+          tzsource%clongname  = 'autoconversion into rain'
+          tzsource%lavailable = lrain_c2r2
+          call Budget_source_add( tbudgets(ibudget), tzsource )
+
+          tzsource%cmnhname   = 'SCBU'
+          tzsource%clongname  = 'self collection - coalescence/break-up'
+          tzsource%lavailable = hcloud /= 'KHKO'
+          call Budget_source_add( tbudgets(ibudget), tzsource )
+
+          tzsource%cmnhname   = 'REVA'
+          tzsource%clongname  = 'rain evaporation'
+          tzsource%lavailable = lrain_c2r2
+          call Budget_source_add( tbudgets(ibudget), tzsource )
+
+          tzsource%cmnhname   = 'BRKU'
+          tzsource%clongname  = 'spontaneous break-up'
+          tzsource%lavailable = lrain_c2r2
+          call Budget_source_add( tbudgets(ibudget), tzsource )
+
+          tzsource%cmnhname   = 'SEDI'
+          tzsource%clongname  = 'sedimentation'
+          tzsource%lavailable = .true.
+          call Budget_source_add( tbudgets(ibudget), tzsource )
+
+
+        case ( 4 ) SV_C2R2
+          ! Supersaturation
+          tzsource%cmnhname   = 'CEVA'
+          tzsource%clongname  = 'evaporation'
+          tzsource%lavailable = .true.
+          call Budget_source_add( tbudgets(ibudget), tzsource )
+
+      end select SV_C2R2
+
+
+    else if ( jsv >= nsv_lima_beg .and. jsv <= nsv_lima_end ) then SV_VAR
+      ! LIMA case
+
+      ! Source terms in common for all LIMA budgets (except supersaturation)
+      if ( jsv /= nsv_lima_spro ) then
+        tzsource%cmnhname   = 'NETUR'
+        tzsource%clongname  = 'negativity correction induced by turbulence'
+        tzsource%lavailable = hturb == 'TKEL'
+        call Budget_source_add( tbudgets(ibudget), tzsource )
+
+        tzsource%cmnhname   = 'NEADV'
+        tzsource%clongname  = 'negativity correction induced by advection'
+        tzsource%lavailable = .true.
+        call Budget_source_add( tbudgets(ibudget), tzsource )
+
+        tzsource%cmnhname   = 'NEGA'
+        tzsource%clongname  = 'negativity correction'
+        tzsource%lavailable = .true.
+        call Budget_source_add( tbudgets(ibudget), tzsource )
+
+        tzsource%cmnhname   = 'NECON'
+        tzsource%clongname  = 'negativity correction induced by condensation'
+        tzsource%lavailable = .true.
+        call Budget_source_add( tbudgets(ibudget), tzsource )
+      end if
+
+
+      ! Source terms specific to each budget
+      SV_LIMA: if ( jsv == nsv_lima_nc ) then
+        ! Cloud droplets concentration
+        tzsource%cmnhname   = 'DEPOTR'
+        tzsource%clongname  = 'tree droplet deposition'
+        tzsource%lavailable = odragtree .and. odepotree
+        call Budget_source_add( tbudgets(ibudget), tzsource )
+
+!         tzsource%cmnhname   = 'CORR'
+!         tzsource%clongname  = 'correction'
+!         tzsource%lavailable = lptsplit .and. nmom_c.ge.1  .and. nmom_r.ge.1
+!         call Budget_source_add( tbudgets(ibudget), tzsource )
+
+        tzsource%cmnhname   = 'SEDI'
+        tzsource%clongname  = 'sedimentation'
+        tzsource%lavailable = nmom_c.ge.1  .and. lsedc_lima
+        call Budget_source_add( tbudgets(ibudget), tzsource )
+
+        tzsource%cmnhname   = 'DEPO'
+        tzsource%clongname  = 'surface droplet deposition'
+        tzsource%lavailable = nmom_c.ge.1  .and. ldepoc_lima
+        call Budget_source_add( tbudgets(ibudget), tzsource )
+
+        tzsource%cmnhname   = 'R2C1'
+        tzsource%clongname  = 'rain to cloud change after sedimentation'
+        tzsource%lavailable = lptsplit .and. nmom_c.ge.1  .and. nmom_r.ge.1
+        call Budget_source_add( tbudgets(ibudget), tzsource )
+
+        tzsource%cmnhname   = 'HENU'
+        tzsource%clongname  = 'CCN activation'
+        tzsource%lavailable = nmom_c.ge.1  .and. lacti_lima .and. nmod_ccn >= 1 .and. ( .not.lptsplit .or. .not.lsubg_cond )
+        call Budget_source_add( tbudgets(ibudget), tzsource )
+
+        tzsource%cmnhname   = 'HINC'
+        tzsource%clongname  = 'heterogeneous nucleation by contact'
+        tzsource%lavailable = nmom_i.ge.1 .and. lnucl_lima
+        call Budget_source_add( tbudgets(ibudget), tzsource )
+
+        tzsource%cmnhname   = 'SELF'
+        tzsource%clongname  = 'self-collection of cloud droplets'
+        tzsource%lavailable = lptsplit .or. (nmom_c.ge.1 .and. nmom_r.ge.1)
+        call Budget_source_add( tbudgets(ibudget), tzsource )
+
+        tzsource%cmnhname   = 'AUTO'
+        tzsource%clongname  = 'autoconversion into rain'
+        tzsource%lavailable = lptsplit .or. ( nmom_c.ge.1  .and. nmom_r.ge.1 )
+        call Budget_source_add( tbudgets(ibudget), tzsource )
+
+        tzsource%cmnhname   = 'ACCR'
+        tzsource%clongname  = 'accretion of cloud droplets'
+        tzsource%lavailable = lptsplit .or. ( nmom_c.ge.1  .and. nmom_r.ge.1 )
+        call Budget_source_add( tbudgets(ibudget), tzsource )
+
+        tzsource%cmnhname   = 'REVA'
+        tzsource%clongname  = 'rain evaporation'
+        tzsource%lavailable = lptsplit .or. ( nmom_c.ge.1  .and. nmom_r.ge.1 )
+        call Budget_source_add( tbudgets(ibudget), tzsource )
+
+        tzsource%cmnhname   = 'HONC'
+        tzsource%clongname  = 'droplet homogeneous freezing'
+        tzsource%lavailable = lptsplit .or. ( nmom_i.ge.1 .and. nmom_c.ge.1  .and. lnucl_lima )
+        call Budget_source_add( tbudgets(ibudget), tzsource )
+
+        tzsource%cmnhname   = 'IMLT'
+        tzsource%clongname  = 'melting of ice'
+        tzsource%lavailable = lptsplit .or. ( nmom_i.ge.1 .and. nmom_c.ge.1  )
+        call Budget_source_add( tbudgets(ibudget), tzsource )
+
+        tzsource%cmnhname   = 'RIM'
+        tzsource%clongname  = 'riming of cloud water'
+        tzsource%lavailable = lptsplit .or. ( nmom_i.ge.1 .and. nmom_c.ge.1  .and. nmom_s.ge.1 )
+        call Budget_source_add( tbudgets(ibudget), tzsource )
+
+        tzsource%cmnhname   = 'WETG'
+        tzsource%clongname  = 'wet growth of graupel'
+        tzsource%lavailable = lptsplit .or. ( nmom_i.ge.1 .and. nmom_c.ge.1  .and. nmom_s.ge.1 )
+        call Budget_source_add( tbudgets(ibudget), tzsource )
+
+        tzsource%cmnhname   = 'DRYG'
+        tzsource%clongname  = 'dry growth of graupel'
+        tzsource%lavailable = lptsplit .or. ( nmom_i.ge.1 .and. nmom_c.ge.1  .and. nmom_s.ge.1 )
+        call Budget_source_add( tbudgets(ibudget), tzsource )
+
+        tzsource%cmnhname   = 'CVRC'
+        tzsource%clongname  = 'rain to cloud change after other microphysical processes'
+        tzsource%lavailable = lptsplit
+        call Budget_source_add( tbudgets(ibudget), tzsource )
+
+        tzsource%cmnhname   = 'WETH'
+        tzsource%clongname  = 'wet growth of hail'
+        tzsource%lavailable = lptsplit .or. nmom_h.ge.1
+        call Budget_source_add( tbudgets(ibudget), tzsource )
+
+        tzsource%cmnhname   = 'CORR2'
+        tzsource%clongname  = 'supplementary correction inside LIMA splitting'
+        tzsource%lavailable = lptsplit
+        call Budget_source_add( tbudgets(ibudget), tzsource )
+
+        tzsource%cmnhname   = 'CEDS'
+        tzsource%clongname  = 'adjustment to saturation'
+        tzsource%lavailable = nmom_c.ge.1
+        call Budget_source_add( tbudgets(ibudget), tzsource )
+
+
+      else if ( jsv == nsv_lima_nr ) then SV_LIMA
+        ! Rain drops concentration
+!         tzsource%cmnhname   = 'CORR'
+!         tzsource%clongname  = 'correction'
+!         tzsource%lavailable = lptsplit .and. nmom_c.ge.1  .and. nmom_r.ge.1
+!         call Budget_source_add( tbudgets(ibudget), tzsource )
+
+        tzsource%cmnhname   = 'SEDI'
+        tzsource%clongname  = 'sedimentation'
+        tzsource%lavailable = nmom_c.ge.1  .and. nmom_r.ge.1
+        call Budget_source_add( tbudgets(ibudget), tzsource )
+
+        tzsource%cmnhname   = 'R2C1'
+        tzsource%clongname  = 'rain to cloud change after sedimentation'
+        tzsource%lavailable = lptsplit .and. nmom_c.ge.1  .and. nmom_r.ge.1
+        call Budget_source_add( tbudgets(ibudget), tzsource )
+
+        tzsource%cmnhname   = 'AUTO'
+        tzsource%clongname  = 'autoconversion into rain'
+        tzsource%lavailable = lptsplit .or. (nmom_c.ge.1  .and. nmom_r.ge.1)
+        call Budget_source_add( tbudgets(ibudget), tzsource )
+
+        tzsource%cmnhname   = 'SCBU'
+        tzsource%clongname  = 'self collection - coalescence/break-up'
+        tzsource%lavailable = lptsplit .or. (nmom_c.ge.1  .and. nmom_r.ge.1)
+        call Budget_source_add( tbudgets(ibudget), tzsource )
+
+        tzsource%cmnhname   = 'REVA'
+        tzsource%clongname  = 'rain evaporation'
+        tzsource%lavailable = lptsplit .or. (nmom_c.ge.1  .and. nmom_r.ge.1)
+        call Budget_source_add( tbudgets(ibudget), tzsource )
+
+        tzsource%cmnhname   = 'BRKU'
+        tzsource%clongname  = 'spontaneous break-up'
+        tzsource%lavailable = lptsplit .or. (nmom_c.ge.1  .and. nmom_r.ge.1)
+        call Budget_source_add( tbudgets(ibudget), tzsource )
+
+        tzsource%cmnhname   = 'HONR'
+        tzsource%clongname  = 'rain homogeneous freezing'
+        tzsource%lavailable = lptsplit .or. ( nmom_i.ge.1 .and. nmom_c.ge.1  .and. nmom_r.ge.1 .and. lnucl_lima )
+        call Budget_source_add( tbudgets(ibudget), tzsource )
+
+        tzsource%cmnhname   = 'ACC'
+        tzsource%clongname  = 'accretion of rain  on aggregates'
+        tzsource%lavailable = lptsplit .or. ( nmom_i.ge.1 .and. nmom_c.ge.1  .and. nmom_s.ge.1 .and. nmom_r.ge.1 )
+        call Budget_source_add( tbudgets(ibudget), tzsource )
+
+        tzsource%cmnhname   = 'CFRZ'
+        tzsource%clongname  = 'conversion freezing of rain'
+        tzsource%lavailable = lptsplit .or. ( nmom_i.ge.1 .and. nmom_c.ge.1  .and. nmom_s.ge.1 )
+        call Budget_source_add( tbudgets(ibudget), tzsource )
+
+        tzsource%cmnhname   = 'WETG'
+        tzsource%clongname  = 'wet growth of graupel'
+        tzsource%lavailable = lptsplit .or. ( nmom_i.ge.1 .and. nmom_c.ge.1  .and. nmom_s.ge.1 )
+        call Budget_source_add( tbudgets(ibudget), tzsource )
+
+        tzsource%cmnhname   = 'DRYG'
+        tzsource%clongname  = 'dry growth of graupel'
+        tzsource%lavailable = lptsplit .or. ( nmom_i.ge.1 .and. nmom_c.ge.1  .and. nmom_s.ge.1 )
+        call Budget_source_add( tbudgets(ibudget), tzsource )
+
+        tzsource%cmnhname   = 'GMLT'
+        tzsource%clongname  = 'graupel melting'
+        tzsource%lavailable = lptsplit .or. ( nmom_i.ge.1 .and. nmom_c.ge.1  .and. nmom_s.ge.1 )
+        call Budget_source_add( tbudgets(ibudget), tzsource )
+
+        tzsource%cmnhname   = 'CVRC'
+        tzsource%clongname  = 'rain to cloud change after other microphysical processes'
+        tzsource%lavailable = lptsplit
+        call Budget_source_add( tbudgets(ibudget), tzsource )
+
+        tzsource%cmnhname   = 'WETH'
+        tzsource%clongname  = 'wet growth of hail'
+        tzsource%lavailable = lptsplit .or. nmom_h.ge.1
+        call Budget_source_add( tbudgets(ibudget), tzsource )
+
+        tzsource%cmnhname   = 'HMLT'
+        tzsource%clongname  = 'melting of hail'
+        tzsource%lavailable = lptsplit .or. nmom_h.ge.1
+        call Budget_source_add( tbudgets(ibudget), tzsource )
+
+        tzsource%cmnhname   = 'CORR2'
+        tzsource%clongname  = 'supplementary correction inside LIMA splitting'
+        tzsource%lavailable = lptsplit
+        call Budget_source_add( tbudgets(ibudget), tzsource )
+
+
+      else if ( jsv >= nsv_lima_ccn_free .and. jsv <= nsv_lima_ccn_free + nmod_ccn - 1 ) then SV_LIMA
+        ! Free CCN concentration
+        tzsource%cmnhname   = 'HENU'
+        tzsource%clongname  = 'CCN activation'
+        tzsource%lavailable = nmom_c.ge.1  .and. lacti_lima .and. nmod_ccn >= 1 .and. ( .not.lptsplit .or. .not.lsubg_cond )
+        call Budget_source_add( tbudgets(ibudget), tzsource )
+
+        tzsource%cmnhname   = 'HONH'
+        tzsource%clongname  = 'haze homogeneous nucleation'
+        tzsource%lavailable = nmom_i.ge.1 .and. lnucl_lima .and. lhhoni_lima .and. nmod_ccn >= 1
+        call Budget_source_add( tbudgets(ibudget), tzsource )
+
+        tzsource%cmnhname   = 'CEDS'
+        tzsource%clongname  = 'adjustment to saturation'
+        tzsource%lavailable = nmom_c.ge.1
+        call Budget_source_add( tbudgets(ibudget), tzsource )
+
+        tzsource%cmnhname   = 'SCAV'
+        tzsource%clongname  = 'scavenging'
+        tzsource%lavailable = lscav_lima
+        call Budget_source_add( tbudgets(ibudget), tzsource )
+
+
+      else if ( jsv >= nsv_lima_ccn_acti .and. jsv <= nsv_lima_ccn_acti + nmod_ccn - 1 ) then SV_LIMA
+        ! Activated CCN concentration
+        tzsource%cmnhname   = 'HENU'
+        tzsource%clongname  = 'CCN activation'
+        tzsource%lavailable = nmom_c.ge.1  .and. lacti_lima .and. nmod_ccn >= 1 .and. ( .not.lptsplit .or. .not.lsubg_cond )
+        call Budget_source_add( tbudgets(ibudget), tzsource )
+
+        tzsource%cmnhname   = 'HINC'
+        tzsource%clongname  = 'heterogeneous nucleation by contact'
+        tzsource%lavailable = nmom_i.ge.1 .and. lnucl_lima .and. .not. lmeyers_lima
+        call Budget_source_add( tbudgets(ibudget), tzsource )
+
+        tzsource%cmnhname   = 'CEDS'
+        tzsource%clongname  = 'adjustment to saturation'
+        tzsource%lavailable = nmom_c.ge.1
+        call Budget_source_add( tbudgets(ibudget), tzsource )
+
+
+      else if ( jsv == nsv_lima_scavmass ) then SV_LIMA
+        ! Scavenged mass variable
+        tzsource%cmnhname   = 'SCAV'
+        tzsource%clongname  = 'scavenging'
+        tzsource%lavailable = lscav_lima .and. laero_mass_lima
+        call Budget_source_add( tbudgets(ibudget), tzsource )
+
+        tzsource%cmnhname   = 'CEDS'
+        tzsource%clongname  = 'adjustment to saturation'
+        tzsource%lavailable = lscav_lima .and. laero_mass_lima .and. .not.lspro_lima
+        call Budget_source_add( tbudgets(ibudget), tzsource )
+
+
+      else if ( jsv == nsv_lima_ni ) then SV_LIMA
+        ! Pristine ice crystals concentration
+!         tzsource%cmnhname   = 'CORR'
+!         tzsource%clongname  = 'correction'
+!         tzsource%lavailable = lptsplit .and. nmom_i.ge.1 .and. nmom_s.ge.1
+!         call Budget_source_add( tbudgets(ibudget), tzsource )
+
+        tzsource%cmnhname   = 'SEDI'
+        tzsource%clongname  = 'sedimentation'
+        tzsource%lavailable = nmom_i.ge.1 .and. lsedi_lima
+        call Budget_source_add( tbudgets(ibudget), tzsource )
+
+        tzsource%cmnhname   = 'HIND'
+        tzsource%clongname  = 'heterogeneous nucleation by deposition'
+        tzsource%lavailable = nmom_i.ge.1 .and. lnucl_lima
+        call Budget_source_add( tbudgets(ibudget), tzsource )
+
+        tzsource%cmnhname   = 'HINC'
+        tzsource%clongname  = 'heterogeneous nucleation by contact'
+        tzsource%lavailable = nmom_i.ge.1 .and. lnucl_lima
+        call Budget_source_add( tbudgets(ibudget), tzsource )
+
+        tzsource%cmnhname   = 'HONH'
+        tzsource%clongname  = 'haze homogeneous nucleation'
+        tzsource%lavailable = nmom_i.ge.1 .and. lnucl_lima .and. lhhoni_lima .and. nmod_ccn >= 1
+        call Budget_source_add( tbudgets(ibudget), tzsource )
+
+        tzsource%cmnhname   = 'HONC'
+        tzsource%clongname  = 'droplet homogeneous freezing'
+        tzsource%lavailable = lptsplit .or. ( nmom_i.ge.1 .and. nmom_c.ge.1  .and. lnucl_lima )
+        call Budget_source_add( tbudgets(ibudget), tzsource )
+
+        tzsource%cmnhname   = 'CNVI'
+        tzsource%clongname  = 'conversion of snow to cloud ice'
+        tzsource%lavailable = lptsplit .or. ( nmom_i.ge.1 .and. nmom_s.ge.1 )
+        call Budget_source_add( tbudgets(ibudget), tzsource )
+
+        tzsource%cmnhname   = 'CNVS'
+        tzsource%clongname  = 'conversion of pristine ice to snow'
+        tzsource%lavailable = lptsplit .or. ( nmom_i.ge.1 .and. nmom_s.ge.1 )
+        call Budget_source_add( tbudgets(ibudget), tzsource )
+
+        tzsource%cmnhname   = 'AGGS'
+        tzsource%clongname  = 'aggregation of snow'
+        tzsource%lavailable = lptsplit .or. ( nmom_i.ge.1 .and. nmom_s.ge.1 )
+        call Budget_source_add( tbudgets(ibudget), tzsource )
+
+        tzsource%cmnhname   = 'IMLT'
+        tzsource%clongname  = 'melting of ice'
+        tzsource%lavailable = lptsplit .or. ( nmom_i.ge.1 .and. nmom_c.ge.1  )
+        call Budget_source_add( tbudgets(ibudget), tzsource )
+
+        tzsource%cmnhname   = 'HMS'
+        tzsource%clongname  = 'Hallett-Mossop ice multiplication process due to snow riming'
+        tzsource%lavailable = lptsplit .or. ( nmom_i.ge.1 .and. nmom_c.ge.1  .and. nmom_s.ge.1 )
+        call Budget_source_add( tbudgets(ibudget), tzsource )
+
+        tzsource%cmnhname   = 'CIBU'
+        tzsource%clongname  = 'ice multiplication process due to ice collisional breakup'
+        tzsource%lavailable = lptsplit .or. ( nmom_i.ge.1 .and. nmom_c.ge.1 .and. nmom_s.ge.1 .and. lcibu )
+        call Budget_source_add( tbudgets(ibudget), tzsource )
+
+        tzsource%cmnhname   = 'CFRZ'
+        tzsource%clongname  = 'conversion freezing of rain'
+        tzsource%lavailable = lptsplit .or. ( nmom_i.ge.1 .and. nmom_c.ge.1  .and. nmom_s.ge.1 )
+        call Budget_source_add( tbudgets(ibudget), tzsource )
+
+        tzsource%cmnhname   = 'RDSF'
+        tzsource%clongname  = 'ice multiplication process following rain contact freezing'
+        tzsource%lavailable = lptsplit .or. ( nmom_i.ge.1 .and. nmom_c.ge.1 .and. nmom_s.ge.1 .and. lrdsf )
+        call Budget_source_add( tbudgets(ibudget), tzsource )
+
+        tzsource%cmnhname   = 'WETG'
+        tzsource%clongname  = 'wet growth of graupel'
+        tzsource%lavailable = lptsplit .or. ( nmom_i.ge.1 .and. nmom_c.ge.1  .and. nmom_s.ge.1 )
+        call Budget_source_add( tbudgets(ibudget), tzsource )
+
+        tzsource%cmnhname   = 'DRYG'
+        tzsource%clongname  = 'dry growth of graupel'
+        tzsource%lavailable = lptsplit .or. ( nmom_i.ge.1 .and. nmom_c.ge.1  .and. nmom_s.ge.1 )
+        call Budget_source_add( tbudgets(ibudget), tzsource )
+
+        tzsource%cmnhname   = 'HMG'
+        tzsource%clongname  = 'Hallett-Mossop ice multiplication process due to graupel riming'
+        tzsource%lavailable = lptsplit .or. ( nmom_i.ge.1 .and. nmom_c.ge.1  .and. nmom_s.ge.1 )
+        call Budget_source_add( tbudgets(ibudget), tzsource )
+
+        tzsource%cmnhname   = 'WETH'
+        tzsource%clongname  = 'wet growth of hail'
+        tzsource%lavailable = lptsplit .or. nmom_h.ge.1
+        call Budget_source_add( tbudgets(ibudget), tzsource )
+
+        tzsource%cmnhname   = 'CEDS'
+        tzsource%clongname  = 'adjustment to saturation'
+        tzsource%lavailable = nmom_i.ge.1 .and. .not.lptsplit .and. .not.lspro_lima
+        call Budget_source_add( tbudgets(ibudget), tzsource )
+
+        tzsource%cmnhname   = 'CORR2'
+        tzsource%clongname  = 'supplementary correction inside LIMA splitting'
+        tzsource%lavailable = lptsplit
+        call Budget_source_add( tbudgets(ibudget), tzsource )
+
+      else if ( jsv == nsv_lima_ns ) then SV_LIMA
+
+        tzsource%cmnhname   = 'SEDI'
+        tzsource%clongname  = 'sedimentation'
+        tzsource%lavailable = ( nmom_s.ge.2 )
+        call Budget_source_add( tbudgets(ibudget), tzsource )
+
+        tzsource%cmnhname   = 'CNVI'
+        tzsource%clongname  = 'conversion of snow to cloud ice'
+        tzsource%lavailable = ( nmom_s.ge.2 )
+        call Budget_source_add( tbudgets(ibudget), tzsource )
+
+        tzsource%cmnhname   = 'CNVS'
+        tzsource%clongname  = 'conversion of pristine ice to snow'
+        tzsource%lavailable = ( nmom_s.ge.2 )
+        call Budget_source_add( tbudgets(ibudget), tzsource )
+
+        tzsource%cmnhname   = 'BRKU'
+        tzsource%clongname  = 'break up of snow'
+        tzsource%lavailable = ( nmom_s.ge.2 )
+        call Budget_source_add( tbudgets(ibudget), tzsource )
+
+        tzsource%cmnhname   = 'RIM'
+        tzsource%clongname  = 'heavy riming of cloud droplet on snow'
+        tzsource%lavailable = ( nmom_s.ge.2 )
+        call Budget_source_add( tbudgets(ibudget), tzsource )
+
+        tzsource%cmnhname   = 'ACC'
+        tzsource%clongname  = 'accretion of rain on snow'
+        tzsource%lavailable = ( nmom_s.ge.2 )
+        call Budget_source_add( tbudgets(ibudget), tzsource )
+
+        tzsource%cmnhname   = 'CMEL'
+        tzsource%clongname  = 'conversion melting of snow'
+        tzsource%lavailable = ( nmom_s.ge.2 )
+        call Budget_source_add( tbudgets(ibudget), tzsource )
+
+        tzsource%cmnhname   = 'WETG'
+        tzsource%clongname  = 'wet growth of graupel'
+        tzsource%lavailable = ( nmom_s.ge.2 )
+        call Budget_source_add( tbudgets(ibudget), tzsource )
+
+        tzsource%cmnhname   = 'DRYG'
+        tzsource%clongname  = 'dry growth of graupel'
+        tzsource%lavailable = ( nmom_s.ge.2 )
+        call Budget_source_add( tbudgets(ibudget), tzsource )
+
+        tzsource%cmnhname   = 'WETH'
+        tzsource%clongname  = 'wet growth of hail'
+        tzsource%lavailable = nmom_s.ge.2
+        call Budget_source_add( tbudgets(ibudget), tzsource )
+
+        tzsource%cmnhname   = 'SSC'
+        tzsource%clongname  = 'snow self collection'
+        tzsource%lavailable = ( nmom_s.ge.2 )
+        call Budget_source_add( tbudgets(ibudget), tzsource )
+        
+        tzsource%cmnhname   = 'CEDS'
+        tzsource%clongname  = 'adjustment to saturation'
+        tzsource%lavailable = nmom_i.ge.1 .and. .not.lptsplit .and. .not.lspro_lima
+        call Budget_source_add( tbudgets(ibudget), tzsource )
+
+      else if ( jsv == nsv_lima_ng ) then SV_LIMA
+
+        tzsource%cmnhname   = 'SEDI'
+        tzsource%clongname  = 'sedimentation'
+        tzsource%lavailable = ( nmom_g.ge.2 )
+        call Budget_source_add( tbudgets(ibudget), tzsource )
+
+        tzsource%cmnhname   = 'RIM'
+        tzsource%clongname  = 'heavy riming of cloud droplet on snow'
+        tzsource%lavailable = ( nmom_g.ge.2 )
+        call Budget_source_add( tbudgets(ibudget), tzsource )
+
+        tzsource%cmnhname   = 'ACC'
+        tzsource%clongname  = 'accretion of rain on snow'
+        tzsource%lavailable = ( nmom_g.ge.2 )
+        call Budget_source_add( tbudgets(ibudget), tzsource )
+
+        tzsource%cmnhname   = 'CMEL'
+        tzsource%clongname  = 'conversion melting of snow'
+        tzsource%lavailable = ( nmom_g.ge.2 )
+        call Budget_source_add( tbudgets(ibudget), tzsource )
+
+        tzsource%cmnhname   = 'CFRZ'
+        tzsource%clongname  = 'conversion freezing of raindrop'
+        tzsource%lavailable = ( nmom_g.ge.2 )
+        call Budget_source_add( tbudgets(ibudget), tzsource )
+
+        tzsource%cmnhname   = 'WETG'
+        tzsource%clongname  = 'wet growth of graupel'
+        tzsource%lavailable = ( nmom_g.ge.2 )
+        call Budget_source_add( tbudgets(ibudget), tzsource )
+
+        tzsource%cmnhname   = 'GMLT'
+        tzsource%clongname  = 'graupel melting'
+        tzsource%lavailable = ( nmom_g.ge.2 )
+        call Budget_source_add( tbudgets(ibudget), tzsource )
+
+        tzsource%cmnhname   = 'WETH'
+        tzsource%clongname  = 'wet growth of hail'
+        tzsource%lavailable = nmom_g.ge.2
+        call Budget_source_add( tbudgets(ibudget), tzsource )
+
+        tzsource%cmnhname   = 'COHG'
+        tzsource%clongname  = 'conversion hail graupel'
+        tzsource%lavailable = nmom_g.ge.2
+        call Budget_source_add( tbudgets(ibudget), tzsource )
+        
+        tzsource%cmnhname   = 'CEDS'
+        tzsource%clongname  = 'adjustment to saturation'
+        tzsource%lavailable = nmom_i.ge.1 .and. .not.lptsplit .and. .not.lspro_lima
+        call Budget_source_add( tbudgets(ibudget), tzsource )   
+
+      else if ( jsv == nsv_lima_nh .and. nmom_h.ge.1) then SV_LIMA
+
+        tzsource%cmnhname   = 'SEDI'
+        tzsource%clongname  = 'sedimentation'
+        tzsource%lavailable = ( nmom_h.ge.2 )
+        call Budget_source_add( tbudgets(ibudget), tzsource )
+
+        tzsource%cmnhname   = 'WETG'
+        tzsource%clongname  = 'wet growth of graupel'
+        tzsource%lavailable = nmom_h.ge.2
+        call Budget_source_add( tbudgets(ibudget), tzsource )
+
+        tzsource%cmnhname   = 'COHG'
+        tzsource%clongname  = 'conversion hail graupel'
+        tzsource%lavailable = nmom_h.ge.2
+        call Budget_source_add( tbudgets(ibudget), tzsource )
+
+        tzsource%cmnhname   = 'HMLT'
+        tzsource%clongname  = 'hail melting'
+        tzsource%lavailable = nmom_h.ge.2
+        call Budget_source_add( tbudgets(ibudget), tzsource )
+        
+      else if ( jsv >= nsv_lima_ifn_free .and. jsv <= nsv_lima_ifn_free + nmod_ifn - 1 ) then SV_LIMA
+        ! Free IFN concentration
+        tzsource%cmnhname   = 'HIND'
+        tzsource%clongname  = 'heterogeneous nucleation by deposition'
+        tzsource%lavailable = nmom_i.ge.1 .and. lnucl_lima .and. .not. lmeyers_lima
+        call Budget_source_add( tbudgets(ibudget), tzsource )
+
+        tzsource%cmnhname   = 'CEDS'
+        tzsource%clongname  = 'adjustment to saturation'
+        tzsource%lavailable = nmom_i.ge.1 .and. .not.lptsplit .and. .not.lspro_lima
+        call Budget_source_add( tbudgets(ibudget), tzsource )
+
+        tzsource%cmnhname   = 'SCAV'
+        tzsource%clongname  = 'scavenging'
+        tzsource%lavailable = lscav_lima
+        call Budget_source_add( tbudgets(ibudget), tzsource )
+
+
+      else if ( jsv >= nsv_lima_ifn_nucl .and. jsv <= nsv_lima_ifn_nucl + nmod_ifn - 1 ) then SV_LIMA
+        ! Nucleated IFN concentration
+        tzsource%cmnhname   = 'HIND'
+        tzsource%clongname  = 'heterogeneous nucleation by deposition'
+        tzsource%lavailable = nmom_i.ge.1 .and. lnucl_lima                                                     &
+                              .and. ( ( lmeyers_lima .and. jsv == nsv_lima_ifn_nucl ) .or. .not. lmeyers_lima )
+        call Budget_source_add( tbudgets(ibudget), tzsource )
+
+        tzsource%cmnhname   = 'HINC'
+        tzsource%clongname  = 'heterogeneous nucleation by contact'
+        tzsource%lavailable = nmom_i.ge.1 .and. lnucl_lima .and. lmeyers_lima .and. jsv == nsv_lima_ifn_nucl
+        call Budget_source_add( tbudgets(ibudget), tzsource )
+
+        tzsource%cmnhname   = 'IMLT'
+        tzsource%clongname  = 'melting of ice'
+        tzsource%lavailable = lptsplit .or. ( nmom_i.ge.1 .and. nmom_c.ge.1 )
+        call Budget_source_add( tbudgets(ibudget), tzsource )
+
+        tzsource%cmnhname   = 'CEDS'
+        tzsource%clongname  = 'adjustment to saturation'
+        tzsource%lavailable = nmom_i.ge.1 .and. .not.lptsplit .and. .not.lspro_lima
+        call Budget_source_add( tbudgets(ibudget), tzsource )
+
+
+      else if ( jsv >= nsv_lima_imm_nucl .and. jsv <= nsv_lima_imm_nucl + nmod_imm - 1 ) then SV_LIMA
+        ! Nucleated IMM concentration
+        tzsource%cmnhname   = 'HINC'
+        tzsource%clongname  = 'heterogeneous nucleation by contact'
+        tzsource%lavailable = nmom_i.ge.1 .and. lnucl_lima .and. .not. lmeyers_lima
+        call Budget_source_add( tbudgets(ibudget), tzsource )
+
+        tzsource%cmnhname   = 'CEDS'
+        tzsource%clongname  = 'adjustment to saturation'
+        tzsource%lavailable = nmom_i.ge.1 .and. .not.lptsplit .and. .not.lspro_lima
+        call Budget_source_add( tbudgets(ibudget), tzsource )
+
+
+      else if ( jsv == nsv_lima_hom_haze ) then SV_LIMA
+        ! Homogeneous freezing of CCN
+        tzsource%cmnhname   = 'HONH'
+        tzsource%clongname  = 'haze homogeneous nucleation'
+        tzsource%lavailable = nmom_i.ge.1 .and. lnucl_lima .and.                                             &
+                              ( ( lhhoni_lima .and. nmod_ccn >= 1 ) .or. ( .not.lptsplit .and. nmom_c.ge.1 ) )
+        call Budget_source_add( tbudgets(ibudget), tzsource )
+
+
+      else if ( jsv == nsv_lima_spro ) then SV_LIMA
+        ! Supersaturation
+        tzsource%cmnhname   = 'CEDS'
+        tzsource%clongname  = 'adjustment to saturation'
+        tzsource%lavailable = .true.
+        call Budget_source_add( tbudgets(ibudget), tzsource )
+
+      end if SV_LIMA
+
+
+    else if ( jsv >= nsv_elecbeg .and. jsv <= nsv_elecend ) then SV_VAR
+      ! Electricity case
+      tzsource%cmnhname   = 'NEGA'
+      tzsource%clongname  = 'negativity correction'
+      tzsource%lavailable = .true.
+      call Budget_source_add( tbudgets(ibudget), tzsource )
+
+      SV_ELEC: select case( jsv - nsv_elecbeg + 1 )
+        case ( 1 ) SV_ELEC
+          ! volumetric charge of water vapor
+          tzsource%cmnhname   = 'DRIFT'
+          tzsource%clongname  = 'ion drift motion'
+          tzsource%lavailable = .true.
+          call Budget_source_add( tbudgets(ibudget), tzsource )
+
+          tzsource%cmnhname   = 'CORAY'
+          tzsource%clongname  = 'cosmic ray source'
+          tzsource%lavailable = .true.
+          call Budget_source_add( tbudgets(ibudget), tzsource )
+
+          tzsource%cmnhname   = 'DEPS'
+          tzsource%clongname  = 'deposition on snow'
+          tzsource%lavailable = .true.
+          call Budget_source_add( tbudgets(ibudget), tzsource )
+
+          tzsource%cmnhname   = 'DEPG'
+          tzsource%clongname  = 'deposition on graupel'
+          tzsource%lavailable = .true.
+          call Budget_source_add( tbudgets(ibudget), tzsource )
+
+          tzsource%cmnhname   = 'REVA'
+          tzsource%clongname  = 'rain evaporation'
+          tzsource%lavailable = lwarm_ice
+          call Budget_source_add( tbudgets(ibudget), tzsource )
+
+          tzsource%cmnhname   = 'DEPI'
+          tzsource%clongname  = 'condensation/deposition on ice'
+          tzsource%lavailable = .true.
+          call Budget_source_add( tbudgets(ibudget), tzsource )
+
+          tzsource%cmnhname   = 'NEUT'
+          tzsource%clongname  = 'neutralization'
+          tzsource%lavailable = .true.
+          call Budget_source_add( tbudgets(ibudget), tzsource )
+
+
+        case ( 2 ) SV_ELEC
+          ! volumetric charge of cloud droplets
+          tzsource%cmnhname   = 'HON'
+          tzsource%clongname  = 'homogeneous nucleation'
+          tzsource%lavailable = .true.
+          call Budget_source_add( tbudgets(ibudget), tzsource )
+
+          tzsource%cmnhname   = 'AUTO'
+          tzsource%clongname  = 'autoconversion into rain'
+          tzsource%lavailable = lwarm_ice
+          call Budget_source_add( tbudgets(ibudget), tzsource )
+
+          tzsource%cmnhname   = 'ACCR'
+          tzsource%clongname  = 'accretion of cloud droplets'
+          tzsource%lavailable = lwarm_ice
+          call Budget_source_add( tbudgets(ibudget), tzsource )
+
+          tzsource%cmnhname   = 'RIM'
+          tzsource%clongname  = 'riming of cloud water'
+          tzsource%lavailable = .true.
+          call Budget_source_add( tbudgets(ibudget), tzsource )
+
+          tzsource%cmnhname   = 'WETG'
+          tzsource%clongname  = 'wet growth of graupel'
+          tzsource%lavailable = .true.
+          call Budget_source_add( tbudgets(ibudget), tzsource )
+
+          tzsource%cmnhname   = 'DRYG'
+          tzsource%clongname  = 'dry growth of graupel'
+          tzsource%lavailable = .true.
+          call Budget_source_add( tbudgets(ibudget), tzsource )
+
+          tzsource%cmnhname   = 'INCG'
+          tzsource%clongname  = 'inductive charge transfer between cloud droplets and graupel'
+          tzsource%lavailable = linductive
+          call Budget_source_add( tbudgets(ibudget), tzsource )
+
+          tzsource%cmnhname   = 'WETH'
+          tzsource%clongname  = 'wet growth of hail'
+          tzsource%lavailable = hcloud == 'ICE4'
+          call Budget_source_add( tbudgets(ibudget), tzsource )
+
+          tzsource%cmnhname   = 'IMLT'
+          tzsource%clongname  = 'melting of ice'
+          tzsource%lavailable = .true.
+          call Budget_source_add( tbudgets(ibudget), tzsource )
+
+          tzsource%cmnhname   = 'BERFI'
+          tzsource%clongname  = 'Bergeron-Findeisen'
+          tzsource%lavailable = .true.
+          call Budget_source_add( tbudgets(ibudget), tzsource )
+
+          tzsource%cmnhname   = 'SEDI'
+          tzsource%clongname  = 'sedimentation'
+          tzsource%lavailable = lsedic_ice
+          call Budget_source_add( tbudgets(ibudget), tzsource )
+
+          tzsource%cmnhname   = 'DEPI'
+          tzsource%clongname  = 'condensation/deposition on ice'
+          tzsource%lavailable = .true.
+          call Budget_source_add( tbudgets(ibudget), tzsource )
+
+          tzsource%cmnhname   = 'NEUT'
+          tzsource%clongname  = 'neutralization'
+          tzsource%lavailable = .true.
+          call Budget_source_add( tbudgets(ibudget), tzsource )
+
+
+        case ( 3 ) SV_ELEC
+          ! volumetric charge of rain drops
+          tzsource%cmnhname   = 'SFR'
+          tzsource%clongname  = 'spontaneous freezing'
+          tzsource%lavailable = .true.
+          call Budget_source_add( tbudgets(ibudget), tzsource )
+
+          tzsource%cmnhname   = 'AUTO'
+          tzsource%clongname  = 'autoconversion into rain'
+          tzsource%lavailable = lwarm_ice
+          call Budget_source_add( tbudgets(ibudget), tzsource )
+
+          tzsource%cmnhname   = 'ACCR'
+          tzsource%clongname  = 'accretion of cloud droplets'
+          tzsource%lavailable = lwarm_ice
+          call Budget_source_add( tbudgets(ibudget), tzsource )
+
+          tzsource%cmnhname   = 'REVA'
+          tzsource%clongname  = 'rain evaporation'
+          tzsource%lavailable = lwarm_ice
+          call Budget_source_add( tbudgets(ibudget), tzsource )
+
+          tzsource%cmnhname   = 'ACC'
+          tzsource%clongname  = 'accretion of rain  on aggregates'
+          tzsource%lavailable = .true.
+          call Budget_source_add( tbudgets(ibudget), tzsource )
+
+          tzsource%cmnhname   = 'CFRZ'
+          tzsource%clongname  = 'conversion freezing of rain'
+          tzsource%lavailable = .true.
+          call Budget_source_add( tbudgets(ibudget), tzsource )
+
+          tzsource%cmnhname   = 'WETG'
+          tzsource%clongname  = 'wet growth of graupel'
+          tzsource%lavailable = .true.
+          call Budget_source_add( tbudgets(ibudget), tzsource )
+
+          tzsource%cmnhname   = 'DRYG'
+          tzsource%clongname  = 'dry growth of graupel'
+          tzsource%lavailable = .true.
+          call Budget_source_add( tbudgets(ibudget), tzsource )
+
+          tzsource%cmnhname   = 'GMLT'
+          tzsource%clongname  = 'graupel melting'
+          tzsource%lavailable = .true.
+          call Budget_source_add( tbudgets(ibudget), tzsource )
+
+          tzsource%cmnhname   = 'WETH'
+          tzsource%clongname  = 'wet growth of hail'
+          tzsource%lavailable = hcloud == 'ICE4'
+          call Budget_source_add( tbudgets(ibudget), tzsource )
+
+          tzsource%cmnhname   = 'HMLT'
+          tzsource%clongname  = 'melting of hail'
+          tzsource%lavailable = hcloud == 'ICE4'
+          call Budget_source_add( tbudgets(ibudget), tzsource )
+
+          tzsource%cmnhname   = 'SEDI'
+          tzsource%clongname  = 'sedimentation'
+          tzsource%lavailable = .true.
+          call Budget_source_add( tbudgets(ibudget), tzsource )
+
+          tzsource%cmnhname   = 'NEUT'
+          tzsource%clongname  = 'neutralization'
+          tzsource%lavailable = .true.
+          call Budget_source_add( tbudgets(ibudget), tzsource )
+
+        case ( 4 ) SV_ELEC
+          ! volumetric charge of ice crystals
+          tzsource%cmnhname   = 'HON'
+          tzsource%clongname  = 'homogeneous nucleation'
+          tzsource%lavailable = .true.
+          call Budget_source_add( tbudgets(ibudget), tzsource )
+
+          tzsource%cmnhname   = 'AGGS'
+          tzsource%clongname  = 'aggregation of snow'
+          tzsource%lavailable = .true.
+          call Budget_source_add( tbudgets(ibudget), tzsource )
+
+          tzsource%cmnhname   = 'AUTS'
+          tzsource%clongname  = 'autoconversion of ice'
+          tzsource%lavailable = .true.
+          call Budget_source_add( tbudgets(ibudget), tzsource )
+
+          tzsource%cmnhname   = 'CFRZ'
+          tzsource%clongname  = 'conversion freezing of rain'
+          tzsource%lavailable = .true.
+          call Budget_source_add( tbudgets(ibudget), tzsource )
+
+          tzsource%cmnhname   = 'WETG'
+          tzsource%clongname  = 'wet growth of graupel'
+          tzsource%lavailable = .true.
+          call Budget_source_add( tbudgets(ibudget), tzsource )
+
+          tzsource%cmnhname   = 'DRYG'
+          tzsource%clongname  = 'dry growth of graupel'
+          tzsource%lavailable = .true.
+          call Budget_source_add( tbudgets(ibudget), tzsource )
+
+          tzsource%cmnhname   = 'WETH'
+          tzsource%clongname  = 'wet growth of hail'
+          tzsource%lavailable = hcloud == 'ICE4'
+          call Budget_source_add( tbudgets(ibudget), tzsource )
+
+          tzsource%cmnhname   = 'IMLT'
+          tzsource%clongname  = 'melting of ice'
+          tzsource%lavailable = .true.
+          call Budget_source_add( tbudgets(ibudget), tzsource )
+
+          tzsource%cmnhname   = 'BERFI'
+          tzsource%clongname  = 'Bergeron-Findeisen'
+          tzsource%lavailable = .true.
+          call Budget_source_add( tbudgets(ibudget), tzsource )
+
+          tzsource%cmnhname   = 'NIIS'
+          tzsource%clongname  = 'non-inductive charge separation due to ice-snow collisions'
+          tzsource%lavailable = .true.
+          call Budget_source_add( tbudgets(ibudget), tzsource )
+
+          tzsource%cmnhname   = 'SEDI'
+          tzsource%clongname  = 'sedimentation'
+          tzsource%lavailable = .true.
+          call Budget_source_add( tbudgets(ibudget), tzsource )
+
+          tzsource%cmnhname   = 'DEPI'
+          tzsource%clongname  = 'condensation/deposition on ice'
+          tzsource%lavailable = .true.
+          call Budget_source_add( tbudgets(ibudget), tzsource )
+
+          tzsource%cmnhname   = 'NEUT'
+          tzsource%clongname  = 'neutralization'
+          tzsource%lavailable = .true.
+          call Budget_source_add( tbudgets(ibudget), tzsource )
+
+
+        case ( 5 ) SV_ELEC
+          ! volumetric charge of snow
+          tzsource%cmnhname   = 'DEPS'
+          tzsource%clongname  = 'deposition on snow'
+          tzsource%lavailable = .true.
+          call Budget_source_add( tbudgets(ibudget), tzsource )
+
+          tzsource%cmnhname   = 'AGGS'
+          tzsource%clongname  = 'aggregation of snow'
+          tzsource%lavailable = .true.
+          call Budget_source_add( tbudgets(ibudget), tzsource )
+
+          tzsource%cmnhname   = 'AUTS'
+          tzsource%clongname  = 'autoconversion of ice'
+          tzsource%lavailable = .true.
+          call Budget_source_add( tbudgets(ibudget), tzsource )
+
+          tzsource%cmnhname   = 'RIM'
+          tzsource%clongname  = 'riming of cloud water'
+          tzsource%lavailable = .true.
+          call Budget_source_add( tbudgets(ibudget), tzsource )
+
+          tzsource%cmnhname   = 'ACC'
+          tzsource%clongname  = 'accretion of rain on snow'
+          tzsource%lavailable = .true.
+          call Budget_source_add( tbudgets(ibudget), tzsource )
+
+          tzsource%cmnhname   = 'CMEL'
+          tzsource%clongname  = 'conversion melting'
+          tzsource%lavailable = .true.
+          call Budget_source_add( tbudgets(ibudget), tzsource )
+
+          tzsource%cmnhname   = 'WETG'
+          tzsource%clongname  = 'wet growth of graupel'
+          tzsource%lavailable = .true.
+          call Budget_source_add( tbudgets(ibudget), tzsource )
+
+          tzsource%cmnhname   = 'DRYG'
+          tzsource%clongname  = 'dry growth of graupel'
+          tzsource%lavailable = .true.
+          call Budget_source_add( tbudgets(ibudget), tzsource )
+
+          tzsource%cmnhname   = 'NIIS'
+          tzsource%clongname  = 'non-inductive charge separation due to ice-snow collisions'
+          tzsource%lavailable = .true.
+          call Budget_source_add( tbudgets(ibudget), tzsource )
+
+          tzsource%cmnhname   = 'WETH'
+          tzsource%clongname  = 'wet growth of hail'
+          tzsource%lavailable = hcloud == 'ICE4'
+          call Budget_source_add( tbudgets(ibudget), tzsource )
+
+          tzsource%cmnhname   = 'SEDI'
+          tzsource%clongname  = 'sedimentation'
+          tzsource%lavailable = .true.
+          call Budget_source_add( tbudgets(ibudget), tzsource )
+
+          tzsource%cmnhname   = 'NEUT'
+          tzsource%clongname  = 'neutralization'
+          tzsource%lavailable = .true.
+          call Budget_source_add( tbudgets(ibudget), tzsource )
+
+
+        case ( 6 ) SV_ELEC
+          ! volumetric charge of graupel
+          tzsource%cmnhname   = 'SFR'
+          tzsource%clongname  = 'spontaneous freezing'
+          tzsource%lavailable = .true.
+          call Budget_source_add( tbudgets(ibudget), tzsource )
+
+          tzsource%cmnhname   = 'DEPG'
+          tzsource%clongname  = 'deposition on graupel'
+          tzsource%lavailable = .true.
+          call Budget_source_add( tbudgets(ibudget), tzsource )
+
+          tzsource%cmnhname   = 'RIM'
+          tzsource%clongname  = 'riming of cloud water'
+          tzsource%lavailable = .true.
+          call Budget_source_add( tbudgets(ibudget), tzsource )
+
+          tzsource%cmnhname   = 'ACC'
+          tzsource%clongname  = 'accretion of rain  on graupel'
+          tzsource%lavailable = .true.
+          call Budget_source_add( tbudgets(ibudget), tzsource )
+
+          tzsource%cmnhname   = 'CMEL'
+          tzsource%clongname  = 'conversion melting'
+          tzsource%lavailable = .true.
+          call Budget_source_add( tbudgets(ibudget), tzsource )
+
+          tzsource%cmnhname   = 'CFRZ'
+          tzsource%clongname  = 'conversion freezing of rain'
+          tzsource%lavailable = .true.
+          call Budget_source_add( tbudgets(ibudget), tzsource )
+
+          tzsource%cmnhname   = 'WETG'
+          tzsource%clongname  = 'wet growth of graupel'
+          tzsource%lavailable = .true.
+          call Budget_source_add( tbudgets(ibudget), tzsource )
+
+          tzsource%cmnhname   = 'DRYG'
+          tzsource%clongname  = 'dry growth of graupel'
+          tzsource%lavailable = .true.
+          call Budget_source_add( tbudgets(ibudget), tzsource )
+
+          tzsource%cmnhname   = 'INCG'
+          tzsource%clongname  = 'inductive charge transfer between cloud droplets and graupel'
+          tzsource%lavailable = linductive
+          call Budget_source_add( tbudgets(ibudget), tzsource )
+
+          tzsource%cmnhname   = 'GMLT'
+          tzsource%clongname  = 'graupel melting'
+          tzsource%lavailable = .true.
+          call Budget_source_add( tbudgets(ibudget), tzsource )
+
+          tzsource%cmnhname   = 'WETH'
+          tzsource%clongname  = 'wet growth of hail'
+          tzsource%lavailable = hcloud == 'ICE4'
+          call Budget_source_add( tbudgets(ibudget), tzsource )
+
+          tzsource%cmnhname   = 'SEDI'
+          tzsource%clongname  = 'sedimentation'
+          tzsource%lavailable = .true.
+          call Budget_source_add( tbudgets(ibudget), tzsource )
+
+          tzsource%cmnhname   = 'NEUT'
+          tzsource%clongname  = 'neutralization'
+          tzsource%lavailable = .true.
+          call Budget_source_add( tbudgets(ibudget), tzsource )
+
+
+        case ( 7: ) SV_ELEC
+          if ( ( hcloud == 'ICE4' .and. ( jsv - nsv_elecbeg + 1 ) == 7 ) ) then
+            ! volumetric charge of hail
+            tzsource%cmnhname   = 'WETG'
+            tzsource%clongname  = 'wet growth of graupel'
+            tzsource%lavailable = .true.
+            call Budget_source_add( tbudgets(ibudget), tzsource )
+
+            tzsource%cmnhname   = 'WETH'
+            tzsource%clongname  = 'wet growth of hail'
+            tzsource%lavailable = .true.
+            call Budget_source_add( tbudgets(ibudget), tzsource )
+
+            tzsource%cmnhname   = 'HMLT'
+            tzsource%clongname  = 'melting of hail'
+            tzsource%lavailable = .true.
+            call Budget_source_add( tbudgets(ibudget), tzsource )
+
+            tzsource%cmnhname   = 'SEDI'
+            tzsource%clongname  = 'sedimentation'
+            tzsource%lavailable = .true.
+            call Budget_source_add( tbudgets(ibudget), tzsource )
+
+            tzsource%cmnhname   = 'NEUT'
+            tzsource%clongname  = 'neutralization'
+            tzsource%lavailable = .true.
+            call Budget_source_add( tbudgets(ibudget), tzsource )
+
+          else if (      ( hcloud == 'ICE3' .and. ( jsv - nsv_elecbeg + 1 ) == 7 ) &
+                    .or. ( hcloud == 'ICE4' .and. ( jsv - nsv_elecbeg + 1 ) == 8 ) ) then
+            ! Negative ions (NSV_ELECEND case)
+            tzsource%cmnhname   = 'DRIFT'
+            tzsource%clongname  = 'ion drift motion'
+            tzsource%lavailable = .true.
+            call Budget_source_add( tbudgets(ibudget), tzsource )
+
+            tzsource%cmnhname   = 'CORAY'
+            tzsource%clongname  = 'cosmic ray source'
+            tzsource%lavailable = .true.
+            call Budget_source_add( tbudgets(ibudget), tzsource )
+
+            tzsource%cmnhname   = 'DEPS'
+            tzsource%clongname  = 'deposition on snow'
+            tzsource%lavailable = .true.
+            call Budget_source_add( tbudgets(ibudget), tzsource )
+
+            tzsource%cmnhname   = 'DEPG'
+            tzsource%clongname  = 'deposition on graupel'
+            tzsource%lavailable = .true.
+            call Budget_source_add( tbudgets(ibudget), tzsource )
+
+            tzsource%cmnhname   = 'REVA'
+            tzsource%clongname  = 'rain evaporation'
+            tzsource%lavailable = lwarm_ice
+            call Budget_source_add( tbudgets(ibudget), tzsource )
+
+            tzsource%cmnhname   = 'DEPI'
+            tzsource%clongname  = 'condensation/deposition on ice'
+            tzsource%lavailable = .true.
+            call Budget_source_add( tbudgets(ibudget), tzsource )
+
+            tzsource%cmnhname   = 'NEUT'
+            tzsource%clongname  = 'neutralization'
+            tzsource%lavailable = .true.
+            call Budget_source_add( tbudgets(ibudget), tzsource )
+
+          else
+            call Print_msg( NVERB_FATAL, 'BUD', 'Ini_budget', 'unknown electricity budget' )
+          end if
+
+      end select SV_ELEC
+
+
+    else if ( jsv >= nsv_lgbeg .and. jsv <= nsv_lgend ) then SV_VAR
+      !Lagrangian variables
+
+
+    else if ( jsv >= nsv_ppbeg .and. jsv <= nsv_ppend ) then SV_VAR
+      !Passive pollutants
+
+
+#ifdef MNH_FOREFIRE
+    else if ( jsv >= nsv_ffbeg .and. jsv <= nsv_ffend ) then SV_VAR
+      !Forefire
+
+#endif
+    else if ( jsv >= nsv_csbeg .and. jsv <= nsv_csend ) then SV_VAR
+      !Conditional sampling
+
+
+    else if ( jsv >= nsv_chembeg .and. jsv <= nsv_chemend ) then SV_VAR
+      !Chemical case
+      tzsource%cmnhname   = 'CHEM'
+      tzsource%clongname  = 'chemistry activity'
+      tzsource%lavailable = .true.
+      call Budget_source_add( tbudgets(ibudget), tzsource )
+
+      tzsource%cmnhname   = 'NEGA'
+      tzsource%clongname  = 'negativity correction'
+      tzsource%lavailable = .true.
+      call Budget_source_add( tbudgets(ibudget), tzsource )
+
+
+    else if ( jsv >= nsv_chicbeg .and. jsv <= nsv_chicend ) then SV_VAR
+      !Ice phase chemistry
+
+
+    else if ( jsv >= nsv_aerbeg .and. jsv <= nsv_aerend ) then SV_VAR
+      !Chemical aerosol case
+      tzsource%cmnhname   = 'NEGA'
+      tzsource%clongname  = 'negativity correction'
+      tzsource%lavailable = lorilam
+      call Budget_source_add( tbudgets(ibudget), tzsource )
+
+    else if ( jsv >= nsv_aerdepbeg .and. jsv <= nsv_aerdepend ) then SV_VAR
+      !Aerosol wet deposition
+
+    else if ( jsv >= nsv_dstbeg .and. jsv <= nsv_dstend ) then SV_VAR
+      !Dust
+
+    else if ( jsv >= nsv_dstdepbeg .and. jsv <= nsv_dstdepend ) then SV_VAR
+      !Dust wet deposition
+
+    else if ( jsv >= nsv_sltbeg .and. jsv <= nsv_sltend ) then SV_VAR
+      !Salt
+
+    else if ( jsv >= nsv_sltdepbeg .and. jsv <= nsv_sltdepend ) then SV_VAR
+      !Salt wet deposition
+
+    else if ( jsv >= nsv_snwbeg .and. jsv <= nsv_snwend ) then SV_VAR
+      !Snow
+      tzsource%cmnhname   = 'SNSUB'
+      tzsource%clongname  = 'blowing snow sublimation'
+      tzsource%lavailable = lblowsnow .and. lsnowsubl
+      call Budget_source_add( tbudgets(ibudget), tzsource )
+
+      tzsource%cmnhname   = 'SNSED'
+      tzsource%clongname  = 'blowing snow sedimentation'
+      tzsource%lavailable = lblowsnow
+      call Budget_source_add( tbudgets(ibudget), tzsource )
+
+
+    else if ( jsv >= nsv_lnoxbeg .and. jsv <= nsv_lnoxend ) then SV_VAR
+      !LiNOX passive tracer
+
+    else SV_VAR
+      call Print_msg( NVERB_FATAL, 'BUD', 'Ini_budget', 'unknown scalar variable' )
+    end if SV_VAR
+
+
+    call Sourcelist_sort_compact( tbudgets(ibudget) )
+
+    call Sourcelist_scan( tbudgets(ibudget), cbulist_rsv )
+  end if
+end do SV_BUDGETS
+
+call Ini_budget_groups( tbudgets, ibudim1, ibudim2, ibudim3 )
+
+if ( tbudgets(NBUDGET_U)  %lenabled ) call Sourcelist_nml_compact( tbudgets(NBUDGET_U),   cbulist_ru   )
+if ( tbudgets(NBUDGET_V)  %lenabled ) call Sourcelist_nml_compact( tbudgets(NBUDGET_V),   cbulist_rv   )
+if ( tbudgets(NBUDGET_W)  %lenabled ) call Sourcelist_nml_compact( tbudgets(NBUDGET_W),   cbulist_rw   )
+if ( tbudgets(NBUDGET_TH) %lenabled ) call Sourcelist_nml_compact( tbudgets(NBUDGET_TH),  cbulist_rth  )
+if ( tbudgets(NBUDGET_TKE)%lenabled ) call Sourcelist_nml_compact( tbudgets(NBUDGET_TKE), cbulist_rtke )
+if ( tbudgets(NBUDGET_RV) %lenabled ) call Sourcelist_nml_compact( tbudgets(NBUDGET_RV),  cbulist_rrv  )
+if ( tbudgets(NBUDGET_RC) %lenabled ) call Sourcelist_nml_compact( tbudgets(NBUDGET_RC),  cbulist_rrc  )
+if ( tbudgets(NBUDGET_RR) %lenabled ) call Sourcelist_nml_compact( tbudgets(NBUDGET_RR),  cbulist_rrr  )
+if ( tbudgets(NBUDGET_RI) %lenabled ) call Sourcelist_nml_compact( tbudgets(NBUDGET_RI),  cbulist_rri  )
+if ( tbudgets(NBUDGET_RS) %lenabled ) call Sourcelist_nml_compact( tbudgets(NBUDGET_RS),  cbulist_rrs  )
+if ( tbudgets(NBUDGET_RG) %lenabled ) call Sourcelist_nml_compact( tbudgets(NBUDGET_RG),  cbulist_rrg  )
+if ( tbudgets(NBUDGET_RH) %lenabled ) call Sourcelist_nml_compact( tbudgets(NBUDGET_RH),  cbulist_rrh  )
+if ( lbu_rsv )                        call Sourcelist_sv_nml_compact( cbulist_rsv  )
+end subroutine Ini_budget
+
+
+subroutine Budget_source_add( tpbudget, tpsource, odonotinit, ooverwrite )
+  use modd_budget, only: tbudgetdata, tbusourcedata
+
+  type(tbudgetdata),   intent(inout) :: tpbudget
+  type(tbusourcedata), intent(in)    :: tpsource ! Metadata basis
+  logical, optional,   intent(in)    :: odonotinit
+  logical, optional,   intent(in)    :: ooverwrite
+
+  character(len=4) :: ynum
+  integer          :: isourcenumber
+
+  call Print_msg( NVERB_DEBUG, 'BUD', 'Budget_source_add', 'called for ' // Trim( tpbudget%cname ) &
+                  // ': ' // Trim( tpsource%cmnhname ) )
+
+  isourcenumber = tpbudget%nsources + 1
+  if ( isourcenumber > tpbudget%nsourcesmax ) then
+    Write( ynum, '( i4 )' ) tpbudget%nsourcesmax
+    cmnhmsg(1) = 'Insufficient max number of source terms (' // Trim(ynum) // ') for budget ' // Trim( tpbudget%cname )
+    cmnhmsg(2) = 'Please increaze value of parameter NSOURCESMAX'
+    call Print_msg( NVERB_FATAL, 'BUD', 'Budget_source_add' )
+  else
+    tpbudget%nsources = tpbudget%nsources + 1
+  end if
+
+  ! Copy metadata from provided tpsource
+  ! Modifications to source term metadata done with the other dummy arguments
+  tpbudget%tsources(isourcenumber) = tpsource
+
+  if ( present( odonotinit ) ) tpbudget%tsources(isourcenumber)%ldonotinit = odonotinit
+
+  if ( present( ooverwrite ) ) tpbudget%tsources(isourcenumber)%loverwrite = ooverwrite
+end subroutine Budget_source_add
+
+
+subroutine Ini_budget_groups( tpbudgets, kbudim1, kbudim2, kbudim3 )
+  use modd_budget,     only: tbudgetdata
+  use modd_field,      only: TYPEINT, TYPEREAL
+  use modd_parameters, only: NMNHNAMELGTMAX, NSTDNAMELGTMAX, NLONGNAMELGTMAX, NUNITLGTMAX, NCOMMENTLGTMAX
+
+  use mode_tools,  only: Quicksort
+
+  type(tbudgetdata), dimension(:), intent(inout) :: tpbudgets
+  integer,                         intent(in)    :: kbudim1
+  integer,                         intent(in)    :: kbudim2
+  integer,                         intent(in)    :: kbudim3
+
+  character(len=NMNHNAMELGTMAX)      :: ymnhname
+  character(len=NSTDNAMELGTMAX)      :: ystdname
+  character(len=NLONGNAMELGTMAX)     :: ylongname
+  character(len=NUNITLGTMAX)         :: yunits
+  character(len=NCOMMENTLGTMAX)      :: ycomment
+  integer                            :: ji, jj, jk
+  integer                            :: isources ! Number of source terms in a budget
+  integer                            :: inbgroups ! Number of budget groups
+  integer                            :: ival
+  integer                            :: icount
+  integer                            :: ivalmax, ivalmin
+  integer                            :: igrid
+  integer                            :: itype
+  integer                            :: idims
+  integer, dimension(:), allocatable :: igroups ! Temporary array to store sorted group numbers
+  integer, dimension(:), allocatable :: ipos    ! Temporary array to store initial position of group numbers
+  real                               :: zval
+  real                               :: zvalmax, zvalmin
+
+  call Print_msg( NVERB_DEBUG, 'BUD', 'Ini_budget_groups', 'called' )
+
+  BUDGETS: do ji = 1, size( tpbudgets )
+    ENABLED: if ( tpbudgets(ji)%lenabled ) then
+      isources = size( tpbudgets(ji)%tsources )
+      do jj = 1, isources
+        ! Check if ngroup is an allowed value
+        if ( tpbudgets(ji)%tsources(jj)%ngroup < 0 ) then
+          call Print_msg( NVERB_ERROR, 'BUD', 'Ini_budget', 'negative group value is not allowed' )
+          tpbudgets(ji)%tsources(jj)%ngroup = 0
+        end if
+
+        if ( tpbudgets(ji)%tsources(jj)%ngroup > 0 ) tpbudgets(ji)%tsources(jj)%lenabled = .true.
+      end do
+
+      !Count the number of groups of source terms
+      !ngroup=1 is for individual entries, >1 values are groups
+      allocate( igroups(isources ) )
+      allocate( ipos   (isources ) )
+      igroups(:) = tpbudgets(ji)%tsources(:)%ngroup
+      ipos(:) = [ ( jj, jj = 1, isources ) ]
+
+      !Sort the group list number
+      call Quicksort( igroups, 1, isources, ipos )
+
+      !Count the number of different groups
+      !and renumber the entries (from 1 to inbgroups)
+      inbgroups = 0
+      ival = igroups(1)
+      if ( igroups(1) /= 0 ) then
+        inbgroups = 1
+        igroups(1) = inbgroups
+      end if
+      do jj = 2, isources
+        if ( igroups(jj) == 1 ) then
+          inbgroups = inbgroups + 1
+          igroups(jj) = inbgroups
+        else if ( igroups(jj) > 0 ) then
+          if ( igroups(jj) /= ival ) then
+            ival = igroups(jj)
+            inbgroups = inbgroups + 1
+          end if
+          igroups(jj) = inbgroups
+        end if
+      end do
+
+      !Write the igroups values to the budget structure
+      do jj = 1, isources
+        tpbudgets(ji)%tsources(ipos(jj))%ngroup = igroups(jj)
+      end do
+
+      !Allocate the group structure + populate it
+      tpbudgets(ji)%ngroups = inbgroups
+      allocate( tpbudgets(ji)%tgroups(inbgroups) )
+
+      do jj = 1, inbgroups
+        !Search the list of sources for each group
+        !not the most efficient algorithm but do the job
+        icount = 0
+        do jk = 1, isources
+          if ( tpbudgets(ji)%tsources(jk)%ngroup == jj ) then
+            icount = icount + 1
+            ipos(icount) = jk !ipos is reused as a temporary work array
+          end if
+        end do
+        tpbudgets(ji)%tgroups(jj)%nsources = icount
+
+        allocate( tpbudgets(ji)%tgroups(jj)%nsourcelist(icount) )
+        tpbudgets(ji)%tgroups(jj)%nsourcelist(:) = ipos(1 : icount)
+
+        ! Set the name of the field
+        ymnhname = tpbudgets(ji)%tsources(ipos(1))%cmnhname
+        do jk = 2, tpbudgets(ji)%tgroups(jj)%nsources
+          ymnhname = trim( ymnhname ) // '_' // trim( tpbudgets(ji)%tsources(ipos(jk))%cmnhname )
+        end do
+        tpbudgets(ji)%tgroups(jj)%cmnhname = ymnhname
+
+        ! Set the standard name (CF convention)
+        if ( tpbudgets(ji)%tgroups(jj)%nsources == 1 ) then
+          ystdname = tpbudgets(ji)%tsources(ipos(1))%cstdname
+        else
+          ! The CF standard name is probably wrong if combining several source terms => set to ''
+          ystdname = ''
+        end if
+        tpbudgets(ji)%tgroups(jj)%cstdname = ystdname
+
+        ! Set the long name (CF convention)
+        ylongname = tpbudgets(ji)%tsources(ipos(1))%clongname
+        do jk = 2, tpbudgets(ji)%tgroups(jj)%nsources
+          ylongname = trim( ylongname ) // ' + ' // tpbudgets(ji)%tsources(ipos(jk))%clongname
+        end do
+        tpbudgets(ji)%tgroups(jj)%clongname = ylongname
+
+        ! Set the units
+        yunits = tpbudgets(ji)%tsources(ipos(1))%cunits
+        do jk = 2, tpbudgets(ji)%tgroups(jj)%nsources
+          if ( trim( yunits ) /= trim( tpbudgets(ji)%tsources(ipos(jk))%cunits ) ) then
+            call Print_msg( NVERB_WARNING, 'BUD', 'Ini_budget',                               &
+                            'incompatible units for the different source terms of the group ' &
+                            //trim( tpbudgets(ji)%tgroups(jj)%cmnhname ) )
+            yunits = 'unknown'
+          end if
+        end do
+        tpbudgets(ji)%tgroups(jj)%cunits = yunits
+
+        ! Set the comment
+        ! It is composed of the source comment followed by the clongnames of the different sources
+        ycomment = trim( tpbudgets(ji)%tsources(ipos(1))%ccomment ) // ': '// trim( tpbudgets(ji)%tsources(ipos(1))%clongname )
+        do jk = 2, tpbudgets(ji)%tgroups(jj)%nsources
+          ycomment = trim( ycomment ) // ', ' // trim( tpbudgets(ji)%tsources(ipos(jk))%clongname )
+        end do
+        ycomment = trim( ycomment ) // ' source term'
+        if ( tpbudgets(ji)%tgroups(jj)%nsources > 1 ) ycomment = trim( ycomment ) // 's'
+        tpbudgets(ji)%tgroups(jj)%ccomment = ycomment
+
+        ! Set the Arakawa grid
+        igrid = tpbudgets(ji)%tsources(ipos(1))%ngrid
+        do jk = 2, tpbudgets(ji)%tgroups(jj)%nsources
+          if ( igrid /= tpbudgets(ji)%tsources(ipos(jk))%ngrid ) then
+            call Print_msg( NVERB_WARNING, 'BUD', 'Ini_budget',                                             &
+                            'different Arakawa grid positions for the different source terms of the group ' &
+                            //trim( tpbudgets(ji)%tgroups(jj)%cmnhname ) )
+          end if
+        end do
+        tpbudgets(ji)%tgroups(jj)%ngrid = igrid
+
+        ! Set the data type
+        itype = tpbudgets(ji)%tsources(ipos(1))%ntype
+        do jk = 2, tpbudgets(ji)%tgroups(jj)%nsources
+          if ( itype /= tpbudgets(ji)%tsources(ipos(jk))%ntype ) then
+            call Print_msg( NVERB_FATAL, 'BUD', 'Ini_budget',                                             &
+                            'incompatible data types for the different source terms of the group ' &
+                            //trim( tpbudgets(ji)%tgroups(jj)%cmnhname ) )
+          end if
+        end do
+        tpbudgets(ji)%tgroups(jj)%ntype = itype
+
+        ! Set the number of dimensions
+        idims = tpbudgets(ji)%tsources(ipos(1))%ndims
+        do jk = 2, tpbudgets(ji)%tgroups(jj)%nsources
+          if ( idims /= tpbudgets(ji)%tsources(ipos(jk))%ndims ) then
+            call Print_msg( NVERB_FATAL, 'BUD', 'Ini_budget',                                             &
+                            'incompatible number of dimensions for the different source terms of the group ' &
+                            //trim( tpbudgets(ji)%tgroups(jj)%cmnhname ) )
+          end if
+        end do
+        tpbudgets(ji)%tgroups(jj)%ndims = idims
+
+        ! Set the fill values
+        if ( tpbudgets(ji)%tgroups(jj)%ntype == TYPEINT ) then
+          ival = tpbudgets(ji)%tsources(ipos(1))%nfillvalue
+          do jk = 2, tpbudgets(ji)%tgroups(jj)%nsources
+            if ( ival /= tpbudgets(ji)%tsources(ipos(jk))%nfillvalue ) then
+              call Print_msg( NVERB_WARNING, 'BUD', 'Ini_budget',                                             &
+                              'different (integer) fill values for the different source terms of the group ' &
+                              //trim( tpbudgets(ji)%tgroups(jj)%cmnhname ) )
+            end if
+          end do
+          tpbudgets(ji)%tgroups(jj)%nfillvalue = ival
+        end if
+
+        if ( tpbudgets(ji)%tgroups(jj)%ntype == TYPEREAL ) then
+          zval = tpbudgets(ji)%tsources(ipos(1))%xfillvalue
+          do jk = 2, tpbudgets(ji)%tgroups(jj)%nsources
+            if ( zval /= tpbudgets(ji)%tsources(ipos(jk))%xfillvalue ) then
+              call Print_msg( NVERB_WARNING, 'BUD', 'Ini_budget',                                             &
+                              'different (real) fill values for the different source terms of the group ' &
+                              //trim( tpbudgets(ji)%tgroups(jj)%cmnhname ) )
+            end if
+          end do
+          tpbudgets(ji)%tgroups(jj)%xfillvalue = zval
+        end if
+
+        ! Set the valid min/max values
+        ! Take the min or max of all the sources
+        ! Maybe, it would be better to take the sum? (if same sign, if not already the maximum allowed value for this type)
+        if ( tpbudgets(ji)%tgroups(jj)%ntype == TYPEINT ) then
+          ivalmin = tpbudgets(ji)%tsources(ipos(1))%nvalidmin
+          ivalmax = tpbudgets(ji)%tsources(ipos(1))%nvalidmax
+          do jk = 2, tpbudgets(ji)%tgroups(jj)%nsources
+            ivalmin = min( ivalmin, tpbudgets(ji)%tsources(ipos(jk))%nvalidmin )
+            ivalmax = max( ivalmax, tpbudgets(ji)%tsources(ipos(jk))%nvalidmax )
+          end do
+          tpbudgets(ji)%tgroups(jj)%nvalidmin = ivalmin
+          tpbudgets(ji)%tgroups(jj)%nvalidmax = ivalmax
+        end if
+
+        if ( tpbudgets(ji)%tgroups(jj)%ntype == TYPEREAL ) then
+          zvalmin = tpbudgets(ji)%tsources(ipos(1))%xvalidmin
+          zvalmax = tpbudgets(ji)%tsources(ipos(1))%xvalidmax
+          do jk = 2, tpbudgets(ji)%tgroups(jj)%nsources
+            zvalmin = min( zvalmin, tpbudgets(ji)%tsources(ipos(jk))%xvalidmin )
+            zvalmax = max( zvalmax, tpbudgets(ji)%tsources(ipos(jk))%xvalidmax )
+          end do
+          tpbudgets(ji)%tgroups(jj)%xvalidmin = zvalmin
+          tpbudgets(ji)%tgroups(jj)%xvalidmax = zvalmax
+        end if
+
+        allocate( tpbudgets(ji)%tgroups(jj)%xdata(kbudim1, kbudim2, kbudim3 ) )
+        tpbudgets(ji)%tgroups(jj)%xdata(:, :, :) = 0.
+      end do
+
+      deallocate( igroups )
+      deallocate( ipos )
+
+      !Check that a group does not contain more than 1 source term with ldonotinit=.true.
+      do jj = 1, inbgroups
+        if ( tpbudgets(ji)%tgroups(jj)%nsources > 1 ) then
+          do jk = 1, tpbudgets(ji)%tgroups(jj)%nsources
+            if ( tpbudgets(ji)%tsources(tpbudgets(ji)%tgroups(jj)%nsourcelist(jk) )%ldonotinit ) &
+              call Print_msg( NVERB_FATAL, 'BUD', 'Ini_budget', &
+                              'a group with more than 1 source term may not contain sources with ldonotinit=true' )
+            if ( tpbudgets(ji)%tsources(tpbudgets(ji)%tgroups(jj)%nsourcelist(jk) )%loverwrite ) &
+              call Print_msg( NVERB_FATAL, 'BUD', 'Ini_budget', &
+                              'a group with more than 1 source term may not contain sources with loverwrite=true' )
+          end do
+        end if
+      end do
+
+    end if ENABLED
+  end do BUDGETS
+
+end subroutine Ini_budget_groups
+
+
+subroutine Sourcelist_sort_compact( tpbudget )
+  !Sort the list of sources to put the non-available source terms at the end of the list
+  !and compact the list
+  use modd_budget, only: tbudgetdata, tbusourcedata
+
+  type(tbudgetdata), intent(inout) :: tpbudget
+
+  integer                                        :: ji
+  integer                                        :: isrc_avail, isrc_notavail
+  type(tbusourcedata), dimension(:), allocatable :: tzsources_avail
+  type(tbusourcedata), dimension(:), allocatable :: tzsources_notavail
+
+  isrc_avail    = 0
+  isrc_notavail = 0
+
+  Allocate( tzsources_avail   (tpbudget%nsources) )
+  Allocate( tzsources_notavail(tpbudget%nsources) )
+
+  !Separate source terms available or not during the execution
+  !(based on the criteria provided to Budget_source_add and stored in lavailable field)
+  do ji = 1, tpbudget%nsources
+    if ( tpbudget%tsources(ji)%lavailable ) then
+      isrc_avail = isrc_avail + 1
+      tzsources_avail(isrc_avail) = tpbudget%tsources(ji)
+    else
+      isrc_notavail = isrc_notavail + 1
+      tzsources_notavail(isrc_notavail) = tpbudget%tsources(ji)
+    end if
+  end do
+
+  !Reallocate/compact the source list
+  if ( Allocated( tpbudget%tsources ) ) Deallocate( tpbudget%tsources )
+  Allocate( tpbudget%tsources( tpbudget%nsources ) )
+
+  tpbudget%nsourcesmax = tpbudget%nsources
+  !Limit the number of sources to the available list
+  tpbudget%nsources    = isrc_avail
+
+  !Fill the source list beginning with the available sources and finishing with the non-available ones
+  do ji = 1, isrc_avail
+    tpbudget%tsources(ji) = tzsources_avail(ji)
+  end do
+
+  do ji = 1, isrc_notavail
+    tpbudget%tsources(isrc_avail + ji) = tzsources_notavail(ji)
+  end do
+
+end subroutine Sourcelist_sort_compact
+
+
+subroutine Sourcelist_scan( tpbudget, hbulist )
+  use modd_budget, only: tbudgetdata
+
+  type(tbudgetdata),              intent(inout) :: tpbudget
+  character(len=*), dimension(:), intent(in)    :: hbulist
+
+  character(len=:), allocatable :: yline
+  character(len=:), allocatable :: ysrc
+  character(len=:), dimension(:), allocatable :: ymsg
+  integer                       :: idx
+  integer                       :: igroup
+  integer                       :: igroup_idx
+  integer                       :: ipos
+  integer                       :: istart
+  integer                       :: ji
+
+  istart = 1
+
+  ! Case 'LIST_AVAIL': list all the available source terms
+  if ( Size( hbulist ) > 0 ) then
+    if ( Trim( hbulist(1) ) == 'LIST_AVAIL' ) then
+      Allocate( character(len=65) :: ymsg(tpbudget%nsources + 1) )
+      ymsg(1) = '---------------------------------------------------------------------'
+      ymsg(2) = 'Available source terms for budget ' // Trim( tpbudget%cname )
+      Write( ymsg(3), '( A32, " ", A32 )' ) 'Name', 'Long name'
+      idx = 3
+      do ji = 1, tpbudget%nsources
+        if ( All( tpbudget%tsources(ji)%cmnhname /= [ 'INIF' , 'ENDF', 'AVEF' ] ) ) then
+          idx = idx + 1
+          Write( ymsg(idx), '( A32, " ", A32 )' ) tpbudget%tsources(ji)%cmnhname, tpbudget%tsources(ji)%clongname
+        end if
+      end do
+      ymsg(tpbudget%nsources + 1 ) = '---------------------------------------------------------------------'
+      call Print_msg_multi( NVERB_WARNING, 'BUD', 'Sourcelist_scan', ymsg )
+      !To not read the 1st line again
+      istart = 2
+    end if
+  end if
+
+  ! Case 'LIST_ALL': list all the source terms
+  if ( Size( hbulist ) > 0 ) then
+    if ( Trim( hbulist(1) ) == 'LIST_ALL' ) then
+      Allocate( character(len=65) :: ymsg(tpbudget%nsourcesmax + 1) )
+      ymsg(1) = '---------------------------------------------------------------------'
+      ymsg(2) = 'Source terms for budget ' // Trim( tpbudget%cname )
+      Write( ymsg(3), '( A32, " ", A32 )' ) 'Name', 'Long name'
+      idx = 3
+      do ji = 1, tpbudget%nsourcesmax
+        if ( All( tpbudget%tsources(ji)%cmnhname /= [ 'INIF' , 'ENDF', 'AVEF' ] ) ) then
+          idx = idx + 1
+          Write( ymsg(idx), '( A32, " ", A32 )' ) tpbudget%tsources(ji)%cmnhname, tpbudget%tsources(ji)%clongname
+        end if
+      end do
+      ymsg(tpbudget%nsourcesmax + 1 ) = '---------------------------------------------------------------------'
+      call Print_msg_multi( NVERB_WARNING, 'BUD', 'Sourcelist_scan', ymsg )
+      !To not read the 1st line again
+      istart = 2
+    end if
+  end if
+
+  ! Case 'ALL': enable all available source terms
+  if ( Size( hbulist ) > 0 ) then
+    if ( Trim( hbulist(1) ) == 'ALL' ) then
+      do ji = 1, tpbudget%nsources
+        tpbudget%tsources(ji)%ngroup = 1
+      end do
+      return
+    end if
+  end if
+
+  !Always enable INIF, ENDF and AVEF terms
+  ipos = Source_find( tpbudget, 'INIF' )
+  if ( ipos < 1 ) call Print_msg( NVERB_FATAL, 'BUD', 'Sourcelist_scan', 'source term ' // Trim( tpbudget%cname ) &
+                            // ': INIF not found' )
+  tpbudget%tsources(ipos)%ngroup = 1
+
+  ipos = Source_find( tpbudget, 'ENDF' )
+  if ( ipos < 1 ) call Print_msg( NVERB_FATAL, 'BUD', 'Sourcelist_scan', 'source term ' // Trim( tpbudget%cname ) &
+                            // ': ENDF not found' )
+  tpbudget%tsources(ipos)%ngroup = 1
+
+  ipos = Source_find( tpbudget, 'AVEF' )
+  if ( ipos < 1 ) call Print_msg( NVERB_FATAL, 'BUD', 'Sourcelist_scan', 'source term ' // Trim( tpbudget%cname ) &
+                            // ': AVEF not found' )
+  tpbudget%tsources(ipos)%ngroup = 1
+
+  !igroup_idx start at 2 because 1 is reserved for individually stored source terms
+  igroup_idx = 2
+
+  do ji = istart, Size( hbulist )
+    if ( Len_trim( hbulist(ji) ) > 0 ) then
+      ! Scan the line and separate the different sources (separated by + signs)
+      yline = Trim(hbulist(ji))
+
+      idx = Index( yline, '+' )
+      if ( idx < 1 ) then
+        igroup = 1
+      else
+        igroup = igroup_idx
+        igroup_idx = igroup_idx + 1
+      end if
+
+      do
+        idx = Index( yline, '+' )
+        if ( idx < 1 ) then
+          ysrc = yline
+        else
+          ysrc = yline(1 : idx - 1)
+          yline = yline(idx + 1 :)
+        end if
+
+        !Check if the source is known
+        if ( Len_trim( ysrc ) > 0 ) then
+          ipos = Source_find( tpbudget, ysrc )
+
+          if ( ipos > 0 ) then
+            call Print_msg( NVERB_DEBUG, 'BUD', 'Sourcelist_scan', 'source term ' // Trim( tpbudget%cname ) &
+                            // ': ' // ysrc // ' found' )
+
+            if ( .not.  tpbudget%tsources(ipos)%lavailable ) then
+              call Print_msg( NVERB_WARNING, 'BUD', 'Sourcelist_scan', 'source term ' // Trim( tpbudget%cname ) &
+                              // ': ' // ysrc // ' not available' )
+              tpbudget%tsources(ipos)%ngroup = 0
+            else
+              tpbudget%tsources(ipos)%ngroup = igroup
+            end if
+          else
+            call Print_msg( NVERB_ERROR, 'BUD', 'Sourcelist_scan', 'source term ' // Trim( tpbudget%cname ) &
+                            // ': ' // ysrc // ' not found' )
+          end if
+        end if
+
+        if ( idx < 1 ) exit
+      end do
+    end if
+  end do
+end subroutine Sourcelist_scan
+
+
+subroutine Sourcelist_nml_compact( tpbudget, hbulist )
+  !This subroutine reduce the size of the hbulist to the minimum
+  !The list is generated from the group list
+  use modd_budget, only: NBULISTMAXLEN, tbudgetdata
+
+  type(tbudgetdata),                                       intent(in)    :: tpbudget
+  character(len=NBULISTMAXLEN), dimension(:), allocatable, intent(inout) :: hbulist
+
+  integer :: idx
+  integer :: isource
+  integer :: jg
+  integer :: js
+
+  if ( Allocated( hbulist ) ) Deallocate( hbulist )
+
+  if ( tpbudget%ngroups < 3 ) then
+    call Print_msg( NVERB_ERROR, 'BUD', 'Sourcelist_nml_compact', 'ngroups is too small' )
+    return
+  end if
+
+  Allocate( character(len=NBULISTMAXLEN) :: hbulist(tpbudget%ngroups - 3) )
+  hbulist(:) = ''
+
+  idx = 0
+  do jg = 1, tpbudget%ngroups
+    if ( tpbudget%tgroups(jg)%nsources < 1 ) then
+      call Print_msg( NVERB_ERROR, 'BUD', 'Sourcelist_nml_compact', 'no source for group' )
+      cycle
+    end if
+
+    !Do not put 'INIF', 'ENDF', 'AVEF' in hbulist because their presence is automatic if the corresponding budget is enabled
+    isource = tpbudget%tgroups(jg)%nsourcelist(1)
+    if ( Any( tpbudget%tsources(isource)%cmnhname ==  [ 'INIF', 'ENDF', 'AVEF' ] ) ) cycle
+
+    idx = idx + 1
+#if 0
+    !Do not do this way because the group cmnhname may be truncated (NMNHNAMELGTMAX is smaller than NBULISTMAXLEN)
+    !and the name separator is different ('_')
+    hbulist(idx) = Trim( tpbudget%tgroups(jg)%cmnhname )
+#else
+    do js = 1, tpbudget%tgroups(jg)%nsources
+      isource = tpbudget%tgroups(jg)%nsourcelist(js)
+      hbulist(idx) = Trim( hbulist(idx) ) // Trim( tpbudget%tsources(isource)%cmnhname )
+      if ( js < tpbudget%tgroups(jg)%nsources ) hbulist(idx) = Trim( hbulist(idx) ) // '+'
+    end do
+#endif
+  end do
+end subroutine Sourcelist_nml_compact
+
+
+subroutine Sourcelist_sv_nml_compact( hbulist )
+  !This subroutine reduce the size of the hbulist
+  !For SV variables the reduction is simpler than for other variables
+  !because it is too complex to do this cleanly (the enabled source terms are different for each scalar variable)
+  use modd_budget, only: NBULISTMAXLEN, tbudgetdata
+
+  character(len=*), dimension(:), allocatable, intent(inout) :: hbulist
+
+  character(len=NBULISTMAXLEN), dimension(:), allocatable :: ybulist_new
+  integer :: ilines
+  integer :: ji
+
+  ilines = 0
+  do ji = 1, Size( hbulist )
+    if ( Len_trim(hbulist(ji)) > 0 ) ilines = ilines + 1
+  end do
+
+  Allocate( ybulist_new(ilines) )
+
+  ilines = 0
+  do ji = 1, Size( hbulist )
+    if ( Len_trim(hbulist(ji)) > 0 ) then
+      ilines = ilines + 1
+      ybulist_new(ilines) = Trim( hbulist(ji) )
+    end if
+  end do
+
+  call Move_alloc( from = ybulist_new, to = hbulist )
+end subroutine Sourcelist_sv_nml_compact
+
+
+pure function Source_find( tpbudget, hsource ) result( ipos )
+  use modd_budget,     only: tbudgetdata
+
+  type(tbudgetdata), intent(in) :: tpbudget
+  character(len=*),  intent(in) :: hsource
+  integer :: ipos
+
+  integer :: ji
+  logical :: gfound
+
+  ipos = -1
+  gfound = .false.
+  do ji = 1, tpbudget%nsourcesmax
+    if ( Trim( hsource ) == Trim ( tpbudget%tsources(ji)%cmnhname ) ) then
+      gfound = .true.
+      ipos = ji
+      exit
+    end if
+  end do
+
+end function Source_find
+
+end module mode_ini_budget
diff --git a/src/PHYEX/ext/ini_elecn.f90 b/src/PHYEX/ext/ini_elecn.f90
new file mode 100644
index 0000000000000000000000000000000000000000..e00ea14d3a6f0eff266625c09fc945a1c7805d80
--- /dev/null
+++ b/src/PHYEX/ext/ini_elecn.f90
@@ -0,0 +1,327 @@
+!MNH_LIC Copyright 2009-2023 CNRS, Meteo-France and Universite Paul Sabatier
+!MNH_LIC This is part of the Meso-NH software governed by the CeCILL-C licence
+!MNH_LIC version 1. See LICENSE, CeCILL-C_V1-en.txt and CeCILL-C_V1-fr.txt
+!MNH_LIC for details. version 1.
+!-----------------------------------------------------------------
+!     ######################
+      MODULE MODI_INI_ELEC_n
+!     ######################
+!
+INTERFACE
+      SUBROUTINE INI_ELEC_n (KLUOUT, HELEC, HCLOUD, TPINIFILE, &
+                             PTSTEP, PZZ,                      &
+                             PDXX, PDYY, PDZZ, PDZX, PDZY      )
+!
+USE MODD_IO,  ONLY : TFILEDATA
+!
+INTEGER,           INTENT(IN) :: KLUOUT   ! Logical unit number for prints
+CHARACTER (LEN=4), INTENT(IN) :: HELEC    ! atmospheric electricity scheme
+CHARACTER (LEN=4), INTENT(IN) :: HCLOUD   ! microphysics scheme
+TYPE(TFILEDATA),   INTENT(IN) :: TPINIFILE! Initial file
+REAL,              INTENT(IN) :: PTSTEP   ! Time STEP
+!
+REAL, DIMENSION(:,:,:), INTENT(IN)    :: PZZ     ! height z
+REAL, DIMENSION(:,:,:), INTENT(IN)    :: PDXX    ! metric coefficient dxx
+REAL, DIMENSION(:,:,:), INTENT(IN)    :: PDYY    ! metric coefficient dyy
+REAL, DIMENSION(:,:,:), INTENT(IN)    :: PDZZ    ! metric coefficient dzz
+REAL, DIMENSION(:,:,:), INTENT(INOUT) :: PDZX    ! metric coefficient dzx
+REAL, DIMENSION(:,:,:), INTENT(INOUT) :: PDZY    ! metric coefficient dzy
+!
+END SUBROUTINE INI_ELEC_n
+END INTERFACE
+END MODULE MODI_INI_ELEC_n
+!
+!     #########################################################
+      SUBROUTINE INI_ELEC_n(KLUOUT, HELEC, HCLOUD, TPINIFILE, &
+                            PTSTEP, PZZ,                      &
+                            PDXX, PDYY, PDZZ, PDZX, PDZY      )
+!     #########################################################
+!
+!!    PURPOSE
+!!    -------
+!       The purpose of this routine is to initialize the variables
+!     of the atmospheric electricity scheme
+!
+!!    METHOD
+!!    ------
+!!      The initialization of the scheme is performed as follows :
+!!   
+!!    EXTERNAL
+!!    --------
+!!      CLEANLIST_ll : deaalocate a list
+!!
+!!    IMPLICIT ARGUMENTS
+!!    ------------------ 
+!!
+!!    REFERENCE
+!!    ---------
+!!      
+!!    AUTHOR
+!!    ------
+!!      C. Barthe     * Laboratoire de l'Atmosphère et des Cyclones *
+!!
+!!    MODIFICATIONS
+!!    -------------
+!!      Original     09/11/09
+!!      M. Chong     13/05/11  Add computation of specific parameters for solving
+!!                             the electric field equation (elements of tri-diag
+!!                             matrix) 
+!!      J.-P. Pinty  13/04/12  Add elec_trid to initialise the tridiagonal syst.
+!!      J.-P. Pinty  01/07/12  Add a non-homogeneous Neuman fair-weather 
+!!                             boundary condition at the top
+!!      J.-P. Pinty  15/11/13  Initialize the flash maps
+!!                    10/2016 (C.Lac) Add droplet deposition
+!!  Philippe Wautelet: 05/2016-04/2018: new data structures and calls for I/O
+!  P. Wautelet 14/02/2019: remove CLUOUT/CLUOUT0 and associated variables
+!  P. Wautelet 10/04/2019: replace ABORT and STOP calls by Print_msg
+!!
+!-------------------------------------------------------------------------------
+!
+!*       0.    DECLARATIONS
+!              ------------
+!
+USE MODD_CLOUDPAR_n, ONLY : NSPLITR
+USE MODD_CONF, ONLY : CEQNSYS,CCONF,CPROGRAM
+USE MODD_CONF_n, ONLY : NRR
+USE MODD_CST
+USE MODD_DIM_n, ONLY : NIMAX_ll, NJMAX_ll
+USE MODD_DYN
+USE MODD_DYN_n, ONLY : XRHOM, XTRIGSX, XTRIGSY, XAF, XCF, XBFY, XBFB, XDXHATM, &
+                       XDYHATM, NIFAXX, NIFAXY, XBF_SXP2_YP1_Z
+USE MODD_ELEC_DESCR
+USE MODD_ELEC_FLASH
+USE MODD_ELEC_n, ONLY : XRHOM_E, XAF_E, XCF_E, XBFY_E, XBFB_E, XBF_SXP2_YP1_Z_E
+USE MODD_GET_n, ONLY : CGETINPRC, CGETINPRR, CGETINPRS, CGETINPRG, CGETINPRH, &            
+                       CGETCLOUD, CGETSVT
+USE MODD_GRID_n, ONLY : XMAP, XDXHAT, XDYHAT
+USE MODD_IO,  ONLY : TFILEDATA
+USE MODD_LBC_n, ONLY : CLBCX, CLBCY
+USE MODD_LUNIT_n, ONLY: TLUOUT
+USE MODD_PARAM_C2R2, ONLY : LDEPOC
+USE MODD_PARAMETERS, ONLY : JPVEXT, JPHEXT
+USE MODD_PARAM_ICE_n, ONLY : LDEPOSC
+USE MODD_PRECIP_n, ONLY : XINPRR, XACPRR, XINPRS, XACPRS, XINPRG, XACPRG, &
+                          XINPRH, XACPRH, XINPRC, XACPRC, XINPRR3D, XEVAP3D,&
+                          XINDEP,XACDEP
+USE MODD_REF
+USE MODD_REF_n, ONLY : XRHODJ, XTHVREF
+USE MODD_TIME
+!
+USE MODD_ARGSLIST_ll, ONLY : LIST_ll
+USE MODE_ll
+use mode_msg
+!
+USE MODI_ELEC_TRIDZ
+USE MODI_INI_CLOUD
+USE MODI_INI_FIELD_ELEC
+USE MODI_INI_FLASH_GEOM_ELEC
+USE MODI_INI_PARAM_ELEC
+USE MODI_INI_RAIN_ICE_ELEC
+USE MODI_READ_PRECIP_FIELD
+!
+!
+IMPLICIT NONE
+!
+!*       0.1   declarations of dummy arguments
+!
+INTEGER,           INTENT(IN) :: KLUOUT   ! Logical unit number for prints
+CHARACTER (LEN=4), INTENT(IN) :: HELEC    ! atmospheric electricity scheme
+CHARACTER (LEN=4), INTENT(IN) :: HCLOUD   ! microphysics scheme
+TYPE(TFILEDATA),   INTENT(IN) :: TPINIFILE! Initial file
+REAL,              INTENT(IN) :: PTSTEP   ! Time STEP
+!
+REAL, DIMENSION(:,:,:), INTENT(IN)    :: PZZ     ! height z
+REAL, DIMENSION(:,:,:), INTENT(IN)    :: PDXX    ! metric coefficient dxx
+REAL, DIMENSION(:,:,:), INTENT(IN)    :: PDYY    ! metric coefficient dyy
+REAL, DIMENSION(:,:,:), INTENT(IN)    :: PDZZ    ! metric coefficient dzz
+REAL, DIMENSION(:,:,:), INTENT(INOUT) :: PDZX    ! metric coefficient dzx
+REAL, DIMENSION(:,:,:), INTENT(INOUT) :: PDZY    ! metric coefficient dzy
+!
+!*       0.2   declarations of local variables
+!
+INTEGER :: ILUOUT  ! Logical unit number of output-listing
+!
+INTEGER :: IIU     ! Upper dimension in x direction (local)
+INTEGER :: IJU     ! Upper dimension in y direction (local)
+INTEGER :: IKU     ! Upper dimension in z direction
+INTEGER :: IKB, IKE
+INTEGER :: JK      ! Loop vertical index
+INTEGER :: IINFO_ll ! Return code of // routines
+INTEGER :: IINTVL   ! Number of intervals to integrate the kernels
+REAL    :: ZFDINFTY ! Factor used to define the "infinite" diameter
+!
+REAL :: ZRHO00     ! Surface reference air density
+REAL :: ZDZMIN
+REAL, DIMENSION(:,:,:), ALLOCATABLE :: ZDZ    ! mesh size
+CHARACTER (LEN=3) :: YEQNSYS
+!
+!
+!-------------------------------------------------------------------------------
+!
+!*       0.    PROLOGUE
+!              --------
+!
+ILUOUT = TLUOUT%NLU
+!
+CALL GET_DIM_EXT_ll('B',IIU,IJU)
+IKU = SIZE(PZZ,3)
+!
+!-------------------------------------------------------------------------------
+!
+!*       1.    ALLOCATE Module MODD_PRECIP_n
+!              -----------------------------
+!
+IF (HCLOUD(1:3) == 'ICE') THEN
+  ALLOCATE( XINPRR(IIU,IJU) )
+  ALLOCATE( XINPRR3D(IIU,IJU,IKU) )
+  ALLOCATE( XEVAP3D(IIU,IJU,IKU) )
+  ALLOCATE( XACPRR(IIU,IJU) )
+  XINPRR(:,:) = 0.0
+  XACPRR(:,:) = 0.0
+  XINPRR3D(:,:,:) = 0.0
+  XEVAP3D(:,:,:) = 0.0
+  ALLOCATE( XINPRC(IIU,IJU) )
+  ALLOCATE( XACPRC(IIU,IJU) )
+  XINPRC(:,:) = 0.0
+  XACPRC(:,:) = 0.0
+  ALLOCATE( XINPRS(IIU,IJU) )
+  ALLOCATE( XACPRS(IIU,IJU) )
+  XINPRS(:,:) = 0.0
+  XACPRS(:,:) = 0.0
+  ALLOCATE( XINPRG(IIU,IJU) )
+  ALLOCATE( XACPRG(IIU,IJU) )
+  XINPRG(:,:) = 0.0
+  XACPRG(:,:) = 0.0
+END IF
+!
+IF (HCLOUD == 'ICE4') THEN
+  ALLOCATE( XINPRH(IIU,IJU) )
+  ALLOCATE( XACPRH(IIU,IJU) )
+  XINPRH(:,:) = 0.0
+  XACPRH(:,:) = 0.0
+ELSE
+  ALLOCATE( XINPRH(0,0) )
+  ALLOCATE( XACPRH(0,0) )
+END IF
+!
+IF ( LDEPOSC) THEN
+  ALLOCATE(XINDEP(IIU,IJU))
+  ALLOCATE(XACDEP(IIU,IJU))
+  XINDEP(:,:)=0.0
+  XACDEP(:,:)=0.0
+ELSE
+  ALLOCATE(XINDEP(0,0))
+  ALLOCATE(XACDEP(0,0))
+END IF
+!
+IF(SIZE(XINPRR) == 0) RETURN
+!
+!
+!-------------------------------------------------------------------------------
+!
+!*       2.    Initialize MODD_PRECIP_n variables
+!              -----------------------------------
+!
+CALL READ_PRECIP_FIELD (TPINIFILE, CPROGRAM, CCONF,                           &
+                        CGETINPRC,CGETINPRR,CGETINPRS,CGETINPRG,CGETINPRH,    &
+                        XINPRC,XACPRC,XINDEP,XACDEP,XINPRR,XINPRR3D,XEVAP3D,  &
+                        XACPRR, XINPRS, XACPRS, XINPRG, XACPRG, XINPRH, XACPRH)
+!
+!
+!-------------------------------------------------------------------------------
+!
+!*       3.    INITIALIZE THE PARAMETERS 
+!*             FOR THE MICROPHYSICS AND THE ELECTRICITY
+!              ----------------------------------------
+!
+!*       3.1    Compute the minimun vertical mesh size
+!
+ALLOCATE( ZDZ(IIU,IJU,IKU) )
+ZDZ(:,:,:) = 0.
+!
+IKB = 1 + JPVEXT
+IKE = SIZE(PZZ,3) - JPVEXT
+!
+DO JK = IKB, IKE
+  ZDZ(:,:,JK) = PZZ(:,:,JK+1) - PZZ(:,:,JK)
+END DO
+ZDZMIN = MIN_ll (ZDZ,IINFO_ll,1,1,IKB,NIMAX_ll+2*JPHEXT,NJMAX_ll+2*JPHEXT,IKE )
+!
+DEALLOCATE(ZDZ)
+!
+!
+IF (HELEC(1:3) == 'ELE') THEN
+!
+!
+!*       3.2    initialize the parameters for the mixed-phase microphysics 
+!*              and the electrification
+!
+  CALL INI_RAIN_ICE_ELEC (KLUOUT, PTSTEP, ZDZMIN, NSPLITR, HCLOUD, &
+                          IINTVL, ZFDINFTY)
+!
+!
+!*       3.3    initialize the electrical parameters
+!
+  ZRHO00 = XP00 / (XRD * XTHVREFZ(IKB))
+!
+  CALL INI_PARAM_ELEC (TPINIFILE, CGETSVT, ZRHO00, NRR, IINTVL, &
+                       ZFDINFTY, IIU, IJU, IKU)
+!
+!
+!*       3.4    initialize the parameters for the electric field
+!
+  IF (LINDUCTIVE .OR. ((.NOT. LOCG) .AND. LELEC_FIELD)) THEN
+    CALL INI_FIELD_ELEC (PDXX, PDYY, PDZZ, PDZX, PDZY, PZZ)
+  END IF
+!
+!
+!*       3.5    initialize the parameters for the lightning flashes
+!
+  IF (.NOT. LOCG) THEN
+    IF (LFLASH_GEOM) THEN
+      CALL INI_FLASH_GEOM_ELEC
+    ELSE
+      call Print_msg( NVERB_FATAL, 'GEN', 'INI_ELEC_n', 'INI_LIGHTNING_ELEC not yet developed' )
+    END IF
+  END IF
+!
+ELSE IF (HELEC /= 'NONE') THEN
+  call Print_msg( NVERB_FATAL, 'GEN', 'INI_ELEC_n', 'not yet developed for CELEC='//trim(HELEC) )
+END IF
+!
+!*       3.6    initialize the parameters for the resolution of the electric field
+!
+YEQNSYS = CEQNSYS
+CEQNSYS = 'LHE'
+! Force any CEQNSYS (DUR, MAE, LHE) to LHE to obtain a unique set of coefficients
+!    for the flat laplacian operator and Return to the original CEQNSYS
+
+ALLOCATE (XRHOM_E(SIZE(XRHOM)))
+ALLOCATE (XAF_E(SIZE(XAF)))
+ALLOCATE (XCF_E(SIZE(XCF)))
+ALLOCATE (XBFY_E(SIZE(XBFY,1),SIZE(XBFY,2),SIZE(XBFY,3)))
+ALLOCATE (XBFB_E(SIZE(XBFB,1),SIZE(XBFB,2),SIZE(XBFB,3)))
+ALLOCATE (XBF_SXP2_YP1_Z_E(SIZE(XBF_SXP2_YP1_Z,1),SIZE(XBF_SXP2_YP1_Z,2),&
+                           SIZE(XBF_SXP2_YP1_Z,3)))
+!
+CALL ELEC_TRIDZ (CLBCX,CLBCY,                                &
+           XMAP,XDXHAT,XDYHAT,XDXHATM,XDYHATM,XRHOM_E,XAF_E, & 
+           XCF_E,XTRIGSX,XTRIGSY,NIFAXX,NIFAXY,              &
+           XRHODJ,XTHVREF,PZZ,XBFY_E,XEPOTFW_TOP,            &
+           XBFB_E,XBF_SXP2_YP1_Z_E)
+!
+CEQNSYS=YEQNSYS
+!
+!*       3.7    initialize the flash maps
+!
+ALLOCATE( NMAP_TRIG_IC(IIU,IJU) ); NMAP_TRIG_IC(:,:) = 0
+ALLOCATE( NMAP_IMPACT_CG(IIU,IJU) ); NMAP_IMPACT_CG(:,:) = 0
+ALLOCATE( NMAP_2DAREA_IC(IIU,IJU) ); NMAP_2DAREA_IC(:,:) = 0
+ALLOCATE( NMAP_2DAREA_CG(IIU,IJU) ); NMAP_2DAREA_CG(:,:) = 0
+ALLOCATE( NMAP_3DIC(IIU,IJU,IKU) ); NMAP_3DIC(:,:,:) = 0
+ALLOCATE( NMAP_3DCG(IIU,IJU,IKU) ); NMAP_3DCG(:,:,:) = 0
+!
+!-------------------------------------------------------------------------------
+!
+! 
+END SUBROUTINE INI_ELEC_n
diff --git a/src/PHYEX/ext/ini_flash_geom_elec.f90 b/src/PHYEX/ext/ini_flash_geom_elec.f90
new file mode 100644
index 0000000000000000000000000000000000000000..3c5faece3492d78a958b5bfe54b815164611abde
--- /dev/null
+++ b/src/PHYEX/ext/ini_flash_geom_elec.f90
@@ -0,0 +1,148 @@
+!MNH_LIC Copyright 1994-2014 CNRS, Meteo-France and Universite Paul Sabatier
+!MNH_LIC This is part of the Meso-NH software governed by the CeCILL-C licence
+!MNH_LIC version 1. See LICENSE, CeCILL-C_V1-en.txt and CeCILL-C_V1-fr.txt  
+!MNH_LIC for details. version 1.
+!     ###############################
+      MODULE MODI_INI_FLASH_GEOM_ELEC
+!     ###############################
+!
+INTERFACE
+!
+      SUBROUTINE INI_FLASH_GEOM_ELEC
+!
+END SUBROUTINE INI_FLASH_GEOM_ELEC
+END INTERFACE
+END MODULE MODI_INI_FLASH_GEOM_ELEC
+!
+!	##############################
+        SUBROUTINE INI_FLASH_GEOM_ELEC
+!	##############################
+!
+!!****  *INI_FLASH_GEOM_ELEC* - routine to initialize the lightning flashes
+!!
+!!    PURPOSE
+!!    -------
+!       The purpose of this routine is to initialize the variables
+!     of the lightning flashes routine 
+!
+!!**  METHOD
+!!    ------
+!!      The initialization of the scheme is performed as follows :
+!!   
+!!    EXTERNAL
+!!    --------
+!!
+!!    IMPLICIT ARGUMENTS
+!!    ------------------ 
+!!
+!!    REFERENCE
+!!    ---------
+!!      
+!!    AUTHOR
+!!    ------
+!!
+!!    MODIFICATIONS
+!!    -------------
+!!      Original     29/11/02
+!!
+!!      Modifications
+!!        J.-P. Pinty  jan 2015 : add LMA simulator
+!!        J.Escobar 20/06/2018 : truly set NBRANCH_MAX = 5000 !
+!!
+!-------------------------------------------------------------------------------
+!
+!*	0.	DECLARATIONS
+!		------------
+!
+USE MODD_CST, ONLY : XPI
+USE MODD_RAIN_ICE_DESCR_n
+USE MODD_ELEC_DESCR
+USE MODD_ELEC_PARAM
+USE MODD_DIM_n, ONLY : NKMAX
+USE MODD_TIME_n, ONLY : TDTCUR
+USE MODD_LMA_SIMULATOR, ONLY : LLMA, TDTLMA, LWRITE_LMA, XDTLMA, CLMA_FILE
+!
+USE MODI_MOMG
+!
+IMPLICIT NONE
+!
+!*	0.1	Declaration of dummy arguments
+!
+!
+!*	0.2	Declaration of local variables
+!
+!
+!----------------------------------------------------------------------------
+!
+!*      1.     SOME CONSTANTS FOR NEUTRALIZATION
+!              ---------------------------------
+!
+XFQLIGHTC  = 660. * MOMG(3.,3.,2.) / MOMG(3.,3.,3.)   ! PI/A*lbda^(b-2) = 660.
+!
+XFQLIGHTR  = XPI * XCCR * MOMG(XALPHAR,XNUR,2.)
+XEXQLIGHTR = XCXR - 2.
+!
+XEXQLIGHTI = 2. / XBI
+XFQLIGHTI  = XPI / 4. * MOMG(XALPHAI,XNUI,2.) *                   &
+            (XAI * MOMG(XALPHAI,XNUI,XBI))**(-XEXQLIGHTI)
+!
+XFQLIGHTS  = XPI * XCCS * MOMG(XALPHAS,XNUS,2.)
+XEXQLIGHTS = XCXS - 2.
+!
+XFQLIGHTG  = XPI * XCCG * MOMG(XALPHAG,XNUG,2.)
+XEXQLIGHTG = XCXG - 2.
+!
+!
+!----------------------------------------------------------------------------
+!
+!*      2.      INITIALIZE SOME THRESHOLDS
+!               --------------------------
+!
+! electric field threshold for cell detection
+! from Marshall et al. (1995) JGR, the breakeven electric field is 
+! 200 kV/m at the ground, ~ 33 kV/m at 15 km, and ~ 18 kV/m at 20 km height.
+! To be sure all the electrified cells are detected, this threshold is set to 
+! 20 kV/m
+XE_THRESH =  35.E3 ! (V/m)
+!
+! the maximum of segments in the bi-leader corresponds to the number of 
+! altitude levels in the domain since the bi-leader is hypothesized to 
+! propagate only along the vertical 
+NLEADER_MAX = NKMAX
+!
+! the maximum number of branches is arbitriraly set to 5000
+NBRANCH_MAX = 5000
+!
+! the maximum number of electrified cells in the domain is arbitrarily 
+! set to 10
+NMAX_CELL = 10
+!
+! the altitude for CG to be prolongated to the ground is set to 2 km
+! this threshold could be modified once ions will be taken into account
+XALT_CG = 2000.  ! m
+!
+!
+!----------------------------------------------------------------------------
+!
+!*	3.	INITIALIZATIONS
+!		---------------
+!
+NNBLIGHT   = 0
+NNB_CG     = 0
+NNB_CG_POS = 0
+!
+!
+!----------------------------------------------------------------------------
+!
+!*      4.      INITIALIZE LMA RECORDS
+!               ----------------------
+!
+! needs LLMA = .TRUE. to operate
+XDTLMA = 600.
+TDTLMA = TDTCUR
+LWRITE_LMA = .FALSE.
+CLMA_FILE(1:5) = "BEGIN"
+!
+!----------------------------------------------------------------------------
+!
+END SUBROUTINE INI_FLASH_GEOM_ELEC
diff --git a/src/PHYEX/ext/ini_lb.f90 b/src/PHYEX/ext/ini_lb.f90
new file mode 100644
index 0000000000000000000000000000000000000000..faa09698bf58497f08539e7305b5f0fc0d01487c
--- /dev/null
+++ b/src/PHYEX/ext/ini_lb.f90
@@ -0,0 +1,730 @@
+!MNH_LIC Copyright 1998-2023 CNRS, Meteo-France and Universite Paul Sabatier
+!MNH_LIC This is part of the Meso-NH software governed by the CeCILL-C licence
+!MNH_LIC version 1. See LICENSE, CeCILL-C_V1-en.txt and CeCILL-C_V1-fr.txt
+!MNH_LIC for details. version 1.
+!-----------------------------------------------------------------
+!     ######################
+      MODULE MODI_INI_LB
+!     ######################
+!
+INTERFACE 
+!
+SUBROUTINE INI_LB(TPINIFILE,OLSOURCE,KSV,                                   &
+     KSIZELBX_ll,KSIZELBXU_ll,KSIZELBY_ll,KSIZELBYV_ll,                     &
+     KSIZELBXTKE_ll,KSIZELBYTKE_ll,                                         &
+     KSIZELBXR_ll,KSIZELBYR_ll,KSIZELBXSV_ll,KSIZELBYSV_ll,                 &
+     HGETTKEM,HGETRVM,HGETRCM,HGETRRM,HGETRIM,HGETRSM,                      &
+     HGETRGM,HGETRHM,HGETSVM,                                               &
+     PLBXUM,PLBXVM,PLBXWM,PLBXTHM,PLBXTKEM,PLBXRM,PLBXSVM,                  &
+     PLBYUM,PLBYVM,PLBYWM,PLBYTHM,PLBYTKEM,PLBYRM,PLBYSVM,                  &
+     PLBXUMM,PLBXVMM,PLBXWMM,PLBXTHMM,PLBXTKEMM,PLBXRMM,PLBXSVMM,           &
+     PLBYUMM,PLBYVMM,PLBYWMM,PLBYTHMM,PLBYTKEMM,PLBYRMM,PLBYSVMM,           &
+     PLENG )
+!
+USE MODD_IO, ONLY: TFILEDATA
+!
+TYPE(TFILEDATA),       INTENT(IN)   :: TPINIFILE ! Initial file
+LOGICAL,               INTENT(IN)   :: OLSOURCE  ! switch for the source term
+! Larger Scale fields (source if OLSOURCE=T,  fields at time t-dt if OLSOURCE=F) :
+INTEGER,               INTENT(IN)   :: KSV       ! number of passive variables
+! sizes of the West-east total LB area
+INTEGER, INTENT(IN) :: KSIZELBX_ll,KSIZELBXU_ll      ! for T,V,W and u 
+INTEGER, INTENT(IN) :: KSIZELBXTKE_ll                ! for TKE 
+INTEGER, INTENT(IN) :: KSIZELBXR_ll,KSIZELBXSV_ll    ! for Rx and SV    
+! sizes of the North-south total LB area
+INTEGER, INTENT(IN) :: KSIZELBY_ll,KSIZELBYV_ll      ! for T,U,W  and v
+INTEGER, INTENT(IN) :: KSIZELBYTKE_ll                ! for TKE
+INTEGER, INTENT(IN) :: KSIZELBYR_ll,KSIZELBYSV_ll    ! for Rx and SV
+! Get indicators
+CHARACTER (LEN=*),         INTENT(IN)  :: HGETTKEM,                          &
+                                          HGETRVM,HGETRCM,HGETRRM,           &
+                                          HGETRIM,HGETRSM,HGETRGM,HGETRHM
+CHARACTER (LEN=*), DIMENSION(:),INTENT(IN)  :: HGETSVM
+! LB  fields (source if OLSOURCE=T,  fields at time t-dt if OLSOURCE=F) :
+REAL, DIMENSION(:,:,:),          INTENT(OUT) :: PLBXUM,PLBXVM,PLBXWM ! Wind
+REAL, DIMENSION(:,:,:),          INTENT(OUT) :: PLBXTHM              ! Mass
+REAL, DIMENSION(:,:,:),          INTENT(OUT) :: PLBYUM,PLBYVM,PLBYWM ! Wind
+REAL, DIMENSION(:,:,:),          INTENT(OUT) :: PLBYTHM              ! Mass
+REAL, DIMENSION(:,:,:),          INTENT(OUT) :: PLBXTKEM          ! TKE
+REAL, DIMENSION(:,:,:),          INTENT(OUT) :: PLBYTKEM
+REAL, DIMENSION(:,:,:,:),        INTENT(OUT) :: PLBXRM  ,PLBXSVM  ! Moisture and SV
+REAL, DIMENSION(:,:,:,:),        INTENT(OUT) :: PLBYRM  ,PLBYSVM  ! in x and y-dir.
+! LB arrays at time t-dt (if OLSOURCE=T) : 
+REAL, DIMENSION(:,:,:), INTENT(IN), OPTIONAL  :: PLBXUMM,PLBXVMM,PLBXWMM ! Wind
+REAL, DIMENSION(:,:,:),INTENT(IN), OPTIONAL  :: PLBXTHMM              ! Mass
+REAL, DIMENSION(:,:,:),INTENT(IN), OPTIONAL  :: PLBYUMM,PLBYVMM,PLBYWMM ! Wind
+REAL, DIMENSION(:,:,:),INTENT(IN), OPTIONAL  :: PLBYTHMM              ! Mass
+REAL, DIMENSION(:,:,:),INTENT(IN), OPTIONAL  :: PLBXTKEMM           ! TKE
+REAL, DIMENSION(:,:,:),INTENT(IN), OPTIONAL  :: PLBYTKEMM
+REAL, DIMENSION(:,:,:,:),INTENT(IN), OPTIONAL  :: PLBXRMM  ,PLBXSVMM  ! Moisture and SV
+REAL, DIMENSION(:,:,:,:),INTENT(IN), OPTIONAL  :: PLBYRMM  ,PLBYSVMM  ! in x and y-dir.
+REAL,                  INTENT(IN),   OPTIONAL :: PLENG    ! Interpolation length
+!
+END SUBROUTINE INI_LB
+!
+END INTERFACE
+!
+END MODULE MODI_INI_LB
+!     ############################################################
+SUBROUTINE INI_LB(TPINIFILE,OLSOURCE,KSV,                          &
+     KSIZELBX_ll,KSIZELBXU_ll,KSIZELBY_ll,KSIZELBYV_ll,            &
+     KSIZELBXTKE_ll,KSIZELBYTKE_ll,                                &
+     KSIZELBXR_ll,KSIZELBYR_ll,KSIZELBXSV_ll,KSIZELBYSV_ll,        &
+     HGETTKEM,HGETRVM,HGETRCM,HGETRRM,HGETRIM,HGETRSM,             &
+     HGETRGM,HGETRHM,HGETSVM,                                      &
+     PLBXUM,PLBXVM,PLBXWM,PLBXTHM,PLBXTKEM,PLBXRM,PLBXSVM,         &
+     PLBYUM,PLBYVM,PLBYWM,PLBYTHM,PLBYTKEM,PLBYRM,PLBYSVM,         &
+     PLBXUMM,PLBXVMM,PLBXWMM,PLBXTHMM,PLBXTKEMM,PLBXRMM,PLBXSVMM,  &
+     PLBYUMM,PLBYVMM,PLBYWMM,PLBYTHMM,PLBYTKEMM,PLBYRMM,PLBYSVMM,  &
+     PLENG )
+!     ############################################################
+!
+!!****  *INI_LB* - routine to initialize  LB fields
+!!
+!!    PURPOSE
+!!    -------
+!       The purpose of this routine is to read the LB fields and to distribute
+! on subdomain which have a non-nul intersection with the LB areas.
+!       In case of OLSOURCE=T, it initializes the LB sources instead of the
+!   LB fields at time t-dt
+!
+!!**  METHOD
+!!    ------
+!!    The LB fields are read in file and distributed by FMREAD_LB
+!!
+!!    In case of OLSOURCE=T (INI_LB called by INI_CPL or LS_COUPLING), the LB sources
+!!   are computed
+!!     
+!!
+!!    EXTERNAL
+!!    --------
+!!      FMREAD    : to read data in LFIFM file
+!!      FMREAD_LB : to read LB data in LFIFM file
+!!
+!!    IMPLICIT ARGUMENTS
+!!    ------------------ 
+!!      Module MODD_CONF   : NVERB
+!!
+!!    REFERENCE
+!!    ---------
+!!      Book2 of the documentation (routine INI_LB)
+!!      
+!!
+!!    AUTHOR
+!!    ------
+!!  	V. Ducrocq       * Meteo France *
+!!      D. Gazen         L.A. 
+!!
+!!    MODIFICATIONS
+!!    -------------
+!!      Original        22/09/98    FMREAD_LB handle LBs fields
+!!      J. Stein        18/09/99    problem with the dry case
+!!      D. Gazen        22/01/01    treat NSV_* with floating indices
+!!      F Gheusi        29/10/03    bug in LB sources for NSV
+!!      J.-P. Pinty     06/05/04    treat NSV_* for C1R3 and ELEC
+!!                      20/05/06    Remove KEPS
+!!      C.Lac           20/03/08    Add passive pollutants
+!!      M.Leriche       16/07/10    Add ice phase chemical species
+!!      Pialat/tulet    15/02/12    Add ForeFire scalars 
+!!      J.Escobar : 15/09/2015 : WENO5 & JPHEXT <> 1 
+!!      M.Leriche       09/02/16    Treat gas and aq. chemicals separately
+!!      J.Escobar : 27/04/2016 : bug , test only on ANY(HGETSVM({{1:KSV}})=='READ'
+!!      J.-P. Pinty     09/02/16    Add LIMA that is LBC for CCN and IFN
+!!      M.Leriche       09/02/16    Treat gas and aq. chemicals separately
+!  P. Wautelet 05/2016-04/2018: new data structures and calls for I/O
+!  P. Wautelet 13/02/2019: initialize PLBXSVM and PLBYSVM in all cases
+!  S. Bielli      02/2019: Sea salt: significant sea wave height influences salt emission; 5 salt modes
+!  P. Wautelet 04/02/2022: use TSVLIST to manage metadata of scalar variables
+!-------------------------------------------------------------------------------
+!
+!*       0.    DECLARATIONS
+!
+USE MODD_TURB_n,          ONLY: XTKEMIN
+USE MODD_CONF,            ONLY: LCPL_AROME
+use modd_field,           only: NMNHDIM_UNKNOWN, tfieldmetadata, TYPELOG, TYPEREAL
+USE MODD_IO,              ONLY: TFILEDATA
+USE MODD_NSV,             ONLY: NSV, NSV_CS, NSV_CSBEG, NSV_CSEND, NSV_LIMA_BEG, NSV_LIMA_END,      &
+#ifdef MNH_FOREFIRE
+                                NSV_FF, NSV_FFBEG, NSV_FFEND,                                       &
+#endif
+                                NSV_LIMA_CCN_FREE, NSV_LIMA_IFN_FREE, NSV_PP, NSV_PPBEG, NSV_PPEND, &
+                                NSV_SNWBEG, NSV_SNWEND, NSV_USER, TSVLIST
+USE MODD_PARAMETERS,      ONLY: JPHEXT, JPSVNAMELGTMAX, NLONGNAMELGTMAX, NMNHNAMELGTMAX
+USE MODD_PARAM_LIMA,      ONLY: NMOD_CCN, NMOD_IFN
+!
+USE MODE_IO_FIELD_READ,   only: IO_Field_read, IO_Field_read_lb
+USE MODE_MSG
+!
+IMPLICIT NONE
+!
+!*       0.1   declarations of arguments
+!
+!
+!
+TYPE(TFILEDATA),       INTENT(IN)   :: TPINIFILE ! Initial file
+LOGICAL,               INTENT(IN)   :: OLSOURCE  ! switch for the source term
+! Larger Scale fields (source if OLSOURCE=T,  fields at time t-dt if OLSOURCE=F) :
+INTEGER,               INTENT(IN)   :: KSV       ! number of passive variables
+! sizes of the West-east total LB area
+INTEGER, INTENT(IN) :: KSIZELBX_ll,KSIZELBXU_ll      ! for T,V,W and u 
+INTEGER, INTENT(IN) :: KSIZELBXTKE_ll                !  for TKE 
+INTEGER, INTENT(IN) :: KSIZELBXR_ll,KSIZELBXSV_ll    ! for Rx and SV    
+! sizes of the North-south total LB area
+INTEGER, INTENT(IN) :: KSIZELBY_ll,KSIZELBYV_ll      ! for T,U,W  and v
+INTEGER, INTENT(IN) :: KSIZELBYTKE_ll                ! for TKE 
+INTEGER, INTENT(IN) :: KSIZELBYR_ll,KSIZELBYSV_ll    ! for Rx and SV
+! Get indicators
+CHARACTER (LEN=*),         INTENT(IN)  :: HGETTKEM,                          &
+                                          HGETRVM,HGETRCM,HGETRRM,           &
+                                          HGETRIM,HGETRSM,HGETRGM,HGETRHM
+CHARACTER (LEN=*), DIMENSION(:),INTENT(IN)  :: HGETSVM
+! LB  fields (source if OLSOURCE=T,  fields at time t-dt if OLSOURCE=F) :
+REAL, DIMENSION(:,:,:),          INTENT(OUT) :: PLBXUM,PLBXVM,PLBXWM ! Wind
+REAL, DIMENSION(:,:,:),          INTENT(OUT) :: PLBXTHM              ! Mass
+REAL, DIMENSION(:,:,:),          INTENT(OUT) :: PLBYUM,PLBYVM,PLBYWM ! Wind
+REAL, DIMENSION(:,:,:),          INTENT(OUT) :: PLBYTHM              ! Mass
+REAL, DIMENSION(:,:,:),          INTENT(OUT) :: PLBXTKEM          ! TKE
+REAL, DIMENSION(:,:,:),          INTENT(OUT) :: PLBYTKEM          ! 
+REAL, DIMENSION(:,:,:,:),        INTENT(OUT) :: PLBXRM  ,PLBXSVM  ! Moisture and SV
+REAL, DIMENSION(:,:,:,:),        INTENT(OUT) :: PLBYRM  ,PLBYSVM  ! in x and y-dir.
+! LB arrays at time t-dt (if OLSOURCE=T) : 
+REAL, DIMENSION(:,:,:), INTENT(IN), OPTIONAL  :: PLBXUMM,PLBXVMM,PLBXWMM ! Wind
+REAL, DIMENSION(:,:,:),INTENT(IN), OPTIONAL  :: PLBXTHMM              ! Mass
+REAL, DIMENSION(:,:,:),INTENT(IN), OPTIONAL  :: PLBYUMM,PLBYVMM,PLBYWMM ! Wind
+REAL, DIMENSION(:,:,:),INTENT(IN), OPTIONAL  :: PLBYTHMM              ! Mass
+REAL, DIMENSION(:,:,:),INTENT(IN), OPTIONAL  :: PLBXTKEMM           ! TKE
+REAL, DIMENSION(:,:,:),INTENT(IN), OPTIONAL  :: PLBYTKEMM
+REAL, DIMENSION(:,:,:,:),INTENT(IN), OPTIONAL  :: PLBXRMM  ,PLBXSVMM  ! Moisture and SV
+REAL, DIMENSION(:,:,:,:),INTENT(IN), OPTIONAL  :: PLBYRMM  ,PLBYSVMM  ! in x and y-dir.
+REAL,                  INTENT(IN),   OPTIONAL :: PLENG    ! Interpolation length
+!
+!
+!*       0.2   declarations of local variables
+!
+INTEGER             :: ILBSIZEX,ILBSIZEY   ! depth  of the LB area in the RIM direction 
+                                           !  written in FM file
+INTEGER       :: IL3DX,IL3DY ! Size of the LB arrays in FM file
+                             ! in  the RIM direction
+INTEGER       :: IL3DXU,IL3DYV  ! Size of the LB arrays in FM file
+                                ! in  the RIM direction for the normal wind
+INTEGER             :: IRIMX,IRIMY ! Total size of the LB area (for the RIM direction)
+INTEGER             :: IRIMXU,IRIMYV ! Total size of the LB area (for the RIM direction)
+                                     ! for the normal wind (spatial gradient needed)
+
+INTEGER             :: JSV,JRR                    ! Loop index for MOIST AND 
+                                                  !  additional scalar variables 
+INTEGER             :: IRR                        !  counter for moist variables
+INTEGER             :: IRESP
+LOGICAL :: GHORELAX_UVWTH  ! switch for the horizontal relaxation for U,V,W,TH in the FM file
+LOGICAL :: GHORELAX_TKE    ! switch for the horizontal relaxation for tke in the FM file
+LOGICAL :: GHORELAX_R, GHORELAX_SV ! switch for the horizontal relaxation 
+                                   ! for moist and scalar variables
+LOGICAL :: GIS551 ! True if file was written with MNH 5.5.1
+LOGICAL :: GOLDFILEFORMAT
+CHARACTER (LEN= LEN(HGETRVM)), DIMENSION (7) :: YGETRXM ! Arrays with  the get indicators 
+                                                        !  for the moist variables
+CHARACTER (LEN=1), DIMENSION (7) :: YC    ! array with the prefix of the moist variables
+CHARACTER(LEN=NMNHNAMELGTMAX)  :: YMNHNAME_BASE
+CHARACTER(LEN=NLONGNAMELGTMAX) :: YLONGNAME_BASE
+TYPE(TFIELDMETADATA) :: TZFIELD
+!-------------------------------------------------------------------------------
+!
+!
+!*       0.    READ CPL_AROME to know which LB_fileds there are to read
+!              --------------------
+IF ((TPINIFILE%NMNHVERSION(1)==4 .AND. TPINIFILE%NMNHVERSION(2)>8) .OR. TPINIFILE%NMNHVERSION(1)>4) THEN
+  CALL IO_Field_read(TPINIFILE,'CPL_AROME',LCPL_AROME)
+ELSE
+  LCPL_AROME=.FALSE.
+ENDIF
+!
+!
+!*       1.    SOME INITIALIZATIONS
+!              --------------------
+!
+!If TPINIFILE file was written with a MesoNH version < 5.6, some variables had different names or were not available
+GOLDFILEFORMAT = (        TPINIFILE%NMNHVERSION(1) < 5                                       &
+                   .OR. ( TPINIFILE%NMNHVERSION(1) == 5 .AND. TPINIFILE%NMNHVERSION(2) < 6 ) )
+GIS551 = TPINIFILE%NMNHVERSION(1) == 5 .AND. TPINIFILE%NMNHVERSION(2) == 5 .AND. TPINIFILE%NMNHVERSION(3) == 1
+!
+!
+!-------------------------------------------------------------------------------
+!
+!*       2.    READ 2D "surfacic" LB fields 
+!              ----------------------------
+!
+!*       2.1   read the number of available points for the horizontal relaxation
+! for basic variables 
+CALL IO_Field_read(TPINIFILE,'RIMX',ILBSIZEX)
+CALL IO_Field_read(TPINIFILE,'RIMY',ILBSIZEY)
+!
+!*        2.2 Basic variables
+! 
+CALL IO_Field_read(TPINIFILE,'HORELAX_UVWTH',GHORELAX_UVWTH)
+                                !
+IF (GHORELAX_UVWTH) THEN 
+  IRIMX =(KSIZELBX_ll-2*JPHEXT)/2   
+  IRIMXU=(KSIZELBXU_ll-2*JPHEXT)/2  
+  IRIMY =(KSIZELBY_ll-2*JPHEXT)/2
+  IRIMYV=(KSIZELBYV_ll-2*JPHEXT)/2
+  IL3DX=2*ILBSIZEX+2*JPHEXT
+  IL3DXU=IL3DX
+  IL3DY=2*ILBSIZEY+2*JPHEXT
+  IL3DYV=IL3DY
+ELSE
+  IRIMX=0
+  IRIMXU=1
+  IRIMY=0
+  IRIMYV=1
+  IL3DX=2*JPHEXT ! 2
+  IL3DY=2*JPHEXT ! 2
+  IL3DXU=2 + 2*JPHEXT ! 4 
+  IL3DYV=2 + 2*JPHEXT ! 4 
+ENDIF
+!
+IF ( KSIZELBXU_ll /= 0 ) CALL IO_Field_read_lb( TPINIFILE, 'LBXUM',  IL3DXU, IRIMXU, PLBXUM  )
+IF ( KSIZELBX_ll  /= 0 ) CALL IO_Field_read_lb( TPINIFILE, 'LBXVM',  IL3DX,  IRIMX,  PLBXVM  )
+IF ( KSIZELBX_ll  /= 0 ) CALL IO_Field_read_lb( TPINIFILE, 'LBXWM',  IL3DX,  IRIMX,  PLBXWM  )
+IF ( KSIZELBY_ll  /= 0 ) CALL IO_Field_read_lb( TPINIFILE, 'LBYUM',  IL3DY,  IRIMY,  PLBYUM  )
+IF ( KSIZELBYV_ll /= 0 ) CALL IO_Field_read_lb( TPINIFILE, 'LBYVM',  IL3DYV, IRIMYV, PLBYVM  )
+IF ( KSIZELBY_ll  /= 0 ) CALL IO_Field_read_lb( TPINIFILE, 'LBYWM',  IL3DY,  IRIMY,  PLBYWM  )
+IF ( KSIZELBX_ll  /= 0 ) CALL IO_Field_read_lb( TPINIFILE, 'LBXTHM', IL3DX,  IRIMX,  PLBXTHM )
+IF ( KSIZELBY_ll  /= 0 ) CALL IO_Field_read_lb( TPINIFILE, 'LBYTHM', IL3DY,  IRIMY,  PLBYTHM )
+!
+!*        2.3  LB-TKE
+!
+SELECT CASE(HGETTKEM)                 
+CASE('READ') 
+  IF (.NOT. LCPL_AROME .AND. OLSOURCE) THEN
+    IF (PRESENT(PLBXTKEMM).AND.PRESENT(PLBYTKEMM)) THEN
+      CALL PRINT_MSG( NVERB_INFO, 'IO', 'INI_LB', 'LBXTKES and LBYTKE are initialized to PLBXTKEMM and PLBYTKEMM' )
+      PLBXTKEM(:,:,:) = PLBXTKEMM(:,:,:)    
+      PLBYTKEM(:,:,:) = PLBYTKEMM(:,:,:)
+    ELSE
+      CALL PRINT_MSG(NVERB_FATAL,'GEN','INI_LB','problem to initialize LBXTKES and LBYTKES')
+    ENDIF
+  ELSE
+    CALL IO_Field_read(TPINIFILE,'HORELAX_TKE',GHORELAX_TKE)
+    IF (GHORELAX_TKE) THEN 
+      IRIMX=(KSIZELBXTKE_ll-2*JPHEXT)/2   
+      IRIMY=(KSIZELBYTKE_ll-2*JPHEXT)/2
+      IL3DX=2*ILBSIZEX+2*JPHEXT
+      IL3DY=2*ILBSIZEY+2*JPHEXT
+    ELSE
+      IRIMX=0
+      IRIMY=0
+      IL3DX=2*JPHEXT ! 2
+      IL3DY=2*JPHEXT ! 2
+    ENDIF
+!
+    IF (KSIZELBXTKE_ll /= 0) THEN
+      CALL IO_Field_read_lb(TPINIFILE,'LBXTKEM',IL3DX,IRIMX,PLBXTKEM)
+    END IF
+!
+    IF (KSIZELBYTKE_ll /= 0) THEN  
+      CALL IO_Field_read_lb(TPINIFILE,'LBYTKEM',IL3DY,IRIMY,PLBYTKEM)
+    END IF
+  ENDIF
+CASE('INIT')
+  IF (SIZE(PLBXTKEM,1) /= 0) PLBXTKEM(:,:,:) = XTKEMIN
+  IF (SIZE(PLBYTKEM,1) /= 0) PLBYTKEM(:,:,:) = XTKEMIN
+END SELECT
+!
+! 
+!*        2.5 LB-Rx
+!
+IF(KSIZELBXR_ll  > 0 ) THEN
+  TZFIELD = TFIELDMETADATA(                                      &
+    CMNHNAME   = 'HORELAX_R',                                    &
+    CSTDNAME   = '',                                             &
+    CLONGNAME  = 'HORELAX_R',                                    &
+    CUNITS     = '',                                             &
+    CDIR       = '--',                                           &
+    CCOMMENT   = 'Switch to activate the HOrizontal RELAXation', &
+    CLBTYPE    = 'NONE',                                         &
+    NGRID      = 1,                                              &
+    NTYPE      = TYPELOG,                                        &
+    NDIMS      = 0,                                              &
+    LTIMEDEP   = .FALSE.                                         )
+  !
+  CALL IO_Field_read(TPINIFILE,TZFIELD,GHORELAX_R)
+  !
+  YGETRXM(:)=(/HGETRVM,HGETRCM,HGETRRM,HGETRIM,HGETRSM,HGETRGM,HGETRHM/)
+  YC(:)=(/"V","C","R","I","S","G","H"/)
+  IF (GHORELAX_R) THEN 
+    IRIMX=(KSIZELBXR_ll-2*JPHEXT)/2  
+    IRIMY= (KSIZELBYR_ll-2*JPHEXT)/2  
+    IL3DX=2*ILBSIZEX+2*JPHEXT
+    IL3DY=2*ILBSIZEY+2*JPHEXT
+  ELSE
+    IRIMX=0
+    IRIMY=0
+    IL3DX=2*JPHEXT ! 2
+    IL3DY=2*JPHEXT ! 2
+  END IF
+  !
+  TZFIELD = TFIELDMETADATA( &
+    CUNITS     = 'kg kg-1', &
+    CDIR       = '',        &
+    NGRID      = 1,         &
+    NTYPE      = TYPEREAL,  &
+    NDIMS      = 3,         &
+    LTIMEDEP   = .TRUE.     )
+  !
+  IRR=0
+  JRR=1
+  SELECT CASE(YGETRXM(1))                 
+    CASE('READ') 
+      IRR=IRR+1 
+      IF ( KSIZELBXR_ll  /= 0 ) THEN
+        TZFIELD%CMNHNAME   = 'LBXR'//YC(JRR)//'M'
+        TZFIELD%CLONGNAME  = 'LBXR'//YC(JRR)//'M'
+        TZFIELD%CLBTYPE    = 'LBX'
+        TZFIELD%CCOMMENT   = '2_Y_Z_LBXR'//YC(JRR)//'M'
+        CALL IO_Field_read_lb(TPINIFILE,TZFIELD,IL3DX,IRIMX,PLBXRM(:,:,:,IRR))
+      END IF
+      !
+      IF ( KSIZELBYR_ll /= 0 ) THEN
+        TZFIELD%CMNHNAME   = 'LBYR'//YC(JRR)//'M'
+        TZFIELD%CLONGNAME  = 'LBYR'//YC(JRR)//'M'
+        TZFIELD%CLBTYPE    = 'LBY'
+        TZFIELD%CCOMMENT   = '2_Y_Z_LBYR'//YC(JRR)//'M'
+        CALL IO_Field_read_lb(TPINIFILE,TZFIELD,IL3DY,IRIMY,PLBYRM(:,:,:,IRR))
+      END IF
+    CASE('INIT')
+      IRR=IRR+1 
+      IF ( SIZE(PLBXRM,1) /= 0 )  PLBXRM(:,:,:,IRR) = 0.
+      IF ( SIZE(PLBYRM,1) /= 0 )  PLBYRM(:,:,:,IRR) = 0.
+  END SELECT
+    !
+    !
+  DO JRR=2,7
+    SELECT CASE(YGETRXM(JRR))                 
+    CASE('READ') 
+      IRR=IRR+1 
+      IF ( KSIZELBXR_ll  /= 0 ) THEN
+        IF (.NOT. LCPL_AROME .AND. OLSOURCE) THEN
+            IF (PRESENT(PLBXRMM)) THEN
+              PLBXRM(:,:,:,IRR)=PLBXRMM(:,:,:,IRR)
+              CALL PRINT_MSG( NVERB_INFO, 'IO', 'INI_LB', 'PLBXRM is initialized to PLBXRMM for LBXR'//YC(JRR)//'M' )
+            ELSE
+              CALL PRINT_MSG(NVERB_FATAL,'GEN','INI_LB','problem to initialize PLBXRM for LBXR'//YC(JRR)//'M')
+            ENDIF
+        ELSE
+          TZFIELD%CMNHNAME   = 'LBXR'//YC(JRR)//'M'
+          TZFIELD%CLONGNAME  = 'LBXR'//YC(JRR)//'M'
+          TZFIELD%CLBTYPE    = 'LBX'
+          TZFIELD%CCOMMENT   = '2_Y_Z_LBXR'//YC(JRR)//'M'
+          CALL IO_Field_read_lb(TPINIFILE,TZFIELD,IL3DX,IRIMX,PLBXRM(:,:,:,IRR))
+        ENDIF
+      END IF
+      !
+      IF ( KSIZELBYR_ll /= 0 ) THEN
+        IF (.NOT. LCPL_AROME .AND. OLSOURCE) THEN
+            IF (PRESENT(PLBYRMM)) THEN
+              PLBYRM(:,:,:,IRR)=PLBYRMM(:,:,:,IRR)
+              CALL PRINT_MSG( NVERB_INFO, 'IO', 'INI_LB', 'PLBYRM is initialized to PLBYRMM for LBYR'//YC(JRR)//'M' )
+            ELSE
+              CALL PRINT_MSG(NVERB_FATAL,'GEN','INI_LB','problem to initialize PLBYRM for LBYR'//YC(JRR)//'M')
+            ENDIF
+         ELSE
+           TZFIELD%CMNHNAME   = 'LBYR'//YC(JRR)//'M'
+           TZFIELD%CLONGNAME  = 'LBYR'//YC(JRR)//'M'
+           TZFIELD%CLBTYPE    = 'LBY'
+           TZFIELD%CCOMMENT   = '2_Y_Z_LBYR'//YC(JRR)//'M'
+           CALL IO_Field_read_lb(TPINIFILE,TZFIELD,IL3DY,IRIMY,PLBYRM(:,:,:,IRR))
+         ENDIF
+       END IF
+    CASE('INIT')
+      IRR=IRR+1 
+      IF ( SIZE(PLBXRM,1) /= 0 )  PLBXRM(:,:,:,IRR) = 0.
+      IF ( SIZE(PLBYRM,1) /= 0 )  PLBYRM(:,:,:,IRR) = 0.
+    END SELECT
+  END DO
+END IF
+!
+!*        2.6    LB-Scalar Variables
+!
+IF (KSV > 0) THEN
+  IF (ANY(HGETSVM(1:KSV)=='READ')) THEN
+    TZFIELD = TFIELDMETADATA(    &
+      CMNHNAME   = 'HORELAX_SV', &
+      CSTDNAME   = '',           &
+      CLONGNAME  = 'HORELAX_SV', &
+      CUNITS     = '',           &
+      CDIR       = '--',         &
+      CCOMMENT   = '',           &
+      CLBTYPE    = 'NONE',       &
+      NGRID      = 0,            &
+      NTYPE      = TYPELOG,      &
+      NDIMS      = 0,            &
+      LTIMEDEP   = .FALSE.       )
+    CALL IO_Field_read( TPINIFILE, TZFIELD, GHORELAX_SV )
+
+    IF ( GHORELAX_SV ) THEN
+      IRIMX=(KSIZELBXSV_ll-2*JPHEXT)/2
+      IRIMY=(KSIZELBYSV_ll-2*JPHEXT)/2
+      IL3DX=2*ILBSIZEX+2*JPHEXT
+      IL3DY=2*ILBSIZEY+2*JPHEXT
+    ELSE
+      IRIMX=0
+      IRIMY=0
+      IL3DX=2*JPHEXT
+      IL3DY=2*JPHEXT
+    END IF
+  END IF
+END IF
+
+! Scalar variables
+DO JSV = 1, NSV
+  SELECT CASE( HGETSVM(JSV) )
+    CASE ( 'READ' )
+      TZFIELD = TSVLIST(JSV)
+      TZFIELD%CDIR = ''
+      TZFIELD%NDIMLIST(:) = NMNHDIM_UNKNOWN
+      YMNHNAME_BASE  = TRIM( TZFIELD%CMNHNAME  )
+      YLONGNAME_BASE = TRIM( TZFIELD%CLONGNAME )
+
+      IF ( KSIZELBXSV_ll /= 0 ) THEN
+        TZFIELD%CMNHNAME  = 'LBX_' // TRIM( YMNHNAME_BASE  )
+        TZFIELD%CLONGNAME = 'LBX_' // TRIM( YLONGNAME_BASE )
+
+        !Some variables were written with an other name in MesoNH < 5.6
+        IF ( GOLDFILEFORMAT ) THEN
+          IF ( JSV >= 1 .AND. JSV <= NSV_USER ) THEN
+            WRITE( TZFIELD%CMNHNAME, '( A6, I3.3 )' ) 'LBXSVM',JSV
+            TZFIELD%CSTDNAME  = ''
+            TZFIELD%CLONGNAME = TRIM( TZFIELD%CMNHNAME )
+          ELSE IF ( JSV >= NSV_LIMA_BEG .AND. JSV <= NSV_LIMA_END ) THEN
+            ! Name was corrected in MNH 5.5.1
+            IF ( .NOT. GIS551 ) CALL OLD_CMNHNAME_GENERATE_INTERN( TZFIELD%CMNHNAME, TZFIELD%CLONGNAME )
+            TZFIELD%CSTDNAME  = ''
+          ELSE IF ( JSV >= NSV_PPBEG .AND. JSV <= NSV_PPEND ) THEN
+            TZFIELD%CMNHNAME  = 'LBX_PP'
+            TZFIELD%CSTDNAME  = ''
+            TZFIELD%CLONGNAME = 'LBX_PP'
+            IF ( JSV == NSV_PPBEG .AND. NSV_PP > 1 ) THEN
+              CMNHMSG(1) = 'reading older file (<5.6) for LBX_PP scalar variables'
+              CMNHMSG(2) = 'they are bugged: there should be several LBX_PP variables'
+              CMNHMSG(3) = 'but they were all written with the same name ''LBX_PP'''
+              CALL PRINT_MSG( NVERB_WARNING, 'IO', 'INI_LB' )
+            END IF
+#ifdef MNH_FOREFIRE
+          ELSE IF ( JSV >= NSV_FFBEG .AND. JSV <= NSV_FFEND ) THEN
+            TZFIELD%CMNHNAME  = 'LBX_FF'
+            TZFIELD%CSTDNAME  = ''
+            TZFIELD%CLONGNAME = 'LBX_FF'
+            IF ( JSV == NSV_FFBEG .AND. NSV_FF > 1 ) THEN
+              CMNHMSG(1) = 'reading older file (<5.6) for LBX_FF scalar variables'
+              CMNHMSG(2) = 'they are bugged: there should be several LBX_FF variables'
+              CMNHMSG(3) = 'but they were all written with the same name ''LBX_FF'''
+              CALL PRINT_MSG( NVERB_WARNING, 'IO', 'INI_LB' )
+            END IF
+#endif
+          ELSE IF ( JSV >= NSV_CSBEG .AND. JSV <= NSV_CSEND ) THEN
+            TZFIELD%CMNHNAME  = 'LBX_CS'
+            TZFIELD%CSTDNAME  = ''
+            TZFIELD%CLONGNAME = 'LBX_CS'
+            IF ( JSV == NSV_CSBEG .AND. NSV_CS > 1 ) THEN
+              CMNHMSG(1) = 'reading older file (<5.6) for LBX_CS scalar variables'
+              CMNHMSG(2) = 'they are bugged: there should be several LBX_CS variables'
+              CMNHMSG(3) = 'but they were all written with the same name ''LBX_CS'''
+              CALL PRINT_MSG( NVERB_WARNING, 'IO', 'INI_LB' )
+            END IF
+          END IF
+        END IF
+
+        WRITE( TZFIELD%CCOMMENT, '( A6, A6, I3.3 )' ) '2_Y_Z_', 'LBXSVM', JSV
+        TZFIELD%CLBTYPE     = 'LBX'
+
+        CALL IO_Field_read_lb( TPINIFILE, TZFIELD, IL3DX, IRIMX, PLBXSVM(:,:,:,JSV), IRESP )
+
+        IF ( IRESP /= 0 ) THEN
+          IF ( PRESENT( PLBXSVMM ) ) THEN
+            PLBXSVM(:,:,:,JSV) = PLBXSVMM(:,:,:,JSV)
+            CALL PRINT_MSG( NVERB_INFO, 'IO', 'INI_LB', 'PLBXSVM is initialized to PLBXSVMM for ' // TRIM( YMNHNAME_BASE ) )
+          ELSE
+            IF ( JSV >= NSV_LIMA_BEG .AND. JSV <= NSV_LIMA_END ) THEN
+               PLBXSVM(:,:,:,JSV) = 0.
+               CALL PRINT_MSG( NVERB_WARNING, 'IO', 'INI_LB', 'PLBXSVM is initialized to 0 for ' // TRIM( YMNHNAME_BASE ) )
+            ELSE IF ( ( JSV >= NSV_PPBEG  .AND. JSV <= NSV_PPEND ) .OR. &
+#ifdef MNH_FOREFIRE
+                      ( JSV >= NSV_FFBEG  .AND. JSV <= NSV_FFEND ) .OR. &
+#endif
+                      ( JSV >= NSV_CSBEG  .AND. JSV <= NSV_CSEND ) .OR. &
+                      ( JSV >= NSV_SNWBEG .AND. JSV <= NSV_SNWEND .AND. GOLDFILEFORMAT ) ) THEN !Snow was not written in <5.6
+              PLBXSVM(:,:,:,JSV) = 0.
+              CALL PRINT_MSG( NVERB_WARNING, 'IO', 'INI_LB', 'PLBXSVM is initialized to 0 for ' // TRIM( YMNHNAME_BASE ) )
+            ELSE
+              CALL PRINT_MSG( NVERB_FATAL, 'IO', 'INI_LB', 'problem to initialize PLBXSVM for ' // TRIM( YMNHNAME_BASE ) )
+            END IF
+          END IF
+        END IF
+      END IF
+
+      IF ( KSIZELBYSV_ll /= 0 ) THEN
+        TZFIELD%CMNHNAME  = 'LBY_' // TRIM( YMNHNAME_BASE  )
+        TZFIELD%CLONGNAME = 'LBY_' // TRIM( YLONGNAME_BASE )
+
+        !Some variables were written with an other name in MesoNH < 5.6
+        IF ( GOLDFILEFORMAT ) THEN
+          IF ( JSV >= 1 .AND. JSV <= NSV_USER ) THEN
+            WRITE( TZFIELD%CMNHNAME, '( A6, I3.3 )' ) 'LBYSVM',JSV
+            TZFIELD%CSTDNAME  = ''
+            TZFIELD%CLONGNAME = TRIM( TZFIELD%CMNHNAME )
+          ELSE IF ( JSV >= NSV_LIMA_BEG .AND. JSV <= NSV_LIMA_END ) THEN
+            ! Name was corrected in MNH 5.5.1
+            IF ( .NOT. GIS551 ) CALL OLD_CMNHNAME_GENERATE_INTERN( TZFIELD%CMNHNAME, TZFIELD%CLONGNAME )
+            TZFIELD%CSTDNAME  = ''
+          ELSE IF ( JSV >= NSV_PPBEG .AND. JSV <= NSV_PPEND ) THEN
+            TZFIELD%CMNHNAME  = 'LBY_PP'
+            TZFIELD%CSTDNAME  = ''
+            TZFIELD%CLONGNAME = 'LBY_PP'
+            IF ( JSV == NSV_PPBEG .AND. NSV_PP > 1 ) THEN
+              CMNHMSG(1) = 'reading older file (<5.6) for LBY_PP scalar variables'
+              CMNHMSG(2) = 'they are bugged: there should be several LBY_PP variables'
+              CMNHMSG(3) = 'but they were all written with the same name ''LBY_PP'''
+              CALL PRINT_MSG( NVERB_WARNING, 'IO', 'INI_LB' )
+            END IF
+#ifdef MNH_FOREFIRE
+          ELSE IF ( JSV >= NSV_FFBEG .AND. JSV <= NSV_FFEND ) THEN
+            TZFIELD%CMNHNAME  = 'LBY_FF'
+            TZFIELD%CSTDNAME  = ''
+            TZFIELD%CLONGNAME = 'LBY_FF'
+            IF ( JSV == NSV_FFBEG .AND. NSV_FF > 1 ) THEN
+              CMNHMSG(1) = 'reading older file (<5.6) for LBY_FF scalar variables'
+              CMNHMSG(2) = 'they are bugged: there should be several LBY_FF variables'
+              CMNHMSG(3) = 'but they were all written with the same name ''LBY_FF'''
+              CALL PRINT_MSG( NVERB_WARNING, 'IO', 'INI_LB' )
+            END IF
+#endif
+          ELSE IF ( JSV >= NSV_CSBEG .AND. JSV <= NSV_CSEND ) THEN
+            TZFIELD%CMNHNAME  = 'LBY_CS'
+            TZFIELD%CSTDNAME  = ''
+            TZFIELD%CLONGNAME = 'LBY_CS'
+            IF ( JSV == NSV_CSBEG .AND. NSV_CS > 1 ) THEN
+              CMNHMSG(1) = 'reading older file (<5.6) for LBY_CS scalar variables'
+              CMNHMSG(2) = 'they are bugged: there should be several LBY_CS variables'
+              CMNHMSG(3) = 'but they were all written with the same name ''LBY_CS'''
+              CALL PRINT_MSG( NVERB_WARNING, 'IO', 'INI_LB' )
+            END IF
+          END IF
+        END IF
+        WRITE( TZFIELD%CCOMMENT, '( A6, A6, I3.3 )' ) 'X_2_Z_', 'LBYSVM', JSV
+        TZFIELD%CLBTYPE     = 'LBY'
+
+        CALL IO_Field_read_lb( TPINIFILE, TZFIELD, IL3DY, IRIMY, PLBYSVM(:,:,:,JSV), IRESP )
+
+        IF ( IRESP /= 0 ) THEN
+          IF ( PRESENT( PLBYSVMM ) ) THEN
+            PLBYSVM(:,:,:,JSV) = PLBYSVMM(:,:,:,JSV)
+            CALL PRINT_MSG( NVERB_INFO, 'IO', 'INI_LB', 'PLBYSVM is initialized to PLBYSVMM for ' // TRIM( YMNHNAME_BASE ) )
+          ELSE
+            IF ( JSV >= NSV_LIMA_BEG .AND. JSV <= NSV_LIMA_END ) THEN
+              PLBYSVM(:,:,:,JSV) = 0.
+              CALL PRINT_MSG( NVERB_WARNING, 'IO', 'INI_LB', 'PLBYSVM is initialized to 0 for ' // TRIM( YMNHNAME_BASE ) )
+            ELSE IF ( ( JSV >= NSV_PPBEG  .AND. JSV <= NSV_PPEND ) .OR. &
+#ifdef MNH_FOREFIRE
+                      ( JSV >= NSV_FFBEG  .AND. JSV <= NSV_FFEND ) .OR. &
+#endif
+                      ( JSV >= NSV_CSBEG  .AND. JSV <= NSV_CSEND ) .OR. &
+                      ( JSV >= NSV_SNWBEG .AND. JSV <= NSV_SNWEND .AND. GOLDFILEFORMAT ) ) THEN !Snow was not written in <5.6
+              PLBYSVM(:,:,:,JSV) = 0.
+              CALL PRINT_MSG( NVERB_WARNING, 'IO', 'INI_LB', 'PLBYSVM is initialized to 0 for ' // TRIM( YMNHNAME_BASE ) )
+            ELSE
+              CALL PRINT_MSG( NVERB_FATAL, 'IO', 'INI_LB', 'problem to initialize PLBYSVM for ' // TRIM( YMNHNAME_BASE ) )
+            END IF
+          END IF
+        END IF
+      END IF
+
+    CASE( 'INIT' )
+      IF ( SIZE(PLBXSVM,1) /= 0 ) PLBXSVM(:,:,:,JSV) = 0.
+      IF ( SIZE(PLBYSVM,1) /= 0 ) PLBYSVM(:,:,:,JSV) = 0.
+  END SELECT
+END DO
+!-------------------------------------------------------------------------------
+!
+!*       3.    COMPUTE THE LB SOURCES
+!              -----------------------
+!
+! IN case of initialization of LB source terms (OLSOURCE=T) :
+! xxxM are LB source terms 
+! xxxMM are LB fields at time t -dt 
+IF (OLSOURCE) THEN 
+  IF (PRESENT(PLBXUMM).AND.PRESENT(PLBYUMM)) THEN
+    PLBXUM(:,:,:) = (PLBXUM(:,:,:) - PLBXUMM(:,:,:))   / PLENG
+    PLBYUM(:,:,:) = (PLBYUM(:,:,:) - PLBYUMM(:,:,:))   / PLENG
+  ENDIF
+  IF (PRESENT(PLBXVMM).AND.PRESENT(PLBYVMM)) THEN
+    PLBXVM(:,:,:) = (PLBXVM(:,:,:) - PLBXVMM(:,:,:))   / PLENG
+    PLBYVM(:,:,:) = (PLBYVM(:,:,:) - PLBYVMM(:,:,:))   / PLENG
+  ENDIF
+  IF (PRESENT(PLBXWMM).AND.PRESENT(PLBYWMM)) THEN 
+    PLBXWM(:,:,:) = (PLBXWM(:,:,:) - PLBXWMM(:,:,:))   / PLENG
+    PLBYWM(:,:,:) = (PLBYWM(:,:,:) - PLBYWMM(:,:,:))   / PLENG
+  ENDIF
+   IF (PRESENT(PLBXTHMM).AND.PRESENT(PLBYTHMM)) THEN 
+    PLBXTHM(:,:,:) = (PLBXTHM(:,:,:) - PLBXTHMM(:,:,:))   / PLENG
+    PLBYTHM(:,:,:) = (PLBYTHM(:,:,:) - PLBYTHMM(:,:,:))   / PLENG
+  ENDIF
+  IF (HGETTKEM =='READ') THEN
+    IF (PRESENT(PLBXTKEMM).AND.PRESENT(PLBYTKEMM)) THEN 
+      PLBXTKEM(:,:,:) = (PLBXTKEM(:,:,:) - PLBXTKEMM(:,:,:))   / PLENG
+      PLBYTKEM(:,:,:) = (PLBYTKEM(:,:,:) - PLBYTKEMM(:,:,:))   / PLENG
+    ENDIF
+  ENDIF
+  IF (HGETTKEM =='INIT') THEN
+      PLBXTKEM(:,:,:) = 0.
+      PLBYTKEM(:,:,:) = 0.
+  ENDIF
+! LB moist variables 
+  IRR=0
+  IF (PRESENT(PLBXRMM).AND.PRESENT(PLBYRMM))   THEN      
+    DO JRR=1,7
+      IF (YGETRXM(JRR) == 'READ') THEN      
+        IRR=IRR+1  
+        PLBXRM(:,:,:,IRR) = (PLBXRM(:,:,:,IRR) - PLBXRMM(:,:,:,IRR))   / PLENG
+        PLBYRM(:,:,:,IRR) = (PLBYRM(:,:,:,IRR) - PLBYRMM(:,:,:,IRR))   / PLENG  
+      ENDIF
+    END DO
+  ENDIF
+! LB-scalar variables
+  DO JSV=1,KSV
+    IF (HGETSVM(JSV) == 'READ') THEN   
+      PLBXSVM(:,:,:,JSV) = (PLBXSVM(:,:,:,JSV) - PLBXSVMM(:,:,:,JSV))   / PLENG
+      PLBYSVM(:,:,:,JSV) = (PLBYSVM(:,:,:,JSV) - PLBYSVMM(:,:,:,JSV))   / PLENG 
+    ENDIF
+  END DO
+!
+ENDIF
+!
+CONTAINS
+
+  SUBROUTINE OLD_CMNHNAME_GENERATE_INTERN( YMNHNAME, YLONGNAME )
+
+    CHARACTER(LEN=*), INTENT(INOUT) :: YMNHNAME
+    CHARACTER(LEN=*), INTENT(INOUT) :: YLONGNAME
+
+    INTEGER :: IPOS
+    INTEGER :: JI
+
+    !Try to generate CMNHNAME with old format
+    !In the old format, an indice of 2 numbers was written after the name but without trimming it
+    IPOS = SCAN( YMNHNAME, '0123456789' )
+
+    !Unmodified part YMNHNAME(1:IPOS-1) = YMNHNAME(1:IPOS-1)
+
+    !Move number part at the new end
+    IF ( 4+JPSVNAMELGTMAX+2 > LEN( YMNHNAME ) ) &
+      CALL PRINT_MSG(NVERB_FATAL,'GEN','OLD_CMNHNAME_GENERATE_INTERN','CMNHNAME too small')
+    YMNHNAME(4+JPSVNAMELGTMAX+1 : 4+JPSVNAMELGTMAX+2) = YMNHNAME(IPOS : IPOS+1)
+    DO JI = IPOS, 4+JPSVNAMELGTMAX
+      YMNHNAME(JI:JI) = ' '
+    END DO
+
+    YLONGNAME = TRIM( YMNHNAME )
+
+  END SUBROUTINE OLD_CMNHNAME_GENERATE_INTERN
+
+END SUBROUTINE INI_LB
diff --git a/src/PHYEX/ext/ini_lesn.f90 b/src/PHYEX/ext/ini_lesn.f90
new file mode 100644
index 0000000000000000000000000000000000000000..7caf12b44211de2f69700fbab021a42486aa40a7
--- /dev/null
+++ b/src/PHYEX/ext/ini_lesn.f90
@@ -0,0 +1,1995 @@
+!MNH_LIC Copyright 2000-2022 CNRS, Meteo-France and Universite Paul Sabatier
+!MNH_LIC This is part of the Meso-NH software governed by the CeCILL-C licence
+!MNH_LIC version 1. See LICENSE, CeCILL-C_V1-en.txt and CeCILL-C_V1-fr.txt
+!MNH_LIC for details. version 1.
+!-----------------------------------------------------------------
+!     ####################
+      SUBROUTINE  INI_LES_n
+!     ####################
+!
+!
+!!****  *INI_LES_n* initializes the LES variables for model _n
+!!
+!!    PURPOSE
+!!    -------
+!!
+!!    EXTERNAL
+!!    --------
+!!
+!!    IMPLICIT ARGUMENTS
+!!    ------------------
+!!
+!!    REFERENCE
+!!    ---------
+!!
+!!    AUTHOR
+!!    ------
+!!      V. Masson
+!!
+!!    MODIFICATIONS
+!!    -------------
+!!      Original         07/02/00
+!!      Modification     01/02/01 (D.Gazen) add module MODD_NSV for NSV variable
+!!                       06/11/02 (V. Masson) add LES budgets
+!!                    10/2016 (C.Lac) Add droplet deposition
+!!  Philippe Wautelet: 05/2016-04/2018: new data structures and calls for I/O
+!!                     02/2019 (C. Lac) Add rain fraction as a LES diagnostic
+!  P. Wautelet 10/04/2019: replace ABORT and STOP calls by Print_msg
+!  P. Wautelet 13/09/2019: budget: simplify and modernize date/time management
+!  P. Wautelet 12/08/2020: bugfix: use NUNDEF instead of XUNDEF for integer variables
+!  P. Wautelet 04/01/2021: bugfix: nles_k was used instead of nspectra_k for a loop index
+!  P. Wautelet 30/03/2021: budgets: LES cartesian subdomain limits are defined in the physical domain
+!  P. Wautelet 09/07/2021: bugfix: altitude levels are on the correct grid position (mass point)
+!  P. Wautelet 22/03/2022: LES averaging periods are more reliable (compute with integers instead of reals)
+! --------------------------------------------------------------------------
+!
+!*      0. DECLARATIONS
+!          ------------
+!
+USE MODE_MSG
+USE MODE_MODELN_HANDLER
+!
+USE MODD_LES
+USE MODD_LES_BUDGET
+USE MODD_LES_n
+!
+USE MODD_CONF
+USE MODD_PARAMETERS
+USE MODD_NESTING
+!
+USE MODD_LUNIT_n
+USE MODD_GRID_n
+USE MODD_DYN_n
+USE MODD_TIME_n
+USE MODD_DIM_n
+USE MODD_TURB_n
+USE MODD_CONF_n
+USE MODD_LBC_n
+USE MODD_PARAM_n
+USE MODD_DYN
+USE MODD_NSV, ONLY: NSV ! update_nsv is done in INI_MODEL
+USE MODD_CONDSAMP, ONLY : LCONDSAMP
+!
+USE MODI_INI_LES_CART_MASKn
+USE MODI_COEF_VER_INTERP_LIN
+USE MODI_SHUMAN
+!
+IMPLICIT NONE
+!
+!
+!*      0.1  declarations of arguments
+!
+!
+!
+!
+!       0.2  declaration of local variables
+!
+!
+!      
+INTEGER :: ILUOUT, IRESP
+INTEGER :: JI,JJ, JK ! loop counters
+!
+REAL, DIMENSION(:,:,:), ALLOCATABLE :: ZZ_LES ! LES altitudes 3D array
+REAL, DIMENSION(:,:,:), ALLOCATABLE :: ZZ_SPEC! " for spectra
+!
+!
+REAL, DIMENSION(:), POINTER :: ZXHAT_ll ! father model coordinates
+REAL, DIMENSION(:), POINTER :: ZYHAT_ll !
+INTEGER :: IMI
+!
+!-------------------------------------------------------------------------------
+IMI = GET_CURRENT_MODEL_INDEX()
+!
+ZXHAT_ll => NULL()
+ZYHAT_ll => NULL()
+!
+ILUOUT = TLUOUT%NLU
+!
+!-------------------------------------------------------------------------------
+!
+!*      1.   Does LES computations are used?
+!            ------------------------------
+!
+LLES = LLES_MEAN .OR. LLES_RESOLVED  .OR. LLES_SUBGRID .OR. LLES_UPDRAFT &
+                 .OR. LLES_DOWNDRAFT .OR. LLES_SPECTRA
+!
+!
+IF (.NOT. LLES) RETURN
+!
+IF (L1D) THEN
+  LLES_RESOLVED    = .FALSE.
+  LLES_UPDRAFT     = .FALSE.
+  LLES_DOWNDRAFT   = .FALSE.
+  LLES_SPECTRA     = .FALSE.
+  LLES_NEB_MASK    = .FALSE.
+  LLES_CORE_MASK   = .FALSE.
+  LLES_CS_MASK     = .FALSE.
+  LLES_MY_MASK     = .FALSE.
+END IF
+!
+IF (LLES_RESOLVED )  LLES_MEAN = .TRUE.
+IF (LLES_SUBGRID  )  LLES_MEAN = .TRUE.
+IF (LLES_UPDRAFT  )  LLES_MEAN = .TRUE.
+IF (LLES_DOWNDRAFT)  LLES_MEAN = .TRUE.
+IF (LLES_SPECTRA  )  LLES_MEAN = .TRUE.
+!
+IF (CTURB=='NONE') THEN
+  WRITE(ILUOUT,FMT=*) 'LES diagnostics cannot be done without subgrid turbulence.'
+  WRITE(ILUOUT,FMT=*) 'You have chosen CTURB="NONE". You must choose a turbulence scheme.'
+  call Print_msg( NVERB_FATAL, 'GEN', 'WRITE_LB_n', 'LES diagnostics cannot be done without subgrid turbulence' )
+END IF
+!-------------------------------------------------------------------------------
+!
+!*      2.   Number and definition of masks
+!            ------------------------------
+!
+!-------------------------------------------------------------------------------
+!
+!*      2.1  Cartesian (sub-)domain
+!            ----------------------
+!
+!* updates number of masks
+!  -----------------------
+!
+NLES_MASKS = 1
+!
+!* For model 1, set default values of cartesian mask, and defines cartesian mask
+!  -----------------------------------------------------------------------------
+!
+IF (IMI==1) THEN
+  IF ( LLES_CART_MASK ) THEN
+    !Compute LES diagnostics inside a cartesian mask
+
+    !Set default values to physical domain boundaries
+    IF ( NLES_IINF == NUNDEF ) NLES_IINF = 1
+    IF ( NLES_JINF == NUNDEF ) NLES_JINF = 1
+    IF ( NLES_ISUP == NUNDEF ) NLES_ISUP = NIMAX_ll
+    IF ( NLES_JSUP == NUNDEF ) NLES_JSUP = NJMAX_ll
+
+    !Check that selected indices are in physical domain
+    IF ( NLES_IINF < 1 )         CALL Print_msg( NVERB_ERROR, 'GEN', 'INI_LES_n', 'NLES_IINF too small (<1)' )
+    IF ( NLES_IINF > NIMAX_ll )  CALL Print_msg( NVERB_ERROR, 'GEN', 'INI_LES_n', 'NLES_IINF too large (>NIMAX)' )
+    IF ( NLES_ISUP < 1 )         CALL Print_msg( NVERB_ERROR, 'GEN', 'INI_LES_n', 'NLES_ISUP too small (<1)' )
+    IF ( NLES_ISUP > NIMAX_ll )  CALL Print_msg( NVERB_ERROR, 'GEN', 'INI_LES_n', 'NLES_ISUP too large (>NIMAX)' )
+    IF ( NLES_ISUP < NLES_IINF ) CALL Print_msg( NVERB_ERROR, 'BUD', 'INI_LES_n', 'NLES_ISUP < NLES_IINF' )
+
+    IF ( NLES_JINF < 1 )         CALL Print_msg( NVERB_ERROR, 'GEN', 'INI_LES_n', 'NLES_JINF too small (<1)' )
+    IF ( NLES_JINF > NJMAX_ll )  CALL Print_msg( NVERB_ERROR, 'GEN', 'INI_LES_n', 'NLES_JINF too large (>NJMAX)' )
+    IF ( NLES_JSUP < 1 )         CALL Print_msg( NVERB_ERROR, 'GEN', 'INI_LES_n', 'NLES_JSUP too small (<1)' )
+    IF ( NLES_JSUP > NJMAX_ll )  CALL Print_msg( NVERB_ERROR, 'GEN', 'INI_LES_n', 'NLES_JSUP too large (>NJMAX)' )
+    IF ( NLES_JSUP < NLES_JINF ) CALL Print_msg( NVERB_ERROR, 'BUD', 'INI_LES_n', 'NLES_JSUP < NLES_JINF' )
+
+    !Set LLES_CART_MASK to false if whole domain is selected
+    IF (       NLES_IINF == 1        .AND. NLES_JINF == 1        &
+         .AND. NLES_ISUP == NIMAX_ll .AND. NLES_ISUP == NJMAX_ll ) THEN
+      LLES_CART_MASK = .FALSE.
+    END IF
+  ELSE
+    !Compute LES diagnostics on whole physical domain
+    NLES_IINF = 1
+    NLES_JINF = 1
+    NLES_ISUP = NIMAX_ll
+    NLES_JSUP = NJMAX_ll
+  END IF
+  !
+  NLESn_IINF(1)= NLES_IINF
+  NLESn_ISUP(1)= NLES_ISUP
+  NLESn_JINF(1)= NLES_JINF
+  NLESn_JSUP(1)= NLES_JSUP
+!
+!* For other models, fits cartesian mask on model 1 mask
+!  -----------------------------------------------------
+!
+ELSE
+  ZXHAT_ll => XXHAT_ll !Use current (IMI) model XXHAT_ll
+  ZYHAT_ll => XYHAT_ll
+!
+  CALL GOTO_MODEL(NDAD(IMI))
+  CALL INI_LES_CART_MASK_n(IMI,ZXHAT_ll,ZYHAT_ll,          &
+                         NLESn_IINF(IMI),NLESn_JINF(IMI), &
+                         NLESn_ISUP(IMI),NLESn_JSUP(IMI)  )
+  CALL GOTO_MODEL(IMI)
+END IF
+!
+!* in non cyclic boundary conditions, limitiation of masks due to u and v grids
+!  ----------------------------------------------------------------------------
+!
+IF ( (.NOT. L1D) .AND. CLBCX(1)/='CYCL') THEN
+  NLESn_IINF(IMI) = MAX(NLESn_IINF(IMI),2)
+END IF
+IF ( (.NOT. L1D) .AND. (.NOT. L2D) .AND. CLBCY(1)/='CYCL') THEN
+  NLESn_JINF(IMI) = MAX(NLESn_JINF(IMI),2)
+END IF
+!
+!* X boundary conditions for 2points correlations computations
+!  -----------------------------------------------------------
+!
+IF ( CLBCX(1) == 'CYCL' .AND. NLESn_IINF(IMI) == 1 .AND. NLESn_ISUP(IMI) == NIMAX_ll ) THEN
+  CLES_LBCX(:,IMI) = 'CYCL'
+ELSE
+  CLES_LBCX(:,IMI) = 'OPEN'
+END IF
+!
+!* Y boundary conditions for 2points correlations computations
+!  -----------------------------------------------------------
+!
+IF ( CLBCY(1) == 'CYCL' .AND. NLESn_JINF(IMI) == 1 .AND. NLESn_JSUP(IMI) == NJMAX_ll ) THEN
+  CLES_LBCY(:,IMI) = 'CYCL'
+ELSE
+  CLES_LBCY(:,IMI) = 'OPEN'
+END IF
+!
+!-------------------------------------------------------------------------------
+!
+!*      2.2  Nebulosity mask
+!            ---------------
+!
+IF (.NOT. LUSERC .AND. .NOT. LUSERI) LLES_NEB_MASK = .FALSE.
+!
+IF (LLES_NEB_MASK) NLES_MASKS = NLES_MASKS + 2
+!
+!-------------------------------------------------------------------------------
+!
+!*      2.3  Cloud core mask
+!            ---------------
+!
+IF (.NOT. LUSERC .AND. .NOT. LUSERI) LLES_CORE_MASK = .FALSE.
+!
+IF (LLES_CORE_MASK) NLES_MASKS = NLES_MASKS + 2
+!
+!-------------------------------------------------------------------------------
+!
+!*      2.4  Conditional sampling mask
+!            -------------------------
+!
+IF (.NOT. LUSERC .AND. .NOT. LCONDSAMP) LLES_CS_MASK = .FALSE.
+!
+IF (LLES_CS_MASK) NLES_MASKS = NLES_MASKS + 3
+!
+!-------------------------------------------------------------------------------
+!
+!*      2.5  User mask
+!            ---------
+!
+IF (LLES_MY_MASK) NLES_MASKS = NLES_MASKS + NLES_MASKS_USER
+!
+!-------------------------------------------------------------------------------
+!
+!*      3.   Number of temporal LES samplings
+!            --------------------------------
+!
+!*      3.1  Default value
+!            -------------
+!
+IF (XLES_TEMP_SAMPLING == XUNDEF) THEN
+  IF (CTURBDIM=='3DIM') THEN
+    XLES_TEMP_SAMPLING =  60.
+  ELSE
+    XLES_TEMP_SAMPLING = 300.
+  END IF
+END IF
+!
+!*      3.2  Number of time steps between two calls
+!            --------------------------------------
+!
+NLES_DTCOUNT = MAX( NINT( XLES_TEMP_SAMPLING / XTSTEP ) , 1)
+
+!
+!*      3.3  Redefinition of the LES sampling time coherent with model time-step
+!            -------------------------------------------------------------------
+!
+! Note that this modifies XLES_TEMP_SAMPLING only for father model (model number 1)
+! For nested models (for which integration time step is an integer part of  father model)
+! the following operation does not change XLES_TEMP_SAMPLING. This way, LEs
+! sampling is done at the same instants for all models.
+!
+XLES_TEMP_SAMPLING = XTSTEP * NLES_DTCOUNT
+!
+!
+!*      3.4  number of temporal calls to LES routines
+!            ----------------------------------------
+!
+!
+NLES_TIMES = ( NINT( ( XSEGLEN - DYN_MODEL(1)%XTSTEP ) / XTSTEP ) ) / NLES_DTCOUNT
+!
+!*      3.5  current LES time counter
+!            ------------------------
+!
+NLES_TCOUNT = 0
+!
+!*      3.6  dates array for diachro
+!            ----------------------
+!
+allocate( tles_dates( nles_times ) )
+allocate( xles_times( nles_times ) )
+!
+!*      3.7  No data
+!            -------
+!
+IF (NLES_TIMES==0) THEN
+  LLES=.FALSE.
+  RETURN
+END IF
+!
+!*     3.8  Averaging
+!           ---------
+IF (     XLES_TEMP_MEAN_END   == XUNDEF &
+    .OR. XLES_TEMP_MEAN_START == XUNDEF &
+    .OR. XLES_TEMP_MEAN_STEP  == XUNDEF ) THEN
+  !No LES temporal averaging
+  NLES_MEAN_TIMES = 0
+  NLES_MEAN_STEP  = NNEGUNDEF
+  NLES_MEAN_START = NNEGUNDEF
+  NLES_MEAN_END   = NNEGUNDEF
+ELSE
+  !LES temporal averaging is enabled
+  !Ensure that XLES_TEMP_MEAN_END is not after segment end
+  XLES_TEMP_MEAN_END = MIN( XLES_TEMP_MEAN_END, XSEGLEN - DYN_MODEL(1)%XTSTEP )
+
+  NLES_MEAN_START = NINT( XLES_TEMP_MEAN_START / XTSTEP )
+
+  IF ( MODULO( NLES_MEAN_START, NLES_DTCOUNT ) /= 0 ) THEN
+    CMNHMSG(1) = 'XLES_TEMP_MEAN_START is not a multiple of XLES_TEMP_SAMPLING'
+    CMNHMSG(2) = 'LES averaging periods could be wrong'
+    CALL Print_msg( NVERB_WARNING, 'IO', 'INI_LES_n' )
+  END IF
+
+  NLES_MEAN_END = NINT( XLES_TEMP_MEAN_END / XTSTEP )
+
+  NLES_MEAN_STEP = NINT( XLES_TEMP_MEAN_STEP / XTSTEP )
+
+  IF ( NLES_MEAN_STEP < NLES_DTCOUNT ) &
+    CALL Print_msg( NVERB_ERROR, 'IO', 'INI_LES_n', 'XLES_TEMP_MEAN_STEP < XLES_TEMP_SAMPLING not allowed' )
+
+  IF ( MODULO( NLES_MEAN_STEP, NLES_DTCOUNT ) /= 0 ) THEN
+    CMNHMSG(1) = 'XLES_TEMP_MEAN_STEP is not a multiple of XLES_TEMP_SAMPLING'
+    CMNHMSG(2) = 'LES averaging periods could be wrong'
+    CALL Print_msg( NVERB_WARNING, 'IO', 'INI_LES_n' )
+  END IF
+
+  NLES_MEAN_TIMES = ( NLES_MEAN_END - NLES_MEAN_START ) / NLES_MEAN_STEP
+  !Add 1 averaging period if the last one is incomplete (for example: start=0., end=10., step=3.)
+  IF ( MODULO( NLES_MEAN_END - NLES_MEAN_START, NLES_MEAN_STEP ) > 0 ) NLES_MEAN_TIMES = NLES_MEAN_TIMES + 1
+END IF
+!-------------------------------------------------------------------------------
+!
+!*      4.   Number of vertical levels for local diagnostics
+!            -----------------------------------------------
+!
+NLES_K = 0
+!
+!*      4.1  Case of altitude levels (lowest priority)
+!            -----------------------
+!
+IF (ANY(XLES_ALTITUDES(:)/=XUNDEF)) THEN
+  NLES_K = COUNT (XLES_ALTITUDES(:)/=XUNDEF)
+  CLES_LEVEL_TYPE='Z'
+  !
+  ALLOCATE(XCOEFLIN_LES(SIZE(XZZ,1),SIZE(XZZ,2),NLES_K))
+  ALLOCATE(NKLIN_LES   (SIZE(XZZ,1),SIZE(XZZ,2),NLES_K))
+  !
+  ALLOCATE(ZZ_LES      (SIZE(XZZ,1),SIZE(XZZ,2),NLES_K))
+  DO JK=1,NLES_K
+    DO JJ=1,SIZE(XZZ,2)
+      DO JI=1,SIZE(XZZ,1)
+        ZZ_LES(JI,JJ,JK) = XLES_ALTITUDES(JK)
+      END DO
+    END DO
+  END DO
+  CALL COEF_VER_INTERP_LIN(MZF(XZZ),ZZ_LES,NKLIN_LES,XCOEFLIN_LES)
+  !
+  DEALLOCATE(ZZ_LES)
+END IF
+!
+!
+!*      4.2  Case of model levels (highest priority)
+!            --------------------
+!
+IF (ANY(NLES_LEVELS(:)/=NUNDEF)) THEN
+  DO JK = 1, SIZE( NLES_LEVELS )
+    IF ( NLES_LEVELS(JK) /= NUNDEF ) THEN
+      IF ( NLES_LEVELS(JK) < 1 )     CALL Print_msg( NVERB_ERROR, 'GEN', 'INI_LES_n', 'NLES_LEVELS too small (<1)' )
+      IF ( NLES_LEVELS(JK) > NKMAX ) CALL Print_msg( NVERB_ERROR, 'GEN', 'INI_LES_n', 'NLES_LEVELS too large (>NKMAX)' )
+    END IF
+  END DO
+
+  NLES_K = COUNT (NLES_LEVELS(:)/=NUNDEF)
+  CLES_LEVEL_TYPE='K'
+ELSE
+  IF (NLES_K==0) THEN
+    NLES_K = MIN(SIZE(NLES_LEVELS),NKMAX)
+    CLES_LEVEL_TYPE='K'
+    DO JK=1,NLES_K
+      NLES_LEVELS(JK) = JK
+    END DO
+  END IF
+END IF
+!
+!-------------------------------------------------------------------------------
+!
+!*      5.   Number of vertical levels for non-local diagnostics
+!            ---------------------------------------------------
+!
+NSPECTRA_K = 0
+CSPECTRA_LEVEL_TYPE='N'
+!
+!
+!*      5.1  Case of altitude levels (medium priority)
+!            -----------------------
+!
+IF (ANY(XSPECTRA_ALTITUDES(:)/=XUNDEF)) THEN
+  NSPECTRA_K = COUNT (XSPECTRA_ALTITUDES(:)/=XUNDEF)
+  CSPECTRA_LEVEL_TYPE='Z'
+  !
+  ALLOCATE(XCOEFLIN_SPEC(SIZE(XZZ,1),SIZE(XZZ,2),NSPECTRA_K))
+  ALLOCATE(NKLIN_SPEC   (SIZE(XZZ,1),SIZE(XZZ,2),NSPECTRA_K))
+  !
+  ALLOCATE(ZZ_SPEC      (SIZE(XZZ,1),SIZE(XZZ,2),NSPECTRA_K))
+  DO JK=1,NSPECTRA_K
+    DO JJ=1,SIZE(XZZ,2)
+      DO JI=1,SIZE(XZZ,1)
+        ZZ_SPEC(JI,JJ,JK) = XSPECTRA_ALTITUDES(JK)
+      END DO
+    END DO
+  END DO
+  CALL COEF_VER_INTERP_LIN(XZZ,ZZ_SPEC,NKLIN_SPEC,XCOEFLIN_SPEC)
+  !
+  DEALLOCATE(ZZ_SPEC)
+END IF
+!
+!
+!*      5.2  Case of model levels (highest priority)
+!            --------------------
+!
+IF (ANY(NSPECTRA_LEVELS(:)/=NUNDEF)) THEN
+  DO JK = 1, SIZE( NSPECTRA_LEVELS )
+    IF ( NSPECTRA_LEVELS(JK) /= NUNDEF ) THEN
+      IF ( NSPECTRA_LEVELS(JK) < 1 )     CALL Print_msg( NVERB_ERROR, 'GEN', 'INI_LES_n', 'NSPECTRA_LEVELS too small (<1)' )
+      IF ( NSPECTRA_LEVELS(JK) > NKMAX ) CALL Print_msg( NVERB_ERROR, 'GEN', 'INI_LES_n', 'NSPECTRA_LEVELS too large (>NKMAX)' )
+    END IF
+  END DO
+
+  NSPECTRA_K = COUNT (NSPECTRA_LEVELS(:)/=NUNDEF)
+  CSPECTRA_LEVEL_TYPE='K'
+END IF
+!
+!-------------------------------------------------------------------------------
+!
+!*      6.   Number of horizontal wavelengths for non-local diagnostics
+!            ----------------------------------------------------------
+!
+NSPECTRA_NI = NLESn_ISUP(IMI) - NLESn_IINF(IMI) + 1
+NSPECTRA_NJ = NLESn_JSUP(IMI) - NLESn_JINF(IMI) + 1
+!
+!
+!-------------------------------------------------------------------------------
+!
+!*      7.   Allocations of temporal series of local diagnostics
+!            ---------------------------------------------------
+!
+!*      7.0  Altitude levels
+!            ---------------
+!
+ALLOCATE(XLES_Z  (NLES_K))
+!
+!*      7.1  Averaging control variables
+!            ---------------------------
+!
+ALLOCATE(NLES_AVG_PTS_ll (NLES_K,NLES_TIMES,NLES_MASKS))
+ALLOCATE(NLES_UND_PTS_ll (NLES_K,NLES_TIMES,NLES_MASKS))
+!
+NLES_AVG_PTS_ll = NUNDEF
+NLES_UND_PTS_ll = NUNDEF
+!
+!
+!*      7.2  Horizontally mean variables
+!            ---------------------------
+!
+ALLOCATE(XLES_MEAN_U  (NLES_K,NLES_TIMES,NLES_MASKS))
+ALLOCATE(XLES_MEAN_V  (NLES_K,NLES_TIMES,NLES_MASKS))
+ALLOCATE(XLES_MEAN_W  (NLES_K,NLES_TIMES,NLES_MASKS))
+ALLOCATE(XLES_MEAN_P  (NLES_K,NLES_TIMES,NLES_MASKS))
+ALLOCATE(XLES_MEAN_DP  (NLES_K,NLES_TIMES,NLES_MASKS))
+ALLOCATE(XLES_MEAN_TP  (NLES_K,NLES_TIMES,NLES_MASKS))
+ALLOCATE(XLES_MEAN_TR  (NLES_K,NLES_TIMES,NLES_MASKS))
+ALLOCATE(XLES_MEAN_DISS(NLES_K,NLES_TIMES,NLES_MASKS))
+ALLOCATE(XLES_MEAN_LM  (NLES_K,NLES_TIMES,NLES_MASKS))
+ALLOCATE(XLES_MEAN_RHO(NLES_K,NLES_TIMES,NLES_MASKS))
+ALLOCATE(XLES_MEAN_Th (NLES_K,NLES_TIMES,NLES_MASKS))
+ALLOCATE(XLES_MEAN_Mf (NLES_K,NLES_TIMES,NLES_MASKS))  
+IF (LUSERC ) THEN
+  ALLOCATE(XLES_MEAN_Thl(NLES_K,NLES_TIMES,NLES_MASKS))
+  ALLOCATE(XLES_MEAN_Rt (NLES_K,NLES_TIMES,NLES_MASKS))
+  ALLOCATE(XLES_MEAN_KHt(NLES_K,NLES_TIMES,NLES_MASKS))
+  ALLOCATE(XLES_MEAN_KHr(NLES_K,NLES_TIMES,NLES_MASKS))
+ELSE
+  ALLOCATE(XLES_MEAN_Thl(0,0,0))
+  ALLOCATE(XLES_MEAN_Rt (0,0,0))
+  ALLOCATE(XLES_MEAN_KHt(0,0,0))
+  ALLOCATE(XLES_MEAN_KHr(0,0,0))
+END IF
+IF (LUSERV) THEN
+  ALLOCATE(XLES_MEAN_Thv(NLES_K,NLES_TIMES,NLES_MASKS))
+ELSE
+  ALLOCATE(XLES_MEAN_Thv(0,0,0))
+END IF
+!
+IF (LUSERV ) THEN 
+  ALLOCATE(XLES_MEAN_Rv (NLES_K,NLES_TIMES,NLES_MASKS))
+ELSE
+  ALLOCATE(XLES_MEAN_Rv (0,0,0))
+END IF
+IF (LUSERV ) THEN 
+   ALLOCATE(XLES_MEAN_Rehu (NLES_K,NLES_TIMES,NLES_MASKS))
+ELSE
+  ALLOCATE(XLES_MEAN_Rehu (0,0,0))
+ENDIF
+IF (LUSERV ) THEN 
+   ALLOCATE(XLES_MEAN_Qs (NLES_K,NLES_TIMES,NLES_MASKS))
+ELSE
+  ALLOCATE(XLES_MEAN_Qs (0,0,0))  
+END IF
+IF (LUSERC ) THEN
+  ALLOCATE(XLES_MEAN_Rc (NLES_K,NLES_TIMES,NLES_MASKS))
+ELSE
+  ALLOCATE(XLES_MEAN_Rc (0,0,0))
+END IF
+IF (LUSERC ) THEN
+  ALLOCATE(XLES_MEAN_Cf (NLES_K,NLES_TIMES,NLES_MASKS))
+  ALLOCATE(XLES_MEAN_INDCf (NLES_K,NLES_TIMES,NLES_MASKS))
+  ALLOCATE(XLES_MEAN_INDCf2 (NLES_K,NLES_TIMES,NLES_MASKS))
+ELSE
+  ALLOCATE(XLES_MEAN_Cf (0,0,0))
+  ALLOCATE(XLES_MEAN_INDCf (0,0,0))
+  ALLOCATE(XLES_MEAN_INDCf2(0,0,0))  
+END IF
+IF (LUSERR ) THEN
+  ALLOCATE(XLES_MEAN_Rr (NLES_K,NLES_TIMES,NLES_MASKS))
+  ALLOCATE(XLES_MEAN_RF (NLES_K,NLES_TIMES,NLES_MASKS))
+ELSE
+  ALLOCATE(XLES_MEAN_Rr (0,0,0))
+  ALLOCATE(XLES_MEAN_RF (0,0,0))
+END IF
+IF (LUSERI ) THEN
+  ALLOCATE(XLES_MEAN_Ri (NLES_K,NLES_TIMES,NLES_MASKS))
+  ALLOCATE(XLES_MEAN_If (NLES_K,NLES_TIMES,NLES_MASKS))
+ELSE
+  ALLOCATE(XLES_MEAN_Ri (0,0,0))
+  ALLOCATE(XLES_MEAN_If (0,0,0))
+END IF
+IF (LUSERS ) THEN
+  ALLOCATE(XLES_MEAN_Rs (NLES_K,NLES_TIMES,NLES_MASKS))
+ELSE
+  ALLOCATE(XLES_MEAN_Rs (0,0,0))
+END IF
+IF (LUSERG ) THEN
+  ALLOCATE(XLES_MEAN_Rg (NLES_K,NLES_TIMES,NLES_MASKS))
+ELSE
+  ALLOCATE(XLES_MEAN_Rg (0,0,0))
+END IF
+IF (LUSERH ) THEN
+  ALLOCATE(XLES_MEAN_Rh (NLES_K,NLES_TIMES,NLES_MASKS))
+ELSE
+  ALLOCATE(XLES_MEAN_Rh (0,0,0))
+END IF
+IF (NSV>0  ) THEN
+  ALLOCATE(XLES_MEAN_Sv (NLES_K,NLES_TIMES,NLES_MASKS,NSV))
+ELSE
+  ALLOCATE(XLES_MEAN_Sv (0,0,0,0))
+END IF
+ALLOCATE(XLES_MEAN_WIND  (NLES_K,NLES_TIMES,NLES_MASKS))
+ALLOCATE(XLES_MEAN_dUdz  (NLES_K,NLES_TIMES,NLES_MASKS))
+ALLOCATE(XLES_MEAN_dVdz  (NLES_K,NLES_TIMES,NLES_MASKS))
+ALLOCATE(XLES_MEAN_dWdz  (NLES_K,NLES_TIMES,NLES_MASKS))
+ALLOCATE(XLES_MEAN_dThldz(NLES_K,NLES_TIMES,NLES_MASKS))
+IF (LUSERV) THEN
+  ALLOCATE(XLES_MEAN_dRtdz(NLES_K,NLES_TIMES,NLES_MASKS))
+ELSE
+  ALLOCATE(XLES_MEAN_dRtdz(0,0,0))
+END IF
+IF (NSV>0) THEN
+  ALLOCATE(XLES_MEAN_dSvdz(NLES_K,NLES_TIMES,NLES_MASKS,NSV))
+ELSE
+  ALLOCATE(XLES_MEAN_dSvdz(0,0,0,0))
+END IF
+!
+IF (LLES_PDF) THEN
+!pdf distributions and jpdf distributions
+  CALL LES_ALLOCATE('XLES_PDF_TH ',(/NLES_K,NLES_TIMES,NLES_MASKS,NPDF/))
+  CALL LES_ALLOCATE('XLES_PDF_W ',(/NLES_K,NLES_TIMES,NLES_MASKS,NPDF/))
+  CALL LES_ALLOCATE('XLES_PDF_THV ',(/NLES_K,NLES_TIMES,NLES_MASKS,NPDF/))
+  IF (LUSERV) THEN
+   CALL LES_ALLOCATE('XLES_PDF_RV ',(/NLES_K,NLES_TIMES,NLES_MASKS,NPDF/))
+  ELSE
+   CALL LES_ALLOCATE('XLES_PDF_RV ',(/0,0,0,0/))
+  END IF
+  IF (LUSERC) THEN 
+   CALL LES_ALLOCATE('XLES_PDF_RC ',(/NLES_K,NLES_TIMES,NLES_MASKS,NPDF/))
+   CALL LES_ALLOCATE('XLES_PDF_RT ',(/NLES_K,NLES_TIMES,NLES_MASKS,NPDF/))
+   CALL LES_ALLOCATE('XLES_PDF_THL',(/NLES_K,NLES_TIMES,NLES_MASKS,NPDF/))
+  ELSE
+   CALL LES_ALLOCATE('XLES_PDF_RC ',(/0,0,0,0/))
+   CALL LES_ALLOCATE('XLES_PDF_RT ',(/0,0,0,0/))
+   CALL LES_ALLOCATE('XLES_PDF_THL',(/0,0,0,0/))
+  ENDIF
+  IF (LUSERR) THEN
+   CALL LES_ALLOCATE('XLES_PDF_RR ',(/NLES_K,NLES_TIMES,NLES_MASKS,NPDF/))
+  ELSE
+   CALL LES_ALLOCATE('XLES_PDF_RR ',(/0,0,0,0/))
+  ENDIF
+  IF (LUSERI) THEN 
+   CALL LES_ALLOCATE('XLES_PDF_RI ',(/NLES_K,NLES_TIMES,NLES_MASKS,NPDF/))
+  ELSE
+   CALL LES_ALLOCATE('XLES_PDF_RI ',(/0,0,0,0/))
+  END IF
+  IF (LUSERS) THEN
+   CALL LES_ALLOCATE('XLES_PDF_RS ',(/NLES_K,NLES_TIMES,NLES_MASKS,NPDF/))
+  ELSE
+   CALL LES_ALLOCATE('XLES_PDF_RS ',(/0,0,0,0/))
+  END IF
+  IF (LUSERG) THEN 
+   CALL LES_ALLOCATE('XLES_PDF_RG ',(/NLES_K,NLES_TIMES,NLES_MASKS,NPDF/))
+  ELSE
+   CALL LES_ALLOCATE('XLES_PDF_RG ',(/0,0,0,0/))
+  END IF
+ENDIF
+!  
+XLES_MEAN_U  = XUNDEF
+XLES_MEAN_V  = XUNDEF
+XLES_MEAN_W  = XUNDEF
+XLES_MEAN_P  = XUNDEF
+XLES_MEAN_DP  = XUNDEF
+XLES_MEAN_TP  = XUNDEF
+XLES_MEAN_TR  = XUNDEF
+XLES_MEAN_DISS= XUNDEF
+XLES_MEAN_LM  = XUNDEF
+XLES_MEAN_RHO= XUNDEF
+XLES_MEAN_Th = XUNDEF
+XLES_MEAN_Mf = XUNDEF
+IF (LUSERC ) XLES_MEAN_Thl= XUNDEF
+IF (LUSERV ) XLES_MEAN_Thv= XUNDEF
+IF (LUSERV ) XLES_MEAN_Rv  = XUNDEF
+IF (LUSERV ) XLES_MEAN_Rehu  = XUNDEF  
+IF (LUSERV ) XLES_MEAN_Qs  = XUNDEF
+IF (LUSERC ) XLES_MEAN_KHr = XUNDEF
+IF (LUSERC ) XLES_MEAN_KHt = XUNDEF
+IF (LUSERC ) XLES_MEAN_Rt  = XUNDEF
+IF (LUSERC ) XLES_MEAN_Rc  = XUNDEF
+IF (LUSERC ) XLES_MEAN_Cf  = XUNDEF
+IF (LUSERC ) XLES_MEAN_RF  = XUNDEF
+IF (LUSERC ) XLES_MEAN_INDCf  = XUNDEF
+IF (LUSERC ) XLES_MEAN_INDCf2 = XUNDEF
+IF (LUSERR ) XLES_MEAN_Rr  = XUNDEF
+IF (LUSERI ) XLES_MEAN_Ri  = XUNDEF
+IF (LUSERI ) XLES_MEAN_If  = XUNDEF
+IF (LUSERS ) XLES_MEAN_Rs  = XUNDEF
+IF (LUSERG ) XLES_MEAN_Rg  = XUNDEF
+IF (LUSERH ) XLES_MEAN_Rh  = XUNDEF
+IF (NSV>0  ) XLES_MEAN_Sv  = XUNDEF
+XLES_MEAN_WIND  = XUNDEF
+XLES_MEAN_WIND  = XUNDEF
+XLES_MEAN_dUdz  = XUNDEF
+XLES_MEAN_dVdz  = XUNDEF
+XLES_MEAN_dWdz  = XUNDEF
+XLES_MEAN_dThldz= XUNDEF
+IF (LUSERV) XLES_MEAN_dRtdz = XUNDEF
+IF (NSV>0)  XLES_MEAN_dSvdz = XUNDEF
+!
+IF (LLES_PDF) THEN
+ XLES_PDF_TH   = XUNDEF
+ XLES_PDF_W    = XUNDEF
+ XLES_PDF_THV  = XUNDEF
+ IF (LUSERV) THEN
+  XLES_PDF_RV   = XUNDEF
+ END IF
+ IF (LUSERC) THEN
+  XLES_PDF_RC    = XUNDEF
+  XLES_PDF_RT    = XUNDEF
+  XLES_PDF_THL   = XUNDEF
+ END IF
+ IF (LUSERR) THEN
+  XLES_PDF_RR   = XUNDEF
+ END IF
+ IF (LUSERI) THEN
+  XLES_PDF_RI   = XUNDEF
+ END IF
+ IF (LUSERS) THEN
+  XLES_PDF_RS   = XUNDEF
+ END IF
+ IF (LUSERG) THEN
+  XLES_PDF_RG   = XUNDEF
+ END IF
+END IF
+!
+!
+!
+!*      7.3  Resolved quantities
+!            -------------------
+!
+ALLOCATE(XLES_RESOLVED_U2    (NLES_K,NLES_TIMES,NLES_MASKS))     ! <u'2>
+ALLOCATE(XLES_RESOLVED_V2    (NLES_K,NLES_TIMES,NLES_MASKS))     ! <v'2>
+ALLOCATE(XLES_RESOLVED_W2    (NLES_K,NLES_TIMES,NLES_MASKS))     ! <w'2>
+ALLOCATE(XLES_RESOLVED_P2    (NLES_K,NLES_TIMES,NLES_MASKS))     ! <p'2>
+ALLOCATE(XLES_RESOLVED_Th2   (NLES_K,NLES_TIMES,NLES_MASKS))     ! <Th'2>
+IF (LUSERV) THEN
+  ALLOCATE(XLES_RESOLVED_ThThv (NLES_K,NLES_TIMES,NLES_MASKS))   ! <Th'Thv'>
+ELSE
+  ALLOCATE(XLES_RESOLVED_ThThv (0,0,0))
+END IF
+IF (LUSERC) THEN
+  ALLOCATE(XLES_RESOLVED_Thl2  (NLES_K,NLES_TIMES,NLES_MASKS))   ! <Thl'2>
+  ALLOCATE(XLES_RESOLVED_ThlThv(NLES_K,NLES_TIMES,NLES_MASKS))   ! <Thl'Thv'>
+ELSE
+  ALLOCATE(XLES_RESOLVED_Thl2  (0,0,0))
+  ALLOCATE(XLES_RESOLVED_ThlThv(0,0,0))
+END IF
+ALLOCATE(XLES_RESOLVED_Ke    (NLES_K,NLES_TIMES,NLES_MASKS))     ! 0.5 <u'2+v'2+w'2>
+ALLOCATE(XLES_RESOLVED_UV    (NLES_K,NLES_TIMES,NLES_MASKS))     ! <u'v'>
+ALLOCATE(XLES_RESOLVED_WU    (NLES_K,NLES_TIMES,NLES_MASKS))     ! <w'u'>
+ALLOCATE(XLES_RESOLVED_WV    (NLES_K,NLES_TIMES,NLES_MASKS))     ! <w'v'>
+ALLOCATE(XLES_RESOLVED_UP    (NLES_K,NLES_TIMES,NLES_MASKS))     ! <u'p'>
+ALLOCATE(XLES_RESOLVED_VP    (NLES_K,NLES_TIMES,NLES_MASKS))     ! <v'p'>
+ALLOCATE(XLES_RESOLVED_WP    (NLES_K,NLES_TIMES,NLES_MASKS))     ! <w'p'>
+ALLOCATE(XLES_RESOLVED_UTh   (NLES_K,NLES_TIMES,NLES_MASKS))     ! <u'Th'>
+ALLOCATE(XLES_RESOLVED_VTh   (NLES_K,NLES_TIMES,NLES_MASKS))     ! <v'Th'>
+ALLOCATE(XLES_RESOLVED_WTh   (NLES_K,NLES_TIMES,NLES_MASKS))     ! <w'Th'>
+IF (LUSERC) THEN
+  ALLOCATE(XLES_RESOLVED_UThl  (NLES_K,NLES_TIMES,NLES_MASKS))   ! <u'Thl'>
+  ALLOCATE(XLES_RESOLVED_VThl  (NLES_K,NLES_TIMES,NLES_MASKS))   ! <v'Thl'>
+  ALLOCATE(XLES_RESOLVED_WThl  (NLES_K,NLES_TIMES,NLES_MASKS))   ! <w'Thl'>
+ELSE
+  ALLOCATE(XLES_RESOLVED_UThl(0,0,0))
+  ALLOCATE(XLES_RESOLVED_VThl(0,0,0))
+  ALLOCATE(XLES_RESOLVED_WThl(0,0,0))
+END IF
+IF (LUSERV) THEN
+  ALLOCATE(XLES_RESOLVED_UThv  (NLES_K,NLES_TIMES,NLES_MASKS))   ! <u'Thv'>
+  ALLOCATE(XLES_RESOLVED_VThv  (NLES_K,NLES_TIMES,NLES_MASKS))   ! <v'Thv'>
+  ALLOCATE(XLES_RESOLVED_WThv  (NLES_K,NLES_TIMES,NLES_MASKS))   ! <w'Thv'>
+ELSE
+  ALLOCATE(XLES_RESOLVED_UThv(0,0,0))
+  ALLOCATE(XLES_RESOLVED_VThv(0,0,0))
+  ALLOCATE(XLES_RESOLVED_WThv(0,0,0))
+END IF
+ALLOCATE(XLES_RESOLVED_U3    (NLES_K,NLES_TIMES,NLES_MASKS))     ! <u'3>
+ALLOCATE(XLES_RESOLVED_V3    (NLES_K,NLES_TIMES,NLES_MASKS))     ! <v'3>
+ALLOCATE(XLES_RESOLVED_W3    (NLES_K,NLES_TIMES,NLES_MASKS))     ! <w'3>
+ALLOCATE(XLES_RESOLVED_U4    (NLES_K,NLES_TIMES,NLES_MASKS))     ! <u'4>
+ALLOCATE(XLES_RESOLVED_V4    (NLES_K,NLES_TIMES,NLES_MASKS))     ! <v'4>
+ALLOCATE(XLES_RESOLVED_W4    (NLES_K,NLES_TIMES,NLES_MASKS))     ! <w'4>
+ALLOCATE(XLES_RESOLVED_ThlPz (NLES_K,NLES_TIMES,NLES_MASKS))     ! <Thv'dp'/dz>
+ALLOCATE(XLES_RESOLVED_WThl2 (NLES_K,NLES_TIMES,NLES_MASKS))     ! <w'Thl'2>
+ALLOCATE(XLES_RESOLVED_W2Thl (NLES_K,NLES_TIMES,NLES_MASKS))     ! <w'2Thl'>
+ALLOCATE(XLES_RESOLVED_MASSFX(NLES_K,NLES_TIMES,NLES_MASKS))     ! <upward mass flux>
+ALLOCATE(XLES_RESOLVED_UKe   (NLES_K,NLES_TIMES,NLES_MASKS))     ! <u'(u'2+v'2+w'2)>
+ALLOCATE(XLES_RESOLVED_VKe   (NLES_K,NLES_TIMES,NLES_MASKS))     ! <v'(u'2+v'2+w'2)>
+ALLOCATE(XLES_RESOLVED_WKe   (NLES_K,NLES_TIMES,NLES_MASKS))     ! <w'(u'2+v'2+w'2)>
+
+IF (LUSERV ) THEN
+  ALLOCATE(XLES_RESOLVED_Rv2   (NLES_K,NLES_TIMES,NLES_MASKS))     ! <Rv'2>
+  ALLOCATE(XLES_RESOLVED_ThRv  (NLES_K,NLES_TIMES,NLES_MASKS))     ! <Th'Rv'>
+  ALLOCATE(XLES_RESOLVED_ThvRv (NLES_K,NLES_TIMES,NLES_MASKS))     ! <Thv'Rv'>
+  ALLOCATE(XLES_RESOLVED_URv   (NLES_K,NLES_TIMES,NLES_MASKS))     ! <u'Rv'>
+  ALLOCATE(XLES_RESOLVED_VRv   (NLES_K,NLES_TIMES,NLES_MASKS))     ! <v'Rv'>
+  ALLOCATE(XLES_RESOLVED_WRv   (NLES_K,NLES_TIMES,NLES_MASKS))     ! <w'Rv'>
+  ALLOCATE(XLES_RESOLVED_WRv2  (NLES_K,NLES_TIMES,NLES_MASKS))     ! <w'Rv'2>
+  ALLOCATE(XLES_RESOLVED_W2Rv  (NLES_K,NLES_TIMES,NLES_MASKS))     ! <w'2Rv'>  
+  ALLOCATE(XLES_RESOLVED_W2Rt  (NLES_K,NLES_TIMES,NLES_MASKS))     ! <w'2Rt'> 
+  ALLOCATE(XLES_RESOLVED_WRt2  (NLES_K,NLES_TIMES,NLES_MASKS))     ! <w'Rt2'>    
+  ALLOCATE(XLES_RESOLVED_RvPz  (NLES_K,NLES_TIMES,NLES_MASKS))     ! <Rv'dp'/dz>
+  ALLOCATE(XLES_RESOLVED_WThlRv(NLES_K,NLES_TIMES,NLES_MASKS))     ! <w'Thl'Rv'>
+  ALLOCATE(XLES_RESOLVED_WThlRt(NLES_K,NLES_TIMES,NLES_MASKS))     ! <w'Thl'Rt'>  
+ELSE
+  ALLOCATE(XLES_RESOLVED_Rv2   (0,0,0))
+  ALLOCATE(XLES_RESOLVED_ThRv  (0,0,0))
+  ALLOCATE(XLES_RESOLVED_ThvRv (0,0,0))
+  ALLOCATE(XLES_RESOLVED_URv   (0,0,0))
+  ALLOCATE(XLES_RESOLVED_VRv   (0,0,0))
+  ALLOCATE(XLES_RESOLVED_WRv   (0,0,0))
+  ALLOCATE(XLES_RESOLVED_WRv2  (0,0,0))
+  ALLOCATE(XLES_RESOLVED_W2Rv  (0,0,0))
+  ALLOCATE(XLES_RESOLVED_W2Rt  (0,0,0)) 
+  ALLOCATE(XLES_RESOLVED_WRt2  (0,0,0))
+  ALLOCATE(XLES_RESOLVED_RvPz  (0,0,0))
+  ALLOCATE(XLES_RESOLVED_WThlRv(0,0,0))
+  ALLOCATE(XLES_RESOLVED_WThlRt(0,0,0))
+END IF
+IF (LUSERC ) THEN
+  ALLOCATE(XLES_RESOLVED_ThlRv (NLES_K,NLES_TIMES,NLES_MASKS))     ! <Thl'Rv'>
+  !
+  ALLOCATE(XLES_RESOLVED_Rc2   (NLES_K,NLES_TIMES,NLES_MASKS))     ! <Rc'2>
+  ALLOCATE(XLES_RESOLVED_ThRc  (NLES_K,NLES_TIMES,NLES_MASKS))     ! <Th'Rc'>
+  ALLOCATE(XLES_RESOLVED_ThlRc (NLES_K,NLES_TIMES,NLES_MASKS))     ! <Thl'Rc'>
+  ALLOCATE(XLES_RESOLVED_ThvRc (NLES_K,NLES_TIMES,NLES_MASKS))     ! <Thv'Rc'>
+  ALLOCATE(XLES_RESOLVED_URc   (NLES_K,NLES_TIMES,NLES_MASKS))     ! <u'Rc'>
+  ALLOCATE(XLES_RESOLVED_VRc   (NLES_K,NLES_TIMES,NLES_MASKS))     ! <v'Rc'>
+  ALLOCATE(XLES_RESOLVED_WRc   (NLES_K,NLES_TIMES,NLES_MASKS))     ! <w'Rc'>
+  ALLOCATE(XLES_RESOLVED_WRc2  (NLES_K,NLES_TIMES,NLES_MASKS))     ! <w'Rc'2>
+  ALLOCATE(XLES_RESOLVED_W2Rc  (NLES_K,NLES_TIMES,NLES_MASKS))     ! <w'2Rc'>
+  ALLOCATE(XLES_RESOLVED_RcPz  (NLES_K,NLES_TIMES,NLES_MASKS))     ! <Rc'dp'/dz>
+  ALLOCATE(XLES_RESOLVED_WThlRc(NLES_K,NLES_TIMES,NLES_MASKS))     ! <w'Thl'Rc'>
+  ALLOCATE(XLES_RESOLVED_WRvRc (NLES_K,NLES_TIMES,NLES_MASKS))     ! <w'Rv'Rc'>
+  ALLOCATE(XLES_RESOLVED_WRt   (NLES_K,NLES_TIMES,NLES_MASKS))     ! <w'Rt'>
+  ALLOCATE(XLES_RESOLVED_Rt2   (NLES_K,NLES_TIMES,NLES_MASKS))     ! <Rt'2>
+  ALLOCATE(XLES_RESOLVED_RtPz  (NLES_K,NLES_TIMES,NLES_MASKS))     ! <Rv'dp'/dz>
+ELSE
+  ALLOCATE(XLES_RESOLVED_ThlRv (0,0,0))
+  !
+  ALLOCATE(XLES_RESOLVED_Rc2   (0,0,0))
+  ALLOCATE(XLES_RESOLVED_ThRc  (0,0,0))
+  ALLOCATE(XLES_RESOLVED_ThlRc (0,0,0))
+  ALLOCATE(XLES_RESOLVED_ThvRc (0,0,0))
+  ALLOCATE(XLES_RESOLVED_URc   (0,0,0))
+  ALLOCATE(XLES_RESOLVED_VRc   (0,0,0))
+  ALLOCATE(XLES_RESOLVED_WRc   (0,0,0))
+  ALLOCATE(XLES_RESOLVED_WRc2  (0,0,0))
+  ALLOCATE(XLES_RESOLVED_W2Rc  (0,0,0))
+  ALLOCATE(XLES_RESOLVED_RcPz  (0,0,0))
+  ALLOCATE(XLES_RESOLVED_WThlRc(0,0,0))
+  ALLOCATE(XLES_RESOLVED_WRvRc (0,0,0))
+  ALLOCATE(XLES_RESOLVED_WRt   (0,0,0))
+  ALLOCATE(XLES_RESOLVED_Rt2  (0,0,0))
+  ALLOCATE(XLES_RESOLVED_RtPz  (0,0,0))
+END IF
+IF (LUSERI ) THEN
+  ALLOCATE(XLES_RESOLVED_Ri2   (NLES_K,NLES_TIMES,NLES_MASKS))     ! <Ri'2>
+  ALLOCATE(XLES_RESOLVED_ThRi  (NLES_K,NLES_TIMES,NLES_MASKS))     ! <Th'Ri'>
+  ALLOCATE(XLES_RESOLVED_ThlRi (NLES_K,NLES_TIMES,NLES_MASKS))     ! <Thl'Ri'>
+  ALLOCATE(XLES_RESOLVED_ThvRi (NLES_K,NLES_TIMES,NLES_MASKS))     ! <Thv'Ri'>
+  ALLOCATE(XLES_RESOLVED_URi   (NLES_K,NLES_TIMES,NLES_MASKS))     ! <u'Ri'>
+  ALLOCATE(XLES_RESOLVED_VRi   (NLES_K,NLES_TIMES,NLES_MASKS))     ! <v'Ri'>
+  ALLOCATE(XLES_RESOLVED_WRi   (NLES_K,NLES_TIMES,NLES_MASKS))     ! <w'Ri'>
+  ALLOCATE(XLES_RESOLVED_WRi2  (NLES_K,NLES_TIMES,NLES_MASKS))     ! <w'Ri'2>
+  ALLOCATE(XLES_RESOLVED_W2Ri  (NLES_K,NLES_TIMES,NLES_MASKS))     ! <w'2Ri'>
+  ALLOCATE(XLES_RESOLVED_RiPz  (NLES_K,NLES_TIMES,NLES_MASKS))     ! <Ri'dp'/dz>
+  ALLOCATE(XLES_RESOLVED_WThlRi(NLES_K,NLES_TIMES,NLES_MASKS))     ! <w'Thl'Ri'>
+  ALLOCATE(XLES_RESOLVED_WRvRi (NLES_K,NLES_TIMES,NLES_MASKS))     ! <w'Rv'Ri'>
+ELSE
+  ALLOCATE(XLES_RESOLVED_Ri2   (0,0,0))
+  ALLOCATE(XLES_RESOLVED_ThRi  (0,0,0))
+  ALLOCATE(XLES_RESOLVED_ThlRi (0,0,0))
+  ALLOCATE(XLES_RESOLVED_ThvRi (0,0,0))
+  ALLOCATE(XLES_RESOLVED_URi   (0,0,0))
+  ALLOCATE(XLES_RESOLVED_VRi   (0,0,0))
+  ALLOCATE(XLES_RESOLVED_WRi   (0,0,0))
+  ALLOCATE(XLES_RESOLVED_WRi2  (0,0,0))
+  ALLOCATE(XLES_RESOLVED_W2Ri  (0,0,0))
+  ALLOCATE(XLES_RESOLVED_RiPz  (0,0,0))
+  ALLOCATE(XLES_RESOLVED_WThlRi(0,0,0))
+  ALLOCATE(XLES_RESOLVED_WRvRi (0,0,0))
+END IF
+!
+IF (LUSERR) THEN
+  ALLOCATE(XLES_RESOLVED_WRr   (NLES_K,NLES_TIMES,NLES_MASKS))     ! <w'Rr'>
+  ALLOCATE(XLES_INPRR3D        (NLES_K,NLES_TIMES,NLES_MASKS)) !precip flux
+  ALLOCATE(XLES_MAX_INPRR3D        (NLES_K,NLES_TIMES,NLES_MASKS)) !precip flux
+  ALLOCATE(XLES_EVAP3D        (NLES_K,NLES_TIMES,NLES_MASKS)) ! evap
+ELSE
+  ALLOCATE(XLES_RESOLVED_WRr   (0,0,0))
+  ALLOCATE(XLES_INPRR3D        (0,0,0))
+  ALLOCATE(XLES_MAX_INPRR3D        (0,0,0))
+  ALLOCATE(XLES_EVAP3D         (0,0,0))
+END IF
+IF (NSV>0  ) THEN
+  ALLOCATE(XLES_RESOLVED_Sv2   (NLES_K,NLES_TIMES,NLES_MASKS,NSV)) ! <Sv'2>
+  ALLOCATE(XLES_RESOLVED_ThSv  (NLES_K,NLES_TIMES,NLES_MASKS,NSV)) ! <Th'Sv>
+  ALLOCATE(XLES_RESOLVED_USv   (NLES_K,NLES_TIMES,NLES_MASKS,NSV)) ! <u'Sv'>
+  ALLOCATE(XLES_RESOLVED_VSv   (NLES_K,NLES_TIMES,NLES_MASKS,NSV)) ! <v'Sv'>
+  ALLOCATE(XLES_RESOLVED_WSv   (NLES_K,NLES_TIMES,NLES_MASKS,NSV)) ! <w'Sv'>
+  ALLOCATE(XLES_RESOLVED_WSv2  (NLES_K,NLES_TIMES,NLES_MASKS,NSV)) ! <w'Sv'2>
+  ALLOCATE(XLES_RESOLVED_W2Sv  (NLES_K,NLES_TIMES,NLES_MASKS,NSV)) ! <w'2Sv'>
+  ALLOCATE(XLES_RESOLVED_SvPz  (NLES_K,NLES_TIMES,NLES_MASKS,NSV)) ! <Sv'dp'/dz>
+  ALLOCATE(XLES_RESOLVED_WThlSv(NLES_K,NLES_TIMES,NLES_MASKS,NSV)) ! <w'Thl'Sv'>
+  IF (LUSERV) THEN
+    ALLOCATE(XLES_RESOLVED_ThvSv (NLES_K,NLES_TIMES,NLES_MASKS,NSV)) ! <Thv'Sv>
+    ALLOCATE(XLES_RESOLVED_WRvSv (NLES_K,NLES_TIMES,NLES_MASKS,NSV)) ! <w'Rv'Sv'>
+  ELSE
+    ALLOCATE(XLES_RESOLVED_ThvSv (0,0,0,0))
+    ALLOCATE(XLES_RESOLVED_WRvSv (0,0,0,0))
+  END IF
+  IF (LUSERC) THEN
+    ALLOCATE(XLES_RESOLVED_ThlSv (NLES_K,NLES_TIMES,NLES_MASKS,NSV)) ! <Thl'Sv>
+  ELSE
+    ALLOCATE(XLES_RESOLVED_ThlSv (0,0,0,0))
+  END IF
+ELSE
+  ALLOCATE(XLES_RESOLVED_Sv2   (0,0,0,0))
+  ALLOCATE(XLES_RESOLVED_ThSv  (0,0,0,0))
+  ALLOCATE(XLES_RESOLVED_USv   (0,0,0,0))
+  ALLOCATE(XLES_RESOLVED_VSv   (0,0,0,0))
+  ALLOCATE(XLES_RESOLVED_WSv   (0,0,0,0))
+  ALLOCATE(XLES_RESOLVED_WSv2  (0,0,0,0))
+  ALLOCATE(XLES_RESOLVED_W2Sv  (0,0,0,0))
+  ALLOCATE(XLES_RESOLVED_SvPz  (0,0,0,0))
+  ALLOCATE(XLES_RESOLVED_ThvSv (0,0,0,0))
+  ALLOCATE(XLES_RESOLVED_ThlSv (0,0,0,0))
+  ALLOCATE(XLES_RESOLVED_WThlSv(0,0,0,0))
+  ALLOCATE(XLES_RESOLVED_WRvSv (0,0,0,0))
+END IF
+!
+!
+XLES_RESOLVED_U2  = XUNDEF
+XLES_RESOLVED_V2  = XUNDEF
+XLES_RESOLVED_W2  = XUNDEF
+XLES_RESOLVED_P2  = XUNDEF
+XLES_RESOLVED_Th2 = XUNDEF
+IF( LUSERC) THEN
+  XLES_RESOLVED_Thl2= XUNDEF
+  XLES_RESOLVED_ThlThv= XUNDEF
+END IF
+IF (LUSERV) THEN
+  XLES_RESOLVED_ThThv = XUNDEF
+END IF
+XLES_RESOLVED_Ke  = XUNDEF
+XLES_RESOLVED_UV  = XUNDEF
+XLES_RESOLVED_WU  = XUNDEF
+XLES_RESOLVED_WV  = XUNDEF
+XLES_RESOLVED_UP  = XUNDEF
+XLES_RESOLVED_VP  = XUNDEF
+XLES_RESOLVED_WP  = XUNDEF
+XLES_RESOLVED_UTh = XUNDEF
+XLES_RESOLVED_VTh = XUNDEF
+XLES_RESOLVED_WTh = XUNDEF
+IF (LUSERC) THEN
+  XLES_RESOLVED_UThl= XUNDEF
+  XLES_RESOLVED_VThl= XUNDEF
+  XLES_RESOLVED_WThl= XUNDEF
+END IF
+IF (LUSERV) THEN
+  XLES_RESOLVED_UThv= XUNDEF
+  XLES_RESOLVED_VThv= XUNDEF
+  XLES_RESOLVED_WThv= XUNDEF
+END IF
+XLES_RESOLVED_U3  = XUNDEF
+XLES_RESOLVED_V3  = XUNDEF
+XLES_RESOLVED_W3  = XUNDEF
+XLES_RESOLVED_U4  = XUNDEF
+XLES_RESOLVED_V4  = XUNDEF
+XLES_RESOLVED_W4  = XUNDEF
+XLES_RESOLVED_WThl2  = XUNDEF
+XLES_RESOLVED_W2Thl  = XUNDEF
+XLES_RESOLVED_ThlPz  = XUNDEF
+!
+XLES_RESOLVED_MASSFX = XUNDEF
+XLES_RESOLVED_UKe = XUNDEF
+XLES_RESOLVED_VKe = XUNDEF
+XLES_RESOLVED_WKe = XUNDEF
+IF (LUSERV ) THEN
+  XLES_RESOLVED_Rv2  = XUNDEF
+  XLES_RESOLVED_ThRv = XUNDEF
+  IF (LUSERC) XLES_RESOLVED_ThlRv= XUNDEF
+  XLES_RESOLVED_ThvRv= XUNDEF
+  XLES_RESOLVED_URv = XUNDEF
+  XLES_RESOLVED_VRv = XUNDEF
+  XLES_RESOLVED_WRv = XUNDEF
+  XLES_RESOLVED_WRv2  = XUNDEF
+  XLES_RESOLVED_W2Rv  = XUNDEF
+  XLES_RESOLVED_WRt2 = XUNDEF
+  XLES_RESOLVED_W2Rt  = XUNDEF
+  XLES_RESOLVED_WThlRv= XUNDEF
+  XLES_RESOLVED_WThlRt= XUNDEF  
+  XLES_RESOLVED_RvPz  = XUNDEF
+END IF
+IF (LUSERC ) THEN
+  XLES_RESOLVED_Rc2  = XUNDEF
+  XLES_RESOLVED_ThRc = XUNDEF
+  XLES_RESOLVED_ThlRc= XUNDEF
+  XLES_RESOLVED_ThvRc= XUNDEF
+  XLES_RESOLVED_URc  = XUNDEF
+  XLES_RESOLVED_VRc  = XUNDEF
+  XLES_RESOLVED_WRc  = XUNDEF
+  XLES_RESOLVED_WRc2  = XUNDEF
+  XLES_RESOLVED_W2Rc  = XUNDEF
+  XLES_RESOLVED_WThlRc= XUNDEF
+  XLES_RESOLVED_WRvRc = XUNDEF
+  XLES_RESOLVED_RcPz  = XUNDEF
+  XLES_RESOLVED_RtPz  = XUNDEF
+  XLES_RESOLVED_WRt  = XUNDEF
+  XLES_RESOLVED_Rt2  = XUNDEF
+END IF
+IF (LUSERI ) THEN
+  XLES_RESOLVED_Ri2  = XUNDEF
+  XLES_RESOLVED_ThRi = XUNDEF
+  XLES_RESOLVED_ThlRi= XUNDEF
+  XLES_RESOLVED_ThvRi= XUNDEF
+  XLES_RESOLVED_URi  = XUNDEF
+  XLES_RESOLVED_VRi  = XUNDEF
+  XLES_RESOLVED_WRi  = XUNDEF
+  XLES_RESOLVED_WRi2  = XUNDEF
+  XLES_RESOLVED_W2Ri  = XUNDEF
+  XLES_RESOLVED_WThlRi= XUNDEF
+  XLES_RESOLVED_WRvRi = XUNDEF
+  XLES_RESOLVED_RiPz  = XUNDEF
+END IF
+!
+IF (LUSERR) XLES_RESOLVED_WRr = XUNDEF
+IF (LUSERR) XLES_MAX_INPRR3D = XUNDEF
+IF (LUSERR) XLES_INPRR3D = XUNDEF
+IF (LUSERR) XLES_EVAP3D = XUNDEF
+IF (NSV>0  ) THEN
+  XLES_RESOLVED_Sv2  = XUNDEF
+  XLES_RESOLVED_ThSv = XUNDEF
+  IF (LUSERC) XLES_RESOLVED_ThlSv= XUNDEF
+  IF (LUSERV) XLES_RESOLVED_ThvSv= XUNDEF
+  XLES_RESOLVED_USv = XUNDEF
+  XLES_RESOLVED_VSv = XUNDEF
+  XLES_RESOLVED_WSv = XUNDEF
+  XLES_RESOLVED_WSv2  = XUNDEF
+  XLES_RESOLVED_W2Sv  = XUNDEF
+  XLES_RESOLVED_WThlSv= XUNDEF
+  IF (LUSERV) XLES_RESOLVED_WRvSv = XUNDEF
+  XLES_RESOLVED_SvPz  = XUNDEF
+END IF
+!
+!
+!*      7.4  interactions of resolved and subgrid quantities
+!            -----------------------------------------------
+!
+ALLOCATE(XLES_RES_U_SBG_Tke         (NLES_K,NLES_TIMES,NLES_MASKS))! <u'Tke>
+ALLOCATE(XLES_RES_V_SBG_Tke         (NLES_K,NLES_TIMES,NLES_MASKS))! <v'Tke>
+ALLOCATE(XLES_RES_W_SBG_Tke         (NLES_K,NLES_TIMES,NLES_MASKS))! <w'Tke>
+!                                                                        ______
+ALLOCATE(XLES_RES_W_SBG_WThl        (NLES_K,NLES_TIMES,NLES_MASKS))!  <w'w'Thl'>
+!                                                                        _____
+ALLOCATE(XLES_RES_W_SBG_Thl2        (NLES_K,NLES_TIMES,NLES_MASKS))!  <w'Thl'2>
+!                                                                              _____
+ALLOCATE(XLES_RES_ddxa_U_SBG_UaU    (NLES_K,NLES_TIMES,NLES_MASKS))!  <du'/dxa ua'u'>
+!                                                                              _____
+ALLOCATE(XLES_RES_ddxa_V_SBG_UaV    (NLES_K,NLES_TIMES,NLES_MASKS))!  <dv'/dxa ua'v'>
+!                                                                              _____
+ALLOCATE(XLES_RES_ddxa_W_SBG_UaW    (NLES_K,NLES_TIMES,NLES_MASKS))!  <dw'/dxa ua'w'>
+!                                                                              _______
+ALLOCATE(XLES_RES_ddxa_W_SBG_UaThl  (NLES_K,NLES_TIMES,NLES_MASKS))!  <dw'/dxa ua'Thl'>
+!                                                                                _____
+ALLOCATE(XLES_RES_ddxa_Thl_SBG_UaW  (NLES_K,NLES_TIMES,NLES_MASKS))!  <dThl'/dxa ua'w'>
+!                                                                               ___
+ALLOCATE(XLES_RES_ddz_Thl_SBG_W2    (NLES_K,NLES_TIMES,NLES_MASKS))!  <dThl'/dz w'2>
+!                                                                                _______
+ALLOCATE(XLES_RES_ddxa_Thl_SBG_UaThl(NLES_K,NLES_TIMES,NLES_MASKS))!  <dThl'/dxa ua'Thl'>
+!
+IF (LUSERV) THEN
+!                                                                          _____
+  ALLOCATE(XLES_RES_W_SBG_WRt         (NLES_K,NLES_TIMES,NLES_MASKS))!  <w'w'Rt'>
+!                                                                           ____
+  ALLOCATE(XLES_RES_W_SBG_Rt2         (NLES_K,NLES_TIMES,NLES_MASKS))!  <w'Rt'2>
+!                                                                          _______
+  ALLOCATE(XLES_RES_W_SBG_ThlRt       (NLES_K,NLES_TIMES,NLES_MASKS))!  <w'Thl'Rt'>
+!                                                                                ______
+  ALLOCATE(XLES_RES_ddxa_W_SBG_UaRt   (NLES_K,NLES_TIMES,NLES_MASKS))!  <dw'/dxa ua'Rt'>
+!                                                                                 _____
+  ALLOCATE(XLES_RES_ddxa_Rt_SBG_UaW   (NLES_K,NLES_TIMES,NLES_MASKS))!  <dRt'/dxa ua'w'>
+!                                                                                ___
+  ALLOCATE(XLES_RES_ddz_Rt_SBG_W2     (NLES_K,NLES_TIMES,NLES_MASKS))!  <dRt'/dz w'2>
+!                                                                                  ______
+  ALLOCATE(XLES_RES_ddxa_Thl_SBG_UaRt (NLES_K,NLES_TIMES,NLES_MASKS))!  <dThl'/dxa ua'Rt'>
+!                                                                                 _______
+  ALLOCATE(XLES_RES_ddxa_Rt_SBG_UaThl (NLES_K,NLES_TIMES,NLES_MASKS))!  <dRt'/dxa ua'Thl'>
+!                                                                                  ______
+  ALLOCATE(XLES_RES_ddxa_Rt_SBG_UaRt  (NLES_K,NLES_TIMES,NLES_MASKS)) !  <dRt'/dxa ua'Rt'>
+ELSE
+  ALLOCATE(XLES_RES_W_SBG_WRt         (0,0,0))
+  ALLOCATE(XLES_RES_W_SBG_Rt2         (0,0,0))
+  ALLOCATE(XLES_RES_W_SBG_ThlRt       (0,0,0))
+  ALLOCATE(XLES_RES_ddxa_W_SBG_UaRt   (0,0,0))
+  ALLOCATE(XLES_RES_ddxa_Rt_SBG_UaW   (0,0,0))
+  ALLOCATE(XLES_RES_ddz_Rt_SBG_W2     (0,0,0))
+  ALLOCATE(XLES_RES_ddxa_Thl_SBG_UaRt (0,0,0))
+  ALLOCATE(XLES_RES_ddxa_Rt_SBG_UaThl (0,0,0))
+  ALLOCATE(XLES_RES_ddxa_Rt_SBG_UaRt  (0,0,0))
+END IF
+!
+!                                                                                  ______
+ALLOCATE(XLES_RES_ddxa_W_SBG_UaSv (NLES_K,NLES_TIMES,NLES_MASKS,NSV))  !  <dw'/dxa ua'Sv'>
+!                                                                                   _____
+ALLOCATE(XLES_RES_ddxa_Sv_SBG_UaW (NLES_K,NLES_TIMES,NLES_MASKS,NSV))  !  <dSv'/dxa ua'w'>
+!                                                                                   ___
+ALLOCATE(XLES_RES_ddz_Sv_SBG_W2   (NLES_K,NLES_TIMES,NLES_MASKS,NSV))  !  <dSv'/dz w'2>
+!                                                                                  ______
+ALLOCATE(XLES_RES_ddxa_Sv_SBG_UaSv(NLES_K,NLES_TIMES,NLES_MASKS,NSV))  !  <dSv'/dxa ua'Sv'>
+!                                                                            _____
+ALLOCATE(XLES_RES_W_SBG_WSv       (NLES_K,NLES_TIMES,NLES_MASKS,NSV))  !  <w'w'Sv'>
+!                                                                            ____
+ALLOCATE(XLES_RES_W_SBG_Sv2       (NLES_K,NLES_TIMES,NLES_MASKS,NSV))  !  <w'Sv'2>
+!
+XLES_RES_U_SBG_Tke= XUNDEF
+XLES_RES_V_SBG_Tke= XUNDEF
+XLES_RES_W_SBG_Tke= XUNDEF
+XLES_RES_W_SBG_WThl         = XUNDEF
+XLES_RES_W_SBG_Thl2         = XUNDEF
+XLES_RES_ddxa_U_SBG_UaU     = XUNDEF
+XLES_RES_ddxa_V_SBG_UaV     = XUNDEF
+XLES_RES_ddxa_W_SBG_UaW     = XUNDEF
+XLES_RES_ddxa_W_SBG_UaThl   = XUNDEF
+XLES_RES_ddxa_Thl_SBG_UaW   = XUNDEF
+XLES_RES_ddz_Thl_SBG_W2     = XUNDEF
+XLES_RES_ddxa_Thl_SBG_UaThl = XUNDEF
+IF (LUSERV) THEN
+  XLES_RES_W_SBG_WRt        = XUNDEF
+  XLES_RES_W_SBG_Rt2        = XUNDEF
+  XLES_RES_W_SBG_ThlRt      = XUNDEF
+  XLES_RES_ddxa_W_SBG_UaRt  = XUNDEF
+  XLES_RES_ddxa_Rt_SBG_UaW  = XUNDEF
+  XLES_RES_ddz_Rt_SBG_W2    = XUNDEF
+  XLES_RES_ddxa_Thl_SBG_UaRt= XUNDEF
+  XLES_RES_ddxa_Rt_SBG_UaThl= XUNDEF
+  XLES_RES_ddxa_Rt_SBG_UaRt = XUNDEF
+END IF
+IF (NSV>0) THEN
+  XLES_RES_ddxa_W_SBG_UaSv = XUNDEF
+  XLES_RES_ddxa_Sv_SBG_UaW = XUNDEF
+  XLES_RES_ddz_Sv_SBG_W2   = XUNDEF
+  XLES_RES_ddxa_Sv_SBG_UaSv= XUNDEF
+  XLES_RES_W_SBG_WSv       = XUNDEF
+  XLES_RES_W_SBG_Sv2       = XUNDEF
+END IF
+!
+!
+!*      7.5  subgrid quantities
+!            ------------------
+!
+ALLOCATE(XLES_SUBGRID_U2    (NLES_K,NLES_TIMES,NLES_MASKS))     ! <u'2>
+ALLOCATE(XLES_SUBGRID_V2    (NLES_K,NLES_TIMES,NLES_MASKS))     ! <v'2>
+ALLOCATE(XLES_SUBGRID_W2    (NLES_K,NLES_TIMES,NLES_MASKS))     ! <w'2>
+ALLOCATE(XLES_SUBGRID_Tke   (NLES_K,NLES_TIMES,NLES_MASKS))     ! <e>
+ALLOCATE(XLES_SUBGRID_Thl2  (NLES_K,NLES_TIMES,NLES_MASKS))     ! <Thl'2>
+ALLOCATE(XLES_SUBGRID_UV    (NLES_K,NLES_TIMES,NLES_MASKS))     ! <u'v'>
+ALLOCATE(XLES_SUBGRID_WU    (NLES_K,NLES_TIMES,NLES_MASKS))     ! <w'u'>
+ALLOCATE(XLES_SUBGRID_WV    (NLES_K,NLES_TIMES,NLES_MASKS))     ! <w'v'>
+ALLOCATE(XLES_SUBGRID_UThl  (NLES_K,NLES_TIMES,NLES_MASKS))     ! <u'Thl'>
+ALLOCATE(XLES_SUBGRID_VThl  (NLES_K,NLES_TIMES,NLES_MASKS))     ! <v'Thl'>
+ALLOCATE(XLES_SUBGRID_WThl  (NLES_K,NLES_TIMES,NLES_MASKS))     ! <w'Thl'>
+ALLOCATE(XLES_SUBGRID_WThv     (NLES_K,NLES_TIMES,NLES_MASKS))  ! <w'Thv'>
+ALLOCATE(XLES_SUBGRID_ThlThv   (NLES_K,NLES_TIMES,NLES_MASKS))  ! <Thl'Thv'>
+ALLOCATE(XLES_SUBGRID_W2Thl    (NLES_K,NLES_TIMES,NLES_MASKS))  ! <w'2Thl>
+ALLOCATE(XLES_SUBGRID_WThl2    (NLES_K,NLES_TIMES,NLES_MASKS))  ! <w'Thl'2>
+ALLOCATE(XLES_SUBGRID_DISS_Tke (NLES_K,NLES_TIMES,NLES_MASKS))  ! <epsilon>
+ALLOCATE(XLES_SUBGRID_DISS_Thl2(NLES_K,NLES_TIMES,NLES_MASKS))  ! <epsilon_Thl2>
+ALLOCATE(XLES_SUBGRID_WP       (NLES_K,NLES_TIMES,NLES_MASKS))  ! <w'p'>
+ALLOCATE(XLES_SUBGRID_PHI3     (NLES_K,NLES_TIMES,NLES_MASKS))  ! phi3
+ALLOCATE(XLES_SUBGRID_LMix     (NLES_K,NLES_TIMES,NLES_MASKS))  ! mixing length
+ALLOCATE(XLES_SUBGRID_LDiss    (NLES_K,NLES_TIMES,NLES_MASKS))  ! dissipative length
+ALLOCATE(XLES_SUBGRID_Km       (NLES_K,NLES_TIMES,NLES_MASKS))  ! Km
+ALLOCATE(XLES_SUBGRID_Kh       (NLES_K,NLES_TIMES,NLES_MASKS))  ! Kh
+ALLOCATE(XLES_SUBGRID_ThlPz    (NLES_K,NLES_TIMES,NLES_MASKS))  ! <Thl'dp'/dz>
+ALLOCATE(XLES_SUBGRID_UTke  (NLES_K,NLES_TIMES,NLES_MASKS))     ! <u'Tke>
+ALLOCATE(XLES_SUBGRID_VTke  (NLES_K,NLES_TIMES,NLES_MASKS))     ! <v'Tke>
+ALLOCATE(XLES_SUBGRID_WTke  (NLES_K,NLES_TIMES,NLES_MASKS))     ! <w'Tke>
+ALLOCATE(XLES_SUBGRID_ddz_WTke  (NLES_K,NLES_TIMES,NLES_MASKS)) ! <dw'Tke/dz>
+
+ALLOCATE(XLES_SUBGRID_THLUP_MF(NLES_K,NLES_TIMES,NLES_MASKS))  ! Thl of the Updraft
+ALLOCATE(XLES_SUBGRID_RTUP_MF (NLES_K,NLES_TIMES,NLES_MASKS))  ! Rt of the Updraft
+ALLOCATE(XLES_SUBGRID_RVUP_MF (NLES_K,NLES_TIMES,NLES_MASKS))  ! Rv of the Updraft
+ALLOCATE(XLES_SUBGRID_RCUP_MF (NLES_K,NLES_TIMES,NLES_MASKS))  ! Rc of the Updraft
+ALLOCATE(XLES_SUBGRID_RIUP_MF (NLES_K,NLES_TIMES,NLES_MASKS))  ! Ri of the Updraft
+ALLOCATE(XLES_SUBGRID_WUP_MF  (NLES_K,NLES_TIMES,NLES_MASKS))  ! Thl of the Updraft
+ALLOCATE(XLES_SUBGRID_MASSFLUX(NLES_K,NLES_TIMES,NLES_MASKS))  ! Mass Flux
+ALLOCATE(XLES_SUBGRID_DETR    (NLES_K,NLES_TIMES,NLES_MASKS))  ! Detrainment
+ALLOCATE(XLES_SUBGRID_ENTR    (NLES_K,NLES_TIMES,NLES_MASKS))  ! Entrainment
+ALLOCATE(XLES_SUBGRID_FRACUP  (NLES_K,NLES_TIMES,NLES_MASKS))  ! Updraft Fraction 
+ALLOCATE(XLES_SUBGRID_THVUP_MF(NLES_K,NLES_TIMES,NLES_MASKS))  ! Thv of the Updraft
+ALLOCATE(XLES_SUBGRID_WTHLMF  (NLES_K,NLES_TIMES,NLES_MASKS))  ! Flux of thl   
+ALLOCATE(XLES_SUBGRID_WRTMF   (NLES_K,NLES_TIMES,NLES_MASKS)) ! Flux of rt
+ALLOCATE(XLES_SUBGRID_WTHVMF  (NLES_K,NLES_TIMES,NLES_MASKS)) ! Flux of thv 
+ALLOCATE(XLES_SUBGRID_WUMF    (NLES_K,NLES_TIMES,NLES_MASKS))! Flux of u
+ALLOCATE(XLES_SUBGRID_WVMF    (NLES_K,NLES_TIMES,NLES_MASKS))! Flux of v
+
+IF (LUSERV ) THEN
+  ALLOCATE(XLES_SUBGRID_Rt2   (NLES_K,NLES_TIMES,NLES_MASKS))     ! <Rt'2>
+  ALLOCATE(XLES_SUBGRID_ThlRt (NLES_K,NLES_TIMES,NLES_MASKS))     ! <Thl'Rt'>
+  ALLOCATE(XLES_SUBGRID_URt   (NLES_K,NLES_TIMES,NLES_MASKS))     ! <u'Rt'>
+  ALLOCATE(XLES_SUBGRID_VRt   (NLES_K,NLES_TIMES,NLES_MASKS))     ! <v'Rt'>
+  ALLOCATE(XLES_SUBGRID_WRt   (NLES_K,NLES_TIMES,NLES_MASKS))     ! <w'Rt'>
+  ALLOCATE(XLES_SUBGRID_RtThv (NLES_K,NLES_TIMES,NLES_MASKS))     ! <Rt'Thv'>
+  ALLOCATE(XLES_SUBGRID_W2Rt  (NLES_K,NLES_TIMES,NLES_MASKS))     ! <w'2Rt'>
+  ALLOCATE(XLES_SUBGRID_WThlRt(NLES_K,NLES_TIMES,NLES_MASKS))     ! <w'Thl'Rt'>
+  ALLOCATE(XLES_SUBGRID_WRt2  (NLES_K,NLES_TIMES,NLES_MASKS))     ! <w'Rt'2>
+  ALLOCATE(XLES_SUBGRID_DISS_Rt2 (NLES_K,NLES_TIMES,NLES_MASKS))  ! <epsilon_Rt2>
+  ALLOCATE(XLES_SUBGRID_DISS_ThlRt(NLES_K,NLES_TIMES,NLES_MASKS)) ! <epsilon_ThlRt>
+  ALLOCATE(XLES_SUBGRID_RtPz  (NLES_K,NLES_TIMES,NLES_MASKS))     ! <Rt'dp'/dz>
+  ALLOCATE(XLES_SUBGRID_PSI3  (NLES_K,NLES_TIMES,NLES_MASKS))     ! psi3
+ELSE
+  ALLOCATE(XLES_SUBGRID_Rt2   (0,0,0))
+  ALLOCATE(XLES_SUBGRID_ThlRt (0,0,0))
+  ALLOCATE(XLES_SUBGRID_URt   (0,0,0))
+  ALLOCATE(XLES_SUBGRID_VRt   (0,0,0))
+  ALLOCATE(XLES_SUBGRID_WRt   (0,0,0))
+  ALLOCATE(XLES_SUBGRID_RtThv (0,0,0))
+  ALLOCATE(XLES_SUBGRID_W2Rt  (0,0,0))
+  ALLOCATE(XLES_SUBGRID_WThlRt(0,0,0))
+  ALLOCATE(XLES_SUBGRID_WRt2  (0,0,0))
+  ALLOCATE(XLES_SUBGRID_DISS_Rt2 (0,0,0))
+  ALLOCATE(XLES_SUBGRID_DISS_ThlRt(0,0,0))
+  ALLOCATE(XLES_SUBGRID_RtPz  (0,0,0))
+  ALLOCATE(XLES_SUBGRID_PSI3  (0,0,0))
+END IF
+IF (LUSERC ) THEN
+  ALLOCATE(XLES_SUBGRID_Rc2   (NLES_K,NLES_TIMES,NLES_MASKS))     ! <Rc'2>
+  ALLOCATE(XLES_SUBGRID_URc   (NLES_K,NLES_TIMES,NLES_MASKS))     ! <u'Rc'>
+  ALLOCATE(XLES_SUBGRID_VRc   (NLES_K,NLES_TIMES,NLES_MASKS))     ! <v'Rc'>
+  ALLOCATE(XLES_SUBGRID_WRc   (NLES_K,NLES_TIMES,NLES_MASKS))     ! <w'Rc'>
+ELSE
+  ALLOCATE(XLES_SUBGRID_Rc2   (0,0,0))
+  ALLOCATE(XLES_SUBGRID_URc   (0,0,0))
+  ALLOCATE(XLES_SUBGRID_VRc   (0,0,0))
+  ALLOCATE(XLES_SUBGRID_WRc   (0,0,0))
+END IF
+IF (LUSERI ) THEN
+  ALLOCATE(XLES_SUBGRID_Ri2   (NLES_K,NLES_TIMES,NLES_MASKS))     ! <Ri'2>
+ELSE
+  ALLOCATE(XLES_SUBGRID_Ri2   (0,0,0))
+END IF
+IF (NSV>0  ) THEN
+  ALLOCATE(XLES_SUBGRID_USv   (NLES_K,NLES_TIMES,NLES_MASKS,NSV)) ! <u'Sv'>
+  ALLOCATE(XLES_SUBGRID_VSv   (NLES_K,NLES_TIMES,NLES_MASKS,NSV)) ! <v'Sv'>
+  ALLOCATE(XLES_SUBGRID_WSv   (NLES_K,NLES_TIMES,NLES_MASKS,NSV)) ! <w'Sv'>
+  ALLOCATE(XLES_SUBGRID_Sv2      (NLES_K,NLES_TIMES,NLES_MASKS,NSV))  ! <Sv'2>
+  ALLOCATE(XLES_SUBGRID_SvThv    (NLES_K,NLES_TIMES,NLES_MASKS,NSV))  ! <Sv'Thv'>
+  ALLOCATE(XLES_SUBGRID_W2Sv     (NLES_K,NLES_TIMES,NLES_MASKS,NSV))  ! <w'2Sv'>
+  ALLOCATE(XLES_SUBGRID_WSv2     (NLES_K,NLES_TIMES,NLES_MASKS,NSV))  ! <w'Sv'2>
+  ALLOCATE(XLES_SUBGRID_DISS_Sv2 (NLES_K,NLES_TIMES,NLES_MASKS,NSV))  ! <epsilon_Sv2>
+  ALLOCATE(XLES_SUBGRID_SvPz     (NLES_K,NLES_TIMES,NLES_MASKS,NSV))  ! <Sv'dp'/dz>
+ELSE
+  ALLOCATE(XLES_SUBGRID_USv   (0,0,0,0))
+  ALLOCATE(XLES_SUBGRID_VSv   (0,0,0,0))
+  ALLOCATE(XLES_SUBGRID_WSv   (0,0,0,0))
+  ALLOCATE(XLES_SUBGRID_Sv2     (0,0,0,0))
+  ALLOCATE(XLES_SUBGRID_SvThv   (0,0,0,0))
+  ALLOCATE(XLES_SUBGRID_W2Sv    (0,0,0,0))
+  ALLOCATE(XLES_SUBGRID_WSv2    (0,0,0,0))
+  ALLOCATE(XLES_SUBGRID_DISS_Sv2(0,0,0,0))
+  ALLOCATE(XLES_SUBGRID_SvPz    (0,0,0,0))
+END IF
+!
+XLES_SUBGRID_U2  = XUNDEF
+XLES_SUBGRID_V2  = XUNDEF
+XLES_SUBGRID_W2  = XUNDEF
+XLES_SUBGRID_Tke = XUNDEF
+XLES_SUBGRID_Thl2= XUNDEF
+XLES_SUBGRID_UV  = XUNDEF
+XLES_SUBGRID_WU  = XUNDEF
+XLES_SUBGRID_WV  = XUNDEF
+XLES_SUBGRID_UThl= XUNDEF
+XLES_SUBGRID_VThl= XUNDEF
+XLES_SUBGRID_WThl= XUNDEF
+XLES_SUBGRID_WThv= XUNDEF
+XLES_SUBGRID_ThlThv= XUNDEF
+XLES_SUBGRID_W2Thl= XUNDEF
+XLES_SUBGRID_WThl2    = XUNDEF
+XLES_SUBGRID_DISS_Tke = XUNDEF
+XLES_SUBGRID_DISS_Thl2= XUNDEF
+XLES_SUBGRID_WP       = XUNDEF
+XLES_SUBGRID_PHI3     = XUNDEF
+XLES_SUBGRID_LMix     = XUNDEF
+XLES_SUBGRID_LDiss    = XUNDEF
+XLES_SUBGRID_Km       = XUNDEF
+XLES_SUBGRID_Kh       = XUNDEF
+XLES_SUBGRID_ThlPz    = XUNDEF
+XLES_SUBGRID_UTke= XUNDEF
+XLES_SUBGRID_VTke= XUNDEF
+XLES_SUBGRID_WTke= XUNDEF
+XLES_SUBGRID_ddz_WTke  = XUNDEF
+
+XLES_SUBGRID_THLUP_MF = XUNDEF
+XLES_SUBGRID_RTUP_MF  = XUNDEF
+XLES_SUBGRID_RVUP_MF  = XUNDEF
+XLES_SUBGRID_RCUP_MF  = XUNDEF
+XLES_SUBGRID_RIUP_MF  = XUNDEF
+XLES_SUBGRID_WUP_MF   = XUNDEF
+XLES_SUBGRID_MASSFLUX = XUNDEF
+XLES_SUBGRID_DETR     = XUNDEF
+XLES_SUBGRID_ENTR     = XUNDEF
+XLES_SUBGRID_FRACUP   = XUNDEF
+XLES_SUBGRID_THVUP_MF = XUNDEF
+XLES_SUBGRID_WTHLMF   = XUNDEF  
+XLES_SUBGRID_WRTMF    = XUNDEF
+XLES_SUBGRID_WTHVMF   = XUNDEF
+XLES_SUBGRID_WUMF     = XUNDEF
+XLES_SUBGRID_WVMF     = XUNDEF
+
+IF (LUSERV ) THEN
+  XLES_SUBGRID_Rt2 = XUNDEF
+  XLES_SUBGRID_ThlRt= XUNDEF
+  XLES_SUBGRID_URt = XUNDEF
+  XLES_SUBGRID_VRt = XUNDEF
+  XLES_SUBGRID_WRt = XUNDEF
+  XLES_SUBGRID_RtThv   = XUNDEF
+  XLES_SUBGRID_W2Rt    = XUNDEF
+  XLES_SUBGRID_WThlRt  = XUNDEF
+  XLES_SUBGRID_WRt2    = XUNDEF
+  XLES_SUBGRID_DISS_Rt2= XUNDEF
+  XLES_SUBGRID_DISS_ThlRt= XUNDEF
+  XLES_SUBGRID_RtPz    = XUNDEF
+  XLES_SUBGRID_PSI3     = XUNDEF
+END IF
+IF (LUSERC ) THEN
+  XLES_SUBGRID_Rc2 = XUNDEF
+  XLES_SUBGRID_URc = XUNDEF
+  XLES_SUBGRID_VRc = XUNDEF
+  XLES_SUBGRID_WRc = XUNDEF
+END IF
+IF (LUSERI ) THEN
+  XLES_SUBGRID_Ri2 = XUNDEF
+END IF
+IF (NSV>0  ) THEN
+  XLES_SUBGRID_USv = XUNDEF
+  XLES_SUBGRID_VSv = XUNDEF
+  XLES_SUBGRID_WSv = XUNDEF
+  XLES_SUBGRID_Sv2     = XUNDEF
+  XLES_SUBGRID_SvThv   = XUNDEF
+  XLES_SUBGRID_W2Sv    = XUNDEF
+  XLES_SUBGRID_WSv2    = XUNDEF
+  XLES_SUBGRID_DISS_Sv2= XUNDEF
+  XLES_SUBGRID_SvPz    = XUNDEF
+END IF
+!
+!
+!*      7.6  updraft quantities (only on the cartesian mask)
+!            ------------------
+!
+ALLOCATE(XLES_UPDRAFT       (NLES_K,NLES_TIMES))    ! updraft fraction
+ALLOCATE(XLES_UPDRAFT_W     (NLES_K,NLES_TIMES))    ! <w>
+ALLOCATE(XLES_UPDRAFT_Th    (NLES_K,NLES_TIMES))    ! <theta>
+ALLOCATE(XLES_UPDRAFT_Ke    (NLES_K,NLES_TIMES))    ! <E>
+ALLOCATE(XLES_UPDRAFT_WTh   (NLES_K,NLES_TIMES))    ! <w'theta'>
+ALLOCATE(XLES_UPDRAFT_Th2   (NLES_K,NLES_TIMES))    ! <th'2>
+ALLOCATE(XLES_UPDRAFT_Tke   (NLES_K,NLES_TIMES))    ! <e>
+
+IF (LUSERV) THEN
+  ALLOCATE(XLES_UPDRAFT_Thv   (NLES_K,NLES_TIMES))    ! <thetav>
+  ALLOCATE(XLES_UPDRAFT_WThv  (NLES_K,NLES_TIMES))    ! <w'thv'>
+  ALLOCATE(XLES_UPDRAFT_ThThv (NLES_K,NLES_TIMES))    ! <th'thv'>
+ELSE
+  ALLOCATE(XLES_UPDRAFT_Thv   (0,0))
+  ALLOCATE(XLES_UPDRAFT_WThv  (0,0))
+  ALLOCATE(XLES_UPDRAFT_ThThv (0,0))
+END IF
+!
+IF (LUSERC) THEN
+  ALLOCATE(XLES_UPDRAFT_Thl   (NLES_K,NLES_TIMES))    ! <thetal>
+  ALLOCATE(XLES_UPDRAFT_WThl  (NLES_K,NLES_TIMES))    ! <w'thetal'>
+  ALLOCATE(XLES_UPDRAFT_Thl2  (NLES_K,NLES_TIMES))    ! <thl'2>
+  ALLOCATE(XLES_UPDRAFT_ThlThv(NLES_K,NLES_TIMES))    ! <thl'thv'>
+ELSE
+  ALLOCATE(XLES_UPDRAFT_Thl   (0,0))
+  ALLOCATE(XLES_UPDRAFT_WThl  (0,0))
+  ALLOCATE(XLES_UPDRAFT_Thl2  (0,0))
+  ALLOCATE(XLES_UPDRAFT_ThlThv(0,0))
+END IF
+
+IF (LUSERV ) THEN
+  ALLOCATE(XLES_UPDRAFT_Rv    (NLES_K,NLES_TIMES))    ! <Rv>
+  ALLOCATE(XLES_UPDRAFT_WRv   (NLES_K,NLES_TIMES))    ! <w'Rv'>
+  ALLOCATE(XLES_UPDRAFT_Rv2   (NLES_K,NLES_TIMES))    ! <Rv'2>
+  ALLOCATE(XLES_UPDRAFT_ThRv  (NLES_K,NLES_TIMES))    ! <Th'Rv'>
+  ALLOCATE(XLES_UPDRAFT_ThvRv (NLES_K,NLES_TIMES))    ! <Thv'Rv'>
+  IF (LUSERC) THEN
+    ALLOCATE(XLES_UPDRAFT_ThlRv (NLES_K,NLES_TIMES))    ! <Thl'Rv'>
+  ELSE
+    ALLOCATE(XLES_UPDRAFT_ThlRv (0,0))
+  END IF
+ELSE
+  ALLOCATE(XLES_UPDRAFT_Rv    (0,0))
+  ALLOCATE(XLES_UPDRAFT_WRv   (0,0))
+  ALLOCATE(XLES_UPDRAFT_Rv2   (0,0))
+  ALLOCATE(XLES_UPDRAFT_ThRv  (0,0))
+  ALLOCATE(XLES_UPDRAFT_ThvRv (0,0))
+  ALLOCATE(XLES_UPDRAFT_ThlRv (0,0))
+END IF
+IF (LUSERC ) THEN
+  ALLOCATE(XLES_UPDRAFT_Rc    (NLES_K,NLES_TIMES))    ! <Rc>
+  ALLOCATE(XLES_UPDRAFT_WRc   (NLES_K,NLES_TIMES))    ! <w'Rc'>
+  ALLOCATE(XLES_UPDRAFT_Rc2   (NLES_K,NLES_TIMES))    ! <Rc'2>
+  ALLOCATE(XLES_UPDRAFT_ThRc  (NLES_K,NLES_TIMES))    ! <Th'Rc'>
+  ALLOCATE(XLES_UPDRAFT_ThvRc (NLES_K,NLES_TIMES))    ! <Thv'Rc'>
+  ALLOCATE(XLES_UPDRAFT_ThlRc (NLES_K,NLES_TIMES))    ! <Thl'Rc'>
+ELSE
+  ALLOCATE(XLES_UPDRAFT_Rc    (0,0))
+  ALLOCATE(XLES_UPDRAFT_WRc   (0,0))
+  ALLOCATE(XLES_UPDRAFT_Rc2   (0,0))
+  ALLOCATE(XLES_UPDRAFT_ThRc  (0,0))
+  ALLOCATE(XLES_UPDRAFT_ThvRc (0,0))
+  ALLOCATE(XLES_UPDRAFT_ThlRc (0,0))
+END IF
+IF (LUSERR ) THEN
+  ALLOCATE(XLES_UPDRAFT_Rr    (NLES_K,NLES_TIMES))    ! <Rr>
+ELSE
+  ALLOCATE(XLES_UPDRAFT_Rr    (0,0))
+END IF
+IF (LUSERI ) THEN
+  ALLOCATE(XLES_UPDRAFT_Ri    (NLES_K,NLES_TIMES))    ! <Ri>
+  ALLOCATE(XLES_UPDRAFT_WRi   (NLES_K,NLES_TIMES))    ! <w'Ri'>
+  ALLOCATE(XLES_UPDRAFT_Ri2   (NLES_K,NLES_TIMES))    ! <Ri'2>
+  ALLOCATE(XLES_UPDRAFT_ThRi  (NLES_K,NLES_TIMES))    ! <Th'Ri'>
+  ALLOCATE(XLES_UPDRAFT_ThvRi (NLES_K,NLES_TIMES))    ! <Thv'Ri'>
+  ALLOCATE(XLES_UPDRAFT_ThlRi (NLES_K,NLES_TIMES))    ! <Thl'Ri'>
+ELSE
+  ALLOCATE(XLES_UPDRAFT_Ri    (0,0))
+  ALLOCATE(XLES_UPDRAFT_WRi   (0,0))
+  ALLOCATE(XLES_UPDRAFT_Ri2   (0,0))
+  ALLOCATE(XLES_UPDRAFT_ThRi  (0,0))
+  ALLOCATE(XLES_UPDRAFT_ThvRi (0,0))
+  ALLOCATE(XLES_UPDRAFT_ThlRi (0,0))
+END IF
+IF (LUSERS ) THEN
+  ALLOCATE(XLES_UPDRAFT_Rs    (NLES_K,NLES_TIMES))    ! <Rs>
+ELSE
+  ALLOCATE(XLES_UPDRAFT_Rs    (0,0))
+END IF
+IF (LUSERG ) THEN
+  ALLOCATE(XLES_UPDRAFT_Rg    (NLES_K,NLES_TIMES))    ! <Rg>
+ELSE
+  ALLOCATE(XLES_UPDRAFT_Rg    (0,0))
+END IF
+IF (LUSERH ) THEN
+  ALLOCATE(XLES_UPDRAFT_Rh    (NLES_K,NLES_TIMES))    ! <Rh>
+ELSE
+  ALLOCATE(XLES_UPDRAFT_Rh    (0,0))
+END IF
+IF (NSV>0  ) THEN
+  ALLOCATE(XLES_UPDRAFT_Sv    (NLES_K,NLES_TIMES,NSV))! <Sv>
+  ALLOCATE(XLES_UPDRAFT_WSv   (NLES_K,NLES_TIMES,NSV))! <w'Sv'>
+  ALLOCATE(XLES_UPDRAFT_Sv2   (NLES_K,NLES_TIMES,NSV))! <Sv'2>
+  ALLOCATE(XLES_UPDRAFT_ThSv  (NLES_K,NLES_TIMES,NSV))! <Th'Sv'>
+  IF (LUSERV) THEN
+    ALLOCATE(XLES_UPDRAFT_ThvSv  (NLES_K,NLES_TIMES,NSV))! <Thv'Sv'>
+  ELSE
+    ALLOCATE(XLES_UPDRAFT_ThvSv  (0,0,0))
+  END IF
+  IF (LUSERC) THEN
+    ALLOCATE(XLES_UPDRAFT_ThlSv  (NLES_K,NLES_TIMES,NSV))! <Thl'Sv'>
+  ELSE
+    ALLOCATE(XLES_UPDRAFT_ThlSv  (0,0,0))
+  END IF
+ELSE
+  ALLOCATE(XLES_UPDRAFT_Sv    (0,0,0))
+  ALLOCATE(XLES_UPDRAFT_WSv   (0,0,0))
+  ALLOCATE(XLES_UPDRAFT_Sv2   (0,0,0))
+  ALLOCATE(XLES_UPDRAFT_ThSv  (0,0,0))
+  ALLOCATE(XLES_UPDRAFT_ThvSv (0,0,0))
+  ALLOCATE(XLES_UPDRAFT_ThlSv (0,0,0))
+END IF
+!
+!
+XLES_UPDRAFT     = XUNDEF
+XLES_UPDRAFT_W   = XUNDEF
+XLES_UPDRAFT_Th  = XUNDEF
+XLES_UPDRAFT_Thl = XUNDEF
+XLES_UPDRAFT_Tke  = XUNDEF
+IF (LUSERV ) XLES_UPDRAFT_Thv = XUNDEF
+IF (LUSERC ) XLES_UPDRAFT_Thl = XUNDEF
+IF (LUSERV ) XLES_UPDRAFT_Rv  = XUNDEF
+IF (LUSERC ) XLES_UPDRAFT_Rc  = XUNDEF
+IF (LUSERR ) XLES_UPDRAFT_Rr  = XUNDEF
+IF (LUSERI ) XLES_UPDRAFT_Ri  = XUNDEF
+IF (LUSERS ) XLES_UPDRAFT_Rs  = XUNDEF
+IF (LUSERG ) XLES_UPDRAFT_Rg  = XUNDEF
+IF (LUSERH ) XLES_UPDRAFT_Rh  = XUNDEF
+IF (NSV>0  ) XLES_UPDRAFT_Sv  = XUNDEF
+XLES_UPDRAFT_Ke   = XUNDEF
+XLES_UPDRAFT_WTh  = XUNDEF
+IF (LUSERV ) XLES_UPDRAFT_WThv = XUNDEF
+IF (LUSERC ) XLES_UPDRAFT_WThl = XUNDEF
+IF (LUSERV ) XLES_UPDRAFT_WRv  = XUNDEF
+IF (LUSERC ) XLES_UPDRAFT_WRc  = XUNDEF
+IF (LUSERI ) XLES_UPDRAFT_WRi  = XUNDEF
+IF (NSV>0  ) XLES_UPDRAFT_WSv  = XUNDEF
+XLES_UPDRAFT_Th2  = XUNDEF
+IF (LUSERV ) THEN
+  XLES_UPDRAFT_ThThv  = XUNDEF
+END IF
+IF (LUSERC ) THEN
+  XLES_UPDRAFT_Thl2   = XUNDEF
+  XLES_UPDRAFT_ThlThv = XUNDEF
+END IF
+IF (LUSERV ) XLES_UPDRAFT_Rv2  = XUNDEF
+IF (LUSERC ) XLES_UPDRAFT_Rc2  = XUNDEF
+IF (LUSERI ) XLES_UPDRAFT_Ri2  = XUNDEF
+IF (NSV>0  ) XLES_UPDRAFT_Sv2  = XUNDEF
+IF (LUSERV ) XLES_UPDRAFT_ThRv = XUNDEF
+IF (LUSERC ) XLES_UPDRAFT_ThRc = XUNDEF
+IF (LUSERI ) XLES_UPDRAFT_ThRi = XUNDEF
+IF (LUSERC ) XLES_UPDRAFT_ThlRv= XUNDEF
+IF (LUSERC ) XLES_UPDRAFT_ThlRc= XUNDEF
+IF (LUSERI ) XLES_UPDRAFT_ThlRi= XUNDEF
+IF (NSV>0  ) XLES_UPDRAFT_ThSv = XUNDEF
+IF (LUSERV ) XLES_UPDRAFT_ThvRv= XUNDEF
+IF (LUSERC ) XLES_UPDRAFT_ThvRc= XUNDEF
+IF (LUSERI ) XLES_UPDRAFT_ThvRi= XUNDEF
+IF (NSV>0 .AND. LUSERV) XLES_UPDRAFT_ThvSv = XUNDEF
+IF (NSV>0 .AND. LUSERC) XLES_UPDRAFT_ThlSv = XUNDEF
+!
+!
+!*      7.7  downdraft quantities (only on the cartesian mask)
+!            --------------------
+!
+ALLOCATE(XLES_DOWNDRAFT       (NLES_K,NLES_TIMES))    ! updraft fraction
+ALLOCATE(XLES_DOWNDRAFT_W     (NLES_K,NLES_TIMES))    ! <w>
+ALLOCATE(XLES_DOWNDRAFT_Th    (NLES_K,NLES_TIMES))    ! <theta>
+ALLOCATE(XLES_DOWNDRAFT_Ke    (NLES_K,NLES_TIMES))    ! <E>
+ALLOCATE(XLES_DOWNDRAFT_WTh   (NLES_K,NLES_TIMES))    ! <w'theta'>
+ALLOCATE(XLES_DOWNDRAFT_Th2   (NLES_K,NLES_TIMES))    ! <th'2>
+ALLOCATE(XLES_DOWNDRAFT_Tke   (NLES_K,NLES_TIMES))    ! <e>
+
+IF (LUSERV) THEN
+  ALLOCATE(XLES_DOWNDRAFT_Thv   (NLES_K,NLES_TIMES))    ! <thetav>
+  ALLOCATE(XLES_DOWNDRAFT_WThv  (NLES_K,NLES_TIMES))    ! <w'thv'>
+  ALLOCATE(XLES_DOWNDRAFT_ThThv (NLES_K,NLES_TIMES))    ! <th'thv'>
+ELSE
+  ALLOCATE(XLES_DOWNDRAFT_Thv   (0,0))
+  ALLOCATE(XLES_DOWNDRAFT_WThv  (0,0))
+  ALLOCATE(XLES_DOWNDRAFT_ThThv (0,0))
+END IF
+!
+IF (LUSERC) THEN
+  ALLOCATE(XLES_DOWNDRAFT_Thl   (NLES_K,NLES_TIMES))    ! <thetal>
+  ALLOCATE(XLES_DOWNDRAFT_WThl  (NLES_K,NLES_TIMES))    ! <w'thetal'>
+  ALLOCATE(XLES_DOWNDRAFT_Thl2  (NLES_K,NLES_TIMES))    ! <thl'2>
+  ALLOCATE(XLES_DOWNDRAFT_ThlThv(NLES_K,NLES_TIMES))    ! <thl'thv'>
+ELSE
+  ALLOCATE(XLES_DOWNDRAFT_Thl   (0,0))
+  ALLOCATE(XLES_DOWNDRAFT_WThl  (0,0))
+  ALLOCATE(XLES_DOWNDRAFT_Thl2  (0,0))
+  ALLOCATE(XLES_DOWNDRAFT_ThlThv(0,0))
+END IF
+
+IF (LUSERV ) THEN
+  ALLOCATE(XLES_DOWNDRAFT_Rv    (NLES_K,NLES_TIMES))    ! <Rv>
+  ALLOCATE(XLES_DOWNDRAFT_WRv   (NLES_K,NLES_TIMES))    ! <w'Rv'>
+  ALLOCATE(XLES_DOWNDRAFT_Rv2   (NLES_K,NLES_TIMES))    ! <Rv'2>
+  ALLOCATE(XLES_DOWNDRAFT_ThRv  (NLES_K,NLES_TIMES))    ! <Th'Rv'>
+  ALLOCATE(XLES_DOWNDRAFT_ThvRv (NLES_K,NLES_TIMES))    ! <Thv'Rv'>
+  IF (LUSERC) THEN
+    ALLOCATE(XLES_DOWNDRAFT_ThlRv (NLES_K,NLES_TIMES))    ! <Thl'Rv'>
+  ELSE
+    ALLOCATE(XLES_DOWNDRAFT_ThlRv (0,0))
+  END IF
+ELSE
+  ALLOCATE(XLES_DOWNDRAFT_Rv    (0,0))
+  ALLOCATE(XLES_DOWNDRAFT_WRv   (0,0))
+  ALLOCATE(XLES_DOWNDRAFT_Rv2   (0,0))
+  ALLOCATE(XLES_DOWNDRAFT_ThRv  (0,0))
+  ALLOCATE(XLES_DOWNDRAFT_ThvRv (0,0))
+  ALLOCATE(XLES_DOWNDRAFT_ThlRv (0,0))
+END IF
+IF (LUSERC ) THEN
+  ALLOCATE(XLES_DOWNDRAFT_Rc    (NLES_K,NLES_TIMES))    ! <Rc>
+  ALLOCATE(XLES_DOWNDRAFT_WRc   (NLES_K,NLES_TIMES))    ! <w'Rc'>
+  ALLOCATE(XLES_DOWNDRAFT_Rc2   (NLES_K,NLES_TIMES))    ! <Rc'2>
+  ALLOCATE(XLES_DOWNDRAFT_ThRc  (NLES_K,NLES_TIMES))    ! <Th'Rc'>
+  ALLOCATE(XLES_DOWNDRAFT_ThvRc (NLES_K,NLES_TIMES))    ! <Thv'Rc'>
+  ALLOCATE(XLES_DOWNDRAFT_ThlRc (NLES_K,NLES_TIMES))    ! <Thl'Rc'>
+ELSE
+  ALLOCATE(XLES_DOWNDRAFT_Rc    (0,0))
+  ALLOCATE(XLES_DOWNDRAFT_WRc   (0,0))
+  ALLOCATE(XLES_DOWNDRAFT_Rc2   (0,0))
+  ALLOCATE(XLES_DOWNDRAFT_ThRc  (0,0))
+  ALLOCATE(XLES_DOWNDRAFT_ThvRc (0,0))
+  ALLOCATE(XLES_DOWNDRAFT_ThlRc (0,0))
+END IF
+IF (LUSERR ) THEN
+  ALLOCATE(XLES_DOWNDRAFT_Rr    (NLES_K,NLES_TIMES))    ! <Rr>
+ELSE
+  ALLOCATE(XLES_DOWNDRAFT_Rr    (0,0))
+END IF
+IF (LUSERI ) THEN
+  ALLOCATE(XLES_DOWNDRAFT_Ri    (NLES_K,NLES_TIMES))    ! <Ri>
+  ALLOCATE(XLES_DOWNDRAFT_WRi   (NLES_K,NLES_TIMES))    ! <w'Ri'>
+  ALLOCATE(XLES_DOWNDRAFT_Ri2   (NLES_K,NLES_TIMES))    ! <Ri'2>
+  ALLOCATE(XLES_DOWNDRAFT_ThRi  (NLES_K,NLES_TIMES))    ! <Th'Ri'>
+  ALLOCATE(XLES_DOWNDRAFT_ThvRi (NLES_K,NLES_TIMES))    ! <Thv'Ri'>
+  ALLOCATE(XLES_DOWNDRAFT_ThlRi (NLES_K,NLES_TIMES))    ! <Thl'Ri'>
+ELSE
+  ALLOCATE(XLES_DOWNDRAFT_Ri    (0,0))
+  ALLOCATE(XLES_DOWNDRAFT_WRi   (0,0))
+  ALLOCATE(XLES_DOWNDRAFT_Ri2   (0,0))
+  ALLOCATE(XLES_DOWNDRAFT_ThRi  (0,0))
+  ALLOCATE(XLES_DOWNDRAFT_ThvRi (0,0))
+  ALLOCATE(XLES_DOWNDRAFT_ThlRi (0,0))
+END IF
+IF (LUSERS ) THEN
+  ALLOCATE(XLES_DOWNDRAFT_Rs    (NLES_K,NLES_TIMES))    ! <Rs>
+ELSE
+  ALLOCATE(XLES_DOWNDRAFT_Rs    (0,0))
+END IF
+IF (LUSERG ) THEN
+  ALLOCATE(XLES_DOWNDRAFT_Rg    (NLES_K,NLES_TIMES))    ! <Rg>
+ELSE
+  ALLOCATE(XLES_DOWNDRAFT_Rg    (0,0))
+END IF
+IF (LUSERH ) THEN
+  ALLOCATE(XLES_DOWNDRAFT_Rh    (NLES_K,NLES_TIMES))    ! <Rh>
+ELSE
+  ALLOCATE(XLES_DOWNDRAFT_Rh    (0,0))
+END IF
+IF (NSV>0  ) THEN
+  ALLOCATE(XLES_DOWNDRAFT_Sv    (NLES_K,NLES_TIMES,NSV))! <Sv>
+  ALLOCATE(XLES_DOWNDRAFT_WSv   (NLES_K,NLES_TIMES,NSV))! <w'Sv'>
+  ALLOCATE(XLES_DOWNDRAFT_Sv2   (NLES_K,NLES_TIMES,NSV))! <Sv'2>
+  ALLOCATE(XLES_DOWNDRAFT_ThSv  (NLES_K,NLES_TIMES,NSV))! <Th'Sv'>
+  IF (LUSERV) THEN
+    ALLOCATE(XLES_DOWNDRAFT_ThvSv  (NLES_K,NLES_TIMES,NSV))! <Thv'Sv'>
+  ELSE
+    ALLOCATE(XLES_DOWNDRAFT_ThvSv  (0,0,0))
+  END IF
+  IF (LUSERC) THEN
+    ALLOCATE(XLES_DOWNDRAFT_ThlSv  (NLES_K,NLES_TIMES,NSV))! <Thl'Sv'>
+  ELSE
+    ALLOCATE(XLES_DOWNDRAFT_ThlSv  (0,0,0))
+  END IF
+ELSE
+  ALLOCATE(XLES_DOWNDRAFT_Sv    (0,0,0))
+  ALLOCATE(XLES_DOWNDRAFT_WSv   (0,0,0))
+  ALLOCATE(XLES_DOWNDRAFT_Sv2   (0,0,0))
+  ALLOCATE(XLES_DOWNDRAFT_ThSv  (0,0,0))
+  ALLOCATE(XLES_DOWNDRAFT_ThvSv (0,0,0))
+  ALLOCATE(XLES_DOWNDRAFT_ThlSv (0,0,0))
+END IF
+!
+!
+XLES_DOWNDRAFT     = XUNDEF
+XLES_DOWNDRAFT_W   = XUNDEF
+XLES_DOWNDRAFT_Th  = XUNDEF
+XLES_DOWNDRAFT_Thl = XUNDEF
+XLES_DOWNDRAFT_Tke  = XUNDEF
+IF (LUSERV ) XLES_DOWNDRAFT_Thv = XUNDEF
+IF (LUSERC ) XLES_DOWNDRAFT_Thl = XUNDEF
+IF (LUSERV ) XLES_DOWNDRAFT_Rv  = XUNDEF
+IF (LUSERC ) XLES_DOWNDRAFT_Rc  = XUNDEF
+IF (LUSERR ) XLES_DOWNDRAFT_Rr  = XUNDEF
+IF (LUSERI ) XLES_DOWNDRAFT_Ri  = XUNDEF
+IF (LUSERS ) XLES_DOWNDRAFT_Rs  = XUNDEF
+IF (LUSERG ) XLES_DOWNDRAFT_Rg  = XUNDEF
+IF (LUSERH ) XLES_DOWNDRAFT_Rh  = XUNDEF
+IF (NSV>0  ) XLES_DOWNDRAFT_Sv  = XUNDEF
+XLES_DOWNDRAFT_Ke   = XUNDEF
+XLES_DOWNDRAFT_WTh  = XUNDEF
+IF (LUSERV ) XLES_DOWNDRAFT_WThv = XUNDEF
+IF (LUSERC ) XLES_DOWNDRAFT_WThl = XUNDEF
+IF (LUSERV ) XLES_DOWNDRAFT_WRv  = XUNDEF
+IF (LUSERC ) XLES_DOWNDRAFT_WRc  = XUNDEF
+IF (LUSERI ) XLES_DOWNDRAFT_WRi  = XUNDEF
+IF (NSV>0  ) XLES_DOWNDRAFT_WSv  = XUNDEF
+XLES_DOWNDRAFT_Th2  = XUNDEF
+IF (LUSERV ) THEN
+  XLES_DOWNDRAFT_ThThv  = XUNDEF
+END IF
+IF (LUSERC ) THEN
+  XLES_DOWNDRAFT_Thl2   = XUNDEF
+  XLES_DOWNDRAFT_ThlThv = XUNDEF
+END IF
+IF (LUSERV ) XLES_DOWNDRAFT_Rv2  = XUNDEF
+IF (LUSERC ) XLES_DOWNDRAFT_Rc2  = XUNDEF
+IF (LUSERI ) XLES_DOWNDRAFT_Ri2  = XUNDEF
+IF (NSV>0  ) XLES_DOWNDRAFT_Sv2  = XUNDEF
+IF (LUSERV ) XLES_DOWNDRAFT_ThRv = XUNDEF
+IF (LUSERC ) XLES_DOWNDRAFT_ThRc = XUNDEF
+IF (LUSERI ) XLES_DOWNDRAFT_ThRi = XUNDEF
+IF (LUSERC ) XLES_DOWNDRAFT_ThlRv= XUNDEF
+IF (LUSERC ) XLES_DOWNDRAFT_ThlRc= XUNDEF
+IF (LUSERI ) XLES_DOWNDRAFT_ThlRi= XUNDEF
+IF (NSV>0  ) XLES_DOWNDRAFT_ThSv = XUNDEF
+IF (LUSERV ) XLES_DOWNDRAFT_ThvRv= XUNDEF
+IF (LUSERC ) XLES_DOWNDRAFT_ThvRc= XUNDEF
+IF (LUSERI ) XLES_DOWNDRAFT_ThvRi= XUNDEF
+IF (NSV>0 .AND. LUSERV) XLES_DOWNDRAFT_ThvSv = XUNDEF
+IF (NSV>0 .AND. LUSERC) XLES_DOWNDRAFT_ThlSv = XUNDEF
+!
+!*      7.8  production terms
+!            ----------------
+!
+ALLOCATE(XLES_BU_RES_KE   (NLES_K,NLES_TIMES,NLES_TOT))
+ALLOCATE(XLES_BU_RES_WThl (NLES_K,NLES_TIMES,NLES_TOT))
+ALLOCATE(XLES_BU_RES_Thl2 (NLES_K,NLES_TIMES,NLES_TOT))
+ALLOCATE(XLES_BU_SBG_TKE  (NLES_K,NLES_TIMES,NLES_TOT))
+XLES_BU_RES_KE    = 0.
+XLES_BU_RES_WThl  = 0.
+XLES_BU_RES_Thl2  = 0.
+XLES_BU_SBG_TKE   = 0.
+IF (LUSERV) THEN
+  ALLOCATE(XLES_BU_RES_WRt  (NLES_K,NLES_TIMES,NLES_TOT))
+  ALLOCATE(XLES_BU_RES_Rt2  (NLES_K,NLES_TIMES,NLES_TOT))
+  ALLOCATE(XLES_BU_RES_ThlRt(NLES_K,NLES_TIMES,NLES_TOT))
+  XLES_BU_RES_WRt   = 0.
+  XLES_BU_RES_Rt2   = 0.
+  XLES_BU_RES_ThlRt = 0.
+END IF
+ALLOCATE(XLES_BU_RES_WSv (NLES_K,NLES_TIMES,NLES_TOT,NSV))
+ALLOCATE(XLES_BU_RES_Sv2 (NLES_K,NLES_TIMES,NLES_TOT,NSV))
+IF (NSV>0) THEN
+  XLES_BU_RES_WSv = 0.
+  XLES_BU_RES_Sv2 = 0.
+END IF
+!
+!-------------------------------------------------------------------------------
+!
+!*      8.   Allocations of the normalization variables temporal series
+!            ----------------------------------------------------------
+!
+ALLOCATE(XLES_UW0       (NLES_TIMES))
+ALLOCATE(XLES_VW0       (NLES_TIMES))
+ALLOCATE(XLES_USTAR     (NLES_TIMES))
+ALLOCATE(XLES_WSTAR     (NLES_TIMES))
+ALLOCATE(XLES_Q0        (NLES_TIMES))
+ALLOCATE(XLES_E0        (NLES_TIMES))
+ALLOCATE(XLES_SV0       (NLES_TIMES,NSV))
+ALLOCATE(XLES_BL_HEIGHT (NLES_TIMES))
+ALLOCATE(XLES_MO_LENGTH (NLES_TIMES))
+ALLOCATE(XLES_ZCB       (NLES_TIMES))
+ALLOCATE(XLES_CFtot     (NLES_TIMES))
+ALLOCATE(XLES_CF2tot    (NLES_TIMES))
+ALLOCATE(XLES_LWP       (NLES_TIMES))
+ALLOCATE(XLES_LWPVAR    (NLES_TIMES))
+ALLOCATE(XLES_RWP       (NLES_TIMES))
+ALLOCATE(XLES_IWP       (NLES_TIMES))
+ALLOCATE(XLES_SWP       (NLES_TIMES))
+ALLOCATE(XLES_GWP       (NLES_TIMES))
+ALLOCATE(XLES_HWP       (NLES_TIMES))
+ALLOCATE(XLES_INT_TKE   (NLES_TIMES))
+ALLOCATE(XLES_ZMAXCF    (NLES_TIMES))
+ALLOCATE(XLES_ZMAXCF2   (NLES_TIMES))  
+ALLOCATE(XLES_INPRR     (NLES_TIMES))
+ALLOCATE(XLES_INPRC     (NLES_TIMES))
+ALLOCATE(XLES_INDEP     (NLES_TIMES))
+ALLOCATE(XLES_RAIN_INPRR(NLES_TIMES))
+ALLOCATE(XLES_ACPRR     (NLES_TIMES))
+ALLOCATE(XLES_PRECFR    (NLES_TIMES))
+ALLOCATE(XLES_SWU       (NLES_K,NLES_TIMES))
+ALLOCATE(XLES_SWD       (NLES_K,NLES_TIMES))
+ALLOCATE(XLES_LWU       (NLES_K,NLES_TIMES))
+ALLOCATE(XLES_LWD       (NLES_K,NLES_TIMES))
+ALLOCATE(XLES_DTHRADSW  (NLES_K,NLES_TIMES))
+ALLOCATE(XLES_DTHRADLW  (NLES_K,NLES_TIMES))
+ALLOCATE(XLES_RADEFF    (NLES_K,NLES_TIMES))
+!
+XLES_UW0       = XUNDEF
+XLES_VW0       = XUNDEF
+XLES_USTAR     = XUNDEF
+XLES_WSTAR     = XUNDEF
+XLES_Q0        = XUNDEF
+XLES_E0        = XUNDEF
+XLES_SV0       = XUNDEF
+XLES_BL_HEIGHT = XUNDEF
+XLES_MO_LENGTH = XUNDEF
+XLES_ZCB       = XUNDEF
+XLES_CFtot     = XUNDEF
+XLES_CF2tot    = XUNDEF  
+XLES_LWP       = XUNDEF
+XLES_LWPVAR    = XUNDEF
+XLES_RWP       = XUNDEF
+XLES_IWP       = XUNDEF
+XLES_SWP       = XUNDEF
+XLES_GWP       = XUNDEF
+XLES_HWP       = XUNDEF
+XLES_INT_TKE   = XUNDEF
+XLES_ZMAXCF    = XUNDEF
+XLES_ZMAXCF2   = XUNDEF  
+XLES_PRECFR    = XUNDEF
+XLES_ACPRR     = XUNDEF
+XLES_INPRR     = XUNDEF
+XLES_INPRC     = XUNDEF
+XLES_INDEP     = XUNDEF
+XLES_RAIN_INPRR = XUNDEF
+XLES_SWU        = XUNDEF
+XLES_SWD        = XUNDEF
+XLES_LWU        = XUNDEF
+XLES_LWD        = XUNDEF
+XLES_DTHRADSW   = XUNDEF
+XLES_DTHRADLW   = XUNDEF
+XLES_RADEFF     = XUNDEF
+!
+!-------------------------------------------------------------------------------
+!
+!*      9.   Allocations of the normalization variables temporal series
+!            ----------------------------------------------------------
+!
+!       9.1  Two-points correlations in I direction
+!            --------------------------------------
+!
+ALLOCATE(XCORRi_UU    (NSPECTRA_NI,NSPECTRA_K,NLES_TIMES))    ! between u and u
+ALLOCATE(XCORRi_VV    (NSPECTRA_NI,NSPECTRA_K,NLES_TIMES))    ! between v and v
+ALLOCATE(XCORRi_UV    (NSPECTRA_NI,NSPECTRA_K,NLES_TIMES))    ! between u and v
+ALLOCATE(XCORRi_WU    (NSPECTRA_NI,NSPECTRA_K,NLES_TIMES))    ! between w and u
+ALLOCATE(XCORRi_WV    (NSPECTRA_NI,NSPECTRA_K,NLES_TIMES))    ! between w and v
+ALLOCATE(XCORRi_WW    (NSPECTRA_NI,NSPECTRA_K,NLES_TIMES))    ! between w and w
+ALLOCATE(XCORRi_WTh   (NSPECTRA_NI,NSPECTRA_K,NLES_TIMES))    ! between w and theta
+ALLOCATE(XCORRi_ThTh  (NSPECTRA_NI,NSPECTRA_K,NLES_TIMES))    ! between theta and theta
+IF (LUSERC) THEN
+  ALLOCATE(XCORRi_WThl  (NSPECTRA_NI,NSPECTRA_K,NLES_TIMES))    ! between w and thetal
+  ALLOCATE(XCORRi_ThlThl(NSPECTRA_NI,NSPECTRA_K,NLES_TIMES))   ! between thetal and thetal
+ELSE
+  ALLOCATE(XCORRi_WThl  (0,0,0))
+  ALLOCATE(XCORRi_ThlThl(0,0,0))
+END IF
+
+
+IF (LUSERV ) THEN
+  ALLOCATE(XCORRi_WRv  (NSPECTRA_NI,NSPECTRA_K,NLES_TIMES))     ! between w and Rv
+  ALLOCATE(XCORRi_ThRv (NSPECTRA_NI,NSPECTRA_K,NLES_TIMES))     ! between theta and Rv
+  IF (LUSERC) THEN
+    ALLOCATE(XCORRi_ThlRv(NSPECTRA_NI,NSPECTRA_K,NLES_TIMES))     ! between thetal and Rv
+  ELSE
+    ALLOCATE(XCORRi_ThlRv(0,0,0))
+  END IF
+  ALLOCATE(XCORRi_RvRv (NSPECTRA_NI,NSPECTRA_K,NLES_TIMES))     ! between Rv and Rv
+ELSE
+  ALLOCATE(XCORRi_WRv  (0,0,0))
+  ALLOCATE(XCORRi_ThRv (0,0,0))
+  ALLOCATE(XCORRi_ThlRv(0,0,0))
+  ALLOCATE(XCORRi_RvRv (0,0,0))
+END IF
+
+IF (LUSERC ) THEN
+  ALLOCATE(XCORRi_WRc  (NSPECTRA_NI,NSPECTRA_K,NLES_TIMES))     ! between w and Rc
+  ALLOCATE(XCORRi_ThRc (NSPECTRA_NI,NSPECTRA_K,NLES_TIMES))     ! between theta and Rc
+  ALLOCATE(XCORRi_ThlRc(NSPECTRA_NI,NSPECTRA_K,NLES_TIMES))     ! between thetal and Rc
+  ALLOCATE(XCORRi_RcRc (NSPECTRA_NI,NSPECTRA_K,NLES_TIMES))     ! between Rc and Rc
+ELSE
+  ALLOCATE(XCORRi_WRc  (0,0,0))
+  ALLOCATE(XCORRi_ThRc (0,0,0))
+  ALLOCATE(XCORRi_ThlRc(0,0,0))
+  ALLOCATE(XCORRi_RcRc (0,0,0))
+END IF
+
+IF (LUSERI ) THEN
+  ALLOCATE(XCORRi_WRi  (NSPECTRA_NI,NSPECTRA_K,NLES_TIMES))     ! between w and Ri
+  ALLOCATE(XCORRi_ThRi (NSPECTRA_NI,NSPECTRA_K,NLES_TIMES))     ! between theta and Rc
+  ALLOCATE(XCORRi_ThlRi(NSPECTRA_NI,NSPECTRA_K,NLES_TIMES))     ! between thetal and Rc
+  ALLOCATE(XCORRi_RiRi (NSPECTRA_NI,NSPECTRA_K,NLES_TIMES))     ! between Rc and Rc
+ELSE
+  ALLOCATE(XCORRi_WRi  (0,0,0))
+  ALLOCATE(XCORRi_ThRi (0,0,0))
+  ALLOCATE(XCORRi_ThlRi(0,0,0))
+  ALLOCATE(XCORRi_RiRi (0,0,0))
+END IF
+
+IF (NSV>0  ) THEN
+  ALLOCATE(XCORRi_WSv  (NSPECTRA_NI,NSPECTRA_K,NLES_TIMES,NSV)) ! between w and Sv
+  ALLOCATE(XCORRi_SvSv (NSPECTRA_NI,NSPECTRA_K,NLES_TIMES,NSV)) ! between Sv and Sv
+ELSE
+  ALLOCATE(XCORRi_WSv  (0,0,0,0))
+  ALLOCATE(XCORRi_SvSv (0,0,0,0))
+END IF
+!
+!
+XCORRi_UU  = XUNDEF
+XCORRi_VV  = XUNDEF
+XCORRi_UV  = XUNDEF
+XCORRi_WU  = XUNDEF
+XCORRi_WV  = XUNDEF
+XCORRi_WW  = XUNDEF
+XCORRi_WTh = XUNDEF
+IF (LUSERC ) XCORRi_WThl= XUNDEF
+IF (LUSERV ) XCORRi_WRv = XUNDEF
+IF (LUSERC ) XCORRi_WRc = XUNDEF
+IF (LUSERI ) XCORRi_WRi = XUNDEF
+IF (NSV>0  ) XCORRi_WSv = XUNDEF
+XCORRi_ThTh  = XUNDEF
+IF (LUSERC ) XCORRi_ThlThl= XUNDEF
+IF (LUSERV ) XCORRi_ThRv = XUNDEF
+IF (LUSERC ) XCORRi_ThRc = XUNDEF
+IF (LUSERI ) XCORRi_ThRi = XUNDEF
+IF (LUSERC ) XCORRi_ThlRv= XUNDEF
+IF (LUSERC ) XCORRi_ThlRc= XUNDEF
+IF (LUSERI ) XCORRi_ThlRi= XUNDEF
+IF (LUSERV ) XCORRi_RvRv = XUNDEF
+IF (LUSERC ) XCORRi_RcRc = XUNDEF
+IF (LUSERI ) XCORRi_RiRi = XUNDEF
+IF (NSV>0  ) XCORRi_SvSv = XUNDEF
+!
+!
+!       9.2  Two-points correlations in J direction
+!            --------------------------------------
+!
+ALLOCATE(XCORRj_UU    (NSPECTRA_NJ,NSPECTRA_K,NLES_TIMES))    ! between u and u
+ALLOCATE(XCORRj_VV    (NSPECTRA_NJ,NSPECTRA_K,NLES_TIMES))    ! between v and v
+ALLOCATE(XCORRj_UV    (NSPECTRA_NJ,NSPECTRA_K,NLES_TIMES))    ! between u and v
+ALLOCATE(XCORRj_WU    (NSPECTRA_NJ,NSPECTRA_K,NLES_TIMES))    ! between w and u
+ALLOCATE(XCORRj_WV    (NSPECTRA_NJ,NSPECTRA_K,NLES_TIMES))    ! between w and v
+ALLOCATE(XCORRj_WW    (NSPECTRA_NJ,NSPECTRA_K,NLES_TIMES))    ! between w and w
+ALLOCATE(XCORRj_WTh   (NSPECTRA_NJ,NSPECTRA_K,NLES_TIMES))    ! between w and theta
+ALLOCATE(XCORRj_ThTh  (NSPECTRA_NJ,NSPECTRA_K,NLES_TIMES))    ! between theta and theta
+IF (LUSERC) THEN
+  ALLOCATE(XCORRj_WThl  (NSPECTRA_NJ,NSPECTRA_K,NLES_TIMES))    ! between w and thetal
+  ALLOCATE(XCORRj_ThlThl(NSPECTRA_NJ,NSPECTRA_K,NLES_TIMES))   ! between thetal and thetal
+ELSE
+  ALLOCATE(XCORRj_WThl  (0,0,0))
+  ALLOCATE(XCORRj_ThlThl(0,0,0))
+END IF
+
+IF (LUSERV ) THEN
+  ALLOCATE(XCORRj_WRv  (NSPECTRA_NJ,NSPECTRA_K,NLES_TIMES))     ! between w and Rv
+  ALLOCATE(XCORRj_ThRv (NSPECTRA_NJ,NSPECTRA_K,NLES_TIMES))     ! between theta and Rv
+  IF (LUSERC) THEN
+    ALLOCATE(XCORRj_ThlRv(NSPECTRA_NJ,NSPECTRA_K,NLES_TIMES))     ! between thetal and Rv
+  ELSE
+    ALLOCATE(XCORRj_ThlRv(0,0,0))
+  END IF
+  ALLOCATE(XCORRj_RvRv (NSPECTRA_NJ,NSPECTRA_K,NLES_TIMES))     ! between Rv and Rv
+ELSE
+  ALLOCATE(XCORRj_WRv  (0,0,0))
+  ALLOCATE(XCORRj_ThRv (0,0,0))
+  ALLOCATE(XCORRj_ThlRv(0,0,0))
+  ALLOCATE(XCORRj_RvRv (0,0,0))
+END IF
+
+IF (LUSERC ) THEN
+  ALLOCATE(XCORRj_WRc  (NSPECTRA_NJ,NSPECTRA_K,NLES_TIMES))     ! between w and Rc
+  ALLOCATE(XCORRj_ThRc (NSPECTRA_NJ,NSPECTRA_K,NLES_TIMES))     ! between theta and Rc
+  ALLOCATE(XCORRj_ThlRc(NSPECTRA_NJ,NSPECTRA_K,NLES_TIMES))     ! between thetal and Rc
+  ALLOCATE(XCORRj_RcRc (NSPECTRA_NJ,NSPECTRA_K,NLES_TIMES))     ! between Rc and Rc
+ELSE
+  ALLOCATE(XCORRj_WRc  (0,0,0))
+  ALLOCATE(XCORRj_ThRc (0,0,0))
+  ALLOCATE(XCORRj_ThlRc(0,0,0))
+  ALLOCATE(XCORRj_RcRc (0,0,0))
+END IF
+
+IF (LUSERI ) THEN
+  ALLOCATE(XCORRj_WRi  (NSPECTRA_NJ,NSPECTRA_K,NLES_TIMES))     ! between w and Ri
+  ALLOCATE(XCORRj_ThRi (NSPECTRA_NJ,NSPECTRA_K,NLES_TIMES))     ! between theta and Rc
+  ALLOCATE(XCORRj_ThlRi(NSPECTRA_NJ,NSPECTRA_K,NLES_TIMES))     ! between thetal and Rc
+  ALLOCATE(XCORRj_RiRi (NSPECTRA_NJ,NSPECTRA_K,NLES_TIMES))     ! between Rc and Rc
+ELSE
+  ALLOCATE(XCORRj_WRi  (0,0,0))
+  ALLOCATE(XCORRj_ThRi (0,0,0))
+  ALLOCATE(XCORRj_ThlRi(0,0,0))
+  ALLOCATE(XCORRj_RiRi (0,0,0))
+END IF
+
+IF (NSV>0  ) THEN
+  ALLOCATE(XCORRj_WSv  (NSPECTRA_NJ,NSPECTRA_K,NLES_TIMES,NSV)) ! between w and Sv
+  ALLOCATE(XCORRj_SvSv (NSPECTRA_NJ,NSPECTRA_K,NLES_TIMES,NSV)) ! between Sv and Sv
+ELSE
+  ALLOCATE(XCORRj_WSv  (0,0,0,0))
+  ALLOCATE(XCORRj_SvSv (0,0,0,0))
+END IF
+!
+!
+XCORRj_UU  = XUNDEF
+XCORRj_VV  = XUNDEF
+XCORRj_UV  = XUNDEF
+XCORRj_WU  = XUNDEF
+XCORRj_WV  = XUNDEF
+XCORRj_WW  = XUNDEF
+XCORRj_WTh = XUNDEF
+IF (LUSERC ) XCORRj_WThl= XUNDEF
+IF (LUSERV ) XCORRj_WRv = XUNDEF
+IF (LUSERC ) XCORRj_WRc = XUNDEF
+IF (LUSERI ) XCORRj_WRi = XUNDEF
+IF (NSV>0  ) XCORRj_WSv = XUNDEF
+XCORRj_ThTh  = XUNDEF
+IF (LUSERC ) XCORRj_ThlThl= XUNDEF
+IF (LUSERV ) XCORRj_ThRv = XUNDEF
+IF (LUSERC ) XCORRj_ThRc = XUNDEF
+IF (LUSERI ) XCORRj_ThRi = XUNDEF
+IF (LUSERC ) XCORRj_ThlRv= XUNDEF
+IF (LUSERC ) XCORRj_ThlRc= XUNDEF
+IF (LUSERI ) XCORRj_ThlRi= XUNDEF
+IF (LUSERV ) XCORRj_RvRv = XUNDEF
+IF (LUSERC ) XCORRj_RcRc = XUNDEF
+IF (LUSERI ) XCORRj_RiRi = XUNDEF
+IF (NSV>0  ) XCORRj_SvSv = XUNDEF
+!
+!-------------------------------------------------------------------------------
+!
+END SUBROUTINE INI_LES_n
diff --git a/src/PHYEX/ext/ini_micron.f90 b/src/PHYEX/ext/ini_micron.f90
new file mode 100644
index 0000000000000000000000000000000000000000..a4934ed55d020c7cdee8d443fa663083e790f54d
--- /dev/null
+++ b/src/PHYEX/ext/ini_micron.f90
@@ -0,0 +1,327 @@
+!MNH_LIC Copyright 2002-2021 CNRS, Meteo-France and Universite Paul Sabatier
+!MNH_LIC This is part of the Meso-NH software governed by the CeCILL-C licence
+!MNH_LIC version 1. See LICENSE, CeCILL-C_V1-en.txt and CeCILL-C_V1-fr.txt
+!MNH_LIC for details. version 1.
+!-----------------------------------------------------------------
+!      ########################
+       MODULE MODI_INI_MICRO_n 
+!      ########################
+!
+INTERFACE
+      SUBROUTINE INI_MICRO_n  ( TPINIFILE,KLUOUT )
+!
+USE MODD_IO, ONLY: TFILEDATA
+!
+TYPE(TFILEDATA), INTENT(IN) :: TPINIFILE ! Initial file
+INTEGER,         INTENT(IN) :: KLUOUT    ! Logical unit number for prints
+!
+END SUBROUTINE INI_MICRO_n 
+!
+END INTERFACE
+!
+END MODULE MODI_INI_MICRO_n 
+!     ############################################
+      SUBROUTINE INI_MICRO_n  ( TPINIFILE,KLUOUT )
+!     ############################################
+!
+!
+!!****  *INI_MICRO_n* allocates and fills MODD_PRECIP_n variables 
+!!                    and initialize parameter for microphysical scheme
+!!
+!!    PURPOSE
+!!    -------
+!!
+!!    EXTERNAL
+!!    --------
+!!
+!!    IMPLICIT ARGUMENTS
+!!    ------------------
+!!
+!!    REFERENCE
+!!    ---------
+!!
+!!    AUTHOR
+!!    ------
+!!      P. Jabouille
+!!
+!!    MODIFICATIONS
+!!    -------------
+!!      Original         27/11/02
+!!      O.Geoffroy (03/2006) : Add KHKO scheme
+!!      Modification    01/2016  (JP Pinty) Add LIMA
+!!      C.LAc          10/2016   Add budget for droplet deposition
+!  P. Wautelet 05/2016-04/2018: new data structures and calls for I/O
+!  P. Wautelet    01/2019: bugfix: add missing allocations
+!  C. Lac         02/2020: add missing allocation of INPRC and ACPRC with deposition
+!  P. Wautelet 14/02/2019: remove CLUOUT/CLUOUT0 and associated variables
+!  P. Wautelet 04/06/2020: bugfix: correct bounds of passed arrays
+! --------------------------------------------------------------------------
+!
+!*      0. DECLARATIONS
+!          ------------
+!
+!
+USE MODD_CONF, ONLY : CCONF,CPROGRAM       
+USE MODD_IO, ONLY : TFILEDATA
+USE MODD_GET_n, ONLY : CGETRCT,CGETRRT, CGETRST, CGETRGT, CGETRHT, CGETCLOUD
+USE MODD_DIM_n, ONLY : NIMAX_ll, NJMAX_ll
+USE MODD_PARAMETERS, ONLY : JPVEXT, JPHEXT
+USE MODD_PARAM_n, ONLY : CCLOUD
+USE MODD_PRECIP_n, ONLY : XINPRR, XACPRR, XINPRS, XACPRS, XINPRG, XACPRG, &
+                          XINPRH, XACPRH, XINPRC, XACPRC, XINPRR3D, XEVAP3D,&
+                          XINDEP,XACDEP
+USE MODD_FIELD_n, ONLY : XRT, XSVT, XTHT, XPABST, XTHM, XRCM
+USE MODD_GRID_n, ONLY : XZZ
+USE MODD_METRICS_n, ONLY : XDXX,XDYY,XDZZ,XDZX,XDZY
+USE MODD_REF_n, ONLY : XRHODREF
+USE MODD_DYN_n, ONLY : XTSTEP
+USE MODD_CLOUDPAR_n, ONLY : NSPLITR, NSPLITG
+USE MODD_PARAM_n, ONLY : CELEC
+USE MODD_PARAM_ICE_n,  ONLY : LSEDIC, LDEPOSC
+USE MODD_PARAM_C2R2, ONLY : LSEDC, LACTIT, LDEPOC
+USE MODD_BLOWSNOW
+USE MODD_BLOWSNOW_n
+!
+USE MODI_READ_PRECIP_FIELD
+USE MODI_INI_CLOUD
+USE MODE_INI_RAIN_ICE, ONLY: INI_RAIN_ICE
+USE MODI_INI_RAIN_C2R2
+USE MODI_INI_ICE_C1R3
+USE MODI_CLEAN_CONC_RAIN_C2R2
+USE MODI_SET_CONC_RAIN_C2R2
+USE MODI_CLEAN_CONC_ICE_C1R3
+USE MODI_SET_CONC_ICE_C1R3
+!
+USE MODE_ll
+USE MODE_MODELN_HANDLER
+USE MODE_BLOWSNOW_SEDIM_LKT
+USE MODE_SET_CONC_LIMA
+!
+USE MODD_NSV,        ONLY : NSV,NSV_CHEM,NSV_C2R2BEG,NSV_C2R2END, &
+                            NSV_C1R3BEG,NSV_C1R3END,              &
+                            NSV_LIMA_BEG, NSV_LIMA_END
+USE MODD_PARAM_LIMA, ONLY : LSCAV, MSEDC=>LSEDC, MACTIT=>LACTIT, MDEPOC=>LDEPOC
+USE MODD_LIMA_PRECIP_SCAVENGING_n
+!
+USE MODI_INIT_AEROSOL_CONCENTRATION
+USE MODE_INI_LIMA, ONLY: INI_LIMA
+!
+IMPLICIT NONE
+!
+!*       0.1   Declarations of dummy arguments :
+!
+TYPE(TFILEDATA), INTENT(IN) :: TPINIFILE ! Initial file
+INTEGER,         INTENT(IN) :: KLUOUT    ! Logical unit number for prints
+!
+!       0.2  declaration of local variables
+!
+!
+!
+INTEGER             :: IIU     ! Upper dimension in x direction (local)
+INTEGER             :: IJU     ! Upper dimension in y direction (local)
+INTEGER             :: IKU     ! Upper dimension in z direction
+INTEGER             :: JK      ! loop vertical index
+INTEGER             :: IINFO_ll! Return code of //routines
+INTEGER             :: IKB,IKE
+!
+REAL, DIMENSION(:,:,:), ALLOCATABLE  :: ZDZ    ! mesh size
+REAL :: ZDZMIN
+INTEGER :: IMI
+!
+!-------------------------------------------------------------------------------
+!
+!*       1.    PROLOGUE
+!
+!
+CALL GET_DIM_EXT_ll('B',IIU,IJU)
+IKU=SIZE(XZZ,3)
+IMI = GET_CURRENT_MODEL_INDEX()
+!
+!
+!*       2.    ALLOCATE  Module MODD_PRECIP_n
+!              ------------------------------
+!
+IF (CCLOUD /= 'NONE' .AND. CCLOUD /= 'REVE') THEN
+  ALLOCATE(XINPRR(IIU,IJU))
+  ALLOCATE(XINPRR3D(IIU,IJU,IKU))
+  ALLOCATE(XEVAP3D(IIU,IJU,IKU))
+  ALLOCATE(XACPRR(IIU,IJU))
+  XINPRR(:,:)=0.0
+  XACPRR(:,:)=0.0
+  XINPRR3D(:,:,:)=0.0
+  XEVAP3D(:,:,:)=0.0
+ELSE
+  ALLOCATE(XINPRR(0,0))
+  ALLOCATE(XINPRR3D(0,0,0))
+  ALLOCATE(XEVAP3D(0,0,0))
+  ALLOCATE(XACPRR(0,0))
+END IF
+!
+IF (( CCLOUD(1:3) == 'ICE'                                   .AND.(LSEDIC .OR. LDEPOSC)) .OR. &
+    ((CCLOUD=='C2R2' .OR. CCLOUD=='C3R5' .OR. CCLOUD=='KHKO').AND.(LSEDC .OR. LDEPOC))  .OR. &
+    ( CCLOUD=='LIMA'                                         .AND.(MSEDC .OR. MDEPOC)))  THEN
+  ALLOCATE(XINPRC(IIU,IJU))
+  ALLOCATE(XACPRC(IIU,IJU))
+  XINPRC(:,:)=0.0
+  XACPRC(:,:)=0.0
+ELSE
+  ALLOCATE(XINPRC(0,0))
+  ALLOCATE(XACPRC(0,0))
+END IF
+!
+IF (( CCLOUD(1:3) == 'ICE'                                   .AND.LDEPOSC) .OR. &
+    ((CCLOUD=='C2R2' .OR. CCLOUD=='KHKO').AND.LDEPOC)  .OR. &
+    ( CCLOUD=='LIMA'                                         .AND.MDEPOC))  THEN
+  ALLOCATE(XINDEP(IIU,IJU))
+  ALLOCATE(XACDEP(IIU,IJU))
+  XINDEP(:,:)=0.0
+  XACDEP(:,:)=0.0
+ELSE
+  ALLOCATE(XINDEP(0,0))
+  ALLOCATE(XACDEP(0,0))
+END IF
+!
+IF (CCLOUD(1:3) == 'ICE' .OR. CCLOUD == 'C3R5' .OR. CCLOUD == 'LIMA') THEN
+  ALLOCATE(XINPRS(IIU,IJU))
+  ALLOCATE(XACPRS(IIU,IJU))
+  XINPRS(:,:)=0.0
+  XACPRS(:,:)=0.0
+ELSE
+  ALLOCATE(XINPRS(0,0))
+  ALLOCATE(XACPRS(0,0))
+ END IF
+!
+IF (CCLOUD == 'C3R5' .OR. CCLOUD(1:3) == 'ICE'.OR. CCLOUD == 'LIMA') THEN
+  ALLOCATE(XINPRG(IIU,IJU))
+  ALLOCATE(XACPRG(IIU,IJU))
+  XINPRG(:,:)=0.0
+  XACPRG(:,:)=0.0
+ELSE
+  ALLOCATE(XINPRG(0,0))
+  ALLOCATE(XACPRG(0,0))
+END IF
+!
+IF (CCLOUD =='ICE4' .OR. CCLOUD == 'LIMA') THEN
+  ALLOCATE(XINPRH(IIU,IJU))
+  ALLOCATE(XACPRH(IIU,IJU))
+  XINPRH(:,:)=0.0
+  XACPRH(:,:)=0.0
+ELSE
+  ALLOCATE(XINPRH(0,0))
+  ALLOCATE(XACPRH(0,0))
+END IF
+!
+IF(LBLOWSNOW) THEN
+  ALLOCATE(XSNWSUBL3D(IIU,IJU,IKU))
+  XSNWSUBL3D(:,:,:) = 0.0
+  IF(CSNOWSEDIM=='TABC') THEN
+!Read in look up tables of snow particles properties
+!No arguments, all look up tables are defined in module
+!mode_snowdrift_sedim_lkt
+    CALL BLOWSNOW_SEDIM_LKT_SET
+  END IF
+ELSE
+  ALLOCATE(XSNWSUBL3D(0,0,0))
+END IF
+!
+!*       2b.    ALLOCATION for Radiative cooling 
+!              ------------------------------
+IF (LACTIT .OR. MACTIT) THEN
+  ALLOCATE( XTHM(IIU,IJU,IKU) )
+  ALLOCATE( XRCM(IIU,IJU,IKU) )
+  XTHM = XTHT
+  XRCM(:,:,:) = XRT(:,:,:,2)
+ELSE
+  ALLOCATE( XTHM(0,0,0) )
+  ALLOCATE( XRCM(0,0,0) )
+END IF
+!
+!*       2.bis ALLOCATE  Module MODD_PRECIP_SCAVENGING_n
+!              ------------------------------
+!
+IF ( (CCLOUD=='LIMA') .AND. LSCAV ) THEN
+  ALLOCATE(XINPAP(IIU,IJU))
+  ALLOCATE(XACPAP(IIU,IJU))
+  XINPAP(:,:)=0.0
+  XACPAP(:,:)=0.0
+ELSE
+  ALLOCATE(XINPAP(0,0))
+  ALLOCATE(XACPAP(0,0))
+END IF
+!
+IF(SIZE(XINPRR) == 0) RETURN
+!
+!*       3.    INITIALIZE MODD_PRECIP_n variables
+!              ----------------------------------
+!
+CALL READ_PRECIP_FIELD(TPINIFILE,CPROGRAM,CCONF,                      &
+                  CGETRCT,CGETRRT,CGETRST,CGETRGT,CGETRHT,            &
+                  XINPRC,XACPRC,XINDEP,XACDEP,XINPRR,XINPRR3D,XEVAP3D,&
+                  XACPRR,XINPRS,XACPRS,XINPRG,XACPRG, XINPRH,XACPRH )
+!
+!
+!*       4.    INITIALIZE THE PARAMETERS FOR THE MICROPHYSICS
+!              ----------------------------------------------
+!
+!
+!*       4.1    Compute the minimun vertical mesh size
+!
+ALLOCATE(ZDZ(IIU,IJU,IKU))
+ZDZ=0.
+IKB = 1 + JPVEXT
+IKE = SIZE(XZZ,3)- JPVEXT
+DO JK = IKB,IKE
+  ZDZ(:,:,JK) = XZZ(:,:,JK+1) - XZZ(:,:,JK)
+END DO
+ZDZMIN = MIN_ll (ZDZ,IINFO_ll,1,1,IKB,NIMAX_ll+2*JPHEXT,NJMAX_ll+2*JPHEXT,IKE )
+DEALLOCATE(ZDZ)
+!
+IF (CCLOUD(1:3) == 'KES') THEN
+  CALL INI_CLOUD(XTSTEP,ZDZMIN,NSPLITR)                  ! Warm cloud only
+ELSE IF (CCLOUD(1:3) == 'ICE'  ) THEN
+  CALL INI_RAIN_ICE(KLUOUT,XTSTEP,ZDZMIN,NSPLITR,CCLOUD) ! Mixed phase cloud
+                                                         ! including hail
+ELSE IF (CCLOUD == 'C2R2' .OR. CCLOUD == 'C3R5' .OR. CCLOUD == 'KHKO') THEN
+  CALL INI_RAIN_C2R2(XTSTEP,ZDZMIN,NSPLITR,CCLOUD)       ! 1/2 spectral warm cloud
+  IF (CCLOUD == 'C3R5') THEN
+    CALL INI_ICE_C1R3(XTSTEP,ZDZMIN,NSPLITG)       ! 1/2 spectral cold cloud
+  END IF
+ELSE IF (CCLOUD == 'LIMA') THEN
+  IF (CGETCLOUD /= 'READ') CALL INIT_AEROSOL_CONCENTRATION( XRHODREF, XSVT(:, :, :, :), XZZ(:, :, :) )
+  CALL INI_LIMA(XTSTEP,ZDZMIN,NSPLITR, NSPLITG)   ! 1/2 spectral warm cloud
+END IF
+!
+IF (CCLOUD == 'C2R2' .OR. CCLOUD == 'C3R5' .OR. CCLOUD == 'KHKO') THEN
+  IF (CGETCLOUD=='READ') THEN
+    CALL CLEAN_CONC_RAIN_C2R2 (XRT,XSVT(:,:,:,NSV_C2R2BEG:NSV_C2R2END))
+  ELSE IF (CGETCLOUD=='INI1'.OR.CGETCLOUD=='INI2') THEN
+    CALL SET_CONC_RAIN_C2R2 (CGETCLOUD,XRHODREF,&
+         &XRT,XSVT(:,:,:,NSV_C2R2BEG:NSV_C2R2END))
+  ENDIF
+  IF (CCLOUD == 'C3R5' ) THEN
+    IF (CGETCLOUD=='READ') THEN
+      CALL CLEAN_CONC_ICE_C1R3 (XRT,XSVT(:,:,:,NSV_C2R2BEG:NSV_C1R3END))
+    ELSE
+      CALL SET_CONC_ICE_C1R3 (XRHODREF,XRT,XSVT(:,:,:,NSV_C2R2BEG:NSV_C1R3END))
+    ENDIF
+  ENDIF
+ENDIF
+!
+IF (CCLOUD == 'LIMA') THEN
+  IF (CGETCLOUD/='READ') THEN
+    CALL SET_CONC_LIMA(IMI,CGETCLOUD,XRHODREF,XRT,XSVT(:,:,:,NSV_LIMA_BEG:NSV_LIMA_END))
+  END IF
+END IF
+!
+!
+!*       5.    INITIALIZE ATMOSPHERIC ELECTRICITY
+!              ----------------------------------
+!
+!
+!IF (CELEC /= 'NONE') THEN
+!  CALL INI_ELEC(IMI,TPINIFILE,XTSTEP,ZDZMIN,NSPLITR, &
+!                XDXX,XDYY,XDZZ,XDZX,XDZY            )
+!END IF
+!
+!
+END SUBROUTINE INI_MICRO_n
diff --git a/src/PHYEX/ext/ini_modeln.f90 b/src/PHYEX/ext/ini_modeln.f90
new file mode 100644
index 0000000000000000000000000000000000000000..f1b7d80691b9cfcba7d1951f2fd54abace79fd96
--- /dev/null
+++ b/src/PHYEX/ext/ini_modeln.f90
@@ -0,0 +1,2919 @@
+!MNH_LIC Copyright 1994-2023 CNRS, Meteo-France and Universite Paul Sabatier
+!MNH_LIC This is part of the Meso-NH software governed by the CeCILL-C licence
+!MNH_LIC version 1. See LICENSE, CeCILL-C_V1-en.txt and CeCILL-C_V1-fr.txt
+!MNH_LIC for details. version 1.
+!-----------------------------------------------------------------
+!     #######################
+      MODULE MODI_INI_MODEL_n
+!     #######################
+!
+INTERFACE
+!
+       SUBROUTINE INI_MODEL_n(KMI,TPINIFILE)
+!
+USE MODD_IO, ONLY: TFILEDATA
+!
+INTEGER,          INTENT(IN)   :: KMI       ! Model Index
+TYPE(TFILEDATA),  INTENT(IN)   :: TPINIFILE ! Initial file
+!
+END SUBROUTINE INI_MODEL_n
+!
+END INTERFACE
+!
+END MODULE MODI_INI_MODEL_n
+!     ############################################
+      SUBROUTINE INI_MODEL_n(KMI,TPINIFILE)
+!     ############################################
+!
+!!****  *INI_MODEL_n* - routine to initialize the nested model _n
+!!
+!!    PURPOSE
+!!    -------
+!       The purpose of this routine is to initialize the variables
+!     of the nested model _n.
+!
+!!**  METHOD
+!!    ------
+!!      The initialization of the model _n is performed as follows :
+!!       - Memory for arrays are then allocated :
+!!            * If  turbulence kinetic energy variable is not needed
+!!    (CTURB='NONE'),  XTKET, XTKEM and XTKES are zero-size arrays.
+!!            * If  dissipation of TKE variable is not needed
+!!    (CTURBLEN /='KEPS'),  XEPST, XEPSM and XREPSS are zero-size arrays.
+!!            * Memory for mixing ratio arrays is allocated according to the
+!!     value of logicals LUSERn (the number NRR of moist variables is deduced).
+!!            * The latitude (XLAT), longitude (XLON) and map factor (XMAP)
+!!     arrays are zero-size arrays if Cartesian geometry (LCARTESIAN=.TRUE.)
+!!            * Memory for reference state without orography ( XRHODREFZ and
+!!     XTHVREFZ) is only allocated in INI_MODEL1
+!!            * The horizontal Coriolis parameters (XCORIOX and XCORIOY) arrays
+!!     are  zero-size arrays if thinshell approximation (LTHINSHELL=.TRUE.)
+!!            * The Curvature coefficients (XCURVX and XCURVY) arrays
+!!     are zero-size arrays if Cartesian geometry (LCARTESIAN=.TRUE.)
+!!            * Memory for the Jacobian (ZJ) local array is allocated
+!!     (This variable is computed in SET_GRID and used in SET_REF).
+!!       - The spatial and temporal grid variables are initialized by SET_GRID.
+!!       - The metric coefficients are computed by METRICS (they are using in
+!!     the SET-REF call).
+!!       - The prognostic variables and are read in initial
+!!    LFIFM file (in READ_FIELD)
+!!       - The reference state variables  are initialized by SET_REF.
+!!       - The temporal indexes of the outputs are computed by SET_OUTPUT_TIMES
+!!       - The large scale sources are computed in case of coupling case by
+!!    INI_CPL.
+!!       - The initialization of the parameters needed for the dynamics
+!!         of the model n is realized in INI_DYNAMICS.
+!!       - Then the initial file (DESFM+LFIFM files) is closed by IO_File_close.
+!!       - The initialization of the parameters needed for the ECMWF radiation
+!!         code is realized in INI_RADIATIONS.
+!!       - The contents of the scalar variables are overwritten by
+!!         the chemistry initialization subroutine CH_INIT_FIELDn when
+!!         the flags LUSECHEM and LCH_INIT_FIELD are set to TRUE.
+!!         This allows easy initialization of the chemical fields at a
+!!         restart of the model.
+!!
+!!    EXTERNAL
+!!    --------
+!!      SET_DIM     : to initialize dimensions
+!!      SET_GRID    : to initialize grid
+!!      METRICS     : to compute metric coefficients
+!!      READ_FIELD  : to initialize field
+!!      FMCLOS      : to close a FM-file
+!!      SET_REF     : to initialize reference state for anelastic approximation
+!!      INI_DYNAMICS: to initialize parameters for the dynamics
+!!      INI_TKE_EPS : to initialize the TKE
+!!      SET_DIRCOS  : to compute the director cosinus of the orography
+!!      INI_RADIATIONS : to initialize radiation computations
+!!      CH_INIT_CCS: to initialize the chemical core system
+!!      CH_INIT_FIELDn: to (re)initialize the scalar variables
+!!      INI_DEEP_CONVECTION : to initialize the deep convection scheme
+!!      CLEANLIST_ll : deaalocate a list
+!!
+!!    IMPLICIT ARGUMENTS
+!!    ------------------
+!!
+!!      Module MODD_PARAMETERS : contains declaration of parameter variables
+!!         JPHEXT : Horizontal external points number
+!!         JPVEXT : Vertical external points number
+!!
+!!      Module MODD_MODD_DYN   : contains declaration of parameters
+!!                               for the dynamics
+!!      Module MODD_CONF       : contains declaration of configuration variables
+!!                               for all models
+!!         NMODEL     : Number of nested models
+!!         NVERB      : Level of informations on output-listing
+!!                          0 for minimum  prints
+!!                          5 for intermediate level of prints
+!!                         10 for maximum  prints
+!!
+!!      Module MODD_REF        : contains declaration of reference state
+!!                               variables for all models
+!!      Module MODD_FIELD_n    : contains declaration of prognostic fields
+!!      Module MODD_LSFIELD_n  : contains declaration of Larger Scale fields
+!!      Module MODD_GRID_n     : contains declaration of spatial grid variables
+!!      Module MODD_TIME_n     : contains declaration of temporal grid variables
+!!      Module MODD_REF_n      : contains declaration of reference state
+!!                               variables
+!!      Module MODD_CURVCOR_n  : contains declaration of curvature and Coriolis
+!!                               variables
+!!      Module MODD_BUDGET     : contains declarations of the budget parameters
+!!      Module MODD_RADIATIONS_n:contains declaration of the variables of the
+!!                               radiation interface scheme
+!!      Module MODD_STAND_ATM  : contains declaration of the 5 standard
+!!                               atmospheres used for the ECMWF-radiation code
+!!      Module MODD_FRC        : contains declaration of the control variables
+!!                               and of the forcing fields
+!!      Module MODD_CH_MNHC_n   : contains the control parameters for chemistry
+!!      Module MODD_DEEP_CONVECTION_n: contains declaration of the variables of
+!!                                     the deep convection scheme
+!!
+!!
+!!
+!!
+!!      Module MODN_CONF_n     : contains declaration of namelist NAM_CONFn and
+!!                             uses module MODD_CONF_n (configuration variables)
+!!      Module MODN_LUNIT_n    : contains declaration of namelist NAM_LUNITn and
+!!                             uses module MODD_LUNIT_n (Logical units)
+!!      Module MODN_DYN_n      : contains declaration of namelist NAM_DYNn and
+!!                             uses module MODD_DYN_n (control of dynamics)
+!!      Module MODN_PARAM_n    : contains declaration of namelist NAM_PARAMn and
+!!                             uses module MODD_PARAM_n (control of physical
+!!                             parameterization)
+!!      Module MODN_LBC_n      : contains declaration of namelist NAM_LBCn and
+!!                             uses module MODD_LBC_n (lateral boundaries)
+!!      Module MODN_TURB_n     : contains declaration of namelist NAM_TURBn and
+!!                             uses module MODD_TURB_n (turbulence scheme)
+!!      Module MODN_PARAM_RAD_n: contains declaration of namelist NAM_PARAM_RADn
+!!
+!!    REFERENCE
+!!    ---------
+!!      Book2 of documentation (routine INI_MODEL_n)
+!!
+!!
+!!    AUTHOR
+!!    ------
+!!      V. Ducrocq       * Meteo France *
+!!
+!!    MODIFICATIONS
+!!    -------------
+!!      Original     10/06/94
+!!      Modification 17/10/94  (Stein)  For LCORIO
+!!      Modification 20/10/94  (Stein)  For SET_GRID and NAMOUTN
+!!      Modification 26/10/94  (Stein)  Modifications of the namelist names
+!!      Modification 10/11/94  (Lafore) allocatation of tke fields
+!!      Modification 22/11/94  (Stein)  change the READ_FIELDS call ( add
+!!                                      pressure function
+!!      Modification 06/12/94  (Stein)  add the LS fields
+!!                   12/12/94  (Stein)  rename END_INI in INI_DYNAMICS
+!!      Modification 09/01/95  (Stein)  add the turbulence scheme
+!!      Modification Jan 19, 1995 (J. Cuxart) add the TKE initialization
+!!                   Jan 23, 1995 (J. Stein ) remove the condition
+!!                             LTHINSHELL=T LCARTESIAN=T => stop
+!!      Modification Feb 16, 1995 (I.Mallet) add the METRICS call and
+!!                                      change the SET_REF call (add
+!!                                      the lineic mass)
+!!      Modification Mar 10, 1995 (I. Mallet) add the COUPLING initialization
+!!                   June 29,1995 (Ph. Hereil, J. Stein) add the budget init.
+!!      Modification Sept. 1, 1995 (S. Belair) Reading of the surface variables
+!!                                 and parameters for ISBA (i.e., add a
+!!                                 CALL READ_GR_FIELD)
+!!      Modification 18/08/95     (J.P.Lafore)   time step change case
+!!                   25/09/95     (J. Cuxart and J.Stein)   add LES variables
+!!                                and the diachronic file initialization
+!!      Modification Sept 20,1995 (Lafore) coupling for the dry mass Md
+!!      Modification Sept. 12, 1995 (J.-P. Pinty) add the initialization of
+!!                                      the ECMWF radiation code
+!!      Modification Sept. 13, 1995 (J.-P. Pinty) control the allocation of the
+!!                                      arrays of MODD_GR_FIELD_n
+!!      Modification Nove. 17, 1995 (J.Stein) control of the control !!
+!!                   March 01, 1996 (J. Stein) add the cloud fraction
+!!                   April 03, 1996 (J. Stein) unify the ISBA and TSZ0 cases
+!!      Modification 13/12/95 (M. Georgelin) add the forcing variables in
+!!                                           the call read_field, and their
+!!                                           allocation.
+!!                   Mai   23, 1996 (J. Stein) allocate XSEA in the TSZ0 case
+!!                   June  11, 1996 (V. Masson) add XSILT and XLAKE of
+!!                                              MODD_GR_FIELD_n
+!!                   August 7, 1996 (K. Suhre)  add (re)initialization of
+!!                                              chemistry
+!!                   Octo. 11, 1996 (J. Stein ) add XSRCT and XSRCM
+!!                   October 8, 1996 (J. Cuxart, E. Sanchez) Moist LES diagnostics
+!!                                     and control on TKE initialization.
+!!      Modification 19/12/96 (J.-P. Pinty) add the ice parameterization and
+!!                                          the precipitation fields
+!!      Modification 11/01/97 (J.-P. Pinty) add the deep convection
+!!                   Nov.   1, 1996 (V. Masson) Read the vertical grid kind
+!!                   Nov.  20, 1996 (V. Masson) control of convection calling time
+!!                   July  16, 1996 (J.P.Lafore) update of EXSEG file reading
+!!                   Oct.  08, 1996 (J.P.Lafore, V.Masson)
+!!                                       MY_NAME and DAD_NAME reading and check
+!!                   Oct.  30, 1996 (J.P.Lafore) resolution ratio reading for nesting
+!!                                       and Bikhardt interpolation coef. initialization
+!!                   Nov.  22, 1996 (J.P.Lafore) allocation of LS sources for nesting
+!!                   Feb.  26, 1997 (J.P.Lafore) allocation of "surfacic" LS fields
+!!                   March 10, 1997 (J.P.Lafore) forcing only for model 1
+!!                   June  22, 1997 (J. Stein)   add the absolute pressure
+!!                   July  09, 1997 (V. Masson)  add directional z0 and SSO
+!!                   Aug.  18, 1997 (V. Masson)  consistency between storage
+!!                                               type and CCONF
+!!                   Dec.  22, 1997 (J. Stein)   add the LS field spawning
+!!                   Jan.  24, 1998 (P.Bechtold) change MODD_FRC and MODD_DEEP_CONVECTION
+!!                   Dec.  24, 1997 (V.Masson)   directional z0 parameters
+!!                   Aug.  13, 1998 (V. Ducrocq P Jabouille)   //
+!!                   Mai.  26, 1998 (J. Stein)   remove NXEND,NYEND
+!!                   Feb.   1, 1999 (J. Stein)   compute the Bikhardt
+!!                                       interpolation coeff. before the call to set_grid
+!!                   April  5, 1999 (V. Ducrocq) change the DXRATIO_ALL init.
+!!                   April  12, 1999 (J. Stein)  cleaning + INI_SPAWN_LS
+!!                   Apr.   7, 1999 (P Jabouille) store the metric coefficients
+!!                                                in modd_metrics_n
+!!                   Jui.   15,1999 (P Jabouille) split the routines in two parts
+!!                   Jan.   04,2000 (V. Masson)   removes the TSZ0 case
+!!                   Apr.   15,2000 (P Jabouille) parallelization of grid nesting
+!!                   Aug.   20,2000 (J Stein    ) tranpose XBFY
+!!                   Jui    01,2000 (F.solmon )   adapatation for patch approach
+!!                   Jun.   15,2000 (J.-P. Pinty) add C2R2 initialization
+!!                   Nov.  15,2000 (V.Masson) use of ini_modeln in prep_real_case
+!!                   Nov.  15,2000 (V.Masson) call of LES routines
+!!                   Nov.  15,2000 (V.Masson) aircraft and balloon initialization routines
+!!                   Jan.  22,2001 (D.Gazen) update_nsv set NSV_* var. for current model
+!!                   Mar.  04,2002 (V.Ducrocq) initialization to temporal series
+!!                   Mar.  15,2002 (F.Solmon) modification of ini_radiation interface
+!!                   Nov.  29,2002 (JP Pinty) add C3R5, ICE2, ICE4, ELEC
+!!                   Jan.  2004    (V.Masson) externalization of surface
+!!                   May   2006    Remove KEPS
+!!                   Apr.  2010    (M. Leriche) add pH for aqueous phase chemistry
+!!                   Jul.  2010    (M. Leriche) add Ice phase chemistry
+!!                   Oct.  2010  (J.Escobar) check if local domain not to small for NRIMX NRIMY
+!!                   Nov.  2010  (J.Escobar) PGI BUG , add SIZE(CSV) to init_ground routine
+!!                   Nov.  2009    (C. Barthe) add call to INI_ELEC_n
+!!                   Mar.  2010    (M. Chong) add small ions
+!!                   Apr.  2011    (M. Chong) correction of RESTART (ELEC)
+!!                   June  2011  (B.Aouizerats) Prognostic aerosols
+!!                   June  2011  (P.Aumond) Drag of the vegetation
+!!                                         + Mean fields
+!!                   July  2013  (Bosseur & Filippi) Adds Forefire
+!!                   P. Tulet      Nov 2014 accumulated moles of aqueous species that fall at the surface
+!!                   JAn.  2015  (F. Brosse) bug in allocate XACPRAQ
+!!                   Dec 2014 (C.Lac) : For reproducibility START/RESTA
+!!                   J.Escobar : 15/09/2015 : WENO5 & JPHEXT <> 1
+!!                   V. Masson     Feb 2015 replaces, for aerosols, cover fractions by sea, town, bare soil fractions
+!!                   J.Escobar : 19/04/2016 : Pb IOZ/NETCDF , missing OPARALLELIO=.FALSE. for PGD files
+!!                   J.Escobar : 01/06/2016 : correct check limit of NRIM versus local subdomain size IDIM
+!!                   06/2016     (G.Delautier) phasage surfex 8
+!!                   Modification    01/2016  (JP Pinty) Add LIMA
+!!                   Aug.  2016 (J.Pianezze) Add SFX_OASIS_READ_NAM function from SurfEx
+!!                   M.Leriche 2016 Chemistry
+!!                   10/2016 M.Mazoyer New KHKO output fields
+!!                      10/2016 (C.Lac) Add max values
+!!       F. Brosse   Oct.  2016 add prod/loss terms computation for chemistry
+!!                   M.Leriche 2016 Chemistry
+!!                   M.Leriche 10/02/17 prevent negative values in LBX(Y)SVS
+!!                   M.Leriche 01/07/2017 Add DIAG chimical surface fluxes
+!!                   09/2017 Q.Rodier add LTEND_UV_FRC
+!!                   02/2018 Q.Libois ECRAD
+!!  Philippe Wautelet: 05/2016-04/2018: new data structures and calls for I/O
+!!                   V. Vionnet : 18/07/2017 : add blowing snow scheme
+!!                   01/18 J.Colin Add DRAG
+!  P. Wautelet 29/01/2019: bug: add missing zero-size allocations
+!  P. Wautelet 07/02/2019: force TYPE to a known value for IO_File_add2list
+!  P. Wautelet 13/02/2019: initialize XALBUV even if no radiation (needed in CH_INTERP_JVALUES)
+!  P. Wautelet 13/02/2019: removed PPABSM and PTSTEP dummy arguments of READ_FIELD
+!  P. Wautelet 14/02/2019: remove CLUOUT/CLUOUT0 and associated variables
+!  P. Wautelet 14/02/2019: remove HINIFILE dummy argument from INI_RADIATIONS_ECMWF/ECRAD
+!!                   02/2019 C.Lac add rain fraction as an output field
+!!      Bielli S. 02/2019  Sea salt : significant sea wave height influences salt emission; 5 salt modes
+!  P. Wautelet 14/03/2019: correct ZWS when variable not present in file (set to XZWS_DEFAULT)
+!  P. Wautelet 10/04/2019: replace ABORT and STOP calls by Print_msg
+!  P. Wautelet 19/04/2019: removed unused dummy arguments and variables
+!  P. Wautelet 07/06/2019: allocate lookup tables for optical properties only when needed
+!  P. Wautelet 13/09/2019: budget: simplify and modernize date/time management
+!  C. Lac         11/2019: correction in the drag formula and application to building in addition to tree
+!  S. Riette      04/2020: XHL* fields
+!  F. Auguste     02/2021: add IBM
+!  T.Nigel        02/2021: add turbulence recycling
+!  J.L.Redelsperger 06/2011: OCEAN case
+!  R. Schoetter    12/2021  multi-level coupling between MesoNH and SURFEX  
+!  R. Schoetter    12/2021  adds humidity and other mean diagnostics
+! A. Costes        12/2021: Blaze fire model
+!---------------------------------------------------------------------------------
+!
+!*       0.    DECLARATIONS
+!              ------------
+!
+#ifdef MNH_ECRAD
+USE YOERDI,                 only: RCCO2
+#endif
+
+USE MODD_2D_FRC
+USE MODD_ADVFRC_n
+USE MODD_ADV_n
+use MODD_AEROSET,           only: POLYTAU, POLYSSA, POLYG
+USE MODD_ARGSLIST_ll,       only: LIST_ll
+USE MODD_BIKHARDT_n
+USE MODD_BLOWSNOW
+USE MODD_BLOWSNOW_n
+USE MODD_BUDGET
+USE MODD_CH_AERO_n,         only: XSOLORG,XMI
+USE MODD_CH_AEROSOL,        only: LORILAM
+USE MODD_CH_BUDGET_n
+USE MODD_CH_FLX_n,          only: XCHFLX
+USE MODD_CH_M9_n,           only:NNONZEROTERMS
+USE MODD_CH_MNHC_n,         only: LUSECHEM, LUSECHAQ, LUSECHIC, LCH_INIT_FIELD, &
+                                  LCH_CONV_LINOX, XCH_TUV_DOBNEW, LCH_PH
+USE MODD_CH_PH_n
+USE MODD_CH_PRODLOSSTOT_n
+USE MODD_CLOUD_MF_n
+USE MODD_CONF
+USE MODD_CONF_n
+USE MODD_CST
+USE MODD_CTURB
+USE MODD_CURVCOR_n
+USE MODD_DEEP_CONVECTION_n
+USE MODD_DEF_EDDY_FLUX_n   ! for VT and WT fluxes
+USE MODD_DEF_EDDYUV_FLUX_n ! FOR UV
+USE MODD_DIAG_FLAG,         only: LCHEMDIAG, CSPEC_BU_DIAG
+USE MODD_DIM_n
+USE MODD_DRAG_n
+USE MODD_DRAGTREE_n
+USE MODD_DRAGBLDG_n
+USE MODD_DUST
+use MODD_DUST_OPT_LKT,      only: NMAX_RADIUS_LKT_DUST=>NMAX_RADIUS_LKT, NMAX_SIGMA_LKT_DUST=>NMAX_SIGMA_LKT,               &
+                                  NMAX_WVL_SW_DUST=>NMAX_WVL_SW,                                                            &
+                                  XEXT_COEFF_WVL_LKT_DUST=>XEXT_COEFF_WVL_LKT, XEXT_COEFF_550_LKT_DUST=>XEXT_COEFF_550_LKT, &
+                                  XPIZA_LKT_DUST=>XPIZA_LKT, XCGA_LKT_DUST=>XCGA_LKT
+USE MODD_DYN
+USE MODD_DYN_n
+USE MODD_DYNZD
+USE MODD_DYNZD_n
+USE MODD_ELEC_n,            only: XCION_POS_FW, XCION_NEG_FW
+USE MODD_EOL_MAIN
+USE MODD_FIELD_n
+#ifdef MNH_FOREFIRE
+USE MODD_FOREFIRE
+USE MODD_FOREFIRE_n
+#endif
+USE MODD_FRC
+USE MODD_FRC_n
+USE MODD_GET_n
+USE MODD_GRID_n
+USE MODD_GRID,              only: XLONORI,XLATORI
+USE MODD_IBM_PARAM_n,       only: LIBM, XIBM_IEPS, XIBM_LS, XIBM_XMUT
+USE MODD_IO,                only: CIO_DIR, TFILEDATA, TFILE_DUMMY
+USE MODD_IO_SURF_MNH,       only: IO_SURF_MNH_MODEL
+USE MODD_LATZ_EDFLX
+USE MODD_LBC_n,             only: CLBCX, CLBCY
+use modd_les
+USE MODD_LSFIELD_n
+USE MODD_LUNIT_n
+USE MODD_MEAN_FIELD
+USE MODD_MEAN_FIELD_n
+USE MODD_METRICS_n
+USE MODD_MNH_SURFEX_n
+USE MODD_NESTING,           only: CDAD_NAME, NDAD, NDT_2_WAY, NDTRATIO, NDXRATIO_ALL, NDYRATIO_ALL
+USE MODD_NSV
+USE MODD_NSV
+USE MODD_NUDGING_n,         only: LNUDGING
+USE MODD_OCEANH
+USE MODD_OUT_n
+USE MODD_PARAMETERS
+USE MODD_PARAM_KAFR_n
+USE MODD_PARAM_MFSHALL_n
+USE MODD_PARAM_n
+USE MODD_PARAM_RAD_n,       only: CAER, CAOP, CLW
+USE MODD_PASPOL
+USE MODD_PASPOL_n
+USE MODD_PAST_FIELD_n
+use modd_precision,         only: LFIINT
+USE MODD_RADIATIONS_n
+USE MODD_RECYCL_PARAM_n
+USE MODD_REF
+USE MODD_REF_n
+USE MODD_RELFRC_n
+use MODD_SALT,              only: LSALT
+use MODD_SALT_OPT_LKT,      only: NMAX_RADIUS_LKT_SALT=>NMAX_RADIUS_LKT, NMAX_SIGMA_LKT_SALT=>NMAX_SIGMA_LKT,               &
+                                  NMAX_WVL_SW_SALT=>NMAX_WVL_SW,                                                            &
+                                  XEXT_COEFF_WVL_LKT_SALT=>XEXT_COEFF_WVL_LKT, XEXT_COEFF_550_LKT_SALT=>XEXT_COEFF_550_LKT, &
+                                  XPIZA_LKT_SALT=>XPIZA_LKT, XCGA_LKT_SALT=>XCGA_LKT
+USE MODD_SERIES,            only: LSERIES
+USE MODD_SHADOWS_n
+USE MODD_STAND_ATM,         only: XSTROATM, XSMLSATM, XSMLWATM, XSPOSATM, XSPOWATM
+USE MODD_SURF_PAR,          only: XUNDEF_SFX => XUNDEF
+USE MODD_TIME
+USE MODD_TIME_n
+USE MODD_TURB_n
+USE MODD_NEB_n,             only: LSUBG_COND, LSTATNW
+USE MODD_VAR_ll,            only: IP
+
+USE MODE_GATHER_ll
+USE MODE_INI_AIRCRAFT_BALLOON, only: INI_AIRCRAFT_BALLOON
+use mode_ini_budget,        only: Budget_preallocate, Ini_budget
+USE MODE_INI_ONE_WAY_n
+USE MODE_IO
+USE MODE_IO_FIELD_READ,     only: IO_Field_read
+USE MODE_IO_FILE,           only: IO_File_open
+USE MODE_IO_MANAGE_STRUCT,  only: IO_File_add2list
+USE MODE_ll
+USE MODE_MODELN_HANDLER
+USE MODE_MPPDB
+USE MODE_MSG
+USE MODE_SET_GRID
+USE MODE_SPLITTINGZ_ll,     only: GET_DIM_EXTZ_ll
+USE MODE_TYPE_ZDIFFU
+USE MODE_FIELD,             ONLY: INI_FIELD_LIST
+
+USE MODI_CH_AER_MOD_INIT
+USE MODI_CH_INIT_BUDGET_n
+USE MODI_CH_INIT_FIELD_n
+USE MODI_CH_INIT_JVALUES
+USE MODI_CH_INIT_PRODLOSSTOT_n
+USE MODI_GET_SIZEX_LB
+USE MODI_GET_SIZEY_LB
+USE MODI_INI_AEROSET1
+USE MODI_INI_AEROSET2
+USE MODI_INI_AEROSET3
+USE MODI_INI_AEROSET4
+USE MODI_INI_AEROSET5
+USE MODI_INI_AEROSET6
+USE MODI_INI_BIKHARDT_n
+USE MODI_INI_CPL
+USE MODI_INI_DEEP_CONVECTION
+USE MODI_INI_DRAG
+USE MODI_INI_DYNAMICS
+USE MODI_INI_ELEC_n
+USE MODI_INI_EOL_ADNR
+USE MODI_INI_EOL_ALM
+USE MODI_INI_LES_N
+USE MODI_INI_LG
+USE MODI_INI_LW_SETUP
+USE MODI_INI_MICRO_n
+USE MODE_INI_TURB, ONLY: INI_TURB
+USE MODE_INI_MFSHALL, ONLY: INI_MFSHALL
+USE MODI_INI_POSPROFILER_n
+USE MODI_INI_RADIATIONS
+USE MODI_INI_RADIATIONS_ECMWF
+USE MODI_INI_RADIATIONS_ECRAD
+USE MODI_INI_SERIES_N
+USE MODI_INI_SPAWN_LS_n
+USE MODI_INI_SURF_RAD
+USE MODI_INI_SURFSTATION_n
+USE MODI_INI_SW_SETUP
+USE MODE_INIT_AEROSOL_PROPERTIES, ONLY: INIT_AEROSOL_PROPERTIES
+#ifdef MNH_FOREFIRE
+USE MODI_INIT_FOREFIRE_n
+#endif
+USE MODI_INIT_GROUND_PARAM_n
+USE MODI_INI_TKE_EPS
+USE MODI_METRICS
+USE MODI_MNHGET_SURF_PARAM_n
+USE MODI_MNHREAD_ZS_DUMMY_n
+USE MODI_READ_FIELD
+USE MODI_SET_DIRCOS
+USE MODI_SET_REF
+#ifdef CPLOASIS
+USE MODI_SFX_OASIS_READ_NAM
+#endif
+USE MODI_SUNPOS_n
+USE MODI_SURF_SOLAR_GEOM
+USE MODI_UPDATE_METRICS
+USE MODI_UPDATE_NSV
+#ifdef MNH_ECRAD
+#if ( VER_ECRAD == 140 )
+USE YOERDI   , ONLY :RCCO2
+#endif
+#endif
+!
+USE MODD_FIRE_n
+IMPLICIT NONE
+!
+!*       0.1   declarations of arguments
+!
+!
+INTEGER,          INTENT(IN)   :: KMI       ! Model Index
+TYPE(TFILEDATA),  INTENT(IN)   :: TPINIFILE ! Initial file
+!
+!*       0.2   declarations of local variables
+!
+REAL, PARAMETER :: NALBUV_DEFAULT = 0.01 ! Arbitrary low value for XALBUV
+!
+INTEGER             :: JSV     ! Loop index
+INTEGER             :: IRESP   ! Return code of FM routines
+INTEGER             :: ILUOUT  ! Logical unit number of output-listing
+CHARACTER(LEN=28)   :: YNAME
+INTEGER             :: IIU     ! Upper dimension in x direction (local)
+INTEGER             :: IJU     ! Upper dimension in y direction (local)
+INTEGER             :: IIU_ll  ! Upper dimension in x direction (global)
+INTEGER             :: IJU_ll  ! Upper dimension in y direction (global)
+INTEGER             :: IKU     ! Upper dimension in z direction
+REAL, DIMENSION(:,:,:), ALLOCATABLE :: ZJ ! Jacobian
+LOGICAL             :: GINIDCONV ! logical switch for the deep convection
+                               ! initialization
+LOGICAL             :: GINIRAD ! logical switch for the radiation
+                               ! initialization
+logical             :: gles    ! Logical to determine if LES diagnostics are enabled
+!
+!
+TYPE(LIST_ll), POINTER :: TZINITHALO2D_ll ! pointer for the list of 2D fields
+                                      !  which must be communicated in INIT
+TYPE(LIST_ll), POINTER :: TZINITHALO3D_ll ! pointer for the list of 3D fields
+                                      !  which must be communicated in INIT
+!
+INTEGER :: IISIZEXF,IJSIZEXF,IISIZEXFU,IJSIZEXFU     ! dimensions of the
+INTEGER :: IISIZEX4,IJSIZEX4,IISIZEX2,IJSIZEX2       ! West-east LB arrays
+INTEGER :: IISIZEYF,IJSIZEYF,IISIZEYFV,IJSIZEYFV     ! dimensions of the
+INTEGER :: IISIZEY4,IJSIZEY4,IISIZEY2,IJSIZEY2       ! North-south LB arrays
+INTEGER :: IINFO_ll  ! Return code of //routines
+INTEGER :: IIY,IJY
+INTEGER :: IIU_B,IJU_B
+INTEGER :: IIU_SXP2_YP1_Z_ll,IJU_SXP2_YP1_Z_ll,IKU_SXP2_YP1_Z_ll
+!
+REAL, DIMENSION(:,:),   ALLOCATABLE :: ZCO2   ! CO2 concentration near the surface
+!
+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 :: ZIBM_LS ! LevelSet IBM
+!
+!
+INTEGER, DIMENSION(:,:),ALLOCATABLE :: IINDEX   ! indices of non-zero terms
+INTEGER, DIMENSION(:),ALLOCATABLE   :: IIND
+INTEGER                             :: JM, JT
+!
+!------------------------------------------
+! Dummy pointers needed to correct an ifort Bug
+REAL, DIMENSION(:), POINTER :: DPTR_XZHAT
+REAL, DIMENSION(:), POINTER :: DPTR_XBMX1,DPTR_XBMX2,DPTR_XBMX3,DPTR_XBMX4
+REAL, DIMENSION(:), POINTER :: DPTR_XBMY1,DPTR_XBMY2,DPTR_XBMY3,DPTR_XBMY4
+REAL, DIMENSION(:), POINTER :: DPTR_XBFX1,DPTR_XBFX2,DPTR_XBFX3,DPTR_XBFX4
+REAL, DIMENSION(:), POINTER :: DPTR_XBFY1,DPTR_XBFY2,DPTR_XBFY3,DPTR_XBFY4
+CHARACTER(LEN=4), DIMENSION(:), POINTER :: DPTR_CLBCX,DPTR_CLBCY
+INTEGER, DIMENSION(:,:,:), POINTER :: DPTR_NKLIN_LBXU,DPTR_NKLIN_LBYU,DPTR_NKLIN_LBXV,DPTR_NKLIN_LBYV
+INTEGER, DIMENSION(:,:,:), POINTER :: DPTR_NKLIN_LBXW,DPTR_NKLIN_LBYW,DPTR_NKLIN_LBXM,DPTR_NKLIN_LBYM
+REAL, DIMENSION(:,:,:), POINTER :: DPTR_XCOEFLIN_LBXU,DPTR_XCOEFLIN_LBYU
+REAL, DIMENSION(:,:,:), POINTER :: DPTR_XCOEFLIN_LBXV,DPTR_XCOEFLIN_LBYV
+REAL, DIMENSION(:,:,:), POINTER :: DPTR_XCOEFLIN_LBXW,DPTR_XCOEFLIN_LBYW
+REAL, DIMENSION(:,:,:), POINTER :: DPTR_XCOEFLIN_LBXM,DPTR_XCOEFLIN_LBYM
+REAL, DIMENSION(:,:,:),   POINTER :: DPTR_XLBXUM,DPTR_XLBYUM,DPTR_XLBXVM,DPTR_XLBYVM
+REAL, DIMENSION(:,:,:),   POINTER :: DPTR_XLBXWM,DPTR_XLBYWM,DPTR_XLBXTHM,DPTR_XLBYTHM
+REAL, DIMENSION(:,:,:),   POINTER :: DPTR_XLBXTKEM,DPTR_XLBYTKEM
+REAL, DIMENSION(:,:,:,:),   POINTER :: DPTR_XLBXSVM,DPTR_XLBYSVM
+REAL, DIMENSION(:,:,:,:), POINTER :: DPTR_XLBXRM,DPTR_XLBYRM
+REAL, DIMENSION(:,:,:),   POINTER ::  DPTR_XZZ
+REAL, DIMENSION(:,:,:), POINTER ::   DPTR_XLSUM,DPTR_XLSVM,DPTR_XLSWM,DPTR_XLSTHM,DPTR_XLSRVM
+REAL, DIMENSION(:,:,:), POINTER ::   DPTR_XLSUS,DPTR_XLSVS,DPTR_XLSWS,DPTR_XLSTHS,DPTR_XLSRVS
+REAL, DIMENSION(:,:),   POINTER ::   DPTR_XLSZWSM,DPTR_XLSZWSS
+!
+INTEGER                         ::  IIB,IJB,IIE,IJE,IDIMX,IDIMY,IMI
+! Fire model
+INTEGER             :: INBPARAMSENSIBLE, INBPARAMLATENT
+!-------------------------------------------------------------------------------
+!
+!*       0.    PROLOGUE
+!              --------
+! Compute relaxation coefficients without changing INI_DYNAMICS nor RELAXDEF
+!
+IF (CCLOUD == 'LIMA') THEN
+  LHORELAX_SVC1R3=LHORELAX_SVLIMA
+END IF
+!
+! UPDATE CONSTANTS FOR OCEAN MODEL
+IF (LOCEAN) THEN
+  XP00=XP00OCEAN
+  XTH00=XTH00OCEAN
+END IF
+!
+!
+NULLIFY(TZINITHALO2D_ll)
+NULLIFY(TZINITHALO3D_ll)
+!
+!*       1.    RETRIEVE LOGICAL UNIT NUMBER
+!              ----------------------------
+!
+ILUOUT = TLUOUT%NLU
+!
+!-------------------------------------------------------------------------------
+!
+!*       2.   END OF READING
+!             --------------
+!*       2.1  Read number of forcing fields
+!
+IF (LFORCING) THEN ! Retrieve the number of time-dependent forcings.
+  CALL IO_Field_read(TPINIFILE,'FRC',NFRC,IRESP)
+  IF ( (IRESP /= 0) .OR. (NFRC <=0) ) THEN
+    WRITE(ILUOUT,'(A/A)') &
+     "INI_MODEL_n ERROR: you want to read forcing variables from FMfile", &
+     "                   but no fields have been found by IO_Field_read"
+!callabortstop
+    CALL PRINT_MSG(NVERB_FATAL,'GEN','INI_MODEL_n','')
+  END IF
+END IF
+!
+! Modif PP for time evolving adv forcing
+  IF ( L2D_ADV_FRC ) THEN ! Retrieve the number of time-dependent forcings.
+    WRITE(ILUOUT,FMT=*) "INI_MODEL_n ENTER ADV_FORCING"
+    CALL IO_Field_read(TPINIFILE,'NADVFRC1',NADVFRC,IRESP)
+    IF ( (IRESP /= 0) .OR. (NADVFRC <=0) ) THEN
+      WRITE(ILUOUT,'(A/A)') &
+      "INI_MODELn ERROR: you want to read forcing ADV variables from FMfile", &
+      "                   but no fields have been found by IO_Field_read"
+    !callabortstop
+      CALL PRINT_MSG(NVERB_FATAL,'GEN','INI_MODEL_n','')
+    END IF
+    WRITE(ILUOUT,*) 'NADVFRC = ', NADVFRC
+END IF
+!
+IF ( L2D_REL_FRC ) THEN ! Retrieve the number of time-dependent forcings.
+    WRITE(ILUOUT,FMT=*) "INI_MODEL_n ENTER REL_FORCING"
+    CALL IO_Field_read(TPINIFILE,'NRELFRC1',NRELFRC,IRESP)
+    IF ( (IRESP /= 0) .OR. (NRELFRC <=0) ) THEN
+      WRITE(ILUOUT,'(A/A)') &
+      "INI_MODELn ERROR: you want to read forcing REL variables from FMfile", &
+      "                   but no fields have been found by IO_Field_read"
+    !callabortstop
+      CALL PRINT_MSG(NVERB_FATAL,'GEN','INI_MODEL_n','')
+    END IF
+    WRITE(ILUOUT,*) 'NRELFRC = ', NRELFRC
+END IF
+!*       2.2  Checks the position of vertical absorbing layer
+!
+IKU=NKMAX+2*JPVEXT
+!
+ALLOCATE(XZHAT(IKU))
+CALL IO_Field_read(TPINIFILE,'ZHAT',XZHAT)
+CALL IO_Field_read(TPINIFILE,'ZTOP',XZTOP)
+IF (XALZBOT>=XZHAT(IKU) .AND. LVE_RELAX) THEN
+  WRITE(ILUOUT,FMT=*) "INI_MODEL_n ERROR: you want to use vertical relaxation"
+  WRITE(ILUOUT,FMT=*) "                  but bottom of layer XALZBOT(",XALZBOT,")"
+  WRITE(ILUOUT,FMT=*) "                  is upper than model top    (",XZHAT(IKU),")"
+!callabortstop
+  CALL PRINT_MSG(NVERB_FATAL,'GEN','INI_MODEL_n','')
+END IF
+IF (LVE_RELAX) THEN
+ IF (XALZBOT>=XZHAT(IKU-4) ) THEN
+  WRITE(ILUOUT,FMT=*) "INI_MODEL_n WARNING: you want to use vertical relaxation"
+  WRITE(ILUOUT,FMT=*) "                    but the layer defined by XALZBOT(",XALZBOT,")"
+  WRITE(ILUOUT,FMT=*) "                    contains less than 5 model levels"
+ END IF
+END IF
+DEALLOCATE(XZHAT)
+!
+!*       2.3  Compute sizes of arrays of the extended sub-domain
+!
+CALL GET_DIM_EXT_ll('B',IIU,IJU)
+IIU_ll=NIMAX_ll + 2 * JPHEXT
+IJU_ll=NJMAX_ll + 2 * JPHEXT
+! initialize NIMAX and NJMAX for not updated versions regarding the parallelism
+! spawning,...
+CALL GET_DIM_PHYS_ll('B',NIMAX,NJMAX)
+!
+CALL GET_INDICE_ll( IIB,IJB,IIE,IJE)
+IDIMX = IIE - IIB + 1
+IDIMY = IJE - IJB + 1
+!
+NRR=0
+NRRL=0
+NRRI=0
+IF (CGETRVT /= 'SKIP' ) THEN
+  NRR = NRR+1
+  IDX_RVT = NRR
+END IF
+IF (CGETRCT /= 'SKIP' ) THEN
+  NRR = NRR+1
+  NRRL = NRRL+1
+  IDX_RCT = NRR
+END IF
+IF (CGETRRT /= 'SKIP' ) THEN
+  NRR = NRR+1
+  NRRL = NRRL+1
+  IDX_RRT = NRR
+END IF
+IF (CGETRIT /= 'SKIP' ) THEN
+  NRR = NRR+1
+  NRRI = NRRI+1
+  IDX_RIT = NRR
+END IF
+IF (CGETRST /= 'SKIP' ) THEN
+  NRR = NRR+1
+  NRRI = NRRI+1
+  IDX_RST = NRR
+END IF
+IF (CGETRGT /= 'SKIP' ) THEN
+  NRR = NRR+1
+  NRRI = NRRI+1
+  IDX_RGT = NRR
+END IF
+IF (CGETRHT /= 'SKIP' ) THEN
+  NRR = NRR+1
+  NRRI = NRRI+1
+  IDX_RHT = NRR
+END IF
+IF (NVERB >= 5) THEN
+  WRITE (UNIT=ILUOUT,FMT='("THERE ARE ",I2," WATER VARIABLES")') NRR
+  WRITE (UNIT=ILUOUT,FMT='("THERE ARE ",I2," LIQUID VARIABLES")') NRRL
+  WRITE (UNIT=ILUOUT,FMT='("THERE ARE ",I2," SOLID VARIABLES")') NRRI
+END IF
+!
+!*       2.4  Update NSV and floating indices for the current model
+!
+!
+CALL UPDATE_NSV(KMI)
+!
+!-------------------------------------------------------------------------------
+!
+!*       3.    ALLOCATE  MEMORY
+!              -----------------
+! * Module RECYCL
+!
+IF (LRECYCL) THEN
+!
+  NR_COUNT = 0
+!
+  ALLOCATE(XUMEANW(IJU,IKU,NNUMBELT))      ; XUMEANW  = 0.0
+  ALLOCATE(XVMEANW(IJU,IKU,NNUMBELT))      ; XVMEANW  = 0.0
+  ALLOCATE(XWMEANW(IJU,IKU,NNUMBELT))      ; XWMEANW  = 0.0
+  ALLOCATE(XUMEANN(IIU,IKU,NNUMBELT))      ; XUMEANN  = 0.0
+  ALLOCATE(XVMEANN(IIU,IKU,NNUMBELT))      ; XVMEANN  = 0.0
+  ALLOCATE(XWMEANN(IIU,IKU,NNUMBELT))      ; XWMEANN  = 0.0
+  ALLOCATE(XUMEANE(IJU,IKU,NNUMBELT))      ; XUMEANE  = 0.0
+  ALLOCATE(XVMEANE(IJU,IKU,NNUMBELT))      ; XVMEANE  = 0.0
+  ALLOCATE(XWMEANE(IJU,IKU,NNUMBELT))      ; XWMEANE  = 0.0
+  ALLOCATE(XUMEANS(IIU,IKU,NNUMBELT))      ; XUMEANS  = 0.0
+  ALLOCATE(XVMEANS(IIU,IKU,NNUMBELT))      ; XVMEANS  = 0.0
+  ALLOCATE(XWMEANS(IIU,IKU,NNUMBELT))      ; XWMEANS  = 0.0
+  ALLOCATE(XTBV(IIU,IJU,IKU))              ; XTBV  = 0.0
+ELSE
+  ALLOCATE(XUMEANW(0,0,0))
+  ALLOCATE(XVMEANW(0,0,0))
+  ALLOCATE(XWMEANW(0,0,0))
+  ALLOCATE(XUMEANN(0,0,0))
+  ALLOCATE(XVMEANN(0,0,0))
+  ALLOCATE(XWMEANN(0,0,0))
+  ALLOCATE(XUMEANE(0,0,0))
+  ALLOCATE(XVMEANE(0,0,0))
+  ALLOCATE(XWMEANE(0,0,0))
+  ALLOCATE(XUMEANS(0,0,0))
+  ALLOCATE(XVMEANS(0,0,0))
+  ALLOCATE(XWMEANS(0,0,0))
+  ALLOCATE(XTBV   (0,0,0))
+END IF
+!
+!
+!*       3.1   Module MODD_FIELD_n
+!
+IF (LMEAN_FIELD) THEN
+!
+  MEAN_COUNT = 0
+!
+  ALLOCATE(XUM_MEAN(IIU,IJU,IKU))      ; XUM_MEAN  = 0.0
+  ALLOCATE(XVM_MEAN(IIU,IJU,IKU))      ; XVM_MEAN  = 0.0
+  ALLOCATE(XWM_MEAN(IIU,IJU,IKU))      ; XWM_MEAN  = 0.0
+  ALLOCATE(XTHM_MEAN(IIU,IJU,IKU))     ; XTHM_MEAN = 0.0
+  ALLOCATE(XTEMPM_MEAN(IIU,IJU,IKU))   ; XTEMPM_MEAN = 0.0
+  ALLOCATE(XSVT_MEAN(IIU,IJU,IKU))     ; XSVT_MEAN  = 0.0
+  IF (CTURB/='NONE') THEN
+    ALLOCATE(XTKEM_MEAN(IIU,IJU,IKU))
+    XTKEM_MEAN = 0.0
+  ELSE
+    ALLOCATE(XTKEM_MEAN(0,0,0))
+  END IF
+  ALLOCATE(XPABSM_MEAN(IIU,IJU,IKU))   ; XPABSM_MEAN = 0.0
+  ALLOCATE(XQ_MEAN(IIU,IJU,IKU))       ; XQ_MEAN = 0.0
+  ALLOCATE(XRH_W_MEAN(IIU,IJU,IKU))    ; XRH_W_MEAN = 0.0
+  ALLOCATE(XRH_I_MEAN(IIU,IJU,IKU))    ; XRH_I_MEAN = 0.0
+  ALLOCATE(XRH_P_MEAN(IIU,IJU,IKU))    ; XRH_P_MEAN = 0.0
+  ALLOCATE(XRH_W_MAXCOL_MEAN(IIU,IJU)) ; XRH_W_MAXCOL_MEAN = 0.0
+  ALLOCATE(XRH_I_MAXCOL_MEAN(IIU,IJU)) ; XRH_I_MAXCOL_MEAN = 0.0
+  ALLOCATE(XRH_P_MAXCOL_MEAN(IIU,IJU)) ; XRH_P_MAXCOL_MEAN = 0.0
+  ALLOCATE(XWIFF_MEAN(IIU,IJU,IKU))    ; XWIFF_MEAN = 0.0
+  ALLOCATE(XWIDD_MEAN(IIU,IJU,IKU))    ; XWIDD_MEAN = 0.0
+  ALLOCATE(XWIFF_MAX (IIU,IJU,IKU))    ; XWIFF_MAX  = 0.0
+  ALLOCATE(XWIDD_MAX (IIU,IJU,IKU))    ; XWIDD_MAX  = 0.0
+!
+  ALLOCATE(XU2_M2(IIU,IJU,IKU))      ; XU2_M2  = 0.0
+!
+  ALLOCATE(XU2_M2(IIU,IJU,IKU))      ; XU2_M2  = 0.0
+  ALLOCATE(XV2_M2(IIU,IJU,IKU))      ; XV2_M2  = 0.0
+  ALLOCATE(XW2_M2(IIU,IJU,IKU))      ; XW2_M2  = 0.0
+  ALLOCATE(XTH2_M2(IIU,IJU,IKU))     ; XTH2_M2 = 0.0
+  ALLOCATE(XTEMP2_M2(IIU,IJU,IKU))   ; XTEMP2_M2 = 0.0
+  ALLOCATE(XPABS2_M2(IIU,IJU,IKU))   ; XPABS2_M2 = 0.0
+!
+  IF (LCOV_FIELD) THEN
+    ALLOCATE(XUV_MEAN(IIU,IJU,IKU))    ; XUV_MEAN  = 0.0
+    ALLOCATE(XUW_MEAN(IIU,IJU,IKU))    ; XUW_MEAN  = 0.0
+    ALLOCATE(XVW_MEAN(IIU,IJU,IKU))    ; XVW_MEAN  = 0.0
+    ALLOCATE(XWTH_MEAN(IIU,IJU,IKU))   ; XWTH_MEAN  = 0.0
+  END IF
+!
+  ALLOCATE(XUM_MAX(IIU,IJU,IKU))      ; XUM_MAX  = -1.E20
+  ALLOCATE(XVM_MAX(IIU,IJU,IKU))      ; XVM_MAX  = -1.E20
+  ALLOCATE(XWM_MAX(IIU,IJU,IKU))      ; XWM_MAX  = -1.E20
+  ALLOCATE(XTHM_MAX(IIU,IJU,IKU))     ; XTHM_MAX = 0.0
+  ALLOCATE(XTEMPM_MAX(IIU,IJU,IKU))   ; XTEMPM_MAX = 0.0
+  IF (CTURB/='NONE') THEN
+    ALLOCATE(XTKEM_MAX(IIU,IJU,IKU))
+    XTKEM_MAX = 0.0
+  ELSE
+    ALLOCATE(XTKEM_MAX(0,0,0))
+  END IF
+  ALLOCATE(XPABSM_MAX(IIU,IJU,IKU))   ; XPABSM_MAX = 0.0
+ELSE
+!
+  ALLOCATE(XUM_MEAN(0,0,0))
+  ALLOCATE(XVM_MEAN(0,0,0))
+  ALLOCATE(XWM_MEAN(0,0,0))
+  ALLOCATE(XTHM_MEAN(0,0,0))
+  ALLOCATE(XTEMPM_MEAN(0,0,0))
+  ALLOCATE(XSVT_MEAN(0,0,0))
+  ALLOCATE(XTKEM_MEAN(0,0,0))
+  ALLOCATE(XPABSM_MEAN(0,0,0))
+!
+  ALLOCATE(XU2_M2(0,0,0))
+  ALLOCATE(XV2_M2(0,0,0))
+  ALLOCATE(XW2_M2(0,0,0))
+  ALLOCATE(XTH2_M2(0,0,0))
+  ALLOCATE(XTEMP2_M2(0,0,0))
+  ALLOCATE(XPABS2_M2(0,0,0))
+!
+  IF (LCOV_FIELD) THEN
+    ALLOCATE(XUV_MEAN(0,0,0))
+    ALLOCATE(XUW_MEAN(0,0,0))
+    ALLOCATE(XVW_MEAN(0,0,0))
+    ALLOCATE(XWTH_MEAN(0,0,0))
+  END IF
+!
+  ALLOCATE(XUM_MAX(0,0,0))
+  ALLOCATE(XVM_MAX(0,0,0))
+  ALLOCATE(XWM_MAX(0,0,0))
+  ALLOCATE(XTHM_MAX(0,0,0))
+  ALLOCATE(XTEMPM_MAX(0,0,0))
+  ALLOCATE(XTKEM_MAX(0,0,0))
+  ALLOCATE(XPABSM_MAX(0,0,0))
+END IF
+!
+IF ((CUVW_ADV_SCHEME(1:3)=='CEN') .AND. (CTEMP_SCHEME == 'LEFR') ) THEN
+  ALLOCATE(XUM(IIU,IJU,IKU))
+  ALLOCATE(XVM(IIU,IJU,IKU))
+  ALLOCATE(XWM(IIU,IJU,IKU))
+  ALLOCATE(XDUM(IIU,IJU,IKU))
+  ALLOCATE(XDVM(IIU,IJU,IKU))
+  ALLOCATE(XDWM(IIU,IJU,IKU))
+  IF (CCONF == 'START') THEN
+    XUM  = 0.0
+    XVM  = 0.0
+    XWM  = 0.0
+    XDUM  = 0.0
+    XDVM  = 0.0
+    XDWM  = 0.0
+  END IF
+ELSE
+  ALLOCATE(XUM(0,0,0))
+  ALLOCATE(XVM(0,0,0))
+  ALLOCATE(XWM(0,0,0))
+  ALLOCATE(XDUM(0,0,0))
+  ALLOCATE(XDVM(0,0,0))
+  ALLOCATE(XDWM(0,0,0))
+END IF
+!
+ALLOCATE(XUT(IIU,IJU,IKU))      ; XUT  = 0.0
+ALLOCATE(XVT(IIU,IJU,IKU))      ; XVT  = 0.0
+ALLOCATE(XWT(IIU,IJU,IKU))      ; XWT  = 0.0
+ALLOCATE(XTHT(IIU,IJU,IKU))     ; XTHT = 0.0
+ALLOCATE(XRUS(IIU,IJU,IKU))     ; XRUS = 0.0
+ALLOCATE(XRVS(IIU,IJU,IKU))     ; XRVS = 0.0
+ALLOCATE(XRWS(IIU,IJU,IKU))     ; XRWS = 0.0
+ALLOCATE(XRUS_PRES(IIU,IJU,IKU)); XRUS_PRES = 0.0
+ALLOCATE(XRVS_PRES(IIU,IJU,IKU)); XRVS_PRES = 0.0
+ALLOCATE(XRWS_PRES(IIU,IJU,IKU)); XRWS_PRES = 0.0
+ALLOCATE(XRTHS(IIU,IJU,IKU))    ; XRTHS = 0.0
+ALLOCATE(XRTHS_CLD(IIU,IJU,IKU)); XRTHS_CLD = 0.0
+
+IF ( LIBM ) THEN
+  ALLOCATE(ZIBM_LS(IIU,IJU,IKU))  ; ZIBM_LS = 0.0
+  ALLOCATE(XIBM_XMUT(IIU,IJU,IKU)); XIBM_XMUT = 0.0
+ELSE
+  ALLOCATE(ZIBM_LS  (0,0,0))
+  ALLOCATE(XIBM_XMUT(0,0,0))
+END IF
+
+IF ( LRECYCL ) THEN
+  ALLOCATE(XFLUCTUNW(IJU,IKU))    ; XFLUCTUNW  = 0.0
+  ALLOCATE(XFLUCTVNN(IIU,IKU))    ; XFLUCTVNN  = 0.0
+  ALLOCATE(XFLUCTUTN(IIU,IKU))    ; XFLUCTUTN  = 0.0
+  ALLOCATE(XFLUCTVTW(IJU,IKU))    ; XFLUCTVTW  = 0.0
+  ALLOCATE(XFLUCTUNE(IJU,IKU))    ; XFLUCTUNE  = 0.0
+  ALLOCATE(XFLUCTVNS(IIU,IKU))    ; XFLUCTVNS  = 0.0
+  ALLOCATE(XFLUCTUTS(IIU,IKU))    ; XFLUCTUTS  = 0.0
+  ALLOCATE(XFLUCTVTE(IJU,IKU))    ; XFLUCTVTE  = 0.0
+  ALLOCATE(XFLUCTWTW(IJU,IKU))    ; XFLUCTWTW  = 0.0
+  ALLOCATE(XFLUCTWTN(IIU,IKU))    ; XFLUCTWTN  = 0.0
+  ALLOCATE(XFLUCTWTE(IJU,IKU))    ; XFLUCTWTE  = 0.0
+  ALLOCATE(XFLUCTWTS(IIU,IKU))    ; XFLUCTWTS  = 0.0
+ELSE
+  ALLOCATE(XFLUCTUNW(0,0))
+  ALLOCATE(XFLUCTVNN(0,0))
+  ALLOCATE(XFLUCTUTN(0,0))
+  ALLOCATE(XFLUCTVTW(0,0))
+  ALLOCATE(XFLUCTUNE(0,0))
+  ALLOCATE(XFLUCTVNS(0,0))
+  ALLOCATE(XFLUCTUTS(0,0))
+  ALLOCATE(XFLUCTVTE(0,0))
+  ALLOCATE(XFLUCTWTW(0,0))
+  ALLOCATE(XFLUCTWTN(0,0))
+  ALLOCATE(XFLUCTWTE(0,0))
+  ALLOCATE(XFLUCTWTS(0,0))
+END IF
+!
+IF (CTURB /= 'NONE') THEN
+  ALLOCATE(XTKET(IIU,IJU,IKU))
+  ALLOCATE(XRTKES(IIU,IJU,IKU))
+  ALLOCATE(XRTKEMS(IIU,IJU,IKU)); XRTKEMS = 0.0
+  ALLOCATE(XWTHVMF(IIU,IJU,IKU))
+  ALLOCATE(XDYP(IIU,IJU,IKU))
+  ALLOCATE(XTHP(IIU,IJU,IKU))
+  ALLOCATE(XTR(IIU,IJU,IKU))
+  ALLOCATE(XDISS(IIU,IJU,IKU))
+  ALLOCATE(XLEM(IIU,IJU,IKU))
+ELSE
+  ALLOCATE(XTKET(0,0,0))
+  ALLOCATE(XRTKES(0,0,0))
+  ALLOCATE(XRTKEMS(0,0,0))
+  ALLOCATE(XWTHVMF(0,0,0))
+  ALLOCATE(XDYP(0,0,0))
+  ALLOCATE(XTHP(0,0,0))
+  ALLOCATE(XTR(0,0,0))
+  ALLOCATE(XDISS(0,0,0))
+  ALLOCATE(XLEM(0,0,0))
+END IF
+IF (CTOM == 'TM06') THEN
+  ALLOCATE(XBL_DEPTH(IIU,IJU))
+ELSE
+  ALLOCATE(XBL_DEPTH(0,0))
+END IF
+IF (LRMC01) THEN
+  ALLOCATE(XSBL_DEPTH(IIU,IJU))
+ELSE
+  ALLOCATE(XSBL_DEPTH(0,0))
+END IF
+!
+ALLOCATE(XPABSM(IIU,IJU,IKU)) ; XPABSM = 0.0
+ALLOCATE(XPABST(IIU,IJU,IKU)) ; XPABST = 0.0
+!
+ALLOCATE(XRT(IIU,IJU,IKU,NRR)) ;     XRT = 0.0
+ALLOCATE(XRRS(IIU,IJU,IKU,NRR)) ;    XRRS = 0.0
+ALLOCATE(XRRS_CLD(IIU,IJU,IKU,NRR)); XRRS_CLD = 0.0
+!
+IF (CTURB /= 'NONE' .AND. NRR>1) THEN
+  ALLOCATE(XSRCT(IIU,IJU,IKU))
+  ALLOCATE(XSIGS(IIU,IJU,IKU))
+ELSE
+  ALLOCATE(XSRCT(0,0,0))
+  ALLOCATE(XSIGS(0,0,0))
+END IF
+IF (CCLOUD == 'ICE3'.OR.CCLOUD == 'ICE4') THEN
+  ALLOCATE(XHLC_HRC(IIU,IJU,IKU))
+  ALLOCATE(XHLC_HCF(IIU,IJU,IKU))
+  ALLOCATE(XHLI_HRI(IIU,IJU,IKU))
+  ALLOCATE(XHLI_HCF(IIU,IJU,IKU))
+  XHLC_HRC(:,:,:)=0.
+  XHLC_HCF(:,:,:)=0.
+  XHLI_HRI(:,:,:)=0.
+  XHLI_HCF(:,:,:)=0.
+ELSE
+  ALLOCATE(XHLC_HRC(0,0,0))
+  ALLOCATE(XHLC_HCF(0,0,0))
+  ALLOCATE(XHLI_HRI(0,0,0))
+  ALLOCATE(XHLI_HCF(0,0,0))
+END IF
+!
+IF (NRR>1) THEN
+  ALLOCATE(XCLDFR(IIU,IJU,IKU));  XCLDFR (:, :, :) = 0.
+  ALLOCATE(XICEFR(IIU,IJU,IKU));  XICEFR (:, :, :) = 0.
+  ALLOCATE(XRAINFR(IIU,IJU,IKU)); XRAINFR(:, :, :) = 0.
+ELSE
+  ALLOCATE(XCLDFR(0,0,0))
+  ALLOCATE(XICEFR(0,0,0))
+  ALLOCATE(XRAINFR(0,0,0))
+END IF
+!
+ALLOCATE(XSVT(IIU,IJU,IKU,NSV)) ;     XSVT  = 0.
+ALLOCATE(XRSVS(IIU,IJU,IKU,NSV));     XRSVS = 0.
+ALLOCATE(XRSVS_CLD(IIU,IJU,IKU,NSV)); XRSVS_CLD = 0.0
+ALLOCATE(XZWS(IIU,IJU)) ;             XZWS(:,:) = XZWS_DEFAULT
+!
+IF (LPASPOL) THEN
+  ALLOCATE( XATC(IIU,IJU,IKU,NSV_PP) )
+  XATC = 0.
+ELSE
+  ALLOCATE( XATC(0,0,0,0))
+END IF
+!
+IF(LBLOWSNOW) THEN
+  ALLOCATE(XSNWCANO(IIU,IJU,NBLOWSNOW_2D))
+  ALLOCATE(XRSNWCANOS(IIU,IJU,NBLOWSNOW_2D))
+  XSNWCANO(:,:,:) = 0.0
+  XRSNWCANOS(:,:,:) = 0.0
+ELSE
+  ALLOCATE(XSNWCANO(0,0,0))
+  ALLOCATE(XRSNWCANOS(0,0,0))
+END IF
+!
+!*       3.2   Module MODD_GRID_n and MODD_METRICS_n
+!
+IF (LCARTESIAN) THEN
+  ALLOCATE(XLON(0,0))
+  ALLOCATE(XLAT(0,0))
+  ALLOCATE(XMAP(0,0))
+ELSE
+  ALLOCATE(XLON(IIU,IJU))
+  ALLOCATE(XLAT(IIU,IJU))
+  ALLOCATE(XMAP(IIU,IJU))
+END IF
+ALLOCATE(XXHAT(IIU))
+ALLOCATE(XDXHAT(IIU))
+ALLOCATE(XYHAT(IJU))
+ALLOCATE(XDYHAT(IJU))
+ALLOCATE(XXHATM(IIU))
+ALLOCATE(XYHATM(IJU))
+ALLOCATE(XZS(IIU,IJU))
+ALLOCATE(XZSMT(IIU,IJU))
+ALLOCATE(XZZ(IIU,IJU,IKU))
+ALLOCATE(XZHAT(IKU))
+ALLOCATE(XZHATM(IKU))
+ALLOCATE(XDIRCOSZW(IIU,IJU))
+ALLOCATE(XDIRCOSXW(IIU,IJU))
+ALLOCATE(XDIRCOSYW(IIU,IJU))
+ALLOCATE(XCOSSLOPE(IIU,IJU))
+ALLOCATE(XSINSLOPE(IIU,IJU))
+!
+ALLOCATE(XDXX(IIU,IJU,IKU))
+ALLOCATE(XDYY(IIU,IJU,IKU))
+ALLOCATE(XDZX(IIU,IJU,IKU))
+ALLOCATE(XDZY(IIU,IJU,IKU))
+ALLOCATE(XDZZ(IIU,IJU,IKU))
+!
+!*       3.3   Modules MODD_REF and  MODD_REF_n
+!
+! Different reference states for Ocean and Atmosphere models
+!  For the moment, same reference states for O and A
+!IF ((KMI == 1).OR.LCOUPLES) THEN
+IF (KMI==1) THEN
+  ALLOCATE(XRHODREFZ(IKU),XTHVREFZ(IKU))
+ELSE IF (LCOUPLES) THEN
+! in coupled O-A case, need different variables for ocean
+  ALLOCATE(XRHODREFZO(IKU),XTHVREFZO(IKU))
+ELSE
+  !Do not allocate XRHODREFZ and XTHVREFZ because they are the same on all grids (not 'n' variables)
+END IF
+!
+ALLOCATE(XPHIT(IIU,IJU,IKU))
+ALLOCATE(XRHODREF(IIU,IJU,IKU))
+ALLOCATE(XTHVREF(IIU,IJU,IKU))
+ALLOCATE(XEXNREF(IIU,IJU,IKU))
+ALLOCATE(XRHODJ(IIU,IJU,IKU))
+IF (CEQNSYS=='DUR' .AND. LUSERV) THEN
+  ALLOCATE(XRVREF(IIU,IJU,IKU))
+ELSE
+  ALLOCATE(XRVREF(0,0,0))
+END IF
+!
+!*       3.4   Module MODD_CURVCOR_n
+!
+IF (LTHINSHELL) THEN
+  ALLOCATE(XCORIOX(0,0))
+  ALLOCATE(XCORIOY(0,0))
+ELSE
+  ALLOCATE(XCORIOX(IIU,IJU))
+  ALLOCATE(XCORIOY(IIU,IJU))
+END IF
+  ALLOCATE(XCORIOZ(IIU,IJU))
+IF (LCARTESIAN) THEN
+  ALLOCATE(XCURVX(0,0))
+  ALLOCATE(XCURVY(0,0))
+ELSE
+  ALLOCATE(XCURVX(IIU,IJU))
+  ALLOCATE(XCURVY(IIU,IJU))
+END IF
+!
+!*       3.5   Module MODD_DYN_n
+!
+CALL GET_DIM_EXT_ll('Y',IIY,IJY)
+IF (L2D) THEN
+  ALLOCATE(XBFY(IIY,IJY,IKU))
+ELSE
+  ALLOCATE(XBFY(IJY,IIY,IKU)) ! transposition needed by the optimisation of the
+                              ! FFT solver
+END IF
+CALL GET_DIM_EXT_ll('B',IIU_B,IJU_B)
+ALLOCATE(XBFB(IIU_B,IJU_B,IKU))
+CALL GET_DIM_EXTZ_ll('SXP2_YP1_Z',IIU_SXP2_YP1_Z_ll,IJU_SXP2_YP1_Z_ll,IKU_SXP2_YP1_Z_ll)
+ALLOCATE(XBF_SXP2_YP1_Z(IIU_SXP2_YP1_Z_ll,IJU_SXP2_YP1_Z_ll,IKU_SXP2_YP1_Z_ll))
+ALLOCATE(XAF(IKU),XCF(IKU))
+ALLOCATE(XTRIGSX(3*IIU_ll))
+ALLOCATE(XTRIGSY(3*IJU_ll))
+ALLOCATE(XRHOM(IKU))
+ALLOCATE(XALK(IKU))
+ALLOCATE(XALKW(IKU))
+ALLOCATE(XALKBAS(IKU))
+ALLOCATE(XALKWBAS(IKU))
+!
+IF ( LHORELAX_UVWTH .OR. LHORELAX_RV .OR.                                  &
+     LHORELAX_RC .OR. LHORELAX_RR .OR. LHORELAX_RI  .OR. LHORELAX_RS  .OR. &
+     LHORELAX_RG .OR. LHORELAX_RH .OR. LHORELAX_TKE .OR.                   &
+     ANY(LHORELAX_SV) ) THEN
+  ALLOCATE(XKURELAX(IIU,IJU))
+  ALLOCATE(XKVRELAX(IIU,IJU))
+  ALLOCATE(XKWRELAX(IIU,IJU))
+  ALLOCATE(LMASK_RELAX(IIU,IJU))
+ELSE
+  ALLOCATE(XKURELAX(0,0))
+  ALLOCATE(XKVRELAX(0,0))
+  ALLOCATE(XKWRELAX(0,0))
+  ALLOCATE(LMASK_RELAX(0,0))
+END IF
+!
+! Additional fields for truly horizontal diffusion (Module MODD_DYNZD$n)
+IF (LZDIFFU) THEN
+  CALL INIT_TYPE_ZDIFFU_HALO2(XZDIFFU_HALO2)
+ELSE
+  CALL INIT_TYPE_ZDIFFU_HALO2(XZDIFFU_HALO2,0)
+ENDIF
+!
+!*       3.6   Larger Scale variables (Module MODD_LSFIELD$n)
+!
+!
+! upper relaxation part
+!
+ALLOCATE(XLSUM(IIU,IJU,IKU))    ; XLSUM  = 0.0
+ALLOCATE(XLSVM(IIU,IJU,IKU))    ; XLSVM  = 0.0
+ALLOCATE(XLSWM(IIU,IJU,IKU))    ; XLSWM  = 0.0
+ALLOCATE(XLSTHM(IIU,IJU,IKU))   ; XLSTHM = 0.0
+IF ( NRR > 0 ) THEN
+  ALLOCATE(XLSRVM(IIU,IJU,IKU)) ; XLSRVM = 0.0
+ELSE
+  ALLOCATE(XLSRVM(0,0,0))
+END IF
+ALLOCATE(XLSZWSM(IIU,IJU)) ; XLSZWSM = -1.
+!
+!  lbc part
+!
+IF ( L1D) THEN                         ! 1D case
+!
+  NSIZELBX_ll=0
+  NSIZELBXU_ll=0
+  NSIZELBY_ll=0
+  NSIZELBYV_ll=0
+  NSIZELBXTKE_ll=0
+  NSIZELBXR_ll=0
+  NSIZELBXSV_ll=0
+  NSIZELBYTKE_ll=0
+  NSIZELBYR_ll=0
+  NSIZELBYSV_ll=0
+  ALLOCATE(XLBXUM(0,0,0))
+  ALLOCATE(XLBYUM(0,0,0))
+  ALLOCATE(XLBXVM(0,0,0))
+  ALLOCATE(XLBYVM(0,0,0))
+  ALLOCATE(XLBXWM(0,0,0))
+  ALLOCATE(XLBYWM(0,0,0))
+  ALLOCATE(XLBXTHM(0,0,0))
+  ALLOCATE(XLBYTHM(0,0,0))
+  ALLOCATE(XLBXTKEM(0,0,0))
+  ALLOCATE(XLBYTKEM(0,0,0))
+  ALLOCATE(XLBXRM(0,0,0,0))
+  ALLOCATE(XLBYRM(0,0,0,0))
+  ALLOCATE(XLBXSVM(0,0,0,0))
+  ALLOCATE(XLBYSVM(0,0,0,0))
+!
+ELSEIF( L2D ) THEN                         ! 2D case
+!
+  NSIZELBY_ll=0
+  NSIZELBYV_ll=0
+  NSIZELBYTKE_ll=0
+  NSIZELBYR_ll=0
+  NSIZELBYSV_ll=0
+  ALLOCATE(XLBYUM(0,0,0))
+  ALLOCATE(XLBYVM(0,0,0))
+  ALLOCATE(XLBYWM(0,0,0))
+  ALLOCATE(XLBYTHM(0,0,0))
+  ALLOCATE(XLBYTKEM(0,0,0))
+  ALLOCATE(XLBYRM(0,0,0,0))
+  ALLOCATE(XLBYSVM(0,0,0,0))
+!
+  CALL GET_SIZEX_LB(NIMAX_ll,NJMAX_ll,NRIMX,  &
+       IISIZEXF,IJSIZEXF,IISIZEXFU,IJSIZEXFU, &
+       IISIZEX4,IJSIZEX4,IISIZEX2,IJSIZEX2)
+!
+  IF ( LHORELAX_UVWTH ) THEN
+    NSIZELBX_ll=2*NRIMX+2*JPHEXT
+    NSIZELBXU_ll=2*NRIMX+2*JPHEXT
+    ALLOCATE(XLBXUM(IISIZEXFU,IJSIZEXFU,IKU))
+    ALLOCATE(XLBXVM(IISIZEXF,IJSIZEXF,IKU))
+    ALLOCATE(XLBXWM(IISIZEXF,IJSIZEXF,IKU))
+    ALLOCATE(XLBXTHM(IISIZEXF,IJSIZEXF,IKU))
+  ELSE
+    NSIZELBX_ll=2*JPHEXT      ! 2
+    NSIZELBXU_ll=2*(JPHEXT+1) ! 4
+    ALLOCATE(XLBXUM(IISIZEX4,IJSIZEX4,IKU))
+    ALLOCATE(XLBXVM(IISIZEX2,IJSIZEX2,IKU))
+    ALLOCATE(XLBXWM(IISIZEX2,IJSIZEX2,IKU))
+    ALLOCATE(XLBXTHM(IISIZEX2,IJSIZEX2,IKU))
+  END IF
+!
+  IF (CTURB /= 'NONE') THEN
+    IF ( LHORELAX_TKE) THEN
+      NSIZELBXTKE_ll=2* NRIMX+2*JPHEXT
+      ALLOCATE(XLBXTKEM(IISIZEXF,IJSIZEXF,IKU))
+    ELSE
+      NSIZELBXTKE_ll=2*JPHEXT  ! 2
+      ALLOCATE(XLBXTKEM(IISIZEX2,IJSIZEX2,IKU))
+    END IF
+  ELSE
+    NSIZELBXTKE_ll=0
+    ALLOCATE(XLBXTKEM(0,0,0))
+  END IF
+  !
+  IF ( NRR > 0 ) THEN
+    IF (LHORELAX_RV .OR. LHORELAX_RC .OR. LHORELAX_RR .OR. LHORELAX_RI    &
+         .OR. LHORELAX_RS .OR. LHORELAX_RG .OR. LHORELAX_RH               &
+       ) THEN
+      NSIZELBXR_ll=2* NRIMX+2*JPHEXT
+      ALLOCATE(XLBXRM(IISIZEXF,IJSIZEXF,IKU,NRR))
+    ELSE
+      NSIZELBXR_ll=2*JPHEXT  ! 2
+      ALLOCATE(XLBXRM(IISIZEX2,IJSIZEX2,IKU,NRR))
+    ENDIF
+  ELSE
+    NSIZELBXR_ll=0
+    ALLOCATE(XLBXRM(0,0,0,0))
+  END IF
+  !
+  IF ( NSV > 0 ) THEN
+    IF ( ANY( LHORELAX_SV(:)) ) THEN
+      NSIZELBXSV_ll=2* NRIMX+2*JPHEXT
+      ALLOCATE(XLBXSVM(IISIZEXF,IJSIZEXF,IKU,NSV))
+    ELSE
+      NSIZELBXSV_ll=2*JPHEXT  ! 2
+      ALLOCATE(XLBXSVM(IISIZEX2,IJSIZEX2,IKU,NSV))
+    END IF
+  ELSE
+    NSIZELBXSV_ll=0
+    ALLOCATE(XLBXSVM(0,0,0,0))
+  END IF
+!
+ELSE                                   ! 3D case
+!
+!
+  CALL GET_SIZEX_LB(NIMAX_ll,NJMAX_ll,NRIMX,               &
+                    IISIZEXF,IJSIZEXF,IISIZEXFU,IJSIZEXFU, &
+                    IISIZEX4,IJSIZEX4,IISIZEX2,IJSIZEX2)
+  CALL GET_SIZEY_LB(NIMAX_ll,NJMAX_ll,NRIMY,               &
+                    IISIZEYF,IJSIZEYF,IISIZEYFV,IJSIZEYFV, &
+                    IISIZEY4,IJSIZEY4,IISIZEY2,IJSIZEY2)
+!
+! check if local domain not to small for NRIMX NRIMY
+!
+  IF ( CLBCX(1) /= 'CYCL' )  THEN
+     IF ( NRIMX .GT. IDIMX )   THEN
+        WRITE(*,'(A,I8,A/A,2I8,/A)') "Processor=", IP-1, &
+             " :: INI_MODEL_n ERROR:  ( NRIMX  > IDIMX )  ", &
+             " Local domain to small for relaxation NRIMX,IDIMX ", &
+             NRIMX,IDIMX ,&
+             " change relaxation parameters or number of processors "
+        call Print_msg(NVERB_FATAL,'GEN','INI_MODEL_n','')
+     END IF
+  END IF
+  IF ( CLBCY(1) /= 'CYCL' ) THEN
+     IF ( NRIMY .GT. IDIMY )  THEN
+        WRITE(*,'(A,I8,A/A,2I8,/A)') "Processor=", IP-1, &
+             " :: INI_MODEL_n ERROR:  ( NRIMY > IDIMY )  ", &
+             " Local domain to small for relaxation NRIMY,IDIMY ", &
+             NRIMY,IDIMY ,&
+             " change relaxation parameters or number of processors "
+        call Print_msg(NVERB_FATAL,'GEN','INI_MODEL_n','')
+     END IF
+  END IF
+IF ( LHORELAX_UVWTH ) THEN
+    NSIZELBX_ll=2*NRIMX+2*JPHEXT
+    NSIZELBXU_ll=2*NRIMX+2*JPHEXT
+    NSIZELBY_ll=2*NRIMY+2*JPHEXT
+    NSIZELBYV_ll=2*NRIMY+2*JPHEXT
+    ALLOCATE(XLBXUM(IISIZEXFU,IJSIZEXFU,IKU))
+    ALLOCATE(XLBYUM(IISIZEYF,IJSIZEYF,IKU))
+    ALLOCATE(XLBXVM(IISIZEXF,IJSIZEXF,IKU))
+    ALLOCATE(XLBYVM(IISIZEYFV,IJSIZEYFV,IKU))
+    ALLOCATE(XLBXWM(IISIZEXF,IJSIZEXF,IKU))
+    ALLOCATE(XLBYWM(IISIZEYF,IJSIZEYF,IKU))
+    ALLOCATE(XLBXTHM(IISIZEXF,IJSIZEXF,IKU))
+    ALLOCATE(XLBYTHM(IISIZEYF,IJSIZEYF,IKU))
+  ELSE
+    NSIZELBX_ll=2*JPHEXT  ! 2
+    NSIZELBXU_ll=2*(JPHEXT+1) ! 4
+    NSIZELBY_ll=2*JPHEXT  ! 2
+    NSIZELBYV_ll=2*(JPHEXT+1) ! 4
+    ALLOCATE(XLBXUM(IISIZEX4,IJSIZEX4,IKU))
+    ALLOCATE(XLBYUM(IISIZEY2,IJSIZEY2,IKU))
+    ALLOCATE(XLBXVM(IISIZEX2,IJSIZEX2,IKU))
+    ALLOCATE(XLBYVM(IISIZEY4,IJSIZEY4,IKU))
+    ALLOCATE(XLBXWM(IISIZEX2,IJSIZEX2,IKU))
+    ALLOCATE(XLBYWM(IISIZEY2,IJSIZEY2,IKU))
+    ALLOCATE(XLBXTHM(IISIZEX2,IJSIZEX2,IKU))
+    ALLOCATE(XLBYTHM(IISIZEY2,IJSIZEY2,IKU))
+  END IF
+  !
+  IF (CTURB /= 'NONE') THEN
+    IF ( LHORELAX_TKE) THEN
+      NSIZELBXTKE_ll=2*NRIMX+2*JPHEXT
+      NSIZELBYTKE_ll=2*NRIMY+2*JPHEXT
+      ALLOCATE(XLBXTKEM(IISIZEXF,IJSIZEXF,IKU))
+      ALLOCATE(XLBYTKEM(IISIZEYF,IJSIZEYF,IKU))
+    ELSE
+      NSIZELBXTKE_ll=2*JPHEXT  ! 2
+      NSIZELBYTKE_ll=2*JPHEXT  ! 2
+      ALLOCATE(XLBXTKEM(IISIZEX2,IJSIZEX2,IKU))
+      ALLOCATE(XLBYTKEM(IISIZEY2,IJSIZEY2,IKU))
+    END IF
+  ELSE
+    NSIZELBXTKE_ll=0
+    NSIZELBYTKE_ll=0
+    ALLOCATE(XLBXTKEM(0,0,0))
+    ALLOCATE(XLBYTKEM(0,0,0))
+  END IF
+  !
+  IF ( NRR > 0 ) THEN
+    IF (LHORELAX_RV .OR. LHORELAX_RC .OR. LHORELAX_RR .OR. LHORELAX_RI    &
+          .OR. LHORELAX_RS .OR. LHORELAX_RG .OR. LHORELAX_RH              &
+       ) THEN
+      NSIZELBXR_ll=2*NRIMX+2*JPHEXT
+      NSIZELBYR_ll=2*NRIMY+2*JPHEXT
+      ALLOCATE(XLBXRM(IISIZEXF,IJSIZEXF,IKU,NRR))
+      ALLOCATE(XLBYRM(IISIZEYF,IJSIZEYF,IKU,NRR))
+    ELSE
+      NSIZELBXR_ll=2*JPHEXT  ! 2
+      NSIZELBYR_ll=2*JPHEXT  ! 2
+      ALLOCATE(XLBXRM(IISIZEX2,IJSIZEX2,IKU,NRR))
+      ALLOCATE(XLBYRM(IISIZEY2,IJSIZEY2,IKU,NRR))
+    ENDIF
+  ELSE
+    NSIZELBXR_ll=0
+    NSIZELBYR_ll=0
+    ALLOCATE(XLBXRM(0,0,0,0))
+    ALLOCATE(XLBYRM(0,0,0,0))
+  END IF
+  !
+  IF ( NSV > 0 ) THEN
+    IF ( ANY( LHORELAX_SV(:)) ) THEN
+      NSIZELBXSV_ll=2*NRIMX+2*JPHEXT
+      NSIZELBYSV_ll=2*NRIMY+2*JPHEXT
+      ALLOCATE(XLBXSVM(IISIZEXF,IJSIZEXF,IKU,NSV))
+      ALLOCATE(XLBYSVM(IISIZEYF,IJSIZEYF,IKU,NSV))
+    ELSE
+      NSIZELBXSV_ll=2*JPHEXT  ! 2
+      NSIZELBYSV_ll=2*JPHEXT  ! 2
+      ALLOCATE(XLBXSVM(IISIZEX2,IJSIZEX2,IKU,NSV))
+      ALLOCATE(XLBYSVM(IISIZEY2,IJSIZEY2,IKU,NSV))
+    END IF
+  ELSE
+    NSIZELBXSV_ll=0
+    NSIZELBYSV_ll=0
+    ALLOCATE(XLBXSVM(0,0,0,0))
+    ALLOCATE(XLBYSVM(0,0,0,0))
+  END IF
+END IF      ! END OF THE IF STRUCTURE ON THE MODEL DIMENSION
+!
+!
+IF ( KMI > 1 ) THEN
+  ! it has been assumed that the THeta field used the largest rim area compared
+  ! to the others prognostic variables, if it is not the case, you must change
+  ! these lines
+  ALLOCATE(XCOEFLIN_LBXM(SIZE(XLBXTHM,1),SIZE(XLBXTHM,2),SIZE(XLBXTHM,3)))
+  ALLOCATE(   NKLIN_LBXM(SIZE(XLBXTHM,1),SIZE(XLBXTHM,2),SIZE(XLBXTHM,3)))
+  ALLOCATE(XCOEFLIN_LBYM(SIZE(XLBYTHM,1),SIZE(XLBYTHM,2),SIZE(XLBYTHM,3)))
+  ALLOCATE(   NKLIN_LBYM(SIZE(XLBYTHM,1),SIZE(XLBYTHM,2),SIZE(XLBYTHM,3)))
+  ALLOCATE(XCOEFLIN_LBXU(SIZE(XLBXUM,1),SIZE(XLBXUM,2),SIZE(XLBXUM,3)))
+  ALLOCATE(   NKLIN_LBXU(SIZE(XLBXUM,1),SIZE(XLBXUM,2),SIZE(XLBXUM,3)))
+  ALLOCATE(XCOEFLIN_LBYU(SIZE(XLBYUM,1),SIZE(XLBYUM,2),SIZE(XLBYUM,3)))
+  ALLOCATE(   NKLIN_LBYU(SIZE(XLBYUM,1),SIZE(XLBYUM,2),SIZE(XLBYUM,3)))
+  ALLOCATE(XCOEFLIN_LBXV(SIZE(XLBXVM,1),SIZE(XLBXVM,2),SIZE(XLBXVM,3)))
+  ALLOCATE(   NKLIN_LBXV(SIZE(XLBXVM,1),SIZE(XLBXVM,2),SIZE(XLBXVM,3)))
+  ALLOCATE(XCOEFLIN_LBYV(SIZE(XLBYVM,1),SIZE(XLBYVM,2),SIZE(XLBYVM,3)))
+  ALLOCATE(   NKLIN_LBYV(SIZE(XLBYVM,1),SIZE(XLBYVM,2),SIZE(XLBYVM,3)))
+  ALLOCATE(XCOEFLIN_LBXW(SIZE(XLBXWM,1),SIZE(XLBXWM,2),SIZE(XLBXWM,3)))
+  ALLOCATE(   NKLIN_LBXW(SIZE(XLBXWM,1),SIZE(XLBXWM,2),SIZE(XLBXWM,3)))
+  ALLOCATE(XCOEFLIN_LBYW(SIZE(XLBYWM,1),SIZE(XLBYWM,2),SIZE(XLBYWM,3)))
+  ALLOCATE(   NKLIN_LBYW(SIZE(XLBYWM,1),SIZE(XLBYWM,2),SIZE(XLBYWM,3)))
+ELSE
+  ALLOCATE(XCOEFLIN_LBXM(0,0,0))
+  ALLOCATE(   NKLIN_LBXM(0,0,0))
+  ALLOCATE(XCOEFLIN_LBYM(0,0,0))
+  ALLOCATE(   NKLIN_LBYM(0,0,0))
+  ALLOCATE(XCOEFLIN_LBXU(0,0,0))
+  ALLOCATE(   NKLIN_LBXU(0,0,0))
+  ALLOCATE(XCOEFLIN_LBYU(0,0,0))
+  ALLOCATE(   NKLIN_LBYU(0,0,0))
+  ALLOCATE(XCOEFLIN_LBXV(0,0,0))
+  ALLOCATE(   NKLIN_LBXV(0,0,0))
+  ALLOCATE(XCOEFLIN_LBYV(0,0,0))
+  ALLOCATE(   NKLIN_LBYV(0,0,0))
+  ALLOCATE(XCOEFLIN_LBXW(0,0,0))
+  ALLOCATE(   NKLIN_LBXW(0,0,0))
+  ALLOCATE(XCOEFLIN_LBYW(0,0,0))
+  ALLOCATE(   NKLIN_LBYW(0,0,0))
+END IF
+!
+!  allocation of the LS fields for vertical relaxation and numerical diffusion
+IF( .NOT. LSTEADYLS )  THEN
+!
+  ALLOCATE(XLSUS(SIZE(XLSUM,1),SIZE(XLSUM,2),SIZE(XLSUM,3)))
+  ALLOCATE(XLSVS(SIZE(XLSVM,1),SIZE(XLSVM,2),SIZE(XLSVM,3)))
+  ALLOCATE(XLSWS(SIZE(XLSWM,1),SIZE(XLSWM,2),SIZE(XLSWM,3)))
+  ALLOCATE(XLSTHS(SIZE(XLSTHM,1),SIZE(XLSTHM,2),SIZE(XLSTHM,3)))
+  ALLOCATE(XLSRVS(SIZE(XLSRVM,1),SIZE(XLSRVM,2),SIZE(XLSRVM,3)))
+  ALLOCATE(XLSZWSS(SIZE(XLSZWSM,1),SIZE(XLSZWSM,2)))
+!
+ELSE
+!
+  ALLOCATE(XLSUS(0,0,0))
+  ALLOCATE(XLSVS(0,0,0))
+  ALLOCATE(XLSWS(0,0,0))
+  ALLOCATE(XLSTHS(0,0,0))
+  ALLOCATE(XLSRVS(0,0,0))
+  ALLOCATE(XLSZWSS(0,0))
+!
+END IF
+!  allocation of the LB fields for horizontal relaxation and Lateral Boundaries
+IF( .NOT. ( LSTEADYLS .AND. KMI==1 ) )  THEN
+!
+  ALLOCATE(XLBXTKES(SIZE(XLBXTKEM,1),SIZE(XLBXTKEM,2),SIZE(XLBXTKEM,3)))
+  ALLOCATE(XLBYTKES(SIZE(XLBYTKEM,1),SIZE(XLBYTKEM,2),SIZE(XLBYTKEM,3)))
+  ALLOCATE(XLBXUS(SIZE(XLBXUM,1),SIZE(XLBXUM,2),SIZE(XLBXUM,3)))
+  ALLOCATE(XLBYUS(SIZE(XLBYUM,1),SIZE(XLBYUM,2),SIZE(XLBYUM,3)))
+  ALLOCATE(XLBXVS(SIZE(XLBXVM,1),SIZE(XLBXVM,2),SIZE(XLBXVM,3)))
+  ALLOCATE(XLBYVS(SIZE(XLBYVM,1),SIZE(XLBYVM,2),SIZE(XLBYVM,3)))
+  ALLOCATE(XLBXWS(SIZE(XLBXWM,1),SIZE(XLBXWM,2),SIZE(XLBXWM,3)))
+  ALLOCATE(XLBYWS(SIZE(XLBYWM,1),SIZE(XLBYWM,2),SIZE(XLBYWM,3)))
+  ALLOCATE(XLBXTHS(SIZE(XLBXTHM,1),SIZE(XLBXTHM,2),SIZE(XLBXTHM,3)))
+  ALLOCATE(XLBYTHS(SIZE(XLBYTHM,1),SIZE(XLBYTHM,2),SIZE(XLBYTHM,3)))
+  ALLOCATE(XLBXRS(SIZE(XLBXRM,1),SIZE(XLBXRM,2),SIZE(XLBXRM,3),SIZE(XLBXRM,4)))
+  ALLOCATE(XLBYRS(SIZE(XLBYRM,1),SIZE(XLBYRM,2),SIZE(XLBYRM,3),SIZE(XLBYRM,4)))
+  ALLOCATE(XLBXSVS(SIZE(XLBXSVM,1),SIZE(XLBXSVM,2),SIZE(XLBXSVM,3),SIZE(XLBXSVM,4)))
+  ALLOCATE(XLBYSVS(SIZE(XLBYSVM,1),SIZE(XLBYSVM,2),SIZE(XLBYSVM,3),SIZE(XLBYSVM,4)))
+!
+ELSE
+!
+  ALLOCATE(XLBXTKES(0,0,0))
+  ALLOCATE(XLBYTKES(0,0,0))
+  ALLOCATE(XLBXUS(0,0,0))
+  ALLOCATE(XLBYUS(0,0,0))
+  ALLOCATE(XLBXVS(0,0,0))
+  ALLOCATE(XLBYVS(0,0,0))
+  ALLOCATE(XLBXWS(0,0,0))
+  ALLOCATE(XLBYWS(0,0,0))
+  ALLOCATE(XLBXTHS(0,0,0))
+  ALLOCATE(XLBYTHS(0,0,0))
+  ALLOCATE(XLBXRS(0,0,0,0))
+  ALLOCATE(XLBYRS(0,0,0,0))
+  ALLOCATE(XLBXSVS(0,0,0,0))
+  ALLOCATE(XLBYSVS(0,0,0,0))
+!
+END IF
+!
+!
+!*       3.7   Module MODD_RADIATIONS_n (except XOZON and XAER)
+!
+! Initialization of SW bands
+NSWB_OLD = 6 ! Number of bands in ECMWF original scheme (from Fouquart et Bonnel (1980))
+             ! then modified through INI_RADIATIONS_ECMWF but remains equal to 6 practically
+
+#ifdef MNH_ECRAD
+#if ( VER_ECRAD == 140 )
+NLWB_OLD = 16 ! For XEMIS initialization (should be spectral in the future)
+#endif
+#endif
+
+NLWB_MNH = 16 ! For XEMIS initialization (should be spectral in the future)
+
+IF (CRAD == 'ECRA') THEN
+    NSWB_MNH = 14
+#ifdef MNH_ECRAD
+#if ( VER_ECRAD == 140 )
+    NLWB_MNH = 16
+#endif
+#endif
+ELSE
+    NSWB_MNH = NSWB_OLD
+#ifdef MNH_ECRAD
+#if ( VER_ECRAD == 140 )
+    NLWB_MNH = NLWB_OLD
+#endif
+#endif
+END IF
+
+ALLOCATE(XSW_BANDS (NSWB_MNH))
+ALLOCATE(XLW_BANDS (NLWB_MNH))
+ALLOCATE(XZENITH   (IIU,IJU))
+ALLOCATE(XAZIM     (IIU,IJU))
+ALLOCATE(XALBUV    (IIU,IJU))
+XALBUV(:,:) = NALBUV_DEFAULT !Set to an arbitrary low value (XALBUV is needed in CH_INTERP_JVALUES even if no radiation)
+ALLOCATE(XDIRSRFSWD(IIU,IJU,NSWB_MNH))
+ALLOCATE(XSCAFLASWD(IIU,IJU,NSWB_MNH))
+ALLOCATE(XFLALWD   (IIU,IJU))
+!
+IF (CRAD /= 'NONE') THEN
+  ALLOCATE(XSLOPANG(IIU,IJU))
+  ALLOCATE(XSLOPAZI(IIU,IJU))
+  ALLOCATE(XDTHRAD(IIU,IJU,IKU))
+  ALLOCATE(XDIRFLASWD(IIU,IJU,NSWB_MNH))
+  ALLOCATE(XDIR_ALB(IIU,IJU,NSWB_MNH))
+  ALLOCATE(XSCA_ALB(IIU,IJU,NSWB_MNH))
+  ALLOCATE(XEMIS  (IIU,IJU,NLWB_MNH))
+  ALLOCATE(XTSRAD (IIU,IJU))    ; XTSRAD = XUNDEF_SFX
+  ALLOCATE(XSEA (IIU,IJU))
+  ALLOCATE(XZS_XY (IIU,IJU))
+  ALLOCATE(NCLEARCOL_TM1(IIU,IJU))
+  ALLOCATE(XSWU(IIU,IJU,IKU))
+  ALLOCATE(XSWD(IIU,IJU,IKU))
+  ALLOCATE(XLWU(IIU,IJU,IKU))
+  ALLOCATE(XLWD(IIU,IJU,IKU))
+  ALLOCATE(XDTHRADSW(IIU,IJU,IKU))
+  ALLOCATE(XDTHRADLW(IIU,IJU,IKU))
+  ALLOCATE(XRADEFF(IIU,IJU,IKU))
+ELSE
+  ALLOCATE(XSLOPANG(0,0))
+  ALLOCATE(XSLOPAZI(0,0))
+  ALLOCATE(XDTHRAD(0,0,0))
+  ALLOCATE(XDIRFLASWD(0,0,0))
+  ALLOCATE(XDIR_ALB(0,0,0))
+  ALLOCATE(XSCA_ALB(0,0,0))
+  ALLOCATE(XEMIS  (0,0,0))
+  ALLOCATE(XTSRAD (0,0))
+  ALLOCATE(XSEA (0,0))
+  ALLOCATE(XZS_XY (0,0))
+  ALLOCATE(NCLEARCOL_TM1(0,0))
+  ALLOCATE(XSWU(0,0,0))
+  ALLOCATE(XSWD(0,0,0))
+  ALLOCATE(XLWU(0,0,0))
+  ALLOCATE(XLWD(0,0,0))
+  ALLOCATE(XDTHRADSW(0,0,0))
+  ALLOCATE(XDTHRADLW(0,0,0))
+  ALLOCATE(XRADEFF(0,0,0))
+END IF
+
+IF (CRAD == 'ECMW' .OR. CRAD == 'ECRA') THEN
+  ALLOCATE(XSTROATM(31,6))
+  ALLOCATE(XSMLSATM(31,6))
+  ALLOCATE(XSMLWATM(31,6))
+  ALLOCATE(XSPOSATM(31,6))
+  ALLOCATE(XSPOWATM(31,6))
+  ALLOCATE(XSTATM(31,6))
+ELSE
+  ALLOCATE(XSTROATM(0,0))
+  ALLOCATE(XSMLSATM(0,0))
+  ALLOCATE(XSMLWATM(0,0))
+  ALLOCATE(XSPOSATM(0,0))
+  ALLOCATE(XSPOWATM(0,0))
+  ALLOCATE(XSTATM(0,0))
+END IF
+!
+!*       3.8   Module MODD_DEEP_CONVECTION_n
+!
+IF (CDCONV /= 'NONE' .OR. CSCONV == 'KAFR') THEN
+  ALLOCATE(NCOUNTCONV(IIU,IJU))
+  ALLOCATE(XDTHCONV(IIU,IJU,IKU))
+  ALLOCATE(XDRVCONV(IIU,IJU,IKU))
+  ALLOCATE(XDRCCONV(IIU,IJU,IKU))
+  ALLOCATE(XDRICONV(IIU,IJU,IKU))
+  ALLOCATE(XPRCONV(IIU,IJU))
+  ALLOCATE(XPACCONV(IIU,IJU))
+  ALLOCATE(XPRSCONV(IIU,IJU))
+  ! diagnostics
+  IF (LCH_CONV_LINOX) THEN
+    ALLOCATE(XIC_RATE(IIU,IJU))
+    ALLOCATE(XCG_RATE(IIU,IJU))
+    ALLOCATE(XIC_TOTAL_NUMBER(IIU,IJU))
+    ALLOCATE(XCG_TOTAL_NUMBER(IIU,IJU))
+  ELSE
+    ALLOCATE(XIC_RATE(0,0))
+    ALLOCATE(XCG_RATE(0,0))
+    ALLOCATE(XIC_TOTAL_NUMBER(0,0))
+    ALLOCATE(XCG_TOTAL_NUMBER(0,0))
+  END IF
+  IF ( LDIAGCONV )  THEN
+    ALLOCATE(XUMFCONV(IIU,IJU,IKU))
+    ALLOCATE(XDMFCONV(IIU,IJU,IKU))
+    ALLOCATE(XPRLFLXCONV(IIU,IJU,IKU))
+    ALLOCATE(XPRSFLXCONV(IIU,IJU,IKU))
+    ALLOCATE(XCAPE(IIU,IJU))
+    ALLOCATE(NCLTOPCONV(IIU,IJU))
+    ALLOCATE(NCLBASCONV(IIU,IJU))
+  ELSE
+    ALLOCATE(XUMFCONV(0,0,0))
+    ALLOCATE(XDMFCONV(0,0,0))
+    ALLOCATE(XPRLFLXCONV(0,0,0))
+    ALLOCATE(XPRSFLXCONV(0,0,0))
+    ALLOCATE(XCAPE(0,0))
+    ALLOCATE(NCLTOPCONV(0,0))
+    ALLOCATE(NCLBASCONV(0,0))
+  END IF
+ELSE
+  ALLOCATE(NCOUNTCONV(0,0))
+  ALLOCATE(XDTHCONV(0,0,0))
+  ALLOCATE(XDRVCONV(0,0,0))
+  ALLOCATE(XDRCCONV(0,0,0))
+  ALLOCATE(XDRICONV(0,0,0))
+  ALLOCATE(XPRCONV(0,0))
+  ALLOCATE(XPACCONV(0,0))
+  ALLOCATE(XPRSCONV(0,0))
+  ALLOCATE(XIC_RATE(0,0))
+  ALLOCATE(XCG_RATE(0,0))
+  ALLOCATE(XIC_TOTAL_NUMBER(0,0))
+  ALLOCATE(XCG_TOTAL_NUMBER(0,0))
+  ALLOCATE(XUMFCONV(0,0,0))
+  ALLOCATE(XDMFCONV(0,0,0))
+  ALLOCATE(XPRLFLXCONV(0,0,0))
+  ALLOCATE(XPRSFLXCONV(0,0,0))
+  ALLOCATE(XCAPE(0,0))
+  ALLOCATE(NCLTOPCONV(0,0))
+  ALLOCATE(NCLBASCONV(0,0))
+END IF
+!
+IF ((CDCONV == 'KAFR' .OR. CSCONV == 'KAFR') &
+    .AND. LSUBG_COND .AND. LSIG_CONV) THEN
+  ALLOCATE(XMFCONV(IIU,IJU,IKU))
+ELSE
+  ALLOCATE(XMFCONV(0,0,0))
+ENDIF
+!
+IF ((CDCONV == 'KAFR' .OR. CSCONV == 'KAFR') &
+    .AND. LCHTRANS .AND. NSV > 0 ) THEN
+  ALLOCATE(XDSVCONV(IIU,IJU,IKU,NSV))
+ELSE
+  ALLOCATE(XDSVCONV(0,0,0,0))
+END IF
+!
+ALLOCATE(XCF_MF(IIU,IJU,IKU)) ; XCF_MF=0.0
+ALLOCATE(XRC_MF(IIU,IJU,IKU)) ; XRC_MF=0.0
+ALLOCATE(XRI_MF(IIU,IJU,IKU)) ; XRI_MF=0.0
+!
+!*       3.9   Local variables
+!
+ALLOCATE(ZJ(IIU,IJU,IKU))
+!
+!*      3.10 Forcing variables (Module MODD_FRC and MODD_FRCn)
+!
+IF ( LFORCING ) THEN
+  ALLOCATE(XWTFRC(IIU,IJU,IKU)) ; XWTFRC = XUNDEF
+  ALLOCATE(XUFRC_PAST(IIU,IJU,IKU)) ; XUFRC_PAST = XUNDEF
+  ALLOCATE(XVFRC_PAST(IIU,IJU,IKU)) ; XVFRC_PAST = XUNDEF
+ELSE
+  ALLOCATE(XWTFRC(0,0,0))
+  ALLOCATE(XUFRC_PAST(0,0,0))
+  ALLOCATE(XVFRC_PAST(0,0,0))
+END IF
+!
+IF (KMI == 1) THEN
+  IF ( LFORCING ) THEN
+    ALLOCATE(TDTFRC(NFRC))
+    ALLOCATE(XUFRC(IKU,NFRC))
+    ALLOCATE(XVFRC(IKU,NFRC))
+    ALLOCATE(XWFRC(IKU,NFRC))
+    ALLOCATE(XTHFRC(IKU,NFRC))
+    ALLOCATE(XRVFRC(IKU,NFRC))
+    ALLOCATE(XTENDTHFRC(IKU,NFRC))
+    ALLOCATE(XTENDRVFRC(IKU,NFRC))
+    ALLOCATE(XGXTHFRC(IKU,NFRC))
+    ALLOCATE(XGYTHFRC(IKU,NFRC))
+    ALLOCATE(XPGROUNDFRC(NFRC))
+    ALLOCATE(XTENDUFRC(IKU,NFRC))
+    ALLOCATE(XTENDVFRC(IKU,NFRC))
+  ELSE
+    ALLOCATE(TDTFRC(0))
+    ALLOCATE(XUFRC(0,0))
+    ALLOCATE(XVFRC(0,0))
+    ALLOCATE(XWFRC(0,0))
+    ALLOCATE(XTHFRC(0,0))
+    ALLOCATE(XRVFRC(0,0))
+    ALLOCATE(XTENDTHFRC(0,0))
+    ALLOCATE(XTENDRVFRC(0,0))
+    ALLOCATE(XGXTHFRC(0,0))
+    ALLOCATE(XGYTHFRC(0,0))
+    ALLOCATE(XPGROUNDFRC(0))
+    ALLOCATE(XTENDUFRC(0,0))
+    ALLOCATE(XTENDVFRC(0,0))
+  END IF
+ELSE
+  !Do not allocate because they are the same on all grids (not 'n' variables)
+END IF
+! ----------------------------------------------------------------------
+!
+IF (L2D_ADV_FRC) THEN
+  WRITE(ILUOUT,*) 'L2D_ADV_FRC IS SET TO', L2D_ADV_FRC
+  WRITE(ILUOUT,*) 'ADV FRC WILL BE SET'
+  ALLOCATE(TDTADVFRC(NADVFRC))
+  ALLOCATE(XDTHFRC(IIU,IJU,IKU,NADVFRC))  ; XDTHFRC=0.
+  ALLOCATE(XDRVFRC(IIU,IJU,IKU,NADVFRC))  ; XDRVFRC=0.
+ELSE
+  ALLOCATE(TDTADVFRC(0))
+  ALLOCATE(XDTHFRC(0,0,0,0))
+  ALLOCATE(XDRVFRC(0,0,0,0))
+ENDIF
+
+IF (L2D_REL_FRC) THEN
+  WRITE(ILUOUT,*) 'L2D_REL_FRC IS SET TO', L2D_REL_FRC
+  WRITE(ILUOUT,*) 'REL FRC WILL BE SET'
+  ALLOCATE(TDTRELFRC(NRELFRC))
+  ALLOCATE(XTHREL(IIU,IJU,IKU,NRELFRC))  ; XTHREL=0.
+  ALLOCATE(XRVREL(IIU,IJU,IKU,NRELFRC))  ; XRVREL=0.
+ELSE
+  ALLOCATE(TDTRELFRC(0))
+  ALLOCATE(XTHREL(0,0,0,0))
+  ALLOCATE(XRVREL(0,0,0,0))
+ENDIF
+!
+!*      4.11 BIS: Eddy fluxes allocation
+!
+IF ( LTH_FLX ) THEN
+  ALLOCATE(XVTH_FLUX_M(IIU,IJU,IKU)) ; XVTH_FLUX_M = 0.
+  ALLOCATE(XWTH_FLUX_M(IIU,IJU,IKU)) ; XWTH_FLUX_M = 0.
+  IF (KMI /= 1) THEN
+    ALLOCATE(XRTHS_EDDY_FLUX(IIU,IJU,IKU))
+    XRTHS_EDDY_FLUX = 0.
+  ELSE
+    ALLOCATE(XRTHS_EDDY_FLUX(0,0,0))
+  ENDIF
+ELSE
+  ALLOCATE(XVTH_FLUX_M(0,0,0))
+  ALLOCATE(XWTH_FLUX_M(0,0,0))
+  ALLOCATE(XRTHS_EDDY_FLUX(0,0,0))
+END IF
+!
+IF ( LUV_FLX) THEN
+  ALLOCATE(XVU_FLUX_M(IIU,IJU,IKU)) ; XVU_FLUX_M  = 0.
+  IF (KMI /= 1) THEN
+    ALLOCATE(XRVS_EDDY_FLUX(IIU,IJU,IKU))
+    XRVS_EDDY_FLUX = 0.
+  ELSE
+    ALLOCATE(XRVS_EDDY_FLUX(0,0,0))
+  ENDIF
+ELSE
+  ALLOCATE(XVU_FLUX_M(0,0,0))
+  ALLOCATE(XRVS_EDDY_FLUX(0,0,0))
+END IF
+!
+!*      3.11   Module MODD_ICE_CONC_n
+!
+IF (     (CCLOUD == 'ICE3'.OR.CCLOUD == 'ICE4') .AND.   &
+     (CPROGRAM == 'DIAG  '.OR.CPROGRAM == 'MESONH')) THEN
+  ALLOCATE(XCIT(IIU,IJU,IKU))
+ELSE
+  ALLOCATE(XCIT(0,0,0))
+END IF
+!
+IF ( CCLOUD == 'KHKO' .OR. CCLOUD == 'C2R2') THEN
+   ALLOCATE(XSUPSAT(IIU,IJU,IKU))
+   ALLOCATE(XNACT(IIU,IJU,IKU))
+   ALLOCATE(XNPRO(IIU,IJU,IKU))
+   ALLOCATE(XSSPRO(IIU,IJU,IKU))
+ELSE
+   ALLOCATE(XSUPSAT(0,0,0))
+   ALLOCATE(XNACT(0,0,0))
+   ALLOCATE(XNPRO(0,0,0))
+   ALLOCATE(XSSPRO(0,0,0))
+END IF
+!
+!*      3.12   Module MODD_TURB_CLOUD
+!
+IF (LCLOUDMODIFLM) THEN
+  ALLOCATE(XCEI(IIU,IJU,IKU))
+ELSE
+  ALLOCATE(XCEI(0,0,0))
+ENDIF
+!
+!*      3.13  Module MODD_CH_PH_n
+!
+IF (LUSECHAQ.AND.(CPROGRAM == 'DIAG  '.OR.CPROGRAM == 'MESONH')) THEN
+  IF (LCH_PH) THEN
+    ALLOCATE(XPHC(IIU,IJU,IKU))
+    IF (NRRL==2) THEN
+      ALLOCATE(XPHR(IIU,IJU,IKU))
+      ALLOCATE(XACPHR(IIU,IJU))
+      XACPHR(:,:) =  0.
+    ENDIF
+  ENDIF
+  IF (NRRL==2) THEN
+    ALLOCATE(XACPRAQ(IIU,IJU,NSV_CHAC/2))
+    XACPRAQ(:,:,:) = 0.
+  ENDIF
+ENDIF
+IF (.NOT.(ASSOCIATED(XPHC))) ALLOCATE(XPHC(0,0,0))
+IF (.NOT.(ASSOCIATED(XPHR))) ALLOCATE(XPHR(0,0,0))
+IF (.NOT.(ASSOCIATED(XACPHR))) ALLOCATE(XACPHR(0,0))
+IF (.NOT.(ASSOCIATED(XACPRAQ))) ALLOCATE(XACPRAQ(0,0,0))
+IF ((LUSECHEM).AND.(CPROGRAM == 'DIAG  ')) THEN
+  ALLOCATE(XCHFLX(IIU,IJU,NSV_CHEM))
+  XCHFLX(:,:,:) = 0.
+ELSE
+  ALLOCATE(XCHFLX(0,0,0))
+END IF
+!
+!*          3.14 Module MODD_DRAG
+!
+IF (LDRAG) THEN
+  ALLOCATE(XDRAG(IIU,IJU))
+ELSE
+  ALLOCATE(XDRAG(0,0))
+ENDIF
+!
+!-------------------------------------------------------------------------------
+!
+!*       4.    INITIALIZE BUDGET VARIABLES
+!              ---------------------------
+!
+gles = lles_mean .or. lles_resolved  .or. lles_subgrid .or. lles_updraft &
+                 .or. lles_downdraft .or. lles_spectra
+!Called if budgets are enabled via NAM_BUDGET
+!or if LES budgets are enabled via NAM_LES (condition on kmi==1 to call it max once)
+if ( ( cbutype /= "NONE" .and. nbumod == kmi ) .or. ( ( gles .or. lcheck ) .and. kmi == 1 ) ) THEN
+  call Budget_preallocate()
+end if
+CALL TBUCONF_ASSOCIATE()
+IF ( CBUTYPE /= "NONE" .AND. NBUMOD == KMI ) THEN
+  CALL Ini_budget(ILUOUT,XTSTEP,NSV,NRR,                                      &
+             LNUMDIFU,LNUMDIFTH,LNUMDIFSV,                                    &
+             LHORELAX_UVWTH,LHORELAX_RV, LHORELAX_RC,LHORELAX_RR,             &
+             LHORELAX_RI,LHORELAX_RS,LHORELAX_RG, LHORELAX_RH,LHORELAX_TKE,   &
+             LHORELAX_SV, LVE_RELAX, LVE_RELAX_GRD,                           &
+             LCHTRANS,LNUDGING,LDRAGTREE,LDEPOTREE,LDRAGBLDG,LMAIN_EOL,       &
+             CRAD,CDCONV,CSCONV,CTURB,CTURBDIM,CCLOUD                         )
+END IF
+!
+!-------------------------------------------------------------------------------
+!
+!
+!*       5.    INITIALIZE INTERPOLATION COEFFICIENTS
+!
+CALL INI_BIKHARDT_n (NDXRATIO_ALL(KMI),NDYRATIO_ALL(KMI),KMI)
+!
+!-------------------------------------------------------------------------------
+!
+!*       6.     BUILT THE GENERIC OUTPUT NAME
+!               ----------------------------
+!
+IF (KMI == 1) THEN
+  DO IMI = 1 , NMODEL
+    WRITE(IO_SURF_MNH_MODEL(IMI)%COUTFILE,'(A,".",I1,".",A)') CEXP,IMI,TRIM(ADJUSTL(CSEG))
+    WRITE(YNAME, '(A,".",I1,".",A)') CEXP,IMI,TRIM(ADJUSTL(CSEG))//'.000'
+    CALL IO_File_add2list(LUNIT_MODEL(IMI)%TDIAFILE,YNAME,'MNHDIACHRONIC','WRITE', &
+                          HDIRNAME=CIO_DIR,                                        &
+                          KLFINPRAR=INT(50,KIND=LFIINT),KLFITYPE=1,KLFIVERB=NVERB, &
+                          TPDADFILE=LUNIT_MODEL(NDAD(IMI))%TDIAFILE )
+  END DO
+  !
+  TDIAFILE => LUNIT_MODEL(KMI)%TDIAFILE !Necessary because no call to GOTO_MODEL before needing it
+  !
+  IF (CPROGRAM=='MESONH') THEN
+    IF ( NDAD(KMI) == 1)  CDAD_NAME(KMI) = CEXP//'.1.'//CSEG
+    IF ( NDAD(KMI) == 2)  CDAD_NAME(KMI) = CEXP//'.2.'//CSEG
+    IF ( NDAD(KMI) == 3)  CDAD_NAME(KMI) = CEXP//'.3.'//CSEG
+    IF ( NDAD(KMI) == 4)  CDAD_NAME(KMI) = CEXP//'.4.'//CSEG
+    IF ( NDAD(KMI) == 5)  CDAD_NAME(KMI) = CEXP//'.5.'//CSEG
+    IF ( NDAD(KMI) == 6)  CDAD_NAME(KMI) = CEXP//'.6.'//CSEG
+    IF ( NDAD(KMI) == 7)  CDAD_NAME(KMI) = CEXP//'.7.'//CSEG
+    IF ( NDAD(KMI) == 8)  CDAD_NAME(KMI) = CEXP//'.8.'//CSEG
+  END IF
+END IF
+!
+!-------------------------------------------------------------------------------
+!
+!*       7.    INITIALIZE GRIDS AND METRIC COEFFICIENTS
+!              ----------------------------------------
+!
+CALL SET_GRID( KMI, TPINIFILE, IKU, NIMAX_ll, NJMAX_ll,                        &
+               XTSTEP, XSEGLEN,                                                &
+               XLONORI, XLATORI, XLON, XLAT,                                   &
+               XXHAT, XYHAT, XDXHAT, XDYHAT, XXHATM, XYHATM,                   &
+               XXHAT_ll, XYHAT_ll, XXHATM_ll, XYHATM_ll,                       &
+               XHAT_BOUND, XHATM_BOUND,                                        &
+               XMAP, XZS, XZZ, XZHAT, XZHATM, XZTOP, LSLEVE,                   &
+               XLEN1, XLEN2, XZSMT, ZJ,                                        &
+               TDTMOD, TDTCUR, NSTOP, NBAK_NUMB, NOUT_NUMB, TBACKUPN, TOUTPUTN )
+!
+CALL METRICS(XMAP,XDXHAT,XDYHAT,XZZ,XDXX,XDYY,XDZX,XDZY,XDZZ)
+!
+!* update halos of metric coefficients
+!
+!
+CALL UPDATE_METRICS(CLBCX,CLBCY,XDXX,XDYY,XDZX,XDZY,XDZZ)
+!
+!
+CALL SET_DIRCOS(CLBCX,CLBCY,XDXX,XDYY,XDZX,XDZY,TZINITHALO2D_ll,   &
+                XDIRCOSXW,XDIRCOSYW,XDIRCOSZW,XCOSSLOPE,XSINSLOPE  )
+!
+! grid nesting initializations
+IF ( KMI == 1 ) THEN
+  XTSTEP_MODEL1=XTSTEP
+END IF
+!
+NDT_2_WAY(KMI)=4
+!
+!-------------------------------------------------------------------------------
+!
+!*      8.    INITIALIZE DATA FOR JVALUES AND AEROSOLS
+!
+IF ( LUSECHEM .OR. LCHEMDIAG ) THEN
+  IF ((KMI==1).AND.(CPROGRAM == "MESONH".OR.CPROGRAM == "DIAG  "))  &
+    CALL CH_INIT_JVALUES(TDTCUR%nday, TDTCUR%nmonth,      &
+                         TDTCUR%nyear, ILUOUT, XCH_TUV_DOBNEW)
+!
+  IF (LORILAM) THEN
+    CALL CH_AER_MOD_INIT
+  ENDIF
+END IF
+IF (.NOT.(ASSOCIATED(XMI))) ALLOCATE(XMI(0,0,0,0))
+IF (.NOT.(ASSOCIATED(XSOLORG))) ALLOCATE(XSOLORG(0,0,0,0))
+!
+IF (CCLOUD=='LIMA') CALL INIT_AEROSOL_PROPERTIES
+!
+!
+!
+!
+!-------------------------------------------------------------------------------
+!
+!*      9.    FIRE initializations
+!              --------------------
+!
+IF(LBLAZE) THEN
+  !
+  !     9.1 Array allocation
+  !         ----------------
+  !
+  ! Level Set function
+  ALLOCATE(XLSPHI(IIU,IJU,NREFINX*NREFINY));      XLSPHI(:,:,:) = 0.
+
+  ! BMap array
+  ! BMap default value
+  ! -1 = The fire is not here yet
+  ALLOCATE(XBMAP(IIU,IJU,NREFINX*NREFINY));       XBMAP(:,:,:) = -1.
+
+  ! A array
+  ALLOCATE(XFMRFA(IIU,IJU,NREFINX*NREFINY));      XFMRFA(:,:,:) = 0.
+
+  ! Wf0 array
+  ALLOCATE(XFMWF0(IIU,IJU,NREFINX*NREFINY));      XFMWF0(:,:,:) = 0.
+
+  ! R0 array
+  ALLOCATE(XFMR0(IIU,IJU,NREFINX*NREFINY));       XFMR0(:,:,:) = 0.
+
+  ! r00 array
+  ALLOCATE(XFMR00(IIU,IJU,NREFINX*NREFINY));      XFMR00(:,:,:) = 0.
+
+  ! Ignition
+  ! Default value as 1E6 : Ignition long after simulation end time
+  ! 1E6 should be enough as it is more than 11 days
+  ALLOCATE(XFMIGNITION(IIU,IJU,NREFINX*NREFINY)); XFMIGNITION(:,:,:) = 1.E6
+
+  ! Fuel type
+  ALLOCATE(XFMFUELTYPE(IIU,IJU,NREFINX*NREFINY)); XFMFUELTYPE(:,:,:) = 0.
+
+  ! Residence time function
+  ALLOCATE(XFIRETAU(IIU,IJU,NREFINX*NREFINY));    XFIRETAU(:,:,:) = 0.
+
+  ! Rate of spread with wind
+  ALLOCATE(XFIRERW(IIU,IJU,NREFINX*NREFINY));    XFIRERW(:,:,:) = 0.
+
+  ! Sensible heat flux parameters
+  ! get number of parameters
+  SELECT CASE(CHEAT_FLUX_MODEL)
+  CASE('CST')
+    ! 1 parameter for model : nominal injection value
+    INBPARAMSENSIBLE = 1
+
+  CASE('EXP')
+    ! 2 parameters for model : Max value and characteristic time
+    INBPARAMSENSIBLE = 2
+
+  CASE('EXS')
+    ! 3 parameters for model : Max value and characteristic time, smoldering injection value
+    INBPARAMSENSIBLE = 3
+  END SELECT
+
+  ALLOCATE(XFLUXPARAMH(IIU,IJU,NREFINX*NREFINY,INBPARAMSENSIBLE));
+  XFLUXPARAMH(:,:,:,:) = 0.
+
+  ! Latent heat flux parameters
+  ! get number of parameters
+  SELECT CASE(CLATENT_FLUX_MODEL)
+  CASE('CST')
+    ! 1 parameter for model : nominal injection value
+    INBPARAMLATENT = 1
+    
+  CASE('EXP')
+    ! 2 parameters for model : Max value and characteristic time
+    INBPARAMLATENT = 2
+  END SELECT
+
+  ALLOCATE(XFLUXPARAMW(IIU,IJU,NREFINX*NREFINY,INBPARAMLATENT));
+  XFLUXPARAMW(:,:,:,:) = 0.
+
+  ! Available Sensible energy
+  ALLOCATE(XFMASE(IIU,IJU,NREFINX*NREFINY)); XFMASE(:,:,:) = 0.
+
+  ! Available Latent energy
+  ALLOCATE(XFMAWC(IIU,IJU,NREFINX*NREFINY)); XFMAWC(:,:,:) = 0.
+
+  ! Walking Ignition map (Arrival time matrix for ignition)
+  ALLOCATE(XFMWALKIG(IIU,IJU,NREFINX*NREFINY)); XFMWALKIG(:,:,:) = -1.
+
+  ! Sensible heat flux (W/m2)
+  ALLOCATE(XFMFLUXHDH(IIU,IJU,NREFINX*NREFINY)); XFMFLUXHDH(:,:,:) = 0.
+
+  ! Latent heat flux (kg/s/m2)
+  ALLOCATE(XFMFLUXHDW(IIU,IJU,NREFINX*NREFINY)); XFMFLUXHDW(:,:,:) = 0.
+
+  ! filtered wind on front normal (m/s)
+  ALLOCATE(XFMHWS(IIU,IJU,NREFINX*NREFINY)); XFMHWS(:,:,:) = 0.
+
+  ! filtered wind U (m/s)
+  ALLOCATE(XFMWINDU(IIU,IJU,NREFINX*NREFINY)); XFMWINDU(:,:,:) = 0.
+
+  ! filtered wind V (m/s)
+  ALLOCATE(XFMWINDV(IIU,IJU,NREFINX*NREFINY)); XFMWINDV(:,:,:) = 0.
+
+  ! filtered wind W (m/s)
+  ALLOCATE(XFMWINDW(IIU,IJU,NREFINX*NREFINY)); XFMWINDW(:,:,:) = 0.
+
+  ! Gradient of Level Set on x
+  ALLOCATE(XGRADLSPHIX(IIU,IJU,NREFINX*NREFINY)); XGRADLSPHIX(:,:,:) = 0.
+
+  ! Gradient of Level Set on y
+  ALLOCATE(XGRADLSPHIY(IIU,IJU,NREFINX*NREFINY)); XGRADLSPHIY(:,:,:) = 0.
+
+  ! Wind for fire
+  ALLOCATE(XFIREWIND(IIU,IJU,NREFINX*NREFINY)); XFIREWIND(:,:,:) = 0.
+
+  ! Orographic gradient on fire mesh
+  ALLOCATE(XFMGRADOROX(IIU,IJU,NREFINX*NREFINY));      XFMGRADOROX(:,:,:) = 0.
+  ALLOCATE(XFMGRADOROY(IIU,IJU,NREFINX*NREFINY));      XFMGRADOROY(:,:,:) = 0.
+  !
+  !     9.2 Array 2d fire mesh allocation
+  !         -----------------------------
+  !
+  ! Level Set 2d
+  ALLOCATE(XLSPHI2D(IIU*NREFINX,IJU*NREFINY)); XLSPHI2D(:,:) = 0.
+  ! Gradient of Level Set on x 2d
+  ALLOCATE(XGRADLSPHIX2D(IIU*NREFINX,IJU*NREFINY)); XGRADLSPHIX2D(:,:) = 0.
+
+  ! Gradient of Level Set on y 2d
+  ALLOCATE(XGRADLSPHIY2D(IIU*NREFINX,IJU*NREFINY)); XGRADLSPHIY2D(:,:) = 0.
+
+  ! Level Set mask on x 2d
+  ALLOCATE(XGRADMASKX(IIU*NREFINX,IJU*NREFINY)); XGRADMASKX(:,:) = 0.
+
+  ! Level Set mask on y 2d
+  ALLOCATE(XGRADMASKY(IIU*NREFINX,IJU*NREFINY)); XGRADMASKY(:,:) = 0.
+
+  ! burnt surface ratio 2d
+  ALLOCATE(XSURFRATIO2D(IIU*NREFINX,IJU*NREFINY)); XSURFRATIO2D(:,:) = 0.
+
+  ! Level Set diffusuon x 2d
+  ALLOCATE(XLSDIFFUX2D(IIU*NREFINX,IJU*NREFINY)); XLSDIFFUX2D(:,:) = 0.
+
+  ! Level Set diffusion y 2d
+  ALLOCATE(XLSDIFFUY2D(IIU*NREFINX,IJU*NREFINY)); XLSDIFFUY2D(:,:) = 0.
+
+  ! ROS diffusion 2d
+  ALLOCATE(XFIRERW2D(IIU*NREFINX,IJU*NREFINY)); XFIRERW2D(:,:) = 0.
+  !
+  !     9.3 Compute fire mesh size
+  !         ----------------------
+  !
+  XFIREMESHSIZE(1) = (XXHAT(2) - XXHAT(1)) / REAL(NREFINX)
+  XFIREMESHSIZE(2) = (XYHAT(2) - XYHAT(1)) / REAL(NREFINY)
+  !
+ELSE
+  !
+  !     9.4 Default allocation
+  !          ------------------
+  !
+  ! 3d array
+  ALLOCATE(XLSPHI(0,0,0))
+  ALLOCATE(XBMAP(0,0,0))
+  ALLOCATE(XFMRFA(0,0,0))
+  ALLOCATE(XFMR0(0,0,0))
+  ALLOCATE(XFMWF0(0,0,0))
+  ALLOCATE(XFMR00(0,0,0))
+  ALLOCATE(XFMIGNITION(0,0,0))
+  ALLOCATE(XFMFUELTYPE(0,0,0))
+  ALLOCATE(XFIRETAU(0,0,0))
+  ALLOCATE(XFIRERW(0,0,0))
+  ALLOCATE(XFLUXPARAMH(0,0,0,0))
+  ALLOCATE(XFLUXPARAMW(0,0,0,0))
+  ALLOCATE(XFMASE(0,0,0))
+  ALLOCATE(XFMAWC(0,0,0))
+  ALLOCATE(XFMWALKIG(0,0,0))
+  ALLOCATE(XFMFLUXHDH(0,0,0))
+  ALLOCATE(XFMFLUXHDW(0,0,0))
+  ALLOCATE(XFMHWS(0,0,0))
+  ALLOCATE(XFMWINDU(0,0,0))
+  ALLOCATE(XFMWINDV(0,0,0))
+  ALLOCATE(XFMWINDW(0,0,0))
+  ALLOCATE(XGRADLSPHIX(0,0,0))
+  ALLOCATE(XGRADLSPHIY(0,0,0))
+  ALLOCATE(XFIREWIND(0,0,0))
+  ALLOCATE(XFMGRADOROX(0,0,0))
+  ALLOCATE(XFMGRADOROY(0,0,0))
+  ! 2d array
+  ALLOCATE(XLSPHI2D(0,0))
+  ALLOCATE(XGRADLSPHIX2D(0,0))
+  ALLOCATE(XGRADLSPHIY2D(0,0))
+  ALLOCATE(XGRADMASKX(0,0))
+  ALLOCATE(XGRADMASKY(0,0))
+  ALLOCATE(XSURFRATIO2D(0,0))
+  ALLOCATE(XLSDIFFUX2D(0,0))
+  ALLOCATE(XLSDIFFUY2D(0,0))
+  ALLOCATE(XFIRERW2D(0,0))
+END IF
+!
+!
+!-------------------------------------------------------------------------------
+!
+!*       9.    INITIALIZE THE PROGNOSTIC FIELDS
+!              --------------------------------
+!
+CALL MPPDB_CHECK3D(XUT,"INI_MODEL_N-before read_field::XUT",PRECISION)
+CALL READ_FIELD(KMI,TPINIFILE,IIU,IJU,IKU,                                    &
+                CGETTKET,CGETRVT,CGETRCT,CGETRRT,CGETRIT,CGETCIT,CGETZWS,     &
+                CGETRST,CGETRGT,CGETRHT,CGETSVT,CGETSRCT,CGETSIGS,CGETCLDFR,  &
+                CGETICEFR, CGETBL_DEPTH,CGETSBL_DEPTH,CGETPHC,CGETPHR,        &
+                CUVW_ADV_SCHEME, CTEMP_SCHEME,                                &
+                NSIZELBX_ll, NSIZELBXU_ll, NSIZELBY_ll, NSIZELBYV_ll,         &
+                NSIZELBXTKE_ll,NSIZELBYTKE_ll,                                &
+                NSIZELBXR_ll,NSIZELBYR_ll,NSIZELBXSV_ll,NSIZELBYSV_ll,        &
+                XUM,XVM,XWM,XDUM,XDVM,XDWM,                                   &
+                XUT,XVT,XWT,XTHT,XPABST,XTKET,XRTKEMS,                        &
+                XRT,XSVT,XZWS,XCIT,XDRYMASST,XDRYMASSS,                       &
+                XSIGS,XSRCT,XCLDFR,XICEFR, XBL_DEPTH,XSBL_DEPTH,XWTHVMF,      &
+                XPHC,XPHR, XLSUM,XLSVM,XLSWM,XLSTHM,XLSRVM,XLSZWSM,           &
+                XLBXUM,XLBXVM,XLBXWM,XLBXTHM,XLBXTKEM,                        &
+                XLBXRM,XLBXSVM,                                               &
+                XLBYUM,XLBYVM,XLBYWM,XLBYTHM,XLBYTKEM,                        &
+                XLBYRM,XLBYSVM,                                               &
+                NFRC,TDTFRC,XUFRC,XVFRC,XWFRC,XTHFRC,XRVFRC,                  &
+                XTENDTHFRC,XTENDRVFRC,XGXTHFRC,XGYTHFRC,                      &
+                XPGROUNDFRC, XATC,                                            &
+                XTENDUFRC, XTENDVFRC,                                         &
+                NADVFRC,TDTADVFRC,XDTHFRC,XDRVFRC,                            &
+                NRELFRC,TDTRELFRC,XTHREL,XRVREL,                              &
+                XVTH_FLUX_M,XWTH_FLUX_M,XVU_FLUX_M,                           &
+                XRUS_PRES,XRVS_PRES,XRWS_PRES,XRTHS_CLD,XRRS_CLD,XRSVS_CLD,   &
+                ZIBM_LS,XIBM_XMUT,XUMEANW,XVMEANW,XWMEANW,XUMEANN,XVMEANN,    &
+                XWMEANN,XUMEANE,XVMEANE,XWMEANE,XUMEANS,XVMEANS,XWMEANS,      &
+                XLSPHI, XBMAP, XFMASE, XFMAWC, XFMWINDU, XFMWINDV, XFMWINDW, XFMHWS )
+
+!
+!-------------------------------------------------------------------------------
+!
+!
+!*        10.  INITIALIZE REFERENCE STATE
+!              ---------------------------
+!
+!
+CALL SET_REF( KMI, TPINIFILE,                            &
+              XZZ, XZHATM, ZJ, XDXX, XDYY, CLBCX, CLBCY, &
+              XREFMASS, XMASS_O_PHI0, XLINMASS,          &
+              XRHODREF, XTHVREF, XRVREF, XEXNREF, XRHODJ )
+!
+!-------------------------------------------------------------------------------
+!
+!*       10.1    INITIALIZE THE TURBULENCE VARIABLES
+!               -----------------------------------
+!
+IF(LSTATNW) THEN
+  CALL PRINT_MSG(NVERB_FATAL,'GEN','INI_MODEL_n','LSTATNW option not tested in Meso-NH')
+ENDIF
+CALL INI_TURB(CPROGRAM)
+IF ((CTURB == 'TKEL').AND.(CCONF=='START')) THEN
+  CALL MPPDB_CHECK3D(XUT,"INI_MODEL_N-before ini_tke_eps::XUT",PRECISION)
+  CALL INI_TKE_EPS(CGETTKET,XTHVREF,XZZ, &
+                   XUT,XVT,XTHT,                  &
+                   XTKET,TZINITHALO3D_ll    )
+  CALL MPPDB_CHECK3D(XUT,"INI_MODEL_N-after ini_tke_eps::XUT",PRECISION)
+END IF
+!
+!
+!*       10.2   INITIALIZE THE LES VARIABLES
+!               ----------------------------
+!
+CALL INI_LES_n
+!
+!-------------------------------------------------------------------------------
+!
+!*       11.    INITIALIZE THE SOURCE OF TOTAL DRY MASS Md
+!               ------------------------------------------
+!
+IF((KMI==1).AND.LSTEADYLS .AND. (CCONF=='START') ) THEN
+   XDRYMASSS = 0.
+END IF
+!
+!-------------------------------------------------------------------------------
+!
+!*       12.    INITIALIZE THE MICROPHYSICS
+!               ----------------------------
+!
+IF (CELEC == 'NONE') THEN
+  CALL INI_MICRO_n(TPINIFILE,ILUOUT)
+!
+!-------------------------------------------------------------------------------
+!
+!*       13.    INITIALIZE THE ATMOSPHERIC ELECTRICITY
+!               --------------------------------------
+!
+ELSE
+  CALL INI_ELEC_n(ILUOUT, CELEC, CCLOUD, TPINIFILE, &
+                  XTSTEP, XZZ,                      &
+                  XDXX, XDYY, XDZZ, XDZX, XDZY      )
+!
+  WRITE (UNIT=ILUOUT,&
+  FMT='(/,"ELECTRIC VARIABLES ARE BETWEEN INDEX",I2," AND ",I2)')&
+  NSV_ELECBEG, NSV_ELECEND
+!
+    IF( CGETSVT(NSV_ELECBEG)=='INIT' ) THEN
+      XSVT(:,:,:,NSV_ELECBEG) = XCION_POS_FW(:,:,:)                  ! Nb/kg
+      XSVT(:,:,:,NSV_ELECEND) = XCION_NEG_FW(:,:,:)
+!
+      XSVT(:,:,:,NSV_ELECBEG+1:NSV_ELECEND-1) = 0.0
+    ELSE  ! Convert elec_variables per m3 into elec_variables per kg of air
+      DO JSV = NSV_ELECBEG, NSV_ELECEND
+         XSVT(:,:,:,JSV) = XSVT(:,:,:,JSV) / XRHODREF(:,:,:)
+      ENDDO
+    END IF
+END IF
+!
+!-------------------------------------------------------------------------------
+!
+!*       14.   INITIALIZE THE LARGE SCALE SOURCES
+!              ----------------------------------
+!
+IF ((KMI==1).AND.(.NOT. LSTEADYLS)) THEN
+  CALL MPPDB_CHECK3D(XUT,"INI_MODEL_N-before ini_cpl::XUT",PRECISION)
+  CALL INI_CPL(NSTOP,XTSTEP,LSTEADYLS,CCONF,                                  &
+               CGETTKET,                                                      &
+               CGETRVT,CGETRCT,CGETRRT,CGETRIT,                               &
+               CGETRST,CGETRGT,CGETRHT,CGETSVT,LCH_INIT_FIELD,                &
+               NSV,NIMAX_ll,NJMAX_ll,                                         &
+               NSIZELBX_ll,NSIZELBXU_ll,NSIZELBY_ll,NSIZELBYV_ll,             &
+               NSIZELBXTKE_ll,NSIZELBYTKE_ll,                                 &
+               NSIZELBXR_ll,NSIZELBYR_ll,NSIZELBXSV_ll,NSIZELBYSV_ll,         &
+               XLSUM,XLSVM,XLSWM,XLSTHM,XLSRVM,XLSZWSM,XDRYMASST,             &
+               XLBXUM,XLBXVM,XLBXWM,XLBXTHM,XLBXTKEM,XLBXRM,XLBXSVM,          &
+               XLBYUM,XLBYVM,XLBYWM,XLBYTHM,XLBYTKEM,XLBYRM,XLBYSVM,          &
+               XLSUS,XLSVS,XLSWS,XLSTHS,XLSRVS,XLSZWSS,XDRYMASSS,             &
+               XLBXUS,XLBXVS,XLBXWS,XLBXTHS,XLBXTKES,XLBXRS,XLBXSVS,          &
+               XLBYUS,XLBYVS,XLBYWS,XLBYTHS,XLBYTKES,XLBYRS,XLBYSVS           )
+  CALL MPPDB_CHECK3D(XUT,"INI_MODEL_N-after ini_cpl::XUT",PRECISION)
+!
+      DO JSV=NSV_CHEMBEG,NSV_CHEMEND
+        XLBXSVS(:,:,:,JSV)=MAX(XLBXSVS(:,:,:,JSV),0.)
+        XLBYSVS(:,:,:,JSV)=MAX(XLBYSVS(:,:,:,JSV),0.)
+      ENDDO
+      !
+      DO JSV=NSV_LNOXBEG,NSV_LNOXEND
+        XLBXSVS(:,:,:,JSV)=MAX(XLBXSVS(:,:,:,JSV),0.)
+        XLBYSVS(:,:,:,JSV)=MAX(XLBYSVS(:,:,:,JSV),0.)
+      ENDDO
+      !
+      DO JSV=NSV_AERBEG,NSV_AEREND
+        XLBXSVS(:,:,:,JSV)=MAX(XLBXSVS(:,:,:,JSV),0.)
+        XLBYSVS(:,:,:,JSV)=MAX(XLBYSVS(:,:,:,JSV),0.)
+      ENDDO
+      !
+      DO JSV=NSV_DSTBEG,NSV_DSTEND
+        XLBXSVS(:,:,:,JSV)=MAX(XLBXSVS(:,:,:,JSV),0.)
+        XLBYSVS(:,:,:,JSV)=MAX(XLBYSVS(:,:,:,JSV),0.)
+      ENDDO
+      !
+      DO JSV=NSV_DSTDEPBEG,NSV_DSTDEPEND
+        XLBXSVS(:,:,:,JSV)=MAX(XLBXSVS(:,:,:,JSV),0.)
+        XLBYSVS(:,:,:,JSV)=MAX(XLBYSVS(:,:,:,JSV),0.)
+      ENDDO
+      !
+      DO JSV=NSV_SLTBEG,NSV_SLTEND
+        XLBXSVS(:,:,:,JSV)=MAX(XLBXSVS(:,:,:,JSV),0.)
+        XLBYSVS(:,:,:,JSV)=MAX(XLBYSVS(:,:,:,JSV),0.)
+      ENDDO
+      !
+      DO JSV=NSV_SLTDEPBEG,NSV_SLTDEPEND
+        XLBXSVS(:,:,:,JSV)=MAX(XLBXSVS(:,:,:,JSV),0.)
+        XLBYSVS(:,:,:,JSV)=MAX(XLBYSVS(:,:,:,JSV),0.)
+      ENDDO
+      !
+      DO JSV=NSV_PPBEG,NSV_PPEND
+        XLBXSVS(:,:,:,JSV)=MAX(XLBXSVS(:,:,:,JSV),0.)
+        XLBYSVS(:,:,:,JSV)=MAX(XLBYSVS(:,:,:,JSV),0.)
+      ENDDO
+      !
+#ifdef MNH_FOREFIRE
+      DO JSV=NSV_FFBEG,NSV_FFEND
+        XLBXSVS(:,:,:,JSV)=MAX(XLBXSVS(:,:,:,JSV),0.)
+        XLBYSVS(:,:,:,JSV)=MAX(XLBYSVS(:,:,:,JSV),0.)
+      ENDDO
+      !
+#endif
+! Blaze smoke
+DO JSV=NSV_FIREBEG,NSV_FIREEND
+  XLBXSVS(:,:,:,JSV)=MAX(XLBXSVS(:,:,:,JSV),0.)
+  XLBYSVS(:,:,:,JSV)=MAX(XLBYSVS(:,:,:,JSV),0.)
+ENDDO
+!
+      DO JSV=NSV_CSBEG,NSV_CSEND
+        XLBXSVS(:,:,:,JSV)=MAX(XLBXSVS(:,:,:,JSV),0.)
+        XLBYSVS(:,:,:,JSV)=MAX(XLBYSVS(:,:,:,JSV),0.)
+      ENDDO
+!
+END IF
+!
+IF ( KMI > 1) THEN
+  ! Use dummy pointers to correct an ifort BUG
+  DPTR_XBMX1=>XBMX1
+  DPTR_XBMX2=>XBMX2
+  DPTR_XBMX3=>XBMX3
+  DPTR_XBMX4=>XBMX4
+  DPTR_XBMY1=>XBMY1
+  DPTR_XBMY2=>XBMY2
+  DPTR_XBMY3=>XBMY3
+  DPTR_XBMY4=>XBMY4
+  DPTR_XBFX1=>XBFX1
+  DPTR_XBFX2=>XBFX2
+  DPTR_XBFX3=>XBFX3
+  DPTR_XBFX4=>XBFX4
+  DPTR_XBFY1=>XBFY1
+  DPTR_XBFY2=>XBFY2
+  DPTR_XBFY3=>XBFY3
+  DPTR_XBFY4=>XBFY4
+  DPTR_CLBCX=>CLBCX
+  DPTR_CLBCY=>CLBCY
+  !
+  DPTR_XZZ=>XZZ
+  DPTR_XZHAT=>XZHAT
+  DPTR_XLSUM=>XLSUM
+  DPTR_XLSVM=>XLSVM
+  DPTR_XLSWM=>XLSWM
+  DPTR_XLSTHM=>XLSTHM
+  DPTR_XLSRVM=>XLSRVM
+  DPTR_XLSZWSM=>XLSZWSM
+  DPTR_XLSUS=>XLSUS
+  DPTR_XLSVS=>XLSVS
+  DPTR_XLSWS=>XLSWS
+  DPTR_XLSTHS=>XLSTHS
+  DPTR_XLSRVS=>XLSRVS
+  DPTR_XLSZWSS=>XLSZWSS
+  !
+  DPTR_NKLIN_LBXU=>NKLIN_LBXU
+  DPTR_XCOEFLIN_LBXU=>XCOEFLIN_LBXU
+  DPTR_NKLIN_LBYU=>NKLIN_LBYU
+  DPTR_XCOEFLIN_LBYU=>XCOEFLIN_LBYU
+  DPTR_NKLIN_LBXV=>NKLIN_LBXV
+  DPTR_XCOEFLIN_LBXV=>XCOEFLIN_LBXV
+  DPTR_NKLIN_LBYV=>NKLIN_LBYV
+  DPTR_XCOEFLIN_LBYV=>XCOEFLIN_LBYV
+  DPTR_NKLIN_LBXW=>NKLIN_LBXW
+  DPTR_XCOEFLIN_LBXW=>XCOEFLIN_LBXW
+  DPTR_NKLIN_LBYW=>NKLIN_LBYW
+  DPTR_XCOEFLIN_LBYW=>XCOEFLIN_LBYW
+  DPTR_NKLIN_LBXM=>NKLIN_LBXM
+  DPTR_XCOEFLIN_LBXM=>XCOEFLIN_LBXM
+  DPTR_NKLIN_LBYM=>NKLIN_LBYM
+  DPTR_XCOEFLIN_LBYM=>XCOEFLIN_LBYM
+  !
+  CALL INI_SPAWN_LS_n(NDAD(KMI),XTSTEP,KMI,                                 &
+       DPTR_XBMX1,DPTR_XBMX2,DPTR_XBMX3,DPTR_XBMX4,DPTR_XBMY1,DPTR_XBMY2,DPTR_XBMY3,DPTR_XBMY4,      &
+       DPTR_XBFX1,DPTR_XBFX2,DPTR_XBFX3,DPTR_XBFX4,DPTR_XBFY1,DPTR_XBFY2,DPTR_XBFY3,DPTR_XBFY4,      &
+       NDXRATIO_ALL(KMI),NDYRATIO_ALL(KMI),                  &
+       DPTR_CLBCX,DPTR_CLBCY,DPTR_XZZ,DPTR_XZHAT,                                &
+       LSLEVE,XLEN1,XLEN2,                                   &
+       DPTR_XLSUM,DPTR_XLSVM,DPTR_XLSWM,DPTR_XLSTHM,DPTR_XLSRVM,DPTR_XLSZWSM,         &
+       DPTR_XLSUS,DPTR_XLSVS,DPTR_XLSWS,DPTR_XLSTHS,DPTR_XLSRVS,DPTR_XLSZWSS,                      &
+       DPTR_NKLIN_LBXU,DPTR_XCOEFLIN_LBXU,DPTR_NKLIN_LBYU,DPTR_XCOEFLIN_LBYU,    &
+       DPTR_NKLIN_LBXV,DPTR_XCOEFLIN_LBXV,DPTR_NKLIN_LBYV,DPTR_XCOEFLIN_LBYV,    &
+       DPTR_NKLIN_LBXW,DPTR_XCOEFLIN_LBXW,DPTR_NKLIN_LBYW,DPTR_XCOEFLIN_LBYW,    &
+       DPTR_NKLIN_LBXM,DPTR_XCOEFLIN_LBXM,DPTR_NKLIN_LBYM,DPTR_XCOEFLIN_LBYM     )
+  !
+  DPTR_XLBXUM=>XLBXUM
+  DPTR_XLBYUM=>XLBYUM
+  DPTR_XLBXVM=>XLBXVM
+  DPTR_XLBYVM=>XLBYVM
+  DPTR_XLBXWM=>XLBXWM
+  DPTR_XLBYWM=>XLBYWM
+  DPTR_XLBXTHM=>XLBXTHM
+  DPTR_XLBYTHM=>XLBYTHM
+  DPTR_XLBXTKEM=>XLBXTKEM
+  DPTR_XLBYTKEM=>XLBYTKEM
+  DPTR_XLBXRM=>XLBXRM
+  DPTR_XLBYRM=>XLBYRM
+  DPTR_XLBXSVM=>XLBXSVM
+  DPTR_XLBYSVM=>XLBYSVM
+  IF (CCONF=='START')  THEN
+  CALL INI_ONE_WAY_n(NDAD(KMI),KMI,                        &
+       DPTR_XBMX1,DPTR_XBMX2,DPTR_XBMX3,DPTR_XBMX4,DPTR_XBMY1,DPTR_XBMY2,DPTR_XBMY3,DPTR_XBMY4,        &
+       DPTR_XBFX1,DPTR_XBFX2,DPTR_XBFX3,DPTR_XBFX4,DPTR_XBFY1,DPTR_XBFY2,DPTR_XBFY3,DPTR_XBFY4,        &
+       NDXRATIO_ALL(KMI),NDYRATIO_ALL(KMI),      &
+       DPTR_CLBCX,DPTR_CLBCY,NRIMX,NRIMY,                                &
+       DPTR_NKLIN_LBXU,DPTR_XCOEFLIN_LBXU,DPTR_NKLIN_LBYU,DPTR_XCOEFLIN_LBYU,      &
+       DPTR_NKLIN_LBXV,DPTR_XCOEFLIN_LBXV,DPTR_NKLIN_LBYV,DPTR_XCOEFLIN_LBYV,      &
+       DPTR_NKLIN_LBXW,DPTR_XCOEFLIN_LBXW,DPTR_NKLIN_LBYW,DPTR_XCOEFLIN_LBYW,      &
+       DPTR_NKLIN_LBXM,DPTR_XCOEFLIN_LBXM,DPTR_NKLIN_LBYM,DPTR_XCOEFLIN_LBYM,      &
+       CCLOUD, LUSECHAQ, LUSECHIC,                                                 &
+       DPTR_XLBXUM,DPTR_XLBYUM,DPTR_XLBXVM,DPTR_XLBYVM,DPTR_XLBXWM,DPTR_XLBYWM,    &
+       DPTR_XLBXTHM,DPTR_XLBYTHM,                                                  &
+       DPTR_XLBXTKEM,DPTR_XLBYTKEM,                                                &
+       DPTR_XLBXRM,DPTR_XLBYRM,DPTR_XLBXSVM,DPTR_XLBYSVM                           )
+   ENDIF
+END IF
+!
+!
+!-------------------------------------------------------------------------------
+!
+!*       15.    INITIALIZE THE SCALAR VARIABLES
+!               -------------------------------
+!
+IF (LLG .AND. LINIT_LG .AND. CPROGRAM=='MESONH') &
+  CALL INI_LG( XXHATM, XYHATM, XZZ, XSVT, XLBXSVM, XLBYSVM )
+
+!
+!-------------------------------------------------------------------------------
+!
+!*       16.    INITIALIZE THE PARAMETERS FOR THE DYNAMICS
+!               ------------------------------------------
+!
+CALL INI_DYNAMICS(XLON,XLAT,XRHODJ,XTHVREF,XMAP,XZZ,XDXHAT,XDYHAT,            &
+             XZHAT,XZHATM,CLBCX,CLBCY,XTSTEP,                                 &
+             LVE_RELAX,LVE_RELAX_GRD,LHORELAX_UVWTH,LHORELAX_RV,              &
+             LHORELAX_RC,LHORELAX_RR,LHORELAX_RI,LHORELAX_RS,LHORELAX_RG,     &
+             LHORELAX_RH,LHORELAX_TKE,LHORELAX_SV,                            &
+             LHORELAX_SVC2R2,LHORELAX_SVC1R3,LHORELAX_SVELEC,LHORELAX_SVLG,   &
+             LHORELAX_SVCHEM,LHORELAX_SVAER,LHORELAX_SVDST,LHORELAX_SVSLT,    &
+             LHORELAX_SVPP,LHORELAX_SVCS,LHORELAX_SVCHIC,LHORELAX_SVSNW,      &
+#ifdef MNH_FOREFIRE
+             LHORELAX_SVFF,                                                   &
+#endif
+             XRIMKMAX,NRIMX,NRIMY,                                            &
+             XALKTOP,XALKGRD,XALZBOT,XALZBAS,                                 &
+             XT4DIFU,XT4DIFTH,XT4DIFSV,                                       &
+             XCORIOX,XCORIOY,XCORIOZ,XCURVX,XCURVY,                           &
+             XDXHATM,XDYHATM,XRHOM,XAF,XBFY,XCF,XTRIGSX,XTRIGSY,NIFAXX,NIFAXY,&
+             XALK,XALKW,NALBOT,XALKBAS,XALKWBAS,NALBAS,                       &
+             LMASK_RELAX,XKURELAX,XKVRELAX,XKWRELAX,                          &
+             XDK2U,XDK4U,XDK2TH,XDK4TH,XDK2SV,XDK4SV,                         &
+             LZDIFFU,XZDIFFU_HALO2,                                           &
+             XBFB,XBF_SXP2_YP1_Z                                              )
+!
+!
+!*      16.1 Initialize the XDRAG array
+!              -------------
+IF (LDRAG) THEN
+   CALL INI_DRAG(LMOUNT,XZS,XHSTART,NSTART,XDRAG)
+ENDIF
+!*      16.2 Initialize the LevelSet function
+!              -------------
+IF (LIBM) THEN
+  ALLOCATE(XIBM_LS(IIU,IJU,IKU,4)) ; XIBM_LS  = -XIBM_IEPS
+  XIBM_LS(:,:,:,1)=ZIBM_LS(:,:,:)
+  DEALLOCATE(ZIBM_LS)
+ENDIF
+!-------------------------------------------------------------------------------
+!
+!*      17.    SURFACE FIELDS
+!              --------------
+!
+!*      17.1   Radiative setup
+!              ---------------
+!
+IF (CRAD   /= 'NONE') THEN
+  IF (CGETRAD =='INIT') THEN
+    GINIRAD  =.TRUE.
+  ELSE
+    GINIRAD  =.FALSE.
+  END IF
+  CALL INI_RADIATIONS(TPINIFILE,GINIRAD,TDTCUR,TDTEXP,XZZ, &
+                      XDXX, XDYY,                         &
+                      XSINDEL,XCOSDEL,XTSIDER,XCORSOL,    &
+                      XSLOPANG,XSLOPAZI,                  &
+                      XDTHRAD,XDIRFLASWD,XSCAFLASWD,      &
+                      XFLALWD,XDIRSRFSWD,NCLEARCOL_TM1,   &
+                      XZENITH,XAZIM,                      &
+                      TDTRAD_FULL,TDTRAD_CLONLY,          &
+                      TZINITHALO2D_ll,                    &
+                      XRADEFF,XSWU,XSWD,XLWU,             &
+                      XLWD,XDTHRADSW,XDTHRADLW           )
+  !
+  IF (GINIRAD) CALL SUNPOS_n(XZENITH,PAZIMSOL=XAZIM)
+  CALL SURF_SOLAR_GEOM    (XZS, XZS_XY)
+  !
+  ALLOCATE(XZS_ll                   (IIU_ll,IJU_ll))
+  ALLOCATE(XZS_XY_ll                (IIU_ll,IJU_ll))
+  !
+  CALL GATHERALL_FIELD_ll('XY',XZS,XZS_ll,IRESP)
+  CALL GATHERALL_FIELD_ll('XY',XZS_XY,XZS_XY_ll,IRESP)
+  XZS_MAX_ll=MAXVAL(XZS_ll)
+ELSE
+  XAZIM       = XPI
+  XZENITH     = XPI/2.
+  XDIRSRFSWD  = 0.
+  XSCAFLASWD  = 0.
+  XFLALWD     = 300.  ! W/m2
+  XTSIDER     = 0.
+END IF
+!
+!
+CALL INI_SW_SETUP (CRAD,NSWB_MNH,XSW_BANDS)
+CALL INI_LW_SETUP (CRAD,NLWB_MNH,XLW_BANDS)
+!
+!
+!       17.1.1 Special initialisation for CO2 content
+!              CO2 (molar mass=44) horizontally and vertically homogeneous at 360 ppm
+!
+XCCO2 = 360.0E-06 * 44.0E-03 / XMD
+#ifdef MNH_ECRAD
+RCCO2 = 360.0E-06 * 44.0E-03 / XMD
+#endif
+!
+!
+!*      17.2   Externalized surface fields
+!              ---------------------------
+!
+ALLOCATE(ZCO2(IIU,IJU))
+ZCO2(:,:) = XCCO2
+!
+
+ALLOCATE(ZDIR_ALB(IIU,IJU,NSWB_MNH))
+ALLOCATE(ZSCA_ALB(IIU,IJU,NSWB_MNH))
+ALLOCATE(ZEMIS  (IIU,IJU,NLWB_MNH))
+ALLOCATE(ZTSRAD (IIU,IJU))
+!
+IF (LCOUPLES.AND.(KMI>1))THEN
+  CSURF ="NONE"
+ELSE
+  IF ((TPINIFILE%NMNHVERSION(1)==4 .AND. TPINIFILE%NMNHVERSION(2)>=6) .OR. TPINIFILE%NMNHVERSION(1)>4) THEN
+    CALL IO_Field_read(TPINIFILE,'SURF',CSURF)
+  ELSE
+    CSURF = "EXTE"
+  END IF
+END IF
+!
+!
+IF (CSURF=='EXTE' .AND. (CPROGRAM=='MESONH' .OR. CPROGRAM=='DIAG  ')) THEN
+  ! ouverture du fichier PGD
+  IF  ( LEN_TRIM(CINIFILEPGD) > 0 ) THEN
+    CALL IO_File_add2list(TINIFILEPGD,TRIM(CINIFILEPGD),'PGD','READ',KLFITYPE=2,KLFIVERB=NVERB)
+    CALL IO_File_open(TINIFILEPGD,KRESP=IRESP)
+    LUNIT_MODEL(KMI)%TINIFILEPGD => TINIFILEPGD
+    IF (IRESP/=0) THEN
+      WRITE(ILUOUT,FMT=*) "INI_MODEL_n ERROR TO OPEN THE FILE CINIFILEPGD=",CINIFILEPGD
+      WRITE(ILUOUT,FMT=*) "CHECK YOUR NAMELIST NAM_LUNITn"
+    !callabortstop
+      CALL PRINT_MSG(NVERB_FATAL,'GEN','INI_MODEL_n','')
+    ENDIF
+  ELSE
+  ! case after a spawning
+    CINIFILEPGD = TPINIFILE%CNAME
+  END IF
+  !
+  CALL GOTO_SURFEX(KMI)
+#ifdef CPLOASIS
+  CALL SFX_OASIS_READ_NAM(CPROGRAM,XTSTEP)
+  WRITE(*,*) 'SFX-OASIS: READ NAM_SFX_SEA_CPL OK'
+#endif
+  !* initialization of surface
+  CALL INIT_GROUND_PARAM_n ('ALL',SIZE(CSV),CSV,ZCO2,                             &
+                            XZENITH,XAZIM,XSW_BANDS,XLW_BANDS,ZDIR_ALB,ZSCA_ALB,  &
+                            ZEMIS,ZTSRAD                                )
+  !
+  IF (SIZE(XEMIS)>0) THEN
+    XDIR_ALB = ZDIR_ALB
+    XSCA_ALB = ZSCA_ALB
+    XEMIS    = ZEMIS
+    XTSRAD   = ZTSRAD
+    CALL MNHGET_SURF_PARAM_n (PSEA=XSEA)
+  END IF
+ELSE
+  !* fields not physically necessary, but must be initialized
+  IF (SIZE(XEMIS)>0) THEN
+    XDIR_ALB = 0.
+    XSCA_ALB = 0.
+    XEMIS    = 1.
+    XTSRAD   = XTT
+    XSEA     = 1.
+  END IF
+END IF
+IF (CSURF=='EXTE' .AND. (CPROGRAM=='SPAWN ')) THEN
+  ! ouverture du fichier PGD
+  CALL IO_File_add2list(TINIFILEPGD,TRIM(CINIFILEPGD),'PGD','READ',KLFITYPE=2,KLFIVERB=NVERB)
+  CALL IO_File_open(TINIFILEPGD,KRESP=IRESP)
+  LUNIT_MODEL(KMI)%TINIFILEPGD => TINIFILEPGD
+  IF (IRESP/=0) THEN
+    WRITE(ILUOUT,FMT=*) "INI_MODEL_n ERROR TO OPEN THE FILE CINIFILEPGD=",CINIFILEPGD
+    WRITE(ILUOUT,FMT=*) "CHECK YOUR NAMELIST NAM_LUNIT2_SPA"
+    !callabortstop
+    CALL PRINT_MSG(NVERB_FATAL,'GEN','INI_MODEL_n','')
+  ENDIF
+ENDIF
+!
+IF (.NOT.ASSOCIATED(TINIFILEPGD)) TINIFILEPGD => TFILE_DUMMY
+!
+  !* special case after spawning in prep_real_case
+IF (CSURF=='EXRM' .AND. CPROGRAM=='REAL  ') CSURF = 'EXTE'
+!
+DEALLOCATE(ZDIR_ALB)
+DEALLOCATE(ZSCA_ALB)
+DEALLOCATE(ZEMIS   )
+DEALLOCATE(ZTSRAD  )
+!
+DEALLOCATE(ZCO2)
+!
+!
+!* in a RESTART case, reads surface radiative quantities in the MESONH file
+!
+IF ((CRAD  == 'ECMW' .OR. CRAD  == 'ECRA') .AND. CGETRAD=='READ') THEN
+  CALL INI_SURF_RAD(TPINIFILE, XDIR_ALB, XSCA_ALB, XEMIS, XTSRAD)
+END IF
+!
+!
+!*      17.3   Mesonh fields
+!              -------------
+!
+IF (CPROGRAM/='REAL  ') CALL MNHREAD_ZS_DUMMY_n(TINIFILEPGD)
+!
+!-------------------------------------------------------------------------------
+!
+!*       18.    INITIALIZE THE PARAMETERS FOR THE PHYSICS
+!               -----------------------------------------
+!
+IF (CRAD   == 'ECMW') THEN
+!
+!* get cover mask for aerosols
+!
+  IF (CPROGRAM=='MESONH' .OR. CPROGRAM=='DIAG  ') THEN
+!
+    IF ( CAOP=='EXPL' .AND. LDUST .AND. KMI==1) THEN
+      ALLOCATE( XEXT_COEFF_WVL_LKT_DUST( NMAX_RADIUS_LKT_DUST, NMAX_SIGMA_LKT_DUST, NMAX_WVL_SW_DUST ) )
+      ALLOCATE( XEXT_COEFF_550_LKT_DUST( NMAX_RADIUS_LKT_DUST, NMAX_SIGMA_LKT_DUST )                   )
+      ALLOCATE( XPIZA_LKT_DUST         ( NMAX_RADIUS_LKT_DUST, NMAX_SIGMA_LKT_DUST, NMAX_WVL_SW_DUST ) )
+      ALLOCATE( XCGA_LKT_DUST          ( NMAX_RADIUS_LKT_DUST, NMAX_SIGMA_LKT_DUST, NMAX_WVL_SW_DUST ) )
+    END IF
+!
+    IF ( CAOP=='EXPL' .AND. LSALT .AND. KMI==1) THEN
+      ALLOCATE( XEXT_COEFF_WVL_LKT_SALT( NMAX_RADIUS_LKT_SALT, NMAX_SIGMA_LKT_SALT, NMAX_WVL_SW_SALT ) )
+      ALLOCATE( XEXT_COEFF_550_LKT_SALT( NMAX_RADIUS_LKT_SALT, NMAX_SIGMA_LKT_SALT )                   )
+      ALLOCATE( XPIZA_LKT_SALT         ( NMAX_RADIUS_LKT_SALT, NMAX_SIGMA_LKT_SALT, NMAX_WVL_SW_SALT ) )
+      ALLOCATE( XCGA_LKT_SALT          ( NMAX_RADIUS_LKT_SALT, NMAX_SIGMA_LKT_SALT, NMAX_WVL_SW_SALT ) )
+    END IF
+!
+    CALL INI_RADIATIONS_ECMWF (XZHAT,XPABST,XTHT,XTSRAD,XLAT,XLON,TDTCUR,TDTEXP,       &
+                               CLW,NDLON,NFLEV,NFLUX,NRAD,NSWB_OLD,CAER,NAER,NSTATM,   &
+                               XSTATM, XOZON, XAER,XDST_WL, LSUBG_COND                 )
+!
+    ALLOCATE (XAER_CLIM(SIZE(XAER,1),SIZE(XAER,2),SIZE(XAER,3),SIZE(XAER,4)))
+    XAER_CLIM(:,:,:,:) =XAER(:,:,:,:)
+!
+  END IF
+
+ELSE IF (CRAD   == 'ECRA') THEN
+#ifdef MNH_ECRAD
+!* get cover mask for aerosols
+!
+  IF (CPROGRAM=='MESONH' .OR. CPROGRAM=='DIAG  ') THEN
+!
+    CALL INI_RADIATIONS_ECRAD (XZHAT,XPABST,XTHT,XTSRAD,XLAT,XLON,TDTCUR,TDTEXP,       &
+                               CLW,NDLON,NFLEV,NFLUX,NRAD,NSWB_OLD,CAER,NAER,NSTATM,   &
+                               XSTATM, XOZON, XAER,XDST_WL, LSUBG_COND                 )
+
+    ALLOCATE (XAER_CLIM(SIZE(XAER,1),SIZE(XAER,2),SIZE(XAER,3),SIZE(XAER,4)))
+    XAER_CLIM(:,:,:,:) = XAER(:,:,:,:)
+!
+  END IF
+#endif
+ELSE
+  ALLOCATE (XOZON(0,0,0))
+  ALLOCATE (XAER(0,0,0,0))
+  ALLOCATE (XDST_WL(0,0,0,0))
+  ALLOCATE (XAER_CLIM(0,0,0,0))
+END IF
+!
+!
+!
+IF (CDCONV /= 'NONE' .OR. CSCONV == 'KAFR') THEN
+  IF (CGETCONV=='INIT') THEN
+    GINIDCONV=.TRUE.
+  ELSE
+    GINIDCONV=.FALSE.
+  END IF
+!
+!  commensurability between convection calling time and time step
+!
+  XDTCONV=XTSTEP*REAL( INT( (MIN(XDTCONV,1800.)+1.E-10)/XTSTEP ) )
+  XDTCONV=MAX( XDTCONV, XTSTEP )
+  IF (NVERB>=10) THEN
+    WRITE(ILUOUT,*) 'XDTCONV has been set to : ',XDTCONV
+  END IF
+  CALL INI_DEEP_CONVECTION (TPINIFILE,GINIDCONV,TDTCUR,                      &
+                           NCOUNTCONV,XDTHCONV,XDRVCONV,XDRCCONV,            &
+                           XDRICONV,XPRCONV,XPRSCONV,XPACCONV,               &
+                           XUMFCONV,XDMFCONV,XMFCONV,XPRLFLXCONV,XPRSFLXCONV,&
+                           XCAPE,NCLTOPCONV,NCLBASCONV,                      &
+                           TDTDCONV, CGETSVCONV, XDSVCONV,                   &
+                           LCH_CONV_LINOX, XIC_RATE, XCG_RATE,               &
+                           XIC_TOTAL_NUMBER, XCG_TOTAL_NUMBER                )
+
+END IF
+!
+!
+!
+IF (CSCONV == 'EDKF') THEN
+  CALL INI_MFSHALL()
+ENDIF
+!
+!-------------------------------------------------------------------------------
+!
+!
+!*      19.    ALLOCATION OF THE TEMPORAL SERIES
+!              ---------------------------------
+!
+IF (LSERIES .AND. CPROGRAM/='DIAG  ') CALL INI_SERIES_n
+!
+!-------------------------------------------------------------------------------
+!
+!
+!*      20.   (re)initialize scalar variables
+!             -------------------------------
+!
+!
+IF ( LUSECHEM .OR. LCHEMDIAG ) THEN
+  IF (CPROGRAM=='MESONH'.AND.CCONF=='RESTA') LCH_INIT_FIELD =.FALSE.
+  IF (CPROGRAM=='MESONH'.OR. CPROGRAM=='DIAG  ' .OR. CPROGRAM=='IDEAL ') &
+        CALL CH_INIT_FIELD_n(KMI, ILUOUT, NVERB)
+END IF
+!
+!-------------------------------------------------------------------------------
+!
+!*      21.    UPDATE HALO
+!              -----------
+!
+!
+CALL UPDATE_HALO_ll(TZINITHALO3D_ll,IINFO_ll)
+CALL UPDATE_HALO_ll(TZINITHALO2D_ll,IINFO_ll)
+CALL CLEANLIST_ll(TZINITHALO3D_ll)
+CALL CLEANLIST_ll(TZINITHALO2D_ll)
+!
+!
+!-------------------------------------------------------------------------------
+!
+!*      22.    DEALLOCATION
+!              -------------
+!
+DEALLOCATE(ZJ)
+!
+DEALLOCATE(XSTROATM)
+DEALLOCATE(XSMLSATM)
+DEALLOCATE(XSMLWATM)
+DEALLOCATE(XSPOSATM)
+DEALLOCATE(XSPOWATM)
+!
+!-------------------------------------------------------------------------------
+!
+!*      23.     BALLOON and AIRCRAFT initializations
+!              ------------------------------------
+!
+CALL INI_AIRCRAFT_BALLOON( TPINIFILE, XLATORI, XLONORI )
+!
+!-------------------------------------------------------------------------------
+!
+!*      24.     STATION initializations
+!              -----------------------
+!
+CALL INI_SURFSTATION_n( )
+!
+!-------------------------------------------------------------------------------
+!
+!*      25.     PROFILER initializations
+!              ------------------------
+!
+CALL INI_POSPROFILER_n( )
+!
+!-------------------------------------------------------------------------------
+!
+!*      26.     Prognostic aerosols
+!              ------------------------
+!
+IF ( ( CRAD=='ECMW' .OR. CRAD=='ECRA' ) .AND. CAOP=='EXPL' .AND. LORILAM ) THEN
+  IF(.NOT.ALLOCATED(POLYTAU)) ALLOCATE(POLYTAU(6,10,8,6,13))
+  IF(.NOT.ALLOCATED(POLYSSA)) ALLOCATE(POLYSSA(6,10,8,6,13))
+  IF(.NOT.ALLOCATED(POLYG))   ALLOCATE(POLYG  (6,10,8,6,13))
+  CALL INI_AEROSET1
+  CALL INI_AEROSET2
+  CALL INI_AEROSET3
+  CALL INI_AEROSET4
+  CALL INI_AEROSET5
+  CALL INI_AEROSET6
+END IF
+#ifdef MNH_FOREFIRE
+!
+!-------------------------------------------------------------------------------
+!
+!*      27.    FOREFIRE initializations
+!              ------------------------
+!
+
+! Coupling with ForeFire if resolution is low enough
+!---------------------------------------------------
+IF ( LFOREFIRE .AND. 0.5*(XXHAT(2)-XXHAT(1)+XYHAT(2)-XYHAT(1)) < COUPLINGRES ) THEN
+  FFCOUPLING = .TRUE.
+ELSE
+  FFCOUPLING = .FALSE.
+ENDIF
+
+! Initializing the ForeFire variables
+!------------------------------------
+IF ( LFOREFIRE ) THEN
+  CALL INIT_FOREFIRE_n(KMI, ILUOUT, IP &
+        , TDTCUR%nyear, TDTCUR%nmonth, TDTCUR%nday, TDTCUR%xtime, XTSTEP)
+END IF
+#endif
+
+!-------------------------------------------------------------------------------
+!
+!*      30.   Total production/Loss for chemical species
+!
+IF (LCHEMDIAG)  THEN
+  CALL CH_INIT_PRODLOSSTOT_n(ILUOUT)
+  IF (NEQ_PLT>0) THEN
+    ALLOCATE(XPROD(IIU,IJU,IKU,NEQ_PLT))
+    ALLOCATE(XLOSS(IIU,IJU,IKU,NEQ_PLT))
+    XPROD=0.0
+    XLOSS=0.0
+  ELSE
+    ALLOCATE(XPROD(0,0,0,0))
+    ALLOCATE(XLOSS(0,0,0,0))
+  END IF
+ELSE
+  ALLOCATE(XPROD(0,0,0,0))
+  ALLOCATE(XLOSS(0,0,0,0))
+END IF
+!
+!-------------------------------------------------------------------------------
+!
+!*     31. Extended production/loss terms for chemical species
+!
+IF (LCHEMDIAG) THEN
+  CALL CH_INIT_BUDGET_n(ILUOUT)
+  IF (NEQ_BUDGET>0) THEN
+    ALLOCATE(IINDEX(2,NNONZEROTERMS))
+    ALLOCATE(IIND(NEQ_BUDGET))
+    CALL CH_NONZEROTERMS(KMI,IINDEX,NNONZEROTERMS)
+    ALLOCATE(XTCHEM(NEQ_BUDGET))
+    DO JM=1,NEQ_BUDGET
+      IIND(JM)=COUNT((IINDEX(1,:))==NSPEC_BUDGET(JM))
+      ALLOCATE(XTCHEM(JM)%NB_REAC(IIND(JM)))
+      ALLOCATE(XTCHEM(JM)%XB_REAC(IIU,IJU,IKU,IIND(JM)))
+    END DO
+    DEALLOCATE(IIND)
+    DEALLOCATE(IINDEX)
+  ELSE
+    ALLOCATE(XTCHEM(0))
+  END IF
+ELSE
+  ALLOCATE(XTCHEM(0))
+END IF
+!-------------------------------------------------------------------------------
+!
+!*     32. Wind turbine
+!
+IF (LMAIN_EOL .AND. KMI == NMODEL_EOL) THEN
+ ALLOCATE(XFX_RG(IIU,IJU,IKU))
+ ALLOCATE(XFY_RG(IIU,IJU,IKU))
+ ALLOCATE(XFZ_RG(IIU,IJU,IKU))
+ ALLOCATE(XFX_SMR_RG(IIU,IJU,IKU))
+ ALLOCATE(XFY_SMR_RG(IIU,IJU,IKU))
+ ALLOCATE(XFZ_SMR_RG(IIU,IJU,IKU))
+ SELECT CASE(CMETH_EOL)
+  CASE('ADNR')
+   CALL INI_EOL_ADNR
+  CASE('ALM')
+   CALL INI_EOL_ALM(XDXX,XDYY)
+ END SELECT
+END IF
+!
+!*     33.  Auto-coupling Atmos-Ocean LES NH
+!
+IF (LCOUPLES) THEN
+ ALLOCATE(XSSUFL_C(IIU,IJU,1)); XSSUFL_C=0.0
+ ALLOCATE(XSSVFL_C(IIU,IJU,1)); XSSVFL_C=0.0
+ ALLOCATE(XSSTFL_C(IIU,IJU,1)); XSSTFL_C=0.0
+ ALLOCATE(XSSRFL_C(IIU,IJU,1)); XSSRFL_C=0.
+ELSE
+ ALLOCATE(XSSUFL_C(0,0,0))
+ ALLOCATE(XSSVFL_C(0,0,0))
+ ALLOCATE(XSSTFL_C(0,0,0))
+ ALLOCATE(XSSRFL_C(0,0,0))
+END IF
+!
+END SUBROUTINE INI_MODEL_n
diff --git a/src/PHYEX/ext/ini_nsv.f90 b/src/PHYEX/ext/ini_nsv.f90
new file mode 100644
index 0000000000000000000000000000000000000000..0d7358737ad6b6fbc37b3254fb5867691b27b86d
--- /dev/null
+++ b/src/PHYEX/ext/ini_nsv.f90
@@ -0,0 +1,1237 @@
+!MNH_LIC Copyright 2001-2023 CNRS, Meteo-France and Universite Paul Sabatier
+!MNH_LIC This is part of the Meso-NH software governed by the CeCILL-C licence
+!MNH_LIC version 1. See LICENSE, CeCILL-C_V1-en.txt and CeCILL-C_V1-fr.txt
+!MNH_LIC for details. version 1.
+!-----------------------------------------------------------------
+!     ###################
+      MODULE MODI_INI_NSV
+!     ###################
+INTERFACE 
+!
+  SUBROUTINE INI_NSV(KMI)
+  INTEGER, INTENT(IN)            :: KMI ! model index
+  END SUBROUTINE INI_NSV
+!
+END INTERFACE
+!
+END MODULE MODI_INI_NSV
+!
+!
+!     ###########################
+      SUBROUTINE INI_NSV(KMI)
+!     ###########################
+!
+!!****   *INI_NSV* - compute NSV_* values and indices for model KMI
+!!
+!!    PURPOSE
+!!    -------
+!     
+!
+!     
+!!**  METHOD
+!!    ------
+!!
+!!    This routine is called from any routine which stores values in 
+!!    the first model module (for example READ_EXSEG).
+!!
+!!    EXTERNAL
+!!    --------
+!!
+!!    IMPLICIT ARGUMENTS
+!!    ------------------
+!!      Module MODD_NSV     : contains NSV_A array variable
+!!
+!!    REFERENCE
+!!    ---------
+!!
+!!
+!!    AUTHOR
+!!    ------
+!!      D. Gazen              * LA *
+!!
+!!    MODIFICATIONS
+!!    -------------
+!!      Original   01/02/01
+!!      Modification   29/11/02  (Pinty)  add SV for C3R5 and ELEC
+!!      Modification   01/2004   (Masson) add scalar names
+!!      Modification   03/2006   (O.Geoffroy) add KHKO scheme
+!!      Modification   04/2007   (Leriche) add SV for aqueous chemistry
+!!      M. Chong       26/01/10   Add Small ions
+!!      Modification   07/2010   (Leriche) add SV for ice chemistry
+!!      X.Pialat & J.Escobar 11/2012 remove deprecated line NSV_A(KMI) = ISV
+!!      Modification   15/02/12  (Pialat/Tulet) Add SV for ForeFire scalars
+!!                     03/2013   (C.Lac) add supersaturation as 
+!!                               the 4th C2R2 scalar variable
+!!       J.escobar     04/08/2015 suit Pb with writ_lfin JSA increment , modif in ini_nsv to have good order initialization
+!!      Modification    01/2016  (JP Pinty) Add LIMA and LUSECHEM condition
+!!      Modification    07/2017  (V. Vionnet) Add blowing snow condition
+!  P. Wautelet 09/03/2021: move some chemistry initializations to ini_nsv
+!  P. Wautelet 10/03/2021: move scalar variable name initializations to ini_nsv
+!  P. Wautelet 30/03/2021: move NINDICE_CCN_IMM and NIMM initializations from init_aerosol_properties to ini_nsv
+!  B. Vie         06/2021: add prognostic supersaturation for LIMA
+!  P. Wautelet 26/11/2021: initialize TSVLIST_A
+!  A. Costes      12/2021: smoke tracer for fire model
+!  P. Wautelet 14/01/2022: add CSV_CHEM_LIST(_A) to store the list of all chemical variables
+!                          + NSV_CHEM_LIST(_A) the size of the list
+!-------------------------------------------------------------------------------
+!
+!*       0.   DECLARATIONS
+!             ------------
+!
+USE MODD_BLOWSNOW,        ONLY: CSNOWNAMES, LBLOWSNOW, NBLOWSNOW3D, YPSNOW_INI
+USE MODD_CH_AEROSOL
+! USE MODD_CH_AEROSOL,      ONLY: CAERONAMES, CDEAERNAMES, JPMODE, LAERINIT, LDEPOS_AER, LORILAM, &
+!                                 LVARSIGI, LVARSIGJ, NCARB, NM6_AER, NSOA, NSP
+USE MODD_CH_M9_n,         ONLY: CICNAMES, CNAMES, NEQ, NEQAQ
+USE MODD_CH_MNHC_n,       ONLY: LCH_PH, LUSECHEM, LUSECHAQ, LUSECHIC, CCH_SCHEME, LCH_CONV_LINOX
+USE MODD_CONDSAMP,        ONLY: LCONDSAMP, NCONDSAMP
+USE MODD_CONF,            ONLY: LLG, CPROGRAM, NVERB
+USE MODD_CST,             ONLY: XMNH_TINY
+USE MODD_DIAG_FLAG,       ONLY: LCHEMDIAG, LCHAQDIAG
+USE MODD_DUST,            ONLY: CDEDSTNAMES, CDUSTNAMES, JPDUSTORDER, LDEPOS_DST, LDSTINIT, LDSTPRES, LDUST, &
+                                LRGFIX_DST, LVARSIG, NMODE_DST, YPDEDST_INI, YPDUST_INI
+USE MODD_DYN_n,           ONLY: LHORELAX_SV,LHORELAX_SVC2R2,LHORELAX_SVC1R3,   &
+                                LHORELAX_SVFIRE, LHORELAX_SVLIMA,              &
+                                LHORELAX_SVELEC,LHORELAX_SVCHEM,LHORELAX_SVLG, &
+                                LHORELAX_SVDST,LHORELAX_SVAER, LHORELAX_SVSLT, &
+                                LHORELAX_SVPP,LHORELAX_SVCS, LHORELAX_SVCHIC,  &
+                                LHORELAX_SVSNW
+#ifdef MNH_FOREFIRE
+USE MODD_DYN_n,           ONLY: LHORELAX_SVFF
+#endif
+USE MODD_ELEC_DESCR,      ONLY: LLNOX_EXPLICIT
+USE MODD_ELEC_DESCR,      ONLY: CELECNAMES
+USE MODD_FIELD,           ONLY: TFIELDMETADATA, TYPEREAL
+USE MODD_FIRE_n
+#ifdef MNH_FOREFIRE
+USE MODD_FOREFIRE
+#endif
+USE MODD_ICE_C1R3_DESCR,  ONLY: C1R3NAMES
+USE MODD_LG,              ONLY: CLGNAMES, XLG1MIN, XLG2MIN, XLG3MIN
+USE MODD_LUNIT_n,         ONLY: TLUOUT
+USE MODD_NSV
+USE MODD_PARAM_C2R2,      ONLY: LSUPSAT
+USE MODD_PARAMETERS,      ONLY: NCOMMENTLGTMAX, NLONGNAMELGTMAX, NUNITLGTMAX
+USE MODD_PARAM_LIMA,      ONLY: NINDICE_CCN_IMM, NIMM, NMOD_CCN, NMOD_IFN, NMOD_IMM, PARAM_LIMA_ALLOCATE, PARAM_LIMA_DEALLOCATE
+USE MODD_PARAM_LIMA_COLD, ONLY: CLIMA_COLD_NAMES
+USE MODD_PARAM_LIMA_WARM, ONLY: CAERO_MASS, CLIMA_WARM_NAMES
+USE MODD_PARAM_n,         ONLY: CCLOUD, CELEC
+USE MODD_PASPOL,          ONLY: LPASPOL, NRELEASE
+USE MODD_PREP_REAL,       ONLY: XT_LS
+USE MODD_RAIN_C2R2_DESCR, ONLY: C2R2NAMES
+USE MODD_SALT,            ONLY: CSALTNAMES, CDESLTNAMES, JPSALTORDER, &
+                                LRGFIX_SLT, LSALT, LSLTINIT, LSLTPRES, LDEPOS_SLT, LVARSIG_SLT, NMODE_SLT, YPDESLT_INI, YPSALT_INI
+
+USE MODE_MSG
+USE MODE_LIMA_UPDATE_NSV, ONLY: LIMA_UPDATE_NSV
+
+USE MODI_CH_AER_INIT_SOA,  ONLY: CH_AER_INIT_SOA
+USE MODI_CH_INIT_SCHEME_n, ONLY: CH_INIT_SCHEME_n
+USE MODI_UPDATE_NSV,       ONLY: UPDATE_NSV
+!
+IMPLICIT NONE 
+!
+!-------------------------------------------------------------------------------
+!
+!*       0.1   Declarations of arguments
+!
+INTEGER, INTENT(IN)             :: KMI ! model index
+!
+!*       0.2   Declarations of local variables
+!
+CHARACTER(LEN=2) :: YNUM2
+CHARACTER(LEN=3) :: YNUM3
+CHARACTER(LEN=NCOMMENTLGTMAX) :: YCOMMENT
+CHARACTER(LEN=NUNITLGTMAX)    :: YUNITS
+CHARACTER(LEN=NLONGNAMELGTMAX), DIMENSION(:), ALLOCATABLE :: YAEROLONGNAMES
+CHARACTER(LEN=NLONGNAMELGTMAX), DIMENSION(:), ALLOCATABLE :: YDUSTLONGNAMES
+CHARACTER(LEN=NLONGNAMELGTMAX), DIMENSION(:), ALLOCATABLE :: YSALTLONGNAMES
+INTEGER :: ILUOUT
+INTEGER :: ICHIDX ! Index for position in CSV_CHEM_LIST_A array
+INTEGER :: ISV ! total number of scalar variables
+INTEGER :: IMODEIDX
+INTEGER :: JAER
+INTEGER :: JI, JJ, JSV
+INTEGER :: JMODE, JMOM, JSV_NAME
+INTEGER :: INMOMENTS_DST, INMOMENTS_SLT !Number of moments for dust or salt
+!
+!-------------------------------------------------------------------------------
+!
+
+!Associate the pointers
+CALL NSV_ASSOCIATE
+!
+LINI_NSV(KMI) = .TRUE.
+
+ILUOUT = TLUOUT%NLU
+
+ICHIDX = 0
+NSV_CHEM_LIST_A(KMI) = 0
+!
+! Users scalar variables are first considered
+!
+NSV_USER_A(KMI) = NSV_USER
+ISV = NSV_USER
+!
+! scalar variables used in microphysical schemes C2R2,KHKO and C3R5
+!
+IF (CCLOUD == 'C2R2' .OR. CCLOUD == 'C3R5' .OR. CCLOUD == 'KHKO' ) THEN
+  IF ((CCLOUD == 'C2R2' .AND. LSUPSAT) .OR. (CCLOUD == 'KHKO'.AND. LSUPSAT)) THEN
+   ! 4th scalar field = supersaturation
+    NSV_C2R2_A(KMI)    = 4
+  ELSE
+    NSV_C2R2_A(KMI)    = 3
+  END IF
+  NSV_C2R2BEG_A(KMI) = ISV+1
+  NSV_C2R2END_A(KMI) = ISV+NSV_C2R2_A(KMI)
+  ISV                = NSV_C2R2END_A(KMI)
+  IF (CCLOUD == 'C3R5') THEN  ! the SVs for C2R2 and C1R3 must be contiguous
+    NSV_C1R3_A(KMI)    = 2
+    NSV_C1R3BEG_A(KMI) = ISV+1
+    NSV_C1R3END_A(KMI) = ISV+NSV_C1R3_A(KMI)
+    ISV                = NSV_C1R3END_A(KMI)
+  ELSE
+    NSV_C1R3_A(KMI)    = 0
+  ! force First index to be superior to last index
+  ! in order to create a null section
+    NSV_C1R3BEG_A(KMI) = 1
+    NSV_C1R3END_A(KMI) = 0
+  END IF
+ELSE
+  NSV_C2R2_A(KMI)    = 0
+  NSV_C1R3_A(KMI)    = 0
+! force First index to be superior to last index
+! in order to create a null section
+  NSV_C2R2BEG_A(KMI) = 1
+  NSV_C2R2END_A(KMI) = 0
+  NSV_C1R3BEG_A(KMI) = 1
+  NSV_C1R3END_A(KMI) = 0
+END IF
+!
+! scalar variables used in the LIMA microphysical scheme
+!
+CALL LIMA_UPDATE_NSV(LDINIT=.TRUE., KMI=KMI, KSV=ISV, CDCLOUD=CCLOUD, LDUPDATE=.FALSE.)
+IF (CCLOUD == 'LIMA' ) THEN
+
+  IF ( NMOD_IFN > 0 ) THEN
+    IF ( .NOT. ASSOCIATED( NIMM ) ) CALL PARAM_LIMA_ALLOCATE('NIMM', NMOD_CCN)
+    NIMM(:) = 0
+    IF ( ASSOCIATED( NINDICE_CCN_IMM ) ) CALL PARAM_LIMA_DEALLOCATE('NINDICE_CCN_IMM')
+    CALL PARAM_LIMA_ALLOCATE('NINDICE_CCN_IMM', MAX( 1, NMOD_IMM ))
+    IF (NMOD_IMM > 0 ) THEN
+      DO JI = 0, NMOD_IMM - 1
+        NIMM(NMOD_CCN - JI) = 1
+        NINDICE_CCN_IMM(NMOD_IMM - JI) = NMOD_CCN - JI
+      END DO
+!     ELSE IF (NMOD_IMM == 0) THEN ! PNIS exists but is 0 for the call to resolved_cloud
+!       NMOD_IMM = 1
+!       NINDICE_CCN_IMM(1) = 0
+    END IF
+  END IF
+END IF ! CCLOUD = LIMA
+!
+!
+!  Add one scalar for negative ion
+!   First variable: positive ion (NSV_ELECBEG_A index number)
+!   Last  --------: negative ion (NSV_ELECEND_A index number)
+! Correspondence for ICE3:
+! Relative index    1       2        3       4      5      6       7
+! Charge for     ion+     cloud    rain     ice   snow  graupel  ion-
+!
+! Correspondence for ICE4:
+! Relative index    1       2        3       4      5      6       7       8
+! Charge for     ion+     cloud    rain     ice   snow  graupel   hail   ion-
+!
+IF (CELEC /= 'NONE') THEN
+  IF (CCLOUD == 'ICE3') THEN
+    NSV_ELEC_A(KMI)   = 7 
+    NSV_ELECBEG_A(KMI)= ISV+1
+    NSV_ELECEND_A(KMI)= ISV+NSV_ELEC_A(KMI)
+    ISV               = NSV_ELECEND_A(KMI)
+    CELECNAMES(7) = CELECNAMES(8) 
+  ELSE IF (CCLOUD == 'ICE4') THEN
+    NSV_ELEC_A(KMI)   = 8 
+    NSV_ELECBEG_A(KMI)= ISV+1
+    NSV_ELECEND_A(KMI)= ISV+NSV_ELEC_A(KMI)
+    ISV               = NSV_ELECEND_A(KMI)
+  END IF
+ELSE
+  NSV_ELEC_A(KMI)    = 0
+! force First index to be superior to last index
+! in order to create a null section
+  NSV_ELECBEG_A(KMI) = 1
+  NSV_ELECEND_A(KMI) = 0
+END IF
+!
+! scalar variables used as lagragian variables
+!
+IF (LLG) THEN
+  NSV_LG_A(KMI)     = 3
+  NSV_LGBEG_A(KMI)  = ISV+1
+  NSV_LGEND_A(KMI)  = ISV+NSV_LG_A(KMI)
+  ISV               = NSV_LGEND_A(KMI)
+ELSE
+  NSV_LG_A(KMI)     = 0
+! force First index to be superior to last index
+! in order to create a null section
+  NSV_LGBEG_A(KMI)  = 1
+  NSV_LGEND_A(KMI)  = 0
+END IF
+!
+! scalar variables used as LiNOX passive tracer
+!
+! In case without chemistry
+IF (LPASPOL) THEN
+  NSV_PP_A(KMI)   = NRELEASE
+  NSV_PPBEG_A(KMI)= ISV+1
+  NSV_PPEND_A(KMI)= ISV+NSV_PP_A(KMI)
+  ISV               = NSV_PPEND_A(KMI)
+ELSE
+  NSV_PP_A(KMI)   = 0
+! force First index to be superior to last index
+! in order to create a null section
+  NSV_PPBEG_A(KMI)= 1
+  NSV_PPEND_A(KMI)= 0
+END IF
+!
+#ifdef MNH_FOREFIRE
+! ForeFire tracers
+IF (LFOREFIRE .AND. NFFSCALARS .GT. 0) THEN
+  NSV_FF_A(KMI)    = NFFSCALARS
+  NSV_FFBEG_A(KMI) = ISV+1
+  NSV_FFEND_A(KMI) = ISV+NSV_FF_A(KMI)
+  ISV              = NSV_FFEND_A(KMI)
+ELSE
+  NSV_FF_A(KMI)   = 0
+! force First index to be superior to last index
+! in order to create a null section
+  NSV_FFBEG_A(KMI)= 1
+  NSV_FFEND_A(KMI)= 0
+END IF
+#endif
+! Blaze tracers
+IF (LBLAZE .AND. NNBSMOKETRACER .GT. 0) THEN
+  NSV_FIRE_A(KMI)    = NNBSMOKETRACER
+  NSV_FIREBEG_A(KMI) = ISV+1
+  NSV_FIREEND_A(KMI) = ISV+NSV_FIRE_A(KMI)
+  ISV              = NSV_FIREEND_A(KMI)
+ELSE
+  NSV_FIRE_A(KMI)   = 0
+! force First index to be superior to last index
+! in order to create a null section
+  NSV_FIREBEG_A(KMI)= 1
+  NSV_FIREEND_A(KMI)= 0
+END IF
+!
+! Conditional sampling variables  
+IF (LCONDSAMP) THEN
+  NSV_CS_A(KMI)   = NCONDSAMP
+  NSV_CSBEG_A(KMI)= ISV+1
+  NSV_CSEND_A(KMI)= ISV+NSV_CS_A(KMI)
+  ISV               = NSV_CSEND_A(KMI)
+ELSE
+  NSV_CS_A(KMI)   = 0
+! force First index to be superior to last index
+! in order to create a null section
+  NSV_CSBEG_A(KMI)= 1
+  NSV_CSEND_A(KMI)= 0
+END IF
+!
+! scalar variables used in chemical core system
+!
+IF (LUSECHEM) THEN
+  CALL CH_INIT_SCHEME_n(KMI,LUSECHAQ,LUSECHIC,LCH_PH,ILUOUT,NVERB)
+  IF (LORILAM) CALL CH_AER_INIT_SOA(ILUOUT, NVERB)
+END IF
+
+IF (LUSECHEM .AND.(NEQ .GT. 0)) THEN
+  NSV_CHEM_A(KMI)   = NEQ
+  NSV_CHEMBEG_A(KMI)= ISV+1
+  NSV_CHEMEND_A(KMI)= ISV+NSV_CHEM_A(KMI)
+  ISV               = NSV_CHEMEND_A(KMI)
+  NSV_CHEM_LIST_A(KMI) = NSV_CHEM_LIST_A(KMI) + NSV_CHEM_A(KMI)
+ELSE
+  NSV_CHEM_A(KMI)   = 0
+! force First index to be superior to last index
+! in order to create a null section
+  NSV_CHEMBEG_A(KMI)= 1
+  NSV_CHEMEND_A(KMI)= 0
+END IF
+!
+! aqueous chemistry (part of the "chem" variables)       
+!                                                        
+IF ((LUSECHAQ .OR. LCHAQDIAG).AND.(NEQ .GT. 0)) THEN     
+  NSV_CHGS_A(KMI) = NEQ-NEQAQ                            
+  NSV_CHGSBEG_A(KMI)= NSV_CHEMBEG_A(KMI)                 
+  NSV_CHGSEND_A(KMI)= NSV_CHEMBEG_A(KMI)+(NEQ-NEQAQ)-1   
+  NSV_CHAC_A(KMI) = NEQAQ                                
+  NSV_CHACBEG_A(KMI)= NSV_CHGSEND_A(KMI)+1               
+  NSV_CHACEND_A(KMI)= NSV_CHEMEND_A(KMI)                 
+!  ice phase chemistry
+  IF (LUSECHIC) THEN
+    NSV_CHIC_A(KMI) = NEQAQ/2. -1.
+    NSV_CHICBEG_A(KMI)= ISV+1
+    NSV_CHICEND_A(KMI)= ISV+NSV_CHIC_A(KMI)
+    ISV               = NSV_CHICEND_A(KMI)
+    NSV_CHEM_LIST_A(KMI) = NSV_CHEM_LIST_A(KMI) + NSV_CHIC_A(KMI)
+  ELSE
+    NSV_CHIC_A(KMI) = 0
+    NSV_CHICBEG_A(KMI)= 1
+    NSV_CHICEND_A(KMI)= 0
+  ENDIF
+ELSE                                                     
+  IF (NEQ .GT. 0) THEN
+    NSV_CHGS_A(KMI) = NEQ-NEQAQ                            
+    NSV_CHGSBEG_A(KMI)= NSV_CHEMBEG_A(KMI)                 
+    NSV_CHGSEND_A(KMI)= NSV_CHEMBEG_A(KMI)+(NEQ-NEQAQ)-1   
+    NSV_CHAC_A(KMI) = 0                                    
+    NSV_CHACBEG_A(KMI)= 1                                  
+    NSV_CHACEND_A(KMI)= 0                                  
+    NSV_CHIC_A(KMI) = 0
+    NSV_CHICBEG_A(KMI)= 1
+    NSV_CHICEND_A(KMI)= 0
+  ELSE
+    NSV_CHGS_A(KMI) = 0
+    NSV_CHGSBEG_A(KMI)= 1
+    NSV_CHGSEND_A(KMI)= 0
+    NSV_CHAC_A(KMI) = 0
+    NSV_CHACBEG_A(KMI)= 1
+    NSV_CHACEND_A(KMI)= 0   
+    NSV_CHIC_A(KMI) = 0
+    NSV_CHICBEG_A(KMI)= 1
+    NSV_CHICEND_A(KMI)= 0    
+  ENDIF
+END IF
+! aerosol variables
+IF (LORILAM.AND.(NEQ .GT. 0)) THEN
+  NM6_AER = 0
+  IF (LVARSIGI) NM6_AER = 1
+  IF (LVARSIGJ) NM6_AER = NM6_AER + 1
+  NSV_AER_A(KMI)   = (NSP+NCARB+NSOA+1)*JPMODE + NM6_AER
+  NSV_AERBEG_A(KMI)= ISV+1
+  NSV_AEREND_A(KMI)= ISV+NSV_AER_A(KMI)
+  ISV              = NSV_AEREND_A(KMI)
+  NSV_CHEM_LIST_A(KMI) = NSV_CHEM_LIST_A(KMI) + NSV_AER_A(KMI)
+
+  ALLOCATE( YAEROLONGNAMES(NSV_AER_A(KMI)) )
+ELSE
+  NSV_AER_A(KMI)   = 0
+! force First index to be superior to last index
+! in order to create a null section
+  NSV_AERBEG_A(KMI)= 1
+  NSV_AEREND_A(KMI)= 0
+END IF
+IF (LORILAM .AND. LDEPOS_AER(KMI)) THEN
+  NSV_AERDEP_A(KMI)   = JPMODE*2
+  NSV_AERDEPBEG_A(KMI)= ISV+1
+  NSV_AERDEPEND_A(KMI)= ISV+NSV_AERDEP_A(KMI)
+  ISV                  = NSV_AERDEPEND_A(KMI)       
+  NSV_CHEM_LIST_A(KMI) = NSV_CHEM_LIST_A(KMI) + NSV_AERDEP_A(KMI)
+ELSE
+  NSV_AERDEP_A(KMI)   = 0
+! force First index to be superior to last index
+! in order to create a null section
+  NSV_AERDEPBEG_A(KMI)= 1
+  NSV_AERDEPEND_A(KMI)= 0       
+! force First index to be superior to last index
+! in order to create a null section
+END IF
+!
+! scalar variables used in dust model
+!
+IF (LDUST) THEN
+  IF (ALLOCATED(XT_LS).AND. .NOT.(LDSTPRES)) LDSTINIT=.TRUE.
+  IF (CPROGRAM == 'IDEAL ') LVARSIG = .TRUE.
+  IF ((CPROGRAM == 'REAL  ').AND.LDSTINIT) LVARSIG = .TRUE.
+  !Determine number of moments
+  IF ( LRGFIX_DST ) THEN
+    INMOMENTS_DST = 1
+    IF ( LVARSIG ) CALL Print_msg( NVERB_WARNING, 'GEN', 'INI_NSV', 'LVARSIG forced to FALSE because LRGFIX_DST is TRUE' )
+    LVARSIG = .FALSE.
+  ELSE IF ( LVARSIG ) THEN
+    INMOMENTS_DST = 3
+  ELSE
+    INMOMENTS_DST = 2
+  END IF
+  !Number of entries = number of moments multiplied by number of modes
+  NSV_DST_A(KMI) = NMODE_DST * INMOMENTS_DST
+  NSV_DSTBEG_A(KMI)= ISV+1
+  NSV_DSTEND_A(KMI)= ISV+NSV_DST_A(KMI)
+  ISV              = NSV_DSTEND_A(KMI)
+  NSV_CHEM_LIST_A(KMI) = NSV_CHEM_LIST_A(KMI) + NSV_DST_A(KMI)
+ELSE
+  NSV_DST_A(KMI)   = 0
+! force First index to be superior to last index
+! in order to create a null section
+  NSV_DSTBEG_A(KMI)= 1
+  NSV_DSTEND_A(KMI)= 0
+END IF
+IF ( LDUST .AND. LDEPOS_DST(KMI) ) THEN
+  NSV_DSTDEP_A(KMI)   = NMODE_DST*2
+  NSV_DSTDEPBEG_A(KMI)= ISV+1
+  NSV_DSTDEPEND_A(KMI)= ISV+NSV_DSTDEP_A(KMI)
+  ISV                  = NSV_DSTDEPEND_A(KMI)       
+  NSV_CHEM_LIST_A(KMI) = NSV_CHEM_LIST_A(KMI) + NSV_DSTDEP_A(KMI)
+ELSE
+  NSV_DSTDEP_A(KMI)   = 0
+! force First index to be superior to last index
+! in order to create a null section
+  NSV_DSTDEPBEG_A(KMI)= 1
+  NSV_DSTDEPEND_A(KMI)= 0       
+! force First index to be superior to last index
+! in order to create a null section
+
+ END IF
+! scalar variables used in sea salt model
+!
+IF (LSALT) THEN
+  IF (ALLOCATED(XT_LS).AND. .NOT.(LSLTPRES)) LSLTINIT=.TRUE.
+  IF (CPROGRAM == 'IDEAL ') LVARSIG_SLT = .TRUE.
+  IF ((CPROGRAM == 'REAL  ').AND. LSLTINIT ) LVARSIG_SLT = .TRUE.
+  !Determine number of moments
+  IF ( LRGFIX_SLT ) THEN
+    INMOMENTS_SLT = 1
+    IF ( LVARSIG_SLT ) CALL Print_msg( NVERB_WARNING, 'GEN', 'INI_NSV', 'LVARSIG_SLT forced to FALSE because LRGFIX_SLT is TRUE' )
+    LVARSIG_SLT = .FALSE.
+  ELSE IF ( LVARSIG_SLT ) THEN
+    INMOMENTS_SLT = 3
+  ELSE
+    INMOMENTS_SLT = 2
+  END IF
+  !Number of entries = number of moments multiplied by number of modes
+  NSV_SLT_A(KMI) = NMODE_SLT * INMOMENTS_SLT
+  NSV_SLTBEG_A(KMI)= ISV+1
+  NSV_SLTEND_A(KMI)= ISV+NSV_SLT_A(KMI)
+  ISV              = NSV_SLTEND_A(KMI)
+  NSV_CHEM_LIST_A(KMI) = NSV_CHEM_LIST_A(KMI) + NSV_SLT_A(KMI)
+ELSE
+  NSV_SLT_A(KMI)   = 0
+! force First index to be superior to last index
+! in order to create a null section
+  NSV_SLTBEG_A(KMI)= 1
+  NSV_SLTEND_A(KMI)= 0
+END IF
+IF ( LSALT .AND. LDEPOS_SLT(KMI) ) THEN
+  NSV_SLTDEP_A(KMI)   = NMODE_SLT*2
+  NSV_SLTDEPBEG_A(KMI)= ISV+1
+  NSV_SLTDEPEND_A(KMI)= ISV+NSV_SLTDEP_A(KMI)
+  ISV                  = NSV_SLTDEPEND_A(KMI)       
+  NSV_CHEM_LIST_A(KMI) = NSV_CHEM_LIST_A(KMI) + NSV_SLTDEP_A(KMI)
+ELSE
+  NSV_SLTDEP_A(KMI)   = 0
+! force First index to be superior to last index
+! in order to create a null section
+  NSV_SLTDEPBEG_A(KMI)= 1
+  NSV_SLTDEPEND_A(KMI)= 0       
+! force First index to be superior to last index
+! in order to create a null section
+END IF
+!
+! scalar variables used in blowing snow model
+!
+IF (LBLOWSNOW) THEN
+  NSV_SNW_A(KMI)   = NBLOWSNOW3D
+  NSV_SNWBEG_A(KMI)= ISV+1
+  NSV_SNWEND_A(KMI)= ISV+NSV_SNW_A(KMI)
+  ISV              = NSV_SNWEND_A(KMI)
+ELSE
+  NSV_SNW_A(KMI)   = 0
+! force First index to be superior to last index
+! in order to create a null section
+  NSV_SNWBEG_A(KMI)= 1
+  NSV_SNWEND_A(KMI)= 0
+END IF
+!
+! scalar variables used as LiNOX passive tracer
+!
+! In case without chemistry
+IF (.NOT.(LUSECHEM.OR.LCHEMDIAG) .AND. (LCH_CONV_LINOX.OR.LLNOX_EXPLICIT)) THEN
+  NSV_LNOX_A(KMI)   = 1
+  NSV_LNOXBEG_A(KMI)= ISV+1
+  NSV_LNOXEND_A(KMI)= ISV+NSV_LNOX_A(KMI)
+  ISV               = NSV_LNOXEND_A(KMI)
+  NSV_CHEM_LIST_A(KMI) = NSV_CHEM_LIST_A(KMI) + NSV_LNOX_A(KMI)
+ELSE
+  NSV_LNOX_A(KMI)   = 0
+! force First index to be superior to last index
+! in order to create a null section
+  NSV_LNOXBEG_A(KMI)= 1
+  NSV_LNOXEND_A(KMI)= 0
+END IF
+!
+! Final number of NSV variables
+!
+NSV_A(KMI) = ISV
+!
+!
+!*        Update LHORELAX_SV,CGETSVM,CGETSVT for NON USER SV 
+!
+! C2R2  or KHKO SV case
+!*BUG*JPC*MAR2006
+! IF (CCLOUD == 'C2R2'  .OR. CCLOUD == 'KHKO' ) &
+IF (CCLOUD == 'C2R2' .OR. CCLOUD == 'C3R5' .OR.  CCLOUD == 'KHKO' ) &
+!*BUG*JPC*MAR2006
+LHORELAX_SV(NSV_C2R2BEG_A(KMI):NSV_C2R2END_A(KMI))=LHORELAX_SVC2R2
+! C3R5 SV case
+IF (CCLOUD == 'C3R5') &
+LHORELAX_SV(NSV_C1R3BEG_A(KMI):NSV_C1R3END_A(KMI))=LHORELAX_SVC1R3
+! LIMA SV case
+IF (CCLOUD == 'LIMA') &
+LHORELAX_SV(NSV_LIMA_BEG_A(KMI):NSV_LIMA_END_A(KMI))=LHORELAX_SVLIMA
+! Electrical SV case
+IF (CELEC /= 'NONE') &
+LHORELAX_SV(NSV_ELECBEG_A(KMI):NSV_ELECEND_A(KMI))=LHORELAX_SVELEC
+! Chemical SV case
+IF (LUSECHEM .OR. LCHEMDIAG) &
+LHORELAX_SV(NSV_CHEMBEG_A(KMI):NSV_CHEMEND_A(KMI))=LHORELAX_SVCHEM
+! Ice phase Chemical SV case
+IF (LUSECHIC) &
+LHORELAX_SV(NSV_CHICBEG_A(KMI):NSV_CHICEND_A(KMI))=LHORELAX_SVCHIC
+! LINOX SV case
+IF (.NOT.(LUSECHEM .OR. LCHEMDIAG) .AND. LCH_CONV_LINOX) &
+LHORELAX_SV(NSV_LNOXBEG_A(KMI):NSV_LNOXEND_A(KMI))=LHORELAX_SVCHEM
+! Dust SV case
+IF (LDUST) &
+LHORELAX_SV(NSV_DSTBEG_A(KMI):NSV_DSTEND_A(KMI))=LHORELAX_SVDST
+! Sea Salt SV case
+IF (LSALT) &
+LHORELAX_SV(NSV_SLTBEG_A(KMI):NSV_SLTEND_A(KMI))=LHORELAX_SVSLT
+! Aerosols SV case
+IF (LORILAM) &
+LHORELAX_SV(NSV_AERBEG_A(KMI):NSV_AEREND_A(KMI))=LHORELAX_SVAER
+! Lagrangian variables
+IF (LLG) &
+LHORELAX_SV(NSV_LGBEG_A(KMI):NSV_LGEND_A(KMI))=LHORELAX_SVLG
+! Passive pollutants  
+IF (LPASPOL) &
+LHORELAX_SV(NSV_PPBEG_A(KMI):NSV_PPEND_A(KMI))=LHORELAX_SVPP
+#ifdef MNH_FOREFIRE
+! Fire pollutants
+IF (LFOREFIRE) &
+LHORELAX_SV(NSV_FFBEG_A(KMI):NSV_FFEND_A(KMI))=LHORELAX_SVFF
+#endif
+! Blaze Fire pollutants
+IF (LBLAZE) &
+LHORELAX_SV(NSV_FIREBEG_A(KMI):NSV_FIREEND_A(KMI))=LHORELAX_SVFIRE
+! Conditional sampling
+IF (LCONDSAMP) &
+LHORELAX_SV(NSV_CSBEG_A(KMI):NSV_CSEND_A(KMI))=LHORELAX_SVCS
+! Blowing snow case
+IF (LBLOWSNOW) &
+LHORELAX_SV(NSV_SNWBEG_A(KMI):NSV_SNWEND_A(KMI))=LHORELAX_SVSNW
+! Update NSV* variables for model KMI
+CALL UPDATE_NSV(KMI)
+!
+!  SET MINIMUN VALUE FOR DIFFERENT SV GROUPS
+!
+XSVMIN(1:NSV_USER_A(KMI))=0.
+IF (CCLOUD == 'C2R2' .OR. CCLOUD == 'C3R5' .OR.  CCLOUD == 'KHKO' ) &
+XSVMIN(NSV_C2R2BEG_A(KMI):NSV_C2R2END_A(KMI))=0.
+IF (CCLOUD == 'C3R5') &
+XSVMIN(NSV_C1R3BEG_A(KMI):NSV_C1R3END_A(KMI))=0.
+IF (CCLOUD == 'LIMA') &
+XSVMIN(NSV_LIMA_BEG_A(KMI):NSV_LIMA_END_A(KMI))=0.
+IF (CELEC /= 'NONE') &
+XSVMIN(NSV_ELECBEG_A(KMI):NSV_ELECEND_A(KMI))=0.
+IF (LUSECHEM .OR. LCHEMDIAG) &
+XSVMIN(NSV_CHEMBEG_A(KMI):NSV_CHEMEND_A(KMI))=0.
+IF (LUSECHIC) &
+XSVMIN(NSV_CHICBEG_A(KMI):NSV_CHICEND_A(KMI))=0.
+IF (.NOT.(LUSECHEM .OR. LCHEMDIAG) .AND. LCH_CONV_LINOX) &
+XSVMIN(NSV_LNOXBEG_A(KMI):NSV_LNOXEND_A(KMI))=0.
+IF (LORILAM .OR. LCHEMDIAG) &
+XSVMIN(NSV_AERBEG_A(KMI):NSV_AEREND_A(KMI))=0.
+IF (LDUST) XSVMIN(NSV_DSTBEG_A(KMI):NSV_DSTEND_A(KMI))=XMNH_TINY
+IF ((LDUST).AND.(LDEPOS_DST(KMI))) &
+XSVMIN(NSV_DSTDEPBEG_A(KMI):NSV_DSTDEPEND_A(KMI))=XMNH_TINY
+IF (LSALT) XSVMIN(NSV_SLTBEG_A(KMI):NSV_SLTEND_A(KMI))=XMNH_TINY
+IF (LLG) THEN
+  XSVMIN(NSV_LGBEG_A(KMI))  =XLG1MIN
+  XSVMIN(NSV_LGBEG_A(KMI)+1)=XLG2MIN
+  XSVMIN(NSV_LGEND_A(KMI))  =XLG3MIN
+ENDIF
+IF ((LSALT).AND.(LDEPOS_SLT(KMI))) &
+XSVMIN(NSV_SLTDEPBEG_A(KMI):NSV_SLTDEPEND_A(KMI))=XMNH_TINY
+IF ((LORILAM).AND.(LDEPOS_AER(KMI))) &
+XSVMIN(NSV_AERDEPBEG_A(KMI):NSV_AERDEPEND_A(KMI))=XMNH_TINY
+IF (LPASPOL) XSVMIN(NSV_PPBEG_A(KMI):NSV_PPEND_A(KMI))=0.    
+#ifdef MNH_FOREFIRE      
+IF (LFOREFIRE) XSVMIN(NSV_FFBEG_A(KMI):NSV_FFEND_A(KMI))=0.
+#endif
+! Blaze smoke
+IF (LBLAZE) XSVMIN(NSV_FIREBEG_A(KMI):NSV_FIREEND_A(KMI))=0.
+!
+IF (LCONDSAMP) XSVMIN(NSV_CSBEG_A(KMI):NSV_CSEND_A(KMI))=0.   
+IF (LBLOWSNOW) XSVMIN(NSV_SNWBEG_A(KMI):NSV_SNWEND_A(KMI))=XMNH_TINY
+!
+!  NAME OF THE SCALAR VARIABLES IN THE DIFFERENT SV GROUPS
+!
+CSV_A(:, KMI) = '      '
+IF (LLG) THEN
+  CSV_A(NSV_LGBEG_A(KMI),   KMI) = 'X0     '
+  CSV_A(NSV_LGBEG_A(KMI)+1, KMI) = 'Y0     '
+  CSV_A(NSV_LGEND_A(KMI),   KMI) = 'Z0     '
+ENDIF
+
+! Initialize scalar variable names for dust
+IF ( LDUST ) THEN
+  IF ( NMODE_DST < 1 .OR. NMODE_DST > 3 ) CALL Print_msg( NVERB_FATAL, 'GEN', 'INI_NSV', 'NMODE_DST must in the 1 to 3 interval' )
+
+  ! Initialization of dust names
+  ! Was allocated for previous KMI
+  ! We assume that if LDUST=T on a model, NSV_DST_A(KMI) is the same for all
+  IF( .NOT. ALLOCATED( CDUSTNAMES ) ) THEN
+    ALLOCATE( CDUSTNAMES(NSV_DST_A(KMI)) )
+  ELSE IF ( SIZE( CDUSTNAMES ) /= NSV_DST_A(KMI) ) THEN
+    CALL Print_msg( NVERB_ERROR, 'GEN', 'INI_NSV', 'NSV_DST not the same for different model (if LDUST=T)' )
+    DEALLOCATE( CDUSTNAMES )
+    ALLOCATE( CDUSTNAMES(NSV_DST_A(KMI)) )
+  END IF
+  ALLOCATE( YDUSTLONGNAMES(NSV_DST_A(KMI)) )
+  !Loop on all dust modes
+  IF ( INMOMENTS_DST == 1 ) THEN
+    DO JMODE = 1, NMODE_DST
+      IMODEIDX = JPDUSTORDER(JMODE)
+      JSV_NAME = ( IMODEIDX - 1 ) * 3 + 2
+      CDUSTNAMES(JMODE) = YPDUST_INI(JSV_NAME)
+      !Add meaning of the ppv unit (here for moment 3)
+      YDUSTLONGNAMES(JMODE) = TRIM( YPDUST_INI(JSV_NAME) ) // ' [molec_{aer}/molec_{air}]'
+    END DO
+  ELSE
+    DO JMODE = 1,NMODE_DST
+      !Find which mode we are dealing with
+      IMODEIDX = JPDUSTORDER(JMODE)
+      DO JMOM = 1, INMOMENTS_DST
+        !Find which number this is of the list of scalars
+        JSV = ( JMODE - 1 ) * INMOMENTS_DST + JMOM
+        !Find what name this corresponds to, always 3 moments assumed in YPDUST_INI
+        JSV_NAME = ( IMODEIDX - 1) * 3 + JMOM
+        !Get the right CDUSTNAMES which should follow the list of scalars transported in XSVM/XSVT
+        CDUSTNAMES(JSV) = YPDUST_INI(JSV_NAME)
+        !Add meaning of the ppv unit
+        IF ( JMOM == 1 ) THEN !Corresponds to moment 0
+          YDUSTLONGNAMES(JSV) = TRIM( YPDUST_INI(JSV_NAME) ) // ' [nb_aerosols/molec_{air}]'
+        ELSE IF ( JMOM == 2 ) THEN !Corresponds to moment 3
+          YDUSTLONGNAMES(JSV) = TRIM( YPDUST_INI(JSV_NAME) ) // ' [molec_{aer}/molec_{air}]'
+        ELSE IF ( JMOM == 3 ) THEN !Corresponds to moment 6
+          YDUSTLONGNAMES(JSV) = TRIM( YPDUST_INI(JSV_NAME) ) // ' [um6/molec_{air}*(cm3/m3)]'
+        ELSE
+          CALL Print_msg( NVERB_WARNING, 'GEN', 'INI_NSV', 'unknown moment for DUST' )
+          YDUSTLONGNAMES(JMODE) = TRIM( YPDUST_INI(JSV_NAME) )
+        END IF
+      ENDDO ! Loop on moments
+    ENDDO    ! Loop on dust modes
+  END IF
+
+  ! Initialization of deposition scheme names
+  IF ( LDEPOS_DST(KMI) ) THEN
+    IF( .NOT. ALLOCATED( CDEDSTNAMES ) ) THEN
+      ALLOCATE( CDEDSTNAMES(NMODE_DST * 2) )
+      DO JMODE = 1, NMODE_DST
+        IMODEIDX = JPDUSTORDER(JMODE)
+        CDEDSTNAMES(JMODE)             = YPDEDST_INI(IMODEIDX)
+        CDEDSTNAMES(NMODE_DST + JMODE) = YPDEDST_INI(NMODE_DST + IMODEIDX)
+      ENDDO
+    END IF
+  END IF
+END IF
+
+! Initialize scalar variable names for salt
+IF ( LSALT ) THEN
+  IF ( NMODE_SLT < 1 .OR. NMODE_SLT > 8 ) CALL Print_msg( NVERB_FATAL, 'GEN', 'INI_NSV', 'NMODE_SLT must in the 1 to 8 interval' )
+
+  ! Was allocated for previous KMI
+  ! We assume that if LSALT=T on a model, NSV_SLT_A(KMI) is the same for all
+  IF( .NOT. ALLOCATED( CSALTNAMES ) ) THEN
+    ALLOCATE( CSALTNAMES(NSV_SLT_A(KMI)) )
+  ELSE IF ( SIZE( CSALTNAMES ) /= NSV_SLT_A(KMI) ) THEN
+    CALL Print_msg( NVERB_ERROR, 'GEN', 'INI_NSV', 'NSV_SLT not the same for different model (if LSALT=T)' )
+    DEALLOCATE( CSALTNAMES )
+    ALLOCATE( CSALTNAMES(NSV_SLT_A(KMI)) )
+  END IF
+  ALLOCATE( YSALTLONGNAMES(NSV_SLT_A(KMI)) )
+  !Loop on all dust modes
+  IF ( INMOMENTS_SLT == 1 ) THEN
+    DO JMODE = 1, NMODE_SLT
+      IMODEIDX = JPSALTORDER(JMODE)
+      JSV_NAME = ( IMODEIDX - 1 ) * 3 + 2
+      CSALTNAMES(JMODE) = YPSALT_INI(JSV_NAME)
+      !Add meaning of the ppv unit (here for moment 3)
+      YSALTLONGNAMES(JMODE) = TRIM( YPSALT_INI(JSV_NAME) ) // ' [molec_{aer}/molec_{air}]'
+    END DO
+  ELSE
+    DO JMODE = 1, NMODE_SLT
+      !Find which mode we are dealing with
+      IMODEIDX = JPSALTORDER(JMODE)
+      DO JMOM = 1, INMOMENTS_SLT
+        !Find which number this is of the list of scalars
+        JSV = ( JMODE - 1 ) * INMOMENTS_SLT + JMOM
+        !Find what name this corresponds to, always 3 moments assumed in YPSALT_INI
+        JSV_NAME = ( IMODEIDX - 1 ) * 3 + JMOM
+        !Get the right CSALTNAMES which should follow the list of scalars transported in XSVM/XSVT
+        CSALTNAMES(JSV) = YPSALT_INI(JSV_NAME)
+        !Add meaning of the ppv unit
+        IF ( JMOM == 1 ) THEN !Corresponds to moment 0
+          YSALTLONGNAMES(JSV) = TRIM( YPSALT_INI(JSV_NAME) ) // ' [nb_aerosols/molec_{air}]'
+        ELSE IF ( JMOM == 2 ) THEN !Corresponds to moment 3
+          YSALTLONGNAMES(JSV) = TRIM( YPSALT_INI(JSV_NAME) ) // ' [molec_{aer}/molec_{air}]'
+        ELSE IF ( JMOM == 3 ) THEN !Corresponds to moment 6
+          YSALTLONGNAMES(JSV) = TRIM( YPSALT_INI(JSV_NAME) ) // ' [um6/molec_{air}*(cm3/m3)]'
+        ELSE
+          CALL Print_msg( NVERB_WARNING, 'GEN', 'INI_NSV', 'unknown moment for SALT' )
+          YSALTLONGNAMES(JMODE) = TRIM( YPSALT_INI(JSV_NAME) )
+        END IF
+      ENDDO ! Loop on moments
+    ENDDO    ! Loop on dust modes
+  END IF
+
+  ! Initialization of deposition scheme
+  IF ( LDEPOS_SLT(KMI) ) THEN
+    IF( .NOT. ALLOCATED( CDESLTNAMES ) ) THEN
+      ALLOCATE( CDESLTNAMES(NMODE_SLT * 2) )
+      DO JMODE = 1, NMODE_SLT
+        IMODEIDX = JPSALTORDER(JMODE)
+        CDESLTNAMES(JMODE)             = YPDESLT_INI(IMODEIDX)
+        CDESLTNAMES(NMODE_SLT + JMODE) = YPDESLT_INI(NMODE_SLT + IMODEIDX)
+      ENDDO
+    ENDIF
+  ENDIF
+END IF
+
+! Initialize scalar variable names for snow
+IF ( LBLOWSNOW ) THEN
+  IF( .NOT. ALLOCATED( CSNOWNAMES ) ) THEN
+    ALLOCATE( CSNOWNAMES(NSV_SNW_A(KMI)) )
+    DO JMOM = 1, NSV_SNW_A(KMI)
+      CSNOWNAMES(JMOM) = YPSNOW_INI(JMOM)
+    END DO
+  END IF
+END IF
+
+!Fill metadata for model KMI
+DO JSV = 1, NSV_USER_A(KMI)
+  WRITE( YNUM3, '( I3.3 )' ) JSV
+
+  TSVLIST_A(JSV, KMI) = TFIELDMETADATA(         &
+    CMNHNAME   = 'SVUSER' // YNUM3,             &
+    CSTDNAME   = '',                            &
+    CLONGNAME  = 'SVUSER' // YNUM3,             &
+    CUNITS     = 'kg kg-1',                     &
+    CDIR       = 'XY',                          &
+    CCOMMENT   = 'X_Y_Z_' // 'SVUSER' // YNUM3, &
+    NGRID      = 1,                             &
+    NTYPE      = TYPEREAL,                      &
+    NDIMS      = 3,                             &
+    LTIMEDEP   = .TRUE.                         )
+END DO
+
+DO JSV = NSV_C2R2BEG_A(KMI), NSV_C2R2END_A(KMI)
+  WRITE( YNUM3, '( I3.3 )' ) JSV
+
+  TSVLIST_A(JSV, KMI) = TFIELDMETADATA(                       &
+    CMNHNAME   = TRIM( C2R2NAMES(JSV-NSV_C2R2BEG_A(KMI)+1) ), &
+    CSTDNAME   = '',                                          &
+    CLONGNAME  = TRIM( C2R2NAMES(JSV-NSV_C2R2BEG_A(KMI)+1) ), &
+    CUNITS     = 'm-3',                                       &
+    CDIR       = 'XY',                                        &
+    CCOMMENT   = 'X_Y_Z_' // 'SVT' // YNUM3,                  &
+    NGRID      = 1,                                           &
+    NTYPE      = TYPEREAL,                                    &
+    NDIMS      = 3,                                           &
+    LTIMEDEP   = .TRUE.                                       )
+END DO
+
+DO JSV = NSV_C1R3BEG_A(KMI), NSV_C1R3END_A(KMI)
+  WRITE( YNUM3, '( I3.3 )' ) JSV
+
+  TSVLIST_A(JSV, KMI) = TFIELDMETADATA(                       &
+    CMNHNAME   = TRIM( C1R3NAMES(JSV-NSV_C2R2BEG_A(KMI)+1) ), &
+    CSTDNAME   = '',                                          &
+    CLONGNAME  = TRIM( C1R3NAMES(JSV-NSV_C2R2BEG_A(KMI)+1) ), &
+    CUNITS     = 'm-3',                                       &
+    CDIR       = 'XY',                                        &
+    CCOMMENT   = 'X_Y_Z_' // 'SVT' // YNUM3,                  &
+    NGRID      = 1,                                           &
+    NTYPE      = TYPEREAL,                                    &
+    NDIMS      = 3,                                           &
+    LTIMEDEP   = .TRUE.                                       )
+END DO
+
+DO JSV = NSV_LIMA_BEG_A(KMI), NSV_LIMA_END_A(KMI)
+  WRITE( YNUM3, '( I3.3 )' ) JSV
+
+  TSVLIST_A(JSV, KMI) = TFIELDMETADATA(      &
+    CMNHNAME   = 'SV LIMA ' // YNUM3,        &
+    CSTDNAME   = '',                         &
+    CLONGNAME  = '',                         &
+    CUNITS     = 'kg-1',                     &
+    CDIR       = 'XY',                       &
+    CCOMMENT   = 'X_Y_Z_' // 'SVT' // YNUM3, &
+    NGRID      = 1,                          &
+    NTYPE      = TYPEREAL,                   &
+    NDIMS      = 3,                          &
+    LTIMEDEP   = .TRUE.                      )
+
+  IF ( JSV == NSV_LIMA_NC_A(KMI) ) THEN
+    TSVLIST_A(JSV, KMI)%CMNHNAME = TRIM( CLIMA_WARM_NAMES(1) )
+  ELSE IF ( JSV == NSV_LIMA_NR_A(KMI) ) THEN
+    TSVLIST_A(JSV, KMI)%CMNHNAME = TRIM( CLIMA_WARM_NAMES(2) )
+  ELSE IF ( JSV >= NSV_LIMA_CCN_FREE_A(KMI) .AND. JSV < NSV_LIMA_CCN_ACTI_A(KMI) ) THEN
+    WRITE( YNUM2, '( I2.2 )' ) JSV - NSV_LIMA_CCN_FREE_A(KMI) + 1
+    TSVLIST_A(JSV, KMI)%CMNHNAME = TRIM( CLIMA_WARM_NAMES(3) ) // YNUM2
+  ELSE IF (JSV >= NSV_LIMA_CCN_ACTI_A(KMI) .AND. JSV < ( NSV_LIMA_CCN_ACTI_A(KMI) + NMOD_CCN ) ) THEN
+    WRITE( YNUM2, '( I2.2 )' ) JSV - NSV_LIMA_CCN_ACTI_A(KMI) + 1
+    TSVLIST_A(JSV, KMI)%CMNHNAME = TRIM( CLIMA_WARM_NAMES(4) ) // YNUM2
+  ELSE IF ( JSV == NSV_LIMA_SCAVMASS_A(KMI) ) THEN
+    TSVLIST_A(JSV, KMI)%CMNHNAME = TRIM( CAERO_MASS(1) )
+    TSVLIST_A(JSV, KMI)%CUNITS = 'kg kg-1'
+  ELSE IF ( JSV == NSV_LIMA_NI_A(KMI) ) THEN
+    TSVLIST_A(JSV, KMI)%CMNHNAME = TRIM( CLIMA_COLD_NAMES(1) )
+  ELSE IF ( JSV == NSV_LIMA_NS_A(KMI) ) THEN
+    TSVLIST_A(JSV, KMI)%CMNHNAME = TRIM( CLIMA_COLD_NAMES(2) )
+  ELSE IF ( JSV == NSV_LIMA_NG_A(KMI) ) THEN
+    TSVLIST_A(JSV, KMI)%CMNHNAME = TRIM( CLIMA_COLD_NAMES(3) )
+  ELSE IF ( JSV == NSV_LIMA_NH_A(KMI) ) THEN
+    TSVLIST_A(JSV, KMI)%CMNHNAME = TRIM( CLIMA_COLD_NAMES(4) )
+  ELSE IF ( JSV >= NSV_LIMA_IFN_FREE_A(KMI) .AND. JSV < NSV_LIMA_IFN_NUCL_A(KMI) ) THEN
+    WRITE( YNUM2, '( I2.2 )' ) JSV - NSV_LIMA_IFN_FREE_A(KMI) + 1
+    TSVLIST_A(JSV, KMI)%CMNHNAME = TRIM( CLIMA_COLD_NAMES(5) ) // YNUM2
+  ELSE IF ( JSV >= NSV_LIMA_IFN_NUCL_A(KMI) .AND. JSV < ( NSV_LIMA_IFN_NUCL_A(KMI) + NMOD_IFN ) ) THEN
+    WRITE( YNUM2, '( I2.2 )' ) JSV - NSV_LIMA_IFN_NUCL_A(KMI) + 1
+    TSVLIST_A(JSV, KMI)%CMNHNAME = TRIM( CLIMA_COLD_NAMES(6) ) // YNUM2
+  ELSE IF ( JSV >= NSV_LIMA_IMM_NUCL_A(KMI) .AND. JSV < ( NSV_LIMA_IMM_NUCL_A(KMI) + NMOD_IMM ) ) THEN
+    WRITE( YNUM2, '( I2.2 )' ) NINDICE_CCN_IMM(JSV-NSV_LIMA_IMM_NUCL_A(KMI)+1)
+    TSVLIST_A(JSV, KMI)%CMNHNAME = TRIM( CLIMA_COLD_NAMES(7) ) // YNUM2
+  ELSE IF ( JSV == NSV_LIMA_HOM_HAZE_A(KMI) ) THEN
+    TSVLIST_A(JSV, KMI)%CMNHNAME = TRIM( CLIMA_COLD_NAMES(8) )
+  ELSE IF ( JSV == NSV_LIMA_SPRO_A(KMI) ) THEN
+    TSVLIST_A(JSV, KMI)%CUNITS = '1'
+    TSVLIST_A(JSV, KMI)%CMNHNAME = TRIM( CLIMA_WARM_NAMES(5) )
+  ELSE
+    CALL Print_msg( NVERB_FATAL, 'GEN', 'INI_NSV', 'invalid index for LIMA' )
+  END IF
+
+   TSVLIST_A(JSV, KMI)%CLONGNAME = TRIM( TSVLIST_A(JSV, KMI)%CMNHNAME )
+END DO
+
+DO JSV = NSV_ELECBEG_A(KMI), NSV_ELECEND_A(KMI)
+  IF ( JSV > NSV_ELECBEG .AND. JSV < NSV_ELECEND ) THEN
+    YUNITS = 'C kg-1'
+    WRITE( YCOMMENT, '( A6, A3, I3.3 )' ) 'X_Y_Z_', 'SVT', JSV
+  ELSE
+    YUNITS = 'kg-1'
+    WRITE( YCOMMENT, '( A6, A3, I3.3, A8 )' ) 'X_Y_Z_', 'SVT', JSV, ' (nb ions/kg)'
+  END IF
+
+  TSVLIST_A(JSV, KMI) = TFIELDMETADATA(                        &
+    CMNHNAME   = TRIM( CELECNAMES(JSV-NSV_ELECBEG_A(KMI)+1) ), &
+    CSTDNAME   = '',                                           &
+    CLONGNAME  = TRIM( CELECNAMES(JSV-NSV_ELECBEG_A(KMI)+1) ), &
+    CUNITS     = TRIM( YUNITS ),                               &
+    CDIR       = 'XY',                                         &
+    CCOMMENT   = TRIM( YCOMMENT ),                             &
+    NGRID      = 1,                                            &
+    NTYPE      = TYPEREAL,                                     &
+    NDIMS      = 3,                                            &
+    LTIMEDEP   = .TRUE.                                        )
+END DO
+
+DO JSV = NSV_LGBEG_A(KMI), NSV_LGEND_A(KMI)
+  WRITE( YNUM3, '( I3.3 )' ) JSV
+
+  TSVLIST_A(JSV, KMI) = TFIELDMETADATA(                    &
+    CMNHNAME   = TRIM( CLGNAMES(JSV-NSV_LGBEG_A(KMI)+1) ), &
+    CSTDNAME   = '',                                       &
+    CLONGNAME  = TRIM( CLGNAMES(JSV-NSV_LGBEG_A(KMI)+1) ), &
+    CUNITS     = 'm',                                      &
+    CDIR       = 'XY',                                     &
+    CCOMMENT   = 'X_Y_Z_' // 'SVT' // YNUM3,               &
+    NGRID      = 1,                                        &
+    NTYPE      = TYPEREAL,                                 &
+    NDIMS      = 3,                                        &
+    LTIMEDEP   = .TRUE.                                    )
+END DO
+
+DO JSV = NSV_PPBEG_A(KMI), NSV_PPEND_A(KMI)
+  WRITE( YNUM3, '( I3.3 )' ) JSV-NSV_PPBEG_A(KMI)+1
+
+  TSVLIST_A(JSV, KMI) = TFIELDMETADATA(      &
+    CMNHNAME   = 'SVPP' // YNUM3,            &
+    CSTDNAME   = '',                         &
+    CLONGNAME  = 'SVPP' // YNUM3,            &
+    CUNITS     = 'kg kg-1',                  &
+    CDIR       = 'XY',                       &
+    CCOMMENT   = 'X_Y_Z_' // 'SVT' // YNUM3, &
+    NGRID      = 1,                          &
+    NTYPE      = TYPEREAL,                   &
+    NDIMS      = 3,                          &
+    LTIMEDEP   = .TRUE.                      )
+END DO
+
+#ifdef MNH_FOREFIRE
+DO JSV = NSV_FFBEG_A(KMI), NSV_FFEND_A(KMI)
+  WRITE( YNUM3, '( I3.3 )' ) JSV-NSV_FFBEG_A(KMI)+1
+
+  TSVLIST_A(JSV, KMI) = TFIELDMETADATA(      &
+    CMNHNAME   = 'SVFF' // YNUM3,            &
+    CSTDNAME   = '',                         &
+    CLONGNAME  = 'SVFF' // YNUM3,            &
+    CUNITS     = 'kg kg-1',                  &
+    CDIR       = 'XY',                       &
+    CCOMMENT   = 'X_Y_Z_' // 'SVT' // YNUM3, &
+    NGRID      = 1,                          &
+    NTYPE      = TYPEREAL,                   &
+    NDIMS      = 3,                          &
+    LTIMEDEP   = .TRUE.                      )
+END DO
+#endif
+
+DO JSV = NSV_FIREBEG_A(KMI), NSV_FIREEND_A(KMI)
+  WRITE( YNUM3, '( I3.3 )' ) JSV-NSV_FIREBEG_A(KMI)+1
+
+  TSVLIST_A(JSV, KMI) = TFIELDMETADATA(      &
+    CMNHNAME   = 'SVFIRE' // YNUM3,          &
+    CSTDNAME   = '',                         &
+    CLONGNAME  = 'SVFIRE' // YNUM3,          &
+    CUNITS     = 'kg kg-1',                  &
+    CDIR       = 'XY',                       &
+    CCOMMENT   = 'X_Y_Z_' // 'SVT' // YNUM3, &
+    NGRID      = 1,                          &
+    NTYPE      = TYPEREAL,                   &
+    NDIMS      = 3,                          &
+    LTIMEDEP   = .TRUE.                      )
+END DO
+
+DO JSV = NSV_CSBEG_A(KMI), NSV_CSEND_A(KMI)
+  WRITE( YNUM3, '( I3.3 )' ) JSV-NSV_CSBEG_A(KMI)
+
+  TSVLIST_A(JSV, KMI) = TFIELDMETADATA(      &
+    CMNHNAME   = 'SVCS' // YNUM3,            &
+    CSTDNAME   = '',                         &
+    CLONGNAME  = 'SVCS' // YNUM3,            &
+    CUNITS     = 'kg kg-1',                  &
+    CDIR       = 'XY',                       &
+    CCOMMENT   = 'X_Y_Z_' // 'SVT' // YNUM3, &
+    NGRID      = 1,                          &
+    NTYPE      = TYPEREAL,                   &
+    NDIMS      = 3,                          &
+    LTIMEDEP   = .TRUE.                      )
+END DO
+
+DO JSV = NSV_CHEMBEG_A(KMI), NSV_CHEMEND_A(KMI)
+  ICHIDX = ICHIDX + 1
+  CSV_CHEM_LIST_A(ICHIDX, KMI) = TRIM( CNAMES(JSV-NSV_CHEMBEG_A(KMI)+1) )
+
+  WRITE( YNUM3, '( I3.3 )' ) JSV
+
+  TSVLIST_A(JSV, KMI) = TFIELDMETADATA(                    &
+    CMNHNAME   = TRIM( CNAMES(JSV-NSV_CHEMBEG_A(KMI)+1) ), &
+    CSTDNAME   = '',                                       &
+    CLONGNAME  = TRIM( CNAMES(JSV-NSV_CHEMBEG_A(KMI)+1) ), &
+    CUNITS     = 'ppv',                                    &
+    CDIR       = 'XY',                                     &
+    CCOMMENT   = 'X_Y_Z_' // 'SVT' // YNUM3,               &
+    NGRID      = 1,                                        &
+    NTYPE      = TYPEREAL,                                 &
+    NDIMS      = 3,                                        &
+    LTIMEDEP   = .TRUE.                                    )
+END DO
+
+DO JSV = NSV_CHICBEG_A(KMI), NSV_CHICEND_A(KMI)
+  ICHIDX = ICHIDX + 1
+  CSV_CHEM_LIST_A(ICHIDX, KMI) = TRIM( CICNAMES(JSV-NSV_CHICBEG_A(KMI)+1) )
+
+  WRITE( YNUM3, '( I3.3 )' ) JSV
+
+  TSVLIST_A(JSV, KMI) = TFIELDMETADATA(                      &
+    CMNHNAME   = TRIM( CICNAMES(JSV-NSV_CHICBEG_A(KMI)+1) ), &
+    CSTDNAME   = '',                                         &
+    CLONGNAME  = TRIM( CICNAMES(JSV-NSV_CHICBEG_A(KMI)+1) ), &
+    CUNITS     = 'ppv',                                      &
+    CDIR       = 'XY',                                       &
+    CCOMMENT   = 'X_Y_Z_' // 'SVT' // YNUM3,                 &
+    NGRID      = 1,                                          &
+    NTYPE      = TYPEREAL,                                   &
+    NDIMS      = 3,                                          &
+    LTIMEDEP   = .TRUE.                                      )
+END DO
+
+DO JSV = NSV_AERBEG_A(KMI), NSV_AEREND_A(KMI)
+  ICHIDX = ICHIDX + 1
+  CSV_CHEM_LIST_A(ICHIDX, KMI) = TRIM( CAERONAMES(JSV-NSV_AERBEG_A(KMI)+1) )
+
+  WRITE( YNUM3, '( I3.3 )' ) JSV
+
+  !Determine moment to add meaning of the ppv unit
+  JAER = JSV - NSV_AERBEG_A(KMI) + 1
+  IF ( ANY( JAER == [JP_CH_M0i, JP_CH_M0j] ) ) THEN
+    !Moment 0
+    YAEROLONGNAMES = TRIM( CAERONAMES(JAER) ) // ' [nb_aerosols/molec_{air}]'
+  ELSE IF ( ANY( JAER == [ JP_CH_SO4i, JP_CH_SO4j, JP_CH_NO3i, JP_CH_NO3j, JP_CH_H2Oi, JP_CH_H2Oj, JP_CH_NH3i, JP_CH_NH3j,   &
+                           JP_CH_OCi,  JP_CH_OCj,  JP_CH_BCi,  JP_CH_BCj,  JP_CH_DSTi, JP_CH_DSTj ] )                        &
+            .OR. ( NSOA == 10 .AND.                                                                                          &
+                   ANY( JAER == [ JP_CH_SOA1i, JP_CH_SOA1j, JP_CH_SOA2i, JP_CH_SOA2j, JP_CH_SOA3i, JP_CH_SOA3j, JP_CH_SOA4i, &
+                                  JP_CH_SOA4j, JP_CH_SOA5i, JP_CH_SOA5j, JP_CH_SOA6i, JP_CH_SOA6j, JP_CH_SOA7i, JP_CH_SOA7j, &
+                                  JP_CH_SOA8i, JP_CH_SOA8j, JP_CH_SOA9i, JP_CH_SOA9j, JP_CH_SOA10i, JP_CH_SOA10j ] )       ) ) THEN
+    !Moment 3
+    YAEROLONGNAMES = TRIM( CAERONAMES(JAER) ) // ' [molec_{aer}/molec_{air}]'
+  ELSE IF ( ( LVARSIGI .AND. JAER == JP_CH_M6i ) .OR. ( LVARSIGJ .AND. JAER == JP_CH_M6j ) ) THEN
+    !Moment 6
+    YAEROLONGNAMES = TRIM( CAERONAMES(JAER) ) // ' [um6/molec_{air}*(cm3/m3)]'
+  ELSE
+    CALL Print_msg( NVERB_WARNING, 'GEN', 'INI_NSV', 'unknown moment for AER' )
+    YAEROLONGNAMES = TRIM( CAERONAMES(JAER) )
+  END IF
+
+  TSVLIST_A(JSV, KMI) = TFIELDMETADATA(                           &
+    CMNHNAME   = TRIM( CAERONAMES(JSV-NSV_AERBEG_A(KMI)+1) ),     &
+    CSTDNAME   = '',                                              &
+    CLONGNAME  = TRIM( YAEROLONGNAMES(JSV-NSV_AERBEG_A(KMI)+1) ), &
+    CUNITS     = 'ppv',                                           &
+    CDIR       = 'XY',                                            &
+    CCOMMENT   = 'X_Y_Z_' // 'SVT' // YNUM3,                      &
+    NGRID      = 1,                                               &
+    NTYPE      = TYPEREAL,                                        &
+    NDIMS      = 3,                                               &
+    LTIMEDEP   = .TRUE.                                           )
+END DO
+
+DO JSV = NSV_AERDEPBEG_A(KMI), NSV_AERDEPEND_A(KMI)
+  ICHIDX = ICHIDX + 1
+  CSV_CHEM_LIST_A(ICHIDX, KMI) = TRIM( CDEAERNAMES(JSV-NSV_AERDEPBEG_A(KMI)+1) )
+
+  WRITE( YNUM3, '( I3.3 )' ) JSV
+
+  TSVLIST_A(JSV, KMI) = TFIELDMETADATA(                           &
+    CMNHNAME   = TRIM( CDEAERNAMES(JSV-NSV_AERDEPBEG_A(KMI)+1) ), &
+    CSTDNAME   = '',                                              &
+    CLONGNAME  = TRIM( CDEAERNAMES(JSV-NSV_AERDEPBEG_A(KMI)+1) ), &
+    CUNITS     = 'ppv',                                           &
+    CDIR       = 'XY',                                            &
+    CCOMMENT   = 'X_Y_Z_' // 'SVT' // YNUM3,                      &
+    NGRID      = 1,                                               &
+    NTYPE      = TYPEREAL,                                        &
+    NDIMS      = 3,                                               &
+    LTIMEDEP   = .TRUE.                                           )
+END DO
+
+DO JSV = NSV_DSTBEG_A(KMI), NSV_DSTEND_A(KMI)
+  ICHIDX = ICHIDX + 1
+  CSV_CHEM_LIST_A(ICHIDX, KMI) = TRIM( CDUSTNAMES(JSV-NSV_DSTBEG_A(KMI)+1) )
+
+  WRITE( YNUM3, '( I3.3 )' ) JSV
+
+  TSVLIST_A(JSV, KMI) = TFIELDMETADATA(                           &
+    CMNHNAME   = TRIM( CDUSTNAMES(JSV-NSV_DSTBEG_A(KMI)+1) ),     &
+    CSTDNAME   = '',                                              &
+    CLONGNAME  = TRIM( YDUSTLONGNAMES(JSV-NSV_DSTBEG_A(KMI)+1) ), &
+    CUNITS     = 'ppv',                                           &
+    CDIR       = 'XY',                                            &
+    CCOMMENT   = 'X_Y_Z_' // 'SVT' // YNUM3,                      &
+    NGRID      = 1,                                               &
+    NTYPE      = TYPEREAL,                                        &
+    NDIMS      = 3,                                               &
+    LTIMEDEP   = .TRUE.                                           )
+END DO
+
+DO JSV = NSV_DSTDEPBEG_A(KMI), NSV_DSTDEPEND_A(KMI)
+  ICHIDX = ICHIDX + 1
+  CSV_CHEM_LIST_A(ICHIDX, KMI) = TRIM( CDEDSTNAMES(JSV-NSV_DSTDEPBEG_A(KMI)+1) )
+
+  WRITE( YNUM3, '( I3.3 )' ) JSV
+
+  TSVLIST_A(JSV, KMI) = TFIELDMETADATA(                           &
+    CMNHNAME   = TRIM( CDEDSTNAMES(JSV-NSV_DSTDEPBEG_A(KMI)+1) ), &
+    CSTDNAME   = '',                                              &
+    CLONGNAME  = TRIM( CDEDSTNAMES(JSV-NSV_DSTDEPBEG_A(KMI)+1) ), &
+    CUNITS     = 'ppv',                                           &
+    CDIR       = 'XY',                                            &
+    CCOMMENT   = 'X_Y_Z_' // 'SVT' // YNUM3,                      &
+    NGRID      = 1,                                               &
+    NTYPE      = TYPEREAL,                                        &
+    NDIMS      = 3,                                               &
+    LTIMEDEP   = .TRUE.                                           )
+END DO
+
+DO JSV = NSV_SLTBEG_A(KMI), NSV_SLTEND_A(KMI)
+  ICHIDX = ICHIDX + 1
+  CSV_CHEM_LIST_A(ICHIDX, KMI) = TRIM( CSALTNAMES(JSV-NSV_SLTBEG_A(KMI)+1) )
+
+  WRITE( YNUM3, '( I3.3 )' ) JSV
+
+  TSVLIST_A(JSV, KMI) = TFIELDMETADATA(                           &
+    CMNHNAME   = TRIM( CSALTNAMES(JSV-NSV_SLTBEG_A(KMI)+1) ),     &
+    CSTDNAME   = '',                                              &
+    CLONGNAME  = TRIM( YSALTLONGNAMES(JSV-NSV_SLTBEG_A(KMI)+1) ), &
+    CUNITS     = 'ppv',                                           &
+    CDIR       = 'XY',                                            &
+    CCOMMENT   = 'X_Y_Z_' // 'SVT' // YNUM3,                      &
+    NGRID      = 1,                                               &
+    NTYPE      = TYPEREAL,                                        &
+    NDIMS      = 3,                                               &
+    LTIMEDEP   = .TRUE.                                           )
+END DO
+
+DO JSV = NSV_SLTDEPBEG_A(KMI), NSV_SLTDEPEND_A(KMI)
+  ICHIDX = ICHIDX + 1
+  CSV_CHEM_LIST_A(ICHIDX, KMI) = TRIM( CDESLTNAMES(JSV-NSV_SLTDEPBEG_A(KMI)+1) )
+
+  WRITE( YNUM3, '( I3.3 )' ) JSV
+
+  TSVLIST_A(JSV, KMI) = TFIELDMETADATA(                           &
+    CMNHNAME   = TRIM( CDESLTNAMES(JSV-NSV_SLTDEPBEG_A(KMI)+1) ), &
+    CSTDNAME   = '',                                              &
+    CLONGNAME  = TRIM( CDESLTNAMES(JSV-NSV_SLTDEPBEG_A(KMI)+1) ), &
+    CUNITS     = 'ppv',                                           &
+    CDIR       = 'XY',                                            &
+    CCOMMENT   = 'X_Y_Z_' // 'SVT' // YNUM3,                      &
+    NGRID      = 1,                                               &
+    NTYPE      = TYPEREAL,                                        &
+    NDIMS      = 3,                                               &
+    LTIMEDEP   = .TRUE.                                           )
+END DO
+
+DO JSV = NSV_SNWBEG_A(KMI), NSV_SNWEND_A(KMI)
+  WRITE( YNUM3, '( I3.3 )' ) JSV
+
+  TSVLIST_A(JSV, KMI) = TFIELDMETADATA(                       &
+    CMNHNAME   = TRIM( CSNOWNAMES(JSV-NSV_SNWBEG_A(KMI)+1) ), &
+    CSTDNAME   = '',                                          &
+    CLONGNAME  = TRIM( CSNOWNAMES(JSV-NSV_SNWBEG_A(KMI)+1) ), &
+    CUNITS     = 'kg kg-1',                                   &
+    CDIR       = 'XY',                                        &
+    CCOMMENT   = 'X_Y_Z_' // 'SVT' // YNUM3,                  &
+    NGRID      = 1,                                           &
+    NTYPE      = TYPEREAL,                                    &
+    NDIMS      = 3,                                           &
+    LTIMEDEP   = .TRUE.                                       )
+END DO
+
+!Check if there is at most 1 LINOX scalar variable
+!if not, the name must be modified and different for all of them
+IF ( NSV_LNOX_A(KMI) > 1 ) &
+  CALL Print_msg( NVERB_ERROR, 'GEN', 'INI_NSV', 'NSV_LNOX_A>1: problem with the names of the corresponding scalar variables' )
+
+DO JSV = NSV_LNOXBEG_A(KMI), NSV_LNOXEND_A(KMI)
+  ICHIDX = ICHIDX + 1
+  CSV_CHEM_LIST_A(ICHIDX, KMI) = 'LINOX'
+
+  WRITE( YNUM3, '( I3.3 )' ) JSV
+
+  TSVLIST_A(JSV, KMI) = TFIELDMETADATA(      &
+    CMNHNAME   = 'LINOX',                    &
+    CSTDNAME   = '',                         &
+    CLONGNAME  = 'LINOX',                    &
+    CUNITS     = 'ppv',                      &
+    CDIR       = 'XY',                       &
+    CCOMMENT   = 'X_Y_Z_' // 'SVT' // YNUM3, &
+    NGRID      = 1,                          &
+    NTYPE      = TYPEREAL,                   &
+    NDIMS      = 3,                          &
+    LTIMEDEP   = .TRUE.                      )
+END DO
+
+IF ( ICHIDX /= NSV_CHEM_LIST_A(KMI) ) &
+  CALL Print_msg( NVERB_ERROR, 'GEN', 'INI_NSV', 'ICHIDX /= NSV_CHEM_LIST_A(KMI)' )
+
+END SUBROUTINE INI_NSV
diff --git a/src/PHYEX/ext/ini_radar.f90 b/src/PHYEX/ext/ini_radar.f90
new file mode 100644
index 0000000000000000000000000000000000000000..efe222510b6882e595a88afd90253a4ce5a7ec2c
--- /dev/null
+++ b/src/PHYEX/ext/ini_radar.f90
@@ -0,0 +1,234 @@
+!MNH_LIC Copyright 1994-2014 CNRS, Meteo-France and Universite Paul Sabatier
+!MNH_LIC This is part of the Meso-NH software governed by the CeCILL-C licence
+!MNH_LIC version 1. See LICENSE, CeCILL-C_V1-en.txt and CeCILL-C_V1-fr.txt  
+!MNH_LIC for details. version 1.
+!-----------------------------------------------------------------
+!--------------- special set of characters for RCS information
+!-----------------------------------------------------------------
+! $Source$ $Revision$
+! masdev4_7 BUG1 2007/06/15 17:47:18
+!-----------------------------------------------------------------
+!      ########################
+       MODULE MODI_INI_RADAR
+!      ########################
+!
+INTERFACE
+      SUBROUTINE INI_RADAR (HPRISTINE_ICE  )
+!
+CHARACTER (LEN=4), INTENT(IN) :: HPRISTINE_ICE ! Indicator of ice crystal characteristics
+!
+!
+END SUBROUTINE INI_RADAR
+!
+END INTERFACE
+!
+END MODULE MODI_INI_RADAR
+!     ###########################################################
+      SUBROUTINE INI_RADAR ( HPRISTINE_ICE )
+!     ###########################################################
+!
+!!****  *INI_RADAR * 
+!!
+!!    PURPOSE
+!!    -------
+!!      The purpose of this routine is to initialize the constants used to 
+!!    compute radar reflectivity (radar_rain_ice.f90 or radar_simulator.f90)
+!!    for DIAG after PREP_REAL_CASE with AROME file (CCLOUD=NONE)
+!!
+!!**  METHOD
+!!    ------
+!!      The constants useful to radar are initialized to their 
+!!      numerical values as in ini_rain_ice.f90 for ICE3 
+!!
+!!    EXTERNAL
+!!    --------
+!!      GAMMA    :  gamma function
+!!     
+!!
+!!    IMPLICIT ARGUMENTS
+!!    ------------------
+!!      Module MODD_CST
+!!        XPI                  !
+!!        XP00                 ! Reference pressure
+!!        XRD                  ! Gaz constant for dry air
+!!        XRHOLW               ! Liquid water density
+!!      Module MODD_RAIN_ICE_DESCR
+!!
+!!
+!!    AUTHOR
+!!    ------
+!!      G. TANGUY * CNRM *
+!!
+!!    MODIFICATIONS
+!!    -------------
+!!      Original    27/10/2009
+!!      P.Scheffknecht 22/04/2015: test missing on already allocated XRTMIN 
+!!
+!-------------------------------------------------------------------------------
+!
+!*       0.    DECLARATIONS
+!              ------------
+!
+USE MODD_CST
+USE MODD_RAIN_ICE_DESCR_n
+!
+IMPLICIT NONE
+!
+!*       0.1   Declarations of dummy arguments :
+!
+!
+CHARACTER (LEN=4), INTENT(IN)       :: HPRISTINE_ICE    ! Indicator of ice crystal caracteristics
+!
+!-------------------------------------------------------------------------------
+!
+!
+!
+!*      1.1    Raindrop characteristics
+!
+!
+!
+XAR = (XPI/6.0)*XRHOLW
+XBR = 3.0
+XCR = 842.
+XDR = 0.8
+XCCR = 8.E6   
+!
+!*       1.2    Ice crystal characteristics
+!
+!
+SELECT CASE (HPRISTINE_ICE)
+  CASE('PLAT')
+    XAI = 0.82      ! Plates
+    XBI = 2.5       ! Plates 
+    XC_I = 800.     ! Plates
+    XDI = 1.0       ! Plates
+  CASE('COLU')
+    XAI = 2.14E-3   ! Columns
+    XBI = 1.7       ! Columns
+    XC_I = 2.1E5    ! Columns
+    XDI = 1.585     ! Columns
+  CASE('BURO')
+    XAI = 44.0      ! Bullet rosettes
+    XBI = 3.0       ! Bullet rosettes
+    XC_I = 4.3E5    ! Bullet rosettes
+    XDI = 1.663     ! Bullet rosettes
+END SELECT
+!
+!
+!*       1.3    Snowflakes/aggregates characteristics
+!
+!
+XAS = 0.02
+XBS = 1.9
+XCS = 5.1
+XDS = 0.27
+XCCS = 5.0
+XCXS = 1.0
+!
+!*      1.4    Graupel/Frozen drop characteristics
+!
+!
+XAG = 19.6 
+XBG = 2.8 
+XCG = 124. 
+XDG = 0.66 
+XCCG = 5.E5
+XCXG = -0.5
+!
+!*       1.5    Hailstone characteristics
+!
+!
+XAH = 470.
+XBH = 3.0
+XCH = 207.
+XDH = 0.64
+XCCH = 4.E4 
+XCXH = -1.0 
+!
+!-------------------------------------------------------------------------------
+!
+!*       2.     DIMENSIONAL DISTRIBUTIONS OF THE SPECIES
+!	            ----------------------------------------
+!
+!*       2.1    Raindrops distribution
+!
+XALPHAR = 1.0  ! Exponential law
+XNUR    = 1.0  ! Exponential law
+!
+!*       2.2    Ice crystal distribution
+!
+XALPHAI = 3.0  ! Gamma law for the ice crystal volume
+XNUI    = 3.0  ! Gamma law with little dispersion
+!
+XALPHAS = 1.0  ! Exponential law
+XNUS    = 1.0  ! Exponential law
+!
+XALPHAG = 1.0  ! Exponential law
+XNUG    = 1.0  ! Exponential law
+!
+XALPHAH = 1.0  ! Gamma law
+XNUH    = 8.0  ! Gamma law with little dispersion
+!
+!*       2.3    Constants for shape parameter
+!
+XLBEXR = 1.0/(-1.0-XBR)
+XLBR   = ( XAR*XCCR*MOMG(XALPHAR,XNUR,XBR) )**(-XLBEXR)
+!
+XLBEXI = 1.0/(-XBI)
+XLBI   = ( XAI*MOMG(XALPHAI,XNUI,XBI) )**(-XLBEXI)
+!
+XNS   = 1.0/(XAS*MOMG(XALPHAS,XNUS,XBS))
+XLBEXS = 1.0/(XCXS-XBS)
+XLBS   = ( XAS*XCCS*MOMG(XALPHAS,XNUS,XBS) )**(-XLBEXS)
+!
+XLBEXG = 1.0/(XCXG-XBG)
+XLBG   = ( XAG*XCCG*MOMG(XALPHAG,XNUG,XBG) )**(-XLBEXG)
+!
+XLBEXH = 1.0/(XCXH-XBH)
+XLBH   = ( XAH*XCCH*MOMG(XALPHAH,XNUH,XBH) )**(-XLBEXH)
+!
+!*       2.4    Minimal values allowed for the mixing ratios
+! ICE3
+IF(.NOT.ASSOCIATED(XRTMIN)) THEN
+ CALL RAIN_ICE_DESCR_ALLOCATE(6)
+END IF
+!
+XRTMIN(1) = 1.0E-20
+XRTMIN(2) = 1.0E-20
+XRTMIN(3) = 1.0E-20
+XRTMIN(4) = 1.0E-20
+XRTMIN(5) = 1.0E-15
+XRTMIN(6) = 1.0E-15
+
+!
+CONTAINS
+!
+!------------------------------------------------------------------------------
+!
+  FUNCTION MOMG (PALPHA,PNU,PP) RESULT (PMOMG)
+!
+! auxiliary routine used to compute the Pth moment order of the generalized
+! gamma law
+!
+  USE MODI_GAMMA
+
+  IMPLICIT NONE
+
+  REAL, INTENT(IN)     :: PALPHA ! first shape parameter of the dimensionnal distribution
+  REAL, INTENT(IN)     :: PNU    ! second shape parameter of the dimensionnal distribution
+  REAL, INTENT(IN)     :: PP     ! order of the moment
+  REAL     :: PMOMG  ! result: moment of order ZP
+
+!------------------------------------------------------------------------------
+
+
+  PMOMG = GAMMA(PNU+PP/PALPHA)/GAMMA(PNU)
+
+  END FUNCTION MOMG
+
+!-------------------------------------------------------------------------------
+!
+!
+END SUBROUTINE INI_RADAR
+
+
diff --git a/src/PHYEX/ext/ini_segn.f90 b/src/PHYEX/ext/ini_segn.f90
new file mode 100644
index 0000000000000000000000000000000000000000..9299f713c570da1307054de55657bf040c94a415
--- /dev/null
+++ b/src/PHYEX/ext/ini_segn.f90
@@ -0,0 +1,483 @@
+!MNH_LIC Copyright 1994-2023 CNRS, Meteo-France and Universite Paul Sabatier
+!MNH_LIC This is part of the Meso-NH software governed by the CeCILL-C licence
+!MNH_LIC version 1. See LICENSE, CeCILL-C_V1-en.txt and CeCILL-C_V1-fr.txt
+!MNH_LIC for details. version 1.
+!-----------------------------------------------------------------
+!     ###################
+      MODULE MODI_INI_SEG_n
+!     ###################
+!
+INTERFACE
+!
+SUBROUTINE INI_SEG_n(KMI,TPINIFILE,HINIFILEPGD,PTSTEP_ALL)
+!
+USE MODD_IO, ONLY : TFILEDATA
+!
+INTEGER,                    INTENT(IN)    :: KMI          !Model index
+TYPE(TFILEDATA),   POINTER, INTENT(OUT)   :: TPINIFILE    !Initial file
+CHARACTER (LEN=28),         INTENT(OUT)   :: HINIFILEPGD
+REAL,DIMENSION(:),          INTENT(INOUT) :: PTSTEP_ALL   ! Time STEP of ALL models
+!
+END SUBROUTINE INI_SEG_n
+!
+END INTERFACE
+!
+END MODULE MODI_INI_SEG_n
+!
+!
+!
+!
+!     #############################################################
+      SUBROUTINE INI_SEG_n(KMI,TPINIFILE,HINIFILEPGD,PTSTEP_ALL)
+!     #############################################################
+!
+!!****  *INI_SEG_n * - routine to read and update the descriptor files for
+!!                   model KMI
+!!
+!!    PURPOSE
+!!    -------
+!       The purpose of this routine is to read the descriptor files in the
+!     following order :
+!         - DESFM file which gives informations about the initial file
+!     (i.e. the description of the segment that produced the initial file
+!     or the description of the preinitialisation that created the initial file)
+!         - EXSEG file which gives informations about the segment to perform.
+!
+!      Informations in EXSEG file are completed by DESFM file informations
+!      and if the informations are not in DESFM file, they are  set
+!      to default values.
+!
+!        The descriptor file EXSEG corresponding to the segment of simulation
+!      to be performed, is then updated with the combined informations.
+!      We also store in the updated EXSEG file, the informations on the status
+!      of the different variables ( skip, init, read) in the namelist NAM_GETn,
+!      which will be read in the INI_MODELn routine to properly initiliaze the
+!      model n. Except this last namelist, the informations written in this
+!      EXSEG file, will be identical to the NAMELIST section of the descriptive
+!      part of the FM files containing the model outputs.
+!
+!        In order not to duplicate the routines called by ini_seg, we use the
+!      modules modd, corresponding to the first model to store the informations
+!      read on the different files ( DESFM and EXSEG ). The final filling of
+!      the modules modd (MODD_CONFn ....) will be realized in the subroutine
+!      INI_MODELn. The goal of the INI_SEG_n part of the initialization is to
+!      built the final EXSEG, which will be associated to the LFI files
+!      generated during the segment ( and therefore not to fill the modd).
+!
+!
+!!**  METHOD
+!!    ------
+!!      For a nested model of index KMI :
+!!         - Logical unit numbers  are associated to output-listing file and
+!!      descriptor EXSEG  file by FMATTR. Then these files are   opened.
+!!      The  name of the initial file is read in EXSEG file.
+!!         - Default values are supplied for variables in descriptor files
+!!      (by DEFAULT_DESFM).
+!!         - The Initial file (LFIFM + DESFM) is opened by IO_File_open.
+!!         - The descriptor DESFM file is read (by READ_DESFM_n).
+!!         - The descriptor file EXSEG is read (by READ_EXSEG_n) and coherence
+!!      between the initial file and the description of segment is also checked
+!!      in this routine.
+!!         - If there is more than one model the EXSEG file is updated
+!!     (by WRITE_DESFM$n).  This routine prints also EXSEG content on
+!!     output-listing.
+!!         - If there is only one model (i.e. no grid-nesting),
+!!      EXSEG  file is also closed (logical unit number associated with this
+!!      file is also released by FMFREE).
+!!
+!!
+!!
+!!    EXTERNAL
+!!    --------
+!!      FMATTR        : to associate a logical unit number to a file
+!!      IO_File_open : to open descriptor file or LFI file
+!!      DEFAULT_DESFM1: to set default values
+!!      READ_DESFM_n    : to read a DESFM file
+!!      READ_EXSEG_n    : to read a EXSEG file
+!!      WRITE_DESFM1   : to write the DESFM part of the future outputs
+!!      FMFREE        : to release a logical unit number linked to a file
+!!
+!!      Module MODI_DEFAULT_DESFM    : Interface for routine DEFAULT_DESFM
+!!      Module MODI_READ_DESFM_n    : Interface for routine  READ_DESFM_n
+!!      Module MODI_READ_EXSEG_n    : Interface for routine  READ_EXSEG_n
+!!      Module MODI_WRITE_DESFM1   : Interface for routine  WRITE_DESFM1
+!!
+!!    IMPLICIT ARGUMENTS
+!!    ------------------
+!!      Module MODD_LUNIT  : contains names and logical unit numbers
+!!
+!!      Module MODD_CONF   : contains configuration variables
+!!         CCONF      : Configuration of models
+!!         NMODEL     : Number of nested models
+!!         NVERB      : Level of informations on output-listing
+!!                          0 for minimum of prints
+!!                          5 for intermediate level of prints
+!!                         10 for maximum of prints
+!!
+!!      Module MODN_LUNIT1 : contains declarations of namelist NAMLUNITMN
+!!                           and module MODD_LUNIT1
+!!
+!!    REFERENCE
+!!    ---------
+!!      Book2 of documentation (routine INI_SEG)
+!!
+!!
+!!    AUTHOR
+!!    ------
+!!	V. Ducrocq       * Meteo France *
+!!
+!!    MODIFICATIONS
+!!    -------------
+!!      Original         07/06/94
+!!      Modification     26/10/94  remove the NAM_GETn from the namelist present
+!!                                 in the EXSEG file  (J.Stein)
+!!                       11/01/95  change the read_exseg and desfm CALLS to add
+!!                                 the G1D switch
+!!                       15/02/95  add the HTURBLEN information (J. Cuxart)
+!!                       18/08/95  Time STEP change          (J. P. Lafore)
+!!                       02/10/95  add the radiation control (J. Stein)
+!!                       18/03/96  remove the no write option for WRITE_DESFM
+!!                                  (J. Stein)
+!!                       11/04/96  add the ice conc. control (J.-P. Pinty)
+!!                       11/01/97  add the deep convection control (J.-P. Pinty)
+!!                       17/07/96  correction for WRITE_DESFM1 call (J. P. Lafore)
+!!                       22/07/96  PTSTEP_ALL introduction for nesting (J. P. Lafore)
+!!                        7/08/98    //     (V. Ducrocq)
+!!                       02/08/99  remove unused argument for read_desfm (J. Stein)
+!!                       15/03/99  test on execution program (V. Masson)
+!!                       15/11/00  Add YCLOUD (J.-P. Pinty)
+!!                       01/03/01  Add GUSECHEM (D. Gazen)
+!!                       15/10/01  namelists in different orders (I.Mallet)
+!!                       25/11/02  Add YELEC (P. Jabouille)
+!!                       01/2004   externalization of surface (V. Masson)
+!!                       01/2005   add GDUST, GSALT, and GORILAM (P. Tulet)
+!!                       04/2010   add GUSECHAQ, GCH_PH (M. Leriche)
+!!                       09/2010   add GUSECHIC (M. Leriche)
+!!                       02/2012   add GFOREFIRE (Pialat/Tulet)
+!!                       05/2014   missing reading of IMASDEV before COUPLING
+!!                                 test (Escobar)
+!!                       10/02/15  remove ABORT in parallel case for SPAWNING
+!!   J.Escobar : 15/09/2015 : WENO5 & JPHEXT <> 1
+!!                       01/2015   add GLNOX_EXPLICIT (C. Barthe)
+!!                       04/2016   add ABORT if CINIFILEPGD is not specified (G.Delautier)
+!!  Philippe Wautelet: 05/2016-04/2018: new data structures and calls for I/O
+!!                       07/2017   add GBLOWSNOW (V. Vionnet)
+!  P. Wautelet 07/02/2019: force TYPE to a known value for IO_File_add2list
+!  P. Wautelet 14/02/2019: remove CLUOUT/CLUOUT0 and associated variables
+!  P. Wautelet 19/06/2019: provide KMODEL to INI_FIELD_LIST when known
+!-------------------------------------------------------------------------------
+!
+!*       0.    DECLARATIONS
+!              ------------
+USE MODD_CONF
+USE MODD_CONF_n,           ONLY: CSTORAGE_TYPE
+USE MODN_CONFZ
+USE MODD_DYN_n,            ONLY : LOCEAN
+USE MODD_DYN
+USE MODD_IO,               ONLY: NVERB_FATAL, NVERB_WARNING, TFILE_OUTPUTLISTING, TFILEDATA
+USE MODD_LES,              ONLY: LES_ASSOCIATE
+USE MODD_LUNIT
+USE MODD_LUNIT_n,          ONLY: CINIFILE_n=> CINIFILE, TINIFILE_n => TINIFILE, CINIFILEPGD_n=> CINIFILEPGD, TLUOUT, LUNIT_MODEL
+USE MODD_PARAM_n,          ONLY: CSURF
+USE MODD_PARAM_ICE_n
+USE MODD_PARAMETERS
+USE MODD_REF,              ONLY: LBOUSS
+!
+use mode_field,            only: Ini_field_list, Ini_field_scalars
+USE MODE_IO_FIELD_READ,    only: IO_Field_read
+USE MODE_IO_FILE,          ONLY: IO_File_close, IO_File_open
+USE MODE_IO,               only: IO_Config_set
+USE MODE_IO_MANAGE_STRUCT, ONLY: IO_File_add2list
+USE MODE_MSG
+USE MODE_POS
+!
+USE MODI_DEFAULT_DESFM_n
+USE MODI_READ_DESFM_n
+USE MODI_READ_EXSEG_n
+USE MODI_WRITE_DESFM_n
+!
+USE MODN_CONFIO,           ONLY: NAM_CONFIO
+USE MODN_LUNIT_n
+!
+IMPLICIT NONE
+!
+!*       0.1   declarations of arguments
+!
+INTEGER,                    INTENT(IN)    :: KMI          !Model index
+TYPE(TFILEDATA),   POINTER, INTENT(OUT)   :: TPINIFILE    !Initial file
+CHARACTER (LEN=28),         INTENT(OUT)   :: HINIFILEPGD
+REAL,DIMENSION(:),          INTENT(INOUT) :: PTSTEP_ALL   ! Time STEP of ALL models
+!
+!*       0.1   declarations of local variables
+!
+LOGICAL            :: GFOUND              ! Return code when searching namelist
+CHARACTER (LEN=28) :: YINIFILE                    ! name of initial file
+CHARACTER (LEN=2)  :: YMI                         ! string for model index
+INTEGER            :: ILUOUT                      ! Logical unit number
+                                                  ! associated with TLUOUT
+                                                  !
+INTEGER            :: IRESP,ILUSEG                ! File management variables
+CHARACTER (LEN=5)  :: YCONF                       ! Local variables which have
+LOGICAL            :: GFLAT                       ! the same definition as the
+LOGICAL            :: GUSERV,GUSERC,GUSERR,GUSERI ! variables in module MODD_CONF,
+LOGICAL            :: GUSERS,GUSERG,GUSERH,GUSECI ! MODD_CONFn, MODD_PARAMn,
+LOGICAL            :: GUSECHEM                    ! flag for chemistry
+LOGICAL            :: GUSECHAQ                    ! flag for aq. phase chemistry
+LOGICAL            :: GUSECHIC                    ! flag for ice phase chemistry
+LOGICAL            :: GCH_PH                      ! flag for pH
+LOGICAL            :: GCH_CONV_LINOX
+LOGICAL            :: GDUST
+LOGICAL,DIMENSION(JPMODELMAX) :: GDEPOS_DST, GDEPOS_SLT, GDEPOS_AER
+LOGICAL            :: GSALT
+LOGICAL            :: GORILAM
+LOGICAL            :: GLG
+LOGICAL            :: GPASPOL
+LOGICAL            :: GFIRE
+#ifdef MNH_FOREFIRE
+LOGICAL            :: GFOREFIRE
+#endif
+LOGICAL            :: GCONDSAMP
+LOGICAL            :: GBLOWSNOW
+LOGICAL            :: GCHTRANS
+LOGICAL            :: GLNOX_EXPLICIT              ! flag for LNOx
+                                                  ! These variables
+                                                  ! are used to locally store
+INTEGER            :: ISV                         ! the value read in DESFM
+INTEGER            :: IRIMX,IRIMY                 ! number of points for the
+                                                  ! horizontal relaxation
+CHARACTER (LEN=4)  :: YTURB                       ! file in order to check the
+CHARACTER (LEN=4)  :: YRAD                        ! corresponding informations
+CHARACTER (LEN=4)  :: YTOM                        ! read in EXSEG file.
+LOGICAL            :: GRMC01
+CHARACTER (LEN=4)  :: YDCONV
+CHARACTER (LEN=4)  :: YSCONV
+CHARACTER (LEN=4)  :: YCLOUD
+CHARACTER (LEN=4)  :: YELEC
+CHARACTER (LEN=3)  :: YEQNSYS
+TYPE(TFILEDATA),POINTER :: TZFILE_DES
+!
+TPINIFILE  => NULL()
+TZFILE_DES => NULL()
+!-------------------------------------------------------------------------------
+!
+!*       1.    OPEN OUPTUT-LISTING FILE AND EXSEG FILE
+!              ---------------------------------------
+!
+WRITE(YMI,'(I2.0)') KMI
+CALL IO_File_add2list(LUNIT_MODEL(KMI)%TLUOUT,'OUTPUT_LISTING'//ADJUSTL(YMI),'OUTPUTLISTING','WRITE')
+TLUOUT => LUNIT_MODEL(KMI)%TLUOUT !Necessary because TLUOUT was initially pointing to NULL
+CALL IO_File_open(TLUOUT)
+!
+!Set output file for PRINT_MSG
+TFILE_OUTPUTLISTING => TLUOUT
+!
+ILUOUT=TLUOUT%NLU
+!
+WRITE(UNIT=ILUOUT,FMT='(50("*"),/,"*",17X,"MODEL ",I1," LISTING",16X,"*",/,  &
+            & 50("*"))') KMI
+!
+IF (CPROGRAM=='MESONH') THEN
+  CALL IO_File_add2list(TZFILE_DES,'EXSEG'//TRIM(ADJUSTL(YMI))//'.nam','NML','READ')
+  CALL IO_File_open(TZFILE_DES)
+!
+!*       1.3   SPAWNING or SPEC or REAL program case
+!              ---------------------
+!
+ELSE IF (CPROGRAM=='SPAWN ' .OR. CPROGRAM=='REAL  '.OR. CPROGRAM=='SPEC  ') THEN
+  YINIFILE    = CINIFILE_n
+  HINIFILEPGD = CINIFILEPGD_n
+  CALL IO_File_add2list(TPINIFILE,TRIM(YINIFILE),'MNH','READ',KLFITYPE=2,KLFIVERB=NVERB)
+  CALL IO_File_open(TPINIFILE)
+  TZFILE_DES => TPINIFILE%TDESFILE
+!
+!*       1.3bis   DIAG program case
+!
+ELSE IF (CPROGRAM=='DIAG  ') THEN
+  YINIFILE    = CINIFILE_n
+  HINIFILEPGD = CINIFILEPGD_n
+  CALL IO_File_add2list(TINIFILE_n,TRIM(YINIFILE),'MNH','READ',KLFITYPE=2,KLFIVERB=NVERB)
+  CALL IO_File_open(TINIFILE_n)
+  TPINIFILE  => TINIFILE_n
+  TZFILE_DES => TPINIFILE%TDESFILE
+!
+!*       1.4   Other program cases
+!              -------------------
+!
+ELSE
+!callabortstop
+  CALL PRINT_MSG(NVERB_FATAL,'GEN','INI_SEG_n','should not be called for CPROGRAM='//TRIM(CPROGRAM))
+ENDIF
+!
+ILUSEG = TZFILE_DES%NLU
+!
+!-------------------------------------------------------------------------------
+!
+!*      2.    SET DEFAULT VALUES
+!             ------------------
+!
+CALL LES_ASSOCIATE()
+CALL DEFAULT_DESFM_n(KMI)
+!
+!-------------------------------------------------------------------------------
+!
+!*       3.    READ INITIAL FILE NAME AND OPEN INITIAL FILE
+!              --------------------------------------------
+!
+CALL POSNAM( TZFILE_DES, 'NAM_LUNITN', GFOUND )
+IF (GFOUND) THEN
+  CALL INIT_NAM_LUNITn
+  READ(UNIT=ILUSEG,NML=NAM_LUNITn)
+  CALL UPDATE_NAM_LUNITn
+  IF (LEN_TRIM(CINIFILEPGD)==0 .AND. CSURF=='EXTE') THEN
+    !callabortstop
+    CALL PRINT_MSG(NVERB_FATAL,'GEN','INI_SEG_n','error in namelist NAM_LUNITn: you need to specify CINIFILEPGD')
+  ENDIF
+END IF
+
+IF (CPROGRAM=='MESONH') THEN
+   IF (KMI.EQ.1) THEN
+      CALL POSNAM( TZFILE_DES, 'NAM_CONFZ', GFOUND )
+      IF (GFOUND) READ(UNIT=ILUSEG,NML=NAM_CONFZ)
+      CALL POSNAM( TZFILE_DES, 'NAM_CONFIO', GFOUND )
+      IF (GFOUND) READ(UNIT=ILUSEG,NML=NAM_CONFIO)
+      CALL IO_Config_set()
+   END IF
+  HINIFILEPGD=CINIFILEPGD_n
+  YINIFILE=CINIFILE_n
+
+  CALL IO_File_add2list(TPINIFILE,TRIM(YINIFILE),'MNH','READ',KLFITYPE=2,KLFIVERB=NVERB)
+  TINIFILE_n => TPINIFILE !Necessary because TINIFILE was initially pointing to NULL
+  CALL IO_File_open(TPINIFILE)
+END IF
+!
+!-------------------------------------------------------------------------------
+!
+!*      4.    READ DESFM FILE
+!             ---------------
+!
+CALL READ_DESFM_n(KMI,TPINIFILE,YCONF,GFLAT,GUSERV,GUSERC,                  &
+                GUSERR,GUSERI,GUSECI,GUSERS,GUSERG,GUSERH,GUSECHEM,GUSECHAQ,&
+                GUSECHIC,GCH_PH,GCH_CONV_LINOX,GSALT,GDEPOS_SLT,GDUST,      &
+                GDEPOS_DST, GCHTRANS, GORILAM,                              &
+                GDEPOS_AER, GLG, GPASPOL,GFIRE,                             &
+#ifdef MNH_FOREFIRE
+                GFOREFIRE,                                                  &
+#endif
+                GLNOX_EXPLICIT,                                             &
+                GCONDSAMP,GBLOWSNOW, IRIMX,IRIMY,ISV,                       &
+                YTURB,YTOM,GRMC01,YRAD,YDCONV,YSCONV,YCLOUD,YELEC,YEQNSYS   )
+!
+!-------------------------------------------------------------------------------
+!
+!*      5.    Initialize fieldlist
+!             --------------------
+!
+IF (KMI==1) THEN !Do this only 1 time
+  IF (      CPROGRAM=='SPAWN ' .OR. CPROGRAM=='DIAG  ' .OR. CPROGRAM=='SPEC  ' &
+       .OR. ( CPROGRAM/='REAL  ' .AND. CPROGRAM/='IDEAL ' )                    ) THEN
+    CALL INI_FIELD_LIST()
+  END IF
+
+  IF (CPROGRAM=='SPAWN ' .OR. CPROGRAM=='DIAG  ' .OR. CPROGRAM=='SPEC  ' .OR. CPROGRAM=='MESONH') THEN
+    CALL INI_FIELD_SCALARS()
+  END IF
+END IF
+!
+!-------------------------------------------------------------------------------
+!
+!*      6.    READ in the LFI file SOME VARIABLES of MODD_CONF
+!             ------------------------------------------------
+!
+IF (CPROGRAM=='MESONH' .OR. CPROGRAM=='SPAWN ') THEN
+  IF ((TPINIFILE%NMNHVERSION(1)==4 .AND. TPINIFILE%NMNHVERSION(2)>9) .OR. TPINIFILE%NMNHVERSION(1)>4) THEN
+    CALL IO_Field_read(TPINIFILE,'COUPLING',LCOUPLING)
+    IF (LCOUPLING) THEN
+      WRITE(ILUOUT,*) 'Error with the initial file'
+      WRITE(ILUOUT,*) 'The file',YINIFILE,' was created with LCOUPLING=.TRUE.'
+      WRITE(ILUOUT,*) 'You can not use it as initial file, only as coupling file'
+      WRITE(ILUOUT,*) 'Run PREP_REAL_CASE with LCOUPLING=.FALSE.'
+      !callabortstop
+      CALL PRINT_MSG(NVERB_FATAL,'GEN','INI_SEG_n','')
+    ENDIF
+  ENDIF
+END IF
+!
+! Read the storage type
+  CALL IO_Field_read(TPINIFILE,'STORAGE_TYPE',CSTORAGE_TYPE,IRESP)
+  IF (IRESP /= 0) THEN
+    WRITE(ILUOUT,FMT=9002) 'STORAGE_TYPE',IRESP
+!callabortstop
+    CALL PRINT_MSG(NVERB_FATAL,'GEN','INI_SEG_n','')
+  END IF
+IF (KMI == 1) THEN
+! Read the geometry kind
+  CALL IO_Field_read(TPINIFILE,'CARTESIAN',LCARTESIAN)
+! Read the thinshell approximation
+  CALL IO_Field_read(TPINIFILE,'THINSHELL',LTHINSHELL)
+!
+  IF ((TPINIFILE%NMNHVERSION(1)==4 .AND. TPINIFILE%NMNHVERSION(2)>=6) .OR. TPINIFILE%NMNHVERSION(1)>4) THEN
+   CALL IO_Field_read(TPINIFILE,'L1D',L1D,IRESP)
+   IF (IRESP/=0)  L1D=.FALSE.
+!
+   CALL IO_Field_read(TPINIFILE,'L2D',L2D,IRESP)
+   IF (IRESP/=0)  L2D=.FALSE.
+!
+   CALL IO_Field_read(TPINIFILE,'PACK',LPACK,IRESP)
+   IF (IRESP/=0) LPACK=.TRUE.
+  ELSE
+   L1D=.FALSE.
+   L2D=.FALSE.
+   LPACK=.TRUE.
+  END IF
+  IF ((TPINIFILE%NMNHVERSION(1)==4 .AND. TPINIFILE%NMNHVERSION(2)>=10) .OR. TPINIFILE%NMNHVERSION(1)>4) THEN
+   CALL IO_Field_read(TPINIFILE,'LBOUSS',LBOUSS)
+  END IF
+!
+END IF
+!
+!-------------------------------------------------------------------------------
+!
+!*      7.    READ EXSEG FILE
+!             ---------------
+!   We pass by arguments the informations read in DESFM descriptor to the
+! routine which read related informations in the EXSEG descriptor in order to
+! check coherence between both informations.
+!
+CALL IO_Field_read(TPINIFILE,'LOCEAN',LOCEAN,IRESP)
+IF ( IRESP /= 0 ) LOCEAN = .FALSE.
+!
+CALL READ_EXSEG_n(KMI,TZFILE_DES,YCONF,GFLAT,GUSERV,GUSERC,                 &
+                GUSERR,GUSERI,GUSECI,GUSERS,GUSERG,GUSERH,GUSECHEM,         &
+                GUSECHAQ,GUSECHIC,GCH_PH,                                   &
+                GCH_CONV_LINOX,GSALT,GDEPOS_SLT,GDUST,GDEPOS_DST,GCHTRANS,  &
+                GORILAM,GDEPOS_AER,GLG,GPASPOL,GFIRE,                       &
+#ifdef MNH_FOREFIRE
+                GFOREFIRE, &
+#endif
+                GLNOX_EXPLICIT,                                             &
+                GCONDSAMP,GBLOWSNOW, IRIMX,IRIMY,ISV, &
+                YTURB,YTOM,GRMC01,YRAD,YDCONV,YSCONV,YCLOUD,YELEC,YEQNSYS,  &
+                PTSTEP_ALL,CINIFILEPGD_n                                    )
+!
+IF (CPROGRAM=='SPAWN ' .OR. CPROGRAM=='DIAG  ' .OR. CPROGRAM=='SPEC  '      &
+     .OR. CPROGRAM=='REAL  ') THEN
+  CINIFILE_n    = YINIFILE
+  CCPLFILE(:) = '                            '
+  NMODEL=1
+  LSTEADYLS=.TRUE.
+END IF
+!
+IF (CPROGRAM=='MESONH') THEN
+  HINIFILEPGD=CINIFILEPGD_n
+END IF
+!-------------------------------------------------------------------------------
+!
+!*      7.    CLOSE  FILES
+!             ------------
+!
+IF (CPROGRAM=='MESONH') CALL IO_File_close(TZFILE_DES)
+!
+!-------------------------------------------------------------------------------
+9002  FORMAT(/,'FATAL ERROR IN INI_SEG_n: pb to read ',A16,' IRESP=',I3)
+!
+END SUBROUTINE INI_SEG_n
diff --git a/src/PHYEX/ext/ini_tke_eps.f90 b/src/PHYEX/ext/ini_tke_eps.f90
new file mode 100644
index 0000000000000000000000000000000000000000..a07160722558475a37baff36ada0a00739bff061
--- /dev/null
+++ b/src/PHYEX/ext/ini_tke_eps.f90
@@ -0,0 +1,179 @@
+!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_INI_TKE_EPS
+!     #######################
+INTERFACE
+!
+   SUBROUTINE INI_TKE_EPS(HGETTKET,PTHVREF,PZZ, &
+                          PUT,PVT,PTHT,                  &
+                          PTKET,TPINITHALO3D_ll    )
+!
+USE MODD_ARGSLIST_ll, ONLY : LIST_ll
+CHARACTER (LEN=*),               INTENT(IN)  :: HGETTKET
+             ! character string indicating whether TKE must be 
+             ! initialized or not
+REAL, DIMENSION(:,:,:),        INTENT(IN)   :: PTHVREF ! virtual potential
+                                                       ! temperature
+REAL, DIMENSION(:,:,:),        INTENT(IN)   :: PZZ     ! physical height for
+                                                       ! w-point
+REAL, DIMENSION(:,:,:),        INTENT(INOUT):: PUT     ! x-component of wind
+REAL, DIMENSION(:,:,:),        INTENT(INOUT):: PVT     ! y-component of wind
+REAL, DIMENSION(:,:,:),        INTENT(INOUT):: PTHT    ! potential temperature
+REAL, DIMENSION(:,:,:),        INTENT(INOUT):: PTKET ! TKE fields 
+TYPE(LIST_ll), POINTER,        INTENT(INOUT):: TPINITHALO3D_ll ! pointer for the list of fields
+                                      !  which must be communicated in INIT
+!
+END SUBROUTINE INI_TKE_EPS
+!
+END INTERFACE
+!
+END MODULE MODI_INI_TKE_EPS
+!
+!  ###################################################################
+   SUBROUTINE INI_TKE_EPS(HGETTKET,PTHVREF,PZZ, &
+                          PUT,PVT,PTHT,                  &
+                          PTKET,TPINITHALO3D_ll    )
+!  ###################################################################
+!
+!
+!! ****  *INI_TKE* initializes by a 1D stationarized TKE equation the 
+!!                 values of TKE. A positivity control is made. The 
+!!                 dissipation of TKE is set to its minimum value.
+!!
+!!  PURPOSE
+!!  -------
+!      The purpose of this routine is to initialize the values of the 
+!   turbulence kinetic energy. The dissipation is intialized to its minimum
+!   value.
+!
+!!** METHOD
+!!   ------
+!!      A diagnostic 1D equation for the TKE is used. The transport terms 
+!!   are neglected. 
+!!
+!!   EXTERNAL
+!!   --------
+!!      DZF ,MXF, MYF, MZM  : Shuman operators
+!!      ADD3DFIELD_ll       : add a field to 3D-list 
+!!
+!!   IMPLICIT ARGUMENTS
+!!   ------------------
+!!     MODD_CST   : XG, XRV, XRD
+!!     MODD_CTURB : XLINI, XTKEMIN, XCED, XCMFS
+!!     MODD_PARAMETERS: JPVEXT
+!!
+!!   REFERENCE
+!!   ---------
+!!     Book 2 of Documentation (routine INI_TKE)
+!!     Book 1 of Documentation (Chapter Turbulence)
+!!
+!!   AUTHOR
+!!   ------
+!!     Joan Cuxart          * INM and Meteo-France *
+!!
+!!   MODIFICATIONS
+!!   -------------
+!!     Original             Jan 19, 1995
+!!                          Feb 13, 1995 (J. Cuxart) add EPS initialization
+!!                          March 25, 1995 (J. Stein)add PZZ in the arguments 
+!!                          to compute a real gradient and allow RESTA conf.                
+!!                          Aug 10, 1998 (N. Asencio) add parallel code
+!!                          May 2006  Remove KEPS
+!  P. Wautelet 20/05/2019: add name argument to ADDnFIELD_ll + new ADD4DFIELD_ll subroutine
+!!                          March 2021 (JL Redelsperger) Add Ocean LES case)
+!! -------------------------------------------------------------------------
+!
+!*          0. DECLARATIONS
+!              ------------
+!
+USE MODD_ARGSLIST_ll, ONLY: LIST_ll
+USE MODD_CST,         ONLY: XG, XALPHAOC
+USE MODD_CTURB,       ONLY: XCMFS
+USE MODD_TURB_n,      ONLY: XLINI, XCED, XTKEMIN, XCSHF
+USE MODD_DYN_n,       ONLY: LOCEAN
+USE MODD_PARAMETERS,  ONLY: JPVEXT
+!
+USE MODE_ll
+!
+USE MODI_SHUMAN,      ONLY: DZF, MXF, MYF, MZM
+!
+IMPLICIT NONE
+!
+!*          0.1. declarations of arguments
+!
+CHARACTER (LEN=*),               INTENT(IN)  :: HGETTKET
+             ! character string indicating whether TKE must be 
+             ! initialized or not
+REAL, DIMENSION(:,:,:),        INTENT(IN)   :: PTHVREF ! virtual potential
+                                                       ! temperature
+REAL, DIMENSION(:,:,:),        INTENT(IN)   :: PZZ     ! physical height for
+                                                       ! w-point
+REAL, DIMENSION(:,:,:),        INTENT(INOUT):: PUT     ! x-component of wind
+REAL, DIMENSION(:,:,:),        INTENT(INOUT):: PVT     ! y-component of wind
+REAL, DIMENSION(:,:,:),        INTENT(INOUT):: PTHT    ! potential temperature
+REAL, DIMENSION(:,:,:),        INTENT(INOUT):: PTKET ! TKE field 
+TYPE(LIST_ll), POINTER,        INTENT(INOUT):: TPINITHALO3D_ll ! pointer for the list of fields
+                                      !  which must be communicated in INIT
+!
+!*       0.2    Declaration of local variables
+!
+INTEGER ::         IKB,IKE    ! index value for the first and last inner
+                              ! mass points
+INTEGER ::         JKK        ! vertical loop index
+REAL, DIMENSION(SIZE(PUT,1),SIZE(PUT,2),SIZE(PUT,3)) :: ZDELTZ ! vertical
+                                                               ! increment
+!
+! ---------------------------------------------------------------------
+! 
+! 
+IKB=1+JPVEXT
+IKE=SIZE(PTHT,3)-JPVEXT
+!
+!*       1.     TKE DETERMINATION
+!               -----------------
+!
+DO JKK=IKB-1,IKE
+  ZDELTZ(:,:,JKK) = PZZ(:,:,JKK+1)-PZZ(:,:,JKK)
+END DO
+ZDELTZ(:,:,IKE+1) = ZDELTZ(:,:,IKE)
+!
+IF (HGETTKET == 'INIT' ) THEN
+!  instant t
+  PTHT(:,:,IKB-1) = PTHT(:,:,IKB)
+  PUT(:,:,IKB-1)  = PUT(:,:,IKB)
+  PVT(:,:,IKB-1)  = PVT(:,:,IKB)
+  !
+  PTHT(:,:,IKE+1) = PTHT(:,:,IKE)
+  PUT(:,:,IKE+1)  = PUT(:,:,IKE)
+  PVT(:,:,IKE+1)  = PVT(:,:,IKE)
+  !
+  ! determines TKE
+  ! Equilibrium/Stationary/neutral 1D TKE equation
+  IF (LOCEAN) THEN
+    PTKET(:,:,:)=(XLINI**2/XCED)*(  &
+                    XCMFS*( DZF(MXF(MZM(PUT)))**2                  &
+                           +DZF(MYF(MZM(PVT)))**2) / ZDELTZ        &
+                   -(XG*XALPHAOC)*XCSHF*DZF(MZM(PTHT))              &
+                                 ) / ZDELTZ
+  ELSE
+    PTKET(:,:,:)=(XLINI**2/XCED)*(  &
+                    XCMFS*( DZF(MXF(MZM(PUT)))**2                  &
+                           +DZF(MYF(MZM(PVT)))**2) / ZDELTZ        &
+                   -(XG/PTHVREF)*XCSHF*DZF(MZM(PTHT))              &
+                                 ) / ZDELTZ
+  END IF
+  ! positivity control
+  WHERE (PTKET < XTKEMIN) PTKET=XTKEMIN
+  !
+  !
+  ! Add PTKET to TPINITHALO3D_ll list of fields updated at the
+  ! end of initialization
+  CALL ADD3DFIELD_ll ( TPINITHALO3D_ll, PTKET, 'INI_TKE_EPS::PTKET' )
+END IF
+!
+!
+END SUBROUTINE INI_TKE_EPS
diff --git a/src/PHYEX/ext/init_mnh.f90 b/src/PHYEX/ext/init_mnh.f90
new file mode 100644
index 0000000000000000000000000000000000000000..4170ca68e7ebf89b388aa90fee1d25880fd73edd
--- /dev/null
+++ b/src/PHYEX/ext/init_mnh.f90
@@ -0,0 +1,252 @@
+!MNH_LIC Copyright 1994-2021 CNRS, Meteo-France and Universite Paul Sabatier
+!MNH_LIC This is part of the Meso-NH software governed by the CeCILL-C licence
+!MNH_LIC version 1. See LICENSE, CeCILL-C_V1-en.txt and CeCILL-C_V1-fr.txt
+!MNH_LIC for details. version 1.
+!-----------------------------------------------------------------
+!     ###############
+      SUBROUTINE INIT_MNH
+!     ###############
+!
+!!****  *INIT_MNH * - monitor to initialize the variables of the model
+!!
+!!    PURPOSE
+!!    -------
+!       The purpose of this routine is to initialize all the variables
+!     used in the  model temporal loop or in the post-processings
+!
+!!**  METHOD
+!!    ------
+!!      This initialization  is separated in three parts :
+!!         1. A part common to all models where :
+!!            - The output-listing file common to all models is opened.
+!!            - The physical constants are initialized.
+!!            - The other constants for all models are initialized.
+!!         2. The treatment of descriptor files model by model :
+!!             The DESFM and EXSEG files are read and the EXSEG file is updated
+!!         3. The sequential initialization of  nested models :
+!!             The initial data fields are read in different files for each
+!!             model and  variables which are not in these initial files are
+!!             deduced.
+!!
+!!
+!!    EXTERNAL
+!!    --------
+!!      INI_CST    : to initialize physical constants
+!!      INI_CTURB  : to initialize for all models the constants used in the
+!!                   turbulence scheme
+!!      INI_SEG_n  : to read and update descriptor files  
+!!      INI_SIZE   : to initialize the sizes of the different models
+!!      INI_MODEL  : to initialize each nested model
+!!      INI_PARA_ll: to build the ll data structures
+!!      GO_TOMODEL : displace the ll lists to the right nested model
+!!
+!!
+!!    IMPLICIT ARGUMENTS
+!!    ------------------
+!!      Module MODD_PARAMETERS : JPMODELMAX
+!!
+!!      Module MODD_CONF       : NMODEL,NVERB
+!!
+!!    REFERENCE
+!!    ---------
+!!      Book2 of documentation (routine INIT_MNH)
+!!
+!!
+!!    AUTHOR
+!!    ------
+!!      V. Ducrocq       * Meteo France *
+!!
+!!    MODIFICATIONS
+!!    -------------
+!!      Original    02/06/94
+!!      J.Stein     05/01/95  add ini_cturb
+!!      J.P. Lafore 18/08/95  Time STEP change
+!!      J.P. Lafore 22/07/96  ZTSTEP_ALL introduction for nesting
+!!      V. Ducrocq  7/08/98   //
+!!      P. Jabouille 7/07/99  split ini_modeln in 2 parts+ cleaning
+!!      V. Masson   15/03/99  call to ini_data_cover
+!!      P.Jabouille 15/07/99  special initialisation for spawning
+!!      J.P Chaboureau 2015   add ini_spectre_n
+!!      J.Escobar   2/03/2016 bypass , reset NHALO=1 for SPAWNING
+!!  06/2016     (G.Delautier) phasage surfex 8
+!!  Philippe Wautelet: 05/2016-04/2018: new data structures and calls for I/O
+!  P. Wautelet 14/02/2019: remove CLUOUT/CLUOUT0 and associated variables
+!-------------------------------------------------------------------------------
+!
+!*       0.    DECLARATIONS
+!              ------------
+USE MODD_CONF
+USE MODD_DYN_n, ONLY: CPRESOPT, NITR ! only for spawning purpose
+USE MODD_IO,    ONLY: TFILE_OUTPUTLISTING, TPTR2FILE
+USE MODD_LBC_n, ONLY: CLBCX,CLBCY   ! only for spawning purpose
+USE MODD_LUNIT
+USE MODD_LUNIT_n
+USE MODD_MNH_SURFEX_n
+USE MODD_PARAMETERS
+USE MODD_NSV, ONLY: NSV_ASSOCIATE
+!
+use mode_field,            only: Alloc_field_scalars, Fieldlist_goto_model
+USE MODE_IO_FILE,          ONLY: IO_File_open
+USE MODE_IO_MANAGE_STRUCT, ONLY: IO_File_add2list
+USE MODE_ll
+USE MODE_MODELN_HANDLER
+USE MODE_SPLITTINGZ_ll
+!
+USE MODE_INI_CST, ONLY: INI_CST
+USE MODI_INI_MODEL_n
+USE MODI_INI_SEG_n
+USE MODI_INI_SIZE_n
+USE MODI_INI_SIZE_SPAWN
+USE MODI_INI_SPECTRE_n
+USE MODI_READ_ALL_NAMELISTS
+USE MODI_RESET_EXSEG
+!
+IMPLICIT NONE
+!
+!*       0.1   Local variables
+!
+INTEGER :: JMI                                        !  Loop index
+CHARACTER(LEN=28),DIMENSION(JPMODELMAX)  :: YINIFILEPGD
+INTEGER  :: ILUOUT0,IRESP                             ! Logical unit number for
+                                                      ! output-listing common
+                                                      ! to all models and return
+                                                      ! code of file management
+REAL, DIMENSION(JPMODELMAX)            :: ZTSTEP_ALL  ! Time STEP of ALL models
+INTEGER                                :: IINFO_ll    ! return code of // routines
+!
+! Dummy pointers needed to correct an ifort Bug
+CHARACTER(LEN=4), DIMENSION(:), POINTER :: DPTR_CLBCX,DPTR_CLBCY
+
+!-------------------------------------------------------------------------------
+!
+!*       1.    INITIALIZATION  COMMON TO ALL MODELS
+!              ------------------------------------
+!
+!*       1.1   initialize // E/S and open  output-listing file
+!
+!
+IF (CPROGRAM/='REAL  ') THEN
+  CALL IO_File_add2list(TLUOUT0,'OUTPUT_LISTING0','OUTPUTLISTING','WRITE')
+  CALL IO_File_open(TLUOUT0)
+  !Set output file for PRINT_MSG
+  TFILE_OUTPUTLISTING => TLUOUT0
+  ILUOUT0=TLUOUT0%NLU
+ELSE
+  ILUOUT0=TLUOUT0%NLU
+END IF
+!
+WRITE(UNIT=ILUOUT0,FMT="(50('*'),/,'*',48X,'*',/,                  &
+                  &  7('*'),10X, ' MESO-NH MODEL ',10X,8('*'),/,   &
+                  & '*',48X,'*',/,                                 &
+                  & 7('*'),12X,' CNRM - LA ',12X,8('*'),/,         &
+                  & '*',48X,'*',/,  50('*'))")
+!
+CALL NSV_ASSOCIATE()
+!
+!
+!*      1.2   initialize physical constants
+!
+CALL INI_CST
+!
+!
+!*       1.3    initialize constants for the turbulence scheme                      
+!
+!Now done in ini_modeln
+!
+!
+!-------------------------------------------------------------------------------
+!
+!*       2.    READ AND UPDATE DESCRIPTOR FILES
+!              --------------------------------
+!
+IF (CPROGRAM=='SPAWN ' .OR. CPROGRAM=='DIAG  ' .OR. CPROGRAM=='SPEC  ' .OR. CPROGRAM=='MESONH') THEN
+  CALL ALLOC_FIELD_SCALARS()
+END IF
+!
+CALL GOTO_MODEL(1)
+CALL INI_SEG_n(1,LUNIT_MODEL(1)%TINIFILE,YINIFILEPGD(1),ZTSTEP_ALL)
+!
+DO JMI=2,NMODEL
+  CALL GOTO_MODEL(JMI)
+  CALL INI_SEG_n(JMI,LUNIT_MODEL(JMI)%TINIFILE,YINIFILEPGD(JMI),ZTSTEP_ALL)
+END DO
+!
+IF (CPROGRAM=='SPAWN ') THEN 
+  !bypass
+  NHALO = 1
+END IF
+!
+IF (CPROGRAM=='DIAG') CALL RESET_EXSEG()
+!
+!-------------------------------------------------------------------------------
+!
+!
+!*       3.    INITIALIZE EACH MODEL SIZES AND DEPENDENCY
+!              ------------------------------------------
+!
+DO JMI=1,NMODEL
+  CALL GOTO_MODEL(JMI)
+  CALL INI_SIZE_n(JMI,LUNIT_MODEL(JMI)%TINIFILE,YINIFILEPGD(JMI))
+END DO
+!
+IF (CPROGRAM=='SPAWN ') THEN 
+  DPTR_CLBCX=>CLBCX
+  DPTR_CLBCY=>CLBCY
+  CALL INI_PARAZ_ll(IINFO_ll)
+  CALL INI_SIZE_SPAWN(DPTR_CLBCX,DPTR_CLBCY,CPRESOPT,NITR,LUNIT_MODEL(1)%TINIFILE)
+END IF
+!
+!   INITIALIZE data structures of ComLib
+!
+!JUAN CALL INI_PARA_ll(IINFO_ll)
+CALL INI_PARAZ_ll(IINFO_ll)
+!
+!-------------------------------------------------------------------------------
+!
+!
+!     Allocations of Surfex Types
+CALL SURFEX_ALLOC_LIST(NMODEL)
+!
+DO JMI=1,NMODEL
+  YSURF_CUR => YSURF_LIST(JMI)
+!
+  IF (CPROGRAM=='SPAWN ' .OR. CPROGRAM=='REAL  ') THEN 
+    CALL READ_ALL_NAMELISTS(YSURF_CUR,'MESONH','PRE',.FALSE.)
+  ELSE
+    CALL READ_ALL_NAMELISTS(YSURF_CUR,'MESONH','ALL',.TRUE.)
+  ENDIF
+ENDDO
+!
+!
+!-------------------------------------------------------------------------------
+!
+!*       4.    INITIALIZE EACH MODEL
+!              ---------------------
+!
+DO JMI=1,NMODEL
+  CALL GO_TOMODEL_ll(JMI,IINFO_ll)
+  CALL GOTO_MODEL(JMI)
+  IF (CPROGRAM/='SPEC  ') THEN
+    CALL INI_MODEL_n(JMI,LUNIT_MODEL(JMI)%TINIFILE)
+    !Call necessary to update the TFIELDLIST pointers to the data
+    CALL FIELDLIST_GOTO_MODEL(JMI,JMI)
+  ELSE
+    CALL INI_SPECTRE_n(JMI,LUNIT_MODEL(JMI)%TINIFILE)
+  END IF  
+END DO
+!
+!-------------------------------------------------------------------------------
+!
+!*       5.    WRITE MESSAGE ON OUTPUT-LISTING
+!              -------------------------------
+!
+IF (NVERB >= 5) THEN
+  WRITE(UNIT=ILUOUT0,FMT="(50('*'),/,'*',48X,'*',/,                &
+                & '*',10X,' INITIALIZATION TERMINATED',10X,'*',/,  &
+                & '*',48X,'*',/,50('*'))")
+END IF
+!
+!-------------------------------------------------------------------------------
+!
+!
+END SUBROUTINE INIT_MNH
diff --git a/src/PHYEX/ext/ion_attach_elec.f90 b/src/PHYEX/ext/ion_attach_elec.f90
new file mode 100644
index 0000000000000000000000000000000000000000..cd0fcf1c3eb268b93d7eeceef9161bc5157122aa
--- /dev/null
+++ b/src/PHYEX/ext/ion_attach_elec.f90
@@ -0,0 +1,631 @@
+!MNH_LIC Copyright 2010-2020 CNRS, Meteo-France and Universite Paul Sabatier
+!MNH_LIC This is part of the Meso-NH software governed by the CeCILL-C licence
+!MNH_LIC version 1. See LICENSE, CeCILL-C_V1-en.txt and CeCILL-C_V1-fr.txt
+!MNH_LIC for details. version 1.
+!-----------------------------------------------------------------
+!     ############################
+      MODULE MODI_ION_ATTACH_ELEC
+!     ############################
+!
+INTERFACE
+        SUBROUTINE ION_ATTACH_ELEC(KTCOUNT, KRR, PTSTEP, PRHODREF,           &
+                            PRHODJ,PSVS, PRS, PTHT, PCIT, PPABST, PEFIELDU,  &
+                            PEFIELDV, PEFIELDW, GATTACH, PTOWN, PSEA      )
+
+
+INTEGER,                  INTENT(IN)    :: KTCOUNT  ! Temporal loop counter
+INTEGER,                  INTENT(IN)    :: KRR      ! Number of moist variables
+REAL,                     INTENT(IN)    :: PTSTEP   ! Time step
+!
+REAL, DIMENSION(:,:,:),   INTENT(IN)    :: PRHODREF ! Reference dry air density
+REAL, DIMENSION(:,:,:),   INTENT(IN)    :: PRHODJ   ! dry air density* Jacobian
+REAL, DIMENSION(:,:,:,:), INTENT(INOUT) :: PSVS   ! Scalar variable vol. source
+REAL, DIMENSION(:,:,:,:), INTENT(INOUT) :: PRS    ! Moist variable vol. source
+REAL, DIMENSION(:,:,:),   INTENT(IN)    :: PTHT     ! Theta (K) at time t
+REAL, DIMENSION(:,:,:),   INTENT(IN)    :: PCIT    ! Pristine ice n.c. at t
+REAL, DIMENSION(:,:,:),   INTENT(IN)    :: PPABST   ! Absolute pressure at t
+REAL, DIMENSION(:,:,:),   INTENT(IN)    :: PEFIELDU, PEFIELDV, PEFIELDW
+                                                    ! Electric field components
+LOGICAL, DIMENSION(:,:,:),    INTENT(IN)     :: GATTACH !Recombination and
+                                                    !Attachment if true
+REAL, DIMENSION(:,:), OPTIONAL, INTENT(IN)   :: PTOWN ! town fraction
+REAL, DIMENSION(:,:), OPTIONAL, INTENT(IN)   :: PSEA  ! Land-sea mask
+
+       END SUBROUTINE ION_ATTACH_ELEC
+END INTERFACE
+END MODULE MODI_ION_ATTACH_ELEC
+
+
+
+!       ######################################################################
+        SUBROUTINE ION_ATTACH_ELEC(KTCOUNT, KRR, PTSTEP, PRHODREF,           &
+                            PRHODJ,PSVS, PRS, PTHT, PCIT, PPABST, PEFIELDU,  &
+                            PEFIELDV, PEFIELDW, GATTACH, PTOWN, PSEA      )
+!       ######################################################################
+
+
+!
+!!****  * -
+!!
+!!    PURPOSE
+!!    -------
+!!      This routine computes the ion capture by (or attachment to) hydrometeors
+!!    providing a source of charge for hydrometeors and a sink for positive
+!!    negative ion mixing ratio. It is assumed as resulting from both ionic
+!!    diffusion and conduction (electrical attraction).
+!!
+!!
+!!    METHOD
+!!    ------
+!!
+!!    EXTERNAL
+!!    --------
+!!
+!!    IMPLICIT ARGUMENTS
+!!    ------------------
+!!
+!!    REFERENCE
+!!    ---------
+!!
+!!    AUTHOR
+!!    ------
+!!      M. Chong     *Laboratoire d'Aerologie*
+!!
+!!    MODIFICATIONS
+!!    -------------
+!!      Original    2010
+!!      Modifications:
+!!      J.Escobar : 18/12/2015 : Correction of bug in bound in // for NHALO <>1 
+!  P. Wautelet    03/2020: use the new data structures and subroutines for budgets
+!-------------------------------------------------------------------------------
+!
+!*	0.	DECLARATIONS
+!		------------
+!
+use modd_budget,          only : lbudget_sv, NBUDGET_SV1, tbudgets
+USE MODD_CONF,            ONLY: CCONF
+USE MODD_CST
+USE MODD_ELEC_DESCR
+USE MODD_ELEC_n
+USE MODD_ELEC_PARAM
+USE MODD_NSV,             ONLY: NSV_ELECBEG, NSV_ELEC
+USE MODD_PARAMETERS,      ONLY: JPHEXT, JPVEXT
+USE MODD_RAIN_ICE_DESCR_n
+USE MODD_RAIN_ICE_PARAM_n
+USE MODD_REF,             ONLY: XTHVREFZ
+
+use mode_budget,          only: Budget_store_init, Budget_store_end
+use mode_tools_ll,        only: GET_INDICE_ll
+
+USE MODI_MOMG
+
+IMPLICIT NONE
+!
+!	0.1	Declaration of arguments
+!
+INTEGER,                  INTENT(IN)    :: KTCOUNT  ! Temporal loop counter
+INTEGER,                  INTENT(IN)    :: KRR      ! Number of moist variables
+REAL,                     INTENT(IN)    :: PTSTEP   ! Time step          
+!
+REAL, DIMENSION(:,:,:),   INTENT(IN)    :: PRHODREF ! Reference dry air density 
+REAL, DIMENSION(:,:,:),   INTENT(IN)    :: PRHODJ   ! dry air density* Jacobian
+REAL, DIMENSION(:,:,:,:), INTENT(INOUT) :: PSVS   ! Scalar variable vol. source
+REAL, DIMENSION(:,:,:,:), INTENT(INOUT) :: PRS    ! Moist variable vol. source
+REAL, DIMENSION(:,:,:),   INTENT(IN)    :: PTHT     ! Theta (K) at time t
+REAL, DIMENSION(:,:,:),   INTENT(IN)    :: PCIT    ! Pristine ice n.c. at t
+REAL, DIMENSION(:,:,:),   INTENT(IN)    :: PPABST   ! Absolute pressure at t
+REAL, DIMENSION(:,:,:),   INTENT(IN)    :: PEFIELDU, PEFIELDV, PEFIELDW
+                                                    ! Electric field components
+LOGICAL, DIMENSION(:,:,:),    INTENT(IN)     :: GATTACH !Recombination and
+                                                    !Attachment if true
+REAL, DIMENSION(:,:), OPTIONAL, INTENT(IN)   :: PTOWN ! town fraction
+REAL, DIMENSION(:,:), OPTIONAL, INTENT(IN)   :: PSEA  ! Land-sea mask
+
+!
+!
+!	0.2	Declaration of local variables
+!
+REAL,    DIMENSION(:), ALLOCATABLE :: ZT            ! Temperature (K)
+REAL,    DIMENSION(:), ALLOCATABLE :: ZCONC, ZVIT, ZRADIUS ! Number concentration
+                                                       !fallspeed, radius
+REAL                           :: ZCQD, ZCDIF   ! computed coefficients
+INTEGER, DIMENSION(SIZE(PTHT)) :: IGI, IGJ, IGK ! Valid grid index
+INTEGER :: IVALID                               ! Nb of valid grid
+INTEGER :: IIB           !  Beginning (B) and end (E) grid points
+INTEGER :: IIE           !  along i axis,
+INTEGER :: IJB           !        j axis,
+INTEGER :: IJE           !
+INTEGER :: IKB           !    and k axis
+INTEGER :: IKE           !
+
+INTEGER :: II, IJ, IK, JRR, JSV      ! Loop index for variable
+INTEGER :: ITYPE         ! Hydrometeor category (2: cloud, 3: rain,
+                         ! 4: ice crystal, 5: snow, 6: graupel, 7: hail)
+REAL    :: ZCOMB         ! Recombination
+!
+!
+!-------------------------------------------------------------------------------
+if ( lbudget_sv ) then
+  do jrr = 1, nsv_elec
+    call Budget_store_init( tbudgets( NBUDGET_SV1 - 1 + nsv_elecbeg - 1 + jrr), 'NEUT', psvs(:, :, :, jrr) )
+  end do
+end if
+!
+!*       1.     COMPUTE THE ION RECOMBINATION and TEMPERATURE
+!               ---------------------------------------------
+!
+!
+ZCQD = 4 * XPI * XEPSILON * XBOLTZ / XECHARGE
+ZCDIF = XBOLTZ /XECHARGE
+!
+CALL GET_INDICE_ll (IIB,IJB,IIE,IJE)
+IKB = 1 + JPVEXT
+IKE = SIZE(PTHT,3) - JPVEXT
+!
+!*      1.1     Add Ion Recombination source (PSVS in 1/(m3.s))
+!               and count and localize valid grid points for ion source terms
+!
+IVALID = 0
+DO IK = IKB, IKE
+  DO IJ = IJB, IJE
+    DO II = IIB, IIE
+      IF (GATTACH(II,IJ,IK)) THEN
+! Recombination
+        ZCOMB = XIONCOMB * (PSVS(II,IJ,IK,1)*PTSTEP) *    &
+                           (PSVS(II,IJ,IK,NSV_ELEC)*PTSTEP) * &
+                           PRHODREF(II,IJ,IK) / PRHODJ(II,IJ,IK)
+        ZCOMB = MIN(ZCOMB, PSVS(II,IJ,IK,1), PSVS(II,IJ,IK,NSV_ELEC))
+        PSVS(II,IJ,IK,1) = PSVS(II,IJ,IK,1) - ZCOMB
+        PSVS(II,IJ,IK,NSV_ELEC) = PSVS(II,IJ,IK,NSV_ELEC) - ZCOMB
+! Counting
+        IVALID = IVALID + 1
+        IGI(IVALID) = II
+        IGJ(IVALID) = IJ
+        IGK(IVALID) = IK
+      END IF
+    ENDDO
+  ENDDO
+ENDDO
+!
+!*      1.2     Compute the temperature
+!
+IF( IVALID /= 0 ) THEN
+  ALLOCATE (ZT(IVALID))
+  DO II = 1, IVALID
+    ZT(II) = PTHT(IGI(II),IGJ(II),IGK(II)) * &
+            (PPABST(IGI(II),IGJ(II),IGK(II)) / XP00) ** (XRD / XCPD)
+  ENDDO
+END IF
+!
+!
+!*	2.	TRANSFORM VOLUM. SOURCE TERMS INTO MIXING RATIO
+!               FOR WATER SPECIES, AND VOLUMIC CONTENT FOR ELECTRIC VARIABLES
+!               -------------------------------------------------------------
+!
+DO JRR = 1, KRR
+  PRS(:,:,:,JRR) = PRS(:,:,:,JRR) *PTSTEP / PRHODJ(:,:,:)
+ENDDO
+!
+DO JSV = 1, NSV_ELEC
+  PSVS(:,:,:,JSV) = PSVS(:,:,:,JSV) *PTSTEP *PRHODREF(:,:,:) / PRHODJ(:,:,:)
+ENDDO
+!
+!
+!*	3.	COMPUTE ATTACHMENT DUE TO ION DIFFUSION AND CONDUCTION
+!               ------------------------------------------------------
+! 
+!  Attachment to cloud droplets, rain, cloud ice, snow, graupel, 
+!                and hail (optional)
+!
+!
+IF( IVALID /= 0 ) THEN
+!
+!*	3.1	Attachment to cloud droplets
+!
+  ALLOCATE (ZCONC(IVALID))
+  ALLOCATE (ZVIT (IVALID))
+  ALLOCATE (ZRADIUS(IVALID))
+
+  ITYPE = 2
+  IF (PRESENT(PSEA)) THEN
+    CALL HYDROPARAM (IGI, IGJ, IGK, ZCONC, ZVIT, ZRADIUS, ITYPE, PSEA, PTOWN)
+  ELSE
+    CALL HYDROPARAM (IGI, IGJ, IGK, ZCONC, ZVIT, ZRADIUS, ITYPE)
+  ENDIF
+!  
+  CALL DIFF_COND (IGI, IGJ, IGK, PSVS(:,:,:,1), PSVS(:,:,:,NSV_ELEC),  &
+                  PSVS(:,:,:,ITYPE))
+!
+!*	3.2	Attachment to raindrops, ice crystals, snow, graupel, 
+!                             and hail (if activated)
+!
+  DO ITYPE = 3, KRR
+    CALL HYDROPARAM (IGI, IGJ, IGK, ZCONC, ZVIT, ZRADIUS, ITYPE)
+!  
+    CALL DIFF_COND (IGI, IGJ, IGK, PSVS(:,:,:,1), PSVS(:,:,:,NSV_ELEC),  &
+                    PSVS(:,:,:,ITYPE))
+  END DO
+!
+  DEALLOCATE (ZCONC, ZVIT, ZRADIUS)
+  DEALLOCATE (ZT)
+ENDIF
+!
+!
+!*	4.	RETURN TO VOLUMETRIC SOURCE (Prognostic units)
+!               ---------------------------
+!
+DO JRR = 1, KRR
+  PRS(:,:,:,JRR) = PRS(:,:,:,JRR) * PRHODJ(:,:,:) / PTSTEP
+ENDDO
+!
+DO JSV = 1, NSV_ELEC
+  PSVS(:,:,:,JSV) = PSVS(:,:,:,JSV) * PRHODJ(:,:,:) / (PTSTEP * PRHODREF(:,:,:))
+ENDDO
+!
+!
+!*	5.	BUDGET
+!               ------
+!
+if ( lbudget_sv ) then
+  do jrr = 1, nsv_elec
+    call Budget_store_end( tbudgets( NBUDGET_SV1 - 1 + nsv_elecbeg - 1 + jrr), 'NEUT', psvs(:, :, :, jrr) )
+  end do
+end if
+!
+!------------------------------------------------------------------------------
+!
+CONTAINS
+!
+!------------------------------------------------------------------------------
+!
+ SUBROUTINE HYDROPARAM (IGRIDX, IGRIDY, IGRIDZ, ZCONC,       &
+                        ZVIT, ZRADIUS, ITYPE, PSEA, PTOWN)
+!
+!       Purpose : Compute in regions of valid grid points (IGRIDX, IGRIDY, IGRIDZ)
+!                 the hydrometeor parameters: concentration (ZCONC),
+!                                             fallspeed (ZVIT),
+!                                         and mean radius (ZRADIUS)
+!                 involved in the evaluation of ion attachment
+!
+!
+!*      0.      DECLARATIONS
+!               ------------
+IMPLICIT NONE
+!
+!*      0.1     declaration of dummy arguments
+!
+INTEGER, DIMENSION(:), INTENT(IN)     :: IGRIDX, IGRIDY, IGRIDZ ! Index of
+                                                   ! valid gridpoints
+INTEGER,               INTENT(IN)     :: ITYPE     ! Hydrometeor category
+              ! ITYPE= 2: cloud, 3: rain, 4: ice, 5: snow, 6: graupel, 7: hail
+REAL, DIMENSION(:), INTENT(INOUT) :: ZCONC, ZVIT, ZRADIUS
+!                                      Number concentration, fallspeed, radius
+REAL, DIMENSION(:,:), OPTIONAL, INTENT(IN)   :: PTOWN ! town fraction
+REAL, DIMENSION(:,:), OPTIONAL, INTENT(IN)   :: PSEA  ! Land-sea mask
+!
+!*      0.2     declaration of local variables
+!
+REAL                           :: ZCONC1, ZCONC2 ! for cloud
+REAL                           :: ZLBC
+REAL                           :: ZFSEDC
+REAL                           :: ZRAY 
+REAL                           :: ZEXP1, ZEXP2, ZMOM1, ZMOM2
+REAL                           :: ZVCOEF, ZRHO00, ZLBI
+REAL                           :: ZLAMBDA
+INTEGER                        :: JI, JJ, JK, IV
+!
+!
+ZCONC(:) = 0.
+ZVIT (:) = 0.
+ZRADIUS(:) = 0.
+!
+SELECT CASE (ITYPE)
+!
+!*	1.	PARAMETERS FOR CLOUD
+!               --------------------
+  CASE (2)
+!
+    IF (PRESENT(PSEA)) THEN
+
+      ZMOM1 = 0.5*MOMG(XALPHAC,XNUC,1.)
+      ZMOM2 = 0.5*MOMG(XALPHAC2,XNUC2,1.)      
+      DO IV = 1, IVALID
+        JI = IGRIDX(IV)
+        JJ = IGRIDY(IV)
+        JK = IGRIDZ(IV)
+        IF( PRS(JI, JJ, JK, 2)/PRHODREF(JI, JJ, JK) >XRTMIN_ELEC(2) .AND. &
+            PSVS(JI, JJ, JK, 2) /=0. ) THEN
+          ZCONC1 = PSEA(JI,JJ) * XCONC_SEA + (1. - PSEA(JI,JJ)) * XCONC_LAND
+          ZLBC   = PSEA(JI,JJ) * XLBC(2)   + (1. - PSEA(JI,JJ)) * XLBC(1)
+          ZFSEDC = PSEA(JI,JJ) * XFSEDC(2) + (1. - PSEA(JI,JJ)) * XFSEDC(1)
+          ZFSEDC = MAX(MIN(XFSEDC(1),XFSEDC(2)), ZFSEDC)
+          ZCONC2 = (1. - PTOWN(JI,JJ)) * ZCONC1 + PTOWN(JI,JJ) * XCONC_URBAN
+          ZRAY   = (1. - PSEA(JI,JJ)) * ZMOM1 + PSEA(JI,JJ) * ZMOM2
+          ZCONC (IV) = ZCONC2                 ! Number concentration
+          ZLAMBDA    = (ZLBC *ZCONC2 / (PRHODREF(JI,JJ,JK) * PRS(JI,JJ,JK,2)))**XLBEXC
+          ZRADIUS (IV) = ZRAY / ZLAMBDA
+          ZVIT (IV)    = XCC * ZFSEDC * ZLAMBDA**(-XDC) * &
+                                PRHODREF(JI,JJ,JK)**(-XCEXVT)
+        END IF
+      ENDDO
+    ELSE
+      ZRAY = 0.5*MOMG(XALPHAC,XNUC,1.)
+      ZLBC = XLBC(1) * XCONC_LAND
+      DO IV = 1, IVALID
+        JI = IGRIDX(IV)
+        JJ = IGRIDY(IV)
+        JK = IGRIDZ(IV)
+        IF( PRS(JI, JJ, JK, 2)/PRHODREF(JI, JJ, JK) >XRTMIN_ELEC(2) .AND. &
+            PSVS(JI, JJ, JK, 2) /=0. ) THEN
+          ZCONC (IV) = XCONC_LAND             ! Number concentration
+          ZLAMBDA    = (ZLBC / (PRHODREF(JI,JJ,JK) * PRS(JI,JJ,JK,2)))**XLBEXC
+          ZRADIUS (IV) = ZRAY / ZLAMBDA
+          ZVIT (IV)    = XCC * XFSEDC(1) * ZLAMBDA**(-XDC) *    &
+                               PRHODREF(JI,JJ,JK)**(-XCEXVT)       
+        END IF
+      ENDDO
+    END IF
+!
+!
+!*	2.	PARAMETERS FOR RAIN
+!               -------------------
+  CASE (3)
+    ZEXP1 = XEXSEDR - 1.
+    ZEXP2 = ZEXP1 - XCEXVT
+!
+    DO IV = 1, IVALID
+      JI = IGRIDX(IV)
+      JJ = IGRIDY(IV)
+      JK = IGRIDZ(IV)
+      IF( PRS(JI, JJ, JK, 3)/PRHODREF(JI, JJ, JK) >XRTMIN_ELEC(3) .AND. &
+          PSVS(JI, JJ, JK, 3) /=0. ) THEN
+         ZLAMBDA = XLBR * (PRHODREF(JI,JJ,JK) * PRS(JI,JJ,JK,3))**XLBEXR
+         ZRADIUS (IV) = 0.5 / ZLAMBDA
+         ZCONC (IV) = XCCR / ZLAMBDA
+         ZVIT (IV) = XFSEDR * PRHODREF(JI,JJ,JK)**ZEXP2 &
+                                * PRS(JI,JJ,JK,3)**ZEXP1
+      END IF
+    ENDDO
+!
+!
+!*	3.	PARAMETERS FOR ICE
+!               ------------------
+!
+  CASE (4)
+!
+    ZRAY = 0.5*MOMG(XALPHAI,XNUI,1.)
+    ZRHO00 = XP00 / (XRD * XTHVREFZ(IKB))
+!   ZVCOEF= XC_I * (GAMMA(XNUI+(XBI+XDI)/XALPHAI) / GAMMA(XNUI+XBI/XALPHAI)) &
+!                * ZRHO00**XCEXVT
+! Computations for Columns (see ini_rain_ice_elec.f90)
+    ZVCOEF = 2.1E5 * MOMG(XALPHAI,XNUI, 3.285) / MOMG(XALPHAI,XNUI, 1.7)   &
+                   * ZRHO00**XCEXVT
+    ZLBI = (2.14E-3 * MOMG(XALPHAI,XNUI,1.7)) **0.588235
+
+    DO IV = 1, IVALID
+      JI = IGRIDX(IV)
+      JJ = IGRIDY(IV)
+      JK = IGRIDZ(IV)
+      IF( PRS(JI, JJ, JK, 4)/PRHODREF(JI, JJ, JK) > XRTMIN_ELEC(4) .AND. &
+          PSVS(JI, JJ, JK, 4) /=0.) THEN
+        ZCONC (IV) = XFCI * PRHODREF(JI,JJ,JK) * PRS(JI,JJ,JK,4) *  &
+              MAX(0.05E6, -0.15319E6 - 0.021454E6 *                &
+                  ALOG(PRHODREF(JI,JJ,JK) * PRS(JI,JJ,JK,4)))**3
+        ZLAMBDA = ZLBI * (ZCONC(IV) / (PRHODREF(JI,JJ,JK) *   &
+                                       PRS(JI,JJ,JK,4)))**0.588235
+        ZRADIUS (IV) = ZRAY / ZLAMBDA
+        ZVIT (IV) = ZVCOEF * ZLAMBDA**(-1.585) *   &      !(-XDI) * &
+                             PRHODREF(JI,JJ,JK)**(-XCEXVT) 
+      END IF
+    ENDDO
+!
+!
+!*	4.	PARAMETERS FOR SNOW 
+!               -------------------
+!
+  CASE (5)
+!
+    ZEXP1 = XEXSEDS - 1. 
+    ZEXP2 = ZEXP1 - XCEXVT
+!
+    DO IV = 1, IVALID
+      JI = IGRIDX(IV)
+      JJ = IGRIDY(IV)
+      JK = IGRIDZ(IV)
+      IF( PRS(JI, JJ, JK, 5)/PRHODREF(JI, JJ, JK) >XRTMIN_ELEC(5) .AND. &
+          PSVS(JI, JJ, JK, 5) /=0. ) THEN
+        ZLAMBDA = XLBS * (PRHODREF(JI,JJ,JK) * PRS(JI,JJ,JK,5))**XLBEXS
+        ZRADIUS (IV) = 0.5 / ZLAMBDA
+        ZCONC (IV) = XCCS * ZLAMBDA**XCXS
+        ZVIT (IV) = XFSEDS * PRHODREF(JI,JJ,JK)**ZEXP2 &
+                               * PRS(JI,JJ,JK,5)**ZEXP1
+      END IF
+    ENDDO
+!
+!
+!*	5.	PARAMETERS FOR GRAUPEL
+!               ----------------------
+!
+  CASE (6)
+!
+    ZEXP1 = XEXSEDG - 1.
+    ZEXP2 = ZEXP1 - XCEXVT
+!
+    DO IV = 1, IVALID
+      JI = IGRIDX(IV)
+      JJ = IGRIDY(IV)
+      JK = IGRIDZ(IV)
+      IF( PRS(JI, JJ, JK, 6)/PRHODREF(JI, JJ, JK) >XRTMIN_ELEC(6) .AND. &
+          PSVS(JI, JJ, JK, 6) /=0. ) THEN
+        ZLAMBDA = XLBG * (PRHODREF(JI,JJ,JK) * PRS(JI,JJ,JK,6))**XLBEXG
+        ZRADIUS (IV) = 0.5 / ZLAMBDA
+        ZCONC (IV) = XCCG * ZLAMBDA**XCXG
+        ZVIT (IV) = XFSEDG * PRHODREF(JI,JJ,JK)**ZEXP2 &
+                               * PRS(JI,JJ,JK,6)**ZEXP1
+      END IF
+    ENDDO
+!
+!
+!*	6.	PARAMETERS FOR HAIL
+!               -------------------
+!
+  CASE (7)
+!
+    ZEXP1 = XEXSEDH - 1.
+    ZEXP2 = ZEXP1-XCEXVT
+    ZRAY = 0.5*MOMG(XALPHAH, XNUH, 1.)
+!
+    DO IV = 1, IVALID
+      JI = IGRIDX(IV)
+      JJ = IGRIDY(IV)
+      JK = IGRIDZ(IV)
+      IF( PRS(JI, JJ, JK, 7)/PRHODREF(JI, JJ, JK) >XRTMIN_ELEC(7) .AND. &
+          PSVS(JI, JJ, JK, 7) /=0. ) THEN
+        ZLAMBDA = XLBH * (PRHODREF(JI,JJ,JK) * PRS(JI,JJ,JK,7))**XLBEXH
+        ZRADIUS (IV) = ZRAY / ZLAMBDA
+        ZCONC (IV) = XCCG * ZLAMBDA**XCXG
+        ZVIT (IV) = XFSEDH * PRHODREF(JI,JJ,JK)**ZEXP2 &
+                               * PRS(JI,JJ,JK,7)**ZEXP1
+      END IF
+    ENDDO
+!
+END SELECT
+!
+END SUBROUTINE HYDROPARAM
+!
+!------------------------------------------------------------------------------
+!
+ SUBROUTINE DIFF_COND (IGRIDX, IGRIDY, IGRIDZ, PQPIS, PQNIS, PQVS)
+!
+!       Purpose : Compute in regions of valid grid points (IGRIDX, IGRIDY, IGRIDZ)
+!                 the attachment of positive (sink for PQPIS) and negative 
+!                 (sink for PQNIS) ions to the hydrometeor variable (charge
+!                 source for PQVS)
+!
+!
+!*      0.	DECLARATIONS
+!        	------------
+IMPLICIT NONE
+!
+!*      0.1	declaration of dummy arguments
+!
+REAL, DIMENSION(:,:,:), INTENT(INOUT) :: PQPIS     ! Positive ion concentration
+REAL, DIMENSION(:,:,:), INTENT(INOUT) :: PQNIS     ! Negative ion concentration
+REAL, DIMENSION(:,:,:), INTENT(INOUT) :: PQVS      !Hydrom volumetric charge
+INTEGER, DIMENSION(:), INTENT(IN)     :: IGRIDX, IGRIDY, IGRIDZ ! Index of 
+                                                   ! valid gridpoints
+
+!
+!*      0.2	declaration of local variables
+!
+INTEGER :: JI, JJ, JK, IV
+REAL    :: ZNC, ZRADI, ZVT ! Nb conc., radius, fallspeed of the hydrometeor category
+REAL    :: ZQ              ! net particule charge
+REAL    :: ZX, ZFXP, ZFXN  ! Limiting diffusion function ZFX = +/- ZX /(exp(+/-ZX) -1)
+REAL    :: ZDIFP, ZDPIDT_D ! Diffusion of positive ions
+REAL    :: ZDIFM, ZDNIDT_D ! Diffusion of negative ions
+REAL    :: ZDPIDT_C        ! Conduction of positive ions
+REAL    :: ZDNIDT_C        ! Conduction of negative ions
+REAL    :: ZDELPI, ZDELNI  ! Total attachment of pos/neg ions
+REAL    :: ZEFIELD         ! Electric field magnitude
+REAL    :: ZQBOUND         ! Limit charge for conduction
+!
+!
+!*	1.	COMPUTE ION ATTACHMENT
+!               ----------------------
+!
+DO IV = 1, IVALID
+  IF (ZCONC(IV) .NE. 0.) THEN
+    JI = IGRIDX(IV)
+    JJ = IGRIDY(IV)
+    JK = IGRIDZ(IV)
+!
+    ZNC   = ZCONC(IV)
+    ZRADI = ZRADIUS(IV)
+    ZVT   = ZVIT(IV)
+!
+!*	1.0	Ion diffusion to a particle
+!
+    ZDPIDT_D = 0.
+    ZDNIDT_D = 0.
+!
+    ZQ = PQVS(JI,JJ,JK) / ZNC
+    ZX = ZQ / (ZCQD * ZRADI * ZT(IV))
+!
+    IF(ZX /= 0. .AND. ABS(ZX) <= 20.0) THEN
+      IF( ABS(ZX) < 1.0E-15) THEN
+        ZFXP = 1.
+        ZFXN = 1.
+      ELSE
+        ZFXP =  ZX / (EXP(ZX) - 1.)
+        ZFXN = -ZX / (EXP(-ZX) -1.)
+      ENDIF
+!  
+      ZDIFP = 4. * XPI * XMOBIL_POS(JI,JJ,JK) * ZCDIF * ZT(IV)
+      ZDPIDT_D = ZRADI * ZDIFP * PQPIS(JI,JJ,JK) * ZFXP * &
+                 (1. + (2. * ZRADI * ZVT / ZDIFP)**0.5)
+!    
+      ZDIFM = 4. * XPI * XMOBIL_NEG(JI,JJ,JK) * ZCDIF * ZT(IV)
+      ZDNIDT_D = ZRADI * ZDIFM * PQNIS(JI,JJ,JK) * ZFXN * &
+                 (1. + (2. * ZRADI * ZVT / ZDIFM)**0.5)
+!
+      ZDELPI = MIN(ZDPIDT_D*PTSTEP*ZNC, PQPIS(JI,JJ,JK))
+      ZDELNI = MIN(ZDNIDT_D*PTSTEP*ZNC, PQNIS(JI,JJ,JK))
+!
+      PQPIS(JI,JJ,JK) = PQPIS(JI,JJ,JK) - ZDELPI
+      PQNIS(JI,JJ,JK) = PQNIS(JI,JJ,JK) - ZDELNI
+      PQVS(JI,JJ,JK) = PQVS(JI,JJ,JK) + XECHARGE * (ZDELPI - ZDELNI)
+    ENDIF
+!
+!
+!*	1.1	Ion conduction to a particle
+!
+     ZDPIDT_C = 0.
+     ZDNIDT_C = 0.
+     ZEFIELD = SQRT(PEFIELDU(JI,JJ,JK)**2+PEFIELDV(JI,JJ,JK)**2+ &
+                    PEFIELDW(JI,JJ,JK)**2)
+     ZQBOUND = 12. * XPI * XEPSILON * ZEFIELD * ZRADI**2
+     ZQ = PQVS(JI,JJ,JK) / ZNC
+!
+     IF (ABS(ZQ) < ZQBOUND) THEN
+       IF (PEFIELDW(JI,JJ,JK) > 0.) THEN  ! opposite to fall velocity direction
+         ZDPIDT_C = 3. * XPI * ZRADI**2 * ZEFIELD * PQPIS(JI,JJ,JK) * &
+                    XMOBIL_POS(JI,JJ,JK) * (1. - ZQ / ZQBOUND)**2
+         IF (ZVT < XMOBIL_NEG(JI,JJ,JK)*ZEFIELD) THEN
+           ZDNIDT_C = 3. * XPI * ZRADI**2 * ZEFIELD * PQNIS(JI,JJ,JK) * &
+                      XMOBIL_NEG(JI,JJ,JK) * (1. + ZQ / ZQBOUND)**2
+         ELSE IF (ZQ > 0.) THEN
+           ZDNIDT_C = PQNIS(JI,JJ,JK) * XMOBIL_NEG(JI,JJ,JK) * ZQ / XEPSILON
+         ENDIF
+       ELSE IF (PEFIELDW(JI,JJ,JK) < 0.) THEN  ! in the direction of fall veloc.
+         IF( ZVT < XMOBIL_POS(JI,JJ,JK)*ZEFIELD) THEN
+           ZDPIDT_C = 3. * XPI * ZRADI**2 * ZEFIELD * PQPIS(JI,JJ,JK) * &
+                      XMOBIL_POS(JI,JJ,JK) * (1. - ZQ / ZQBOUND)**2
+         ELSE IF (ZQ < 0.) THEN
+           ZDPIDT_C = -PQPIS(JI,JJ,JK) * XMOBIL_POS(JI,JJ,JK) * ZQ / XEPSILON
+         ENDIF
+         ZDNIDT_C = 3. * XPI * ZRADI**2 * ZEFIELD * PQNIS(JI,JJ,JK) * &
+                    XMOBIL_NEG(JI,JJ,JK) * (1. + ZQ / ZQBOUND)**2
+       ENDIF
+     ELSE IF (ZQ >= ZQBOUND) THEN
+       ZDPIDT_C = 0.
+       ZDNIDT_C = PQNIS(JI,JJ,JK) * XMOBIL_NEG(JI,JJ,JK) * ZQ / XEPSILON
+     ELSE IF (ZQ <= -ZQBOUND) THEN
+       ZDPIDT_C = -PQPIS(JI,JJ,JK) * XMOBIL_POS(JI,JJ,JK) * ZQ / XEPSILON
+       ZDNIDT_C = 0.
+     ENDIF
+!
+     ZDELPI = MIN(ZDPIDT_C*PTSTEP*ZNC, PQPIS(JI,JJ,JK))
+     ZDELNI = MIN(ZDNIDT_C*PTSTEP*ZNC, PQNIS(JI,JJ,JK))
+!
+     PQPIS(JI,JJ,JK) = PQPIS(JI,JJ,JK) - ZDELPI
+     PQNIS(JI,JJ,JK) = PQNIS(JI,JJ,JK) - ZDELNI
+     PQVS(JI,JJ,JK) = PQVS(JI,JJ,JK) + XECHARGE *(ZDELPI - ZDELNI)
+  END IF
+ENDDO
+!
+END SUBROUTINE DIFF_COND
+!
+!-----------------------------------------------------------------------------
+!
+END SUBROUTINE ION_ATTACH_ELEC
diff --git a/src/PHYEX/ext/latlon_to_xy.f90 b/src/PHYEX/ext/latlon_to_xy.f90
new file mode 100644
index 0000000000000000000000000000000000000000..d5879356511d4b00f687923928cb4535ee4289ed
--- /dev/null
+++ b/src/PHYEX/ext/latlon_to_xy.f90
@@ -0,0 +1,225 @@
+!MNH_LIC Copyright 1995-2023 CNRS, Meteo-France and Universite Paul Sabatier
+!MNH_LIC This is part of the Meso-NH software governed by the CeCILL-C licence
+!MNH_LIC version 1. See LICENSE, CeCILL-C_V1-en.txt and CeCILL-C_V1-fr.txt
+!MNH_LIC for details. version 1.
+!-----------------------------------------------------------------
+!     ####################
+      PROGRAM LATLON_TO_XY
+!     ####################
+!
+!!**** *LATLON_TO_XY* program to compute x and y from latitude and longiude
+!!                    for a MESONH file
+!!
+!!    PURPOSE
+!!    -------
+!!
+!!    METHOD
+!!    ------
+!!   
+!!    EXTERNAL
+!!    --------
+!!
+!!    module MODE_GRIDPROJ : contains projection routines
+!!                         SM_LATLON and SM_XYHAT
+!!                           
+!!
+!!    IMPLICIT ARGUMENTS
+!!    ------------------
+!!
+!!    module MODD_GRID     : variables for projection:
+!!                         XLAT0,XLON0,XRPK,XBETA
+!!
+!!    module MODD_PGDDIM  : specify the dimentions of the data arrays:
+!!                         NPGDIMAX and NPGDJMAX
+!!
+!!    module MODD_PGDGRID : grid variables:
+!!                         XPGDLONOR,XPGDLATOR: longitude and latitude of the
+!!                           origine point for the conformal projection.
+!!                         XPGDXHAT,XPGDYHAT: position x,y in the conformal plane   
+!!
+!!
+!!    REFERENCE
+!!    ---------
+!!
+!!    AUTHOR
+!!    ------
+!!
+!!    V. Masson          Meteo-France
+!!
+!!    MODIFICATION
+!!    ------------
+!!
+!!    Original     29/12/95
+!!
+!!    remove the USE MODI_DEFAULT_DESFM      Apr. 17, 1996 (J.Stein)
+!!    no transfer of the file when closing   Dec. 09, 1996 (V.Masson)
+!!    + changes call to READ_HGRID
+!  P. Wautelet 05/2016-04/2018: new data structures and calls for I/O
+!  P. Wautelet 07/02/2019: force TYPE to a known value for IO_File_add2list
+!  P. Wautelet 26/04/2019: replace non-standard FLOAT function by REAL function
+!  P. Wautelet 10/04/2020: add missing initializations (LATLON_TO_XY was not working)
+!  J. Escobar  21/07/2020: missing modi_version
+!----------------------------------------------------------------------------
+!
+!*    0.     DECLARATION
+!            -----------
+!
+use MODD_CONF,             only: CPROGRAM
+USE MODD_DIM_n
+USE MODD_GRID
+USE MODD_IO,               ONLY: TFILEDATA
+USE MODD_PGDDIM
+USE MODD_PGDGRID
+USE MODD_PARAMETERS
+USE MODD_LUNIT
+!
+USE MODE_FIELD,            ONLY: INI_FIELD_LIST
+USE MODE_GRIDPROJ
+USE MODE_IO,               only: IO_Config_set, IO_Init
+use MODE_IO_FIELD_READ,    only: IO_Field_read
+USE MODE_IO_FILE,          only: IO_File_close, IO_File_open
+USE MODE_IO_MANAGE_STRUCT, only: IO_File_add2list
+use MODE_INIT_ll,          only: SET_DIM_ll, SET_JP_ll
+USE MODE_MODELN_HANDLER,   ONLY: GOTO_MODEL
+USE MODE_POS,              ONLY: POSNAM
+use MODE_SPLITTINGZ_ll
+!
+USE MODE_INI_CST, ONLY: INI_CST
+USE MODI_READ_HGRID
+USE MODI_VERSION
+!
+USE MODN_CONFIO,           ONLY: NAM_CONFIO
+!
+IMPLICIT NONE
+!
+!*    0.2    Declaration of variables
+!            ------------------------
+!
+CHARACTER(LEN=28) :: YINIFILE  ! name of input FM file
+CHARACTER(LEN=28) :: YNAME     ! true name of input FM file
+CHARACTER(LEN=28) :: YDAD      ! name of dad of input FM file
+CHARACTER(LEN=2)  :: YSTORAGE_TYPE
+INTEGER :: INAM                ! Logical unit for namelist file
+INTEGER :: ILUOUT0             ! Logical unit for output file.
+INTEGER :: IRESP               ! Return-code if problem eraised.
+REAL    :: ZLAT                ! input latitude
+REAL    :: ZLON                ! input longitude
+REAL    :: ZXHAT               ! output conformal coodinate x
+REAL    :: ZYHAT               ! output conformal coodinate y
+INTEGER :: II,IJ               ! indexes of the point
+REAL    :: ZI,ZJ               ! fractionnal indexes of the point
+TYPE(TFILEDATA),POINTER :: TZINIFILE => NULL()
+TYPE(TFILEDATA),POINTER :: TZNMLFILE => NULL()
+LOGICAL :: GFOUND
+!
+!*    0.3    Declaration of namelists
+!            ------------------------
+!
+NAMELIST/NAM_INIFILE/ YINIFILE
+!----------------------------------------------------------------------------
+!
+    WRITE(*,*) '+---------------------------------+'
+    WRITE(*,*) '|      program latlon_to_xy       |'
+    WRITE(*,*) '+---------------------------------+'
+    WRITE(*,*) ''
+    WRITE(*,*) 'Warning: I and J are integer for flux points'
+!
+!*    1.     Initializations
+!            ---------------
+!
+CALL GOTO_MODEL(1)
+!
+CALL VERSION()
+!
+CPROGRAM='LAT2XY'
+!
+CALL IO_Init()
+!
+CALL INI_CST()
+!
+CALL INI_FIELD_LIST()
+!
+!*    2.     Reading of namelist file
+!            ------------------------
+!
+!
+CALL IO_File_add2list(TZNMLFILE,'LATLON2XY1.nam','NML','READ')
+CALL IO_File_open(TZNMLFILE)
+INAM=TZNMLFILE%NLU
+!
+CALL POSNAM( TZNMLFILE, 'NAM_INIFILE', GFOUND )
+IF (GFOUND) THEN
+  READ(UNIT=INAM,NML=NAM_INIFILE)
+END IF
+!
+CALL POSNAM( TZNMLFILE, 'NAM_CONFIO', GFOUND )
+IF (GFOUND) THEN
+  READ(UNIT=INAM,NML=NAM_CONFIO)
+END IF
+!
+CALL IO_Config_set()
+CALL IO_File_close(TZNMLFILE)
+!
+!*    1.     Opening of MESONH file
+!            ----------------------
+!
+CALL IO_File_add2list(TZINIFILE,TRIM(YINIFILE),'MNH','READ',KLFITYPE=2,KLFIVERB=2)
+CALL IO_File_open(TZINIFILE)
+!
+CALL IO_Field_read(TZINIFILE,'IMAX',  NIMAX)
+CALL IO_Field_read(TZINIFILE,'JMAX',  NJMAX)
+NKMAX = 1
+CALL IO_Field_read(TZINIFILE,'JPHEXT',JPHEXT)
+!
+CALL SET_JP_ll(1,JPHEXT,JPVEXT,JPHEXT)
+CALL SET_DIM_ll(NIMAX, NJMAX, NKMAX)
+CALL INI_PARAZ_ll(IRESP)
+!
+!*    2.     Reading of MESONH file
+!            ----------------------
+!
+CALL READ_HGRID(0,TZINIFILE,YNAME,YDAD,YSTORAGE_TYPE)
+!
+!*    3.     Closing of MESONH file
+!            ----------------------
+!
+CALL IO_File_close(TZINIFILE)
+!
+!-------------------------------------------------------------------------------
+!
+!*    4.     Reading of latitude and longitude
+!            ---------------------------------
+!
+DO
+  WRITE(*,*) '-------------------------------------------------------------------'
+  WRITE(*,*) 'please enter the latitude  (in decimal degrees; quit or q to stop):'
+  READ(*,*,ERR=1) ZLAT
+  WRITE(*,*) 'please enter the longitude (in decimal degrees; quit or q to stop):'
+  READ(*,*,ERR=1) ZLON
+!
+  CALL SM_XYHAT(XPGDLATOR,XPGDLONOR,   &
+                ZLAT,ZLON,ZXHAT,ZYHAT)
+!
+  WRITE(*,*) 'x=', ZXHAT
+  WRITE(*,*) 'y=', ZYHAT
+!
+  II=MAX(MIN(COUNT(XPGDXHAT(:)<ZXHAT),NPGDIMAX+2*JPHEXT-1),1)
+  IJ=MAX(MIN(COUNT(XPGDYHAT(:)<ZYHAT),NPGDJMAX+2*JPHEXT-1),1)
+  ZI=(ZXHAT-XPGDXHAT(II))/(XPGDXHAT(II+1)-XPGDXHAT(II))+REAL(II)
+  ZJ=(ZYHAT-XPGDYHAT(IJ))/(XPGDYHAT(IJ+1)-XPGDYHAT(IJ))+REAL(IJ)
+!
+  IF (      (ZI>=1.) .AND. (ZI<=NPGDIMAX+2*JPHEXT+1) &
+      .AND. (ZJ>=1.) .AND. (ZJ<=NPGDJMAX+2*JPHEXT+1) ) THEN
+    WRITE(*,*) 'I=',ZI
+    WRITE(*,*) 'J=',ZJ
+  ELSE
+    WRITE(*,*) 'point not in the domain'
+    WRITE(*,*) 'I=',ZI
+    WRITE(*,*) 'J=',ZJ
+  END IF
+END DO
+1   WRITE(*,*) 'good bye'
+!
+!-------------------------------------------------------------------------------
+!
+END PROGRAM LATLON_TO_XY
diff --git a/src/PHYEX/ext/les_cloud_masksn.f90 b/src/PHYEX/ext/les_cloud_masksn.f90
new file mode 100644
index 0000000000000000000000000000000000000000..10e9e4093fc35cf7e5d3ba3c0ebcce0047611694
--- /dev/null
+++ b/src/PHYEX/ext/les_cloud_masksn.f90
@@ -0,0 +1,419 @@
+!MNH_LIC Copyright 2006-2020 CNRS, Meteo-France and Universite Paul Sabatier
+!MNH_LIC This is part of the Meso-NH software governed by the CeCILL-C licence
+!MNH_LIC version 1. See LICENSE, CeCILL-C_V1-en.txt and CeCILL-C_V1-fr.txt
+!MNH_LIC for details. version 1.
+!-----------------------------------------------------------------
+!     #######################
+      SUBROUTINE  LES_CLOUD_MASKS_n
+!     #######################
+!
+!
+!!****  *LES_MASKS_n* initializes the masks for clouds
+!!                         
+!!
+!!    PURPOSE
+!!    -------
+!!
+!!    EXTERNAL
+!!    --------
+!!
+!!    IMPLICIT ARGUMENTS
+!!    ------------------
+!!
+!!    REFERENCE
+!!    ---------
+!!
+!!    AUTHOR
+!!    ------
+!!      V. Masson
+!!
+!!    MODIFICATIONS
+!!    -------------
+!!      Original         07/2006
+!!      P. Aumond        10/2009 Add possibility of user maskS
+!!       F.Couvreux      06/2011 : Conditional sampling
+!!       C.Lac           10/2014 : Correction on user masks   
+!!       Q.Rodier        05/2019 : Missing parallelization 
+!!
+!! --------------------------------------------------------------------------
+!       
+!*      0. DECLARATIONS
+!          ------------
+!
+USE MODD_LES
+USE MODD_LES_n
+USE MODD_FIELD_n
+USE MODD_CONF_n
+USE MODD_CST    , ONLY : XRD, XRV
+USE MODD_NSV    , ONLY : NSV_CSBEG, NSV_CSEND, NSV_CS
+USE MODD_GRID_n , ONLY : XZHAT
+USE MODD_CONDSAMP
+!
+USE MODE_ll
+!
+USE MODI_LES_VER_INT
+USE MODI_LES_MEAN_ll
+USE MODI_SHUMAN
+!
+IMPLICIT NONE
+!
+!
+!       0.2  declaration of local variables
+!
+INTEGER :: JK                                  ! vertical loop counter
+INTEGER :: JI                                  ! loop index on masks  
+INTEGER :: IIU, IJU,IIB,IJB,IIE,IJE            ! hor. indices
+INTEGER :: IKU, KBASE, KTOP                    ! ver. index
+INTEGER :: IRR, IRRC, IRRR, IRRI, IRRS, IRRG   ! moist variables indices
+INTEGER :: JSV                                  ! ind of scalars
+!
+REAL, DIMENSION(:,:,:),   ALLOCATABLE :: ZRT  ! total water
+REAL, DIMENSION(:,:,:),   ALLOCATABLE :: ZTHV ! Virtual potential temperature
+!
+REAL, DIMENSION(:,:,:),   ALLOCATABLE :: ZW_LES    ! W     on LES vertical grid
+REAL, DIMENSION(:,:,:),   ALLOCATABLE :: ZRC_LES   ! Rc    on LES vertical grid
+REAL, DIMENSION(:,:,:),   ALLOCATABLE :: ZRI_LES   ! Ri    on LES vertical grid
+REAL, DIMENSION(:,:,:),   ALLOCATABLE :: ZRT_LES   ! Rt    on LES vertical grid
+REAL, DIMENSION(:,:,:),   ALLOCATABLE :: ZTHV_LES  ! thv   on LES vertical grid
+REAL, DIMENSION(:,:,:,:), ALLOCATABLE :: ZSV_LES  ! thv   on LES vertical grid
+REAL, DIMENSION(:,:,:),   ALLOCATABLE :: ZTHV_ANOM ! thv-thv_mean   on LES vertical grid
+REAL, DIMENSION(:,:,:,:), ALLOCATABLE :: ZSV_ANOM ! sv-sv_mean
+REAL, DIMENSION(:,:),     ALLOCATABLE :: ZSTD_SV
+REAL, DIMENSION(:,:),     ALLOCATABLE :: ZSTD_SVTRES ! threshold of sv
+REAL, DIMENSION(:,:,:),   ALLOCATABLE :: ZWORK3D,ZWORK3DB
+REAL, DIMENSION(:),       ALLOCATABLE :: ZWORK1D
+REAL, DIMENSION(:),       ALLOCATABLE :: ZMEANRC
+!
+!
+!-------------------------------------------------------------------------------
+!
+CALL GET_DIM_EXT_ll('B',IIU,IJU)
+CALL GET_INDICE_ll (IIB,IJB,IIE,IJE)
+!
+IKU = SIZE(XTHT,3)
+!
+!-------------------------------------------------------------------------------
+!
+!*      1.0  Thermodynamical computations
+!            ----------------------------
+!
+ALLOCATE(ZRT      (IIU,IJU,IKU))
+ALLOCATE(ZMEANRC (IKU))
+ZRT = 0.
+!
+IRR=0
+IF (LUSERV) THEN
+  IRR=IRR+1
+  ZRT = ZRT + XRT(:,:,:,1)
+END IF
+IF (LUSERC) THEN
+  IRR=IRR+1
+  IRRC=IRR
+  ZRT = ZRT + XRT(:,:,:,IRRC)
+END IF
+IF (LUSERR) THEN
+  IRR=IRR+1
+  IRRR=IRR
+  ZRT = ZRT + XRT(:,:,:,IRRR)
+END IF
+IF (LUSERI) THEN
+  IRR=IRR+1
+  IRRI=IRR
+  ZRT = ZRT + XRT(:,:,:,IRRI)
+END IF
+IF (LUSERS) THEN
+  IRR=IRR+1
+  IRRS=IRR
+  ZRT = ZRT + XRT(:,:,:,IRRS)
+END IF
+IF (LUSERG) THEN
+  IRR=IRR+1
+  IRRG=IRR
+  ZRT = ZRT + XRT(:,:,:,IRRG)
+END IF
+!
+!
+!* computes fields on the LES grid in order to compute masks
+!
+ALLOCATE(ZTHV     (IIU,IJU,IKU))
+ZTHV = XTHT
+IF (LUSERV) ZTHV=ZTHV*(1.+XRV/XRD*XRT(:,:,:,1))/(1.+ZRT(:,:,:))
+!
+!-------------------------------------------------------------------------------
+!
+!*      2.0  Fields on LES grid
+!            ------------------
+!
+!* allocates fields on the LES grid
+!
+!
+ALLOCATE(ZW_LES   (IIU,IJU,NLES_K))
+ALLOCATE(ZRC_LES  (IIU,IJU,NLES_K))
+ALLOCATE(ZRI_LES  (IIU,IJU,NLES_K))
+ALLOCATE(ZRT_LES  (IIU,IJU,NLES_K))
+ALLOCATE(ZTHV_LES (IIU,IJU,NLES_K))
+ALLOCATE(ZTHV_ANOM(IIU,IJU,NLES_K))
+ALLOCATE(ZSV_LES (IIU,IJU,NLES_K,NSV_CS))
+ALLOCATE(ZSV_ANOM(IIU,IJU,NLES_K,NSV_CS))
+ALLOCATE(ZSTD_SV(NLES_K,NSV_CS))
+ALLOCATE(ZSTD_SVTRES(NLES_K,NSV_CS))
+ALLOCATE(ZWORK1D(NLES_K))
+ALLOCATE(ZWORK3D(IIU,IJU,IKU))
+ALLOCATE(ZWORK3DB(IIU,IJU,NLES_K))
+!
+ZWORK1D=0.
+ZWORK3D=0.  
+ZWORK3DB=0.
+!
+CALL LES_VER_INT(MZF(XWT), ZW_LES)
+IF (NSV_CS>0) THEN
+  DO JSV=NSV_CSBEG, NSV_CSEND
+    CALL LES_VER_INT(  XSVT(:,:,:,JSV),  &
+                       ZSV_LES(:,:,:,JSV-NSV_CSBEG+1) )
+  END DO
+END IF
+IF (LUSERC) THEN
+  CALL LES_VER_INT(XRT(:,:,:,IRRC), ZRC_LES)
+ELSE
+  ZRC_LES = 0.
+END IF
+IF (LUSERI) THEN
+  CALL LES_VER_INT(XRT(:,:,:,IRRI), ZRI_LES)
+ELSE
+  ZRI_LES = 0.
+END IF
+CALL LES_VER_INT(ZRT, ZRT_LES)
+CALL LES_VER_INT(ZTHV, ZTHV_LES)
+CALL LES_ANOMALY_FIELD(ZTHV,ZTHV_ANOM)
+!
+IF (NSV_CS>0) THEN
+ DO JSV=NSV_CSBEG, NSV_CSEND
+  ZWORK3D(:,:,:)=XSVT(:,:,:,JSV)
+  CALL LES_ANOMALY_FIELD(ZWORK3D,ZWORK3DB)
+  ZSV_ANOM(:,:,:,JSV-NSV_CSBEG+1)=ZWORK3DB(:,:,:)
+  CALL LES_STDEV(ZWORK3DB,ZWORK1D)
+  ZSTD_SV(:,JSV-NSV_CSBEG+1)=ZWORK1D(:)
+  DO JK=1,NLES_K
+       ZSTD_SVTRES(JK,JSV-NSV_CSBEG+1)=SUM(ZSTD_SV(1:JK,JSV-NSV_CSBEG+1))/(1.*JK)
+  END DO
+ END DO
+END IF
+!
+DEALLOCATE(ZTHV     )
+DEALLOCATE(ZWORK3D)
+DEALLOCATE(ZWORK3DB)
+DEALLOCATE(ZWORK1D)
+!
+!-------------------------------------------------------------------------------
+!
+!*      3.0  Cloud mask
+!            ----------
+!
+IF (LLES_NEB_MASK) THEN
+  CALL LES_ALLOCATE('LLES_CURRENT_NEB_MASK',(/IIU,IJU,NLES_K/))
+  LLES_CURRENT_NEB_MASK (:,:,:) = .FALSE.
+  WHERE ((ZRC_LES(IIB:IIE,IJB:IJE,:)>1.E-6 .OR. ZRI_LES(IIB:IIE,IJB:IJE,:)>1.E-6) .AND. ZW_LES(IIB:IIE,IJB:IJE,:)>0.)
+    LLES_CURRENT_NEB_MASK (IIB:IIE,IJB:IJE,:) = .TRUE.
+  END WHERE
+END IF
+!
+!-------------------------------------------------------------------------------
+!
+!*      4.0  Cloud core mask
+!            ---------------
+!
+IF (LLES_CORE_MASK) THEN
+  CALL LES_ALLOCATE('LLES_CURRENT_CORE_MASK',(/IIU,IJU,NLES_K/))
+  LLES_CURRENT_CORE_MASK (:,:,:) = .FALSE.
+  WHERE ((ZRC_LES(IIB:IIE,IJB:IJE,:)>1.E-6 .OR. ZRI_LES(IIB:IIE,IJB:IJE,:)>1.E-6) &
+         .AND. ZW_LES(IIB:IIE,IJB:IJE,:)>0. .AND. ZTHV_ANOM(IIB:IIE,IJB:IJE,:)>0.)  
+    LLES_CURRENT_CORE_MASK (IIB:IIE,IJB:IJE,:) = .TRUE.
+  END WHERE
+END IF
+!
+!-------------------------------------------------------------------------------
+!
+!*      4.0  Conditional sampling mask
+!            -------------------------
+!
+IF (LLES_CS_MASK) THEN
+!
+  CALL LES_MEAN_ll(ZRC_LES, LLES_CURRENT_CART_MASK, ZMEANRC  )
+  CALL LES_ALLOCATE('LLES_CURRENT_CS1_MASK',(/IIU,IJU,NLES_K/))
+  LLES_CURRENT_CS1_MASK(:,:,:) = .FALSE.
+  IF (NSV_CS >= 2) THEN
+    CALL LES_ALLOCATE('LLES_CURRENT_CS2_MASK',(/IIU,IJU,NLES_K/))
+    LLES_CURRENT_CS2_MASK(:,:,:) = .FALSE.
+    IF (NSV_CS == 3) THEN
+      CALL LES_ALLOCATE('LLES_CURRENT_CS3_MASK',(/IIU,IJU,NLES_K/))
+      LLES_CURRENT_CS3_MASK (:,:,:) = .FALSE.
+    END IF
+  END IF
+
+!
+! Cloud top and base computation                   
+!
+  KBASE=2
+  KTOP=NLES_K
+  DO JK=2,NLES_K
+   IF ((ZMEANRC(JK) > 1.E-7) .AND. (KBASE == 2)) KBASE=JK
+   IF ((ZMEANRC(JK) < 1.E-7) .AND. (KBASE > 2) .AND. (KTOP == NLES_K)) &
+              KTOP=JK-1
+  END DO
+!
+ DO JSV=NSV_CSBEG, NSV_CSEND
+  DO JK=2,NLES_K
+    IF (ZSTD_SV(JK,JSV-NSV_CSBEG+1) < 0.05*ZSTD_SVTRES(JK,JSV-NSV_CSBEG+1)) &
+       ZSTD_SV(JK,JSV-NSV_CSBEG+1)=0.05*ZSTD_SVTRES(JK,JSV-NSV_CSBEG+1)
+! case no cloud top and base                    
+    IF (JSV == NSV_CSBEG) THEN
+     IF ((KBASE ==2) .AND. (KTOP == NLES_K)) THEN
+      WHERE (ZW_LES(IIB:IIE,IJB:IJE,JK)>0. .AND. ZSV_ANOM(IIB:IIE,IJB:IJE,JK,JSV-NSV_CSBEG+1) >  &
+             XSCAL(JSV-NSV_CSBEG+1) * ZSTD_SV(JK,JSV-NSV_CSBEG+1))
+          LLES_CURRENT_CS1_MASK (IIB:IIE,IJB:IJE,JK) = .TRUE.
+      END WHERE       
+     END IF
+!
+! case cloud top and base defined                    
+!
+     IF (XZHAT(JK) < XZHAT(KBASE)+(XZHAT(KTOP)-XZHAT(KBASE))/4.) THEN      
+      WHERE (ZW_LES(IIB:IIE,IJB:IJE,JK)>0. .AND. ZSV_ANOM(IIB:IIE,IJB:IJE,JK,JSV-NSV_CSBEG+1) > &
+             XSCAL(JSV-NSV_CSBEG+1) *ZSTD_SV(JK,JSV-NSV_CSBEG+1))
+          LLES_CURRENT_CS1_MASK (IIB:IIE,IJB:IJE,JK) = .TRUE.
+      END WHERE
+     END IF     
+!
+     IF (XZHAT(JK) >= XZHAT(KBASE)+(XZHAT(KTOP)-XZHAT(KBASE))/4.) THEN
+      WHERE (ZW_LES(IIB:IIE,IJB:IJE,JK)>0. .AND. ZSV_ANOM(IIB:IIE,IJB:IJE,JK,JSV-NSV_CSBEG+1) > &
+             XSCAL(JSV-NSV_CSBEG+1) * ZSTD_SV(JK,JSV-NSV_CSBEG+1) .AND. &
+          ZRC_LES(IIB:IIE,IJB:IJE,JK)>1.E-6)
+          LLES_CURRENT_CS1_MASK (IIB:IIE,IJB:IJE,JK) = .TRUE.
+      END WHERE  
+     END IF
+    ELSE IF ( JSV == NSV_CSBEG + 1 ) THEN
+     IF ((KBASE ==2) .AND. (KTOP == NLES_K)) THEN
+      WHERE ( ZSV_ANOM(IIB:IIE,IJB:IJE,JK,JSV-NSV_CSBEG+1) > &
+              XSCAL(JSV-NSV_CSBEG+1) * ZSTD_SV(JK,JSV-NSV_CSBEG+1))
+          LLES_CURRENT_CS2_MASK (IIB:IIE,IJB:IJE,JK) = .TRUE.
+      END WHERE       
+     END IF
+!
+! case cloud top and base defined                    
+!
+     IF (XZHAT(JK) < XZHAT(KBASE)+(XZHAT(KTOP)-XZHAT(KBASE))/4.) THEN      
+      WHERE (ZSV_ANOM(IIB:IIE,IJB:IJE,JK,JSV-NSV_CSBEG+1) >  &
+             XSCAL(JSV-NSV_CSBEG+1) *ZSTD_SV(JK,JSV-NSV_CSBEG+1))
+          LLES_CURRENT_CS2_MASK (IIB:IIE,IJB:IJE,JK) = .TRUE.
+      END WHERE
+     END IF     
+!
+     IF (XZHAT(JK) >= XZHAT(KBASE)+(XZHAT(KTOP)-XZHAT(KBASE))/4.) THEN
+      WHERE (ZSV_ANOM(IIB:IIE,IJB:IJE,JK,JSV-NSV_CSBEG+1) > &
+             XSCAL(JSV-NSV_CSBEG+1) * ZSTD_SV(JK,JSV-NSV_CSBEG+1)) 
+          LLES_CURRENT_CS2_MASK (IIB:IIE,IJB:IJE,JK) = .TRUE.
+      END WHERE  
+     END IF
+!
+    ELSE 
+     IF ((KBASE ==2) .AND. (KTOP == NLES_K)) THEN
+      WHERE ( ZSV_ANOM(IIB:IIE,IJB:IJE,JK,JSV-NSV_CSBEG+1) > &
+              XSCAL(JSV-NSV_CSBEG+1) * ZSTD_SV(JK,JSV-NSV_CSBEG+1))
+          LLES_CURRENT_CS3_MASK (IIB:IIE,IJB:IJE,JK) = .TRUE.
+      END WHERE       
+     END IF
+!
+! case cloud top and base defined                    
+!
+     IF (XZHAT(JK) < XZHAT(KBASE)+(XZHAT(KTOP)-XZHAT(KBASE))/4.) THEN      
+      WHERE (ZSV_ANOM(IIB:IIE,IJB:IJE,JK,JSV-NSV_CSBEG+1) > &
+             XSCAL(JSV-NSV_CSBEG+1) *ZSTD_SV(JK,JSV-NSV_CSBEG+1))
+          LLES_CURRENT_CS3_MASK (IIB:IIE,IJB:IJE,JK) = .TRUE.
+      END WHERE
+     END IF     
+!
+     IF (XZHAT(JK) >= XZHAT(KBASE)+(XZHAT(KTOP)-XZHAT(KBASE))/4.) THEN
+      WHERE (ZSV_ANOM(IIB:IIE,IJB:IJE,JK,JSV-NSV_CSBEG+1) > &
+             XSCAL(JSV-NSV_CSBEG+1) * ZSTD_SV(JK,JSV-NSV_CSBEG+1)) 
+          LLES_CURRENT_CS3_MASK (IIB:IIE,IJB:IJE,JK) = .TRUE.
+      END WHERE  
+     END IF
+    END IF
+  END DO
+ END DO
+END IF
+!
+!-------------------------------------------------------------------------------
+!
+!*      5.0  User mask
+!            ---------
+!
+IF (LLES_MY_MASK) THEN
+  CALL LES_ALLOCATE('LLES_CURRENT_MY_MASKS',(/IIU,IJU,NLES_K,NLES_MASKS_USER/))
+  DO JI=1,NLES_MASKS_USER
+    LLES_CURRENT_MY_MASKS (IIB:IIE,IJB:IJE,:,JI) = .FALSE.
+  END DO
+! WHERE ((ZRC_LES + ZRI_LES) > 1.E-06) 
+!    LLES_CURRENT_MY_MASKS (:,:,:,1) = .TRUE.
+! END WHERE
+!
+END IF
+!-------------------------------------------------------------------------------
+!
+DEALLOCATE(ZW_LES   )
+DEALLOCATE(ZRC_LES  )
+DEALLOCATE(ZRI_LES  )
+DEALLOCATE(ZRT_LES  )
+DEALLOCATE(ZTHV_LES )
+DEALLOCATE(ZSV_LES  )
+DEALLOCATE(ZTHV_ANOM)
+DEALLOCATE(ZSV_ANOM)
+DEALLOCATE(ZSTD_SV)
+DEALLOCATE(ZSTD_SVTRES)
+!-------------------------------------------------------------------------------
+DEALLOCATE(ZRT )
+DEALLOCATE(ZMEANRC)
+!--------------------------------------------------------------------------------
+!
+CONTAINS
+!
+!--------------------------------------------------------------------------------
+!
+SUBROUTINE LES_ANOMALY_FIELD(PF,PF_ANOM)
+!
+REAL, DIMENSION(:,:,:), INTENT(IN)  :: PF
+REAL, DIMENSION(:,:,:), INTENT(OUT) :: PF_ANOM
+
+REAL, DIMENSION(SIZE(PF_ANOM,3)) :: ZMEAN
+INTEGER :: JI, JJ
+
+CALL LES_VER_INT(PF, PF_ANOM)
+CALL LES_MEAN_ll(PF_ANOM, LLES_CURRENT_CART_MASK, ZMEAN  )
+DO JJ=1,SIZE(PF_ANOM,2)
+  DO JI=1,SIZE(PF_ANOM,1)
+    PF_ANOM(JI,JJ,:) = PF_ANOM(JI,JJ,:) - ZMEAN(:)
+  END DO
+END DO
+
+END SUBROUTINE LES_ANOMALY_FIELD
+!--------------------------------------------------------------------------------
+!
+!--------------------------------------------------------------------------------
+!
+SUBROUTINE LES_STDEV(PF_ANOM,PF_STD)
+!
+REAL, DIMENSION(:,:,:), INTENT(IN)  :: PF_ANOM
+REAL, DIMENSION(:), INTENT(OUT) :: PF_STD
+
+REAL, DIMENSION(SIZE(PF_ANOM,1),SIZE(PF_ANOM,2),SIZE(PF_ANOM,3)) :: Z2
+INTEGER :: JK
+
+Z2(:,:,:)=PF_ANOM(:,:,:)*PF_ANOM(:,:,:)
+CALL LES_MEAN_ll(Z2, LLES_CURRENT_CART_MASK, PF_STD  )
+DO JK=1,SIZE(PF_ANOM,3)
+     PF_STD(JK)=SQRT(PF_STD(JK))
+END DO
+
+END SUBROUTINE LES_STDEV
+!-------------------------------------------------------------------------------  
+!
+END SUBROUTINE LES_CLOUD_MASKS_n   
diff --git a/src/PHYEX/ext/les_ini_timestepn.f90 b/src/PHYEX/ext/les_ini_timestepn.f90
new file mode 100644
index 0000000000000000000000000000000000000000..98c5cd306456bf19b2839c9ee608448392c07078
--- /dev/null
+++ b/src/PHYEX/ext/les_ini_timestepn.f90
@@ -0,0 +1,407 @@
+!MNH_LIC Copyright 2002-2021 CNRS, Meteo-France and Universite Paul Sabatier
+!MNH_LIC This is part of the Meso-NH software governed by the CeCILL-C licence
+!MNH_LIC version 1. See LICENSE, CeCILL-C_V1-en.txt and CeCILL-C_V1-fr.txt
+!MNH_LIC for details. version 1.
+!-----------------------------------------------------------------
+!      #######################
+MODULE MODI_LES_INI_TIMESTEP_n
+!      #######################
+!
+!
+INTERFACE LES_INI_TIMESTEP_n
+!
+      SUBROUTINE LES_INI_TIMESTEP_n(KTCOUNT)
+!
+INTEGER, INTENT(IN) :: KTCOUNT ! current model time-step
+!
+END SUBROUTINE LES_INI_TIMESTEP_n
+!
+END INTERFACE
+!
+END MODULE MODI_LES_INI_TIMESTEP_n
+
+!     ##############################
+      SUBROUTINE  LES_INI_TIMESTEP_n(KTCOUNT)
+!     ##############################
+!
+!
+!!****  *LES_INI_TIMESTEP_n* initializes the LES variables for
+!!                    the current time-step of model _n
+!!
+!!
+!!    PURPOSE
+!!    -------
+!!
+!!    EXTERNAL
+!!    --------
+!!
+!!    IMPLICIT ARGUMENTS
+!!    ------------------
+!!
+!!    REFERENCE
+!!    ---------
+!!
+!!    AUTHOR
+!!    ------
+!!      V. Masson
+!!
+!!    MODIFICATIONS
+!!    -------------
+!!      Original         06/11/02
+!  P. Wautelet 13/09/2019: budget: simplify and modernize date/time management
+!  P. Wautelet 30/03/2021: budgets: LES cartesian subdomain limits are defined in the physical domain
+! --------------------------------------------------------------------------
+!
+!*      0. DECLARATIONS
+!          ------------
+!
+USE MODD_CST
+USE MODD_NSV
+USE MODD_LES
+USE MODD_LES_n
+USE MODD_FIELD_n
+USE MODD_METRICS_n
+USE MODD_REF_n
+USE MODD_CONF_n
+USE MODD_TIME_n
+USE MODD_DYN_n
+USE MODD_TIME
+USE MODD_CONF
+USE MODD_LES_BUDGET
+!
+use mode_datetime,       only: Datetime_distance
+USE MODE_ll
+USE MODE_MODELN_HANDLER
+!
+USE MODI_LES_VER_INT
+USE MODI_THL_RT_FROM_TH_R
+USE MODI_LES_MEAN_ll
+USE MODI_SHUMAN
+!
+USE MODI_SECOND_MNH
+USE MODI_LES_CLOUD_MASKS_N
+!
+IMPLICIT NONE
+!
+!
+!*      0.1  declarations of arguments
+!
+!
+INTEGER, INTENT(IN) :: KTCOUNT ! current model time-step
+!
+!
+!       0.2  declaration of local variables
+!
+INTEGER :: IXOR_ll, IYOR_ll                    ! origine point coordinates
+!                                              ! of current processor domain
+!                                              ! on model domain on all
+!                                              ! processors
+INTEGER :: IIB_ll, IJB_ll                      ! SO point coordinates of
+!                                              ! current processor phys. domain
+!                                              ! on model domain on all
+!                                              ! processors
+INTEGER :: IIE_ll, IJE_ll                      ! NE point coordinates of
+!                                              ! current processor phys. domain
+!                                              ! on model domain on all
+!                                              ! processors
+INTEGER :: IIINF_MASK, IISUP_MASK              ! cart. mask local proc. limits
+INTEGER :: IJINF_MASK, IJSUP_MASK              ! cart. mask local proc. limits
+!
+INTEGER :: JK                                  ! vertical loop counter
+INTEGER :: IIB, IJB, IIE, IJE                  ! hor. indices
+INTEGER :: IIU, IJU                            ! hor. indices
+INTEGER :: IKU                                 ! ver. index
+INTEGER :: IRR, IRRC, IRRR, IRRI, IRRS, IRRG   ! moist variables indices
+!
+INTEGER :: JSV                                 ! scalar variables counter
+!
+REAL    :: ZTIME1, ZTIME2                      ! CPU time counters
+!
+REAL, DIMENSION(:,:,:),   ALLOCATABLE :: ZTHL ! theta_l
+REAL, DIMENSION(:,:,:),   ALLOCATABLE :: ZRT  ! total water
+REAL, DIMENSION(:,:,:),   ALLOCATABLE :: ZL   ! Latent heat of vaporization
+REAL, DIMENSION(:,:,:),   ALLOCATABLE :: ZCP  ! Cp
+REAL, DIMENSION(:,:,:),   ALLOCATABLE :: ZEXN ! Exner function
+INTEGER                               :: IMI  ! current model index
+!-------------------------------------------------------------------------------
+!
+!*      1.   Does current time-step is a LES time-step?
+!            -----------------------------------------
+!
+LLES_CALL= .FALSE.
+!
+CALL SECOND_MNH(ZTIME1)
+!
+IF (NLES_TCOUNT==NLES_TIMES) LLES_CALL=.FALSE.
+!
+IF ( KTCOUNT>1 .AND. MOD (KTCOUNT-1,NLES_DTCOUNT)==0) LLES_CALL=.TRUE.
+!
+IF (.NOT. LLES_CALL) RETURN
+!
+CALL BUDGET_FLAGS(LUSERV, LUSERC, LUSERR,         &
+                  LUSERI, LUSERS, LUSERG, LUSERH  )
+!
+NLES_TCOUNT = NLES_TCOUNT + 1
+!
+NLES_CURRENT_TCOUNT = NLES_TCOUNT
+!
+tles_dates(nles_tcount) = tdtcur
+call Datetime_distance( tdtseg, tdtcur, xles_times(nles_tcount) )
+!
+!* forward-in-time time-step
+!
+XCURRENT_TSTEP = XTSTEP
+!
+!-------------------------------------------------------------------------------
+!
+CALL GET_OR_ll     ('B',IXOR_ll,IYOR_ll)
+CALL GET_DIM_EXT_ll('B',IIU,IJU)
+CALL GET_INDICE_ll (IIB,IJB,IIE,IJE)
+!
+IIB_ll=IXOR_ll+IIB-1
+IJB_ll=IYOR_ll+IJB-1
+IIE_ll=IXOR_ll+IIE-1
+IJE_ll=IYOR_ll+IJE-1
+!
+IKU = SIZE(XTHT,3)
+!
+IMI = GET_CURRENT_MODEL_INDEX()
+!
+!-------------------------------------------------------------------------------
+!
+!*      2.   Definition of masks
+!            -------------------
+!
+!*      2.1  Cartesian (sub-)domain (on local processor)
+!            ----------------------
+!
+CALL LES_ALLOCATE('LLES_CURRENT_CART_MASK',(/IIU,IJU,NLES_K/))
+!
+IIINF_MASK = MAX(IIB, NLESn_IINF(IMI)+JPHEXT-(IIB_ll-1-JPHEXT))
+IJINF_MASK = MAX(IJB, NLESn_JINF(IMI)+JPHEXT-(IJB_ll-1-JPHEXT))
+IISUP_MASK = MIN(IIE, NLESn_ISUP(IMI)+JPHEXT-(IIB_ll-1-JPHEXT))
+IJSUP_MASK = MIN(IJE, NLESn_JSUP(IMI)+JPHEXT-(IJB_ll-1-JPHEXT))
+!
+!
+LLES_CURRENT_CART_MASK(:,:,:) = .FALSE.
+LLES_CURRENT_CART_MASK(IIINF_MASK:IISUP_MASK,IJINF_MASK:IJSUP_MASK,:) = .TRUE.
+!
+CLES_CURRENT_LBCX(:) = CLES_LBCX(:,IMI)
+CLES_CURRENT_LBCY(:) = CLES_LBCY(:,IMI)
+!
+!-------------------------------------------------------------------------------
+!
+!*      3.   Definition of LES vertical grid for this model
+!            ----------------------------------------------
+!
+IF (CLES_LEVEL_TYPE=='Z') THEN
+  IF (ASSOCIATED(XCOEFLIN_CURRENT_LES)) CALL LES_DEALLOCATE('XCOEFLIN_CURRENT_LES')
+  IF (ASSOCIATED(NKLIN_CURRENT_LES   )) CALL LES_DEALLOCATE('NKLIN_CURRENT_LES')
+  !
+  CALL LES_ALLOCATE('XCOEFLIN_CURRENT_LES',(/IIU,IJU,NLES_K/))
+  CALL LES_ALLOCATE('NKLIN_CURRENT_LES',(/IIU,IJU,NLES_K/))
+  !
+  XCOEFLIN_CURRENT_LES(:,:,:) = XCOEFLIN_LES(:,:,:)
+  NKLIN_CURRENT_LES   (:,:,:) = NKLIN_LES   (:,:,:)
+END IF
+!
+!-------------------------------------------------------------------------------
+!
+!*      4.   Definition of variables used in budgets for current model
+!            ---------------------------------------------------------
+!
+IF (LUSERC) THEN
+  ALLOCATE(XCURRENT_L_O_EXN_CP (IIU,IJU,IKU))
+ELSE
+  ALLOCATE(XCURRENT_L_O_EXN_CP (0,0,0))
+END IF
+ALLOCATE(XCURRENT_RHODJ      (IIU,IJU,IKU))
+!
+!* coefficients for Th to Thl conversion
+!
+IF (LUSERC) THEN
+  ALLOCATE(ZL  (IIU,IJU,IKU))
+  ALLOCATE(ZEXN(IIU,IJU,IKU))
+  ALLOCATE(ZCP (IIU,IJU,IKU))
+  !
+  !* Exner function
+  !
+  ZEXN(:,:,:) = (XPABST/XP00)**(XRD/XCPD)
+  !
+  !* Latent heat of vaporization
+  !
+  ZL(:,:,:) = XLVTT + (XCPD-XCL) * (XTHT(:,:,:)*ZEXN(:,:,:)-XTT)
+  !
+  !* heat capacity at constant pressure of the humid air
+  !
+  ZCP(:,:,:) = XCPD
+  IRR=2
+  ZCP(:,:,:) = ZCP(:,:,:) + XCPV * XRT(:,:,:,1)
+  ZCP(:,:,:) = ZCP(:,:,:) + XCL  * XRT(:,:,:,2)
+  IF (LUSERR) THEN
+    IRR=IRR+1
+    ZCP(:,:,:) = ZCP(:,:,:) + XCL  * XRT(:,:,:,IRR)
+  END IF
+  IF (LUSERI) THEN
+    IRR=IRR+1
+    ZCP(:,:,:) = ZCP(:,:,:) + XCI  * XRT(:,:,:,IRR)
+  END IF
+  IF (LUSERS) THEN
+    IRR=IRR+1
+    ZCP(:,:,:) = ZCP(:,:,:) + XCI  * XRT(:,:,:,IRR)
+  END IF
+  IF (LUSERG) THEN
+    IRR=IRR+1
+    ZCP(:,:,:) = ZCP(:,:,:) + XCI  * XRT(:,:,:,IRR)
+  END IF
+  IF (LUSERH) THEN
+    IRR=IRR+1
+    ZCP(:,:,:) = ZCP(:,:,:) + XCI  * XRT(:,:,:,IRR)
+  END IF
+  !
+  !* L / (Exn * Cp)
+  !
+  XCURRENT_L_O_EXN_CP(:,:,:) = ZL(:,:,:) / ZEXN(:,:,:) / ZCP(:,:,:)
+  !
+  DEALLOCATE(ZL  )
+  DEALLOCATE(ZEXN)
+  DEALLOCATE(ZCP )
+END IF
+!
+!* other initializations
+!
+XCURRENT_RHODJ=XRHODJ
+!
+LCURRENT_USERV=LUSERV
+LCURRENT_USERC=LUSERC
+LCURRENT_USERR=LUSERR
+LCURRENT_USERI=LUSERI
+LCURRENT_USERS=LUSERS
+LCURRENT_USERG=LUSERG
+LCURRENT_USERH=LUSERH
+!
+NCURRENT_RR = NRR
+!
+ALLOCATE(XCURRENT_RUS  (IIU,IJU,IKU))
+ALLOCATE(XCURRENT_RVS  (IIU,IJU,IKU))
+ALLOCATE(XCURRENT_RWS  (IIU,IJU,IKU))
+ALLOCATE(XCURRENT_RTHS (IIU,IJU,IKU))
+ALLOCATE(XCURRENT_RTKES(IIU,IJU,IKU))
+ALLOCATE(XCURRENT_RRS  (IIU,IJU,IKU,NRR))
+ALLOCATE(XCURRENT_RSVS (IIU,IJU,IKU,NSV))
+ALLOCATE(XCURRENT_RTHLS(IIU,IJU,IKU))
+ALLOCATE(XCURRENT_RRTS (IIU,IJU,IKU))
+!
+XCURRENT_RUS  =XRUS
+XCURRENT_RVS  =XRVS
+XCURRENT_RWS  =XRWS
+XCURRENT_RTHS =XRTHS
+XCURRENT_RTKES=XRTKES
+XCURRENT_RRS  =XRRS
+XCURRENT_RSVS =XRSVS
+CALL THL_RT_FROM_TH_R(LUSERV, LUSERC, LUSERR,             &
+                      LUSERI, LUSERS, LUSERG, LUSERH,     &
+                      XCURRENT_L_O_EXN_CP,                &
+                      XCURRENT_RTHS, XCURRENT_RRS,        &
+                      XCURRENT_RTHLS, XCURRENT_RRTS       )
+
+ALLOCATE(X_LES_BU_RES_KE   (NLES_K,NLES_TOT))
+ALLOCATE(X_LES_BU_RES_WThl (NLES_K,NLES_TOT))
+ALLOCATE(X_LES_BU_RES_Thl2 (NLES_K,NLES_TOT))
+ALLOCATE(X_LES_BU_SBG_Tke  (NLES_K,NLES_TOT))
+ALLOCATE(X_LES_BU_RES_WRt  (NLES_K,NLES_TOT))
+ALLOCATE(X_LES_BU_RES_Rt2  (NLES_K,NLES_TOT))
+ALLOCATE(X_LES_BU_RES_ThlRt(NLES_K,NLES_TOT))
+ALLOCATE(X_LES_BU_RES_Sv2  (NLES_K,NLES_TOT,NSV))
+ALLOCATE(X_LES_BU_RES_WSv  (NLES_K,NLES_TOT,NSV))
+
+X_LES_BU_RES_KE   = 0.
+X_LES_BU_RES_WThl = 0.
+X_LES_BU_RES_Thl2 = 0.
+X_LES_BU_SBG_Tke  = 0.
+X_LES_BU_RES_WRt  = 0.
+X_LES_BU_RES_Rt2  = 0.
+X_LES_BU_RES_ThlRt= 0.
+X_LES_BU_RES_Sv2  = 0.
+X_LES_BU_RES_WSv  = 0.
+!
+!-------------------------------------------------------------------------------
+!
+!*      4.   Definition of anomaly fields
+!            ----------------------------
+!
+ALLOCATE (XU_ANOM  (IIU,IJU,NLES_K))
+ALLOCATE (XV_ANOM  (IIU,IJU,NLES_K))
+ALLOCATE (XW_ANOM  (IIU,IJU,NLES_K))
+ALLOCATE (XTHL_ANOM(IIU,IJU,NLES_K))
+IF (LUSERV) THEN
+  ALLOCATE (XRT_ANOM (IIU,IJU,NLES_K))
+ELSE
+  ALLOCATE (XRT_ANOM (0,0,0))
+END IF
+ALLOCATE (XSV_ANOM (IIU,IJU,NLES_K,NSV))
+!
+!*      4.1  conservative variables
+!            ----------------------
+!
+ALLOCATE(ZTHL(IIU,IJU,IKU))
+ALLOCATE(ZRT (IIU,IJU,IKU))
+CALL THL_RT_FROM_TH_R(LUSERV, LUSERC, LUSERR,             &
+                      LUSERI, LUSERS, LUSERG, LUSERH,     &
+                      XCURRENT_L_O_EXN_CP,                &
+                      XTHT, XRT,                          &
+                      ZTHL, ZRT                           )
+!
+!*      4.2  anomaly fields on the LES grid
+!            ------------------------------
+!
+CALL LES_ANOMALY_FIELD(MXF(XUT),XU_ANOM)
+CALL LES_ANOMALY_FIELD(MYF(XVT),XV_ANOM)
+CALL LES_ANOMALY_FIELD(MZF(XWT),XW_ANOM)
+CALL LES_ANOMALY_FIELD(ZTHL,XTHL_ANOM)
+IF (LUSERV) CALL LES_ANOMALY_FIELD(ZRT,XRT_ANOM)
+DO JSV=1,NSV
+  CALL LES_ANOMALY_FIELD(XSVT(:,:,:,JSV),XSV_ANOM(:,:,:,JSV))
+END DO
+!
+!-------------------------------------------------------------------------------
+!
+DEALLOCATE(ZTHL)
+DEALLOCATE(ZRT )
+!-------------------------------------------------------------------------------
+!
+!*      6.0  Nebulosity masks
+!            ----------------
+!
+CALL LES_CLOUD_MASKS_n
+!
+!-------------------------------------------------------------------------------
+CALL SECOND_MNH(ZTIME2)
+XTIME_LES_BU = XTIME_LES_BU + ZTIME2 - ZTIME1
+!--------------------------------------------------------------------------------
+!
+CONTAINS
+!
+!--------------------------------------------------------------------------------
+!
+SUBROUTINE LES_ANOMALY_FIELD(PF,PF_ANOM)
+!
+REAL, DIMENSION(:,:,:), INTENT(IN)  :: PF
+REAL, DIMENSION(:,:,:), INTENT(OUT) :: PF_ANOM
+
+REAL, DIMENSION(SIZE(PF_ANOM,3)) :: ZMEAN
+INTEGER :: JI, JJ
+
+CALL LES_VER_INT(PF, PF_ANOM)
+CALL LES_MEAN_ll(PF_ANOM, LLES_CURRENT_CART_MASK, ZMEAN  )
+DO JJ=1,SIZE(PF_ANOM,2)
+  DO JI=1,SIZE(PF_ANOM,1)
+    PF_ANOM(JI,JJ,:) = PF_ANOM(JI,JJ,:) - ZMEAN(:)
+  END DO
+END DO
+
+END SUBROUTINE LES_ANOMALY_FIELD
+!--------------------------------------------------------------------------------
+!
+END SUBROUTINE LES_INI_TIMESTEP_n   
+
diff --git a/src/PHYEX/ext/lesn.f90 b/src/PHYEX/ext/lesn.f90
new file mode 100644
index 0000000000000000000000000000000000000000..6411b6cc5518e610d79264dfc126b8f9f38c6a79
--- /dev/null
+++ b/src/PHYEX/ext/lesn.f90
@@ -0,0 +1,3582 @@
+!MNH_LIC Copyright 2000-2023 CNRS, Meteo-France and Universite Paul Sabatier
+!MNH_LIC This is part of the Meso-NH software governed by the CeCILL-C licence
+!MNH_LIC version 1. See LICENSE, CeCILL-C_V1-en.txt and CeCILL-C_V1-fr.txt
+!MNH_LIC for details. version 1.
+!-----------------------------------------------------------------
+!     #################
+      SUBROUTINE  LES_n
+!     #################
+!
+!
+!!****  *LES_n* computes the current time-step LES diagnostics for model _n
+!!
+!!
+!!    PURPOSE
+!!    -------
+!!
+!!    EXTERNAL
+!!    --------
+!!
+!!    IMPLICIT ARGUMENTS
+!!    ------------------
+!!
+!!    REFERENCE
+!!    ---------
+!!
+!!    AUTHOR
+!!    ------
+!!      V. Masson
+!!
+!!    MODIFICATIONS
+!!    -------------
+!!      Original  07/02/00
+!!                01/02/01 (D. Gazen) add module MODD_NSV for NSV variable
+!!                06/11/02 (V. Masson) add LES budgets and use of anomalies
+!!                         in LES quantities computations
+!!                01/04/03 (V. Masson and F. Couvreux) bug in BL height loop
+!!                   10/07 (J.Pergaud) Add mass flux diagnostics
+!!                06/08    (O.Thouron) Add radiative diagnostics
+!!                12/10    (R.Honnert) Add EDKF mass flux in BL height
+!!                10/09    (P. Aumond) Add possibility of user maskS
+!!                10/14    (C.Lac) Correction on user masks
+!!                10/16    (C.Lac) Add ground droplet deposition amount
+!!  Philippe Wautelet: 05/2016-04/2018: new data structures and calls for I/O
+!!                     02/2019 (C. Lac) Add rain fraction as a LES diagnostic
+!!
+!! --------------------------------------------------------------------------
+!
+!*      0. DECLARATIONS
+!          ------------
+!
+USE MODD_CST
+USE MODD_CTURB, ONLY : XFTOP_O_FSURF
+!
+USE MODD_LES
+USE MODD_LES_BUDGET
+USE MODD_CONF
+USE MODD_DIMPHYEX,   ONLY: DIMPHYEX_t
+USE MODD_LES_n
+USE MODD_RADIATIONS_n
+USE MODD_GRID_n
+USE MODD_REF_n
+USE MODD_FIELD_n
+USE MODD_CONF_n
+USE MODD_PARAM_n
+USE MODD_TURB_n
+USE MODD_METRICS_n
+USE MODD_LUNIT_n, ONLY: TLUOUT
+USE MODD_PARAM_n, ONLY: CCLOUD
+USE MODD_PRECIP_n, ONLY: XINPRR,XACPRR,XINPRR3D,XEVAP3D,XINPRC,XINDEP
+USE MODD_NSV, ONLY : NSV, NSV_CS
+USE MODD_PARAM_ICE_n, ONLY: LDEPOSC,LSEDIC
+USE MODD_PARAM_C2R2, ONLY: LDEPOC,LSEDC
+USE MODD_PARAM_LIMA, ONLY : MSEDC=>LSEDC
+!
+USE MODI_SHUMAN
+USE MODI_GRADIENT_M
+USE MODI_GRADIENT_U
+USE MODI_GRADIENT_V
+USE MODI_GRADIENT_W
+USE MODI_LES_VER_INT
+USE MODI_SPEC_VER_INT
+USE MODI_LES_MEAN_ll
+USE MODI_THL_RT_FROM_TH_R
+USE MODI_LES_RES_TR
+USE MODI_BUDGET_FLAGS
+USE MODI_LES_BUDGET_TEND_n
+USE MODE_BL_DEPTH_DIAG
+!
+USE MODE_ll
+USE MODE_MODELN_HANDLER
+USE MODE_FILL_DIMPHYEX, ONLY: FILL_DIMPHYEX
+!
+IMPLICIT NONE
+!
+!
+!*      0.1  declarations of arguments
+!
+!
+!       0.2  declaration of local variables
+!
+REAL, DIMENSION(:,:,:),   ALLOCATABLE :: ZEXN      ! Exner function
+REAL, DIMENSION(:,:,:),   ALLOCATABLE :: ZTHL      ! liquid potential temperature
+REAL, DIMENSION(:,:,:),   ALLOCATABLE :: ZTHV      ! virtual potential temperature
+REAL, DIMENSION(:,:,:),   ALLOCATABLE :: ZRHO      ! air density
+!
+REAL, DIMENSION(:,:,:),    ALLOCATABLE :: CHAMPXY1    !tableau intermediaire
+REAL, DIMENSION(:,:,:),   ALLOCATABLE :: ZTEMP     ! Temperature
+REAL, DIMENSION(:,:,:),   ALLOCATABLE :: ZEW
+REAL, DIMENSION(:,:,:),   ALLOCATABLE :: ZINDCLD   !indice cloud si rc>0
+REAL, DIMENSION(:,:,:),   ALLOCATABLE :: ZINDCLD2  !indice cloud rc>1E-5
+REAL, DIMENSION(:,:,:),   ALLOCATABLE :: ZCLDFR_LES! CLDFR    on LES vertical grid
+REAL, DIMENSION(:,:,:),   ALLOCATABLE :: ZICEFR_LES! ICEFR    on LES vertical grid
+REAL, DIMENSION(:,:,:),   ALLOCATABLE :: ZRAINFR_LES! RAINFR   on LES vertical grid
+REAL, DIMENSION(:,:,:),   ALLOCATABLE :: ZMASSF    ! massflux=rho*w
+REAL, DIMENSION(:,:,:),   ALLOCATABLE :: ZREHU     ! relative humidity
+
+
+REAL, DIMENSION(:,:,:),   ALLOCATABLE :: ZZ_LES    ! alt.  on LES vertical grid
+REAL, DIMENSION(:,:,:),   ALLOCATABLE ::ZZZ_LES
+REAL, DIMENSION(:,:,:),   ALLOCATABLE ::ZINPRR3D_LES   ! precipitation flux 3D
+REAL, DIMENSION(:,:,:),   ALLOCATABLE ::ZEVAP3D_LES !evaporation 3D
+REAL, DIMENSION(:,:,:),   ALLOCATABLE :: ZP_LES    ! pres. on LES vertical grid
+REAL, DIMENSION(:,:,:),   ALLOCATABLE :: ZDP_LES   ! dynamical production TKE   
+REAL, DIMENSION(:,:,:),   ALLOCATABLE :: ZTP_LES   ! thermal production TKE    
+REAL, DIMENSION(:,:,:),   ALLOCATABLE :: ZTR_LES   ! transport production TKE    
+REAL, DIMENSION(:,:,:),   ALLOCATABLE :: ZDISS_LES ! dissipation TKE    
+REAL, DIMENSION(:,:,:),   ALLOCATABLE :: ZLM_LES    ! mixing length
+
+REAL, DIMENSION(:,:,:),   ALLOCATABLE :: ZDPDZ_LES   ! dp/dz on LES vertical grid
+REAL, DIMENSION(:,:,:),   ALLOCATABLE :: ZDTHLDZ_LES ! dThl/dz on LES vertical grid
+REAL, DIMENSION(:,:,:),   ALLOCATABLE :: ZDTHDZ_LES ! dTh/dz on LES vertical grid
+REAL, DIMENSION(:,:,:),   ALLOCATABLE :: ZDRTDZ_LES  ! dRt/dz  on LES vertical grid
+REAL, DIMENSION(:,:,:,:), ALLOCATABLE :: ZDSvDZ_LES  ! dSv/dz  on LES vertical grid
+REAL, DIMENSION(:,:,:),   ALLOCATABLE :: ZDUDZ_LES ! du/dz on LES vertical grid
+REAL, DIMENSION(:,:,:),   ALLOCATABLE :: ZDVDZ_LES ! dv/dz on LES vertical grid
+REAL, DIMENSION(:,:,:),   ALLOCATABLE :: ZDWDZ_LES ! dw/dz on LES vertical grid
+REAL, DIMENSION(:,:,:),   ALLOCATABLE :: ZEXN_LES  ! Exner on LES vertical grid
+REAL, DIMENSION(:,:,:),   ALLOCATABLE :: ZRHO_LES  ! rho   on LES vertical grid
+REAL, DIMENSION(:,:,:),   ALLOCATABLE :: ZU_LES    ! U     on LES vertical grid
+REAL, DIMENSION(:,:,:),   ALLOCATABLE :: ZV_LES    ! V     on LES vertical grid
+REAL, DIMENSION(:,:,:),   ALLOCATABLE :: ZW_LES    ! W     on LES vertical grid
+REAL, DIMENSION(:,:,:),   ALLOCATABLE :: ZMF_LES   ! mass flux on LES vertical grid
+REAL, DIMENSION(:,:,:),   ALLOCATABLE :: ZTH_LES   ! Theta on LES vertical grid
+REAL, DIMENSION(:,:,:),   ALLOCATABLE :: ZTHV_LES  ! thv   on LES vertical grid
+REAL, DIMENSION(:,:,:),   ALLOCATABLE :: ZTHL_LES  ! thl   on LES vertical grid
+REAL, DIMENSION(:,:,:),   ALLOCATABLE :: ZTKE_LES  ! tke   on LES vertical grid
+REAL, DIMENSION(:,:,:),   ALLOCATABLE :: ZKE_LES   ! ke   on LES vertical grid
+REAL, DIMENSION(:,:,:),   ALLOCATABLE :: ZRV_LES   ! Rv    on LES vertical grid
+REAL, DIMENSION(:,:,:),   ALLOCATABLE :: ZREHU_LES ! Rehu  on LES vertical grid
+REAL, DIMENSION(:,:,:),   ALLOCATABLE :: ZRC_LES   ! Rc    on LES vertical grid
+REAL, DIMENSION(:,:,:),   ALLOCATABLE :: ZRR_LES   ! Rr    on LES vertical grid
+REAL, DIMENSION(:,:,:),   ALLOCATABLE :: ZRI_LES   ! Ri    on LES vertical grid
+REAL, DIMENSION(:,:,:),   ALLOCATABLE :: ZRS_LES   ! Rs    on LES vertical grid
+REAL, DIMENSION(:,:,:),   ALLOCATABLE :: ZRG_LES   ! Rg    on LES vertical grid
+REAL, DIMENSION(:,:,:),   ALLOCATABLE :: ZRH_LES   ! Rh    on LES vertical grid
+REAL, DIMENSION(:,:,:),   ALLOCATABLE :: ZRT_LES   ! Rt    on LES vertical grid
+REAL, DIMENSION(:,:,:,:), ALLOCATABLE :: ZSV_LES   ! Sv    on LES vertical grid
+REAL, DIMENSION(:,:,:),   ALLOCATABLE :: ZTH_ANOM  ! Theta anomaly on LES vertical grid
+REAL, DIMENSION(:,:,:),   ALLOCATABLE :: ZTHV_ANOM ! thv   anomaly on LES vertical grid
+REAL, DIMENSION(:,:,:),   ALLOCATABLE :: ZRV_ANOM  ! Rv    anomaly on LES vertical grid
+REAL, DIMENSION(:,:,:),   ALLOCATABLE :: ZRC_ANOM  ! Rc    anomaly on LES vertical grid
+REAL, DIMENSION(:,:,:),   ALLOCATABLE :: ZRI_ANOM  ! Ri    anomaly on LES vertical grid
+REAL, DIMENSION(:,:,:),   ALLOCATABLE :: ZRR_ANOM  ! Rr    anomaly on LES vertical grid
+REAL, DIMENSION(:,:,:),   ALLOCATABLE :: ZP_ANOM   ! p     anomaly on LES vertical grid
+REAL, DIMENSION(:,:,:),   ALLOCATABLE :: ZRHO_ANOM ! rho   anomaly on LES vertical grid
+REAL, DIMENSION(:,:,:),   ALLOCATABLE :: ZDPDZ_ANOM! dp/dz anomaly on LES vertical grid
+REAL, DIMENSION(:),       ALLOCATABLE :: ZMEAN_DPDZ! dp/dz mean    on LES vertical grid
+REAL, DIMENSION(:),       ALLOCATABLE :: ZLES_MEAN_DRtDZ! drt/dz mean    on LES vertical grid
+REAL, DIMENSION(:),       ALLOCATABLE :: ZLES_MEAN_DTHDZ! dth/dz mean    on LES vertical grid
+REAL, DIMENSION(:,:),     ALLOCATABLE :: ZLES_MEAN_DSVDZ! drt/dz mean    on LES vertical grid
+REAL, DIMENSION(:,:),     ALLOCATABLE :: ZLWP_LES, ZRWP_LES, ZTKET_LES
+REAL, DIMENSION(:,:),     ALLOCATABLE :: ZIWP_LES, ZSWP_LES, ZGWP_LES, ZHWP_LES
+REAL, DIMENSION(:,:),     ALLOCATABLE :: ZINDCLD2D  !
+REAL, DIMENSION(:,:),     ALLOCATABLE :: ZINDCLD2D2 !
+REAL, DIMENSION(:,:),     ALLOCATABLE :: ZLWP_ANOM ! lwp anomaly
+REAL, DIMENSION(:,:),     ALLOCATABLE :: ZMAXWRR2D ! maxwrr2D
+!
+REAL, DIMENSION(:,:,:),   ALLOCATABLE :: ZU_SPEC   ! U     on SPEC vertical grid
+REAL, DIMENSION(:,:,:),   ALLOCATABLE :: ZV_SPEC   ! V     on SPEC vertical grid
+REAL, DIMENSION(:,:,:),   ALLOCATABLE :: ZW_SPEC   ! W     on SPEC vertical grid
+REAL, DIMENSION(:,:,:),   ALLOCATABLE :: ZTH_SPEC  ! Theta on SPEC vertical grid
+REAL, DIMENSION(:,:,:),   ALLOCATABLE :: ZTHL_SPEC ! thl   on SPEC vertical grid
+REAL, DIMENSION(:,:,:),   ALLOCATABLE :: ZRV_SPEC  ! Rv    on SPEC vertical grid
+REAL, DIMENSION(:,:,:),   ALLOCATABLE :: ZRC_SPEC  ! Rc    on SPEC vertical grid
+REAL, DIMENSION(:,:,:),   ALLOCATABLE :: ZRI_SPEC  ! Ri    on SPEC vertical grid
+REAL, DIMENSION(:,:,:,:), ALLOCATABLE :: ZSV_SPEC  ! Sv    on SPEC vertical grid
+!
+REAL, DIMENSION(:,:,:),   ALLOCATABLE  :: ZRT      ! rv+rc+rr+ri+rs+rg+rh
+REAL, DIMENSION(:),       ALLOCATABLE  :: ZWORK1D,ZWORK1DT
+REAL, DIMENSION(:,:),     ALLOCATABLE  :: ZWORK2D
+REAL :: ZINPRRm,ZCOUNT
+REAL, DIMENSION(:,:,:),   ALLOCATABLE :: ZRADEFF_LES   ! Re on LES vertical grid
+!!fl sw, lw, dthrad on LES vertical grid
+REAL, DIMENSION(:,:,:),   ALLOCATABLE :: ZSWU_LES   ! SWU on LES vertical grid
+REAL, DIMENSION(:,:,:),   ALLOCATABLE :: ZSWD_LES   ! SWD on LES vertical grid
+REAL, DIMENSION(:,:,:),   ALLOCATABLE :: ZLWU_LES   ! LWU on LES vertical grid
+REAL, DIMENSION(:,:,:),   ALLOCATABLE :: ZLWD_LES   ! LWD on LES vertical grid
+REAL, DIMENSION(:,:,:),   ALLOCATABLE :: ZDTHRADSW_LES   ! DTHRADSW on LES vertical grid
+REAL, DIMENSION(:,:,:),   ALLOCATABLE :: ZDTHRADLW_LES   ! DTHRADLW on LES vertical grid
+!
+REAL, DIMENSION(:),   ALLOCATABLE :: ZWORK   ! 
+!
+INTEGER :: IRR      ! moist variables counter
+INTEGER :: JSV      ! scalar variables counter
+INTEGER :: IIU, IJU ! array sizes
+INTEGER :: IKE,IKB
+INTEGER :: JI, JJ, JK   ! loop counters
+INTEGER :: IIU_ll, IJU_ll    ! total domain I size (fin)
+INTEGER :: IIA_ll, IJA_ll    ! total domain I size (debut)
+INTEGER :: IINFO_ll      ! return code of parallel routine
+INTEGER :: IIMAX_ll, IJMAX_ll  ! total physical domain I size
+INTEGER :: JLOOP
+!
+INTEGER :: IMASK    ! mask counter
+INTEGER :: IMASKUSER! mask user number 
+!
+INTEGER :: IRESP, ILUOUT
+INTEGER :: IMI      ! Current model index
+TYPE(DIMPHYEX_t) :: YLDIMPHYEX
+!-------------------------------------------------------------------------------
+!
+IMI = GET_CURRENT_MODEL_INDEX()
+!
+IF (.NOT. LLES_CALL) RETURN
+!
+CALL GET_GLOBALDIMS_ll(IIMAX_ll,IJMAX_ll)
+IIU_ll = IIMAX_ll+JPHEXT
+IJU_ll = IJMAX_ll+JPHEXT
+IIA_ll=JPHEXT+1
+IJA_ll=JPHEXT+1
+IKE=SIZE(XVT,3)-JPVEXT
+IKB=1+JPVEXT
+CALL GET_DIM_EXT_ll('B',IIU,IJU)
+CALL FILL_DIMPHYEX(YLDIMPHYEX, SIZE(XTHT,1), SIZE(XTHT,2), SIZE(XTHT,3),.TRUE.)
+!
+ILUOUT = TLUOUT%NLU
+!
+!-------------------------------------------------------------------------------
+!
+!* interpolation coefficients for Z type grid
+!
+IF (CSPECTRA_LEVEL_TYPE=='Z') THEN
+  IF (ASSOCIATED(XCOEFLIN_CURRENT_SPEC)) CALL LES_DEALLOCATE('XCOEFLIN_CURRENT_SPEC')
+  IF (ASSOCIATED(NKLIN_CURRENT_SPEC   )) CALL LES_DEALLOCATE('NKLIN_CURRENT_SPEC')
+  !
+  CALL LES_ALLOCATE('XCOEFLIN_CURRENT_SPEC',(/IIU,IJU,NSPECTRA_K/))
+  CALL LES_ALLOCATE('NKLIN_CURRENT_SPEC',(/IIU,IJU,NSPECTRA_K/))
+  !
+  XCOEFLIN_CURRENT_SPEC(:,:,:) = XCOEFLIN_SPEC(:,:,:)
+  NKLIN_CURRENT_SPEC   (:,:,:) = NKLIN_SPEC   (:,:,:)
+END IF
+!
+!-------------------------------------------------------------------------------
+!
+!*      1.   Allocations
+!            -----------
+!
+ALLOCATE(ZP_LES   (IIU,IJU,NLES_K))
+ALLOCATE(ZDP_LES   (IIU,IJU,NLES_K))
+ALLOCATE(ZTP_LES   (IIU,IJU,NLES_K))
+ALLOCATE(ZTR_LES   (IIU,IJU,NLES_K))
+ALLOCATE(ZDISS_LES   (IIU,IJU,NLES_K))
+ALLOCATE(ZLM_LES   (IIU,IJU,NLES_K))
+ALLOCATE(ZDTHLDZ_LES(IIU,IJU,NLES_K))
+ALLOCATE(ZDTHDZ_LES(IIU,IJU,NLES_K))
+ALLOCATE(ZDRTDZ_LES(IIU,IJU,NLES_K))
+ALLOCATE(ZDUDZ_LES(IIU,IJU,NLES_K))
+ALLOCATE(ZDVDZ_LES(IIU,IJU,NLES_K))
+ALLOCATE(ZDWDZ_LES(IIU,IJU,NLES_K))
+ALLOCATE(ZDSVDZ_LES(IIU,IJU,NLES_K,NSV))
+
+ALLOCATE(ZDPDZ_LES(IIU,IJU,NLES_K))
+ALLOCATE(ZEXN_LES (IIU,IJU,NLES_K))
+ALLOCATE(ZRHO_LES (IIU,IJU,NLES_K))
+ALLOCATE(ZU_LES   (IIU,IJU,NLES_K))
+ALLOCATE(ZV_LES   (IIU,IJU,NLES_K))
+ALLOCATE(ZW_LES   (IIU,IJU,NLES_K))
+ALLOCATE(ZMF_LES  (IIU,IJU,NLES_K))
+ALLOCATE(ZTH_LES  (IIU,IJU,NLES_K))
+IF (CRAD /= 'NONE') THEN
+  ALLOCATE(ZRADEFF_LES  (IIU,IJU,NLES_K))
+  ALLOCATE(ZSWU_LES  (IIU,IJU,NLES_K))
+  ALLOCATE(ZSWD_LES  (IIU,IJU,NLES_K))
+  ALLOCATE(ZLWU_LES  (IIU,IJU,NLES_K))
+  ALLOCATE(ZLWD_LES  (IIU,IJU,NLES_K))
+  ALLOCATE(ZDTHRADSW_LES  (IIU,IJU,NLES_K))
+  ALLOCATE(ZDTHRADLW_LES  (IIU,IJU,NLES_K))
+ELSE
+  ALLOCATE(ZRADEFF_LES  (0,0,0))
+  ALLOCATE(ZSWU_LES  (0,0,0))
+  ALLOCATE(ZSWD_LES  (0,0,0))
+  ALLOCATE(ZLWU_LES  (0,0,0))
+  ALLOCATE(ZLWD_LES  (0,0,0))
+  ALLOCATE(ZDTHRADSW_LES  (0,0,0))
+  ALLOCATE(ZDTHRADLW_LES  (0,0,0))
+END IF
+IF (LUSERV) THEN
+  ALLOCATE(ZTHV_LES (IIU,IJU,NLES_K))
+ELSE
+  ALLOCATE(ZTHV_LES (0,0,0))
+END IF
+ALLOCATE(ZTHL_LES (IIU,IJU,NLES_K))
+ALLOCATE(ZTKE_LES (IIU,IJU,NLES_K))
+ALLOCATE(ZKE_LES(IIU,IJU,NLES_K))
+ALLOCATE(ZTKET_LES(IIU,IJU))
+ALLOCATE(ZWORK1D (NLES_K))
+ALLOCATE(ZWORK1DT (NLES_K))
+ALLOCATE(ZZZ_LES(IIU,IJU,NLES_K))
+IF (LUSERV) THEN
+  ALLOCATE(ZRV_LES    (IIU,IJU,NLES_K))
+  ALLOCATE(ZRT_LES    (IIU,IJU,NLES_K))
+  ALLOCATE(ZREHU_LES  (IIU,IJU,NLES_K))
+ELSE
+  ALLOCATE(ZRV_LES    (0,0,0))
+  ALLOCATE(ZRT_LES    (0,0,0))
+  ALLOCATE(ZREHU_LES  (0,0,0))
+END IF
+IF (LUSERC) THEN
+  ALLOCATE(ZRC_LES    (IIU,IJU,NLES_K))
+  ALLOCATE(ZLWP_LES(IIU,IJU))
+  ALLOCATE(ZINDCLD2D(IIU,IJU))
+  ALLOCATE(ZINDCLD2D2(IIU,IJU))
+  ALLOCATE(ZCLDFR_LES(IIU,IJU,NLES_K))
+  ALLOCATE(ZWORK2D(IIU,IJU))
+  ALLOCATE(ZLWP_ANOM(IIU,IJU))
+ELSE
+  ALLOCATE(ZRC_LES    (0,0,0))
+  ALLOCATE(ZLWP_LES(0,0))
+  ALLOCATE(ZINDCLD2D(0,0))
+  ALLOCATE(ZINDCLD2D2(0,0))
+  ALLOCATE(ZCLDFR_LES(0,0,0))
+  ALLOCATE(ZWORK2D(0,0))
+  ALLOCATE(ZLWP_ANOM(0,0))
+END IF
+IF (LUSERR) THEN
+  ALLOCATE(ZRR_LES  (IIU,IJU,NLES_K))
+  ALLOCATE(ZMAXWRR2D(IIU,IJU))
+  ALLOCATE(ZRWP_LES(IIU,IJU))
+  ALLOCATE(ZINPRR3D_LES (IIU,IJU,NLES_K))
+  ALLOCATE(ZEVAP3D_LES  (IIU,IJU,NLES_K))
+  ALLOCATE(ZRAINFR_LES(IIU,IJU,NLES_K))
+ELSE
+  ALLOCATE(ZRR_LES  (0,0,0))
+  ALLOCATE(ZMAXWRR2D(0,0))
+  ALLOCATE(ZRWP_LES(0,0))
+  ALLOCATE(ZINPRR3D_LES(0,0,0))
+  ALLOCATE(ZEVAP3D_LES(0,0,0))
+  ALLOCATE(ZRAINFR_LES(0,0,0))
+END IF
+IF (LUSERI) THEN
+  ALLOCATE(ZRI_LES    (IIU,IJU,NLES_K))
+  ALLOCATE(ZIWP_LES(IIU,IJU))
+  ALLOCATE(ZICEFR_LES(IIU,IJU,NLES_K))
+ELSE
+  ALLOCATE(ZRI_LES    (0,0,0))
+  ALLOCATE(ZIWP_LES(0,0))
+  ALLOCATE(ZICEFR_LES(0,0,0))
+END IF
+IF (LUSERS) THEN
+  ALLOCATE(ZRS_LES  (IIU,IJU,NLES_K))
+  ALLOCATE(ZSWP_LES(IIU,IJU))
+ELSE
+  ALLOCATE(ZRS_LES  (0,0,0))
+  ALLOCATE(ZSWP_LES(0,0))
+END IF
+IF (LUSERG) THEN
+  ALLOCATE(ZRG_LES  (IIU,IJU,NLES_K))
+  ALLOCATE(ZGWP_LES(IIU,IJU))
+ELSE
+  ALLOCATE(ZRG_LES  (0,0,0))
+  ALLOCATE(ZGWP_LES(0,0))
+END IF
+IF (LUSERH) THEN
+  ALLOCATE(ZRH_LES  (IIU,IJU,NLES_K))
+  ALLOCATE(ZHWP_LES(IIU,IJU))
+ELSE
+  ALLOCATE(ZRH_LES  (0,0,0))
+  ALLOCATE(ZHWP_LES(0,0))
+END IF
+IF (NSV>0) THEN
+  ALLOCATE(ZSV_LES  (IIU,IJU,NLES_K,NSV))
+ELSE
+  ALLOCATE(ZSV_LES  (0,0,0,0))
+END IF
+!
+ALLOCATE(ZP_ANOM   (IIU,IJU,NLES_K))
+ALLOCATE(ZRHO_ANOM (IIU,IJU,NLES_K))
+ALLOCATE(ZTH_ANOM  (IIU,IJU,NLES_K))
+ALLOCATE(ZDPDZ_ANOM(IIU,IJU,NLES_K))
+IF (LUSERV) THEN
+  ALLOCATE(ZTHV_ANOM(IIU,IJU,NLES_K))
+  ALLOCATE(ZRV_ANOM (IIU,IJU,NLES_K))
+ELSE
+  ALLOCATE(ZTHV_ANOM(0,0,0))
+  ALLOCATE(ZRV_ANOM (0,0,0))
+END IF
+IF (LUSERC) THEN
+  ALLOCATE(ZRC_ANOM (IIU,IJU,NLES_K))
+ELSE
+  ALLOCATE(ZRC_ANOM (0,0,0))
+END IF
+IF (LUSERI) THEN
+  ALLOCATE(ZRI_ANOM (IIU,IJU,NLES_K))
+ELSE
+  ALLOCATE(ZRI_ANOM (0,0,0))
+END IF
+IF (LUSERR) THEN
+  ALLOCATE(ZRR_ANOM (IIU,IJU,NLES_K))
+ELSE
+  ALLOCATE(ZRR_ANOM (0,0,0))
+END IF
+ALLOCATE(ZMEAN_DPDZ(NLES_K))
+ALLOCATE(ZLES_MEAN_DTHDZ(NLES_K))
+!
+!
+ALLOCATE(ZU_SPEC  (NSPECTRA_NI,NSPECTRA_NJ,NSPECTRA_K))
+ALLOCATE(ZV_SPEC  (NSPECTRA_NI,NSPECTRA_NJ,NSPECTRA_K))
+ALLOCATE(ZW_SPEC  (NSPECTRA_NI,NSPECTRA_NJ,NSPECTRA_K))
+ALLOCATE(ZTH_SPEC (NSPECTRA_NI,NSPECTRA_NJ,NSPECTRA_K))
+IF (LUSERC) THEN
+  ALLOCATE(ZTHL_SPEC(NSPECTRA_NI,NSPECTRA_NJ,NSPECTRA_K))
+ELSE
+  ALLOCATE(ZTHL_SPEC(0,0,0))
+END IF
+IF (LUSERV) THEN
+  ALLOCATE(ZRV_SPEC  (NSPECTRA_NI,NSPECTRA_NJ,NSPECTRA_K))
+ELSE
+  ALLOCATE(ZRV_SPEC  (0,0,0))
+END IF
+IF (LUSERC) THEN
+  ALLOCATE(ZRC_SPEC  (NSPECTRA_NI,NSPECTRA_NJ,NSPECTRA_K))
+ELSE
+  ALLOCATE(ZRC_SPEC  (0,0,0))
+END IF
+IF (LUSERI) THEN
+  ALLOCATE(ZRI_SPEC  (NSPECTRA_NI,NSPECTRA_NJ,NSPECTRA_K))
+ELSE
+  ALLOCATE(ZRI_SPEC  (0,0,0))
+END IF
+IF (NSV>0) THEN
+  ALLOCATE(ZSV_SPEC  (NSPECTRA_NI,NSPECTRA_NJ,NSPECTRA_K,NSV))
+ELSE
+  ALLOCATE(ZSV_SPEC  (0,0,0,0))
+END IF
+!
+!
+ALLOCATE(ZEXN (IIU,IJU,SIZE(XTHT,3)))
+ALLOCATE(ZRHO (IIU,IJU,SIZE(XTHT,3)))
+ALLOCATE(ZRT  (IIU,IJU,SIZE(XTHT,3)))
+ALLOCATE(ZTHV (IIU,IJU,SIZE(XTHT,3)))
+ALLOCATE(ZTHL (IIU,IJU,SIZE(XTHT,3)))
+ALLOCATE(ZEW  (IIU,IJU,SIZE(XTHT,3)))
+ALLOCATE(ZMASSF (IIU,IJU,SIZE(XTHT,3)))
+ALLOCATE(ZTEMP (IIU,IJU,SIZE(XTHT,3)))
+ALLOCATE(ZREHU (IIU,IJU,SIZE(XTHT,3)))
+ALLOCATE(CHAMPXY1 (IIU,IJU,1))
+!
+!-------------------------------------------------------------------------------
+!
+!*      1.2  preliminary calculations
+!            ------------------------
+!
+ZEXN(:,:,:) = (XPABST/XP00)**(XRD/XCPD)
+!
+!
+!* computation of relative humidity
+ZTEMP=XTHT*ZEXN
+ZEW=EXP (XALPW -XBETAW/ZTEMP-XGAMW*ALOG(ZTEMP))
+IF (LUSERV) THEN
+  ZREHU(:,:,:)=100.*XRT(:,:,:,1)*XPABST(:,:,:)/((XRD/XRV+XRT(:,:,:,1))*ZEW(:,:,:))
+ELSE
+  ZREHU(:,:,:)=0.
+END IF
+!
+CALL THL_RT_FROM_TH_R(LUSERV, LUSERC, LUSERR,             &
+                      LUSERI, LUSERS, LUSERG, LUSERH,     &
+                      XCURRENT_L_O_EXN_CP,                &
+                      XTHT, XRT,                          &
+                      ZTHL, ZRT                           )
+!
+!* computation of density and virtual potential temperature
+!
+ZTHV=XTHT
+IF (LUSERV) ZTHV=ZTHV*(1.+XRV/XRD*XRT(:,:,:,1))/(1.+ZRT(:,:,:))
+!
+IF (CEQNSYS=='DUR') THEN
+  ZRHO=XPABST/(XRD*ZTHV*ZEXN)
+ELSE
+  ZRHO=XRHODREF*( 1. + (XCPD-XRD)/XRD*(ZEXN/XEXNREF - 1.) - (ZTHV/XTHVREF - 1.) )
+END IF
+!
+! computation of mass flux
+ZMASSF=MZM(ZRHO)*XWT
+!
+!-------------------------------------------------------------------------------
+!
+!*      2.   Vertical interpolations to LES vertical grid
+!            --------------------------------------------
+!
+!* note that velocity fields are first localized on the MASS points
+!
+!
+IF (CRAD /= 'NONE') THEN
+  CALL LES_VER_INT(   XRADEFF, ZRADEFF_LES)
+  CALL LES_VER_INT(   XSWU, ZSWU_LES)
+  CALL LES_VER_INT(   XSWD, ZSWD_LES)
+  CALL LES_VER_INT(   XLWU, ZLWU_LES)
+  CALL LES_VER_INT(   XLWD, ZLWD_LES)
+  CALL LES_VER_INT(   XDTHRADSW, ZDTHRADSW_LES)
+  CALL LES_VER_INT(   XDTHRADLW, ZDTHRADLW_LES)
+END IF
+!
+CALL LES_VER_INT( XZZ   , ZZZ_LES)
+CALL LES_VER_INT( XPABST, ZP_LES )
+CALL LES_VER_INT( XDYP, ZDP_LES )
+CALL LES_VER_INT( XTHP, ZTP_LES )
+CALL LES_VER_INT( XTR, ZTR_LES )
+CALL LES_VER_INT( XDISS, ZDISS_LES )
+CALL LES_VER_INT( XLEM, ZLM_LES )
+CALL LES_VER_INT( GZ_M_M(XPABST,XDZZ), ZDPDZ_LES )
+!
+CALL LES_VER_INT( MXF(XUT)  ,ZU_LES  )
+CALL LES_VER_INT( MYF(XVT)  ,ZV_LES  )
+CALL LES_VER_INT( MZF(XWT)  ,ZW_LES  )
+CALL LES_VER_INT( MZF(ZMASSF) ,ZMF_LES)
+CALL LES_VER_INT(     XTHT  ,ZTH_LES )
+CALL LES_VER_INT( MXF(MZF(GZ_U_UW(XUT,XDZZ))), ZDUDZ_LES )
+CALL LES_VER_INT( MYF(MZF(GZ_V_VW(XVT,XDZZ))), ZDVDZ_LES )
+CALL LES_VER_INT( GZ_W_M(XWT,XDZZ), ZDWDZ_LES )
+CALL LES_VER_INT( ZEXN, ZEXN_LES)  
+!
+CALL LES_VER_INT( GZ_M_M(XTHT,XDZZ), ZDTHDZ_LES )
+!
+CALL LES_VER_INT(ZRHO, ZRHO_LES)
+!
+IF (LUSERV) CALL LES_VER_INT(ZTHV, ZTHV_LES)
+CALL LES_VER_INT(ZTHL, ZTHL_LES)
+CALL LES_VER_INT( GZ_M_M(ZTHL,XDZZ), ZDTHLDZ_LES )
+!
+CALL LES_VER_INT(     XTKET ,ZTKE_LES)
+IRR = 0
+IF (LUSERV) THEN
+  IRR = IRR + 1
+  CALL LES_VER_INT(     XRT(:,:,:,IRR)  ,ZRV_LES )
+  CALL LES_VER_INT(     ZRT(:,:,:)      ,ZRT_LES )
+  CALL LES_VER_INT( GZ_M_M(ZRT,XDZZ), ZDRTDZ_LES )
+  CALL LES_VER_INT(   ZREHU(:,:,:)     ,ZREHU_LES)
+END IF
+IF (LUSERC) THEN
+  IRR = IRR + 1
+  CALL LES_VER_INT(     XRT(:,:,:,IRR)  ,ZRC_LES )
+  ALLOCATE(ZINDCLD (IIU,IJU,NLES_K))
+  ALLOCATE(ZINDCLD2(IIU,IJU,NLES_K))
+  ZINDCLD = CEILING(ZRC_LES-1.E-6)
+  ZINDCLD2 = CEILING(ZRC_LES-1.E-5)
+  CALL LES_VER_INT( XCLDFR(:,:,:)  ,ZCLDFR_LES )
+ELSE
+  ALLOCATE(ZINDCLD (0,0,0))
+  ALLOCATE(ZINDCLD2(0,0,0))
+END IF
+IF (LUSERR) THEN
+  IRR = IRR + 1
+  CALL LES_VER_INT(     XRT(:,:,:,IRR)  ,ZRR_LES )
+  CALL LES_VER_INT(     XINPRR3D(:,:,:), ZINPRR3D_LES)
+  CALL LES_VER_INT(    XEVAP3D(:,:,:), ZEVAP3D_LES)
+  CALL LES_VER_INT( XRAINFR(:,:,:)  ,ZRAINFR_LES )
+END IF
+IF (LUSERC) THEN
+    DO JJ=1,IJU
+     DO JI=1,IIU
+      ZINDCLD2D(JI,JJ) = maxval(ZINDCLD(JI,JJ,:))
+      ZINDCLD2D2(JI,JJ)= maxval(ZINDCLD2(JI,JJ,:))
+     END DO
+    END DO
+  !* integration of rho rc
+  !!!ZLWP_LES only for cloud water           
+    ZLWP_LES(:,:)  = 0.
+      DO JK=1,NLES_K-1
+    ZLWP_LES(:,:) = ZLWP_LES(:,:) + (ZZZ_LES(:,:,JK+1)-ZZZ_LES(:,:,JK))      &
+                      * (ZRC_LES(:,:,JK)) * ZRHO_LES(:,:,JK)
+      END DO
+  CALL LES_MEAN_ll ( ZLWP_LES, LLES_CURRENT_CART_MASK(:,:,1),               &
+                    XLES_LWP(NLES_CURRENT_TCOUNT)     )    
+!
+END IF
+
+  !!!ZRWP_LES only for rain water   
+IF (LUSERR) THEN
+   ZRWP_LES(:,:)=0.
+  DO JK=1,NLES_K-1
+    ZRWP_LES(:,:) = ZRWP_LES(:,:) + (ZZZ_LES(:,:,JK+1)-ZZZ_LES(:,:,JK))      &
+                    * (ZRR_LES(:,:,JK)) * ZRHO_LES(:,:,JK)
+  END DO
+  CALL LES_MEAN_ll ( ZRWP_LES, LLES_CURRENT_CART_MASK(:,:,1),               &
+                    XLES_RWP(NLES_CURRENT_TCOUNT)     )
+ENDIF
+!                    
+IF (LUSERI) THEN
+  IRR = IRR + 1
+  CALL LES_VER_INT(     XRT(:,:,:,IRR)  ,ZRI_LES )
+  ZIWP_LES(:,:)=0.
+  DO JK=1,NLES_K-1
+    ZIWP_LES(:,:) = ZIWP_LES(:,:) + (ZZZ_LES(:,:,JK+1)-ZZZ_LES(:,:,JK))      &
+                    * (ZRI_LES(:,:,JK)) * ZRHO_LES(:,:,JK)
+  END DO
+  CALL LES_MEAN_ll ( ZIWP_LES, LLES_CURRENT_CART_MASK(:,:,1),               &
+                    XLES_IWP(NLES_CURRENT_TCOUNT)     )
+  CALL LES_VER_INT( XICEFR(:,:,:)  ,ZICEFR_LES )
+END IF
+IF (LUSERS) THEN
+  IRR = IRR + 1
+  CALL LES_VER_INT(     XRT(:,:,:,IRR)  ,ZRS_LES )
+  ZSWP_LES(:,:)=0.
+  DO JK=1,NLES_K-1
+    ZSWP_LES(:,:) = ZSWP_LES(:,:) + (ZZZ_LES(:,:,JK+1)-ZZZ_LES(:,:,JK))      &
+                    * (ZRS_LES(:,:,JK)) * ZRHO_LES(:,:,JK)
+  END DO
+  CALL LES_MEAN_ll ( ZSWP_LES, LLES_CURRENT_CART_MASK(:,:,1),               &
+                    XLES_SWP(NLES_CURRENT_TCOUNT)     )
+END IF
+IF (LUSERG) THEN
+  IRR = IRR + 1
+  CALL LES_VER_INT(     XRT(:,:,:,IRR)  ,ZRG_LES )
+  ZGWP_LES(:,:)=0.
+  DO JK=1,NLES_K-1
+    ZGWP_LES(:,:) = ZGWP_LES(:,:) + (ZZZ_LES(:,:,JK+1)-ZZZ_LES(:,:,JK))      &
+                    * (ZRG_LES(:,:,JK)) * ZRHO_LES(:,:,JK)
+  END DO
+  CALL LES_MEAN_ll ( ZGWP_LES, LLES_CURRENT_CART_MASK(:,:,1),               &
+                    XLES_GWP(NLES_CURRENT_TCOUNT)     )
+END IF
+IF (LUSERH) THEN
+  IRR = IRR + 1
+  CALL LES_VER_INT(     XRT(:,:,:,IRR)  ,ZRH_LES )
+  ZHWP_LES(:,:)=0.
+  DO JK=1,NLES_K-1
+    ZHWP_LES(:,:) = ZHWP_LES(:,:) + (ZZZ_LES(:,:,JK+1)-ZZZ_LES(:,:,JK))      &
+                    * (ZRH_LES(:,:,JK)) * ZRHO_LES(:,:,JK)
+  END DO
+  CALL LES_MEAN_ll ( ZHWP_LES, LLES_CURRENT_CART_MASK(:,:,1),               &
+                    XLES_HWP(NLES_CURRENT_TCOUNT)     )
+END IF
+IF (NSV>0) THEN
+  DO JSV=1,NSV
+    CALL LES_VER_INT(  XSVT(:,:,:,JSV), ZSV_LES(:,:,:,JSV) )
+    CALL LES_VER_INT( GZ_M_M(XSVT(:,:,:,JSV),XDZZ), ZDSVDZ_LES(:,:,:,JSV) )
+  END DO
+END IF
+!
+!*mean sw and lw fluxes  
+  CALL LES_MEAN_ll ( ZSWU_LES, LLES_CURRENT_CART_MASK,               &
+                    XLES_SWU(:,NLES_CURRENT_TCOUNT)     )
+  CALL LES_MEAN_ll ( ZSWD_LES, LLES_CURRENT_CART_MASK,               &
+                    XLES_SWD(:,NLES_CURRENT_TCOUNT)     )
+  CALL LES_MEAN_ll ( ZLWU_LES, LLES_CURRENT_CART_MASK,               &
+                    XLES_LWU(:,NLES_CURRENT_TCOUNT)     )
+  CALL LES_MEAN_ll ( ZLWD_LES, LLES_CURRENT_CART_MASK,               &
+                    XLES_LWD(:,NLES_CURRENT_TCOUNT)     )
+  CALL LES_MEAN_ll ( ZDTHRADSW_LES, LLES_CURRENT_CART_MASK,          &
+                    XLES_DTHRADSW(:,NLES_CURRENT_TCOUNT)     )
+  CALL LES_MEAN_ll ( ZDTHRADLW_LES, LLES_CURRENT_CART_MASK,          &
+                    XLES_DTHRADLW(:,NLES_CURRENT_TCOUNT)     )
+  CALL LES_MEAN_ll ( ZRADEFF_LES, LLES_CURRENT_CART_MASK,             &
+                    XLES_RADEFF(:,NLES_CURRENT_TCOUNT)     )
+!* mean vertical profiles on the LES grid
+!
+  CALL LES_MEAN_ll ( ZU_LES, LLES_CURRENT_CART_MASK,                   &
+                     XLES_MEAN_U(:,NLES_CURRENT_TCOUNT,1)     )
+!
+  CALL LES_MEAN_ll ( ZV_LES, LLES_CURRENT_CART_MASK,                   &
+                     XLES_MEAN_V(:,NLES_CURRENT_TCOUNT,1)     )
+!
+  CALL LES_MEAN_ll ( ZW_LES, LLES_CURRENT_CART_MASK,                   &
+                     XLES_MEAN_W(:,NLES_CURRENT_TCOUNT,1)     )
+!
+  CALL LES_MEAN_ll ( ZP_LES, LLES_CURRENT_CART_MASK,                   &
+                     XLES_MEAN_P(:,NLES_CURRENT_TCOUNT,1)     )
+!
+  CALL LES_MEAN_ll ( ZDP_LES, LLES_CURRENT_CART_MASK,                   &
+                     XLES_MEAN_DP(:,NLES_CURRENT_TCOUNT,1)     )
+!
+  CALL LES_MEAN_ll ( ZTP_LES, LLES_CURRENT_CART_MASK,                   &
+                     XLES_MEAN_TP(:,NLES_CURRENT_TCOUNT,1)     )
+!
+  CALL LES_MEAN_ll ( ZTR_LES, LLES_CURRENT_CART_MASK,                   &
+                     XLES_MEAN_TR(:,NLES_CURRENT_TCOUNT,1)     )
+!
+  CALL LES_MEAN_ll ( ZDISS_LES, LLES_CURRENT_CART_MASK,                   &
+                     XLES_MEAN_DISS(:,NLES_CURRENT_TCOUNT,1)     )
+!
+  CALL LES_MEAN_ll ( ZLM_LES, LLES_CURRENT_CART_MASK,                   &
+                     XLES_MEAN_LM(:,NLES_CURRENT_TCOUNT,1)     )
+!
+  CALL LES_MEAN_ll ( ZRHO_LES, LLES_CURRENT_CART_MASK,                 &
+                     XLES_MEAN_RHO(:,NLES_CURRENT_TCOUNT,1)   )
+!
+  CALL LES_MEAN_ll ( ZMF_LES, LLES_CURRENT_CART_MASK,                  &
+                     XLES_MEAN_Mf(:,NLES_CURRENT_TCOUNT,1)     )                             
+!
+  CALL LES_MEAN_ll ( ZTH_LES*ZEXN_LES, LLES_CURRENT_CART_MASK,         &
+                     ZWORK1DT(:)                                 )                    
+!                     
+!computation of es
+  ZWORK1D(:)=EXP(XALPW -                                          &
+                  XBETAW/ZWORK1DT(:)         &
+                  -XGAMW*ALOG(ZWORK1DT(:)))
+!computation of qs
+
+  IF (LUSERV)                                                          &
+  XLES_MEAN_Qs(:,NLES_CURRENT_TCOUNT,1)=XRD/XRV*ZWORK1D(:)/        &
+  (XLES_MEAN_P(:,NLES_CURRENT_TCOUNT,1)-ZWORK1D(:)*(1-XRD/XRV))   
+! qs is determined from the temperature average over the current_mask
+!
+  CALL LES_MEAN_ll ( ZTH_LES, LLES_CURRENT_CART_MASK,                  &
+                     XLES_MEAN_Th(:,NLES_CURRENT_TCOUNT,1)     )
+!
+  IF (LUSERV)                                                          &
+  CALL LES_MEAN_ll ( ZTHV_LES, LLES_CURRENT_CART_MASK,                 &
+                     XLES_MEAN_Thv(:,NLES_CURRENT_TCOUNT,1)    )
+!
+  IF (LUSERC)                                                       &
+  CALL LES_MEAN_ll ( ZTHL_LES, LLES_CURRENT_CART_MASK,              &
+                     XLES_MEAN_Thl(:,NLES_CURRENT_TCOUNT,1)     )
+!
+  IF (LUSERC)                                                       &
+  CALL LES_MEAN_ll ( ZRT_LES, LLES_CURRENT_CART_MASK,               &
+                     XLES_MEAN_Rt(:,NLES_CURRENT_TCOUNT,1)     )
+!
+  IF (LUSERV) &
+  CALL LES_MEAN_ll ( ZRV_LES, LLES_CURRENT_CART_MASK,               &
+                     XLES_MEAN_Rv(:,NLES_CURRENT_TCOUNT,1)     )
+!
+  IF (LUSERV) &
+  CALL LES_MEAN_ll ( ZREHU_LES, LLES_CURRENT_CART_MASK,             &
+                   XLES_MEAN_Rehu(:,NLES_CURRENT_TCOUNT,1)     )
+!
+  IF (LUSERC) &
+  CALL LES_MEAN_ll ( ZRC_LES, LLES_CURRENT_CART_MASK,               &
+                    XLES_MEAN_Rc(:,NLES_CURRENT_TCOUNT,1)     )
+!
+  IF (LUSERC) THEN 
+     CALL LES_MEAN_ll ( ZINDCLD, LLES_CURRENT_CART_MASK,               &
+                    XLES_MEAN_INDCf(:,NLES_CURRENT_TCOUNT,1)     )
+     CALL LES_MEAN_ll ( ZINDCLD2, LLES_CURRENT_CART_MASK,              &
+                    XLES_MEAN_INDCf2(:,NLES_CURRENT_TCOUNT,1)    )
+     CALL LES_MEAN_ll ( ZCLDFR_LES, LLES_CURRENT_CART_MASK,            &
+                    XLES_MEAN_Cf(:,NLES_CURRENT_TCOUNT,1)        )
+!
+!* cf total
+     CALL LES_MEAN_ll( ZINDCLD2D, LLES_CURRENT_CART_MASK(:,:,1) ,      & 
+                   XLES_CFtot(NLES_CURRENT_TCOUNT)      ) 
+     CALL LES_MEAN_ll( ZINDCLD2D2, LLES_CURRENT_CART_MASK(:,:,1),      &
+                    XLES_CF2tot(NLES_CURRENT_TCOUNT)    )
+  ENDIF
+!
+  IF (LUSERR) THEN
+
+    CALL LES_MEAN_ll ( XINPRR, LLES_CURRENT_CART_MASK(:,:,1),    &
+                     XLES_INPRR(NLES_CURRENT_TCOUNT)    )
+    ZINPRRm=0.
+    ZCOUNT=0.
+    ZINDCLD2D(:,:)=0.
+    DO JJ=1,IJU
+     DO JI=1,IIU
+       IF (ZRR_LES(JI,JJ,1) .GT. 1.E-6) ZINPRRm = ZINPRRm+XINPRR(JI,JJ)
+       IF (ZRR_LES(JI,JJ,1) .GT. 1.E-6) ZINDCLD2D(JI,JJ)=1.
+       IF (ZRR_LES(JI,JJ,1) .GT. 1.E-6) ZCOUNT=ZCOUNT+1.
+     END DO
+    END DO                 
+    IF (ZCOUNT .GE. 1) ZINPRRm=ZINPRRm/ZCOUNT
+    XLES_RAIN_INPRR(NLES_CURRENT_TCOUNT)=ZINPRRm
+    CALL  LES_MEAN_ll ( ZINDCLD2D, LLES_CURRENT_CART_MASK(:,:,1),  &
+                     XLES_PRECFR(NLES_CURRENT_TCOUNT)         )   
+    CALL LES_MEAN_ll ( ZINPRR3D_LES, LLES_CURRENT_CART_MASK,  &
+                     XLES_INPRR3D(:,NLES_CURRENT_TCOUNT,1)  )
+    CALL LES_MEAN_ll ( ZEVAP3D_LES, LLES_CURRENT_CART_MASK,  &
+                     XLES_EVAP3D(:,NLES_CURRENT_TCOUNT,1)   )         
+    DO JK=1,NLES_K
+     CHAMPXY1(:,:,1)=ZINPRR3D_LES(:,:,JK)                
+     XLES_MAX_INPRR3D(JK,NLES_CURRENT_TCOUNT,1)=MAX_ll (CHAMPXY1,IINFO_ll, &
+                         IIA_ll,IJA_ll,1,IIU_ll,IJU_ll,1)
+    END DO
+!
+
+!   conversion de m/s en mm/day
+ XLES_RAIN_INPRR(NLES_CURRENT_TCOUNT)=XLES_RAIN_INPRR(NLES_CURRENT_TCOUNT)*3.6E6*24.
+    XLES_INPRR(NLES_CURRENT_TCOUNT)=XLES_INPRR(NLES_CURRENT_TCOUNT)*3.6E6*24.
+
+    CALL LES_MEAN_ll ( XACPRR, LLES_CURRENT_CART_MASK(:,:,1),    &
+                     XLES_ACPRR(NLES_CURRENT_TCOUNT)    )
+!   conversion de m en mm
+    XLES_ACPRR(NLES_CURRENT_TCOUNT)=XLES_ACPRR(NLES_CURRENT_TCOUNT)*1000.
+    CALL LES_MEAN_ll ( ZRAINFR_LES, LLES_CURRENT_CART_MASK,            &
+                    XLES_MEAN_RF(:,NLES_CURRENT_TCOUNT,1)        )
+
+  ENDIF
+!
+  IF (LUSERC ) THEN
+    IF (( CCLOUD(1:3) == 'ICE'                                   .AND.LSEDIC) .OR. &
+    ((CCLOUD=='C2R2' .OR. CCLOUD=='C3R5' .OR. CCLOUD=='KHKO').AND.LSEDC)  .OR. &
+    ( CCLOUD=='LIMA'                                         .AND.MSEDC))  THEN
+      CALL LES_MEAN_ll ( XINPRC, LLES_CURRENT_CART_MASK(:,:,1),    &
+                     XLES_INPRC(NLES_CURRENT_TCOUNT)    )
+!     conversion from m/s to mm/day
+      XLES_INPRC(NLES_CURRENT_TCOUNT)=XLES_INPRC(NLES_CURRENT_TCOUNT)*3.6E6*24.
+    ENDIF
+    IF ( (((CCLOUD == 'KHKO') .OR.(CCLOUD == 'C2R2')) .AND. LDEPOC) &
+         .OR. ( (CCLOUD(1:3) == 'ICE') .AND. LDEPOSC) ) THEN
+        CALL LES_MEAN_ll ( XINDEP, LLES_CURRENT_CART_MASK(:,:,1),    &
+                     XLES_INDEP(NLES_CURRENT_TCOUNT)    )
+!       conversion from m/s to mm/day
+        XLES_INDEP(NLES_CURRENT_TCOUNT)=XLES_INDEP(NLES_CURRENT_TCOUNT)*3.6E6*24.
+    ENDIF
+  ENDIF
+!
+  IF (LUSERR) &
+  CALL LES_MEAN_ll ( ZRR_LES, LLES_CURRENT_CART_MASK,               &
+                     XLES_MEAN_Rr(:,NLES_CURRENT_TCOUNT,1)     )
+!
+  IF (LUSERI) &
+  CALL LES_MEAN_ll ( ZRI_LES, LLES_CURRENT_CART_MASK,               &
+                     XLES_MEAN_Ri(:,NLES_CURRENT_TCOUNT,1)     )
+  CALL LES_MEAN_ll ( ZICEFR_LES, LLES_CURRENT_CART_MASK,            &
+                    XLES_MEAN_If(:,NLES_CURRENT_TCOUNT,1)        )
+!
+  IF (LUSERS) &
+  CALL LES_MEAN_ll ( ZRS_LES, LLES_CURRENT_CART_MASK,               &
+                   XLES_MEAN_Rs(:,NLES_CURRENT_TCOUNT,1)     )
+!
+  IF (LUSERG) &
+  CALL LES_MEAN_ll ( ZRG_LES, LLES_CURRENT_CART_MASK,               &
+                   XLES_MEAN_Rg(:,NLES_CURRENT_TCOUNT,1)     )
+!
+  IF (LUSERH) &
+  CALL LES_MEAN_ll ( ZRH_LES, LLES_CURRENT_CART_MASK,               &
+                     XLES_MEAN_Rh(:,NLES_CURRENT_TCOUNT,1)   )
+!
+  DO JSV=1,NSV
+    CALL LES_MEAN_ll ( ZSV_LES(:,:,:,JSV), LLES_CURRENT_CART_MASK,   &
+                       XLES_MEAN_Sv(:,NLES_CURRENT_TCOUNT,1,JSV)     )
+  END DO
+!
+  CALL LES_MEAN_ll ( ZDPDZ_LES, LLES_CURRENT_CART_MASK,      &
+                     ZMEAN_DPDZ(:)                           )
+  CALL LES_MEAN_ll ( ZDTHDZ_LES, LLES_CURRENT_CART_MASK,      &
+                     ZLES_MEAN_DTHDZ(:)                      )
+                     
+!
+!* build the 3D resolved turbulent fields by removing the mean field
+!
+DO JJ=1,IJU
+  DO JI=1,IIU
+    ZP_ANOM(JI,JJ,:) = ZP_LES(JI,JJ,:) - XLES_MEAN_P(:,NLES_CURRENT_TCOUNT,1)
+    ZDPDZ_ANOM(JI,JJ,:) = ZDPDZ_LES(JI,JJ,:) - ZMEAN_DPDZ(:)
+    ZTH_ANOM(JI,JJ,:) = ZTH_LES(JI,JJ,:) - XLES_MEAN_Th(:,NLES_CURRENT_TCOUNT,1)
+    ZRHO_ANOM(JI,JJ,:) = ZRHO_LES(JI,JJ,:) - XLES_MEAN_Rho(:,NLES_CURRENT_TCOUNT,1)
+    IF (LUSERV) THEN
+      ZTHV_ANOM(JI,JJ,:) = ZTHV_LES(JI,JJ,:) - XLES_MEAN_Thv(:,NLES_CURRENT_TCOUNT,1)
+      ZRV_ANOM(JI,JJ,:) = ZRV_LES(JI,JJ,:) - XLES_MEAN_Rv(:,NLES_CURRENT_TCOUNT,1)
+    END IF
+    IF (LUSERC) THEN
+      ZRC_ANOM(JI,JJ,:) = ZRC_LES(JI,JJ,:) - XLES_MEAN_Rc(:,NLES_CURRENT_TCOUNT,1)
+      ZLWP_ANOM(JI,JJ) =ZLWP_LES(JI,JJ)-XLES_LWP(NLES_CURRENT_TCOUNT)
+    END IF
+    IF (LUSERI) THEN
+      ZRI_ANOM(JI,JJ,:) = ZRI_LES(JI,JJ,:) - XLES_MEAN_Ri(:,NLES_CURRENT_TCOUNT,1)
+    END IF
+    IF (LUSERR) THEN
+      ZRR_ANOM(JI,JJ,:) = ZRR_LES(JI,JJ,:) - XLES_MEAN_Rr(:,NLES_CURRENT_TCOUNT,1)
+    END IF
+  END DO
+END DO
+!
+!
+!--------------------------------------------------------------------------------
+!
+!* vertical grid computed at first LES call for this model
+!
+IF (NLES_CURRENT_TCOUNT==1) THEN
+  ALLOCATE(ZZ_LES    (IIU,IJU,NLES_K))
+  !ZZ_LES = vertical position of the mass points where data is computed
+  CALL LES_VER_INT( MZF(XZZ)  ,ZZ_LES   )
+  !XLES_Z = mean vertical altitude for each level (taking into account the mask)
+  CALL LES_MEAN_ll ( ZZ_LES, LLES_CURRENT_CART_MASK, XLES_Z  )
+  DEALLOCATE(ZZ_LES)
+  CALL LES_MEAN_ll ( XZS,    LLES_CURRENT_CART_MASK(:,:,1), XLES_ZS )
+END IF
+!
+!-------------------------------------------------------------------------------
+!
+!*      3.   Vertical interpolations to SECTRA computations vertical grid
+!            ------------------------------------------------------------
+!
+!* note that velocity fields are previously localized on the MASS points
+!
+CALL SPEC_VER_INT(IMI, MXF(XUT)  ,ZU_SPEC  )
+CALL SPEC_VER_INT(IMI, MYF(XVT)  ,ZV_SPEC  )
+CALL SPEC_VER_INT(IMI, MZF(XWT)  ,ZW_SPEC  )
+CALL SPEC_VER_INT(IMI,     XTHT  ,ZTH_SPEC )
+IF (LUSERC) CALL SPEC_VER_INT(IMI,     ZTHL  ,ZTHL_SPEC)
+IRR = 0
+IF (LUSERV) THEN
+  IRR = IRR + 1
+  CALL SPEC_VER_INT(IMI,     XRT(:,:,:,IRR)  ,ZRV_SPEC )
+END IF
+IF (LUSERC) THEN
+  IRR = IRR + 1
+  CALL SPEC_VER_INT(IMI,     XRT(:,:,:,IRR)  ,ZRC_SPEC )
+END IF
+IF (LUSERR) THEN
+  IRR = IRR + 1
+END IF
+IF (LUSERI) THEN
+  IRR = IRR + 1
+  CALL SPEC_VER_INT(IMI,     XRT(:,:,:,IRR)  ,ZRI_SPEC )
+END IF
+IF (NSV>0) THEN
+  DO JSV=1,NSV
+    CALL SPEC_VER_INT(IMI,  XSVT(:,:,:,JSV), ZSV_SPEC(:,:,:,JSV) )
+  END DO
+END IF
+!
+!-------------------------------------------------------------------------------
+!
+!*      4.   Call to LES computations on cartesian (sub-)domain
+!            --------------------------------------------------
+!
+IMASK=1
+!
+CALL LES(LLES_CURRENT_CART_MASK)
+!
+!-------------------------------------------------------------------------------
+!
+!*      5.   Call to LES computations on nebulosity mask
+!            -------------------------------------------
+!
+IF (LLES_NEB_MASK) THEN
+  IMASK=IMASK+1
+  CALL LES(LLES_CURRENT_NEB_MASK .AND. LLES_CURRENT_CART_MASK)
+!
+  IMASK=IMASK+1
+  CALL LES((.NOT. LLES_CURRENT_NEB_MASK) .AND. LLES_CURRENT_CART_MASK)
+END IF
+!
+!-------------------------------------------------------------------------------
+!
+!*      6.   Call to LES computations on cloud core mask
+!            -------------------------------------------
+!
+IF (LLES_CORE_MASK) THEN
+  IMASK=IMASK+1
+  CALL LES(LLES_CURRENT_CORE_MASK .AND. LLES_CURRENT_CART_MASK)
+!
+  IMASK=IMASK+1
+  CALL LES((.NOT. LLES_CURRENT_CORE_MASK) .AND. LLES_CURRENT_CART_MASK)
+END IF
+!
+!-------------------------------------------------------------------------------
+!
+!*      7.   Call to LES computations on user mask
+!            -------------------------------------
+!
+IF (LLES_MY_MASK) THEN
+ DO JI=1,NLES_MASKS_USER
+  IMASK=IMASK+1
+  CALL LES(LLES_CURRENT_MY_MASKS(:,:,:,JI))
+ END DO
+END IF
+!
+!-------------------------------------------------------------------------------
+!
+!*      7b.  Call to LES computations on conditional sampling mask
+!            -----------------------------------------------------
+!
+IF (LLES_CS_MASK) THEN
+  IMASK=IMASK+1
+  CALL LES(LLES_CURRENT_CS1_MASK)
+  IMASK=IMASK+1
+  CALL LES(LLES_CURRENT_CS2_MASK)
+  IMASK=IMASK+1
+  CALL LES(LLES_CURRENT_CS3_MASK)
+END IF
+!
+!-------------------------------------------------------------------------------
+!
+!*      8.   budgets
+!            -------
+!
+!*      8.1  tendencies
+!            ----------
+!
+!
+!*      8.2  dynamical production, transport and mean advection
+!            --------------------------------------------------
+!
+ALLOCATE(ZLES_MEAN_DRtDZ(NLES_K))
+ALLOCATE(ZLES_MEAN_DSVDZ(NLES_K,NSV))
+!
+IF (LUSERV) THEN
+  ZLES_MEAN_DRtDZ(:) = XLES_MEAN_DRtDZ(:,NLES_CURRENT_TCOUNT,1)
+ELSE
+  ZLES_MEAN_DRtDZ(:) = XUNDEF
+END IF
+!
+ZLES_MEAN_DSVDZ = 0.
+DO JSV=1,NSV
+  ZLES_MEAN_DSvDZ(:,JSV) = XLES_MEAN_DSvDZ(:,NLES_CURRENT_TCOUNT,1,JSV)
+END DO
+!
+CALL LES_RES_TR(LUSERV,                                    &
+                XLES_MEAN_DUDZ(:,NLES_CURRENT_TCOUNT,1),   &
+                XLES_MEAN_DVDZ(:,NLES_CURRENT_TCOUNT,1),   &
+                XLES_MEAN_DWDZ(:,NLES_CURRENT_TCOUNT,1),   &
+                XLES_MEAN_DThlDZ(:,NLES_CURRENT_TCOUNT,1), &
+                ZLES_MEAN_DRtDZ(:),                        &
+                ZLES_MEAN_DSvDZ(:,:)                       )
+!
+DEALLOCATE(ZLES_MEAN_DRtDZ)
+DEALLOCATE(ZLES_MEAN_DSVDZ)
+!
+CALL LES_BUDGET_TEND_n
+!*      8.3  end of LES budgets computations
+!            -------------------------------
+!
+DO JLOOP=1,NLES_TOT
+  XLES_BU_RES_KE   (:,NLES_CURRENT_TCOUNT,JLOOP) = X_LES_BU_RES_KE   (:,JLOOP)
+  XLES_BU_RES_WThl (:,NLES_CURRENT_TCOUNT,JLOOP) = X_LES_BU_RES_WThl (:,JLOOP)
+  XLES_BU_RES_Thl2 (:,NLES_CURRENT_TCOUNT,JLOOP) = X_LES_BU_RES_Thl2 (:,JLOOP)
+  XLES_BU_SBG_Tke  (:,NLES_CURRENT_TCOUNT,JLOOP) = X_LES_BU_SBG_Tke  (:,JLOOP)
+  IF (LUSERV) THEN
+    XLES_BU_RES_WRt  (:,NLES_CURRENT_TCOUNT,JLOOP) = X_LES_BU_RES_WRt  (:,JLOOP)
+    XLES_BU_RES_Rt2  (:,NLES_CURRENT_TCOUNT,JLOOP) = X_LES_BU_RES_Rt2  (:,JLOOP)
+    XLES_BU_RES_ThlRt(:,NLES_CURRENT_TCOUNT,JLOOP) = X_LES_BU_RES_ThlRt(:,JLOOP)
+  END IF
+  DO JSV=1,NSV
+    XLES_BU_RES_Sv2  (:,NLES_CURRENT_TCOUNT,JLOOP,JSV) = X_LES_BU_RES_Sv2  (:,JLOOP,JSV)
+    XLES_BU_RES_WSv  (:,NLES_CURRENT_TCOUNT,JLOOP,JSV) = X_LES_BU_RES_WSv  (:,JLOOP,JSV)
+  END DO
+END DO
+!
+!-------------------------------------------------------------------------------
+!
+!*      9.   Deallocations
+!            -------------
+!
+!*      9.1  local variables
+!            ---------------
+!
+DEALLOCATE(ZEXN      )
+DEALLOCATE(ZTHL)
+DEALLOCATE(ZRT       )
+DEALLOCATE(ZTHV      )
+DEALLOCATE(ZRHO      )
+DEALLOCATE(ZEW       )
+
+DEALLOCATE(ZINDCLD   )
+DEALLOCATE(ZINDCLD2  )
+DEALLOCATE(ZINDCLD2D )
+DEALLOCATE(ZINDCLD2D2)
+DEALLOCATE(ZCLDFR_LES)
+DEALLOCATE(ZICEFR_LES)
+DEALLOCATE(ZRAINFR_LES)
+DEALLOCATE(ZMASSF    )  
+DEALLOCATE(ZTEMP     )
+DEALLOCATE(ZREHU     )
+DEALLOCATE(CHAMPXY1  )
+!
+DEALLOCATE(ZU_LES)
+DEALLOCATE(ZV_LES)
+DEALLOCATE(ZW_LES)
+DEALLOCATE(ZTHL_LES)
+DEALLOCATE(ZRT_LES)
+DEALLOCATE(ZSV_LES)
+DEALLOCATE(ZP_LES   )
+DEALLOCATE(ZDP_LES   )
+DEALLOCATE(ZTP_LES   )
+DEALLOCATE(ZTR_LES   )
+DEALLOCATE(ZDISS_LES   )
+DEALLOCATE(ZLM_LES   )
+DEALLOCATE(ZDPDZ_LES)
+DEALLOCATE(ZLWP_ANOM)
+DEALLOCATE(ZWORK2D)
+DEALLOCATE(ZWORK1D)
+DEALLOCATE(ZWORK1DT)
+DEALLOCATE(ZMAXWRR2D)
+DEALLOCATE(ZDTHLDZ_LES)
+DEALLOCATE(ZDTHDZ_LES)
+DEALLOCATE(ZDRTDZ_LES)
+DEALLOCATE(ZDSVDZ_LES)
+DEALLOCATE(ZDUDZ_LES)
+DEALLOCATE(ZDVDZ_LES)
+DEALLOCATE(ZDWDZ_LES)
+DEALLOCATE(ZRHO_LES )
+DEALLOCATE(ZEXN_LES )
+DEALLOCATE(ZTH_LES  )
+DEALLOCATE(ZMF_LES  )
+DEALLOCATE(ZTHV_LES )
+DEALLOCATE(ZTKE_LES )
+DEALLOCATE(ZKE_LES )
+DEALLOCATE(ZTKET_LES)
+DEALLOCATE(ZRV_LES  )
+DEALLOCATE(ZREHU_LES  )
+DEALLOCATE(ZRC_LES  )
+DEALLOCATE(ZRR_LES  )
+DEALLOCATE(ZZZ_LES)
+DEALLOCATE(ZLWP_LES )
+DEALLOCATE(ZRWP_LES )
+DEALLOCATE(ZIWP_LES )
+DEALLOCATE(ZSWP_LES )
+DEALLOCATE(ZGWP_LES )
+DEALLOCATE(ZHWP_LES )
+DEALLOCATE(ZINPRR3D_LES)
+DEALLOCATE(ZEVAP3D_LES)
+DEALLOCATE(ZRI_LES  )
+DEALLOCATE(ZRS_LES  )
+DEALLOCATE(ZRG_LES  )
+DEALLOCATE(ZRH_LES  )
+DEALLOCATE(ZP_ANOM  )
+DEALLOCATE(ZRHO_ANOM)
+DEALLOCATE(ZTH_ANOM )
+DEALLOCATE(ZTHV_ANOM)
+DEALLOCATE(ZRV_ANOM )
+DEALLOCATE(ZRC_ANOM )
+DEALLOCATE(ZRI_ANOM )
+DEALLOCATE(ZRR_ANOM )
+DEALLOCATE(ZDPDZ_ANOM)
+DEALLOCATE(ZMEAN_DPDZ)
+DEALLOCATE(ZLES_MEAN_DTHDZ)
+!
+DEALLOCATE(ZU_SPEC   )
+DEALLOCATE(ZV_SPEC   )
+DEALLOCATE(ZW_SPEC   )
+DEALLOCATE(ZTH_SPEC  )
+DEALLOCATE(ZTHL_SPEC )
+DEALLOCATE(ZRV_SPEC  )
+DEALLOCATE(ZRC_SPEC  )
+DEALLOCATE(ZRI_SPEC  )
+DEALLOCATE(ZSV_SPEC  )
+!
+DEALLOCATE(ZRADEFF_LES  )
+DEALLOCATE(ZSWU_LES  )
+DEALLOCATE(ZSWD_LES  )
+DEALLOCATE(ZLWD_LES  )
+DEALLOCATE(ZLWU_LES  )
+DEALLOCATE(ZDTHRADSW_LES  )
+DEALLOCATE(ZDTHRADLW_LES  )
+!
+!*      9.2  current time-step LES masks (in MODD_LES)
+!            ---------------------------
+!
+CALL LES_DEALLOCATE('LLES_CURRENT_CART_MASK')
+IF (LLES_NEB_MASK)     CALL LES_DEALLOCATE('LLES_CURRENT_NEB_MASK')
+IF (LLES_CORE_MASK)    CALL LES_DEALLOCATE('LLES_CURRENT_CORE_MASK')
+IF (LLES_MY_MASK)   THEN
+   CALL LES_DEALLOCATE('LLES_CURRENT_MY_MASKS')
+END IF
+IF (LLES_CS_MASK)   THEN
+    CALL LES_DEALLOCATE('LLES_CURRENT_CS1_MASK')
+    IF (NSV_CS >= 2) CALL LES_DEALLOCATE('LLES_CURRENT_CS2_MASK')
+    IF (NSV_CS == 3) CALL LES_DEALLOCATE('LLES_CURRENT_CS3_MASK')
+END IF
+!
+!
+!*      9.3  variables in MODD_LES_BUDGET
+!            ----------------------------
+!
+
+DEALLOCATE(XU_ANOM  )
+DEALLOCATE(XV_ANOM  )
+DEALLOCATE(XW_ANOM  )
+DEALLOCATE(XTHL_ANOM)
+DEALLOCATE(XRT_ANOM )
+DEALLOCATE(XSV_ANOM )
+!
+DEALLOCATE(XCURRENT_L_O_EXN_CP)
+DEALLOCATE(XCURRENT_RHODJ     )
+!
+DEALLOCATE(XCURRENT_RUS  )
+DEALLOCATE(XCURRENT_RVS  )
+DEALLOCATE(XCURRENT_RWS  )
+DEALLOCATE(XCURRENT_RTHS )
+DEALLOCATE(XCURRENT_RTKES)
+DEALLOCATE(XCURRENT_RRS  )
+DEALLOCATE(XCURRENT_RSVS )
+DEALLOCATE(XCURRENT_RTHLS)
+DEALLOCATE(XCURRENT_RRTS )
+
+DEALLOCATE(X_LES_BU_RES_KE   )
+DEALLOCATE(X_LES_BU_RES_WThl )
+DEALLOCATE(X_LES_BU_RES_Thl2 )
+DEALLOCATE(X_LES_BU_RES_WRt  )
+DEALLOCATE(X_LES_BU_RES_Rt2  )
+DEALLOCATE(X_LES_BU_RES_ThlRt)
+DEALLOCATE(X_LES_BU_RES_Sv2  )
+DEALLOCATE(X_LES_BU_RES_WSv  )
+DEALLOCATE(X_LES_BU_SBG_TKE  )
+!-------------------------------------------------------------------------------
+!
+!*      10.  end of LES computations for this time-step
+!            ------------------------------------------
+!
+LLES_CALL=.FALSE.
+CALL BUDGET_FLAGS(LUSERV, LUSERC, LUSERR,         &
+                  LUSERI, LUSERS, LUSERG, LUSERH  )
+!
+!-------------------------------------------------------------------------------
+!
+CONTAINS
+!
+!     ##########################################################################
+      SUBROUTINE  LES(OMASK)
+!     ##########################################################################
+!
+!
+!!****  *LES* computes the current time-step LES diagnostics for one mask.
+!!
+!!
+!!    PURPOSE
+!!    -------
+!!
+!!    EXTERNAL
+!!    --------
+!!
+!!    IMPLICIT ARGUMENTS
+!!    ------------------
+!!
+!!    REFERENCE
+!!    ---------
+!!
+!!    AUTHOR
+!!    ------
+!!      V. Masson
+!!
+!!    MODIFICATIONS
+!!    -------------
+!!      Original         07/02/00
+!!
+!! --------------------------------------------------------------------------
+!
+!*      0. DECLARATIONS
+!          ------------
+!
+USE MODD_PARAMETERS
+!
+USE MODI_LES_FLUX_ll
+USE MODI_LES_3RD_MOMENT_ll
+USE MODI_LES_4TH_MOMENT_ll
+USE MODI_LES_MEAN_1PROC
+USE MODI_LES_MEAN_MPROC
+USE MODI_LES_PDF_ll
+!
+USE MODI_LES_HOR_CORR
+!
+IMPLICIT NONE
+!
+!
+!*      0.1  declarations of arguments
+!
+LOGICAL, DIMENSION(:,:,:),   INTENT(IN) :: OMASK     ! 2D mask for computations
+!
+!
+!
+!       0.2  declaration of local variables
+!
+INTEGER :: JSV      ! scalar variables counter
+INTEGER :: JI
+INTEGER :: JK       ! vertical loop counter
+INTEGER :: JPDF     ! pdf counter
+!
+LOGICAL, DIMENSION(SIZE(ZW_LES,1),SIZE(ZW_LES,2),SIZE(ZW_LES,3)) :: GUPDRAFT_MASK
+LOGICAL, DIMENSION(SIZE(ZW_LES,1),SIZE(ZW_LES,2),SIZE(ZW_LES,3)) :: GDOWNDRAFT_MASK
+REAL,    DIMENSION(SIZE(ZW_LES,1),SIZE(ZW_LES,2),SIZE(ZW_LES,3)) :: ZUPDRAFT
+REAL,    DIMENSION(SIZE(ZW_LES,1),SIZE(ZW_LES,2),SIZE(ZW_LES,3)) :: ZDOWNDRAFT
+REAL,    DIMENSION(SIZE(ZW_LES,1),SIZE(ZW_LES,2),SIZE(ZW_LES,3)) :: ZW_UP
+REAL,    DIMENSION(SIZE(ZW_LES,1),SIZE(ZW_LES,2),SIZE(ZW_LES,3)) :: ZWORK_LES
+!
+INTEGER, DIMENSION(SIZE(ZW_LES,3)) :: IAVG_PTS
+INTEGER, DIMENSION(SIZE(ZW_LES,3)) :: IUND_PTS
+REAL,    DIMENSION(SIZE(ZW_LES,3)) :: ZAVG
+!
+REAL,    DIMENSION(SIZE(ZW_LES,3)) :: ZLES_RESOLVED_U3
+REAL,    DIMENSION(SIZE(ZW_LES,3)) :: ZLES_RESOLVED_UV2
+REAL,    DIMENSION(SIZE(ZW_LES,3)) :: ZLES_RESOLVED_UW2
+REAL,    DIMENSION(SIZE(ZW_LES,3)) :: ZLES_RESOLVED_VU2
+REAL,    DIMENSION(SIZE(ZW_LES,3)) :: ZLES_RESOLVED_V3
+REAL,    DIMENSION(SIZE(ZW_LES,3)) :: ZLES_RESOLVED_VW2
+REAL,    DIMENSION(SIZE(ZW_LES,3)) :: ZLES_RESOLVED_WU2
+REAL,    DIMENSION(SIZE(ZW_LES,3)) :: ZLES_RESOLVED_WV2
+REAL,    DIMENSION(SIZE(ZW_LES,3)) :: ZLES_UPDRAFT_U2
+REAL,    DIMENSION(SIZE(ZW_LES,3)) :: ZLES_UPDRAFT_V2
+REAL,    DIMENSION(SIZE(ZW_LES,3)) :: ZLES_UPDRAFT_W2
+REAL,    DIMENSION(SIZE(ZW_LES,3)) :: ZLES_DOWNDRAFT_U2
+REAL,    DIMENSION(SIZE(ZW_LES,3)) :: ZLES_DOWNDRAFT_V2
+REAL,    DIMENSION(SIZE(ZW_LES,3)) :: ZLES_DOWNDRAFT_W2
+REAL,    DIMENSION(SIZE(ZW_LES,3),NPDF) :: ZPDF
+!
+INTEGER, DIMENSION(1)               :: IKMIN_FLUX ! vertical index of min. W'thl'
+INTEGER, DIMENSION(1)               :: IKMAX_TH !vertical index maxdth
+INTEGER, DIMENSION(1)               :: IKMAX_CF   ! vertical index of max. Cf
+!
+REAL,    DIMENSION(SIZE(ZW_LES,3)) :: ZKE_TOT    ! total turbulent kinetic energy
+REAL                               :: ZINT_KE_TOT! integral of KE_TOT
+REAL                               :: ZINT_RHOKE! integral of RHO*KE
+REAL                               :: ZFRIC_SURF ! surface friction
+REAL,    DIMENSION(SIZE(ZW_LES,3)) :: ZFRIC_LES  ! friction at all LES levels
+!
+!-------------------------------------------------------------------------------
+!
+!       1.   local diagnostics (for any mask type)
+!            -----------------
+!
+!
+!       1.2  Number of points used for averaging on current processor
+!            --------------------------------------------------------
+!
+!* to be sure to be coherent with other computations,
+!  a field on LES vertical grid (and horizontal mass point grid) is used.
+!  This information is necessary for the subgrid fluxes computations, because
+!  half of the work is already done, but the number of averaging points was
+!  not kept.
+!
+CALL LES_MEAN_1PROC ( XW_ANOM, OMASK,                              &
+                      ZAVG(:),                                     &
+                      IAVG_PTS(:),                                 &
+                      IUND_PTS(:)                                  )
+!
+!
+!       1.3  Number of points used for averaging on all processor
+!            ----------------------------------------------------
+!
+CALL LES_MEAN_ll ( XW_ANOM, OMASK,                                  &
+                   ZAVG(:),                                         &
+                   NLES_AVG_PTS_ll(:,NLES_CURRENT_TCOUNT,IMASK),    &
+                   NLES_UND_PTS_ll(:,NLES_CURRENT_TCOUNT,IMASK)     )
+!
+!
+!       1.4  Mean quantities
+!            ---------------
+!
+IF (LLES_MEAN .AND. IMASK > 1) THEN
+!
+!* horizontal wind velocities
+!
+  CALL LES_MEAN_ll ( ZU_LES, OMASK,                               &
+                     XLES_MEAN_U(:,NLES_CURRENT_TCOUNT,IMASK)     )
+!
+  CALL LES_MEAN_ll ( ZV_LES, OMASK,                               &
+                     XLES_MEAN_V(:,NLES_CURRENT_TCOUNT,IMASK)     )
+!
+!* vertical wind velocity
+!
+  CALL LES_MEAN_ll ( ZW_LES, OMASK,                               &
+                     XLES_MEAN_W(:,NLES_CURRENT_TCOUNT,IMASK)     )
+!
+!* pressure
+!
+  CALL LES_MEAN_ll ( ZP_LES, OMASK,                               &
+                     XLES_MEAN_P(:,NLES_CURRENT_TCOUNT,IMASK)     )
+!
+!* dynamical production TKE
+!
+  CALL LES_MEAN_ll ( ZDP_LES, OMASK,                               &
+                     XLES_MEAN_DP(:,NLES_CURRENT_TCOUNT,IMASK)     )
+!
+!* thermal production TKE
+!
+  CALL LES_MEAN_ll ( ZTP_LES, OMASK,                               &
+                     XLES_MEAN_TP(:,NLES_CURRENT_TCOUNT,IMASK)     )
+!
+!* transport TKE
+!
+  CALL LES_MEAN_ll ( ZTR_LES, OMASK,                               &
+                     XLES_MEAN_TR(:,NLES_CURRENT_TCOUNT,IMASK)     )
+!
+!* dissipation TKE
+!
+  CALL LES_MEAN_ll ( ZDISS_LES, OMASK,                               &
+                     XLES_MEAN_DISS(:,NLES_CURRENT_TCOUNT,IMASK)     )
+!
+!* mixing length            
+!
+  CALL LES_MEAN_ll ( ZLM_LES, OMASK,                               &
+                     XLES_MEAN_LM(:,NLES_CURRENT_TCOUNT,IMASK)     )
+!
+!* density
+!
+  CALL LES_MEAN_ll ( ZRHO_LES, OMASK,                             &
+                     XLES_MEAN_RHO(:,NLES_CURRENT_TCOUNT,IMASK)   )
+!
+!
+!* potential temperature
+!
+  CALL LES_MEAN_ll ( ZTH_LES, OMASK,                               &
+                     XLES_MEAN_Th(:,NLES_CURRENT_TCOUNT,IMASK)     )
+!
+!* mass flux
+  CALL LES_MEAN_ll ( ZMF_LES, OMASK,                               &
+                     XLES_MEAN_Mf(:,NLES_CURRENT_TCOUNT,IMASK)     )
+!
+!
+!* virtual potential temperature
+!
+  IF (LUSERV)                                                      &
+  CALL LES_MEAN_ll ( ZTHV_LES, OMASK,                              &
+                     XLES_MEAN_Thv(:,NLES_CURRENT_TCOUNT,IMASK)    )
+!
+!* liquid potential temperature
+!
+  IF (LUSERC) THEN
+    CALL LES_MEAN_ll ( ZTHL_LES, OMASK,                               &
+                       XLES_MEAN_Thl(:,NLES_CURRENT_TCOUNT,IMASK)     )
+  END IF
+!
+!* vapor mixing ratio
+!
+  IF (LUSERV) THEN
+    CALL LES_MEAN_ll ( ZRV_LES, OMASK,                               &
+                       XLES_MEAN_Rv(:,NLES_CURRENT_TCOUNT,IMASK)     )
+  END IF
+!
+!*relative humidity
+!
+  IF (LUSERV) THEN
+    CALL LES_MEAN_ll ( ZREHU_LES, OMASK,                               &
+                       XLES_MEAN_Rehu(:,NLES_CURRENT_TCOUNT,IMASK)     )
+  END IF
+!  
+!* cloud mixing ratio
+!
+  IF (LUSERC) THEN
+    CALL LES_MEAN_ll ( ZRC_LES, OMASK,                              &
+                      XLES_MEAN_Rc(:,NLES_CURRENT_TCOUNT,IMASK)     )
+    CALL LES_MEAN_ll ( ZRT_LES, OMASK,                               &
+                      XLES_MEAN_Rt(:,NLES_CURRENT_TCOUNT,IMASK)     )
+  END IF
+!
+!* rain mixing ratio
+!
+  IF (LUSERR) THEN
+    CALL LES_MEAN_ll ( ZRR_LES, OMASK,                               &
+                       XLES_MEAN_Rr(:,NLES_CURRENT_TCOUNT,IMASK)     )
+  END IF
+!
+!* ice mixing ratio
+!
+  IF (LUSERI) THEN
+    CALL LES_MEAN_ll ( ZRI_LES, OMASK,                               &
+                       XLES_MEAN_Ri(:,NLES_CURRENT_TCOUNT,IMASK)     )
+  END IF
+!
+!* snow mixing ratio
+!
+  IF (LUSERS) THEN
+    CALL LES_MEAN_ll ( ZRS_LES, OMASK,                             &
+                     XLES_MEAN_Rs(:,NLES_CURRENT_TCOUNT,IMASK)     )
+  END IF
+!
+!* graupel mixing ratio
+!
+  IF (LUSERG) THEN
+    CALL LES_MEAN_ll ( ZRG_LES, OMASK,                             &
+                     XLES_MEAN_Rg(:,NLES_CURRENT_TCOUNT,IMASK)     )
+  END IF
+!
+!* hail mixing ratio
+!
+  IF (LUSERH) THEN
+    CALL LES_MEAN_ll ( ZRH_LES, OMASK,                             &
+                       XLES_MEAN_Rh(:,NLES_CURRENT_TCOUNT,IMASK)   )
+  END IF
+!
+!* scalar variables mixing ratio
+!
+  DO JSV=1,NSV
+    CALL LES_MEAN_ll ( ZSV_LES(:,:,:,JSV), OMASK,                        &
+                       XLES_MEAN_Sv(:,NLES_CURRENT_TCOUNT,IMASK,JSV)     )
+  END DO
+END IF
+!
+!* wind modulus
+!
+IF (LLES_MEAN) THEN
+!
+  ZWORK_LES =SQRT( ZU_LES**2 +ZV_LES**2 )
+  CALL LES_MEAN_ll ( ZWORK_LES, OMASK,                           &
+                     XLES_MEAN_WIND(:,NLES_CURRENT_TCOUNT,IMASK) )
+!
+!* vertical speed larger than mean vertical speed (updraft)
+!
+  DO JK=1,NLES_K
+    ZW_UP(:,:,JK) =  MAX(ZW_LES(:,:,JK), XLES_MEAN_W(JK,NLES_CURRENT_TCOUNT,IMASK))
+  END DO
+!
+!* upward mass flux
+!
+  ZWORK_LES = ZW_UP * ZRHO_LES
+  CALL LES_MEAN_ll ( ZWORK_LES, OMASK,                                 &
+                     XLES_RESOLVED_MASSFX(:,NLES_CURRENT_TCOUNT,IMASK) )
+!
+!* pdf calculation
+!
+ IF (LLES_PDF) THEN
+  CALL LES_PDF_ll  ( ZTH_LES,OMASK,XTH_PDF_MIN,XTH_PDF_MAX,    &
+                        ZPDF(:,:) )
+  DO JSV=1,NPDF
+       XLES_PDF_TH(:,NLES_CURRENT_TCOUNT,IMASK,JSV)=ZPDF(:,JSV)
+  END DO
+                        
+  CALL LES_PDF_ll  ( ZW_LES,OMASK,XW_PDF_MIN,XW_PDF_MAX,    &
+                        ZPDF(:,:) )
+  DO JSV=1,NPDF
+       XLES_PDF_W(:,NLES_CURRENT_TCOUNT,IMASK,JSV)=ZPDF(:,JSV)
+  END DO
+  CALL LES_PDF_ll  ( ZTHV_LES,OMASK,XTHV_PDF_MIN,XTHV_PDF_MAX,    &
+                        ZPDF(:,:) )
+  DO JSV=1,NPDF
+       XLES_PDF_THV(:,NLES_CURRENT_TCOUNT,IMASK,JSV)=ZPDF(:,JSV)
+  END DO
+  IF (LUSERV) THEN
+   CALL LES_PDF_ll  ( ZRV_LES,OMASK,XRV_PDF_MIN,XRV_PDF_MAX,    &
+                        ZPDF(:,:) )
+   DO JSV=1,NPDF
+       XLES_PDF_RV(:,NLES_CURRENT_TCOUNT,IMASK,JSV)=ZPDF(:,JSV)
+   END DO
+  END IF
+  IF (LUSERC) THEN
+    CALL LES_PDF_ll  ( ZRC_LES,OMASK,XRC_PDF_MIN,XRC_PDF_MAX,    &
+                        ZPDF(:,:) )
+    DO JSV=1,NPDF
+       XLES_PDF_RC(:,NLES_CURRENT_TCOUNT,IMASK,JSV)=ZPDF(:,JSV)
+    END DO
+    CALL LES_PDF_ll  ( ZRT_LES,OMASK,XRT_PDF_MIN,XRT_PDF_MAX,    &
+                        ZPDF(:,:) )
+    DO JSV=1,NPDF
+       XLES_PDF_RT(:,NLES_CURRENT_TCOUNT,IMASK,JSV)=ZPDF(:,JSV)
+    END DO
+    CALL LES_PDF_ll  ( ZTHL_LES,OMASK,XTHL_PDF_MIN,XTHL_PDF_MAX,    &
+                        ZPDF(:,:) )
+    DO JSV=1,NPDF
+       XLES_PDF_THL(:,NLES_CURRENT_TCOUNT,IMASK,JSV)=ZPDF(:,JSV)
+    END DO
+  END IF
+  IF (LUSERR) THEN
+    CALL LES_PDF_ll  ( ZRR_LES,OMASK,XRR_PDF_MIN,XRR_PDF_MAX,    &
+                        ZPDF(:,:) )
+    DO JSV=1,NPDF
+       XLES_PDF_RR(:,NLES_CURRENT_TCOUNT,IMASK,JSV)=ZPDF(:,JSV)
+    END DO
+  END IF
+  IF (LUSERI) THEN
+    CALL LES_PDF_ll  ( ZRI_LES,OMASK,XRI_PDF_MIN,XRI_PDF_MAX,    &
+                        ZPDF(:,:) )
+    DO JSV=1,NPDF
+       XLES_PDF_RI(:,NLES_CURRENT_TCOUNT,IMASK,JSV)=ZPDF(:,JSV)
+    END DO
+  END IF
+  IF (LUSERS) THEN
+    CALL LES_PDF_ll  ( ZRS_LES,OMASK,XRS_PDF_MIN,XRS_PDF_MAX,    &
+                        ZPDF(:,:) )
+    DO JSV=1,NPDF
+       XLES_PDF_RS(:,NLES_CURRENT_TCOUNT,IMASK,JSV)=ZPDF(:,JSV)
+    END DO
+  END IF
+  IF (LUSERG) THEN
+    CALL LES_PDF_ll  ( ZRG_LES,OMASK,XRG_PDF_MIN,XRG_PDF_MAX,    &
+                        ZPDF(:,:) )
+    DO JSV=1,NPDF
+       XLES_PDF_RG(:,NLES_CURRENT_TCOUNT,IMASK,JSV)=ZPDF(:,JSV)
+    END DO
+  END IF
+ END IF
+!
+!* mean vertical gradients
+!
+  CALL LES_MEAN_ll ( ZDTHLDZ_LES, OMASK, XLES_MEAN_DTHLDZ(:,NLES_CURRENT_TCOUNT,IMASK) )
+  CALL LES_MEAN_ll ( ZDUDZ_LES, OMASK, XLES_MEAN_DUDZ(:,NLES_CURRENT_TCOUNT,IMASK) )
+  CALL LES_MEAN_ll ( ZDVDZ_LES, OMASK, XLES_MEAN_DVDZ(:,NLES_CURRENT_TCOUNT,IMASK) )
+  CALL LES_MEAN_ll ( ZDWDZ_LES, OMASK, XLES_MEAN_DWDZ(:,NLES_CURRENT_TCOUNT,IMASK) )
+  IF (LUSERV) CALL LES_MEAN_ll ( ZDRtDZ_LES, OMASK, XLES_MEAN_DRtDZ(:,NLES_CURRENT_TCOUNT,IMASK) )
+  DO JSV=1,NSV
+    CALL LES_MEAN_ll ( ZDSVDZ_LES(:,:,:,JSV), OMASK, XLES_MEAN_DSVDZ(:,NLES_CURRENT_TCOUNT,IMASK,JSV) )
+  END DO
+
+END IF
+!-------------------------------------------------------------------------------
+!
+!       1.5  Resolved quantities
+!            -------------------
+!
+!* horizontal wind variances
+!
+  CALL LES_FLUX_ll ( XU_ANOM, XU_ANOM,                                 &
+                     OMASK,                                            &
+                     XLES_RESOLVED_U2 (:,NLES_CURRENT_TCOUNT,IMASK)    )
+!
+  CALL LES_FLUX_ll ( XV_ANOM, XV_ANOM,                                 &
+                     OMASK,                                            &
+                     XLES_RESOLVED_V2 (:,NLES_CURRENT_TCOUNT,IMASK)    )
+!
+!* vertical wind variance
+!
+  CALL LES_FLUX_ll ( XW_ANOM, XW_ANOM,                                 &
+                     OMASK,                                            &
+                     XLES_RESOLVED_W2 (:,NLES_CURRENT_TCOUNT,IMASK)    )
+!
+!* pressure variance
+!
+  CALL LES_FLUX_ll ( ZP_ANOM, ZP_ANOM,                                 &
+                     OMASK,                                            &
+                     XLES_RESOLVED_P2 (:,NLES_CURRENT_TCOUNT,IMASK)    )
+!
+!* potential temperature variance
+!
+  CALL LES_FLUX_ll ( ZTH_ANOM, ZTH_ANOM,                               &
+                     OMASK,                                            &
+                     XLES_RESOLVED_TH2(:,NLES_CURRENT_TCOUNT,IMASK)    )
+
+!
+!* resolved turbulent kinetic energy
+!
+  XLES_RESOLVED_Ke(:,NLES_CURRENT_TCOUNT,IMASK) = XUNDEF
+!
+  WHERE(XLES_RESOLVED_U2 (:,NLES_CURRENT_TCOUNT,IMASK) /= XUNDEF) &
+  XLES_RESOLVED_Ke(:,NLES_CURRENT_TCOUNT,IMASK) = 0.5*(           &
+                   XLES_RESOLVED_U2 (:,NLES_CURRENT_TCOUNT,IMASK) &
+                 + XLES_RESOLVED_V2 (:,NLES_CURRENT_TCOUNT,IMASK) &
+                 + XLES_RESOLVED_W2 (:,NLES_CURRENT_TCOUNT,IMASK))
+!
+!* potential temperature - virtual potential temperature covariance
+!
+  IF (LUSERV) THEN
+    CALL LES_FLUX_ll ( ZTH_ANOM, ZTHV_ANOM,                              &
+                       OMASK,                                            &
+                       XLES_RESOLVED_THTHV(:,NLES_CURRENT_TCOUNT,IMASK)  )
+
+!
+!* vapor mixing ratio variance
+!
+    CALL LES_FLUX_ll ( ZRV_ANOM, ZRV_ANOM,                               &
+                       OMASK,                                            &
+                       XLES_RESOLVED_Rv2(:,NLES_CURRENT_TCOUNT,IMASK)    )
+!
+!
+!* potential temperature - vapor mixing ratio correlation
+!
+    CALL LES_FLUX_ll ( ZTH_ANOM, ZRV_ANOM,                               &
+                       OMASK,                                            &
+                       XLES_RESOLVED_ThRv(:,NLES_CURRENT_TCOUNT,IMASK)   )
+!
+!* virtual potential temperature - vapor mixing ratio correlation
+!
+    CALL LES_FLUX_ll ( ZTHV_ANOM, ZRV_ANOM,                              &
+                       OMASK,                                            &
+                       XLES_RESOLVED_ThvRv(:,NLES_CURRENT_TCOUNT,IMASK)  )
+  END IF
+!
+!
+!* liquid potential temperature - virtual potential temperature covariance
+!
+  IF (LUSERC) THEN
+    CALL LES_FLUX_ll ( XTHL_ANOM, ZTHV_ANOM,                             &
+                       OMASK,                                            &
+                       XLES_RESOLVED_THLTHV(:,NLES_CURRENT_TCOUNT,IMASK) )
+!
+!* liquid potential temperature variance
+!
+    CALL LES_FLUX_ll ( XTHL_ANOM, XTHL_ANOM,                             &
+                       OMASK,                                            &
+                       XLES_RESOLVED_THL2(:,NLES_CURRENT_TCOUNT,IMASK)   )
+!
+!* total water mixing ratio variance
+!
+    CALL LES_FLUX_ll ( XRT_ANOM, XRT_ANOM,                               &
+                       OMASK,                                            &
+                       XLES_RESOLVED_Rt2(:,NLES_CURRENT_TCOUNT,IMASK)    )
+!
+!* cloud mixing ratio variance
+!
+    CALL LES_FLUX_ll ( ZRC_ANOM, ZRC_ANOM,                               &
+                       OMASK,                                            &
+                       XLES_RESOLVED_Rc2(:,NLES_CURRENT_TCOUNT,IMASK)    )
+!
+!* potential temperature - cloud mixing ratio correlation
+!
+    CALL LES_FLUX_ll ( ZTH_ANOM, ZRC_ANOM,                               &
+                       OMASK,                                            &
+                       XLES_RESOLVED_ThRc(:,NLES_CURRENT_TCOUNT,IMASK)   )
+!
+!* liquid potential temperature - vapor mixing ratio correlation
+!
+    CALL LES_FLUX_ll ( XTHL_ANOM, ZRV_ANOM,                               &
+                       OMASK,                                             &
+                       XLES_RESOLVED_ThlRv(:,NLES_CURRENT_TCOUNT,IMASK)   )
+!
+!* liquid potential temperature - cloud mixing ratio correlation
+!
+    CALL LES_FLUX_ll ( XTHL_ANOM, ZRC_ANOM,                               &
+                       OMASK,                                             &
+                       XLES_RESOLVED_ThlRc(:,NLES_CURRENT_TCOUNT,IMASK)   )
+!
+!* virtual potential temperature - cloud mixing ratio correlation
+!
+    CALL LES_FLUX_ll ( ZTHV_ANOM, ZRC_ANOM,                              &
+                       OMASK,                                            &
+                       XLES_RESOLVED_ThvRc(:,NLES_CURRENT_TCOUNT,IMASK)  )
+!
+! variance of lwp 
+!
+    IF (IMASK .EQ. 1) THEN
+    CALL LES_FLUX_ll (ZLWP_ANOM, ZLWP_ANOM,                           &
+                      OMASK(:,:,1),                                   &
+                       XLES_LWPVAR(NLES_CURRENT_TCOUNT)  ) 
+    END IF
+  END IF
+!
+!* ice mixing ratio variance
+!
+  IF (LUSERI) THEN
+    CALL LES_FLUX_ll ( ZRI_ANOM, ZRI_ANOM,                               &
+                       OMASK,                                            &
+                       XLES_RESOLVED_Ri2(:,NLES_CURRENT_TCOUNT,IMASK)    )
+!
+!* potential temperature - ice mixing ratio correlation
+!
+    CALL LES_FLUX_ll ( ZTH_ANOM, ZRI_ANOM,                               &
+                       OMASK,                                            &
+                       XLES_RESOLVED_ThRi(:,NLES_CURRENT_TCOUNT,IMASK)   )
+!
+!* liquid potential temperature - ice mixing ratio correlation
+!
+    CALL LES_FLUX_ll ( XTHL_ANOM, ZRI_ANOM,                               &
+                       OMASK,                                             &
+                       XLES_RESOLVED_ThlRi(:,NLES_CURRENT_TCOUNT,IMASK)   )
+!
+!* virtual potential temperature - ice mixing ratio correlation
+!
+    CALL LES_FLUX_ll ( ZTHV_ANOM, ZRI_ANOM,                              &
+                       OMASK,                                            &
+                       XLES_RESOLVED_ThvRi(:,NLES_CURRENT_TCOUNT,IMASK)  )
+  END IF
+!
+!* scalar variable mixing ratio variances
+!
+  DO JSV=1,NSV
+    CALL LES_FLUX_ll ( XSV_ANOM(:,:,:,JSV), XSV_ANOM(:,:,:,JSV),             &
+                       OMASK,                                                &
+                       XLES_RESOLVED_Sv2(:,NLES_CURRENT_TCOUNT,IMASK,JSV)    )
+!
+!* potential temperature - scalar variables ratio correlation
+!
+    CALL LES_FLUX_ll ( ZTH_ANOM, XSV_ANOM(:,:,:,JSV),                      &
+                       OMASK,                                              &
+                       XLES_RESOLVED_ThSv(:,NLES_CURRENT_TCOUNT,IMASK,JSV) )
+!
+!* liquid potential temperature - scalar variables ratio correlation
+!
+    IF (LUSERC) THEN
+      CALL LES_FLUX_ll ( XTHL_ANOM, XSV_ANOM(:,:,:,JSV),                     &
+                         OMASK,                                              &
+                         XLES_RESOLVED_ThlSv(:,NLES_CURRENT_TCOUNT,IMASK,JSV) )
+    END IF
+!
+!* virtual potential temperature - scalar variables ratio correlation
+!
+    IF (LUSERV) THEN
+      CALL LES_FLUX_ll ( ZTHV_ANOM, XSV_ANOM(:,:,:,JSV),                      &
+                         OMASK,                                               &
+                         XLES_RESOLVED_ThvSv(:,NLES_CURRENT_TCOUNT,IMASK,JSV) )
+    END IF
+  END DO
+!
+!
+!* wind fluxes
+!
+  CALL LES_FLUX_ll ( XU_ANOM, XV_ANOM,                                 &
+                     OMASK,                                            &
+                     XLES_RESOLVED_UV (:,NLES_CURRENT_TCOUNT,IMASK)    )
+!
+  CALL LES_FLUX_ll ( XW_ANOM, XU_ANOM,                                 &
+                     OMASK,                                            &
+                     XLES_RESOLVED_WU (:,NLES_CURRENT_TCOUNT,IMASK)    )
+!
+  CALL LES_FLUX_ll ( XW_ANOM, XV_ANOM,                                 &
+                     OMASK,                                            &
+                     XLES_RESOLVED_WV (:,NLES_CURRENT_TCOUNT,IMASK)    )
+!
+!* pressure fluxes
+!
+  CALL LES_FLUX_ll ( XU_ANOM, ZDPDZ_ANOM,                               &
+                     OMASK,                                             &
+                     XLES_RESOLVED_UP  (:,NLES_CURRENT_TCOUNT,IMASK)    )
+!
+  CALL LES_FLUX_ll ( XV_ANOM, ZDPDZ_ANOM,                               &
+                     OMASK,                                             &
+                     XLES_RESOLVED_VP  (:,NLES_CURRENT_TCOUNT,IMASK)    )
+!
+  CALL LES_FLUX_ll ( XW_ANOM, ZDPDZ_ANOM,                               &
+                     OMASK,                                             &
+                     XLES_RESOLVED_WP  (:,NLES_CURRENT_TCOUNT,IMASK)    )
+!
+!* theta fluxes
+!
+  CALL LES_FLUX_ll ( XU_ANOM, ZTH_ANOM,                                 &
+                     OMASK,                                             &
+                     XLES_RESOLVED_UTh (:,NLES_CURRENT_TCOUNT,IMASK)    )
+
+  CALL LES_FLUX_ll ( XV_ANOM, ZTH_ANOM,                                 &
+                     OMASK,                                             &
+                     XLES_RESOLVED_VTh (:,NLES_CURRENT_TCOUNT,IMASK)    )
+!
+  CALL LES_FLUX_ll ( XW_ANOM, ZTH_ANOM,                                 &
+                     OMASK,                                             &
+                     XLES_RESOLVED_WTh (:,NLES_CURRENT_TCOUNT,IMASK)    )
+!
+!* virtual theta fluxes
+!
+  IF (LUSERV) THEN
+    CALL LES_FLUX_ll ( XU_ANOM, ZTHV_ANOM,                                 &
+                       OMASK,                                              &
+                       XLES_RESOLVED_UThv (:,NLES_CURRENT_TCOUNT,IMASK)    )
+!
+    CALL LES_FLUX_ll ( XV_ANOM, ZTHV_ANOM,                                 &
+                       OMASK,                                              &
+                       XLES_RESOLVED_VThv (:,NLES_CURRENT_TCOUNT,IMASK)    )
+!
+    CALL LES_FLUX_ll ( XW_ANOM, ZTHV_ANOM,                                 &
+                       OMASK,                                              &
+                       XLES_RESOLVED_WThv (:,NLES_CURRENT_TCOUNT,IMASK)    )
+!
+!* vapor mixing ratio fluxes
+!
+    CALL LES_FLUX_ll ( XU_ANOM, ZRV_ANOM,                                  &
+                       OMASK,                                              &
+                       XLES_RESOLVED_URv (:,NLES_CURRENT_TCOUNT,IMASK)     )
+!
+    CALL LES_FLUX_ll ( XV_ANOM, ZRV_ANOM,                                  &
+                       OMASK,                                              &
+                       XLES_RESOLVED_VRv (:,NLES_CURRENT_TCOUNT,IMASK)     )
+!
+    CALL LES_FLUX_ll ( XW_ANOM, ZRV_ANOM,                                  &
+                       OMASK,                                              &
+                       XLES_RESOLVED_WRv (:,NLES_CURRENT_TCOUNT,IMASK)     )
+  END IF
+!
+!* cloud water mixing ratio fluxes
+!
+  IF (LUSERC) THEN
+    CALL LES_FLUX_ll ( XU_ANOM, ZRC_ANOM,                                  &
+                       OMASK,                                              &
+                       XLES_RESOLVED_URc (:,NLES_CURRENT_TCOUNT,IMASK)     )
+!
+    CALL LES_FLUX_ll ( XV_ANOM, ZRC_ANOM,                                  &
+                       OMASK,                                              &
+                       XLES_RESOLVED_VRc (:,NLES_CURRENT_TCOUNT,IMASK)     )
+!
+    CALL LES_FLUX_ll ( XW_ANOM, ZRC_ANOM,                                  &
+                       OMASK,                                              &
+                       XLES_RESOLVED_WRc (:,NLES_CURRENT_TCOUNT,IMASK)     )
+!
+!* liquid theta fluxes
+!
+    CALL LES_FLUX_ll ( XU_ANOM, XTHL_ANOM,                                 &
+                       OMASK,                                              &
+                       XLES_RESOLVED_UThl (:,NLES_CURRENT_TCOUNT,IMASK)    )
+!
+    CALL LES_FLUX_ll ( XV_ANOM, XTHL_ANOM,                                 &
+                       OMASK,                                              &
+                       XLES_RESOLVED_VThl (:,NLES_CURRENT_TCOUNT,IMASK)    )
+!
+    CALL LES_FLUX_ll ( XW_ANOM, XTHL_ANOM,                                 &
+                       OMASK,                                              &
+                       XLES_RESOLVED_WThl (:,NLES_CURRENT_TCOUNT,IMASK)    )
+!
+!* total water mixing ratio fluxes
+!
+    CALL LES_FLUX_ll ( XW_ANOM, XRT_ANOM,                                  &
+                       OMASK,                                              &
+                       XLES_RESOLVED_WRt (:,NLES_CURRENT_TCOUNT,IMASK)     )
+  END IF
+!
+!* cloud ice mixing ratio fluxes
+!
+  IF (LUSERI) THEN
+    CALL LES_FLUX_ll ( XU_ANOM, ZRI_ANOM,                                  &
+                       OMASK,                                              &
+                       XLES_RESOLVED_URi (:,NLES_CURRENT_TCOUNT,IMASK)     )
+!
+  CALL LES_FLUX_ll ( XV_ANOM, ZRI_ANOM,                                  &
+                     OMASK,                                              &
+                     XLES_RESOLVED_VRi (:,NLES_CURRENT_TCOUNT,IMASK)     )
+!
+    CALL LES_FLUX_ll ( XW_ANOM, ZRI_ANOM,                                  &
+                       OMASK,                                              &
+                       XLES_RESOLVED_WRi (:,NLES_CURRENT_TCOUNT,IMASK)     )
+  END IF
+  IF (LUSERR) THEN
+     CALL LES_FLUX_ll ( XW_ANOM, ZRR_ANOM,                                  &
+                       OMASK,                                              &
+                       XLES_RESOLVED_WRr (:,NLES_CURRENT_TCOUNT,IMASK)     )
+  END IF
+!
+
+!
+!* scalar variables fluxes
+!
+  DO JSV=1,NSV
+    CALL LES_FLUX_ll ( XU_ANOM, XSV_ANOM(:,:,:,JSV),                           &
+                       OMASK,                                                  &
+                       XLES_RESOLVED_USv (:,NLES_CURRENT_TCOUNT,IMASK,JSV)     )
+!
+   CALL LES_FLUX_ll ( XV_ANOM, XSV_ANOM(:,:,:,JSV),                            &
+                       OMASK,                                                  &
+                       XLES_RESOLVED_VSv (:,NLES_CURRENT_TCOUNT,IMASK,JSV)     )
+!
+    CALL LES_FLUX_ll ( XW_ANOM, XSV_ANOM(:,:,:,JSV),                           &
+                       OMASK,                                                  &
+                       XLES_RESOLVED_WSv (:,NLES_CURRENT_TCOUNT,IMASK,JSV)     )
+  END DO
+!
+!* skewness
+!
+  CALL LES_3RD_MOMENT_ll ( XU_ANOM, XU_ANOM, XU_ANOM,                       &
+                          OMASK,                                            &
+                          XLES_RESOLVED_U3 (:,NLES_CURRENT_TCOUNT,IMASK)    )
+ 
+  CALL LES_3RD_MOMENT_ll ( XV_ANOM, XV_ANOM, XV_ANOM,                       &
+                          OMASK,                                            &
+                          XLES_RESOLVED_V3 (:,NLES_CURRENT_TCOUNT,IMASK)    )
+ 
+  CALL LES_3RD_MOMENT_ll ( XW_ANOM, XW_ANOM, XW_ANOM,                       &
+                          OMASK,                                            &
+                          XLES_RESOLVED_W3 (:,NLES_CURRENT_TCOUNT,IMASK)    )
+!
+!* kurtosis
+!
+  CALL LES_4TH_MOMENT_ll ( XU_ANOM, XU_ANOM, XU_ANOM,  XU_ANOM,              &
+                          OMASK,                                            &
+                          XLES_RESOLVED_U4 (:,NLES_CURRENT_TCOUNT,IMASK)    )
+ 
+  CALL LES_4TH_MOMENT_ll ( XV_ANOM, XV_ANOM, XV_ANOM,  XV_ANOM,             &
+                          OMASK,                                            &
+                          XLES_RESOLVED_V4 (:,NLES_CURRENT_TCOUNT,IMASK)    )
+ 
+  CALL LES_4TH_MOMENT_ll ( XW_ANOM, XW_ANOM, XW_ANOM,   XW_ANOM,            &
+                          OMASK,                                            &
+                          XLES_RESOLVED_W4 (:,NLES_CURRENT_TCOUNT,IMASK)    )
+!
+!* third moments of liquid potential temperature
+!
+  IF (LUSERC) THEN
+    CALL LES_3RD_MOMENT_ll ( XW_ANOM, XTHL_ANOM, XTHL_ANOM,                    &
+                            OMASK,                                             &
+                            XLES_RESOLVED_WThl2(:,NLES_CURRENT_TCOUNT,IMASK)   )
+
+    CALL LES_3RD_MOMENT_ll ( XW_ANOM, XW_ANOM, XTHL_ANOM,                      &
+                            OMASK,                                             &
+                            XLES_RESOLVED_W2Thl(:,NLES_CURRENT_TCOUNT,IMASK)   )
+
+  ELSE
+    CALL LES_3RD_MOMENT_ll ( XW_ANOM, ZTH_ANOM, ZTH_ANOM,                      &
+                            OMASK,                                             &
+                            XLES_RESOLVED_WThl2(:,NLES_CURRENT_TCOUNT,IMASK)   )
+
+    CALL LES_3RD_MOMENT_ll ( XW_ANOM, XW_ANOM, ZTH_ANOM,                       &
+                            OMASK,                                             &
+                            XLES_RESOLVED_W2Thl(:,NLES_CURRENT_TCOUNT,IMASK)   )
+  END IF
+!
+!* third moments of water vapor
+!
+  IF (LUSERV) THEN
+    CALL LES_3RD_MOMENT_ll ( XW_ANOM, ZRV_ANOM, ZRV_ANOM,                      &
+                            OMASK,                                             &
+                            XLES_RESOLVED_WRv2 (:,NLES_CURRENT_TCOUNT,IMASK)   )
+
+    CALL LES_3RD_MOMENT_ll ( XW_ANOM, XW_ANOM, ZRV_ANOM,                       &
+                            OMASK,                                             &
+                            XLES_RESOLVED_W2Rv (:,NLES_CURRENT_TCOUNT,IMASK)   )
+  END IF
+
+  IF (LUSERC) THEN
+    CALL LES_3RD_MOMENT_ll ( XW_ANOM, XTHL_ANOM, ZRV_ANOM,                     &
+                            OMASK,                                             &
+                            XLES_RESOLVED_WThlRv(:,NLES_CURRENT_TCOUNT,IMASK)  )
+  ELSE IF (LUSERV) THEN
+    CALL LES_3RD_MOMENT_ll ( XW_ANOM, ZTH_ANOM, ZRV_ANOM,                      &
+                            OMASK,                                             &
+                            XLES_RESOLVED_WThlRv(:,NLES_CURRENT_TCOUNT,IMASK)  )
+  END IF
+!
+!* third moments of total water
+! 
+  IF (LUSERC) THEN
+    CALL LES_3RD_MOMENT_ll ( XW_ANOM, XRT_ANOM, XRT_ANOM,                      &
+                            OMASK,                                             &
+                            XLES_RESOLVED_WRt2 (:,NLES_CURRENT_TCOUNT,IMASK)   )
+
+    CALL LES_3RD_MOMENT_ll ( XW_ANOM, XW_ANOM, XRT_ANOM,                       &
+                            OMASK,                                             &
+                            XLES_RESOLVED_W2Rt (:,NLES_CURRENT_TCOUNT,IMASK)   )
+    CALL LES_3RD_MOMENT_ll ( XW_ANOM, XTHL_ANOM, XRT_ANOM,                       &
+                            OMASK,                                             &
+                            XLES_RESOLVED_WThlRt (:,NLES_CURRENT_TCOUNT,IMASK)   )                        
+  ELSE IF (LUSERV) THEN
+    CALL LES_3RD_MOMENT_ll ( XW_ANOM, ZRV_ANOM, ZRV_ANOM,                      &
+                            OMASK,                                             &
+                            XLES_RESOLVED_WRt2 (:,NLES_CURRENT_TCOUNT,IMASK)   )
+
+    CALL LES_3RD_MOMENT_ll ( XW_ANOM, XW_ANOM, ZRV_ANOM,                       &
+                            OMASK,                                             &
+                            XLES_RESOLVED_W2Rt (:,NLES_CURRENT_TCOUNT,IMASK)   )
+    CALL LES_3RD_MOMENT_ll ( XW_ANOM, ZTH_ANOM, ZRV_ANOM,                       &
+                            OMASK,                                             &
+                            XLES_RESOLVED_WThlRt (:,NLES_CURRENT_TCOUNT,IMASK)   )                        
+  END IF                            
+!
+!* third moments of cloud water
+!
+  IF (LUSERC) THEN
+    CALL LES_3RD_MOMENT_ll ( XW_ANOM, ZRC_ANOM, ZRC_ANOM,                      &
+                            OMASK,                                             &
+                            XLES_RESOLVED_WRc2 (:,NLES_CURRENT_TCOUNT,IMASK)   )
+
+    CALL LES_3RD_MOMENT_ll ( XW_ANOM, XW_ANOM, ZRC_ANOM,                       &
+                            OMASK,                                             &
+                            XLES_RESOLVED_W2Rc (:,NLES_CURRENT_TCOUNT,IMASK)   )
+
+    CALL LES_3RD_MOMENT_ll ( XW_ANOM, XTHL_ANOM, ZRC_ANOM,                     &
+                            OMASK,                                             &
+                            XLES_RESOLVED_WThlRc(:,NLES_CURRENT_TCOUNT,IMASK)  )
+
+    CALL LES_3RD_MOMENT_ll ( XW_ANOM, ZRV_ANOM, ZRC_ANOM,                      &
+                            OMASK,                                             &
+                            XLES_RESOLVED_WRvRc (:,NLES_CURRENT_TCOUNT,IMASK)  )
+  END IF
+!
+!* third moments of cloud ice
+!
+  IF (LUSERI) THEN
+    CALL LES_3RD_MOMENT_ll ( XW_ANOM, ZRI_ANOM, ZRI_ANOM,                      &
+                            OMASK,                                             &
+                            XLES_RESOLVED_WRi2 (:,NLES_CURRENT_TCOUNT,IMASK)   )
+
+    CALL LES_3RD_MOMENT_ll ( XW_ANOM, XW_ANOM, ZRI_ANOM,                      &
+                           OMASK,                                             &
+                           XLES_RESOLVED_W2Ri (:,NLES_CURRENT_TCOUNT,IMASK)   )
+
+    CALL LES_3RD_MOMENT_ll ( XW_ANOM, XTHL_ANOM, ZRI_ANOM,                     &
+                            OMASK,                                             &
+                            XLES_RESOLVED_WThlRi(:,NLES_CURRENT_TCOUNT,IMASK)  )
+
+    CALL LES_3RD_MOMENT_ll ( XW_ANOM, ZRV_ANOM, ZRI_ANOM,                      &
+                            OMASK,                                             &
+                            XLES_RESOLVED_WRvRi (:,NLES_CURRENT_TCOUNT,IMASK)  )
+  END IF
+!
+!* third moments of scalar variables
+!
+  DO JSV=1,NSV
+    CALL LES_3RD_MOMENT_ll ( XW_ANOM, XSV_ANOM(:,:,:,JSV), XSV_ANOM(:,:,:,JSV),    &
+                            OMASK,                                                 &
+                            XLES_RESOLVED_WSv2 (:,NLES_CURRENT_TCOUNT,IMASK,JSV)   )
+
+    CALL LES_3RD_MOMENT_ll ( XW_ANOM, XW_ANOM, XSV_ANOM(:,:,:,JSV),                &
+                            OMASK,                                                 &
+                            XLES_RESOLVED_W2Sv (:,NLES_CURRENT_TCOUNT,IMASK,JSV)   )
+    IF (LUSERC) THEN
+      CALL LES_3RD_MOMENT_ll ( XW_ANOM, XTHL_ANOM, XSV_ANOM(:,:,:,JSV),              &
+                              OMASK,                                                 &
+                              XLES_RESOLVED_WThlSv(:,NLES_CURRENT_TCOUNT,IMASK,JSV)  )
+    ELSE
+      CALL LES_3RD_MOMENT_ll ( XW_ANOM, ZTH_ANOM, XSV_ANOM(:,:,:,JSV),               &
+                              OMASK,                                                 &
+                              XLES_RESOLVED_WThlSv(:,NLES_CURRENT_TCOUNT,IMASK,JSV)  )
+    END IF
+
+    IF (LUSERV) THEN
+      CALL LES_3RD_MOMENT_ll ( XW_ANOM, ZRV_ANOM, XSV_ANOM(:,:,:,JSV),               &
+                              OMASK,                                                 &
+                              XLES_RESOLVED_WRvSv (:,NLES_CURRENT_TCOUNT,IMASK,JSV)  )
+    END IF
+  END DO
+!
+!* presso-correlations
+!
+!
+  CALL LES_FLUX_ll ( XTHL_ANOM, ZDPDZ_ANOM,                              &
+                     OMASK,                                              &
+                     XLES_RESOLVED_ThlPz(:,NLES_CURRENT_TCOUNT,IMASK)    )
+
+  IF (LUSERV) &
+  CALL LES_FLUX_ll ( ZRV_ANOM, ZDPDZ_ANOM,                               &
+                     OMASK,                                              &
+                     XLES_RESOLVED_RvPz(:,NLES_CURRENT_TCOUNT,IMASK)     )
+
+  IF (LUSERC) THEN
+    CALL LES_FLUX_ll ( XRT_ANOM, ZDPDZ_ANOM,                               &
+                       OMASK,                                              &
+                       XLES_RESOLVED_RtPz(:,NLES_CURRENT_TCOUNT,IMASK)     )
+
+    CALL LES_FLUX_ll ( ZRC_ANOM, ZDPDZ_ANOM,                               &
+                       OMASK,                                              &
+                       XLES_RESOLVED_RcPz(:,NLES_CURRENT_TCOUNT,IMASK)     )
+  END IF
+
+  IF (LUSERI) &
+  CALL LES_FLUX_ll ( ZRI_ANOM, ZDPDZ_ANOM,                               &
+                     OMASK,                                              &
+                     XLES_RESOLVED_RiPz(:,NLES_CURRENT_TCOUNT,IMASK)     )
+
+!
+!
+!* resolved turbulent kinetic energy fluxes
+!
+
+  CALL LES_3RD_MOMENT_ll ( XU_ANOM, XU_ANOM, XU_ANOM,                        &
+                          OMASK,                                             &
+                          ZLES_RESOLVED_U3  (:)                              )
+
+  CALL LES_3RD_MOMENT_ll ( XU_ANOM, XV_ANOM, XV_ANOM,                        &
+                          OMASK,                                             &
+                          ZLES_RESOLVED_UV2 (:)                              )
+
+  CALL LES_3RD_MOMENT_ll ( XU_ANOM, XW_ANOM, XW_ANOM,                        &
+                          OMASK,                                             &
+                          ZLES_RESOLVED_UW2 (:)                              )
+
+  XLES_RESOLVED_UKe(:,NLES_CURRENT_TCOUNT,IMASK) = 0.5*(  ZLES_RESOLVED_U3  &
+                                                        + ZLES_RESOLVED_UV2 &
+                                                        + ZLES_RESOLVED_UW2 )
+
+
+
+  CALL LES_3RD_MOMENT_ll ( XV_ANOM, XU_ANOM, XU_ANOM,                        &
+                          OMASK,                                             &
+                          ZLES_RESOLVED_VU2 (:)                              )
+
+  CALL LES_3RD_MOMENT_ll ( XV_ANOM, XV_ANOM, XV_ANOM,                        &
+                          OMASK,                                             &
+                          ZLES_RESOLVED_V3  (:)                              )
+
+  CALL LES_3RD_MOMENT_ll ( XV_ANOM, XW_ANOM, XW_ANOM,                        &
+                          OMASK,                                             &
+                          ZLES_RESOLVED_VW2 (:)                              )
+
+  XLES_RESOLVED_VKe(:,NLES_CURRENT_TCOUNT,IMASK) = 0.5*(  ZLES_RESOLVED_VU2 &
+                                                        + ZLES_RESOLVED_V3  &
+                                                        + ZLES_RESOLVED_VW2 )
+
+
+  CALL LES_3RD_MOMENT_ll ( XW_ANOM, XU_ANOM, XU_ANOM,                        &
+                          OMASK,                                             &
+                          ZLES_RESOLVED_WU2 (:)                              )
+
+  CALL LES_3RD_MOMENT_ll ( XW_ANOM, XV_ANOM, XV_ANOM,                        &
+                          OMASK,                                             &
+                          ZLES_RESOLVED_WV2 (:)                              )
+
+  XLES_RESOLVED_WKe(:,NLES_CURRENT_TCOUNT,IMASK) = 0.5*(  ZLES_RESOLVED_WU2  &
+                                                        + ZLES_RESOLVED_WV2  &
+                           + XLES_RESOLVED_W3(:,NLES_CURRENT_TCOUNT,IMASK)   )
+
+!
+!
+!-------------------------------------------------------------------------------
+!
+!       1.6  Subgrid quantities
+!            ------------------
+!
+IF (LLES_SUBGRID) THEN
+!
+!* wind fluxes and variances
+!
+  CALL LES_MEAN_ll ( ZTKE_LES, OMASK,                                  &
+                     XLES_SUBGRID_Tke(:,NLES_CURRENT_TCOUNT,IMASK)     )
+
+  CALL LES_MEAN_MPROC ( XLES_SUBGRID_UV(:,NLES_CURRENT_TCOUNT,IMASK),   &
+                        IAVG_PTS(:), IUND_PTS(:)                        )
+!
+  CALL LES_MEAN_MPROC ( XLES_SUBGRID_WU(:,NLES_CURRENT_TCOUNT,IMASK),   &
+                        IAVG_PTS(:), IUND_PTS(:)                        )
+!
+  CALL LES_MEAN_MPROC ( XLES_SUBGRID_WV(:,NLES_CURRENT_TCOUNT,IMASK),   &
+                        IAVG_PTS(:), IUND_PTS(:)                        )
+!
+  CALL LES_MEAN_MPROC ( XLES_SUBGRID_U2(:,NLES_CURRENT_TCOUNT,IMASK),   &
+                        IAVG_PTS(:), IUND_PTS(:)                        )
+!
+  CALL LES_MEAN_MPROC ( XLES_SUBGRID_V2(:,NLES_CURRENT_TCOUNT,IMASK),   &
+                        IAVG_PTS(:), IUND_PTS(:)                        )
+!
+  CALL LES_MEAN_MPROC ( XLES_SUBGRID_W2(:,NLES_CURRENT_TCOUNT,IMASK),   &
+                        IAVG_PTS(:), IUND_PTS(:)                        )
+!
+!
+!* liquid potential temperature fluxes
+!
+  CALL LES_MEAN_MPROC ( XLES_SUBGRID_UThl(:,NLES_CURRENT_TCOUNT,IMASK), &
+                        IAVG_PTS(:), IUND_PTS(:)                        )
+!
+  CALL LES_MEAN_MPROC ( XLES_SUBGRID_VThl(:,NLES_CURRENT_TCOUNT,IMASK), &
+                        IAVG_PTS(:), IUND_PTS(:)                        )
+!
+  CALL LES_MEAN_MPROC ( XLES_SUBGRID_WThl(:,NLES_CURRENT_TCOUNT,IMASK), &
+                        IAVG_PTS(:), IUND_PTS(:)                        )
+!
+
+!* liquid potential temperature variance
+!
+  CALL LES_MEAN_MPROC ( XLES_SUBGRID_Thl2(:,NLES_CURRENT_TCOUNT,IMASK), &
+                        IAVG_PTS(:), IUND_PTS(:)                        )
+!
+!* Mass flux scheme of shallow convection
+!
+  CALL LES_MEAN_MPROC ( XLES_SUBGRID_THLUP_MF(:,NLES_CURRENT_TCOUNT,IMASK), &
+                        IAVG_PTS(:), IUND_PTS(:)                        )  
+                        
+  CALL LES_MEAN_MPROC ( XLES_SUBGRID_RTUP_MF(:,NLES_CURRENT_TCOUNT,IMASK), &
+                        IAVG_PTS(:), IUND_PTS(:)                        )   
+!
+  CALL LES_MEAN_MPROC ( XLES_SUBGRID_RVUP_MF(:,NLES_CURRENT_TCOUNT,IMASK), &
+                        IAVG_PTS(:), IUND_PTS(:)                        )   
+!
+  CALL LES_MEAN_MPROC ( XLES_SUBGRID_RCUP_MF(:,NLES_CURRENT_TCOUNT,IMASK), &
+                        IAVG_PTS(:), IUND_PTS(:)                        )   
+!
+  CALL LES_MEAN_MPROC ( XLES_SUBGRID_RIUP_MF(:,NLES_CURRENT_TCOUNT,IMASK), &
+                        IAVG_PTS(:), IUND_PTS(:)                        )   
+!
+  CALL LES_MEAN_MPROC ( XLES_SUBGRID_WUP_MF(:,NLES_CURRENT_TCOUNT,IMASK), &
+                        IAVG_PTS(:), IUND_PTS(:)                        )    
+!
+  CALL LES_MEAN_MPROC ( XLES_SUBGRID_MASSFLUX(:,NLES_CURRENT_TCOUNT,IMASK), &
+                        IAVG_PTS(:), IUND_PTS(:)                        )  
+!
+  CALL LES_MEAN_MPROC ( XLES_SUBGRID_DETR(:,NLES_CURRENT_TCOUNT,IMASK), &
+                        IAVG_PTS(:), IUND_PTS(:)                        )      
+!
+  CALL LES_MEAN_MPROC ( XLES_SUBGRID_ENTR(:,NLES_CURRENT_TCOUNT,IMASK), &
+                        IAVG_PTS(:), IUND_PTS(:)                        )      
+!
+  CALL LES_MEAN_MPROC ( XLES_SUBGRID_FRACUP(:,NLES_CURRENT_TCOUNT,IMASK), &
+                        IAVG_PTS(:), IUND_PTS(:)                        )     
+!
+  CALL LES_MEAN_MPROC ( XLES_SUBGRID_THVUP_MF(:,NLES_CURRENT_TCOUNT,IMASK), &
+                        IAVG_PTS(:), IUND_PTS(:)                        )  
+!
+  CALL LES_MEAN_MPROC ( XLES_SUBGRID_WTHLMF(:,NLES_CURRENT_TCOUNT,IMASK), &
+                        IAVG_PTS(:), IUND_PTS(:)                        )    
+!
+  CALL LES_MEAN_MPROC ( XLES_SUBGRID_WRTMF(:,NLES_CURRENT_TCOUNT,IMASK), &
+                        IAVG_PTS(:), IUND_PTS(:)                        )  
+!
+  CALL LES_MEAN_MPROC ( XLES_SUBGRID_WTHVMF(:,NLES_CURRENT_TCOUNT,IMASK), &
+                        IAVG_PTS(:), IUND_PTS(:)                        ) 
+!
+  CALL LES_MEAN_MPROC ( XLES_SUBGRID_WUMF(:,NLES_CURRENT_TCOUNT,IMASK), &
+                        IAVG_PTS(:), IUND_PTS(:)                        )   
+!
+  CALL LES_MEAN_MPROC ( XLES_SUBGRID_WVMF(:,NLES_CURRENT_TCOUNT,IMASK), &
+                        IAVG_PTS(:), IUND_PTS(:)                        )   
+
+                        
+!* total water mixing ratio fluxes, correlation and variance
+!
+  IF (LUSERV) THEN
+    CALL LES_MEAN_MPROC ( XLES_SUBGRID_URt(:,NLES_CURRENT_TCOUNT,IMASK),  &
+                          IAVG_PTS(:), IUND_PTS(:)                        )
+    !
+    CALL LES_MEAN_MPROC ( XLES_SUBGRID_VRt(:,NLES_CURRENT_TCOUNT,IMASK),  &
+                          IAVG_PTS(:), IUND_PTS(:)                        )
+    !
+    CALL LES_MEAN_MPROC ( XLES_SUBGRID_WRt(:,NLES_CURRENT_TCOUNT,IMASK),  &
+                          IAVG_PTS(:), IUND_PTS(:)                        )
+    !
+    CALL LES_MEAN_MPROC ( XLES_SUBGRID_ThlRt(:,NLES_CURRENT_TCOUNT,IMASK),&
+                          IAVG_PTS(:), IUND_PTS(:)                        )
+    !
+    CALL LES_MEAN_MPROC ( XLES_SUBGRID_Rt2(:,NLES_CURRENT_TCOUNT,IMASK),  &
+                          IAVG_PTS(:), IUND_PTS(:)                        )
+  END IF
+!
+!* scalar variances
+!
+  DO JSV=1,NSV
+    CALL LES_MEAN_MPROC ( XLES_SUBGRID_Sv2(:,NLES_CURRENT_TCOUNT,IMASK,JSV), &
+                          IAVG_PTS(:), IUND_PTS(:)                           )
+  END DO
+!
+!* cloud water mixing ratio fluxes
+!
+  IF (LUSERC) THEN
+    CALL LES_MEAN_MPROC ( XLES_SUBGRID_URc(:,NLES_CURRENT_TCOUNT,IMASK),  &
+                          IAVG_PTS(:), IUND_PTS(:)                        )
+    !
+    CALL LES_MEAN_MPROC ( XLES_SUBGRID_VRc(:,NLES_CURRENT_TCOUNT,IMASK),  &
+                          IAVG_PTS(:), IUND_PTS(:)                        )
+    !
+    CALL LES_MEAN_MPROC ( XLES_SUBGRID_WRc(:,NLES_CURRENT_TCOUNT,IMASK),  &
+                          IAVG_PTS(:), IUND_PTS(:)                        )
+  END IF
+!
+!* scalar variables fluxes
+!
+  DO JSV=1,NSV
+    CALL LES_MEAN_MPROC ( XLES_SUBGRID_USv(:,NLES_CURRENT_TCOUNT,IMASK,JSV),  &
+                          IAVG_PTS(:), IUND_PTS(:)                            )
+    !
+    CALL LES_MEAN_MPROC ( XLES_SUBGRID_VSv(:,NLES_CURRENT_TCOUNT,IMASK,JSV),  &
+                          IAVG_PTS(:), IUND_PTS(:)                            )
+    !
+    CALL LES_MEAN_MPROC ( XLES_SUBGRID_WSv(:,NLES_CURRENT_TCOUNT,IMASK,JSV),  &
+                          IAVG_PTS(:), IUND_PTS(:)                            )
+  END DO
+!
+!* subgrid turbulent kinetic energy fluxes
+!
+  CALL LES_MEAN_MPROC ( XLES_SUBGRID_UTke(:,NLES_CURRENT_TCOUNT,IMASK),  &
+                        IAVG_PTS(:), IUND_PTS(:)                         )
+  !
+  CALL LES_MEAN_MPROC ( XLES_SUBGRID_VTke(:,NLES_CURRENT_TCOUNT,IMASK),  &
+                        IAVG_PTS(:), IUND_PTS(:)                         )
+  !
+  CALL LES_MEAN_MPROC ( XLES_SUBGRID_WTke(:,NLES_CURRENT_TCOUNT,IMASK),  &
+                        IAVG_PTS(:), IUND_PTS(:)                         )
+
+  CALL LES_MEAN_MPROC ( XLES_SUBGRID_ddz_WTke(:,NLES_CURRENT_TCOUNT,IMASK),&
+                        IAVG_PTS(:), IUND_PTS(:)                           )
+!
+!* fluxes and correlations with virtual potential temperature
+!
+  IF (LUSERV) THEN
+    CALL LES_MEAN_MPROC ( XLES_SUBGRID_WThv(:,NLES_CURRENT_TCOUNT,IMASK),  &
+                          IAVG_PTS(:), IUND_PTS(:)                         )
+
+    CALL LES_MEAN_MPROC ( XLES_SUBGRID_ThlThv(:,NLES_CURRENT_TCOUNT,IMASK),&
+                          IAVG_PTS(:), IUND_PTS(:)                         )
+
+    CALL LES_MEAN_MPROC ( XLES_SUBGRID_RtThv(:,NLES_CURRENT_TCOUNT,IMASK), &
+                          IAVG_PTS(:), IUND_PTS(:)                         )
+
+    DO JSV=1,NSV
+      CALL LES_MEAN_MPROC ( XLES_SUBGRID_SvThv(:,NLES_CURRENT_TCOUNT,IMASK,JSV),  &
+                            IAVG_PTS(:), IUND_PTS(:)                              )
+   END DO
+  END IF
+!
+!* third order fluxes
+!
+  CALL LES_MEAN_MPROC ( XLES_SUBGRID_W2Thl(:,NLES_CURRENT_TCOUNT,IMASK),   &
+                          IAVG_PTS(:), IUND_PTS(:)                         )
+
+  CALL LES_MEAN_MPROC ( XLES_SUBGRID_WThl2(:,NLES_CURRENT_TCOUNT,IMASK),   &
+                          IAVG_PTS(:), IUND_PTS(:)                         )
+
+  IF (LUSERV) THEN
+    CALL LES_MEAN_MPROC ( XLES_SUBGRID_W2Rt(:,NLES_CURRENT_TCOUNT,IMASK),  &
+                          IAVG_PTS(:), IUND_PTS(:)                         )
+
+    CALL LES_MEAN_MPROC ( XLES_SUBGRID_WThlRt(:,NLES_CURRENT_TCOUNT,IMASK),&
+                          IAVG_PTS(:), IUND_PTS(:)                         )
+
+    CALL LES_MEAN_MPROC ( XLES_SUBGRID_WRt2(:,NLES_CURRENT_TCOUNT,IMASK),  &
+                          IAVG_PTS(:), IUND_PTS(:)                         )
+
+  END IF
+    DO JSV=1,NSV
+      CALL LES_MEAN_MPROC ( XLES_SUBGRID_W2Sv(:,NLES_CURRENT_TCOUNT,IMASK,JSV),  &
+                            IAVG_PTS(:), IUND_PTS(:)                             )
+
+      CALL LES_MEAN_MPROC ( XLES_SUBGRID_WSv2(:,NLES_CURRENT_TCOUNT,IMASK,JSV),  &
+                            IAVG_PTS(:), IUND_PTS(:)                             )
+   END DO
+!
+!* dissipative terms
+!
+  CALL LES_MEAN_MPROC ( XLES_SUBGRID_DISS_Tke(:,NLES_CURRENT_TCOUNT,IMASK), &
+                          IAVG_PTS(:), IUND_PTS(:)                          )
+
+  CALL LES_MEAN_MPROC ( XLES_SUBGRID_DISS_Thl2(:,NLES_CURRENT_TCOUNT,IMASK), &
+                          IAVG_PTS(:), IUND_PTS(:)                           )
+
+  IF (LUSERV) THEN
+    CALL LES_MEAN_MPROC ( XLES_SUBGRID_DISS_Rt2(:,NLES_CURRENT_TCOUNT,IMASK),&
+                          IAVG_PTS(:), IUND_PTS(:)                           )
+
+    CALL LES_MEAN_MPROC ( XLES_SUBGRID_DISS_ThlRt(:,NLES_CURRENT_TCOUNT,IMASK),&
+                          IAVG_PTS(:), IUND_PTS(:)                             )
+  END IF
+
+  DO JSV=1,NSV
+    CALL LES_MEAN_MPROC ( XLES_SUBGRID_DISS_Sv2(:,NLES_CURRENT_TCOUNT,IMASK,JSV), &
+                          IAVG_PTS(:), IUND_PTS(:)                                )
+  END DO
+!
+!* presso-correlation terms
+!
+  CALL LES_MEAN_MPROC ( XLES_SUBGRID_WP(:,NLES_CURRENT_TCOUNT,IMASK), &
+                          IAVG_PTS(:), IUND_PTS(:)                    )
+
+  CALL LES_MEAN_MPROC ( XLES_SUBGRID_ThlPz(:,NLES_CURRENT_TCOUNT,IMASK), &
+                          IAVG_PTS(:), IUND_PTS(:)                       )
+
+  IF (LUSERV) THEN
+    CALL LES_MEAN_MPROC ( XLES_SUBGRID_RtPz(:,NLES_CURRENT_TCOUNT,IMASK), &
+                          IAVG_PTS(:), IUND_PTS(:)                        )
+
+  END IF
+
+  DO JSV=1,NSV
+    CALL LES_MEAN_MPROC ( XLES_SUBGRID_SvPz(:,NLES_CURRENT_TCOUNT,IMASK,JSV), &
+                          IAVG_PTS(:), IUND_PTS(:)                            )
+  END DO
+
+!* phi3 and psi3 terms
+!
+  CALL LES_MEAN_MPROC ( XLES_SUBGRID_PHI3(:,NLES_CURRENT_TCOUNT,IMASK), &
+                          IAVG_PTS(:), IUND_PTS(:)                    )
+
+  IF (LUSERV) THEN
+    CALL LES_MEAN_MPROC ( XLES_SUBGRID_PSI3(:,NLES_CURRENT_TCOUNT,IMASK), &
+                            IAVG_PTS(:), IUND_PTS(:)                    )
+  END IF 
+!
+!* subgrid mixing length
+!
+  CALL LES_MEAN_MPROC ( XLES_SUBGRID_LMix(:,NLES_CURRENT_TCOUNT,IMASK), &
+                          IAVG_PTS(:), IUND_PTS(:)                      )
+!
+!* subgrid dissipative length
+!
+  CALL LES_MEAN_MPROC ( XLES_SUBGRID_LDiss(:,NLES_CURRENT_TCOUNT,IMASK), &
+                          IAVG_PTS(:), IUND_PTS(:)                       )
+!
+!* eddy diffusivities
+!
+  CALL LES_MEAN_MPROC ( XLES_SUBGRID_Km(:,NLES_CURRENT_TCOUNT,IMASK), &
+                          IAVG_PTS(:), IUND_PTS(:)                    )
+
+  CALL LES_MEAN_MPROC ( XLES_SUBGRID_Kh(:,NLES_CURRENT_TCOUNT,IMASK), &
+                          IAVG_PTS(:), IUND_PTS(:)                    )
+  
+END IF
+!
+! computation of KHT and KHR depending on LLES
+  IF (LUSERC) THEN 
+   IF (LLES_RESOLVED) THEN 
+    XLES_MEAN_KHt(:,NLES_CURRENT_TCOUNT,IMASK)=0.       
+    WHERE(XLES_MEAN_DTHLDZ(:,NLES_CURRENT_TCOUNT,IMASK)/=0)              &
+          XLES_MEAN_KHt(:,NLES_CURRENT_TCOUNT,IMASK)=-1.                 &
+                      *XLES_RESOLVED_WThl (:,NLES_CURRENT_TCOUNT,IMASK)/ &
+                       XLES_MEAN_DTHLDZ(:,NLES_CURRENT_TCOUNT,IMASK)
+    XLES_MEAN_KHr(:,NLES_CURRENT_TCOUNT,IMASK)=0.                   
+    WHERE(XLES_MEAN_DRtDZ(:,NLES_CURRENT_TCOUNT,IMASK)/=0)               &
+          XLES_MEAN_KHr(:,NLES_CURRENT_TCOUNT,IMASK)=-1.*                &
+                        XLES_RESOLVED_WRt (:,NLES_CURRENT_TCOUNT,IMASK)/ &
+                       XLES_MEAN_DRtDZ(:,NLES_CURRENT_TCOUNT,IMASK)
+   END IF                    
+   IF (LLES_SUBGRID) THEN 
+    XLES_MEAN_KHt(:,NLES_CURRENT_TCOUNT,IMASK)=0.       
+    WHERE(XLES_MEAN_DTHLDZ(:,NLES_CURRENT_TCOUNT,IMASK)/=0)              & 
+          XLES_MEAN_KHt(:,NLES_CURRENT_TCOUNT,IMASK)=-1.                 &
+                      *XLES_SUBGRID_WThl (:,NLES_CURRENT_TCOUNT,IMASK) /  &
+                       XLES_MEAN_DTHLDZ(:,NLES_CURRENT_TCOUNT,IMASK)
+    XLES_MEAN_KHr(:,NLES_CURRENT_TCOUNT,IMASK)=0.                   
+    WHERE(XLES_MEAN_DRtDZ(:,NLES_CURRENT_TCOUNT,IMASK)/=0)               &
+          XLES_MEAN_KHr(:,NLES_CURRENT_TCOUNT,IMASK)=-1.*                &
+                     XLES_SUBGRID_WRt (:,NLES_CURRENT_TCOUNT,IMASK) / &
+                       XLES_MEAN_DRtDZ(:,NLES_CURRENT_TCOUNT,IMASK)
+   END IF
+   IF (LLES_RESOLVED .AND. LLES_SUBGRID) THEN 
+    XLES_MEAN_KHt(:,NLES_CURRENT_TCOUNT,IMASK)=0.       
+    WHERE(XLES_MEAN_DTHLDZ(:,NLES_CURRENT_TCOUNT,IMASK)/=0)              &
+          XLES_MEAN_KHt(:,NLES_CURRENT_TCOUNT,IMASK)=-1.                 &
+                      *(XLES_RESOLVED_WThl (:,NLES_CURRENT_TCOUNT,IMASK)+ &
+                        XLES_SUBGRID_WThl (:,NLES_CURRENT_TCOUNT,IMASK))/ &
+                       XLES_MEAN_DTHLDZ(:,NLES_CURRENT_TCOUNT,IMASK)
+    XLES_MEAN_KHr(:,NLES_CURRENT_TCOUNT,IMASK)=0.                   
+    WHERE(XLES_MEAN_DRtDZ(:,NLES_CURRENT_TCOUNT,IMASK)/=0)               &
+          XLES_MEAN_KHr(:,NLES_CURRENT_TCOUNT,IMASK)=-1.*                &
+                        (XLES_RESOLVED_WRt (:,NLES_CURRENT_TCOUNT,IMASK)+ &
+                     XLES_SUBGRID_WRt (:,NLES_CURRENT_TCOUNT,IMASK)) / &
+                       XLES_MEAN_DRtDZ(:,NLES_CURRENT_TCOUNT,IMASK)
+   END IF
+  END IF
+!-------------------------------------------------------------------------------
+!
+!       1.7  Interaction of subgrid and resolved quantities
+!            ----------------------------------------------
+!
+!* WARNING: these terms also contain the term due to the mean flow.
+!           this mean flow contribution will be removed from them
+!           when treated in write_les_budgetn.f90
+!
+!
+!* subgrid turbulent kinetic energy fluxes
+!
+IF (LLES_RESOLVED) THEN
+  CALL LES_FLUX_ll ( XU_ANOM, ZTKE_LES,                                 &
+                     OMASK,                                             &
+                     XLES_RES_U_SBG_Tke(:,NLES_CURRENT_TCOUNT,IMASK)    )
+!
+  CALL LES_FLUX_ll ( XV_ANOM, ZTKE_LES,                                 &
+                     OMASK,                                             &
+                     XLES_RES_V_SBG_Tke(:,NLES_CURRENT_TCOUNT,IMASK)    )
+!
+  CALL LES_FLUX_ll ( XW_ANOM, ZTKE_LES,                                 &
+                     OMASK,                                             &
+                     XLES_RES_W_SBG_Tke(:,NLES_CURRENT_TCOUNT,IMASK)    )
+END IF
+!
+!* WARNING: these terms also contain the term due to the mean flow.
+!           this mean flow contribution will be removed from them
+!           when treated in write_les_budgetn.f90
+!
+!* production terms for subgrid quantities
+!
+IF (LLES_RESOLVED .AND. LLES_SUBGRID) THEN
+  CALL LES_MEAN_MPROC ( XLES_RES_ddxa_U_SBG_UaU(:,NLES_CURRENT_TCOUNT,IMASK), &
+                        IAVG_PTS(:), IUND_PTS(:)                              )
+
+  CALL LES_MEAN_MPROC ( XLES_RES_ddxa_V_SBG_UaV(:,NLES_CURRENT_TCOUNT,IMASK), &
+                        IAVG_PTS(:), IUND_PTS(:)                              )
+
+  CALL LES_MEAN_MPROC ( XLES_RES_ddxa_W_SBG_UaW(:,NLES_CURRENT_TCOUNT,IMASK), &
+                        IAVG_PTS(:), IUND_PTS(:)                              )
+
+  CALL LES_MEAN_MPROC ( XLES_RES_ddxa_W_SBG_UaThl(:,NLES_CURRENT_TCOUNT,IMASK), &
+                        IAVG_PTS(:), IUND_PTS(:)                                )
+
+  CALL LES_MEAN_MPROC ( XLES_RES_ddxa_Thl_SBG_UaW(:,NLES_CURRENT_TCOUNT,IMASK), &
+                        IAVG_PTS(:), IUND_PTS(:)                                )
+
+  CALL LES_MEAN_MPROC ( XLES_RES_ddz_Thl_SBG_W2  (:,NLES_CURRENT_TCOUNT,IMASK), &
+                        IAVG_PTS(:), IUND_PTS(:)                                )
+
+  CALL LES_MEAN_MPROC ( XLES_RES_ddxa_Thl_SBG_UaThl(:,NLES_CURRENT_TCOUNT,IMASK), &
+                        IAVG_PTS(:), IUND_PTS(:)                                  )
+
+  IF (LUSERV) THEN
+    CALL LES_MEAN_MPROC ( XLES_RES_ddxa_W_SBG_UaRt(:,NLES_CURRENT_TCOUNT,IMASK), &
+                          IAVG_PTS(:), IUND_PTS(:)                               )
+
+    CALL LES_MEAN_MPROC ( XLES_RES_ddxa_Rt_SBG_UaW(:,NLES_CURRENT_TCOUNT,IMASK), &
+                          IAVG_PTS(:), IUND_PTS(:)                               )
+
+    CALL LES_MEAN_MPROC ( XLES_RES_ddz_Rt_SBG_W2  (:,NLES_CURRENT_TCOUNT,IMASK), &
+                          IAVG_PTS(:), IUND_PTS(:)                               )
+
+    CALL LES_MEAN_MPROC ( XLES_RES_ddxa_Thl_SBG_UaRt(:,NLES_CURRENT_TCOUNT,IMASK), &
+                          IAVG_PTS(:), IUND_PTS(:)                                 )
+
+    CALL LES_MEAN_MPROC ( XLES_RES_ddxa_Rt_SBG_UaThl(:,NLES_CURRENT_TCOUNT,IMASK), &
+                          IAVG_PTS(:), IUND_PTS(:)                                 )
+
+    CALL LES_MEAN_MPROC ( XLES_RES_ddxa_Rt_SBG_UaRt(:,NLES_CURRENT_TCOUNT,IMASK), &
+                          IAVG_PTS(:), IUND_PTS(:)                                )
+
+  END IF
+!
+!* WARNING: these terms also contain the term due to the mean flow.
+!           this mean flow contribution will be removed from them
+!           when treated in write_les_budgetn.f90
+!
+!* turbulent transport and advection terms for subgrid quantities
+!
+  CALL LES_MEAN_MPROC ( XLES_RES_W_SBG_WThl(:,NLES_CURRENT_TCOUNT,IMASK), &
+                        IAVG_PTS(:), IUND_PTS(:)                          )
+
+  CALL LES_MEAN_MPROC ( XLES_RES_W_SBG_Thl2(:,NLES_CURRENT_TCOUNT,IMASK), &
+                        IAVG_PTS(:), IUND_PTS(:)                          )
+
+  IF (LUSERV) THEN
+    CALL LES_MEAN_MPROC ( XLES_RES_W_SBG_WRt(:,NLES_CURRENT_TCOUNT,IMASK), &
+                          IAVG_PTS(:), IUND_PTS(:)                         )
+
+    CALL LES_MEAN_MPROC ( XLES_RES_W_SBG_Rt2(:,NLES_CURRENT_TCOUNT,IMASK), &
+                          IAVG_PTS(:), IUND_PTS(:)                         )
+
+    CALL LES_MEAN_MPROC ( XLES_RES_W_SBG_ThlRt(:,NLES_CURRENT_TCOUNT,IMASK), &
+                          IAVG_PTS(:), IUND_PTS(:)                           )
+
+  END IF
+
+  DO JSV=1,NSV
+    CALL LES_MEAN_MPROC ( XLES_RES_W_SBG_WSv(:,NLES_CURRENT_TCOUNT,IMASK,JSV), &
+                          IAVG_PTS(:), IUND_PTS(:)                             )
+
+    CALL LES_MEAN_MPROC ( XLES_RES_W_SBG_Sv2(:,NLES_CURRENT_TCOUNT,IMASK,JSV), &
+                          IAVG_PTS(:), IUND_PTS(:)                             )
+  END DO
+END IF
+!
+!-------------------------------------------------------------------------------
+!
+!       2.   The following is for cartesian mask only
+!            ----------------------------------------
+!
+IF (IMASK>1) RETURN
+!
+!-------------------------------------------------------------------------------
+!
+!       3.   Updraft diagnostics
+!            -------------------
+!
+IF (LLES_UPDRAFT) THEN
+!
+  DO JK=1,NLES_K
+    GUPDRAFT_MASK(:,:,JK) = (XW_ANOM(:,:,JK) > 0.) .AND. LLES_CURRENT_CART_MASK(:,:,JK)
+  END DO
+!
+!
+!       3.1  Updraft fraction
+!            ----------------
+!
+  ZUPDRAFT(:,:,:) = 0.
+  WHERE (GUPDRAFT_MASK(:,:,:))
+    ZUPDRAFT(:,:,:) = 1.
+  END WHERE
+!
+  CALL LES_MEAN_ll ( ZUPDRAFT, OMASK,                        &
+                     XLES_UPDRAFT(:,NLES_CURRENT_TCOUNT)     )
+!
+!
+!       3.2  Updraft mean quantities
+!            -----------------------
+!
+!* vertical wind velocity
+!
+  CALL LES_MEAN_ll ( ZW_LES, GUPDRAFT_MASK,                    &
+                     XLES_UPDRAFT_W(:,NLES_CURRENT_TCOUNT)     )
+!
+!* potential temperature
+!
+  CALL LES_MEAN_ll ( ZTH_LES, GUPDRAFT_MASK,                   &
+                     XLES_UPDRAFT_Th(:,NLES_CURRENT_TCOUNT)    )
+!
+!* liquid potential temperature
+!
+  IF (LUSERC) &
+  CALL LES_MEAN_ll ( ZTHL_LES, GUPDRAFT_MASK,                   &
+                     XLES_UPDRAFT_Thl(:,NLES_CURRENT_TCOUNT)    )
+!
+!* virtual potential temperature
+!
+  IF (LUSERV) &
+  CALL LES_MEAN_ll ( ZTHV_LES, GUPDRAFT_MASK,                   &
+                     XLES_UPDRAFT_Thv(:,NLES_CURRENT_TCOUNT)    )
+!
+!* vapor mixing ratio
+!
+  IF (LUSERV) &
+  CALL LES_MEAN_ll ( ZRV_LES, GUPDRAFT_MASK,                    &
+                     XLES_UPDRAFT_Rv(:,NLES_CURRENT_TCOUNT)     )
+!
+!* cloud water mixing ratio
+!
+  IF (LUSERC) &
+  CALL LES_MEAN_ll ( ZRC_LES, GUPDRAFT_MASK,                    &
+                     XLES_UPDRAFT_Rc(:,NLES_CURRENT_TCOUNT)     )
+!
+!* rain mixing ratio
+!
+  IF (LUSERR) &
+  CALL LES_MEAN_ll ( ZRR_LES, GUPDRAFT_MASK,                    &
+                     XLES_UPDRAFT_Rr(:,NLES_CURRENT_TCOUNT)     )
+!
+!* cloud ice mixing ratio
+!
+  IF (LUSERI) &
+  CALL LES_MEAN_ll ( ZRI_LES, GUPDRAFT_MASK,                    &
+                     XLES_UPDRAFT_Ri(:,NLES_CURRENT_TCOUNT)     )
+!
+!* snow mixing ratio
+!
+  IF (LUSERS) &
+  CALL LES_MEAN_ll ( ZRS_LES, GUPDRAFT_MASK,                    &
+                     XLES_UPDRAFT_Rs(:,NLES_CURRENT_TCOUNT)     )
+!
+!* graupel mixing ratio
+!
+  IF (LUSERG) &
+  CALL LES_MEAN_ll ( ZRG_LES, GUPDRAFT_MASK,                    &
+                     XLES_UPDRAFT_Rg(:,NLES_CURRENT_TCOUNT)     )
+!
+!* hail mixing ratio
+!
+  IF (LUSERH) &
+  CALL LES_MEAN_ll ( ZRG_LES, GUPDRAFT_MASK,                    &
+                     XLES_UPDRAFT_Rh(:,NLES_CURRENT_TCOUNT)     )
+!
+!* scalar variables
+!
+  DO JSV=1,NSV
+    CALL LES_MEAN_ll ( ZSV_LES(:,:,:,JSV), GUPDRAFT_MASK,             &
+                       XLES_UPDRAFT_Sv(:,NLES_CURRENT_TCOUNT,JSV)     )
+  END DO
+!
+!* subgrid turbulent kinetic energy
+!
+  CALL LES_MEAN_ll ( ZTKE_LES, GUPDRAFT_MASK,                    &
+                     XLES_UPDRAFT_Tke(:,NLES_CURRENT_TCOUNT)     )
+!
+!
+!       3.3  Updraft resolved quantities
+!            ---------------------------
+!
+!
+!* resolved turbulent kinetic energy
+!
+  CALL LES_FLUX_ll ( XU_ANOM, XU_ANOM,                           &
+                     GUPDRAFT_MASK,                              &
+                     ZLES_UPDRAFT_U2(:)                          )
+
+  CALL LES_FLUX_ll ( XV_ANOM, XV_ANOM,                           &
+                     GUPDRAFT_MASK,                              &
+                     ZLES_UPDRAFT_V2(:)                          )
+
+  CALL LES_FLUX_ll ( XW_ANOM, XW_ANOM,                           &
+                     GUPDRAFT_MASK,                              &
+                     ZLES_UPDRAFT_W2(:)                          )
+
+  XLES_UPDRAFT_Ke(:,NLES_CURRENT_TCOUNT)  = 0.5 * (  ZLES_UPDRAFT_U2(:) &
+                                                   + ZLES_UPDRAFT_V2(:) &
+                                                   + ZLES_UPDRAFT_W2(:) )
+!
+!* vertical potential temperature flux
+!
+  CALL LES_FLUX_ll ( XW_ANOM, ZTH_ANOM,                          &
+                     GUPDRAFT_MASK,                              &
+                     XLES_UPDRAFT_WTh(:,NLES_CURRENT_TCOUNT)     )
+!
+!* vertical liquid potential temperature flux
+!
+  IF (LUSERC) &
+  CALL LES_FLUX_ll ( XW_ANOM, XTHL_ANOM,                          &
+                     GUPDRAFT_MASK,                               &
+                     XLES_UPDRAFT_WThl(:,NLES_CURRENT_TCOUNT)     )
+!
+!* vertical virtual potential temperature flux
+!
+  IF (LUSERV) &
+  CALL LES_FLUX_ll ( XW_ANOM, ZTHV_ANOM,                          &
+                     GUPDRAFT_MASK,                               &
+                     XLES_UPDRAFT_WThv(:,NLES_CURRENT_TCOUNT)     )
+!
+!* potential temperature variance
+!
+  CALL LES_FLUX_ll ( ZTH_ANOM, ZTH_ANOM,                          &
+                     GUPDRAFT_MASK,                               &
+                     XLES_UPDRAFT_Th2(:,NLES_CURRENT_TCOUNT)      )
+!
+!* liquid potential temperature variance
+!
+  IF (LUSERC) &
+  CALL LES_FLUX_ll ( XTHL_ANOM, XTHL_ANOM,                         &
+                     GUPDRAFT_MASK,                                &
+                     XLES_UPDRAFT_Thl2(:,NLES_CURRENT_TCOUNT)      )
+!
+!* potential temperature - virtual potential temperature covariance
+!
+  IF (LUSERV) &
+  CALL LES_FLUX_ll ( ZTH_ANOM, ZTHV_ANOM,                          &
+                     GUPDRAFT_MASK,                                &
+                     XLES_UPDRAFT_ThThv (:,NLES_CURRENT_TCOUNT)    )
+!
+!* liquid potential temperature - virtual potential temperature covariance
+!
+  IF (LUSERC) &
+  CALL LES_FLUX_ll ( XTHL_ANOM, ZTHV_ANOM,                         &
+                     GUPDRAFT_MASK,                                &
+                     XLES_UPDRAFT_ThlThv(:,NLES_CURRENT_TCOUNT)    )
+!
+!* water vapor mixing ratio flux, variance and correlations
+!
+  IF (LUSERV) THEN
+    CALL LES_FLUX_ll ( XW_ANOM, ZRV_ANOM,                           &
+                       GUPDRAFT_MASK,                               &
+                       XLES_UPDRAFT_WRv(:,NLES_CURRENT_TCOUNT)      )
+    !
+    CALL LES_FLUX_ll ( ZRV_ANOM, ZRV_ANOM,                          &
+                       GUPDRAFT_MASK,                               &
+                       XLES_UPDRAFT_Rv2(:,NLES_CURRENT_TCOUNT)      )
+    !
+    CALL LES_FLUX_ll ( ZTH_ANOM, ZRV_ANOM,                          &
+                       GUPDRAFT_MASK,                               &
+                       XLES_UPDRAFT_ThRv (:,NLES_CURRENT_TCOUNT)    )
+    !
+    IF (LUSERC) &
+    CALL LES_FLUX_ll ( XTHL_ANOM, ZRV_ANOM,                         &
+                       GUPDRAFT_MASK,                               &
+                       XLES_UPDRAFT_ThlRv(:,NLES_CURRENT_TCOUNT)    )
+
+    CALL LES_FLUX_ll ( ZTHV_ANOM, ZRV_ANOM,                         &
+                       GUPDRAFT_MASK,                               &
+                       XLES_UPDRAFT_ThvRv(:,NLES_CURRENT_TCOUNT)    )
+  END IF
+!
+!* cloud water mixing ratio flux
+!
+  IF (LUSERC) THEN
+    CALL LES_FLUX_ll ( XW_ANOM, ZRC_ANOM,                           &
+                       GUPDRAFT_MASK,                               &
+                       XLES_UPDRAFT_WRc(:,NLES_CURRENT_TCOUNT)      )
+    !
+    CALL LES_FLUX_ll ( ZRC_ANOM, ZRC_ANOM,                          &
+                       GUPDRAFT_MASK,                               &
+                       XLES_UPDRAFT_Rc2(:,NLES_CURRENT_TCOUNT)      )
+    !
+    CALL LES_FLUX_ll ( ZTH_ANOM, ZRC_ANOM,                          &
+                       GUPDRAFT_MASK,                               &
+                       XLES_UPDRAFT_ThRc (:,NLES_CURRENT_TCOUNT)    )
+    !
+    CALL LES_FLUX_ll ( XTHL_ANOM, ZRC_ANOM,                         &
+                       GUPDRAFT_MASK,                               &
+                       XLES_UPDRAFT_ThlRc(:,NLES_CURRENT_TCOUNT)    )
+    !
+    CALL LES_FLUX_ll ( ZTHV_ANOM, ZRC_ANOM,                         &
+                       GUPDRAFT_MASK,                               &
+                       XLES_UPDRAFT_ThvRc(:,NLES_CURRENT_TCOUNT)    )
+  END IF
+!
+!* cloud ice mixing ratio flux
+!
+  IF (LUSERI) THEN
+    CALL LES_FLUX_ll ( XW_ANOM, ZRI_ANOM,                           &
+                       GUPDRAFT_MASK,                               &
+                       XLES_UPDRAFT_WRi(:,NLES_CURRENT_TCOUNT)      )
+    !
+    CALL LES_FLUX_ll ( ZRI_ANOM, ZRI_ANOM,                          &
+                       GUPDRAFT_MASK,                               &
+                       XLES_UPDRAFT_Ri2(:,NLES_CURRENT_TCOUNT)      )
+    !
+    CALL LES_FLUX_ll ( ZTH_ANOM, ZRI_ANOM,                          &
+                       GUPDRAFT_MASK,                               &
+                       XLES_UPDRAFT_ThRi (:,NLES_CURRENT_TCOUNT)    )
+    !
+    CALL LES_FLUX_ll ( XTHL_ANOM, ZRI_ANOM,                         &
+                       GUPDRAFT_MASK,                               &
+                       XLES_UPDRAFT_ThlRi(:,NLES_CURRENT_TCOUNT)    )
+    !
+    CALL LES_FLUX_ll ( ZTHV_ANOM, ZRI_ANOM,                         &
+                       GUPDRAFT_MASK,                               &
+                       XLES_UPDRAFT_ThvRi(:,NLES_CURRENT_TCOUNT)    )
+  END IF
+!
+!* scalar variables flux
+!
+  DO JSV=1,NSV
+    CALL LES_FLUX_ll ( XW_ANOM, XSV_ANOM(:,:,:,JSV),                    &
+                       GUPDRAFT_MASK,                                   &
+                       XLES_UPDRAFT_WSv(:,NLES_CURRENT_TCOUNT,JSV)      )
+    !
+    CALL LES_FLUX_ll ( XSV_ANOM(:,:,:,JSV), XSV_ANOM(:,:,:,JSV),        &
+                       GUPDRAFT_MASK,                                   &
+                       XLES_UPDRAFT_Sv2(:,NLES_CURRENT_TCOUNT,JSV)      )
+    !
+    CALL LES_FLUX_ll ( ZTH_ANOM, XSV_ANOM(:,:,:,JSV),                   &
+                       GUPDRAFT_MASK,                                   &
+                       XLES_UPDRAFT_ThSv(:,NLES_CURRENT_TCOUNT,JSV)     )
+    !
+    IF (LUSERC) &
+    CALL LES_FLUX_ll ( XTHL_ANOM, XSV_ANOM(:,:,:,JSV),                  &
+                       GUPDRAFT_MASK,                                   &
+                       XLES_UPDRAFT_ThlSv(:,NLES_CURRENT_TCOUNT,JSV)    )
+    !
+    IF (LUSERV) &
+    CALL LES_FLUX_ll ( ZTHV_ANOM, XSV_ANOM(:,:,:,JSV),                  &
+                       GUPDRAFT_MASK,                                   &
+                       XLES_UPDRAFT_ThvSv(:,NLES_CURRENT_TCOUNT,JSV)    )
+  END DO
+!
+END IF
+!
+!-------------------------------------------------------------------------------
+!
+!       4.   Downdraft diagnostics
+!            ---------------------
+!
+IF (LLES_DOWNDRAFT) THEN
+!
+  DO JK=1,NLES_K
+    GDOWNDRAFT_MASK(:,:,JK) = (XW_ANOM(:,:,JK) <= 0.) .AND. LLES_CURRENT_CART_MASK(:,:,JK)
+  END DO
+!
+!
+!       4.1  Downdraft fraction
+!            ------------------
+!
+  ZDOWNDRAFT(:,:,:) = 0.
+  WHERE (GDOWNDRAFT_MASK(:,:,:))
+    ZDOWNDRAFT(:,:,:) = 1.
+  END WHERE
+!
+  CALL LES_MEAN_ll ( ZDOWNDRAFT, OMASK,                        &
+                     XLES_DOWNDRAFT(:,NLES_CURRENT_TCOUNT)     )
+!
+!
+!       4.2  Downdraft mean quantities
+!            -------------------------
+!
+!* vertical wind velocity
+!
+  CALL LES_MEAN_ll ( ZW_LES, GDOWNDRAFT_MASK,                    &
+                     XLES_DOWNDRAFT_W(:,NLES_CURRENT_TCOUNT)     )
+!
+!* potential temperature
+!
+  CALL LES_MEAN_ll ( ZTH_LES, GDOWNDRAFT_MASK,                   &
+                     XLES_DOWNDRAFT_Th(:,NLES_CURRENT_TCOUNT)    )
+!
+!* liquid potential temperature
+!
+  IF (LUSERC) &
+  CALL LES_MEAN_ll ( ZTHL_LES, GDOWNDRAFT_MASK,                   &
+                     XLES_DOWNDRAFT_Thl(:,NLES_CURRENT_TCOUNT)    )
+!
+!* virtual potential temperature
+!
+  IF (LUSERV) &
+  CALL LES_MEAN_ll ( ZTHV_LES, GDOWNDRAFT_MASK,                   &
+                     XLES_DOWNDRAFT_Thv(:,NLES_CURRENT_TCOUNT)    )
+!
+!* vapor mixing ratio
+!
+  IF (LUSERV) &
+  CALL LES_MEAN_ll ( ZRV_LES, GDOWNDRAFT_MASK,                    &
+                     XLES_DOWNDRAFT_Rv(:,NLES_CURRENT_TCOUNT)     )
+!
+!* cloud water mixing ratio
+!
+  IF (LUSERC) &
+  CALL LES_MEAN_ll ( ZRC_LES, GDOWNDRAFT_MASK,                    &
+                     XLES_DOWNDRAFT_Rc(:,NLES_CURRENT_TCOUNT)     )
+!
+!* rain mixing ratio
+!
+  IF (LUSERR) &
+  CALL LES_MEAN_ll ( ZRR_LES, GDOWNDRAFT_MASK,                    &
+                     XLES_DOWNDRAFT_Rr(:,NLES_CURRENT_TCOUNT)     )
+!
+!* cloud ice mixing ratio
+!
+  IF (LUSERI) &
+  CALL LES_MEAN_ll ( ZRI_LES, GDOWNDRAFT_MASK,                    &
+                     XLES_DOWNDRAFT_Ri(:,NLES_CURRENT_TCOUNT)     )
+!
+!* snow mixing ratio
+!
+  IF (LUSERS) &
+  CALL LES_MEAN_ll ( ZRS_LES, GDOWNDRAFT_MASK,                    &
+                     XLES_DOWNDRAFT_Rs(:,NLES_CURRENT_TCOUNT)     )
+!
+!* graupel mixing ratio
+!
+  IF (LUSERG) &
+  CALL LES_MEAN_ll ( ZRG_LES, GDOWNDRAFT_MASK,                    &
+                     XLES_DOWNDRAFT_Rg(:,NLES_CURRENT_TCOUNT)     )
+!
+!* hail mixing ratio
+!
+  IF (LUSERH) &
+  CALL LES_MEAN_ll ( ZRG_LES, GDOWNDRAFT_MASK,                    &
+                     XLES_DOWNDRAFT_Rh(:,NLES_CURRENT_TCOUNT)     )
+!
+!* scalar variables
+!
+  DO JSV=1,NSV
+    CALL LES_MEAN_ll ( ZSV_LES(:,:,:,JSV), GDOWNDRAFT_MASK,            &
+                       XLES_DOWNDRAFT_Sv(:,NLES_CURRENT_TCOUNT,JSV)    )
+  END DO
+!
+!* subgrid turbulent kinetic energy
+!
+  CALL LES_MEAN_ll ( ZTKE_LES, GDOWNDRAFT_MASK,                    &
+                     XLES_DOWNDRAFT_Tke(:,NLES_CURRENT_TCOUNT)     )
+!
+!
+!       4.3  Downdraft resolved quantities
+!            -----------------------------
+!
+!* resolved turbulent kinetic energy
+!
+  CALL LES_FLUX_ll ( XU_ANOM, XU_ANOM,                             &
+                     GDOWNDRAFT_MASK,                              &
+                     ZLES_DOWNDRAFT_U2(:)                          )
+
+  CALL LES_FLUX_ll ( XV_ANOM, XV_ANOM,                             &
+                     GDOWNDRAFT_MASK,                              &
+                     ZLES_DOWNDRAFT_V2(:)                          )
+
+  CALL LES_FLUX_ll ( XW_ANOM, XW_ANOM,                             &
+                     GDOWNDRAFT_MASK,                              &
+                     ZLES_DOWNDRAFT_W2(:)                          )
+
+  XLES_DOWNDRAFT_Ke(:,NLES_CURRENT_TCOUNT)  = 0.5 * (  ZLES_DOWNDRAFT_U2(:) &
+                                                     + ZLES_DOWNDRAFT_V2(:) &
+                                                     + ZLES_DOWNDRAFT_W2(:) )
+!
+!* vertical potential temperature flux
+!
+  CALL LES_FLUX_ll ( XW_ANOM, ZTH_ANOM,                            &
+                     GDOWNDRAFT_MASK,                              &
+                     XLES_DOWNDRAFT_WTh(:,NLES_CURRENT_TCOUNT)     )
+!
+!* vertical liquid potential temperature flux
+!
+  IF (LUSERC) &
+  CALL LES_FLUX_ll ( XW_ANOM, XTHL_ANOM,                            &
+                     GDOWNDRAFT_MASK,                               &
+                     XLES_DOWNDRAFT_WThl(:,NLES_CURRENT_TCOUNT)     )
+!
+!* vertical virtual potential temperature flux
+!
+  IF (LUSERV) &
+  CALL LES_FLUX_ll ( XW_ANOM, ZTHV_ANOM,                            &
+                     GDOWNDRAFT_MASK,                               &
+                     XLES_DOWNDRAFT_WThv(:,NLES_CURRENT_TCOUNT)     )
+!
+!* potential temperature variance
+!
+  CALL LES_FLUX_ll ( ZTH_ANOM, ZTH_ANOM,                            &
+                     GDOWNDRAFT_MASK,                               &
+                     XLES_DOWNDRAFT_Th2(:,NLES_CURRENT_TCOUNT)      )
+!
+!* liquid potential temperature variance
+!
+  IF (LUSERC) &
+  CALL LES_FLUX_ll ( XTHL_ANOM, XTHL_ANOM,                           &
+                     GDOWNDRAFT_MASK,                                &
+                     XLES_DOWNDRAFT_Thl2(:,NLES_CURRENT_TCOUNT)      )
+!
+!* potential temperature - virtual potential temperature covariance
+!
+  IF (LUSERV) &
+  CALL LES_FLUX_ll ( ZTH_ANOM, ZTHV_ANOM,                            &
+                     GDOWNDRAFT_MASK,                                &
+                     XLES_DOWNDRAFT_ThThv (:,NLES_CURRENT_TCOUNT)    )
+!
+!* liquid potential temperature - virtual potential temperature covariance
+!
+  IF (LUSERC) &
+  CALL LES_FLUX_ll ( XTHL_ANOM, ZTHV_ANOM,                           &
+                     GDOWNDRAFT_MASK,                                &
+                     XLES_DOWNDRAFT_ThlThv(:,NLES_CURRENT_TCOUNT)    )
+!
+!
+!* water vapor mixing ratio flux, variance and correlations
+!
+  IF (LUSERV) THEN
+    CALL LES_FLUX_ll ( XW_ANOM, ZRV_ANOM,                             &
+                       GDOWNDRAFT_MASK,                               &
+                       XLES_DOWNDRAFT_WRv(:,NLES_CURRENT_TCOUNT)      )
+    !
+    CALL LES_FLUX_ll ( ZRV_ANOM, ZRV_ANOM,                            &
+                       GDOWNDRAFT_MASK,                               &
+                       XLES_DOWNDRAFT_Rv2(:,NLES_CURRENT_TCOUNT)      )
+    !
+    CALL LES_FLUX_ll ( ZTH_ANOM, ZRV_ANOM,                            &
+                       GDOWNDRAFT_MASK,                               &
+                       XLES_DOWNDRAFT_ThRv (:,NLES_CURRENT_TCOUNT)    )
+    !
+    CALL LES_FLUX_ll ( ZTHV_ANOM, ZRV_ANOM,                           &
+                       GDOWNDRAFT_MASK,                               &
+                       XLES_DOWNDRAFT_ThvRv(:,NLES_CURRENT_TCOUNT)    )
+    !
+    IF (LUSERC) &
+    CALL LES_FLUX_ll ( XTHL_ANOM, ZRV_ANOM,                           &
+                       GDOWNDRAFT_MASK,                               &
+                       XLES_DOWNDRAFT_ThlRv(:,NLES_CURRENT_TCOUNT)    )
+  END IF
+!
+!* cloud water mixing ratio flux
+!
+  IF (LUSERC) THEN
+    CALL LES_FLUX_ll ( XW_ANOM, ZRC_ANOM,                             &
+                       GDOWNDRAFT_MASK,                               &
+                       XLES_DOWNDRAFT_WRc(:,NLES_CURRENT_TCOUNT)      )
+    !
+    CALL LES_FLUX_ll ( ZRC_ANOM, ZRC_ANOM,                            &
+                       GDOWNDRAFT_MASK,                               &
+                       XLES_DOWNDRAFT_Rc2(:,NLES_CURRENT_TCOUNT)      )
+    !
+    CALL LES_FLUX_ll ( ZTH_ANOM, ZRC_ANOM,                            &
+                       GDOWNDRAFT_MASK,                               &
+                       XLES_DOWNDRAFT_ThRc (:,NLES_CURRENT_TCOUNT)    )
+    !
+    CALL LES_FLUX_ll ( ZTHV_ANOM, ZRC_ANOM,                           &
+                       GDOWNDRAFT_MASK,                               &
+                       XLES_DOWNDRAFT_ThvRc(:,NLES_CURRENT_TCOUNT)    )
+    !
+    CALL LES_FLUX_ll ( XTHL_ANOM, ZRC_ANOM,                           &
+                       GDOWNDRAFT_MASK,                               &
+                       XLES_DOWNDRAFT_ThlRc(:,NLES_CURRENT_TCOUNT)    )
+  END IF
+!
+!* cloud ice mixing ratio flux
+!
+  IF (LUSERI) THEN
+    CALL LES_FLUX_ll ( XW_ANOM, ZRI_ANOM,                             &
+                       GDOWNDRAFT_MASK,                               &
+                       XLES_DOWNDRAFT_WRi(:,NLES_CURRENT_TCOUNT)      )
+    !
+    CALL LES_FLUX_ll ( ZRI_ANOM, ZRI_ANOM,                            &
+                       GDOWNDRAFT_MASK,                               &
+                       XLES_DOWNDRAFT_Ri2(:,NLES_CURRENT_TCOUNT)      )
+    !
+    CALL LES_FLUX_ll ( ZTH_ANOM, ZRI_ANOM,                            &
+                       GDOWNDRAFT_MASK,                               &
+                       XLES_DOWNDRAFT_ThRi (:,NLES_CURRENT_TCOUNT)    )
+    !
+    CALL LES_FLUX_ll ( ZTHV_ANOM, ZRI_ANOM,                           &
+                       GDOWNDRAFT_MASK,                               &
+                       XLES_DOWNDRAFT_ThvRi(:,NLES_CURRENT_TCOUNT)    )
+    !
+    CALL LES_FLUX_ll ( XTHL_ANOM, ZRI_ANOM,                           &
+                       GDOWNDRAFT_MASK,                               &
+                       XLES_DOWNDRAFT_ThlRi(:,NLES_CURRENT_TCOUNT)    )
+  END IF
+!
+!* scalar variables flux
+!
+  DO JSV=1,NSV
+    CALL LES_FLUX_ll ( XW_ANOM, XSV_ANOM(:,:,:,JSV),                      &
+                       GDOWNDRAFT_MASK,                                   &
+                       XLES_DOWNDRAFT_WSv(:,NLES_CURRENT_TCOUNT,JSV)      )
+    !
+    CALL LES_FLUX_ll ( XSV_ANOM(:,:,:,JSV), XSV_ANOM(:,:,:,JSV),          &
+                       GDOWNDRAFT_MASK,                                   &
+                       XLES_DOWNDRAFT_Sv2(:,NLES_CURRENT_TCOUNT,JSV)      )
+    !
+    CALL LES_FLUX_ll ( ZTH_ANOM, XSV_ANOM(:,:,:,JSV),                     &
+                       GDOWNDRAFT_MASK,                                   &
+                       XLES_DOWNDRAFT_ThSv(:,NLES_CURRENT_TCOUNT,JSV)     )
+    !
+    IF (LUSERC) &
+    CALL LES_FLUX_ll ( XTHL_ANOM, XSV_ANOM(:,:,:,JSV),                    &
+                       GDOWNDRAFT_MASK,                                   &
+                       XLES_DOWNDRAFT_ThlSv(:,NLES_CURRENT_TCOUNT,JSV)    )
+    !
+    IF (LUSERV) &
+    CALL LES_FLUX_ll ( ZTHV_ANOM, XSV_ANOM(:,:,:,JSV),                    &
+                       GDOWNDRAFT_MASK,                                   &
+                       XLES_DOWNDRAFT_ThvSv(:,NLES_CURRENT_TCOUNT,JSV)    )
+  END DO
+!
+END IF
+!
+!-------------------------------------------------------------------------------
+!
+!       5.   surface or 2D variables (only for the cartesian mask)
+!            -----------------------
+!
+!* surface flux of temperature Qo
+!
+CALL LES_MEAN_MPROC ( XLES_Q0   (NLES_CURRENT_TCOUNT), IAVG_PTS(1), IUND_PTS(1) )
+!
+!* surface flux of water vapor Eo
+!
+CALL LES_MEAN_MPROC ( XLES_E0   (NLES_CURRENT_TCOUNT), IAVG_PTS(1), IUND_PTS(1) )
+!
+!* surface flux for scalar variables
+!
+DO JSV=1,NSV
+  CALL LES_MEAN_MPROC ( XLES_SV0  (NLES_CURRENT_TCOUNT,JSV), IAVG_PTS(1), IUND_PTS(1) )
+END DO
+!
+!* surface flux of U wind component
+!
+CALL LES_MEAN_MPROC ( XLES_UW0  (NLES_CURRENT_TCOUNT), IAVG_PTS(1), IUND_PTS(1) )
+!
+!* surface flux of V wind component
+!
+CALL LES_MEAN_MPROC ( XLES_VW0  (NLES_CURRENT_TCOUNT), IAVG_PTS(1), IUND_PTS(1) )
+!
+!* friction velocity u*
+!
+!* average of local u*
+!!CALL LES_MEAN_MPROC ( XLES_USTAR(NLES_CURRENT_TCOUNT), IAVG_PTS(1), IUND_PTS(1) )
+!* or true global u*
+XLES_USTAR(NLES_CURRENT_TCOUNT) = SQRT(SQRT(XLES_UW0(NLES_CURRENT_TCOUNT)**2  &
+                                           +XLES_VW0(NLES_CURRENT_TCOUNT)**2 ))
+!
+!* Boundary layer height
+!
+IF (CBL_HEIGHT_DEF=='WTV') THEN
+!
+!* level where temperature flux is minimum
+!
+ALLOCATE(ZWORK(SIZE(XLES_SUBGRID_WTHVMF(:,NLES_CURRENT_TCOUNT,IMASK),1)))
+ZWORK=XLES_SUBGRID_WTHVMF(:,NLES_CURRENT_TCOUNT,IMASK)
+WHERE(ZWORK==XUNDEF) ZWORK=0.
+
+  IF (LUSERC) THEN
+    IKMIN_FLUX = MINLOC(  XLES_RESOLVED_WThv(:,NLES_CURRENT_TCOUNT,1)  &
+                        + XLES_SUBGRID_WThl (:,NLES_CURRENT_TCOUNT,1)  &
+                        + ZWORK                                        & ! flux if EDKF   
+      + (XRV/XRD - 1.) *( XLES_SUBGRID_WRt  (:,NLES_CURRENT_TCOUNT,1)  &
+                         -XLES_SUBGRID_WRc  (:,NLES_CURRENT_TCOUNT,1)) )
+  ELSE IF (LUSERV) THEN
+    IKMIN_FLUX = MINLOC(  XLES_RESOLVED_WThv(:,NLES_CURRENT_TCOUNT,1) &
+                        + ZWORK                                       & ! flux if EDKF 
+                        + XLES_SUBGRID_WThl (:,NLES_CURRENT_TCOUNT,1) &
+      + (XRV/XRD - 1.) *  XLES_SUBGRID_WRt  (:,NLES_CURRENT_TCOUNT,1) )
+  ELSE
+    IKMIN_FLUX = MINLOC(  XLES_RESOLVED_WTh(:,NLES_CURRENT_TCOUNT,1) &
+                        + ZWORK                                      & ! flux if EDKF
+                        + XLES_SUBGRID_WThl(:,NLES_CURRENT_TCOUNT,1) )
+  END IF
+DEALLOCATE(ZWORK)
+!
+!* boundary layer height
+!
+  XLES_BL_HEIGHT(NLES_CURRENT_TCOUNT) = XLES_Z(IKMIN_FLUX(1)) - XLES_ZS
+!
+ELSE IF (CBL_HEIGHT_DEF=='DTH') THEN
+  IKMAX_TH=MAXLOC( ZLES_MEAN_DTHDZ(:)) 
+  XLES_BL_HEIGHT(NLES_CURRENT_TCOUNT) = XLES_Z(IKMAX_TH(1)) - XLES_ZS
+!  
+ELSE IF (CBL_HEIGHT_DEF=='KE ') THEN
+
+  XLES_BL_HEIGHT(NLES_CURRENT_TCOUNT) = XLES_Z(NLES_K) - XLES_ZS
+!
+!* total Turbulent Kinetic Energy
+!
+  ZKE_TOT(:) = 0.
+!
+  ZKE_TOT(:) = ZKE_TOT(:) + XLES_SUBGRID_TKE   (:,NLES_CURRENT_TCOUNT,1)
+!
+  IF (CTURBLEN/='BL89' .AND. CTURBLEN/='RM17' .AND. LLES_RESOLVED) &
+  ZKE_TOT(:) = ZKE_TOT(:) + XLES_RESOLVED_KE(:,NLES_CURRENT_TCOUNT,1)
+!
+  ZINT_KE_TOT = 0.
+!
+!* integration of total kinetic energy on boundary layer depth
+!
+  ZINT_KE_TOT = ZINT_KE_TOT +XLES_Z(1)*ZKE_TOT(1)
+  DO JK=1,NLES_K-1
+    ZINT_KE_TOT = ZINT_KE_TOT + (XLES_Z(JK+1)-XLES_Z(JK))                     &
+                              * 0.5 *( ZKE_TOT(JK+1) + ZKE_TOT(JK) )
+!
+!* test of total kinetic energy smaller than 5% of the averaged value below
+!
+    IF ( ZKE_TOT(JK+1) < 0.05 * ZINT_KE_TOT / (XLES_Z(JK+1)-XLES_Z(1)) ) THEN
+      XLES_BL_HEIGHT(NLES_CURRENT_TCOUNT) = XLES_Z(JK) - XLES_ZS
+      EXIT
+    END IF
+!
+  END DO
+!
+ELSE IF (CBL_HEIGHT_DEF=='TKE') THEN
+
+  XLES_BL_HEIGHT(NLES_CURRENT_TCOUNT) = XLES_Z(NLES_K) - XLES_ZS
+!
+!* subgrid Turbulent Kinetic Energy
+!
+  ZKE_TOT(:) = XLES_SUBGRID_TKE   (:,NLES_CURRENT_TCOUNT,1)
+!
+  ZINT_KE_TOT = 0.
+!
+!* integration of subgrid kinetic energy on boundary layer depth
+!
+  DO JK=1,NLES_K-1
+    ZINT_KE_TOT = ZINT_KE_TOT + (XLES_Z(JK+1)-XLES_Z(JK))                     &
+                              * 0.5 *( ZKE_TOT(JK+1) + ZKE_TOT(JK) )
+!
+!* test of subgrid kinetic energy smaller than 0.1% of the averaged value below
+!
+    IF ( ZKE_TOT(JK+1) < 0.001 * ZINT_KE_TOT / (XLES_Z(JK+1)-XLES_Z(1)) ) THEN
+      XLES_BL_HEIGHT(NLES_CURRENT_TCOUNT) = XLES_Z(JK) - XLES_ZS
+      EXIT
+    END IF
+  END DO
+ELSE IF (CBL_HEIGHT_DEF=='FRI') THEN
+  ZFRIC_LES = SQRT( ( XLES_SUBGRID_WU (:,NLES_CURRENT_TCOUNT,1)      &
+                     +XLES_RESOLVED_WU(:,NLES_CURRENT_TCOUNT,1))**2  &
+                   +( XLES_SUBGRID_WV (:,NLES_CURRENT_TCOUNT,1)      &
+                     +XLES_RESOLVED_WV(:,NLES_CURRENT_TCOUNT,1))**2 )
+  ZFRIC_SURF = XLES_USTAR(NLES_CURRENT_TCOUNT)**2
+  CALL BL_DEPTH_DIAG(YLDIMPHYEX,ZFRIC_SURF, XLES_ZS, &
+                     ZFRIC_LES,  XLES_Z,  &
+                     XFTOP_O_FSURF,XLES_BL_HEIGHT(NLES_CURRENT_TCOUNT))
+END IF
+!
+!
+!* integration of total kinetic energy on boundary layer depth
+!
+XLES_INT_TKE(NLES_CURRENT_TCOUNT)=ZINT_KE_TOT
+    !* integration of tke 
+    ZTKET_LES(:,:)  = 0.
+      DO JK=1,NLES_K-1
+      ZKE_LES(:,:,JK)=0.5*(XU_ANOM(:,:,JK)*XU_ANOM(:,:,JK)+&
+      XV_ANOM(:,:,JK)*XV_ANOM(:,:,JK)+XW_ANOM(:,:,JK)*XW_ANOM(:,:,JK))
+
+    ZTKET_LES(:,:) = ZTKET_LES(:,:) + (ZZZ_LES(:,:,JK+1)-ZZZ_LES(:,:,JK))      &
+                      * (ZTKE_LES(:,:,JK)+ZKE_LES(:,:,JK)) 
+      END DO
+  CALL LES_MEAN_ll ( ZTKET_LES, LLES_CURRENT_CART_MASK(:,:,1),               &
+                    XLES_INT_TKE(NLES_CURRENT_TCOUNT)     )    
+!
+!* convective velocity
+!
+XLES_WSTAR(NLES_CURRENT_TCOUNT) = 0.
+!
+IF (               XLES_Q0(NLES_CURRENT_TCOUNT)                  &
+    + (XRV/XRD-1.)*XLES_E0(NLES_CURRENT_TCOUNT) >0.) THEN
+  IF (LUSERV) THEN
+    XLES_WSTAR(NLES_CURRENT_TCOUNT) =                            &
+     ( XG / XLES_MEAN_Thv (1,NLES_CURRENT_TCOUNT,1)              &
+          * (                    XLES_Q0( NLES_CURRENT_TCOUNT )  &
+              + (XRV/XRD - 1.) * XLES_E0( NLES_CURRENT_TCOUNT )) &
+          * XLES_BL_HEIGHT(  NLES_CURRENT_TCOUNT  )              &
+     ) ** (1./3.)
+  ELSE
+    XLES_WSTAR(NLES_CURRENT_TCOUNT) =                            &
+     ( XG / XLES_MEAN_Th  (1,NLES_CURRENT_TCOUNT,1)              &
+          * (                    XLES_Q0( NLES_CURRENT_TCOUNT )  &
+              + (XRV/XRD - 1.) * XLES_E0( NLES_CURRENT_TCOUNT )) &
+          * XLES_BL_HEIGHT( NLES_CURRENT_TCOUNT  )               &
+     ) ** (1./3.)
+  END IF
+END IF
+!
+!* cloud base height
+ IF (LUSERC) THEN
+  ZINT_RHOKE =0.
+  JJ=1
+  DO JI=1,NLES_K
+  IF ((ZINT_RHOKE .EQ. 0) .AND.  &
+      (XLES_MEAN_RC(JI,NLES_CURRENT_TCOUNT,1) .GT. 1.E-6)) THEN
+     ZINT_RHOKE=1.
+     JJ=JI 
+   END IF
+  END DO
+  XLES_ZCB(NLES_CURRENT_TCOUNT)= XLES_Z(JJ)-XLES_ZS
+ ENDIF
+!
+!* height of max of cf
+ IF (LUSERC) THEN
+  IKMAX_CF= MAXLOC(  XLES_MEAN_INDCf(:,NLES_CURRENT_TCOUNT,1))
+  XLES_ZMAXCF(NLES_CURRENT_TCOUNT) = XLES_Z(IKMAX_CF(1)) - XLES_ZS
+  IKMAX_CF= MAXLOC(  XLES_MEAN_INDCf2(:,NLES_CURRENT_TCOUNT,1))
+  XLES_ZMAXCF2(NLES_CURRENT_TCOUNT) = XLES_Z(IKMAX_CF(1)) - XLES_ZS
+ ENDIF
+!
+!* Monin-Obukhov length
+!
+XLES_MO_LENGTH(NLES_CURRENT_TCOUNT) = 0.
+!
+IF (LUSERV) THEN
+  IF ( XLES_Q0(NLES_CURRENT_TCOUNT)+(XRV/XRD-1.)*XLES_E0(NLES_CURRENT_TCOUNT) /=0. )&
+  XLES_MO_LENGTH(NLES_CURRENT_TCOUNT) = (- (XLES_USTAR(NLES_CURRENT_TCOUNT))**3)  &
+                    / (XKARMAN*(  XLES_Q0(NLES_CURRENT_TCOUNT)                    &
+                                +(XRV/XRD-1.)*XLES_E0(NLES_CURRENT_TCOUNT))       &
+                              *XG/XLES_MEAN_Thv(1,NLES_CURRENT_TCOUNT,1) )
+ELSE
+   IF ( XLES_Q0(NLES_CURRENT_TCOUNT) /=0. )                                       &
+   XLES_MO_LENGTH(NLES_CURRENT_TCOUNT) = (- (XLES_USTAR(NLES_CURRENT_TCOUNT))**3) &
+                    / (XKARMAN*XLES_Q0(NLES_CURRENT_TCOUNT)                       &
+                              *XG/XLES_MEAN_Th(1,NLES_CURRENT_TCOUNT,1) )
+END IF
+!
+!-------------------------------------------------------------------------------
+!
+!       6.   correlations along x and y axes
+!            -------------------------------
+!
+!*  u * u
+!
+DO JK=1,NSPECTRA_K
+  CALL LES_HOR_CORR( ZU_SPEC(:,:,JK), ZU_SPEC(:,:,JK),          &
+                     CLES_LBCX , CLES_LBCY,                     &
+                     XCORRi_UU(:,JK,NLES_CURRENT_TCOUNT),       &
+                     XCORRj_UU(:,JK,NLES_CURRENT_TCOUNT)        )
+END DO
+!
+!*  v * v
+!
+DO JK=1,NSPECTRA_K
+  CALL LES_HOR_CORR( ZV_SPEC(:,:,JK), ZV_SPEC(:,:,JK),          &
+                     CLES_LBCX , CLES_LBCY,                     &
+                     XCORRi_VV(:,JK,NLES_CURRENT_TCOUNT),       &
+                     XCORRj_VV(:,JK,NLES_CURRENT_TCOUNT)        )
+END DO
+!
+!*  u * v
+!
+DO JK=1,NSPECTRA_K
+  CALL LES_HOR_CORR( ZU_SPEC(:,:,JK), ZV_SPEC(:,:,JK),          &
+                     CLES_LBCX , CLES_LBCY,                     &
+                     XCORRi_UV(:,JK,NLES_CURRENT_TCOUNT),       &
+                     XCORRj_UV(:,JK,NLES_CURRENT_TCOUNT)        )
+END DO
+!
+!*  w * u
+!
+DO JK=1,NSPECTRA_K
+  CALL LES_HOR_CORR( ZW_SPEC(:,:,JK), ZU_SPEC(:,:,JK),          &
+                     CLES_LBCX , CLES_LBCY,                     &
+                     XCORRi_WU(:,JK,NLES_CURRENT_TCOUNT),       &
+                     XCORRj_WU(:,JK,NLES_CURRENT_TCOUNT)        )
+END DO
+!
+!*  w * v
+!
+DO JK=1,NSPECTRA_K
+  CALL LES_HOR_CORR( ZW_SPEC(:,:,JK), ZV_SPEC(:,:,JK),          &
+                     CLES_LBCX , CLES_LBCY,                     &
+                     XCORRi_WV(:,JK,NLES_CURRENT_TCOUNT),       &
+                     XCORRj_WV(:,JK,NLES_CURRENT_TCOUNT)        )
+END DO
+!
+!*  w * w
+!
+DO JK=1,NSPECTRA_K
+  CALL LES_HOR_CORR( ZW_SPEC(:,:,JK), ZW_SPEC(:,:,JK),          &
+                     CLES_LBCX , CLES_LBCY,                     &
+                     XCORRi_WW(:,JK,NLES_CURRENT_TCOUNT),       &
+                     XCORRj_WW(:,JK,NLES_CURRENT_TCOUNT)        )
+END DO
+!
+!*  w * th
+!
+DO JK=1,NSPECTRA_K
+  CALL LES_HOR_CORR( ZW_SPEC(:,:,JK), ZTH_SPEC(:,:,JK),         &
+                     CLES_LBCX , CLES_LBCY,                     &
+                     XCORRi_WTh(:,JK,NLES_CURRENT_TCOUNT),      &
+                     XCORRj_WTh(:,JK,NLES_CURRENT_TCOUNT)       )
+END DO
+!
+!*  w * thl
+!
+DO JK=1,NSPECTRA_K
+  IF (LUSERC) &
+  CALL LES_HOR_CORR( ZW_SPEC(:,:,JK), ZTHL_SPEC(:,:,JK),         &
+                     CLES_LBCX , CLES_LBCY,                      &
+                     XCORRi_WThl(:,JK,NLES_CURRENT_TCOUNT),      &
+                     XCORRj_WThl(:,JK,NLES_CURRENT_TCOUNT)       )
+END DO
+!
+!*  th * th
+!
+DO JK=1,NSPECTRA_K
+  CALL LES_HOR_CORR( ZTH_SPEC(:,:,JK), ZTH_SPEC(:,:,JK),          &
+                     CLES_LBCX , CLES_LBCY,                       &
+                     XCORRi_ThTh(:,JK,NLES_CURRENT_TCOUNT),       &
+                     XCORRj_ThTh(:,JK,NLES_CURRENT_TCOUNT)        )
+END DO
+!
+!*  thl * thl
+!
+DO JK=1,NSPECTRA_K
+  IF (LUSERC) &
+  CALL LES_HOR_CORR( ZTHL_SPEC(:,:,JK), ZTHL_SPEC(:,:,JK),        &
+                     CLES_LBCX , CLES_LBCY,                       &
+                     XCORRi_ThlThl(:,JK,NLES_CURRENT_TCOUNT),     &
+                     XCORRj_ThlThl(:,JK,NLES_CURRENT_TCOUNT)      )
+END DO
+!
+!* correlations with water vapor
+!
+IF (LUSERV) THEN
+  DO JK=1,NSPECTRA_K
+    CALL LES_HOR_CORR( ZW_SPEC(:,:,JK), ZRV_SPEC(:,:,JK),        &
+                       CLES_LBCX , CLES_LBCY,                    &
+                       XCORRi_WRv(:,JK,NLES_CURRENT_TCOUNT),     &
+                       XCORRj_WRv(:,JK,NLES_CURRENT_TCOUNT)      )
+  END DO
+  !
+  DO JK=1,NSPECTRA_K
+    CALL LES_HOR_CORR( ZTH_SPEC(:,:,JK), ZRV_SPEC(:,:,JK),       &
+                       CLES_LBCX , CLES_LBCY,                    &
+                       XCORRi_ThRv(:,JK,NLES_CURRENT_TCOUNT),    &
+                       XCORRj_ThRv(:,JK,NLES_CURRENT_TCOUNT)     )
+  END DO
+  !
+  DO JK=1,NSPECTRA_K
+    IF (LUSERC) &
+    CALL LES_HOR_CORR( ZTHL_SPEC(:,:,JK), ZRV_SPEC(:,:,JK),      &
+                       CLES_LBCX , CLES_LBCY,                    &
+                       XCORRi_ThlRv(:,JK,NLES_CURRENT_TCOUNT),   &
+                       XCORRj_ThlRv(:,JK,NLES_CURRENT_TCOUNT)    )
+  END DO
+  !
+  DO JK=1,NSPECTRA_K
+    CALL LES_HOR_CORR( ZRV_SPEC(:,:,JK), ZRV_SPEC(:,:,JK),       &
+                       CLES_LBCX , CLES_LBCY,                    &
+                       XCORRi_RvRv(:,JK,NLES_CURRENT_TCOUNT),    &
+                       XCORRj_RvRv(:,JK,NLES_CURRENT_TCOUNT)     )
+  END DO
+END IF
+!
+!
+!* correlations with cloud water
+!
+IF (LUSERC) THEN
+  DO JK=1,NSPECTRA_K
+    CALL LES_HOR_CORR( ZW_SPEC(:,:,JK), ZRC_SPEC(:,:,JK),        &
+                       CLES_LBCX , CLES_LBCY,                    &
+                       XCORRi_WRc(:,JK,NLES_CURRENT_TCOUNT),     &
+                       XCORRj_WRc(:,JK,NLES_CURRENT_TCOUNT)      )
+  END DO
+  !
+  DO JK=1,NSPECTRA_K
+    CALL LES_HOR_CORR( ZTH_SPEC(:,:,JK), ZRC_SPEC(:,:,JK),       &
+                       CLES_LBCX , CLES_LBCY,                    &
+                       XCORRi_ThRc(:,JK,NLES_CURRENT_TCOUNT),    &
+                       XCORRj_ThRc(:,JK,NLES_CURRENT_TCOUNT)     )
+  END DO
+  !
+  DO JK=1,NSPECTRA_K
+    CALL LES_HOR_CORR( ZTHL_SPEC(:,:,JK), ZRC_SPEC(:,:,JK),      &
+                       CLES_LBCX , CLES_LBCY,                    &
+                       XCORRi_ThlRc(:,JK,NLES_CURRENT_TCOUNT),   &
+                       XCORRj_ThlRc(:,JK,NLES_CURRENT_TCOUNT)    )
+  END DO
+  !
+  DO JK=1,NSPECTRA_K
+    CALL LES_HOR_CORR( ZRC_SPEC(:,:,JK), ZRC_SPEC(:,:,JK),       &
+                       CLES_LBCX , CLES_LBCY,                    &
+                       XCORRi_RcRc(:,JK,NLES_CURRENT_TCOUNT),    &
+                       XCORRj_RcRc(:,JK,NLES_CURRENT_TCOUNT)     )
+  END DO
+END IF
+!
+!* correlations with cloud ice
+!
+IF (LUSERI) THEN
+  DO JK=1,NSPECTRA_K
+    CALL LES_HOR_CORR( ZW_SPEC(:,:,JK), ZRI_SPEC(:,:,JK),        &
+                       CLES_LBCX , CLES_LBCY,                    &
+                       XCORRi_WRi(:,JK,NLES_CURRENT_TCOUNT),     &
+                       XCORRj_WRi(:,JK,NLES_CURRENT_TCOUNT)      )
+  END DO
+  !
+  DO JK=1,NSPECTRA_K
+    CALL LES_HOR_CORR( ZTH_SPEC(:,:,JK), ZRI_SPEC(:,:,JK),       &
+                       CLES_LBCX , CLES_LBCY,                    &
+                       XCORRi_ThRi(:,JK,NLES_CURRENT_TCOUNT),    &
+                       XCORRj_ThRi(:,JK,NLES_CURRENT_TCOUNT)     )
+  END DO
+  !
+  DO JK=1,NSPECTRA_K
+    CALL LES_HOR_CORR( ZTHL_SPEC(:,:,JK), ZRI_SPEC(:,:,JK),      &
+                       CLES_LBCX , CLES_LBCY,                    &
+                       XCORRi_ThlRi(:,JK,NLES_CURRENT_TCOUNT),   &
+                       XCORRj_ThlRi(:,JK,NLES_CURRENT_TCOUNT)    )
+  END DO
+  !
+  DO JK=1,NSPECTRA_K
+    CALL LES_HOR_CORR( ZRI_SPEC(:,:,JK), ZRI_SPEC(:,:,JK),       &
+                       CLES_LBCX , CLES_LBCY,                    &
+                       XCORRi_RiRi(:,JK,NLES_CURRENT_TCOUNT),    &
+                       XCORRj_RiRi(:,JK,NLES_CURRENT_TCOUNT)     )
+  END DO
+END IF
+!
+!* correlations with scalar variables
+!
+DO JSV=1,NSV
+  DO JK=1,NSPECTRA_K
+    CALL LES_HOR_CORR( ZW_SPEC(:,:,JK), ZSV_SPEC(:,:,JK,JSV),       &
+                       CLES_LBCX , CLES_LBCY,                       &
+                       XCORRi_WSv(:,JK,NLES_CURRENT_TCOUNT,JSV),    &
+                       XCORRj_WSv(:,JK,NLES_CURRENT_TCOUNT,JSV)     )
+  END DO
+  !
+  DO JK=1,NSPECTRA_K
+    CALL LES_HOR_CORR( ZSV_SPEC(:,:,JK,JSV), ZSV_SPEC(:,:,JK,JSV),  &
+                       CLES_LBCX , CLES_LBCY,                       &
+                       XCORRi_SvSv(:,JK,NLES_CURRENT_TCOUNT,JSV),   &
+                       XCORRj_SvSv(:,JK,NLES_CURRENT_TCOUNT,JSV)    )
+  END DO
+END DO
+!
+!-------------------------------------------------------------------------------
+!
+END SUBROUTINE LES
+!
+!-------------------------------------------------------------------------------
+!
+END SUBROUTINE LES_n
diff --git a/src/PHYEX/ext/lidar.f90 b/src/PHYEX/ext/lidar.f90
new file mode 100644
index 0000000000000000000000000000000000000000..93cfad846b1d3342188e5e085056f1edbfb6a001
--- /dev/null
+++ b/src/PHYEX/ext/lidar.f90
@@ -0,0 +1,695 @@
+!MNH_LIC Copyright 2007-2020 CNRS, Meteo-France and Universite Paul Sabatier
+!MNH_LIC This is part of the Meso-NH software governed by the CeCILL-C licence
+!MNH_LIC version 1. See LICENSE, CeCILL-C_V1-en.txt and CeCILL-C_V1-fr.txt
+!MNH_LIC for details. version 1.
+!-----------------------------------------------------------------
+!      #################
+       MODULE MODI_LIDAR 
+!      #################
+!
+INTERFACE
+      SUBROUTINE LIDAR(HCLOUD,HVIEW,PALT,PWVL,PZZ,PRHO,PT,PCLDFR,PRT, &
+                       PLIDAROUT,PLIPAROUT,PCT,PDSTC,PDSTD,PDSTS)
+!
+CHARACTER(LEN=*),         INTENT(IN) :: HCLOUD  ! Name of the cloud scheme
+CHARACTER(LEN=*),         INTENT(IN) :: HVIEW   ! Upward or Downward integration
+REAL,                     INTENT(IN) :: PALT    ! Altitude of the lidar source
+REAL,                     INTENT(IN) :: PWVL    ! Wavelength of the lidar source
+REAL, DIMENSION(:,:,:),   INTENT(IN) :: PZZ     ! Altitude
+REAL, DIMENSION(:,:,:),   INTENT(IN) :: PRHO    ! Air density
+REAL, DIMENSION(:,:,:),   INTENT(IN) :: PT      ! Air temperature
+REAL, DIMENSION(:,:,:),   INTENT(IN) :: PCLDFR  ! Cloud fraction
+REAL, DIMENSION(:,:,:,:), INTENT(IN) :: PRT     ! Moist variables at t
+REAL, DIMENSION(:,:,:),  INTENT(OUT) :: PLIDAROUT ! Lidar output
+REAL, DIMENSION(:,:,:),  INTENT(OUT) :: PLIPAROUT ! Lidar output (particle only)
+
+REAL, DIMENSION(:,:,:,:), OPTIONAL, INTENT(IN) :: PCT ! Concentration 
+                                                      ! (C2R2 and C1R3) 
+REAL, DIMENSION(:,:,:,:), OPTIONAL, INTENT(IN) :: PDSTC ! Dust Concentration 
+REAL, DIMENSION(:,:,:,:), OPTIONAL, INTENT(IN) :: PDSTD ! Dust Diameter
+REAL, DIMENSION(:,:,:,:), OPTIONAL, INTENT(IN) :: PDSTS ! Dust Sigma
+!
+
+!
+END SUBROUTINE LIDAR
+!
+END INTERFACE
+!
+END MODULE MODI_LIDAR
+!     #########################################################
+      SUBROUTINE LIDAR(HCLOUD,HVIEW,PALT,PWVL,PZZ,PRHO,PT,PCLDFR,PRT, &
+                       PLIDAROUT,PLIPAROUT,PCT,PDSTC,PDSTD,PDSTS)
+!     #########################################################
+!
+!!****  *LIDAR * - computes pertinent lidar parameters
+!!
+!!    PURPOSE
+!!    -------
+!!      The purpose of this routine is to compute the normalized backscattered
+!!    signal of an upward or downward looking lidar in an atmosperic column
+!!    containing air molecules, aerosols, cloud particles and hydrometeors.
+!!
+!!**  METHOD
+!!    ------
+!!      The reflectivities are computed using the n(D) * D**6 formula. The 
+!!    equivalent reflectiviy is the sum of the reflectivity produced by the
+!!    the raindrops and the equivalent reflectivities of the ice crystals.
+!!    The latter are computed using the melted diameter. The Doppler 
+!!    reflectivity is the 'fall speed'-moment of individual particle
+!!    reflectivity. Ice crystal are assumed to have no preferred orientation.
+!!    the Z_VV formula is taken from Brandes et al. (MWR, 1995).
+!!
+!!    EXTERNAL
+!!    --------
+!!
+!!    IMPLICIT ARGUMENTS
+!!    ------------------
+!!      Module MODD_CST
+!!        XPI                  !
+!!        XRHOLW               ! Liquid water density
+!!      Module MODD_RAIN_ICE_DESCR
+!!      Module MODD_RAIN_ICE_PARAM
+!!
+!!    REFERENCE
+!!    ---------
+!!    Chaboureau et al. 2011: Long-range transport of Saharan dust and its
+!!    radiative impact on precipitation forecast over western Europe: a case
+!!    study during COPS. Quart. J. Roy. Meteor. Soc., 137, 236-251
+!!
+!!    AUTHOR
+!!    ------
+!!      J.-P. Pinty      * Laboratoire d'Aerologie*
+!!
+!!    MODIFICATIONS
+!!    -------------
+!!      Original      04/10/07
+!!      JP Chaboureau 12/02/10 change dust refraction index
+!!                             add inputs (lidar charact. and cloud fraction)
+!!   J.Escobar : 15/09/2015 : WENO5 & JPHEXT <> 1
+!!   B.VIE  2016 : LIMA
+!  P. Wautelet 18/03/2020: remove ICE2 option
+!-------------------------------------------------------------------------------
+!
+!*       0.    DECLARATIONS
+!              ------------
+!
+USE MODD_PARAMETERS
+USE MODD_CST
+USE MODD_RAIN_C2R2_DESCR, ONLY : XLBEXC, XLBEXR, &
+                                 XRTMIN, XCTMIN
+USE MODD_PARAM_C2R2,      ONLY : YALPHAC=>XALPHAC,YNUC=>XNUC, &
+                                 YALPHAR=>XALPHAR,YNUR=>XNUR
+USE MODD_PARAM_ICE_n,        ONLY: WSNOW_T=>LSNOW_T
+USE MODD_RAIN_ICE_DESCR_n,  ONLY : XCCR, WLBEXR=>XLBEXR, XLBR, &
+                                 XCCS, XCXS,   XLBEXS, XLBS, WNS=>XNS, WBS=>XBS, &
+                                 XCCG, XCXG,   XLBEXG, XLBG, &
+                                 XCCH, XCXH,   XLBEXH, XLBH, &
+                                 WRTMIN=>XRTMIN,   &
+                                 WLBDAS_MAX=>XLBDAS_MAX,WLBDAS_MIN=>XLBDAS_MIN,WTRANS_MP_GAMMAS=>XTRANS_MP_GAMMAS
+USE MODD_ICE_C1R3_DESCR,  ONLY : XLBEXI,                      &
+                                 YRTMIN=>XRTMIN, YCTMIN=>XCTMIN
+!
+USE MODD_PARAM_LIMA,      ONLY : URTMIN=>XRTMIN, UCTMIN=>XCTMIN, &
+                                 UALPHAC=>XALPHAC,UNUC=>XNUC, &
+                                 UALPHAR=>XALPHAR,UNUR=>XNUR, &
+                                 UALPHAI=>XALPHAI,UNUI=>XNUI, &
+                                 USNOW_T=>LSNOW_T
+USE MODD_PARAM_LIMA_COLD, ONLY : UCCS=>XCCS, UCXS=>XCXS, ULBEXS=>XLBEXS, & 
+                                                ULBS=>XLBS, UNS=>XNS, UBS=>XBS,   &
+                                 ULBDAS_MAX=>XLBDAS_MAX,ULBDAS_MIN=>XLBDAS_MIN,UTRANS_MP_GAMMAS=>XTRANS_MP_GAMMAS
+USE MODD_PARAM_LIMA_MIXED,ONLY : UCCG=>XCCG, UCXG=>XCXG, ULBEXG=>XLBEXG, &
+                                                         ULBG=>XLBG
+
+use mode_tools_ll,        only: GET_INDICE_ll
+
+USE MODI_BHMIE_WATER    ! Gamma or mono dispersed size distributions
+USE MODI_BHMIE_AEROSOLS ! Lognormal or mono dispersed size distributions
+!
+IMPLICIT NONE
+!
+!*       0.1   Declarations of dummy arguments :
+!
+CHARACTER(LEN=*),         INTENT(IN) :: HCLOUD  ! Name of the cloud scheme
+CHARACTER(LEN=*),         INTENT(IN) :: HVIEW   ! Upward or Downward integration
+REAL,                     INTENT(IN) :: PALT    ! Altitude of the lidar source
+REAL,                     INTENT(IN) :: PWVL    ! Wavelength of the lidar source
+REAL, DIMENSION(:,:,:),   INTENT(IN) :: PZZ     ! Altitude
+REAL, DIMENSION(:,:,:),   INTENT(IN) :: PRHO    ! Air density
+REAL, DIMENSION(:,:,:),   INTENT(IN) :: PT      ! Air temperature
+REAL, DIMENSION(:,:,:),   INTENT(IN) :: PCLDFR  ! Cloud fraction
+REAL, DIMENSION(:,:,:,:), INTENT(IN) :: PRT     ! Moist variables at t
+REAL, DIMENSION(:,:,:),  INTENT(OUT) :: PLIDAROUT ! Lidar output
+REAL, DIMENSION(:,:,:),  INTENT(OUT) :: PLIPAROUT ! Lidar output (particle only)
+
+REAL, DIMENSION(:,:,:,:), OPTIONAL, INTENT(IN) :: PCT  ! Concentration 
+                                                       ! (C2R2 and C1R3) 
+REAL, DIMENSION(:,:,:,:), OPTIONAL, INTENT(IN) :: PDSTC ! Dust Concentration 
+REAL, DIMENSION(:,:,:,:), OPTIONAL, INTENT(IN) :: PDSTD ! Dust Diameter
+REAL, DIMENSION(:,:,:,:), OPTIONAL, INTENT(IN) :: PDSTS ! Dust Sigma
+!
+!*       0.2   Declarations of local variables :
+!
+INTEGER :: JI, JJ, JK
+INTEGER :: IIB, IIE, IJB, IJE, IKB, IKE
+INTEGER :: IALT
+INTEGER, DIMENSION(3) :: IKMIN
+!
+REAL, PARAMETER    :: ZCLDFRMIN = 1.0E-03                  ! Cloud fraction minimum
+!
+!
+COMPLEX, PARAMETER :: ZZREFIND_WAT = (1.337E+00,1.818E-09) ! Refraction Index
+                                                           ! of pure water
+COMPLEX, PARAMETER :: ZZREFIND_ICE = (1.312E+00,2.614E-09) ! Refraction Index
+                                                           ! of pure ice
+!COMPLEX, PARAMETER :: ZZREFIND_DUST= (1.530E+00,8.000E-03) ! Refraction Index
+!                                                           ! of mineral dust
+! West, R. A., L. R. Doose, A. M. Eibl, M. G. Tomasko, and M. I. Mishchenko
+! (1997), Laboratory measurements of mineral dust scattering phase function 
+! and linear polarization, J. Geophys. Res., 102(D14), 16,871-16,882.
+COMPLEX :: ZZREFIND_DUST
+
+! Tulet, P., M. Mallet, V. Pont, J. Pelon, and A. Boone (2008), The 7-13
+! March 2006 dust storm over West Africa: Generation, transport, and vertical
+! stratification, J. Geophys. Res., 113, D00C08, doi:10.1029/2008JD009871.
+!! Ri = 1.448-0.00292i for wavelengths between 0.185 and 0.69um.
+!! Ri = 1.44023-0.00116i for wavelengths between 0.69 and 1.19um.
+!! Ri = 1.41163-0.00106i for wavelengths between 1.19 and 4.0um.
+COMPLEX, PARAMETER :: ZZREFIND_DSTL= (1.448,2.92E-03)
+COMPLEX, PARAMETER :: ZZREFIND_DSTM= (1.44023,1.16E-03)
+COMPLEX, PARAMETER :: ZZREFIND_DSTH= (1.41163,1.06E-03)
+
+!
+! COMPLEX, PARAMETER :: ZZREFIND_WAT = (1.321E+00,1.280E-06) ! Refraction Index
+!                                                            ! of pure water
+! COMPLEX, PARAMETER :: ZZREFIND_ICE = (1.300E+00,1.898E-06) ! Refraction Index
+!                                                            ! of pure ice
+!
+COMPLEX, PARAMETER :: ZZREFIND_COAT= (1.337E+00,1.818E-09) ! Refraction Index
+                                                           ! of coating material
+COMPLEX, PARAMETER :: ZZREFIND_BC  = (1.870E+00,0.569E+00) ! Refraction Index
+                                                           ! of black carbone
+REAL               :: ZCXR=-1.0                  ! for rain N ~ 1/N_0 
+                                                 ! (in Kessler parameterization)
+!
+REAL :: ZCMOL
+REAL :: ZWAVE_LENGTH
+! BETA: backscattering coefficient
+! ALPHA:    extinction coefficient
+REAL,    DIMENSION(SIZE(PRHO,1),SIZE(PRHO,2),SIZE(PRHO,3))  :: ZBETA_MOL
+REAL,    DIMENSION(SIZE(PRHO,1),SIZE(PRHO,2),SIZE(PRHO,3))  :: ZALPH_MOL
+REAL,    DIMENSION(SIZE(PRHO,1),SIZE(PRHO,2),SIZE(PRHO,3))  :: ZBETA_PAR
+REAL,    DIMENSION(SIZE(PRHO,1),SIZE(PRHO,2),SIZE(PRHO,3))  :: ZALPH_PAR
+REAL, ALLOCATABLE, DIMENSION(:,:) :: ZOPTD_TOT ! Optical depths
+REAL, ALLOCATABLE, DIMENSION(:,:) :: ZOPTD_MOL  
+REAL, ALLOCATABLE, DIMENSION(:,:) :: ZOPTD_PAR 
+! 
+CHARACTER (LEN=5) :: YDSD
+INTEGER :: IRADIUS, IANGLE
+REAL    :: ZRADIUS, ZCONC, ZLWC, ZIWC
+REAL    :: ZREFF_FACT
+REAL    :: ZEXT_COEF, ZBAK_COEF
+REAL    :: ZLBDAR, ZLBDAS, ZLBDAG, ZLBDAH, ZTCEL
+REAL    :: ZFRACVOL_CORE, ZDMODAL, ZSIG
+REAL    :: ZFRACVOL_BC
+!
+REAL    :: ZETACLD, ZETAAER       ! Multiple diffusion paramter for cloud and dust
+!
+REAL, DIMENSION(5) :: ZPOLC, ZPOLR, ZPOLI ! BackScat. Coefficients
+! 
+REAL, DIMENSION(10) :: ZRTMIN, ZCTMIN
+REAL                :: ZLBEXR
+!
+INTEGER :: JL
+REAL :: ZALPHAC, ZNUC, ZALPHAR, ZNUR, ZALPHAI, ZNUI
+REAL :: ZCCS, ZCXS, ZLBEXS, ZLBS, ZNS
+REAL :: ZCCG, ZCXG, ZLBEXG, ZLBG
+! 
+! -----------------------------------------------------------------------------
+!
+!*       1.     COMPUTE THE LOOP BOUNDS
+!   	        -----------------------
+!
+CALL GET_INDICE_ll (IIB,IJB,IIE,IJE)
+IKB=1+JPVEXT
+IKE=SIZE(PRHO,3) - JPVEXT
+!
+ZWAVE_LENGTH = PWVL
+ZCMOL=5.45E-32*((ZWAVE_LENGTH)/0.55E-6)**(-4.09)
+IF (ZWAVE_LENGTH<0.69E-6) THEN
+  PRINT *,'Tulet et al. refractive index - low wavelength'
+  ZZREFIND_DUST = ZZREFIND_DSTL
+ELSEIF (ZWAVE_LENGTH<1.00E-6) THEN
+  PRINT *,'Tulet et al. refractive index - medium wavelength'
+  ZZREFIND_DUST = ZZREFIND_DSTM
+ELSE
+  PRINT *,'Tulet et al. refractive index - high wavelength'
+  ZZREFIND_DUST = ZZREFIND_DSTH
+END IF
+ZPOLC = (/ 2.6980E-8,-3.7701E-6, 1.6594E-4,-0.0024, 0.0626 /)
+ZPOLR(:) = ZPOLC(:) 
+ZPOLI = (/-1.0176E-8, 1.7615E-6,-1.0480E-4, 0.0019, 0.0460 /)
+!
+! Multiple diffusion parameter
+ZETAAER=1.0
+ZETACLD=1.0
+! a multiple scattering correction for lidar in space; Platt 73
+IF (HVIEW=='NADIR'.AND.PALT==0.) ZETACLD=0.5
+PRINT *,'Multiple diffusion parameter for aerosol ',ZETAAER
+PRINT *,'Multiple diffusion parameter for cloud   ',ZETACLD
+!
+!
+!*       1.     MORE INITIALIZATION
+!               -------------------
+!
+SELECT CASE ( HCLOUD )
+  CASE('KESS')
+    ZRTMIN(1) = 1.0E-20
+    ZRTMIN(2) = 1.0E-20
+    ZRTMIN(3) = 1.0E-20
+    ZLBEXR = 1.0/(-1.0-3.0)
+  CASE('ICE3','ICE4')
+    ZRTMIN(1:SIZE(WRTMIN)) = WRTMIN(1:SIZE(WRTMIN))
+    ZLBEXR = WLBEXR
+    ZCCS    = XCCS
+    ZCXS    = XCXS
+    ZLBEXS  = XLBEXS
+    ZLBS    = XLBS
+    ZNS     = WNS
+    ZCCG    = XCCG
+    ZCXG    = XCXG
+    ZLBEXG  = XLBEXG
+    ZLBG    = XLBG
+  CASE('C2R2')
+    ZRTMIN(1:SIZE(XRTMIN)) = XRTMIN(1:SIZE(XRTMIN))
+    ZCTMIN(1:SIZE(XCTMIN)) = XCTMIN(1:SIZE(XCTMIN))
+    ZLBEXR  = XLBEXR
+    ZALPHAC = YALPHAC
+    ZNUR    = YNUR
+    ZALPHAR = YALPHAR
+    ZNUC    = YNUC
+  CASE('C3R5')
+    ZRTMIN(1:SIZE(YRTMIN)) = YRTMIN(1:SIZE(YRTMIN))
+    ZCTMIN(1:SIZE(YCTMIN)) = YCTMIN(1:SIZE(YCTMIN))
+    ZALPHAC = YALPHAC
+    ZNUR    = YNUR
+    ZALPHAR = YALPHAR
+    ZNUC    = YNUC
+    ZALPHAI = ZALPHAC
+    ZNUI    = ZNUC
+    ZCCS    = XCCS
+    ZCXS    = XCXS
+    ZLBEXS  = XLBEXS
+    ZLBS    = XLBS
+    ZCCG    = XCCG
+    ZCXG    = XCXG
+    ZLBEXG  = XLBEXG
+    ZLBG    = XLBG
+  CASE('LIMA')
+      ZRTMIN(1:SIZE(URTMIN)) = URTMIN(1:SIZE(URTMIN))
+      ZCTMIN(1:SIZE(UCTMIN)) = UCTMIN(1:SIZE(UCTMIN))
+      ZALPHAC = UALPHAC
+      ZNUR    = UNUR
+      ZALPHAR = UALPHAR
+      ZNUC    = UNUC
+      ZALPHAI = UALPHAI
+      ZNUI    = UNUI
+      ZCCS    = UCCS
+      ZCXS    = UCXS 
+      ZLBEXS  = ULBEXS 
+      ZLBS    = ULBS
+      ZNS     = UNS
+      ZCCG    = UCCG
+      ZCXG    = UCXG 
+      ZLBEXG  = ULBEXG
+      ZLBG    = ULBG
+END SELECT
+!
+! -----------------------------------------------------------------------------
+!
+!*       2.    INITIALIZES THE MEAN-LAYER VARIABLES
+!              ------------------------------------
+!
+!
+! MOLECULAR CONTRIBUTION
+!
+ZBETA_MOL(:,:,:) = ( PRHO(:,:,:)*XAVOGADRO/XMD )*ZCMOL         
+ZALPH_MOL(:,:,:) = ZBETA_MOL(:,:,:)*(8.0*XPI/3.0)
+!
+! PARTICULAR CONTRIBUTION
+!
+ZBETA_PAR(:,:,:) = 0.
+ZALPH_PAR(:,:,:) = 0.
+!
+! AEROSOL CONTRIBUTION     ! call bhmie_aerosols
+!
+IF (PRESENT(PDSTC)) THEN
+  DO JL = 1, SIZE(PDSTD,4)
+    DO JK = IKB, IKE
+      DO JJ = IJB, IJE
+        DO JI = IIB, IIE
+          IF ( PDSTD(JI,JJ,JK,JL)>0.1 ) THEN
+ !
+ ! Desert dust particles
+ !
+            YDSD    = 'MONOD'
+            ZCONC   = PDSTC(JI,JJ,JK,JL)
+            ZFRACVOL_CORE = 1.0
+            ZRADIUS = PDSTD(JI,JJ,JK,JL)*1.0E-6
+            IF( ZRADIUS .GE. 1.0E-3 ) ZRADIUS = ZRADIUS * 1.0E-6
+            CALL BHMIE_AEROSOLS( ZWAVE_LENGTH, ZZREFIND_DUST, ZZREFIND_DUST,  &
+                                 YDSD, ZCONC, ZFRACVOL_CORE, ZEXT_COEF,       &
+                                 ZBAK_COEF, PRADIUS=ZRADIUS )
+            ZALPH_PAR(JI,JJ,JK) = ZALPH_PAR(JI,JJ,JK) + ZETAAER * ZEXT_COEF
+            ZBETA_PAR(JI,JJ,JK) = ZBETA_PAR(JI,JJ,JK) + ZBAK_COEF
+          END IF
+        END DO
+      END DO
+    END DO
+  END DO
+END IF
+!
+!
+! HYDROMETEOR CONTRIBUTION ! call bhmie_water
+!
+! LIQUID WATER
+!
+! Some Prefactors:  Assume Martin et al. (1994, JAS) for Reff
+!
+ZREFF_FACT = 1.0E-3*(3.E3/(4.0*XPI*0.67E-3))**0.33 ! Continental N=500
+ZREFF_FACT = 1.0E-3*(3.E3/(4.0*XPI*0.80E-3))**0.33 ! Maritime    N=150
+!
+SELECT CASE ( HCLOUD )
+  CASE('KESS','ICE3','ICE4')
+    DO JK = IKB, IKE
+      DO JJ = IJB, IJE
+        DO JI = IIB, IIE
+          IF ( PRT(JI,JJ,JK,2)>ZRTMIN(2) .AND. PCLDFR(JI,JJ,JK)>ZCLDFRMIN) THEN
+!
+! Cloud droplets
+!
+            YDSD = 'MONOD'
+            ZCONC   = 200.E6 ! Continental case
+            ZLWC    = PRHO(JI,JJ,JK)*PRT(JI,JJ,JK,2) / PCLDFR(JI,JJ,JK)
+            ZRADIUS = MIN( 16.0E-6,MAX( 4.0E-6,ZREFF_FACT*(ZLWC/ZCONC)**0.33 ) )
+            IANGLE  = 11
+            CALL BHMIE_WATER( ZWAVE_LENGTH, ZZREFIND_WAT, YDSD, ZCONC,      &
+                              IANGLE, ZEXT_COEF, ZBAK_COEF, PRADIUS=ZRADIUS )
+            ZALPH_PAR(JI,JJ,JK) = ZALPH_PAR(JI,JJ,JK) + ZETACLD * ZEXT_COEF &
+                                                        * PCLDFR(JI,JJ,JK)
+            ZBETA_PAR(JI,JJ,JK) = ZBETA_PAR(JI,JJ,JK) + ZBAK_COEF           &
+                                                        * PCLDFR(JI,JJ,JK)
+          END IF
+        END DO
+      END DO
+    END DO
+    DO JK = IKB, IKE
+      DO JJ = IJB, IJE
+        DO JI = IIB, IIE
+          IF ( PRT(JI,JJ,JK,3)>ZRTMIN(3) ) THEN
+!
+! Rain drops
+!
+            YDSD = 'MONOD'
+            ZLWC    = PRHO(JI,JJ,JK)*PRT(JI,JJ,JK,3)
+            ZLBDAR  = XLBR*(ZLWC)**ZLBEXR
+            ZCONC   = XCCR*(ZLBDAR)**ZCXR
+            ZRADIUS = 0.5*(3.0/ZLBDAR) ! Assume Marshall-Palmer law for Reff
+            IANGLE  = 11
+            CALL BHMIE_WATER( ZWAVE_LENGTH, ZZREFIND_WAT, YDSD, ZCONC,      &
+                              IANGLE, ZEXT_COEF, ZBAK_COEF, PRADIUS=ZRADIUS )
+            ZALPH_PAR(JI,JJ,JK) = ZALPH_PAR(JI,JJ,JK) + ZETACLD * ZEXT_COEF
+            ZBETA_PAR(JI,JJ,JK) = ZBETA_PAR(JI,JJ,JK) + ZBAK_COEF
+          END IF
+        END DO
+      END DO
+    END DO
+  CASE ('C2R2','C3R5','LIMA')
+    DO JK = IKB, IKE
+      DO JJ = IJB, IJE
+        DO JI = IIB, IIE
+          IF (PRT(JI,JJ,JK,2)>ZRTMIN(2) .AND. PCT(JI,JJ,JK,2)>ZCTMIN(2)) THEN
+!
+! Cloud droplets
+!
+            YDSD = 'GAMMA'
+            ZCONC   = PCT(JI,JJ,JK,2)
+            IRADIUS  = 20
+            ZLWC    = PRHO(JI,JJ,JK)*PRT(JI,JJ,JK,2)
+            IANGLE  = 11
+            CALL BHMIE_WATER( ZWAVE_LENGTH, ZZREFIND_WAT, YDSD, ZCONC,       &
+                              IANGLE, ZEXT_COEF, ZBAK_COEF, KRADIUS=IRADIUS, & 
+                              PALPHA=ZALPHAC, PNU=ZNUC, PLWC=ZLWC            )
+            ZALPH_PAR(JI,JJ,JK) = ZALPH_PAR(JI,JJ,JK) + ZETACLD * ZEXT_COEF
+            ZBETA_PAR(JI,JJ,JK) = ZBETA_PAR(JI,JJ,JK) + ZBAK_COEF
+          END IF
+        END DO
+      END DO
+    END DO
+    DO JK = IKB, IKE
+      DO JJ = IJB, IJE
+        DO JI = IIB, IIE
+          IF (PRT(JI,JJ,JK,3)>ZRTMIN(3) .AND. PCT(JI,JJ,JK,3)>ZCTMIN(3)) THEN
+!
+! Rain drops
+!
+            YDSD = 'GAMMA'
+            ZCONC   = PCT(JI,JJ,JK,3)
+            IRADIUS  = 20
+            ZLWC    = PRHO(JI,JJ,JK)*PRT(JI,JJ,JK,3)
+            IANGLE  = 11
+            CALL BHMIE_WATER( ZWAVE_LENGTH, ZZREFIND_WAT, YDSD, ZCONC,       &
+                              IANGLE, ZEXT_COEF, ZBAK_COEF, KRADIUS=IRADIUS, & 
+                              PALPHA=ZALPHAR, PNU=ZNUR, PLWC=ZLWC            )
+            ZALPH_PAR(JI,JJ,JK) = ZALPH_PAR(JI,JJ,JK) + ZETACLD * ZEXT_COEF
+            ZBETA_PAR(JI,JJ,JK) = ZBETA_PAR(JI,JJ,JK) + ZBAK_COEF
+          END IF
+        END DO
+      END DO
+    END DO
+END SELECT
+!
+! SOLID ICE
+!
+SELECT CASE ( HCLOUD )
+  CASE('ICE3','ICE4')
+    DO JK = IKB, IKE
+      DO JJ = IJB, IJE
+        DO JI = IIB, IIE
+          IF ( PRT(JI,JJ,JK,4)>ZRTMIN(4) .AND. PCLDFR(JI,JJ,JK)>ZCLDFRMIN) THEN
+!
+! Pristine crystals
+!
+            YDSD = 'MONOD'
+            ZCONC   = 10.E3 ! Continental case
+            ZIWC    = PRHO(JI,JJ,JK)*PRT(JI,JJ,JK,4) / PCLDFR(JI,JJ,JK)
+            ZTCEL   = 10.0-0.0065*PZZ(JI,JJ,JK)  ! A rough estimate
+            ZRADIUS = MIN( 350.0E-6,MAX( 45.0E-6,0.5E-6*(1.2351+0.0105*ZTCEL)* &
+                                (5.8966*(ZIWC*1.0E3)**0.2214 +                 &
+                                (0.7957*(ZIWC*1.0E3)**0.2535)*(ZTCEL+190.0)) ) )
+            IANGLE  = 11
+            CALL BHMIE_WATER( ZWAVE_LENGTH, ZZREFIND_ICE, YDSD, ZCONC,      &
+                              IANGLE, ZEXT_COEF, ZBAK_COEF, PRADIUS=ZRADIUS )
+            ZALPH_PAR(JI,JJ,JK) = ZALPH_PAR(JI,JJ,JK) + ZETACLD * ZEXT_COEF &
+                                                        *PCLDFR(JI,JJ,JK)
+            ZBETA_PAR(JI,JJ,JK) = ZBETA_PAR(JI,JJ,JK) + ZBAK_COEF           &
+                                                        *PCLDFR(JI,JJ,JK)
+          END IF
+        END DO
+      END DO
+    END DO
+  CASE ('C3R5','LIMA')
+    DO JK = IKB, IKE
+      DO JJ = IJB, IJE
+        DO JI = IIB, IIE
+          IF (PRT(JI,JJ,JK,4)>ZRTMIN(4) .AND. PCT(JI,JJ,JK,4)>ZCTMIN(4)) THEN
+!
+! Pristine crystals
+!
+            YDSD = 'GAMMA'
+            ZCONC   = PCT(JI,JJ,JK,4)
+            IRADIUS  = 20
+            ZIWC    = PRHO(JI,JJ,JK)*PRT(JI,JJ,JK,4)
+            IANGLE  = 11
+            CALL BHMIE_WATER( ZWAVE_LENGTH, ZZREFIND_ICE, YDSD, ZCONC,       &
+                              IANGLE, ZEXT_COEF, ZBAK_COEF, KRADIUS=IRADIUS, &
+                              PALPHA=ZALPHAI, PNU=ZNUI, PLWC=ZIWC            )
+            ZALPH_PAR(JI,JJ,JK) = ZALPH_PAR(JI,JJ,JK) + ZETACLD * ZEXT_COEF
+            ZBETA_PAR(JI,JJ,JK) = ZBETA_PAR(JI,JJ,JK) + ZBAK_COEF
+          END IF
+        END DO
+      END DO
+    END DO
+END SELECT
+SELECT CASE ( HCLOUD )
+  CASE('ICE3','ICE4','C3R5','LIMA')
+    DO JK = IKB, IKE
+      DO JJ = IJB, IJE
+        DO JI = IIB, IIE
+          IF ( PRT(JI,JJ,JK,5)>ZRTMIN(5) ) THEN
+!
+! Snow flakes
+!
+            YDSD = 'MONOD'
+            ZIWC    = PRHO(JI,JJ,JK)*PRT(JI,JJ,JK,5)
+            IF (HCLOUD=='LIMA' .AND. USNOW_T) THEN
+               IF (PT(JI,JJ,JK)>263.15) THEN
+                  ZLBDAS = MAX(MIN(ULBDAS_MAX, 10**(14.554-0.0423*PT(JI,JJ,JK))),ULBDAS_MIN)*UTRANS_MP_GAMMAS
+               ELSE
+                  ZLBDAS = MAX(MIN(ULBDAS_MAX, 10**(6.226-0.0106*PT(JI,JJ,JK))),ULBDAS_MIN)*UTRANS_MP_GAMMAS
+               END IF
+               ZCONC=ZNS*ZIWC*ZLBDAS**UBS
+            ELSE IF (HCLOUD=='ICE3' .AND. WSNOW_T) THEN
+               IF (PT(JI,JJ,JK)>263.15) THEN
+                  ZLBDAS = MAX(MIN(WLBDAS_MAX, 10**(14.554-0.0423*PT(JI,JJ,JK))),WLBDAS_MIN)*WTRANS_MP_GAMMAS
+               ELSE
+                  ZLBDAS = MAX(MIN(WLBDAS_MAX, 10**(6.226-0.0106*PT(JI,JJ,JK))),WLBDAS_MIN)*WTRANS_MP_GAMMAS
+               END IF
+               ZCONC=ZNS*ZIWC*ZLBDAS**WBS
+            ELSE
+               ZLBDAS  = ZLBS*(ZIWC)**ZLBEXS
+               ZCONC   = ZCCS*(ZLBDAS)**ZCXS
+            END IF
+            IF (ZLBDAS .GT. 0) THEN
+              ZRADIUS = 0.5*(3.0/ZLBDAS) ! Assume Marshall-Palmer law for Reff
+              IANGLE  = 11
+              CALL BHMIE_WATER( ZWAVE_LENGTH, ZZREFIND_ICE, YDSD, ZCONC,      &
+                                IANGLE, ZEXT_COEF, ZBAK_COEF, PRADIUS=ZRADIUS )
+              ZALPH_PAR(JI,JJ,JK) = ZALPH_PAR(JI,JJ,JK) + ZETACLD * ZEXT_COEF
+              ZBETA_PAR(JI,JJ,JK) = ZBETA_PAR(JI,JJ,JK) + ZBAK_COEF
+            END IF
+          END IF
+        END DO
+      END DO
+    END DO
+END SELECT
+SELECT CASE ( HCLOUD )
+  CASE('ICE3','ICE4','C3R5','LIMA')
+    DO JK = IKB, IKE
+      DO JJ = IJB, IJE
+        DO JI = IIB, IIE
+          IF ( PRT(JI,JJ,JK,6)>ZRTMIN(6) ) THEN
+!
+! Graupel particles
+!
+            YDSD = 'MONOD'
+            ZIWC    = PRHO(JI,JJ,JK)*PRT(JI,JJ,JK,6)
+            ZLBDAG  = ZLBG*(ZIWC)**ZLBEXG
+            ZCONC   = ZCCG*(ZLBDAG)**ZCXG
+            ZRADIUS = 0.5*(3.0/ZLBDAG) ! Assume Marshall-Palmer law for Reff
+            IANGLE  = 11
+            CALL BHMIE_WATER( ZWAVE_LENGTH, ZZREFIND_ICE, YDSD, ZCONC,      &
+                              IANGLE, ZEXT_COEF, ZBAK_COEF, PRADIUS=ZRADIUS )
+            ZALPH_PAR(JI,JJ,JK) = ZALPH_PAR(JI,JJ,JK) + ZETACLD * ZEXT_COEF
+            ZBETA_PAR(JI,JJ,JK) = ZBETA_PAR(JI,JJ,JK) + ZBAK_COEF
+          END IF
+        END DO
+      END DO
+    END DO
+END SELECT
+SELECT CASE ( HCLOUD )
+  CASE('ICE4')
+    DO JK = IKB, IKE
+      DO JJ = IJB, IJE
+        DO JI = IIB, IIE
+          IF ( PRT(JI,JJ,JK,7)>ZRTMIN(7) ) THEN
+!
+! Hailstones
+!
+            YDSD = 'MONOD'
+            ZIWC    = PRHO(JI,JJ,JK)*PRT(JI,JJ,JK,7)
+            ZLBDAH  = XLBH*(ZIWC)**XLBEXH
+            ZCONC   = XCCH*(ZLBDAH)**XCXH
+            ZRADIUS = 0.5*(3.0/ZLBDAH) ! Assume Marshall-Palmer law for Reff
+            IANGLE  = 11
+            CALL BHMIE_WATER( ZWAVE_LENGTH, ZZREFIND_ICE, YDSD, ZCONC,      &
+                              IANGLE, ZEXT_COEF, ZBAK_COEF, PRADIUS=ZRADIUS )
+            ZALPH_PAR(JI,JJ,JK) = ZALPH_PAR(JI,JJ,JK) + ZETACLD * ZEXT_COEF
+            ZBETA_PAR(JI,JJ,JK) = ZBETA_PAR(JI,JJ,JK) + ZBAK_COEF
+          END IF
+        END DO
+      END DO
+    END DO
+END SELECT
+!
+! -----------------------------------------------------------------------------
+!
+!*       3.    PERFORMS THE BOTTOM-UP OR TOP-DOWN VERTICAL INTEGRATION
+!              -------------------------------------------------------
+!
+!
+ALLOCATE(ZOPTD_TOT(SIZE(PRHO,1),SIZE(PRHO,2)))
+ALLOCATE(ZOPTD_MOL(SIZE(PRHO,1),SIZE(PRHO,2)))
+ALLOCATE(ZOPTD_PAR(SIZE(PRHO,1),SIZE(PRHO,2)))
+ZOPTD_TOT(:,:) = 0.
+ZOPTD_MOL(:,:) = 0.
+ZOPTD_PAR(:,:) = 0.
+!
+IF( HVIEW=='ZENIT' ) THEN
+  IALT=IKB
+  IF (PALT/=0.) THEN
+    IKMIN=MINLOC(ABS(PZZ(:,:,:)-PALT))
+    IALT=MIN(MAX(IKB,IKMIN(3)),IKE)
+  ENDIF
+  DO JK=IALT,IKE
+!
+! molecular optical depth
+!
+    ZOPTD_MOL(:,:) = ZOPTD_MOL(:,:) &
+                   + ZALPH_MOL(:,:,JK)*(PZZ(:,:,JK)-PZZ(:,:,JK-1))
+!
+! Particular optical depth
+!
+    ZOPTD_PAR(:,:) = ZOPTD_PAR(:,:) &
+                   + ZALPH_PAR(:,:,JK)*(PZZ(:,:,JK)-PZZ(:,:,JK-1))
+!
+! Total optical depth
+!
+    ZOPTD_TOT(:,:) = ZOPTD_MOL(:,:) + ZOPTD_PAR(:,:)
+!
+! Normalized Lidar profile
+!
+    PLIDAROUT(:,:,JK) = ( ZBETA_MOL(:,:,JK)+ZBETA_PAR(:,:,JK) ) &
+                        * EXP( -2.0*ZOPTD_TOT(:,:) )
+!
+! Normalized Lidar particle profile
+!
+    PLIPAROUT(:,:,JK) = ZBETA_PAR(:,:,JK) * EXP( -2.0*ZOPTD_PAR(:,:) )
+  END DO
+ELSE IF( HVIEW=='NADIR' ) THEN
+  IALT=IKE
+  IF (PALT/=0.) THEN
+    IKMIN=MINLOC(ABS(PZZ(:,:,:)-PALT))
+    IALT=MIN(MAX(IKB,IKMIN(3)),IKE)
+  ENDIF
+  DO JK=IALT,IKB,-1
+!
+! molecular optical depth
+!
+    ZOPTD_MOL(:,:) = ZOPTD_MOL(:,:) &
+                   + ZALPH_MOL(:,:,JK)*(PZZ(:,:,JK)-PZZ(:,:,JK-1))
+!
+! Particular optical depth
+!
+    ZOPTD_PAR(:,:) = ZOPTD_PAR(:,:) &
+                   + ZALPH_PAR(:,:,JK)*(PZZ(:,:,JK)-PZZ(:,:,JK-1))
+!
+! Total optical depth
+!
+    ZOPTD_TOT(:,:) = ZOPTD_MOL(:,:) + ZOPTD_PAR(:,:)
+!
+! Normalized Lidar profile
+!
+    PLIDAROUT(:,:,JK) = ( ZBETA_MOL(:,:,JK)+ZBETA_PAR(:,:,JK) ) &
+                        * EXP( -2.0*ZOPTD_TOT(:,:) )
+!
+! Normalized Lidar particle profile
+!
+    PLIPAROUT(:,:,JK) = ZBETA_PAR(:,:,JK) * EXP( -2.0*ZOPTD_PAR(:,:) )
+  END DO
+ENDIF
+!
+DEALLOCATE(ZOPTD_TOT,ZOPTD_MOL,ZOPTD_PAR)
+!
+!------------------------------------------------------------------------------
+!
+END SUBROUTINE LIDAR
diff --git a/src/PHYEX/ext/mnh2lpdm.f90 b/src/PHYEX/ext/mnh2lpdm.f90
new file mode 100644
index 0000000000000000000000000000000000000000..e5472663fb4f3727590afe015482fcab299981f6
--- /dev/null
+++ b/src/PHYEX/ext/mnh2lpdm.f90
@@ -0,0 +1,181 @@
+!MNH_LIC Copyright 2002-2023 CNRS, Meteo-France and Universite Paul Sabatier
+!MNH_LIC This is part of the Meso-NH software governed by the CeCILL-C licence
+!MNH_LIC version 1. See LICENSE, CeCILL-C_V1-en.txt and CeCILL-C_V1-fr.txt
+!MNH_LIC for details. version 1.
+!-----------------------------------------------------------------------
+!     ######spl
+        PROGRAM MNH2LPDM
+!	##############
+!-----------------------------------------------------------------------------
+!****	MNH2DIF COUPLAGE MESO-NH / SPRAY.
+!
+!	Auteur   :   Michel Bouzom, DP/SERV/ENV
+!	Creation :   16.07.2002
+!       Modification  : 07.01.2006 (T.LAUVAUX, adaptation LPDM)
+!       Modification  : 04.01.2009 (F. BONNARDOT, DP/SER/ENV )
+!  P. Wautelet 05/2016-04/2018: new data structures and calls for I/O
+!  P. Wautelet 07/02/2019: force TYPE to a known value for IO_File_add2list
+!  P. Wautelet 10/04/2019: replace ABORT and STOP calls by Print_msg
+!  P. Wautelet 05/11/2020: correct I/O of MNH2LPDM
+!
+!-----------------------------------------------------------------------------
+!
+!
+!
+!*	0.  DECLARATIONS.
+!	    -------------
+!
+!*	0.1 Modules.
+!
+USE MODD_CONF,             ONLY : CPROGRAM
+USE MODD_IO,               ONLY : TFILEDATA, TFILE_OUTPUTLISTING, TPTR2FILE
+use modd_lunit,            only: TLUOUT0
+use modd_lunit_n,          only: TLUOUT
+USE MODD_MNH2LPDM
+!
+USE MODE_FIELD,            ONLY: INI_FIELD_LIST, INI_FIELD_SCALARS
+USE MODE_IO,               ONLY: IO_Init, IO_Config_set
+USE MODE_IO_FILE,          ONLY: IO_File_open, IO_File_close
+USE MODE_IO_MANAGE_STRUCT, ONLY: IO_File_add2list
+USE MODE_MODELN_HANDLER
+use mode_msg
+USE MODE_POS
+!
+USE MODE_INI_CST, ONLY: INI_CST
+USE MODI_MNH2LPDM_ECH
+USE MODI_MNH2LPDM_INI
+USE MODI_VERSION
+!
+USE MODN_CONFIO
+!
+!
+!*	0.2 Variables locales.
+!
+IMPLICIT NONE
+!
+CHARACTER(LEN=*),PARAMETER :: YFLOG = 'METEO.log'     ! Log filename
+CHARACTER(LEN=*),PARAMETER :: YFNML = 'MNH2LPDM1.nam' ! Namelist filename
+INTEGER,         PARAMETER :: IVERB = 5
+!
+INTEGER :: IFNML  ! Unit of namelist
+INTEGER :: JFIC
+LOGICAL :: GFOUND ! Return code when searching namelist
+TYPE(TPTR2FILE),DIMENSION(JPMNHMAX) :: TZFMNH  ! MesoNH files
+TYPE(TFILEDATA),POINTER :: TZDATEFILE  => NULL() ! Date file
+TYPE(TFILEDATA),POINTER :: TZGRIDFILE  => NULL() ! Grid file
+TYPE(TFILEDATA),POINTER :: TZMETEOFILE => NULL() ! Meteo file
+TYPE(TFILEDATA),POINTER :: TZLOGFILE   => NULL() ! Log file
+TYPE(TFILEDATA),POINTER :: TZNMLFILE   => NULL() ! Namelist file
+!
+!
+!
+!
+!*	1.  INITIALISATION.
+!	    ---------------
+!
+CPROGRAM='M2LPDM'
+CALL GOTO_MODEL(1)
+CALL VERSION()
+CALL IO_Init()
+CALL INI_CST()
+CALL INI_FIELD_LIST()
+CALL INI_FIELD_SCALARS()
+!
+CALL IO_File_add2list(TLUOUT0,'OUTPUT_LISTING1','OUTPUTLISTING','WRITE')
+CALL IO_File_open(TLUOUT0)
+!Set output files for PRINT_MSG
+TLUOUT              => TLUOUT0
+TFILE_OUTPUTLISTING => TLUOUT0
+!
+!*	1.1 Variables generales.
+!
+ CFMNH(:) = ''
+!
+!
+!*	1.2 Initialisation routines LL.
+!
+CALL IO_Init()
+!
+!
+!*	1.3 Ouverture du fichier log.
+!
+CALL IO_File_add2list(TZLOGFILE,YFLOG,'TXT','WRITE')
+CALL IO_File_open(TZLOGFILE)
+!
+!
+!*	1.4 Lecture des namelists.
+!
+CALL IO_File_add2list(TZNMLFILE,YFNML,'NML','READ')
+CALL IO_File_open(TZNMLFILE)
+IFNML = TZNMLFILE%NLU
+
+READ(UNIT=IFNML,NML=NAM_TURB)
+READ(UNIT=IFNML,NML=NAM_FIC)
+print *,'Lecture de NAM_FIC OK.'
+
+CALL POSNAM( TZNMLFILE, 'NAM_CONFIO', GFOUND )
+IF (GFOUND) THEN
+  READ(UNIT=IFNML,NML=NAM_CONFIO)
+END IF
+LCDF4 = .FALSE.
+LLFIOUT  = .FALSE.
+LLFIREAD = .FALSE.
+CALL IO_Config_set()
+CALL IO_File_close(TZNMLFILE)
+!
+!
+!*	1.5 Comptage des FM a traiter.
+!
+IF (LEN_TRIM(CFMNH(1))>0) THEN
+   NBMNH=1
+   CALL IO_File_add2list(TZFMNH(1)%TZFILE,TRIM(CFMNH(1)),'MNH','READ',KLFITYPE=2,KLFIVERB=IVERB)
+   DO WHILE (CFMNH(NBMNH+1).NE.'VIDE')
+      NBMNH=NBMNH+1
+      CALL IO_File_add2list(TZFMNH(NBMNH)%TZFILE,TRIM(CFMNH(NBMNH)),'MNH','READ',KLFITYPE=2,KLFIVERB=IVERB)
+   END DO
+   print *,NBMNH,' fichiers a traiter.'
+ELSE
+  call Print_msg( NVERB_FATAL, 'GEN', 'MNH2LPDM', 'no CFMNH file given' )
+END IF
+!
+!
+!
+!
+!*	2.  TRAITEMENTS.
+!	    ------------
+!
+!*	2.1 Ouverture des fichiers METEO et GRILLE et DATE.
+!
+CALL IO_File_add2list(TZGRIDFILE,CFGRI,'TXT','WRITE')
+CALL IO_File_open(TZGRIDFILE)
+CALL IO_File_add2list(TZDATEFILE,CFDAT,'TXT','WRITE')
+CALL IO_File_open(TZDATEFILE)
+!
+!
+!*	2.2 Preparation du couplage.
+!
+CALL MNH2LPDM_INI(TZFMNH(1)%TZFILE,TZFMNH(NBMNH)%TZFILE,TZLOGFILE,TZGRIDFILE,TZDATEFILE)
+!
+!
+!*	2.3 Traitement des echeances.
+!
+DO JFIC=1,NBMNH
+   print*,"CFMTO(JFIC)=",CFMTO(JFIC)
+   CALL IO_File_add2list(TZMETEOFILE,CFMTO(JFIC),'METEO','WRITE')
+   CALL IO_File_open(TZMETEOFILE)
+   CALL MNH2LPDM_ECH(TZFMNH(JFIC)%TZFILE,TZMETEOFILE)
+   print*,"CLOSE_LL(CFMTO(JFIC)"
+   CALL IO_File_close(TZMETEOFILE)
+   TZMETEOFILE => NULL()
+END DO
+!
+!
+!*	2.4 Fermeture des fichiers, METEO, GRILLE et LOG.
+!
+CALL IO_File_close(TZGRIDFILE)
+CALL IO_File_close(TZDATEFILE)
+CALL IO_File_close(TZLOGFILE)
+!
+!
+!
+END PROGRAM MNH2LPDM
diff --git a/src/PHYEX/ext/mnh2lpdm_ech.f90 b/src/PHYEX/ext/mnh2lpdm_ech.f90
new file mode 100644
index 0000000000000000000000000000000000000000..a916c8922e4c593d22658fce09a769978a0d2163
--- /dev/null
+++ b/src/PHYEX/ext/mnh2lpdm_ech.f90
@@ -0,0 +1,497 @@
+!MNH_LIC Copyright 2009-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.
+!-----------------------------------------------------------------------
+!     ######spl
+        SUBROUTINE MNH2LPDM_ECH(TPFILE,TPMETEOFILE)
+!	##################################################
+!-----------------------------------------------------------------------
+!****	MNH2S2_ECH TRAITEMENT D'UNE ECHEANCE.
+!
+! Auteur   : Francois Bonnardot, DP/SERV/ENV
+! Creation : 07.01.2009
+! Modifications:
+!  P. Wautelet 05/2016-04/2018: new data structures and calls for I/O
+!  P. Wautelet 28/05/2018: corrected truncated integer division (1/3 -> 1./3.)
+!  P. Wautelet 26/04/2019: replace non-standard FLOAT function by REAL function
+!  P. Wautelet 05/11/2020: correct I/O of MNH2LPDM
+!-----------------------------------------------------------------------
+!
+!*	0.  DECLARATIONS.
+!	    -------------
+!
+!*	0.1 Modules.
+!
+!
+!
+USE MODD_DIM_n
+USE MODD_IO,               ONLY: TFILEDATA
+USE MODD_TIME_n
+USE MODD_GRID_n
+!
+USE MODD_CST
+USE MODD_PARAMETERS
+USE MODD_TIME
+!
+USE MODD_MNH2LPDM
+!
+use modd_field,            only: tfieldmetadata, TYPEREAL
+USE MODE_IO_FILE,          only: IO_File_close, IO_File_open
+USE MODE_IO_FIELD_READ,    only: IO_Field_read
+USE MODE_IO_MANAGE_STRUCT, only: IO_File_add2list
+!
+IMPLICIT NONE
+!
+!
+!*	0.2 Arguments.
+!
+TYPE(TFILEDATA),POINTER,INTENT(INOUT) :: TPFILE
+TYPE(TFILEDATA),POINTER,INTENT(IN)    :: TPMETEOFILE
+!
+!
+!*	0.3 Variables locales.
+!
+CHARACTER(LEN=100)   :: YFTURB                       ! Stockage champs de turbulence.
+INTEGER              :: IFTURB
+INTEGER              :: IFMTO,IREP
+INTEGER              :: ICURAA,ICURMM,ICURJJ         ! Date  courante.
+INTEGER              :: ICURHH,ICURMN,ICURSS         ! Heure courante.
+INTEGER              :: JI,JJ,JK
+TYPE(DATE_TIME)      :: TZDTCUR
+type(tfieldmetadata)    :: tzfield
+TYPE(TFILEDATA),POINTER :: TZFILE
+!
+!
+!
+!
+!*	1.  INITIALISATION.
+!	    ---------------
+!
+!*	1.1 Blabla.
+!
+TZFILE => NULL()
+IFMTO = TPMETEOFILE%NLU
+!
+!*	2.  LECTURE DES DONNEES MESO-NH DE BASE.
+!	    ------------------------------------
+!
+!*	2.1 Ouverture du fichier Meso-NH.
+!
+CALL IO_File_open(TPFILE)
+!
+!*	2.2 Date et heure courante.
+!
+CALL IO_Field_read(TPFILE,'DTCUR',TZDTCUR)
+! 
+ICURAA=MOD(TZDTCUR%nyear,100)  ! Annee sur 2 caracteres.
+ICURMM=TZDTCUR%nmonth
+ICURJJ=TZDTCUR%nday
+ICURSS=NINT(TZDTCUR%xtime)
+!
+ICURMN = NINT( (REAL(ICURSS)/60.0)/5.0 )*5   ! Heure arrondie a 5 minutes pres.
+ICURSS = 0
+ICURHH =ICURMN/60
+ICURMN =ICURMN-ICURHH*60
+!
+print*, '%%% MNH2LPDM2_ECH Date et heure des donnees :'
+print 20300, ICURJJ,ICURMM,ICURAA,ICURHH,ICURMN,ICURSS
+20300 FORMAT(I2.2,'/',I2.2,'/',I4.4,' ',I2.1,'h',I2.1,'mn',I2.1,'sec')
+!
+!
+!
+!*	2.3 Lecture des champs Meso-NH de base.
+!
+CALL IO_Field_read(TPFILE,'UT',     XUT)
+CALL IO_Field_read(TPFILE,'VT',     XVT)
+CALL IO_Field_read(TPFILE,'WT',     XWT)
+CALL IO_Field_read(TPFILE,'THT',    XTHT)
+CALL IO_Field_read(TPFILE,'TKET',   XTKET)
+
+tzfield = tfieldmetadata(      &
+  cmnhname  = 'LM',            &
+  clongname = '',              &
+  cunits    = 'm',             &
+  cdir      = 'XY',            &
+  ccomment  = 'Mixing length', &
+  ngrid     = 1,               &
+  ntype     = TYPEREAL,        &
+  ndims     = 3                )
+CALL IO_Field_read(TPFILE, tzfield, XLM)
+
+tzfield = tfieldmetadata(&
+  cmnhname  = 'THW_FLX', &
+  clongname = '',        &
+  cunits    = 'K s-1',   & !correct?
+  cdir      = 'XY',      &
+  ccomment  = 'Conservative potential temperature vertical flux', &
+  ngrid     = 4,         &
+  ntype     = TYPEREAL,  &
+  ndims     = 3          )
+CALL IO_Field_read(TPFILE, tzfield, XWPTHP)
+
+tzfield = tfieldmetadata(   &
+  cmnhname  = 'DISS',       &
+  clongname = '',           &
+  cunits    = '',           & !TODO: set units
+  cdir      = 'XY',         &
+  ccomment  = 'X_Y_Z_DISS', &
+  ngrid     = 1,            &
+  ntype     = TYPEREAL,     &
+  ndims     = 3             )
+CALL IO_Field_read(TPFILE, tzfield, XDISSIP)
+
+tzfield = tfieldmetadata(   &
+  cmnhname  = 'FMU',        &
+  clongname = '',           &
+  cunits    = 'kg m-1 s-2', &
+  cdir      = 'XY',         &
+  ccomment  = 'X_Y_FMU',    &
+  ngrid     = 4,            &
+  ntype     = TYPEREAL,     &
+  ndims     = 2             )
+CALL IO_Field_read(TPFILE, tzfield, XSFU)
+
+tzfield = tfieldmetadata(   &
+  cmnhname  = 'FMV',        &
+  clongname = '',           &
+  cunits    = 'kg m-1 s-2', &
+  cdir      = 'XY',         &
+  ccomment  = 'X_Y_FMV',    &
+  ngrid     = 4,            &
+  ntype     = TYPEREAL,     &
+  ndims     = 2             )
+CALL IO_Field_read(TPFILE, tzfield, XSFV)
+
+CALL IO_Field_read(TPFILE,'INPRT',  XINRT)
+CALL IO_Field_read(TPFILE,'RVT',    XRMVT)
+CALL IO_Field_read(TPFILE,'RCT',    XRMCT)
+CALL IO_Field_read(TPFILE,'RRT',    XRMRT)
+!
+!              Lecture des donnees Meso-NH terminee.'
+!
+!*	2.4 Fermeture du fichier Meso-NH.
+!
+CALL IO_File_close(TPFILE)
+!
+!
+!*	3.  PREPARATION DES DONNEES.
+!	    ------------------------
+!
+!
+!*	3.2 Niveaux altitude "hors-sol" (1:NKMAX).
+!
+XSU(:,:,1:NKMAX) = XUT(NSIB:NSIE,NSJB:NSJE,NKB:NKE)
+XSV(:,:,1:NKMAX) = XVT(NSIB:NSIE,NSJB:NSJE,NKB:NKE)
+XSW(:,:,1:NKMAX) = XWT(NSIB:NSIE,NSJB:NSJE,NKB:NKE)
+XSTH(:,:,1:NKMAX) = XTHT(NSIB:NSIE,NSJB:NSJE,NKB:NKE)
+XSTKE(:,:,1:NKMAX) = XTKET(NSIB:NSIE,NSJB:NSJE,NKB:NKE)
+XSLM(:,:,1:NKMAX) = XLM(NSIB:NSIE,NSJB:NSJE,NKB:NKE)
+XSDISSIP(:,:,1:NKMAX) = XDISSIP(NSIB:NSIE,NSJB:NSJE,NKB:NKE)
+XSINRT(:,:) = XINRT(NSIB:NSIE,NSJB:NSJE)
+XSWPTHP(:,:,1:NKMAX) = XWPTHP(NSIB:NSIE,NSJB:NSJE,NKB:NKE)
+XSRMV(:,:,1:NKMAX) = XRMVT(NSIB:NSIE,NSJB:NSJE,NKB:NKE)
+XSRMC(:,:,1:NKMAX) = XRMCT(NSIB:NSIE,NSJB:NSJE,NKB:NKE)
+XSRMR(:,:,1:NKMAX) = XRMRT(NSIB:NSIE,NSJB:NSJE,NKB:NKE)
+XSSFU(:,:) = XSFU(NSIB:NSIE,NSJB:NSJE)
+XSSFV(:,:) = XSFV(NSIB:NSIE,NSJB:NSJE)
+!
+!
+!*	4.  CALCULS DES TEMPS LAGRANGIENS ET VARIANCES DU VENT POUR LPDM.
+!	    ------------------------------------------------------------
+!
+      XRVSRD  = XRV/XRD
+!
+      XSUSTAR (:,:)   = XUNDEF
+      XSLMO   (:,:)   = XUNDEF
+      XSHMIX  (:,:)   = XUNDEF
+      XSWSTAR (:,:)   = XUNDEF
+      XSSIGU  (:,:,:) = XUNDEF
+      XSSIGW  (:,:,:) = XUNDEF
+      XSTIMEU (:,:,:) = XUNDEF
+      XSTIMEW (:,:,:) = XUNDEF
+!
+      DO JI=1,NSIMAX ; DO JJ=1,NSJMAX
+        !
+        !* Temperature potentielle virtuelle.
+        !
+        XSTHETAV(:)=1.0+XSRMV(JI,JJ,:)+XSRMC(JI,JJ,:)+XSRMR(JI,JJ,:)
+        XSTHETAV(:) = XSTH(JI,JJ,:)*(1.0+XSRMV(JI,JJ,:)*XRVSRD)/XSTHETAV(:)
+        !
+        !* ZHMIX Hauteur de melange.
+        !
+        XTHSOL       = XSTHETAV(1)+0.5
+        XSHMIX(JI,JJ) = 0.0
+        DO JK=2,NKMAX
+           IF ( XSTHETAV(JK).GT.XTHSOL ) THEN
+              XSHMIX(JI,JJ)     = XSHAUT  (JK-1)  &
+                +( XSHAUT  (JK) - XSHAUT  (JK-1) )  &
+                /( XSTHETAV(JK) - XSTHETAV(JK-1) )  &
+                *( XTHSOL      - XSTHETAV(JK-1) )
+              EXIT
+           ENDIF
+        END DO
+        XSHMIX(JI,JJ)=MAX(XSHMIX(JI,JJ),50.0)
+
+        !
+        !* XSUSTAR Vitesse de frottement.
+        !
+        XSUSTAR(JI,JJ) = XSSFU(JI,JJ)*XSSFU(JI,JJ) &
+                        +XSSFV(JI,JJ)*XSSFV(JI,JJ)
+        XSUSTAR(JI,JJ) = SQRT(SQRT(XSUSTAR(JI,JJ)))
+        !
+        !
+        !
+        !* XSLMO Longueur de Monin-Obukhov.
+        !
+        IF (XSWPTHP(JI,JJ,1).NE.0.) THEN
+         XSLMO(JI,JJ)= -XSTHETAV(1)*(XSUSTAR(JI,JJ)**3) &
+                     / (XKARMAN*XG*XSWPTHP(JI,JJ,1))
+        ENDIF
+        !
+        !
+        !* XSWSTAR Vitesse Verticale Convective.
+        !
+        XSWSTAR(JI,JJ)=XG/XSTHETAV(1)*XSWPTHP(JI,JJ,1)*XSHMIX(JI,JJ)
+        XSWSTAR(JI,JJ)=SIGN(1.,XSWSTAR(JI,JJ)) &
+                               * ( ABS(XSWSTAR(JI,JJ))**(1./3.))
+        !
+        !
+        IF (CTURBPARAM=="HANNA".OR.CTURBPARAM=="HANNABIS") THEN
+        !
+        IF ((XSLMO(JI,JJ).GT.0).AND.(XSLMO(JI,JJ).LE.300)) THEN
+           !
+           !* Conditions stables.
+           !
+           !*	XSSIGU,XSSIGW <u'2>**0.5, <w'2>**0.5
+           DO JK=1,NKMAX
+           IF (XSHAUT(JK).LT.XSHMIX(JI,JJ)) THEN
+           XSSIGU(JI,JJ,JK) = SQRT( 0.5 *                              &
+                ((2.0*(1-XSHAUT(JK)/XSHMIX(JI,JJ))*XSUSTAR(JI,JJ))**2) &
+              + ((1.3*(1-XSHAUT(JK)/XSHMIX(JI,JJ))*XSUSTAR(JI,JJ))**2) )
+           XSSIGW(JI,JJ,JK) = 1.3*(1-XSHAUT(JK)/XSHMIX(JI,JJ))         &
+                             *XSUSTAR(JI,JJ)
+           ELSE
+           XSSIGU(JI,JJ,JK) = 0.001
+           XSSIGW(JI,JJ,JK) = 0.001
+           ENDIF
+           ENDDO
+           ! 
+           XSSIGU(JI,JJ,:)=MAX(0.001,XSSIGU(JI,JJ,:))
+           XSSIGW(JI,JJ,:)=MAX(0.001,XSSIGW(JI,JJ,:))
+           !
+           !* Lagrangian time scale
+           XSTIMEU(JI,JJ,:) = 0.11*XSHMIX(JI,JJ)/XSSIGU(JI,JJ,:)  &
+                             *SQRT( XSHAUT(:)/XSHMIX(JI,JJ) )
+           XSTIMEW(JI,JJ,:) = 0.10*XSHMIX(JI,JJ)/XSSIGW(JI,JJ,:)  &
+                             *( XSHAUT(:)/XSHMIX(JI,JJ) )**0.8
+           !
+           !
+        ENDIF
+        !
+        !
+        IF (ABS(XSLMO(JI,JJ)).GT.300) THEN
+           !
+           !* Conditions neutres.
+           !
+           !* XSSIGU,XSSIGW <u'2>**0.5, <w'2>**0.5
+           XSSIGU(JI,JJ,:)=SQRT( 0.5 *                                &
+        ((2.0*XSUSTAR(JI,JJ)*EXP(-3*XSCORIOZ(JI,JJ)*XSHAUT(:)/XSUSTAR(JI,JJ)))**2)  &
+     +  ((1.3*XSUSTAR(JI,JJ)*EXP(-2*XSCORIOZ(JI,JJ)*XSHAUT(:)/XSUSTAR(JI,JJ)))**2) )
+           XSSIGW(JI,JJ,:)=1.3*XSUSTAR(JI,JJ)*EXP(-2*XSCORIOZ(JI,JJ)*XSHAUT(:)/XSUSTAR(JI,JJ))
+           XSSIGU(JI,JJ,:)=MAX(0.001,XSSIGU(JI,JJ,:))
+           XSSIGW(JI,JJ,:)=MAX(0.001,XSSIGW(JI,JJ,:))
+           !
+           !* lagrangian time scale
+           XSTIMEU(JI,JJ,:) = 0.5*XSHAUT(:)/   &
+                 (XSSIGW(JI,JJ,:)*(1.+15.0*XSCORIOZ(JI,JJ)*XSHAUT(:)/XSUSTAR(JI,JJ)))
+           XSTIMEW(JI,JJ,:) = XSTIMEU(JI,JJ,:)
+           !
+        ENDIF 
+        !
+        ! 
+        IF ((XSLMO(JI,JJ).LT.0).AND.(XSLMO(JI,JJ).GE.-300)) THEN
+           !
+           !* Conditions instables.
+           !
+           !* XSSIGU,XSSIGW <u'2>**0.5, <w'2>**0.5
+           ! 
+           IF (CTURBPARAM=="HANNA") THEN
+           !
+             DO JK=1,NKMAX
+             IF (XSHAUT(JK).LE.XSHMIX(JI,JJ)) THEN
+             XSSIGU(JI,JJ,JK)=XSUSTAR(JI,JJ)         &
+                        * (12+0.5*XSHMIX(JI,JJ)/ABS(XSLMO(JI,JJ)))**(1./3.)
+             ELSE
+             XSSIGU(JI,JJ,JK)=0.001
+             ENDIF
+             ENDDO
+             ! 
+             DO JK=1,NKMAX
+             !IF (XSHAUT(JK).LE.XSHMIX(JI,JJ)) THEN
+             !  XSSIGW(JI,JJ,JK)=SQRT(  1.2*XSWSTAR(JI,JJ)**2 &
+             !               *(1-0.9*XSHAUT(JK)/XSHMIX(JI,JJ)) &
+             !               *(XSHAUT(JK)/XSHMIX(JI,JJ))**(2/3) &
+             !            +   (1.8-1.4*XSHAUT(JK)/XSHMIX(JI,JJ)) &
+             !               *XSUSTAR(JI,JJ)**2 )  
+             !ELSE
+             IF (XSHAUT(JK).LE.0.4*XSHMIX(JI,JJ)) THEN
+               XSSIGW(JI,JJ,JK)=0.763*(XSHAUT(JK)/XSHMIX(JI,JJ))**0.175
+             ELSE IF (XSHAUT(JK).LE.0.96*XSHMIX(JI,JJ)) THEN
+               XSSIGW(JI,JJ,JK)=0.722*XSWSTAR(JI,JJ)* &
+                                (1-XSHAUT(JK)/XSHMIX(JI,JJ))**0.207
+             ELSE IF (XSHAUT(JK).LE.XSHMIX(JI,JJ)) THEN
+               XSSIGW(JI,JJ,JK)=0.37*XSWSTAR(JI,JJ)
+             ELSE
+               XSSIGW(JI,JJ,JK)=0.001
+             ENDIF
+             ENDDO
+             !
+             XSSIGU(JI,JJ,:)=MAX(0.001,XSSIGU(JI,JJ,:))
+             XSSIGW(JI,JJ,:)=MAX(0.001,XSSIGW(JI,JJ,:))
+             !
+             !* Lagrangian time scale
+             XSTIMEU(JI,JJ,:) = 0.15*XSHMIX(JI,JJ)/XSSIGU(JI,JJ,:)
+             DO JK=1,NKMAX
+                 IF (XSHAUT(JK).LE.(0.1*XSHMIX(JI,JJ))) THEN
+                   IF ( XSHAUT(JK).LT.(XSZ0(JI,JJ)-XSLMO(JI,JJ)) ) THEN
+                     XSTIMEW(JI,JJ,JK) = 0.1*XSHAUT(JK)/XSSIGW(JI,JJ,JK)   &
+                      / ( 0.55 - 0.38*(XSHAUT(JK)-XSZ0(JI,JJ))/ABS(XSLMO(JI,JJ)))
+                   ELSE
+                     XSTIMEW(JI,JJ,JK) = 0.59*XSHAUT(JK)/XSSIGW(JI,JJ,JK)
+                   ENDIF
+                 ELSE
+                     XSTIMEW(JI,JJ,JK) = 0.15*XSHMIX(JI,JJ)/XSSIGW(JI,JJ,JK) &
+                   *( 1.-EXP(-5*XSHAUT(JK)/XSHMIX(JI,JJ)) )
+                 ENDIF
+             END DO
+           !
+           ELSE IF (CTURBPARAM=="HANNABIS") THEN
+             !* sigmas
+             XSSIGW(JI,JJ,:) = SQRT(2./3.*XSTKE(JI,JJ,:))
+             XSSIGU(JI,JJ,:) = XSSIGW(JI,JJ,:)
+             !* Temps Lagrangien
+             DO JK=1,NKMAX
+               IF (XSHAUT(JK).LE.XSHMIX(JI,JJ)) THEN
+               XSTIMEU(JI,JJ,JK)=0.17*XSHMIX(JI,JJ)/XSSIGU(JI,JJ,JK)
+               XSTIMEW(JI,JJ,JK)=0.2*XSHMIX(JI,JJ)/XSSIGW(JI,JJ,JK)* &
+               (1-EXP(-4*XSHAUT(JK)/XSHMIX(JI,JJ)) &
+                 -0.0003*EXP(8*XSHAUT(JK)/XSHMIX(JI,JJ)))
+               ELSE IF (XSHAUT(JK).LE.XSHMIX(JI,JJ)*1.2) THEN
+               XSTIMEU(JI,JJ,JK)= &
+                (1-(XSHAUT(JK)-XSHAUT(JK-1))/(XSHAUT(JK+1)-XSHAUT(JK-1)))* &
+                XSTIMEU(JI,JJ,JK-1) &
+                +(XSHAUT(JK)-XSHAUT(JK-1))/(XSHAUT(JK+1)-XSHAUT(JK-1))*10000.0
+               XSTIMEW(JI,JJ,JK)= &
+                (1-(XSHAUT(JK)-XSHAUT(JK-1))/(XSHAUT(JK+1)-XSHAUT(JK-1)))* &
+                XSTIMEW(JI,JJ,JK-1)  &
+                +(XSHAUT(JK)-XSHAUT(JK-1))/(XSHAUT(JK+1)-XSHAUT(JK-1))*10000.0
+               ELSE
+               XSTIMEU(JI,JJ,JK)=10000.0
+               XSTIMEW(JI,JJ,JK)=10000.0
+               ENDIF
+             ENDDO
+             !
+           ENDIF ! CTURBPARAM=HANNA ou HANNABIS
+           !  
+        ENDIF ! instable
+        !
+        ELSE ! CTURBPARAM=="ISOTROPE"
+          !
+          !*	XSSIGU,XSSIGW <u'2>**0.5, <w'2>**0.5
+          !
+          XSSIGW(JI,JJ,:) = SQRT(2./3.*XSTKE(JI,JJ,:))
+          XSSIGU(JI,JJ,:) = XSSIGW(JI,JJ,:)
+          !
+          !* Lagrangian time scale
+          DO JK=1,NKMAX
+            IF (XSHAUT(JK).LE.XSHMIX(JI,JJ)) THEN
+            XSTIMEU(JI,JJ,JK)=ABS(2*(XSSIGU(JI,JJ,JK)**2)/(3*XSDISSIP(JI,JJ,JK)))
+            XSTIMEW(JI,JJ,JK)=ABS(2*(XSSIGW(JI,JJ,JK)**2)/(3*XSDISSIP(JI,JJ,JK)))
+            ELSE IF (XSHAUT(JK).LE.XSHMIX(JI,JJ)*1.2) THEN
+            XSTIMEU(JI,JJ,JK)= &
+            (1-(XSHAUT(JK)-XSHAUT(JK-1))/(XSHAUT(JK+1)-XSHAUT(JK-1)))*XSTIMEU(JI,JJ,JK-1) &
+           +(XSHAUT(JK)-XSHAUT(JK-1))/(XSHAUT(JK+1)-XSHAUT(JK-1))*1000.0
+            XSTIMEW(JI,JJ,JK)=XSTIMEU(JI,JJ,JK)
+            ELSE
+            XSTIMEU(JI,JJ,JK)=1000.0
+            XSTIMEW(JI,JJ,JK)=1000.0
+            ENDIF
+          ENDDO
+          !
+        ENDIF
+        !
+        !
+     END DO
+  END DO
+  !
+     IF (IGRILLE.EQ.2) THEN
+     WRITE(YFTURB,'("TURB_LPDM",5I2.2)') ICURAA,ICURMM,ICURJJ,ICURHH,ICURMN
+     CALL IO_File_add2list(TZFILE,YFTURB,'TXT','WRITE')
+     CALL IO_File_open(TZFILE)
+     IFTURB = TZFILE%NLU
+     WRITE(UNIT=IFTURB,FMT='(5A12)') "WSTAR       ","USTAR       ", &
+                                     "HMIX        ","LMO         ", &
+                                     "WPTHP"
+     WRITE(UNIT=IFTURB,FMT='(5F12.5)') XSWSTAR(15,15),XSUSTAR(15,15), &
+                                       XSHMIX(15,15),XSLMO(15,15),    &
+                                       XSWPTHP(15,15,1)
+
+
+     WRITE(UNIT=IFTURB,FMT='(8A12)') "HAUT          ","TKE           ", &
+                                     "DISS          ","THETA         ", &
+                                     "SIGU          ","SIGW          ", &
+                                     "TIMEU         ","TIMEW         "
+     DO JK=1,NKMAX
+     WRITE(UNIT=IFTURB,FMT='(6F12.5,2F12.1)') XSHAUT(JK),XSTKE(15,15,JK), &
+                                    XSDISSIP(15,15,JK),XSTH(15,15,JK), &
+                                    XSSIGU(15,15,JK),XSSIGW(15,15,JK), &
+                                    XSTIMEU(15,15,JK),XSTIMEW(15,15,JK)
+  
+     ENDDO
+     CALL IO_File_close(TZFILE)
+     ENDIF
+!
+               
+
+!
+!*	5.  ECRITURES FIC MTO.
+!	    ------------------
+!
+!
+DO JK = 1,NKMAX
+WRITE(IFMTO) XSU(:,:,JK)        ! Composante zonale du vent.
+ENDDO
+DO JK = 1,NKMAX
+WRITE(IFMTO) XSV(:,:,JK)        ! Composante meridienne du vent.
+ENDDO
+DO JK = 1,NKMAX
+WRITE(IFMTO) XSW(:,:,JK)        ! Vitesse verticale.
+ENDDO
+DO JK = 1,NKMAX
+WRITE(IFMTO) XSTH(:,:,JK)     ! Temperature potentielle.
+ENDDO
+DO JK = 1,NKMAX
+WRITE(IFMTO) XSTKE(:,:,JK)       ! Energie cinetique Turbulence
+ENDDO
+DO JK = 1,NKMAX
+WRITE(IFMTO) (XSSIGU(:,:,JK))**2       ! SigmaU
+ENDDO
+DO JK = 1,NKMAX
+WRITE(IFMTO) (XSSIGU(:,:,JK))**2       ! SigmaV
+ENDDO
+DO JK = 1,NKMAX
+WRITE(IFMTO) (XSSIGW(:,:,JK))**2       ! SigmaW
+ENDDO
+DO JK = 1,NKMAX
+WRITE(IFMTO) XSTIMEU(:,:,JK)       ! Temps lagrangien U
+ENDDO
+DO JK = 1,NKMAX
+WRITE(IFMTO) XSTIMEU(:,:,JK)       ! Temps lagrangien V
+ENDDO
+DO JK = 1,NKMAX
+WRITE(IFMTO) XSTIMEW(:,:,JK)       ! Dissipation de TKE
+ENDDO
+WRITE(IFMTO) XSINRT
+!
+END SUBROUTINE MNH2LPDM_ECH
diff --git a/src/PHYEX/ext/mnh2lpdm_ini.f90 b/src/PHYEX/ext/mnh2lpdm_ini.f90
new file mode 100644
index 0000000000000000000000000000000000000000..a18acfcbec58726cee80ab7c9f92620c6b5c96bd
--- /dev/null
+++ b/src/PHYEX/ext/mnh2lpdm_ini.f90
@@ -0,0 +1,459 @@
+!MNH_LIC Copyright 2009-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.
+!-----------------------------------------------------------------------
+!     ######spl
+        SUBROUTINE MNH2LPDM_INI(TPFILE1,TPFILE2,TPLOGFILE,TPGRIDFILE,TPDATEFILE)
+!--------------------------------------------------------------------------
+!* MNH2S2_INI    : INITIALISATION DU COUPLAGE MESO-NH / LPDM.
+!
+!  Auteur        : Francois BONNARDOT, DP/SERV/ENV
+!  Creation      : 04.01.2009 (mnh2s2_ini.f90)
+!
+!
+!	Arguments explicites.
+!	---------------------
+! TPFILE1,TPFILE2 First and last files to treat
+! TPLOGFILE       Log file
+! TPGRIDFILE      Grid file
+! TPDATEFILE      Date file
+!
+! Modifications:
+!  P. Wautelet 05/2016-04/2018: new data structures and calls for I/O
+!  P. Wautelet 26/04/2019: replace non-standard FLOAT function by REAL function
+!  P. Wautelet 05/11/2020: correct I/O of MNH2LPDM
+!--------------------------------------------------------------------------
+!
+!
+!
+!*	0.  INITIALISATION.
+!	    ---------------
+!
+!*	0.1 Modules.
+!
+USE MODD_CST
+USE MODD_DIM_n
+use modd_field,         only: tfieldmetadata, TYPEREAL
+USE MODD_GRID
+USE MODD_GRID_n
+USE MODD_IO,            ONLY: TFILEDATA
+USE MODD_LUNIT
+USE MODD_MNH2LPDM
+USE MODD_PARAMETERS
+USE MODD_TIME
+USE MODD_TIME_n
+!
+USE MODE_DATETIME
+USE MODE_GRIDPROJ
+USE MODE_IO_FILE,       only: IO_File_close, IO_File_open
+USE MODE_IO_FIELD_READ, only: IO_Field_read
+USE MODE_MODELN_HANDLER
+!
+USE MODE_INI_CST, ONLY: INI_CST
+USE MODI_READ_HGRID
+USE MODI_XYTOLATLON
+!
+!*	0.2 Arguments.
+!
+IMPLICIT NONE
+!
+TYPE(TFILEDATA),POINTER,INTENT(INOUT) :: TPFILE1,TPFILE2
+TYPE(TFILEDATA),POINTER,INTENT(IN)    :: TPLOGFILE
+TYPE(TFILEDATA),POINTER,INTENT(IN)    :: TPGRIDFILE
+TYPE(TFILEDATA),POINTER,INTENT(IN)    :: TPDATEFILE
+!
+!
+!*	0.3 Variables locales.
+!
+CHARACTER(LEN=28)     :: YNAME,YDAD     ! Noms du FM et de son papa.
+CHARACTER(LEN=2)      :: YSTORAGE       ! Type de variable.
+!
+REAL                  :: ZECHEANCE1,ZECHEANCE2     ! dist temp date modele - date courante
+INTEGER               :: IHHMDL,IMNMDL,ISSMDL ! h - mn - s du model
+INTEGER               :: IHHCUR1,IMNCUR1,ISSCUR1
+INTEGER               :: IHHCUR2,IMNCUR2,ISSCUR2
+CHARACTER(LEN=14)     :: YDATMDL,YDATCUR1,YDATCUR2
+!
+REAL                  :: XLATOR,XLONOR,XPTLAT,XPTLON
+REAL                  :: XXPTSOMNH,XYPTSOMNH
+INTEGER               :: JI,JJ,JK,a
+INTEGER               :: b,c,I
+INTEGER, DIMENSION(:),   ALLOCATABLE   :: TAB1D
+INTEGER, DIMENSION(:,:), ALLOCATABLE   :: TAB2D
+TYPE(DATE_TIME)         :: TZDTCUR1,TZDTCUR2,TZDTEXP1
+INTEGER                :: IFDAT,IFGRI,IFLOG
+type(tfieldmetadata)   :: tzfield
+!
+!
+!
+!*	1.  INITIALISATION.
+!	    ---------------
+!
+IFDAT = TPDATEFILE%NLU
+IFGRI = TPGRIDFILE%NLU
+IFLOG = TPLOGFILE%NLU
+!
+CALL INI_CST
+!
+CALL GOTO_MODEL(1)
+!
+!
+!*	2.  DONNEES MESO-NH.
+!	    ----------------
+!
+!*	2.1 Ouverture du fichier Meso-NH.
+!
+CALL IO_File_open(TPFILE1)
+CALL IO_File_open(TPFILE2)
+!
+!
+!*      2.2 Date et heure du modele.
+!
+CALL IO_Field_read(TPFILE1,'DTEXP',TZDTEXP1)
+CALL IO_Field_read(TPFILE1,'DTCUR',TZDTCUR1)
+CALL IO_Field_read(TPFILE2,'DTCUR',TZDTCUR2)
+!
+CALL DATETIME_DISTANCE(TZDTEXP1,TZDTCUR1,ZECHEANCE1)
+CALL DATETIME_DISTANCE(TZDTEXP1,TZDTCUR2,ZECHEANCE2)
+!
+IHHMDL=INT(TZDTEXP1%xtime/3600)
+IMNMDL=INT((TZDTEXP1%xtime-IHHMDL*3600)/60)
+ISSMDL=INT(TZDTEXP1%xtime-IHHMDL*3600-IMNMDL*60)
+IHHCUR1=INT(TZDTCUR1%xtime/3600)
+IMNCUR1=INT((TZDTCUR1%xtime-IHHCUR1*3600)/60)
+ISSCUR1=INT(TZDTCUR1%xtime-IHHCUR1*3600-IMNCUR1*60)
+IHHCUR2=INT(TZDTCUR2%xtime/3600)
+IMNCUR2=INT((TZDTCUR2%xtime-IHHCUR2*3600)/60)
+ISSCUR2=INT(TZDTCUR2%xtime-IHHCUR2*3600-IMNCUR2*60)
+!
+WRITE(YDATMDL, '(I4.4,5I2.2)') TZDTEXP1%nyear, TZDTEXP1%nmonth, TZDTEXP1%nday, &
+                               IHHMDL, IMNMDL, ISSMDL
+WRITE(YDATCUR1,'(I4.4,5I2.2)') TZDTCUR1%nyear, TZDTCUR1%nmonth, TZDTCUR1%nday, &
+                               IHHCUR1, IMNCUR1, ISSCUR1
+WRITE(YDATCUR2,'(I4.4,5I2.2)') TZDTCUR2%nyear, TZDTCUR2%nmonth, TZDTCUR2%nday, &
+                               IHHCUR2, IMNCUR2, ISSCUR2
+! 
+NMDLAA=MOD( TZDTEXP1%nyear, 100 )  ! Annee arrondi a 2 chiffres.
+NMDLMM=TZDTEXP1%nmonth
+NMDLJJ=TZDTEXP1%nday
+NMDLSS=NINT(TZDTEXP1%xtime)
+!
+!*	Heure du modele arrondie a 5 minutes pres.
+!
+NMDLMN = NINT( (REAL(NMDLSS)/60.0)/5.0 )*5
+NMDLSS = 0
+NMDLHH =NMDLMN/60
+NMDLMN =NMDLMN-NMDLHH*60
+!
+!*	2.3 Grille horizontale.
+!
+CALL READ_HGRID(1,TPFILE1,YNAME,YDAD,YSTORAGE)
+IF (YNAME == YDAD) THEN
+IGRILLE=1
+ELSE
+IGRILLE=2
+ENDIF
+print*,IGRILLE
+!
+! Lecture grille horizontale
+!
+NIU=NIMAX+2*JPHEXT
+NJU=NJMAX+2*JPHEXT
+NIB=1+JPHEXT
+NJB=1+JPHEXT
+NIE=NIU-JPHEXT
+NJE=NJU-JPHEXT
+!
+!
+!*	2.4 Nombre de niveaux-verticaux.
+!
+CALL IO_Field_read(TPFILE1,'KMAX',NKMAX)
+!WRITE(IFLOG,*) '%%% MNH2S2_INI Lecture du nombre de niveau OK.'
+!
+NKU = NKMAX+2*JPVEXT
+NKB = 1+JPVEXT
+NKE = NKU-JPVEXT
+!
+!
+!*	2.5 Allocations Meso-NH.
+!
+ALLOCATE( XZHAT(NKU) )
+ALLOCATE( XZS(NIU,NJU) )
+ALLOCATE( XZ0(NIU,NJU) )
+ALLOCATE( XUT(NIU,NJU,NKU))
+ALLOCATE( XVT(NIU,NJU,NKU))
+ALLOCATE( XWT(NIU,NJU,NKU))
+ALLOCATE( XTHT(NIU,NJU,NKU))
+ALLOCATE( XTKET(NIU,NJU,NKU))
+ALLOCATE( XLM(NIU,NJU,NKU))
+ALLOCATE( XDISSIP(NIU,NJU,NKU))
+ALLOCATE( XWPTHP(NIU,NJU,NKU))
+ALLOCATE( XRMVT(NIU,NJU,NKU))
+ALLOCATE( XRMCT(NIU,NJU,NKU))
+ALLOCATE( XRMRT(NIU,NJU,NKU))
+ALLOCATE( XINRT(NIU,NJU))
+ALLOCATE( XSFU(NIU,NJU))
+ALLOCATE( XSFV(NIU,NJU))
+!
+!*	2.6 Decoupage vertical.
+!
+CALL IO_Field_read(TPFILE1,'ZHAT',XZHAT)
+CALL IO_Field_read(TPFILE1,'ZTOP',XZTOP)
+!
+!*	2.7 Orographie. 
+!
+CALL IO_Field_read(TPFILE1,'ZS',XZS)
+!
+!*	2.8 Rugosite Z0. 
+!
+tzfield = tfieldmetadata( &
+  cmnhname  = 'Z0',       &
+  clongname = '',         &
+  cunits    = 'm',        &
+  cdir      = 'XY',       &
+  ccomment  = 'X_Y_Z0',   &
+  ngrid     = 4,          &
+  ntype     = TYPEREAL,   &
+  ndims     = 2           )
+CALL IO_Field_read(TPFILE1,tzfield,XZ0)
+!
+XXPTSOMNH=XXHAT(1)+(XXHAT(2)-XXHAT(1))/2
+XYPTSOMNH=XYHAT(1)+(XYHAT(2)-XYHAT(1))/2
+CALL SM_LATLON(XLATORI,XLONORI,XXPTSOMNH,XYPTSOMNH,XLATOR,XLONOR)
+!
+!*	2.9  DOMAINE D'EXTRACTION.
+!	    ---------------------
+!
+NSIB   = NIB
+NSIE   = NIE
+NSJB   = NJB
+NSJE   = NJE
+!
+NSIMAX = NSIE-NSIB+1
+NSJMAX = NSJE-NSJB+1
+!
+!
+!*	3. Impression de controle Meso-NH.
+!	    -------------------------------
+!
+!           Domaine horizontal Meso-NH.
+!modif 12.2014 : passage a 1 seul domaine MesoNH
+!           ---------------------------
+WRITE(IFLOG,'(I1,a12)') IGRILLE,'      ngrid '
+!WRITE(IFLOG,'(a13)') '2      ngrids'
+WRITE(IFLOG,'(a13)') '1      ngrids'
+WRITE(IFLOG,'(i4,3x,a6)') NSIMAX,'nx    '
+WRITE(IFLOG,'(i4,3x,a6)') NSJMAX,'ny    '
+WRITE(IFLOG,'(i4,3x,a6)') NKU-2,'nz    '
+WRITE(IFLOG,'(i4,3x,a6)') NKU-3,'nzg   ' 
+WRITE(IFLOG,'(a13)') '12     npatch'
+WRITE(IFLOG,'(a13)') '0      icloud'
+WRITE(IFLOG,'(a11)') '0.0  wlon  '
+WRITE(IFLOG,'(a11)') '45.0 rnlat '
+WRITE(IFLOG,'(f10.1,3x,a6)') XZHAT(NKE),'s     '
+WRITE(IFLOG,'(f8.0,a8)') ZECHEANCE1,'  time1 '
+WRITE(IFLOG,'(f8.0,a8)') ZECHEANCE2,'  time2 '
+WRITE(IFLOG,'(a13)') '3600    dtmet '
+WRITE(IFLOG,'(a13)') 'm       tunits'
+WRITE(IFLOG,'(a13)') '12     nvout '
+WRITE(IFLOG,'(6x,a8,i4)') 'u       ',1
+WRITE(IFLOG,'(6x,a8,i4)') 'v       ',1
+WRITE(IFLOG,'(6x,a8,i4)') 'w       ',1
+WRITE(IFLOG,'(6x,a8,i4)') 'tp      ',1
+WRITE(IFLOG,'(6x,a8,i4)') 'tke     ',1
+WRITE(IFLOG,'(6x,a8,i4)') 'uu      ',1
+WRITE(IFLOG,'(6x,a8,i4)') 'vv      ',1
+WRITE(IFLOG,'(6x,a8,i4)') 'ww      ',1
+WRITE(IFLOG,'(6x,a8,i4)') 'tlx     ',1
+WRITE(IFLOG,'(6x,a8,i4)') 'tly     ',1
+WRITE(IFLOG,'(6x,a8,i4)') 'tlz     ',1
+WRITE(IFLOG,'(6x,a8,i4)') 'intopr  ',1
+WRITE(IFLOG,*) '  grid structure'
+!
+!*	4.  FICHIER METEO.
+!	    --------------
+!
+!*	4.1 Allocations.
+!
+ALLOCATE( XSHAUT(NKMAX))
+ALLOCATE( XSREL(NSIMAX,NSJMAX) )
+ALLOCATE( XSZ0(NSIMAX,NSJMAX) )
+ALLOCATE( XSCORIOZ (NSIMAX,NSJMAX) )
+ALLOCATE( XSPHI(NSIMAX,NSJMAX,NKMAX) )
+ALLOCATE( XSU(NSIMAX,NSJMAX,NKMAX))
+ALLOCATE( XSV(NSIMAX,NSJMAX,NKMAX))
+ALLOCATE( XSW(NSIMAX,NSJMAX,NKMAX))
+ALLOCATE( XSTH(NSIMAX,NSJMAX,NKMAX))
+ALLOCATE( XSTKE(NSIMAX,NSJMAX,NKMAX))
+ALLOCATE( XSLM(NSIMAX,NSJMAX,NKMAX))
+ALLOCATE( XSDISSIP(NSIMAX,NSJMAX,NKMAX))
+ALLOCATE( XSWPTHP(NSIMAX,NSJMAX,NKMAX))
+ALLOCATE( XSRMV(NSIMAX,NSJMAX,NKMAX))
+ALLOCATE( XSRMC(NSIMAX,NSJMAX,NKMAX))
+ALLOCATE( XSRMR(NSIMAX,NSJMAX,NKMAX))
+ALLOCATE( XSINRT(NSIMAX,NSJMAX))
+ALLOCATE( XSSFU(NSIMAX,NSJMAX))
+ALLOCATE( XSSFV(NSIMAX,NSJMAX))
+ALLOCATE( XSTIMEW(NSIMAX,NSJMAX,NKMAX))
+ALLOCATE( XSTIMEU(NSIMAX,NSJMAX,NKMAX))
+ALLOCATE( XSSIGW(NSIMAX,NSJMAX,NKMAX))
+ALLOCATE( XSSIGU(NSIMAX,NSJMAX,NKMAX))
+ALLOCATE( XSUSTAR(NSIMAX,NSJMAX))
+ALLOCATE( XSWSTAR(NSIMAX,NSJMAX))
+ALLOCATE( XSHMIX(NSIMAX,NSJMAX))
+ALLOCATE( XSLMO(NSIMAX,NSJMAX))
+ALLOCATE( XSTHETAV(NKMAX))
+
+!
+!   4.2.    Nombre de niveaux en Z
+!
+XSHAUT(1:NKMAX) = (XZHAT(NKB:NKE)+XZHAT(NKB+1:NKE+1))/2.
+print*,"niveaux hauteur"
+DO JK=1,NKMAX
+print*,XSHAUT(JK)
+ENDDO
+!
+!   4.3.    Calcul du tableau contenant les coef. de coriolis de la grille
+!
+DO JI=NSIB,NSIE ; DO JJ=NSJB,NSJE
+   CALL SM_LATLON(XLATORI,XLONORI,XXHAT(JI),XYHAT(JJ),XPTLAT,XPTLON)
+   XSCORIOZ(JI-1,JJ-1)=2.*XOMEGA*SIN(XPTLAT*XPI/180.)
+ENDDO ; ENDDO
+!
+!
+!* 4.4 Geometrie de la grille et positionnement.
+!
+!
+! On a besoin du point sud-ouest, c'est-a-dire de l'angle inferieur gauche
+! du domaine physique de la maille "en bas a gauche". Ca tombe bien, on
+! va travailler avec les XXHAT et les XYHAT directement.
+!
+XPASXM = XXHAT(2)-XXHAT(1)     ! Pas selon X en metres.
+XPASYM = XYHAT(2)-XYHAT(1)     ! Pas selon Y en metres.
+ZMAILLE = MAX(XPASXM,XPASYM)
+!
+!* 4.5 Constantes et champs constants.
+!
+!* Relief.
+!
+XSREL(:,:)  =  XZS(NSIB:NSIE,NSJB:NSJE)
+!
+!* Geopotentiel PHI
+!
+print*,"Geopotentiel"
+DO JK=1,NKMAX
+XSPHI(:,:,JK) = (XSREL(:,:)+XSHAUT(JK))*XG
+print*,MINVAL(XSPHI(:,:,JK)),MAXVAL(XSPHI(:,:,JK))
+ENDDO
+!
+!* Rugosite.
+!
+XSZ0(:,:)  =  XZ0(NSIB:NSIE,NSJB:NSJE)
+print*,"Rugosite"
+print*,MINVAL(XSZ0),MAXVAL(XSZ0)
+!
+!* 5   FICHIER DATES.
+!      -------------
+!
+WRITE(IFDAT,'(A14)') YDATMDL 
+WRITE(IFDAT,'(A14)') YDATCUR1 
+WRITE(IFDAT,'(A14)') YDATCUR2
+!
+!* 5.  FICHIER GRILLE.
+!      --------------
+!
+!
+!* 5.1 Infos franchement utiles.
+!
+WRITE(IFGRI,'(F15.8,1X,A)') &
+                  XLON0,   'XLON0   Longitude reference (deg.deci.)'
+WRITE(IFGRI,'(F15.8,1X,A)') &
+                  XLAT0,   'XLAT0   Latitude  reference (deg.deci.)'
+WRITE(IFGRI,'(F15.8,1X,A)') &
+                  XBETA,   'XBETA   Rotation  grille    (deg.deci.)'
+WRITE(IFGRI,'(F15.8,1X,A)') XRPK,    'XRPK    Facteur de conicite'
+WRITE(IFGRI,'(F15.8,1X,A)') &
+                  XLONOR,  'XLONOR  Longitude origine   (deg.deci.)'
+WRITE(IFGRI,'(F15.8,1X,A)') &
+                  XLATOR,  'XLATOR  Latitude  origine   (deg.deci.)'
+WRITE(IFGRI,'(F15.1,1X,A)') XXHAT(1),'XHAT(1) Coord. Cartesienne  (m)'
+WRITE(IFGRI,'(F15.1,1X,A)') XXHAT(2),'XHAT(2) Coord. Cartesienne  (m)'
+WRITE(IFGRI,'(F15.1,1X,A)') XYHAT(1),'YHAT(1) Coord. Cartesienne  (m)'
+WRITE(IFGRI,'(F15.1,1X,A)') XYHAT(2),'YHAT(2) Coord. Cartesienne  (m)'
+!
+print*,"GRILLE"
+print*,"LON0 : ",XLON0
+print*,"LAT0 : ",XLAT0
+print*,"BETA : ",XBETA
+print*,"RPK  : ",XRPK
+print*,"LONOR: ",XLONOR
+print*,"LATOR: ",XLATOR
+!
+!* 5.2  Points de grille x y z zg
+!
+WRITE(IFLOG,*)NSIMAX,' gridpoints in x direction'
+WRITE(IFLOG,'(8f10.0)')XXHAT(NSIB:NSIE)
+WRITE(IFLOG,*)NSJMAX,' gridpoints y direction'
+WRITE(IFLOG,'(8f10.0)')XYHAT(NSJB:NSJE)
+WRITE(IFLOG,*)NKMAX,'  main gridpoints in z direction'
+WRITE(IFLOG,'(8f10.2)')XSHAUT(1:NKMAX)
+WRITE(IFLOG,'(i4,3x,a38)')NKU-2,'intermediate gridpoints in z direction'
+WRITE(IFLOG,'(8f10.2)')XZHAT(2:NKU-1)
+WRITE(IFLOG,*)'   =================================================='
+!
+!     Topographie
+!
+WRITE(IFLOG,*) 'TERRAIN TOPOGRAPHY'
+c=1
+a=0
+!modif 12/2014 : passage a une grille haute resolution MesoNH, on depasse 99
+!300 format(i2,'|',18i4)
+300 format(i3,'|',18i5)
+!400 format(i2,'|',18(f4.2))
+!400 format(i3,'|',18(f5.2))
+!301 format(3x,18('__',i2))
+301 format(3x,18('__',i3))
+ALLOCATE(TAB2D(NSIMAX,NSJMAX))
+ALLOCATE(TAB1D(NSIMAX))
+DO I=1,NSIMAX
+   TAB1D(I)=I
+ENDDO
+TAB2D(:,:) = NINT(XSREL(:,:))
+DO WHILE (c.lt.(NSIMAX+1))
+  DO b=NSJB,NSJE
+     IF ((c+17).LT.(NSIMAX+1)) then
+        a=NSJMAX-b+NSJB
+        WRITE(IFLOG,300) a,TAB2D(c:c+17,a)
+     ELSE  
+        a=NSJMAX-b+NSJB
+        WRITE(IFLOG,300) a,TAB2D(c:NSIMAX,a)
+     ENDIF
+  ENDDO
+IF ((c+17).LT.(NSIMAX+1)) then
+   WRITE(IFLOG,301) TAB1D(c:c+17)
+ELSE
+   WRITE(IFLOG,301) TAB1D(c:NSIMAX)
+ENDIF
+
+c=c+18
+ENDDO
+!
+DEALLOCATE(TAB2D)
+DEALLOCATE(TAB1D)
+DEALLOCATE(XZS)
+DEALLOCATE(XZ0)
+DEALLOCATE(XZHAT)
+!
+!	 Fermeture du fichier Meso-NH.
+!
+CALL IO_File_close(TPFILE1)
+CALL IO_File_close(TPFILE2)
+!
+!
+!-------------------------------------------'
+print*,'          FIN MNH2LPDM_INI'
+!-------------------------------------------'
+!
+!
+END SUBROUTINE MNH2LPDM_INI
diff --git a/src/PHYEX/ext/modeln.f90 b/src/PHYEX/ext/modeln.f90
new file mode 100644
index 0000000000000000000000000000000000000000..8079f0d349befbd4bfe24c02d47f30d77d1f9ce2
--- /dev/null
+++ b/src/PHYEX/ext/modeln.f90
@@ -0,0 +1,2415 @@
+!MNH_LIC Copyright 1994-2023 CNRS, Meteo-France and Universite Paul Sabatier
+!MNH_LIC This is part of the Meso-NH software governed by the CeCILL-C licence
+!MNH_LIC version 1. See LICENSE, CeCILL-C_V1-en.txt and CeCILL-C_V1-fr.txt
+!MNH_LIC for details. version 1.
+!-----------------------------------------------------------------
+!     ###################
+      MODULE MODI_MODEL_n
+!     ###################
+!
+INTERFACE
+!
+       SUBROUTINE MODEL_n( KTCOUNT, TPBAKFILE, TPDTMODELN, OEXIT )
+!
+USE MODD_IO,        ONLY: TFILEDATA
+USE MODD_TYPE_DATE, ONLY: DATE_TIME
+!
+INTEGER,                  INTENT(IN)    :: KTCOUNT    ! Temporal loop index of model KMODEL
+TYPE(TFILEDATA), POINTER, INTENT(OUT)   :: TPBAKFILE  ! Pointer for backup file
+TYPE(DATE_TIME),          INTENT(OUT)   :: TPDTMODELN ! Time of current model computation
+LOGICAL,                  INTENT(INOUT) :: OEXIT      ! Switch for the end of the temporal loop
+!
+END SUBROUTINE MODEL_n
+!
+END INTERFACE
+!
+END MODULE MODI_MODEL_n
+
+!     ################################### 
+      SUBROUTINE MODEL_n( KTCOUNT, TPBAKFILE, TPDTMODELN, OEXIT )
+!     ###################################
+!
+!!****  *MODEL_n * -monitor of the model version _n 
+!!
+!!    PURPOSE
+!!    -------
+!       The purpose of this routine is to build up a typical model version
+!     by sequentially calling the specialized routines.
+!
+!!**  METHOD
+!!    ------
+!!      Some preliminary initializations are performed in the first section.
+!!    Then, specialized routines are called to update the guess of the future
+!!    instant XRxxS of the variable xx by adding the effects of all the
+!!    different sources of evolution.
+!!
+!!              (guess of xx at t+dt) * Rhod_ref * Jacobian
+!!      XRxxS = -------------------------------------------
+!!                           2 dt
+!!
+!!      At this level, the informations are transferred with a USE association
+!!    from the INIT step, where the modules have been previously filled. The
+!!    transfer to the subroutines computing each source term is performed by
+!!    argument in order to avoid repeated compilations of these subroutines.
+!!      This monitor model_n, must therefore be duplicated for each model,
+!!    model1 corresponds in this case to the outermost model, model2 is used
+!!    for the first level of gridnesting,....  
+!!      The effect of all parameterizations is computed in PHYS_PARAM_n, which
+!!    is itself a monitor. This is due to a possible large number of
+!!    parameterizations, which can be activated and therefore, will require a
+!!    very large list of arguments. To circumvent this problem, we transfer by
+!!    a USE association, the necessary informations in this monitor, which will
+!!    dispatch the pertinent information to every parametrization.
+!!      Some elaborated diagnostics, LES tools, budget storages are also called
+!!    at this level because they require informations about the fields at every
+!!    timestep.
+!!
+!!
+!!    EXTERNAL
+!!    --------
+!!      Subroutine IO_File_open: to open a file
+!!      Subroutine WRITE_DESFM: to write the descriptive part of a FMfile
+!!      Subroutine WRITE_LFIFM: to write the binary part of a FMfile
+!!      Subroutine SET_MASK   : to compute all the masks selected for budget
+!!                         computations
+!!      Subroutine BOUNDARIES   : set the fields at the marginal points in every
+!!                         directions according the selected boundary conditions
+!!      Subroutine INITIAL_GUESS: initializes the guess of the future instant
+!!      Subroutine LES_FLX_SPECTRA: computes the resolved fluxes and the
+!!                     spectra of some quantities when running in LES mode.
+!!      Subroutine ADVECTION: computes the advection terms.
+!!      Subroutine DYN_SOURCES: computes the curvature, Coriolis, gravity terms.
+!!      Subroutine NUM_DIFF: applies the fourth order numerical diffusion.
+!!      Subroutine RELAXATION: performs the relaxation to Larger Scale fields
+!!                             in the upper levels and outermost vertical planes
+!!      Subroutine PHYS_PARAM_n : computes the parameterized physical terms
+!!      Subroutine RAD_BOUND: prepares the velocity normal components for the bc.
+!!      Subroutine RESOLVED_CLOUD : computes the sources terms for water in any
+!!                                  form
+!!      Subroutine PRESSURE : computes the pressure gradient term and the
+!!                            absolute pressure
+!!      Subroutine EXCHANGE : updates the halo of each subdomains
+!!      Subroutine ENDSTEP : advances in time the  fields.
+!!      Subroutines UVW_LS_COUPLING and SCALAR_LS_COUPLING:
+!!                                 compute the large scale fields, used to
+!!                                 couple Model_n with outer informations.
+!!      Subroutine ENDSTEP_BUDGET: writes the budget informations.
+!!      Subroutine IO_File_close: closes a file
+!!      Subroutine DATETIME_CORRECTDATE: transform the current time in GMT
+!!      Subroutine FORCING : computes forcing terms
+!!      Subroutine ADD3DFIELD_ll : add a field to 3D-list
+!!
+!!    IMPLICIT ARGUMENTS
+!!    ------------------
+!!          MODD_DYN
+!!          MODD_CONF
+!!          MODD_NESTING
+!!          MODD_BUDGET
+!!          MODD_PARAMETERS
+!!          MODD_CONF_n
+!!          MODD_CURVCOR_n
+!!          MODD_DYN_n
+!!          MODD_DIM_n
+!!          MODD_ADV_n
+!!          MODD_FIELD_n
+!!          MODD_LSFIELD_n
+!!          MODD_GRID_n
+!!          MODD_METRICS_n
+!!          MODD_LBC_n
+!!          MODD_PARAM_n
+!!          MODD_REF_n
+!!          MODD_LUNIT_n
+!!          MODD_OUT_n
+!!          MODD_TIME_n
+!!          MODD_TURB_n
+!!          MODD_CLOUDPAR_n
+!!          MODD_TIME
+!!
+!!    REFERENCE
+!!    ---------
+!!
+!!    AUTHOR
+!!    ------
+!!      J.-P. Pinty                  * LA *
+!!
+!!    MODIFICATIONS
+!!    -------------
+!!      Original    15/09/94
+!!      Modification 20/10/94  (J.Stein) for the outputs and abs_layers routines
+!!      Modification 10/11/94  (J.Stein) change ABS_LAYER_FIELDS call
+!!      Modification 16/11/94  (J.Stein) add call to the renormalization
+!!      Modification 17/11/94  (J.-P. Lafore and J.-P. Pinty) call NUM_DIFF
+!!      Modification 08/12/94  (J.Stein) cleaning + remove (RENORM + ABS_LAYER..
+!!                             ..) + add RELAXATION + LS fiels in the arguments
+!!      Modification 19/12/94  (J.Stein) switch for the num diff
+!!      Modification 22/12/94  (J.Stein) update tdtcur + change dyn_source call
+!!      Modification 05/01/95  (J.Stein) add the parameterization monitor
+!!      Modification 09/01/95  (J.Stein) add the 1D switch
+!!      Modification 10/01/95  (J.Stein) displace the TDTCUR computation
+!!      Modification 03/01/95  (J.-P. Lafore) Absolute pressure diagnosis
+!!      Modification Jan 19, 1995 (J. Cuxart) Shunt the DYN_SOURCES in 1D cases.
+!!      Modification Jan 24, 1995 (J. Stein)  Interchange Boundaries and
+!!                           Initial_guess to correct a bug in 2D configuration
+!!      Modification Feb 02, 1995 (I.Mallet) update BOUNDARIES and RAD_BOUND
+!!                                           calls
+!!      Modification Mar 10, 1995 (I.Mallet) add call to SET_COUPLING
+!!                   March,21, 1995 (J. Stein) remove R from the historical var.
+!!                   March,26, 1995 (J. Stein) add the EPS variable
+!!                   April 18, 1995 (J. Cuxart) add the LES call
+!!                   Sept 20,1995 (Lafore) coupling for the dry mass Md
+!!                   Nov   2,1995 (Stein) displace the temporal counter increase
+!!                   Jan   2,1996 (Stein) rm the test on the temporal counter
+!!      Modification Feb   5,1996 (J. Vila) implementation new advection
+!!                                          schemes for scalars
+!!      Modification Feb  20,1996 (J.Stein) doctor norm
+!!                   Dec95 - Jul96 (Georgelin, Pinty, Mari, Suhre) FORCING
+!!                   June 17,1996 (Vincent, Lafore, Jabouille)
+!!                                        statistics of computing time
+!!                   Aug 8, 1996 (K. Suhre) add chemistry
+!!                   October 12, 1996 (J. Stein) save the PSRC value
+!!                   Sept 05,1996 (V.Masson) print of loop index for debugging
+!!                                           purposes
+!!                   July 22,1996 (Lafore) improve write of computing time statistics
+!!                   July 29,1996 (Lafore) nesting introduction
+!!                   Aug.  1,1996 (Lafore) synchronization between models
+!!                   Sept. 4,1996 (Lafore) modification of call to routine SET_COUPLING
+!!                                         now split in 2 routines
+!!                                         (UVW_LS_COUPLING and SCALAR_LS_COUPLING)
+!!                   Sept  5,1996 (V.Masson) print of loop index for debugging
+!!                                           purposes
+!!                   Sept 25,1996 (V.Masson) test for coupling performed here
+!!                   Oct. 29,1996 (Lafore)   one-way nesting implementation
+!!                   Oct. 12,1996 (J. Stein) save the PSRC value
+!!                   Dec. 12,1996 (Lafore)   change call to RAD_BOUND
+!!                   Dec. 21,1996 (Lafore)   two-way nesting implementation
+!!                   Mar. 12,1997 (Lafore)   introduction of "surfacic" LS fields
+!!                   Nov 18, 1996 (J.-P. Pinty) FORCING revisited (translation)
+!!                   Dec 04, 1996 (J.-P. Pinty) include mixed-phase clouds
+!!                   Dec 20, 1996 (J.-P. Pinty) update the budgets
+!!                   Dec 23, 1996 (J.-P. Pinty) add the diachronic file control
+!!                   Jan 11, 1997 (J.-P. Pinty) add the deep convection control
+!!                   Dec  20,1996 (V.Masson) call boundaries before the writing
+!!                   Fev 25, 1997 (P.Jabouille) modify the LES tools
+!!                   April 3,1997 (Lafore)      merging of the nesting
+!!                                              developments on MASTER3
+!!                   Jul.  8,1997 (Lafore)  print control for nesting (NVERB>=7)
+!!                   Jul. 28,1997 (Masson)  supress LSTEADY_DMASS
+!!                   Aug. 19,1997 (Lafore)  full Clark's formulation introduction
+!!                   Sept 26,1997 (Lafore)  LS source calculation at restart
+!!                                          (temporarily test to have LS at instant t)
+!!                   Jan. 28,1998 (Bechtold) add SST forcing
+!!                   fev. 10,1998 (Lafore)  RHODJ computation and storage for budget
+!!                   Jul. 10,1998 (Stein )  sequentiel loop for nesting
+!!                   Apr. 07,1999 (Stein )  cleaning of the nesting subroutines
+!!                   oct. 20,1998 (Jabouille) //
+!!                   oct. 20,2000 (J.-P. Pinty) add the C2R2 scheme
+!!                   fev. 01,2001 (D.Gazen) add module MODD_NSV for NSV variables
+!!                   mar,  4,2002 (V.Ducrocq) call to temporal series
+!!                   mar, 8, 2001 (V. Masson) advection of perturbation of theta in neutral cases.
+!!                   Nov, 6, 2002 (V. Masson) time counters for budgets & LES
+!!                   mars 20,2001 (Pinty)   add ICE4 and C3R5 options
+!!                   jan. 2004    (Masson)  surface externalization
+!!                   sept 2004 (M. Tomasini) Cloud mixing length modification
+!!                   june 2005 (P. Tulet)  add aerosols / dusts
+!!                   Jul. 2005 (N. Asencio)  two_way and phys_param calls: 
+!!                             Add the surface parameters : precipitating 
+!!                             hydrometeors, Short and Long Wave , MASKkids array 
+!!                   Fev. 2006 (M. Leriche) add aqueous phase chemistry
+!!                   april 2006 (T.Maric) Add halo related to 4th order advection scheme
+!!                   May 2006 Remove KEPS
+!!                   Oct 2008 (C.Lac) FIT for variables advected with PPM
+!!                   July 2009 : Displacement of surface diagnostics call to be
+!!                               coherent with  surface diagnostics obtained with DIAG
+!!                   10/11/2009 (P. Aumond) Add mean moments
+!!                   Nov, 12, 2009 (C. Barthe) add cloud electrification and lightning flashes
+!!                   July 2010 (M. Leriche) add ice phase chemical species
+!!                   April 2011 (C.Lac) : Remove instant M 
+!!                   April 2011 (C.Lac, V.Masson) : Time splitting for advection
+!!      J.Escobar 21/03/2013: for HALOK comment all NHALO=1 test
+!!       P. Tulet      Nov 2014 accumulated moles of aqueous species that fall at the surface   
+!!                   Dec 2014 (C.Lac) : For reproducibility START/RESTA
+!!      J.Escobar 20/04/2015: missing UPDATE_HALO before UPDATE_HALO2
+!!              July, 2015 (O.Nuissier/F.Duffourg) Add microphysics diagnostic for
+!!                                      aircraft, ballon and profiler
+!!       C.Lac    11/09/2015: correction of the budget due to FIT temporal scheme
+!!      J.Escobar : 15/09/2015 : WENO5 & JPHEXT <> 1
+!!                   Sep 2015 (S. Bielli) : Remove YDADFILE from argument call 
+!                              of write_phys_param
+!!      J.Escobar : 19/04/2016 : Pb IOZ/NETCDF , missing OPARALLELIO=.FALSE. for PGD files
+!!      M.Mazoyer : 04/2016      DTHRAD used for radiative cooling when LACTIT
+!!!      Modification    01/2016  (JP Pinty) Add LIMA
+!!  06/2016     (G.Delautier) phasage surfex 8
+!!      M.Leriche : 03/2016 Move computation of accumulated chem. in rain to ch_monitor
+!!                  09/2016 Add filter on negative values on AERDEP SV before relaxation
+!!                  10/2016  (C.Lac) _ Correction on the flag for Strang splitting
+!!                                  to insure reproducibility between START and RESTA
+!!                                  _  Add OSPLIT_WENO
+!!                                  _ Add droplet deposition 
+!!                   10/2016 (M.Mazoyer) New KHKO output fields
+!!      P.Wautelet : 11/07/2016 : removed MNH_NCWRIT define
+!!                   09/2017 Q.Rodier add LTEND_UV_FRC
+!!                   10/2017 (C.Lac) Necessity to have chemistry processes as
+!!                            the las process modifying XRSVS
+!!  01/2018      (G.Delautier) SURFEX 8.1
+!!  03/2018     (P.Wautelet)   replace ADD_FORECAST_TO_DATE by DATETIME_CORRECTDATE
+!!  Philippe Wautelet: 05/2016-04/2018: new data structures and calls for I/O
+!!                  07/2017  (V. Vionnet) : Add blowing snow scheme 
+!!      S. Riette : 11/2016 Add ZPABST to keep pressure constant during timestep
+!!                   01/2018 (C.Lac) Add VISCOSITY
+!!  Philippe Wautelet: 21/01/2019: add LIO_ALLOW_NO_BACKUP and LIO_NO_WRITE to modd_io_ll
+!                                  to allow to disable writes (for bench purposes)
+!  P. Wautelet 07/02/2019: remove OPARALLELIO argument from open and close files subroutines
+!                          (nsubfiles_ioz is now determined in IO_File_add2list)
+!!                   02/2019 C.Lac add rain fraction as an output field
+!!      Bielli S. 02/2019  Sea salt : significant sea wave height influences salt emission; 5 salt modes
+!  P. Wautelet 28/03/2019: use MNHTIME for time measurement variables
+!  P. Wautelet 28/03/2019: use TFILE instead of unit number for set_iluout_timing
+!  P. Wautelet 19/04/2019: removed unused dummy arguments and variables
+!  P. Wautelet 26/04/2019: replace non-standard FLOAT function by REAL function
+!  P. Wautelet 20/05/2019: add name argument to ADDnFIELD_ll + new ADD4DFIELD_ll subroutine
+!  J. Escobar  09/07/2019: norme Doctor -> Rename Module Type variable TZ -> T
+!  J. Escobar  09/07/2019: for bug in management of XLSZWSM variable, add/use specific 2D TLSFIELD2D_ll pointer
+!  P. Wautelet 13/09/2019: budget: simplify and modernize date/time management
+!  J. Escobar  27/09/2019: add missing report timing of RESOLVED_ELEC
+!  P. Wautelet 02-03/2020: use the new data structures and subroutines for budgets
+!  P. Wautelet 12/10/2020: Write_les_n: remove HLES_AVG dummy argument and group all 4 calls
+!  F. Auguste  01/02/2021: add IBM
+!  T. Nagel    01/02/2021: add turbulence recycling
+!  P. Wautelet 19/02/2021: add NEGA2 term for SV budgets
+!  J.L. Redelsperger 03/2021: add Call NHOA_COUPLN (coupling O & A LES version)
+!  R. Schoetter    12/2021  multi-level coupling between MesoNH and SURFEX  
+!  A. Costes      12/2021: add Blaze fire model
+!  C. Barthe   07/04/2022: deallocation of ZSEA
+!  P. Wautelet 08/12/2022: bugfix if no TDADFILE
+!  P. Wautelet 13/01/2023: manage close of backup files outside of MODEL_n
+!                          (useful to close them in reverse model order (child before parent, needed by WRITE_BALLOON_n)
+!  J. Wurtz    01/2023   : correction for mean in SURFEX outputs
+!!-------------------------------------------------------------------------------
+!
+!*       0.     DECLARATIONS
+!               ------------
+!
+USE MODD_2D_FRC
+USE MODD_ADV_n
+USE MODD_AIRCRAFT_BALLOON
+USE MODD_ARGSLIST_ll,     ONLY : LIST_ll
+USE MODD_BAKOUT
+USE MODD_BIKHARDT_n
+USE MODD_BLANK_n
+USE MODD_BLOWSNOW
+USE MODD_BLOWSNOW_n
+use modd_budget,          only: cbutype, lbu_ru, lbu_rv, lbu_rw, lbudget_u, lbudget_v, lbudget_w, lbudget_sv, lbu_enable, &
+                                NBUDGET_U, NBUDGET_V, NBUDGET_W, NBUDGET_SV1, nbumod, nbutime,                            &
+                                tbudgets, tbuconf, tburhodj,                                                                       &
+                                xtime_bu, xtime_bu_process
+USE MODD_CH_AERO_n,      ONLY: XSOLORG, XMI
+USE MODD_CH_MNHC_n,      ONLY: LUSECHEM,LCH_CONV_LINOX,LUSECHAQ,LUSECHIC, &
+                               LCH_INIT_FIELD
+USE MODD_CLOUD_MF_n
+USE MODD_CLOUDPAR_n
+USE MODD_CONF
+USE MODD_CONF_n
+USE MODD_CST,            ONLY: CST
+USE MODD_CURVCOR_n
+USE MODD_DEEP_CONVECTION_n
+USE MODD_DIM_n
+USE MODD_DIMPHYEX,       ONLY: DIMPHYEX_t
+USE MODD_DRAG_n
+USE MODD_DUST,           ONLY: LDUST
+USE MODD_DYN
+USE MODD_DYN_n
+USE MODD_DYNZD
+USE MODD_DYNZD_n
+USE MODD_ELEC_DESCR
+USE MODD_EOL_MAIN
+USE MODD_FIELD_n
+USE MODD_FIRE_n
+USE MODD_FRC
+USE MODD_FRC_n
+USE MODD_GET_n
+USE MODD_GRID,           ONLY: XLONORI,XLATORI
+USE MODD_GRID_n
+USE MODD_IBM_PARAM_n,    ONLY: CIBM_ADV, LIBM, LIBM_TROUBLE, XIBM_LS
+USE MODD_ICE_C1R3_DESCR, ONLY: XRTMIN_C1R3=>XRTMIN
+USE MODD_IO,             ONLY: LIO_NO_WRITE, TFILEDATA, TFILE_SURFEX, TFILE_DUMMY
+USE MODD_LBC_n
+USE MODD_LES
+USE MODD_LES_BUDGET
+USE MODD_LIMA_PRECIP_SCAVENGING_n
+USE MODD_LSFIELD_n
+USE MODD_LUNIT,          ONLY: TOUTDATAFILE
+USE MODD_LUNIT_n,        ONLY: TDIAFILE,TINIFILE,TINIFILEPGD,TLUOUT
+USE MODD_MEAN_FIELD
+USE MODD_MEAN_FIELD_n
+USE MODD_METRICS_n
+USE MODD_MNH_SURFEX_n
+USE MODD_NESTING
+USE MODD_NSV
+USE MODD_NUDGING_n
+USE MODD_OUT_n
+USE MODD_PARAM_C1R3,     ONLY: NSEDI => LSEDI, NHHONI => LHHONI
+USE MODD_PARAM_C2R2,     ONLY: NSEDC => LSEDC, NRAIN => LRAIN, NACTIT => LACTIT,LACTTKE,LDEPOC
+USE MODD_PARAMETERS
+USE MODD_PARAM_ICE_n,    ONLY: LWARM,LSEDIC,LCONVHG,LDEPOSC, CSUBG_AUCV_RC
+USE MODD_PARAM_LIMA,     ONLY: MSEDC => LSEDC, NMOM_C, NMOM_R, &
+                               MACTIT => LACTIT, LSCAV, NMOM_I,                 &
+                               MSEDI => LSEDI, MHHONI => LHHONI, NMOM_H,        &
+                               XRTMIN_LIMA=>XRTMIN, MACTTKE=>LACTTKE
+USE MODD_PARAM_MFSHALL_n
+USE MODD_PARAM_n
+USE MODD_PAST_FIELD_n
+USE MODD_PRECIP_n
+use modd_precision,      only: MNHTIME
+USE MODD_PROFILER_n
+USE MODD_RADIATIONS_n,   ONLY: XTSRAD,XSCAFLASWD,XDIRFLASWD,XDIRSRFSWD, XAER, XDTHRAD
+USE MODD_RAIN_ICE_DESCR_n, ONLY: XRTMIN
+USE MODD_RECYCL_PARAM_n, ONLY: LRECYCL
+USE MODD_REF,            ONLY: LCOUPLES
+USE MODD_REF_n
+USE MODD_SALT,           ONLY: LSALT
+USE MODD_SERIES,         ONLY: LSERIES
+USE MODD_SERIES_n,       ONLY: NFREQSERIES
+USE MODD_STATION_n
+USE MODD_SUB_MODEL_n
+USE MODD_TIME
+USE MODD_TIME_n 
+USE MODD_TIMEZ
+USE MODD_TURB_n
+USE MODD_NEB_n,          ONLY: VSIGQSAT, LSIGMAS, LSUBG_COND
+USE MODD_TYPE_DATE,      ONLY: DATE_TIME
+USE MODD_VISCOSITY
+!
+USE MODE_AIRCRAFT_BALLOON
+use mode_budget,           only: Budget_store_init, Budget_store_end
+USE MODE_DATETIME
+USE MODE_ELEC_ll
+USE MODE_GRIDCART
+USE MODE_GRIDPROJ
+USE MODE_IO_FIELD_WRITE,   only: IO_Field_user_write, IO_Fieldlist_write, IO_Header_write
+USE MODE_IO_FILE,          only: IO_File_close, IO_File_open
+USE MODE_IO_MANAGE_STRUCT, only: IO_File_add2list
+USE MODE_ll
+#ifdef MNH_IOLFI
+use mode_menu_diachro,     only: MENU_DIACHRO
+#endif
+USE MODE_MNH_TIMING
+USE MODE_MODELN_HANDLER
+USE MODE_MPPDB
+USE MODE_MSG
+USE MODE_ONE_WAY_n
+USE MODE_WRITE_AIRCRAFT_BALLOON
+use mode_write_les_n,               only: Write_les_n
+use mode_write_lfifmn_fordiachro_n, only: WRITE_LFIFMN_FORDIACHRO_n
+USE MODE_WRITE_STATPROF_n,          ONLY: WRITE_STATPROF_n
+!
+USE MODI_ADDFLUCTUATIONS
+USE MODI_ADVECTION_METSV
+USE MODI_ADVECTION_UVW
+USE MODI_ADVECTION_UVW_CEN
+USE MODI_ADV_FORCING_n
+USE MODI_AER_MONITOR_n
+USE MODI_BLOWSNOW
+USE MODI_BOUNDARIES
+USE MODI_BUDGET_FLAGS
+USE MODI_CART_COMPRESS
+USE MODI_CH_MONITOR_n
+USE MODI_DIAG_SURF_ATM_N
+USE MODI_DYN_SOURCES
+USE MODI_END_DIAG_IN_RUN
+USE MODI_ENDSTEP
+USE MODI_ENDSTEP_BUDGET
+USE MODI_EXCHANGE
+USE MODI_FORCING
+USE MODI_FORC_SQUALL_LINE
+USE MODI_FORC_WIND
+USE MODI_GET_HALO
+USE MODI_GRAVITY_IMPL
+USE MODI_IBM_INIT
+USE MODI_IBM_FORCING
+USE MODI_IBM_FORCING_TR
+USE MODI_IBM_FORCING_ADV
+USE MODI_INI_DIAG_IN_RUN
+USE MODI_INI_LG
+USE MODI_INI_MEAN_FIELD
+USE MODI_INITIAL_GUESS
+USE MODI_LES_INI_TIMESTEP_n
+USE MODI_LES_N
+USE MODI_LIMA_PRECIP_SCAVENGING
+USE MODI_LS_COUPLING
+USE MODI_MASK_COMPRESS
+USE MODI_MEAN_FIELD
+USE MODI_MNHGET_SURF_PARAM_n
+USE MODI_MNHWRITE_ZS_DUMMY_n
+USE MODI_NUDGING
+USE MODI_NUM_DIFF
+USE MODI_PHYS_PARAM_n
+USE MODI_PRESSUREZ
+USE MODI_PROFILER_n
+USE MODI_RAD_BOUND
+USE MODI_RECYCLING
+USE MODI_RELAX2FW_ION 
+USE MODI_RELAXATION
+USE MODI_REL_FORCING_n
+USE MODI_RESOLVED_CLOUD
+USE MODI_RESOLVED_ELEC_n
+USE MODI_SERIES_N
+USE MODI_SETLB_LG
+USE MODI_SET_MASK
+USE MODI_SHUMAN
+USE MODI_SPAWN_LS_n
+USE MODI_STATION_n
+USE MODI_TURB_CLOUD_INDEX
+USE MODI_TWO_WAY
+USE MODI_UPDATE_NSV
+USE MODI_VISCOSITY
+USE MODI_WRITE_DESFM_n
+USE MODI_WRITE_DIAG_SURF_ATM_N
+USE MODI_WRITE_LFIFM_n
+USE MODI_WRITE_SERIES_n
+USE MODI_WRITE_SURF_ATM_N
+!
+IMPLICIT NONE
+!
+!*       0.1   declarations of arguments
+!
+!
+!
+INTEGER,                  INTENT(IN)    :: KTCOUNT    ! Temporal loop index of model KMODEL
+TYPE(TFILEDATA), POINTER, INTENT(OUT)   :: TPBAKFILE  ! Pointer for backup file
+TYPE(DATE_TIME),          INTENT(OUT)   :: TPDTMODELN ! Time of current model computation
+LOGICAL,                  INTENT(INOUT) :: OEXIT      ! Switch for the end of the temporal loop
+!
+!*       0.2   declarations of local variables
+!
+INTEGER :: ILUOUT      ! Logical unit number for the output listing
+INTEGER :: IIU,IJU,IKU ! array size in first, second and third dimensions
+INTEGER :: IIB,IIE,IJB,IJE ! index values for the physical subdomain
+INTEGER :: JSV,JRR     ! Loop index for scalar and moist variables
+INTEGER  :: INBVAR              ! number of HALO2_lls to allocate
+INTEGER  :: IINFO_ll            ! return code of parallel routine
+INTEGER :: IVERB                ! LFI verbosity level
+LOGICAL :: GSTEADY_DMASS        ! conditional call to mass computation
+!
+                                ! for computing time analysis
+REAL(kind=MNHTIME), DIMENSION(2) :: ZTIME, ZTIME1, ZTIME2, ZEND, ZTOT, ZALL, ZTOT_PT, ZBLAZETOT
+REAL(kind=MNHTIME), DIMENSION(2) :: ZTIME_STEP,ZTIME_STEP_PTS
+CHARACTER                 :: YMI
+INTEGER                   :: IPOINTS
+CHARACTER(len=16)         :: YTCOUNT,YPOINTS
+CHARACTER(LEN=:), ALLOCATABLE :: YDADNAME
+!
+INTEGER :: ISYNCHRO          ! model synchronic index relative to its father
+                             ! = 1  for the first time step in phase with DAD
+                             ! = 0  for the last  time step (out of phase)
+INTEGER      :: IMI ! Current model index
+REAL, DIMENSION(:,:),ALLOCATABLE          :: ZSEA
+REAL, DIMENSION(:,:),ALLOCATABLE          :: ZTOWN
+! Dummy pointers needed to correct an ifort Bug
+REAL, DIMENSION(:), POINTER :: DPTR_XZHAT
+REAL, DIMENSION(:), POINTER :: DPTR_XBMX1,DPTR_XBMX2,DPTR_XBMX3,DPTR_XBMX4
+REAL, DIMENSION(:), POINTER :: DPTR_XBMY1,DPTR_XBMY2,DPTR_XBMY3,DPTR_XBMY4
+REAL, DIMENSION(:), POINTER :: DPTR_XBFX1,DPTR_XBFX2,DPTR_XBFX3,DPTR_XBFX4
+REAL, DIMENSION(:), POINTER :: DPTR_XBFY1,DPTR_XBFY2,DPTR_XBFY3,DPTR_XBFY4
+CHARACTER(LEN=4), DIMENSION(:), POINTER :: DPTR_CLBCX,DPTR_CLBCY
+INTEGER, DIMENSION(:,:,:), POINTER :: DPTR_NKLIN_LBXU,DPTR_NKLIN_LBYU,DPTR_NKLIN_LBXV,DPTR_NKLIN_LBYV
+INTEGER, DIMENSION(:,:,:), POINTER :: DPTR_NKLIN_LBXW,DPTR_NKLIN_LBYW,DPTR_NKLIN_LBXM,DPTR_NKLIN_LBYM
+REAL, DIMENSION(:,:,:), POINTER :: DPTR_XCOEFLIN_LBXU,DPTR_XCOEFLIN_LBYU
+REAL, DIMENSION(:,:,:), POINTER :: DPTR_XCOEFLIN_LBXV,DPTR_XCOEFLIN_LBYV
+REAL, DIMENSION(:,:,:), POINTER :: DPTR_XCOEFLIN_LBXW,DPTR_XCOEFLIN_LBYW
+REAL, DIMENSION(:,:,:), POINTER :: DPTR_XCOEFLIN_LBXM,DPTR_XCOEFLIN_LBYM
+REAL, DIMENSION(:,:,:),   POINTER :: DPTR_XLBXUM,DPTR_XLBYUM,DPTR_XLBXVM,DPTR_XLBYVM
+REAL, DIMENSION(:,:,:),   POINTER :: DPTR_XLBXWM,DPTR_XLBYWM,DPTR_XLBXTHM,DPTR_XLBYTHM
+REAL, DIMENSION(:,:,:),   POINTER :: DPTR_XLBXTKEM,DPTR_XLBYTKEM
+REAL, DIMENSION(:,:,:,:),   POINTER :: DPTR_XLBXSVM,DPTR_XLBYSVM                
+REAL, DIMENSION(:,:,:,:), POINTER :: DPTR_XLBXRM,DPTR_XLBYRM
+REAL, DIMENSION(:,:,:),   POINTER ::  DPTR_XZZ
+REAL, DIMENSION(:,:,:), POINTER :: DPTR_XLSUM,DPTR_XLSVM,DPTR_XLSWM,DPTR_XLSTHM,DPTR_XLSRVM
+REAL, DIMENSION(:,:,:), POINTER :: DPTR_XLSUS,DPTR_XLSVS,DPTR_XLSWS,DPTR_XLSTHS,DPTR_XLSRVS
+REAL, DIMENSION(:,:),   POINTER :: DPTR_XLSZWSM,DPTR_XLSZWSS
+REAL, DIMENSION(:,:,:), POINTER :: DPTR_XLBXUS,DPTR_XLBYUS,DPTR_XLBXVS,DPTR_XLBYVS
+REAL, DIMENSION(:,:,:), POINTER :: DPTR_XLBXWS,DPTR_XLBYWS,DPTR_XLBXTHS,DPTR_XLBYTHS
+REAL, DIMENSION(:,:,:), POINTER :: DPTR_XLBXTKES,DPTR_XLBYTKES
+REAL, DIMENSION(:,:,:,:), POINTER :: DPTR_XLBXRS,DPTR_XLBYRS,DPTR_XLBXSVS,DPTR_XLBYSVS
+!
+REAL, DIMENSION(:,:,:), POINTER :: DPTR_XRHODJ,DPTR_XUM,DPTR_XVM,DPTR_XWM,DPTR_XTHM
+REAL, DIMENSION(:,:,:), POINTER :: DPTR_XTKEM,DPTR_XRUS,DPTR_XRVS,DPTR_XRWS,DPTR_XRTHS
+REAL, DIMENSION(:,:,:), POINTER :: DPTR_XRTKES,DPTR_XDIRFLASWD,DPTR_XSCAFLASWD,DPTR_XDIRSRFSWD
+REAL, DIMENSION(:,:,:,:), POINTER :: DPTR_XRM,DPTR_XSVM,DPTR_XRRS,DPTR_XRSVS
+REAL, DIMENSION(:,:), POINTER :: DPTR_XINPRC,DPTR_XINPRR,DPTR_XINPRS,DPTR_XINPRG
+REAL, DIMENSION(:,:), POINTER :: DPTR_XINPRH,DPTR_XPRCONV,DPTR_XPRSCONV
+LOGICAL, DIMENSION(:,:),POINTER :: DPTR_GMASKkids
+!
+REAL, DIMENSION(SIZE(XTHT,1),SIZE(XTHT,2),SIZE(XTHT,3))           :: ZSPEEDC
+REAL, DIMENSION(SIZE(XTHT,1),SIZE(XTHT,2),SIZE(XTHT,3))           :: ZSPEEDR
+REAL, DIMENSION(SIZE(XTHT,1),SIZE(XTHT,2),SIZE(XTHT,3))           :: ZSPEEDS
+REAL, DIMENSION(SIZE(XTHT,1),SIZE(XTHT,2),SIZE(XTHT,3))           :: ZSPEEDG
+REAL, DIMENSION(SIZE(XTHT,1),SIZE(XTHT,2),SIZE(XTHT,3))           :: ZSPEEDH
+REAL, DIMENSION(SIZE(XTHT,1),SIZE(XTHT,2),SIZE(XTHT,3))           :: ZINPRC3D
+REAL, DIMENSION(SIZE(XTHT,1),SIZE(XTHT,2),SIZE(XTHT,3))           :: ZINPRS3D
+REAL, DIMENSION(SIZE(XTHT,1),SIZE(XTHT,2),SIZE(XTHT,3))           :: ZINPRG3D
+REAL, DIMENSION(SIZE(XTHT,1),SIZE(XTHT,2),SIZE(XTHT,3))           :: ZINPRH3D
+!
+LOGICAL :: KWARM        
+LOGICAL :: KRAIN        
+LOGICAL :: KSEDC  
+LOGICAL :: KACTIT
+LOGICAL :: KSEDI
+LOGICAL :: KHHONI
+!
+REAL, DIMENSION(SIZE(XTHT,1),SIZE(XTHT,2),SIZE(XTHT,3)) :: ZRUS,ZRVS,ZRWS
+REAL, DIMENSION(SIZE(XTHT,1),SIZE(XTHT,2),SIZE(XTHT,3)) :: ZPABST !To give pressure at t 
+                                                     ! (and not t+1) to resolved_cloud
+REAL, DIMENSION(SIZE(XTHT,1),SIZE(XTHT,2),SIZE(XTHT,3)) :: ZJ
+!
+TYPE(LIST_ll), POINTER :: TZFIELDC_ll   ! list of fields to exchange
+TYPE(HALO2LIST_ll), POINTER :: TZHALO2C_ll   ! list of fields to exchange
+LOGICAL :: GCLD                     ! conditionnal call for dust wet deposition
+LOGICAL :: GCLOUD_ONLY              ! conditionnal radiation computations for
+                                !      the only cloudy columns
+REAL, DIMENSION(SIZE(XRSVS,1), SIZE(XRSVS,2), SIZE(XRSVS,3), NSV_AER)  :: ZWETDEPAER
+!
+TYPE(TFILEDATA),POINTER :: TZOUTFILE
+! TYPE(TFILEDATA),SAVE    :: TZDIACFILE
+TYPE(DIMPHYEX_t) :: YLDIMPHYEX
+!-------------------------------------------------------------------------------
+!
+TPBAKFILE=> NULL()
+TZOUTFILE=> NULL()
+!
+TPDTMODELN = TDTCUR
+!
+!*       0.    MICROPHYSICAL SCHEME
+!              ------------------- 
+SELECT CASE(CCLOUD)
+CASE('C2R2','KHKO','C3R5')
+  KWARM  = .TRUE.        
+  KRAIN  = NRAIN
+  KSEDC  = NSEDC
+  KACTIT = NACTIT
+!
+  KSEDI  = NSEDI
+  KHHONI = NHHONI
+CASE('LIMA')
+   KRAIN  = NMOM_R.GE.1
+   KWARM  = NMOM_C.GE.1
+  KSEDC  = MSEDC
+  KACTIT = MACTIT
+!
+  KSEDI  = MSEDI
+  KHHONI = MHHONI
+CASE('ICE3','ICE4') !default values
+  KWARM  = LWARM        
+  KRAIN  = .TRUE.
+  KSEDC  = .TRUE.
+  KACTIT = .FALSE.
+!
+  KSEDI  = .TRUE.
+  KHHONI = .FALSE.
+END SELECT
+!
+!
+!*        1    PRELIMINARY
+!              ------------
+IMI = GET_CURRENT_MODEL_INDEX()
+!
+!*       1.0   update NSV_* variables for current model
+!              ----------------------------------------
+!
+CALL UPDATE_NSV(IMI)
+!
+!*       1.1   RECOVER THE LOGICAL UNIT NUMBER FOR THE OUTPUT PRINTS
+!
+ILUOUT = TLUOUT%NLU
+!
+!*       1.2   SET ARRAY SIZE
+!
+CALL GET_DIM_EXT_ll('B',IIU,IJU)
+IKU=NKMAX+2*JPVEXT
+CALL GET_INDICE_ll (IIB,IJB,IIE,IJE)
+!
+IF (IMI==1) THEN
+  GSTEADY_DMASS=LSTEADYLS
+ELSE
+  GSTEADY_DMASS=.FALSE.
+END IF
+!
+!*       1.3   OPEN THE DIACHRONIC FILE
+!
+IF (KTCOUNT == 1) THEN
+!
+  NULLIFY(TFIELDS_ll,TLSFIELD_ll,TFIELDT_ll)
+  NULLIFY(TLSFIELD2D_ll)
+  NULLIFY(THALO2T_ll)
+  NULLIFY(TLSHALO2_ll)
+  NULLIFY(TFIELDSC_ll)
+!
+  ALLOCATE(XWT_ACT_NUC(SIZE(XWT,1),SIZE(XWT,2),SIZE(XWT,3)))
+  ALLOCATE(GMASKkids(SIZE(XWT,1),SIZE(XWT,2)))
+!
+  IF ( .NOT. LIO_NO_WRITE ) THEN
+    CALL IO_File_open(TDIAFILE)
+!
+    CALL IO_Header_write(TDIAFILE)
+    CALL WRITE_DESFM_n(IMI,TDIAFILE)
+    CALL WRITE_LFIFMN_FORDIACHRO_n(TDIAFILE)
+  END IF
+!
+!*       1.4   Initialization of the list of fields for the halo updates
+!
+!                 a) Sources terms
+!
+  CALL ADD3DFIELD_ll( TFIELDS_ll, XRUS,      'MODEL_n::XRUS' )
+  CALL ADD3DFIELD_ll( TFIELDS_ll, XRVS,      'MODEL_n::XRVS' )
+  CALL ADD3DFIELD_ll( TFIELDS_ll, XRWS,      'MODEL_n::XRWS' )
+  CALL ADD3DFIELD_ll( TFIELDS_ll, XRTHS,     'MODEL_n::XRTHS' )
+  CALL ADD3DFIELD_ll( TFIELDS_ll, XRUS_PRES, 'MODEL_n::XRUS_PRES' )
+  CALL ADD3DFIELD_ll( TFIELDS_ll, XRVS_PRES, 'MODEL_n::XRVS_PRES' )
+  CALL ADD3DFIELD_ll( TFIELDS_ll, XRWS_PRES, 'MODEL_n::XRWS_PRES' )
+  CALL ADD3DFIELD_ll( TFIELDS_ll, XRTHS_CLD, 'MODEL_n::XRTHS_CLD' )
+  IF (SIZE(XRTKES,1) /= 0) CALL ADD3DFIELD_ll( TFIELDS_ll, XRTKES, 'MODEL_n::XRTKES' )
+  CALL ADD4DFIELD_ll( TFIELDS_ll, XRRS     (:,:,:,1:NRR), 'MODEL_n::XRRS' )
+  CALL ADD4DFIELD_ll( TFIELDS_ll, XRRS_CLD (:,:,:,1:NRR), 'MODEL_n::XRRS_CLD' )
+  CALL ADD4DFIELD_ll( TFIELDS_ll, XRSVS    (:,:,:,1:NSV), 'MODEL_n::XRSVS')
+  CALL ADD4DFIELD_ll( TFIELDS_ll, XRSVS_CLD(:,:,:,1:NSV), 'MODEL_n::XRSVS_CLD')
+  IF (SIZE(XSRCT,1) /= 0) CALL ADD3DFIELD_ll( TFIELDS_ll, XSRCT, 'MODEL_n::XSRCT' )
+  ! Fire model parallel setup
+  IF (LBLAZE) THEN
+    CALL ADD3DFIELD_ll( TFIELDS_ll, XLSPHI,     'MODEL_n::XLSPHI')
+    CALL ADD3DFIELD_ll( TFIELDS_ll, XBMAP,      'MODEL_n::XBMAP')
+    CALL ADD3DFIELD_ll( TFIELDS_ll, XFMRFA,     'MODEL_n::XFMRFA')
+    CALL ADD3DFIELD_ll( TFIELDS_ll, XFMWF0,     'MODEL_n::XFMWF0')
+    CALL ADD3DFIELD_ll( TFIELDS_ll, XFMR0,      'MODEL_n::XFMR0')
+    CALL ADD3DFIELD_ll( TFIELDS_ll, XFMR00,     'MODEL_n::XFMR00')
+    CALL ADD3DFIELD_ll( TFIELDS_ll, XFMIGNITION, 'MODEL_n::XFMIGNITION')
+    CALL ADD3DFIELD_ll( TFIELDS_ll, XFMFUELTYPE, 'MODEL_n::XFMFUELTYPE')
+    CALL ADD3DFIELD_ll( TFIELDS_ll, XFIRETAU,   'MODEL_n::XFIRETAU')
+    CALL ADD4DFIELD_ll( TFIELDS_ll, XFLUXPARAMH(:,:,:,1:SIZE(XFLUXPARAMH,4)), 'MODEL_n::XFLUXPARAMH')
+    CALL ADD4DFIELD_ll( TFIELDS_ll, XFLUXPARAMW(:,:,:,1:SIZE(XFLUXPARAMW,4)), 'MODEL_n::XFLUXPARAMW')
+    CALL ADD3DFIELD_ll( TFIELDS_ll, XFIRERW,    'MODEL_n::XFIRERW')
+    CALL ADD3DFIELD_ll( TFIELDS_ll, XFMASE,     'MODEL_n::XFMASE')
+    CALL ADD3DFIELD_ll( TFIELDS_ll, XFMAWC,     'MODEL_n::XFMAWC')
+    CALL ADD3DFIELD_ll( TFIELDS_ll, XFMWALKIG,  'MODEL_n::XFMWALKIG')
+    CALL ADD3DFIELD_ll( TFIELDS_ll, XFMFLUXHDH, 'MODEL_n::XFMFLUXHDH')
+    CALL ADD3DFIELD_ll( TFIELDS_ll, XFMFLUXHDW, 'MODEL_n::XFMFLUXHDW')
+    CALL ADD3DFIELD_ll( TFIELDS_ll, XFMHWS,     'MODEL_n::XFMHWS')
+    CALL ADD3DFIELD_ll( TFIELDS_ll, XFMWINDU,   'MODEL_n::XFMWINDU')
+    CALL ADD3DFIELD_ll( TFIELDS_ll, XFMWINDV,   'MODEL_n::XFMWINDV')
+    CALL ADD3DFIELD_ll( TFIELDS_ll, XFMWINDW,   'MODEL_n::XFMWINDW')
+    CALL ADD3DFIELD_ll( TFIELDS_ll, XFMGRADOROX, 'MODEL_n::XFMGRADOROX')
+    CALL ADD3DFIELD_ll( TFIELDS_ll, XFMGRADOROY, 'MODEL_n::XFMGRADOROY')
+  END IF
+  !
+  IF ((LNUMDIFU .OR. LNUMDIFTH .OR. LNUMDIFSV) ) THEN
+  !
+  !                 b) LS fields
+  !
+    CALL ADD3DFIELD_ll( TLSFIELD_ll,   XLSUM,   'MODEL_n::XLSUM'   )
+    CALL ADD3DFIELD_ll( TLSFIELD_ll,   XLSVM,   'MODEL_n::XLSVM'   )
+    CALL ADD3DFIELD_ll( TLSFIELD_ll,   XLSWM,   'MODEL_n::XLSWM'   )
+    CALL ADD3DFIELD_ll( TLSFIELD_ll,   XLSTHM,  'MODEL_n::XLSTHM'  )
+    CALL ADD2DFIELD_ll( TLSFIELD2D_ll, XLSZWSM, 'MODEL_n::XLSZWSM' )
+    IF (NRR >= 1) THEN
+      CALL ADD3DFIELD_ll( TLSFIELD_ll, XLSRVM, 'MODEL_n::XLSRVM' )
+    ENDIF
+  !
+  !                 c) Fields at t
+  !
+    CALL ADD3DFIELD_ll( TFIELDT_ll, XUT,  'MODEL_n::XUT'  )
+    CALL ADD3DFIELD_ll( TFIELDT_ll, XVT,  'MODEL_n::XVT'  )
+    CALL ADD3DFIELD_ll( TFIELDT_ll, XWT,  'MODEL_n::XWT'  )
+    CALL ADD3DFIELD_ll( TFIELDT_ll, XTHT, 'MODEL_n::XTHT' )
+    IF (SIZE(XRTKES,1) /= 0) CALL ADD3DFIELD_ll( TFIELDT_ll, XTKET, 'MODEL_n::XTKET' )
+    CALL ADD4DFIELD_ll(TFIELDT_ll, XRT (:,:,:,1:NRR), 'MODEL_n::XSV'  )
+    CALL ADD4DFIELD_ll(TFIELDT_ll, XSVT(:,:,:,1:NSV), 'MODEL_n::XSVT' )
+  !
+  !*       1.5   Initialize the list of fields for the halo updates (2nd layer)
+  !
+    INBVAR = 4+NRR+NSV
+    IF (SIZE(XRTKES,1) /= 0) INBVAR=INBVAR+1
+    CALL INIT_HALO2_ll(THALO2T_ll,INBVAR,IIU,IJU,IKU)
+    CALL INIT_HALO2_ll(TLSHALO2_ll,4+MIN(1,NRR),IIU,IJU,IKU)
+  !
+  !*       1.6   Initialise the 2nd layer of the halo of the LS fields
+  !
+    IF ( LSTEADYLS ) THEN
+       CALL UPDATE_HALO_ll(TLSFIELD_ll, IINFO_ll)
+       CALL UPDATE_HALO_ll(TLSFIELD2D_ll,IINFO_ll) 
+       CALL UPDATE_HALO2_ll(TLSFIELD_ll, TLSHALO2_ll, IINFO_ll)
+    END IF
+  END IF
+  !
+!
+  !
+  XT_START     = 0.0_MNHTIME
+  !
+  XT_STORE     = 0.0_MNHTIME
+  XT_BOUND     = 0.0_MNHTIME
+  XT_GUESS     = 0.0_MNHTIME
+  XT_FORCING   = 0.0_MNHTIME
+  XT_NUDGING   = 0.0_MNHTIME
+  XT_ADV       = 0.0_MNHTIME
+  XT_ADVUVW    = 0.0_MNHTIME
+  XT_GRAV      = 0.0_MNHTIME
+  XT_SOURCES   = 0.0_MNHTIME
+  !
+  XT_DIFF      = 0.0_MNHTIME
+  XT_RELAX     = 0.0_MNHTIME
+  XT_PARAM     = 0.0_MNHTIME
+  XT_SPECTRA   = 0.0_MNHTIME
+  XT_HALO      = 0.0_MNHTIME
+  XT_VISC      = 0.0_MNHTIME
+  XT_RAD_BOUND = 0.0_MNHTIME
+  XT_PRESS     = 0.0_MNHTIME
+  !
+  XT_CLOUD     = 0.0_MNHTIME
+  XT_STEP_SWA  = 0.0_MNHTIME
+  XT_STEP_MISC = 0.0_MNHTIME
+  XT_COUPL     = 0.0_MNHTIME
+  XT_1WAY      = 0.0_MNHTIME
+  XT_STEP_BUD  = 0.0_MNHTIME
+  !
+  XT_RAD       = 0.0_MNHTIME
+  XT_DCONV     = 0.0_MNHTIME
+  XT_GROUND    = 0.0_MNHTIME
+  XT_TURB      = 0.0_MNHTIME
+  XT_MAFL      = 0.0_MNHTIME
+  XT_DRAG      = 0.0_MNHTIME
+  XT_EOL       = 0.0_MNHTIME
+  XT_TRACER    = 0.0_MNHTIME
+  XT_SHADOWS   = 0.0_MNHTIME
+  XT_ELEC      = 0.0_MNHTIME
+  XT_CHEM      = 0.0_MNHTIME
+  XT_2WAY      = 0.0_MNHTIME
+  !
+  XT_IBM_FORC  = 0.0_MNHTIME
+  ! Blaze fire model
+  XFIREPERF    = 0.0_MNHTIME
+  !
+END IF
+!
+!*       1.7   Allocation of arrays for observation diagnostics
+!
+CALL INI_DIAG_IN_RUN(IIU,IJU,IKU,LFLYER,LSTATION,LPROFILER)
+!
+!
+CALL SECOND_MNH2(ZEND)
+!
+!-------------------------------------------------------------------------------
+!
+!*       2.    ONE-WAY NESTING AND LARGE SCALE FIELD REFRESH
+!              ---------------------------------------------
+!
+!
+CALL SECOND_MNH2(ZTIME1)
+!
+ISYNCHRO = MODULO (KTCOUNT, NDTRATIO(IMI) )      ! test of synchronisation
+!
+!
+IF (LCOUPLES.AND.LOCEAN) THEN
+   CALL NHOA_COUPL_n(NDAD(IMI),XTSTEP,IMI,KTCOUNT,IKU)
+END IF
+! No Gridnest in coupled OA LES for now
+IF (.NOT. LCOUPLES .AND. IMI/=1 .AND. NDAD(IMI)/=IMI .AND. (ISYNCHRO==1 .OR. NDTRATIO(IMI) == 1) ) THEN     
+!                                                                         
+! Use dummy pointers to correct an ifort BUG
+  DPTR_XBMX1=>XBMX1
+  DPTR_XBMX2=>XBMX2
+  DPTR_XBMX3=>XBMX3
+  DPTR_XBMX4=>XBMX4
+  DPTR_XBMY1=>XBMY1
+  DPTR_XBMY2=>XBMY2
+  DPTR_XBMY3=>XBMY3
+  DPTR_XBMY4=>XBMY4
+  DPTR_XBFX1=>XBFX1
+  DPTR_XBFX2=>XBFX2
+  DPTR_XBFX3=>XBFX3
+  DPTR_XBFX4=>XBFX4
+  DPTR_XBFY1=>XBFY1
+  DPTR_XBFY2=>XBFY2
+  DPTR_XBFY3=>XBFY3
+  DPTR_XBFY4=>XBFY4
+  DPTR_CLBCX=>CLBCX
+  DPTR_CLBCY=>CLBCY
+  !
+  DPTR_XZZ=>XZZ
+  DPTR_XZHAT=>XZHAT
+  DPTR_XCOEFLIN_LBXM=>XCOEFLIN_LBXM
+  DPTR_XLSTHM=>XLSTHM
+  DPTR_XLSRVM=>XLSRVM
+  DPTR_XLSUM=>XLSUM
+  DPTR_XLSVM=>XLSVM
+  DPTR_XLSWM=>XLSWM
+  DPTR_XLSZWSM=>XLSZWSM
+  DPTR_XLSTHS=>XLSTHS
+  DPTR_XLSRVS=>XLSRVS
+  DPTR_XLSUS=>XLSUS
+  DPTR_XLSVS=>XLSVS
+  DPTR_XLSWS=>XLSWS
+  DPTR_XLSZWSS=>XLSZWSS
+  !
+  IF ( LSTEADYLS                     ) THEN
+    NCPL_CUR=0
+  ELSE
+    IF (NCPL_CUR/=1) THEN
+      IF ( KTCOUNT+1 == NCPL_TIMES(NCPL_CUR-1,IMI)  ) THEN
+        !
+        !  LS sources are interpolated from the LS field 
+        ! values of model DAD(IMI)
+        CALL SPAWN_LS_n(NDAD(IMI),XTSTEP,IMI,                        &
+             DPTR_XBMX1,DPTR_XBMX2,DPTR_XBMX3,DPTR_XBMX4,DPTR_XBMY1,DPTR_XBMY2,DPTR_XBMY3,DPTR_XBMY4,        &
+             DPTR_XBFX1,DPTR_XBFX2,DPTR_XBFX3,DPTR_XBFX4,DPTR_XBFY1,DPTR_XBFY2,DPTR_XBFY3,DPTR_XBFY4,        &
+             NDXRATIO_ALL(IMI),NDYRATIO_ALL(IMI),                    &
+             DPTR_CLBCX,DPTR_CLBCY,DPTR_XZZ,DPTR_XZHAT,LSLEVE,XLEN1,XLEN2,DPTR_XCOEFLIN_LBXM, &
+             DPTR_XLSTHM,DPTR_XLSRVM,DPTR_XLSUM,DPTR_XLSVM,DPTR_XLSWM,DPTR_XLSZWSM,                        &
+             DPTR_XLSTHS,DPTR_XLSRVS,DPTR_XLSUS,DPTR_XLSVS,DPTR_XLSWS, DPTR_XLSZWSS                         )
+      END IF
+    END IF
+    !
+  END IF
+  !
+  DPTR_NKLIN_LBXU=>NKLIN_LBXU
+  DPTR_XCOEFLIN_LBXU=>XCOEFLIN_LBXU
+  DPTR_NKLIN_LBYU=>NKLIN_LBYU
+  DPTR_XCOEFLIN_LBYU=>XCOEFLIN_LBYU
+  DPTR_NKLIN_LBXV=>NKLIN_LBXV
+  DPTR_XCOEFLIN_LBXV=>XCOEFLIN_LBXV
+  DPTR_NKLIN_LBYV=>NKLIN_LBYV
+  DPTR_XCOEFLIN_LBYV=>XCOEFLIN_LBYV
+  DPTR_NKLIN_LBXW=>NKLIN_LBXW
+  DPTR_XCOEFLIN_LBXW=>XCOEFLIN_LBXW
+  DPTR_NKLIN_LBYW=>NKLIN_LBYW
+  DPTR_XCOEFLIN_LBYW=>XCOEFLIN_LBYW
+  !
+  DPTR_NKLIN_LBXM=>NKLIN_LBXM
+  DPTR_XCOEFLIN_LBXM=>XCOEFLIN_LBXM
+  DPTR_NKLIN_LBYM=>NKLIN_LBYM
+  DPTR_XCOEFLIN_LBYM=>XCOEFLIN_LBYM
+  !
+  DPTR_XLBXUM=>XLBXUM
+  DPTR_XLBYUM=>XLBYUM
+  DPTR_XLBXVM=>XLBXVM
+  DPTR_XLBYVM=>XLBYVM
+  DPTR_XLBXWM=>XLBXWM
+  DPTR_XLBYWM=>XLBYWM
+  DPTR_XLBXTHM=>XLBXTHM
+  DPTR_XLBYTHM=>XLBYTHM
+  DPTR_XLBXTKEM=>XLBXTKEM
+  DPTR_XLBYTKEM=>XLBYTKEM
+  DPTR_XLBXRM=>XLBXRM
+  DPTR_XLBYRM=>XLBYRM
+  DPTR_XLBXSVM=>XLBXSVM
+  DPTR_XLBYSVM=>XLBYSVM
+  !  
+  DPTR_XLBXUS=>XLBXUS
+  DPTR_XLBYUS=>XLBYUS
+  DPTR_XLBXVS=>XLBXVS
+  DPTR_XLBYVS=>XLBYVS
+  DPTR_XLBXWS=>XLBXWS
+  DPTR_XLBYWS=>XLBYWS
+  DPTR_XLBXTHS=>XLBXTHS
+  DPTR_XLBYTHS=>XLBYTHS
+  DPTR_XLBXTKES=>XLBXTKES
+  DPTR_XLBYTKES=>XLBYTKES
+  DPTR_XLBXRS=>XLBXRS
+  DPTR_XLBYRS=>XLBYRS
+  DPTR_XLBXSVS=>XLBXSVS
+  DPTR_XLBYSVS=>XLBYSVS
+  !
+  CALL ONE_WAY_n(NDAD(IMI),XTSTEP,IMI,KTCOUNT,                   &
+       DPTR_XBMX1,DPTR_XBMX2,DPTR_XBMX3,DPTR_XBMX4,DPTR_XBMY1,DPTR_XBMY2,DPTR_XBMY3,DPTR_XBMY4,        &
+       DPTR_XBFX1,DPTR_XBFX2,DPTR_XBFX3,DPTR_XBFX4,DPTR_XBFY1,DPTR_XBFY2,DPTR_XBFY3,DPTR_XBFY4,        &
+       NDXRATIO_ALL(IMI),NDYRATIO_ALL(IMI),NDTRATIO(IMI),         &
+       DPTR_CLBCX,DPTR_CLBCY,NRIMX,NRIMY,                                &
+       DPTR_NKLIN_LBXU,DPTR_XCOEFLIN_LBXU,DPTR_NKLIN_LBYU,DPTR_XCOEFLIN_LBYU,      &
+       DPTR_NKLIN_LBXV,DPTR_XCOEFLIN_LBXV,DPTR_NKLIN_LBYV,DPTR_XCOEFLIN_LBYV,      &
+       DPTR_NKLIN_LBXW,DPTR_XCOEFLIN_LBXW,DPTR_NKLIN_LBYW,DPTR_XCOEFLIN_LBYW,      &
+       DPTR_NKLIN_LBXM,DPTR_XCOEFLIN_LBXM,DPTR_NKLIN_LBYM,DPTR_XCOEFLIN_LBYM,      &
+       GSTEADY_DMASS,CCLOUD,LUSECHAQ,LUSECHIC,                           &
+       DPTR_XLBXUM,DPTR_XLBYUM,DPTR_XLBXVM,DPTR_XLBYVM,DPTR_XLBXWM,DPTR_XLBYWM,              &
+       DPTR_XLBXTHM,DPTR_XLBYTHM,                                        &
+       DPTR_XLBXTKEM,DPTR_XLBYTKEM,                                      &
+       DPTR_XLBXRM,DPTR_XLBYRM,DPTR_XLBXSVM,DPTR_XLBYSVM,                          &
+       XDRYMASST,XDRYMASSS,                                    &
+       DPTR_XLBXUS,DPTR_XLBYUS,DPTR_XLBXVS,DPTR_XLBYVS,DPTR_XLBXWS,DPTR_XLBYWS,              &
+       DPTR_XLBXTHS,DPTR_XLBYTHS,                                        &
+       DPTR_XLBXTKES,DPTR_XLBYTKES,                                      &
+       DPTR_XLBXRS,DPTR_XLBYRS,DPTR_XLBXSVS,DPTR_XLBYSVS                           )
+  !
+END IF
+!
+CALL SECOND_MNH2(ZTIME2)                                                  
+XT_1WAY = XT_1WAY + ZTIME2 - ZTIME1 
+!
+!*       2.1    RECYCLING TURBULENCE
+!              ---- 
+IF (CTURB /= 'NONE' .AND. LRECYCL) THEN
+  CALL RECYCLING(XFLUCTUNW,XFLUCTVNN,XFLUCTUTN,XFLUCTVTW,XFLUCTWTW,XFLUCTWTN, &
+                 XFLUCTUNE,XFLUCTVNS,XFLUCTUTS,XFLUCTVTE,XFLUCTWTE,XFLUCTWTS, &
+                 KTCOUNT)
+ENDIF
+!
+!*       2.2    IBM
+!              ----
+!
+IF (LIBM .AND. KTCOUNT==1) THEN
+  !
+  IF (.NOT.LCARTESIAN) THEN
+    CALL PRINT_MSG(NVERB_FATAL, 'GEN', 'MODELN', 'IBM can only be used in combination with cartesian coordinates')
+  ENDIF
+  !
+  CALL IBM_INIT(XIBM_LS)
+  !
+ENDIF
+!
+!-------------------------------------------------------------------------------
+!
+!*       3.    LATERAL BOUNDARY CONDITIONS EXCEPT FOR NORMAL VELOCITY
+!              ------------------------------------------------------
+!
+ZTIME1=ZTIME2
+!
+!*       3.1   Set the lagragian variables values at the LB
+!
+IF( LLG .AND. IMI==1 ) CALL SETLB_LG
+!
+IF (CCONF == "START" .OR. (CCONF == "RESTA" .AND. KTCOUNT /= 1 )) THEN
+CALL MPPDB_CHECK3DM("before BOUNDARIES:XUT, XVT, XWT, XTHT, XTKET",PRECISION,&
+                   &  XUT, XVT, XWT, XTHT, XTKET)
+CALL BOUNDARIES (                                                   &
+            XTSTEP,CLBCX,CLBCY,NRR,NSV,KTCOUNT,                     &
+            XLBXUM,XLBXVM,XLBXWM,XLBXTHM,XLBXTKEM,XLBXRM,XLBXSVM,   &
+            XLBYUM,XLBYVM,XLBYWM,XLBYTHM,XLBYTKEM,XLBYRM,XLBYSVM,   &
+            XLBXUS,XLBXVS,XLBXWS,XLBXTHS,XLBXTKES,XLBXRS,XLBXSVS,   &
+            XLBYUS,XLBYVS,XLBYWS,XLBYTHS,XLBYTKES,XLBYRS,XLBYSVS,   &
+            XRHODJ,XRHODREF,                                        &
+            XUT, XVT, XWT, XTHT, XTKET, XRT, XSVT, XSRCT            )
+CALL MPPDB_CHECK3DM("after  BOUNDARIES:XUT, XVT, XWT, XTHT, XTKET",PRECISION,&
+                   &  XUT, XVT, XWT, XTHT, XTKET)
+END IF
+!
+CALL SECOND_MNH2(ZTIME2)
+!
+XT_BOUND = XT_BOUND + ZTIME2 - ZTIME1
+!
+!
+! For START/RESTART MPPDB_CHECK use 
+!IF ( (IMI==1) .AND. (CCONF == "START") .AND. (KTCOUNT == 2) ) THEN
+!   CALL MPPDB_START_DEBUG()
+!ENDIF
+!IF ( (IMI==1) .AND. (CCONF == "RESTA") .AND. (KTCOUNT == 1) ) THEN
+!   CALL MPPDB_START_DEBUG()
+!ENDIF
+!-------------------------------------------------------------------------------
+!* initializes surface number
+IF (CSURF=='EXTE') CALL GOTO_SURFEX(IMI)
+!-------------------------------------------------------------------------------
+!
+!*       4.    STORAGE IN A SYNCHRONOUS FILE
+!              -----------------------------
+!
+ZTIME1 = ZTIME2
+!
+IF ( nfile_backup_current < NBAK_NUMB ) THEN
+  IF ( KTCOUNT == TBACKUPN(nfile_backup_current + 1)%NSTEP ) THEN
+    nfile_backup_current = nfile_backup_current + 1
+    !
+    TPBAKFILE => TBACKUPN(nfile_backup_current)%TFILE
+    IVERB    = TPBAKFILE%NLFIVERB
+    !
+    CALL IO_File_open(TPBAKFILE)
+    !
+    CALL WRITE_DESFM_n(IMI,TPBAKFILE)
+    CALL IO_Header_write( TBACKUPN(nfile_backup_current)%TFILE )
+    IF ( ASSOCIATED( TBACKUPN(nfile_backup_current)%TFILE%TDADFILE ) ) THEN
+      YDADNAME = TBACKUPN(nfile_backup_current)%TFILE%TDADFILE%CNAME
+    ELSE
+      ! Set a dummy name for the dad file. Its non-zero size will allow the writing of some data in the backup file
+      YDADNAME = 'DUMMY'
+    END IF
+    CALL WRITE_LFIFM_n( TBACKUPN(nfile_backup_current)%TFILE, TRIM( YDADNAME ) )
+    TOUTDATAFILE => TPBAKFILE
+    CALL MNHWRITE_ZS_DUMMY_n(TPBAKFILE)
+    IF (CSURF=='EXTE') THEN
+      TFILE_SURFEX => TPBAKFILE
+      CALL GOTO_SURFEX(IMI)
+      CALL WRITE_SURF_ATM_n(YSURF_CUR,'MESONH','ALL')
+      IF ( KTCOUNT > 1) THEN
+        CALL DIAG_SURF_ATM_n(YSURF_CUR,'MESONH')
+        CALL WRITE_DIAG_SURF_ATM_n(YSURF_CUR,'MESONH','ALL', KTCOUNT/nfile_backup_current)
+      END IF
+      NULLIFY(TFILE_SURFEX)
+    END IF
+    !
+    ! Reinitialize Lagragian variables at every model backup
+    IF (LLG .AND. LINIT_LG .AND. CINIT_LG=='FMOUT') THEN
+      CALL INI_LG( XXHATM, XYHATM, XZZ, XSVT, XLBXSVM, XLBYSVM )
+      IF (IVERB>=5) THEN
+        WRITE(UNIT=ILUOUT,FMT=*) '************************************'
+        WRITE(UNIT=ILUOUT,FMT=*) '*** Lagrangian variables refreshed after ',TRIM(TPBAKFILE%CNAME),' backup'
+        WRITE(UNIT=ILUOUT,FMT=*) '************************************'
+      END IF
+    END IF
+    ! Reinitialise mean variables
+    IF (LMEAN_FIELD) THEN
+       CALL INI_MEAN_FIELD
+    END IF
+!
+  ELSE
+    !Necessary to have a 'valid' CNAME when calling some subroutines
+    TPBAKFILE => TFILE_DUMMY
+  END IF
+ELSE
+  !Necessary to have a 'valid' CNAME when calling some subroutines
+  TPBAKFILE => TFILE_DUMMY
+END IF
+!
+IF ( nfile_output_current < NOUT_NUMB ) THEN
+  IF ( KTCOUNT == TOUTPUTN(nfile_output_current + 1)%NSTEP ) THEN
+    nfile_output_current = nfile_output_current + 1
+    !
+    TZOUTFILE => TOUTPUTN(nfile_output_current)%TFILE
+    !
+    CALL IO_File_open(TZOUTFILE)
+    !
+    CALL IO_Header_write(TZOUTFILE)
+    CALL IO_Fieldlist_write(  TOUTPUTN(nfile_output_current) )
+    CALL IO_Field_user_write( TOUTPUTN(nfile_output_current) )
+    !
+    CALL IO_File_close(TZOUTFILE)
+    !
+  END IF
+END IF
+!
+CALL SECOND_MNH2(ZTIME2)
+!
+XT_STORE = XT_STORE + ZTIME2 - ZTIME1
+!
+!-------------------------------------------------------------------------------
+!
+!*       4.BIS    IBM and Fluctuations application
+!              -----------------------------
+!
+!*       4.B1   Add fluctuations at the domain boundaries
+!
+IF (LRECYCL) THEN
+  CALL ADDFLUCTUATIONS (                                    &
+           CLBCX,CLBCY,                                     &
+           XUT, XVT, XWT, XTHT, XTKET, XRT, XSVT, XSRCT,    &
+           XFLUCTUTN,XFLUCTVTW,XFLUCTUTS,XFLUCTVTE,         &
+           XFLUCTWTW,XFLUCTWTN,XFLUCTWTS,XFLUCTWTE          )
+ENDIF
+!
+!*       4.B2   Immersed boundaries
+!
+IF (LIBM) THEN
+  !
+  ZTIME1=ZTIME2
+  !
+  IF (.NOT.LCARTESIAN) THEN
+    CALL PRINT_MSG(NVERB_FATAL, 'GEN', 'MODELN', 'IBM can only be used in combination with cartesian coordinates')
+  ENDIF
+  !
+  CALL IBM_FORCING(XUT,XVT,XWT,XTHT,XRT,XSVT,XTKET)
+  !
+  IF (LIBM_TROUBLE) THEN
+     CALL IBM_FORCING_TR(XUT,XVT,XWT,XTHT,XRT,XSVT,XTKET)
+  ENDIF
+  !
+  CALL SECOND_MNH2(ZTIME2)
+  !
+  XT_IBM_FORC = XT_IBM_FORC + ZTIME2 - ZTIME1
+  !
+ENDIF
+!-------------------------------------------------------------------------------
+!
+!*       5.    INITIALIZATION OF THE BUDGET VARIABLES
+!              --------------------------------------
+!
+IF (NBUMOD==IMI) THEN
+  LBU_ENABLE = CBUTYPE /='NONE'.AND. CBUTYPE /='SKIP' 
+ELSE
+  LBU_ENABLE = .FALSE.
+END IF
+!
+IF (NBUMOD==IMI .AND. CBUTYPE=='MASK' ) THEN
+  CALL SET_MASK()
+  if ( lbu_ru ) then
+    tbudgets(NBUDGET_U)%trhodj%xdata(:, nbutime, :) = tbudgets(NBUDGET_U)%trhodj%xdata(:, nbutime, :) &
+                                                      + Mask_compress( Mxm( xrhodj(:, :, :) ) )
+  end if
+  if ( lbu_rv ) then
+    tbudgets(NBUDGET_V)%trhodj%xdata(:, nbutime, :) = tbudgets(NBUDGET_V)%trhodj%xdata(:, nbutime, :) &
+                                                      + Mask_compress( Mym( xrhodj(:, :, :) ) )
+  end if
+  if ( lbu_rw ) then
+    tbudgets(NBUDGET_W)%trhodj%xdata(:, nbutime, :) = tbudgets(NBUDGET_W)%trhodj%xdata(:, nbutime, :) &
+                                                      + Mask_compress( Mzm( xrhodj(:, :, :) ) )
+  end if
+  if ( associated( tburhodj ) ) tburhodj%xdata(:, nbutime, :) = tburhodj%xdata(:, nbutime, :) + Mask_compress( xrhodj(:, :, :) )
+END IF
+!
+IF (NBUMOD==IMI .AND. CBUTYPE=='CART' ) THEN
+  if ( lbu_ru ) then
+    tbudgets(NBUDGET_U)%trhodj%xdata(:, :, :) = tbudgets(NBUDGET_U)%trhodj%xdata(:, :, :) + Cart_compress( Mxm( xrhodj(:, :, :) ) )
+  end if
+  if ( lbu_rv ) then
+    tbudgets(NBUDGET_V)%trhodj%xdata(:, :, :) = tbudgets(NBUDGET_V)%trhodj%xdata(:, :, :) + Cart_compress( Mym( xrhodj(:, :, :) ) )
+  end if
+  if ( lbu_rw ) then
+    tbudgets(NBUDGET_W)%trhodj%xdata(:, :, :) = tbudgets(NBUDGET_W)%trhodj%xdata(:, :, :) &
+                                                + Cart_compress( Mzm( xrhodj(:, :, :) ) )
+  end if
+  if ( associated( tburhodj ) ) tburhodj%xdata(:, :, :) = tburhodj%xdata(:, :, :) + Cart_compress( xrhodj(:, :, :) )
+END IF
+!
+CALL BUDGET_FLAGS(LUSERV, LUSERC, LUSERR,         &
+                  LUSERI, LUSERS, LUSERG, LUSERH  )
+!
+XTIME_BU   = 0.0
+!
+!-------------------------------------------------------------------------------
+!
+!*       6.    INITIALIZATION OF THE FIELD TENDENCIES
+!              --------------------------------------
+!
+ZTIME1 = ZTIME2
+XTIME_BU_PROCESS = 0.
+!
+CALL INITIAL_GUESS ( NRR, NSV, KTCOUNT, XRHODJ,IMI, XTSTEP,                 &
+                     XRUS, XRVS, XRWS, XRTHS, XRRS, XRTKES, XRSVS,          &
+                     XUT, XVT, XWT, XTHT, XRT, XTKET, XSVT )
+!
+CALL SECOND_MNH2(ZTIME2)
+!
+XT_GUESS = XT_GUESS + ZTIME2 - ZTIME1 - XTIME_BU_PROCESS
+!
+!-------------------------------------------------------------------------------
+!
+!*       7.    INITIALIZATION OF THE LES FOR CURRENT TIME-STEP
+!              -----------------------------------------------
+!
+XTIME_LES_BU   = 0.0
+XTIME_LES      = 0.0
+IF (LLES) CALL LES_INI_TIMESTEP_n(KTCOUNT)
+!
+!-------------------------------------------------------------------------------
+!
+!*       8.    TWO-WAY INTERACTIVE GRID-NESTING
+!              --------------------------------
+!
+!
+CALL SECOND_MNH2(ZTIME1)
+XTIME_BU_PROCESS = 0.
+XTIME_LES_BU_PROCESS = 0.
+!
+GMASKkids(:,:)=.FALSE.
+!
+IF (NMODEL>1) THEN
+  ! correct an ifort bug
+  DPTR_XRHODJ=>XRHODJ
+  DPTR_XUM=>XUT
+  DPTR_XVM=>XVT
+  DPTR_XWM=>XWT
+  DPTR_XTHM=>XTHT
+  DPTR_XRM=>XRT
+  DPTR_XTKEM=>XTKET
+  DPTR_XSVM=>XSVT
+  DPTR_XRUS=>XRUS
+  DPTR_XRVS=>XRVS
+  DPTR_XRWS=>XRWS
+  DPTR_XRTHS=>XRTHS
+  DPTR_XRRS=>XRRS
+  DPTR_XRTKES=>XRTKES
+  DPTR_XRSVS=>XRSVS
+  DPTR_XINPRC=>XINPRC
+  DPTR_XINPRR=>XINPRR
+  DPTR_XINPRS=>XINPRS
+  DPTR_XINPRG=>XINPRG
+  DPTR_XINPRH=>XINPRH
+  DPTR_XPRCONV=>XPRCONV
+  DPTR_XPRSCONV=>XPRSCONV
+  DPTR_XDIRFLASWD=>XDIRFLASWD
+  DPTR_XSCAFLASWD=>XSCAFLASWD
+  DPTR_XDIRSRFSWD=>XDIRSRFSWD
+  DPTR_GMASKkids=>GMASKkids
+  !
+  CALL TWO_WAY(     NRR,NSV,KTCOUNT,DPTR_XRHODJ,IMI,XTSTEP,                                    &
+       DPTR_XUM ,DPTR_XVM ,DPTR_XWM , DPTR_XTHM, DPTR_XRM,DPTR_XSVM,                           &
+       DPTR_XRUS,DPTR_XRVS,DPTR_XRWS,DPTR_XRTHS,DPTR_XRRS,DPTR_XRSVS,                          &
+       DPTR_XINPRC,DPTR_XINPRR,DPTR_XINPRS,DPTR_XINPRG,DPTR_XINPRH,DPTR_XPRCONV,DPTR_XPRSCONV, &
+       DPTR_XDIRFLASWD,DPTR_XSCAFLASWD,DPTR_XDIRSRFSWD,DPTR_GMASKkids           )
+END IF
+!
+CALL SECOND_MNH2(ZTIME2)
+XT_2WAY = XT_2WAY + ZTIME2 - ZTIME1 - XTIME_LES_BU_PROCESS - XTIME_BU_PROCESS
+!
+!-------------------------------------------------------------------------------
+!-------------------------------------------------------------------------------
+!
+!*       10.    FORCING
+!               -------
+!
+!
+ZTIME1 = ZTIME2
+XTIME_BU_PROCESS = 0.
+XTIME_LES_BU_PROCESS = 0.
+IF (LCARTESIAN) THEN
+  CALL SM_GRIDCART(XXHAT,XYHAT,XZHAT,XZS,LSLEVE,XLEN1,XLEN2,XZSMT,XDXHAT,XDYHAT,XZZ,ZJ)
+  XMAP=1.
+ELSE
+  CALL SM_GRIDPROJ( XXHAT, XYHAT, XZHAT, XXHATM, XYHATM, XZS,      &
+                    LSLEVE, XLEN1, XLEN2, XZSMT, XLATORI, XLONORI, &
+                    XMAP, XLAT, XLON, XDXHAT, XDYHAT, XZZ, ZJ      )
+END IF
+!
+IF ( LFORCING ) THEN
+  CALL FORCING(XTSTEP,LUSERV,XRHODJ,XCORIOZ,XZHAT,XZZ,TDTCUR,&
+               XUFRC_PAST, XVFRC_PAST,XWTFRC,         &
+               XUT,XVT,XWT,XTHT,XTKET,XRT,XSVT,       &
+               XRUS,XRVS,XRWS,XRTHS,XRTKES,XRRS,XRSVS,IMI,ZJ)
+END IF
+!
+IF ( L2D_ADV_FRC ) THEN 
+  CALL ADV_FORCING_n(XRHODJ,TDTCUR,XTHT,XRT,XZZ,XRTHS,XRRS)
+END IF
+IF ( L2D_REL_FRC ) THEN 
+  CALL REL_FORCING_n(XRHODJ,TDTCUR,XTHT,XRT,XZZ,XRTHS,XRRS)
+END IF
+!
+CALL SECOND_MNH2(ZTIME2)
+!
+XT_FORCING = XT_FORCING + ZTIME2 - ZTIME1 &
+             - XTIME_LES_BU_PROCESS - XTIME_BU_PROCESS
+!
+!-------------------------------------------------------------------------------
+!
+!*       11.    NUDGING
+!               -------
+!
+!
+ZTIME1 = ZTIME2
+XTIME_BU_PROCESS = 0.
+XTIME_LES_BU_PROCESS = 0.
+!
+IF ( LNUDGING ) THEN
+  CALL NUDGING(LUSERV,XRHODJ,XTNUDGING,         &
+               XUT,XVT,XWT,XTHT,XRT,            &
+               XLSUM,XLSVM,XLSWM,XLSTHM,XLSRVM, &
+               XRUS,XRVS,XRWS,XRTHS,XRRS)
+
+END IF
+!
+CALL SECOND_MNH2(ZTIME2)
+!
+XT_NUDGING = XT_NUDGING + ZTIME2 - ZTIME1 &
+             - XTIME_LES_BU_PROCESS - XTIME_BU_PROCESS
+!
+!-------------------------------------------------------------------------------
+!
+!*       12.    DYNAMICAL SOURCES
+!               -----------------
+!
+ZTIME1 = ZTIME2
+XTIME_BU_PROCESS = 0.
+XTIME_LES_BU_PROCESS = 0.
+!
+IF( LTRANS ) THEN
+  XUT(:,:,:) = XUT(:,:,:) + XUTRANS
+  XVT(:,:,:) = XVT(:,:,:) + XVTRANS
+END IF
+!
+CALL DYN_SOURCES( NRR,NRRL, NRRI,                              &
+                  XUT, XVT, XWT, XTHT, XRT,                    &
+                  XCORIOX, XCORIOY, XCORIOZ, XCURVX, XCURVY,   &
+                  XRHODJ, XZZ, XTHVREF, XEXNREF,               &
+                  XRUS, XRVS, XRWS, XRTHS                      )
+!
+IF( LTRANS ) THEN
+  XUT(:,:,:) = XUT(:,:,:) - XUTRANS
+  XVT(:,:,:) = XVT(:,:,:) - XVTRANS
+END IF
+!
+CALL SECOND_MNH2(ZTIME2)
+!
+XT_SOURCES = XT_SOURCES + ZTIME2 - ZTIME1 &
+             - XTIME_LES_BU_PROCESS - XTIME_BU_PROCESS
+!
+!-------------------------------------------------------------------------------
+!
+!*       13.    NUMERICAL DIFFUSION
+!               -------------------
+!
+ZTIME1 = ZTIME2
+XTIME_BU_PROCESS = 0.
+XTIME_LES_BU_PROCESS = 0.
+!
+IF ( LNUMDIFU .OR. LNUMDIFTH .OR. LNUMDIFSV ) THEN
+!
+  CALL UPDATE_HALO_ll(TFIELDT_ll, IINFO_ll)
+  CALL UPDATE_HALO2_ll(TFIELDT_ll, THALO2T_ll, IINFO_ll)
+  IF ( .NOT. LSTEADYLS ) THEN
+     CALL UPDATE_HALO_ll(TLSFIELD_ll, IINFO_ll)
+     CALL UPDATE_HALO_ll(TLSFIELD2D_ll,IINFO_ll) 
+     CALL UPDATE_HALO2_ll(TLSFIELD_ll, TLSHALO2_ll, IINFO_ll)
+  END IF
+  CALL NUM_DIFF ( CLBCX, CLBCY, NRR, NSV,                               &
+                  XDK2U, XDK4U, XDK2TH, XDK4TH, XDK2SV, XDK4SV, IMI,    &
+                  XUT, XVT, XWT, XTHT, XTKET, XRT, XSVT,                &
+                  XLSUM,XLSVM,XLSWM,XLSTHM,XLSRVM,XRHODJ,               &
+                  XRUS, XRVS, XRWS, XRTHS, XRTKES, XRRS, XRSVS,         &
+                  LZDIFFU,LNUMDIFU, LNUMDIFTH, LNUMDIFSV,               &
+                  THALO2T_ll, TLSHALO2_ll,XZDIFFU_HALO2      )
+END IF
+
+if ( lbudget_sv ) then
+  do jsv = 1, nsv
+    call Budget_store_init( tbudgets(jsv + NBUDGET_SV1 - 1), 'NEGA2', xrsvs(:, :, :, jsv) )
+  end do
+end if
+
+DO JSV = NSV_CHEMBEG,NSV_CHEMEND
+  XRSVS(:,:,:,JSV) = MAX(XRSVS(:,:,:,JSV),0.)
+END DO
+DO JSV = NSV_CHICBEG,NSV_CHICEND
+  XRSVS(:,:,:,JSV) = MAX(XRSVS(:,:,:,JSV),0.)
+END DO
+DO JSV = NSV_AERBEG,NSV_AEREND
+  XRSVS(:,:,:,JSV) = MAX(XRSVS(:,:,:,JSV),0.)
+END DO
+DO JSV = NSV_LNOXBEG,NSV_LNOXEND
+  XRSVS(:,:,:,JSV) = MAX(XRSVS(:,:,:,JSV),0.)
+END DO
+DO JSV = NSV_DSTBEG,NSV_DSTEND
+  XRSVS(:,:,:,JSV) = MAX(XRSVS(:,:,:,JSV),0.)
+END DO
+DO JSV = NSV_SLTBEG,NSV_SLTEND
+  XRSVS(:,:,:,JSV) = MAX(XRSVS(:,:,:,JSV),0.)
+END DO
+DO JSV = NSV_PPBEG,NSV_PPEND
+  XRSVS(:,:,:,JSV) = MAX(XRSVS(:,:,:,JSV),0.)
+END DO
+#ifdef MNH_FOREFIRE
+DO JSV = NSV_FFBEG,NSV_FFEND
+  XRSVS(:,:,:,JSV) = MAX(XRSVS(:,:,:,JSV),0.)
+END DO
+#endif
+! Blaze smoke
+DO JSV = NSV_FIREBEG,NSV_FIREEND
+  XRSVS(:,:,:,JSV) = MAX(XRSVS(:,:,:,JSV),0.)
+END DO
+DO JSV = NSV_CSBEG,NSV_CSEND
+  XRSVS(:,:,:,JSV) = MAX(XRSVS(:,:,:,JSV),0.)
+END DO
+DO JSV = NSV_DSTDEPBEG,NSV_DSTDEPEND
+  XRSVS(:,:,:,JSV) = MAX(XRSVS(:,:,:,JSV),0.)
+END DO
+DO JSV = NSV_SLTDEPBEG,NSV_SLTDEPEND
+  XRSVS(:,:,:,JSV) = MAX(XRSVS(:,:,:,JSV),0.)
+END DO
+DO JSV = NSV_AERDEPBEG,NSV_AERDEPEND
+  XRSVS(:,:,:,JSV) = MAX(XRSVS(:,:,:,JSV),0.)
+END DO
+DO JSV = NSV_SNWBEG,NSV_SNWEND
+  XRSVS(:,:,:,JSV) = MAX(XRSVS(:,:,:,JSV),0.)
+END DO
+IF (CELEC .NE. 'NONE') THEN
+  XRSVS(:,:,:,NSV_ELECBEG) = MAX(XRSVS(:,:,:,NSV_ELECBEG),0.)
+  XRSVS(:,:,:,NSV_ELECEND) = MAX(XRSVS(:,:,:,NSV_ELECEND),0.)
+END IF
+
+if ( lbudget_sv ) then
+  do jsv = 1, nsv
+    call Budget_store_end( tbudgets(jsv + NBUDGET_SV1 - 1), 'NEGA2', xrsvs(:, :, :, jsv) )
+  end do
+end if
+!
+CALL SECOND_MNH2(ZTIME2)
+!
+XT_DIFF = XT_DIFF + ZTIME2 - ZTIME1 &
+          - XTIME_LES_BU_PROCESS - XTIME_BU_PROCESS
+!
+!-------------------------------------------------------------------------------
+!
+!*       14.    UPPER AND LATERAL RELAXATION
+!               ----------------------------
+!
+ZTIME1 = ZTIME2
+XTIME_BU_PROCESS = 0.
+XTIME_LES_BU_PROCESS = 0.
+!
+IF(LVE_RELAX .OR. LVE_RELAX_GRD .OR. LHORELAX_UVWTH .OR. LHORELAX_RV .OR.&
+   LHORELAX_RC .OR. LHORELAX_RR .OR. LHORELAX_RI .OR. LHORELAX_RS .OR.   &
+   LHORELAX_RG .OR. LHORELAX_RH .OR. LHORELAX_TKE .OR.                   &
+   ANY(LHORELAX_SV)) THEN
+  CALL RELAXATION (LVE_RELAX,LVE_RELAX_GRD,LHORELAX_UVWTH,LHORELAX_RV,LHORELAX_RC,   &
+                   LHORELAX_RR,LHORELAX_RI,LHORELAX_RS,LHORELAX_RG,    &
+                   LHORELAX_RH,LHORELAX_TKE,LHORELAX_SV,               &
+                   LHORELAX_SVC2R2,LHORELAX_SVC1R3,                    &
+                   LHORELAX_SVELEC,LHORELAX_SVLG,                      &
+                   LHORELAX_SVCHEM,LHORELAX_SVCHIC,LHORELAX_SVAER,     &
+                   LHORELAX_SVDST,LHORELAX_SVSLT,LHORELAX_SVPP,        &
+                   LHORELAX_SVCS,LHORELAX_SVSNW,LHORELAX_SVFIRE,       &
+#ifdef MNH_FOREFIRE
+                   LHORELAX_SVFF,                                      &
+#endif
+                   KTCOUNT,NRR,NSV,XTSTEP,XRHODJ,                      &
+                   XUT, XVT, XWT, XTHT, XRT, XSVT, XTKET,              &
+                   XLSUM, XLSVM, XLSWM, XLSTHM,                        &
+                   XLBXUM, XLBXVM, XLBXWM, XLBXTHM,                    &
+                   XLBXRM, XLBXSVM, XLBXTKEM,                          &
+                   XLBYUM, XLBYVM, XLBYWM, XLBYTHM,                    &
+                   XLBYRM, XLBYSVM, XLBYTKEM,                          &
+                   NALBOT, XALK, XALKW,                                &
+                   NALBAS, XALKBAS, XALKWBAS,                          &
+                   LMASK_RELAX,XKURELAX, XKVRELAX, XKWRELAX,           &
+                   NRIMX,NRIMY,                                        &
+                   XRUS, XRVS, XRWS, XRTHS, XRRS, XRSVS, XRTKES        )
+END IF
+
+IF (CELEC.NE.'NONE' .AND. LRELAX2FW_ION) THEN
+   CALL RELAX2FW_ION (KTCOUNT, IMI, XTSTEP, XRHODJ, XSVT, NALBOT,      &
+                      XALK, LMASK_RELAX, XKWRELAX, XRSVS )   
+END IF                      
+!
+CALL SECOND_MNH2(ZTIME2)
+!
+XT_RELAX = XT_RELAX + ZTIME2 - ZTIME1 &
+           - XTIME_LES_BU_PROCESS - XTIME_BU_PROCESS
+!
+!-------------------------------------------------------------------------------
+!
+!*       15.    PARAMETRIZATIONS' MONITOR
+!               -------------------------
+!
+ZTIME1 = ZTIME2
+!
+CALL PHYS_PARAM_n( KTCOUNT, TPBAKFILE,                            &
+                   XT_RAD,  XT_SHADOWS, XT_DCONV, XT_GROUND,      &
+                   XT_MAFL, XT_DRAG, XT_EOL, XT_TURB,  XT_TRACER, &
+                   ZTIME, ZWETDEPAER, GMASKkids, GCLOUD_ONLY      )
+!
+IF (CDCONV/='NONE') THEN
+  XPACCONV = XPACCONV + XPRCONV * XTSTEP
+  IF (LCH_CONV_LINOX) THEN
+    XIC_TOTAL_NUMBER = XIC_TOTAL_NUMBER + XIC_RATE * XTSTEP
+    XCG_TOTAL_NUMBER = XCG_TOTAL_NUMBER + XCG_RATE * XTSTEP
+  END IF
+END IF
+!
+!
+CALL SECOND_MNH2(ZTIME2)
+!
+XT_PARAM = XT_PARAM + ZTIME2 - ZTIME1 - XTIME_LES - ZTIME
+!
+!-------------------------------------------------------------------------------
+!
+!*       16.    TEMPORAL SERIES
+!               ---------------
+!
+ZTIME1 = ZTIME2
+!
+IF (LSERIES) THEN
+  IF ( MOD (KTCOUNT-1,NFREQSERIES) == 0 ) CALL SERIES_n
+END IF
+!
+CALL SECOND_MNH2(ZTIME2)
+!
+XT_STEP_MISC = XT_STEP_MISC + ZTIME2 - ZTIME1
+!
+!-------------------------------------------------------------------------------
+!
+!*       17.    LARGE SCALE FIELD REFRESH
+!               -------------------------
+!
+ZTIME1 = ZTIME2
+!
+IF (.NOT. LSTEADYLS) THEN
+  IF (  IMI==1                             .AND.      &
+    NCPL_CUR < NCPL_NBR                              ) THEN
+    IF (KTCOUNT+1 == NCPL_TIMES(NCPL_CUR,1)          ) THEN
+                                  ! The next current time reachs a
+      NCPL_CUR=NCPL_CUR+1         ! coupling one, LS sources are refreshed
+      !
+      CALL LS_COUPLING(XTSTEP,GSTEADY_DMASS,CCONF,                          &
+             CGETTKET,                                                      &
+             CGETRVT,CGETRCT,CGETRRT,CGETRIT,                               &
+             CGETRST,CGETRGT,CGETRHT,CGETSVT,LCH_INIT_FIELD, NSV,           &
+             NIMAX_ll,NJMAX_ll,                                             &
+             NSIZELBX_ll,NSIZELBXU_ll,NSIZELBY_ll,NSIZELBYV_ll,             &
+             NSIZELBXTKE_ll,NSIZELBYTKE_ll,                                 &
+             NSIZELBXR_ll,NSIZELBYR_ll,NSIZELBXSV_ll,NSIZELBYSV_ll,         &
+             XLSUM,XLSVM,XLSWM,XLSTHM,XLSRVM,XLSZWSM,XDRYMASST,             &
+             XLBXUM,XLBXVM,XLBXWM,XLBXTHM,XLBXTKEM,XLBXRM,XLBXSVM,          &
+             XLBYUM,XLBYVM,XLBYWM,XLBYTHM,XLBYTKEM,XLBYRM,XLBYSVM,          &
+             XLSUS,XLSVS,XLSWS,XLSTHS,XLSRVS,XLSZWSS,XDRYMASSS,             &
+             XLBXUS,XLBXVS,XLBXWS,XLBXTHS,XLBXTKES,XLBXRS,XLBXSVS,          &
+             XLBYUS,XLBYVS,XLBYWS,XLBYTHS,XLBYTKES,XLBYRS,XLBYSVS           )
+      !
+      DO JSV=NSV_CHEMBEG,NSV_CHEMEND
+        XLBXSVS(:,:,:,JSV)=MAX(XLBXSVS(:,:,:,JSV),0.)
+        XLBYSVS(:,:,:,JSV)=MAX(XLBYSVS(:,:,:,JSV),0.)
+      ENDDO
+      !
+      DO JSV=NSV_LNOXBEG,NSV_LNOXEND
+        XLBXSVS(:,:,:,JSV)=MAX(XLBXSVS(:,:,:,JSV),0.)
+        XLBYSVS(:,:,:,JSV)=MAX(XLBYSVS(:,:,:,JSV),0.)
+      ENDDO
+      !
+      DO JSV=NSV_AERBEG,NSV_AEREND
+        XLBXSVS(:,:,:,JSV)=MAX(XLBXSVS(:,:,:,JSV),0.)
+        XLBYSVS(:,:,:,JSV)=MAX(XLBYSVS(:,:,:,JSV),0.)
+      ENDDO
+      !
+      DO JSV=NSV_DSTBEG,NSV_DSTEND
+        XLBXSVS(:,:,:,JSV)=MAX(XLBXSVS(:,:,:,JSV),0.)
+        XLBYSVS(:,:,:,JSV)=MAX(XLBYSVS(:,:,:,JSV),0.)
+      ENDDO
+      !
+      DO JSV=NSV_DSTDEPBEG,NSV_DSTDEPEND
+        XLBXSVS(:,:,:,JSV)=MAX(XLBXSVS(:,:,:,JSV),0.)
+        XLBYSVS(:,:,:,JSV)=MAX(XLBYSVS(:,:,:,JSV),0.)
+      ENDDO
+      !
+      DO JSV=NSV_SLTBEG,NSV_SLTEND
+        XLBXSVS(:,:,:,JSV)=MAX(XLBXSVS(:,:,:,JSV),0.)
+        XLBYSVS(:,:,:,JSV)=MAX(XLBYSVS(:,:,:,JSV),0.)
+      ENDDO
+      !
+      DO JSV=NSV_SLTDEPBEG,NSV_SLTDEPEND
+        XLBXSVS(:,:,:,JSV)=MAX(XLBXSVS(:,:,:,JSV),0.)
+        XLBYSVS(:,:,:,JSV)=MAX(XLBYSVS(:,:,:,JSV),0.)
+      ENDDO
+      !
+      DO JSV=NSV_PPBEG,NSV_PPEND
+        XLBXSVS(:,:,:,JSV)=MAX(XLBXSVS(:,:,:,JSV),0.)
+        XLBYSVS(:,:,:,JSV)=MAX(XLBYSVS(:,:,:,JSV),0.)
+      ENDDO
+      !
+#ifdef MNH_FOREFIRE
+      DO JSV=NSV_FFBEG,NSV_FFEND
+        XLBXSVS(:,:,:,JSV)=MAX(XLBXSVS(:,:,:,JSV),0.)
+        XLBYSVS(:,:,:,JSV)=MAX(XLBYSVS(:,:,:,JSV),0.)
+      ENDDO
+      !
+#endif
+      DO JSV=NSV_FIREBEG,NSV_FIREEND
+        XLBXSVS(:,:,:,JSV)=MAX(XLBXSVS(:,:,:,JSV),0.)
+        XLBYSVS(:,:,:,JSV)=MAX(XLBYSVS(:,:,:,JSV),0.)
+      ENDDO
+      !
+      DO JSV=NSV_CSBEG,NSV_CSEND
+        XLBXSVS(:,:,:,JSV)=MAX(XLBXSVS(:,:,:,JSV),0.)
+        XLBYSVS(:,:,:,JSV)=MAX(XLBYSVS(:,:,:,JSV),0.)
+      ENDDO
+      !
+      DO JSV=NSV_SNWBEG,NSV_SNWEND
+        XLBXSVS(:,:,:,JSV)=MAX(XLBXSVS(:,:,:,JSV),0.)
+        XLBYSVS(:,:,:,JSV)=MAX(XLBYSVS(:,:,:,JSV),0.)
+      ENDDO
+      !
+     END IF
+  END IF
+END IF
+!
+CALL SECOND_MNH2(ZTIME2)
+!
+XT_COUPL = XT_COUPL + ZTIME2 - ZTIME1
+!
+!-------------------------------------------------------------------------------
+!
+!
+!
+!*      8 Bis . Blowing snow scheme
+!              ---------
+!
+IF ( LBLOWSNOW ) THEN
+ CALL BLOWSNOW( XTSTEP, NRR, XPABST, XTHT, XRT, XZZ, XRHODREF,        &
+                XRHODJ, XEXNREF, XRRS, XRTHS, XSVT, XRSVS, XSNWSUBL3D )
+ENDIF
+!
+!-----------------------------------------------------------------------
+!
+!*       8 Ter  VISCOSITY (no-slip condition inside)
+!              ---------
+!
+!
+IF ( LVISC ) THEN
+!
+ZTIME1 = ZTIME2
+!
+   CALL VISCOSITY(CLBCX, CLBCY, NRR, NSV, XMU_V,XPRANDTL,         &
+                  LVISC_UVW,LVISC_TH,LVISC_SV,LVISC_R,            &
+                  LDRAG,    &
+                  XUT, XVT, XWT, XTHT, XRT, XSVT,                 &
+                  XRHODJ, XDXX, XDYY, XDZZ, XDZX, XDZY,           &
+                  XRUS, XRVS, XRWS, XRTHS, XRRS, XRSVS,XDRAG )
+!
+ENDIF
+!
+CALL SECOND_MNH2(ZTIME2)
+!
+XT_VISC = XT_VISC + ZTIME2 - ZTIME1
+!!
+!-------------------------------------------------------------------------------
+!
+!*       9.    ADVECTION
+!              ---------
+!
+ZTIME1 = ZTIME2
+XTIME_BU_PROCESS = 0.
+XTIME_LES_BU_PROCESS = 0.
+!
+!
+!
+CALL MPPDB_CHECK3DM("before ADVEC_METSV:XU/V/W/TH/TKE/T,XRHODJ",PRECISION,&
+                   &  XUT, XVT, XWT, XTHT, XTKET,XRHODJ)
+ CALL ADVECTION_METSV ( TPBAKFILE, CUVW_ADV_SCHEME,                    &
+                 CMET_ADV_SCHEME, CSV_ADV_SCHEME, CCLOUD, NSPLIT,      &
+                 LSPLIT_CFL, XSPLIT_CFL, LCFL_WRIT,                    &
+                 CLBCX, CLBCY, NRR, NSV, TDTCUR, XTSTEP,               &
+                 XUT, XVT, XWT, XTHT, XRT, XTKET, XSVT, XPABST,        &
+                 XTHVREF, XRHODJ, XDXX, XDYY, XDZZ, XDZX, XDZY,        &
+                 XRTHS, XRRS, XRTKES, XRSVS,                           &
+                 XRTHS_CLD, XRRS_CLD, XRSVS_CLD, XRTKEMS               )
+CALL MPPDB_CHECK3DM("after  ADVEC_METSV:XU/V/W/TH/TKE/T,XRHODJ ",PRECISION,&
+                   &  XUT, XVT, XWT, XTHT, XTKET,XRHODJ)
+!
+CALL SECOND_MNH2(ZTIME2)
+!
+XT_ADV = XT_ADV + ZTIME2 - ZTIME1 - XTIME_LES_BU_PROCESS - XTIME_BU_PROCESS
+!
+!-------------------------------------------------------------------------------
+ZTIME1 = ZTIME2
+XTIME_BU_PROCESS = 0.
+XTIME_LES_BU_PROCESS = 0.
+!
+ZRWS = XRWS
+!
+CALL GRAVITY_IMPL ( CLBCX, CLBCY, NRR, NRRL, NRRI,XTSTEP,            &
+                 XTHT, XRT, XTHVREF, XRHODJ, XRWS, XRTHS, XRRS,      &
+                 XRTHS_CLD, XRRS_CLD                                 )   
+!
+! At the initial instant the difference with the ref state creates a 
+! vertical velocity production that must not be advected as it is 
+! compensated by the pressure gradient
+!
+IF (KTCOUNT == 1 .AND. CCONF=='START') XRWS_PRES = - (XRWS - ZRWS) 
+!
+CALL SECOND_MNH2(ZTIME2)
+!
+XT_GRAV = XT_GRAV + ZTIME2 - ZTIME1 - XTIME_LES_BU_PROCESS - XTIME_BU_PROCESS
+! 
+IF ( LIBM .AND. CIBM_ADV=='FORCIN' ) THEN
+  !
+  ZTIME1=ZTIME2
+  !
+  CALL IBM_FORCING_ADV   (XRUS,XRVS,XRWS)
+  !
+  CALL SECOND_MNH2(ZTIME2)
+  !
+  XT_IBM_FORC = XT_IBM_FORC + ZTIME2 - ZTIME1
+  !
+ENDIF
+!
+ZTIME1 = ZTIME2
+XTIME_BU_PROCESS = 0.
+XTIME_LES_BU_PROCESS = 0.
+!
+!MPPDB_CHECK_LB=.TRUE.
+CALL MPPDB_CHECK3DM("before ADVEC_UVW:XU/V/W/TH/TKE/T,XRHODJ,XRU/V/Ws",PRECISION,&
+                   &  XUT, XVT, XWT, XTHT, XTKET,XRHODJ,XRUS,XRVS,XRWS)
+IF ((CUVW_ADV_SCHEME(1:3)=='CEN') .AND. (CTEMP_SCHEME == 'LEFR')) THEN
+  IF (CUVW_ADV_SCHEME=='CEN4TH') THEN
+    NULLIFY(TZFIELDC_ll)
+    NULLIFY(TZHALO2C_ll)
+      CALL ADD3DFIELD_ll( TZFIELDC_ll, XUT, 'MODEL_n::XUT' )
+      CALL ADD3DFIELD_ll( TZFIELDC_ll, XVT, 'MODEL_n::XVT' )
+      CALL ADD3DFIELD_ll( TZFIELDC_ll, XWT, 'MODEL_n::XWT' )
+      CALL INIT_HALO2_ll(TZHALO2C_ll,3,IIU,IJU,IKU)
+      CALL UPDATE_HALO_ll(TZFIELDC_ll,IINFO_ll)
+      CALL UPDATE_HALO2_ll(TZFIELDC_ll, TZHALO2C_ll, IINFO_ll)
+  END IF
+ CALL ADVECTION_UVW_CEN(CUVW_ADV_SCHEME,                &
+                           CLBCX, CLBCY,                           &
+                           XTSTEP, KTCOUNT,                        &
+                           XUM, XVM, XWM, XDUM, XDVM, XDWM,        &
+                           XUT, XVT, XWT,                          &
+                           XRHODJ, XDXX, XDYY, XDZZ, XDZX, XDZY,   &
+                           XRUS,XRVS, XRWS,                        &
+                           TZHALO2C_ll                             )
+  IF (CUVW_ADV_SCHEME=='CEN4TH') THEN
+    CALL CLEANLIST_ll(TZFIELDC_ll)
+    NULLIFY(TZFIELDC_ll)
+    CALL  DEL_HALO2_ll(TZHALO2C_ll)
+    NULLIFY(TZHALO2C_ll)
+  END IF
+ELSE
+
+  CALL ADVECTION_UVW(CUVW_ADV_SCHEME, CTEMP_SCHEME,                  &
+                 NWENO_ORDER, LSPLIT_WENO,                           &
+                 CLBCX, CLBCY, XTSTEP,                               &
+                 XUT, XVT, XWT,                                      &
+                 XRHODJ, XDXX, XDYY, XDZZ, XDZX, XDZY,               &
+                 XRUS, XRVS, XRWS,                                   &
+                 XRUS_PRES, XRVS_PRES, XRWS_PRES                     )
+END IF
+!
+CALL MPPDB_CHECK3DM("after  ADVEC_UVW:XU/V/W/TH/TKE/T,XRHODJ,XRU/V/Ws",PRECISION,&
+                   &  XUT, XVT, XWT, XTHT, XTKET,XRHODJ,XRUS,XRVS,XRWS)
+!MPPDB_CHECK_LB=.FALSE.
+!
+CALL SECOND_MNH2(ZTIME2)
+!
+XT_ADVUVW = XT_ADVUVW + ZTIME2 - ZTIME1 - XTIME_LES_BU_PROCESS - XTIME_BU_PROCESS
+!
+!-------------------------------------------------------------------------------
+!
+IF (LCLOUDMODIFLM) THEN
+  CALL TURB_CLOUD_INDEX( XTSTEP, TPBAKFILE,                               &
+                         LTURB_DIAG, NRRI,                                &
+                         XRRS, XRT, XRHODJ, XDXX, XDYY, XDZZ, XDZX, XDZY, &
+                         XCEI                                             )
+END IF
+!
+!-------------------------------------------------------------------------------
+!
+!*       18.    LATERAL BOUNDARY CONDITION FOR THE NORMAL VELOCITY
+!               --------------------------------------------------
+!
+ZTIME1 = ZTIME2
+!
+CALL MPPDB_CHECK3DM("before RAD_BOUND :XRU/V/WS",PRECISION,XRUS,XRVS,XRWS)
+ZRUS=XRUS
+ZRVS=XRVS
+ZRWS=XRWS
+!
+if ( .not. l1d ) then
+  if ( lbudget_u ) call Budget_store_init( tbudgets(NBUDGET_U), 'PRES', xrus(:, :, :) )
+  if ( lbudget_v ) call Budget_store_init( tbudgets(NBUDGET_V), 'PRES', xrvs(:, :, :) )
+  if ( lbudget_w ) call Budget_store_init( tbudgets(NBUDGET_W), 'PRES', xrws(:, :, :) )
+end if
+!
+CALL MPPDB_CHECK3DM("before RAD_BOUND : other var",PRECISION,XUT,XVT,XRHODJ,XTKET)
+CALL MPPDB_CHECKLB(XLBXUM,"modeln XLBXUM",PRECISION,'LBXU',NRIMX)
+CALL MPPDB_CHECKLB(XLBYVM,"modeln XLBYVM",PRECISION,'LBYV',NRIMY)
+CALL MPPDB_CHECKLB(XLBXUS,"modeln XLBXUS",PRECISION,'LBXU',NRIMX)
+CALL MPPDB_CHECKLB(XLBYVS,"modeln XLBYVS",PRECISION,'LBYV',NRIMY)
+!
+  CALL RAD_BOUND (CLBCX,CLBCY,CTURB,XCARPKMAX,           &
+                XTSTEP,                                  &
+                XDXHAT, XDYHAT, XZHAT,                   &
+                XUT, XVT,                                &
+                XLBXUM, XLBYVM, XLBXUS, XLBYVS,          &
+                XFLUCTUNW,XFLUCTVNN,XFLUCTUNE,XFLUCTVNS, &
+                XCPHASE, XCPHASE_PBL, XRHODJ,            &
+                XTKET,XRUS, XRVS, XRWS                   )
+ZRUS=XRUS-ZRUS
+ZRVS=XRVS-ZRVS
+ZRWS=XRWS-ZRWS
+!
+CALL SECOND_MNH2(ZTIME2)
+!
+XT_RAD_BOUND = XT_RAD_BOUND + ZTIME2 - ZTIME1
+!
+!-------------------------------------------------------------------------------
+!
+!*       19.    PRESSURE COMPUTATION
+!               --------------------
+!
+ZTIME1 = ZTIME2
+XTIME_BU_PROCESS = 0.
+XTIME_LES_BU_PROCESS = 0.
+!
+ZPABST = XPABST
+!
+IF(.NOT. L1D) THEN
+!
+CALL MPPDB_CHECK3DM("before pressurez:XRU/V/WS",PRECISION,XRUS,XRVS,XRWS)
+  XRUS_PRES = XRUS
+  XRVS_PRES = XRVS
+  XRWS_PRES = XRWS
+!
+  CALL PRESSUREZ( CLBCX,CLBCY,CPRESOPT,NITR,LITRADJ,KTCOUNT, XRELAX,IMI, &
+                  XRHODJ,XDXX,XDYY,XDZZ,XDZX,XDZY,XDXHATM,XDYHATM,XRHOM, &
+                  XAF,XBFY,XCF,XTRIGSX,XTRIGSY,NIFAXX,NIFAXY,            &
+                  NRR,NRRL,NRRI,XDRYMASST,XREFMASS,XMASS_O_PHI0,         &
+                  XTHT,XRT,XRHODREF,XTHVREF,XRVREF,XEXNREF, XLINMASS,    &
+                  XRUS, XRVS, XRWS, XPABST,                              &
+                  XBFB,&
+                  XBF_SXP2_YP1_Z) !JUAN Z_SPLITING
+!
+  XRUS_PRES = XRUS - XRUS_PRES + ZRUS
+  XRVS_PRES = XRVS - XRVS_PRES + ZRVS
+  XRWS_PRES = XRWS - XRWS_PRES + ZRWS
+  CALL MPPDB_CHECK3DM("after pressurez:XRU/V/WS",PRECISION,XRUS,XRVS,XRWS)
+!
+END IF
+!
+CALL SECOND_MNH2(ZTIME2)
+!
+XT_PRESS = XT_PRESS + ZTIME2 - ZTIME1 &
+           - XTIME_LES_BU_PROCESS - XTIME_BU_PROCESS
+!
+!-------------------------------------------------------------------------------
+!
+!*       20.    CHEMISTRY/AEROSOLS
+!               ------------------
+!
+ZTIME1 = ZTIME2
+XTIME_BU_PROCESS = 0.
+XTIME_LES_BU_PROCESS = 0.
+!
+IF (LUSECHEM) THEN
+  CALL CH_MONITOR_n(ZWETDEPAER,KTCOUNT,XTSTEP, ILUOUT, NVERB)
+END IF
+!
+! For inert aerosol (dust and sea salt) => aer_monitor_n
+IF ((LDUST).OR.(LSALT)) THEN
+!
+! tests to see if any cloud exists
+!   
+    GCLD=.TRUE.
+    IF (GCLD .AND. NRR.LE.3 ) THEN 
+      IF( MAX(MAXVAL(XCLDFR(:,:,:)),MAXVAL(XICEFR(:,:,:))).LE. 1.E-10 .AND. GCLOUD_ONLY ) THEN
+          GCLD = .FALSE.                ! only the cloudy verticals would be 
+                                        ! refreshed but there is no clouds 
+      END IF
+    END IF
+!
+    IF (GCLD .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. GCLOUD_ONLY ) THEN
+            GCLD = .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. GCLOUD_ONLY ) THEN
+            GCLD = .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. GCLOUD_ONLY ) THEN
+            GCLD = .FALSE.            ! only the cloudy verticals would be 
+                                      ! refreshed but there is no cloudwater and ice
+        END IF
+      END IF
+    END IF
+
+!
+        CALL AER_MONITOR_n(KTCOUNT,XTSTEP, ILUOUT, NVERB, GCLD)
+END IF
+!
+!
+CALL SECOND_MNH2(ZTIME2)
+!
+XT_CHEM = XT_CHEM + ZTIME2 - ZTIME1 &
+      - XTIME_LES_BU_PROCESS - XTIME_BU_PROCESS
+!
+ZTIME = ZTIME + XTIME_LES_BU_PROCESS + XTIME_BU_PROCESS
+
+!-------------------------------------------------------------------------------
+!
+!*       20.    WATER MICROPHYSICS
+!               ------------------
+!
+ZTIME1 = ZTIME2
+XTIME_BU_PROCESS = 0.
+XTIME_LES_BU_PROCESS = 0.
+!
+IF (CCLOUD /= 'NONE' .AND. CELEC == 'NONE') THEN
+!
+  IF (CCLOUD == 'C2R2' .OR. CCLOUD == 'KHKO' .OR. CCLOUD == 'C3R5' &
+                                             .OR. CCLOUD == "LIMA" ) THEN
+    IF ( LFORCING ) THEN
+      XWT_ACT_NUC(:,:,:) = XWT(:,:,:) + XWTFRC(:,:,:)
+    ELSE
+      XWT_ACT_NUC(:,:,:) = XWT(:,:,:)
+    END IF
+    IF (CTURB /= 'NONE' ) THEN
+     IF ( ((CCLOUD=='C2R2'.OR.CCLOUD=='KHKO').AND.LACTTKE) .OR. (CCLOUD=='LIMA'.AND.MACTTKE) ) THEN 
+       XWT_ACT_NUC(:,:,:) = XWT_ACT_NUC(:,:,:) +  (2./3. * XTKET(:,:,:))**0.5
+     ELSE
+       XWT_ACT_NUC(:,:,:) = XWT_ACT_NUC(:,:,:) 
+     ENDIF
+    ENDIF
+  ELSE
+    XWT_ACT_NUC(:,:,:) = 0.
+  END IF
+!
+  XRTHS_CLD  = XRTHS
+  XRRS_CLD   = XRRS
+  XRSVS_CLD  = XRSVS
+  IF (CSURF=='EXTE') THEN
+    ALLOCATE (ZSEA(SIZE(XRHODJ,1),SIZE(XRHODJ,2)))
+    ALLOCATE (ZTOWN(SIZE(XRHODJ,1),SIZE(XRHODJ,2)))
+    ZSEA(:,:) = 0.
+    ZTOWN(:,:)= 0.
+    CALL MNHGET_SURF_PARAM_n (PSEA=ZSEA(:,:),PTOWN=ZTOWN(:,:))
+    CALL RESOLVED_CLOUD ( CCLOUD, CACTCCN, CSCONV, CMF_CLOUD, NRR, NSPLITR,    &
+                          NSPLITG, IMI, KTCOUNT,                               &
+                          CLBCX,CLBCY,TPBAKFILE, CRAD, CTURBDIM,               &
+                          LSUBG_COND,LSIGMAS,CSUBG_AUCV_RC,XTSTEP,             &
+                          XZZ, XRHODJ, XRHODREF, XEXNREF,                      &
+                          ZPABST, XTHT,XRT,XSIGS,VSIGQSAT,XMFCONV,XTHM,XRCM,   &
+                          XPABST, XWT_ACT_NUC,XDTHRAD, XRTHS, XRRS,            &
+                          XSVT, XRSVS,                                         &
+                          XSRCT, XCLDFR,XICEFR, XCIT,                          &
+                          LSEDIC,KACTIT, KSEDC, KSEDI, KRAIN, KWARM, KHHONI,   &
+                          LCONVHG, XCF_MF,XRC_MF, XRI_MF,                      &
+                          XINPRC,ZINPRC3D,XINPRR, XINPRR3D, XEVAP3D,           &
+                          XINPRS,ZINPRS3D, XINPRG,ZINPRG3D, XINPRH,ZINPRH3D,   &
+                          XSOLORG, XMI,ZSPEEDC, ZSPEEDR, ZSPEEDS, ZSPEEDG, ZSPEEDH, &
+                          XINDEP, XSUPSAT, XNACT, XNPRO,XSSPRO, XRAINFR,       &
+                          XHLC_HRC, XHLC_HCF, XHLI_HRI, XHLI_HCF,              &
+                          ZSEA, ZTOWN                                          )
+    DEALLOCATE(ZTOWN)
+    DEALLOCATE(ZSEA)
+  ELSE
+    CALL RESOLVED_CLOUD ( CCLOUD, CACTCCN, CSCONV, CMF_CLOUD, NRR, NSPLITR,    &
+                          NSPLITG, IMI, KTCOUNT,                               &
+                          CLBCX,CLBCY,TPBAKFILE, CRAD, CTURBDIM,               &
+                          LSUBG_COND,LSIGMAS,CSUBG_AUCV_RC,                    &
+                          XTSTEP,XZZ, XRHODJ, XRHODREF, XEXNREF,               &
+                          ZPABST, XTHT,XRT,XSIGS,VSIGQSAT,XMFCONV,XTHM,XRCM,   &
+                          XPABST, XWT_ACT_NUC,XDTHRAD, XRTHS, XRRS,            &
+                          XSVT, XRSVS,                                         &
+                          XSRCT, XCLDFR, XICEFR, XCIT,                         &
+                          LSEDIC,KACTIT, KSEDC, KSEDI, KRAIN, KWARM, KHHONI,   &
+                          LCONVHG, XCF_MF,XRC_MF, XRI_MF,                      &
+                          XINPRC,ZINPRC3D,XINPRR, XINPRR3D, XEVAP3D,           &
+                          XINPRS,ZINPRS3D, XINPRG,ZINPRG3D, XINPRH,ZINPRH3D,   &
+                          XSOLORG, XMI,ZSPEEDC, ZSPEEDR, ZSPEEDS, ZSPEEDG, ZSPEEDH, &
+                          XINDEP, XSUPSAT, XNACT, XNPRO,XSSPRO, XRAINFR,       &
+                          XHLC_HRC, XHLC_HCF, XHLI_HRI, XHLI_HCF               )
+  END IF
+  XRTHS_CLD  = XRTHS - XRTHS_CLD
+  XRRS_CLD   = XRRS  - XRRS_CLD
+  XRSVS_CLD  = XRSVS - XRSVS_CLD
+!
+  IF (CCLOUD /= 'REVE' ) THEN
+    XACPRR = XACPRR + XINPRR * XTSTEP
+          IF ( (CCLOUD(1:3) == 'ICE' .AND. LSEDIC ) .OR.                     &
+        ((CCLOUD == 'C2R2' .OR. CCLOUD == 'C3R5' .OR. CCLOUD == 'KHKO' &
+                           .OR. CCLOUD == 'LIMA' ) .AND. KSEDC ) )    THEN
+      XACPRC = XACPRC + XINPRC * XTSTEP
+      IF (LDEPOSC .OR. LDEPOC) XACDEP = XACDEP + XINDEP * XTSTEP
+    END IF
+    IF (CCLOUD(1:3) == 'ICE' .OR. CCLOUD == 'C3R5' .OR. &
+                                 (CCLOUD == 'LIMA' .AND. NMOM_I.GE.1 ) ) THEN
+      XACPRS = XACPRS + XINPRS * XTSTEP
+      XACPRG = XACPRG + XINPRG * XTSTEP
+      IF (CCLOUD == 'ICE4' .OR. (CCLOUD == 'LIMA' .AND. NMOM_H.GE.1)) XACPRH = XACPRH + XINPRH * XTSTEP          
+    END IF
+!
+! Lessivage des CCN et IFN nucléables par Slinn
+!
+    IF (LSCAV .AND. (CCLOUD == 'LIMA')) THEN
+       CALL LIMA_PRECIP_SCAVENGING( YLDIMPHYEX,CST,TBUCONF,TBUDGETS,SIZE(TBUDGETS), &
+                                    CCLOUD, CCONF, ILUOUT, KTCOUNT,XTSTEP,XRT(:,:,:,3),    &
+                                    XRHODREF, XRHODJ, XZZ, XPABST, XTHT,            &
+                                    XSVT(:,:,:,NSV_LIMA_BEG:NSV_LIMA_END),          &
+                                    XRSVS(:,:,:,NSV_LIMA_BEG:NSV_LIMA_END), XINPAP  )
+!
+      XACPAP(:,:) = XACPAP(:,:) + XINPAP(:,:) * XTSTEP
+    END IF
+  END IF
+!
+! It is necessary that SV_C2R2 and SV_C1R3 are contiguous in the preceeding CALL
+!
+END IF
+!
+CALL SECOND_MNH2(ZTIME2)
+!
+XT_CLOUD = XT_CLOUD + ZTIME2 - ZTIME1 &
+           - XTIME_LES_BU_PROCESS - XTIME_BU_PROCESS
+!
+!-------------------------------------------------------------------------------
+!
+!*       21.    CLOUD ELECTRIFICATION AND LIGHTNING FLASHES
+!               -------------------------------------------
+!
+ZTIME1 = ZTIME2
+XTIME_BU_PROCESS = 0.
+XTIME_LES_BU_PROCESS = 0.
+!
+IF (CELEC /= 'NONE' .AND. (CCLOUD(1:3) == 'ICE')) THEN
+  XWT_ACT_NUC(:,:,:) = 0.
+!
+  XRTHS_CLD = XRTHS
+  XRRS_CLD  = XRRS
+  XRSVS_CLD = XRSVS
+  IF (CSURF=='EXTE') THEN
+    ALLOCATE (ZSEA(SIZE(XRHODJ,1),SIZE(XRHODJ,2)))
+    ALLOCATE (ZTOWN(SIZE(XRHODJ,1),SIZE(XRHODJ,2)))
+    ZSEA(:,:) = 0.
+    ZTOWN(:,:)= 0.
+    CALL MNHGET_SURF_PARAM_n (PSEA=ZSEA(:,:),PTOWN=ZTOWN(:,:))
+    CALL RESOLVED_ELEC_n (CCLOUD, CSCONV, CMF_CLOUD,                     &
+                          NRR, NSPLITR, IMI, KTCOUNT, OEXIT,             &
+                          CLBCX, CLBCY, CRAD, CTURBDIM,                  &
+                          LSUBG_COND, LSIGMAS,VSIGQSAT,CSUBG_AUCV_RC,    &
+                          XTSTEP, XZZ, XRHODJ, XRHODREF, XEXNREF,        &
+                          ZPABST, XTHT, XRTHS, XWT,  XRT, XRRS,          &
+                          XSVT, XRSVS, XCIT,                             &
+                          XSIGS, XSRCT, XCLDFR, XMFCONV, XCF_MF, XRC_MF, &
+                          XRI_MF, LSEDIC, LWARM,                         &
+                          XINPRC, XINPRR, XINPRR3D, XEVAP3D,             &
+                          XINPRS, XINPRG, XINPRH,                        &
+                          ZSEA, ZTOWN                                    )
+    DEALLOCATE(ZTOWN)
+    DEALLOCATE(ZSEA)
+  ELSE
+    CALL RESOLVED_ELEC_n (CCLOUD, CSCONV, CMF_CLOUD,                     &
+                          NRR, NSPLITR, IMI, KTCOUNT, OEXIT,             &
+                          CLBCX, CLBCY, CRAD, CTURBDIM,                  &
+                          LSUBG_COND, LSIGMAS,VSIGQSAT, CSUBG_AUCV_RC,   &
+                          XTSTEP, XZZ, XRHODJ, XRHODREF, XEXNREF,        &
+                          ZPABST, XTHT, XRTHS, XWT,                      &
+                          XRT, XRRS, XSVT, XRSVS, XCIT,                  &
+                          XSIGS, XSRCT, XCLDFR, XMFCONV, XCF_MF, XRC_MF, &
+                          XRI_MF, LSEDIC, LWARM,                         &
+                          XINPRC, XINPRR, XINPRR3D, XEVAP3D,             &
+                          XINPRS, XINPRG, XINPRH                         )
+  END IF
+  XRTHS_CLD = XRTHS - XRTHS_CLD
+  XRRS_CLD  = XRRS  - XRRS_CLD
+  XRSVS_CLD = XRSVS - XRSVS_CLD
+!
+  XACPRR = XACPRR + XINPRR * XTSTEP
+  IF ((CCLOUD(1:3) == 'ICE' .AND. LSEDIC)) & 
+       XACPRC = XACPRC + XINPRC * XTSTEP
+  IF (CCLOUD(1:3) == 'ICE') THEN
+    XACPRS = XACPRS + XINPRS * XTSTEP
+    XACPRG = XACPRG + XINPRG * XTSTEP
+    IF (CCLOUD == 'ICE4') XACPRH = XACPRH + XINPRH * XTSTEP          
+  END IF
+END IF
+!
+CALL SECOND_MNH2(ZTIME2)
+!
+XT_ELEC = XT_ELEC + ZTIME2 - ZTIME1 &
+           - XTIME_LES_BU_PROCESS - XTIME_BU_PROCESS
+!
+!-------------------------------------------------------------------------------
+!
+!*       21.    L.E.S. COMPUTATIONS
+!               -------------------
+!
+ZTIME1 = ZTIME2
+!
+CALL LES_n
+!
+CALL SECOND_MNH2(ZTIME2)
+!
+XT_SPECTRA = XT_SPECTRA + ZTIME2 - ZTIME1 + XTIME_LES_BU + XTIME_LES
+!
+!-------------------------------------------------------------------------------
+!
+!*       21. bis    MEAN_UM
+!               --------------------
+!
+IF (LMEAN_FIELD) THEN
+   CALL MEAN_FIELD(XUT, XVT, XWT, XTHT, XTKET, XPABST, XRT(:,:,:,1), XSVT(:,:,:,1))
+END IF
+!
+!-------------------------------------------------------------------------------
+!
+!*       22.    UPDATE HALO OF EACH SUBDOMAINS FOR TIME T+DT
+!               --------------------------------------------
+!
+ZTIME1 = ZTIME2
+!
+CALL EXCHANGE (XTSTEP,NRR,NSV,XRHODJ,TFIELDS_ll,     &
+               XRUS, XRVS,XRWS,XRTHS,XRRS,XRTKES,XRSVS)
+!
+CALL SECOND_MNH2(ZTIME2)
+!
+XT_HALO = XT_HALO + ZTIME2 - ZTIME1
+!
+!-------------------------------------------------------------------------------
+!
+!*       23.    TEMPORAL SWAPPING
+!               -----------------
+!
+ZTIME1 = ZTIME2
+XTIME_BU_PROCESS = 0.
+!
+CALL ENDSTEP  ( XTSTEP,NRR,NSV,KTCOUNT,IMI,               &
+                CUVW_ADV_SCHEME,CTEMP_SCHEME,XRHODJ,      &
+                XRUS,XRVS,XRWS,XDRYMASSS,                 &
+                XRTHS,XRRS,XRTKES,XRSVS,                  &
+                XLSUS,XLSVS,XLSWS,                        &
+                XLSTHS,XLSRVS,XLSZWSS,                    &
+                XLBXUS,XLBXVS,XLBXWS,                     &
+                XLBXTHS,XLBXRS,XLBXTKES,XLBXSVS,          &
+                XLBYUS,XLBYVS,XLBYWS,                     &
+                XLBYTHS,XLBYRS,XLBYTKES,XLBYSVS,          &
+                XUM,XVM,XWM,XZWS,                         &
+                XUT,XVT,XWT,XPABST,XDRYMASST,             &
+                XTHT, XRT, XTHM, XRCM, XPABSM,XTKET, XSVT,&
+                XLSUM,XLSVM,XLSWM,                        &
+                XLSTHM,XLSRVM,XLSZWSM,                    &
+                XLBXUM,XLBXVM,XLBXWM,                     &
+                XLBXTHM,XLBXRM,XLBXTKEM,XLBXSVM,          &
+                XLBYUM,XLBYVM,XLBYWM,                     &
+                XLBYTHM,XLBYRM,XLBYTKEM,XLBYSVM           )
+!
+CALL SECOND_MNH2(ZTIME2)
+!
+XT_STEP_SWA = XT_STEP_SWA + ZTIME2 - ZTIME1 - XTIME_BU_PROCESS
+!
+!-------------------------------------------------------------------------------
+!
+!*       24.1    BALLOON and AIRCRAFT
+!               --------------------
+!
+ZTIME1 = ZTIME2
+!
+IF (LFLYER) THEN
+  IF (CSURF=='EXTE') THEN
+    ALLOCATE(ZSEA(IIU,IJU))
+    ZSEA(:,:) = 0.
+    CALL MNHGET_SURF_PARAM_n (PSEA=ZSEA(:,:))
+    CALL AIRCRAFT_BALLOON( XTSTEP, XZZ, XMAP, XLONORI, XLATORI,                   &
+                           XUT, XVT, XWT, XPABST, XTHT, XRT, XSVT, XTKET, XTSRAD, &
+                           XRHODREF, XCIT, PSEA = ZSEA(:,:)                       )
+    DEALLOCATE(ZSEA)
+  ELSE
+    CALL AIRCRAFT_BALLOON( XTSTEP, XZZ, XMAP, XLONORI, XLATORI,                   &
+                           XUT, XVT, XWT, XPABST, XTHT, XRT, XSVT, XTKET, XTSRAD, &
+                           XRHODREF, XCIT                                         )
+  END IF
+END IF
+
+!-------------------------------------------------------------------------------
+!
+!*       24.2    STATION (observation diagnostic)
+!               --------------------------------
+!
+IF ( LSTATION ) &
+  CALL STATION_n( XZZ, XRHODREF, XUT, XVT, XWT, XTHT, XRT, XSVT, XTKET, XTSRAD, XPABST )
+!
+!---------------------------------------------------------
+!
+!*       24.3    PROFILER (observation diagnostic)
+!               ---------------------------------
+!
+IF (LPROFILER)  THEN
+  IF (CSURF=='EXTE') THEN
+    ALLOCATE(ZSEA(IIU,IJU))
+    ZSEA(:,:) = 0.
+    CALL MNHGET_SURF_PARAM_n (PSEA=ZSEA(:,:))
+    CALL PROFILER_n( XZZ, XRHODREF,                             &
+                     XUT, XVT, XWT, XTHT, XRT, XSVT, XTKET,     &
+                     XTSRAD, XPABST, XAER, XCIT, PSEA=ZSEA(:,:) )
+    DEALLOCATE(ZSEA)
+  ELSE
+    CALL PROFILER_n( XZZ, XRHODREF,                         &
+                     XUT, XVT, XWT, XTHT, XRT, XSVT, XTKET, &
+                     XTSRAD, XPABST, XAER, XCIT             )
+  END IF
+END IF
+!
+IF (ALLOCATED(ZSEA)) DEALLOCATE (ZSEA)
+!
+CALL SECOND_MNH2(ZTIME2)
+!
+XT_STEP_MISC = XT_STEP_MISC + ZTIME2 - ZTIME1
+!
+!-------------------------------------------------------------------------------
+!
+!*       24.4   deallocation of observation diagnostics
+!               ---------------------------------------
+!
+CALL END_DIAG_IN_RUN
+!
+!-------------------------------------------------------------------------------
+!
+!
+!*       25.    STORAGE OF BUDGET FIELDS
+!               ------------------------
+!
+ZTIME1 = ZTIME2
+!
+IF ( .NOT. LIO_NO_WRITE ) THEN
+  IF (NBUMOD==IMI .AND. CBUTYPE/='NONE') THEN
+    CALL ENDSTEP_BUDGET(TDIAFILE,KTCOUNT,TDTCUR,XTSTEP,NSV)
+  END IF
+END IF
+!
+CALL SECOND_MNH2(ZTIME2)
+!
+XT_STEP_BUD = XT_STEP_BUD + ZTIME2 - ZTIME1 + XTIME_BU
+!
+!-------------------------------------------------------------------------------
+!
+!*       27.    CURRENT TIME REFRESH
+!               --------------------
+!
+TDTCUR%xtime=TDTCUR%xtime + XTSTEP
+CALL DATETIME_CORRECTDATE(TDTCUR)
+!
+!-------------------------------------------------------------------------------
+!
+!*       28.    CPU ANALYSIS
+!               ------------
+!
+CALL SECOND_MNH2(ZTIME2)
+XT_START=XT_START+ZTIME2-ZEND
+!
+!
+IF ( KTCOUNT == NSTOP .AND. IMI==1) THEN
+  OEXIT=.TRUE.
+END IF
+!
+IF (OEXIT) THEN
+!
+  IF ( .NOT. LIO_NO_WRITE ) THEN
+    IF (LSERIES) CALL WRITE_SERIES_n(TDIAFILE)
+    CALL WRITE_AIRCRAFT_BALLOON(TDIAFILE)
+    CALL WRITE_STATPROF_n( TDIAFILE, TSTATIONS )
+    CALL WRITE_STATPROF_n( TDIAFILE, TPROFILERS )
+    call Write_les_n( tdiafile )
+#ifdef MNH_IOLFI
+    CALL MENU_DIACHRO(TDIAFILE,'END')
+#endif
+    CALL IO_File_close(TDIAFILE)
+    ! Free memory of flyer that is not present on the master process of the file (was allocated in WRITE_AIRCRAFT_BALLOON)
+    CALL AIRCRAFT_BALLOON_FREE_NONLOCAL( TDIAFILE )
+  END IF
+  !
+  CALL IO_File_close(TINIFILE)
+  IF (CSURF=="EXTE") CALL IO_File_close(TINIFILEPGD)
+!
+!*       28.1   print statistics!
+!
+  ! Set File Timing OUTPUT
+  !
+  CALL SET_ILUOUT_TIMING(TLUOUT)
+  !
+  ! Compute global time
+  !
+  CALL TIME_STAT_ll(XT_START,ZTOT)
+  !
+  CALL TIME_HEADER_ll(IMI)
+  !
+  CALL TIME_STAT_ll(XT_1WAY,ZTOT,       ' ONE WAY','=')
+  CALL TIME_STAT_ll(XT_BOUND,ZTOT,      ' BOUNDARIES','=')
+  CALL TIME_STAT_ll(XT_STORE,ZTOT,      ' STORE-FIELDS','=')
+    CALL TIME_STAT_ll(TIMEZ%T_WRIT3D_SEND,ZTOT,    '   W3D_SEND ','-')
+    CALL TIME_STAT_ll(TIMEZ%T_WRIT3D_RECV,ZTOT,    '   W3D_RECV ','-')
+    CALL TIME_STAT_ll(TIMEZ%T_WRIT3D_WRIT,ZTOT,    '   W3D_WRIT ','-')
+    CALL TIME_STAT_ll(TIMEZ%T_WRIT3D_WAIT,ZTOT,    '   W3D_WAIT ','-')
+    CALL TIME_STAT_ll(TIMEZ%T_WRIT3D_ALL ,ZTOT,    '   W3D_ALL ','-')
+    CALL TIME_STAT_ll(TIMEZ%T_WRIT2D_GATH,ZTOT,    '   W2D_GATH ','-')
+    CALL TIME_STAT_ll(TIMEZ%T_WRIT2D_WRIT,ZTOT,    '   W2D_WRIT ','-')
+    CALL TIME_STAT_ll(TIMEZ%T_WRIT2D_ALL ,ZTOT,    '   W2D_ALL ','-')
+  CALL TIME_STAT_ll(XT_GUESS,ZTOT,      ' INITIAL_GUESS','=')
+  CALL TIME_STAT_ll(XT_2WAY,ZTOT,       ' TWO WAY','=')
+  CALL TIME_STAT_ll(XT_ADV,ZTOT,        ' ADVECTION MET','=')
+  CALL TIME_STAT_ll(XT_ADVUVW,ZTOT,     ' ADVECTION UVW','=')
+  CALL TIME_STAT_ll(XT_GRAV,ZTOT,       ' GRAVITY','=')
+  CALL TIME_STAT_ll(XT_FORCING,ZTOT,    ' FORCING','=')
+  CALL TIME_STAT_ll(XT_IBM_FORC,ZTOT,   ' IBM','=')  
+  CALL TIME_STAT_ll(XT_NUDGING,ZTOT,    ' NUDGING','=')
+  CALL TIME_STAT_ll(XT_SOURCES,ZTOT,    ' DYN_SOURCES','=')
+  CALL TIME_STAT_ll(XT_DIFF,ZTOT,       ' NUM_DIFF','=')
+  CALL TIME_STAT_ll(XT_RELAX,ZTOT,      ' RELAXATION','=')
+  !
+  CALL  TIMING_LEGEND() 
+  !
+  CALL TIME_STAT_ll(XT_PARAM,ZTOT,      ' PHYS_PARAM','=')
+    CALL TIME_STAT_ll(XT_RAD,ZTOT,      '   RAD       = '//CRAD  ,'-')
+    CALL TIME_STAT_ll(XT_SHADOWS,ZTOT,  '   SHADOWS'             ,'-')
+    CALL TIME_STAT_ll(XT_DCONV,ZTOT,    '   DEEP CONV = '//CDCONV,'-')
+    CALL TIME_STAT_ll(XT_GROUND,ZTOT,   '   GROUND'              ,'-')
+    ! Blaze perf
+    IF (LBLAZE) THEN
+      CALL TIME_STAT_ll(XFIREPERF,ZBLAZETOT)
+      CALL TIME_STAT_ll(XFIREPERF,ZTOT,           '     BLAZE'          ,'~')
+      CALL TIME_STAT_ll(XGRADPERF,ZBLAZETOT,      '       GRAD(PHI)'    ,' ')
+      CALL TIME_STAT_ll(XROSWINDPERF,ZBLAZETOT,   '       ROS & WIND'   ,' ')
+      CALL TIME_STAT_ll(XPROPAGPERF,ZBLAZETOT,    '       PROPAGATION'  ,' ')
+      CALL TIME_STAT_ll(XFLUXPERF,ZBLAZETOT,      '       HEAT FLUXES'  ,' ')
+    END IF
+    CALL TIME_STAT_ll(XT_TURB,ZTOT,     '   TURB      = '//CTURB ,'-')
+    CALL TIME_STAT_ll(XT_MAFL,ZTOT,     '   MAFL      = '//CSCONV,'-')
+    CALL TIME_STAT_ll(XT_CHEM,ZTOT,     '   CHIMIE'              ,'-')
+    CALL TIME_STAT_ll(XT_EOL,ZTOT,      '   WIND TURBINE'        ,'-')
+  CALL  TIMING_LEGEND()
+  CALL TIME_STAT_ll(XT_COUPL,ZTOT,      ' SET_COUPLING','=')
+  CALL TIME_STAT_ll(XT_RAD_BOUND,ZTOT,  ' RAD_BOUND','=')
+  !
+  CALL  TIMING_LEGEND()
+  ! 
+  CALL TIME_STAT_ll(XT_PRESS,ZTOT,      ' PRESSURE ','=','F')
+  !JUAN Z_SPLITTING
+    CALL TIME_STAT_ll(TIMEZ%T_MAP_B_SX_YP2_ZP1,ZTOT,          '   REMAP       B=>FFTXZ'  ,'-','F')
+    CALL TIME_STAT_ll(TIMEZ%T_MAP_SX_YP2_ZP1_SXP2_Y_ZP1,ZTOT, '   REMAP   FFTXZ=>FFTYZ'  ,'-','F')
+    CALL TIME_STAT_ll(TIMEZ%T_MAP_SXP2_Y_ZP1_B,ZTOT,          '   REMAP   FTTYZ=>B'      ,'-','F')
+    CALL TIME_STAT_ll(TIMEZ%T_MAP_SXP2_Y_ZP1_SXP2_YP1_Z,ZTOT, '   REMAP   FFTYZ=>SUBZ'   ,'-','F')
+    CALL TIME_STAT_ll(TIMEZ%T_MAP_B_SXP2_Y_ZP1,ZTOT,          '   REMAP       B=>FFTYZ-1','-','F')
+    CALL TIME_STAT_ll(TIMEZ%T_MAP_SXP2_YP1_Z_SXP2_Y_ZP1,ZTOT, '   REMAP    SUBZ=>FFTYZ-1','-','F')
+    CALL TIME_STAT_ll(TIMEZ%T_MAP_SXP2_Y_ZP1_SX_YP2_ZP1,ZTOT, '   REMAP FFTYZ-1=>FFTXZ-1','-','F')
+    CALL TIME_STAT_ll(TIMEZ%T_MAP_SX_YP2_ZP1_B,ZTOT,          '   REMAP FFTXZ-1=>B     ' ,'-','F')
+  ! JUAN P1/P2
+  CALL TIME_STAT_ll(XT_CLOUD,ZTOT,      ' RESOLVED_CLOUD','=')
+  CALL TIME_STAT_ll(XT_ELEC,ZTOT,      ' RESOLVED_ELEC','=')
+  CALL TIME_STAT_ll(XT_HALO,ZTOT,       ' EXCHANGE_HALO','=')
+  CALL TIME_STAT_ll(XT_STEP_SWA,ZTOT,   ' ENDSTEP','=')
+  CALL TIME_STAT_ll(XT_STEP_BUD,ZTOT,   ' BUDGETS','=')
+  CALL TIME_STAT_ll(XT_SPECTRA,ZTOT,    ' LES','=')
+  CALL TIME_STAT_ll(XT_STEP_MISC,ZTOT,  ' MISCELLANEOUS','=')
+  IF (LIBM) CALL TIME_STAT_ll(XT_IBM_FORC,ZTOT,' IBM FORCING','=') 
+  !
+  ! sum of call subroutine
+  !
+  ZALL   = XT_1WAY + XT_BOUND   + XT_STORE   + XT_GUESS    +  XT_2WAY   + &
+           XT_ADV  + XT_FORCING + XT_NUDGING + XT_SOURCES  +  XT_DIFF   + &
+           XT_ADVUVW  + XT_GRAV + XT_IBM_FORC                           + &
+           XT_RELAX+ XT_PARAM   + XT_COUPL   + XT_RAD_BOUND+XT_PRESS    + &
+           XT_CLOUD+ XT_ELEC    + XT_HALO    + XT_SPECTRA + XT_STEP_SWA + &
+           XT_STEP_MISC+ XT_STEP_BUD
+  CALL TIME_STAT_ll(ZALL,ZTOT,          ' SUM(CALL)','=')
+  CALL  TIMING_SEPARATOR('=')
+  !
+  ! Gobale Stat
+  !
+  WRITE(ILUOUT,FMT=*)
+  WRITE(ILUOUT,FMT=*)
+  CALL  TIMING_LEGEND() 
+  !
+  ! MODELN all included
+  !
+  CALL  TIMING_SEPARATOR('+')
+  CALL  TIMING_SEPARATOR('+')  
+  WRITE(YMI,FMT="(I0)") IMI
+  CALL TIME_STAT_ll(XT_START,ZTOT,      ' MODEL'//YMI,'+')
+  CALL  TIMING_SEPARATOR('+')
+  CALL  TIMING_SEPARATOR('+')
+  CALL  TIMING_SEPARATOR('+')
+  !
+  ! Timing/ Steps
+  !
+  ZTIME_STEP     =  XT_START / REAL(KTCOUNT)
+  WRITE(YTCOUNT,FMT="(I0)") KTCOUNT
+  CALL TIME_STAT_ll(ZTIME_STEP,ZTOT,     ' SECOND/STEP='//YTCOUNT,'=')
+  !
+  ! Timing/Step/Points
+  !
+  IPOINTS = NIMAX_ll*NJMAX_ll*NKMAX
+  WRITE(YPOINTS,FMT="(I0)") IPOINTS
+  ZTIME_STEP_PTS =  ZTIME_STEP / REAL(IPOINTS) * 1e6
+  CALL TIME_STAT_ll(ZTIME_STEP_PTS,ZTOT_PT)
+  CALL TIME_STAT_ll(ZTIME_STEP_PTS,ZTOT_PT,  ' MICROSEC/STP/PT='//YPOINTS,'-')
+  !
+  CALL  TIMING_SEPARATOR('=')
+  !
+END IF
+!
+END SUBROUTINE MODEL_n
diff --git a/src/PHYEX/ext/phys_paramn.f90 b/src/PHYEX/ext/phys_paramn.f90
new file mode 100644
index 0000000000000000000000000000000000000000..ef93f2ccca1bcd8df3a68c8ada3b37176d740461
--- /dev/null
+++ b/src/PHYEX/ext/phys_paramn.f90
@@ -0,0 +1,1764 @@
+!MNH_LIC Copyright 1995-2022 CNRS, Meteo-France and Universite Paul Sabatier
+!MNH_LIC This is part of the Meso-NH software governed by the CeCILL-C licence
+!MNH_LIC version 1. See LICENSE, CeCILL-C_V1-en.txt and CeCILL-C_V1-fr.txt
+!MNH_LIC for details. version 1.
+!-----------------------------------------------------------------
+!    ########################
+     MODULE 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
+!  R. Schoetter    12/2021: multi-level coupling between MesoNH and SURFEX  
+!  P. Wautelet 30/11/2022: compute XTHW_FLUX, XRCW_FLUX and XSVW_FLUX only when needed
+!  A. Costes      12/2021: add Blaze fire model
+!  Q. Rodier      2022   : integration with PHYEX
+!!-------------------------------------------------------------------------------
+!
+!*       0.     DECLARATIONS
+!               ------------
+!
+USE MODD_ADV_n,       ONLY : XRTKEMS
+USE MODD_AIRCRAFT_BALLOON, ONLY: LFLYER
+USE MODD_ARGSLIST_ll, ONLY : LIST_ll
+USE MODD_BLOWSNOW,    ONLY : LBLOWSNOW,XRSNOW
+USE MODD_BUDGET,      ONLY: NBUDGET_TH, NBUDGET_RV, NBUDGET_RC, NBUDGET_RI, NBUDGET_SV1, &
+                            TBUDGETS, xtime_bu_process, TBUCONF
+USE MODD_CH_AEROSOL
+USE MODD_CH_MNHC_n, ONLY : LUSECHEM,         &! indicates if chemistry is used
+                           LCH_CONV_SCAV,    &
+                           LCH_CONV_LINOX
+USE MODD_CLOUD_MF_n
+USE MODD_CONDSAMP
+USE MODD_CONF
+USE MODD_CONF_n
+USE MODD_CST, ONLY : CST
+USE MODD_CTURB, ONLY : CSTURB
+USE MODD_CURVCOR_n
+USE MODD_DEEP_CONVECTION_n
+USE MODD_DEF_EDDY_FLUX_n           ! Ajout PP
+USE MODD_DEF_EDDYUV_FLUX_n         ! Ajout PP
+USE MODD_DIAG_IN_RUN, ONLY: LDIAG_IN_RUN, XCURRENT_TKE_DISS
+USE MODD_DIM_n, ONLY: NIMAX_ll, NJMAX_ll
+USE MODD_DRAGBLDG_n
+USE MODD_DRAGTREE_n
+USE MODD_DUST
+USE MODD_DYN
+USE MODD_DYN_n
+USE MODD_EOL_MAIN, ONLY: LMAIN_EOL, CMETH_EOL, NMODEL_EOL
+USE MODD_FIELD_n
+USE MODD_FRC
+USE MODD_FRC_n
+USE MODD_GRID
+USE MODD_GRID_n
+USE MODD_IBM_PARAM_n,      ONLY: LIBM, XIBM_EPSI, XIBM_LS, XIBM_XMUT
+USE MODD_ICE_C1R3_DESCR,  ONLY : XRTMIN_C1R3=>XRTMIN
+USE MODD_IO, ONLY: TFILEDATA
+USE MODD_LATZ_EDFLX
+USE MODD_LBC_n
+USE MODD_LES
+USE MODD_LES_n, ONLY: NLES_TIMES
+USE MODD_LES_BUDGET
+USE MODD_LSFIELD_n
+USE MODD_LUNIT_n
+USE MODD_METRICS_n
+USE MODD_MNH_SURFEX_n
+USE MODD_NESTING, ONLY : XWAY,NDAD, NDXRATIO_ALL, NDYRATIO_ALL
+USE MODD_NSV, ONLY : NSV, NSV_LGBEG, NSV_LGEND, &
+                     NSV_SLTBEG,NSV_SLTEND,NSV_SLT,&
+                     NSV_AERBEG,NSV_AEREND, &
+                     NSV_DSTBEG,NSV_DSTEND, NSV_DST,&
+                     NSV_LIMA_NR,NSV_LIMA_NS,NSV_LIMA_NG,NSV_LIMA_NH
+USE MODD_OCEANH
+USE MODD_OUT_n
+USE MODD_PARAM_C2R2,       ONLY : LSEDC
+USE MODD_PARAMETERS
+USE MODD_PARAM_ICE_n,        ONLY : LSEDIC
+USE MODD_PARAM_KAFR_n
+USE MODD_PARAM_LIMA,       ONLY : MSEDC => LSEDC, XRTMIN_LIMA=>XRTMIN
+USE MODD_PARAM_MFSHALL_n,  ONLY: CMF_CLOUD
+USE MODD_PARAM_n
+USE MODD_PARAM_RAD_n
+USE MODD_PASPOL
+USE MODD_PASPOL_n
+USE MODD_DIMPHYEX,   ONLY: DIMPHYEX_t
+USE MODD_PRECIP_n
+use modd_precision,        only: MNHTIME
+USE MODD_RADIATIONS_n
+USE MODD_RAIN_ICE_DESCR_n,   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_FLUX_AIRCRAFT_BALLOON, ONLY : XTHW_FLUX, XRCW_FLUX, XSVW_FLUX
+USE MODD_TURB_n
+USE MODD_NEB_n, ONLY: NEBN
+
+USE MODE_AERO_PSD
+use mode_budget,            only: Budget_store_end, Budget_store_init
+USE MODE_DATETIME
+USE MODE_DUST_PSD
+USE MODE_ll
+USE MODE_GATHER_ll
+USE MODE_MNH_TIMING
+USE MODE_MODELN_HANDLER
+USE MODE_MPPDB
+USE MODE_FILL_DIMPHYEX, ONLY: FILL_DIMPHYEX
+USE MODE_SALT_PSD
+
+USE MODI_AEROZON          ! Ajout PP
+USE MODI_CONDSAMP
+USE MODI_CONVECTION
+USE MODI_DRAG_BLD
+USE MODI_DRAG_VEG
+USE MODI_DUST_FILTER
+USE MODI_EDDY_FLUX_n               ! Ajout PP
+USE MODI_EDDY_FLUX_ONE_WAY_n       ! Ajout PP
+USE MODI_EDDYUV_FLUX_n             ! Ajout PP
+USE MODI_EDDYUV_FLUX_ONE_WAY_n     ! Ajout PP
+USE MODI_EOL_MAIN
+USE MODI_GROUND_PARAM_n
+USE MODI_GRADIENT_M
+USE MODI_GRADIENT_W
+USE MODI_PASPOL
+USE MODI_RADIATIONS
+USE MODI_SALT_FILTER
+USE MODI_SEDIM_DUST
+USE MODI_SEDIM_SALT
+USE MODI_SHALLOW_MF_PACK
+USE MODI_SUNPOS_n
+USE MODI_SURF_RAD_MODIF
+USE MODI_SWITCH_SBG_LES_N
+USE MODI_TURB
+
+IMPLICIT NONE
+!
+!*      0.1    declarations of arguments
+!
+INTEGER,           INTENT(IN)     :: KTCOUNT   ! temporal iteration count
+TYPE(TFILEDATA),   INTENT(IN)     :: TPFILE    ! Synchronous output file
+! advection schemes
+REAL(kind=MNHTIME), DIMENSION(2), INTENT(INOUT) :: PRAD,PSHADOWS,PKAFR,PGROUND,PTURB,PMAFL,PDRAG,PTRACER,PEOL ! to store CPU
+                                                                                                         ! time for computing time
+REAL(kind=MNHTIME), DIMENSION(2), INTENT(INOUT) :: PTIME_BU  ! time used in budget&LES budgets statistics
+REAL, DIMENSION(:,:,:,:), INTENT(INOUT)  :: PWETDEPAER
+LOGICAL, DIMENSION(:,:), INTENT(IN) :: OMASKkids ! kids domains mask
+LOGICAL, INTENT(OUT) :: OCLOUD_ONLY ! conditionnal radiation computations for
+                                !      the only cloudy columns
+                                !
+!
+!*      0.2    declarations of local variables
+!
+REAL, DIMENSION(:,:), ALLOCATABLE     :: ZSFU  ! surface flux of x and
+REAL, DIMENSION(:,:), ALLOCATABLE     :: ZSFV  ! y component of wind
+REAL, DIMENSION(:,:), ALLOCATABLE     :: ZSFTH ! surface flux of theta
+REAL, DIMENSION(:,:), ALLOCATABLE     :: ZSFRV ! surface flux of vapor
+REAL, DIMENSION(:,:,:), ALLOCATABLE   :: ZSFSV ! surface flux of scalars
+REAL, DIMENSION(:,:), ALLOCATABLE     :: ZSFCO2! surface flux of CO2
+!
+REAL, DIMENSION(:,:), ALLOCATABLE     :: ZSFTH_WALL
+REAL, DIMENSION(:,:), ALLOCATABLE     :: ZSFTH_ROOF
+REAL, DIMENSION(:,:), ALLOCATABLE     :: ZCD_ROOF
+REAL, DIMENSION(:,:), ALLOCATABLE     :: ZSFRV_WALL 
+REAL, DIMENSION(:,:), ALLOCATABLE     :: ZSFRV_ROOF
+!
+REAL, DIMENSION(:,:,:), ALLOCATABLE :: ZDIR_ALB ! direct albedo
+REAL, DIMENSION(:,:,:), ALLOCATABLE :: ZSCA_ALB ! diffuse albedo
+REAL, DIMENSION(:,:,:),   ALLOCATABLE :: ZEMIS    ! emissivity
+REAL, DIMENSION(:,:),   ALLOCATABLE :: ZTSRAD   ! surface temperature
+REAL, DIMENSION(:,:,:,:), ALLOCATABLE  :: ZRGDST,ZSIGDST,ZNDST,ZSVDST
+REAL, DIMENSION(:,:,:,:), ALLOCATABLE  :: ZRGSLT,ZSIGSLT,ZNSLT,ZSVSLT
+REAL, DIMENSION(:,:,:,:), ALLOCATABLE  :: ZRGAER,ZSIGAER,ZNAER,ZSVAER
+REAL, DIMENSION(:,:,:,:), ALLOCATABLE  :: ZSVT
+!
+REAL, DIMENSION(:,:,:), ALLOCATABLE :: ZEXN   ! Atmospheric density and Exner
+REAL, DIMENSION(:,:,:), ALLOCATABLE :: ZSIGMF   ! MF contribution to XSIGS
+!
+REAL, DIMENSION(0:24), parameter :: ZRG_HOUR =  (/ 0., 0., 0., 0., 0., 32.04, 114.19, &
+                                                   228.01, 351.25, 465.49, 557.24,    &
+                                                   616.82, 638.33, 619.43, 566.56,    &
+                                                   474.71, 359.20, 230.87, 115.72,    &
+                                                   32.48, 0., 0., 0., 0., 0. /)
+!
+REAL, DIMENSION(0:24), parameter :: ZRAT_HOUR = (/ 326.00, 325.93, 325.12, 324.41, &
+                                                   323.16, 321.95, 322.51, 325.16, &
+                                                   328.01, 331.46, 335.58, 340.00, &
+                                                   345.20, 350.32, 354.20, 356.58, &
+                                                   356.56, 355.33, 352.79, 351.34, &
+                                                   347.00, 342.00, 337.00, 332.00, &
+                                                   326.00     /)
+!
+!
+character(len=6) :: ynum
+INTEGER  :: IHOUR               ! parameters necessary for the temporal
+REAL     :: ZTIME, ZDT          ! interpolation
+REAL     :: ZTEMP_DIST          ! time between 2 instants (in seconds)
+!
+LOGICAL :: GRAD                 ! conditionnal call for the full radiation
+                                !         computations
+REAL    :: ZRAD_GLOB_ll         ! 'real' global parallel mask of 'GRAD'
+INTEGER :: INFO_ll              ! error report of parallel routines
+                                !      the only cloudy columns
+!
+REAL(kind=MNHTIME), DIMENSION(2) :: ZTIME1, ZTIME2, ZTIME3, ZTIME4 ! for computing time analysis
+REAL(kind=MNHTIME), DIMENSION(2) :: ZTIME_LES_MF                   ! time spent in LES computation in shallow conv.
+LOGICAL :: GDCONV               ! conditionnal call for the deep convection
+                                !         computations
+REAL, DIMENSION(:,:,:), ALLOCATABLE  :: ZRC, ZRI, ZWT ! additional dummies
+REAL, DIMENSION(:,:),   ALLOCATABLE  :: ZDXDY         ! grid area
+                    ! for rc, ri, w required if main variables not allocated
+!
+INTEGER :: IIU, IJU, IKU                              ! dimensional indexes
+!
+INTEGER     :: JSV              ! Loop index for Scalar Variables
+INTEGER     :: JSWB             ! loop on SW spectral bands
+INTEGER     :: IIB,IIE,IJB,IJE, IKB, IKE, JI,JJ
+INTEGER     :: IMODEIDX
+              ! index values for the Beginning or the End of the physical
+              ! domain in x and y directions
+TYPE(LIST_ll), POINTER :: TZFIELDS_ll   ! list of fields to exchange
+INTEGER                :: IINFO_ll       ! return code of parallel routine
+!
+!* variables for writing in a fm file
+!
+INTEGER           :: IRESP          ! IRESP  : return-code if a problem appears
+                                    !in LFI subroutines at the open of the file
+INTEGER           :: ILUOUT         ! logical unit numbers of output-listing
+INTEGER           :: IMI            ! model index
+INTEGER           :: JKID           ! loop index to look for the KID models
+REAL              :: ZINIRADIUSI, ZINIRADIUSJ ! ORILAM initial radius
+REAL, DIMENSION(NMODE_DST)    :: ZINIRADIUS  ! DUST initial radius
+REAL, DIMENSION(NMODE_SLT)    :: ZINIRADIUS_SLT  ! Sea Salt initial radius
+REAL, DIMENSION(SIZE(XRSVS,1), SIZE(XRSVS,2), SIZE(XRSVS,3), SIZE(XRSVS,4))  :: ZRSVS
+LOGICAL :: GCLD                     ! conditionnal call for dust wet deposition
+! * arrays to store the surface fields before radiation and convection scheme
+!  calls
+INTEGER           :: IMODSON        ! Number of son models of IMI with XWAY=2
+INTEGER           :: IKIDM          ! index loop                                 
+INTEGER           :: IGRADIENTS     ! Number of horizontal gradients in turb
+REAL, DIMENSION(:,:,:),   ALLOCATABLE  :: ZSAVE_INPRR,ZSAVE_INPRS,ZSAVE_INPRG,ZSAVE_INPRH
+REAL, DIMENSION(:,:,:),   ALLOCATABLE  :: ZSAVE_INPRC,ZSAVE_PRCONV,ZSAVE_PRSCONV
+REAL, DIMENSION(:,:,:,:), ALLOCATABLE  :: ZSAVE_DIRFLASWD, ZSAVE_SCAFLASWD,ZSAVE_DIRSRFSWD
+! for ocean model
+INTEGER           :: JKM , JSW         ! vertical index loop                                 
+REAL :: ZSWA,TINTSW     ! index for SW interpolation and int time betwenn forcings (ocean model)
+REAL, DIMENSION(:), ALLOCATABLE :: ZIZOCE(:) ! Solar flux penetrating in ocean
+REAL, DIMENSION(:), ALLOCATABLE :: ZPROSOL1(:),ZPROSOL2(:) ! Funtions for penetrating solar flux
+!
+REAL, DIMENSION(:,:,:), ALLOCATABLE :: ZLENGTHM, ZLENGTHH, ZMFMOIST !OHARAT turb option from AROME (not allocated in MNH)
+                                                                    ! to be moved as optional args for turb
+REAL, DIMENSION(:,:,:), ALLOCATABLE :: ZTDIFF, ZTDISS
+REAL, DIMENSION(:),ALLOCATABLE  :: ZXHAT_ll,ZYHAT_ll  !  Position x/y in the conformal
+                                                 ! plane (array on the complete domain)
+REAL, DIMENSION(:,:), ALLOCATABLE :: ZDIST ! distance from the center of the cooling 
+!
+REAL, DIMENSION(:,:,:,:), ALLOCATABLE :: ZHGRAD ! horizontal gradient used in turb
+TYPE(DIMPHYEX_t) :: YLDIMPHYEX
+LOGICAL :: GCOMPUTE_SRC ! flag to define dimensions of SIGS and SRCT variables 
+!-----------------------------------------------------------------------------
+
+NULLIFY(TZFIELDS_ll)
+IMI=GET_CURRENT_MODEL_INDEX()
+!
+ILUOUT = TLUOUT%NLU
+CALL GET_DIM_EXT_ll ('B',IIU,IJU)
+IKU=SIZE(XTHT,3)
+IKB = 1 + JPVEXT
+IKE = IKU - JPVEXT
+!
+CALL GET_INDICE_ll (IIB,IJB,IIE,IJE)
+CALL FILL_DIMPHYEX(YLDIMPHYEX, SIZE(XTHT,1), SIZE(XTHT,2), SIZE(XTHT,3),.TRUE.,NLES_TIMES)
+!
+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))
+!
+ALLOCATE(ZSFTH_WALL (IIU,IJU))
+ALLOCATE(ZSFTH_ROOF (IIU,IJU))
+ALLOCATE(ZCD_ROOF   (IIU,IJU))
+ALLOCATE(ZSFRV_WALL (IIU,IJU))
+ALLOCATE(ZSFRV_ROOF (IIU,IJU))
+!
+!* if XWAY(son)=2 save surface fields before radiation or convective scheme
+!  calls
+!
+IMODSON = 0
+DO JKID = IMI+1,NMODEL  ! min value of the possible kids
+ IF (IMI == NDAD(JKID) .AND. XWAY(JKID) == 2. .AND. CPROGRAM=='MESONH' &
+  .AND. (CCONF == 'RESTA' .OR. (CCONF == 'START' .AND. KTCOUNT /= 1))) THEN
+  IMODSON = IMODSON + 1
+ END IF
+END DO
+!
+ IF (IMODSON /= 0 ) THEN
+   IF (LUSERC .AND. (                                               &
+       (LSEDIC .AND. CCLOUD(1:3) == 'ICE')                     .OR. &
+       (LSEDC  .AND. (CCLOUD == 'C2R2' .OR. CCLOUD == 'KHKO')) .OR. &
+       (MSEDC  .AND. CCLOUD=='LIMA')                                &
+      )) THEN
+     ALLOCATE( ZSAVE_INPRC(SIZE(XINPRC,1),SIZE(XINPRC,2),IMODSON))
+   ELSE
+     ALLOCATE( ZSAVE_INPRC(0,0,0))
+   END IF
+   IF (LUSERR) THEN
+     ALLOCATE( ZSAVE_INPRR(SIZE(XINPRR,1),SIZE(XINPRR,2),IMODSON))
+   ELSE
+     ALLOCATE( ZSAVE_INPRR(0,0,0))
+   END IF
+   IF (LUSERS) THEN
+     ALLOCATE( ZSAVE_INPRS(SIZE(XINPRS,1),SIZE(XINPRS,2),IMODSON))
+   ELSE
+     ALLOCATE( ZSAVE_INPRS(0,0,0))                              
+   END IF
+   IF (LUSERG) THEN
+     ALLOCATE( ZSAVE_INPRG(SIZE(XINPRG,1),SIZE(XINPRG,2),IMODSON))
+   ELSE
+     ALLOCATE( ZSAVE_INPRG(0,0,0))                                
+   END IF
+   IF (LUSERH) THEN
+     ALLOCATE( ZSAVE_INPRH(SIZE(XINPRH,1),SIZE(XINPRH,2),IMODSON))
+   ELSE
+     ALLOCATE( ZSAVE_INPRH(0,0,0))                               
+   END IF
+   IF (CDCONV /= 'NONE') THEN
+     ALLOCATE( ZSAVE_PRCONV(SIZE(XPRCONV,1),SIZE(XPRCONV,2),IMODSON))
+     ALLOCATE( ZSAVE_PRSCONV(SIZE(XPRSCONV,1),SIZE(XPRSCONV,2),IMODSON))
+   ELSE
+     ALLOCATE( ZSAVE_PRCONV(0,0,0))                                
+     ALLOCATE( ZSAVE_PRSCONV(0,0,0))                                    
+   END IF
+   IF (CRAD /= 'NONE') THEN
+     ALLOCATE( ZSAVE_DIRFLASWD(SIZE(XDIRFLASWD,1),SIZE(XDIRFLASWD,2),SIZE(XDIRFLASWD,3),IMODSON))
+     ALLOCATE( ZSAVE_SCAFLASWD(SIZE(XSCAFLASWD,1),SIZE(XSCAFLASWD,2),SIZE(XSCAFLASWD,3),IMODSON))
+     ALLOCATE( ZSAVE_DIRSRFSWD(SIZE(XDIRSRFSWD,1),SIZE(XDIRSRFSWD,2),SIZE(XDIRSRFSWD,3),IMODSON))
+   ELSE
+     ALLOCATE( ZSAVE_DIRFLASWD(0,0,0,0))
+     ALLOCATE( ZSAVE_SCAFLASWD(0,0,0,0))
+     ALLOCATE( ZSAVE_DIRSRFSWD(0,0,0,0)) 
+   END IF
+ ENDIF
+!
+IKIDM=0
+DO JKID = IMI+1,NMODEL  ! min value of the possible kids
+ IF (IMI == NDAD(JKID) .AND. XWAY(JKID) == 2. .AND. CPROGRAM=='MESONH' &
+  .AND. (CCONF == 'RESTA' .OR. (CCONF == 'START' .AND. KTCOUNT /= 1))) THEN
+! BUG if number of the son does not follow the number of the dad
+! IKIDM = JKID-IMI
+  IKIDM = IKIDM + 1
+   IF (LUSERC .AND. (                                               &
+       (LSEDIC .AND. CCLOUD(1:3) == 'ICE')                     .OR. &
+       (LSEDC  .AND. (CCLOUD == 'C2R2' .OR. CCLOUD == 'KHKO')) .OR. &
+       (MSEDC  .AND. CCLOUD=='LIMA')                                &
+      )) THEN
+     ZSAVE_INPRC(:,:,IKIDM) = XINPRC(:,:)
+   END IF
+   IF (LUSERR) THEN
+     ZSAVE_INPRR(:,:,IKIDM) = XINPRR(:,:)
+   END IF
+   IF (LUSERS) THEN
+     ZSAVE_INPRS(:,:,IKIDM) = XINPRS(:,:)
+   END IF
+   IF (LUSERG) THEN
+     ZSAVE_INPRG(:,:,IKIDM) = XINPRG(:,:)
+   END IF
+   IF (LUSERH) THEN
+     ZSAVE_INPRH(:,:,IKIDM) = XINPRH(:,:)
+   END IF
+   IF (CDCONV /= 'NONE') THEN
+     ZSAVE_PRCONV(:,:,IKIDM) = XPRCONV(:,:)
+     ZSAVE_PRSCONV(:,:,IKIDM) = XPRSCONV(:,:)
+   END IF
+   IF (CRAD /= 'NONE') THEN
+     ZSAVE_DIRFLASWD(:,:,:,IKIDM) = XDIRFLASWD(:,:,:)
+     ZSAVE_SCAFLASWD(:,:,:,IKIDM) = XSCAFLASWD(:,:,:)
+     ZSAVE_DIRSRFSWD(:,:,:,IKIDM) = XDIRSRFSWD(:,:,:)
+   END IF
+ ENDIF
+END DO
+!
+!-----------------------------------------------------------------------------
+!
+!*        1.    RADIATION SCHEME
+!               ----------------
+!
+!
+XTIME_BU_PROCESS = 0.
+XTIME_LES_BU_PROCESS = 0.
+!
+CALL SECOND_MNH2(ZTIME1)
+!
+!
+!*        1.1   Tests to control how the radiation package should be called (at the current timestep)
+!               -----------------------------------------------------------
+!
+!
+GRAD = .FALSE.
+OCLOUD_ONLY = .FALSE.
+!
+IF (CRAD /='NONE') THEN
+!
+!  test to see if the partial radiations for cloudy must be called
+!
+  IF (CRAD =='ECMW' .OR. CRAD =='ECRA') THEN
+    CALL DATETIME_DISTANCE(TDTRAD_CLONLY,TDTCUR,ZTEMP_DIST)
+    IF( MOD(NINT(ZTEMP_DIST/XTSTEP),NINT(XDTRAD_CLONLY/XTSTEP))==0 ) THEN
+      TDTRAD_CLONLY = TDTCUR
+      GRAD = .TRUE.
+      OCLOUD_ONLY = .TRUE.
+    END IF
+  END IF
+!   
+! test to see if the full radiations must be called
+!   
+  CALL DATETIME_DISTANCE(TDTCUR,TDTRAD_FULL,ZTEMP_DIST)
+  IF( MOD(NINT(ZTEMP_DIST/XTSTEP),NINT(XDTRAD/XTSTEP))==0 ) THEN
+    TDTRAD_FULL = TDTCUR
+    GRAD = .TRUE.
+    OCLOUD_ONLY = .FALSE.
+  END IF
+!
+! tests to see if any cloud exists
+!   
+  IF (CRAD =='ECMW' .OR. CRAD =='ECRA') THEN
+    IF (GRAD .AND. NRR.LE.3 ) THEN 
+      IF( MAX(MAXVAL(XCLDFR(:,:,:)),MAXVAL(XICEFR(:,:,:))).LE. 1.E-10 .AND. OCLOUD_ONLY ) THEN
+          GRAD = .FALSE.                ! only the cloudy verticals would be 
+                                        ! refreshed but there is no clouds 
+      END IF
+    END IF
+!
+    IF (GRAD .AND. NRR.GE.4 ) THEN 
+      IF( CCLOUD(1:3)=='ICE' )THEN
+        IF( MAXVAL(XRT(:,:,:,2)).LE.XRTMIN(2) .AND.             &
+            MAXVAL(XRT(:,:,:,4)).LE.XRTMIN(4) .AND. OCLOUD_ONLY ) THEN
+            GRAD = .FALSE.            ! only the cloudy verticals would be 
+                                      ! refreshed but there is no cloudwater and ice
+        END IF
+      END IF
+      IF( CCLOUD=='C3R5' )THEN
+        IF( MAXVAL(XRT(:,:,:,2)).LE.XRTMIN_C1R3(2) .AND.             &
+            MAXVAL(XRT(:,:,:,4)).LE.XRTMIN_C1R3(4) .AND. OCLOUD_ONLY ) THEN
+            GRAD = .FALSE.            ! only the cloudy verticals would be 
+                                      ! refreshed but there is no cloudwater and ice
+        END IF
+      END IF
+      IF( CCLOUD=='LIMA' )THEN
+        IF( MAXVAL(XRT(:,:,:,2)).LE.XRTMIN_LIMA(2) .AND.             &
+            MAXVAL(XRT(:,:,:,4)).LE.XRTMIN_LIMA(4) .AND. OCLOUD_ONLY ) THEN
+            GRAD = .FALSE.            ! only the cloudy verticals would be 
+                                      ! refreshed but there is no cloudwater and ice
+        END IF
+      END IF      
+    END IF
+  END IF
+!
+END IF
+!
+! global parallel mask for 'GRAD'
+ZRAD_GLOB_ll = 0.0
+IF (GRAD) ZRAD_GLOB_ll = 1.0
+CALL REDUCESUM_ll(ZRAD_GLOB_ll,INFO_ll)
+if (ZRAD_GLOB_ll .NE. 0.0 ) GRAD = .TRUE.
+!
+!
+IF( GRAD ) THEN                                 
+  ALLOCATE(ZCOSZEN(IIU,IJU))
+  ALLOCATE(ZSINZEN(IIU,IJU))
+  ALLOCATE(ZAZIMSOL(IIU,IJU))
+!
+!
+!*        1.2.  Astronomical computations
+!               -------------------------
+!
+! Ajout PP
+IF (.NOT. OCLOUD_ONLY .AND. KTCOUNT /= 1)  THEN 
+ IF (LAERO_FT) THEN 
+  CALL AEROZON (XPABST,XTHT,XTSRAD,XLAT,XLON,TDTCUR,TDTEXP,   &
+         NDLON,NFLEV,CAER,NAER,NSTATM,                             &
+         XSINDEL,XCOSDEL,XTSIDER,XCORSOL,                          &
+         XSTATM,XOZON, XAER)
+  XAER_CLIM = XAER
+ END IF
+END IF
+!
+CALL SUNPOS_n   ( XZENITH, ZCOSZEN, ZSINZEN, ZAZIMSOL )
+!
+!*        1.3   Call to radiation scheme
+!               ------------------------
+!
+  SELECT CASE ( CRAD )
+!
+!*        1.3.1 TOP of Atmposphere radiation
+!               ----------------------------
+    CASE('TOPA')
+!
+      XFLALWD   (:,:)   = 300.
+      DO JSWB=1,NSWB_MNH
+        XDIRFLASWD(:,:,JSWB) = CST%XI0 * MAX(COS(XZENITH(:,:)),0.)/REAL(NSWB_MNH)
+        XSCAFLASWD(:,:,JSWB) = 0.
+      END DO
+      XDTHRAD(:,:,:) = 0.
+     
+!
+!*        1.3.1 FIXEd radiative surface fluxes
+!               ------------------------------
+!
+    CASE('FIXE')
+      ZTIME = MOD(TDTCUR%xtime +XLON0*240., CST%XDAY)
+      IHOUR = INT( ZTIME/3600. )
+      IF (IHOUR < 0) IHOUR=IHOUR + 24
+      ZDT = ZTIME/3600. - REAL(IHOUR)
+      XDIRFLASWD(:,:,:) =(( ZRG_HOUR(IHOUR+1)-ZRG_HOUR(IHOUR) )*ZDT + ZRG_HOUR(IHOUR)) / REAL(NSWB_MNH)
+      XFLALWD   (:,:)   = (ZRAT_HOUR(IHOUR+1)-ZRAT_HOUR(IHOUR))*ZDT + ZRAT_HOUR(IHOUR)
+      DO JSWB=1,NSWB_MNH
+        WHERE(ZCOSZEN(:,:)<0.) XDIRFLASWD(:,:,JSWB) = 0.
+      END DO
+
+      XSCAFLASWD(:,:,:) = XDIRFLASWD(:,:,:) * 0.2
+      XDIRFLASWD(:,:,:) = XDIRFLASWD(:,:,:) * 0.8
+      XDTHRAD(:,:,:) = 0.
+      !
+!
+!*        1.3.2 ECMWF or ECRAD radiative surface and atmospheric fluxes
+!               ----------------------------------------------
+!
+    CASE('ECMW' , 'ECRA')
+      IF (LLES_MEAN) OCLOUD_ONLY=.FALSE.
+      XRADEFF(:,:,:)=0.0
+      XSWU(:,:,:)=0.0
+      XSWD(:,:,:)=0.0
+      XLWU(:,:,:)=0.0
+      XLWD(:,:,:)=0.0
+      XDTHRADSW(:,:,:)=0.0
+      XDTHRADLW(:,:,:)=0.0
+      CALL RADIATIONS( TPFILE,                                                                   &
+                       LCLEAR_SKY, OCLOUD_ONLY, NCLEARCOL_TM1, CEFRADL, CEFRADI, COPWSW, COPISW, &
+                       COPWLW, COPILW, XFUDG,                                                    &
+                       NDLON, NFLEV, NRAD_DIAG, NFLUX, NRAD, NAER, NSWB_OLD, NSWB_MNH, NLWB_MNH, &
+                       NSTATM, NRAD_COLNBR, ZCOSZEN, XSEA, XCORSOL,                              &
+                       XDIR_ALB, XSCA_ALB, XEMIS, MAX(XCLDFR,XICEFR), XCCO2, XTSRAD, XSTATM, XTHT, XRT,      &
+                       XPABST, XOZON, XAER,XDST_WL, XAER_CLIM, XSVT,                             &
+                       XDTHRAD, XFLALWD, XDIRFLASWD, XSCAFLASWD, XRHODREF, XZZ ,                 &
+                       XRADEFF, XSWU, XSWD, XLWU, XLWD, XDTHRADSW, XDTHRADLW                     )
+!
+
+      WRITE(UNIT=ILUOUT,FMT='("  RADIATIONS called for KTCOUNT=",I6,       &
+         &  "with the CLOUD_ONLY option set ",L2)')   KTCOUNT,OCLOUD_ONLY
+!
+      !
+      WHERE (XDIRFLASWD.LT.0.0)
+         XDIRFLASWD=0.0
+      ENDWHERE
+      !
+      WHERE (XDIRFLASWD.GT.1500.0)
+         XDIRFLASWD=1500.0
+      ENDWHERE
+      !
+      WHERE (XSCAFLASWD.LT.0.0) 
+         XSCAFLASWD=0.0
+      ENDWHERE
+      !
+      WHERE (XSCAFLASWD.GT.1500.0) 
+         XSCAFLASWD=1500.0
+      ENDWHERE
+      !
+      WHERE( XDIRFLASWD(:,:,1) + XSCAFLASWD(:,:,1) >0. )
+        XALBUV(:,:) = (  XDIR_ALB(:,:,1) * XDIRFLASWD(:,:,1)   &
+                       + XSCA_ALB(:,:,1) * XSCAFLASWD(:,:,1) ) &
+                    / (XDIRFLASWD(:,:,1) + XSCAFLASWD(:,:,1) )
+      ELSEWHERE
+        XALBUV(:,:) = XDIR_ALB(:,:,1)
+      END WHERE
+!
+  END SELECT
+!
+  CALL SECOND_MNH2(ZTIME2)
+!
+  PRAD = PRAD + ZTIME2 - ZTIME1
+!
+  ZTIME1 = ZTIME2
+!
+  CALL SURF_RAD_MODIF (XMAP, XDXHAT, XDYHAT, XXHAT, XYHAT, &
+                  ZCOSZEN, ZSINZEN, ZAZIMSOL, XZS, XZS_XY,   &
+                  XDIRFLASWD, XDIRSRFSWD                     )
+!
+!* Azimuthal angle to be sent later to surface processes
+!  Defined in radian, clockwise, from North
+!
+  XAZIM = ZAZIMSOL
+!
+  CALL SECOND_MNH2(ZTIME2)
+!
+  PSHADOWS = PSHADOWS + ZTIME2 - ZTIME1
+!
+  ZTIME1 = ZTIME2
+!
+  DEALLOCATE(ZCOSZEN)
+  DEALLOCATE(ZSINZEN)
+  DEALLOCATE(ZAZIMSOL)
+!
+END IF
+!
+!
+!*        1.4   control prints
+!               --------------
+!
+!*        1.5   Radiative tendency integration
+!               ------------------------------
+!
+IF (CRAD /='NONE') THEN
+  if ( TBUCONF%LBUDGET_th ) call Budget_store_init( TBUDGETS(NBUDGET_TH), 'RAD', xrths(:, :, :) )
+  XRTHS(:,:,:) = XRTHS(:,:,:) + XRHODJ(:,:,:)*XDTHRAD(:,:,:)
+  if ( TBUCONF%LBUDGET_th ) call Budget_store_end ( TBUDGETS(NBUDGET_TH), 'RAD', xrths(:, :, :) )
+END IF
+!
+!
+!*        1.6   Ocean case:
+! Sfc turbulent fluxes & Radiative tendency due to SW penetrating ocean
+! 
+IF (LCOUPLES) THEN
+ZSFU(:,:)= XSSUFL_C(:,:,1)
+ZSFV(:,:)= XSSVFL_C(:,:,1)
+ZSFTH(:,:)= XSSTFL_C(:,:,1)
+ZSFRV(:,:)=XSSRFL_C(:,:,1)
+ELSE 
+IF (LOCEAN) THEN
+!
+  ALLOCATE( ZIZOCE(IKU)); ZIZOCE(:)=0. 
+  ALLOCATE( ZPROSOL1(IKU))
+  ALLOCATE( ZPROSOL2(IKU))
+  ALLOCATE(XSSOLA(IIU,IJU))
+  ! Time interpolation
+  JSW     = INT(TDTCUR%xtime/REAL(NINFRT))
+  ZSWA    = TDTCUR%xtime/REAL(NINFRT)-REAL(JSW)
+  ZSFRV = 0.
+  ZSFTH  = (XSSTFL_T(JSW+1)*(1.-ZSWA)+XSSTFL_T(JSW+2)*ZSWA) 
+  ZSFU = (XSSUFL_T(JSW+1)*(1.-ZSWA)+XSSUFL_T(JSW+2)*ZSWA)
+  ZSFV = (XSSVFL_T(JSW+1)*(1.-ZSWA)+XSSVFL_T(JSW+2)*ZSWA)
+!
+  ZIZOCE(IKU)   = XSSOLA_T(JSW+1)*(1.-ZSWA)+XSSOLA_T(JSW+2)*ZSWA
+  ZPROSOL1(IKU) = CST%XROC*ZIZOCE(IKU)
+  ZPROSOL2(IKU) = (1.-CST%XROC)*ZIZOCE(IKU)
+  if ( TBUCONF%LBUDGET_th ) call Budget_store_init( TBUDGETS(NBUDGET_TH), 'OCEAN', xrths(:, :, :) ) 
+  DO JKM=IKU-1,2,-1
+    ZPROSOL1(JKM) = ZPROSOL1(JKM+1)* exp(-XDZZ(2,2,JKM)/CST%XD1)
+    ZPROSOL2(JKM) = ZPROSOL2(JKM+1)* exp(-XDZZ(2,2,JKM)/CST%XD2)
+    ZIZOCE(JKM)   = (ZPROSOL1(JKM+1)-ZPROSOL1(JKM) + ZPROSOL2(JKM+1)-ZPROSOL2(JKM))/XDZZ(2,2,JKM)
+    ! Adding to temperature tendency, the solar radiation penetrating in ocean
+    XRTHS(:,:,JKM) = XRTHS(:,:,JKM) + XRHODJ(:,:,JKM)*ZIZOCE(JKM)
+  END DO
+  if ( TBUCONF%LBUDGET_th ) call Budget_store_end ( TBUDGETS(NBUDGET_TH), 'OCEAN', xrths(:, :, :) )
+  DEALLOCATE (XSSOLA)
+  DEALLOCATE( ZIZOCE) 
+  DEALLOCATE (ZPROSOL1)
+  DEALLOCATE (ZPROSOL2)
+END IF! LOCEAN NO LCOUPLES
+END IF!NO LCOUPLES
+!
+!
+CALL SECOND_MNH2(ZTIME2)
+!
+PRAD = PRAD + ZTIME2 - ZTIME1 &
+     - XTIME_LES_BU_PROCESS - XTIME_BU_PROCESS
+!
+PTIME_BU = PTIME_BU + XTIME_LES_BU_PROCESS + XTIME_BU_PROCESS
+!
+!
+!-----------------------------------------------------------------------------
+!
+!*        2.    DEEP CONVECTION SCHEME
+!               ----------------------
+!
+ZTIME1 = ZTIME2
+XTIME_BU_PROCESS = 0.
+XTIME_LES_BU_PROCESS = 0.
+!
+CALL SECOND_MNH2(ZTIME1)
+!
+IF( CDCONV == 'KAFR' .OR. CSCONV == 'KAFR' ) THEN
+
+  if (  TBUCONF%LBUDGET_th ) call Budget_store_init( TBUDGETS(NBUDGET_TH), 'DCONV', xrths(:, :, :)    )
+  if (  TBUCONF%LBUDGET_rv ) call Budget_store_init( TBUDGETS(NBUDGET_RV), 'DCONV', xrrs (:, :, :, 1) )
+  if (  TBUCONF%LBUDGET_rc ) call Budget_store_init( TBUDGETS(NBUDGET_RC), 'DCONV', xrrs (:, :, :, 2) )
+  if (  TBUCONF%LBUDGET_ri ) call Budget_store_init( TBUDGETS(NBUDGET_RI), 'DCONV', xrrs (:, :, :, 4) )
+  if (  TBUCONF%LBUDGET_sv .and. lchtrans ) then
+    do jsv = 1, size( xrsvs, 4 )
+      call Budget_store_init( TBUDGETS(NBUDGET_SV1 - 1 + jsv), 'DCONV', xrsvs (:, :, :, jsv) )
+    end do
+  end if
+!
+! test to see if the deep convection scheme should be called
+!
+  GDCONV = .FALSE.
+!
+  CALL DATETIME_DISTANCE(TDTDCONV,TDTCUR,ZTEMP_DIST)
+  IF( MOD(NINT(ZTEMP_DIST/XTSTEP),NINT(XDTCONV/XTSTEP))==0 ) THEN
+    TDTDCONV = TDTCUR
+    GDCONV   = .TRUE.
+  END IF
+!
+  IF( GDCONV ) THEN
+    IF (CDCONV == 'KAFR' .OR. CSCONV == 'KAFR' ) THEN
+        ALLOCATE( ZRC(IIU,IJU,IKU) )
+        ALLOCATE( ZRI(IIU,IJU,IKU) )
+        ALLOCATE( ZWT(IIU,IJU,IKU) )
+        ALLOCATE( ZDXDY(IIU,IJU) )
+        ! Compute grid area
+        ZDXDY(:,:) = SPREAD(XDXHAT(1:IIU),2,IJU) * SPREAD(XDYHAT(1:IJU),1,IIU)
+        !
+        IF( LUSERC .AND. LUSERI ) THEN
+          ZRC(:,:,:) = XRT(:,:,:,2)
+          ZRI(:,:,:) = XRT(:,:,:,4)
+        ELSE IF( LUSERC .AND. (.NOT. LUSERI) ) THEN
+          ZRC(:,:,:) = XRT(:,:,:,2)
+          ZRI(:,:,:) = 0.0
+        ELSE
+          ZRC(:,:,:) = 0.0
+          ZRI(:,:,:) = 0.0
+        END IF
+        WRITE(UNIT=ILUOUT,FMT='("  CONVECTION called for KTCOUNT=",I6)')  &
+                                              KTCOUNT
+        IF ( LFORCING .AND. L1D ) THEN
+          ZWT(:,:,:) = XWTFRC(:,:,:)
+        ELSE
+          ZWT(:,:,:) = XWT(:,:,:)
+        ENDIF
+        IF (LDUST) CALL DUST_FILTER(XSVT(:,:,:,NSV_DSTBEG:NSV_DSTEND), XRHODREF(:,:,:))
+        IF (LSALT) CALL SALT_FILTER(XSVT(:,:,:,NSV_SLTBEG:NSV_SLTEND), XRHODREF(:,:,:))
+        IF (LCH_CONV_LINOX) THEN
+          CALL CONVECTION( XDTCONV, CDCONV, CSCONV, LREFRESH_ALL, LDOWN, NICE, &
+                         LSETTADJ, XTADJD, XTADJS, LDIAGCONV, NENSM,           &
+                         XPABST, XZZ, ZDXDY,                                   &
+                         XTHT, XRT(:,:,:,1), ZRC, ZRI, XUT, XVT,               &
+                         ZWT,XTKET(:,:,IKB),                                   &
+                         NCOUNTCONV, XDTHCONV, XDRVCONV, XDRCCONV, XDRICONV,   &
+                         XPRCONV, XPRSCONV,                                    &
+                         XUMFCONV,XDMFCONV,XMFCONV,XPRLFLXCONV,XPRSFLXCONV,    &
+                         XCAPE, NCLTOPCONV, NCLBASCONV,                        &
+                         LCHTRANS, XSVT, XDSVCONV,                             &
+                         LUSECHEM, LCH_CONV_SCAV, LCH_CONV_LINOX,              &
+                         LDUST, LSALT,                                         &
+                         XRHODREF, XIC_RATE, XCG_RATE                          )
+        ELSE
+          CALL CONVECTION( XDTCONV, CDCONV, CSCONV, LREFRESH_ALL, LDOWN, NICE, &
+                         LSETTADJ, XTADJD, XTADJS, LDIAGCONV, NENSM,           &
+                         XPABST, XZZ, ZDXDY,                                   &
+                         XTHT, XRT(:,:,:,1), ZRC, ZRI, XUT, XVT,               &
+                         ZWT,XTKET(:,:,IKB),                                   &
+                         NCOUNTCONV, XDTHCONV, XDRVCONV, XDRCCONV, XDRICONV,   &
+                         XPRCONV, XPRSCONV,                                    &
+                         XUMFCONV,XDMFCONV,XMFCONV,XPRLFLXCONV,XPRSFLXCONV,    &
+                         XCAPE, NCLTOPCONV, NCLBASCONV,                        &
+                         LCHTRANS, XSVT, XDSVCONV,                             &
+                         LUSECHEM, LCH_CONV_SCAV, LCH_CONV_LINOX,              &
+                         LDUST, LSALT,                                         &
+                         XRHODREF )
+        END IF
+!
+        DEALLOCATE( ZRC )
+        DEALLOCATE( ZRI )
+        DEALLOCATE( ZWT )
+        DEALLOCATE( ZDXDY )
+    END IF    
+  END IF
+!
+!  Deep convection tendency integration
+!
+  XRTHS(:,:,:)  = XRTHS(:,:,:)  + XRHODJ(:,:,:) * XDTHCONV(:,:,:)
+  XRRS(:,:,:,1) = XRRS(:,:,:,1) + XRHODJ(:,:,:) * XDRVCONV(:,:,:)
+!
+!
+! Aerosols size distribution
+! Compute Rg and sigma before tracers convection tendency (for orilam, dust and sea
+! salt)
+!
+
+  IF ( LCHTRANS ) THEN  ! update tracers for chemical transport
+    IF (LORILAM) ZRSVS(:,:,:,:) = XRSVS(:,:,:,:)    !
+    IF ((LDUST)) THEN ! dust convective balance
+      ALLOCATE(ZSIGDST(IIU,IJU,IKU,NMODE_DST))
+      ALLOCATE(ZRGDST(IIU,IJU,IKU,NMODE_DST))
+      ALLOCATE(ZNDST(IIU,IJU,IKU,NMODE_DST))
+      ALLOCATE(ZSVDST(IIU,IJU,IKU,NSV_DST))
+      !
+      DO JSV=1,NMODE_DST
+        IMODEIDX = JPDUSTORDER(JSV)
+        IF (CRGUNITD=="MASS") THEN
+          ZINIRADIUS(JSV) = XINIRADIUS(IMODEIDX) * EXP(-3.*(LOG(XINISIG(IMODEIDX)))**2)
+        ELSE
+          ZINIRADIUS(JSV) = XINIRADIUS(IMODEIDX)
+        END IF
+        ZSIGDST(:,:,:,JSV) = XINISIG(IMODEIDX)
+        ZRGDST(:,:,:,JSV)  = ZINIRADIUS(JSV)
+        ZNDST(:,:,:,JSV)   = XN0MIN(IMODEIDX)
+      ENDDO
+      !
+    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 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
+      !
+    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 PPP2SALT(ZSVSLT(IIB:IIE,IJB:IJE,IKB:IKE,:), XRHODREF(IIB:IIE,IJB:IJE,IKB:IKE),&
+              PSIG3D=ZSIGSLT(IIB:IIE,IJB:IJE,IKB:IKE,:), PRG3D=ZRGSLT(IIB:IIE,IJB:IJE,IKB:IKE,:),   &
+              PN3D=ZNSLT(IIB:IIE,IJB:IJE,IKB:IKE,:))
+    END IF
+    !
+!
+! Compute convective tendency for all tracers
+!
+  IF (LCHTRANS) THEN
+    DO JSV = 1, SIZE(XRSVS,4)
+      XRSVS(:,:,:,JSV) = XRSVS(:,:,:,JSV) + XRHODJ(:,:,:) * XDSVCONV(:,:,:,JSV)
+    END DO
+    IF (LORILAM) THEN
+      DO JSV = NSV_AERBEG,NSV_AEREND
+        PWETDEPAER(:,:,:,JSV-NSV_AERBEG+1) = XDSVCONV(:,:,:,JSV) * XRHODJ(:,:,:)
+        XRSVS(:,:,:,JSV) = ZRSVS(:,:,:,JSV) 
+      END DO
+    END IF  
+  END IF
+!
+  IF ((LDUST).AND.(LCHTRANS)) THEN ! dust convective balance
+    IF (CPROGRAM == "MESONH") THEN
+      DO JSV=NSV_DSTBEG,NSV_DSTEND
+          ZSVDST(:,:,:,JSV-NSV_DSTBEG+1) = XRSVS(:,:,:,JSV) * XTSTEP / XRHODJ(:,:,:) 
+      ENDDO
+    ELSE
+      DO JSV=NSV_DSTBEG,NSV_DSTEND
+        ZSVDST(:,:,:,JSV-NSV_DSTBEG+1) = XSVT(:,:,:,JSV)
+      ENDDO
+    ENDIF
+    CALL DUST2PPP(ZSVDST(IIB:IIE,IJB:IJE,IKB:IKE,:), &
+                    XRHODREF(IIB:IIE,IJB:IJE,IKB:IKE), ZSIGDST(IIB:IIE,IJB:IJE,IKB:IKE,:),&
+                    ZRGDST(IIB:IIE,IJB:IJE,IKB:IKE,:))
+    DO JSV=NSV_DSTBEG,NSV_DSTEND
+      XRSVS(:,:,:,JSV) =  ZSVDST(:,:,:,JSV-NSV_DSTBEG+1) * XRHODJ(:,:,:) / XTSTEP
+    ENDDO
+    !
+    DEALLOCATE(ZSVDST)
+    DEALLOCATE(ZNDST)
+    DEALLOCATE(ZRGDST)
+    DEALLOCATE(ZSIGDST)
+  END IF
+    !
+  IF ((LSALT).AND.(LCHTRANS)) THEN ! sea salt convective balance
+    IF (CPROGRAM == "MESONH") THEN
+      DO JSV=NSV_SLTBEG,NSV_SLTEND
+        ZSVSLT(:,:,:,JSV-NSV_SLTBEG+1) = XRSVS(:,:,:,JSV) * XTSTEP / XRHODJ(:,:,:) 
+      ENDDO
+    ELSE
+      DO JSV=NSV_SLTBEG,NSV_SLTEND
+        ZSVSLT(:,:,:,JSV-NSV_SLTBEG+1) = XSVT(:,:,:,JSV)
+      ENDDO
+    END IF
+    CALL SALT2PPP(ZSVSLT(IIB:IIE,IJB:IJE,IKB:IKE,:), &
+                  XRHODREF(IIB:IIE,IJB:IJE,IKB:IKE), ZSIGSLT(IIB:IIE,IJB:IJE,IKB:IKE,:),&
+                  ZRGSLT(IIB:IIE,IJB:IJE,IKB:IKE,:))
+    DO JSV=NSV_SLTBEG,NSV_SLTEND
+      XRSVS(:,:,:,JSV) =  ZSVSLT(:,:,:,JSV-NSV_SLTBEG+1) * XRHODJ(:,:,:) / XTSTEP
+    ENDDO
+    !
+    DEALLOCATE(ZSVSLT)
+    DEALLOCATE(ZNSLT)
+    DEALLOCATE(ZRGSLT)
+    DEALLOCATE(ZSIGSLT)
+  END IF
+  !
+END IF
+!
+  IF( LUSERC .AND. LUSERI ) THEN
+    XRRS(:,:,:,2) = XRRS(:,:,:,2) + XRHODJ(:,:,:) * XDRCCONV(:,:,:)
+    XRRS(:,:,:,4) = XRRS(:,:,:,4) + XRHODJ(:,:,:) * XDRICONV(:,:,:)
+!
+  ELSE IF ( LUSERC .AND. (.NOT. LUSERI) ) THEN
+!
+!  If only cloud water but no cloud ice is used, the convective tendency
+!     for cloud ice is added to the tendency for cloud water
+!
+      XRRS(:,:,:,2) = XRRS(:,:,:,2) + XRHODJ(:,:,:) * (XDRCCONV(:,:,:) + &
+                                                       XDRICONV(:,:,:)   )
+!     and cloud ice is melted
+!
+      XRTHS(:,:,:) = XRTHS(:,:,:) - XRHODJ(:,:,:) *                      &
+         ( XP00/XPABST(:,:,:) )**(XRD/XCPD) * CST%XLMTT / XCPD * XDRICONV(:,:,:)
+!
+  ELSE IF ( (.NOT. LUSERC) .AND. (.NOT. LUSERI) ) THEN
+!
+!  If no cloud water and no cloud ice are used the convective tendencies for these
+!     variables are added to the water vapor tendency
+!
+      XRRS(:,:,:,1) = XRRS(:,:,:,1) + XRHODJ(:,:,:) * (XDRCCONV(:,:,:) + &
+                                                       XDRICONV(:,:,:)   )
+!     and all cloud condensate is evaporated
+!
+      XRTHS(:,:,:) = XRTHS(:,:,:) - XRHODJ(:,:,:) / XCPD * (              &
+                     CST%XLVTT * XDRCCONV(:,:,:) + CST%XLSTT * XDRICONV(:,:,:) ) *&
+                    ( XP00 / XPABST(:,:,:) ) ** ( XRD / XCPD )
+  END IF
+
+  if (  TBUCONF%LBUDGET_th ) call Budget_store_end( TBUDGETS(NBUDGET_TH), 'DCONV', xrths(:, :, :)    )
+  if (  TBUCONF%LBUDGET_rv ) call Budget_store_end( TBUDGETS(NBUDGET_RV), 'DCONV', xrrs (:, :, :, 1) )
+  if (  TBUCONF%LBUDGET_rc ) call Budget_store_end( TBUDGETS(NBUDGET_RC), 'DCONV', xrrs (:, :, :, 2) )
+  if (  TBUCONF%LBUDGET_ri ) call Budget_store_end( TBUDGETS(NBUDGET_RI), 'DCONV', xrrs (:, :, :, 4) )
+  if (  TBUCONF%LBUDGET_sv .and. lchtrans ) then
+    do jsv = 1, size( xrsvs, 4 )
+      call Budget_store_end( TBUDGETS(NBUDGET_SV1 - 1 + jsv), 'DCONV', xrsvs (:, :, :, jsv) )
+    end do
+  end if
+END IF
+!
+CALL SECOND_MNH2(ZTIME2)
+!
+PKAFR = PKAFR + ZTIME2 - ZTIME1 &
+       - XTIME_LES_BU_PROCESS - XTIME_BU_PROCESS
+!
+PTIME_BU = PTIME_BU + XTIME_LES_BU_PROCESS + XTIME_BU_PROCESS
+!
+!-----------------------------------------------------------------------------
+!
+!*        3.    TURBULENT SURFACE FLUXES
+!               ------------------------
+!
+ZTIME1 = ZTIME2
+!
+IF (CSURF=='EXTE') THEN
+  CALL GOTO_SURFEX(IMI)
+!
+  IF( LTRANS ) THEN
+    XUT(:,:,1+JPVEXT) = XUT(:,:,1+JPVEXT) + XUTRANS
+    XVT(:,:,1+JPVEXT) = XVT(:,:,1+JPVEXT) + XVTRANS
+  END IF
+  !
+  ALLOCATE(ZDIR_ALB(IIU,IJU,NSWB_MNH))
+  ALLOCATE(ZSCA_ALB(IIU,IJU,NSWB_MNH))
+  ALLOCATE(ZEMIS  (IIU,IJU,NLWB_MNH))
+  ALLOCATE(ZTSRAD (IIU,IJU))
+  !  
+  IKIDM=0
+  DO JKID = IMI+1,NMODEL  ! min value of the possible kids
+    IF (IMI == NDAD(JKID) .AND. XWAY(JKID) == 2. .AND. &
+     CPROGRAM=='MESONH' .AND. &
+     (CCONF == 'RESTA' .OR. (CCONF == 'START' .AND. KTCOUNT /= 1))) THEN
+    !  where kids exist, use the two-way output fields (i.e. OMASKkids true)
+    !  rather than the farther calculations in radiation and convection schemes
+! BUG if number of the son does not follow the number of the dad
+!    IKIDM = JKID-IMI
+      IKIDM = IKIDM + 1
+     IF (LUSERC .AND. (                                               &
+         (LSEDIC .AND. CCLOUD(1:3) == 'ICE')                     .OR. &
+         (LSEDC  .AND. (CCLOUD == 'C2R2' .OR. CCLOUD == 'KHKO')) .OR. &
+         (MSEDC  .AND. CCLOUD=='LIMA')                                &
+        )) THEN
+         WHERE (OMASKkids(:,:) )
+            XINPRC(:,:) = ZSAVE_INPRC(:,:,IKIDM)
+          ENDWHERE
+      END IF
+      IF (LUSERR) THEN
+        WHERE (OMASKkids(:,:) )
+          XINPRR(:,:) = ZSAVE_INPRR(:,:,IKIDM)
+        ENDWHERE
+      END IF
+      IF (LUSERS) THEN
+        WHERE (OMASKkids(:,:) )
+          XINPRS(:,:) = ZSAVE_INPRS(:,:,IKIDM)
+       ENDWHERE
+      END IF
+      IF (LUSERG) THEN
+        WHERE (OMASKkids(:,:) )
+          XINPRG(:,:) = ZSAVE_INPRG(:,:,IKIDM)
+        ENDWHERE
+      END IF
+      IF (LUSERH) THEN
+        WHERE (OMASKkids(:,:) )
+          XINPRH(:,:) = ZSAVE_INPRH(:,:,IKIDM)
+        ENDWHERE
+      END IF
+      IF (CDCONV /= 'NONE') THEN
+        WHERE (OMASKkids(:,:) )
+          XPRCONV(:,:) = ZSAVE_PRCONV(:,:,IKIDM)
+          XPRSCONV(:,:) = ZSAVE_PRSCONV(:,:,IKIDM)
+        ENDWHERE
+      END IF
+      IF (CRAD /= 'NONE') THEN
+        DO JSWB=1,NSWB_MNH
+          WHERE (OMASKkids(:,:) ) 
+            XDIRFLASWD(:,:,JSWB) = ZSAVE_DIRFLASWD(:,:,JSWB,IKIDM)
+            XSCAFLASWD(:,:,JSWB) = ZSAVE_SCAFLASWD(:,:,JSWB,IKIDM)
+            XDIRSRFSWD(:,:,JSWB) = ZSAVE_DIRSRFSWD(:,:,JSWB,IKIDM)
+          ENDWHERE
+        ENDDO
+      END IF
+    ENDIF
+  END DO
+  !
+ IF (IMODSON /= 0 ) THEN
+    DEALLOCATE( ZSAVE_INPRR,ZSAVE_INPRS,ZSAVE_INPRG,ZSAVE_INPRH)
+    DEALLOCATE( ZSAVE_INPRC,ZSAVE_PRCONV,ZSAVE_PRSCONV)
+    DEALLOCATE( ZSAVE_DIRFLASWD,ZSAVE_SCAFLASWD,ZSAVE_DIRSRFSWD)
+ END IF
+   CALL GROUND_PARAM_n(YLDIMPHYEX,ZSFTH, ZSFTH_WALL, ZSFTH_ROOF, ZCD_ROOF, ZSFRV, ZSFRV_WALL, ZSFRV_ROOF, &
+                      ZSFSV, ZSFCO2, ZSFU, ZSFV, ZDIR_ALB, ZSCA_ALB, ZEMIS, ZTSRAD, KTCOUNT, TPFILE  )
+  !
+  IF (LIBM) THEN
+    WHERE(XIBM_LS(:,:,IKB,1).GT.-XIBM_EPSI)
+      ZSFTH(:,:)=0.
+      ZSFRV(:,:)=0. 
+      ZSFU (:,:)=0. 
+      ZSFV (:,:)=0.
+    ENDWHERE
+    IF (NSV>0) THEN
+      DO JSV = 1 , NSV
+         WHERE(XIBM_LS(:,:,IKB,1).GT.-XIBM_EPSI) ZSFSV(:,:,JSV)=0.
+      ENDDO
+    ENDIF 
+  ENDIF
+  !
+  IF (SIZE(XEMIS)>0) THEN
+    XDIR_ALB = ZDIR_ALB
+    XSCA_ALB = ZSCA_ALB
+    XEMIS    = ZEMIS
+    XTSRAD   = ZTSRAD
+  END IF
+  !
+  DEALLOCATE(ZDIR_ALB)
+  DEALLOCATE(ZSCA_ALB)
+  DEALLOCATE(ZEMIS   )
+  DEALLOCATE(ZTSRAD  )
+  !
+  !
+  IF( LTRANS ) THEN
+    XUT(:,:,1+JPVEXT) = XUT(:,:,1+JPVEXT) - XUTRANS
+    XVT(:,:,1+JPVEXT) = XVT(:,:,1+JPVEXT) - XVTRANS
+  END IF
+!
+ELSE ! case no SURFEX (CSURF logical)
+  ZSFSV    = 0.
+  ZSFCO2   = 0.
+  ZSFTH_WALL = 0.
+  ZSFTH_ROOF = 0.
+  ZCD_ROOF   = 0.
+  ZSFRV_WALL = 0.
+  ZSFRV_ROOF = 0.
+  IF (.NOT.LOCEAN) THEN
+    ZSFTH    = 0.
+    ZSFRV    = 0.
+    ZSFSV    = 0.
+    ZSFCO2   = 0.
+    ZSFU     = 0.
+    ZSFV     = 0.
+  END IF
+END IF !CSURF
+!
+CALL SECOND_MNH2(ZTIME2)
+!
+PGROUND = PGROUND + ZTIME2 - ZTIME1
+!
+!-----------------------------------------------------------------------------
+!
+!*        3.1    EDDY FLUXES PARAMETRIZATION
+!               ------------------
+!
+IF (IMI==1) THEN  ! On calcule les flus turb. comme preconise par PP
+
+   ! Heat eddy fluxes
+   IF ( LTH_FLX ) CALL EDDY_FLUX_n(IMI,KTCOUNT,XVT,XTHT,XRHODJ,XRTHS,XVTH_FLUX_M,XWTH_FLUX_M)
+   !
+   ! Momentum eddy fluxes
+   IF ( LUV_FLX ) CALL EDDYUV_FLUX_n(IMI,KTCOUNT,XVT,XTHT,XRHODJ,XRHODREF,XPABSM,XRVS,XVU_FLUX_M)
+
+ELSE
+   ! TEST pour maille infèrieure à 20km ? 
+   !      car pb d'instabilités ?
+   !      Pour le modèle fils, on spawne les flux du modèle père
+   ! Heat eddy fluxes
+   IF ( LTH_FLX ) CALL EDDY_FLUX_ONE_WAY_n (IMI,KTCOUNT,NDXRATIO_ALL(IMI),NDYRATIO_ALL(IMI),CLBCX,CLBCY)
+   !
+   ! Momentum eddy fluxes
+   IF ( LUV_FLX ) CALL EDDYUV_FLUX_ONE_WAY_n (IMI,KTCOUNT,NDXRATIO_ALL(IMI),NDYRATIO_ALL(IMI),CLBCX,CLBCY)
+   !
+END IF
+!-----------------------------------------------------------------------------
+!
+!*        4.    PASSIVE POLLUTANTS
+!               ------------------
+!
+ZTIME1 = ZTIME2
+!
+IF (LPASPOL) CALL PASPOL(XTSTEP, ZSFSV, ILUOUT, NVERB, TPFILE)
+!
+!
+!*        4b.  PASSIVE POLLUTANTS FOR MASS-FLUX SCHEME DIAGNOSTICS
+!              ---------------------------------------------------
+!
+IF (LCONDSAMP) CALL CONDSAMP(XTSTEP, ZSFSV, ILUOUT, NVERB)
+!
+CALL SECOND_MNH2(ZTIME2)
+!
+PTRACER = PTRACER + ZTIME2 - ZTIME1
+!-----------------------------------------------------------------------------
+!
+!*        5a.    Drag force 
+!               ----------
+!
+ZTIME1 = ZTIME2
+XTIME_BU_PROCESS = 0.
+XTIME_LES_BU_PROCESS = 0.
+!
+CALL ADD2DFIELD_ll(TZFIELDS_ll,ZSFTH_WALL, 'PHYS_PARAM_n::ZSFTH_WALL')
+CALL ADD2DFIELD_ll(TZFIELDS_ll,ZSFTH_ROOF, 'PHYS_PARAM_n::ZSFTH_ROOF')
+CALL ADD2DFIELD_ll(TZFIELDS_ll,ZCD_ROOF, 'PHYS_PARAM_n::ZCD_ROOF')
+CALL ADD2DFIELD_ll(TZFIELDS_ll,ZSFRV_WALL, 'PHYS_PARAM_n::ZSFRV_WALL')
+CALL ADD2DFIELD_ll(TZFIELDS_ll,ZSFRV_ROOF, 'PHYS_PARAM_n::ZSFRV_ROOF')
+!
+IF ( CLBCX(1) /= "CYCL" .AND. LWEST_ll()) THEN
+   ZSFTH_WALL(IIB-1,:)=ZSFTH_WALL(IIB,:)
+   ZSFTH_ROOF(IIB-1,:)=ZSFTH_ROOF(IIB,:)
+   ZCD_ROOF  (IIB-1,:)=ZCD_ROOF(IIB,:)
+   ZSFRV_WALL(IIB-1,:)=ZSFRV_WALL(IIB,:)
+   ZSFRV_ROOF(IIB-1,:)=ZSFRV_ROOF(IIB,:)
+ENDIF
+!
+IF ( CLBCX(2) /= "CYCL" .AND. LEAST_ll()) THEN
+   ZSFTH_WALL(IIE+1,:)=ZSFTH_WALL(IIE,:)
+   ZSFTH_ROOF(IIE+1,:)=ZSFTH_ROOF(IIE,:)
+   ZCD_ROOF(IIE+1,:)  =ZCD_ROOF(IIE,:)
+   ZSFRV_WALL(IIE+1,:)=ZSFRV_WALL(IIE,:)
+   ZSFRV_ROOF(IIE+1,:)=ZSFRV_ROOF(IIE,:)
+ENDIF
+!
+IF ( CLBCY(1) /= "CYCL" .AND. LSOUTH_ll()) THEN
+   ZSFTH_WALL(:,IJB-1)=ZSFTH_WALL(:,IJB)
+   ZSFTH_ROOF(:,IJB-1)=ZSFTH_ROOF(:,IJB)
+   ZCD_ROOF(:,IJB-1)  =ZCD_ROOF(:,IJB)
+   ZSFRV_WALL(:,IJB-1)=ZSFRV_WALL(:,IJB)
+   ZSFRV_ROOF(:,IJB-1)=ZSFRV_ROOF(:,IJB)
+ENDIF
+!
+IF ( CLBCY(2) /= "CYCL" .AND. LNORTH_ll()) THEN
+   ZSFTH_WALL(:,IJE+1)=ZSFTH_WALL(:,IJE)
+   ZSFTH_ROOF(:,IJE+1)=ZSFTH_ROOF(:,IJE)
+   ZCD_ROOF(:,IJE+1)=ZCD_ROOF(:,IJE)
+   ZSFRV_WALL(:,IJE+1)=ZSFRV_WALL(:,IJE)
+   ZSFRV_ROOF(:,IJE+1)=ZSFRV_ROOF(:,IJE)
+ENDIF
+!
+!
+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, XPABST, XTHT, XRT, XSVT, &
+                               XRHODJ, XZZ, XRUS, XRVS, XRTKES, XRTHS, XRRS,     &
+                               ZSFTH_WALL, ZSFTH_ROOF, ZCD_ROOF, ZSFRV_WALL,     &
+                               ZSFRV_ROOF       )
+!
+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 ) ) DEALLOCATE( XTHW_FLUX )
+IF ( LFLYER ) THEN
+  ALLOCATE( XTHW_FLUX(SIZE( XTHT, 1 ), SIZE( XTHT, 2 ), SIZE( XTHT, 3 )) )
+ELSE
+  ALLOCATE( XTHW_FLUX(0, 0, 0) )
+END IF
+
+IF ( ALLOCATED( XRCW_FLUX ) ) DEALLOCATE( XRCW_FLUX )
+IF ( LFLYER ) THEN
+  ALLOCATE( XRCW_FLUX(SIZE( XTHT, 1 ), SIZE( XTHT, 2 ), SIZE( XTHT, 3 )) )
+ELSE
+  ALLOCATE( XRCW_FLUX(0, 0, 0) )
+END IF
+
+IF ( ALLOCATED( XSVW_FLUX ) ) DEALLOCATE( XSVW_FLUX )
+IF ( LFLYER ) THEN
+  ALLOCATE( XSVW_FLUX(SIZE( XSVT, 1 ), SIZE( XSVT, 2 ), SIZE( XSVT, 3 ), SIZE( XSVT, 4 )) )
+ELSE
+  ALLOCATE( XSVW_FLUX(0, 0, 0, 0) )
+END IF
+!
+GCOMPUTE_SRC=SIZE(XSIGS, 3)/=0
+!
+ALLOCATE(ZTDIFF(IIU,IJU,IKU))
+ALLOCATE(ZTDISS(IIU,IJU,IKU))
+!
+!! Compute Shape of sfc flux for Oceanic Deep Conv Case
+!
+IF (LOCEAN .AND. LDEEPOC) THEN
+  ALLOCATE(ZDIST(IIU,IJU))
+  !*       COMPUTES THE PHYSICAL SUBDOMAIN BOUNDS
+  ALLOCATE(ZXHAT_ll(NIMAX_ll+2*JPHEXT),ZYHAT_ll(NJMAX_ll+2*JPHEXT))
+  !compute ZXHAT_ll = position in the (0:Lx) domain 1 (Lx=Size of domain1 )
+  !compute XXHAT_ll = position in the (L0_subproc,Lx_subproc) domain for the current subproc
+  !                                     L0_subproc as referenced in the full domain 1
+  CALL GATHERALL_FIELD_ll('XX',XXHAT,ZXHAT_ll,IRESP)
+  CALL GATHERALL_FIELD_ll('YY',XYHAT,ZYHAT_ll,IRESP)
+  CALL GET_DIM_EXT_ll('B',IIU,IJU)
+  DO JJ = IJB,IJE
+    DO JI = IIB,IIE
+      ZDIST(JI,JJ) = SQRT(                         &
+      (( (XXHAT(JI)+XXHAT(JI+1))*0.5 - XCENTX_OC ) / XRADX_OC)**2 + &
+      (( (XYHAT(JJ)+XYHAT(JJ+1))*0.5 - XCENTY_OC ) / XRADY_OC)**2   &
+                                )
+    END DO
+  END DO
+  DO JJ=IJB,IJE
+    DO JI=IIB,IIE
+      IF ( ZDIST(JI,JJ) > 1.) ZSFTH(JI,JJ)=0.
+    END DO
+  END DO
+END IF !END DEEP OCEAN CONV CASE
+!
+IF(LLEONARD) THEN
+  IGRADIENTS=6
+  ALLOCATE(ZHGRAD(IIU,IJU,IKU,IGRADIENTS))
+  ZHGRAD(:,:,:,1) = GX_W_UW(XWT(:,:,:), XDXX,XDZZ,XDZX,1,IKU,1)
+  ZHGRAD(:,:,:,2) = GY_W_VW(XWT(:,:,:), XDXX,XDZZ,XDZX,1,IKU,1)
+  ZHGRAD(:,:,:,3) = GX_M_M(XTHT(:,:,:), XDXX,XDZZ,XDZX,1,IKU,1)
+  ZHGRAD(:,:,:,4) = GY_M_M(XTHT(:,:,:), XDXX,XDZZ,XDZX,1,IKU,1)
+  ZHGRAD(:,:,:,5) = GX_M_M(XRT(:,:,:,1), XDXX,XDZZ,XDZX,1,IKU,1)
+  ZHGRAD(:,:,:,6) = GY_M_M(XRT(:,:,:,1), XDXX,XDZZ,XDZX,1,IKU,1)
+END IF
+   CALL TURB( CST,CSTURB, TBUCONF, TURBN, NEBN, YLDIMPHYEX,TLES, &
+              NRR, NRRL, NRRI, CLBCX, CLBCY, IGRADIENTS, NHALO, NTURBSPLIT,          &
+              LCLOUDMODIFLM, NSV, NSV_LGBEG, NSV_LGEND,                              &
+              NSV_LIMA_NR, NSV_LIMA_NS, NSV_LIMA_NG, NSV_LIMA_NH,                    &
+              L2D, LNOMIXLG,LFLAT,                                                   &
+              LCOUPLES, LBLOWSNOW, LIBM,LFLYER,                                      &
+              GCOMPUTE_SRC, XRSNOW,                                                  &
+              LOCEAN, LDEEPOC, LDIAG_IN_RUN,                                         &
+              CTURBLEN_CLOUD, CCLOUD,                                                &
+              XTSTEP, TPFILE,                                                        &
+              XDXX, XDYY, XDZZ, XDZX, XDZY, XZZ,                                     &
+              XDIRCOSXW, XDIRCOSYW, XDIRCOSZW, XCOSSLOPE, XSINSLOPE,                 &
+              XRHODJ, XTHVREF, ZHGRAD, XZS,                                          &
+              ZSFTH, ZSFRV, ZSFSV, ZSFU, ZSFV,                                       &
+              XPABST, XUT, XVT, XWT, XTKET, XSVT, XSRCT,                             &
+              ZLENGTHM, ZLENGTHH, ZMFMOIST,                                          &
+              XBL_DEPTH, XSBL_DEPTH,                                                 &
+              XCEI, XCEI_MIN, XCEI_MAX, XCOEF_AMPL_SAT,                              &
+              XTHT, XRT,                                                             &
+              XRUS, XRVS, XRWS, XRTHS, XRRS, XRSVS, XRTKES, XSIGS, XWTHVMF,          &
+              XTHW_FLUX, XRCW_FLUX, XSVW_FLUX,XDYP, XTHP, ZTDIFF, ZTDISS,            &
+              TBUDGETS, KBUDGETS=SIZE(TBUDGETS),PLEM=XLEM,PRTKEMS=XRTKEMS,           &
+              PTR=XTR, PDISS=XDISS, PCURRENT_TKE_DISS=XCURRENT_TKE_DISS,             &
+              PIBM_LS=XIBM_LS(:,:,:,1), PIBM_XMUT=XIBM_XMUT,                         & 
+              PSSTFL=XSSTFL, PSSTFL_C=XSSTFL_C, PSSRFL_C=XSSRFL_C,                   &
+              PSSUFL_C=XSSUFL_C, PSSVFL_C=XSSVFL_C, PSSUFL=XSSUFL, PSSVFL=XSSVFL     )
+!
+DEALLOCATE(ZTDIFF)
+DEALLOCATE(ZTDISS)
+IF(LLEONARD) DEALLOCATE(ZHGRAD)
+!
+IF (LRMC01) THEN
+  CALL ADD2DFIELD_ll( TZFIELDS_ll, XSBL_DEPTH, 'PHYS_PARAM_n::XSBL_DEPTH' )
+  CALL UPDATE_HALO_ll(TZFIELDS_ll,IINFO_ll)
+  CALL CLEANLIST_ll(TZFIELDS_ll)
+  IF ( CLBCX(1) /= "CYCL" .AND. LWEST_ll()) THEN
+    XSBL_DEPTH(IIB-1,:)=XSBL_DEPTH(IIB,:)
+  END IF
+  IF ( CLBCX(2) /= "CYCL" .AND. LEAST_ll()) THEN
+    XSBL_DEPTH(IIE+1,:)=XSBL_DEPTH(IIE,:)
+  END IF
+  IF ( CLBCY(1) /= "CYCL" .AND. LSOUTH_ll()) THEN
+    XSBL_DEPTH(:,IJB-1)=XSBL_DEPTH(:,IJB)
+  END IF
+  IF ( CLBCY(2) /= "CYCL" .AND. LNORTH_ll()) THEN
+    XSBL_DEPTH(:,IJE+1)=XSBL_DEPTH(:,IJE)
+  END IF
+END IF
+!
+CALL SECOND_MNH2(ZTIME3)
+!
+!-----------------------------------------------------------------------------
+!
+!*        7.    EDMF SCHEME
+!               -----------
+!
+IF (CSCONV == 'EDKF') THEN
+     ALLOCATE(ZEXN (IIU,IJU,IKU))
+     ALLOCATE(ZSIGMF (IIU,IJU,IKU))
+     ZSIGMF(:,:,:)=0.    
+     ZEXN(:,:,:)=(XPABST(:,:,:)/XP00)**(XRD/XCPD)  
+     !$20131113 check3d on ZEXN
+     CALL MPPDB_CHECK3D(ZEXN,"physparan.7::ZEXN",PRECISION)
+     CALL ADD3DFIELD_ll( TZFIELDS_ll, ZEXN, 'PHYS_PARAM_n::ZEXN' )
+     !$20131113 add update_halo_ll
+     CALL UPDATE_HALO_ll(TZFIELDS_ll,IINFO_ll)
+     CALL CLEANLIST_ll(TZFIELDS_ll)
+     CALL MPPDB_CHECK3D(ZEXN,"physparam.7::ZEXN",PRECISION)
+ !    
+     CALL SHALLOW_MF_PACK(NRR,NRRL,NRRI,                                  &
+                   TPFILE,ZTIME_LES_MF,                                   &
+                   XTSTEP,                                                &
+                   XDZZ, XZZ,XDXHAT(1),XDYHAT(1),                         &
+                   XRHODJ, XRHODREF, XPABST, ZEXN, ZSFTH, ZSFRV,          &
+                   XTHT,XRT,XUT,XVT,XTKET,XSVT,                           &
+                   XRTHS,XRRS,XRUS,XRVS,XRSVS,                            &
+                   ZSIGMF,XRC_MF, XRI_MF, XCF_MF, XWTHVMF)
+!
+ELSE
+    XWTHVMF(:,:,:)=0.
+    XRC_MF(:,:,:)=0.
+    XRI_MF(:,:,:)=0.
+    XCF_MF(:,:,:)=0.
+ENDIF   
+!
+CALL SECOND_MNH2(ZTIME4)
+
+  IF( LTRANS ) THEN
+    XUT(:,:,:) = XUT(:,:,:) - XUTRANS
+    XVT(:,:,:) = XVT(:,:,:) - XVTRANS
+  END IF
+  IF (CMF_CLOUD == 'STAT') THEN
+    XSIGS =SQRT( XSIGS**2 + ZSIGMF**2 )
+  ENDIF
+  IF (CSCONV == 'EDKF') THEN
+    DEALLOCATE(ZSIGMF)
+    DEALLOCATE(ZEXN)
+  ENDIF
+END IF
+!
+IF (LLES_CALL) CALL SWITCH_SBG_LES_n
+!
+CALL SECOND_MNH2(ZTIME2)
+!
+PTURB = PTURB + ZTIME2 - ZTIME1 - (XTIME_LES-ZTIME_LES_MF) - XTIME_LES_BU_PROCESS &
+      - XTIME_BU_PROCESS - (ZTIME4 - ZTIME3)
+!
+PMAFL = PMAFL + ZTIME4 - ZTIME3 - ZTIME_LES_MF
+!
+PTIME_BU = PTIME_BU + XTIME_LES_BU_PROCESS + XTIME_BU_PROCESS
+!
+!
+!-------------------------------------------------------------------------------
+!
+!* deallocation of variables used in more than one parameterization
+!
+DEALLOCATE(ZSFU  )         ! surface schemes + turbulence
+DEALLOCATE(ZSFV  )
+DEALLOCATE(ZSFTH )
+DEALLOCATE(ZSFRV )
+DEALLOCATE(ZSFSV )
+DEALLOCATE(ZSFCO2)
+!
+DEALLOCATE(ZSFTH_WALL )
+DEALLOCATE(ZSFTH_ROOF )
+DEALLOCATE(ZCD_ROOF )
+DEALLOCATE(ZSFRV_WALL )
+DEALLOCATE(ZSFRV_ROOF )
+!-------------------------------------------------------------------------------
+!
+END SUBROUTINE PHYS_PARAM_n
+
diff --git a/src/PHYEX/ext/prep_ideal_case.f90 b/src/PHYEX/ext/prep_ideal_case.f90
new file mode 100644
index 0000000000000000000000000000000000000000..25eac5bc19829db1276abb1fb4def279fa28d9b8
--- /dev/null
+++ b/src/PHYEX/ext/prep_ideal_case.f90
@@ -0,0 +1,1953 @@
+!MNH_LIC Copyright 1994-2023 CNRS, Meteo-France and Universite Paul Sabatier
+!MNH_LIC This is part of the Meso-NH software governed by the CeCILL-C licence
+!MNH_LIC version 1. See LICENSE, CeCILL-C_V1-en.txt and CeCILL-C_V1-fr.txt
+!MNH_LIC for details. version 1.
+!-----------------------------------------------------------------
+!     #######################
+      PROGRAM PREP_IDEAL_CASE
+!     #######################
+!
+!!****  *PREP_IDEAL_CASE* - program to write an initial FM-file 
+!!
+!!    PURPOSE
+!!    -------
+!       The purpose of this program is to prepare an initial meso-NH file
+!     (LFIFM and DESFM files) filled with some idealized fields.    
+!
+!      ---- The present version can provide two types of fields:
+!
+!      1) CIDEAL = 'CSTN' : 3D fields derived  from a vertical profile with
+!         ---------------   n levels of constant moist Brunt Vaisala frequency
+!             The vertical profile is read in EXPRE file.                 
+!             These fields can be used for model runs 
+!
+!      2) CIDEAL = 'RSOU' : 3D fields derived from a radiosounding.
+!          --------------- 
+!             The radiosounding is read in EXPRE file. 
+!             The following kind of data  is permitted :
+!                  YKIND = 'STANDARD'  :   Zsol, Psol, Tsol, TDsol
+!                                         (Pressure, dd, ff) , 
+!                                         (Pressure, T, Td)
+!                  YKIND = 'PUVTHVMR'  : zsol, Psol, Thvsol, Rsol
+!                                        (Pressure, U, V) , 
+!                                        (Pressure, THv, R)
+!                  YKIND = 'PUVTHVHU'  :  zsol, Psol, Thvsol, Husol
+!                                         (Pressure, U, V) , 
+!                                         (Pressure, THv, Hu)
+!                  YKIND = 'ZUVTHVHU'  :  zsol, Psol, Thvsol, Husol
+!                                         (height, U, V) , 
+!                                         (height, THv, Hu)
+!                  YKIND = 'ZUVTHVMR'  :  zsol, Psol, Thvsol, Rsol
+!                                         (height, U, V) , 
+!                                         (height, THv, R)
+!                  YKIND = 'PUVTHDMR'  : zsol, Psol, Thdsol, Rsol
+!                                         (Pressure, U, V) , 
+!                                         (Pressure, THd, R)
+!                  YKIND = 'PUVTHDHU'  : zsol, Psol, Thdsol, Husol
+!                                         (Pressure, U, V) , 
+!                                         (Pressure, THd, Hu)
+!                  YKIND = 'ZUVTHDMR'  :  zsol, Psol, Thdsol, Rsol
+!                                         (height, U, V) , 
+!                                         (height, THd, R)
+!                  YKIND = 'ZUVTHLMR'  :  zsol, Psol, Thdsol, Rsol
+!                                         (height, U, V) , 
+!                                         (height, THl, Rt)
+!
+!             These fields can be used for model runs 
+!
+!      Cases (1) and (2) can be balanced
+!      (geostrophic, hydrostatic  and anelastic balances) if desired.
+!
+!      ---- The orography can be flat (YZS='FLAT'), but also 
+!      sine-shaped (YZS='SINE') or  bell-shaped (YZS='BELL')
+!
+!      ---- The U(z)  profile given in the RSOU and CSTN cases can
+!      be multiplied (CUFUN="Y*Z") by a function of y (function FUNUY)  
+!      The V(z) profile  given in the RSOU and CSTN cases can
+!      be multiplied (CVFUN="X*Z") by a function of x (function FUNVX). 
+!      If it is not the case, i.e. U(y,z)=U(z) then CUFUN="ZZZ" and 
+!      CVFUN="ZZZ" for V(y,z)=V(z). Instead of these separable forms,
+!      non-separables functions FUNUYZ (CUFUN="Y,Z")  and FUNVXZ (CVFUN="X,Z") 
+!      can be used to specify the wind components.
+!
+!!**  METHOD
+!!    ------
+!!      The directives and data to perform the preparation of the initial FM
+!!    file are stored in EXPRE file. This file is composed  of two parts : 
+!!          - a namelists-format  part which is present in all cases
+!!          - a free-format  part which contains data in cases 
+!!       of discretised orography (CZS='DATA')
+!!       of radiosounding (CIDEAL='RSOU') or Nv=cste  profile (CIDEAL='CSTN')
+!!       of forced version (LFORCING=.TRUE.)
+!!    
+!!
+!!      The following  PREP_IDEAL_CASE program  :
+!!
+!!             - initializes physical constants by calling INI_CST 
+!!
+!!             - sets default values for global variables which will be 
+!!     written  in DESFM file and for variables in EXPRE file (namelists part)
+!!     which will be written in LFIFM file.    
+!!
+!!             - reads the namelists part of EXPRE file which gives 
+!!     informations about the preinitialization to perform,
+!!
+!!             - allocates memory for arrays, 
+!!
+!!             - initializes fields depending on the 
+!!              directives  (CIDEAL in namelist NAM_CONF_PRE) :
+!!  
+!!                * grid variables : 
+!!                  The gridpoints are regularly spaced by XDELTAX, XDELTAY.
+!!               The grid is stretched along the z direction, the mesh varies 
+!!               from XDZGRD near the ground to XDZTOP near the top and the 
+!!               weigthing function is a TANH function characterized by its 
+!!               center and width above and under this center
+!!                  The orography is initialized following the kind of orography
+!!               (YZS in namelist NAM_CONF_PRE) and the degrees of freedom :
+!!                     sine-shape ---> ZHMAX, IEXPX,IEXPY
+!!                     bell-shape ---> ZHMAX, ZAX,ZAY,IIZS,IJZS
+!!                  The horizontal grid variables are initialized following
+!!                the kind of geometry (LCARTESIAN in namelist NAM_CONF_PRE) 
+!!                and the grid parameters XLAT0,XLON0,XBETA in both geometries
+!!                and XRPK,XLONORI,XLATORI  in conformal projection.
+!!                  In the  case of initialization from a radiosounding, the
+!!                date and time is read in free-part of the EXPRE file. In other
+!!                cases year, month and day are set to NUNDEF and time to 0.
+!!
+!!               * prognostic fields : 
+!!
+!!                     U,V,W, Theta and r. are first determined. They are
+!!                multiplied by rhoj after the anelastic reference state 
+!!                computation.
+!!                     For the CSTN and RSOU cases, the determination of 
+!!                Theta and rv is performed  respectively by SET_RSOU
+!!                and by SET_CSTN which call the common routine SET_MASS. 
+!!                These three routines have  the following actions :
+!!          ---   The input vertical profile   is converted in 
+!!                variables (U,V,thetav,r) and  interpolated
+!!                on a mixed grid (with VERT_COORD) as in PREP_REAL_CASE 
+!!          ---   A variation of the u-wind component( x-model axis component) 
+!!                 is possible in y direction, a variation of the v-wind component 
+!!                (y-model axis component) is possible in x direction.
+!!          ---   Thetav could be computed with thermal wind balance
+!!                (LGEOSBAL=.TRUE. with call of SET_GEOSBAL)                 
+!!          ---   The mass fields (theta and r ) and the wind components are 
+!!                then interpolated on the model grid with orography  as in
+!!                PREP_REAL_CASE with the option LSHIFT                
+!!          ---   An  anelastic correction is  applied in PRESSURE_IN_PREP in
+!!                the case of non-vanishing orography.    
+!!            
+!!               * anelastic reference state variables :
+!!
+!!                   1D reference state : 
+!!                     RSOU and CSTN cases : rhorefz and thvrefz are computed 
+!!                         by   SET_REFZ (called by SET_MASS).
+!!                         They are deduced from thetav and r on the model grid
+!!                         without orography.
+!!                   The 3D reference state is  computed by SET_REF   
+!!            
+!!               * The total mass of dry air is computed by TOTAL_DMASS              
+!!
+!!             - writes the DESFM file, 
+!!
+!!             - writes the LFIFM file . 
+!!
+!!    EXTERNAL
+!!    --------
+!!      DEFAULT_DESFM : to set default values for variables which can be 
+!!                      contained in DESFM file
+!!      DEFAULT_EXPRE : to  set default values for other global variables 
+!!                      which can be contained in namelist-part of EXPRE file
+!!      Module MODE_GRIDPROJ : contains conformal projection routines
+!!           SM_GRIDPROJ   : to compute some grid variables, in
+!!                           case of conformal projection.
+!!      Module MODE_GRIDCART : contains cartesian geometry routines
+!!           SM_GRIDCART   : to compute some grid variables, in
+!!                           case of cartesian geometry.
+!!      SET_RSOU      : to initialize mass fields from a radiosounding
+!!      SET_CSTN      : to initialize mass fields from a vertical profile of 
+!!                      n layers of Nv=cste 
+!!      SET_REF       : to compute  rhoJ 
+!!      RESSURE_IN_PREP : to apply an anelastic correction in the case of
+!!                        non-vanishing orography 
+!!      IO_File_open : to open a FM-file (DESFM + LFIFM)
+!!      WRITE_DESFM   : to write the  DESFM file
+!!      WRI_LFIFM     : to write the   LFIFM file  
+!!      IO_File_close : to close a FM-file (DESFM + LFIFM)
+!!
+!!      MXM,MYM,MZM   : Shuman operators
+!!      WGUESS        : to compute W with the continuity equation from 
+!!                      the U,V values 
+!!
+!!
+!!      
+!!    IMPLICIT ARGUMENTS
+!!    ------------------
+!!      Module MODD_PARAMETERS : contains parameters
+!!      Module MODD_DIM1      : contains dimensions 
+!!      Module MODD_CONF       : contains  configuration variables for 
+!!                                all models
+!!      Module MODD_CST        : contains physical constants
+!!      Module MODD_GRID       : contains grid variables  for all models
+!!      Module MODD_GRID1     : contains grid variables
+!!      Module MODD_TIME      : contains time variables for all models  
+!!      Module MODD_TIME1     : contains time variables  
+!!      Module MODD_REF        : contains reference state variables for
+!!                               all models
+!!      Module MODD_REF1      : contains reference state variables 
+!!      Module MODD_LUNIT      : contains variables which concern names
+!!                            and logical unit numbers of files  for all models
+!!      Module MODD_FIELD1    : contains prognostics  variables
+!!      Module MODD_GR_FIELD1 : contains the surface prognostic variables 
+!!      Module MODD_LSFIELD1    : contains Larger Scale fields
+!!      Module MODD_DYN1        : contains dynamic control variables for model 1
+!!      Module MODD_LBC1        : contains lbc control variables for model 1
+!!
+!!
+!!      Module MODN_CONF1    : contains  configuration variables for model 1
+!!                               and the NAMELIST list
+!!      Module MODN_LUNIT1    : contains variables which concern names
+!!                               and logical unit numbers of files and 
+!!                               the NAMELIST list
+!!
+!!
+!!    REFERENCE
+!!    ---------
+!!      Book2 of MESO-NH documentation (program PREP_IDEAL_CASE)
+!!    
+!!    AUTHOR
+!!    ------
+!!	V. Ducrocq   *Meteo France*
+!!
+!!    MODIFICATIONS
+!!    -------------
+!!      Original                            05/05/94
+!!      updated                V. Ducrocq   27/06/94   
+!!      updated                P.M.         27/07/94
+!!      updated                V. Ducrocq   23/08/94 
+!!      updated                V. Ducrocq   01/09/94 
+!!      namelist changes       J. Stein     26/10/94 
+!!      namelist changes       J. Stein     04/11/94 
+!!      remove the second step of the geostrophic balance 14/11/94 (J.Stein)
+!!      add grid stretching in the z direction + Larger scale fields +
+!!      cleaning                                           6/12/94 (J.Stein) 
+!!      periodize the orography and the grid sizes in the periodic case
+!!                                                        19/12/94 (J.Stein) 
+!!      correct a bug in the Larger Scale Fields initialization
+!!                                                        19/12/94 (J.Stein) 
+!!      add the vertical grid stretching                  02/01/95 (J. Stein)
+!!      Total mass of dry air computation                 02/01/95 (J.P.Lafore) 
+!!      add the 1D switch                                 13/01/95 (J. Stein)
+!!      enforce a regular vertical grid if desired        18/01/95 (J. Stein)
+!!      add the tdtcur initialization                     26/01/95 (J. Stein)
+!!      bug in the test of the type of RS localization    25/02/95 (J. Stein)
+!!      remove R from the historical variables            16/03/95 (J. Stein)
+!!      error on the grid stretching                      30/06/95 (J. Stein)
+!!      add the soil fields                               01/09/95 (S.Belair)
+!!      change the streching function  and the wind guess
+!!        (J. Stein and V.Masson)                         21/09/95 
+!!      reset to FALSE LUSERC,..,LUSERH                   12/12/95 (J. Stein)
+!!      enforce the RS localization in 1D and 2D config.
+!!      + add the 'TSZ0' option for the soil variables    28/01/96 (J. Stein)
+!!      initialization of domain from center point        31/01/96 (V. Masson)
+!!      add the constant file reading                     05/02/96 (J. Stein)
+!!      enter vertical model levels values                20/10/95 (T.Montmerle)
+!!      add LFORCING option                               19/02/96 (K. Suhre)
+!!      modify structure of NAM_CONF_PRE                  20/02/96 (J.-P. Pinty)
+!!      default of the domain center when use of pgd file 12/03/96 (V. Masson)
+!!      change the surface initialization                 20/03/96 ( Stein,
+!!                                                    Bougeault, Kastendeutsch )
+!!      change the DEFAULT_DESFMN CALL                    17/04/96 ( Lafore )
+!!      set the STORAGE_TYPE to 'TT' (a single instant)   30/04/96 (Stein, 
+!!                                                    Jabouille)
+!!      new wguess to spread  the divergence              15/05/96 (Stein)
+!!      set LTHINSHELL to TRUE + return to the old wguess 29/08/96 (Stein)
+!!      MY_NAME and DAD_NAME writing for nesting          30/07/96 (Lafore)
+!!      MY_NAME and DAD_NAME reading in pgd file          26/09/96 (Masson)
+!!       and reading of pgd grid in a new routine
+!!      XXHAT and XYHAT are set to 0. at origine point    02/10/96 (Masson)
+!!      add LTHINSHELL in namelist NAM_CONF_PRE           08/10/96 (Masson)
+!!      restores use of TS and T2                         26/11/96 (Masson)
+!!      value  XUNDEF for soil and vegetation fields on sea 27/11/96 (Masson)
+!!      use of HUG and HU2 in both ISBA and TSZ0 cases    04/12/96 (Masson)
+!!      add initialization of chemical variables          06/08/96 (K. Suhre)
+!!      add MANUAL option for the terrain elevation       12/12/96 (J.-P. Pinty)
+!!      set DATA instead of MANUAL for the terrain
+!!      elevation option
+!!      add new anelastic equations' systems              29/06/97 (Stein)
+!!      split mode_lfifm_pgd                              29/07/97 (Masson)
+!!      add directional z0 and subgrid scale orography    31/07/97 (Masson)
+!!      separates surface treatment in PREP_IDEAL_SURF    15/03/99 (Masson)
+!!      new PGD fields allocations                        15/03/99 (Masson)
+!!      iterative call to pressure solver                 15/03/99 (Masson)
+!!      removes TSZ0 case                                 04/01/00 (Masson)
+!!      parallelization                                   18/06/00 (Pinty)
+!!      adaptation for patch approach                     02/07/00 (Solmon/Masson)
+!!      bug in W LB field on Y direction                  05/03/01 (Stein)
+!!      add module MODD_NSV for NSV variable              01/02/01 (D. Gazen) 
+!!      allow namelists in different orders               15/10/01 (I. Mallet)
+!!      allow LUSERC and LUSERI in 1D configuration       05/06/02 (P. Jabouille)
+!!      add  ZUVTHLMR case (move in set_rsou latter)      05/12/02 Jabouille/Masson
+!!      move LHORELAX_SV (after INI_NSV)                  30/04/04 (Pinty)
+!!      Correction Parallel bug IBEG & IDEND  evalution   13/11/08 J.Escobar
+!!      add the option LSHIFT for interpolation of        26/10/10 (G.Tanguy)
+!!      correction for XHAT & parallelizarion of ZSDATA   23/09/11 J.Escobar
+!!      the vertical profile (as in PREP_REAL_CASE)
+!!      add use MODI of SURFEX routines                   10/10/111 J.Escobar
+!!
+!!      For 2D modeling: 
+!!      Initialization of ADVFRC profiles (SET_ADVFRC)    06/2010 (P.Peyrille)
+!!      when LDUMMY(2)=T in PRE_IDEA1.nam 
+!!      USE MODDB_ADVFRC_n for grid-nesting               02*2012 (M. Tomasini)
+!!      LBOUSS in MODD_REF                                07/2013 (C.Lac)
+!!      Correction for ZS in PGD file                     04/2014 (G. TANGUY)
+!!      Bug : remove NC WRITE_HGRID                       05/2014 (S. Bielli via J.Escobar )
+!!      BUG if ZFRC and ZFRC_ADV or ZFRC_REL are used together  11/2014 (G. Delautier)
+!!      Bug : detected with cray compiler ,
+!!                  missing '&' in continuation string  3/12/2014 J.Escobar
+!!      J.Escobar : 15/09/2015 : WENO5 & JPHEXT <> 1 
+!!  06/2016     (G.Delautier) phasage surfex 8
+!!      P.Wautelet : 08/07/2016 : removed MNH_NCWRIT define
+!!  01/2018      (G.Delautier) SURFEX 8.1
+!  P. Wautelet: 05/2016-04/2018: new data structures and calls for I/O
+!  P. Wautelet 07/02/2019: force TYPE to a known value for IO_File_add2list
+!  P. Wautelet 14/02/2019: remove CLUOUT/CLUOUT0 and associated variables
+!  P. Wautelet 28/03/2019: use MNHTIME for time measurement variables
+!  P. Wautelet 28/03/2019: use TFILE instead of unit number for set_iluout_timing
+!  P. Wautelet 19/04/2019: removed unused dummy arguments and variables
+!  P. Wautelet 26/04/2019: replace non-standard FLOAT function by REAL function
+!  P. Wautelet 20/05/2019: add name argument to ADDnFIELD_ll + new ADD4DFIELD_ll subroutine
+!  F. Auguste     02/2021: add IBM
+!  P. Wautelet 09/03/2021: move some chemistry initializations to ini_nsv
+!  Jean-Luc Redelsperger 03/2021: ocean LES case
+!  P. Wautelet 06/07/2021: use FINALIZE_MNH
+!-------------------------------------------------------------------------------
+!
+!*       0.   DECLARATIONS
+!             ------------
+!
+USE MODD_PARAMETERS       ! Declarative modules
+USE MODD_ARGSLIST_ll, ONLY : LIST_ll
+USE MODD_BUDGET,           ONLY: TBUCONF_ASSOCIATE
+USE MODD_DIM_n
+USE MODD_CONF
+USE MODD_CST
+USE MODD_GRID
+USE MODD_GRID_n
+USE MODD_IBM_LSF,     ONLY: CIBM_TYPE, LIBM_LSF, NIBM_SMOOTH, XIBM_SMOOTH
+USE MODD_IBM_PARAM_n, ONLY: XIBM_LS
+USE MODD_METRICS_n
+USE MODD_LES, ONLY : LES_ASSOCIATE
+USE MODD_PGDDIM
+USE MODD_PGDGRID
+USE MODD_TIME
+USE MODD_TIME_n
+USE MODD_REF
+USE MODD_REF_n
+USE MODD_LUNIT
+USE MODD_FIELD_n
+USE MODD_DYN_n
+USE MODD_LBC_n
+USE MODD_LSFIELD_n
+USE MODD_PARAM_n
+USE MODD_CH_MNHC_n,        ONLY:  LUSECHEM, LUSECHAQ, LUSECHIC, LCH_PH, LCH_INIT_FIELD
+USE MODD_CH_AEROSOL,ONLY:  LORILAM, CORGANIC, LVARSIGI, LVARSIGJ, LINITPM, XINIRADIUSI, &
+                           XINIRADIUSJ, XINISIGI, XINISIGJ, XN0IMIN, XN0JMIN, CRGUNIT
+USE MODD_DUST,      ONLY:  LDUST, NMODE_DST, CRGUNITD, XINISIG, XINIRADIUS, XN0MIN 
+USE MODD_SALT,      ONLY:  LSALT, NMODE_SLT, CRGUNITS, XINISIG_SLT, XINIRADIUS_SLT, XN0MIN_SLT
+USE MODD_VAR_ll,    ONLY:  NPROC
+USE MODD_LUNIT,     ONLY:  TLUOUT0, TOUTDATAFILE
+USE MODD_LUNIT_n
+USE MODD_IO,        ONLY: TFILE_DUMMY, TFILE_OUTPUTLISTING
+USE MODD_CONF_n
+USE MODD_NSV,       ONLY: NSV, NSV_ASSOCIATE
+use modd_precision, only: LFIINT, MNHREAL_MPI, MNHTIME
+!
+USE MODN_BLANK_n
+!
+USE MODE_FINALIZE_MNH,     only: FINALIZE_MNH
+USE MODE_THERMO
+USE MODE_POS
+USE MODE_GRIDCART         ! Executive modules
+USE MODE_GRIDPROJ
+USE MODE_GATHER_ll
+USE MODE_IO,               only: IO_Config_set, IO_Init, IO_Pack_set
+USE MODE_IO_FIELD_READ,    only: IO_Field_read
+USE MODE_IO_FIELD_WRITE,   only: IO_Field_write, IO_Header_write
+USE MODE_IO_FILE,          only: IO_File_close, IO_File_open
+USE MODE_IO_MANAGE_STRUCT, only: IO_File_add2list
+USE MODE_ll
+USE MODE_MODELN_HANDLER
+use mode_field,            only: Alloc_field_scalars, Ini_field_list, Ini_field_scalars
+USE MODE_MSG
+USE MODE_SET_GRID,         only: INTERP_HORGRID_TO_MASSPOINTS, STORE_GLOB_HORGRID
+!
+USE MODI_DEFAULT_DESFM_n    ! Interface modules
+USE MODI_DEFAULT_EXPRE
+USE MODI_IBM_INIT_LS
+USE MODI_READ_HGRID
+USE MODI_SHUMAN
+USE MODI_SET_RSOU
+USE MODI_SET_CSTN
+USE MODI_SET_FRC
+USE MODI_PRESSURE_IN_PREP
+USE MODI_WRITE_DESFM_n
+USE MODI_WRITE_LFIFM_n
+USE MODI_METRICS
+USE MODI_UPDATE_METRICS
+USE MODI_SET_REF
+USE MODI_SET_PERTURB
+USE MODI_TOTAL_DMASS
+USE MODI_CH_INIT_FIELD_n
+USE MODI_INI_NSV
+USE MODI_READ_PRE_IDEA_NAM_n
+USE MODI_ZSMT_PIC
+USE MODI_ZSMT_PGD
+USE MODI_READ_VER_GRID
+USE MODI_READ_ALL_NAMELISTS
+USE MODI_PGD_GRID_SURF_ATM
+USE MODI_SPLIT_GRID
+USE MODI_PGD_SURF_ATM
+USE MODI_ICE_ADJUST_BIS
+USE MODI_WRITE_PGD_SURF_ATM_n
+USE MODI_PREP_SURF_MNH
+USE MODI_INIT_SALT
+USE MODI_AER2LIMA
+USE MODD_PARAM_LIMA
+!
+!JUAN
+USE MODE_SPLITTINGZ_ll
+USE MODD_SUB_MODEL_n
+USE MODE_MNH_TIMING
+USE MODN_CONFZ
+!JUAN
+!
+USE MODI_VERSION
+USE MODI_INIT_PGD_SURF_ATM
+USE MODI_WRITE_SURF_ATM_N
+USE MODD_MNH_SURFEX_n
+! Modif ADVFRC
+USE MODD_2D_FRC
+USE MODD_ADVFRC_n     ! Modif for grid-nesting
+USE MODI_SETADVFRC
+USE MODD_RELFRC_n     ! Modif for grid-nesting
+USE MODI_SET_RELFRC
+!
+USE MODE_INI_CST, ONLY: INI_CST
+USE MODD_NEB_n, ONLY: NEBN
+USE MODI_WRITE_HGRID
+USE MODD_MPIF
+USE MODD_VAR_ll
+USE MODD_IO, ONLY: TFILEDATA,TFILE_SURFEX
+!
+USE MODE_MPPDB
+!
+USE MODD_GET_n
+!
+USE MODN_CONFIO, ONLY : NAM_CONFIO
+!
+IMPLICIT NONE
+!
+!*       0.1  Declarations of global variables not declared in the modules
+!
+REAL, DIMENSION(:,:,:), ALLOCATABLE :: XJ ! Jacobian
+REAL :: XLATCEN=XUNDEF, XLONCEN=XUNDEF ! latitude and longitude of the center of
+                                     ! the domain for initialization. This 
+                                     ! point is vertical vorticity point
+                                     !          ------------------------
+REAL :: XDELTAX=0.5E4, XDELTAY=0.5E4 ! horizontal mesh lengths  
+                                     !  used to determine  XXHAT,XYHAT
+!
+INTEGER :: NLUPRE,NLUOUT           ! Logical unit numbers for EXPRE file
+                                   ! and for output_listing file
+INTEGER :: NRESP                   ! return code in FM routines
+INTEGER :: NTYPE                   ! type of file (cpio or not)
+INTEGER(KIND=LFIINT) :: NNPRAR     ! number of articles predicted in the LFIFM file
+LOGICAL :: GFOUND                  ! Return code when searching namelist
+!
+INTEGER :: JLOOP,JILOOP,JJLOOP     ! Loop indexes
+!
+INTEGER :: NIB,NJB,NKB             ! Begining useful area  in x,y,z directions
+INTEGER :: NIE,NJE                 ! Ending useful area  in x,y directions
+INTEGER :: NIU,NJU,NKU             ! Upper bounds in x,y,z directions
+CHARACTER(LEN=4)   :: CIDEAL ='CSTN'     ! kind of idealized fields
+                                         ! 'CSTN' : Nv=cste case 
+                                         ! 'RSOU' : radiosounding case
+CHARACTER(LEN=4)   :: CZS    ='FLAT'     ! orography selector
+                                         ! 'FLAT' : zero orography
+                                         ! 'SINE' : sine-shaped orography 
+                                         ! 'BELL' : bell-shaped orography 
+REAL    :: XHMAX=XUNDEF            ! Maximum height for orography
+REAL    :: NEXPX=3,NEXPY=1         ! Exponents for  orography in case of CZS='SINE'
+REAL    :: XAX= 1.E4, XAY=1.E4     ! Widths for orography in case CZS='BELL'
+                                   ! along x and y 
+INTEGER :: NIZS = 5, NJZS = 5      ! Localization of the center in 
+                                   ! case CZS ='BELL' 
+!
+!*       0.1.1 Declarations of local variables for N=cste and 
+!              radiosounding cases :
+!
+INTEGER            :: NYEAR,NMONTH,NDAY ! year, month and day in EXPRE file
+REAL               :: XTIME             ! time in EXPRE file
+LOGICAL            :: LPERTURB =.FALSE. ! Logical to add a perturbation to 
+                                        ! a basic state 
+LOGICAL            :: LGEOSBAL =.FALSE. ! Logical to satisfy the geostrophic
+                                        ! balance
+                                        ! .TRUE. for geostrophic balance
+                                        ! .FALSE. to ignore this balance
+LOGICAL            :: LSHIFT   =.FALSE.  ! flag to perform vertical shift or not.        
+CHARACTER(LEN=3)   :: CFUNU ='ZZZ'      ! CHARACTER STRING for variation of
+                                        ! U in y direction
+                                        ! 'ZZZ'  : U = U(Z)
+                                        ! 'Y*Z'  : U = F(Y) * U(Z)
+                                        ! 'Y,Z'  : U = G(Y,Z)
+CHARACTER(LEN=3)   :: CFUNV ='ZZZ'      ! CHARACTER STRING for variation of
+                                        ! V in x direction
+                                        ! 'ZZZ'  : V = V(Z)
+                                        ! 'Y*Z'  : V = F(X) * V(Z)
+                                        ! 'Y,Z'  : V = G(X,Z)
+CHARACTER(LEN=6)   :: CTYPELOC='IJGRID' ! Type of informations  used to give the
+                                        ! localization of vertical profile
+                                        ! 'IJGRID'  for (i,j) point  on index space
+                                        ! 'XYHATM' for (x,y) coordinates on
+                                        !  conformal or cartesian plane
+                                        ! 'LATLON' for (latitude,longitude) on
+                                        !   spherical earth  
+REAL               :: XLATLOC= 45., XLONLOC=0.
+                                        ! Latitude and longitude of the vertical
+                                        ! profile localization  (used in case 
+                                        ! CTYPELOC='LATLON') 
+REAL               :: XXHATLOC=2.E4, XYHATLOC=2.E4 
+                                        ! (x,y) of the vertical profile
+                                        ! localization  (used in cases 
+                                        ! CTYPELOC='LATLON' and 'XYHATM') 
+INTEGER, DIMENSION(1) :: NILOC=4, NJLOC=4 
+                                        ! (i,j) of the vertical profile
+                                        ! localization 
+!
+!
+REAL,DIMENSION(:,:,:),ALLOCATABLE   :: XCORIOZ ! Coriolis parameter (this
+                                                 ! is exceptionnaly a 3D array
+                                                 ! for computing needs)
+!
+!
+!*       0.1.2 Declarations of local variables used when a PhysioGraphic Data
+!              file is used :
+!
+INTEGER             :: JSV                      ! loop index on scalar var.
+CHARACTER(LEN=28)   :: CPGD_FILE=' '            ! Physio-Graphic Data file name
+LOGICAL  :: LREAD_ZS = .TRUE.,                & ! switch to use orography 
+                                                ! coming from the PGD file
+            LREAD_GROUND_PARAM = .TRUE.         ! switch to use soil parameters
+                                                ! useful for the soil scheme
+                                                ! coming from the PGD file
+
+INTEGER           :: NSLEVE   =12         ! number of iteration for smooth orography
+REAL              :: XSMOOTH_ZS = XUNDEF  ! optional uniform smooth orography for SLEVE coordinate
+CHARACTER(LEN=28) :: YPGD_NAME, YPGD_DAD_NAME   ! general information
+CHARACTER(LEN=2)  :: YPGD_TYPE
+!
+INTEGER           :: IINFO_ll                   ! return code of // routines
+TYPE(LIST_ll), POINTER :: TZ_FIELDS_ll           ! list of metric coefficient fields
+!
+INTEGER :: IISIZEXF,IJSIZEXF,IISIZEXFU,IJSIZEXFU     ! dimensions of the
+INTEGER :: IISIZEX4,IJSIZEX4,IISIZEX2,IJSIZEX2       ! West-east LB arrays
+INTEGER :: IISIZEYF,IJSIZEYF,IISIZEYFV,IJSIZEYFV     ! dimensions of the
+INTEGER :: IISIZEY4,IJSIZEY4,IISIZEY2,IJSIZEY2       ! North-south LB arrays
+INTEGER :: IBEG,IEND,IXOR,IXDIM,IYOR,IYDIM,ILBX,ILBY
+!
+REAL, DIMENSION(:,:,:), ALLOCATABLE ::ZTHL,ZT,ZRT,ZFRAC_ICE,&
+                                      ZEXN,ZLVOCPEXN,ZLSOCPEXN,ZCPH, &
+                                      ZRSATW, ZRSATI
+REAL, DIMENSION(:,:,:,:), ALLOCATABLE :: ZBUF
+                                 ! variables for adjustement
+REAL                :: ZDIST
+!
+!JUAN TIMING
+REAL(kind=MNHTIME), DIMENSION(2) :: ZTIME1, ZTIME2, ZEND, ZTOT
+CHARACTER                 :: YMI
+INTEGER                   :: IMI
+!JUAN TIMING
+!
+REAL, DIMENSION(:),   ALLOCATABLE :: ZZS_ll
+INTEGER                           :: IJ
+!
+REAL              :: ZZS_MAX, ZZS_MAX_ll
+INTEGER           :: IJPHEXT
+!
+TYPE(TFILEDATA),POINTER :: TZEXPREFILE  => NULL()
+!
+!
+!*       0.2  Namelist declarations
+!
+NAMELIST/NAM_CONF_PRE/ LTHINSHELL,LCARTESIAN,    &! Declarations in MODD_CONF
+                       LPACK,                    &!
+                       NVERB,CIDEAL,CZS,         &!+global variables initialized
+                       LBOUSS,LOCEAN,LPERTURB,   &! at their declarations
+                       LFORCING,CEQNSYS,         &! at their declarations
+                       LSHIFT,L2D_ADV_FRC,L2D_REL_FRC, &
+                       NHALO , JPHEXT
+NAMELIST/NAM_GRID_PRE/ XLON0,XLAT0,            & ! Declarations in MODD_GRID
+                       XBETA,XRPK,             & 
+                       XLONORI,XLATORI
+NAMELIST/NAM_GRIDH_PRE/ XLATCEN,XLONCEN,       & ! local variables  initialized
+                 XDELTAX,XDELTAY,              & ! at their declarations
+                 XHMAX,NEXPX,NEXPY,            &
+                 XAX,XAY,NIZS,NJZS
+NAMELIST/NAM_VPROF_PRE/LGEOSBAL, CFUNU,CFUNV,   &! global variables initialized
+                     CTYPELOC,XLATLOC,XLONLOC,  &!  at their declarations
+                     XXHATLOC,XYHATLOC,NILOC,NJLOC
+NAMELIST/NAM_REAL_PGD/CPGD_FILE,                 & ! Physio-Graphic Data file
+                                                   !  name
+                      LREAD_ZS,                  & ! switch to use orography 
+                                                   ! coming from the PGD file
+                      LREAD_GROUND_PARAM
+NAMELIST/NAM_SLEVE/NSLEVE, XSMOOTH_ZS
+!
+!*       0.3  Auxillary Namelist declarations
+!
+NAMELIST/NAM_AERO_PRE/ LORILAM, LINITPM, XINIRADIUSI, XINIRADIUSJ, &
+                       XINISIGI, XINISIGJ, XN0IMIN, XN0JMIN, CRGUNIT, &
+                       LDUST, LSALT, CRGUNITD, CRGUNITS,&
+                       NMODE_DST, XINISIG, XINIRADIUS, XN0MIN,&
+                       XINISIG_SLT, XINIRADIUS_SLT, XN0MIN_SLT, &
+                       NMODE_SLT
+!
+NAMELIST/NAM_IBM_LSF/ LIBM_LSF, CIBM_TYPE, NIBM_SMOOTH, XIBM_SMOOTH
+!
+!-------------------------------------------------------------------------------
+!
+!*       0.    PROLOGUE
+!              --------
+CALL MPPDB_INIT()
+!
+CALL GOTO_MODEL(1)
+!
+CALL IO_Init()
+NULLIFY(TZ_FIELDS_ll)
+CALL VERSION
+CPROGRAM='IDEAL '
+!
+!JUAN TIMING
+  XT_START     = 0.0_MNHTIME
+  XT_STORE     = 0.0_MNHTIME
+!
+  CALL SECOND_MNH2(ZEND)
+!
+!JUAN TIMING
+!
+!*       1.    INITIALIZE PHYSICAL CONSTANTS :         
+!              ------------------------------
+!
+NVERB = 5
+CALL INI_CST
+!
+!-------------------------------------------------------------------------------
+!
+!
+!*  	 2.    SET DEFAULT VALUES  :  
+!              --------------------
+!
+!
+!*       2.1  For variables in DESFM file
+!
+CALL ALLOC_FIELD_SCALARS()
+CALL TBUCONF_ASSOCIATE()
+CALL LES_ASSOCIATE()
+CALL DEFAULT_DESFM_n(1)
+CALL NSV_ASSOCIATE()
+!
+CSURF = "NONE"
+!
+!
+!*       2.2  For other global variables in EXPRE file
+!
+CALL DEFAULT_EXPRE
+!-------------------------------------------------------------------------------
+!
+!*  	 3.    READ THE EXPRE FILE :  
+!              --------------------
+!
+!*       3.1   initialize logical unit numbers (EXPRE and output-listing files)
+!              and open these files :
+! 
+! 
+CALL IO_File_add2list(TLUOUT0,'OUTPUT_LISTING1','OUTPUTLISTING','WRITE')
+CALL IO_File_open(TLUOUT0)
+NLUOUT = TLUOUT0%NLU
+!Set output files for PRINT_MSG
+TLUOUT              => TLUOUT0
+TFILE_OUTPUTLISTING => TLUOUT0
+!
+CALL IO_File_add2list(TZEXPREFILE,'PRE_IDEA1.nam','NML','READ')
+CALL IO_File_open(TZEXPREFILE)
+NLUPRE=TZEXPREFILE%NLU
+!
+!*       3.2   read in NLUPRE the namelist informations
+!
+WRITE(NLUOUT,FMT=*) 'attempt to read ',TRIM(TZEXPREFILE%CNAME),' file'
+CALL POSNAM( TZEXPREFILE, 'NAM_REAL_PGD', GFOUND )
+IF (GFOUND) READ(UNIT=NLUPRE,NML=NAM_REAL_PGD)
+!
+!
+CALL POSNAM( TZEXPREFILE, 'NAM_CONF_PRE', GFOUND )
+IF (GFOUND) READ(UNIT=NLUPRE,NML=NAM_CONF_PRE)
+!JUANZ
+CALL POSNAM( TZEXPREFILE, 'NAM_CONFZ', GFOUND )
+IF (GFOUND) READ(UNIT=NLUPRE,NML=NAM_CONFZ)
+!JUANZ
+CALL POSNAM( TZEXPREFILE, 'NAM_CONFIO', GFOUND )
+IF (GFOUND) READ(UNIT=NLUPRE,NML=NAM_CONFIO)
+CALL IO_Config_set()
+CALL POSNAM( TZEXPREFILE, 'NAM_GRID_PRE', GFOUND )
+IF (GFOUND) READ(UNIT=NLUPRE,NML=NAM_GRID_PRE)
+CALL POSNAM( TZEXPREFILE, 'NAM_GRIDH_PRE', GFOUND )
+IF (GFOUND) READ(UNIT=NLUPRE,NML=NAM_GRIDH_PRE)
+CALL POSNAM( TZEXPREFILE, 'NAM_VPROF_PRE', GFOUND )
+IF (GFOUND) READ(UNIT=NLUPRE,NML=NAM_VPROF_PRE)
+CALL POSNAM( TZEXPREFILE, 'NAM_BLANKN', GFOUND )
+CALL INIT_NAM_BLANKn
+IF (GFOUND) THEN
+  READ(UNIT=NLUPRE,NML=NAM_BLANKn)
+  CALL UPDATE_NAM_BLANKn
+END IF
+CALL READ_PRE_IDEA_NAM_n( TZEXPREFILE )
+CALL POSNAM( TZEXPREFILE, 'NAM_AERO_PRE', GFOUND )
+IF (GFOUND) READ(UNIT=NLUPRE,NML=NAM_AERO_PRE)
+CALL POSNAM( TZEXPREFILE, 'NAM_IBM_LSF', GFOUND )
+IF (GFOUND) READ(UNIT=NLUPRE,NML=NAM_IBM_LSF )
+!
+CALL INI_FIELD_LIST()
+!
+CALL INI_FIELD_SCALARS()
+! Sea salt
+CALL INIT_SALT
+!
+IF( LEN_TRIM(CPGD_FILE) /= 0 ) THEN 
+  ! open the PGD_FILE
+  CALL IO_File_add2list(TPGDFILE,TRIM(CPGD_FILE),'PGD','READ',KLFINPRAR=NNPRAR,KLFITYPE=2,KLFIVERB=NVERB)
+  CALL IO_File_open(TPGDFILE)
+
+  ! read the grid in the PGD file
+  CALL IO_Field_read(TPGDFILE,'IMAX',  NIMAX)
+  CALL IO_Field_read(TPGDFILE,'JMAX',  NJMAX)
+  CALL IO_Field_read(TPGDFILE,'JPHEXT',IJPHEXT)
+
+  IF ( CPGD_FILE /= CINIFILEPGD) THEN
+     WRITE(NLUOUT,FMT=*) ' WARNING : in PRE_IDEA1.nam, in NAM_LUNITn you&
+          & have CINIFILEPGD= ',CINIFILEPGD
+     WRITE(NLUOUT,FMT=*) ' whereas in NAM_REAL_PGD you have CPGD_FILE = '&
+          ,CPGD_FILE
+     WRITE(NLUOUT,FMT=*) ' '
+     WRITE(NLUOUT,FMT=*) ' CINIFILEPGD HAS BEEN SET TO  ',CPGD_FILE        
+     CINIFILEPGD=CPGD_FILE
+  END IF
+  IF ( IJPHEXT .NE. JPHEXT ) THEN
+     WRITE(NLUOUT,FMT=*) ' PREP_IDEAL_CASE : JPHEXT in PRE_IDEA1.nam/NAM_CONF_PRE ( or default value )&
+        & JPHEXT=',JPHEXT
+     WRITE(NLUOUT,FMT=*) ' different from PGD files=', CINIFILEPGD,' value JPHEXT=',IJPHEXT
+     WRITE(NLUOUT,FMT=*) '-> JOB ABORTED'
+     CALL PRINT_MSG(NVERB_FATAL,'GEN','PREP_IDEAL_CASE','')
+     !WRITE(NLUOUT,FMT=*) ' JPHEXT HAS BEEN SET TO ', IJPHEXT
+     !IJPHEXT = JPHEXT
+  END IF
+END IF
+!
+NIMAX_ll=NIMAX   !! _ll variables are global variables
+NJMAX_ll=NJMAX   !! but the old names are kept in PRE_IDEA1.nam file
+!
+!*       3.3   check some parameters:
+!
+L1D=.FALSE. ; L2D=.FALSE.
+!
+IF ((NIMAX == 1).OR.(NJMAX == 1)) THEN 
+  L2D=.TRUE.
+  NJMAX_ll=1
+  NIMAX_ll=MAX(NIMAX,NJMAX)
+  WRITE(NLUOUT,FMT=*) ' NJMAX HAS BEEN SET TO 1 SINCE 2D INITIAL FILE IS REQUIRED &
+                   & (L2D=TRUE) )' 
+END IF
+!
+IF ((NIMAX == 1).AND.(NJMAX == 1)) THEN 
+  L1D=.TRUE.
+  NIMAX_ll = 1
+  NJMAX_ll = 1
+  WRITE(NLUOUT,FMT=*) ' 1D INITIAL FILE IS REQUIRED (L1D=TRUE) ' 
+END IF
+!
+IF(.NOT. L1D) THEN
+  LHORELAX_UVWTH=.TRUE.
+  LHORELAX_RV=.TRUE.
+ENDIF
+!
+NRIMX= MIN(JPRIMMAX,NIMAX_ll/2)
+!
+IF (L2D) THEN
+  NRIMY=0
+ELSE
+  NRIMY= MIN(JPRIMMAX,NJMAX_ll/2)
+END IF
+!
+IF (L1D) THEN
+  NRIMX=0
+  NRIMY=0
+END IF
+!
+IF (L1D .AND. ( LPERTURB .OR. LGEOSBAL .OR.                &
+               (.NOT. LCARTESIAN ) .OR. (.NOT. LTHINSHELL) ))THEN 
+  LGEOSBAL   = .FALSE.
+  LPERTURB   = .FALSE.
+  LCARTESIAN = .TRUE. 
+  LTHINSHELL = .TRUE. 
+  WRITE(NLUOUT,FMT=*) ' LGEOSBAL AND LPERTURB HAVE BEEN SET TO FALSE &
+                      & AND LCARTESIAN AND LTHINSHELL TO TRUE        &
+                      & SINCE 1D INITIAL FILE IS REQUIRED (L1D=TRUE)' 
+END IF
+!
+IF (LGEOSBAL .AND. LSHIFT ) THEN
+  LSHIFT=.FALSE.
+  WRITE(NLUOUT,FMT=*) ' LSHIFT HAS BEEN SET TO FALSE SINCE &
+                        & LGEOSBAL=.TRUE. IS REQUIRED '
+END IF
+!                      
+!*       3.4   compute the number of moist variables :
+!
+IF (.NOT.LUSERV) THEN
+  LUSERV = .TRUE.
+  WRITE(NLUOUT,FMT=*) ' LUSERV HAS BEEN RESET TO TRUE, SINCE A MOIST VARIABLE &
+                   & IS PRESENT IN EXPRE FILE (CIDEAL = RSOU OR CSTN)' 
+END IF
+!
+IF((LUSERI .OR. LUSERC).AND. (CIDEAL /= 'RSOU')) THEN
+  !callabortstop
+  CALL PRINT_MSG(NVERB_FATAL,'GEN','PREP_IDEAL_CASE','use of hydrometeors is only allowed in RSOU case')
+ENDIF
+IF (LUSERI) THEN
+  LUSERC =.TRUE.
+  LUSERR =.TRUE.
+  LUSERI =.TRUE.
+  LUSERS =.TRUE.
+  LUSERG =.TRUE.
+  LUSERH =.FALSE.
+  CCLOUD='ICE3'
+ELSEIF(LUSERC) THEN
+  LUSERR =.FALSE.
+  LUSERI =.FALSE.
+  LUSERS =.FALSE.
+  LUSERG =.FALSE.
+  LUSERH =.FALSE.
+  CCLOUD='REVE'
+ELSE
+  LUSERC =.FALSE.
+  LUSERR =.FALSE.
+  LUSERI =.FALSE.
+  LUSERS =.FALSE.
+  LUSERG =.FALSE.
+  LUSERH =.FALSE.
+  LHORELAX_RC=.FALSE.
+  LHORELAX_RR=.FALSE.
+  LHORELAX_RI=.FALSE.
+  LHORELAX_RS=.FALSE.
+  LHORELAX_RG=.FALSE.
+  LHORELAX_RH=.FALSE.
+  CCLOUD='NONE'
+!
+END IF
+!
+NRR=0
+IF (LUSERV) THEN
+  NRR=NRR+1
+  IDX_RVT = NRR
+END IF
+IF (LUSERC) THEN
+  NRR=NRR+1
+  IDX_RCT = NRR
+END IF
+IF (LUSERR) THEN
+  NRR=NRR+1
+  IDX_RRT = NRR
+END IF
+IF (LUSERI) THEN
+  NRR=NRR+1
+  IDX_RIT = NRR
+END IF
+IF (LUSERS) THEN
+  NRR=NRR+1
+  IDX_RST = NRR
+END IF
+IF (LUSERG) THEN
+  NRR=NRR+1
+  IDX_RGT = NRR
+END IF
+IF (LUSERH) THEN
+  NRR=NRR+1
+  IDX_RHT = NRR
+END IF
+!
+! NRR=4 for RSOU case because RI and Rc always computed
+IF (CIDEAL == 'RSOU' .AND. NRR < 4 ) NRR=4
+!                   
+!
+!*       3.5   Chemistry
+!
+IF (LORILAM .OR. LCH_INIT_FIELD) THEN
+  LUSECHEM = .TRUE.
+  IF (LORILAM) THEN
+    CORGANIC = "MPMPO"
+    LVARSIGI = .TRUE.
+    LVARSIGJ = .TRUE.
+  END IF
+END IF
+! initialise NSV_* variables
+CALL INI_NSV(1)
+LHORELAX_SV(:)=.FALSE.
+IF(.NOT. L1D) LHORELAX_SV(1:NSV)=.TRUE.
+!
+!-------------------------------------------------------------------------------
+!
+!*       4.    ALLOCATE MEMORY FOR ARRAYS :  
+!   	       ----------------------------
+!
+!*       4.1  Vertical Spatial grid 
+!
+CALL READ_VER_GRID(TZEXPREFILE)
+!
+!*       4.2  Initialize parallel variables and compute array's dimensions
+!
+!
+IF(LGEOSBAL) THEN
+  CALL SET_SPLITTING_ll('XSPLITTING')  ! required for integration of thermal wind balance
+ELSE
+  CALL SET_SPLITTING_ll('BSPLITTING')
+ENDIF
+CALL SET_JP_ll(1,JPHEXT,JPVEXT,JPHEXT)
+CALL SET_DAD0_ll()
+CALL SET_DIM_ll(NIMAX_ll, NJMAX_ll, NKMAX)
+CALL IO_Pack_set(L1D,L2D,LPACK)
+CALL SET_LBX_ll(CLBCX(1), 1)
+CALL SET_LBY_ll(CLBCY(1), 1)
+CALL SET_XRATIO_ll(1, 1)
+CALL SET_YRATIO_ll(1, 1)
+CALL SET_XOR_ll(1, 1)
+CALL SET_XEND_ll(NIMAX_ll+2*JPHEXT, 1)
+CALL SET_YOR_ll(1, 1)
+CALL SET_YEND_ll(NJMAX_ll+2*JPHEXT, 1)
+CALL SET_DAD_ll(0, 1)
+CALL INI_PARAZ_ll(IINFO_ll)
+!
+! sizes of arrays of the extended sub-domain
+!
+CALL GET_DIM_EXT_ll('B',NIU,NJU)
+CALL GET_DIM_PHYS_ll('B',NIMAX,NJMAX)
+CALL GET_INDICE_ll(NIB,NJB,NIE,NJE)
+CALL GET_OR_ll('B',IXOR,IYOR)
+NKB=1+JPVEXT
+NKU=NKMAX+2*JPVEXT
+!
+!*       4.3  Global variables absent from the modules :
+!
+ALLOCATE(XJ(NIU,NJU,NKU))
+SELECT CASE(CIDEAL)
+  CASE('RSOU','CSTN')
+    IF (LGEOSBAL) ALLOCATE(XCORIOZ(NIU,NJU,NKU))  ! exceptionally a 3D array  
+  CASE DEFAULT                      ! undefined preinitialization
+   !callabortstop
+    CALL PRINT_MSG(NVERB_FATAL,'GEN','PREP_IDEAL_CASE','CIDEAL is not correctly defined')
+END SELECT 
+!
+!*       4.4   Prognostic variables at M instant (module MODD_FIELD1):
+!
+ALLOCATE(XUT(NIU,NJU,NKU))
+ALLOCATE(XVT(NIU,NJU,NKU))
+ALLOCATE(XWT(NIU,NJU,NKU))
+ALLOCATE(XTHT(NIU,NJU,NKU))
+ALLOCATE(XPABST(NIU,NJU,NKU))
+ALLOCATE(XRT(NIU,NJU,NKU,NRR))
+ALLOCATE(XSVT(NIU,NJU,NKU,NSV))
+!
+!*       4.5   Grid variables (module MODD_GRID1 and MODD_METRICS1):
+!
+ALLOCATE(XMAP(NIU,NJU))
+ALLOCATE(XLAT(NIU,NJU))
+ALLOCATE(XLON(NIU,NJU))
+ALLOCATE(XDXHAT(NIU),XDYHAT(NJU))
+IF (LEN_TRIM(CPGD_FILE)==0) ALLOCATE(XZS(NIU,NJU))
+IF (LEN_TRIM(CPGD_FILE)==0) ALLOCATE(ZZS_ll(NIMAX_ll))
+IF (LEN_TRIM(CPGD_FILE)==0) ALLOCATE(XZSMT(NIU,NJU))
+ALLOCATE(XZZ(NIU,NJU,NKU))
+!
+ALLOCATE(XDXX(NIU,NJU,NKU))
+ALLOCATE(XDYY(NIU,NJU,NKU))
+ALLOCATE(XDZX(NIU,NJU,NKU))
+ALLOCATE(XDZY(NIU,NJU,NKU))
+ALLOCATE(XDZZ(NIU,NJU,NKU))
+!
+!*       4.6   Reference state variables (modules MODD_REF and MODD_REF1):
+!
+ALLOCATE(XRHODREFZ(NKU),XTHVREFZ(NKU))
+XTHVREFZ(:)=0.0
+IF (LCOUPLES) THEN
+  ! Arrays for reference state different in ocean and atmosphere
+  ALLOCATE(XRHODREFZO(NKU),XTHVREFZO(NKU))
+  XTHVREFZO(:)=0.0
+END IF
+IF(CEQNSYS == 'DUR') THEN
+  ALLOCATE(XRVREF(NIU,NJU,NKU))
+ELSE
+  ALLOCATE(XRVREF(0,0,0))
+END IF
+ALLOCATE(XRHODREF(NIU,NJU,NKU),XTHVREF(NIU,NJU,NKU),XEXNREF(NIU,NJU,NKU))
+ALLOCATE(XRHODJ(NIU,NJU,NKU))
+!
+!*       4.7   Larger Scale fields (modules MODD_LSFIELD1):
+!
+ALLOCATE(XLSUM(NIU,NJU,NKU))
+ALLOCATE(XLSVM(NIU,NJU,NKU))
+ALLOCATE(XLSWM(NIU,NJU,NKU))
+ALLOCATE(XLSTHM(NIU,NJU,NKU))
+IF ( NRR >= 1) THEN
+  ALLOCATE(XLSRVM(NIU,NJU,NKU))
+ELSE
+  ALLOCATE(XLSRVM(0,0,0))
+ENDIF
+!
+!  allocate lateral boundary field used for coupling
+!
+IF ( L1D) THEN                         ! 1D case
+!
+  NSIZELBX_ll=0
+  NSIZELBXU_ll=0
+  NSIZELBY_ll=0
+  NSIZELBYV_ll=0
+  NSIZELBXTKE_ll=0
+  NSIZELBXR_ll=0
+  NSIZELBXSV_ll=0
+  NSIZELBYTKE_ll=0
+  NSIZELBYR_ll=0
+  NSIZELBYSV_ll=0
+  ALLOCATE(XLBXUM(0,0,0))
+  ALLOCATE(XLBYUM(0,0,0))
+  ALLOCATE(XLBXVM(0,0,0))
+  ALLOCATE(XLBYVM(0,0,0))
+  ALLOCATE(XLBXWM(0,0,0))
+  ALLOCATE(XLBYWM(0,0,0))
+  ALLOCATE(XLBXTHM(0,0,0))
+  ALLOCATE(XLBYTHM(0,0,0))
+  ALLOCATE(XLBXTKEM(0,0,0))
+  ALLOCATE(XLBYTKEM(0,0,0))
+  ALLOCATE(XLBXRM(0,0,0,0))
+  ALLOCATE(XLBYRM(0,0,0,0))
+  ALLOCATE(XLBXSVM(0,0,0,0))
+  ALLOCATE(XLBYSVM(0,0,0,0))
+!
+ELSEIF( L2D ) THEN             ! 2D case (not yet parallelized)
+!                                          
+  CALL GET_SIZEX_LB(NIMAX_ll,NJMAX_ll,NRIMX,               &
+                    IISIZEXF,IJSIZEXF,IISIZEXFU,IJSIZEXFU, &
+                    IISIZEX4,IJSIZEX4,IISIZEX2,IJSIZEX2)
+  NSIZELBY_ll=0
+  NSIZELBYV_ll=0
+  NSIZELBYTKE_ll=0
+  NSIZELBYR_ll=0
+  NSIZELBYSV_ll=0
+  ALLOCATE(XLBYUM(0,0,0))
+  ALLOCATE(XLBYVM(0,0,0))
+  ALLOCATE(XLBYWM(0,0,0))
+  ALLOCATE(XLBYTHM(0,0,0))
+  ALLOCATE(XLBYTKEM(0,0,0))
+  ALLOCATE(XLBYRM(0,0,0,0))
+  ALLOCATE(XLBYSVM(0,0,0,0))
+  !
+  IF ( LHORELAX_UVWTH ) THEN
+!JUAN A REVOIR TODO_JPHEXT
+! <<<<<<< prep_ideal_case.f90
+    ! NSIZELBX_ll=2*NRIMX+2
+    ! NSIZELBXU_ll=2*NRIMX+2
+    ALLOCATE(XLBXUM(IISIZEXFU,NJU,NKU))
+    ALLOCATE(XLBXVM(IISIZEXF,NJU,NKU))
+    ALLOCATE(XLBXWM(IISIZEXF,NJU,NKU))
+    ALLOCATE(XLBXTHM(IISIZEXF,NJU,NKU))
+! =======
+    NSIZELBX_ll=2*NRIMX+2*JPHEXT
+    NSIZELBXU_ll=2*NRIMX+2*JPHEXT
+    ! ALLOCATE(XLBXUM(2*NRIMX+2*JPHEXT,NJU,NKU))
+    ! ALLOCATE(XLBXVM(2*NRIMX+2*JPHEXT,NJU,NKU))
+    ! ALLOCATE(XLBXWM(2*NRIMX+2*JPHEXT,NJU,NKU))
+    ! ALLOCATE(XLBXTHM(2*NRIMX+2*JPHEXT,NJU,NKU))
+! >>>>>>> 1.3.2.4.2.3.2.14.2.8.2.11.2.2
+  ELSE
+    NSIZELBX_ll= 2*JPHEXT     ! 2
+    NSIZELBXU_ll=2*(JPHEXT+1) ! 4 
+    ALLOCATE(XLBXUM(NSIZELBXU_ll,NJU,NKU))
+    ALLOCATE(XLBXVM(NSIZELBX_ll,NJU,NKU))
+    ALLOCATE(XLBXWM(NSIZELBX_ll,NJU,NKU))
+    ALLOCATE(XLBXTHM(NSIZELBX_ll,NJU,NKU))
+  END IF  
+  !
+  IF ( NRR > 0 ) THEN
+    IF (       LHORELAX_RV .OR. LHORELAX_RC .OR. LHORELAX_RR .OR. LHORELAX_RI    &
+          .OR. LHORELAX_RS .OR. LHORELAX_RG .OR. LHORELAX_RH                     &
+       ) THEN 
+!JUAN A REVOIR TODO_JPHEXT
+! <<<<<<< prep_ideal_case.f90
+      ! NSIZELBXR_ll=2* NRIMX+2
+      ALLOCATE(XLBXRM(IISIZEXF,NJU,NKU,NRR))
+! =======
+      NSIZELBXR_ll=2*NRIMX+2*JPHEXT
+      ! ALLOCATE(XLBXRM(2*NRIMX+2*JPHEXT,NJU,NKU,NRR))
+! >>>>>>> 1.3.2.4.2.3.2.14.2.8.2.11.2.2
+    ELSE
+      NSIZELBXR_ll=2*JPHEXT ! 2
+      ALLOCATE(XLBXRM(NSIZELBXR_ll,NJU,NKU,NRR))
+    ENDIF
+  ELSE
+    NSIZELBXR_ll=0
+    ALLOCATE(XLBXRM(0,0,0,0))
+  END IF
+  !
+  IF ( NSV > 0 ) THEN 
+    IF ( ANY( LHORELAX_SV(:)) ) THEN
+!JUAN A REVOIR TODO_JPHEXT
+! <<<<<<< prep_ideal_case.f90
+      ! NSIZELBXSV_ll=2* NRIMX+2
+      ALLOCATE(XLBXSVM(IISIZEXF,NJU,NKU,NSV))
+! =======
+      NSIZELBXSV_ll=2*NRIMX+2*JPHEXT
+      ! ALLOCATE(XLBXSVM(2*NRIMX+2*JPHEXT,NJU,NKU,NSV))
+! >>>>>>> 1.3.2.4.2.3.2.14.2.8.2.11.2.2
+    ELSE
+      NSIZELBXSV_ll=2*JPHEXT ! 2
+      ALLOCATE(XLBXSVM(NSIZELBXSV_ll,NJU,NKU,NSV))
+    END IF
+  ELSE
+    NSIZELBXSV_ll=0
+    ALLOCATE(XLBXSVM(0,0,0,0))
+  END IF
+!
+ELSE                                   ! 3D case
+!
+  CALL GET_SIZEX_LB(NIMAX_ll,NJMAX_ll,NRIMX,               &
+                    IISIZEXF,IJSIZEXF,IISIZEXFU,IJSIZEXFU, &
+                    IISIZEX4,IJSIZEX4,IISIZEX2,IJSIZEX2)
+  CALL GET_SIZEY_LB(NIMAX_ll,NJMAX_ll,NRIMY,               &
+                    IISIZEYF,IJSIZEYF,IISIZEYFV,IJSIZEYFV, &
+                    IISIZEY4,IJSIZEY4,IISIZEY2,IJSIZEY2)
+!
+  IF ( LHORELAX_UVWTH ) THEN
+    NSIZELBX_ll=2*NRIMX+2*JPHEXT
+    NSIZELBXU_ll=2*NRIMX+2*JPHEXT
+    NSIZELBY_ll=2*NRIMY+2*JPHEXT
+    NSIZELBYV_ll=2*NRIMY+2*JPHEXT
+    ALLOCATE(XLBXUM(IISIZEXFU,IJSIZEXFU,NKU))
+    ALLOCATE(XLBYUM(IISIZEYF,IJSIZEYF,NKU))
+    ALLOCATE(XLBXVM(IISIZEXF,IJSIZEXF,NKU))
+    ALLOCATE(XLBYVM(IISIZEYFV,IJSIZEYFV,NKU))
+    ALLOCATE(XLBXWM(IISIZEXF,IJSIZEXF,NKU))
+    ALLOCATE(XLBYWM(IISIZEYF,IJSIZEYF,NKU))
+    ALLOCATE(XLBXTHM(IISIZEXF,IJSIZEXF,NKU))
+    ALLOCATE(XLBYTHM(IISIZEYF,IJSIZEYF,NKU))
+  ELSE
+    NSIZELBX_ll=2*JPHEXT      ! 2
+    NSIZELBXU_ll=2*(JPHEXT+1) ! 4
+    NSIZELBY_ll=2*JPHEXT      ! 2
+    NSIZELBYV_ll=2*(JPHEXT+1) ! 4
+    ALLOCATE(XLBXUM(IISIZEX4,IJSIZEX4,NKU))
+    ALLOCATE(XLBYUM(IISIZEY2,IJSIZEY2,NKU))
+    ALLOCATE(XLBXVM(IISIZEX2,IJSIZEX2,NKU))
+    ALLOCATE(XLBYVM(IISIZEY4,IJSIZEY4,NKU))
+    ALLOCATE(XLBXWM(IISIZEX2,IJSIZEX2,NKU))
+    ALLOCATE(XLBYWM(IISIZEY2,IJSIZEY2,NKU))
+    ALLOCATE(XLBXTHM(IISIZEX2,IJSIZEX2,NKU))
+    ALLOCATE(XLBYTHM(IISIZEY2,IJSIZEY2,NKU))
+  END IF  
+  !
+  IF ( NRR > 0 ) THEN
+    IF (       LHORELAX_RV .OR. LHORELAX_RC .OR. LHORELAX_RR .OR. LHORELAX_RI    &
+          .OR. LHORELAX_RS .OR. LHORELAX_RG .OR. LHORELAX_RH                     &
+       ) THEN 
+      NSIZELBXR_ll=2*NRIMX+2*JPHEXT
+      NSIZELBYR_ll=2*NRIMY+2*JPHEXT
+      ALLOCATE(XLBXRM(IISIZEXF,IJSIZEXF,NKU,NRR))
+      ALLOCATE(XLBYRM(IISIZEYF,IJSIZEYF,NKU,NRR))
+    ELSE
+      NSIZELBXR_ll=2*JPHEXT    ! 2
+      NSIZELBYR_ll=2*JPHEXT    ! 2
+      ALLOCATE(XLBXRM(IISIZEX2,IJSIZEX2,NKU,NRR))
+      ALLOCATE(XLBYRM(IISIZEY2,IJSIZEY2,NKU,NRR))
+    ENDIF
+  ELSE
+    NSIZELBXR_ll=0
+    NSIZELBYR_ll=0
+    ALLOCATE(XLBXRM(0,0,0,0))
+    ALLOCATE(XLBYRM(0,0,0,0))
+  END IF
+  !
+  IF ( NSV > 0 ) THEN 
+    IF ( ANY( LHORELAX_SV(:)) ) THEN
+      NSIZELBXSV_ll=2*NRIMX+2*JPHEXT
+      NSIZELBYSV_ll=2*NRIMY+2*JPHEXT
+      ALLOCATE(XLBXSVM(IISIZEXF,IJSIZEXF,NKU,NSV))
+      ALLOCATE(XLBYSVM(IISIZEYF,IJSIZEYF,NKU,NSV))
+    ELSE
+      NSIZELBXSV_ll=2*JPHEXT    ! 2
+      NSIZELBYSV_ll=2*JPHEXT    ! 2
+      ALLOCATE(XLBXSVM(IISIZEX2,IJSIZEX2,NKU,NSV))
+      ALLOCATE(XLBYSVM(IISIZEY2,IJSIZEY2,NKU,NSV))
+    END IF
+  ELSE
+    NSIZELBXSV_ll=0
+    NSIZELBYSV_ll=0
+    ALLOCATE(XLBXSVM(0,0,0,0))
+    ALLOCATE(XLBYSVM(0,0,0,0))
+  END IF
+END IF
+!
+!
+!-------------------------------------------------------------------------------
+!
+!*       5.     INITIALIZE ALL THE MODEL VARIABLES
+!   	        ----------------------------------
+!
+!
+!*       5.1    Grid variables and RS localization:
+!
+!*       5.1.1  Horizontal Spatial grid :
+!
+IF( LEN_TRIM(CPGD_FILE) /= 0 ) THEN 
+!--------------------------------------------------------
+! the MESONH horizontal grid will be read in the PGD_FILE 
+!--------------------------------------------------------
+  CALL READ_HGRID(1,TPGDFILE,YPGD_NAME,YPGD_DAD_NAME,YPGD_TYPE)
+! control the cartesian option
+  IF( LCARTESIAN ) THEN
+     WRITE(NLUOUT,FMT=*) 'PREP_IDEAL_CASE : IN GENERAL, THE USE OF A PGD_FILE &
+                & IMPLIES THAT YOU MUST TAKE INTO ACCOUNT THE EARTH SPHERICITY'
+     WRITE(NLUOUT,FMT=*) 'NEVERTHELESS, LCARTESIAN HAS BEEN KEPT TO TRUE'
+  END IF   
+!
+!* use of the externalized surface
+!
+  CSURF = "EXTE"
+!
+! determine whether the model is flat or no
+!
+  ZZS_MAX = ABS( MAXVAL(XZS(NIB:NIU-JPHEXT,NJB:NJU-JPHEXT)))
+  CALL MPI_ALLREDUCE(ZZS_MAX, ZZS_MAX_ll, 1, MNHREAL_MPI, MPI_MAX,  &
+                     NMNH_COMM_WORLD,IINFO_ll)
+  IF( ABS(ZZS_MAX_ll)  < 1.E-10 ) THEN
+    LFLAT=.TRUE.
+  ELSE
+    LFLAT=.FALSE.
+  END IF
+!
+
+ELSE
+!------------------------------------------------------------------------
+! the MESONH horizontal grid is built from the PRE_IDEA1.nam informations
+!------------------------------------------------------------------------
+!
+  ALLOCATE( XXHAT(NIU),  XYHAT(NJU)  )
+  ALLOCATE( XXHATM(NIU), XYHATM(NJU) )
+!
+! define the grid localization at the earth surface by the central point
+! coordinates
+!
+  IF (XLONCEN/=XUNDEF .OR. XLATCEN/=XUNDEF) THEN
+    IF (XLONCEN/=XUNDEF .AND. XLATCEN/=XUNDEF) THEN 
+!
+! it should be noted that XLATCEN and XLONCEN refer to a vertical
+! vorticity point and (XLATORI, XLONORI) refer to the mass point of
+! conformal coordinates (0,0). This is to allow the centering of the model in
+! a non-cyclic  configuration regarding to XLATCEN or XLONCEN.
+!
+      CALL SM_LATLON(XLATCEN,XLONCEN,                     &
+                       -XDELTAX*(NIMAX_ll/2-0.5+JPHEXT),  &
+                       -XDELTAY*(NJMAX_ll/2-0.5+JPHEXT),  &
+                       XLATORI,XLONORI)
+!
+      WRITE(NLUOUT,FMT=*) 'PREP_IDEAL_CASE : XLATORI=' , XLATORI, &
+                          ' XLONORI= ', XLONORI
+    ELSE
+   !callabortstop
+      CALL PRINT_MSG(NVERB_FATAL,'GEN','PREP_IDEAL_CASE',&
+                     'latitude and longitude of the center point must be initialized alltogether or not')
+    END IF
+  END IF
+!
+  IF (NPROC > 1) THEN
+    CALL GET_DIM_EXT_ll('B',IXDIM,IYDIM)
+    IBEG = IXOR-JPHEXT-1
+    IEND = IBEG+IXDIM-1
+    XXHAT(:) = (/ (REAL(JLOOP)*XDELTAX, JLOOP=IBEG,IEND) /)
+    IBEG = IYOR-JPHEXT-1
+    IEND = IBEG+IYDIM-1
+    XYHAT(:) = (/ (REAL(JLOOP)*XDELTAY, JLOOP=IBEG,IEND) /)
+!
+  ELSE
+    XXHAT(:) = (/ (REAL(JLOOP-NIB)*XDELTAX, JLOOP=1,NIU) /)
+    XYHAT(:) = (/ (REAL(JLOOP-NJB)*XDELTAY, JLOOP=1,NJU) /)
+  END IF
+
+  ! Interpolations of positions to mass points
+  CALL INTERP_HORGRID_TO_MASSPOINTS( XXHAT, XYHAT, XXHATM, XYHATM )
+
+  ! Collect global domain boundaries
+  CALL STORE_GLOB_HORGRID( XXHAT, XYHAT, XXHATM, XYHATM, XXHAT_ll, XYHAT_ll, XXHATM_ll, XYHATM_ll, XHAT_BOUND, XHATM_BOUND )
+
+END IF
+!
+!*       5.1.2  Orography and Gal-Chen Sommerville transformation :
+!
+IF (    LEN_TRIM(CPGD_FILE) == 0  .OR. .NOT. LREAD_ZS) THEN
+  SELECT CASE(CZS)     ! 'FLAT' or 'SINE' or 'BELL'
+  CASE('FLAT')
+    LFLAT = .TRUE.
+    IF (XHMAX==XUNDEF) THEN
+      XZS(:,:) = 0.
+    ELSE
+      XZS(:,:) = XHMAX
+    END IF
+  CASE('SINE')       ! sinus-shaped orography 
+    IF (XHMAX==XUNDEF) XHMAX=300.
+    LFLAT    =.FALSE.
+    XZS(:,:) = XHMAX          &      ! three-dimensional case   
+    *SPREAD((/((SIN((XPI/(NIMAX_ll+2*JPHEXT-1))*JLOOP)**2)**NEXPX,JLOOP=IXOR-1,IXOR+NIU-2)/),2,NJU) &
+    *SPREAD((/((SIN((XPI/(NJMAX_ll+2*JPHEXT-1))*JLOOP)**2)**NEXPY,JLOOP=IYOR-1,IYOR+NJU-2)/),1,NIU)
+    IF(L1D) THEN                     ! one-dimensional case
+      XZS(:,:) = XHMAX 
+    END IF        
+  CASE('BELL')       ! bell-shaped orography 
+    IF (XHMAX==XUNDEF) XHMAX=300.
+    LFLAT = .FALSE.
+    IF(.NOT.L2D) THEN                ! three-dimensional case
+      XZS(:,:) = XHMAX  / ( 1.                                           &
+        + ( (SPREAD(XXHAT(1:NIU),2,NJU) - REAL(NIZS) * XDELTAX) /XAX ) **2  &
+        + ( (SPREAD(XYHAT(1:NJU),1,NIU) - REAL(NJZS) * XDELTAY) /XAY ) **2  ) **1.5
+    ELSE                             ! two-dimensional case
+      XZS(:,:) = XHMAX  / ( 1.                                          &
+        + ( (SPREAD(XXHAT(1:NIU),2,NJU) - REAL(NIZS) * XDELTAX) /XAX ) **2 )
+    ENDIF
+    IF(L1D) THEN                     ! one-dimensional case
+      XZS(:,:) = XHMAX 
+    END IF        
+  CASE('COSI')       ! (1+cosine)**4 shape
+    IF (XHMAX==XUNDEF) XHMAX=800.
+    LFLAT = .FALSE.
+    IF(L2D) THEN                     ! two-dimensional case
+      DO JILOOP = 1, NIU
+        ZDIST = XXHAT(JILOOP)-REAL(NIZS)*XDELTAX
+        IF( ABS(ZDIST)<(4.0*XAX) ) THEN
+          XZS(JILOOP,:) = (XHMAX/16.0)*( 1.0 + COS((XPI*ZDIST)/(4.0*XAX)) )**4
+        ELSE
+          XZS(JILOOP,:) = 0.0
+        ENDIF
+      END DO
+    ENDIF
+  CASE('SCHA')       ! exp(-(x/a)**2)*cosine(pi*x/lambda)**2 shape
+    IF (XHMAX==XUNDEF) XHMAX=800.
+    LFLAT = .FALSE.
+    IF(L2D) THEN                     ! two-dimensional case
+      DO JILOOP = 1, NIU
+        ZDIST = XXHAT(JILOOP)-REAL(NIZS)*XDELTAX
+        IF( ABS(ZDIST)<(4.0*XAX) ) THEN
+          XZS(JILOOP,:) = XHMAX*EXP(-(ZDIST/XAY)**2)*COS((XPI*ZDIST)/XAX)**2
+        ELSE
+          XZS(JILOOP,:) = 0.0
+        ENDIF
+      END DO
+    ENDIF
+  CASE('AGNE')       ! h*a**2/(x**2+a**2) shape
+    LFLAT = .FALSE.
+    IF(L2D) THEN                     ! two-dimensional case
+      DO JILOOP = 1, NIU
+        ZDIST = XXHAT(JILOOP)-REAL(NIZS)*XDELTAX
+          XZS(JILOOP,:) = XHMAX*(XAX**2)/(XAX**2+ZDIST**2)
+      END DO
+		ELSE		! three dimensionnal case - infinite profile in y direction
+			DO JILOOP = 1, NIU
+        ZDIST = XXHAT(JILOOP)-REAL(NIZS)*XDELTAX
+          XZS(JILOOP,:) = XHMAX*(XAX**2)/(XAX**2+ZDIST**2)
+      END DO
+    ENDIF
+
+  CASE('DATA')       ! discretized orography
+    LFLAT    =.FALSE.
+    WRITE(NLUOUT,FMT=*) 'CZS="DATA",   ATTEMPT TO READ ARRAY     &
+                    &XZS(NIB:NIU-JPHEXT:1,NJU-JPHEXT:NJB:-1) &
+                    &starting from the first index'
+    CALL POSKEY(NLUPRE,NLUOUT,'ZSDATA')
+    DO JJLOOP = NJMAX_ll+2*JPHEXT-1,JPHEXT+1,-1    ! input like a map prior the sounding
+      READ(NLUPRE,FMT=*) ZZS_ll
+      IF ( ( JJLOOP <= ( NJU-JPHEXT + IYOR-1 ) ) .AND. ( JJLOOP >= ( NJB + IYOR-1 ) ) ) THEN
+         IJ    = JJLOOP - ( IYOR-1 )
+         XZS(NIB:NIU-JPHEXT,IJ) = ZZS_ll(IXOR:IXOR + NIU-JPHEXT - NIB )
+      END IF
+    END DO
+!
+  CASE DEFAULT   ! undefined  shape of orography
+   !callabortstop
+    CALL PRINT_MSG(NVERB_FATAL,'GEN','PREP_IDEAL_CASE','erroneous ground type')
+  END SELECT
+!
+  CALL ADD2DFIELD_ll( TZ_FIELDS_ll, XZS, 'PREP_IDEAL_CASE::XZS' )
+  CALL UPDATE_HALO_ll(TZ_FIELDS_ll,IINFO_ll)
+  CALL CLEANLIST_ll(TZ_FIELDS_ll)
+!
+END IF
+!
+!IF( ( LEN_TRIM(CPGD_FILE) /= 0 ) .AND. .NOT.LFLAT .AND. &
+! ((CLBCX(1) /= "OPEN" ) .OR. &
+! (CLBCX(2) /= "OPEN" ) .OR. (CLBCY(1) /= "OPEN" ) .OR. &
+! (CLBCY(2) /= "OPEN" )) )  THEN 
+!   !callabortstop
+!  CALL PRINT_MSG(NVERB_FATAL,'GEN','PREP_IDEAL_CASE','with a PGD file, you cannot be in a cyclic LBC')
+!END IF
+!
+IF (LWEST_ll())  THEN
+  DO JILOOP = 1,JPHEXT
+    XZS(JILOOP,:) = XZS(NIB,:)
+  END DO
+END IF
+IF (LEAST_ll()) THEN
+  DO JILOOP = NIU-JPHEXT+1,NIU
+    XZS(JILOOP,:)=XZS(NIU-JPHEXT,:)
+  END DO
+END IF
+IF (LSOUTH_ll()) THEN
+  DO JJLOOP = 1,JPHEXT
+    XZS(:,JJLOOP)=XZS(:,NJB)
+  END DO
+END IF
+IF (LNORTH_ll()) THEN
+  DO JJLOOP =NJU-JPHEXT+1,NJU
+    XZS(:,JJLOOP)=XZS(:,NJU-JPHEXT)
+  END DO
+END IF
+!
+IF ( LEN_TRIM(CPGD_FILE) == 0  .OR. .NOT. LREAD_ZS) THEN
+  IF (LSLEVE) THEN
+    CALL ZSMT_PIC(NSLEVE,XSMOOTH_ZS)
+  ELSE
+    XZSMT(:,:) = 0.
+  END IF
+END IF
+!
+IF (LCARTESIAN) THEN
+  CALL SM_GRIDCART(XXHAT,XYHAT,XZHAT,XZS,LSLEVE,XLEN1,XLEN2,XZSMT,XDXHAT,XDYHAT,XZZ,XJ)
+  XMAP=1.
+ELSE
+  CALL SM_GRIDPROJ( XXHAT, XYHAT, XZHAT, XXHATM, XYHATM, XZS,      &
+                    LSLEVE, XLEN1, XLEN2, XZSMT, XLATORI, XLONORI, &
+                    XMAP, XLAT, XLON, XDXHAT, XDYHAT, XZZ, XJ      )
+END IF
+!*       5.4.1  metrics coefficients and update halos:
+!
+CALL METRICS(XMAP,XDXHAT,XDYHAT,XZZ,XDXX,XDYY,XDZX,XDZY,XDZZ)
+!
+CALL UPDATE_METRICS(CLBCX,CLBCY,XDXX,XDYY,XDZX,XDZY,XDZZ)                         
+!
+!*       5.1.3  Compute the localization in index space of the vertical profile
+!               in CSTN and RSOU cases  :
+!
+IF (CTYPELOC =='LATLON' ) THEN  
+  IF (.NOT.LCARTESIAN) THEN                            ! compute (x,y) if 
+    CALL SM_XYHAT(XLATORI,XLONORI,                 &   ! the localization 
+                  XLATLOC,XLONLOC,XXHATLOC,XYHATLOC)   ! is given in latitude 
+  ELSE                                                 ! and longitude
+    WRITE(NLUOUT,FMT=*) 'CTYPELOC CANNOT BE LATLON IN CARTESIAN GEOMETRY'
+    WRITE(NLUOUT,FMT=*) '-> JOB ABORTED'
+   !callabortstop
+    CALL PRINT_MSG(NVERB_FATAL,'GEN','PREP_IDEAL_CASE','CTYPELOC cannot be LATLON in cartesian geometry')
+  END IF 
+END IF  
+!
+IF (CTYPELOC /= 'IJGRID') THEN                                               
+  NILOC = MINLOC(ABS(XXHATLOC-XXHAT_ll(:)))
+  NJLOC = MINLOC(ABS(XYHATLOC-XYHAT_ll(:)))
+END IF
+!
+IF ( L1D .AND. ( NILOC(1) /= 1 .OR. NJLOC(1) /= 1 ) ) THEN
+  NILOC = 1
+  NJLOC = 1
+  WRITE(NLUOUT,FMT=*) 'FOR 1D CONFIGURATION, THE RS INFORMATIONS ARE TAKEN AT &
+                      & I=1 AND J=1 (CENTRAL VERTICAL WITHOUT HALO)'
+END IF
+!
+IF ( L2D .AND. ( NJLOC(1) /= 1 ) ) THEN
+  NJLOC = 1
+  WRITE(NLUOUT,FMT=*) 'FOR 2D CONFIGURATION, THE RS INFORMATIONS ARE TAKEN AT &
+                      & J=1 (CENTRAL PLANE WITHOUT HALO)'
+END IF
+!
+!*       5.2    Prognostic variables (not multiplied by  rhoJ) : u,v,w,theta,r
+!               and 1D anelastic reference state
+!
+!
+!*       5.2.1  Use a Radiosounding : CIDEAL='RSOU''
+!
+IF (CIDEAL == 'RSOU') THEN
+  WRITE(NLUOUT,FMT=*) 'CIDEAL="RSOU", attempt to read DATE'
+  CALL POSKEY(NLUPRE,NLUOUT,'RSOU')
+  READ(NLUPRE,FMT=*)  NYEAR,NMONTH,NDAY,XTIME
+  TDTCUR = DATE_TIME(NYEAR,NMONTH,NDAY,XTIME)
+  TDTEXP = TDTCUR
+  TDTSEG = TDTCUR
+  TDTMOD = TDTCUR
+  WRITE(NLUOUT,FMT=*) 'CIDEAL="RSOU", ATTEMPT TO PROCESS THE SOUNDING DATA'
+  IF (LGEOSBAL) THEN
+    CALL SET_RSOU(TFILE_DUMMY,TZEXPREFILE,CFUNU,CFUNV,NILOC(1),NJLOC(1),LBOUSS, &
+                  XJ,LSHIFT,XCORIOZ)
+  ELSE
+    CALL SET_RSOU(TFILE_DUMMY,TZEXPREFILE,CFUNU,CFUNV,NILOC(1),NJLOC(1),LBOUSS, &
+                  XJ,LSHIFT)
+  END IF
+!
+!*       5.2.2  N=cste  and U(z) : CIDEAL='CSTN'
+!
+ELSE IF (CIDEAL == 'CSTN') THEN
+  WRITE(NLUOUT,FMT=*) 'CIDEAL="CSTN", attempt to read DATE'
+  CALL POSKEY(NLUPRE,NLUOUT,'CSTN')
+  READ(NLUPRE,FMT=*)  NYEAR,NMONTH,NDAY,XTIME
+  TDTCUR = DATE_TIME(NYEAR,NMONTH,NDAY,XTIME)
+  TDTEXP = TDTCUR
+  TDTSEG = TDTCUR
+  TDTMOD = TDTCUR
+  WRITE(NLUOUT,FMT=*) 'CIDEAL="CSTN", ATTEMPT TO PROCESS THE SOUNDING DATA'
+  IF (LGEOSBAL) THEN
+    CALL SET_CSTN(TFILE_DUMMY,TZEXPREFILE,CFUNU,CFUNV,NILOC(1),NJLOC(1),LBOUSS, &
+                  XJ,LSHIFT,XCORIOZ)
+  ELSE
+    CALL SET_CSTN(TFILE_DUMMY,TZEXPREFILE,CFUNU,CFUNV,NILOC(1),NJLOC(1),LBOUSS, &
+                  XJ,LSHIFT)
+  END IF
+!
+END IF 
+!
+!*       5.3    Forcing variables
+!
+IF (LFORCING) THEN
+  WRITE(NLUOUT,FMT=*) 'FORCING IS ENABLED, ATTEMPT TO SET FORCING FIELDS'
+  CALL POSKEY(NLUPRE,NLUOUT,'ZFRC ','PFRC')
+  CALL SET_FRC(TZEXPREFILE)
+END IF
+!
+!! ---------------------------------------------------------------------
+! Modif PP ADV FRC
+! 5.4.2 initialize profiles for adv forcings
+IF (L2D_ADV_FRC) THEN
+    WRITE(NLUOUT,FMT=*) 'L2D_ADV_FRC IS SET TO  TRUE'
+    WRITE(NLUOUT,FMT=*) 'ADVECTING FORCING USED IS USER MADE, NOT STANDARD ONE ' 
+    WRITE(NLUOUT,FMT=*) 'IT IS FOR 2D IDEALIZED WAM STUDY ONLY ' 
+   CALL POSKEY(NLUPRE,NLUOUT,'ZFRC_ADV')
+   CALL SET_ADVFRC(TZEXPREFILE)
+ENDIF
+IF (L2D_REL_FRC) THEN
+    WRITE(NLUOUT,FMT=*) 'L2D_REL_FRC IS SET TO  TRUE'
+    WRITE(NLUOUT,FMT=*) 'RELAXATION FORCING USED IS USER MADE, NOT STANDARD ONE ' 
+    WRITE(NLUOUT,FMT=*) 'IT IS FOR 2D IDEALIZED WAM STUDY ONLY ' 
+   CALL POSKEY(NLUPRE,NLUOUT,'ZFRC_REL')
+   CALL SET_RELFRC(TZEXPREFILE)
+ENDIF
+!*       5.4    3D Reference state variables :
+!
+!
+!*       5.4.1  metrics coefficients and update halos:
+!
+CALL METRICS(XMAP,XDXHAT,XDYHAT,XZZ,XDXX,XDYY,XDZX,XDZY,XDZZ)
+!
+CALL UPDATE_METRICS(CLBCX,CLBCY,XDXX,XDYY,XDZX,XDZY,XDZZ)
+!
+!*       5.4.2  3D reference state :
+!
+CALL SET_REF( 0, TFILE_DUMMY,                            &
+              XZZ, XZHATM, XJ, XDXX, XDYY, CLBCX, CLBCY, &
+              XREFMASS, XMASS_O_PHI0, XLINMASS,          &
+              XRHODREF, XTHVREF, XRVREF, XEXNREF, XRHODJ )
+!
+!
+!*       5.5.1  Absolute pressure :
+!
+!
+!*       5.5.2  Total mass of dry air Md computation :
+!
+CALL TOTAL_DMASS(XJ,XRHODREF,XDRYMASST)
+!
+!
+!*       5.6    Complete prognostic variables (multipliy by  rhoJ) at time t :
+!
+! U grid   : gridpoint 2
+IF (LWEST_ll())  XUT(1,:,:)    = 2.*XUT(2,:,:) - XUT(3,:,:)
+! V grid   : gridpoint 3
+IF (LSOUTH_ll())  XVT(:,1,:)    = 2.*XVT(:,2,:) - XVT(:,3,:)
+! SV : gridpoint 1
+XSVT(:,:,:,:) = 0.
+!
+!
+!*       5.7   Larger scale fields initialization :
+!
+XLSUM(:,:,:) = XUT(:,:,:)        ! these fields do not satisfy the 
+XLSVM(:,:,:) = XVT(:,:,:)        ! lower boundary condition but are 
+XLSWM(:,:,:) = XWT(:,:,:)        ! in equilibrium
+XLSTHM(:,:,:)= XTHT(:,:,:)
+XLSRVM(:,:,:)= XRT(:,:,:,1)
+!
+! enforce the vertical homogeneity under the ground and above the top of
+! the model for the LS fields
+!
+XLSUM(:,:,NKB-1)=XLSUM(:,:,NKB)
+XLSUM(:,:,NKU)=XLSUM(:,:,NKU-1)
+XLSVM(:,:,NKB-1)=XLSVM(:,:,NKB)
+XLSVM(:,:,NKU)=XLSVM(:,:,NKU-1)
+XLSWM(:,:,NKB-1)=XLSWM(:,:,NKB)
+XLSWM(:,:,NKU)=XLSWM(:,:,NKU-1)
+XLSTHM(:,:,NKB-1)=XLSTHM(:,:,NKB)
+XLSTHM(:,:,NKU)=XLSTHM(:,:,NKU-1)
+IF ( NRR > 0 ) THEN
+  XLSRVM(:,:,NKB-1)=XLSRVM(:,:,NKB)
+  XLSRVM(:,:,NKU)=XLSRVM(:,:,NKU-1)
+END IF
+!
+ILBX=SIZE(XLBXUM,1)
+ILBY=SIZE(XLBYUM,2)
+IF(LWEST_ll() .AND. .NOT. L1D) THEN
+  XLBXUM(1:NRIMX+JPHEXT,        :,:)     = XUT(2:NRIMX+JPHEXT+1,        :,:)
+  XLBXVM(1:NRIMX+JPHEXT,        :,:)     = XVT(1:NRIMX+JPHEXT,        :,:)
+  XLBXWM(1:NRIMX+JPHEXT,        :,:)     = XWT(1:NRIMX+JPHEXT,        :,:)
+  XLBXTHM(1:NRIMX+JPHEXT,        :,:)   = XTHT(1:NRIMX+JPHEXT,        :,:)
+  XLBXRM(1:NRIMX+JPHEXT,        :,:,:)   = XRT(1:NRIMX+JPHEXT,        :,:,:)
+ENDIF
+IF(LEAST_ll() .AND. .NOT. L1D) THEN
+  XLBXUM(ILBX-NRIMX-JPHEXT+1:ILBX,:,:)     = XUT(NIU-NRIMX-JPHEXT+1:NIU,    :,:)
+  XLBXVM(ILBX-NRIMX-JPHEXT+1:ILBX,:,:)     = XVT(NIU-NRIMX-JPHEXT+1:NIU,    :,:)
+  XLBXWM(ILBX-NRIMX-JPHEXT+1:ILBX,:,:)     = XWT(NIU-NRIMX-JPHEXT+1:NIU,    :,:)
+  XLBXTHM(ILBX-NRIMX-JPHEXT+1:ILBX,:,:)   = XTHT(NIU-NRIMX-JPHEXT+1:NIU,    :,:)
+  XLBXRM(ILBX-NRIMX-JPHEXT+1:ILBX,:,:,:)   = XRT(NIU-NRIMX-JPHEXT+1:NIU,    :,:,:)
+ENDIF
+IF(LSOUTH_ll() .AND. .NOT. L1D .AND. .NOT. L2D) THEN
+  XLBYUM(:,1:NRIMY+JPHEXT,        :)     = XUT(:,1:NRIMY+JPHEXT,      :)
+  XLBYVM(:,1:NRIMY+JPHEXT,        :)     = XVT(:,2:NRIMY+JPHEXT+1,      :)
+  XLBYWM(:,1:NRIMY+JPHEXT,        :)     = XWT(:,1:NRIMY+JPHEXT,  :)
+  XLBYTHM(:,1:NRIMY+JPHEXT,        :)    = XTHT(:,1:NRIMY+JPHEXT,      :)
+  XLBYRM(:,1:NRIMY+JPHEXT,        :,:)   = XRT(:,1:NRIMY+JPHEXT,      :,:)
+ENDIF
+IF(LNORTH_ll().AND. .NOT. L1D .AND. .NOT. L2D) THEN
+  XLBYUM(:,ILBY-NRIMY-JPHEXT+1:ILBY,:)     = XUT(:,NJU-NRIMY-JPHEXT+1:NJU,  :)
+  XLBYVM(:,ILBY-NRIMY-JPHEXT+1:ILBY,:)     = XVT(:,NJU-NRIMY-JPHEXT+1:NJU,  :)
+  XLBYWM(:,ILBY-NRIMY-JPHEXT+1:ILBY,:)     = XWT(:,NJU-NRIMY-JPHEXT+1:NJU,  :)
+  XLBYTHM(:,ILBY-NRIMY-JPHEXT+1:ILBY,:)    = XTHT(:,NJU-NRIMY-JPHEXT+1:NJU,  :)
+  XLBYRM(:,ILBY-NRIMY-JPHEXT+1:ILBY,:,:)   = XRT(:,NJU-NRIMY-JPHEXT+1:NJU,  :,:)
+ENDIF
+DO JSV = 1, NSV
+  IF(LWEST_ll() .AND. .NOT. L1D) &
+  XLBXSVM(1:NRIMX+JPHEXT,        :,:,JSV)   = XSVT(1:NRIMX+JPHEXT,        :,:,JSV)
+  IF(LEAST_ll() .AND. .NOT. L1D) &
+  XLBXSVM(ILBX-NRIMX-JPHEXT+1:ILBX,:,:,JSV)   = XSVT(NIU-NRIMX-JPHEXT+1:NIU,    :,:,JSV)
+  IF(LSOUTH_ll() .AND. .NOT. L1D .AND. .NOT. L2D) &
+  XLBYSVM(:,1:NRIMY+JPHEXT,        :,JSV)   = XSVT(:,1:NRIMY+JPHEXT,      :,JSV)
+  IF(LNORTH_ll() .AND. .NOT. L1D .AND. .NOT. L2D) &
+  XLBYSVM(:,ILBY-NRIMY-JPHEXT+1:ILBY,:,JSV)   = XSVT(:,NJU-NRIMY-JPHEXT+1:NJU,  :,JSV)
+END DO
+!
+!
+!*       5.8   Add a perturbation to a basic state :
+!
+IF(LPERTURB) CALL SET_PERTURB(TZEXPREFILE)
+!
+!
+!*       5.9   Anelastic correction and pressure:
+!
+IF (.NOT.LOCEAN) THEN
+  CALL ICE_ADJUST_BIS(XPABST,XTHT,XRT)
+  IF ( .NOT. L1D ) CALL PRESSURE_IN_PREP(XDXX,XDYY,XDZX,XDZY,XDZZ)
+  CALL ICE_ADJUST_BIS(XPABST,XTHT,XRT)
+END IF
+!
+!
+!*       5.10  Compute THETA, vapor and cloud mixing ratio
+!
+IF (CIDEAL == 'RSOU') THEN
+    ALLOCATE(ZEXN(NIU,NJU,NKU))         
+  ALLOCATE(ZT(NIU,NJU,NKU))  
+  ALLOCATE(ZTHL(NIU,NJU,NKU))              
+  ALLOCATE(ZRT(NIU,NJU,NKU))              
+  ALLOCATE(ZCPH(NIU,NJU,NKU))        
+  ALLOCATE(ZLVOCPEXN(NIU,NJU,NKU))        
+  ALLOCATE(ZLSOCPEXN(NIU,NJU,NKU))  
+  ALLOCATE(ZFRAC_ICE(NIU,NJU,NKU))
+  ALLOCATE(ZRSATW(NIU,NJU,NKU))
+  ALLOCATE(ZRSATI(NIU,NJU,NKU))             
+  ALLOCATE(ZBUF(NIU,NJU,NKU,16))
+  ZRT=XRT(:,:,:,1)+XRT(:,:,:,2)+XRT(:,:,:,4)
+IF (LOCEAN) THEN
+  ZEXN(:,:,:)= 1.
+  ZT=XTHT
+  ZTHL=XTHT
+  ZCPH=XCPD+ XCPV * XRT(:,:,:,1)
+  ZLVOCPEXN = XLVTT
+  ZLSOCPEXN = XLSTT
+ELSE
+  ZEXN=(XPABST/XP00) ** (XRD/XCPD)
+  ZT=XTHT*(XPABST/XP00)**(XRD/XCPD)
+  ZCPH=XCPD+ XCPV * XRT(:,:,:,1)+ XCL *XRT(:,:,:,2)  + XCI * XRT(:,:,:,4)
+  ZLVOCPEXN = (XLVTT + (XCPV-XCL) * (ZT-XTT))/(ZCPH*ZEXN)
+  ZLSOCPEXN = (XLSTT + (XCPV-XCI) * (ZT-XTT))/(ZCPH*ZEXN)
+  ZTHL=XTHT-ZLVOCPEXN*XRT(:,:,:,2)-ZLSOCPEXN*XRT(:,:,:,4)
+  CALL TH_R_FROM_THL_RT(CST, NEBN, SIZE(ZFRAC_ICE), 'T',ZFRAC_ICE,XPABST,ZTHL,ZRT,XTHT,XRT(:,:,:,1), &
+                        XRT(:,:,:,2),XRT(:,:,:,4),ZRSATW, ZRSATI,OOCEAN=.FALSE.,&
+                        PBUF=ZBUF)
+END IF
+  DEALLOCATE(ZEXN)         
+  DEALLOCATE(ZT)       
+  DEALLOCATE(ZCPH)        
+  DEALLOCATE(ZLVOCPEXN)        
+  DEALLOCATE(ZLSOCPEXN)
+  DEALLOCATE(ZTHL) 
+  DEALLOCATE(ZRT)
+  DEALLOCATE(ZBUF)
+! Coherence test
+  IF ((.NOT. LUSERI) ) THEN
+    IF (MAXVAL(XRT(:,:,:,4))/= 0) THEN
+       WRITE(NLUOUT,FMT=*) "*********************************"             
+       WRITE(NLUOUT,FMT=*) 'WARNING'      
+       WRITE(NLUOUT,FMT=*) 'YOU HAVE LUSERI=FALSE '
+       WRITE(NLUOUT,FMT=*) ' BUT WITH YOUR RADIOSOUNDING Ri/=0'
+       WRITE(NLUOUT,FMT=*) MINVAL(XRT(:,:,:,4)),MAXVAL(XRT(:,:,:,4))
+       WRITE(NLUOUT,FMT=*) "*********************************"       
+    ENDIF  
+  ENDIF
+  IF ((.NOT. LUSERC)) THEN
+    IF (MAXVAL(XRT(:,:,:,2))/= 0) THEN          
+      WRITE(NLUOUT,FMT=*) "*********************************"
+      WRITE(NLUOUT,FMT=*) 'WARNING'    
+      WRITE(NLUOUT,FMT=*) 'YOU HAVE LUSERC=FALSE '
+      WRITE(NLUOUT,FMT=*) 'BUT WITH YOUR RADIOSOUNDING RC/=0'
+      WRITE(NLUOUT,FMT=*) MINVAL(XRT(:,:,:,2)),MAXVAL(XRT(:,:,:,2))      
+      WRITE(NLUOUT,FMT=*) "*********************************"
+    ENDIF  
+  ENDIF
+      ! on remet les bonnes valeurs pour NRR
+  IF(CCLOUD=='NONE') NRR=1
+  IF(CCLOUD=='REVE') NRR=2
+END IF
+!
+!-------------------------------------------------------------------------------
+!
+!*  	 6.    INITIALIZE SCALAR VARIABLES FOR CHEMISTRY
+!   	       -----------------------------------------
+!
+!  before calling chemistry
+CCONF = 'START'
+CSTORAGE_TYPE='TT'                  
+CALL IO_File_close(TZEXPREFILE)  ! Close the EXPRE file
+!
+IF ( LCH_INIT_FIELD ) CALL CH_INIT_FIELD_n(1, NLUOUT, NVERB)
+!
+! Initialization LIMA variables by ORILAM 
+IF (CCLOUD == 'LIMA' .AND. ((LORILAM).OR.(LDUST).OR.(LSALT))) &
+    CALL AER2LIMA(XSVT, XRHODREF, XRT(:,:,:,1), XPABST, XTHT, XZZ)
+!-------------------------------------------------------------------------------
+!
+!*  	 7.    INITIALIZE LEVELSET FOR IBM
+!   	       ---------------------------
+!
+IF (LIBM_LSF) THEN
+  !
+  ! In their current state, the IBM can only be used in
+  ! combination with cartesian coordinates and flat orography.
+  !
+  IF ((CZS.NE."FLAT").OR.(.NOT.LCARTESIAN)) THEN
+    CALL PRINT_MSG(NVERB_FATAL,'GEN','PREP_IDEAL_CASE','IBM can only be used with flat ground')
+  ENDIF
+  !
+  ALLOCATE(XIBM_LS(NIU,NJU,NKU,4))
+  !
+  CALL IBM_INIT_LS(XIBM_LS)
+  !
+ENDIF
+!
+!-------------------------------------------------------------------------------
+!
+!*   	 8.    WRITE THE FMFILE 
+!   	       ----------------
+!
+CALL SECOND_MNH2(ZTIME1)
+!
+NNPRAR = 22 + 2*(NRR+NSV)   &    ! 22 = number of grid variables + reference 
+       + 8 + 17                  ! state variables + dimension variables
+                                 ! 2*(8+NRR+NSV) + 1 = number of prognostic
+                                 ! variables at time t and t-dt
+NTYPE=1
+!
+CALL IO_File_add2list(TINIFILE,TRIM(CINIFILE),'MNH','WRITE',KLFINPRAR=NNPRAR,KLFITYPE=NTYPE,KLFIVERB=NVERB)
+!
+CALL IO_File_open(TINIFILE)
+!
+CALL IO_Header_write(TINIFILE)
+!
+CALL WRITE_DESFM_n(1,TINIFILE)
+!
+CALL WRITE_LFIFM_n(TINIFILE,'')  ! There is no DAD model for PREP_IDEAL_CASE
+!
+CALL SECOND_MNH2(ZTIME2)
+!
+XT_STORE = XT_STORE + ZTIME2 - ZTIME1
+!
+!-------------------------------------------------------------------------------
+!
+!*     9.     EXTERNALIZED SURFACE
+!             --------------------
+!
+!
+IF (CSURF =='EXTE') THEN
+  IF (LEN_TRIM(CINIFILEPGD)==0) THEN
+    IF (LEN_TRIM(CPGD_FILE)/=0) THEN
+      CINIFILEPGD=CPGD_FILE
+    ELSE
+      !callabortstop
+      CALL PRINT_MSG(NVERB_FATAL,'GEN','PREP_IDEAL_CASE','CINIFILEPGD needed in NAM_LUNITn')
+    ENDIF      
+  ENDIF
+  CALL SURFEX_ALLOC_LIST(1)
+  YSURF_CUR => YSURF_LIST(1)
+  CALL READ_ALL_NAMELISTS(YSURF_CUR,'MESONH','PRE',.FALSE.)              
+  ! Switch to model 1 surface variables
+  CALL GOTO_SURFEX(1)
+  !* definition of physiographic fields
+  ! computed ...
+  IF (LEN_TRIM(CPGD_FILE)==0 .OR. .NOT. LREAD_GROUND_PARAM) THEN
+    TPGDFILE => TINIFILE
+    CALL PGD_GRID_SURF_ATM(YSURF_CUR%UG, YSURF_CUR%U,YSURF_CUR%GCP,'MESONH',TINIFILE%CNAME,'MESONH',.TRUE.,HDIR='-')
+    CALL PGD_SURF_ATM     (YSURF_CUR,'MESONH',TINIFILE%CNAME,'MESONH',.TRUE.)
+    CALL IO_File_add2list(TINIFILEPGD,TRIM(CINIFILEPGD),'PGD','WRITE',KLFINPRAR=NNPRAR,KLFITYPE=NTYPE,KLFIVERB=NVERB)
+    CALL IO_File_open (TINIFILEPGD)
+    TPGDFILE => TINIFILEPGD
+  ELSE
+  ! ... or read from file.
+    CALL INIT_PGD_SURF_ATM( YSURF_CUR, 'MESONH', 'PGD',               &
+                            '                            ', '      ', &
+                            TDTCUR%nyear, TDTCUR%nmonth,              &
+                            TDTCUR%nday, TDTCUR%xtime                 )
+!
+  END IF
+  !
+  !* forces orography from atmospheric file
+  IF (.NOT. LREAD_ZS) CALL MNHPUT_ZS_n
+  !
+  ! on ecrit un nouveau fichier PGD que s'il n'existe pas
+  IF (LEN_TRIM(CPGD_FILE)==0 .OR. .NOT. LREAD_GROUND_PARAM) THEN
+    !* writing of physiographic fields in the file
+    CSTORAGE_TYPE='PG'
+    !
+    CALL IO_Header_write(TINIFILEPGD)
+    CALL IO_Field_write(TINIFILEPGD,'JPHEXT', JPHEXT)    
+    CALL IO_Field_write(TINIFILEPGD,'SURF','EXTE')
+    CALL IO_Field_write(TINIFILEPGD,'L1D', L1D)
+    CALL IO_Field_write(TINIFILEPGD,'L2D', L2D)
+    CALL IO_Field_write(TINIFILEPGD,'PACK',LPACK)
+    CALL WRITE_HGRID(1,TINIFILEPGD)
+    !
+    TOUTDATAFILE => TINIFILEPGD
+    !
+    TFILE_SURFEX => TINIFILEPGD
+    ALLOCATE(YSURF_CUR%DUO%CSELECT(0))    
+    CALL WRITE_PGD_SURF_ATM_n(YSURF_CUR,'MESONH')
+    NULLIFY(TFILE_SURFEX)
+    CSTORAGE_TYPE='TT'
+  ENDIF
+  !
+  !
+  !* rereading of physiographic fields and definition of prognostic fields
+  !* writing of all surface fields
+  TOUTDATAFILE => TINIFILE
+  TFILE_SURFEX => TINIFILE
+  CALL PREP_SURF_MNH('                            ','      ')
+  NULLIFY(TFILE_SURFEX)
+ELSE
+  CSURF = "NONE"
+END IF
+!
+!-------------------------------------------------------------------------------
+!
+!*     10.     CLOSES THE FILE
+!             ---------------
+!
+IF (CSURF =='EXTE' .AND. (LEN_TRIM(CPGD_FILE)==0 .OR. .NOT. LREAD_GROUND_PARAM)) THEN
+  CALL IO_File_close(TINIFILEPGD)
+ENDIF
+CALL IO_File_close(TINIFILE)
+IF( LEN_TRIM(CPGD_FILE) /= 0 ) THEN
+  CALL IO_File_close(TPGDFILE)
+ENDIF
+!
+!
+!-------------------------------------------------------------------------------
+!
+!*      11.    PRINTS ON OUTPUT-LISTING
+!              ------------------------
+!
+IF (NVERB >= 5) THEN
+  WRITE(NLUOUT,FMT=*) 'PREP_IDEAL_CASE: LCARTESIAN,CIDEAL,CZS=', &
+                                    LCARTESIAN,CIDEAL,CZS 
+  WRITE(NLUOUT,FMT=*) 'PREP_IDEAL_CASE: LUSERV=',LUSERV
+  WRITE(NLUOUT,FMT=*) 'PREP_IDEAL_CASE: XLON0,XLAT0,XBETA,XRPK,XLONORI,XLATORI=', &
+                                    XLON0,XLAT0,XBETA,XRPK,XLONORI,XLATORI
+  WRITE(NLUOUT,FMT=*) 'PREP_IDEAL_CASE: XDELTAX,XDELTAY=',XDELTAX,XDELTAY
+  WRITE(NLUOUT,FMT=*) 'PREP_IDEAL_CASE: NVERB=',NVERB
+  IF(LCARTESIAN) THEN
+    WRITE(NLUOUT,FMT=*) 'PREP_IDEAL_CASE: No map projection used.'
+  ELSE
+    IF (XRPK == 1.) THEN
+      WRITE(NLUOUT,FMT=*) 'PREP_IDEAL_CASE: Polar stereo used.'
+    ELSE IF (XRPK == 0.) THEN
+      WRITE(NLUOUT,FMT=*) 'PREP_IDEAL_CASE: Mercator used.'
+    ELSE
+      WRITE(NLUOUT,FMT=*) 'PREP_IDEAL_CASE: Lambert used, cone factor=',XRPK 
+    END IF
+  END IF
+END IF
+!
+IF (NVERB >= 5) THEN
+  WRITE(NLUOUT,FMT=*) 'PREP_IDEAL_CASE: IIB, IJB, IKB=',NIB,NJB,NKB
+  WRITE(NLUOUT,FMT=*) 'PREP_IDEAL_CASE: IIU, IJU, IKU=',NIU,NJU,NKU
+END IF
+!
+!
+!*       28.1   print statistics!
+!
+  !
+  CALL SECOND_MNH2(ZTIME2)
+  XT_START=XT_START+ZTIME2-ZEND
+  !
+  ! Set File Timing OUTPUT
+  !
+  CALL SET_ILUOUT_TIMING(TLUOUT0)
+  !
+  ! Compute global time
+  !
+  CALL TIME_STAT_ll(XT_START,ZTOT)
+  !
+  !
+  IMI = 1
+  CALL TIME_HEADER_ll(IMI)
+  !
+  CALL TIME_STAT_ll(XT_STORE,ZTOT,      ' STORE-FIELDS','=')
+  CALL  TIMING_SEPARATOR('+')
+  CALL  TIMING_SEPARATOR('+')  
+  WRITE(YMI,FMT="(I0)") IMI
+  CALL TIME_STAT_ll(XT_START,ZTOT,      ' MODEL'//YMI,'+')
+  CALL  TIMING_SEPARATOR('+')
+  CALL  TIMING_SEPARATOR('+')
+  CALL  TIMING_SEPARATOR('+')
+WRITE(NLUOUT,FMT=*) ' '
+WRITE(NLUOUT,FMT=*) '****************************************************'
+WRITE(NLUOUT,FMT=*) '* PREP_IDEAL_CASE: PREP_IDEAL_CASE ENDS CORRECTLY. *'
+WRITE(NLUOUT,FMT=*) '****************************************************'
+!
+CALL FINALIZE_MNH()
+!
+!
+CONTAINS
+INCLUDE "th_r_from_thl_rt.func.h"
+INCLUDE "compute_frac_ice.func.h"
+END PROGRAM PREP_IDEAL_CASE
diff --git a/src/PHYEX/ext/prep_nest_pgd.f90 b/src/PHYEX/ext/prep_nest_pgd.f90
new file mode 100644
index 0000000000000000000000000000000000000000..4a2352d7736938047c49746ff2bfb416e4357fb1
--- /dev/null
+++ b/src/PHYEX/ext/prep_nest_pgd.f90
@@ -0,0 +1,408 @@
+!MNH_LIC Copyright 1995-2021 CNRS, Meteo-France and Universite Paul Sabatier
+!MNH_LIC This is part of the Meso-NH software governed by the CeCILL-C licence
+!MNH_LIC version 1. See LICENSE, CeCILL-C_V1-en.txt and CeCILL-C_V1-fr.txt
+!MNH_LIC for details. version 1.
+!-----------------------------------------------------------------
+!     #####################
+      PROGRAM PREP_NEST_PGD
+!     #####################
+!
+!!****  *PREP_NEST_PGD* - to make coherent pgd files for nesting
+!!
+!!    PURPOSE
+!!    -------
+!!
+!!       The purpose of this program is to prepare pgd files with which
+!!       nesting can be performed. A pgd file must be coherent with its
+!!       father:
+!!         The average of orography of fine model on each of its father grid
+!!       mesh must be the same as its father orography.
+!!
+!!       All the pgd files are read at the begining of the program,
+!!       then they are checked, and recursively, the orography of a father
+!!       is replaced by the averaged orography from ist son.
+!!
+!!       The control data are given in the namelist file PRE_NEST.nam
+!!
+!! &NAM_NEST_PGD1 CPGD='coarser model' /
+!! &NAM_NEST_PGD2 CPGD='medium model' , IDAD=1 /
+!! &NAM_NEST_PGD3 CPGD='medium model' , IDAD=1 /
+!! &NAM_NEST_PGD4 CPGD='fine model' , IDAD=2 /
+!! &NAM_NEST_PGD5 CPGD='fine model' , IDAD=2 /
+!! &NAM_NEST_PGD6 CPGD='fine model' , IDAD=3 /
+!! &NAM_NEST_PGD7 CPGD='very fine model' , IDAD=6 /
+!! &NAM_NEST_PGD8 CPGD='very very fine model' , IDAD=7 /
+!!
+!!        In each namelist is given the name of the pgd file, and the number
+!!      of its father. This one MUST be smaller.
+!!        There is one output file for each input file, with the suffix
+!!      '.nest' added at the end of the file name (even if the file has not
+!!      been changed).
+!!
+!!        In the case of the namelist above, one obtain something like:
+!!
+!!   +----------------------------------------------------------+
+!!   |                                                 1        |
+!!   |   +-----------------------+                              |
+!!   |   |                    2  |                              |
+!!   |   |                       |                              |
+!!   |   |              +-+      |                              |
+!!   |   | +-------+    |5|      |   +-----------------------+  |
+!!   |   | |  4    |    +-+      |   |   +----------+     3  |  |
+!!   |   | +-------+             |   |   |+------+ 6|        |  |
+!!   |   +-----------------------+   |   || +-+ 7|  |        |  |
+!!   |                               |   || |8|  |  |        |  |
+!!   |                               |   || +-+  |  |        |  |
+!!   |                               |   |+------+  |        |  |
+!!   |                               |   +----------+        |  |
+!!   |                               +-----------------------+  |
+!!   +----------------------------------------------------------+
+!!
+!!
+!!**  METHOD
+!!    ------
+!!
+!!    EXTERNAL
+!!    --------
+!!
+!!
+!!    IMPLICIT ARGUMENTS
+!!    ------------------
+!!
+!!
+!!    REFERENCE
+!!    ---------
+!!
+!!      Book 2
+!!
+!!    AUTHOR
+!!    ------
+!!	
+!!      V.Masson  Meteo-France
+!!
+!!    MODIFICATIONS
+!!    -------------
+!!      Original    26/09/95
+!!                  30/07/97 (Masson) split of mode_lfifm_pgd
+!!                  2014 (M.Faivre)
+!!                  06/2015 (M.Moge) parallelization 
+!!      J.Escobar : 15/09/2015 : WENO5 & JPHEXT <> 1 
+!!      J.Escobar : 19/04/2016 : Pb IOZ/NETCDF , missing OPARALLELIO=.FALSE. for PGD files
+!!  06/2016     (G.Delautier) phasage surfex 8
+!!      P.Wautelet : 08/07/2016 : removed MNH_NCWRIT define
+!!  Philippe Wautelet: 05/2016-04/2018: new data structures and calls for I/O
+!  P. Wautelet 07/02/2019: force TYPE to a known value for IO_File_add2list
+!  P. Wautelet 06/07/2021: use FINALIZE_MNH
+!-------------------------------------------------------------------------------
+!
+!*       0.    DECLARATIONS
+!              ------------
+!
+USE MODD_CONF
+USE MODD_CONF_n
+USE MODD_CST
+USE MODD_DIM_n
+USE MODD_IO,               ONLY: TFILE_SURFEX, TPTR2FILE
+USE MODD_GRID_n,           ONLY: XZSMT
+USE MODD_LUNIT,            ONLY: TPGDFILE,TLUOUT0,TOUTDATAFILE
+USE MODD_MNH_SURFEX_n
+USE MODD_NESTING
+USE MODD_PARAMETERS
+USE MODD_VAR_ll,           ONLY: NPROC, IP, NMNH_COMM_WORLD
+!
+use mode_field,            only: Ini_field_list
+USE MODE_FINALIZE_MNH,     only: FINALIZE_MNH
+USE MODE_IO,               only: IO_Init, IO_Pack_set
+USE MODE_IO_FIELD_READ,    only: IO_Field_read
+USE MODE_IO_FIELD_WRITE,   only: IO_Field_write, IO_Header_write
+USE MODE_IO_FILE,          only: IO_File_close, IO_File_open
+USE MODE_IO_MANAGE_STRUCT, only: IO_File_add2list
+USE MODE_ll
+USE MODE_MNH_WORLD,        ONLY: INIT_NMNH_COMM_WORLD
+USE MODE_MODELN_HANDLER
+USE MODE_MPPDB
+USE MODE_SPLITTINGZ_ll,    ONLY: INI_PARAZ_ll
+!
+USE MODI_DEFINE_MASK_n
+USE MODI_INIT_HORGRID_ll_n
+USE MODI_INIT_PGD_SURF_ATM
+USE MODI_NEST_FIELD_n
+USE MODI_NEST_ZSMT_n
+USE MODI_OPEN_NESTPGD_FILES
+USE MODI_READ_ALL_NAMELISTS
+USE MODI_READ_HGRID
+USE MODI_RETRIEVE1_NEST_INFO_n
+USE MODI_VERSION
+USE MODI_WRITE_PGD_SURF_ATM_N
+USE MODE_INI_CST, ONLY: INI_CST
+!
+IMPLICIT NONE
+!
+!*       0.1   Declaration of local variables
+!              ------------------------------
+!
+INTEGER, DIMENSION(JPMODELMAX) :: NXSIZE   ! number of grid points for each model
+INTEGER, DIMENSION(JPMODELMAX) :: NYSIZE   ! in x and y-directions
+                                           ! relatively to its father grid
+!
+INTEGER                        :: ILUOUT0
+INTEGER                        :: IINFO_ll ! return code of // routines
+INTEGER                        :: JPGD     ! loop control
+CHARACTER(LEN=28)              :: YMY_NAME,YDAD_NAME
+CHARACTER(LEN=2)               :: YSTORAGE_TYPE
+LOGICAL, DIMENSION(JPMODELMAX) :: L1D_ALL  ! Flag for      1D conf. for each PGD
+LOGICAL, DIMENSION(JPMODELMAX) :: L2D_ALL  ! Flag for      2D conf. for each PGD
+LOGICAL, DIMENSION(JPMODELMAX) :: LPACK_ALL! Flag for packing conf. for each PGD
+!
+INTEGER                        :: JTIME,ITIME
+INTEGER                        :: IIMAX,IJMAX,IKMAX
+INTEGER                        :: IDXRATIO,IDYRATIO
+INTEGER                        :: IDAD
+INTEGER                        :: II
+LOGICAL     :: GISINIT
+!
+TYPE(TPTR2FILE),DIMENSION(:),ALLOCATABLE        :: TZFILEPGD     ! Input  PGD files
+TYPE(TPTR2FILE),DIMENSION(:),ALLOCATABLE,TARGET :: TZFILENESTPGD ! Output PGD files
+!
+!-------------------------------------------------------------------------------
+!
+CALL MPPDB_INIT()
+!
+CALL VERSION
+CPROGRAM='NESPGD'
+!
+CALL IO_Init()
+!!$CALL SET_JP_ll(JPMODELMAX,JPHEXT,JPVEXT,JPHEXT)
+!
+!*       1.    INITIALIZATION OF PHYSICAL CONSTANTS
+!              ------------------------------------
+!
+CALL INI_CST
+!
+!-------------------------------------------------------------------------------
+!
+!*       2.    OPENING OF THE FILES
+!              ---------------------
+!
+NVERB=1
+!
+CALL OPEN_NESTPGD_FILES(TZFILEPGD,TZFILENESTPGD)
+CALL SET_JP_ll(JPMODELMAX,JPHEXT,JPVEXT,JPHEXT)
+!
+ILUOUT0 = TLUOUT0%NLU
+!
+CALL SURFEX_ALLOC_LIST(NMODEL)
+YSURF_CUR => YSURF_LIST(1)
+CALL READ_ALL_NAMELISTS(YSURF_CUR,'MESONH','PRE',.FALSE.)
+!
+!-------------------------------------------------------------------------------
+!
+!*       3.    READING OF THE GRIDS
+!              --------------------
+!
+CALL INI_FIELD_LIST()
+!
+CALL SET_DAD0_ll()
+DO JPGD=1,NMODEL
+  ! read and set dimensions and ratios of model JPGD
+  CALL IO_Field_read(TZFILEPGD(JPGD)%TZFILE,'IMAX',   IIMAX)
+  CALL IO_Field_read(TZFILEPGD(JPGD)%TZFILE,'JMAX',   IJMAX)
+  CALL IO_Field_read(TZFILEPGD(JPGD)%TZFILE,'DXRATIO',NDXRATIO_ALL(JPGD))
+  CALL IO_Field_read(TZFILEPGD(JPGD)%TZFILE,'DYRATIO',NDYRATIO_ALL(JPGD))
+  CALL IO_Field_read(TZFILEPGD(JPGD)%TZFILE,'XSIZE',  NXSIZE(JPGD))
+  CALL IO_Field_read(TZFILEPGD(JPGD)%TZFILE,'YSIZE',  NYSIZE(JPGD))
+  CALL IO_Field_read(TZFILEPGD(JPGD)%TZFILE,'XOR',    NXOR_ALL(JPGD))
+  CALL IO_Field_read(TZFILEPGD(JPGD)%TZFILE,'YOR',    NYOR_ALL(JPGD))
+  CALL SET_DIM_ll(IIMAX, IJMAX, 1)
+  ! compute origin and end of local subdomain of model JPGD
+  ! initialize variables from MODD_NESTING, origin and end of global model JPGD in coordinates of its father
+  IF ( NDAD(JPGD) > 0 ) THEN
+    NXEND_ALL(JPGD) = NXOR_ALL(JPGD) + NXSIZE(JPGD) - 1 + 2*JPHEXT
+    NYEND_ALL(JPGD) = NYOR_ALL(JPGD) + NYSIZE(JPGD) - 1 + 2*JPHEXT
+  ELSE  ! this is not a son model
+    NXOR_ALL(JPGD) = 1
+    NXEND_ALL(JPGD) = IIMAX+2*JPHEXT
+    NYOR_ALL(JPGD) = 1
+    NYEND_ALL(JPGD) = IJMAX+2*JPHEXT
+    NDXRATIO_ALL(JPGD) = 1
+    NDYRATIO_ALL(JPGD) = 1
+  ENDIF
+  ! initialize variables from MODD_DIM_ll, origin and end of global model JPGD in coordinates of its father
+  CALL SET_XOR_ll(NXOR_ALL(JPGD), JPGD)
+  CALL SET_XEND_ll(NXEND_ALL(JPGD), JPGD)
+  CALL SET_YOR_ll(NYOR_ALL(JPGD), JPGD)
+  CALL SET_YEND_ll(NYEND_ALL(JPGD), JPGD)
+  ! set the father model of model JPGD
+! set MODD_NESTING::NDAD using MODD_DIM_ll::NDAD
+! MODD_DIM_ll::NDAD was filled in OPEN_NESTPGD_FILES
+  CALL SET_DAD_ll(NDAD(JPGD), JPGD)
+  ! set the ratio of model JPGD in MODD_DIM_ll
+  CALL SET_XRATIO_ll(NDXRATIO_ALL(JPGD), JPGD)
+  CALL SET_YRATIO_ll(NDYRATIO_ALL(JPGD), JPGD)
+END DO
+!
+! reading of the grids
+!
+  CALL SET_DIM_ll(NXEND_ALL(1)-NXOR_ALL(1)+1-2*JPHEXT, NYEND_ALL(1)-NYOR_ALL(1)+1-2*JPHEXT, 1) 
+  CALL INI_PARAZ_ll(IINFO_ll)
+DO JPGD=1,NMODEL
+  CALL GOTO_MODEL(JPGD)
+  CALL GO_TOMODEL_ll(JPGD,IINFO_ll)
+  CALL GOTO_SURFEX(JPGD)
+  CALL IO_Field_read(TZFILEPGD(JPGD)%TZFILE,'L1D', L1D_ALL(JPGD))
+  CALL IO_Field_read(TZFILEPGD(JPGD)%TZFILE,'L2D', L2D_ALL(JPGD))
+  CALL IO_Field_read(TZFILEPGD(JPGD)%TZFILE,'PACK',LPACK_ALL(JPGD))
+  CALL IO_Pack_set(L1D_ALL(JPGD),L2D_ALL(JPGD),LPACK_ALL(JPGD))
+  CALL READ_HGRID(JPGD,TZFILEPGD(JPGD)%TZFILE,YMY_NAME,YDAD_NAME,YSTORAGE_TYPE)
+  CSTORAGE_TYPE='PG'
+END DO
+  CALL INI_PARAZ_ll(IINFO_ll)
+!
+!-------------------------------------------------------------------------------
+!
+!*       5.    MASKS DEFINITIONS
+!              -----------------
+!
+
+DO JPGD=1,NMODEL
+  CALL GOTO_SURFEX(JPGD)
+  CALL GOTO_MODEL(JPGD)
+  CALL GO_TOMODEL_ll(JPGD,IINFO_ll)
+!!$  CALL INIT_HORGRID_ll_n()
+  CALL DEFINE_MASK_n()
+END DO
+!
+!-------------------------------------------------------------------------------
+!
+!*       6.    MODIFICATION OF OROGRAPHY
+!              -------------------------
+!
+WRITE(ILUOUT0,FMT=*)
+WRITE(ILUOUT0,FMT=*) 'field ZS   of all models'
+DO JPGD=NMODEL,1,-1
+  CALL GOTO_MODEL(JPGD)
+  CALL GO_TOMODEL_ll(JPGD,IINFO_ll)
+  CALL GOTO_SURFEX(JPGD)
+  CALL NEST_FIELD_n('ZS    ')
+END DO
+!
+! *** Adaptation of smooth topography for SLEVE coordinate
+!
+WRITE(ILUOUT0,FMT=*)
+WRITE(ILUOUT0,FMT=*) 'field ZSMT of all models'
+DO JPGD=1,NMODEL
+  CALL GOTO_MODEL(JPGD)
+  CALL GO_TOMODEL_ll(JPGD,IINFO_ll)
+  CALL GOTO_SURFEX(JPGD)
+  CALL NEST_ZSMT_n('ZSMT  ')
+END DO
+
+!
+!-------------------------------------------------------------------------------
+!
+!*       7.    SURFACE FIELDS READING
+!              ----------------------
+!
+DO JPGD=1,NMODEL
+  IF (LEN_TRIM(TZFILEPGD(JPGD)%TZFILE%CNAME)>0) THEN
+    CALL GO_TOMODEL_ll(JPGD,IINFO_ll)
+    TPGDFILE => TZFILEPGD(JPGD)%TZFILE
+    CALL GOTO_MODEL(JPGD)
+    CALL GOTO_SURFEX(JPGD)
+    CALL INIT_PGD_SURF_ATM(YSURF_CUR,'MESONH','PGD',                         &
+         '                            ','      ',&
+         NUNDEF,NUNDEF,NUNDEF,XUNDEF             )
+  END IF
+END DO
+!
+!-------------------------------------------------------------------------------
+!
+!*       8.    MODIFICATION OF OROGRAPHY
+!              -------------------------
+!
+DO JPGD=1,NMODEL
+  CALL GOTO_MODEL(JPGD)
+  CALL GO_TOMODEL_ll(JPGD,IINFO_ll)
+  CALL GOTO_SURFEX(JPGD)
+  CALL MNHPUT_ZS_n
+END DO
+!
+!-------------------------------------------------------------------------------
+!
+!*      10.    SURFACE FIELDS WRITING
+!              ----------------------
+!
+DO JPGD=1,NMODEL
+  CALL GO_TOMODEL_ll(JPGD,IINFO_ll)
+  TPGDFILE     => TZFILEPGD(JPGD)%TZFILE
+  TOUTDATAFILE => TZFILENESTPGD(JPGD)%TZFILE
+  CALL GOTO_MODEL(JPGD)
+  !Open done here because grid dimensions have to be known
+  CALL IO_File_open(TZFILENESTPGD(JPGD)%TZFILE)
+  CALL GOTO_SURFEX(JPGD)
+  TFILE_SURFEX => TZFILENESTPGD(JPGD)%TZFILE
+  CALL WRITE_PGD_SURF_ATM_n(YSURF_CUR,'MESONH')
+  NULLIFY(TFILE_SURFEX)
+  CALL IO_Field_write(TZFILENESTPGD(JPGD)%TZFILE,'ZSMT',XZSMT)
+END DO
+!
+!-------------------------------------------------------------------------------
+!
+!*      12.    Write configuration variables in the output file
+!              ------------------------------------------------
+!
+!
+DO JPGD=1,NMODEL
+  CALL IO_Header_write(TZFILENESTPGD(JPGD)%TZFILE)
+  IF ( ASSOCIATED(TZFILENESTPGD(JPGD)%TZFILE%TDADFILE) ) THEN
+    CALL IO_Field_write(TZFILENESTPGD(JPGD)%TZFILE,'DXRATIO',NDXRATIO_ALL(JPGD))
+    CALL IO_Field_write(TZFILENESTPGD(JPGD)%TZFILE,'DYRATIO',NDYRATIO_ALL(JPGD))
+    CALL IO_Field_write(TZFILENESTPGD(JPGD)%TZFILE,'XOR',    NXOR_ALL(JPGD))
+    CALL IO_Field_write(TZFILENESTPGD(JPGD)%TZFILE,'YOR',    NYOR_ALL(JPGD))
+  END IF
+  CALL IO_Field_write(TZFILENESTPGD(JPGD)%TZFILE,'SURF',  'EXTE')
+  CALL IO_Field_write(TZFILENESTPGD(JPGD)%TZFILE,'L1D',   L1D_ALL(JPGD))
+  CALL IO_Field_write(TZFILENESTPGD(JPGD)%TZFILE,'L2D',   L2D_ALL(JPGD))
+  CALL IO_Field_write(TZFILENESTPGD(JPGD)%TZFILE,'PACK',  LPACK_ALL(JPGD))
+  CALL IO_Field_write(TZFILENESTPGD(JPGD)%TZFILE,'JPHEXT',JPHEXT)
+END DO
+!
+!-------------------------------------------------------------------------------
+!
+!*      13.    CLOSING OF THE FILES
+!              --------------------
+!
+DO JPGD=1,NMODEL
+  CALL IO_File_close(TZFILEPGD(JPGD)%TZFILE)
+  CALL IO_File_close(TZFILENESTPGD(JPGD)%TZFILE)
+END DO
+!
+!* loop to spare enough time to transfer commands before end of program
+ITIME=0
+DO JTIME=1,1000000
+  ITIME=ITIME+1
+END DO
+!-------------------------------------------------------------------------------
+!
+!*      12.    EPILOGUE
+!              --------
+!
+WRITE(ILUOUT0,FMT=*)
+WRITE(ILUOUT0,FMT=*) '************************************************'
+WRITE(ILUOUT0,FMT=*) '* PREP_NEST_PGD: PREP_NEST_PGD ends correctly. *'
+WRITE(ILUOUT0,FMT=*) '************************************************'
+!
+!-------------------------------------------------------------------------------
+!
+!*      10.    FINALIZE THE PARALLEL SESSION
+!              -----------------------------
+!
+CALL FINALIZE_MNH()
+
+! CALL END_PARA_ll(IINFO_ll)
+!
+! CALL SURFEX_DEALLO_LIST
+!
+!-------------------------------------------------------------------------------
+
+END PROGRAM PREP_NEST_PGD
diff --git a/src/PHYEX/ext/prep_pgd.f90 b/src/PHYEX/ext/prep_pgd.f90
new file mode 100644
index 0000000000000000000000000000000000000000..617389344cce3df0e04725dc6174037299dab045
--- /dev/null
+++ b/src/PHYEX/ext/prep_pgd.f90
@@ -0,0 +1,340 @@
+!MNH_LIC Copyright 1995-2023 CNRS, Meteo-France and Universite Paul Sabatier
+!MNH_LIC This is part of the Meso-NH software governed by the CeCILL-C licence
+!MNH_LIC version 1. See LICENSE, CeCILL-C_V1-en.txt and CeCILL-C_V1-fr.txt
+!MNH_LIC for details. version 1.
+!-----------------------------------------------------------------
+!     ################
+      PROGRAM PREP_PGD
+!     ################
+!!
+!!    PURPOSE
+!!    -------
+!!   This program prepares the physiographic data fields.
+!!
+!!    METHOD
+!!    ------
+!!
+!!
+!!    EXTERNAL
+!!    --------
+!!
+!!
+!!    IMPLICIT ARGUMENTS
+!!    ------------------
+!!
+!!
+!!    REFERENCE
+!!    ---------
+!!
+!!    AUTHOR
+!!    ------
+!!
+!!    F. Mereyde                  Meteo-France
+!!
+!!    MODIFICATION
+!!    ------------
+!!
+!!    Original     21/07/95
+!!    Modification 26/07/95       Treatment of orography and subgrid-scale
+!!                                orography roughness length (V. Masson)
+!!    Modification 22/05/96       Variable CSTORAGE_TYPE (V. Masson)
+!!    Modification 25/05/96       Modification of splines, correction on z0rel
+!!                                and set limits for some surface varaibles
+!!    Modification 12/06/96       Treatment of a rare case for ZPGDZ0EFF (Masson)
+!!    Modification 22/11/96       removes the filtering. It will have to be
+!!                                performed in ADVANCED_PREP_PGD (Masson)
+!!    Modification 15/03/99       **** MAJOR MODIFICATION **** (Masson)
+!!                                PGD fields are now defined from the cover
+!!                                type fractions in the grid meshes
+!!                                User can still include its own data, and
+!!                                even additional (dummy) fields
+!!    Modificatio 06/00           patch approach, for vegetation related variable (Solmon/Masson)
+!                                  averaging is performed on subclass(=patch) of nature
+!!                08/03/01        add chemical emission treatment (D.Gazen)
+!!    Modification 15/10/01       allow namelists in different orders (I.Mallet)
+!!
+!!                                ################################
+!!    MODIFICATION 13/10/03       EXTERNALIZED VERSION (V. Masson)
+!!                                ################################
+!!    J.Escobar    4/04/2008      Improve checking --> add STATUS=OLD in open_ll(PRE_PGD1.nam,...
+!!
+!!    Modification 30/03/2012     Add NAM_NCOUT for netcdf output (S.Bielli)
+!!    S.Bielli     23/04/2014     supress writing of LAt and LON in NETCDF case
+!!    S.Bielli     20/11/2014     add writing of LAt and LON in NETCDF case
+!!    M.Moge       01/03/2015     use MPPDB + SPLIT_GRID is now called in PGD_GRID. Here we extend 
+!!                                the new grid on the halo with EXTEND_GRID_ON_HALO (M.Moge)
+!!    M.Moge          06/2015     write NDXRATIO,NDYRATIO,NXSIZE,NYSIZE,NXOR,NYOR in .lfi output file
+!!    J.Escobar : 15/09/2015 : WENO5 & JPHEXT <> 1 
+!!    J.Escobar : 05/10/2015 : missing JPHEXT for LAT/LON/ZS/ZSMT writing
+!!    M.Moge          11/2015     disable the creation of files on multiple 
+!!                                Z-levels when using parallel IO for PREP_PGD
+!!    06/2016     (G.Delautier) phasage surfex 8
+!!    P.Wautelet : 08/07/2016 : removed MNH_NCWRIT define
+!!    10/2016    (S.Faroux S.Bielli) correction for NHALO=0
+!!  01/2018      (G.Delautier) SURFEX 8.1
+!!  Philippe Wautelet: 05/2016-04/2018: new data structures and calls for I/O
+!!  Q. Rodier 01/2019 : add a new filtering for very high slopes in NAM_ZSFILTER
+!  P. Wautelet 07/02/2019: force TYPE to a known value for IO_File_add2list
+!  P. Wautelet 07/02/2019: remove OPARALLELIO argument from open and close files subroutines
+!                          (nsubfiles_ioz is now determined in IO_File_add2list)
+!  P. Wautelet 14/02/2019: remove CLUOUT/CLUOUT0 and associated variables
+!  P. Wautelet 06/07/2021: use FINALIZE_MNH
+!----------------------------------------------------------------------------
+!
+!*    0.     DECLARATION
+!            -----------
+!
+USE MODD_CONF,   ONLY : CPROGRAM, L1D, L2D, LPACK, LCARTESIAN
+USE MODD_CONF_n,ONLY : CSTORAGE_TYPE
+USE MODD_LUNIT,  ONLY : TLUOUT0
+USE MODD_LUNIT_n,ONLY : LUNIT_MODEL
+USE MODD_PARAMETERS, ONLY : XUNDEF
+USE MODD_IO,               only: TFILEDATA, TFILE_OUTPUTLISTING, TFILE_SURFEX
+use modd_precision,   only: LFIINT
+USE MODD_IO_SURF_MNH, ONLY : NHALO
+USE MODD_SPAWN, ONLY : NDXRATIO,NDYRATIO,NXSIZE,NYSIZE,NXOR,NYOR
+!
+use mode_field,            only: Ini_field_list
+USE MODE_FINALIZE_MNH,     only: FINALIZE_MNH
+USE MODE_IO,               only: IO_Config_set, IO_Init
+USE MODE_IO_FIELD_WRITE,   only: IO_Field_write, IO_Header_write
+USE MODE_IO_FILE,          only: IO_File_close, IO_File_open
+USE MODE_IO_MANAGE_STRUCT, only: IO_File_add2list
+use mode_ll
+USE MODE_MODELN_HANDLER
+USE MODE_MSG
+USE MODE_POS
+!
+USE MODI_ZSMT_PGD
+!
+!JUAN
+USE MODN_CONFZ
+USE MODD_PARAMETERS, ONLY : JPHEXT  
+USE MODD_CONF, ONLY       : NHALO_CONF_MNH => NHALO
+!JUAN
+!
+USE MODI_READ_ALL_NAMELISTS
+USE MODI_VERSION
+USE MODI_PGD_GRID_SURF_ATM
+USE MODI_SPLIT_GRID
+USE MODI_PGD_SURF_ATM
+USE MODI_WRITE_PGD_SURF_ATM_N
+USE MODD_MNH_SURFEX_n
+!
+USE MODE_MPPDB
+USE MODI_EXTEND_GRID_ON_HALO
+!
+USE MODN_CONFIO, ONLY : NAM_CONFIO
+USE MODE_INI_CST, ONLY: INI_CST
+!
+IMPLICIT NONE
+!
+!
+!*    0.2    Declaration of local variables
+!            ------------------------------
+!
+INTEGER :: IRESP    ! return code for I/O
+INTEGER :: ILUOUT0
+INTEGER :: ILUNAM
+LOGICAL :: GFOUND
+CHARACTER(LEN=28) :: YDAD     =' '        ! name of dad of input FM file
+CHARACTER(LEN=28) :: CPGDFILE ='PGDFILE'  ! name of the output file
+CHARACTER(LEN=100) :: YMSG
+INTEGER           :: NZSFILTER=1          ! number of iteration for filter for fine   orography
+INTEGER           :: NLOCZSFILTER=3       ! number of iteration for filter of local fine orography
+LOGICAL           :: LHSLOP=.FALSE.       ! filtering of local slopes higher than XHSLOP   
+REAL              :: XHSLOP=1.0           ! slopes where the local fine filtering is applied   
+INTEGER           :: NSLEVE   =12         ! number of iteration for filter for smooth orography
+REAL              :: XSMOOTH_ZS = XUNDEF  ! optional uniform smooth orography for SLEVE coordinate
+REAL, DIMENSION(:,:),ALLOCATABLE   :: ZWORK ! work array for lat and lon reshape
+REAL, DIMENSION(:,:),ALLOCATABLE   :: ZWORK_LAT ! work array for lat and lon reshape
+REAL, DIMENSION(:,:),ALLOCATABLE   :: ZWORK_LON ! work array for lat and lon reshape
+INTEGER           :: IIMAX, IJMAX
+INTEGER           :: NHALO_MNH 
+TYPE(TFILEDATA),POINTER :: TZFILE     => NULL()
+TYPE(TFILEDATA),POINTER :: TZNMLFILE  => NULL() ! Namelist file
+!
+NAMELIST/NAM_PGDFILE/CPGDFILE, NHALO
+NAMELIST/NAM_ZSFILTER/NZSFILTER,NLOCZSFILTER,LHSLOP,XHSLOP
+NAMELIST/NAM_SLEVE/NSLEVE, XSMOOTH_ZS
+NAMELIST/NAM_CONF_PGD/JPHEXT, NHALO_MNH
+!------------------------------------------------------------------------------
+!
+CALL MPPDB_INIT()
+!
+CPROGRAM='PGD   '
+!
+!*    1.      Set default names and parallelized I/O
+!             --------------------------------------
+!
+CALL IO_Init()
+!
+NHALO=15
+!
+CALL IO_File_add2list(TLUOUT0,'OUTPUT_LISTING0','OUTPUTLISTING','WRITE')
+CALL IO_File_open(TLUOUT0)
+!
+!Set output file for PRINT_MSG
+TFILE_OUTPUTLISTING => TLUOUT0
+!
+LUNIT_MODEL(1)%TLUOUT => TLUOUT0
+ILUOUT0=TLUOUT0%NLU
+!
+!JUAN
+CALL IO_File_add2list(TZNMLFILE,'PRE_PGD1.nam','NML','READ')
+CALL IO_File_open(TZNMLFILE,KRESP=IRESP)
+ILUNAM = TZNMLFILE%NLU
+IF (IRESP.NE.0 ) THEN
+  WRITE(YMSG,*) 'file PRE_PGD1.nam not found, IRESP=', IRESP
+ !callabortstop
+  CALL PRINT_MSG(NVERB_FATAL,'GEN','PREP_PGD',YMSG)
+ENDIF
+!JUAN
+
+CALL POSNAM( TZNMLFILE, 'NAM_PGDFILE', GFOUND )
+IF (GFOUND) READ(UNIT=ILUNAM,NML=NAM_PGDFILE)
+CALL POSNAM( TZNMLFILE, 'NAM_ZSFILTER', GFOUND )
+IF (GFOUND) READ(UNIT=ILUNAM,NML=NAM_ZSFILTER)
+CALL POSNAM( TZNMLFILE, 'NAM_SLEVE', GFOUND )
+IF (GFOUND) READ(UNIT=ILUNAM,NML=NAM_SLEVE)
+!JUANZ
+CALL POSNAM( TZNMLFILE, 'NAM_CONFZ', GFOUND )
+IF (GFOUND) READ(UNIT=ILUNAM,NML=NAM_CONFZ)
+CALL POSNAM( TZNMLFILE, 'NAM_CONF_PGD', GFOUND )
+IF (GFOUND) THEN
+   NHALO_MNH = NHALO_CONF_MNH
+   READ(UNIT=ILUNAM,NML=NAM_CONF_PGD)
+   NHALO_CONF_MNH = NHALO_MNH
+ENDIF
+!JUANZ
+CALL POSNAM( TZNMLFILE, 'NAM_CONFIO', GFOUND )
+IF (GFOUND) READ(UNIT=ILUNAM,NML=NAM_CONFIO)
+CALL IO_Config_set()
+!
+CALL IO_File_close(TZNMLFILE)
+!
+!
+CALL SURFEX_ALLOC_LIST(1)
+YSURF_CUR => YSURF_LIST(1)
+CALL READ_ALL_NAMELISTS(YSURF_CUR,'MESONH','PRE',.FALSE.)
+!
+CALL INI_FIELD_LIST()
+!
+CALL GOTO_MODEL(1)
+CALL GOTO_SURFEX(1)
+!
+CALL VERSION
+CSTORAGE_TYPE = 'PG'
+!
+CALL INI_CST
+!
+!
+!*    2.      Preparation of surface physiographic fields
+!             -------------------------------------------
+!
+!*            Initializes the grid
+!             --------------------
+! 
+CALL PGD_GRID_SURF_ATM(YSURF_CUR%UG, YSURF_CUR%U,YSURF_CUR%GCP,'MESONH',&
+                       '                            ','      ',.FALSE.,HDIR='-')
+!
+CALL EXTEND_GRID_ON_HALO('MESONH',YSURF_CUR%UG, YSURF_CUR%U,&
+        YSURF_CUR%UG%G%NGRID_PAR, YSURF_CUR%UG%G%XGRID_PAR)
+!
+!
+!*            Initializes all physiographic fields
+!             ------------------------------------
+!
+CALL PGD_SURF_ATM(YSURF_CUR,'MESONH','                            ','      ',.FALSE.)
+!
+!
+!*    3.      Writes the physiographic fields
+!             -------------------------------
+!
+CALL IO_File_add2list(TZFILE,CPGDFILE,'PGD','WRITE',KLFINPRAR=INT(1,KIND=LFIINT),KLFITYPE=1,KLFIVERB=5)
+!
+CALL IO_File_open(TZFILE)
+!
+CALL IO_Header_write(TZFILE)
+!
+CALL IO_Field_write(TZFILE,'SURF','EXTE')
+CALL IO_Field_write(TZFILE,'L1D', L1D)
+CALL IO_Field_write(TZFILE,'L2D', L2D)
+CALL IO_Field_write(TZFILE,'PACK',LPACK)
+IF ( NDXRATIO <= 0 .AND. NDYRATIO <= 0 ) THEN
+  NDXRATIO = 1
+  NDYRATIO = 1
+ENDIF
+IF ( NXSIZE < 0 .AND. NYSIZE < 0 ) THEN
+  NXSIZE = 0
+  NYSIZE = 0
+ENDIF
+IF ( NXOR <= 0 .AND. NYOR <= 0 ) THEN
+  NXOR = 1
+  NYOR = 1
+ENDIF
+CALL IO_Field_write(TZFILE,'DXRATIO',NDXRATIO)
+CALL IO_Field_write(TZFILE,'DYRATIO',NDYRATIO)
+CALL IO_Field_write(TZFILE,'XSIZE',  NXSIZE)
+CALL IO_Field_write(TZFILE,'YSIZE',  NYSIZE)
+CALL IO_Field_write(TZFILE,'XOR',    NXOR)
+CALL IO_Field_write(TZFILE,'YOR',    NYOR)
+CALL IO_Field_write(TZFILE,'JPHEXT', JPHEXT)
+!
+TFILE_SURFEX => TZFILE
+ALLOCATE(YSURF_CUR%DUO%CSELECT(0))
+CALL WRITE_PGD_SURF_ATM_n(YSURF_CUR,'MESONH')
+NULLIFY(TFILE_SURFEX) !Probably not necessary
+!
+!*    4.      Computes and writes smooth orography for SLEVE coordinate
+!             ---------------------------------------------------------
+CALL ZSMT_PGD(TZFILE,NZSFILTER,NSLEVE,NLOCZSFILTER,LHSLOP,XHSLOP,XSMOOTH_ZS)
+!
+IF (.NOT.LCARTESIAN) THEN
+!!!! WRITE LAT and LON
+   CALL GET_DIM_PHYS_ll('B',IIMAX,IJMAX)
+   ALLOCATE(ZWORK(IIMAX+NHALO*2,IJMAX+NHALO*2))
+   ALLOCATE(ZWORK_LAT(IIMAX+2*JPHEXT,IJMAX+2*JPHEXT))
+   ALLOCATE(ZWORK_LON(IIMAX+2*JPHEXT,IJMAX+2*JPHEXT))
+   ZWORK=RESHAPE(YSURF_CUR%UG%G%XLAT, (/ (IIMAX+NHALO*2),(IJMAX+NHALO*2) /) )
+   IF (NHALO/=0) THEN   
+     ZWORK_LAT=ZWORK(NHALO:(IIMAX+NHALO+1),NHALO:(IJMAX+NHALO+1))
+   ELSE
+     ZWORK_LAT(2:IIMAX+1,2:IJMAX+1)=ZWORK
+     ZWORK_LAT(1,:) = ZWORK_LAT(2,:)
+     ZWORK_LAT(IIMAX+2,:) = ZWORK_LAT(IIMAX+1,:)
+     ZWORK_LAT(:,1) = ZWORK_LAT(:,2)
+     ZWORK_LAT(:,IJMAX+2) = ZWORK_LAT(:,IJMAX+1)
+   ENDIF
+   ZWORK=RESHAPE(YSURF_CUR%UG%G%XLON, (/ IIMAX+NHALO*2,IJMAX+NHALO*2 /) )
+   IF (NHALO/=0) THEN   
+     ZWORK_LON=ZWORK(NHALO:(IIMAX+NHALO+1),NHALO:(IJMAX+NHALO+1))
+   ELSE
+     ZWORK_LON(2:IIMAX+1,2:IJMAX+1)=ZWORK
+     ZWORK_LON(1,:) = ZWORK_LON(2,:)
+     ZWORK_LON(IIMAX+2,:) = ZWORK_LON(IIMAX+1,:)
+     ZWORK_LON(:,1) = ZWORK_LON(:,2)
+     ZWORK_LON(:,IJMAX+2) = ZWORK_LON(:,IJMAX+1)           
+   ENDIF   
+   CALL IO_Field_write(TZFILE,'LAT',ZWORK_LAT)
+   CALL IO_Field_write(TZFILE,'LON',ZWORK_LON)
+   !
+   DEALLOCATE(ZWORK,ZWORK_LAT,ZWORK_LON)
+END IF
+!
+!
+WRITE(ILUOUT0,*)
+WRITE(ILUOUT0,*) '***************************'
+WRITE(ILUOUT0,*) '* PREP_PGD ends correctly *'
+WRITE(ILUOUT0,*) '***************************'
+!
+!*    6.      Close parallelized I/O
+!             ----------------------
+!
+CALL IO_File_close(TZFILE)
+!
+CALL FINALIZE_MNH()
+!
+!-------------------------------------------------------------------------------
+!
+END PROGRAM PREP_PGD
diff --git a/src/PHYEX/ext/prep_real_case.f90 b/src/PHYEX/ext/prep_real_case.f90
new file mode 100644
index 0000000000000000000000000000000000000000..8cedd2db6306022147be0c79c5aeaa100a8d237d
--- /dev/null
+++ b/src/PHYEX/ext/prep_real_case.f90
@@ -0,0 +1,1451 @@
+!MNH_LIC Copyright 1995-2023 CNRS, Meteo-France and Universite Paul Sabatier
+!MNH_LIC This is part of the Meso-NH software governed by the CeCILL-C licence
+!MNH_LIC version 1. See LICENSE, CeCILL-C_V1-en.txt and CeCILL-C_V1-fr.txt
+!MNH_LIC for details. version 1.
+!-----------------------------------------------------------------
+!     ######################
+      PROGRAM PREP_REAL_CASE
+!     ######################
+!
+!!****  *PREP_REAL_CASE* - program to write an initial FM file from real case
+!!                         situation.
+!!
+!!    PURPOSE
+!!    -------
+!!
+!!       The purpose of this program is to prepare an initial meso-NH file
+!!    (LFIFM and DESFM files) filled by some fields of a real situation. 
+!!    General data are given by the MESO-NH user in the namelist file 
+!!    'PRE_REAL1.nam'. The fields are obtained from three sources:
+!!        - an atmospheric input file, which can be:
+!!          * an Aladin file, itself obtained from an Arpege file with
+!!            the Aladin routine "FULLPOS".
+!!          * a grib file (ECMWF, Grib Arpege or Grib Aladin)
+!!          * a MESONH file
+!!        - an physiographic data file.
+!!
+!!       1) Fields obtained from the Atmospheric file:
+!!          -----------------------------------------
+!!
+!!      - the projection parameters (checked with PGD file): 
+!!                 reference latitude and longitude
+!!                 parameter of projection
+!!                 angle of rotation of the domain
+!!
+!!      - the horizontal grid definition (checked with PGD file):
+!!                 grid mesh
+!!                 latitude and longitude of the reference point 
+!!                                   (with data from PRE_REAL1.nam)
+!!
+!!      - thermodynamical 3D and 2D fields:
+!!                 potential temperature
+!!                 vapor mixing ratio
+!!
+!!      - dynamical fields:
+!!                 three components of the wind
+!!
+!!      - reference anelastic state variables:
+!!                 profile of virtual potential temperature
+!!                 profile of dry density
+!!                 Exner function at model top
+!!
+!!      - total dry air mass
+!!
+!!
+!!       2) Fields obtained from the physiographic data file:
+!!          ------------------------------------------------
+!!
+!!      - the projection parameters: 
+!!                 reference latitude and longitude
+!!                 parameter of projection
+!!                 angle of rotation of the domain
+!!
+!!      - the horizontal grid definition:
+!!                 grid mesh
+!!                 latitude and longitude of the reference point 
+!!                                   (with data from PRE_REAL1.nam)
+!!      - physiografic fields: (orographic, vegetation, soil and radiation fields)
+!!
+!!
+!!       3) Data obtained from the namelist file PRE_REAL1.nam:
+!!          --------------------------------------------------
+!! 
+!!      - type of equations system
+!!      - vertical grid definition
+!!      - number of points in x and y directions
+!!      - level of verbosity
+!!      - name of the different files
+!!
+!!
+!!**  METHOD
+!!    ------
+!!      In this program, once the MESO-NH domain is calculated, all the
+!!      2D or 3D fields are computed on the MESO-NH horizontal domain WITH 
+!!      the external points. This is particularly important for the large
+!!      scale fields during the MESO-NH run.
+!!
+!!   1) The following PREP_REAL_CASE program:
+!!
+!!      - set default values for global variables which will be written in 
+!!        DESFM file (by calling DEFAULT_DESFM1); lateral boundary conditions
+!!        are open.
+!!
+!!      - opens the different files (by calling OPEN_PRC_FILES).
+!!
+!!      - initializes physical constants (by calling INI_CST).
+!!
+!!      - initializes the horizontal domain from the data read in the 
+!!        descriptive part of the Aladin file and the directives read in the
+!!        namelist file (routines READ_GENERAL and SET_SUBDOMAIN in 
+!!        READ_ALL_DATA). This MESO-NH domain is a part of the Aladin domain.
+!!
+!!      - initializes global variables from namelists and the MESO-NH
+!!        vertical grid definition variables in the namelist file
+!!        (routine READ_VER_GRID).
+!!
+!!      - initializes the physiographic 2D fields from the physiographic data
+!!        file, in particular the MESO-NH orography.
+!!
+!!      - reads the 3D and 2D variable fields in the Grib file
+!!        (routine READ_ALL_DATA_GRIB_CASE),
+!!        if  HATMFILETYPE='GRIBEX':
+!!           absolute temperature
+!!           specific humidity
+!!           horizontal contravariant wind
+!!           surface pressure
+!!           large scale orography
+!!
+!!      - reads the 3D and 2D variable fields in the input MESONH file
+!!        (routine READ_ALL_DATA_MESONH_CASE), if HATMFILETYPE='MESONH':
+!!           potential temperature
+!!           vapor mixing ratio
+!!           horizontal wind
+!!           other mixing ratios
+!!           turbulence prognostic and semi-prognostic variables
+!!           large scale orography
+!!
+!!      - computes some geometric variables (routines SM_GRIDPROJ and METRICS),
+!!        in particular:
+!!          * altitude 3D array
+!!          * metric coefficients
+!!          * jacobian
+!!
+!!      - initializes MESO-NH thermodynamical fields:
+!!          * changes of variables (routine VER_PREP_mmmmmm_CASE):
+!!              absolute temperature --> virtual potential temperature
+!!              specific humidity    --> vapor mixing ratio
+!!          * interpolates/extrapolates the fields from the large scale 
+!!            orography to the MESO-NH one (routine VER_INT_THERMO in
+!!            VER_THERMO, by using a shifting function method).
+!!            in water vapor case, the interpolations are always performed
+!!            on relative humidity.
+!!          * the pressure is computed on each grid by integration of the
+!!            hydrostatic equation from bottom or top. When input atmospheric
+!!            file is a MESO-NH one, information about the difference between
+!!            hydrostatic pressure and total pressure is kept and interpolated
+!!            during the entire PREP_REAL_CASE process.
+!!          * interpolates the fields to the MESO-NH vertical grid
+!!            (also by routine VER_INT_THERMO in VER_THERMO).
+!!          * computes the potential temperature (routine VER_THERMO).
+!!          * sets to zero the mixing ratios, except the vapor mixing ratio
+!!            (VER_THERMO).
+!!
+!!      - initializes the reference anelastic state variables (routine SET_REFZ
+!!        in VER_THERMO).
+!!
+!!      - computes the total dry air mass (routine DRY_MASS in VER_THERMO).
+!!
+!!      - initializes MESO-NH dynamical variables:
+!!          * changes Aladin contravariant wind into true horizontal wind
+!!            (in subroutine VER_PREP).
+!!          * interpolates/extrapolates the momentum from the large scale 
+!!            orography to the MESO-NH one (routine VER_INT_DYN in
+!!            VER_DYN, by using a shifting function method).
+!!          * interpolates the fields to the MESO-NH vertical grid
+!!            (also by routine VER_INT_DYN in VER_DYN). The fields
+!!            are located on a horizontal Arakawa A-grid, as the Aladin fields.
+!!          * The momentum is interpolated to the Arakawa C-grid 
+!!            (routine VER_DYN).
+!!          * A first guess of the vertical momentum, verifying the 
+!!            uncompressible continuity equation and the material lower boundary
+!!            condition against the ground, is computed (routine WGUESS).
+!!          * computes the final non-divergent wind field (routine 
+!!            ANEL_BALANCE).
+!!
+!!      - copies the interpolated fields also at t-dt and in the large scale
+!!        fields (routine INI_PROG_VAR).
+!!  
+!!      - writes the DESFM and LFIFM files (routines WRITE_DESFM1 and
+!!        WRITE_LFIFM1).
+!!
+!!
+!!   2) Some conventions are used in this program and its subroutines because
+!!      of the number of different grids and fields:
+!!
+!!      - subscripts:
+!!          * the subscripts I and J are used for all the horizontal grid.
+!!          * the subcript K is used for the MESO-NH vertical grid (increasing
+!!            from bottom to top).
+!!          * the subscript L is used for the Aladin or input Mesonh grids
+!!            (increasing from bottom to top).
+!!
+!!      - suffixes:
+!!          * _LS: 
+!!              If used for a geographic or horizontal grid definition variable,
+!!               this variable is connected to the large horizontal domain.
+!!              If used for a surface variable, this variable corresponds to
+!!               the large scale orography, and therefore will be modified.
+!!              If used for another variable, this variable is discretized
+!!               on the Aladin or input MESONH file vertical grid 
+!!               (large-scale orography with input vertical discretization,
+!!                either coming from eta levels or input Gal-Chen grid).
+!!          * _MX:
+!!              Such a variable is discretized on the mixed grid.
+!!              (large-scale orography with output Gal-Chen vertical grid
+!!               discretization)
+!!          * _SH:
+!!              Such a variable is discretized on the shifted grid.
+!!              (fine orography with a shifted vertical grid, NOT Gal-Chen)
+!!          * no suffix:
+!!              The variable is discretized on the MESO-NH grid.
+!!              (fine orography with output Gal-Chen vertical grid discretization)
+!!
+!!      - additional pre-suffixes: (for pressure, Exner and altitude fields)
+!!          * MASS:
+!!              The variable is discretized on a mass point
+!!          * FLUX:
+!!              The variable is discretized on a flux point
+!!
+!!
+!!      - names of variables: for a physical variable VAR:
+!!          * pVARs        is the variable itself.
+!!          * pRHODVARs    is the variable multiplied by the dry density rhod.
+!!          * pRHODJVARs   is the variable multiplied by the dry density rhod
+!!                         and the Jacobian.            
+!!          * pRVARs       is the variable multiplied by rhod_ref, the anelastic
+!!                         reference state dry density and the Jacobian.
+!!        where p and s are the appropriate prefix and suffix.
+!!
+!!      - allocation of arrays: the arrays are allocated
+!!          * just before their initialization for the general arrays stored in 
+!!            modules.
+!!          * in the subroutine in which they are declared for the local arrays 
+!!            in a subroutine.
+!!          * in the routine in which they are initialized for the arrays 
+!!            defined in the monitor PREP_REAL_CASE. In this case they are in 
+!!            fact passed as pointer to the subroutines to allow their 
+!!            dynamical allocation (exception which confirms the rule: ZJ).
+!!
+!!
+!!    EXTERNAL
+!!    --------
+!!
+!!      Routine DEFAULT_DESFM1 : to set default values for variables which can be
+!!                              contained in DESFM file.
+!!      Routine OPEN_PRC_FILES: to open all files.
+!!      Routine INI_CST       : to initialize physical constants.
+!!      Routine READ_ALL_DATA_GRIB_CASE : to read all input data.
+!!      Routine READ_ALL_DATA_MESONH_CASE : to read all input data.
+!!      Routine SM_GRIDPROJ   : to compute some grid variables, in case of 
+!!                              conformal projection.
+!!      Routine METRICS       : to compute metric coefficients.
+!!      Routine VER_PREP_GRIBEX_CASE      : to prepare the interpolations.
+!!      Routine VER_PREP_MESONH_CASE      : to prepare the interpolations.
+!!      Routine VER_THERMO    : to perform the interpolation of thermodynamical
+!!                              variables.
+!!      Routine VER_DYN       : to perform the interpolation of dynamical
+!!                              variables.
+!!      Routine INI_PROG_VAR  : to initialize the prognostic varaibles not yet
+!!                              initialized
+!!      Routine WRITE_DESFM1  : to write a DESFM file.
+!!      Routine WRITE_LFIFM1  : to write a LFIFM file.
+!!      Routine IO_File_close : to close a FM-file (DESFM + LFIFM).
+!!
+!!      Module MODE_GRIDPROJ  : contains conformal projection routines
+!!    
+!!      Module MODI_DEFAULT_DESFM1  : interface module for routine DEFAULT_DESFM1
+!!      Module MODI_OPEN_PRC_FILES : interface module for routine OPEN_PRC_FILES
+!!      Module MODI_READ_ALL_DATA_MESONH_CASE : interface module for routine
+!!                                              READ_ALL_DATA_MESONH_CASE
+!!      Module MODI_METRICS        : interface module for routine METRICS
+!!      Module MODI_VER_PREP_GRIBEX_CASE      : interface module for routine
+!!                                              VER_PREP_GRIBEX_CASE
+!!      Module MODI_VER_PREP_MESONH_CASE      : interface module for routine
+!!                                              VER_PREP_MESONH_CASE
+!!      Module MODI_VER_THERMO     : interface module for routine VER_THERMO
+!!      Module MODI_VER_DYN        : interface module for routine VER_DYN
+!!      Module MODI_INI_PROG_VAR   : interface module for routine INI_PROG_VAR
+!!      Module MODI_WRITE_DESFM1   : interface module for routine WRITE_DESFM1
+!!      Module MODI_WRITE_LFIFM1   : interface module for routine WRITE_LFIFM1
+!!      
+!!
+!!    IMPLICIT ARGUMENTS
+!!    ------------------
+!!
+!!      Module MODD_CONF  : contains configuration variables for all models.
+!!         NVERB   : verbosity level for output-listing
+!!      Module MODD_CONF1 : contains configuration variables for model 1.
+!!         NRR     : number of moist variables
+!!      Module MODD_LUNIT : contains logical unit and names of files.
+!!      Module MODD_LUNIT : contains logical unit and names of files (model1).
+!!         CINIFILE: name of the FM file which will be used for the MESO-NH run.
+!!      Module MODD_GRID1 : contains grid variables.
+!!         XLAT    : latitude of the grid points
+!!         XLON    : longitudeof the grid points
+!!         XXHAT   : position xhat in the conformal plane
+!!         XYHAT   : position yhat in the conformal plane
+!!         XDXHAT  : horizontal local meshlength on the conformal plane
+!!         XDYHAT  : horizontal local meshlength on the conformal plane
+!!         XZS     : MESO-NH orography
+!!         XZZ     : altitude
+!!         XZHAT   : height zhat
+!!         XMAP    : map factor
+!!      Module MODD_LBC1 : contains declaration of lateral boundary conditions
+!!        CLBCX   : X-direction LBC type at left(1) and right(2) boundaries 
+!!        CLBCY   : Y-direction LBC type at left(1) and right(2) boundaries   
+!!      Module MODD_PARAM1 : contains declaration of the parameterizations' names
+!!
+!!    REFERENCE
+!!    ---------
+!!
+!!      Book 2
+!!
+!!    AUTHOR
+!!    ------
+!!	
+!!      V.Masson  Meteo-France
+!!
+!!    MODIFICATIONS
+!!    -------------
+!!      Original    01/01/95
+!!                  Sept. 21, 1995  (J.Stein and V.Masson) surface pressure
+!!                  Jan.  09, 1996  (V. Masson) pressure function deduced from
+!!                                  hydrostatic pressure
+!!                  Jan.  31, 1996  (V. Masson) possibility to initialize
+!!                                  atmospheric fields from MESONH file
+!!                  Mar.  18, 1996  (V. Masson) new vertical extrapolation of Ts
+!!                                  in case of initialization with MESONH file
+!!                  Apr   17, 1996  (J. Stein ) change the DEFAULT_DESFM CALL
+!!                  May   25, 1996  (V. Masson) Variable CSTORAGE_TYPE
+!!                  Aug   26, 1996  (V. Masson) Only thinshell approximation is
+!!                                  currently available.
+!!                  Sept  24, 1996  (V. Masson) add writing of varaibles for
+!!                                  nesting ('DAD_NAME', 'DXRATIO', 'DYRATIO')
+!!                  Oct   11, 1996  (V. Masson) L1D and L2D configurations
+!!                  Oct   28, 1996  (V. Masson) add deallocations and NVERB
+!!                                  default set to 1
+!!                  Dec   02, 1996  (V. Masson) vertical interpolation of
+!!                                  surface fields in aladin case
+!!                  Dec   12, 1996  (V. Masson) add LS vertical velocity
+!!                  Jan   16, 1997  (J. Stein)  Durran's anelastic system
+!!                  May   07, 1997  (V. Masson) add LS tke
+!!                  Jun   27, 1997  (V. Masson) add absolute pressure
+!!                  Jul   09, 1997  (V. Masson) add namelist NAM_REAL_CONF
+!!                  Jul   10, 1997  (V. Masson) add LS epsilon
+!!                  Aug   25, 1997  (V. Masson) add computing time analysis
+!!                  Jan   20, 1998  (J. Stein)  add LB and LS fields
+!!                  Apr,  30, 1998  (V. Masson) Large scale VEG and LAI
+!!                  Jun,  04, 1998  (V. Masson) Large scale D2 and Aladin ISBA
+!!                                              files
+!!                  Jun,  04, 1998  (V. Masson) Add new soil interface var.
+!!                  Jan   20, 1999  (J. Stein)  add a Boundaries call
+!!                  March 15  1999  (J. Pettre, V. Bousquet and V. Masson)
+!!                                              initialization from GRIB files
+!!                  Jul       2000 (F.solmon/V.Masson) Adaptation for patch 
+!!                                            according to GRIB or MESONH case
+!!                  Nov   22, 2000  (P.Tulet, I. Mallet) initialization
+!!                                              from GRIB MOCAGE file
+!!                  Fev   01, 2001 (D.Gazen) add module MODD_NSV for NSV variable
+!!                  Jul   02, 2001 (J.Stein) add LCARTESIAN case
+!!                  Oct   15, 2001 (I.Mallet) allow namelists in different orders
+!!                  Dec       2003 (V.Masson) removes surface calls
+!!                  Jun   01, 2002 (O.Nuissier) filtering of tropical cyclone
+!!                  Aou   09, 2005 (D.Barbary) add CDADATMFILE CDADBOGFILE
+!!                   May   2006    Remove KEPS
+!!                  Feb   02, 2012 (C. Mari) interpolation from MOZART
+!!                                  add call to READ_CHEM_NETCDF_CASE &
+!!                                  VER_PREP_NETCDF_CASE 
+!!                  Mar   2012    Add NAM_NCOUT for netcdf output
+!!                  July  2013     (Bosseur & Filippi) Adds Forefire
+!!                  Mars  2014     (J.Escobar) Missing 'full' UPDATE_METRICS for arp2lfi // run
+!!                   April 2014     (G.TANGUY) Add LCOUPLING
+!!                        2014     (M.Faivre)
+!!                  Fevr  2015     (M.Moge) Cleaning up
+!!                  Aug   2015     (M.Moge) removing EXTRAPOL on XDXX and XDYY in part 8
+!!    J.Escobar : 15/09/2015 : WENO5 & JPHEXT <> 1
+!!    M.Leriche        2015 : add LUSECHEM  dans NAM_CH_CONF 
+!!                  Feb   02, 2012 (C. Mari & BV) interpolation from CAMS
+!!                                  add call to READ_CAMS_NETCDF_CASE &
+!!                                  VER_PREP_NETCDF_CASE 
+!!      Modification    01/2016  (JP Pinty) Add LIMA
+!!      Modification    02/2016  (JP Pinty) Convert CAMS mix ratio to nbr conc
+!
+!!  06/2016     (G.Delautier) phasage surfex 8
+!!    P.Wautelet : 08/07/2016 : removed MNH_NCWRIT define
+!!     B.VIE 2016 : LIMA
+!!  Philippe Wautelet: 05/2016-04/2018: new data structures and calls for I/O
+!  P. Wautelet 07/02/2019: force TYPE to a known value for IO_File_add2list
+!  P. Wautelet 14/02/2019: remove CLUOUT/CLUOUT0 and associated variables
+!  S. Bielli      02/2019: sea salt: significant sea wave height influences salt emission; 5 salt modes
+!  P. Wautelet 20/03/2019: missing use MODI_INIT_SALT
+!  P. Wautelet 20/05/2019: add name argument to ADDnFIELD_ll + new ADD4DFIELD_ll subroutine
+!  T.Nagel        02/2021: add IBM
+!  P. Wautelet 06/07/2021: use FINALIZE_MNH
+!!  M. Leriche 26/01/2022: add reading of CAMS reanalysis for chemistry
+!!                         and/or for LIMA
+!-------------------------------------------------------------------------------
+!
+!*       0.    DECLARATIONS
+!              ------------
+!
+USE MODD_BUDGET,           ONLY: TBUCONF_ASSOCIATE
+USE MODD_CH_M9_n
+USE MODD_CH_MNHC_n,        ONLY: LUSECHAQ_n=>LUSECHAQ,LUSECHIC_n=>LUSECHIC, LUSECHEM_n=>LUSECHEM
+USE MODD_CONF
+USE MODD_CONF_n
+USE MODD_CST
+USE MODD_DIM_n
+!UPG*PT
+USE MODD_CH_AEROSOL
+USE MODD_DUST,             ONLY:  LDUST, NMODE_DST, CRGUNITD, XINISIG, XINIRADIUS, XN0MIN,&
+                                  LDSTCAMS
+!UPG*PT
+
+USE MODD_DYN_n,            CPRESOPT_n=>CPRESOPT, LRES_n=>LRES, XRES_n=>XRES , NITR_n=>NITR
+USE MODD_FIELD_n
+USE MODD_GR_FIELD_n
+USE MODD_GRID
+USE MODD_GRID_n
+USE MODD_HURR_CONF
+USE MODD_IBM_LSF,          ONLY: CIBM_TYPE, LIBM_LSF, NIBM_SMOOTH, XIBM_SMOOTH
+USE MODD_IBM_PARAM_n,      ONLY: XIBM_LS
+USE MODD_IO,               ONLY: TFILEDATA, TFILE_SURFEX
+USE MODD_LBC_n
+USE MODD_LES,              ONLY: LES_ASSOCIATE
+USE MODD_LSFIELD_n
+USE MODD_LUNIT,            ONLY: TPGDFILE,TLUOUT0,TOUTDATAFILE
+USE MODD_LUNIT_n,          ONLY: CINIFILE,TINIFILE,TLUOUT
+USE MODD_METRICS_n
+USE MODD_MNH_SURFEX_n
+USE MODD_NESTING
+USE MODD_NSV
+USE MODD_PARAMETERS
+USE MODD_PARAM_n
+USE MODD_PREP_REAL
+USE MODD_REF_n
+!UPG*PT
+USE MODD_SALT,             ONLY:  LSALT, NMODE_SLT, CRGUNITS, XINISIG_SLT, XINIRADIUS_SLT, XN0MIN_SLT,&
+                                  LSLTCAMS
+USE MODD_CH_AERO_n,        ONLY:  XM3D, XRHOP3D, XSIG3D, XRG3D, XN3D, XCTOTA3D
+!UPG*PT
+USE MODD_TURB_n
+!
+USE MODE_EXTRAPOL
+use mode_field,            only: Alloc_field_scalars, Ini_field_list, Ini_field_scalars
+USE MODE_FINALIZE_MNH,     only: FINALIZE_MNH
+USE MODE_GRIDCART
+USE MODE_GRIDPROJ
+USE MODE_IO,               only: IO_Init
+USE MODE_IO_FIELD_READ,    only: IO_Field_read
+USE MODE_IO_FIELD_WRITE,   only: IO_Header_write
+USE MODE_IO_FILE,          only: IO_File_close, IO_File_open
+USE MODE_IO_MANAGE_STRUCT, only: IO_File_add2list, IO_File_find_byname
+USE MODE_ll
+USE MODE_MODELN_HANDLER
+USE MODE_MPPDB
+USE MODE_MSG
+USE MODE_POS
+USE MODE_SPLITTINGZ_ll
+!
+USE MODI_BOUNDARIES
+USE MODI_COMPARE_DAD
+USE MODI_DEALLOCATE_MODEL1
+USE MODI_DEALLOC_PARA_LL
+USE MODI_DEFAULT_DESFM_n
+USE MODI_ERROR_ON_TEMPERATURE
+USE MODI_IBM_INIT_LS
+USE MODI_INI_PROG_VAR
+USE MODI_INIT_SALT
+USE MODI_LIMA_MIXRAT_TO_NCONC
+USE MODI_METRICS
+USE MODI_MNHREAD_ZS_DUMMY_n
+USE MODI_MNHWRITE_ZS_DUMMY_n
+USE MODI_OPEN_PRC_FILES
+USE MODI_PREP_SURF_MNH
+USE MODI_PRESSURE_IN_PREP
+USE MODI_READ_ALL_DATA_GRIB_CASE
+USE MODI_READ_ALL_DATA_MESONH_CASE
+USE MODI_READ_ALL_NAMELISTS
+!UPG*PT
+!USE MODI_READ_CAMS_DATA_NETCDF_CASE
+!USE MODI_READ_CHEM_DATA_NETCDF_CASE
+USE MODI_READ_CHEM_DATA_MOZART_CASE
+USE MODI_READ_CHEM_DATA_CAMS_CASE
+USE MODI_READ_LIMA_DATA_NETCDF_CASE
+USE MODI_AER2LIMA
+USE MODI_CH_AER_EQM_INIT_n
+!UPG*PT
+USE MODI_READ_VER_GRID
+USE MODI_SECOND_MNH
+USE MODI_SET_REF
+USE MODI_UPDATE_METRICS
+USE MODI_VER_DYN
+USE MODI_VER_PREP_GRIBEX_CASE
+USE MODI_VER_PREP_MESONH_CASE
+USE MODI_VER_PREP_NETCDF_CASE
+USE MODI_VERSION
+USE MODI_VER_THERMO
+USE MODI_WRITE_DESFM_n
+USE MODI_WRITE_LFIFM_n
+!
+USE MODN_CONF,             ONLY: JPHEXT , NHALO
+USE MODN_CONFZ
+USE MODD_PARAM_LIMA, ONLY: PARAM_LIMA_INIT, NMOD_CCN, NMOD_IFN
+USE MODE_INI_CST, ONLY: INI_CST
+!
+IMPLICIT NONE
+!
+!*       0.1   Declaration of local variables
+!              ------------------------------
+!
+CHARACTER(LEN=28)              :: YATMFILE    ! name of the Atmospheric file
+CHARACTER(LEN=6)               :: YATMFILETYPE! type of the Atmospheric file
+CHARACTER(LEN=28)              :: YCHEMFILE    ! name of the Chemical file
+CHARACTER(LEN=6)               :: YCHEMFILETYPE! type of the Chemical file
+!UP*PT
+!CHARACTER(LEN=28)              :: YCAMSFILE    ! name of the input CAMS file
+!CHARACTER(LEN=6)               :: YCAMSFILETYPE! type of the input CAMS file
+CHARACTER(LEN=28)              :: YLIMAFILE    ! name of the input MACC file
+CHARACTER(LEN=6)               :: YLIMAFILETYPE! type of the input MACC file
+!UP*PT
+CHARACTER(LEN=28)              :: YSURFFILE    ! name of the Surface file
+CHARACTER(LEN=6)               :: YSURFFILETYPE! type of the Surface file
+CHARACTER(LEN=28)              :: YPGDFILE    ! name of the physiographic data
+!                                             ! file
+!
+CHARACTER(LEN=28)              :: YDAD_NAME   ! true name of the atmospheric file
+!
+!* other variables
+!
+REAL,DIMENSION(:,:,:), ALLOCATABLE:: ZJ       ! Jacobian
+!
+!* file management variables and counters
+!
+INTEGER                           :: ILUOUT0  ! logical unit for listing file
+INTEGER                           :: IPRE_REAL1 ! logical unit for namelist file
+INTEGER                           :: IRESP    ! return code in FM routines
+LOGICAL                           :: GFOUND   ! Return code when searching namelist
+INTEGER                           :: NIU,NJU,NKU   ! Upper bounds in x,y,z directions
+!
+REAL :: ZSTART, ZEND, ZTIME1, ZTIME2, ZTOT, ZALL ! for computing time analysis
+REAL :: ZMISC, ZREAD, ZHORI, ZPREP, ZSURF, ZTHERMO, ZDYN, ZDIAG, ZWRITE
+REAL :: ZDG                                      ! diagnostics time in routines
+INTEGER                           :: IINFO_ll    ! return code of // routines
+! Namelist model variables
+CHARACTER(LEN=5)                  :: CPRESOPT
+INTEGER                           :: NITR
+LOGICAL                           :: LRES
+REAL                              :: XRES
+LOGICAL                           :: LSHIFT      ! flag to perform vertical shift or not.
+LOGICAL                           :: LDUMMY_REAL ! flag to read and interpolate
+                                                 !dummy fields from GRIBex file
+INTEGER                           :: JRR      ! loop counter for moist var.
+LOGICAL  :: LUSECHAQ
+LOGICAL  :: LUSECHIC
+LOGICAL  :: LUSECHEM
+INTEGER :: JN
+!
+TYPE(TFILEDATA),POINTER :: TZATMFILE => NULL()
+TYPE(TFILEDATA),POINTER :: TZPRE_REAL1FILE => NULL()
+!
+!
+!*       0.3   Declaration of namelists
+!              ------------------------
+!
+NAMELIST/NAM_REAL_CONF/ NVERB, CEQNSYS, CPRESOPT, LSHIFT, LDUMMY_REAL, &
+                        LRES, XRES, NITR,LCOUPLING, NHALO , JPHEXT
+! Filtering and balancing of the large-scale and radar tropical cyclone
+NAMELIST/NAM_HURR_CONF/ LFILTERING, CFILTERING,   &
+XLAMBDA, NK, XLATGUESS, XLONGUESS, XBOXWIND, XRADGUESS, NPHIL, NDIAG_FILT,   &
+NLEVELR0,LBOGUSSING,               & 
+XLATBOG, XLONBOG, XVTMAXSURF, XRADWINDSURF,       &
+XMAX, XC, XRHO_Z, XRHO_ZZ, XB_0, XBETA_Z, XBETA_ZZ,&
+XANGCONV0, XANGCONV1000, XANGCONV2000,            &
+                        CDADATMFILE, CDADBOGFILE
+ NAMELIST/NAM_AERO_CONF/ LORILAM, LINITPM, LDUST, XINIRADIUSI, XINIRADIUSJ,&
+                         XINISIGI, XINISIGJ, XN0IMIN, XN0JMIN, CRGUNIT, CRGUNITD,&
+                         LSALT, CRGUNITS, NMODE_DST, XINISIG, XINIRADIUS, XN0MIN,&
+                         XINISIG_SLT, XINIRADIUS_SLT, XN0MIN_SLT, NMODE_SLT, &
+                         LDSTCAMS, LSLTCAMS,CACTCCN,CCLOUD, NMOD_IFN, NMOD_CCN, LAERINIT
+
+NAMELIST/NAM_CH_CONF/ LUSECHAQ,LUSECHIC,LUSECHEM
+!
+NAMELIST/NAM_IBM_LSF/ LIBM_LSF, CIBM_TYPE, NIBM_SMOOTH, XIBM_SMOOTH
+!
+! name of dad of input FM file
+INTEGER                :: II, IJ, IGRID, ILENGTH
+CHARACTER (LEN=100)    :: HCOMMENT
+TYPE(LIST_ll), POINTER :: TZFIELDS_ll=>NULL()   ! list of fields to exchange
+!
+REAL, DIMENSION(:,:,:),   ALLOCATABLE :: ZLBXRHO, ZLBYRHO
+REAL, DIMENSION(:,:,:),   ALLOCATABLE :: ZLBXZZ, ZLBYZZ
+REAL, DIMENSION(:,:,:),   ALLOCATABLE :: ZLBXPABST, ZLBYPABST
+REAL, DIMENSION(:,:,:),   ALLOCATABLE :: ZLBXRM, ZLBYRM
+REAL, DIMENSION(:,:,:),   ALLOCATABLE :: ZLBXTHM, ZLBYTHM
+REAL, DIMENSION(:,:,:,:), ALLOCATABLE :: ZLBXSVM, ZLBYSVM
+!
+INTEGER :: ILBX,ILBY,IIB,IJB,IIE,IJE
+LOGICAL :: GAERINIT
+!-------------------------------------------------------------------------------
+!
+CALL MPPDB_INIT()
+!
+CALL GOTO_MODEL(1,ONOFIELDLIST=.TRUE.)
+!
+ZDIAG = 0.
+CALL SECOND_MNH (ZSTART)
+!
+ZHORI  = 0.
+ZSURF  = 0.
+ZTIME1 = ZSTART
+!
+!*       1.    SET DEFAULT VALUES
+!              ------------------
+!
+CALL VERSION
+CPROGRAM='REAL  '
+!
+CALL ALLOC_FIELD_SCALARS()
+CALL TBUCONF_ASSOCIATE()
+CALL LES_ASSOCIATE()
+CALL DEFAULT_DESFM_n(1)
+NRR=1
+IDX_RVT = 1
+!
+!-------------------------------------------------------------------------------
+!
+!*       2.    OPENNING OF THE FILES
+!              ---------------------
+CALL IO_Init()
+!
+CALL OPEN_PRC_FILES(TZPRE_REAL1FILE,YATMFILE, YATMFILETYPE,TZATMFILE &
+                                   ,YCHEMFILE,YCHEMFILETYPE &
+                                   ,YSURFFILE,YSURFFILETYPE &
+                                   ,YPGDFILE,TPGDFILE       &
+!UPG*PT
+!                                   ,YCAMSFILE,YCAMSFILETYPE)
+                                   ,YLIMAFILE,YLIMAFILETYPE)
+!UPG*PT
+ILUOUT0 = TLUOUT0%NLU
+TLUOUT => TLUOUT0
+!
+IF (YATMFILETYPE=='MESONH') THEN
+  LSHIFT = .FALSE.
+ELSE IF (YATMFILETYPE=='GRIBEX') THEN
+  LSHIFT = .TRUE.
+ELSE
+  LSHIFT = .TRUE.
+  WRITE(ILUOUT0,FMT=*) 'HATMFILETYPE WAS SET TO: '//TRIM(YATMFILETYPE)
+  WRITE(ILUOUT0,FMT=*) 'ONLY TWO VALUES POSSIBLE FOR HATMFILETYPE:'
+  WRITE(ILUOUT0,FMT=*) 'EITHER MESONH OR GRIBEX'
+  WRITE(ILUOUT0,FMT=*) '-> JOB ABORTED'
+ !callabortstop
+  CALL PRINT_MSG(NVERB_FATAL,'GEN','PREP_REAL_CASE','')
+END IF
+!                             
+LCPL_AROME=.FALSE.
+LCOUPLING=.FALSE.
+!
+!-------------------------------------------------------------------------------
+!
+!*       3.    INITIALIZATION OF PHYSICAL CONSTANTS
+!              ------------------------------------
+!
+CALL INI_CST
+!
+!-------------------------------------------------------------------------------
+!
+!*       4.    READING OF NAMELIST
+!              -------------------
+!
+!*       4.1   reading of configuration variables
+!
+IPRE_REAL1 = TZPRE_REAL1FILE%NLU
+!
+CALL INIT_NMLVAR
+CALL POSNAM( TZPRE_REAL1FILE, 'NAM_REAL_CONF', GFOUND )
+IF (GFOUND) READ(IPRE_REAL1,NAM_REAL_CONF)
+CALL PARAM_LIMA_INIT(CPROGRAM, TZPRE_REAL1FILE, .FALSE., ILUOUT0, .FALSE., .TRUE., .FALSE., 0)
+!
+CALL INI_FIELD_LIST()
+!
+CALL INI_FIELD_SCALARS()
+!
+!*       4.2   reading of values of some configuration variables in namelist
+!
+!
+!JUAN REALZ from prep_surfex
+!
+IF (YATMFILETYPE == 'GRIBEX') THEN
+!
+!*       4.1  Vertical Spatial grid 
+!
+CALL INIT_NMLVAR()
+CALL READ_VER_GRID(TZPRE_REAL1FILE)
+!
+CALL IO_Field_read(TPGDFILE,'IMAX',NIMAX)
+CALL IO_Field_read(TPGDFILE,'JMAX',NJMAX)
+!
+NIMAX_ll=NIMAX   !! _ll variables are global variables
+NJMAX_ll=NJMAX   !! but the old names are kept in PRE_IDEA1.nam file
+!
+CALL SET_JP_ll(JPMODELMAX,JPHEXT,JPVEXT,JPHEXT)
+CALL SET_DAD0_ll()
+!JUAN 4/04/2014 correction for PREP_REAL_CASE on Gribex files 
+!CALL SET_DIM_ll(NIMAX_ll, NJMAX_ll, 128)
+CALL SET_DIM_ll(NIMAX_ll, NJMAX_ll, NKMAX)
+CALL SET_LBX_ll('OPEN',1)
+CALL SET_LBY_ll('OPEN', 1)
+CALL SET_XRATIO_ll(1, 1)
+CALL SET_YRATIO_ll(1, 1)
+CALL SET_XOR_ll(1, 1)
+CALL SET_XEND_ll(NIMAX_ll+2*JPHEXT, 1)
+CALL SET_YOR_ll(1, 1)
+CALL SET_YEND_ll(NJMAX_ll+2*JPHEXT, 1)
+CALL SET_DAD_ll(0, 1)
+!JUANZ
+!CALL INI_PARA_ll(IINFO_ll)
+CALL INI_PARAZ_ll(IINFO_ll)
+!JUANZ
+
+!
+! sizes of arrays of the extended sub-domain
+!
+CALL GET_DIM_PHYS_ll('B',NIMAX,NJMAX)
+!!$CALL GET_DIM_EXT_ll('B',NIU,NJU)
+!!$CALL GET_INDICE_ll(NIB,NJB,NIE,NJE)
+!!$CALL GET_OR_ll('B',IXOR,IYOR)
+ENDIF
+!JUAN REALZ
+!
+LDUMMY_REAL= .FALSE.
+LFILTERING= .FALSE.
+CFILTERING= 'UVT  '
+XLATGUESS= XUNDEF ; XLONGUESS= XUNDEF ; XBOXWIND=XUNDEF; XRADGUESS= XUNDEF
+NK=50 ; XLAMBDA=0.2 ; NPHIL=24
+NLEVELR0=15
+NDIAG_FILT=-1
+LBOGUSSING= .FALSE.
+XLATBOG= XUNDEF ; XLONBOG= XUNDEF
+XVTMAXSURF= XUNDEF ; XRADWINDSURF= XUNDEF
+XMAX=16000. ; XC=0.7 ; XRHO_Z=-0.3 ; XRHO_ZZ=0.9
+XB_0=1.65 ; XBETA_Z=-0.5 ; XBETA_ZZ=0.35
+XANGCONV0=0. ; XANGCONV1000=0. ; XANGCONV2000=0.
+CDADATMFILE=' ' ; CDADBOGFILE=' '
+!
+CALL INIT_NMLVAR
+CALL POSNAM( TZPRE_REAL1FILE, 'NAM_REAL_CONF', GFOUND )
+IF (GFOUND) READ(IPRE_REAL1,NAM_REAL_CONF)
+CALL POSNAM( TZPRE_REAL1FILE, 'NAM_HURR_CONF', GFOUND )
+IF (GFOUND) READ(IPRE_REAL1,NAM_HURR_CONF)
+CALL POSNAM( TZPRE_REAL1FILE, 'NAM_CH_CONF', GFOUND )
+IF (GFOUND) READ(UNIT=IPRE_REAL1,NML=NAM_CH_CONF)
+CALL UPDATE_MODD_FROM_NMLVAR
+CALL POSNAM( TZPRE_REAL1FILE, 'NAM_AERO_CONF', GFOUND )
+IF (GFOUND) READ(IPRE_REAL1,NAM_AERO_CONF)
+CALL POSNAM( TZPRE_REAL1FILE, 'NAM_CONFZ', GFOUND )
+IF (GFOUND) READ(UNIT=IPRE_REAL1,NML=NAM_CONFZ)
+CALL POSNAM( TZPRE_REAL1FILE, 'NAM_IBM_LSF' , GFOUND )
+IF (GFOUND) READ(UNIT=IPRE_REAL1,NML=NAM_IBM_LSF)
+!
+GAERINIT = LAERINIT
+
+! Sea salt
+CALL INIT_SALT
+!
+!*       4.3   set soil scheme to ISBA for initialization from GRIB
+!
+IF (YATMFILETYPE=='GRIBEX') THEN
+  CLBCX(:) ='OPEN'
+  CLBCY(:) ='OPEN'
+END IF
+!
+CALL SECOND_MNH(ZTIME2)
+ZMISC = ZTIME2 - ZTIME1
+!-------------------------------------------------------------------------------
+!
+!*       5.    READING OF THE INPUT DATA
+!              -------------------------
+!
+ZTIME1 = ZTIME2
+!
+IF (YATMFILETYPE=='MESONH') THEN
+  CALL READ_ALL_DATA_MESONH_CASE(TZPRE_REAL1FILE,YATMFILE,TPGDFILE,YDAD_NAME)
+ELSE IF (YATMFILETYPE=='GRIBEX') THEN
+  IF(LEN_TRIM(YCHEMFILE)>0 .AND. YCHEMFILETYPE=='GRIBEX')THEN
+    CALL READ_ALL_DATA_GRIB_CASE('ATM1',TZPRE_REAL1FILE,YATMFILE,TPGDFILE,ZHORI,NVERB,LDUMMY_REAL)
+  ELSE
+    CALL READ_ALL_DATA_GRIB_CASE('ATM0',TZPRE_REAL1FILE,YATMFILE,TPGDFILE,ZHORI,NVERB,LDUMMY_REAL)
+  END IF
+!
+  YDAD_NAME=' '
+END IF
+LAERINIT = GAERINIT 
+!
+IF (NIMAX==1 .AND. NJMAX==1) THEN
+  L1D=.TRUE.
+  L2D=.FALSE.
+ELSE IF (NJMAX==1) THEN
+  L1D=.FALSE.
+  L2D=.TRUE.
+ELSE
+  L1D=.FALSE.
+  L2D=.FALSE.
+END IF
+!
+! UPG*PT
+!*       5.1   reading of the input chemical data
+!
+!IF(LEN_TRIM(YCHEMFILE)>0)THEN
+!  ! read again Nam_aero_conf
+!  CALL POSNAM( TZPRE_REAL1FILE, 'NAM_AERO_CONF', GFOUND )
+!  IF (GFOUND) READ(IPRE_REAL1,NAM_AERO_CONF)
+!  IF(YCHEMFILETYPE=='GRIBEX') &
+!  CALL READ_ALL_DATA_GRIB_CASE('CHEM',TZPRE_REAL1FILE,YCHEMFILE,TPGDFILE,ZHORI,NVERB,LDUMMY_REAL)
+!  IF (YCHEMFILETYPE=='NETCDF') &
+!  CALL READ_CHEM_DATA_NETCDF_CASE(TZPRE_REAL1FILE,YCHEMFILE,TPGDFILE,ZHORI,NVERB,LDUMMY_REAL)
+!END IF
+!
+!*       5.2   reading the input CAMS data
+!
+!IF(LEN_TRIM(YCAMSFILE)>0)THEN
+!   IF(YCAMSFILETYPE=='NETCDF') THEN
+!      CALL READ_CAMS_DATA_NETCDF_CASE(TZPRE_REAL1FILE,YCAMSFILE,TPGDFILE,ZHORI,NVERB,LDUMMY_REAL)
+!   ELSE
+!      CALL PRINT_MSG(NVERB_FATAL,'GEN','PREP_REAL_CASE','CANNOT READ CAMS GRIB FILES YET')
+!   END IF
+!END IF
+!*       5.1   reading CAMS or MACC files for init LIMA
+!
+IF(LEN_TRIM(YLIMAFILE)>0)THEN
+  IF(YLIMAFILETYPE=='NETCDF') THEN
+    CALL READ_LIMA_DATA_NETCDF_CASE(TZPRE_REAL1FILE,YLIMAFILE,TPGDFILE,ZHORI,NVERB,LDUMMY_REAL)
+  ELSE
+    WRITE(ILUOUT0,FMT=*)
+    !callabortstop
+    CALL PRINT_MSG(NVERB_FATAL,'GEN','PREP_REAL_CASE','Pb in MACC/CAMS file')
+    STOP
+  END IF
+END IF
+!
+!*       5.2   reading of the input chemical data + dusts + salts if needed
+!
+IF(LEN_TRIM(YCHEMFILE)>0)THEN
+  ! read again Nam_aero_conf
+  CALL POSNAM( TZPRE_REAL1FILE, 'NAM_AERO_CONF', GFOUND )
+  IF (GFOUND) READ(IPRE_REAL1,NAM_AERO_CONF)
+  IF(YCHEMFILETYPE=='GRIBEX') &
+  CALL READ_ALL_DATA_GRIB_CASE('CHEM',TZPRE_REAL1FILE,YCHEMFILE,TPGDFILE,ZHORI,NVERB,LDUMMY_REAL)
+  IF (YCHEMFILETYPE=='MOZART') &
+  CALL READ_CHEM_DATA_MOZART_CASE(TZPRE_REAL1FILE,YCHEMFILE,TPGDFILE,ZHORI,NVERB,LDUMMY_REAL)
+  IF (YCHEMFILETYPE=='CAMSEU') &
+  CALL READ_CHEM_DATA_CAMS_CASE(TZPRE_REAL1FILE,YCHEMFILE,TPGDFILE,ZHORI,NVERB, &
+                                LDUMMY_REAL,LUSECHEM)
+END IF
+
+!UPG*PT
+!
+CALL IO_File_close(TZPRE_REAL1FILE)
+!
+CALL SECOND_MNH(ZTIME2)
+ZREAD = ZTIME2 - ZTIME1 - ZHORI
+!-------------------------------------------------------------------------------
+!
+CALL IO_File_add2list(TINIFILE,CINIFILE,'MNH','WRITE',KLFITYPE=1,KLFIVERB=NVERB)
+CALL IO_File_open(TINIFILE)
+!
+ZTIME1=ZTIME2
+!
+!*       6.    CONFIGURATION VARIABLES
+!              -----------------------
+!
+!*       6.1   imposed values of some other configuration variables
+!
+CDCONV='NONE'
+CSCONV='NONE'
+CRAD='NONE'
+CCONF='START'
+NRIMX=6
+NRIMY=6
+LHORELAX_UVWTH=.TRUE.
+LHORELAX_RV=LUSERV
+LHORELAX_RC=LUSERC
+LHORELAX_RR=LUSERR
+LHORELAX_RI=LUSERI
+LHORELAX_RS=LUSERS
+LHORELAX_RG=LUSERG
+LHORELAX_RH=LUSERH
+LHORELAX_SV(:)=.FALSE.
+LHORELAX_SVC2R2 = (NSV_C2R2 > 0)
+LHORELAX_SVC1R3 = (NSV_C1R3 > 0)
+LHORELAX_SVLIMA = (NSV_LIMA > 0)
+LHORELAX_SVELEC = (NSV_ELEC > 0)
+LHORELAX_SVCHEM = (NSV_CHEM > 0)
+LHORELAX_SVCHIC = (NSV_CHIC > 0)
+LHORELAX_SVDST  = (NSV_DST > 0)
+LHORELAX_SVSLT  = (NSV_SLT > 0)
+LHORELAX_SVAER  = (NSV_AER > 0)
+LHORELAX_SVPP   = (NSV_PP > 0)
+#ifdef MNH_FOREFIRE
+LHORELAX_SVFF   = (NSV_FF > 0)
+#endif
+LHORELAX_SVCS   = (NSV_CS > 0)
+
+LHORELAX_SVLG   = .FALSE.
+LHORELAX_SV(1:NSV)=.TRUE.
+IF ( CTURB /= 'NONE') THEN
+  LHORELAX_TKE = .TRUE.
+ELSE
+  LHORELAX_TKE = .FALSE.
+END IF
+!
+!
+CSTORAGE_TYPE='TT'
+!-------------------------------------------------------------------------------
+!
+!*       8.    COMPUTATION OF GEOMETRIC VARIABLES
+!              ----------------------------------
+!
+ZTIME1 = ZTIME2
+!
+ALLOCATE(XMAP(SIZE(XXHAT),SIZE(XYHAT)))
+ALLOCATE(XLAT(SIZE(XXHAT),SIZE(XYHAT)))
+ALLOCATE(XLON(SIZE(XXHAT),SIZE(XYHAT)))
+ALLOCATE(XDXHAT(SIZE(XXHAT)))
+ALLOCATE(XDYHAT(SIZE(XYHAT)))
+ALLOCATE(XZZ(SIZE(XXHAT),SIZE(XYHAT),SIZE(XZHAT)))
+ALLOCATE(ZJ(SIZE(XXHAT),SIZE(XYHAT),SIZE(XZHAT)))
+!
+IF (LCARTESIAN) THEN
+  CALL SM_GRIDCART(XXHAT,XYHAT,XZHAT,XZS,LSLEVE,XLEN1,XLEN2,XZSMT,XDXHAT,XDYHAT,XZZ,ZJ)
+  XMAP=1.
+ELSE
+  CALL SM_GRIDPROJ( XXHAT, XYHAT, XZHAT, XXHATM, XYHATM, XZS,      &
+                    LSLEVE, XLEN1, XLEN2, XZSMT, XLATORI, XLONORI, &
+                    XMAP, XLAT, XLON, XDXHAT, XDYHAT, XZZ, ZJ      )
+END IF
+!
+CALL MPPDB_CHECK2D(XZS,"prep_real_case8:XZS",PRECISION)
+CALL MPPDB_CHECK2D(XMAP,"prep_real_case8:XMAP",PRECISION)
+CALL MPPDB_CHECK2D(XLAT,"prep_real_case8:XLAT",PRECISION)
+CALL MPPDB_CHECK2D(XLON,"prep_real_case8:XLON",PRECISION)
+CALL MPPDB_CHECK3D(XZZ,"prep_real_case8:XZZ",PRECISION)
+CALL MPPDB_CHECK3D(ZJ,"prep_real_case8:ZJ",PRECISION)
+!
+ALLOCATE(XDXX(SIZE(XXHAT),SIZE(XYHAT),SIZE(XZHAT)))
+ALLOCATE(XDYY(SIZE(XXHAT),SIZE(XYHAT),SIZE(XZHAT)))
+ALLOCATE(XDZX(SIZE(XXHAT),SIZE(XYHAT),SIZE(XZHAT)))
+ALLOCATE(XDZY(SIZE(XXHAT),SIZE(XYHAT),SIZE(XZHAT)))
+ALLOCATE(XDZZ(SIZE(XXHAT),SIZE(XYHAT),SIZE(XZHAT)))
+!
+!20131024 add update halo
+!=> corrects on PDXX calculation in metrics and XDXX !!
+CALL ADD3DFIELD_ll( TZFIELDS_ll, XZZ, 'PREP_REAL_CASE::XZZ' )
+CALL UPDATE_HALO_ll(TZFIELDS_ll,IINFO_ll)
+CALL CLEANLIST_ll(TZFIELDS_ll)
+!
+CALL METRICS(XMAP,XDXHAT,XDYHAT,XZZ,XDXX,XDYY,XDZX,XDZY,XDZZ)
+!
+CALL MPPDB_CHECK3D(XDXX,"prc8-beforeupdate_metrics:PDXX",PRECISION)
+CALL MPPDB_CHECK3D(XDYY,"prc8-beforeupdate_metrics:PDYY",PRECISION)
+CALL MPPDB_CHECK3D(XDZX,"prc8-beforeupdate_metrics:PDZX",PRECISION)
+CALL MPPDB_CHECK3D(XDZY,"prc8-beforeupdate_metrics:PDZY",PRECISION)
+!
+CALL UPDATE_METRICS(CLBCX,CLBCY,XDXX,XDYY,XDZX,XDZY,XDZZ)
+!
+!20131112 add update_halo for XDYY and XDZY!!
+CALL ADD3DFIELD_ll( TZFIELDS_ll, XDXX, 'PREP_REAL_CASE::XDXX' )
+CALL ADD3DFIELD_ll( TZFIELDS_ll, XDZX, 'PREP_REAL_CASE::XDZX' )
+CALL ADD3DFIELD_ll( TZFIELDS_ll, XDYY, 'PREP_REAL_CASE::XDYY' )
+CALL ADD3DFIELD_ll( TZFIELDS_ll, XDZY, 'PREP_REAL_CASE::XDZY' )
+CALL UPDATE_HALO_ll(TZFIELDS_ll,IINFO_ll)
+CALL CLEANLIST_ll(TZFIELDS_ll)
+
+!CALL EXTRAPOL('W',XDXX,XDZX)
+!CALL EXTRAPOL('S',XDYY,XDZY)
+
+CALL SECOND_MNH(ZTIME2)
+
+ZMISC = ZMISC + ZTIME2 - ZTIME1
+!-------------------------------------------------------------------------------
+!
+!*       9.    PREPARATION OF THE VERTICAL SHIFT AND INTERPOLATION
+!              ---------------------------------------------------
+!
+ZTIME1 = ZTIME2
+!
+IF (YATMFILETYPE=='GRIBEX') THEN
+  CALL VER_PREP_GRIBEX_CASE('ATM ',ZDG)
+ELSE IF (YATMFILETYPE=='MESONH') THEN
+  CALL VER_PREP_MESONH_CASE(ZDG)
+END IF
+!
+IF (LEN_TRIM(YCHEMFILE)>0 .AND. YCHEMFILETYPE=='GRIBEX') THEN
+  CALL VER_PREP_GRIBEX_CASE('CHEM',ZDG)
+END IF
+!UPG*PT
+!IF ((LEN_TRIM(YCHEMFILE)>0 .AND. YCHEMFILETYPE=='NETCDF') .OR. &
+!   (LEN_TRIM(YCAMSFILE)>0 .AND. YCAMSFILETYPE=='NETCDF')) THEN
+!  CALL VER_PREP_NETCDF_CASE(ZDG)
+!END IF
+IF (LEN_TRIM(YCHEMFILE)>0 .AND. ((YCHEMFILETYPE=='MOZART').OR. &
+                                 (YCHEMFILETYPE=='CAMSEU'))) THEN
+  CALL VER_PREP_NETCDF_CASE(ZDG,XSV_LS)
+
+  DEALLOCATE(XSV_LS)
+END IF
+!
+IF (LEN_TRIM(YLIMAFILE)>0 .AND. YLIMAFILETYPE=='NETCDF') THEN
+  CALL VER_PREP_NETCDF_CASE(ZDG,XSV_LS_LIMA)
+  DEALLOCATE(XSV_LS_LIMA)
+END IF
+!UPG*PT
+!
+CALL SECOND_MNH(ZTIME2)
+ZPREP = ZTIME2 - ZTIME1 - ZDG
+ZDIAG = ZDIAG + ZDG
+!-------------------------------------------------------------------------------
+!
+!*      10.    VERTICAL INTERPOLATION OF ALL THERMODYNAMICAL VARIABLES
+!              -------------------------------------------------------
+!
+ZTIME1 = ZTIME2
+!
+ALLOCATE(XPSURF(SIZE(XXHAT),SIZE(XYHAT)))
+!
+CALL EXTRAPOL('E',XEXNTOP2D)
+IF (YATMFILETYPE=='GRIBEX') THEN
+  CALL VER_THERMO(TINIFILE,LSHIFT,XTHV_MX,XR_MX,XZS_LS,XZSMT_LS,XZMASS_MX,XZFLUX_MX,XPMHP_MX,ZJ, &
+                  XDXX,XDYY,XEXNTOP2D,XPSURF,ZDG                               )
+ELSE IF (YATMFILETYPE=='MESONH') THEN
+  CALL VER_THERMO(TINIFILE,LSHIFT,XTHV_MX,XR_MX,XZS_LS,XZSMT_LS,XZMASS_MX,XZFLUX_MX,XPMHP_MX,ZJ, &
+                  XDXX,XDYY,XEXNTOP2D,XPSURF,ZDG,                              &
+                  XLSTH_MX,XLSRV_MX                                            )
+END IF
+!
+CALL SECOND_MNH(ZTIME2)
+ZTHERMO = ZTIME2 - ZTIME1 - ZDG
+ZDIAG = ZDIAG + ZDG
+!-------------------------------------------------------------------------------
+!
+!*      12.    VERTICAL INTERPOLATION OF DYNAMICAL VARIABLES
+!              ---------------------------------------------
+!
+ZTIME1 = ZTIME2
+IF (YATMFILETYPE=='GRIBEX') THEN
+  CALL VER_DYN(LSHIFT,XU_MX,XV_MX,XW_MX,XRHOD_MX,XZFLUX_MX,XZMASS_MX,XZS_LS,     &
+               XDXX,XDYY,XDZZ,XDZX,XDZY,ZJ,YATMFILETYPE                          )
+ELSE IF (YATMFILETYPE=='MESONH') THEN
+  CALL VER_DYN(LSHIFT,XU_MX,XV_MX,XW_MX,XRHOD_MX,XZFLUX_MX,XZMASS_MX,XZS_LS,     &
+               XDXX,XDYY,XDZZ,XDZX,XDZY,ZJ,YATMFILETYPE,                         &
+               XLSU_MX,XLSV_MX,XLSW_MX                                           )
+END IF
+!
+!
+IF (ALLOCATED(XTHV_MX)) DEALLOCATE(XTHV_MX)
+IF (ALLOCATED(XR_MX)) DEALLOCATE(XR_MX)
+IF (ALLOCATED(XPMHP_MX)) DEALLOCATE(XPMHP_MX)
+IF (ALLOCATED(XU_MX)) DEALLOCATE(XU_MX)
+IF (ALLOCATED(XV_MX)) DEALLOCATE(XV_MX)
+IF (ALLOCATED(XW_MX)) DEALLOCATE(XW_MX)
+IF (ALLOCATED(XLSTH_MX)) DEALLOCATE(XLSTH_MX)
+IF (ALLOCATED(XLSRV_MX)) DEALLOCATE(XLSRV_MX)
+IF (ALLOCATED(XLSU_MX)) DEALLOCATE(XLSU_MX)
+IF (ALLOCATED(XLSV_MX)) DEALLOCATE(XLSV_MX)
+IF (ALLOCATED(XLSW_MX)) DEALLOCATE(XLSW_MX)
+IF (ALLOCATED(XZFLUX_MX)) DEALLOCATE(XZFLUX_MX)
+IF (ALLOCATED(XZMASS_MX)) DEALLOCATE(XZMASS_MX)
+IF (ALLOCATED(XRHOD_MX)) DEALLOCATE(XRHOD_MX)
+IF (ALLOCATED(XEXNTOP2D)) DEALLOCATE(XEXNTOP2D)
+IF (ALLOCATED(XZS_LS)) DEALLOCATE(XZS_LS)
+IF (ALLOCATED(XZSMT_LS)) DEALLOCATE(XZSMT_LS)
+!
+!-------------------------------------------------------------------------------
+!
+!*      13.    ANELASTIC CORRECTION
+!              --------------------
+!
+CALL PRESSURE_IN_PREP(XDXX,XDYY,XDZX,XDZY,XDZZ)
+!
+CALL SECOND_MNH(ZTIME2)
+ZDYN = ZTIME2 - ZTIME1
+!
+!-------------------------------------------------------------------------------
+!
+!*      14.    INITIALIZATION OF THE REMAINING PROGNOSTIC VARIABLES (COPIES)
+!              -------------------------------------------------------------
+!
+ZTIME1 = ZTIME2
+!
+IF(LEN_TRIM(YCHEMFILE)>0 .AND. YCHEMFILETYPE=='MESONH')THEN
+  CALL INI_PROG_VAR(XTKE_MX,XSV_MX,YCHEMFILE)
+  LHORELAX_SVCHEM = (NSV_CHEM > 0)
+  LHORELAX_SVCHIC = (NSV_CHIC > 0)
+  LHORELAX_SVDST  = (NSV_DST > 0)
+  LHORELAX_SVSLT  = (NSV_SLT > 0)
+  LHORELAX_SVAER  = (NSV_AER > 0)
+ELSE
+!
+!UPG*PT
+!IF (LEN_TRIM(YCAMSFILE)>0 .AND. YCAMSFILETYPE=='NETCDF') THEN
+IF (LEN_TRIM(YLIMAFILE)>0 .AND. YLIMAFILETYPE=='NETCDF') THEN
+!UPG*PT
+  CALL LIMA_MIXRAT_TO_NCONC(XPABST, XTHT, XRT(:,:,:,1), XSV_MX)
+END IF
+!
+  CALL INI_PROG_VAR(XTKE_MX,XSV_MX)
+END IF
+!
+
+! Initialization of ORILAM variables
+IF (LORILAM) THEN
+  IF (.NOT.(ASSOCIATED(XN3D)))      ALLOCATE(XN3D(SIZE(XSVT,1),SIZE(XSVT,2),SIZE(XSVT,3),JPMODE))
+  IF (.NOT.(ASSOCIATED(XRG3D)))     ALLOCATE(XRG3D(SIZE(XSVT,1),SIZE(XSVT,2),SIZE(XSVT,3),JPMODE))
+  IF (.NOT.(ASSOCIATED(XSIG3D)))    ALLOCATE(XSIG3D(SIZE(XSVT,1),SIZE(XSVT,2),SIZE(XSVT,3),JPMODE))
+  IF (.NOT.(ASSOCIATED(XRHOP3D)))   ALLOCATE(XRHOP3D(SIZE(XSVT,1),SIZE(XSVT,2),SIZE(XSVT,3),JPMODE))
+  IF (.NOT.(ASSOCIATED(XM3D)))      ALLOCATE(XM3D(SIZE(XSVT,1),SIZE(XSVT,2),SIZE(XSVT,3),JPMODE*3))
+  IF (.NOT.(ASSOCIATED(XCTOTA3D))) &
+    ALLOCATE(XCTOTA3D(SIZE(XSVT,1),SIZE(XSVT,2),SIZE(XSVT,3),NSP+NCARB+NSOA,JPMODE))
+
+  CALL CH_AER_EQM_INIT_n(XSVT(:,:,:,NSV_CHEMBEG:NSV_CHEMEND),&
+                         XSVT(:,:,:,NSV_AERBEG:NSV_AEREND),&
+                         XM3D,XRHOP3D,XSIG3D,&
+                         XRG3D,XN3D, XRHODREF, XCTOTA3D)
+END IF
+!
+! Initialization LIMA variables by ORILAM
+IF (CCLOUD == 'LIMA' .AND. ((LORILAM).OR.(LDUST).OR.(LSALT))) THEN
+
+    ! Init LIMA by ORILAM
+    CALL AER2LIMA(XSVT, XRHODREF, XRT(:,:,:,1), XPABST, XTHT,XZZ)
+
+    ! Init LB LIMA by ORILAM
+    ALLOCATE(ZLBXRHO(SIZE(XLBXSVM,1), SIZE(XLBXSVM,2), SIZE(XLBXSVM,3)))
+    ALLOCATE(ZLBYRHO(SIZE(XLBYSVM,1), SIZE(XLBYSVM,2), SIZE(XLBYSVM,3)))
+    ALLOCATE(ZLBXPABST(SIZE(XLBXSVM,1), SIZE(XLBXSVM,2), SIZE(XLBXSVM,3)))
+    ALLOCATE(ZLBYPABST(SIZE(XLBYSVM,1), SIZE(XLBYSVM,2), SIZE(XLBYSVM,3)))
+    ALLOCATE(ZLBXTHM(SIZE(XLBXSVM,1), SIZE(XLBXSVM,2), SIZE(XLBXSVM,3)))
+    ALLOCATE(ZLBYTHM(SIZE(XLBYSVM,1), SIZE(XLBYSVM,2), SIZE(XLBYSVM,3)))
+    ALLOCATE(ZLBXZZ(SIZE(XLBXSVM,1), SIZE(XLBXSVM,2), SIZE(XLBXSVM,3)))
+    ALLOCATE(ZLBYZZ(SIZE(XLBYSVM,1), SIZE(XLBYSVM,2), SIZE(XLBYSVM,3)))
+    ALLOCATE(ZLBXRM(SIZE(XLBXSVM,1), SIZE(XLBXSVM,2), SIZE(XLBXSVM,3)))
+    ALLOCATE(ZLBYRM(SIZE(XLBYSVM,1), SIZE(XLBYSVM,2), SIZE(XLBYSVM,3)))
+    ALLOCATE(ZLBXSVM(SIZE(XLBXSVM,1), SIZE(XLBXSVM,2), SIZE(XLBXSVM,3), SIZE(XLBXSVM,4)))
+    ALLOCATE(ZLBYSVM(SIZE(XLBYSVM,1), SIZE(XLBYSVM,2), SIZE(XLBYSVM,3), SIZE(XLBXSVM,4)))
+
+    ILBX=SIZE(XLBXSVM,1)/2-JPHEXT
+    ILBY=SIZE(XLBYSVM,2)/2-JPHEXT
+
+    CALL GET_INDICE_ll (IIB,IJB,IIE,IJE)
+
+    ZLBXRHO(1:ILBX+1,:,:)        = XRHODREF(IIB-1:IIB-1+ILBX,:,:)
+    ZLBXRHO(ILBX+2:2*ILBX+2,:,:) = XRHODREF(IIE+1-ILBX:IIE+1,:,:)
+    ZLBYRHO(:,1:ILBY+1,:)        = XRHODREF(:,IJB-1:IJB-1+ILBY,:)
+    ZLBYRHO(:,ILBY+2:2*ILBY+2,:) = XRHODREF(:,IJE+1-ILBY:IJE+1,:)
+    ZLBXPABST(1:ILBX+1,:,:)        = XPABST(IIB-1:IIB-1+ILBX,:,:)
+    ZLBXPABST(ILBX+2:2*ILBX+2,:,:) = XPABST(IIE+1-ILBX:IIE+1,:,:)
+    ZLBYPABST(:,1:ILBY+1,:)        = XPABST(:,IJB-1:IJB-1+ILBY,:)
+    ZLBYPABST(:,ILBY+2:2*ILBY+2,:) = XPABST(:,IJE+1-ILBY:IJE+1,:)
+    ZLBXTHM(1:ILBX+1,:,:)          = XTHT(IIB-1:IIB-1+ILBX,:,:)
+    ZLBXTHM(ILBX+2:2*ILBX+2,:,:)   = XTHT(IIE+1-ILBX:IIE+1,:,:)
+    ZLBYTHM(:,1:ILBY+1,:)          = XTHT(:,IJB-1:IJB-1+ILBY,:)
+    ZLBYTHM(:,ILBY+2:2*ILBY+2,:)   = XTHT(:,IJE+1-ILBY:IJE+1,:)
+    ZLBXZZ(1:ILBX+1,:,:)        = XZZ(IIB-1:IIB-1+ILBX,:,:)
+    ZLBXZZ(ILBX+2:2*ILBX+2,:,:) = XZZ(IIE+1-ILBX:IIE+1,:,:)
+    ZLBYZZ(:,1:ILBY+1,:)        = XZZ(:,IJB-1:IJB-1+ILBY,:)
+    ZLBYZZ(:,ILBY+2:2*ILBY+2,:) = XZZ(:,IJE+1-ILBY:IJE+1,:)
+    ZLBXSVM(1:ILBX+1,:,:,:)        = XSVT(IIB-1:IIB-1+ILBX,:,:,:)
+    ZLBXSVM(ILBX+2:2*ILBX+2,:,:,:) = XSVT(IIE+1-ILBX:IIE+1,:,:,:)
+    ZLBYSVM(:,1:ILBY+1,:,:)        = XSVT(:,IJB-1:IJB-1+ILBY,:,:)
+    ZLBYSVM(:,ILBY+2:2*ILBY+2,:,:) = XSVT(:,IJE+1-ILBY:IJE+1,:,:)
+    ZLBXRM(1:ILBX+1,:,:)          = XRT(IIB-1:IIB-1+ILBX,:,:,1)
+    ZLBXRM(ILBX+2:2*ILBX+2,:,:)   = XRT(IIE+1-ILBX:IIE+1,:,:,1)
+    ZLBYRM(:,1:ILBY+1,:)          = XRT(:,IJB-1:IJB-1+ILBY,:,1)
+    ZLBYRM(:,ILBY+2:2*ILBY+2,:)   = XRT(:,IJE+1-ILBY:IJE+1,:,1)
+
+
+    CALL AER2LIMA(ZLBXSVM, ZLBXRHO, ZLBXRM(:,:,:), ZLBXPABST, ZLBXTHM, ZLBXZZ)
+    CALL AER2LIMA(ZLBYSVM, ZLBYRHO, ZLBYRM(:,:,:), ZLBYPABST, ZLBYTHM, ZLBYZZ)
+
+    DEALLOCATE(ZLBXRHO)
+    DEALLOCATE(ZLBYRHO)
+    DEALLOCATE(ZLBXPABST)
+    DEALLOCATE(ZLBYPABST)
+    DEALLOCATE(ZLBXTHM)
+    DEALLOCATE(ZLBYTHM)
+    DEALLOCATE(ZLBXZZ)
+    DEALLOCATE(ZLBYZZ)
+    DEALLOCATE(ZLBXRM)
+    DEALLOCATE(ZLBYRM)
+    DEALLOCATE(ZLBXSVM)
+    DEALLOCATE(ZLBYSVM)
+END IF
+!
+IF (ALLOCATED(XSV_MX)) DEALLOCATE(XSV_MX)
+IF (ALLOCATED(XTKE_MX)) DEALLOCATE(XTKE_MX)
+!
+CALL BOUNDARIES (                                                 &
+          0.,CLBCX,CLBCY,NRR,NSV,1,                               &
+          XLBXUM,XLBXVM,XLBXWM,XLBXTHM,XLBXTKEM,XLBXRM,XLBXSVM,   &
+          XLBYUM,XLBYVM,XLBYWM,XLBYTHM,XLBYTKEM,XLBYRM,XLBYSVM,   &
+          XLBXUM,XLBXVM,XLBXWM,XLBXTHM,XLBXTKEM,XLBXRM,XLBXSVM,   &
+          XLBYUM,XLBYVM,XLBYWM,XLBYTHM,XLBYTKEM,XLBYRM,XLBYSVM,   &
+          XRHODJ,XRHODREF,                                        &
+          XUT, XVT, XWT, XTHT, XTKET, XRT, XSVT, XSRCT            )
+!
+CALL SECOND_MNH(ZTIME2)
+ZMISC = ZMISC + ZTIME2 - ZTIME1
+!
+!-------------------------------------------------------------------------------
+!
+!*      15.    Error on temperature during interpolations
+!              ------------------------------------------
+!
+ZTIME1 = ZTIME2
+!
+IF (YATMFILETYPE=='GRIBEX' .AND. NVERB>1) THEN
+  CALL ERROR_ON_TEMPERATURE(XT_LS,XPMASS_LS,XPABST,XPS_LS,XPSURF)
+END IF
+!
+IF (YATMFILETYPE=='GRIBEX') THEN
+  DEALLOCATE(XT_LS)
+  DEALLOCATE(XPMASS_LS)
+  DEALLOCATE(XPS_LS)
+END IF
+!
+IF (ALLOCATED(XPSURF)) DEALLOCATE(XPSURF)
+!
+CALL SECOND_MNH(ZTIME2)
+ZDIAG =  ZDIAG + ZTIME2 - ZTIME1
+!-------------------------------------------------------------------------------
+!
+!*       16.    INITIALIZE LEVELSET FOR IBM
+!              ---------------------------
+!
+IF (LIBM_LSF) THEN
+  !
+  IF (.NOT.LCARTESIAN) THEN
+    CALL PRINT_MSG(NVERB_FATAL,'GEN','PREP_IDEAL_CASE','IBM can only be used with cartesian coordinates')
+  ENDIF
+  !
+  CALL GET_DIM_EXT_ll('B',NIU,NJU)
+  NKU=NKMAX+2*JPVEXT
+  !
+  ALLOCATE(XIBM_LS(NIU,NJU,NKU,4))
+  !
+  CALL IBM_INIT_LS(XIBM_LS)
+  !
+ENDIF
+!
+!-------------------------------------------------------------------------------
+!
+!*      17.    WRITING OF THE MESO-NH FM-FILE
+!              ------------------------------
+!
+ZTIME1 = ZTIME2
+!
+CSTORAGE_TYPE='TT'
+IF (YATMFILETYPE=='GRIBEX') THEN
+  CSURF = "EXTE"
+  DO JRR=1,NRR
+    IF (JRR==1) THEN
+      LUSERV=.TRUE.
+      IDX_RVT = JRR
+    END IF
+    IF (JRR==2) THEN
+      LUSERC=.TRUE.
+      IDX_RCT = JRR
+    END IF
+    IF (JRR==3) THEN
+      LUSERR=.TRUE.
+      IDX_RRT = JRR
+    END IF
+    IF (JRR==4) THEN
+      LUSERI=.TRUE.
+      IDX_RIT = JRR
+    END IF
+    IF (JRR==5) THEN
+      LUSERS=.TRUE.
+      IDX_RST = JRR
+    END IF
+    IF (JRR==6) THEN
+      LUSERG=.TRUE.
+      IDX_RGT = JRR
+    END IF
+    IF (JRR==7) THEN
+      LUSERH=.TRUE.
+      IDX_RHT = JRR
+    END IF
+  END DO
+END IF
+!
+CALL WRITE_DESFM_n(1,TINIFILE)
+CALL IO_Header_write(TINIFILE,HDAD_NAME=YDAD_NAME)
+CALL WRITE_LFIFM_n(TINIFILE,YDAD_NAME)
+! 
+CALL SECOND_MNH(ZTIME2)
+ZWRITE = ZTIME2 - ZTIME1
+!
+!-------------------------------------------------------------------------------
+!
+!*      18.    OROGRAPHIC and DUMMY PHYSIOGRAPHIC FIELDS
+!              -----------------------------------------
+!
+!* reading in the PGD file
+!
+CALL MNHREAD_ZS_DUMMY_n(TPGDFILE)
+!
+!* writing in the output file
+!
+TOUTDATAFILE => TINIFILE
+CALL MNHWRITE_ZS_DUMMY_n(TINIFILE)
+!
+CALL DEALLOCATE_MODEL1(3)
+!
+IF (YATMFILETYPE=='MESONH'.AND. YATMFILE/=YPGDFILE) THEN
+  CALL IO_File_find_byname(TRIM(YATMFILE),TZATMFILE,IRESP)
+  CALL IO_File_close(TZATMFILE)
+END IF
+!-------------------------------------------------------------------------------
+!
+!*      19.    INTERPOLATION OF SURFACE VARIABLES
+!              ----------------------------------
+!
+IF (.NOT. LCOUPLING ) THEN
+  ZTIME1 = ZTIME2
+!
+  IF (CSURF=="EXTE") THEN
+    IF (YATMFILETYPE/='MESONH') THEN
+      CALL SURFEX_ALLOC_LIST(1)
+      YSURF_CUR => YSURF_LIST(1)
+      CALL READ_ALL_NAMELISTS(YSURF_CUR,'MESONH','PRE',.FALSE.)
+    ENDIF
+    CALL GOTO_SURFEX(1)
+    TFILE_SURFEX => TINIFILE
+    CALL PREP_SURF_MNH(YSURFFILE,YSURFFILETYPE)
+    NULLIFY(TFILE_SURFEX)
+  ENDIF
+!
+  CALL SECOND_MNH(ZTIME2)
+  ZSURF = ZSURF + ZTIME2 - ZTIME1
+ENDIF
+!
+!-------------------------------------------------------------------------------
+!
+!*      20.    EPILOGUE
+!              --------
+!
+WRITE(ILUOUT0,*)
+WRITE(ILUOUT0,*)
+WRITE(ILUOUT0,*)
+WRITE(ILUOUT0,*) '**************************************************'
+WRITE(ILUOUT0,*) '* PREP_REAL_CASE: PREP_REAL_CASE ends correctly. *'
+WRITE(ILUOUT0,*) '**************************************************'
+WRITE(ILUOUT0,*)
+!
+!-------------------------------------------------------------------------------
+!
+CALL SECOND_MNH (ZEND)
+!
+ZTOT        = ZEND - ZSTART          ! for computing time analysis
+!
+ZALL = ZMISC + ZREAD + ZHORI + ZPREP + ZTHERMO + ZSURF + ZDYN + ZDIAG + ZWRITE 
+!
+WRITE(ILUOUT0,*)
+WRITE(ILUOUT0,*) ' ------------------------------------------------------------ '
+WRITE(ILUOUT0,*) '|                                                            |'
+WRITE(ILUOUT0,*) '|          COMPUTING TIME ANALYSIS in PREP_REAL_CASE         |'
+WRITE(ILUOUT0,*) '|                                                            |'
+WRITE(ILUOUT0,*) '|------------------------------------------------------------|'
+WRITE(ILUOUT0,*) '|                     |                   |                  |'
+WRITE(ILUOUT0,*) '|    ROUTINE NAME     |     CPU-TIME      |   PERCENTAGE %   |'
+WRITE(ILUOUT0,*) '|                     |                   |                  |'
+WRITE(ILUOUT0,*) '|---------------------|-------------------|------------------|'
+WRITE(ILUOUT0,*) '|                     |                   |                  |'
+WRITE(UNIT=ILUOUT0,FMT=2) ZREAD, 100.*ZREAD/ZTOT
+WRITE(UNIT=ILUOUT0,FMT=9) ZHORI, 100.*ZHORI/ZTOT
+WRITE(UNIT=ILUOUT0,FMT=3) ZPREP, 100.*ZPREP/ZTOT
+WRITE(UNIT=ILUOUT0,FMT=4) ZTHERMO, 100.*ZTHERMO/ZTOT
+WRITE(UNIT=ILUOUT0,FMT=6) ZDYN, 100.*ZDYN/ZTOT
+WRITE(UNIT=ILUOUT0,FMT=7) ZDIAG, 100.*ZDIAG/ZTOT
+WRITE(UNIT=ILUOUT0,FMT=8) ZWRITE, 100.*ZWRITE/ZTOT
+WRITE(UNIT=ILUOUT0,FMT=1) ZMISC, 100.*ZMISC/ZTOT
+WRITE(UNIT=ILUOUT0,FMT=5) ZSURF, 100.*ZSURF/ZTOT
+!
+WRITE(UNIT=ILUOUT0,FMT=10) ZTOT   , 100.*ZALL/ZTOT
+WRITE(ILUOUT0,*) ' ------------------------------------------------------------ '
+!
+!                  FORMATS
+!                  -------
+!
+2  FORMAT(' |   READING OF DATA   |     ',F8.3,'      |     ',F8.3,'     |')
+9  FORMAT(' | HOR. INTERPOLATIONS |     ',F8.3,'      |     ',F8.3,'     |')
+3  FORMAT(' |      VER_PREP       |     ',F8.3,'      |     ',F8.3,'     |')
+4  FORMAT(' |     VER_THERMO      |     ',F8.3,'      |     ',F8.3,'     |')
+6  FORMAT(' |      VER_DYN        |     ',F8.3,'      |     ',F8.3,'     |')
+7  FORMAT(' |    DIAGNOSTICS      |     ',F8.3,'      |     ',F8.3,'     |')
+8  FORMAT(' |       WRITE         |     ',F8.3,'      |     ',F8.3,'     |')
+1  FORMAT(' |   MISCELLANEOUS     |     ',F8.3,'      |     ',F8.3,'     |')
+5  FORMAT(' |      SURFACE        |     ',F8.3,'      |     ',F8.3,'     |')
+10 FORMAT(' |   PREP_REAL_CASE    |     ',F8.3,'      |     ',F8.3,'     |')
+!
+!-------------------------------------------------------------------------------
+!
+IF (LEN_TRIM(YDAD_NAME)>0) THEN
+  WRITE(ILUOUT0,*) ' '
+  WRITE(ILUOUT0,*) ' ------------------------------------------------------------'
+  WRITE(ILUOUT0,*) '|  Nesting allowed                                           |'
+  WRITE(ILUOUT0,*) '|  DAD_NAME="',YDAD_NAME,'"                   |'
+  WRITE(ILUOUT0,*) ' ------------------------------------------------------------'
+  WRITE(ILUOUT0,*) ' '
+ELSE
+  WRITE(ILUOUT0,*) ' '
+  WRITE(ILUOUT0,*) ' ------------------------------------------------------------'
+  WRITE(ILUOUT0,*) '|  Nesting not allowed with a larger-scale model.            |'
+  WRITE(ILUOUT0,*) '|  The new file can only be used as model number 1           |'
+  WRITE(ILUOUT0,*) ' ------------------------------------------------------------'
+  WRITE(ILUOUT0,*) ' '
+END IF
+!
+!-------------------------------------------------------------------------------
+!
+CALL IO_File_close(TINIFILE)
+CALL IO_File_close(TPGDFILE)
+!
+CALL FINALIZE_MNH()
+!
+!-------------------------------------------------------------------------------
+!
+CONTAINS 
+
+SUBROUTINE INIT_NMLVAR
+CPRESOPT=CPRESOPT_n
+LRES=LRES_n
+XRES=XRES_n
+NITR=NITR_n
+LUSECHAQ=LUSECHAQ_n
+LUSECHIC=LUSECHIC_n
+LUSECHEM=LUSECHEM_n
+END SUBROUTINE INIT_NMLVAR
+
+SUBROUTINE UPDATE_MODD_FROM_NMLVAR
+CPRESOPT_n=CPRESOPT
+LRES_n=LRES
+XRES_n=XRES
+NITR_n=NITR
+LUSECHAQ_n=LUSECHAQ
+LUSECHIC_n=LUSECHIC
+LUSECHEM_n=LUSECHEM
+END SUBROUTINE UPDATE_MODD_FROM_NMLVAR
+
+END PROGRAM PREP_REAL_CASE
diff --git a/src/PHYEX/ext/prep_surfex.f90 b/src/PHYEX/ext/prep_surfex.f90
new file mode 100644
index 0000000000000000000000000000000000000000..6c3c81277095e0087f0f7d63a998dbade6008a07
--- /dev/null
+++ b/src/PHYEX/ext/prep_surfex.f90
@@ -0,0 +1,208 @@
+!MNH_LIC Copyright 2004-2021 CNRS, Meteo-France and Universite Paul Sabatier
+!MNH_LIC This is part of the Meso-NH software governed by the CeCILL-C licence
+!MNH_LIC version 1. See LICENSE, CeCILL-C_V1-en.txt and CeCILL-C_V1-fr.txt
+!MNH_LIC for details. version 1.
+!-----------------------------------------------------------------
+!     #############################
+      PROGRAM PREP_SURFEX
+!     #############################
+!
+!!****  *PREP_SURFEX* - program to write an initial FM file from real case
+!!                                situation containing only surface fields.
+!!
+!!    REFERENCE
+!!    ---------
+!!
+!!      Book 2
+!!
+!!    AUTHOR
+!!    ------
+!!
+!!      V.Masson  Meteo-France
+!!
+!!    MODIFICATIONS
+!!    -------------
+!!      Original    12/2004 (P. Le Moigne)
+!!    10/10/2011  J.Escobar call INI_PARAZ_ll
+!!  06/2016     (G.Delautier) phasage surfex 8
+!!  Philippe Wautelet: 05/2016-04/2018: new data structures and calls for I/O
+!  P. Wautelet 07/02/2019: force TYPE to a known value for IO_File_add2list
+!!          2021  B.Vie     LIMA - CAMS coupling
+!-------------------------------------------------------------------------------
+!
+!*       0.    DECLARATIONS
+!              ------------
+!
+USE MODD_CONF,        ONLY : CPROGRAM,&
+                             L1D, L2D, LPACK
+USE MODD_CONF_n,      ONLY : CSTORAGE_TYPE
+USE MODD_IO,          ONLY : TFILEDATA, TFILE_SURFEX
+USE MODD_LUNIT,       ONLY : TPGDFILE, TLUOUT0
+USE MODD_LUNIT_n,     ONLY : CINIFILE, TINIFILE
+USE MODD_MNH_SURFEX_n
+USE MODD_PARAMETERS,  ONLY : JPMODELMAX,JPHEXT,JPVEXT, NUNDEF, XUNDEF
+USE MODD_TIME_n,      ONLY : TDTCUR
+!
+use mode_field,            only: Ini_field_list, Ini_field_scalars
+USE MODE_FINALIZE_MNH,     only: FINALIZE_MNH
+USE MODE_IO,               only: IO_Init
+USE MODE_IO_FIELD_READ,    only: IO_Field_read
+USE MODE_IO_FIELD_WRITE,   only: IO_Field_write, IO_Header_write
+USE MODE_IO_FILE,          only: IO_File_close, IO_File_open
+USE MODE_IO_MANAGE_STRUCT, only: IO_File_add2list
+USE MODE_ll
+USE MODE_MSG
+USE MODE_MODELN_HANDLER
+USE MODE_SPLITTINGZ_ll
+!
+USE MODI_OPEN_PRC_FILES
+USE MODI_PREP_SURF_MNH
+USE MODI_READ_ALL_NAMELISTS
+USE MODI_VERSION
+USE MODE_INI_CST, ONLY: INI_CST
+!
+IMPLICIT NONE
+!
+!*       0.1   Declaration of local variables
+!              ------------------------------
+!
+CHARACTER(LEN=28)     :: YATMFILE        ! name of the Atmospheric file
+CHARACTER(LEN=6)      :: YATMFILETYPE    ! type of the Atmospheric file
+CHARACTER(LEN=28)     :: YCHEMFILE       ! name of the Chemical file (not used)
+CHARACTER(LEN=6)      :: YCHEMFILETYPE   ! type of the Chemical file (not used)
+CHARACTER(LEN=28)     :: YCAMSFILE       ! name of the input CAMS file
+CHARACTER(LEN=6)      :: YCAMSFILETYPE   ! type of the input CAMS file
+CHARACTER(LEN=28)     :: YSURFFILE       ! name of the Surface file (not used)
+CHARACTER(LEN=6)      :: YSURFFILETYPE   ! type of the Surface file (not used)
+CHARACTER(LEN=28)     :: YPGDFILE        ! name of the physiographic data
+!                                        ! file
+!
+!* file management variables and counters
+!
+INTEGER               :: ILUOUT0         ! logical unit for listing file
+INTEGER               :: IRESP           ! return code in FM routines
+!
+INTEGER               :: IINFO_ll        ! return code of // routines
+CHARACTER (LEN=100)   :: HCOMMENT
+INTEGER               :: II, IJ, IGRID, ILENGTH
+!
+TYPE(TFILEDATA),POINTER :: TZATMFILE => NULL()
+TYPE(TFILEDATA),POINTER :: TZPRE_REAL1FILE => NULL()
+!
+!-------------------------------------------------------------------------------
+!
+!
+!*       1.    SET DEFAULT VALUES
+!              ------------------
+!
+CALL GOTO_MODEL(1)
+!
+CALL VERSION
+CPROGRAM='REAL  '
+CSTORAGE_TYPE='SU'
+!
+!-------------------------------------------------------------------------------
+!
+!*       2.    OPENNING OF THE FILES
+!              ---------------------
+CALL IO_Init()
+!
+CALL OPEN_PRC_FILES(TZPRE_REAL1FILE,YATMFILE, YATMFILETYPE,TZATMFILE &
+                                   ,YCHEMFILE,YCHEMFILETYPE &
+                                   ,YSURFFILE,YSURFFILETYPE &
+                                   ,YPGDFILE,TPGDFILE       &
+                                   ,YCAMSFILE,YCAMSFILETYPE)
+ILUOUT0 = TLUOUT0%NLU
+!
+!-------------------------------------------------------------------------------
+!
+!*       3.    INITIALIZATION OF PHYSICAL CONSTANTS
+!              ------------------------------------
+!
+CALL INI_CST
+!
+!-------------------------------------------------------------------------------
+!
+!*       4.    READING OF NAMELIST
+!              -------------------
+!
+!*       4.1   reading of configuration variables
+!
+CALL IO_File_close(TZPRE_REAL1FILE)
+!
+!*       4.2   reading of values of some configuration variables in namelist
+!
+CALL INI_FIELD_LIST()
+!
+CALL INI_FIELD_SCALARS()
+!
+CALL IO_Field_read(TPGDFILE,'IMAX',II)
+CALL IO_Field_read(TPGDFILE,'JMAX',IJ)
+CALL SET_JP_ll(JPMODELMAX,JPHEXT,JPVEXT,JPHEXT)
+CALL SET_DAD0_ll()
+CALL SET_DIM_ll(II, IJ, 1)
+CALL SET_LBX_ll('OPEN',1)
+CALL SET_LBY_ll('OPEN', 1)
+CALL SET_XRATIO_ll(1, 1)
+CALL SET_YRATIO_ll(1, 1)
+CALL SET_XOR_ll(1, 1)
+CALL SET_XEND_ll(II+2*JPHEXT, 1)
+CALL SET_YOR_ll(1, 1)
+CALL SET_YEND_ll(IJ+2*JPHEXT, 1)
+CALL SET_DAD_ll(0, 1)
+!JUANZ CALL INI_PARA_ll(IINFO_ll)
+CALL INI_PARAZ_ll(IINFO_ll)
+!
+!-------------------------------------------------------------------------------
+!
+!
+!*       5.    PREPARATION OF SURFACE FIELDS
+!              -----------------------------
+!
+!* reading of date
+!
+IF (YATMFILETYPE=='MESONH') THEN
+  CALL IO_File_add2list(TZATMFILE,TRIM(YATMFILE),'MNH','READ',KLFITYPE=1,KLFIVERB=1)
+  CALL IO_File_open(TZATMFILE)
+  CALL IO_Field_read(TZATMFILE,'DTCUR',TDTCUR)
+  CALL IO_File_close(TZATMFILE)
+ELSE
+  TDTCUR%nyear  = NUNDEF
+  TDTCUR%nmonth = NUNDEF
+  TDTCUR%nday   = NUNDEF
+  TDTCUR%xtime  = XUNDEF
+END IF
+!
+CALL SURFEX_ALLOC_LIST(1)
+YSURF_CUR => YSURF_LIST(1)
+CALL READ_ALL_NAMELISTS(YSURF_CUR,'MESONH','PRE',.FALSE.)
+CALL GOTO_SURFEX(1)
+!
+CALL IO_File_add2list(TINIFILE,TRIM(CINIFILE),'PGD','WRITE',KLFITYPE=1,KLFIVERB=1)
+!The open is done later in PREP_SURF_MNH when domain dimensions are known
+!
+TFILE_SURFEX => TINIFILE
+CALL PREP_SURF_MNH(YATMFILE,YATMFILETYPE,OINIFILEOPEN=.TRUE.)
+NULLIFY(TFILE_SURFEX)
+!
+!-------------------------------------------------------------------------------
+!
+CALL IO_Header_write(TINIFILE)
+CALL IO_Field_write(TINIFILE,'SURF','EXTE')
+CALL IO_Field_write(TINIFILE,'L1D', L1D)
+CALL IO_Field_write(TINIFILE,'L2D', L2D)
+CALL IO_Field_write(TINIFILE,'PACK',LPACK)
+!
+!-------------------------------------------------------------------------------
+WRITE(ILUOUT0,*) ' '
+WRITE(ILUOUT0,*) '----------------------------------'
+WRITE(ILUOUT0,*) '|                                |'
+WRITE(ILUOUT0,*) '|   PREP_SURFEX ends correctly   |'
+WRITE(ILUOUT0,*) '|                                |'
+WRITE(ILUOUT0,*) '----------------------------------'
+CALL IO_File_close(TINIFILE)
+!
+CALL FINALIZE_MNH()
+!-------------------------------------------------------------------------------
+!
+END PROGRAM PREP_SURFEX
diff --git a/src/PHYEX/ext/profilern.f90 b/src/PHYEX/ext/profilern.f90
new file mode 100644
index 0000000000000000000000000000000000000000..425ddf294fe45f0831ace0799a09e9cdf660735d
--- /dev/null
+++ b/src/PHYEX/ext/profilern.f90
@@ -0,0 +1,383 @@
+!MNH_LIC Copyright 2002-2023 CNRS, Meteo-France and Universite Paul Sabatier
+!MNH_LIC This is part of the Meso-NH software governed by the CeCILL-C licence
+!MNH_LIC version 1. See LICENSE, CeCILL-C_V1-en.txt and CeCILL-C_V1-fr.txt
+!MNH_LIC for details. version 1.
+!-----------------------------------------------------------------
+!      ##########################
+MODULE MODI_PROFILER_n
+!      ##########################
+!
+INTERFACE
+!
+      SUBROUTINE PROFILER_n( PZ, PRHODREF,                   &
+                             PU, PV, PW, PTH, PR, PSV, PTKE, &
+                             PTS, PP, PAER, PCIT, PSEA )
+!
+REAL, DIMENSION(:,:,:),   INTENT(IN)     :: PZ     ! z array
+REAL, DIMENSION(:,:,:),   INTENT(IN)     :: PU     ! horizontal wind X component
+REAL, DIMENSION(:,:,:),   INTENT(IN)     :: PV     ! horizontal wind Y component
+REAL, DIMENSION(:,:,:),   INTENT(IN)     :: PW     ! vertical wind
+REAL, DIMENSION(:,:,:),   INTENT(IN)     :: PTH    ! potential temperature
+REAL, DIMENSION(:,:,:),   INTENT(IN)     :: PRHODREF
+REAL, DIMENSION(:,:,:,:), INTENT(IN)     :: PR     ! water mixing ratios
+REAL, DIMENSION(:,:,:,:), INTENT(IN)     :: PSV    ! Scalar variables
+REAL, DIMENSION(:,:,:),   INTENT(IN)     :: PTKE   ! turbulent kinetic energy
+REAL, DIMENSION(:,:),     INTENT(IN)     :: PTS    ! surface temperature
+REAL, DIMENSION(:,:,:),   INTENT(IN)     :: PP     ! pressure
+REAL, DIMENSION(:,:,:,:), INTENT(IN)     :: PAER   ! aerosol extinction
+REAL, DIMENSION(:,:,:),   INTENT(IN)     :: PCIT   ! ice concentration
+REAL, DIMENSION(:,:), OPTIONAL, INTENT(IN)     :: PSEA   ! for radar
+!
+!-------------------------------------------------------------------------------
+!
+END SUBROUTINE PROFILER_n
+!
+END INTERFACE
+!
+END MODULE MODI_PROFILER_n
+!
+!     ########################################################
+      SUBROUTINE PROFILER_n( PZ, PRHODREF,                   &
+                             PU, PV, PW, PTH, PR, PSV, PTKE, &
+                             PTS, PP, PAER, PCIT, PSEA )
+!     ########################################################
+!
+!
+!
+!!****  *PROFILER_n* - (advects and) stores 
+!!                                stations/s in the model
+!!
+!!    PURPOSE
+!!    -------
+!
+!
+!!**  METHOD
+!!    ------
+!!    
+!!
+!!
+!!    EXTERNAL
+!!    --------
+!!
+!!    IMPLICIT ARGUMENTS
+!!    ------------------
+!!
+!!    REFERENCE
+!!    ---------
+!!
+!!    AUTHOR
+!!    ------
+!!      Pierre TULET / Valery Masson             * Meteo-France *
+!!
+!!    MODIFICATIONS
+!!    -------------
+!!     Original 15/02/2002
+!!     March 2013 : C.Lac : Corrections for 1D + new fields (RARE,THV,DD,FF)
+!!     April 2014 : C.Lac : Call RADAR only if ICE3   
+!!     C.Lac 10/2016  Add visibility diagnostic
+!!     March,28, 2018 (P. Wautelet) replace TEMPORAL_DIST by DATETIME_DISTANCE
+!!  Philippe Wautelet: 05/2016-04/2018: new data structures and calls for I/O
+!  P. Wautelet 13/09/2019: budget: simplify and modernize date/time management
+!  M. Taufour  05/07/2021: modify RARE for hydrometeors containing ice and add bright band calculation for RARE
+!  P. Wautelet 09/02/2022: add message when some variables not computed
+!                          + bugfix: put values in variables in this case
+!                          + move some operations outside a do loop
+!  P. Wautelet    04/2022: restructure profilers for better performance, reduce memory usage and correct some problems/bugs
+!  P. Wautelet 01/06/2023: deduplicate code => moved to modd/mode_sensors.f90
+! --------------------------------------------------------------------------
+!       
+!*      0. DECLARATIONS
+!          ------------
+!
+USE MODD_ALLPROFILER_n,    ONLY: LDIAG_SURFRAD_PROF
+USE MODD_CST,              ONLY: XCPD, XG, XP00, XPI, XRD, XRV
+USE MODD_DIAG_IN_RUN,      ONLY: XCURRENT_TKE_DISS
+USE MODD_GRID,             ONLY: XBETA, XLON0, XRPK
+USE MODD_NSV,              ONLY: NSV_C2R2BEG, NSV_LIMA_NC, NSV_LIMA_NR, NSV_LIMA_NI
+USE MODD_PARAMETERS,       ONLY: JPVEXT, XUNDEF
+USE MODD_PARAM_n,          ONLY: CCLOUD, CRAD
+USE MODD_PROFILER_n
+!
+USE MODE_FGAU,             ONLY: GAULAG
+USE MODE_MSG
+USE MODE_SENSOR,           ONLY: Sensor_rare_compute, Sensor_wc_compute
+USE MODE_STATPROF_TOOLS,   ONLY: STATPROF_DIAG_SURFRAD
+!
+USE MODI_GPS_ZENITH_GRID
+USE MODI_WATER_SUM
+!
+!
+IMPLICIT NONE
+!
+!
+!*      0.1  declarations of arguments
+!
+!
+REAL, DIMENSION(:,:,:),   INTENT(IN)     :: PZ     ! z array
+REAL, DIMENSION(:,:,:),   INTENT(IN)     :: PU     ! horizontal wind X component
+REAL, DIMENSION(:,:,:),   INTENT(IN)     :: PV     ! horizontal wind Y component
+REAL, DIMENSION(:,:,:),   INTENT(IN)     :: PW     ! vertical wind
+REAL, DIMENSION(:,:,:),   INTENT(IN)     :: PTH    ! potential temperature
+REAL, DIMENSION(:,:,:),   INTENT(IN)     :: PRHODREF
+REAL, DIMENSION(:,:,:,:), INTENT(IN)     :: PR     ! water mixing ratios
+REAL, DIMENSION(:,:,:,:), INTENT(IN)     :: PSV    ! Scalar variables
+REAL, DIMENSION(:,:,:),   INTENT(IN)     :: PTKE   ! turbulent kinetic energy
+REAL, DIMENSION(:,:),     INTENT(IN)     :: PTS    ! surface temperature
+REAL, DIMENSION(:,:,:),   INTENT(IN)     :: PP     ! pressure
+REAL, DIMENSION(:,:,:,:), INTENT(IN)     :: PAER   ! aerosol extinction
+REAL, DIMENSION(:,:,:),   INTENT(IN)     :: PCIT   ! ice concentration
+REAL, DIMENSION(:,:), OPTIONAL, INTENT(IN)     :: PSEA   ! for radar
+!
+!-------------------------------------------------------------------------------
+!
+!       0.2  declaration of local variables
+!
+!
+INTEGER :: IKB
+INTEGER :: IKE
+INTEGER :: IKU
+!
+!
+REAL, DIMENSION(SIZE(PSV,1),SIZE(PSV,2),SIZE(PSV,3),SIZE(PSV,4))  :: ZWORK
+REAL, DIMENSION(SIZE(PSV,1),SIZE(PSV,2),SIZE(PSV,3),SIZE(PAER,4)) :: ZWORK2
+!
+INTEGER :: IN     ! time index
+INTEGER :: JSV    ! loop counter
+INTEGER :: JK     ! loop
+INTEGER :: JP     ! loop for profilers
+INTEGER :: IKRAD
+!
+REAL,DIMENSION(SIZE(PZ,3)) :: ZU_PROFILER ! horizontal wind speed profile at station location (along x)
+REAL,DIMENSION(SIZE(PZ,3)) :: ZV_PROFILER ! horizontal wind speed profile at station location (along y)
+REAL,DIMENSION(SIZE(PZ,3)) :: ZFF         ! horizontal wind speed profile at station location 
+REAL,DIMENSION(SIZE(PZ,3)) :: ZDD         ! horizontal wind speed profile at station location 
+REAL,DIMENSION(SIZE(PZ,3)) :: ZRHOD       ! dry air density in moist mixing profile at station location
+REAL,DIMENSION(SIZE(PZ,3)) :: ZRV         ! water vapour mixing ratio profile at station location
+REAL,DIMENSION(SIZE(PZ,3)) :: ZT          ! temperature profile at station location
+REAL,DIMENSION(SIZE(PZ,3)) :: ZTV         ! virtual temperature profile at station location
+REAL,DIMENSION(SIZE(PZ,3)) :: ZPRES       ! pressure profile at station location
+REAL,DIMENSION(SIZE(PZ,3)) :: ZE          ! water vapour partial pressure profile at station location
+REAL,DIMENSION(SIZE(PZ,3)) :: ZZ          ! altitude of model levels at station location
+REAL,DIMENSION(SIZE(PZ,3)-1) :: ZZHATM      ! altitude of mass point levels at station location
+REAL                       :: ZGAM        ! rotation between meso-nh base and spherical lat-lon base.
+!
+REAL                       :: XZS_GPS       ! GPS station altitude
+REAL                       :: ZIWV        ! integrated water vapour at station location
+REAL                       :: ZZM_STAT      ! altitude at station location
+REAL                       :: ZTM_STAT      ! temperature at station location
+REAL                       :: ZTV_STAT      ! virtual temperature at station location
+REAL                       :: ZPM_STAT      ! pressure at station location
+REAL                       :: ZEM_STAT      ! water vapour partial pressure at station location
+REAL                       :: ZZTD_PROFILER ! ZTD at station location
+REAL                       :: ZZHD_PROFILER ! ZHD at station location
+REAL                       :: ZZWD_PROFILER ! ZWD at station location
+REAL                       :: ZZHDR         ! ZHD correction at station location
+REAL                       :: ZZWDR         ! ZWD correction at station location
+!
+REAL,DIMENSION(SIZE(PTH,1),SIZE(PTH,2))              :: ZZTD,ZZHD,ZZWD
+REAL,DIMENSION(SIZE(PTH,1),SIZE(PTH,2),SIZE(PTH,3))  :: ZTEMP,ZTHV,ZTEMPV
+REAL,DIMENSION(SIZE(PTH,1),SIZE(PTH,2),SIZE(PTH,3))  :: ZVISIGUL, ZVISIKUN
+REAL ::  ZK1,ZK2,ZK3            ! k1, k2 and K3 atmospheric refractivity constants
+REAL  :: ZRDSRV                 ! XRD/XRV
+!
+!----------------------------------------------------------------------------
+!
+!*      2.   PRELIMINARIES
+!            -------------
+!
+!*      2.0   Refractivity coeficients
+!             ------------------------
+! Bevis et al. (1994)
+ZK1 = 0.776       ! K/Pa
+ZK2 = 0.704       ! K/Pa
+ZK3 = 3739.       ! K2/Pa
+ZRDSRV=XRD/XRV
+!
+!*      2.1  Indices
+!            -------
+!
+IKU =   SIZE(PZ,3)     ! nombre de niveaux sur la verticale
+IKB = JPVEXT+1
+IKE = IKU-JPVEXT
+!
+!----------------------------------------------------------------------------
+!
+!*      3.4  instant of storage
+!            ------------------
+!
+IF ( .NOT. TPROFILERS_TIME%STORESTEP_CHECK_AND_SET( IN ) ) RETURN !No profiler storage at this time step
+!
+!----------------------------------------------------------------------------
+!
+!*      8.   DATA RECORDING
+!            --------------
+!
+ZTEMP(:,:,:)=PTH(:,:,:)*(PP(:,:,:)/ XP00) **(XRD/XCPD)
+! Theta_v
+ZTHV(:,:,:) = PTH(:,:,:) / (1.+WATER_SUM(PR(:,:,:,:)))*(1.+PR(:,:,:,1)/ZRDSRV)
+! virtual temperature
+ZTEMPV(:,:,:)=ZTHV(:,:,:)*(PP(:,:,:)/ XP00) **(XRD/XCPD)
+CALL GPS_ZENITH_GRID(PR(:,:,:,1),ZTEMP,PP,ZZTD,ZZHD,ZZWD)
+
+IF ( CCLOUD == 'C2R2' .OR. CCLOUD == 'KHKO' ) THEN
+  ! Gultepe formulation
+  ZVISIGUL(:,:,:) = 10E5 !default value
+  WHERE ( (PR(:,:,:,2) /=0. ) .AND. (PSV(:,:,:,NSV_C2R2BEG+1) /=0. ) )
+    ZVISIGUL(:,:,:) =1.002/(PR(:,:,:,2)*PRHODREF(:,:,:)*PSV(:,:,:,NSV_C2R2BEG+1))**0.6473
+  END WHERE
+END IF
+
+IF ( CCLOUD /= 'NONE' .AND. CCLOUD /= 'REVE' ) THEN
+  ! Kunkel formulation
+  ZVISIKUN(:,:,:) = 10E5  !default value
+  WHERE ( PR(:,:,:,2) /=0 )
+    ZVISIKUN(:,:,:) =0.027/(10**(-8)+(PR(:,:,:,2)/(1+PR(:,:,:,2))*PRHODREF(:,:,:)*1000))**0.88
+  END WHERE
+END IF
+!
+PROFILER: DO JP = 1, NUMBPROFILER_LOC
+  TPROFILERS(JP)%NSTORE_CUR = IN
+
+  ZZ(:)                  = TPROFILERS(JP)%INTERP_HOR_FROM_MASSPOINT( PZ )
+  ZRHOD(:)               = TPROFILERS(JP)%INTERP_HOR_FROM_MASSPOINT( PRHODREF )
+  ZPRES(:)               = TPROFILERS(JP)%INTERP_HOR_FROM_MASSPOINT( PP )
+  ZU_PROFILER(:)         = TPROFILERS(JP)%INTERP_HOR_FROM_UPOINT( PU )
+  ZV_PROFILER(:)         = TPROFILERS(JP)%INTERP_HOR_FROM_VPOINT( PV )
+  ZGAM                   = (XRPK * (TPROFILERS(JP)%XLON_CUR - XLON0) - XBETA)*(XPI/180.)
+  ZFF(:)                 = SQRT(ZU_PROFILER(:)**2 + ZV_PROFILER(:)**2)
+  DO JK=1,IKU
+    IF (ZU_PROFILER(JK) >=0. .AND. ZV_PROFILER(JK) > 0.) &
+      ZDD(JK) = ATAN(ABS(ZU_PROFILER(JK)/ZV_PROFILER(JK))) * 180./XPI + 180.
+    IF (ZU_PROFILER(JK) >0. .AND. ZV_PROFILER(JK) <= 0.) &
+      ZDD(JK) = ATAN(ABS(ZV_PROFILER(JK)/ZU_PROFILER(JK))) * 180./XPI + 270.
+    IF (ZU_PROFILER(JK) <=0. .AND. ZV_PROFILER(JK) < 0.) &
+      ZDD(JK) = ATAN(ABS(ZU_PROFILER(JK)/ZV_PROFILER(JK))) * 180./XPI
+    IF (ZU_PROFILER(JK) <0. .AND. ZV_PROFILER(JK) >= 0.) &
+      ZDD(JK) = ATAN(ABS(ZV_PROFILER(JK)/ZU_PROFILER(JK))) * 180./XPI + 90.
+    IF (ZU_PROFILER(JK) == 0. .AND. ZV_PROFILER(JK) == 0.) &
+      ZDD(JK) = XUNDEF
+  END DO
+  ! GPS IWV and ZTD
+  XZS_GPS=TPROFILERS(JP)%XZ_CUR
+  IF ( ABS( ZZ(IKB)-XZS_GPS ) < 150 ) THEN ! distance between real and model orography ok
+    ZRV(:)                 = TPROFILERS(JP)%INTERP_HOR_FROM_MASSPOINT( PR(:,:,:,1) )
+    ZT(:)                  = TPROFILERS(JP)%INTERP_HOR_FROM_MASSPOINT( ZTEMP )
+    ZE(:)                  = ZPRES(:)*ZRV(:)/(ZRDSRV+ZRV(:))
+    ZTV(:)                 = TPROFILERS(JP)%INTERP_HOR_FROM_MASSPOINT( ZTEMPV )
+    ZZTD_PROFILER          = TPROFILERS(JP)%INTERP_HOR_FROM_MASSPOINT( ZZTD )
+    ZZHD_PROFILER          = TPROFILERS(JP)%INTERP_HOR_FROM_MASSPOINT( ZZHD )
+    ZZWD_PROFILER          = TPROFILERS(JP)%INTERP_HOR_FROM_MASSPOINT( ZZWD )
+    ZIWV = 0.
+    DO JK=IKB,IKE
+      ZIWV=ZIWV+ZRHOD(JK)*ZRV(JK)*(ZZ(JK+1)-ZZ(JK))
+    END DO
+    IF (ZZ(IKB) < XZS_GPS) THEN ! station above the model orography
+      DO JK=IKB+1,IKE
+        IF ( ZZ(JK) < XZS_GPS) THEN ! whole layer to remove
+          ZZHDR=( 1.E-6 * ZK1 * ZPRES(JK-1) * ( ZZ(JK) - ZZ(JK-1) ) / ZTV(JK-1))
+          ZZWDR=( 1.E-6 *  ( (ZK2-ZRDSRV*ZK1) + ( ZK3/ZT(JK-1) ) ) * &
+             ZE(JK-1)* ( ZZ(JK) - ZZ(JK-1) ) / ZT(JK-1) )
+          ZZHD_PROFILER=ZZHD_PROFILER-ZZHDR
+          ZZWD_PROFILER=ZZWD_PROFILER-ZZWDR
+          ZZTD_PROFILER=ZZTD_PROFILER-ZZHDR-ZZWDR
+        ELSE                       ! partial layer to remove
+          ZZHDR=( 1.E-6 * ZK1 * ZPRES(JK-1) * ( XZS_GPS - ZZ(JK-1) ) / ZTV(JK-1))
+          ZZWDR=( 1.E-6 *  ( (ZK2-ZRDSRV*ZK1) + ( ZK3/ZT(JK-1) ) ) * &
+             ZE(JK-1)* ( XZS_GPS - ZZ(JK-1) ) / ZT(JK-1) )
+          ZZHD_PROFILER=ZZHD_PROFILER-ZZHDR
+          ZZWD_PROFILER=ZZWD_PROFILER-ZZWDR
+          ZZTD_PROFILER=ZZTD_PROFILER-ZZHDR-ZZWDR
+          EXIT
+        END IF
+      END DO
+    ELSE ! station below the model orography
+! Extrapolate variables below the model orography assuming constant T&Tv gradients,
+! constant rv and hydrostatic law
+      ZZHATM(:)=0.5*(ZZ(1:IKU-1)+ZZ(2:IKU))
+      ZZM_STAT=0.5*(XZS_GPS+ZZ(IKB))
+      ZTM_STAT=ZT(IKB) + ( (ZZM_STAT-ZZHATM(IKB))*&
+         ( ZT(IKB)- ZT(IKB+1) )/(ZZHATM(IKB)-ZZHATM(IKB+1)) )
+      ZTV_STAT=ZTV(IKB) + ( (ZZM_STAT-ZZHATM(IKB))*&
+         ( ZTV(IKB)- ZTV(IKB+1) )/(ZZHATM(IKB)-ZZHATM(IKB+1)) )
+      ZPM_STAT = ZPRES(IKB) * EXP(XG *(ZZM_STAT-ZZHATM(IKB))&
+         /(XRD* 0.5 *(ZTV_STAT+ZTV(IKB))))
+      ZEM_STAT = ZPM_STAT * ZRV(IKB) / ( ZRDSRV + ZRV(IKB) )
+! add contribution below the model orography
+      ZZHDR=( 1.E-6 * ZK1 * ZPM_STAT * ( ZZ(IKB) - XZS_GPS ) / ZTV_STAT )
+      ZZWDR=( 1.E-6 * ( (ZK2-ZRDSRV*ZK1) + (ZK3/ZTM_STAT) )&
+         * ZEM_STAT* ( ZZ(IKB) - XZS_GPS ) / ZTM_STAT )
+      ZZHD_PROFILER=ZZHD_PROFILER+ZZHDR
+      ZZWD_PROFILER=ZZWD_PROFILER+ZZWDR
+      ZZTD_PROFILER=ZZTD_PROFILER+ZZHDR+ZZWDR
+    END IF
+    TPROFILERS(JP)%XIWV(IN)= ZIWV
+    TPROFILERS(JP)%XZTD(IN)= ZZTD_PROFILER
+    TPROFILERS(JP)%XZWD(IN)= ZZWD_PROFILER
+    TPROFILERS(JP)%XZHD(IN)= ZZHD_PROFILER
+  ELSE
+    CMNHMSG(1) = 'altitude of profiler ' // TRIM( TPROFILERS(JP)%CNAME ) // ' is too far from orography'
+    CMNHMSG(2) = 'some variables are therefore not computed (IWV, ZTD, ZWD, ZHD)'
+    CALL PRINT_MSG( NVERB_WARNING, 'GEN', 'PROFILER_n', OLOCAL = .TRUE. )
+    TPROFILERS(JP)%XIWV(IN)= XUNDEF
+    TPROFILERS(JP)%XZTD(IN)= XUNDEF
+    TPROFILERS(JP)%XZWD(IN)= XUNDEF
+    TPROFILERS(JP)%XZHD(IN)= XUNDEF
+  END IF
+  TPROFILERS(JP)%XZON (:,IN) = ZU_PROFILER(:) * COS(ZGAM) + ZV_PROFILER(:) * SIN(ZGAM)
+  TPROFILERS(JP)%XMER (:,IN) = - ZU_PROFILER(:) * SIN(ZGAM) + ZV_PROFILER(:) * COS(ZGAM)
+  TPROFILERS(JP)%XFF  (:,IN) = ZFF(:)
+  TPROFILERS(JP)%XDD  (:,IN) = ZDD(:)
+  TPROFILERS(JP)%XW   (:,IN) = TPROFILERS(JP)%INTERP_HOR_FROM_MASSPOINT( PW )
+  TPROFILERS(JP)%XTH  (:,IN) = TPROFILERS(JP)%INTERP_HOR_FROM_MASSPOINT( PTH )
+  TPROFILERS(JP)%XTHV (:,IN) = TPROFILERS(JP)%INTERP_HOR_FROM_MASSPOINT( ZTHV )
+  IF ( CCLOUD == 'C2R2' .OR. CCLOUD == 'KHKO' ) &
+    TPROFILERS(JP)%XVISIGUL(:,IN) = TPROFILERS(JP)%INTERP_HOR_FROM_MASSPOINT( ZVISIGUL )
+  IF ( CCLOUD /= 'NONE' .AND. CCLOUD /= 'REVE' ) &
+    TPROFILERS(JP)%XVISIKUN(:,IN) = TPROFILERS(JP)%INTERP_HOR_FROM_MASSPOINT( ZVISIKUN )
+  TPROFILERS(JP)%XZZ  (:,IN) = ZZ(:)
+  TPROFILERS(JP)%XRHOD(:,IN) = ZRHOD(:)
+  IF (CCLOUD=="LIMA") THEN
+    TPROFILERS(JP)%XCIZ(:,IN) = TPROFILERS(JP)%INTERP_HOR_FROM_MASSPOINT( PSV(:,:,:,NSV_LIMA_NI) )
+    TPROFILERS(JP)%XCCZ(:,IN) = TPROFILERS(JP)%INTERP_HOR_FROM_MASSPOINT( PSV(:,:,:,NSV_LIMA_NC) )
+    TPROFILERS(JP)%XCRZ(:,IN) = TPROFILERS(JP)%INTERP_HOR_FROM_MASSPOINT( PSV(:,:,:,NSV_LIMA_NR) )
+  ELSE IF ( CCLOUD=="ICE3" .OR. CCLOUD=="ICE4" ) THEN
+    TPROFILERS(JP)%XCIZ(:,IN) = TPROFILERS(JP)%INTERP_HOR_FROM_MASSPOINT( PCIT )
+  END IF
+
+  CALL Sensor_wc_compute(   TPROFILERS(JP), IN, PR, PRHODREF )
+  CALL Sensor_rare_compute( TPROFILERS(JP), IN, PR, PSV, PRHODREF, PCIT, ZTEMP, ZZ, PSEA )
+  !!
+  TPROFILERS(JP)%XP   (:,IN) = TPROFILERS(JP)%INTERP_HOR_FROM_MASSPOINT( PP )
+  !
+  DO JSV=1,SIZE(PR,4)
+    TPROFILERS(JP)%XR   (:,IN,JSV) = TPROFILERS(JP)%INTERP_HOR_FROM_MASSPOINT( PR(:,:,:,JSV) )
+  END DO
+    ZWORK(:,:,:,:)=PSV(:,:,:,:)
+    ZWORK(:,:,1,:)=PSV(:,:,2,:)
+  DO JSV=1,SIZE(PSV,4)
+    TPROFILERS(JP)%XSV  (:,IN,JSV) = TPROFILERS(JP)%INTERP_HOR_FROM_MASSPOINT( ZWORK(:,:,:,JSV) )
+  END DO
+  ZWORK2(:,:,:,:) = 0.
+  DO JK=IKB,IKE
+    IKRAD = JK - JPVEXT
+    ZWORK2(:,:,JK,:)=PAER(:,:,IKRAD,:)
+  END DO
+  DO JSV=1,SIZE(PAER,4)
+    TPROFILERS(JP)%XAER(:,IN,JSV) = TPROFILERS(JP)%INTERP_HOR_FROM_MASSPOINT( ZWORK2(:,:,:,JSV) )
+  END DO
+  IF (SIZE(PTKE)>0) TPROFILERS(JP)%XTKE  (:,IN) = TPROFILERS(JP)%INTERP_HOR_FROM_MASSPOINT( PTKE )
+
+  ! XRHOD_SENSOR is not computed for profilers because not very useful
+  ! If needed, the interpolation must also be done vertically
+  ! (and therefore the vertical interpolation coefficients have to be computed)
+  ! TPROFILERS(JP)%XRHOD_SENSOR(IN) = ...
+
+  IF ( CRAD /= 'NONE' ) TPROFILERS(JP)%XTSRAD(IN) = TPROFILERS(JP)%INTERP_HOR_FROM_MASSPOINT( PTS )
+  !
+  IF ( LDIAG_SURFRAD_PROF ) CALL STATPROF_DIAG_SURFRAD(TPROFILERS(JP), IN )
+  TPROFILERS(JP)%XTKE_DISS(:,IN) = TPROFILERS(JP)%INTERP_HOR_FROM_MASSPOINT( XCURRENT_TKE_DISS )
+END DO PROFILER
+!
+!----------------------------------------------------------------------------
+!
+END SUBROUTINE PROFILER_n
diff --git a/src/PHYEX/ext/radar_scattering.f90 b/src/PHYEX/ext/radar_scattering.f90
new file mode 100644
index 0000000000000000000000000000000000000000..047cb5800666f7797f23594b33835e2a59d99dd9
--- /dev/null
+++ b/src/PHYEX/ext/radar_scattering.f90
@@ -0,0 +1,2088 @@
+!MNH_LIC Copyright 2004-2019 CNRS, Meteo-France and Universite Paul Sabatier
+!MNH_LIC This is part of the Meso-NH software governed by the CeCILL-C licence
+!MNH_LIC version 1. See LICENSE, CeCILL-C_V1-en.txt and CeCILL-C_V1-fr.txt
+!MNH_LIC for details. version 1.
+!-----------------------------------------------------------------
+!     ######spl
+       MODULE MODI_RADAR_SCATTERING 
+!      #############################
+!
+INTERFACE
+    SUBROUTINE RADAR_SCATTERING(PT_RAY,PRHODREF_RAY,PR_RAY,PI_RAY,PCIT_RAY,PS_RAY,PG_RAY,PVDOP_RAY, &
+   PELEV,PX_H,PX_V,PW_H,PW_V,PZE,PBU_MASK_RAY,PCR_RAY,PH_RAY)
+REAL, DIMENSION(:,:,:,:,:,:),INTENT(IN)  :: PT_RAY ! temperature interpolated along the rays
+REAL, DIMENSION(:,:,:,:,:,:),INTENT(IN)  :: PRHODREF_RAY ! 
+REAL, DIMENSION(:,:,:,:,:,:),INTENT(IN)  :: PR_RAY  ! rainwater mixing ratio interpolated along the rays
+REAL, DIMENSION(:,:,:,:,:,:),INTENT(IN)  :: PI_RAY  ! pristine ice mixing ratio interpolated along the rays
+REAL, DIMENSION(:,:,:,:,:,:), INTENT(IN) :: PCIT_RAY  ! pristine ice concentration interpolated along the rays
+REAL, DIMENSION(:,:,:,:,:,:), INTENT(IN) :: PS_RAY !aggregates mixing ratio interpolated along the rays
+REAL, DIMENSION(:,:,:,:,:,:), INTENT(IN) :: PG_RAY  ! graupel         mixing ratio interpolated along the rays
+REAL, DIMENSION(:,:,:,:,:,:), INTENT(IN) :: PVDOP_RAY !Doppler radial velocity interpolated along the rays
+REAL, DIMENSION(:,:,:,:),     INTENT(IN) :: PELEV ! elevation
+REAL, DIMENSION(:),           INTENT(IN) :: PX_H ! Gaussian horizontal nodes
+REAL, DIMENSION(:),           INTENT(IN) :: PX_V ! Gaussian vertical nodes
+REAL, DIMENSION(:),           INTENT(IN) :: PW_H ! Gaussian horizontal weights
+REAL, DIMENSION(:),           INTENT(IN) :: PW_V ! Gaussian vertical weights
+REAL,DIMENSION(:,:,:,:,:),    INTENT(INOUT) :: PZE ! 5D matrix (iradar, ielev, iaz, irangestep, ivar) containing the radar variables that will be calculated
+!in polar or cartesian projection (same projection as the observation grid)
+! convective/stratiform
+REAL, DIMENSION(:,:,:,:,:,:),INTENT(INOUT) :: PBU_MASK_RAY
+REAL, DIMENSION(:,:,:,:,:,:),OPTIONAL,INTENT(IN)  :: PCR_RAY  ! rainwater concentration interpolated along the rays
+REAL, DIMENSION(:,:,:,:,:,:),OPTIONAL,INTENT(IN)  :: PH_RAY   ! hail mixing ratio interpolated along the rays
+    END SUBROUTINE RADAR_SCATTERING
+END INTERFACE
+END MODULE MODI_RADAR_SCATTERING
+!
+!     ######spl
+       SUBROUTINE RADAR_SCATTERING(PT_RAY,PRHODREF_RAY,PR_RAY,PI_RAY,PCIT_RAY, &
+            PS_RAY,PG_RAY,PVDOP_RAY,PELEV,PX_H,PX_V,PW_H,PW_V,PZE,PBU_MASK_RAY,PCR_RAY,PH_RAY)
+!     ##############################
+!
+!!****  *RADAR_SCATTERING* - computes radar reflectivities.
+!!
+!!    PURPOSE
+!!    -------
+!!      Compute equivalent reflectivities of a mixed phase cloud.
+!!
+!!**  METHOD
+!!    ------
+!!      The reflectivities are computed using the n(D) * sigma(D) formula. The 
+!!    equivalent reflectiviy is the sum of the reflectivity produced by the
+!!    the raindrops and the equivalent reflectivities of the ice crystals.
+!!    The latter are computed using the mass-equivalent diameter.
+!!    Four types of diffusion are possible : Rayleigh, Mie, T-matrix, and
+!!    Rayleigh-Gans (Kerker, 1969, Chap. 10; Battan, 1973, Sec. 5.4; van de
+!!    Hulst, 1981, Sec. 6.32; Doviak and Zrnic, 1993, p. 249; Bringi and 
+!!    Chandrasekar, 2001, Chap. 2).
+!!    The integration over diameters for Mie and T-matrix methods is done by
+!!    using Gauss-Laguerre quadrature (Press et al. 1986). Attenuation is taken
+!!    into account by computing the extinction efficiency and correcting 
+!!    reflectivities along the beam path.
+!!    Gaussian quadrature methods are used to model the beam broadening (Gauss-
+!!    Hermite or Gauss-Legendre, see Press et al. 1986).
+!!      
+!!
+!!    EXTERNAL
+!!    --------
+!!
+!!    IMPLICIT ARGUMENTS
+!!    ------------------
+!!      Module MODD_CST
+!!        XLIGHTSPEED
+!!        XPI
+!!      Module MODD_ARF
+!!
+!!    REFERENCE
+!!    ---------
+!!      Press, W. H., B. P. Flannery, S. A. Teukolsky et W. T. Vetterling, 1986: 
+!!    Numerical Recipes: The Art of Scientific Computing. Cambridge University 
+!!    Press, 818 pp.
+!!      Probert-Jones, J. R., 1962 : The radar equation in meteorology. Quart. 
+!!    J. Roy. Meteor. Soc., 88, 485-495.
+!!
+!!    AUTHOR
+!!    ------
+!!      O. Caumont & V. Ducrocq      * Meteo-France *
+!!
+!!    MODIFICATIONS
+!!    -------------
+!!      Original   26/03/2004 
+!!      O. Caumont 09/09/2009 minor changes to compute radial velocities when no
+!!                              hydrometeors so as to emulate wind lidar
+!!      O. Caumont 21/12/2009 correction of bugs to compute KDP.
+!!      O. Caumont 11/02/2010 thresholding and conversion from linear to 
+!!          log values after interpolation instead of before.
+!!      G.Tanguy 25/03/2010 Introduction of MODD_TMAT and ALLOCATE/DEALLOCATE
+!!      C.Augros  2014 New simulator for T matrice
+!!      G.Delautier 10/2014 : Mise a jour simulateur T-matrice pour LIMA
+!!  Philippe Wautelet: 05/2016-04/2018: new data structures and calls for I/O
+!-------------------------------------------------------------------------------
+!
+!*       0.    DECLARATIONS
+!              ------------
+!
+USE MODD_CST
+USE MODD_IO,           ONLY: TFILEDATA
+USE MODD_LUNIT
+USE MODD_PARAMETERS
+USE MODD_PARAM_ICE_n,      ONLY: LSNOW_T_I=>LSNOW_T
+USE MODD_RAIN_ICE_DESCR_n, ONLY: XALPHAR_I=>XALPHAR,XNUR_I=>XNUR,XDR_I=>XDR,XLBEXR_I=>XLBEXR,&
+                               XLBR_I=>XLBR,XCCR_I=>XCCR,XBR_I=>XBR,XCR_I=>XCR,&
+                               XALPHAS_I=>XALPHAS,XNUS_I=>XNUS,XDS_I=>XDS,XLBEXS_I=>XLBEXS,&
+                               XLBS_I=>XLBS,XCCS_I=>XCCS,XNS_I=>XNS,XAS_I=>XAS,XBS_I=>XBS,XCXS_I=>XCXS,XCS_I=>XCS,&
+                               XALPHAG_I=>XALPHAG,XNUG_I=>XNUG,XDG_I=>XDG,XLBEXG_I=>XLBEXG,&
+                               XLBG_I=>XLBG,XCCG_I=>XCCG,XAG_I=>XAG,XBG_I=>XBG,XCXG_I=>XCXG,XCG_I=>XCG,&
+                               XALPHAH_I=>XALPHAH,XNUH_I=>XNUH,XDH_I=>XDH,XLBEXH_I=>XLBEXH,&
+                               XLBH_I=>XLBH,XCCH_I=>XCCH,XAH_I=>XAH,XBH_I=>XBH,XCXH_I=>XCXH,XCH_I=>XCH,&
+                               XALPHAI_I=>XALPHAI,XNUI_I=>XNUI,XDI_I=>XDI,XLBEXI_I=>XLBEXI,&
+                               XLBI_I=>XLBI,XAI_I=>XAI,XBI_I=>XBI,XC_I_I=>XC_I,&
+                               XRTMIN_I=>XRTMIN,        &
+                               XLBDAS_MAX_I=>XLBDAS_MAX,XLBDAS_MIN_I=>XLBDAS_MIN,XTRANS_MP_GAMMAS_I=>XTRANS_MP_GAMMAS
+!!LIMA         
+USE MODD_PARAM_LIMA_WARM, ONLY: XDR_L=>XDR,XLBEXR_L=>XLBEXR,XLBR_L=>XLBR,XBR_L=>XBR,XCR_L=>XCR
+USE MODD_PARAM_LIMA_COLD, ONLY: XDI_L=>XDI,XLBEXI_L=>XLBEXI,XLBI_L=>XLBI,XAI_L=>XAI,XBI_L=>XBI,XC_I_L=>XC_I,&
+                                XDS_L=>XDS,XLBEXS_L=>XLBEXS,XLBS_L=>XLBS,XCCS_L=>XCCS,XNS_L=>XNS,XAS_L=>XAS,XBS_L=>XBS,&
+                                XCXS_L=>XCXS,XCS_L=>XCS,&
+                                XLBDAS_MAX_L=>XLBDAS_MAX,XLBDAS_MIN_L=>XLBDAS_MIN,XTRANS_MP_GAMMAS_L=>XTRANS_MP_GAMMAS
+
+USE MODD_PARAM_LIMA_MIXED, ONLY:XDG_L=>XDG,XLBEXG_L=>XLBEXG,XLBG_L=>XLBG,XCCG_L=>XCCG,XAG_L=>XAG,XBG_L=>XBG,XCXG_L=>XCXG,XCG_L=>XCG
+USE MODD_PARAM_LIMA, ONLY: XALPHAR_L=>XALPHAR,XNUR_L=>XNUR,XALPHAS_L=>XALPHAS,XNUS_L=>XNUS,&
+                           XALPHAG_L=>XALPHAG,XNUG_L=>XNUG, XALPHAI_L=>XALPHAI,XNUI_L=>XNUI,&
+                           XRTMIN_L=>XRTMIN, LSNOW_T_L=>LSNOW_T
+!!LIMA
+USE MODD_RADAR, ONLY:XLAM_RAD,XSTEP_RAD,NBELEV,NDIFF,LATT,NPTS_GAULAG,LQUAD,XVALGROUND,NDGS, &
+     LFALL,LWBSCS,LWREFL,XREFLVDOPMIN,XREFLMIN,LSNRT,XSNRMIN
+USE MODD_TMAT
+! 
+USE MODE_ARF
+USE MODE_FSCATTER
+USE MODE_READTMAT
+USE MODE_FGAU , ONLY:GAULAG
+USE MODI_GAMMA, ONLY:GAMMA
+!
+USE MODD_LUNIT
+USE MODE_IO_FILE,          ONLY: IO_File_close, IO_File_open
+USE MODE_IO_MANAGE_STRUCT, ONLY: IO_File_add2list
+USE MODE_MSG
+
+!
+IMPLICIT NONE
+!
+!*       0.1   Declarations of dummy arguments :
+!
+!
+REAL,DIMENSION(:,:,:,:,:,:), INTENT(IN) :: PT_RAY ! temperature interpolated along the rays
+REAL,DIMENSION(:,:,:,:,:,:), INTENT(IN) :: PRHODREF_RAY ! 
+REAL,DIMENSION(:,:,:,:,:,:), INTENT(IN) :: PR_RAY   ! rainwater mixing ratio interpolated along the rays
+REAL,DIMENSION(:,:,:,:,:,:), INTENT(IN) :: PI_RAY   ! pristine ice mixing ratio interpolated along the rays
+REAL,DIMENSION(:,:,:,:,:,:), INTENT(IN) :: PCIT_RAY !pristine ice concentration interpolated along the rays
+REAL,DIMENSION(:,:,:,:,:,:), INTENT(IN) :: PS_RAY !aggregates mixing ratio interpolated along the rays
+REAL,DIMENSION(:,:,:,:,:,:), INTENT(IN) :: PG_RAY   ! graupel mixing ratio interpolated along the rays
+REAL,DIMENSION(:,:,:,:,:,:), INTENT(IN) :: PVDOP_RAY !Doppler radial velocity interpolated along the rays
+REAL,DIMENSION(:,:,:,:),     INTENT(IN) :: PELEV ! elevation
+REAL,DIMENSION(:),           INTENT(IN) :: PX_H ! Gaussian horizontal nodes
+REAL,DIMENSION(:),           INTENT(IN) :: PX_V ! Gaussian vertical nodes
+REAL,DIMENSION(:),           INTENT(IN) :: PW_H ! Gaussian horizontal weights
+REAL,DIMENSION(:),           INTENT(IN) :: PW_V ! Gaussian vertical weights
+REAL,DIMENSION(:,:,:,:,:),   INTENT(INOUT) :: PZE ! gate equivalent reflectivity factor (horizontal & vertical)
+! convective/stratiform
+REAL,DIMENSION(:,:,:,:,:,:),INTENT(INOUT) :: PBU_MASK_RAY
+! /convective/stratiform
+REAL, DIMENSION(:,:,:,:,:,:),OPTIONAL,INTENT(IN)  :: PCR_RAY  ! rainwater concentration interpolated along the rays
+REAL, DIMENSION(:,:,:,:,:,:),OPTIONAL,INTENT(IN)  :: PH_RAY   ! hail mixing ratio interpolated along the rays
+!
+!*       0.2   Declarations of local variables :
+!
+REAL,   DIMENSION(:,:,:,:,:,:,:),ALLOCATABLE :: ZREFL
+!1: ZHH (dBZ), 2: ZDR, 3: KDP, 4: CSR (0 pr air clair, 1 pour stratiforme, 2 pour convectif)
+!5-8: ZER, ZEI, ZES,ZEG
+!9 : VRU (vitesse radiale)
+!10-13 : AER, AEI, AES, AEG
+!14-17: ATR, ATI, ATS, ATG
+!18-20: RhoHV, PhiDP, DeltaHV
+
+REAL,   DIMENSION(:,:,:,:,:,:,:),ALLOCATABLE :: ZAELOC ! local attenuation
+REAL,   DIMENSION(:,:,:),ALLOCATABLE :: ZAETOT ! 1: total attenuation, 2: // vertical
+REAL :: ZAERINT,ZAEIINT,ZAESINT,ZAEGINT,ZAEHINT ! total attenuation horizontal
+REAL :: ZAVRINT,ZAVSINT,ZAVGINT,ZAVHINT ! total attenuation vertical 
+!
+REAL,DIMENSION(:),ALLOCATABLE :: ZX,ZW ! Gauss-Laguerre points and weights
+!
+REAL,DIMENSION(4) :: ZREFLOC
+REAL,DIMENSION(2) :: ZAETMP
+REAL,DIMENSION(:),ALLOCATABLE :: ZVTEMP ! temp var for Gaussian quadrature 8 : r_r, 9 : r_i, 10 : r_s , 11 : r_g
+REAL :: ZCXR=-1.0   ! for rain N ~ 1/N_0 (in Kessler parameterization)
+REAL :: ZDMELT_FACT ! factor used to compute the equivalent melted diameter
+REAL :: ZEQICE=0.224! factor used to convert the ice crystals reflectivity into an equivalent  liquid water reflectivity (from Smith, JCAM 84)
+REAL :: ZEXP        ! anciliary parameter
+REAL :: ZLBDA   ! slope distribution parameter
+REAL :: ZN      ! Number concentration
+REAL :: ZFRAC_ICE,ZD,ZDE ! auxiliary variables
+REAL :: ZQSCA
+REAL,DIMENSION(2) :: ZQEXT
+REAL,DIMENSION(3) :: ZQBACK ! Q_b(HH),Q_b(VV) (backscattering efficiencies at horizontal and vertical polarizations, resp.)
+!REAL :: P=DACOS(-1D0)
+REAL :: ZRHOI ! pristine ice density (from m=a*D**b), 
+REAL :: ZRHOPI=916. !pure ice density (kg/m3)
+COMPLEX :: ZNUM, ZDEN !for calculation of ice dielectri cconstant
+COMPLEX  :: ZQM,ZQMW,ZQMI,ZQK,ZQB, ZEPSI ! dielectric parameters
+REAL :: ZS11_CARRE_R,ZS22_CARRE_R,ZRE_S22S11_R,ZIM_S22S11_R
+REAL :: ZS11_CARRE_I,ZS22_CARRE_I,ZRE_S22S11_I,ZIM_S22S11_I
+REAL :: ZS11_CARRE_S,ZS22_CARRE_S,ZRE_S22S11_S,ZIM_S22S11_S
+REAL :: ZS11_CARRE_G,ZS22_CARRE_G,ZRE_S22S11_G,ZIM_S22S11_G
+REAL :: ZS11_CARRE_H,ZS22_CARRE_H,ZRE_S22S11_H,ZIM_S22S11_H
+REAL :: ZS11_CARRE_T,ZS22_CARRE_T,ZRE_S22S11_T,ZIM_S22S11_T
+REAL :: ZRE_S22FMS11F,ZIM_S22FT,ZIM_S11FT 
+
+REAL :: ZM
+!
+INTEGER  :: INBRAD,IIELV,INBAZIM,INBSTEPMAX,INPTS_H,INPTS_V ! sizes of the arrays
+INTEGER  :: IEL
+INTEGER  :: JI,JL,JEL,JAZ,JH,JV,JJ,JT ! Loop variables of control
+REAL :: ZLB ! depolarization factor along the spheroid symmetry axis
+REAL :: ZCXI=0. ! should be defined with other parameters of microphysical scheme
+REAL :: ZCR,ZCI,ZCS,ZCG,ZCH ! coefficients to take into account fall speeds when simulating Doppler winds
+REAL, DIMENSION(:,:,:,:),ALLOCATABLE :: ZCONC_BIN
+INTEGER :: IMAX
+LOGICAL :: LPART_MASK ! indicates a partial mask along the beam
+
+!
+INTEGER :: IZER,IZEI,IZES,IZEG
+INTEGER :: IVDOP,IRHV,IPDP,IDHV
+INTEGER :: IAER,IAEI,IAES,IAEG
+INTEGER :: IAVR,IAVI,IAVS,IAVG
+INTEGER :: IATR,IATI,IATS,IATG
+INTEGER :: IRHR, IRHS, IRHG, IZDA, IZDS, IZDG, IKDR, IKDS, IKDG
+INTEGER :: IZEH, IRHH,IKDH,IZDH ! hail
+INTEGER :: IAEH,IAVH,IATH
+!
+!for ZSNR threshold
+REAL ::ZDISTRAD,ZSNR,ZSNR_R,ZSNR_S,ZSNR_I,ZSNR_G,ZSNR_H,ZZHH,ZZE_R,ZZE_I,ZZE_S,ZZE_G,ZZE_H
+LOGICAL :: GTHRESHOLD_V, GTHRESHOLD_Z,GTHRESHOLD_ZR,GTHRESHOLD_ZI,GTHRESHOLD_ZS,GTHRESHOLD_ZG,GTHRESHOLD_ZH
+
+!--------- TO READ T-MATRIX TABLE --------
+CHARACTER(LEN=6) :: YBAND
+CHARACTER(LEN=1) ::YTYPE
+CHARACTER(LEN=1),DIMENSION(5) :: YTAB_TYPE
+CHARACTER(LEN=25),DIMENSION(5) :: YFILE_COEFINT
+
+REAL,DIMENSION(5) :: ZELEV_MIN,ZELEV_MAX,ZELEV_STEP,&
+ZTC_MIN,ZTC_MAX,ZTC_STEP,ZFW_MIN,ZFW_MAX,ZFW_STEP
+INTEGER :: IRESP,ILINE,INB_M
+INTEGER,DIMENSION(5) :: INB_ELEV,INB_TC,INB_FW,INB_LINE
+
+REAL, DIMENSION(:),ALLOCATABLE :: ZTC_T_R,        ZTC_T_S,        ZTC_T_G,        ZTC_T_W
+REAL, DIMENSION(:),ALLOCATABLE :: ZELEV_T_R,      ZELEV_T_S,      ZELEV_T_G,      ZELEV_T_W
+REAL, DIMENSION(:),ALLOCATABLE ::                 ZFW_T_S,        ZFW_T_G,        ZFW_T_W
+REAL, DIMENSION(:),ALLOCATABLE :: ZM_T_R,         ZM_T_S,         ZM_T_G,         ZM_T_W
+REAL, DIMENSION(:),ALLOCATABLE :: ZS11_CARRE_T_R, ZS11_CARRE_T_S, ZS11_CARRE_T_G, ZS11_CARRE_T_W
+REAL, DIMENSION(:),ALLOCATABLE :: ZS22_CARRE_T_R, ZS22_CARRE_T_S, ZS22_CARRE_T_G, ZS22_CARRE_T_W
+REAL, DIMENSION(:),ALLOCATABLE :: ZRE_S22S11_T_R, ZRE_S22S11_T_S, ZRE_S22S11_T_G, ZRE_S22S11_T_W
+REAL, DIMENSION(:),ALLOCATABLE :: ZIM_S22S11_T_R, ZIM_S22S11_T_S, ZIM_S22S11_T_G, ZIM_S22S11_T_W
+REAL, DIMENSION(:),ALLOCATABLE :: ZIM_S22FT_T_R,  ZIM_S22FT_T_S,  ZIM_S22FT_T_G,  ZIM_S22FT_T_W
+REAL, DIMENSION(:),ALLOCATABLE :: ZIM_S11FT_T_R,  ZIM_S11FT_T_S,  ZIM_S11FT_T_G,  ZIM_S11FT_T_W
+REAL, DIMENSION(:),ALLOCATABLE :: ZRE_S22FMS11FT_T_R, ZRE_S22FMS11FT_T_S, ZRE_S22FMS11FT_T_G, ZRE_S22FMS11FT_T_W
+REAL, DIMENSION(:),ALLOCATABLE :: ZTC_T_H ,ZELEV_T_H ,ZFW_T_H,ZM_T_H,ZS11_CARRE_T_H,ZS22_CARRE_T_H,ZRE_S22S11_T_H
+REAL, DIMENSION(:),ALLOCATABLE :: ZIM_S22S11_T_H,ZIM_S22FT_T_H,ZIM_S11FT_T_H,ZRE_S22FMS11FT_T_H
+INTEGER,DIMENSION(16):: ITMAT
+REAL:: ZELEV_RED,ZTC_RED,ZM_RED,ZFW_RED
+INTEGER :: JIND
+REAL,DIMENSION(7,16) :: KMAT_COEF !matrice contenant tous les coef interpolés
+                                !pour chaque val inf et sup de ELEV_t
+REAL :: ZEXPM_MIN, ZEXPM_STEP, ZEXPM_MAX,ZM_MIN
+REAL :: ZFW !water fraction inside melting graupel (ZFW=0 for rain, snow and dry graupel). used only with NDIFF=7: Tmatrix
+INTEGER :: ILUOUT0,IUNIT
+!
+! MODIF GAELLE POUR LIMA
+!
+LOGICAL :: GLIMA,GHAIL
+REAL,DIMENSION(5) :: ZCC_MIN,ZCC_MAX, ZCC_STEP
+INTEGER,DIMENSION(5):: INB_CC
+REAL, DIMENSION(:),ALLOCATABLE :: ZCC_T_R
+REAL :: ZCC_RED
+LOGICAL :: GCALC
+REAL :: ZCC
+REAL,   DIMENSION(:,:,:,:,:,:),ALLOCATABLE :: ZM_6D,ZCC_6D
+REAL :: ZC
+!
+REAL ::  ZCCR,ZLBR,ZLBEXR,ZDR,ZALPHAR,ZNUR,ZBR
+REAL ::  ZCCS,ZLBS,ZLBEXS,ZDS,ZALPHAS,ZNUS,ZAS,ZBS,ZCXS,ZNS
+REAL ::  ZCCG,ZLBG,ZLBEXG,ZDG,ZALPHAG,ZNUG,ZAG,ZBG,ZCXG
+REAL ::  ZCCH,ZLBH,ZLBEXH,ZDH,ZALPHAH,ZNUH,ZAH,ZBH,ZCXH
+REAL ::       ZLBI,ZLBEXI,ZDI,ZALPHAI,ZNUI,ZAI,ZBI
+REAL,DIMENSION(:),ALLOCATABLE :: ZRTMIN
+CHARACTER(LEN=100) :: YMSG
+TYPE(TFILEDATA),POINTER :: TZFILE
+!
+!*       1.     INITIALISATION 
+!--------------
+ILUOUT0 = TLUOUT0%NLU
+TZFILE => NULL()
+! 
+IF (PRESENT(PCR_RAY)) THEN
+  GLIMA=.TRUE.
+ELSE
+  GLIMA=.FALSE.
+ENDIF
+IF (PRESENT(PH_RAY)) THEN
+  GHAIL=.TRUE.
+ELSE
+  GHAIL=.FALSE.
+ENDIF
+!
+!
+!
+  ZS11_CARRE_R=0
+  ZS22_CARRE_R=0
+  ZRE_S22S11_R=0
+  ZIM_S22S11_R=0
+  ZS11_CARRE_I=0
+  ZS22_CARRE_I=0
+  ZRE_S22S11_I=0
+  ZIM_S22S11_I=0
+  ZS11_CARRE_S=0
+  ZS22_CARRE_S=0
+  ZRE_S22S11_S=0
+  ZIM_S22S11_S=0
+  ZS11_CARRE_G=0
+  ZS22_CARRE_G=0
+  ZRE_S22S11_G=0
+  ZIM_S22S11_G=0
+  ZS11_CARRE_H=0
+  ZS22_CARRE_H=0
+  ZRE_S22S11_H=0
+  ZIM_S22S11_H=0  
+! Initialisation varibales microphysiques
+IF (GLIMA) THEN ! LIMA
+  ZLBR=XLBR_L
+  ZLBEXR=XLBEXR_L
+  ZDR=XDR_L
+  ZALPHAR=XALPHAR_L
+  ZNUR=XNUR_L
+  ZBR=XBR_L
+  ZCCS=XCCS_L
+  ZCXS=XCXS_L
+  ZLBS=XLBS_L
+  ZLBEXS=XLBEXS_L
+  ZNS=XNS_L
+  ZDS=XDS_L
+  ZALPHAS=XALPHAS_L
+  ZNUS=XNUS_L
+  ZAS=XAS_L
+  ZBS=XBS_L
+  ZCCG=XCCG_L
+  ZCXG=XCXG_L
+  ZLBG=XLBG_L
+  ZLBEXG=XLBEXG_L
+  ZDG=XDG_L
+  ZALPHAG=XALPHAG_L
+  ZNUG=XNUG_L
+  ZAG=XAG_L
+  ZBG=XBG_L
+  ZLBI=XLBI_L
+  ZLBEXI=XLBEXI_L
+  ZDI=XDI_L
+  ZALPHAI=XALPHAI_L
+  ZNUI=XNUI_L
+  ZAI=XAI_L
+  ZBI=XBI_L
+  ALLOCATE(ZRTMIN(SIZE(XRTMIN_L)))
+  ZRTMIN=XRTMIN_L
+ELSE ! ICE3
+  ZCCR=XCCR_I
+  ZLBR=XLBR_I
+  ZLBEXR=XLBEXR_I
+  ZDR=XDR_I
+  ZALPHAR=XALPHAR_I
+  ZNUR=XNUR_I
+  ZBR=XBR_I
+  ZCCS=XCCS_I
+  ZCXS=XCXS_I
+  ZLBS=XLBS_I
+  ZLBEXS=XLBEXS_I
+  ZNS=XNS_I
+  ZDS=XDS_I
+  ZALPHAS=XALPHAS_I
+  ZNUS=XNUS_I
+  ZAS=XAS_I
+  ZBS=XBS_I
+  ZCCG=XCCG_I
+  ZCXG=XCXG_I
+  ZLBG=XLBG_I
+  ZLBEXG=XLBEXG_I
+  ZDG=XDG_I
+  ZALPHAG=XALPHAG_I
+  ZNUG=XNUG_I
+  ZAG=XAG_I
+  ZBG=XBG_I
+  ZLBI=XLBI_I
+  ZLBEXI=XLBEXI_I
+  ZDI=XDI_I
+  ZALPHAI=XALPHAI_I
+  ZNUI=XNUI_I
+  ZAI=XAI_I
+  ZBI=XBI_I
+  ALLOCATE(ZRTMIN(SIZE(XRTMIN_I)))
+  ZRTMIN=XRTMIN_I
+  IF (GHAIL) THEN
+    ZCCH=XCCH_I
+    ZCXH=XCXH_I
+    ZLBH=XLBH_I
+    ZLBEXH=XLBEXH_I
+    ZDH=XDH_I
+    ZALPHAH=XALPHAH_I
+    ZNUH=XNUH_I
+    ZAH=XAH_I
+    ZBH=XBH_I
+  ENDIF
+ENDIF
+!
+! initialisation of refractivity indices
+! 1 : ZHH
+! 2 : ZDR
+! 3 : KDP
+! 4 : CSR
+IZER=5 ! ZER
+IZEI=IZER+1 ! ZEI
+IZES=IZEI+1 ! ZES
+IZEG=IZES+1 ! ZEG
+IF (GHAIL) THEN
+  IZEH=IZEG+1 !ZEH
+  IVDOP=IZEH+1 !VRU
+ELSE
+  IVDOP=IZEG+1 !VRU
+END IF
+IF (LATT) THEN
+  IF (GHAIL) THEN
+    IAER=IVDOP+1
+    IAEI=IAER+1
+    IAES=IAEI+1
+    IAEG=IAES+1
+    IAEH=IAEG+1
+    IAVR=IAEH+1
+    IAVI=IAVR+1
+    IAVS=IAVI+1
+    IAVG=IAVS+1
+    IAVH=IAVG+1
+    IATR=IAVH+1
+    IATI=IATR+1
+    IATS=IATI+1
+    IATG=IATS+1
+    IATH=IATG+1
+    IRHV=IATH+1
+  ELSE
+    IAER=IVDOP+1
+    IAEI=IAER+1
+    IAES=IAEI+1
+    IAEG=IAES+1
+    IAVR=IAEG+1
+    IAVI=IAVR+1
+    IAVS=IAVI+1
+    IAVG=IAVS+1
+    IATR=IAVG+1
+    IATI=IATR+1
+    IATS=IATI+1
+    IATG=IATS+1
+    IRHV=IATG+1
+  ENDIF
+ELSE
+    IRHV=IVDOP+1        
+ENDIF
+IPDP=IRHV+1
+IDHV=IPDP+1
+IRHR=IDHV+1
+IRHS=IRHR+1
+IRHG=IRHS+1
+IF (GHAIL) THEN
+  IRHH=IRHG+1
+  IZDA=IRHH+1
+ELSE
+  IZDA=IRHG+1
+ENDIF
+IZDS=IZDA+1
+IZDG=IZDS+1
+IF (GHAIL) THEN
+  IZDH=IZDG+1
+  IKDR=IZDH+1
+ELSE
+  IKDR=IZDG+1
+ENDIF
+IKDS=IKDR+1
+IKDG=IKDS+1
+IF (GHAIL) THEN
+  IKDH=IKDG+1
+ENDIF
+!
+!
+!
+INBRAD=SIZE(PT_RAY,1)
+IIELV=SIZE(PT_RAY,2)
+INBAZIM=SIZE(PT_RAY,3)
+INBSTEPMAX=SIZE(PT_RAY,4)
+INPTS_H=SIZE(PT_RAY,5)
+INPTS_V=SIZE(PT_RAY,6)
+!
+! Initialisation for radial winds
+IF(LFALL) THEN
+  IF (GLIMA) THEN
+    ZCR=XCR_L
+    ZCI=XC_I_L
+    ZCS=XCS_L
+    ZCG=XCG_L
+  ELSE
+    ZCR=XCR_I 
+    ZCI=XC_I_I
+    ZCS=XCS_I
+    ZCG=XCG_I
+    IF (GHAIL) ZCH=XCH_I
+  ENDIF
+ELSE
+  ZCR=0.
+  ZCI=0.
+  ZCS=0.
+  ZCG=0.
+  IF (GHAIL)  ZCH=0.
+END IF
+
+! Calculation of nodes and weights for the Gauss-Laguerre quadrature
+! for Mie and T-matrix and RG
+IF(NDIFF/=0) THEN
+  ALLOCATE(ZX(NPTS_GAULAG),ZW(NPTS_GAULAG)) !NPTS_GAULAG : number of points for the quadrature
+  CALL GAULAG(NPTS_GAULAG,ZX,ZW)
+END IF
+!
+!
+IMAX=SIZE(PZE,5)
+WRITE(ILUOUT0,*) "-----------------"
+WRITE(ILUOUT0,*) "Radar scattering"
+WRITE(ILUOUT0,*) "-----------------"
+WRITE(ILUOUT0,*) 'Nombre de variables dans PZE: ',IMAX
+
+IF(.NOT.LWREFL) IMAX=IMAX+1
+
+ALLOCATE(ZREFL(INBRAD,IIELV,INBAZIM,INBSTEPMAX,INPTS_H,INPTS_V,IMAX))
+ZREFL(:,:,:,:,:,:,:)=0.
+IF(LATT) THEN
+  ZREFL(:,:,:,:,:,:,IATR:IATG)=1.
+  IF (GHAIL)  ZREFL(:,:,:,:,:,:,IATH)=1.
+END IF
+PZE(:,:,:,:,:)=0.
+IF (LATT)THEN
+  ALLOCATE(ZAELOC(INBRAD,IIELV,INBAZIM,INBSTEPMAX,INPTS_H,INPTS_V,2))
+  ALLOCATE(ZAETOT(INPTS_H,INPTS_V,2))
+  ZAELOC(:,:,:,:,:,:,:)=0. ! initialization of attenuation stuff (alpha_e for first gate)
+  ZAETOT(:,:,:)=1. ! initialization of attenuation stuff (total attenuation)
+END IF
+WRITE(ILUOUT0,*) 'BEFORE LOOP DIFFUSION'
+
+IF(LWBSCS) THEN
+  ALLOCATE(ZCONC_BIN(INBRAD,IIELV,INBAZIM,INBSTEPMAX))
+  ZCONC_BIN(:,:,:,:)=0.
+END IF
+
+WRITE(ILUOUT0,*) "XCCR:",ZCCR
+WRITE(ILUOUT0,*) "XLBR:",ZLBR
+WRITE(ILUOUT0,*) "XLBEXR:",ZLBEXR
+
+WRITE(ILUOUT0,*) "XCCS:",ZCCS
+WRITE(ILUOUT0,*) "XLBS:",ZLBS
+WRITE(ILUOUT0,*) "XLBEXS:",ZLBEXS
+
+WRITE(ILUOUT0,*) "XCCG:",ZCCG
+WRITE(ILUOUT0,*) "XLBG:",ZLBG
+WRITE(ILUOUT0,*) "XLBEXG:",ZLBEXG
+
+IF (GHAIL)  THEN
+  WRITE(ILUOUT0,*) "XCCH:",ZCCH
+  WRITE(ILUOUT0,*) "XLBH:",ZLBH
+  WRITE(ILUOUT0,*) "XLBEXH:",ZLBEXH
+ENDIF
+!
+IF (GLIMA .AND. NDIFF==7) THEN
+  IF (ZALPHAR/=1 .AND. ZNUR /=2.) THEN
+    WRITE(ILUOUT0,*) " ERROR : TMATRICE TABLE ARE MADE WITH XALPHAR=1 XNUR=2"
+    WRITE(ILUOUT0,*) " FOR CCLOUD=LIMA. PLEASE CHANGE THIS VALUES OR PROVIDE "
+    WRITE(ILUOUT0,*) " NEW TMATRICE TABLES "
+    CALL PRINT_MSG(NVERB_FATAL,'GEN','RADAR_SCATTERING','')
+  ENDIF
+ELSE
+  IF (ZALPHAR/=1 .AND. ZNUR /=1.) THEN
+    WRITE(ILUOUT0,*) " ERROR : TMATRICE TABLE ARE MADE WITH XALPHAR=1 XNUR=1"
+    WRITE(ILUOUT0,*) " FOR CCLOUD=ICE3. PLEASE CHANGE THIS VALUEs OR PROVIDE "
+    WRITE(ILUOUT0,*) " NEW TMATRICE TABLES "
+    CALL PRINT_MSG(NVERB_FATAL,'GEN','RADAR_SCATTERING','')
+  ENDIF
+ENDIF
+
+!---------------------------------------------
+! LOOP OVER EVERYTHING
+!--------------------------------------------
+IF(NDIFF==7) THEN
+  YTAB_TYPE(1)='r'
+  YTAB_TYPE(2)='s'
+  YTAB_TYPE(3)='g'
+  YTAB_TYPE(4)='w'
+  YTAB_TYPE(5)='h'
+  ! definition des paramètres de lecture de la table T-matrice
+  ! all mixing ratio
+  ZEXPM_MIN=-7. 
+  ZEXPM_STEP=0.01
+  ZEXPM_MAX=-2. 
+  ZM_MIN=10**ZEXPM_MIN 
+  ! rain
+  ZELEV_MIN(1)=0.0
+  ZELEV_STEP(1)=4.0
+  ZELEV_MAX(1)=12.0
+  ZTC_MIN(1)=-20.0
+  ZTC_STEP(1)=1.0
+  ZTC_MAX(1)=40.0
+  ZFW_MIN(1)=0.0
+  ZFW_STEP(1)=0.1
+  ZFW_MAX(1)=0.0
+  IF (GLIMA) THEN
+    ZCC_MIN(1)=1.8 
+    ZCC_STEP(1)=0.02
+    ZCC_MAX(1)=6
+  ELSE
+    ZCC_MIN(1)=1. 
+    ZCC_STEP(1)=1.
+    ZCC_MAX(1)=1.
+  ENDIF
+  ! snow + graupel
+  ZELEV_MIN(2:3)=0.0
+  ZELEV_STEP(2:3)=12.0
+  ZELEV_MAX(2:3)=12.0
+  ZTC_MIN(2:3)=-70.0
+  ZTC_STEP(2:3)=1.0
+  ZTC_MAX(2:3)=10.0
+  ZFW_MIN(2:3)=0.0
+  ZFW_STEP(2:3)=0.1
+  ZFW_MAX(2:3)=0.0
+  ZCC_MIN(2:3)=1.
+  ZCC_STEP(2:3)=1.
+  ZCC_MAX(2:3)=1.
+  ! wet graupel
+  ZELEV_MIN(4)=0.0
+  ZELEV_STEP(4)=4.0
+  ZELEV_MAX(4)=12.0
+  ZTC_MIN(4)=-10.0
+  ZTC_STEP(4)=1.0
+  ZTC_MAX(4)=10.0
+  ZFW_MIN(4)=0.0
+  ZFW_STEP(4)=0.1
+  ZFW_MAX(4)=1.0
+  ZCC_MIN(4)=1.
+  ZCC_STEP(4)=1.
+  ZCC_MAX(4)=1. 
+  ! hail
+  ZELEV_MIN(5)=0.0
+  ZELEV_STEP(5)=4.0
+  ZELEV_MAX(5)=12.0
+  ZTC_MIN(5)=-20.0
+  ZTC_STEP(5)=1.0
+  ZTC_MAX(5)=30.0
+  ZFW_MIN(5)=0.
+  ZFW_STEP(5)=0.1
+  ZFW_MAX(5)=0.0
+  ZCC_MIN(5)=1.
+  ZCC_STEP(5)=1.
+  ZCC_MAX(5)=1. 
+  DO JT=1,5
+    INB_ELEV(JT)=NINT((ZELEV_MAX(JT)-ZELEV_MIN(JT))/ZELEV_STEP(JT))+1
+    INB_TC(JT)=NINT((ZTC_MAX(JT)-ZTC_MIN(JT))/ZTC_STEP(JT))+1
+    INB_FW(JT)=NINT((ZFW_MAX(JT)-ZFW_MIN(JT))/ZFW_STEP(JT))+1
+    INB_M=NINT((ZEXPM_MAX-ZEXPM_MIN)/ZEXPM_STEP)+1
+    INB_CC(JT)=NINT((ZCC_MAX(JT)-ZCC_MIN(JT))/ZCC_STEP(JT))+1          
+    INB_LINE(JT)=INB_ELEV(JT)*INB_TC(JT)*INB_FW(JT)*INB_M*INB_CC(JT)
+  ENDDO
+ENDIF                                 
+
+!---------------------------------------------
+! LOOP OVER EVERYTHING
+!--------------------------------------------
+ !==============         loop over radars        ================= 
+WRITE(ILUOUT0,*) "INBRAD",INBRAD
+DO JI=1,INBRAD
+  WRITE(ILUOUT0,*) "JI",JI
+  WRITE(ILUOUT0,*) "XLAM_RAD(JI):",XLAM_RAD(JI)
+
+  IF(NDIFF==7) THEN ! If T-MATRIX
+  !---------------------------------------------------------------------------------------------
+  !	  0. LECTURE DES TABLES TMAT POUR PLUIE, NEIGE, GRAUPEL
+  !          en fonction de la bande frequence
+  !---------------------------------------------------------------------------------------------
+    IF ( XLAM_RAD(JI)==0.1062) THEN
+      YBAND='S106.2'     
+    ELSEIF (XLAM_RAD(JI) ==0.0532 ) THEN
+      YBAND='C053.2'
+    ELSEIF (XLAM_RAD(JI)==0.0319 ) THEN
+      YBAND='X031.9'
+    ELSE
+      WRITE(ILUOUT0,*) "ERROR RADAR_SCATTERING"
+      WRITE(ILUOUT0,*) "Tmatrice tables are only available for XLAM_RAD=0.1062"
+      WRITE(ILUOUT0,*) "or XLAM_RAD=0.0532 or XLAM_RAD=0.0319"
+      WRITE(ILUOUT0,*) "change XLAM_RAD in namelist or compute new tmatrice table"
+    CALL PRINT_MSG(NVERB_FATAL,'GEN','RADAR_SCATTERING','')
+    ENDIF
+
+    !************ fichiers Min Max Pas et Coef Tmat ***********
+    DO JT=1,5  !types (r, s, g, w, h)
+  
+      YTYPE=YTAB_TYPE(JT)
+      IF (JT .EQ. 1) THEN
+        IF (GLIMA) THEN
+          YFILE_COEFINT(JT)='TmatCoefInt_LIMA_'//YBAND//YTYPE
+        ELSE
+          YFILE_COEFINT(JT)='TmatCoefInt_ICE3_'//YBAND//YTYPE
+        ENDIF
+      ELSE
+       YFILE_COEFINT(JT)='TmatCoefInt_'//YBAND//YTYPE
+      ENDIF
+      YFILE_COEFINT(JT)=TRIM(ADJUSTL(YFILE_COEFINT(JT)))  
+    ENDDO
+    !lookup tables for rain
+    ALLOCATE (ZTC_T_R(INB_LINE(1)),ZELEV_T_R(INB_LINE(1)),ZCC_T_R(INB_LINE(1)),ZM_T_R(INB_LINE(1)),&
+    ZS11_CARRE_T_R(INB_LINE(1)),ZS22_CARRE_T_R(INB_LINE(1)), ZRE_S22S11_T_R(INB_LINE(1)),ZIM_S22S11_T_R(INB_LINE(1)),&
+    ZRE_S22FMS11FT_T_R(INB_LINE(1)),ZIM_S22FT_T_R(INB_LINE(1)),ZIM_S11FT_T_R(INB_LINE(1)))
+   
+    !lookup tables for snow
+    ALLOCATE (ZTC_T_S(INB_LINE(2)),ZELEV_T_S(INB_LINE(2)),ZFW_T_S(INB_LINE(2)),ZM_T_S(INB_LINE(2)),&
+    ZS11_CARRE_T_S(INB_LINE(2)),ZS22_CARRE_T_S(INB_LINE(2)),ZRE_S22S11_T_S(INB_LINE(2)),ZIM_S22S11_T_S(INB_LINE(2)),&
+    ZRE_S22FMS11FT_T_S(INB_LINE(2)),ZIM_S22FT_T_S(INB_LINE(2)),ZIM_S11FT_T_S(INB_LINE(2)))
+
+    !lookup tables for graupel
+    ALLOCATE (ZTC_T_G(INB_LINE(3)),ZELEV_T_G(INB_LINE(3)),ZFW_T_G(INB_LINE(3)),ZM_T_G(INB_LINE(3)),&
+    ZS11_CARRE_T_G(INB_LINE(3)),ZS22_CARRE_T_G(INB_LINE(3)), ZRE_S22S11_T_G(INB_LINE(3)),ZIM_S22S11_T_G(INB_LINE(3)),&
+    ZRE_S22FMS11FT_T_G(INB_LINE(3)),ZIM_S22FT_T_G(INB_LINE(3)),ZIM_S11FT_T_G(INB_LINE(3)))
+
+    !lookup tables for wet graupel
+    ALLOCATE (ZTC_T_W(INB_LINE(4)),ZELEV_T_W(INB_LINE(4)),ZFW_T_W(INB_LINE(4)),ZM_T_W(INB_LINE(4)),&
+    ZS11_CARRE_T_W(INB_LINE(4)),ZS22_CARRE_T_W(INB_LINE(4)), ZRE_S22S11_T_W(INB_LINE(4)),ZIM_S22S11_T_W(INB_LINE(4)),&
+    ZRE_S22FMS11FT_T_W(INB_LINE(4)),ZIM_S22FT_T_W(INB_LINE(4)),ZIM_S11FT_T_W(INB_LINE(4)))
+
+    IF (GHAIL) THEN
+    !lookup tables for hail
+    ALLOCATE (ZTC_T_H(INB_LINE(5)),ZELEV_T_H(INB_LINE(5)),ZFW_T_H(INB_LINE(5)),ZM_T_H(INB_LINE(5)),&
+    ZS11_CARRE_T_H(INB_LINE(5)),ZS22_CARRE_T_H(INB_LINE(5)), ZRE_S22S11_T_H(INB_LINE(5)),ZIM_S22S11_T_H(INB_LINE(5)),&
+    ZRE_S22FMS11FT_T_H(INB_LINE(5)),ZIM_S22FT_T_H(INB_LINE(5)),ZIM_S11FT_T_H(INB_LINE(5)))
+    ENDIF
+    !=====  Lecture des tables  ===========  
+    
+    6003 FORMAT (E11.4,2X,E9.3,2X,E10.4,2X,E10.4,2X,E12.5,2X,E12.5,2X,&
+                 E12.5,2X,E12.5,2X,E12.5,2X,E12.5,2X,E12.5)
+
+    !rain
+    CALL IO_File_add2list(TZFILE,YFILE_COEFINT(1),'TXT','READ')
+    CALL IO_File_open(TZFILE,KRESP=IRESP)
+    IUNIT = TZFILE%NLU
+    IF ( IRESP /= 0 ) THEN       
+      WRITE(YMSG,*) "problem opening file ",TRIM(YFILE_COEFINT(1))
+      CALL PRINT_MSG(NVERB_FATAL,'GEN','RADAR_SCATTERING',YMSG)
+    ENDIF
+    ILINE=1
+    DO WHILE (ILINE .LE. INB_LINE(1))
+      READ( UNIT=IUNIT,FMT=6003, IOSTAT=IRESP ) ZTC_T_R(ILINE),ZELEV_T_R(ILINE),&
+      ZCC_T_R(ILINE),ZM_T_R(ILINE),ZS11_CARRE_T_R(ILINE),ZS22_CARRE_T_R(ILINE),ZRE_S22S11_T_R(ILINE),&
+      ZIM_S22S11_T_R(ILINE),ZRE_S22FMS11FT_T_R(ILINE),ZIM_S22FT_T_R(ILINE),ZIM_S11FT_T_R(ILINE) 
+      ILINE=ILINE+1
+    ENDDO
+    CALL IO_File_close(TZFILE)
+    TZFILE => NULL()    
+    WRITE(ILUOUT0,*) "NLIGNE rain",ILINE      
+    ILINE=2
+    WRITE(ILUOUT0,*) "ILINE=",ILINE
+    WRITE(ILUOUT0,*) "ZTC_T_R(ILINE),ZELEV_T_R(ILINE),ZCC_T_R(ILINE)",&
+    ZTC_T_R(ILINE),ZELEV_T_R(ILINE),ZCC_T_R(ILINE)
+    WRITE(ILUOUT0,*) "ZM_T_R(ILINE),ZS11_CARRE_T_R(ILINE),ZS22_CARRE_T_R(ILINE),ZRE_S22S11_T_R(ILINE)",&
+    ZM_T_R(ILINE),ZS11_CARRE_T_R(ILINE),ZS22_CARRE_T_R(ILINE),ZRE_S22S11_T_R(ILINE)
+    WRITE(ILUOUT0,*) "ZIM_S22S11_T_R(ILINE),ZRE_S22FMS11FT_T_R(ILINE),ZIM_S22FT_T_R(ILINE),ZIM_S11FT_T_R(ILINE)",&
+    ZIM_S22S11_T_R(ILINE),ZRE_S22FMS11FT_T_R(ILINE),ZIM_S22FT_T_R(ILINE),ZIM_S11FT_T_R(ILINE)
+   
+    !snow
+    CALL IO_File_add2list(TZFILE,YFILE_COEFINT(2),'TXT','READ')
+    CALL IO_File_open(TZFILE,KRESP=IRESP)
+    IUNIT = TZFILE%NLU
+    IF ( IRESP /= 0 ) THEN       
+      WRITE(YMSG,*) "problem opening file ",TRIM(YFILE_COEFINT(2))
+      CALL PRINT_MSG(NVERB_FATAL,'GEN','RADAR_SCATTERING',YMSG)
+    ENDIF
+    ILINE=1
+    DO WHILE (ILINE .LE. INB_LINE(2))
+      READ( UNIT=IUNIT,FMT=6003, IOSTAT=IRESP ) ZTC_T_S(ILINE),ZELEV_T_S(ILINE),&
+      ZFW_T_S(ILINE),ZM_T_S(ILINE),ZS11_CARRE_T_S(ILINE),ZS22_CARRE_T_S(ILINE),ZRE_S22S11_T_S(ILINE),&
+      ZIM_S22S11_T_S(ILINE),ZRE_S22FMS11FT_T_S(ILINE),ZIM_S22FT_T_S(ILINE),ZIM_S11FT_T_S(ILINE)
+      ILINE=ILINE+1
+    ENDDO
+    CALL IO_File_close(TZFILE)
+    TZFILE => NULL()
+    WRITE(ILUOUT0,*) "NLIGNE snow",ILINE    
+    ILINE=2
+    WRITE(ILUOUT0,*) "ILINE=",ILINE
+    WRITE(ILUOUT0,*) "ZTC_T_S(ILINE),ZELEV_T_S(ILINE),ZFW_T_S(ILINE)",&
+    ZTC_T_S(ILINE),ZELEV_T_S(ILINE),ZFW_T_S(ILINE)
+    WRITE(ILUOUT0,*) "ZM_T_S(ILINE),ZS11_CARRE_T_S(ILINE),ZS22_CARRE_T_S(ILINE),ZRE_S22S11_T_S(ILINE)",&
+    ZM_T_S(ILINE),ZS11_CARRE_T_S(ILINE),ZS22_CARRE_T_S(ILINE),ZRE_S22S11_T_S(ILINE)
+    WRITE(ILUOUT0,*) "ZIM_S22S11_T_S(ILINE),ZRE_S22FMS11FT_T_S(ILINE),ZIM_S22FT_T_S(ILINE),ZIM_S11FT_T_S(ILINE)",&
+    ZIM_S22S11_T_S(ILINE),ZRE_S22FMS11FT_T_S(ILINE),ZIM_S22FT_T_S(ILINE),ZIM_S11FT_T_S(ILINE)
+ 
+    !graupel
+    CALL IO_File_add2list(TZFILE,YFILE_COEFINT(3),'TXT','READ')
+    CALL IO_File_open(TZFILE,KRESP=IRESP)
+    IUNIT = TZFILE%NLU
+    IF ( IRESP /= 0 ) THEN       
+      WRITE(YMSG,*) "problem opening file ",TRIM(YFILE_COEFINT(3))
+      CALL PRINT_MSG(NVERB_FATAL,'GEN','RADAR_SCATTERING',YMSG)
+    ENDIF
+    ILINE=1
+    DO WHILE (ILINE .LE. INB_LINE(3))
+      READ( UNIT=IUNIT, FMT=6003,IOSTAT=IRESP ) ZTC_T_G(ILINE),ZELEV_T_G(ILINE),&
+      ZFW_T_G(ILINE),ZM_T_G(ILINE),ZS11_CARRE_T_G(ILINE),ZS22_CARRE_T_G(ILINE),ZRE_S22S11_T_G(ILINE),&
+      ZIM_S22S11_T_G(ILINE),ZRE_S22FMS11FT_T_G(ILINE),ZIM_S22FT_T_G(ILINE),ZIM_S11FT_T_G(ILINE)
+      ILINE=ILINE+1
+    ENDDO
+    CALL IO_File_close(TZFILE)
+    TZFILE => NULL()
+    WRITE(ILUOUT0,*) "NLIGNE graupel",ILINE    
+    ILINE=2
+    WRITE(ILUOUT0,*) "ILINE=",ILINE
+    WRITE(ILUOUT0,*) "ZTC_T_G(ILINE),ZELEV_T_G(ILINE)",&
+    ZTC_T_G(ILINE),ZELEV_T_G(ILINE)
+    WRITE(ILUOUT0,*) "ZM_T_G(ILINE),ZS11_CARRE_T_G(ILINE),ZS22_CARRE_T_G(ILINE),ZRE_S22S11_T_G(ILINE)",&
+    ZM_T_G(ILINE),ZS11_CARRE_T_G(ILINE),ZS22_CARRE_T_G(ILINE),ZRE_S22S11_T_G(ILINE)
+    WRITE(ILUOUT0,*) "ZIM_S22S11_T_G(ILINE),ZRE_S22FMS11FT_T_G(ILINE),ZIM_S22FT_T_G(ILINE),ZIM_S11FT_T_G(ILINE)",&
+    ZIM_S22S11_T_G(ILINE),ZRE_S22FMS11FT_T_G(ILINE),ZIM_S22FT_T_G(ILINE),ZIM_S11FT_T_G(ILINE)
+
+    !wet graupel
+    CALL IO_File_add2list(TZFILE,YFILE_COEFINT(4),'TXT','READ')
+    CALL IO_File_open(TZFILE,KRESP=IRESP)
+    IUNIT = TZFILE%NLU
+    IF ( IRESP /= 0 ) THEN       
+      WRITE(YMSG,*) "problem opening file ",TRIM(YFILE_COEFINT(4))
+      CALL PRINT_MSG(NVERB_FATAL,'GEN','RADAR_SCATTERING',YMSG)
+    ENDIF
+    ILINE=1
+    DO WHILE (ILINE .LE. INB_LINE(4))
+      READ( UNIT=IUNIT, FMT=6003,IOSTAT=IRESP ) ZTC_T_W(ILINE),ZELEV_T_W(ILINE),&
+      ZFW_T_W(ILINE),ZM_T_W(ILINE),ZS11_CARRE_T_W(ILINE),ZS22_CARRE_T_W(ILINE),ZRE_S22S11_T_W(ILINE),&
+      ZIM_S22S11_T_W(ILINE),ZRE_S22FMS11FT_T_W(ILINE),ZIM_S22FT_T_W(ILINE),ZIM_S11FT_T_W(ILINE)
+      ILINE=ILINE+1
+    ENDDO
+    CALL IO_File_close(TZFILE)
+    TZFILE => NULL()
+    WRITE(ILUOUT0,*) "NLIGNE wet graupel",ILINE    
+    ILINE=2
+    WRITE(ILUOUT0,*) "ILINE=",ILINE
+    WRITE(ILUOUT0,*) "ZTC_T_W(ILINE),ZELEV_T_W(ILINE)", ZTC_T_W(ILINE),ZELEV_T_W(ILINE)
+    WRITE(ILUOUT0,*) "ZM_T_W(ILINE),ZS11_CARRE_T_W(ILINE),ZS22_CARRE_T_W(ILINE),ZRE_S22S11_T_W(ILINE)",&
+    ZM_T_W(ILINE),ZS11_CARRE_T_W(ILINE),ZS22_CARRE_T_W(ILINE),ZRE_S22S11_T_W(ILINE)
+    WRITE(ILUOUT0,*) "ZIM_S22S11_T_W(ILINE),ZRE_S22FMS11FT_T_W(ILINE),ZIM_S22FT_T_W(ILINE),ZIM_S11FT_T_W(ILINE)",&
+    ZIM_S22S11_T_W(ILINE),ZRE_S22FMS11FT_T_W(ILINE),ZIM_S22FT_T_W(ILINE),ZIM_S11FT_T_W(ILINE)
+
+    !hail
+    IF (GHAIL) THEN
+    CALL IO_File_add2list(TZFILE,YFILE_COEFINT(5),'TXT','READ')
+    CALL IO_File_open(TZFILE,KRESP=IRESP)
+    IUNIT = TZFILE%NLU
+    IF ( IRESP /= 0 ) THEN       
+      WRITE(YMSG,*) "problem opening file ",TRIM(YFILE_COEFINT(5))
+      CALL PRINT_MSG(NVERB_FATAL,'GEN','RADAR_SCATTERING',YMSG)
+    ENDIF
+      ILINE=1
+      DO WHILE (ILINE .LE. INB_LINE(5))
+        READ( UNIT=IUNIT, FMT=6003,IOSTAT=IRESP ) ZTC_T_H(ILINE),ZELEV_T_H(ILINE),&
+        ZFW_T_H(ILINE),ZM_T_H(ILINE),ZS11_CARRE_T_H(ILINE),ZS22_CARRE_T_H(ILINE),ZRE_S22S11_T_H(ILINE),&
+        ZIM_S22S11_T_H(ILINE),ZRE_S22FMS11FT_T_H(ILINE),ZIM_S22FT_T_H(ILINE),ZIM_S11FT_T_H(ILINE)
+        ILINE=ILINE+1
+      ENDDO
+      CALL IO_File_close(TZFILE)
+      TZFILE => NULL()
+      WRITE(ILUOUT0,*) "NLIGNE hail",ILINE    
+      ILINE=2
+      WRITE(ILUOUT0,*) "ILINE=",ILINE
+      WRITE(ILUOUT0,*) "ZTC_T_H(ILINE),ZELEV_T_H(ILINE)", ZTC_T_H(ILINE),ZELEV_T_H(ILINE)
+      WRITE(ILUOUT0,*) "ZM_T_H(ILINE),ZS11_CARRE_T_H(ILINE),ZS22_CARRE_T_H(ILINE),ZRE_S22S11_T_H(ILINE)",&
+      ZM_T_W(ILINE),ZS11_CARRE_T_H(ILINE),ZS22_CARRE_T_H(ILINE),ZRE_S22S11_T_H(ILINE)
+      WRITE(ILUOUT0,*) "ZIM_S22S11_T_H(ILINE),ZRE_S22FMS11FT_T_H(ILINE),ZIM_S22FT_T_H(ILINE),ZIM_S11FT_T_H(ILINE)",&
+      ZIM_S22S11_T_H(ILINE),ZRE_S22FMS11FT_T_H(ILINE),ZIM_S22FT_T_H(ILINE),ZIM_S11FT_T_H(ILINE)
+    ENDIF
+  ENDIF !END IF T-MATRIX => END OF LOOKUP TABLE READING
+
+ !==============         loop over elevations      ================= 
+  IEL=NBELEV(JI)
+  WRITE(ILUOUT0,*) "NBELEV(JI)",NBELEV(JI)
+  WRITE(ILUOUT0,*) "INPTS_V",INPTS_V
+  DO JEL=1,IEL  
+    WRITE(ILUOUT0,*) "JEL",JEL
+    JL=1
+    JV=1
+    WRITE(ILUOUT0,*) "JL,JV",JL,JV
+    WRITE(ILUOUT0,*) "PELEV(JI,JEL,JL,JV)*180./XPI",PELEV(JI,JEL,JL,JV)*180./XPI
+    JL=INBSTEPMAX
+    JV=INPTS_V
+    WRITE(ILUOUT0,*) "JL,JV",JL,JV
+    WRITE(ILUOUT0,*) "PELEV(JI,JEL,JL,JV)*180./XPI",PELEV(JI,JEL,JL,JV)*180./XPI
+    !==============         loop over azimuths     ================= 
+    DO JAZ=1,INBAZIM   
+      DO JH=1,INPTS_H !horizontal discretization of the beam
+        DO JV=1,INPTS_V ! vertical discretization (we go down to check partial masks)
+          IF(LATT) THEN
+            ZAERINT=1.
+            ZAVRINT=1.
+            ZAEIINT=1.
+            ZAESINT=1.
+            ZAVSINT=1.
+            ZAEGINT=1.
+            ZAVGINT=1.
+            ZAEHINT=1.
+            ZAVHINT=1.
+          END IF
+          !Loop over the ranges for one azimuth. If the range is masked, the reflectivity for all the consecutive ranges is set to 0
+          LPART_MASK=.FALSE.
+          LOOPJL: DO JL=1,INBSTEPMAX
+            IF(LPART_MASK) THEN ! THIS RAY IS MASKED
+              ZREFL(JI,JEL,JAZ,JL:INBSTEPMAX,JH,JV,1)=0. 
+              EXIT LOOPJL
+            ELSE
+              ! if not underground or outside of the MESO-NH domain (PT_RAY : temperature interpolated along the rays)             
+              IF(PT_RAY(JI,JEL,JAZ,JL,JH,JV) /= -XUNDEF) THEN
+                !
+                !---------------------------------------------------------------------------------------------------
+                !*       2.    RAINDROPS
+                !              ---------
+                !
+                IF(SIZE(PR_RAY,1) > 0) THEN ! if PR_RAY is available for at least one radar 
+                  !contenu en hydrometeore 
+                  ZM=PRHODREF_RAY(JI,JEL,JAZ,JL,JH,JV)*PR_RAY(JI,JEL,JAZ,JL,JH,JV)
+                  IF (GLIMA) ZCC=PRHODREF_RAY(JI,JEL,JAZ,JL,JH,JV)*PCR_RAY(JI,JEL,JAZ,JL,JH,JV)
+                  !ZM_MIN : min value for rain content (10**-7 <=> Z=-26 dBZ)mixing ratio
+                  IF (GLIMA) THEN
+                    GCALC=((ZM > ZM_MIN).AND.(ZCC > 10**ZCC_MIN(1)))  
+                  ELSE
+                    GCALC=(ZM > ZM_MIN)
+                  ENDIF
+                  IF(GCALC ) THEN 
+                    !calculation of the dielectrique constant (permittitivité relative)
+                    ! for liquid water from function QEPSW
+                    !(defined in mode_fscatter.f90 => equation 3.6 p 64)
+                    YTYPE='r'  
+                    ZQMW=SQRT(QEPSW(PT_RAY(JI,JEL,JAZ,JL,JH,JV),XLIGHTSPEED/XLAM_RAD(JI)))
+                    !ZLBDA : slope distribution parameter (equation 2.6 p 23)  
+                     IF (GLIMA) THEN
+                       ZLBDA=( ZLBR*ZCC / ZM )**ZLBEXR
+                     ELSE
+                       ZLBDA=ZLBR*(ZM)**ZLBEXR
+                     ENDIF
+                    ZQK=(ZQMW**2-1.)/(ZQMW**2+2.) !dielectric factor (3.43 p 56)
+                    ZFW=0 !Liquid water fraction (only for melting graupel => 0 for rain) 
+        
+                    !compteur=compteur+1
+                    !---------------------------------------------------  
+                    ! ------------    DIFFUSION      --------------
+                    !---------------------------------------------------  
+                    !******************************* NDIFF=0 or 4 *********************************
+                    IF(NDIFF==0.OR.NDIFF==4) THEN ! Rayleigh
+                      !ZREFLOC(1:2) : Zh et Zv = int(sigma(D)*N(D)) (eq 1.6 p 16)
+                      !with N(D) formulation (eq 2.2 p 23) and sigma Rayleigh (3.41 p 55)
+                      !MOMG : gamma function defined in mong.f90
+                      !XCCR = 1.E7; XLBEXR = -0.25! Marshall-Palmer law (radar_rain_ice.f90)
+                      !ZCXR : -1 (Xi coeff in equation 2.3 p 23)
+                      ZREFLOC(1:2)=1.E18*ZCCR*ZLBDA**(ZCXR-6.)*MOMG(ZALPHAR,ZNUR,6.)
+                      IF(LWREFL) THEN ! weighting by reflectivities
+                        !ZREFL(...,IVDOP)=radial velocity (IVDOP=9), weighted by reflectivity and
+                        !taking into account raindrops fall velocity (ZCR = 842, XDR = 0.8 -> 2.8 p23 et 2.1 p24)
+                        ZREFL(JI,JEL,JAZ,JL,JH,JV,IVDOP)=-ZCR*SIN(PELEV(JI,JEL,JL,JV)) &
+                              *1.E18*ZCCR*ZLBDA**(ZCXR-6.-ZDR)*MOMG(ZALPHAR,ZNUR,6.+ZDR)
+                      ELSE 
+                        ZREFL(JI,JEL,JAZ,JL,JH,JV,IMAX)=ZCCR*ZLBDA**ZCXR ! N0j of equation 2.3 p23 (density of particules)
+                        !projection of fall velocity only
+                        ZREFL(JI,JEL,JAZ,JL,JH,JV,IVDOP)=-ZCR*SIN(PELEV(JI,JEL,JL,JV)) &
+                                                         *ZCCR*ZLBDA**(ZCXR-ZDR)*MOMG(ZALPHAR,ZNUR,ZDR)
+                      END IF ! end weighting by reflectivities
+                      IF(LATT) THEN ! Calculation of Extinction coefficient
+                        IF(NDIFF==0) THEN ! Rayleigh 3rd order : calculation from equations
+                          ! 3.39 p55 : extinction coeff = int(extinction_section(D) * N(D))
+                          ! 2.2 and 2.3 p23: simplification of int(D**p * N(D)) and N0j
+                          ! 3.42 p57 : extinction_section(D)
+                          ZAETMP(:)=ZCCR*ZLBDA**ZCXR*(XPI**2/XLAM_RAD(JI)*AIMAG(ZQK)&
+                                    *MOMG(ZALPHAR,ZNUR,ZBR)/ZLBDA**ZBR)
+                        ELSE  ! Rayleigh 6th order ! eq 3.52 p 58 for extinction coefficient
+                          ZAETMP(:)=ZCCR*ZLBDA**ZCXR*(XPI**2/XLAM_RAD(JI)*AIMAG(ZQK)&
+                                    *MOMG(ZALPHAR,ZNUR,ZBR)/ZLBDA**ZBR             &
+                                    +XPI**4/15./XLAM_RAD(JI)**3*AIMAG(ZQK**2*(ZQMW**4+27.*ZQMW**2+38.) &
+                                    /(2.*ZQMW**2+3.))*MOMG(ZALPHAR,ZNUR,5.*ZBR/3.)/ZLBDA**(5.*ZBR/3.)&
+                                    +2.*XPI**5/3. /XLAM_RAD(JI)**4*REAL(ZQK**2)                      &
+                                    *MOMG(ZALPHAR,ZNUR,2.*ZBR)   /ZLBDA**(2.*ZBR))
+                        END IF
+                      END IF ! end IF(LATT)
+                      ZRE_S22S11_R=0
+                      ZIM_S22S11_R=0
+                      ZS22_CARRE_R=0
+                      ZS11_CARRE_R=0       
+                    !******************************* NDIFF==7 ************************************                 
+                    ELSE IF(NDIFF==7) THEN !T-matrix 
+                      ZREFLOC(:)=0
+                      IF(LATT) ZAETMP(:)=0       
+                      IF (GLIMA) THEN
+                        CALL CALC_KTMAT_LIMA(PELEV(JI,JEL,JL,JV),&
+                                        PT_RAY(JI,JEL,JAZ,JL,JH,JV),ZCC,ZM,&
+                                        ZELEV_MIN(1),ZELEV_MAX(1),ZELEV_STEP(1),&
+                                        ZTC_MIN(1),ZTC_MAX(1),ZTC_STEP(1),&
+                                        ZCC_MIN(1),ZCC_MAX(1),ZCC_STEP(1),&
+                                        ZEXPM_MIN,ZEXPM_MAX,ZEXPM_STEP,&
+                                        ITMAT,ZELEV_RED,ZTC_RED,ZCC_RED,ZM_RED)
+                      ELSE
+                        CALL CALC_KTMAT(PELEV(JI,JEL,JL,JV),&
+                                        PT_RAY(JI,JEL,JAZ,JL,JH,JV),ZFW,ZM,&
+                                        ZELEV_MIN(1),ZELEV_MAX(1),ZELEV_STEP(1),&
+                                        ZTC_MIN(1),ZTC_MAX(1),ZTC_STEP(1),&
+                                        ZFW_MIN(1),ZFW_MAX(1),ZFW_STEP(1),&
+                                        ZEXPM_MIN,ZEXPM_MAX,ZEXPM_STEP,&
+                                        ITMAT,ZELEV_RED,ZTC_RED,ZFW_RED,ZM_RED)
+                      ENDIF
+                      IF (ITMAT(1) .NE. -NUNDEF) THEN 
+                        DO JIND=1,SIZE(KMAT_COEF,2),1
+                          KMAT_COEF(1,JIND)=ZS11_CARRE_T_R(ITMAT(JIND))
+                          KMAT_COEF(2,JIND)=ZS22_CARRE_T_R(ITMAT(JIND))
+                          KMAT_COEF(3,JIND)=ZRE_S22S11_T_R(ITMAT(JIND))
+                          KMAT_COEF(4,JIND)=ZIM_S22S11_T_R(ITMAT(JIND))
+                          KMAT_COEF(5,JIND)=ZRE_S22FMS11FT_T_R(ITMAT(JIND))
+                          KMAT_COEF(6,JIND)=ZIM_S22FT_T_R(ITMAT(JIND))
+                          KMAT_COEF(7,JIND)=ZIM_S11FT_T_R(ITMAT(JIND))
+                        ENDDO
+                        IF (GLIMA) THEN
+                          CALL INTERPOL(ZELEV_RED,ZTC_RED,ZCC_RED,ZM_RED,KMAT_COEF,ZS11_CARRE_R,ZS22_CARRE_R,&
+                                       ZRE_S22S11_R,ZIM_S22S11_R,ZRE_S22FMS11F,ZIM_S22FT,ZIM_S11FT)  
+                        ELSE
+                          CALL INTERPOL(ZELEV_RED,ZTC_RED,ZFW_RED,ZM_RED,KMAT_COEF,ZS11_CARRE_R,ZS22_CARRE_R,&
+                                       ZRE_S22S11_R,ZIM_S22S11_R,ZRE_S22FMS11F,ZIM_S22FT,ZIM_S11FT)
+                        ENDIF
+                      ELSE
+                        ZS11_CARRE_R=0
+                        ZS22_CARRE_R=0
+                        ZRE_S22S11_R=0
+                        ZIM_S22S11_R=0
+                        ZRE_S22FMS11F=0
+                        ZIM_S22FT=0
+                        ZIM_S11FT=0
+                      END IF
+                      ZREFLOC(1)=1.E18*(XLAM_RAD(JI))**4/(XPI**5*.93)*4*XPI*ZS22_CARRE_R
+                      ZREFLOC(2)=1.E18*(XLAM_RAD(JI))**4/(XPI**5*.93)*4*XPI*ZS11_CARRE_R
+                      ZREFLOC(3)=180.E3/XPI*XLAM_RAD(JI)*ZRE_S22FMS11F
+                      IF (GLIMA) THEN
+                        ZREFL(JI,JEL,JAZ,JL,JH,JV,IVDOP)=PVDOP_RAY(JI,JEL,JAZ,JL,JH,JV)*ZREFLOC(1) &
+                                                       -ZCR*SIN(PELEV(JI,JEL,JL,JV))*ZREFLOC(1) &
+                                                       *1.E18*(XLAM_RAD(JI)/XPI)**4/.93*ZCC/4./ZLBDA**(2+ZDR)
+                      ELSE
+                        ZREFL(JI,JEL,JAZ,JL,JH,JV,IVDOP)=PVDOP_RAY(JI,JEL,JAZ,JL,JH,JV)*ZREFLOC(1) &
+                                                       -ZCR*SIN(PELEV(JI,JEL,JL,JV))*ZREFLOC(1) &
+                                                       *1.E18*(XLAM_RAD(JI)/XPI)**4/.93*ZCCR/4./ZLBDA**(3+ZDR)
+                      ENDIF
+                      IF(LATT) THEN
+                        ZAETMP(1)=ZIM_S22FT*XLAM_RAD(JI)*2
+                        ZAETMP(2)=ZIM_S11FT*XLAM_RAD(JI)*2
+                      END IF   
+                    !******************************* NDIFF=1 or 3 *********************************
+                    !       Gauss Laguerre integration
+                    ELSE ! MIE OR T-MATRIX OR RAYLEIGH FOR ELLIPSOIDES
+                      ZREFLOC(:)=0.
+                      IF(LATT) ZAETMP(:)=0.
+                      DO JJ=1,NPTS_GAULAG ! ****** Gauss-Laguerre quadrature
+                        SELECT CASE(NDIFF)
+                        CASE(1) ! *************** NDIFF=1 MIE *****************
+                          ! subroutine BHMIE defined in mode_fscatter.f90
+                          ! calculate extinction coefficient ZQEXT(1),scattering : ZQSCA
+                          ! and backscattering ZQBACK(1) on the horizontal plan (spheroid)
+                          CALL BHMIE(XPI/XLAM_RAD(JI)*ZX(JJ)/ZLBDA,ZQMW,ZQEXT(1),ZQSCA,ZQBACK(1))
+                          ZQBACK(2)=ZQBACK(1) !=> same because sphere
+                          ZQEXT(2)=ZQEXT(1) ! modif Clotilde 23/04/2012
+                          ZQBACK(3)=0. !=> 0 because sphere
+                        CASE(3) !****************** NDIFF==3 RG RAYLEIGH FOR ELLIPSOIDES ***********************
+                          IF(ARF(ZX(JJ)/ZLBDA)==1.) THEN
+                            ZLB=1./3.
+                          ELSE
+                            ZLB=1./(ARF(ZX(JJ)/ZLBDA))**2-1. ! f**2
+                            ZLB=(1.+ZLB)/ZLB*(1.-ATAN(SQRT(ZLB))/SQRT(ZLB)) ! lambda_b
+                            IF(ZX(JJ)/ZLBDA>16.61E-3) PRINT*, 'Negative axis ratio; reduce NPTS_GAULAG.'
+                          END IF
+                          ! equation 3.44 p 56 (ZX**4 instead of ZX**6 but ZQBACK is multiplied after by ZX**2)
+                          ZQBACK(1)=4.*(XPI/XLAM_RAD(JI)*ZX(JJ)/ZLBDA)**4&
+                                    *ABS((ZQMW**2-1.)/3./(1.+.5*(1.-ZLB)*(ZQMW**2-1.)))**2
+                          ! equation 3.45 p 56
+                          ZQBACK(2)=4.*(XPI/XLAM_RAD(JI)*ZX(JJ)/ZLBDA)**4*ABS((ZQMW**2-1.)/3.*&
+                                    (SIN(PELEV(JI,JEL,JL,JV))**2/(1.+.5*(1.-ZLB)*(ZQMW**2-1.))+& ! PELEV=PI+THETA_I
+                                    COS(PELEV(JI,JEL,JL,JV))**2/(1.+ZLB*(ZQMW**2-1.))) )**2 !
+                          ! KDP from equation 3.49
+                          ZQBACK(3)=ZX(JJ)/ZLBDA**3*REAL((ZQMW**2-1.)**2*(3.*ZLB-1.)/(2.+(ZQMW**2-1.)*(ZLB+1.) &
+                          +ZLB*(1.-ZLB)*(ZQMW**2-1.)**2))
+                          IF(LATT) THEN
+                            ! equations 3.48 and 3.49 p57
+                            ZQEXT(1)=4.*(XPI/XLAM_RAD(JI)*ZX(JJ)/ZLBDA)*AIMAG((ZQMW**2-1.)/3./(1.+.5*(1.-ZLB)*(ZQMW**2-1.)))
+                            ZQEXT(2)=4.*(XPI/XLAM_RAD(JI)*ZX(JJ)/ZLBDA)*AIMAG((ZQMW**2-1.)/3.*&
+                                     (SIN(PELEV(JI,JEL,JL,JV))**2/(1.+.5*(1.-ZLB)*(ZQMW**2-1.))+& ! PELEV=PI+THETA_I
+                                     COS(PELEV(JI,JEL,JL,JV))**2/(1.+ZLB*(ZQMW**2-1.))))
+                          END IF
+                        END SELECT !end SELECT NDIFF
+                        !incrementation of the reflectivity and Kdp(1,2,3,4 for Zh, Zv, )
+                        !with the backscattering coefficients for each point of the GAULAG distribution
+                        ! or each diameter D
+                        ZREFLOC(1:3)=ZREFLOC(1:3)+ZQBACK(1:3)*ZX(JJ)**2*ZW(JJ)
+                        ZREFLOC(4)=ZREFLOC(4)+ZQBACK(1)*ZX(JJ)**(2+ZDR)*ZW(JJ)
+                          !same for attenuation with extinction coefficient						
+                        IF(LATT) ZAETMP(:)=ZAETMP(:)+ZQEXT(:)*ZX(JJ)**2*ZW(JJ)
+                      END DO ! ****** end loop Gauss-Laguerre quadrature
+               
+                      ZREFLOC(1:2)=1.E18*ZREFLOC(1:2)*(XLAM_RAD(JI)/XPI)**4/.93*ZCCR/4./ZLBDA**3
+                      ZREFLOC(3)=ZREFLOC(3)*XPI**2/6./XLAM_RAD(JI)*ZCCR/ZLBDA &
+                                 *180.E3/XPI ! (in deg/km)		
+                      ZREFL(JI,JEL,JAZ,JL,JH,JV,IVDOP)=PVDOP_RAY(JI,JEL,JAZ,JL,JH,JV)*ZREFLOC(1) &
+                                                       -ZCR*SIN(PELEV(JI,JEL,JL,JV))*ZREFLOC(4) &
+                                                       *1.E18*(XLAM_RAD(JI)/XPI)**4/.93*ZCCR/4./ZLBDA**(3+ZDR)
+          
+                      !********* for all cases with Gauss-Laguerre integration
+                      ZRE_S22S11_R=0
+                      ZIM_S22S11_R=0
+                      ZS22_CARRE_R=0
+                      ZS11_CARRE_R=0
+                      IF(LATT) ZAETMP(:)=ZAETMP(:)*XPI*ZCCR*ZLBDA**(ZCXR-2.*ZBR/3.)/(4.*GAMMA(ZNUR))
+                    END IF ! ****************** End if for each type of diffusion ************************
+                    !incrementation of ZHH, ZDR and KDP
+                    ZREFL(JI,JEL,JAZ,JL,JH,JV,1:3)=ZREFL(JI,JEL,JAZ,JL,JH,JV,1:3)+ZREFLOC(1:3)
+                    ! ZER (Z due to raindrops)
+                    ZREFL(JI,JEL,JAZ,JL,JH,JV,IZER)=ZREFLOC(1)
+                    ZREFL(JI,JEL,JAZ,JL,JH,JV,IZDA)=ZREFLOC(2) !Zvv for ZDR due to rain
+                    ZREFL(JI,JEL,JAZ,JL,JH,JV,IKDR)=ZREFLOC(3) !Zvv for ZDR due to rain  
+
+                    ! RhoHV due to rain
+                    IF (ZS22_CARRE_R*ZS11_CARRE_R .GT. 0) THEN
+                      ZREFL(JI,JEL,JAZ,JL,JH,JV,IRHR)=SQRT(ZRE_S22S11_R**2+ZIM_S22S11_R**2)/SQRT(ZS22_CARRE_R*ZS11_CARRE_R)
+                    ELSE
+                      ZREFL(JI,JEL,JAZ,JL,JH,JV,IRHR)=1
+                    END IF
+                    IF(LATT) THEN
+                      ZAELOC(JI,JEL,JAZ,JL,JH,JV,:)=ZAETMP(:) ! specific attenuation due to rain
+                      ZREFL(JI,JEL,JAZ,JL,JH,JV,IAER)=ZAETMP(1)
+                      ZREFL(JI,JEL,JAZ,JL,JH,JV,IAVR)=ZAETMP(2)
+                      ! for ranges over 1, correction of attenuation on reflectivity due to rain
+                      IF(JL>1) THEN
+                        ZAERINT=ZAERINT*EXP(-2.*ZREFL(JI,JEL,JAZ,JL-1,JH,JV,IAER)*XSTEP_RAD)
+                        ZAVRINT=ZAVRINT*EXP(-2.*ZREFL(JI,JEL,JAZ,JL-1,JH,JV,IAVR)*XSTEP_RAD)
+                      END IF
+                      ZREFL(JI,JEL,JAZ,JL,JH,JV,IZER)=ZREFL(JI,JEL,JAZ,JL,JH,JV,IZER)*ZAERINT ! Z_r attenuated
+                      ZREFL(JI,JEL,JAZ,JL,JH,JV,IZDA)=ZREFL(JI,JEL,JAZ,JL,JH,JV,IZDA)*ZAVRINT ! ZVr attenuated		
+                    END IF !end IF(LATT)
+                  END IF 
+                        ! mimimum rainwater mixing ratio
+                        ! Total attenuation even if no hydrometeors (equation 1.7 p 17)
+                  IF(LATT.AND.JL>1) ZREFL(JI,JEL,JAZ,JL,JH,JV,IATR)=ZREFL(JI,JEL,JAZ,JL-1,JH,JV,IATR) &
+                                          *EXP(-2.*ZREFL(JI,JEL,JAZ,JL-1,JH,JV,IAER)*XSTEP_RAD)
+                END IF ! **************** end RAIN (end IF SIZE(PR_RAY,1) > 0)
+                !
+                !---------------------------------------------------------------------------------------------------
+                !*       3.    PRISTINE ICE
+                !              ---------
+                !
+                IF (SIZE(PI_RAY,1)>0)  THEN
+                  ZM=PRHODREF_RAY(JI,JEL,JAZ,JL,JH,JV)*PI_RAY(JI,JEL,JAZ,JL,JH,JV) !ice content
+                  IF (PRHODREF_RAY(JI,JEL,JAZ,JL,JH,JV)==-XUNDEF .OR. PI_RAY(JI,JEL,JAZ,JL,JH,JV)==-XUNDEF) ZM=-XUNDEF
+                  IF (GLIMA) THEN
+                    ZC=PRHODREF_RAY(JI,JEL,JAZ,JL,JH,JV)*PCIT_RAY(JI,JEL,JAZ,JL,JH,JV)
+                    IF (PRHODREF_RAY(JI,JEL,JAZ,JL,JH,JV)==-XUNDEF .OR. PCIT_RAY(JI,JEL,JAZ,JL,JH,JV)==-XUNDEF) ZC=-XUNDEF
+                  ELSE
+                    ZC=PCIT_RAY(JI,JEL,JAZ,JL,JH,JV)
+                  ENDIF
+                  IF(ZM>ZM_MIN .AND. ZC> 527.82) THEN  
+                    ! cit > 527.82 otherwise pbs due to interpolation
+                    !ice dielectric constant (QPESI defined in mode_fscatter, equation 3.65 p 65)
+                    ZEPSI=QEPSI(PT_RAY(JI,JEL,JAZ,JL,JH,JV),XLIGHTSPEED/XLAM_RAD(JI))
+                    ZQMI=SQRT(ZEPSI)
+                    ZQK=(ZQMI**2-1.)/(ZQMI**2+2.)
+                    !see 3.77 p68 : to replace Dg by an equivalent diameter De of pure ice, a multiplicative
+                    !melting factor has to be added                      
+                    ZDMELT_FACT=(6.*ZAI)/(XPI*.92*XRHOLW)
+                    ZEXP=2.*ZBI !XBI = 2.5 (Plates) in ini_radar.f90 (bj tab 2.1 p24)
+                    !ZLBDA : slope distribution parameter (equation 2.6 p 23)
+                    IF (GLIMA) THEN                   
+                      ZLBDA=(ZLBI*ZC/ZM)**ZLBEXI
+                    ELSE
+                      ZLBDA=ZLBI*(ZM/ZC)**ZLBEXI
+                    ENDIF
+                    ! Rayleigh or Rayleigh-Gans (=> Rayleigh) or Rayleigh with 6th order for attenuation
+                    ! (pristine ice = sphere),
+                    IF(NDIFF==0.OR.NDIFF==3.OR.NDIFF==4) THEN
+                      !ZREFLOC(1:2) : Zh et Zv from equation 2.2 p23 and Cristals parameters
+                      !ZEQICE=0.224 (radar_rain_ice.f90) factor used to convert the ice crystals
+                      !reflectivity into an equivalent liquid water reflectivity (from Smith, JCAM 84)
+                      ZREFLOC(1:2)=ZEQICE*.92**2*ZDMELT_FACT**2*1.E18*ZC &
+                                   *ZLBDA**(ZCXI-ZEXP)*MOMG(ZALPHAI,ZNUI,ZEXP)
+                      ZREFLOC(3)=0.
+                      IF(LWREFL) THEN ! weighting by reflectivities
+                        !calculation of radial velocity
+                        ZREFL(JI,JEL,JAZ,JL,JH,JV,IVDOP)=ZREFL(JI,JEL,JAZ,JL,JH,JV,IVDOP)&
+                               -ZCI*SIN(PELEV(JI,JEL,JL,JV))*ZEQICE*.92**2*ZDMELT_FACT**2&
+                               *1.E18*ZC*ZLBDA**(ZCXI-ZEXP-ZDI)&
+                               *MOMG(ZALPHAI,ZNUI,ZEXP+ZDI)
+                      ELSE
+                        ZREFL(JI,JEL,JAZ,JL,JH,JV,IMAX)=ZREFL(JI,JEL,JAZ,JL,JH,JV,IMAX)&
+                                              +ZC*ZLBDA**ZCXI
+                        ZREFL(JI,JEL,JAZ,JL,JH,JV,IVDOP)=ZREFL(JI,JEL,JAZ,JL,JH,JV,IVDOP)&
+                                                            -ZCI*SIN(PELEV(JI,JEL,JL,JV))&
+                                                           *ZC&
+                                                           *ZLBDA**(ZCXI-ZDI)*MOMG(ZALPHAI,ZNUI,ZDI)
+                      END IF
+                      IF(LATT) THEN ! Calculation of Extinction coefficient
+                        ! Rayleigh 3rd order
+                        IF(NDIFF==0.OR.NDIFF==3) THEN
+                          ZAETMP(:)=ZC*ZLBDA**ZCXI&
+                                   *(ZDMELT_FACT*XPI**2/XLAM_RAD(JI)*AIMAG(ZQK)&
+                                   *MOMG(ZALPHAI,ZNUI,ZBI)/ZLBDA**ZBI)
+                          ! Rayleigh 6th order
+                        ELSE
+                          ZAETMP(:)=ZC*ZLBDA**ZCXI*(&
+                                    ZDMELT_FACT*XPI**2/XLAM_RAD(JI)*AIMAG(ZQK)&
+                                    *MOMG(ZALPHAI,ZNUI,ZBI)/ZLBDA**ZBI&
+                                    +ZDMELT_FACT**(5./3.)*XPI**4/15./XLAM_RAD(JI)**3&
+                                    *AIMAG(ZQK**2*(ZQMI**4+27.*ZQMI**2+38.)&
+                                    /(2.*ZQMI**2+3.))*MOMG(ZALPHAI,ZNUI,5.*ZBI/3.)/ZLBDA**(5.*ZBI/3.) &
+                                    +ZDMELT_FACT**2*2.*XPI**5/3. /XLAM_RAD(JI)**4*REAL(ZQK**2)&
+                                    *MOMG(ZALPHAI,ZNUI,2.*ZBI)/ZLBDA**(2.*ZBI))
+                        END IF
+                      END IF
+                    ELSE ! (if NDIFF=1 or NDIFF=7) => MIE (if choice=T-Matrix => Mie)
+                      ZREFLOC(:)=0.
+                      IF(LATT) ZAETMP(:)=0.
+                      DO JJ=1,NPTS_GAULAG ! ****** Gauss-Laguerre quadrature
+                        ZD=ZX(JJ)**(1./ZALPHAI)/ZLBDA !equivaut au ZDELTA_EQUIV olivier
+                        ZRHOI=6*ZAI*ZD**(ZBI-3.)/XPI !pristine ice density
+                        ZNUM=1.+2.*ZRHOI*(ZEPSI-1.)/(ZRHOPI*(ZEPSI+2.))
+                        ZDEN=1.-ZRHOI*(ZEPSI-1.)/(ZRHOPI*(ZEPSI+2.))
+                        ZQM=sqrt(ZNUM/ZDEN)
+                        CALL BHMIE(XPI/XLAM_RAD(JI)*ZD,ZQM,ZQEXT(1),ZQSCA,ZQBACK(1))
+                        ZQBACK(2)=ZQBACK(1)
+                        ZQEXT(2)=ZQEXT(1) ! modif Clotilde 23/04/2012
+                        ZQBACK(3)=0.
+                        ZREFLOC(1:3)=ZREFLOC(1:3)+ZQBACK(1:3)*ZX(JJ)**(ZNUI-1.)*ZD**2*ZW(JJ)
+                        ZREFLOC(4)=ZREFLOC(4)+ZQBACK(1)*ZX(JJ)**(ZNUI-1.+ZDI/ZALPHAI)*ZD**2*ZW(JJ)
+                        IF(LATT) ZAETMP(:)=ZAETMP(:)+ZQEXT(:)*ZX(JJ)**(ZNUI-1.)*ZD**2*ZW(JJ)                  
+                      END DO ! **************** end loop Gauss-Laguerre quadrature
+
+                      ZREFLOC(1:2)=ZREFLOC(1:2)*1.E18*(XLAM_RAD(JI)/XPI)**4/.93*ZC &
+                                   *ZLBDA**(ZCXI)/(4.*GAMMA(ZNUI))
+
+                      ZREFL(JI,JEL,JAZ,JL,JH,JV,IVDOP)=ZREFL(JI,JEL,JAZ,JL,JH,JV,IVDOP)&
+                                           +PVDOP_RAY(JI,JEL,JAZ,JL,JH,JV)*ZREFLOC(1) &
+                                           -ZCI*SIN(PELEV(JI,JEL,JL,JV))*ZREFLOC(4) &
+                                           *1.E18*(XLAM_RAD(JI)/XPI)**4*ZC &
+                                           *ZLBDA**(ZCXI-ZDI)/(4.*GAMMA(ZNUI)*.93)
+                      IF(LATT) ZAETMP(:)=ZAETMP(:)*XPI*ZC*ZLBDA**(ZCXI)/(4.*GAMMA(ZNUI))
+                    END IF !**************** end loop for each type of diffusion
+                    ZREFL(JI,JEL,JAZ,JL,JH,JV,1:3)=ZREFL(JI,JEL,JAZ,JL,JH,JV,1:3)+ZREFLOC(1:3)
+                    ZREFL(JI,JEL,JAZ,JL,JH,JV,IZEI)=ZREFLOC(1) ! z_e due to pristine ice
+                    IF(LATT) THEN
+                      ZAELOC(JI,JEL,JAZ,JL,JH,JV,:)=ZAELOC(JI,JEL,JAZ,JL,JH,JV,:)+ZAETMP(:)
+                      ZREFL(JI,JEL,JAZ,JL,JH,JV,IAEI)=ZAETMP(1)
+                      ZREFL(JI,JEL,JAZ,JL,JH,JV,IAVI)=ZAETMP(2)
+                      IF(JL>1) ZAEIINT=ZAEIINT*EXP(-2.*ZREFL(JI,JEL,JAZ,JL-1,JH,JV,IAEI)*XSTEP_RAD)
+                      ZREFL(JI,JEL,JAZ,JL,JH,JV,IZEI)=ZREFL(JI,JEL,JAZ,JL,JH,JV,IZEI)*ZAEIINT ! Z_i attenuated
+                    END IF            
+                  END IF !********************* end IF (SIZE(PI_RAY,1)>0)
+         
+                  ! Total attenuation even if no hydrometeors
+                  IF(LATT.AND.JL>1) ZREFL(JI,JEL,JAZ,JL,JH,JV,IATI)=ZREFL(JI,JEL,JAZ,JL-1,JH,JV,IATI) &
+                                                *EXP(-2.*ZREFL(JI,JEL,JAZ,JL-1,JH,JV,IAEI)*XSTEP_RAD)
+                  ZRE_S22S11_I=0
+                  ZIM_S22S11_I=0
+                  ZS22_CARRE_I=0
+                  ZS11_CARRE_I=0              
+                END IF !******************** end IF (SIZE(PI_RAY,1)>0)
+                !---------------------------------------------------------------------------------------------------
+                !*       4.    SNOW 
+                !              -----
+                IF (SIZE(PS_RAY,1)>0)  THEN
+                  ZM=PRHODREF_RAY(JI,JEL,JAZ,JL,JH,JV)*PS_RAY(JI,JEL,JAZ,JL,JH,JV) !snow content
+                  IF(ZM > ZM_MIN) THEN
+                    YTYPE='s' 
+                    !ZQMI: same formulation than for ice because snow is simulated only
+                    !above melting leyer (3.5.4 p 67)
+                    ZFW=0 
+                    ZQMI=SQRT(QEPSI(PT_RAY(JI,JEL,JAZ,JL,JH,JV),XLIGHTSPEED/XLAM_RAD(JI)))
+                    ZQK=(ZQMI**2-1.)/(ZQMI**2+2.) !ajout de Clotilde 23/04/2012
+                    ZDMELT_FACT=6.*ZAS/(XPI*.92*XRHOLW)
+                    ZEXP=2.*ZBS !XBS = 1.9 in ini_radar.f90 (bj tab 2.1 p24)
+                    !dans ini_rain_ice.f90 :
+                    IF (GLIMA .AND. LSNOW_T_L) THEN
+                       IF (PT_RAY(JI,JEL,JAZ,JL,JH,JV)>263.15) THEN
+                          ZLBDA = MAX(MIN(XLBDAS_MAX_L, 10**(14.554-0.0423*PT_RAY(JI,JEL,JAZ,JL,JH,JV))),XLBDAS_MIN_L) &
+                                  *XTRANS_MP_GAMMAS_L
+                       ELSE
+                          ZLBDA = MAX(MIN(XLBDAS_MAX_L, 10**(6.226-0.0106*PT_RAY(JI,JEL,JAZ,JL,JH,JV))),XLBDAS_MIN_L) &
+                                  *XTRANS_MP_GAMMAS_L
+                       END IF
+                       ZN=ZNS*ZM*ZLBDA**ZBS
+                    ELSE IF (.NOT.GLIMA .AND. LSNOW_T_I) THEN
+                       IF (PT_RAY(JI,JEL,JAZ,JL,JH,JV)>263.15) THEN
+                          ZLBDA = MAX(MIN(XLBDAS_MAX_I, 10**(14.554-0.0423*PT_RAY(JI,JEL,JAZ,JL,JH,JV))),XLBDAS_MIN_I) &
+                                  *XTRANS_MP_GAMMAS_I
+                       ELSE
+                          ZLBDA = MAX(MIN(XLBDAS_MAX_I, 10**(6.226-0.0106*PT_RAY(JI,JEL,JAZ,JL,JH,JV))),XLBDAS_MIN_I) &
+                                  *XTRANS_MP_GAMMAS_I
+                       END IF
+                       ZN=ZNS*ZM*ZLBDA**ZBS
+                    ELSE
+                       ZLBDA= ZLBS*(ZM)**ZLBEXS
+                       ZN=ZCCS*ZLBDA**ZCXS
+                    END IF
+                    ! Rayleigh or Rayleigh-Gans or Rayleigh with 6th order for attenuation
+                    IF(NDIFF==0.OR.NDIFF==3.OR.NDIFF==4) THEN
+                      ZREFLOC(1:2)=ZEQICE*.92**2*ZDMELT_FACT**2*1.E18*ZN*ZLBDA**(ZEXP)*MOMG(ZALPHAS,ZNUS,ZEXP)
+                      ZREFLOC(3)=0.
+                      IF(LWREFL) THEN ! weighting by reflectivities
+                        ZREFL(JI,JEL,JAZ,JL,JH,JV,IVDOP)=ZREFL(JI,JEL,JAZ,JL,JH,JV,IVDOP)&
+                               -ZCS*SIN(PELEV(JI,JEL,JL,JV))*ZEQICE*.92**2*ZDMELT_FACT**2&
+                               *1.E18*ZN*ZLBDA**(ZEXP-ZDS)*MOMG(ZALPHAS,ZNUS,ZEXP+ZDS)
+                      ELSE
+                        ZREFL(JI,JEL,JAZ,JL,JH,JV,IMAX)=ZREFL(JI,JEL,JAZ,JL,JH,JV,IMAX)+ZN
+                        ZREFL(JI,JEL,JAZ,JL,JH,JV,IVDOP)=ZREFL(JI,JEL,JAZ,JL,JH,JV,IVDOP)&
+                                                            -ZCS*SIN(PELEV(JI,JEL,JL,JV))&
+                                           *ZN*ZLBDA**(ZDS)*MOMG(ZALPHAS,ZNUS,ZDS)
+                      END IF
+                      IF(LATT) THEN
+                        IF(NDIFF==0.OR.NDIFF==3) THEN
+                          ZAETMP(:)=ZN*(ZDMELT_FACT*XPI**2/XLAM_RAD(JI)*AIMAG(ZQK)&
+                                    *MOMG(ZALPHAS,ZNUS,ZBS)/ZLBDA**ZBS)
+                        ELSE
+                          ZAETMP(:)=ZN*(ZDMELT_FACT*XPI**2/XLAM_RAD(JI)*AIMAG(ZQK)      &
+                                    *MOMG(ZALPHAS,ZNUS,ZBS)/ZLBDA**ZBS                               &
+                                    +ZDMELT_FACT**(5./3.)*XPI**4/15./XLAM_RAD(JI)**3                 &
+                                    *AIMAG(ZQK**2*(ZQMI**4+27.*ZQMI**2+38.)                             &
+                                    /(2.*ZQMI**2+3.))*MOMG(ZALPHAS,ZNUS,5.*ZBS/3.)/ZLBDA**(5.*ZBS/3.) &
+                                    +ZDMELT_FACT**2   *2.*XPI**5/3. /XLAM_RAD(JI)**4*REAL(ZQK**2)     &
+                                    *MOMG(ZALPHAS,ZNUS,2.*ZBS)/ZLBDA**(2.*ZBS))
+                        END IF
+                      END IF
+                      ZRE_S22S11_S=0
+                      ZIM_S22S11_S=0
+                      ZS22_CARRE_S=0
+                      ZS11_CARRE_S=0                        
+                    !******************************* NDIFF==7 ************************************ 
+                    ELSE IF(NDIFF==7) THEN
+
+                      ZREFLOC(:)=0
+                      IF(LATT) ZAETMP(:)=0      
+                      CALL CALC_KTMAT(PELEV(JI,JEL,JL,JV), PT_RAY(JI,JEL,JAZ,JL,JH,JV),&
+                                      ZFW,ZM,&
+                                      ZELEV_MIN(2),ZELEV_MAX(2),ZELEV_STEP(2),&
+                                      ZTC_MIN(2),ZTC_MAX(2),ZTC_STEP(2),&
+                                      ZFW_MIN(2),ZFW_MAX(2),ZFW_STEP(2),&
+                                      ZEXPM_MIN,ZEXPM_MAX,ZEXPM_STEP,&
+                                      ITMAT,ZELEV_RED,ZTC_RED,ZFW_RED,ZM_RED)
+
+                      IF (ITMAT(1) .NE. -NUNDEF) THEN 
+                        DO JIND=1,SIZE(KMAT_COEF,2),1
+                          KMAT_COEF(1,JIND)=ZS11_CARRE_T_S(ITMAT(JIND))
+                          KMAT_COEF(2,JIND)=ZS22_CARRE_T_S(ITMAT(JIND))
+                          KMAT_COEF(3,JIND)=ZRE_S22S11_T_S(ITMAT(JIND))
+                          KMAT_COEF(4,JIND)=ZIM_S22S11_T_S(ITMAT(JIND))
+                          KMAT_COEF(5,JIND)=ZRE_S22FMS11FT_T_S(ITMAT(JIND))
+                          KMAT_COEF(6,JIND)=ZIM_S22FT_T_S(ITMAT(JIND))
+                          KMAT_COEF(7,JIND)=ZIM_S11FT_T_S(ITMAT(JIND))
+                        ENDDO 
+                          CALL  INTERPOL(ZELEV_RED,ZTC_RED,ZFW_RED,ZM_RED,KMAT_COEF,ZS11_CARRE_S,ZS22_CARRE_S,&
+                                       ZRE_S22S11_S,ZIM_S22S11_S,ZRE_S22FMS11F,ZIM_S22FT,ZIM_S11FT)   
+                      ELSE
+                        ZS11_CARRE_S=0
+                        ZS22_CARRE_S=0
+                        ZRE_S22S11_S=0
+                        ZIM_S22S11_S=0
+                        ZRE_S22FMS11F=0
+                        ZIM_S22FT=0
+                        ZIM_S11FT=0
+                      END IF
+                      ZREFLOC(1)=1.E18*(XLAM_RAD(JI))**4/(XPI**5*.93)*4*XPI*ZS22_CARRE_S
+                      ZREFLOC(2)=1.E18*(XLAM_RAD(JI))**4/(XPI**5*.93)*4*XPI*ZS11_CARRE_S
+                      ZREFLOC(3)=180.E3/XPI*XLAM_RAD(JI)*ZRE_S22FMS11F
+                      ZREFL(JI,JEL,JAZ,JL,JH,JV,IVDOP)=PVDOP_RAY(JI,JEL,JAZ,JL,JH,JV)*ZREFLOC(1) &
+                                                        -ZCS*SIN(PELEV(JI,JEL,JL,JV))*ZREFLOC(1) &
+                                         *1.E18*(XLAM_RAD(JI)/XPI)**4/.93*(ZN*ZLBDA**(-ZCXS))/4./ZLBDA**(3+ZDS)
+                      IF(LATT) THEN
+                        ZAETMP(1)=ZIM_S22FT*XLAM_RAD(JI)*2
+                        ZAETMP(2)=ZIM_S11FT*XLAM_RAD(JI)*2
+                      END IF     
+                    ELSE ! MIE 
+                      ZREFLOC(:)=0.
+                      IF(LATT) ZAETMP(:)=0.
+                      DO JJ=1,NPTS_GAULAG ! ****** Gauss-Laguerre quadrature
+                        ZD=ZX(JJ)**(1./ZALPHAS)/ZLBDA
+                        ZDE=ZDMELT_FACT**(1./3.)*ZD**(ZBS/3.)
+                        CALL BHMIE(XPI/XLAM_RAD(JI)*ZDE,ZQMI,ZQEXT(1),ZQSCA,ZQBACK(1))
+                        ZQBACK(2)=ZQBACK(1)
+                        ZQEXT(2)=ZQEXT(1) ! modif Clotilde 23/04/2012
+                        ZQBACK(3)=0.
+                        ZREFLOC(1:3)=ZREFLOC(1:3)+ZQBACK(1:3)*ZX(JJ)**(ZNUS-1.+2.*ZBS/3./ZALPHAS)*ZW(JJ)
+                        ZREFLOC(4)=ZREFLOC(4)+ZQBACK(1)*ZX(JJ)**(ZNUS-1.+2.*ZBS/3./ZALPHAS+ZDS/ZALPHAS)*ZW(JJ)
+                        IF(LATT) ZAETMP(:)=ZAETMP(:)+ZQEXT(:)*ZX(JJ)**(ZNUS-1.+2.*ZBS/3./ZALPHAS)*ZW(JJ)
+                      END DO ! ****** end loop Gauss-Laguerre quadrature
+                      ZREFLOC(1:2)=1.E18*(XLAM_RAD(JI)/XPI)**4*ZN*ZLBDA**(-2.*ZBS/3.)/&
+                                  (4.*GAMMA(ZNUS)*.93)*ZDMELT_FACT**(2./3.)*ZREFLOC(1:2)               
+                      ZREFL(JI,JEL,JAZ,JL,JH,JV,IVDOP)=ZREFL(JI,JEL,JAZ,JL,JH,JV,IVDOP)&
+                                            +PVDOP_RAY(JI,JEL,JAZ,JL,JH,JV)*ZREFLOC(1) &
+                                            -ZCS*SIN(PELEV(JI,JEL,JL,JV))*ZREFLOC(4)   &
+                                            *1.E18*(XLAM_RAD(JI)/XPI)**4*ZN          &
+                                            *ZLBDA**(2.*ZBS/3.-ZDS)/              &
+                                            (4.*GAMMA(ZNUS)*.93)*ZDMELT_FACT**(2./3.)                              
+                      IF(LATT) ZAETMP(:)=ZAETMP(:)*XPI*ZN*ZLBDA**(-2.*ZBS/3.)/(4.*GAMMA(ZNUS))&
+                                         *ZDMELT_FACT**(2./3.)            
+                      ZRE_S22S11_S=0
+                      ZIM_S22S11_S=0
+                      ZS22_CARRE_S=0
+                      ZS11_CARRE_S=0 
+                    END IF !**************** end loop for each type of diffusion
+                    ZREFL(JI,JEL,JAZ,JL,JH,JV,1:3)=ZREFL(JI,JEL,JAZ,JL,JH,JV,1:3)+ZREFLOC(1:3)
+                    ZREFL(JI,JEL,JAZ,JL,JH,JV,IZES)=ZREFLOC(1) ! Z_e due to snow
+                    ZREFL(JI,JEL,JAZ,JL,JH,JV,IZDS)=ZREFLOC(2) !Zvv for ZDR due to snow
+                    ZREFL(JI,JEL,JAZ,JL,JH,JV,IKDS)=ZREFLOC(3) !Zvv for ZDR due to snow 
+                    IF (ZS22_CARRE_S*ZS11_CARRE_S .GT. 0) THEN
+                      ZREFL(JI,JEL,JAZ,JL,JH,JV,IRHS)=SQRT(ZRE_S22S11_S**2+ZIM_S22S11_S**2)/SQRT(ZS22_CARRE_S*ZS11_CARRE_S)
+                    ELSE
+                     ZREFL(JI,JEL,JAZ,JL,JH,JV,IRHS)=1
+                    END IF
+                    IF(LATT) THEN
+                     ZAELOC(JI,JEL,JAZ,JL,JH,JV,:)=ZAELOC(JI,JEL,JAZ,JL,JH,JV,:)+ZAETMP(:)
+                      ZREFL(JI,JEL,JAZ,JL,JH,JV,IAES)=ZAETMP(1)
+                      ZREFL(JI,JEL,JAZ,JL,JH,JV,IAVS)=ZAETMP(2) 
+                      IF(JL>1) THEN
+                        ZAESINT=ZAESINT*EXP(-2.*ZREFL(JI,JEL,JAZ,JL-1,JH,JV,IAES)*XSTEP_RAD)
+                        ZAVSINT=ZAVSINT*EXP(-2.*ZREFL(JI,JEL,JAZ,JL-1,JH,JV,IAVS)*XSTEP_RAD)
+                      ENDIF
+                      ZREFL(JI,JEL,JAZ,JL,JH,JV,IZES)=ZREFL(JI,JEL,JAZ,JL,JH,JV,IZES)*ZAESINT ! Z_s attenuated
+                      ZREFL(JI,JEL,JAZ,JL,JH,JV,IZDS)=ZREFL(JI,JEL,JAZ,JL,JH,JV,IZDS)*ZAVSINT ! ZVs attenuated
+                    END IF !end IF(LATT)
+                  END IF !end IF(PS_RAY(JI,JEL,JAZ,JL,JH,JV) > ...)
+
+
+                 ! Total attenuation even if no hydrometeors
+                  IF(LATT.AND.JL>1) ZREFL(JI,JEL,JAZ,JL,JH,JV,IATS)=ZREFL(JI,JEL,JAZ,JL-1,JH,JV,IATS) &
+                                                *EXP(-2.*ZREFL(JI,JEL,JAZ,JL-1,JH,JV,IAES)*XSTEP_RAD)
+                END IF !END IF (SIZE(PS_RAY,1)>0)
+                !---------------------------------------------------------------------------------------------------
+                !*       5.    GRAUPEL
+                !              -------
+                !
+                !ZDG=.5 ! from Bringi & Chandrasekar 2001, p. 433
+                IF (SIZE(PG_RAY,1)>0)  THEN
+                  ZM=PRHODREF_RAY(JI,JEL,JAZ,JL,JH,JV)*PG_RAY(JI,JEL,JAZ,JL,JH,JV) !graupel content
+                  IF(ZM > ZM_MIN) THEN
+                    YTYPE='g'
+                    ZQMI=SQRT(QEPSI(MIN(PT_RAY(JI,JEL,JAZ,JL,JH,JV),XTT),XLIGHTSPEED/XLAM_RAD(JI)))
+                    ZQMW=SQRT(QEPSW(MAX(PT_RAY(JI,JEL,JAZ,JL,JH,JV),XTT),XLIGHTSPEED/XLAM_RAD(JI)))
+                    !ini_radar.f90 : ZCXG = -0.5 XBG = 2.8 ( Xj et bj tab 2.1 p 24)
+                    !ini_rain_ice.f90 : XLBEXG = 1.0/(XCXG-XBG) XAG = 19.6 (aj tab 2.1 p 24)
+                    !XLBG   = ( XAG*XCCG*MOMG(XALPHAG,XNUG,XBG) )**(-XLBEXG) (eq 2.6 p 23)
+                    IF (PR_RAY(JI,JEL,JAZ,JL,JH,JV) > ZRTMIN(3) ) THEN
+                      ZFW=PR_RAY(JI,JEL,JAZ,JL,JH,JV)/(PR_RAY(JI,JEL,JAZ,JL,JH,JV)+PG_RAY(JI,JEL,JAZ,JL,JH,JV))
+                    ELSE
+                      ZFW=0.
+                    END IF
+                    ZLBDA=ZLBG*(PRHODREF_RAY(JI,JEL,JAZ,JL,JH,JV)*PG_RAY(JI,JEL,JAZ,JL,JH,JV))**ZLBEXG
+                    !XTT : température du point triple de l'eau (273.16 K <=> 0.1 °C)
+                    IF(PT_RAY(JI,JEL,JAZ,JL,JH,JV) > XTT) THEN ! mixture of ice and water
+                      ZFRAC_ICE = .85 !(see p 68)
+                    ELSE ! only ice
+                      ZFRAC_ICE=1.
+                    END IF
+                    ! from eq 3.77 p 68
+                    !XRHOLW=1000 (initialized in ini_cst.f90)
+                    ZDMELT_FACT=6.*ZAG/(XPI*XRHOLW*((1.-ZFRAC_ICE)+ZFRAC_ICE*0.92))
+                    ZEXP=2.*ZBG
+                    !Calculation of the refractive index from Bohren and Battan (3.72 p66)
+                    ZQB=2.*ZQMW**2*(2.*ZQMI**2*LOG(ZQMI/ZQMW)/(ZQMI**2-ZQMW**2)-1.)/(ZQMI**2-ZQMW**2) !Beta (3.73 p66)
+                    ZQM=SQRT(((1.-ZFRAC_ICE)*ZQMW**2+ZFRAC_ICE*ZQB*ZQMI**2)/(1.-ZFRAC_ICE+ZFRAC_ICE*ZQB)) ! Bohren & Battan (1982) 3.72 p66
+                    ZQK=(ZQM**2-1.)/(ZQM**2+2.)                                       
+                    !Rayleigh, Rayleigh for ellipsoides or Rayleigh 6th order
+                    IF(NDIFF==0.OR.NDIFF==3.OR.NDIFF==4) THEN
+                      ZREFLOC(1:2)=ABS(ZQK)**2/.93*ZDMELT_FACT**2*1.E18*ZCCG*ZLBDA**(ZCXG-ZEXP)*MOMG(ZALPHAG,ZNUG,ZEXP)
+                      ZREFLOC(3)=0.
+                      IF(LWREFL) THEN ! weighting by reflectivities
+                        ZREFL(JI,JEL,JAZ,JL,JH,JV,IVDOP)=ZREFL(JI,JEL,JAZ,JL,JH,JV,IVDOP)&
+                              -ZCG*SIN(PELEV(JI,JEL,JL,JV))*ABS(ZQK)**2/.93*ZDMELT_FACT**2&
+                              *1.E18*ZCCG*ZLBDA**(ZCXG-ZEXP-ZDG)*MOMG(ZALPHAG,ZNUG,ZEXP+ZDG)
+                      ELSE
+                        ZREFL(JI,JEL,JAZ,JL,JH,JV,IMAX)=ZREFL(JI,JEL,JAZ,JL,JH,JV,IMAX)+ZCCG*ZLBDA**ZCXG
+                        ZREFL(JI,JEL,JAZ,JL,JH,JV,IVDOP)=ZREFL(JI,JEL,JAZ,JL,JH,JV,IVDOP)&
+                                                        -ZCG*SIN(PELEV(JI,JEL,JL,JV))&
+                                                        *ZCCG*ZLBDA**(ZCXG-ZDG)*MOMG(ZALPHAG,ZNUG,ZDG)
+                      END IF !end IF(LWREFL)
+                      IF(LATT) THEN
+                        IF(NDIFF==0.OR.NDIFF==3) THEN
+                          ZAETMP(:)=ZCCG*ZLBDA**ZCXG*(ZDMELT_FACT*XPI**2/XLAM_RAD(JI)*AIMAG(ZQK)   &
+                                    *MOMG(ZALPHAG,ZNUG,ZBG)/ZLBDA**ZBG)
+                        ELSE
+                          ZAETMP(:)=ZCCG*ZLBDA**ZCXG*(ZDMELT_FACT*XPI**2/XLAM_RAD(JI)*AIMAG(ZQK)   &
+                                   *MOMG(ZALPHAG,ZNUG,ZBG)/ZLBDA**ZBG&
+                                   +ZDMELT_FACT**(5./3.)*XPI**4/15./XLAM_RAD(JI)**3               &
+                                   *AIMAG(ZQK**2*(ZQM**4+27.*ZQM**2+38.)                             &
+                                   /(2.*ZQM**2+3.))*MOMG(ZALPHAG,ZNUG,5.*ZBG/3.)/ZLBDA**(5.*ZBG/3.)&
+                                   +ZDMELT_FACT**2   *2.*XPI**5/3. /XLAM_RAD(JI)**4*REAL(ZQK**2)   &
+                                   *MOMG(ZALPHAG,ZNUG,2.*ZBG)   /ZLBDA**(2.*ZBG))
+                        END IF ! end IF(NDIFF==0.OR.NDIFF==3)
+                      END IF ! end IF(LATT)
+                      ZRE_S22S11_G=0
+                      ZIM_S22S11_G=0
+                      ZS22_CARRE_G=0
+                      ZS11_CARRE_G=0                    
+                      !******************************* NDIFF==7 TmatInt ************************************ 
+                    ELSE IF(NDIFF==7) THEN
+                      ZREFLOC(:)=0
+                      IF(LATT) ZAETMP(:)=0                
+                      IF (ZFW < 0.01) THEN !******** DRY GRAUPEL 
+                         CALL CALC_KTMAT(PELEV(JI,JEL,JL,JV), PT_RAY(JI,JEL,JAZ,JL,JH,JV),&
+                                        ZFW,ZM,&
+                                        ZELEV_MIN(3),ZELEV_MAX(3),ZELEV_STEP(3),&
+                                        ZTC_MIN(3),ZTC_MAX(3),ZTC_STEP(3),&
+                                        ZFW_MIN(3),ZFW_MAX(3),ZFW_STEP(3),&
+                                        ZEXPM_MIN,ZEXPM_MAX,ZEXPM_STEP,&
+                                        ITMAT,ZELEV_RED,ZTC_RED,ZFW_RED,ZM_RED)
+                        IF (ITMAT(1) .NE. -NUNDEF) THEN 
+                          DO JIND=1,SIZE(KMAT_COEF,2),1
+                            KMAT_COEF(1,JIND)=ZS11_CARRE_T_G(ITMAT(JIND))
+                            KMAT_COEF(2,JIND)=ZS22_CARRE_T_G(ITMAT(JIND))
+                            KMAT_COEF(3,JIND)=ZRE_S22S11_T_G(ITMAT(JIND))
+                            KMAT_COEF(4,JIND)=ZIM_S22S11_T_G(ITMAT(JIND))
+                            KMAT_COEF(5,JIND)=ZRE_S22FMS11FT_T_G(ITMAT(JIND))
+                            KMAT_COEF(6,JIND)=ZIM_S22FT_T_G(ITMAT(JIND))
+                            KMAT_COEF(7,JIND)=ZIM_S11FT_T_G(ITMAT(JIND))
+                          ENDDO
+                         CALL  INTERPOL(ZELEV_RED,ZTC_RED,ZFW_RED,ZM_RED,KMAT_COEF,ZS11_CARRE_G,ZS22_CARRE_G,&
+                                         ZRE_S22S11_G,ZIM_S22S11_G,ZRE_S22FMS11F,ZIM_S22FT,ZIM_S11FT)
+  ELSE
+                          ZS11_CARRE_G=0
+                          ZS22_CARRE_G=0
+                          ZRE_S22S11_G=0
+                          ZIM_S22S11_G=0
+                          ZRE_S22FMS11F=0
+                          ZIM_S22FT=0
+                          ZIM_S11FT=0
+                        END IF                    
+                      ELSE !ZFW >= 0.01 ************** WET GRAUPEL
+                        CALL CALC_KTMAT(PELEV(JI,JEL,JL,JV),PT_RAY(JI,JEL,JAZ,JL,JH,JV),&
+                                        ZFW,ZM,&
+                                        ZELEV_MIN(4),ZELEV_MAX(4),ZELEV_STEP(4),&
+                                        ZTC_MIN(4),ZTC_MAX(4),ZTC_STEP(4),&
+                                        ZFW_MIN(4),ZFW_MAX(4),ZFW_STEP(4),&
+                                        ZEXPM_MIN,ZEXPM_MAX,ZEXPM_STEP,&
+                                        ITMAT,ZELEV_RED,ZTC_RED,ZFW_RED,ZM_RED)
+                        IF (ITMAT(1) .NE. -NUNDEF) THEN  
+                          DO JIND=1,SIZE(KMAT_COEF,2),1
+                            KMAT_COEF(1,JIND)=ZS11_CARRE_T_W(ITMAT(JIND))
+                            KMAT_COEF(2,JIND)=ZS22_CARRE_T_W(ITMAT(JIND))
+                            KMAT_COEF(3,JIND)=ZRE_S22S11_T_W(ITMAT(JIND))
+                            KMAT_COEF(4,JIND)=ZIM_S22S11_T_W(ITMAT(JIND))
+                            KMAT_COEF(5,JIND)=ZRE_S22FMS11FT_T_W(ITMAT(JIND))
+                            KMAT_COEF(6,JIND)=ZIM_S22FT_T_W(ITMAT(JIND))
+                            KMAT_COEF(7,JIND)=ZIM_S11FT_T_W(ITMAT(JIND))
+                          ENDDO
+                          CALL  INTERPOL(ZELEV_RED,ZTC_RED,ZFW_RED,ZM_RED,KMAT_COEF,ZS11_CARRE_G,ZS22_CARRE_G,&
+                                         ZRE_S22S11_G,ZIM_S22S11_G,ZRE_S22FMS11F,ZIM_S22FT,ZIM_S11FT) 
+                        ELSE
+                          ZS11_CARRE_G=0
+                          ZS22_CARRE_G=0
+                          ZRE_S22S11_G=0
+                          ZIM_S22S11_G=0
+                          ZRE_S22FMS11F=0
+                          ZIM_S22FT=0
+                          ZIM_S11FT=0
+                        END IF                    
+                      END IF!END IF (ZFW<0.01)
+                      ZREFLOC(1)=1.E18*(XLAM_RAD(JI))**4/(XPI**5*.93)*4*XPI*ZS22_CARRE_G
+                      ZREFLOC(2)=1.E18*(XLAM_RAD(JI))**4/(XPI**5*.93)*4*XPI*ZS11_CARRE_G
+                      ZREFLOC(3)=180.E3/XPI*XLAM_RAD(JI)*ZRE_S22FMS11F
+                      ZREFL(JI,JEL,JAZ,JL,JH,JV,IVDOP)=PVDOP_RAY(JI,JEL,JAZ,JL,JH,JV)*ZREFLOC(1) &
+                                                        -ZCG*SIN(PELEV(JI,JEL,JL,JV))*ZREFLOC(1) &
+                                         *1.E18*(XLAM_RAD(JI)/XPI)**4/.93*ZCCG/4./ZLBDA**(3+ZDG)
+                      IF(LATT) THEN
+                        ZAETMP(1)=ZIM_S22FT*XLAM_RAD(JI)*2
+                        ZAETMP(2)=ZIM_S11FT*XLAM_RAD(JI)*2
+                      END IF            
+                    ELSE ! Mie (NDIFF=1)
+                      ZREFLOC(:)=0.
+                      IF(LATT) ZAETMP(:)=0.
+                      DO JJ=1,NPTS_GAULAG ! ****** Gauss-Laguerre quadrature
+                        ZD=ZX(JJ)**(1./ZALPHAG)/ZLBDA
+                        ZDE=ZDMELT_FACT**(1./3.)*ZD**(ZBG/3.)
+                        CALL BHMIE(XPI/XLAM_RAD(JI)*ZDE,ZQM,ZQEXT(1),ZQSCA,ZQBACK(1))
+                        ZQBACK(2)=ZQBACK(1)
+                        ZQEXT(2)=ZQEXT(1) ! modif Clotilde 23/04/2012
+                        ZQBACK(3)=0.
+                        ZREFLOC(1:3)=ZREFLOC(1:3)+ZQBACK(1:3)*ZX(JJ)**(ZNUG-1.+2.*ZBG/3./ZALPHAG)*ZW(JJ)
+                        ZREFLOC(4)=ZREFLOC(4)+ZQBACK(1)*ZX(JJ)**(ZNUG-1.+2.*ZBG/3./ZALPHAG+ZDG/ZALPHAG)*ZW(JJ)
+                        IF(LATT) ZAETMP(:)=ZAETMP(:)+ZQEXT(:)*ZX(JJ)**(ZNUG-1.+2.*ZBG/3./ZALPHAG)*ZW(JJ)
+                      END DO ! ****** end loop on diameter (Gauss-Laguerre)                     
+                      ZREFLOC(1:2)=ZREFLOC(1:2)*1.E18*(XLAM_RAD(JI)/XPI)**4*ZCCG                      &
+                                    *ZLBDA**(ZCXG-2.*ZBG/3.)/(4.*GAMMA(ZNUG)*.93)*ZDMELT_FACT**(2./3.)                    
+                      ZREFL(JI,JEL,JAZ,JL,JH,JV,IVDOP)=ZREFL(JI,JEL,JAZ,JL,JH,JV,IVDOP)               &
+                                    +PVDOP_RAY(JI,JEL,JAZ,JL,JH,JV)*ZREFLOC(1)                        &
+                                    -ZCG*SIN(PELEV(JI,JEL,JL,JV))*ZREFLOC(4)                          &
+                                    *1.E18*(XLAM_RAD(JI)/XPI)**4*ZCCG                                 &
+                                    *ZLBDA**(ZCXG-2.*ZBG/3.-ZDG)/(4.*GAMMA(ZNUG)*.93)*ZDMELT_FACT**(2./3.)               
+                      IF(LATT) ZAETMP(:)=ZAETMP(:)*XPI*ZCCG*ZLBDA**(ZCXG-2.*ZBG/3.)/(4.*GAMMA(ZNUG))  &
+                                    *ZDMELT_FACT**(2./3.)
+                      ZRE_S22S11_G=0
+                      ZIM_S22S11_G=0
+                      ZS22_CARRE_G=0
+                      ZS11_CARRE_G=0  !0 in case of Mie
+                    END IF !**************** end loop for each type of diffusion : IF(NDIFF==0.OR.NDIFF==3.OR.NDIFF==4)          
+                    ZREFL(JI,JEL,JAZ,JL,JH,JV,1:3)=ZREFL(JI,JEL,JAZ,JL,JH,JV,1:3)+ZREFLOC(1:3)
+                    ZREFL(JI,JEL,JAZ,JL,JH,JV,IZEG)=ZREFLOC(1) ! z_e due to graupel
+                    ZREFL(JI,JEL,JAZ,JL,JH,JV,IZDG)=ZREFLOC(2) !Zvv for ZDR due to graupel
+                    ZREFL(JI,JEL,JAZ,JL,JH,JV,IKDG)=ZREFLOC(3) !Zvv for ZDR due to graupel  
+
+                    IF (ZS22_CARRE_G*ZS11_CARRE_G .GT. 0) THEN
+                      ZREFL(JI,JEL,JAZ,JL,JH,JV,IRHG)=SQRT(ZRE_S22S11_G**2+ZIM_S22S11_G**2)/SQRT(ZS22_CARRE_G*ZS11_CARRE_G)
+                    ELSE
+                      ZREFL(JI,JEL,JAZ,JL,JH,JV,IRHG)=1
+                    END IF
+                    IF(LATT) THEN
+                      ZAELOC(JI,JEL,JAZ,JL,JH,JV,:)=ZAELOC(JI,JEL,JAZ,JL,JH,JV,:)+ZAETMP(:)
+                      ZREFL(JI,JEL,JAZ,JL,JH,JV,IAEG)=ZAETMP(1)
+                      ZREFL(JI,JEL,JAZ,JL,JH,JV,IAVG)=ZAETMP(2)
+                      IF(JL>1) THEN
+                        ZAEGINT=ZAEGINT*EXP(-2.*ZREFL(JI,JEL,JAZ,JL-1,JH,JV,IAEG)*XSTEP_RAD)
+                        ZAVGINT=ZAVGINT*EXP(-2.*ZREFL(JI,JEL,JAZ,JL-1,JH,JV,IAVG)*XSTEP_RAD)
+                      END IF
+                      ZREFL(JI,JEL,JAZ,JL,JH,JV,IZEG)=ZREFL(JI,JEL,JAZ,JL,JH,JV,IZEG)*ZAEGINT ! Z_g attenuated
+                      ZREFL(JI,JEL,JAZ,JL,JH,JV,IZDG)=ZREFL(JI,JEL,JAZ,JL,JH,JV,IZDG)*ZAVGINT ! Z_g attenuated
+                    END IF !end IF(LATT)            
+                  END IF !**************** IF(PG_RAY(JI,JEL,JAZ,JL,JH,JV) > XRTMIN(6))
+         
+                  ! Total attenuation even if no hydrometeors
+                  IF(LATT.AND.JL>1) ZREFL(JI,JEL,JAZ,JL,JH,JV,IATG)=ZREFL(JI,JEL,JAZ,JL-1,JH,JV,IATG) &
+                                                *EXP(-2.*ZREFL(JI,JEL,JAZ,JL-1,JH,JV,IAEG)*XSTEP_RAD)
+              
+                END IF ! **************** end GRAUPEL (end IF SIZE(PG_RAY,1) > 0)
+                !-----------------------------------------------------------------------------------------------
+                !-----------------------------------------------------------------------------------------------
+!**********************************
+!**********************************
+!**********************************
+!**********************************
+
+
+!---------------------------------------------------------------------------------------------------
+                !*       6. HAIL
+                !              -------
+                !
+                !
+                IF (GHAIL)  THEN
+                  ZM=PRHODREF_RAY(JI,JEL,JAZ,JL,JH,JV)*PH_RAY(JI,JEL,JAZ,JL,JH,JV) !graupel content
+                  IF(ZM > ZM_MIN) THEN
+                    YTYPE='h'
+                    ZQMI=SQRT(QEPSI(MIN(PT_RAY(JI,JEL,JAZ,JL,JH,JV),XTT),XLIGHTSPEED/XLAM_RAD(JI)))
+                    ZQMW=SQRT(QEPSW(MAX(PT_RAY(JI,JEL,JAZ,JL,JH,JV),XTT),XLIGHTSPEED/XLAM_RAD(JI)))
+                    !ini_radar.f90 : ZCXG = -0.5 XBG = 2.8 ( Xj et bj tab 2.1 p 24)
+                    !ini_rain_ice.f90 : XLBEXG = 1.0/(XCXG-XBG) XAG = 19.6 (aj tab 2.1 p 24)
+                    !XLBG   = ( XAG*XCCG*MOMG(XALPHAG,XNUG,XBG) )**(-XLBEXG) (eq 2.6 p 23)
+ZFW=0    !????????
+                    ZLBDA=ZLBH*(PRHODREF_RAY(JI,JEL,JAZ,JL,JH,JV)*PH_RAY(JI,JEL,JAZ,JL,JH,JV))**ZLBEXH
+                    !XTT : température du point triple de l'eau (273.16 K <=> 0.1 °C)
+                    IF(PT_RAY(JI,JEL,JAZ,JL,JH,JV) > XTT) THEN ! mixture of ice and water
+                      ZFRAC_ICE = .85 !(see p 68)
+                    ELSE ! only ice
+                      ZFRAC_ICE=1.
+                    END IF
+                    ! from eq 3.77 p 68
+                    !XRHOLW=1000 (initialized in ini_cst.f90)
+                    ZDMELT_FACT=6.*ZAG/(XPI*XRHOLW*((1.-ZFRAC_ICE)+ZFRAC_ICE*0.92))
+                    ZEXP=2.*ZBH
+                    !Calculation of the refractive index from Bohren and Battan (3.72 p66)
+                    ZQB=2.*ZQMW**2*(2.*ZQMI**2*LOG(ZQMI/ZQMW)/(ZQMI**2-ZQMW**2)-1.)/(ZQMI**2-ZQMW**2) !Beta (3.73 p66)
+                    ZQM=SQRT(((1.-ZFRAC_ICE)*ZQMW**2+ZFRAC_ICE*ZQB*ZQMI**2)/(1.-ZFRAC_ICE+ZFRAC_ICE*ZQB)) ! Bohren & Battan (1982) 3.72 p66
+                    ZQK=(ZQM**2-1.)/(ZQM**2+2.)                                       
+                    !Rayleigh, Rayleigh for ellipsoides or Rayleigh 6th order
+                    IF(NDIFF==0.OR.NDIFF==3.OR.NDIFF==4) THEN
+                      ZREFLOC(1:2)=ABS(ZQK)**2/.93*ZDMELT_FACT**2*1.E18*ZCCH*ZLBDA**(ZCXH-ZEXP)*MOMG(ZALPHAH,ZNUH,ZEXP)
+                      ZREFLOC(3)=0.
+                      IF(LWREFL) THEN ! weighting by reflectivities
+                        ZREFL(JI,JEL,JAZ,JL,JH,JV,IVDOP)=ZREFL(JI,JEL,JAZ,JL,JH,JV,IVDOP)&
+                              -ZCH*SIN(PELEV(JI,JEL,JL,JV))*ABS(ZQK)**2/.93*ZDMELT_FACT**2&
+                              *1.E18*ZCCH*ZLBDA**(ZCXH-ZEXP-ZDH)*MOMG(ZALPHAH,ZNUH,ZEXP+ZDH)
+                      ELSE
+                        ZREFL(JI,JEL,JAZ,JL,JH,JV,IMAX)=ZREFL(JI,JEL,JAZ,JL,JH,JV,IMAX)+ZCCH*ZLBDA**ZCXH                       
+                        ZREFL(JI,JEL,JAZ,JL,JH,JV,IVDOP)=ZREFL(JI,JEL,JAZ,JL,JH,JV,IVDOP)&
+                                                        -ZCH*SIN(PELEV(JI,JEL,JL,JV))&
+                                                        *ZCCH*ZLBDA**(ZCXH-ZDH)*MOMG(ZALPHAH,ZNUH,ZDH)
+                      END IF !end IF(LWREFL)
+                      IF(LATT) THEN
+                        IF(NDIFF==0.OR.NDIFF==3) THEN
+                          ZAETMP(:)=ZCCH*ZLBDA**ZCXH*(ZDMELT_FACT*XPI**2/XLAM_RAD(JI)*AIMAG(ZQK)   &
+                                    *MOMG(ZALPHAH,ZNUH,ZBH)/ZLBDA**ZBH)
+                        ELSE
+                          ZAETMP(:)=ZCCH*ZLBDA**ZCXH*(ZDMELT_FACT*XPI**2/XLAM_RAD(JI)*AIMAG(ZQK)   &
+                                   *MOMG(ZALPHAH,ZNUH,ZBH)/ZLBDA**ZBH&
+                                   +ZDMELT_FACT**(5./3.)*XPI**4/15./XLAM_RAD(JI)**3               &
+                                   *AIMAG(ZQK**2*(ZQM**4+27.*ZQM**2+38.)                             &
+                                   /(2.*ZQM**2+3.))*MOMG(ZALPHAH,ZNUH,5.*ZBH/3.)/ZLBDA**(5.*ZBH/3.)&
+                                   +ZDMELT_FACT**2   *2.*XPI**5/3. /XLAM_RAD(JI)**4*REAL(ZQK**2)   &
+                                   *MOMG(ZALPHAH,ZNUH,2.*ZBH)   /ZLBDA**(2.*ZBH))
+                        END IF ! end IF(NDIFF==0.OR.NDIFF==3)
+                      END IF ! end IF(LATT)
+                      ZRE_S22S11_H=0
+                      ZIM_S22S11_H=0
+                      ZS22_CARRE_H=0
+                      ZS11_CARRE_H=0                    
+                      !******************************* NDIFF==7 TmatInt ************************************ 
+                    ELSE IF(NDIFF==7) THEN
+                      ZREFLOC(:)=0
+                      IF(LATT) ZAETMP(:)=0                
+                         CALL CALC_KTMAT(PELEV(JI,JEL,JL,JV), PT_RAY(JI,JEL,JAZ,JL,JH,JV),&
+                                        ZFW,ZM,&
+                                        ZELEV_MIN(3),ZELEV_MAX(3),ZELEV_STEP(3),&
+                                        ZTC_MIN(3),ZTC_MAX(3),ZTC_STEP(3),&
+                                        ZFW_MIN(3),ZFW_MAX(3),ZFW_STEP(3),&
+                                        ZEXPM_MIN,ZEXPM_MAX,ZEXPM_STEP,&
+                                        ITMAT,ZELEV_RED,ZTC_RED,ZFW_RED,ZM_RED)
+                        IF (ITMAT(1) .NE. -NUNDEF) THEN 
+                          DO JIND=1,SIZE(KMAT_COEF,2),1
+                            KMAT_COEF(1,JIND)=ZS11_CARRE_T_H(ITMAT(JIND))
+                            KMAT_COEF(2,JIND)=ZS22_CARRE_T_H(ITMAT(JIND))
+                            KMAT_COEF(3,JIND)=ZRE_S22S11_T_H(ITMAT(JIND))
+                            KMAT_COEF(4,JIND)=ZIM_S22S11_T_H(ITMAT(JIND))
+                            KMAT_COEF(5,JIND)=ZRE_S22FMS11FT_T_H(ITMAT(JIND))
+                            KMAT_COEF(6,JIND)=ZIM_S22FT_T_H(ITMAT(JIND))
+                            KMAT_COEF(7,JIND)=ZIM_S11FT_T_H(ITMAT(JIND))
+                          ENDDO
+                         CALL  INTERPOL(ZELEV_RED,ZTC_RED,ZFW_RED,ZM_RED,KMAT_COEF,ZS11_CARRE_H,ZS22_CARRE_H,&
+                                         ZRE_S22S11_H,ZIM_S22S11_H,ZRE_S22FMS11F,ZIM_S22FT,ZIM_S11FT)
+                        ELSE
+                          ZS11_CARRE_H=0
+                          ZS22_CARRE_H=0
+                          ZRE_S22S11_H=0
+                          ZIM_S22S11_H=0
+                          ZRE_S22FMS11F=0
+                          ZIM_S22FT=0
+                          ZIM_S11FT=0
+                        END IF                    
+                      ZREFLOC(1)=1.E18*(XLAM_RAD(JI))**4/(XPI**5*.93)*4*XPI*ZS22_CARRE_H
+                      ZREFLOC(2)=1.E18*(XLAM_RAD(JI))**4/(XPI**5*.93)*4*XPI*ZS11_CARRE_H
+                      ZREFLOC(3)=180.E3/XPI*XLAM_RAD(JI)*ZRE_S22FMS11F
+                      ZREFL(JI,JEL,JAZ,JL,JH,JV,IVDOP)=PVDOP_RAY(JI,JEL,JAZ,JL,JH,JV)*ZREFLOC(1) &
+                                                        -ZCH*SIN(PELEV(JI,JEL,JL,JV))*ZREFLOC(1) &
+                                         *1.E18*(XLAM_RAD(JI)/XPI)**4/.93*ZCCH/4./ZLBDA**(3+ZDH)
+                      IF(LATT) THEN
+                        ZAETMP(1)=ZIM_S22FT*XLAM_RAD(JI)*2
+                        ZAETMP(2)=ZIM_S11FT*XLAM_RAD(JI)*2
+                      END IF            
+                    ELSE ! Mie (NDIFF=1)
+                      ZREFLOC(:)=0.
+                      IF(LATT) ZAETMP(:)=0.
+                      DO JJ=1,NPTS_GAULAG ! ****** Gauss-Laguerre quadrature
+                        ZD=ZX(JJ)**(1./ZALPHAH)/ZLBDA
+                        ZDE=ZDMELT_FACT**(1./3.)*ZD**(ZBH/3.)
+                        CALL BHMIE(XPI/XLAM_RAD(JI)*ZDE,ZQM,ZQEXT(1),ZQSCA,ZQBACK(1))
+                        ZQBACK(2)=ZQBACK(1)
+                        ZQEXT(2)=ZQEXT(1) ! modif Clotilde 23/04/2012
+                        ZQBACK(3)=0.
+                        ZREFLOC(1:3)=ZREFLOC(1:3)+ZQBACK(1:3)*ZX(JJ)**(ZNUH-1.+2.*ZBH/3./ZALPHAH)*ZW(JJ)
+                        ZREFLOC(4)=ZREFLOC(4)+ZQBACK(1)*ZX(JJ)**(ZNUH-1.+2.*ZBH/3./ZALPHAH+ZDH/ZALPHAH)*ZW(JJ)
+                        IF(LATT) ZAETMP(:)=ZAETMP(:)+ZQEXT(:)*ZX(JJ)**(ZNUH-1.+2.*ZBH/3./ZALPHAH)*ZW(JJ)
+                      END DO ! ****** end loop on diameter (Gauss-Laguerre)                     
+                      ZREFLOC(1:2)=ZREFLOC(1:2)*1.E18*(XLAM_RAD(JI)/XPI)**4*ZCCH                      &
+                                    *ZLBDA**(ZCXH-2.*ZBH/3.)/(4.*GAMMA(ZNUH)*.93)*ZDMELT_FACT**(2./3.)                    
+                      ZREFL(JI,JEL,JAZ,JL,JH,JV,IVDOP)=ZREFL(JI,JEL,JAZ,JL,JH,JV,IVDOP)               &
+                                    +PVDOP_RAY(JI,JEL,JAZ,JL,JH,JV)*ZREFLOC(1)                        &
+                                    -ZCH*SIN(PELEV(JI,JEL,JL,JV))*ZREFLOC(4)                          &
+                                    *1.E18*(XLAM_RAD(JI)/XPI)**4*ZCCH                                 &
+                                    *ZLBDA**(ZCXH-2.*ZBH/3.-ZDH)/(4.*GAMMA(ZNUH)*.93)*ZDMELT_FACT**(2./3.)               
+                      IF(LATT) ZAETMP(:)=ZAETMP(:)*XPI*ZCCH*ZLBDA**(ZCXH-2.*ZBH/3.)/(4.*GAMMA(ZNUH))  &
+                                    *ZDMELT_FACT**(2./3.)
+                      ZRE_S22S11_H=0
+                      ZIM_S22S11_H=0
+                      ZS22_CARRE_H=0
+                      ZS11_CARRE_H=0  !0 in case of Mie
+                    END IF !**************** end loop for each type of diffusion : IF(NDIFF==0.OR.NDIFF==3.OR.NDIFF==4)          
+                    ZREFL(JI,JEL,JAZ,JL,JH,JV,1:3)=ZREFL(JI,JEL,JAZ,JL,JH,JV,1:3)+ZREFLOC(1:3)
+                    ZREFL(JI,JEL,JAZ,JL,JH,JV,IZEH)=ZREFLOC(1) ! z_e due to graupel
+                    ZREFL(JI,JEL,JAZ,JL,JH,JV,IZDH)=ZREFLOC(2) !Zvv for ZDR due to graupel
+                    ZREFL(JI,JEL,JAZ,JL,JH,JV,IKDH)=ZREFLOC(3) !Zvv for ZDR due to graupel  
+
+                    IF (ZS22_CARRE_H*ZS11_CARRE_H .GT. 0) THEN
+                      ZREFL(JI,JEL,JAZ,JL,JH,JV,IRHH)=SQRT(ZRE_S22S11_H**2+ZIM_S22S11_H**2)/SQRT(ZS22_CARRE_H*ZS11_CARRE_H)
+                    ELSE
+                      ZREFL(JI,JEL,JAZ,JL,JH,JV,IRHH)=1
+                    END IF
+                    IF(LATT) THEN
+                      ZAELOC(JI,JEL,JAZ,JL,JH,JV,:)=ZAELOC(JI,JEL,JAZ,JL,JH,JV,:)+ZAETMP(:)
+                      ZREFL(JI,JEL,JAZ,JL,JH,JV,IAEH)=ZAETMP(1)
+                      ZREFL(JI,JEL,JAZ,JL,JH,JV,IAVH)=ZAETMP(2)
+                      IF(JL>1) THEN
+                        ZAEHINT=ZAEHINT*EXP(-2.*ZREFL(JI,JEL,JAZ,JL-1,JH,JV,IAEH)*XSTEP_RAD)
+                        ZAVHINT=ZAVHINT*EXP(-2.*ZREFL(JI,JEL,JAZ,JL-1,JH,JV,IAVH)*XSTEP_RAD)
+                      END IF
+                      ZREFL(JI,JEL,JAZ,JL,JH,JV,IZEH)=ZREFL(JI,JEL,JAZ,JL,JH,JV,IZEH)*ZAEHINT ! Z_g attenuated
+                      ZREFL(JI,JEL,JAZ,JL,JH,JV,IZDH)=ZREFL(JI,JEL,JAZ,JL,JH,JV,IZDH)*ZAVHINT ! Z_g attenuated
+                    END IF !end IF(LATT)            
+                  END IF !**************** IF(PH_RAY(JI,JEL,JAZ,JL,JH,JV) > XRTMIN(6))
+         
+                  ! Total attenuation even if no hydrometeors
+                  IF(LATT.AND.JL>1) ZREFL(JI,JEL,JAZ,JL,JH,JV,IATH)=ZREFL(JI,JEL,JAZ,JL-1,JH,JV,IATH) &
+                                                *EXP(-2.*ZREFL(JI,JEL,JAZ,JL-1,JH,JV,IAEH)*XSTEP_RAD)
+              
+                END IF ! **************** end HAIL (end IF SIZE(PH_RAY,1) > 0)
+                !-----------------------------------------------------------------------------------------------
+                !-----------------------------------------------------------------------------------------------
+!**********************************
+!**********************************
+!**********************************
+!**********************************
+
+                IF(LWREFL) THEN ! weighting by reflectivities
+                  ZREFL(JI,JEL,JAZ,JL,JH,JV,IVDOP)=ZREFL(JI,JEL,JAZ,JL,JH,JV,IVDOP)&
+                                   +PVDOP_RAY(JI,JEL,JAZ,JL,JH,JV)*ZREFL(JI,JEL,JAZ,JL,JH,JV,1)             
+                ELSE IF(LWBSCS) THEN ! weighting by hydrometeor concentrations
+                  ZREFL(JI,JEL,JAZ,JL,JH,JV,IVDOP)=ZREFL(JI,JEL,JAZ,JL,JH,JV,IVDOP)&
+                                   +PVDOP_RAY(JI,JEL,JAZ,JL,JH,JV)*ZREFL(JI,JEL,JAZ,JL,JH,JV,IMAX)
+                ELSE IF(ZREFL(JI,JEL,JAZ,JL,JH,JV,IMAX)/=0.) THEN ! no weighting
+                  ZREFL(JI,JEL,JAZ,JL,JH,JV,IVDOP)=ZREFL(JI,JEL,JAZ,JL,JH,JV,IVDOP)/ZREFL(JI,JEL,JAZ,JL,JH,JV,IMAX)&
+                                   +PVDOP_RAY(JI,JEL,JAZ,JL,JH,JV)
+                END IF
+                !Calculation of  Phidp  (ZREFL(JI,JEL,JAZ,JL,JH,JV,IPDP) is initialized to 0 before the loop
+                IF (JL>1) ZREFL(JI,JEL,JAZ,JL,JH,JV,IPDP)=ZREFL(JI,JEL,JAZ,JL-1,JH,JV,IPDP)+ &
+                                   2.*ZREFL(JI,JEL,JAZ,JL-1,JH,JV,3)*XSTEP_RAD*1D-3
+
+                !Calculation of RhoHV and DeltaHV
+                ZRE_S22S11_T=ZRE_S22S11_R+ZRE_S22S11_I+ZRE_S22S11_S+ZRE_S22S11_G+ZRE_S22S11_H
+                ZIM_S22S11_T=ZIM_S22S11_R+ZIM_S22S11_I+ZIM_S22S11_S+ZIM_S22S11_G+ZIM_S22S11_H
+                ZS22_CARRE_T=ZS22_CARRE_R+ZS22_CARRE_I+ZS22_CARRE_S+ZS22_CARRE_G+ZS22_CARRE_H
+                ZS11_CARRE_T=ZS11_CARRE_R+ZS11_CARRE_I+ZS11_CARRE_S+ZS11_CARRE_G+ZS11_CARRE_H
+                !RhoHV 
+                IF ((ZS22_CARRE_T*ZS11_CARRE_T)>0.) THEN
+                  ZREFL(JI,JEL,JAZ,JL,JH,JV,IRHV)=SQRT(ZRE_S22S11_T**2+ZIM_S22S11_T**2)/SQRT(ZS22_CARRE_T*ZS11_CARRE_T)   
+                ELSE
+                  ZREFL(JI,JEL,JAZ,JL,JH,JV,IRHV)=-XUNDEF
+                END IF 
+                !DeltaHV
+                IF (ZRE_S22S11_T/=0) THEN
+                  ZREFL(JI,JEL,JAZ,JL,JH,JV,IDHV)=180/XPI*ATAN(ZIM_S22S11_T/ZRE_S22S11_T)
+                ELSE
+                  ZREFL(JI,JEL,JAZ,JL,JH,JV,IDHV)=0
+                END IF
+              ELSE !if temperature is not defined
+                ZREFL(JI,JEL,JAZ,JL,JH,JV,1:2)=XVALGROUND
+                ZREFL(JI,JEL,JAZ,JL,JH,JV,IVDOP)=XVALGROUND
+                LPART_MASK=.TRUE.
+              END IF !end condition : IF(PT_RAY(JI,JEL,JAZ,JL,JH,JV) /= -XUNDEF) => if temperature is defined
+            END IF !end condition : IF(LPART_MASK) => if pixel is not masked
+          END DO LOOPJL
+        END DO !JV
+      END DO !JH
+    END DO !JAZ
+  END DO !JEL   
+  !
+  IF (NDIFF == 7 ) THEN
+    !lookup tables for rain
+    DEALLOCATE (ZTC_T_R,ZELEV_T_R,ZM_T_R,ZS11_CARRE_T_R,ZS22_CARRE_T_R,&
+    ZRE_S22S11_T_R,ZIM_S22S11_T_R,ZRE_S22FMS11FT_T_R,ZIM_S22FT_T_R,ZIM_S11FT_T_R)
+    !lookup tables for snow
+    DEALLOCATE (ZTC_T_S,ZELEV_T_S,ZM_T_S,ZS11_CARRE_T_S,ZS22_CARRE_T_S,&
+    ZRE_S22S11_T_S,ZIM_S22S11_T_S,ZRE_S22FMS11FT_T_S,ZIM_S22FT_T_S,ZIM_S11FT_T_S)
+    !lookup tables for graupel
+    DEALLOCATE (ZTC_T_G,ZELEV_T_G,ZM_T_G,ZS11_CARRE_T_G,ZS22_CARRE_T_G,&
+    ZRE_S22S11_T_G,ZIM_S22S11_T_G,ZRE_S22FMS11FT_T_G,ZIM_S22FT_T_G,ZIM_S11FT_T_G)
+    !lookup tables for wet graupel
+    DEALLOCATE (ZTC_T_W,ZELEV_T_W,ZM_T_W,ZS11_CARRE_T_W,ZS22_CARRE_T_W,&
+    ZRE_S22S11_T_W,ZIM_S22S11_T_W,ZRE_S22FMS11FT_T_W,ZIM_S22FT_T_W,ZIM_S11FT_T_W)   
+    IF (GHAIL) THEN
+      !lookup tables for hail
+      DEALLOCATE (ZTC_T_H,ZELEV_T_H,ZM_T_H,ZS11_CARRE_T_H,ZS22_CARRE_T_H,&
+      ZRE_S22S11_T_H,ZIM_S22S11_T_H,ZRE_S22FMS11FT_T_H,ZIM_S22FT_T_H,ZIM_S11FT_T_H)  
+    ENDIF
+  ENDIF
+END DO !JI
+!
+! attenuation in dB/km
+IF(LATT) ZREFL(:,:,:,:,:,:,IAER:IAEH)=4343.*2.*ZREFL(:,:,:,:,:,:,IAER:IAEH) ! horizontal specific attenuation
+IF(LATT) ZREFL(:,:,:,:,:,:,IAVR:IAVH)=4343.*2.*ZREFL(:,:,:,:,:,:,IAVR:IAVH) ! vertical specific attenuation
+! convective/stratiform
+ZREFL(:,:,:,:,:,:,4)=PBU_MASK_RAY(:,:,:,:,:,:) ! CSR
+! /convective/stratiform
+
+WRITE(ILUOUT0,*) 'NB ZREFL  MIN MAX :', MINVAL(ZREFL(:,:,:,:,:,:,:)),MAXVAL(ZREFL(:,:,:,:,:,:,:))
+WRITE(ILUOUT0,*) 'NB ZREFL VALGROUND :', COUNT(ZREFL(:,:,:,:,:,:,:) ==XVALGROUND)
+WRITE(ILUOUT0,*) 'NB ZREFL -XUNDEF :', COUNT(ZREFL(:,:,:,:,:,:,:) ==-XUNDEF)
+WRITE(ILUOUT0,*) 'NB ZREFL > 0 :', COUNT(ZREFL(:,:,:,:,:,:,:)>0.)
+WRITE(ILUOUT0,*) 'NB ZREFL = 0 :', COUNT(ZREFL(:,:,:,:,:,:,:)==0.)
+WRITE(ILUOUT0,*) 'NB ZREFL < 0 :', COUNT(ZREFL(:,:,:,:,:,:,:) < 0.)-COUNT( ZREFL(:,:,:,:,:,:,:)==XVALGROUND)
+!---------------------------------------------------------------------------------------------------
+!*       6.    FINAL STEP : TOTAL ATTENUATION AND EQUIVALENT REFLECTIVITY FACTOR
+!              ---------------------------------------------------------------
+!
+ALLOCATE(ZVTEMP(IMAX))
+DO JI=1,INBRAD  
+  IEL=NBELEV(JI)
+  DO JEL=1,IEL  
+    DO JAZ=1,INBAZIM 
+      IF (LATT) ZAETOT(:,:,1:2)=1.
+      PZE(JI,JEL,JAZ,1,IPDP)=0
+      DO JL=1,INBSTEPMAX
+        ! if no undef point in gate JL and at least one point where T is defined
+        IF(COUNT(ZREFL(JI,JEL,JAZ,JL,:,:,1)==-XUNDEF)==0.AND. &
+           COUNT(ZREFL(JI,JEL,JAZ,JL,:,:,1)==XVALGROUND)==0.AND. &
+           COUNT(PT_RAY(JI,JEL,JAZ,JL,:,:)/=-XUNDEF)/=0) THEN 
+          DO JH=1,INPTS_H
+            ZVTEMP(:)=0.
+            DO JV=1,INPTS_V  ! Loop on Jv
+              !if range is over 1, attenuation is added 
+              IF (JL > 1) THEN      
+                IF(LATT) THEN ! we use ZALPHAE0=alpha_0 from last gate
+                  !Total attenuation
+                  ZAETOT(JH,JV,1:2)=ZAETOT(JH,JV,1:2)*EXP(-2.*ZAELOC(JI,JEL,JAZ,JL-1,JH,JV,:)*XSTEP_RAD)
+                  !Zhh, Zvv
+                  ZREFL(JI,JEL,JAZ,JL,JH,JV,1:2)=ZREFL(JI,JEL,JAZ,JL,JH,JV,1:2)*ZAETOT(JH,JV,1:2)!attenuated reflectivity
+                  !Z for Radial velocity                         
+                  IF(LWREFL) ZREFL(JI,JEL,JAZ,JL,JH,JV,IVDOP)=ZREFL(JI,JEL,JAZ,JL,JH,JV,IVDOP)*ZAETOT(JH,JV,1)
+                END IF !end IF(LATT)
+              END IF !end IF (JL > 1)
+              IF(.NOT.(LWREFL.AND.LWBSCS)) THEN
+                ZREFL(JI,JEL,JAZ,JL,JH,JV,IVDOP)=PVDOP_RAY(JI,JEL,JAZ,JL,JH,JV)
+              END IF
+              ! Quadrature on vertical reflectivities +VDOP
+              IF(LQUAD) THEN
+                ZVTEMP(:)=ZVTEMP(:)+ZREFL(JI,JEL,JAZ,JL,JH,JV,:)*PW_V(ABS((2*JV-INPTS_V-1)/2)+1) &
+                          *EXP(-2.*LOG(2.)*PX_V(ABS((2*JV-INPTS_V-1)/2)+1)**2)
+              ELSE
+                ZVTEMP(:)=ZVTEMP(:)+ZREFL(JI,JEL,JAZ,JL,JH,JV,:)*PW_V(ABS((2*JV-INPTS_V-1)/2)+1)
+              END IF
+            END DO ! End loop on JV                  		
+!
+            IF(LQUAD) THEN
+              PZE(JI,JEL,JAZ,JL,:)=PZE(JI,JEL,JAZ,JL,:)+ZVTEMP(1:SIZE(PZE,5))*PW_H(ABS((2*JH-INPTS_H-1)/2)+1) &
+                                   *EXP(-2.*LOG(2.)*PX_H(ABS((2*JH-INPTS_H-1)/2)+1)**2)
+              IF(LWBSCS) ZCONC_BIN(JI,JEL,JAZ,JL)=ZCONC_BIN(JI,JEL,JAZ,JL)+ZVTEMP(IMAX)* &
+              PW_H(ABS((2*JH-INPTS_H-1)/2)+1)*EXP(-2.*LOG(2.)*PX_H(ABS((2*JH-INPTS_H-1)/2)+1)**2)
+            ELSE
+              PZE(JI,JEL,JAZ,JL,:)=PZE(JI,JEL,JAZ,JL,:)+ZVTEMP(1:SIZE(PZE,5))*PW_H(ABS((2*JH-INPTS_H-1)/2)+1)
+              IF(LWBSCS) ZCONC_BIN(JI,JEL,JAZ,JL)=ZCONC_BIN(JI,JEL,JAZ,JL)+ZVTEMP(IMAX)* &
+                                                   PW_H(ABS((2*JH-INPTS_H-1)/2)+1)
+            END IF !end IF(LQUAD)
+          END DO ! End loop on JH 
+
+          IF(LQUAD) THEN
+            PZE(JI,JEL,JAZ,JL,:)=PZE(JI,JEL,JAZ,JL,:)*2.*LOG(2.)/XPI
+            IF(LWBSCS) ZCONC_BIN(JI,JEL,JAZ,JL)=ZCONC_BIN(JI,JEL,JAZ,JL)*2.*LOG(2.)/XPI
+          ELSE
+            PZE(JI,JEL,JAZ,JL,:)=PZE(JI,JEL,JAZ,JL,:)/XPI
+            IF(LWBSCS) ZCONC_BIN(JI,JEL,JAZ,JL)=ZCONC_BIN(JI,JEL,JAZ,JL)/XPI
+          END IF !end IF(LQUAD)
+! 
+          !**** Thresholding: with ZSNR, or with XREFLVDOPMIN and XREFLMIN
+          ZSNR=-XUNDEF
+          ZSNR_R=-XUNDEF
+          ZSNR_I=-XUNDEF
+          ZSNR_S=-XUNDEF
+          ZSNR_G=-XUNDEF
+          ZSNR_H=-XUNDEF
+          ZZHH=PZE(JI,JEL,JAZ,JL,1)
+          ZZE_R=PZE(JI,JEL,JAZ,JL,IZER)
+          ZZE_I=PZE(JI,JEL,JAZ,JL,IZEI)
+          ZZE_S=PZE(JI,JEL,JAZ,JL,IZES)
+          ZZE_G=PZE(JI,JEL,JAZ,JL,IZEG)
+          IF (GHAIL) ZZE_H=PZE(JI,JEL,JAZ,JL,IZEH)
+          ZDISTRAD=JL*XSTEP_RAD !radar distance in meters
+          IF (LSNRT) THEN 
+            IF (ZZHH/=XVALGROUND .AND. ZZHH/=-XUNDEF.AND.ZZHH/=0) THEN
+              ZSNR=10*LOG10(ZZHH)-20*LOG10(ZDISTRAD/(100*10**3))
+            END IF
+            IF (ZZE_R/=XVALGROUND .AND. ZZE_R/=-XUNDEF.AND.ZZE_R/=0) THEN
+              ZSNR_R=10*LOG10(ZZE_R)-20*LOG10(ZDISTRAD/(100*10**3))
+            END IF
+            IF (ZZE_I/=XVALGROUND .AND. ZZE_I/=-XUNDEF.AND.ZZE_I/=0) THEN
+              ZSNR_I=10*LOG10(ZZE_I)-20*LOG10(ZDISTRAD/(100*10**3))
+            END IF
+            IF (ZZE_S/=XVALGROUND .AND. ZZE_S/=-XUNDEF.AND.ZZE_S/=0) THEN
+              ZSNR_S=10*LOG10(ZZE_S)-20*LOG10(ZDISTRAD/(100*10**3))
+            END IF
+            IF (ZZE_G/=XVALGROUND .AND. ZZE_G/=-XUNDEF.AND.ZZE_G/=0) THEN
+              ZSNR_G=10*LOG10(ZZE_G)-20*LOG10(ZDISTRAD/(100*10**3))
+            END IF
+            IF (GHAIL) THEN
+              IF (ZZE_H/=XVALGROUND .AND. ZZE_H/=-XUNDEF.AND.ZZE_H/=0) THEN
+                ZSNR_H=10*LOG10(ZZE_H)-20*LOG10(ZDISTRAD/(100*10**3))
+              END IF
+            END IF
+            GTHRESHOLD_V=(ZSNR>=XSNRMIN)
+            GTHRESHOLD_Z=GTHRESHOLD_V
+            GTHRESHOLD_ZR=(ZSNR_R>=XSNRMIN)
+            GTHRESHOLD_ZI=(ZSNR_I>=XSNRMIN)
+            GTHRESHOLD_ZS=(ZSNR_S>=XSNRMIN)
+            GTHRESHOLD_ZG=(ZSNR_G>=XSNRMIN)
+            IF (GHAIL) GTHRESHOLD_ZH=(ZSNR_H>=XSNRMIN)
+          ELSE
+            GTHRESHOLD_V=(ZZHH>=10**(XREFLVDOPMIN/10.))
+            GTHRESHOLD_Z=(ZZHH>=10**(XREFLMIN/10.))
+            GTHRESHOLD_ZR=(ZZE_R>=10**(XREFLMIN/10.))
+            GTHRESHOLD_ZI=(ZZE_I>=10**(XREFLMIN/10.))
+            GTHRESHOLD_ZS=(ZZE_S>=10**(XREFLMIN/10.))
+            GTHRESHOLD_ZG=(ZZE_G>=10**(XREFLMIN/10.))
+            IF (GHAIL) GTHRESHOLD_ZH=(ZZE_H>=10**(XREFLMIN/10.))
+          END IF          
+          !--- Doppler velocities 
+          IF(GTHRESHOLD_V) THEN      
+            IF(LWREFL) THEN
+              !change Clotilde 27/04/2012 to avoid division by zero and floating point exception
+              IF (PZE(JI,JEL,JAZ,JL,1)/=0) THEN
+                PZE(JI,JEL,JAZ,JL,IVDOP)=PZE(JI,JEL,JAZ,JL,IVDOP)/PZE(JI,JEL,JAZ,JL,1) 
+              END IF
+            ELSE IF(LWBSCS) THEN
+              IF(ZCONC_BIN(JI,JEL,JAZ,JL)>0.) THEN
+                PZE(JI,JEL,JAZ,JL,IVDOP)=PZE(JI,JEL,JAZ,JL,IVDOP)/ZCONC_BIN(JI,JEL,JAZ,JL)
+              ELSE
+                PZE(JI,JEL,JAZ,JL,IVDOP)=-XUNDEF
+              END IF !end IF(ZCONC_BIN(JI,JEL,JAZ,JL)>0.)
+            END IF !end IF(LWREFL)
+          ELSE
+            PZE(JI,JEL,JAZ,JL,IVDOP)=-XUNDEF        
+          END IF !end IF(GTHRESHOLD_V)   
+      
+          !--- Zhh, Zvv et variables globales
+          IF(GTHRESHOLD_Z .EQV. .FALSE.) THEN
+            PZE(JI,JEL,JAZ,JL,1:4)=-XUNDEF
+            PZE(JI,JEL,JAZ,JL,IRHV:IDHV)=-XUNDEF
+          END IF
+          !--- ZER, ZDA, KDR, RHR
+          IF(GTHRESHOLD_ZR .EQV. .FALSE.) THEN
+            PZE(JI,JEL,JAZ,JL,IZER)=-XUNDEF
+            PZE(JI,JEL,JAZ,JL,IZDA)=-XUNDEF
+            PZE(JI,JEL,JAZ,JL,IKDR)=-XUNDEF
+            PZE(JI,JEL,JAZ,JL,IRHR)=-XUNDEF
+          END IF
+          !--- ZES, ZDS, KDS, RHS
+          IF(GTHRESHOLD_ZS .EQV. .FALSE.) THEN
+            PZE(JI,JEL,JAZ,JL,IZES)=-XUNDEF
+            PZE(JI,JEL,JAZ,JL,IZDS)=-XUNDEF
+            PZE(JI,JEL,JAZ,JL,IKDS)=-XUNDEF
+            PZE(JI,JEL,JAZ,JL,IRHS)=-XUNDEF
+          END IF
+
+          !--- ZEG, ZDG, KDG, RHG
+          IF(GTHRESHOLD_ZG .EQV. .FALSE.) THEN
+            PZE(JI,JEL,JAZ,JL,IZEG)=-XUNDEF
+            PZE(JI,JEL,JAZ,JL,IZDG)=-XUNDEF
+            PZE(JI,JEL,JAZ,JL,IKDG)=-XUNDEF
+            PZE(JI,JEL,JAZ,JL,IRHG)=-XUNDEF
+          END IF
+          !--- ZEH, ZDH, KDH, RHH
+          IF (GHAIL) THEN
+            IF(GTHRESHOLD_ZH .EQV. .FALSE.) THEN
+              PZE(JI,JEL,JAZ,JL,IZEH)=-XUNDEF
+              PZE(JI,JEL,JAZ,JL,IZDH)=-XUNDEF
+              PZE(JI,JEL,JAZ,JL,IKDH)=-XUNDEF
+              PZE(JI,JEL,JAZ,JL,IRHH)=-XUNDEF
+            END IF
+          END IF
+          !--- ZEI
+          IF(GTHRESHOLD_ZI .EQV. .FALSE.) THEN
+            PZE(JI,JEL,JAZ,JL,IZEI)=-XUNDEF
+          END IF     
+        ELSE 
+          ! ground clutter or outside Meso-NH domain 
+          !(IF T not defined or if one undef point at least in gate)
+          PZE(JI,JEL,JAZ,JL,:)=XVALGROUND
+        END IF 
+        IF(PZE(JI,JEL,JAZ,JL,1) < 0. .AND. PZE(JI,JEL,JAZ,JL,1)/=-XUNDEF) THEN  ! flag bin when underground => xvalground si < 0?                 
+          PZE(JI,JEL,JAZ,JL,:)=XVALGROUND
+        END IF ! end IF(PZE(JI,JEL,JAZ,JL,1) < 0.)
+      END DO ! end DO JL=1,INBSTEPMAX
+    END DO !end DO JAZ=1,INBAZIM
+  END DO !end DO JEL=1,IEL
+END DO !end DO JI=1,INBRAD
+DEALLOCATE(ZREFL,ZVTEMP,ZRTMIN)
+WRITE(ILUOUT0,*) '*****************FIN RADAR_SCATTERING ***********************' 
+WRITE(ILUOUT0,*) 'NB PZE MIN MAX :', MINVAL(PZE(:,:,:,:,IZEI)),MAXVAL(PZE(:,:,:,:,IZEI))
+WRITE(ILUOUT0,*) 'NB PZE VALGROUND :', COUNT(PZE(:,:,:,:,IZEI) ==XVALGROUND)
+WRITE(ILUOUT0,*) 'NB PZE -XUNDEF :', COUNT(PZE(:,:,:,:,IZEI) ==-XUNDEF)
+WRITE(ILUOUT0,*) 'NB PZE > 0 :', COUNT(PZE(:,:,:,:,IZEI)>0.)
+WRITE(ILUOUT0,*) 'NB PZE = 0 :', COUNT(PZE(:,:,:,:,IZEI)==0.)
+WRITE(ILUOUT0,*) 'NB PZE < 0 :', COUNT(PZE(:,:,:,:,IZEI) < 0.)-COUNT(PZE(:,:,:,:,IZEI) ==XVALGROUND)
+IF(NDIFF/=0) DEALLOCATE(ZX,ZW)
+IF (LATT) DEALLOCATE(ZAELOC,ZAETOT)
+WRITE(ILUOUT0,*) 'END OF RADAR SCATTERING'
+END SUBROUTINE RADAR_SCATTERING
+
diff --git a/src/PHYEX/ext/radiations.f90 b/src/PHYEX/ext/radiations.f90
new file mode 100644
index 0000000000000000000000000000000000000000..f4db08bfc04972b30b309785a0a7e1a05b2bcd1c
--- /dev/null
+++ b/src/PHYEX/ext/radiations.f90
@@ -0,0 +1,3504 @@
+!MNH_LIC Copyright 1995-2022 CNRS, Meteo-France and Universite Paul Sabatier
+!MNH_LIC This is part of the Meso-NH software governed by the CeCILL-C licence
+!MNH_LIC version 1. See LICENSE, CeCILL-C_V1-en.txt and CeCILL-C_V1-fr.txt
+!MNH_LIC for details. version 1.
+!-----------------------------------------------------------------
+!    ########################
+     MODULE MODI_RADIATIONS   
+!    ########################
+!
+CONTAINS
+!
+!   ############################################################################
+    SUBROUTINE RADIATIONS (TPFILE,OCLEAR_SKY,OCLOUD_ONLY,                      &
+               KCLEARCOL_TM1,HEFRADL,HEFRADI,HOPWSW,HOPISW,HOPWLW,HOPILW,      &
+               PFUDG, KDLON, KFLEV, KRAD_DIAG, KFLUX, KRAD, KAER, KSWB_OLD,    &
+               KSWB_MNH,KLWB_MNH, KSTATM,KRAD_COLNBR,PCOSZEN,PSEA, PCORSOL,    &
+               PDIR_ALB, PSCA_ALB,PEMIS, PCLDFR, PCCO2, PTSRAD, PSTATM,        &
+               PTHT, PRT, PPABST, POZON, PAER, PDST_WL, PAER_CLIM, PSVT,       &
+               PDTHRAD, PSRFLWD, PSRFSWD_DIR,PSRFSWD_DIF, PRHODREF, PZZ,       &
+               PRADEFF, PSWU, PSWD, PLWU,PLWD, PDTHRADSW, PDTHRADLW            )
+!   ############################################################################
+!
+!!****  *RADIATIONS * - routine to call the SW and LW radiation calculations
+!!
+!!    PURPOSE
+!!    -------
+!!      The purpose of this routine is to prepare the temperature, water vapor
+!!    liquid water, cloud fraction, ozone profiles for the ECMWF radiation
+!!    calculations. There is a great number of available radiative fluxes in
+!!    the output, but only the potential temperature radiative tendency and the
+!!    SW and LW surface fluxes are provided in the output of the routine.
+!!    Two simplified computations are available (switches OCLEAR_SKY and
+!!    OCLOUD_ONLY). When OCLOUD_ONLY is .TRUE. the computations are performed
+!!    for the cloudy columns only. Furthermore with OCLEAR_SKY being .TRUE.
+!!    the clear sky columns are averaged and the computations are made for
+!!    the cloudy columns plus a single ensemble-mean clear sky column.
+!!
+!!**  METHOD
+!!    ------
+!!      First the temperature, water vapor, liquid water, cloud fraction
+!!    and  profile arrays are built using the current model fields and
+!!    the standard atmosphere for the upper layer filling.
+!!    The standard atmosphere is used between the levels IKUP and
+!!    KFLEV where KFLEV is the number of vertical levels for the radiation 
+!!    computations.    
+!!    The aerosols optical thickness and the ozone fields come directly
+!!    from ini_radiation step (climatlogies used) and are already defined for KFLEV. 
+!!    Surface parameter ( albedo, emiss ) are also defined from current surface fields.
+!!    In the case of clear-sky or cloud-only approximations, the cloudy
+!!    columns are selected by testing the vertically integrated cloud fraction
+!!    and the radiation computations are performed for these columns plus the
+!!    mean clear-sky one. In addition, columns where cloud have disapeared are determined
+!!    by saving cloud trace between radiation step and they are also recalculated
+!!    in cloud only step. In all case, the sun position correponds to  the centered
+!!    time between 2 full radiation steps (determined in physparam).
+!!      Then the ECMWF radiation package is called and the radiative
+!!    heating/cooling tendancies are reformatted in case of partial
+!!    computations.  In case of "cloud-only approximation" the only cloudy
+!!    column radiative fields are updated.
+!!
+!!    EXTERNAL
+!!    --------
+!!      Subroutine ECMWF_RADIATION_VERS2 : ECMWF interface calling radiation routines
+!!
+!!    IMPLICIT ARGUMENTS
+!!    ------------------
+!!      Module MODD_CST  : constants
+!!        XP00 : reference pressure
+!!        XCPD : calorific capacity of dry air at constant pressure
+!!        XRD  : gas constant for dry air
+!!      Module MODD_PARAMETERS : parameters
+!!        JPHEXT : Extra columns on the horizontal boundaries
+!!        JPVEXT : Extra levels on the vertical boundaries
+!!
+!!    REFERENCE
+!!    ---------
+!!      Book2 of documentation ( routine RADIATIONS )
+!!
+!!    AUTHOR
+!!    ------
+!!	J.-P. Pinty      * Laboratoire d'Aerologie*
+!!
+!!    MODIFICATIONS
+!!    -------------
+!!      Original    26/02/95 
+!!      J.Stein     20/12/95 add the array splitting in order to save memory
+!!      J.-P. Pinty 19/11/96 change the split arrays, specific humidity
+!!                           and add the ice phase
+!!      J.Stein     22/06/97 use of the absolute pressure
+!!      P.Jabouille 31/07/97 impose a zero humidity for dry simulation
+!!      V.Masson    22/09/97 case of clear-sky approx. with no clear-sky column
+!!      V.Masson    07/11/97 half level pressure defined from averaged Exner
+!!                           function
+!!      V.Masson    07/11/97 modification of junction between standard atm
+!!                           and model for half level variables (top model
+!!                           pressure and temperatures are used preferentially
+!!                           to atm standard profile for the first point).
+!!      P.Jabouille 24/08/98 impose positivity for ZQLAVE
+!!      J.-P. Pinty 29/01/98 add storage for diagnostics
+!!      J. Stein    18/07/99 add the ORAD_DIAG switch and keep inside the
+!!                           subroutine the partial tendencies 
+!!
+!!      F.Solmon    04/03/01  MAJOR MODIFICATIONS, updated version of ECMWF radiation scheme
+!!      P.Jabouille 05/05/03 bug in humidity conversion
+!!      Y.Seity     25/08/03  KSWB=6 for SW direct and scattered surface 
+!!                            downward fluxes used in surface scheme. 
+!!      P. Tulet    01/20/05  climatologic SSA
+!!      A. Grini    05/20/05  dust direct effect (optical properties)
+!!      V.Masson, C.Lac 08/10 Correction of inversion of Diffuse and direct albedo
+!!      B.Aouizerats 2010     Explicit aerosol optical properties
+!!      C.Lac       11/2015   Correction on aerosols
+!!      B.Vie            /13  LIMA
+!!      J.Escobar 30/03/2017  : Management of compilation of ECMWF_RAD in REAL*8 with MNH_REAL=R4
+!!      J.Escobar 29/06/2017  : Check if Pressure Decreasing with height <-> elsif PB & STOP 
+!!      Q.LIBOIS  06/2017     : correction on CLOUD_ONLY
+!!      Q.Libois  02/2018     : ECRAD
+!!      Philippe Wautelet: 05/2016-04/2018: new data structures and calls for I/O
+!!      J.Escobar 28/06/2018 : Reproductible parallelisation of CLOUD_ONLY case
+!!      J.Escobar 20/07/2018 : for real*4 compilation, convert with REAL(X) argument to SUM_DD... 
+!!      P.Wautelet 22/01/2019: use standard FLUSH statement instead of non standard intrinsics
+!!      Bielli S. 02/2019  Sea salt : significant sea wave height influences salt emission; 5 salt modes
+!  P. Wautelet 10/04/2019: replace ABORT and STOP calls by Print_msg
+!  P. Wautelet 26/04/2019: replace non-standard FLOAT function by REAL function
+!  P. Wautelet 06/09/2022: small fix: GSURF_CLOUD was not set outside of physical domain
+!-------------------------------------------------------------------------------
+!
+!*       0.    DECLARATIONS
+!              ------------
+!
+USE PARKIND1,         ONLY: JPRB
+USE OYOESW    , ONLY : RTAUA    ,RPIZA    ,RCGA
+!
+USE MODD_CH_AEROSOL,  ONLY: LORILAM
+USE MODD_CONF,        ONLY: LCARTESIAN
+USE MODD_CST
+USE MODD_DUST,        ONLY: LDUST
+use modd_field,          only: tfieldmetadata, TYPEREAL
+USE MODD_GRID ,       ONLY: XLAT0, XLON0
+USE MODD_GRID_n ,     ONLY: XLAT, XLON
+USE MODD_IO,          ONLY: TFILEDATA
+USE MODD_LUNIT_n,     ONLY: TLUOUT
+USE MODD_NSV,         ONLY: NSV_C2R2,NSV_C2R2BEG,NSV_C2R2END,     &
+                            NSV_C1R3,NSV_C1R3BEG,NSV_C1R3END,     &
+                            NSV_DSTBEG, NSV_DSTEND,               &
+                            NSV_AERBEG, NSV_AEREND,               &
+                            NSV_SLTBEG, NSV_SLTEND,               &
+                            NSV_LIMA,NSV_LIMA_BEG,NSV_LIMA_END,   &
+                            NSV_LIMA_NC, NSV_LIMA_NR, NSV_LIMA_NI
+USE MODD_PARAMETERS
+USE MODD_PARAM_LIMA
+USE MODD_PARAM_n,     ONLY: CCLOUD, CRAD
+USE MODD_PARAM_RAD_n, ONLY: CAOP
+USE MODD_RAIN_ICE_DESCR_n
+USE MODD_SALT,        ONLY: LSALT
+USE MODD_TIME
+!
+USE MODE_DUSTOPT
+USE MODE_IO_FIELD_WRITE, only: IO_Field_write
+USE MODE_ll
+use mode_msg
+USE MODE_REPRO_SUM,      ONLY : SUM_DD_R2_R1_ll,SUM_DD_R1_ll
+!
+#ifdef MNH_PGI
+USE MODE_PACK_PGI
+#endif
+USE MODE_SALTOPT
+USE MODE_SUM_ll,          ONLY: MIN_ll
+USE MODE_SUM2_ll,         ONLY: GMINLOC_ll
+USE MODE_THERMO
+!
+USE MODI_AEROOPT_GET
+USE MODI_ECMWF_RADIATION_VERS2
+USE MODI_ECRAD_INTERFACE
+USE MODD_VAR_ll,      ONLY: IP
+!  
+IMPLICIT NONE
+!
+!*       0.1   DECLARATIONS OF DUMMY ARGUMENTS :
+!
+TYPE(TFILEDATA),  INTENT(IN)         :: TPFILE    ! Output file
+LOGICAL, INTENT(IN)                  :: OCLOUD_ONLY! flag for the cloud column
+                                                   !    computations only
+LOGICAL, INTENT(IN)                  :: OCLEAR_SKY ! 
+INTEGER, INTENT(IN)                  :: KDLON   ! number of columns where the
+                                                ! radiation calculations are
+                                                !       performed
+INTEGER, INTENT(IN)                  :: KFLEV   ! number of vertical levels
+                                                !    where the radiation
+                                                ! calculations are performed
+INTEGER, INTENT(IN)                  :: KRAD_DIAG  ! index for the number of
+                                                   !  fields in the output
+INTEGER, INTENT(IN)                  :: KFLUX   ! number of top and ground 
+                                                ! fluxes for the ZFLUX array
+INTEGER, INTENT(IN)                  :: KRAD    ! number of satellite radiances
+                                                ! for the ZRAD and ZRADCS arrays
+INTEGER, INTENT(IN)                  :: KAER    ! number of AERosol classes
+
+INTEGER, INTENT(IN)                  :: KSWB_OLD    ! number of SW band ECMWF 
+INTEGER, INTENT(IN)                  :: KSWB_MNH    ! number of SW band ECRAD
+INTEGER, INTENT(IN)                  :: KLWB_MNH    ! number of LW band ECRAD
+INTEGER, INTENT(IN)                  :: KSTATM  ! index of the standard 
+                                                ! atmosphere level just above
+                                                !      the model top
+INTEGER, INTENT(IN)                  :: KRAD_COLNBR ! factor by which the memory
+                                                    ! is split
+                                                    !
+                                               !Choice of :             
+CHARACTER (LEN=*), INTENT (IN)       :: HEFRADL ! 
+CHARACTER (LEN=*), INTENT (IN)       :: HEFRADI ! 
+CHARACTER (LEN=*), INTENT (IN)       :: HOPWSW !cloud water SW optical properties   
+CHARACTER (LEN=*), INTENT (IN)       :: HOPISW !ice water SW optical properties 
+CHARACTER (LEN=*), INTENT (IN)       :: HOPWLW !cloud water LW optical properties
+CHARACTER (LEN=*), INTENT (IN)       :: HOPILW !ice water  LW optical properties
+REAL,               INTENT(IN)       :: PFUDG  ! subgrid cloud inhomogenity factor
+REAL, DIMENSION(:,:),     INTENT(IN) :: PCOSZEN ! COS(zenithal solar angle)
+REAL,                     INTENT(IN) :: PCORSOL ! SOLar constant CORrection
+REAL, DIMENSION(:,:),     INTENT(IN) :: PSEA    ! Land-sea mask
+!
+REAL, DIMENSION(:,:,:),   INTENT(IN) :: PDIR_ALB! Surface direct ALBedo
+REAL, DIMENSION(:,:,:),   INTENT(IN) :: PSCA_ALB! Surface diffuse ALBedo
+REAL, DIMENSION(:,:,:),   INTENT(IN) :: PEMIS   ! Surface IR EMISsivity
+REAL, DIMENSION(:,:,:),   INTENT(IN) :: PCLDFR  ! CLouD FRaction
+REAL,                     INTENT(IN) :: PCCO2   ! CO2 content
+REAL, DIMENSION(:,:),     INTENT(IN) :: PTSRAD  ! RADiative Surface Temperature
+REAL, DIMENSION(:,:),     INTENT(IN) :: PSTATM  ! selected standard atmosphere
+!
+REAL, DIMENSION(:,:,:),   INTENT(IN) :: PTHT    ! THeta at t
+REAL, DIMENSION(:,:,:,:), INTENT(IN) :: PRT     ! moist variables at t (humidity, cloud water, rain water, ice water)
+REAL, DIMENSION(:,:,:),   INTENT(IN) :: PPABST  ! pressure at t
+REAL, DIMENSION(:,:,:,:), INTENT(IN) :: PSVT    ! scalar variable ( C2R2 and C1R3  particle)
+!
+REAL, DIMENSION(:,:,:),   POINTER    :: POZON   ! OZONE field from clim.
+REAL, DIMENSION(:,:,:,:), POINTER    :: PAER    ! AERosols optical thickness from clim. 
+REAL, DIMENSION(:,:,:,:), POINTER    :: PDST_WL    ! AERosols Extinction by wavelength . 
+REAL, DIMENSION(:,:,:,:), POINTER    :: PAER_CLIM    ! AERosols optical thickness from clim.
+                                                ! note : the vertical dimension of 
+                                                ! these fields include the "radiation levels"
+                                                ! above domain top
+                                                ! 
+                                                 
+REAL, DIMENSION(:,:,:), INTENT(IN)   :: PRHODREF ![kg/m3] air density
+REAL, DIMENSION(:,:,:), INTENT(IN)   :: PZZ      ![m] height of layers
+
+INTEGER, DIMENSION(:,:), INTENT(INOUT)  :: KCLEARCOL_TM1 ! trace of cloud/clear col
+                                                         ! at the previous radiation step
+!                                                 
+REAL, DIMENSION(:,:,:),   INTENT(INOUT) :: PDTHRAD ! THeta RADiative Tendancy
+REAL, DIMENSION(:,:),     INTENT(INOUT) :: PSRFLWD ! Downward SuRFace LW Flux
+REAL, DIMENSION(:,:,:),   INTENT(INOUT) :: PSRFSWD_DIR ! Downward SuRFace SW Flux DIRect 
+REAL, DIMENSION(:,:,:),   INTENT(INOUT) :: PSRFSWD_DIF ! Downward SuRFace SW Flux DIFfuse 
+REAL, DIMENSION(:,:,:),     INTENT(INOUT) :: PSWU ! upward SW Flux 
+REAL, DIMENSION(:,:,:),     INTENT(INOUT) :: PSWD ! downward SW Flux 
+REAL, DIMENSION(:,:,:),     INTENT(INOUT) :: PLWU ! upward LW Flux 
+REAL, DIMENSION(:,:,:),     INTENT(INOUT) :: PLWD ! downward LW Flux 
+REAL, DIMENSION(:,:,:),     INTENT(INOUT) :: PDTHRADSW ! dthrad sw 
+REAL, DIMENSION(:,:,:),     INTENT(INOUT) :: PDTHRADLW !  dthradsw
+REAL, DIMENSION(:,:,:),     INTENT(INOUT) :: PRADEFF ! effective radius
+!
+!
+!*       0.2   DECLARATIONS OF LOCAL VARIABLES
+!
+LOGICAL                         :: GNOCL     ! .TRUE. when no cloud is present
+                                             !     with OCLEAR_SKY .TRUE.
+LOGICAL                         :: GAOP      ! .TRUE. when CAOP='EXPL'
+LOGICAL, DIMENSION(KDLON,KFLEV) :: GCLOUD    ! .TRUE. for the cloudy columns
+LOGICAL, DIMENSION(KFLEV,KDLON) :: GCLOUDT   ! transpose of the GCLOUD array
+LOGICAL, DIMENSION(KDLON)       :: GCLEAR_2D ! .TRUE. for the clear-sky columns
+LOGICAL, DIMENSION(KDLON,KFLEV) :: GCLEAR    ! .TRUE. for all the levels of the 
+                                             !                clear-sky columns
+LOGICAL, DIMENSION(KDLON,KSWB_MNH)  :: GCLEAR_SWB! .TRUE. for all the bands of the  
+                                             !                clear-sky columns
+INTEGER, DIMENSION(:), ALLOCATABLE :: ICLEAR_2D_TM1 !
+!
+INTEGER :: JI,JJ,JK,JK1,JK2,JKRAD,JALBS! loop indices
+!
+INTEGER :: IIB           ! I index value of the first inner mass point
+INTEGER :: IJB           ! J index value of the first inner mass point
+INTEGER :: IKB           ! K index value of the first inner mass point
+INTEGER :: IIE           ! I index value of the last inner mass point
+INTEGER :: IJE           ! J index value of the last inner mass point
+INTEGER :: IKE           ! K index value of the last inner mass point
+INTEGER :: IKU           ! array size for the third  index
+INTEGER :: IIJ           ! reformatted array index
+INTEGER :: IKSTAE        ! level number of the STAndard atmosphere array
+INTEGER :: IKUP          ! vertical level above which STAndard atmosphere data
+                         ! are filled in
+!
+INTEGER :: ICLEAR_COL    ! number of    clear-sky columns
+INTEGER :: ICLOUD_COL    ! number of    cloudy    columns
+INTEGER :: ICLOUD        ! number of levels corresponding of the cloudy columns
+INTEGER :: IDIM          ! effective number of columns for which the radiation
+                         ! code is run
+INTEGER :: INIR          ! index corresponding to NIR fisrt band (in SW)
+!
+REAL, DIMENSION(:,:), ALLOCATABLE   :: ZTAVE    ! mean-layer temperature
+REAL(KIND=JPRB), DIMENSION(:,:), ALLOCATABLE   :: ZTAVE_RAD    ! mean-layer temperature
+REAL, DIMENSION(:,:), ALLOCATABLE   :: ZPAVE    ! mean-layer pressure
+REAL(KIND=JPRB), DIMENSION(:,:), ALLOCATABLE   :: ZPAVE_RAD    ! mean-layer pressure
+REAL(KIND=JPRB), DIMENSION(:,:), ALLOCATABLE   :: ZQSAVE   ! saturation specific humidity
+REAL(KIND=JPRB), DIMENSION(:,:), ALLOCATABLE   :: ZQVAVE   ! mean-layer specific humidity
+REAL(KIND=JPRB), DIMENSION(:,:), ALLOCATABLE   :: ZQLAVE   ! Liquid water KG/KG
+REAL(KIND=JPRB), DIMENSION(:,:), ALLOCATABLE   :: ZQRAVE   ! Rain water  KG/KG
+REAL(KIND=JPRB), DIMENSION(:,:), ALLOCATABLE   :: ZQIAVE   ! Ice water Kg/KG
+REAL(KIND=JPRB), DIMENSION(:,:), ALLOCATABLE   :: ZQLWC   ! liquid water content kg/m3
+REAL(KIND=JPRB), DIMENSION(:,:), ALLOCATABLE   :: ZQRWC   ! Rain water  content kg/m3
+REAL(KIND=JPRB), DIMENSION(:,:), ALLOCATABLE   :: ZQIWC   ! ice water content  kg/m3
+REAL(KIND=JPRB), DIMENSION(:,:), ALLOCATABLE   :: ZCFAVE   ! mean-layer cloud fraction
+REAL(KIND=JPRB), DIMENSION(:,:), ALLOCATABLE   :: ZO3AVE   ! mean-layer ozone content 
+REAL(KIND=JPRB), DIMENSION(:,:), ALLOCATABLE   :: ZPRES_HL ! half-level pressure
+REAL(KIND=JPRB), DIMENSION(:,:), ALLOCATABLE   :: ZT_HL    ! half-level temperature
+REAL(KIND=JPRB), DIMENSION(:,:), ALLOCATABLE   :: ZDPRES   ! layer pressure thickness
+REAL(KIND=JPRB), DIMENSION(:,:), ALLOCATABLE   :: ZCCT_C2R2! Cloud water Concentarion (C2R2)
+REAL(KIND=JPRB), DIMENSION(:,:), ALLOCATABLE   :: ZCRT_C2R2! Rain water Concentarion (C2R2)
+REAL(KIND=JPRB), DIMENSION(:,:), ALLOCATABLE   :: ZCIT_C1R3! Ice water Concentarion (C2R2)
+REAL(KIND=JPRB), DIMENSION(:,:), ALLOCATABLE   :: ZCCT_LIMA! Cloud water Concentration(LIMA)
+REAL(KIND=JPRB), DIMENSION(:,:), ALLOCATABLE   :: ZCRT_LIMA! Rain water Concentration(LIMA)
+REAL(KIND=JPRB), DIMENSION(:,:), ALLOCATABLE   :: ZCIT_LIMA! Ice water Concentration(LIMA)
+REAL(KIND=JPRB), DIMENSION(:,:,:), ALLOCATABLE :: ZAER     ! aerosol optical thickness
+REAL(KIND=JPRB), DIMENSION(:,:), ALLOCATABLE   :: ZALBP    ! spectral surface albedo for direct radiations
+REAL(KIND=JPRB), DIMENSION(:,:), ALLOCATABLE   :: ZALBD    ! spectral surface albedo for diffuse radiations 
+REAL(KIND=JPRB), DIMENSION (:,:),  ALLOCATABLE :: ZEMIS    ! surface LW  emissivity 
+REAL(KIND=JPRB), DIMENSION (:,:), ALLOCATABLE  :: ZEMIW    ! surface LW  WINDOW emissivity
+REAL(KIND=JPRB), DIMENSION(:), ALLOCATABLE     :: ZTS      ! reformatted surface PTSRAD array 
+REAL(KIND=JPRB), DIMENSION(:), ALLOCATABLE     :: ZLSM     ! reformatted land sea mask
+REAL(KIND=JPRB), DIMENSION(:),   ALLOCATABLE   :: ZRMU0    ! Reformatted ZMU0 array
+REAL(KIND=JPRB)                     :: ZRII0    ! corrected solar constant
+!
+REAL, DIMENSION(:,:), ALLOCATABLE :: ZDTLW    ! LW temperature tendency
+REAL, DIMENSION(:,:), ALLOCATABLE :: ZDTSW    ! SW temperature tendency
+REAL, DIMENSION(:,:), ALLOCATABLE :: ZNFLW_CS ! CLEAR-SKY LW NET FLUXES
+REAL, DIMENSION(:,:), ALLOCATABLE :: ZNFLW    ! TOTAL LW NET FLUXES
+REAL, DIMENSION(:,:), ALLOCATABLE :: ZNFSW_CS ! CLEAR-SKY SW NET FLUXES
+REAL, DIMENSION(:,:), ALLOCATABLE :: ZNFSW    ! TOTAL SW NET FLUXES
+REAL, DIMENSION(:,:), ALLOCATABLE :: ZFLUX_TOP_GND_IRVISNIR ! Top and 
+                                                            ! Ground radiative FLUXes
+REAL, DIMENSION(:,:),   ALLOCATABLE :: ZFLUX_SW_DOWN ! DowNward SW Flux profiles
+REAL, DIMENSION(:,:),   ALLOCATABLE :: ZFLUX_SW_UP   ! UPward   SW Flux profiles
+REAL, DIMENSION(:,:,:), ALLOCATABLE :: ZFLUX_LW      !          LW Flux profiles
+REAL, DIMENSION(:,:),   ALLOCATABLE :: ZDTLW_CS ! LW Clear-Sky temp. tendency
+REAL, DIMENSION(:,:),   ALLOCATABLE :: ZDTSW_CS ! SW Clear-Sky temp. tendency
+REAL, DIMENSION(:,:),   ALLOCATABLE :: ZFLUX_TOP_GND_IRVISNIR_CS ! Top and
+                                                  !  Ground Clear-Sky radiative FLUXes
+REAL, DIMENSION(:,:), ALLOCATABLE   :: ZSFSWDIR !surface SW direct flux
+REAL, DIMENSION(:,:), ALLOCATABLE   :: ZSFSWDIF !surface SW diffuse flux
+
+REAL, DIMENSION(:),     ALLOCATABLE :: ZPLAN_ALB_VIS, ZPLAN_ALB_NIR
+                        ! PLANetary ALBedo in VISible, Near-InfraRed regions
+REAL, DIMENSION(:),     ALLOCATABLE :: ZPLAN_TRA_VIS, ZPLAN_TRA_NIR
+                        ! PLANetary TRANsmission in VISible, Near-InfraRed regions
+REAL, DIMENSION(:),     ALLOCATABLE :: ZPLAN_ABS_VIS, ZPLAN_ABS_NIR
+                        ! PLANetary ABSorption in VISible, Near-InfraRed regions
+REAL, DIMENSION(:,:),   ALLOCATABLE :: ZEFCL_LWD, ZEFCL_LWU
+                        ! EFective  DOWNward and UPward LW nebulosity (equivalent emissivities)
+                        ! undefined if RRTM is used for LW
+REAL, DIMENSION(:,:),   ALLOCATABLE :: ZFLWP, ZFIWP
+                        ! Liquid and Ice Water Path
+REAL, DIMENSION(:,:),   ALLOCATABLE :: ZRADLP, ZRADIP
+                        ! Cloud liquid water and ice effective radius
+REAL, DIMENSION(:,:),   ALLOCATABLE :: ZEFCL_RRTM, ZCLSW_TOTAL
+                        ! effective LW nebulosity ( RRTM case) 
+                        ! and SW CLoud fraction for mixed phase clouds
+REAL, DIMENSION(:,:,:), ALLOCATABLE :: ZTAU_TOTAL, ZOMEGA_TOTAL, ZCG_TOTAL
+                        ! effective optical thickness, single scattering albedo
+                        ! and asymetry factor for mixed phase clouds
+REAL, DIMENSION(:,:),   ALLOCATABLE :: ZFLUX_SW_DOWN_CS, ZFLUX_SW_UP_CS
+                        ! Clear-Sky  DowNward and UPward   SW Flux profiles
+REAL, DIMENSION(:,:,:), ALLOCATABLE :: ZFLUX_LW_CS
+                        ! Thicknes of the mesh
+REAL(KIND=JPRB), DIMENSION(:,:),   ALLOCATABLE :: ZDZ
+!
+REAL, DIMENSION(KDLON,KFLEV) :: ZZDTSW ! SW diabatic heating
+REAL, DIMENSION(KDLON,KFLEV) :: ZZDTLW ! LW diabatic heating
+REAL, DIMENSION(KDLON)       :: ZZTGVIS! SW surface flux in the VIS band
+REAL, DIMENSION(KDLON)       :: ZZTGNIR! SW surface flux in the NIR band
+REAL, DIMENSION(KDLON)       :: ZZTGIR ! LW surface flux in the IR bands
+REAL, DIMENSION(KDLON,SIZE(PSRFSWD_DIR,3)) :: ZZSFSWDIR
+!                                      ! SW direct surface flux   
+REAL, DIMENSION(KDLON,SIZE(PSRFSWD_DIR,3)) :: ZZSFSWDIF
+!                                      ! SW diffuse surface flux   
+!
+REAL, DIMENSION(KDLON)       :: ZCLOUD ! vertically summed cloud fraction
+!
+REAL, DIMENSION(SIZE(PTHT,1),SIZE(PTHT,2),SIZE(PTHT,3)) :: ZEXNT ! Exner function
+REAL, DIMENSION(SIZE(PTHT,1),SIZE(PTHT,2))    :: ZLWD    ! surface Downward LW flux
+REAL, DIMENSION(SIZE(PTHT,1),SIZE(PTHT,2),SIZE(PSRFSWD_DIR,3)) :: ZSWDDIR ! surface
+REAL, DIMENSION(SIZE(PTHT,1),SIZE(PTHT,2),SIZE(PSRFSWD_DIR,3)) :: ZSWDDIF ! surface Downward SW diffuse flux
+REAL, DIMENSION(SIZE(PTHT,1),SIZE(PTHT,2),SIZE(PTHT,3),KSWB_OLD) :: ZPIZAZ ! Aerosols SSA
+REAL, DIMENSION(SIZE(PTHT,1),SIZE(PTHT,2),SIZE(PTHT,3),KSWB_OLD) :: ZTAUAZ ! Aerosols Optical Detph
+REAL, DIMENSION(SIZE(PTHT,1),SIZE(PTHT,2),SIZE(PTHT,3),KSWB_OLD) :: ZCGAZ  ! Aerosols Asymetric factor
+REAL :: ZZTGVISC    ! downward surface SW flux (VIS band) for clear_sky
+REAL :: ZZTGNIRC    ! downward surface SW flux (NIR band) for clear_sky
+REAL :: ZZTGIRC     ! downward surface LW flux for clear_sky
+REAL, DIMENSION(SIZE(PSRFSWD_DIR,3)) :: ZZSFSWDIRC
+!                   ! downward surface SW direct flux for clear sky
+REAL, DIMENSION(SIZE(PSRFSWD_DIR,3)) :: ZZSFSWDIFC
+!                   ! downward surface SW diffuse flux for clear sky
+REAL, DIMENSION(KFLEV) :: ZT_CLEAR  ! ensemble mean clear-sky temperature
+REAL, DIMENSION(KFLEV) :: ZP_CLEAR  ! ensemble mean clear-sky temperature
+REAL, DIMENSION(KFLEV) :: ZQV_CLEAR ! ensemble mean clear-sky specific humidity
+REAL, DIMENSION(KFLEV) :: ZOZ_CLEAR ! ensemble mean clear-sky ozone
+REAL, DIMENSION(KFLEV) :: ZHP_CLEAR ! ensemble mean clear-sky half-lev. pression
+REAL, DIMENSION(KFLEV) :: ZHT_CLEAR ! ensemble mean clear-sky half-lev. temp.
+REAL, DIMENSION(KFLEV) :: ZDP_CLEAR ! ensemble mean clear-sky pressure thickness
+REAL, DIMENSION(KFLEV,KAER) :: ZAER_CLEAR  ! ensemble mean clear-sky aerosols optical thickness
+REAL, DIMENSION(KSWB_MNH)       :: ZALBP_CLEAR ! ensemble mean clear-sky surface albedo (parallel)
+REAL, DIMENSION(KSWB_MNH)       :: ZALBD_CLEAR ! ensemble mean clear-sky surface albedo (diffuse)
+REAL                        :: ZEMIS_CLEAR ! ensemble mean clear-sky surface emissivity
+REAL                        :: ZEMIW_CLEAR ! ensemble mean clear-sky LW window
+REAL                        :: ZRMU0_CLEAR ! ensemble mean clear-sky MU0
+REAL                        :: ZTS_CLEAR   ! ensemble mean clear-sky surface temperature.
+REAL                        :: ZLSM_CLEAR  !  ensemble mean clear-sky land sea-mask  
+REAL                        :: ZLAT_CLEAR,ZLON_CLEAR
+!
+!work arrays
+REAL, DIMENSION(:),   ALLOCATABLE :: ZWORK1, ZWORK2, ZWORK3, ZWORK
+REAL, DIMENSION(:,:), ALLOCATABLE :: ZWORK4, ZWORK1AER, ZWORK2AER, ZWORK_GRID
+LOGICAL, DIMENSION(SIZE(PTHT,1),SIZE(PTHT,2)) :: ZWORKL
+!
+!  split arrays used to split the memory required by the ECMWF_radiation 
+!  subroutine, the fields have the same meaning as their complete counterpart
+!
+REAL(KIND=JPRB), DIMENSION(:,:),   ALLOCATABLE :: ZALBP_SPLIT, ZALBD_SPLIT
+REAL(KIND=JPRB), DIMENSION(:),     ALLOCATABLE :: ZEMIS_SPLIT, ZEMIW_SPLIT
+REAL(KIND=JPRB), DIMENSION(:),     ALLOCATABLE :: ZRMU0_SPLIT
+REAL(KIND=JPRB), DIMENSION(:,:),   ALLOCATABLE :: ZCFAVE_SPLIT
+REAL(KIND=JPRB), DIMENSION(:,:),   ALLOCATABLE :: ZO3AVE_SPLIT
+REAL(KIND=JPRB), DIMENSION(:,:),   ALLOCATABLE :: ZT_HL_SPLIT
+REAL(KIND=JPRB), DIMENSION(:,:),   ALLOCATABLE :: ZPRES_HL_SPLIT
+REAL(KIND=JPRB), DIMENSION(:,:),   ALLOCATABLE :: ZTAVE_SPLIT
+REAL(KIND=JPRB), DIMENSION(:,:),   ALLOCATABLE :: ZPAVE_SPLIT
+REAL(KIND=JPRB), DIMENSION(:,:,:), ALLOCATABLE :: ZAER_SPLIT
+REAL(KIND=JPRB), DIMENSION(:,:),   ALLOCATABLE :: ZDPRES_SPLIT
+REAL(KIND=JPRB), DIMENSION(:),     ALLOCATABLE :: ZLSM_SPLIT
+REAL(KIND=JPRB), DIMENSION(:,:),   ALLOCATABLE :: ZQVAVE_SPLIT
+REAL(KIND=JPRB), DIMENSION(:,:),   ALLOCATABLE :: ZQSAVE_SPLIT
+REAL(KIND=JPRB), DIMENSION(:,:),   ALLOCATABLE :: ZQLAVE_SPLIT
+REAL(KIND=JPRB), DIMENSION(:,:),   ALLOCATABLE :: ZQIAVE_SPLIT
+REAL(KIND=JPRB), DIMENSION(:,:),   ALLOCATABLE :: ZQRAVE_SPLIT
+REAL(KIND=JPRB), DIMENSION(:,:),   ALLOCATABLE :: ZQRWC_SPLIT
+REAL(KIND=JPRB), DIMENSION(:,:),   ALLOCATABLE :: ZQLWC_SPLIT
+REAL(KIND=JPRB), DIMENSION(:,:),   ALLOCATABLE :: ZQIWC_SPLIT
+REAL(KIND=JPRB), DIMENSION(:,:),   ALLOCATABLE :: ZDZ_SPLIT
+REAL(KIND=JPRB), DIMENSION(:,:), ALLOCATABLE   :: ZCCT_C2R2_SPLIT
+REAL(KIND=JPRB), DIMENSION(:,:), ALLOCATABLE   :: ZCRT_C2R2_SPLIT
+REAL(KIND=JPRB), DIMENSION(:,:), ALLOCATABLE   :: ZCIT_C1R3_SPLIT
+REAL(KIND=JPRB), DIMENSION(:,:), ALLOCATABLE   :: ZCCT_LIMA_SPLIT
+REAL(KIND=JPRB), DIMENSION(:,:), ALLOCATABLE   :: ZCRT_LIMA_SPLIT
+REAL(KIND=JPRB), DIMENSION(:,:), ALLOCATABLE   :: ZCIT_LIMA_SPLIT
+REAL(KIND=JPRB), DIMENSION(:),     ALLOCATABLE :: ZTS_SPLIT
+REAL, DIMENSION(:,:),   ALLOCATABLE :: ZSFSWDIR_SPLIT
+REAL, DIMENSION(:,:),   ALLOCATABLE :: ZSFSWDIF_SPLIT
+REAL, DIMENSION(:,:),   ALLOCATABLE :: ZNFLW_CS_SPLIT
+REAL, DIMENSION(:,:),   ALLOCATABLE :: ZNFLW_SPLIT
+REAL, DIMENSION(:,:),   ALLOCATABLE :: ZNFSW_CS_SPLIT
+REAL, DIMENSION(:,:),   ALLOCATABLE :: ZNFSW_SPLIT
+REAL, DIMENSION(:,:),   ALLOCATABLE :: ZDTLW_SPLIT
+REAL, DIMENSION(:,:),   ALLOCATABLE :: ZDTSW_SPLIT
+REAL, DIMENSION(:,:),   ALLOCATABLE :: ZFLUX_TOP_GND_IRVISNIR_SPLIT
+REAL, DIMENSION(:,:),   ALLOCATABLE :: ZFLUX_SW_DOWN_SPLIT
+REAL, DIMENSION(:,:),   ALLOCATABLE :: ZFLUX_SW_UP_SPLIT
+REAL, DIMENSION(:,:,:), ALLOCATABLE :: ZFLUX_LW_SPLIT
+REAL, DIMENSION(:,:),   ALLOCATABLE :: ZDTLW_CS_SPLIT
+REAL, DIMENSION(:,:),   ALLOCATABLE :: ZDTSW_CS_SPLIT
+REAL, DIMENSION(:,:),   ALLOCATABLE :: ZFLUX_TOP_GND_IRVISNIR_CS_SPLIT
+REAL, DIMENSION(:),     ALLOCATABLE :: ZPLAN_ALB_VIS_SPLIT
+REAL, DIMENSION(:),     ALLOCATABLE :: ZPLAN_ALB_NIR_SPLIT
+REAL, DIMENSION(:),     ALLOCATABLE :: ZPLAN_TRA_VIS_SPLIT
+REAL, DIMENSION(:),     ALLOCATABLE :: ZPLAN_TRA_NIR_SPLIT
+REAL, DIMENSION(:),     ALLOCATABLE :: ZPLAN_ABS_VIS_SPLIT
+REAL, DIMENSION(:),     ALLOCATABLE :: ZPLAN_ABS_NIR_SPLIT
+REAL, DIMENSION(:,:),   ALLOCATABLE :: ZEFCL_LWD_SPLIT
+REAL, DIMENSION(:,:),   ALLOCATABLE :: ZEFCL_LWU_SPLIT
+REAL, DIMENSION(:,:),   ALLOCATABLE :: ZFLWP_SPLIT
+REAL, DIMENSION(:,:),   ALLOCATABLE :: ZFIWP_SPLIT
+REAL, DIMENSION(:,:),   ALLOCATABLE :: ZRADLP_SPLIT
+REAL, DIMENSION(:,:),   ALLOCATABLE :: ZRADIP_SPLIT
+REAL, DIMENSION(:,:),   ALLOCATABLE :: ZEFCL_RRTM_SPLIT
+REAL, DIMENSION(:,:),   ALLOCATABLE :: ZCLSW_TOTAL_SPLIT
+REAL, DIMENSION(:,:,:), ALLOCATABLE :: ZTAU_TOTAL_SPLIT
+REAL, DIMENSION(:,:,:), ALLOCATABLE :: ZOMEGA_TOTAL_SPLIT
+REAL, DIMENSION(:,:,:), ALLOCATABLE :: ZCG_TOTAL_SPLIT
+REAL, DIMENSION(:,:),   ALLOCATABLE :: ZFLUX_SW_DOWN_CS_SPLIT
+REAL, DIMENSION(:,:),   ALLOCATABLE :: ZFLUX_SW_UP_CS_SPLIT
+REAL, DIMENSION(:,:,:), ALLOCATABLE :: ZFLUX_LW_CS_SPLIT
+REAL, DIMENSION(:,:,:,:), ALLOCATABLE :: ZPIZA_EQ_TMP        !Single scattering albedo of aerosols (lon,lat,lev,wvl)
+REAL, DIMENSION(:,:,:,:), ALLOCATABLE :: ZIR        !Real part of the aerosol refractive index(lon,lat,lev,wvl)
+REAL, DIMENSION(:,:,:,:), ALLOCATABLE :: ZII        !Imaginary part of the aerosol refractive index (lon,lat,lev,wvl)
+REAL, DIMENSION(:,:,:,:), ALLOCATABLE :: ZCGA_EQ_TMP         !Assymetry factor aerosols            (lon,lat,lev,wvl)
+REAL, DIMENSION(:,:,:,:), ALLOCATABLE :: ZTAUREL_EQ_TMP      !tau/tau_{550} aerosols               (lon,lat,lev,wvl)
+REAL, DIMENSION(:,:,:,:), ALLOCATABLE :: ZPIZA_DST_TMP        !Single scattering albedo of dust (lon,lat,lev,wvl)
+REAL, DIMENSION(:,:,:,:), ALLOCATABLE :: ZCGA_DST_TMP         !Assymetry factor dust            (lon,lat,lev,wvl)
+REAL, DIMENSION(:,:,:,:), ALLOCATABLE :: ZTAUREL_DST_TMP      !tau/tau_{550} dust               (lon,lat,lev,wvl)
+REAL, DIMENSION(:,:,:,:), ALLOCATABLE :: ZPIZA_AER_TMP        !Single scattering albedo of aerosol from ORILAM (lon,lat,lev,wvl)
+REAL, DIMENSION(:,:,:,:), ALLOCATABLE :: ZCGA_AER_TMP         !Assymetry factor aerosol from ORILAM            (lon,lat,lev,wvl)
+REAL, DIMENSION(:,:,:,:), ALLOCATABLE :: ZTAUREL_AER_TMP      !tau/tau_{550} aerosol from ORILAM               (lon,lat,lev,wvl)
+REAL, DIMENSION(:,:,:,:), ALLOCATABLE :: ZPIZA_SLT_TMP        !Single scattering albedo of sea salt (lon,lat,lev,wvl)
+REAL, DIMENSION(:,:,:,:), ALLOCATABLE :: ZCGA_SLT_TMP         !Assymetry factor of sea salt            (lon,lat,lev,wvl)
+REAL, DIMENSION(:,:,:,:), ALLOCATABLE :: ZTAUREL_SLT_TMP      !tau/tau_{550} of sea salt               (lon,lat,lev,wvl)
+REAL, DIMENSION(:,:,:), ALLOCATABLE :: PAER_AER      !tau/tau_{550} aerosol from ORILAM               (lon,lat,lev,wvl)
+REAL, DIMENSION(:,:,:), ALLOCATABLE :: PAER_SLT      !tau/tau_{550} sea salt               (lon,lat,lev,wvl)
+REAL, DIMENSION(:,:,:), ALLOCATABLE :: PAER_DST     !tau/tau_{550} dust               (lon,lat,lev,wvl)
+REAL, DIMENSION(:,:,:), ALLOCATABLE :: ZTAU550_EQ_TMP      !tau/tau_{550} aerosols               (lon,lat,lev,wvl)
+REAL(KIND=JPRB), DIMENSION(:,:,:), ALLOCATABLE   :: ZPIZA_EQ            !Single scattering albedo of aerosols (points,lev,wvl)
+REAL(KIND=JPRB), DIMENSION(:,:,:), ALLOCATABLE   :: ZCGA_EQ             !Assymetry factor aerosols            (points,lev,wvl)
+REAL(KIND=JPRB), DIMENSION(:,:,:), ALLOCATABLE   :: ZTAUREL_EQ          !tau/tau_{550} aerosols               (points,lev,wvl)
+REAL(KIND=JPRB), DIMENSION(:,:,:), ALLOCATABLE   :: ZPIZA_EQ_SPLIT      !Single scattering albedo of aerosols (points,lev,wvl)
+REAL(KIND=JPRB), DIMENSION(:,:,:), ALLOCATABLE   :: ZCGA_EQ_SPLIT       !Assymetry factor aerosols            (points,lev,wvl)
+REAL(KIND=JPRB), DIMENSION(:,:,:), ALLOCATABLE   :: ZTAUREL_EQ_SPLIT    !tau/tau_{550} aerosols               (points,lev,wvl)
+REAL, DIMENSION(KFLEV,KSWB_OLD)           :: ZPIZA_EQ_CLEAR      !Single scattering albedo of aerosols (lev,wvl)
+REAL, DIMENSION(KFLEV,KSWB_OLD)           :: ZCGA_EQ_CLEAR       !Assymetry factor aerosols            (lev,wvl)
+REAL, DIMENSION(KFLEV,KSWB_OLD)           :: ZTAUREL_EQ_CLEAR    !tau/tau_{550} aerosols               (lev,wvl)
+INTEGER                               :: WVL_IDX              !Counter for wavelength
+
+!
+INTEGER  :: JI_SPLIT          ! loop on the split array
+INTEGER  :: INUM_CALL         ! number of CALL of the radiation scheme
+INTEGER  :: IDIM_EFF          ! effective number of air-columns to compute
+INTEGER  :: IDIM_RESIDUE      ! number of remaining air-columns to compute
+INTEGER  :: IBEG, IEND        ! auxiliary indices
+!
+!
+REAL, DIMENSION(SIZE(PDTHRAD,1),SIZE(PDTHRAD,2),SIZE(PDTHRAD,3)) &
+     :: ZDTRAD_LW! LW temperature tendency
+REAL, DIMENSION(SIZE(PDTHRAD,1),SIZE(PDTHRAD,2),SIZE(PDTHRAD,3)) &
+     :: ZDTRAD_SW! SW temperature tendency
+INTEGER             :: ILUOUT       ! Logical unit number for output-listing
+INTEGER             :: IRESP        ! Return code of FM routines
+REAL, DIMENSION(SIZE(PDTHRAD,1),SIZE(PDTHRAD,2),SIZE(PDTHRAD,3)) &
+     :: ZSTORE_3D, ZSTORE_3D2! 3D work array for storage
+REAL, DIMENSION(SIZE(PDTHRAD,1),SIZE(PDTHRAD,2)) &
+     :: ZSTORE_2D   ! 2D work array for storage!
+INTEGER                         :: JBAND       ! Solar band index
+CHARACTER (LEN=4), DIMENSION(KSWB_OLD) :: YBAND_NAME  ! Solar band name
+CHARACTER (LEN=2)               :: YDIR        ! Type of the data field
+!
+INTEGER :: ISWB ! number of SW spectral bands (between radiations and surface schemes)
+INTEGER :: JSWB ! loop on SW spectral bands
+INTEGER :: JAE  ! loop on aerosol class
+TYPE(TFIELDMeTaDATA) :: TZFIELD2D, TZFIELD3D
+!
+REAL, DIMENSION(SIZE(PTHT,1),SIZE(PTHT,2),SIZE(PTHT,3)) :: ZDZPABST
+REAL :: ZMINVAL
+INTEGER, DIMENSION(3) :: IMINLOC
+INTEGER :: IINFO_ll
+LOGICAL, DIMENSION(SIZE(PTHT,1),SIZE(PTHT,2)) :: GCLOUD_SURF
+!
+REAL(KIND=JPRB), DIMENSION(:),   ALLOCATABLE :: ZLON,ZLAT
+REAL(KIND=JPRB), DIMENSION(:),   ALLOCATABLE :: ZLON_SPLIT,ZLAT_SPLIT
+!
+INTEGER                            :: ICLEAR_COL_ll
+INTEGER, DIMENSION(:), ALLOCATABLE :: INDEX_ICLEAR_COL
+REAL, DIMENSION(KFLEV)             :: ZT_CLEAR_DD  ! ensemble mean clear-sky temperature
+REAL                               :: ZCLEAR_COL_ll , ZDLON_ll
+!-------------------------------------------------------------------------
+!-------------------------------------------------------------------------
+!-------------------------------------------------------------------------
+!
+!*       1.    COMPUTE DIMENSIONS OF ARRAYS AND OTHER INDICES
+!              ----------------------------------------------
+!
+CALL GET_INDICE_ll (IIB,IJB,IIE,IJE)  ! this definition must be coherent with
+                                      ! the one used in ini_radiations routine
+IKU = SIZE(PTHT,3)
+IKB = 1 + JPVEXT
+IKE = IKU - JPVEXT
+!
+IKSTAE = SIZE(PSTATM,1)
+IKUP   = IKE-JPVEXT+1
+! 
+ISWB   = SIZE(PSRFSWD_DIR,3)
+!
+!-------------------------------------------------------------------------------
+!*       1.1   CHECK PRESSURE DECREASING
+!              -------------------------
+ZDZPABST(:,:,1:IKU-1) = PPABST(:,:,1:IKU-1) - PPABST(:,:,2:IKU)
+ZDZPABST(:,:,IKU) = ZDZPABST(:,:,IKU-1)
+!
+ZMINVAL=MIN_ll(ZDZPABST,IINFO_ll)
+!
+IF ( ZMINVAL <= 0.0 ) THEN
+   ILUOUT = TLUOUT%NLU
+   IMINLOC=GMINLOC_ll( ZDZPABST )
+   WRITE(ILUOUT,*) ' radiation.f90 STOP :: SOMETHING WRONG WITH PRESSURE , ZDZPABST <= 0.0 '  
+   WRITE(ILUOUT,*) ' radiation :: ZDZPABST ', ZMINVAL,' located at ',   IMINLOC
+   FLUSH(unit=ILUOUT)
+   call Print_msg( NVERB_FATAL, 'GEN', 'RADIATIONS', 'something wrong with pressure: ZDZPABST <= 0.0' )
+
+ENDIF
+!------------------------------------------------------------------------------
+ALLOCATE(ZLAT(KDLON))
+ALLOCATE(ZLON(KDLON))
+IF(LCARTESIAN) THEN
+  ZLAT(:) = XLAT0*(XPI/180.)
+  ZLON(:) = XLON0*(XPI/180.)
+ELSE
+  DO JJ=IJB,IJE
+    DO JI=IIB,IIE
+        IIJ = 1 + (JI-IIB) + (IIE-IIB+1)*(JJ-IJB)
+        ZLAT(IIJ) =  XLAT(JI,JJ)*(XPI/180.)
+        ZLON(IIJ) =  XLON(JI,JJ)*(XPI/180.)
+    END DO
+  END DO
+END IF
+!-------------------------------------------------------------------------------
+!
+!*       2.    INITIALIZES THE MEAN-LAYER VARIABLES
+!              ------------------------------------
+!
+ZEXNT(:,:,:)= ( PPABST(:,:,:)/XP00 ) ** (XRD/XCPD)
+!
+! Columns where radiation is computed are put on a single line
+ALLOCATE(ZTAVE(KDLON,KFLEV))
+ALLOCATE(ZQVAVE(KDLON,KFLEV))
+ALLOCATE(ZQLAVE(KDLON,KFLEV))
+ALLOCATE(ZQIAVE(KDLON,KFLEV))
+ALLOCATE(ZCFAVE(KDLON,KFLEV))
+ALLOCATE(ZQRAVE(KDLON,KFLEV))
+ALLOCATE(ZQLWC(KDLON,KFLEV))
+ALLOCATE(ZQIWC(KDLON,KFLEV))
+ALLOCATE(ZQRWC(KDLON,KFLEV))
+ALLOCATE(ZDZ(KDLON,KFLEV))
+!
+ZQVAVE(:,:) = 0.0
+ZQLAVE(:,:) = 0.0
+ZQIAVE(:,:) = 0.0
+ZQRAVE(:,:) = 0.0
+ZCFAVE(:,:) = 0.0
+ZQLWC(:,:) = 0.0
+ZQIWC(:,:) = 0.0
+ZQRWC(:,:) = 0.0
+ZDZ(:,:)=0.0
+!
+!COMPUTE THE MESH SIZE
+DO JK=IKB,IKE
+  JKRAD = JK-JPVEXT
+  DO JJ=IJB,IJE
+    DO JI=IIB,IIE
+      IIJ = 1 + (JI-IIB) + (IIE-IIB+1)*(JJ-IJB)
+      ZDZ(IIJ,JKRAD)  =  PZZ(JI,JJ,JK+1) - PZZ(JI,JJ,JK)
+      ZTAVE(IIJ,JKRAD)  = PTHT(JI,JJ,JK)*ZEXNT(JI,JJ,JK) ! Conversion potential temperature -> actual temperature
+    END DO
+  END DO
+END DO
+!
+!  Check if the humidity mixing ratio is available
+!
+IF( SIZE(PRT(:,:,:,:),4) >= 1 ) THEN
+  DO JK=IKB,IKE
+    JKRAD = JK-JPVEXT
+    DO JJ=IJB,IJE
+      DO JI=IIB,IIE
+        IIJ = 1 + (JI-IIB) + (IIE-IIB+1)*(JJ-IJB)
+        ZQVAVE(IIJ,JKRAD) =MAX(0., PRT(JI,JJ,JK,1))
+      END DO
+    END DO
+  END DO
+END IF
+!
+!  Check if the cloudwater mixing ratio is available
+!
+IF( SIZE(PRT(:,:,:,:),4) >= 2 ) THEN
+  DO JK=IKB,IKE
+    JKRAD = JK-JPVEXT
+    DO JJ=IJB,IJE
+      DO JI=IIB,IIE
+        IIJ = 1 + (JI-IIB) + (IIE-IIB+1)*(JJ-IJB)
+        ZQLAVE(IIJ,JKRAD) = MAX(0.,PRT(JI,JJ,JK,2))
+        ZQLWC(IIJ,JKRAD) = MAX(0.,PRT(JI,JJ,JK,2)*PRHODREF(JI,JJ,JK))
+        ZCFAVE(IIJ,JKRAD) = PCLDFR(JI,JJ,JK)
+      END DO
+    END DO
+  END DO
+END IF
+!
+!  Check if the rainwater mixing ratio is available
+!
+IF( SIZE(PRT(:,:,:,:),4) >= 3 ) THEN
+  DO JK=IKB,IKE
+    JKRAD = JK-JPVEXT
+    DO JJ=IJB,IJE
+      DO JI=IIB,IIE
+        IIJ = 1 + (JI-IIB) + (IIE-IIB+1)*(JJ-IJB)
+        ZQRWC(IIJ,JKRAD) = MAX(0.,PRT(JI,JJ,JK,3)*PRHODREF(JI,JJ,JK))
+        ZQRAVE(IIJ,JKRAD) = MAX(0.,PRT(JI,JJ,JK,3))
+      END DO
+    END DO
+  END DO
+END IF
+!
+!  Check if the cloudice mixing ratio is available
+!
+IF( SIZE(PRT(:,:,:,:),4) >= 4 ) THEN
+  DO JK=IKB,IKE
+    JKRAD = JK-JPVEXT
+    DO JJ=IJB,IJE
+      DO JI=IIB,IIE
+        IIJ = 1 + (JI-IIB) + (IIE-IIB+1)*(JJ-IJB)
+        ZQIWC(IIJ,JKRAD) = MAX(0.,PRT(JI,JJ,JK,4)*PRHODREF(JI,JJ,JK))
+!        ZQIAVE(IIJ,JKRAD) = MAX( PRT(JI,JJ,JK,4)-XRTMIN(4),0.0 )
+        ZQIAVE(IIJ,JKRAD) = MAX( PRT(JI,JJ,JK,4),0.0 )
+      END DO
+    END DO
+  END DO
+END IF
+!
+!  Standard atmosphere extension
+!
+DO JK=IKUP,KFLEV
+  JK1 = (KSTATM-1)+(JK-IKUP)
+  JK2 = JK1+1
+  ZTAVE(:,JK)  = 0.5*( PSTATM(JK1,3)+PSTATM(JK2,3) )
+  ZQVAVE(:,JK) = 0.5*( PSTATM(JK1,5)/PSTATM(JK1,4)+   &
+                 PSTATM(JK2,5)/PSTATM(JK2,4)    )
+END DO
+!
+!        2.1 pronostic water concentation fields (C2R2 coupling) 
+!
+IF( NSV_C2R2 /= 0 ) THEN
+  ALLOCATE (ZCCT_C2R2(KDLON, KFLEV))
+  ALLOCATE (ZCRT_C2R2(KDLON, KFLEV))
+  ZCCT_C2R2(:, :) = 0.
+  ZCRT_C2R2 (:,:) = 0.
+  DO JK=IKB,IKE
+    JKRAD = JK-JPVEXT
+    DO JJ=IJB,IJE
+      DO JI=IIB,IIE
+        IIJ = 1 + (JI-IIB) + (IIE-IIB+1)*(JJ-IJB)
+        ZCCT_C2R2 (IIJ,JKRAD) = MAX(0.,PSVT(JI,JJ,JK,NSV_C2R2BEG+1))
+        ZCRT_C2R2 (IIJ,JKRAD) = MAX(0.,PSVT(JI,JJ,JK,NSV_C2R2BEG+2))
+      END DO
+    END DO
+  END DO
+ELSE 
+  ALLOCATE (ZCCT_C2R2(0,0))
+  ALLOCATE (ZCRT_C2R2(0,0))
+END IF
+!
+IF( NSV_C1R3 /= 0 ) THEN
+  ALLOCATE (ZCIT_C1R3(KDLON, KFLEV))
+  ZCIT_C1R3 (:,:) = 0.
+  DO JK=IKB,IKE
+    JKRAD = JK-JPVEXT
+    DO JJ=IJB,IJE
+      DO JI=IIB,IIE
+        IIJ = 1 + (JI-IIB) + (IIE-IIB+1)*(JJ-IJB)
+        ZCIT_C1R3 (IIJ,JKRAD) = MAX(0.,PSVT(JI,JJ,JK,NSV_C1R3BEG))
+      END DO
+    END DO
+  END DO
+ELSE 
+  ALLOCATE (ZCIT_C1R3(0,0))
+END IF
+!
+!
+!        2.1*bis pronostic water concentation fields (LIMA coupling) 
+!
+IF( CCLOUD == 'LIMA' ) THEN
+   ALLOCATE (ZCCT_LIMA(KDLON, KFLEV))
+   ALLOCATE (ZCRT_LIMA(KDLON, KFLEV))
+   ALLOCATE (ZCIT_LIMA(KDLON, KFLEV))
+   ZCCT_LIMA(:, :) = 0.
+   ZCRT_LIMA (:,:) = 0.
+   ZCIT_LIMA (:,:) = 0.
+   DO JK=IKB,IKE
+      JKRAD = JK-JPVEXT
+      DO JJ=IJB,IJE
+         DO JI=IIB,IIE
+            IIJ = 1 + (JI-IIB) + (IIE-IIB+1)*(JJ-IJB)
+            IF (NMOM_C.GE.2) ZCCT_LIMA(IIJ,JKRAD) = MAX(0.,PSVT(JI,JJ,JK,NSV_LIMA_NC))
+            IF (NMOM_R.GE.2) ZCRT_LIMA(IIJ,JKRAD) = MAX(0.,PSVT(JI,JJ,JK,NSV_LIMA_NR))
+            IF (NMOM_I.GE.2) ZCIT_LIMA(IIJ,JKRAD) = MAX(0.,PSVT(JI,JJ,JK,NSV_LIMA_NI))
+         END DO
+      END DO
+   END DO
+END IF
+!
+!-------------------------------------------------------------------------------
+!
+!*       3.    INITIALIZES THE HALF-LEVEL VARIABLES
+!  	           ------------------------------------
+!
+ALLOCATE(ZPRES_HL(KDLON,KFLEV+1))
+ALLOCATE(ZT_HL(KDLON,KFLEV+1))
+!
+DO JK=IKB,IKE+1
+  JKRAD = JK-JPVEXT
+  DO JJ=IJB,IJE
+    DO JI=IIB,IIE
+      IIJ = 1 + (JI-IIB) + (IIE-IIB+1)*(JJ-IJB)
+      ZPRES_HL(IIJ,JKRAD) = XP00 * (0.5*(ZEXNT(JI,JJ,JK)+ZEXNT(JI,JJ,JK-1)))**(XCPD/XRD)
+    END DO
+  END DO
+END DO
+
+!  Standard atmosphere extension - pressure
+!* begining at ikup+1 level allows to use a model domain higher than 50km
+!
+DO JK=IKUP+1,KFLEV+1
+  JK1 = (KSTATM-1)+(JK-IKUP)
+  ZPRES_HL(:,JK) = PSTATM(JK1,2)*100.0 ! mb -> Pa
+END DO
+!
+!  Surface temperature at the first level
+!  and surface radiative temperature
+ALLOCATE(ZTS(KDLON))
+!
+DO JJ=IJB,IJE
+  DO JI=IIB,IIE
+    IIJ = 1 + (JI-IIB) + (IIE-IIB+1)*(JJ-IJB)
+    ZT_HL(IIJ,1) = PTSRAD(JI,JJ)
+    ZTS(IIJ) = PTSRAD(JI,JJ)
+  END DO
+END DO
+!
+!  Temperature at half levels
+!
+ZT_HL(:,2:IKE-JPVEXT) = 0.5*(ZTAVE(:,1:IKE-JPVEXT-1)+ZTAVE(:,2:IKE-JPVEXT))
+!
+DO JJ=IJB,IJE
+  DO JI=IIB,IIE
+    IIJ = 1 + (JI-IIB) + (IIE-IIB+1)*(JJ-IJB)
+    ZT_HL(IIJ,IKE-JPVEXT+1)  =  0.5*PTHT(JI,JJ,IKE  )*ZEXNT(JI,JJ,IKE  ) &
+         + 0.5*PTHT(JI,JJ,IKE+1)*ZEXNT(JI,JJ,IKE+1)
+  END DO
+END DO
+!
+!  Standard atmosphere extension - temperature
+!* begining at ikup+1 level allows to use a model domain higher than 50km
+!
+DO JK=IKUP+1,KFLEV+1
+  JK1 = (KSTATM-1)+(JK-IKUP)
+  ZT_HL(:,JK) = PSTATM(JK1,3)
+END DO
+!
+!mean layer pressure and layer differential pressure (from half level variables)
+!
+ALLOCATE(ZPAVE(KDLON,KFLEV))
+ALLOCATE(ZDPRES(KDLON,KFLEV))
+DO JKRAD=1,KFLEV
+  ZPAVE(:,JKRAD)=0.5*(ZPRES_HL(:,JKRAD)+ZPRES_HL(:,JKRAD+1))
+  ZDPRES(:,JKRAD)=ZPRES_HL(:,JKRAD)-ZPRES_HL(:,JKRAD+1)
+END DO
+!-----------------------------------------------------------------------
+!*       4.    INITIALIZES THE AEROSOLS and OZONE PROFILES from climatology
+!	           -------------------------------------------
+!
+!        4.1    AEROSOL optical thickness
+! EXPL -> defined online, otherwise climatology
+IF (CAOP=='EXPL') THEN
+   GAOP = .TRUE.
+ELSE
+   GAOP = .FALSE.
+ENDIF
+!
+IF (CAOP=='EXPL') THEN
+   ALLOCATE(ZPIZA_EQ_TMP(SIZE(PAER,1),SIZE(PAER,2),SIZE(PAER,3),KSWB_OLD))
+   ALLOCATE(ZCGA_EQ_TMP(SIZE(PAER,1),SIZE(PAER,2),SIZE(PAER,3),KSWB_OLD))
+   ALLOCATE(ZTAUREL_EQ_TMP(SIZE(PAER,1),SIZE(PAER,2),SIZE(PAER,3),KSWB_OLD))
+
+   ALLOCATE(ZPIZA_DST_TMP(SIZE(PAER,1),SIZE(PAER,2),SIZE(PAER,3),KSWB_OLD))
+   ALLOCATE(ZCGA_DST_TMP(SIZE(PAER,1),SIZE(PAER,2),SIZE(PAER,3),KSWB_OLD))
+   ALLOCATE(ZTAUREL_DST_TMP(SIZE(PAER,1),SIZE(PAER,2),SIZE(PAER,3),KSWB_OLD)) 
+   ALLOCATE(PAER_DST(SIZE(PAER,1),SIZE(PAER,2),SIZE(PAER,3)))
+
+   ALLOCATE(ZPIZA_AER_TMP(SIZE(PAER,1),SIZE(PAER,2),SIZE(PAER,3),KSWB_OLD))
+   ALLOCATE(ZCGA_AER_TMP(SIZE(PAER,1),SIZE(PAER,2),SIZE(PAER,3),KSWB_OLD))
+   ALLOCATE(ZTAUREL_AER_TMP(SIZE(PAER,1),SIZE(PAER,2),SIZE(PAER,3),KSWB_OLD))
+   ALLOCATE(PAER_AER(SIZE(PAER,1),SIZE(PAER,2),SIZE(PAER,3)))
+
+   ALLOCATE(ZPIZA_SLT_TMP(SIZE(PAER,1),SIZE(PAER,2),SIZE(PAER,3),KSWB_OLD))
+   ALLOCATE(ZCGA_SLT_TMP(SIZE(PAER,1),SIZE(PAER,2),SIZE(PAER,3),KSWB_OLD))
+   ALLOCATE(ZTAUREL_SLT_TMP(SIZE(PAER,1),SIZE(PAER,2),SIZE(PAER,3),KSWB_OLD))
+   ALLOCATE(PAER_SLT(SIZE(PAER,1),SIZE(PAER,2),SIZE(PAER,3)))
+   
+
+   ALLOCATE(ZII(SIZE(PSVT,1),SIZE(PSVT,2),SIZE(PSVT,3),KSWB_OLD))
+   ALLOCATE(ZIR(SIZE(PSVT,1),SIZE(PSVT,2),SIZE(PSVT,3),KSWB_OLD))
+
+  ZPIZA_EQ_TMP = 0.
+  ZCGA_EQ_TMP = 0.
+  ZTAUREL_EQ_TMP = 0.
+
+  ZPIZA_DST_TMP = 0.
+  ZCGA_DST_TMP = 0.
+  ZTAUREL_DST_TMP = 0
+
+  ZPIZA_SLT_TMP = 0.
+  ZCGA_SLT_TMP = 0.
+  ZTAUREL_SLT_TMP = 0
+
+  ZPIZA_AER_TMP = 0.
+  ZCGA_AER_TMP = 0.
+  ZTAUREL_AER_TMP = 0
+
+  PAER_DST=0.
+  PAER_SLT=0.
+  PAER_AER=0.
+  
+ IF (LORILAM) THEN
+   CALL AEROOPT_GET(                             &
+        PSVT(IIB:IIE,IJB:IJE,:,NSV_AERBEG:NSV_AEREND)        &  !I [ppv]  aerosols concentration
+        ,PZZ(IIB:IIE,IJB:IJE,:)                   &  !I [m] height of layers
+        ,PRHODREF(IIB:IIE,IJB:IJE,:)              &  !I [kg/m3] density of air
+        ,ZPIZA_AER_TMP(IIB:IIE,IJB:IJE,IKB-JPVEXT:IKE-JPVEXT,:)   &  !O [-] single scattering albedo of aerosols
+        ,ZCGA_AER_TMP(IIB:IIE,IJB:IJE,IKB-JPVEXT:IKE-JPVEXT,:)    &  !O [-] assymetry factor for aerosols
+        ,ZTAUREL_AER_TMP(IIB:IIE,IJB:IJE,IKB-JPVEXT:IKE-JPVEXT,:) &  !O [-] opt.depth(wvl=lambda)/opt.depth(wvl=550nm)
+        ,PAER_AER(IIB:IIE,IJB:IJE,IKB-JPVEXT:IKE-JPVEXT)            &  !O [-] optical depth of aerosols at wvl=550nm
+        ,KSWB_OLD                                    &  !I |nbr] number of shortwave bands
+        ,ZIR(IIB:IIE,IJB:IJE,:,:) &  !O [-] opt.depth(wvl=lambda)/opt.depth(wvl=550nm)
+        ,ZII(IIB:IIE,IJB:IJE,:,:) &  !O [-] opt.depth(wvl=lambda)/opt.depth(wvl=550nm)
+        )
+ ENDIF
+ IF(LDUST) THEN
+   CALL DUSTOPT_GET(                             &
+        PSVT(IIB:IIE,IJB:IJE,:,NSV_DSTBEG:NSV_DSTEND)        &  !I [ppv] Dust scalar concentration
+        ,PZZ(IIB:IIE,IJB:IJE,:)                   &  !I [m] height of layers
+        ,PRHODREF(IIB:IIE,IJB:IJE,:)              &  !I [kg/m3] density of air
+        ,ZPIZA_DST_TMP(IIB:IIE,IJB:IJE,IKB-JPVEXT:IKE-JPVEXT,:)   &  !O [-] single scattering albedo of dust
+        ,ZCGA_DST_TMP(IIB:IIE,IJB:IJE,IKB-JPVEXT:IKE-JPVEXT,:)    &  !O [-] assymetry factor for dust
+        ,ZTAUREL_DST_TMP(IIB:IIE,IJB:IJE,IKB-JPVEXT:IKE-JPVEXT,:) &  !O [-] opt.depth(wvl=lambda)/opt.depth(wvl=550nm)
+        ,PAER_DST(IIB:IIE,IJB:IJE,IKB-JPVEXT:IKE-JPVEXT)            &  !O [-] optical depth of dust at wvl=550nm
+        ,KSWB_OLD                                   &  !I |nbr] number of shortwave bands
+        )
+   DO WVL_IDX=1,KSWB_OLD
+     PDST_WL(:,:,:,WVL_IDX) = ZTAUREL_DST_TMP(:,:,:,WVL_IDX)* PAER(:,:,:,3)             
+   ENDDO
+ ENDIF
+ IF(LSALT) THEN
+   CALL SALTOPT_GET(                             &
+        PSVT(IIB:IIE,IJB:IJE,:,NSV_SLTBEG:NSV_SLTEND)        &  !I [ppv] sea salt scalar concentration
+        ,PZZ(IIB:IIE,IJB:IJE,:)                   &  !I [m] height of layers
+        ,PRHODREF(IIB:IIE,IJB:IJE,:)              &  !I [kg/m3] density of air
+        ,PTHT(IIB:IIE,IJB:IJE,:)                  &  !I [K] potential temperature
+        ,PPABST(IIB:IIE,IJB:IJE,:)                &  !I [hPa] pressure
+        ,PRT(IIB:IIE,IJB:IJE,:,:)                 &  !I [kg/kg] water mixing ratio
+        ,ZPIZA_SLT_TMP(IIB:IIE,IJB:IJE,IKB-JPVEXT:IKE-JPVEXT,:)   &  !O [-] single scattering albedo of sea salt
+        ,ZCGA_SLT_TMP(IIB:IIE,IJB:IJE,IKB-JPVEXT:IKE-JPVEXT,:)    &  !O [-] assymetry factor for sea salt
+        ,ZTAUREL_SLT_TMP(IIB:IIE,IJB:IJE,IKB-JPVEXT:IKE-JPVEXT,:) &  !O [-] opt.depth(wvl=lambda)/opt.depth(wvl=550nm)
+        ,PAER_SLT(IIB:IIE,IJB:IJE,IKB-JPVEXT:IKE-JPVEXT)            &  !O [-] optical depth of sea salt at wvl=550nm
+        ,KSWB_OLD                                    &  !I |nbr] number of shortwave bands
+        )
+ ENDIF
+
+ ZTAUREL_EQ_TMP(:,:,:,:)=ZTAUREL_DST_TMP(:,:,:,:)+ZTAUREL_AER_TMP(:,:,:,:)+ZTAUREL_SLT_TMP(:,:,:,:)
+ 
+ PAER(:,:,:,2)=PAER_SLT(:,:,:)
+ PAER(:,:,:,3)=PAER_DST(:,:,:)
+ PAER(:,:,:,4)=PAER_AER(:,:,:)
+
+
+ WHERE (ZTAUREL_EQ_TMP(:,:,:,:).GT.0.0)
+  ZPIZA_EQ_TMP(:,:,:,:)=(ZPIZA_DST_TMP(:,:,:,:)*ZTAUREL_DST_TMP(:,:,:,:)+&
+                    ZPIZA_AER_TMP(:,:,:,:)*ZTAUREL_AER_TMP(:,:,:,:)+&
+                    ZPIZA_SLT_TMP(:,:,:,:)*ZTAUREL_SLT_TMP(:,:,:,:))/&
+                    ZTAUREL_EQ_TMP(:,:,:,:) 
+ END WHERE
+ WHERE ((ZTAUREL_EQ_TMP(:,:,:,:).GT.0.0).AND.(ZPIZA_EQ_TMP(:,:,:,:).GT.0.0))
+  ZCGA_EQ_TMP(:,:,:,:)=(ZPIZA_DST_TMP(:,:,:,:)*ZTAUREL_DST_TMP(:,:,:,:)*ZCGA_DST_TMP(:,:,:,:)+&
+                   ZPIZA_AER_TMP(:,:,:,:)*ZTAUREL_AER_TMP(:,:,:,:)*ZCGA_AER_TMP(:,:,:,:)+&
+                   ZPIZA_SLT_TMP(:,:,:,:)*ZTAUREL_SLT_TMP(:,:,:,:)*ZCGA_SLT_TMP(:,:,:,:))/&
+                   (ZTAUREL_EQ_TMP(:,:,:,:)*ZPIZA_EQ_TMP(:,:,:,:))
+ END WHERE
+
+ ZTAUREL_EQ_TMP(:,:,:,:)=max(1.E-8,ZTAUREL_EQ_TMP(:,:,:,:))
+ ZCGA_EQ_TMP(:,:,:,:)=max(1.E-8,ZCGA_EQ_TMP(:,:,:,:))
+ ZPIZA_EQ_TMP(:,:,:,:)=max(1.E-8,ZPIZA_EQ_TMP(:,:,:,:))
+ PAER(:,:,:,3)=max(1.E-8,PAER(:,:,:,3))
+ ZPIZA_EQ_TMP(:,:,:,:)=min(0.99,ZPIZA_EQ_TMP(:,:,:,:))
+
+
+ENDIF      
+!
+! Computes SSA, optical depth and assymetry factor for clear sky (aerosols)
+ZTAUAZ(:,:,:,:) = 0.
+ZPIZAZ(:,:,:,:) = 0.
+ZCGAZ(:,:,:,:)  = 0.
+DO WVL_IDX=1,KSWB_OLD
+ DO JAE=1,KAER
+      !Special optical properties for dust
+      IF (CAOP=='EXPL'.AND.(JAE==3)) THEN
+      !Ponderation of aerosol optical in case of explicit optical factor
+      !ti
+        ZTAUAZ(IIB:IIE,IJB:IJE,IKB:IKE,WVL_IDX)= ZTAUAZ(IIB:IIE,IJB:IJE,IKB:IKE,WVL_IDX) + &
+                                                 PAER(IIB:IIE,IJB:IJE,IKB-JPVEXT:IKE-JPVEXT,JAE) * &
+                                       ZTAUREL_EQ_TMP(IIB:IIE,IJB:IJE,IKB-JPVEXT:IKE-JPVEXT,WVL_IDX) 
+      !wi*ti
+        ZPIZAZ(IIB:IIE,IJB:IJE,IKB:IKE,WVL_IDX)= ZPIZAZ(IIB:IIE,IJB:IJE,IKB:IKE,WVL_IDX) + &
+                                  PAER(IIB:IIE,IJB:IJE,IKB-JPVEXT:IKE-JPVEXT,JAE)                * &
+                                  ZTAUREL_EQ_TMP(IIB:IIE,IJB:IJE,IKB-JPVEXT:IKE-JPVEXT,WVL_IDX) * &
+                                  ZPIZA_EQ_TMP(IIB:IIE,IJB:IJE,IKB-JPVEXT:IKE-JPVEXT,WVL_IDX)
+      !wi*ti*gi
+        ZCGAZ(IIB:IIE,IJB:IJE,IKB:IKE,WVL_IDX) = ZCGAZ(IIB:IIE,IJB:IJE,IKB:IKE,WVL_IDX) + &
+                                 PAER(IIB:IIE,IJB:IJE,IKB-JPVEXT:IKE-JPVEXT,JAE)                * &
+                                 ZTAUREL_EQ_TMP(IIB:IIE,IJB:IJE,IKB-JPVEXT:IKE-JPVEXT,WVL_IDX) * &
+                                 ZPIZA_EQ_TMP(IIB:IIE,IJB:IJE,IKB-JPVEXT:IKE-JPVEXT,WVL_IDX)   * &
+                                 ZCGA_EQ_TMP(IIB:IIE,IJB:IJE,IKB-JPVEXT:IKE-JPVEXT,WVL_IDX)
+      ELSE
+
+      !Ponderation of aerosol optical properties 
+      !ti
+        ZTAUAZ(IIB:IIE,IJB:IJE,IKB:IKE,WVL_IDX)=ZTAUAZ(IIB:IIE,IJB:IJE,IKB:IKE,WVL_IDX)+&
+             PAER(IIB:IIE,IJB:IJE,IKB-JPVEXT:IKE-JPVEXT,JAE) * RTAUA(WVL_IDX,JAE)
+      !wi*ti
+        ZPIZAZ(IIB:IIE,IJB:IJE,IKB:IKE,WVL_IDX)=ZPIZAZ(IIB:IIE,IJB:IJE,IKB:IKE,WVL_IDX)+&
+                                               PAER(IIB:IIE,IJB:IJE,IKB-JPVEXT:IKE-JPVEXT,JAE) *&
+                                        RTAUA(WVL_IDX,JAE)*RPIZA(WVL_IDX,JAE)
+      !wi*ti*gi
+        ZCGAZ(IIB:IIE,IJB:IJE,IKB:IKE,WVL_IDX) =  ZCGAZ(IIB:IIE,IJB:IJE,IKB:IKE,WVL_IDX) +&
+                                               PAER(IIB:IIE,IJB:IJE,IKB-JPVEXT:IKE-JPVEXT,JAE)   *&
+                        RTAUA(WVL_IDX,JAE)*RPIZA(WVL_IDX,JAE)*RCGA(WVL_IDX,JAE)
+           ENDIF
+ ENDDO
+! assymetry factor:
+
+ZCGAZ(IIB:IIE,IJB:IJE,IKB:IKE,WVL_IDX) = ZCGAZ(IIB:IIE,IJB:IJE,IKB:IKE,WVL_IDX)  / &
+                                   ZPIZAZ(IIB:IIE,IJB:IJE,IKB:IKE,WVL_IDX)
+! SSA:
+ZPIZAZ(IIB:IIE,IJB:IJE,IKB:IKE,WVL_IDX) = ZPIZAZ(IIB:IIE,IJB:IJE,IKB:IKE,WVL_IDX) / &
+                                    ZTAUAZ(IIB:IIE,IJB:IJE,IKB:IKE,WVL_IDX)
+ENDDO
+!
+
+!
+ALLOCATE(ZAER(KDLON,KFLEV,KAER))
+! Aerosol classes
+! 1=Continental   2=Maritime   3=Desert     4=Urban     5=Volcanic 6=Stratos.Bckgnd
+! Loaded from climatology
+DO JJ=IJB,IJE
+   DO JI=IIB,IIE
+      IIJ = 1 + (JI-IIB) + (IIE-IIB+1)*(JJ-IJB)
+      ZAER (IIJ,:,:) = PAER_CLIM  (JI,JJ,:,:)
+   END DO
+END DO
+IF ((CAOP=='EXPL') .AND. LDUST ) THEN
+  DO JJ=IJB,IJE
+    DO JI=IIB,IIE
+      IIJ = 1 + (JI-IIB) + (IIE-IIB+1)*(JJ-IJB)
+      ZAER (IIJ,:,3) = PAER  (JI,JJ,:,3)
+    END DO
+  END DO
+END IF
+IF ((CAOP=='EXPL') .AND. LSALT ) THEN
+  DO JJ=IJB,IJE
+    DO JI=IIB,IIE
+      IIJ = 1 + (JI-IIB) + (IIE-IIB+1)*(JJ-IJB)
+      ZAER (IIJ,:,2) = PAER  (JI,JJ,:,2)
+    END DO
+  END DO
+END IF
+IF ((CAOP=='EXPL') .AND. LORILAM ) THEN
+  DO JJ=IJB,IJE
+    DO JI=IIB,IIE
+      IIJ = 1 + (JI-IIB) + (IIE-IIB+1)*(JJ-IJB)
+      ZAER (IIJ,:,4) = PAER  (JI,JJ,:,4)
+    END DO
+  END DO
+END IF
+!
+ALLOCATE(ZPIZA_EQ(KDLON,KFLEV,KSWB_OLD))
+ALLOCATE(ZCGA_EQ(KDLON,KFLEV,KSWB_OLD))
+ALLOCATE(ZTAUREL_EQ(KDLON,KFLEV,KSWB_OLD))
+IF(CAOP=='EXPL')THEN
+    !Transform from vector of type #lon #lat #lev #wvl
+    !to vectors of type #points, #levs, #wavelengths
+  DO JJ=IJB,IJE
+  DO JI=IIB,IIE
+    IIJ = 1 + (JI-IIB) + (IIE-IIB+1)*(JJ-IJB)
+    ZPIZA_EQ(IIJ,:,:) = ZPIZA_EQ_TMP(JI,JJ,:,:)
+    ZCGA_EQ(IIJ,:,:)= ZCGA_EQ_TMP(JI,JJ,:,:)
+    ZTAUREL_EQ(IIJ,:,:)=ZTAUREL_EQ_TMP(JI,JJ,:,:)
+  END DO
+  END DO
+  DEALLOCATE(ZPIZA_EQ_TMP)
+  DEALLOCATE(ZCGA_EQ_TMP)
+  DEALLOCATE(ZTAUREL_EQ_TMP)
+  DEALLOCATE(ZPIZA_DST_TMP)
+  DEALLOCATE(ZCGA_DST_TMP)
+  DEALLOCATE(ZTAUREL_DST_TMP)  
+  DEALLOCATE(ZPIZA_AER_TMP)
+  DEALLOCATE(ZCGA_AER_TMP)
+  DEALLOCATE(ZTAUREL_AER_TMP)
+  DEALLOCATE(ZPIZA_SLT_TMP)
+  DEALLOCATE(ZCGA_SLT_TMP)
+  DEALLOCATE(ZTAUREL_SLT_TMP)
+  DEALLOCATE(PAER_DST)
+  DEALLOCATE(PAER_AER)
+  DEALLOCATE(PAER_SLT)
+  DEALLOCATE(ZIR)
+  DEALLOCATE(ZII)
+END IF
+
+
+!
+!      4.2   OZONE content 
+!
+ALLOCATE(ZO3AVE(KDLON,KFLEV))
+!
+DO JJ=IJB,IJE
+  DO JI=IIB,IIE
+    IIJ = 1 + (JI-IIB) + (IIE-IIB+1)*(JJ-IJB)
+    ZO3AVE(IIJ,:)  = POZON (JI,JJ,:)           
+  END DO
+END DO
+#ifdef MNH_ECRAD
+#if ( VER_ECRAD == 140 )
+POZON = POZON
+#endif
+#endif
+!
+!-------------------------------------------------------------------------------
+!
+!*       5.    CALLS THE E.C.M.W.F. RADIATION CODE
+!	           -----------------------------------
+!
+!
+!*       5.1   INITIALIZES 2D AND SURFACE FIELDS
+!
+ALLOCATE(ZRMU0(KDLON))
+ALLOCATE(ZLSM(KDLON))
+! 
+ALLOCATE(ZALBP(KDLON,KSWB_MNH))
+ALLOCATE(ZALBD(KDLON,KSWB_MNH))
+!
+ALLOCATE(ZEMIS(KDLON,KLWB_MNH))
+ALLOCATE(ZEMIW(KDLON,KLWB_MNH))
+!
+DO JJ=IJB,IJE
+  DO JI=IIB,IIE
+    IIJ = 1 + (JI-IIB) + (IIE-IIB+1)*(JJ-IJB)
+    ZEMIS(IIJ,:)   = PEMIS(JI,JJ,:)
+    ZRMU0(IIJ)    = PCOSZEN(JI,JJ)
+    ZLSM(IIJ)     = 1.0 - PSEA(JI,JJ)  
+  END DO
+END DO  
+!
+! spectral albedo
+!
+IF ( SIZE(PDIR_ALB,3)==1 ) THEN
+  DO JJ=IJB,IJE
+    DO JI=IIB,IIE
+      IIJ = 1 + (JI-IIB) + (IIE-IIB+1)*(JJ-IJB)
+      !  sw direct and diffuse albedos
+      ZALBP(IIJ,:)  = PDIR_ALB(JI,JJ,1)
+      ZALBD(IIJ,:)  = PSCA_ALB(JI,JJ,1)
+      !
+    END DO
+  END DO
+ELSE  
+  DO JK=1, SIZE(PDIR_ALB,3)
+    DO JJ=IJB,IJE
+      DO JI=IIB,IIE
+         IIJ = 1 + (JI-IIB) + (IIE-IIB+1)*(JJ-IJB)
+         !  sw direct and diffuse albedos
+         ZALBP(IIJ,JK)  = PDIR_ALB(JI,JJ,JK)
+         ZALBD(IIJ,JK)  = PSCA_ALB(JI,JJ,JK)
+       ENDDO
+     END DO
+   ENDDO  
+END IF
+!
+!
+! LW emissivity
+ZEMIW(:,:)= ZEMIS(:,:)
+!
+!solar constant
+ZRII0= PCORSOL*XI0  ! solar constant multiplied by seasonal variations due to Earth-Sun distance
+!
+!
+!*       5.2   ACCOUNTS FOR THE CLEAR-SKY APPROXIMATION
+!
+!  Performs the horizontal average of the fields when no cloud
+!
+ZCLOUD(:) = SUM( ZCFAVE(:,:),DIM=2 ) ! one where no cloud on the vertical
+!
+! MODIF option CLLY      
+ALLOCATE ( ICLEAR_2D_TM1(KDLON) )
+!
+DO JJ=IJB,IJE
+  DO JI=IIB,IIE
+    IIJ = 1 + (JI-IIB) + (IIE-IIB+1)*(JJ-IJB)
+    ICLEAR_2D_TM1(IIJ) = KCLEARCOL_TM1(JI,JJ)
+  END DO
+END DO
+!
+IF(OCLOUD_ONLY .OR. OCLEAR_SKY) THEN
+  !
+  GCLEAR_2D(:) = .TRUE.
+  WHERE( (ZCLOUD(:) > 0.0) .OR. (ICLEAR_2D_TM1(:)==0) )  ! FALSE on cloudy columns
+    GCLEAR_2D(:) = .FALSE.
+  END WHERE
+  !
+  ICLEAR_COL = COUNT( GCLEAR_2D(:) )  ! number of clear sky columns
+  !
+  ALLOCATE(INDEX_ICLEAR_COL(ICLEAR_COL))
+  IIJ = 0
+  DO JI=1,KDLON
+     IF ( GCLEAR_2D(JI) ) THEN
+         IIJ = IIJ + 1
+         INDEX_ICLEAR_COL(IIJ) = JI
+     END IF
+  END DO
+
+  IF( ICLEAR_COL == KDLON ) THEN ! No cloud case so only the mean clear-sky
+!!$    GCLEAR_2D(1) = .FALSE.       !           column is selected
+!!$    ICLEAR_COL = KDLON-1
+    GNOCL = .TRUE.               ! TRUE if no cloud at all
+  ELSE
+    GNOCL = .FALSE.
+  END IF
+
+  GCLEAR(:,:) = SPREAD( GCLEAR_2D(:),DIM=2,NCOPIES=KFLEV )  ! vertical extension of clear columns 2D map
+  ICLOUD_COL = KDLON - ICLEAR_COL                           ! number of  cloudy columns
+!
+  ZCLEAR_COL_ll = REAL(ICLEAR_COL)
+  CALL REDUCESUM_ll(ZCLEAR_COL_ll,IINFO_ll)
+  !ZDLON_ll = KDLON
+  !CALL REDUCESUM_ll(ZDLON_ll,IINFO_ll)
+
+  !IF (IP == 1 )  
+  !print*,",RADIATIOn COULD_ONLY=OCLOUD_ONLY,OCLEAR_SKY,ZCLEAR_COL_ll,ICLEAR_COL,ICLOUD_COL,KDON,ZDLON_ll,GNOCL=", &
+  !     OCLOUD_ONLY,OCLEAR_SKY,ZCLEAR_COL_ll,ICLEAR_COL,ICLOUD_COL,KDLON,ZDLON_ll,GNOCL
+!
+!!$  IF( ICLEAR_COL /=0 ) THEN ! at least one clear-sky column exists -> average profiles on clear columns
+  IF( ZCLEAR_COL_ll /= 0.0  ) THEN ! at least one clear-sky column exists -> average profiles on clear columns
+    ZT_CLEAR(:)  = SUM_DD_R2_R1_ll(ZTAVE(INDEX_ICLEAR_COL(:),:)) / ZCLEAR_COL_ll
+    ZP_CLEAR(:)  = SUM_DD_R2_R1_ll(ZPAVE(INDEX_ICLEAR_COL(:),:)) / ZCLEAR_COL_ll
+    ZQV_CLEAR(:) = SUM_DD_R2_R1_ll(REAL(ZQVAVE(INDEX_ICLEAR_COL(:),:))) / ZCLEAR_COL_ll
+    ZOZ_CLEAR(:) = SUM_DD_R2_R1_ll(REAL(ZO3AVE(INDEX_ICLEAR_COL(:),:))) / ZCLEAR_COL_ll
+    ZDP_CLEAR(:) = SUM_DD_R2_R1_ll(REAL(ZDPRES(INDEX_ICLEAR_COL(:),:))) / ZCLEAR_COL_ll
+ 
+    DO JK1=1,KAER
+      ZAER_CLEAR(:,JK1) = SUM_DD_R2_R1_ll(REAL(ZAER(INDEX_ICLEAR_COL(:),:,JK1))) / ZCLEAR_COL_ll
+    END DO
+    !Get an average value for the clear column
+    IF(CAOP=='EXPL')THEN
+       DO WVL_IDX=1,KSWB_OLD
+          ZPIZA_EQ_CLEAR(:,WVL_IDX)   = SUM_DD_R2_R1_ll(REAL(ZPIZA_EQ(  INDEX_ICLEAR_COL(:),:,WVL_IDX))) / ZCLEAR_COL_ll
+          ZCGA_EQ_CLEAR(:,WVL_IDX)    = SUM_DD_R2_R1_ll(REAL(ZCGA_EQ(   INDEX_ICLEAR_COL(:),:,WVL_IDX))) / ZCLEAR_COL_ll
+          ZTAUREL_EQ_CLEAR(:,WVL_IDX) = SUM_DD_R2_R1_ll(REAL(ZTAUREL_EQ(INDEX_ICLEAR_COL(:),:,WVL_IDX))) / ZCLEAR_COL_ll
+       ENDDO
+    ENDIF   
+    !
+    ZHP_CLEAR(1:KFLEV) = SUM_DD_R2_R1_ll(REAL(ZPRES_HL(INDEX_ICLEAR_COL(:),1:KFLEV))) / ZCLEAR_COL_ll
+    ZHT_CLEAR(1:KFLEV) = SUM_DD_R2_R1_ll(REAL(ZT_HL   (INDEX_ICLEAR_COL(:),1:KFLEV))) / ZCLEAR_COL_ll
+    ! 
+    ZALBP_CLEAR(:) = SUM_DD_R2_R1_ll(REAL(ZALBP(INDEX_ICLEAR_COL(:),:))) / ZCLEAR_COL_ll
+    ZALBD_CLEAR(:) = SUM_DD_R2_R1_ll(REAL(ZALBD(INDEX_ICLEAR_COL(:),:))) / ZCLEAR_COL_ll
+    ! 
+    ZEMIS_CLEAR = SUM_DD_R1_ll(REAL(ZEMIS(INDEX_ICLEAR_COL(:),1))) / ZCLEAR_COL_ll
+    ZEMIW_CLEAR = SUM_DD_R1_ll(REAL(ZEMIW(INDEX_ICLEAR_COL(:),1))) / ZCLEAR_COL_ll
+    ZRMU0_CLEAR = SUM_DD_R1_ll(REAL(ZRMU0(INDEX_ICLEAR_COL(:))))   / ZCLEAR_COL_ll
+    ZTS_CLEAR   = SUM_DD_R1_ll(REAL(ZTS(INDEX_ICLEAR_COL(:))))     / ZCLEAR_COL_ll
+    ZLSM_CLEAR  = SUM_DD_R1_ll(REAL(ZLSM(INDEX_ICLEAR_COL(:))))    / ZCLEAR_COL_ll
+    ZLAT_CLEAR  = SUM_DD_R1_ll(REAL(ZLAT(INDEX_ICLEAR_COL(:))))    / ZCLEAR_COL_ll
+    ZLON_CLEAR  = SUM_DD_R1_ll(REAL(ZLON(INDEX_ICLEAR_COL(:))))    / ZCLEAR_COL_ll 
+!
+  ELSE ! no clear columns -> the first column is chosen, without physical meaning: it will not be
+    ! unpacked after the call to the radiation ecmwf routine
+    ZT_CLEAR(:)  = ZTAVE(1,:)
+    ZP_CLEAR(:)  = ZPAVE(1,:)
+    ZQV_CLEAR(:) = ZQVAVE(1,:)
+    ZOZ_CLEAR(:) = ZO3AVE(1,:)
+    ZDP_CLEAR(:) = ZDPRES(1,:)
+    ZAER_CLEAR(:,:) = ZAER(1,:,:)
+    IF(CAOP=='EXPL')THEN
+       ZPIZA_EQ_CLEAR(:,:)=ZPIZA_EQ(1,:,:)
+       ZCGA_EQ_CLEAR(:,:)=ZCGA_EQ(1,:,:)
+       ZTAUREL_EQ_CLEAR(:,:)=ZTAUREL_EQ(1,:,:)
+    ENDIF
+!
+    ZHP_CLEAR(1:KFLEV)  = ZPRES_HL(1,1:KFLEV)
+    ZHT_CLEAR(1:KFLEV)  = ZT_HL(1,1:KFLEV)
+    ZALBP_CLEAR(:) = ZALBP(1,:)
+    ZALBD_CLEAR(:) = ZALBD(1,:)
+!
+    ZEMIS_CLEAR  = ZEMIS(1,1)
+    ZEMIW_CLEAR  = ZEMIW(1,1) 
+    ZRMU0_CLEAR  = ZRMU0(1)
+    ZTS_CLEAR    = ZTS(1) 
+    ZLSM_CLEAR   = ZLSM(1) 
+    ZLAT_CLEAR   = ZLAT(1)
+    ZLON_CLEAR   = ZLON(1)
+  END IF
+  !
+  GCLOUD(:,:) = .NOT.GCLEAR(:,:) ! .true. where the column is cloudy
+  GCLOUDT(:,:)=TRANSPOSE(GCLOUD(:,:))
+  ICLOUD = ICLOUD_COL*KFLEV ! total number of voxels in cloudy columns
+  ALLOCATE(ZWORK1(ICLOUD))
+  ALLOCATE(ZWORK2(ICLOUD+KFLEV)) !  allocation for the KFLEV levels of 
+                                 !  the ICLOUD cloudy columns
+                                 !  and of the KFLEV levels of the clear sky one
+  !
+  ! temperature profiles
+  !
+  ZWORK1(:) = PACK( TRANSPOSE(ZTAVE(:,:)),MASK=GCLOUDT(:,:) )
+  ZWORK2(1:ICLOUD) = ZWORK1(1:ICLOUD) ! fills the ICLOUD_COL cloudy columns
+  ZWORK2(ICLOUD+1:)= ZT_CLEAR(1:)      !   and the single clear_sky one
+  DEALLOCATE(ZTAVE)
+  ALLOCATE(ZTAVE(ICLOUD_COL+1,KFLEV))
+  ZTAVE(:,:) = TRANSPOSE( RESHAPE( ZWORK2(:),(/KFLEV,ICLOUD_COL+1/) ) )
+  !
+  ! vapor mixing ratio profiles
+  !
+  ZWORK1(:) = PACK( TRANSPOSE(ZQVAVE(:,:)),MASK=GCLOUDT(:,:) )
+  ZWORK2(1:ICLOUD) = ZWORK1(1:ICLOUD) ! fills the ICLOUD_COL cloudy columns
+  ZWORK2(ICLOUD+1:)= ZQV_CLEAR(1:)      !   and the single clear_sky one
+  DEALLOCATE(ZQVAVE)
+  ALLOCATE(ZQVAVE(ICLOUD_COL+1,KFLEV))
+  ZQVAVE(:,:) = TRANSPOSE( RESHAPE( ZWORK2(:),(/KFLEV,ICLOUD_COL+1/) ) )
+  !
+  ! mesh size 
+  !
+  ZWORK1(:) = PACK( TRANSPOSE(ZDZ(:,:)),MASK=GCLOUDT(:,:) )
+  ZWORK2(1:ICLOUD) = ZWORK1(1:ICLOUD) ! fills the ICLOUD_COL cloudy columns
+  ZWORK2(ICLOUD+1:)= 0.0              !   and the single clear_sky one
+  DEALLOCATE(ZDZ)
+  ALLOCATE(ZDZ(ICLOUD_COL+1,KFLEV))
+  ZDZ(:,:) = TRANSPOSE( RESHAPE( ZWORK2(:),(/KFLEV,ICLOUD_COL+1/) ) )
+  !
+  !
+  ! liquid water mixing ratio profiles
+  !
+  ZWORK1(:) = PACK( TRANSPOSE(ZQLAVE(:,:)),MASK=GCLOUDT(:,:) )
+  ZWORK2(1:ICLOUD) = ZWORK1(1:ICLOUD) ! fills the ICLOUD_COL cloudy columns
+  ZWORK2(ICLOUD+1:)= 0.0              !   and the single clear_sky one
+  DEALLOCATE(ZQLAVE)
+  ALLOCATE(ZQLAVE(ICLOUD_COL+1,KFLEV))
+  ZQLAVE(:,:) = TRANSPOSE( RESHAPE( ZWORK2(:),(/KFLEV,ICLOUD_COL+1/) ) )
+  !
+  !rain 
+  !
+  ZWORK1(:) = PACK( TRANSPOSE(ZQRAVE(:,:)),MASK=GCLOUDT(:,:) )
+  ZWORK2(1:ICLOUD) = ZWORK1(1:ICLOUD) ! fills the ICLOUD_COL cloudy columns
+  ZWORK2(ICLOUD+1:)= 0.0              !   and the single clear_sky one
+  DEALLOCATE(ZQRAVE)
+  ALLOCATE(ZQRAVE(ICLOUD_COL+1,KFLEV))
+  ZQRAVE(:,:) = TRANSPOSE( RESHAPE( ZWORK2(:),(/KFLEV,ICLOUD_COL+1/) ) )
+  ! 
+  ! ice water mixing ratio profiles
+  !
+  ZWORK1(:) = PACK( TRANSPOSE(ZQIAVE(:,:)),MASK=GCLOUDT(:,:) )
+  ZWORK2(1:ICLOUD) = ZWORK1(1:ICLOUD) ! fills the ICLOUD_COL cloudy columns
+  ZWORK2(ICLOUD+1:)= 0.0      !   and the single clear_sky one
+  DEALLOCATE(ZQIAVE)
+  ALLOCATE(ZQIAVE(ICLOUD_COL+1,KFLEV))
+  ZQIAVE(:,:) = TRANSPOSE( RESHAPE( ZWORK2(:),(/KFLEV,ICLOUD_COL+1/) ) )
+  !
+  !
+  ! liquid water mixing ratio profiles
+  !
+  ZWORK1(:) = PACK( TRANSPOSE(ZQLWC(:,:)),MASK=GCLOUDT(:,:) )
+  ZWORK2(1:ICLOUD) = ZWORK1(1:ICLOUD) ! fills the ICLOUD_COL cloudy columns
+  ZWORK2(ICLOUD+1:)= 0.0              !   and the single clear_sky one
+  DEALLOCATE(ZQLWC)
+  ALLOCATE(ZQLWC(ICLOUD_COL+1,KFLEV))
+  ZQLWC(:,:) = TRANSPOSE( RESHAPE( ZWORK2(:),(/KFLEV,ICLOUD_COL+1/) ) )
+  !
+  !rain 
+  !
+  ZWORK1(:) = PACK( TRANSPOSE(ZQRWC(:,:)),MASK=GCLOUDT(:,:) )
+  ZWORK2(1:ICLOUD) = ZWORK1(1:ICLOUD) ! fills the ICLOUD_COL cloudy columns
+  ZWORK2(ICLOUD+1:)= 0.0              !   and the single clear_sky one
+  DEALLOCATE(ZQRWC)
+  ALLOCATE(ZQRWC(ICLOUD_COL+1,KFLEV))
+  ZQRWC(:,:) = TRANSPOSE( RESHAPE( ZWORK2(:),(/KFLEV,ICLOUD_COL+1/) ) )
+  ! 
+  ! ice water mixing ratio profiles
+  !
+  ZWORK1(:) = PACK( TRANSPOSE(ZQIWC(:,:)),MASK=GCLOUDT(:,:) )
+  ZWORK2(1:ICLOUD) = ZWORK1(1:ICLOUD) ! fills the ICLOUD_COL cloudy columns
+  ZWORK2(ICLOUD+1:)= 0.0      !   and the single clear_sky one
+  DEALLOCATE(ZQIWC)
+  ALLOCATE(ZQIWC(ICLOUD_COL+1,KFLEV))
+  ZQIWC(:,:) = TRANSPOSE( RESHAPE( ZWORK2(:),(/KFLEV,ICLOUD_COL+1/) ) )
+  !
+  !
+  ! cloud fraction profiles
+  !
+  ZWORK1(:) = PACK( TRANSPOSE(ZCFAVE(:,:)),MASK=GCLOUDT(:,:) )
+  ZWORK2(1:ICLOUD) = ZWORK1(1:ICLOUD) ! fills the ICLOUD_COL cloudy columns
+  ZWORK2(ICLOUD+1:)= 0.0      !   and the single clear_sky one
+  DEALLOCATE(ZCFAVE)
+  ALLOCATE(ZCFAVE(ICLOUD_COL+1,KFLEV))
+  ZCFAVE(:,:) = TRANSPOSE( RESHAPE( ZWORK2(:),(/KFLEV,ICLOUD_COL+1/) ) )
+  !
+  ! C2R2 water particle concentration
+  !
+  IF ( SIZE(ZCCT_C2R2) > 0 )  THEN
+    ZWORK1(:) = PACK( TRANSPOSE(ZCCT_C2R2(:,:)),MASK=GCLOUDT(:,:) )
+    ZWORK2(1:ICLOUD) = ZWORK1(1:ICLOUD) ! fills the ICLOUD_COL cloudy columns
+    ZWORK2(ICLOUD+1:)= 0.0      !   and the single clear_sky one
+    DEALLOCATE(ZCCT_C2R2)
+    ALLOCATE(ZCCT_C2R2(ICLOUD_COL+1,KFLEV))
+    ZCCT_C2R2 (:,:) = TRANSPOSE( RESHAPE( ZWORK2(:),(/KFLEV,ICLOUD_COL+1/) ) )
+  ENDIF
+  IF ( SIZE (ZCRT_C2R2) > 0 )  THEN
+    ZWORK1(:) = PACK( TRANSPOSE(ZCRT_C2R2(:,:)),MASK=GCLOUDT(:,:) )
+    ZWORK2(1:ICLOUD) = ZWORK1(1:ICLOUD) ! fills the ICLOUD_COL cloudy columns
+    ZWORK2(ICLOUD+1:)= 0.0      !   and the single clear_sky one
+    DEALLOCATE(ZCRT_C2R2)
+    ALLOCATE(ZCRT_C2R2(ICLOUD_COL+1,KFLEV))
+    ZCRT_C2R2 (:,:) = TRANSPOSE( RESHAPE( ZWORK2(:),(/KFLEV,ICLOUD_COL+1/) ) )
+  ENDIF
+  IF ( SIZE (ZCIT_C1R3) > 0)  THEN
+    ZWORK1(:) = PACK( TRANSPOSE(ZCIT_C1R3(:,:)),MASK=GCLOUDT(:,:) )
+    ZWORK2(1:ICLOUD) = ZWORK1(1:ICLOUD) ! fills the ICLOUD_COL cloudy columns
+    ZWORK2(ICLOUD+1:)= 0.0      !   and the single clear_sky one
+    DEALLOCATE(ZCIT_C1R3)
+    ALLOCATE(ZCIT_C1R3(ICLOUD_COL+1,KFLEV))
+    ZCIT_C1R3 (:,:) = TRANSPOSE( RESHAPE( ZWORK2(:),(/KFLEV,ICLOUD_COL+1/) ) )
+  ENDIF
+  !
+  ! LIMA water particle concentration
+  !
+  IF( CCLOUD == 'LIMA' ) THEN
+     ZWORK1(:) = PACK( TRANSPOSE(ZCCT_LIMA(:,:)),MASK=GCLOUDT(:,:) )
+     ZWORK2(1:ICLOUD) = ZWORK1(1:ICLOUD) ! fills the ICLOUD_COL cloudy columns
+     ZWORK2(ICLOUD+1:)= 0.0      !   and the single clear_sky one
+     DEALLOCATE(ZCCT_LIMA)
+     ALLOCATE(ZCCT_LIMA(ICLOUD_COL+1,KFLEV))
+     ZCCT_LIMA (:,:) = TRANSPOSE( RESHAPE( ZWORK2(:),(/KFLEV,ICLOUD_COL+1/) ) )
+!
+     ZWORK1(:) = PACK( TRANSPOSE(ZCRT_LIMA(:,:)),MASK=GCLOUDT(:,:) )
+     ZWORK2(1:ICLOUD) = ZWORK1(1:ICLOUD) ! fills the ICLOUD_COL cloudy columns
+     ZWORK2(ICLOUD+1:)= 0.0      !   and the single clear_sky one
+     DEALLOCATE(ZCRT_LIMA)
+     ALLOCATE(ZCRT_LIMA(ICLOUD_COL+1,KFLEV))
+     ZCRT_LIMA (:,:) = TRANSPOSE( RESHAPE( ZWORK2(:),(/KFLEV,ICLOUD_COL+1/) ) )
+!
+     ZWORK1(:) = PACK( TRANSPOSE(ZCIT_LIMA(:,:)),MASK=GCLOUDT(:,:) )
+     ZWORK2(1:ICLOUD) = ZWORK1(1:ICLOUD) ! fills the ICLOUD_COL cloudy columns
+     ZWORK2(ICLOUD+1:)= 0.0      !   and the single clear_sky one
+     DEALLOCATE(ZCIT_LIMA)
+     ALLOCATE(ZCIT_LIMA(ICLOUD_COL+1,KFLEV))
+     ZCIT_LIMA (:,:) = TRANSPOSE( RESHAPE( ZWORK2(:),(/KFLEV,ICLOUD_COL+1/) ) )
+  ENDIF
+  !
+  ! ozone content profiles
+  !
+  ZWORK1(:) = PACK( TRANSPOSE(ZO3AVE(:,:)),MASK=GCLOUDT(:,:) )
+  ZWORK2(1:ICLOUD) = ZWORK1(1:ICLOUD) ! fills the ICLOUD_COL cloudy columns
+  ZWORK2(ICLOUD+1:)= ZOZ_CLEAR(1:)    !   and the single clear_sky one
+  DEALLOCATE(ZO3AVE)
+  ALLOCATE(ZO3AVE(ICLOUD_COL+1,KFLEV))
+  ZO3AVE(:,:) = TRANSPOSE( RESHAPE( ZWORK2(:),(/KFLEV,ICLOUD_COL+1/) ) )
+  !
+  ZWORK1(:) = PACK( TRANSPOSE(ZPAVE(:,:)),MASK=GCLOUDT(:,:) )
+  ZWORK2(1:ICLOUD) = ZWORK1(1:ICLOUD) ! fills the ICLOUD_COL cloudy columns
+  ZWORK2(ICLOUD+1:)= ZP_CLEAR(1:)     !   and the single clear_sky one
+  DEALLOCATE(ZPAVE)
+  ALLOCATE(ZPAVE(ICLOUD_COL+1,KFLEV))
+  ZPAVE(:,:) = TRANSPOSE( RESHAPE( ZWORK2(:),(/KFLEV,ICLOUD_COL+1/) ) )
+  !
+  !pressure thickness
+  !
+  ZWORK1(:) = PACK( TRANSPOSE(ZDPRES(:,:)),MASK=GCLOUDT(:,:) )
+  ZWORK2(1:ICLOUD) = ZWORK1(1:ICLOUD) ! fills the ICLOUD_COL cloudy columns
+  ZWORK2(ICLOUD+1:)= ZDP_CLEAR(1:)    !   and the single clear_sky one
+  DEALLOCATE(ZDPRES)
+  ALLOCATE(ZDPRES(ICLOUD_COL+1,KFLEV))
+  ZDPRES(:,:) = TRANSPOSE( RESHAPE( ZWORK2(:),(/KFLEV,ICLOUD_COL+1/) ) )
+  !
+  !aerosols
+  !
+  ALLOCATE(ZWORK1AER(ICLOUD,KAER))
+  ALLOCATE(ZWORK2AER(ICLOUD+KFLEV,KAER))
+  DO JK=1,KAER
+    ZWORK1AER(:,JK) = PACK( TRANSPOSE(ZAER(:,:,JK)),MASK=GCLOUDT(:,:) )
+    ZWORK2AER(1:ICLOUD,JK)=ZWORK1AER(:,JK)
+    ZWORK2AER(ICLOUD+1:,JK)=ZAER_CLEAR(:,JK)
+  END DO
+  DEALLOCATE(ZAER)
+  ALLOCATE(ZAER(ICLOUD_COL+1,KFLEV,KAER))
+  DO JK=1,KAER
+    ZAER(:,:,JK) = TRANSPOSE( RESHAPE( ZWORK2AER(:,JK),(/KFLEV,ICLOUD_COL+1/) ) )
+  END DO
+  DEALLOCATE (ZWORK1AER)
+  DEALLOCATE (ZWORK2AER)
+  !
+  IF(CAOP=='EXPL')THEN
+     ALLOCATE(ZWORK1AER(ICLOUD,KSWB_OLD))        !New vector with value for all cld. points
+     ALLOCATE(ZWORK2AER(ICLOUD+KFLEV,KSWB_OLD))  !New vector with value for all cld.points + 1 clr column
+     !Single scattering albedo
+     DO WVL_IDX=1,KSWB_OLD
+        ZWORK1AER(:,WVL_IDX) = PACK( TRANSPOSE(ZPIZA_EQ(:,:,WVL_IDX)),MASK=GCLOUDT(:,:) )
+        ZWORK2AER(1:ICLOUD,WVL_IDX) = ZWORK1AER(:,WVL_IDX)
+        ZWORK2AER(ICLOUD+1:,WVL_IDX) = ZPIZA_EQ_CLEAR(:,WVL_IDX)
+     ENDDO
+     DEALLOCATE(ZPIZA_EQ)
+     ALLOCATE(ZPIZA_EQ(ICLOUD_COL+1,KFLEV,KSWB_OLD))
+     DO WVL_IDX=1,KSWB_OLD
+        ZPIZA_EQ(:,:,WVL_IDX) = TRANSPOSE( RESHAPE( ZWORK2AER(:,WVL_IDX),(/KFLEV,ICLOUD_COL+1/) ) )
+     ENDDO
+     !Assymetry factor
+     DO WVL_IDX=1,KSWB_OLD
+        ZWORK1AER(:,WVL_IDX) = PACK(TRANSPOSE(ZCGA_EQ(:,:,WVL_IDX)), MASK=GCLOUDT(:,:))
+        ZWORK2AER(1:ICLOUD,WVL_IDX) = ZWORK1AER(:,WVL_IDX)
+        ZWORK2AER(ICLOUD+1:,WVL_IDX) = ZCGA_EQ_CLEAR(:,WVL_IDX)
+     ENDDO
+     DEALLOCATE(ZCGA_EQ)
+     ALLOCATE(ZCGA_EQ(ICLOUD_COL+1,KFLEV,KSWB_OLD))
+     DO WVL_IDX=1,KSWB_OLD
+        ZCGA_EQ(:,:,WVL_IDX) = TRANSPOSE(RESHAPE(ZWORK2AER(:,WVL_IDX),(/KFLEV,ICLOUD_COL+1/)))
+     ENDDO
+     !Relative wavelength-distributed optical depth
+     DO WVL_IDX=1,KSWB_OLD
+        ZWORK1AER(:,WVL_IDX) =  PACK(TRANSPOSE(ZTAUREL_EQ(:,:,WVL_IDX)), MASK=GCLOUDT(:,:))
+        ZWORK2AER(1:ICLOUD,WVL_IDX) = ZWORK1AER(:,WVL_IDX)
+        ZWORK2AER(ICLOUD+1:,WVL_IDX) = ZTAUREL_EQ_CLEAR(:,WVL_IDX)
+     ENDDO
+     DEALLOCATE(ZTAUREL_EQ)
+     ALLOCATE(ZTAUREL_EQ(ICLOUD_COL+1,KFLEV,KSWB_OLD))
+     DO WVL_IDX=1,KSWB_OLD
+        ZTAUREL_EQ(:,:,WVL_IDX) = TRANSPOSE(RESHAPE(ZWORK2AER(:,WVL_IDX),(/KFLEV,ICLOUD_COL+1/)))
+     ENDDO
+     DEALLOCATE(ZWORK1AER)
+     DEALLOCATE(ZWORK2AER)
+  ELSE
+     DEALLOCATE(ZPIZA_EQ)
+     ALLOCATE(ZPIZA_EQ(ICLOUD_COL+1,KFLEV,KSWB_OLD))
+     DEALLOCATE(ZCGA_EQ)
+     ALLOCATE(ZCGA_EQ(ICLOUD_COL+1,KFLEV,KSWB_OLD))
+     DEALLOCATE(ZTAUREL_EQ)
+     ALLOCATE(ZTAUREL_EQ(ICLOUD_COL+1,KFLEV,KSWB_OLD))
+  ENDIF !Check on LDUST
+  
+  ! half-level variables
+  !
+  ZWORK1(:) = PACK( TRANSPOSE(ZPRES_HL(:,1:KFLEV)),MASK=GCLOUDT(:,:) )
+  ZWORK2(1:ICLOUD) = ZWORK1(1:ICLOUD)  ! fills the ICLOUD_COL cloudy columns
+  ZWORK2(ICLOUD+1:)= ZHP_CLEAR(1:)     !   and the single clear_sky one
+  DEALLOCATE(ZPRES_HL)
+  ALLOCATE(ZPRES_HL(ICLOUD_COL+1,KFLEV+1))
+  ZPRES_HL(:,1:KFLEV) = TRANSPOSE( RESHAPE( ZWORK2(:),(/KFLEV,ICLOUD_COL+1/) ) )
+  ZPRES_HL(:,KFLEV+1) = PSTATM(IKSTAE,2)*100.0
+  !
+  ZWORK1(:) = PACK( TRANSPOSE(ZT_HL(:,1:KFLEV)),MASK=GCLOUDT(:,:) )
+  ZWORK2(1:ICLOUD) = ZWORK1(1:ICLOUD)  ! fills the ICLOUD_COL cloudy columns
+  ZWORK2(ICLOUD+1:)= ZHT_CLEAR(1:)     !   and the single clear_sky one
+  DEALLOCATE(ZT_HL)
+  ALLOCATE(ZT_HL(ICLOUD_COL+1,KFLEV+1))
+  ZT_HL(:,1:KFLEV) = TRANSPOSE( RESHAPE( ZWORK2(:),(/KFLEV,ICLOUD_COL+1/) ) )
+  ZT_HL(:,KFLEV+1) = PSTATM(IKSTAE,3)
+  !
+  ! surface fields
+  !
+  ALLOCATE(ZWORK3(ICLOUD_COL))
+  ALLOCATE(ZWORK4(ICLOUD_COL,KSWB_MNH))
+  ALLOCATE(ZWORK(KDLON))
+  DO JALBS=1,KSWB_MNH
+    ZWORK(:)  = ZALBP(:,JALBS)
+    ZWORK3(:) = PACK( ZWORK(:),MASK=.NOT.GCLEAR_2D(:) )
+    ZWORK4(:,JALBS) = ZWORK3(:)
+  END DO
+  DEALLOCATE(ZALBP)
+  ALLOCATE(ZALBP(ICLOUD_COL+1,KSWB_MNH))
+  ZALBP(1:ICLOUD_COL,:) = ZWORK4(1:ICLOUD_COL,:)
+  ZALBP(ICLOUD_COL+1,:) = ZALBP_CLEAR(:)
+  !
+  DO JALBS=1,KSWB_MNH
+    ZWORK(:)  = ZALBD(:,JALBS)
+    ZWORK3(:) = PACK( ZWORK(:),MASK=.NOT.GCLEAR_2D(:) )
+    ZWORK4(:,JALBS) = ZWORK3(:)
+  END DO
+  DEALLOCATE(ZALBD)
+  ALLOCATE(ZALBD(ICLOUD_COL+1,KSWB_MNH))
+  ZALBD(1:ICLOUD_COL,:) = ZWORK4(1:ICLOUD_COL,:)  
+  ZALBD(ICLOUD_COL+1,:) = ZALBD_CLEAR(:)  
+  !
+  DEALLOCATE(ZWORK4)
+  !
+  ZWORK3(:) = PACK( ZEMIS(:,1),MASK=.NOT.GCLEAR_2D(:) )
+  DEALLOCATE(ZEMIS)
+  ALLOCATE(ZEMIS(ICLOUD_COL+1,1))
+  ZEMIS(1:ICLOUD_COL,1) = ZWORK3(1:ICLOUD_COL)
+  ZEMIS(ICLOUD_COL+1,1) = ZEMIS_CLEAR
+  !
+  !
+  ZWORK3(:) = PACK( ZEMIW(:,1),MASK=.NOT.GCLEAR_2D(:) )
+  DEALLOCATE(ZEMIW)
+  ALLOCATE(ZEMIW(ICLOUD_COL+1,1))
+  ZEMIW(1:ICLOUD_COL,1) = ZWORK3(1:ICLOUD_COL)
+  ZEMIW(ICLOUD_COL+1,1) = ZEMIW_CLEAR
+  ! 
+  !
+  ZWORK3(:) = PACK( ZRMU0(:),MASK=.NOT.GCLEAR_2D(:) )
+  DEALLOCATE(ZRMU0)
+  ALLOCATE(ZRMU0(ICLOUD_COL+1))
+  ZRMU0(1:ICLOUD_COL) = ZWORK3(1:ICLOUD_COL)
+  ZRMU0(ICLOUD_COL+1) = ZRMU0_CLEAR
+  !
+  ZWORK3(:) = PACK( ZLSM(:),MASK=.NOT.GCLEAR_2D(:) )
+  DEALLOCATE(ZLSM)
+  ALLOCATE(ZLSM(ICLOUD_COL+1))
+  ZLSM(1:ICLOUD_COL) = ZWORK3(1:ICLOUD_COL)
+  ZLSM (ICLOUD_COL+1)= ZLSM_CLEAR
+  ! 
+  ZWORK3(:) = PACK( ZLAT(:),MASK=.NOT.GCLEAR_2D(:) )
+  DEALLOCATE(ZLAT)
+  ALLOCATE(ZLAT(ICLOUD_COL+1))
+  ZLAT(1:ICLOUD_COL) = ZWORK3(1:ICLOUD_COL)
+  ZLAT (ICLOUD_COL+1)= ZLAT_CLEAR
+  ! 
+  ZWORK3(:) = PACK( ZLON(:),MASK=.NOT.GCLEAR_2D(:) )
+  DEALLOCATE(ZLON)
+  ALLOCATE(ZLON(ICLOUD_COL+1))
+  ZLON(1:ICLOUD_COL) = ZWORK3(1:ICLOUD_COL)
+  ZLON (ICLOUD_COL+1)= ZLON_CLEAR
+  !   
+  ZWORK3(:) = PACK( ZTS(:),MASK=.NOT.GCLEAR_2D(:) )
+  DEALLOCATE(ZTS)
+  ALLOCATE(ZTS(ICLOUD_COL+1))
+  ZTS(1:ICLOUD_COL) = ZWORK3(1:ICLOUD_COL)
+  ZTS(ICLOUD_COL+1) = ZTS_CLEAR
+  !
+  DEALLOCATE(ZWORK1)
+  DEALLOCATE(ZWORK2)
+  DEALLOCATE(ZWORK3)
+  DEALLOCATE(ZWORK)
+  !  
+  IDIM = ICLOUD_COL +1 ! Number of columns where RT is computed 
+!
+ELSE 
+  !
+  !*       5.3   RADIATION COMPUTATIONS FOR THE FULL COLUMN NUMBER (KDLON)
+  !
+  IDIM = KDLON
+END IF
+!
+! initialisation of cloud trace for the next radiation time step
+! (if unchanged columns are not recomputed)
+WHERE ( ZCLOUD(:) <= 0.0 )
+  ICLEAR_2D_TM1(:) = 1
+ELSEWHERE
+  ICLEAR_2D_TM1(:) = 0
+END WHERE
+!
+DO JJ=IJB,IJE
+  DO JI=IIB,IIE
+    IIJ = 1 + (JI-IIB) + (IIE-IIB+1)*(JJ-IJB)
+    KCLEARCOL_TM1(JI,JJ) = ICLEAR_2D_TM1(IIJ) ! output to be saved for next time step
+  END DO
+END DO
+! 
+!
+!*       5.4  VERTICAL grid modification(up-down) for compatibility with ECMWF 
+!             radiation vertical grid. ALLOCATION of the outputs.  
+!            
+!             
+ALLOCATE (ZWORK_GRID(SIZE(ZPRES_HL,1),KFLEV+1))
+!
+!half level pressure
+ZWORK_GRID(:,:)=ZPRES_HL(:,:)
+DO JKRAD=1, KFLEV+1
+  JK1=(KFLEV+1)+1-JKRAD
+  ZPRES_HL(:,JKRAD) = ZWORK_GRID(:,JK1)
+END DO
+!
+!half level temperature
+ZWORK_GRID(:,:)=ZT_HL(:,:)
+DO  JKRAD=1, KFLEV+1
+  JK1=(KFLEV+1)+1-JKRAD
+  ZT_HL(:,JKRAD)=ZWORK_GRID(:,JK1)
+END DO
+!
+DEALLOCATE(ZWORK_GRID)
+!
+!mean layer variables
+!-------------------------------------
+ALLOCATE(ZWORK_GRID(SIZE(ZTAVE,1),KFLEV))
+!
+!mean layer temperature
+ZWORK_GRID(:,:)=ZTAVE(:,:)
+DO JKRAD=1, KFLEV
+  JK1=KFLEV+1-JKRAD
+  ZTAVE(:,JKRAD)=ZWORK_GRID(:,JK1)
+END DO
+!
+!mean layer pressure
+ZWORK_GRID(:,:)=ZPAVE(:,:)
+DO JKRAD=1, KFLEV
+  JK1=KFLEV+1-JKRAD
+  ZPAVE(:,JKRAD)=ZWORK_GRID(:,JK1)
+END DO
+!
+!mean layer pressure thickness
+ZWORK_GRID(:,:)=ZDPRES(:,:)
+DO JKRAD=1, KFLEV
+  JK1=KFLEV+1-JKRAD
+  ZDPRES(:,JKRAD)=ZWORK_GRID(:,JK1)
+END DO
+!
+!mesh size
+ZWORK_GRID(:,:)=ZDZ(:,:)
+DO JKRAD=1, KFLEV
+  JK1=KFLEV+1-JKRAD
+  ZDZ(:,JKRAD)=ZWORK_GRID(:,JK1)
+END DO
+
+!mean layer cloud fraction
+ZWORK_GRID(:,:)=ZCFAVE(:,:)
+DO JKRAD=1, KFLEV
+  JK1=KFLEV+1-JKRAD
+  ZCFAVE(:,JKRAD)=ZWORK_GRID(:,JK1)
+END DO
+!
+!mean layer water vapor mixing ratio
+ZWORK_GRID(:,:)=ZQVAVE(:,:)
+DO JKRAD=1, KFLEV
+  JK1=KFLEV+1-JKRAD
+  ZQVAVE(:,JKRAD)=ZWORK_GRID(:,JK1)
+END DO
+!
+!ice
+ZWORK_GRID(:,:)=ZQIAVE(:,:)
+DO JKRAD=1, KFLEV
+  JK1=KFLEV+1-JKRAD
+  ZQIAVE(:,JKRAD)=ZWORK_GRID(:,JK1)
+END DO
+!
+!liquid water
+ZWORK_GRID(:,:)=ZQLAVE(:,:)
+DO JKRAD=1, KFLEV
+  JK1=KFLEV+1-JKRAD
+  ZQLAVE(:,JKRAD)=ZWORK_GRID(:,JK1)
+END DO
+
+
+!rain water
+ZWORK_GRID(:,:)=ZQRAVE(:,:)
+DO JKRAD=1, KFLEV
+  JK1=KFLEV+1-JKRAD
+  ZQRAVE(:,JKRAD)=ZWORK_GRID(:,JK1)
+END DO
+!
+!ice water content
+ZWORK_GRID(:,:)=ZQIWC(:,:)
+DO JKRAD=1, KFLEV
+  JK1=KFLEV+1-JKRAD
+  ZQIWC(:,JKRAD)=ZWORK_GRID(:,JK1)
+END DO
+!
+!liquid water content
+ZWORK_GRID(:,:)=ZQLWC(:,:)
+DO JKRAD=1, KFLEV
+  JK1=KFLEV+1-JKRAD
+  ZQLWC(:,JKRAD)=ZWORK_GRID(:,JK1)
+END DO
+
+
+!rain water content
+ZWORK_GRID(:,:)=ZQRWC(:,:)
+DO JKRAD=1, KFLEV
+  JK1=KFLEV+1-JKRAD
+  ZQRWC(:,JKRAD)=ZWORK_GRID(:,JK1)
+END DO
+
+
+!C2R2 water particle concentration
+!
+IF (SIZE(ZCCT_C2R2) > 0) THEN
+  ZWORK_GRID(:,:)=ZCCT_C2R2(:,:)
+  DO JKRAD=1, KFLEV
+    JK1=KFLEV+1-JKRAD
+    ZCCT_C2R2(:,JKRAD)=ZWORK_GRID(:,JK1)
+  END DO
+END IF
+IF (SIZE(ZCRT_C2R2) > 0) THEN
+  ZWORK_GRID(:,:)=ZCRT_C2R2(:,:)
+  DO JKRAD=1, KFLEV
+    JK1=KFLEV+1-JKRAD
+    ZCRT_C2R2(:,JKRAD)=ZWORK_GRID(:,JK1)
+  END DO
+END IF
+IF (SIZE(ZCIT_C1R3) > 0) THEN
+  ZWORK_GRID(:,:)=ZCIT_C1R3(:,:)
+  DO JKRAD=1, KFLEV
+    JK1=KFLEV+1-JKRAD
+    ZCIT_C1R3(:,JKRAD)=ZWORK_GRID(:,JK1)
+  END DO
+END IF
+!
+!LIMA water particle concentration
+!
+IF( CCLOUD == 'LIMA' ) THEN
+   ZWORK_GRID(:,:)=ZCCT_LIMA(:,:)
+   DO JKRAD=1, KFLEV
+      JK1=KFLEV+1-JKRAD
+      ZCCT_LIMA(:,JKRAD)=ZWORK_GRID(:,JK1)
+   END DO
+!
+   ZWORK_GRID(:,:)=ZCRT_LIMA(:,:)
+   DO JKRAD=1, KFLEV
+      JK1=KFLEV+1-JKRAD
+      ZCRT_LIMA(:,JKRAD)=ZWORK_GRID(:,JK1)
+   END DO
+!
+   ZWORK_GRID(:,:)=ZCIT_LIMA(:,:)
+   DO JKRAD=1, KFLEV
+      JK1=KFLEV+1-JKRAD
+      ZCIT_LIMA(:,JKRAD)=ZWORK_GRID(:,JK1)
+   END DO
+END IF
+!
+!ozone content 
+ZWORK_GRID(:,:)=ZO3AVE(:,:)
+DO JKRAD=1, KFLEV
+  JK1=KFLEV+1-JKRAD
+  ZO3AVE(:,JKRAD)=ZWORK_GRID(:,JK1)
+END DO
+!
+!aerosol optical depth 
+DO JI=1,KAER
+  ZWORK_GRID(:,:)=ZAER(:,:,JI)
+  DO JKRAD=1, KFLEV
+    JK1=KFLEV+1-JKRAD
+    ZAER(:,JKRAD,JI)=ZWORK_GRID(:,JK1)
+  END DO
+END DO
+IF (CAOP=='EXPL') THEN
+!TURN MORE FIELDS UPSIDE DOWN...
+!Dust single scattering albedo
+DO JI=1,KSWB_OLD
+   ZWORK_GRID(:,:)=ZPIZA_EQ(:,:,JI)
+   DO JKRAD=1,KFLEV
+      JK1=KFLEV+1-JKRAD
+      ZPIZA_EQ(:,JKRAD,JI)=ZWORK_GRID(:,JK1)
+   ENDDO
+ENDDO
+!Dust asymmetry factor
+DO JI=1,KSWB_OLD
+   ZWORK_GRID(:,:)=ZCGA_EQ(:,:,JI)
+   DO JKRAD=1,KFLEV
+      JK1=KFLEV+1-JKRAD
+      ZCGA_EQ(:,JKRAD,JI)=ZWORK_GRID(:,JK1)
+   ENDDO
+ENDDO
+DO JI=1,KSWB_OLD
+   ZWORK_GRID(:,:)=ZTAUREL_EQ(:,:,JI)
+   DO JKRAD=1,KFLEV
+      JK1=KFLEV+1-JKRAD
+      ZTAUREL_EQ(:,JKRAD,JI)=ZWORK_GRID(:,JK1)
+   ENDDO
+ENDDO 
+
+END IF
+
+!
+DEALLOCATE(ZWORK_GRID)
+!
+!mean layer saturation specific humidity
+!
+ALLOCATE(ZQSAVE(SIZE(ZTAVE,1),SIZE(ZTAVE,2)))
+!
+WHERE (ZTAVE(:,:) > XTT)
+  ZQSAVE(:,:) = QSAT(ZTAVE, ZPAVE)
+ELSEWHERE
+  ZQSAVE(:,:) = QSATI(ZTAVE, ZPAVE)
+END WHERE
+!
+! allocations for the radiation code outputs
+!
+ALLOCATE(ZDTLW(IDIM,KFLEV))
+ALLOCATE(ZDTSW(IDIM,KFLEV))
+ALLOCATE(ZFLUX_TOP_GND_IRVISNIR(IDIM,KFLUX))
+ALLOCATE(ZSFSWDIR(IDIM,ISWB))
+ALLOCATE(ZSFSWDIF(IDIM,ISWB))
+ALLOCATE(ZDTLW_CS(IDIM,KFLEV))
+ALLOCATE(ZDTSW_CS(IDIM,KFLEV))
+ALLOCATE(ZFLUX_TOP_GND_IRVISNIR_CS(IDIM,KFLUX))
+!
+!
+ALLOCATE(ZFLUX_LW(IDIM,2,KFLEV+1))
+ALLOCATE(ZFLUX_SW_DOWN(IDIM,KFLEV+1))
+ALLOCATE(ZFLUX_SW_UP(IDIM,KFLEV+1))
+ALLOCATE(ZRADLP(IDIM,KFLEV))
+IF( KRAD_DIAG >= 1) THEN
+  ALLOCATE(ZNFLW(IDIM,KFLEV+1))
+  ALLOCATE(ZNFSW(IDIM,KFLEV+1))
+ELSE
+  ALLOCATE(ZNFLW(0,0))
+  ALLOCATE(ZNFSW(0,0))
+END IF
+! 
+IF( KRAD_DIAG >= 2) THEN
+  ALLOCATE(ZFLUX_SW_DOWN_CS(IDIM,KFLEV+1))
+  ALLOCATE(ZFLUX_SW_UP_CS(IDIM,KFLEV+1))
+  ALLOCATE(ZFLUX_LW_CS(IDIM,2,KFLEV+1))
+  ALLOCATE(ZNFLW_CS(IDIM,KFLEV+1))
+  ALLOCATE(ZNFSW_CS(IDIM,KFLEV+1))
+ELSE
+  ALLOCATE(ZFLUX_SW_DOWN_CS(0,0))
+  ALLOCATE(ZFLUX_SW_UP_CS(0,0))
+  ALLOCATE(ZFLUX_LW_CS(0,0,0))
+  ALLOCATE(ZNFSW_CS(0,0))
+  ALLOCATE(ZNFLW_CS(0,0))
+END IF
+!
+IF( KRAD_DIAG >= 3) THEN
+  ALLOCATE(ZPLAN_ALB_VIS(IDIM))
+  ALLOCATE(ZPLAN_ALB_NIR(IDIM))
+  ALLOCATE(ZPLAN_TRA_VIS(IDIM))
+  ALLOCATE(ZPLAN_TRA_NIR(IDIM))
+  ALLOCATE(ZPLAN_ABS_VIS(IDIM))
+  ALLOCATE(ZPLAN_ABS_NIR(IDIM))
+ELSE
+  ALLOCATE(ZPLAN_ALB_VIS(0))
+  ALLOCATE(ZPLAN_ALB_NIR(0))
+  ALLOCATE(ZPLAN_TRA_VIS(0))
+  ALLOCATE(ZPLAN_TRA_NIR(0))
+  ALLOCATE(ZPLAN_ABS_VIS(0))
+  ALLOCATE(ZPLAN_ABS_NIR(0))
+END IF
+!
+IF( KRAD_DIAG >= 4) THEN
+  ALLOCATE(ZEFCL_RRTM(IDIM,KFLEV))
+  ALLOCATE(ZCLSW_TOTAL(IDIM,KFLEV))
+  ALLOCATE(ZTAU_TOTAL(IDIM,KSWB_OLD,KFLEV))
+  ALLOCATE(ZOMEGA_TOTAL(IDIM,KSWB_OLD,KFLEV))
+  ALLOCATE(ZCG_TOTAL(IDIM,KSWB_OLD,KFLEV))
+  ALLOCATE(ZEFCL_LWD(IDIM,KFLEV))
+  ALLOCATE(ZEFCL_LWU(IDIM,KFLEV))
+  ALLOCATE(ZFLWP(IDIM,KFLEV))
+  ALLOCATE(ZFIWP(IDIM,KFLEV))  
+  ALLOCATE(ZRADIP(IDIM,KFLEV)) 
+ELSE
+  ALLOCATE(ZEFCL_RRTM(0,0))
+  ALLOCATE(ZCLSW_TOTAL(0,0))
+  ALLOCATE(ZTAU_TOTAL(0,0,0))
+  ALLOCATE(ZOMEGA_TOTAL(0,0,0))
+  ALLOCATE(ZCG_TOTAL(0,0,0))
+  ALLOCATE(ZEFCL_LWD(0,0))
+  ALLOCATE(ZEFCL_LWU(0,0))
+  ALLOCATE(ZFLWP(0,0))
+  ALLOCATE(ZFIWP(0,0))
+  ALLOCATE(ZRADIP(0,0))
+END IF
+!
+!*       5.6   CALLS THE ECMWF_RADIATION ROUTINES
+!
+! mixing ratio -> specific humidity conversion (for ECMWF routine)
+! mixing ratio = mv/md ; specific humidity = mv/(mv+md)
+
+ZQVAVE(:,:) = ZQVAVE(:,:) / (1.+ZQVAVE(:,:)) ! Because 
+! ZAER = 1e-5*ZAER
+! ZO3AVE = 1e-5*ZO3AVE!
+IF( IDIM <= KRAD_COLNBR ) THEN 
+!
+! there is less than KRAD_COLNBR columns to be considered therefore
+! no split of the arrays is performed
+! Note that radiation scheme only takes scalar emissivities so only fist value of the spectral emissivity is taken
+ ALLOCATE(ZTAVE_RAD(SIZE(ZTAVE,1),SIZE(ZTAVE,2)))
+ ALLOCATE(ZPAVE_RAD(SIZE(ZPAVE,1),SIZE(ZPAVE,2)))
+ ZTAVE_RAD = ZTAVE
+ ZPAVE_RAD = ZPAVE
+ IF (CCLOUD == 'LIMA') THEN
+  IF (CRAD == "ECMW") THEN
+    CALL ECMWF_RADIATION_VERS2  ( IDIM ,KFLEV, KRAD_DIAG, KAER,     &      
+        ZDZ,HEFRADL,HEFRADI,HOPWSW, HOPISW, HOPWLW, HOPILW,PFUDG,      &
+        ZRII0, ZAER , ZALBD, ZALBP, ZPRES_HL, ZPAVE_RAD,               &
+        PCCO2, ZCFAVE, ZDPRES, ZEMIS(:,1), ZEMIW(:,1), ZLSM, ZRMU0,          &
+        ZO3AVE , ZQVAVE, ZQIAVE ,ZQIWC,ZQLAVE,ZQLWC, ZQSAVE, ZQRAVE,  ZQRWC,  &
+        ZT_HL,ZTAVE_RAD, ZTS, ZCCT_LIMA, ZCRT_LIMA, ZCIT_LIMA,         &
+        ZNFLW_CS, ZNFLW, ZNFSW_CS,ZNFSW,                           &
+        ZDTLW, ZDTSW, ZFLUX_TOP_GND_IRVISNIR,                      &
+        ZSFSWDIR, ZSFSWDIF,                                        &
+        ZFLUX_SW_DOWN, ZFLUX_SW_UP, ZFLUX_LW ,                     &
+        ZDTLW_CS, ZDTSW_CS, ZFLUX_TOP_GND_IRVISNIR_CS,             &
+        ZFLUX_SW_DOWN_CS, ZFLUX_SW_UP_CS, ZFLUX_LW_CS,             &           
+        ZPLAN_ALB_VIS,ZPLAN_ALB_NIR, ZPLAN_TRA_VIS, ZPLAN_TRA_NIR, &
+        ZPLAN_ABS_VIS, ZPLAN_ABS_NIR,ZEFCL_LWD, ZEFCL_LWU,         &
+        ZFLWP, ZFIWP,ZRADLP, ZRADIP,ZEFCL_RRTM,  ZCLSW_TOTAL,  ZTAU_TOTAL,  &
+        ZOMEGA_TOTAL,ZCG_TOTAL,                                    &
+        GAOP, ZPIZA_EQ,ZCGA_EQ,ZTAUREL_EQ                       )
+
+        
+  ELSE IF (CRAD == "ECRA") THEN  
+    CALL ECRAD_INTERFACE  ( IDIM ,KFLEV, KRAD_DIAG, KAER,     &      
+        ZDZ,HEFRADL,HEFRADI,HOPWSW, HOPISW, HOPWLW, HOPILW,PFUDG,      &
+        ZRII0, ZAER , ZALBD, ZALBP, ZPRES_HL, ZPAVE_RAD,               &
+        PCCO2, ZCFAVE, ZDPRES, ZEMIS(:,1), ZEMIW(:,1), ZLSM, ZRMU0,          &
+        ZO3AVE , ZQVAVE, ZQIAVE ,ZQIWC,ZQLAVE,ZQLWC, ZQSAVE, ZQRAVE,  ZQRWC,  &
+        ZT_HL,ZTAVE_RAD, ZTS, ZCCT_LIMA, ZCRT_LIMA, ZCIT_LIMA,         &
+        ZNFLW, ZNFSW, ZNFLW_CS, ZNFSW_CS,                           &
+        ZDTLW, ZDTSW, ZFLUX_TOP_GND_IRVISNIR,                      &
+        ZSFSWDIR, ZSFSWDIF,                                        &
+        ZFLUX_SW_DOWN, ZFLUX_SW_UP, ZFLUX_LW ,                     &
+        ZDTLW_CS, ZDTSW_CS, ZFLUX_TOP_GND_IRVISNIR_CS,             &
+        ZFLUX_SW_DOWN_CS, ZFLUX_SW_UP_CS, ZFLUX_LW_CS,             &           
+        ZPLAN_ALB_VIS,ZPLAN_ALB_NIR, ZPLAN_TRA_VIS, ZPLAN_TRA_NIR, &
+        ZPLAN_ABS_VIS, ZPLAN_ABS_NIR,ZEFCL_LWD, ZEFCL_LWU,         &
+        ZFLWP, ZFIWP,ZRADLP, ZRADIP,ZEFCL_RRTM,  ZCLSW_TOTAL,  ZTAU_TOTAL,  &
+        ZOMEGA_TOTAL,ZCG_TOTAL,                                    &
+        GAOP, ZPIZA_EQ,ZCGA_EQ,ZTAUREL_EQ,ZLAT,ZLON                )      
+  ENDIF      
+ 
+ ELSE
+   IF (CRAD == "ECMW") THEN 
+     CALL ECMWF_RADIATION_VERS2  ( IDIM ,KFLEV, KRAD_DIAG, KAER,     &      
+        ZDZ,HEFRADL,HEFRADI,HOPWSW, HOPISW, HOPWLW, HOPILW,PFUDG,      &
+        ZRII0, ZAER , ZALBD, ZALBP, ZPRES_HL, ZPAVE_RAD,               &
+        PCCO2, ZCFAVE, ZDPRES, ZEMIS(:,1), ZEMIW(:,1), ZLSM, ZRMU0,          &
+        ZO3AVE , ZQVAVE, ZQIAVE ,ZQIWC,ZQLAVE,ZQLWC, ZQSAVE, ZQRAVE,  ZQRWC,  &
+        ZT_HL,ZTAVE_RAD, ZTS, ZCCT_C2R2, ZCRT_C2R2, ZCIT_C1R3,         &
+        ZNFLW_CS, ZNFLW, ZNFSW_CS,ZNFSW,                           &
+        ZDTLW, ZDTSW, ZFLUX_TOP_GND_IRVISNIR,                      &
+        ZSFSWDIR, ZSFSWDIF,                                        &
+        ZFLUX_SW_DOWN, ZFLUX_SW_UP, ZFLUX_LW ,                     &
+        ZDTLW_CS, ZDTSW_CS, ZFLUX_TOP_GND_IRVISNIR_CS,             &
+        ZFLUX_SW_DOWN_CS, ZFLUX_SW_UP_CS, ZFLUX_LW_CS,             &           
+        ZPLAN_ALB_VIS,ZPLAN_ALB_NIR, ZPLAN_TRA_VIS, ZPLAN_TRA_NIR, &
+        ZPLAN_ABS_VIS, ZPLAN_ABS_NIR,ZEFCL_LWD, ZEFCL_LWU,         &
+        ZFLWP, ZFIWP,ZRADLP, ZRADIP,ZEFCL_RRTM,  ZCLSW_TOTAL,  ZTAU_TOTAL,  &
+        ZOMEGA_TOTAL,ZCG_TOTAL,                                    &
+        GAOP, ZPIZA_EQ,ZCGA_EQ,ZTAUREL_EQ                       )
+   
+   ELSE IF (CRAD == "ECRA") THEN 
+     CALL ECRAD_INTERFACE  ( IDIM ,KFLEV, KRAD_DIAG, KAER,                   &      
+        ZDZ,HEFRADL,HEFRADI,HOPWSW, HOPISW, HOPWLW, HOPILW,PFUDG,      &
+        ZRII0, ZAER , ZALBD, ZALBP, ZPRES_HL, ZPAVE_RAD,               &
+        PCCO2, ZCFAVE, ZDPRES, ZEMIS(:,1), ZEMIW(:,1), ZLSM, ZRMU0,          &
+        ZO3AVE , ZQVAVE, ZQIAVE ,ZQIWC,ZQLAVE,ZQLWC, ZQSAVE, ZQRAVE,  ZQRWC,  &
+        ZT_HL,ZTAVE_RAD, ZTS, ZCCT_C2R2, ZCRT_C2R2, ZCIT_C1R3,         &
+        ZNFLW, ZNFSW, ZNFLW_CS, ZNFSW_CS,                           &
+        ZDTLW, ZDTSW, ZFLUX_TOP_GND_IRVISNIR,                      &
+        ZSFSWDIR, ZSFSWDIF,                                        &
+        ZFLUX_SW_DOWN, ZFLUX_SW_UP, ZFLUX_LW ,                     &
+        ZDTLW_CS, ZDTSW_CS, ZFLUX_TOP_GND_IRVISNIR_CS,             &
+        ZFLUX_SW_DOWN_CS, ZFLUX_SW_UP_CS, ZFLUX_LW_CS,             &           
+        ZPLAN_ALB_VIS,ZPLAN_ALB_NIR, ZPLAN_TRA_VIS, ZPLAN_TRA_NIR, &
+        ZPLAN_ABS_VIS, ZPLAN_ABS_NIR,ZEFCL_LWD, ZEFCL_LWU,         &
+        ZFLWP, ZFIWP,ZRADLP, ZRADIP,ZEFCL_RRTM,  ZCLSW_TOTAL,  ZTAU_TOTAL,  &
+        ZOMEGA_TOTAL,ZCG_TOTAL,                                    &
+        GAOP, ZPIZA_EQ,ZCGA_EQ,ZTAUREL_EQ ,ZLAT,ZLON               )
+  END IF      
+   
+   
+ END IF
+ DEALLOCATE(ZTAVE_RAD,ZPAVE_RAD)
+!
+ELSE
+!
+! the splitting of the arrays will be performed
+!
+  INUM_CALL = CEILING( REAL( IDIM ) / REAL( KRAD_COLNBR ) )
+  IDIM_RESIDUE = IDIM
+!
+  DO JI_SPLIT = 1 , INUM_CALL
+    IDIM_EFF = MIN( IDIM_RESIDUE,KRAD_COLNBR )
+    !
+    IF( JI_SPLIT == 1 .OR. JI_SPLIT == INUM_CALL ) THEN       
+      ALLOCATE(  ZALBP_SPLIT(IDIM_EFF,KSWB_MNH))
+      ALLOCATE(  ZALBD_SPLIT(IDIM_EFF,KSWB_MNH))  
+      ALLOCATE(  ZEMIS_SPLIT(IDIM_EFF))
+      ALLOCATE(  ZEMIW_SPLIT(IDIM_EFF))
+      ALLOCATE(  ZRMU0_SPLIT(IDIM_EFF))
+      ALLOCATE(  ZLAT_SPLIT(IDIM_EFF))
+      ALLOCATE(  ZLON_SPLIT(IDIM_EFF))
+      ALLOCATE(  ZCFAVE_SPLIT(IDIM_EFF,KFLEV))
+      ALLOCATE(  ZO3AVE_SPLIT(IDIM_EFF,KFLEV))
+      ALLOCATE(  ZT_HL_SPLIT(IDIM_EFF,KFLEV+1))
+      ALLOCATE(  ZPRES_HL_SPLIT(IDIM_EFF,KFLEV+1))
+      ALLOCATE(  ZDZ_SPLIT(IDIM_EFF,KFLEV))
+      ALLOCATE(  ZQLAVE_SPLIT(IDIM_EFF,KFLEV))
+      ALLOCATE(  ZQIAVE_SPLIT(IDIM_EFF,KFLEV))
+      ALLOCATE(  ZQRAVE_SPLIT(IDIM_EFF,KFLEV))
+      ALLOCATE(  ZQLWC_SPLIT(IDIM_EFF,KFLEV))
+      ALLOCATE(  ZQIWC_SPLIT(IDIM_EFF,KFLEV))
+      ALLOCATE(  ZQRWC_SPLIT(IDIM_EFF,KFLEV))
+      ALLOCATE(  ZQVAVE_SPLIT(IDIM_EFF,KFLEV))
+      ALLOCATE(  ZTAVE_SPLIT(IDIM_EFF,KFLEV))
+      ALLOCATE(  ZPAVE_SPLIT(IDIM_EFF,KFLEV))
+      ALLOCATE(  ZAER_SPLIT( IDIM_EFF,KFLEV,KAER))
+      ALLOCATE(  ZPIZA_EQ_SPLIT(IDIM_EFF,KFLEV,KSWB_OLD))
+      ALLOCATE(  ZCGA_EQ_SPLIT(IDIM_EFF,KFLEV,KSWB_OLD))
+      ALLOCATE(  ZTAUREL_EQ_SPLIT(IDIM_EFF,KFLEV,KSWB_OLD))
+      ALLOCATE(  ZDPRES_SPLIT(IDIM_EFF,KFLEV))
+      ALLOCATE(  ZLSM_SPLIT(IDIM_EFF))
+      ALLOCATE(  ZQSAVE_SPLIT(IDIM_EFF,KFLEV))
+      ALLOCATE(  ZTS_SPLIT(IDIM_EFF))
+      ! output pronostic       
+      ALLOCATE(  ZDTLW_SPLIT(IDIM_EFF,KFLEV))
+      ALLOCATE(  ZDTSW_SPLIT(IDIM_EFF,KFLEV))
+      ALLOCATE(  ZFLUX_TOP_GND_IRVISNIR_SPLIT(IDIM_EFF,KFLUX))
+      ALLOCATE(  ZSFSWDIR_SPLIT(IDIM_EFF,ISWB))
+      ALLOCATE(  ZSFSWDIF_SPLIT(IDIM_EFF,ISWB))
+      ALLOCATE(  ZDTLW_CS_SPLIT(IDIM_EFF,KFLEV))
+      ALLOCATE(  ZDTSW_CS_SPLIT(IDIM_EFF,KFLEV))
+      ALLOCATE(  ZFLUX_TOP_GND_IRVISNIR_CS_SPLIT(IDIM_EFF,KFLUX))
+!
+      ALLOCATE(  ZFLUX_LW_SPLIT(IDIM_EFF,2,KFLEV+1))
+      ALLOCATE(  ZFLUX_SW_DOWN_SPLIT(IDIM_EFF,KFLEV+1))
+      ALLOCATE(  ZFLUX_SW_UP_SPLIT(IDIM_EFF,KFLEV+1))
+      ALLOCATE(  ZRADLP_SPLIT(IDIM_EFF,KFLEV))
+      IF(KRAD_DIAG >=1) THEN
+        ALLOCATE(  ZNFSW_SPLIT(IDIM_EFF,KFLEV+1))
+        ALLOCATE(  ZNFLW_SPLIT(IDIM_EFF,KFLEV+1))
+      ELSE
+        ALLOCATE(  ZNFSW_SPLIT(0,0))
+        ALLOCATE(  ZNFLW_SPLIT(0,0))
+      END IF
+!
+      IF( KRAD_DIAG >= 2) THEN      
+        ALLOCATE(  ZFLUX_SW_DOWN_CS_SPLIT(IDIM_EFF,KFLEV+1))
+        ALLOCATE(  ZFLUX_SW_UP_CS_SPLIT(IDIM_EFF,KFLEV+1))
+        ALLOCATE(  ZFLUX_LW_CS_SPLIT(IDIM_EFF,2,KFLEV+1))
+        ALLOCATE(   ZNFSW_CS_SPLIT(IDIM_EFF,KFLEV+1))
+        ALLOCATE(   ZNFLW_CS_SPLIT(IDIM_EFF,KFLEV+1))
+      ELSE
+        ALLOCATE(  ZFLUX_SW_DOWN_CS_SPLIT(0,0))
+        ALLOCATE(  ZFLUX_SW_UP_CS_SPLIT(0,0))
+        ALLOCATE(  ZFLUX_LW_CS_SPLIT(0,0,0))
+        ALLOCATE(  ZNFSW_CS_SPLIT(0,0))
+        ALLOCATE(  ZNFLW_CS_SPLIT(0,0))
+      END IF
+!
+      IF( KRAD_DIAG >= 3) THEN
+        ALLOCATE(  ZPLAN_ALB_VIS_SPLIT(IDIM_EFF))
+        ALLOCATE(  ZPLAN_ALB_NIR_SPLIT(IDIM_EFF))
+        ALLOCATE(  ZPLAN_TRA_VIS_SPLIT(IDIM_EFF))
+        ALLOCATE(  ZPLAN_TRA_NIR_SPLIT(IDIM_EFF))
+        ALLOCATE(  ZPLAN_ABS_VIS_SPLIT(IDIM_EFF))
+        ALLOCATE(  ZPLAN_ABS_NIR_SPLIT(IDIM_EFF))
+      ELSE
+        ALLOCATE(  ZPLAN_ALB_VIS_SPLIT(0))
+        ALLOCATE(  ZPLAN_ALB_NIR_SPLIT(0))
+        ALLOCATE(  ZPLAN_TRA_VIS_SPLIT(0))
+        ALLOCATE(  ZPLAN_TRA_NIR_SPLIT(0))
+        ALLOCATE(  ZPLAN_ABS_VIS_SPLIT(0))
+        ALLOCATE(  ZPLAN_ABS_NIR_SPLIT(0))
+      END IF
+!
+      IF( KRAD_DIAG >= 4) THEN
+        ALLOCATE(  ZEFCL_RRTM_SPLIT(IDIM_EFF,KFLEV))
+        ALLOCATE(  ZCLSW_TOTAL_SPLIT(IDIM_EFF,KFLEV))
+        ALLOCATE(  ZTAU_TOTAL_SPLIT(IDIM_EFF,KSWB_OLD,KFLEV))
+        ALLOCATE(  ZOMEGA_TOTAL_SPLIT(IDIM_EFF,KSWB_OLD,KFLEV))
+        ALLOCATE(  ZCG_TOTAL_SPLIT(IDIM_EFF,KSWB_OLD,KFLEV))
+        ALLOCATE(  ZEFCL_LWD_SPLIT(IDIM_EFF,KFLEV))
+        ALLOCATE(  ZEFCL_LWU_SPLIT(IDIM_EFF,KFLEV))
+        ALLOCATE(  ZFLWP_SPLIT(IDIM_EFF,KFLEV))
+        ALLOCATE(  ZFIWP_SPLIT(IDIM_EFF,KFLEV))
+        ALLOCATE(  ZRADIP_SPLIT(IDIM_EFF,KFLEV))
+      ELSE
+        ALLOCATE(  ZEFCL_RRTM_SPLIT(0,0))
+        ALLOCATE(  ZCLSW_TOTAL_SPLIT(0,0))
+        ALLOCATE(  ZTAU_TOTAL_SPLIT(0,0,0))
+        ALLOCATE(  ZOMEGA_TOTAL_SPLIT(0,0,0))
+        ALLOCATE(  ZCG_TOTAL_SPLIT(0,0,0))
+        ALLOCATE(  ZEFCL_LWD_SPLIT(0,0))
+        ALLOCATE(  ZEFCL_LWU_SPLIT(0,0))
+        ALLOCATE(  ZFLWP_SPLIT(0,0))
+        ALLOCATE(  ZFIWP_SPLIT(0,0))
+        ALLOCATE(  ZRADIP_SPLIT(0,0))
+      END IF
+!
+! C2R2 coupling
+!
+      IF (SIZE (ZCCT_C2R2) > 0)  THEN
+        ALLOCATE (ZCCT_C2R2_SPLIT(IDIM_EFF,KFLEV))
+      ELSE
+        ALLOCATE (ZCCT_C2R2_SPLIT(0,0))
+      END IF
+!
+      IF (SIZE (ZCRT_C2R2) > 0)  THEN
+        ALLOCATE (ZCRT_C2R2_SPLIT(IDIM_EFF,KFLEV))
+      ELSE
+        ALLOCATE (ZCRT_C2R2_SPLIT(0,0))
+      END IF
+!
+      IF (SIZE (ZCIT_C1R3) > 0)  THEN
+        ALLOCATE (ZCIT_C1R3_SPLIT(IDIM_EFF,KFLEV))
+      ELSE
+        ALLOCATE (ZCIT_C1R3_SPLIT(0,0))
+      END IF
+!
+! LIMA coupling
+!
+      IF( CCLOUD == 'LIMA' ) THEN
+          ALLOCATE (ZCCT_LIMA_SPLIT(IDIM_EFF,KFLEV))
+          ALLOCATE (ZCRT_LIMA_SPLIT(IDIM_EFF,KFLEV))
+          ALLOCATE (ZCIT_LIMA_SPLIT(IDIM_EFF,KFLEV))
+      END IF
+    END IF
+! 
+! fill the split arrays with their values taken from the full arrays 
+!
+    IBEG = IDIM-IDIM_RESIDUE+1
+    IEND = IBEG+IDIM_EFF-1
+!
+    ZALBP_SPLIT(:,:) = ZALBP( IBEG:IEND ,:)
+    ZALBD_SPLIT(:,:) = ZALBD( IBEG:IEND ,:)
+    ZEMIS_SPLIT(:) = ZEMIS ( IBEG:IEND,1 )
+    ZEMIW_SPLIT(:) = ZEMIW ( IBEG:IEND,1 )
+    ZRMU0_SPLIT(:)    = ZRMU0 ( IBEG:IEND )
+    ZLAT_SPLIT(:)    = ZLAT ( IBEG:IEND )
+    ZLON_SPLIT(:)    = ZLON ( IBEG:IEND )
+    ZCFAVE_SPLIT(:,:) = ZCFAVE( IBEG:IEND ,:)
+    ZO3AVE_SPLIT(:,:) = ZO3AVE( IBEG:IEND ,:)
+    ZT_HL_SPLIT(:,:)    = ZT_HL( IBEG:IEND ,:)
+    ZPRES_HL_SPLIT(:,:) = ZPRES_HL( IBEG:IEND ,:)
+    ZQLAVE_SPLIT(:,:) = ZQLAVE( IBEG:IEND , :)
+    ZDZ_SPLIT(:,:) = ZDZ( IBEG:IEND , :)
+    ZQIAVE_SPLIT(:,:) = ZQIAVE( IBEG:IEND ,:)
+    ZQRAVE_SPLIT (:,:) = ZQRAVE (IBEG:IEND ,:)
+    ZQLWC_SPLIT(:,:) = ZQLWC( IBEG:IEND , :)
+    ZQIWC_SPLIT(:,:) = ZQIWC( IBEG:IEND ,:)
+    ZQRWC_SPLIT(:,:) = ZQRWC (IBEG:IEND ,:)
+    ZQVAVE_SPLIT(:,:) = ZQVAVE( IBEG:IEND ,:)
+    ZTAVE_SPLIT(:,:)  = ZTAVE ( IBEG:IEND ,:)
+    ZPAVE_SPLIT(:,:)  = ZPAVE ( IBEG:IEND ,:)
+    ZAER_SPLIT (:,:,:)  = ZAER  ( IBEG:IEND ,:,:)
+    IF(CAOP=='EXPL')THEN
+       ZPIZA_EQ_SPLIT(:,:,:)=ZPIZA_EQ(IBEG:IEND,:,:)
+       ZCGA_EQ_SPLIT(:,:,:)=ZCGA_EQ(IBEG:IEND,:,:)
+       ZTAUREL_EQ_SPLIT(:,:,:)=ZTAUREL_EQ(IBEG:IEND,:,:)
+    ENDIF
+    ZDPRES_SPLIT(:,:)  = ZDPRES (IBEG:IEND ,:)
+    ZLSM_SPLIT (:)    = ZLSM (IBEG:IEND)
+    ZQSAVE_SPLIT (:,:) = ZQSAVE (IBEG:IEND ,:)
+    ZTS_SPLIT (:) = ZTS (IBEG:IEND)
+!
+!  CALL the ECMWF radiation with the split array
+!
+  IF (CCLOUD == 'LIMA') THEN
+! LIMA concentrations
+     ZCCT_LIMA_SPLIT(:,:) = ZCCT_LIMA (IBEG:IEND ,:)
+     ZCRT_LIMA_SPLIT(:,:) = ZCRT_LIMA (IBEG:IEND ,:)
+     ZCIT_LIMA_SPLIT(:,:) = ZCIT_LIMA (IBEG:IEND ,:)
+     
+   IF (CRAD == "ECMW") THEN  
+!
+        CALL ECMWF_RADIATION_VERS2  ( IDIM_EFF , KFLEV, KRAD_DIAG, KAER,               &
+                ZDZ_SPLIT,HEFRADL,HEFRADI,HOPWSW, HOPISW, HOPWLW, HOPILW,PFUDG,          &
+                ZRII0, ZAER_SPLIT , ZALBD_SPLIT, ZALBP_SPLIT, ZPRES_HL_SPLIT,            &
+                ZPAVE_SPLIT,PCCO2, ZCFAVE_SPLIT, ZDPRES_SPLIT, ZEMIS_SPLIT, ZEMIW_SPLIT, &
+                ZLSM_SPLIT, ZRMU0_SPLIT,ZO3AVE_SPLIT , ZQVAVE_SPLIT, ZQIAVE_SPLIT ,ZQIWC_SPLIT,      &
+                ZQLAVE_SPLIT,ZQLWC_SPLIT,ZQSAVE_SPLIT, ZQRAVE_SPLIT,ZQRWC_SPLIT,  ZT_HL_SPLIT,      &
+                ZTAVE_SPLIT, ZTS_SPLIT, ZCCT_LIMA_SPLIT,ZCRT_LIMA_SPLIT,ZCIT_LIMA_SPLIT, &
+                ZNFLW_CS_SPLIT, ZNFLW_SPLIT, ZNFSW_CS_SPLIT,ZNFSW_SPLIT,                 &
+                ZDTLW_SPLIT, ZDTSW_SPLIT, ZFLUX_TOP_GND_IRVISNIR_SPLIT,                  &
+                ZSFSWDIR_SPLIT, ZSFSWDIF_SPLIT,                                          &
+                ZFLUX_SW_DOWN_SPLIT, ZFLUX_SW_UP_SPLIT, ZFLUX_LW_SPLIT ,                 &
+                ZDTLW_CS_SPLIT, ZDTSW_CS_SPLIT, ZFLUX_TOP_GND_IRVISNIR_CS_SPLIT,         &
+                ZFLUX_SW_DOWN_CS_SPLIT, ZFLUX_SW_UP_CS_SPLIT, ZFLUX_LW_CS_SPLIT,         &
+                ZPLAN_ALB_VIS_SPLIT,ZPLAN_ALB_NIR_SPLIT, ZPLAN_TRA_VIS_SPLIT,            &
+                ZPLAN_TRA_NIR_SPLIT, ZPLAN_ABS_VIS_SPLIT, ZPLAN_ABS_NIR_SPLIT,           &
+                ZEFCL_LWD_SPLIT, ZEFCL_LWU_SPLIT, ZFLWP_SPLIT,ZFIWP_SPLIT,               &
+                ZRADLP_SPLIT,ZRADIP_SPLIT,ZEFCL_RRTM_SPLIT, ZCLSW_TOTAL_SPLIT,           &
+                ZTAU_TOTAL_SPLIT,ZOMEGA_TOTAL_SPLIT, ZCG_TOTAL_SPLIT,                    &
+                GAOP,ZPIZA_EQ_SPLIT,ZCGA_EQ_SPLIT,ZTAUREL_EQ_SPLIT  )
+                
+   ELSE IF (CRAD == "ECRA") THEN  
+        CALL ECRAD_INTERFACE  ( IDIM_EFF ,KFLEV, KRAD_DIAG, KAER,                   &      
+            ZDZ,HEFRADL,HEFRADI,HOPWSW, HOPISW, HOPWLW, HOPILW,PFUDG,      &
+            ZRII0, ZAER_SPLIT , ZALBD_SPLIT, ZALBP_SPLIT, ZPRES_HL_SPLIT, ZPAVE_SPLIT,               &
+            PCCO2, ZCFAVE_SPLIT, ZDPRES_SPLIT, ZEMIS_SPLIT, ZEMIW_SPLIT, ZLSM_SPLIT, ZRMU0_SPLIT,          &
+            ZO3AVE_SPLIT , ZQVAVE_SPLIT, ZQIAVE_SPLIT ,ZQIWC_SPLIT,ZQLAVE_SPLIT,ZQLWC_SPLIT, &
+            ZQSAVE_SPLIT, ZQRAVE_SPLIT,  ZQRWC_SPLIT,  &
+            ZT_HL_SPLIT,ZTAVE_SPLIT, ZTS_SPLIT, ZCCT_LIMA_SPLIT, &
+            ZCRT_LIMA_SPLIT, ZCIT_LIMA_SPLIT,         &
+            ZNFLW_SPLIT, ZNFSW_SPLIT, ZNFLW_CS_SPLIT, ZNFSW_CS_SPLIT,                           &
+            ZDTLW_SPLIT, ZDTSW_SPLIT, ZFLUX_TOP_GND_IRVISNIR_SPLIT,                      &
+            ZSFSWDIR_SPLIT, ZSFSWDIF_SPLIT,                                        &
+            ZFLUX_SW_DOWN_SPLIT, ZFLUX_SW_UP_SPLIT, ZFLUX_LW_SPLIT ,                     &
+            ZDTLW_CS_SPLIT, ZDTSW_CS_SPLIT, ZFLUX_TOP_GND_IRVISNIR_CS_SPLIT,             &
+            ZFLUX_SW_DOWN_CS_SPLIT, ZFLUX_SW_UP_CS_SPLIT, ZFLUX_LW_CS_SPLIT,             &           
+            ZPLAN_ALB_VIS_SPLIT,ZPLAN_ALB_NIR_SPLIT, ZPLAN_TRA_VIS_SPLIT, ZPLAN_TRA_NIR_SPLIT, &
+            ZPLAN_ABS_VIS_SPLIT, ZPLAN_ABS_NIR_SPLIT,ZEFCL_LWD_SPLIT, ZEFCL_LWU_SPLIT,         &
+            ZFLWP_SPLIT, ZFIWP_SPLIT,ZRADLP_SPLIT, ZRADIP_SPLIT, &
+            ZEFCL_RRTM_SPLIT,  ZCLSW_TOTAL_SPLIT,  ZTAU_TOTAL_SPLIT,  &
+            ZOMEGA_TOTAL_SPLIT,ZCG_TOTAL_SPLIT,                                    &
+            GAOP, ZPIZA_EQ_SPLIT,ZCGA_EQ_SPLIT,ZTAUREL_EQ_SPLIT,ZLAT_SPLIT,ZLON_SPLIT    )
+  END IF              
+  ELSE
+! C2R2 concentrations
+    IF (SIZE (ZCCT_C2R2) > 0)  ZCCT_C2R2_SPLIT(:,:) = ZCCT_C2R2 (IBEG:IEND ,:)
+    IF (SIZE (ZCRT_C2R2) > 0)  ZCRT_C2R2_SPLIT(:,:) = ZCRT_C2R2 (IBEG:IEND ,:)  
+    IF (SIZE (ZCIT_C1R3) > 0)  ZCIT_C1R3_SPLIT(:,:) = ZCIT_C1R3 (IBEG:IEND ,:)
+    IF (CRAD == "ECMW") THEN   
+        CALL ECMWF_RADIATION_VERS2  ( IDIM_EFF , KFLEV, KRAD_DIAG, KAER,              &    
+                ZDZ_SPLIT,HEFRADL,HEFRADI,HOPWSW, HOPISW, HOPWLW, HOPILW,PFUDG,                    &
+                ZRII0, ZAER_SPLIT , ZALBD_SPLIT, ZALBP_SPLIT, ZPRES_HL_SPLIT,            &
+                ZPAVE_SPLIT,PCCO2, ZCFAVE_SPLIT, ZDPRES_SPLIT, ZEMIS_SPLIT, ZEMIW_SPLIT, &
+                ZLSM_SPLIT, ZRMU0_SPLIT,ZO3AVE_SPLIT , ZQVAVE_SPLIT, ZQIAVE_SPLIT ,ZQIWC_SPLIT,      & 
+                ZQLAVE_SPLIT,ZQLWC_SPLIT,ZQSAVE_SPLIT, ZQRAVE_SPLIT,ZQRWC_SPLIT,  ZT_HL_SPLIT,      &
+                ZTAVE_SPLIT, ZTS_SPLIT, ZCCT_C2R2_SPLIT,ZCRT_C2R2_SPLIT,ZCIT_C1R3_SPLIT, & 
+                ZNFLW_CS_SPLIT, ZNFLW_SPLIT, ZNFSW_CS_SPLIT,ZNFSW_SPLIT,                 &          
+                ZDTLW_SPLIT, ZDTSW_SPLIT, ZFLUX_TOP_GND_IRVISNIR_SPLIT,                  &
+                ZSFSWDIR_SPLIT, ZSFSWDIF_SPLIT,                                          &
+                ZFLUX_SW_DOWN_SPLIT, ZFLUX_SW_UP_SPLIT, ZFLUX_LW_SPLIT ,                 &
+                ZDTLW_CS_SPLIT, ZDTSW_CS_SPLIT, ZFLUX_TOP_GND_IRVISNIR_CS_SPLIT,         &
+                ZFLUX_SW_DOWN_CS_SPLIT, ZFLUX_SW_UP_CS_SPLIT, ZFLUX_LW_CS_SPLIT,         & 
+                ZPLAN_ALB_VIS_SPLIT,ZPLAN_ALB_NIR_SPLIT, ZPLAN_TRA_VIS_SPLIT,            &
+                ZPLAN_TRA_NIR_SPLIT, ZPLAN_ABS_VIS_SPLIT, ZPLAN_ABS_NIR_SPLIT,           &
+                ZEFCL_LWD_SPLIT, ZEFCL_LWU_SPLIT, ZFLWP_SPLIT,ZFIWP_SPLIT,               &
+                ZRADLP_SPLIT,ZRADIP_SPLIT,ZEFCL_RRTM_SPLIT, ZCLSW_TOTAL_SPLIT,           &
+                ZTAU_TOTAL_SPLIT,ZOMEGA_TOTAL_SPLIT, ZCG_TOTAL_SPLIT,                    &
+                GAOP,ZPIZA_EQ_SPLIT,ZCGA_EQ_SPLIT,ZTAUREL_EQ_SPLIT  )
+         
+    ELSE IF (CRAD == "ECRA") THEN  
+       CALL ECRAD_INTERFACE  ( IDIM_EFF ,KFLEV, KRAD_DIAG, KAER,                   &      
+            ZDZ_SPLIT,HEFRADL,HEFRADI,HOPWSW, HOPISW, HOPWLW, HOPILW,PFUDG,      &
+            ZRII0, ZAER_SPLIT , ZALBD_SPLIT, ZALBP_SPLIT, ZPRES_HL_SPLIT, ZPAVE_SPLIT,               &
+            PCCO2, ZCFAVE_SPLIT, ZDPRES_SPLIT, ZEMIS_SPLIT, ZEMIW_SPLIT, ZLSM_SPLIT, ZRMU0_SPLIT,          &
+            ZO3AVE_SPLIT , ZQVAVE_SPLIT, ZQIAVE_SPLIT ,ZQIWC_SPLIT,ZQLAVE_SPLIT,ZQLWC_SPLIT, &
+            ZQSAVE_SPLIT, ZQRAVE_SPLIT,  ZQRWC_SPLIT,  &
+            ZT_HL_SPLIT,ZTAVE_SPLIT, ZTS_SPLIT, ZCCT_C2R2_SPLIT, &
+            ZCRT_C2R2_SPLIT, ZCIT_C1R3_SPLIT,         &
+            ZNFLW_SPLIT, ZNFSW_SPLIT, ZNFLW_CS_SPLIT, ZNFSW_CS_SPLIT,                           &
+            ZDTLW_SPLIT, ZDTSW_SPLIT, ZFLUX_TOP_GND_IRVISNIR_SPLIT,                      &
+            ZSFSWDIR_SPLIT, ZSFSWDIF_SPLIT,                                        &
+            ZFLUX_SW_DOWN_SPLIT, ZFLUX_SW_UP_SPLIT, ZFLUX_LW_SPLIT ,                     &
+            ZDTLW_CS_SPLIT, ZDTSW_CS_SPLIT, ZFLUX_TOP_GND_IRVISNIR_CS_SPLIT,             &
+            ZFLUX_SW_DOWN_CS_SPLIT, ZFLUX_SW_UP_CS_SPLIT, ZFLUX_LW_CS_SPLIT,             &           
+            ZPLAN_ALB_VIS_SPLIT,ZPLAN_ALB_NIR_SPLIT, ZPLAN_TRA_VIS_SPLIT, ZPLAN_TRA_NIR_SPLIT, &
+            ZPLAN_ABS_VIS_SPLIT, ZPLAN_ABS_NIR_SPLIT,ZEFCL_LWD_SPLIT, ZEFCL_LWU_SPLIT,         &
+            ZFLWP_SPLIT, ZFIWP_SPLIT,ZRADLP_SPLIT, ZRADIP_SPLIT, &
+            ZEFCL_RRTM_SPLIT,  ZCLSW_TOTAL_SPLIT,  ZTAU_TOTAL_SPLIT,  &
+            ZOMEGA_TOTAL_SPLIT,ZCG_TOTAL_SPLIT,                                    &
+            GAOP, ZPIZA_EQ_SPLIT,ZCGA_EQ_SPLIT,ZTAUREL_EQ_SPLIT,ZLAT_SPLIT,ZLON_SPLIT    )
+    END IF                   
+    END IF 
+!
+! fill the full output arrays with the split arrays
+!
+    ZDTLW( IBEG:IEND ,:)  =  ZDTLW_SPLIT(:,:)  
+    ZDTSW( IBEG:IEND ,:)  =  ZDTSW_SPLIT(:,:) 
+    ZFLUX_TOP_GND_IRVISNIR( IBEG:IEND ,:)=  ZFLUX_TOP_GND_IRVISNIR_SPLIT(:,:) 
+    ZSFSWDIR (IBEG:IEND,:)  = ZSFSWDIR_SPLIT(:,:)
+    ZSFSWDIF (IBEG:IEND,:)  = ZSFSWDIF_SPLIT(:,:)
+!
+    ZDTLW_CS( IBEG:IEND ,:) =  ZDTLW_CS_SPLIT(:,:)
+    ZDTSW_CS( IBEG:IEND ,:) =  ZDTSW_CS_SPLIT(:,:)
+    ZFLUX_TOP_GND_IRVISNIR_CS( IBEG:IEND ,:) =                     &
+         ZFLUX_TOP_GND_IRVISNIR_CS_SPLIT(:,:)
+    ZFLUX_LW( IBEG:IEND ,:,:)    =  ZFLUX_LW_SPLIT(:,:,:) 
+    ZFLUX_SW_DOWN( IBEG:IEND ,:) =  ZFLUX_SW_DOWN_SPLIT(:,:)
+    ZFLUX_SW_UP( IBEG:IEND ,:)   =  ZFLUX_SW_UP_SPLIT(:,:)
+    ZRADLP( IBEG:IEND ,:) = ZRADLP_SPLIT(:,:)
+    IF ( tpfile%lopened ) THEN
+      IF( KRAD_DIAG >= 1) THEN
+        ZNFLW(IBEG:IEND ,:)= ZNFLW_SPLIT(:,:)
+        ZNFSW(IBEG:IEND ,:)= ZNFSW_SPLIT(:,:)
+        IF( KRAD_DIAG >= 2) THEN
+          ZFLUX_SW_DOWN_CS( IBEG:IEND ,:) = ZFLUX_SW_DOWN_CS_SPLIT(:,:)
+          ZFLUX_SW_UP_CS( IBEG:IEND ,:)   = ZFLUX_SW_UP_CS_SPLIT(:,:)
+          ZFLUX_LW_CS( IBEG:IEND ,:,:)    = ZFLUX_LW_CS_SPLIT(:,:,:)
+          ZNFLW_CS(IBEG:IEND ,:)= ZNFLW_CS_SPLIT(:,:)
+          ZNFSW_CS(IBEG:IEND ,:)= ZNFSW_CS_SPLIT(:,:)
+          IF( KRAD_DIAG >= 3) THEN
+            ZPLAN_ALB_VIS( IBEG:IEND ) = ZPLAN_ALB_VIS_SPLIT(:)
+            ZPLAN_ALB_NIR( IBEG:IEND ) = ZPLAN_ALB_NIR_SPLIT(:)
+            ZPLAN_TRA_VIS( IBEG:IEND ) = ZPLAN_TRA_VIS_SPLIT(:)
+            ZPLAN_TRA_NIR( IBEG:IEND ) = ZPLAN_TRA_NIR_SPLIT(:)
+            ZPLAN_ABS_VIS( IBEG:IEND ) = ZPLAN_ABS_VIS_SPLIT(:)
+            ZPLAN_ABS_NIR( IBEG:IEND ) = ZPLAN_ABS_NIR_SPLIT(:)          
+            IF( KRAD_DIAG >= 4) THEN
+              ZEFCL_LWD( IBEG:IEND ,:) = ZEFCL_LWD_SPLIT(:,:)
+              ZEFCL_LWU( IBEG:IEND ,:)   = ZEFCL_LWU_SPLIT(:,:)
+              ZFLWP( IBEG:IEND ,:) = ZFLWP_SPLIT(:,:)
+              ZFIWP( IBEG:IEND ,:) = ZFIWP_SPLIT(:,:)
+              ZRADIP( IBEG:IEND ,:) = ZRADIP_SPLIT(:,:)
+              ZEFCL_RRTM( IBEG:IEND ,:) = ZEFCL_RRTM_SPLIT(:,:)
+              ZCLSW_TOTAL( IBEG:IEND ,:) = ZCLSW_TOTAL_SPLIT(:,:)
+              ZTAU_TOTAL( IBEG:IEND ,:,:)  = ZTAU_TOTAL_SPLIT(:,:,:)
+              ZOMEGA_TOTAL( IBEG:IEND ,:,:)= ZOMEGA_TOTAL_SPLIT(:,:,:)
+              ZCG_TOTAL( IBEG:IEND ,:,:)   = ZCG_TOTAL_SPLIT(:,:,:)                
+            END IF
+          END IF
+        END IF
+      END IF
+    END IF
+!
+    IDIM_RESIDUE = IDIM_RESIDUE - IDIM_EFF
+!
+! desallocation of the split arrays
+!
+    IF( JI_SPLIT >= INUM_CALL-1 ) THEN
+      DEALLOCATE(  ZALBP_SPLIT )
+      DEALLOCATE(  ZALBD_SPLIT )  
+      DEALLOCATE(  ZEMIS_SPLIT  )
+      DEALLOCATE(  ZEMIW_SPLIT  )
+      DEALLOCATE(  ZLAT_SPLIT  )
+      DEALLOCATE(  ZLON_SPLIT  )
+      DEALLOCATE(  ZRMU0_SPLIT      )
+      DEALLOCATE(  ZCFAVE_SPLIT     )
+      DEALLOCATE(  ZO3AVE_SPLIT     )
+      DEALLOCATE(  ZT_HL_SPLIT      )
+      DEALLOCATE(  ZPRES_HL_SPLIT   )
+      DEALLOCATE(  ZDZ_SPLIT     )
+      DEALLOCATE(  ZQLAVE_SPLIT     )
+      DEALLOCATE(  ZQIAVE_SPLIT     )
+      DEALLOCATE(  ZQVAVE_SPLIT     )
+      DEALLOCATE(  ZTAVE_SPLIT      )
+      DEALLOCATE(  ZPAVE_SPLIT      )
+      DEALLOCATE(  ZAER_SPLIT       )
+      DEALLOCATE(  ZDPRES_SPLIT     )
+      DEALLOCATE(  ZLSM_SPLIT       )
+      DEALLOCATE(  ZQSAVE_SPLIT     )
+      DEALLOCATE(  ZQRAVE_SPLIT  )
+      DEALLOCATE(  ZQLWC_SPLIT     )
+      DEALLOCATE(  ZQRWC_SPLIT     )
+      DEALLOCATE(  ZQIWC_SPLIT     )
+      IF ( ALLOCATED( ZCCT_C2R2_SPLIT ) ) DEALLOCATE(   ZCCT_C2R2_SPLIT  )
+      IF ( ALLOCATED( ZCRT_C2R2_SPLIT ) ) DEALLOCATE(   ZCRT_C2R2_SPLIT  )
+      IF ( ALLOCATED( ZCIT_C1R3_SPLIT ) ) DEALLOCATE(   ZCIT_C1R3_SPLIT  )
+      IF ( ALLOCATED( ZCCT_LIMA_SPLIT ) ) DEALLOCATE(   ZCCT_LIMA_SPLIT  )
+      IF ( ALLOCATED( ZCRT_LIMA_SPLIT ) ) DEALLOCATE(   ZCRT_LIMA_SPLIT  )
+      IF ( ALLOCATED( ZCIT_LIMA_SPLIT ) ) DEALLOCATE(   ZCIT_LIMA_SPLIT  )
+      DEALLOCATE(  ZTS_SPLIT    )
+      DEALLOCATE(   ZNFLW_CS_SPLIT)
+      DEALLOCATE(   ZNFLW_SPLIT)
+      DEALLOCATE(   ZNFSW_CS_SPLIT)
+      DEALLOCATE(   ZNFSW_SPLIT)
+      DEALLOCATE(ZDTLW_SPLIT)
+      DEALLOCATE(ZDTSW_SPLIT)
+      DEALLOCATE(ZFLUX_TOP_GND_IRVISNIR_SPLIT)
+      DEALLOCATE(ZSFSWDIR_SPLIT)
+      DEALLOCATE(ZSFSWDIF_SPLIT)
+      DEALLOCATE(ZFLUX_SW_DOWN_SPLIT)
+      DEALLOCATE(ZFLUX_SW_UP_SPLIT)
+      DEALLOCATE(ZFLUX_LW_SPLIT)
+      DEALLOCATE(ZDTLW_CS_SPLIT)
+      DEALLOCATE(ZDTSW_CS_SPLIT)
+      DEALLOCATE(ZFLUX_TOP_GND_IRVISNIR_CS_SPLIT)
+      DEALLOCATE(ZPLAN_ALB_VIS_SPLIT)
+      DEALLOCATE(ZPLAN_ALB_NIR_SPLIT)
+      DEALLOCATE(ZPLAN_TRA_VIS_SPLIT)
+      DEALLOCATE(ZPLAN_TRA_NIR_SPLIT)
+      DEALLOCATE(ZPLAN_ABS_VIS_SPLIT)
+      DEALLOCATE(ZPLAN_ABS_NIR_SPLIT)
+      DEALLOCATE(ZEFCL_LWD_SPLIT)
+      DEALLOCATE(ZEFCL_LWU_SPLIT)
+      DEALLOCATE(ZFLWP_SPLIT)
+      DEALLOCATE(ZRADLP_SPLIT)
+      DEALLOCATE(ZRADIP_SPLIT)
+      DEALLOCATE(ZFIWP_SPLIT)
+      DEALLOCATE(ZEFCL_RRTM_SPLIT)
+      DEALLOCATE(ZCLSW_TOTAL_SPLIT)
+      DEALLOCATE(ZTAU_TOTAL_SPLIT)
+      DEALLOCATE(ZOMEGA_TOTAL_SPLIT)
+      DEALLOCATE(ZCG_TOTAL_SPLIT)
+      DEALLOCATE(ZFLUX_SW_DOWN_CS_SPLIT)
+      DEALLOCATE(ZFLUX_SW_UP_CS_SPLIT)
+      DEALLOCATE(ZFLUX_LW_CS_SPLIT)
+      DEALLOCATE(ZPIZA_EQ_SPLIT)
+      DEALLOCATE(ZCGA_EQ_SPLIT)
+      DEALLOCATE(ZTAUREL_EQ_SPLIT)
+    END IF
+  END DO
+END IF
+
+!
+DEALLOCATE(ZTAVE)
+DEALLOCATE(ZPAVE)
+DEALLOCATE(ZQVAVE)
+DEALLOCATE(ZQLAVE)
+DEALLOCATE(ZDZ)
+DEALLOCATE(ZQIAVE)
+DEALLOCATE(ZCFAVE)
+DEALLOCATE(ZPRES_HL)
+DEALLOCATE(ZT_HL)
+DEALLOCATE(ZRMU0) 
+DEALLOCATE(ZLSM)
+DEALLOCATE(ZQSAVE)
+DEALLOCATE(ZAER)
+DEALLOCATE(ZPIZA_EQ)
+DEALLOCATE(ZCGA_EQ)
+DEALLOCATE(ZTAUREL_EQ)
+DEALLOCATE(ZDPRES)
+DEALLOCATE(ZCCT_C2R2)
+DEALLOCATE(ZCRT_C2R2)
+DEALLOCATE(ZCIT_C1R3)
+DEALLOCATE(ZLAT)
+DEALLOCATE(ZLON)
+IF (CCLOUD == 'LIMA') THEN 
+  DEALLOCATE(ZCCT_LIMA)
+  DEALLOCATE(ZCRT_LIMA)
+  DEALLOCATE(ZCIT_LIMA)
+END IF
+!
+DEALLOCATE(ZTS)
+DEALLOCATE(ZALBP)
+DEALLOCATE(ZALBD)
+DEALLOCATE(ZEMIS)
+DEALLOCATE(ZEMIW)
+DEALLOCATE(ZQRAVE)
+DEALLOCATE(ZQLWC)
+DEALLOCATE(ZQIWC)
+DEALLOCATE(ZQRWC)
+DEALLOCATE(ICLEAR_2D_TM1)
+!
+!*       5.6   UNCOMPRESSES THE OUTPUT FIELD IN CASE OF 
+!                      CLEAR-SKY APPROXIMATION
+!
+IF(OCLEAR_SKY .OR. OCLOUD_ONLY) THEN
+  ALLOCATE(ZWORK1(ICLOUD))
+  ALLOCATE(ZWORK2(ICLOUD+KFLEV)) !       allocation for the KFLEV levels of 
+  ALLOCATE(ZWORK4(KFLEV,KDLON))
+  ZWORK2(:) = PACK( TRANSPOSE(ZDTLW(:,:)),MASK=.TRUE. )
+!
+  DO JK=1,KFLEV
+    ZWORK4(JK,:) = ZWORK2(ICLOUD+JK)
+  END DO
+  ZWORK1(1:ICLOUD) = ZWORK2(1:ICLOUD)
+  ZZDTLW(:,:) = TRANSPOSE( UNPACK( ZWORK1(:),MASK=GCLOUDT(:,:)   &
+       ,FIELD=ZWORK4(:,:) ) )
+  !
+  ZWORK2(:) = PACK( TRANSPOSE(ZDTSW(:,:)),MASK=.TRUE. )
+  DO JK=1,KFLEV
+    ZWORK4(JK,:) = ZWORK2(ICLOUD+JK)
+  END DO
+  ZWORK1(1:ICLOUD) = ZWORK2(1:ICLOUD)
+  ZZDTSW(:,:) = TRANSPOSE( UNPACK( ZWORK1(:),MASK=GCLOUDT(:,:)   &
+       ,FIELD=ZWORK4(:,:) ) )
+  !
+  DEALLOCATE(ZWORK1)
+  DEALLOCATE(ZWORK2)
+  DEALLOCATE(ZWORK4)
+  !
+  ZZTGVISC   = ZFLUX_TOP_GND_IRVISNIR(ICLOUD_COL+1,5)
+  !
+  ZZTGVIS(:) = UNPACK( ZFLUX_TOP_GND_IRVISNIR(:,5),MASK=.NOT.GCLEAR_2D(:), &
+       FIELD=ZZTGVISC  )
+  ZZTGNIRC   = ZFLUX_TOP_GND_IRVISNIR(ICLOUD_COL+1,6)
+  !
+  ZZTGNIR(:) = UNPACK( ZFLUX_TOP_GND_IRVISNIR(:,6),MASK=.NOT.GCLEAR_2D(:), &
+       FIELD=ZZTGNIRC )
+  ZZTGIRC    = ZFLUX_TOP_GND_IRVISNIR(ICLOUD_COL+1,4)
+  !
+  ZZTGIR (:) = UNPACK( ZFLUX_TOP_GND_IRVISNIR(:,4),MASK=.NOT.GCLEAR_2D(:), &
+       FIELD=ZZTGIRC  )
+  !
+  DO JSWB=1,ISWB
+    ZZSFSWDIRC(JSWB) = ZSFSWDIR (ICLOUD_COL+1,JSWB)
+    !
+    ZZSFSWDIR(:,JSWB) =  UNPACK(ZSFSWDIR (:,JSWB),MASK=.NOT.GCLEAR_2D(:), &
+         FIELD= ZZSFSWDIRC(JSWB)  ) 
+    !
+    ZZSFSWDIFC(JSWB) = ZSFSWDIF (ICLOUD_COL+1,JSWB)
+    !
+    ZZSFSWDIF(:,JSWB) =  UNPACK(ZSFSWDIF (:,JSWB),MASK=.NOT.GCLEAR_2D(:), &
+         FIELD= ZZSFSWDIFC(JSWB)  )
+  END DO
+!
+!  No cloud case
+!
+  IF( GNOCL ) THEN
+          IF (SIZE(ZZDTLW,1)>1) THEN
+             ZZDTLW(1,:)= ZZDTLW(2,:)
+          ENDIF
+          IF (SIZE(ZZDTSW,1)>1) THEN
+             ZZDTSW(1,:)= ZZDTSW(2,:)
+          ENDIF
+    ZZTGVIS(1) = ZZTGVISC
+    ZZTGNIR(1) = ZZTGNIRC
+    ZZTGIR(1)  = ZZTGIRC
+    ZZSFSWDIR(1,:) =  ZZSFSWDIRC(:)
+    ZZSFSWDIF(1,:) =  ZZSFSWDIFC(:)
+  END IF
+ELSE
+  ZZDTLW(:,:) = ZDTLW(:,:)
+  ZZDTSW(:,:) = ZDTSW(:,:)
+  ZZTGVIS(:)  = ZFLUX_TOP_GND_IRVISNIR(:,5)
+  ZZTGNIR(:)  = ZFLUX_TOP_GND_IRVISNIR(:,6)
+  ZZTGIR(:)   = ZFLUX_TOP_GND_IRVISNIR(:,4)
+  ZZSFSWDIR(:,:) =  ZSFSWDIR(:,:)
+  ZZSFSWDIF(:,:) =  ZSFSWDIF(:,:) 
+END IF
+!
+DEALLOCATE(ZDTLW)
+DEALLOCATE(ZDTSW)
+DEALLOCATE(ZSFSWDIR)
+DEALLOCATE(ZSFSWDIF)
+!
+!--------------------------------------------------------------------------------------------
+!
+!*       6.    COMPUTES THE RADIATIVE SOURCES AND THE DOWNWARD SURFACE FLUXES in 2D horizontal 
+!              ------------------------------------------------------------------------------
+!
+!  Computes the SW and LW radiative tendencies
+!  note : tendencies in K/s for MNH (from K/day)
+!
+ZDTRAD_LW(:,:,:)=0.0
+ZDTRAD_SW(:,:,:)=0.0
+DO JK=IKB,IKE
+  JKRAD= JK-JPVEXT
+  DO JJ=IJB,IJE
+    DO JI=IIB,IIE
+      IIJ = 1 + (JI-IIB) + (IIE-IIB+1)*(JJ-IJB)
+      ZDTRAD_LW(JI,JJ,JK) = ZZDTLW(IIJ,JKRAD)/XDAY  ! XDAY from  modd_cst (day duration in s)
+      ZDTRAD_SW(JI,JJ,JK) = ZZDTSW(IIJ,JKRAD)/XDAY      
+    END DO
+  END DO
+END DO
+!
+!  Computes the downward SW and LW surface fluxes + diffuse and direct contribution
+!
+ZLWD(:,:)=0.
+ZSWDDIR(:,:,:)=0.
+ZSWDDIF(:,:,:)=0.
+!
+DO JJ=IJB,IJE
+  DO JI=IIB,IIE
+    IIJ = 1 + (JI-IIB) + (IIE-IIB+1)*(JJ-IJB)
+    ZLWD(JI,JJ) = ZZTGIR(IIJ)
+    ZSWDDIR(JI,JJ,:) = ZZSFSWDIR (IIJ,:)
+    ZSWDDIF(JI,JJ,:) = ZZSFSWDIF (IIJ,:)
+  END DO
+END DO
+!
+!final  THETA_radiative tendency and surface fluxes 
+!
+IF(OCLOUD_ONLY) THEN
+
+  GCLOUD_SURF(:,:) = .FALSE.
+  DO JJ=IJB,IJE
+    DO JI=IIB,IIE
+        IIJ = 1 + (JI-IIB) + (IIE-IIB+1)*(JJ-IJB)
+        GCLOUD_SURF(JI,JJ) = GCLOUD(IIJ,1)
+    END DO
+  END DO
+ 
+  ZWORKL(:,:) = GCLOUD_SURF(:,:)
+
+  DO JK = IKB,IKE
+    WHERE( ZWORKL(:,:) )
+      PDTHRAD(:,:,JK) = (ZDTRAD_LW(:,:,JK)+ZDTRAD_SW(:,:,JK))/ZEXNT(:,:,JK)
+    ENDWHERE
+  END DO
+  !
+  WHERE( ZWORKL(:,:) )
+    PSRFLWD(:,:) = ZLWD(:,:)
+  ENDWHERE
+  DO JSWB=1,ISWB
+    WHERE( ZWORKL(:,:) )
+      PSRFSWD_DIR (:,:,JSWB) = ZSWDDIR(:,:,JSWB)
+      PSRFSWD_DIF (:,:,JSWB) = ZSWDDIF(:,:,JSWB)
+    END WHERE
+  END DO
+ELSE
+  PDTHRAD(:,:,:) = (ZDTRAD_LW(:,:,:)+ZDTRAD_SW(:,:,:))/ZEXNT(:,:,:)  ! tendency in potential temperature
+  PDTHRADSW(:,:,:) = ZDTRAD_SW(:,:,:)/ZEXNT(:,:,:)
+  PDTHRADLW(:,:,:) = ZDTRAD_LW(:,:,:)/ZEXNT(:,:,:)
+  PSRFLWD(:,:) = ZLWD(:,:)
+  DO JSWB=1,ISWB
+    PSRFSWD_DIR (:,:,JSWB) = ZSWDDIR(:,:,JSWB)
+    PSRFSWD_DIF (:,:,JSWB) = ZSWDDIF(:,:,JSWB)
+  END DO
+!
+!sw and lw fluxes 
+!
+  DO JK=IKB,IKE
+   JKRAD = JK - JPVEXT
+   DO JJ=IJB,IJE
+    DO JI=IIB,IIE
+          IIJ = 1 + (JI-IIB) + (IIE-IIB+1)*(JJ-IJB)
+          PSWU(JI,JJ,JK) = ZFLUX_SW_UP(IIJ,JKRAD)
+          PSWD(JI,JJ,JK) = ZFLUX_SW_DOWN(IIJ,JKRAD)
+          PLWU(JI,JJ,JK) = ZFLUX_LW(IIJ,1,JKRAD)
+          PLWD(JI,JJ,JK) = -ZFLUX_LW(IIJ,2,JKRAD)  ! in ECMWF all fluxes are upward
+    END DO
+   END DO
+  END DO
+!!!effective radius
+  DO JK=IKB,IKE
+   JKRAD = JK - JPVEXT
+   DO JJ=IJB,IJE
+    DO JI=IIB,IIE
+          IIJ = 1 + (JI-IIB) + (IIE-IIB+1)*(JJ-IJB)
+          PRADEFF(JI,JJ,JK) = ZRADLP(IIJ,JKRAD)
+    END DO
+   END DO
+  END DO
+END IF
+!
+!
+!-------------------------------------------------------------------------------
+!
+!*       7.    STORE SOME ADDITIONNAL RADIATIVE FIELDS
+!              ---------------------------------------
+!
+IF( tpfile%lopened .AND. (KRAD_DIAG >= 1) ) THEN
+  ZSTORE_3D(:,:,:) = 0.0
+  ZSTORE_3D2(:,:,:) = 0.0
+  ZSTORE_2D(:,:)   = 0.0
+  !
+  TZFIELD2D = TFIELDMETADATA(                 &
+    CMNHNAME   = 'generic 2D for radiations', & !Temporary name to ease identification
+    CSTDNAME   = '',                          &
+    CDIR       = 'XY',                        &
+    NGRID      = 1,                           &
+    NTYPE      = TYPEREAL,                    &
+    NDIMS      = 2,                           &
+    LTIMEDEP   = .TRUE.                       )
+
+  TZFIELD3D = TFIELDMETADATA(                 &
+    CMNHNAME   = 'generic 3D for radiations', & !Temporary name to ease identification
+    CSTDNAME   = '',                          &
+    CDIR       = 'XY',                        &
+    NGRID      = 1,                           &
+    NTYPE      = TYPEREAL,                    &
+    NDIMS      = 3,                           &
+    LTIMEDEP   = .TRUE.                       )
+
+  IF( KRAD_DIAG >= 1) THEN
+    !
+    ILUOUT = TLUOUT%NLU
+    WRITE(UNIT=ILUOUT,FMT='(/," STORE ADDITIONNAL RADIATIVE FIELDS:", &
+         & " KRAD_DIAG=",I1,/)') KRAD_DIAG
+    DO JK=IKB,IKE
+      JKRAD = JK - JPVEXT
+      DO JJ=IJB,IJE
+        DO JI=IIB,IIE
+          IIJ = 1 + (JI-IIB) + (IIE-IIB+1)*(JJ-IJB)
+          ZSTORE_3D(JI,JJ,JK) = ZFLUX_SW_DOWN(IIJ,JKRAD)
+        END DO
+      END DO
+    END DO
+    TZFIELD3D%CMNHNAME   = 'SWF_DOWN'
+    TZFIELD3D%CLONGNAME  = 'SWF_DOWN'
+    TZFIELD3D%CUNITS     = 'W m-2'
+    TZFIELD3D%CCOMMENT   = 'X_Y_Z_SWF_DOWN'
+    CALL IO_Field_write(TPFILE,TZFIELD3D,ZSTORE_3D)
+!
+    DO JK=IKB,IKE
+      JKRAD = JK - JPVEXT
+      DO JJ=IJB,IJE
+        DO JI=IIB,IIE
+          IIJ = 1 + (JI-IIB) + (IIE-IIB+1)*(JJ-IJB)
+          ZSTORE_3D(JI,JJ,JK) = ZFLUX_SW_UP(IIJ,JKRAD)
+        END DO
+      END DO
+    END DO
+    TZFIELD3D%CMNHNAME   = 'SWF_UP'
+    TZFIELD3D%CLONGNAME  = 'SWF_UP'
+    TZFIELD3D%CUNITS     = 'W m-2'
+    TZFIELD3D%CCOMMENT   = 'X_Y_Z_SWF_UP'
+    CALL IO_Field_write(TPFILE,TZFIELD3D,ZSTORE_3D)
+!
+    DO JK=IKB,IKE
+      JKRAD = JK - JPVEXT
+      DO JJ=IJB,IJE
+        DO JI=IIB,IIE
+          IIJ = 1 + (JI-IIB) + (IIE-IIB+1)*(JJ-IJB)
+          ZSTORE_3D(JI,JJ,JK) = -ZFLUX_LW(IIJ,2,JKRAD)
+        END DO
+      END DO
+    END DO
+    TZFIELD3D%CMNHNAME   = 'LWF_DOWN'
+    TZFIELD3D%CLONGNAME  = 'LWF_DOWN'
+    TZFIELD3D%CUNITS     = 'W m-2'
+    TZFIELD3D%CCOMMENT   = 'X_Y_Z_LWF_DOWN'
+    CALL IO_Field_write(TPFILE,TZFIELD3D,ZSTORE_3D)
+!
+    DO JK=IKB,IKE
+      JKRAD = JK - JPVEXT
+      DO JJ=IJB,IJE
+        DO JI=IIB,IIE
+          IIJ = 1 + (JI-IIB) + (IIE-IIB+1)*(JJ-IJB)
+          ZSTORE_3D(JI,JJ,JK) = ZFLUX_LW(IIJ,1,JKRAD)
+        END DO
+      END DO
+    END DO
+    TZFIELD3D%CMNHNAME   = 'LWF_UP'
+    TZFIELD3D%CLONGNAME  = 'LWF_UP'
+    TZFIELD3D%CUNITS     = 'W m-2'
+    TZFIELD3D%CCOMMENT   = 'X_Y_Z_LWF_UP'
+    CALL IO_Field_write(TPFILE,TZFIELD3D,ZSTORE_3D)
+!
+    DO JK=IKB,IKE
+      JKRAD = JK - JPVEXT
+      DO JJ=IJB,IJE
+        DO JI=IIB,IIE
+          IIJ = 1 + (JI-IIB) + (IIE-IIB+1)*(JJ-IJB)
+          ZSTORE_3D(JI,JJ,JK) = ZNFLW(IIJ,JKRAD)
+        END DO
+      END DO
+    END DO
+    TZFIELD3D%CMNHNAME   = 'LWF_NET'
+    TZFIELD3D%CLONGNAME  = 'LWF_NET'
+    TZFIELD3D%CUNITS     = 'W m-2'
+    TZFIELD3D%CCOMMENT   = 'X_Y_Z_LWF_NET'
+    CALL IO_Field_write(TPFILE,TZFIELD3D,ZSTORE_3D)
+!
+    DO JK=IKB,IKE
+      JKRAD = JK - JPVEXT
+      DO JJ=IJB,IJE
+        DO JI=IIB,IIE
+          IIJ = 1 + (JI-IIB) + (IIE-IIB+1)*(JJ-IJB)
+          ZSTORE_3D(JI,JJ,JK) = ZNFSW(IIJ,JKRAD)
+        END DO
+      END DO
+    END DO
+    TZFIELD3D%CMNHNAME   = 'SWF_NET'
+    TZFIELD3D%CLONGNAME  = 'SWF_NET'
+    TZFIELD3D%CUNITS     = 'W m-2'
+    TZFIELD3D%CCOMMENT   = 'X_Y_Z_SWF_NET'
+    CALL IO_Field_write(TPFILE,TZFIELD3D,ZSTORE_3D)
+!
+    DO JK=IKB,IKE
+      DO JJ=IJB,IJE
+        DO JI=IIB,IIE
+          ZSTORE_3D(JI,JJ,JK) = ZDTRAD_LW (JI,JJ,JK)*XDAY
+        END DO
+      END DO
+    END DO
+    TZFIELD3D%CMNHNAME   = 'DTRAD_LW'
+    TZFIELD3D%CLONGNAME  = 'DTRAD_LW'
+    TZFIELD3D%CUNITS     = 'K day-1'
+    TZFIELD3D%CCOMMENT   = 'X_Y_Z_DTRAD_LW'
+    CALL IO_Field_write(TPFILE,TZFIELD3D,ZSTORE_3D)
+!
+    DO JK=IKB,IKE
+      DO JJ=IJB,IJE
+        DO JI=IIB,IIE
+          ZSTORE_3D(JI,JJ,JK) = ZDTRAD_SW (JI,JJ,JK)*XDAY
+        END DO
+      END DO
+    END DO
+    TZFIELD3D%CMNHNAME   = 'DTRAD_SW'
+    TZFIELD3D%CLONGNAME  = 'DTRAD_SW'
+    TZFIELD3D%CUNITS     = 'K day-1'
+    TZFIELD3D%CCOMMENT   = 'X_Y_Z_DTRAD_SW'
+    CALL IO_Field_write(TPFILE,TZFIELD3D,ZSTORE_3D)
+!
+    DO JJ=IJB,IJE
+      DO JI=IIB,IIE
+        IIJ = 1 + (JI-IIB) + (IIE-IIB+1)*(JJ-IJB)
+        ZSTORE_2D(JI,JJ) = ZFLUX_TOP_GND_IRVISNIR(IIJ,5)
+      END DO
+    END DO
+    TZFIELD2D%CMNHNAME   = 'RADSWD_VIS'
+    TZFIELD2D%CLONGNAME  = 'RADSWD_VIS'
+    TZFIELD2D%CUNITS     = ''
+    TZFIELD2D%CCOMMENT   = 'X_Y_RADSWD_VIS'
+    CALL IO_Field_write(TPFILE,TZFIELD2D,ZSTORE_2D)
+!
+    DO JJ=IJB,IJE
+      DO JI=IIB,IIE
+        IIJ = 1 + (JI-IIB) + (IIE-IIB+1)*(JJ-IJB)
+        ZSTORE_2D(JI,JJ) = ZFLUX_TOP_GND_IRVISNIR(IIJ,6)
+      END DO
+    END DO
+    TZFIELD2D%CMNHNAME   = 'RADSWD_NIR'
+    TZFIELD2D%CLONGNAME  = 'RADSWD_NIR'
+    TZFIELD2D%CUNITS     = ''
+    TZFIELD2D%CCOMMENT   = 'X_Y_RADSWD_NIR'
+    CALL IO_Field_write(TPFILE,TZFIELD2D,ZSTORE_2D)
+    !
+    DO JJ=IJB,IJE
+      DO JI=IIB,IIE
+        IIJ = 1 + (JI-IIB) + (IIE-IIB+1)*(JJ-IJB)
+        ZSTORE_2D(JI,JJ) = ZFLUX_TOP_GND_IRVISNIR(IIJ,4)
+      END DO
+    END DO
+    TZFIELD2D%CMNHNAME   = 'RADLWD'
+    TZFIELD2D%CLONGNAME  = 'RADLWD'
+    TZFIELD2D%CUNITS     = ''
+    TZFIELD2D%CCOMMENT   = 'X_Y_RADLWD'
+    CALL IO_Field_write(TPFILE,TZFIELD2D,ZSTORE_2D)
+  END IF
+  !
+  !
+  IF( KRAD_DIAG >= 2) THEN
+    DO JK=IKB,IKE
+      JKRAD = JK - JPVEXT
+      DO JJ=IJB,IJE
+        DO JI=IIB,IIE
+          IIJ = 1 + (JI-IIB) + (IIE-IIB+1)*(JJ-IJB)
+          ZSTORE_3D(JI,JJ,JK) = ZFLUX_SW_DOWN_CS(IIJ,JKRAD)
+        END DO
+      END DO
+    END DO
+    TZFIELD3D%CMNHNAME   = 'SWF_DOWN_CS'
+    TZFIELD3D%CLONGNAME  = 'SWF_DOWN_CS'
+    TZFIELD3D%CUNITS     = 'W m-2'
+    TZFIELD3D%CCOMMENT   = 'X_Y_Z_SWF_DOWN_CS'
+    CALL IO_Field_write(TPFILE,TZFIELD3D,ZSTORE_3D)
+    !
+    DO JK=IKB,IKE
+      JKRAD = JK - JPVEXT
+      DO JJ=IJB,IJE
+        DO JI=IIB,IIE
+          IIJ = 1 + (JI-IIB) + (IIE-IIB+1)*(JJ-IJB)
+          ZSTORE_3D(JI,JJ,JK) = ZFLUX_SW_UP_CS(IIJ,JKRAD)
+        END DO
+      END DO
+    END DO
+    TZFIELD3D%CMNHNAME   = 'SWF_UP_CS'
+    TZFIELD3D%CLONGNAME  = 'SWF_UP_CS'
+    TZFIELD3D%CUNITS     = 'W m-2'
+    TZFIELD3D%CCOMMENT   = 'X_Y_Z_SWF_UP_CS'
+    CALL IO_Field_write(TPFILE,TZFIELD3D,ZSTORE_3D)
+    !
+    DO JK=IKB,IKE
+      JKRAD = JK - JPVEXT
+      DO JJ=IJB,IJE
+        DO JI=IIB,IIE
+          IIJ = 1 + (JI-IIB) + (IIE-IIB+1)*(JJ-IJB)
+          ZSTORE_3D(JI,JJ,JK) = -ZFLUX_LW_CS(IIJ,2,JKRAD)
+        END DO
+      END DO
+    END DO
+    TZFIELD3D%CMNHNAME   = 'LWF_DOWN_CS'
+    TZFIELD3D%CLONGNAME  = 'LWF_DOWN_CS'
+    TZFIELD3D%CUNITS     = 'W m-2'
+    TZFIELD3D%CCOMMENT   = 'X_Y_Z_LWF_DOWN_CS'
+    CALL IO_Field_write(TPFILE,TZFIELD3D,ZSTORE_3D)
+    !
+    DO JK=IKB,IKE
+      JKRAD = JK - JPVEXT
+      DO JJ=IJB,IJE
+        DO JI=IIB,IIE
+          IIJ = 1 + (JI-IIB) + (IIE-IIB+1)*(JJ-IJB)
+          ZSTORE_3D(JI,JJ,JK) = ZFLUX_LW_CS(IIJ,1,JKRAD)
+        END DO
+      END DO
+    END DO
+    TZFIELD3D%CMNHNAME   = 'LWF_UP_CS'
+    TZFIELD3D%CLONGNAME  = 'LWF_UP_CS'
+    TZFIELD3D%CUNITS     = 'W m-2'
+    TZFIELD3D%CCOMMENT   = 'X_Y_Z_LWF_UP_CS'
+    CALL IO_Field_write(TPFILE,TZFIELD3D,ZSTORE_3D)
+    !
+    DO JK=IKB,IKE
+      JKRAD = JK - JPVEXT
+      DO JJ=IJB,IJE
+        DO JI=IIB,IIE
+          IIJ = 1 + (JI-IIB) + (IIE-IIB+1)*(JJ-IJB)
+          ZSTORE_3D(JI,JJ,JK) = ZNFLW_CS(IIJ,JKRAD)
+        END DO
+      END DO
+    END DO
+    TZFIELD3D%CMNHNAME   = 'LWF_NET_CS'
+    TZFIELD3D%CLONGNAME  = 'LWF_NET_CS'
+    TZFIELD3D%CUNITS     = 'W m-2'
+    TZFIELD3D%CCOMMENT   = 'X_Y_Z_LWF_NET_CS'
+    CALL IO_Field_write(TPFILE,TZFIELD3D,ZSTORE_3D)
+    !
+    DO JK=IKB,IKE
+      JKRAD = JK - JPVEXT
+      DO JJ=IJB,IJE
+        DO JI=IIB,IIE
+          IIJ = 1 + (JI-IIB) + (IIE-IIB+1)*(JJ-IJB)
+          ZSTORE_3D(JI,JJ,JK) = ZNFSW_CS(IIJ,JKRAD)
+        END DO
+      END DO
+    END DO
+    TZFIELD3D%CMNHNAME   = 'SWF_NET_CS'
+    TZFIELD3D%CLONGNAME  = 'SWF_NET_CS'
+    TZFIELD3D%CUNITS     = 'W m-2'
+    TZFIELD3D%CCOMMENT   = 'X_Y_Z_SWF_NET_CS'
+    CALL IO_Field_write(TPFILE,TZFIELD3D,ZSTORE_3D)
+    !
+    DO JK=IKB,IKE
+      JKRAD = JK-JPVEXT
+      DO JJ=IJB,IJE
+        DO JI=IIB,IIE
+          IIJ = 1 + (JI-IIB) + (IIE-IIB+1)*(JJ-IJB)
+          ZSTORE_3D(JI,JJ,JK) = ZDTSW_CS(IIJ,JKRAD) 
+        END DO
+      END DO
+    END DO
+    TZFIELD3D%CMNHNAME   = 'DTRAD_SW_CS'
+    TZFIELD3D%CLONGNAME  = 'DTRAD_SW_CS'
+    TZFIELD3D%CUNITS     = 'K day-1'
+    TZFIELD3D%CCOMMENT   = 'X_Y_Z_DTRAD_SW_CS'
+    CALL IO_Field_write(TPFILE,TZFIELD3D,ZSTORE_3D)
+    !
+    DO JK=IKB,IKE
+      JKRAD = JK-JPVEXT
+      DO JJ=IJB,IJE
+        DO JI=IIB,IIE
+          IIJ = 1 + (JI-IIB) + (IIE-IIB+1)*(JJ-IJB)
+          ZSTORE_3D(JI,JJ,JK) = ZDTLW_CS(IIJ,JKRAD) 
+        END DO
+      END DO
+    END DO
+    TZFIELD3D%CMNHNAME   = 'DTRAD_LW_CS'
+    TZFIELD3D%CLONGNAME  = 'DTRAD_LW_CS'
+    TZFIELD3D%CUNITS     = 'K day-1'
+    TZFIELD3D%CCOMMENT   = 'X_Y_Z_DTRAD_LW_CS'
+    CALL IO_Field_write(TPFILE,TZFIELD3D,ZSTORE_3D)
+    !
+    DO JJ=IJB,IJE
+      DO JI=IIB,IIE
+        IIJ = 1 + (JI-IIB) + (IIE-IIB+1)*(JJ-IJB)
+        ZSTORE_2D(JI,JJ) = ZFLUX_TOP_GND_IRVISNIR_CS(IIJ,5)
+      END DO
+    END DO
+    TZFIELD2D%CMNHNAME   = 'RADSWD_VIS_CS'
+    TZFIELD2D%CLONGNAME  = 'RADSWD_VIS_CS'
+    TZFIELD2D%CUNITS     = ''
+    TZFIELD2D%CCOMMENT   = 'X_Y_RADSWD_VIS_CS'
+    CALL IO_Field_write(TPFILE,TZFIELD2D,ZSTORE_2D)
+    !
+    DO JJ=IJB,IJE
+      DO JI=IIB,IIE
+        IIJ = 1 + (JI-IIB) + (IIE-IIB+1)*(JJ-IJB)
+        ZSTORE_2D(JI,JJ) = ZFLUX_TOP_GND_IRVISNIR_CS(IIJ,6)
+      END DO
+    END DO
+    TZFIELD2D%CMNHNAME   = 'RADSWD_NIR_CS'
+    TZFIELD2D%CLONGNAME  = 'RADSWD_NIR_CS'
+    TZFIELD2D%CUNITS     = ''
+    TZFIELD2D%CCOMMENT   = 'X_Y_RADSWD_NIR_CS'
+    CALL IO_Field_write(TPFILE,TZFIELD2D,ZSTORE_2D)
+    !
+    DO JJ=IJB,IJE
+      DO JI=IIB,IIE
+        IIJ = 1 + (JI-IIB) + (IIE-IIB+1)*(JJ-IJB)
+        ZSTORE_2D(JI,JJ) = ZFLUX_TOP_GND_IRVISNIR_CS(IIJ,4)
+      END DO
+    END DO
+    TZFIELD2D%CMNHNAME   = 'RADLWD_CS'
+    TZFIELD2D%CLONGNAME  = 'RADLWD_CS'
+    TZFIELD2D%CUNITS     = ''
+    TZFIELD2D%CCOMMENT   = 'X_Y_RADLWD_CS'
+    CALL IO_Field_write(TPFILE,TZFIELD2D,ZSTORE_2D)
+  END IF
+  !
+  !
+  IF( KRAD_DIAG >= 3) THEN
+    DO JJ=IJB,IJE
+      DO JI=IIB,IIE
+        IIJ = 1 + (JI-IIB) + (IIE-IIB+1)*(JJ-IJB)
+        ZSTORE_2D(JI,JJ) = ZPLAN_ALB_VIS(IIJ)
+      END DO
+    END DO
+    TZFIELD2D%CMNHNAME   = 'PLAN_ALB_VIS'
+    TZFIELD2D%CLONGNAME  = 'PLAN_ALB_VIS'
+    TZFIELD2D%CUNITS     = ''
+    TZFIELD2D%CCOMMENT   = 'X_Y_PLAN_ALB_VIS'
+    CALL IO_Field_write(TPFILE,TZFIELD2D,ZSTORE_2D)
+    !
+    DO JJ=IJB,IJE
+      DO JI=IIB,IIE
+        IIJ = 1 + (JI-IIB) + (IIE-IIB+1)*(JJ-IJB)
+        ZSTORE_2D(JI,JJ) = ZPLAN_ALB_NIR(IIJ)
+      END DO
+    END DO
+    TZFIELD2D%CMNHNAME   = 'PLAN_ALB_NIR'
+    TZFIELD2D%CLONGNAME  = 'PLAN_ALB_NIR'
+    TZFIELD2D%CUNITS     = ''
+    TZFIELD2D%CCOMMENT   = 'X_Y_PLAN_ALB_NIR'
+    CALL IO_Field_write(TPFILE,TZFIELD2D,ZSTORE_2D)
+    !
+    DO JJ=IJB,IJE
+      DO JI=IIB,IIE
+        IIJ = 1 + (JI-IIB) + (IIE-IIB+1)*(JJ-IJB)
+        ZSTORE_2D(JI,JJ) = ZPLAN_TRA_VIS(IIJ)
+      END DO
+    END DO
+    TZFIELD2D%CMNHNAME   = 'PLAN_TRA_VIS'
+    TZFIELD2D%CLONGNAME  = 'PLAN_TRA_VIS'
+    TZFIELD2D%CUNITS     = ''
+    TZFIELD2D%CCOMMENT   = 'X_Y_PLAN_TRA_VIS'
+    CALL IO_Field_write(TPFILE,TZFIELD2D,ZSTORE_2D)
+    !
+    DO JJ=IJB,IJE
+      DO JI=IIB,IIE
+        IIJ = 1 + (JI-IIB) + (IIE-IIB+1)*(JJ-IJB)
+        ZSTORE_2D(JI,JJ) = ZPLAN_TRA_NIR(IIJ)
+      END DO
+    END DO
+    TZFIELD2D%CMNHNAME   = 'PLAN_TRA_NIR'
+    TZFIELD2D%CLONGNAME  = 'PLAN_TRA_NIR'
+    TZFIELD2D%CUNITS     = ''
+    TZFIELD2D%CCOMMENT   = 'X_Y_PLAN_TRA_NIR'
+    CALL IO_Field_write(TPFILE,TZFIELD2D,ZSTORE_2D)
+    !
+    DO JJ=IJB,IJE
+      DO JI=IIB,IIE
+        IIJ = 1 + (JI-IIB) + (IIE-IIB+1)*(JJ-IJB)
+        ZSTORE_2D(JI,JJ) = ZPLAN_ABS_VIS(IIJ)
+      END DO
+    END DO
+    TZFIELD2D%CMNHNAME   = 'PLAN_ABS_VIS'
+    TZFIELD2D%CLONGNAME  = 'PLAN_ABS_VIS'
+    TZFIELD2D%CUNITS     = ''
+    TZFIELD2D%CCOMMENT   = 'X_Y_PLAN_ABS_VIS'
+    CALL IO_Field_write(TPFILE,TZFIELD2D,ZSTORE_2D)
+    !
+    DO JJ=IJB,IJE
+      DO JI=IIB,IIE
+        IIJ = 1 + (JI-IIB) + (IIE-IIB+1)*(JJ-IJB)
+        ZSTORE_2D(JI,JJ) = ZPLAN_ABS_NIR(IIJ)
+      END DO
+    END DO
+    TZFIELD2D%CMNHNAME   = 'PLAN_ABS_NIR'
+    TZFIELD2D%CLONGNAME  = 'PLAN_ABS_NIR'
+    TZFIELD2D%CUNITS     = ''
+    TZFIELD2D%CCOMMENT   = 'X_Y_PLAN_ABS_NIR'
+    CALL IO_Field_write(TPFILE,TZFIELD2D,ZSTORE_2D)
+    !
+    !
+  END IF
+!
+!
+  IF( KRAD_DIAG >= 4) THEN
+    DO JK=IKB,IKE
+      JKRAD = JK - JPVEXT
+      DO JJ=IJB,IJE
+        DO JI=IIB,IIE
+          IIJ = 1 + (JI-IIB) + (IIE-IIB+1)*(JJ-IJB)
+          ZSTORE_3D(JI,JJ,JK) = ZEFCL_LWD(IIJ,JKRAD)
+        END DO
+      END DO
+    END DO
+    TZFIELD3D%CMNHNAME   = 'EFNEB_DOWN'
+    TZFIELD3D%CLONGNAME  = 'EFNEB_DOWN'
+    TZFIELD3D%CUNITS     = ''
+    TZFIELD3D%CCOMMENT   = 'X_Y_Z_EFNEB_DOWN'
+    CALL IO_Field_write(TPFILE,TZFIELD3D,ZSTORE_3D)
+    !
+    DO JK=IKB,IKE
+      JKRAD = JK - JPVEXT
+      DO JJ=IJB,IJE
+        DO JI=IIB,IIE
+          IIJ = 1 + (JI-IIB) + (IIE-IIB+1)*(JJ-IJB)
+          ZSTORE_3D(JI,JJ,JK) = ZEFCL_LWU(IIJ,JKRAD)
+        END DO
+      END DO
+    END DO
+    TZFIELD3D%CMNHNAME   = 'EFNEB_UP'
+    TZFIELD3D%CLONGNAME  = 'EFNEB_UP'
+    TZFIELD3D%CUNITS     = ''
+    TZFIELD3D%CCOMMENT   = 'X_Y_Z_EFNEB_UP'
+    CALL IO_Field_write(TPFILE,TZFIELD3D,ZSTORE_3D)
+    !
+    DO JK=IKB,IKE
+      JKRAD = JK - JPVEXT
+      DO JJ=IJB,IJE
+        DO JI=IIB,IIE
+          IIJ = 1 + (JI-IIB) + (IIE-IIB+1)*(JJ-IJB)
+          ZSTORE_3D(JI,JJ,JK) = ZFLWP(IIJ,JKRAD)
+        END DO
+      END DO
+    END DO
+    TZFIELD3D%CMNHNAME   = 'FLWP'
+    TZFIELD3D%CLONGNAME  = 'FLWP'
+    TZFIELD3D%CUNITS     = ''
+    TZFIELD3D%CCOMMENT   = 'X_Y_Z_FLWP'
+    CALL IO_Field_write(TPFILE,TZFIELD3D,ZSTORE_3D)
+    !
+    DO JK=IKB,IKE
+      JKRAD = JK - JPVEXT
+      DO JJ=IJB,IJE
+        DO JI=IIB,IIE
+          IIJ = 1 + (JI-IIB) + (IIE-IIB+1)*(JJ-IJB)
+          ZSTORE_3D(JI,JJ,JK) = ZFIWP(IIJ,JKRAD)
+        END DO
+      END DO
+    END DO
+    TZFIELD3D%CMNHNAME   = 'FIWP'
+    TZFIELD3D%CLONGNAME  = 'FIWP'
+    TZFIELD3D%CUNITS     = ''
+    TZFIELD3D%CCOMMENT   = 'X_Y_Z_FIWP'
+    CALL IO_Field_write(TPFILE,TZFIELD3D,ZSTORE_3D)
+    !
+    DO JK=IKB,IKE
+      JKRAD = JK - JPVEXT
+      DO JJ=IJB,IJE
+        DO JI=IIB,IIE
+          IIJ = 1 + (JI-IIB) + (IIE-IIB+1)*(JJ-IJB)
+          ZSTORE_3D(JI,JJ,JK) = ZRADLP(IIJ,JKRAD)
+        END DO
+      END DO
+    END DO
+    TZFIELD3D%CMNHNAME   = 'EFRADL'
+    TZFIELD3D%CLONGNAME  = 'EFRADL'
+    TZFIELD3D%CUNITS     = ''
+    TZFIELD3D%CCOMMENT   = 'X_Y_Z_RAD_microm'
+    CALL IO_Field_write(TPFILE,TZFIELD3D,ZSTORE_3D)
+    ! 
+    DO JK=IKB,IKE
+      JKRAD = JK - JPVEXT
+      DO JJ=IJB,IJE
+        DO JI=IIB,IIE
+          IIJ = 1 + (JI-IIB) + (IIE-IIB+1)*(JJ-IJB)
+          ZSTORE_3D(JI,JJ,JK) = ZRADIP(IIJ,JKRAD)
+        END DO
+      END DO
+    END DO
+    TZFIELD3D%CMNHNAME   = 'EFRADI'
+    TZFIELD3D%CLONGNAME  = 'EFRADI'
+    TZFIELD3D%CUNITS     = ''
+    TZFIELD3D%CCOMMENT   = 'X_Y_Z_RAD_microm'
+    CALL IO_Field_write(TPFILE,TZFIELD3D,ZSTORE_3D)
+    !
+    DO JK=IKB,IKE
+      JKRAD = JK - JPVEXT
+      DO JJ=IJB,IJE
+        DO JI=IIB,IIE
+          IIJ = 1 + (JI-IIB) + (IIE-IIB+1)*(JJ-IJB)
+          ZSTORE_3D(JI,JJ,JK) = ZCLSW_TOTAL(IIJ,JKRAD)
+        END DO
+      END DO
+    END DO
+    TZFIELD3D%CMNHNAME   = 'SW_NEB'
+    TZFIELD3D%CLONGNAME  = 'SW_NEB'
+    TZFIELD3D%CUNITS     = ''
+    TZFIELD3D%CCOMMENT   = 'X_Y_Z_SW_NEB'
+    CALL IO_Field_write(TPFILE,TZFIELD3D,ZSTORE_3D)
+    !
+    DO JK=IKB,IKE
+      JKRAD = JK - JPVEXT
+      DO JJ=IJB,IJE
+        DO JI=IIB,IIE
+          IIJ = 1 + (JI-IIB) + (IIE-IIB+1)*(JJ-IJB)
+          ZSTORE_3D(JI,JJ,JK) = ZEFCL_RRTM(IIJ,JKRAD)
+        END DO
+      END DO
+    END DO
+    TZFIELD3D%CMNHNAME   = 'RRTM_LW_NEB'
+    TZFIELD3D%CLONGNAME  = 'RRTM_LW_NEB'
+    TZFIELD3D%CUNITS     = ''
+    TZFIELD3D%CCOMMENT   = 'X_Y_Z_LW_NEB'
+    CALL IO_Field_write(TPFILE,TZFIELD3D,ZSTORE_3D)
+    !
+    ! spectral bands
+    IF (KSWB_OLD==6) THEN
+      INIR = 4
+    ELSE
+      INIR = 2
+    END IF
+
+    DO JBAND=1,INIR-1
+      WRITE(YBAND_NAME(JBAND),'(A3,I1)') 'VIS', JBAND
+    END DO
+    DO JBAND= INIR, KSWB_OLD
+      WRITE(YBAND_NAME(JBAND),'(A3,I1)') 'NIR', JBAND
+    END DO
+!
+    DO JBAND=1,KSWB_OLD
+      TZFIELD3D%CMNHNAME   = 'ODAER_'//YBAND_NAME(JBAND)
+      TZFIELD3D%CLONGNAME  = 'ODAER_'//YBAND_NAME(JBAND)
+      TZFIELD3D%CUNITS     = ''
+      TZFIELD3D%CCOMMENT   = 'X_Y_Z_OD_'//YBAND_NAME(JBAND)
+      CALL IO_Field_write(TPFILE,TZFIELD3D,ZTAUAZ(:,:,:,JBAND))
+      !
+      TZFIELD3D%CMNHNAME   = 'SSAAER_'//YBAND_NAME(JBAND)
+      TZFIELD3D%CLONGNAME  = 'SSAAER_'//YBAND_NAME(JBAND)
+      TZFIELD3D%CUNITS     = ''
+      TZFIELD3D%CCOMMENT   = 'X_Y_Z_SSA_'//YBAND_NAME(JBAND)
+      CALL IO_Field_write(TPFILE,TZFIELD3D,ZPIZAZ(:,:,:,JBAND))
+      !
+      TZFIELD3D%CMNHNAME   = 'GAER_'//YBAND_NAME(JBAND)
+      TZFIELD3D%CLONGNAME  = 'GAER_'//YBAND_NAME(JBAND)
+      TZFIELD3D%CUNITS     = ''
+      TZFIELD3D%CCOMMENT   = 'X_Y_Z_G_'//YBAND_NAME(JBAND)
+      CALL IO_Field_write(TPFILE,TZFIELD3D,ZCGAZ(:,:,:,JBAND))
+    ENDDO
+
+    DO JBAND=1,KSWB_OLD
+      DO JK=IKB,IKE
+        JKRAD = JK - JPVEXT
+        DO JJ=IJB,IJE
+          DO JI=IIB,IIE
+            IIJ = 1 + (JI-IIB) + (IIE-IIB+1)*(JJ-IJB)
+            ZSTORE_3D(JI,JJ,JK) = ZTAU_TOTAL(IIJ,JBAND,JKRAD)
+          END DO
+        END DO
+      END DO
+      TZFIELD3D%CMNHNAME   = 'OTH_'//YBAND_NAME(JBAND)
+      TZFIELD3D%CLONGNAME  = 'OTH_'//YBAND_NAME(JBAND)
+      TZFIELD3D%CUNITS     = ''
+      TZFIELD3D%CCOMMENT   = 'X_Y_Z_OTH_'//YBAND_NAME(JBAND)
+      CALL IO_Field_write(TPFILE,TZFIELD3D,ZSTORE_3D)
+      !
+      DO JK=IKB,IKE
+        JKRAD = JK - JPVEXT
+        DO JJ=IJB,IJE
+          DO JI=IIB,IIE
+            IIJ = 1 + (JI-IIB) + (IIE-IIB+1)*(JJ-IJB)
+            ZSTORE_3D(JI,JJ,JK) = ZOMEGA_TOTAL(IIJ,JBAND,JKRAD)
+          END DO
+        END DO
+      END DO
+      TZFIELD3D%CMNHNAME   = 'SSA_'//YBAND_NAME(JBAND)
+      TZFIELD3D%CLONGNAME  = 'SSA_'//YBAND_NAME(JBAND)
+      TZFIELD3D%CUNITS     = ''
+      TZFIELD3D%CCOMMENT   = 'X_Y_Z_SSA_'//YBAND_NAME(JBAND)
+      CALL IO_Field_write(TPFILE,TZFIELD3D,ZSTORE_3D)
+      !
+      DO JK=IKB,IKE
+        JKRAD = JK - JPVEXT
+        DO JJ=IJB,IJE
+          DO JI=IIB,IIE
+            IIJ = 1 + (JI-IIB) + (IIE-IIB+1)*(JJ-IJB)
+            ZSTORE_3D(JI,JJ,JK) = ZCG_TOTAL(IIJ,JBAND,JKRAD)
+          END DO
+        END DO
+      END DO
+      TZFIELD3D%CMNHNAME   = 'ASF_'//YBAND_NAME(JBAND)
+      TZFIELD3D%CLONGNAME  = 'ASF_'//YBAND_NAME(JBAND)
+      TZFIELD3D%CUNITS     = ''
+      TZFIELD3D%CCOMMENT   = 'X_Y_Z_ASF_'//YBAND_NAME(JBAND)
+      CALL IO_Field_write(TPFILE,TZFIELD3D,ZSTORE_3D)
+    END DO
+  END IF
+  !
+  !
+  IF (KRAD_DIAG >= 5)   THEN
+!
+! OZONE and AER optical thickness climato  entering the ecmwf_radiation_vers2
+! note the vertical grid is re-inversed for graphic !   
+    DO JK=IKB,IKE
+      JKRAD = KFLEV+1 - JK + JPVEXT               
+      DO JJ=IJB,IJE
+        DO JI=IIB,IIE 
+          IIJ = 1 + (JI-IIB) + (IIE-IIB+1)*(JJ-IJB)
+          ZSTORE_3D(JI,JJ,JK) = ZO3AVE(IIJ, JKRAD)
+        END DO
+      END DO
+    END DO
+    TZFIELD3D%CMNHNAME   = 'O3CLIM'
+    TZFIELD3D%CLONGNAME  = 'O3CLIM'
+    TZFIELD3D%CUNITS     = 'Pa Pa-1'
+    TZFIELD3D%CCOMMENT   = 'X_Y_Z_O3'
+    CALL IO_Field_write(TPFILE,TZFIELD3D,ZSTORE_3D)
+! 
+!cumulated optical thickness of aerosols
+!cumul begin from the top of the domain, not from the TOA !      
+!
+!land 
+    DO JK=IKB,IKE
+      JKRAD = JK - JPVEXT
+      DO JJ=IJB,IJE
+        DO JI=IIB,IIE
+          ZSTORE_3D(JI,JJ,JK) = PAER(JI,JJ,JKRAD,1)
+        END DO
+      END DO
+    END DO
+!
+    ZSTORE_2D (:,:) = 0.
+    DO JK=IKB,IKE
+      JK1=IKE-JK+IKB 
+      ZSTORE_2D(:,:) = ZSTORE_2D(:,:) + ZSTORE_3D(:,:,JK1)
+      ZSTORE_3D2(:,:,JK1) = ZSTORE_2D(:,:)  
+    END DO
+    TZFIELD3D%CMNHNAME   = 'CUM_AER_LAND'
+    TZFIELD3D%CLONGNAME  = 'CUM_AER_LAND'
+    TZFIELD3D%CUNITS     = ''
+    TZFIELD3D%CCOMMENT   = 'X_Y_Z_CUM_AER_OPT'
+    CALL IO_Field_write(TPFILE,TZFIELD3D,ZSTORE_3D2)
+!
+! sea
+    DO JK=IKB,IKE
+      JKRAD = JK - JPVEXT
+      DO JJ=IJB,IJE
+        DO JI=IIB,IIE
+          ZSTORE_3D(JI,JJ,JK) = PAER(JI,JJ,JKRAD,2)
+        END DO
+      END DO
+    END DO
+!sum
+    ZSTORE_2D (:,:) = 0.
+    DO JK=IKB,IKE
+      JK1=IKE-JK+IKB 
+      ZSTORE_2D(:,:) = ZSTORE_2D(:,:) + ZSTORE_3D(:,:,JK1)
+      ZSTORE_3D2(:,:,JK1) = ZSTORE_2D(:,:)  
+    END DO
+!
+    TZFIELD3D%CMNHNAME   = 'CUM_AER_SEA'
+    TZFIELD3D%CLONGNAME  = 'CUM_AER_SEA'
+    TZFIELD3D%CUNITS     = ''
+    TZFIELD3D%CCOMMENT   = 'X_Y_Z_CUM_AER_OPT'
+    CALL IO_Field_write(TPFILE,TZFIELD3D,ZSTORE_3D2)
+!
+! desert
+    DO JK=IKB,IKE
+      JKRAD = JK - JPVEXT
+      DO JJ=IJB,IJE
+        DO JI=IIB,IIE
+          ZSTORE_3D(JI,JJ,JK) = PAER(JI,JJ,JKRAD,3)
+        END DO
+      END DO
+    END DO
+!sum     
+    ZSTORE_2D (:,:) = 0.
+    DO JK=IKB,IKE
+      JK1=IKE-JK+IKB 
+      ZSTORE_2D(:,:) = ZSTORE_2D(:,:) + ZSTORE_3D(:,:,JK1)
+      ZSTORE_3D2(:,:,JK1) = ZSTORE_2D(:,:)  
+    END DO
+!    
+    TZFIELD3D%CMNHNAME   = 'CUM_AER_DES'
+    TZFIELD3D%CLONGNAME  = 'CUM_AER_DES'
+    TZFIELD3D%CUNITS     = ''
+    TZFIELD3D%CCOMMENT   = 'X_Y_Z_CUM_AER_OPT'
+    CALL IO_Field_write(TPFILE,TZFIELD3D,ZSTORE_3D2)
+!
+! urban
+    DO JK=IKB,IKE
+      JKRAD = JK - JPVEXT
+      DO JJ=IJB,IJE
+        DO JI=IIB,IIE
+          ZSTORE_3D(JI,JJ,JK) = PAER(JI,JJ,JKRAD,4)
+        END DO
+      END DO
+    END DO
+!sum      
+    ZSTORE_2D (:,:) = 0.
+    DO JK=IKB,IKE
+      JK1=IKE-JK+IKB 
+      ZSTORE_2D(:,:) = ZSTORE_2D(:,:) + ZSTORE_3D(:,:,JK1)
+      ZSTORE_3D2(:,:,JK1) = ZSTORE_2D(:,:)  
+    END DO
+!
+    TZFIELD3D%CMNHNAME   = 'CUM_AER_URB'
+    TZFIELD3D%CLONGNAME  = 'CUM_AER_URB'
+    TZFIELD3D%CUNITS     = ''
+    TZFIELD3D%CCOMMENT   = 'X_Y_Z_CUM_AER_OPT'
+    CALL IO_Field_write(TPFILE,TZFIELD3D,ZSTORE_3D2)
+!
+! Volcanoes
+    DO JK=IKB,IKE
+      JKRAD = JK - JPVEXT
+      DO JJ=IJB,IJE
+        DO JI=IIB,IIE
+          ZSTORE_3D(JI,JJ,JK) = PAER(JI,JJ,JKRAD,5)
+        END DO
+      END DO
+    END DO
+!sum         
+    ZSTORE_2D (:,:) = 0.
+    DO JK=IKB,IKE
+      JK1=IKE-JK+IKB 
+      ZSTORE_2D(:,:) = ZSTORE_2D(:,:) + ZSTORE_3D(:,:,JK1)
+      ZSTORE_3D2(:,:,JK1) = ZSTORE_2D(:,:)  
+    END DO
+!
+    TZFIELD3D%CMNHNAME   = 'CUM_AER_VOL'
+    TZFIELD3D%CLONGNAME  = 'CUM_AER_VOL'
+    TZFIELD3D%CUNITS     = ''
+    TZFIELD3D%CCOMMENT   = 'X_Y_Z_CUM_AER_OPT'
+    CALL IO_Field_write(TPFILE,TZFIELD3D,ZSTORE_3D2)
+!
+! stratospheric background
+    DO JK=IKB,IKE
+      JKRAD = JK - JPVEXT
+      DO JJ=IJB,IJE
+        DO JI=IIB,IIE
+          ZSTORE_3D(JI,JJ,JK) = PAER(JI,JJ,JKRAD,6)
+        END DO
+      END DO
+    END DO
+!sum      
+    ZSTORE_2D (:,:) = 0.
+    DO JK=IKB,IKE
+      JK1=IKE-JK+IKB 
+      ZSTORE_2D(:,:) = ZSTORE_2D(:,:) + ZSTORE_3D(:,:,JK1)
+      ZSTORE_3D2(:,:,JK1) = ZSTORE_2D(:,:)  
+    END DO
+!
+    TZFIELD3D%CMNHNAME   = 'CUM_AER_STRB'
+    TZFIELD3D%CLONGNAME  = 'CUM_AER_STRB'
+    TZFIELD3D%CUNITS     = ''
+    TZFIELD3D%CCOMMENT   = 'X_Y_Z_CUM_AER_OPT'
+    CALL IO_Field_write(TPFILE,TZFIELD3D,ZSTORE_3D2)
+  ENDIF
+END IF
+!
+DEALLOCATE(ZNFLW_CS)
+DEALLOCATE(ZNFLW)
+DEALLOCATE(ZNFSW_CS)
+DEALLOCATE(ZNFSW)
+DEALLOCATE(ZFLUX_TOP_GND_IRVISNIR)
+DEALLOCATE(ZFLUX_SW_DOWN)
+DEALLOCATE(ZFLUX_SW_UP)
+DEALLOCATE(ZFLUX_LW)
+DEALLOCATE(ZDTLW_CS)
+DEALLOCATE(ZDTSW_CS)
+DEALLOCATE(ZFLUX_TOP_GND_IRVISNIR_CS)
+DEALLOCATE(ZPLAN_ALB_VIS)
+DEALLOCATE(ZPLAN_ALB_NIR)
+DEALLOCATE(ZPLAN_TRA_VIS)
+DEALLOCATE(ZPLAN_TRA_NIR)
+DEALLOCATE(ZPLAN_ABS_VIS)
+DEALLOCATE(ZPLAN_ABS_NIR)
+DEALLOCATE(ZEFCL_LWD)
+DEALLOCATE(ZEFCL_LWU)
+DEALLOCATE(ZFLWP)
+DEALLOCATE(ZFIWP)
+DEALLOCATE(ZRADLP)
+DEALLOCATE(ZRADIP)
+DEALLOCATE(ZEFCL_RRTM)
+DEALLOCATE(ZCLSW_TOTAL)
+DEALLOCATE(ZTAU_TOTAL)
+DEALLOCATE(ZOMEGA_TOTAL)
+DEALLOCATE(ZCG_TOTAL)
+DEALLOCATE(ZFLUX_SW_DOWN_CS)
+DEALLOCATE(ZFLUX_SW_UP_CS)
+DEALLOCATE(ZFLUX_LW_CS)
+DEALLOCATE(ZO3AVE)
+!
+!-------------------------------------------------------------------------------
+!
+END SUBROUTINE RADIATIONS
+!
+END MODULE MODI_RADIATIONS  
diff --git a/src/PHYEX/ext/read_all_data_grib_case.f90 b/src/PHYEX/ext/read_all_data_grib_case.f90
new file mode 100644
index 0000000000000000000000000000000000000000..af2db5f9e53eeb8e755fc5435f1ae6a45c98a6e9
--- /dev/null
+++ b/src/PHYEX/ext/read_all_data_grib_case.f90
@@ -0,0 +1,2615 @@
+!MNH_LIC Copyright 1998-2022 CNRS, Meteo-France and Universite Paul Sabatier
+!MNH_LIC This is part of the Meso-NH software governed by the CeCILL-C licence
+!MNH_LIC version 1. See LICENSE, CeCILL-C_V1-en.txt and CeCILL-C_V1-fr.txt
+!MNH_LIC for details. version 1.
+!-----------------------------------------------------------------
+!     #################################
+      MODULE MODI_READ_ALL_DATA_GRIB_CASE
+!     #################################
+INTERFACE
+SUBROUTINE READ_ALL_DATA_GRIB_CASE(HFILE,TPPRE_REAL1,HGRIB,TPPGDFILE,    &
+                    PTIME_HORI,KVERB,ODUMMY_REAL                         ) 
+!
+USE MODD_IO, ONLY: TFILEDATA
+!
+CHARACTER(LEN=4),  INTENT(IN)    :: HFILE       ! which file ('ATM0','ATM1' or 'CHEM')
+TYPE(TFILEDATA),POINTER,INTENT(INOUT) :: TPPRE_REAL1 ! PRE_REAL1 file
+CHARACTER(LEN=28), INTENT(IN)    :: HGRIB       ! name of the GRIB file
+TYPE(TFILEDATA),   INTENT(IN)    :: TPPGDFILE   ! physiographic data file
+INTEGER,           INTENT(IN)    :: KVERB       ! verbosity level
+LOGICAL,           INTENT(IN)    :: ODUMMY_REAL ! flag to interpolate dummy fields
+REAL,              INTENT(INOUT) :: PTIME_HORI  ! time spent in hor. interpolations
+!
+END SUBROUTINE READ_ALL_DATA_GRIB_CASE
+!
+END INTERFACE
+END MODULE MODI_READ_ALL_DATA_GRIB_CASE
+!     ##########################################################################
+      SUBROUTINE READ_ALL_DATA_GRIB_CASE(HFILE,TPPRE_REAL1,HGRIB,TPPGDFILE,    &
+                       PTIME_HORI,KVERB,ODUMMY_REAL                            )
+!     ##########################################################################
+!
+!!****  *READ_ALL_DATA_GRIB_CASE* - reads data for the initialization of real cases.
+!!
+!!    PURPOSE
+!!    -------
+!     This routine reads the two input files :
+!       The PGD which is closed after reading
+!       The GRIB file
+!     Projection is read in READ_LFIFM_PGD (MODD_GRID).
+!     Grid and definition of large domain are read in PGD file and Grib files.
+!     The PGD files are also read in READ_LFIFM_PGD.
+!     The PGD file is closed.
+!     The MESO-NH domain is defined from PRE_REAL1.nam inputs in SET_SUBDOMAIN_CEP.
+!     Vertical grid is defined in READ_VER_GRID.
+!     PGD fields are stored on MESO-NH domain (in TRUNC_PGD).
+!!
+!!**  METHOD
+!!    ------
+!!  0. Declarations
+!!    1. Declaration of arguments
+!!    2. Declaration of local variables
+!!  1. Read PGD file
+!!    1. Domain restriction
+!!    2. Coordinate conversion to lat,lon system
+!!  2. Read Grib fields
+!!  3. Vertical grid
+!!  4. Free all temporary allocations
+!!
+!!    EXTERNAL
+!!    --------
+!!    subroutine READ_LFIFM_PGD    : to read PGD file
+!!    subroutine SET_SUBDOMAIN     : to define the horizontal MESO-NH domain.
+!!    subroutine READ_VER_GRID     : to read the vertical grid in namelist file.
+!!    subroutine HORIBL            : horizontal bilinear interpolation
+!!    subroutine XYTOLATLON        : projection from conformal to lat,lon
+!!
+!!    Module     MODI_SET_SUBDOMAIN     : interface for subroutine SET_SUBDOMAIN
+!!    Module     MODI_READ_VER_GRID     : interface for subroutine READ_VER_GRID
+!!    Module     MODI_HORIBL            : interface for subroutine HORIBL
+!!    Module     MODI_XYTOLATLON        : interface for subroutine XYTOLATLON
+!!
+!!    IMPLICIT ARGUMENTS
+!!    ------------------
+!!
+!!      Module MODD_CONF      : contains configuration variables for all models.
+!!         NVERB : verbosity level for output-listing
+!!      Module MODD_LUNIT     : contains logical unit names for all models
+!!         TLUOUT0 : name of output-listing
+!!      Module MODD_PGDDIM    : contains dimension of PGD fields
+!!         NPGDIMAX: dimension along x (no external point)
+!!         NPGDJMAX: dimension along y (no external point)
+!!      Module MODD_PARAMETERS
+!!         JPHEXT
+!!
+!!    REFERENCE
+!!    ---------
+!!
+!!      Book 1 : Informations on ISBA model (soil moisture)
+!!      "Encoding and decoding Grib data", John D.Chambers, ECMWF, October 95
+!!      "A guide to Grib", John D.Stackpole, National weather service, March 94
+!!
+!!    AUTHOR
+!!    ------
+!!
+!!      J. Pettre and V. Bousquet
+!!
+!!    MODIFICATIONS
+!!    -------------
+!!      Original    20/11/98
+!!                  15/03/99 (V. Masson) phasing with new PGD fields
+!!                  21/04/99 (V. Masson) bug in mask definitions for max Y index
+!!                  22/04/99 (V. Masson) optimizer bug in u,v loop
+!!                                       --> splitting of the loop
+!!                                       and splitting of the routine in more
+!!                                       contains
+!!                  28/05/99 (V. Bousquet) bug in wind interpolated variable for
+!!                                         Arpege
+!!                  31/05/99 (V. Masson) set pressure points (given on a regular grid at ECMWF)
+!!                             on orography points (assuming the last are included in the former)
+!!                                       pressure computation from parameters A and B
+!!                                        (instead of interpolation from grib grid)
+!!                  20/07/00 (V. Masson) increase the threshold for land_sea index
+!!                  22/11/00 (P. Tulet) add INTERPOL_SV to initialize SV fields
+!!                           (I. Mallet) from MOCAGE model (IMODE=3)
+!!                  01/02/01 (D. Gazen) add INI_NSV
+!!                  18/05/01 (P. Jabouille) problem with 129 grib code
+!!                  05/12/01 (I. Mallet) add Aladin reunion model
+!!                  02/10/02 (I. Mallet) 2 orography fields for CEP (SFC, ML=1)
+!!                  01/12/03 (D. Gazen)   change Chemical scheme interface
+!!                  01/2004  (V. Masson) removes surface (externalization)
+!!                  01/06/02 (O.Nuissier) filtering of tropical cyclone
+!!                  01/05/04 (P. Tulet) add INTERPOL_SV to initialize SV dust
+!!                                                         and aerosol fields
+!!                  08/06/2010 (G. Tanguy) replace GRIBEX by GRIB_API : change
+!!                                         of all the subroutine
+!!                  05/12/2016 (G.Delautier) length of HGRID for grib_api > 1.14
+!!                  08/03/2018 (P.Wautelet)  replace ADD_FORECAST_TO_DATE by DATETIME_CORRECTDATE
+!!  Philippe Wautelet: 05/2016-04/2018: new data structures and calls for I/O
+!!         Pergaud  : 2018 add GFS
+!!                   01/2019 (G.Delautier via Q.Rodier) for GRIB2 ARPEGE and AROME from EPYGRAM
+!!      Bielli S. 02/2019  Sea salt : significant sea wave height influences salt emission; 5 salt modes
+!  P. Wautelet 14/03/2019: correct ZWS when variable not present in file
+!  P. Wautelet 10/04/2019: replace ABORT and STOP calls by Print_msg
+!  Q. Rodier   16/09/2019: switch of GRIB number ID for orography in ARPEGE/AROME in EPyGrAM
+!  Q. Rodier   27/01/2020: switch of GRIB number ID for orography and hydrometeors in ARPEGE/AROME in EPyGrAM v1.3.7
+!  Q. Rodier   21/04/2020: correction GFS u and v wind component written in the right vertical order
+!  Q. Rodier   02/09/2020: Read and interpol geopotential height for interpolation on isobaric surface Grid of NCEP
+!  P. Wautelet 09/03/2021: move some chemistry initializations to ini_nsv
+!JP Chaboureau 02/08/2021: add ERA5 reanalysis in pressure levels
+!JP Chaboureau 18/10/2022: correction on vertical level for GFS and ERA5 reanalyses in pressure levels
+!-------------------------------------------------------------------------------
+!
+!*      0. DECLARATIONS
+!------------
+!
+USE MODE_DATETIME
+USE MODE_IO_FILE,    ONLY: IO_File_close
+USE MODE_MSG
+USE MODE_TIME
+USE MODE_THERMO
+USE MODE_TOOLS, ONLY: UPCASE
+use mode_tools_ll,   only: GET_DIM_EXT_ll
+!
+USE MODI_READ_HGRID_n
+USE MODI_READ_VER_GRID
+USE MODI_XYTOLATLON
+USE MODI_HORIBL
+USE MODI_INI_NSV
+USE MODI_REMOVAL_VORTEX
+USE MODI_CH_OPEN_INPUT
+!
+USE MODD_IO, ONLY: TFILEDATA
+USE MODD_FIELD_n, ONLY: XZWS, XZWS_DEFAULT
+USE MODD_CONF
+USE MODD_CONF_n
+USE MODD_CST
+USE MODD_LUNIT
+USE MODD_PARAMETERS
+USE MODD_GRID
+USE MODD_GRID_n
+USE MODD_DIM_n
+USE MODD_PARAM_n, ONLY : CTURB
+USE MODD_TIME
+USE MODD_TIME_n
+USE MODD_CH_MNHC_n, ONLY : LUSECHEM,LUSECHAQ,LUSECHIC,LCH_PH
+USE MODD_CH_M9_n,   ONLY : NEQ ,  CNAMES
+USE MODD_CH_AEROSOL, ONLY: CORGANIC, NCARB, NSOA, NSP, LORILAM,&
+                           JPMODE, LVARSIGI, LVARSIGJ
+USE MODD_NSV      , ONLY : NSV
+USE MODD_HURR_CONF, ONLY : LFILTERING,CFILTERING
+USE MODD_PREP_REAL
+USE MODE_MODELN_HANDLER
+!JUAN REALZ
+USE MODE_MPPDB
+!JUAN REALZ
+!
+USE GRIB_API
+!
+IMPLICIT NONE
+!
+!* 0.1. Declaration of arguments
+!       ------------------------
+!
+CHARACTER(LEN=4),  INTENT(IN)    :: HFILE       ! which file ('ATM0','ATM1' or 'CHEM')
+TYPE(TFILEDATA),POINTER,INTENT(INOUT) :: TPPRE_REAL1! PRE_REAL1 file
+CHARACTER(LEN=28), INTENT(IN)    :: HGRIB       ! name of the GRIB file
+TYPE(TFILEDATA),   INTENT(IN)    :: TPPGDFILE   ! physiographic data file
+INTEGER,           INTENT(IN)    :: KVERB       ! verbosity level
+LOGICAL,           INTENT(IN)    :: ODUMMY_REAL ! flag to interpolate dummy fields
+REAL,              INTENT(INOUT) :: PTIME_HORI  ! time spent in hor. interpolations
+!
+!* 0.2 Declaration of local variables
+!      ------------------------------
+! General purpose variables
+INTEGER                            :: ILUOUT0       ! Unit used for output msg.
+INTEGER                            :: IRESP         ! Return code of FM-routines
+INTEGER                            :: IRET          ! Return code from subroutines
+INTEGER(KIND=kindOfInt)            :: IRET_GRIB     ! Return code from subroutines
+INTEGER, PARAMETER                 :: JP_GFS=31     ! number of pressure levels for GFS model
+INTEGER, PARAMETER                 :: JP_ERA=37     ! number of pressure levels for ERA5 reanalysis
+REAL                               :: ZA,ZB,ZC      ! Dummy variables
+REAL                               :: ZD,ZE,ZF      !  |
+REAL                               :: ZTEMP         !  |
+INTEGER                            :: JI,JJ         ! Dummy counters
+INTEGER                            :: JLOOP1,JLOOP2 !  |
+INTEGER                            :: JLOOP3,JLOOP4 !  |
+INTEGER                            :: JLOOP         !  |
+! Variables used by the PGD reader
+CHARACTER(LEN=28)                  :: YPGD_NAME     ! not used - dummy argument
+CHARACTER(LEN=28)                  :: YPGD_DAD_NAME ! not used - dummy argument
+CHARACTER(LEN=2)                   :: YPGD_TYPE     ! not used - dummy argument
+! PGD Grib definition variables
+INTEGER                            :: INO           ! Number of points of the grid
+INTEGER                            :: IIU           ! Number of points along X
+INTEGER                            :: IJU           ! Number of points along Y
+REAL, DIMENSION(:), ALLOCATABLE    :: ZXOUT         ! mapping PGD -> Grib (lon.)
+REAL, DIMENSION(:), ALLOCATABLE    :: ZYOUT         ! mapping PGD -> Grib (lat.)
+REAL, DIMENSION(:), ALLOCATABLE    :: ZLONOUT       ! mapping PGD -> Grib (lon.)
+REAL, DIMENSION(:), ALLOCATABLE    :: ZLATOUT       ! mapping PGD -> Grib (lat.)
+REAL, DIMENSION(:,:), ALLOCATABLE  :: ZXM           ! X of PGD mass points
+REAL, DIMENSION(:,:), ALLOCATABLE  :: ZYM           ! Y of PGD mass points
+REAL, DIMENSION(:,:), ALLOCATABLE  :: ZLATM         ! Lat of PGD mass points
+REAL, DIMENSION(:,:), ALLOCATABLE  :: ZLONM         ! Lon of PGD mass points
+! Variable involved in the task of reading the grib file
+INTEGER(KIND=kindOfInt)            :: IUNIT         ! unit of the grib file
+CHARACTER(LEN=50)                  :: HGRID         ! type of grid
+INTEGER                            :: IPAR          ! Parameter identifier
+INTEGER                            :: ITYP          ! type of level (Grib code table 3)
+INTEGER                            :: ILEV1         ! level definition
+INTEGER                            :: ILEV2         ! level definition
+INTEGER                            :: IMODEL        ! Type of Grib file :
+                                                    ! 0 -> ECMWF
+                                                    ! 1 -> METEO FRANCE - ALADIN/AROME
+                                                    ! 2 -> METEO FRANCE - ALADIN-REUNION
+                                                    ! 3 -> METEO FRANCE - ARPEGE
+                                                    ! 4 -> METEO FRANCE - ARPEGE
+                                                    ! 5 -> METEO FRANCE - MOCAGE
+                                                    ! 10 -> NCEP - GFS
+INTEGER                            :: ICENTER       ! number of center
+INTEGER                            :: ISIZE         ! size of grib message
+INTEGER(KIND=kindOfInt)            :: ICOUNT        ! number of messages in the file
+INTEGER(KIND=kindOfInt),DIMENSION(:),ALLOCATABLE   :: IGRIB         ! number of the grib in memory
+INTEGER                            :: INUM ,INUM_ZS ! number of a grib message 
+REAL,DIMENSION(:),ALLOCATABLE      :: ZPARAM        ! parameter of grib grid
+INTEGER,DIMENSION(:),ALLOCATABLE   :: IINLO         ! longitude of grib grid
+INTEGER(KIND=kindOfInt),DIMENSION(:),ALLOCATABLE   :: IINLO_GRIB         ! longitude of grib grid
+REAL,DIMENSION(:),ALLOCATABLE      :: ZPARAM_ZS     ! parameter of grib grid for ZS
+INTEGER,DIMENSION(:),ALLOCATABLE   :: IINLO_ZS      ! longitude of grib grid for ZS
+REAL,DIMENSION(:),ALLOCATABLE      :: ZVALUE        ! Intermediate array
+REAL,DIMENSION(:),ALLOCATABLE      :: ZOUT          ! Intermediate arrays
+! Grib grid definition variables
+INTEGER                            :: INI           ! Number of points
+INTEGER                            :: INLEVEL       ! Number of levels
+INTEGER                            :: ISTARTLEVEL   ! First level (0 or 1)
+TYPE(DATE_TIME)                    :: TPTCUR        ! Date & time of the grib file data
+INTEGER                            :: ITWOZS
+! surface pressure
+REAL, DIMENSION(:), ALLOCATABLE    :: ZPS_G         ! Grib data : Ps
+REAL, DIMENSION(:), ALLOCATABLE    :: ZLNPS_G       ! Grib data : ln(Ps)
+REAL, DIMENSION(:), ALLOCATABLE    :: ZWORK_LNPS    ! Grib data on zs grid: ln(Ps)
+INTEGER                            :: INJ,INJ_ZS
+! orography
+CHARACTER(LEN=50)                  :: HGRID_ZS      ! type of grid
+!
+! Reading and projection of the wind vectors u, v
+REAL                               :: ZALPHA        ! Angle of rotation
+REAL, DIMENSION(:), ALLOCATABLE    :: ZTU_LS        ! Intermediate array for U
+REAL, DIMENSION(:), ALLOCATABLE    :: ZTV_LS        !  |                     V
+REAL                               :: ZLATPOLE      ! Arpege stretching pole latitude
+REAL                               :: ZLONPOLE      ! Arpege stretching pole longitude
+REAL                               :: ZLAT,ZLON     ! Lat,lon of current point
+REAL                               :: ZCOS,ZSIN     ! cos,sin of rotation matrix
+REAL, DIMENSION(:), ALLOCATABLE    :: ZTU0_LS       ! Arpege temp array for U
+REAL, DIMENSION(:), ALLOCATABLE    :: ZTV0_LS       !  |                    V
+!
+! variables for hurricane filtering
+REAL, DIMENSION(:,:), ALLOCATABLE  :: ZTVF_LS,ZMSLP_LS
+REAL                               :: ZGAMREF       ! Standard atmosphere lapse rate (K/m)
+! date
+INTEGER  :: ITIME
+INTEGER  :: IDATE
+INTEGER  :: ITIMESTEP
+CHARACTER(LEN=10) :: CSTEPUNIT
+CHARACTER(LEN=15)  :: YVAL
+!chemistery field
+CHARACTER(LEN=16)                  :: YPRE_MOC="PRE_MOC1.nam"
+INTEGER, DIMENSION(:), ALLOCATABLE :: INUMGRIB, INUMLEV  ! grib
+INTEGER, DIMENSION(:), ALLOCATABLE :: INUMLEV1, INUMLEV2 !numbers
+INTEGER                            :: IMOC
+INTEGER                            :: IVAR
+INTEGER                            :: ICHANNEL
+INTEGER                            :: INDX
+INTEGER                            :: INACT
+CHARACTER(LEN=40)                  :: YINPLINE        ! input line
+CHARACTER(LEN=16)                  :: YFIELD
+CHARACTER, PARAMETER               :: YPTAB = CHAR(9) ! TAB character is ASCII : 9
+CHARACTER, PARAMETER               :: YPCOM = CHAR(44)! COMma character is ASCII : 44
+CHARACTER(LEN=40), DIMENSION(:), ALLOCATABLE :: YMNHNAME ! species names
+INTEGER                            :: JN, JNREAL ! loop control variables
+CHARACTER(LEN=40)                  :: YFORMAT
+CHARACTER(LEN=100)                 :: YMSG
+! temperature and humidity
+INTEGER                             :: IT,IQ
+REAL, DIMENSION(:,:), ALLOCATABLE   :: ZPF_G    ! Pressure (flux point)
+REAL, DIMENSION(:,:), ALLOCATABLE   :: ZPM_G    ! Pressure (mass point)
+REAL, DIMENSION(:,:), ALLOCATABLE   :: ZEXNF_G  ! Exner fct. (flux point)
+REAL, DIMENSION(:,:), ALLOCATABLE   :: ZEXNM_G  ! Exner fct. (mass point)
+REAL, DIMENSION(:,:), ALLOCATABLE   :: ZGH_G     ! Geopotential Height
+REAL, DIMENSION(:,:), ALLOCATABLE   :: ZT_G     ! Temperature
+REAL, DIMENSION(:,:), ALLOCATABLE   :: ZQ_G     ! Specific humidity
+REAL, DIMENSION(:), ALLOCATABLE     :: ZH_G     ! Relative humidity
+REAL, DIMENSION(:), ALLOCATABLE     :: ZTHV_G   ! Theta V
+REAL, DIMENSION(:), ALLOCATABLE     :: ZRV_G    ! Vapor mixing ratio
+REAL, DIMENSION(:,:,:), ALLOCATABLE :: ZPF_LS   ! Pressure (flux point)
+REAL, DIMENSION(:,:,:), ALLOCATABLE :: ZPM_LS   ! Pressure (mass point)
+REAL, DIMENSION(:,:,:), ALLOCATABLE :: ZEXNF_LS ! Exner fct. (flux point)
+REAL, DIMENSION(:,:,:), ALLOCATABLE :: ZEXNM_LS ! Exner fct. (mass point)
+REAL, DIMENSION(:,:,:), ALLOCATABLE :: ZH_LS    ! Relative humidity
+REAL, DIMENSION(:,:,:), ALLOCATABLE :: ZRV_LS   ! Vapor mixing ratio
+REAL, DIMENSION(:,:,:), ALLOCATABLE :: ZTHV_LS  ! Theta V
+REAL, DIMENSION(:,:,:), ALLOCATABLE :: ZTEV_LS  ! T V
+REAL, DIMENSION(:), ALLOCATABLE     :: ZPV      ! vertical level in grib file
+INTEGER                             :: IPVPRESENT ,IPV
+REAL, DIMENSION(:,:,:,:), ALLOCATABLE :: ZR_DUM
+INTEGER                             :: IMI
+TYPE(TFILEDATA),POINTER             :: TZFILE
+INTEGER, DIMENSION(JP_GFS)    :: IP_GFS   ! list of pressure levels for GFS model
+INTEGER, DIMENSION(JP_ERA)    :: IP_ERA   ! list of pressure levels for ERA5 reanalysis
+INTEGER :: IVERSION,ILEVTYPE
+LOGICAL                       :: GFIND    ! to test if sea wave height is found
+!---------------------------------------------------------------------------------------
+IP_GFS=(/1000,975,950,925,900,850,800,750,700,650,600,550,500,450,400,350,300,&
+           250,200,150,100,70,50,30,20,10,7,5,3,2,1/)
+IP_ERA=(/1000,975,950,925,900,875,850,825,800,775,750,700,650,600,550,500,450,&
+           400,350,300,250,225,200,175,150,125,100,70,50,30,20,10,7,5,3,2,1/)
+!
+TZFILE => NULL()
+!
+IMI = GET_CURRENT_MODEL_INDEX()
+!
+!* 1. READ PGD FILE
+!     -------------
+!
+ILUOUT0 = TLUOUT0%NLU
+CALL READ_HGRID_n(TPPGDFILE,YPGD_NAME,YPGD_DAD_NAME,YPGD_TYPE)
+!
+! 1.1 Domain restriction
+!
+!JUAN REALZ
+CALL GET_DIM_EXT_ll('B',IIU,IJU)
+!!$IIU=NIMAX + 2*JPHEXT
+!!$IJU=NJMAX + 2*JPHEXT
+!JUAN REALZ
+INO = IIU * IJU
+!
+!
+! 1.2 Coordinate conversion to lat,lon system
+!
+ALLOCATE (ZXM(IIU,IJU))
+ALLOCATE (ZYM(IIU,IJU))
+ALLOCATE (ZLONM(IIU,IJU))
+ALLOCATE (ZLATM(IIU,IJU))
+ZXM(:,:) = SPREAD(XXHATM(:),2,IJU)
+ZYM(:,:) = SPREAD(XYHATM(:),1,IIU)
+CALL SM_XYTOLATLON_A (XLAT0,XLON0,XRPK,XLATORI,XLONORI,ZXM,ZYM,ZLATM,ZLONM, &
+                      IIU,IJU)
+ALLOCATE (ZLONOUT(INO))
+ALLOCATE (ZLATOUT(INO))
+JLOOP1 = 0
+DO JJ = 1, IJU
+  ZLONOUT(JLOOP1+1:JLOOP1+IIU) = ZLONM(1:IIU,JJ)
+  ZLATOUT(JLOOP1+1:JLOOP1+IIU) = ZLATM(1:IIU,JJ)
+  JLOOP1 = JLOOP1 + IIU
+ENDDO
+DEALLOCATE (ZLATM)
+DEALLOCATE (ZLONM)
+DEALLOCATE (ZYM)
+DEALLOCATE (ZXM)
+!
+ALLOCATE (ZXOUT(INO))
+ALLOCATE (ZYOUT(INO))
+!
+!---------------------------------------------------------------------------------------
+!
+!* 2. READ GRIB FIELDS
+!     ----------------
+!
+IF (HFILE(1:3)=='ATM' .OR. HFILE=='CHEM') THEN
+  WRITE (ILUOUT0,'(A,A4)') ' -- Grib reader started for ',HFILE
+ELSE
+  CALL PRINT_MSG(NVERB_FATAL,'IO','READ_ALL_DATA_GRIB_CASE','bad input argument')
+END IF
+!
+!* 2.1 Charge in memory the grib messages
+!
+! open grib file
+CALL GRIB_OPEN_FILE(IUNIT,HGRIB,'R',IRET_GRIB)
+IF (IRET_GRIB /= 0) THEN
+  WRITE(YMSG,*) 'Error opening the grib file ',TRIM(HGRIB),', error code ', IRET_GRIB
+  CALL PRINT_MSG(NVERB_FATAL,'IO','READ_ALL_DATA_GRIB_CASE',YMSG)
+END IF
+! count the messages in the file
+CALL GRIB_COUNT_IN_FILE(IUNIT,ICOUNT,IRET_GRIB)
+IF (IRET_GRIB /= 0) THEN
+  WRITE(YMSG,*) 'Error in reading the grib file ',TRIM(HGRIB),', error code ', IRET_GRIB
+  CALL PRINT_MSG(NVERB_FATAL,'IO','READ_ALL_DATA_GRIB_CASE',YMSG)
+END IF
+ALLOCATE(IGRIB(ICOUNT))
+! initialize the tabular with a negativ number 
+! ( all the IGRIB will be  different )
+IGRIB(:)=-12
+!charge all the message in memory
+DO JLOOP=1,ICOUNT
+CALL GRIB_NEW_FROM_FILE(IUNIT,IGRIB(JLOOP),IRET_GRIB)
+IF (IRET_GRIB /= 0) THEN
+  WRITE(YMSG,*) 'Error in reading the grib file - ILOOP=',JLOOP,' - error code ', IRET_GRIB
+  CALL PRINT_MSG(NVERB_FATAL,'IO','READ_ALL_DATA_GRIB_CASE',YMSG)
+END IF
+END DO
+! close the grib file
+CALL GRIB_CLOSE_FILE(IUNIT)
+!
+!
+!---------------------------------------------------------------------------------------
+!* 2.2 Research center with the first message
+!---------------------------------------------------------------------------------------
+!
+CALL GRIB_GET(IGRIB(1),'centre',ICENTER,IRET_GRIB)
+IF (IRET_GRIB /= 0) THEN
+  WRITE(YMSG,*) 'Error in reading center - error code ', IRET_GRIB
+  CALL PRINT_MSG(NVERB_FATAL,'IO','READ_ALL_DATA_GRIB_CASE',YMSG)
+END IF
+CALL GRIB_GET(IGRIB(1),'typeOfGrid',HGRID,IRET_GRIB)
+IF (IRET_GRIB /= 0) THEN
+  WRITE(YMSG,*) 'Error in reading type of grid - error code ', IRET_GRIB
+  CALL PRINT_MSG(NVERB_FATAL,'IO','READ_ALL_DATA_GRIB_CASE',YMSG)
+END IF
+!
+IMODEL = -1
+SELECT CASE (ICENTER)
+  CASE (98)
+    WRITE (ILUOUT0,'(A)') &
+        ' | Grib file from European Center for Medium-range Weather Forecast'
+    IMODEL = 0
+    ALLOCATE(ZPARAM(6))
+  CASE (85)
+    SELECT CASE (HGRID)      
+      CASE('lambert')
+        WRITE (ILUOUT0,'(A)') ' | Grib file from French Weather Service - Arome france model'
+        CALL GRIB_GET(IGRIB(1),'editionNumber',IVERSION,IRET_GRIB)
+        IF (IVERSION==2) THEN
+          IMODEL = 6 ! GRIB2 since summer 2018 (epygram)
+        ELSE
+          IMODEL = 1 ! GRIB1 befor summer 2018 (lfi2mv) 
+        ENDIF
+        ALLOCATE(ZPARAM(10))
+      CASE('mercator')
+        WRITE (ILUOUT0,'(A)') ' | Grib file from French Weather Service - Aladin reunion model'
+      IMODEL = 2
+      ALLOCATE(ZPARAM(9))
+
+    CASE('unknown_PLPresent','reduced_stretched_rotated_gg')
+      WRITE (ILUOUT0,'(A)') ' | Grib file from French Weather Service - Arpege model'
+      ALLOCATE(ZPARAM(10))
+      CALL GRIB_GET(IGRIB(1),'editionNumber',IVERSION,IRET_GRIB)
+        IF (IVERSION==2) THEN
+          IMODEL = 7 ! GRIB2 since summer 2018 (epygram)
+        ELSE
+          IMODEL = 3 ! GRIB1 befor summer 2018 (lfi2mv)
+        ENDIF
+
+    CASE('regular_gg')
+      WRITE (ILUOUT0,'(A)') ' | Grib file from French Weather Service - Arpege model'
+      WRITE (ILUOUT0,'(A)') 'but same grid as ECMWF model (unstretched)'
+      IMODEL = 4
+      ALLOCATE(ZPARAM(10))
+    CASE('regular_ll')  
+      WRITE (ILUOUT0,'(A)') ' | Grib file from French Weather Service - Mocage model'
+      IMODEL = 5
+       ALLOCATE(ZPARAM(6))
+    END SELECT    
+  CASE (7)
+    WRITE (ILUOUT0,'(A)') ' | Grib file from National Center for Environmental Prediction'
+    IMODEL = 10
+    ALLOCATE(ZPARAM(6))
+END SELECT
+IF (IMODEL==-1) THEN
+  CALL PRINT_MSG(NVERB_FATAL,'IO','READ_ALL_DATA_GRIB_CASE','unsupported Grib file format')
+END IF
+!
+!---------------------------------------------------------------------------------------
+!* 2.3 Read and interpol orography 
+!---------------------------------------------------------------------------------------
+!
+WRITE (ILUOUT0,'(A)') ' | Searching orography'
+SELECT CASE (IMODEL)
+  CASE(0) ! ECMWF
+     CALL SEARCH_FIELD(IGRIB,INUM_ZS,KPARAM=129)
+     IF(INUM_ZS < 0) THEN
+       WRITE (ILUOUT0,'(A)')'Orography is missing - abort'
+     END IF 
+  CASE(3,4,5) ! arpege et mocage
+      CALL SEARCH_FIELD(IGRIB,INUM_ZS,KPARAM=8)
+       IF(INUM_ZS < 0) THEN
+         WRITE (ILUOUT0,'(A)')'Orography is missing - abort'
+       ENDIF 
+  CASE(1,2) ! aladin et aladin reunion
+      CALL SEARCH_FIELD(IGRIB,INUM_ZS,KPARAM=6)
+       IF(INUM_ZS < 0) THEN
+         WRITE (ILUOUT0,'(A)')'Orography is missing - abort'
+       ENDIF 
+  CASE(6,7) !  arpege and arome GRIB2
+      CALL SEARCH_FIELD(IGRIB,INUM_ZS,KDIS=0,KCAT=3,KNUMBER=4)
+       IF(INUM_ZS < 0) THEN
+         CALL SEARCH_FIELD(IGRIB,INUM_ZS,KDIS=0,KCAT=193,KNUMBER=5)
+         IF(INUM_ZS < 0) THEN
+           WRITE (ILUOUT0,'(A)')'Orography is missing - abort'
+         END IF
+       ENDIF 
+  CASE(10) ! NCEP
+       CALL SEARCH_FIELD(IGRIB,INUM_ZS,KDIS=0,KCAT=3,KNUMBER=5,KTFFS=1)
+        IF(INUM_ZS < 0) THEN
+          WRITE (ILUOUT0,'(A)')'Orography is missing - abort'
+        ENDIF    
+END SELECT
+ZPARAM(:)=-999.
+CALL GRIB_GET(IGRIB(INUM_ZS),'Nj',INJ,IRET_GRIB)
+ALLOCATE(IINLO(INJ))
+CALL COORDINATE_CONVERSION(IMODEL,IGRIB(INUM_ZS),IIU,IJU,ZLONOUT,ZLATOUT,&
+        ZXOUT,ZYOUT,INI,ZPARAM,IINLO)
+ALLOCATE(ZPARAM_ZS(SIZE(ZPARAM)))
+ZPARAM_ZS=ZPARAM
+ALLOCATE(IINLO_ZS(SIZE(IINLO)))
+IINLO_ZS=IINLO
+CALL GRIB_GET_SIZE(IGRIB(INUM_ZS),'values',ISIZE)
+ALLOCATE(ZVALUE(ISIZE))
+CALL GRIB_GET(IGRIB(INUM_ZS),'values',ZVALUE)
+ALLOCATE(ZOUT(INO))
+CALL HORIBL(ZPARAM(3),ZPARAM(4),ZPARAM(5),ZPARAM(6),INT(ZPARAM(2)),IINLO,INI, &
+            ZVALUE,INO,ZXOUT,ZYOUT,ZOUT,.FALSE.,PTIME_HORI,.FALSE.)
+DEALLOCATE(IINLO)
+DEALLOCATE(ZVALUE)
+!
+IF (IMODEL/=10) THEN ! others than NCEP
+  ! Data given in archives are multiplied by the gravity acceleration
+  ZOUT = ZOUT / XG
+END IF
+!
+! Stores the field in a 2 dimension array
+IF (HFILE(1:3)=='ATM') THEN
+  ALLOCATE (XZS_LS(IIU,IJU))
+  ALLOCATE (XZSMT_LS(IIU,IJU))
+  CALL ARRAY_1D_TO_2D (INO,ZOUT,IIU,IJU,XZS_LS)
+  XZSMT_LS = XZS_LS   ! no smooth orography in this case
+ELSE IF (HFILE=='CHEM') THEN
+  ALLOCATE (XZS_SV_LS(IIU,IJU))
+  CALL ARRAY_1D_TO_2D (INO,ZOUT,IIU,IJU,XZS_SV_LS)
+END IF
+DEALLOCATE (ZOUT)
+!
+!---------------------------------------------------------------------------------------
+!* 2.3 bis Read and interpol Sea Wave significant height
+!---------------------------------------------------------------------------------------
+WRITE (ILUOUT0,'(A)') ' | Searching sea wave significant height'
+SELECT CASE (IMODEL)
+  CASE(0) ! ECMWF
+    ALLOCATE (XZWS(IIU,IJU))
+    GFIND=.FALSE.
+    !    
+    CALL SEARCH_FIELD(IGRIB,INUM,KPARAM=140229)
+    IF(INUM < 0) THEN
+      CALL SEARCH_FIELD(IGRIB,INUM,KPARAM=229)
+      !
+      IF(INUM < 0) THEN
+        WRITE (YVAL,'( E15.8 )') XZWS_DEFAULT
+        WRITE (ILUOUT0,'(A)')' | !!! WARNING !!! Sea wave height is missing in '// &
+               'the GRIB file - the default value of '//TRIM(YVAL)//' meters is used'
+        XZWS = XZWS_DEFAULT
+      ELSE
+        GFIND=.TRUE.
+      END IF
+    ELSE
+      GFIND=.TRUE. 
+    END IF
+  !
+  IF (GFIND) THEN
+    !!!!!!!!!!! Faire en sorte de le faire que pour le CASE(0)
+    ! Sea wave significant height disponible uniquement pour ECMWF
+    ! recuperation du tableau de valeurs
+    CALL GRIB_GET_SIZE(IGRIB(INUM),'values',ISIZE)
+    ALLOCATE(IINLO(INJ))
+    CALL COORDINATE_CONVERSION(IMODEL,IGRIB(INUM),IIU,IJU,ZLONOUT,ZLATOUT,&
+          ZXOUT,ZYOUT,INI,ZPARAM,IINLO)
+    ALLOCATE(ZVALUE(ISIZE))
+    CALL GRIB_GET(IGRIB(INUM),'values',ZVALUE)
+    ! Change 9999 value to -1
+    WHERE(ZVALUE.EQ.9999.) ZVALUE=0.
+    ALLOCATE(ZOUT(INO))
+    CALL HORIBL(ZPARAM(3),ZPARAM(4),ZPARAM(5),ZPARAM(6),INT(ZPARAM(2)),IINLO,INI, &
+              ZVALUE,INO,ZXOUT,ZYOUT,ZOUT,.FALSE.,PTIME_HORI,.FALSE.)
+    DEALLOCATE(IINLO)
+    DEALLOCATE(ZVALUE)
+    ! Stores the field in a 2 dimension array
+    CALL ARRAY_1D_TO_2D (INO,ZOUT,IIU,IJU,XZWS)
+    DEALLOCATE (ZOUT)
+  END IF
+END SELECT
+!
+!---------------------------------------------------------------------------------------
+!* 2.4 Interpolation surface pressure
+!---------------------------------------------------------------------------------------
+!
+!*  2.4.1  Read pressure
+!   
+WRITE (ILUOUT0,'(A)') ' | Searching pressure'
+
+SELECT CASE (IMODEL)
+  CASE(0) ! ECMWF
+     CALL SEARCH_FIELD(IGRIB,INUM,KPARAM=152)
+     IF( INUM < 0 ) THEN
+         WRITE (ILUOUT0,'(A)') ' | Logarithm of surface pressure is missing. It is then supposed that'
+         WRITE (ILUOUT0,'(A)') ' | this ECMWF file has atmospheric fields on pressure levels (e.g. ERA5)'
+         CALL SEARCH_FIELD(IGRIB,INUM,KPARAM=134)
+         IMODEL = 11
+     END IF
+  CASE(1,2,3,4,5) ! arpege mocage aladin et aladin reunion
+      CALL SEARCH_FIELD(IGRIB,INUM,KPARAM=1)
+  CASE(6,7) ! NEW AROME,ARPEGE
+     CALL SEARCH_FIELD(IGRIB,INUM,KDIS=0,KCAT=3,KNUMBER=0)
+  CASE(10) ! NCEP
+      CALL SEARCH_FIELD(IGRIB,INUM,KPARAM=134)
+END SELECT
+IF( INUM < 0 ) call Print_msg( NVERB_FATAL, 'IO', 'READ_ALL_DATA_GRIB_CASE', 'surface pressure is missing' )
+! recuperation du tableau de valeurs
+CALL GRIB_GET_SIZE(IGRIB(INUM),'values',ISIZE)
+ALLOCATE(ZVALUE(ISIZE))
+CALL GRIB_GET(IGRIB(INUM),'values',ZVALUE)
+! determination des tableaux ZPS_G et ZLNPS_G
+SELECT CASE (IMODEL)
+  CASE(0,6,7) ! ECMWF
+    ALLOCATE (ZPS_G  (ISIZE))
+    ALLOCATE (ZLNPS_G(ISIZE))
+    ZLNPS_G(:) =     ZVALUE(1:ISIZE)
+    ZPS_G  (:) = EXP(ZVALUE(1:ISIZE))
+  CASE(1,2,3,4,5,10,11) ! arpege mocage aladin aladin-reunion NCEP ERA5
+    ALLOCATE (ZPS_G  (ISIZE))
+    ALLOCATE (ZLNPS_G(ISIZE))
+    ZPS_G  (:) =     ZVALUE(1:ISIZE)
+    ZLNPS_G(:) = LOG(ZVALUE(1:ISIZE)) 
+END SELECT
+DEALLOCATE (ZVALUE)
+!
+!*  2.4.2  Removes pressure points not on orography points
+!       (if pressure is on a regular grid)
+CALL GRIB_GET(IGRIB(INUM),'typeOfGrid',HGRID)
+CALL GRIB_GET(IGRIB(INUM_ZS),'typeOfGrid',HGRID_ZS)
+CALL GRIB_GET(IGRIB(INUM),'Nj',INJ)
+CALL GRIB_GET(IGRIB(INUM_ZS),'Nj',INJ_ZS)
+!
+IF ( HGRID(1:7)=='regular' .AND. HGRID_ZS(1:7)=='reduced' .AND.&
+     INJ == INJ_ZS) THEN
+  call Print_msg( NVERB_FATAL, 'IO', 'READ_ALL_DATA_GRIB_CASE', &
+                  'HGRID(1:7)==regular .AND. HGRID_ZS(1:7)==reduced .AND. INJ == INJ_ZS' )
+ELSE
+   ALLOCATE(ZWORK_LNPS(SIZE(ZLNPS_G)))
+   ZWORK_LNPS(:) = ZLNPS_G(:)
+ENDIF
+!
+IF (HFILE(1:3)=='ATM') THEN
+  ALLOCATE (XPS_LS(IIU,IJU))
+ELSE IF (HFILE=='CHEM') THEN
+  ALLOCATE (XPS_SV_LS(IIU,IJU))
+END IF
+!
+ALLOCATE(IINLO(INJ))
+CALL COORDINATE_CONVERSION(IMODEL,IGRIB(INUM),IIU,IJU,ZLONOUT,ZLATOUT,&
+        ZXOUT,ZYOUT,INI,ZPARAM,IINLO)
+ALLOCATE(ZOUT(INO))
+CALL HORIBL(ZPARAM(3),ZPARAM(4),ZPARAM(5),ZPARAM(6),INT(ZPARAM(2)),IINLO,INI,&
+         ZWORK_LNPS,INO,ZXOUT,ZYOUT,ZOUT,.FALSE.,PTIME_HORI,.FALSE. )
+DEALLOCATE(ZWORK_LNPS)
+DEALLOCATE(IINLO)
+!
+!* 2.4.3 conversion to surface pressure
+!
+ZOUT=EXP(ZOUT)
+IF (HFILE(1:3)=='ATM') THEN
+  CALL ARRAY_1D_TO_2D (INO,ZOUT,IIU,IJU,XPS_LS(:,:))
+ELSE IF (HFILE=='CHEM') THEN
+  CALL ARRAY_1D_TO_2D (INO,ZOUT,IIU,IJU,XPS_SV_LS(:,:))
+END IF
+!JUAN REALZ
+CALL MPPDB_CHECK2D(XZS_LS,"XZS_LS",PRECISION)
+!JUAN REALZ
+DEALLOCATE (ZOUT)
+DEALLOCATE (ZLNPS_G)
+!
+!---------------------------------------------------------------------------------------
+!* 2.5 Interpolation temperature and humidity
+!---------------------------------------------------------------------------------------
+!
+!* 2.5.1 Read T and Q on each level
+!
+WRITE (ILUOUT0,'(A)') ' | Reading T and Q fields'
+!
+IF (IMODEL==11) THEN
+  CALL SEARCH_FIELD(IGRIB,INUM,KPARAM=130,KLEV1=1000) !look for air temperature at pressure level 1000hPa
+  IF (INUM < 0) IMODEL = 0 ! This change is for handling IFS model level grib file obtained by python API
+END IF
+IF (IMODEL/=10.AND.IMODEL/=11) THEN
+  SELECT CASE (IMODEL)
+    CASE(0) ! ECMWF
+          ISTARTLEVEL=1
+          IT=130
+          IQ=133
+    CASE(1,2,3,4,5) ! arpege mocage aladin et aladin reunion
+          IT=11
+          IQ=51
+          ISTARTLEVEL=1
+    CASE(6,7) !GRIB2 AROME AND ARPEGE
+     IT=130
+     IQ=133
+     ISTARTLEVEL=1
+  END SELECT
+        
+  CALL SEARCH_FIELD(IGRIB,INUM,KPARAM=IT,KLEV1=ISTARTLEVEL)
+  IF(INUM < 0) THEN 
+    ISTARTLEVEL=0
+    CALL SEARCH_FIELD(IGRIB,INUM,KPARAM=IT,KLEV1=ISTARTLEVEL)
+  ENDIF
+  IF(INUM < 0) call Print_msg( NVERB_FATAL, 'IO', 'READ_ALL_DATA_GRIB_CASE', 'air temperature is missing' )
+  CALL SEARCH_FIELD(IGRIB,INUM,KPARAM=IQ,KLEV1=ISTARTLEVEL)
+  IF(INUM < 0) call Print_msg( NVERB_FATAL, 'IO', 'READ_ALL_DATA_GRIB_CASE', 'atmospheric specific humidity is missing' )
+ELSEIF (IMODEL==10) THEN ! NCEP
+  ISTARTLEVEL=1000
+  IT=130
+  IQ=157
+  CALL SEARCH_FIELD(IGRIB,INUM,KPARAM=IT,KLEV1=ISTARTLEVEL)
+  IF(INUM < 0) call Print_msg( NVERB_FATAL, 'IO', 'READ_ALL_DATA_GRIB_CASE', 'air temperature is missing' )
+  CALL SEARCH_FIELD(IGRIB,INUM,KPARAM=IQ,KLEV1=ISTARTLEVEL)
+  IF(INUM < 0) call Print_msg( NVERB_FATAL, 'IO', 'READ_ALL_DATA_GRIB_CASE', 'atmospheric relative humidity is missing' )
+ELSE ! ERA5
+  ISTARTLEVEL=1000
+  IT=130
+  IQ=133
+  CALL SEARCH_FIELD(IGRIB,INUM,KPARAM=IT,KLEV1=ISTARTLEVEL)
+  IF(INUM < 0) call Print_msg( NVERB_FATAL, 'IO', 'READ_ALL_DATA_GRIB_CASE', 'air temperature is missing' )
+  CALL SEARCH_FIELD(IGRIB,INUM,KPARAM=IQ,KLEV1=ISTARTLEVEL)
+  IF(INUM < 0) call Print_msg( NVERB_FATAL, 'IO', 'READ_ALL_DATA_GRIB_CASE', 'atmospheric specific humidity is missing' )
+ENDIF
+!
+IF (IMODEL/=10.AND.IMODEL/=11) THEN ! others than NCEP AND ERA5
+  CALL GRIB_GET(IGRIB(INUM),'NV',INLEVEL)
+  INLEVEL = NINT(INLEVEL / 2.) - 1
+  CALL GRIB_GET_SIZE(IGRIB(INUM),'values',ISIZE)
+ELSE
+  IF (IMODEL==10) THEN
+    INLEVEL=JP_GFS
+  ELSE
+    INLEVEL=JP_ERA
+  END IF
+END IF
+!
+ALLOCATE (ZT_G(ISIZE,INLEVEL))
+ALLOCATE (ZQ_G(ISIZE,INLEVEL))
+!
+IF (IMODEL/=10.AND.IMODEL/=11) THEN ! others than NCEP AND ERA5
+  DO JLOOP1=1, INLEVEL
+    ILEV1 = JLOOP1-1+ISTARTLEVEL
+    CALL SEARCH_FIELD(IGRIB,INUM,KPARAM=IQ,KLEV1=ILEV1)
+    IF (INUM< 0) THEN
+      WRITE(YMSG,*) 'atmospheric humidity level ',JLOOP1,' is missing'
+      CALL PRINT_MSG(NVERB_FATAL,'IO','READ_ALL_DATA_GRIB_CASE',YMSG)
+    END IF
+    CALL GRIB_GET(IGRIB(INUM),'values',ZQ_G(:,INLEVEL-JLOOP1+1))
+    CALL SEARCH_FIELD(IGRIB,INUM,KPARAM=IT,KLEV1=ILEV1)
+    IF (INUM< 0) THEN
+      WRITE(YMSG,*) 'atmospheric temperature level ',JLOOP1,' is missing'
+      CALL PRINT_MSG(NVERB_FATAL,'IO','READ_ALL_DATA_GRIB_CASE',YMSG)
+    END IF
+    CALL GRIB_GET(IGRIB(INUM),'values',ZT_G(:,INLEVEL-JLOOP1+1))
+    CALL GRIB_GET(IGRIB(INUM),'Nj',INJ,IRET_GRIB)
+  END DO
+ELSEIF (IMODEL==10) THEN ! NCEP
+  DO JLOOP1=1, INLEVEL
+    ILEV1 = IP_GFS(JLOOP1)
+    CALL SEARCH_FIELD(IGRIB,INUM,KPARAM=IQ,KLEV1=ILEV1)
+    IF (INUM< 0) THEN
+      WRITE(YMSG,*) 'atmospheric humidity level ',JLOOP1,' is missing'
+      CALL PRINT_MSG(NVERB_FATAL,'IO','READ_ALL_DATA_GRIB_CASE',YMSG)
+    END IF
+    CALL GRIB_GET(IGRIB(INUM),'values',ZQ_G(:,JLOOP1),IRET_GRIB)
+    CALL SEARCH_FIELD(IGRIB,INUM,KDIS=0,KCAT=0,KNUMBER=0,KLEV1=ILEV1,KTFFS=100)
+    IF (INUM< 0) THEN
+      WRITE(YMSG,*) 'atmospheric temperature level ',JLOOP1,' is missing'
+      CALL PRINT_MSG(NVERB_FATAL,'IO','READ_ALL_DATA_GRIB_CASE',YMSG)
+    END IF
+    CALL GRIB_GET(IGRIB(INUM),'values',ZT_G(:,JLOOP1),IRET_GRIB)
+    CALL GRIB_GET(IGRIB(INUM),'Nj',INJ,IRET_GRIB)
+  END DO
+ELSE ! ERA5
+  DO JLOOP1=1, INLEVEL
+    ILEV1 = IP_ERA(JLOOP1)
+    CALL SEARCH_FIELD(IGRIB,INUM,KPARAM=IQ,KLEV1=ILEV1)
+    IF (INUM< 0) THEN
+      WRITE(YMSG,*) 'atmospheric humidity level ',JLOOP1,' is missing'
+      CALL PRINT_MSG(NVERB_FATAL,'IO','READ_ALL_DATA_GRIB_CASE',YMSG)
+    END IF
+    CALL GRIB_GET(IGRIB(INUM),'values',ZQ_G(:,JLOOP1),IRET_GRIB)
+    CALL SEARCH_FIELD(IGRIB,INUM,KPARAM=IT,KLEV1=ILEV1)
+    IF (INUM< 0) THEN
+      WRITE(YMSG,*) 'atmospheric temperature level ',JLOOP1,' is missing'
+      CALL PRINT_MSG(NVERB_FATAL,'IO','READ_ALL_DATA_GRIB_CASE',YMSG)
+    END IF
+    CALL GRIB_GET(IGRIB(INUM),'values',ZT_G(:,JLOOP1),IRET_GRIB)
+    CALL GRIB_GET(IGRIB(INUM),'Nj',INJ,IRET_GRIB)
+  END DO
+END IF
+
+ALLOCATE(IINLO(INJ))
+CALL COORDINATE_CONVERSION(IMODEL,IGRIB(INUM),IIU,IJU,ZLONOUT,ZLATOUT,&
+        ZXOUT,ZYOUT,INI,ZPARAM,IINLO)
+!
+!*  2.5.2  Load level definition parameters A and B
+!
+IF (IMODEL/=10.AND.IMODEL/=11) THEN ! others than NCEP AND ERA5
+
+  IF (HFILE(1:3)=='ATM') THEN
+    XP00_LS = 101325.
+  ELSE IF (HFILE=='CHEM') THEN
+    XP00_SV_LS = 101325.
+  END IF
+!
+  IF (INLEVEL > 0) THEN
+    IF (HFILE(1:3)=='ATM') THEN
+      ALLOCATE (XA_LS(INLEVEL))
+      ALLOCATE (XB_LS(INLEVEL))
+    ELSE IF (HFILE=='CHEM') THEN
+      ALLOCATE (XA_SV_LS(INLEVEL))
+      ALLOCATE (XB_SV_LS(INLEVEL))
+    END IF
+!
+    CALL GRIB_GET(IGRIB(INUM),'PVPresent',IPVPRESENT)
+    IF (IPVPRESENT==1) THEN
+       CALL GRIB_GET_SIZE(IGRIB(INUM),'pv',IPV)
+       ALLOCATE(ZPV(IPV))
+       CALL GRIB_GET(IGRIB(INUM),'pv',ZPV)
+    ELSE
+      CALL PRINT_MSG(NVERB_FATAL,'IO','READ_ALL_DATA_GRIB_CASE','there is no PV value in this message')
+    ENDIF
+    SELECT CASE (IMODEL)
+      CASE (0,3,4,6,7)
+        DO JLOOP1 = 1, INLEVEL
+          XA_LS(1 + INLEVEL - JLOOP1) = ZPV(1+JLOOP1) / XP00_LS
+          XB_LS(1 + INLEVEL - JLOOP1) = ZPV(2+INLEVEL+JLOOP1)
+        END DO
+      CASE (1,2)
+        JLOOP2 = 2
+        DO JLOOP1 = 1, INLEVEL
+          JLOOP2 = JLOOP2 + 1
+          XA_LS(1 + INLEVEL - JLOOP1) = ZPV(JLOOP2)
+          JLOOP2 = JLOOP2 + 1
+          XB_LS(1 + INLEVEL - JLOOP1) = ZPV(JLOOP2)
+        END DO
+      CASE (5)
+        DO JLOOP1 = 1, INLEVEL
+          IF (HFILE(1:3)=='ATM') THEN
+            XA_LS(1 + INLEVEL - JLOOP1) = ZPV(1+        JLOOP1) / XP00_LS**2 
+            XB_LS(1 + INLEVEL - JLOOP1) = ZPV(2+INLEVEL+JLOOP1)
+          ELSE IF (HFILE=='CHEM') THEN
+            XA_SV_LS(1 + INLEVEL - JLOOP1) = ZPV(1+        JLOOP1) / XP00_LS**2 
+            XB_SV_LS(1 + INLEVEL - JLOOP1) = ZPV(2+INLEVEL+JLOOP1)
+          END IF
+        END DO
+    END SELECT
+  ELSE
+    CALL PRINT_MSG(NVERB_FATAL,'IO','READ_ALL_DATA_GRIB_CASE','level definition section is missing')
+  END IF
+ELSE
+  ALLOCATE (XA_LS(INLEVEL))
+  ALLOCATE (XB_LS(0))
+  IF (IMODEL==10) THEN
+    XA_LS = 100.*IP_GFS
+  ELSE
+    XA_LS = 100.*IP_ERA
+  END IF
+END IF
+!
+!*  2.5.3  Compute atmospheric pressure on grib grid
+!
+WRITE (ILUOUT0,'(A)') ' | Atmospheric pressure on Grib grid is being computed'
+
+ALLOCATE (ZPF_G(INI,INLEVEL))
+IF (IMODEL/=10.AND.IMODEL/=11) THEN ! others than NCEP and ERA5
+  IF (HFILE(1:3)=='ATM') THEN
+    ZPF_G(:,:) = SPREAD(XA_LS,1,INI)*XP00_LS + &
+    SPREAD(XB_LS,1,INI)*SPREAD(ZPS_G(1:INI),2,INLEVEL)
+  ELSE IF (HFILE=='CHEM') THEN
+    ZPF_G(:,:) = SPREAD(XA_SV_LS,1,INI)*XP00_SV_LS + &
+    SPREAD(XB_SV_LS,1,INI)*SPREAD(ZPS_G(1:INI),2,INLEVEL)
+  END IF
+ELSE
+  IF (IMODEL==10) THEN
+    ZPF_G(:,:) = 100.*SPREAD(IP_GFS,1,INI)
+  ELSE
+    ZPF_G(:,:) = 100.*SPREAD(IP_ERA,1,INI)
+  END IF
+END IF
+DEALLOCATE (ZPS_G)
+!
+ALLOCATE (ZEXNF_G(INI,INLEVEL))
+ZEXNF_G(:,:) = (ZPF_G(:,:)/XP00)**(XRD/XCPD)
+!
+ALLOCATE (ZEXNM_G(INI,INLEVEL))
+ZEXNM_G(:,1:INLEVEL-1) = (ZEXNF_G(:,1:INLEVEL-1)-ZEXNF_G(:,2:INLEVEL)) / &
+                     (LOG(ZEXNF_G(:,1:INLEVEL-1))-LOG(ZEXNF_G(:,2:INLEVEL)))
+ZEXNM_G(:,INLEVEL) = (ZPF_G(:,INLEVEL)/2./XP00)**(XRD/XCPD)
+!
+IF (IMODEL==10.OR.IMODEL==11) ZEXNM_G(:,:)=ZEXNF_G(:,:) ! for GFS and ERA5 on pressure levels
+!
+DEALLOCATE (ZEXNF_G)
+DEALLOCATE (ZPF_G)
+!
+ALLOCATE (ZPM_G(INI,INLEVEL))
+ZPM_G(:,:) = XP00*(ZEXNM_G(:,:))**(XCPD/XRD)
+!
+!*  2.5.4  Compute the relative humidity and the interpolate Thetav, P, Q and H
+!
+IF (IMODEL==1) THEN
+  ! search cloud_water in Arome case (forecast)
+  ISTARTLEVEL = 1
+  IPAR=246
+  CALL SEARCH_FIELD(IGRIB,INUM,KPARAM=IPAR,KLEV1=ISTARTLEVEL)
+  IF (INUM < 0) THEN
+    ISTARTLEVEL = 0
+    CALL SEARCH_FIELD(IGRIB,INUM,KPARAM=IPAR,KLEV1=ISTARTLEVEL)
+  END IF
+  IF (INUM > 0) THEN
+    WRITE (ILUOUT0,'(A)') ' | Grib file from French Weather Service - Arome model (forecast)'
+    LCPL_AROME=.TRUE.
+    NRR=6
+  END IF
+  ! search also turbulent kinetic energy 
+  ISTARTLEVEL = 1
+  IPAR=251
+  CALL SEARCH_FIELD(IGRIB,INUM,KPARAM=IPAR,KLEV1=ISTARTLEVEL)
+  IF (INUM < 0) THEN
+    ISTARTLEVEL = 0
+    CALL SEARCH_FIELD(IGRIB,INUM,KPARAM=IPAR,KLEV1=ISTARTLEVEL)
+  END IF
+  IF (INUM > 0) CTURB='TKEL'
+END IF
+
+IF (IMODEL==6) THEN ! GRIB2 AROME
+! search cloud_water in Arome case (forecast)
+  ISTARTLEVEL = 1
+  CALL SEARCH_FIELD(IGRIB,INUM,KDIS=0,KCAT=6,KNUMBER=6,KLEV1=ISTARTLEVEL)
+  IF (INUM < 0) THEN
+    ISTARTLEVEL = 0
+    CALL SEARCH_FIELD(IGRIB,INUM,KDIS=0,KCAT=6,KNUMBER=6,KLEV1=ISTARTLEVEL)
+  END IF
+  IF (INUM < 0) THEN
+    ISTARTLEVEL = 1
+    CALL SEARCH_FIELD(IGRIB,INUM,KDIS=0,KCAT=1,KNUMBER=0,KLEV1=ISTARTLEVEL)
+  END IF
+  IF (INUM > 0) THEN
+    WRITE (ILUOUT0,'(A)') ' | Grib file from French Weather Service - Arome model (forecast)'
+    LCPL_AROME=.TRUE.
+    NRR=6
+  END IF
+  ! search also turbulent kinetic energy 
+  ISTARTLEVEL = 1
+  CALL SEARCH_FIELD(IGRIB,INUM,KDIS=0,KCAT=19,KNUMBER=11,KLEV1=ISTARTLEVEL)
+  IF (INUM < 0) THEN
+    ISTARTLEVEL = 0
+    CALL SEARCH_FIELD(IGRIB,INUM,KDIS=0,KCAT=19,KNUMBER=11,KLEV1=ISTARTLEVEL)
+  END IF
+  IF (INUM > 0) CTURB='TKEL'
+END IF
+!
+!
+WRITE (ILUOUT0,'(A)') ' | Computing relative humidity on each level'
+ALLOCATE (ZH_G(INI))
+ALLOCATE (ZH_LS(IIU,IJU,INLEVEL))
+IF (HFILE(1:3)=='ATM') THEN
+  ALLOCATE (XT_LS(IIU,IJU,INLEVEL))
+  ALLOCATE (XQ_LS(IIU,IJU,INLEVEL,NRR)) ; XQ_LS=0.
+ELSE IF (HFILE=='CHEM') THEN
+  ALLOCATE (XT_SV_LS(IIU,IJU,INLEVEL))
+  ALLOCATE (XQ_SV_LS(IIU,IJU,INLEVEL,1))
+END IF
+IF (CTURB=='TKEL') THEN
+  IF (ALLOCATED(XTKE_LS)) DEALLOCATE(XTKE_LS)
+  ALLOCATE(XTKE_LS(IIU,IJU,INLEVEL)) ; XTKE_LS=0.
+ELSE
+  IF (ALLOCATED(XTKE_LS)) DEALLOCATE(XTKE_LS)
+  ALLOCATE(XTKE_LS(0,0,0))
+END IF
+ALLOCATE (ZTHV_LS(IIU,IJU,INLEVEL))
+ALLOCATE (ZTHV_G(INI))
+ALLOCATE (ZRV_G(INI))
+ALLOCATE (ZOUT(INO))
+IF (IMODEL/=10) THEN ! others than NCEP
+  DO JLOOP1=1, INLEVEL
+    !
+    ! Compute Theta V and relative humidity on grib grid
+    !
+    !   (1/rv) = (1/q)  -  1
+    !   Thetav = T . (P0/P)^(Rd/Cpd) . ( (1 + (Rv/Rd).rv) / (1 + rv) )
+    !   Hu = P / ( ( (Rd/Rv) . ((1/rv) - 1) + 1) . Es(T) )
+    !
+    ZRV_G(:) = 1. / (1./MAX(ZQ_G(:,JLOOP1),1.E-12) - 1.)
+    !
+    ZTHV_G(:)=ZT_G(:,JLOOP1) * ((XP00/ZPM_G(:,JLOOP1))**(XRD/XCPD)) * &
+                             ((1. + XRV*ZRV_G(:)/XRD) / (1. + ZRV_G(:)))
+    !
+    ZH_G(1:INI) = 100. * ZPM_G(:,JLOOP1) / ( (XRD/XRV)*(1./ZRV_G(:)+1.)*SM_FOES(ZT_G(:,JLOOP1)) )
+    ZH_G(:) = MAX(MIN(ZH_G(:),100.),0.)
+    !
+    ! Interpolation : H           
+    CALL HORIBL(ZPARAM(3),ZPARAM(4),ZPARAM(5),ZPARAM(6),INT(ZPARAM(2)),IINLO,INI, &
+        ZH_G,INO,ZXOUT,ZYOUT,ZOUT,.FALSE.,PTIME_HORI,.FALSE.)
+    CALL ARRAY_1D_TO_2D (INO,ZOUT,IIU,IJU,ZH_LS(:,:,JLOOP1))
+    ZH_LS(:,:,JLOOP1) = MAX(MIN(ZH_LS(:,:,JLOOP1),100.),0.)
+    !
+    ! interpolation : Theta V
+    CALL HORIBL(ZPARAM(3),ZPARAM(4),ZPARAM(5),ZPARAM(6),INT(ZPARAM(2)),IINLO,INI, &
+        ZTHV_G,INO,ZXOUT,ZYOUT,ZOUT,.FALSE.,PTIME_HORI,.FALSE.)
+    CALL ARRAY_1D_TO_2D (INO,ZOUT,IIU,IJU,ZTHV_LS(:,:,JLOOP1))
+    !
+  END DO
+ELSE !GFS and ERA5 on pressure levels
+  DO JLOOP1=1, INLEVEL
+    ZH_G(:)  =ZQ_G(:,JLOOP1)
+    ZRV_G(:) = (XRD/XRV)*SM_FOES(ZT_G(:,JLOOP1))*0.01*ZH_G(:) &
+                        /(ZPM_G(:,JLOOP1) -SM_FOES(ZT_G(:,JLOOP1))*0.01*ZH_G(:))
+    ZTHV_G(:)=ZT_G(:,JLOOP1) * ((XP00/ZPM_G(:,JLOOP1))**(XRD/XCPD)) * &
+                               ((1. + XRV*ZRV_G(:)/XRD) / (1. + ZRV_G(:)))
+    !
+    ! Interpolation : H           
+    CALL HORIBL(ZPARAM(3),ZPARAM(4),ZPARAM(5),ZPARAM(6),INT(ZPARAM(2)),IINLO,INI, &
+          ZH_G,INO,ZXOUT,ZYOUT,ZOUT,.FALSE.,PTIME_HORI,.FALSE.)
+    CALL ARRAY_1D_TO_2D (INO,ZOUT,IIU,IJU,ZH_LS(:,:,JLOOP1))
+    ZH_LS(:,:,JLOOP1) = MAX(MIN(ZH_LS(:,:,JLOOP1),100.),0.)
+    !
+    ! interpolation : Theta V
+    CALL HORIBL(ZPARAM(3),ZPARAM(4),ZPARAM(5),ZPARAM(6),INT(ZPARAM(2)),IINLO,INI, &
+          ZTHV_G,INO,ZXOUT,ZYOUT,ZOUT,.FALSE.,PTIME_HORI,.FALSE.)
+    CALL ARRAY_1D_TO_2D (INO,ZOUT,IIU,IJU,ZTHV_LS(:,:,JLOOP1))
+    !
+  END DO
+END IF
+  
+DEALLOCATE (ZOUT)
+
+
+!---------------------------------------------------------------------------------------
+!* 2.5.4.2 Read and interpol geopotential height for interpolation on isobaric surface Grid of NCEP 
+!---------------------------------------------------------------------------------------
+!
+ALLOCATE (ZGH_G(ISIZE,INLEVEL))
+!
+IF (IMODEL==10.OR.IMODEL==11) THEN !NCEP or ERA5 with pressure grid only
+ DO JLOOP1=1, INLEVEL
+  IF (IMODEL==10) THEN
+    ILEV1 = IP_GFS(JLOOP1)
+    CALL SEARCH_FIELD(IGRIB,INUM,KDIS=0,KCAT=3,KNUMBER=5,KLEV1=ILEV1)
+  ELSE
+    ILEV1 = IP_ERA(JLOOP1)
+    CALL SEARCH_FIELD(IGRIB,INUM,KPARAM=129,KLEV1=ILEV1)
+  END IF
+    IF (INUM< 0) THEN
+    !callabortstop
+      WRITE(YMSG,*) 'Geopotential height level ',JLOOP1,' is missing'
+      CALL PRINT_MSG(NVERB_FATAL,'GEN','READ_ALL_DATA_GRIB_CASE',YMSG)
+    END IF
+  !
+  CALL GRIB_GET(IGRIB(INUM),'values',ZGH_G(:,JLOOP1),IRET_GRIB)
+  CALL GRIB_GET(IGRIB(INUM),'Nj',INJ,IRET_GRIB)
+  !
+  IF (IMODEL/=10) THEN
+    ! Data given in archives are multiplied by the gravity acceleration
+    ZGH_G(:,JLOOP1) = ZGH_G(:,JLOOP1) / XG
+  END IF
+  !
+  END DO
+ !
+ CALL COORDINATE_CONVERSION(IMODEL,IGRIB(INUM_ZS),IIU,IJU,ZLONOUT,ZLATOUT,&
+          ZXOUT,ZYOUT,INI,ZPARAM,IINLO)
+ !
+ ALLOCATE(ZOUT(INO))
+ ALLOCATE(XGH_LS(IIU,IJU,INLEVEL))
+ !
+ DO JLOOP1=1, INLEVEL
+  CALL HORIBL(ZPARAM(3),ZPARAM(4),ZPARAM(5),ZPARAM(6),INT(ZPARAM(2)),IINLO,INI, &
+              ZGH_G(:,JLOOP1),INO,ZXOUT,ZYOUT,ZOUT,.FALSE.,PTIME_HORI,.FALSE.)
+  CALL ARRAY_1D_TO_2D (INO,ZOUT,IIU,IJU,XGH_LS(:,:,JLOOP1))
+ END DO
+ DEALLOCATE(ZOUT)
+END IF
+!
+!*  2.5.5  Compute atmospheric pressure on MESO-NH grid
+!
+WRITE (ILUOUT0,'(A)') ' | Atmospheric pressure on the Meso-NH grid is being computed'
+ALLOCATE (ZPF_LS(IIU,IJU,INLEVEL))
+IF (IMODEL/=10.AND.IMODEL/=11) THEN ! others than NCEP and ERA5
+  IF (HFILE(1:3)=='ATM') THEN
+    ZPF_LS(:,:,:) = SPREAD(SPREAD(XA_LS,1,IIU),2,IJU)*XP00_LS + &
+    SPREAD(SPREAD(XB_LS,1,IIU),2,IJU)*SPREAD(XPS_LS,3,INLEVEL)
+  ELSE IF (HFILE=='CHEM') THEN
+    ZPF_LS(:,:,:) = SPREAD(SPREAD(XA_SV_LS,1,IIU),2,IJU)*XP00_LS + &
+    SPREAD(SPREAD(XB_SV_LS,1,IIU),2,IJU)*SPREAD(XPS_SV_LS,3,INLEVEL)
+  END IF
+ELSE
+  IF(IMODEL==10) THEN
+    ZPF_LS(:,:,:) = 100.*SPREAD(SPREAD(IP_GFS,1,IIU),2,IJU)
+  ELSE
+    ZPF_LS(:,:,:) = 100.*SPREAD(SPREAD(IP_ERA,1,IIU),2,IJU)
+  END IF
+END IF  
+!
+ALLOCATE (ZEXNF_LS(IIU,IJU,INLEVEL))
+ZEXNF_LS(:,:,:) = (ZPF_LS(:,:,:)/XP00)**(XRD/XCPD)
+!
+ALLOCATE (ZEXNM_LS(IIU,IJU,INLEVEL))
+ZEXNM_LS(:,:,1:INLEVEL-1) = (ZEXNF_LS(:,:,1:INLEVEL-1)-ZEXNF_LS(:,:,2:INLEVEL)) / &
+                     (LOG(ZEXNF_LS(:,:,1:INLEVEL-1))-LOG(ZEXNF_LS(:,:,2:INLEVEL)))
+ZEXNM_LS(:,:,INLEVEL) = (ZPF_LS(:,:,INLEVEL)/2./XP00)**(XRD/XCPD)
+!
+IF (IMODEL==10.OR.IMODEL==11) ZEXNM_LS(:,:,:)=ZEXNF_LS(:,:,:) ! for GFS and ERA5 on pressure levels
+!
+DEALLOCATE (ZEXNF_LS)
+DEALLOCATE (ZPF_LS)
+!
+ALLOCATE (ZPM_LS(IIU,IJU,INLEVEL))
+ZPM_LS(:,:,:) = XP00*(ZEXNM_LS(:,:,:))**(XCPD/XRD)
+!
+!*  2.5.6 Compute the vapor mixing ratio and the final specific humdity
+!
+!  The vapor mixing ratio is calculated by an interating process on rv and
+!  Thetav. Have a look to MODE_THERMO for further informations.
+ALLOCATE (ZR_DUM(IIU,IJU,INLEVEL,1))
+ALLOCATE (ZRV_LS(IIU,IJU,INLEVEL))
+ALLOCATE (ZTEV_LS(IIU,IJU,INLEVEL))
+ZTEV_LS(:,:,:) = ZTHV_LS(:,:,:) * ZEXNM_LS(:,:,:)
+ZRV_LS(:,:,:) = SM_PMR_HU(ZPM_LS(:,:,:),                &
+ZTEV_LS(:,:,:),ZH_LS(:,:,:),ZR_DUM(:,:,:,:),KITERMAX=100)
+IF (HFILE(1:3)=='ATM') THEN
+  XQ_LS(:,:,:,1) = ZRV_LS(:,:,:) / (1. + ZRV_LS(:,:,:))
+ELSE IF (HFILE=='CHEM') THEN
+  XQ_SV_LS(:,:,:,1) = ZRV_LS(:,:,:) / (1. + ZRV_LS(:,:,:))
+ENDIF
+!JUAN
+CALL  MPPDB_CHECK3D(XQ_LS(:,:,:,1),"XQ_LS",PRECISION)
+!JUAN
+DEALLOCATE (ZTEV_LS)
+DEALLOCATE (ZH_LS)
+DEALLOCATE (ZR_DUM)
+!
+!*  2.5.7 Compute T from the interpolated Theta V
+!
+!   T = Thetav . (P/P0)^(Rd/Cpd) . ((1 + rv) / (1 + (Rv/Rd).rv))
+!!
+IF (HFILE(1:3)=='ATM') THEN
+  XT_LS(:,:,:) = ZTHV_LS(:,:,:) * ZEXNM_LS(:,:,:) &
+                              * ((1.+ZRV_LS(:,:,:))/(1.+(XRV/XRD)*ZRV_LS(:,:,:)))
+ CALL MPPDB_CHECK3D(XT_LS,"XT_LS",PRECISION)
+ELSE IF (HFILE=='CHEM') THEN
+  XT_SV_LS(:,:,:) = ZTHV_LS(:,:,:) * ZEXNM_LS(:,:,:) &
+                              * ((1.+ZRV_LS(:,:,:))/(1.+(XRV/XRD)*ZRV_LS(:,:,:)))
+ CALL MPPDB_CHECK3D(XT_SV_LS,"XT_SV_LS",PRECISION)
+ENDIF
+!
+DEALLOCATE (ZRV_LS)
+DEALLOCATE (ZTHV_LS)
+DEALLOCATE (ZPM_LS)
+DEALLOCATE (ZEXNM_LS)
+!
+!*  2.5.8 Read the other specific ratios (if Arome model)
+!
+IF (NRR >1) THEN
+  IF (IMODEL==1) THEN
+    WRITE (ILUOUT0,'(A)') ' | Reading Q fields (except humidity)'
+    DO JLOOP2=1,NRR-1
+      IPAR=246+JLOOP2-1
+      DO JLOOP1=1, INLEVEL
+        ILEV1 = JLOOP1-1+ISTARTLEVEL
+        CALL SEARCH_FIELD(IGRIB,INUM,KPARAM=IPAR,KLEV1=ILEV1)
+
+        IF (INUM < 0) THEN
+          WRITE(YMSG,*) 'Specific ratio ',IPAR,' at level ',JLOOP1,' is missing'
+          CALL PRINT_MSG(NVERB_FATAL,'IO','READ_ALL_DATA_GRIB_CASE',YMSG)
+        END IF
+        CALL GRIB_GET_SIZE(IGRIB(INUM),'values',ISIZE)
+        ALLOCATE(ZVALUE(ISIZE))
+        CALL GRIB_GET(IGRIB(INUM),'values',ZVALUE)
+        ALLOCATE(ZOUT(INO))
+        CALL HORIBL(ZPARAM(3),ZPARAM(4),ZPARAM(5),ZPARAM(6),INT(ZPARAM(2)),IINLO,INI, &
+                    ZVALUE,INO,ZXOUT,ZYOUT,ZOUT,.FALSE.,PTIME_HORI,.FALSE.)
+        CALL ARRAY_1D_TO_2D(INO,ZOUT,IIU,IJU,XQ_LS(:,:,INLEVEL-JLOOP1+1,1+JLOOP2))
+        DEALLOCATE (ZVALUE)
+        DEALLOCATE (ZOUT)
+      END DO
+    END DO 
+  ELSE ! GRIB2 AROME IMODEL =6
+    WRITE (ILUOUT0,'(A)') ' | Reading Q fields (except humidity)'
+    DO JLOOP1=1, INLEVEL
+      ILEV1 = JLOOP1-1+ISTARTLEVEL
+      CALL SEARCH_FIELD(IGRIB,INUM,KDIS=0,KCAT=1,KNUMBER=83,KLEV1=ILEV1)
+
+      IF (INUM < 0) THEN
+        WRITE(YMSG,*) 'Specific ratio ',IPAR,' at level ',JLOOP1,' is missing'
+        CALL PRINT_MSG(NVERB_FATAL,'IO','READ_ALL_DATA_GRIB_CASE',YMSG)
+      END IF
+      CALL GRIB_GET_SIZE(IGRIB(INUM),'values',ISIZE)
+      ALLOCATE(ZVALUE(ISIZE))
+      CALL GRIB_GET(IGRIB(INUM),'values',ZVALUE)
+      ALLOCATE(ZOUT(INO))
+      CALL HORIBL(ZPARAM(3),ZPARAM(4),ZPARAM(5),ZPARAM(6),INT(ZPARAM(2)),IINLO,INI, &
+        ZVALUE,INO,ZXOUT,ZYOUT,ZOUT,.FALSE.,PTIME_HORI,.FALSE.)
+      CALL ARRAY_1D_TO_2D(INO,ZOUT,IIU,IJU,XQ_LS(:,:,INLEVEL-JLOOP1+1,2))
+      DEALLOCATE (ZVALUE)
+      DEALLOCATE (ZOUT)
+    END DO
+
+    DO JLOOP1=1, INLEVEL
+      ILEV1 = JLOOP1-1+ISTARTLEVEL
+      CALL SEARCH_FIELD(IGRIB,INUM,KDIS=0,KCAT=1,KNUMBER=85,KLEV1=ILEV1)
+
+      IF (INUM < 0) THEN
+        WRITE(YMSG,*) 'Specific ratio for rain at level ',JLOOP1,' is missing'
+        CALL PRINT_MSG(NVERB_FATAL,'IO','READ_ALL_DATA_GRIB_CASE',YMSG)
+      END IF
+      CALL GRIB_GET_SIZE(IGRIB(INUM),'values',ISIZE)
+      ALLOCATE(ZVALUE(ISIZE))
+      CALL GRIB_GET(IGRIB(INUM),'values',ZVALUE)
+      ALLOCATE(ZOUT(INO))
+      CALL HORIBL(ZPARAM(3),ZPARAM(4),ZPARAM(5),ZPARAM(6),INT(ZPARAM(2)),IINLO,INI, &
+        ZVALUE,INO,ZXOUT,ZYOUT,ZOUT,.FALSE.,PTIME_HORI,.FALSE.)
+      CALL ARRAY_1D_TO_2D(INO,ZOUT,IIU,IJU,XQ_LS(:,:,INLEVEL-JLOOP1+1,3))
+      DEALLOCATE (ZVALUE)
+      DEALLOCATE (ZOUT)
+    END DO  
+
+
+    DO JLOOP1=1, INLEVEL
+      ILEV1 = JLOOP1-1+ISTARTLEVEL
+      CALL SEARCH_FIELD(IGRIB,INUM,KDIS=0,KCAT=1,KNUMBER=84,KLEV1=ILEV1)
+      IF (INUM < 0) THEN
+        WRITE(YMSG,*) 'Specific ratio for ICE at level ',JLOOP1,' is missing'
+        CALL PRINT_MSG(NVERB_FATAL,'IO','READ_ALL_DATA_GRIB_CASE',YMSG)
+      END IF
+      CALL GRIB_GET_SIZE(IGRIB(INUM),'values',ISIZE)
+      ALLOCATE(ZVALUE(ISIZE))
+      CALL GRIB_GET(IGRIB(INUM),'values',ZVALUE)
+      ALLOCATE(ZOUT(INO))
+      CALL HORIBL(ZPARAM(3),ZPARAM(4),ZPARAM(5),ZPARAM(6),INT(ZPARAM(2)),IINLO,INI, &
+        ZVALUE,INO,ZXOUT,ZYOUT,ZOUT,.FALSE.,PTIME_HORI,.FALSE.)
+      CALL ARRAY_1D_TO_2D(INO,ZOUT,IIU,IJU,XQ_LS(:,:,INLEVEL-JLOOP1+1,4))
+      DEALLOCATE (ZVALUE)
+      DEALLOCATE (ZOUT)
+    END DO
+
+
+    DO JLOOP1=1, INLEVEL
+      ILEV1 = JLOOP1-1+ISTARTLEVEL
+      CALL SEARCH_FIELD(IGRIB,INUM,KDIS=0,KCAT=1,KNUMBER=86,KLEV1=ILEV1)
+      IF (INUM < 0) THEN
+        WRITE(YMSG,*) 'Specific ratio ',IPAR,' at level ',JLOOP1,' is missing'
+        CALL PRINT_MSG(NVERB_FATAL,'IO','READ_ALL_DATA_GRIB_CASE',YMSG)
+      END IF
+      CALL GRIB_GET_SIZE(IGRIB(INUM),'values',ISIZE)
+      ALLOCATE(ZVALUE(ISIZE))
+      CALL GRIB_GET(IGRIB(INUM),'values',ZVALUE)
+      ALLOCATE(ZOUT(INO))
+      CALL HORIBL(ZPARAM(3),ZPARAM(4),ZPARAM(5),ZPARAM(6),INT(ZPARAM(2)),IINLO,INI, &
+        ZVALUE,INO,ZXOUT,ZYOUT,ZOUT,.FALSE.,PTIME_HORI,.FALSE.)
+      CALL ARRAY_1D_TO_2D(INO,ZOUT,IIU,IJU,XQ_LS(:,:,INLEVEL-JLOOP1+1,5))
+      DEALLOCATE (ZVALUE)
+      DEALLOCATE (ZOUT)
+    END DO
+
+
+    DO JLOOP1=1, INLEVEL
+      ILEV1 = JLOOP1-1+ISTARTLEVEL
+      CALL SEARCH_FIELD(IGRIB,INUM,KDIS=0,KCAT=1,KNUMBER=201,KLEV1=ILEV1)
+      IF (INUM < 0) THEN
+        WRITE(YMSG,*) 'Specific ratio ',IPAR,' at level ',JLOOP1,' is missing'
+        CALL PRINT_MSG(NVERB_FATAL,'IO','READ_ALL_DATA_GRIB_CASE',YMSG)
+      END IF
+      CALL GRIB_GET_SIZE(IGRIB(INUM),'values',ISIZE)
+      ALLOCATE(ZVALUE(ISIZE))
+      CALL GRIB_GET(IGRIB(INUM),'values',ZVALUE)
+      ALLOCATE(ZOUT(INO))
+      CALL HORIBL(ZPARAM(3),ZPARAM(4),ZPARAM(5),ZPARAM(6),INT(ZPARAM(2)),IINLO,INI, &
+        ZVALUE,INO,ZXOUT,ZYOUT,ZOUT,.FALSE.,PTIME_HORI,.FALSE.)
+      CALL ARRAY_1D_TO_2D(INO,ZOUT,IIU,IJU,XQ_LS(:,:,INLEVEL-JLOOP1+1,6))
+      DEALLOCATE (ZVALUE)
+      DEALLOCATE (ZOUT)
+    END DO
+  END IF
+END IF
+!
+IF (CTURB=='TKEL') THEN
+  WRITE (ILUOUT0,'(A)') ' | Reading TKE field'
+  DO JLOOP1=1, INLEVEL
+    ILEV1 = JLOOP1-1+ISTARTLEVEL
+    IF (IMODEL==1) THEN
+      CALL SEARCH_FIELD(IGRIB,INUM,KPARAM=251,KLEV1=ILEV1)
+    ELSE ! case 6 new arome
+      CALL SEARCH_FIELD(IGRIB,INUM,KDIS=0,KCAT=19,KNUMBER=11,KLEV1=ILEV1)
+    END IF
+    IF (INUM <  0) THEN
+      WRITE(YMSG,*) 'TKE at level ',JLOOP1,' is missing'
+      CALL PRINT_MSG(NVERB_FATAL,'IO','READ_ALL_DATA_GRIB_CASE',YMSG)
+    END IF
+    CALL GRIB_GET_SIZE(IGRIB(INUM),'values',ISIZE)
+    ALLOCATE(ZVALUE(ISIZE))
+    CALL GRIB_GET(IGRIB(INUM),'values',ZVALUE)
+    ALLOCATE(ZOUT(INO))
+    CALL HORIBL(ZPARAM(3),ZPARAM(4),ZPARAM(5),ZPARAM(6),INT(ZPARAM(2)),IINLO,INI, &
+        ZVALUE,INO,ZXOUT,ZYOUT,ZOUT,.FALSE.,PTIME_HORI,.FALSE.)
+    CALL ARRAY_1D_TO_2D(INO,ZOUT,IIU,IJU,XTKE_LS(:,:,INLEVEL-JLOOP1+1))
+    DEALLOCATE (ZVALUE)
+    DEALLOCATE (ZOUT)
+  END DO
+END IF
+DEALLOCATE(IINLO)
+!
+!---------------------------------------------------------------------------------------
+!* 2.6 Interpolation of MOCAGE variable
+!---------------------------------------------------------------------------------------
+
+IF (IMODEL==5) THEN 
+  LUSECHEM = .TRUE.
+  IF (LORILAM) THEN
+    CORGANIC = "MPMPO"
+    LVARSIGI = .TRUE.
+    LVARSIGJ = .TRUE.
+  END IF
+  ! initialise NSV_* variables
+  CALL INI_NSV(IMI)
+  IF( HFILE=='ATM0' ) THEN
+    ALLOCATE (XSV_LS(IIU,IJU,INLEVEL,NSV))
+  ELSE IF (HFILE=='CHEM' ) THEN
+    DEALLOCATE(XSV_LS)
+    ALLOCATE (XSV_LS(IIU,IJU,INLEVEL,NSV))
+  ELSE
+    CALL PRINT_MSG(NVERB_FATAL,'IO','READ_ALL_DATA_GRIB_CASE','Mocage model: Bad input argument in read_all_data_grib_case')
+  END IF
+  XSV_LS(:,:,:,:) = 0.
+  ILEV1=-1
+!
+  WRITE (ILUOUT0,'(A,A4,A)') ' | Reading Mocage species (ppv) from ',HFILE,' file'
+!
+!*       2.6.1  read mocage species
+!
+! open input file
+  CALL CH_OPEN_INPUT(YPRE_MOC, "MOC2MESONH", TZFILE, ILUOUT0, KVERB)
+  ICHANNEL = TZFILE%NLU
+!
+! read number of mocage species to transfer into mesonh
+  READ(ICHANNEL, *) IMOC
+  IF (KVERB >= 5) WRITE(ILUOUT0,*) "number of mocage species to transfer into mesonh : ", IMOC
+!
+! read data input format
+  READ(ICHANNEL,"(A)") YFORMAT
+  YFORMAT=UPCASE(YFORMAT)
+  IF (KVERB >= 5) WRITE(ILUOUT0,*) "input format is: ", YFORMAT
+!
+! allocate fields
+  ALLOCATE(YMNHNAME(IMOC))
+  ALLOCATE(INUMGRIB(IMOC))
+!
+! read variables names and Grib code
+  IF (INDEX(YFORMAT,'A') < INDEX(YFORMAT,'I')) THEN
+    DO JI = 1, IMOC
+      READ(ICHANNEL,YFORMAT) YMNHNAME(JI), INUMGRIB(JI)
+      WRITE(ILUOUT0,YFORMAT) YMNHNAME(JI), INUMGRIB(JI)
+    END DO
+  ELSE
+    DO JI = 1, IMOC
+      READ(ICHANNEL,YFORMAT) INUMGRIB(JI), YMNHNAME(JI)
+      WRITE(ILUOUT0,YFORMAT) INUMGRIB(JI), YMNHNAME(JI)
+    END DO
+  ENDIF
+  !
+  ! close file
+  CALL IO_File_close(TZFILE)
+  TZFILE => NULL()
+  !
+  !*  2.6.2   exchange mocage values onto prognostic variables XSV_LS
+  !
+  IF (KVERB >= 10) WRITE(ILUOUT0,'(A,I4)') ' NEQ=',NEQ
+  !
+  DO JNREAL = 1, NEQ
+    INACT = 0
+    search_loop2 : DO JN = 1, IMOC
+      IF (CNAMES(JNREAL) .EQ. YMNHNAME(JN)) THEN
+        INACT = JN
+        EXIT search_loop2
+      END IF
+    END DO search_loop2
+    IF (INACT .NE. 0) THEN
+      DO JLOOP1=1, INLEVEL
+        ILEV1 = JLOOP1
+        CALL SEARCH_FIELD(IGRIB,INUM,KPARAM=INUMGRIB(JN),KLEV1=ILEV1)
+        IF (INUM <  0) THEN
+          WRITE(YMSG,*) 'Atmospheric ',INUMGRIB(JN),' grib chemical species level ',JLOOP1,' is missing'
+          CALL PRINT_MSG(NVERB_FATAL,'IO','READ_ALL_DATA_GRIB_CASE',YMSG)
+        END IF
+        CALL GRIB_GET(IGRIB(INUM),'Nj',INJ,IRET_GRIB)
+        ALLOCATE(IINLO(INJ))
+        CALL COORDINATE_CONVERSION(IMODEL,IGRIB(INUM),IIU,IJU,ZLONOUT,ZLATOUT,&
+          ZXOUT,ZYOUT,INI,ZPARAM,IINLO)
+        CALL GRIB_GET_SIZE(IGRIB(INUM),'values',ISIZE)
+        ALLOCATE(ZVALUE(ISIZE))
+        CALL GRIB_GET(IGRIB(INUM),'values',ZVALUE)
+        ALLOCATE(ZOUT(INO))
+        CALL HORIBL(ZPARAM(3),ZPARAM(4),ZPARAM(5),ZPARAM(6),INT(ZPARAM(2)),IINLO,INI, &
+           ZVALUE,INO,ZXOUT,ZYOUT,ZOUT,.FALSE.,PTIME_HORI,.TRUE. )
+        CALL ARRAY_1D_TO_2D(INO,ZOUT,IIU,IJU, &
+                            XSV_LS(:,:,INLEVEL-JLOOP1+1,JNREAL))
+        DEALLOCATE (ZVALUE)
+        DEALLOCATE (ZOUT)
+        DEALLOCATE(IINLO)
+      END DO
+    END IF
+  END DO
+  XSV_LS(:,:,:,:) = MAX(XSV_LS(:,:,:,:),0.)
+ELSE
+  LORILAM  = .FALSE. 
+  LUSECHEM = .FALSE. 
+  ! initialise NSV_* variables
+  CALL INI_NSV(1)
+  IF (NSV > 0) THEN 
+    ALLOCATE (XSV_LS(IIU,IJU,INLEVEL,NSV))
+    XSV_LS(:,:,:,:) = 0.
+  ELSE 
+    ALLOCATE(XSV_LS(0,0,0,0))
+  END IF
+END IF
+!
+!---------------------------------------------------------------------------------------
+!* 2.7 Search, read, interpolate and project winds
+!---------------------------------------------------------------------------------------
+!
+! The way winds are processed depends upon the type of archive :
+!
+! -> ECMWF, NCEP
+!   Winds are projected from a standard lat,lon grid to MesoNH grid. This correcponds to
+!   a rotation of an angle :
+!    Alpha = k.(L-L0) - Beta
+!   k,L0 and Beta definiiton parameter of MesoNH grid
+!   L longitude of the point of the tangent coordinate system
+!
+! -> Aladin
+!   The grid used by Aladin files is the same than the one of MesoNH. !
+! So we have 2 sets  of parameters :
+!     k   L0   Beta      for MesoNH
+!     k'  L0'  Beta'     for Aladin (Beta'=0 for Aladin)
+!   We applied twice the formula seen for standard lat,lon grid and we get :
+!    Alpha = k.(L-L0) - Beta - k'.(L-L0')
+!
+! -> Arpege
+! Arpege winds are given on the tangent coordinate system of the stretched grid.
+! Therefore they have first to be projected on a standard lat,lon grid. This is done
+! before the interpolation. The projection formulas were given by Meteo France.
+! After this projection, the file is simil
+!
+IF (HFILE(1:3)=='ATM') THEN
+ISTARTLEVEL = 1
+ALLOCATE (XU_LS(IIU,IJU,INLEVEL))
+ALLOCATE (XV_LS(IIU,IJU,INLEVEL))
+ALLOCATE (ZTU_LS(INO))
+ALLOCATE (ZTV_LS(INO))
+!
+SELECT CASE (IMODEL)
+  CASE (0,6,7)
+    IPAR = 131
+    CALL SEARCH_FIELD(IGRIB,INUM,KPARAM=IPAR,KLEV1=ISTARTLEVEL)
+    IF (INUM< 0) THEN
+      ISTARTLEVEL = 0
+    CALL SEARCH_FIELD(IGRIB,INUM,KPARAM=IPAR,KLEV1=ISTARTLEVEL)
+    END IF
+  CASE (1,2,3)
+    IPAR  = 33
+    CALL SEARCH_FIELD(IGRIB,INUM,KPARAM=IPAR,KLEV1=ISTARTLEVEL)
+    IF (INUM < 0) THEN
+      ISTARTLEVEL = 0
+      CALL SEARCH_FIELD(IGRIB,INUM,KPARAM=IPAR,KLEV1=ISTARTLEVEL)
+    END IF
+  CASE (10,11)
+    IPAR = 131
+    ISTARTLEVEL = 1
+END SELECT
+
+DO JLOOP1 = ISTARTLEVEL, ISTARTLEVEL+INLEVEL-1
+  IF (IMODEL/=10.AND.IMODEL/=11) THEN ! others than NCEP and ERA5
+    ILEV1 = JLOOP1
+  ELSE
+    IF(IMODEL==10) THEN
+      ILEV1 = IP_GFS(INLEVEL+ISTARTLEVEL-JLOOP1)
+    ELSE
+      ILEV1 = IP_ERA(INLEVEL+ISTARTLEVEL-JLOOP1)
+    END IF
+  END IF
+  ! read component u 
+  CALL SEARCH_FIELD(IGRIB,INUM,KPARAM=IPAR,KLEV1=ILEV1)
+  IF (INUM < 0) THEN
+    WRITE(YMSG,*) 'wind vector component "u" at level ',JLOOP1,' is missing'
+    CALL PRINT_MSG(NVERB_FATAL,'IO','READ_ALL_DATA_GRIB_CASE',YMSG)
+  END IF
+  CALL GRIB_GET_SIZE(IGRIB(INUM),'values',ISIZE)
+  ALLOCATE(ZVALUE(ISIZE))
+  CALL GRIB_GET(IGRIB(INUM),'values',ZVALUE)
+  IF (IMODEL==3.OR.(IMODEL==7)) THEN
+    ALLOCATE(ZTU0_LS(INI))
+    ZTU0_LS(:) = ZVALUE(:)
+  ELSE
+    CALL GRIB_GET(IGRIB(INUM),'Nj',INJ,IRET_GRIB)
+    IF(ALLOCATED(IINLO)) DEALLOCATE (IINLO)
+    ALLOCATE(IINLO(INJ))      
+    CALL COORDINATE_CONVERSION(IMODEL,IGRIB(INUM),IIU,IJU,ZLONOUT,ZLATOUT,&
+          ZXOUT,ZYOUT,INI,ZPARAM,IINLO)
+    ALLOCATE(ZOUT(INO))
+    CALL HORIBL(ZPARAM(3),ZPARAM(4),ZPARAM(5),ZPARAM(6),INT(ZPARAM(2)),IINLO,INI, &
+           ZVALUE,INO,ZXOUT,ZYOUT,ZOUT,.TRUE.,PTIME_HORI,.FALSE. )
+    ZTU_LS(:) = ZOUT(:)
+    DEALLOCATE(IINLO)
+    DEALLOCATE(ZOUT)
+  END IF
+  DEALLOCATE (ZVALUE)
+  ! read component v and perform interpolation if not Arpege grid
+  IF (IMODEL/=10.AND.IMODEL/=11) THEN ! others than NCEP and ERA5
+    ILEV1 = JLOOP1
+  ELSE
+    IF(IMODEL==10) THEN
+      ILEV1 = IP_GFS(INLEVEL+ISTARTLEVEL-JLOOP1)
+    ELSE
+      ILEV1 = IP_ERA(INLEVEL+ISTARTLEVEL-JLOOP1)
+    END IF
+  END IF
+  CALL SEARCH_FIELD(IGRIB,INUM,KPARAM=IPAR+1,KLEV1=ILEV1)
+  IF (INUM < 0) THEN
+    WRITE(YMSG,*) 'wind vector component "v" at level ',JLOOP1,' is missing'
+    CALL PRINT_MSG(NVERB_FATAL,'IO','READ_ALL_DATA_GRIB_CASE',YMSG)
+  END IF
+  CALL GRIB_GET_SIZE(IGRIB(INUM),'values',ISIZE)
+  ALLOCATE(ZVALUE(ISIZE))
+  CALL GRIB_GET(IGRIB(INUM),'values',ZVALUE)
+  IF ((IMODEL==3).OR.(IMODEL==7)) THEN 
+    CALL GRIB_GET(IGRIB(INUM),'Nj',INJ,IRET_GRIB)
+    ALLOCATE(IINLO(INJ))         
+    CALL COORDINATE_CONVERSION(IMODEL,IGRIB(INUM),IIU,IJU,ZLONOUT,ZLATOUT,&
+          ZXOUT,ZYOUT,INI,ZPARAM,IINLO)     
+    ALLOCATE(ZTV0_LS(INI))
+    ZTV0_LS(:) = ZVALUE(:)
+  ELSE
+     CALL GRIB_GET(IGRIB(INUM),'Nj',INJ,IRET_GRIB)
+    ALLOCATE(IINLO(INJ))          
+    CALL COORDINATE_CONVERSION(IMODEL,IGRIB(INUM),IIU,IJU,ZLONOUT,ZLATOUT,&
+          ZXOUT,ZYOUT,INI,ZPARAM,IINLO)
+    ALLOCATE(ZOUT(INO))
+    CALL HORIBL(ZPARAM(3),ZPARAM(4),ZPARAM(5),ZPARAM(6),INT(ZPARAM(2)),IINLO,INI, &
+           ZVALUE,INO,ZXOUT,ZYOUT,ZOUT,.TRUE.,PTIME_HORI,.FALSE.)
+    ZTV_LS(:) = ZOUT(:)
+    DEALLOCATE(ZOUT)
+  END IF
+  DEALLOCATE (ZVALUE)
+   ! interpolations for arpege grid
+  IF ((IMODEL==3).OR.(IMODEL==7)) THEN
+    ! Comes back to real winds instead of stretched winds
+    ! (but still with components according to Arpege grid axes)
+    ZLATPOLE = ZPARAM(7) * XPI/180.
+    ZLONPOLE = ZPARAM(8) * XPI/180.
+    ZC       = ZPARAM(9)
+    ZD       = ZC * ZC
+    JLOOP3 = 0
+    JLOOP4 = 1
+    ZLAT = ZPARAM(3) * XPI / 180.
+    DO JLOOP2=1, INI
+      ZLON = JLOOP3 * 2. * XPI / IINLO(JLOOP4)
+      ! Compute the scale factor
+      ZA = ((1.+ZD) - (1.-ZD)*SIN(ZLAT)) / (2. * ZC)
+      ZTU0_LS(JLOOP2) = ZTU0_LS(JLOOP2) * ZA
+      ZTV0_LS(JLOOP2) = ZTV0_LS(JLOOP2) * ZA
+      ! next parallel
+      JLOOP3 = JLOOP3 + 1
+      IF (JLOOP3 == IINLO(JLOOP4)) THEN
+        JLOOP3 = 0
+        ZLAT = ZLAT + (((ZPARAM(5)-ZPARAM(3))/(ZPARAM(2)-1)) * XPI / 180.)
+        JLOOP4 = JLOOP4 + 1
+      END IF
+    END DO
+    !
+    ! interpolation
+    CALL HORIBL(ZPARAM(3),ZPARAM(4),ZPARAM(5),ZPARAM(6),INT(ZPARAM(2)),IINLO,&
+                INI,ZTU0_LS,INO,ZXOUT,ZYOUT,ZTU_LS,.TRUE.,PTIME_HORI,.FALSE.)
+    CALL HORIBL(ZPARAM(3),ZPARAM(4),ZPARAM(5),ZPARAM(6),INT(ZPARAM(2)),IINLO,&
+                INI,ZTV0_LS,INO,ZXOUT,ZYOUT,ZTV_LS,.TRUE.,PTIME_HORI,.FALSE.)
+    DEALLOCATE(IINLO)
+    !
+    ! Rotation of the components from Arpege grid axes to real sphere axes
+    !
+    DO JLOOP2=1, INO
+      ZLAT = ZYOUT(JLOOP2) * XPI / 180.
+      ZLON = ZXOUT(JLOOP2) * XPI / 180.
+      ! Compute the rotation matrix
+      ZA = (ZD+1.) + (ZD-1.)*SIN(ZLAT)
+      ZB = (ZD-1.) + (ZD+1.)*SIN(ZLAT)
+      ZE = 2.*ZC*COS(ZLATPOLE)*COS(ZLAT)*COS(ZLON) + ZB*SIN(ZLATPOLE)
+      IF (ABS(ZE) .GE. ABS(ZA)) THEN
+        ZF = -2.*ZC*COS(ZLATPOLE)/ ( COS(ZLAT)* ((ZD+1.)+(ZD-1.)*SIN(ZLATPOLE)) )
+        ZSIN = -ZF*SIN(ZLONPOLE-ZLON)
+        ZCOS =  ZF*COS(ZLONPOLE-ZLON)
+      ELSE
+        ZF = 1. / SQRT(ZA*ZA - ZE*ZE)
+        ZSIN = -COS(ZLATPOLE)*SIN(ZLON)*ZA*ZF
+        ZCOS = (2.*ZC*SIN(ZLATPOLE)*COS(ZLAT)-ZB*COS(ZLATPOLE)*COS(ZLON))*ZF
+      ENDIF
+      ZTEMP = ZTU_LS(JLOOP2)
+      ZTU_LS(JLOOP2) = ZCOS*ZTEMP - ZSIN*ZTV_LS(JLOOP2)
+      ZTV_LS(JLOOP2) = ZSIN*ZTEMP + ZCOS*ZTV_LS(JLOOP2)
+    END DO
+  END IF
+  !
+  ! Rotation of the components from the real sphere axes (Arpege, CEP)
+  ! or model axes (Aladin) to MESO-NH axes
+  !
+  JLOOP4=0
+  DO JJ=1,IJU
+    DO JI=1,IIU
+      JLOOP4=JLOOP4+1
+      IF (IMODEL==2 .OR. IMODEL==1 ) THEN 
+          IF (IMODEL==2) THEN          ! ALADIN  REUNION
+              ZALPHA=0
+          ELSE  !ALADIN
+              ZALPHA = (XRPK*(ZLONOUT(JLOOP4)-XLON0)-XBETA) - &
+              (SIN(ZPARAM(9)*XPI/180.)*(ZLONOUT(JLOOP4)-ZPARAM(10)))
+          ENDIF
+      ELSE  ! CEP, ARPEGE (after projection)
+          ZALPHA = XRPK*(ZLONOUT(JLOOP4)-XLON0)-XBETA
+      ENDIF
+      ZALPHA = ZALPHA * XPI / 180.
+      XU_LS(JI,JJ,INLEVEL+ISTARTLEVEL-JLOOP1)= &
+          ZTU_LS(JLOOP4)*COS(ZALPHA) - ZTV_LS(JLOOP4)*SIN(ZALPHA)
+      XV_LS(JI,JJ,INLEVEL+ISTARTLEVEL-JLOOP1)= &
+          ZTU_LS(JLOOP4)*SIN(ZALPHA) + ZTV_LS(JLOOP4)*COS(ZALPHA)
+    ENDDO
+  ENDDO
+  IF ((IMODEL==3).OR.(IMODEL==7)) THEN ! deallocation of Arpege arrays
+    DEALLOCATE (ZTU0_LS)
+    DEALLOCATE (ZTV0_LS)
+  END IF
+END DO
+DEALLOCATE (ZTU_LS)
+DEALLOCATE (ZTV_LS)
+IF(ALLOCATED(IINLO)) DEALLOCATE (IINLO)
+END IF
+!
+!-------------------------------------------------------------------------------
+!* 2.8 Filter the characteristics of the large-scale vortex
+!-------------------------------------------------------------------------------
+IF (HFILE(1:3)=='ATM' .AND. LFILTERING) THEN
+  WRITE (ILUOUT0,'(A)') ' | Starting the filtering of the fields to remove large-scale vortex'
+  IF (INDEX(CFILTERING,'Q')/=0) THEN
+    WRITE (ILUOUT0,'(A)') ' -> Filtering of Q is now available!'       
+    WRITE (ILUOUT0,'(A,A5)') ' CFILTERING= ',CFILTERING
+  ENDIF
+  !
+  IF (INDEX(CFILTERING,'P')/=0) THEN
+    ! compute reduced surface pressure
+    ALLOCATE(ZTVF_LS(IIU,IJU),ZMSLP_LS(IIU,IJU))
+    ! compute pressure reduced to first level above mean sea level
+    !                                        (rather than above ground level)
+    ZGAMREF=-6.5E-3
+    !virtual temperature at the first level above ground
+    ZTVF_LS(:,:) = XT_LS(:,:,1)*(1.+XQ_LS(:,:,1,1)*(XRV/XRD-1))
+    !virtual temperature averaged between first level above ground
+    !                                 and first level above sea level
+    ZTVF_LS(:,:) = ZTVF_LS(:,:)-0.5*ZGAMREF*XZS_LS(:,:)
+    ZMSLP_LS(:,:)=XPS_LS(:,:)*EXP(XG*XZS_LS(:,:)/(XRD*ZTVF_LS(:,:)))
+  ENDIF
+  !
+  IF (INDEX(CFILTERING,'P')==0) THEN
+    IF (INDEX(CFILTERING,'Q')==0) THEN
+      CALL REMOVAL_VORTEX(XZS_LS,XU_LS,XV_LS,XT_LS)
+    ELSE
+      CALL REMOVAL_VORTEX(XZS_LS,XU_LS,XV_LS,XT_LS,PQ_LS=XQ_LS(:,:,:,1))
+    ENDIF
+  ELSE
+    IF (INDEX(CFILTERING,'Q')==0) THEN
+      CALL REMOVAL_VORTEX(XZS_LS,XU_LS,XV_LS,XT_LS,PPS_LS=ZMSLP_LS)
+    ELSE
+      CALL REMOVAL_VORTEX(XZS_LS,XU_LS,XV_LS,XT_LS,PQ_LS=XQ_LS(:,:,:,1),PPS_LS=ZMSLP_LS)
+    ENDIF
+    XPS_LS(:,:)  = ZMSLP_LS(:,:)*EXP(-XG*XZS_LS(:,:)/(XRD*ZTVF_LS(:,:)))
+    DEALLOCATE(ZTVF_LS,ZMSLP_LS)
+  ENDIF
+  !
+END IF
+!
+!---------------------------------------------------------------------------------------
+!* 2.9 Read date
+!---------------------------------------------------------------------------------------
+!
+WRITE (ILUOUT0,'(A)') ' | Reading date'
+CALL GRIB_GET(IGRIB(INUM),'dataDate',IDATE,IRET_GRIB)
+CALL GRIB_GET(IGRIB(INUM),'dataTime',ITIME,IRET_GRIB)
+TPTCUR%xtime=ITIME/100*3600+(ITIME-(ITIME/100)*100)*60
+TPTCUR%nyear=IDATE/10000
+TPTCUR%nmonth=INT((IDATE-TPTCUR%nyear*10000)/100)
+TPTCUR%nday=IDATE-TPTCUR%nyear*10000-TPTCUR%nmonth*100
+CALL GRIB_GET(IGRIB(INUM),'startStep',ITIMESTEP,IRET_GRIB)
+CALL GRIB_GET(IGRIB(INUM),'stepUnits',CSTEPUNIT,IRET_GRIB)
+IF (IMODEL==0.OR.IMODEL==11) THEN
+  ITWOZS=0
+  IF ((TPTCUR%nyear ==2000).AND.(TPTCUR%nmonth  >11)) ITWOZS=1
+  IF ((TPTCUR%nyear ==2000).AND.(TPTCUR%nmonth ==11)) THEN
+    IF ( (TPTCUR%nday   >20 )   .OR.   &
+        ((TPTCUR%nday  ==20 ).AND.(TPTCUR%xtime >=64800 ))) ITWOZS=1
+  END IF
+  IF ( TPTCUR%nyear ==2001 )  ITWOZS=1
+  IF ((TPTCUR%nyear ==2002).AND.(TPTCUR%nmonth  <11)) ITWOZS=1
+  IF ((TPTCUR%nyear ==2002).AND.(TPTCUR%nmonth ==11)) THEN
+    IF ( (TPTCUR%nday   <24 )   .OR.   &
+        ((TPTCUR%nday  ==25 ).AND.(TPTCUR%xtime  <64800 ))) ITWOZS=1
+  END IF
+  IF (ITWOZS==1) &
+    WRITE(ILUOUT0,*) ' Check that both orography fields on 1st model level and on surface are used.'
+END IF
+
+CALL MPPDB_CHECK3D(XU_LS,"XU_LS",PRECISION)
+CALL MPPDB_CHECK3D(XV_LS,"XV_LS",PRECISION)
+
+SELECT CASE (CSTEPUNIT)       ! Time unit indicator
+  CASE ('h')                    !hour
+    TPTCUR%xtime = TPTCUR%xtime + ITIMESTEP*3600.
+  CASE ('m')                    !minute
+    TPTCUR%xtime = TPTCUR%xtime + ITIMESTEP*60.
+  CASE ('s')                    !minute
+    TPTCUR%xtime = TPTCUR%xtime + ITIMESTEP
+   CASE DEFAULT
+    WRITE (ILUOUT0,'(A,A,A)') ' | error CSTEPUNIT=',CSTEPUNIT, ' is different of s,m or h'
+END SELECT
+CALL DATETIME_CORRECTDATE(TPTCUR)
+IF (HFILE(1:3)=='ATM') THEN
+  CALL SM_PRINT_TIME(TPTCUR,TLUOUT0,'MESONH current date')
+  TDTCUR = TPTCUR
+  TDTMOD = TPTCUR
+  TDTSEG = TPTCUR
+  TDTEXP = TPTCUR
+ELSE IF (HFILE=='CHEM') THEN
+  CALL SM_PRINT_TIME(TPTCUR,TLUOUT0,'current date in MesoNH format')
+ENDIF
+!
+!-------------------------------------------------------------------------------
+!* 2.10 Read and interpolate dummy fields listed in free-format part of nml file
+!-------------------------------------------------------------------------------
+IF (ODUMMY_REAL) THEN
+  !
+  WRITE (ILUOUT0,'(A)') ' | Try to read 2D dummy fields'
+  !
+  !*       2.10.1   read 2D dummy fields
+  !
+  ! close file
+  CALL IO_File_close(TPPRE_REAL1)
+  ! open input file
+  CALL CH_OPEN_INPUT(TPPRE_REAL1%CNAME, "DUMMY_2D", TZFILE, ILUOUT0, KVERB)
+  ICHANNEL = TZFILE%NLU
+  !
+  ! read number of dummy 2D fields to transfer into mesonh
+  READ(ICHANNEL, *) IMOC
+  IF (KVERB >= 5) WRITE(ILUOUT0,*) "number of dummy fields to transfer into Mesonh : ", IMOC
+  ALLOCATE(XDUMMY_2D(IIU,IJU,IMOC),CDUMMY_2D(IMOC))
+  ALLOCATE(INUMGRIB(IMOC),INUMLEV(IMOC),INUMLEV1(IMOC),INUMLEV2(IMOC))
+  INUMLEV(:)=-1 ; INUMLEV1(:)=-1 ; INUMLEV2(:)=-1
+  !
+  IVAR=0
+  ! read variables names and Grib codes
+  DO JI = 1, IMOC
+    READ(ICHANNEL,'(A)') YINPLINE
+    YINPLINE= TRIM(ADJUSTL(YINPLINE))
+    IF (LEN_TRIM(YINPLINE) == 0) CYCLE ! skip blank line
+    ! transform tab and comma character into blank
+    DO JJ=1,LEN_TRIM(YINPLINE)
+      IF (YINPLINE(JJ:JJ)==YPTAB .OR. YINPLINE(JJ:JJ)==YPCOM) YINPLINE(JJ:JJ)= ' '
+    END DO
+    IF (KVERB >= 10) WRITE(ILUOUT0,*) 'Line read : ', YINPLINE
+    ! extract field name
+    INDX= INDEX(YINPLINE,' ')
+    YFIELD= YINPLINE(1:INDX-1)
+    IF (KVERB >= 5) WRITE(ILUOUT0,*) 'Field being treated : ', YFIELD
+    ITYP=105
+    ILEV1=-1
+    ILEV2=-1
+    ! extract the parameter indicator
+    YINPLINE= ADJUSTL(YINPLINE(INDX:))
+    INDX= INDEX(YINPLINE,' ')
+    IF (INDX == 1) THEN
+      WRITE(ILUOUT0,*) ' Parameter indicator is missing. ',YFIELD,' not treated.'
+      CYCLE
+    END IF
+    IVAR=IVAR+1
+    READ(YINPLINE(1:INDX-1),*) IPAR
+    IF (NVERB>=5) WRITE(ILUOUT0,*) ' Parameter indicator: ',IPAR
+    ! extract the level indicator (optional)
+    YINPLINE= ADJUSTL(YINPLINE(INDX:))
+    INDX= INDEX(YINPLINE,' ')
+    IF (INDX /= 1) THEN
+      READ(YINPLINE(1:INDX-1),*) ITYP
+      IF (NVERB>=5) WRITE(ILUOUT0,*) ' Level indicator is indicated: ',ITYP 
+    END IF
+    ! extract the first level value (optional)
+    YINPLINE= ADJUSTL(YINPLINE(INDX:))
+    INDX= INDEX(YINPLINE,' ')
+    IF (INDX /= 1) THEN
+      READ(YINPLINE(1:INDX-1),*) ILEV1
+      IF (NVERB>=5) WRITE(ILUOUT0,*) ' Level1 value is indicated: ',ILEV1
+    END IF
+    ! extract the second level value (optional)
+    YINPLINE= ADJUSTL(YINPLINE(INDX:))
+    INDX= INDEX(YINPLINE,' ')
+    IF (INDX /= 1) THEN
+      READ(YINPLINE(1:INDX-1),*) ILEV2
+      IF (NVERB>=5) WRITE(ILUOUT0,*) ' Level2 value is indicated: ',ILEV2
+    END IF
+    !
+    CDUMMY_2D(IVAR)=YFIELD ; INUMGRIB(IVAR)=IPAR
+    INUMLEV(IVAR)=ITYP     ; INUMLEV1(IVAR)=ILEV1 ; INUMLEV2(IVAR)=ILEV2
+    !
+  END DO
+  !
+  CALL IO_File_close(TZFILE)
+  TZFILE => NULL()
+  !
+  IF (NVERB>=10) THEN
+    WRITE(ILUOUT0,*) CDUMMY_2D(1:IVAR)
+    WRITE(ILUOUT0,*) INUMGRIB(1:IVAR)
+    WRITE(ILUOUT0,*) INUMLEV(1:IVAR)
+    WRITE(ILUOUT0,*) INUMLEV1(1:IVAR)
+    WRITE(ILUOUT0,*) INUMLEV2(1:IVAR)
+  END IF
+  !
+  IF (IVAR /= IMOC) THEN
+    WRITE (ILUOUT0,'(A,I3,A,I3,A)') ' -> Number of correct lines (',IVAR,') is different of ',IMOC,' - abort'
+    WRITE(YMSG,*) 'number of correct lines (',IVAR,') is different of ',IMOC
+    CALL PRINT_MSG(NVERB_FATAL,'IO','READ_ALL_DATA_GRIB_CASE',YMSG)
+  END IF
+  !
+  !* 2.10.2 read and interpolate variables onto dummy variables XDUMMY_2D
+  !
+  DO JI = 1, IMOC
+    WRITE(ILUOUT0,'(A,4(I3,1X))') CDUMMY_2D(JI),INUMGRIB(JI),INUMLEV(JI),INUMLEV1(JI),INUMLEV2(JI)
+    CALL SEARCH_FIELD(IGRIB,INUM,KPARAM=IPAR,KLEV1=ILEV1)
+    IF (INUM < 0) THEN
+      WRITE (ILUOUT0,'(A,I3,A,I2,A)') ' -> 2D field ',INUMGRIB(JI),' is missing - abort'
+      WRITE(YMSG,*) '2D field ',INUMGRIB(JI),' is missing'
+      CALL PRINT_MSG(NVERB_FATAL,'IO','READ_ALL_DATA_GRIB_CASE',YMSG)
+    END IF
+    CALL GRIB_GET(IGRIB(INUM),'Nj',INJ,IRET_GRIB)
+    ALLOCATE(IINLO(INJ))
+    CALL COORDINATE_CONVERSION(IMODEL,IGRIB(INUM),IIU,IJU,ZLONOUT,ZLATOUT,&
+        ZXOUT,ZYOUT,INI,ZPARAM,IINLO)
+    CALL GRIB_GET_SIZE(IGRIB(INUM),'values',ISIZE)
+    ALLOCATE(ZVALUE(ISIZE))
+    CALL GRIB_GET(IGRIB(INUM_ZS),'values',ZVALUE)
+    ALLOCATE(ZOUT(INO))
+    CALL HORIBL(ZPARAM(3),ZPARAM(4),ZPARAM(5),ZPARAM(6),INT(ZPARAM(2)),IINLO,INI, &
+         ZVALUE,INO,ZXOUT,ZYOUT,ZOUT,.FALSE.,PTIME_HORI,.FALSE. )
+    DEALLOCATE(IINLO)
+    DEALLOCATE(ZVALUE)
+    CALL ARRAY_1D_TO_2D(INO,ZOUT,IIU,IJU,XDUMMY_2D(:,:,JI))
+    DEALLOCATE (ZOUT)
+  END DO
+!
+ENDIF
+!
+!---------------------------------------------------------------------------------------
+!
+!* 3. VERTICAL GRID
+!
+IF (HFILE(1:3)=='ATM') THEN
+  WRITE (ILUOUT0,'(A)') ' | Reading of vertical grid in progress'
+  CALL READ_VER_GRID(TPPRE_REAL1)
+END IF
+
+!
+!---------------------------------------------------------------------------------------
+!
+!* 4. Free all temporary allocations
+!
+DEALLOCATE (ZLATOUT)
+DEALLOCATE (ZLONOUT)
+DEALLOCATE (ZXOUT)
+DEALLOCATE (ZYOUT)
+DEALLOCATE(ZPARAM)
+DEALLOCATE(ZPARAM_ZS)
+DEALLOCATE(IINLO_ZS)
+DO JLOOP=1,ICOUNT
+  CALL GRIB_RELEASE(IGRIB(JLOOP))
+ENDDO
+DEALLOCATE(IGRIB)
+
+WRITE (ILUOUT0,'(A,A4,A)') ' -- Grib decoder for ',HFILE,' file ended successfully'
+!
+!---------------------------------------------------------------------------------------
+!---------------------------------------------------------------------------------------
+!---------------------------------------------------------------------------------------
+!
+!
+
+!
+CONTAINS
+!
+!
+!     ##########################################################################
+      SUBROUTINE ARRAY_1D_TO_2D (KN1,P1,KL1,KL2,P2)
+!     ##########################################################################
+!
+!       Small routine used to store a linear array into a 2 dimension array
+!
+IMPLICIT NONE
+INTEGER,                INTENT(IN)  :: KN1
+REAL,DIMENSION(KN1),    INTENT(IN)  :: P1
+INTEGER,                INTENT(IN)  :: KL1
+INTEGER,                INTENT(IN)  :: KL2
+REAL,DIMENSION(KL1,KL2),INTENT(OUT) :: P2
+INTEGER                 :: JLOOP1_A1T2
+INTEGER                 :: JLOOP2_A1T2
+INTEGER                 :: JPOS_A1T2
+!
+IF (KN1 < KL1*KL2) THEN
+  CALL PRINT_MSG(NVERB_FATAL,'GEN','ARRAY_1D_TO_2D','sizes do not match')
+END IF
+JPOS_A1T2 = 1
+DO JLOOP2_A1T2 = 1, KL2
+  DO JLOOP1_A1T2 = 1, KL1
+    P2(JLOOP1_A1T2,JLOOP2_A1T2) = P1(JPOS_A1T2)
+    JPOS_A1T2 = JPOS_A1T2 + 1
+  END DO
+END DO
+END SUBROUTINE ARRAY_1D_TO_2D
+!
+!
+!---------------------------------------------------------------------------------------
+!---------------------------------------------------------------------------------------
+!---------------------------------------------------------------------------------------
+!#################################################################################
+SUBROUTINE SEARCH_FIELD(KGRIB,KNUM,KPARAM,KDIS,KCAT,KNUMBER,KLEV1,KTFFS)
+!#################################################################################
+! search the grib message corresponding to KPARAM,KLTYPE,KLEV1,KLEV2 in all 
+! the KGIRB messages
+!
+USE MODD_LUNIT
+USE GRIB_API
+!
+IMPLICIT NONE
+!
+!
+INTEGER(KIND=kindOfInt),DIMENSION(:),INTENT(IN) :: KGRIB ! number of grib messages
+INTEGER,INTENT(OUT)             :: KNUM  ! number of the message researched
+INTEGER,INTENT(IN),OPTIONAL     :: KPARAM ! INdicator of parameter/paramId
+INTEGER,INTENT(IN),OPTIONAL     :: KDIS ! Discipline (GRIB2)
+INTEGER,INTENT(IN),OPTIONAL     :: KCAT ! Catégorie (GRIB2)
+INTEGER,INTENT(IN),OPTIONAL     :: KNUMBER ! parameterNumber (GRIB2)
+INTEGER,INTENT(IN),OPTIONAL     :: KLEV1  ! Level 
+INTEGER,INTENT(IN),OPTIONAL     :: KTFFS  ! TypeOfFirstFixedSurface 
+!
+! Declaration of local variables
+!
+INTEGER :: IFOUND  ! Number of correct parameters
+INTEGER :: ISEARCH  ! Number of correct parameters to find
+INTEGER :: IRET    ! error code 
+INTEGER :: IPARAM,IDIS,ICAT,INUMBER,ITFFS
+INTEGER :: ILEV1   ! Level parameter 1
+INTEGER :: JLOOP   ! Dummy counter
+INTEGER :: IVERSION
+! Variables used to display messages
+INTEGER :: ILUOUT0   ! Logical unit number of the listing
+!
+ILUOUT0 = TLUOUT0%NLU
+!
+ISEARCH=0
+! Initialize as not found
+KNUM = -1
+!
+IF (PRESENT(KPARAM)) ISEARCH=ISEARCH+1
+IF (PRESENT(KDIS)) ISEARCH=ISEARCH+1
+IF (PRESENT(KCAT)) ISEARCH=ISEARCH+1
+IF (PRESENT(KNUMBER)) ISEARCH=ISEARCH+1
+IF (PRESENT(KLEV1)) ISEARCH=ISEARCH+1
+IF(PRESENT(KTFFS)) ISEARCH=ISEARCH+1
+!
+DO JLOOP=1,SIZE(KGRIB)
+      IFOUND = 0
+      ! 
+      CALL GRIB_GET(KGRIB(JLOOP),'editionNumber',IVERSION,IRET_GRIB)
+      IF (IRET_GRIB >   0) THEN
+        WRITE (ILUOUT0,'(A)')' | Error encountered in the Grib file, skipping field'
+        CYCLE
+      ELSE IF (IRET_GRIB == -6) THEN
+        WRITE (ILUOUT0,'(A)')' | ECMWF pseudo-Grib data encountered, skipping field'
+        CYCLE
+      ENDIF
+      !
+     IF (PRESENT(KTFFS)) THEN
+        CALL GRIB_GET(KGRIB(JLOOP),'typeOfFirstFixedSurface',ITFFS,IRET_GRIB)
+        IF (IRET_GRIB >   0) THEN
+          WRITE (ILUOUT0,'(A)')' | Error encountered in the Grib file, skipping field'
+          CYCLE
+        ELSE IF (IRET_GRIB == -6) THEN
+          WRITE (ILUOUT0,'(A)')' | ECMWF pseudo-Grib data encountered, skipping field'
+          CYCLE
+        ENDIF
+        IF (ITFFS==KTFFS) THEN
+          IFOUND = IFOUND + 1
+        ELSE
+          CYCLE
+        ENDIF
+      ENDIF
+
+      IF (PRESENT(KPARAM)) THEN
+        IF (IVERSION == 2) THEN
+          CALL GRIB_GET(KGRIB(JLOOP),'paramId',IPARAM,IRET_GRIB)
+        ELSE
+          CALL GRIB_GET(KGRIB(JLOOP),'indicatorOfParameter',IPARAM,IRET_GRIB)
+        ENDIF
+        IF (IRET_GRIB >   0) THEN
+          WRITE (ILUOUT0,'(A)')' | Error encountered in the Grib file, skipping field'
+          CYCLE
+        ELSE IF (IRET_GRIB == -6) THEN
+          WRITE (ILUOUT0,'(A)')' | ECMWF pseudo-Grib data encountered, skipping field'
+          CYCLE
+        ENDIF
+        IF (IPARAM==KPARAM) THEN
+                IFOUND = IFOUND + 1
+        ELSE
+          CYCLE
+        ENDIF
+      ENDIF
+      !
+      IF (PRESENT(KDIS)) THEN
+        CALL GRIB_GET(KGRIB(JLOOP),'discipline',IDIS,IRET_GRIB)
+        IF (IRET_GRIB >   0) THEN
+          WRITE (ILUOUT0,'(A)')' | Error encountered in the Grib file, skipping field'
+          CYCLE
+        ELSE IF (IRET_GRIB == -6) THEN
+          WRITE (ILUOUT0,'(A)')' | ECMWF pseudo-Grib data encountered, skipping field'
+          CYCLE
+        ENDIF
+        IF (IDIS==KDIS) THEN
+          IFOUND = IFOUND + 1
+        ELSE
+          CYCLE
+        ENDIF
+      ENDIF
+      IF (PRESENT(KCAT)) THEN
+        CALL GRIB_GET(KGRIB(JLOOP),'parameterCategory',ICAT,IRET_GRIB)
+        IF (IRET_GRIB >   0) THEN
+          WRITE (ILUOUT0,'(A)')' | Error encountered in the Grib file, skipping field'
+          CYCLE
+        ELSE IF (IRET_GRIB == -6) THEN
+          WRITE (ILUOUT0,'(A)')' | ECMWF pseudo-Grib data encountered, skipping field'
+          CYCLE
+        ENDIF
+        IF (ICAT==KCAT) THEN
+          IFOUND = IFOUND + 1
+        ELSE
+          CYCLE
+        ENDIF
+      ENDIF
+      IF (PRESENT(KNUMBER)) THEN      
+        CALL GRIB_GET(KGRIB(JLOOP),'parameterNumber',INUMBER,IRET_GRIB)
+        IF (IRET_GRIB >   0) THEN
+          WRITE (ILUOUT0,'(A)')' | Error encountered in the Grib file, skipping field'
+          CYCLE
+        ELSE IF (IRET_GRIB == -6) THEN
+          WRITE (ILUOUT0,'(A)')' | ECMWF pseudo-Grib data encountered, skipping field'
+          CYCLE
+        ENDIF
+        IF (INUMBER==KNUMBER) THEN
+          IFOUND = IFOUND + 1
+        ELSE
+          CYCLE
+        ENDIF
+      ENDIF
+      !
+      IF(PRESENT(KLEV1)) THEN
+        CALL GRIB_GET(KGRIB(JLOOP),'topLevel',ILEV1,IRET_GRIB)
+        IF (IRET_GRIB >   0) THEN
+          WRITE (ILUOUT0,'(A)')' | Error encountered in the Grib file, skipping field'
+          CYCLE
+        ELSE IF (IRET_GRIB == -6) THEN
+          WRITE (ILUOUT0,'(A)')' | ECMWF pseudo-Grib data encountered, skipping field'
+          CYCLE
+        ENDIF
+        IF (ILEV1==KLEV1) THEN
+          IFOUND = IFOUND + 1
+        ELSE
+          CYCLE
+        ENDIF
+      ENDIF
+      !
+      IF (IFOUND == ISEARCH) THEN
+          KNUM=JLOOP
+          EXIT
+      ELSE  ! field not found
+          KNUM=-1
+      END IF
+END DO
+!
+END SUBROUTINE SEARCH_FIELD
+!#################################################################################
+SUBROUTINE COORDINATE_CONVERSION(KMODEL,KGRIB,KNOLON,KNOLARG,&
+                           PLONOUT,PLATOUT,PLXOUT,PLYOUT,KNI,PPARAM,KINLO)
+!#################################################################################
+!perform coordinate conversion from lat/lon system to x,y (depends on the grib
+! type)
+!!   AUTHOR
+!!   ------
+!!
+!!   G. Tanguy
+!!
+!!   MODIFICATIONS
+!!   -------------
+!!
+!!   Original       08/06/2010
+
+USE MODD_CST
+USE MODI_LATLONTOXY
+USE GRIB_API
+!
+IMPLICIT NONE
+!
+!
+INTEGER(KIND=kindOfInt),INTENT(IN)                            :: KGRIB  ! number of the grib message
+INTEGER,INTENT(IN)                            :: KMODEL ! number of the model
+INTEGER,INTENT(OUT)                           :: KNI    ! number of points
+INTEGER,INTENT(IN)                            :: KNOLON,KNOLARG  ! Number of output points
+REAL,DIMENSION( KNOLON*KNOLARG),INTENT(IN)    :: PLONOUT ! Output coordinate,
+REAL,DIMENSION( KNOLON*KNOLARG),INTENT(IN)    :: PLATOUT ! lat/lon system
+REAL,DIMENSION( KNOLON*KNOLARG),INTENT(INOUT) :: PLXOUT  ! Converted output coordinates
+REAL,DIMENSION( KNOLON*KNOLARG),INTENT(INOUT) :: PLYOUT  ! (depends on Grib Grid type)
+REAL,DIMENSION(:),INTENT(INOUT)               :: PPARAM  ! output parameters of
+!                                                the grid to avoid many calculations
+INTEGER,DIMENSION(:),INTENT(INOUT)            :: KINLO   ! Number of points along a parallel
+!===============================
+INTEGER                                       :: IINLA ! Number of points along a meridian
+INTEGER                                       :: JLOOP1,JLOOP2 ! Dummy counter
+INTEGER                                       :: INO ! Number of output points
+REAL                                          :: ZILA1  ! Grib first point latitude
+REAL                                          :: ZILO1  ! Grib first point longitude
+REAL                                          :: ZILA2  ! Grib last point latitude
+REAL                                          :: ZILO2  ! Grib last point longitude
+REAL                                          :: ZILASP ! Grib streching pole lat
+REAL                                          :: ZILOSP ! Grib streching pole lon
+LOGICAL                                       :: GREADY ! Used to test if projection is needed
+INTEGER                                       :: ILENX ! nb points in X
+INTEGER                                       :: ILENY ! nb points in Y
+INTEGER                                       :: IEARTH  ! 
+REAL                                          :: ZSTRECH ! streching of arpege grid
+INTEGER(KIND=kindOfInt)                                       :: IMISSING ! dummy variable
+! Aladin projection
+REAL                                          :: ZALALAT0  ! Grid definition parameters
+REAL                                          :: ZALALON0  !  |
+REAL                                          :: ZALALATOR !  |
+REAL                                          :: ZALALONOR !  |
+REAL                                          :: ZALARPK   !  |
+REAL, DIMENSION(:,:), ALLOCATABLE             :: ZXM       ! Intermediate arrays
+REAL, DIMENSION(:,:), ALLOCATABLE             :: ZYM       !  |
+REAL, DIMENSION(:,:), ALLOCATABLE             :: ZLONM     !  |
+REAL, DIMENSION(:,:), ALLOCATABLE             :: ZLATM     !  |
+! CEP projection
+REAL, DIMENSION(:), ALLOCATABLE               :: ZLATGRIB
+REAL, DIMENSION(:), ALLOCATABLE               :: ZLONGRIB
+INTEGER                                       :: INBLATGRIB,INBLONGRIB
+!JUAN
+INTEGER(KIND=kindOfInt),DIMENSION(:),ALLOCATABLE            :: INLO_GRIB   ! Number of points along a parallel
+!JUAN
+!
+!--------------------------------------------------------------------------------
+!
+!JUAN
+ALLOCATE(INLO_GRIB(SIZE(KINLO)))
+!JUAN
+INO= KNOLON*KNOLARG
+SELECT CASE (KMODEL)
+!
+CASE(0,5,11) ! CEP/MOCAGE/ERA5
+! en theorie il faut ces 4 lignes
+!  CALL GRIB_GET(KGRIB,'latitudeOfFirstGridPointInDegrees',ZILA1)
+!  CALL GRIB_GET(KGRIB,'longitudeOfFirstGridPointInDegrees',ZILO1)
+!  CALL GRIB_GET(KGRIB,'latitudeOfLastGridPointInDegrees',ZILA2)
+!  CALL GRIB_GET(KGRIB,'longitudeOfLastGridPointInDegrees',ZILO2)
+! pourtant au passage de GRIB1 a GRIB2 les arrondi etait fait differement
+! et on n'obtenais pas les meme resultat entre un fichier grib1 et le meme 
+! convertit en GRIB2
+! Du coup en faisant ce qui suit on prend une valeur recalculee par grib_api
+! suivant l'ordre N de la gausienne donc plus precise et donc la meme entre le
+! GRIB1 et le GRIB2
+  CALL GRIB_GET(KGRIB,'Nj',IINLA,IRET_GRIB)
+  CALL GRIB_GET_SIZE(KGRIB,'latitudes',INBLATGRIB)
+  CALL GRIB_GET_SIZE(KGRIB,'longitudes',INBLONGRIB)
+  ALLOCATE(ZLATGRIB(INBLATGRIB))
+  ALLOCATE(ZLONGRIB(INBLONGRIB))
+  CALL GRIB_GET(KGRIB,'latitudes',ZLATGRIB)
+  CALL GRIB_GET(KGRIB,'longitudes',ZLONGRIB)
+  ZILA1=MAXVAL(ZLATGRIB)
+  ZILO1=MINVAL(ZLONGRIB)
+  ZILA2=MINVAL(ZLATGRIB)
+  ZILO2=MAXVAL(ZLONGRIB)
+  KNI=0
+  CALL GRIB_IS_MISSING(KGRIB,'pl',IMISSING,IRET_GRIB)
+  IF (IRET_GRIB /= 0 .OR. IMISSING==1)  THEN   ! pl not present
+    CALL GRIB_GET(KGRIB,'Ni',INLO_GRIB(1),IRET_GRIB)
+    INLO_GRIB(2:)=INLO_GRIB(1)
+    KNI=IINLA*INLO_GRIB(1)
+    GREADY= (PPARAM(1)==INLO_GRIB(1) .AND. PPARAM(2)==IINLA .AND.&
+      PPARAM(3)==ZILA1 .AND. PPARAM(4)==ZILO1 .AND.&
+      PPARAM(5)==ZILA2 .AND. PPARAM(6)==ZILO2)
+   PPARAM(1)=INLO_GRIB(1)
+   PPARAM(2)=IINLA
+   PPARAM(3)=ZILA1
+   PPARAM(4)=ZILO1 
+   PPARAM(5)=ZILA2
+   PPARAM(6)=ZILO2
+  ELSE ! pl present in the grib
+    CALL GRIB_GET(KGRIB,'pl',INLO_GRIB)
+    DO JLOOP1=1 ,IINLA
+      KNI = KNI + INLO_GRIB(JLOOP1)
+    ENDDO
+    GREADY= (PPARAM(1)==INLO_GRIB(1) .AND.&
+      PPARAM(3)==ZILA1 .AND. PPARAM(4)==ZILO1 .AND.&
+      PPARAM(5)==ZILA2 .AND. PPARAM(6)==ZILO2)
+    PPARAM(1)=INLO_GRIB(1)
+    PPARAM(2)=IINLA
+    PPARAM(3)=ZILA1
+    PPARAM(4)=ZILO1 
+    PPARAM(5)=ZILA2
+    PPARAM(6)=ZILO2    
+  END IF
+  IF (.NOT. GREADY) THEN
+    PLXOUT=PLONOUT
+    PLYOUT=PLATOUT
+  ENDIF
+!
+CASE(1,6) ! ALADIN
+!
+  CALL GRIB_GET(KGRIB,'Nj',IINLA,IRET_GRIB)
+  CALL GRIB_GET(KGRIB,'Ni',INLO_GRIB(1),IRET_GRIB)
+  INLO_GRIB(2:)=INLO_GRIB(1)
+  CALL GRIB_GET(KGRIB,'DxInMetres',ILENX)
+  CALL GRIB_GET(KGRIB,'DyInMetres',ILENY)
+  CALL GRIB_GET(KGRIB,'LoVInDegrees',ZALALON0)
+  CALL GRIB_GET(KGRIB,'Latin1InDegrees',ZALALAT0)
+  KNI = IINLA*INLO_GRIB(1)
+  ZILA1 = 0.
+  ZILO1 = 0.
+  ZILA2 = ZILA1 + (IINLA   -1)*ILENY
+  ZILO2 = ZILO1 + (INLO_GRIB(1)-1)*ILENX
+  GREADY= (PPARAM(1)==INLO_GRIB(1) .AND. PPARAM(2)==IINLA .AND.&
+      PPARAM(3)==ZILA1 .AND. PPARAM(4)==ZILO1 .AND.&
+      PPARAM(5)==ZILA2 .AND. PPARAM(6)==ZILO2.AND.&
+      PPARAM(7)==ILENX .AND. PPARAM(8)==ILENY.AND.&
+      PPARAM(9)==ZALALAT0 .AND. PPARAM(10)==ZALALON0)
+  IF(.NOT. GREADY) THEN
+     PPARAM(1)=INLO_GRIB(1)
+     PPARAM(2)=IINLA
+     PPARAM(3)=ZILA1
+     PPARAM(4)=ZILO1 
+     PPARAM(5)=ZILA2
+     PPARAM(6)=ZILO2    
+     PPARAM(7)=ILENX
+     PPARAM(8)=ILENY 
+     PPARAM(9)=ZALALAT0
+     PPARAM(10)=ZALALON0
+!        
+     IF (ZALALON0 > 180.) ZALALON0 = ZALALON0 - 360.
+     CALL GRIB_GET(KGRIB,'latitudeOfFirstGridPointInDegrees',ZALALATOR)
+    CALL GRIB_GET(KGRIB,'longitudeOfFirstGridPointInDegrees',ZALALONOR)
+     IF (ZALALONOR > 180.) ZALALONOR = ZALALONOR - 360.
+     ZALARPK = SIN(ZALALAT0/180.*XPI)
+     ALLOCATE (ZXM(KNOLON,KNOLARG))
+     ALLOCATE (ZYM(KNOLON,KNOLARG))
+     ALLOCATE (ZLONM(KNOLON,KNOLARG))
+     ALLOCATE (ZLATM(KNOLON,KNOLARG))
+     JLOOP1=0
+     DO JLOOP2=1, KNOLARG
+       ZLONM(1:KNOLON,JLOOP2) = PLONOUT(1+JLOOP1:KNOLON+JLOOP1)
+       ZLATM(1:KNOLON,JLOOP2) = PLATOUT(1+JLOOP1:KNOLON+JLOOP1)
+       JLOOP1 = JLOOP1+KNOLON
+     END DO
+     CALL SM_LATLONTOXY_A (ZALALAT0,ZALALON0,ZALARPK,ZALALATOR,ZALALONOR, &
+                           ZXM,ZYM,ZLATM,ZLONM,KNOLON,KNOLARG,6367470.)
+     JLOOP1=0
+     DO JLOOP2=1, KNOLARG
+        PLXOUT(1+JLOOP1:KNOLON+JLOOP1)=ZXM(1:KNOLON,JLOOP2)
+        PLYOUT(1+JLOOP1:KNOLON+JLOOP1)=ZYM(1:KNOLON,JLOOP2)
+        JLOOP1 = JLOOP1+KNOLON
+     ENDDO
+     DEALLOCATE (ZLATM)
+     DEALLOCATE (ZLONM)
+     DEALLOCATE (ZYM)
+     DEALLOCATE (ZXM)
+  END IF
+!
+CASE(2) ! ALADIN REUNION
+!
+  CALL GRIB_GET(KGRIB,'Nj',IINLA,IRET_GRIB)
+  CALL GRIB_GET(KGRIB,'Ni',INLO_GRIB(1),IRET_GRIB)
+  INLO_GRIB(2:)=INLO_GRIB(1)
+  CALL GRIB_GET(KGRIB,'DiInMetres',ILENX)
+  CALL GRIB_GET(KGRIB,'DjInMetres',ILENY)
+  CALL GRIB_GET(KGRIB,'LaDInDegrees',ZALALAT0)
+  KNI = IINLA*INLO_GRIB(1)
+  ZILA1 = 0.
+  ZILO1 = 0.
+  ZILA2 = ZILA1 + (IINLA   -1)*ILENY
+  ZILO2 = ZILO1 + (INLO_GRIB(1)-1)*ILENX
+  GREADY= (PPARAM(1)==INLO_GRIB(1) .AND. PPARAM(2)==IINLA .AND.&
+      PPARAM(3)==ZILA1 .AND. PPARAM(4)==ZILO1 .AND.&
+      PPARAM(5)==ZILA2 .AND. PPARAM(6)==ZILO2.AND.&
+      PPARAM(7)==ILENX .AND. PPARAM(8)==ILENY.AND.&
+      PPARAM(9)==ZALALAT0)
+  IF(.NOT. GREADY) THEN
+    PPARAM(1)=INLO_GRIB(1)
+    PPARAM(2)=IINLA
+    PPARAM(3)=ZILA1
+    PPARAM(4)=ZILO1 
+    PPARAM(5)=ZILA2
+    PPARAM(6)=ZILO2    
+    PPARAM(7)=ILENX
+    PPARAM(8)=ILENY 
+    PPARAM(9)=ZALALAT0
+    ZALALON0 = 0.
+    CALL GRIB_GET(KGRIB,'latitudeOfFirstGridPointInDegrees',ZALALATOR)
+    CALL GRIB_GET(KGRIB,'longitudeOfFirstGridPointInDegrees',ZALALONOR)
+    IF (ZALALONOR > 180.) ZALALONOR = ZALALONOR - 360.
+    ZALARPK = 0
+    ALLOCATE (ZXM(KNOLON,KNOLARG))
+    ALLOCATE (ZYM(KNOLON,KNOLARG))
+    ALLOCATE (ZLONM(KNOLON,KNOLARG))
+    ALLOCATE (ZLATM(KNOLON,KNOLARG))
+    JLOOP1=0
+    DO JLOOP2=1, KNOLARG
+       ZLONM(1:KNOLON,JLOOP2) = PLONOUT(1+JLOOP1:KNOLON+JLOOP1)
+       ZLATM(1:KNOLON,JLOOP2) = PLATOUT(1+JLOOP1:KNOLON+JLOOP1)
+       JLOOP1 = JLOOP1+KNOLON
+    END DO
+    CALL GRIB_GET(KGRIB,'earthIsOblate',IEARTH)
+    IF (IEARTH==0) THEN
+        CALL SM_LATLONTOXY_A (ZALALAT0,ZALALON0,ZALARPK,ZALALATOR,ZALALONOR, &
+                              ZXM,ZYM,ZLATM,ZLONM,KNOLON,KNOLARG,6367470.)
+    ELSE
+        CALL SM_LATLONTOXY_A (ZALALAT0,ZALALON0,ZALARPK,ZALALATOR,ZALALONOR, &
+                              ZXM,ZYM,ZLATM,ZLONM,KNOLON,KNOLARG)
+    END IF
+    JLOOP1=0
+    DO JLOOP2=1, KNOLARG
+       PLXOUT(1+JLOOP1:KNOLON+JLOOP1)=ZXM(1:KNOLON,JLOOP2)
+       PLYOUT(1+JLOOP1:KNOLON+JLOOP1)=ZYM(1:KNOLON,JLOOP2)
+       JLOOP1 = JLOOP1+KNOLON
+    ENDDO
+    DEALLOCATE (ZLATM)
+    DEALLOCATE (ZLONM)
+    DEALLOCATE (ZYM)
+    DEALLOCATE (ZXM)       
+  END IF
+!
+CASE(3,4,7) ! ARPEGE
+!
+!print*,"=========COORDINATE CONVERSION CASE ARPEGE ============="
+! PROBLEME AVEC LES GRIB d'EPYGRAM
+! dans longitudeOfLastGridPointInDegrees on la la longitude du dernier point du
+! tableau (donc au pole sud)  
+! dans les GRIB1 ont avait la valeur max du tableau des longitude (donc à
+! l'equateur) 
+  CALL GRIB_GET(KGRIB,'latitudeOfFirstGridPointInDegrees',ZILA1)
+  CALL GRIB_GET(KGRIB,'longitudeOfFirstGridPointInDegrees',ZILO1)
+  CALL GRIB_GET(KGRIB,'latitudeOfLastGridPointInDegrees',ZILA2)
+  CALL GRIB_GET(KGRIB,'longitudeOfLastGridPointInDegrees',ZILO2)
+  CALL GRIB_GET(KGRIB,'latitudeOfStretchingPoleInDegrees',ZILASP)
+  CALL GRIB_GET(KGRIB,'longitudeOfStretchingPoleInDegrees',ZILOSP)
+  CALL GRIB_GET(KGRIB,'stretchingFactor',ZSTRECH)
+  CALL GRIB_GET(KGRIB,'Nj',IINLA,IRET_GRIB)
+!
+  KNI=0
+  CALL GRIB_IS_MISSING(KGRIB,'pl',IRET_GRIB)
+  IF (IRET_GRIB == 1)  THEN !  regular
+     CALL GRIB_GET(KGRIB,'Ni',INLO_GRIB(1),IRET_GRIB)
+     INLO_GRIB(2:)=INLO_GRIB(1)
+     KNI=IINLA*INLO_GRIB(1)
+     GREADY= (PPARAM(1)==INLO_GRIB(1) .AND. PPARAM(2)==IINLA .AND.&
+       PPARAM(3)==ZILA1 .AND. PPARAM(4)==ZILO1 .AND.&
+       PPARAM(5)==ZILA2 .AND. PPARAM(6)==ZILO2 .AND.&
+       PPARAM(7)==ZILASP .AND. PPARAM(8)==ZILOSP .AND.&
+       PPARAM(9)==ZSTRECH)
+  ELSE !  quasi-regular
+     CALL GRIB_GET(KGRIB,'pl',INLO_GRIB)
+     DO JLOOP1=1 ,IINLA
+        KNI = KNI + INLO_GRIB(JLOOP1)
+     ENDDO
+     ZILO2=360.-360./(MAXVAL(INLO_GRIB))
+     GREADY= (PPARAM(1)==INLO_GRIB(1) .AND.&
+       PPARAM(3)==ZILA1 .AND. PPARAM(4)==ZILO1 .AND.&
+       PPARAM(5)==ZILA2 .AND. PPARAM(6)==ZILO2 .AND.&
+       PPARAM(7)==ZILASP .AND. PPARAM(8)==ZILOSP .AND.&
+       PPARAM(9)==ZSTRECH)
+  END IF
+!
+  IF (.NOT. GREADY) THEN
+    CALL ARPEGE_STRETCH_A(INO,ZILASP,ZILOSP, &
+        ZSTRECH,PLATOUT,PLONOUT,PLYOUT,PLXOUT)
+     PPARAM(1)=INLO_GRIB(1)
+     PPARAM(2)=IINLA
+     PPARAM(3)=ZILA1
+     PPARAM(4)=ZILO1 
+     PPARAM(5)=ZILA2
+     PPARAM(6)=ZILO2
+     PPARAM(7)=ZILASP
+     PPARAM(8)=ZILOSP
+     PPARAM(9)=ZSTRECH    
+  END IF
+!
+CASE(10) ! NCEP
+!
+  CALL GRIB_GET(KGRIB,'latitudeOfFirstGridPointInDegrees',ZILA1)
+  CALL GRIB_GET(KGRIB,'longitudeOfFirstGridPointInDegrees',ZILO1)
+  CALL GRIB_GET(KGRIB,'latitudeOfLastGridPointInDegrees',ZILA2)
+  CALL GRIB_GET(KGRIB,'longitudeOfLastGridPointInDegrees',ZILO2)
+  CALL GRIB_GET(KGRIB,'Nj',IINLA,IRET_GRIB)
+  CALL GRIB_GET(KGRIB,'Ni',INLO_GRIB(1),IRET_GRIB)
+  INLO_GRIB(2:)=INLO_GRIB(1)
+  KNI=IINLA*INLO_GRIB(1)
+  GREADY= (PPARAM(1)==INLO_GRIB(1) .AND. PPARAM(2)==IINLA .AND.&
+           PPARAM(3)==ZILA1 .AND. PPARAM(4)==ZILO1 .AND.&
+           PPARAM(5)==ZILA2 .AND. PPARAM(6)==ZILO2)
+  PPARAM(1)=INLO_GRIB(1)
+  PPARAM(2)=IINLA
+  PPARAM(3)=ZILA1
+  PPARAM(4)=ZILO1 
+  PPARAM(5)=ZILA2
+  PPARAM(6)=ZILO2
+  IF (.NOT. GREADY) THEN
+    PLXOUT=PLONOUT
+    PLYOUT=PLATOUT
+  ENDIF
+END SELECT
+!JUAN
+KINLO=INLO_GRIB
+!JUAN
+END SUBROUTINE COORDINATE_CONVERSION
+!
+!     ###################################################################
+      SUBROUTINE ARPEGE_STRETCH_A(KN,PLAP,PLOP,PCOEF,PLAR,PLOR,PLAC,PLOC)
+!     ###################################################################
+!!****  *ARPEGE_STRETCH_A* - Projection to Arpege stretched grid
+!!
+!!   PURPOSE
+!!   -------
+!!
+!!   Projection from standard Lat,Lon grid to Arpege stretched grid
+!!
+!!   METHOD
+!!   ------
+!!
+!!   The projection is defined in two steps :
+!!    1. A rotation to place the stretching pole at the north pole
+!!    2. The stretching
+!!   This routine is a basic implementation of the informations founded in
+!!     'Note de travail Arpege nr.3'
+!!     'Transformation de coordonnees'
+!!     J.F.Geleyn 1988
+!!   This document describes a slightly different transformation in 3 steps. Only the
+!!   two first steps are to be taken in account (at the time of writing this paper has
+!!   not been updated).
+!!
+!!   EXTERNAL
+!!   --------
+!!
+!!   Module MODD_CST
+!!     XPI
+!!
+!!   IMPLICIT ARGUMENTS
+!!   ------------------
+!!
+!!   REFERENCE
+!!   ---------
+!!
+!!   This routine is based on :
+!!     'Note de travail ARPEGE' number 3
+!!     by J.F. GELEYN (may 1988)
+!!
+!!   AUTHOR
+!!   ------
+!!
+!!   V.Bousquet
+!!
+!!   MODIFICATIONS
+!!   -------------
+!!
+!!   Original       07/01/1999
+!!
+!----------------------------------------------------------------------------
+!
+!*   0. DECLARATIONS
+!    ---------------
+!
+USE MODD_CST
+!
+IMPLICIT NONE
+!
+!*   0.1. Declaration of arguments
+!    -----------------------------
+!
+INTEGER,             INTENT(IN)  :: KN            ! Number of points to convert
+REAL,                INTENT(IN)  :: PLAP          ! Latitude of stretching pole
+REAL,                INTENT(IN)  :: PLOP          ! Longitude of stretching pole
+REAL,                INTENT(IN)  :: PCOEF         ! Stretching coefficient
+REAL, DIMENSION(KN), INTENT(IN)  :: PLAR          ! Lat. of points
+REAL, DIMENSION(KN), INTENT(IN)  :: PLOR          ! Lon. of points
+REAL, DIMENSION(KN), INTENT(OUT) :: PLAC          ! Computed pseudo-lat. of points
+REAL, DIMENSION(KN), INTENT(OUT) :: PLOC          ! Computed pseudo-lon. of points
+!
+!*   0.2. Declaration of local variables
+!    -----------------------------------
+!
+REAL                       :: ZSINSTRETCHLA ! Sine of stretching point lat.
+REAL                       :: ZSINSTRETCHLO ! Sine of stretching point lon.
+REAL                       :: ZCOSSTRETCHLA ! Cosine of stretching point lat.
+REAL                       :: ZCOSSTRETCHLO ! Cosine of stretching point lon.
+REAL                       :: ZSINLA        ! Sine of computed point latitude
+REAL                       :: ZSINLO        ! Sine of computed point longitude
+REAL                       :: ZCOSLA        ! Cosine of computed point latitude
+REAL                       :: ZCOSLO        ! Cosine of computed point longitude
+REAL                       :: ZSINLAS       ! Sine of point's pseudo-latitude
+REAL                       :: ZSINLOS       ! Sine of point's pseudo-longitude
+REAL                       :: ZCOSLOS       ! Cosine of point's pseudo-lon.
+REAL                       :: ZA,ZB,ZD      ! Dummy variables used for
+REAL                       :: ZX,ZY         ! computations
+!
+INTEGER                    :: JLOOP1        ! Dummy loop counter
+!
+!----------------------------------------------------------------------------
+!
+ZSINSTRETCHLA = SIN(PLAP*XPI/180.)
+ZCOSSTRETCHLA = COS(PLAP*XPI/180.)
+ZSINSTRETCHLO = SIN(PLOP*XPI/180.)
+ZCOSSTRETCHLO = COS(PLOP*XPI/180.)
+! L = longitude (0 = Greenwich, + toward east)
+! l = latitude (90 = N.P., -90 = S.P.)
+! p stands for stretching pole
+PLAC(:) = PLAR(:) * XPI / 180.
+PLOC(:) = PLOR(:) * XPI / 180.
+! A = 1 + c.c
+ZA = 1. + PCOEF*PCOEF
+! B = 1 - c.c
+ZB = 1. - PCOEF*PCOEF
+DO JLOOP1=1, KN
+  ZSINLA = SIN(PLAC(JLOOP1))
+  ZCOSLA = COS(PLAC(JLOOP1))
+  ZSINLO = SIN(PLOC(JLOOP1))
+  ZCOSLO = COS(PLOC(JLOOP1))
+  ! X = cos(Lp-L)
+  ZX = ZCOSLO*ZCOSSTRETCHLO + ZSINLO*ZSINSTRETCHLO
+  ! Y = sin(Lp-L)
+  ZY = ZSINSTRETCHLO*ZCOSLO - ZSINLO*ZCOSSTRETCHLO
+  ! D = (1+c.c) + (1-c.c)(sin lp.sin l + cos lp.cos l.cos(Lp-L))
+  ZD = ZA + ZB*(ZSINSTRETCHLA*ZSINLA+ZCOSSTRETCHLA*ZCOSLA*ZX)
+  !          (1-c.c)+(1+c.c)((sin lp.sin l + cos lp.cos l.cos(Lp-L))
+  ! sin lr = -------------------------------------------------------
+  !                                  D
+  ZSINLAS = (ZB + ZA*(ZSINSTRETCHLA*ZSINLA+ZCOSSTRETCHLA*ZCOSLA*ZX)) / ZD
+  ! D' = D * cos lr
+  ZD = ZD * (AMAX1(1e-6,SQRT(1.-ZSINLAS*ZSINLAS)))
+  !          2.c.(cos lp.sin l - sin lp.cos l.cos(Lp-L))
+  ! cos Lr = -------------------------------------------
+  !                              D'
+  ZCOSLOS = 2.*PCOEF*(ZCOSSTRETCHLA*ZSINLA-ZSINSTRETCHLA*ZCOSLA*ZX) / ZD
+  !          2.c.cos l.cos(Lp-L)
+  ! sin Lr = -------------------
+  !                  D'
+  ZSINLOS = 2.*PCOEF*(ZCOSLA*ZY) / ZD
+  ! saturations (corrects calculation errors)
+  ZSINLAS = MAX(ZSINLAS,-1.)
+  ZSINLAS = MIN(ZSINLAS, 1.)
+  ZCOSLOS = MAX(ZCOSLOS,-1.)
+  ZCOSLOS = MIN(ZCOSLOS, 1.)
+  ! back from sine & cosine
+  PLAC(JLOOP1) = ASIN(ZSINLAS)
+  IF (ZSINLOS>0) THEN
+    PLOC(JLOOP1) =  ACOS(ZCOSLOS)
+  ELSE
+    PLOC(JLOOP1) = -ACOS(ZCOSLOS)
+  ENDIF
+ENDDO
+PLOC(:) = PLOC(:) * 180. / XPI
+PLAC(:) = PLAC(:) * 180. / XPI
+RETURN
+END SUBROUTINE ARPEGE_STRETCH_A
+!
+!
+END SUBROUTINE READ_ALL_DATA_GRIB_CASE
diff --git a/src/PHYEX/ext/read_desfmn.f90 b/src/PHYEX/ext/read_desfmn.f90
new file mode 100644
index 0000000000000000000000000000000000000000..39e599098f7401789fea437b2d6539906d08f4f1
--- /dev/null
+++ b/src/PHYEX/ext/read_desfmn.f90
@@ -0,0 +1,890 @@
+!MNH_LIC Copyright 1994-2023 CNRS, Meteo-France and Universite Paul Sabatier
+!MNH_LIC This is part of the Meso-NH software governed by the CeCILL-C licence
+!MNH_LIC version 1. See LICENSE, CeCILL-C_V1-en.txt and CeCILL-C_V1-fr.txt
+!MNH_LIC for details. version 1.
+!-----------------------------------------------------------------
+!     ######################
+      MODULE MODI_READ_DESFM_n
+!     ######################
+!
+INTERFACE
+!
+      SUBROUTINE READ_DESFM_n(KMI,TPDATAFILE,HCONF,OFLAT,OUSERV,                 &
+                   OUSERC,OUSERR,OUSERI,OUSECI,OUSERS,OUSERG,OUSERH,             &
+                   OUSECHEM,OUSECHAQ,OUSECHIC,OCH_PH,OCH_CONV_LINOX,OSALT,       &
+                   ODEPOS_SLT,ODUST,ODEPOS_DST, OCHTRANS,                        &
+                   OORILAM,ODEPOS_AER,OLG,OPASPOL,OFIRE,                         &
+#ifdef MNH_FOREFIRE
+                   OFOREFIRE,                                                    &
+#endif
+                   OLNOX_EXPLICIT,                                               &
+                   OCONDSAMP,OBLOWSNOW,                                          &
+                   KRIMX,KRIMY,KSV_USER,                                         &
+                   HTURB,HTOM,ORMC01,HRAD,HDCONV,HSCONV,HCLOUD,HELEC,HEQNSYS     )
+!
+USE MODD_IO, ONLY: TFILEDATA
+USE MODD_PARAMETERS
+!
+INTEGER,            INTENT(IN)  :: KMI    ! Model index
+TYPE(TFILEDATA),    INTENT(IN)  :: TPDATAFILE ! Datafile
+CHARACTER (LEN=5),  INTENT(OUT) :: HCONF  ! configuration var. linked to FMfile
+LOGICAL,            INTENT(OUT) :: OFLAT  ! Logical for zero orography 
+LOGICAL,            INTENT(OUT) :: OUSERV ! use Rv mixing ratio               
+LOGICAL,            INTENT(OUT) :: OUSERC ! use Rc mixing ratio               
+LOGICAL,            INTENT(OUT) :: OUSERR ! use Rr mixing ratio               
+LOGICAL,            INTENT(OUT) :: OUSERI ! use Ri mixing ratio               
+LOGICAL,            INTENT(OUT) :: OUSECI ! use Ci concentration of Ice cristals
+LOGICAL,            INTENT(OUT) :: OUSERS ! use Rs mixing ratio               
+LOGICAL,            INTENT(OUT) :: OUSERG ! use Rg mixing ratio               
+LOGICAL,            INTENT(OUT) :: OUSERH ! use Rh mixing ratio
+LOGICAL,            INTENT(OUT) :: OUSECHEM ! Chemical flag
+LOGICAL,            INTENT(OUT) :: OUSECHAQ ! Aqueous Chemical flag
+LOGICAL,            INTENT(OUT) :: OUSECHIC ! Ice phase Chemical flag
+LOGICAL,            INTENT(OUT) :: OCH_PH   ! pH flag
+LOGICAL,            INTENT(OUT) :: OCH_CONV_LINOX ! LiNOX flag
+LOGICAL,            INTENT(OUT) :: OLG      ! lagrangian flag
+LOGICAL,            INTENT(OUT) :: OSALT    ! Sea Salt flag
+LOGICAL,            INTENT(OUT) :: ODUST    ! Dust flag
+LOGICAL,            INTENT(OUT) :: OPASPOL  ! Passive pollutant flag
+LOGICAL,            INTENT(OUT) :: OFIRE    ! Blaze flag
+#ifdef MNH_FOREFIRE
+LOGICAL,            INTENT(OUT) :: OFOREFIRE! ForeFire flag
+#endif
+LOGICAL,            INTENT(OUT) :: OLNOX_EXPLICIT ! explicit LNOx flag
+LOGICAL,            INTENT(OUT) :: OCONDSAMP! Conditional sampling flag
+LOGICAL,            INTENT(OUT) :: OBLOWSNOW ! Blowing snow flag
+LOGICAL,            INTENT(OUT) :: OORILAM  ! Orilam flag
+LOGICAL,            INTENT(OUT) :: OCHTRANS ! Deep convection on scalar
+LOGICAL,DIMENSION(JPMODELMAX),INTENT(OUT) :: ODEPOS_DST    ! Dust Wet Deposition flag
+LOGICAL,DIMENSION(JPMODELMAX),INTENT(OUT) :: ODEPOS_SLT    ! Sea Salt Wet Deposition flag
+LOGICAL,DIMENSION(JPMODELMAX),INTENT(OUT) :: ODEPOS_AER    ! Aerosols Wet Deposition flag
+INTEGER,            INTENT(OUT) :: KRIMX, KRIMY        ! number of points for the
+                       ! horizontal relaxation for the outermost verticals
+INTEGER,            INTENT(OUT) :: KSV_USER    ! number of additional scalar
+                                          ! variables in FMfile 
+CHARACTER (LEN=4),  INTENT(OUT) :: HTURB  ! Kind of turbulence parameterization
+                                          ! used to produce the FMfile
+CHARACTER (LEN=4),  INTENT(OUT) :: HTOM   ! Kind of third order moment
+LOGICAL,            INTENT(OUT) :: ORMC01 ! flag for RMC01 SBL computations
+CHARACTER (LEN=4),  INTENT(OUT) :: HRAD   ! Kind of radiation scheme
+CHARACTER (LEN=4),  INTENT(OUT) :: HDCONV ! Kind of deep convection scheme
+CHARACTER (LEN=4),  INTENT(OUT) :: HSCONV ! Kind of shallow convection scheme
+CHARACTER (LEN=4),  INTENT(OUT) :: HCLOUD ! Kind of microphysical scheme
+CHARACTER (LEN=4),  INTENT(OUT) :: HELEC  ! Kind of electrical scheme
+CHARACTER (LEN=*),  INTENT(OUT) :: HEQNSYS! type of equations' system
+END SUBROUTINE READ_DESFM_n
+!
+END INTERFACE
+!
+END MODULE MODI_READ_DESFM_n
+!     #########################################################################
+      SUBROUTINE READ_DESFM_n(KMI,TPDATAFILE,HCONF,OFLAT,OUSERV,                 &
+                   OUSERC,OUSERR,OUSERI,OUSECI,OUSERS,OUSERG,OUSERH,             &
+                   OUSECHEM,OUSECHAQ,OUSECHIC,OCH_PH,OCH_CONV_LINOX,OSALT,       &
+                   ODEPOS_SLT,ODUST,ODEPOS_DST, OCHTRANS,                        &
+                   OORILAM,ODEPOS_AER,OLG,OPASPOL,OFIRE,                         &
+#ifdef MNH_FOREFIRE
+                   OFOREFIRE,                                                    &
+#endif
+                   OLNOX_EXPLICIT,                                               &
+                   OCONDSAMP,OBLOWSNOW,                                          &
+                   KRIMX,KRIMY,KSV_USER,                                         &
+                   HTURB,HTOM,ORMC01,HRAD,HDCONV,HSCONV,HCLOUD,HELEC,HEQNSYS     )
+!     #########################################################################
+!
+!!****  *READ_DESFM_n * - routine to read  the descriptor file DESFM
+!!
+!!    PURPOSE
+!!    -------
+!       The purpose of this routine is to read the descriptor file called 
+!     DESFM. 
+!       
+!!
+!!**  METHOD
+!!    ------
+!!      The descriptor file is read. Namelists (NAMXXXn) which contain
+!!    informations linked to one nested model are at the beginning of the file.
+!!    Namelists (NAMXXX) which contain variables common to all models
+!!    are at the end of the file. When the  model index is different from 1, 
+!!    the end of the file (namelists NAMXXX) is not read. 
+!!      Some attributes of the FMfile are saved in order to check coherence
+!!    between initial file and the segment to perform (description given by
+!!    EXSEG file), i.e. :
+!!      - the configuration which has been used to produce the initial file
+!!        (CCONF)
+!!      - logical switch for flat configuration (zero orography) in initial file
+!!        (LFLAT)
+!!      - kind of moist variables in initial file (LUSERV,LUSERC,LUSERR,
+!!        LUSERI,LUSERS,LUSERG,LUSERH)
+!!      - number of additional scalar variables in initial file (NSV_USER)
+!!      - kind of turbulence parameterization  used to produce the initial
+!!        file (CTURB)
+!!      - kind of mixing length  used to produce the initial
+!!        file (CTURBLEN)
+!!      - time step of each model stored in PTSTEP_OLD, to correct the initial 
+!!        field at t-dt in routine READ_FIELD in case of time step change
+!!      - type of equation system in order to verify that the anelastic is the
+!!        same for the initila file generation and the run  
+!!       
+!!
+!!    EXTERNAL
+!!    --------
+!!
+!!
+!!    IMPLICIT ARGUMENTS
+!!    ------------------
+!!     Module MODN_CONF : CCONF,LFLAT,CEQNSYS
+!!
+!!     Module MODN_CONF1 : LUSERV,LUSERC,LUSERR,LUSERI,LUSECI,
+!!                 LUSERS,LUSERG,LUSERH
+!!
+!!     Module MODN_PARAM1 : CTURB,CRAD,CDCONV,CSCONV
+!!                   
+!!     Module MODN_TURB$n : CTURBLEN
+!!
+!!     Module MODN_DYN$n : NRIMX,NRIMY
+!!
+!!    REFERENCE
+!!    ---------
+!!      Book2 of the documentation (routine READ_DESFM_n)
+!!      
+!!
+!!    AUTHOR
+!!    ------
+!!  	V. Ducrocq       * Meteo France *
+!!
+!!    MODIFICATIONS
+!!    -------------
+!!      Original       07/06/94
+!!      Modifications  17/10/94  (Stein)  For LCORIO
+!!      Modifications  26/10/94  (Stein)  remove NAM_GET from the Namelists
+!!      present in DESFM + change the namelist names
+!!      Modifications  09/01/95  (Stein)  add the turbulence scheme
+!!      Modifications  09/01/95  (Stein)  add the 1D switch
+!!      Modifications  13/02/95  (Stein)  save HTURBLEN
+!!      Modifications  30/06/95  (Stein)  add new namelists
+!!      Modifications  18/08/95  (Lafore) time step change
+!!      Modifications  15/09/95  (Pinty)  add the radiations
+!!      Modifications  06/02/96  (J.Vila) add the new scalar advection scheme
+!!      Modifications  20/02/96  (Stein)  add the LES namelist + cleaning
+!!      Modifications  25/04/96  (Suhre)  add NAM_BLANK
+!!      Modifications  25/04/96  (Suhre)  add NAM_FRC
+!!      Modifications  25/04/96  (Suhre)  add NAM_CH_MNHCn and NAM_CH_SOLVER
+!!      Modifications  11/04/96  (Pinty)  add the ice concentration
+!!      Modifications  11/01/97  (Pinty)  add the deep convection
+!!      Modifications  22/07/96  (Lafore) gridnesting implementation
+!!      Modifications  22/06/97  (Stein ) save the equations' system+ cleaning
+!!      Modifications  09/07/97  (Masson) add NAM_PARAM_GROUND
+!!      Modifications  25/08/97  (Masson) add HGROUND
+!!      Modifications  25/10/97  (Stein ) new namelists
+!!      Modification   04/06/00  (Pinty)  add C2R2 scheme 
+!!      Modification   22/01/01  (Gazen)  Add  OUSECHEM and OLG
+!!      Modification   15/10/01  (Mallet) allow namelists in different orders
+!!      Modification   29/11/02  (Pinty)  add C3R5, ICE2, ICE4, ELEC
+!!      Modification   01/2004   (Masson) removes surface (externalization)
+!!      Modification   01/2005   (Masson) removes 1D and 2D switches
+!!      Modification   03/2005   (Tulet)  add dust, aerosols
+!!      Modification   03/2006   (O.Geoffroy) Add KHKO scheme
+!!      Modification   04/2010   (M. Leriche) Add aqueous + ice chemistry
+!!      Modification   07/2013   (Bosseur & Filippi) Adds Forefire
+!!      Modification   01/2015   (C. Barthe) Add explicit LNOx
+!!      Modification   2016      (B.VIE) LIMA
+!!      Modification   11/2016   (Ph. Wautelet) Allocate/initialise some output/backup structures
+!!      Modification   02/2018   (Q.Libois) ECRAD
+!!  Philippe Wautelet: 05/2016-04/2018: new data structures and calls for I/O
+!!      Modification   07/2017   (V. Vionnet) Add blowing snow scheme
+!!      Modification   02/2021   (F.Auguste)  add IBM
+!!                               (T.Nagel)    add turbulence recycling
+!!                               (E.Jezequel) add stations read from CSV file
+!  A. Costes      12/2021: add Blaze fire model
+!  P. Wautelet 27/04/2022: add namelist for profilers
+!-------------------------------------------------------------------------------
+!
+!*       0.    DECLARATIONS
+!              ------------
+USE MODD_IO,      ONLY: TFILEDATA
+USE MODD_LUNIT_n, ONLY: TLUOUT
+USE MODD_PARAMETERS
+!
+USE MODN_BACKUP
+USE MODN_BUDGET
+USE MODN_CONF
+USE MODN_DYN
+USE MODN_NESTING
+USE MODN_OUTPUT
+USE MODN_LES
+USE MODN_CONF_n
+USE MODN_DYN_n
+USE MODN_ADV_n
+USE MODN_PARAM_n
+USE MODN_PARAM_RAD_n
+USE MODN_PARAM_ECRAD_n
+USE MODN_PARAM_KAFR_n
+USE MODD_PARAM_MFSHALL_n, ONLY: PARAM_MFSHALLN_INIT
+USE MODD_PARAM_ICE_n, ONLY : PARAM_ICEN_INIT
+USE MODD_PARAM_LIMA, ONLY: PARAM_LIMA_INIT
+USE MODN_LUNIT_n
+USE MODN_LBC_n
+USE MODN_NUDGING_n
+USE MODD_TURB_n, ONLY: TURBN_INIT, CTOM, LRMC01
+USE MODD_NEB_n, ONLY: NEBN_INIT
+USE MODN_FRC
+USE MODN_BLANK_n
+USE MODN_CH_SOLVER_n
+USE MODN_CH_MNHC_n
+USE MODN_PARAM_C2R2, ONLY : HPARAM_CCN_C2R2=>HPARAM_CCN,HINI_CCN_C2R2=>HINI_CCN, &
+                            HTYPE_CCN_C2R2=>HTYPE_CCN,LRAIN_C2R2=>LRAIN, &
+                            LSEDC_C2R2=>LSEDC,LACTIT_C2R2=>LACTIT,XCHEN_C2R2=>XCHEN, &
+                            XKHEN_C2R2=>XKHEN,XMUHEN_C2R2=>XMUHEN, &
+                            XBETAHEN_C2R2=>XBETAHEN,XCONC_CCN_C2R2=>XCONC_CCN, &
+                            XR_MEAN_CCN_C2R2=>XR_MEAN_CCN,XLOGSIG_CCN_C2R2=>XLOGSIG_CCN, &
+                            XFSOLUB_CCN_C2R2=>XFSOLUB_CCN,XACTEMP_CCN_C2R2=>XACTEMP_CCN, &
+                            XALPHAC_C2R2=>XALPHAC,XNUC_C2R2=>XNUC,XALPHAR_C2R2=>XALPHAR, &
+                            XNUR_C2R2=>XNUR,XAERDIFF_C2R2=>XAERDIFF, &
+                            XAERHEIGHT_C2R2=>XAERHEIGHT,NAM_PARAM_C2R2
+USE MODN_PARAM_C1R3, ONLY : XALPHAI_C1R3=>XALPHAI,XNUI_C1R3=>XNUI,XALPHAS_C1R3=>XALPHAS, &
+                            XNUS_C1R3=>XNUS,XALPHAG_C1R3=>XALPHAG,XNUG_C1R3=>XNUG, &
+                            XFACTNUC_DEP_C1R3=>XFACTNUC_DEP, &
+                            XFACTNUC_CON_C1R3=>XFACTNUC_CON,LSEDI_C1R3=>LSEDI, &
+                            LHHONI_C1R3=>LHHONI,CPRISTINE_ICE_C1R3,CHEVRIMED_ICE_C1R3, &
+                            NAM_PARAM_C1R3
+USE MODN_ELEC
+USE MODN_SERIES
+USE MODN_SERIES_n
+USE MODN_TURB_CLOUD
+USE MODN_CH_ORILAM
+USE MODN_DUST
+USE MODN_SALT
+USE MODN_PASPOL
+USE MODN_VISCOSITY
+USE MODN_DRAG_n
+#ifdef MNH_FOREFIRE
+USE MODN_FOREFIRE
+#endif
+USE MODN_CONDSAMP
+USE MODN_LATZ_EDFLX
+USE MODN_2D_FRC
+USE MODN_BLOWSNOW_n
+USE MODN_BLOWSNOW
+!
+! USE MODN_FLYERS
+!
+USE MODE_MSG
+USE MODE_POS
+USE MODN_RECYCL_PARAM_n
+USE MODN_IBM_PARAM_n
+USE MODD_IBM_LSF, ONLY: LIBM_LSF
+!
+USE MODN_FIRE_n
+!
+IMPLICIT NONE
+!
+!*       0.1   declarations of arguments
+!
+!
+!
+INTEGER,            INTENT(IN)  :: KMI    ! Model index
+TYPE(TFILEDATA),    INTENT(IN)  :: TPDATAFILE ! Datafile
+CHARACTER (LEN=5),  INTENT(OUT) :: HCONF  ! configuration var. linked to FMfile
+LOGICAL,            INTENT(OUT) :: OFLAT  ! Logical for zero orography 
+LOGICAL,            INTENT(OUT) :: OUSERV ! use Rv mixing ratio               
+LOGICAL,            INTENT(OUT) :: OUSERC ! use Rc mixing ratio               
+LOGICAL,            INTENT(OUT) :: OUSERR ! use Rr mixing ratio               
+LOGICAL,            INTENT(OUT) :: OUSERI ! use Ri mixing ratio               
+LOGICAL,            INTENT(OUT) :: OUSECI ! use Ci concentration of Ice cristals
+LOGICAL,            INTENT(OUT) :: OUSERS ! use Rs mixing ratio               
+LOGICAL,            INTENT(OUT) :: OUSERG ! use Rg mixing ratio               
+LOGICAL,            INTENT(OUT) :: OUSERH ! use Rh mixing ratio               
+LOGICAL,            INTENT(OUT) :: OUSECHEM ! Chemical flag
+LOGICAL,            INTENT(OUT) :: OUSECHAQ ! Aqueous Chemical flag
+LOGICAL,            INTENT(OUT) :: OUSECHIC ! Ice phase Chemical flag
+LOGICAL,            INTENT(OUT) :: OCH_PH   ! pH flag
+LOGICAL,            INTENT(OUT) :: OCH_CONV_LINOX ! LiNOX flag
+LOGICAL,            INTENT(OUT) :: OLG      ! lagrangian flag
+INTEGER,            INTENT(OUT) :: KRIMX, KRIMY        ! number of points for the
+                       ! horizontal relaxation for the outermost verticals
+INTEGER,            INTENT(OUT) :: KSV_USER    ! number of additional scalar
+                                          ! variables in FMfile 
+CHARACTER (LEN=4),  INTENT(OUT) :: HTURB  ! Kind of turbulence parameterization
+                                          ! used to produce the FMfile
+CHARACTER (LEN=4),  INTENT(OUT) :: HTOM   ! Kind of third order moment
+LOGICAL,            INTENT(OUT) :: ORMC01 ! flag for RMC01 SBL computations
+CHARACTER (LEN=4),  INTENT(OUT) :: HRAD   ! Kind of radiation scheme
+CHARACTER (LEN=4),  INTENT(OUT) :: HDCONV ! Kind of deep convection scheme
+CHARACTER (LEN=4),  INTENT(OUT) :: HSCONV ! Kind of shallow convection scheme
+CHARACTER (LEN=4),  INTENT(OUT) :: HCLOUD ! Kind of microphysical scheme
+CHARACTER (LEN=4),  INTENT(OUT) :: HELEC  ! Kind of electrical scheme
+CHARACTER (LEN=*),  INTENT(OUT) :: HEQNSYS! type of equations' system
+LOGICAL,            INTENT(OUT) :: OSALT    ! Sea Salt flag
+LOGICAL,            INTENT(OUT) :: OPASPOL  ! Passive pollutant flag
+LOGICAL,            INTENT(OUT) :: OFIRE    ! Blaze flag
+#ifdef MNH_FOREFIRE
+LOGICAL,            INTENT(OUT) :: OFOREFIRE ! ForeFire flag
+#endif
+LOGICAL,            INTENT(OUT) :: OLNOX_EXPLICIT ! explicit LNOx flag
+LOGICAL,            INTENT(OUT) :: OCONDSAMP! Conditional sampling flag
+LOGICAL,            INTENT(OUT) :: OBLOWSNOW! Blowing snow flag
+LOGICAL,            INTENT(OUT) :: ODUST    ! Dust flag
+LOGICAL,            INTENT(OUT) :: OORILAM  ! Dust flag
+LOGICAL,            INTENT(OUT) :: OCHTRANS ! Deep convection on scalar
+                                            ! variables flag 
+LOGICAL,DIMENSION(JPMODELMAX),INTENT(OUT) :: ODEPOS_DST    ! Dust Wet Deposition flag
+LOGICAL,DIMENSION(JPMODELMAX),INTENT(OUT) :: ODEPOS_SLT    ! Sea Salt Wet Deposition flag
+LOGICAL,DIMENSION(JPMODELMAX),INTENT(OUT) :: ODEPOS_AER    ! Aerosols Wet Deposition flag
+!
+!*       0.2   declarations of local variables 
+!
+INTEGER :: ILUDES, & ! logical unit numbers of
+           ILUOUT    ! DESFM file and output listing
+LOGICAL :: GFOUND          ! Return code when searching namelist
+LOGICAL,DIMENSION(JPMODELMAX),SAVE :: LTEMPDEPOS_DST ! Dust Moist flag
+LOGICAL,DIMENSION(JPMODELMAX),SAVE :: LTEMPDEPOS_SLT ! Sea Salt Moist flag
+LOGICAL,DIMENSION(JPMODELMAX),SAVE :: LTEMPDEPOS_AER ! Orilam Moist flag
+TYPE(TFILEDATA), POINTER :: TZDESFILE
+!
+!-------------------------------------------------------------------------------
+!
+!*       1.    READ DESFM FILE
+!              ---------------
+!
+CALL PRINT_MSG(NVERB_DEBUG,'IO','READ_DESFM_n','called for '//TRIM(TPDATAFILE%CNAME))
+!
+IF (.NOT.ASSOCIATED(TPDATAFILE%TDESFILE)) &
+  CALL PRINT_MSG(NVERB_FATAL,'IO','READ_DESFM_n','TDESFILE not associated for '//TRIM(TPDATAFILE%CNAME))
+!
+TZDESFILE => TPDATAFILE%TDESFILE
+ILUDES = TZDESFILE%NLU
+ILUOUT = TLUOUT%NLU
+!
+CALL POSNAM( TZDESFILE, 'NAM_LUNITN', GFOUND )
+CALL INIT_NAM_LUNITN
+IF (GFOUND) THEN 
+  READ(UNIT=ILUDES,NML=NAM_LUNITn)
+  CALL UPDATE_NAM_LUNITN
+END IF
+CALL POSNAM( TZDESFILE, 'NAM_CONFN', GFOUND )
+CALL INIT_NAM_CONFN
+IF (GFOUND) THEN 
+  READ(UNIT=ILUDES,NML=NAM_CONFn)
+  CALL UPDATE_NAM_CONFN
+END IF
+CALL POSNAM( TZDESFILE, 'NAM_DYNN', GFOUND )
+CALL INIT_NAM_DYNN
+IF (GFOUND) THEN 
+  READ(UNIT=ILUDES,NML=NAM_DYNn)
+  CALL UPDATE_NAM_DYNN
+END IF
+CALL POSNAM( TZDESFILE, 'NAM_ADVN', GFOUND )
+CALL INIT_NAM_ADVN
+IF (GFOUND) THEN 
+  READ(UNIT=ILUDES,NML=NAM_ADVn)
+  CALL UPDATE_NAM_ADVN
+END IF
+CALL POSNAM( TZDESFILE, 'NAM_PARAMN', GFOUND )
+CALL INIT_NAM_PARAMn
+IF (GFOUND) THEN 
+  READ(UNIT=ILUDES,NML=NAM_PARAMn)
+  CALL UPDATE_NAM_PARAMn
+END IF
+CALL POSNAM( TZDESFILE, 'NAM_PARAM_RADN', GFOUND )
+CALL INIT_NAM_PARAM_RADn
+IF (GFOUND) THEN 
+  READ(UNIT=ILUDES,NML=NAM_PARAM_RADn)
+  CALL UPDATE_NAM_PARAM_RADn
+END IF
+#ifdef MNH_ECRAD
+CALL POSNAM( TZDESFILE, 'NAM_PARAM_ECRADN', GFOUND )
+CALL INIT_NAM_PARAM_ECRADn
+IF (GFOUND) THEN 
+  READ(UNIT=ILUDES,NML=NAM_PARAM_ECRADn)
+  CALL UPDATE_NAM_PARAM_ECRADn
+END IF
+#endif
+CALL POSNAM( TZDESFILE, 'NAM_PARAM_KAFRN', GFOUND )
+CALL INIT_NAM_PARAM_KAFRn
+IF (GFOUND) THEN 
+  READ(UNIT=ILUDES,NML=NAM_PARAM_KAFRn)
+  CALL UPDATE_NAM_PARAM_KAFRn
+END IF
+CALL PARAM_MFSHALLN_INIT(CPROGRAM, TZDESFILE, .FALSE., ILUOUT, .FALSE., .TRUE., .FALSE., 0)
+CALL POSNAM( TZDESFILE, 'NAM_LBCN', GFOUND )
+CALL INIT_NAM_LBCn
+IF (GFOUND) THEN 
+  READ(UNIT=ILUDES,NML=NAM_LBCn)
+  CALL UPDATE_NAM_LBCn
+END IF
+CALL POSNAM( TZDESFILE, 'NAM_NUDGINGN', GFOUND )
+CALL INIT_NAM_NUDGINGn
+IF (GFOUND) THEN 
+  READ(UNIT=ILUDES,NML=NAM_NUDGINGn)
+  CALL UPDATE_NAM_NUDGINGn
+END IF
+CALL TURBN_INIT(CPROGRAM, TZDESFILE, .FALSE., ILUOUT, .FALSE., .TRUE., .FALSE., 0)
+CALL NEBN_INIT(CPROGRAM, TZDESFILE, .FALSE., ILUOUT, .FALSE., .TRUE., .FALSE., 0)
+CALL PARAM_ICEN_INIT(CPROGRAM, TZDESFILE, .FALSE., ILUOUT, .FALSE., .TRUE., .FALSE., 0)
+CALL POSNAM( TZDESFILE, 'NAM_CH_MNHCN', GFOUND )
+CALL INIT_NAM_CH_MNHCn
+IF (GFOUND) THEN 
+  READ(UNIT=ILUDES,NML=NAM_CH_MNHCn)
+  CALL UPDATE_NAM_CH_MNHCn
+END IF
+CALL POSNAM( TZDESFILE, 'NAM_CH_SOLVERN', GFOUND )
+CALL INIT_NAM_CH_SOLVERn
+IF (GFOUND) THEN 
+  READ(UNIT=ILUDES,NML=NAM_CH_SOLVERn)
+  CALL UPDATE_NAM_CH_SOLVERn
+END IF
+CALL POSNAM( TZDESFILE, 'NAM_DRAGN', GFOUND )
+CALL INIT_NAM_DRAGn
+IF (GFOUND) THEN 
+  READ(UNIT=ILUDES,NML=NAM_DRAGn)
+  CALL UPDATE_NAM_DRAGn
+END IF
+CALL POSNAM( TZDESFILE, 'NAM_IBM_PARAMN', GFOUND )
+CALL INIT_NAM_IBM_PARAMn
+IF (GFOUND) THEN
+  READ(UNIT=ILUDES,NML=NAM_IBM_PARAMn)
+  CALL UPDATE_NAM_IBM_PARAMn
+END IF
+CALL POSNAM( TZDESFILE, 'NAM_RECYCL_PARAMN', GFOUND )
+CALL INIT_NAM_RECYCL_PARAMn
+IF (GFOUND) THEN
+  READ(UNIT=ILUDES,NML=NAM_RECYCL_PARAMn)
+  CALL UPDATE_NAM_RECYCL_PARAMn
+END IF
+CALL POSNAM( TZDESFILE, 'NAM_SERIESN', GFOUND )
+CALL INIT_NAM_SERIESn
+IF (GFOUND) THEN 
+  READ(UNIT=ILUDES,NML=NAM_SERIESn)
+  CALL UPDATE_NAM_SERIESn
+END IF
+CALL POSNAM( TZDESFILE, 'NAM_BLOWSNOWN', GFOUND )
+CALL INIT_NAM_BLOWSNOWn
+IF (GFOUND) THEN
+  READ(UNIT=ILUDES,NML=NAM_BLOWSNOWn)
+  CALL UPDATE_NAM_BLOWSNOWn
+END IF
+CALL POSNAM( TZDESFILE, 'NAM_BLANKN', GFOUND )
+CALL INIT_NAM_BLANKn
+IF (GFOUND) THEN
+  READ(UNIT=ILUDES,NML=NAM_BLANKn)
+  CALL UPDATE_NAM_BLANKn
+END IF
+! Note: it is not useful to read the PROFILERS/STATIONS namelists in the .des files
+! The values here (if present in file) don't need to be compared with the ones in the EXSEGn files
+! CALL POSNAM( TZDESFILE, 'NAM_PROFILERN', GFOUND )
+! CALL INIT_NAM_PROFILERn
+! IF (GFOUND) THEN
+!   READ(UNIT=ILUDES,NML=NAM_PROFILERN)
+!   CALL UPDATE_NAM_PROFILERn
+! END IF
+! CALL POSNAM( TZDESFILE, 'NAM_STATIONN', GFOUND )
+! CALL INIT_NAM_STATIONn
+! IF (GFOUND) THEN
+!   READ(UNIT=ILUDES,NML=NAM_STATIONn)
+!   CALL UPDATE_NAM_STATIONn
+! END IF
+CALL POSNAM( TZDESFILE, 'NAM_FIREN', GFOUND )
+CALL INIT_NAM_FIREn
+IF (GFOUND) THEN
+  READ(UNIT=ILUDES,NML=NAM_FIREn)
+  CALL UPDATE_NAM_FIREn
+END IF
+!
+!
+IF (KMI == 1) THEN
+  CALL POSNAM( TZDESFILE, 'NAM_CONF', GFOUND )
+  IF (GFOUND) READ(UNIT=ILUDES,NML=NAM_CONF)
+  CALL POSNAM( TZDESFILE, 'NAM_DYN', GFOUND )
+  IF (GFOUND) READ(UNIT=ILUDES,NML=NAM_DYN)
+  CALL POSNAM( TZDESFILE, 'NAM_NESTING', GFOUND )
+  IF (GFOUND) READ(UNIT=ILUDES,NML=NAM_NESTING)
+  CALL POSNAM( TZDESFILE, 'NAM_BACKUP', GFOUND )
+  IF (GFOUND) THEN
+    IF (.NOT.ALLOCATED(XBAK_TIME)) THEN
+      ALLOCATE(XBAK_TIME(NMODEL,JPOUTMAX))
+      XBAK_TIME(:,:) = XNEGUNDEF
+    END IF
+    IF (.NOT.ALLOCATED(XOUT_TIME)) THEN
+      ALLOCATE(XOUT_TIME(NMODEL,JPOUTMAX)) !Allocate *OUT* variables to prevent
+      XOUT_TIME(:,:) = XNEGUNDEF
+    END IF
+    IF (.NOT.ALLOCATED(NBAK_STEP)) THEN
+      ALLOCATE(NBAK_STEP(NMODEL,JPOUTMAX))
+      NBAK_STEP(:,:) = NNEGUNDEF
+    END IF
+    IF (.NOT.ALLOCATED(NOUT_STEP)) THEN
+      ALLOCATE(NOUT_STEP(NMODEL,JPOUTMAX)) !problems if NAM_OUTPUT does not exist
+      NOUT_STEP(:,:) = NNEGUNDEF
+    END IF
+    IF (.NOT.ALLOCATED(COUT_VAR)) THEN
+      ALLOCATE(COUT_VAR (NMODEL,JPOUTVARMAX))
+      COUT_VAR(:,:)  = ''
+    END IF
+    READ(UNIT=ILUDES,NML=NAM_BACKUP)
+  ELSE
+    CALL POSNAM( TZDESFILE, 'NAM_FMOUT', GFOUND )
+    IF (GFOUND) CALL PRINT_MSG(NVERB_FATAL,'IO','READ_DESFM_n','use namelist NAM_BACKUP instead of namelist NAM_FMOUT')
+  END IF
+  CALL POSNAM( TZDESFILE, 'NAM_OUTPUT', GFOUND )
+  IF (GFOUND) THEN
+    IF (.NOT.ALLOCATED(XBAK_TIME)) THEN
+      ALLOCATE(XBAK_TIME(NMODEL,JPOUTMAX)) !Allocate *BAK* variables to prevent
+      XBAK_TIME(:,:) = XNEGUNDEF
+    END IF
+    IF (.NOT.ALLOCATED(XOUT_TIME)) THEN
+      ALLOCATE(XOUT_TIME(NMODEL,JPOUTMAX))
+      XOUT_TIME(:,:) = XNEGUNDEF
+    END IF
+    IF (.NOT.ALLOCATED(NBAK_STEP)) THEN
+      ALLOCATE(NBAK_STEP(NMODEL,JPOUTMAX)) !problems if NAM_BACKUP does not exist
+      NBAK_STEP(:,:) = NNEGUNDEF
+    END IF
+    IF (.NOT.ALLOCATED(NOUT_STEP)) THEN
+      ALLOCATE(NOUT_STEP(NMODEL,JPOUTMAX))
+      NOUT_STEP(:,:) = NNEGUNDEF
+    END IF
+    IF (.NOT.ALLOCATED(COUT_VAR)) THEN
+      ALLOCATE(COUT_VAR (NMODEL,JPOUTVARMAX))
+      COUT_VAR(:,:)  = ''
+    END IF
+    READ(UNIT=ILUDES,NML=NAM_OUTPUT)
+  END IF
+! Note: it is not useful to read the budget namelists in the .des files
+! The values here (if present in file) don't need to be compared with the ones in the EXSEGn files
+!   CALL POSNAM( TZDESFILE, 'NAM_BUDGET', GFOUND )
+!   IF (GFOUND) READ(UNIT=ILUDES,NML=NAM_BUDGET)
+!   CALL POSNAM( TZDESFILE, 'NAM_BU_RU', GFOUND )
+!   IF (GFOUND) READ(UNIT=ILUDES,NML=NAM_BU_RU)
+!   CALL POSNAM( TZDESFILE, 'NAM_BU_RV', GFOUND )
+!   IF (GFOUND) READ(UNIT=ILUDES,NML=NAM_BU_RV)
+!   CALL POSNAM( TZDESFILE, 'NAM_BU_RW', GFOUND )
+!   IF (GFOUND) READ(UNIT=ILUDES,NML=NAM_BU_RW)
+!   CALL POSNAM( TZDESFILE, 'NAM_BU_RTH', GFOUND )
+!   IF (GFOUND) READ(UNIT=ILUDES,NML=NAM_BU_RTH)
+!   CALL POSNAM( TZDESFILE, 'NAM_BU_RTKE', GFOUND )
+!   IF (GFOUND) READ(UNIT=ILUDES,NML=NAM_BU_RTKE)
+!   CALL POSNAM( TZDESFILE, 'NAM_BU_RRV', GFOUND )
+!   IF (GFOUND) READ(UNIT=ILUDES,NML=NAM_BU_RRV)
+!   CALL POSNAM( TZDESFILE, 'NAM_BU_RRC', GFOUND )
+!   IF (GFOUND) READ(UNIT=ILUDES,NML=NAM_BU_RRC)
+!   CALL POSNAM( TZDESFILE, 'NAM_BU_RRR', GFOUND )
+!   IF (GFOUND) READ(UNIT=ILUDES,NML=NAM_BU_RRR)
+!   CALL POSNAM( TZDESFILE, 'NAM_BU_RRI', GFOUND )
+!   IF (GFOUND) READ(UNIT=ILUDES,NML=NAM_BU_RRI)
+!   CALL POSNAM( TZDESFILE, 'NAM_BU_RRS', GFOUND )
+!   IF (GFOUND) READ(UNIT=ILUDES,NML=NAM_BU_RRS)
+!   CALL POSNAM( TZDESFILE, 'NAM_BU_RRG', GFOUND )
+!   IF (GFOUND) READ(UNIT=ILUDES,NML=NAM_BU_RRG)
+!   CALL POSNAM( TZDESFILE, 'NAM_BU_RRH', GFOUND )
+!   IF (GFOUND) READ(UNIT=ILUDES,NML=NAM_BU_RRH)
+!   CALL POSNAM( TZDESFILE, 'NAM_BU_RSV', GFOUND )
+!   IF (GFOUND) READ(UNIT=ILUDES,NML=NAM_BU_RSV)
+  CALL POSNAM( TZDESFILE, 'NAM_LES', GFOUND )
+  IF (GFOUND) READ(UNIT=ILUDES,NML=NAM_LES)
+  CALL POSNAM( TZDESFILE, 'NAM_PDF', GFOUND )
+  IF (GFOUND) READ(UNIT=ILUDES,NML=NAM_PDF)
+  CALL POSNAM( TZDESFILE, 'NAM_FRC', GFOUND )
+  IF (GFOUND) READ(UNIT=ILUDES,NML=NAM_FRC)
+  CALL POSNAM( TZDESFILE, 'NAM_PARAM_C2R2', GFOUND )
+  IF (GFOUND) READ(UNIT=ILUDES,NML=NAM_PARAM_C2R2)
+  CALL POSNAM( TZDESFILE, 'NAM_PARAM_C1R3', GFOUND )
+  IF (GFOUND) READ(UNIT=ILUDES,NML=NAM_PARAM_C1R3)
+  CALL PARAM_LIMA_INIT(CPROGRAM, TZDESFILE, .FALSE., ILUOUT, .FALSE., .TRUE., .FALSE., 0)
+  CALL POSNAM( TZDESFILE, 'NAM_ELEC', GFOUND )
+  IF (GFOUND) READ(UNIT=ILUDES,NML=NAM_ELEC)
+  CALL POSNAM( TZDESFILE, 'NAM_SERIES', GFOUND )
+  IF (GFOUND) READ(UNIT=ILUDES,NML=NAM_SERIES)
+  CALL POSNAM( TZDESFILE, 'NAM_TURB_CLOUD', GFOUND )
+  IF (GFOUND) READ(UNIT=ILUDES,NML=NAM_TURB_CLOUD)
+  CALL POSNAM( TZDESFILE, 'NAM_CH_ORILAM', GFOUND )
+  IF (GFOUND) READ(UNIT=ILUDES,NML=NAM_CH_ORILAM)
+  CALL POSNAM( TZDESFILE, 'NAM_DUST', GFOUND )
+  IF (GFOUND) READ(UNIT=ILUDES,NML=NAM_DUST)
+  CALL POSNAM( TZDESFILE, 'NAM_SALT', GFOUND )
+  IF (GFOUND) READ(UNIT=ILUDES,NML=NAM_SALT)
+  CALL POSNAM( TZDESFILE, 'NAM_PASPOL', GFOUND )
+  IF (GFOUND) READ(UNIT=ILUDES,NML=NAM_PASPOL)
+#ifdef MNH_FOREFIRE
+  CALL POSNAM( TZDESFILE, 'NAM_FOREFIRE', GFOUND )
+  IF (GFOUND) READ(UNIT=ILUDES,NML=NAM_FOREFIRE)
+#endif
+  CALL POSNAM( TZDESFILE, 'NAM_CONDSAMP', GFOUND )
+  IF (GFOUND) READ(UNIT=ILUDES,NML=NAM_CONDSAMP)
+  CALL POSNAM( TZDESFILE, 'NAM_BLOWSNOW', GFOUND )
+  IF (GFOUND) READ(UNIT=ILUDES,NML=NAM_BLOWSNOW)
+  CALL POSNAM( TZDESFILE, 'NAM_2D_FRC', GFOUND )
+  IF (GFOUND) READ(UNIT=ILUDES,NML=NAM_2D_FRC)
+  LTEMPDEPOS_DST(:) = LDEPOS_DST(:)
+  LTEMPDEPOS_SLT(:) = LDEPOS_SLT(:)
+  LTEMPDEPOS_AER(:) = LDEPOS_AER(:)
+  CALL POSNAM( TZDESFILE, 'NAM_LATZ_EDFLX', GFOUND )
+  IF (GFOUND) READ(UNIT=ILUDES,NML=NAM_LATZ_EDFLX)
+  CALL POSNAM( TZDESFILE, 'NAM_VISC', GFOUND )
+  IF (GFOUND) READ(UNIT=ILUDES,NML=NAM_VISC)
+! Note: it is not useful to read the FLYERS/AIRCRAFTS/BALLOONS namelists in the .des files
+! The values here (if present in file) don't need to be compared with the ones in the EXSEGn files
+!   CALL POSNAM( TZDESFILE, 'NAM_FLYERS', GFOUND )
+!   IF (GFOUND) READ(UNIT=ILUDES,NML=NAM_FLYERS)
+!   CALL POSNAM(ILUSEG,'NAM_AIRCRAFTS', GFOUND )
+!   IF (GFOUND) READ(UNIT=ILUSEG,NML=NAM_AIRCRAFTS)
+!   CALL POSNAM(ILUSEG,'NAM_BALLOONS', GFOUND )
+!   IF (GFOUND) READ(UNIT=ILUSEG,NML=NAM_BALLOONS)
+END IF
+!
+!-------------------------------------------------------------------------------
+!
+!*       2.    SAVE SOME FMFILE ATTRIBUTES
+!              ---------------------------
+HCONF  = CCONF
+OFLAT  = LFLAT
+OUSERV = LUSERV
+OUSERC = LUSERC
+OUSERR = LUSERR
+OUSERI = LUSERI
+OUSECI = LUSECI
+OUSERS = LUSERS
+OUSERG = LUSERG
+OUSERH = LUSERH
+OUSECHEM = LUSECHEM
+OUSECHAQ = LUSECHAQ
+OUSECHIC = LUSECHIC
+OCH_PH = LCH_PH
+OCH_CONV_LINOX = LCH_CONV_LINOX
+ODUST    = LDUST
+ODEPOS_DST(KMI)    = LTEMPDEPOS_DST(KMI)
+ODEPOS_SLT(KMI)    = LTEMPDEPOS_SLT(KMI)
+ODEPOS_AER(KMI)    = LTEMPDEPOS_AER(KMI)
+OCHTRANS = LCHTRANS
+OSALT    = LSALT
+OORILAM  = LORILAM
+OLG      = LLG
+OPASPOL  = LPASPOL
+OFIRE    = LBLAZE
+#ifdef MNH_FOREFIRE
+OFOREFIRE  = LFOREFIRE
+#endif
+OLNOX_EXPLICIT = LLNOX_EXPLICIT
+OCONDSAMP= LCONDSAMP
+OBLOWSNOW= LBLOWSNOW
+! Initially atmosphere free of blowing snow particles
+IF(KMI>1) OBLOWSNOW=.FALSE.
+KRIMX  = NRIMX
+KRIMY  = NRIMY
+KSV_USER = NSV_USER
+HTURB  = CTURB
+HTOM = CTOM
+ORMC01 = LRMC01
+HRAD   = CRAD
+HDCONV = CDCONV
+HSCONV = CSCONV
+HCLOUD = CCLOUD
+HELEC  = CELEC
+HEQNSYS = CEQNSYS
+!
+!-------------------------------------------------------------------------------
+!
+!*       3.    WRITE DESFM ON OUTPUT LISTING
+!              ------------------------------
+!
+IF (NVERB >= 10) THEN
+  WRITE(UNIT=ILUOUT,FMT="(/,'DESCRIPTOR OF INITIAL FILE FOR MODEL ',I2)") KMI
+  WRITE(UNIT=ILUOUT,FMT="(  '------------------------------------ '   )")
+!  
+  WRITE(UNIT=ILUOUT,FMT="('********** LOGICAL UNITSn **********')")
+  WRITE(UNIT=ILUOUT,NML=NAM_LUNITn)
+!  
+  WRITE(UNIT=ILUOUT,FMT="('********** CONFIGURATIONn **********')")
+  WRITE(UNIT=ILUOUT,NML=NAM_CONFn)
+!  
+  WRITE(UNIT=ILUOUT,FMT="('********** DYNAMICn ****************')")
+  WRITE(UNIT=ILUOUT,NML=NAM_DYNn)
+!  
+  WRITE(UNIT=ILUOUT,FMT="('********** ADVECTIONn **************')")
+  WRITE(UNIT=ILUOUT,NML=NAM_ADVn)
+!  
+  WRITE(UNIT=ILUOUT,FMT="('********** PARAMETERIZATIONSn ******')")
+  WRITE(UNIT=ILUOUT,NML=NAM_PARAMn)
+!  
+  WRITE(UNIT=ILUOUT,FMT="('********** RADIATIONSn *************')")
+  WRITE(UNIT=ILUOUT,NML=NAM_PARAM_RADn)
+!  
+#ifdef MNH_ECRAD
+  WRITE(UNIT=ILUOUT,FMT="('********** ECRAD RADIATIONSn *************')")
+  WRITE(UNIT=ILUOUT,NML=NAM_PARAM_ECRADn)
+#endif
+!  
+  WRITE(UNIT=ILUOUT,FMT="('********** DEEP CONVECTIONn ********')")
+  WRITE(UNIT=ILUOUT,NML=NAM_PARAM_KAFRn)
+!  
+  WRITE(UNIT=ILUOUT,FMT="('*** MASS FLUX SHALLOW CONVECTION ***')")
+  CALL PARAM_MFSHALLN_INIT(CPROGRAM, TZDESFILE, .FALSE., ILUOUT, .FALSE., .FALSE., .FALSE., 2)
+!
+  WRITE(UNIT=ILUOUT,FMT="('********** LBCn ********************')")
+  WRITE(UNIT=ILUOUT,NML=NAM_LBCn)
+!  
+  WRITE(UNIT=ILUOUT,FMT="('********** TURBn *******************')")  
+  CALL TURBN_INIT(CPROGRAM, TZDESFILE, .FALSE., ILUOUT, .FALSE., .FALSE., .FALSE., 2)
+!
+  WRITE(UNIT=ILUOUT,FMT="('********** NEBn *******************')")  
+  CALL NEBN_INIT(CPROGRAM, TZDESFILE, .FALSE., ILUOUT, .FALSE., .FALSE., .FALSE., 2)
+!
+  WRITE(UNIT=ILUOUT,FMT="('********** DRAGn *******************')")  
+  WRITE(UNIT=ILUOUT,NML=NAM_DRAGn)
+!
+  WRITE(UNIT=ILUOUT,FMT="('********** IBM FORCING *************')")
+  WRITE(UNIT=ILUOUT,NML=NAM_IBM_PARAMn)  
+!
+  WRITE(UNIT=ILUOUT,FMT="('********** RECYLING *************')")
+  WRITE(UNIT=ILUOUT,NML=NAM_RECYCL_PARAMn)
+!
+  WRITE(UNIT=ILUOUT,FMT="('********** NUDGINGn ****************')")  
+  WRITE(UNIT=ILUOUT,NML=NAM_NUDGINGn)
+!  
+  WRITE(UNIT=ILUOUT,FMT="('********** CHEMICAL MONITORn *******')")  
+  WRITE(UNIT=ILUOUT,NML=NAM_CH_MNHCn)
+!
+  WRITE(UNIT=ILUOUT,FMT="('********** CHEMICAL SOLVER *********')")
+  WRITE(UNIT=ILUOUT,NML=NAM_CH_SOLVERn)
+!
+  WRITE(UNIT=ILUOUT,FMT="('********** BLOWSNOWn ***************')")
+  WRITE(UNIT=ILUOUT,NML=NAM_BLOWSNOWn)
+!
+  WRITE(UNIT=ILUOUT,FMT="('********** BLANKn ******************')")
+  WRITE(UNIT=ILUOUT,NML=NAM_BLANKn)
+!
+! Profilers/stations namelists not read anymore in READ_DESFM_n
+!   WRITE(UNIT=ILUOUT,FMT="('********** PROFILERn *****************')")
+!   WRITE(UNIT=ILUOUT,NML=NAM_PROFILERn)
+!
+!   WRITE(UNIT=ILUOUT,FMT="('********** STATIONn ******************')")
+!   WRITE(UNIT=ILUOUT,NML=NAM_STATIONn)
+!
+  WRITE(UNIT=ILUOUT,FMT="('************ ICE SCHEME ***********************')")
+  CALL PARAM_ICEN_INIT(CPROGRAM, TZDESFILE, .FALSE., ILUOUT, .FALSE., .FALSE., .FALSE., 2)
+!    
+  WRITE(UNIT=ILUOUT,FMT="('********** BLAZE *******************')")
+  WRITE(UNIT=ILUOUT,NML=NAM_FIREn)
+!
+  IF (KMI==1) THEN
+    WRITE(UNIT=ILUOUT,FMT="(/,'PART OF INITIAL FILE COMMON TO ALL THE MODELS')")
+    WRITE(UNIT=ILUOUT,FMT="(  '---------------------------------------------')")
+!
+    WRITE(UNIT=ILUOUT,FMT="('************ CONFIGURATION ********************')")
+    WRITE(UNIT=ILUOUT,NML=NAM_CONF)
+!    
+    WRITE(UNIT=ILUOUT,FMT="('************ DYNAMIC **************************')")
+    WRITE(UNIT=ILUOUT,NML=NAM_DYN)
+!    
+! Budget namelists not read anymore in READ_DESFM_n
+!     WRITE(UNIT=ILUOUT,FMT="('************ BUDGET ***************************')")
+!     WRITE(UNIT=ILUOUT,NML=NAM_BUDGET)
+! !
+!     WRITE(UNIT=ILUOUT,FMT="('************ U BUDGET *************************')")
+!     WRITE(UNIT=ILUOUT,NML=NAM_BU_RU)
+! !
+!     WRITE(UNIT=ILUOUT,FMT="('************ V BUDGET *************************')")
+!     WRITE(UNIT=ILUOUT,NML=NAM_BU_RV)
+! !
+!     WRITE(UNIT=ILUOUT,FMT="('************ W BUDGET *************************')")
+!     WRITE(UNIT=ILUOUT,NML=NAM_BU_RW)
+! !
+!     WRITE(UNIT=ILUOUT,FMT="('************ TH BUDGET ************************')")
+!     WRITE(UNIT=ILUOUT,NML=NAM_BU_RTH)
+! !
+!     WRITE(UNIT=ILUOUT,FMT="('************ TKE BUDGET ***********************')")
+!     WRITE(UNIT=ILUOUT,NML=NAM_BU_RTKE)
+! !
+!     WRITE(UNIT=ILUOUT,FMT="('************ RV BUDGET ************************')")
+!     WRITE(UNIT=ILUOUT,NML=NAM_BU_RRV)
+! !
+!     WRITE(UNIT=ILUOUT,FMT="('************ RC BUDGET ************************')")
+!     WRITE(UNIT=ILUOUT,NML=NAM_BU_RRC)
+! !
+!     WRITE(UNIT=ILUOUT,FMT="('************ RR BUDGET ************************')")
+!     WRITE(UNIT=ILUOUT,NML=NAM_BU_RRR)
+! !
+!     WRITE(UNIT=ILUOUT,FMT="('************ RI BUDGET ************************')")
+!     WRITE(UNIT=ILUOUT,NML=NAM_BU_RRI)
+! !
+!     WRITE(UNIT=ILUOUT,FMT="('************ RS BUDGET ************************')")
+!     WRITE(UNIT=ILUOUT,NML=NAM_BU_RRS)
+! !
+!     WRITE(UNIT=ILUOUT,FMT="('************ RG BUDGET ************************')")
+!     WRITE(UNIT=ILUOUT,NML=NAM_BU_RRG)
+! !
+!     WRITE(UNIT=ILUOUT,FMT="('************ RH BUDGET ************************')")
+!     WRITE(UNIT=ILUOUT,NML=NAM_BU_RRH)
+! !
+!     WRITE(UNIT=ILUOUT,FMT="('************ SVx BUDGET ***********************')")
+!     WRITE(UNIT=ILUOUT,NML=NAM_BU_RSV)
+!    
+    WRITE(UNIT=ILUOUT,FMT="('************ LES ******************************')")
+    WRITE(UNIT=ILUOUT,NML=NAM_LES)
+!
+    WRITE(UNIT=ILUOUT,FMT="('************ PDF ******************************')")
+    WRITE(UNIT=ILUOUT,NML=NAM_PDF)
+!    
+    WRITE(UNIT=ILUOUT,FMT="('************ FORCING **************************')")
+    WRITE(UNIT=ILUOUT,NML=NAM_FRC)
+!    
+    WRITE(UNIT=ILUOUT,FMT="('************ ORILAM SCHEME ********************')")
+    WRITE(UNIT=ILUOUT,NML=NAM_CH_ORILAM)
+!
+    WRITE(UNIT=ILUOUT,FMT="('************ SALT SCHEME **********************')")
+    WRITE(UNIT=ILUOUT,NML=NAM_SALT)
+!
+    WRITE(UNIT=ILUOUT,FMT="('************ DUST SCHEME **********************')")
+    WRITE(UNIT=ILUOUT,NML=NAM_DUST)
+!    
+    WRITE(UNIT=ILUOUT,FMT="('************ PASSIVE POLLUTANT  ***************')")
+    WRITE(UNIT=ILUOUT,NML=NAM_PASPOL)
+!
+    WRITE(UNIT=ILUOUT,FMT="('************ VISCOSITY  ***************')")
+    WRITE(UNIT=ILUOUT,NML=NAM_VISC)
+!
+#ifdef MNH_FOREFIRE
+    WRITE(UNIT=ILUOUT,FMT="('************ FOREFIRE  ***************')")
+    WRITE(UNIT=ILUOUT,NML=NAM_FOREFIRE)
+!
+#endif
+!
+    WRITE(UNIT=ILUOUT,FMT="('************ CONDITIONAL SAMPLING *************')")
+    WRITE(UNIT=ILUOUT,NML=NAM_CONDSAMP)
+ !
+    WRITE(UNIT=ILUOUT,FMT="('********** BLOWING SNOW SCHEME******************')")
+    WRITE(UNIT=ILUOUT,NML=NAM_BLOWSNOW)
+!
+    IF( CCLOUD == 'C2R2' ) THEN
+      WRITE(UNIT=ILUOUT,FMT="('************ C2R2 SCHEME **********************')")
+      WRITE(UNIT=ILUOUT,NML=NAM_PARAM_C2R2)
+    END IF
+!
+    IF( CCLOUD == 'KHKO' ) THEN                                                    !modif
+      WRITE(UNIT=ILUOUT,FMT="('************ KHKO SCHEME **********************')")
+      WRITE(UNIT=ILUOUT,NML=NAM_PARAM_C2R2)
+    END IF
+!
+    IF( CCLOUD == 'C3R5' ) THEN
+      WRITE(UNIT=ILUOUT,FMT="('************ C3R5 SCHEME **********************')")
+      WRITE(UNIT=ILUOUT,NML=NAM_PARAM_C2R2)
+      WRITE(UNIT=ILUOUT,NML=NAM_PARAM_C1R3)
+    END IF
+!
+    IF( CCLOUD == 'LIMA' ) THEN
+      WRITE(UNIT=ILUOUT,FMT="('************ LIMA SCHEME **********************')")
+      CALL PARAM_LIMA_INIT(CPROGRAM, TZDESFILE, .FALSE., ILUOUT, .FALSE., .FALSE., .FALSE., 2)
+    END IF
+!
+   IF (CELEC /= 'NONE') THEN
+     WRITE(UNIT=ILUOUT,FMT="('************ ELEC SCHEME **********************')")
+     WRITE(UNIT=ILUOUT,NML=NAM_ELEC)                                             
+   END IF
+!    
+  END IF
+!
+END IF  
+!
+!-------------------------------------------------------------------------------
+!
+END SUBROUTINE READ_DESFM_n
diff --git a/src/PHYEX/ext/read_exsegn.f90 b/src/PHYEX/ext/read_exsegn.f90
new file mode 100644
index 0000000000000000000000000000000000000000..1aa20763f3e5f7718a35250692619d1555dc8b76
--- /dev/null
+++ b/src/PHYEX/ext/read_exsegn.f90
@@ -0,0 +1,3040 @@
+!MNH_LIC Copyright 1994-2023 CNRS, Meteo-France and Universite Paul Sabatier
+!MNH_LIC This is part of the Meso-NH software governed by the CeCILL-C licence
+!MNH_LIC version 1. See LICENSE, CeCILL-C_V1-en.txt and CeCILL-C_V1-fr.txt
+!MNH_LIC for details. version 1.
+!-----------------------------------------------------------------
+!     ###################### 
+      MODULE MODI_READ_EXSEG_n
+!     ######################
+!
+INTERFACE
+!
+      SUBROUTINE READ_EXSEG_n(KMI,TPEXSEGFILE,HCONF,OFLAT,OUSERV,                  &
+                   OUSERC,OUSERR,OUSERI,OUSECI,OUSERS,OUSERG,OUSERH,               &
+                   OUSECHEM,OUSECHAQ,OUSECHIC,OCH_PH,OCH_CONV_LINOX,OSALT,         &
+                   ODEPOS_SLT, ODUST,ODEPOS_DST, OCHTRANS,                         &
+                   OORILAM,ODEPOS_AER, OLG,OPASPOL, OFIRE,                         &
+#ifdef MNH_FOREFIRE
+                   OFOREFIRE,                                                      &
+#endif
+                   OLNOX_EXPLICIT,                                                 &
+                   OCONDSAMP,OBLOWSNOW,                                            &
+                   KRIMX,KRIMY, KSV_USER,                                          &
+                   HTURB,HTOM,ORMC01,HRAD,HDCONV,HSCONV,HCLOUD,HELEC,              &
+                   HEQNSYS,PTSTEP_ALL,HINIFILEPGD                                  )
+!
+USE MODD_IO,   ONLY: TFILEDATA
+!
+INTEGER,            INTENT(IN) :: KMI    ! Model index
+TYPE(TFILEDATA),    INTENT(IN) :: TPEXSEGFILE ! EXSEG file
+!     The following variables are read by READ_DESFM in DESFM descriptor : 
+CHARACTER (LEN=*),  INTENT(IN) :: HCONF  ! configuration var. linked to FMfile
+LOGICAL,            INTENT(IN) :: OFLAT  ! Logical for zero orography
+LOGICAL,            INTENT(IN) :: OUSERV,OUSERC,OUSERR,OUSERI,OUSERS, &
+                                  OUSERG,OUSERH  ! kind of moist variables in 
+                                                 ! FMfile
+LOGICAL,            INTENT(IN) :: OUSECI         ! ice concentration in
+                                                 ! FMfile
+LOGICAL,            INTENT(IN) :: OUSECHEM       ! Chemical FLAG in FMFILE
+LOGICAL,            INTENT(IN) :: OUSECHAQ       ! Aqueous chemical FLAG in FMFILE
+LOGICAL,            INTENT(IN) :: OUSECHIC       ! Ice chemical FLAG in FMFILE
+LOGICAL,            INTENT(IN) :: OCH_PH         ! pH FLAG in FMFILE
+LOGICAL,            INTENT(IN) :: OCH_CONV_LINOX ! LiNOx FLAG in FMFILE
+LOGICAL,            INTENT(IN) :: ODUST          ! Dust FLAG in FMFILE
+LOGICAL,DIMENSION(:), INTENT(IN)  :: ODEPOS_DST  ! Dust wet deposition FLAG in FMFILE     
+LOGICAL,DIMENSION(:), INTENT(IN)  :: ODEPOS_SLT  ! Sea Salt wet deposition FLAG in FMFILE     
+LOGICAL,DIMENSION(:), INTENT(IN)  :: ODEPOS_AER  ! Orilam wet deposition FLAG in FMFILE     
+LOGICAL,            INTENT(IN) :: OSALT          ! Sea Salt FLAG in FMFILE
+LOGICAL,            INTENT(IN) :: OORILAM        ! Orilam FLAG in FMFILE
+LOGICAL,            INTENT(IN) :: OPASPOL        ! Passive pollutant FLAG in FMFILE
+LOGICAL,            INTENT(IN) :: OFIRE          ! Blaze FLAG in FMFILE
+#ifdef MNH_FOREFIRE
+LOGICAL,            INTENT(IN) :: OFOREFIRE      ! ForeFire FLAG in FMFILE
+#endif
+LOGICAL,            INTENT(IN) :: OLNOX_EXPLICIT ! explicit LNOx FLAG in FMFILE
+LOGICAL,            INTENT(IN) :: OCONDSAMP      ! Conditional sampling FLAG in FMFILE
+LOGICAL,            INTENT(IN) :: OBLOWSNOW     ! Blowing snow FLAG in FMFILE
+LOGICAL,            INTENT(IN) :: OCHTRANS       ! LCHTRANS FLAG in FMFILE
+
+LOGICAL,            INTENT(IN) :: OLG            ! lagrangian FLAG in FMFILE
+INTEGER,            INTENT(IN) :: KRIMX, KRIMY   ! number of points for the
+                       ! horizontal relaxation for the outermost verticals
+INTEGER,            INTENT(IN) :: KSV_USER    ! number of additional scalar
+                                         ! variables in FMfile 
+CHARACTER (LEN=*),  INTENT(IN) :: HTURB  ! Kind of turbulence parameterization
+                                         ! used to  produce FMFILE
+CHARACTER (LEN=*),  INTENT(IN) :: HTOM   ! Kind of third order moment
+LOGICAL,            INTENT(IN) :: ORMC01 ! flag for RMC01 SBL computations
+CHARACTER (LEN=*),  INTENT(IN) :: HRAD   ! Kind of radiation scheme
+CHARACTER (LEN=4),  INTENT(IN) :: HDCONV ! Kind of deep convection scheme
+CHARACTER (LEN=4),  INTENT(IN) :: HSCONV ! Kind of shallow convection scheme
+CHARACTER (LEN=4),  INTENT(IN) :: HCLOUD ! Kind of microphysical scheme
+CHARACTER (LEN=4),  INTENT(IN) :: HELEC  ! Kind of electrical scheme
+CHARACTER (LEN=*),  INTENT(IN) :: HEQNSYS! type of equations' system
+REAL,DIMENSION(:),  INTENT(INOUT):: PTSTEP_ALL ! Time STEP of ALL models
+CHARACTER (LEN=*),  INTENT(IN) :: HINIFILEPGD ! name of PGD file
+!
+END SUBROUTINE READ_EXSEG_n
+!
+END INTERFACE
+!
+END MODULE MODI_READ_EXSEG_n
+!
+!
+!     #########################################################################
+      SUBROUTINE READ_EXSEG_n(KMI,TPEXSEGFILE,HCONF,OFLAT,OUSERV,                  &
+                   OUSERC,OUSERR,OUSERI,OUSECI,OUSERS,OUSERG,OUSERH,               &
+                   OUSECHEM,OUSECHAQ,OUSECHIC,OCH_PH,OCH_CONV_LINOX,OSALT,         &
+                   ODEPOS_SLT, ODUST,ODEPOS_DST, OCHTRANS,                         &
+                   OORILAM,ODEPOS_AER, OLG,OPASPOL, OFIRE,                         &
+#ifdef MNH_FOREFIRE
+                   OFOREFIRE,                                                      &
+#endif
+                   OLNOX_EXPLICIT,                                                 &
+                   OCONDSAMP, OBLOWSNOW,                                           &
+                   KRIMX,KRIMY, KSV_USER,                                          &
+                   HTURB,HTOM,ORMC01,HRAD,HDCONV,HSCONV,HCLOUD,HELEC,              &
+                   HEQNSYS,PTSTEP_ALL,HINIFILEPGD                                  )
+!     #########################################################################
+!
+!!****  *READ_EXSEG_n * - routine to read  the descriptor file EXSEG
+!!
+!!    PURPOSE
+!!    -------
+!       The purpose of this routine is to read the descriptor file called 
+!     EXSEG and to control the coherence with FMfile data . 
+!       
+!!
+!!**  METHOD
+!!    ------
+!!      The descriptor file is read. Namelists (NAMXXXn) which contain
+!!    variables linked to one nested model are at the beginning of the file.
+!!    Namelists (NAMXXX) which contain variables common to all models
+!!    are at the end of the file. When the  model index is different from 1, 
+!!    the end of the file (namelists NAMXXX) is not read. 
+!!
+!!      Coherence between the initial file (description read in DESFM file)
+!!    and the segment to perform (description read in EXSEG file)
+!!    is checked for segment achievement  configurations 
+!!    or  postprocessing configuration. The get indicators are set according 
+!!      to the following check :
+!!
+!!      - segment achievement and preinit configurations :
+!!
+!!       * if there is no turbulence kinetic energy in  initial
+!!      file (HTURB='NONE'), and the segment to perform requires a turbulence
+!!      parameterization (CTURB /= 'NONE'), the get indicators for turbulence 
+!!      kinetic energy variables are set to 'INIT'; i.e. these variables will be
+!!      set equal to  zero by READ_FIELD according to the get indicators.
+!!       * The same procedure is applied to the dissipation of TKE. 
+!!       * if there is no moist variables RRn  in  initial file (OUSERn=.FALSE.)
+!!      and the segment to perform requires  moist variables RRn
+!!      (LUSERn=.TRUE.),  the get indicators for moist variables RRn are set
+!!      equal to 'INIT'; i.e. these variables will be set equal to  zero by 
+!!      READ_FIELD according to the get indicators.
+!!       * if there are KSV_USER additional scalar variables in initial file and the
+!!      segment to perform needs more than KSV_USER additional variables,  the get
+!!      indicators for these (NSV_USER-KSV_USER) additional scalar variables are set 
+!!      equal to 'INIT'; i.e. these variables will be set equal to  zero by 
+!!      READ_FIELD according to the get indicators. If the segment to perform
+!!      needs less additional scalar variables than there are in initial file,
+!!      the get indicators for these (KSV_USER - NSV_USER) additional scalar variables are
+!!      set equal to 'SKIP'.      
+!!       * warning messages are printed if the fields in initial file are the
+!!      same at time t and t-dt (HCONF='START') and  a leap-frog advance 
+!!      at first time step will be used  for the segment to perform
+!!      (CCONF='RESTA'); It is likewise when HCONF='RESTA' and CCONF='START'.
+!!       * A warning message is printed if the orography in initial file is zero
+!!      (OFLAT=.TRUE.) and the segment to perform considers no-zero orography
+!!      (LFLAT=.FALSE.). It is likewise for LFLAT=.TRUE. and OFLAT=.FALSE..
+!!       If the segment to perform requires zero orography (LFLAT=.TRUE.), the
+!!       orography (XZS) will not read in initial file but  set equal to zero 
+!!       by SET_GRID.  
+!!       * check of the depths of the Lateral Damping Layer in x and y 
+!!       direction is performed
+!!       * If some coupling files are specified, LSTEADYLS is set to T
+!!       * If no coupling files are specified, LSTEADYLS is set to F
+!!
+!!
+!!    EXTERNAL
+!!    --------
+!!
+!!    IMPLICIT ARGUMENTS
+!!    ------------------
+!!     Module MODN_CONF : CCONF,LTHINSHELL,LFLAT,NMODEL,NVERB     
+!!
+!!      Module MODN_DYN : LCORIO, LZDIFFU
+!!
+!!      Module MODN_NESTING : NDAD(m),NDTRATIO(m),XWAY(m)
+!!
+!!      Module MODN_BUDGET : CBUTYPE,XBULEN
+!!
+!!      Module MODN_CONF1 : LUSERV,LUSERC,LUSERR,LUSERI,LUSERS,LUSERG,LUSERH,CSEG
+!!
+!!      Module MODN_DYN1 : XTSTEP,CPRESOPT,NITR,XRELAX
+!!
+!!      Module MODD_ADV1 : CMET_ADV_SCHEME,CSV_ADV_SCHEME,CUVW_ADV_SCHEME,NLITER
+!!
+!!      Module MODN_PARAM1 : CTURB,CRAD,CDCONV,CSCONV
+!!
+!!      Module MODN_LUNIT1 : 
+!!      Module MODN_LBC1 : CLBCX,CLBCY,NLBLX,NLBLY,XCPHASE,XPOND
+!!
+!!      Module MODN_TURB_n : CTURBLEN,CTURBDIM
+!!
+!!      Module MODD_GET1: 
+!!        CGETTKEM,CGETTKET,
+!!        CGETRVM,CGETRCM,CGETRRM,CGETRIM,CGETRSM,CGETRGM,CGETRHM
+!!        CGETRVT,CGETRCT,CGETRRT,CGETRIT,CGETRST,CGETRGT,CGETRHT,CGETSVM
+!!        CGETSVT,CGETSIGS,CGETSRCM,CGETSRCT 
+!!        NCPL_NBR,NCPL_TIMES,NCPL_CUR
+!!      Module MODN_LES  : contains declaration of the control parameters
+!!                                for Large Eddy Simulations' storages
+!!                                for the forcing
+!!
+!!    REFERENCE
+!!    ---------
+!!      Book2 of the  documentation (routine READ_EXSEG_n)
+!!      
+!!
+!!    AUTHOR
+!!    ------
+!!  	V. Ducrocq       * Meteo France *
+!!
+!!    MODIFICATIONS
+!!    -------------
+!!      Original    07/06/94 
+!!      Modification   26/10/94  (Stein)  remove NAM_GET from the Namelists
+!!      present in DESFM + change the namelist names
+!!      Modification   22/11/94  (Stein)  add GET indicator for phi
+!!      Modification   21/12/94  (Stein)  add GET indicator for LS fields  
+!!      Modification   06/01/95  (Stein)  bug in the test for Scalar Var.
+!!      Modifications  09/01/95  (Stein)  add the turbulence scheme
+!!      Modifications  09/01/95  (Stein)  add the 1D switch
+!!      Modifications  10/03/95  (Mallet) add coherence in coupling case
+!!      Modifications  16/03/95  (Stein)  remove R from the historical variables
+!!      Modifications  01/03/95  (Hereil) add the budget namelists
+!!      Modifications  16/06/95  (Stein)  coherence control for the
+!!                microphysical scheme + remove the wrong messge for RESTA conf
+!!      Modifications  30/06/95  (Stein)  conditionnal reading of the fields
+!!                used by the moist turbulence scheme
+!!      Modifications  12/09/95  (Pinty)  add the radiation scheme
+!!      Modification   06/02/96  (J.Vila) implement scalar advection schemes
+!!      Modifications  24/02/96  (Stein)  change the default value for CCPLFILE
+!!      Modifications  02/05/96  (Stein Jabouille) change the Z0SEA activation
+!!      Modifications  24/05/96  (Stein)  change the SRC SIGS control
+!!      Modifications  08/09/96  (Masson) the coupling file names are reset to
+!!                               default value " " before reading in EXSEG1.nam
+!!                               to avoid extra non-existant coupling files
+!!
+!!      Modifications  25/04/95  (K.Suhre)add namelist NAM_BLANK
+!!                                        add read for LFORCING
+!!                     25/04/95  (K.Suhre)add namelist NAM_FRC
+!!                                        and switch checking
+!!                     06/08/96  (K.Suhre)add namelist NAM_CH_MNHCn
+!!                                        and NAM_CH_SOLVER
+!!      Modifications  10/10/96  (Stein)  change SRC into SRCM and SRCT
+!!      Modifications  11/04/96  (Pinty)  add the rain-ice microphysical scheme
+!!      Modifications  11/01/97  (Pinty)  add the deep convection scheme
+!!      Modifications  22/05/97  (Lafore) gridnesting implementation
+!!      Modifications  22/06/97  (Stein)  add the absolute pressure + cleaning
+!!      Modifications  25/08/97  (Masson) add tests on surface schemes
+!!                     22/10/97  (Stein) remove the RIMX /= 0 control
+!!                                       + new namelist + cleaning
+!!      Modifications  17/04/98  (Masson) add tests on character variables
+!!      Modification   15/03/99  (Masson) add tests on PROGRAM
+!!      Modification   04/01/00  (Masson) removes TSZ0 case
+!!      Modification   04/06/00  (Pinty)  add C2R2 scheme
+!!                     11/12/00  (Tomasini) add CSEA_FLUX to MODD_PARAMn
+!!                                          delete the test on SST_FRC only in 1D
+!!      Modification   22/01/01  (Gazen)  change NSV,KSV to NSV_USER,KSV_USER and add
+!!                                        NSV_* variables initialization
+!!      Modification   15/10/01  (Mallet) allow namelists in different orders
+!!      Modification   18/03/02  (Solmon)  new radiation scheme test
+!!      Modification   29/11/02 (JP Pinty) add C3R5, ICE2, ICE4, ELEC
+!!      Modification   06/11/02  (Masson)  new LES BL height diagnostic
+!!      Modification   06/11/02  (Jabouille)  remove LTHINSHELL LFORCING test
+!!      Modification   01/12/03  (Gazen)   change Chemical scheme interface
+!!      Modification   01/2004   (Masson) removes surface (externalization)
+!!      Modification   01/2005   (Masson) removes 1D and 2D switches
+!!      Modification   04/2005   (Tulet)  add dust, orilam
+!!      Modification   03/2006   (O.Geoffroy) Add KHKO scheme
+!!      Modification   04/2006   (Maric)  include 4th order advection scheme
+!!      Modification   05/2006   (Masson) add nudging
+!!      Modification   05/2006   Remove KEPS
+!!      Modification   04/2006   (Maric)  include PPM advection scheme
+!!      Modification   04/2006   (J.Escobar) Bug dollarn add CALL UPDATE_NAM_CONFN  
+!!      Modifications  01/2007   (Malardel,Pergaud)  add the MF shallow
+!!                               convection scheme MODN_PARAM_MFSHALL_n
+!!      Modification   09/2009   (J.Escobar) add more info on relaxation problems
+!!      Modification   09/2011   (J.Escobar) re-add 'ZRESI' choose
+!!      Modification   12/2011   (C.Lac) Adaptation to FIT temporal scheme 
+!!      Modification   12/2012   (S.Bielli) add NAM_NCOUT for netcdf output (removed 08/07/2016)
+!!      Modification   02/2012   (Pialat/Tulet) add ForeFire
+!!      Modification   02/2012   (T.Lunet) add of new Runge-Kutta methods
+!!      Modification   01/2015   (C. Barthe) add explicit LNOx
+!!      J.Escobar : 15/09/2015 : WENO5 & JPHEXT <> 1 
+!!      M.Leriche 18/12/2015 : bug chimie glace dans prep_real_case
+!!      Modification    01/2016  (JP Pinty) Add LIMA
+!!      Modification   02/2016   (M.Leriche) treat gas and aq. chemicals separately
+!!      P.Wautelet 08/07/2016 : removed MNH_NCWRIT define
+!!      Modification   10/2016    (C.LAC) Add OSPLIT_WENO + Add droplet
+!!                                deposition + Add max values
+!!      Modification   11/2016   (Ph. Wautelet) Allocate/initialise some output/backup structures
+!!      Modification   03/2017   (JP Chaboureau) Fix the initialization of
+!!                                               LUSERx-type variables for LIMA
+!!      M.Leriche      06/2017 for spawn and prep_real avoid abort if wet dep for 
+!!                             aerosol and no cloud scheme defined
+!!      Q.Libois       02/2018  ECRAD
+!!  Philippe Wautelet: 05/2016-04/2018: new data structures and calls for I/O
+!!      Modification   07/2017   (V. Vionnet) add blowing snow scheme
+!!      Modification   01/2019   (Q. Rodier) define XCEDIS depending on BL89 or RM17 mixing length
+!!      Modification   01/2019   (P. Wautelet) bugs correction: incorrect writes
+!!      Modification   01/2019   (R. Honnert) remove SURF in CMF_UPDRAFT
+!!      Bielli S. 02/2019  Sea salt : significant sea wave height influences salt emission; 5 salt modes
+!  P. Wautelet 10/04/2019: replace ABORT and STOP calls by Print_msg
+!  C. Lac         11/2019: correction in the drag formula and application to building in addition to tree
+!  Q. Rodier      03/2020: add abort if use of any LHORELAX and cyclic conditions
+!  F.Auguste      02/2021: add IBM
+!  T.Nagel        02/2021: add turbulence recycling
+!  E.Jezequel     02/2021: add stations read from CSV file
+!  P. Wautelet 09/03/2021: simplify allocation of scalar variable names
+!  P. Wautelet 09/03/2021: move some chemistry initializations to ini_nsv
+!  P. Wautelet 10/03/2021: move scalar variable name initializations to ini_nsv
+!  R. Honnert  23/04/2021: add HM21 mixing length and delete HRIO and BOUT from CMF_UPDRAFT
+!  S. Riette   11/05/2021  HighLow cloud
+!  A. Costes      12/2021: add Blaze fire model
+!  R. Schoetter   12/2021:  multi-level coupling between MesoNH and SURFEX
+!  P. Wautelet 27/04/2022: add namelist for profilers
+!  P. Wautelet 24/06/2022: remove check on CSTORAGE_TYPE for restart of ForeFire variables
+!  P. Wautelet 13/07/2022: add namelist for flyers and balloons
+!  P. Wautelet 19/08/2022: add namelist for aircrafts
+!------------------------------------------------------------------------------
+!
+!*       0.    DECLARATIONS
+!              ------------
+USE MODD_AIRCRAFT_BALLOON, ONLY: NAIRCRAFTS, NBALLOONS
+USE MODD_BLOWSNOW
+USE MODD_BUDGET
+USE MODD_CH_AEROSOL
+USE MODD_CH_M9_n, ONLY : NEQ
+USE MODD_CONDSAMP
+USE MODD_CONF
+USE MODD_CONF_n,  ONLY: CSTORAGE_TYPE
+USE MODD_CONFZ
+! USE MODD_DRAG_n
+USE MODD_DUST
+USE MODD_DYN
+USE MODD_DYN_n, ONLY : LHORELAX_SVLIMA, LHORELAX_SVFIRE
+#ifdef MNH_FOREFIRE
+USE MODD_FOREFIRE
+#endif
+USE MODD_GET_n
+USE MODD_GR_FIELD_n
+USE MODD_IO,   ONLY: TFILEDATA
+USE MODD_LUNIT_n, ONLY: TLUOUT
+USE MODD_NSV,NSV_USER_n=>NSV_USER
+USE MODD_PARAMETERS
+USE MODD_PASPOL
+USE MODD_SALT
+USE MODD_VAR_ll,  ONLY: NPROC
+USE MODD_VISCOSITY
+
+USE MODE_MSG
+USE MODE_POS
+
+USE MODI_INI_NSV
+USE MODI_TEST_NAM_VAR
+
+USE MODN_2D_FRC
+USE MODN_ADV_n      ! The final filling of these modules for the model n is
+USE MODN_AIRCRAFTS, ONLY: AIRCRAFTS_NML_ALLOCATE, NAM_AIRCRAFTS
+USE MODN_BACKUP
+USE MODN_BALLOONS,  ONLY: BALLOONS_NML_ALLOCATE, NAM_BALLOONS
+USE MODN_BLANK_n
+USE MODN_BLOWSNOW
+USE MODN_BLOWSNOW_n
+USE MODN_BUDGET
+USE MODN_CH_MNHC_n
+USE MODN_CH_ORILAM
+USE MODN_CH_SOLVER_n
+USE MODN_CONDSAMP
+USE MODN_CONF
+USE MODN_CONF_n
+USE MODN_CONFZ
+USE MODN_DRAGBLDG_n
+USE MODN_COUPLING_LEVELS_n
+USE MODN_DRAG_n
+USE MODN_DRAGTREE_n
+USE MODN_DUST
+USE MODN_DYN
+USE MODN_DYN_n      ! to avoid the duplication of this routine for each model.
+USE MODN_ELEC
+USE MODN_EOL
+USE MODN_EOL_ADNR
+USE MODN_EOL_ALM
+USE MODN_FIRE_n
+USE MODN_FLYERS
+#ifdef MNH_FOREFIRE
+USE MODN_FOREFIRE
+#endif
+USE MODN_FRC
+USE MODN_IBM_PARAM_n
+USE MODN_LATZ_EDFLX
+USE MODN_LBC_n      ! routine is used for each nested model. This has been done
+USE MODN_LES
+USE MODN_LUNIT_n
+USE MODN_MEAN
+USE MODN_NESTING
+USE MODN_NUDGING_n
+USE MODN_OUTPUT
+USE MODN_PARAM_C1R3, ONLY : NAM_PARAM_C1R3, CPRISTINE_ICE_C1R3,    &
+                            CHEVRIMED_ICE_C1R3
+USE MODN_PARAM_C2R2, ONLY : EPARAM_CCN=>HPARAM_CCN, EINI_CCN=>HINI_CCN, &
+                            WNUC=>XNUC, WALPHAC=>XALPHAC, NAM_PARAM_C2R2
+USE MODN_PARAM_ECRAD_n
+USE MODD_PARAM_ICE_n, ONLY : PARAM_ICEN_INIT, PARAM_ICEN, CSUBG_AUCV_RC, CSUBG_AUCV_RI
+USE MODN_PARAM_KAFR_n
+USE MODD_PARAM_LIMA, ONLY : FINI_CCN=>HINI_CCN,PARAM_LIMA_INIT,NMOD_CCN,LSCAV, &
+                            CPRISTINE_ICE_LIMA, CHEVRIMED_ICE_LIMA, NMOD_IFN, NMOD_IMM, &
+                            LACTI, LNUCL, XALPHAC, XNUC, LMEYERS, &
+                            LPTSPLIT, LSPRO, LADJ, LKHKO, &
+                            NMOM_C, NMOM_R, NMOM_I, NMOM_S, NMOM_G, NMOM_H
+USE MODD_PARAM_MFSHALL_n, ONLY: PARAM_MFSHALLN_INIT
+USE MODN_PARAM_n    ! realized in subroutine ini_model n
+USE MODN_PARAM_RAD_n
+USE MODN_PASPOL
+USE MODN_PROFILER_n, LDIAG_SURFRAD_PROF => LDIAG_SURFRAD
+USE MODN_RECYCL_PARAM_n
+USE MODN_SALT
+USE MODN_SERIES
+USE MODN_SERIES_n
+USE MODN_STATION_n,  LDIAG_SURFRAD_STAT => LDIAG_SURFRAD
+USE MODD_TURB_n, ONLY: TURBN_INIT, CTOM, CTURBDIM, LRMC01, LHARAT, &
+                       LCLOUDMODIFLM, CTURBLEN_CLOUD, XCEI_MIN, XCEI_MAX
+USE MODD_NEB_n, ONLY: NEBN_INIT, LSIGMAS, LSUBG_COND, CCONDENS, LSTATNW
+USE MODN_VISCOSITY
+!
+IMPLICIT NONE
+!
+!*       0.1   declarations of arguments
+!
+!
+!
+INTEGER,            INTENT(IN) :: KMI    ! Model index
+TYPE(TFILEDATA),    INTENT(IN) :: TPEXSEGFILE ! EXSEG file
+!     The following variables are read by READ_DESFM in DESFM descriptor : 
+CHARACTER (LEN=*),  INTENT(IN) :: HCONF  ! configuration var. linked to FMfile
+LOGICAL,            INTENT(IN) :: OFLAT  ! Logical for zero orography
+LOGICAL,            INTENT(IN) :: OUSERV,OUSERC,OUSERR,OUSERI,OUSERS, &
+                                  OUSERG,OUSERH  ! kind of moist variables in 
+                                                 ! FMfile
+LOGICAL,            INTENT(IN) :: OUSECI         ! ice concentration in
+                                                 ! FMfile
+LOGICAL,            INTENT(IN) :: OUSECHEM       ! Chemical FLAG in FMFILE
+LOGICAL,            INTENT(IN) :: OUSECHAQ       ! Aqueous chemical FLAG in FMFILE
+LOGICAL,            INTENT(IN) :: OUSECHIC       ! Ice chemical FLAG in FMFILE
+LOGICAL,            INTENT(IN) :: OCH_PH         ! pH FLAG in FMFILE
+LOGICAL,            INTENT(IN) :: OCH_CONV_LINOX ! LiNOx FLAG in FMFILE
+LOGICAL,            INTENT(IN) :: ODUST          ! Dust FLAG in FMFILE
+LOGICAL,DIMENSION(:), INTENT(IN) :: ODEPOS_DST   ! Dust Deposition FLAG in FMFILE
+LOGICAL,DIMENSION(:), INTENT(IN) :: ODEPOS_SLT   ! Sea Salt wet deposition FLAG in FMFILE     
+LOGICAL,DIMENSION(:), INTENT(IN) :: ODEPOS_AER   ! Orilam wet deposition FLAG in FMFILE     
+LOGICAL,            INTENT(IN) :: OSALT          ! Sea Salt FLAG in FMFILE
+LOGICAL,            INTENT(IN) :: OORILAM        ! Orilam FLAG in FMFILE
+LOGICAL,            INTENT(IN) :: OPASPOL        ! Passive pollutant FLAG in FMFILE
+LOGICAL,            INTENT(IN) :: OFIRE          ! Blaze FLAG in FMFILE
+#ifdef MNH_FOREFIRE
+LOGICAL,            INTENT(IN) :: OFOREFIRE      ! ForeFire FLAG in FMFILE
+#endif
+LOGICAL,            INTENT(IN) :: OLNOX_EXPLICIT ! explicit LNOx FLAG in FMFILE
+LOGICAL,            INTENT(IN) :: OCONDSAMP      ! Conditional sampling FLAG in FMFILE
+LOGICAL,            INTENT(IN) :: OCHTRANS       ! LCHTRANS FLAG in FMFILE
+LOGICAL,            INTENT(IN) :: OBLOWSNOW     ! Blowing snow FLAG in FMFILE
+
+LOGICAL,            INTENT(IN) :: OLG            ! lagrangian FLAG in FMFILE
+INTEGER,            INTENT(IN) :: KRIMX, KRIMY   ! number of points for the
+                       ! horizontal relaxation for the outermost verticals
+INTEGER,            INTENT(IN) :: KSV_USER    ! number of additional scalar
+                                         ! variables in FMfile 
+CHARACTER (LEN=*),  INTENT(IN) :: HTURB  ! Kind of turbulence parameterization
+                                         ! used to  produce FMFILE
+CHARACTER (LEN=*),  INTENT(IN) :: HTOM   ! Kind of third order moment
+LOGICAL,            INTENT(IN) :: ORMC01 ! flag for RMC01 SBL computations
+CHARACTER (LEN=*),  INTENT(IN) :: HRAD   ! Kind of radiation scheme
+CHARACTER (LEN=4),  INTENT(IN) :: HDCONV ! Kind of deep convection scheme
+CHARACTER (LEN=4),  INTENT(IN) :: HSCONV ! Kind of shallow convection scheme
+CHARACTER (LEN=4),  INTENT(IN) :: HCLOUD ! Kind of microphysical scheme
+CHARACTER (LEN=4),  INTENT(IN) :: HELEC  ! Kind of electrical scheme
+CHARACTER (LEN=*),  INTENT(IN) :: HEQNSYS! type of equations' system
+REAL,DIMENSION(:),  INTENT(INOUT):: PTSTEP_ALL ! Time STEP of ALL models
+CHARACTER (LEN=*),  INTENT(IN) :: HINIFILEPGD ! name of PGD file
+!
+!*       0.2   declarations of local variables
+!
+CHARACTER(LEN=3) :: YMODEL
+INTEGER :: ILUSEG,ILUOUT ! logical unit numbers of EXSEG file and outputlisting
+INTEGER :: JS,JCI,JI,JSV       ! Loop indexes 
+LOGICAL :: GRELAX              
+LOGICAL :: GFOUND              ! Return code when searching namelist
+!
+!-------------------------------------------------------------------------------
+!
+!*       1.    READ EXSEG FILE
+!              ---------------
+!
+CALL PRINT_MSG(NVERB_DEBUG,'IO','READ_EXSEG_n','called for '//TRIM(TPEXSEGFILE%CNAME))
+!
+ILUSEG = TPEXSEGFILE%NLU
+ILUOUT = TLUOUT%NLU
+!
+CALL INIT_NAM_LUNITN
+CCPLFILE(:)="                            "
+CALL INIT_NAM_CONFN
+CALL INIT_NAM_DYNN
+CALL INIT_NAM_ADVN
+CALL INIT_NAM_DRAGTREEN
+CALL INIT_NAM_DRAGBLDGN
+CALL INIT_NAM_COUPLING_LEVELSN
+CALL INIT_NAM_PARAMN
+CALL INIT_NAM_PARAM_RADN
+#ifdef MNH_ECRAD
+CALL INIT_NAM_PARAM_ECRADN
+#endif
+CALL INIT_NAM_PARAM_KAFRN
+CALL INIT_NAM_LBCN
+CALL INIT_NAM_NUDGINGN
+CALL INIT_NAM_BLANKN
+CALL INIT_NAM_DRAGN
+CALL INIT_NAM_IBM_PARAMN
+CALL INIT_NAM_RECYCL_PARAMN
+CALL INIT_NAM_CH_MNHCN
+CALL INIT_NAM_CH_SOLVERN
+CALL INIT_NAM_SERIESN
+CALL INIT_NAM_BLOWSNOWN
+CALL INIT_NAM_PROFILERn
+CALL INIT_NAM_STATIONn
+CALL INIT_NAM_FIREn
+!
+WRITE(UNIT=ILUOUT,FMT="(/,'READING THE EXSEG.NAM FILE')")
+CALL POSNAM( TPEXSEGFILE, 'NAM_LUNITN', GFOUND )
+IF (GFOUND) READ(UNIT=ILUSEG,NML=NAM_LUNITn)
+CALL POSNAM( TPEXSEGFILE, 'NAM_CONFN', GFOUND )
+IF (GFOUND) READ(UNIT=ILUSEG,NML=NAM_CONFn)
+CALL POSNAM( TPEXSEGFILE, 'NAM_DYNN', GFOUND )
+IF (GFOUND) READ(UNIT=ILUSEG,NML=NAM_DYNn)
+CALL POSNAM( TPEXSEGFILE, 'NAM_ADVN', GFOUND )
+IF (GFOUND) READ(UNIT=ILUSEG,NML=NAM_ADVn)
+CALL POSNAM( TPEXSEGFILE, 'NAM_PARAMN', GFOUND )
+IF (GFOUND) READ(UNIT=ILUSEG,NML=NAM_PARAMn)
+CALL POSNAM( TPEXSEGFILE, 'NAM_PARAM_RADN', GFOUND )
+IF (GFOUND) READ(UNIT=ILUSEG,NML=NAM_PARAM_RADn)
+#ifdef MNH_ECRAD
+CALL POSNAM( TPEXSEGFILE, 'NAM_PARAM_ECRADN', GFOUND )
+IF (GFOUND) READ(UNIT=ILUSEG,NML=NAM_PARAM_ECRADn)
+#endif
+CALL POSNAM( TPEXSEGFILE, 'NAM_PARAM_KAFRN', GFOUND )
+IF (GFOUND) READ(UNIT=ILUSEG,NML=NAM_PARAM_KAFRn)
+CALL PARAM_MFSHALLN_INIT(CPROGRAM, TPEXSEGFILE, .FALSE., ILUOUT, .FALSE., .TRUE., .FALSE., 0)
+CALL POSNAM( TPEXSEGFILE, 'NAM_LBCN', GFOUND )
+IF (GFOUND) READ(UNIT=ILUSEG,NML=NAM_LBCn)
+CALL POSNAM( TPEXSEGFILE, 'NAM_NUDGINGN', GFOUND )
+IF (GFOUND) READ(UNIT=ILUSEG,NML=NAM_NUDGINGn)
+CALL TURBN_INIT(CPROGRAM, TPEXSEGFILE, .FALSE., ILUOUT, .FALSE., .TRUE., .FALSE., 0)
+CALL NEBN_INIT(CPROGRAM, TPEXSEGFILE, .FALSE., ILUOUT, .FALSE., .TRUE., .FALSE., 0)
+CALL PARAM_ICEN_INIT(CPROGRAM, TPEXSEGFILE, .FALSE., ILUOUT, .FALSE., .TRUE., .FALSE., 0)
+CALL POSNAM( TPEXSEGFILE, 'NAM_DRAGN', GFOUND )
+IF (GFOUND) READ(UNIT=ILUSEG,NML=NAM_DRAGn)
+CALL POSNAM( TPEXSEGFILE, 'NAM_IBM_PARAMN', GFOUND )
+IF (GFOUND) READ(UNIT=ILUSEG,NML=NAM_IBM_PARAMn)
+CALL POSNAM( TPEXSEGFILE, 'NAM_RECYCL_PARAMN', GFOUND )
+IF (GFOUND) READ(UNIT=ILUSEG,NML=NAM_RECYCL_PARAMn)
+CALL POSNAM( TPEXSEGFILE, 'NAM_CH_MNHCN', GFOUND )
+IF (GFOUND) READ(UNIT=ILUSEG,NML=NAM_CH_MNHCn)
+CALL POSNAM( TPEXSEGFILE, 'NAM_CH_SOLVERN', GFOUND )
+IF (GFOUND) READ(UNIT=ILUSEG,NML=NAM_CH_SOLVERn)
+CALL POSNAM( TPEXSEGFILE, 'NAM_SERIESN', GFOUND )
+IF (GFOUND) READ(UNIT=ILUSEG,NML=NAM_SERIESn)
+CALL POSNAM( TPEXSEGFILE, 'NAM_BLANKN', GFOUND )
+IF (GFOUND) READ(UNIT=ILUSEG,NML=NAM_BLANKn)
+CALL POSNAM( TPEXSEGFILE, 'NAM_BLOWSNOWN', GFOUND )
+IF (GFOUND) READ(UNIT=ILUSEG,NML=NAM_BLOWSNOWn)
+CALL POSNAM( TPEXSEGFILE, 'NAM_DRAGTREEN', GFOUND )
+IF (GFOUND) READ(UNIT=ILUSEG,NML=NAM_DRAGTREEn)
+CALL POSNAM( TPEXSEGFILE, 'NAM_DRAGBLDGN', GFOUND )
+IF (GFOUND) READ(UNIT=ILUSEG,NML=NAM_DRAGBLDGn)
+CALL POSNAM( TPEXSEGFILE,'NAM_COUPLING_LEVELSN', GFOUND )
+IF (GFOUND) READ(UNIT=ILUSEG,NML=NAM_COUPLING_LEVELSn)
+CALL POSNAM( TPEXSEGFILE, 'NAM_EOL', GFOUND )
+IF (GFOUND) READ(UNIT=ILUSEG,NML=NAM_EOL)
+CALL POSNAM( TPEXSEGFILE, 'NAM_EOL_ADNR', GFOUND )
+IF (GFOUND) READ(UNIT=ILUSEG,NML=NAM_EOL_ADNR)
+CALL POSNAM( TPEXSEGFILE, 'NAM_EOL_ALM', GFOUND )
+IF (GFOUND) READ(UNIT=ILUSEG,NML=NAM_EOL_ALM)
+CALL POSNAM( TPEXSEGFILE, 'NAM_PROFILERN', GFOUND )
+IF (GFOUND) READ(UNIT=ILUSEG,NML=NAM_PROFILERn)
+CALL POSNAM( TPEXSEGFILE, 'NAM_STATIONN', GFOUND )
+IF (GFOUND) READ(UNIT=ILUSEG,NML=NAM_STATIONn)
+CALL POSNAM( TPEXSEGFILE, 'NAM_FIREN', GFOUND )
+IF (GFOUND) READ(UNIT=ILUSEG,NML=NAM_FIREn)
+!
+IF (KMI == 1) THEN                                               
+  WRITE(UNIT=ILUOUT,FMT="(' namelists common to all the models ')")
+  CALL POSNAM( TPEXSEGFILE, 'NAM_CONF', GFOUND )
+  IF (GFOUND) READ(UNIT=ILUSEG,NML=NAM_CONF)
+  CALL POSNAM( TPEXSEGFILE, 'NAM_CONFZ', GFOUND )
+  IF (GFOUND) READ(UNIT=ILUSEG,NML=NAM_CONFZ)
+  CALL POSNAM( TPEXSEGFILE, 'NAM_DYN', GFOUND )
+  IF (GFOUND) READ(UNIT=ILUSEG,NML=NAM_DYN)
+  CALL POSNAM( TPEXSEGFILE, 'NAM_NESTING', GFOUND )
+  IF (GFOUND) READ(UNIT=ILUSEG,NML=NAM_NESTING)
+  CALL POSNAM( TPEXSEGFILE, 'NAM_BACKUP', GFOUND )
+  IF (GFOUND) THEN
+    !Should have been allocated before in READ_DESFM_n
+    IF (.NOT.ALLOCATED(XBAK_TIME)) THEN
+      ALLOCATE(XBAK_TIME(NMODEL,JPOUTMAX))
+      XBAK_TIME(:,:) = XNEGUNDEF
+    END IF
+    IF (.NOT.ALLOCATED(XOUT_TIME)) THEN
+      ALLOCATE(XOUT_TIME(NMODEL,JPOUTMAX)) !Allocate *OUT* variables to prevent
+      XOUT_TIME(:,:) = XNEGUNDEF
+    END IF
+    IF (.NOT.ALLOCATED(NBAK_STEP)) THEN
+      ALLOCATE(NBAK_STEP(NMODEL,JPOUTMAX))
+      NBAK_STEP(:,:) = NNEGUNDEF
+    END IF
+    IF (.NOT.ALLOCATED(NOUT_STEP)) THEN
+      ALLOCATE(NOUT_STEP(NMODEL,JPOUTMAX)) !problems if NAM_OUTPUT does not exist
+      NOUT_STEP(:,:) = NNEGUNDEF
+    END IF
+    IF (.NOT.ALLOCATED(COUT_VAR)) THEN
+      ALLOCATE(COUT_VAR (NMODEL,JPOUTVARMAX))
+      COUT_VAR(:,:)  = ''
+    END IF
+    READ(UNIT=ILUSEG,NML=NAM_BACKUP)
+  ELSE
+    CALL POSNAM( TPEXSEGFILE, 'NAM_FMOUT', GFOUND )
+    IF (GFOUND) THEN
+      CALL PRINT_MSG(NVERB_FATAL,'IO','READ_EXSEG_n','use namelist NAM_BACKUP instead of namelist NAM_FMOUT')
+    ELSE
+      IF (CPROGRAM=='MESONH') CALL PRINT_MSG(NVERB_ERROR,'IO','READ_EXSEG_n','namelist NAM_BACKUP not found')
+    END IF
+  END IF
+  CALL POSNAM( TPEXSEGFILE, 'NAM_OUTPUT', GFOUND )
+  IF (GFOUND) THEN
+    !Should have been allocated before in READ_DESFM_n
+    IF (.NOT.ALLOCATED(XBAK_TIME)) THEN
+      ALLOCATE(XBAK_TIME(NMODEL,JPOUTMAX)) !Allocate *BAK* variables to prevent
+      XBAK_TIME(:,:) = XNEGUNDEF
+    END IF
+    IF (.NOT.ALLOCATED(XOUT_TIME)) THEN
+      ALLOCATE(XOUT_TIME(NMODEL,JPOUTMAX))
+      XOUT_TIME(:,:) = XNEGUNDEF
+    END IF
+    IF (.NOT.ALLOCATED(NBAK_STEP)) THEN
+      ALLOCATE(NBAK_STEP(NMODEL,JPOUTMAX)) !problems if NAM_BACKUP does not exist
+      NBAK_STEP(:,:) = NNEGUNDEF
+    END IF
+    IF (.NOT.ALLOCATED(NOUT_STEP)) THEN
+      ALLOCATE(NOUT_STEP(NMODEL,JPOUTMAX))
+      NOUT_STEP(:,:) = NNEGUNDEF
+    END IF
+    IF (.NOT.ALLOCATED(COUT_VAR)) THEN
+      ALLOCATE(COUT_VAR (NMODEL,JPOUTVARMAX))
+      COUT_VAR(:,:)  = ''
+    END IF
+    READ(UNIT=ILUSEG,NML=NAM_OUTPUT)
+  END IF
+  CALL POSNAM( TPEXSEGFILE, 'NAM_BUDGET', GFOUND )
+  IF (GFOUND) READ(UNIT=ILUSEG,NML=NAM_BUDGET)
+
+  CALL POSNAM( TPEXSEGFILE, 'NAM_BU_RU', GFOUND )
+  IF (GFOUND) THEN
+    IF ( ALLOCATED( CBULIST_RU ) ) THEN
+      CALL Print_msg( NVERB_WARNING, 'IO', 'READ_EXSEG_n', 'unexpected: CBULIST_RU was already allocated' )
+      DEALLOCATE( CBULIST_RU )
+    END IF
+    ALLOCATE( CHARACTER(LEN=NBULISTMAXLEN) :: CBULIST_RU(NBULISTMAXLINES) )
+    CBULIST_RU(:) = ''
+    READ(UNIT=ILUSEG,NML=NAM_BU_RU)
+  ELSE
+    ALLOCATE( CHARACTER(LEN=NBULISTMAXLEN) :: CBULIST_RU(0) )
+  END IF
+
+  CALL POSNAM( TPEXSEGFILE, 'NAM_BU_RV', GFOUND )
+  IF (GFOUND) THEN
+    IF ( ALLOCATED( CBULIST_RV ) ) THEN
+      CALL Print_msg( NVERB_WARNING, 'IO', 'READ_EXSEG_n', 'unexpected: CBULIST_RV was already allocated' )
+      DEALLOCATE( CBULIST_RV )
+    END IF
+    ALLOCATE( CHARACTER(LEN=NBULISTMAXLEN) :: CBULIST_RV(NBULISTMAXLINES) )
+    CBULIST_RV(:) = ''
+    READ(UNIT=ILUSEG,NML=NAM_BU_RV)
+  ELSE
+    ALLOCATE( CHARACTER(LEN=NBULISTMAXLEN) :: CBULIST_RV(0) )
+  END IF
+
+  CALL POSNAM( TPEXSEGFILE, 'NAM_BU_RW', GFOUND )
+  IF (GFOUND) THEN
+    IF ( ALLOCATED( CBULIST_RW ) ) THEN
+      CALL Print_msg( NVERB_WARNING, 'IO', 'READ_EXSEG_n', 'unexpected: CBULIST_RW was already allocated' )
+      DEALLOCATE( CBULIST_RW )
+    END IF
+    ALLOCATE( CHARACTER(LEN=NBULISTMAXLEN) :: CBULIST_RW(NBULISTMAXLINES) )
+    CBULIST_RW(:) = ''
+    READ(UNIT=ILUSEG,NML=NAM_BU_RW)
+  ELSE
+    ALLOCATE( CHARACTER(LEN=NBULISTMAXLEN) :: CBULIST_RW(0) )
+  END IF
+
+  CALL POSNAM( TPEXSEGFILE, 'NAM_BU_RTH', GFOUND )
+  IF (GFOUND) THEN
+    IF ( ALLOCATED( CBULIST_RTH ) ) THEN
+      CALL Print_msg( NVERB_WARNING, 'IO', 'READ_EXSEG_n', 'unexpected: CBULIST_RTH was already allocated' )
+      DEALLOCATE( CBULIST_RTH )
+    END IF
+    ALLOCATE( CHARACTER(LEN=NBULISTMAXLEN) :: CBULIST_RTH(NBULISTMAXLINES) )
+    CBULIST_RTH(:) = ''
+    READ(UNIT=ILUSEG,NML=NAM_BU_RTH)
+  ELSE
+    ALLOCATE( CHARACTER(LEN=NBULISTMAXLEN) :: CBULIST_RTH(0) )
+  END IF
+
+  CALL POSNAM( TPEXSEGFILE, 'NAM_BU_RTKE', GFOUND )
+  IF (GFOUND) THEN
+    IF ( ALLOCATED( CBULIST_RTKE ) ) THEN
+      CALL Print_msg( NVERB_WARNING, 'IO', 'READ_EXSEG_n', 'unexpected: CBULIST_RTKE was already allocated' )
+      DEALLOCATE( CBULIST_RTKE )
+    END IF
+    ALLOCATE( CHARACTER(LEN=NBULISTMAXLEN) :: CBULIST_RTKE(NBULISTMAXLINES) )
+    CBULIST_RTKE(:) = ''
+    READ(UNIT=ILUSEG,NML=NAM_BU_RTKE)
+  ELSE
+    ALLOCATE( CHARACTER(LEN=NBULISTMAXLEN) :: CBULIST_RTKE(0) )
+  END IF
+
+  CALL POSNAM( TPEXSEGFILE, 'NAM_BU_RRV', GFOUND )
+  IF (GFOUND) THEN
+    IF ( ALLOCATED( CBULIST_RRV ) ) THEN
+      CALL Print_msg( NVERB_WARNING, 'IO', 'READ_EXSEG_n', 'unexpected: CBULIST_RRV was already allocated' )
+      DEALLOCATE( CBULIST_RRV )
+    END IF
+    ALLOCATE( CHARACTER(LEN=NBULISTMAXLEN) :: CBULIST_RRV(NBULISTMAXLINES) )
+    CBULIST_RRV(:) = ''
+    READ(UNIT=ILUSEG,NML=NAM_BU_RRV)
+  ELSE
+    ALLOCATE( CHARACTER(LEN=NBULISTMAXLEN) :: CBULIST_RRV(0) )
+  END IF
+
+  CALL POSNAM( TPEXSEGFILE, 'NAM_BU_RRC', GFOUND )
+  IF (GFOUND) THEN
+    IF ( ALLOCATED( CBULIST_RRC ) ) THEN
+      CALL Print_msg( NVERB_WARNING, 'IO', 'READ_EXSEG_n', 'unexpected: CBULIST_RRC was already allocated' )
+      DEALLOCATE( CBULIST_RRC )
+    END IF
+    ALLOCATE( CHARACTER(LEN=NBULISTMAXLEN) :: CBULIST_RRC(NBULISTMAXLINES) )
+    CBULIST_RRC(:) = ''
+    READ(UNIT=ILUSEG,NML=NAM_BU_RRC)
+  ELSE
+    ALLOCATE( CHARACTER(LEN=NBULISTMAXLEN) :: CBULIST_RRC(0) )
+  END IF
+
+  CALL POSNAM( TPEXSEGFILE, 'NAM_BU_RRR', GFOUND )
+  IF (GFOUND) THEN
+    IF ( ALLOCATED( CBULIST_RRR ) ) THEN
+      CALL Print_msg( NVERB_WARNING, 'IO', 'READ_EXSEG_n', 'unexpected: CBULIST_RRR was already allocated' )
+      DEALLOCATE( CBULIST_RRR )
+    END IF
+    ALLOCATE( CHARACTER(LEN=NBULISTMAXLEN) :: CBULIST_RRR(NBULISTMAXLINES) )
+    CBULIST_RRR(:) = ''
+    READ(UNIT=ILUSEG,NML=NAM_BU_RRR)
+  ELSE
+    ALLOCATE( CHARACTER(LEN=NBULISTMAXLEN) :: CBULIST_RRR(0) )
+  END IF
+
+  CALL POSNAM( TPEXSEGFILE, 'NAM_BU_RRI', GFOUND )
+  IF (GFOUND) THEN
+    IF ( ALLOCATED( CBULIST_RRI ) ) THEN
+      CALL Print_msg( NVERB_WARNING, 'IO', 'READ_EXSEG_n', 'unexpected: CBULIST_RRI was already allocated' )
+      DEALLOCATE( CBULIST_RRI )
+    END IF
+    ALLOCATE( CHARACTER(LEN=NBULISTMAXLEN) :: CBULIST_RRI(NBULISTMAXLINES) )
+    CBULIST_RRI(:) = ''
+    READ(UNIT=ILUSEG,NML=NAM_BU_RRI)
+  ELSE
+    ALLOCATE( CHARACTER(LEN=NBULISTMAXLEN) :: CBULIST_RRI(0) )
+  END IF
+
+  CALL POSNAM( TPEXSEGFILE, 'NAM_BU_RRS', GFOUND )
+  IF (GFOUND) THEN
+    IF ( ALLOCATED( CBULIST_RRS ) ) THEN
+      CALL Print_msg( NVERB_WARNING, 'IO', 'READ_EXSEG_n', 'unexpected: CBULIST_RRS was already allocated' )
+      DEALLOCATE( CBULIST_RRS )
+    END IF
+    ALLOCATE( CHARACTER(LEN=NBULISTMAXLEN) :: CBULIST_RRS(NBULISTMAXLINES) )
+    CBULIST_RRS(:) = ''
+    READ(UNIT=ILUSEG,NML=NAM_BU_RRS)
+  ELSE
+    ALLOCATE( CHARACTER(LEN=NBULISTMAXLEN) :: CBULIST_RRS(0) )
+  END IF
+
+  CALL POSNAM( TPEXSEGFILE, 'NAM_BU_RRG', GFOUND )
+  IF (GFOUND) THEN
+    IF ( ALLOCATED( CBULIST_RRG ) ) THEN
+      CALL Print_msg( NVERB_WARNING, 'IO', 'READ_EXSEG_n', 'unexpected: CBULIST_RRG was already allocated' )
+      DEALLOCATE( CBULIST_RRG )
+    END IF
+    ALLOCATE( CHARACTER(LEN=NBULISTMAXLEN) :: CBULIST_RRG(NBULISTMAXLINES) )
+    CBULIST_RRG(:) = ''
+    READ(UNIT=ILUSEG,NML=NAM_BU_RRG)
+  ELSE
+    ALLOCATE( CHARACTER(LEN=NBULISTMAXLEN) :: CBULIST_RRG(0) )
+  END IF
+
+  CALL POSNAM( TPEXSEGFILE, 'NAM_BU_RRH', GFOUND )
+  IF (GFOUND) THEN
+    IF ( ALLOCATED( CBULIST_RRH ) ) THEN
+      CALL Print_msg( NVERB_WARNING, 'IO', 'READ_EXSEG_n', 'unexpected: CBULIST_RRH was already allocated' )
+      DEALLOCATE( CBULIST_RRH )
+    END IF
+    ALLOCATE( CHARACTER(LEN=NBULISTMAXLEN) :: CBULIST_RRH(NBULISTMAXLINES) )
+    CBULIST_RRH(:) = ''
+    READ(UNIT=ILUSEG,NML=NAM_BU_RRH)
+  ELSE
+    ALLOCATE( CHARACTER(LEN=NBULISTMAXLEN) :: CBULIST_RRH(0) )
+  END IF
+
+  CALL POSNAM( TPEXSEGFILE, 'NAM_BU_RSV', GFOUND )
+  IF (GFOUND) THEN
+    IF ( ALLOCATED( CBULIST_RSV ) ) THEN
+      CALL Print_msg( NVERB_WARNING, 'IO', 'READ_EXSEG_n', 'unexpected: CBULIST_RSV was already allocated' )
+      DEALLOCATE( CBULIST_RSV )
+    END IF
+    ALLOCATE( CHARACTER(LEN=NBULISTMAXLEN) :: CBULIST_RSV(NBULISTMAXLINES) )
+    CBULIST_RSV(:) = ''
+    READ(UNIT=ILUSEG,NML=NAM_BU_RSV)
+  ELSE
+    ALLOCATE( CHARACTER(LEN=NBULISTMAXLEN) :: CBULIST_RSV(0) )
+  END IF
+
+  CALL POSNAM( TPEXSEGFILE, 'NAM_LES', GFOUND )
+  IF (GFOUND) READ(UNIT=ILUSEG,NML=NAM_LES)
+  CALL POSNAM( TPEXSEGFILE, 'NAM_MEAN', GFOUND )
+  IF (GFOUND) READ(UNIT=ILUSEG,NML=NAM_MEAN)
+  CALL POSNAM( TPEXSEGFILE, 'NAM_PDF', GFOUND )
+  IF (GFOUND) READ(UNIT=ILUSEG,NML=NAM_PDF)
+  CALL POSNAM( TPEXSEGFILE, 'NAM_FRC', GFOUND )
+  IF (GFOUND) READ(UNIT=ILUSEG,NML=NAM_FRC)
+  CALL POSNAM( TPEXSEGFILE, 'NAM_PARAM_C2R2', GFOUND )
+  IF (GFOUND) READ(UNIT=ILUSEG,NML=NAM_PARAM_C2R2)
+  CALL POSNAM( TPEXSEGFILE, 'NAM_PARAM_C1R3', GFOUND )
+  IF (GFOUND) READ(UNIT=ILUSEG,NML=NAM_PARAM_C1R3)
+  CALL PARAM_LIMA_INIT(CPROGRAM, TPEXSEGFILE, .FALSE., ILUOUT, .FALSE., .TRUE., .FALSE., 0)
+  CALL POSNAM( TPEXSEGFILE, 'NAM_ELEC', GFOUND )
+  IF (GFOUND) READ(UNIT=ILUSEG,NML=NAM_ELEC)
+  CALL POSNAM( TPEXSEGFILE, 'NAM_SERIES', GFOUND )
+  IF (GFOUND) READ(UNIT=ILUSEG,NML=NAM_SERIES)
+  CALL POSNAM( TPEXSEGFILE, 'NAM_CH_ORILAM', GFOUND )
+  IF (GFOUND) READ(UNIT=ILUSEG,NML=NAM_CH_ORILAM)
+  CALL POSNAM( TPEXSEGFILE, 'NAM_DUST', GFOUND )
+  IF (GFOUND) READ(UNIT=ILUSEG,NML=NAM_DUST)
+  CALL POSNAM( TPEXSEGFILE, 'NAM_SALT', GFOUND )
+  IF (GFOUND) READ(UNIT=ILUSEG,NML=NAM_SALT)
+  CALL POSNAM( TPEXSEGFILE, 'NAM_PASPOL', GFOUND )
+  IF (GFOUND) READ(UNIT=ILUSEG,NML=NAM_PASPOL)
+#ifdef MNH_FOREFIRE
+  CALL POSNAM( TPEXSEGFILE, 'NAM_FOREFIRE', GFOUND )
+  IF (GFOUND) READ(UNIT=ILUSEG,NML=NAM_FOREFIRE)
+#endif
+  CALL POSNAM( TPEXSEGFILE, 'NAM_CONDSAMP', GFOUND )
+  IF (GFOUND) READ(UNIT=ILUSEG,NML=NAM_CONDSAMP)
+  CALL POSNAM( TPEXSEGFILE, 'NAM_2D_FRC', GFOUND )
+  IF (GFOUND) READ(UNIT=ILUSEG,NML=NAM_2D_FRC)
+  CALL POSNAM( TPEXSEGFILE, 'NAM_LATZ_EDFLX', GFOUND )
+  IF (GFOUND) READ(UNIT=ILUSEG,NML=NAM_LATZ_EDFLX)
+  CALL POSNAM( TPEXSEGFILE, 'NAM_BLOWSNOW', GFOUND )
+  IF (GFOUND) READ(UNIT=ILUSEG,NML=NAM_BLOWSNOW)
+  CALL POSNAM( TPEXSEGFILE, 'NAM_VISC', GFOUND )
+  IF (GFOUND) READ(UNIT=ILUSEG,NML=NAM_VISC)
+
+  CALL POSNAM( TPEXSEGFILE, 'NAM_FLYERS', GFOUND )
+  IF (GFOUND) READ(UNIT=ILUSEG,NML=NAM_FLYERS)
+
+  IF ( NAIRCRAFTS > 0 ) THEN
+    CALL AIRCRAFTS_NML_ALLOCATE( NAIRCRAFTS )
+    CALL POSNAM( TPEXSEGFILE, 'NAM_AIRCRAFTS', GFOUND )
+    IF (GFOUND) READ(UNIT=ILUSEG,NML=NAM_AIRCRAFTS)
+  END IF
+
+  IF ( NBALLOONS > 0 ) THEN
+    CALL BALLOONS_NML_ALLOCATE( NBALLOONS )
+    CALL POSNAM( TPEXSEGFILE, 'NAM_BALLOONS', GFOUND )
+    IF (GFOUND) READ(UNIT=ILUSEG,NML=NAM_BALLOONS)
+  END IF
+END IF
+!
+!-------------------------------------------------------------------------------
+!
+CALL TEST_NAM_VAR(ILUOUT,'CPRESOPT',CPRESOPT,'RICHA','CGRAD','CRESI','ZRESI')
+!
+CALL TEST_NAM_VAR(ILUOUT,'CUVW_ADV_SCHEME',CUVW_ADV_SCHEME, &
+       'CEN4TH','CEN2ND','WENO_K' ) 
+CALL TEST_NAM_VAR(ILUOUT,'CMET_ADV_SCHEME',CMET_ADV_SCHEME, &
+      &'PPM_00','PPM_01','PPM_02')
+CALL TEST_NAM_VAR(ILUOUT,'CSV_ADV_SCHEME',CSV_ADV_SCHEME,   &
+      &'PPM_00','PPM_01','PPM_02')
+CALL TEST_NAM_VAR(ILUOUT,'CTEMP_SCHEME',CTEMP_SCHEME,       &
+  &'RK11','RK21','RK33','RKC4','RK53','RK4B','RK62','RK65','NP32','SP32','LEFR')
+!
+CALL TEST_NAM_VAR(ILUOUT,'CTURB',CTURB,'NONE','TKEL')
+CALL TEST_NAM_VAR(ILUOUT,'CRAD',CRAD,'NONE','FIXE','ECMW',&
+#ifdef MNH_ECRAD
+                 'ECRA',&
+#endif
+                 'TOPA')
+CALL TEST_NAM_VAR(ILUOUT,'CCLOUD',CCLOUD,'NONE','REVE','KESS',  &
+      & 'ICE3','ICE4','C2R2','C3R5','KHKO','LIMA')
+CALL TEST_NAM_VAR(ILUOUT,'CDCONV',CDCONV,'NONE','KAFR')
+CALL TEST_NAM_VAR(ILUOUT,'CSCONV',CSCONV,'NONE','KAFR','EDKF')
+CALL TEST_NAM_VAR(ILUOUT,'CELEC',CELEC,'NONE','ELE3','ELE4')
+!
+CALL TEST_NAM_VAR(ILUOUT,'CAER',CAER,'TANR','TEGE','SURF','NONE')
+CALL TEST_NAM_VAR(ILUOUT,'CAOP',CAOP,'CLIM','EXPL')
+CALL TEST_NAM_VAR(ILUOUT,'CLW',CLW,'RRTM','MORC')
+CALL TEST_NAM_VAR(ILUOUT,'CEFRADL',CEFRADL,'PRES','OCLN','MART','C2R2','LIMA')
+CALL TEST_NAM_VAR(ILUOUT,'CEFRADI',CEFRADI,'FX40','LIOU','SURI','C3R5','LIMA')
+CALL TEST_NAM_VAR(ILUOUT,'COPWLW',COPWLW,'SAVI','SMSH','LILI','MALA')
+CALL TEST_NAM_VAR(ILUOUT,'COPILW',COPILW,'FULI','EBCU','SMSH','FU98')
+CALL TEST_NAM_VAR(ILUOUT,'COPWSW',COPWSW,'SLIN','FOUQ','MALA')
+CALL TEST_NAM_VAR(ILUOUT,'COPISW',COPISW,'FULI','EBCU','FU96')
+!
+CALL TEST_NAM_VAR(ILUOUT,'CLBCX(1)',CLBCX(1),'CYCL','WALL','OPEN')
+CALL TEST_NAM_VAR(ILUOUT,'CLBCX(2)',CLBCX(2),'CYCL','WALL','OPEN')
+CALL TEST_NAM_VAR(ILUOUT,'CLBCY(1)',CLBCY(1),'CYCL','WALL','OPEN')
+CALL TEST_NAM_VAR(ILUOUT,'CLBCY(2)',CLBCY(2),'CYCL','WALL','OPEN')
+!
+CALL TURBN_INIT(CPROGRAM, TPEXSEGFILE, .FALSE., ILUOUT, .FALSE., .FALSE., .TRUE., 0)
+CALL NEBN_INIT(CPROGRAM, TPEXSEGFILE, .FALSE., ILUOUT, .FALSE., .FALSE., .TRUE., 0)
+!
+CALL TEST_NAM_VAR(ILUOUT,'CCH_TDISCRETIZATION',CCH_TDISCRETIZATION, &
+                 'SPLIT     ','CENTER    ','LAGGED    ')
+!
+CALL TEST_NAM_VAR(ILUOUT,'CCONF',CCONF,'START','RESTA')
+CALL TEST_NAM_VAR(ILUOUT,'CEQNSYS',CEQNSYS,'LHE','DUR','MAE')
+CALL TEST_NAM_VAR(ILUOUT,'CSPLIT',CSPLIT,'BSPLITTING','XSPLITTING','YSPLITTING')
+!
+CALL TEST_NAM_VAR(ILUOUT,'CBUTYPE',CBUTYPE,'NONE','CART','MASK')
+!
+CALL TEST_NAM_VAR(ILUOUT,'CRELAX_HEIGHT_TYPE',CRELAX_HEIGHT_TYPE,'FIXE','THGR')
+!
+CALL TEST_NAM_VAR(ILUOUT,'CLES_NORM_TYPE',CLES_NORM_TYPE,'NONE','CONV','EKMA','MOBU')
+CALL TEST_NAM_VAR(ILUOUT,'CBL_HEIGHT_DEF',CBL_HEIGHT_DEF,'TKE','KE','WTV','FRI','DTH')
+CALL TEST_NAM_VAR(ILUOUT,'CTURBLEN_CLOUD',CTURBLEN_CLOUD,'NONE','DEAR','DELT','BL89')
+!
+!   The test on the mass flux scheme for shallow convection
+!
+CALL PARAM_MFSHALLN_INIT(CPROGRAM, TPEXSEGFILE, .FALSE., ILUOUT, .FALSE., .FALSE., .TRUE., 0)
+!
+!   The test on the CSOLVER name is made elsewhere
+!
+CALL PARAM_ICEN_INIT(CPROGRAM, TPEXSEGFILE, .FALSE., ILUOUT, .FALSE., .FALSE., .TRUE., 0)
+IF( CCLOUD == 'C3R5' ) THEN
+  CALL TEST_NAM_VAR(ILUOUT,'CPRISTINE_ICE_C1R3',CPRISTINE_ICE_C1R3, &
+                                                'PLAT','COLU','BURO')
+  CALL TEST_NAM_VAR(ILUOUT,'CHEVRIMED_ICE_C1R3',CHEVRIMED_ICE_C1R3, &
+                                                'GRAU','HAIL')
+END IF
+!
+IF( CCLOUD == 'LIMA' ) THEN
+  CALL PARAM_LIMA_INIT(CPROGRAM, TPEXSEGFILE, .FALSE., ILUOUT, .FALSE., .FALSE., .TRUE., 0)
+END IF
+! Blaze
+CALL UPDATE_NAM_FIREn
+IF (LBLAZE) THEN
+  ! Blaze is only allowed on finer model(s)
+  DO JI = 1, NMODEL
+    IF ( JI /= KMI .AND. NDAD(JI) == KMI ) THEN
+      WRITE( YMODEL, '( I3 )' ) JI
+      CMNHMSG(1) = 'Blaze fire model only allowed on finer model'
+      CMNHMSG(2) = '=> disabled on model ' // YMODEL
+      CALL PRINT_MSG( NVERB_WARNING, 'GEN', 'READ_EXSEG_n' )
+      LBLAZE = .FALSE.
+    END IF
+  END DO
+  CALL TEST_NAM_VAR(ILUOUT,'CPROPAG_MODEL',CPROPAG_MODEL,'SANTONI2011')
+  CALL TEST_NAM_VAR(ILUOUT,'CHEAT_FLUX_MODEL',CHEAT_FLUX_MODEL,'CST','EXP','EXS')
+  CALL TEST_NAM_VAR(ILUOUT,'CLATENT_FLUX_MODEL',CLATENT_FLUX_MODEL,'CST','EXP')
+  CALL TEST_NAM_VAR(ILUOUT,'CFIRE_CPL_MODE',CFIRE_CPL_MODE,'2WAYCPL','FIR2ATM','ATM2FIR')
+  CALL TEST_NAM_VAR(ILUOUT,'CWINDFILTER',CWINDFILTER,'EWAM','WLIM')
+END IF
+!
+IF(LBLOWSNOW) THEN
+       CALL TEST_NAM_VAR(ILUOUT,'CSNOWSEDIM',CSNOWSEDIM,'NONE','MITC','CARR','TABC')
+       IF (XALPHA_SNOW .NE. 3 .AND. CSNOWSEDIM=='TABC') THEN
+         WRITE(ILUOUT,*) '*****************************************'
+         WRITE(ILUOUT,*) '* XALPHA_SNW must be set to 3 when                '
+         WRITE(ILUOUT,*) '* CSNOWSEDIM = TABC                                 '
+         WRITE(ILUOUT,*) '* Update the look-up table in BLOWSNOW_SEDIM_LKT1D    '
+         WRITE(ILUOUT,*) '* to use TABC with a different value of XEMIALPHA_SNW'
+         WRITE(ILUOUT,*) '*****************************************'
+         !callabortstop
+         CALL PRINT_MSG(NVERB_FATAL,'GEN','READ_EXSEG_n','')
+       ENDIF
+END IF
+! Consistency checks between phyex modules
+IF ((CSUBG_AUCV_RC == 'ADJU' .OR. CSUBG_AUCV_RI == 'ADJU') .AND. CCONDENS /= 'GAUS') THEN 
+  CALL PRINT_MSG(NVERB_FATAL, 'GEN', 'READ_EXSEGN', & 
+                &"CSUBG_AUCV_RC and/or CSUBG_AUCV_RI cannot be 'ADJU' if CCONDENS is not 'GAUS'") 
+ENDIF
+IF (.NOT. LHARAT .AND. LSTATNW) THEN
+  CALL PRINT_MSG(NVERB_FATAL, 'GEN', 'READ_EXSEGN', &
+                &'LSTATNW only tested in combination with HARATU and EDMFm!')
+ENDIF
+!
+!-------------------------------------------------------------------------------!
+!*       2.    FIRST INITIALIZATIONS
+!              ---------------------
+!
+!*       2.1   Time step in gridnesting case
+!
+IF (KMI /= 1 .AND. NDAD(KMI) /= KMI)  THEN
+  XTSTEP = PTSTEP_ALL(NDAD(KMI)) / NDTRATIO(KMI)
+END IF
+PTSTEP_ALL(KMI) = XTSTEP
+!
+!*       2.2    Fill the global configuration module 
+!
+! Check coherence between the microphysical scheme and water species and 
+!initialize the logicals LUSERn 
+!
+SELECT CASE ( CCLOUD )
+  CASE ( 'NONE' )
+    IF (.NOT. ( (.NOT. LUSERC) .AND. (.NOT. LUSERR) .AND. (.NOT. LUSERI) .AND. &
+                (.NOT. LUSERS) .AND. (.NOT. LUSERG) .AND. (.NOT. LUSERH)       &
+              ) .AND. CPROGRAM=='MESONH' )  THEN
+!
+      LUSERC=.FALSE.
+      LUSERR=.FALSE.; LUSERI=.FALSE.
+      LUSERS=.FALSE.; LUSERG=.FALSE. 
+      LUSERH=.FALSE.
+!
+    END IF
+!
+    IF (CSUBG_AUCV_RC == 'SIGM')  THEN
+!
+      WRITE(UNIT=ILUOUT,FMT=9002) KMI
+      WRITE(UNIT=ILUOUT,FMT=*) 'YOU WANT TO USE THE SUBGRID AUTOCONVERSION SCHEME '                                         
+      WRITE(UNIT=ILUOUT,FMT=*) ' WITHOUT MICROPHYSICS'                         
+      WRITE(UNIT=ILUOUT,FMT=*) ' CSUBG_AUCV IS PUT TO "NONE"'                            
+!
+      CSUBG_AUCV_RC = 'NONE'
+!
+    END IF
+!
+  CASE ( 'REVE' ) 
+    IF (.NOT. ( LUSERV .AND. LUSERC .AND. (.NOT. LUSERR) .AND. (.NOT. LUSERI) &
+               .AND. (.NOT. LUSERS) .AND. (.NOT. LUSERG) .AND. (.NOT. LUSERH) &
+              ) )  THEN
+!
+      WRITE(UNIT=ILUOUT,FMT=9002) KMI
+      WRITE(UNIT=ILUOUT,FMT='("YOU WANT TO USE A REVERSIBLE MICROPHYSICAL "   ,&
+      &" SCHEME. YOU WILL ONLY HAVE VAPOR AND CLOUD WATER ",/,                 &
+      &" LUSERV AND LUSERC ARE TO TRUE AND THE OTHERS TO FALSE ")') 
+!
+      LUSERV=.TRUE. ; LUSERC=.TRUE.
+      LUSERR=.FALSE.; LUSERI=.FALSE.
+      LUSERS=.FALSE.; LUSERG=.FALSE. 
+      LUSERH=.FALSE.
+    END IF
+!
+    IF (CSUBG_AUCV_RC == 'SIGM')  THEN
+!
+      WRITE(UNIT=ILUOUT,FMT=9003) KMI
+      WRITE(UNIT=ILUOUT,FMT=*) 'YOU WANT TO USE BOTH A REVERSIBLE MICROPHYSICAL SCHEME '
+      WRITE(UNIT=ILUOUT,FMT=*) ' AND THE SUBGRID AUTOCONVERSION SCHEME '       
+      WRITE(UNIT=ILUOUT,FMT=*) 'BUT YOU DO NOT HAVE RAIN in the "REVE" SCHEME'
+      WRITE(UNIT=ILUOUT,FMT=*) ' CSUBG_AUCV_RC IS PUT TO "NONE"'                            
+!
+      CSUBG_AUCV_RC = 'NONE'
+!
+    END IF
+!
+  CASE ( 'KESS' )
+    IF (.NOT. ( LUSERV .AND. LUSERC .AND. LUSERR .AND. (.NOT. LUSERI) .AND. &
+              (.NOT. LUSERS) .AND. (.NOT. LUSERG) .AND. (.NOT. LUSERH)      &
+              ) )  THEN
+!
+      WRITE(UNIT=ILUOUT,FMT=9002) KMI
+      WRITE(UNIT=ILUOUT,FMT='("YOU WANT TO USE A KESSLER MICROPHYSICAL "   , &
+      &" SCHEME. YOU WILL ONLY HAVE VAPOR, CLOUD WATER AND RAIN ",/,           &
+      &" LUSERV, LUSERC AND LUSERR ARE SET TO TRUE AND THE OTHERS TO FALSE ")') 
+!
+      LUSERV=.TRUE. ; LUSERC=.TRUE. ; LUSERR=.TRUE.
+      LUSERI=.FALSE.; LUSERS=.FALSE.
+      LUSERG=.FALSE.; LUSERH=.FALSE.
+    END IF
+!
+    IF (CSUBG_AUCV_RC == 'SIGM')  THEN
+!
+      WRITE(UNIT=ILUOUT,FMT=9003) KMI
+      WRITE(UNIT=ILUOUT,FMT=*) 'YOU WANT TO USE BOTH A KESSLER MICROPHYSICAL SCHEME '
+      WRITE(UNIT=ILUOUT,FMT=*) ' AND THE SUBGRID AUTOCONVERSION SCHEME USING'
+      WRITE(UNIT=ILUOUT,FMT=*) 'SIGMA_RC.'
+      WRITE(UNIT=ILUOUT,FMT=*) 'THIS IS NOT YET AVAILABLE.'
+      WRITE(UNIT=ILUOUT,FMT=*) 'SET CSUBG_AUCV_RC TO "CLFR" or "NONE"  OR CCLOUD TO "ICE3"'
+!
+ !callabortstop
+      CALL PRINT_MSG(NVERB_FATAL,'GEN','READ_EXSEG_n','')
+    END IF
+!
+  CASE ( 'ICE3' )
+    IF (.NOT. ( LUSERV .AND. LUSERC .AND. LUSERR .AND. LUSERI .AND. LUSECI &
+                       .AND. LUSERS .AND. LUSERG .AND. (.NOT. LUSERH))     &
+                .AND. CPROGRAM=='MESONH' )  THEN
+      !
+      WRITE(UNIT=ILUOUT,FMT=9002) KMI
+      WRITE(UNIT=ILUOUT,FMT=*) 'YOU WANT TO USE THE ice3 SIMPLE MIXED PHASE'
+      WRITE(UNIT=ILUOUT,FMT=*) 'MICROPHYSICAL SCHEME. YOU WILL ONLY HAVE VAPOR, CLOUD WATER,'
+      WRITE(UNIT=ILUOUT,FMT=*) 'RAIN WATER, CLOUD ICE (MIXING RATIO AND CONCENTRATION)'
+      WRITE(UNIT=ILUOUT,FMT=*) 'SNOW-AGGREGATES AND GRAUPELN.'
+      WRITE(UNIT=ILUOUT,FMT=*) 'LUSERV,LUSERC,LUSERR,LUSERI,LUSECI,LUSERS,LUSERG ARE SET TO TRUE'
+      WRITE(UNIT=ILUOUT,FMT=*) 'AND LUSERH TO FALSE'
+!
+      LUSERV=.TRUE. ; LUSERC=.TRUE. ; LUSERR=.TRUE.
+      LUSERI=.TRUE. ; LUSECI=.TRUE.
+      LUSERS=.TRUE. ; LUSERG=.TRUE. 
+      LUSERH=.FALSE.
+    END IF    
+!
+    IF (CSUBG_AUCV_RC == 'SIGM' .AND. .NOT. LSUBG_COND)  THEN
+      WRITE(UNIT=ILUOUT,FMT=9002) KMI
+      WRITE(UNIT=ILUOUT,FMT=*) 'YOU WANT TO USE SUBGRID AUTOCONVERSION SCHEME'
+      WRITE(UNIT=ILUOUT,FMT=*) ' WITHOUT THE SUBGRID CONDENSATION SCHEME.'
+      WRITE(UNIT=ILUOUT,FMT=*) 'THIS IS NOT ALLOWED: CSUBG_AUCV_RC is SET to NONE' 
+      CSUBG_AUCV_RC='NONE' 
+    END IF
+!
+    IF (CSUBG_AUCV_RC == 'CLFR' .AND. CSCONV /= 'EDKF')  THEN
+      WRITE(UNIT=ILUOUT,FMT=9002) KMI
+      WRITE(UNIT=ILUOUT,FMT=*) 'YOU WANT TO USE SUBGRID AUTOCONVERSION SCHEME'
+      WRITE(UNIT=ILUOUT,FMT=*) 'WITH THE CONVECTIVE CLOUD FRACTION WITHOUT EDKF'
+      WRITE(UNIT=ILUOUT,FMT=*) 'THIS IS NOT ALLOWED: CSUBG_AUCV_RC is SET to NONE' 
+      CSUBG_AUCV_RC='NONE' 
+    END IF
+!
+  CASE ( 'ICE4' )
+    IF (.NOT. ( LUSERV .AND. LUSERC .AND. LUSERR .AND. LUSERI .AND. LUSECI &
+                       .AND. LUSERS .AND. LUSERG .AND. LUSERH)             &
+                .AND. CPROGRAM=='MESONH' )  THEN
+      !
+      WRITE(UNIT=ILUOUT,FMT=9002) KMI
+      WRITE(UNIT=ILUOUT,FMT=*) 'YOU WANT TO USE THE ice4 SIMPLE MIXED PHASE'
+      WRITE(UNIT=ILUOUT,FMT=*) 'MICROPHYSICAL SCHEME. YOU WILL ONLY HAVE VAPOR, CLOUD WATER,'
+      WRITE(UNIT=ILUOUT,FMT=*) 'RAIN WATER, CLOUD ICE (MIXING RATIO AND CONCENTRATION)'
+      WRITE(UNIT=ILUOUT,FMT=*) 'SNOW-AGGREGATES, GRAUPELN AND HAILSTONES.'
+      WRITE(UNIT=ILUOUT,FMT=*) 'LUSERV,LUSERC,LUSERR,LUSERI,LUSECI,LUSERS,LUSERG'
+      WRITE(UNIT=ILUOUT,FMT=*) 'AND LUSERH ARE SET TO TRUE'
+!
+      LUSERV=.TRUE. ; LUSERC=.TRUE. ; LUSERR=.TRUE.
+      LUSERI=.TRUE. ; LUSECI=.TRUE.
+      LUSERS=.TRUE. ; LUSERG=.TRUE. ; LUSERH=.TRUE.
+    END IF
+!
+    IF (CSUBG_AUCV_RC /= 'NONE' .AND. .NOT. LSUBG_COND)  THEN
+      WRITE(UNIT=ILUOUT,FMT=9002) KMI
+      WRITE(UNIT=ILUOUT,FMT=*) 'YOU WANT TO USE SUBGRID AUTOCONVERSION SCHEME'
+      WRITE(UNIT=ILUOUT,FMT=*) ' WITHOUT THE SUBGRID CONDENSATION SCHEME.'
+      WRITE(UNIT=ILUOUT,FMT=*) 'THIS IS NOT ALLOWED: CSUBG_AUCV_RC is SET to NONE' 
+      CSUBG_AUCV_RC='NONE' 
+    END IF
+!
+  CASE ( 'C2R2','C3R5', 'KHKO' )
+    IF (( EPARAM_CCN == 'XXX') .OR. (EINI_CCN  == 'XXX')) THEN
+          WRITE(UNIT=ILUOUT,FMT='("YOU WANT TO USE A 2-MOMENT MICROPHYSICAL ",    &
+         &" SCHEME BUT YOU DIDNT FILL CORRECTLY NAM_PARAM_C2R2", &
+         &" YOU HAVE TO FILL HPARAM_CCN and HINI_CCN ")')
+ !callabortstop
+        CALL PRINT_MSG(NVERB_FATAL,'GEN','READ_EXSEG_n','')
+    END IF
+    IF (HCLOUD == 'NONE') THEN
+      CGETCLOUD = 'SKIP'
+    ELSE IF (HCLOUD == 'REVE' ) THEN
+      CGETCLOUD = 'INI1'
+    ELSE IF (HCLOUD == 'KESS' ) THEN
+      CGETCLOUD = 'INI2'
+    ELSE IF (HCLOUD == 'ICE3' ) THEN
+      IF (CCLOUD == 'C3R5') THEN
+        CGETCLOUD = 'INI2'
+      ELSE
+        WRITE(UNIT=ILUOUT,FMT=9003) KMI
+        WRITE(UNIT=ILUOUT,FMT='("YOU WANT TO USE THE WARM MICROPHYSICAL ",    &
+        &" SCHEME BUT YOU WERE USING THE ICE3 SCHEME PREVIOUSLY.",/,          &
+        &" AS THIS IS A LITTLE BIT STUPID IT IS NOT AUTHORIZED !!!")')
+ !callabortstop
+        CALL PRINT_MSG(NVERB_FATAL,'GEN','READ_EXSEG_n','')
+      END IF
+    ELSE
+      CGETCLOUD = 'READ' ! This is automatically done
+    END IF
+!
+    IF ((CCLOUD == 'C2R2' ).OR. (CCLOUD == 'KHKO' )) THEN
+      IF (.NOT. ( LUSERV .AND. LUSERC .AND. LUSERR .AND. (.NOT. LUSERI) .AND. &
+                (.NOT. LUSERS) .AND. (.NOT. LUSERG) .AND. (.NOT. LUSERH)      &
+                ) )  THEN
+        WRITE(UNIT=ILUOUT,FMT=9002) KMI
+        WRITE(UNIT=ILUOUT,FMT='("YOU WANT TO USE THE C2R2 MICROPHYSICAL ",    &
+        &" SCHEME. YOU WILL ONLY HAVE VAPOR, CLOUD WATER AND RAIN ",/,        &
+        &"LUSERV, LUSERC AND LUSERR ARE SET TO TRUE AND THE OTHERS TO FALSE ")')
+!
+        LUSERV=.TRUE. ; LUSERC=.TRUE. ; LUSERR=.TRUE.
+        LUSERI=.FALSE.; LUSERS=.FALSE.
+        LUSERG=.FALSE.; LUSERH=.FALSE.
+      END IF
+    ELSE IF (CCLOUD == 'C3R5') THEN
+      IF (.NOT. ( LUSERV .AND. LUSERC .AND. LUSERR .AND. LUSERI .AND. &
+                  LUSERS .AND. LUSERG .AND. (.NOT. LUSERH)            &
+                ) )  THEN
+        WRITE(UNIT=ILUOUT,FMT=9002) KMI
+        WRITE(UNIT=ILUOUT,FMT='("YOU WANT TO USE THE C3R5 MICROPHYS. SCHEME.",&
+        &" YOU WILL HAVE VAPOR, CLOUD WATER/ICE, RAIN, SNOW AND GRAUPEL ",/,  &
+        &"LUSERV, LUSERC, LUSERR, LUSERI, LUSERS, LUSERG ARE SET TO TRUE")' )
+!
+        LUSERV=.TRUE. ; LUSERC=.TRUE. ; LUSERR=.TRUE.
+        LUSERI=.TRUE. ; LUSECI=.TRUE.
+        LUSERS=.TRUE. ; LUSERG=.TRUE.
+        LUSERH=.FALSE.
+      END IF
+    ELSE IF (CCLOUD == 'LIMA') THEN
+      IF (.NOT. ( LUSERV .AND. LUSERC .AND. LUSERR .AND. LUSERI .AND. &
+                  LUSERS .AND. LUSERG .AND. (.NOT. LUSERH)            &
+                ) )  THEN
+        WRITE(UNIT=ILUOUT,FMT=9002) KMI
+        WRITE(UNIT=ILUOUT,FMT='("YOU WANT TO USE THE LIMA MICROPHYS. SCHEME.",&
+        &" YOU WILL HAVE VAPOR, CLOUD WATER/ICE, RAIN, SNOW AND GRAUPEL ",/,  &
+        &"LUSERV, LUSERC, LUSERR, LUSERI, LUSERS, LUSERG ARE SET TO TRUE")' )
+!
+        LUSERV=.TRUE. ; LUSERC=.TRUE. ; LUSERR=.TRUE.
+        LUSERI=.TRUE. ; LUSECI=.TRUE.        
+        LUSERS=.TRUE. ; LUSERG=.TRUE. 
+        LUSERH=.FALSE.
+      END IF
+    END IF
+!
+    IF (LSUBG_COND)  THEN
+      WRITE(UNIT=ILUOUT,FMT=9003) KMI
+      WRITE(UNIT=ILUOUT,FMT=*) 'YOU WANT TO USE BOTH THE SIMPLE MIXED PHASE'
+      WRITE(UNIT=ILUOUT,FMT=*) 'MICROPHYS. SCHEME AND THE SUBGRID COND. SCHEME.'
+      WRITE(UNIT=ILUOUT,FMT=*) 'THIS IS NOT YET AVAILABLE.'
+      WRITE(UNIT=ILUOUT,FMT=*) 'SET LSUBG_COND TO FALSE OR CCLOUD TO "REVE", "KESS"' 
+ !callabortstop
+      CALL PRINT_MSG(NVERB_FATAL,'GEN','READ_EXSEG_n','')
+    END IF
+!
+    IF ( CEFRADL /= 'C2R2') THEN
+      WRITE(UNIT=ILUOUT,FMT=9001) KMI
+      WRITE(UNIT=ILUOUT,FMT=*) ' YOU DID NOT CHOOSE CEFRADL=C2R2 FOR RADIATION'
+      WRITE(UNIT=ILUOUT,FMT=*) ' IT IS ADVISED TO USE CEFRADL=C2R2 '                       
+      WRITE(UNIT=ILUOUT,FMT=*) ' WITH A 2-MOMENT MICROPHYSICAL SCHEME'                     
+    END IF
+!
+    IF ( CCLOUD == 'C3R5' .AND. CEFRADI /= 'C3R5') THEN
+      WRITE(UNIT=ILUOUT,FMT=9001) KMI
+      WRITE(UNIT=ILUOUT,FMT=*) ' YOU DID NOT CHOOSE CEFRADI=C3R5 FOR RADIATION'
+      WRITE(UNIT=ILUOUT,FMT=*) ' IT IS ADVISED TO USE CEFRADI=C3R5 '                       
+      WRITE(UNIT=ILUOUT,FMT=*) ' WITH A 2-MOMENT MICROPHYSICAL SCHEME'                     
+    END IF
+!
+   IF ( WALPHAC /= 3.0 .OR. WNUC /= 2.0) THEN
+      WRITE(UNIT=ILUOUT,FMT=9001) KMI
+      WRITE(UNIT=ILUOUT,FMT=*) 'IT IS ADVISED TO USE XALPHAC=3. and XNUC=2.'
+      WRITE(UNIT=ILUOUT,FMT=*) 'FOR STRATOCUMULUS WITH KHKO SCHEME. '
+   END IF
+!
+   IF ( CEFRADL /= 'C2R2') THEN
+      WRITE(UNIT=ILUOUT,FMT=9001) KMI
+      WRITE(UNIT=ILUOUT,FMT=*) ' YOU DID NOT CHOOSE CEFRADL=C2R2 FOR RADIATION'
+      WRITE(UNIT=ILUOUT,FMT=*) ' IT IS ADVISED TO USE CEFRADL=C2R2 '   
+      WRITE(UNIT=ILUOUT,FMT=*) ' WITH A 2-MOMENT MICROPHYSICAL SCHEME'
+   END IF
+!
+  CASE ( 'LIMA')
+    IF (HCLOUD == 'NONE') THEN
+      CGETCLOUD = 'SKIP'
+    ELSE IF (HCLOUD == 'REVE' ) THEN
+      CGETCLOUD = 'INI1'
+    ELSE IF (HCLOUD == 'KESS' ) THEN
+      CGETCLOUD = 'INI2'
+    ELSE IF (HCLOUD == 'ICE3' ) THEN
+      CGETCLOUD = 'INI2'
+    ELSE
+      CGETCLOUD = 'READ' ! This is automatically done
+    END IF
+!
+    IF (NMOM_C.GE.1) THEN
+      LUSERV=.TRUE. ; LUSERC=.TRUE. ; LUSERR=.TRUE.
+      LUSERI=.FALSE.; LUSERS=.FALSE. ; LUSERG=.FALSE.; LUSERH=.FALSE.
+    END IF
+!
+    IF (NMOM_I.GE.1) THEN
+      LUSERV=.TRUE. ; LUSERC=.TRUE. ; LUSERR=.TRUE.
+      LUSERI=.TRUE. ; LUSERS=.TRUE. ; LUSERG=.TRUE.
+      LUSERH= NMOM_H.GE.1
+    END IF
+    !
+    IF (LSPRO) LADJ=.FALSE.
+    IF (.NOT.LPTSPLIT) THEN
+       IF (NMOM_C==1) NMOM_C=2
+       IF (NMOM_R==1) NMOM_R=2
+       IF (NMOM_I==1) NMOM_I=2
+       IF (NMOM_S==2 .OR. NMOM_G==2 .OR. NMOM_H==2) THEN
+          NMOM_S=2
+          NMOM_G=2
+          IF (NMOM_H.GE.1) NMOM_H=2
+       END IF
+    END IF
+!
+    IF (LSUBG_COND .AND. (.NOT. LPTSPLIT)) THEN
+      WRITE(UNIT=ILUOUT,FMT=9001) KMI
+      WRITE(UNIT=ILUOUT,FMT=*) 'YOU MUST USE LPTSPLIT=T with CCLOUD=LIMA'
+      WRITE(UNIT=ILUOUT,FMT=*) 'AND LSUBG_COND '
+      CALL PRINT_MSG(NVERB_FATAL,'GEN','READ_EXSEG_n','use LPTSPLIT=T with LIMA and LSUBG_COND=T')
+    END IF
+!
+    IF (LSUBG_COND .AND. (.NOT. LADJ)) THEN
+      WRITE(UNIT=ILUOUT,FMT=9001) KMI
+      WRITE(UNIT=ILUOUT,FMT=*) 'YOU MUST USE LADJ=T with CCLOUD=LIMA'
+      WRITE(UNIT=ILUOUT,FMT=*) 'AND LSUBG_COND '
+      CALL PRINT_MSG(NVERB_FATAL,'GEN','READ_EXSEG_n','use LADJ=T with LIMA and LSUBG_COND=T')
+    END IF
+!    
+    IF ( LKHKO .AND. (XALPHAC /= 3.0 .OR. XNUC /= 2.0) ) THEN
+      WRITE(UNIT=ILUOUT,FMT=9001) KMI
+      WRITE(UNIT=ILUOUT,FMT=*) 'IT IS ADVISED TO USE XALPHAC=3. and XNUC=2.'
+      WRITE(UNIT=ILUOUT,FMT=*) 'FOR STRATOCUMULUS. '
+    END IF
+!
+    IF ( CEFRADL /= 'LIMA') THEN
+      WRITE(UNIT=ILUOUT,FMT=9001) KMI
+      WRITE(UNIT=ILUOUT,FMT=*) ' YOU DID NOT CHOOSE CEFRADL=LIMA FOR RADIATION'
+      WRITE(UNIT=ILUOUT,FMT=*) ' IT IS ADVISED TO USE CEFRADL=LIMA '
+      WRITE(UNIT=ILUOUT,FMT=*) ' WITH A 2-MOMENT MICROPHYSICAL SCHEME "LIMA"'
+    END IF
+!
+END SELECT
+!
+LUSERV_G(KMI) = LUSERV
+LUSERC_G(KMI) = LUSERC
+LUSERR_G(KMI) = LUSERR
+LUSERI_G(KMI) = LUSERI
+LUSERS_G(KMI) = LUSERS
+LUSERG_G(KMI) = LUSERG
+LUSERH_G(KMI) = LUSERH
+LUSETKE(KMI) = (CTURB /= 'NONE')
+!
+!-------------------------------------------------------------------------------
+!
+!*       2.3     Chemical and NSV_* variables initializations
+!
+CALL UPDATE_NAM_IBM_PARAMN
+CALL UPDATE_NAM_RECYCL_PARAMN
+CALL UPDATE_NAM_PARAMN
+CALL UPDATE_NAM_DYNN
+CALL UPDATE_NAM_CONFN
+!
+IF (LORILAM .AND. .NOT. LUSECHEM) THEN
+  WRITE(UNIT=ILUOUT,FMT=9002) KMI
+  WRITE(ILUOUT,FMT=*) 'YOU CANNOT USE ORILAM AEROSOL SCHEME WITHOUT  '
+  WRITE(ILUOUT,FMT=*) 'CHEMICAL GASEOUS CHEMISTRY                    '
+  WRITE(ILUOUT,FMT=*) 'THEREFORE LUSECHEM IS SET TO TRUE    '
+  LUSECHEM=.TRUE.
+END IF
+!
+IF (LUSECHAQ.AND.(.NOT.LUSECHEM))  THEN
+  WRITE(UNIT=ILUOUT,FMT=9003) KMI
+  WRITE(UNIT=ILUOUT,FMT=*) 'YOU WANT TO USE AQUEOUS PHASE CHEMISTRY'
+  WRITE(UNIT=ILUOUT,FMT=*) 'BUT THE CHEMISTRY IS NOT ACTIVATED'
+  WRITE(UNIT=ILUOUT,FMT=*) 'SET LUSECHEM TO TRUE IF YOU WANT REALLY USE CHEMISTRY' 
+  WRITE(UNIT=ILUOUT,FMT=*) 'OR SET LUSECHAQ TO FALSE IF YOU DO NOT WANT USE IT' 
+ !callabortstop
+  CALL PRINT_MSG(NVERB_FATAL,'GEN','READ_EXSEG_n','')
+END IF
+IF (LUSECHAQ.AND.(.NOT.LUSERC).AND.CPROGRAM=='MESONH')  THEN
+  WRITE(UNIT=ILUOUT,FMT=9003) KMI
+  WRITE(UNIT=ILUOUT,FMT=*) 'YOU WANT TO USE AQUEOUS PHASE CHEMISTRY'
+  WRITE(UNIT=ILUOUT,FMT=*) 'BUT CLOUD MICROPHYSICS IS NOT ACTIVATED'
+  WRITE(UNIT=ILUOUT,FMT=*) 'LUSECHAQ IS SET TO FALSE' 
+  LUSECHAQ = .FALSE.
+END IF
+IF (LUSECHAQ.AND.CCLOUD(1:3) == 'ICE'.AND. .NOT. LUSECHIC) THEN
+  WRITE(UNIT=ILUOUT,FMT=9002) KMI
+  WRITE(UNIT=ILUOUT,FMT=*) 'YOU WANT TO USE AQUEOUS PHASE CHEMISTRY'
+  WRITE(UNIT=ILUOUT,FMT=*) 'WITH MIXED PHASE CLOUD MICROPHYSICS'
+  WRITE(UNIT=ILUOUT,FMT=*) 'SET LUSECHIC TO TRUE IF YOU WANT TO ACTIVATE'
+  WRITE(UNIT=ILUOUT,FMT=*) 'ICE PHASE CHEMICAL SPECIES'
+  IF (LCH_RET_ICE) THEN
+    WRITE(UNIT=ILUOUT,FMT=*) 'LCH_RET_ICE TRUE MEANS ALL SOLUBLE'
+    WRITE(UNIT=ILUOUT,FMT=*) 'GASES ARE RETAINED IN ICE PHASE'
+    WRITE(UNIT=ILUOUT,FMT=*) 'WHEN SUPERCOOLED WATER FREEZES'
+  ELSE
+    WRITE(UNIT=ILUOUT,FMT=*) 'LCH_RET_ICE FALSE MEANS ALL SOLUBLE'
+    WRITE(UNIT=ILUOUT,FMT=*) 'GASES GO BACK TO THE GAS PHASE WHEN'
+    WRITE(UNIT=ILUOUT,FMT=*) 'SUPERCOOLED WATER FREEZES'
+  ENDIF
+ENDIF
+IF (LUSECHIC.AND. .NOT. CCLOUD(1:3) == 'ICE'.AND.CPROGRAM=='MESONH') THEN
+  WRITE(UNIT=ILUOUT,FMT=9003) KMI
+  WRITE(UNIT=ILUOUT,FMT=*) 'YOU WANT TO USE ICE PHASE CHEMISTRY'
+  WRITE(UNIT=ILUOUT,FMT=*) 'BUT MIXED PHASE CLOUD MICROPHYSICS IS NOT ACTIVATED'
+  WRITE(UNIT=ILUOUT,FMT=*) 'LUSECHIC IS SET TO FALSE'  
+  LUSECHIC= .FALSE.
+ENDIF
+IF (LCH_PH.AND. (.NOT. LUSECHAQ)) THEN
+  WRITE(UNIT=ILUOUT,FMT=9003) KMI
+  WRITE(UNIT=ILUOUT,FMT=*) 'DIAGNOSTIC PH COMPUTATION IS ACTIVATED'
+  WRITE(UNIT=ILUOUT,FMT=*) 'BUT AQUEOUS PHASE CHEMISTRY IS NOT ACTIVATED'
+  WRITE(UNIT=ILUOUT,FMT=*) 'SET LUSECHAQ TO TRUE IF YOU WANT TO ACTIVATE IT'
+  WRITE(UNIT=ILUOUT,FMT=*) 'LCH_PH IS SET TO FALSE'
+  LCH_PH= .FALSE.
+ENDIF
+IF (LUSECHIC.AND.(.NOT.LUSECHAQ))  THEN
+  WRITE(UNIT=ILUOUT,FMT=9003) KMI
+  WRITE(UNIT=ILUOUT,FMT=*) 'YOU WANT TO USE ICE PHASE CHEMISTRY'
+  WRITE(UNIT=ILUOUT,FMT=*) 'BUT THE AQUEOUS PHASE CHEMISTRY IS NOT ACTIVATED'
+  WRITE(UNIT=ILUOUT,FMT=*) 'SET LUSECHAQ TO TRUE IF YOU WANT REALLY USE CLOUD CHEMISTRY'
+  WRITE(UNIT=ILUOUT,FMT=*) 'OR SET LUSECHIC TO FALSE IF YOU DO NOT WANT USE IT'
+!callabortstop
+  CALL PRINT_MSG(NVERB_FATAL,'GEN','READ_EXSEG_n','')
+END IF
+IF ((LUSECHIC).AND.(LCH_RET_ICE)) THEN
+  WRITE(UNIT=ILUOUT,FMT=9003) KMI
+  WRITE(UNIT=ILUOUT,FMT=*) 'YOU WANT TO USE RETENTION OF SOLUBLE GASES IN ICE'
+  WRITE(UNIT=ILUOUT,FMT=*) 'BUT THE ICE PHASE CHEMISTRY IS ACTIVATED'
+  WRITE(UNIT=ILUOUT,FMT=*) 'FLAG LCH_RET_ICE IS ONLY USES WHEN LUSECHIC IS SET'
+  WRITE(UNIT=ILUOUT,FMT=*) 'TO FALSE IE NO CHEMICAL SPECIES IN ICE' 
+ENDIF
+!
+CALL UPDATE_NAM_CH_MNHCN
+CALL INI_NSV(KMI)
+!
+! From this point, all NSV* variables contain valid values for model KMI
+! 
+DO JSV = 1,NSV
+ LUSESV(JSV,KMI) = .TRUE.
+END DO
+!
+IF ( CAOP=='EXPL' .AND. .NOT.LDUST .AND. .NOT.LORILAM          &
+                  .AND. .NOT.LSALT .AND. .NOT.(CCLOUD=='LIMA') ) THEN
+      WRITE(UNIT=ILUOUT,FMT=9001) KMI
+      WRITE(UNIT=ILUOUT,FMT=*) ' YOU WANT TO USE EXPLICIT AEROSOL OPTICAL '       
+      WRITE(UNIT=ILUOUT,FMT=*) 'PROPERTIES BUT YOU DONT HAVE DUST OR '            
+      WRITE(UNIT=ILUOUT,FMT=*) 'AEROSOL OR SALT THEREFORE CAOP=CLIM'            
+      CAOP='CLIM'
+END IF      
+!-------------------------------------------------------------------------------
+!
+!*       3.    CHECK COHERENCE BETWEEN EXSEG VARIABLES AND FMFILE ATTRIBUTES
+!              -------------------------------------------------------------
+!
+!
+!*       3.1  Turbulence variable 
+!
+IF ((CTURB /= 'NONE').AND.(HTURB == 'NONE')) THEN
+  CGETTKET ='INIT'
+  WRITE(UNIT=ILUOUT,FMT=9001) KMI
+  WRITE(UNIT=ILUOUT,FMT=*)'YOU WANT TO USE TURBULENCE KINETIC ENERGY TKE'
+  WRITE(UNIT=ILUOUT,FMT=*)'WHEREAS IT  IS NOT IN INITIAL FMFILE'
+  WRITE(UNIT=ILUOUT,FMT=*)'TKE WILL BE INITIALIZED TO ZERO'
+ELSE 
+  IF (CTURB /= 'NONE') THEN 
+    CGETTKET ='READ'
+    IF ((CCONF=='START') .AND. CPROGRAM /= 'DIAG') CGETTKET='INIT' 
+  ELSE
+   CGETTKET ='SKIP'
+  END IF
+END IF
+!
+!
+IF ((CTOM == 'TM06').AND.(HTOM /= 'TM06')) THEN
+  CGETBL_DEPTH ='INIT'
+  WRITE(UNIT=ILUOUT,FMT=9001) KMI
+  WRITE(UNIT=ILUOUT,FMT=*)'YOU WANT TO USE BL DEPTH FOR THIRD ORDER MOMENTS'
+  WRITE(UNIT=ILUOUT,FMT=*)'WHEREAS IT IS NOT IN INITIAL FMFILE'
+  WRITE(UNIT=ILUOUT,FMT=*)'IT WILL BE INITIALIZED TO ZERO'
+ELSE 
+  IF (CTOM == 'TM06') THEN 
+    CGETBL_DEPTH ='READ'
+  ELSE 
+    CGETBL_DEPTH ='SKIP'
+  END IF
+END IF
+!
+IF (LRMC01 .AND. .NOT. ORMC01) THEN
+  CGETSBL_DEPTH ='INIT'
+  WRITE(UNIT=ILUOUT,FMT=9001) KMI
+  WRITE(UNIT=ILUOUT,FMT=*)'YOU WANT TO USE SBL DEPTH FOR RMC01'
+  WRITE(UNIT=ILUOUT,FMT=*)'WHEREAS IT IS NOT IN INITIAL FMFILE'
+  WRITE(UNIT=ILUOUT,FMT=*)'IT WILL BE INITIALIZED TO ZERO'
+ELSE 
+  IF (LRMC01) THEN 
+    CGETSBL_DEPTH ='READ'
+  ELSE 
+    CGETSBL_DEPTH ='SKIP'
+  END IF
+END IF
+!
+!
+!*       3.2  Moist  variables 
+!
+IF (LUSERV.AND. (.NOT.OUSERV)) THEN
+  WRITE(UNIT=ILUOUT,FMT=9001) KMI
+  WRITE(UNIT=ILUOUT,FMT='("YOU WANT TO USE VAPOR VARIABLE Rv WHEREAS IT  ", &
+                  & "IS NOT IN INITIAL FMFILE",/,                           &
+                  & "Rv WILL BE INITIALIZED TO ZERO")')
+  CGETRVT='INIT'
+ELSE                                                                
+  IF (LUSERV) THEN
+    CGETRVT='READ'
+  ELSE
+    CGETRVT='SKIP'
+  END IF
+END IF
+!
+IF (LUSERC.AND. (.NOT.OUSERC)) THEN
+  WRITE(UNIT=ILUOUT,FMT=9001) KMI
+  WRITE(UNIT=ILUOUT,FMT='("YOU WANT TO USE CLOUD VARIABLE Rc WHEREAS IT ",  &
+                 &   " IS NOT IN INITIAL FMFILE",/,                        &
+                 &   "Rc WILL BE INITIALIZED TO ZERO")')
+  CGETRCT='INIT'
+ELSE
+  IF (LUSERC) THEN
+    CGETRCT='READ'
+!   IF(CCONF=='START') CGETRCT='INIT' 
+  ELSE
+    CGETRCT='SKIP'
+  END IF
+END IF
+!
+IF (LUSERR.AND. (.NOT.OUSERR)) THEN
+  WRITE(UNIT=ILUOUT,FMT=9001) KMI
+  WRITE(UNIT=ILUOUT,FMT='("YOU WANT TO USE RAIN VARIABLE Rr WHEREAS IT ", &
+                  &  "IS NOT IN INITIAL FMFILE",/,                     &
+                  &  " Rr WILL BE INITIALIZED TO ZERO")')
+ 
+  CGETRRT='INIT'
+ELSE
+  IF (LUSERR) THEN
+    CGETRRT='READ'
+!   IF( (CCONF=='START').AND. CPROGRAM /= 'DIAG') CGETRRT='INIT' 
+  ELSE
+    CGETRRT='SKIP'
+  END IF
+END IF
+!
+IF (LUSERI.AND. (.NOT.OUSERI)) THEN
+  WRITE(UNIT=ILUOUT,FMT=9001) KMI
+  WRITE(UNIT=ILUOUT,FMT='("YOU WANT TO USE ICE VARIABLE Ri WHEREAS IT ", &
+               &    "IS NOT IN INITIAL FMFILE",/,                      &
+               &     " Ri WILL BE INITIALIZED TO ZERO")')
+  CGETRIT='INIT'
+ELSE
+  IF (LUSERI) THEN
+    CGETRIT='READ'
+!   IF(CCONF=='START') CGETRIT='INIT' 
+  ELSE
+    CGETRIT='SKIP'
+  END IF
+END IF
+!
+IF (LUSECI.AND. (.NOT.OUSECI)) THEN
+  WRITE(UNIT=ILUOUT,FMT=9001) KMI
+  WRITE(UNIT=ILUOUT,FMT='("YOU WANT TO USE ICE CONC. VARIABLE Ci WHEREAS IT ",&
+               &          "IS NOT IN INITIAL FMFILE",/,                       &
+               &          "   Ci WILL BE INITIALIZED TO ZERO")')
+  CGETCIT='INIT'
+ELSE
+  IF (LUSECI) THEN
+    CGETCIT='READ'
+  ELSE
+    CGETCIT='SKIP'
+  END IF
+END IF
+!
+IF (LUSERS.AND. (.NOT.OUSERS)) THEN
+  WRITE(UNIT=ILUOUT,FMT=9001) KMI
+  WRITE(UNIT=ILUOUT,FMT='("YOU WANT TO USE SNOW VARIABLE Rs WHEREAS IT ",&
+                  &  "IS NOT IN INITIAL FMFILE",/,                       &
+                  &  " Rs WILL BE INITIALIZED TO ZERO")')
+  CGETRST='INIT'
+ELSE
+  IF (LUSERS) THEN
+    CGETRST='READ'
+!   IF ( (CCONF=='START').AND. CPROGRAM /= 'DIAG') CGETRST='INIT' 
+  ELSE
+    CGETRST='SKIP'
+  END IF
+END IF
+!
+IF (LUSERG.AND. (.NOT.OUSERG)) THEN
+  WRITE(UNIT=ILUOUT,FMT=9001) KMI
+  WRITE(UNIT=ILUOUT,FMT='("YOU WANT TO USE GRAUPEL VARIABLE Rg WHEREAS ",&
+                   & " IT IS NOTIN INITIAL FMFILE",/,                    &
+                   & "Rg WILL BE INITIALIZED TO ZERO")')
+  CGETRGT='INIT'
+ELSE
+  IF (LUSERG) THEN
+    CGETRGT='READ'
+!   IF ( (CCONF=='START') .AND. CPROGRAM /= 'DIAG') CGETRGT='INIT' 
+  ELSE
+    CGETRGT='SKIP'
+  END IF
+END IF
+!
+IF (LUSERH.AND. (.NOT.OUSERH)) THEN
+  WRITE(UNIT=ILUOUT,FMT=9001) KMI
+  WRITE(UNIT=ILUOUT,FMT='("YOU WANT TO USE HAIL VARIABLE Rh WHEREAS",&
+                  &  "IT IS NOT IN INITIAL FMFILE",/,                &
+                  & " Rh WILL BE INITIALIZED TO ZERO")')
+   CGETRHT='INIT'
+ELSE
+  IF (LUSERH) THEN
+    CGETRHT='READ'
+!   IF ( (CCONF=='START') .AND. CPROGRAM /= 'DIAG') CGETRHT='INIT' 
+  ELSE
+    CGETRHT='SKIP'
+  END IF
+END IF
+!
+IF (LUSERC.AND. (.NOT.OUSERC)) THEN
+  WRITE(UNIT=ILUOUT,FMT=9001) KMI
+  WRITE(UNIT=ILUOUT,FMT=*) 'THE CLOUD FRACTION WILL BE INITIALIZED ACCORDING'
+  WRITE(UNIT=ILUOUT,FMT=*) 'TO CLOUD MIXING RATIO VALUE OR SET TO 0'
+  CGETCLDFR = 'INIT'
+ELSE
+  IF ( LUSERC ) THEN
+    CGETCLDFR = 'READ'
+    IF ( (CCONF=='START') .AND. CPROGRAM /= 'DIAG') CGETCLDFR='INIT' 
+  ELSE
+    CGETCLDFR = 'SKIP'
+  END IF
+END IF
+!
+IF (LUSERI.AND. (.NOT.OUSERI)) THEN
+  WRITE(UNIT=ILUOUT,FMT=9001) KMI
+  WRITE(UNIT=ILUOUT,FMT=*) 'THE ICE CLOUD FRACTION WILL BE INITIALIZED ACCORDING'
+  WRITE(UNIT=ILUOUT,FMT=*) 'TO CLOUD MIXING RATIO VALUE OR SET TO 0'
+  CGETICEFR = 'INIT'
+ELSE
+  IF ( LUSERI ) THEN
+    CGETICEFR = 'READ'
+    IF ( (CCONF=='START') .AND. CPROGRAM /= 'DIAG') CGETICEFR='INIT' 
+  ELSE
+    CGETICEFR = 'SKIP'
+  END IF
+END IF
+!
+!
+!*       3.3  Moist turbulence
+!
+IF ( LUSERC .AND. CTURB /= 'NONE' ) THEN
+  IF ( .NOT. (OUSERC .AND. HTURB /= 'NONE') ) THEN
+    WRITE(UNIT=ILUOUT,FMT=9001) KMI
+    WRITE(UNIT=ILUOUT,FMT='("YOU WANT TO USE MOIST TURBULENCE WHEREAS IT ",/, &
+                 &   " WAS NOT THE CASE FOR THE INITIAL FMFILE GENERATION",/, &
+                 &    "SRC AND SIGS ARE INITIALIZED TO 0")')
+    CGETSRCT ='INIT'
+    CGETSIGS ='INIT'
+  ELSE
+    CGETSRCT ='READ'
+    IF ( (CCONF=='START') .AND. CPROGRAM /= 'DIAG') CGETSRCT ='INIT'
+    CGETSIGS ='READ'
+  END IF
+ELSE
+  CGETSRCT ='SKIP'
+  CGETSIGS ='SKIP'
+END IF
+!
+IF(LCLOUDMODIFLM .AND. CTURBLEN_CLOUD/='NONE') THEN
+  IF (CTURB=='NONE' .OR. .NOT.LUSERC) THEN
+    WRITE(UNIT=ILUOUT,FMT=9001) KMI
+    WRITE(UNIT=ILUOUT,FMT='("YOU WANT TO COMPUTE A MIXING LENGTH FOR CLOUD=", &
+                 &   ", WHEREAS YOU DO NOT SPECIFY A TURBULENCE SCHEME OR ",  &
+                 &   "USE OF RC,",/," CTURBLEN_CLOUD IS SET TO NONE")')       &
+                 CTURBLEN_CLOUD
+    CTURBLEN_CLOUD='NONE'
+  END IF
+  IF( XCEI_MIN > XCEI_MAX ) THEN
+    WRITE(UNIT=ILUOUT,FMT=9003) KMI
+    WRITE(UNIT=ILUOUT,FMT='("PROBLEM OF CEI LIMITS FOR CLOUD MIXING  ",/, &
+                 &   "LENGTH COMPUTATION: XCEI_MIN=",E9.3,", XCEI_MAX=",E9.3)')&
+                 XCEI_MIN,XCEI_MAX
+ !callabortstop
+    CALL PRINT_MSG(NVERB_FATAL,'GEN','READ_EXSEG_n','')
+  END IF
+END IF
+!
+IF ( LSIGMAS ) THEN
+  WRITE(UNIT=ILUOUT,FMT=9001) KMI
+  WRITE(UNIT=ILUOUT,FMT='("YOU WANT TO USE SIGMA_S FROM TURBULENCE SCHEME",/, &
+                 &   " IN ICE SUBGRID CONDENSATION, SO YOUR SIGMA_S"/, &
+                 &   " MIGHT BE SMALL ABOVE PBL DEPENDING ON LENGTH SCALE")')
+END IF
+!
+IF (LSUBG_COND .AND. CTURB=='NONE' ) THEN
+  WRITE(UNIT=ILUOUT,FMT=9002) KMI
+  WRITE(UNIT=ILUOUT,FMT=*) 'YOU WANT TO USE SUBGRID CONDENSATION'
+  WRITE(UNIT=ILUOUT,FMT=*) ' WITHOUT TURBULENCE '                           
+  WRITE(UNIT=ILUOUT,FMT=*) 'THIS IS NOT ALLOWED: LSUBG_COND is SET to FALSE'
+  LSUBG_COND=.FALSE.
+END IF
+!
+IF (L1D .AND. CTURB/='NONE' .AND. CTURBDIM == '3DIM') THEN
+  WRITE(UNIT=ILUOUT,FMT=9002) KMI
+  WRITE(UNIT=ILUOUT,FMT=*) 'YOU WANT TO USE 3D TURBULENCE IN 1D CONFIGURATION '
+  WRITE(UNIT=ILUOUT,FMT=*) 'THIS IS NOT POSSIBLE: CTURBDIM IS SET TO 1DIM'
+  CTURBDIM = '1DIM'
+END IF
+!
+!*       3.4  Additional scalar variables 
+!
+IF (NSV_USER == KSV_USER) THEN
+  DO  JS = 1,KSV_USER             ! to read all the variables in initial file 
+    CGETSVT(JS)='READ'            ! and to initialize them 
+!   IF(CCONF=='START')CGETSVT(JS)='INIT'       ! with  these values  
+  END DO
+ELSEIF (NSV_USER > KSV_USER) THEN
+ IF (KSV_USER == 0) THEN
+    CGETSVT(1:NSV_USER)='INIT'
+ ELSE
+  WRITE(UNIT=ILUOUT,FMT=9001) KMI
+  WRITE(UNIT=ILUOUT,FMT='("YOU WANT TO USE MORE ADDITIONAL SCALAR  " ,&
+  &" VARIABLES THAN THERE ARE IN INITIAL FMFILE",/,                  &
+  & "THE SUPPLEMENTARY VARIABLES HAVE BEEN INITIALIZED TO ZERO ")') 
+  DO  JS = 1,KSV_USER             ! to read all the variables in initial file 
+    CGETSVT(JS)='READ'            ! and to initialize them
+!   IF(CCONF=='START')CGETSVT(JS)='INIT'        ! with  these values
+  END DO
+  DO JS = KSV_USER+1, NSV_USER    ! to initialize to zero supplementary
+    CGETSVT(JS)='INIT'            ! initial file)
+  END DO
+ END IF
+ELSE
+  WRITE(UNIT=ILUOUT,FMT=9000) KMI
+  WRITE(UNIT=ILUOUT,FMT='("YOU WANT TO USE LESS ADDITIONAL SCALAR  " ,&
+  &" VARIABLES THAN THERE ARE IN INITIAL FMFILE")')
+  DO  JS = 1,NSV_USER             ! to read the first NSV_USER variables in initial file 
+    CGETSVT(JS)='READ'            ! and to initialize with these values
+!   IF(CCONF=='START') CGETSVT(JS)='INIT'  
+  END DO 
+  DO  JS = NSV_USER + 1, KSV_USER ! to skip the last (KSV_USER-NSV_USER) variables
+    CGETSVT(JS)='SKIP' 
+  END DO
+END IF
+!
+! C2R2 and KHKO SV case
+!
+IF (CCLOUD == 'C2R2' .OR. CCLOUD == 'C3R5' .OR. CCLOUD == 'KHKO') THEN 
+  IF (HCLOUD == 'C2R2' .OR. HCLOUD == 'C3R5' .OR. HCLOUD == 'KHKO') THEN
+    CGETSVT(NSV_C2R2BEG:NSV_C2R2END)='READ'
+!   IF(CCONF=='START') CGETSVT(NSV_C2R2BEG:NSV_C2R2END)='INIT'
+  ELSE
+    WRITE(UNIT=ILUOUT,FMT=9001) KMI
+    WRITE(UNIT=ILUOUT,FMT='("THERE IS NO SCALAR VARIABLES FOR C2R2 &
+         & (or KHKO) SCHEME IN INITIAL FMFILE",/,&
+         & "THE C2R2 (or KHKO) VARIABLES HAVE BEEN INITIALIZED TO ZERO ")') 
+    CGETSVT(NSV_C2R2BEG:NSV_C2R2END)='INIT'
+  END IF
+END IF
+!
+! C3R5 SV case
+!
+IF (CCLOUD == 'C3R5') THEN 
+  IF (HCLOUD == 'C3R5') THEN
+    CGETSVT(NSV_C1R3BEG:NSV_C1R3END)='READ'
+!   IF(CCONF=='START') CGETSVT(NSV_C1R3BEG:NSV_C1R3END)='INIT'
+  ELSE
+    WRITE(UNIT=ILUOUT,FMT=9001) KMI
+    WRITE(UNIT=ILUOUT,FMT='("THERE IS NO SCALAR VARIABLES FOR C3R5 &
+         &SCHEME IN INITIAL FMFILE",/,&
+         & "THE C1R3 VARIABLES HAVE BEEN INITIALIZED TO ZERO ")') 
+    CGETSVT(NSV_C1R3BEG:NSV_C1R3END)='INIT'
+  END IF
+END IF
+!
+! LIMA SV case
+!
+IF (CCLOUD == 'LIMA') THEN
+  IF (HCLOUD == 'LIMA') THEN
+    CGETSVT(NSV_LIMA_BEG:NSV_LIMA_END)='READ'
+  ELSE
+    WRITE(UNIT=ILUOUT,FMT=9001) KMI
+    WRITE(UNIT=ILUOUT,FMT='("THERE IS NO SCALAR VARIABLES FOR LIMA &
+           & SCHEME IN INITIAL FMFILE",/,&
+           & "THE LIMA VARIABLES HAVE BEEN INITIALIZED TO ZERO ")') 
+    CGETSVT(NSV_LIMA_BEG:NSV_LIMA_END)='INIT'
+  END IF
+END IF
+!
+! Electrical SV case
+!
+IF (CELEC /= 'NONE') THEN 
+  IF (HELEC /= 'NONE') THEN
+    CGETSVT(NSV_ELECBEG:NSV_ELECEND)='READ'
+!   IF(CCONF=='START') CGETSVT(NSV_ELECBEG:NSV_ELECEND)='INIT'
+  ELSE
+    WRITE(UNIT=ILUOUT,FMT=9001) KMI
+    WRITE(UNIT=ILUOUT,FMT='("THERE IS NO SCALAR VARIABLES FOR ELECTRICAL &
+         &SCHEME IN INITIAL FMFILE",/,&
+         & "THE ELECTRICAL VARIABLES HAVE BEEN INITIALIZED TO ZERO ")') 
+    CGETSVT(NSV_ELECBEG:NSV_ELECEND)='INIT'
+  END IF
+END IF
+!
+! (explicit) LINOx SV case 
+!
+IF (CELEC /= 'NONE' .AND. LLNOX_EXPLICIT) THEN
+  IF (HELEC /= 'NONE' .AND. OLNOX_EXPLICIT) THEN
+    CGETSVT(NSV_LNOXBEG:NSV_LNOXEND)='READ' 
+  ELSE
+    WRITE(UNIT=ILUOUT,FMT=9001) KMI
+    WRITE(UNIT=ILUOUT,FMT='("THERE IS NO SCALAR VARIABLES FOR LINOX &
+         & IN INITIAL FMFILE",/,& 
+         & "THE LINOX VARIABLES HAVE BEEN INITIALIZED TO ZERO ")')  
+    CGETSVT(NSV_LNOXBEG:NSV_LNOXEND)='INIT' 
+  END IF
+END IF
+!
+! Chemical SV case (excluding aqueous chemical species)
+!
+IF (LUSECHEM) THEN
+  IF (OUSECHEM) THEN
+    CGETSVT(NSV_CHGSBEG:NSV_CHGSEND)='READ'
+    IF(CCONF=='START' .AND. LCH_INIT_FIELD ) CGETSVT(NSV_CHGSBEG:NSV_CHGSEND)='INIT'
+  ELSE
+    WRITE(UNIT=ILUOUT,FMT=9001) KMI
+    WRITE(UNIT=ILUOUT,FMT='("THERE IS NO SCALAR VARIABLES FOR CHEMICAL &
+         &SCHEME IN INITIAL FMFILE",/,&
+         & "THE CHEMICAL VARIABLES HAVE BEEN INITIALIZED TO ZERO ")') 
+    CGETSVT(NSV_CHGSBEG:NSV_CHGSEND)='INIT'
+  END IF
+END IF
+! add aqueous chemical species
+IF (LUSECHAQ) THEN
+  IF (OUSECHAQ) THEN
+    CGETSVT(NSV_CHACBEG:NSV_CHACEND)='READ'
+!    IF(CCONF=='START') CGETSVT(NSV_CHACBEG:NSV_CHACEND)='INIT'
+  ELSE
+    WRITE(UNIT=ILUOUT,FMT=9001) KMI
+    WRITE(UNIT=ILUOUT,FMT='("THERE IS NO SCALAR VARIABLES FOR CHEMICAL &
+         &SCHEME IN AQUEOUS PHASE IN INITIAL FMFILE",/,&
+         & "THE AQUEOUS PHASE CHEMICAL VARIABLES HAVE BEEN INITIALIZED TO ZERO ")') 
+    CGETSVT(NSV_CHACBEG:NSV_CHACEND)='INIT'
+  END IF
+END IF
+! add ice phase chemical species
+IF (LUSECHIC) THEN
+  IF (OUSECHIC) THEN
+    CGETSVT(NSV_CHICBEG:NSV_CHICEND)='READ'
+!   IF(CCONF=='START') CGETSVT(NSV_CHICBEG:NSV_CHICEND)='INIT'
+  ELSE
+    WRITE(UNIT=ILUOUT,FMT=9001) KMI
+    WRITE(UNIT=ILUOUT,FMT='("THERE IS NO SCALAR VARIABLES FOR CHEMICAL &
+         &SPECIES IN ICE PHASE IN INITIAL FMFILE",/,&
+         & "THE ICE PHASE CHEMICAL VARIABLES HAVE BEEN INITIALIZED TO ZERO ")')
+    CGETSVT(NSV_CHICBEG:NSV_CHICEND)='INIT'
+  END IF
+END IF
+! pH values = diagnostics
+IF (LCH_PH .AND. .NOT. OCH_PH) THEN
+  CGETPHC ='INIT'  !will be initialized to XCH_PHINIT
+  IF (LUSERR) THEN
+    CGETPHR = 'INIT' !idem
+  ELSE 
+    CGETPHR = 'SKIP'
+  ENDIF
+ELSE
+  IF (LCH_PH) THEN
+    CGETPHC ='READ'
+    IF (LUSERR) THEN
+      CGETPHR = 'READ'
+    ELSE
+      CGETPHR = 'SKIP'
+    ENDIF
+  ELSE
+    CGETPHC ='SKIP'
+    CGETPHR ='SKIP'
+  END IF
+END IF
+!
+! Dust case
+!
+IF (LDUST) THEN
+  IF (ODUST) THEN
+    CGETSVT(NSV_DSTBEG:NSV_DSTEND)='READ'
+!   IF(CCONF=='START') CGETSVT(NSV_DSTBEG:NSV_DSTEND)='INIT'
+  ELSE
+    WRITE(UNIT=ILUOUT,FMT=9001) KMI
+    WRITE(UNIT=ILUOUT,FMT='("THERE IS NO SCALAR VARIABLES FOR DUST &
+         &SCHEME IN INITIAL FMFILE",/,&
+         & "THE DUST VARIABLES HAVE BEEN INITIALIZED TO ZERO ")') 
+    CGETSVT(NSV_DSTBEG:NSV_DSTEND)='INIT'
+  END IF
+  IF (LDEPOS_DST(KMI)) THEN
+
+          !UPG *PT
+  IF((CCLOUD /= 'ICE3').AND.(CCLOUD /= 'ICE4').AND.(CCLOUD /= 'KESS')&
+  .AND.(CCLOUD /= 'KHKO').AND.(CCLOUD /= 'C2R2').AND.(CCLOUD /= 'LIMA').AND. &
+       (CPROGRAM/='SPAWN').AND.(CPROGRAM/='REAL'))  THEN
+    WRITE(UNIT=ILUOUT,FMT=9003) KMI
+    WRITE(UNIT=ILUOUT,FMT='("ERROR: WET DEPOSITION OF DUST IS ONLY CODED FOR THE",/,&
+         & "MICROPHYSICAL SCHEME as ICE3, ICE4, KESS, KHKO, LIMA and C2R2")') 
+          !UPG *PT
+ !callabortstop
+    CALL PRINT_MSG(NVERB_FATAL,'GEN','READ_EXSEG_n','')
+  END IF  
+
+   IF (ODEPOS_DST(KMI) ) THEN
+    CGETSVT(NSV_DSTDEPBEG:NSV_DSTDEPEND)='READ'
+!   IF(CCONF=='START') CGETSVT(NSV_DSTDEPBEG:NSV_DSTDEPEND)='INIT'    
+   ELSE
+    WRITE(UNIT=ILUOUT,FMT=9001) KMI
+    WRITE(UNIT=ILUOUT,FMT='("THERE IS NO SCALAR VARIABLES FOR RAIN and CLOUD DUST &
+         &  SCHEME IN INITIAL FMFILE",/,&
+         & "THE MOIST DUST VARIABLES HAVE BEEN INITIALIZED TO ZERO ")') 
+    CGETSVT(NSV_DSTDEPBEG:NSV_DSTDEPEND)='INIT'    
+   END IF
+  END IF  
+
+  IF(NMODE_DST.GT.3 .OR. NMODE_DST.LT.1) THEN
+    WRITE(UNIT=ILUOUT,FMT=9003) KMI
+    WRITE(UNIT=ILUOUT,FMT='("DUST MODES MUST BE BETWEEN 1 and 3 ")') 
+ !callabortstop
+    CALL PRINT_MSG(NVERB_FATAL,'GEN','READ_EXSEG_n','')
+  END IF     
+END IF
+!
+! Sea Salt case
+!
+IF (LSALT) THEN
+  IF (OSALT) THEN
+    CGETSVT(NSV_SLTBEG:NSV_SLTEND)='READ'
+    CGETZWS='READ'
+!   IF(CCONF=='START') CGETSVT(NSV_SLTBEG:NSV_SLTEND)='INIT'
+  ELSE
+    WRITE(UNIT=ILUOUT,FMT=9001) KMI
+    WRITE(UNIT=ILUOUT,FMT='("THERE IS NO SCALAR VARIABLES FOR SALT &
+         &SCHEME IN INITIAL FMFILE",/,&
+         & "THE SALT VARIABLES HAVE BEEN INITIALIZED TO ZERO ")') 
+    CGETSVT(NSV_SLTBEG:NSV_SLTEND)='INIT'
+    CGETZWS='INIT'
+  END IF
+  IF (LDEPOS_SLT(KMI)) THEN
+
+          !UPG*PT
+  IF((CCLOUD /= 'ICE3').AND.(CCLOUD /= 'ICE4').AND.(CCLOUD /= 'KESS')&
+  !.AND.(CCLOUD /= 'KHKO').AND.(CCLOUD /= 'C2R2').AND.                &
+  .AND.(CCLOUD /= 'KHKO').AND.(CCLOUD /= 'C2R2').AND.(CCLOUD /= 'LIMA').AND. &
+       (CPROGRAM/='SPAWN').AND.(CPROGRAM/='REAL'))  THEN
+    WRITE(UNIT=ILUOUT,FMT=9003) KMI
+    WRITE(UNIT=ILUOUT,FMT='("ERROR: WET DEPOSITION OF SEA SALT AEROSOLS IS ONLY CODED FOR THE",/,&
+         & "MICROPHYSICAL SCHEME as ICE3, ICE4, KESS, KHKO, LIMA and C2R2")') 
+          !UPG*PT
+ !callabortstop
+    CALL PRINT_MSG(NVERB_FATAL,'GEN','READ_EXSEG_n','')
+  END IF  
+
+   IF (ODEPOS_SLT(KMI) ) THEN
+    CGETSVT(NSV_SLTDEPBEG:NSV_SLTDEPEND)='READ'
+!   IF(CCONF=='START') CGETSVT(NSV_SLTDEPBEG:NSV_SLTDEPEND)='INIT'    
+   ELSE
+    WRITE(UNIT=ILUOUT,FMT=9001) KMI
+    WRITE(UNIT=ILUOUT,FMT='("THERE IS NO SCALAR VARIABLES FOR RAIN and CLOUD SEA SALT &
+         &  SCHEME IN INITIAL FMFILE",/,&
+         & "THE MOIST SEA SALT VARIABLES HAVE BEEN INITIALIZED TO ZERO ")') 
+    CGETSVT(NSV_SLTDEPBEG:NSV_SLTDEPEND)='INIT'    
+   END IF
+  END IF
+  IF(NMODE_SLT.GT.8 .OR. NMODE_SLT.LT.1) THEN
+    WRITE(UNIT=ILUOUT,FMT=9003) KMI
+    WRITE(UNIT=ILUOUT,FMT='("SALT MODES MUST BE BETWEEN 1 and 8 ")') 
+ !callabortstop
+    CALL PRINT_MSG(NVERB_FATAL,'GEN','READ_EXSEG_n','')
+  END IF     
+END IF 
+!
+! Orilam SV case
+!
+IF (LORILAM) THEN
+  IF (OORILAM) THEN
+    CGETSVT(NSV_AERBEG:NSV_AEREND)='READ'
+!   IF(CCONF=='START') CGETSVT(NSV_AERBEG:NSV_AEREND)='INIT'
+  ELSE
+    WRITE(UNIT=ILUOUT,FMT=9001) KMI
+    WRITE(UNIT=ILUOUT,FMT='("THERE IS NO SCALAR VARIABLES FOR AEROSOL &
+         &SCHEME IN INITIAL FMFILE",/,&
+         & "THE AEROSOLS VARIABLES HAVE BEEN INITIALIZED TO ZERO ")') 
+    CGETSVT(NSV_AERBEG:NSV_AEREND)='INIT'
+  END IF
+  IF (LDEPOS_AER(KMI)) THEN
+
+          !UPG*PT
+  IF((CCLOUD /= 'ICE3').AND.(CCLOUD /= 'ICE4').AND.(CCLOUD /= 'KESS')&
+  .AND.(CCLOUD /= 'KHKO').AND.(CCLOUD /= 'C2R2').AND.(CCLOUD /= 'LIMA').AND. &
+  !.AND.(CCLOUD /= 'KHKO').AND.(CCLOUD /= 'C2R2').AND.                &
+       (CPROGRAM/='SPAWN').AND.(CPROGRAM/='REAL'))  THEN
+    WRITE(UNIT=ILUOUT,FMT=9003) KMI
+    WRITE(UNIT=ILUOUT,FMT='("ERROR: WET DEPOSITION OF ORILAM AEROSOLS IS ONLY CODED FOR THE",/,&
+         & "MICROPHYSICAL SCHEME as ICE3, ICE4, KESS, KHKO, LIMA and C2R2")') 
+          !UPG*PT
+ !callabortstop
+    CALL PRINT_MSG(NVERB_FATAL,'GEN','READ_EXSEG_n','')
+  END IF  
+
+   IF (ODEPOS_AER(KMI) ) THEN
+    CGETSVT(NSV_AERDEPBEG:NSV_AERDEPEND)='READ'
+!   IF(CCONF=='START') CGETSVT(NSV_AERDEPBEG:NSV_AERDEPEND)='INIT'    
+   ELSE
+    WRITE(UNIT=ILUOUT,FMT=9001) KMI
+    WRITE(UNIT=ILUOUT,FMT='("THERE IS NO SCALAR VARIABLES FOR RAIN and IN CLOUD  &
+         &  AEROSOL SCHEME IN INITIAL FMFILE",/,&
+         & "THE MOIST AEROSOL VARIABLES HAVE BEEN INITIALIZED TO ZERO ")') 
+    CGETSVT(NSV_AERDEPBEG:NSV_AERDEPEND)='INIT'    
+   END IF
+  END IF
+END IF
+!
+! Lagrangian variables
+!
+IF (LINIT_LG .AND. .NOT.(LLG)) THEN
+      WRITE(UNIT=ILUOUT,FMT=9001) KMI
+      WRITE(UNIT=ILUOUT,FMT='("IT IS INCOHERENT TO HAVE LINIT_LG=.T. AND LLG=.F.",/,&
+      & "IF YOU WANT LAGRANGIAN TRACERS CHANGE LLG TO .T. ")')
+ENDIF
+IF (LLG) THEN
+  IF (OLG .AND. .NOT.(LINIT_LG .AND. CPROGRAM=='MESONH')) THEN
+    CGETSVT(NSV_LGBEG:NSV_LGEND)='READ'
+!   IF(CCONF=='START') CGETSVT(NSV_LGBEG:NSV_LGEND)='INIT'
+  ELSE
+    IF(.NOT.(LINIT_LG) .AND. CPROGRAM=='MESONH') THEN
+      WRITE(UNIT=ILUOUT,FMT=9001) KMI
+      WRITE(UNIT=ILUOUT,FMT='("THERE IS NO LAGRANGIAN VARIABLES IN INITIAL FMFILE",/,&
+                       & "THE LAGRANGIAN VARIABLES HAVE BEEN REINITIALIZED")')
+      LINIT_LG=.TRUE.
+    ENDIF
+    CGETSVT(NSV_LGBEG:NSV_LGEND)='INIT'
+  END IF
+END IF
+!
+!
+! LINOx SV case
+!
+IF (.NOT.LUSECHEM .AND. LCH_CONV_LINOX) THEN
+  IF (.NOT.OUSECHEM .AND. OCH_CONV_LINOX) THEN
+    CGETSVT(NSV_LNOXBEG:NSV_LNOXEND)='READ'
+  ELSE
+    WRITE(UNIT=ILUOUT,FMT=9002) KMI
+    WRITE(UNIT=ILUOUT,FMT='("THERE IS NO SCALAR VARIABLES FOR LINOX &
+         &IN INITIAL FMFILE",/,&
+         & "THE LINOX VARIABLES HAVE BEEN INITIALIZED TO ZERO ")') 
+    CGETSVT(NSV_LNOXBEG:NSV_LNOXEND)='INIT'
+  END IF
+END IF
+!
+! Passive pollutant case
+!
+IF (LPASPOL) THEN
+  IF (OPASPOL) THEN
+    CGETSVT(NSV_PPBEG:NSV_PPEND)='READ'
+!   IF(CCONF=='START') CGETSVT(NSV_PPBEG:NSV_PPEND)='INIT'    
+  ELSE
+    WRITE(UNIT=ILUOUT,FMT=9001) KMI
+    WRITE(UNIT=ILUOUT,FMT='("THERE IS NO PASSIVE SCALAR VARIABLES IN INITIAL FMFILE",/,&
+                       & "THE VARIABLES HAVE BEEN INITIALIZED TO ZERO")')
+    CGETSVT(NSV_PPBEG:NSV_PPEND)='INIT'
+  END IF
+END IF
+!
+#ifdef MNH_FOREFIRE
+! ForeFire
+!
+IF (LFOREFIRE) THEN
+  IF (OFOREFIRE) THEN
+    CGETSVT(NSV_FFBEG:NSV_FFEND)='READ'
+  ELSE
+    WRITE(UNIT=ILUOUT,FMT=9001) KMI
+    WRITE(UNIT=ILUOUT,FMT='("THERE IS NO FOREFIRE SCALAR VARIABLES IN INITIAL FMFILE",/,&
+                       & "THE VARIABLES HAVE BEEN INITIALIZED TO ZERO")')
+    CGETSVT(NSV_FFBEG:NSV_FFEND)='INIT'
+  END IF
+END IF
+#endif
+! Blaze smoke
+!
+IF (LBLAZE) THEN
+  IF (OFIRE) THEN
+    CGETSVT(NSV_FIREBEG:NSV_FIREEND)='READ'
+  ELSE
+    WRITE(UNIT=ILUOUT,FMT=9001) KMI
+    WRITE(UNIT=ILUOUT,FMT='("THERE IS NO BLAZE SCALAR VARIABLES IN INITIAL FMFILE",/,&
+                       & "THE VARIABLES HAVE BEEN INITIALIZED TO ZERO")')
+    CGETSVT(NSV_FIREBEG:NSV_FIREEND)='INIT'
+  END IF
+END IF
+!
+! Conditional sampling case
+!
+IF (LCONDSAMP) THEN
+  IF (OCONDSAMP) THEN
+    CGETSVT(NSV_CSBEG:NSV_CSEND)='READ'
+!   IF(CCONF=='START') CGETSVT(NSV_CSBEG:NSV_CSEND)='INIT'       
+  ELSE
+    WRITE(UNIT=ILUOUT,FMT=9001) KMI
+    WRITE(UNIT=ILUOUT,FMT='("THERE IS NO PASSIVE SCALAR VARIABLES IN INITIAL FMFILE",/,&
+                       & "THE VARIABLES HAVE BEEN INITIALIZED TO ZERO")')
+    CGETSVT(NSV_CSBEG:NSV_CSEND)='INIT'
+  END IF
+END IF
+!
+! Blowing snow scheme
+!
+IF (LBLOWSNOW) THEN
+  IF (OBLOWSNOW) THEN
+    CGETSVT(NSV_SNWBEG:NSV_SNWEND)='READ'
+  ELSE
+    WRITE(UNIT=ILUOUT,FMT=9001) KMI
+    WRITE(UNIT=ILUOUT,FMT='("THERE IS NO SCALAR VARIABLES FOR BLOWING SNOW &
+         &SCHEME IN INITIAL FMFILE",/,&
+         & "THE BLOWING SNOW VARIABLES HAVE BEEN INITIALIZED TO ZERO ")')
+    CGETSVT(NSV_SNWBEG:NSV_SNWEND)='INIT'
+  END IF
+END IF
+!
+!
+!
+!*       3.5  Check coherence between the radiation control parameters
+!
+IF( CRAD == 'ECMW' .AND. CPROGRAM=='MESONH' ) THEN
+  IF(CLW == 'RRTM' .AND. COPILW == 'SMSH') THEN
+    WRITE(UNIT=ILUOUT,FMT=9003) KMI
+    WRITE(UNIT=ILUOUT,FMT=*) 'the SMSH parametrisation of LW optical properties for cloud ice'
+    WRITE(UNIT=ILUOUT,FMT=*) '(COPILW) can not be used with RRTM radiation scheme'
+ !callabortstop
+    CALL PRINT_MSG(NVERB_FATAL,'GEN','READ_EXSEG_n','')
+  ENDIF
+  IF(CLW == 'MORC' .AND. COPWLW == 'LILI') THEN
+    WRITE(UNIT=ILUOUT,FMT=9003) KMI
+    WRITE(UNIT=ILUOUT,FMT=*) 'the LILI parametrisation of LW optical properties for cloud water'
+    WRITE(UNIT=ILUOUT,FMT=*) '(COPWLW) can not be used with MORC radiation scheme'
+ !callabortstop
+    CALL PRINT_MSG(NVERB_FATAL,'GEN','READ_EXSEG_n','')
+  ENDIF
+  IF( .NOT. LSUBG_COND) THEN
+    WRITE(UNIT=ILUOUT,FMT=9000) KMI
+    WRITE(UNIT=ILUOUT,FMT=*) 'YOU DO NOT WANT TO USE SUBGRID CONDENSATION'             
+    WRITE(UNIT=ILUOUT,FMT=*) 'THE OVERLAP OPTION IS NOVLP=5 IN ini_radconf.f90'
+  ELSE IF (CLW == 'MORC') THEN
+    WRITE(UNIT=ILUOUT,FMT=9000) KMI
+    WRITE(UNIT=ILUOUT,FMT=*) 'YOU WANT TO USE MORCRETTE LW SCHEME'                   
+    WRITE(UNIT=ILUOUT,FMT=*) 'THE OVERLAP OPTION IS NOVLP=5 IN ini_radconf.f90'
+  ELSE
+    WRITE(UNIT=ILUOUT,FMT=9000) KMI
+    WRITE(UNIT=ILUOUT,FMT=*) 'THE OVERLAP OPTION IS NOVLP=6 IN ini_radconf.f90'
+  ENDIF
+!
+  IF( LCLEAR_SKY .AND. XDTRAD_CLONLY /= XDTRAD) THEN
+    ! Check the validity of the LCLEAR_SKY approximation
+    WRITE(UNIT=ILUOUT,FMT=9003) KMI
+    WRITE(UNIT=ILUOUT,FMT=*) 'YOU WANT TO USE BOTH THE CLEAR-SKY APPROXIMATION'
+    WRITE(UNIT=ILUOUT,FMT=*) '(i.e. AVERAGE THE WHOLE CLOUDFREE VERTICALS BUT KEEP'
+    WRITE(UNIT=ILUOUT,FMT=*) 'ALL THE CLOUDY VERTICALS) AND'
+    WRITE(UNIT=ILUOUT,FMT=*) 'THE CLOUD-ONLY APPROXIMATION (i.e. YOU CALL MORE OFTEN THE'
+    WRITE(UNIT=ILUOUT,FMT=*) 'RADIATIONS FOR THE CLOUDY VERTICALS THAN FOR CLOUDFREE ONES).'
+    WRITE(UNIT=ILUOUT,FMT=*) 'THIS IS NOT POSSIBLE, SO CHOOSE BETWEEN :'
+    WRITE(UNIT=ILUOUT,FMT=*) 'XDTRAD_CLONLY = XDTRAD and LCLEAR_SKY = FALSE'
+!
+ !callabortstop
+    CALL PRINT_MSG(NVERB_FATAL,'GEN','READ_EXSEG_n','')
+  END IF
+!
+  IF( XDTRAD_CLONLY > XDTRAD ) THEN
+    WRITE(UNIT=ILUOUT,FMT=9003) KMI
+    WRITE(UNIT=ILUOUT,FMT='("BAD USE OF THE CLOUD-ONLY APPROXIMATION   " ,&
+    &" XDTRAD SHOULD BE LARGER THAN XDTRAD_CLONLY                      ")')
+!
+ !callabortstop
+    CALL PRINT_MSG(NVERB_FATAL,'GEN','READ_EXSEG_n','')
+  END IF
+!
+  IF(( XDTRAD < XTSTEP ).OR. ( XDTRAD_CLONLY < XTSTEP )) THEN
+    WRITE(UNIT=ILUOUT,FMT=9003) KMI
+    WRITE(UNIT=ILUOUT,FMT='("THE RADIATION CALL XDTRAD OR XDTRAD_CLONLY " ,&
+    &" IS MORE FREQUENT THAN THE TIME STEP SO ADJUST XDTRAD OR XDTRAD_CLONLY ")')
+!
+ !callabortstop
+    CALL PRINT_MSG(NVERB_FATAL,'GEN','READ_EXSEG_n','')
+  END IF
+END IF
+!
+IF ( CRAD /= 'NONE' .AND. CPROGRAM=='MESONH' ) THEN
+  CGETRAD='READ'
+  IF( HRAD == 'NONE' .AND. CCONF=='RESTA') THEN
+    WRITE(UNIT=ILUOUT,FMT=9001) KMI
+    WRITE(UNIT=ILUOUT,FMT=*) 'YOU ARE PERFORMING A RESTART. FOR THIS SEGMENT, YOU ARE USING A RADIATION'
+    WRITE(UNIT=ILUOUT,FMT=*) 'SCHEME AND NO RADIATION SCHEME WAS USED FOR THE PREVIOUS SEGMENT.'
+    CGETRAD='INIT'
+  END IF
+  IF(CCONF=='START') THEN
+    CGETRAD='INIT'
+  END IF
+  IF(CCONF=='RESTA' .AND. (.NOT. LAERO_FT) .AND.  (.NOT. LORILAM) &
+                    .AND. (.NOT. LSALT)  .AND. (.NOT. LDUST)) THEN
+    WRITE(UNIT=ILUOUT,FMT=9001) KMI
+    WRITE(UNIT=ILUOUT,FMT=*) '!!! WARNING !!! FOR REPRODUCTIBILITY BETWEEN START and START+RESTART,'
+    WRITE(UNIT=ILUOUT,FMT=*) 'YOU MUST USE LAERO_FT=T WITH CAER=TEGE IF CCONF=RESTA IN ALL SEGMENTS'
+    WRITE(UNIT=ILUOUT,FMT=*) 'TO UPDATE THE OZONE AND AEROSOLS CLIMATOLOGY USED BY THE RADIATION CODE;'
+  END IF
+END IF
+!
+!        3.6  check the initialization of the deep convection scheme
+!
+IF ( (CDCONV /= 'KAFR') .AND. &
+      (CSCONV /= 'KAFR') .AND. LCHTRANS ) THEN
+   WRITE(UNIT=ILUOUT,FMT=9003) KMI
+   WRITE(UNIT=ILUOUT,FMT='("YOU WANT TO USE THE LCHTRANS OPTION= ",&
+    &"CONVECTIVE TRANSPORT OF TRACERS BUT  IT CAN ONLY",&
+    &"BE USED FOR THE KAIN FRITSCH SCHEME ")')
+ !callabortstop
+   CALL PRINT_MSG(NVERB_FATAL,'GEN','READ_EXSEG_n','')
+END IF
+!
+SELECT CASE ( CDCONV )
+  CASE( 'KAFR' )
+    IF (.NOT. ( LUSERV ) ) THEN
+      WRITE(UNIT=ILUOUT,FMT=9002) KMI
+      WRITE(UNIT=ILUOUT,FMT='("YOU WANT TO USE THE KAIN-FRITSCH DEEP CONV. ",&
+      &" SCHEME. YOU MUST HAVE VAPOR ",/,"LUSERV IS SET TO TRUE ")')
+      LUSERV=.TRUE.
+    ELSE IF (.NOT. ( LUSERI ) ) THEN
+      WRITE(UNIT=ILUOUT,FMT=9002) KMI
+      WRITE(UNIT=ILUOUT,FMT='("YOU WANT TO USE THE KAIN-FRITSCH",&
+      &" DEEP CONV. SCHEME. BUT THE DETRAINED CLOUD ICE WILL BE ADDED TO   ",&
+      &" THE CLOUD WATER  ")')
+    ELSE IF (.NOT. ( LUSERI.AND.LUSERC ) ) THEN
+      WRITE(UNIT=ILUOUT,FMT=9002) KMI
+      WRITE(UNIT=ILUOUT,FMT='("YOU WANT TO USE THE KAIN-FRITSCH",&
+      &" DEEP CONV. SCHEME. BUT THE DETRAINED CLOUD WATER AND CLOUD ICE    ",&
+      &" WILL BE ADDED TO THE WATER VAPOR FIELD  ")')
+    END IF
+    IF ( LCHTRANS .AND. NSV == 0 ) THEN
+      WRITE(UNIT=ILUOUT,FMT=9002) KMI
+      WRITE(UNIT=ILUOUT,FMT='("YOU WANT TO USE THE LCHTRANS OPTION= ",&
+      &"CONVECTIVE TRANSPORT OF TRACERS BUT YOUR TRACER ",&
+      &"NUMBER NSV IS ZERO ",/,"LCHTRANS IS SET TO FALSE")')
+      LCHTRANS=.FALSE.
+    END IF
+END SELECT
+!
+IF ( CDCONV == 'KAFR' .AND. LCHTRANS .AND. NSV > 0 ) THEN
+  IF( OCHTRANS ) THEN
+    CGETSVCONV='READ'
+  ELSE  
+    CGETSVCONV='INIT'
+  END IF
+END IF
+!
+SELECT CASE ( CSCONV )
+  CASE( 'KAFR' )
+    IF (.NOT. ( LUSERV ) ) THEN
+      WRITE(UNIT=ILUOUT,FMT=9002) KMI
+      WRITE(UNIT=ILUOUT,FMT='("YOU WANT TO USE THE KAIN-FRITSCH SHALLOW CONV. ",&
+      &" SCHEME. YOU MUST HAVE VAPOR ",/,"LUSERV IS SET TO TRUE ")')
+      LUSERV=.TRUE.
+    ELSE IF (.NOT. ( LUSERI ) ) THEN
+      WRITE(UNIT=ILUOUT,FMT=9002) KMI
+      WRITE(UNIT=ILUOUT,FMT='("YOU WANT TO USE THE KAIN-FRITSCH",&
+      &" SHALLOW CONV. SCHEME. BUT THE DETRAINED CLOUD ICE WILL BE ADDED TO   ",&
+      &" THE CLOUD WATER  ")')
+    ELSE IF (.NOT. ( LUSERI.AND.LUSERC ) ) THEN
+      WRITE(UNIT=ILUOUT,FMT=9002) KMI
+      WRITE(UNIT=ILUOUT,FMT='("YOU WANT TO USE THE KAIN-FRITSCH",&
+      &" SHALLOW CONV. SCHEME. BUT THE DETRAINED CLOUD WATER AND CLOUD ICE    ",&
+      &" WILL BE ADDED TO THE WATER VAPOR FIELD  ")')
+    END IF
+    IF ( LCHTRANS .AND. NSV == 0 ) THEN
+      WRITE(UNIT=ILUOUT,FMT=9002) KMI
+      WRITE(UNIT=ILUOUT,FMT='("YOU WANT TO USE THE LCHTRANS OPTION= ",&
+      &"CONVECTIVE TRANSPORT OF TRACERS BUT YOUR TRACER ",&
+      &"NUMBER NSV IS ZERO ",/,"LCHTRANS IS SET TO FALSE")')
+      LCHTRANS=.FALSE.
+    END IF
+ CASE( 'EDKF' )
+    IF (CTURB == 'NONE' ) THEN
+      WRITE(UNIT=ILUOUT,FMT=9003) KMI
+      WRITE(UNIT=ILUOUT,FMT='("YOU WANT TO USE THE EDKF ", & 
+      &"SHALLOW CONVECTION WITHOUT TURBULENCE SCHEME : ", &
+      &"IT IS NOT POSSIBLE")')
+!
+ !callabortstop
+      CALL PRINT_MSG(NVERB_FATAL,'GEN','READ_EXSEG_n','')
+    END IF
+END SELECT
+!
+!
+CGETCONV = 'SKIP'
+!
+IF ( (CDCONV /= 'NONE' .OR. CSCONV == 'KAFR' ) .AND. CPROGRAM=='MESONH') THEN
+  CGETCONV = 'READ'
+  IF( HDCONV == 'NONE' .AND. CCONF=='RESTA') THEN
+    WRITE(UNIT=ILUOUT,FMT=9001) KMI
+    WRITE(UNIT=ILUOUT,FMT='(" YOU ARE PERFORMING A RESTART. FOR THIS  ",&
+     &" SEGMENT, YOU ARE USING A DEEP CONVECTION SCHEME AND NO DEEP    ",&
+     &" CONVECTION SCHEME WAS USED FOR THE PREVIOUS SEGMENT. ")')
+!
+    CGETCONV = 'INIT'
+  END IF
+  IF(CCONF=='START') THEN
+    CGETCONV = 'INIT'
+  END IF
+END IF
+!
+!*       3.7  configuration and model version
+!
+IF (KMI == 1) THEN                                                
+! 
+  IF (L1D.AND.(CLBCX(1)/='CYCL'.AND.CLBCX(2)/='CYCL' &
+          .AND.CLBCY(1)/='CYCL'.AND.CLBCY(2)/='CYCL')) THEN
+    WRITE(UNIT=ILUOUT,FMT=9003) KMI
+    WRITE(UNIT=ILUOUT,FMT='("YOU WANT TO USE A 1D MODEL VERSION WITH NON-CYCL",&
+                & "CLBCX OR CLBCY VALUES")')
+ !callabortstop
+    CALL PRINT_MSG(NVERB_FATAL,'GEN','READ_EXSEG_n','')
+  END IF
+  IF (L2D.AND.(CLBCY(1)/='CYCL'.AND.CLBCY(2)/='CYCL')) THEN
+    WRITE(UNIT=ILUOUT,FMT=9003) KMI
+    WRITE(UNIT=ILUOUT,FMT='("YOU WANT TO USE A 2D MODEL VERSION WITH NON-CYCL",&
+                & " CLBCY VALUES")')
+ !callabortstop
+    CALL PRINT_MSG(NVERB_FATAL,'GEN','READ_EXSEG_n','')
+  END IF
+  !
+ IF ( (.NOT. LCARTESIAN) .AND. ( LCORIO) .AND. (.NOT. LGEOST_UV_FRC) ) THEN
+   WRITE(UNIT=ILUOUT,FMT=9002) KMI
+   WRITE(UNIT=ILUOUT,FMT='("BE CAREFUL YOU COULD HAVE SPURIOUS MOTIONS      " ,&
+        & " NEAR THE LBC AS LCORIO=T and  LGEOST_UV_FRC=F")')
+ END IF
+  !
+  IF ((.NOT.LFLAT).AND.OFLAT) THEN                                      
+    WRITE(UNIT=ILUOUT,FMT=9002) KMI 
+    WRITE(UNIT=ILUOUT,FMT=*) 'ZERO OROGRAPHY IN INITIAL FILE'
+    WRITE(UNIT=ILUOUT,FMT=*) '***** ALL TERMS HAVE BEEN NEVERTHELESS COMPUTED WITHOUT SIMPLIFICATION*****'
+    WRITE(UNIT=ILUOUT,FMT=*) 'THIS SHOULD LEAD TO ERRORS IN THE PRESSURE COMPUTATION'     
+  END IF
+  IF (LFLAT.AND.(.NOT.OFLAT)) THEN
+    WRITE(UNIT=ILUOUT,FMT=9002) KMI
+    WRITE(UNIT=ILUOUT,FMT='(" OROGRAPHY IS NOT EQUAL TO ZERO ",            &
+          & "IN INITIAL FILE" ,/,                                          &
+          & "******* OROGRAPHY HAS BEEN SET TO ZERO *********",/,          &
+          & "ACCORDING TO ZERO OROGRAPHY, SIMPLIFICATIONS  HAVE  ",        &
+          & "BEEN MADE IN  COMPUTATIONS")')
+  END IF 
+END IF
+!
+!*       3.8  System of equations
+!
+IF ( HEQNSYS /= CEQNSYS ) THEN
+  WRITE(UNIT=ILUOUT,FMT=9003) KMI
+  WRITE(ILUOUT,FMT=*) 'YOU HAVE CHANGED THE SYSTEM OF EQUATIONS'
+  WRITE(ILUOUT,FMT=*) 'THE ANELASTIC CONSTRAINT IS PERHAPS CHANGED :'
+  WRITE(ILUOUT,FMT=*) 'FOR THE INITIAL FILE YOU HAVE USED ',HEQNSYS
+  WRITE(ILUOUT,FMT=*) 'FOR THE RUN YOU PLAN TO USE ',CEQNSYS
+  WRITE(ILUOUT,FMT=*) 'THIS CAN LEAD TO A NUMERICAL EXPLOSION IN THE FIRST TIME STEPS'
+ !callabortstop
+  CALL PRINT_MSG(NVERB_FATAL,'GEN','READ_EXSEG_n','')
+END IF
+!
+!        3.9  Numerical schemes
+!
+IF ( (CUVW_ADV_SCHEME == 'CEN4TH') .AND. &
+      (CTEMP_SCHEME /= 'LEFR') .AND. (CTEMP_SCHEME /= 'RKC4') ) THEN
+   WRITE(UNIT=ILUOUT,FMT=9003) KMI
+   WRITE(UNIT=ILUOUT,FMT='("CEN4TH SCHEME HAS TO BE USED WITH ",&
+    &"CTEMP_SCHEME = LEFR of RKC4 ONLY")')   
+ !callabortstop
+   CALL PRINT_MSG(NVERB_FATAL,'GEN','READ_EXSEG_n','')
+END IF
+!
+IF ( (CUVW_ADV_SCHEME == 'WENO_K') .AND. LNUMDIFU ) THEN
+   WRITE(UNIT=ILUOUT,FMT=9002) KMI
+   WRITE(UNIT=ILUOUT,FMT='("YOU WANT TO USE NUMERICAL DIFFUSION ",&
+    &"WITH WENO SCHEME ALREADY DIFFUSIVE")')   
+END IF
+!-------------------------------------------------------------------------------
+!
+!*       4.    CHECK COHERENCE BETWEEN EXSEG VARIABLES
+!              ---------------------------------------
+!        
+!*       4.1  coherence between coupling variables in EXSEG file  
+!                      
+IF (KMI == 1) THEN
+  NCPL_NBR = 0
+  DO JCI = 1,JPCPLFILEMAX
+    IF (LEN_TRIM(CCPLFILE(JCI)) /= 0) THEN        ! Finds the number 
+      NCPL_NBR = NCPL_NBR + 1                     ! of coupling files
+    ENDIF
+    IF (JCI/=JPCPLFILEMAX) THEN                   ! Deplaces the coupling files
+      IF ((LEN_TRIM(CCPLFILE(JCI)) == 0) .AND.   &! names if one missing
+          (LEN_TRIM(CCPLFILE(JCI+1)) /= 0)) THEN
+        DO JI=JCI,JPCPLFILEMAX-1
+          CCPLFILE(JI)=CCPLFILE(JI+1)
+        END DO
+        CCPLFILE(JPCPLFILEMAX)='    '
+      END IF
+    END IF
+  END DO
+!
+  IF (NCPL_NBR /= 0) THEN         
+    LSTEADYLS = .FALSE.
+  ELSE
+    LSTEADYLS = .TRUE.
+  ENDIF 
+END IF
+!        
+!*       4.3   check consistency in forcing switches
+!
+IF ( LFORCING ) THEN
+  IF ( LRELAX_THRV_FRC .AND. ( LTEND_THRV_FRC .OR. LGEOST_TH_FRC ) ) THEN
+    WRITE(UNIT=ILUOUT,FMT=9002) KMI
+    WRITE(ILUOUT,FMT=*) 'YOU CHOSE A TEMPERATURE AND HUMIDITY RELAXATION'
+    WRITE(ILUOUT,FMT=*) 'TOGETHER WITH TENDENCY OR GEOSTROPHIC FORCING'
+    WRITE(ILUOUT,FMT=*) &
+  'YOU MIGHT CHECK YOUR SWITCHES: LRELAX_THRV_FRC, LTEND_THRV_FRC, AND'
+    WRITE(ILUOUT,FMT=*) 'LGEOST_TH_FRC'
+  END IF
+!
+  IF ( LRELAX_UV_FRC .AND. LRELAX_UVMEAN_FRC) THEN
+    WRITE(UNIT=ILUOUT,FMT=9003) KMI
+    WRITE(ILUOUT,FMT=*) 'YOU MUST CHOOSE BETWEEN A RELAXATION APPLIED TO'
+    WRITE(ILUOUT,FMT=*) 'THE 3D FULL WIND FIELD (LRELAX_UV_FRC) OR'
+    WRITE(ILUOUT,FMT=*) 'THE HORIZONTAL MEAN WIND (LRELAX_UVMEAN_FRC)'
+ !callabortstop
+    CALL PRINT_MSG(NVERB_FATAL,'GEN','READ_EXSEG_n','')
+  END IF
+!
+  IF ( (LRELAX_UV_FRC .OR. LRELAX_UVMEAN_FRC) .AND. LGEOST_UV_FRC ) THEN
+    WRITE(UNIT=ILUOUT,FMT=9003) KMI
+    WRITE(ILUOUT,FMT=*) 'YOU MUST NOT USE A WIND RELAXATION' 
+    WRITE(ILUOUT,FMT=*) 'TOGETHER WITH A GEOSTROPHIC FORCING'
+    WRITE(ILUOUT,FMT=*) 'CHECK SWITCHES: LRELAX_UV_FRC, LRELAX_UVMEAN_FRC, LGEOST_UV_FRC'
+ !callabortstop
+    CALL PRINT_MSG(NVERB_FATAL,'GEN','READ_EXSEG_n','')
+  END IF
+!
+  IF ( CRELAX_HEIGHT_TYPE.NE."FIXE" .AND. CRELAX_HEIGHT_TYPE.NE."THGR" ) THEN
+    WRITE(UNIT=ILUOUT,FMT=9003) KMI
+    WRITE(ILUOUT,FMT=*) 'CRELAX_HEIGHT_TYPE MUST BE EITHER "FIXE" OR "THGR"'
+    WRITE(ILUOUT,FMT=*) 'BUT IT IS "', CRELAX_HEIGHT_TYPE, '"'
+ !callabortstop
+    CALL PRINT_MSG(NVERB_FATAL,'GEN','READ_EXSEG_n','')
+  END IF
+!
+  IF ( .NOT.LCORIO .AND. LGEOST_UV_FRC ) THEN
+    WRITE(UNIT=ILUOUT,FMT=9003) KMI
+    WRITE(ILUOUT,FMT=*) 'YOU CANNOT HAVE A GEOSTROPHIC FORCING WITHOUT'
+    WRITE(ILUOUT,FMT=*) 'ACTIVATING LCORIOLIS OPTION'
+ !callabortstop
+    CALL PRINT_MSG(NVERB_FATAL,'GEN','READ_EXSEG_n','')
+  END IF
+!
+  IF ( LPGROUND_FRC ) THEN
+    WRITE(ILUOUT,FMT=*) 'SURFACE PRESSURE FORCING NOT YET IMPLEMENTED'
+ !callabortstop
+    CALL PRINT_MSG(NVERB_FATAL,'GEN','READ_EXSEG_n','')
+  END IF
+!
+END IF
+!
+IF (LTRANS .AND. .NOT. LFLAT ) THEN
+    WRITE(UNIT=ILUOUT,FMT=9003) KMI
+    WRITE(ILUOUT,FMT=*) 'YOU ASK FOR A CONSTANT SPEED DOMAIN TRANSLATION '
+    WRITE(ILUOUT,FMT=*) 'BUT NOT IN THE FLAT TERRAIN CASE:'
+    WRITE(ILUOUT,FMT=*) 'THIS IS NOT ALLOWED ACTUALLY'
+ !callabortstop
+    CALL PRINT_MSG(NVERB_FATAL,'GEN','READ_EXSEG_n','')
+END IF
+!
+!*       4.4  Check the coherence between the LUSERn and LHORELAX
+!
+IF (.NOT. LUSERV .AND. LHORELAX_RV) THEN
+  LHORELAX_RV=.FALSE.
+  WRITE(UNIT=ILUOUT,FMT=9002) KMI
+  WRITE(ILUOUT,FMT=*) 'YOU WANT TO RELAX RV FIELD BUT IT DOES NOT EXIST.'
+  WRITE(ILUOUT,FMT=*) 'THEREFORE LHORELAX_RV=FALSE'
+END IF
+!
+IF (.NOT. LUSERC .AND. LHORELAX_RC) THEN
+  LHORELAX_RC=.FALSE.
+  WRITE(UNIT=ILUOUT,FMT=9002) KMI
+  WRITE(ILUOUT,FMT=*) 'YOU WANT TO RELAX RC FIELD BUT IT DOES NOT EXIST.'
+  WRITE(ILUOUT,FMT=*) 'THEREFORE LHORELAX_RC=FALSE'
+END IF
+!
+IF (.NOT. LUSERR .AND. LHORELAX_RR) THEN
+  LHORELAX_RR=.FALSE.
+  WRITE(UNIT=ILUOUT,FMT=9002) KMI
+  WRITE(ILUOUT,FMT=*) 'YOU WANT TO RELAX RR FIELD BUT IT DOES NOT EXIST.'
+  WRITE(ILUOUT,FMT=*) 'THEREFORE LHORELAX_RR=FALSE'
+END IF
+!
+IF (.NOT. LUSERI .AND. LHORELAX_RI) THEN
+  LHORELAX_RI=.FALSE.
+  WRITE(UNIT=ILUOUT,FMT=9002) KMI
+  WRITE(ILUOUT,FMT=*) 'YOU WANT TO RELAX RI FIELD BUT IT DOES NOT EXIST.'
+  WRITE(ILUOUT,FMT=*) 'THEREFORE LHORELAX_RI=FALSE'
+END IF
+!
+IF (.NOT. LUSERS .AND. LHORELAX_RS) THEN
+  LHORELAX_RS=.FALSE.
+  WRITE(UNIT=ILUOUT,FMT=9002) KMI
+  WRITE(ILUOUT,FMT=*) 'YOU WANT TO RELAX RS FIELD BUT IT DOES NOT EXIST.'
+  WRITE(ILUOUT,FMT=*) 'THEREFORE LHORELAX_RS=FALSE'
+END IF
+!
+IF (.NOT. LUSERG .AND. LHORELAX_RG) THEN
+  LHORELAX_RG=.FALSE.
+  WRITE(UNIT=ILUOUT,FMT=9002) KMI
+  WRITE(ILUOUT,FMT=*) 'YOU WANT TO RELAX RG FIELD BUT IT DOES NOT EXIST.'
+  WRITE(ILUOUT,FMT=*) 'THEREFORE LHORELAX_RG=FALSE'
+END IF
+!
+IF (.NOT. LUSERH .AND. LHORELAX_RH) THEN
+  LHORELAX_RH=.FALSE.
+  WRITE(UNIT=ILUOUT,FMT=9002) KMI
+  WRITE(ILUOUT,FMT=*) 'YOU WANT TO RELAX RH FIELD BUT IT DOES NOT EXIST.'
+  WRITE(ILUOUT,FMT=*) 'THEREFORE LHORELAX_RH=FALSE'
+END IF
+!
+IF (CTURB=='NONE' .AND. LHORELAX_TKE) THEN
+  LHORELAX_TKE=.FALSE.
+  WRITE(UNIT=ILUOUT,FMT=9002) KMI
+  WRITE(ILUOUT,FMT=*) 'YOU WANT TO RELAX TKE FIELD BUT IT DOES NOT EXIST.'
+  WRITE(ILUOUT,FMT=*) 'THEREFORE LHORELAX_TKE=FALSE'
+END IF
+!
+!
+IF (CCLOUD/='C2R2'  .AND. CCLOUD/='KHKO'  .AND. LHORELAX_SVC2R2) THEN
+  LHORELAX_SVC2R2=.FALSE.
+  WRITE(UNIT=ILUOUT,FMT=9002) KMI
+  WRITE(ILUOUT,FMT=*) 'YOU WANT TO RELAX C2R2 or KHKO FIELD BUT IT DOES NOT EXIST.'
+  WRITE(ILUOUT,FMT=*) 'THEREFORE LHORELAX_SVC2R2=FALSE'
+END IF
+!
+IF (CCLOUD/='C3R5' .AND. LHORELAX_SVC1R3) THEN
+  LHORELAX_SVC1R3=.FALSE.
+  WRITE(UNIT=ILUOUT,FMT=9002) KMI
+  WRITE(ILUOUT,FMT=*) 'YOU WANT TO RELAX C3R5 FIELD BUT IT DOES NOT EXIST.'
+  WRITE(ILUOUT,FMT=*) 'THEREFORE LHORELAX_SVC1R3=FALSE'
+END IF
+!
+IF (CCLOUD/='LIMA' .AND. LHORELAX_SVLIMA) THEN
+  LHORELAX_SVLIMA=.FALSE.
+  WRITE(UNIT=ILUOUT,FMT=9002) KMI
+  WRITE(ILUOUT,FMT=*) 'YOU WANT TO RELAX LIMA FIELD BUT IT DOES NOT EXIST.'
+  WRITE(ILUOUT,FMT=*) 'THEREFORE LHORELAX_SVLIMA=FALSE'
+END IF
+!
+IF (CELEC(1:3) /= 'ELE' .AND. LHORELAX_SVELEC) THEN
+  LHORELAX_SVELEC=.FALSE.
+  WRITE(UNIT=ILUOUT,FMT=9002) KMI
+  WRITE(ILUOUT,FMT=*) 'YOU WANT TO RELAX ELEC FIELD BUT IT DOES NOT EXIST.'
+  WRITE(ILUOUT,FMT=*) 'THEREFORE LHORELAX_SVELEC=FALSE'
+END IF
+!
+IF (.NOT. LUSECHEM .AND. LHORELAX_SVCHEM) THEN
+  LHORELAX_SVCHEM=.FALSE.
+  WRITE(UNIT=ILUOUT,FMT=9002) KMI
+  WRITE(ILUOUT,FMT=*) 'YOU WANT TO RELAX CHEM FIELD BUT IT DOES NOT EXIST.'
+  WRITE(ILUOUT,FMT=*) 'THEREFORE LHORELAX_SVCHEM=FALSE'
+END IF
+!
+IF (.NOT. LUSECHIC .AND. LHORELAX_SVCHIC) THEN
+  LHORELAX_SVCHIC=.FALSE.
+  WRITE(UNIT=ILUOUT,FMT=9002) KMI
+  WRITE(ILUOUT,FMT=*) 'YOU WANT TO RELAX ICE CHEM FIELD BUT IT DOES NOT EXIST.'
+  WRITE(ILUOUT,FMT=*) 'THEREFORE LHORELAX_SVCHIC=FALSE'
+END IF
+!
+IF (.NOT. LORILAM .AND. LHORELAX_SVAER) THEN
+  LHORELAX_SVAER=.FALSE.
+  WRITE(UNIT=ILUOUT,FMT=9002) KMI
+  WRITE(ILUOUT,FMT=*) 'YOU WANT TO RELAX AEROSOL FIELD BUT IT DOES NOT EXIST.'
+  WRITE(ILUOUT,FMT=*) 'THEREFORE LHORELAX_SVAER=FALSE'
+END IF
+
+IF (.NOT. LDUST .AND. LHORELAX_SVDST) THEN
+  LHORELAX_SVDST=.FALSE.
+  WRITE(UNIT=ILUOUT,FMT=9002) KMI
+  WRITE(ILUOUT,FMT=*) 'YOU WANT TO RELAX DUST FIELD BUT IT DOES NOT EXIST.'
+  WRITE(ILUOUT,FMT=*) 'THEREFORE LHORELAX_SVDST=FALSE'
+END IF
+
+IF (.NOT. LSALT .AND. LHORELAX_SVSLT) THEN
+  LHORELAX_SVSLT=.FALSE.
+  WRITE(UNIT=ILUOUT,FMT=9002) KMI
+  WRITE(ILUOUT,FMT=*) 'YOU WANT TO RELAX SEA SALT FIELD BUT IT DOES NOT EXIST.'
+  WRITE(ILUOUT,FMT=*) 'THEREFORE LHORELAX_SVSLT=FALSE'
+END IF
+
+IF (.NOT. LPASPOL .AND. LHORELAX_SVPP) THEN
+  LHORELAX_SVPP=.FALSE.
+  WRITE(UNIT=ILUOUT,FMT=9002) KMI
+  WRITE(ILUOUT,FMT=*) 'YOU WANT TO RELAX PASSIVE POLLUTANT FIELD BUT IT DOES NOT EXIST.'
+  WRITE(ILUOUT,FMT=*) 'THEREFORE LHORELAX_SVPP=FALSE'
+END IF
+#ifdef MNH_FOREFIRE
+IF (.NOT. LFOREFIRE .AND. LHORELAX_SVFF) THEN
+  LHORELAX_SVFF=.FALSE.
+  WRITE(UNIT=ILUOUT,FMT=9002) KMI
+  WRITE(ILUOUT,FMT=*) 'YOU WANT TO RELAX FOREFIRE FLUXES BUT THEY DO NOT EXIST.'
+  WRITE(ILUOUT,FMT=*) 'THEREFORE LHORELAX_SVFF=FALSE'
+END IF
+#endif
+IF (.NOT. LBLAZE .AND. LHORELAX_SVFIRE) THEN
+  LHORELAX_SVFIRE=.FALSE.
+  WRITE(UNIT=ILUOUT,FMT=9002) KMI
+  WRITE(ILUOUT,FMT=*) 'YOU WANT TO RELAX BLAZE FLUXES BUT THEY DO NOT EXIST.'
+  WRITE(ILUOUT,FMT=*) 'THEREFORE LHORELAX_SVFIRE=FALSE'
+END IF
+IF (.NOT. LCONDSAMP .AND. LHORELAX_SVCS) THEN
+  LHORELAX_SVCS=.FALSE.
+  WRITE(UNIT=ILUOUT,FMT=9002) KMI
+  WRITE(ILUOUT,FMT=*) 'YOU WANT TO RELAX CONDITIONAL SAMPLING FIELD BUT IT DOES NOT EXIST.'
+  WRITE(ILUOUT,FMT=*) 'THEREFORE LHORELAX_SVCS=FALSE'
+END IF
+
+IF (.NOT. LBLOWSNOW .AND. LHORELAX_SVSNW) THEN
+  LHORELAX_SVSNW=.FALSE.
+  WRITE(UNIT=ILUOUT,FMT=9002) KMI
+  WRITE(ILUOUT,FMT=*) 'YOU WANT TO RELAX BLOWING SNOW FIELD BUT IT DOES NOT EXIST.'
+  WRITE(ILUOUT,FMT=*) 'THEREFORE LHORELAX_SVSNW=FALSE'
+END IF
+
+IF (ANY(LHORELAX_SV(NSV+1:))) THEN
+  LHORELAX_SV(NSV+1:)=.FALSE.
+  WRITE(UNIT=ILUOUT,FMT=9002) KMI
+  WRITE(ILUOUT,FMT=*) 'YOU WANT TO RELAX SV(NSV+1:) FIELD BUT IT DOES NOT EXIST.'
+  WRITE(ILUOUT,FMT=*) 'THEREFORE LHORELAX_SV(NSV+1:)=FALSE'
+END IF
+!
+!*       4.5   check the number of points for the horizontal relaxation
+!
+IF ( NRIMX > KRIMX .AND. .NOT.LHORELAX_SVELEC ) THEN
+  NRIMX = KRIMX 
+  WRITE(UNIT=ILUOUT,FMT=9001) KMI
+  WRITE(ILUOUT,FMT=*) 'YOU WANT TO USE A LARGER NUMBER OF POINTS '
+  WRITE(ILUOUT,FMT=*) 'FOR THE HORIZONTAL RELAXATION THAN THE '
+  WRITE(ILUOUT,FMT=*) 'CORRESPONDING NUMBER OF LARGE SCALE FIELDS:'
+  WRITE(ILUOUT,FMT=*) 'IT IS THEREFORE REDUCED TO NRIMX =',NRIMX
+END IF
+!
+IF ( L2D .AND. KRIMY>0 ) THEN
+  NRIMY = 0 
+  WRITE(UNIT=ILUOUT,FMT=9001) KMI
+  WRITE(ILUOUT,FMT=*) 'YOU WANT TO USE A 2D MODEL THEREFORE  NRIMY=0 '
+END IF
+!
+IF ( NRIMY > KRIMY .AND. .NOT.LHORELAX_SVELEC ) THEN
+  NRIMY = KRIMY 
+  WRITE(UNIT=ILUOUT,FMT=9001) KMI
+  WRITE(ILUOUT,FMT=*) 'YOU WANT TO USE A LARGER NUMBER OF POINTS '
+  WRITE(ILUOUT,FMT=*) 'FOR THE HORIZONTAL RELAXATION THAN THE '
+  WRITE(ILUOUT,FMT=*) 'CORRESPONDING NUMBER OF LARGE SCALE FIELDS:'
+  WRITE(ILUOUT,FMT=*) 'IT IS THEREFORE REDUCED TO NRIMY =',NRIMY
+END IF
+!
+IF ( (.NOT. LHORELAX_UVWTH) .AND. (.NOT.(ANY(LHORELAX_SV))) .AND.  &
+     (.NOT. LHORELAX_SVC2R2).AND. (.NOT. LHORELAX_SVC1R3)   .AND.  &
+     (.NOT. LHORELAX_SVLIMA).AND.                                  &
+     (.NOT. LHORELAX_SVELEC).AND. (.NOT. LHORELAX_SVCHEM)   .AND.  &
+     (.NOT. LHORELAX_SVLG)  .AND. (.NOT. LHORELAX_SVPP)     .AND.  &
+     (.NOT. LHORELAX_SVCS)  .AND. (.NOT. LHORELAX_SVFIRE)   .AND.  &
+#ifdef MNH_FOREFIRE
+     (.NOT. LHORELAX_SVFF)  .AND.                                  &
+#endif
+     (.NOT. LHORELAX_RV)    .AND. (.NOT. LHORELAX_RC)       .AND.  &
+     (.NOT. LHORELAX_RR)    .AND. (.NOT. LHORELAX_RI)       .AND.  &
+     (.NOT. LHORELAX_RS)    .AND. (.NOT. LHORELAX_RG)       .AND.  &
+     (.NOT. LHORELAX_RH)    .AND. (.NOT. LHORELAX_TKE)      .AND.  &
+     (.NOT. LHORELAX_SVCHIC).AND.                                  &
+                                  (NRIMX /= 0 .OR. NRIMY /= 0))  THEN  
+  WRITE(UNIT=ILUOUT,FMT=9001) KMI
+  WRITE(ILUOUT,FMT=*) 'YOU DO NOT WANT TO USE THE HORIZONTAL RELAXATION '
+  WRITE(ILUOUT,FMT=*) 'THEREFORE NRIMX=NRIMY=0     '
+  NRIMX=0
+  NRIMY=0
+END IF
+!
+IF ((LHORELAX_UVWTH  .OR. LHORELAX_SVPP   .OR.  &
+     LHORELAX_SVCS   .OR. LHORELAX_SVFIRE .OR.  &
+#ifdef MNH_FOREFIRE
+     LHORELAX_SVFF   .OR.                       &
+#endif
+     LHORELAX_SVC2R2 .OR. LHORELAX_SVC1R3 .OR.  &
+     LHORELAX_SVLIMA .OR.                       &
+     LHORELAX_SVELEC .OR. LHORELAX_SVCHEM .OR.  &
+     LHORELAX_SVLG   .OR. ANY(LHORELAX_SV) .OR. &
+     LHORELAX_RV     .OR. LHORELAX_RC .OR.      &
+     LHORELAX_RR     .OR. LHORELAX_RI .OR.      &
+     LHORELAX_RG     .OR. LHORELAX_RS .OR.      &
+     LHORELAX_RH     .OR. LHORELAX_TKE.OR.      &
+     LHORELAX_SVCHIC )                          &
+     .AND. (NRIMX==0 .OR. (NRIMY==0 .AND. .NOT.(L2D) ))) THEN
+  WRITE(UNIT=ILUOUT,FMT=9003) KMI
+  WRITE(ILUOUT,FMT=*) 'YOU WANT TO USE THE HORIZONTAL RELAXATION '
+  WRITE(ILUOUT,FMT=*) 'BUT NRIMX OR NRIMY=0 CHANGE YOUR VALUES   '
+  WRITE(ILUOUT,FMT=*) "LHORELAX_UVWTH=",LHORELAX_UVWTH
+  WRITE(ILUOUT,FMT=*) "LHORELAX_SVC2R2=",LHORELAX_SVC2R2
+  WRITE(ILUOUT,FMT=*) "LHORELAX_SVC1R3=",LHORELAX_SVC1R3
+  WRITE(ILUOUT,FMT=*) "LHORELAX_SVLIMA=",LHORELAX_SVLIMA
+  WRITE(ILUOUT,FMT=*) "LHORELAX_SVELEC=",LHORELAX_SVELEC
+  WRITE(ILUOUT,FMT=*) "LHORELAX_SVCHEM=",LHORELAX_SVCHEM
+  WRITE(ILUOUT,FMT=*) "LHORELAX_SVCHIC=",LHORELAX_SVCHIC
+  WRITE(ILUOUT,FMT=*) "LHORELAX_SVLG=",LHORELAX_SVLG
+  WRITE(ILUOUT,FMT=*) "LHORELAX_SVPP=",LHORELAX_SVPP
+  WRITE(ILUOUT,FMT=*) "LHORELAX_SVFIRE=",LHORELAX_SVFIRE
+#ifdef MNH_FOREFIRE
+  WRITE(ILUOUT,FMT=*) "LHORELAX_SVFF=",LHORELAX_SVFF
+#endif
+  WRITE(ILUOUT,FMT=*) "LHORELAX_SVCS=",LHORELAX_SVCS
+  WRITE(ILUOUT,FMT=*) "LHORELAX_SV=",LHORELAX_SV
+  WRITE(ILUOUT,FMT=*) "LHORELAX_RV=",LHORELAX_RV
+  WRITE(ILUOUT,FMT=*) "LHORELAX_RC=",LHORELAX_RC
+  WRITE(ILUOUT,FMT=*) "LHORELAX_RR=",LHORELAX_RR
+  WRITE(ILUOUT,FMT=*) "LHORELAX_RI=",LHORELAX_RI
+  WRITE(ILUOUT,FMT=*) "LHORELAX_RG=",LHORELAX_RG
+  WRITE(ILUOUT,FMT=*) "LHORELAX_RS=",LHORELAX_RS
+  WRITE(ILUOUT,FMT=*) "LHORELAX_RH=",LHORELAX_RH
+  WRITE(ILUOUT,FMT=*) "LHORELAX_TKE=", LHORELAX_TKE
+  WRITE(ILUOUT,FMT=*) "NRIMX=",NRIMX
+  WRITE(ILUOUT,FMT=*) "NRIMY=",NRIMY
+  WRITE(ILUOUT,FMT=*) "L2D=",L2D
+ !callabortstop
+  CALL PRINT_MSG(NVERB_FATAL,'GEN','READ_EXSEG_n','')
+END IF
+! 
+IF ((LHORELAX_UVWTH  .OR. LHORELAX_SVPP  .OR.   &
+     LHORELAX_SVCS   .OR. LHORELAX_SVFIRE .OR.  &
+#ifdef MNH_FOREFIRE
+     LHORELAX_SVFF   .OR.                       &
+#endif
+     LHORELAX_SVC2R2 .OR. LHORELAX_SVC1R3 .OR.  &
+     LHORELAX_SVLIMA .OR.                       &
+     LHORELAX_SVELEC .OR. LHORELAX_SVCHEM .OR.  &
+     LHORELAX_SVLG   .OR. ANY(LHORELAX_SV) .OR. &
+     LHORELAX_RV     .OR. LHORELAX_RC .OR.      &
+     LHORELAX_RR     .OR. LHORELAX_RI .OR.      &
+     LHORELAX_RG     .OR. LHORELAX_RS .OR.      &
+     LHORELAX_RH     .OR. LHORELAX_TKE.OR.      &
+     LHORELAX_SVCHIC )                          &
+     .AND. (KMI /=1)) THEN
+  WRITE(UNIT=ILUOUT,FMT=9003) KMI
+  WRITE(ILUOUT,FMT=*) 'YOU WANT TO USE THE HORIZONTAL RELAXATION '
+  WRITE(ILUOUT,FMT=*) 'FOR A NESTED MODEL BUT THE COUPLING IS ALREADY DONE' 
+  WRITE(ILUOUT,FMT=*) 'BY THE GRID NESTING. CHANGE LHORELAX TO FALSE'
+ !callabortstop
+  CALL PRINT_MSG(NVERB_FATAL,'GEN','READ_EXSEG_n','')
+END IF
+!
+IF ((LHORELAX_UVWTH  .OR. LHORELAX_SVPP  .OR.   &
+     LHORELAX_SVCS   .OR. LHORELAX_SVFIRE .OR.  &
+#ifdef MNH_FOREFIRE
+     LHORELAX_SVFF   .OR.                       &
+#endif
+     LHORELAX_SVC2R2 .OR. LHORELAX_SVC1R3 .OR.  &
+     LHORELAX_SVLIMA .OR.                       &
+     LHORELAX_SVELEC .OR. LHORELAX_SVCHEM .OR.  &
+     LHORELAX_SVLG   .OR. ANY(LHORELAX_SV) .OR. &
+     LHORELAX_RV     .OR. LHORELAX_RC .OR.      &
+     LHORELAX_RR     .OR. LHORELAX_RI .OR.      &
+     LHORELAX_RG     .OR. LHORELAX_RS .OR.      &
+     LHORELAX_RH     .OR. LHORELAX_TKE.OR.      &
+     LHORELAX_SVCHIC )                          &
+     .AND. (CLBCX(1)=='CYCL'.OR.CLBCX(2)=='CYCL' &
+          .OR.CLBCY(1)=='CYCL'.OR.CLBCY(2)=='CYCL')) THEN
+  WRITE(UNIT=ILUOUT,FMT=9003) KMI
+  WRITE(ILUOUT,FMT=*) 'YOU WANT TO USE THE HORIZONTAL RELAXATION '
+  WRITE(ILUOUT,FMT=*) 'FOR CYCLIC CLBCX OR CLBCY VALUES' 
+  WRITE(ILUOUT,FMT=*) 'CHANGE LHORELAX TO FALSE'
+ !callabortstop
+  CALL PRINT_MSG(NVERB_FATAL,'GEN','READ_EXSEG_n','')
+END IF
+!
+IF (KMI==1) THEN
+  GRELAX = .NOT.(OUSERV)  .AND.  LUSERV  .AND. LHORELAX_RV
+ELSE
+  GRELAX = .NOT.(LUSERV_G(NDAD(KMI)))  .AND.  LUSERV_G(KMI).AND. LHORELAX_RV 
+END IF 
+!
+IF ( GRELAX )  THEN
+  LHORELAX_RV=.FALSE.
+  WRITE(UNIT=ILUOUT,FMT=9001) KMI
+  WRITE(ILUOUT,FMT=*) 'YOU WANT TO RELAX THE RV FIELD'
+  WRITE(ILUOUT,FMT=*) 'TOWARDS THE LARGE SCALE FIELD OF MODEL',NDAD(KMI)
+  WRITE(ILUOUT,FMT=*) 'BUT IT DOES NOT EXIST.'
+  WRITE(ILUOUT,FMT=*) 'THEREFORE LHORELAX_RV=FALSE'
+END IF
+!
+IF (KMI==1) THEN
+  GRELAX = .NOT.(OUSERC)  .AND.  LUSERC  .AND. LHORELAX_RC
+ELSE
+  GRELAX = .NOT.(LUSERC_G(NDAD(KMI)))  .AND.  LUSERC_G(KMI).AND. LHORELAX_RC 
+END IF 
+!
+IF ( GRELAX )  THEN
+  LHORELAX_RC=.FALSE.
+  WRITE(UNIT=ILUOUT,FMT=9001) KMI
+  WRITE(ILUOUT,FMT=*) 'YOU WANT TO RELAX THE RC FIELD'
+  WRITE(ILUOUT,FMT=*) 'TOWARDS THE LARGE SCALE FIELD OF MODEL',NDAD(KMI)
+  WRITE(ILUOUT,FMT=*) 'BUT IT DOES NOT EXIST.'
+  WRITE(ILUOUT,FMT=*) 'THEREFORE LHORELAX_RC=FALSE'
+END IF
+!
+IF (KMI==1) THEN
+  GRELAX = .NOT.(OUSERR)  .AND.  LUSERR  .AND. LHORELAX_RR
+ELSE
+  GRELAX = .NOT.(LUSERR_G(NDAD(KMI)))  .AND.  LUSERR_G(KMI).AND. LHORELAX_RR 
+END IF 
+!
+IF ( GRELAX )  THEN
+  LHORELAX_RR=.FALSE.
+  WRITE(UNIT=ILUOUT,FMT=9001) KMI
+  WRITE(ILUOUT,FMT=*) 'YOU WANT TO RELAX THE RR FIELD'
+  WRITE(ILUOUT,FMT=*) 'TOWARDS THE LARGE SCALE FIELD OF MODEL',NDAD(KMI)
+  WRITE(ILUOUT,FMT=*) 'BUT IT DOES NOT EXIST.'
+  WRITE(ILUOUT,FMT=*) 'THEREFORE LHORELAX_RR=FALSE'
+END IF
+!
+IF (KMI==1) THEN
+  GRELAX = .NOT.(OUSERI)  .AND.  LUSERI  .AND. LHORELAX_RI
+ELSE
+  GRELAX = .NOT.(LUSERI_G(NDAD(KMI)))  .AND.  LUSERI_G(KMI).AND. LHORELAX_RI 
+END IF 
+!
+IF ( GRELAX )  THEN
+  LHORELAX_RI=.FALSE.
+  WRITE(UNIT=ILUOUT,FMT=9001) KMI
+  WRITE(ILUOUT,FMT=*) 'YOU WANT TO RELAX THE RI FIELD'
+  WRITE(ILUOUT,FMT=*) 'TOWARDS THE LARGE SCALE FIELD OF MODEL',NDAD(KMI)
+  WRITE(ILUOUT,FMT=*) 'BUT IT DOES NOT EXIST.'
+  WRITE(ILUOUT,FMT=*) 'THEREFORE LHORELAX_RI=FALSE'
+END IF
+!
+IF (KMI==1) THEN
+  GRELAX = .NOT.(OUSERG)  .AND.  LUSERG  .AND. LHORELAX_RG
+ELSE
+  GRELAX = .NOT.(LUSERG_G(NDAD(KMI)))  .AND.  LUSERG_G(KMI).AND. LHORELAX_RG 
+END IF 
+!
+IF ( GRELAX )  THEN
+  LHORELAX_RG=.FALSE.
+  WRITE(UNIT=ILUOUT,FMT=9001) KMI
+  WRITE(ILUOUT,FMT=*) 'YOU WANT TO RELAX THE RG FIELD'
+  WRITE(ILUOUT,FMT=*) 'TOWARDS THE LARGE SCALE FIELD OF MODEL',NDAD(KMI)
+  WRITE(ILUOUT,FMT=*) 'BUT IT DOES NOT EXIST.'
+  WRITE(ILUOUT,FMT=*) 'THEREFORE LHORELAX_RG=FALSE'
+END IF
+!
+IF (KMI==1) THEN
+  GRELAX = .NOT.(OUSERH)  .AND.  LUSERH  .AND. LHORELAX_RH
+ELSE
+  GRELAX = .NOT.(LUSERH_G(NDAD(KMI)))  .AND.  LUSERH_G(KMI).AND. LHORELAX_RH 
+END IF 
+!
+IF ( GRELAX )  THEN
+  LHORELAX_RH=.FALSE.
+  WRITE(UNIT=ILUOUT,FMT=9001) KMI
+  WRITE(ILUOUT,FMT=*) 'YOU WANT TO RELAX THE RH FIELD'
+  WRITE(ILUOUT,FMT=*) 'TOWARDS THE LARGE SCALE FIELD OF MODEL',NDAD(KMI)
+  WRITE(ILUOUT,FMT=*) 'BUT IT DOES NOT EXIST.'
+  WRITE(ILUOUT,FMT=*) 'THEREFORE LHORELAX_RH=FALSE'
+END IF
+!
+IF (KMI==1) THEN
+  GRELAX = .NOT.(OUSERS)  .AND.  LUSERS  .AND. LHORELAX_RS
+ELSE
+  GRELAX = .NOT.(LUSERS_G(NDAD(KMI)))  .AND.  LUSERS_G(KMI).AND. LHORELAX_RS 
+END IF 
+!
+IF ( GRELAX )  THEN
+  LHORELAX_RS=.FALSE.
+  WRITE(UNIT=ILUOUT,FMT=9001) KMI
+  WRITE(ILUOUT,FMT=*) 'YOU WANT TO RELAX THE RS FIELD'
+  WRITE(ILUOUT,FMT=*) 'TOWARDS THE LARGE SCALE FIELD OF MODEL',NDAD(KMI)
+  WRITE(ILUOUT,FMT=*) 'BUT IT DOES NOT EXIST.'
+  WRITE(ILUOUT,FMT=*) 'THEREFORE LHORELAX_RS=FALSE'
+END IF
+!
+IF (KMI==1) THEN
+  GRELAX = HTURB=='NONE'  .AND.  LUSETKE(1).AND. LHORELAX_TKE
+ELSE
+  GRELAX = .NOT.(LUSETKE(NDAD(KMI)))  .AND.  LUSETKE(KMI) .AND. LHORELAX_TKE 
+END IF 
+!
+IF ( GRELAX )  THEN
+  LHORELAX_TKE=.FALSE.
+  WRITE(UNIT=ILUOUT,FMT=9001) KMI
+  WRITE(ILUOUT,FMT=*) 'YOU WANT TO RELAX THE TKE FIELD'
+  WRITE(ILUOUT,FMT=*) 'TOWARDS THE LARGE SCALE FIELD OF MODEL',NDAD(KMI)
+  WRITE(ILUOUT,FMT=*) 'BUT IT DOES NOT EXIST.'
+  WRITE(ILUOUT,FMT=*) 'THEREFORE LHORELAX_TKE=FALSE'
+END IF
+!
+!
+DO JSV = 1,NSV_USER
+!
+  IF (KMI==1) THEN
+    GRELAX = KSV_USER<JSV  .AND.  LUSESV(JSV,1).AND.  LHORELAX_SV(JSV) 
+  ELSE
+    GRELAX = .NOT.(LUSESV(JSV,NDAD(KMI))) .AND. LUSESV(JSV,KMI) .AND. LHORELAX_SV(JSV)   
+  END IF 
+  !
+  IF ( GRELAX )  THEN
+  LHORELAX_SV(JSV)=.FALSE.
+  WRITE(UNIT=ILUOUT,FMT=9001) KMI
+  WRITE(ILUOUT,FMT=*) 'YOU WANT TO RELAX THE ',JSV,'  SV FIELD'
+  WRITE(ILUOUT,FMT=*) 'TOWARDS THE LARGE SCALE FIELD OF MODEL',NDAD(KMI)
+  WRITE(ILUOUT,FMT=*) 'BUT IT DOES NOT EXIST.'
+  WRITE(ILUOUT,FMT=*) 'THEREFORE LHORELAX_SV(',JSV,')=FALSE'
+ END IF
+END DO
+!
+!*       4.6   consistency in LES diagnostics choices
+!
+IF (CLES_NORM_TYPE=='EKMA' .AND. .NOT. LCORIO) THEN
+  WRITE(UNIT=ILUOUT,FMT=9002) KMI
+  WRITE(ILUOUT,FMT=*) 'YOU WANT TO USE THE EKMAN NORMALIZATION'
+  WRITE(ILUOUT,FMT=*) 'BUT CORIOLIS FORCE IS NOT USED (LCORIO=.FALSE.)'
+  WRITE(ILUOUT,FMT=*) 'THEN, NO NORMALIZATION IS PERFORMED'
+  CLES_NORM_TYPE='NONE'
+END IF
+!
+!*       4.7  Check the coherence with LNUMDIFF
+!
+IF (L1D .AND. (LNUMDIFU .OR. LNUMDIFTH .OR. LNUMDIFSV) ) THEN
+  WRITE(UNIT=ILUOUT,FMT=9002) KMI
+  WRITE(ILUOUT,FMT=*) 'YOU WANT TO USE HORIZONTAL DIFFUSION '
+  WRITE(ILUOUT,FMT=*) 'BUT YOU ARE IN A COLUMN MODEL (L1D=.TRUE.).'
+  WRITE(ILUOUT,FMT=*) 'THEREFORE LNUMDIFU and LNUMDIFTH and LNUMDIFSV'
+  WRITE(ILUOUT,FMT=*) 'ARE SET TO FALSE'
+  LNUMDIFU=.FALSE.
+  LNUMDIFTH=.FALSE.
+  LNUMDIFSV=.FALSE.
+END IF
+!
+IF (.NOT. LNUMDIFTH .AND. LZDIFFU) THEN
+  WRITE(UNIT=ILUOUT,FMT=9002) KMI
+  WRITE(ILUOUT,FMT=*) 'YOU DO NOT WANT TO USE HORIZONTAL DIFFUSION (LNUMDIFTH=F)'
+  WRITE(ILUOUT,FMT=*) 'BUT YOU WANT TO USE Z-NUMERICAL DIFFUSION  '
+  WRITE(ILUOUT,FMT=*) 'THEREFORE LNUMDIFTH IS SET TO TRUE'
+  LNUMDIFTH=.TRUE.
+END IF
+!
+!*       4.8  Other
+!
+IF (XTNUDGING < 4.*XTSTEP) THEN
+  XTNUDGING = 4.*XTSTEP
+  WRITE(UNIT=ILUOUT,FMT=9002) KMI
+  WRITE(UNIT=ILUOUT,FMT='("TIME SCALE FOR NUDGING CAN NOT BE SMALLER THAN",  &
+                 &   " FOUR TIMES THE TIME STEP")')
+  WRITE(ILUOUT,FMT=*) 'XTNUDGING is SET TO ',XTNUDGING
+END IF
+!
+!
+IF (XWAY(KMI) == 3. ) THEN
+  XWAY(KMI) = 2.
+  WRITE(UNIT=ILUOUT,FMT=9002) KMI
+  WRITE(UNIT=ILUOUT,FMT='("XWAY=3 DOES NOT EXIST ANYMORE; ", &                               
+                 &   " IT IS REPLACED BY XWAY=2 ")')
+END IF
+!
+IF ( (KMI == 1) .AND. XWAY(KMI) /= 0. ) THEN
+  XWAY(KMI) = 0.
+  WRITE(UNIT=ILUOUT,FMT=9002) KMI
+  WRITE(UNIT=ILUOUT,FMT='("XWAY MUST BE EQUAL TO 0 FOR DAD MODEL")')   
+END IF
+!
+!JUANZ ZRESI solver need BSPLITTING 
+IF ( CPRESOPT == 'ZRESI' .AND. CSPLIT /= 'BSPLITTING' ) THEN
+  WRITE(UNIT=ILUOUT,FMT=9003) KMI
+  WRITE(UNIT=ILUOUT,FMT='("Paralleliez in Z solver CPRESOPT=ZRESI need also CSPLIT=BSPLITTING ")')
+  WRITE(ILUOUT,FMT=*) ' ERROR you have to set also CSPLIT=BSPLITTING '
+ !callabortstop
+  CALL PRINT_MSG(NVERB_FATAL,'GEN','READ_EXSEG_n','')
+END IF
+!
+IF ( LEN_TRIM(HINIFILEPGD)>0 ) THEN
+  IF ( CINIFILEPGD/=HINIFILEPGD ) THEN 
+    WRITE(UNIT=ILUOUT,FMT=9001) KMI
+    WRITE(ILUOUT,FMT=*) ' ERROR : in EXSEG1.nam, in NAM_LUNITn you have CINIFILEPGD= ',CINIFILEPGD
+    WRITE(ILUOUT,FMT=*) ' whereas in .des you have CINIFILEPGD= ',HINIFILEPGD
+    WRITE(ILUOUT,FMT=*) ' Please check your Namelist '
+    WRITE(ILUOUT,FMT=*) ' For example, you may have specified the un-nested PGD file instead of the nested PGD file '
+    WRITE(ILUOUT,FMT=*) 
+    WRITE(ILUOUT,FMT=*) '###############'
+    WRITE(ILUOUT,FMT=*) ' MESONH ABORTS'
+    WRITE(ILUOUT,FMT=*) '###############'
+    WRITE(ILUOUT,FMT=*) 
+ !callabortstop
+    CALL PRINT_MSG(NVERB_FATAL,'GEN','READ_EXSEG_n','')
+  END IF
+ELSE
+  CINIFILEPGD = ''
+!* note that after a spawning, there is no value for CINIFILEPGD in the .des file,
+!  so the checking cannot be made if the user starts a simulation directly from
+!  a spawned file (without the prep_real_case stage)
+END IF
+!-------------------------------------------------------------------------------
+!
+!*       5.    WE DO NOT FORGET TO UPDATE ALL DOLLARN NAMELIST VARIABLES
+!              ---------------------------------------------------------
+!
+CALL UPDATE_NAM_LUNITN
+CALL UPDATE_NAM_CONFN
+CALL UPDATE_NAM_DRAGTREEN
+CALL UPDATE_NAM_DRAGBLDGN
+CALL UPDATE_NAM_COUPLING_LEVELSN
+CALL UPDATE_NAM_DYNN
+CALL UPDATE_NAM_ADVN
+CALL UPDATE_NAM_PARAMN
+CALL UPDATE_NAM_PARAM_RADN
+#ifdef MNH_ECRAD
+CALL UPDATE_NAM_PARAM_ECRADN
+#endif
+CALL UPDATE_NAM_PARAM_KAFRN
+CALL UPDATE_NAM_LBCN
+CALL UPDATE_NAM_NUDGINGN
+CALL UPDATE_NAM_BLANKN
+CALL UPDATE_NAM_CH_MNHCN
+CALL UPDATE_NAM_CH_SOLVERN
+CALL UPDATE_NAM_SERIESN
+CALL UPDATE_NAM_BLOWSNOWN
+CALL UPDATE_NAM_PROFILERn
+CALL UPDATE_NAM_STATIONn
+CALL UPDATE_NAM_FIREn
+!-------------------------------------------------------------------------------
+WRITE(UNIT=ILUOUT,FMT='(/)')
+!-------------------------------------------------------------------------------
+!
+!*       6.    FORMATS
+!              -------
+!
+9000  FORMAT(/,'NOTE  IN READ_EXSEG FOR MODEL ', I2, ' : ',/, &
+             '--------------------------------')
+9001  FORMAT(/,'CAUTION ERROR IN READ_EXSEG FOR MODEL ', I2,' : ',/, &
+             '----------------------------------------' )
+9002  FORMAT(/,'WARNING IN READ_EXSEG FOR MODEL ', I2,' : ',/, &
+             '----------------------------------' )
+9003  FORMAT(/,'FATAL ERROR IN READ_EXSEG FOR MODEL ', I2,' : ',/, &
+             '--------------------------------------' )
+!
+!-------------------------------------------------------------------------------
+!
+END SUBROUTINE READ_EXSEG_n
diff --git a/src/PHYEX/ext/read_field.f90 b/src/PHYEX/ext/read_field.f90
new file mode 100644
index 0000000000000000000000000000000000000000..d86c67557c62c692ede13db25b29122ca62055f1
--- /dev/null
+++ b/src/PHYEX/ext/read_field.f90
@@ -0,0 +1,1700 @@
+!MNH_LIC Copyright 1994-2023 CNRS, Meteo-France and Universite Paul Sabatier
+!MNH_LIC This is part of the Meso-NH software governed by the CeCILL-C licence
+!MNH_LIC version 1. See LICENSE, CeCILL-C_V1-en.txt and CeCILL-C_V1-fr.txt
+!MNH_LIC for details. version 1.
+!-----------------------------------------------------------------
+!     ######################
+      MODULE MODI_READ_FIELD
+!     ######################
+!
+INTERFACE 
+!
+      SUBROUTINE READ_FIELD(KOCEMI,TPINIFILE,KIU,KJU,KKU,                    &
+            HGETTKET,HGETRVT,HGETRCT,HGETRRT,HGETRIT,HGETCIT,HGETZWS,        &
+            HGETRST,HGETRGT,HGETRHT,HGETSVT,HGETSRCT,HGETSIGS,HGETCLDFR,HGETICEFR, &
+            HGETBL_DEPTH,HGETSBL_DEPTH,HGETPHC,HGETPHR,HUVW_ADV_SCHEME,      &
+            HTEMP_SCHEME,KSIZELBX_ll,KSIZELBXU_ll,KSIZELBY_ll,KSIZELBYV_ll,  &
+            KSIZELBXTKE_ll,KSIZELBYTKE_ll,                                   &
+            KSIZELBXR_ll,KSIZELBYR_ll,KSIZELBXSV_ll,KSIZELBYSV_ll,           &
+            PUM,PVM,PWM,PDUM,PDVM,PDWM,                                      &
+            PUT,PVT,PWT,PTHT,PPABST,PTKET,PRTKEMS,                           &
+            PRT,PSVT,PZWS,PCIT,PDRYMASST,PDRYMASSS,                          &            
+            PSIGS,PSRCT,PCLDFR,PICEFR,PBL_DEPTH,PSBL_DEPTH,PWTHVMF,PPHC,PPHR, &
+            PLSUM,PLSVM,PLSWM,PLSTHM,PLSRVM, PLSZWSM,                        &
+            PLBXUM,PLBXVM,PLBXWM,PLBXTHM,PLBXTKEM,PLBXRM,PLBXSVM,            &
+            PLBYUM,PLBYVM,PLBYWM,PLBYTHM,PLBYTKEM,PLBYRM,PLBYSVM,            &
+            KFRC,TPDTFRC,PUFRC,PVFRC,PWFRC,PTHFRC,PRVFRC,                    &
+            PTENDTHFRC,PTENDRVFRC,PGXTHFRC,PGYTHFRC,PPGROUNDFRC,PATC,        &
+            PTENDUFRC,PTENDVFRC,                                             &
+            KADVFRC,TPDTADVFRC,PDTHFRC,PDRVFRC,                              &
+            KRELFRC,TPDTRELFRC, PTHREL, PRVREL,                              &
+            PVTH_FLUX_M,PWTH_FLUX_M,PVU_FLUX_M,                              &
+            PRUS_PRES,PRVS_PRES,PRWS_PRES,PRTHS_CLD,PRRS_CLD,PRSVS_CLD,      &
+            PIBM_LSF,PIBM_XMUT,PUMEANW,PVMEANW,PWMEANW,PUMEANN,PVMEANN,      &
+            PWMEANN,PUMEANE,PVMEANE,PWMEANE,PUMEANS,PVMEANS,PWMEANS,         &
+            PLSPHI,PBMAP,PFMASE,PFMAWC,PFMWINDU,PFMWINDV,PFMWINDW,PFMHWS     )
+!
+USE MODD_IO, ONLY : TFILEDATA
+USE MODD_TIME ! for type DATE_TIME
+!
+!
+INTEGER,                   INTENT(IN)  :: KOCEMI !Ocan model index
+TYPE(TFILEDATA),           INTENT(IN)  :: TPINIFILE    !Initial file
+INTEGER,                   INTENT(IN)  :: KIU, KJU, KKU
+                             ! array sizes in x, y and z  directions
+! 
+CHARACTER (LEN=*),         INTENT(IN)  :: HGETTKET,                          &
+                                          HGETRVT,HGETRCT,HGETRRT,           &
+                                          HGETRIT,HGETRST,HGETRGT,HGETRHT,   & 
+                                          HGETCIT,HGETSRCT, HGETZWS,         &
+                                          HGETSIGS, HGETCLDFR, HGETICEFR,    &
+                                          HGETBL_DEPTH, HGETSBL_DEPTH,       &
+                                          HGETPHC, HGETPHR
+CHARACTER (LEN=*), DIMENSION(:),INTENT(IN)  :: HGETSVT
+!
+! GET indicators to know wether a given  variable should or not be read in the
+! FM file at time t-deltat and t
+CHARACTER(LEN=6),         INTENT(IN)    :: HUVW_ADV_SCHEME ! advection scheme for wind
+CHARACTER(LEN=4),         INTENT(IN)    :: HTEMP_SCHEME ! advection scheme for wind
+!
+! sizes of the West-east total LB area
+INTEGER, INTENT(IN) :: KSIZELBX_ll,KSIZELBXU_ll      ! for T,V,W and u 
+INTEGER, INTENT(IN) :: KSIZELBXTKE_ll                ! for TKE 
+INTEGER, INTENT(IN) :: KSIZELBXR_ll,KSIZELBXSV_ll    ! for Rx and SV    
+! sizes of the North-south total LB area
+INTEGER, INTENT(IN) :: KSIZELBY_ll,KSIZELBYV_ll      ! for T,U,W  and v
+INTEGER, INTENT(IN) :: KSIZELBYTKE_ll                ! for TKE
+INTEGER, INTENT(IN) :: KSIZELBYR_ll,KSIZELBYSV_ll    ! for Rx and SV 
+REAL, DIMENSION(:,:,:),    INTENT(OUT) :: PUM,PVM,PWM     ! U,V,W at t-dt
+REAL, DIMENSION(:,:,:),    INTENT(OUT) :: PDUM,PDVM,PDWM  ! Difference on U,V,W 
+                                                          ! between t+dt and t-dt
+REAL, DIMENSION(:,:),      INTENT(OUT) :: PBL_DEPTH       ! BL depth
+REAL, DIMENSION(:,:),      INTENT(OUT) :: PSBL_DEPTH      ! SBL depth
+REAL, DIMENSION(:,:,:),    INTENT(OUT) :: PWTHVMF         ! MassFlux buoyancy flux
+!
+REAL, DIMENSION(:,:,:),    INTENT(OUT) :: PUT,PVT,PWT     ! U,V,W at t
+REAL, DIMENSION(:,:,:),    INTENT(OUT) :: PTHT,PTKET      ! theta, tke and
+REAL, DIMENSION(:,:,:),    INTENT(OUT) :: PRTKEMS         ! tke adv source
+REAL, DIMENSION(:,:,:),    INTENT(OUT) :: PPABST          ! pressure at t
+REAL, DIMENSION(:,:,:,:),  INTENT(OUT) :: PRT,PSVT        ! moist and scalar
+                                                          ! variables at t
+REAL, DIMENSION(:,:),      INTENT(INOUT) :: PZWS
+REAL, DIMENSION(:,:,:),    INTENT(OUT) :: PSRCT           ! turbulent flux
+                                                          !  <s'Rc'> at t 
+REAL, DIMENSION(:,:,:),    INTENT(OUT) :: PCIT            ! ice conc. at t
+REAL,                      INTENT(OUT) :: PDRYMASST       ! Md(t)
+REAL,                      INTENT(OUT) :: PDRYMASSS       ! d Md(t) / dt
+REAL, DIMENSION(:,:,:),    INTENT(OUT) :: PSIGS           ! =sqrt(<s's'>) for the
+                                                          ! Subgrid Condensation
+REAL, DIMENSION(:,:,:),    INTENT(OUT) :: PCLDFR          ! cloud fraction  
+REAL, DIMENSION(:,:,:),    INTENT(OUT) :: PICEFR          ! cloud fraction  
+REAL, DIMENSION(:,:,:),    INTENT(OUT) :: PPHC            ! pH value in cloud water  
+REAL, DIMENSION(:,:,:),    INTENT(OUT) :: PPHR            ! pH value in rainwater  
+! Larger Scale fields
+REAL, DIMENSION(:,:,:),          INTENT(OUT) :: PLSUM,PLSVM,PLSWM    ! Wind
+REAL, DIMENSION(:,:,:),          INTENT(OUT) :: PLSTHM,  PLSRVM      ! Mass
+! LB fields
+REAL, DIMENSION(:,:),            INTENT(OUT) :: PLSZWSM              ! significant height of sea waves
+REAL, DIMENSION(:,:,:),          INTENT(OUT) :: PLBXUM,PLBXVM,PLBXWM ! Wind
+REAL, DIMENSION(:,:,:),          INTENT(OUT) :: PLBXTHM              ! Mass
+REAL, DIMENSION(:,:,:),          INTENT(OUT) :: PLBYUM,PLBYVM,PLBYWM ! Wind
+REAL, DIMENSION(:,:,:),          INTENT(OUT) :: PLBYTHM              ! Mass
+REAL, DIMENSION(:,:,:),          INTENT(OUT) :: PLBXTKEM          ! TKE
+REAL, DIMENSION(:,:,:),          INTENT(OUT) :: PLBYTKEM
+REAL, DIMENSION(:,:,:,:),        INTENT(OUT) :: PLBXRM  ,PLBXSVM  ! Moisture and SV
+REAL, DIMENSION(:,:,:,:),        INTENT(OUT) :: PLBYRM  ,PLBYSVM  ! in x and y-dir.
+! Forcing fields
+INTEGER,                        INTENT(IN)    :: KFRC              ! number of forcing
+TYPE (DATE_TIME), DIMENSION(:), INTENT(OUT)   :: TPDTFRC           ! date of forcing profs.
+REAL, DIMENSION(:,:),           INTENT(OUT)   :: PUFRC,PVFRC,PWFRC ! forcing variables
+REAL, DIMENSION(:,:),           INTENT(OUT)   :: PTHFRC,PRVFRC
+REAL, DIMENSION(:,:),           INTENT(OUT) :: PTENDUFRC,PTENDVFRC
+REAL, DIMENSION(:,:),           INTENT(OUT)   :: PTENDTHFRC,PTENDRVFRC,PGXTHFRC,PGYTHFRC
+REAL, DIMENSION(:),             INTENT(OUT)   :: PPGROUNDFRC
+REAL, DIMENSION(:,:,:,:),       INTENT(OUT)   :: PATC
+INTEGER,                        INTENT(IN)    :: KADVFRC           ! number of forcing
+TYPE (DATE_TIME), DIMENSION(:), INTENT(OUT)   :: TPDTADVFRC        ! date of forcing profs.
+REAL, DIMENSION(:,:,:,:),       INTENT(OUT)   :: PDTHFRC, PDRVFRC
+INTEGER,                        INTENT(IN)    :: KRELFRC           ! number of forcing
+TYPE (DATE_TIME), DIMENSION(:), INTENT(OUT)   :: TPDTRELFRC        ! date of forcing profs.
+REAL, DIMENSION(:,:,:,:),       INTENT(OUT)   :: PTHREL, PRVREL
+REAL, DIMENSION(:,:,:),         INTENT(OUT)   :: PVTH_FLUX_M,PWTH_FLUX_M,PVU_FLUX_M ! Eddy fluxes
+REAL, DIMENSION(:,:,:),         INTENT(INOUT) :: PRUS_PRES, PRVS_PRES, PRWS_PRES
+REAL, DIMENSION(:,:,:),         INTENT(INOUT) :: PRTHS_CLD
+REAL, DIMENSION(:,:,:,:),       INTENT(INOUT) :: PRRS_CLD, PRSVS_CLD
+REAL, DIMENSION(:,:,:),         INTENT(INOUT) :: PIBM_LSF,PIBM_XMUT
+REAL, DIMENSION(:,:,:),         INTENT(INOUT) :: PUMEANW,PVMEANW,PWMEANW
+REAL, DIMENSION(:,:,:),         INTENT(INOUT) :: PUMEANN,PVMEANN,PWMEANN
+REAL, DIMENSION(:,:,:),         INTENT(INOUT) :: PUMEANE,PVMEANE,PWMEANE
+REAL, DIMENSION(:,:,:),         INTENT(INOUT) :: PUMEANS,PVMEANS,PWMEANS
+!
+! Fire Model fields
+REAL, DIMENSION(:,:,:),          INTENT(OUT) :: PLSPHI    ! Fire Model Level Set function Phi [-]
+REAL, DIMENSION(:,:,:),          INTENT(OUT) :: PBMAP     ! Fire Model Burning map [s]
+REAL, DIMENSION(:,:,:),          INTENT(OUT) :: PFMASE    ! Fire Model Available Sensible Energy [J/m2]
+REAL, DIMENSION(:,:,:),          INTENT(OUT) :: PFMAWC    ! Fire Model Available Water Content [kg/m2]
+REAL, DIMENSION(:,:,:),          INTENT(OUT) :: PFMWINDU  ! Fire Model filtered u wind [m/s]
+REAL, DIMENSION(:,:,:),          INTENT(OUT) :: PFMWINDV  ! Fire Model filtered v wind [m/s]
+REAL, DIMENSION(:,:,:),          INTENT(OUT) :: PFMWINDW  ! Fire Model filtered w wind [m/s]
+REAL, DIMENSION(:,:,:),          INTENT(OUT) :: PFMHWS    ! Fire Model filtered horizontal wind speed [m/s]
+!
+END SUBROUTINE READ_FIELD
+!
+END INTERFACE
+!
+END MODULE MODI_READ_FIELD
+!
+!     ########################################################################
+      SUBROUTINE READ_FIELD(KOCEMI,TPINIFILE,KIU,KJU,KKU,                    &
+            HGETTKET,HGETRVT,HGETRCT,HGETRRT,HGETRIT,HGETCIT,HGETZWS,        &
+            HGETRST,HGETRGT,HGETRHT,HGETSVT,HGETSRCT,HGETSIGS,HGETCLDFR,HGETICEFR, &
+            HGETBL_DEPTH,HGETSBL_DEPTH,HGETPHC,HGETPHR,HUVW_ADV_SCHEME,      &
+            HTEMP_SCHEME,KSIZELBX_ll,KSIZELBXU_ll,KSIZELBY_ll,KSIZELBYV_ll,  &
+            KSIZELBXTKE_ll,KSIZELBYTKE_ll,                                   &
+            KSIZELBXR_ll,KSIZELBYR_ll,KSIZELBXSV_ll,KSIZELBYSV_ll,           &
+            PUM,PVM,PWM,PDUM,PDVM,PDWM,                                      &
+            PUT,PVT,PWT,PTHT,PPABST,PTKET,PRTKEMS,                           &
+            PRT,PSVT,PZWS,PCIT,PDRYMASST,PDRYMASSS,                          &
+            PSIGS,PSRCT,PCLDFR,PICEFR,PBL_DEPTH,PSBL_DEPTH,PWTHVMF,PPHC,PPHR, &
+            PLSUM,PLSVM,PLSWM,PLSTHM,PLSRVM,PLSZWSM,                         &
+            PLBXUM,PLBXVM,PLBXWM,PLBXTHM,PLBXTKEM,PLBXRM,PLBXSVM,            &
+            PLBYUM,PLBYVM,PLBYWM,PLBYTHM,PLBYTKEM,PLBYRM,PLBYSVM,            &
+            KFRC,TPDTFRC,PUFRC,PVFRC,PWFRC,PTHFRC,PRVFRC,                    &
+            PTENDTHFRC,PTENDRVFRC,PGXTHFRC,PGYTHFRC,PPGROUNDFRC,PATC,        &
+            PTENDUFRC,PTENDVFRC,                                             &
+            KADVFRC,TPDTADVFRC,PDTHFRC,PDRVFRC,                              &
+            KRELFRC,TPDTRELFRC, PTHREL, PRVREL,                              &
+            PVTH_FLUX_M,PWTH_FLUX_M,PVU_FLUX_M,                              &
+            PRUS_PRES,PRVS_PRES,PRWS_PRES,PRTHS_CLD,PRRS_CLD,PRSVS_CLD,      &
+            PIBM_LSF,PIBM_XMUT,PUMEANW,PVMEANW,PWMEANW,PUMEANN,PVMEANN,      &
+            PWMEANN,PUMEANE,PVMEANE,PWMEANE,PUMEANS,PVMEANS,PWMEANS,         &
+            PLSPHI,PBMAP,PFMASE,PFMAWC,PFMWINDU,PFMWINDV,PFMWINDW,PFMHWS     )
+!     ########################################################################
+!
+!!****  *READ_FIELD* - routine to read prognostic and surface fields
+!!
+!!    PURPOSE
+!!    -------
+!       The purpose of this routine is to initialize  prognostic and 
+!     surface fields by reading their  value in initial file or by setting 
+!     them to a fixed value.
+!
+!!**  METHOD
+!!    ------
+!!      According to the get indicators, the prognostics fields are :
+!!          - initialized by reading their value in the LFIFM file 
+!!    if the corresponding indicators are equal to 'READ'  
+!!          - initialized to zero if the corresponding indicators 
+!!    are equal to 'INIT'
+!!          -  not initialized if their corresponding indicators 
+!!    are equal to 'SKIP'
+!!
+!!      In case of time step change, all fields at t-dt are (linearly)
+!!    interpolated to get a consistant initial state before the segment 
+!!    integration  
+!!
+!!    EXTERNAL
+!!    --------
+!!      FMREAD   : to read data in LFIFM file
+!!      INI_LS   : to initialize larger scale fields
+!!      INI_LB   : to initialize "2D" surfacic LB fields 
+!!       
+!!    IMPLICIT ARGUMENTS
+!!    ------------------ 
+!!      Module MODD_CONF   : NVERB,CCONF,CPROGRAM
+!!
+!!      Module MODD_CTURB :  XTKEMIN
+!!
+!!    REFERENCE
+!!    ---------
+!!      Book2 of the documentation (routine READ_FIELD)
+!!      
+!!
+!!    AUTHOR
+!!    ------
+!!  	V. Ducrocq       * Meteo France *
+!!
+!!    MODIFICATIONS
+!!    -------------
+!!      Original        15/06/94 
+!!      modification    22/11/94  add the pressure function (J.Stein)
+!!      modification    22/11/94  add the LS fields         (J.Stein)
+!!      modification    06/01/95  add Md(t)                 (J.P.Lafore)
+!!                      26/03/95  add EPS var               (J. Cuxart)
+!!                      30/06/95  add var related to the Subgrid condensation
+!!                                                                   (J.Stein)
+!!                      18/08/95  time step change case     (J.P.Lafore)
+!!                      01/03/96  add the cloud fraction    (J. Stein)
+!!     modification     13/12/95  add fmread of the forcing variables 
+!!                                                          (M.Georgelin)
+!!     modification     13/02/96  external control of the forcing (J.-P. Pinty)
+!!                      11/04/96  add the ice concentration (J.-P. Pinty)
+!!                      27/01/97  read ISVR 3D fields of SV (J.-P. Pinty)
+!!                      26/02/97  "surfacic" LS fieds  introduction (J.P.Lafore)
+!!          (V MASSON)  03/03/97  positivity control for time step change 
+!!                      10/04/97  proper treatment of minima for LS-fields (J.P.Lafore)
+!!           J. Stein   22/06/97  use the absolute pressure
+!!           J. Stein   22/10/97  cleaning + add the LB fields for u,v,w,theta,Rv
+!!          P. Bechtold 22/01/98  add SST and surface pressure forcing
+!!          V. Ducrocq  14/08/98  //,  remove KIINF,KJINF,KISUP,KJSUP,
+!!                                     and introduce INI_LS and INI_LB
+!!          J. Stein    22/01/99  add the reading of STORAGE_TYPE to improve
+!!                                the START case when the file contains 2
+!!                                instants MT
+!!          D. Gazen    22/01/01  use MODD_NSV to handle NSV floating indices
+!!                                for the current model
+!!          V. Masson   01/2004   removes surface (externalization)
+!!       J.-P. Pinty    06/05/04  treat NSV_* for C1R3 and ELEC
+!!                      05/06     Remove EPS
+!!          M. Leriche  04/10     add pH in cloud water and rainwater
+!!          M. Leriche  07/10     treat NSV_* for ice phase chemical species
+!!          C.Lac       11/11     Suppress all the t-Dt fields
+!!          M.Tomasini, 
+!!          P. Peyrille   06/12   2D west african monsoon : add reading of ADV forcing and addy fluxes 
+!!          C.Lac       03/13     add prognostic supersaturation for C2R2/KHKO
+!!          Bosseur & Filippi 07/13 Adds Forefire
+!!          M. Leriche  11/14     correct bug in pH initialization
+!!          C.Lac       12/14     correction for reproducibility START/RESTA
+!!      Modification    01/2016  (JP Pinty) Add LIMA
+!!          M. Leriche  02/16     treat gas and aq. chemicals separately
+!!          C.Lac        10/16 CEN4TH with RKC4 + Correction on RK loop
+!!                   09/2017 Q.Rodier add LTEND_UV_FRC
+!!  Philippe Wautelet: 05/2016-04/2018: new data structures and calls for I/O
+!  V. Vionnet       07/17:   add blowing snow scheme
+!  P. Wautelet    01/2019:  corrected intent of PDUM,PDVM,PDWM (OUT->INOUT)
+!  P. Wautelet 13/02/2019: removed PPABSM and PTSTEP dummy arguments (bugfix: PPABSM was intent(OUT))
+!  S. Bielli      02/2019:  Sea salt : significant sea wave height influences salt emission; 5 salt modes
+!  P. Wautelet 14/03/2019: correct ZWS when variable not present in file
+!  M. Leriche  10/06/2019: in restart case read all immersion modes for LIMA
+!  B. Vie         06/2020: Add prognostic supersaturation for LIMA
+!  F. Auguste     02/2021: add fields necessary for IBM
+!  T. Nagel       02/2021: add fields necessary for turbulence recycling
+!  JL. Redelsperger 03/2021:  add necessary variables for Ocean LES case
+!  A. Costes      12/2021: add Blaze fire model
+!  P. Wautelet 04/02/2022: use TSVLIST to manage metadata of scalar variables
+!!-------------------------------------------------------------------------------
+!
+!*       0.    DECLARATIONS
+!              ------------
+!
+USE MODD_2D_FRC,          ONLY: L2D_ADV_FRC, L2D_REL_FRC
+USE MODD_ADV_n,           ONLY: CTEMP_SCHEME, LSPLIT_CFL
+USE MODD_BLOWSNOW_n,      ONLY: XSNWCANO
+USE MODD_CONF,            ONLY: CCONF, CPROGRAM, L1D, LFORCING, NVERB
+USE MODD_CONF_n,          ONLY: IDX_RVT, IDX_RCT, IDX_RRT, IDX_RIT, IDX_RST, IDX_RGT, IDX_RHT
+USE MODD_CST,             ONLY: XALPW, XBETAW, XCPD, XGAMW, XMD, XMV, XP00, XRD
+USE MODD_TURB_n,          ONLY: XTKEMIN
+USE MODD_DYN_n,           ONLY: LOCEAN
+use modd_field,           only: tfieldmetadata, tfieldlist, NMNHDIM_NI, NMNHDIM_NJ, NMNHDIM_NOTLISTED, &
+                                TYPEDATE, TYPEREAL, TYPELOG, TYPEINT
+USE MODD_FIELD_n,         only: XZWS_DEFAULT
+USE MODD_FIRE_n,          ONLY: CWINDFILTER, LBLAZE, LRESTA_ASE, LRESTA_AWC, LRESTA_EWAM, LRESTA_WLIM, LWINDFILTER
+USE MODD_IBM_PARAM_n,     ONLY: LIBM
+USE MODD_IO,              ONLY: TFILEDATA
+USE MODD_LATZ_EDFLX,      ONLY: LTH_FLX, LUV_FLX
+USE MODD_LUNIT_N,         ONLY: TLUOUT
+USE MODD_NSV,             ONLY: NSV, NSV_C2R2BEG, NSV_C2R2END, NSV_CSBEG, NSV_CSEND, &
+#ifdef MNH_FOREFIRE
+                                NSV_FFBEG, NSV_FFEND,                                &
+#endif
+                                NSV_PPBEG, NSV_PPEND, NSV_SNW, NSV_USER, TSVLIST
+USE MODD_OCEANH,          ONLY: NFRCLT, NINFRT, XSSOLA_T, XSSUFL_T, XSSTFL_T, XSSVFL_T
+USE MODD_PARAM_C2R2,      ONLY: LSUPSAT
+USE MODD_PARAMETERS,      ONLY: XUNDEF
+USE MODD_PARAM_n,         ONLY: CSCONV
+USE MODD_RECYCL_PARAM_n,  ONLY: LRECYCLE, LRECYCLN, LRECYCLS, LRECYCLW, NR_COUNT
+USE MODD_REF,             ONLY: LCOUPLES
+USE MODD_TIME,            ONLY: DATE_TIME
+!
+use mode_field,           only: Find_field_id_from_mnhname
+USE MODE_IO_FIELD_READ,   only: IO_Field_read
+USE MODE_MSG
+USE MODE_TOOLS,           ONLY: UPCASE
+!
+USE MODI_INI_LB
+USE MODI_INI_LS
+!
+IMPLICIT NONE
+!
+!*       0.1   declarations of arguments
+!
+!
+!
+INTEGER,                   INTENT(IN)  :: KOCEMI !Ocan model index
+TYPE(TFILEDATA),           INTENT(IN)  :: TPINIFILE    !Initial file
+INTEGER,                   INTENT(IN)  :: KIU, KJU, KKU
+                             ! array sizes in x, y and z  directions
+! 
+CHARACTER (LEN=*),         INTENT(IN)  :: HGETTKET,                          &
+                                          HGETRVT,HGETRCT,HGETRRT,           &
+                                          HGETRIT,HGETRST,HGETRGT,HGETRHT,   & 
+                                          HGETCIT,HGETSRCT, HGETZWS,         &
+                                          HGETSIGS, HGETCLDFR, HGETICEFR,    &
+                                          HGETBL_DEPTH, HGETSBL_DEPTH,       &
+                                          HGETPHC, HGETPHR
+CHARACTER (LEN=*), DIMENSION(:),INTENT(IN)  :: HGETSVT
+!
+! GET indicators to know wether a given  variable should or not be read in the
+! FM file at time t-deltat and t
+!
+CHARACTER(LEN=6),         INTENT(IN)    :: HUVW_ADV_SCHEME ! advection scheme for wind
+CHARACTER(LEN=4),         INTENT(IN)    :: HTEMP_SCHEME ! advection scheme for wind
+!
+! sizes of the West-east total LB area
+INTEGER, INTENT(IN) :: KSIZELBX_ll,KSIZELBXU_ll      ! for T,V,W and u 
+INTEGER, INTENT(IN) :: KSIZELBXTKE_ll                ! for TKE 
+INTEGER, INTENT(IN) :: KSIZELBXR_ll,KSIZELBXSV_ll    ! for Rx and SV    
+! sizes of the North-south total LB area
+INTEGER, INTENT(IN) :: KSIZELBY_ll,KSIZELBYV_ll      ! for T,U,W  and v
+INTEGER, INTENT(IN) :: KSIZELBYTKE_ll                ! for TKE
+INTEGER, INTENT(IN) :: KSIZELBYR_ll,KSIZELBYSV_ll    ! for Rx and SV 
+!
+REAL, DIMENSION(:,:,:),    INTENT(OUT) :: PUM,PVM,PWM     ! U,V,W at t-dt
+REAL, DIMENSION(:,:,:),    INTENT(INOUT) :: PDUM,PDVM,PDWM  ! Difference on U,V,W
+                                                          ! between t+dt and t-dt
+REAL, DIMENSION(:,:),      INTENT(OUT) :: PBL_DEPTH       ! BL depth
+REAL, DIMENSION(:,:),      INTENT(OUT) :: PSBL_DEPTH      ! SBL depth
+REAL, DIMENSION(:,:,:),    INTENT(OUT) :: PWTHVMF         ! MassFlux buoyancy flux
+!
+REAL, DIMENSION(:,:,:),    INTENT(OUT) :: PUT,PVT,PWT     ! U,V,W at t
+REAL, DIMENSION(:,:,:),    INTENT(OUT) :: PTHT,PTKET      ! theta, tke and
+REAL, DIMENSION(:,:,:),    INTENT(OUT) :: PRTKEMS         ! tke adv source
+REAL, DIMENSION(:,:,:),    INTENT(OUT) :: PPABST          ! pressure at t
+REAL, DIMENSION(:,:,:,:),  INTENT(OUT) :: PRT,PSVT        ! moist and scalar
+                                                          ! variables at t
+REAL, DIMENSION(:,:),      INTENT(INOUT) :: PZWS
+REAL, DIMENSION(:,:,:),    INTENT(OUT) :: PSRCT           ! turbulent flux
+                                                          !  <s'Rc'> at t 
+REAL, DIMENSION(:,:,:),    INTENT(OUT) :: PCIT            ! ice conc. at t
+REAL,                      INTENT(OUT) :: PDRYMASST       ! Md(t)
+REAL,                      INTENT(OUT) :: PDRYMASSS       ! d Md(t) / dt
+REAL, DIMENSION(:,:,:),    INTENT(OUT) :: PSIGS           ! =sqrt(<s's'>) for the
+                                                          ! Subgrid Condensation
+REAL, DIMENSION(:,:,:),    INTENT(OUT) :: PCLDFR          ! cloud fraction  
+REAL, DIMENSION(:,:,:),    INTENT(OUT) :: PICEFR          ! cloud fraction  
+REAL, DIMENSION(:,:,:),    INTENT(OUT) :: PPHC            ! pH value in cloud water  
+REAL, DIMENSION(:,:,:),    INTENT(OUT) :: PPHR            ! pH value in rainwater  
+!
+!
+! Larger Scale fields
+REAL, DIMENSION(:,:),            INTENT(OUT) :: PLSZWSM              ! significant height of sea waves
+REAL, DIMENSION(:,:,:),          INTENT(OUT) :: PLSUM,PLSVM,PLSWM    ! Wind
+REAL, DIMENSION(:,:,:),          INTENT(OUT) :: PLSTHM,  PLSRVM      ! Mass
+REAL, DIMENSION(:,:,:),          INTENT(OUT) :: PLBXUM,PLBXVM,PLBXWM ! Wind
+REAL, DIMENSION(:,:,:),          INTENT(OUT) :: PLBXTHM              ! Mass
+REAL, DIMENSION(:,:,:),          INTENT(OUT) :: PLBYUM,PLBYVM,PLBYWM ! Wind
+REAL, DIMENSION(:,:,:),          INTENT(OUT) :: PLBYTHM              ! Mass
+REAL, DIMENSION(:,:,:),          INTENT(OUT) :: PLBXTKEM          ! TKE
+REAL, DIMENSION(:,:,:),          INTENT(OUT) :: PLBYTKEM
+REAL, DIMENSION(:,:,:,:),        INTENT(OUT) :: PLBXRM  ,PLBXSVM  ! Moisture and SV
+REAL, DIMENSION(:,:,:,:),        INTENT(OUT) :: PLBYRM  ,PLBYSVM  ! in x and y-dir.
+!
+!       
+! Forcing fields
+INTEGER,                        INTENT(IN)    :: KFRC              ! number of forcing
+TYPE (DATE_TIME), DIMENSION(:), INTENT(OUT)   :: TPDTFRC           ! date of forcing profs.
+REAL, DIMENSION(:,:),           INTENT(OUT)   :: PUFRC,PVFRC,PWFRC ! forcing variables
+REAL, DIMENSION(:,:),           INTENT(OUT)   :: PTHFRC,PRVFRC
+REAL, DIMENSION(:,:),           INTENT(OUT) :: PTENDUFRC,PTENDVFRC
+REAL, DIMENSION(:,:),           INTENT(OUT)   :: PTENDTHFRC,PTENDRVFRC,PGXTHFRC,PGYTHFRC
+REAL, DIMENSION(:),             INTENT(OUT)   :: PPGROUNDFRC
+REAL, DIMENSION(:,:,:,:),       INTENT(OUT)   :: PATC
+INTEGER,                        INTENT(IN)    :: KADVFRC           ! number of forcing
+TYPE (DATE_TIME), DIMENSION(:), INTENT(OUT)   :: TPDTADVFRC        ! date of forcing profs.
+REAL, DIMENSION(:,:,:,:),       INTENT(OUT)   :: PDTHFRC, PDRVFRC
+INTEGER,                        INTENT(IN)    :: KRELFRC           ! number of forcing
+TYPE (DATE_TIME), DIMENSION(:), INTENT(OUT)   :: TPDTRELFRC        ! date of forcing profs.
+REAL, DIMENSION(:,:,:,:),       INTENT(OUT)   :: PTHREL, PRVREL
+REAL, DIMENSION(:,:,:),         INTENT(OUT)   :: PVTH_FLUX_M,PWTH_FLUX_M,PVU_FLUX_M ! Eddy fluxes
+REAL, DIMENSION(:,:,:),         INTENT(INOUT) :: PRUS_PRES, PRVS_PRES, PRWS_PRES
+REAL, DIMENSION(:,:,:),         INTENT(INOUT) :: PRTHS_CLD
+REAL, DIMENSION(:,:,:,:),       INTENT(INOUT) :: PRRS_CLD, PRSVS_CLD
+REAL, DIMENSION(:,:,:),         INTENT(INOUT) :: PIBM_LSF          ! LSF for IBM
+REAL, DIMENSION(:,:,:),         INTENT(INOUT) :: PIBM_XMUT         ! Turbulent viscosity
+REAL, DIMENSION(:,:,:),         INTENT(INOUT) :: PUMEANW,PVMEANW,PWMEANW ! Velocity average at West boundary
+REAL, DIMENSION(:,:,:),         INTENT(INOUT) :: PUMEANN,PVMEANN,PWMEANN ! Velocity average at North boundary
+REAL, DIMENSION(:,:,:),         INTENT(INOUT) :: PUMEANE,PVMEANE,PWMEANE ! Velocity average at East boundary
+REAL, DIMENSION(:,:,:),         INTENT(INOUT) :: PUMEANS,PVMEANS,PWMEANS ! Velocity average at South boundary
+! Fire Model fields
+REAL, DIMENSION(:,:,:),          INTENT(OUT) :: PLSPHI    ! Fire Model Level Set function Phi [-]
+REAL, DIMENSION(:,:,:),          INTENT(OUT) :: PBMAP     ! Fire Model Burning map [s]
+REAL, DIMENSION(:,:,:),          INTENT(OUT) :: PFMASE    ! Fire Model Available Sensible Energy [J/m2]
+REAL, DIMENSION(:,:,:),          INTENT(OUT) :: PFMAWC    ! Fire Model Available Water Content [kg/m2]
+REAL, DIMENSION(:,:,:),          INTENT(OUT) :: PFMWINDU  ! Fire Model filtered u wind [m/s]
+REAL, DIMENSION(:,:,:),          INTENT(OUT) :: PFMWINDV  ! Fire Model filtered v wind [m/s]
+REAL, DIMENSION(:,:,:),          INTENT(OUT) :: PFMWINDW  ! Fire Model filtered v wind [m/s]
+REAL, DIMENSION(:,:,:),          INTENT(OUT) :: PFMHWS    ! Fire Model filtered horizontal wind speed [m/s]
+!
+!*       0.2   declarations of local variables
+!
+INTEGER                      :: IID
+INTEGER                      :: ILUOUT       ! Unit number for prints
+INTEGER                      :: IRESP
+INTEGER                      :: ISV          ! total number of  scalar variables
+INTEGER                      :: JSV          ! Loop index for additional scalar variables
+INTEGER                      :: JKLOOP,JRR   ! Loop indexes
+INTEGER                      :: IIUP,IJUP    ! size  of working window arrays
+INTEGER                      :: JT           ! loop index
+LOGICAL                      :: GLSOURCE     ! switch for the source term (for ini_ls and ini_lb)
+LOGICAL                      :: ZLRECYCL     ! switch if turbulence recycling is activated
+LOGICAL                      :: GOLDFILEFORMAT
+CHARACTER(LEN=3)             :: YFRC         ! To mark the different forcing dates
+CHARACTER(LEN=3)             :: YNUM3
+CHARACTER(LEN=15)            :: YVAL
+REAL, DIMENSION(KIU,KJU,KKU) :: ZWORK        ! to compute supersaturation
+TYPE(TFIELDMETADATA)         :: TZFIELD
+!
+!-------------------------------------------------------------------------------
+!
+!*       1.    INITIALIZATION
+!              ---------------
+!
+GLSOURCE=.FALSE.
+ZWORK = 0.0
+!
+!If TPINIFILE file was written with a MesoNH version < 5.6, some variables had different names or were not available
+GOLDFILEFORMAT = (        TPINIFILE%NMNHVERSION(1) < 5                                       &
+                   .OR. ( TPINIFILE%NMNHVERSION(1) == 5 .AND. TPINIFILE%NMNHVERSION(2) < 6 ) )
+!-------------------------------------------------------------------------------
+!
+!*       2.    READ PROGNOSTIC VARIABLES
+!              -------------------------
+!
+!*       2.1  Time t:
+!
+IF (TPINIFILE%NMNHVERSION(1)<5) THEN
+  CALL FIND_FIELD_ID_FROM_MNHNAME('UT',IID,IRESP)
+  TZFIELD = TFIELDMETADATA( TFIELDLIST(IID) )
+  TZFIELD%CMNHNAME = 'UM'
+  CALL IO_Field_read(TPINIFILE,TZFIELD,PUT)
+  !
+  CALL FIND_FIELD_ID_FROM_MNHNAME('VT',IID,IRESP)
+  TZFIELD = TFIELDMETADATA( TFIELDLIST(IID) )
+  TZFIELD%CMNHNAME = 'VM'
+  CALL IO_Field_read(TPINIFILE,TZFIELD,PVT)
+  !
+  CALL FIND_FIELD_ID_FROM_MNHNAME('WT',IID,IRESP)
+  TZFIELD = TFIELDMETADATA( TFIELDLIST(IID) )
+  TZFIELD%CMNHNAME = 'WM'
+  CALL IO_Field_read(TPINIFILE,TZFIELD,PWT)
+  !
+  CALL FIND_FIELD_ID_FROM_MNHNAME('THT',IID,IRESP)
+  TZFIELD = TFIELDMETADATA( TFIELDLIST(IID) )
+  TZFIELD%CMNHNAME = 'THM'
+  CALL IO_Field_read(TPINIFILE,TZFIELD,PTHT)
+  !
+  CALL FIND_FIELD_ID_FROM_MNHNAME('PABST',IID,IRESP)
+  TZFIELD = TFIELDMETADATA( TFIELDLIST(IID) )
+  TZFIELD%CMNHNAME = 'PABSM'
+  CALL IO_Field_read(TPINIFILE,TZFIELD,PPABST)
+ELSE
+  CALL IO_Field_read(TPINIFILE,'UT',PUT)
+  CALL IO_Field_read(TPINIFILE,'VT',PVT)
+  CALL IO_Field_read(TPINIFILE,'WT',PWT)
+  CALL IO_Field_read(TPINIFILE,'THT',PTHT)
+  CALL IO_Field_read(TPINIFILE,'PABST',PPABST)
+ENDIF
+!
+SELECT CASE(HGETTKET)                   
+  CASE('READ')
+    IF (TPINIFILE%NMNHVERSION(1)<5) THEN
+      CALL FIND_FIELD_ID_FROM_MNHNAME('TKET',IID,IRESP)
+      TZFIELD = TFIELDMETADATA( TFIELDLIST(IID) )
+      TZFIELD%CMNHNAME = 'TKEM'
+      CALL IO_Field_read(TPINIFILE,TZFIELD,PTKET)
+    ELSE
+      CALL IO_Field_read(TPINIFILE,'TKET',PTKET)
+    END IF
+    IF ( ( (TPINIFILE%NMNHVERSION(1)==5 .AND. TPINIFILE%NMNHVERSION(2)>0) .OR. TPINIFILE%NMNHVERSION(1)>5 ) &
+        .AND. (CCONF == 'RESTA') .AND. LSPLIT_CFL) THEN
+      CALL IO_Field_read(TPINIFILE,'TKEMS',PRTKEMS)
+    END IF
+  CASE('INIT')
+    PTKET(:,:,:)   = XTKEMIN
+    PRTKEMS(:,:,:) = 0.
+END SELECT 
+!
+SELECT CASE(HGETZWS)
+  CASE('READ')
+    CALL IO_Field_read(TPINIFILE,'ZWS',PZWS,IRESP)
+    !If the field ZWS is not in the file, set its value to XZWS_DEFAULT
+    !ZWS is present in files since MesoNH 5.4.2
+    IF ( IRESP/=0 ) THEN
+      WRITE (YVAL,'( E15.8 )') XZWS_DEFAULT
+      CALL PRINT_MSG(NVERB_WARNING,'IO','READ_FIELD','ZWS not found in file: using default value: '//TRIM(YVAL)//' m')
+      PZWS(:,:) = XZWS_DEFAULT
+    END IF
+
+  CASE('INIT')
+    PZWS(:,:)=0.
+END SELECT 
+!
+SELECT CASE(HGETRVT)             ! vapor
+  CASE('READ')
+    IF (TPINIFILE%NMNHVERSION(1)<5) THEN
+      CALL FIND_FIELD_ID_FROM_MNHNAME('RVT',IID,IRESP)
+      TZFIELD = TFIELDMETADATA( TFIELDLIST(IID) )
+      TZFIELD%CMNHNAME = 'RVM'
+      CALL IO_Field_read(TPINIFILE,TZFIELD,PRT(:,:,:,IDX_RVT))
+    ELSE
+      CALL IO_Field_read(TPINIFILE,'RVT',PRT(:,:,:,IDX_RVT))
+    END IF
+  CASE('INIT')
+    PRT(:,:,:,IDX_RVT) = 0.
+END SELECT 
+!
+SELECT CASE(HGETRCT)             ! cloud 
+  CASE('READ') 
+    IF (TPINIFILE%NMNHVERSION(1)<5) THEN
+      CALL FIND_FIELD_ID_FROM_MNHNAME('RCT',IID,IRESP)
+      TZFIELD = TFIELDMETADATA( TFIELDLIST(IID) )
+      TZFIELD%CMNHNAME = 'RCM'
+      CALL IO_Field_read(TPINIFILE,TZFIELD,PRT(:,:,:,IDX_RCT))
+    ELSE
+      CALL IO_Field_read(TPINIFILE,'RCT',PRT(:,:,:,IDX_RCT))
+    END IF
+  CASE('INIT')
+    PRT(:,:,:,IDX_RCT) = 0.
+END SELECT
+!
+SELECT CASE(HGETRRT)             ! rain 
+  CASE('READ') 
+    IF (TPINIFILE%NMNHVERSION(1)<5) THEN
+      CALL FIND_FIELD_ID_FROM_MNHNAME('RRT',IID,IRESP)
+      TZFIELD = TFIELDMETADATA( TFIELDLIST(IID) )
+      TZFIELD%CMNHNAME = 'RRM'
+      CALL IO_Field_read(TPINIFILE,TZFIELD,PRT(:,:,:,IDX_RRT))
+    ELSE
+      CALL IO_Field_read(TPINIFILE,'RRT',PRT(:,:,:,IDX_RRT))
+    END IF 
+  CASE('INIT')
+    PRT(:,:,:,IDX_RRT) = 0.
+END SELECT
+!
+SELECT CASE(HGETRIT)             ! cloud ice
+  CASE('READ') 
+    IF (TPINIFILE%NMNHVERSION(1)<5) THEN
+      CALL FIND_FIELD_ID_FROM_MNHNAME('RIT',IID,IRESP)
+      TZFIELD = TFIELDMETADATA( TFIELDLIST(IID) )
+      TZFIELD%CMNHNAME = 'RIM'
+      CALL IO_Field_read(TPINIFILE,TZFIELD,PRT(:,:,:,IDX_RIT))
+    ELSE
+      CALL IO_Field_read(TPINIFILE,'RIT',PRT(:,:,:,IDX_RIT))
+    END IF 
+  CASE('INIT')
+    PRT(:,:,:,IDX_RIT) = 0.
+END SELECT
+!
+SELECT CASE(HGETRST)             ! snow
+  CASE('READ')
+    IF (TPINIFILE%NMNHVERSION(1)<5) THEN
+      CALL FIND_FIELD_ID_FROM_MNHNAME('RST',IID,IRESP)
+      TZFIELD = TFIELDMETADATA( TFIELDLIST(IID) )
+      TZFIELD%CMNHNAME = 'RSM'
+      CALL IO_Field_read(TPINIFILE,TZFIELD,PRT(:,:,:,IDX_RST))
+    ELSE
+      CALL IO_Field_read(TPINIFILE,'RST',PRT(:,:,:,IDX_RST))
+    END IF 
+  CASE('INIT')
+    PRT(:,:,:,IDX_RST) = 0.
+END SELECT
+!
+SELECT CASE(HGETRGT)             ! graupel
+  CASE('READ') 
+    IF (TPINIFILE%NMNHVERSION(1)<5) THEN
+      CALL FIND_FIELD_ID_FROM_MNHNAME('RGT',IID,IRESP)
+      TZFIELD = TFIELDMETADATA( TFIELDLIST(IID) )
+      TZFIELD%CMNHNAME = 'RGM'
+      CALL IO_Field_read(TPINIFILE,TZFIELD,PRT(:,:,:,IDX_RGT))
+    ELSE
+      CALL IO_Field_read(TPINIFILE,'RGT',PRT(:,:,:,IDX_RGT))
+    END IF 
+  CASE('INIT')
+    PRT(:,:,:,IDX_RGT) = 0.
+END SELECT
+!
+SELECT CASE(HGETRHT)             ! hail
+  CASE('READ') 
+    IF (TPINIFILE%NMNHVERSION(1)<5) THEN
+      CALL FIND_FIELD_ID_FROM_MNHNAME('RHT',IID,IRESP)
+      TZFIELD = TFIELDMETADATA( TFIELDLIST(IID) )
+      TZFIELD%CMNHNAME = 'RHM'
+      CALL IO_Field_read(TPINIFILE,TZFIELD,PRT(:,:,:,IDX_RHT))
+    ELSE
+      CALL IO_Field_read(TPINIFILE,'RHT',PRT(:,:,:,IDX_RHT))
+    END IF 
+  CASE('INIT')
+    PRT(:,:,:,IDX_RHT) = 0.
+END SELECT
+!
+SELECT CASE(HGETCIT)             ! ice concentration
+  CASE('READ')
+    IF (SIZE(PCIT) /= 0 ) CALL IO_Field_read(TPINIFILE,'CIT',PCIT)
+  CASE('INIT')
+    PCIT(:,:,:)=0.
+END SELECT
+!
+IF (LIBM .AND. CPROGRAM=='MESONH') THEN
+   !
+  TZFIELD = TFIELDMETADATA( &
+    CMNHNAME   = 'LSFP',    &
+    CLONGNAME  = 'LSFP',    &
+    CSTDNAME   = '',        &
+    CUNITS     = 'm',       &
+    CDIR       = 'XY',      &
+    NGRID      = 1,         &
+    NTYPE      = TYPEREAL,  &
+    NDIMS      = 3,         &
+    LTIMEDEP   = .TRUE.     )
+   !
+   CALL IO_Field_read(TPINIFILE,TZFIELD,PIBM_LSF)
+   !
+  TZFIELD = TFIELDMETADATA( &
+    CMNHNAME   = 'XMUT',    &
+    CLONGNAME  = 'XMUT',    &
+    CSTDNAME   = '',        &
+    CUNITS     = 'm2 s-1',  &
+    CDIR       = 'XY',      &
+    NGRID      = 1,         &
+    NTYPE      = TYPEREAL,  &
+    NDIMS      = 3,         &
+    LTIMEDEP   = .TRUE.     )
+   !
+   CALL IO_Field_read(TPINIFILE,TZFIELD,PIBM_XMUT)
+   !
+ENDIF
+!
+TZFIELD = TFIELDMETADATA(   &
+  CMNHNAME   = 'RECYCLING', &
+  CLONGNAME  = 'RECYCLING', &
+  CSTDNAME   = '',          &
+  CUNITS     = '',          &
+  CDIR       = '--',        &
+  CCOMMENT   = '',          &
+  NGRID      = 1,           &
+  NTYPE      = TYPELOG,     &
+  NDIMS      = 0,           &
+  LTIMEDEP   = .FALSE.      )
+CALL IO_Field_read(TPINIFILE,TZFIELD,ZLRECYCL,IRESP)
+!If field not found (file from older version of MesoNH) => set ZLRECYCL to false
+IF ( IRESP /= 0 ) ZLRECYCL = .FALSE.
+
+IF (ZLRECYCL) THEN
+  !
+    TZFIELD = TFIELDMETADATA(                                  &
+      CMNHNAME   = 'RCOUNT',                                   &
+      CLONGNAME  = 'RCOUNT',                                   &
+      CSTDNAME   = '',                                         &
+      CUNITS     = '',                                         &
+      CDIR       = '--',                                       &
+      NGRID      = 1,                                          &
+      NTYPE      = TYPEINT,                                    &
+      NDIMS      = 0,                                          &
+      LTIMEDEP   = .TRUE.,                                     &
+      CCOMMENT   = 'Incremental counter for averaging purpose' )
+  CALL IO_Field_read(TPINIFILE,TZFIELD,NR_COUNT)
+  !
+  IF (NR_COUNT .NE. 0) THEN
+    IF (LRECYCLW) THEN 
+      TZFIELD = TFIELDMETADATA(                                   &
+        CMNHNAME   = 'URECYCLW',                                  &
+        CLONGNAME  = 'URECYCLW',                                  &
+        CSTDNAME   = '',                                          &
+        CUNITS     = 'm s-1',                                     &
+        CDIR       = 'XY',                                        &
+        NGRID      = 2,                                           &
+        NTYPE      = TYPEREAL,                                    &
+        NDIMS      = 3,                                           &
+        NDIMLIST   = [ NMNHDIM_NI, NMNHDIM_NJ, NMNHDIM_NOTLISTED ], &
+        LTIMEDEP   = .TRUE.,                                      &
+        CCOMMENT   = 'UMEAN-WEST side plan for recycling purpose' )
+      CALL IO_Field_read(TPINIFILE,TZFIELD,PUMEANW)
+      !
+    TZFIELD = TFIELDMETADATA(                                   &
+        CMNHNAME   = 'VRECYCLW',                                  &
+        CLONGNAME  = 'VRECYCLW',                                  &
+        CSTDNAME   = '',                                          &
+        CUNITS     = 'm s-1',                                     &
+        CDIR       = 'XY',                                        &
+        NGRID      = 3,                                           &
+        NTYPE      = TYPEREAL,                                    &
+        NDIMS      = 3,                                           &
+        NDIMLIST   = [ NMNHDIM_NI, NMNHDIM_NJ, NMNHDIM_NOTLISTED ], &
+        LTIMEDEP   = .TRUE.,                                      &
+        CCOMMENT   = 'VMEAN-WEST side plan for recycling purpose' )
+      CALL IO_Field_read(TPINIFILE,TZFIELD,PVMEANW)
+      !
+      TZFIELD = TFIELDMETADATA(                                   &
+        CMNHNAME   = 'WRECYCLW',                                  &
+        CLONGNAME  = 'WRECYCLW',                                  &
+        CSTDNAME   = '',                                          &
+        CUNITS     = 'm s-1',                                     &
+        CDIR       = 'XY',                                        &
+        NGRID      = 4,                                           &
+        NTYPE      = TYPEREAL,                                    &
+        NDIMS      = 3,                                           &
+        NDIMLIST   = [ NMNHDIM_NI, NMNHDIM_NJ, NMNHDIM_NOTLISTED ], &
+        LTIMEDEP   = .TRUE.,                                      &
+        CCOMMENT   = 'WMEAN-WEST side plan for recycling purpose' )
+      CALL IO_Field_read(TPINIFILE,TZFIELD,PWMEANW)
+      !
+    ENDIF  
+    IF (LRECYCLN) THEN
+      TZFIELD = TFIELDMETADATA(                                    &
+        CMNHNAME   = 'URECYCLN',                                   &
+        CLONGNAME  = 'URECYCLN',                                   &
+        CSTDNAME   = '',                                           &
+        CUNITS     = 'm s-1',                                      &
+        CDIR       = 'XY',                                         &
+        NGRID      = 2,                                            &
+        NTYPE      = TYPEREAL,                                     &
+        NDIMS      = 3,                                            &
+        NDIMLIST   = [ NMNHDIM_NI, NMNHDIM_NJ, NMNHDIM_NOTLISTED ], &
+        LTIMEDEP   = .TRUE.,                                       &
+        CCOMMENT   = 'UMEAN-NORTH side plan for recycling purpose' )
+      CALL IO_Field_read(TPINIFILE,TZFIELD,PUMEANN)
+      !
+      TZFIELD = TFIELDMETADATA(                                    &
+        CMNHNAME   = 'VRECYCLN',                                   &
+        CLONGNAME  = 'VRECYCLN',                                   &
+        CSTDNAME   = '',                                           &
+        CUNITS     = 'm s-1',                                      &
+        CDIR       = 'XY',                                         &
+        NGRID      = 3,                                            &
+        NTYPE      = TYPEREAL,                                     &
+        NDIMS      = 3,                                            &
+        NDIMLIST   = [ NMNHDIM_NI, NMNHDIM_NJ, NMNHDIM_NOTLISTED ], &
+        LTIMEDEP   = .TRUE.,                                       &
+        CCOMMENT   = 'VMEAN-NORTH side plan for recycling purpose' )
+      CALL IO_Field_read(TPINIFILE,TZFIELD,PVMEANN)
+      !
+      TZFIELD = TFIELDMETADATA(                                    &
+        CMNHNAME   = 'WRECYCLN',                                   &
+        CLONGNAME  = 'WRECYCLN',                                   &
+        CSTDNAME   = '',                                           &
+        CUNITS     = 'm s-1',                                      &
+        CDIR       = 'XY',                                         &
+        NGRID      = 4,                                            &
+        NTYPE      = TYPEREAL,                                     &
+        NDIMS      = 3,                                            &
+        NDIMLIST   = [ NMNHDIM_NI, NMNHDIM_NJ, NMNHDIM_NOTLISTED ], &
+        LTIMEDEP   = .TRUE.,                                       &
+        CCOMMENT   = 'WMEAN-NORTH side plan for recycling purpose' )
+      CALL IO_Field_read(TPINIFILE,TZFIELD,PWMEANN)
+      !
+    ENDIF
+    IF (LRECYCLE) THEN  
+      TZFIELD = TFIELDMETADATA(                                   &
+        CMNHNAME   = 'URECYCLE',                                  &
+        CLONGNAME  = 'URECYCLE',                                  &
+        CSTDNAME   = '',                                          &
+        CUNITS     = 'm s-1',                                     &
+        CDIR       = 'XY',                                        &
+        NGRID      = 2,                                           &
+        NTYPE      = TYPEREAL,                                    &
+        NDIMS      = 3,                                           &
+        NDIMLIST   = [ NMNHDIM_NI, NMNHDIM_NJ, NMNHDIM_NOTLISTED ], &
+        LTIMEDEP   = .TRUE.,                                      &
+        CCOMMENT   = 'UMEAN-EAST side plan for recycling purpose' )
+      CALL IO_Field_read(TPINIFILE,TZFIELD,PUMEANE)
+      !
+      TZFIELD = TFIELDMETADATA(                                   &
+        CMNHNAME   = 'VRECYCLE',                                  &
+        CLONGNAME  = 'VRECYCLE',                                  &
+        CSTDNAME   = '',                                          &
+        CUNITS     = 'm s-1',                                     &
+        CDIR       = 'XY',                                        &
+        NGRID      = 3,                                           &
+        NTYPE      = TYPEREAL,                                    &
+        NDIMS      = 3,                                           &
+        NDIMLIST   = [ NMNHDIM_NI, NMNHDIM_NJ, NMNHDIM_NOTLISTED ], &
+        LTIMEDEP   = .TRUE.,                                      &
+        CCOMMENT   = 'VMEAN-EAST side plan for recycling purpose' )
+      CALL IO_Field_read(TPINIFILE,TZFIELD,PVMEANE)
+      !
+      TZFIELD = TFIELDMETADATA(                                   &
+        CMNHNAME   = 'WRECYCLE',                                  &
+        CLONGNAME  = 'WRECYCLE',                                  &
+        CSTDNAME   = '',                                          &
+        CUNITS     = 'm s-1',                                     &
+        CDIR       = 'XY',                                        &
+        NGRID      = 4,                                           &
+        NTYPE      = TYPEREAL,                                    &
+        NDIMS      = 3,                                           &
+        NDIMLIST   = [ NMNHDIM_NI, NMNHDIM_NJ, NMNHDIM_NOTLISTED ], &
+        LTIMEDEP   = .TRUE.,                                      &
+        CCOMMENT   = 'WMEAN-EAST side plan for recycling purpose' )
+      CALL IO_Field_read(TPINIFILE,TZFIELD,PWMEANE)
+      !
+    ENDIF  
+    IF (LRECYCLS) THEN
+      TZFIELD = TFIELDMETADATA(                                    &
+        CMNHNAME   = 'URECYCLS',                                   &
+        CLONGNAME  = 'URECYCLS',                                   &
+        CSTDNAME   = '',                                           &
+        CUNITS     = 'm s-1',                                      &
+        CDIR       = 'XY',                                         &
+        NGRID      = 2,                                            &
+        NTYPE      = TYPEREAL,                                     &
+        NDIMS      = 3,                                            &
+        NDIMLIST   = [ NMNHDIM_NI, NMNHDIM_NJ, NMNHDIM_NOTLISTED ], &
+        LTIMEDEP   = .TRUE.,                                       &
+        CCOMMENT   = 'UMEAN-SOUTH side plan for recycling purpose' )
+      CALL IO_Field_read(TPINIFILE,TZFIELD,PUMEANS)
+      !
+      TZFIELD = TFIELDMETADATA(                                    &
+        CMNHNAME   = 'VRECYCLS',                                   &
+        CLONGNAME  = 'VRECYCLS',                                   &
+        CSTDNAME   = '',                                           &
+        CUNITS     = 'm s-1',                                      &
+        CDIR       = 'XY',                                         &
+        NGRID      = 3,                                            &
+        NTYPE      = TYPEREAL,                                     &
+        NDIMS      = 3,                                            &
+        NDIMLIST   = [ NMNHDIM_NI, NMNHDIM_NJ, NMNHDIM_NOTLISTED ], &
+        LTIMEDEP   = .TRUE.,                                       &
+        CCOMMENT   = 'VMEAN-SOUTH side plan for recycling purpose' )
+      CALL IO_Field_read(TPINIFILE,TZFIELD,PVMEANS)
+      !
+      TZFIELD = TFIELDMETADATA(                                    &
+        CMNHNAME   = 'WRECYCLS',                                   &
+        CLONGNAME  = 'WRECYCLS',                                   &
+        CSTDNAME   = '',                                           &
+        CUNITS     = 'm s-1',                                      &
+        CDIR       = 'XY',                                         &
+        NGRID      = 4,                                            &
+        NTYPE      = TYPEREAL,                                     &
+        NDIMS      = 3,                                            &
+        NDIMLIST   = [ NMNHDIM_NI, NMNHDIM_NJ, NMNHDIM_NOTLISTED ], &
+        LTIMEDEP   = .TRUE.,                                       &
+        CCOMMENT   = 'WMEAN-SOUTH side plan for recycling purpose' )
+      CALL IO_Field_read(TPINIFILE,TZFIELD,PWMEANS)
+    ENDIF
+  ENDIF  
+ENDIF
+
+! Blaze fire model
+IF (LBLAZE .AND. CCONF=='RESTA') THEN
+  ! Blaze is not compliant with MNHVERSION(1)<5
+  ! Blaze begins with MNH 5.3.1
+  CALL IO_Field_read(TPINIFILE,'FMPHI',PLSPHI,IRESP)
+  IF (IRESP /= 0) PLSPHI(:,:,:) = 0.
+  CALL IO_Field_read(TPINIFILE,'FMBMAP',PBMAP,IRESP)
+  IF (IRESP /= 0) PBMAP(:,:,:) = -1.
+  CALL IO_Field_read(TPINIFILE,'FMASE',PFMASE,IRESP)
+  IF(IRESP == 0) THEN
+    ! flag for the use of restart value for ASE initialization
+    LRESTA_ASE = .TRUE.
+  ELSE
+    CALL PRINT_MSG( NVERB_WARNING, 'IO', 'READ_FIELD', 'PFMASE set to 0' )
+    PFMASE(:,:,:) = 0.
+  END IF
+  CALL IO_Field_read(TPINIFILE,'FMAWC',PFMAWC,IRESP)
+  ! flag for the use of restart value for AWC initialization
+  IF(IRESP == 0) THEN
+    LRESTA_AWC = .TRUE.
+  ELSE
+    CALL PRINT_MSG( NVERB_WARNING, 'IO', 'READ_FIELD', 'PFMAWC set to 0' )
+    PFMAWC(:,:,:) = 0.
+  END IF
+  ! read wind on fire grid if present
+  IF (LWINDFILTER) THEN
+    ! read in file only if wind filtering is required
+    SELECT CASE(CWINDFILTER)
+    CASE('EWAM')
+      ! read u
+      CALL IO_Field_read(TPINIFILE,'FMWINDU',PFMWINDU,IRESP)
+      ! flag for EWAM filtered u wind
+      IF(IRESP == 0) THEN
+        LRESTA_EWAM = .TRUE.
+      ELSE
+        CALL PRINT_MSG( NVERB_WARNING, 'IO', 'READ_FIELD', 'PFMWINDU set to 0' )
+        PFMWINDU(:,:,:) = 0.
+      END IF
+      ! read v
+      CALL IO_Field_read(TPINIFILE,'FMWINDV',PFMWINDV,IRESP)
+      ! flag for EWAM filtered v wind
+      IF(IRESP == 0 .AND. LRESTA_EWAM) THEN
+        ! u and v fields found
+        LRESTA_EWAM = .TRUE.
+      ELSE
+        ! u or v fields NOT found
+        LRESTA_EWAM = .FALSE.
+      END IF
+      IF (IRESP /= 0) THEN
+        CALL PRINT_MSG( NVERB_WARNING, 'IO', 'READ_FIELD', 'PFMWINDV set to 0' )
+        PFMWINDV(:,:,:) = 0.
+      END IF
+      ! read w
+      CALL IO_Field_read(TPINIFILE,'FMWINDW',PFMWINDW,IRESP)
+      ! flag for EWAM filtered w wind
+      IF(IRESP == 0 .AND. LRESTA_EWAM) THEN
+        ! u and v and w fields found
+        LRESTA_EWAM = .TRUE.
+      ELSE
+        ! u or v or w fields NOT found
+        LRESTA_EWAM = .FALSE.
+      END IF
+      IF (IRESP /= 0) THEN
+        CALL PRINT_MSG( NVERB_WARNING, 'IO', 'READ_FIELD', 'PFMWINDW set to 0' )
+        PFMWINDW(:,:,:) = 0.
+      END IF
+
+    CASE('WLIM')
+      CALL IO_Field_read(TPINIFILE,'FMHWS',PFMHWS,IRESP)
+      ! flag for WLIM filtered horizontal wind speed
+      IF(IRESP == 0) THEN
+        LRESTA_WLIM = .TRUE.
+      ELSE
+        CALL PRINT_MSG( NVERB_WARNING, 'IO', 'READ_FIELD', 'PFMHWS set to 0' )
+        PFMHWS(:,:,:) = 0.
+      END IF
+    END SELECT
+  END IF
+END IF
+!
+!  Scalar Variables Reading : Users, C2R2, C1R3, LIMA, ELEC, Chemical SV
+!
+ISV= SIZE(PSVT,4)
+!
+DO JSV = 1, NSV              ! initialize according to the get indicators
+  SELECT CASE( HGETSVT(JSV) )
+    CASE ('READ')
+      TZFIELD = TSVLIST(JSV)
+
+      IF ( GOLDFILEFORMAT ) THEN
+        IF ( ( JSV >= 1         .AND. JSV <= NSV_USER  ) .OR. &
+             ( JSV >= NSV_PPBEG .AND. JSV <= NSV_PPEND ) .OR. &
+#ifdef MNH_FOREFIRE
+             ( JSV >= NSV_FFBEG .AND. JSV <= NSV_FFEND ) .OR. &
+#endif
+             ( JSV >= NSV_CSBEG .AND. JSV <= NSV_CSEND )      ) THEN
+          !Some variables were written with an other name in MesoNH < 5.6
+          WRITE(TZFIELD%CMNHNAME,'(A3,I3.3)')'SVT',JSV
+          TZFIELD%CLONGNAME  = TRIM(TZFIELD%CMNHNAME)
+          TZFIELD%CSTDNAME   = ''
+          TZFIELD%CCOMMENT   = 'X_Y_Z_'//TRIM(TZFIELD%CMNHNAME)
+        ELSE
+          !Scalar variables were written with a T suffix in older versions
+          TZFIELD%CMNHNAME  = TRIM( TZFIELD%CMNHNAME )  // 'T'
+          TZFIELD%CLONGNAME = TRIM( TZFIELD%CLONGNAME ) // 'T'
+        END IF
+      END IF
+
+      CALL IO_Field_read( TPINIFILE, TZFIELD, PSVT(:,:,:,JSV), IRESP )
+
+      IF ( IRESP /= 0 ) THEN
+        CALL PRINT_MSG( NVERB_WARNING, 'IO', 'READ_FIELD', 'PSVT set to 0 for ' // TRIM( TZFIELD%CMNHNAME ) )
+        PSVT(:,:,:,JSV) = 0.
+      END IF
+
+    CASE ('INIT')
+      PSVT(:,:,:,JSV) = 0.
+
+      IF ( JSV == NSV_C2R2END ) THEN
+        IF ( LSUPSAT .AND. (HGETRVT == 'READ') ) THEN
+          ZWORK(:,:,:) = (PPABST(:,:,:)/XP00 )**(XRD/XCPD)
+          ZWORK(:,:,:) = PTHT(:,:,:)*ZWORK(:,:,:)
+          ZWORK(:,:,:) = EXP(XALPW-XBETAW/ZWORK(:,:,:)-XGAMW*LOG(ZWORK(:,:,:)))
+          !rvsat
+          ZWORK(:,:,:) = (XMV / XMD)*ZWORK(:,:,:)/(PPABST(:,:,:)-ZWORK(:,:,:))
+          ZWORK(:,:,:) = PRT(:,:,:,IDX_RVT)/ZWORK(:,:,:)
+          PSVT(:,:,:,NSV_C2R2END ) = ZWORK(:,:,:)
+        END IF
+      END IF
+
+  END SELECT
+END DO
+
+DO JSV = NSV_PPBEG, NSV_PPEND
+  SELECT CASE( HGETSVT(JSV) )
+    CASE ('READ')
+      WRITE( YNUM3, '( I3.3 )' ) JSV
+
+      TZFIELD = TFIELDMETADATA(            &
+        CMNHNAME   = 'ATC' // YNUM3,       &
+        CSTDNAME   = '',                   &
+        CLONGNAME  = 'ATC' // YNUM3,       &
+        CCOMMENT   = 'X_Y_Z_ATC' // YNUM3, &
+        CUNITS     = 'm-3',                &
+        CDIR       = 'XY',                 &
+        NGRID      = 1,                    &
+        NTYPE      = TYPEREAL,             &
+        NDIMS      = 3,                    &
+        LTIMEDEP   = .TRUE.                )
+
+      CALL IO_Field_read( TPINIFILE, TZFIELD, PATC(:,:,:,JSV-NSV_PPBEG+1), IRESP )
+
+      IF ( IRESP /= 0 ) THEN
+        PATC(:,:,:,JSV-NSV_PPBEG+1) = 0.
+      ENDIF
+
+    CASE ('INIT')
+      PATC(:,:,:,JSV-NSV_PPBEG+1) = 0.
+
+  END SELECT
+END DO
+
+IF ( NSV_SNW >= 1 ) THEN
+  TZFIELD = TFIELDMETADATA(                &
+    CMNHNAME   = 'generic for SNOWCANO_M', &
+    CUNITS     = 'kg kg-1',                &
+    CDIR       = 'XY',                     &
+    NGRID      = 1,                        &
+    NTYPE      = TYPEREAL,                 &
+    NDIMS      = 2,                        &
+    LTIMEDEP   = .TRUE.                    )
+  DO JSV = 1, NSV_SNW
+    SELECT CASE(HGETSVT(JSV))
+      CASE ('READ')
+        WRITE(TZFIELD%CMNHNAME,'(A10,I3.3)')'SNOWCANO_M',JSV
+        TZFIELD%CLONGNAME  = TRIM(TZFIELD%CMNHNAME)
+        WRITE(TZFIELD%CCOMMENT,'(A6,A8,I3.3)') 'X_Y_Z_','SNOWCANO',JSV
+        CALL IO_Field_read( TPINIFILE, TZFIELD, XSNWCANO(:,:,JSV) )
+      CASE ('INIT')
+        XSNWCANO(:,:,JSV) = 0.
+    END SELECT
+  END DO
+END IF
+!
+IF (CCONF == 'RESTA') THEN
+  IF (CTEMP_SCHEME/='LEFR') THEN
+    CALL IO_Field_read(TPINIFILE,'US_PRES',PRUS_PRES)
+    CALL IO_Field_read(TPINIFILE,'VS_PRES',PRVS_PRES)
+    CALL IO_Field_read(TPINIFILE,'WS_PRES',PRWS_PRES)
+  END IF
+  IF (LSPLIT_CFL) THEN
+    CALL IO_Field_read(TPINIFILE,'THS_CLD',PRTHS_CLD)
+    DO JRR = 1, SIZE(PRT,4)
+      SELECT CASE(JRR)
+        CASE (1)
+          CALL IO_Field_read(TPINIFILE,'RVS_CLD',PRRS_CLD(:,:,:,JRR))
+        CASE (2)
+          CALL IO_Field_read(TPINIFILE,'RCS_CLD',PRRS_CLD(:,:,:,JRR))
+        CASE (3)
+          CALL IO_Field_read(TPINIFILE,'RRS_CLD',PRRS_CLD(:,:,:,JRR))
+        CASE (4)
+          CALL IO_Field_read(TPINIFILE,'RIS_CLD',PRRS_CLD(:,:,:,JRR))
+        CASE (5)
+          CALL IO_Field_read(TPINIFILE,'RSS_CLD',PRRS_CLD(:,:,:,JRR))
+        CASE (6)
+          CALL IO_Field_read(TPINIFILE,'RGS_CLD',PRRS_CLD(:,:,:,JRR))
+        CASE (7)
+          CALL IO_Field_read(TPINIFILE,'RHS_CLD',PRRS_CLD(:,:,:,JRR))
+        CASE DEFAULT
+          CALL PRINT_MSG(NVERB_FATAL,'GEN','READ_FIELD','PRT is too big')
+      END SELECT
+    END DO
+    DO JSV = NSV_C2R2BEG,NSV_C2R2END
+      IF (JSV == NSV_C2R2BEG ) THEN
+        TZFIELD = TFIELDMETADATA(       &
+          CMNHNAME   = 'RSVS_CLD1',     &
+          CSTDNAME   = '',              &
+          CLONGNAME  = 'RSVS_CLD1',     &
+          CUNITS     = '1',             &
+          CDIR       = 'XY',            &
+          CCOMMENT   = 'X_Y_Z_RHS_CLD', &
+          NGRID      = 1,               &
+          NTYPE      = TYPEREAL,        &
+          NDIMS      = 3,               &
+          LTIMEDEP   = .TRUE.           )
+        CALL IO_Field_read(TPINIFILE,TZFIELD,PRSVS_CLD(:,:,:,JSV))
+      END IF
+      IF (JSV == NSV_C2R2BEG ) THEN
+        TZFIELD = TFIELDMETADATA(       &
+          CMNHNAME   = 'RSVS_CLD2',     &
+          CSTDNAME   = '',              &
+          CLONGNAME  = 'RSVS_CLD2',     &
+          CUNITS     = '1',             &
+          CDIR       = 'XY',            &
+          CCOMMENT   = 'X_Y_Z_RHS_CLD', &
+          NGRID      = 1,               &
+          NTYPE      = TYPEREAL,        &
+          NDIMS      = 3,               &
+          LTIMEDEP   = .TRUE.           )
+        CALL IO_Field_read(TPINIFILE,TZFIELD,PRSVS_CLD(:,:,:,JSV))
+      END IF
+    END DO
+  END IF
+END IF
+!
+!*       2.1  Time t-dt:
+!
+IF (CPROGRAM=='MESONH' .AND. HUVW_ADV_SCHEME(1:3)=='CEN' .AND. &
+        HTEMP_SCHEME == 'LEFR' ) THEN
+  IF (CCONF=='RESTA') THEN
+    CALL IO_Field_read(TPINIFILE,'UM', PUM)
+    CALL IO_Field_read(TPINIFILE,'VM', PVM)
+    CALL IO_Field_read(TPINIFILE,'WM', PWM)
+    CALL IO_Field_read(TPINIFILE,'DUM',PDUM)
+    CALL IO_Field_read(TPINIFILE,'DVM',PDVM)
+    CALL IO_Field_read(TPINIFILE,'DWM',PDWM)
+  ELSE
+    PUM = PUT
+    PVM = PVT
+    PWM = PWT
+  END IF
+END IF
+!
+!*       2.2a  3D LS fields  
+!
+!
+CALL INI_LS(TPINIFILE,HGETRVT,GLSOURCE,PLSUM,PLSVM,PLSWM,PLSTHM,PLSRVM,PLSZWSM)
+!
+!
+!*       2.2b  2D "surfacic" LB fields   
+!
+!
+CALL INI_LB(TPINIFILE,GLSOURCE,ISV,                                   &
+     KSIZELBX_ll,KSIZELBXU_ll,KSIZELBY_ll,KSIZELBYV_ll,               &
+     KSIZELBXTKE_ll,KSIZELBYTKE_ll,                                   &
+     KSIZELBXR_ll,KSIZELBYR_ll,KSIZELBXSV_ll,KSIZELBYSV_ll,           &
+     HGETTKET,HGETRVT,HGETRCT,HGETRRT,HGETRIT,HGETRST,                &
+     HGETRGT,HGETRHT,HGETSVT,                                         &
+     PLBXUM,PLBXVM,PLBXWM,PLBXTHM,PLBXTKEM,PLBXRM,PLBXSVM,            &
+     PLBYUM,PLBYVM,PLBYWM,PLBYTHM,PLBYTKEM,PLBYRM,PLBYSVM             )
+!
+!
+!*       2.3  Some special variables:
+!
+CALL IO_Field_read(TPINIFILE,'DRYMASST',PDRYMASST) ! dry mass
+IF (CCONF=='RESTA') THEN
+  CALL IO_Field_read(TPINIFILE,'DRYMASSS',PDRYMASSS,IRESP) ! dry mass tendency
+
+  ! DRYMASSS was not written in backup files before MesoNH 5.5.1
+  IF ( IRESP /= 0 ) THEN
+    CALL PRINT_MSG( NVERB_WARNING, 'IO', 'READ_FIELD', 'PDRYMASSS set to 0 for ' // TRIM( TZFIELD%CMNHNAME ) )
+    PDRYMASSS = 0.
+  END IF
+ELSE
+  PDRYMASSS=XUNDEF   ! should not be used
+END IF
+!
+SELECT CASE(HGETSRCT)                ! turbulent flux SRC at time t
+  CASE('READ')
+    CALL IO_Field_read(TPINIFILE,'SRCT',PSRCT)
+  CASE('INIT')
+    PSRCT(:,:,:)=0.
+END SELECT
+!
+SELECT CASE(HGETSIGS)                ! subgrid condensation
+  CASE('READ')
+    CALL IO_Field_read(TPINIFILE,'SIGS',PSIGS)
+  CASE('INIT')
+    PSIGS(:,:,:)=0.
+END SELECT
+!
+SELECT CASE(HGETPHC)             ! pH in cloud water
+  CASE('READ')
+    CALL IO_Field_read(TPINIFILE,'PHC',PPHC)
+  CASE('INIT')
+    PPHC(:,:,:)=0.
+END SELECT
+!
+SELECT CASE(HGETPHR)             ! pH in rainwater
+  CASE('READ')
+    CALL IO_Field_read(TPINIFILE,'PHR',PPHR)
+  CASE('INIT')
+    PPHR(:,:,:)=0.
+END SELECT
+!
+IRESP=0
+IF(HGETCLDFR=='READ') THEN           ! cloud fraction
+  CALL IO_Field_read(TPINIFILE,'CLDFR',PCLDFR,IRESP)
+ENDIF
+IF(HGETCLDFR=='INIT' .OR. IRESP /= 0) THEN
+  IF(SIZE(PRT,4) > 3) THEN
+    WHERE(PRT(:,:,:,2)+PRT(:,:,:,4) > 1.E-30)
+      PCLDFR(:,:,:) = 1.
+    ELSEWHERE
+      PCLDFR(:,:,:) = 0.
+    ENDWHERE
+  ELSE
+    WHERE(PRT(:,:,:,2) > 1.E-30)
+      PCLDFR(:,:,:) = 1.
+    ELSEWHERE
+      PCLDFR(:,:,:) = 0.
+    ENDWHERE
+  ENDIF
+ENDIF
+!
+IRESP=0
+IF(HGETICEFR=='READ') THEN           ! cloud fraction
+  CALL IO_Field_read(TPINIFILE,'ICEFR',PICEFR,IRESP)
+ENDIF
+IF(HGETCLDFR=='INIT' .OR. IRESP /= 0) THEN
+  IF(SIZE(PRT,4) > 3) THEN
+    WHERE(PRT(:,:,:,4) > 1.E-30)
+       PICEFR(:,:,:) = 1.
+    ELSEWHERE
+      PICEFR(:,:,:) = 0.
+    ENDWHERE
+  ELSE
+     PICEFR(:,:,:) = 0.
+  ENDIF
+ENDIF
+!
+!* boundary layer depth
+!
+IF (HGETBL_DEPTH=='READ') THEN
+  CALL IO_Field_read(TPINIFILE,'BL_DEPTH',PBL_DEPTH)
+ELSE
+  PBL_DEPTH(:,:)=XUNDEF
+END IF
+!
+!* surface boundary layer depth
+!
+IF (HGETSBL_DEPTH=='READ') THEN
+  CALL IO_Field_read(TPINIFILE,'SBL_DEPTH',PSBL_DEPTH)
+ELSE
+  PSBL_DEPTH(:,:)=0.
+END IF
+!
+!* Contribution from MAss Flux parameterizations to vert. flux of buoyancy
+!
+SELECT CASE(HGETTKET)                   
+  CASE('READ') 
+    IF (CSCONV=='EDKF') THEN 
+      CALL IO_Field_read(TPINIFILE,'WTHVMF',PWTHVMF)
+    ELSE
+      PWTHVMF(:,:,:)=0
+    ENDIF
+  CASE('INIT')
+    PWTHVMF(:,:,:)=0.
+END SELECT 
+!-------------------------------------------------------------------------------
+!
+!*       2.4   READ FORCING VARIABLES
+!              ----------------------
+!
+! READ FIELD ONLY FOR MODEL1 (identical for all model in GN)
+IF (LOCEAN .AND. (.NOT.LCOUPLES) .AND. (KOCEMI==1)) THEN
+!
+  CALL IO_Field_read(TPINIFILE,'NFRCLT',NFRCLT)
+  CALL IO_Field_read(TPINIFILE,'NINFRT',NINFRT)
+!
+  TZFIELD = TFIELDMETADATA(                               &
+    CMNHNAME   = 'SSUFL_T',                               &
+    CSTDNAME   = '',                                      &
+    CLONGNAME  = 'SSUFL',                                 &
+    CUNITS     = 'kg m-1 s-1',                            &
+    CDIR       = '--',                                    &
+    CCOMMENT   = 'sfc stress along U to force ocean LES', &
+    NGRID      = 0,                                       &
+    NTYPE      = TYPEREAL,                                &
+    NDIMS      = 1,                                       &
+    LTIMEDEP   = .FALSE.                                  )
+  ALLOCATE(XSSUFL_T(NFRCLT))
+  CALL IO_Field_read(TPINIFILE,TZFIELD,XSSUFL_T(:))
+!
+  TZFIELD = TFIELDMETADATA(                               &
+    CMNHNAME   = 'SSVFL_T',                               &
+    CSTDNAME   = '',                                      &
+    CLONGNAME  = 'SSVFL',                                 &
+    CUNITS     = 'kg m-1 s-1',                            &
+    CDIR       = '--',                                    &
+    CCOMMENT   = 'sfc stress along V to force ocean LES', &
+    NGRID      = 0,                                       &
+    NTYPE      = TYPEREAL,                                &
+    NDIMS      = 1,                                       &
+    LTIMEDEP   = .FALSE.                                  )
+  ALLOCATE(XSSVFL_T(NFRCLT))
+  CALL IO_Field_read(TPINIFILE,TZFIELD,XSSVFL_T(:))
+!
+  TZFIELD = TFIELDMETADATA(                                &
+    CMNHNAME   = 'SSTFL_T',                                &
+    CSTDNAME   = '',                                       &
+    CLONGNAME  = 'SSTFL',                                  &
+    CUNITS     = 'kg m3 K m s-1',                          &
+    CDIR       = '--',                                     &
+    CCOMMENT   = 'sfc total heat flux to force ocean LES', &
+    NGRID      = 0,                                        &
+    NTYPE      = TYPEREAL,                                 &
+    NDIMS      = 1,                                        &
+    LTIMEDEP   = .FALSE.                                   )
+  ALLOCATE(XSSTFL_T(NFRCLT))
+  CALL IO_Field_read(TPINIFILE,TZFIELD,XSSTFL_T(:))
+! 
+  TZFIELD = TFIELDMETADATA(                           &
+    CMNHNAME   = 'SSOLA_T',                           &
+    CSTDNAME   = '',                                  &
+    CLONGNAME  = 'SSOLA',                             &
+    CUNITS     = 'kg m3 K m s-1',                     &
+    CDIR       = '--',                                &
+    CCOMMENT   = 'sfc solar flux to force ocean LES', &
+    NGRID      = 0,                                   &
+    NTYPE      = TYPEREAL,                            &
+    NDIMS      = 1,                                   &
+    LTIMEDEP   = .FALSE.                              )
+  ALLOCATE(XSSOLA_T(NFRCLT))
+  CALL IO_Field_read(TPINIFILE,TZFIELD,XSSOLA_T(:))
+!
+END IF ! ocean sfc forcing end    
+
+!
+IF ( LFORCING ) THEN
+  DO JT=1,KFRC
+!
+    WRITE (YFRC,'(I3.3)') JT
+!
+    TZFIELD = TFIELDMETADATA(                             &
+      CMNHNAME   = 'DTFRC'//YFRC,                         &
+      CSTDNAME   = '',                                    &
+      CLONGNAME  = 'DTFRC'//YFRC,                         &
+      CUNITS     = 'seconds since YYYY-MM-DD HH:MM:SS.S', &
+      CDIR       = '--',                                  &
+      CCOMMENT   = 'Date of forcing profile '//YFRC,      &
+      NGRID      = 0,                                     &
+      NTYPE      = TYPEDATE,                              &
+      NDIMS      = 0,                                     &
+      LTIMEDEP   = .FALSE.                                )
+    CALL IO_Field_read(TPINIFILE,TZFIELD,TPDTFRC(JT))
+!
+    TZFIELD = TFIELDMETADATA(                                    &
+      CMNHNAME   = 'UFRC'//YFRC,                                 &
+      CSTDNAME   = '',                                           &
+      CLONGNAME  = 'UFRC'//YFRC,                                 &
+      CUNITS     = 'm s-1',                                      &
+      CDIR       = '--',                                         &
+      CCOMMENT   = 'Zonal component of horizontal forcing wind', &
+      NGRID      = 1,                                            &
+      NTYPE      = TYPEREAL,                                     &
+      NDIMS      = 1,                                            &
+      LTIMEDEP   = .FALSE.                                       )
+    CALL IO_Field_read(TPINIFILE,TZFIELD,PUFRC(:,JT))
+!
+    TZFIELD = TFIELDMETADATA(                                       &
+      CMNHNAME   = 'VFRC'//YFRC,                                    &
+      CSTDNAME   = '',                                              &
+      CLONGNAME  = 'VFRC'//YFRC,                                    &
+      CUNITS     = 'm s-1',                                         &
+      CDIR       = '--',                                            &
+      CCOMMENT   = 'Meridian component of horizontal forcing wind', &
+      NGRID      = 1,                                               &
+      NTYPE      = TYPEREAL,                                        &
+      NDIMS      = 1,                                               &
+      LTIMEDEP   = .FALSE.                                          )
+    CALL IO_Field_read(TPINIFILE,TZFIELD,PVFRC(:,JT))
+!
+    TZFIELD = TFIELDMETADATA(               &
+      CMNHNAME   = 'WFRC'//YFRC,            &
+      CSTDNAME   = '',                      &
+      CLONGNAME  = 'WFRC'//YFRC,            &
+      CUNITS     = 'm s-1',                 &
+      CDIR       = '--',                    &
+      CCOMMENT   = 'Vertical forcing wind', &
+      NGRID      = 4,                       &
+      NTYPE      = TYPEREAL,                &
+      NDIMS      = 1,                       &
+      LTIMEDEP   = .FALSE.                  )
+    CALL IO_Field_read(TPINIFILE,TZFIELD,PWFRC(:,JT))
+!
+    TZFIELD = TFIELDMETADATA(                       &
+      CMNHNAME   = 'THFRC'//YFRC,                   &
+      CSTDNAME   = '',                              &
+      CLONGNAME  = 'THFRC'//YFRC,                   &
+      CUNITS     = 'K',                             &
+      CDIR       = '--',                            &
+      CCOMMENT   = 'Forcing potential temperature', &
+      NGRID      = 1,                               &
+      NTYPE      = TYPEREAL,                        &
+      NDIMS      = 1,                               &
+      LTIMEDEP   = .FALSE.                          )
+    CALL IO_Field_read(TPINIFILE,TZFIELD,PTHFRC(:,JT))
+!
+    TZFIELD = TFIELDMETADATA(                    &
+      CMNHNAME   = 'RVFRC'//YFRC,                &
+      CSTDNAME   = '',                           &
+      CLONGNAME  = 'RVFRC'//YFRC,                &
+      CUNITS     = 'kg kg-1',                    &
+      CDIR       = '--',                         &
+      CCOMMENT   = 'Forcing vapor mixing ratio', &
+      NGRID      = 1,                            &
+      NTYPE      = TYPEREAL,                     &
+      NDIMS      = 1,                            &
+      LTIMEDEP   = .FALSE.                       )
+    CALL IO_Field_read(TPINIFILE,TZFIELD,PRVFRC(:,JT))
+!
+    TZFIELD = TFIELDMETADATA(                                                &
+      CMNHNAME   = 'TENDTHFRC'//YFRC,                                        &
+      CSTDNAME   = '',                                                       &
+      CLONGNAME  = 'TENDTHFRC'//YFRC,                                        &
+      CUNITS     = 'K s-1',                                                  &
+      CDIR       = '--',                                                     &
+      CCOMMENT   = 'Large-scale potential temperature tendency for forcing', &
+      NGRID      = 1,                                                        &
+      NTYPE      = TYPEREAL,                                                 &
+      NDIMS      = 1,                                                        &
+      LTIMEDEP   = .FALSE.                                                   )
+    CALL IO_Field_read(TPINIFILE,TZFIELD,PTENDTHFRC(:,JT))
+!
+    TZFIELD = TFIELDMETADATA(                                             &
+      CMNHNAME   = 'TENDRVFRC'//YFRC,                                     &
+      CSTDNAME   = '',                                                    &
+      CLONGNAME  = 'TENDRVFRC'//YFRC,                                     &
+      CUNITS     = 'kg kg-1 s-1',                                         &
+      CDIR       = '--',                                                  &
+      CCOMMENT   = 'Large-scale vapor mixing ratio tendency for forcing', &
+      NGRID      = 1,                                                     &
+      NTYPE      = TYPEREAL,                                              &
+      NDIMS      = 1,                                                     &
+      LTIMEDEP   = .FALSE.                                                )
+    CALL IO_Field_read(TPINIFILE,TZFIELD,PTENDRVFRC(:,JT))
+!
+    TZFIELD = TFIELDMETADATA(                                                &
+      CMNHNAME   = 'GXTHFRC'//YFRC,                                          &
+      CSTDNAME   = '',                                                       &
+      CLONGNAME  = 'GXTHFRC'//YFRC,                                          &
+      CUNITS     = 'K m-1',                                                  &
+      CDIR       = '--',                                                     &
+      CCOMMENT   = 'Large-scale potential temperature gradient for forcing', &
+      NGRID      = 1,                                                        &
+      NTYPE      = TYPEREAL,                                                 &
+      NDIMS      = 1,                                                        &
+      LTIMEDEP   = .FALSE.                                                   )
+    CALL IO_Field_read(TPINIFILE,TZFIELD,PGXTHFRC(:,JT))
+!
+    TZFIELD = TFIELDMETADATA(                                                &
+      CMNHNAME   = 'GYTHFRC'//YFRC,                                          &
+      CSTDNAME   = '',                                                       &
+      CLONGNAME  = 'GYTHFRC'//YFRC,                                          &
+      CUNITS     = 'K m-1',                                                  &
+      CDIR       = '--',                                                     &
+      CCOMMENT   = 'Large-scale potential temperature gradient for forcing', &
+      NGRID      = 1,                                                        &
+      NTYPE      = TYPEREAL,                                                 &
+      NDIMS      = 1,                                                        &
+      LTIMEDEP   = .FALSE.                                                   )
+    CALL IO_Field_read(TPINIFILE,TZFIELD,PGYTHFRC(:,JT))
+!
+    TZFIELD = TFIELDMETADATA(                 &
+      CMNHNAME   = 'PGROUNDFRC'//YFRC,        &
+      CSTDNAME   = '',                        &
+      CLONGNAME  = 'PGROUNDFRC'//YFRC,        &
+      CUNITS     = 'Pa',                      &
+      CDIR       = '--',                      &
+      CCOMMENT   = 'Forcing ground pressure', &
+      NGRID      = 1,                         &
+      NTYPE      = TYPEREAL,                  &
+      NDIMS      = 0,                         &
+      LTIMEDEP   = .FALSE.                    )
+    CALL IO_Field_read(TPINIFILE,TZFIELD,PPGROUNDFRC(JT))
+!
+    TZFIELD = TFIELDMETADATA(                            &
+      CMNHNAME   = 'TENDUFRC'//YFRC,                     &
+      CSTDNAME   = '',                                   &
+      CLONGNAME  = 'TENDUFRC'//YFRC,                     &
+      CUNITS     = 'm s-1',                              &
+      CDIR       = '--',                                 &
+      CCOMMENT   = 'Large-scale U tendency for forcing', &
+      NGRID      = 1,                                    &
+      NTYPE      = TYPEREAL,                             &
+      NDIMS      = 1,                                    &
+      LTIMEDEP   = .FALSE.                               )
+    CALL IO_Field_read(TPINIFILE,TZFIELD,PTENDUFRC(:,JT))
+!
+    TZFIELD = TFIELDMETADATA(                            &
+      CMNHNAME   = 'TENDVFRC'//YFRC,                     &
+      CSTDNAME   = '',                                   &
+      CLONGNAME  = 'TENDVFRC'//YFRC,                     &
+      CUNITS     = 'm s-1',                              &
+      CDIR       = '--',                                 &
+      CCOMMENT   = 'Large-scale V tendency for forcing', &
+      NGRID      = 1,                                    &
+      NTYPE      = TYPEREAL,                             &
+      NDIMS      = 1,                                    &
+      LTIMEDEP   = .FALSE.                               )
+    CALL IO_Field_read(TPINIFILE,TZFIELD,PTENDVFRC(:,JT))
+  END DO
+END IF
+!
+!-------------------------------------------------------------------------------
+IF (L2D_ADV_FRC) THEN
+
+  DO JT=1,KADVFRC  
+    WRITE (YFRC,'(I3.3)') JT
+    !
+    TZFIELD = TFIELDMETADATA(                                       &
+      CMNHNAME   = 'DTADV'//YFRC,                                   &
+      CSTDNAME   = '',                                              &
+      CLONGNAME  = 'DTADV'//YFRC,                                   &
+      CUNITS     = 'seconds since YYYY-MM-DD HH:MM:SS.S',           &
+      CDIR       = '--',                                            &
+      CCOMMENT   = 'Date and time of the advecting forcing '//YFRC, &
+      NGRID      = 0,                                               &
+      NTYPE      = TYPEDATE,                                        &
+      NDIMS      = 0,                                               &
+      LTIMEDEP   = .FALSE.                                          )
+    CALL IO_Field_read(TPINIFILE,TZFIELD,TPDTADVFRC(JT))
+    !
+    TZFIELD = TFIELDMETADATA(      &
+      CMNHNAME   = 'TH_ADV'//YFRC, &
+      CSTDNAME   = '',             &
+      CLONGNAME  = 'TH_ADV'//YFRC, &
+      CUNITS     = 'K s-1',        &
+      CDIR       = '--',           &
+      CCOMMENT   = '',             &
+      NGRID      = 1,              &
+      NTYPE      = TYPEREAL,       &
+      NDIMS      = 3,              &
+      LTIMEDEP   = .FALSE.         )
+    CALL IO_Field_read(TPINIFILE,TZFIELD,PDTHFRC(:,:,:,JT))
+    !
+    TZFIELD = TFIELDMETADATA(     &
+      CMNHNAME   = 'Q_ADV'//YFRC, &
+      CSTDNAME   = '',            &
+      CLONGNAME  = 'Q_ADV'//YFRC, &
+      CUNITS     = 'kg kg-1 s-1', &
+      CDIR       = '--',          &
+      CCOMMENT   = '',            &
+      NGRID      = 1,             &
+      NTYPE      = TYPEREAL,      &
+      NDIMS      = 3,             &
+      LTIMEDEP   = .FALSE.        )
+    CALL IO_Field_read(TPINIFILE,TZFIELD,PDRVFRC(:,:,:,JT))
+  ENDDO
+ENDIF
+!
+IF (L2D_REL_FRC) THEN
+
+  DO JT=1,KRELFRC  
+    WRITE (YFRC,'(I3.3)') JT
+    !
+    TZFIELD = TFIELDMETADATA(                                        &
+      CMNHNAME   = 'DTREL'//YFRC,                                    &
+      CSTDNAME   = '',                                               &
+      CLONGNAME  = 'DTREL'//YFRC,                                    &
+      CUNITS     = 'seconds since YYYY-MM-DD HH:MM:SS.S',            &
+      CDIR       = '--',                                             &
+      CCOMMENT   = 'Date and time of the relaxation forcing '//YFRC, &
+      NGRID      = 0,                                                &
+      NTYPE      = TYPEDATE,                                         &
+      NDIMS      = 0,                                                &
+      LTIMEDEP   = .FALSE.                                           )
+    CALL IO_Field_read(TPINIFILE,TZFIELD,TPDTRELFRC(JT))
+    !
+    ! Relaxation
+    TZFIELD = TFIELDMETADATA(      &
+      CMNHNAME   = 'TH_REL'//YFRC, &
+      CSTDNAME   = '',             &
+      CLONGNAME  = 'TH_REL'//YFRC, &
+      CUNITS     = 'K',            &
+      CDIR       = '--',           &
+      CCOMMENT   = '',             &
+      NGRID      = 1,              &
+      NTYPE      = TYPEREAL,       &
+      NDIMS      = 3,              &
+      LTIMEDEP   = .FALSE.         )
+    CALL IO_Field_read(TPINIFILE,TZFIELD,PTHREL(:,:,:,JT))
+    !
+    TZFIELD = TFIELDMETADATA(     &
+      CMNHNAME   = 'Q_REL'//YFRC, &
+      CSTDNAME   = '',            &
+      CLONGNAME  = 'Q_REL'//YFRC, &
+      CUNITS     = 'kg kg-1',     &
+      CDIR       = '--',          &
+      CCOMMENT   = '',            &
+      NGRID      = 1,             &
+      NTYPE      = TYPEREAL,      &
+      NDIMS      = 3,             &
+      LTIMEDEP   = .FALSE.        )
+    CALL IO_Field_read(TPINIFILE,TZFIELD,PRVREL(:,:,:,JT))
+  ENDDO
+ENDIF
+!
+IF (LUV_FLX) THEN
+  IF ( CCONF /= 'START' .OR. CPROGRAM=='SPAWN ' ) THEN
+    CALL IO_Field_read(TPINIFILE,'VU_FLX',PVU_FLUX_M)
+  ELSE IF (CCONF == 'START') THEN
+    PVU_FLUX_M(:,:,:)=0.
+  END IF
+ENDIF
+!
+IF (LTH_FLX) THEN
+  IF ( CCONF /= 'START' .OR. CPROGRAM=='SPAWN ' ) THEN
+    CALL IO_Field_read(TPINIFILE,'VT_FLX',PVTH_FLUX_M)
+    CALL IO_Field_read(TPINIFILE,'WT_FLX',PWTH_FLUX_M)
+   ELSE IF (CCONF == 'START') THEN
+       PWTH_FLUX_M(:,:,:)=0.
+       PVTH_FLUX_M(:,:,:)=0.
+   END IF
+ENDIF
+!
+!-------------------------------------------------------------------------------
+!
+!
+!*       3.    PRINT ON OUTPUT-LISTING
+!              ----------------------
+!
+IF (NVERB >= 10 .AND. .NOT. L1D) THEN
+  IIUP = SIZE(PUT,1)
+  IJUP = SIZE(PVT,2) 
+  ILUOUT= TLUOUT%NLU
+! 
+  WRITE(ILUOUT,FMT=*) 'READ_FIELD: Some PUT values:'
+  WRITE(ILUOUT,FMT=*) '(1,1,JK)   (IIU/2,IJU/2,JK)   (IIU,IJU,JK)    JK  '
+  DO JKLOOP=1,KKU
+    WRITE(ILUOUT,FMT=*) PUT(1,1,JKLOOP),PUT(IIUP/2,IJUP/2,JKLOOP), &
+    PUT(IIUP,KJU,JKLOOP),JKLOOP    
+  END DO
+!
+  WRITE(ILUOUT,FMT=*) 'READ_FIELD: Some PVT values:'
+  WRITE(ILUOUT,FMT=*) '(1,1,JK)   (IIU/2,IJU/2,JK)   (IIU,IJU,JK)    JK  '
+  DO JKLOOP=1,KKU
+    WRITE(ILUOUT,FMT=*) PVT(1,1,JKLOOP),PVT(IIUP/2,IJUP/2,JKLOOP), &
+    PVT(IIUP,IJUP,JKLOOP),JKLOOP    
+  END DO
+!
+  WRITE(ILUOUT,FMT=*) 'READ_FIELD: Some PWT values:'
+  WRITE(ILUOUT,FMT=*) '(1,1,JK)   (IIU/2,IJU/2,JK)   (IIU,IJU,JK)    JK  '
+  DO JKLOOP=1,KKU
+    WRITE(ILUOUT,FMT=*) PWT(1,1,JKLOOP),PWT(IIUP/2,IJUP/2,JKLOOP), &
+    PWT(IIUP,IJUP,JKLOOP),JKLOOP    
+  END DO
+!
+  WRITE(ILUOUT,FMT=*) 'READ_FIELD: Some PTHT values:'
+  WRITE(ILUOUT,FMT=*) '(1,1,JK)   (IIU/2,IJU/2,JK)   (IIU,IJU,JK)    JK  '
+  DO JKLOOP=1,KKU
+    WRITE(ILUOUT,FMT=*) PTHT(1,1,JKLOOP),PTHT(IIUP/2,IJUP/2,JKLOOP), &
+    PTHT(IIUP,IJUP,JKLOOP),JKLOOP    
+  END DO
+!
+  IF(SIZE(PTKET,1) /=0) THEN
+    WRITE(ILUOUT,FMT=*) 'READ_FIELD: Some PTKET values:'
+    WRITE(ILUOUT,FMT=*) '(1,1,JK)   (IIU/2,IJU/2,JK)   (IIU,IJU,JK)    JK  '
+    DO JKLOOP=1,KKU
+      WRITE(ILUOUT,FMT=*) PTKET(1,1,JKLOOP),PTKET(IIUP/2,IJUP/2,JKLOOP), &
+      PTKET(IIUP,IJUP,JKLOOP),JKLOOP    
+    END DO
+  END IF
+!
+  IF (SIZE(PRT,4) /= 0) THEN
+    WRITE(ILUOUT,FMT=*) 'READ_FIELD: Some PRT values:'
+    DO JRR = 1, SIZE(PRT,4)
+      WRITE(ILUOUT,FMT=*) 'JRR = ',JRR
+      WRITE(ILUOUT,FMT=*) '(1,1,JK)   (IIU/2,IJU/2,JK)   (IIU,IJU,JK)    JK  '
+      DO JKLOOP=1,KKU
+        WRITE(ILUOUT,FMT=*) PRT(1,1,JKLOOP,JRR),PRT(IIUP/2,IJUP/2,JKLOOP,JRR), &
+        PRT(IIUP,IJUP,JKLOOP,JRR),JKLOOP    
+      END DO
+    END DO
+!
+  END IF   
+!
+  IF (SIZE(PSVT,4) /= 0) THEN
+    WRITE(ILUOUT,FMT=*) 'READ_FIELD: Some PSVT values:'
+    DO JRR = 1, SIZE(PSVT,4)
+      WRITE(ILUOUT,FMT=*) 'JRR = ',JRR
+      WRITE(ILUOUT,FMT=*) '(1,1,JK)   (IIU/2,IJU/2,JK)   (IIU,IJU,JK)    JK  '
+      DO JKLOOP=1,KKU
+        WRITE(ILUOUT,FMT=*) PSVT(1,1,JKLOOP,JRR),PSVT(IIUP/2,IJUP/2,JKLOOP,JRR), &
+        PSVT(IIUP,IJUP,JKLOOP,JRR),JKLOOP    
+      END DO
+    END DO
+!
+  END IF   
+END IF 
+!-------------------------------------------------------------------------------
+! 
+!
+END SUBROUTINE READ_FIELD
diff --git a/src/PHYEX/ext/read_precip_field.f90 b/src/PHYEX/ext/read_precip_field.f90
new file mode 100644
index 0000000000000000000000000000000000000000..1267beea757dd57efdedb88d79264cefd58a738c
--- /dev/null
+++ b/src/PHYEX/ext/read_precip_field.f90
@@ -0,0 +1,299 @@
+!MNH_LIC Copyright 1996-2020 CNRS, Meteo-France and Universite Paul Sabatier
+!MNH_LIC This is part of the Meso-NH software governed by the CeCILL-C licence
+!MNH_LIC version 1. See LICENSE, CeCILL-C_V1-en.txt and CeCILL-C_V1-fr.txt
+!MNH_LIC for details. version 1.
+!-----------------------------------------------------------------
+!     #############################
+      MODULE MODI_READ_PRECIP_FIELD
+!     #############################
+!
+!
+!
+INTERFACE
+!
+      SUBROUTINE READ_PRECIP_FIELD(TPINIFILE,HPROGRAM,HCONF,                       &
+                              HGETRCT,HGETRRT,HGETRST,HGETRGT,HGETRHT,             &
+                              PINPRC,PACPRC,PINDEP,PACDEP,PINPRR,PINPRR3D,PEVAP3D, &
+                              PACPRR,PINPRS,PACPRS,PINPRG,PACPRG,PINPRH,PACPRH     )
+!
+USE MODD_IO, ONLY : TFILEDATA
+!
+!*       0.1   declarations of arguments
+!
+TYPE(TFILEDATA),        INTENT(IN)    :: TPINIFILE ! Initial file
+CHARACTER (LEN=*),      INTENT(IN)    :: HPROGRAM  !
+CHARACTER (LEN=*),      INTENT(IN)    :: HCONF     !
+!                    
+CHARACTER (LEN=*),      INTENT(IN)    :: HGETRCT, HGETRRT, HGETRST, HGETRGT, HGETRHT
+                                                  ! Get indicator RCT,RRT,RST,RGT,RHT
+!
+REAL, DIMENSION(:,:),   INTENT(INOUT) :: PINPRC   ! Droplet instant precip
+REAL, DIMENSION(:,:),   INTENT(INOUT) :: PACPRC   ! Droplet accumulated precip
+REAL, DIMENSION(:,:),   INTENT(INOUT) :: PINDEP   ! Droplet instant deposition
+REAL, DIMENSION(:,:),   INTENT(INOUT) :: PACDEP   ! Droplet accumulated dep
+REAL, DIMENSION(:,:),   INTENT(INOUT) :: PINPRR   ! Rain instant precip
+REAL, DIMENSION(:,:,:), INTENT(INOUT) :: PINPRR3D ! Rain precipitation flux 3D
+REAL, DIMENSION(:,:,:), INTENT(INOUT) :: PEVAP3D  ! Rain evaporation flux 3D
+REAL, DIMENSION(:,:),   INTENT(INOUT) :: PACPRR   ! Rain accumulated precip
+REAL, DIMENSION(:,:),   INTENT(INOUT) :: PINPRS   ! Snow instant precip
+REAL, DIMENSION(:,:),   INTENT(INOUT) :: PACPRS   ! Snow accumulated precip
+REAL, DIMENSION(:,:),   INTENT(INOUT) :: PINPRG   ! Graupel instant precip
+REAL, DIMENSION(:,:),   INTENT(INOUT) :: PACPRG   ! Graupel accumulated precip
+REAL, DIMENSION(:,:),   INTENT(INOUT) :: PINPRH   ! Hail instant precip
+REAL, DIMENSION(:,:),   INTENT(INOUT) :: PACPRH   ! Hail accumulated precip
+!
+END SUBROUTINE READ_PRECIP_FIELD
+!
+END INTERFACE
+!
+END MODULE MODI_READ_PRECIP_FIELD 
+!
+!     ##############################################################################
+      SUBROUTINE READ_PRECIP_FIELD(TPINIFILE,HPROGRAM,HCONF,                       &
+                              HGETRCT,HGETRRT,HGETRST,HGETRGT,HGETRHT,             &
+                              PINPRC,PACPRC,PINDEP,PACDEP,PINPRR,PINPRR3D,PEVAP3D, &
+                              PACPRR,PINPRS,PACPRS,PINPRG,PACPRG,PINPRH,PACPRH     )
+!     ##############################################################################
+!
+!!****  *READ_PRECIP_FIELD* - routine to read precipitation surface fields
+!!
+!!    PURPOSE
+!!    -------
+!       Initialize precipitation fields by reading their value in an initial
+!     MNH file.
+!
+!!**  METHOD
+!!    ------
+!!    
+!!    
+!!
+!!    EXTERNAL
+!!    --------
+!!      FMREAD   : to read data in LFIFM file
+!!       
+!!    IMPLICIT ARGUMENTS
+!!    ------------------ 
+!!      None
+!!
+!!    REFERENCE
+!!    ---------
+!!      Book2 of the documentation (routine READ_PRECIP_FIELD)
+!!
+!!    AUTHOR
+!!    ------
+!!  	J.-P. Pinty     *Laboratoire d'Aerologie*
+!!
+!!    MODIFICATIONS
+!!    -------------
+!!      Original       13/06/96 
+!!      (J. Viviand)   04/02/97  convert precipitation rates in m/s
+!!      (V. Ducrocq)   14/08/98  // remove KIINF,KJINF,KISUP,KJSUP
+!!      (JP Pinty)     29/11/02  add C3R5, ICE2, ICE4
+!!      (C.Lac)        04/03/13  add YGETxxx for FIT scheme
+!!                    10/2016 (C.Lac) Add droplet deposition
+!!  Philippe Wautelet: 05/2016-04/2018: new data structures and calls for I/O
+!  P. Wautelet 14/02/2019: remove CLUOUT/CLUOUT0 and associated variables
+!!
+!-----------------------------------------------------------------------------
+!
+!*       0.    DECLARATIONS
+
+use modd_field,         only: tfieldmetadata, tfieldlist
+USE MODD_IO,            ONLY: TFILEDATA
+USE MODD_PARAM_ICE_n,     ONLY: LDEPOSC
+USE MODD_PARAM_C2R2,    ONLY: LDEPOC
+USE MODD_PARAM_LIMA,    ONLY: MDEPOC=>LDEPOC
+!
+use mode_field,         only: Find_field_id_from_mnhname
+USE MODE_IO_FIELD_READ, only: IO_Field_read
+!
+IMPLICIT NONE
+!
+!*       0.1   declarations of arguments
+!
+TYPE(TFILEDATA),        INTENT(IN)    :: TPINIFILE ! Initial file
+CHARACTER (LEN=*),      INTENT(IN)    :: HPROGRAM  !
+CHARACTER (LEN=*),      INTENT(IN)    :: HCONF     !
+!                    
+CHARACTER (LEN=*),      INTENT(IN)    :: HGETRCT, HGETRRT, HGETRST, HGETRGT, HGETRHT
+                                                  ! Get indicator RCT,RRT,RST,RGT,RHT
+!
+REAL, DIMENSION(:,:),   INTENT(INOUT) :: PINPRC   ! Droplet instant precip
+REAL, DIMENSION(:,:),   INTENT(INOUT) :: PACPRC   ! Droplet accumulated precip
+REAL, DIMENSION(:,:),   INTENT(INOUT) :: PINDEP   ! Droplet instant deposition
+REAL, DIMENSION(:,:),   INTENT(INOUT) :: PACDEP   ! Droplet accumulated dep
+REAL, DIMENSION(:,:),   INTENT(INOUT) :: PINPRR   ! Rain instant precip
+REAL, DIMENSION(:,:,:), INTENT(INOUT) :: PINPRR3D ! Rain precipitation flux 3D
+REAL, DIMENSION(:,:,:), INTENT(INOUT) :: PEVAP3D  ! Rain evaporation flux 3D
+REAL, DIMENSION(:,:),   INTENT(INOUT) :: PACPRR   ! Rain accumulated precip
+REAL, DIMENSION(:,:),   INTENT(INOUT) :: PINPRS   ! Snow instant precip
+REAL, DIMENSION(:,:),   INTENT(INOUT) :: PACPRS   ! Snow accumulated precip
+REAL, DIMENSION(:,:),   INTENT(INOUT) :: PINPRG   ! Graupel instant precip
+REAL, DIMENSION(:,:),   INTENT(INOUT) :: PACPRG   ! Graupel accumulated precip
+REAL, DIMENSION(:,:),   INTENT(INOUT) :: PINPRH   ! Hail instant precip
+REAL, DIMENSION(:,:),   INTENT(INOUT) :: PACPRH   ! Hail accumulated precip
+!
+!*       0.2   declarations of local variables
+!
+REAL, DIMENSION(SIZE(PINPRR,1),SIZE(PINPRR,2)) :: Z2D ! 2D array to read  data
+REAL, DIMENSION(SIZE(PINPRR3D,1),SIZE(PINPRR3D,2),SIZE(PINPRR3D,3)) :: Z3D ! 3D array to read  data
+                                                  ! in initial file 
+INTEGER              :: IID
+INTEGER              :: IRESP
+CHARACTER(LEN=4)     :: YGETRCT,YGETRRT,YGETRST,YGETRGT,YGETRHT
+TYPE(TFIELDMETADATA) :: TZFIELD
+!
+!-------------------------------------------------------------------------------
+!
+!*       1..    INITIALIZATION
+!              ----------------
+!
+IF ((HPROGRAM == 'MESONH') .AND. (HCONF == 'START')) THEN
+  YGETRCT = 'INIT'
+  YGETRRT = 'INIT'
+  YGETRST = 'INIT'
+  YGETRGT = 'INIT'
+  YGETRHT = 'INIT'
+ELSE
+  YGETRCT = HGETRCT
+  YGETRRT = HGETRRT
+  YGETRST = HGETRST
+  YGETRGT = HGETRGT
+  YGETRHT = HGETRHT
+END IF
+!-------------------------------------------------------------------------------
+!
+!*       2..    READ PROGNOSTIC VARIABLES
+!              -------------------------
+!
+IF (SIZE(PINPRC) /= 0 ) THEN
+  SELECT CASE(YGETRCT)
+  CASE ('READ')
+    CALL FIND_FIELD_ID_FROM_MNHNAME('INPRC',IID,IRESP)
+    TZFIELD = TFIELDMETADATA( TFIELDLIST(IID) )
+    TZFIELD%CUNITS = 'mm hour-1'
+    CALL IO_Field_read(TPINIFILE,TZFIELD,Z2D,IRESP)
+    IF (IRESP == 0) PINPRC(:,:)=Z2D(:,:)/(1000.*3600.)
+    !
+    CALL FIND_FIELD_ID_FROM_MNHNAME('ACPRC',IID,IRESP)
+    TZFIELD = TFIELDMETADATA( TFIELDLIST(IID) )
+    TZFIELD%CUNITS = 'mm'
+    CALL IO_Field_read(TPINIFILE,TZFIELD,Z2D,IRESP)
+    IF (IRESP == 0) PACPRC(:,:)=Z2D(:,:)/(1000.)
+  CASE ('INIT')
+    PINPRC(:,:) = 0.0
+    PACPRC(:,:) = 0.0
+  END SELECT
+END IF
+!
+IF (SIZE(PINDEP) /= 0 ) THEN
+  SELECT CASE(YGETRCT)
+  CASE ('READ')
+    CALL FIND_FIELD_ID_FROM_MNHNAME('INDEP',IID,IRESP)
+    TZFIELD = TFIELDMETADATA( TFIELDLIST(IID) )
+    TZFIELD%CUNITS = 'mm hour-1'
+    CALL IO_Field_read(TPINIFILE,TZFIELD,Z2D,IRESP)
+    IF (IRESP == 0) PINDEP(:,:)=Z2D(:,:)/(1000.*3600.)
+    !
+    CALL FIND_FIELD_ID_FROM_MNHNAME('ACDEP',IID,IRESP)
+    TZFIELD = TFIELDMETADATA( TFIELDLIST(IID) )
+    TZFIELD%CUNITS = 'mm'
+    CALL IO_Field_read(TPINIFILE,TZFIELD,Z2D,IRESP)
+    IF (IRESP == 0) PACDEP(:,:)=Z2D(:,:)/(1000.)
+  CASE ('INIT')
+    PINDEP(:,:) = 0.0
+    PACDEP(:,:) = 0.0
+  END SELECT
+END IF
+!
+IF (SIZE(PINPRR) /= 0 ) THEN
+  SELECT CASE(YGETRRT)
+  CASE ('READ')
+    CALL FIND_FIELD_ID_FROM_MNHNAME('INPRR',IID,IRESP)
+    TZFIELD = TFIELDMETADATA( TFIELDLIST(IID) )
+    TZFIELD%CUNITS = 'mm hour-1'
+    CALL IO_Field_read(TPINIFILE,TZFIELD,Z2D,IRESP)
+    IF (IRESP == 0) PINPRR(:,:)=Z2D(:,:)/(1000.*3600.)
+    !
+    CALL IO_Field_read(TPINIFILE,'INPRR3D',Z3D,IRESP)
+    IF (IRESP == 0) PINPRR3D(:,:,:)=Z3D(:,:,:)
+    !
+    CALL IO_Field_read(TPINIFILE,'EVAP3D',Z3D,IRESP)
+    IF (IRESP == 0) PEVAP3D(:,:,:)=Z3D(:,:,:)
+    !
+    CALL FIND_FIELD_ID_FROM_MNHNAME('ACPRR',IID,IRESP)
+    TZFIELD = TFIELDMETADATA( TFIELDLIST(IID) )
+    TZFIELD%CUNITS = 'mm'
+    CALL IO_Field_read(TPINIFILE,TZFIELD,Z2D,IRESP)
+    IF (IRESP == 0) PACPRR(:,:)=Z2D(:,:)/(1000.)
+  CASE ('INIT')
+    PINPRR(:,:) = 0.0
+    PINPRR3D(:,:,:) = 0.0
+    PEVAP3D(:,:,:) = 0.0
+    PACPRR(:,:) = 0.0
+  END SELECT
+END IF
+!
+IF (SIZE(PINPRS) /= 0 ) THEN
+  SELECT CASE(YGETRST)
+  CASE ('READ')
+    CALL FIND_FIELD_ID_FROM_MNHNAME('INPRS',IID,IRESP)
+    TZFIELD = TFIELDMETADATA( TFIELDLIST(IID) )
+    TZFIELD%CUNITS = 'mm hour-1'
+    CALL IO_Field_read(TPINIFILE,TZFIELD,Z2D,IRESP)
+    IF (IRESP == 0) PINPRS(:,:)=Z2D(:,:)/(1000.*3600.)
+    !
+    CALL FIND_FIELD_ID_FROM_MNHNAME('ACPRS',IID,IRESP)
+    TZFIELD = TFIELDMETADATA( TFIELDLIST(IID) )
+    TZFIELD%CUNITS = 'mm'
+    CALL IO_Field_read(TPINIFILE,TZFIELD,Z2D,IRESP)
+    IF (IRESP == 0) PACPRS(:,:)=Z2D(:,:)/(1000.)
+  CASE ('INIT')
+    PINPRS(:,:) = 0.0
+    PACPRS(:,:) = 0.0
+  END SELECT
+END IF
+!
+IF (SIZE(PINPRG) /= 0 ) THEN
+  SELECT CASE(YGETRGT)
+  CASE ('READ')
+    CALL FIND_FIELD_ID_FROM_MNHNAME('INPRG',IID,IRESP)
+    TZFIELD = TFIELDMETADATA( TFIELDLIST(IID) )
+    TZFIELD%CUNITS = 'mm hour-1'
+    CALL IO_Field_read(TPINIFILE,TZFIELD,Z2D,IRESP)
+    IF (IRESP == 0) PINPRG(:,:)=Z2D(:,:)/(1000.*3600.)
+    !
+    CALL FIND_FIELD_ID_FROM_MNHNAME('ACPRG',IID,IRESP)
+    TZFIELD = TFIELDMETADATA( TFIELDLIST(IID) )
+    TZFIELD%CUNITS = 'mm'
+    CALL IO_Field_read(TPINIFILE,TZFIELD,Z2D,IRESP)
+    IF (IRESP == 0) PACPRG(:,:)=Z2D(:,:)/(1000.)
+  CASE ('INIT')
+    PINPRG(:,:) = 0.0
+    PACPRG(:,:) = 0.0
+  END SELECT
+END IF
+!
+IF (SIZE(PINPRH) /= 0 ) THEN
+  SELECT CASE(YGETRHT)
+  CASE ('READ')
+    CALL FIND_FIELD_ID_FROM_MNHNAME('INPRH',IID,IRESP)
+    TZFIELD = TFIELDMETADATA( TFIELDLIST(IID) )
+    TZFIELD%CUNITS = 'mm hour-1'
+    CALL IO_Field_read(TPINIFILE,TZFIELD,Z2D,IRESP)
+    IF (IRESP == 0) PINPRH(:,:)=Z2D(:,:)/(1000.*3600.)
+    !
+    CALL FIND_FIELD_ID_FROM_MNHNAME('ACPRH',IID,IRESP)
+    TZFIELD = TFIELDMETADATA( TFIELDLIST(IID) )
+    TZFIELD%CUNITS = 'mm'
+    CALL IO_Field_read(TPINIFILE,TZFIELD,Z2D,IRESP)
+    IF (IRESP == 0) PACPRH(:,:)=Z2D(:,:)/(1000.)
+  CASE ('INIT')
+    PINPRH(:,:) = 0.0
+    PACPRH(:,:) = 0.0
+  END SELECT
+END IF
+!
+!-------------------------------------------------------------------------------
+!
+END SUBROUTINE READ_PRECIP_FIELD
diff --git a/src/PHYEX/ext/resolved_cloud.f90 b/src/PHYEX/ext/resolved_cloud.f90
new file mode 100644
index 0000000000000000000000000000000000000000..aec42c0535e375182860e9e1ff46049510d13234
--- /dev/null
+++ b/src/PHYEX/ext/resolved_cloud.f90
@@ -0,0 +1,1107 @@
+!MNH_LIC Copyright 1994-2021 CNRS, Meteo-France and Universite Paul Sabatier
+!MNH_LIC This is part of the Meso-NH software governed by the CeCILL-C licence
+!MNH_LIC version 1. See LICENSE, CeCILL-C_V1-en.txt and CeCILL-C_V1-fr.txt
+!MNH_LIC for details. version 1.
+!-----------------------------------------------------------------
+!     ##########################
+      MODULE MODI_RESOLVED_CLOUD
+!     ##########################
+INTERFACE
+      SUBROUTINE RESOLVED_CLOUD ( HCLOUD, HACTCCN, HSCONV, HMF_CLOUD,                  &
+                                  KRR, KSPLITR, KSPLITG, KMI, KTCOUNT,                 &
+                                  HLBCX, HLBCY, TPFILE, HRAD, HTURBDIM,                &
+                                  OSUBG_COND, OSIGMAS, HSUBG_AUCV,                     &
+                                  PTSTEP, PZZ, PRHODJ, PRHODREF, PEXNREF,              &
+                                  PPABST, PTHT, PRT, PSIGS, PSIGQSAT, PMFCONV,         &
+                                  PTHM, PRCM, PPABSTT,                                 &
+                                  PW_ACT,PDTHRAD, PTHS, PRS, PSVT, PSVS, PSRCS, PCLDFR,&
+                                  PICEFR,                                              &
+                                  PCIT, OSEDIC, OACTIT, OSEDC, OSEDI,                  &
+                                  ORAIN, OWARM, OHHONI, OCONVHG,                       &
+                                  PCF_MF,PRC_MF, PRI_MF,                               &
+                                  PINPRC,PINPRC3D,PINPRR,PINPRR3D, PEVAP3D,            &
+                                  PINPRS,PINPRS3D,PINPRG,PINPRG3D,PINPRH,PINPRH3D,     &
+                                  PSOLORG,PMI,                                         &
+                                  PSPEEDC, PSPEEDR, PSPEEDS, PSPEEDG, PSPEEDH,         &
+                                  PINDEP, PSUPSAT,  PNACT, PNPRO,PSSPRO, PRAINFR,      &
+                                  PHLC_HRC, PHLC_HCF, PHLI_HRI, PHLI_HCF,              &
+                                  PSEA,PTOWN          )   
+!
+USE MODD_IO, ONLY: TFILEDATA
+!
+CHARACTER(LEN=4),         INTENT(IN)   :: HCLOUD   ! kind of cloud
+CHARACTER(LEN=4),         INTENT(IN)   :: HACTCCN  ! kind of CCN activation scheme
+                                                   ! paramerization
+CHARACTER(LEN=4),         INTENT(IN)   :: HSCONV   ! Shallow convection scheme
+CHARACTER(LEN=4),         INTENT(IN)   :: HMF_CLOUD! Type of statistical cloud
+INTEGER,                  INTENT(IN)   :: KRR      ! Number of moist variables
+INTEGER,                  INTENT(IN)   :: KSPLITR  ! Number of small time step
+                                       ! integrations for  rain sedimendation
+INTEGER,                  INTENT(IN)   :: KSPLITG  ! Number of small time step
+                                       ! integrations for  ice  sedimendation
+INTEGER,                  INTENT(IN)   :: KMI      ! Model index
+INTEGER,                  INTENT(IN)   :: KTCOUNT  ! Temporal loop counter
+CHARACTER(LEN=4), DIMENSION(2), INTENT(IN) :: HLBCX,HLBCY   ! X and Y-direc. LBC type
+TYPE(TFILEDATA),          INTENT(IN)   :: TPFILE   ! Output file
+CHARACTER(len=4),         INTENT(IN)   :: HRAD     ! Radiation scheme name
+CHARACTER(len=4),         INTENT(IN)   :: HTURBDIM ! Dimensionality of the
+                                                   ! turbulence scheme
+LOGICAL,                  INTENT(IN)   :: OSUBG_COND ! Switch for Subgrid Cond.
+LOGICAL,                  INTENT(IN)   :: OSIGMAS  ! Switch for Sigma_s:
+                                        ! use values computed in CONDENSATION
+                                        ! or that from turbulence scheme
+CHARACTER(LEN=4),         INTENT(IN)   :: HSUBG_AUCV
+                                        ! Kind of Subgrid autoconversion method
+REAL,                     INTENT(IN)   :: PTSTEP ! Time step :XTSTEP in namelist
+!
+!
+REAL, DIMENSION(:,:,:),   INTENT(IN)   :: PZZ     ! Height (z)
+REAL, DIMENSION(:,:,:),   INTENT(IN)   :: PRHODJ  !Dry density * Jacobian
+REAL, DIMENSION(:,:,:),   INTENT(IN)   :: PRHODREF! Reference dry air density
+REAL, DIMENSION(:,:,:),   INTENT(IN)   :: PEXNREF ! Reference Exner function
+!
+!
+REAL, DIMENSION(:,:,:),   INTENT(IN)   :: PPABST  ! abs. pressure at time t
+REAL, DIMENSION(:,:,:),   INTENT(IN)   :: PTHT    ! Theta at time t
+REAL, DIMENSION(:,:,:,:), INTENT(INOUT):: PRT     ! Moist variables at time t
+REAL, DIMENSION(:,:,:),   INTENT(IN)   :: PSIGS   ! Sigma_s at time t
+REAL,                     INTENT(IN)   :: PSIGQSAT! coeff applied to qsat variance contribution
+REAL, DIMENSION(:,:,:),   INTENT(IN)   :: PMFCONV ! convective mass flux
+REAL, DIMENSION(:,:,:),   INTENT(IN)   :: PTHM    ! Theta at time t-Dt
+REAL, DIMENSION(:,:,:),   INTENT(IN)   :: PPABSTT  ! Pressure time t+Dt
+REAL, DIMENSION(:,:,:),   INTENT(IN)   :: PRCM    ! Cloud water m.r. at time t-Dt
+!
+!
+REAL, DIMENSION(:,:,:),   INTENT(IN)    :: PW_ACT ! W for CCN activation
+REAL, DIMENSION(:,:,:),   INTENT(IN)    :: PDTHRAD! THeta RADiative Tendancy
+REAL, DIMENSION(:,:,:),   INTENT(INOUT) :: PTHS   ! Theta source
+REAL, DIMENSION(:,:,:,:), INTENT(INOUT) :: PRS    ! Moist  variable sources
+REAL, DIMENSION(:,:,:,:), INTENT(INOUT) :: PSVT   ! Scalar variable at time t
+REAL, DIMENSION(:,:,:,:), INTENT(INOUT) :: PSVS   ! Scalar variable sources
+!
+!
+REAL, DIMENSION(:,:,:),   INTENT(OUT)   :: PSRCS ! Second-order flux
+                                                 ! s'rc'/2Sigma_s2 at time t+1
+                                                 ! multiplied by Lambda_3
+REAL, DIMENSION(:,:,:),   INTENT(INOUT) :: PCLDFR! Cloud fraction
+REAL, DIMENSION(:,:,:),   INTENT(INOUT) :: PICEFR! Cloud fraction
+REAL, DIMENSION(:,:,:),   INTENT(INOUT) :: PCIT  ! Pristine ice number
+                                                 ! concentration at time t
+LOGICAL,                  INTENT(IN)    :: OSEDIC! Switch to activate the
+                                                 ! cloud droplet sedimentation
+                                                 ! for ICE3            
+LOGICAL,                  INTENT(IN)    :: OACTIT ! Switch to activate the
+                                                 ! activation through temp.
+                                                 ! evolution in C2R2 and KHKO
+LOGICAL,                  INTENT(IN)    :: OSEDC ! Switch to activate the
+                                                 ! cloud droplet sedimentation
+                                                 ! for C2R2 or KHKO
+LOGICAL,                  INTENT(IN)    :: OSEDI ! Switch to activate the
+                                                 ! cloud crystal sedimentation
+LOGICAL,                  INTENT(IN)    :: ORAIN ! Switch to activate the
+                                                 ! raindrop formation
+LOGICAL,                  INTENT(IN)    :: OWARM ! Control of the rain formation
+                                                 !  by slow warm microphysical
+                                                 !         processes
+LOGICAL,                  INTENT(IN)    :: OHHONI! enable haze freezing
+LOGICAL,                  INTENT(IN)    :: OCONVHG! Switch for conversion from
+                                                  ! hail to graupel
+!
+REAL, DIMENSION(:,:,:),   INTENT(IN)    :: PCF_MF! Convective Mass Flux Cloud fraction 
+REAL, DIMENSION(:,:,:),   INTENT(IN)    :: PRC_MF! Convective Mass Flux liquid mixing ratio
+REAL, DIMENSION(:,:,:),   INTENT(IN)    :: PRI_MF! Convective Mass Flux solid mixing ratio
+!
+REAL, DIMENSION(:,:),     INTENT(INOUT) :: PINPRC   ! Cloud instant precip
+REAL, DIMENSION(:,:),     INTENT(INOUT) :: PINPRR   ! Rain instant precip
+REAL, DIMENSION(:,:,:),   INTENT(INOUT) :: PINPRR3D ! sed flux of precip
+REAL, DIMENSION(:,:,:),   INTENT(INOUT) :: PEVAP3D  ! evap profile
+REAL, DIMENSION(:,:),     INTENT(INOUT) :: PINPRS   ! Snow instant precip
+REAL, DIMENSION(:,:),     INTENT(INOUT) :: PINPRG   ! Graupel instant precip
+REAL, DIMENSION(:,:),     INTENT(INOUT) :: PINPRH   ! Hail instant precip
+REAL, DIMENSION(:,:,:),   INTENT(INOUT) :: PINPRC3D ! sed flux of precip
+REAL, DIMENSION(:,:,:),   INTENT(INOUT) :: PINPRS3D ! sed flux of precip
+REAL, DIMENSION(:,:,:),   INTENT(INOUT) :: PINPRG3D ! sed flux of precip
+REAL, DIMENSION(:,:,:),   INTENT(INOUT) :: PINPRH3D ! sed flux of precip
+REAL, DIMENSION(:,:,:,:), INTENT(IN)    :: PSOLORG  ![%] solubility fraction of soa
+REAL, DIMENSION(:,:,:,:), INTENT(IN)    :: PMI
+REAL, DIMENSION(:,:,:),   INTENT(OUT)   :: PSPEEDC ! Cloud sedimentation speed
+REAL, DIMENSION(:,:,:),   INTENT(OUT)   :: PSPEEDR ! Rain sedimentation speed
+REAL, DIMENSION(:,:,:),   INTENT(OUT)   :: PSPEEDS ! Snow sedimentation speed
+REAL, DIMENSION(:,:,:),   INTENT(OUT)   :: PSPEEDG ! Graupel sedimentation speed
+REAL, DIMENSION(:,:,:),   INTENT(OUT)   :: PSPEEDH ! Hail sedimentation speed
+REAL, DIMENSION(:,:),     INTENT(INOUT) :: PINDEP   ! Cloud instant deposition
+REAL, DIMENSION(:,:,:),   INTENT(INOUT) :: PSUPSAT  !sursat
+REAL, DIMENSION(:,:,:),   INTENT(INOUT) :: PNACT    !concentrtaion d'aérosols activés au temps t
+REAL, DIMENSION(:,:,:),   INTENT(INOUT) :: PNPRO    !concentrtaion d'aérosols activés au temps t
+REAL, DIMENSION(:,:,:),   INTENT(INOUT) :: PSSPRO   !sursat
+REAL, DIMENSION(:,:,:),   INTENT(OUT)   :: PRAINFR  ! Rain fraction
+REAL, DIMENSION(:,:,:),   INTENT(INOUT) :: PHLC_HRC !HighLow liquid content
+REAL, DIMENSION(:,:,:),   INTENT(INOUT) :: PHLC_HCF !HighLow liquid cloud fraction
+REAL, DIMENSION(:,:,:),   INTENT(INOUT) :: PHLI_HRI !HighLow ice content
+REAL, DIMENSION(:,:,:),   INTENT(INOUT) :: PHLI_HCF !HighLow ice clous fraction
+REAL, DIMENSION(:,:), OPTIONAL, INTENT(IN) :: PSEA      ! Land Sea mask
+REAL, DIMENSION(:,:), OPTIONAL, INTENT(IN) :: PTOWN      ! Town fraction
+!
+END SUBROUTINE RESOLVED_CLOUD
+END INTERFACE
+END MODULE MODI_RESOLVED_CLOUD
+!
+!     ##########################################################################
+      SUBROUTINE RESOLVED_CLOUD ( HCLOUD, HACTCCN, HSCONV, HMF_CLOUD,                  &
+                                  KRR, KSPLITR, KSPLITG, KMI, KTCOUNT,                 &
+                                  HLBCX, HLBCY, TPFILE, HRAD, HTURBDIM,                &
+                                  OSUBG_COND, OSIGMAS, HSUBG_AUCV,                     &
+                                  PTSTEP, PZZ, PRHODJ, PRHODREF, PEXNREF,              &
+                                  PPABST, PTHT, PRT, PSIGS, PSIGQSAT, PMFCONV,         &
+                                  PTHM, PRCM, PPABSTT,                                 &
+                                  PW_ACT,PDTHRAD, PTHS, PRS, PSVT, PSVS, PSRCS, PCLDFR,&
+                                  PICEFR,                                              &
+                                  PCIT, OSEDIC, OACTIT, OSEDC, OSEDI,                  &
+                                  ORAIN, OWARM, OHHONI, OCONVHG,                       &
+                                  PCF_MF,PRC_MF, PRI_MF,                               &
+                                  PINPRC,PINPRC3D,PINPRR,PINPRR3D, PEVAP3D,            &
+                                  PINPRS,PINPRS3D,PINPRG,PINPRG3D,PINPRH,PINPRH3D,     &
+                                  PSOLORG,PMI,                                         &
+                                  PSPEEDC, PSPEEDR, PSPEEDS, PSPEEDG, PSPEEDH,         &
+                                  PINDEP, PSUPSAT,  PNACT, PNPRO,PSSPRO, PRAINFR,      &
+                                  PHLC_HRC, PHLC_HCF, PHLI_HRI, PHLI_HCF,              &
+                                  PSEA,PTOWN          )   
+!     ##########################################################################
+!
+!!****  * -  compute the  resolved clouds and precipitation
+!!
+!!    PURPOSE
+!!    -------
+!!      The purpose of this routine is to compute the  microphysical sources
+!!    related to the resolved clouds and precipitation
+!!
+!!
+!!**  METHOD
+!!    ------
+!!      The main actions of this routine is to call the routines computing the
+!!    microphysical sources. Before that:
+!!        - it computes the real absolute pressure,
+!!        - negative values of the current guess of all mixing ratio are removed.
+!!          This is done by a global filling algorithm based on a multiplicative
+!!          method (Rood, 1987), in order to conserved the total mass in the
+!!          simulation domain.
+!!        - Sources are transformed in physical tendencies, by removing the
+!!          multiplicative term Rhod*J.
+!!        - External points values are filled owing to the use of cyclic
+!!          l.b.c., in order to performe computations on the full domain.
+!!      After calling to microphysical routines, the physical tendencies are
+!!    switched back to prognostic variables.
+!!
+!!
+!!    EXTERNAL
+!!    --------
+!!      Subroutine SLOW_TERMS: Computes the explicit microphysical sources
+!!      Subroutine FAST_TERMS: Performs the saturation adjustment for l
+!!      Subroutine RAIN_ICE  : Computes the explicit microphysical sources for i
+!!      Subroutine ICE_ADJUST: Performs the saturation adjustment for i+l
+!!      MIN_ll,SUM3D_ll : distributed functions equivalent to MIN and SUM
+!!
+!!
+!!    IMPLICIT ARGUMENTS
+!!    ------------------
+!!      Module MODD_PARAMETERS : contains declarations of parameter variables
+!!         JPHEXT       : Horizontal external points number
+!!         JPVEXT       : Vertical external points number
+!!      Module MODD_CST
+!!          CST%XP00               ! Reference pressure
+!!          CST%XRD                ! Gaz  constant for dry air
+!!          CST%XCPD               ! Cpd (dry air)
+!!
+!!    REFERENCE
+!!    ---------
+!!
+!!      Book1 and book2 of documentation ( routine RESOLVED_CLOUD )
+!!
+!!    AUTHOR
+!!    ------
+!!      E. Richard       * Laboratoire d'Aerologie*
+!!
+!!    MODIFICATIONS
+!!    -------------
+!!      Original    21/12/94
+!!      Modifications: June 8, 1995 ( J.Stein )
+!!                                   Cleaning to improve efficienty and clarity
+!!                                  in agreement with the MESO-NH coding norm
+!!                     March 1, 1996 ( J.Stein )
+!!                                   store the cloud fraction
+!!                     March 18, 1996 ( J.Stein )
+!!                                   check that ZMASSPOS /= 0
+!!                     Oct.  12, 1996 ( J.Stein )
+!!                                   remove the negative values correction
+!!                                   for the KES2 case
+!!      Modifications: Dec 14, 1995 (J.-P. Pinty)
+!!                                   Add the mixed-phase option
+!!      Modifications: Jul 01, 1996 (J.-P. Pinty)
+!!                                   Change arg. list in routine FAST_TERMS
+!!      Modifications: Jan 27, 1997 (J.-P. Pinty)
+!!                                   add W and SV in arg. list
+!!      Modifications: March 23, 98 (E.Richard)
+!!                                   correction of negative value based on
+!!                                  rv+rc+ri and thetal or thetail conservation
+!!      Modifications: April 08, 98 (J.-P. Lafore and V. Ducrocq )
+!!                                  modify the  correction of negative values
+!!      Modifications: June 08, 00  (J.-P. Pinty and J.-M. Cohard)
+!!                                  add the C2R2 scheme
+!!      Modifications: April 08, 01  (J.-P. Pinty)
+!!                                  add the C3R5 scheme
+!!      Modifications: July  21, 01  (J.-P. Pinty)
+!!                                  Add OHHONI and PW_ACT (for haze freezing)
+!!      Modifications: Sept 21, 01  (J.-P. Pinty)
+!!                                  Add XCONC_CCN limitation
+!!      Modifications: Nov  21, 02  (J.-P. Pinty)
+!!                                  Add ICE4 and C3R5 options
+!!                     June, 2005   (V. Masson)
+!!                                  Technical change in interface for scalar arguments
+!!      Modifications : March, 2006 (O.Geoffroy)
+!!                                  Add KHKO scheme
+!!      Modifications : March 2013  (O.Thouron)
+!!                                  Add prognostic supersaturation
+!!              July, 2015 (O.Nuissier/F.Duffourg) Add microphysics diagnostic for
+!!                                      aircraft, ballon and profiler
+!!      J.Escobar : 15/09/2015 : WENO5 & JPHEXT <> 1 
+!!      M.Mazoyer : 04/2016 : Temperature radiative tendency used for  
+!!                            activation by cooling (OACTIT)
+!!      Modification    01/2016  (JP Pinty) Add LIMA
+!!                     10/2016 M.Mazoyer New KHKO output fields
+!!                    10/2016 (C.Lac) Add droplet deposition
+!!      S.Riette  : 11/2016 : ice_adjust before and after rain_ice
+!!                            ICE3/ICE4 modified, old version under LRED=F   
+!  P. Wautelet 05/2016-04/2018: new data structures and calls for I/O
+!  P. Wautelet 01/02/2019: ZRSMIN is now allocatable (instead of size of XRTMIN which was sometimes not allocated)
+!  C. Lac         02/2019: add rain fraction as an output field
+!  P. Wautelet    02/2020: use the new data structures and subroutines for budgets
+!  B. Vie         03/2020: LIMA negativity checks after turbulence, advection and microphysics budgets
+!  B. Vie      03/03/2020: use DTHRAD instead of dT/dt in Smax diagnostic computation
+!  P. Wautelet 11/06/2020: bugfix: correct ZSVS array indices
+!  P. Wautelet 11/06/2020: bugfix: add "Non local correction for precipitating species" for ICE4
+!  P. Wautelet + Benoit Vié 06/2020: improve removal of negative scalar variables + adapt the corresponding budgets
+!  P. Wautelet 23/06/2020: remove ZSVS and ZSVT to improve code readability
+!  P. Wautelet 30/06/2020: move removal of negative scalar variables to Sources_neg_correct
+!  P. Wautelet 30/06/2020: remove non-local corrections
+!  B. Vie         06/2020: add prognostic supersaturation for LIMA
+!-------------------------------------------------------------------------------
+!
+!*       0.    DECLARATIONS
+!              ------------
+USE MODD_BUDGET,         ONLY: TBUDGETS, TBUCONF
+USE MODD_CH_AEROSOL,     ONLY: LORILAM
+USE MODD_DUST,           ONLY: LDUST
+USE MODD_CST,            ONLY: CST
+USE MODD_DIMPHYEX,       ONLY: DIMPHYEX_t
+USE MODD_DUST ,          ONLY: LDUST
+USE MODD_IO,             ONLY: TFILEDATA
+USE MODD_NEB_n,          ONLY: NEBN, CCONDENS, CLAMBDA3
+USE MODD_NSV,            ONLY: NSV, NSV_C1R3END, NSV_C2R2BEG, NSV_C2R2END,                       &
+                               NSV_LIMA_BEG, NSV_LIMA_END, NSV_LIMA_CCN_FREE, NSV_LIMA_IFN_FREE, &
+                               NSV_LIMA_NC, NSV_LIMA_NI, NSV_LIMA_NR, NSV_AEREND,NSV_DSTEND,NSV_SLTEND
+USE MODD_PARAM_C2R2,     ONLY: LSUPSAT
+USE MODD_PARAMETERS,     ONLY: JPHEXT, JPVEXT
+USE MODD_PARAM_ICE_n,    ONLY: CSEDIM, LADJ_BEFORE, LADJ_AFTER, LRED, PARAM_ICEN
+USE MODD_PARAM_LIMA,     ONLY: LADJ, LPTSPLIT, LSPRO, NMOD_CCN, NMOD_IFN, NMOD_IMM, NMOM_I
+USE MODD_RAIN_ICE_DESCR_n, ONLY: XRTMIN, RAIN_ICE_DESCRN
+USE MODD_RAIN_ICE_PARAM_n, ONLY: RAIN_ICE_PARAMN
+USE MODD_SALT,           ONLY: LSALT
+USE MODD_TURB_n,         ONLY: TURBN
+!
+USE MODE_ll
+USE MODE_FILL_DIMPHYEX, ONLY: FILL_DIMPHYEX
+use mode_sources_neg_correct, only: Sources_neg_correct
+!
+USE MODI_C2R2_ADJUST
+USE MODI_FAST_TERMS
+USE MODI_GET_HALO
+USE MODI_ICE_ADJUST
+USE MODI_KHKO_NOTADJUST
+USE MODI_LIMA
+USE MODI_LIMA_ADJUST
+USE MODI_LIMA_ADJUST_SPLIT
+USE MODI_LIMA_COLD
+USE MODI_LIMA_MIXED
+USE MODI_LIMA_NOTADJUST
+USE MODI_LIMA_WARM
+USE MODI_RAIN_C2R2_KHKO
+USE MODI_RAIN_ICE
+USE MODI_RAIN_ICE_OLD
+USE MODI_SHUMAN
+USE MODI_SLOW_TERMS
+USE MODI_AER2LIMA
+!
+IMPLICIT NONE
+!
+!*       0.1   Declarations of dummy arguments :
+!
+!
+!
+CHARACTER(LEN=4),         INTENT(IN)   :: HCLOUD   ! kind of cloud paramerization
+CHARACTER(LEN=4),         INTENT(IN)   :: HACTCCN  ! kind of CCN activation scheme
+CHARACTER(LEN=4),         INTENT(IN)   :: HSCONV   ! Shallow convection scheme
+CHARACTER(LEN=4),         INTENT(IN)   :: HMF_CLOUD! Type of statistical cloud
+INTEGER,                  INTENT(IN)   :: KRR      ! Number of moist variables
+INTEGER,                  INTENT(IN)   :: KSPLITR  ! Number of small time step
+                                       ! integrations for  rain sedimendation
+INTEGER,                  INTENT(IN)   :: KSPLITG  ! Number of small time step
+                                       ! integrations for  ice  sedimendation
+INTEGER,                  INTENT(IN)   :: KMI      ! Model index
+INTEGER,                  INTENT(IN)   :: KTCOUNT  ! Temporal loop counter
+CHARACTER(LEN=4), DIMENSION(2), INTENT(IN) :: HLBCX,HLBCY   ! X and Y-direc. LBC type
+TYPE(TFILEDATA),          INTENT(IN)   :: TPFILE   ! Output file
+CHARACTER(len=4),         INTENT(IN)   :: HRAD     ! Radiation scheme name
+CHARACTER(len=4),         INTENT(IN)   :: HTURBDIM ! Dimensionality of the
+                                                   ! turbulence scheme
+LOGICAL,                  INTENT(IN)   :: OSUBG_COND ! Switch for Subgrid Cond.
+LOGICAL,                  INTENT(IN)   :: OSIGMAS  ! Switch for Sigma_s:
+                                        ! use values computed in CONDENSATION
+                                        ! or that from turbulence scheme
+CHARACTER(LEN=4),         INTENT(IN)   :: HSUBG_AUCV
+                                        ! Kind of Subgrid autoconversion method
+REAL,                     INTENT(IN)   :: PTSTEP ! Time step :XTSTEP in namelist
+!
+!
+REAL, DIMENSION(:,:,:),   INTENT(IN)   :: PZZ     ! Height (z)
+REAL, DIMENSION(:,:,:),   INTENT(IN)   :: PRHODJ  !Dry density * Jacobian
+REAL, DIMENSION(:,:,:),   INTENT(IN)   :: PRHODREF! Reference dry air density
+REAL, DIMENSION(:,:,:),   INTENT(IN)   :: PEXNREF ! Reference Exner function
+!
+!
+REAL, DIMENSION(:,:,:),   INTENT(IN)   :: PPABST  ! abs. pressure at time t
+REAL, DIMENSION(:,:,:),   INTENT(IN)   :: PTHT    ! Theta at time t
+REAL, DIMENSION(:,:,:,:), INTENT(INOUT):: PRT     ! Moist variables at time t
+REAL, DIMENSION(:,:,:),   INTENT(IN)   :: PSIGS   ! Sigma_s at time t
+REAL,                     INTENT(IN)   :: PSIGQSAT! coeff applied to qsat variance contribution
+REAL, DIMENSION(:,:,:),   INTENT(IN)   :: PMFCONV ! convective mass flux
+REAL, DIMENSION(:,:,:),   INTENT(IN)   :: PTHM    ! Theta at time t-Dt
+REAL, DIMENSION(:,:,:),   INTENT(IN)   :: PPABSTT ! Pressure time t+Dt
+REAL, DIMENSION(:,:,:),   INTENT(IN)   :: PRCM    ! Cloud water m.r. at time t-Dt
+!
+!
+REAL, DIMENSION(:,:,:),   INTENT(IN)    :: PW_ACT ! W for CCN activation
+REAL, DIMENSION(:,:,:),   INTENT(IN)    :: PDTHRAD! THeta RADiative Tendancy
+REAL, DIMENSION(:,:,:),   INTENT(INOUT) :: PTHS   ! Theta source
+REAL, DIMENSION(:,:,:,:), INTENT(INOUT) :: PRS    ! Moist  variable sources
+REAL, DIMENSION(:,:,:,:), INTENT(INOUT) :: PSVT   ! Scalar variable at time t
+REAL, DIMENSION(:,:,:,:), INTENT(INOUT) :: PSVS   ! Scalar variable sources
+!
+!
+REAL, DIMENSION(:,:,:),   INTENT(OUT)   :: PSRCS ! Second-order flux
+                                                 ! s'rc'/2Sigma_s2 at time t+1
+                                                 ! multiplied by Lambda_3
+REAL, DIMENSION(:,:,:),   INTENT(INOUT) :: PCLDFR! Cloud fraction
+REAL, DIMENSION(:,:,:),   INTENT(INOUT) :: PICEFR! Cloud fraction
+REAL, DIMENSION(:,:,:),   INTENT(INOUT) :: PCIT  ! Pristine ice number
+                                                 ! concentration at time t
+LOGICAL,                  INTENT(IN)    :: OSEDIC! Switch to activate the
+                                                 ! cloud droplet sedimentation
+                                                 ! for ICE3            
+LOGICAL,                  INTENT(IN)    :: OACTIT ! Switch to activate the
+                                                 ! activation through temp.
+                                                 ! evolution in C2R2 and KHKO
+LOGICAL,                  INTENT(IN)    :: OSEDC ! Switch to activate the
+                                                 ! cloud droplet sedimentation
+LOGICAL,                  INTENT(IN)    :: OSEDI ! Switch to activate the
+                                                 ! cloud crystal sedimentation
+LOGICAL,                  INTENT(IN)    :: ORAIN ! Switch to activate the
+                                                 ! raindrop formation
+LOGICAL,                  INTENT(IN)    :: OWARM ! Control of the rain formation
+                                                 !  by slow warm microphysical
+                                                 !         processes
+LOGICAL,                  INTENT(IN)    :: OHHONI! enable haze freezing
+LOGICAL,                  INTENT(IN)    :: OCONVHG! Switch for conversion from
+                                                  ! hail to graupel
+!
+REAL, DIMENSION(:,:,:),   INTENT(IN)    :: PCF_MF! Convective Mass Flux Cloud fraction 
+REAL, DIMENSION(:,:,:),   INTENT(IN)    :: PRC_MF! Convective Mass Flux liquid mixing ratio
+REAL, DIMENSION(:,:,:),   INTENT(IN)    :: PRI_MF! Convective Mass Flux solid mixing ratio
+!
+REAL, DIMENSION(:,:),     INTENT(INOUT) :: PINPRC   ! Cloud instant precip
+REAL, DIMENSION(:,:),     INTENT(INOUT) :: PINPRR   ! Rain instant precip
+REAL, DIMENSION(:,:,:),   INTENT(INOUT) :: PINPRR3D ! sed flux of precip
+REAL, DIMENSION(:,:,:),   INTENT(INOUT) :: PEVAP3D  ! evap profile
+REAL, DIMENSION(:,:),     INTENT(INOUT) :: PINPRS   ! Snow instant precip
+REAL, DIMENSION(:,:),     INTENT(INOUT) :: PINPRG   ! Graupel instant precip
+REAL, DIMENSION(:,:),     INTENT(INOUT) :: PINPRH   ! Hail instant precip
+REAL, DIMENSION(:,:,:),   INTENT(INOUT) :: PINPRC3D ! sed flux of precip
+REAL, DIMENSION(:,:,:),   INTENT(INOUT) :: PINPRS3D ! sed flux of precip
+REAL, DIMENSION(:,:,:),   INTENT(INOUT) :: PINPRG3D ! sed flux of precip
+REAL, DIMENSION(:,:,:),   INTENT(INOUT) :: PINPRH3D ! sed flux of precip
+REAL, DIMENSION(:,:,:,:), INTENT(IN)    :: PSOLORG  ![%] solubility fraction of soa
+REAL, DIMENSION(:,:,:,:), INTENT(IN)    :: PMI
+REAL, DIMENSION(:,:,:),   INTENT(OUT)   :: PSPEEDC ! Cloud sedimentation speed
+REAL, DIMENSION(:,:,:),   INTENT(OUT)   :: PSPEEDR ! Rain sedimentation speed
+REAL, DIMENSION(:,:,:),   INTENT(OUT)   :: PSPEEDS ! Snow sedimentation speed
+REAL, DIMENSION(:,:,:),   INTENT(OUT)   :: PSPEEDG ! Graupel sedimentation speed
+REAL, DIMENSION(:,:,:),   INTENT(OUT)   :: PSPEEDH ! Hail sedimentation speed
+REAL, DIMENSION(:,:),     INTENT(INOUT) :: PINDEP   ! Cloud instant deposition
+REAL, DIMENSION(:,:,:),   INTENT(INOUT) :: PSUPSAT  !sursat
+REAL, DIMENSION(:,:,:),   INTENT(INOUT) :: PNACT    !concentrtaion d'aérosols activés au temps t
+REAL, DIMENSION(:,:,:),   INTENT(INOUT) :: PNPRO    !concentrtaion d'aérosols activés au temps t
+REAL, DIMENSION(:,:,:),   INTENT(INOUT) :: PSSPRO   !sursat
+REAL, DIMENSION(:,:,:),   INTENT(OUT)   :: PRAINFR  ! Rain fraction
+REAL, DIMENSION(:,:,:),   INTENT(INOUT) :: PHLC_HRC !HighLow liquid content
+REAL, DIMENSION(:,:,:),   INTENT(INOUT) :: PHLC_HCF !HighLow liquid cloud fraction
+REAL, DIMENSION(:,:,:),   INTENT(INOUT) :: PHLI_HRI !HighLow ice content
+REAL, DIMENSION(:,:,:),   INTENT(INOUT) :: PHLI_HCF !HighLow ice clous fraction
+REAL, DIMENSION(:,:), OPTIONAL, INTENT(IN) :: PSEA      ! Land Sea mask
+REAL, DIMENSION(:,:), OPTIONAL, INTENT(IN) :: PTOWN      ! Town fraction
+!
+!
+!*       0.2   Declarations of local variables :
+!
+INTEGER :: JRR,JSV       ! Loop index for the moist and scalar variables
+INTEGER :: IIB           !  Define the physical domain
+INTEGER :: IIE           !
+INTEGER :: IJB           !
+INTEGER :: IJE           !
+INTEGER :: IKB           !
+INTEGER :: IKE           !
+INTEGER :: IKU
+INTEGER :: IINFO_ll      ! return code of parallel routine
+INTEGER :: JK,JI,JL
+!
+!
+!
+REAL, DIMENSION(SIZE(PZZ,1),SIZE(PZZ,2),SIZE(PZZ,3)):: ZDZZ
+real, dimension(:,:,:), allocatable :: ZEXN
+REAL, DIMENSION(SIZE(PZZ,1),SIZE(PZZ,2),SIZE(PZZ,3)):: ZZZ
+                                    ! model layer height
+! REAL  :: ZMASSTOT                   ! total mass  for one water category
+!                                     ! including the negative values
+! REAL  :: ZMASSPOS                   ! total mass  for one water category
+!                                     ! after removing the negative values
+! REAL  :: ZRATIO                     ! ZMASSTOT / ZMASSCOR
+!
+INTEGER                               :: ISVBEG ! first scalar index for microphysics
+INTEGER                               :: ISVEND ! last  scalar index for microphysics
+!UPG*PT
+REAL, DIMENSION(:,:,:,:), ALLOCATABLE :: ZSVT   ! scalar variable for microphysics only
+!UPG*PT
+
+REAL, DIMENSION(SIZE(PZZ,1),SIZE(PZZ,2),SIZE(PZZ,3), KRR) :: ZFPR
+!
+INTEGER                               :: JMOD, JMOD_IFN
+LOGICAL                               :: GWEST,GEAST,GNORTH,GSOUTH
+LOGICAL                               :: LMFCONV ! =SIZE(PMFCONV)!=0
+! BVIE work array waiting for PINPRI
+REAL, DIMENSION(SIZE(PZZ,1),SIZE(PZZ,2)):: ZINPRI
+REAL, DIMENSION(SIZE(PZZ,1),SIZE(PZZ,2),SIZE(PZZ,3)):: ZICEFR
+REAL, DIMENSION(SIZE(PZZ,1),SIZE(PZZ,2),SIZE(PZZ,3)):: ZPRCFR
+REAL, DIMENSION(SIZE(PZZ,1),SIZE(PZZ,2),SIZE(PZZ,3)):: ZTM
+REAL, DIMENSION(SIZE(PZZ,1),SIZE(PZZ,2)) :: ZSIGQSAT2D
+TYPE(DIMPHYEX_t) :: YLDIMPHYEX
+REAL, DIMENSION(SIZE(PZZ,1),SIZE(PZZ,2),SIZE(PZZ,3)):: ZDUM
+ZSIGQSAT2D(:,:) = PSIGQSAT
+!
+!------------------------------------------------------------------------------
+!
+!*       1.     PRELIMINARY COMPUTATIONS
+!               ------------------------
+!
+CALL GET_INDICE_ll (IIB,IJB,IIE,IJE)
+IKB=1+JPVEXT
+IKE=SIZE(PZZ,3) - JPVEXT
+IKU=SIZE(PZZ,3)
+!
+CALL FILL_DIMPHYEX(YLDIMPHYEX, SIZE(PZZ,1), SIZE(PZZ,2), SIZE(PZZ,3))
+!
+GWEST  = LWEST_ll()
+GEAST  = LEAST_ll()
+GSOUTH = LSOUTH_ll()
+GNORTH = LNORTH_ll()
+!
+LMFCONV=(SIZE(PMFCONV)/=0)
+!
+IF (HCLOUD == 'C2R2' .OR. HCLOUD == 'KHKO') THEN
+  ISVBEG = NSV_C2R2BEG
+  ISVEND = NSV_C2R2END
+ELSE IF (HCLOUD == 'C3R5') THEN
+  ISVBEG = NSV_C2R2BEG
+  ISVEND = NSV_C1R3END
+ELSE IF (HCLOUD == 'LIMA') THEN
+  ISVBEG = NSV_LIMA_BEG
+  IF (.NOT. LDUST .AND. .NOT. LSALT .AND. .NOT. LORILAM) THEN
+    ISVEND = NSV_LIMA_END
+  ELSE
+    IF (LORILAM) THEN
+      ISVEND = NSV_AEREND
+    END IF
+    IF (LDUST) THEN
+      ISVEND = NSV_DSTEND
+    END IF
+    IF (LSALT) THEN
+      ISVEND = NSV_SLTEND
+    END IF
+  END IF
+ELSE
+  ISVBEG = 0
+  ISVEND = 0
+END IF
+!
+!
+!
+!*        1.    From ORILAM to LIMA: 
+!
+IF (HCLOUD == 'LIMA' .AND. ((LORILAM).OR.(LDUST).OR.(LSALT))) THEN
+! ORILAM : tendance s --> variable instant t
+ALLOCATE(ZSVT(SIZE(PZZ,1),SIZE(PZZ,2),SIZE(PZZ,3),NSV))
+  DO JSV = 1, NSV
+    ZSVT(:,:,:,JSV) = PSVS(:,:,:,JSV) * PTSTEP / PRHODJ(:,:,:)
+  END DO
+
+CALL AER2LIMA(ZSVT(IIB:IIE,IJB:IJE,IKB:IKE,:),&
+              PRHODREF(IIB:IIE,IJB:IJE,IKB:IKE), &
+              PRT(IIB:IIE,IJB:IJE,IKB:IKE,1),&
+              PPABST(IIB:IIE,IJB:IJE,IKB:IKE),&
+              PTHT(IIB:IIE,IJB:IJE,IKB:IKE), &
+              PZZ(IIB:IIE,IJB:IJE,IKB:IKE))
+
+! LIMA : variable instant t --> tendance s
+  PSVS(:,:,:,NSV_LIMA_CCN_FREE)   = ZSVT(:,:,:,NSV_LIMA_CCN_FREE) * &
+                                    PRHODJ(:,:,:) / PTSTEP
+  PSVS(:,:,:,NSV_LIMA_CCN_FREE+1) = ZSVT(:,:,:,NSV_LIMA_CCN_FREE+1) * &
+                                    PRHODJ(:,:,:) / PTSTEP
+  PSVS(:,:,:,NSV_LIMA_CCN_FREE+2) = ZSVT(:,:,:,NSV_LIMA_CCN_FREE+2) * &
+                                    PRHODJ(:,:,:) / PTSTEP
+
+  PSVS(:,:,:,NSV_LIMA_IFN_FREE)   = ZSVT(:,:,:,NSV_LIMA_IFN_FREE) * &
+                                    PRHODJ(:,:,:) / PTSTEP
+  PSVS(:,:,:,NSV_LIMA_IFN_FREE+1) = ZSVT(:,:,:,NSV_LIMA_IFN_FREE+1) * &
+                                    PRHODJ(:,:,:) / PTSTEP
+
+DEALLOCATE(ZSVT)
+END IF
+
+!UPG*PT
+!
+!
+!*       2.     TRANSFORMATION INTO PHYSICAL TENDENCIES
+!               ---------------------------------------
+!
+PTHS(:,:,:) = PTHS(:,:,:) / PRHODJ(:,:,:)
+DO JRR = 1,KRR
+  PRS(:,:,:,JRR)  = PRS(:,:,:,JRR) / PRHODJ(:,:,:)
+END DO
+!
+IF (HCLOUD=='C2R2' .OR. HCLOUD=='C3R5' .OR. HCLOUD=='KHKO' .OR. HCLOUD=='LIMA') THEN
+  DO JSV = ISVBEG, ISVEND
+    PSVS(:,:,:,JSV) = PSVS(:,:,:,JSV) / PRHODJ(:,:,:)
+  ENDDO
+ENDIF
+!
+!  complete the lateral boundaries to avoid possible problems
+!
+DO JI=1,JPHEXT
+ PTHS(JI,:,:) = PTHS(IIB,:,:)
+ PTHS(IIE+JI,:,:) = PTHS(IIE,:,:)
+ PTHS(:,JI,:) = PTHS(:,IJB,:)
+ PTHS(:,IJE+JI,:) = PTHS(:,IJE,:)
+!
+ PRS(JI,:,:,:) = PRS(IIB,:,:,:)
+ PRS(IIE+JI,:,:,:) = PRS(IIE,:,:,:)
+ PRS(:,JI,:,:) = PRS(:,IJB,:,:)
+ PRS(:,IJE+JI,:,:) = PRS(:,IJE,:,:)
+END DO
+!
+!  complete the physical boundaries to avoid some computations
+!
+IF(GWEST  .AND. HLBCX(1) /= 'CYCL')  PRT(:IIB-1,:,:,2:) = 0.0
+IF(GEAST  .AND. HLBCX(2) /= 'CYCL')  PRT(IIE+1:,:,:,2:) = 0.0
+IF(GSOUTH .AND. HLBCY(1) /= 'CYCL')  PRT(:,:IJB-1,:,2:) = 0.0
+IF(GNORTH .AND. HLBCY(2) /= 'CYCL')  PRT(:,IJE+1:,:,2:) = 0.0
+!
+IF (HCLOUD=='C2R2' .OR. HCLOUD=='C3R5' .OR. HCLOUD=='KHKO' .OR. HCLOUD=='LIMA') THEN
+DO JI=1,JPHEXT
+  PSVS(JI,     :,      :, ISVBEG:ISVEND) = PSVS(IIB, :,   :, ISVBEG:ISVEND)
+  PSVS(IIE+JI, :,      :, ISVBEG:ISVEND) = PSVS(IIE, :,   :, ISVBEG:ISVEND)
+  PSVS(:,      JI,     :, ISVBEG:ISVEND) = PSVS(:,   IJB, :, ISVBEG:ISVEND)
+  PSVS(:,      IJE+JI, :, ISVBEG:ISVEND) = PSVS(:,   IJE, :, ISVBEG:ISVEND)
+END DO
+ !
+!  complete the physical boundaries to avoid some computations
+!
+  IF(GWEST  .AND. HLBCX(1) /= 'CYCL') PSVT(:IIB-1, :,      :, ISVBEG:ISVEND) = 0.0
+  IF(GEAST  .AND. HLBCX(2) /= 'CYCL') PSVT(IIE+1:, :,      :, ISVBEG:ISVEND) = 0.0
+  IF(GSOUTH .AND. HLBCY(1) /= 'CYCL') PSVT(:,      :IJB-1, :, ISVBEG:ISVEND) = 0.0
+  IF(GNORTH .AND. HLBCY(2) /= 'CYCL') PSVT(:,      IJE+1:, :, ISVBEG:ISVEND) = 0.0
+ENDIF
+!
+!  complete the vertical boundaries
+!
+PTHS(:,:,IKB-1) = PTHS(:,:,IKB)
+PTHS(:,:,IKE+1) = PTHS(:,:,IKE)
+!
+PRS(:,:,IKB-1,:) = PRS(:,:,IKB,:)
+PRS(:,:,IKE+1,:) = PRS(:,:,IKE,:)
+!
+PRT(:,:,IKB-1,:) = PRT(:,:,IKB,:)
+PRT(:,:,IKE+1,:) = PRT(:,:,IKE,:)
+!
+IF (HCLOUD == 'C2R2' .OR. HCLOUD == 'C3R5' .OR. HCLOUD == 'KHKO' &
+                                           .OR. HCLOUD == 'LIMA') THEN
+  PSVS(:,:,IKB-1,ISVBEG:ISVEND) = PSVS(:,:,IKB,ISVBEG:ISVEND)
+  PSVS(:,:,IKE+1,ISVBEG:ISVEND) = PSVS(:,:,IKE,ISVBEG:ISVEND)
+  PSVT(:,:,IKB-1,ISVBEG:ISVEND) = PSVT(:,:,IKB,ISVBEG:ISVEND)
+  PSVT(:,:,IKE+1,ISVBEG:ISVEND) = PSVT(:,:,IKE,ISVBEG:ISVEND)
+ENDIF
+!
+!
+!*       3.     REMOVE NEGATIVE VALUES
+!               ----------------------
+!
+!*       3.1    Non local correction for precipitating species (Rood 87)
+!
+! IF (      HCLOUD == 'KESS'                       &
+!      .OR. HCLOUD == 'ICE3' .OR. HCLOUD == 'ICE4' &
+!      .OR. HCLOUD == 'C2R2' .OR. HCLOUD == 'C3R5' &
+!      .OR. HCLOUD == 'KHKO' .OR. HCLOUD == 'LIMA' ) THEN
+! !
+!   DO JRR = 3,KRR
+!     SELECT CASE (JRR)
+!       CASE(3,5,6,7) ! rain, snow, graupel and hail
+!
+!         IF ( MIN_ll( PRS(:,:,:,JRR), IINFO_ll) < 0.0 ) THEN
+! !
+! ! compute the total water mass computation
+! !
+!           ZMASSTOT = MAX( 0. , SUM3D_ll( PRS(:,:,:,JRR), IINFO_ll ) )
+! !
+! ! remove the negative values
+! !
+!           PRS(:,:,:,JRR) = MAX( 0., PRS(:,:,:,JRR) )
+! !
+! ! compute the new total mass
+! !
+!           ZMASSPOS = MAX(XMNH_TINY,SUM3D_ll( PRS(:,:,:,JRR), IINFO_ll ) )
+! !
+! ! correct again in such a way to conserve the total mass
+! !
+!           ZRATIO = ZMASSTOT / ZMASSPOS
+!           PRS(:,:,:,JRR) = PRS(:,:,:,JRR) * ZRATIO
+! !
+!         END IF
+!     END SELECT
+!   END DO
+! END IF
+!
+!*       3.2    Adjustement for liquid and solid cloud
+!
+! Remove non-physical negative values (unnecessary in a perfect world) + corresponding budgets
+call Sources_neg_correct( hcloud, 'NEGA', krr, ptstep, ppabst, ptht, prt, pths, prs, psvs, prhodj )
+!
+!*       3.4    Limitations of Na and Nc to the CCN max number concentration
+!
+! Commented by O.Thouron 03/2013
+!IF ((HCLOUD == 'C2R2' .OR. HCLOUD == 'C3R5' .OR. HCLOUD == 'KHKO') &
+!     .AND.(XCONC_CCN > 0)) THEN
+!  IF ((HACTCCN /= 'ABRK')) THEN
+!  ZSVT(:,:,:,1) = MIN( ZSVT(:,:,:,1),XCONC_CCN )
+!  ZSVT(:,:,:,2) = MIN( ZSVT(:,:,:,2),XCONC_CCN )
+!  ZSVS(:,:,:,1) = MIN( ZSVS(:,:,:,1),XCONC_CCN )
+!  ZSVS(:,:,:,2) = MIN( ZSVS(:,:,:,2),XCONC_CCN )
+!  END IF
+!END IF
+!
+!
+!-------------------------------------------------------------------------------
+!
+SELECT CASE ( HCLOUD )
+  CASE ('REVE')
+!
+!*       4.     REVERSIBLE MICROPHYSICAL SCHEME
+!               -------------------------------
+!
+    CALL FAST_TERMS ( KRR, KMI, HRAD, HTURBDIM,                                &
+                      HSCONV, HMF_CLOUD, OSUBG_COND, PTSTEP,                   &
+                      PRHODJ, PSIGS, PPABST,                                   &
+                      PCF_MF,PRC_MF,                                           &
+                      PRVT=PRT(:,:,:,1), PRCT=PRT(:,:,:,2),                    &
+                      PRVS=PRS(:,:,:,1), PRCS=PRS(:,:,:,2),                    &
+                      PTHS=PTHS, PSRCS=PSRCS, PCLDFR=PCLDFR                    )
+!
+  CASE ('KESS')
+!
+!*       5.     KESSLER MICROPHYSICAL SCHEME
+!               ----------------------------
+!
+!
+!*       5.1    Compute the explicit microphysical sources
+!
+    CALL SLOW_TERMS ( KSPLITR, PTSTEP, KMI, HSUBG_AUCV,                       &
+                      PZZ, PRHODJ, PRHODREF, PCLDFR,                          &
+                      PTHT, PRT(:,:,:,1), PRT(:,:,:,2), PRT(:,:,:,3), PPABST, &
+                      PTHS, PRS(:,:,:,1), PRS(:,:,:,2), PRS(:,:,:,3),         &
+                      PINPRR, PINPRR3D, PEVAP3D                         )
+!
+!*       5.2    Perform the saturation adjustment
+!
+    CALL FAST_TERMS ( KRR, KMI, HRAD, HTURBDIM,                                &
+                      HSCONV, HMF_CLOUD, OSUBG_COND, PTSTEP,                   &
+                      PRHODJ, PSIGS, PPABST,                                   &
+                      PCF_MF,PRC_MF,                                           &
+                      PRVT=PRT(:,:,:,1), PRCT=PRT(:,:,:,2),                    &
+                      PRVS=PRS(:,:,:,1), PRCS=PRS(:,:,:,2), PRRS=PRS(:,:,:,3), &
+                      PTHS=PTHS, PSRCS=PSRCS, PCLDFR=PCLDFR                    )
+!
+!
+  CASE ('C2R2','KHKO')
+!
+!*       7.     2-MOMENT WARM MICROPHYSICAL SCHEME C2R2 or KHKO
+!               ---------------------------------------
+!
+!
+!*       7.1    Compute the explicit microphysical sources
+!
+!
+    CALL RAIN_C2R2_KHKO ( HCLOUD, OACTIT, OSEDC, ORAIN, KSPLITR, PTSTEP, KMI,     &
+                     TPFILE, PZZ, PRHODJ, PRHODREF, PEXNREF,                      &
+                     PPABST, PTHT, PRT(:,:,:,1), PRT(:,:,:,2),  PRT(:,:,:,3),     &
+                     PTHM, PRCM, PPABSTT,                                          &
+                     PW_ACT,PDTHRAD,PTHS, PRS(:,:,:,1),PRS(:,:,:,2),PRS(:,:,:,3), &
+                     PSVT(:,:,:,NSV_C2R2BEG),   PSVT(:,:,:,NSV_C2R2BEG+1),        &
+                     PSVT(:,:,:,NSV_C2R2BEG+2), PSVS(:,:,:,NSV_C2R2BEG),          &
+                     PSVS(:,:,:,NSV_C2R2BEG+1), PSVS(:,:,:,NSV_C2R2BEG+2),        &
+                     PINPRC, PINPRR, PINPRR3D, PEVAP3D ,                          &
+                     PSVT(:,:,:,:), PSOLORG, PMI, HACTCCN,                        &
+                     PINDEP, PSUPSAT, PNACT                                       )
+!
+!
+!*       7.2    Perform the saturation adjustment
+!
+   IF (LSUPSAT) THEN
+    CALL KHKO_NOTADJUST (KRR, KTCOUNT,TPFILE, HRAD,                              &
+                         PTSTEP, PRHODJ, PPABSTT, PPABST, PRHODREF, PZZ,          &
+                         PTHT,PRT(:,:,:,1),PRT(:,:,:,2),PRT(:,:,:,3),            &
+                         PTHS,PRS(:,:,:,1),PRS(:,:,:,2),PRS(:,:,:,3),            &
+                         PSVS(:,:,:,NSV_C2R2BEG+1), PSVS(:,:,:,NSV_C2R2BEG),     &
+                         PSVS(:,:,:,NSV_C2R2BEG+3), PCLDFR, PSRCS, PNPRO, PSSPRO )
+!
+   ELSE
+    CALL C2R2_ADJUST ( KRR,TPFILE, HRAD,                                &
+                       HTURBDIM, OSUBG_COND, PTSTEP,                    &
+                       PRHODJ, PSIGS, PPABST,                           &
+                       PTHS=PTHS, PRVS=PRS(:,:,:,1), PRCS=PRS(:,:,:,2), &
+                       PCNUCS=PSVS(:,:,:,NSV_C2R2BEG),                  &
+                       PCCS=PSVS(:,:,:,NSV_C2R2BEG+1),                  &
+                       PSRCS=PSRCS, PCLDFR=PCLDFR, PRRS=PRS(:,:,:,3)    )
+!
+   END IF
+!
+  CASE ('ICE3')
+!
+!*       9.     MIXED-PHASE MICROPHYSICAL SCHEME (WITH 3 ICE SPECIES)
+!               -----------------------------------------------------
+!
+    allocate( zexn( size( pzz, 1 ), size( pzz, 2 ), size( pzz, 3 ) ) )
+    ZEXN(:,:,:)= (PPABST(:,:,:)/CST%XP00)**(CST%XRD/CST%XCPD)
+!
+!*       9.1    Compute the explicit microphysical sources
+!
+!
+    DO JK=IKB,IKE
+      ZDZZ(:,:,JK)=PZZ(:,:,JK+1)-PZZ(:,:,JK)    
+    ENDDO
+    ZZZ = MZF( PZZ )
+    IF(LRED .AND. LADJ_BEFORE) THEN
+      CALL ICE_ADJUST (YLDIMPHYEX,CST, RAIN_ICE_PARAMN, NEBN, TURBN,           &
+                      PARAM_ICEN, TBUCONF, KRR,                                &
+                      'ADJU',                                                  &
+                      PTSTEP, ZSIGQSAT2D,                                      &
+                      PRHODJ, PEXNREF, PRHODREF, PSIGS, LMFCONV,PMFCONV, PPABST, ZZZ,  &
+                      ZEXN, PCF_MF, PRC_MF, PRI_MF,                            &
+                      ZDUM, ZDUM, ZDUM, ZDUM, ZDUM,                            &
+                      PRV=PRS(:,:,:,1)*PTSTEP, PRC=PRS(:,:,:,2)*PTSTEP,        &
+                      PRVS=PRS(:,:,:,1), PRCS=PRS(:,:,:,2),                    &
+                      PTH=PTHS*PTSTEP, PTHS=PTHS,                              &
+                      OCOMPUTE_SRC=SIZE(PSRCS, 3)/=0, PSRCS=PSRCS, PCLDFR=PCLDFR,    &
+                      PRR=PRS(:,:,:,3)*PTSTEP,                                 &
+                      PRI=PRS(:,:,:,4)*PTSTEP, PRIS=PRS(:,:,:,4),              &
+                      PRS=PRS(:,:,:,5)*PTSTEP,                                 &
+                      PRG=PRS(:,:,:,6)*PTSTEP,                                 &
+                      TBUDGETS=TBUDGETS,KBUDGETS=SIZE(TBUDGETS),               &
+                      PHLC_HRC=PHLC_HRC, PHLC_HCF=PHLC_HCF,                    &
+                      PHLI_HRI=PHLI_HRI, PHLI_HCF=PHLI_HCF                     )
+    ENDIF
+    IF (LRED) THEN
+      CALL RAIN_ICE (YLDIMPHYEX,CST, PARAM_ICEN, RAIN_ICE_PARAMN,        &
+                    RAIN_ICE_DESCRN, TBUCONF,                            &
+                    PTSTEP, KRR, ZEXN,                                   &
+                    ZDZZ, PRHODJ, PRHODREF, PEXNREF, PPABST, PCIT,PCLDFR,&
+                    PHLC_HRC, PHLC_HCF, PHLI_HRI, PHLI_HCF,              &
+                    PTHT, PRT(:,:,:,1), PRT(:,:,:,2),                    &
+                    PRT(:,:,:,3), PRT(:,:,:,4),                          &
+                    PRT(:,:,:,5), PRT(:,:,:,6),                          &
+                    PTHS, PRS(:,:,:,1), PRS(:,:,:,2), PRS(:,:,:,3),      &
+                    PRS(:,:,:,4), PRS(:,:,:,5), PRS(:,:,:,6),            &
+                    PINPRC,PINPRR, PEVAP3D,                    &
+                    PINPRS, PINPRG, PINDEP, PRAINFR, PSIGS,              &
+                    TBUDGETS,SIZE(TBUDGETS),           &
+                    PSEA,PTOWN, PFPR=ZFPR                                )
+    ELSE 
+      CALL RAIN_ICE_OLD (YLDIMPHYEX, OSEDIC, CSEDIM, HSUBG_AUCV, OWARM, 1, IKU, 1,    &
+                    KSPLITR, PTSTEP, KRR,                                 &
+                    ZDZZ, PRHODJ, PRHODREF, PEXNREF, PPABST, PCIT, PCLDFR,&
+                    PTHT, PRT(:,:,:,1), PRT(:,:,:,2),                     &
+                    PRT(:,:,:,3), PRT(:,:,:,4),                           &
+                    PRT(:,:,:,5), PRT(:,:,:,6),                           &
+                    PTHS, PRS(:,:,:,1), PRS(:,:,:,2), PRS(:,:,:,3),       &
+                    PRS(:,:,:,4), PRS(:,:,:,5), PRS(:,:,:,6),             &
+                    PINPRC,PINPRR, PINPRR3D, PEVAP3D,                     &
+                    PINPRS, PINPRG, PSIGS,PINDEP, PRAINFR,                &
+                    PSEA, PTOWN, PFPR=ZFPR)
+    END IF
+
+!
+!*       9.2    Perform the saturation adjustment over cloud ice and cloud water
+!
+!
+    IF (.NOT. LRED .OR. (LRED .AND. LADJ_AFTER) ) THEN
+      CALL ICE_ADJUST (YLDIMPHYEX,CST, RAIN_ICE_PARAMN, NEBN, TURBN,           &
+                       PARAM_ICEN, TBUCONF, KRR,                               &
+                       'DEPI',                                                 &
+                       PTSTEP, ZSIGQSAT2D,                                     &
+                       PRHODJ, PEXNREF, PRHODREF, PSIGS, LMFCONV, PMFCONV,PPABST, ZZZ, &
+                       ZEXN, PCF_MF, PRC_MF, PRI_MF,                           &
+                       ZDUM, ZDUM, ZDUM, ZDUM, ZDUM,                           &
+                       PRV=PRS(:,:,:,1)*PTSTEP, PRC=PRS(:,:,:,2)*PTSTEP,       &
+                       PRVS=PRS(:,:,:,1), PRCS=PRS(:,:,:,2),                   &
+                       PTH=PTHS*PTSTEP, PTHS=PTHS,                             &
+                       OCOMPUTE_SRC=SIZE(PSRCS, 3)/=0, PSRCS=PSRCS, PCLDFR=PCLDFR, &
+                       PRR=PRS(:,:,:,3)*PTSTEP,                                &
+                       PRI=PRS(:,:,:,4)*PTSTEP, PRIS=PRS(:,:,:,4),             &
+                       PRS=PRS(:,:,:,5)*PTSTEP,                                &
+                       PRG=PRS(:,:,:,6)*PTSTEP,                                &
+                       TBUDGETS=TBUDGETS,KBUDGETS=SIZE(TBUDGETS),              &
+                       PHLC_HRC=PHLC_HRC, PHLC_HCF=PHLC_HCF,                   &
+                       PHLI_HRI=PHLI_HRI, PHLI_HCF=PHLI_HCF                    )
+    END IF
+
+    deallocate( zexn )
+!
+  CASE ('ICE4')
+!
+!*       10.    MIXED-PHASE MICROPHYSICAL SCHEME (WITH 4 ICE SPECIES)
+!               -----------------------------------------------------
+!
+    allocate( zexn( size( pzz, 1 ), size( pzz, 2 ), size( pzz, 3 ) ) )
+    ZEXN(:,:,:)= (PPABST(:,:,:)/CST%XP00)**(CST%XRD/CST%XCPD)
+!
+!*       10.1   Compute the explicit microphysical sources
+!
+!
+    DO JK=IKB,IKE
+      ZDZZ(:,:,JK)=PZZ(:,:,JK+1)-PZZ(:,:,JK)    
+    ENDDO
+    ZZZ = MZF( PZZ )
+    IF(LRED .AND. LADJ_BEFORE) THEN
+      CALL ICE_ADJUST (YLDIMPHYEX,CST, RAIN_ICE_PARAMN, NEBN, TURBN,           &
+                       PARAM_ICEN, TBUCONF, KRR,                               &
+                       'ADJU',                                                 &
+                       PTSTEP, ZSIGQSAT2D,                                     &
+                       PRHODJ, PEXNREF, PRHODREF, PSIGS, LMFCONV,PMFCONV, PPABST, ZZZ, &
+                       ZEXN, PCF_MF, PRC_MF, PRI_MF,                           &
+                       ZDUM, ZDUM, ZDUM, ZDUM, ZDUM,                           &
+                       PRV=PRS(:,:,:,1)*PTSTEP, PRC=PRS(:,:,:,2)*PTSTEP,       &
+                       PRVS=PRS(:,:,:,1), PRCS=PRS(:,:,:,2),                   &
+                       PTH=PTHS*PTSTEP, PTHS=PTHS,                             &
+                       OCOMPUTE_SRC=SIZE(PSRCS, 3)/=0, PSRCS=PSRCS, PCLDFR=PCLDFR, &
+                       PRR=PRS(:,:,:,3)*PTSTEP,                                &
+                       PRI=PRS(:,:,:,4)*PTSTEP, PRIS=PRS(:,:,:,4),             &
+                       PRS=PRS(:,:,:,5)*PTSTEP,                                &
+                       PRG=PRS(:,:,:,6)*PTSTEP,                                &
+                       TBUDGETS=TBUDGETS,KBUDGETS=SIZE(TBUDGETS),              &
+                       PRH=PRS(:,:,:,7)*PTSTEP,                                &
+                       PHLC_HRC=PHLC_HRC, PHLC_HCF=PHLC_HCF,                   &
+                       PHLI_HRI=PHLI_HRI, PHLI_HCF=PHLI_HCF                    )
+    ENDIF
+    IF  (LRED) THEN
+     CALL RAIN_ICE (YLDIMPHYEX,CST, PARAM_ICEN, RAIN_ICE_PARAMN,          &
+                    RAIN_ICE_DESCRN, TBUCONF,                             &
+                    PTSTEP, KRR, ZEXN,                                    &
+                    ZDZZ, PRHODJ, PRHODREF, PEXNREF, PPABST, PCIT, PCLDFR,&
+                    PHLC_HRC, PHLC_HCF, PHLI_HRI, PHLI_HCF,               &
+                    PTHT, PRT(:,:,:,1), PRT(:,:,:,2),                     &
+                    PRT(:,:,:,3), PRT(:,:,:,4),                           &
+                    PRT(:,:,:,5), PRT(:,:,:,6),                           &
+                    PTHS, PRS(:,:,:,1), PRS(:,:,:,2), PRS(:,:,:,3),       &
+                    PRS(:,:,:,4), PRS(:,:,:,5), PRS(:,:,:,6),             &
+                    PINPRC, PINPRR, PEVAP3D,                    &
+                    PINPRS, PINPRG, PINDEP, PRAINFR, PSIGS,               &
+                    TBUDGETS,SIZE(TBUDGETS),                     &            
+                    PSEA, PTOWN,                                          &
+                    PRT(:,:,:,7), PRS(:,:,:,7), PINPRH, PFPR=ZFPR         )
+    ELSE
+      CALL RAIN_ICE_OLD (YLDIMPHYEX, OSEDIC, CSEDIM, HSUBG_AUCV, OWARM, 1, IKU, 1,    &
+                    KSPLITR, PTSTEP, KRR,                                 &
+                    ZDZZ, PRHODJ, PRHODREF, PEXNREF, PPABST, PCIT, PCLDFR,&
+                    PTHT, PRT(:,:,:,1), PRT(:,:,:,2),                     &
+                    PRT(:,:,:,3), PRT(:,:,:,4),                           &
+                    PRT(:,:,:,5), PRT(:,:,:,6),                           &
+                    PTHS, PRS(:,:,:,1), PRS(:,:,:,2), PRS(:,:,:,3),       &
+                    PRS(:,:,:,4), PRS(:,:,:,5), PRS(:,:,:,6),             &
+                    PINPRC,PINPRR, PINPRR3D, PEVAP3D,                     &
+                    PINPRS, PINPRG, PSIGS,PINDEP, PRAINFR,                &
+                    PSEA, PTOWN,                                          &
+                    PRT(:,:,:,7),  PRS(:,:,:,7), PINPRH, PFPR=ZFPR)
+    END IF
+
+
+!
+!*       10.2   Perform the saturation adjustment over cloud ice and cloud water
+!
+    IF (.NOT. LRED .OR. (LRED .AND. LADJ_AFTER) ) THEN
+     CALL ICE_ADJUST (YLDIMPHYEX,CST, RAIN_ICE_PARAMN, NEBN, TURBN,          &
+                     PARAM_ICEN, TBUCONF, KRR,                               &
+                     'DEPI',                                                 &
+                     PTSTEP, ZSIGQSAT2D,                                     &
+                     PRHODJ, PEXNREF, PRHODREF, PSIGS, LMFCONV, PMFCONV,PPABST, ZZZ, &
+                     ZEXN, PCF_MF, PRC_MF, PRI_MF,                           &
+                     ZDUM, ZDUM, ZDUM, ZDUM, ZDUM,                           &
+                     PRV=PRS(:,:,:,1)*PTSTEP, PRC=PRS(:,:,:,2)*PTSTEP,       &
+                     PRVS=PRS(:,:,:,1), PRCS=PRS(:,:,:,2),                   &
+                     PTH=PTHS*PTSTEP, PTHS=PTHS,                             &
+                     OCOMPUTE_SRC=SIZE(PSRCS, 3)/=0, PSRCS=PSRCS, PCLDFR=PCLDFR, &
+                     PRR=PRS(:,:,:,3)*PTSTEP,                                &
+                     PRI=PRS(:,:,:,4)*PTSTEP, PRIS=PRS(:,:,:,4),             &
+                     PRS=PRS(:,:,:,5)*PTSTEP,                                &
+                     PRG=PRS(:,:,:,6)*PTSTEP,                                &
+                     TBUDGETS=TBUDGETS,KBUDGETS=SIZE(TBUDGETS),              &
+                     PRH=PRS(:,:,:,7)*PTSTEP,                                &
+                     PHLC_HRC=PHLC_HRC, PHLC_HCF=PHLC_HCF,                   &
+                     PHLI_HRI=PHLI_HRI, PHLI_HCF=PHLI_HCF                    )
+    END IF
+
+    deallocate( zexn )
+!           
+!
+!*       12.    2-MOMENT MIXED-PHASE MICROPHYSICAL SCHEME LIMA
+!               --------------------------------------------------------------
+!
+!
+!*       12.1   Compute the explicit microphysical sources
+!
+  CASE ('LIMA')
+     !
+    DO JK=IKB,IKE
+      ZDZZ(:,:,JK)=PZZ(:,:,JK+1)-PZZ(:,:,JK)    
+    ENDDO
+    ZZZ = MZF( PZZ )
+     IF (LPTSPLIT) THEN
+        CALL LIMA (YLDIMPHYEX,CST,TBUCONF,TBUDGETS,SIZE(TBUDGETS),         &
+                   PTSTEP,                                                 &
+                   PRHODREF, PEXNREF, ZDZZ,                                &
+                   PRHODJ, PPABST,                                         &
+                   NMOD_CCN, NMOD_IFN, NMOD_IMM,                           &
+                   PDTHRAD, PTHT, PRT,                                     &
+                   PSVT(:,:,:,NSV_LIMA_BEG:NSV_LIMA_END), PW_ACT,          &
+                   PTHS, PRS, PSVS(:,:,:,NSV_LIMA_BEG:NSV_LIMA_END),       &
+                   PINPRC, PINDEP, PINPRR, ZINPRI, PINPRS, PINPRG, PINPRH, &
+                   PEVAP3D, PCLDFR, PICEFR, PRAINFR, ZFPR                 )
+     ELSE
+
+        IF (OWARM) CALL LIMA_WARM(OACTIT, OSEDC, ORAIN, KSPLITR, PTSTEP, KMI,       &
+                                  TPFILE, KRR, PZZ, PRHODJ,                         &
+                                  PRHODREF, PEXNREF, PW_ACT, PPABST,                &
+                                  PDTHRAD,                                          &
+                                  PTHT, PRT, PSVT(:,:,:,NSV_LIMA_BEG:NSV_LIMA_END), &
+                                  PTHS, PRS, PSVS(:,:,:,NSV_LIMA_BEG:NSV_LIMA_END), &
+                                  PINPRC, PINPRR, PINDEP, PINPRR3D, PEVAP3D         )
+!
+        IF (NMOM_I.GE.1) CALL LIMA_COLD(CST, OSEDI, OHHONI, KSPLITG, PTSTEP, KMI,    &
+                                  KRR, PZZ, PRHODJ,                                  &
+                                  PRHODREF, PEXNREF, PPABST, PW_ACT,                 &
+                                  PTHT, PRT, PSVT(:,:,:,NSV_LIMA_BEG:NSV_LIMA_END),  &
+                                  PTHS, PRS, PSVS(:,:,:,NSV_LIMA_BEG:NSV_LIMA_END),  &
+                                  PINPRS, PINPRG, PINPRH                             )
+!
+        IF (OWARM .AND. NMOM_I.GE.1) CALL LIMA_MIXED(OSEDI, OHHONI, KSPLITG, PTSTEP, KMI,              &
+                                               KRR, PZZ, PRHODJ,                                 &
+                                               PRHODREF, PEXNREF, PPABST, PW_ACT,                &
+                                               PTHT, PRT, PSVT(:,:,:,NSV_LIMA_BEG:NSV_LIMA_END), &
+                                               PTHS, PRS, PSVS(:,:,:,NSV_LIMA_BEG:NSV_LIMA_END)  )
+     ENDIF
+!
+!*       12.2   Perform the saturation adjustment
+!
+   IF (LSPRO) THEN
+    CALL LIMA_NOTADJUST (KMI, TPFILE, HRAD,                                      &
+                         PTSTEP, PRHODJ, PPABSTT, PPABST, PRHODREF, PEXNREF, PZZ, &
+                         PTHT,PRT, PSVT(:,:,:,NSV_LIMA_BEG:NSV_LIMA_END),        &
+                         PTHS,PRS, PSVS(:,:,:,NSV_LIMA_BEG:NSV_LIMA_END),        &
+                         PCLDFR, PICEFR, PRAINFR, PSRCS                          )
+   ELSE IF (LPTSPLIT) THEN
+    CALL LIMA_ADJUST_SPLIT(YLDIMPHYEX,CST,TBUCONF,TBUDGETS,SIZE(TBUDGETS),           &
+                     KRR, KMI, CCONDENS, CLAMBDA3,                                   &
+                     OSUBG_COND, OSIGMAS, PTSTEP, PSIGQSAT,                          &
+                     PRHODREF, PRHODJ, PEXNREF, PSIGS, PMFCONV, PPABST, PPABSTT, ZZZ,&
+                     PDTHRAD, PW_ACT,                                                &
+                     PRT, PRS, PSVT(:,:,:,NSV_LIMA_BEG:NSV_LIMA_END),                &
+                     PSVS(:,:,:,NSV_LIMA_BEG:NSV_LIMA_END),                          &
+                     PTHS, PSRCS, PCLDFR, PICEFR, PRC_MF, PRI_MF, PCF_MF             )
+   ELSE
+    CALL LIMA_ADJUST(KRR, KMI, TPFILE,                                &
+                     OSUBG_COND, PTSTEP,                              &
+                     PRHODREF, PRHODJ, PEXNREF, PPABST, PPABSTT,      &
+                     PRT, PRS, PSVT(:,:,:,NSV_LIMA_BEG:NSV_LIMA_END), &
+                     PSVS(:,:,:,NSV_LIMA_BEG:NSV_LIMA_END),           &
+                     PTHS, PSRCS, PCLDFR, PICEFR, PRAINFR             )
+   ENDIF
+!
+END SELECT
+!
+IF(HCLOUD=='ICE3' .OR. HCLOUD=='ICE4' ) THEN
+! TODO: code a generic routine to update vertical lower and upper levels to 0, a
+! specific value or to IKB or IKE and apply it to every output prognostic variable of physics
+  PCIT(:,:,1)     = 0.
+  PCIT(:,:,IKE+1) = 0.
+
+  PINPRC3D=ZFPR(:,:,:,2) / CST%XRHOLW
+  PINPRR3D=ZFPR(:,:,:,3) / CST%XRHOLW
+  PINPRS3D=ZFPR(:,:,:,5) / CST%XRHOLW
+  PINPRG3D=ZFPR(:,:,:,6) / CST%XRHOLW
+  IF(KRR==7) PINPRH3D=ZFPR(:,:,:,7) / CST%XRHOLW
+  WHERE (PRT(:,:,:,2) > 1.E-04 )
+    PSPEEDC=ZFPR(:,:,:,2) / (PRT(:,:,:,2) * PRHODREF(:,:,:))
+  ENDWHERE
+  WHERE (PRT(:,:,:,3) > 1.E-04 )
+    PSPEEDR=ZFPR(:,:,:,3) / (PRT(:,:,:,3) * PRHODREF(:,:,:))
+  ENDWHERE
+  WHERE (PRT(:,:,:,5) > 1.E-04 )
+    PSPEEDS=ZFPR(:,:,:,5) / (PRT(:,:,:,5) * PRHODREF(:,:,:))
+  ENDWHERE
+  WHERE (PRT(:,:,:,6) > 1.E-04 )
+    PSPEEDG=ZFPR(:,:,:,6) / (PRT(:,:,:,6) * PRHODREF(:,:,:))
+  ENDWHERE
+  IF(KRR==7) THEN
+    WHERE (PRT(:,:,:,7) > 1.E-04 )
+      PSPEEDH=ZFPR(:,:,:,7) / (PRT(:,:,:,7) * PRHODREF(:,:,:))
+    ENDWHERE
+  ENDIF
+ENDIF
+
+! Remove non-physical negative values (unnecessary in a perfect world) + corresponding budgets
+call Sources_neg_correct( hcloud, 'NECON', krr, ptstep, ppabst, ptht, prt, pths, prs, psvs, prhodj )
+
+!-------------------------------------------------------------------------------
+!
+!
+!*      13.     SWITCH BACK TO THE PROGNOSTIC VARIABLES
+!               ---------------------------------------
+!
+PTHS(:,:,:) = PTHS(:,:,:) * PRHODJ(:,:,:)
+!
+DO JRR = 1,KRR
+  PRS(:,:,:,JRR)  = PRS(:,:,:,JRR) * PRHODJ(:,:,:)
+END DO
+!
+IF (HCLOUD=='C2R2' .OR. HCLOUD=='C3R5' .OR. HCLOUD=='KHKO' .OR. HCLOUD=='LIMA') THEN
+  DO JSV = ISVBEG, ISVEND
+    PSVS(:,:,:,JSV) = PSVS(:,:,:,JSV) * PRHODJ(:,:,:)
+  ENDDO
+ENDIF
+
+!-------------------------------------------------------------------------------
+!
+END SUBROUTINE RESOLVED_CLOUD
diff --git a/src/PHYEX/ext/series_cloud_elec.f90 b/src/PHYEX/ext/series_cloud_elec.f90
new file mode 100644
index 0000000000000000000000000000000000000000..c740922db924e0a69472a670046a154571f3977e
--- /dev/null
+++ b/src/PHYEX/ext/series_cloud_elec.f90
@@ -0,0 +1,618 @@
+!MNH_LIC Copyright 2010-2022 CNRS, Meteo-France and Universite Paul Sabatier
+!MNH_LIC This is part of the Meso-NH software governed by the CeCILL-C licence
+!MNH_LIC version 1. See LICENSE, CeCILL-C_V1-en.txt and CeCILL-C_V1-fr.txt
+!MNH_LIC for details. version 1.
+!-----------------------------------------------------------------
+!     #############################
+      MODULE MODI_SERIES_CLOUD_ELEC
+!     #############################
+!
+INTERFACE
+  SUBROUTINE SERIES_CLOUD_ELEC (KTCOUNT, PTSTEP,                &
+                                PZZ, PRHODJ, PRHODREF, PEXNREF, &
+                                PRT, PRS, PSVT,                 &
+                                PTHT, PWT, PPABST, PCIT,        &
+                                TPFILE_SERIES_CLOUD_ELEC,       &
+                                PINPRR                          )
+!
+USE MODD_IO, ONLY: TFILEDATA
+!
+INTEGER,                  INTENT(IN)    :: KTCOUNT  ! Temporal loop counter
+!
+REAL,                     INTENT(IN)    :: PTSTEP   ! Double time step except for cold start
+!
+REAL, DIMENSION(:,:,:),   INTENT(IN)    :: PZZ     ! Height (z)
+REAL, DIMENSION(:,:,:),   INTENT(IN)    :: PRHODJ  ! Dry density * Jacobian
+REAL, DIMENSION(:,:,:),   INTENT(IN)    :: PRHODREF! Reference density
+REAL, DIMENSION(:,:,:),   INTENT(IN)    :: PEXNREF ! Reference Exner function
+!
+REAL, DIMENSION(:,:,:,:), INTENT(IN)    :: PRT     ! Moist variables at time t
+REAL, DIMENSION(:,:,:,:), INTENT(IN)    :: PRS     ! Moist  variable sources
+REAL, DIMENSION(:,:,:,:), INTENT(IN)    :: PSVT    ! Scalar variable at time t
+!
+REAL, DIMENSION(:,:,:),   INTENT(IN)    :: PTHT   ! Theta at time t
+REAL, DIMENSION(:,:,:),   INTENT(IN)    :: PWT    ! Vertical velocity at t-dt
+REAL, DIMENSION(:,:,:),   INTENT(IN)    :: PPABST ! ab. pressure at time t
+REAL, DIMENSION(:,:,:),   INTENT(IN)    :: PCIT   ! Pristine ice number
+                                                  ! concentration at time t
+TYPE(TFILEDATA),          INTENT(IN)    :: TPFILE_SERIES_CLOUD_ELEC
+REAL, DIMENSION(:,:),     INTENT(INOUT) :: PINPRR  ! Rain instant precip
+!
+END SUBROUTINE SERIES_CLOUD_ELEC
+END INTERFACE
+END MODULE MODI_SERIES_CLOUD_ELEC
+!
+!      
+! ###############################################################
+  SUBROUTINE SERIES_CLOUD_ELEC (KTCOUNT, PTSTEP,                &
+                                PZZ, PRHODJ, PRHODREF, PEXNREF, &
+                                PRT, PRS, PSVT,                 &
+                                PTHT, PWT, PPABST, PCIT,        &
+                                TPFILE_SERIES_CLOUD_ELEC,       &
+                                PINPRR                          )
+! ###############################################################
+!
+!!****  * -
+!!
+!!    PURPOSE
+!!    -------
+!!
+!!    METHOD
+!!    ------
+!!
+!!    EXTERNAL
+!!    --------
+!!
+!!    IMPLICIT ARGUMENTS
+!!    ------------------
+!!
+!!    REFERENCE
+!!    ---------
+!!
+!!    AUTHOR
+!!    ------
+!!      C. Bovalo   * LA * 
+!!
+!!    MODIFICATIONS
+!!    -------------
+!!      Original : Avril 2010
+!!      Modifications:
+!!      C. Barthe  * LACy *  Dec. 2010    add some parameters
+!!      J.Escobar : 15/09/2015 : WENO5 & JPHEXT <> 1
+!!      Philippe Wautelet: 10/01/2019: use NEWUNIT argument of OPEN
+!!      Philippe Wautelet: 22/01/2019: use standard FLUSH statement instead of non standard intrinsics
+!  P. Wautelet 26/04/2019: replace non-standard FLOAT function by REAL function
+!  P. Wautelet 28/05/2019: move COUNTJV function to tools.f90
+!
+!-------------------------------------------------------------------------------
+!
+! 0. DECLARATIONS
+! ------------
+!
+USE MODD_CONF,            ONLY: CEXP
+USE MODD_CST
+USE MODD_DYN_n,           ONLY: XDXHATM, XDYHATM
+USE MODD_ELEC_DESCR
+USE MODD_ELEC_PARAM
+USE MODD_IO,              ONLY: TFILEDATA
+USE MODD_NSV,             ONLY: NSV_ELECBEG, NSV_ELECEND
+USE MODD_PARAMETERS
+USE MODD_RAIN_ICE_DESCR_n
+USE MODD_RAIN_ICE_PARAM_n
+USE MODD_REF
+
+USE MODI_MOMG
+USE MODI_RADAR_RAIN_ICE
+
+USE MODE_ELEC_ll
+USE MODE_ll
+use mode_tools,           only: Countjv
+
+IMPLICIT NONE
+!
+!*       0.1   Declarations of dummy arguments :
+!
+INTEGER,                  INTENT(IN)    :: KTCOUNT  ! Temporal loop counter
+!
+REAL,                     INTENT(IN)    :: PTSTEP   ! Double time step except for cold start
+!
+REAL, DIMENSION(:,:,:),   INTENT(IN)    :: PZZ     ! Height (z)
+REAL, DIMENSION(:,:,:),   INTENT(IN)    :: PRHODJ  ! Dry density * Jacobian
+REAL, DIMENSION(:,:,:),   INTENT(IN)    :: PRHODREF! Reference density
+REAL, DIMENSION(:,:,:),   INTENT(IN)    :: PEXNREF ! Reference Exner function
+!
+REAL, DIMENSION(:,:,:,:), INTENT(IN)    :: PRT     ! Moist variables at time t
+REAL, DIMENSION(:,:,:,:), INTENT(IN)    :: PRS     ! Moist  variable sources
+REAL, DIMENSION(:,:,:,:), INTENT(IN)    :: PSVT    ! Scalar variable at time t
+!
+REAL, DIMENSION(:,:,:),   INTENT(IN)    :: PTHT   ! Theta at time t
+REAL, DIMENSION(:,:,:),   INTENT(IN)    :: PWT    ! Vertical velocity at t-dt
+REAL, DIMENSION(:,:,:),   INTENT(IN)    :: PPABST ! ab. pressure at time t
+REAL, DIMENSION(:,:,:),   INTENT(IN)    :: PCIT   ! Pristine ice number
+                                                  ! concentration at time t
+TYPE(TFILEDATA),          INTENT(IN)    :: TPFILE_SERIES_CLOUD_ELEC
+REAL, DIMENSION(:,:),     INTENT(INOUT) :: PINPRR  ! Rain instant precip
+!
+!
+!*       0.2   Declarations of local variables :
+!
+INTEGER :: II, IJ, IK
+INTEGER :: IIB,IIE    ! Indices for the first and last inner mass point along x
+INTEGER :: IJB,IJE    ! Indices for the first and last inner mass point along y
+INTEGER :: IKB,IKE    ! Indices for the first and last inner mass point along z
+INTEGER :: JCOUNT_STOP
+INTEGER :: ICOUNT     ! counter for iwp computation
+INTEGER :: IPROC      ! my proc number
+INTEGER :: IPROC_MAX  ! proc that contains max value
+INTEGER :: IINFO_ll   ! return code of parallel routine
+INTEGER :: ILU        ! unit number for IO
+!
+INTEGER, SAVE :: JCOUNT
+!
+INTEGER, DIMENSION(SIZE(PRT,1),SIZE(PRT,2)) :: IFLAG
+!
+REAL :: ZRHO00     ! Surface reference air density
+REAL :: ZMASS_SP   ! Precipitation snow mass (kg)
+REAL :: ZMASS_GP   ! Precipitation graupel mass (kg)
+REAL :: ZFLUX_I    ! Ice crystal mass flux (kg m/s)
+REAL :: ZFLUX_SP   ! Precipitation snow mass flux (kg m/s)
+REAL :: ZFLUX_SNP  ! Non precipitation snow mass flux (kg m/s)
+REAL :: ZFLUX_G    ! Graupel mass flux (kg m/s)
+REAL :: ZCLD_TOP_REF ! Cloud top height (m) from radar refl.
+REAL :: ZCLD_TOP_MR  ! Cloud top height (m) from mixing ratio
+REAL :: ZICE_MASS  ! Ice mass (kg)
+!
+REAL, SAVE :: ZMASS_C      ! Cloud water mass (kg)
+REAL, SAVE :: ZMASS_R      ! Rain water mass (kg)
+REAL, SAVE :: ZMASS_I      ! Ice crystal mass (kg)
+REAL, SAVE :: ZMASS_S      ! Snow mass (kg)
+REAL, SAVE :: ZMASS_G      ! Graupel mass (kg)
+REAL, SAVE :: ZMASS_ICE_P  ! Precipitation ice mass (kg)
+REAL, SAVE :: ZFLUX_PROD   ! Ice mass flux product (kg^2 m^2/s^2)
+REAL, SAVE :: ZFLUX_PRECIP ! Precipitation ice mass flux (kg m/s)
+REAL, SAVE :: ZFLUX_NPRECIP ! Non-precipitation ice mass flux (kg m/s)
+REAL, SAVE :: ZVOL_UP5     ! Updraft volume for W > 5 m/s (m^3)
+REAL, SAVE :: ZVOL_UP10    ! Updraft volume for W > 10 m/s (m^3)
+REAL, SAVE :: ZWMAX        ! Maximum vertical velocity (m/s)
+REAL, SAVE :: ZVOL_G       ! Graupel volume (m^3)
+REAL, SAVE :: ZIWP         ! Ice water path (kg/m^2)
+REAL, SAVE :: ZCTH_MR      ! Cloud top height / m.r. > 1.e-4 kg/kg (m)
+REAL, SAVE :: ZCTH_REF     ! Cloud top height / Z > 20 dBZ (m)
+REAL, SAVE :: ZCLD_VOL     ! Cloud volume (m^3)
+REAL, SAVE :: ZDBZMAX      ! Max radar reflectivity (dBZ)
+REAL, SAVE :: ZINPRR       ! Rain instant precip. (mm/H)
+REAL, SAVE :: ZMAX_INPRR   ! Maximum rain instant. precip. (mm/H)
+!
+REAL, DIMENSION(SIZE(XRTMIN)) :: ZRTMIN
+! XRTMIN = Minimum value for the mixing ratio
+! ZRTMIN = Minimum value for the source (tendency)
+!
+REAL, DIMENSION(SIZE(PRT,1),SIZE(PRT,2),SIZE(PRT,3)) :: &
+         ZTCT  ! Temperature in Degrees Celsius
+REAL, DIMENSION(SIZE(PRT,1),SIZE(PRT,2),SIZE(PRT,3)) :: &
+         ZWORK31, ZWORK32, ZWORK33, ZWORK34
+!
+REAL, DIMENSION(:,:,:), ALLOCATABLE :: ZCLOUD
+REAL, DIMENSION(:,:,:), ALLOCATABLE :: ZLAMBDAS
+REAL, DIMENSION(:,:,:), ALLOCATABLE :: ZLAMBDAG
+REAL, DIMENSION(:,:,:), ALLOCATABLE :: ZVTS
+REAL, DIMENSION(:,:,:), ALLOCATABLE :: ZVTG
+!
+LOGICAL, SAVE :: GFIRSTCALL = .TRUE.
+!
+!
+!-------------------------------------------------------------------------------
+!
+!*       1.     COMPUTE THE LOOP BOUNDS AND SOME PARAMETERS
+!   	        -------------------------------------------
+!
+JCOUNT_STOP = INT(NTSAVE_SERIES/PTSTEP)
+!
+!*       1.1     beginning and end indexes of the physical subdomain
+!
+CALL GET_INDICE_ll (IIB,IJB,IIE,IJE)
+IKB = 1 + JPVEXT
+IKE = SIZE(PZZ,3) - JPVEXT
+!
+!
+!*       1.2     compute some parameters
+!
+! temperature : K -> C
+ZTCT(:,:,:) = (PTHT(:,:,:) * (PPABST(:,:,:) / XP00)**(XRD/XCPD)) - XTT
+!
+! total mixing ratio
+ALLOCATE(ZCLOUD(SIZE(PRT,1),SIZE(PRT,2),SIZE(PRT,3)))
+ZCLOUD(:,:,:) = 0.
+ZCLOUD(IIB:IIE,IJB:IJE,IKB:IKE) = PRT(IIB:IIE,IJB:IJE,IKB:IKE,2) + &
+                                  PRT(IIB:IIE,IJB:IJE,IKB:IKE,3) + &
+                                  PRT(IIB:IIE,IJB:IJE,IKB:IKE,4) + &
+                                  PRT(IIB:IIE,IJB:IJE,IKB:IKE,5) + &
+                                  PRT(IIB:IIE,IJB:IJE,IKB:IKE,6)
+!
+!
+!*       1.3     compute the terminal fall speed
+!
+! the mean terminal fall speed is computed following:
+! V_mean = Int(v(D) n(D) dD) / Int(n(D) dD)
+!
+ALLOCATE(ZLAMBDAS(SIZE(PRT,1), SIZE(PRT,2), SIZE(PRT,3)))
+ALLOCATE(ZLAMBDAG(SIZE(PRT,1), SIZE(PRT,2), SIZE(PRT,3)))
+ALLOCATE(ZVTS(SIZE(PRT,1), SIZE(PRT,2), SIZE(PRT,3)))
+ALLOCATE(ZVTG(SIZE(PRT,1), SIZE(PRT,2), SIZE(PRT,3)))
+!
+ZLAMBDAS(:,:,:) = 0.
+ZLAMBDAG(:,:,:) = 0.
+ZVTS(:,:,:) = 0.
+ZVTG(:,:,:) = 0.
+!
+! Surface reference air density
+ZRHO00 = XP00 / (XRD * XTHVREFZ(IKB))
+!
+! for snow
+WHERE (PRT(:,:,:,5) .GT. 1.E-12)
+  ZLAMBDAS(:,:,:) = MIN(XLBDAS_MAX, &
+                        XLBS * (PRHODREF(:,:,:) * &
+                        MAX(PRT(:,:,:,5), XRTMIN(5)))**XLBEXS)
+  ZVTS(:,:,:) = XCS * MOMG(XALPHAS, XNUS, XBS+XDS) * ZLAMBDAS(:,:,:)**(-XDS) * &
+               (ZRHO00 / PRHODREF(:,:,:))**XCEXVT / MOMG(XALPHAS, XNUS, XBS)
+ELSEWHERE
+  ZLAMBDAS(:,:,:) = 0.
+  ZVTS(:,:,:) = 0.
+END WHERE
+!
+! for graupel
+WHERE(PRT(:,:,:,6) .GT. 1.E-12)
+  ZLAMBDAG(:,:,:) = XLBG * (PRHODREF(:,:,:) * &
+                  MAX(PRT(:,:,:,6), XRTMIN(6)))**XLBEXG
+  ZVTG(:,:,:) = XCG * MOMG(XALPHAG, XNUG, XBG+XDG) * ZLAMBDAG(:,:,:)**(-XDG) * &
+               (ZRHO00 / PRHODREF(:,:,:))**XCEXVT / MOMG(XALPHAG, XNUG, XBG)
+ELSEWHERE
+  ZLAMBDAG(:,:,:) = 0.
+  ZVTG(:,:,:) = 0.
+END WHERE
+!
+DEALLOCATE(ZLAMBDAS)
+DEALLOCATE(ZLAMBDAG)
+!
+!
+!-------------------------------------------------------------------------------
+!
+!*       2.     INITIALIZE THE VARIABLES
+!   	        ------------------------
+!
+IF (GFIRSTCALL) THEN
+  GFIRSTCALL = .FALSE.
+!
+  JCOUNT = 0
+  ZMASS_C     = 0.
+  ZMASS_R     = 0.
+  ZMASS_I     = 0.
+  ZMASS_S     = 0.
+  ZMASS_G     = 0.
+  ZMASS_ICE_P = 0.
+  ZFLUX_PROD  = 0.
+  ZFLUX_PRECIP  = 0.
+  ZFLUX_NPRECIP = 0.
+  ZVOL_UP5    = 0.
+  ZVOL_UP10   = 0.
+  ZVOL_G      = 0.
+  ZWMAX       = 0.
+  ZDBZMAX     = 0.
+  ZCTH_REF    = 0.
+  ZCTH_MR     = 0.
+  ZCLD_VOL    = 0.
+  ZINPRR      = 0.
+  ZMAX_INPRR  = 0.
+END IF
+!
+ZICE_MASS    = 0.
+ZMASS_SP     = 0.  
+ZMASS_GP     = 0.
+ZFLUX_I      = 0.
+ZFLUX_SP     = 0.
+ZFLUX_SNP    = 0.
+ZFLUX_G      = 0.
+ZCLD_TOP_REF = 0.
+ZCLD_TOP_MR  = 0.
+!
+!-------------------------------------------------------------------------------
+!
+!*       3.     COMPUTE THE DYNAMICAL AND MICROPHYSICAL PARAMETERS
+!               --------------------------------------------------
+!
+JCOUNT = JCOUNT + 1
+!
+!*       3.1   compute the maximum vertical velocity
+!
+ZWMAX = ZWMAX + MAXVAL(PWT(IIB:IIE,IJB:IJE,IKB:IKE))
+!
+!
+!*       3.2   compute the maximum radar reflectivity
+!
+CALL RADAR_RAIN_ICE (PRT, PCIT, PRHODREF, ZTCT, &
+                     ZWORK31, ZWORK32, ZWORK33, ZWORK34)
+!
+ZDBZMAX = ZDBZMAX + MAXVAL(ZWORK31(IIB:IIE,IJB:IJE,IKB:IKE))
+!  
+!
+!*       3.3    compute the mass of the different microphysical species
+!
+ZMASS_C = ZMASS_C + SUM(PRT(IIB:IIE,IJB:IJE,IKB:IKE,2) * &
+                          PRHODJ(IIB:IIE,IJB:IJE,IKB:IKE))
+!
+ZMASS_R = ZMASS_R + SUM(PRT(IIB:IIE,IJB:IJE,IKB:IKE,3) * &
+                          PRHODJ(IIB:IIE,IJB:IJE,IKB:IKE))
+!
+ZMASS_I = ZMASS_I + SUM(PRT(IIB:IIE,IJB:IJE,IKB:IKE,4) * &
+                          PRHODJ(IIB:IIE,IJB:IJE,IKB:IKE))
+!
+ZMASS_S = ZMASS_S + SUM(PRT(IIB:IIE,IJB:IJE,IKB:IKE,5) * &
+                          PRHODJ(IIB:IIE,IJB:IJE,IKB:IKE))
+!
+ZMASS_G = ZMASS_G + SUM(PRT(IIB:IIE,IJB:IJE,IKB:IKE,6) * &
+                          PRHODJ(IIB:IIE,IJB:IJE,IKB:IKE))
+!
+!
+!*       3.4    compute the ice mass fluxes
+!
+!*       3.4.1  non-precipitation ice mass flux
+!
+IFLAG(:,:) = 0
+ICOUNT = 0
+!
+DO II = IIB, IIE
+  DO IJ = IJB, IJE
+    DO IK = IKB, IKE
+!
+!*       3.4.1  non-precipitation ice crystal mass flux
+!
+      IF (ZTCT(II,IJ,IK) .LT. 0. .AND. PWT(II,IJ,IK) .GT. 0.) THEN
+        ZFLUX_I = ZFLUX_I + &
+                  PWT(II,IJ,IK) * PRT(II,IJ,IK,4) * PRHODJ(II,IJ,IK)
+      END IF
+!
+!*       3.4.2  non-precipitation snow mass flux
+!
+      IF (ZTCT(II,IJ,IK) .LT. 0. .AND. PWT(II,IJ,IK) .GT. ZVTS(II,IJ,IK)) THEN
+        ZFLUX_SNP = ZFLUX_SNP + &
+                    (PWT(II,IJ,IK) - ZVTS(II,IJ,IK)) * PRT(II,IJ,IK,5) * &
+                    PRHODJ(II,IJ,IK)
+      END IF
+!
+!*       3.4.3  precipitation snow mass flux
+!
+      IF (ZTCT(II,IJ,IK) .LT. 0. .AND. PWT(II,IJ,IK) .LT. ZVTS(II,IJ,IK)) THEN
+        ZMASS_SP = ZMASS_SP + PRT(II,IJ,IK,5) * PRHODJ(II,IJ,IK)
+        ZFLUX_SP = ZFLUX_SP + &
+                  (PWT(II,IJ,IK) - ZVTS(II,IJ,IK)) * PRT(II,IJ,IK,5) * &
+                   PRHODJ(II,IJ,IK)
+      END IF
+!
+!*       3.4.4  precipitation graupel mass flux
+!
+      IF (ZTCT(II,IJ,IK) .LT. 0. .AND. PWT(II,IJ,IK) .LT. ZVTG(II,IJ,IK)) THEN
+        ZMASS_GP = ZMASS_GP + PRT(II,IJ,IK,6) * PRHODJ(II,IJ,IK)
+        ZFLUX_G = ZFLUX_G + &
+                 (PWT(II,IJ,IK) - ZVTG(II,IJ,IK)) * PRT(II,IJ,IK,6) * &
+                  PRHODJ(II,IJ,IK)
+      END IF
+!
+!
+!*       3.5   compute the updraft volume
+!
+! Updraft volume for W > 5 m/s
+      IF (ZTCT(II,IJ,IK) .LT. -5. .AND. PWT(II,IJ,IK) .GT. 5.) THEN
+        ZVOL_UP5 = ZVOL_UP5 + XDXHATM * XDYHATM * &
+                              (PZZ(II,IJ,IK+1) - PZZ(II,IJ,IK-1)) / 2. 
+      END IF
+!
+! Updraft volume for W > 10 m/s
+      IF (ZTCT(II,IJ,IK) .LT. -5. .AND. PWT(II,IJ,IK) .GT. 10.) THEN
+        ZVOL_UP10 = ZVOL_UP10 + XDXHATM * XDYHATM * &
+                              (PZZ(II,IJ,IK+1) - PZZ(II,IJ,IK-1)) / 2.
+      END IF
+!
+!
+!*       3.6  total ice mass
+!
+      IF (ZTCT(II,IJ,IK) .LT. -10. .AND. ZWORK31(II,IJ,IK) .GT. 18.) THEN
+        ZICE_MASS = ZICE_MASS + (PRT(II,IJ,IK,4) + PRT(II,IJ,IK,5) + PRT(II,IJ,IK,6)) * &
+                    PRHODJ(II,IJ,IK)
+        IFLAG(II,IJ) = IFLAG(II,IJ) + 1
+      END IF
+    END DO  ! end loop ik
+!
+    IF (IFLAG(II,IJ) .GE. 1) THEN
+      ICOUNT = ICOUNT + 1
+    END IF
+  END DO   ! end loop ij
+END DO   ! end loop ii
+!
+DEALLOCATE(ZVTS)
+DEALLOCATE(ZVTG)
+!
+!
+!*       3.7   precipitation and non precipitation ice mass flux product
+!  
+IF (ZFLUX_G .LT. 0. .AND. ZFLUX_I .GT. 0.) THEN
+  ZFLUX_PROD = ZFLUX_PROD - (ZFLUX_I + ZFLUX_SNP) * (ZFLUX_G + ZFLUX_SP)
+END IF
+!
+! precipitation ice mass flux
+IF ((ZFLUX_G+ZFLUX_SP) .LT. 0.) THEN
+  ZFLUX_PRECIP = ZFLUX_PRECIP - (ZFLUX_G + ZFLUX_SP)
+END IF
+!
+! non-precipitation ice mass flux
+IF ((ZFLUX_I+ZFLUX_SNP) .GT. 0.) THEN
+  ZFLUX_NPRECIP = ZFLUX_NPRECIP + (ZFLUX_I + ZFLUX_SNP)
+END IF
+!
+!
+!*       3.8   compute the precipitation ice mass
+!
+IF ((ZMASS_GP .GT. 0.) .OR. (ZMASS_SP .GT. 0.)) THEN
+  ZMASS_ICE_P = ZMASS_ICE_P + ZMASS_GP + ZMASS_SP
+END IF
+!
+!
+!*       3.9   compute the ice water path
+!
+CALL SUM_ELEC_ll(ZICE_MASS)
+CALL SUM_ELEC_ll(ICOUNT)
+!
+IF (ICOUNT .GT. 0) THEN
+  ZIWP = ZIWP + ZICE_MASS / (REAL(ICOUNT) * XDXHATM * XDYHATM)
+END IF
+!
+!
+!*       3.10  compute the cloud top height
+!
+DO II = IIB, IIE
+  DO IJ = IJB, IJE
+    DO IK = IKB, IKE
+! maximum height of the 20 dBZ echo
+      IF (ZWORK31(II,IJ,IK) .GT. 20. .AND. PZZ(II,IJ,IK) .GT. ZCLD_TOP_REF) THEN
+        ZCLD_TOP_REF = PZZ(II,IJ,IK)
+      END IF
+!
+! maximum height with mixing ratio > 1.e-4
+      IF (ZCLOUD(II,IJ,IK) .GT. 1.E-4 .AND. PZZ(II,IJ,IK) .GT. ZCLD_TOP_REF) THEN
+        ZCLD_TOP_MR = PZZ(II,IJ,IK)
+      END IF
+!
+!
+!*       3.11  compute the cloud volume
+!
+      IF (ZCLOUD(II,IJ,IK) .GT. 1.E-4) THEN
+        ZCLD_VOL = ZCLD_VOL + XDXHATM * XDYHATM * &
+                              (PZZ(II,IJ,IK+1) - PZZ(II,IJ,IK-1)) / 2.
+      END IF
+!
+    END DO
+  END DO
+END DO
+!
+DEALLOCATE(ZCLOUD)
+!
+ZCTH_MR  = ZCTH_MR  + ZCLD_TOP_MR
+ZCTH_REF = ZCTH_REF + ZCLD_TOP_REF
+!
+!
+!*       3.12  compute the instantaneous precipitation rate
+!
+ZMAX_INPRR = ZMAX_INPRR + MAXVAL(PINPRR(IIB:IIE,IJB:IJE))
+ZINPRR     = ZINPRR + SUM(PINPRR(IIB:IIE,IJB:IJE))
+!
+!-------------------------------------------------------------------------------
+!
+!*       4.     FROM LOCAL TO GLOBAL VARIABLES
+!               ------------------------------
+!
+CALL MAX_ELEC_ll (ZCTH_REF, IPROC_MAX)
+CALL MAX_ELEC_ll (ZCTH_MR,  IPROC_MAX)
+CALL MAX_ELEC_ll (ZDBZMAX,  IPROC_MAX)
+CALL MAX_ELEC_ll (ZMAX_INPRR,IPROC_MAX)
+CALL MAX_ELEC_ll (ZWMAX,    IPROC_MAX)
+!
+!
+!-------------------------------------------------------------------------------
+!
+!*       5.     SAVE THE DATA IN AN ASCII FILE
+!               ------------------------------
+!
+CALL MYPROC_ELEC_ll(IPROC)
+!
+IF (JCOUNT == JCOUNT_STOP) THEN
+!
+  ZINPRR     = ZINPRR * 3.6E6          ! m/s --> mm/H
+  ZMAX_INPRR = ZMAX_INPRR * 3.6E6      ! m/s --> mm/H
+!
+  CALL REDUCESUM_ll (ZVOL_UP5,      IINFO_ll)
+  CALL REDUCESUM_ll (ZVOL_UP10,     IINFO_ll)
+  CALL REDUCESUM_ll (ZMASS_C,       IINFO_ll)
+  CALL REDUCESUM_ll (ZMASS_R,       IINFO_ll)
+  CALL REDUCESUM_ll (ZMASS_I,       IINFO_ll)
+  CALL REDUCESUM_ll (ZMASS_S,       IINFO_ll)
+  CALL REDUCESUM_ll (ZMASS_G,       IINFO_ll)
+  CALL REDUCESUM_ll (ZMASS_ICE_P,   IINFO_ll)
+  CALL REDUCESUM_ll (ZFLUX_PROD,    IINFO_ll)
+  CALL REDUCESUM_ll (ZFLUX_PRECIP,  IINFO_ll)
+  CALL REDUCESUM_ll (ZFLUX_NPRECIP, IINFO_ll)
+  CALL REDUCESUM_ll (ZCLD_VOL,      IINFO_ll)
+  CALL REDUCESUM_ll (ZINPRR,        IINFO_ll)
+!
+  IF (IPROC == 0) THEN
+    ILU = TPFILE_SERIES_CLOUD_ELEC%NLU
+    WRITE (ILU, FMT='(I6,19(E12.4))') &
+             INT(KTCOUNT*PTSTEP),         & ! time
+             ZCTH_REF/REAL(JCOUNT),      & ! cloud top height from Z
+             ZCTH_MR/REAL(JCOUNT),       & ! cloud top height from m.r.
+             ZDBZMAX/REAL(JCOUNT),       & ! maximum radar reflectivity
+             ZWMAX/REAL(JCOUNT),         & ! maximum vertical velocity
+             ZVOL_UP5/REAL(JCOUNT),      & ! updraft volume for W > 5 m/s
+             ZVOL_UP10/REAL(JCOUNT),     & ! updraft volume for W > 10 m/s
+             ZMASS_C/REAL(JCOUNT),       & ! cloud droplets mass
+             ZMASS_R/REAL(JCOUNT),       & ! rain mass
+             ZMASS_I/REAL(JCOUNT),       & ! ice crystal mass
+             ZMASS_S/REAL(JCOUNT),       & ! snow mass
+             ZMASS_G/REAL(JCOUNT),       & ! graupel mass
+             ZMASS_ICE_P/REAL(JCOUNT),   & ! precipitation ice mass
+             ZFLUX_PROD/REAL(JCOUNT),    & ! ice mass flux product
+             ZFLUX_PRECIP/REAL(JCOUNT),  & ! precipitation ice mass flux
+             ZFLUX_NPRECIP/REAL(JCOUNT), & ! non-precipitation ice mass flux
+             ZIWP/REAL(JCOUNT),          & ! ice water path
+             ZCLD_VOL/REAL(JCOUNT),      & ! cloud volume
+             ZINPRR/REAL(JCOUNT),        & ! Rain instant precip
+             ZMAX_INPRR/REAL(JCOUNT)       ! maximum rain instant. precip.
+    FLUSH(UNIT=ILU)
+  END IF
+!
+  JCOUNT = 0
+  ZMASS_C     = 0.
+  ZMASS_R     = 0.
+  ZMASS_I     = 0.
+  ZMASS_S     = 0.
+  ZMASS_G     = 0.
+  ZMASS_ICE_P = 0.
+  ZFLUX_PROD  = 0.
+  ZFLUX_PRECIP  = 0.
+  ZFLUX_NPRECIP = 0.
+  ZVOL_UP5    = 0.
+  ZVOL_UP10   = 0.
+  ZWMAX       = 0.
+  ZDBZMAX     = 0.
+  ZCTH_REF    = 0.
+  ZCTH_MR     = 0.
+  ZIWP        = 0.
+  ZCLD_VOL    = 0.
+  ZINPRR      = 0.
+  ZMAX_INPRR  = 0.
+END IF
+!
+!-------------------------------------------------------------------------------
+!
+CONTAINS
+!
+!-------------------------------------------------------------------------------
+!     ##############################################
+      FUNCTION MOMG0D(PALPHA, PNU, PP)  RESULT(PMOMG)
+!     ##############################################
+!
+USE MODI_GAMMA
+!
+IMPLICIT NONE
+!
+REAL, INTENT(IN) :: PALPHA, PNU
+REAL, INTENT(IN) :: PP
+REAL             :: PMOMG
+!
+!
+PMOMG = GAMMA(PNU+PP/PALPHA) / GAMMA(PNU)
+!
+END FUNCTION MOMG0D
+!
+!-------------------------------------------------------------------------------
+
+!
+END SUBROUTINE SERIES_CLOUD_ELEC
diff --git a/src/PHYEX/ext/set_conc_ice_c1r3.f90 b/src/PHYEX/ext/set_conc_ice_c1r3.f90
new file mode 100644
index 0000000000000000000000000000000000000000..0dfe34119bcd614b71adf0c7c6e3e9d8a8e006b4
--- /dev/null
+++ b/src/PHYEX/ext/set_conc_ice_c1r3.f90
@@ -0,0 +1,129 @@
+!MNH_LIC Copyright 2001-2018 CNRS, Meteo-France and Universite Paul Sabatier
+!MNH_LIC This is part of the Meso-NH software governed by the CeCILL-C licence
+!MNH_LIC version 1. See LICENSE, CeCILL-C_V1-en.txt and CeCILL-C_V1-fr.txt  
+!MNH_LIC for details. version 1.
+!-----------------------------------------------------------------
+!      #############################
+       MODULE MODI_SET_CONC_ICE_C1R3
+!      #############################
+!
+INTERFACE
+!
+      SUBROUTINE SET_CONC_ICE_C1R3 (PRHODREF,PRT,PSVT)
+!
+REAL, DIMENSION(:,:,:),    INTENT(IN)    :: PRHODREF   ! Reference density
+!
+REAL, DIMENSION(:,:,:,:),  INTENT(INOUT) :: PRT    ! microphysical mixing ratios
+!
+REAL,  DIMENSION(:,:,:,:), INTENT(INOUT) :: PSVT   ! microphys. concentrations
+!
+!
+END SUBROUTINE SET_CONC_ICE_C1R3
+!
+END INTERFACE
+!
+END MODULE MODI_SET_CONC_ICE_C1R3
+!
+!     ##########################################################
+      SUBROUTINE SET_CONC_ICE_C1R3 (PRHODREF,PRT,PSVT)
+!     ##########################################################
+!
+!!****  *SET_CONC_ICE_C1R3 * - initialize the ice crystal
+!!                   concentration for a RESTArt simulation of the C1R3 scheme
+!!
+!!
+!!    PURPOSE
+!!    -------
+!!      The purpose of this routine is to initialize the pristine ice crystal
+!!    concentrations when the cloud ice mixing ratios are only available.
+!!      This routine is used to initialize the small ice crystal concentrations
+!!    using the r_i of a previous ICE3 run but also to compute the LB tendencies
+!!    in ONE_WAY$n in case of grid-nesting when the optional argument PTIME is
+!!    set (a C3R5 run embedded in a ICE3 run).
+!!
+!!**  METHOD
+!!    ------
+!!      The method uses the contact nucleation formulation of Meyers as a rough
+!!    estimate (a function of the temperature). A limiting value of XCONCI_MAX
+!!    is also assumed in the case of very cold temperatures
+!!
+!!    EXTERNAL
+!!    --------
+!!      None
+!!
+!!    IMPLICIT ARGUMENTS
+!!    ------------------
+!!      Module MODD_ICE_C1R3_DESCR, ONLY : XRTMIN, XCTMIN
+!!      Module MODD_ICE_C1R3_PARAM, ONLY : XCONCI_INI
+!!      Module MODD_CONF,           ONLY : NVERB
+!!
+!!    REFERENCE
+!!    ---------
+!!      Book2 of documentation ( routine SET_CONC_ICE_C1R3 )
+!!
+!!    AUTHOR
+!!    ------
+!!      J.-P. Pinty      * Laboratoire d'Aerologie*
+!!
+!!    MODIFICATIONS
+!!    -------------
+!!      Original    15/04/01
+!!  Philippe Wautelet: 05/2016-04/2018: new data structures and calls for I/O
+!!
+!-------------------------------------------------------------------------------
+!
+!*       0.    DECLARATIONS
+!              ------------
+!
+USE MODD_CST,            ONLY : XRHOLI
+USE MODD_CONF,           ONLY : NVERB
+USE MODD_ICE_C1R3_DESCR, ONLY : XRTMIN, XCTMIN
+USE MODD_ICE_C1R3_PARAM, ONLY : XCONCI_MAX, XNUC_CON, XEXTT_CON, XEX_CON
+USE MODD_LUNIT_n,        ONLY : TLUOUT
+USE MODD_RAIN_ICE_DESCR_n, ONLY : XAI, XBI
+!
+IMPLICIT NONE
+!
+!*       0.1   Declarations of dummy arguments :
+!
+REAL, DIMENSION(:,:,:),    INTENT(IN)    :: PRHODREF   ! Reference density
+!
+REAL, DIMENSION(:,:,:,:),  INTENT(INOUT) :: PRT    ! microphysical mixing ratios
+!
+REAL,  DIMENSION(:,:,:,:), INTENT(INOUT) :: PSVT   ! microphys. concentrations
+!
+!*       0.2   Declarations of local variables :
+!
+INTEGER    :: IRESP   ! Return code of FM routines
+INTEGER    :: ILUOUT  ! Logical unit number of output-listing
+!
+!
+!-------------------------------------------------------------------------------
+!*       1.    RETRIEVE LOGICAL UNIT NUMBER
+!              ----------------------------
+!
+ILUOUT = TLUOUT%NLU
+!
+!*       2.    INITIALIZATION
+!              --------------
+!
+! Assume the ice crystal concentration according to the
+! contact nucleation formulation of Meyers et al. (1992)
+!
+WHERE ( PRT(:,:,:,4) > XRTMIN(4) )
+  PSVT(:,:,:,4) = MIN( PRHODREF(:,:,:) /                                     &
+                             ( XRHOLI * XAI*(10.E-06)**XBI * PRT(:,:,:,4) ), &
+                      XCONCI_MAX )
+  PSVT(:,:,:,5) = 0.0
+END WHERE
+WHERE ( PRT(:,:,:,4) <= XRTMIN(4) )
+  PRT(:,:,:,4)  = 0.0
+  PSVT(:,:,:,4) = 0.0
+  PSVT(:,:,:,5) = 0.0
+END WHERE
+IF( NVERB >= 5 ) THEN
+  WRITE (UNIT=ILUOUT,FMT=*) "!INI_MODEL$n: The cloud ice concentration has "
+  WRITE (UNIT=ILUOUT,FMT=*) "been roughly initialised to a value of 1 per liter"
+END IF
+!
+END SUBROUTINE SET_CONC_ICE_C1R3
diff --git a/src/PHYEX/ext/set_msk.f90 b/src/PHYEX/ext/set_msk.f90
new file mode 100644
index 0000000000000000000000000000000000000000..ba4da88bfda2972c8bff2174907cb9e2d884710a
--- /dev/null
+++ b/src/PHYEX/ext/set_msk.f90
@@ -0,0 +1,286 @@
+!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.
+!-----------------------------------------------------------------
+!     ######spl
+ MODULE MODI_SET_MSK
+!####################
+!
+INTERFACE
+!
+SUBROUTINE SET_MSK(PRT,PRHODREF,OBU_MSK) 
+!
+REAL , DIMENSION (:,:,:,:),INTENT(IN) :: PRT
+REAL , DIMENSION (:,:,:),INTENT(IN)   :: PRHODREF
+LOGICAL , DIMENSION (:,:,:),INTENT(OUT)  :: OBU_MSK
+!
+END SUBROUTINE SET_MSK  
+!
+END INTERFACE
+!
+END MODULE MODI_SET_MSK
+!
+!     ######spl
+      SUBROUTINE SET_MSK(PRT,PRHODREF,OBU_MSK) 
+!     ###############################
+!
+!!****SET_MSK** -routine to define the mask based on SET_MASK
+!!                           
+!!
+!!    PURPOSE
+!!    -------
+!       The purpose of this routine is to test the occurence or not of the
+!     different criteria, used to compute the budgets. It also updates the 
+!     number of occurence of the different criteria.
+!
+!!**  METHOD
+!!    ------
+!!      According to each criterion associated to one zone, the mask is
+!!    set to TRUE at each point where the criterion is confirmed, at each 
+!!    time step of the model.
+!!
+!!
+!!    EXTERNAL
+!!    --------
+!!       NONE
+!!
+!!    IMPLICIT ARGUMENTS
+!!    ------------------
+!!
+!!    REFERENCE
+!!    ---------
+!!      Book2 of MESO-NH documentation (routine BUDGET)
+!!
+!!
+!!    AUTHOR
+!!    ------
+!!	J. Nicolau       * Meteo France *
+!!
+!!    MODIFICATIONS
+!!    -------------
+!!      Original    27/02/95
+!!      T.Montmerle 15/07/96  Computation of masks for convective and stratiform parts
+!!      Biju Thomas 29/03/99  Identified nonprecipitating convective cells and only
+!!                            precipitating anvils as stratiform part
+!!      O. Caumont  09/04/08  Use in RADAR_SIMULATOR
+!!      J.Escobar : 15/09/2015 : WENO5 & JPHEXT <> 1 
+!!  Philippe Wautelet: 05/2016-04/2018: new data structures and calls for I/O
+!-------------------------------------------------------------------------------
+!
+!*       0.    DECLARATIONS
+!              ------------
+!
+USE MODD_FIELD_n
+USE MODD_RAIN_ICE_PARAM_n , ONLY : XFSEDR,XEXSEDR
+USE MODD_RAIN_ICE_DESCR_n , ONLY : XCEXVT
+USE MODD_CST  , ONLY : XRHOLW
+USE MODD_PARAMETERS
+USE MODD_CONF
+USE MODE_ll
+USE MODD_LUNIT, ONLY : TLUOUT0
+USE MODD_ARGSLIST_ll, ONLY : LIST_ll
+!
+!
+IMPLICIT NONE
+!  
+!  
+!*       0.1   Declarations of arguments :
+!
+REAL , DIMENSION (:,:,:,:),INTENT(IN) :: PRT
+REAL , DIMENSION (:,:,:),INTENT(IN)   :: PRHODREF
+LOGICAL , DIMENSION (:,:,:),INTENT(OUT)  :: OBU_MSK
+!
+!*       0.2   Declarations of local variables :
+!
+INTEGER                    :: IIB,IJB       ! Lower bounds and Upper bounds
+INTEGER                    :: IIE,IJE       ! of the physical sub-domain 
+INTEGER                    :: IKB,IKE       ! in x, y and z directions
+INTEGER                    :: IIU,IJU!,IKU
+!
+REAL,DIMENSION(:,:,:), ALLOCATABLE  :: ZMASK     ! signature de l'insertion 
+                                                 ! dans un masque (0 ou 1.)
+REAL,DIMENSION(:,:),   ALLOCATABLE  :: ZCONVECT  ! signature du domaine convectif
+REAL,DIMENSION(:,:),   ALLOCATABLE  :: ZSURFPP   ! precipitation au sol 
+REAL,DIMENSION(:,:),   ALLOCATABLE  :: ZMAXWATER ! teneur maximale en eau 
+                                                 ! recensee sur la verticale
+REAL,DIMENSION(:,:),   ALLOCATABLE  :: ZMIMX,ZMIPX ! I,I+1 and I,I-1 precipitation sums
+REAL,DIMENSION(:,:),   ALLOCATABLE  :: ZMEANX_MY,ZMEANX_PY ! J,J+1 and J,J-1 precipitation sums
+REAL,DIMENSION(:,:),   ALLOCATABLE  :: ZMEANX, ZMEANXY
+REAL       ::   ZAVER_PR,ZREPSILON,ZTOTWATER,ZREPSILON1
+REAL       ::   ZCRS,ZCEXRS,ZCEXVT,ZREPSILON2,ZREPSILON3            
+INTEGER    ::   I,J,JILOOP,JJLOOP,JKLOOP
+INTEGER :: ILUOUT0
+INTEGER :: IRESP
+INTEGER :: IBUIL,IBUJL,IBUIH,IBUJH
+!INTEGER :: IBUSIL,IBUSJL,IBUSIH,IBUSJH
+!INTEGER                :: IINFO_ll       ! return code of parallel routine
+!TYPE(LIST_ll), POINTER :: TZFIELDS_ll    ! list of fields to exchange
+!-------------------------------------------------------------------------------
+!
+ILUOUT0 = TLUOUT0%NLU
+!
+!*       1.    COMPUTES THE PHYSICAL SUBDOMAIN BOUNDS
+!              ---------------------------------------
+!
+IKB = 1 + JPVEXT
+IKE = SIZE(PRT,3) - JPVEXT
+IIU = SIZE(PRT,1)
+IJU = SIZE(PRT,2)
+CALL GET_INDICE_ll (IIB,IJB,IIE,IJE)
+!
+!               ----------------------
+ALLOCATE( ZMASK(IIU,IJU,4) )
+ALLOCATE( ZSURFPP(IIU,IJU) )
+ALLOCATE(ZMIMX(IIU,IJU),ZMIPX(IIU,IJU),ZMEANX(IIU,IJU))
+ALLOCATE(ZMEANX_MY(IIU,IJU),ZMEANX_PY(IIU,IJU),ZMEANXY(IIU,IJU))
+ALLOCATE( ZCONVECT(IIU,IJU) )
+ALLOCATE( ZMAXWATER(IIU,IJU) )
+!
+!*	 2.     DEFINITION OF THE MASK
+!           ----------------------
+!  initialization to FALSE on the extended subdomain
+OBU_MSK(:,:,:)=.FALSE.
+ZMASK(:,:,:)=0.
+ZSURFPP(:,:)=0.
+ZCONVECT(:,:)=0.
+ZMAXWATER(:,:)=0.
+ZREPSILON=5.E-6
+ZREPSILON1=5.E-4
+ZREPSILON2=5.0
+ZREPSILON3=5.E-6
+ZAVER_PR=0.
+
+!**********************************************************************
+!                      CAUTION: Definition of parameters
+!              depends on the model configuration WARM or COLD      
+!              -----------------------------------------------
+
+!**********************************************************************
+!partie a activer pour le cas chaud, en activant USE MODD_CLOUDPAR et en 
+!desactivant USE MODD_RAIN_ICE_PARAM et USE MODD_RAIN_ICE_DESCR qui servent
+!au cas froid. En activant tout, XCEXVT est defini deux fois, donc une fois
+!de trop.
+!**********************************************************************
+!IF (CCLOUD == 'REVE' .OR. CCLOUD == 'KESS' .OR. CCLOUD == 'KES2') THEN
+!  ZCRS=XCRS
+!  ZCEXRS=XCEXRS
+!  ZCEXVT=XCEXVT
+!ELSE IF (CCLOUD == 'ICE3') THEN
+!**********************************************************************
+
+  ZCRS=XFSEDR
+  ZCEXRS=XEXSEDR
+  ZCEXVT=XCEXVT
+!END IF
+
+!            Total solid and liquid water (qr+qc+qs+qi+qg) (= cloudy area)
+!            -------------------------------------------------------------
+ 
+DO JKLOOP=IKB,IKE
+  DO JJLOOP=IJB,IJE
+     DO JILOOP=IIB,IIE
+       ZTOTWATER = PRT(JILOOP,JJLOOP,JKLOOP,2) &
+                  +PRT(JILOOP,JJLOOP,JKLOOP,3) &
+                  +PRT(JILOOP,JJLOOP,JKLOOP,4) &
+                  +PRT(JILOOP,JJLOOP,JKLOOP,5) &
+                  +PRT(JILOOP,JJLOOP,JKLOOP,6)  
+       ZMAXWATER(JILOOP,JJLOOP)=MAX(ZMAXWATER(JILOOP,JJLOOP),ZTOTWATER)
+     END DO
+  END DO
+END DO
+
+!           Computation of ground precipitation
+!           -----------------------------------
+ 
+!      Precipitation (mm/h)
+ZSURFPP(IIB:IIE,IJB:IJE)=ZCRS*PRT(IIB:IIE,IJB:IJE,IKB,3)**ZCEXRS  &
+     *PRHODREF(IIB:IIE,IJB:IJE,IKB)**(ZCEXRS-ZCEXVT)*3.6E6/XRHOLW
+
+!    Lateral Boundaries for Precipitation
+!  (cyclic case in Y-direction, OPEN in X-direction)
+    ZSURFPP(1,IJB:IJE)=ZSURFPP(IIB,IJB:IJE)
+    ZSURFPP(IIU,IJB:IJE)=ZSURFPP(IIE,IJB:IJE)
+    ZSURFPP(1:IIU,1)=ZSURFPP(1:IIU,IJB)
+    ZSURFPP(1:IIU,IJU)=ZSURFPP(1:IIU,IJE)
+
+!
+!       Predefinition of the Convective region criteria
+!       ------------------------------------------------
+ZMIPX(:,:)=0.
+ZMIMX(:,:)=0.
+ZMEANX(:,:)=0.
+!
+ZMIPX(1:IIU-1,:)=ZSURFPP(1:IIU-1,:)+ZSURFPP(2:IIU,:)
+ZMIMX(2:IIU,:)=ZSURFPP(2:IIU,:)+ZSURFPP(1:IIU-1,:)
+
+DO J=IJB+1,IJE-1
+   DO I=3,IIE-1
+     ZAVER_PR=(SUM(ZSURFPP(I-2:I+2,J-2:J+2))-ZSURFPP(I,J))/24.
+
+!                        threshold at  4 mm/h
+     IF(ZSURFPP(I,J) >= MAX(4.,2.*ZAVER_PR)  &
+     .AND.(ZMAXWATER(I,J) >= ZREPSILON))  ZCONVECT(I-1:I+1,J-1:J+1)=1.
+     IF(ZSURFPP(I,J) >= 20.) ZCONVECT(I,J)=1.
+     IF(ZMAXWATER(I,J) >= ZREPSILON)THEN
+       DO JKLOOP=2,IKE
+           IF(PRT(I,J,JKLOOP,2) >= ZREPSILON1) ZCONVECT(I,J)=1.
+           IF(XWT(I,J,JKLOOP) >= ZREPSILON2) ZCONVECT(I,J)=1.
+       END DO
+     END IF
+  END DO
+END DO 
+
+!------------------------------------------
+!*  MASK Definition
+!------------------------------------------
+IBUIL=IIB+1
+IBUIH = IIE-1
+IBUJL = IJB+1
+IBUJH = IJE-1
+DO JILOOP=IBUIL,IBUIH
+  DO JJLOOP=IBUJL,IBUJH
+!------------------------------------------
+!*   Zone 1: Convective Zone
+!------------------------------------------
+     ZMASK(JILOOP,JJLOOP,1)=ZCONVECT(JILOOP,JJLOOP) 
+!------------------------------------------
+!*   Zone 2: Stratiforme Zone
+!------------------------------------------
+     IF (ZMAXWATER(JILOOP,JJLOOP) >= 10.*ZREPSILON.AND.ZMASK(JILOOP,JJLOOP,1)/=1.) THEN 
+         DO JKLOOP=IKB,IKE
+            IF(PRT(JILOOP,JJLOOP,JKLOOP,3) >= ZREPSILON3)  ZMASK(JILOOP,JJLOOP,2)=1.
+         END DO
+     END IF
+!------------------------------------------
+!*   Zone 3: Clear air Zone
+!------------------------------------------
+     IF (ZMASK(JILOOP,JJLOOP,1)/=1. .AND. ZMASK(JILOOP,JJLOOP,2)/=1.)  ZMASK(JILOOP,JJLOOP,3)=1.
+!------------------------------------------
+!*   Zone 4: Total Domain
+!------------------------------------------
+     ZMASK(JILOOP,JJLOOP,4)=1.
+ 
+  END DO
+END DO
+!
+!-----------------------------------------------------------------------
+!
+
+OBU_MSK(IIB:IIE,IJB:IJE,:)=ZMASK(IIB:IIE,IJB:IJE,:)>0.8
+
+
+!
+!*	 2.     INCREASE IN SURFACE ARRAY
+!               -------------------------
+!
+DEALLOCATE( ZMASK )
+DEALLOCATE( ZCONVECT )
+DEALLOCATE( ZSURFPP )
+DEALLOCATE( ZMAXWATER )
+DEALLOCATE(ZMIMX,ZMIPX,ZMEANX)
+DEALLOCATE(ZMEANX_MY,ZMEANX_PY,ZMEANXY)
+!
+!-------------------------------------------------------------------------------
+!
+END SUBROUTINE SET_MSK
diff --git a/src/PHYEX/ext/set_rsou.f90 b/src/PHYEX/ext/set_rsou.f90
new file mode 100644
index 0000000000000000000000000000000000000000..6c2ea6b2f9203cc2eca4d01697a0975155c40f95
--- /dev/null
+++ b/src/PHYEX/ext/set_rsou.f90
@@ -0,0 +1,1640 @@
+!MNH_LIC Copyright 1994-2021 CNRS, Meteo-France and Universite Paul Sabatier
+!MNH_LIC This is part of the Meso-NH software governed by the CeCILL-C licence
+!MNH_LIC version 1. See LICENSE, CeCILL-C_V1-en.txt and CeCILL-C_V1-fr.txt
+!MNH_LIC for details. version 1.
+!-----------------------------------------------------------------
+!     ####################
+      MODULE MODI_SET_RSOU
+!     ####################
+!
+INTERFACE
+!
+      SUBROUTINE SET_RSOU(TPFILE,TPEXPREFILE,HFUNU,HFUNV,KILOC,KJLOC,OBOUSS,&
+                          PJ,OSHIFT,PCORIOZ)
+!
+USE MODD_IO, ONLY : TFILEDATA
+!
+TYPE(TFILEDATA),        INTENT(IN)  :: TPFILE ! outpput data file
+TYPE(TFILEDATA),        INTENT(IN)  :: TPEXPREFILE ! input data file
+CHARACTER(LEN=*),       INTENT(IN)  :: HFUNU  ! type of variation of U
+                                              ! in y direction
+CHARACTER(LEN=*),       INTENT(IN)  :: HFUNV  ! type of variation of V
+                                              ! in x direction
+INTEGER,                INTENT(IN)  :: KILOC  ! I Localisation of vertical profile
+INTEGER,                INTENT(IN)  :: KJLOC  ! J Localisation of vertical profile
+LOGICAL,                INTENT(IN)  :: OBOUSS ! logical switch for Boussinesq version
+REAL, DIMENSION(:,:,:), INTENT(IN) :: PJ ! jacobien 
+LOGICAL,                INTENT(IN)  :: OSHIFT ! logical switch for vertical shift
+!
+REAL, DIMENSION(:,:,:), INTENT(OUT), OPTIONAL :: PCORIOZ ! Coriolis parameter
+                                               ! (exceptionnaly 3D array)
+!
+END SUBROUTINE SET_RSOU
+!
+END INTERFACE
+!
+END MODULE MODI_SET_RSOU
+!
+!     ########################################################################
+      SUBROUTINE SET_RSOU(TPFILE,TPEXPREFILE,HFUNU,HFUNV,KILOC,KJLOC,OBOUSS, &
+                          PJ,OSHIFT,PCORIOZ)
+!     ########################################################################
+!
+!!****  *SET_RSOU * -  to initialize mass fiels from a radiosounding 
+!!
+!!    PURPOSE
+!!    -------
+!       The purpose of this routine is  to initialize the mass field (theta,r,
+!     thetavrefz,rhorefz) on model grid from a radiosounding located at point 
+!     (KILOC,KJLOC).
+!
+!        The free-formatted part of EXPRE file contains the radiosounding data.The data 
+!     are stored in following order :
+!        
+!         - year,month,day, time (these variables are read in PREINIT program)
+!         - kind of data in EXPRE file (see below for more explanations about
+!                                       YKIND)
+!         - ZGROUND
+!         - PGROUND
+!         - temperature variable at ground ( depending on the data Kind )
+!         - moist variable  at ground ( depending on the data Kind )
+!         - number of wind data levels  ( variable ILEVELU)
+!         - height  ,  dd  , ff   |
+!            or           or      |  ILEVELU times
+!           pressure,  U   , V    |
+!         - number of mass levels  ( variable ILEVELM), including the ground
+!           level
+!         - height  ,  T  ,          Td              |
+!            or        or            or              |  (ILEVELM-1) times
+!           pressure,  THeta_Dry  , Mixing Ratio     |
+!                      or            or              |
+!                      THeta_V    , relative HUmidity|  
+!
+!       NB : the first mass level is at ground
+! 
+!       The following kind of data  is permitted :
+!                  YKIND = 'STANDARD'  :   ZGROUND, PGROUND, TGROUND, TDGROUND
+!                                         (Pressure, dd, ff) , 
+!                                         (Pressure, T, Td)
+!                  YKIND = 'PUVTHVMR'  : zGROUND, PGROUND, ThvGROUND, RGROUND
+!                                        (Pressure, U, V) , 
+!                                        (Pressure, THv, R)
+!                  YKIND = 'PUVTHVHU'  :  zGROUND, PGROUND, ThvGROUND, HuGROUND
+!                                         (Pressure, U, V) , 
+!                                         (Pressure, THv, Hu)
+!                  YKIND = 'ZUVTHVHU'  :  zGROUND, PGROUND, ThvGROUND, HuGROUND
+!                                         (height, U, V) , 
+!                                         (height, THv, Hu)
+!                  YKIND = 'ZUVTHVMR'  :  zGROUND, PGROUND, ThvGROUND, RGROUND
+!                                         (height, U, V) , 
+!                                         (height, THv, R)
+!                  YKIND = 'PUVTHDMR'  : zGROUND, PGROUND, ThdGROUND, RGROUND
+!                                         (Pressure, U, V) , 
+!                                         (Pressure, THd, R)
+!                  YKIND = 'PUVTHDHU'  : zGROUND, PGROUND, ThdGROUND, HuGROUND
+!                                         (Pressure, U, V) , 
+!                                         (Pressure, THd, Hu)
+!                  YKIND = 'ZUVTHDMR'  :  zGROUND, PGROUND, ThdGROUND,
+!                  RGROUND
+!                                         (height, U, V) , 
+!                                         (height, THd, R)
+!                  YKIND = 'PUVTHU'  :   ZGROUND, PGROUND, TGROUND, HuGROUND
+!                                         (Pressure, U, V) , 
+!                                         (Pressure, T, Hu)
+!
+!  For ocean-LES case  the following kind of data is permitted
+!         
+!                  YKIND = 'IDEALOCE' : ZGROUND (Water depth),PGROUND(Sfc Atmos Press),
+!                                        TGROUND (SST), RGROUND (SSS)
+!                                         (Depth , U, V) starting from sfc   
+!                                         (Depth,  T, S)
+!                                     (Time, LE, H, SW_d,SW_u,LW_d,LW_u,Stress_X,Stress_Y)
+!
+!                  YKIND = 'STANDOCE' :  (Depth , Temp, Salinity, U, V) starting from sfc   
+!                                        (Time, LE, H, SW_d,SW_u,LW_d,LW_u,Stress_X,Stress_Y)     
+!        
+!!**  METHOD
+!!    ------
+!!      The radiosounding is first read, then data are converted in order to
+!!    always obtain  the following variables  (case YKIND = 'ZUVTHVMR') :
+!!       (height,U,V) and (height,Thetav,r) which are the model variables.
+!!      That is to say : 
+!!         - YKIND = 'STANDARD' : 
+!!           dd,ff converted in U,V
+!!           Td + pressure ----> r
+!!           T,r ---> Tv  + pressure ----> thetav
+!!           Pressure + thetav + ZGROUND ----> height (for mass levels)
+!!           Thetav at mass levels ----> thetav at wind levels
+!!           Pressure + thetav + ZGROUND + PGROUND ---->height (for wind levels)
+!!         - YKIND = 'PUVTHVMR' : 
+!!           Pressure + thetav + ZGROUND ----> height (for mass levels)
+!!           Thetav at mass levels ----> thetav at wind levels
+!!           Pressure + thetav + ZGROUND + PGROUND ---->height (for wind levels)
+!!         - YKIND = 'PUVTHVHU' : 
+!!           thetav + pressure ----> Tv +pressure +Hu ----> r 
+!!           Pressure + thetav + ZGROUND ----> height (for mass levels)
+!!           Thetav at mass levels ----> thetav at wind levels
+!!           Pressure + thetav + ZGROUND + PGROUND ---->height (for wind levels)
+!!         - YKIND = 'ZUVTHVHU' : 
+!!           height +thetav + PGROUND -----> pressure (for mass levels)
+!!           thetav + pressure ----> Tv +pressure +Hu ----> r 
+!!         - YKIND = 'PUVTHDVMR' : 
+!!           thetad + r ----> thetav
+!!           pressure + thetav + ZGROUND ----> height (for mass levels)
+!!           Thetav at mass levels ----> thetav at wind levels
+!!           Pressure + thetav + ZGROUND + PGROUND ---->height (for wind levels)
+!!         - YKIND = 'PUVTHDHU' :  
+!!           thetad + pressure -----> T
+!!           T + pressure + Hu -----> r 
+!!           thetad + r -----> thetav
+!!           pressure + thetav + ZGROUND ----> height (for mass levels)
+!!           Thetav at mass levels ----> thetav at wind levels
+!!           Pressure + thetav + ZGROUND + PGROUND ---->height (for wind levels)
+!!         - YKIND = 'ZUVTHDHU' :  
+!!           thetad + r -----> thetav
+!!         - YKIND = 'PUVTHU' :  
+!!           T + pressure -----> thetad
+!!           T + pressure + Hu  -----> r
+!!           thetad + r -----> thetav
+!!           pressure + thetav + ZGROUND ----> height (for mass levels)
+!!           Thetav at mass levels ----> thetav at wind levels
+!!           
+!!      The following basic formula are used :
+!!                Rd  es(Td)
+!!            r = --  ----------
+!!                Rv  P - es(Td)
+!!
+!!                 1 + (Rv/Rd) r
+!!            Tv = --------------  T  
+!!                    1 + r
+!!
+!!                          P00    Rd/Cpd             1 + (Rv/Rd) r
+!!            Thetav = Tv ( ---- )         = Thetad ( --------------)
+!!                           P                           1 + r
+!!       The integration of hydrostatic relation is used to compute height from
+!!   pressure  and vice-versa. This is done by HEIGHT_PRESS and PRESS_HEIGHT 
+!!   routines.  
+!!   
+!!      Then, these data are interpolated on a vertical grid which is  
+!!    a mixed grid calaculated with VERT_COORD from the vertical levels of MNH
+!!    grid and with a constant ororgraphy equal to the altitude of the vertical
+!!    profile (ZZGROUND) (It permits to keep low levels information with a
+!!    shifting function (as in PREP_REAL_CASE))
+!!
+!!      Then, the 3D mass and wind fields are deduced in SET_MASS
+!!     
+!!
+!!    EXTERNAL
+!!    --------
+!!      SET_MASS : to compute mass field on 3D-model grid
+!!      Module MODE_THERMO : contains thermodynamic routines
+!!         SM_FOES : To compute saturation vapor pressure from 
+!!                   temperature
+!!         SM_PMR_HU : to compute vapor mixing ratio from pressure, virtual
+!!                    temperature and relative humidity
+!!      HEIGHT_PRESS : to compute height from pressure and thetav 
+!!                    by integration of hydrostatic relation
+!!      PRESS_HEIGHT : to compute pressure from height and thetav
+!!                    by integration of hydrostatic relation
+!!      THETAVPU_THETAVPM : to interpolate thetav on wind levels
+!!                          from thetav on mass levels
+!!
+!!      Module MODI_HEIGHT_PRESS      : interface for function HEIGHT_PRESS
+!!      Module MODI_PRESS_HEIGHT      : interface for function PRESS_HEIGHT
+!!      Module MODI_THETAVPU_THETAVPM : interface for function
+!!                                      THETAVPU_THETVPM
+!!      Module MODI_SET_MASS          : interface for subroutine SET_MASS
+!!
+!!    IMPLICIT ARGUMENTS
+!!    ------------------
+!!      Module MODD_CST     : contains physical constants
+!!        XPI  : Pi
+!!        XRV  : Gas constant for vapor 
+!!        XRD  : Gas constant for dry air
+!!        XCPD : Specific heat for dry air at constant pressure
+!!
+!!      Module MODD_LUNIT1  : contains logical unit names 
+!!        TLUOUT : name of output-listing
+!!
+!!      Module MODD_CONF    : contains configuration variables for all models. 
+!!        NVERB : verbosity level for output-listing
+!!
+!!      Module MODD_GRID1  : contains grid variables
+!!        XZHAT : height of w-levels of vertical model grid without orography
+!!
+!!    REFERENCE
+!!    ---------
+!!      Book2 of MESO-NH documentation (routine SET_RSOU)
+!!    
+!!
+!!    AUTHOR
+!!    ------
+!!	V. Ducrocq       * Meteo France *
+!!
+!!    MODIFICATIONS
+!!    -------------
+!!      Original    25/08/94
+!!      J.Stein     06/12/94  change the way to prescribe the horizontal wind
+!!                            variations + cleaning
+!!      J.Stein     18/01/95  bug corrections in the ILEVELM readings
+!!      J.Stein     16/04/95  put the same names of the declarative modules
+!!                            in the descriptive part
+!!      J.Stein     30/01/96  use the RS ground pressure to initialize the
+!!                            hydrostatic pressure computation
+!!      V.Masson    02/09/96  add allocation of ZTHVU in two cases
+!!      P.Jabouille 14/02/96  bug in extrapolation of ZMRM below the first level
+!! Jabouille/Masson 05/12/02  add  ZUVTHLMR case and hydrometeor initialization
+!!      P.Jabouille 29/10/03  add  hydrometeor initialization for ZUVTHDMR case
+!!      G. Tanguy   26/10/10  change the interpolation of the RS : we use now a
+!!                            mixed grid (PREP_REAL_CASE method)
+!!                            add PUVTHU case
+!!      V.Masson    12/08/13  Parallelization of the initilization profile
+!!      J.Escobar : 15/09/2015 : WENO5 & JPHEXT <> 1 
+!!  Philippe Wautelet: 05/2016-04/2018: new data structures and calls for I/O
+!  P. Wautelet 19/04/2019: removed unused dummy arguments and variables
+!  JL Redelsperger 01/2021: Ocean LES cases added
+!-------------------------------------------------------------------------------
+!
+!*       0.    DECLARATIONS
+!              ------------
+!
+USE MODD_CONF
+USE MODD_CONF_n
+USE MODD_CST
+USE MODD_NEB_n, ONLY: NEBN
+USE MODD_DYN_n,      ONLY: LOCEAN
+USE MODD_FIELD_n
+USE MODD_GRID
+USE MODD_GRID_n
+USE MODD_LUNIT_n,    ONLY: TLUOUT
+USE MODD_IO,         ONLY: TFILEDATA
+USE MODD_NETCDF
+USE MODD_OCEANH
+USE MODD_PARAMETERS, ONLY: JPHEXT
+USE MODD_TYPE_DATE
+!
+USE MODE_ll
+USE MODE_MSG
+USE MODE_THERMO
+!
+USE MODI_COMPUTE_EXNER_FROM_GROUND
+USE MODI_HEIGHT_PRESS
+USE MODI_PRESS_HEIGHT
+USE MODI_SET_MASS
+USE MODI_SHUMAN
+USE MODI_THETAVPU_THETAVPM
+USE MODI_VERT_COORD
+!
+USE NETCDF          ! for reading the NR files 
+!
+IMPLICIT NONE
+!  
+!  
+!*       0.1   Declarations of arguments :
+!
+TYPE(TFILEDATA),        INTENT(IN)  :: TPFILE ! outpput data file
+TYPE(TFILEDATA),        INTENT(IN)  :: TPEXPREFILE ! input data file
+CHARACTER(LEN=*),       INTENT(IN)  :: HFUNU  ! type of variation of U
+                                              ! in y direction
+CHARACTER(LEN=*),       INTENT(IN)  :: HFUNV  ! type of variation of V
+                                              ! in x direction
+INTEGER,                INTENT(IN)  :: KILOC  ! I Localisation of vertical profile
+INTEGER,                INTENT(IN)  :: KJLOC  ! J Localisation of vertical profile
+LOGICAL,                INTENT(IN)  :: OBOUSS ! logical switch for Boussinesq version
+LOGICAL,                INTENT(IN)  :: OSHIFT ! logical switch for vertical shift
+REAL, DIMENSION(:,:,:), INTENT(OUT), OPTIONAL :: PCORIOZ ! Coriolis parameter
+                                               ! (exceptionnaly 3D array)
+REAL, DIMENSION(:,:,:), INTENT(IN) :: PJ ! jacobien 
+!
+!
+!*       0.2   Declarations of local variables :
+!
+INTEGER                         :: ILUPRE ! logical unit number of the EXPRE return code
+INTEGER                         :: ILUOUT    ! Logical unit number for output-listing
+! local variables for reading sea sfc flux forcing for ocean model
+INTEGER                   :: IFRCLT 
+REAL, DIMENSION(:), ALLOCATABLE :: ZSSUFL_T,ZSSVFL_T,ZSSTFL_T,ZSSOLA_T !
+TYPE (DATE_TIME), DIMENSION(:), ALLOCATABLE :: ZFRCLT ! date/time of sea surface forcings
+!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
+!  variables read in EXPRE file at the RS/CTD levels
+!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
+CHARACTER(LEN=8)                :: YKIND     ! Kind of  variables in 
+                                             ! EXPRE FILE
+INTEGER                         :: ILEVELU   ! number of wind levels 
+REAL, DIMENSION(:), ALLOCATABLE :: ZHEIGHTU  ! Height at wind levels 
+REAL, DIMENSION(:), ALLOCATABLE :: ZPRESSU   ! Pressure at wind levels
+REAL, DIMENSION(:), ALLOCATABLE :: ZTHVU     ! Thetav at wind levels
+REAL, DIMENSION(:), ALLOCATABLE :: ZU,ZV     ! wind components
+REAL, DIMENSION(:), ALLOCATABLE :: ZDD,ZFF   ! dd (direction) and ff(force)
+                                             !     for wind
+REAL                            :: ZZGROUND,ZPGROUND ! height and Pressure at ground  
+REAL                            :: ZTGROUND,ZTHVGROUND,ZTHDGROUND,ZTHLGROUND,    & 
+                                   ZTDGROUND,ZMRGROUND,ZHUGROUND        
+                                                  ! temperature and moisture
+                                                  ! variables at ground
+INTEGER                         :: ILEVELM   ! number of mass levels
+REAL, DIMENSION(:), ALLOCATABLE :: ZHEIGHTM  ! Height at mass levels
+REAL, DIMENSION(:), ALLOCATABLE :: ZPRESSM   ! Pressure at mass levels
+REAL, DIMENSION(:), ALLOCATABLE :: ZTHV      ! Thetav at mass levels
+REAL, DIMENSION(:), ALLOCATABLE :: ZTHD      ! Theta (dry) at mass levels
+REAL, DIMENSION(:), ALLOCATABLE :: ZTHL      ! Thetal at mass levels  
+REAL, DIMENSION(:), ALLOCATABLE :: ZTH       ! Theta at mass levels
+REAL, DIMENSION(:), ALLOCATABLE :: ZT        ! Temperature at mass levels
+REAL, DIMENSION(:), ALLOCATABLE :: ZMR       ! Vapor mixing ratio at mass levels
+REAL, DIMENSION(:), ALLOCATABLE :: ZMRC      ! cloud mixing ratio at mass levels
+REAL, DIMENSION(:), ALLOCATABLE :: ZMRI      ! ice mixing ratio or cloud concentration
+REAL, DIMENSION(:), ALLOCATABLE :: ZRT       ! total mixing ratio  
+REAL, DIMENSION(:), ALLOCATABLE :: ZPRESS    ! pressure at mass level 
+REAL, DIMENSION(:), ALLOCATABLE :: ZHU       ! relative humidity at mass levels
+REAL, DIMENSION(:), ALLOCATABLE :: ZTD       ! Td at mass levels
+REAL, DIMENSION(:), ALLOCATABLE :: ZTV       ! Tv at mass levels
+REAL, DIMENSION(:), ALLOCATABLE :: ZEXN      
+REAL, DIMENSION(:), ALLOCATABLE :: ZCPH     
+REAL, DIMENSION(:), ALLOCATABLE :: ZLVOCPEXN     
+REAL, DIMENSION(:), ALLOCATABLE :: ZLSOCPEXN    
+REAL, DIMENSION(SIZE(XZHAT))    :: ZZFLUX_PROFILE ! altitude of flux points on the initialization columns
+REAL, DIMENSION(SIZE(XZHAT))    :: ZZMASS_PROFILE ! altitude of mass points on the initialization columns
+!
+!  fields on the grid of the model without orography
+!
+REAL, DIMENSION(SIZE(XZHAT))    :: ZUW,ZVW ! Wind at w model grid levels
+REAL, DIMENSION(SIZE(XZHAT))    :: ZMRM   ! vapor mixing ratio at mass model
+                                          !grid levels 
+REAL, DIMENSION(SIZE(XZHAT))    :: ZMRCM,ZMRIM
+REAL, DIMENSION(SIZE(XZHAT))    :: ZTHVM  ! Temperature at mass model grid levels
+REAL, DIMENSION(SIZE(XZHAT))    :: ZTHLM  ! Thetal at mass model grid levels
+REAL, DIMENSION(SIZE(XZHAT))    :: ZTHM  ! Thetal at mass model grid levels
+REAL, DIMENSION(SIZE(XZHAT))    :: ZRHODM   ! density at mass model grid level
+REAL, DIMENSION(:), ALLOCATABLE :: ZMRT    ! Total Vapor mixing ratio at mass levels on mixed grid
+REAL, DIMENSION(:), ALLOCATABLE :: ZEXNMASS  ! exner fonction at mass level
+REAL, DIMENSION(:), ALLOCATABLE :: ZEXNFLUX  ! exner fonction at flux level
+REAL                            :: ZEXNSURF  ! exner fonction at surface
+REAL, DIMENSION(:), ALLOCATABLE :: ZPREFLUX   ! pressure at flux model grid level
+REAL, DIMENSION(:), ALLOCATABLE :: ZFRAC_ICE ! ice fraction
+REAL, DIMENSION(:), ALLOCATABLE :: ZRSATW, ZRSATI             
+REAL                            :: ZDZSDH,ZDZ1SDH,ZDZ2SDH ! interpolation
+                                                          ! working arrays
+REAL, DIMENSION(:,:), ALLOCATABLE :: ZBUF
+!
+INTEGER         :: JK,JKLEV,JKU,JKM,JKT,JJ,JI,JO,JLOOP  ! Loop indexes
+INTEGER         :: IKU                ! Upper bound in z direction
+REAL            :: ZRDSCPD,ZRADSDG, & ! Rd/Cpd, Pi/180.,
+                   ZRVSRD,ZRDSRV,   & ! Rv/Rd, Rd/Rv
+                   ZPTOP              ! Pressure at domain top 
+LOGICAL         :: GUSERC             ! use of input data cloud
+INTEGER         :: IIB, IIE, IJB, IJE
+INTEGER         :: IXOR_ll, IYOR_ll
+INTEGER         :: IINFO_ll
+LOGICAL         :: GPROFILE_IN_PROC   ! T : initialization profile is in current processor
+!
+REAL,DIMENSION(SIZE(XXHAT),SIZE(XYHAT))   ::ZZS_LS
+REAL,DIMENSION(SIZE(XXHAT),SIZE(XYHAT),SIZE(XZHAT)) ::ZZFLUX_MX,ZZMASS_MX ! mixed grid
+!-------------------------------------------------------------------------------
+! For standard ocean version, reading external files
+CHARACTER(LEN=256) :: yinfile, yinfisf ! files to be read
+INTEGER :: IDX
+INTEGER(KIND=CDFINT) :: INZ, INLATI, INLONGI
+INTEGER(KIND=CDFINT) :: incid, ivarid, idimid, idimlen
+REAL, DIMENSION(:,:,:),     ALLOCATABLE :: ZOC_TEMPERATURE,ZOC_SALINITY,ZOC_U,ZOC_V
+REAL, DIMENSION(:),     ALLOCATABLE :: ZOC_DEPTH  
+REAL, DIMENSION(:),     ALLOCATABLE :: ZOC_LE,ZOC_H
+REAL, DIMENSION(:),     ALLOCATABLE :: ZOC_SW_DOWN,ZOC_SW_UP,ZOC_LW_DOWN,ZOC_LW_UP
+REAL, DIMENSION(:),     ALLOCATABLE :: ZOC_TAUX,ZOC_TAUY
+
+!--------------------------------------------------------------------------------
+!
+!*	 1.     PROLOGUE : INITIALIZE SOME CONSTANTS, RETRIEVE LOGICAL
+!               UNIT NUMBERS AND READ KIND OF DATA IN EXPRE FILE
+!	        -------------------------------------------------------
+!
+CALL GET_INDICE_ll(IIB,IJB,IIE,IJE)
+CALL GET_OR_ll('B',IXOR_ll,IYOR_ll)
+!
+!*       1.1  initialize some constants 
+!
+ZRDSCPD = XRD / XCPD
+ZRADSDG = XPI/180.
+ZRVSRD  = XRV/XRD
+ZRDSRV = XRD/XRV
+!
+!*       1.2  Retrieve logical unit numbers 
+!                         
+ILUPRE = TPEXPREFILE%NLU
+ILUOUT = TLUOUT%NLU
+!
+!*       1.3  Read data kind in EXPRE file 
+!
+READ(ILUPRE,*) YKIND
+WRITE(ILUOUT,*) 'YKIND read in set_rsou: ', YKIND
+!
+IF(LUSERC .AND. YKIND/='PUVTHDMR' .AND. YKIND/='ZUVTHDMR' .AND.  YKIND/='ZUVTHLMR') THEN 
+  CALL PRINT_MSG(NVERB_FATAL,'GEN','SET_RSOU','hydrometeors are not allowed for YKIND = '//trim(YKIND))
+ENDIF
+!
+IF(YKIND=='ZUVTHLMR' .AND. .NOT. LUSERC) THEN
+!callabortstop
+  CALL PRINT_MSG(NVERB_FATAL,'GEN','SET_RSOU','LUSERC=T is required for YKIND=ZUVTHLMR')
+ENDIF
+!
+GUSERC=.FALSE.
+IF(LUSERC .AND. (YKIND == 'PUVTHDMR' .OR. YKIND == 'ZUVTHDMR')) GUSERC=.TRUE.
+!-------------------------------------------------------------------------------
+!
+!*	 2.     READ DATA AND CONVERT IN (height,U,V), (height,Thetav,r)
+!	        --------------------------------------------------------
+!
+SELECT CASE(YKIND)
+!   
+!     2.0.1 Ocean case 1
+!   
+  CASE ('IDEALOCE')
+!
+    XP00=XP00OCEAN
+    ! Read data in PRE_IDEA1.nam
+    ! Surface      
+    WRITE(ILUOUT,FMT=*) 'Reading data for ideal ocean :IDEALOCE'   
+    READ(ILUPRE,*) ZPTOP           ! P_atmosphere at sfc =P top domain
+    READ(ILUPRE,*) ZTGROUND        ! SST 
+    READ(ILUPRE,*) ZMRGROUND       ! SSS
+    WRITE(ILUOUT,FMT=*) 'Patm SST SSS', ZPTOP,ZTGROUND,ZMRGROUND
+    READ(ILUPRE,*) ILEVELU         ! Read number of Current levels
+    ! Allocate required memory 
+    ALLOCATE(ZHEIGHTU(ILEVELU),ZU(ILEVELU),ZV(ILEVELU))
+    ALLOCATE(ZOC_U(ILEVELU,1,1),ZOC_V(ILEVELU,1,1))
+    WRITE(ILUOUT,FMT=*) 'Level number for Current in data', ILEVELU
+    ! Read U and V at each wind level
+    DO JKU = 1,ILEVELU
+      READ(ILUPRE,*) ZHEIGHTU(JKU),ZOC_U(JKU,1,1),ZOC_V(JKU,1,1)
+      ! WRITE(ILUOUT,FMT=*) 'Leveldata D(m) under sfc: U_cur, V_cur', JKU, ZHEIGHTU(JKU),ZU(JKU),ZV(JKU)
+    END DO
+    DO JKU=1,ILEVELU
+      ! Z axis reoriented as in the model
+      IDX     = ILEVELU-JKU+1
+      ZU(JKU) = ZOC_U(IDX,1,1)
+      ZV(JKU) = ZOC_V(IDX,1,1)
+      ! ZHEIGHT used only in set_ rsou, defined as such ZHEIGHT(ILEVELM)=H_model
+      ! Z oriented in same time to have a model domain axis going
+      ! from 0m (ocean bottom/model bottom) towards H (ocean sfc/model top)
+    END DO
+    ! Read number of mass levels  
+    READ(ILUPRE,*) ILEVELM
+    ! Allocate required memory 
+    ALLOCATE(ZOC_DEPTH(ILEVELM))
+    ALLOCATE(ZHEIGHTM(ILEVELM))           
+    ALLOCATE(ZTHL(ILEVELM),ZTH(ILEVELM),ZTHV(ILEVELM)) 
+    ALLOCATE(ZMR(ILEVELM),ZRT(ILEVELM))
+    ALLOCATE(ZOC_TEMPERATURE(ILEVELM,1,1),ZOC_SALINITY(ILEVELM,1,1))
+    ! Read T and S at each mass level 
+    DO JKM= 2,ILEVELM
+      READ(ILUPRE,*) ZOC_DEPTH(JKM),ZOC_TEMPERATURE(JKM,1,1),ZOC_SALINITY(JKM,1,1)
+    END DO
+    ! Complete the mass arrays with the ground informations read in EXPRE file
+    ZOC_DEPTH(1)    = 0.                    
+    ZOC_TEMPERATURE(1,1,1)= ZTGROUND
+    ZOC_SALINITY(1,1,1)= ZMRGROUND
+    !!!!!!!!!!!!!!!!!!!!!!!!Inversing Axis!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
+    ! Going from the data (axis downward i.e inverse model) grid to the model grid (axis upward)
+    ! Uniform bathymetry; depth goes from ocean sfc downwards  (data grid)
+    ! ZHEIGHT goes from the model domain bottom up to the sfc ocean (top of model domain)
+    !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
+    ZZGROUND   = 0.
+    ZTGROUND   = ZOC_TEMPERATURE(ILEVELM,1,1) 
+    ZMRGROUND  = ZOC_SALINITY(ILEVELM,1,1)
+    DO JKM= 1,ILEVELM
+      ! Z upward axis (oriented as in the model), i.e.
+      ! going from 0m (ocean bottom/model bottom) upward to H (ocean sfc/model top)
+      ! ZHEIGHT used only in set_ rsou, defined as such ZHEIGHT(ILEVELM)=H_model
+      IDX          = ILEVELM-JKM+1
+      ZTH(JKM)      = ZOC_TEMPERATURE(IDX,1,1)
+      ZMR(JKM)     = ZOC_SALINITY(IDX,1,1)
+      ZHEIGHTM(JKM)= ZOC_DEPTH(ILEVELM)- ZOC_DEPTH(IDX)
+      WRITE(ILUOUT,FMT=*) 'Model oriented initial data: JKM IDX depth T S ZHEIGHTM', &
+                      JKM,IDX,ZOC_DEPTH(IDX),ZTH(JKM),ZMR(JKM),ZHEIGHTM(JKM)
+    END DO
+    ! mass levels of the RS
+    ZTHV = ZTH ! TV==THETA=TL
+    ZTHL = ZTH
+    ZRT  = ZMR  
+    !!!!!!!!!!!!!!!!!!!!!!!!!!!!
+    ! READ Sea Surface Forcing !
+    !!!!!!!!!!!!!!!!!!!!!!!!!!!!
+    ! Reading the forcings from prep_idea1.nam
+    READ(ILUPRE,*) IFRCLT  ! Number of time-dependent forcing 
+    IF (IFRCLT > 99*8) THEN
+      ! CAUTION: number of forcing times is limited by the WRITE format 99(8E10.3)
+      !          and also by the name of forcing variables (format I3.3)
+      !          You have to modify those if you need more forcing times
+     CALL PRINT_MSG(NVERB_FATAL,'IO','SET_RSOU','maximum forcing times NFRCLT is 99*8')
+    END IF
+!
+    WRITE(UNIT=ILUOUT,FMT='(" THERE ARE ",I2," SFC FLUX FORCINGs AT:")') IFRCLT
+    ALLOCATE(ZFRCLT(IFRCLT))
+    ALLOCATE(ZSSUFL_T(IFRCLT)); ZSSUFL_T = 0.0
+    ALLOCATE(ZSSVFL_T(IFRCLT)); ZSSVFL_T = 0.0
+    ALLOCATE(ZSSTFL_T(IFRCLT)); ZSSTFL_T = 0.0
+    ALLOCATE(ZSSOLA_T(IFRCLT)); ZSSOLA_T = 0.0
+    DO JKT = 1,IFRCLT
+      WRITE(ILUOUT,FMT='(A, I4)') "SET_RSOU/Reading Sea Surface forcing: Number=", JKT
+      READ(ILUPRE,*) ZFRCLT(JKT)%nyear, ZFRCLT(JKT)%nmonth, &
+                     ZFRCLT(JKT)%nday,  ZFRCLT(JKT)%xtime
+      READ(ILUPRE,*) ZSSUFL_T(JKT)
+      READ(ILUPRE,*) ZSSVFL_T(JKT)
+      READ(ILUPRE,*) ZSSTFL_T(JKT)
+      READ(ILUPRE,*) ZSSOLA_T(JKT)
+    END DO
+!
+    DO JKT = 1 , IFRCLT
+      WRITE(UNIT=ILUOUT,FMT='(F9.0, "s, date:", I3, "/", I3, "/", I5)') &
+                 ZFRCLT(JKT)%xtime,         ZFRCLT(JKT)%nday,   &
+                 ZFRCLT(JKT)%nmonth, ZFRCLT(JKT)%nyear
+    END DO
+    NINFRT= INT(ZFRCLT(2)%xtime)
+    WRITE(ILUOUT,FMT='(A)') &
+         "Number U-Stress, V-Stress, Heat turb Flux, Solar Flux Interval(s)",NINFRT
+    DO JKT = 1, IFRCLT
+      WRITE(ILUOUT,FMT='(I10,99(3F10.2))') JKT, ZSSUFL_T(JKT),ZSSVFL_T(JKT),ZSSTFL_T(JKT) 
+    END DO
+    NFRCLT = IFRCLT
+    ALLOCATE(TFRCLT(NFRCLT))
+    ALLOCATE(XSSUFL_T(NFRCLT));XSSUFL_T(:)=0.
+    ALLOCATE(XSSVFL_T(NFRCLT));XSSVFL_T(:)=0.
+    ALLOCATE(XSSTFL_T(NFRCLT));XSSTFL_T(:)=0.
+    ALLOCATE(XSSOLA_T(NFRCLT));XSSOLA_T(:)=0.
+!
+    DO JKT=1,NFRCLT
+      TFRCLT(JKT)= ZFRCLT(JKT)
+      XSSUFL_T(JKT)=ZSSUFL_T(JKT)/XRH00OCEAN
+      XSSVFL_T(JKT)=ZSSVFL_T(JKT)/XRH00OCEAN
+      ! working in SI
+      XSSTFL_T(JKT)=ZSSTFL_T(JKT) /(3900.*XRH00OCEAN)
+      XSSOLA_T(JKT)=ZSSOLA_T(JKT) /(3900.*XRH00OCEAN)
+    END DO   
+    DEALLOCATE(ZFRCLT)
+    DEALLOCATE(ZSSUFL_T)
+    DEALLOCATE(ZSSVFL_T)
+    DEALLOCATE(ZSSTFL_T)
+    DEALLOCATE(ZSSOLA_T)
+!
+!--------------------------------------------------------------------------------   
+! 2.0.2  Ocean standard initialize from netcdf files
+!        U,V,T,S at Z levels + Forcings at model TOP (sea surface) 
+!--------------------------------------------------------------------------------   
+!
+  CASE ('STANDOCE')
+!   
+    XP00=XP00OCEAN
+    READ(ILUPRE,*) ZPTOP           ! P_atmosphere at sfc =P top domain
+    READ(ILUPRE,*) YINFILE, YINFISF
+    WRITE(ILUOUT,FMT=*) 'Netcdf files to read:', YINFILE, YINFISF
+    ! Open file containing initial profiles
+    CALL check(nf90_open(yinfile,NF90_NOWRITE,incid), "opening NC file")
+    ! Reading dimensions and lengths
+    CALL check( nf90_inq_dimid(incid, "depth",idimid), "getting depth  dimension id" )
+    CALL check( nf90_inquire_dimension(incid, idimid,             len=INZ),     "getting INZ"   )
+    CALL check( nf90_inquire_dimension(incid, INT(2,KIND=CDFINT), len=INLONGI), "getting NLONG" )
+    CALL check( nf90_inquire_dimension(incid, INT(1,KIND=CDFINT), len=INLATI),  "getting NLAT"  )
+!   
+    WRITE(ILUOUT,FMT=*) 'NB LEVLS READ INZ, NLONG NLAT ', INZ, INLONGI,INLATI
+    ALLOCATE(ZOC_TEMPERATURE(INLATI,INLONGI,INZ),ZOC_SALINITY(INLATI,INLONGI,INZ))
+    ALLOCATE(ZOC_U(INLATI,INLONGI,INZ),ZOC_V(INLATI,INLONGI,INZ))
+    ALLOCATE(ZOC_DEPTH(INZ))
+    WRITE(ILUOUT,FMT=*) 'NETCDF READING ==> Temp'
+    CALL check(nf90_inq_varid(incid,"temperature",ivarid), "getting temp ivarid")
+    CALL check(nf90_get_var(incid,ivarid,ZOC_TEMPERATURE), "reading temp")
+    WRITE(ILUOUT,FMT=*) 'Netcdf Reading ==> salinity'
+    CALL check(nf90_inq_varid(incid,"salinity",ivarid), "getting salinity ivarid")
+    CALL check(nf90_get_var(incid,ivarid,ZOC_SALINITY), "reading salinity")
+    WRITE(ILUOUT,FMT=*) 'Netcdf ==> Reading depth'
+    CALL check(nf90_inq_varid(incid,"depth",ivarid), "getting depth ivarid")
+    CALL check(nf90_get_var(incid,ivarid,ZOC_DEPTH), "reading depth")
+    WRITE(ILUOUT,FMT=*) 'depth: max min ', MAXVAL(ZOC_DEPTH),MINVAL(ZOC_DEPTH)
+    WRITE(ILUOUT,FMT=*) 'depth 1 nz: ', ZOC_DEPTH(1),ZOC_DEPTH(INZ)
+    WRITE(ILUOUT,FMT=*) 'Netcdf Reading ==> Currents'
+    CALL check(nf90_inq_varid(incid,"u",ivarid), "getting u ivarid")
+    CALL check(nf90_get_var(incid,ivarid,ZOC_U), "reading u")
+    CALL check(nf90_inq_varid(incid,"v",ivarid), "getting v ivarid")
+    CALL check(nf90_get_var(incid,ivarid,ZOC_V), "reading v")
+    CALL check(nf90_close(incid), "closing yinfile")
+    WRITE(ILUOUT,FMT=*) 'End of initial file reading'
+!
+    DO JKM=1,INZ
+     ZOC_TEMPERATURE(1,1,JKM)=ZOC_TEMPERATURE(1,1,JKM)+273.15
+     WRITE(ILUOUT,FMT=*) 'Z T(Kelvin) S(Sverdup) U V K',&
+     JKM,ZOC_DEPTH(JKM),ZOC_TEMPERATURE(1,1,JKM),ZOC_SALINITY(1,1,JKM),ZOC_U(1,1,JKM),ZOC_V(1,1,JKM), JKM
+    ENDDO
+    !  number of data levels
+    ILEVELM=INZ
+    ! Model bottom
+    ZTGROUND  = ZOC_TEMPERATURE(1,1,ILEVELM)
+    ZMRGROUND = ZOC_SALINITY(1,1,ILEVELM)
+    ZZGROUND=0.
+    ! Allocate required memory
+    ALLOCATE(ZHEIGHTM(ILEVELM))           
+    ALLOCATE(ZT(ILEVELM))
+    ALLOCATE(ZTV(ILEVELM))
+    ALLOCATE(ZMR(ILEVELM))
+    ALLOCATE(ZTHV(ILEVELM)) 
+    ALLOCATE(ZTHL(ILEVELM))
+    ALLOCATE(ZRT(ILEVELM))
+    !  Going from the inverse model grid (data) to the normal one
+    DO JKM= 1,ILEVELM
+      ! Z axis reoriented as in the model
+      IDX     = ILEVELM-JKM+1
+      ZT(JKM) = ZOC_TEMPERATURE(1,1,IDX)
+      ZMR(JKM)  =  ZOC_SALINITY(1,1,IDX)
+      ! ZHEIGHT used only in set_ rsou, defined as such ZHEIGHT(ILEVELM)=H_model
+      ! Z oriented in same time to have a model domain axis going
+      ! from 0m (ocean bottom/model bottom) towards H (ocean sfc/model top)
+      ! translation/inversion
+      ZHEIGHTM(JKM) = -ZOC_DEPTH(IDX) + ZOC_DEPTH(ILEVELM)
+      WRITE(ILUOUT,FMT=*) 'End gridmodel comput: JKM IDX depth T S ZHEIGHTM', &
+      JKM,IDX,ZOC_DEPTH(IDX),ZT(JKM),ZMR(JKM),ZHEIGHTM(JKM)
+    END DO
+    ! complete ther variables
+    ZTV  = ZT
+    ZTHV = ZT
+    ZRT  = ZMR
+    ZTHL = ZT
+    ZTH  = ZT
+    ! INIT --- U V -----
+    ILEVELU = INZ               ! Same nb of levels for u,v,T,S
+    !Assume that current and temp are given at same level
+    ALLOCATE(ZHEIGHTU(ILEVELU))           
+    ALLOCATE(ZU(ILEVELU),ZV(ILEVELU))
+    ZHEIGHTU=ZHEIGHTM
+    DO JKM= 1,ILEVELU
+      ! Z axis reoriented as in the model
+      IDX     = ILEVELU-JKM+1
+      ZU(JKM) = ZOC_U(1,1,IDX)
+      ZV(JKM) = ZOC_V(1,1,IDX)
+      ! ZHEIGHT used only in set_ rsou, defined as such ZHEIGHT(ILEVELM)=H_model
+      ! Z oriented in same time to have a model domain axis going
+      ! from 0m (ocean bottom/model bottom) towards H (ocean sfc/model top)
+    END DO
+!
+    DEALLOCATE(ZOC_TEMPERATURE)
+    DEALLOCATE(ZOC_SALINITY)
+    DEALLOCATE(ZOC_U)
+    DEALLOCATE(ZOC_V)
+    DEALLOCATE(ZOC_DEPTH)
+!
+    ! Reading/initializing  surface forcings
+!
+    WRITE(ILUOUT,FMT=*) 'netcdf sfc forcings file to be read:',yinfisf
+    ! Open of sfc forcing file
+    CALL check(nf90_open(yinfisf,NF90_NOWRITE,incid), "opening NC file")
+    ! Reading dimension and length
+    CALL check( nf90_inq_dimid(incid,"t",idimid), "getting  time dimension id" )
+    CALL check( nf90_inquire_dimension(incid, idimid, len=idimlen), "getting idimlen "  )
+!
+    WRITE(ILUOUT,FMT=*) 'nb sfc-forcing time idimlen=',idimlen
+    ALLOCATE(ZOC_LE(idimlen))
+    ALLOCATE(ZOC_H(idimlen))
+    ALLOCATE(ZOC_SW_DOWN(idimlen))
+    ALLOCATE(ZOC_SW_UP(idimlen))
+    ALLOCATE(ZOC_LW_DOWN(idimlen))
+    ALLOCATE(ZOC_LW_UP(idimlen))
+    ALLOCATE(ZOC_TAUX(idimlen))
+    ALLOCATE(ZOC_TAUY(idimlen))
+!
+    WRITE(ILUOUT,FMT=*)'Netcdf Reading ==> LE'  
+    CALL check(nf90_inq_varid(incid,"LE",ivarid), "getting LE ivarid")
+    CALL check(nf90_get_var(incid,ivarid,ZOC_LE), "reading LE flux")
+    WRITE(ILUOUT,FMT=*)'Netcdf Reading ==> H'  
+    CALL check(nf90_inq_varid(incid,"H",ivarid), "getting H ivarid")
+    CALL check(nf90_get_var(incid,ivarid,ZOC_H), "reading H flux")
+    WRITE(ILUOUT,FMT=*) 'Netcdf Reading ==> SW_DOWN'  
+    CALL check(nf90_inq_varid(incid,"SW_DOWN",ivarid), "getting SW_DOWN ivarid")
+    CALL check(nf90_get_var(incid,ivarid,ZOC_SW_DOWN), "reading SW_DOWN")
+    WRITE(ILUOUT,FMT=*) 'Netcdf Reading ==> SW_UP'  
+    CALL check(nf90_inq_varid(incid,"SW_UP",ivarid), "getting SW_UP ivarid")
+    CALL check(nf90_get_var(incid,ivarid,ZOC_SW_UP), "reading SW_UP")
+    WRITE(ILUOUT,FMT=*) 'Netcdf Reading ==> LW_DOWN'  
+    CALL check(nf90_inq_varid(incid,"LW_DOWN",ivarid), "getting LW_DOWN ivarid")
+    CALL check(nf90_get_var(incid,ivarid,ZOC_LW_DOWN), "reading LW_DOWN")
+    WRITE(ILUOUT,FMT=*) 'Netcdf Reading ==> LW_UP'  
+    CALL check(nf90_inq_varid(incid,"LW_UP",ivarid), "getting LW_UP ivarid")
+    CALL check(nf90_get_var(incid,ivarid,ZOC_LW_UP), "reading LW_UP")
+    WRITE(ILUOUT,FMT=*) 'Netcdf Reading ==> TAUX'  
+    CALL check(nf90_inq_varid(incid,"TAUX",ivarid), "getting TAUX ivarid")
+    CALL check(nf90_get_var(incid,ivarid,ZOC_TAUX), "reading TAUX")
+    WRITE(ILUOUT,FMT=*) 'Netcdf Reading ==> TAUY'  
+    CALL check(nf90_inq_varid(incid,"TAUY",ivarid), "getting TAUY ivarid")
+    CALL check(nf90_get_var(incid,ivarid,ZOC_TAUY), "reading TAUY")
+    CALL check(nf90_close(incid), "closing yinfifs")
+!
+    WRITE(ILUOUT,FMT=*) '  Forcing-Number    LE     H     SW_down     SW_up    LW_down   LW_up TauX TauY' 
+    DO JKM = 1, idimlen
+      WRITE(ILUOUT,FMT=*) JKM, ZOC_LE(JKM), ZOC_H(JKM),ZOC_SW_DOWN(JKM),ZOC_SW_UP(JKM),&
+                          ZOC_LW_DOWN(JKM),ZOC_LW_UP(JKM),ZOC_TAUX(JKM),ZOC_TAUY(JKM)   
+    ENDDO
+    ! IFRCLT FORCINGS at sea surface
+    IFRCLT=idimlen
+    ALLOCATE(ZFRCLT(IFRCLT)) 
+    ALLOCATE(ZSSUFL_T(IFRCLT)); ZSSUFL_T = 0.0
+    ALLOCATE(ZSSVFL_T(IFRCLT)); ZSSVFL_T = 0.0
+    ALLOCATE(ZSSTFL_T(IFRCLT)); ZSSTFL_T = 0.0
+    ALLOCATE(ZSSOLA_T(IFRCLT)); ZSSOLA_T = 0.0
+    DO JKT=1,IFRCLT
+      ! Initial file for CINDY-DYNAMO: all fluxes correspond to the absolute value (>0)
+      ! modele ocean: axe z dirigé du bas vers la sfc de l'océan
+      ! => flux dirigé vers le haut (positif ocean vers l'atmopshere i.e. bas vers le haut)
+      ZSSOLA_T(JKT)=ZOC_SW_DOWN(JKT)-ZOC_SW_UP(JKT)
+      ZSSTFL_T(JKT)=(ZOC_LW_DOWN(JKT)-ZOC_LW_UP(JKT)-ZOC_LE(JKT)-ZOC_H(JKT))
+      ! assume that Tau given on file is along Ox
+      ! rho_air UW_air = rho_ocean UW_ocean= N/m2
+      ! uw_ocean
+      ZSSUFL_T(JKT)=ZOC_TAUX(JKT)
+      ZSSVFL_T(JKT)=ZOC_TAUY(JKT)
+      WRITE(ILUOUT,FMT=*) 'Forcing Nb Sol NSol UW_oc VW',&
+                          JKT,ZSSOLA_T(JKT),ZSSTFL_T(JKT),ZSSUFL_T(JKT),ZSSVFL_T(JKT) 
+    ENDDO
+    ! Allocate and Writing the corresponding variables in module MODD_OCEAN_FRC
+    NFRCLT=IFRCLT
+    ! value to read later on file ? 
+    NINFRT=600
+    ALLOCATE(TFRCLT(NFRCLT))
+    ALLOCATE(XSSUFL_T(NFRCLT));XSSUFL_T(:)=0.
+    ALLOCATE(XSSVFL_T(NFRCLT));XSSVFL_T(:)=0.
+    ALLOCATE(XSSTFL_T(NFRCLT));XSSTFL_T(:)=0.
+    ALLOCATE(XSSOLA_T(NFRCLT));XSSOLA_T(:)=0.
+    ! on passe en unités SI, signe, etc pour le modele ocean
+    !  W/m2 => SI :  /(CP_mer * rho_mer)
+    ! a revoir dans tt le code pour mettre de svaleurs plus exactes
+    DO JKT=1,NFRCLT
+      TFRCLT(JKT)= ZFRCLT(JKT)
+      XSSUFL_T(JKT)=ZSSUFL_T(JKT)/XRH00OCEAN
+      XSSVFL_T(JKT)=ZSSVFL_T(JKT)/XRH00OCEAN
+      XSSTFL_T(JKT)=ZSSTFL_T(JKT) /(3900.*XRH00OCEAN)
+      XSSOLA_T(JKT)=ZSSOLA_T(JKT) /(3900.*XRH00OCEAN)
+    END DO   
+    DEALLOCATE(ZFRCLT)
+    DEALLOCATE(ZSSUFL_T)
+    DEALLOCATE(ZSSVFL_T)
+    DEALLOCATE(ZSSTFL_T)
+    DEALLOCATE(ZSSOLA_T)
+    DEALLOCATE(ZOC_LE)    
+    DEALLOCATE(ZOC_H)    
+    DEALLOCATE(ZOC_SW_DOWN)    
+    DEALLOCATE(ZOC_SW_UP)    
+    DEALLOCATE(ZOC_LW_DOWN)    
+    DEALLOCATE(ZOC_LW_UP)    
+    DEALLOCATE(ZOC_TAUX)
+    DEALLOCATE(ZOC_TAUY)
+    ! END OCEAN STANDARD
+!
+!
+!*       2.1  ATMOSPHERIC STANDARD case : ZGROUND, PGROUND, TGROUND, TDGROUND
+!                               (Pressure, dd, ff) , 
+!                               (Pressure, T, Td)
+!
+  CASE ('STANDARD')
+    
+    READ(ILUPRE,*) ZZGROUND                 ! Read data at ground level
+    READ(ILUPRE,*) ZPGROUND
+    READ(ILUPRE,*) ZTGROUND
+    READ(ILUPRE,*) ZTDGROUND
+!
+    READ(ILUPRE,*) ILEVELU               ! Read number of wind levels
+    ALLOCATE(ZPRESSU(ILEVELU))           ! Allocate memory for arrays to be read
+    ALLOCATE(ZDD(ILEVELU),ZFF(ILEVELU))  
+    ALLOCATE(ZHEIGHTU(ILEVELU))          ! Allocate memory for needed 
+    ALLOCATE(ZU(ILEVELU),ZV(ILEVELU))    !  arrays
+    ALLOCATE(ZTHVU(ILEVELU))             ! Allocate memory for intermediate
+                                         !  arrays 
+!
+    DO JKU = 1,ILEVELU                   ! Read data at wind levels
+      READ(ILUPRE,*) ZPRESSU(JKU),ZDD(JKU),ZFF(JKU)  
+    END DO  
+!
+    READ(ILUPRE,*) ILEVELM           ! Read number of mass levels
+                                     ! including the ground level
+    ALLOCATE(ZPRESSM(ILEVELM))     ! Allocate memory for arrays to be read
+    ALLOCATE(ZT(ILEVELM))                                   
+    ALLOCATE(ZTD(ILEVELM))                                  
+    ALLOCATE(ZHEIGHTM(ILEVELM))    ! Allocate memory for needed 
+    ALLOCATE(ZTHV(ILEVELM))        !  arrays
+    ALLOCATE(ZMR(ILEVELM))
+    ALLOCATE(ZTV(ILEVELM))         ! Allocate memory for intermediate arrays
+    ALLOCATE(ZTHL(ILEVELM))
+    ALLOCATE(ZRT(ILEVELM))                                              
+!
+!   
+    DO JKM= 2,ILEVELM                ! Read data at mass levels
+      READ(ILUPRE,*) ZPRESSM(JKM),ZT(JKM),ZTD(JKM)
+    END DO
+    ZPRESSM(1)=ZPGROUND                 ! Mass level 1 is at the ground
+    ZT(1)=ZTGROUND
+    ZTD(1)=ZTDGROUND 
+!   
+!     recover the North-South and West-East wind components
+    ZU(:) = ZFF(:)*COS(ZRADSDG*(270.-ZDD(:)) )              
+    ZV(:) = ZFF(:)*SIN(ZRADSDG*(270.-ZDD(:)) )
+!
+!     compute vapor mixing ratio 
+    ZMR(:)  = SM_FOES(ZTD(:))                            &      
+            / ( (ZPRESSM(:) - SM_FOES(ZTD(:))) * ZRVSRD )       
+! 
+!     compute Tv
+    ZTV(:) = ZT(:) * (1. + ZRVSRD * ZMR(:))/(1.+ZMR(:))         
+!
+!     compute thetav
+    ZTHV(:) = ZTV(:) * (XP00/ ZPRESSM(:)) **(ZRDSCPD)         
+!
+!     compute height at the mass levels of the RS
+    ZHEIGHTM(:) = HEIGHT_PRESS(ZPRESSM,ZTHV,ZPGROUND,ZTHV(1),ZZGROUND) 
+!
+!     compute thetav and height at the wind levels of the RS
+    ZTHVU(:) = THETAVPU_THETAVPM(ZPRESSM,ZPRESSU,ZTHV)        
+    ZHEIGHTU(:) = HEIGHT_PRESS(ZPRESSU,ZTHVU,ZPGROUND,ZTHV(1),ZZGROUND)
+!
+!   Compute Thetal and Rt
+    ZRT(:)=ZMR(:)
+    ZTHL(:)=ZTHV(:)*(1+ZRT(:))/(1+ZRVSRD*ZRT(:))
+!
+!*       2.2  PUVTHVMR case : zGROUND, PGROUND, ThvGROUND, RGROUND
+!                               (Pressure, U, V) , 
+!                               (Pressure, THv, R)
+!
+  CASE ('PUVTHVMR') 
+!  
+!     Read data at ground level      
+    READ(ILUPRE,*) ZZGROUND                       
+    READ(ILUPRE,*) ZPGROUND
+    READ(ILUPRE,*) ZTHVGROUND
+    READ(ILUPRE,*) ZMRGROUND
+!
+!     Read number of wind levels
+    READ(ILUPRE,*) ILEVELU  
+! 
+!     Allocate the required memory               
+    ALLOCATE(ZPRESSU(ILEVELU))              
+    ALLOCATE(ZU(ILEVELU),ZV(ILEVELU))    
+    ALLOCATE(ZHEIGHTU(ILEVELU))             
+    ALLOCATE(ZTHVU(ILEVELU))                
+!
+!     Read the data at each wind level of the RS   
+    DO JKU =1,ILEVELU
+      READ(ILUPRE,*) ZPRESSU(JKU),ZU(JKU),ZV(JKU)   
+    END DO
+! 
+!     Read number of mass levels
+    READ(ILUPRE,*) ILEVELM
+!
+!     Allocate the required memory     
+    ALLOCATE(ZPRESSM(ILEVELM))          
+    ALLOCATE(ZHEIGHTM(ILEVELM))
+    ALLOCATE(ZTHV(ILEVELM))
+    ALLOCATE(ZMR(ILEVELM))
+    ALLOCATE(ZTHL(ILEVELM))
+    ALLOCATE(ZRT(ILEVELM))
+!   
+!     Read the data at each mass level of the RS   
+    DO JKM = 2,ILEVELM
+      READ(ILUPRE,*) ZPRESSM(JKM),ZTHV(JKM),ZMR(JKM)
+    END DO
+!
+!     Complete the mass arrays with the ground informations read in EXPRE file
+    ZPRESSM(1) = ZPGROUND
+    ZTHV(1)    = ZTHVGROUND
+    ZMR(1)     = ZMRGROUND 
+!
+!     Compute height of the mass levels of the RS
+    ZHEIGHTM(:) = HEIGHT_PRESS(ZPRESSM,ZTHV,ZPGROUND,ZTHV(1),ZZGROUND) 
+!                                                                 
+!     Compute thetav and heigth at the wind levels of the RS 
+    ZTHVU(:) = THETAVPU_THETAVPM(ZPRESSM,ZPRESSU,ZTHV)         
+    ZHEIGHTU(:) = HEIGHT_PRESS(ZPRESSU,ZTHVU,ZPGROUND,ZTHV(1),ZZGROUND)
+!
+! on interpole thetal(=theta quand il n'y a pas d'eau liquide) et r total
+    ZRT(:)=ZMR(:)
+    ZTHL(:)=ZTHV(:)*(1+ZRT(:))/(1+ZRVSRD*ZRT(:))
+!
+!*       2.3  PUVTHVHU case :  zGROUND, PGROUND, ThvGROUND, HuGROUND
+!                               (Pressure, U, V) , 
+!                               (Pressure, THv, Hu)
+!
+  CASE ('PUVTHVHU')
+! 
+!     Read data at ground level      
+    READ(ILUPRE,*) ZZGROUND                
+    READ(ILUPRE,*) ZPGROUND
+    READ(ILUPRE,*) ZTHVGROUND
+    READ(ILUPRE,*) ZHUGROUND
+!
+!     Read number of wind levels
+    READ(ILUPRE,*) ILEVELU
+!
+!     Allocate the required memory     
+    ALLOCATE(ZPRESSU(ILEVELU))             
+    ALLOCATE(ZU(ILEVELU),ZV(ILEVELU))
+    ALLOCATE(ZHEIGHTU(ILEVELU))            
+    ALLOCATE(ZTHVU(ILEVELU))               
+!                                           
+!     Read the data at each wind level of the RS   
+    DO JKU =1,ILEVELU
+      READ(ILUPRE,*) ZPRESSU(JKU),ZU(JKU),ZV(JKU)   
+    END DO
+! 
+!     Read number of mass levels
+    READ(ILUPRE,*) ILEVELM
+!
+!     Allocate the required memory  
+    ALLOCATE(ZPRESSM(ILEVELM))           
+    ALLOCATE(ZTHV(ILEVELM))
+    ALLOCATE(ZHU(ILEVELM))
+    ALLOCATE(ZHEIGHTM(ILEVELM))          
+    ALLOCATE(ZMR(ILEVELM))
+    ALLOCATE(ZTV(ILEVELM))     
+    ALLOCATE(ZTHL(ILEVELM))
+    ALLOCATE(ZRT(ILEVELM))
+!   
+!     Read the data at each mass level of the RS   
+    DO JKM = 2,ILEVELM
+      READ(ILUPRE,*) ZPRESSM(JKM),ZTHV(JKM),ZHU(JKM)
+    END DO
+!
+!     Complete the mass arrays with the ground informations read in EXPRE file
+    ZPRESSM(1) = ZPGROUND                    ! Mass level 1 is at the ground
+    ZTHV(1)    = ZTHVGROUND
+    ZHU(1)     = ZHUGROUND
+! 
+!     Compute Tv
+    ZTV(:)=ZTHV(:) * (ZPRESSM(:) / XP00) ** ZRDSCPD  
+!
+!     Compte mixing ratio      
+    ZMR(:)=SM_PMR_HU(ZPRESSM(:),ZTV(:),ZHU(:),SPREAD(ZMR(:),2,1))     
+!                                                          
+!     Compute height of the mass levels of the RS
+    ZHEIGHTM(:) = HEIGHT_PRESS(ZPRESSM,ZTHV,ZPGROUND,ZTHV(1),ZZGROUND)
+!                                                                 
+!     Compute thetav and height of the wind levels of the RS                                                                
+    ZTHVU(:) = THETAVPU_THETAVPM(ZPRESSM,ZPRESSU,ZTHV)   
+    ZHEIGHTU(:) = HEIGHT_PRESS(ZPRESSU,ZTHVU,ZPGROUND,ZTHV(1),ZZGROUND)
+! 
+! on interpole thetal(=theta quand il n'y a pas d'eau liquide) et r total
+    ZRT(:)=ZMR(:)
+    ZTHL(:)=ZTHV(:)*(1+ZRT(:))/(1+ZRVSRD*ZRT(:))
+!
+!*       2.4  ZUVTHVHU case :  zGROUND, PGROUND, ThvGROUND, HuGROUND
+!                               (height, U, V) , 
+!                               (height, THv, Hu)
+!
+  CASE ('ZUVTHVHU')
+!     Read data at ground level      
+    READ(ILUPRE,*) ZZGROUND                
+    READ(ILUPRE,*) ZPGROUND
+    READ(ILUPRE,*) ZTHVGROUND
+    READ(ILUPRE,*) ZHUGROUND
+!
+!     Read number of wind levels
+    READ(ILUPRE,*) ILEVELU
+!
+!     Allocate the required memory 
+    ALLOCATE(ZPRESSU(ILEVELU))
+    ALLOCATE(ZHEIGHTU(ILEVELU))           
+    ALLOCATE(ZU(ILEVELU),ZV(ILEVELU))
+!
+!
+!     Read the data at each wind level of the RS   
+    DO JKU = 1,ILEVELU
+      READ(ILUPRE,*) ZHEIGHTU(JKU),ZU(JKU),ZV(JKU)  
+    END DO
+! 
+!     Read number of mass levels
+    READ(ILUPRE,*) ILEVELM
+!
+!     Allocate the required memory 
+    ALLOCATE(ZHEIGHTM(ILEVELM))          
+    ALLOCATE(ZTHV(ILEVELM))
+    ALLOCATE(ZHU(ILEVELM))
+    ALLOCATE(ZMR(ILEVELM))               
+    ALLOCATE(ZPRESSM(ILEVELM))           
+    ALLOCATE(ZTV(ILEVELM))
+    ALLOCATE(ZTHL(ILEVELM))
+    ALLOCATE(ZRT(ILEVELM))    
+!   
+!     Read the data at each mass level of the RS
+    DO JKM = 2,ILEVELM
+      READ(ILUPRE,*) ZHEIGHTM(JKM),ZTHV(JKM),ZHU(JKM)
+    END DO 
+!
+!     Complete the mass arrays with the ground informations read in EXPRE file
+    ZHEIGHTM(1) = ZZGROUND                   ! Mass level 1 is at the ground 
+    ZTHV(1)    = ZTHVGROUND
+    ZHU(1)     = ZHUGROUND
+!
+!     Compute Pressure at the mass levels of the RS
+    ZPRESSM= PRESS_HEIGHT(ZHEIGHTM,ZTHV,ZPGROUND,ZTHV(1),ZHEIGHTM(1)) 
+!                                                       
+!     Compute Tv and the mixing ratio at the mass levels of the RS
+    ZTV(:)=ZTHV(:) * (ZPRESSM(:) / XP00) ** ZRDSCPD   
+    ZMR(:)=SM_PMR_HU(ZPRESSM(:),ZTV(:),ZHU(:),SPREAD(ZMR(:),2,1)) 
+!
+! on interpole thetal(=theta quand il n'y a pas d'eau liquide) et r total
+    ZRT(:)=ZMR(:)
+    ZTHL(:)=ZTHV(:)*(1+ZRT(:))/(1+ZRVSRD*ZRT(:))
+!
+!
+!*       2.5  ZUVTHVMR case :  zGROUND, PGROUND, ThvGROUND, RGROUND
+!                               (height, U, V) , 
+!                               (height, THv, R)
+!
+!
+  CASE ('ZUVTHVMR')
+!     Read data at ground level      
+    READ(ILUPRE,*) ZZGROUND
+    READ(ILUPRE,*) ZPGROUND
+    READ(ILUPRE,*) ZTHVGROUND
+    READ(ILUPRE,*) ZMRGROUND
+!
+!     Read number of wind levels
+    READ(ILUPRE,*) ILEVELU
+!
+!     Allocate the required memory 
+    ALLOCATE(ZHEIGHTU(ILEVELU))         
+    ALLOCATE(ZU(ILEVELU),ZV(ILEVELU))
+!
+!     Read the data at each wind level of the RS
+    DO JKU = 1,ILEVELU
+      READ(ILUPRE,*) ZHEIGHTU(JKU),ZU(JKU),ZV(JKU)  
+    END DO
+! 
+!     Read number of mass levels
+    READ(ILUPRE,*) ILEVELM
+!
+!     Allocate the required memory 
+    ALLOCATE(ZHEIGHTM(ILEVELM))           
+    ALLOCATE(ZTHV(ILEVELM))
+    ALLOCATE(ZMR(ILEVELM))
+    ALLOCATE(ZTHL(ILEVELM))
+    ALLOCATE(ZRT(ILEVELM))    
+!
+!     Read the data at each mass level of the RS
+    DO JKM=2,ILEVELM    
+      READ(ILUPRE,*) ZHEIGHTM(JKM),ZTHV(JKM),ZMR(JKM) 
+    END DO
+!
+!     Complete the mass arrays with the ground informations read in EXPRE file
+    ZHEIGHTM(1)= ZZGROUND                      ! Mass level 1 is at the ground
+    ZTHV(1)    = ZTHVGROUND
+    ZMR(1)     = ZMRGROUND
+! on interpole thetal(=theta quand il n'y a pas d'eau liquide) et r total
+    ZRT(:)=ZMR(:)
+    ZTHL(:)=ZTHV(:)*(1+ZRT(:))/(1+ZRVSRD*ZRT(:))    
+!
+!
+!*       2.6  PUVTHDMR case : zGROUND, PGROUND, ThdGROUND, RGROUND
+!                               (Pressure, U, V) , 
+!                               (Pressure, THd, R)
+!
+  CASE ('PUVTHDMR')
+!     Read data at ground level      
+    READ(ILUPRE,*) ZZGROUND               
+    READ(ILUPRE,*) ZPGROUND
+    READ(ILUPRE,*) ZTHDGROUND
+    READ(ILUPRE,*) ZMRGROUND
+!
+!     Read number of wind levels
+    READ(ILUPRE,*) ILEVELU
+!
+!     Allocate the required memory 
+    ALLOCATE(ZPRESSU(ILEVELU))          
+    ALLOCATE(ZU(ILEVELU),ZV(ILEVELU))
+    ALLOCATE(ZTHVU(ILEVELU))
+    ALLOCATE(ZHEIGHTU(ILEVELU))         
+!
+!     Read the data at each wind level of the RS
+    DO JKU =1,ILEVELU    
+      READ(ILUPRE,*) ZPRESSU(JKU),ZU(JKU),ZV(JKU)
+    END DO
+!
+!     Read number of mass levels 
+    READ(ILUPRE,*) ILEVELM
+!
+!     Allocate the required memory 
+    ALLOCATE(ZPRESSM(ILEVELM))         
+    ALLOCATE(ZTHD(ILEVELM))
+    ALLOCATE(ZMR(ILEVELM))
+    ALLOCATE(ZMRC(ILEVELM))
+    ZMRC=0
+    ALLOCATE(ZMRI(ILEVELM))
+    ZMRI=0
+    ALLOCATE(ZHEIGHTM(ILEVELM))        
+    ALLOCATE(ZTHV(ILEVELM))
+    ALLOCATE(ZTHL(ILEVELM))
+    ALLOCATE(ZRT(ILEVELM))     
+!
+!     Read the data at each mass level of the RS
+    DO JKM=2,ILEVELM
+      IF(LUSERI) THEN
+        READ(ILUPRE,*) ZPRESSM(JKM),ZTHD(JKM),ZMR(JKM),ZMRC(JKM),ZMRI(JKM)
+      ELSEIF (GUSERC) THEN
+        READ(ILUPRE,*) ZPRESSM(JKM),ZTHD(JKM),ZMR(JKM),ZMRC(JKM)
+      ELSE
+        READ(ILUPRE,*) ZPRESSM(JKM),ZTHD(JKM),ZMR(JKM)
+      ENDIF
+    END DO
+!
+!     Complete the mass arrays with the ground informations read in EXPRE file
+    ZPRESSM(1) = ZPGROUND                     ! Mass level 1 is at  the ground
+    ZTHD(1)    = ZTHDGROUND
+    ZMR(1)     = ZMRGROUND 
+    IF(GUSERC) ZMRC(1) = ZMRC(2)
+    IF(LUSERI) ZMRI(1) = ZMRI(2)
+!
+!     Compute thetav at the mass levels of the RS
+      ZTHV(:) = ZTHD(:) * (1. + ZRVSRD *ZMR(:))/(1.+ZMR(:)+ZMRC(:)+ZMRI(:))
+!
+!     Compute the heights at the mass levels of the RS
+    ZHEIGHTM(:) = HEIGHT_PRESS(ZPRESSM,ZTHV,ZPGROUND,ZTHV(1),ZZGROUND)
+!
+!     Compute thetav and heights of the wind levels
+    ZTHVU(:) = THETAVPU_THETAVPM(ZPRESSM,ZPRESSU,ZTHV)   
+    ZHEIGHTU(:) = HEIGHT_PRESS(ZPRESSU,ZTHVU,ZPGROUND,ZTHV(1),ZZGROUND)
+!
+!    Compute Theta l and Rt  
+    IF (.NOT. GUSERC  .AND. .NOT. LUSERI) THEN
+      ZRT(:)=ZMR(:)
+      ZTHL(:)=ZTHV(:)*(1+ZRT(:))/(1+ZRVSRD*ZRT(:))   
+    ELSE
+       ALLOCATE(ZEXN(ILEVELM))         
+       ALLOCATE(ZT(ILEVELM))       
+       ALLOCATE(ZCPH(ILEVELM))        
+       ALLOCATE(ZLVOCPEXN(ILEVELM))        
+       ALLOCATE(ZLSOCPEXN(ILEVELM))               
+       ZRT(:)=ZMR(:)+ZMRI(:)+ZMRC(:)
+       ZEXN(:)=(ZPRESSM/XP00) ** (XRD/XCPD)
+       ZT(:)=ZTHV*(ZPRESSM(:)/XP00)**(ZRDSCPD)*(1+ZRT(:))/(1+ZRVSRD*ZRT(:))
+       ZCPH(:)=XCPD+ XCPV * ZMR(:)+ XCL *ZMRC(:)  + XCI * ZMRI(:)
+       ZLVOCPEXN(:) = (XLVTT + (XCPV-XCL) * (ZT(:)-XTT))/(ZCPH*ZEXN(:))
+       ZLSOCPEXN(:) = (XLSTT + (XCPV-XCI) * (ZT(:)-XTT))/(ZCPH*ZEXN(:))
+       ZTHL(:)=ZTHV(:)*(1+ZRT(:))/(1+ZRVSRD*ZRT(:))-ZLVOCPEXN(:)*ZMRC(:)-ZLSOCPEXN(:)*ZMRI(:)
+       DEALLOCATE(ZEXN)         
+       DEALLOCATE(ZT)       
+       DEALLOCATE(ZCPH)        
+       DEALLOCATE(ZLVOCPEXN)        
+       DEALLOCATE(ZLSOCPEXN)
+    ENDIF   
+!
+!
+!*       2.7  PUVTHDHU case :  zGROUND, PGROUND, ThdGROUND, HuGROUND
+!                               (Pressure, U, V) , 
+!                               (Pressure, THd, Hu)
+!
+  CASE ('PUVTHDHU')
+!     Read data at ground level      
+    READ(ILUPRE,*) ZZGROUND              
+    READ(ILUPRE,*) ZPGROUND
+    READ(ILUPRE,*) ZTHDGROUND
+    READ(ILUPRE,*) ZHUGROUND
+!
+!     Read number of wind levels  
+    READ(ILUPRE,*) ILEVELU
+!
+!     Allocate the required memory
+    ALLOCATE(ZPRESSU(ILEVELU))         
+    ALLOCATE(ZU(ILEVELU),ZV(ILEVELU))
+    ALLOCATE(ZTHVU(ILEVELU))
+    ALLOCATE(ZHEIGHTU(ILEVELU))        
+!
+!     Read the data at each wind level of the RS
+    DO JKU = 1,ILEVELU
+      READ(ILUPRE,*) ZPRESSU(JKU),ZU(JKU),ZV(JKU)
+    END DO
+!
+!     Read number of mass levels 
+    READ(ILUPRE,*) ILEVELM
+!
+! Allocate the required memory
+    ALLOCATE(ZPRESSM(ILEVELM))          
+    ALLOCATE(ZTHD(ILEVELM))
+    ALLOCATE(ZHU(ILEVELM))
+    ALLOCATE(ZHEIGHTM(ILEVELM))          
+    ALLOCATE(ZTHV(ILEVELM))
+    ALLOCATE(ZMR(ILEVELM))
+    ALLOCATE(ZT(ILEVELM)) 
+    ALLOCATE(ZTHL(ILEVELM))
+    ALLOCATE(ZRT(ILEVELM))                                          
+!   
+!     Read the data at each mass level of the RS
+    DO JKM =2,ILEVELM
+      READ(ILUPRE,*) ZPRESSM(JKM),ZTHD(JKM), ZHU(JKM)
+    END DO
+!     Complete the mass arrays with the ground informations read in EXPRE file
+    ZPRESSM(1) = ZPGROUND                     ! Mass level 1 is at the  ground
+    ZTHD(1)    = ZTHDGROUND
+    ZHU(1)     = ZHUGROUND
+! 
+    ZT(:) = ZTHD(:) * (ZPRESSM(:)/XP00)**ZRDSCPD  ! compute T and mixing ratio
+    ZMR(:) = ZRDSRV*SM_FOES(ZT(:))/((ZPRESSM(:)*100./ZHU(:)) -SM_FOES(ZT(:)))
+                         
+!     Compute thetav at the mass levels of the RS
+    ZTHV(:) = ZTHD(:)  * (1. + ZRVSRD *ZMR(:))/(1.+ZMR(:)) 
+!
+!     Compute height at mass levels
+    ZHEIGHTM(:) = HEIGHT_PRESS(ZPRESSM,ZTHV,ZPGROUND,ZTHV(1),ZZGROUND) 
+!
+!     Compute thetav and heights of the wind levels 
+    ZTHVU(:) = THETAVPU_THETAVPM(ZPRESSM,ZPRESSU,ZTHV) 
+    ZHEIGHTU(:) = HEIGHT_PRESS(ZPRESSU,ZTHVU,ZPGROUND,ZTHV(1),ZZGROUND)   
+!
+!   Compute thetal and Rt
+    ZRT(:)=ZMR(:)
+    ZTHL(:)=ZTHV(:)*(1+ZRT(:))/(1+ZRVSRD*ZRT(:))      
+!
+!*       2.8  ZUVTHDMR case :  zGROUND, PGROUND, ThdGROUND, RGROUND
+!                               (height, U, V) , 
+!                               (height, THd, R)
+!
+  CASE ('ZUVTHDMR')
+! Read data at ground level
+    READ(ILUPRE,*) ZZGROUND                  
+    READ(ILUPRE,*) ZPGROUND
+    READ(ILUPRE,*) ZTHDGROUND
+    READ(ILUPRE,*) ZMRGROUND
+!
+!     Read number of wind levels  
+    READ(ILUPRE,*) ILEVELU
+!
+!   Allocate required memory 
+    ALLOCATE(ZHEIGHTU(ILEVELU))           
+    ALLOCATE(ZU(ILEVELU),ZV(ILEVELU))
+!
+!     Read the data at each wind level of the RS
+    DO JKU = 1,ILEVELU
+      READ(ILUPRE,*) ZHEIGHTU(JKU),ZU(JKU),ZV(JKU)
+    END DO
+! 
+!     Read number of mass levels  
+     READ(ILUPRE,*) ILEVELM
+!
+!   Allocate required memory 
+    ALLOCATE(ZHEIGHTM(ILEVELM))           
+    ALLOCATE(ZTHD(ILEVELM))
+    ALLOCATE(ZMR(ILEVELM))
+    ALLOCATE(ZTHV(ILEVELM)) 
+    ALLOCATE(ZMRC(ILEVELM))
+    ZMRC=0
+    ALLOCATE(ZMRI(ILEVELM))
+    ZMRI=0
+    ALLOCATE(ZTHL(ILEVELM))
+    ALLOCATE(ZRT(ILEVELM))
+!
+!     Read the data at each mass level of the RS
+    DO JKM= 2,ILEVELM
+      IF(LUSERI) THEN
+        READ(ILUPRE,*) ZHEIGHTM(JKM),ZTHD(JKM),ZMR(JKM),ZMRC(JKM),ZMRI(JKM)
+      ELSEIF (GUSERC) THEN
+        READ(ILUPRE,*) ZHEIGHTM(JKM),ZTHD(JKM),ZMR(JKM),ZMRC(JKM)
+      ELSE
+        READ(ILUPRE,*) ZHEIGHTM(JKM),ZTHD(JKM),ZMR(JKM)
+      ENDIF
+    END DO
+!     Complete the mass arrays with the ground informations read in EXPRE file
+    ZHEIGHTM(1) = ZZGROUND                     ! Mass level 1 is at ground
+    ZTHD(1)     = ZTHDGROUND
+    ZMR(1)      = ZMRGROUND
+    IF(GUSERC) ZMRC(1) = ZMRC(2)
+    IF(LUSERI) ZMRI(1) = ZMRI(2)
+!     Compute thetav at the mass levels of the RS
+    IF(LUSERI) THEN
+      ZTHV(:) = ZTHD(:) * (1. + ZRVSRD *ZMR(:))/(1.+ZMR(:)+ZMRC(:)+ZMRI(:))
+    ELSEIF (GUSERC) THEN
+      ZTHV(:) = ZTHD(:) * (1. + ZRVSRD *ZMR(:))/(1.+ZMR(:)+ZMRC(:))
+    ELSE
+      ZTHV(:) = ZTHD(:) * (1. + ZRVSRD *ZMR(:))/(1.+ZMR(:))
+    ENDIF    
+!    
+!    Compute Theta l and Rt  
+    IF (.NOT. GUSERC  .AND. .NOT. LUSERI) THEN
+      ZRT(:)=ZMR(:)
+      ZTHL(:)=ZTHV(:)*(1+ZRT(:))/(1+ZRVSRD*ZRT(:))   
+    ELSE
+       ALLOCATE(ZEXN(ILEVELM))  
+       ALLOCATE(ZEXNFLUX(ILEVELM))        
+       ALLOCATE(ZT(ILEVELM))       
+       ALLOCATE(ZCPH(ILEVELM))        
+       ALLOCATE(ZLVOCPEXN(ILEVELM))        
+       ALLOCATE(ZLSOCPEXN(ILEVELM))  
+       ZRT(:)=ZMR(:)+ZMRI(:)+ZMRC(:)
+       ZEXNSURF=(ZPGROUND/XP00) ** (XRD/XCPD)
+       CALL COMPUTE_EXNER_FROM_GROUND(ZTHV,ZHEIGHTM,ZEXNSURF,ZEXNFLUX,ZEXN)
+       ZT(:)=ZTHV*ZEXN(:)*(1+ZRT(:))/(1+ZRVSRD*ZRT(:))
+       ZCPH(:)=XCPD+ XCPV * ZMR(:)+ XCL *ZMRC(:)  + XCI * ZMRI(:)
+       ZLVOCPEXN(:) = (XLVTT + (XCPV-XCL) * (ZT(:)-XTT))/(ZCPH*ZEXN(:))
+       ZLSOCPEXN(:) = (XLSTT + (XCPV-XCI) * (ZT(:)-XTT))/(ZCPH*ZEXN(:))
+       ZTHL(:)=ZTHV(:)*(1+ZRT(:))/(1+ZRVSRD*ZRT(:))-ZLVOCPEXN(:)*ZMRC(:)-ZLSOCPEXN(:)*ZMRI(:)
+       DEALLOCATE(ZEXN)         
+       DEALLOCATE(ZEXNFLUX)         
+       DEALLOCATE(ZT)       
+       DEALLOCATE(ZCPH)        
+       DEALLOCATE(ZLVOCPEXN)        
+       DEALLOCATE(ZLSOCPEXN)
+    ENDIF  
+!
+! 2.9 ZUVTHLMR case : zGROUND, PGROUND, ThdGROUND, RGROUND
+!                               (height, U, V)
+!                               (height, THL, Rt)
+
+!
+  CASE ('ZUVTHLMR')
+! Read data at ground level
+    READ(ILUPRE,*) ZZGROUND                  
+    READ(ILUPRE,*) ZPGROUND
+    READ(ILUPRE,*) ZTHLGROUND
+    READ(ILUPRE,*) ZMRGROUND
+!
+!   Read number of wind levels  
+    READ(ILUPRE,*) ILEVELU
+!
+!   Allocate required memory 
+    ALLOCATE(ZHEIGHTU(ILEVELU))           
+    ALLOCATE(ZU(ILEVELU),ZV(ILEVELU))
+!
+!   Read the data at each wind level of the RS
+    DO JKU = 1,ILEVELU
+      READ(ILUPRE,*) ZHEIGHTU(JKU),ZU(JKU),ZV(JKU)
+    END DO
+! 
+!   Read number of mass levels  
+    READ(ILUPRE,*) ILEVELM
+!
+!   Allocate required memory 
+    ALLOCATE(ZHEIGHTM(ILEVELM))           
+    ALLOCATE(ZTHL(ILEVELM))
+    ALLOCATE(ZTH(ILEVELM))
+    ALLOCATE(ZMR(ILEVELM))
+    ALLOCATE(ZTHV(ILEVELM)) 
+    ALLOCATE(ZMRC(ILEVELM))
+    ZMRC=0
+    ALLOCATE(ZMRI(ILEVELM))
+    ZMRI=0    
+    ALLOCATE(ZRT(ILEVELM))
+!
+!   Read the data at each mass level of the RS
+    DO JKM= 2,ILEVELM
+!     IF(LUSERI) THEN
+!       READ(ILUPRE,*) ZHEIGHTM(JKM),ZTHL(JKM),ZMR(JKM),ZMRC(JKM),ZMRI(JKM)
+!     ELSEIF (GUSERC) THEN
+      IF (GUSERC) THEN
+        READ(ILUPRE,*) ZHEIGHTM(JKM),ZTHL(JKM),ZMR(JKM),ZMRC(JKM)
+      ELSE
+        READ(ILUPRE,*) ZHEIGHTM(JKM),ZTHL(JKM),ZMR(JKM)
+      ENDIF
+    END DO
+!   Complete the mass arrays with the ground informations read in EXPRE file
+    ZHEIGHTM(1) = ZZGROUND                     ! Mass level 1 is at ground
+    ZTHL(1)     = ZTHLGROUND
+    ZMR(1)      = ZMRGROUND
+    IF(GUSERC) ZMRC(1) = ZMRC(2)
+!   IF(LUSERI) ZMRI(1) = ZMRI(2)
+!
+!   Compute Rt
+    ZRT(:)=ZMR+ZMRC+ZMRI
+!
+!*       2.10  PUVTHU case :  zGROUND, PGROUND, TempGROUND, HuGROUND
+!                               (Pressure, U, V) , 
+!                               (Pressure, Temp, Hu)
+!
+  CASE ('PUVTHU')
+!     Read data at ground level      
+    READ(ILUPRE,*) ZZGROUND              
+    READ(ILUPRE,*) ZPGROUND
+    READ(ILUPRE,*) ZTGROUND
+    READ(ILUPRE,*) ZHUGROUND
+!
+!     Read number of wind levels  
+    READ(ILUPRE,*) ILEVELU
+!
+!     Allocate the required memory
+    ALLOCATE(ZPRESSU(ILEVELU))         
+    ALLOCATE(ZU(ILEVELU),ZV(ILEVELU))
+    ALLOCATE(ZTHVU(ILEVELU))
+    ALLOCATE(ZHEIGHTU(ILEVELU))        
+!
+!     Read the data at each wind level of the RS
+    DO JKU = 1,ILEVELU
+      READ(ILUPRE,*) ZPRESSU(JKU),ZU(JKU),ZV(JKU)
+    END DO
+!
+!     Read number of mass levels 
+    READ(ILUPRE,*) ILEVELM
+!
+! Allocate the required memory
+    ALLOCATE(ZPRESSM(ILEVELM))          
+    ALLOCATE(ZTHD(ILEVELM))
+    ALLOCATE(ZHU(ILEVELM))
+    ALLOCATE(ZHEIGHTM(ILEVELM))          
+    ALLOCATE(ZTHV(ILEVELM))
+    ALLOCATE(ZMR(ILEVELM))
+    ALLOCATE(ZT(ILEVELM))  
+    ALLOCATE(ZTHL(ILEVELM))
+    ALLOCATE(ZRT(ILEVELM))
+
+!   
+!     Read the data at each mass level of the RS
+    DO JKM =2,ILEVELM
+      READ(ILUPRE,*) ZPRESSM(JKM),ZT(JKM), ZHU(JKM)
+    END DO
+!     Complete the mass arrays with the ground informations read in EXPRE file
+    ZPRESSM(1) = ZPGROUND                     ! Mass level 1 is at the  ground
+    ZT(1)    = ZTGROUND
+    ZHU(1)     = ZHUGROUND
+! 
+    ZTHD(:) = ZT(:) / (ZPRESSM(:)/XP00)**ZRDSCPD  ! compute THD and mixing ratio
+    ZMR(:) = ZRDSRV*SM_FOES(ZT(:))/((ZPRESSM(:)*100./ZHU(:)) -SM_FOES(ZT(:)))
+!     Compute thetav at the mass levels of the RS
+    ZTHV(:) = ZTHD(:)  * (1. + ZRVSRD *ZMR(:))/(1.+ZMR(:)) 
+!
+!     Compute height at mass levels
+    ZHEIGHTM(:) = HEIGHT_PRESS(ZPRESSM,ZTHV,ZPGROUND,ZTHV(1),ZZGROUND) 
+!
+!     Compute thetav and heights of the wind levels 
+    ZTHVU(:) = THETAVPU_THETAVPM(ZPRESSM,ZPRESSU,ZTHV) 
+    ZHEIGHTU(:) = HEIGHT_PRESS(ZPRESSU,ZTHVU,ZPGROUND,ZTHV(1),ZZGROUND)   
+!
+! on interpole thetal(=theta quand il n'y a pas d'eau liquide) et r total
+     ZRT(:)=ZMR(:)
+     ZTHL(:)=ZTHV(:)*(1+ZRT(:))/(1+ZRVSRD*ZRT(:))
+  CASE DEFAULT
+    CALL PRINT_MSG(NVERB_FATAL,'GEN','SET_RSOU','data type YKIND='//TRIM(YKIND)//' in PREFILE unknown')
+END SELECT
+!
+!-------------------------------------------------------------------------------
+!
+!*	 3.     INTERPOLATE ON THE  VERTICAL MIXED MODEL GRID 
+!	        ---------------------------------------------------------
+!
+!
+! 
+IKU=SIZE(XZHAT)
+!
+!*       3.1    Compute mixed grid
+! 
+IF (PRESENT(PCORIOZ)) THEN 
+! LGEOSBAL=T (no shift allowed, MNH grid without ororgraphy)
+  ZZS_LS(:,:)=0
+ELSE
+  IF (OSHIFT) THEN
+    ZZS_LS(:,:)=ZZGROUND
+  ELSE
+    ZZS_LS(:,:)=0
+  ENDIF
+ENDIF
+CALL VERT_COORD(LSLEVE,ZZS_LS,ZZS_LS,XLEN1,XLEN2,XZHAT,ZZFLUX_MX)
+ZZMASS_MX(:,:,:)=MZF(ZZFLUX_MX)
+ZZMASS_MX(:,:,IKU)=1.5*ZZFLUX_MX(:,:,IKU)-0.5*ZZFLUX_MX(:,:,IKU-1)
+!
+!*        3.2  Interpolate and extrapolate U and V on w- mixed grid levels
+!
+!* vertical grid at initialization profile location
+GPROFILE_IN_PROC=(KILOC+JPHEXT-IXOR_ll+1>=IIB .AND. KILOC+JPHEXT-IXOR_ll+1<=IIE) &
+         & .AND. (KJLOC+JPHEXT-IYOR_ll+1>=IJB .AND. KJLOC+JPHEXT-IYOR_ll+1<=IJE)
+!
+IF (GPROFILE_IN_PROC) THEN
+  ZZMASS_PROFILE(:) = ZZMASS_MX(KILOC+JPHEXT-IXOR_ll+1,KJLOC+JPHEXT-IYOR_ll+1,:)
+  ZZFLUX_PROFILE(:) = ZZFLUX_MX(KILOC+JPHEXT-IXOR_ll+1,KJLOC+JPHEXT-IYOR_ll+1,:)
+ELSE
+  ZZMASS_PROFILE(:) = 0.
+  ZZFLUX_PROFILE(:) = 0.
+END IF
+DO JK = 1,IKU
+  CALL REDUCESUM_ll(ZZMASS_PROFILE(JK), IINFO_ll)
+  CALL REDUCESUM_ll(ZZFLUX_PROFILE(JK), IINFO_ll)
+END DO
+
+! interpolation of U and V
+DO JK = 1,IKU
+  IF (ZZFLUX_PROFILE(JK) <= ZHEIGHTU(1)) THEN      ! extrapolation below the first level
+          ZDZSDH  = (ZZFLUX_PROFILE(JK) - ZHEIGHTU(1)) / (ZHEIGHTU(2) - ZHEIGHTU(1))
+          ZUW(JK) = ZU(1) + (ZU(2) - ZU(1)) * ZDZSDH
+          ZVW(JK) = ZV(1) + (ZV(2) - ZV(1)) * ZDZSDH 
+  ELSE IF (ZZFLUX_PROFILE(JK) > ZHEIGHTU(ILEVELU) ) THEN  ! extrapolation above the last
+    ZDZSDH  = (ZZFLUX_PROFILE(JK) - ZHEIGHTU(ILEVELU))                   &   ! level
+            / (ZHEIGHTU(ILEVELU) - ZHEIGHTU(ILEVELU-1))
+    ZUW(JK) = ZU(ILEVELU) + (ZU(ILEVELU) -ZU(ILEVELU -1)) * ZDZSDH
+    ZVW(JK) = ZV(ILEVELU) + (ZV(ILEVELU) -ZV(ILEVELU -1)) * ZDZSDH
+  ELSE                       ! interpolation between the first and last levels
+    DO JKLEV = 1,ILEVELU-1
+      IF ( (ZZFLUX_PROFILE(JK) > ZHEIGHTU(JKLEV)).AND.                  &
+           (ZZFLUX_PROFILE(JK) <= ZHEIGHTU(JKLEV+1)) )THEN 
+        ZDZ1SDH = (ZZFLUX_PROFILE(JK) - ZHEIGHTU(JKLEV))                &
+              / (ZHEIGHTU(JKLEV+1)-ZHEIGHTU(JKLEV)) 
+        ZDZ2SDH = (ZHEIGHTU(JKLEV+1) - ZZFLUX_PROFILE(JK) )             &
+              / (ZHEIGHTU(JKLEV+1)-ZHEIGHTU(JKLEV)) 
+        ZUW(JK) = (ZU(JKLEV) * ZDZ2SDH) + (ZU(JKLEV+1) *ZDZ1SDH)
+        ZVW(JK) = (ZV(JKLEV) * ZDZ2SDH) + (ZV(JKLEV+1) *ZDZ1SDH)
+      END IF        
+    END DO
+  END IF
+END DO
+!
+!*       3.3    Interpolate and extrapolate Thetav and r on  mass mixed grid levels
+!
+ZMRCM=0
+ZMRIM=0
+DO JK = 1,IKU
+  IF (ZZMASS_PROFILE(JK) <= ZHEIGHTM(1)) THEN    ! extrapolation below the first level
+    ZDZSDH  = (ZZMASS_PROFILE(JK) - ZHEIGHTM(1)) / (ZHEIGHTM(2) - ZHEIGHTM(1))
+    ZTHLM(JK) = ZTHL(1) + (ZTHL(2) - ZTHL(1)) * ZDZSDH
+    ZMRM(JK)  = ZRT(1) + (ZRT(2) - ZRT(1)) * ZDZSDH 
+    IF (GUSERC) ZMRCM(JK)  = ZMRC(1) + (ZMRC(2) - ZMRC(1)) * ZDZSDH 
+    IF (LUSERI) ZMRIM(JK)  = ZMRI(1) + (ZMRI(2) - ZMRI(1)) * ZDZSDH 
+  ELSE IF (ZZMASS_PROFILE(JK) > ZHEIGHTM(ILEVELM) ) THEN  ! extrapolation above the last
+    ZDZSDH  = (ZZMASS_PROFILE(JK) - ZHEIGHTM(ILEVELM))                   &  ! level
+            / (ZHEIGHTM(ILEVELM) - ZHEIGHTM(ILEVELM-1))
+    ZTHLM(JK) = ZTHL(ILEVELM) + (ZTHL(ILEVELM) -ZTHL(ILEVELM -1)) * ZDZSDH
+    ZMRM(JK) = ZRT(ILEVELM) + (ZRT(ILEVELM) -ZRT(ILEVELM -1)) * ZDZSDH
+    IF (GUSERC) ZMRCM(JK) = ZMRC(ILEVELM) + (ZMRC(ILEVELM) -ZMRC(ILEVELM -1)) * ZDZSDH
+    IF (LUSERI) ZMRIM(JK) = ZMRI(ILEVELM) + (ZMRI(ILEVELM) -ZMRI(ILEVELM -1)) * ZDZSDH
+  ELSE  ! interpolation between the first and last levels
+    DO JKLEV = 1,ILEVELM-1
+      IF ( (ZZMASS_PROFILE(JK) > ZHEIGHTM(JKLEV)).AND.                  &
+           (ZZMASS_PROFILE(JK) <= ZHEIGHTM(JKLEV+1)) )THEN 
+        ZDZ1SDH = (ZZMASS_PROFILE(JK) - ZHEIGHTM(JKLEV))                 &
+              / (ZHEIGHTM(JKLEV+1)-ZHEIGHTM(JKLEV)) 
+        ZDZ2SDH = (ZHEIGHTM(JKLEV+1) - ZZMASS_PROFILE(JK) )              &
+              / (ZHEIGHTM(JKLEV+1)-ZHEIGHTM(JKLEV)) 
+        ZTHLM(JK) = (ZTHL(JKLEV) * ZDZ2SDH) + (ZTHL(JKLEV+1) *ZDZ1SDH)
+        ZMRM(JK)  = (ZRT(JKLEV) * ZDZ2SDH) + (ZRT(JKLEV+1) *ZDZ1SDH)
+        IF (GUSERC) ZMRCM(JK)  = (ZMRC(JKLEV) * ZDZ2SDH) + (ZMRC(JKLEV+1) *ZDZ1SDH)
+        IF (LUSERI) ZMRIM(JK)  = (ZMRI(JKLEV) * ZDZ2SDH) + (ZMRI(JKLEV+1) *ZDZ1SDH)
+      END IF 
+    END DO
+  END IF
+END DO
+!
+! Compute thetaV rv ri and Rc with adjustement
+ALLOCATE(ZEXNFLUX(IKU))
+ALLOCATE(ZEXNMASS(IKU))
+ALLOCATE(ZPRESS(IKU))
+ALLOCATE(ZPREFLUX(IKU))
+ALLOCATE(ZFRAC_ICE(IKU))
+ALLOCATE(ZRSATW(IKU))
+ALLOCATE(ZRSATI(IKU))
+ALLOCATE(ZMRT(IKU))
+ALLOCATE(ZBUF(IKU,16))
+ZMRT=ZMRM+ZMRCM+ZMRIM
+ZTHVM=ZTHLM
+!
+IF (LOCEAN) THEN
+  ZRHODM(:)=XRH00OCEAN*(1.-XALPHAOC*(ZTHLM(:) - XTH00OCEAN)&
+          +XBETAOC* (ZMRM(:)  - XSA00OCEAN))
+  ZPREFLUX(IKU)=ZPTOP
+  DO JK=IKU-1,2,-1
+    ZPREFLUX(JK) = ZPREFLUX(JK+1) + XG*ZRHODM(JK)*(ZZFLUX_PROFILE(JK+1)-ZZFLUX_PROFILE(JK))
+  END DO
+  ZPGROUND=ZPREFLUX(2)
+  WRITE(ILUOUT,FMT=*)'ZPGROUND i.e. Pressure at ocean domain bottom',ZPGROUND
+  ZTHM=ZTHVM
+ELSE
+! Atmospheric case   
+  ZEXNSURF=(ZPGROUND/XP00)**(XRD/XCPD)
+  DO JLOOP=1,20 ! loop for pression 
+    CALL COMPUTE_EXNER_FROM_GROUND(ZTHVM,ZZMASS_PROFILE(:),ZEXNSURF,ZEXNFLUX,ZEXNMASS)
+    ZPRESS(:)=XP00*(ZEXNMASS(:))**(XCPD/XRD)
+    CALL TH_R_FROM_THL_RT(CST,NEBN,SIZE(ZPRESS,1),'T',ZFRAC_ICE,ZPRESS,ZTHLM,ZMRT,ZTHM,ZMRM,ZMRCM,ZMRIM, &
+                          ZRSATW, ZRSATI,OOCEAN=.FALSE.,&
+                          PBUF=ZBUF)
+     ZTHVM(:)=ZTHM(:)*(1.+XRV/XRD*ZMRM(:))/(1.+(ZMRM(:)+ZMRIM(:)+ZMRCM(:)))
+  ENDDO
+ENDIF
+!
+DEALLOCATE(ZEXNFLUX)
+DEALLOCATE(ZEXNMASS)
+DEALLOCATE(ZPRESS)
+DEALLOCATE(ZFRAC_ICE)
+DEALLOCATE(ZRSATW)
+DEALLOCATE(ZRSATI)       
+DEALLOCATE(ZMRT)
+DEALLOCATE(ZBUF)
+!-------------------------------------------------------------------------------
+!
+!* 4.     COMPUTE FIELDS ON THE MODEL GRID (WITH OROGRAPHY)
+!         -------------------------------------------------
+CALL SET_MASS(TPFILE,GPROFILE_IN_PROC, ZZFLUX_PROFILE,                      &
+              KILOC+JPHEXT,KJLOC+JPHEXT,ZZS_LS,ZZMASS_MX,ZZFLUX_MX,ZPGROUND,&
+              ZTHVM,ZMRM,ZUW,ZVW,OSHIFT,OBOUSS,PJ,HFUNU,HFUNV,              &
+              PMRCM=ZMRCM,PMRIM=ZMRIM,PCORIOZ=PCORIOZ)
+!
+DEALLOCATE(ZPREFLUX)
+DEALLOCATE(ZHEIGHTM)          
+DEALLOCATE(ZTHV)
+DEALLOCATE(ZMR)
+DEALLOCATE(ZTHL)
+!-------------------------------------------------------------------------------
+CONTAINS
+  SUBROUTINE CHECK( ISTATUS, YLOC )
+    INTEGER(KIND=CDFINT), INTENT(IN) :: ISTATUS
+    CHARACTER(LEN=*),     INTENT(IN) :: YLOC
+
+    IF( ISTATUS /= NF90_NOERR ) THEN
+      CALL PRINT_MSG( NVERB_ERROR, 'IO', 'SET_RSOU', 'error at ' // Trim( yloc) // ': ' // NF90_STRERROR( ISTATUS ) )
+    END IF
+  END SUBROUTINE check
+  !
+  INCLUDE "th_r_from_thl_rt.func.h"
+  INCLUDE "compute_frac_ice.func.h"
+  !
+END SUBROUTINE SET_RSOU
diff --git a/src/PHYEX/ext/shallow_mf_pack.f90 b/src/PHYEX/ext/shallow_mf_pack.f90
new file mode 100644
index 0000000000000000000000000000000000000000..1f76d9759fc4562c5ae5835d9bb994c750ea5f3a
--- /dev/null
+++ b/src/PHYEX/ext/shallow_mf_pack.f90
@@ -0,0 +1,381 @@
+!MNH_LIC Copyright 2010-2021 CNRS, Meteo-France and Universite Paul Sabatier
+!MNH_LIC This is part of the Meso-NH software governed by the CeCILL-C licence
+!MNH_LIC version 1. See LICENSE, CeCILL-C_V1-en.txt and CeCILL-C_V1-fr.txt
+!MNH_LIC for details. version 1.
+!-----------------------------------------------------------------
+!    ######################
+     MODULE MODI_SHALLOW_MF_PACK
+!    ######################
+!
+INTERFACE
+!     #################################################################
+      SUBROUTINE SHALLOW_MF_PACK(KRR,KRRL,KRRI,                       &
+                TPFILE,PTIME_LES,                                     &
+                PTSTEP,                                               &
+                PDZZ, PZZ, PDX,PDY,                                   &
+                PRHODJ, PRHODREF,                                     &
+                PPABSM, PEXN,                                         &
+                PSFTH,PSFRV,                                          &
+                PTHM,PRM,PUM,PVM,PTKEM,PSVM,                          &
+                PRTHS,PRRS,PRUS,PRVS,PRSVS,                           &
+                PSIGMF,PRC_MF,PRI_MF,PCF_MF,PFLXZTHVMF  )
+!     #################################################################
+!!
+use MODD_IO,        only: TFILEDATA
+use modd_precision, only: MNHTIME
+!
+!*               1.1  Declaration of Arguments
+!
+!
+INTEGER,                INTENT(IN)   :: KRR        ! number of moist var.
+INTEGER,                INTENT(IN)   :: KRRL       ! number of liquid water var.
+INTEGER,                INTENT(IN)   :: KRRI       ! number of ice water var.
+TYPE(TFILEDATA),        INTENT(IN)   :: TPFILE     ! Output file
+REAL(kind=MNHTIME),DIMENSION(2), INTENT(OUT)  :: PTIME_LES  ! time spent in LES computations
+REAL,                   INTENT(IN)   :: PTSTEP     ! Dynamical timestep 
+
+REAL, DIMENSION(:,:,:), INTENT(IN) ::  PZZ         ! Height of flux point
+REAL, DIMENSION(:,:,:), INTENT(IN) ::  PDZZ        ! Metric coefficients
+REAL, DIMENSION(:,:,:), INTENT(IN) ::  PRHODJ      ! dry density * Grid size
+REAL, DIMENSION(:,:,:), INTENT(IN) ::  PRHODREF    ! dry density of the
+                                                     ! reference state
+REAL, DIMENSION(:,:,:), INTENT(IN) ::  PPABSM      ! Pressure at time t-1
+REAL, DIMENSION(:,:,:), INTENT(IN) ::  PEXN        ! Exner function at t-dt
+
+REAL, DIMENSION(:,:),   INTENT(IN) ::  PSFTH,PSFRV ! normal surface fluxes of theta and Rv 
+REAL, DIMENSION(:,:,:), INTENT(IN) ::  PTHM        ! Theta at t-dt
+REAL, DIMENSION(:,:,:,:),INTENT(IN)::  PRM         ! water var. at t-dt
+REAL, DIMENSION(:,:,:), INTENT(IN) ::  PUM,PVM     ! wind components at t-dt
+REAL, DIMENSION(:,:,:), INTENT(IN) ::  PTKEM       ! tke at t-dt
+
+REAL, DIMENSION(:,:,:,:), INTENT(IN) ::  PSVM      ! scalar variable a t-dt
+
+REAL, DIMENSION(:,:,:),   INTENT(INOUT) ::  PRUS,PRVS,PRTHS ! Meso-NH sources
+REAL, DIMENSION(:,:,:,:), INTENT(INOUT) ::  PRRS 
+REAL, DIMENSION(:,:,:,:), INTENT(INOUT) ::  PRSVS            ! Scalar sources 
+REAL, DIMENSION(:,:,:), INTENT(OUT)     ::  PSIGMF,PRC_MF,PRI_MF,PCF_MF ! cloud info for the cloud scheme
+REAL, DIMENSION(:,:,:), INTENT(OUT)     ::  PFLXZTHVMF           ! Thermal production for TKE scheme
+!
+REAL, INTENT(IN) :: PDX,PDY ! Size of mesh in X/Y directions
+END SUBROUTINE SHALLOW_MF_PACK
+
+END INTERFACE
+!
+END MODULE MODI_SHALLOW_MF_PACK
+
+!     #################################################################
+      SUBROUTINE SHALLOW_MF_PACK(KRR,KRRL,KRRI,                       &
+                TPFILE,PTIME_LES,                                     &
+                PTSTEP,                                               &
+                PDZZ, PZZ, PDX,PDY,                                   &
+                PRHODJ, PRHODREF,                                     &
+                PPABSM, PEXN,                                         &
+                PSFTH,PSFRV,                                          &
+                PTHM,PRM,PUM,PVM,PTKEM,PSVM,                          &
+                PRTHS,PRRS,PRUS,PRVS,PRSVS,                           &
+                PSIGMF,PRC_MF,PRI_MF,PCF_MF,PFLXZTHVMF  )
+!     #################################################################
+!!
+!!****  *SHALLOW_MF_PACK* - 
+!!       
+!!
+!!    PURPOSE
+!!    -------
+!!****  The purpose of this routine is
+!!
+!
+!!**  METHOD
+!!    ------
+!!
+!!    EXTERNAL
+!!    --------
+!!      
+!!    IMPLICIT ARGUMENTS
+!!    ------------------
+!!
+!!     REFERENCE
+!!     ---------
+!!
+!!
+!!     AUTHOR
+!!     ------
+!!      V.Masson 09/2010
+! --------------------------------------------------------------------------
+! Modifications:
+!  R. Honnert     07/2012: introduction of vertical wind for the height of the thermal
+!  M. Leriche     02/2017: avoid negative values for sv tendencies
+!  P. Wautelet 05/2016-04/2018: new data structures and calls for I/O
+!  S. Riette      11/2016: support for CFRAC_ICE_SHALLOW_MF
+!  P. Wautelet 28/03/2019: use MNHTIME for time measurement variables
+!  P. Wautelet    02/2020: use the new data structures and subroutines for budgets
+! --------------------------------------------------------------------------
+!
+!*      0. DECLARATIONS
+!          ------------
+!
+USE MODD_CST, ONLY: CST
+USE MODD_NEB_n, ONLY: NEBN
+USE MODD_TURB_n, ONLY: TURBN
+USE MODD_CTURB,  ONLY: CSTURB
+USE MODD_PARAM_MFSHALL_n, ONLY: PARAM_MFSHALLN, LMF_FLX
+USE MODD_DIMPHYEX,   ONLY: DIMPHYEX_t
+!
+USE MODE_FILL_DIMPHYEX, ONLY: FILL_DIMPHYEX
+!
+USE MODD_BUDGET,          ONLY: TBUDGETS,TBUCONF,lbudget_th,nbudget_th
+USE MODD_CONF
+USE MODD_IO,              ONLY: TFILEDATA
+use modd_field,           ONLY: tfieldmetadata, TYPEREAL
+USE MODD_NSV,             ONLY: XSVMIN, NSV_LGBEG, NSV_LGEND
+USE MODD_PARAMETERS
+USE MODD_PARAM_MFSHALL_n
+USE modd_precision,       ONLY: MNHTIME
+
+USE mode_budget,          ONLY: Budget_store_init, Budget_store_end, Budget_store_add
+USE MODE_IO_FIELD_WRITE,  ONLY: IO_Field_write
+
+USE MODI_DIAGNOS_LES_MF
+USE MODI_SHALLOW_MF
+USE MODI_SHUMAN
+!
+IMPLICIT NONE
+
+!*                    0.1  Declaration of Arguments
+!
+!
+!
+INTEGER,                INTENT(IN)   :: KRR        ! number of moist var.
+INTEGER,                INTENT(IN)   :: KRRL       ! number of liquid water var.
+INTEGER,                INTENT(IN)   :: KRRI       ! number of ice water var.
+TYPE(TFILEDATA),        INTENT(IN)   :: TPFILE     ! Output file
+REAL(kind=MNHTIME),DIMENSION(2), INTENT(OUT)  :: PTIME_LES  ! time spent in LES computations
+REAL,                   INTENT(IN)   :: PTSTEP     ! Dynamical timestep 
+
+REAL, DIMENSION(:,:,:), INTENT(IN) ::  PZZ         ! Height of flux point
+REAL, DIMENSION(:,:,:), INTENT(IN) ::  PDZZ        ! Metric coefficients
+REAL, DIMENSION(:,:,:), INTENT(IN) ::  PRHODJ      ! dry density * Grid size
+REAL, DIMENSION(:,:,:), INTENT(IN) ::  PRHODREF    ! dry density of the
+                                                     ! reference state
+REAL, DIMENSION(:,:,:), INTENT(IN) ::  PPABSM      ! Pressure at time t-1
+REAL, DIMENSION(:,:,:), INTENT(IN) ::  PEXN        ! Exner function at t-dt
+
+REAL, DIMENSION(:,:),   INTENT(IN) ::  PSFTH,PSFRV ! normal surface fluxes of theta and Rv 
+REAL, DIMENSION(:,:,:), INTENT(IN) ::  PTHM        ! Theta at t-dt
+REAL, DIMENSION(:,:,:,:),INTENT(IN)::  PRM         ! water var. at t-dt
+REAL, DIMENSION(:,:,:), INTENT(IN) ::  PUM,PVM     ! wind components at t-dt
+REAL, DIMENSION(:,:,:), INTENT(IN) ::  PTKEM       ! tke at t-dt
+
+REAL, DIMENSION(:,:,:,:), INTENT(IN) ::  PSVM        ! scalar variable a t-dt
+
+REAL, DIMENSION(:,:,:),   INTENT(INOUT) ::  PRUS,PRVS,PRTHS ! Meso-NH sources
+REAL, DIMENSION(:,:,:,:), INTENT(INOUT) ::  PRRS 
+REAL, DIMENSION(:,:,:,:), INTENT(INOUT) ::  PRSVS            ! Scalar sources 
+REAL, DIMENSION(:,:,:), INTENT(OUT)     ::  PSIGMF,PRC_MF,PRI_MF,PCF_MF ! cloud info for the cloud scheme
+REAL, DIMENSION(:,:,:), INTENT(OUT)     ::  PFLXZTHVMF           ! Thermal production for TKE scheme
+!
+REAL, INTENT(IN) :: PDX,PDY ! Size of mesh in X/Y directions
+!
+!                     0.2  Declaration of local variables
+!
+REAL, DIMENSION(SIZE(PTHM,1),SIZE(PTHM,2),SIZE(PTHM,3)) ::  ZDUDT_TURB   ! tendency of U   by turbulence only
+REAL, DIMENSION(SIZE(PTHM,1),SIZE(PTHM,2),SIZE(PTHM,3)) ::  ZDVDT_TURB   ! tendency of V   by turbulence only
+REAL, DIMENSION(SIZE(PTHM,1),SIZE(PTHM,2),SIZE(PTHM,3)) ::  ZDTHLDT_TURB ! tendency of thl by turbulence only
+REAL, DIMENSION(SIZE(PTHM,1),SIZE(PTHM,2),SIZE(PTHM,3)) ::  ZDRTDT_TURB  ! tendency of rt  by turbulence only
+REAL, DIMENSION(SIZE(PTHM,1),SIZE(PTHM,2),SIZE(PTHM,3),SIZE(PSVM,4)) ::  ZDSVDT_TURB  ! tendency of Sv  by turbulence only
+REAL, DIMENSION(SIZE(PTHM,1),SIZE(PTHM,2),SIZE(PTHM,3)) ::  ZDUDT_MF   ! tendency of U   by massflux scheme
+REAL, DIMENSION(SIZE(PTHM,1),SIZE(PTHM,2),SIZE(PTHM,3)) ::  ZDVDT_MF   ! tendency of V   by massflux scheme
+REAL, DIMENSION(SIZE(PTHM,1),SIZE(PTHM,2),SIZE(PTHM,3)) ::  ZDTHLDT_MF ! tendency of thl by massflux scheme
+REAL, DIMENSION(SIZE(PTHM,1),SIZE(PTHM,2),SIZE(PTHM,3)) ::  ZDRTDT_MF  ! tendency of Rt by massflux scheme
+REAL, DIMENSION(SIZE(PTHM,1),SIZE(PTHM,2),SIZE(PTHM,3),SIZE(PSVM,4)) ::  ZDSVDT_MF  ! tendency of Sv by massflux scheme
+REAL, DIMENSION(SIZE(PTHM,1),SIZE(PTHM,2),SIZE(PTHM,3)) ::  ZSIGMF,ZRC_MF,ZRI_MF,ZCF_MF ! cloud info for the cloud scheme
+REAL, DIMENSION(SIZE(PTHM,1),SIZE(PTHM,2),SIZE(PTHM,3)) ::  ZFLXZTHVMF           ! Thermal production for TKE scheme
+REAL, DIMENSION(SIZE(PTHM,1),SIZE(PTHM,2),SIZE(PTHM,3)) ::  ZFLXZTHMF
+REAL, DIMENSION(SIZE(PTHM,1),SIZE(PTHM,2),SIZE(PTHM,3)) ::  ZFLXZRMF
+REAL, DIMENSION(SIZE(PTHM,1),SIZE(PTHM,2),SIZE(PTHM,3)) ::  ZFLXZUMF
+REAL, DIMENSION(SIZE(PTHM,1),SIZE(PTHM,2),SIZE(PTHM,3)) ::  ZFLXZVMF
+REAL, DIMENSION(SIZE(PTHM,1),SIZE(PTHM,2),SIZE(PTHM,3)) ::  ZTHL_UP   ! updraft characteristics
+REAL, DIMENSION(SIZE(PTHM,1),SIZE(PTHM,2),SIZE(PTHM,3)) ::  ZRT_UP    ! updraft characteristics
+REAL, DIMENSION(SIZE(PTHM,1),SIZE(PTHM,2),SIZE(PTHM,3)) ::  ZRV_UP    ! updraft characteristics
+REAL, DIMENSION(SIZE(PTHM,1),SIZE(PTHM,2),SIZE(PTHM,3)) ::  ZU_UP     ! updraft characteristics
+REAL, DIMENSION(SIZE(PTHM,1),SIZE(PTHM,2),SIZE(PTHM,3)) ::  ZV_UP     ! updraft characteristics
+REAL, DIMENSION(SIZE(PTHM,1),SIZE(PTHM,2),SIZE(PTHM,3)) ::  ZRC_UP    ! updraft characteristics
+REAL, DIMENSION(SIZE(PTHM,1),SIZE(PTHM,2),SIZE(PTHM,3)) ::  ZRI_UP    ! updraft characteristics
+REAL, DIMENSION(SIZE(PTHM,1),SIZE(PTHM,2),SIZE(PTHM,3)) ::  ZTHV_UP   ! updraft characteristics
+REAL, DIMENSION(SIZE(PTHM,1),SIZE(PTHM,2),SIZE(PTHM,3)) ::  ZW_UP     ! updraft characteristics
+REAL, DIMENSION(SIZE(PTHM,1),SIZE(PTHM,2),SIZE(PTHM,3)) ::  ZFRAC_UP  ! updraft characteristics
+REAL, DIMENSION(SIZE(PTHM,1),SIZE(PTHM,2),SIZE(PTHM,3)) ::  ZEMF      ! updraft characteristics
+REAL, DIMENSION(SIZE(PTHM,1),SIZE(PTHM,2),SIZE(PTHM,3)) ::  ZDETR     ! updraft characteristics
+REAL, DIMENSION(SIZE(PTHM,1),SIZE(PTHM,2),SIZE(PTHM,3)) ::  ZENTR     ! updraft characteristics
+REAL, DIMENSION(SIZE(PTHM,1),SIZE(PTHM,2),SIZE(PTHM,3)) ::  ZUMM     ! wind on mass point
+REAL, DIMENSION(SIZE(PTHM,1),SIZE(PTHM,2),SIZE(PTHM,3)) ::  ZVMM     ! wind on mass point
+!
+INTEGER,DIMENSION(SIZE(PTHM,1)*SIZE(PTHM,2))     :: IKLCL,IKETL,IKCTL ! level of LCL,ETL and CTL
+INTEGER :: IIU, IJU, IKU, IKB, IKE, IRR, ISV  
+INTEGER :: JK,JRR,JSV                          ! Loop counters
+
+LOGICAL :: LSTATNW  !  switch for HARMONIE-AROME turb physics option
+                    ! TODO: linked with modd_turbn + init at default_desfmn 
+
+TYPE(TFIELDMETADATA) :: TZFIELD
+TYPE(DIMPHYEX_t)     :: YLDIMPHYEXPACK
+!------------------------------------------------------------------------
+!
+!!! 1. Initialisation
+CALL FILL_DIMPHYEX(YLDIMPHYEXPACK, SIZE(PZZ,1), SIZE(PZZ,2), SIZE(PZZ,3))
+!
+! Internal Domain
+IIU=SIZE(PTHM,1)
+IJU=SIZE(PTHM,2)
+IKU=SIZE(PTHM,3)
+IKB=1+JPVEXT
+IKE=IKU-JPVEXT
+!
+! number of moist  var
+IRR=SIZE(PRM,4)
+! number of scalar var
+ISV=SIZE(PSVM,4)
+!
+! wind on mass points
+ZUMM=MXF(PUM)
+ZVMM=MYF(PVM)
+!
+!!! 2. Call of the physical parameterization of massflux vertical transport
+!
+LSTATNW = .FALSE.
+!
+CALL SHALLOW_MF(YLDIMPHYEXPACK, CST, NEBN, PARAM_MFSHALLN, TURBN, CSTURB,&
+                KRR,KRRL,KRRI,ISV,                                    &
+                LNOMIXLG,NSV_LGBEG,NSV_LGEND,                         &
+                PTSTEP,                                               &
+                PDZZ, PZZ,                                            &
+                PRHODJ,PRHODREF,                                      &
+                PPABSM, PEXN,                                         &
+                PSFTH,PSFRV,                                          &
+                PTHM,PRM,ZUMM,ZVMM,PTKEM,PSVM,                        &
+                ZDUDT_MF,ZDVDT_MF,                                    &
+                ZDTHLDT_MF,ZDRTDT_MF,ZDSVDT_MF,                       &
+                ZSIGMF,ZRC_MF,ZRI_MF,ZCF_MF,ZFLXZTHVMF,               &
+                ZFLXZTHMF,ZFLXZRMF,ZFLXZUMF,ZFLXZVMF,                 &
+                ZTHL_UP,ZRT_UP,ZRV_UP,ZRC_UP,ZRI_UP,                  &
+                ZU_UP, ZV_UP, ZTHV_UP, ZW_UP,                         &
+                ZFRAC_UP,ZEMF,ZDETR,ZENTR,                            &
+                IKLCL,IKETL,IKCTL,PDX,PDY,PRSVS,XSVMIN,               &
+                TBUCONF, TBUDGETS,SIZE(TBUDGETS)                      )
+!
+! Fill non-declared-explicit-dimensions output variables
+PSIGMF(:,:,:) = ZSIGMF(:,:,:)
+PRC_MF(:,:,:) = ZRC_MF(:,:,:)
+PRI_MF(:,:,:) = ZRI_MF(:,:,:)
+PCF_MF(:,:,:) = ZCF_MF(:,:,:)
+PFLXZTHVMF(:,:,:) = ZFLXZTHVMF(:,:,:)
+!
+!!! 3. Compute source terms for Meso-NH pronostic variables
+!!!    ----------------------------------------------------
+!
+! As the pronostic variable of Meso-Nh are not (yet) the conservative variables
+! the thl tendency is put in th and the rt tendency in rv
+! the adjustment will do later the repartition between vapor and cloud
+PRTHS(:,:,:)  = PRTHS(:,:,:)  +   &
+                  PRHODJ(:,:,:)*ZDTHLDT_MF(:,:,:)
+PRRS(:,:,:,1) = PRRS(:,:,:,1) +   &
+                  PRHODJ(:,:,:)*ZDRTDT_MF(:,:,:)
+PRUS(:,:,:)   = PRUS(:,:,:)  +MXM(  &
+                  PRHODJ(:,:,:)*ZDUDT_MF(:,:,:))
+PRVS(:,:,:)   = PRVS(:,:,:)  +MYM(  &
+                  PRHODJ(:,:,:)*ZDVDT_MF(:,:,:))
+!
+DO JSV=1,ISV 
+  IF (LNOMIXLG .AND. JSV >= NSV_LGBEG .AND. JSV<= NSV_LGEND) CYCLE
+  PRSVS(:,:,:,JSV)   = MAX((PRSVS(:,:,:,JSV)  +    &
+                  PRHODJ(:,:,:)*ZDSVDT_MF(:,:,:,JSV)),XSVMIN(JSV))
+END DO     
+!
+!!! 4. Prints the fluxes in output file
+!
+IF ( LMF_FLX .AND. tpfile%lopened ) THEN
+  ! stores the conservative potential temperature vertical flux
+  TZFIELD = TFIELDMETADATA(          &
+    CMNHNAME   = 'MF_THW_FLX',       &
+    CSTDNAME   = '',                 &
+    CLONGNAME  = 'MF_THW_FLX',       &
+    CUNITS     = 'K m s-1',          &
+    CDIR       = 'XY',               &
+    CCOMMENT   = 'X_Y_Z_MF_THW_FLX', &
+    NGRID      = 4,                  &
+    NTYPE      = TYPEREAL,           &
+    NDIMS      = 3,                  &
+    LTIMEDEP   = .TRUE.              )
+  CALL IO_Field_write(TPFILE,TZFIELD,ZFLXZTHMF)
+  !
+  ! stores the conservative mixing ratio vertical flux
+    TZFIELD = TFIELDMETADATA(             &
+      CMNHNAME   = 'MF_RCONSW_FLX',       &
+      CSTDNAME   = '',                    &
+      CLONGNAME  = 'MF_RCONSW_FLX',       &
+      CUNITS     = 'K m s-1',             &
+      CDIR       = 'XY',                  &
+      CCOMMENT   = 'X_Y_Z_MF_RCONSW_FLX', &
+      NGRID      = 4,                     &
+      NTYPE      = TYPEREAL,              &
+      NDIMS      = 3,                     &
+      LTIMEDEP   = .TRUE.                 )
+  CALL IO_Field_write(TPFILE,TZFIELD,ZFLXZRMF)
+  !
+  ! stores the theta_v vertical flux
+  TZFIELD = TFIELDMETADATA(           &
+    CMNHNAME   = 'MF_THVW_FLX',       &
+    CSTDNAME   = '',                  &
+    CLONGNAME  = 'MF_THVW_FLX',       &
+    CUNITS     = 'K m s-1',           &
+    CDIR       = 'XY',                &
+    CCOMMENT   = 'X_Y_Z_MF_THVW_FLX', &
+    NGRID      = 4,                   &
+    NTYPE      = TYPEREAL,            &
+    NDIMS      = 3,                   &
+    LTIMEDEP   = .TRUE.               )
+  CALL IO_Field_write(TPFILE,TZFIELD,PFLXZTHVMF)
+  !
+ IF (PARAM_MFSHALLN%LMIXUV) THEN
+  ! stores the U momentum vertical flux
+  TZFIELD = TFIELDMETADATA(         &
+    CMNHNAME   = 'MF_UW_FLX',       &
+    CSTDNAME   = '',                &
+    CLONGNAME  = 'MF_UW_FLX',       &
+    CUNITS     = 'm2 s-2',          &
+    CDIR       = 'XY',              &
+    CCOMMENT   = 'X_Y_Z_MF_UW_FLX', &
+    NGRID      = 4,                 &
+    NTYPE      = TYPEREAL,          &
+    NDIMS      = 3,                 &
+    LTIMEDEP   = .TRUE.             )
+  CALL IO_Field_write(TPFILE,TZFIELD,ZFLXZUMF)
+  !
+  ! stores the V momentum vertical flux
+  TZFIELD = TFIELDMETADATA(         &
+    CMNHNAME   = 'MF_VW_FLX',       &
+    CSTDNAME   = '',                &
+    CLONGNAME  = 'MF_VW_FLX',       &
+    CUNITS     = 'm2 s-2',          &
+    CDIR       = 'XY',              &
+    CCOMMENT   = 'X_Y_Z_MF_VW_FLX', &
+    NGRID      = 4,                 &
+    NTYPE      = TYPEREAL,          &
+    NDIMS      = 3,                 &
+    LTIMEDEP   = .TRUE.             )
+  CALL IO_Field_write(TPFILE,TZFIELD,ZFLXZVMF)
+  !
+ END IF
+END IF
+!
+!!! 5. Externalised LES Diagnostic for Mass Flux Scheme
+!!!    ------------------------------------------------
+!
+      CALL DIAGNOS_LES_MF(IIU,IJU,IKU,PTIME_LES,               &
+                          ZTHL_UP,ZRT_UP,ZRV_UP,ZRC_UP,ZRI_UP, &
+                          ZU_UP,ZV_UP,ZTHV_UP,ZW_UP,           &
+                          ZFRAC_UP,ZEMF,ZDETR,ZENTR,           &
+                          ZFLXZTHMF,ZFLXZTHVMF,ZFLXZRMF,       &
+                          ZFLXZUMF,ZFLXZVMF,                   &
+                          IKLCL,IKETL,IKCTL )
+!               
+END SUBROUTINE SHALLOW_MF_PACK
diff --git a/src/PHYEX/ext/spawn_model2.f90 b/src/PHYEX/ext/spawn_model2.f90
new file mode 100644
index 0000000000000000000000000000000000000000..3511cd27f32930b19e51dac080c7feeb5469d991
--- /dev/null
+++ b/src/PHYEX/ext/spawn_model2.f90
@@ -0,0 +1,1696 @@
+!MNH_LIC Copyright 1995-2022 CNRS, Meteo-France and Universite Paul Sabatier
+!MNH_LIC This is part of the Meso-NH software governed by the CeCILL-C licence
+!MNH_LIC version 1. See LICENSE, CeCILL-C_V1-en.txt and CeCILL-C_V1-fr.txt
+!MNH_LIC for details. version 1.
+!-----------------------------------------------------------------
+!########################
+MODULE MODI_SPAWN_MODEL2
+!########################
+!
+INTERFACE
+!
+      SUBROUTINE SPAWN_MODEL2 (KRR,KSV_USER,HTURB,HSURF,HCLOUD,    &
+                               HCHEM_INPUT_FILE,HSPAFILE,HSPANBR,  &
+                               HSONFILE,HINIFILE,HINIFILEPGD,OSPAWN_SURF       )
+!
+INTEGER,               INTENT(IN)  :: KRR         ! Number of moist variables
+INTEGER,               INTENT(IN)  :: KSV_USER    ! Number of Users Scalar Variables
+CHARACTER (LEN=4),     INTENT(IN)  :: HTURB       ! Kind of turbulence parameterization
+CHARACTER (LEN=4),     INTENT(IN)  :: HSURF       ! Kind of surface parameterization
+CHARACTER (LEN=4),     INTENT(IN)  :: HCLOUD      ! Kind of cloud parameterization
+                                                  ! model 2 physical domain
+CHARACTER (LEN=*),     INTENT(IN) :: HSPAFILE     ! possible name of the output FM-file
+CHARACTER (LEN=*),     INTENT(IN) :: HSPANBR      ! NumBeR associated to the SPAwned file
+CHARACTER (LEN=*),     INTENT(IN) :: HSONFILE     ! name of the input FM-file SON
+CHARACTER (LEN=80),    INTENT(IN) :: HCHEM_INPUT_FILE
+CHARACTER (LEN=*),     INTENT(IN) :: HINIFILE     ! Input file
+CHARACTER (LEN=*),     INTENT(IN) :: HINIFILEPGD  ! Input pgd file
+LOGICAL,               INTENT(IN) :: OSPAWN_SURF  ! flag to spawn surface fields
+!
+END SUBROUTINE SPAWN_MODEL2
+!
+END INTERFACE
+!
+END MODULE MODI_SPAWN_MODEL2
+!     ######spl
+      SUBROUTINE SPAWN_MODEL2 (KRR,KSV_USER,HTURB,HSURF,HCLOUD,    &
+                               HCHEM_INPUT_FILE,HSPAFILE,HSPANBR,  &
+                               HSONFILE,HINIFILE,HINIFILEPGD,OSPAWN_SURF       )
+!     #######################################################################
+!
+!!****  *SPAWN_MODEL2 * - subroutine to prepare by horizontal interpolation and
+!!                        write an initial FM-file spawned from an other FM-file.
+!!
+!!    PURPOSE
+!!    -------
+!!
+!!      Initializes by horizontal interpolation, the model 2 in a sub-domain of 
+!!    model 1,  possibly overwrites model 2 information by model SON1,
+!!    and writes the resulting fields in a FM-file.
+!!
+!!
+!!**  METHOD
+!!    ------
+!!
+!!      In this routine, only the model 2 variables are known through the
+!!    MODD_... calls.
+!!
+!!      The directives to perform the preparation of the initial FM
+!!    file are stored in EXSPA.nam file.
+!!
+!!      The following  SPAWN_MODEL2 routine :
+!!
+!!             - sets default values of DESFM files
+!!             - reads the namelists part of EXSPA file which gives the
+!!      directives concerning the spawning to perform
+!!             - controls the domain size of model 2 and initializes its 
+!!      configuration for parameterizations and LBC
+!!             - allocates memory for arrays
+!!             - computes the interpolation coefficients needed to spawn model 2 
+!!      2 types of interpolations are used:
+!!                 1. Clark and Farley (JAS 1984) on 9 points 
+!!                 2. Bikhardt on 16 points
+!!             - initializes fields
+!!             - reads SON1 fields and overwrites on common domain
+!!             - writes the DESFM file (variables written have been initialized
+!!      by reading the DESFM file concerning the model 1)
+!!             - writes the LFIFM file. 
+!!
+!!       Finally some control prints are performed on the output listing.
+!!
+!!    EXTERNAL
+!!    --------
+!!
+!!      Module MODE_GRIDPROJ : contains conformal projection routines
+!!           SM_GRIDPROJ   : to compute some grid variables, in
+!!                           case of conformal projection.
+!!      Module MODE_GRIDCART : contains cartesian geometry routines
+!!           SM_GRIDCART   : to compute some grid variables, in
+!!                           case of cartesian geometry.
+!!      SET_REF       : to compute  rhoJ 
+!!      TOTAL_DMASS   : to compute the total mass of dry air
+!!      ANEL_BALANCE2  : to apply an anelastic correction in the case of changing
+!!                      resolution between the two models
+!!      IO_File_open : to open a FM-file (DESFM + LFIFM)
+!!      WRITE_DESFM   : to write the  DESFM file
+!!      WRITE_LFIFM   : to write the  LFIFM file  
+!!      IO_File_close : to close a FM-file (DESFM + LFIFM)
+!!      INI_BIKHARDT2     : initializes Bikhardt coefficients
+!!
+!!
+!! 
+!!    IMPLICIT ARGUMENTS
+!!    ------------------ 
+!!
+!!      Module MODD_PARAMETERS : contains parameters 
+!!      Module MODD_CONF       : contains configuration variables for all models
+!!      Module MODD_CTURB :
+!!         XTKEMIN : mimimum value for the TKE
+!!      Module MODD_GRID       : contains grid variables for all models
+!!      Module USE MODD_DYN    : contains configuration for the dynamics
+!!      Module MODD_REF        : contains reference state variables for
+!!                               all models
+!!
+!!      Module MODD_DIM2       : contains dimensions 
+!!      Module MODD_CONF2      : contains configuration variables 
+!!      Module MODD_GRID2      : contains grid variables  
+!!      Module MODD_TIME2      : contains time variables and uses MODD_TIME
+!!      Module MODD_REF2       : contains reference state variables 
+!!      Module MODD_FIELD2     : contains prognostic variables
+!!      Module MODD_LSFIELD2   : contains Larger Scale fields
+!!      Module MODD_GR_FIELD2  : contains surface fields
+!!      Module MODD_DYN2       : contains dynamic control variables for model 2 
+!!      Module MODD_LBC2       : contains lbc control variables for model 2
+!!      Module MODD_PARAM2     : contains configuration for physical parameterizations
+!!
+!!    REFERENCE
+!!    ---------
+!!
+!!       PROGRAM SPAWN_MODEL2 (Book2 of the documentation)
+!!      
+!!
+!!    AUTHOR
+!!    ------
+!!
+!!       J.P. Lafore     * METEO-FRANCE *
+!!
+!!    MODIFICATIONS
+!!    -------------
+!!
+!!      Original     11/01/95 
+!!      Modification 27/04/95  (I.Mallet) remove R from the historical variables
+!!      Modification 16/04/96  (Lafore) Different resolution ratio case introduction
+!!      Modification 24/04/96  (Lafore & Masson) Initialization of LUSERWs
+!!      Modification 24/04/96  (Masson) Correction of positivity on Rw and TKE
+!!      Modification 25/04/96  (Masson) Copies of internal zs on external points
+!!      Modification 02/05/96  (Stein Jabouille) initialize CCONF
+!!      Modification 31/05/96  (Lafore) Cumputing time analysis
+!!      Modification 10/06/96  (Masson) Call to anel_balance in all cases
+!!      Modification 10/06/96  (Masson) Bikhardt and Clark_and_Farley coefficients
+!!                                      incorporated in modules
+!!      Modification 12/06/96  (Masson) default values of NJMAX and KDYRATIO
+!!                                      if 2D version of the model
+!!      Modification 13/06/96  (Masson) choice of the name of the spawned file
+!!      Modification 30/07/96  (Lafore) MY_NAME and DAD_NAME writing for nesting
+!!      Modification 25/09/96  (Masson) grid optionnaly given by a fm file
+!!                                      and number of points given relatively
+!!                                      to model 1
+!!      Modification 10/10/96  (Masson) L1D and L2D verifications
+!!      Modification 12/11/96  (Masson) allocations of XSRCM and XSRCT
+!!      Modification 19/11/96  (Masson) add deep convection
+!!      Modification 26/11/96  (Lafore) spawning configuration writing on the FM-file
+!!      Modification 26/11/96  (Lafore) replacing of TOTAL_DMASS by REAL_DMASS
+!!      Modification 27/02/97  (Lafore) "surfacic" LS fields
+!!      Modification 10/04/97  (Lafore) proper treatment of minima
+!!      Modification 09/07/97  (Masson) absolute pressure and directional z0
+!!      Modification 10/07/97  (Masson) routines SPAWN_PRESSURE2 and DRY_MASS
+!!      Modification 17/07/97  (Masson) vertical interpolations and EPS
+!!      Modification 29/07/97  (Masson) split mode_lfifm_pgd
+!!      Modification 10/08/97  (Lafore) initialization of LUSERV
+!!      Modification 14/09/97  (Masson) use of relative humidity
+!!      Modification 08/12/97  (Masson) deallocation of model 1 variables
+!!      Modification 24/12/97  (Masson) directional z0 parameters and orographies
+!!      Modification 20/07/98  (Stein ) add the LB fields
+!!      Modification 15/03/99  (Masson) cover types
+!!      Modification 15/07/99  (Jabouille) shift domain initialization in INI_SIZE_SPAWN
+!!      Modification 04/01/00  (Masson) removes TSZ0 option
+!!      Modification 29/11/02  (Pinty)  add C3R5, ICE2, ICE4
+!!      Modification 07/07/05  (D.Barbary) spawn with 2 input files (father+son1)
+!!      Modification 20/05/06  Remove EPS, Clark and Farley interpolation
+!!                             Replace DRY_MASS by TOTAL_DMASS
+!!      Modification 06/12  (M.Tomasini) Interpolation of the advective forcing (ADVFRC)
+!!                                       and of the turbulent fluxes (EDDY_FLUX)
+!!      Modification 07/13  (Bosseur & Filippi) Adds Forefire
+!!                   24/04/2014 (J.escobar) bypass CRAY internal compiler error on IIJ computation
+!!      Modification 06/2014   (C.Lac) Initialization of physical param of
+!!                                      model2 before the call to ini_nsv
+!!      Modification 05/02/2015 (M.Moge) parallelization of SPAWNING
+!!      J.Escobar : 15/09/2015 : WENO5 & JPHEXT <> 1 
+!!      J.Escobar   02/05/2016 : test ZZS_MAX in // 
+!!      P.Wautelet  08/07/2016 : removed MNH_NCWRIT define
+!!      J.Escobar   12/07/2016 : add test on NRIMY & change the one on NRIMX with >=
+!!      Modification    01/2016  (JP Pinty) Add LIMA
+!!                    10/2016 (C.Lac) Add droplet deposition
+!!  Philippe Wautelet: 05/2016-04/2018: new data structures and calls for I/O
+!  P. Wautelet 07/02/2019: force TYPE to a known value for IO_File_add2list
+!  S. Bielli      02/2019:  sea salt: significant sea wave height influences salt emission; 5 salt modes
+!  P. Wautelet 22/02/2019: replace Hollerith edit descriptor (deleted from Fortran 95 standard)
+!  P. Wautelet 14/03/2019: correct ZWS when variable not present in file
+!  P. Wautelet 10/04/2019: replace ABORT and STOP calls by Print_msg
+!  P. Wautelet 20/05/2019: add name argument to ADDnFIELD_ll + new ADD4DFIELD_ll subroutine
+!  P. Wautelet 09/03/2021: move some chemistry initializations to ini_nsv
+!  P. Wautelet 24/03/2021: bugfix: allocate XLSRVM, XINPAP and XACPAP to zero size when not needed
+!!               03/2021 (JL Redelsperger) Ocean model case 
+!-------------------------------------------------------------------------------
+!
+!*       0.     DECLARATIONS
+!               ------------
+!
+USE MODD_PARAMETERS       ! Declarative modules
+USE MODD_CST
+USE MODD_CONF
+USE MODD_CTURB
+USE MODD_GRID 
+USE MODD_REF
+USE MODD_DYN
+USE MODD_NESTING
+USE MODD_SPAWN
+USE MODD_NSV
+USE MODD_PASPOL
+!
+USE MODD_DIM_n
+USE MODD_DYN_n
+USE MODD_CONF_n 
+USE MODD_LBC_n
+USE MODD_GRID_n
+USE MODD_TIME_n
+USE MODD_REF_n
+USE MODD_FIELD_n
+USE MODD_LSFIELD_n
+USE MODD_DUMMY_GR_FIELD_n
+USE MODD_PRECIP_n
+USE MODD_ELEC_n
+USE MODD_LUNIT_n
+USE MODD_PARAM_n
+USE MODD_TURB_n
+USE MODD_METRICS_n
+USE MODD_CH_MNHC_n
+USE MODD_PASPOL_n
+!$20140515
+USE MODD_VAR_ll, ONLY : NPROC
+USE MODD_IO, ONLY: TFILEDATA,TFILE_DUMMY,TFILE_SURFEX
+use modd_precision, only: MNHREAL_MPI
+!
+USE MODE_GRIDCART         ! Executive modules
+USE MODE_GRIDPROJ
+USE MODE_ll
+USE MODE_MSG
+!
+USE MODI_READ_HGRID
+USE MODI_SPAWN_GRID2  
+USE MODI_SPAWN_FIELD2
+USE MODI_SPAWN_SURF
+USE MODI_VER_INTERP_FIELD
+USE MODI_SPAWN_PRESSURE2
+USE MODI_SPAWN_SURF2_RAIN
+USE MODI_SET_REF
+USE MODI_TOTAL_DMASS
+USE MODI_ANEL_BALANCE_n
+USE MODI_WRITE_DESFM_n
+USE MODI_WRITE_LFIFM_n
+USE MODI_METRICS
+USE MODI_INI_BIKHARDT_n
+USE MODI_DEALLOCATE_MODEL1
+USE MODI_BOUNDARIES
+USE MODI_INI_NSV
+!$20140710
+USE MODI_UPDATE_METRICS
+!
+USE MODE_IO_FIELD_READ,    only: IO_Field_read
+USE MODE_IO_FIELD_WRITE,   only: IO_Header_write
+USE MODE_IO_FILE,          only: IO_File_close, IO_File_open
+USE MODE_IO_MANAGE_STRUCT, only: IO_File_add2list
+USE MODE_MODELN_HANDLER
+USE MODE_MPPDB
+!
+USE MODE_THERMO
+!
+USE MODI_SECOND_MNH
+!
+! Modules for  EDDY_FLUX
+USE MODD_LATZ_EDFLX
+USE MODD_DEF_EDDY_FLUX_n           
+USE MODD_DEF_EDDYUV_FLUX_n
+USE MODD_ADVFRC_n
+USE MODD_RELFRC_n
+USE MODD_2D_FRC
+!
+!USE MODE_LB_ll, ONLY : SET_LB_FIELD_ll
+USE MODI_GET_SIZEX_LB
+USE MODI_GET_SIZEY_LB
+!
+USE MODD_LIMA_PRECIP_SCAVENGING_n
+USE MODD_PARAM_LIMA, ONLY : MDEPOC=>LDEPOC, LSCAV
+USE MODD_PARAM_ICE_n,  ONLY : LDEPOSC
+USE MODD_PARAM_C2R2, ONLY : LDEPOC
+USE MODD_PASPOL, ONLY : LPASPOL
+!
+USE MODD_MPIF
+USE MODD_VAR_ll
+use modd_precision, only: LFIINT
+!
+IMPLICIT NONE
+!
+!*       0.1.1  Declarations of global variables not declared in the modules :
+!
+REAL, DIMENSION(:,:,:), ALLOCATABLE :: ZJ ! Jacobian
+!
+!
+!*       0.1.2  Declarations of dummy arguments :
+!
+INTEGER,               INTENT(IN)  :: KRR         ! Number of moist variables
+INTEGER,               INTENT(IN)  :: KSV_USER    ! Number of Users Scalar Variables
+CHARACTER (LEN=4),     INTENT(IN)  :: HTURB       ! Kind of turbulence parameterization
+CHARACTER (LEN=4),     INTENT(IN)  :: HSURF       ! Kind of surface parameterization
+CHARACTER (LEN=4),     INTENT(IN)  :: HCLOUD      ! Kind of cloud parameterization
+CHARACTER (LEN=*),     INTENT(IN) :: HSPAFILE     ! possible name of the output FM-file
+CHARACTER (LEN=*),     INTENT(IN) :: HSPANBR      ! NumBeR associated to the SPAwned file
+CHARACTER (LEN=*),     INTENT(IN) :: HSONFILE     ! name of the input FM-file SON
+CHARACTER (LEN=80),    INTENT(IN) :: HCHEM_INPUT_FILE
+CHARACTER (LEN=*),     INTENT(IN) :: HINIFILE     ! Input file
+CHARACTER (LEN=*),     INTENT(IN) :: HINIFILEPGD  ! Input pgd file
+LOGICAL,               INTENT(IN) :: OSPAWN_SURF  ! flag to spawn surface fields
+!
+!*       0.1.3  Declarations of local variables :
+!
+!
+INTEGER :: ILUOUT   ! Logical unit number for the output listing 
+INTEGER(KIND=LFIINT) :: INPRAR ! Number of articles predicted in the LFIFM file
+!
+!
+INTEGER             :: IIU            ! Upper dimension in x direction
+INTEGER             :: IJU            ! Upper dimension in y direction
+INTEGER             :: IKU            ! Upper dimension in z direction
+INTEGER             :: IIB            ! indice I Beginning in x direction
+INTEGER             :: IJB            ! indice J Beginning in y direction
+INTEGER             :: IKB            ! indice K Beginning in z direction
+INTEGER             :: IIE            ! indice I End       in x direction 
+INTEGER             :: IJE            ! indice J End       in y direction 
+INTEGER             :: IKE            ! indice K End       in z direction 
+INTEGER             :: JK             ! Loop index in z direction 
+INTEGER             :: JLOOP,JKLOOP   ! Loop indexes 
+INTEGER             :: JSV            ! loop index for scalar variables
+INTEGER             :: JRR            ! loop index for moist variables
+!
+REAL, DIMENSION(:,:),   ALLOCATABLE :: ZZS_LS ! large scale interpolated zs
+REAL, DIMENSION(:,:),   ALLOCATABLE :: ZZSMT_LS ! large scale interpolated smooth zs
+REAL, DIMENSION(:,:,:), ALLOCATABLE :: ZZZ_LS ! large scale interpolated z
+REAL, DIMENSION(:,:,:), ALLOCATABLE :: ZTHVT  ! virtual potential temperature
+REAL, DIMENSION(:,:,:), ALLOCATABLE :: ZHUT   ! relative humidity
+REAL, DIMENSION(:,:,:), ALLOCATABLE :: ZSUMRT ! sum of water ratios
+REAL, DIMENSION(:,:,:), ALLOCATABLE :: ZRHOD  ! dry density
+!
+REAL    :: ZTIME1,ZTIME2,ZSTART,ZEND,ZTOT,ZALL,ZPERCALL ! for computing time analysis
+REAL    ::     ZGRID2,    ZSURF2,    ZFIELD2,     ZVER, &
+           ZPRESSURE2,    ZANEL,      ZWRITE,     ZMISC
+REAL    :: ZPERCGRID2,ZPERCSURF2,ZPERCFIELD2, ZPERCVER, &
+       ZPERCPRESSURE2, ZPERCANEL, ZPERCWRITE,ZPERCMISC
+!
+INTEGER, DIMENSION(2) :: IIJ
+INTEGER               :: IK4000
+INTEGER               :: IMI ! Old Model index
+!
+! Spawning variables for the SON 1 (input one)
+INTEGER             :: IIMAXSON,IJMAXSON ! physical dimensions
+INTEGER             :: IIUSON,IJUSON     ! upper dimensions
+INTEGER             :: IXSIZESON,IYSIZESON ! sizes according to model1 grid
+INTEGER             :: IDXRATIOSON,IDYRATIOSON ! x and y-resolution ratios
+INTEGER             :: IXORSON,IYORSON   ! horizontal position 
+INTEGER             :: IXENDSON,IYENDSON !in x and y directions
+! Common indexes for the SON 2 (output one, model2)
+INTEGER             :: IIB2           ! indice I Beginning in x direction
+INTEGER             :: IJB2           ! indice J Beginning in y direction
+INTEGER             :: IIE2           ! indice I End       in x direction
+INTEGER             :: IJE2           ! indice J End       in y direction
+! Common indexes for the SON 1 (input one)
+INTEGER             :: IIB1           ! indice I Beginning in x direction
+INTEGER             :: IJB1           ! indice J Beginning in y direction
+INTEGER             :: IIE1           ! indice I End       in x direction
+INTEGER             :: IJE1           ! indice J End       in y direction
+! Logical for no common domain between the 2 sons or no input son
+LOGICAL             :: GNOSON = .TRUE.
+REAL, DIMENSION(:,:,:), ALLOCATABLE :: ZWORK3D ! working array
+CHARACTER(LEN=28)   :: YDAD_SON
+!$
+INTEGER             :: IINFO_ll
+TYPE(LIST_ll), POINTER :: TZFIELDS_ll=>NULL()   ! list of fields to exchange
+INTEGER             :: NXOR_TMP, NYOR_TMP, NXEND_TMP, NYEND_TMP 
+INTEGER :: IISIZEXF,IJSIZEXF,IISIZEXFU,IJSIZEXFU     ! dimensions of the
+INTEGER :: IISIZEX4,IJSIZEX4,IISIZEX2,IJSIZEX2       ! West-east LB arrays
+INTEGER :: IISIZEYF,IJSIZEYF,IISIZEYFV,IJSIZEYFV     ! dimensions of the
+INTEGER :: IISIZEY4,IJSIZEY4,IISIZEY2,IJSIZEY2       ! North-south LB arrays
+!
+CHARACTER(LEN=4)    :: YLBTYPE
+!
+INTEGER,DIMENSION(:,:),ALLOCATABLE   :: IJCOUNT 
+!
+REAL                :: ZZS_MAX, ZZS_MAX_ll
+!
+TYPE(TFILEDATA),POINTER :: TZFILE      => NULL()
+TYPE(TFILEDATA),POINTER :: TZSONFILE   => NULL()
+!-------------------------------------------------------------------------------
+!
+! Save model index and switch to model 2 variables
+IMI = GET_CURRENT_MODEL_INDEX()
+CALL GOTO_MODEL(2)
+CSTORAGE_TYPE='TT'
+!
+ILUOUT=TLUOUT%NLU
+!
+!*   1.    INITIALIZATIONS :
+!           ---------------
+!
+!*   1.1   time analysis :
+!          -------------
+!
+ZTIME1 = 0
+ZTIME2 = 0
+ZSTART = 0
+ZEND   = 0 
+ZGRID2 = 0
+ZSURF2 = 0 
+ZFIELD2= 0 
+ZANEL  = 0 
+ZWRITE = 0 
+ZPERCGRID2 = 0
+ZPERCSURF2 = 0 
+ZPERCFIELD2= 0 
+ZPERCANEL  = 0 
+ZPERCWRITE = 0 
+!
+CALL SECOND_MNH(ZSTART)
+!
+ZTIME1 = ZSTART
+!
+!*	 1.2   deallocates not used model 1 variables :  
+!              --------------------------------------
+!
+CALL DEALLOCATE_MODEL1(1)
+CALL DEALLOCATE_MODEL1(2)
+!
+!-------------------------------------------------------------------------------
+!
+!
+!*       3.     PROLOGUE:
+!               --------
+!
+!*       3.1    Compute dimensions of model 2 and other indices
+!
+NIMAX_ll = NXSIZE * NDXRATIO
+NJMAX_ll = NYSIZE * NDYRATIO
+!
+IF (NIMAX_ll==1 .AND. NJMAX_ll==1) THEN
+  L1D=.TRUE.
+  L2D=.FALSE.
+ELSE IF (NJMAX_ll==1) THEN
+  L1D=.FALSE.
+  L2D=.TRUE.
+ELSE
+  L1D=.FALSE.
+  L2D=.FALSE.
+END IF
+!
+CALL GET_DIM_EXT_ll('B',IIU,IJU)
+CALL GET_INDICE_ll (IIB,IJB,IIE,IJE)
+!
+NIMAX = IIE-IIB+1
+NJMAX = IJE-IJB+1
+!$
+IKU = SIZE(XTHVREFZ,1)
+NKMAX = IKU - 2*JPVEXT           ! initialization of NKMAX (MODD_DIM2)
+!
+IKB = 1 + JPVEXT
+IKE = IKU - JPVEXT
+!
+!
+!*       3.2    Position of model 2 domain relative to model 1 and controls
+!
+!$20140506 the condition on NXSIZE*NXRATIO ==IIE-IIB+1 only works for monoproc
+!$then cancel it
+!IF ( (NXSIZE*NDXRATIO) /= (IIE-IIB+1) ) THEN  
+!  WRITE(ILUOUT,*) 'SPAWN_MODEL2:  MODEL 2 DOMAIN X-SIZE INCOHERENT WITH THE',  &
+!       ' MODEL1 MESH  ',' IIB = ',IIB,' IIE = ', IIE ,'NDXRATIO = ',NDXRATIO
+! !callabortstop
+!  CALL PRINT_MSG(NVERB_FATAL,'GEN','SPAWN_MODEL2','')
+!END IF
+!$
+!$20140506 the condition on NXSIZE*NXRATIO ==IIE-IIB+1 only works for monoproc
+!$then cancel it
+!IF ( (NYSIZE*NDYRATIO) /= (IJE-IJB+1) ) THEN  
+!  WRITE(ILUOUT,*) 'SPAWN_MODEL2:  MODEL 2 DOMAIN Y-SIZE INCOHERENT WITH THE',  &
+!       ' MODEL1 MESH  ',' IJB = ',IJB,' IJE = ', IJE ,'NDYRATIO = ',NDYRATIO
+! !callabortstop
+!  CALL PRINT_MSG(NVERB_FATAL,'GEN','SPAWN_MODEL2','')
+!END IF
+!$
+!
+!*       3.3    Treatement of a SON 1 model (input)
+!
+IF (LEN_TRIM(HSONFILE) /= 0 ) THEN
+!
+!        3.3.1  Opening the son input file and reading the grid
+! 
+  WRITE(ILUOUT,*) 'SPAWN_MODEL2: spawning with a SON input file :',TRIM(HSONFILE)
+  CALL IO_File_add2list(TZSONFILE,TRIM(HSONFILE),'MNH','READ',KLFITYPE=2,KLFIVERB=NVERB)
+  CALL IO_File_open(TZSONFILE)
+  CALL IO_Field_read(TZSONFILE,'DAD_NAME',YDAD_SON)
+  CALL IO_Field_read(TZSONFILE,'IMAX',    IIMAXSON)
+  CALL IO_Field_read(TZSONFILE,'JMAX',    IJMAXSON)
+  CALL IO_Field_read(TZSONFILE,'XOR',     IXORSON)
+  CALL IO_Field_read(TZSONFILE,'YOR',     IYORSON)
+  CALL IO_Field_read(TZSONFILE,'DXRATIO', IDXRATIOSON)
+  CALL IO_Field_read(TZSONFILE,'DYRATIO', IDYRATIOSON)
+  !
+  IF (ADJUSTL(ADJUSTR(YDAD_SON)).NE.ADJUSTL(ADJUSTR(CMY_NAME(1)))) THEN 
+    WRITE(ILUOUT,*) 'SPAWN_MODEL2: DAD of SON file is different from the one of model2'
+    WRITE(ILUOUT,*) ' DAD of SON = ',TRIM(YDAD_SON),'  DAD of model2 = ',TRIM(CMY_NAME(1))
+    !callabortstop
+    CALL PRINT_MSG(NVERB_FATAL,'GEN','SPAWN_MODEL2','DAD of SON file is different from the one of model2')
+  END IF
+  IF ( IDXRATIOSON /= NDXRATIO ) THEN
+    WRITE(ILUOUT,*) 'SPAWN_MODEL2: RATIOX of input SON file is different from the one of model2' ,&
+       ' RATIOX SON = ',IDXRATIOSON,' RATIOX model2 = ',NDXRATIO
+    !callabortstop
+    CALL PRINT_MSG(NVERB_FATAL,'GEN','SPAWN_MODEL2','RATIOX of input SON file is different from the one of model2')
+  END IF
+  IF ( IDYRATIOSON /= NDYRATIO ) THEN
+    WRITE(ILUOUT,*) 'SPAWN_MODEL2: RATIOY of input SON file is different from the one of model2' ,&
+       ' RATIOY SON = ',IDYRATIOSON,' RATIOY model2 = ',NDYRATIO
+    !callabortstop
+    CALL PRINT_MSG(NVERB_FATAL,'GEN','SPAWN_MODEL2','RATIOY of input SON file is different from the one of model2')
+  END IF
+  !
+  IIUSON=IIMAXSON+2*JPHEXT
+  IJUSON=IJMAXSON+2*JPHEXT
+!
+!        3.3.2  Correspondance of indexes between the input SON and model2
+! 
+  IXSIZESON = IIMAXSON/IDXRATIOSON
+  IYSIZESON = IJMAXSON/IDYRATIOSON
+  IXENDSON = IXORSON+IXSIZESON
+  IYENDSON = IYORSON+IYSIZESON
+! Is a common domain between the input SON and the output son (model2)?
+  IF( ( MIN(NXEND-1,IXENDSON)-MAX(NXOR,IXORSON) > 0 ) .OR.           &
+      ( MIN(NYEND-1,IYENDSON)-MAX(NYOR,IYORSON) > 0 )                ) THEN
+    GNOSON=.FALSE.
+    ! Common domain for the model2 (output son) indexes
+    IIB2 = (MAX(NXOR,IXORSON)-NXOR)*NDXRATIO+1+JPHEXT
+    IJB2 = (MAX(NYOR,IYORSON)-NYOR)*NDYRATIO+1+JPHEXT
+    IIE2 = (MIN(NXEND-1,IXENDSON)-NXOR)*NDXRATIO+JPHEXT
+    IJE2 = (MIN(NYEND-1,IYENDSON)-NYOR)*NDYRATIO+JPHEXT
+    ! Common domain for the SON 1 (input one) indexes
+    IIB1 = (MAX(NXOR,IXORSON)-IXORSON)*NDXRATIO+1+JPHEXT
+    IJB1 = (MAX(NYOR,IYORSON)-IYORSON)*NDYRATIO+1+JPHEXT
+    IIE1 = (MIN(NXEND-1,IXENDSON)-IXORSON)*NDXRATIO+JPHEXT
+    IJE1 = (MIN(NYEND-1,IYENDSON)-IYORSON)*NDYRATIO+JPHEXT
+    ! 
+    WRITE(ILUOUT,*) '   common domain in the SON grid (IB,IE=', &
+                   1+JPHEXT,'-',IIMAXSON+JPHEXT,' ; JB,JE=',    &
+                   1+JPHEXT,'-',IJMAXSON+JPHEXT,'):'
+    WRITE(ILUOUT,*) 'I=',IIB1,'->',IIE1,' ; J=',IJB1,'->',IJE1
+    WRITE(ILUOUT,*) '   common domain in the model2 grid (IB,IE=',  &
+                   1+JPHEXT,'-',NXSIZE*NDXRATIO+JPHEXT,' ; JB,JE=', &
+                   1+JPHEXT,'-',NYSIZE*NDYRATIO+JPHEXT,'):'
+    WRITE(ILUOUT,*) 'I=',IIB2,'->',IIE2,' ; J=',IJB2,'->',IJE2
+  ELSE
+    WRITE(ILUOUT,*) 'SPAWN_MODEL2: no common domain between input SON and model2:'
+    WRITE(ILUOUT,*) '  the input SON fields are not taken into account, spawned fields are computed from model1'
+  END IF
+END IF
+!
+!*       3.4    Initialization of model 2 configuration
+! 
+NRR = KRR           ! for MODD_CONF2
+NSV_USER = KSV_USER
+IF (NSV_CHEM>0) THEN
+   LUSECHEM=.TRUE.  
+   IF (NSV_CHAC>0) THEN
+           LUSECHAQ=.TRUE.
+   ENDIF
+   IF (NSV_CHIC>0) THEN
+           LUSECHIC=.TRUE.
+   ENDIF 
+   CCHEM_INPUT_FILE = HCHEM_INPUT_FILE
+END IF
+!
+CTURB    =  HTURB                 ! for MODD_PARAM2
+CRAD     = 'NONE'                 ! radiation will have to be restarted
+CSURF    =  HSURF                 ! for surface call
+CCLOUD   =  HCLOUD
+CDCONV   = 'NONE'                 ! deep convection will have to be restarted
+CSCONV   = 'NONE'                 ! shallow convection will have to be restarted
+!
+! cas LIMA 
+!
+!IF (HCLOUD=='LIMA') THEN
+!  CCLOUD='LIMA'
+!  NMOD_CCN=3
+!  LSCAV=.FALSE.
+!  LAERO_MASS=.FALSE.
+!  NMOD_IFN=2
+!  NMOD_IMM=1
+!  LHHONI=.FALSE.
+!ENDIF
+!
+CALL INI_NSV(2) ! NSV* are set equal for model 2 and model 1. 
+                ! NSV is set to the total number of SV for model 2
+!
+IF (NRR==0) THEN
+  LUSERV=.FALSE.        ! as the default is .T.
+ELSE
+  IDX_RVT = 1
+END IF
+IF (NRR>1) THEN
+  LUSERC=.TRUE.
+  IDX_RCT = 2
+END IF
+IF (NRR>2) THEN
+  LUSERR=.TRUE.
+  IDX_RRT = 2
+END IF
+IF (NRR>3) THEN
+  LUSERI=.TRUE.
+  IDX_RIT = 2
+END IF
+IF (NRR>4) THEN
+  LUSERS=.TRUE.
+  IDX_RST = 2
+END IF
+IF (NRR>5) THEN
+  LUSERG=.TRUE.
+  IDX_RGT = 2
+END IF
+IF (NRR>6) THEN
+  LUSERH=.TRUE.
+  IDX_RHT = 2
+END IF
+!
+!
+!
+!*       3.5   model 2 configuration in MODD_NESTING to be written
+!*                on the FM-file to allow nesting or coupling 
+!
+CCPLFILE(:) = '    ' 
+LSTEADYLS=.TRUE.
+!
+NDXRATIO_ALL(:) = 0
+NDYRATIO_ALL(:) = 0
+NDXRATIO_ALL(2) = NDXRATIO
+NDYRATIO_ALL(2) = NDYRATIO
+NXOR_ALL(2)     = NXOR
+NYOR_ALL(2)     = NYOR
+NXEND_ALL(2)    = NXEND
+NYEND_ALL(2)    = NYEND
+!
+!*       3.6   size of the RIM area for lbc 
+!
+NRIMX=MIN(JPRIMMAX,IIU/2-1)
+IF ( .NOT. L2D ) THEN
+  NRIMY=MIN(JPRIMMAX,IJU/2-1)
+ELSE
+  NRIMY=0
+END IF
+IF (NRIMX >= IIU/2-1) THEN      ! Error ! this case is not supported - it should be, but there is a bug
+  call Print_msg( NVERB_FATAL, 'GEN', 'SPAWN_MODEL2', 'The size of the LBX zone is too big for the size of the subdomains. '// &
+                  'Try with less processes, a smaller LBX size or a bigger grid in X.' )
+ENDIF
+IF ( ( .NOT. L2D ) .AND. (NRIMY >= IJU/2-1) ) THEN  ! Error ! this case is not supported - it should be, but there is a bug
+  call Print_msg( NVERB_FATAL, 'GEN', 'SPAWN_MODEL2', 'The size of the LBY zone is too big for the size of the subdomains. '// &
+                  'Try with less processes, a smaller LBY size or a bigger grid in Y.' )
+ENDIF
+!
+LHORELAX_UVWTH=.TRUE.
+LHORELAX_RV=LUSERV
+LHORELAX_RC=LUSERC
+LHORELAX_RR=LUSERR
+LHORELAX_RI=LUSERI
+LHORELAX_RS=LUSERS
+LHORELAX_RG=LUSERG
+LHORELAX_RH=LUSERH
+!
+IF (CTURB/='NONE') LHORELAX_TKE  =.TRUE.
+LHORELAX_SV(:)=.FALSE.
+DO JSV=1,NSV
+  LHORELAX_SV(JSV)=.TRUE.
+END DO
+IF (NSV_CHEM > 0) LHORELAX_SVCHEM = .TRUE.
+IF (NSV_CHIC > 0) LHORELAX_SVCHIC = .TRUE.
+IF (NSV_C2R2 > 0) LHORELAX_SVC2R2 = .TRUE.
+IF (NSV_C1R3 > 0) LHORELAX_SVC1R3 = .TRUE.
+IF (NSV_ELEC > 0) LHORELAX_SVELEC = .TRUE.
+IF (NSV_AER  > 0) LHORELAX_SVAER = .TRUE.
+IF (NSV_DST  > 0) LHORELAX_SVDST = .TRUE.
+IF (NSV_SLT  > 0) LHORELAX_SVSLT = .TRUE.
+IF (NSV_PP  > 0) LHORELAX_SVPP   = .TRUE.
+#ifdef MNH_FOREFIRE
+IF (NSV_FF  > 0) LHORELAX_SVFF   = .TRUE.
+#endif
+IF (NSV_CS  > 0) LHORELAX_SVCS   = .TRUE.
+LHORELAX_SVLG   = .FALSE.
+IF (NSV_LIMA > 0) LHORELAX_SVLIMA = .TRUE.
+!
+!-------------------------------------------------------------------------------
+!
+!*       4.    ALLOCATE MEMORY FOR ARRAYS :  
+!	       -----------------------------
+!
+!*       4.1  Global variables absent from the modules :
+!                  
+ALLOCATE(ZJ(IIU,IJU,IKU))                      
+!
+!*       4.2   Prognostic (and diagnostic) variables (module MODD_FIELD2) :
+!
+ALLOCATE(XZWS(IIU,IJU)); XZWS(:,:) = XZWS_DEFAULT
+ALLOCATE(XLSZWSM(IIU,IJU))
+ALLOCATE(XUT(IIU,IJU,IKU))
+ALLOCATE(XVT(IIU,IJU,IKU))
+ALLOCATE(XWT(IIU,IJU,IKU))
+ALLOCATE(XTHT(IIU,IJU,IKU))
+IF (CTURB/='NONE') THEN
+  ALLOCATE(XTKET(IIU,IJU,IKU))
+ELSE
+  ALLOCATE(XTKET(0,0,0))
+END IF
+ALLOCATE(XPABST(IIU,IJU,IKU))
+ALLOCATE(XRT(IIU,IJU,IKU,NRR))
+ALLOCATE(XSVT(IIU,IJU,IKU,NSV))
+!
+IF (CTURB /= 'NONE' .AND. NRR>1) THEN
+  ALLOCATE(XSRCT(IIU,IJU,IKU))
+  ALLOCATE(XSIGS(IIU,IJU,IKU))
+ELSE
+  ALLOCATE(XSRCT(0,0,0))
+  ALLOCATE(XSIGS(0,0,0))
+END IF
+!
+!
+!*       4.4   Grid variables (module MODD_GRID2 and MODD_METRICS2):
+!
+ALLOCATE(XXHAT(IIU),XYHAT(IJU),XZHAT(IKU))
+ALLOCATE(XXHATM(IIU),XYHATM(IJU),XZHATM(IKU))
+ALLOCATE(XZTOP)
+ALLOCATE(XMAP(IIU,IJU))
+ALLOCATE(XLAT(IIU,IJU))
+ALLOCATE(XLON(IIU,IJU))
+ALLOCATE(XDXHAT(IIU),XDYHAT(IJU))
+ALLOCATE(XZS(IIU,IJU))
+ALLOCATE(XZSMT(IIU,IJU))
+ALLOCATE(XZZ(IIU,IJU,IKU))
+!
+ALLOCATE(XDXX(IIU,IJU,IKU))
+ALLOCATE(XDYY(IIU,IJU,IKU))
+ALLOCATE(XDZX(IIU,IJU,IKU))
+ALLOCATE(XDZY(IIU,IJU,IKU))
+ALLOCATE(XDZZ(IIU,IJU,IKU))
+!
+ALLOCATE(ZZS_LS(IIU,IJU))
+ALLOCATE(ZZSMT_LS(IIU,IJU))
+ALLOCATE(ZZZ_LS(IIU,IJU,IKU))
+!
+!*       4.5   Reference state variables (module MODD_REF2):
+!
+ALLOCATE(XRHODREF(IIU,IJU,IKU),XTHVREF(IIU,IJU,IKU),XRVREF(IIU,IJU,IKU))
+ALLOCATE(XRHODJ(IIU,IJU,IKU),XEXNREF(IIU,IJU,IKU))
+!
+!*       4.6   Larger Scale fields (module MODD_LSFIELD2):
+!
+                !          LS fields for vertical relaxation and diffusion
+ALLOCATE(XLSUM(IIU,IJU,IKU))
+ALLOCATE(XLSVM(IIU,IJU,IKU))
+ALLOCATE(XLSWM(IIU,IJU,IKU))
+ALLOCATE(XLSTHM(IIU,IJU,IKU))
+IF ( NRR >= 1) THEN
+  ALLOCATE(XLSRVM(IIU,IJU,IKU))
+ELSE
+  ALLOCATE(XLSRVM(0,0,0))
+ENDIF
+                !          LB fields for lbc coupling
+!
+!get the size of the local portion of the LB zone in X and Y direction
+CALL GET_SIZEX_LB(NIMAX_ll,NJMAX_ll,NRIMX,               &
+                  IISIZEXF,IJSIZEXF,IISIZEXFU,IJSIZEXFU, &
+                  IISIZEX4,IJSIZEX4,IISIZEX2,IJSIZEX2)
+CALL GET_SIZEY_LB(NIMAX_ll,NJMAX_ll,NRIMY,               &
+                  IISIZEYF,IJSIZEYF,IISIZEYFV,IJSIZEYFV, &
+                  IISIZEY4,IJSIZEY4,IISIZEY2,IJSIZEY2)
+!on fait des choses inutiles avec GET_SIZEX_LB, on pourrait utiliser seulement GET_LOCAL_LB_SIZE_X_ll
+!ILOCLBSIZEX = GET_LOCAL_LB_SIZE_X_ll( NRIMX )
+!ILOCLBSIZEY = GET_LOCAL_LB_SIZE_Y_ll( NRIMY )
+!
+  ALLOCATE(XLBXUM(IISIZEXFU,IJU,IKU))
+!! ALLOCATE(XLBXUM(2*NRIMX+2*JPHEXT,IJU,IKU))
+!
+IF ( .NOT. L2D ) THEN
+  ALLOCATE(XLBYUM(IIU,IJSIZEYF,IKU))
+!!  ALLOCATE(XLBYUM(IIU,2*NRIMY+2*JPHEXT,IKU))
+ELSE
+  ALLOCATE(XLBYUM(0,0,0))
+END IF
+!
+ALLOCATE(XLBXVM(IISIZEXF,IJU,IKU))
+!! ALLOCATE(XLBXVM(2*NRIMX+2*JPHEXT,IJU,IKU))
+!
+IF ( .NOT. L2D ) THEN
+  IF ( NRIMY == 0 ) THEN
+    ALLOCATE(XLBYVM(IIU,IJSIZEY4,IKU))
+  ELSE
+    ALLOCATE(XLBYVM(IIU,IJSIZEYFV,IKU))
+!!    ALLOCATE(XLBYVM(IIU,2*NRIMY+2*JPHEXT,IKU))
+  END IF
+ELSE
+  ALLOCATE(XLBYVM(0,0,0))
+END IF
+!
+ALLOCATE(XLBXWM(IISIZEXF,IJU,IKU))
+!! ALLOCATE(XLBXWM(2*NRIMX+2*JPHEXT,IJU,IKU))
+!
+IF ( .NOT. L2D ) THEN
+  ALLOCATE(XLBYWM(IIU,IJSIZEYF,IKU))
+!!  ALLOCATE(XLBYWM(IIU,2*NRIMY+2*JPHEXT,IKU))
+ELSE
+  ALLOCATE(XLBYWM(0,0,0))
+END IF
+!
+ALLOCATE(XLBXTHM(IISIZEXF,IJU,IKU))
+!!ALLOCATE(XLBXTHM(2*NRIMX+2*JPHEXT,IJU,IKU))
+!
+IF ( .NOT. L2D )  THEN
+  ALLOCATE(XLBYTHM(IIU,IJSIZEYF,IKU))
+!!  ALLOCATE(XLBYTHM(IIU,2*NRIMY+2*JPHEXT,IKU))
+ELSE
+  ALLOCATE(XLBYTHM(0,0,0))
+END IF
+!
+IF (CTURB /= 'NONE') THEN
+  ALLOCATE(XLBXTKEM(IISIZEXF,IJU,IKU))
+!!  ALLOCATE(XLBXTKEM(2*NRIMX+2*JPHEXT,IJU,IKU))
+ELSE
+  ALLOCATE(XLBXTKEM(0,0,0))
+END IF
+!
+IF (CTURB /= 'NONE' .AND. (.NOT. L2D)) THEN
+  ALLOCATE(XLBYTKEM(IIU,IJSIZEYF,IKU))
+!!  ALLOCATE(XLBYTKEM(IIU,2*NRIMY+2*JPHEXT,IKU))
+ELSE
+  ALLOCATE(XLBYTKEM(0,0,0))
+END IF
+!
+ALLOCATE(XLBXRM(IISIZEXF,IJU,IKU,NRR))
+!!ALLOCATE(XLBXRM(2*NRIMX+2*JPHEXT,IJU,IKU,NRR))
+!
+IF (.NOT. L2D ) THEN
+  ALLOCATE(XLBYRM(IIU,IJSIZEYF,IKU,NRR))
+!!  ALLOCATE(XLBYRM(IIU,2*NRIMY+2*JPHEXT,IKU,NRR))
+ELSE
+  ALLOCATE(XLBYRM(0,0,0,0))
+END IF
+!
+ALLOCATE(XLBXSVM(IISIZEXF,IJU,IKU,NSV))
+!!ALLOCATE(XLBXSVM(2*NRIMX+2*JPHEXT,IJU,IKU,NSV))
+!
+IF (.NOT. L2D ) THEN
+  ALLOCATE(XLBYSVM(IIU,IJSIZEYF,IKU,NSV))
+!!  ALLOCATE(XLBYSVM(IIU,2*NRIMY+2*JPHEXT,IKU,NSV))
+ELSE
+  ALLOCATE(XLBYSVM(0,0,0,0))
+END IF
+!
+NSIZELBX_ll=2*NRIMX+2*JPHEXT
+NSIZELBXU_ll=2*NRIMX+2*JPHEXT
+NSIZELBY_ll=2*NRIMY+2*JPHEXT
+NSIZELBYV_ll=2*NRIMY+2*JPHEXT
+NSIZELBXR_ll=2*NRIMX+2*JPHEXT
+NSIZELBXSV_ll=2*NRIMX+2*JPHEXT
+NSIZELBXTKE_ll=2*NRIMX+2*JPHEXT
+NSIZELBYTKE_ll=2*NRIMY+2*JPHEXT
+NSIZELBYR_ll=2*NRIMY+2*JPHEXT
+NSIZELBYSV_ll=2*NRIMY+2*JPHEXT
+!
+!
+!        4.8   precipitation variables  ! same allocations than in ini_micron
+!
+IF (CCLOUD /= 'NONE' .AND. CCLOUD /= 'REVE') THEN
+  ALLOCATE(XINPRR(IIU,IJU))
+  ALLOCATE(XINPRR3D(IIU,IJU,IKU))
+  ALLOCATE(XEVAP3D(IIU,IJU,IKU))
+  ALLOCATE(XACPRR(IIU,IJU))
+ELSE
+  ALLOCATE(XINPRR(0,0))
+  ALLOCATE(XINPRR3D(0,0,0))
+  ALLOCATE(XEVAP3D(0,0,0))
+  ALLOCATE(XACPRR(0,0))
+END IF
+!
+IF (CCLOUD(1:3) == 'ICE' .OR. CCLOUD == 'C2R2'  &
+         .OR. CCLOUD == 'KHKO' .OR. CCLOUD == 'LIMA') THEN
+  ALLOCATE(XINPRC(IIU,IJU))
+  ALLOCATE(XACPRC(IIU,IJU))
+ELSE
+  ALLOCATE(XINPRC(0,0))
+  ALLOCATE(XACPRC(0,0))
+END IF
+!
+IF (( CCLOUD(1:3) == 'ICE'                                   .AND.LDEPOSC) .OR. &
+    ((CCLOUD=='C2R2' .OR. CCLOUD=='KHKO').AND.LDEPOC)  .OR. &
+    ( CCLOUD=='LIMA'                                         .AND.MDEPOC))  THEN
+  ALLOCATE(XINDEP(IIU,IJU))
+  ALLOCATE(XACDEP(IIU,IJU))
+ELSE
+  ALLOCATE(XINDEP(0,0))
+  ALLOCATE(XACDEP(0,0))
+END IF
+!
+IF (CCLOUD(1:3) == 'ICE' .OR. CCLOUD == 'C3R5'.OR. CCLOUD == 'LIMA') THEN
+  ALLOCATE(XINPRS(IIU,IJU))
+  ALLOCATE(XACPRS(IIU,IJU))
+ELSE
+  ALLOCATE(XINPRS(0,0))
+  ALLOCATE(XACPRS(0,0))
+END IF
+!
+IF (CCLOUD == 'C3R5' .OR. CCLOUD == 'ICE3' .OR. CCLOUD == 'ICE4'.OR. CCLOUD == 'LIMA' ) THEN
+  ALLOCATE(XINPRG(IIU,IJU))
+  ALLOCATE(XACPRG(IIU,IJU))
+ELSE
+  ALLOCATE(XINPRG(0,0))
+  ALLOCATE(XACPRG(0,0))
+END IF
+!
+IF (CCLOUD == 'ICE4'.OR. CCLOUD == 'LIMA') THEN
+  ALLOCATE(XINPRH(IIU,IJU))
+  ALLOCATE(XACPRH(IIU,IJU))
+ELSE
+  ALLOCATE(XINPRH(0,0))
+  ALLOCATE(XACPRH(0,0))
+END IF
+!
+IF ( CCLOUD=='LIMA' .AND. LSCAV ) THEN
+  ALLOCATE(XINPAP(IIU,IJU))
+  ALLOCATE(XACPAP(IIU,IJU))
+  XINPAP(:,:)=0.0
+  XACPAP(:,:)=0.0  
+ELSE
+  ALLOCATE(XINPAP(0,0))
+  ALLOCATE(XACPAP(0,0))
+END IF
+!
+!        4.8bis electric variables  
+!
+IF (CELEC /= 'NONE' ) THEN
+  ALLOCATE(XNI_SDRYG(IIU,IJU,IKU))
+  ALLOCATE(XNI_IDRYG(IIU,IJU,IKU))
+  ALLOCATE(XNI_IAGGS(IIU,IJU,IKU))
+  ALLOCATE(XEFIELDU(IIU,IJU,IKU))
+  ALLOCATE(XEFIELDV(IIU,IJU,IKU))
+  ALLOCATE(XEFIELDW(IIU,IJU,IKU))
+  ALLOCATE(XESOURCEFW(IIU,IJU,IKU))
+  ALLOCATE(XIND_RATE(IIU,IJU,IKU))
+  ALLOCATE(XIONSOURCEFW(IIU,IJU,IKU))
+  ALLOCATE(XEW(IIU,IJU,IKU))
+  ALLOCATE(XCION_POS_FW(IIU,IJU,IKU))
+  ALLOCATE(XCION_NEG_FW(IIU,IJU,IKU))
+  ALLOCATE(XMOBIL_POS(IIU,IJU,IKU))
+  ALLOCATE(XMOBIL_NEG(IIU,IJU,IKU))
+ELSE
+  ALLOCATE(XNI_SDRYG(0,0,0))
+  ALLOCATE(XNI_IDRYG(0,0,0))
+  ALLOCATE(XNI_IAGGS(0,0,0))
+  ALLOCATE(XEFIELDU(0,0,0))
+  ALLOCATE(XEFIELDV(0,0,0))
+  ALLOCATE(XEFIELDW(0,0,0))
+  ALLOCATE(XESOURCEFW(0,0,0))
+  ALLOCATE(XIND_RATE(0,0,0))
+  ALLOCATE(XIONSOURCEFW(0,0,0))
+  ALLOCATE(XEW(0,0,0))
+  ALLOCATE(XCION_POS_FW(0,0,0))
+  ALLOCATE(XCION_NEG_FW(0,0,0))
+  ALLOCATE(XMOBIL_POS(0,0,0))
+  ALLOCATE(XMOBIL_NEG(0,0,0))
+END IF
+!
+!
+!
+!        4.9   Passive pollutant variable                                    
+!
+IF (LPASPOL) THEN
+  ALLOCATE( XATC(IIU,IJU,IKU,NSV_PP) )
+             ELSE
+  ALLOCATE( XATC(0,0,0,0))
+END IF
+!
+!        4.10  Advective forcing variable for 2D (Modif MT)
+!
+!
+IF (L2D_ADV_FRC) THEN
+  WRITE(ILUOUT,*) 'SPAWN_MODEL2: L2D_ADV_FRC IS SET TO ',L2D_ADV_FRC,' SO ADVECTIVE FORCING WILL BE SPAWN: NADVFRC=',NADVFRC
+  ALLOCATE(TDTADVFRC(NADVFRC))
+  ALLOCATE(XDTHFRC(IIU,IJU,IKU,NADVFRC))
+  ALLOCATE(XDRVFRC(IIU,IJU,IKU,NADVFRC))
+  WRITE(ILUOUT,*) 'SPAWN_MODEL2: ALLOCATION OF ADV FORCING VARIABLES MADE'
+ELSE
+  ALLOCATE(TDTADVFRC(0))
+  ALLOCATE(XDTHFRC(0,0,0,0))
+  ALLOCATE(XDRVFRC(0,0,0,0))
+END IF
+IF (L2D_REL_FRC) THEN
+  WRITE(ILUOUT,*) 'SPAWN_MODEL2: L2D_REL_FRC IS SET TO ',L2D_REL_FRC,' SO RELAXATION FORCING WILL BE SPAWN: NRELFRC=',NRELFRC
+  ALLOCATE(TDTRELFRC(NRELFRC))
+  ALLOCATE(XTHREL(IIU,IJU,IKU,NRELFRC))
+  ALLOCATE(XRVREL(IIU,IJU,IKU,NRELFRC))
+  WRITE(ILUOUT,*) 'SPAWN_MODEL2: ALLOCATION OF REL FORCING VARIABLES MADE'
+ELSE
+  ALLOCATE(TDTRELFRC(0))
+  ALLOCATE(XTHREL(0,0,0,0))
+  ALLOCATE(XRVREL(0,0,0,0))
+END IF
+!
+!        4.11  Turbulent fluxes for 2D (Modif MT)                                    
+!
+!
+IF (LUV_FLX) THEN
+  WRITE(ILUOUT,*) 'SPAWN_MODEL2: XUV_FLX1 IS SET TO ',XUV_FLX1,' SO XVU_FLUX WILL BE SPAWN'
+  ALLOCATE(XVU_FLUX_M(IIU,IJU,IKU))
+  WRITE(ILUOUT,*) 'SPAWN_MODEL2: ALLOCATION OF XVU_FLUX_M  MADE'
+ELSE
+  ALLOCATE(XVU_FLUX_M(0,0,0))
+END IF
+!
+IF (LTH_FLX) THEN
+  WRITE(ILUOUT,*) 'SPAWN_MODEL2: XTH_FLX IS SET TO ',XTH_FLX,' SO XVTH_FLUX and XWTH_FLUX WILL BE SPAWN'
+  ALLOCATE(XVTH_FLUX_M(IIU,IJU,IKU))
+  ALLOCATE(XWTH_FLUX_M(IIU,IJU,IKU))
+  WRITE(ILUOUT,*) 'SPAWN_MODEL2: ALLOCATION OF XVTH_FLUX_M and XWTH_FLUX_M  MADE'
+ELSE
+  ALLOCATE(XVTH_FLUX_M(0,0,0))
+  ALLOCATE(XWTH_FLUX_M(0,0,0))
+END IF
+!
+!-------------------------------------------------------------------------------
+!
+!*       5.     INITIALIZE ALL THE MODEL VARIABLES
+!	        ----------------------------------
+!
+!*       5.1    Bikhardt interpolation coefficients computation :
+!
+CALL INI_BIKHARDT_n(NDXRATIO,NDYRATIO,2)
+!
+CALL SECOND_MNH(ZTIME2)
+!
+ZMISC = ZTIME2 - ZTIME1
+!
+!*       5.2    Spatial and Temporal grid (for MODD_GRID2 and MODD_TIME2) :
+!
+CALL SECOND_MNH(ZTIME1)
+!
+IF(NPROC.GT.1)THEN
+        CALL GO_TOMODEL_ll(2, IINFO_ll)
+        CALL GET_FEEDBACK_COORD_ll(NXOR_TMP,NYOR_TMP,NXEND_TMP,NYEND_TMP,IINFO_ll) !phys domain
+ELSE
+        NXOR_TMP = NXOR
+        NYOR_TMP = NYOR
+        NXEND_TMP= NXEND
+        NYEND_TMP = NYEND
+ENDIF
+XZS=0.
+CALL SPAWN_GRID2( NXOR, NYOR, NXEND, NYEND, NDXRATIO, NDYRATIO,                  &
+                  XLONORI, XLATORI, XXHAT, XYHAT, XZHAT, XXHATM, XYHATM, XZHATM, &
+                  XXHAT_ll, XYHAT_ll, XXHATM_ll, XYHATM_ll,                      &
+                  XHAT_BOUND, XHATM_BOUND,                                       &
+                  XZTOP, LSLEVE, XLEN1, XLEN2,                                   &
+                  XZS, XZSMT, ZZS_LS, ZZSMT_LS, TDTMOD, TDTCUR                   )
+!
+CALL MPPDB_CHECK2D(ZZS_LS,"SPAWN_MOD2:ZZS_LS",PRECISION)
+CALL MPPDB_CHECK2D(ZZSMT_LS,"SPAWN_MOD2:ZZSMT_LS",PRECISION)
+CALL MPPDB_CHECK2D(XZS,"SPAWN_MOD2:XZS",PRECISION)
+CALL MPPDB_CHECK2D(XZSMT,"SPAWN_MOD2:XZSMT",PRECISION)
+!
+CALL SECOND_MNH(ZTIME2)
+!
+ZGRID2 = ZTIME2 - ZTIME1
+!
+!*       5.3    Calculation of the grid
+!
+ZTIME1 = ZTIME2
+!
+IF (LCARTESIAN) THEN
+  CALL SM_GRIDCART(XXHAT,XYHAT,XZHAT,ZZS_LS,LSLEVE,XLEN1,XLEN2,ZZSMT_LS,XDXHAT,XDYHAT,ZZZ_LS,ZJ)
+  CALL SM_GRIDCART(XXHAT,XYHAT,XZHAT,XZS   ,LSLEVE,XLEN1,XLEN2,XZSMT   ,XDXHAT,XDYHAT,XZZ   ,ZJ)
+ELSE
+  CALL SM_GRIDPROJ( XXHAT, XYHAT, XZHAT, XXHATM, XYHATM, ZZS_LS,      &
+                    LSLEVE, XLEN1, XLEN2, ZZSMT_LS, XLATORI, XLONORI, &
+                    XMAP, XLAT, XLON, XDXHAT, XDYHAT, ZZZ_LS, ZJ      )
+  CALL SM_GRIDPROJ( XXHAT, XYHAT, XZHAT, XXHATM, XYHATM, XZS,         &
+                    LSLEVE, XLEN1, XLEN2, XZSMT,    XLATORI, XLONORI, &
+                    XMAP, XLAT, XLON, XDXHAT, XDYHAT, XZZ,    ZJ      )
+END IF
+!
+!*       5.4  Compute the metric coefficients
+!
+CALL ADD3DFIELD_ll( TZFIELDS_ll, XZZ, 'SPAWN_MODEL2::XZZ' )
+CALL UPDATE_HALO_ll(TZFIELDS_ll,IINFO_ll)
+CALL CLEANLIST_ll(TZFIELDS_ll)
+!
+CALL METRICS(XMAP,XDXHAT,XDYHAT,XZZ,XDXX,XDYY,XDZX,XDZY,XDZZ)
+!
+CALL MPPDB_CHECK3D(XDXX,"spawnmod2-beforeupdate_metrics:XDXX",PRECISION)
+CALL MPPDB_CHECK3D(XDYY,"spawnmod2-beforeupdate_metrics:XDYY",PRECISION)
+CALL MPPDB_CHECK3D(XDZX,"spawnmod2-beforeupdate_metrics:XDZX",PRECISION)
+CALL MPPDB_CHECK3D(XDZY,"spawnmod2-beforeupdate_metrics:XDZY",PRECISION)
+!
+CALL UPDATE_METRICS(CLBCX,CLBCY,XDXX,XDYY,XDZX,XDZY,XDZZ)
+!
+CALL MPPDB_CHECK3D(XDXX,"spawnmod2-aftrupdate_metrics:XDXX",PRECISION)
+CALL MPPDB_CHECK3D(XDYY,"spawnmod2-aftrupdate_metrics:XDYY",PRECISION)
+CALL MPPDB_CHECK3D(XDZX,"spawnmod2-aftrupdate_metrics:XDZX",PRECISION)
+CALL MPPDB_CHECK3D(XDZY,"spawnmod2-aftrupdate_metrics:XDZY",PRECISION)
+!$
+!
+!*       5.5    3D Reference state variables :
+!
+CALL SET_REF( 0, TFILE_DUMMY,                            &
+              XZZ, XZHATM, ZJ, XDXX, XDYY, CLBCX, CLBCY, &
+              XREFMASS, XMASS_O_PHI0, XLINMASS,          &
+              XRHODREF, XTHVREF, XRVREF, XEXNREF, XRHODJ )
+!
+CALL SECOND_MNH(ZTIME2)
+!
+ZMISC = ZMISC + ZTIME2 - ZTIME1
+!
+!*       5.6    Prognostic variables and Larger scale fields :
+!
+ZTIME1 = ZTIME2
+!
+!* horizontal interpolation
+!
+ALLOCATE(ZTHVT(IIU,IJU,IKU))
+ALLOCATE(ZHUT(IIU,IJU,IKU))
+!
+MPPDB_CHECK_LB = .TRUE.
+IF (GNOSON) THEN
+  CALL SPAWN_FIELD2 (NXOR,NYOR,NXEND,NYEND,NDXRATIO,NDYRATIO,CTURB,            &
+                 XUT,XVT,XWT,ZTHVT,XRT,ZHUT,XTKET,XSVT,XZWS,XATC,              &
+                 XSRCT,XSIGS,                                                  &
+                 XLSUM,XLSVM,XLSWM,XLSTHM,XLSRVM,XLSZWSM,                      &
+                 XDTHFRC,XDRVFRC,XTHREL,XRVREL,                                &
+                 XVU_FLUX_M,XVTH_FLUX_M,XWTH_FLUX_M            )
+  CALL MPPDB_CHECK3D(XUT,"SPAWN_M2 after SPAWN_FIELD2:XUT",PRECISION)
+ELSE
+  CALL MPPDB_CHECK3D(XUT,"SPAWN_M2 before SPAWN_FIELD2:XUT",PRECISION)
+  CALL SPAWN_FIELD2 (NXOR,NYOR,NXEND,NYEND,NDXRATIO,NDYRATIO,CTURB,            &
+                 XUT,XVT,XWT,ZTHVT,XRT,ZHUT,XTKET,XSVT,XZWS,XATC,              &
+                 XSRCT,XSIGS,                                                  &
+                 XLSUM,XLSVM,XLSWM,XLSTHM,XLSRVM,XLSZWSM,                      &
+                 XDTHFRC,XDRVFRC,XTHREL,XRVREL,                                &                 
+                 XVU_FLUX_M, XVTH_FLUX_M,XWTH_FLUX_M,                          &
+                 TZSONFILE,IIUSON,IJUSON,                                      &
+                 IIB2,IJB2,IIE2,IJE2,                                          &
+                 IIB1,IJB1,IIE1,IJE1                                           )
+  CALL MPPDB_CHECK3D(XUT,"SPAWN_M2 after SPAWN_FIELD2:XUT",PRECISION)
+END IF
+!
+CALL MPPDB_CHECK3D(XUT,"SPAWN_MOD2aftFIELD2:XUT",PRECISION)
+CALL MPPDB_CHECK3D(XVT,"SPAWN_MOD2aftFIELD2:XVT",PRECISION)
+!$
+!* correction of positivity
+!
+IF (SIZE(XLSRVM,1)>0)      XLSRVM   = MAX(0.,XLSRVM)
+IF (SIZE(XRT,1)>0)         XRT      = MAX(0.,XRT)
+IF (SIZE(ZHUT,1)>0)        ZHUT     = MIN(MAX(ZHUT,0.),100.)
+IF (SIZE(XTKET,1)>0)       XTKET    = MAX(XTKEMIN,XTKET)
+!
+CALL SECOND_MNH(ZTIME2)
+!
+ZFIELD2 = ZTIME2 - ZTIME1
+!
+ZTIME1  = ZTIME2
+!
+!* vertical interpolation
+!
+ZZS_MAX = ABS( MAXVAL(XZS(:,:)))
+CALL MPI_ALLREDUCE(ZZS_MAX, ZZS_MAX_ll, 1, MNHREAL_MPI, MPI_MAX,  &
+                     NMNH_COMM_WORLD,IINFO_ll)
+IF ( (ZZS_MAX_ll>0.) .AND. (NDXRATIO/=1 .OR. NDYRATIO/=1) )  THEN
+  CALL MPPDB_CHECK3D(XUT,"SPAWN_M2 before VER_INTERP_FIELD:XUT",PRECISION)
+  CALL VER_INTERP_FIELD (CTURB,NRR,NSV,ZZZ_LS,XZZ,                             &
+               XUT,XVT,XWT,ZTHVT,XRT,ZHUT,XTKET,XSVT,                          &
+               XSRCT,XSIGS,                                                    &
+               XLSUM,XLSVM,XLSWM,XLSTHM,XLSRVM                                 )
+  !
+  CALL MPPDB_CHECK3D(XUT,"SPAWN_M2aftVERINTER:XUT",PRECISION)
+  CALL MPPDB_CHECK3D(XVT,"SPAWN_M2aftVERINTER:XVT",PRECISION)
+  CALL MPPDB_CHECK3D(XWT,"SPAWN_M2aftVERINTER:XWT",PRECISION)
+  CALL MPPDB_CHECK3D(ZHUT,"SPAWN_M2aftVERINTER:ZHUT",PRECISION)
+  CALL MPPDB_CHECK3D(XTKET,"SPAWN_M2aftVERINTER:XTKET",PRECISION)
+  CALL MPPDB_CHECK3D(XSRCT,"SPAWN_M2aftVERINTER:XSRCT",PRECISION)
+ENDIF
+!
+CALL SECOND_MNH(ZTIME2)
+!
+ZVER = ZTIME2 - ZTIME1
+!
+!*       5.7    Absolute pressure :
+!
+ZTIME1 = ZTIME2
+!
+CALL SPAWN_PRESSURE2(NXOR,NYOR,NXEND,NYEND,NDXRATIO,NDYRATIO,   &
+                     ZZZ_LS,XZZ,ZTHVT,XPABST                    )
+!
+IF (.NOT.GNOSON) THEN
+  ALLOCATE(ZWORK3D(IIUSON,IJUSON,IKU))
+  CALL IO_Field_read(TZSONFILE,'PABST',ZWORK3D)
+  XPABST(IIB2:IIE2,IJB2:IJE2,:) = ZWORK3D(IIB1:IIE1,IJB1:IJE1,:)
+  DEALLOCATE(ZWORK3D)
+END IF
+!
+IF (NVERB>=2) THEN
+  IK4000 = COUNT(XZHAT(:)<4000.)
+  IIJ = MAXLOC(        SUM(ZHUT(IIB:IIE,IJB:IJE,JPVEXT+1:IK4000),3),                  &
+                MASK=COUNT(ZHUT(IIB:IIE,IJB:IJE,JPVEXT+1:IKE)                         &
+                           >=MAXVAL(ZHUT(IIB:IIE,IJB:IJE,JPVEXT+1:IKE))-0.01,DIM=3 )  &
+                      >=1                                                   )           &
+        + JPHEXT
+  WRITE(ILUOUT,*) ' '
+  WRITE(ILUOUT,*) 'humidity     (I=',IIJ(1),';J=',IIJ(2),')'
+  DO JK=IKB,IKE
+    WRITE(ILUOUT,'(F6.2," %")') ZHUT(IIJ(1),IIJ(2),JK)
+  END DO
+END IF
+!*       5.8    Retrieve model thermodynamical variables :
+!
+ALLOCATE(ZSUMRT(IIU,IJU,IKU))
+ZSUMRT(:,:,:) = 0.
+IF (NRR==0) THEN
+  XTHT(:,:,:) = ZTHVT(:,:,:)
+ELSE
+  IF (NDXRATIO/=1 .OR. NDYRATIO/=1) THEN
+    XRT(:,:,:,1) = SM_PMR_HU(XPABST(:,:,:),                                 &
+                             ZTHVT(:,:,:)*(XPABST(:,:,:)/XP00)**(XRD/XCPD), &
+                             ZHUT(:,:,:),XRT(:,:,:,:),KITERMAX=100          )
+  END IF
+  !
+  DO JRR=1,NRR
+    ZSUMRT(:,:,:) = ZSUMRT(:,:,:) + XRT(:,:,:,JRR)
+  END DO
+  XTHT(:,:,:) = ZTHVT(:,:,:)/(1.+XRV/XRD*XRT(:,:,:,1))*(1.+ZSUMRT(:,:,:))
+  CALL MPPDB_CHECK3D(XTHT,"SPAWN_MOD2:XTHT",PRECISION)
+END IF
+!
+DEALLOCATE (ZHUT)
+!
+CALL SECOND_MNH(ZTIME2)
+ZPRESSURE2=ZTIME2-ZTIME1
+!
+!*       5.9   Large Scale field for lbc treatment:
+!
+!
+!*       5.9.1 West-East LB zones
+!
+!
+!JUAN A REVOIR TODO_JPHEXT
+! <<<<<<< spawn_model2.f90
+  MPPDB_CHECK_LB = .TRUE.
+  CALL MPPDB_CHECK3D(XUT,"SPAWN_MOD2 before lbc treatment:XUT",PRECISION)
+  CALL MPPDB_CHECK3D(XVT,"SPAWN_MOD2 before lbc treatment:XVT",PRECISION)
+  MPPDB_CHECK_LB = .FALSE.
+  YLBTYPE = 'LBU'
+  CALL SET_LB_FIELD_ll( YLBTYPE, XUT, XLBXUM, XLBYUM, IIB, IJB, IIE, IJE, 1, 0, 0, 0 )
+  ! copy XUT(IIB:IIB+NRIMX,:,:) instead of XUT(IIB-1:IIB-1+NRIMX,:,:) in XLBXUM
+  CALL SET_LB_FIELD_ll( YLBTYPE, XVT, XLBXVM, XLBYVM, IIB, IJB, IIE, IJE, 0, 0, 1, 0 )
+  ! copy XVT(:,IJB:IJB+NRIMY,:) instead of XVT(:,IJB-1:IJB-1+NRIMY,:) in XLBYVM
+  CALL SET_LB_FIELD_ll( YLBTYPE, XWT, XLBXWM, XLBYWM, IIB, IJB, IIE, IJE, 0, 0, 0, 0 )
+  CALL SET_LB_FIELD_ll( YLBTYPE, XTHT, XLBXTHM, XLBYTHM, IIB, IJB, IIE, IJE, 0, 0, 0, 0 )
+  IF (HTURB /= 'NONE') THEN
+    CALL SET_LB_FIELD_ll( YLBTYPE, XTKET, XLBXTKEM, XLBYTKEM, IIB, IJB, IIE, IJE, 0, 0, 0, 0 )
+  ENDIF
+  IF (NRR >= 1) THEN
+    DO JRR =1,NRR
+      CALL SET_LB_FIELD_ll( YLBTYPE, XRT(:,:,:,JRR), XLBXRM(:,:,:,JRR), XLBYRM(:,:,:,JRR), IIB, IJB, IIE, IJE, 0, 0, 0, 0 )
+    END DO
+  END IF
+  IF (NSV /= 0) THEN
+    DO JSV = 1, NSV
+      CALL SET_LB_FIELD_ll( YLBTYPE, XSVT(:,:,:,JSV), XLBXSVM(:,:,:,JSV), XLBYSVM(:,:,:,JSV), IIB, IJB, IIE, IJE, 0, 0, 0, 0 )
+    END DO
+!!$=======
+!!$!
+!!$XLBXUM(1:NRIMX+JPHEXT,:,:)         = XUT(2:NRIMX+JPHEXT+1,:,:)
+!!$XLBXUM(NRIMX+JPHEXT+1:2*NRIMX+2*JPHEXT,:,:) = XUT(IIE+1-NRIMX:IIE+JPHEXT,:,:)
+!!$IF( .NOT. L2D ) THEN
+!!$  XLBYUM(:,1:NRIMY+JPHEXT,:)         = XUT(:,1:NRIMY+JPHEXT,:)
+!!$  XLBYUM(:,NRIMY+JPHEXT+1:2*NRIMY+2*JPHEXT,:) = XUT(:,IJE+1-NRIMY:IJE+JPHEXT,:)
+!!$END IF
+!!$!
+!!$!*       5.9.2  V variable
+!!$!
+!!$!
+!!$XLBXVM(1:NRIMX+JPHEXT,:,:)         = XVT(1:NRIMX+JPHEXT,:,:)
+!!$XLBXVM(NRIMX+JPHEXT+1:2*NRIMX+2*JPHEXT,:,:) = XVT(IIE+1-NRIMX:IIE+JPHEXT,:,:)
+!!$IF( .NOT. L2D ) THEN
+!!$  XLBYVM(:,1:NRIMY+JPHEXT,:)         = XVT(:,2:NRIMY+JPHEXT+1,:)
+!!$  XLBYVM(:,NRIMY+JPHEXT+1:2*NRIMY+2*JPHEXT,:) = XVT(:,IJE+1-NRIMY:IJE+JPHEXT,:)
+!!$END IF
+!!$!
+!!$!*       5.9.3  W variable
+!!$!
+!!$!
+!!$XLBXWM(1:NRIMX+JPHEXT,:,:)         = XWT(1:NRIMX+JPHEXT,:,:)
+!!$XLBXWM(NRIMX+JPHEXT+1:2*NRIMX+2*JPHEXT,:,:) = XWT(IIE+1-NRIMX:IIE+JPHEXT,:,:)
+!!$IF( .NOT. L2D ) THEN
+!!$  XLBYWM(:,1:NRIMY+JPHEXT,:)         = XWT(:,1:NRIMY+JPHEXT,:)
+!!$  XLBYWM(:,NRIMY+JPHEXT+1:2*NRIMY+2*JPHEXT,:) = XWT(:,IJE+1-NRIMY:IJE+JPHEXT,:)
+!!$END IF
+!!$!
+!!$!*       5.9.4  TH variable
+!!$!
+!!$!
+!!$XLBXTHM(1:NRIMX+JPHEXT,:,:)         = XTHT(1:NRIMX+JPHEXT,:,:)
+!!$XLBXTHM(NRIMX+JPHEXT+1:2*NRIMX+2*JPHEXT,:,:) = XTHT(IIE+1-NRIMX:IIE+JPHEXT,:,:)
+!!$IF( .NOT. L2D ) THEN
+!!$  XLBYTHM(:,1:NRIMY+JPHEXT,:)         = XTHT(:,1:NRIMY+JPHEXT,:)
+!!$  XLBYTHM(:,NRIMY+JPHEXT+1:2*NRIMY+2*JPHEXT,:) = XTHT(:,IJE+1-NRIMY:IJE+JPHEXT,:)
+!!$END IF
+!!$!
+!!$!*       5.9.5  TKE variable
+!!$!
+!!$!
+!!$IF (HTURB /= 'NONE') THEN
+!!$  XLBXTKEM(1:NRIMX+JPHEXT,:,:)         = XTKET(1:NRIMX+JPHEXT,:,:)
+!!$  XLBXTKEM(NRIMX+JPHEXT+1:2*NRIMX+2*JPHEXT,:,:) = XTKET(IIE+1-NRIMX:IIE+JPHEXT,:,:)
+!!$  IF( .NOT. L2D ) THEN
+!!$    XLBYTKEM(:,1:NRIMY+JPHEXT,:)         = XTKET(:,1:NRIMY+JPHEXT,:)
+!!$    XLBYTKEM(:,NRIMY+JPHEXT+1:2*NRIMY+2*JPHEXT,:) = XTKET(:,IJE+1-NRIMY:IJE+JPHEXT,:)
+!!$>>>>>>> 1.3.2.4.2.2.2.6.2.3.2.6.2.1
+  END IF
+!
+! <<<<<<< spawn_model2.f90
+  CALL MPPDB_CHECKLB(XLBXUM,"SPAWN_MOD2 before SPAWN_SURF2_RAIN",PRECISION,'LBXU',NRIMX)
+  CALL MPPDB_CHECKLB(XLBXVM,"SPAWN_MOD2 before SPAWN_SURF2_RAIN:XLBXVM",PRECISION,'LBXU',NRIMX)
+  CALL MPPDB_CHECKLB(XLBXWM,"SPAWN_MOD2 before SPAWN_SURF2_RAIN:XLBXWM",PRECISION,'LBXU',NRIMX)
+  CALL MPPDB_CHECKLB(XLBYUM,"SPAWN_MOD2 before SPAWN_SURF2_RAIN:XLBYUM",PRECISION,'LBYV',NRIMY)
+  CALL MPPDB_CHECKLB(XLBYVM,"SPAWN_MOD2 before SPAWN_SURF2_RAIN:XLBYVM",PRECISION,'LBYV',NRIMY)
+  CALL MPPDB_CHECKLB(XLBYWM,"SPAWN_MOD2 before SPAWN_SURF2_RAIN:XLBYWM",PRECISION,'LBYV',NRIMY)
+!!$=======
+!!$!*       5.9.6  moist variables
+!!$!
+!!$IF (NRR >= 1) THEN
+!!$  DO JRR =1,NRR  
+!!$    XLBXRM(1:NRIMX+JPHEXT,:,:,JRR)         = XRT(1:NRIMX+JPHEXT,:,:,JRR)
+!!$    XLBXRM(NRIMX+JPHEXT+1:2*NRIMX+2*JPHEXT,:,:,JRR) = XRT(IIE+1-NRIMX:IIE+JPHEXT,:,:,JRR)
+!!$    IF( .NOT. L2D ) THEN
+!!$      XLBYRM(:,1:NRIMY+JPHEXT,:,JRR)         = XRT(:,1:NRIMY+JPHEXT,:,JRR)
+!!$      XLBYRM(:,NRIMY+JPHEXT+1:2*NRIMY+2*JPHEXT,:,JRR) = XRT(:,IJE+1-NRIMY:IJE+JPHEXT,:,JRR)
+!!$    END IF
+!!$  END DO
+!!$END IF
+!!$!
+!!$!*       5.9.7  scalar variables
+!!$!
+!!$IF (NSV /= 0) THEN
+!!$  DO JSV = 1, NSV
+!!$    XLBXSVM(1:NRIMX+JPHEXT,:,:,JSV)         = XSVT(1:NRIMX+JPHEXT,:,:,JSV)
+!!$    XLBXSVM(NRIMX+JPHEXT+1:2*NRIMX+2*JPHEXT,:,:,JSV) = XSVT(IIE+1-NRIMX:IIE+JPHEXT,:,:,JSV)
+!!$    IF( .NOT. L2D ) THEN
+!!$      XLBYSVM(:,1:NRIMY+JPHEXT,:,JSV)         = XSVT(:,1:NRIMY+JPHEXT,:,JSV)
+!!$      XLBYSVM(:,NRIMY+JPHEXT+1:2*NRIMY+2*JPHEXT,:,JSV) = XSVT(:,IJE+1-NRIMY:IJE+JPHEXT,:,JSV)
+!!$    END IF
+!!$  END DO
+!!$ENDIF
+!!$>>>>>>> 1.3.2.4.2.2.2.6.2.3.2.6.2.1
+!
+!*       5.10 Surface precipitation computation
+!
+IF (SIZE(XINPRR) /= 0 ) THEN
+  IF (GNOSON) &
+    CALL SPAWN_SURF2_RAIN (NXOR,NYOR,NXEND,NYEND,NDXRATIO,NDYRATIO,   &
+              XINPRC,XACPRC,XINDEP,XACDEP,XINPRR,XINPRR3D,XEVAP3D,    &
+              XACPRR,XINPRS,XACPRS,XINPRG,XACPRG,&
+              XINPRH,XACPRH )
+  IF (.NOT.GNOSON) &
+    CALL SPAWN_SURF2_RAIN (NXOR,NYOR,NXEND,NYEND,NDXRATIO,NDYRATIO,  &
+           XINPRC,XACPRC,XINDEP,XACDEP,XINPRR,XINPRR3D,XEVAP3D,      &
+           XACPRR,XINPRS,XACPRS,XINPRG,XACPRG,XINPRH,XACPRH,         &
+           TZSONFILE,IIUSON,IJUSON,                                  &
+           IIB2,IJB2,IIE2,IJE2,                                      &
+           IIB1,IJB1,IIE1,IJE1                                       )
+ENDIF
+!
+!*       5.11   Total mass of dry air Md computation :
+!
+ZTIME1 = ZTIME2
+!
+ALLOCATE(ZRHOD(IIU,IJU,IKU))
+!
+IF (LOCEAN) THEN
+  ZRHOD(:,:,:)=XRH00OCEAN*(1.-XALPHAOC*(ZTHVT(:,:,:)-XTH00OCEAN)+XBETAOC*(XRT(:,:,:,1)-XSA00OCEAN))
+ELSE
+  ZRHOD(:,:,:)=XPABST(:,:,:)/(XPABST(:,:,:)/XP00)**(XRD/XCPD) &
+              /(XRD*ZTHVT(:,:,:)*(1.+ZSUMRT(:,:,:)))
+ENDIF
+!$20140709
+  CALL MPPDB_CHECK3D(ZRHOD,"SPAWN_MOD2:ZRHOD",PRECISION)
+  CALL MPPDB_CHECK3D(XPABST,"SPAWN_MOD2:XPABST",PRECISION)
+  CALL MPPDB_CHECK3D(ZSUMRT,"SPAWN_MOD2:ZSUMRT",PRECISION)
+!$20140710 until here all ok after UPHALO(XZZ)
+!
+CALL TOTAL_DMASS(ZJ,ZRHOD,XDRYMASST)
+!
+DEALLOCATE (ZRHOD)
+DEALLOCATE (ZSUMRT,ZTHVT)
+!
+CALL SECOND_MNH(ZTIME2)
+!
+ZMISC = ZMISC + ZTIME2 - ZTIME1
+!
+!*       5.12 Deallocation of model 1 variables : 
+!
+ZTIME1 = ZTIME2
+!
+CALL DEALLOCATE_MODEL1(3)
+!
+CALL SECOND_MNH(ZTIME2)
+!
+ZMISC = ZMISC + ZTIME2 - ZTIME1
+!
+!*       5.13 Anelastic correction : 
+!
+CALL SECOND_MNH(ZTIME1)
+!
+IF (.NOT. L1D) THEN
+  CALL ANEL_BALANCE_n
+  CALL BOUNDARIES (                                                 &
+            0.,CLBCX,CLBCY,NRR,NSV,1,                               &
+            XLBXUM,XLBXVM,XLBXWM,XLBXTHM,XLBXTKEM,XLBXRM,XLBXSVM,   &
+            XLBYUM,XLBYVM,XLBYWM,XLBYTHM,XLBYTKEM,XLBYRM,XLBYSVM,   &
+            XLBXUM,XLBXVM,XLBXWM,XLBXTHM,XLBXTKEM,XLBXRM,XLBXSVM,   &
+            XLBYUM,XLBYVM,XLBYWM,XLBYTHM,XLBYTKEM,XLBYRM,XLBYSVM,   &
+            XRHODJ,XRHODREF,                                        &
+            XUT, XVT, XWT, XTHT, XTKET, XRT, XSVT, XSRCT            )
+END IF
+!
+CALL SECOND_MNH(ZTIME2)
+!
+ZANEL = ZTIME2 - ZTIME1
+!
+!
+!
+!-------------------------------------------------------------------------------
+!
+!*	 6.    WRITE THE FMFILE
+!	       ---------------- 
+!
+CALL SECOND_MNH(ZTIME1)
+!
+INPRAR = 22 + 2*(4+NRR+NSV) ! 22 = number of grid variables + reference state
+                            ! variables +dimension variables
+                            ! 2*(4+NRR+NSV) = number of prognostic variables
+                            ! at time t and t-dt
+IF ( ( LEN_TRIM(HSPAFILE) /= 0 ) .AND. ( ADJUSTL(HSPAFILE) /= ADJUSTL(CINIFILE) ) ) THEN
+  CMY_NAME(2)=HSPAFILE
+ELSE
+  CMY_NAME(2)=ADJUSTL(ADJUSTR(CINIFILE)//'.spa'//ADJUSTL(HSPANBR))
+  IF (.NOT.GNOSON)   &
+     CMY_NAME(2)=ADJUSTL(ADJUSTR(CINIFILE)//'.spr'//ADJUSTL(HSPANBR))
+END IF
+!
+CALL IO_File_add2list(TZFILE,CMY_NAME(2),'MNH','WRITE',KLFINPRAR=INPRAR,KLFITYPE=1,KLFIVERB=NVERB)
+!
+CALL IO_File_open(TZFILE)
+!
+CALL WRITE_DESFM_n(2,TZFILE)
+!
+IF (LBAL_ONLY) THEN  ! same relation with its DAD for model2 and for model1
+  NDXRATIO_ALL(2) = NDXRATIO_ALL(1)
+  NDYRATIO_ALL(2) = NDYRATIO_ALL(1)
+  NXOR_ALL(2)     = NXOR_ALL(1)
+  NYOR_ALL(2)     = NYOR_ALL(1)
+  NXEND_ALL(2)    = NXEND_ALL(1)
+  NYEND_ALL(2)    = NYEND_ALL(1)
+  CDAD_NAME(2)    = CDAD_NAME(1)
+  IF (CDADSPAFILE == '' ) THEN
+    IF (NDXRATIO_ALL(1) == 1 .AND. NDYRATIO_ALL(1) == 1 &
+      .AND. NXOR_ALL(1) == 1 .AND. NYOR_ALL(1) == 1 ) THEN
+      ! for spawning with ratio=1 
+      ! if the DAD of model 1 is itself, the DAD of model 2 also.
+      CDAD_NAME(2)=CMY_NAME(2)
+    ENDIF
+  ENDIF
+  ! case of model with DAD
+  IF (CDADSPAFILE /='') CDAD_NAME(2)=CDADSPAFILE
+ELSE
+  CDAD_NAME(2)=CMY_NAME(1) ! model 1 becomes the DAD of model 2 (spawned one)
+ENDIF
+!
+CALL IO_Header_write(TZFILE,HDAD_NAME=CDAD_NAME(2))
+CALL WRITE_LFIFM_n(TZFILE,CDAD_NAME(2))
+!
+CALL SECOND_MNH(ZTIME2)
+!
+ZWRITE = ZTIME2 - ZTIME1
+!
+!-------------------------------------------------------------------------------
+!
+!*       7.      Surface variables :
+!
+ZTIME1 = ZTIME2
+!
+TFILE_SURFEX => TZFILE
+CALL SPAWN_SURF(HINIFILE,HINIFILEPGD,TZFILE,OSPAWN_SURF)
+NULLIFY(TFILE_SURFEX)
+!
+CALL SECOND_MNH(ZTIME2)
+!
+ZSURF2 = ZTIME2 - ZTIME1
+!
+!-------------------------------------------------------------------------------
+!
+!*	 8.    CLOSES THE FMFILE
+!	       ----------------- 
+!
+CALL IO_File_close(TZFILE)
+IF (ASSOCIATED(TZSONFILE)) THEN
+  CALL IO_File_close(TZSONFILE)
+END IF
+!
+!-------------------------------------------------------------------------------
+!
+!*       9.    PRINTS ON OUTPUT-LISTING
+!              ------------------------
+!
+WRITE(ILUOUT,FMT=9900) XZHAT(1)
+!
+DO JLOOP = 2,IKU
+ WRITE(ILUOUT,FMT=9901) JLOOP,XZHAT(JLOOP),XZHAT(JLOOP)-XZHAT(JLOOP-1)
+END DO
+!
+IF (NVERB >= 5) THEN
+  WRITE(ILUOUT,*) 'SPAWN_MODEL2: LUSERV,LUSERC=',LUSERV,LUSERC 
+  WRITE(ILUOUT,*) 'SPAWN_MODEL2: LUSERR,LUSERI,LUSERS=',LUSERR,LUSERI,LUSERS
+  WRITE(ILUOUT,*) 'SPAWN_MODEL2: LUSERG,LUSERH,NSV=',LUSERG,LUSERH,NSV
+  WRITE(ILUOUT,*) 'SPAWN_MODEL2: NRR=',NRR
+  WRITE(ILUOUT,*) 'SPAWN_MODEL2: NVERB=',NVERB
+  WRITE(ILUOUT,*) 'SPAWN_MODEL2: XLON0,XLAT0,XBETA=',XLON0,XLAT0,XBETA
+  WRITE(ILUOUT,*) 'SPAWN_MODEL2: LCARTESIAN=',LCARTESIAN
+  WRITE(ILUOUT,*) 'SPAWN_MODEL2: LOCEAN,LCOUPLES=',LOCEAN,LCOUPLES
+  IF(LCARTESIAN) THEN
+    WRITE(ILUOUT,*) 'SPAWN_MODEL2: No map projection used.'
+  ELSE
+    WRITE(ILUOUT,*) 'SPAWN_MODEL2: XRPK,XLONORI,XLATORI=',XRPK,XLONORI,XLATORI
+    IF (ABS(XRPK) == 1.) THEN
+      WRITE(ILUOUT,*) 'SPAWN_MODEL2: Polar stereo used.'
+    ELSE IF (XRPK == 0.) THEN
+      WRITE(ILUOUT,*) 'SPAWN_MODEL2: Mercator used.'
+    ELSE
+      WRITE(ILUOUT,*) 'SPAWN_MODEL2: Lambert used, cone factor=',XRPK 
+    END IF
+  END IF
+END IF
+!
+IF (NVERB >= 10) THEN
+  WRITE(ILUOUT,*) 'SPAWN_MODEL2: IIB, IJB, IKB=',IIB,IJB,IKB
+  WRITE(ILUOUT,*) 'SPAWN_MODEL2: IIU, IJU, IKU=',IIU,IJU,IKU
+END IF
+!
+IF(NVERB >= 10) THEN                               !Value control
+  WRITE(ILUOUT,*) 'SPAWN_MODEL2: Some XZS values:'
+  WRITE(ILUOUT,*) XZS(1,IJU),XZS((IIU-1)/2,IJU),XZS(IIU,IJU)  
+  WRITE(ILUOUT,*) XZS(1,(IJU-1)/2),XZS((IIU-1)/2,(IJU-1)/2),XZS(IIU,(IJU-1)/2)  
+  WRITE(ILUOUT,*) XZS(1,1)      ,XZS((IIU-1)/2,1)      ,XZS(IIU,1)  
+END IF
+!
+IF(NVERB >= 10) THEN       !Value control
+  WRITE(ILUOUT,*) 'SPAWN_MODEL2: Some XUT values:'
+  WRITE(ILUOUT,*) ' (1,IJU/2,JK) (IIU/2,1,JK) (IIU/2,IJU/2,JK) &
+                   &(IIU/2,IJU,JK) (IIU,IJU/2,JK)'
+  DO JKLOOP=1,IKU
+    WRITE(ILUOUT,*) 'JK = ',JKLOOP
+    WRITE(ILUOUT,*) XUT(1,IJU/2,JKLOOP),XUT(IIU/2,1,JKLOOP),       &
+                    XUT(IIU/2,IJU/2,JKLOOP),XUT(IIU/2,IJU,JKLOOP), &
+                    XUT(IIU,IJU/2,JKLOOP)
+  END DO
+  WRITE(ILUOUT,*) 'SPAWN_MODEL2: Some XVT values:'
+  WRITE(ILUOUT,*) ' (1,IJU/2,JK) (IIU/2,1,JK) (IIU/2,IJU/2,JK) &
+                   &(IIU/2,IJU,JK) (IIU,IJU/2,JK)'
+  DO JKLOOP=1,IKU
+    WRITE(ILUOUT,*) 'JK = ',JKLOOP
+    WRITE(ILUOUT,*) XVT(1,IJU/2,JKLOOP),XVT(IIU/2,1,JKLOOP),       &
+                    XVT(IIU/2,IJU/2,JKLOOP),XVT(IIU/2,IJU,JKLOOP), &
+                    XVT(IIU,IJU/2,JKLOOP)
+  END DO
+  WRITE(ILUOUT,*) 'SPAWN_MODEL2: Some XWT values:'
+  WRITE(ILUOUT,*) ' (1,IJU/2,JK) (IIU/2,1,JK) (IIU/2,IJU/2,JK) &
+                   &(IIU/2,IJU,JK) (IIU,IJU/2,JK)'
+  DO JKLOOP=1,IKU
+    WRITE(ILUOUT,*) 'JK = ',JKLOOP
+    WRITE(ILUOUT,*) XWT(1,IJU/2,JKLOOP),XWT(IIU/2,1,JKLOOP),       &
+                    XWT(IIU/2,IJU/2,JKLOOP),XWT(IIU/2,IJU,JKLOOP), &
+                    XWT(IIU,IJU/2,JKLOOP)
+  END DO
+  WRITE(ILUOUT,*) 'SPAWN_MODEL2: Some XTHT values:'
+  WRITE(ILUOUT,*) ' (1,IJU/2,JK) (IIU/2,1,JK) (IIU/2,IJU/2,JK) &
+                   &(IIU/2,IJU,JK) (IIU,IJU/2,JK)'
+  DO JKLOOP=1,IKU
+    WRITE(ILUOUT,*) 'JK = ',JKLOOP
+    WRITE(ILUOUT,*) XTHT(1,IJU/2,JKLOOP),XTHT(IIU/2,1,JKLOOP),       &
+                    XTHT(IIU/2,IJU/2,JKLOOP),XTHT(IIU/2,IJU,JKLOOP), &
+                    XTHT(IIU,IJU/2,JKLOOP)
+  END DO
+  IF(NRR >= 1) THEN
+    WRITE(ILUOUT,*) 'SPAWN_MODEL2: Some XRT values:'
+    WRITE(ILUOUT,*) ' (1,IJU/2,JK) (IIU/2,1,JK) (IIU/2,IJU/2,JK) &
+                     &(IIU/2,IJU,JK) (IIU,IJU/2,JK)'
+    DO JKLOOP=1,IKU
+      WRITE(ILUOUT,*) 'JK = ',JKLOOP
+      WRITE(ILUOUT,*) XRT(1,IJU/2,JKLOOP,1),XRT(IIU/2,1,JKLOOP,1),       &
+                      XRT(IIU/2,IJU/2,JKLOOP,1),XRT(IIU/2,IJU,JKLOOP,1), &
+                      XRT(IIU,IJU/2,JKLOOP,1)
+    END DO
+  END IF
+  !
+  IF (LUV_FLX) THEN
+    WRITE(ILUOUT,*)'SPAWN_MODEL2: Some EDDY_FLUX values XVU_FLUX(IIU/2,2,:)=',XVU_FLUX_M(IIU/2,2,:)
+  END IF
+  !
+  IF (LTH_FLX) THEN
+    WRITE(ILUOUT,*)'SPAWN_MODEL2: Some EDDY_FLUX values XVTH_FLUX(IIU/2,2,:)=',XVTH_FLUX_M(IIU/2,2,:)
+    WRITE(ILUOUT,*)'SPAWN_MODEL2: Some EDDY_FLUX values XWTH_FLUX(IIU/2,2,:)=',XWTH_FLUX_M(IIU/2,2,:)
+  END IF
+  !
+END IF
+!
+WRITE(ILUOUT,*) 'SPAWN_MODEL2: SPAWN_MODEL2 ENDS CORRECTLY.'
+!
+CALL SECOND_MNH (ZEND)
+!
+ZTOT        = ZEND - ZSTART          ! for computing time analysis
+!
+ZALL = ZGRID2 + ZSURF2 + ZMISC + ZFIELD2 + ZVER + ZPRESSURE2 + ZANEL + ZWRITE
+!
+ZPERCALL  = 100.*ZALL/ZTOT
+!
+ZPERCGRID2  = 100.*ZGRID2/ZTOT
+ZPERCSURF2  = 100.*ZSURF2/ZTOT
+ZPERCMISC   = 100.*ZMISC/ZTOT
+ZPERCFIELD2 = 100.*ZFIELD2/ZTOT
+ZPERCVER    = 100.*ZVER/ZTOT
+ZPERCPRESSURE2 = 100.*ZPRESSURE2/ZTOT
+ZPERCANEL   = 100.*ZANEL/ZTOT
+ZPERCWRITE  = 100.*ZWRITE/ZTOT
+!
+WRITE(ILUOUT,*)
+WRITE(ILUOUT,*) ' ------------------------------------------------------------ '
+WRITE(ILUOUT,*) '|                                                            |'
+WRITE(ILUOUT,*) '|           COMPUTING TIME ANALYSIS in SPAWN_MODEL2          |'
+WRITE(ILUOUT,*) '|                                                            |'
+WRITE(ILUOUT,*) '|------------------------------------------------------------|'
+WRITE(ILUOUT,*) '|                     |                   |                  |'
+WRITE(ILUOUT,*) '|    ROUTINE NAME     |     CPU-TIME      |   PERCENTAGE %   |'
+WRITE(ILUOUT,*) '|                     |                   |                  |'
+WRITE(ILUOUT,*) '|---------------------|-------------------|------------------|'
+WRITE(ILUOUT,*) '|                     |                   |                  |'
+WRITE(UNIT=ILUOUT,FMT=1) ZGRID2 ,ZPERCGRID2
+WRITE(UNIT=ILUOUT,FMT=3) ZFIELD2,ZPERCFIELD2
+WRITE(UNIT=ILUOUT,FMT=8) ZVER,ZPERCVER
+WRITE(UNIT=ILUOUT,FMT=7) ZPRESSURE2,ZPERCPRESSURE2
+WRITE(UNIT=ILUOUT,FMT=2) ZSURF2 ,ZPERCSURF2
+WRITE(UNIT=ILUOUT,FMT=4) ZANEL  ,ZPERCANEL
+WRITE(UNIT=ILUOUT,FMT=5) ZWRITE ,ZPERCWRITE
+WRITE(UNIT=ILUOUT,FMT=9) ZMISC  ,ZPERCMISC
+WRITE(UNIT=ILUOUT,FMT=6) ZTOT   ,ZPERCALL
+WRITE(ILUOUT,*) ' ------------------------------------------------------------ '
+!
+!                  FORMATS
+!                  -------
+!
+1  FORMAT(' |    SPAWN_GRID2      |     ',F8.3,'      |     ',F8.3,'     |')
+3  FORMAT(' |    SPAWN_FIELD2     |     ',F8.3,'      |     ',F8.3,'     |')
+8  FORMAT(' |  VER_INTERP_FIELD   |     ',F8.3,'      |     ',F8.3,'     |')
+7  FORMAT(' |  SPAWN_PRESSURE2    |     ',F8.3,'      |     ',F8.3,'     |')
+2  FORMAT(' |    SPAWN_SURF2      |     ',F8.3,'      |     ',F8.3,'     |')
+4  FORMAT(' |   ANEL_BALANCE2     |     ',F8.3,'      |     ',F8.3,'     |')
+5  FORMAT(' |      WRITE          |     ',F8.3,'      |     ',F8.3,'     |')
+9  FORMAT(' |   MISCELLANEOUS     |     ',F8.3,'      |     ',F8.3,'     |')
+6  FORMAT(' |    SPAWN_MODEL2     |     ',F8.3,'      |     ',F8.3,'     |')
+!
+!
+CALL IO_File_close(TLUOUT)
+!
+9900  FORMAT(' K = 001    ZHAT = ',E14.7)
+9901  FORMAT(' K = ',I3.3,'    ZHAT = ',E14.7,'    DZ = ' ,E14.7)
+!
+!-------------------------------------------------------------------------------
+!
+!
+! Switch back to model index of calling routine
+CALL GOTO_MODEL(IMI)
+!
+END SUBROUTINE SPAWN_MODEL2
diff --git a/src/PHYEX/ext/switch_sbg_lesn.f90 b/src/PHYEX/ext/switch_sbg_lesn.f90
new file mode 100644
index 0000000000000000000000000000000000000000..2920680faff50dbca286eaea17c310b045650675
--- /dev/null
+++ b/src/PHYEX/ext/switch_sbg_lesn.f90
@@ -0,0 +1,589 @@
+!MNH_LIC Copyright 1994-2014 CNRS, Meteo-France and Universite Paul Sabatier
+!MNH_LIC This is part of the Meso-NH software governed by the CeCILL-C licence
+!MNH_LIC version 1. See LICENSE, CeCILL-C_V1-en.txt and CeCILL-C_V1-fr.txt  
+!MNH_LIC for details. version 1.
+!-----------------------------------------------------------------
+!--------------- special set of characters for RCS information
+!-----------------------------------------------------------------
+! $Source$ $Revision$ $Date$
+!-----------------------------------------------------------------
+!-----------------------------------------------------------------
+!     ########################## 
+      SUBROUTINE SWITCH_SBG_LES_n
+!     ##########################
+!
+!!****  *SWITCH_SBG_LESn* - moves LES subgrid quantities from modd_les
+!!                          to modd_lesn or the contrary.
+!!
+!!    PURPOSE
+!!    -------
+!
+!!
+!!**  IMPLICIT ARGUMENTS
+!!    ------------------ 
+!!
+!!    REFERENCE
+!!    ---------
+!!      
+!!
+!!    AUTHOR
+!!    ------
+!!	   V. Masson   *Meteo France*
+!!
+!!    MODIFICATIONS
+!!    -------------
+!!      Original    June 14, 2002                
+!!
+!-------------------------------------------------------------------------------
+!
+!*       0.   DECLARATIONS
+!             ------------
+!
+USE MODD_LES
+USE MODD_LES_n
+USE MODD_CONF_n
+USE MODD_NSV
+!
+USE MODI_SECOND_MNH
+!
+IMPLICIT NONE
+!
+REAL :: ZTIME1, ZTIME2
+!-------------------------------------------------------------------------------
+!
+!*      7.4  interactions of resolved and subgrid quantities
+!            -----------------------------------------------
+!
+CALL SECOND_MNH(ZTIME1)
+!
+IF (.NOT.   ASSOCIATED (X_LES_RES_W_SBG_WThl) ) THEN
+!                                                                           ______
+  CALL LES_ALLOCATE('X_LES_RES_W_SBG_WThl',(/NLES_K,NLES_TIMES,NLES_MASKS/))!  <w'w'Thl'>
+!                                                                        _____
+  CALL LES_ALLOCATE('X_LES_RES_W_SBG_Thl2',(/NLES_K,NLES_TIMES,NLES_MASKS/))!  <w'Thl'2>
+!                                                                              _____
+  CALL LES_ALLOCATE('X_LES_RES_ddxa_U_SBG_UaU',(/NLES_K,NLES_TIMES,NLES_MASKS/))!  <du'/dxa ua'u'>
+!                                                                              _____
+  CALL LES_ALLOCATE('X_LES_RES_ddxa_V_SBG_UaV',(/NLES_K,NLES_TIMES,NLES_MASKS/))!  <dv'/dxa ua'v'>
+!                                                                             _____
+  CALL LES_ALLOCATE('X_LES_RES_ddxa_W_SBG_UaW',(/NLES_K,NLES_TIMES,NLES_MASKS/))!  <dw'/dxa ua'w'>
+!                                                                              _______
+  CALL LES_ALLOCATE('X_LES_RES_ddxa_W_SBG_UaThl',(/NLES_K,NLES_TIMES,NLES_MASKS/))!  <dw'/dxa ua'Thl'>
+!                                                                                _____
+  CALL LES_ALLOCATE('X_LES_RES_ddxa_Thl_SBG_UaW',(/NLES_K,NLES_TIMES,NLES_MASKS/))!  <dThl'/dxa ua'w'>
+!                                                                                  ___
+  CALL LES_ALLOCATE('X_LES_RES_ddz_Thl_SBG_W2',(/NLES_K,NLES_TIMES,NLES_MASKS/))!  <dThl'/dz w'2>
+!                                                                                _______
+  CALL LES_ALLOCATE('X_LES_RES_ddxa_Thl_SBG_UaThl',(/NLES_K,NLES_TIMES,NLES_MASKS/))!  <dThl'/dxa ua'Thl'>
+!
+  IF (LUSERV) THEN
+!                                                                          _____
+    CALL LES_ALLOCATE('X_LES_RES_W_SBG_WRt',(/NLES_K,NLES_TIMES,NLES_MASKS/))!  <w'w'Rt'>
+!                                                                           ____
+    CALL LES_ALLOCATE('X_LES_RES_W_SBG_Rt2',(/NLES_K,NLES_TIMES,NLES_MASKS/))!  <w'Rt'2>
+!                                                                          _______
+    CALL LES_ALLOCATE('X_LES_RES_W_SBG_ThlRt',(/NLES_K,NLES_TIMES,NLES_MASKS/))!  <w'Thl'Rt'>
+!                                                                                ______
+    CALL LES_ALLOCATE('X_LES_RES_ddxa_W_SBG_UaRt',(/NLES_K,NLES_TIMES,NLES_MASKS/))!  <dw'/dxa ua'Rt'>
+!                                                                                 _____
+    CALL LES_ALLOCATE('X_LES_RES_ddxa_Rt_SBG_UaW',(/NLES_K,NLES_TIMES,NLES_MASKS/))!  <dRt'/dxa ua'w'>
+!                                                                                   ___
+    CALL LES_ALLOCATE('X_LES_RES_ddz_Rt_SBG_W2',(/NLES_K,NLES_TIMES,NLES_MASKS/))!  <dRt'/dz w'2>
+!                                                                                  ______
+    CALL LES_ALLOCATE('X_LES_RES_ddxa_Thl_SBG_UaRt',(/NLES_K,NLES_TIMES,NLES_MASKS/))!  <dThl'/dxa ua'Rt'>
+!                                                                                 _______
+    CALL LES_ALLOCATE('X_LES_RES_ddxa_Rt_SBG_UaThl',(/NLES_K,NLES_TIMES,NLES_MASKS/))!  <dRt'/dxa ua'Thl'>
+!                                                                                  ______
+    CALL LES_ALLOCATE('X_LES_RES_ddxa_Rt_SBG_UaRt',(/NLES_K,NLES_TIMES,NLES_MASKS/)) !  <dRt'/dxa ua'Rt'>
+  ELSE
+    CALL LES_ALLOCATE('X_LES_RES_W_SBG_WRt',(/0,0,0/))
+    CALL LES_ALLOCATE('X_LES_RES_W_SBG_Rt2',(/0,0,0/))
+    CALL LES_ALLOCATE('X_LES_RES_W_SBG_ThlRt',(/0,0,0/))
+    CALL LES_ALLOCATE('X_LES_RES_ddxa_W_SBG_UaRt',(/0,0,0/))
+    CALL LES_ALLOCATE('X_LES_RES_ddxa_Rt_SBG_UaW',(/0,0,0/))
+    CALL LES_ALLOCATE('X_LES_RES_ddz_Rt_SBG_W2',(/0,0,0/))
+    CALL LES_ALLOCATE('X_LES_RES_ddxa_Thl_SBG_UaRt',(/0,0,0/))
+    CALL LES_ALLOCATE('X_LES_RES_ddxa_Rt_SBG_UaThl',(/0,0,0/))
+    CALL LES_ALLOCATE('X_LES_RES_ddxa_Rt_SBG_UaRt',(/0,0,0/))
+  END IF
+!                                                                                   ______
+CALL LES_ALLOCATE('X_LES_RES_ddxa_W_SBG_UaSv',(/NLES_K,NLES_TIMES,NLES_MASKS,NSV/))  !  <dw'/dxa ua'Sv'>
+!                                                                                    _____
+CALL LES_ALLOCATE('X_LES_RES_ddxa_Sv_SBG_UaW',(/NLES_K,NLES_TIMES,NLES_MASKS,NSV/))  !  <dSv'/dxa ua'w'>
+!                                                                                    ___
+CALL LES_ALLOCATE('X_LES_RES_ddz_Sv_SBG_W2',(/NLES_K,NLES_TIMES,NLES_MASKS,NSV/) ) !  <dSv'/dz w'2>
+!                                                                                   ______
+CALL LES_ALLOCATE('X_LES_RES_ddxa_Sv_SBG_UaSv',(/NLES_K,NLES_TIMES,NLES_MASKS,NSV/))  !  <dSv'/dxa ua'Sv'>
+!                                                                             _____
+CALL LES_ALLOCATE('X_LES_RES_W_SBG_WSv',(/NLES_K,NLES_TIMES,NLES_MASKS,NSV/))  !  <w'w'Sv'>
+!                                                                             ____
+CALL LES_ALLOCATE('X_LES_RES_W_SBG_Sv2',(/NLES_K,NLES_TIMES,NLES_MASKS,NSV/))  !  <w'Sv'2>
+!
+!
+  X_LES_RES_W_SBG_WThl         = XLES_RES_W_SBG_WThl
+  X_LES_RES_W_SBG_Thl2         = XLES_RES_W_SBG_Thl2
+  X_LES_RES_ddxa_U_SBG_UaU     = XLES_RES_ddxa_U_SBG_UaU
+  X_LES_RES_ddxa_V_SBG_UaV     = XLES_RES_ddxa_V_SBG_UaV
+  X_LES_RES_ddxa_W_SBG_UaW     = XLES_RES_ddxa_W_SBG_UaW
+  X_LES_RES_ddxa_W_SBG_UaThl   = XLES_RES_ddxa_W_SBG_UaThl
+  X_LES_RES_ddxa_Thl_SBG_UaW   = XLES_RES_ddxa_Thl_SBG_UaW
+  X_LES_RES_ddz_Thl_SBG_W2     = XLES_RES_ddz_Thl_SBG_W2
+  X_LES_RES_ddxa_Thl_SBG_UaThl = XLES_RES_ddxa_Thl_SBG_UaThl
+  IF (LUSERV) THEN
+    X_LES_RES_W_SBG_WRt        = XLES_RES_W_SBG_WRt
+    X_LES_RES_W_SBG_Rt2        = XLES_RES_W_SBG_Rt2
+    X_LES_RES_W_SBG_ThlRt      = XLES_RES_W_SBG_ThlRt
+    X_LES_RES_ddxa_W_SBG_UaRt  = XLES_RES_ddxa_W_SBG_UaRt
+    X_LES_RES_ddxa_Rt_SBG_UaW  = XLES_RES_ddxa_Rt_SBG_UaW
+    X_LES_RES_ddz_Rt_SBG_W2    = XLES_RES_ddz_Rt_SBG_W2
+    X_LES_RES_ddxa_Thl_SBG_UaRt= XLES_RES_ddxa_Thl_SBG_UaRt
+    X_LES_RES_ddxa_Rt_SBG_UaThl= XLES_RES_ddxa_Rt_SBG_UaThl
+    X_LES_RES_ddxa_Rt_SBG_UaRt = XLES_RES_ddxa_Rt_SBG_UaRt
+  END IF
+  IF (NSV>0) THEN
+    X_LES_RES_ddxa_W_SBG_UaSv  = XLES_RES_ddxa_W_SBG_UaSv
+    X_LES_RES_ddxa_Sv_SBG_UaW  = XLES_RES_ddxa_Sv_SBG_UaW
+    X_LES_RES_ddz_Sv_SBG_W2    = XLES_RES_ddz_Sv_SBG_W2
+    X_LES_RES_ddxa_Sv_SBG_UaSv = XLES_RES_ddxa_Sv_SBG_UaSv
+    X_LES_RES_W_SBG_WSv        = XLES_RES_W_SBG_WSv
+    X_LES_RES_W_SBG_Sv2        = XLES_RES_W_SBG_Sv2
+  END IF
+!
+!
+  CALL LES_ALLOCATE('X_LES_SUBGRID_U2',(/NLES_K,NLES_TIMES,NLES_MASKS/))     ! <u'2>
+  CALL LES_ALLOCATE('X_LES_SUBGRID_V2',(/NLES_K,NLES_TIMES,NLES_MASKS/))     ! <v'2>
+  CALL LES_ALLOCATE('X_LES_SUBGRID_W2',(/NLES_K,NLES_TIMES,NLES_MASKS/))     ! <w'2>
+  CALL LES_ALLOCATE('X_LES_SUBGRID_Thl2',(/NLES_K,NLES_TIMES,NLES_MASKS/))     ! <Thl'2>
+  CALL LES_ALLOCATE('X_LES_SUBGRID_UV',(/NLES_K,NLES_TIMES,NLES_MASKS/))     ! <u'v'>
+  CALL LES_ALLOCATE('X_LES_SUBGRID_WU',(/NLES_K,NLES_TIMES,NLES_MASKS/))     ! <w'u'>
+  CALL LES_ALLOCATE('X_LES_SUBGRID_WV',(/NLES_K,NLES_TIMES,NLES_MASKS/))     ! <w'v'>
+  CALL LES_ALLOCATE('X_LES_SUBGRID_UThl',(/NLES_K,NLES_TIMES,NLES_MASKS/))     ! <u'Thl'>
+  CALL LES_ALLOCATE('X_LES_SUBGRID_VThl',(/NLES_K,NLES_TIMES,NLES_MASKS/))     ! <v'Thl'>
+  CALL LES_ALLOCATE('X_LES_SUBGRID_WThl',(/NLES_K,NLES_TIMES,NLES_MASKS/))     ! <w'Thl'>
+  CALL LES_ALLOCATE('X_LES_SUBGRID_WThv',(/NLES_K,NLES_TIMES,NLES_MASKS/))  ! <w'Thv'>
+  CALL LES_ALLOCATE('X_LES_SUBGRID_ThlThv',(/NLES_K,NLES_TIMES,NLES_MASKS/))  ! <Thl'Thv'>
+  CALL LES_ALLOCATE('X_LES_SUBGRID_W2Thl',(/NLES_K,NLES_TIMES,NLES_MASKS/))  ! <w'2Thl>
+  CALL LES_ALLOCATE('X_LES_SUBGRID_WThl2',(/NLES_K,NLES_TIMES,NLES_MASKS/))  ! <w'Thl'2>
+  CALL LES_ALLOCATE('X_LES_SUBGRID_DISS_Tke',(/NLES_K,NLES_TIMES,NLES_MASKS/))  ! <epsilon>
+  CALL LES_ALLOCATE('X_LES_SUBGRID_DISS_Thl2',(/NLES_K,NLES_TIMES,NLES_MASKS/))  ! <epsilon_Thl2>
+  CALL LES_ALLOCATE('X_LES_SUBGRID_WP',(/NLES_K,NLES_TIMES,NLES_MASKS/))  ! <w'p'>
+  CALL LES_ALLOCATE('X_LES_SUBGRID_PHI3',(/NLES_K,NLES_TIMES,NLES_MASKS/))  !  phi3
+  CALL LES_ALLOCATE('X_LES_SUBGRID_LMix',(/NLES_K,NLES_TIMES,NLES_MASKS/))  !  Lmix
+  CALL LES_ALLOCATE('X_LES_SUBGRID_LDiss',(/NLES_K,NLES_TIMES,NLES_MASKS/))  !  Ldiss
+  CALL LES_ALLOCATE('X_LES_SUBGRID_Km',(/NLES_K,NLES_TIMES,NLES_MASKS/))  !  Km
+  CALL LES_ALLOCATE('X_LES_SUBGRID_Kh',(/NLES_K,NLES_TIMES,NLES_MASKS/))  !  Kh
+  CALL LES_ALLOCATE('X_LES_SUBGRID_ThlPz',(/NLES_K,NLES_TIMES,NLES_MASKS/))  ! <Thl'dp'/dz>
+  CALL LES_ALLOCATE('X_LES_SUBGRID_UTke',(/NLES_K,NLES_TIMES,NLES_MASKS/))     ! <u'Tke>
+  CALL LES_ALLOCATE('X_LES_SUBGRID_VTke',(/NLES_K,NLES_TIMES,NLES_MASKS/))     ! <v'Tke>
+  CALL LES_ALLOCATE('X_LES_SUBGRID_WTke',(/NLES_K,NLES_TIMES,NLES_MASKS/))     ! <w'Tke>
+  CALL LES_ALLOCATE('X_LES_SUBGRID_ddz_WTke',(/NLES_K,NLES_TIMES,NLES_MASKS/)) ! <dw'Tke/dz>
+
+  CALL LES_ALLOCATE('X_LES_SUBGRID_THLUP_MF',(/NLES_K,NLES_TIMES,NLES_MASKS/))  ! Thl of the Updraft
+  CALL LES_ALLOCATE('X_LES_SUBGRID_RTUP_MF',(/NLES_K,NLES_TIMES,NLES_MASKS/))  ! Rt of the Updraft
+  CALL LES_ALLOCATE('X_LES_SUBGRID_RVUP_MF',(/NLES_K,NLES_TIMES,NLES_MASKS/))  ! Rv of the Updraft
+  CALL LES_ALLOCATE('X_LES_SUBGRID_RCUP_MF',(/NLES_K,NLES_TIMES,NLES_MASKS/))  ! Rc of the Updraft
+  CALL LES_ALLOCATE('X_LES_SUBGRID_RIUP_MF',(/NLES_K,NLES_TIMES,NLES_MASKS/))  ! Ri of the Updraft
+  CALL LES_ALLOCATE('X_LES_SUBGRID_WUP_MF',(/NLES_K,NLES_TIMES,NLES_MASKS/))  ! Thl of the Updraft
+  CALL LES_ALLOCATE('X_LES_SUBGRID_MASSFLUX',(/NLES_K,NLES_TIMES,NLES_MASKS/))  ! Mass Flux
+  CALL LES_ALLOCATE('X_LES_SUBGRID_DETR',(/NLES_K,NLES_TIMES,NLES_MASKS/))  ! Detrainment
+  CALL LES_ALLOCATE('X_LES_SUBGRID_ENTR',(/NLES_K,NLES_TIMES,NLES_MASKS/))  ! Entrainment
+  CALL LES_ALLOCATE('X_LES_SUBGRID_FRACUP',(/NLES_K,NLES_TIMES,NLES_MASKS/))  ! Updraft Fraction 
+  CALL LES_ALLOCATE('X_LES_SUBGRID_THVUP_MF',(/NLES_K,NLES_TIMES,NLES_MASKS/))  ! Thv of the Updraft
+  CALL LES_ALLOCATE('X_LES_SUBGRID_WTHLMF',(/NLES_K,NLES_TIMES,NLES_MASKS/))! Flux of thl   
+  CALL LES_ALLOCATE('X_LES_SUBGRID_WRTMF',(/NLES_K,NLES_TIMES,NLES_MASKS/)) ! Flux of rt
+  CALL LES_ALLOCATE('X_LES_SUBGRID_WTHVMF',(/NLES_K,NLES_TIMES,NLES_MASKS/)) ! Flux of thv 
+  CALL LES_ALLOCATE('X_LES_SUBGRID_WUMF',(/NLES_K,NLES_TIMES,NLES_MASKS/))! Flux of u
+  CALL LES_ALLOCATE('X_LES_SUBGRID_WVMF',(/NLES_K,NLES_TIMES,NLES_MASKS/))! Flux of v
+  
+  IF (LUSERV ) THEN
+    CALL LES_ALLOCATE('X_LES_SUBGRID_Rt2',(/NLES_K,NLES_TIMES,NLES_MASKS/))     ! <Rt'2>
+    CALL LES_ALLOCATE('X_LES_SUBGRID_ThlRt',(/NLES_K,NLES_TIMES,NLES_MASKS/))     ! <Thl'Rt'>
+    CALL LES_ALLOCATE('X_LES_SUBGRID_URt',(/NLES_K,NLES_TIMES,NLES_MASKS/))     ! <u'Rt'>
+    CALL LES_ALLOCATE('X_LES_SUBGRID_VRt',(/NLES_K,NLES_TIMES,NLES_MASKS/))     ! <v'Rt'>
+    CALL LES_ALLOCATE('X_LES_SUBGRID_WRt',(/NLES_K,NLES_TIMES,NLES_MASKS/))     ! <w'Rt'>
+    CALL LES_ALLOCATE('X_LES_SUBGRID_RtThv',(/NLES_K,NLES_TIMES,NLES_MASKS/))     ! <Rt'Thv'>
+    CALL LES_ALLOCATE('X_LES_SUBGRID_W2Rt',(/NLES_K,NLES_TIMES,NLES_MASKS/))     ! <w'2Rt'>
+    CALL LES_ALLOCATE('X_LES_SUBGRID_WThlRt',(/NLES_K,NLES_TIMES,NLES_MASKS/))     ! <w'Thl'Rt'>
+    CALL LES_ALLOCATE('X_LES_SUBGRID_WRt2',(/NLES_K,NLES_TIMES,NLES_MASKS/))     ! <w'Rt'2>
+    CALL LES_ALLOCATE('X_LES_SUBGRID_DISS_Rt2',(/NLES_K,NLES_TIMES,NLES_MASKS/))  ! <epsilon_Rt2>
+    CALL LES_ALLOCATE('X_LES_SUBGRID_DISS_ThlRt',(/NLES_K,NLES_TIMES,NLES_MASKS/)) ! <epsilon_ThlRt>
+    CALL LES_ALLOCATE('X_LES_SUBGRID_RtPz',(/NLES_K,NLES_TIMES,NLES_MASKS/))     ! <Rt'dp'/dz>
+    CALL LES_ALLOCATE('X_LES_SUBGRID_PSI3',(/NLES_K,NLES_TIMES,NLES_MASKS/))     !  psi3  
+  ELSE
+    CALL LES_ALLOCATE('X_LES_SUBGRID_Rt2',(/0,0,0/))
+    CALL LES_ALLOCATE('X_LES_SUBGRID_ThlRt',(/0,0,0/))
+    CALL LES_ALLOCATE('X_LES_SUBGRID_URt',(/0,0,0/))
+    CALL LES_ALLOCATE('X_LES_SUBGRID_VRt',(/0,0,0/))
+    CALL LES_ALLOCATE('X_LES_SUBGRID_WRt',(/0,0,0/))
+    CALL LES_ALLOCATE('X_LES_SUBGRID_RtThv',(/0,0,0/))
+    CALL LES_ALLOCATE('X_LES_SUBGRID_W2Rt',(/0,0,0/))
+    CALL LES_ALLOCATE('X_LES_SUBGRID_WThlRt',(/0,0,0/))
+    CALL LES_ALLOCATE('X_LES_SUBGRID_WRt2',(/0,0,0/))
+    CALL LES_ALLOCATE('X_LES_SUBGRID_DISS_Rt2',(/0,0,0/))
+    CALL LES_ALLOCATE('X_LES_SUBGRID_DISS_ThlRt',(/0,0,0/))
+    CALL LES_ALLOCATE('X_LES_SUBGRID_RtPz',(/0,0,0/))
+    CALL LES_ALLOCATE('X_LES_SUBGRID_PSI3',(/0,0,0/))    
+  END IF
+  IF (LUSERC ) THEN
+    CALL LES_ALLOCATE('X_LES_SUBGRID_Rc2',(/NLES_K,NLES_TIMES,NLES_MASKS/))     ! <Rc'2>
+    CALL LES_ALLOCATE('X_LES_SUBGRID_URc',(/NLES_K,NLES_TIMES,NLES_MASKS/))     ! <u'Rc'>
+    CALL LES_ALLOCATE('X_LES_SUBGRID_VRc',(/NLES_K,NLES_TIMES,NLES_MASKS/))     ! <v'Rc'>
+    CALL LES_ALLOCATE('X_LES_SUBGRID_WRc',(/NLES_K,NLES_TIMES,NLES_MASKS/))     ! <w'Rc'>
+  ELSE
+    CALL LES_ALLOCATE('X_LES_SUBGRID_Rc2',(/0,0,0/))
+    CALL LES_ALLOCATE('X_LES_SUBGRID_URc',(/0,0,0/))
+    CALL LES_ALLOCATE('X_LES_SUBGRID_VRc',(/0,0,0/))
+    CALL LES_ALLOCATE('X_LES_SUBGRID_WRc',(/0,0,0/))
+  END IF
+  IF (LUSERI ) THEN
+    CALL LES_ALLOCATE('X_LES_SUBGRID_Ri2',(/NLES_K,NLES_TIMES,NLES_MASKS/))     ! <Ri'2>
+  ELSE
+    CALL LES_ALLOCATE('X_LES_SUBGRID_Ri2',(/0,0,0/))
+  END IF
+  IF (NSV>0  ) THEN
+    CALL LES_ALLOCATE('X_LES_SUBGRID_USv',(/NLES_K,NLES_TIMES,NLES_MASKS,NSV/)) ! <u'Sv'>
+    CALL LES_ALLOCATE('X_LES_SUBGRID_VSv',(/NLES_K,NLES_TIMES,NLES_MASKS,NSV/)) ! <v'Sv'>
+    CALL LES_ALLOCATE('X_LES_SUBGRID_WSv',(/NLES_K,NLES_TIMES,NLES_MASKS,NSV/)) ! <w'Sv'>
+    CALL LES_ALLOCATE('X_LES_SUBGRID_Sv2',(/NLES_K,NLES_TIMES,NLES_MASKS,NSV/))  ! <Sv'2>
+    CALL LES_ALLOCATE('X_LES_SUBGRID_SvThv',(/NLES_K,NLES_TIMES,NLES_MASKS,NSV/))  ! <Sv'Thv'>
+    CALL LES_ALLOCATE('X_LES_SUBGRID_W2Sv',(/NLES_K,NLES_TIMES,NLES_MASKS,NSV/))  ! <w'2Sv'>
+    CALL LES_ALLOCATE('X_LES_SUBGRID_WSv2',(/NLES_K,NLES_TIMES,NLES_MASKS,NSV/))  ! <w'Sv'2>
+    CALL LES_ALLOCATE('X_LES_SUBGRID_DISS_Sv2',(/NLES_K,NLES_TIMES,NLES_MASKS,NSV/))  ! <epsilon_Sv2>
+    CALL LES_ALLOCATE('X_LES_SUBGRID_SvPz',(/NLES_K,NLES_TIMES,NLES_MASKS,NSV/))  ! <Sv'dp'/dz>
+  ELSE
+    CALL LES_ALLOCATE('X_LES_SUBGRID_USv',(/0,0,0,0/))
+    CALL LES_ALLOCATE('X_LES_SUBGRID_VSv',(/0,0,0,0/))
+    CALL LES_ALLOCATE('X_LES_SUBGRID_WSv',(/0,0,0,0/))
+    CALL LES_ALLOCATE('X_LES_SUBGRID_Sv2',(/0,0,0,0/))
+    CALL LES_ALLOCATE('X_LES_SUBGRID_SvThv',(/0,0,0,0/))
+    CALL LES_ALLOCATE('X_LES_SUBGRID_W2Sv',(/0,0,0,0/))
+    CALL LES_ALLOCATE('X_LES_SUBGRID_WSv2',(/0,0,0,0/))
+    CALL LES_ALLOCATE('X_LES_SUBGRID_DISS_Sv2',(/0,0,0,0/))
+    CALL LES_ALLOCATE('X_LES_SUBGRID_SvPz',(/0,0,0,0/))
+  END IF
+!
+  X_LES_SUBGRID_U2  = XLES_SUBGRID_U2 
+  X_LES_SUBGRID_V2  = XLES_SUBGRID_V2 
+  X_LES_SUBGRID_W2  = XLES_SUBGRID_W2 
+  X_LES_SUBGRID_Thl2= XLES_SUBGRID_Thl2
+  X_LES_SUBGRID_UV  = XLES_SUBGRID_UV 
+  X_LES_SUBGRID_WU  = XLES_SUBGRID_WU
+  X_LES_SUBGRID_WV  = XLES_SUBGRID_WV
+  X_LES_SUBGRID_UThl= XLES_SUBGRID_UThl
+  X_LES_SUBGRID_VThl= XLES_SUBGRID_VThl
+  X_LES_SUBGRID_WThl= XLES_SUBGRID_WThl
+  X_LES_SUBGRID_WThv     = XLES_SUBGRID_WThv
+  X_LES_SUBGRID_ThlThv   = XLES_SUBGRID_ThlThv
+  X_LES_SUBGRID_W2Thl    = XLES_SUBGRID_W2Thl
+  X_LES_SUBGRID_WThl2    = XLES_SUBGRID_WThl2
+  X_LES_SUBGRID_DISS_Tke = XLES_SUBGRID_DISS_Tke
+  X_LES_SUBGRID_DISS_Thl2= XLES_SUBGRID_DISS_Thl2
+  X_LES_SUBGRID_WP       = XLES_SUBGRID_WP
+  X_LES_SUBGRID_PHI3     = XLES_SUBGRID_PHI3
+  X_LES_SUBGRID_LMix     = XLES_SUBGRID_LMix
+  X_LES_SUBGRID_LDiss    = XLES_SUBGRID_LDiss
+  X_LES_SUBGRID_Km       = XLES_SUBGRID_Km
+  X_LES_SUBGRID_Kh       = XLES_SUBGRID_Kh
+  X_LES_SUBGRID_ThlPz    = XLES_SUBGRID_ThlPz
+  X_LES_SUBGRID_UTke= XLES_SUBGRID_UTke
+  X_LES_SUBGRID_VTke= XLES_SUBGRID_VTke
+  X_LES_SUBGRID_WTke= XLES_SUBGRID_WTke
+  X_LES_SUBGRID_ddz_WTke  =XLES_SUBGRID_ddz_WTke
+  
+  X_LES_SUBGRID_THLUP_MF = XLES_SUBGRID_THLUP_MF
+  X_LES_SUBGRID_RTUP_MF = XLES_SUBGRID_RTUP_MF 
+  X_LES_SUBGRID_RVUP_MF = XLES_SUBGRID_RVUP_MF 
+  X_LES_SUBGRID_RCUP_MF = XLES_SUBGRID_RCUP_MF 
+  X_LES_SUBGRID_RIUP_MF = XLES_SUBGRID_RIUP_MF 
+  X_LES_SUBGRID_WUP_MF = XLES_SUBGRID_WUP_MF  
+  X_LES_SUBGRID_MASSFLUX = XLES_SUBGRID_MASSFLUX
+  X_LES_SUBGRID_DETR = XLES_SUBGRID_DETR    
+  X_LES_SUBGRID_ENTR = XLES_SUBGRID_ENTR    
+  X_LES_SUBGRID_FRACUP = XLES_SUBGRID_FRACUP   
+  X_LES_SUBGRID_THVUP_MF = XLES_SUBGRID_THVUP_MF
+  X_LES_SUBGRID_WTHLMF = XLES_SUBGRID_WTHLMF     
+  X_LES_SUBGRID_WRTMF = XLES_SUBGRID_WRTMF   
+  X_LES_SUBGRID_WTHVMF = XLES_SUBGRID_WTHVMF   
+  X_LES_SUBGRID_WUMF = XLES_SUBGRID_WUMF    
+  X_LES_SUBGRID_WVMF = XLES_SUBGRID_WVMF    
+
+  IF (LUSERV ) THEN
+    X_LES_SUBGRID_Rt2  = XLES_SUBGRID_Rt2
+    X_LES_SUBGRID_ThlRt= XLES_SUBGRID_ThlRt
+    X_LES_SUBGRID_URt  = XLES_SUBGRID_URt
+    X_LES_SUBGRID_VRt  = XLES_SUBGRID_VRt
+    X_LES_SUBGRID_WRt  = XLES_SUBGRID_WRt
+    X_LES_SUBGRID_RtThv   = XLES_SUBGRID_RtThv
+    X_LES_SUBGRID_W2Rt    = XLES_SUBGRID_W2Rt
+    X_LES_SUBGRID_WThlRt  = XLES_SUBGRID_WThlRt
+    X_LES_SUBGRID_WRt2    = XLES_SUBGRID_WRt2
+    X_LES_SUBGRID_DISS_Rt2= XLES_SUBGRID_DISS_Rt2
+    X_LES_SUBGRID_DISS_ThlRt= XLES_SUBGRID_DISS_ThlRt
+    X_LES_SUBGRID_RtPz    = XLES_SUBGRID_RtPz
+    X_LES_SUBGRID_PSI3    = XLES_SUBGRID_PSI3  
+  END IF
+  IF (LUSERC ) THEN
+    X_LES_SUBGRID_Rc2 = XLES_SUBGRID_Rc2
+    X_LES_SUBGRID_URc = XLES_SUBGRID_URc
+    X_LES_SUBGRID_VRc = XLES_SUBGRID_VRc
+    X_LES_SUBGRID_WRc = XLES_SUBGRID_WRc
+  END IF
+  IF (LUSERI ) THEN
+    X_LES_SUBGRID_Ri2 = XLES_SUBGRID_Ri2
+  END IF
+  IF (NSV>0  ) THEN
+    X_LES_SUBGRID_USv = XLES_SUBGRID_USv
+    X_LES_SUBGRID_VSv = XLES_SUBGRID_VSv
+    X_LES_SUBGRID_WSv = XLES_SUBGRID_WSv
+    X_LES_SUBGRID_Sv2      = XLES_SUBGRID_Sv2 
+    X_LES_SUBGRID_SvThv    = XLES_SUBGRID_SvThv
+    X_LES_SUBGRID_W2Sv     = XLES_SUBGRID_W2Sv 
+    X_LES_SUBGRID_WSv2     = XLES_SUBGRID_WSv2    
+    X_LES_SUBGRID_DISS_Sv2 = XLES_SUBGRID_DISS_Sv2 
+    X_LES_SUBGRID_SvPz     = XLES_SUBGRID_SvPz  
+  END IF
+!
+!
+  CALL LES_ALLOCATE('X_LES_UW0',(/NLES_TIMES/))
+  CALL LES_ALLOCATE('X_LES_VW0',(/NLES_TIMES/))
+  CALL LES_ALLOCATE('X_LES_USTAR',(/NLES_TIMES/))
+  CALL LES_ALLOCATE('X_LES_Q0',(/NLES_TIMES/))
+  CALL LES_ALLOCATE('X_LES_E0',(/NLES_TIMES/))
+  CALL LES_ALLOCATE('X_LES_SV0',(/NLES_TIMES,NSV/))
+!
+  X_LES_UW0       = XLES_UW0
+  X_LES_VW0       = XLES_VW0
+  X_LES_USTAR     = XLES_USTAR
+  X_LES_Q0        = XLES_Q0
+  X_LES_E0        = XLES_E0
+  IF (NSV>0) X_LES_SV0       = XLES_SV0
+
+ELSE
+!
+  XLES_RES_W_SBG_WThl         = X_LES_RES_W_SBG_WThl
+  XLES_RES_W_SBG_Thl2         = X_LES_RES_W_SBG_Thl2
+  XLES_RES_ddxa_U_SBG_UaU     = X_LES_RES_ddxa_U_SBG_UaU
+  XLES_RES_ddxa_V_SBG_UaV     = X_LES_RES_ddxa_V_SBG_UaV
+  XLES_RES_ddxa_W_SBG_UaW     = X_LES_RES_ddxa_W_SBG_UaW
+  XLES_RES_ddxa_W_SBG_UaThl   = X_LES_RES_ddxa_W_SBG_UaThl
+  XLES_RES_ddxa_Thl_SBG_UaW   = X_LES_RES_ddxa_Thl_SBG_UaW
+  XLES_RES_ddz_Thl_SBG_W2     = X_LES_RES_ddz_Thl_SBG_W2
+  XLES_RES_ddxa_Thl_SBG_UaThl = X_LES_RES_ddxa_Thl_SBG_UaThl
+  IF (LUSERV) THEN
+    XLES_RES_W_SBG_WRt        = X_LES_RES_W_SBG_WRt
+    XLES_RES_W_SBG_Rt2        = X_LES_RES_W_SBG_Rt2
+    XLES_RES_W_SBG_ThlRt      = X_LES_RES_W_SBG_ThlRt
+    XLES_RES_ddxa_W_SBG_UaRt  = X_LES_RES_ddxa_W_SBG_UaRt
+    XLES_RES_ddxa_Rt_SBG_UaW  = X_LES_RES_ddxa_Rt_SBG_UaW
+    XLES_RES_ddz_Rt_SBG_W2    = X_LES_RES_ddz_Rt_SBG_W2
+    XLES_RES_ddxa_Thl_SBG_UaRt= X_LES_RES_ddxa_Thl_SBG_UaRt
+    XLES_RES_ddxa_Rt_SBG_UaThl= X_LES_RES_ddxa_Rt_SBG_UaThl
+    XLES_RES_ddxa_Rt_SBG_UaRt = X_LES_RES_ddxa_Rt_SBG_UaRt
+  END IF
+  IF (NSV>0) THEN
+    XLES_RES_ddxa_W_SBG_UaSv  = X_LES_RES_ddxa_W_SBG_UaSv
+    XLES_RES_ddxa_Sv_SBG_UaW  = X_LES_RES_ddxa_Sv_SBG_UaW
+    XLES_RES_ddz_Sv_SBG_W2    = X_LES_RES_ddz_Sv_SBG_W2
+    XLES_RES_ddxa_Sv_SBG_UaSv = X_LES_RES_ddxa_Sv_SBG_UaSv
+    XLES_RES_W_SBG_WSv        = X_LES_RES_W_SBG_WSv
+    XLES_RES_W_SBG_Sv2        = X_LES_RES_W_SBG_Sv2
+  END IF
+  XLES_SUBGRID_U2  = X_LES_SUBGRID_U2 
+  XLES_SUBGRID_V2  = X_LES_SUBGRID_V2 
+  XLES_SUBGRID_W2  = X_LES_SUBGRID_W2 
+  XLES_SUBGRID_Thl2= X_LES_SUBGRID_Thl2
+  XLES_SUBGRID_UV  = X_LES_SUBGRID_UV 
+  XLES_SUBGRID_WU  = X_LES_SUBGRID_WU
+  XLES_SUBGRID_WV  = X_LES_SUBGRID_WV
+  XLES_SUBGRID_UThl= X_LES_SUBGRID_UThl
+  XLES_SUBGRID_VThl= X_LES_SUBGRID_VThl
+  XLES_SUBGRID_WThl= X_LES_SUBGRID_WThl
+  XLES_SUBGRID_WThv     = X_LES_SUBGRID_WThv
+  XLES_SUBGRID_ThlThv   = X_LES_SUBGRID_ThlThv
+  XLES_SUBGRID_W2Thl    = X_LES_SUBGRID_W2Thl
+  XLES_SUBGRID_WThl2    = X_LES_SUBGRID_WThl2
+  XLES_SUBGRID_DISS_Tke = X_LES_SUBGRID_DISS_Tke
+  XLES_SUBGRID_DISS_Thl2= X_LES_SUBGRID_DISS_Thl2
+  XLES_SUBGRID_WP       = X_LES_SUBGRID_WP
+  XLES_SUBGRID_PHI3     = X_LES_SUBGRID_PHI3
+  XLES_SUBGRID_LMix     = X_LES_SUBGRID_LMix
+  XLES_SUBGRID_LDiss    = X_LES_SUBGRID_LDiss
+  XLES_SUBGRID_Km       = X_LES_SUBGRID_Km
+  XLES_SUBGRID_Kh       = X_LES_SUBGRID_Kh
+  XLES_SUBGRID_ThlPz    = X_LES_SUBGRID_ThlPz
+  XLES_SUBGRID_UTke= X_LES_SUBGRID_UTke
+  XLES_SUBGRID_VTke= X_LES_SUBGRID_VTke
+  XLES_SUBGRID_WTke= X_LES_SUBGRID_WTke
+  XLES_SUBGRID_ddz_WTke  =X_LES_SUBGRID_ddz_WTke
+
+  XLES_SUBGRID_THLUP_MF = X_LES_SUBGRID_THLUP_MF
+  XLES_SUBGRID_RTUP_MF = X_LES_SUBGRID_RTUP_MF 
+  XLES_SUBGRID_RVUP_MF = X_LES_SUBGRID_RVUP_MF 
+  XLES_SUBGRID_RCUP_MF = X_LES_SUBGRID_RCUP_MF 
+  XLES_SUBGRID_RIUP_MF = X_LES_SUBGRID_RIUP_MF 
+  XLES_SUBGRID_WUP_MF = X_LES_SUBGRID_WUP_MF  
+  XLES_SUBGRID_MASSFLUX = X_LES_SUBGRID_MASSFLUX
+  XLES_SUBGRID_DETR = X_LES_SUBGRID_DETR    
+  XLES_SUBGRID_ENTR = X_LES_SUBGRID_ENTR    
+  XLES_SUBGRID_FRACUP = X_LES_SUBGRID_FRACUP   
+  XLES_SUBGRID_THVUP_MF = X_LES_SUBGRID_THVUP_MF
+  XLES_SUBGRID_WTHLMF = X_LES_SUBGRID_WTHLMF     
+  XLES_SUBGRID_WRTMF = X_LES_SUBGRID_WRTMF   
+  XLES_SUBGRID_WTHVMF = X_LES_SUBGRID_WTHVMF   
+  XLES_SUBGRID_WUMF = X_LES_SUBGRID_WUMF    
+  XLES_SUBGRID_WVMF = X_LES_SUBGRID_WVMF    
+  
+  IF (LUSERV ) THEN
+    XLES_SUBGRID_Rt2  = X_LES_SUBGRID_Rt2
+    XLES_SUBGRID_ThlRt= X_LES_SUBGRID_ThlRt
+    XLES_SUBGRID_URt  = X_LES_SUBGRID_URt
+    XLES_SUBGRID_VRt  = X_LES_SUBGRID_VRt
+    XLES_SUBGRID_WRt  = X_LES_SUBGRID_WRt
+    XLES_SUBGRID_RtThv   = X_LES_SUBGRID_RtThv
+    XLES_SUBGRID_W2Rt    = X_LES_SUBGRID_W2Rt
+    XLES_SUBGRID_WThlRt  = X_LES_SUBGRID_WThlRt
+    XLES_SUBGRID_WRt2    = X_LES_SUBGRID_WRt2
+    XLES_SUBGRID_DISS_Rt2= X_LES_SUBGRID_DISS_Rt2
+    XLES_SUBGRID_DISS_ThlRt= X_LES_SUBGRID_DISS_ThlRt
+    XLES_SUBGRID_RtPz    = X_LES_SUBGRID_RtPz
+    XLES_SUBGRID_PSI3    = X_LES_SUBGRID_PSI3
+  END IF
+  IF (LUSERC ) THEN
+    XLES_SUBGRID_Rc2 = X_LES_SUBGRID_Rc2
+    XLES_SUBGRID_URc = X_LES_SUBGRID_URc
+    XLES_SUBGRID_VRc = X_LES_SUBGRID_VRc
+    XLES_SUBGRID_WRc = X_LES_SUBGRID_WRc
+  END IF
+  IF (LUSERI ) THEN
+    XLES_SUBGRID_Ri2 = X_LES_SUBGRID_Ri2
+  END IF
+  IF (NSV>0  ) THEN
+    XLES_SUBGRID_USv = X_LES_SUBGRID_USv
+    XLES_SUBGRID_VSv = X_LES_SUBGRID_VSv
+    XLES_SUBGRID_WSv = X_LES_SUBGRID_WSv
+    XLES_SUBGRID_Sv2      = X_LES_SUBGRID_Sv2 
+    XLES_SUBGRID_SvThv    = X_LES_SUBGRID_SvThv
+    XLES_SUBGRID_W2Sv     = X_LES_SUBGRID_W2Sv 
+    XLES_SUBGRID_WSv2     = X_LES_SUBGRID_WSv2    
+    XLES_SUBGRID_DISS_Sv2 = X_LES_SUBGRID_DISS_Sv2 
+    XLES_SUBGRID_SvPz     = X_LES_SUBGRID_SvPz  
+  END IF
+  XLES_UW0       = X_LES_UW0
+  XLES_VW0       = X_LES_VW0
+  XLES_USTAR     = X_LES_USTAR
+  XLES_Q0        = X_LES_Q0
+  XLES_E0        = X_LES_E0
+  IF (NSV>0) XLES_SV0       = X_LES_SV0
+!
+  CALL LES_DEALLOCATE('X_LES_RES_W_SBG_WThl')
+  CALL LES_DEALLOCATE('X_LES_RES_W_SBG_Thl2')
+  CALL LES_DEALLOCATE('X_LES_RES_ddxa_U_SBG_UaU')
+  CALL LES_DEALLOCATE('X_LES_RES_ddxa_V_SBG_UaV')
+  CALL LES_DEALLOCATE('X_LES_RES_ddxa_W_SBG_UaW')
+  CALL LES_DEALLOCATE('X_LES_RES_ddxa_W_SBG_UaThl')
+  CALL LES_DEALLOCATE('X_LES_RES_ddxa_Thl_SBG_UaW')
+  CALL LES_DEALLOCATE('X_LES_RES_ddz_Thl_SBG_W2')
+  CALL LES_DEALLOCATE('X_LES_RES_ddxa_Thl_SBG_UaThl')
+  CALL LES_DEALLOCATE('X_LES_RES_W_SBG_WRt')
+  CALL LES_DEALLOCATE('X_LES_RES_W_SBG_Rt2')
+  CALL LES_DEALLOCATE('X_LES_RES_W_SBG_ThlRt')
+  CALL LES_DEALLOCATE('X_LES_RES_ddxa_W_SBG_UaRt')
+  CALL LES_DEALLOCATE('X_LES_RES_ddxa_Rt_SBG_UaW')
+  CALL LES_DEALLOCATE('X_LES_RES_ddz_Rt_SBG_W2')
+  CALL LES_DEALLOCATE('X_LES_RES_ddxa_Thl_SBG_UaRt')
+  CALL LES_DEALLOCATE('X_LES_RES_ddxa_Rt_SBG_UaThl')
+  CALL LES_DEALLOCATE('X_LES_RES_ddxa_Rt_SBG_UaRt')
+  CALL LES_DEALLOCATE('X_LES_RES_ddxa_W_SBG_UaSv')
+  CALL LES_DEALLOCATE('X_LES_RES_ddxa_Sv_SBG_UaW')
+  CALL LES_DEALLOCATE('X_LES_RES_ddz_Sv_SBG_W2')
+  CALL LES_DEALLOCATE('X_LES_RES_ddxa_Sv_SBG_UaSv')
+  CALL LES_DEALLOCATE('X_LES_RES_W_SBG_WSv')
+  CALL LES_DEALLOCATE('X_LES_RES_W_SBG_Sv2')
+!
+  CALL LES_DEALLOCATE('X_LES_SUBGRID_U2')
+  CALL LES_DEALLOCATE('X_LES_SUBGRID_V2')
+  CALL LES_DEALLOCATE('X_LES_SUBGRID_W2')
+  CALL LES_DEALLOCATE('X_LES_SUBGRID_Thl2')
+  CALL LES_DEALLOCATE('X_LES_SUBGRID_UV')
+  CALL LES_DEALLOCATE('X_LES_SUBGRID_WU')
+  CALL LES_DEALLOCATE('X_LES_SUBGRID_WV')
+  CALL LES_DEALLOCATE('X_LES_SUBGRID_UThl')
+  CALL LES_DEALLOCATE('X_LES_SUBGRID_VThl')
+  CALL LES_DEALLOCATE('X_LES_SUBGRID_WThl')
+  CALL LES_DEALLOCATE('X_LES_SUBGRID_WThv')
+  CALL LES_DEALLOCATE('X_LES_SUBGRID_ThlThv')
+  CALL LES_DEALLOCATE('X_LES_SUBGRID_W2Thl')
+  CALL LES_DEALLOCATE('X_LES_SUBGRID_WThl2')
+  CALL LES_DEALLOCATE('X_LES_SUBGRID_DISS_Tke')
+  CALL LES_DEALLOCATE('X_LES_SUBGRID_DISS_Thl2')
+  CALL LES_DEALLOCATE('X_LES_SUBGRID_WP')
+  CALL LES_DEALLOCATE('X_LES_SUBGRID_PHI3')
+  CALL LES_DEALLOCATE('X_LES_SUBGRID_LMix')
+  CALL LES_DEALLOCATE('X_LES_SUBGRID_LDiss')
+  CALL LES_DEALLOCATE('X_LES_SUBGRID_Km')
+  CALL LES_DEALLOCATE('X_LES_SUBGRID_Kh')
+  CALL LES_DEALLOCATE('X_LES_SUBGRID_ThlPz')
+  CALL LES_DEALLOCATE('X_LES_SUBGRID_UTke')
+  CALL LES_DEALLOCATE('X_LES_SUBGRID_VTke')
+  CALL LES_DEALLOCATE('X_LES_SUBGRID_WTke')
+  CALL LES_DEALLOCATE('X_LES_SUBGRID_ddz_WTke')
+
+  CALL LES_DEALLOCATE('X_LES_SUBGRID_THLUP_MF')  
+  CALL LES_DEALLOCATE('X_LES_SUBGRID_RTUP_MF')
+  CALL LES_DEALLOCATE('X_LES_SUBGRID_RVUP_MF')
+  CALL LES_DEALLOCATE('X_LES_SUBGRID_RCUP_MF')
+  CALL LES_DEALLOCATE('X_LES_SUBGRID_RIUP_MF')
+  CALL LES_DEALLOCATE('X_LES_SUBGRID_WUP_MF')
+  CALL LES_DEALLOCATE('X_LES_SUBGRID_MASSFLUX')
+  CALL LES_DEALLOCATE('X_LES_SUBGRID_DETR')
+  CALL LES_DEALLOCATE('X_LES_SUBGRID_ENTR')
+  CALL LES_DEALLOCATE('X_LES_SUBGRID_FRACUP')
+  CALL LES_DEALLOCATE('X_LES_SUBGRID_THVUP_MF')
+  CALL LES_DEALLOCATE('X_LES_SUBGRID_WTHLMF')  
+  CALL LES_DEALLOCATE('X_LES_SUBGRID_WRTMF')
+  CALL LES_DEALLOCATE('X_LES_SUBGRID_WTHVMF')
+  CALL LES_DEALLOCATE('X_LES_SUBGRID_WUMF')
+  CALL LES_DEALLOCATE('X_LES_SUBGRID_WVMF')
+  
+  CALL LES_DEALLOCATE('X_LES_SUBGRID_Rt2')
+  CALL LES_DEALLOCATE('X_LES_SUBGRID_ThlRt')
+  CALL LES_DEALLOCATE('X_LES_SUBGRID_URt')
+  CALL LES_DEALLOCATE('X_LES_SUBGRID_VRt')
+  CALL LES_DEALLOCATE('X_LES_SUBGRID_WRt')
+  CALL LES_DEALLOCATE('X_LES_SUBGRID_RtThv')
+  CALL LES_DEALLOCATE('X_LES_SUBGRID_W2Rt')
+  CALL LES_DEALLOCATE('X_LES_SUBGRID_WThlRt')
+  CALL LES_DEALLOCATE('X_LES_SUBGRID_WRt2')
+  CALL LES_DEALLOCATE('X_LES_SUBGRID_DISS_Rt2')
+  CALL LES_DEALLOCATE('X_LES_SUBGRID_DISS_ThlRt')
+  CALL LES_DEALLOCATE('X_LES_SUBGRID_RtPz')
+  CALL LES_DEALLOCATE('X_LES_SUBGRID_PSI3')
+  CALL LES_DEALLOCATE('X_LES_SUBGRID_Rc2')
+  CALL LES_DEALLOCATE('X_LES_SUBGRID_URc')
+  CALL LES_DEALLOCATE('X_LES_SUBGRID_VRc')
+  CALL LES_DEALLOCATE('X_LES_SUBGRID_WRc')
+  CALL LES_DEALLOCATE('X_LES_SUBGRID_Ri2')
+  CALL LES_DEALLOCATE('X_LES_SUBGRID_USv')
+  CALL LES_DEALLOCATE('X_LES_SUBGRID_VSv')
+  CALL LES_DEALLOCATE('X_LES_SUBGRID_WSv')
+  CALL LES_DEALLOCATE('X_LES_SUBGRID_Sv2')
+  CALL LES_DEALLOCATE('X_LES_SUBGRID_SvThv')
+  CALL LES_DEALLOCATE('X_LES_SUBGRID_W2Sv')
+  CALL LES_DEALLOCATE('X_LES_SUBGRID_WSv2')
+  CALL LES_DEALLOCATE('X_LES_SUBGRID_DISS_Sv2')
+  CALL LES_DEALLOCATE('X_LES_SUBGRID_SvPz')
+  !
+  CALL LES_DEALLOCATE('X_LES_UW0')
+  CALL LES_DEALLOCATE('X_LES_VW0')
+  CALL LES_DEALLOCATE('X_LES_USTAR')
+  CALL LES_DEALLOCATE('X_LES_Q0')
+  CALL LES_DEALLOCATE('X_LES_E0')
+  CALL LES_DEALLOCATE('X_LES_SV0')
+!
+END IF
+!
+CALL SECOND_MNH(ZTIME2)
+!
+XTIME_LES = XTIME_LES + ZTIME2 - ZTIME1
+!
+END SUBROUTINE SWITCH_SBG_LES_n
diff --git a/src/PHYEX/ext/to_elec_fieldn.f90 b/src/PHYEX/ext/to_elec_fieldn.f90
new file mode 100644
index 0000000000000000000000000000000000000000..a6822298d897cb7c93e22205048645c57db9da56
--- /dev/null
+++ b/src/PHYEX/ext/to_elec_fieldn.f90
@@ -0,0 +1,184 @@
+!MNH_LIC Copyright 2002-2019 CNRS, Meteo-France and Universite Paul Sabatier
+!MNH_LIC This is part of the Meso-NH software governed by the CeCILL-C licence
+!MNH_LIC version 1. See LICENSE, CeCILL-C_V1-en.txt and CeCILL-C_V1-fr.txt
+!MNH_LIC for details. version 1.
+!-----------------------------------------------------------------
+!      ###########################
+       MODULE MODI_TO_ELEC_FIELD_n
+!      ###########################
+!
+INTERFACE
+      SUBROUTINE TO_ELEC_FIELD_n(PRT, PSVT, PRHODJ, KTCOUNT, KRR, &
+                                 PEFIELDU, PEFIELDV, PEFIELDW, PPHIT)
+!
+INTEGER,                  INTENT(IN)    :: KTCOUNT ! counter value of the 
+                                                   ! model temporal loop
+INTEGER,                  INTENT(IN)    :: KRR     ! Number of moist variables
+!
+REAL, DIMENSION(:,:,:),   INTENT(IN)    :: PRHODJ  ! Jacobian
+REAL, DIMENSION(:,:,:,:), INTENT(IN)    :: PSVT    ! Scalar variables with
+                                                   ! electric charge density
+REAL, DIMENSION(:,:,:,:), INTENT(IN)    :: PRT     ! Mixing ratio 
+REAL, DIMENSION(:,:,:),   INTENT(INOUT) :: PEFIELDU !  3 components 
+REAL, DIMENSION(:,:,:),   INTENT(INOUT) :: PEFIELDV !     of the 
+REAL, DIMENSION(:,:,:),   INTENT(INOUT) :: PEFIELDW ! electric field
+REAL, DIMENSION(:,:,:),   OPTIONAL, INTENT(OUT) :: PPHIT   ! Electrostatic potential
+
+END SUBROUTINE TO_ELEC_FIELD_n
+END INTERFACE
+END MODULE MODI_TO_ELEC_FIELD_n
+!
+!     ###############################################################
+      SUBROUTINE TO_ELEC_FIELD_n(PRT, PSVT, PRHODJ, KTCOUNT, KRR, &
+                                 PEFIELDU, PEFIELDV, PEFIELDW, PPHIT)
+!     ###############################################################
+!
+!
+!!****  * -  compute the electric field
+!!
+!!    PURPOSE
+!!    -------
+!!      The purpose of this routine is to compute...
+!!
+!!
+!!**  METHOD
+!!    ------
+!!
+!!    EXTERNAL
+!!    --------
+!!      None
+!!
+!!
+!!    IMPLICIT ARGUMENTS
+!!    ------------------
+!!
+!!    REFERENCE
+!!    ---------
+!!
+!!    AUTHOR
+!!    ------
+!!      C. Barthe, G. Molinie, J.-P. Pinty      *Laboratoire d'Aerologie*
+!!
+!!    MODIFICATIONS
+!!    -------------
+!!      Original    2002
+!!      C. Barthe   06/11/09   update to version 4.8.1
+!!      M. Chong    26/01/10   Add Small ions 
+!  P. Wautelet 20/05/2019: add name argument to ADDnFIELD_ll + new ADD4DFIELD_ll subroutine
+!!
+!-------------------------------------------------------------------------------
+!
+!*       0.    DECLARATIONS
+!              ------------
+!
+USE MODD_REF_n, ONLY : XRHODREF
+USE MODD_PARAMETERS, ONLY : JPVEXT
+USE MODD_RAIN_ICE_DESCR_n, ONLY : XRTMIN
+USE MODD_ELEC_DESCR, ONLY : XRELAX_ELEC, XECHARGE 
+USE MODD_ELEC_n, ONLY : XESOURCEFW
+!
+USE MODI_ELEC_FIELD_n
+!
+USE MODE_ll
+!
+IMPLICIT NONE
+!
+!*       0.1   Declarations of dummy arguments :
+!
+INTEGER,                  INTENT(IN)    :: KTCOUNT ! counter value of the 
+                                                   ! model temporal loop
+INTEGER,                  INTENT(IN)    :: KRR     ! Number of moist variables
+!
+REAL, DIMENSION(:,:,:),   INTENT(IN)    :: PRHODJ  ! Jacobian
+REAL, DIMENSION(:,:,:,:), INTENT(IN)    :: PSVT    ! Scalar variables with
+                                                   ! electric charge density
+REAL, DIMENSION(:,:,:,:), INTENT(IN)    :: PRT     ! Mixing ratio 
+REAL, DIMENSION(:,:,:),   INTENT(INOUT) :: PEFIELDU !  3 components 
+REAL, DIMENSION(:,:,:),   INTENT(INOUT) :: PEFIELDV !     of the 
+REAL, DIMENSION(:,:,:),   INTENT(INOUT) :: PEFIELDW ! electric field
+REAL, DIMENSION(:,:,:),   OPTIONAL, INTENT(OUT) :: PPHIT   ! Electrostatic potential
+!
+!
+!*       0.2   Declarations of local variables :
+!
+REAL,    DIMENSION(:,:,:),   ALLOCATABLE :: ZW ! work array
+!
+INTEGER :: IIB     ! Define 
+INTEGER :: IIE     !   the 
+INTEGER :: IJB     ! physical  
+INTEGER :: IJE     !  domain
+INTEGER :: IKB     ! 
+INTEGER :: IKE     ! 
+INTEGER :: IIU, IJU, IKU 
+INTEGER :: II
+INTEGER :: IINFO_ll  
+!
+TYPE(LIST_ll), POINTER :: TZFIELDS_ll ! list of fields to exchange
+!
+!
+!-------------------------------------------------------------------------------
+!
+!*       1.     COMPUTE THE LOOP BOUNDS
+!   	        -----------------------
+!
+NULLIFY(TZFIELDS_ll)
+!
+! Compute loop bounds
+!
+CALL GET_PHYSICAL_ll(IIB,IJB,IIE,IJE)
+CALL GET_DIM_EXT_ll('B',IIU,IJU)
+!
+IKB = 1 + JPVEXT
+IKU = SIZE(XESOURCEFW,3)
+IKE = IKU - JPVEXT
+!
+! allocations
+!
+ALLOCATE(ZW(SIZE(PSVT,1),SIZE(PSVT,2),SIZE(PSVT,3)))
+ZW(:,:,:) = 0.
+!
+!
+!-------------------------------------------------------------------------------
+!
+!*       2.     TRANSFORM PSVT from C/kg INTO C/m3 and SUM
+!   	        ----------------------------------
+!
+DO II = 1, KRR+1
+  ZW(:,:,:) = ZW(:,:,:) + PSVT(:,:,:,II) * XRHODREF(:,:,:)
+END DO
+!
+!-------------------------------------------------------------------------------
+!
+!*       3.     BOUNDARY CONDITIONS
+!   	        -------------------
+!
+ZW(:,:,1:IKB-1)        = 0.0 ! Setup to neutralize the computation on the
+                             ! first ligne of the tridiagonal system starting
+                             ! at IKB-1 
+ZW(:,:,IKE:IKE+JPVEXT) = XESOURCEFW(:,:,IKE:IKE+JPVEXT)
+!
+CALL ADD3DFIELD_ll( TZFIELDS_ll, ZW, 'TO_ELEC_FIELD_n::ZW' )
+CALL UPDATE_HALO_ll(TZFIELDS_ll,IINFO_ll)
+CALL CLEANLIST_ll(TZFIELDS_ll)
+!
+!
+!-------------------------------------------------------------------------------
+!
+!*       4.     COMPUTE THE ELECTRIC FIELD
+!   	        --------------------------
+!
+IF (PRESENT(PPHIT)) THEN 
+  CALL ELEC_FIELD_n (ZW, KTCOUNT, XRELAX_ELEC, PRHODJ, &
+                     PEFIELDU, PEFIELDV, PEFIELDW, PPHIT) 
+ELSE 
+  CALL ELEC_FIELD_n (ZW, KTCOUNT, XRELAX_ELEC, PRHODJ, &
+                     PEFIELDU, PEFIELDV, PEFIELDW) 
+ENDIF
+!
+DEALLOCATE(ZW)
+!
+!
+!-------------------------------------------------------------------------------
+!
+END SUBROUTINE TO_ELEC_FIELD_n
+
diff --git a/src/PHYEX/ext/two_wayn.f90 b/src/PHYEX/ext/two_wayn.f90
new file mode 100644
index 0000000000000000000000000000000000000000..b2299ee4ac537dace171013da289b8b8f0fc0b5b
--- /dev/null
+++ b/src/PHYEX/ext/two_wayn.f90
@@ -0,0 +1,1309 @@
+!MNH_LIC Copyright 1997-2020 CNRS, Meteo-France and Universite Paul Sabatier
+!MNH_LIC This is part of the Meso-NH software governed by the CeCILL-C licence
+!MNH_LIC version 1. See LICENSE, CeCILL-C_V1-en.txt and CeCILL-C_V1-fr.txt
+!MNH_LIC for details. version 1.
+!-----------------------------------------------------------------
+!     ###################
+      MODULE MODI_TWO_WAY_n
+!     ###################
+!
+INTERFACE 
+!
+      SUBROUTINE TWO_WAY_n (KRR,KSV,PRHODJ,KMI,PTSTEP,                             &
+                            PUM ,PVM, PWM, PTHM, PRM, PSVM,                        &
+                            PRUS,PRVS,PRWS,PRTHS,PRRS,PRSVS,                       &
+                            PINPRC,PINPRR,PINPRS,PINPRG,PINPRH,PPRCONV,PPRSCONV,   &
+                            PDIRFLASWD,PSCAFLASWD,PDIRSRFSWD,OMASKkids             )
+! 
+INTEGER,                  INTENT(IN)  :: KRR     ! Number of moist variables
+INTEGER,                  INTENT(IN)  :: KSV     ! Number of Scalar Variables
+INTEGER,                  INTENT(IN)  :: KMI     ! Model index     
+!
+REAL,                     INTENT(IN)  :: PTSTEP  ! Timestep duration
+!
+REAL, DIMENSION(:,:,:),   INTENT(IN)  :: PRHODJ         ! (Rho) dry * Jacobian
+!
+REAL, DIMENSION(:,:,:),   INTENT(IN)  :: PUM, PVM, PWM  ! Variables at t-dt 
+REAL, DIMENSION(:,:,:),   INTENT(IN)  :: PTHM
+REAL, DIMENSION(:,:,:,:), INTENT(IN)  :: PRM, PSVM
+!
+REAL, DIMENSION(:,:,:),   INTENT(INOUT) :: PRUS, PRVS, PRWS         ! Source
+REAL, DIMENSION(:,:,:),   INTENT(INOUT) :: PRTHS
+REAL, DIMENSION(:,:,:,:), INTENT(INOUT) :: PRRS, PRSVS              !  terms
+REAL, DIMENSION(:,:), INTENT(INOUT)     :: PINPRC,PINPRR,PINPRS,PINPRG,PINPRH, &
+                                           PPRCONV,PPRSCONV     !  precipitating variables
+LOGICAL, DIMENSION(:,:), INTENT(INOUT)  :: OMASKkids ! true where kids exist
+REAL, DIMENSION(:,:,:), INTENT(INOUT)   :: PDIRFLASWD,PSCAFLASWD   ! Long wave radiation
+REAL, DIMENSION(:,:,:), INTENT(INOUT)   :: PDIRSRFSWD              ! Long wave radiation
+!
+END SUBROUTINE TWO_WAY_n
+!
+END INTERFACE
+!
+END MODULE MODI_TWO_WAY_n
+!     #######################################################################
+      SUBROUTINE TWO_WAY_n (KRR,KSV,PRHODJ,KMI,PTSTEP,                             &
+                            PUM ,PVM, PWM, PTHM, PRM, PSVM,                        &
+                            PRUS,PRVS,PRWS,PRTHS,PRRS,PRSVS,                       &
+                            PINPRC,PINPRR,PINPRS,PINPRG,PINPRH,PPRCONV,PPRSCONV,   &
+                            PDIRFLASWD,PSCAFLASWD,PDIRSRFSWD,OMASKkids             )
+!     #######################################################################
+!
+!!****  *TWO_WAY_n* - Relaxation of all fields toward the average value obtained 
+!!****                by the nested model $n for TWO_WAY interactive gridnesting
+!!
+!!    PURPOSE
+!!    -------
+!!      The purpose of TWO_WAY_n is:
+!!          - first to average the fine scale fields of the inner model $n to
+!!            the coarse mesh scale of the present outer model DAD($n).
+!!          - second to apply the relaxation toward these average fields over the
+!!            intersecting domain
+!
+!
+!!**  METHOD
+!!    ------
+!!      Use a simple top hat horizontal average applied in the inner domain 
+!!    except in a halo inner band of IHALO width (default value 0).
+!!      The relaxation equation writes:
+!!                                                       ___          t-1    
+!!                                              |        \   rhodj * a   |
+!!               d (RHODJ * A)                  | t-1    /__             |
+!!               -------------- = -K  * RHODJ * |A   - ----------------- |
+!!                     dt           2W          |          ___           |
+!!                                              |          \   rhodj     |
+!!                                              |          /__           |
+!!
+!!      In this routine $n denotes the nested model (with all variables X...,N...).
+!!      KMI is the number of father model (all variables P..., K...)
+!!
+!!    EXTERNAL
+!!    --------
+!!
+!!    IMPLICIT ARGUMENTS
+!!    ------------------
+!!
+!!    MODULE MODD_CONF_n :   all
+!!
+!!    MODULE MODD_NESTING:   NDT_2_WAY
+!!
+!!    REFERENCE
+!!    ---------
+!!    
+!!
+!!    AUTHOR
+!!    ------
+!!    J. P. Lafore  *Meteo-France*
+!!
+!!    MODIFICATIONS
+!!    -------------
+!!      Original     12/11/97 
+!!                   20/01/98  remove the TKE and EPS change
+!!      P. Jabouille 03/04/00  parallelisation
+!!      N. Asencio   18/07/05  Add the surface parameters : precipitating
+!!                             hydrometeors, the Short and Long Wave 
+!!                              + MASKkids array
+!!                   20/05/06  Remove EPS
+!!      M. Leriche   16/07/10  Add ice phase chemical species
+!!      V.Masson, C.Lac 08/10  Corrections in relaxation
+!!      J. Escobar   27/06/2011 correction for gridnesting with different SHAPE
+!!      Bosseur & Filippi 07/2013 Adds Forefire
+!!      J.Escobar : 15/09/2015 : WENO5 & JPHEXT <> 1
+!!      Modification    01/2016  (JP Pinty) Add LIMA
+!  P. Wautelet 05/2016-04/2018: new data structures and calls for I/O
+!  P. Wautelet 29/03/2019: bugfix: use correct sizes for 3rd dimension in allocation and loops when CRAD/='NONE'
+!------------------------------------------------------------------------------
+!
+!*      0.   DECLARATIONS
+!            ------------
+USE MODE_ll
+USE MODE_MODELN_HANDLER
+!
+USE MODD_PARAMETERS       ! Declarative modules
+USE MODD_NESTING
+USE MODD_CONF
+USE MODD_NSV
+USE MODD_PARAM_ICE_n,        ONLY : LSEDIC
+USE MODD_PARAM_C2R2,       ONLY : LSEDC
+USE MODD_PARAM_LIMA,       ONLY : NSEDC => LSEDC
+!
+USE MODD_FIELD_n          ! modules relative to the inner (fine scale) model $n
+USE MODD_PRECIP_n          , ONLY : XINPRC,XINPRR,XINPRS,XINPRG,XINPRH
+USE MODD_RADIATIONS_n      ,ONLY:XDIRFLASWD,XSCAFLASWD,XDIRSRFSWD
+USE MODD_DEEP_CONVECTION_n ,ONLY : XPRCONV,XPRSCONV
+USE MODD_REF_n
+USE MODD_CONF_n
+USE MODD_PARAM_n
+USE MODI_SHUMAN
+!
+!
+IMPLICIT NONE
+!
+!*       0.1   declarations of arguments 
+! 
+INTEGER,                  INTENT(IN)  :: KRR     ! Number of moist variables
+INTEGER,                  INTENT(IN)  :: KSV     ! Number of SV (father model)
+INTEGER,                  INTENT(IN)  :: KMI     ! Model index     
+!
+REAL,                     INTENT(IN)  :: PTSTEP  ! Timestep duration
+!
+REAL, DIMENSION(:,:,:),   INTENT(IN)  :: PRHODJ         ! (Rho) dry * Jacobian
+!
+REAL, DIMENSION(:,:,:),   INTENT(IN)  :: PUM, PVM, PWM  ! Variables at t-dt 
+REAL, DIMENSION(:,:,:),   INTENT(IN)  :: PTHM
+REAL, DIMENSION(:,:,:,:), INTENT(IN)  :: PRM, PSVM
+!
+REAL, DIMENSION(:,:,:),   INTENT(INOUT) :: PRUS, PRVS, PRWS         ! Source
+REAL, DIMENSION(:,:,:),   INTENT(INOUT) :: PRTHS
+REAL, DIMENSION(:,:,:,:), INTENT(INOUT) :: PRRS, PRSVS              !  terms
+REAL, DIMENSION(:,:), INTENT(INOUT)     :: PINPRC,PINPRR,PINPRS,PINPRG,PINPRH &
+                                          ,PPRCONV,PPRSCONV     !  precipitating variables
+LOGICAL, DIMENSION(:,:), INTENT(INOUT)  :: OMASKkids ! true where kids exist
+REAL, DIMENSION(:,:,:), INTENT(INOUT)   :: PDIRFLASWD,PSCAFLASWD   ! Long wave radiation
+REAL, DIMENSION(:,:,:), INTENT(INOUT)   :: PDIRSRFSWD              ! Long wave radiation
+!
+!*       0.2   declarations of local variables
+!
+!
+INTEGER  :: IIB,IJB,IIE,IJE
+INTEGER  :: IKU,IKB
+INTEGER  :: II1,II2,IJ1,IJ2,II1U,IJ1V,IWEST,ISOUTH,IDIST
+INTEGER  :: IXOR,IXEND !  horizontal position (i,j) of the ORigin and END
+INTEGER  :: IYOR,IYEND ! of the inner model $n domain, relative to outer model subdomain
+INTEGER  :: IXORU,IYORV ! particular case dure to C grid
+INTEGER  :: IDXRATIO,IDYRATIO  !  x and y-direction resolution RATIO
+INTEGER  :: IXOR_ll,IYOR_ll ! origin's coordinates of extended subdomain
+INTEGER  :: IXDIM,IYDIM ! size of the extended dad subdomain
+!
+INTEGER  :: JX,JY,JVAR ! loop index
+INTEGER  :: IRR,ISV_USER          ! number of moist and scalar var commun to both models
+!
+REAL     :: ZK2W             ! Relaxation value
+REAL, DIMENSION(SIZE(PTHM,1),SIZE(PTHM,2),SIZE(PTHM,3)) :: ZAVE_RHODJ
+!
+! intermediate arrays for model communication
+REAL, DIMENSION(:, :, :), ALLOCATABLE :: ZTUM, ZTVM, ZTWM, ZTTHM
+REAL, DIMENSION(:, :, :, :), ALLOCATABLE :: ZTRM, ZTSVM
+REAL, DIMENSION(:, :, :), ALLOCATABLE :: ZUM, ZVM, ZWM, ZTHM
+REAL, DIMENSION(:, :, :, :), ALLOCATABLE :: ZRM, ZSVM
+REAL, DIMENSION(:, :, :), ALLOCATABLE :: ZTRHODJ, ZTRHODJU, ZTRHODJV
+REAL, DIMENSION(:, :, :), ALLOCATABLE :: ZRHODJ, ZRHODJU, ZRHODJV
+REAL, DIMENSION(:, :), ALLOCATABLE ::ZTINPRC,ZTINPRR,ZTINPRS,ZTINPRG,ZTINPRH,&
+                                     ZTPRCONV,ZTPRSCONV
+REAL, DIMENSION(:, :,:), ALLOCATABLE :: ZTDIRFLASWD,ZTSCAFLASWD
+REAL, DIMENSION(:, :,:), ALLOCATABLE :: ZTDIRSRFSWD
+REAL, DIMENSION(:, :), ALLOCATABLE ::ZINPRC,ZINPRR,ZINPRS,ZINPRG,ZINPRH,&
+                                     ZPRCONV,ZPRSCONV
+REAL, DIMENSION(:, :,:), ALLOCATABLE :: ZDIRFLASWD,ZSCAFLASWD
+REAL, DIMENSION(:, :,:), ALLOCATABLE :: ZDIRSRFSWD
+!
+INTEGER :: IINFO_ll, IDIMX, IDIMY ! size of intermediate arrays
+INTEGER :: IHALO  ! band size where relaxation is not performed
+LOGICAL :: LINTER ! flag for intersection or not with the child domain    
+INTEGER :: IMI    ! Current model index KMI==NDAD(IMI)
+!
+INTEGER  :: IIBC,IJBC,IIEC,IJEC
+!
+!-------------------------------------------------------------------------------
+!
+!*       1.    PROLOGUE:
+!
+IMI = GET_CURRENT_MODEL_INDEX()
+!
+CALL GO_TOMODEL_ll(IMI, IINFO_ll)
+CALL GET_INDICE_ll(IIB,IJB,IIE,IJE)
+!
+CALL GO_TOMODEL_ll(KMI, IINFO_ll)
+CALL GET_CHILD_DIM_ll(IMI, IDIMX, IDIMY, IINFO_ll)
+!
+!  here we need to go back to SON domain for boundaries test
+CALL GO_TOMODEL_ll(IMI, IINFO_ll)
+!
+IKU = SIZE(PTHM,3)
+IKB = JPVEXT+1
+!
+IDXRATIO = NDXRATIO_ALL(IMI)
+IDYRATIO = NDYRATIO_ALL(IMI)
+!
+IRR = MIN(KRR,NRR)
+ISV_USER = MIN(NSV_USER_A(KMI),NSV_USER_A(IMI))
+!
+!             1.1 Allocate array of horizontal average fields
+!
+ALLOCATE(ZTUM(IDIMX, IDIMY, SIZE(PUM, 3)))
+ALLOCATE(ZTVM(IDIMX, IDIMY, SIZE(PUM, 3)))
+ALLOCATE(ZTWM(IDIMX, IDIMY, SIZE(PUM, 3)))
+ALLOCATE(ZTTHM(IDIMX, IDIMY, SIZE(PUM, 3)))
+IF (IRR /= 0) THEN
+  ALLOCATE(ZTRM(IDIMX, IDIMY, SIZE(PUM, 3),IRR))
+              ELSE
+  ALLOCATE(ZTRM(0,0,0,0))
+ENDIF
+IF (KSV /= 0) THEN
+  ALLOCATE(ZTSVM(IDIMX, IDIMY, SIZE(PUM, 3),KSV))
+ELSE
+  ALLOCATE(ZTSVM(0,0,0,0))
+ENDIF
+!
+IF (LUSERC .AND. ( (LSEDIC .AND. CCLOUD(1:3) == 'ICE') .OR.                    &
+                   (LSEDC  .AND. (CCLOUD == 'C2R2' .OR. CCLOUD == 'KHKO')) .OR.&
+                   (NSEDC  .AND. CCLOUD == 'LIMA')                       )) THEN
+  ALLOCATE(ZTINPRC(IDIMX, IDIMY))
+ELSE
+  ALLOCATE(ZTINPRC(0,0))
+ENDIF
+IF (LUSERR) THEN
+  ALLOCATE(ZTINPRR(IDIMX, IDIMY))
+ELSE
+  ALLOCATE(ZTINPRR(0,0))
+ENDIF
+IF (LUSERS) THEN
+  ALLOCATE(ZTINPRS(IDIMX, IDIMY))
+ELSE
+  ALLOCATE(ZTINPRS(0,0))
+ENDIF
+IF (LUSERG) THEN
+  ALLOCATE(ZTINPRG(IDIMX, IDIMY))
+ELSE
+  ALLOCATE(ZTINPRG(0,0))
+ENDIF
+IF (LUSERH) THEN
+  ALLOCATE(ZTINPRH(IDIMX, IDIMY))
+ELSE
+  ALLOCATE(ZTINPRH(0,0))
+ENDIF
+IF (CDCONV /= 'NONE') THEN
+  ALLOCATE(ZTPRCONV (IDIMX, IDIMY))
+  ALLOCATE(ZTPRSCONV(IDIMX, IDIMY))
+                      ELSE
+  ALLOCATE(ZTPRCONV (0,0))
+  ALLOCATE(ZTPRSCONV(0,0))
+END IF
+IF (CRAD /= 'NONE') THEN
+  ALLOCATE(ZTDIRFLASWD(IDIMX, IDIMY, SIZE(PDIRFLASWD,3)))
+  ALLOCATE(ZTSCAFLASWD(IDIMX, IDIMY, SIZE(PSCAFLASWD,3)))
+  ALLOCATE(ZTDIRSRFSWD(IDIMX, IDIMY, SIZE(PDIRSRFSWD,3)))
+ELSE
+  ALLOCATE(ZTDIRFLASWD(0,0,0))
+  ALLOCATE(ZTSCAFLASWD(0,0,0))
+  ALLOCATE(ZTDIRSRFSWD(0,0,0))
+ENDIF
+!
+ALLOCATE(ZTRHODJ (IDIMX, IDIMY, SIZE(PUM, 3)))
+ALLOCATE(ZTRHODJU(IDIMX, IDIMY, SIZE(PUM, 3)))
+ALLOCATE(ZTRHODJV(IDIMX, IDIMY, SIZE(PUM, 3)))
+!
+!
+ZK2W = 1. / (PTSTEP * NDT_2_WAY(NDAD(IMI)))
+!
+!-------------------------------------------------------------------------------
+!
+!*      2.    AVERAGE OF SCALAR VARIABLES
+!             ---------------------------
+!
+IIBC=JPHEXT+2
+IIEC=IDIMX-JPHEXT-1
+IJBC=JPHEXT+2
+IJEC=IDIMY-JPHEXT-1
+!
+!*      2.1  summation of rhodj
+!
+ZTRHODJ(:,:,:) = 0.
+DO JX=1,IDXRATIO
+  DO JY=1,IDYRATIO
+    II1 = IIB+JX-1
+    II2 = IIE+JX-IDXRATIO
+    IJ1 = IJB+JY-1
+    IJ2 = IJE+JY-IDYRATIO
+    ZTRHODJ(IIBC:IIEC,IJBC:IJEC,:) = ZTRHODJ(IIBC:IIEC,IJBC:IJEC,:) &
+                               +XRHODJ(II1:II2:IDXRATIO,IJ1:IJ2:IDYRATIO,:)
+  END DO
+END DO
+!
+!*      2.2  temperature
+!
+ZTTHM(:,:,:) = 0.
+DO JX=1,IDXRATIO
+  DO JY=1,IDYRATIO
+    II1 = IIB+JX-1
+    II2 = IIE+JX-IDXRATIO
+    IJ1 = IJB+JY-1
+    IJ2 = IJE+JY-IDYRATIO
+    ZTTHM(IIBC:IIEC,IJBC:IJEC,:) = ZTTHM(IIBC:IIEC,IJBC:IJEC,:) &
+                           +XRHODJ(II1:II2:IDXRATIO,IJ1:IJ2:IDYRATIO,:) &
+                             *XTHT(II1:II2:IDXRATIO,IJ1:IJ2:IDYRATIO,:)
+!
+  END DO
+END DO
+!
+!
+!*      2.5  moist variables
+!
+DO JVAR=1,IRR
+  ZTRM(:,:,:,JVAR) = 0.
+  DO JX=1,IDXRATIO
+    DO JY=1,IDYRATIO
+      II1 = IIB+JX-1
+      II2 = IIE+JX-IDXRATIO
+      IJ1 = IJB+JY-1
+      IJ2 = IJE+JY-IDYRATIO
+      ZTRM(IIBC:IIEC,IJBC:IJEC,:,JVAR) =  ZTRM(IIBC:IIEC,IJBC:IJEC,:,JVAR)  &
+                             +XRHODJ(II1:II2:IDXRATIO,IJ1:IJ2:IDYRATIO,:)    &
+                                *XRT(II1:II2:IDXRATIO,IJ1:IJ2:IDYRATIO,:,JVAR)
+    END DO
+  END DO 
+END DO
+!
+!*      2.6  scalar variables SV
+!
+! User scalar variables
+IF (KSV /= 0) THEN
+ DO JVAR=1,ISV_USER
+  ZTSVM(:,:,:,JVAR) = 0.
+   DO JX=1,IDXRATIO
+    DO JY=1,IDYRATIO
+      II1 = IIB+JX-1
+      II2 = IIE+JX-IDXRATIO
+      IJ1 = IJB+JY-1
+      IJ2 = IJE+JY-IDYRATIO
+      ZTSVM(IIBC:IIEC,IJBC:IJEC,:,JVAR) = ZTSVM(IIBC:IIEC,IJBC:IJEC,:,JVAR)  &
+                             +XRHODJ(II1:II2:IDXRATIO,IJ1:IJ2:IDYRATIO,:)    &
+                               *XSVT(II1:II2:IDXRATIO,IJ1:IJ2:IDYRATIO,:,JVAR)
+    END DO
+   END DO
+ END DO
+! C2R2 scalar variables 
+IF (NSV_C2R2_A(IMI) > 0) THEN
+  ! nested model uses C2R2 microphysical scheme
+  DO JVAR=1,NSV_C2R2_A(KMI)
+    ZTSVM(:,:,:,JVAR-1+NSV_C2R2BEG_A(KMI)) = 0.
+    DO JX=1,IDXRATIO
+      DO JY=1,IDYRATIO
+        II1 = IIB+JX-1
+        II2 = IIE+JX-IDXRATIO
+        IJ1 = IJB+JY-1
+        IJ2 = IJE+JY-IDYRATIO
+        ZTSVM(IIBC:IIEC,IJBC:IJEC,:,JVAR-1+NSV_C2R2BEG_A(KMI)) = &
+             &ZTSVM(IIBC:IIEC,IJBC:IJEC,:,JVAR-1+NSV_C2R2BEG_A(KMI))+&
+             &XRHODJ(II1:II2:IDXRATIO,IJ1:IJ2:IDYRATIO,:)*&
+             &XSVT(II1:II2:IDXRATIO,IJ1:IJ2:IDYRATIO,:,JVAR-1+NSV_C2R2BEG_A(IMI))
+      END DO
+    END DO
+  END DO
+END IF
+! C1R3 scalar variables 
+IF (NSV_C1R3_A(IMI) > 0) THEN
+  ! nested model uses C1R3 microphysical scheme
+  DO JVAR=1,NSV_C1R3_A(KMI)
+    ZTSVM(:,:,:,JVAR-1+NSV_C1R3BEG_A(KMI)) = 0.
+    DO JX=1,IDXRATIO
+      DO JY=1,IDYRATIO
+        II1 = IIB+JX-1
+        II2 = IIE+JX-IDXRATIO
+        IJ1 = IJB+JY-1
+        IJ2 = IJE+JY-IDYRATIO
+        ZTSVM(IIBC:IIEC,IJBC:IJEC,:,JVAR-1+NSV_C1R3BEG_A(KMI)) = &
+             &ZTSVM(IIBC:IIEC,IJBC:IJEC,:,JVAR-1+NSV_C1R3BEG_A(KMI))+&
+             &XRHODJ(II1:II2:IDXRATIO,IJ1:IJ2:IDYRATIO,:)*&
+             &XSVT(II1:II2:IDXRATIO,IJ1:IJ2:IDYRATIO,:,JVAR-1+NSV_C1R3BEG_A(IMI))
+      END DO
+    END DO
+  END DO
+END IF
+! LIMA scalar variables 
+IF (NSV_LIMA_A(IMI) > 0) THEN
+  ! nested model uses LIMA microphysical scheme
+  DO JVAR=1,NSV_LIMA_A(KMI)
+    ZTSVM(:,:,:,JVAR-1+NSV_LIMA_BEG_A(KMI)) = 0.
+    DO JX=1,IDXRATIO
+      DO JY=1,IDYRATIO
+        II1 = IIB+JX-1
+        II2 = IIE+JX-IDXRATIO
+        IJ1 = IJB+JY-1
+        IJ2 = IJE+JY-IDYRATIO
+        ZTSVM(IIBC:IIEC,IJBC:IJEC,:,JVAR-1+NSV_LIMA_BEG_A(KMI)) = &
+             &ZTSVM(IIBC:IIEC,IJBC:IJEC,:,JVAR-1+NSV_LIMA_BEG_A(KMI))+&
+             &XRHODJ(II1:II2:IDXRATIO,IJ1:IJ2:IDYRATIO,:)*&
+             &XSVT(II1:II2:IDXRATIO,IJ1:IJ2:IDYRATIO,:,JVAR-1+NSV_LIMA_BEG_A(IMI))
+      END DO
+    END DO
+  END DO
+END IF
+! Electrical scalar variables 
+IF (NSV_ELEC_A(IMI) > 0) THEN
+  ! nested model uses electrical scheme
+  DO JVAR=1,NSV_ELEC_A(KMI)
+    ZTSVM(:,:,:,JVAR-1+NSV_ELECBEG_A(KMI)) = 0.
+    DO JX=1,IDXRATIO
+      DO JY=1,IDYRATIO
+        II1 = IIB+JX-1
+        II2 = IIE+JX-IDXRATIO
+        IJ1 = IJB+JY-1
+        IJ2 = IJE+JY-IDYRATIO
+        ZTSVM(IIBC:IIEC,IJBC:IJEC,:,JVAR-1+NSV_ELECBEG_A(KMI)) = &
+             &ZTSVM(IIBC:IIEC,IJBC:IJEC,:,JVAR-1+NSV_ELECBEG_A(KMI))+&
+             &XRHODJ(II1:II2:IDXRATIO,IJ1:IJ2:IDYRATIO,:)*&
+             &XSVT(II1:II2:IDXRATIO,IJ1:IJ2:IDYRATIO,:,JVAR-1+NSV_ELECBEG_A(IMI))
+      END DO
+    END DO
+  END DO
+END IF
+! Chemical scalar variables
+DO JVAR=1,NSV_CHEM_A(KMI)
+  ZTSVM(:,:,:,JVAR-1+NSV_CHEMBEG_A(KMI)) = 0.
+  DO JX=1,IDXRATIO
+    DO JY=1,IDYRATIO
+      II1 = IIB+JX-1
+      II2 = IIE+JX-IDXRATIO
+      IJ1 = IJB+JY-1
+      IJ2 = IJE+JY-IDYRATIO
+      ZTSVM(IIBC:IIEC,IJBC:IJEC,:,JVAR-1+NSV_CHEMBEG_A(KMI)) = &
+           &ZTSVM(IIBC:IIEC,IJBC:IJEC,:,JVAR-1+NSV_CHEMBEG_A(KMI))+&
+           &XRHODJ(II1:II2:IDXRATIO,IJ1:IJ2:IDYRATIO,:)*&
+           &XSVT(II1:II2:IDXRATIO,IJ1:IJ2:IDYRATIO,:,JVAR-1+NSV_CHEMBEG_A(IMI))
+    END DO
+  END DO
+END DO
+! Ice phase chemical scalar variables
+IF (NSV_CHIC_A(IMI) > 0) THEN
+  ! nested model uses aqueous chemistry and ice3/4 scheme
+  DO JVAR=1,NSV_CHIC_A(KMI)
+    ZTSVM(:,:,:,JVAR-1+NSV_CHICBEG_A(KMI)) = 0.
+    DO JX=1,IDXRATIO
+      DO JY=1,IDYRATIO
+        II1 = IIB+JX-1
+        II2 = IIE+JX-IDXRATIO
+        IJ1 = IJB+JY-1
+        IJ2 = IJE+JY-IDYRATIO
+        ZTSVM(IIBC:IIEC,IJBC:IJEC,:,JVAR-1+NSV_CHICBEG_A(KMI)) = &
+             &ZTSVM(IIBC:IIEC,IJBC:IJEC,:,JVAR-1+NSV_CHICBEG_A(KMI))+&
+             &XRHODJ(II1:II2:IDXRATIO,IJ1:IJ2:IDYRATIO,:)*&
+             &XSVT(II1:II2:IDXRATIO,IJ1:IJ2:IDYRATIO,:,JVAR-1+NSV_CHICBEG_A(IMI))
+      END DO
+    END DO
+  END DO
+END IF
+! NOX  variables
+DO JVAR=1,NSV_LNOX_A(KMI)
+  ZTSVM(:,:,:,JVAR-1+NSV_LNOXBEG_A(KMI)) = 0.
+  DO JX=1,IDXRATIO
+    DO JY=1,IDYRATIO
+      II1 = IIB+JX-1
+      II2 = IIE+JX-IDXRATIO
+      IJ1 = IJB+JY-1
+      IJ2 = IJE+JY-IDYRATIO
+      ZTSVM(IIBC:IIEC,IJBC:IJEC,:,JVAR-1+NSV_LNOXBEG_A(KMI)) = &
+           &ZTSVM(IIBC:IIEC,IJBC:IJEC,:,JVAR-1+NSV_LNOXBEG_A(KMI))+&
+           &XRHODJ(II1:II2:IDXRATIO,IJ1:IJ2:IDYRATIO,:)*&
+           &XSVT(II1:II2:IDXRATIO,IJ1:IJ2:IDYRATIO,:,JVAR-1+NSV_LNOXBEG_A(IMI))
+    END DO
+  END DO
+END DO
+! Orilam  scalar variables
+DO JVAR=1,NSV_AER_A(KMI)
+  ZTSVM(:,:,:,JVAR-1+NSV_AERBEG_A(KMI)) = 0.
+  DO JX=1,IDXRATIO
+    DO JY=1,IDYRATIO
+      II1 = IIB+JX-1
+      II2 = IIE+JX-IDXRATIO
+      IJ1 = IJB+JY-1
+      IJ2 = IJE+JY-IDYRATIO
+      ZTSVM(IIBC:IIEC,IJBC:IJEC,:,JVAR-1+NSV_AERBEG_A(KMI)) = &
+           &ZTSVM(IIBC:IIEC,IJBC:IJEC,:,JVAR-1+NSV_AERBEG_A(KMI))+&
+           &XRHODJ(II1:II2:IDXRATIO,IJ1:IJ2:IDYRATIO,:)*&
+           &XSVT(II1:II2:IDXRATIO,IJ1:IJ2:IDYRATIO,:,JVAR-1+NSV_AERBEG_A(IMI))
+    END DO
+  END DO
+END DO
+DO JVAR=1,NSV_AERDEP_A(KMI)
+  ZTSVM(:,:,:,JVAR-1+NSV_AERDEPBEG_A(KMI)) = 0.
+  DO JX=1,IDXRATIO
+    DO JY=1,IDYRATIO
+      II1 = IIB+JX-1
+      II2 = IIE+JX-IDXRATIO
+      IJ1 = IJB+JY-1
+      IJ2 = IJE+JY-IDYRATIO
+      ZTSVM(IIBC:IIEC,IJBC:IJEC,:,JVAR-1+NSV_AERDEPBEG_A(KMI)) = &
+           &ZTSVM(IIBC:IIEC,IJBC:IJEC,:,JVAR-1+NSV_AERDEPBEG_A(KMI))+&
+           &XRHODJ(II1:II2:IDXRATIO,IJ1:IJ2:IDYRATIO,:)*&
+           &XSVT(II1:II2:IDXRATIO,IJ1:IJ2:IDYRATIO,:,JVAR-1+NSV_AERDEPBEG_A(IMI))
+    END DO
+  END DO
+END DO
+! Dust scalar variables
+DO JVAR=1,NSV_DST_A(KMI)
+  ZTSVM(:,:,:,JVAR-1+NSV_DSTBEG_A(KMI)) = 0.
+  DO JX=1,IDXRATIO
+    DO JY=1,IDYRATIO
+      II1 = IIB+JX-1
+      II2 = IIE+JX-IDXRATIO
+      IJ1 = IJB+JY-1
+      IJ2 = IJE+JY-IDYRATIO
+      ZTSVM(IIBC:IIEC,IJBC:IJEC,:,JVAR-1+NSV_DSTBEG_A(KMI)) = &
+           &ZTSVM(IIBC:IIEC,IJBC:IJEC,:,JVAR-1+NSV_DSTBEG_A(KMI))+&
+           &XRHODJ(II1:II2:IDXRATIO,IJ1:IJ2:IDYRATIO,:)*&
+           &XSVT(II1:II2:IDXRATIO,IJ1:IJ2:IDYRATIO,:,JVAR-1+NSV_DSTBEG_A(IMI))
+    END DO
+  END DO
+END DO
+DO JVAR=1,NSV_DSTDEP_A(KMI)
+  ZTSVM(:,:,:,JVAR-1+NSV_DSTDEPBEG_A(KMI)) = 0.
+  DO JX=1,IDXRATIO
+    DO JY=1,IDYRATIO
+      II1 = IIB+JX-1
+      II2 = IIE+JX-IDXRATIO
+      IJ1 = IJB+JY-1
+      IJ2 = IJE+JY-IDYRATIO
+      ZTSVM(IIBC:IIEC,IJBC:IJEC,:,JVAR-1+NSV_DSTDEPBEG_A(KMI)) = &
+           &ZTSVM(IIBC:IIEC,IJBC:IJEC,:,JVAR-1+NSV_DSTDEPBEG_A(KMI))+&
+           &XRHODJ(II1:II2:IDXRATIO,IJ1:IJ2:IDYRATIO,:)*&
+           &XSVT(II1:II2:IDXRATIO,IJ1:IJ2:IDYRATIO,:,JVAR-1+NSV_DSTDEPBEG_A(IMI))
+    END DO
+  END DO
+END DO
+! Salt scalar variables
+DO JVAR=1,NSV_SLT_A(KMI)
+  ZTSVM(:,:,:,JVAR-1+NSV_SLTBEG_A(KMI)) = 0.
+  DO JX=1,IDXRATIO
+    DO JY=1,IDYRATIO
+      II1 = IIB+JX-1
+      II2 = IIE+JX-IDXRATIO
+      IJ1 = IJB+JY-1
+      IJ2 = IJE+JY-IDYRATIO
+      ZTSVM(IIBC:IIEC,IJBC:IJEC,:,JVAR-1+NSV_SLTBEG_A(KMI)) = &
+           &ZTSVM(IIBC:IIEC,IJBC:IJEC,:,JVAR-1+NSV_SLTBEG_A(KMI))+&
+           &XRHODJ(II1:II2:IDXRATIO,IJ1:IJ2:IDYRATIO,:)*&
+           &XSVT(II1:II2:IDXRATIO,IJ1:IJ2:IDYRATIO,:,JVAR-1+NSV_SLTBEG_A(IMI))
+    END DO
+  END DO
+END DO
+DO JVAR=1,NSV_SLTDEP_A(KMI)
+  ZTSVM(:,:,:,JVAR-1+NSV_SLTDEPBEG_A(KMI)) = 0.
+  DO JX=1,IDXRATIO
+    DO JY=1,IDYRATIO
+      II1 = IIB+JX-1
+      II2 = IIE+JX-IDXRATIO
+      IJ1 = IJB+JY-1
+      IJ2 = IJE+JY-IDYRATIO
+      ZTSVM(IIBC:IIEC,IJBC:IJEC,:,JVAR-1+NSV_SLTDEPBEG_A(KMI)) = &
+           &ZTSVM(IIBC:IIEC,IJBC:IJEC,:,JVAR-1+NSV_SLTDEPBEG_A(KMI))+&
+           &XRHODJ(II1:II2:IDXRATIO,IJ1:IJ2:IDYRATIO,:)*&
+           &XSVT(II1:II2:IDXRATIO,IJ1:IJ2:IDYRATIO,:,JVAR-1+NSV_SLTDEPBEG_A(IMI))
+    END DO
+  END DO
+END DO
+! lagrangian variables
+DO JVAR=1,NSV_LG_A(KMI)
+  ZTSVM(:,:,:,JVAR-1+NSV_LGBEG_A(KMI)) = 0.
+  DO JX=1,IDXRATIO
+    DO JY=1,IDYRATIO
+      II1 = IIB+JX-1
+      II2 = IIE+JX-IDXRATIO
+      IJ1 = IJB+JY-1
+      IJ2 = IJE+JY-IDYRATIO
+      ZTSVM(IIBC:IIEC,IJBC:IJEC,:,JVAR-1+NSV_LGBEG_A(KMI)) = &
+           &ZTSVM(IIBC:IIEC,IJBC:IJEC,:,JVAR-1+NSV_LGBEG_A(KMI))+&
+           &XRHODJ(II1:II2:IDXRATIO,IJ1:IJ2:IDYRATIO,:)*&
+           &XSVT(II1:II2:IDXRATIO,IJ1:IJ2:IDYRATIO,:,JVAR-1+NSV_LGBEG_A(IMI))
+    END DO
+  END DO
+END DO
+END IF
+! Passive scalar variables
+IF (NSV_PP_A(IMI) > 0) THEN
+DO JVAR=1,NSV_PP_A(KMI)
+  ZTSVM(:,:,:,JVAR-1+NSV_PPBEG_A(KMI)) = 0.
+  DO JX=1,IDXRATIO
+    DO JY=1,IDYRATIO
+      II1 = IIB+JX-1
+      II2 = IIE+JX-IDXRATIO
+      IJ1 = IJB+JY-1
+      IJ2 = IJE+JY-IDYRATIO
+      ZTSVM(IIBC:IIEC,IJBC:IJEC,:,JVAR-1+NSV_PPBEG_A(KMI)) = &
+           &ZTSVM(IIBC:IIEC,IJBC:IJEC,:,JVAR-1+NSV_PPBEG_A(KMI))+&
+           &XRHODJ(II1:II2:IDXRATIO,IJ1:IJ2:IDYRATIO,:)*&
+           &XSVT(II1:II2:IDXRATIO,IJ1:IJ2:IDYRATIO,:,JVAR-1+NSV_PPBEG_A(IMI))
+    END DO
+  END DO 
+END DO
+END IF
+#ifdef MNH_FOREFIRE
+! ForeFire variables
+IF (NSV_FF_A(IMI) > 0) THEN
+DO JVAR=1,NSV_FF_A(KMI)
+  ZTSVM(:,:,:,JVAR-1+NSV_FFBEG_A(KMI)) = 0.
+  DO JX=1,IDXRATIO
+    DO JY=1,IDYRATIO
+      II1 = IIB+JX-1
+      II2 = IIE+JX-IDXRATIO
+      IJ1 = IJB+JY-1
+      IJ2 = IJE+JY-IDYRATIO
+      ZTSVM(IIBC:IIEC,IJBC:IJEC,:,JVAR-1+NSV_FFBEG_A(KMI)) = &
+           &ZTSVM(IIBC:IIEC,IJBC:IJEC,:,JVAR-1+NSV_FFBEG_A(KMI))+&
+           &XRHODJ(II1:II2:IDXRATIO,IJ1:IJ2:IDYRATIO,:)*&
+           &XSVT(II1:II2:IDXRATIO,IJ1:IJ2:IDYRATIO,:,JVAR-1+NSV_FFBEG_A(IMI))
+    END DO
+  END DO
+END DO
+END IF
+#endif
+! Conditional sampling variables
+IF (NSV_CS_A(IMI) > 0) THEN
+DO JVAR=1,NSV_CS_A(KMI)
+  ZTSVM(:,:,:,JVAR-1+NSV_CSBEG_A(KMI)) = 0.
+  DO JX=1,IDXRATIO
+    DO JY=1,IDYRATIO
+      II1 = IIB+JX-1
+      II2 = IIE+JX-IDXRATIO
+      IJ1 = IJB+JY-1
+      IJ2 = IJE+JY-IDYRATIO
+      ZTSVM(IIBC:IIEC,IJBC:IJEC,:,JVAR-1+NSV_CSBEG_A(KMI)) = &
+           &ZTSVM(IIBC:IIEC,IJBC:IJEC,:,JVAR-1+NSV_CSBEG_A(KMI))+&
+           &XRHODJ(II1:II2:IDXRATIO,IJ1:IJ2:IDYRATIO,:)*&
+           &XSVT(II1:II2:IDXRATIO,IJ1:IJ2:IDYRATIO,:,JVAR-1+NSV_CSBEG_A(IMI))
+    END DO
+  END DO
+END DO
+END IF
+! Precipitating variables
+  IF (LUSERR) THEN
+    ZTINPRR(:,:) = 0.
+    DO JX=1,IDXRATIO
+      DO JY=1,IDYRATIO
+        II1 = IIB+JX-1
+        II2 = IIE+JX-IDXRATIO
+        IJ1 = IJB+JY-1
+        IJ2 = IJE+JY-IDYRATIO
+        ZTINPRR(IIBC:IIEC,IJBC:IJEC) = ZTINPRR(IIBC:IIEC,IJBC:IJEC) &
+                              +XINPRR(II1:II2:IDXRATIO,IJ1:IJ2:IDYRATIO)
+      END DO
+    END DO  
+    ZTINPRR(IIBC:IIEC,IJBC:IJEC)=ZTINPRR(IIBC:IIEC,IJBC:IJEC)/(IDXRATIO*IDYRATIO)
+  END IF
+!
+  IF (LUSERC .AND. ((LSEDIC .AND. CCLOUD(1:3) == 'ICE')      .OR.              &
+                    (LSEDC .AND. (CCLOUD == 'C2R2' .OR. CCLOUD == 'KHKO')) .OR.&
+                    (NSEDC .AND. CCLOUD == 'LIMA')                       )) THEN
+    ZTINPRC(:,:) = 0.
+    DO JX=1,IDXRATIO
+      DO JY=1,IDYRATIO
+        II1 = IIB+JX-1
+        II2 = IIE+JX-IDXRATIO
+        IJ1 = IJB+JY-1
+        IJ2 = IJE+JY-IDYRATIO
+        ZTINPRC(IIBC:IIEC,IJBC:IJEC) = ZTINPRC(IIBC:IIEC,IJBC:IJEC) &
+                              +XINPRC(II1:II2:IDXRATIO,IJ1:IJ2:IDYRATIO)
+      END DO
+    END DO  
+    ZTINPRC(IIBC:IIEC,IJBC:IJEC)=ZTINPRC(IIBC:IIEC,IJBC:IJEC)/(IDXRATIO*IDYRATIO)
+  END IF
+!
+  IF (LUSERS) THEN
+    ZTINPRS(:,:) = 0.
+    DO JX=1,IDXRATIO
+      DO JY=1,IDYRATIO
+        II1 = IIB+JX-1
+        II2 = IIE+JX-IDXRATIO
+        IJ1 = IJB+JY-1
+        IJ2 = IJE+JY-IDYRATIO
+        ZTINPRS(IIBC:IIEC,IJBC:IJEC) = ZTINPRS(IIBC:IIEC,IJBC:IJEC) &
+                              +XINPRS(II1:II2:IDXRATIO,IJ1:IJ2:IDYRATIO)
+      END DO
+    END DO
+    ZTINPRS(IIBC:IIEC,IJBC:IJEC) = ZTINPRS(IIBC:IIEC,IJBC:IJEC)/(IDXRATIO*IDYRATIO)
+  END IF
+!
+  IF (LUSERG) THEN
+    ZTINPRG(:,:) = 0.
+    DO JX=1,IDXRATIO
+      DO JY=1,IDYRATIO
+        II1 = IIB+JX-1
+        II2 = IIE+JX-IDXRATIO
+        IJ1 = IJB+JY-1
+        IJ2 = IJE+JY-IDYRATIO
+        ZTINPRG(IIBC:IIEC,IJBC:IJEC) = ZTINPRG(IIBC:IIEC,IJBC:IJEC) &
+                              +XINPRG(II1:II2:IDXRATIO,IJ1:IJ2:IDYRATIO)
+      END DO
+    END DO  
+    ZTINPRG(IIBC:IIEC,IJBC:IJEC) =ZTINPRG(IIBC:IIEC,IJBC:IJEC)/(IDXRATIO*IDYRATIO)
+  END IF
+!
+  IF (LUSERH) THEN
+    ZTINPRH(:,:) = 0.
+    DO JX=1,IDXRATIO
+      DO JY=1,IDYRATIO
+        II1 = IIB+JX-1
+        II2 = IIE+JX-IDXRATIO
+        IJ1 = IJB+JY-1
+        IJ2 = IJE+JY-IDYRATIO
+        ZTINPRH(IIBC:IIEC,IJBC:IJEC) = ZTINPRH(IIBC:IIEC,IJBC:IJEC) &
+                              +XINPRH(II1:II2:IDXRATIO,IJ1:IJ2:IDYRATIO)
+      END DO
+    END DO  
+    ZTINPRH(IIBC:IIEC,IJBC:IJEC) =ZTINPRH(IIBC:IIEC,IJBC:IJEC)/(IDXRATIO*IDYRATIO)
+  END IF
+!
+  IF (CDCONV /= 'NONE') THEN
+    ZTPRCONV(:,:) = 0.
+    ZTPRSCONV(:,:) = 0.
+    DO JX=1,IDXRATIO
+      DO JY=1,IDYRATIO
+        II1 = IIB+JX-1
+        II2 = IIE+JX-IDXRATIO
+        IJ1 = IJB+JY-1
+        IJ2 = IJE+JY-IDYRATIO
+        ZTPRCONV(IIBC:IIEC,IJBC:IJEC) = ZTPRCONV(IIBC:IIEC,IJBC:IJEC) &
+                              +XPRCONV(II1:II2:IDXRATIO,IJ1:IJ2:IDYRATIO)
+        ZTPRSCONV(IIBC:IIEC,IJBC:IJEC) = ZTPRSCONV(IIBC:IIEC,IJBC:IJEC) &
+                              +XPRSCONV(II1:II2:IDXRATIO,IJ1:IJ2:IDYRATIO)
+      END DO
+    END DO  
+    ZTPRCONV(IIBC:IIEC,IJBC:IJEC) = ZTPRCONV(IIBC:IIEC,IJBC:IJEC)/(IDXRATIO*IDYRATIO)
+    ZTPRSCONV(IIBC:IIEC,IJBC:IJEC) = ZTPRSCONV(IIBC:IIEC,IJBC:IJEC)/(IDXRATIO*IDYRATIO)
+  END IF                           
+! Short Wave and Long Wave variables
+  IF (CRAD /= 'NONE') THEN
+    ZTDIRFLASWD(:,:,:) = 0.
+    ZTSCAFLASWD(:,:,:) = 0.
+    ZTDIRSRFSWD(:,:,:) = 0.
+    DO JX=1,IDXRATIO
+      DO JY=1,IDYRATIO
+        II1 = IIB+JX-1
+        II2 = IIE+JX-IDXRATIO
+        IJ1 = IJB+JY-1
+        IJ2 = IJE+JY-IDYRATIO
+        ZTDIRFLASWD(IIBC:IIEC,IJBC:IJEC,:) = ZTDIRFLASWD(IIBC:IIEC,IJBC:IJEC,:)&
+                           +XDIRFLASWD(II1:II2:IDXRATIO,IJ1:IJ2:IDYRATIO,:)
+        ZTSCAFLASWD(IIBC:IIEC,IJBC:IJEC,:) = ZTSCAFLASWD(IIBC:IIEC,IJBC:IJEC,:)&
+                           +XSCAFLASWD(II1:II2:IDXRATIO,IJ1:IJ2:IDYRATIO,:)
+        ZTDIRSRFSWD(IIBC:IIEC,IJBC:IJEC,:) = ZTDIRSRFSWD(IIBC:IIEC,IJBC:IJEC,:)&
+                           +XDIRSRFSWD(II1:II2:IDXRATIO,IJ1:IJ2:IDYRATIO,:)
+      END DO
+    END DO  
+    ZTDIRFLASWD(IIBC:IIEC,IJBC:IJEC,:) = ZTDIRFLASWD(IIBC:IIEC,IJBC:IJEC,:)/(IDXRATIO*IDYRATIO)
+    ZTSCAFLASWD(IIBC:IIEC,IJBC:IJEC,:) = ZTSCAFLASWD(IIBC:IIEC,IJBC:IJEC,:)/(IDXRATIO*IDYRATIO)
+    ZTDIRSRFSWD(IIBC:IIEC,IJBC:IJEC,:) = ZTDIRSRFSWD(IIBC:IIEC,IJBC:IJEC,:)/(IDXRATIO*IDYRATIO) 
+  END IF
+!
+!-------------------------------------------------------------------------------
+!
+!*      3.    AVERAGE OF WIND VARIABLES
+!             -------------------------
+!
+!*      3.1   vertical wind W
+!
+ZTWM(:,:,:) = 0.
+DO JX=1,IDXRATIO
+  DO JY=1,IDYRATIO
+    II1 = IIB+JX-1
+    II2 = IIE+JX-IDXRATIO
+    IJ1 = IJB+JY-1
+    IJ2 = IJE+JY-IDYRATIO
+    ZTWM(IIBC:IIEC,IJBC:IJEC,IKB) = ZTWM(IIBC:IIEC,IJBC:IJEC,IKB)           &
+                          +2.*XRHODJ(II1:II2:IDXRATIO,IJ1:IJ2:IDYRATIO,IKB) &
+                                *XWT(II1:II2:IDXRATIO,IJ1:IJ2:IDYRATIO,IKB)
+!
+    ZTWM(IIBC:IIEC,IJBC:IJEC,IKB+1:IKU) = ZTWM(IIBC:IIEC,IJBC:IJEC,IKB+1:IKU)    &
+                            +(XRHODJ(II1:II2:IDXRATIO,IJ1:IJ2:IDYRATIO,IKB+1:IKU  ) &
+                            + XRHODJ(II1:II2:IDXRATIO,IJ1:IJ2:IDYRATIO,IKB  :IKU-1))&
+                                *XWT(II1:II2:IDXRATIO,IJ1:IJ2:IDYRATIO,IKB+1:IKU)
+  END DO
+END DO
+!
+!*      3.2   horizontal wind U
+!
+ZTRHODJU(:,:,:) = 0.
+!
+IF(LWEST_ll()) THEN
+  II1U = IIB+IDXRATIO  !C grid
+  IWEST=JPHEXT+3
+ELSE
+  II1U = IIB
+  IWEST=JPHEXT+2
+ENDIF
+!
+II2 = IIE+1-IDXRATIO
+!
+DO JY=1,IDYRATIO
+  IJ1 = IJB+JY-1
+  IJ2 = IJE+JY-IDYRATIO
+  ZTRHODJU(IWEST:IIEC,IJBC:IJEC,:) = ZTRHODJU(IWEST:IIEC,IJBC:IJEC,:) &
+                              +XRHODJ(II1U  :II2  :IDXRATIO,IJ1:IJ2:IDYRATIO,:) &
+                              +XRHODJ(II1U-1:II2-1:IDXRATIO,IJ1:IJ2:IDYRATIO,:)
+END DO
+!
+!
+ZTUM(:,:,:) = 0.
+DO JY=1,IDYRATIO
+  IJ1 = IJB+JY-1
+  IJ2 = IJE+JY-IDYRATIO
+  ZTUM(IWEST:IIEC,IJBC:IJEC,:) = ZTUM(IWEST:IIEC,IJBC:IJEC,:) &
+                              +(XRHODJ(II1U  :II2  :IDXRATIO,IJ1:IJ2:IDYRATIO,:) &
+                              +XRHODJ(II1U-1:II2-1:IDXRATIO,IJ1:IJ2:IDYRATIO,:)) &
+                                 *XUT(II1U  :II2  :IDXRATIO,IJ1:IJ2:IDYRATIO,:)
+END DO
+!
+!
+!*      3.3   horizontal wind V
+!
+ZTRHODJV(:,:,:) = 0.
+!
+IF(LSOUTH_ll() .AND. .NOT. L2D) THEN
+  IJ1V = IJB+IDYRATIO  !C grid
+  ISOUTH=JPHEXT+3
+ELSE
+  IJ1V = IJB
+  ISOUTH=JPHEXT+2
+ENDIF
+!
+IJ2 = IJE+1-IDYRATIO
+!
+DO JX=1,IDXRATIO
+  II1 = IIB+JX-1
+  II2 = IIE+JX-IDXRATIO
+  ZTRHODJV(IIBC:IIEC,ISOUTH:IJEC,:) = ZTRHODJV(IIBC:IIEC,ISOUTH:IJEC,:) &
+                              +XRHODJ(II1:II2:IDXRATIO,IJ1V  :IJ2  :IDYRATIO,:) &
+                              +XRHODJ(II1:II2:IDXRATIO,IJ1V-1:IJ2-1:IDYRATIO,:)
+END DO
+!
+!
+ZTVM(:,:,:) = 0.
+DO JX=1,IDXRATIO
+  II1 = IIB+JX-1
+  II2 = IIE+JX-IDXRATIO
+  ZTVM(IIBC:IIEC,ISOUTH:IJEC,:) = ZTVM(IIBC:IIEC,ISOUTH:IJEC,:) &
+                              +(XRHODJ(II1:II2:IDXRATIO,IJ1V  :IJ2  :IDYRATIO,:) &
+                             + XRHODJ(II1:II2:IDXRATIO,IJ1V-1:IJ2-1:IDYRATIO,:)) &
+                                 *XVT(II1:II2:IDXRATIO,IJ1V  :IJ2  :IDYRATIO,:)
+END DO
+!
+!
+!*        4.   EXCHANGE OF DATA
+!              ----------------
+!
+!
+CALL GO_TOMODEL_ll(IMI, IINFO_ll)
+CALL GET_FEEDBACK_COORD_ll(IXOR,IYOR,IXEND,IYEND,IINFO_ll) ! physical domain's origine
+!
+!
+IF (IINFO_ll == 0) THEN
+  LINTER=.TRUE.
+ELSE
+  LINTER=.FALSE.
+ENDIF
+!
+! Allocate array which will receive average child fields
+!
+IF (LINTER) THEN 
+  ALLOCATE(ZUM(IXOR:IXEND,IYOR:IYEND, SIZE(PUM, 3)))
+  ALLOCATE(ZVM(IXOR:IXEND,IYOR:IYEND, SIZE(PUM, 3)))
+  ALLOCATE(ZWM(IXOR:IXEND,IYOR:IYEND, SIZE(PUM, 3)))
+  ALLOCATE(ZTHM(IXOR:IXEND,IYOR:IYEND, SIZE(PUM, 3)))
+  ALLOCATE(ZRHODJ (IXOR:IXEND,IYOR:IYEND, SIZE(PUM, 3)))
+  ALLOCATE(ZRHODJU(IXOR:IXEND,IYOR:IYEND, SIZE(PUM, 3)))
+  ALLOCATE(ZRHODJV(IXOR:IXEND,IYOR:IYEND, SIZE(PUM, 3)))
+  IF (IRR /= 0) THEN
+    ALLOCATE(ZRM(IXOR:IXEND,IYOR:IYEND, SIZE(PUM, 3),IRR))
+  END IF
+  IF (KSV /= 0) THEN
+    ALLOCATE(ZSVM(IXOR:IXEND,IYOR:IYEND, SIZE(PUM, 3),KSV))
+  ENDIF
+  IF (LUSERR) THEN
+    ALLOCATE(ZINPRR(IXOR:IXEND,IYOR:IYEND))
+  ELSE
+    ALLOCATE(ZINPRR(0,0))
+  END IF
+  IF (LUSERC .AND. ((LSEDIC .AND. CCLOUD(1:3) == 'ICE') .OR.                   &
+                    (LSEDC .AND. (CCLOUD == 'C2R2' .OR. CCLOUD == 'KHKO')) .OR.&
+                    (NSEDC .AND. CCLOUD == 'LIMA')                       )) THEN
+    ALLOCATE(ZINPRC(IXOR:IXEND,IYOR:IYEND))
+  ELSE
+    ALLOCATE(ZINPRC(0,0))
+  END IF
+  IF (LUSERS) THEN
+    ALLOCATE(ZINPRS(IXOR:IXEND,IYOR:IYEND))
+  ELSE
+    ALLOCATE(ZINPRS(0,0))
+  END IF
+  IF (LUSERG) THEN
+    ALLOCATE(ZINPRG(IXOR:IXEND,IYOR:IYEND))
+  ELSE
+    ALLOCATE(ZINPRG(0,0))
+  END IF
+  IF (LUSERH) THEN
+    ALLOCATE(ZINPRH(IXOR:IXEND,IYOR:IYEND))
+  ELSE
+    ALLOCATE(ZINPRH(0,0))
+  END IF
+  IF (CDCONV /= 'NONE') THEN
+    ALLOCATE(ZPRCONV(IXOR:IXEND,IYOR:IYEND))
+    ALLOCATE(ZPRSCONV(IXOR:IXEND,IYOR:IYEND))
+  ELSE
+    ALLOCATE(ZPRCONV(0,0))
+    ALLOCATE(ZPRSCONV(0,0))
+  END IF
+  IF (CRAD /= 'NONE') THEN
+    ALLOCATE(ZDIRFLASWD(IXOR:IXEND,IYOR:IYEND, SIZE(PDIRFLASWD, 3)))  
+    ALLOCATE(ZSCAFLASWD(IXOR:IXEND,IYOR:IYEND, SIZE(PSCAFLASWD, 3))) 
+    ALLOCATE(ZDIRSRFSWD(IXOR:IXEND,IYOR:IYEND, SIZE(PDIRSRFSWD, 3)))  
+  ELSE
+    !3rd dimension size can also be allocated with a zero size
+    ALLOCATE( ZDIRFLASWD(0, 0, SIZE( PDIRFLASWD, 3 )) )
+    ALLOCATE( ZSCAFLASWD(0, 0, SIZE( PSCAFLASWD, 3 )) )
+    ALLOCATE( ZDIRSRFSWD(0, 0, SIZE( PDIRSRFSWD, 3 )) )
+  ENDIF
+ELSE
+  ALLOCATE(ZUM(0,0,0))
+  ALLOCATE(ZVM(0,0,0))
+  ALLOCATE(ZWM(0,0,0))
+  ALLOCATE(ZTHM(0,0,0))
+   IF (IRR /= 0) ALLOCATE(ZRM(0,0,0,IRR))
+   IF (KSV /= 0) ALLOCATE(ZSVM(0,0,0,KSV))
+  ALLOCATE(ZRHODJ (0,0,0))
+  ALLOCATE(ZRHODJU(0,0,0))
+  ALLOCATE(ZRHODJV(0,0,0))
+  ALLOCATE(ZINPRC(0,0))
+  ALLOCATE(ZINPRR(0,0))
+  ALLOCATE(ZINPRS(0,0))
+  ALLOCATE(ZINPRG(0,0))
+  ALLOCATE(ZINPRH(0,0))
+  ALLOCATE(ZPRCONV(0,0))
+  ALLOCATE(ZPRSCONV(0,0))
+  !3rd dimension of ZDIRFLASWD, ZSCAFLASWD and ZDIRSRFSWD is allocated with a not necessarily zero size
+  !because it needs to be to this size for the SET_LSFIELD_2WAY_ll loops if CRAD/='NONE'
+  ALLOCATE( ZDIRFLASWD(0, 0, SIZE( PDIRFLASWD, 3 )) )
+  ALLOCATE( ZSCAFLASWD(0, 0, SIZE( PSCAFLASWD, 3 )) )
+  ALLOCATE( ZDIRSRFSWD(0, 0, SIZE( PDIRSRFSWD, 3 )) )
+ENDIF
+!
+! Initialize the list for the forcing
+!
+CALL SET_LSFIELD_2WAY_ll(ZUM, ZTUM)
+CALL SET_LSFIELD_2WAY_ll(ZVM, ZTVM)
+CALL SET_LSFIELD_2WAY_ll(ZWM, ZTWM)
+CALL SET_LSFIELD_2WAY_ll(ZTHM, ZTTHM)
+DO JVAR=1,IRR
+  CALL SET_LSFIELD_2WAY_ll(ZRM(:,:,:,JVAR), ZTRM(:,:,:,JVAR))
+ENDDO
+DO JVAR=1,KSV
+  CALL SET_LSFIELD_2WAY_ll(ZSVM(:,:,:,JVAR), ZTSVM(:,:,:,JVAR))
+ENDDO
+IF (LUSERR) THEN
+  CALL SET_LSFIELD_2WAY_ll(ZINPRR , ZTINPRR) 
+END IF
+!
+IF (LUSERC .AND. ((LSEDIC .AND. CCLOUD(1:3) == 'ICE') .OR.                   &
+                  (LSEDC .AND. (CCLOUD == 'C2R2' .OR. CCLOUD == 'KHKO')) .OR.&
+                  (NSEDC .AND. CCLOUD == 'LIMA')                       )) THEN
+  CALL SET_LSFIELD_2WAY_ll(ZINPRC , ZTINPRC) 
+END IF
+IF (LUSERS) THEN
+  CALL SET_LSFIELD_2WAY_ll(ZINPRS , ZTINPRS) 
+END IF
+IF (LUSERG) THEN
+  CALL SET_LSFIELD_2WAY_ll(ZINPRG , ZTINPRG) 
+END IF
+IF (LUSERH) THEN
+  CALL SET_LSFIELD_2WAY_ll(ZINPRH , ZTINPRH) 
+END IF
+IF (CDCONV /= 'NONE') THEN
+  CALL SET_LSFIELD_2WAY_ll(ZPRCONV , ZTPRCONV) 
+  CALL SET_LSFIELD_2WAY_ll(ZPRSCONV , ZTPRSCONV) 
+END IF
+IF (CRAD /= 'NONE') THEN
+  DO JVAR = 1, SIZE( PDIRFLASWD, 3 )
+    CALL SET_LSFIELD_2WAY_ll(ZDIRFLASWD(:,:,JVAR) , ZTDIRFLASWD(:,:,JVAR))
+  END DO
+  DO JVAR = 1, SIZE( PSCAFLASWD, 3 )
+    CALL SET_LSFIELD_2WAY_ll(ZSCAFLASWD(:,:,JVAR) , ZTSCAFLASWD(:,:,JVAR))
+  END DO
+  DO JVAR = 1, SIZE( PDIRSRFSWD, 3 )
+    CALL SET_LSFIELD_2WAY_ll(ZDIRSRFSWD(:,:,JVAR) , ZTDIRSRFSWD(:,:,JVAR))
+  END DO
+END IF
+CALL SET_LSFIELD_2WAY_ll(ZRHODJ, ZTRHODJ)
+CALL SET_LSFIELD_2WAY_ll(ZRHODJU, ZTRHODJU)
+CALL SET_LSFIELD_2WAY_ll(ZRHODJV, ZTRHODJV)
+!
+CALL LS_FEEDBACK_ll(IINFO_ll)
+CALL GO_TOMODEL_ll(KMI, IINFO_ll)
+CALL UNSET_LSFIELD_2WAY_ll(IMI)
+!
+DEALLOCATE(ZTUM,ZTVM,ZTWM,ZTTHM,ZTRHODJ,ZTRHODJU,ZTRHODJV)
+DEALLOCATE(ZTRM,ZTSVM)
+DEALLOCATE(ZTINPRC,ZTINPRR,ZTINPRS,ZTINPRG,ZTINPRH,ZTPRCONV,ZTPRSCONV)
+DEALLOCATE(ZTDIRFLASWD,ZTSCAFLASWD,ZTDIRSRFSWD)
+!
+IF (.NOT. LINTER) THEN  ! no computation for the dad subdomain
+  DEALLOCATE(ZUM,ZVM,ZWM,ZTHM,ZRHODJ,ZRHODJU,ZRHODJV)
+  IF (IRR /= 0) DEALLOCATE(ZRM) 
+  IF (KSV /= 0) DEALLOCATE(ZSVM)
+  DEALLOCATE(ZINPRC,ZINPRR,ZINPRS,ZINPRG,ZINPRH,ZPRCONV,ZPRSCONV) 
+  DEALLOCATE(ZDIRFLASWD,ZSCAFLASWD,ZDIRSRFSWD)
+RETURN
+ENDIF
+!
+!
+!          5.  RELAXATION
+!             -----------
+!    5.1   Compute the bounds of relaxation area
+!
+IHALO=2
+!!$IF (JPHEXT/=1) STOP ! boundaries are hard coded supposing JPHEXT=1
+!
+CALL GET_OR_ll('B',IXOR_ll,IYOR_ll)
+CALL GET_DIM_EXT_ll('B',IXDIM,IYDIM)
+!
+IF(LWEST_ll()) THEN
+  IDIST=IXOR_ll+1-(NXOR_ALL(IMI)+1) ! comparison of first physical
+                                    ! points of subdomain and current processor
+ELSE
+  IDIST=IXOR_ll+NHALO-(NXOR_ALL(IMI)+1)! comparison of first physical
+                                       ! points of subdomain and current processor
+ENDIF
+!
+IF(IDIST<=0) THEN       !  west side of the child domain
+  IXOR=IXOR+IHALO
+ENDIF
+!
+IF(IDIST>=1 .AND. IDIST<=IHALO-1) THEN
+  IXOR=IXOR+IHALO-IDIST
+ENDIF
+!
+! C grid for v component
+IF(IDIST >=IHALO+1)             IXORU=IXOR   ! interior child domain
+IF(IDIST>=1 .AND. IDIST<=IHALO) IXORU=IXOR+1 ! partial overlapping of the relaxation area
+IF(IDIST<=0)                    IXORU=IXOR+1
+!
+IF(LEAST_ll()) THEN
+  IDIST=(NXEND_ALL(IMI)-1)-(IXOR_ll-1+IXDIM-1)  ! comparison of last physical
+                                                ! points of subdomain and current processor
+ELSE
+  IDIST=(NXEND_ALL(IMI)-1)-(IXOR_ll-1+IXDIM-NHALO)! comparison of last physical
+                                                  ! points of subdomain and current processor
+ENDIF
+!
+IF(IDIST<=0) IXEND=IXEND-IHALO ! east side of the child domain
+IF(IDIST>=1 .AND. IDIST<=IHALO-1) IXEND=IXEND-IHALO+IDIST
+!
+!
+IF(.NOT.L2D) THEN
+  IF(LSOUTH_ll()) THEN
+    IDIST=IYOR_ll+1-(NYOR_ALL(IMI)+1)! comparison of first physical
+                                     ! points of subdomain and current processor
+  ELSE
+   IDIST=IYOR_ll+NHALO-(NYOR_ALL(IMI)+1)! comparison of first physical
+                                        ! points of subdomain and current processor
+  ENDIF
+!
+  IF(IDIST<=0) THEN       ! south side of the child domain
+    IYOR=IYOR+IHALO
+  ENDIF
+!
+  IF(IDIST>=1 .AND. IDIST<=IHALO-1) THEN
+    IYOR=IYOR+IHALO-IDIST
+  ENDIF
+!
+! C grid for v component
+  IF(IDIST >=IHALO+1)             IYORV=IYOR   ! interior child domain
+  IF(IDIST>=1 .AND. IDIST<=IHALO) IYORV=IYOR+1 ! partial overlapping of the relaxation area
+  IF(IDIST<=0)                    IYORV=IYOR+1
+!
+!
+!
+  IF(LNORTH_ll()) THEN
+    IDIST=(NYEND_ALL(IMI)-1)-(IYOR_ll-1+IYDIM-1)! comparison of last physical
+                                                ! points of subdomain and current processor
+  ELSE
+    IDIST=(NYEND_ALL(IMI)-1)-(IYOR_ll-1+IYDIM-NHALO)! comparison of last physical
+                                                    ! points of subdomain and current processor
+  ENDIF
+  IF(IDIST<=0) IYEND=IYEND-IHALO ! north side of the child domain
+  IF(IDIST>=1 .AND. IDIST<=IHALO-1) IYEND=IYEND-IHALO+IDIST
+!
+ELSE
+  IYORV=IYOR+1   ! no parallelized
+ENDIF
+
+!  at this point, IXOR:IXEND,IYOR:IYEND define the 2way area outside
+!  the relaxation area
+  IF (LUSERR) THEN
+    PINPRR(IXOR:IXEND,IYOR:IYEND)=ZINPRR(IXOR:IXEND,IYOR:IYEND)
+  ENDIF
+  IF (LUSERC .AND. ((LSEDIC .AND. CCLOUD(1:3) == 'ICE') .OR.                   &
+                    (LSEDC .AND. (CCLOUD == 'C2R2' .OR. CCLOUD == 'KHKO')) .OR.&
+                    (NSEDC .AND. CCLOUD == 'LIMA')                       )) THEN
+    PINPRC(IXOR:IXEND,IYOR:IYEND)=ZINPRC(IXOR:IXEND,IYOR:IYEND)
+  ENDIF
+  IF (LUSERS) THEN
+    PINPRS(IXOR:IXEND,IYOR:IYEND)=ZINPRS(IXOR:IXEND,IYOR:IYEND)
+  ENDIF
+  IF (LUSERG) THEN
+    PINPRG(IXOR:IXEND,IYOR:IYEND)=ZINPRG(IXOR:IXEND,IYOR:IYEND)
+  ENDIF
+  IF (LUSERH) THEN
+    PINPRH(IXOR:IXEND,IYOR:IYEND)=ZINPRH(IXOR:IXEND,IYOR:IYEND)
+  ENDIF
+  IF (CDCONV /= 'NONE') THEN
+    PPRCONV(IXOR:IXEND,IYOR:IYEND)=ZPRCONV(IXOR:IXEND,IYOR:IYEND)
+    PPRSCONV(IXOR:IXEND,IYOR:IYEND)=ZPRSCONV(IXOR:IXEND,IYOR:IYEND)
+  END IF
+  IF (CRAD /= 'NONE') THEN
+    PDIRFLASWD(IXOR:IXEND,IYOR:IYEND,:)=ZDIRFLASWD(IXOR:IXEND,IYOR:IYEND,:)
+    PSCAFLASWD(IXOR:IXEND,IYOR:IYEND,:)=ZSCAFLASWD(IXOR:IXEND,IYOR:IYEND,:)
+    PDIRSRFSWD(IXOR:IXEND,IYOR:IYEND,:)=ZDIRSRFSWD(IXOR:IXEND,IYOR:IYEND,:)
+  ENDIF
+  DEALLOCATE(ZINPRC,ZINPRR,ZINPRS,ZINPRG,ZINPRH,ZPRCONV,ZPRSCONV)
+  DEALLOCATE(ZDIRFLASWD,ZSCAFLASWD,ZDIRSRFSWD)
+!
+!* initialize the OMASKkids array
+!
+OMASKkids(IXOR:IXEND,IYOR:IYEND)=.TRUE.
+!
+!
+!    5.2   relaxation computation
+!
+PRTHS(IXOR:IXEND,IYOR:IYEND,:) = PRTHS(IXOR:IXEND,IYOR:IYEND,:)        &
+     - ZK2W * PRHODJ(IXOR:IXEND,IYOR:IYEND,:) * ( PTHM(IXOR:IXEND,IYOR:IYEND,:) &
+                 -ZTHM(IXOR:IXEND,IYOR:IYEND,:)/ZRHODJ(IXOR:IXEND,IYOR:IYEND,:) )
+!
+DO JVAR=1,IRR
+  PRRS(IXOR:IXEND,IYOR:IYEND,:,JVAR) = PRRS(IXOR:IXEND,IYOR:IYEND,:,JVAR) &
+     -  ZK2W * PRHODJ(IXOR:IXEND,IYOR:IYEND,:) * (PRM(IXOR:IXEND,IYOR:IYEND,:,JVAR) &
+                 -ZRM(IXOR:IXEND,IYOR:IYEND,:,JVAR)/ZRHODJ(IXOR:IXEND,IYOR:IYEND,:) )
+ENDDO
+!
+! User scalar variables
+DO JVAR=1,ISV_USER
+  PRSVS(IXOR:IXEND,IYOR:IYEND,:,JVAR) = PRSVS(IXOR:IXEND,IYOR:IYEND,:,JVAR) &
+     -  ZK2W * PRHODJ(IXOR:IXEND,IYOR:IYEND,:) * (PSVM(IXOR:IXEND,IYOR:IYEND,:,JVAR) &
+                 -ZSVM(IXOR:IXEND,IYOR:IYEND,:,JVAR)/ZRHODJ(IXOR:IXEND,IYOR:IYEND,:) )
+ENDDO
+! C2R2 scalar variables
+DO JVAR=NSV_C2R2BEG_A(KMI),NSV_C2R2END_A(KMI)
+  PRSVS(IXOR:IXEND,IYOR:IYEND,:,JVAR) = PRSVS(IXOR:IXEND,IYOR:IYEND,:,JVAR) &
+     -  ZK2W * PRHODJ(IXOR:IXEND,IYOR:IYEND,:) * (PSVM(IXOR:IXEND,IYOR:IYEND,:,JVAR) &
+                 -ZSVM(IXOR:IXEND,IYOR:IYEND,:,JVAR)/ZRHODJ(IXOR:IXEND,IYOR:IYEND,:) )
+ENDDO
+! C1R3 scalar variables
+DO JVAR=NSV_C1R3BEG_A(KMI),NSV_C1R3END_A(KMI)
+  PRSVS(IXOR:IXEND,IYOR:IYEND,:,JVAR) = PRSVS(IXOR:IXEND,IYOR:IYEND,:,JVAR) &
+     -  ZK2W * PRHODJ(IXOR:IXEND,IYOR:IYEND,:) * (PSVM(IXOR:IXEND,IYOR:IYEND,:,JVAR) &
+                 -ZSVM(IXOR:IXEND,IYOR:IYEND,:,JVAR)/ZRHODJ(IXOR:IXEND,IYOR:IYEND,:) )
+ENDDO
+! LIMA scalar variables
+DO JVAR=NSV_LIMA_BEG_A(KMI),NSV_LIMA_END_A(KMI)
+  PRSVS(IXOR:IXEND,IYOR:IYEND,:,JVAR) = PRSVS(IXOR:IXEND,IYOR:IYEND,:,JVAR) &
+     -  ZK2W * PRHODJ(IXOR:IXEND,IYOR:IYEND,:) * (PSVM(IXOR:IXEND,IYOR:IYEND,:,JVAR) &
+                 -ZSVM(IXOR:IXEND,IYOR:IYEND,:,JVAR)/ZRHODJ(IXOR:IXEND,IYOR:IYEND,:) )
+ENDDO
+! Electrical scalar variables
+DO JVAR=NSV_ELECBEG_A(KMI),NSV_ELECEND_A(KMI)
+  PRSVS(IXOR:IXEND,IYOR:IYEND,:,JVAR) = PRSVS(IXOR:IXEND,IYOR:IYEND,:,JVAR) &
+     -  ZK2W * PRHODJ(IXOR:IXEND,IYOR:IYEND,:) * (PSVM(IXOR:IXEND,IYOR:IYEND,:,JVAR) &
+                 -ZSVM(IXOR:IXEND,IYOR:IYEND,:,JVAR)/ZRHODJ(IXOR:IXEND,IYOR:IYEND,:) )
+ENDDO
+! Chemical scalar variables
+DO JVAR=NSV_CHEMBEG_A(KMI),NSV_CHEMEND_A(KMI)
+  PRSVS(IXOR:IXEND,IYOR:IYEND,:,JVAR) = PRSVS(IXOR:IXEND,IYOR:IYEND,:,JVAR) &
+     -  ZK2W * PRHODJ(IXOR:IXEND,IYOR:IYEND,:) * (PSVM(IXOR:IXEND,IYOR:IYEND,:,JVAR) &
+                 -ZSVM(IXOR:IXEND,IYOR:IYEND,:,JVAR)/ZRHODJ(IXOR:IXEND,IYOR:IYEND,:) )
+ENDDO
+! Ice phase chemical scalar variables
+DO JVAR=NSV_CHICBEG_A(KMI),NSV_CHICEND_A(KMI)
+  PRSVS(IXOR:IXEND,IYOR:IYEND,:,JVAR) = PRSVS(IXOR:IXEND,IYOR:IYEND,:,JVAR) &
+     -  ZK2W * PRHODJ(IXOR:IXEND,IYOR:IYEND,:) * (PSVM(IXOR:IXEND,IYOR:IYEND,:,JVAR) &
+                 -ZSVM(IXOR:IXEND,IYOR:IYEND,:,JVAR)/ZRHODJ(IXOR:IXEND,IYOR:IYEND,:) )
+ENDDO
+! NOX variables
+DO JVAR=NSV_LNOXBEG_A(KMI),NSV_LNOXEND_A(KMI)
+  PRSVS(IXOR:IXEND,IYOR:IYEND,:,JVAR) = PRSVS(IXOR:IXEND,IYOR:IYEND,:,JVAR) &
+     -  ZK2W * PRHODJ(IXOR:IXEND,IYOR:IYEND,:) * (PSVM(IXOR:IXEND,IYOR:IYEND,:,JVAR) &
+                 -ZSVM(IXOR:IXEND,IYOR:IYEND,:,JVAR)/ZRHODJ(IXOR:IXEND,IYOR:IYEND,:) )
+ENDDO
+! Orilam scalar variables
+DO JVAR=NSV_AERBEG_A(KMI),NSV_AEREND_A(KMI)
+  PRSVS(IXOR:IXEND,IYOR:IYEND,:,JVAR) = PRSVS(IXOR:IXEND,IYOR:IYEND,:,JVAR) &
+     -  ZK2W * PRHODJ(IXOR:IXEND,IYOR:IYEND,:) * (PSVM(IXOR:IXEND,IYOR:IYEND,:,JVAR) &
+                 -ZSVM(IXOR:IXEND,IYOR:IYEND,:,JVAR)/ZRHODJ(IXOR:IXEND,IYOR:IYEND,:) )
+ENDDO
+DO JVAR=NSV_AERDEPBEG_A(KMI),NSV_AERDEPEND_A(KMI)
+  PRSVS(IXOR:IXEND,IYOR:IYEND,:,JVAR) = PRSVS(IXOR:IXEND,IYOR:IYEND,:,JVAR) &
+     -  ZK2W * PRHODJ(IXOR:IXEND,IYOR:IYEND,:) * (PSVM(IXOR:IXEND,IYOR:IYEND,:,JVAR) &
+                 -ZSVM(IXOR:IXEND,IYOR:IYEND,:,JVAR)/ZRHODJ(IXOR:IXEND,IYOR:IYEND,:) )
+ENDDO
+! Dust scalar variables
+DO JVAR=NSV_DSTBEG_A(KMI),NSV_DSTEND_A(KMI)
+  PRSVS(IXOR:IXEND,IYOR:IYEND,:,JVAR) = PRSVS(IXOR:IXEND,IYOR:IYEND,:,JVAR) &
+     -  ZK2W * PRHODJ(IXOR:IXEND,IYOR:IYEND,:) * (PSVM(IXOR:IXEND,IYOR:IYEND,:,JVAR) &
+                 -ZSVM(IXOR:IXEND,IYOR:IYEND,:,JVAR)/ZRHODJ(IXOR:IXEND,IYOR:IYEND,:) )
+ENDDO
+DO JVAR=NSV_DSTDEPBEG_A(KMI),NSV_DSTDEPEND_A(KMI)
+  PRSVS(IXOR:IXEND,IYOR:IYEND,:,JVAR) = PRSVS(IXOR:IXEND,IYOR:IYEND,:,JVAR) &
+     -  ZK2W * PRHODJ(IXOR:IXEND,IYOR:IYEND,:) * (PSVM(IXOR:IXEND,IYOR:IYEND,:,JVAR) &
+                 -ZSVM(IXOR:IXEND,IYOR:IYEND,:,JVAR)/ZRHODJ(IXOR:IXEND,IYOR:IYEND,:) )
+ENDDO
+! Salt scalar variables
+DO JVAR=NSV_SLTBEG_A(KMI),NSV_SLTEND_A(KMI)
+  PRSVS(IXOR:IXEND,IYOR:IYEND,:,JVAR) = PRSVS(IXOR:IXEND,IYOR:IYEND,:,JVAR) &
+     -  ZK2W * PRHODJ(IXOR:IXEND,IYOR:IYEND,:) * (PSVM(IXOR:IXEND,IYOR:IYEND,:,JVAR) &
+                 -ZSVM(IXOR:IXEND,IYOR:IYEND,:,JVAR)/ZRHODJ(IXOR:IXEND,IYOR:IYEND,:) )
+ENDDO
+DO JVAR=NSV_SLTDEPBEG_A(KMI),NSV_SLTDEPEND_A(KMI)
+  PRSVS(IXOR:IXEND,IYOR:IYEND,:,JVAR) = PRSVS(IXOR:IXEND,IYOR:IYEND,:,JVAR) &
+     -  ZK2W * PRHODJ(IXOR:IXEND,IYOR:IYEND,:) * (PSVM(IXOR:IXEND,IYOR:IYEND,:,JVAR) &
+                 -ZSVM(IXOR:IXEND,IYOR:IYEND,:,JVAR)/ZRHODJ(IXOR:IXEND,IYOR:IYEND,:) )
+ENDDO
+! Lagrangian scalar variables
+DO JVAR=NSV_LGBEG_A(KMI),NSV_LGEND_A(KMI)
+  PRSVS(IXOR:IXEND,IYOR:IYEND,:,JVAR) = PRSVS(IXOR:IXEND,IYOR:IYEND,:,JVAR) &
+     -  ZK2W * PRHODJ(IXOR:IXEND,IYOR:IYEND,:) * (PSVM(IXOR:IXEND,IYOR:IYEND,:,JVAR) &
+                 -ZSVM(IXOR:IXEND,IYOR:IYEND,:,JVAR)/ZRHODJ(IXOR:IXEND,IYOR:IYEND,:) )
+ENDDO
+! Passive pollutant variables
+DO JVAR=NSV_PPBEG_A(KMI),NSV_PPEND_A(KMI)
+  PRSVS(IXOR:IXEND,IYOR:IYEND,:,JVAR) = PRSVS(IXOR:IXEND,IYOR:IYEND,:,JVAR) &
+     -  ZK2W * PRHODJ(IXOR:IXEND,IYOR:IYEND,:) * (PSVM(IXOR:IXEND,IYOR:IYEND,:,JVAR) &
+                 -ZSVM(IXOR:IXEND,IYOR:IYEND,:,JVAR)/ZRHODJ(IXOR:IXEND,IYOR:IYEND,:) )
+ENDDO
+#ifdef MNH_FOREFIRE
+
+! ForeFire variables
+DO JVAR=NSV_FFBEG_A(KMI),NSV_FFEND_A(KMI)
+  PRSVS(IXOR:IXEND,IYOR:IYEND,:,JVAR) = PRSVS(IXOR:IXEND,IYOR:IYEND,:,JVAR) &
+     -  ZK2W * PRHODJ(IXOR:IXEND,IYOR:IYEND,:) * (PSVM(IXOR:IXEND,IYOR:IYEND,:,JVAR) &
+                 -ZSVM(IXOR:IXEND,IYOR:IYEND,:,JVAR)/ZRHODJ(IXOR:IXEND,IYOR:IYEND,:) )
+ENDDO
+#endif
+! Conditional sampling variables
+DO JVAR=NSV_CSBEG_A(KMI),NSV_CSEND_A(KMI)
+  PRSVS(IXOR:IXEND,IYOR:IYEND,:,JVAR) = PRSVS(IXOR:IXEND,IYOR:IYEND,:,JVAR) &
+     -  ZK2W * PRHODJ(IXOR:IXEND,IYOR:IYEND,:) * (PSVM(IXOR:IXEND,IYOR:IYEND,:,JVAR) &
+                 -ZSVM(IXOR:IXEND,IYOR:IYEND,:,JVAR)/ZRHODJ(IXOR:IXEND,IYOR:IYEND,:) )
+ENDDO
+!
+ZRHODJ(IXOR:IXEND,IYOR:IYEND,IKB) = 2.*ZRHODJ(IXOR:IXEND,IYOR:IYEND,IKB)
+ZRHODJ(IXOR:IXEND,IYOR:IYEND,IKB+1:IKU) = ZRHODJ(IXOR:IXEND,IYOR:IYEND,IKB+1:IKU)   &
+                                         +ZRHODJ(IXOR:IXEND,IYOR:IYEND,IKB:IKU-1)
+!
+ZAVE_RHODJ=MZM(PRHODJ)
+PRWS(IXOR:IXEND,IYOR:IYEND,:) = PRWS(IXOR:IXEND,IYOR:IYEND,:)        &
+     - ZK2W * ZAVE_RHODJ(IXOR:IXEND,IYOR:IYEND,:) * ( PWM(IXOR:IXEND,IYOR:IYEND,:) &
+                 -ZWM(IXOR:IXEND,IYOR:IYEND,:)/ZRHODJ(IXOR:IXEND,IYOR:IYEND,:) )
+!
+ZAVE_RHODJ=MXM(PRHODJ)
+PRUS(IXORU:IXEND,IYOR:IYEND,:) = PRUS(IXORU:IXEND,IYOR:IYEND,:)        &
+     - ZK2W * ZAVE_RHODJ(IXORU:IXEND,IYOR:IYEND,:) * ( PUM(IXORU:IXEND,IYOR:IYEND,:) &
+                 -ZUM(IXORU:IXEND,IYOR:IYEND,:)/ZRHODJU(IXORU:IXEND,IYOR:IYEND,:) )
+!
+ZAVE_RHODJ=MYM(PRHODJ)
+PRVS(IXOR:IXEND,IYORV:IYEND,:) = PRVS(IXOR:IXEND,IYORV:IYEND,:)        &
+     - ZK2W * ZAVE_RHODJ(IXOR:IXEND,IYORV:IYEND,:) * ( PVM(IXOR:IXEND,IYORV:IYEND,:) &
+                 -ZVM(IXOR:IXEND,IYORV:IYEND,:)/ZRHODJV(IXOR:IXEND,IYORV:IYEND,:) )
+!
+DEALLOCATE(ZUM,ZVM,ZWM,ZTHM,ZRHODJ,ZRHODJU,ZRHODJV)
+IF (IRR /= 0) DEALLOCATE(ZRM) 
+IF (KSV /= 0) DEALLOCATE(ZSVM)
+!------------------------------------------------------------------------------
+!
+END SUBROUTINE TWO_WAY_n
diff --git a/src/PHYEX/ext/update_nsv.f90 b/src/PHYEX/ext/update_nsv.f90
new file mode 100644
index 0000000000000000000000000000000000000000..f54a72169a96b85ca43c4c958e61dbdedc514c3e
--- /dev/null
+++ b/src/PHYEX/ext/update_nsv.f90
@@ -0,0 +1,187 @@
+!MNH_LIC Copyright 2001-2023 CNRS, Meteo-France and Universite Paul Sabatier
+!MNH_LIC This is part of the Meso-NH software governed by the CeCILL-C licence
+!MNH_LIC version 1. See LICENSE, CeCILL-C_V1-en.txt and CeCILL-C_V1-fr.txt
+!MNH_LIC for details. version 1.
+!-----------------------------------------------------------------
+!     ######spl
+        MODULE MODI_UPDATE_NSV
+!       ######################
+!
+INTERFACE 
+  SUBROUTINE UPDATE_NSV(KMI)
+  INTEGER, INTENT(IN) :: KMI ! Model index
+  END SUBROUTINE UPDATE_NSV
+!
+END INTERFACE
+END MODULE MODI_UPDATE_NSV
+!     ######spl
+    SUBROUTINE UPDATE_NSV(KMI)
+!   ##########################
+
+!!****  *UPDATE_NSV* - routine that updates the NSV_* variables for the
+!!                   current model. It is intended to be called from 
+!!                   any MesoNH routine WITH or WITHOUT $n before using 
+!!                   the NSV_* variables.
+!!  Modify (Escobar ) 2/2014 : add Forefire var
+!!  Modify (Vie) 2016 : add LIMA
+!!         V. Vionnet 7/2017 : add blowing snow var
+!  P. Wautelet 10/04/2019: replace ABORT and STOP calls by Print_msg
+!  P. Wautelet 26/11/2021: add TSVLIST and TSVLIST_A to store the metadata of all the scalar variables
+!  P. Wautelet 14/01/2022: add CSV_CHEM_LIST(_A) to store the list of all chemical variables
+!  P. Wautelet 20/02/2023: manage CSV(_A) + bugfix: reallocate size was wrong in some scenarii
+!-------------------------------------------------------------------------------
+!
+USE MODD_CONF,       ONLY: NVERB
+USE MODD_FIELD,      ONLY: tfieldmetadata
+USE MODD_NSV
+USE MODD_PARAMETERS, ONLY: JPSVNAMELGTMAX, NMNHNAMELGTMAX
+
+USE MODE_LIMA_UPDATE_NSV, ONLY: LIMA_UPDATE_NSV
+use mode_msg
+
+IMPLICIT NONE 
+
+INTEGER, INTENT(IN) :: KMI ! Model index
+
+CHARACTER(LEN=JPSVNAMELGTMAX), DIMENSION(:,:), ALLOCATABLE :: YSVNAMES_TMP
+CHARACTER(LEN=6),              DIMENSION(:,:), ALLOCATABLE :: YSV_TMP
+CHARACTER(LEN=NMNHNAMELGTMAX), DIMENSION(:,:), ALLOCATABLE :: YSVCHEM_LIST_TMP
+INTEGER :: JI, JJ
+INTEGER :: ISV
+TYPE(tfieldmetadata), DIMENSION(:,:), ALLOCATABLE :: YSVLIST_TMP
+!
+! STOP if INI_NSV has not be called yet
+IF ( .NOT. LINI_NSV(KMI) ) THEN
+  call Print_msg( NVERB_FATAL, 'GEN', 'UPDATE_NSV', 'can not continue because INI_NSV was not called' )
+END IF
+!
+! Update the NSV_* variables from original NSV_*_A arrays
+! that have been initialized in ini_nsv.f90 for model KMI
+!
+
+! Allocate/reallocate CSV_CHEM_LIST_A
+IF ( .NOT. ALLOCATED( TNSV%CSV_CHEM_LIST_A ) ) THEN
+  ALLOCATE( TNSV%CSV_CHEM_LIST_A( NSV_CHEM_LIST_A(KMI), KMI) )
+  CSV_CHEM_LIST_A     =>  TNSV%CSV_CHEM_LIST_A
+ENDIF
+!If CSV_CHEM_LIST_A is too small, enlarge it and transfer data
+IF ( SIZE( CSV_CHEM_LIST_A, 1 ) < NSV_CHEM_LIST_A(KMI) .OR. SIZE( CSV_CHEM_LIST_A, 2 ) < KMI ) THEN
+  ALLOCATE( YSVCHEM_LIST_TMP( MAX( SIZE(CSV_CHEM_LIST_A,1), NSV_CHEM_LIST_A(KMI) ), MAX( SIZE(CSV_CHEM_LIST_A,2), KMI ) ) )
+  DO JJ = 1, SIZE( CSV_CHEM_LIST_A, 2 )
+    DO JI = 1, SIZE( CSV_CHEM_LIST_A, 1 )
+      YSVCHEM_LIST_TMP(JI, JJ) = CSV_CHEM_LIST_A(JI, JJ)
+    END DO
+  END DO
+  CALL MOVE_ALLOC( FROM = YSVCHEM_LIST_TMP, TO = TNSV%CSV_CHEM_LIST_A )
+  CSV_CHEM_LIST_A     =>  TNSV%CSV_CHEM_LIST_A
+END IF
+
+CSV_CHEM_LIST => CSV_CHEM_LIST_A(:,KMI)
+
+! Allocate/reallocate CSV_A
+IF ( .NOT. ALLOCATED( TNSV%CSV_A ) ) THEN
+  ALLOCATE( TNSV%CSV_A( NSV_A(KMI), KMI) )
+  CSV_A               =>  TNSV%CSV_A
+ENDIF
+!If CSV_A is too small, enlarge it and transfer data
+IF ( SIZE( CSV_A, 1 ) < NSV_A(KMI) .OR. SIZE( CSV_A, 2 ) < KMI ) THEN
+  ALLOCATE( YSV_TMP( MAX( SIZE(CSV_A,1), NSV_A(KMI) ), MAX( SIZE(CSV_A,2), KMI ) ) )
+  DO JJ = 1, SIZE( CSV_A, 2 )
+    DO JI = 1, SIZE( CSV_A, 1 )
+      YSV_TMP(JI, JJ) = CSV_A(JI, JJ)
+    END DO
+  END DO
+  CALL MOVE_ALLOC( FROM = YSV_TMP, TO = TNSV%CSV_A )
+  CSV_A               =>  TNSV%CSV_A
+END IF
+
+CSV => CSV_A(:,KMI)
+
+! Allocate/reallocate TSVLIST_A
+IF ( .NOT. ALLOCATED( TNSV%TSVLIST_A ) ) THEN
+  ALLOCATE( TNSV%TSVLIST_A( NSV_A(KMI), KMI) )
+  TSVLIST_A           =>  TNSV%TSVLIST_A
+ENDIF
+!If TSVLIST_A is too small, enlarge it and transfer data
+IF ( SIZE( TSVLIST_A, 1 ) < NSV_A(KMI) .OR. SIZE( TSVLIST_A, 2 ) < KMI ) THEN
+  ALLOCATE( YSVLIST_TMP( MAX( SIZE(TSVLIST_A,1), NSV_A(KMI) ), MAX( SIZE(TSVLIST_A,2), KMI ) ) )
+  DO JJ = 1, SIZE( TSVLIST_A, 2 )
+    DO JI = 1, SIZE( TSVLIST_A, 1 )
+      YSVLIST_TMP(JI, JJ) = TSVLIST_A(JI, JJ)
+    END DO
+  END DO
+  CALL MOVE_ALLOC( FROM = YSVLIST_TMP, TO = TNSV%TSVLIST_A )
+  TSVLIST_A           =>  TNSV%TSVLIST_A
+END IF
+
+TSVLIST => TSVLIST_A(:,KMI)
+
+NSV         = NSV_A(KMI)
+NSV_USER    = NSV_USER_A(KMI)
+NSV_C2R2    = NSV_C2R2_A(KMI)
+NSV_C2R2BEG = NSV_C2R2BEG_A(KMI)
+NSV_C2R2END = NSV_C2R2END_A(KMI)
+NSV_C1R3    = NSV_C1R3_A(KMI)
+NSV_C1R3BEG = NSV_C1R3BEG_A(KMI)
+NSV_C1R3END = NSV_C1R3END_A(KMI)
+!
+ISV=-1
+CALL LIMA_UPDATE_NSV(LDINIT=.FALSE., KMI=KMI, KSV=ISV, CDCLOUD='LIMA', LDUPDATE=.TRUE.)
+!
+NSV_ELEC    = NSV_ELEC_A(KMI)
+NSV_ELECBEG = NSV_ELECBEG_A(KMI)
+NSV_ELECEND = NSV_ELECEND_A(KMI)
+NSV_CHEM    = NSV_CHEM_A(KMI)
+NSV_CHEMBEG = NSV_CHEMBEG_A(KMI)
+NSV_CHEMEND = NSV_CHEMEND_A(KMI)
+NSV_CHGS    = NSV_CHGS_A(KMI)
+NSV_CHGSBEG = NSV_CHGSBEG_A(KMI)
+NSV_CHGSEND = NSV_CHGSEND_A(KMI)
+NSV_CHAC    = NSV_CHAC_A(KMI)
+NSV_CHACBEG = NSV_CHACBEG_A(KMI)
+NSV_CHACEND = NSV_CHACEND_A(KMI)
+NSV_CHIC    = NSV_CHIC_A(KMI)
+NSV_CHICBEG = NSV_CHICBEG_A(KMI)
+NSV_CHICEND = NSV_CHICEND_A(KMI)
+NSV_LNOX    = NSV_LNOX_A(KMI)
+NSV_LNOXBEG = NSV_LNOXBEG_A(KMI)
+NSV_LNOXEND = NSV_LNOXEND_A(KMI)
+NSV_DST     = NSV_DST_A(KMI)
+NSV_DSTBEG  = NSV_DSTBEG_A(KMI)
+NSV_DSTEND  = NSV_DSTEND_A(KMI)
+NSV_DSTDEP     = NSV_DSTDEP_A(KMI)
+NSV_DSTDEPBEG  = NSV_DSTDEPBEG_A(KMI)
+NSV_DSTDEPEND  = NSV_DSTDEPEND_A(KMI)
+NSV_SLT     = NSV_SLT_A(KMI)
+NSV_SLTBEG  = NSV_SLTBEG_A(KMI)
+NSV_SLTEND  = NSV_SLTEND_A(KMI)
+NSV_SLTDEPBEG  = NSV_SLTDEPBEG_A(KMI)
+NSV_SLTDEPEND  = NSV_SLTDEPEND_A(KMI)
+NSV_AER     = NSV_AER_A(KMI)
+NSV_AERBEG  = NSV_AERBEG_A(KMI)
+NSV_AEREND  = NSV_AEREND_A(KMI)
+NSV_AERDEPBEG  = NSV_AERDEPBEG_A(KMI)
+NSV_AERDEPEND  = NSV_AERDEPEND_A(KMI)
+NSV_LG      = NSV_LG_A(KMI)
+NSV_LGBEG   = NSV_LGBEG_A(KMI)
+NSV_LGEND   = NSV_LGEND_A(KMI)
+NSV_PP      = NSV_PP_A(KMI)
+NSV_PPBEG   = NSV_PPBEG_A(KMI)
+NSV_PPEND   = NSV_PPEND_A(KMI)
+#ifdef MNH_FOREFIRE
+NSV_FF      = NSV_FF_A(KMI)
+NSV_FFBEG   = NSV_FFBEG_A(KMI)
+NSV_FFEND   = NSV_FFEND_A(KMI)
+#endif
+NSV_FIRE      = NSV_FIRE_A(KMI)
+NSV_FIREBEG   = NSV_FIREBEG_A(KMI)
+NSV_FIREEND   = NSV_FIREEND_A(KMI)
+NSV_CS      = NSV_CS_A(KMI)
+NSV_CSBEG   = NSV_CSBEG_A(KMI)
+NSV_CSEND   = NSV_CSEND_A(KMI)
+NSV_SNW     = NSV_SNW_A(KMI)
+NSV_SNWBEG  = NSV_SNWBEG_A(KMI)
+NSV_SNWEND  = NSV_SNWEND_A(KMI)
+!
+
+END SUBROUTINE UPDATE_NSV
diff --git a/src/PHYEX/ext/ver_interp_field.f90 b/src/PHYEX/ext/ver_interp_field.f90
new file mode 100644
index 0000000000000000000000000000000000000000..d0092e917c7f9f1ea3232c1eba012cccf5d80b71
--- /dev/null
+++ b/src/PHYEX/ext/ver_interp_field.f90
@@ -0,0 +1,327 @@
+!MNH_LIC Copyright 1997-2020 CNRS, Meteo-France and Universite Paul Sabatier
+!MNH_LIC This is part of the Meso-NH software governed by the CeCILL-C licence
+!MNH_LIC version 1. See LICENSE, CeCILL-C_V1-en.txt and CeCILL-C_V1-fr.txt
+!MNH_LIC for details. version 1.
+!-----------------------------------------------------------------
+!#######################
+MODULE MODI_VER_INTERP_FIELD
+!#######################
+!
+INTERFACE
+!
+      SUBROUTINE VER_INTERP_FIELD(HTURB,KRR,KSV,PZZ_LS,PZZ,                    &
+                              PUT,PVT,PWT,PTHVT,PRT,PHUT,PTKET,PSVT,           &
+                              PSRCT,PSIGS,                                     &
+                              PLSUM,PLSVM,PLSWM,PLSTHM,PLSRVM                  )
+!
+CHARACTER (LEN=4), INTENT(IN) :: HTURB !  Kind of turbulence parameterization
+INTEGER,           INTENT(IN) :: KRR   ! number of moist variables
+INTEGER,           INTENT(IN) :: KSV   ! number of scalar variables
+REAL, DIMENSION(:,:,:),   INTENT(IN)    :: PZZ_LS ! initial 3D grid
+REAL, DIMENSION(:,:,:),   INTENT(IN)    :: PZZ    ! new     3D grid
+!
+REAL, DIMENSION(:,:,:),   INTENT(INOUT) :: PUT,PVT,PWT        !  model 2
+REAL, DIMENSION(:,:,:),   INTENT(INOUT) :: PTKET              ! variables
+REAL, DIMENSION(:,:,:,:), INTENT(INOUT) :: PRT,PSVT           !   at t
+REAL, DIMENSION(:,:,:),   INTENT(INOUT) :: PTHVT,PHUT         !
+!
+REAL, DIMENSION(:,:,:),   INTENT(INOUT) :: PSRCT,PSIGS  ! secondary
+                                                            ! prognostic variables
+           ! Larger Scale fields
+REAL, DIMENSION(:,:,:),          INTENT(INOUT) :: PLSUM, PLSVM, PLSWM  ! Wind
+REAL, DIMENSION(:,:,:),          INTENT(INOUT) :: PLSTHM,  PLSRVM      ! Mass
+END SUBROUTINE VER_INTERP_FIELD
+!
+END INTERFACE
+!
+END MODULE MODI_VER_INTERP_FIELD
+!
+!     ##########################################################################
+      SUBROUTINE VER_INTERP_FIELD(HTURB,KRR,KSV,PZZ_LS,PZZ,                    &
+                              PUT,PVT,PWT,PTHVT,PRT,PHUT,PTKET,PSVT,           &
+                              PSRCT,PSIGS,                                     &
+                              PLSUM,PLSVM,PLSWM,PLSTHM,PLSRVM                  )
+!     ##########################################################################
+!
+!!****  *VER_INTERP_FIELD * - interpolate the 3D and LS 2D fields from one
+!!                            vertical grid PZZ_LS to another PZZ
+!!
+!!    PURPOSE
+!!    -------
+!!
+!!
+!!**  METHOD
+!!    ------
+!!
+!!
+!!    EXTERNAL
+!!    --------
+!!
+!!
+!!
+!!    IMPLICIT ARGUMENTS
+!!    ------------------
+!!
+!!    REFERENCE
+!!    ---------
+!!
+!!       Book1 of the documentation
+!!       SUBROUTINE VER_INTERP_FIELD (Book2 of the documentation)
+!!
+!!
+!!    AUTHOR
+!!    ------
+!!
+!!       V. Masson     * METEO-FRANCE *
+!!
+!!    MODIFICATIONS
+!!    -------------
+!!
+!!      Original    17/07/97
+!!                  14/09/97 (V. Masson) Interpolation of relative humidity
+!!                  05/06     Remobe KEPS
+!!                  2014  (M.Faivre)
+!  P. Wautelet 20/05/2019: add name argument to ADDnFIELD_ll + new ADD4DFIELD_ll subroutine
+!-------------------------------------------------------------------------------
+!
+!*       0.     DECLARATIONS
+!               ------------
+!
+USE MODD_CONF_n, ONLY : CONF_MODEL
+USE MODD_TURB_n, ONLY: XTKEMIN
+USE MODD_PARAMETERS
+USE MODD_VER_INTERP_LIN
+!
+USE MODI_SHUMAN
+USE MODI_COEF_VER_INTERP_LIN
+USE MODI_VER_INTERP_LIN
+!$20140709
+USE MODD_ARGSLIST_ll, ONLY : LIST_ll
+USE MODD_FIELD_n     ! modules relative to the outer model $n
+USE MODD_LSFIELD_n
+USE MODE_MPPDB
+!$20140710
+USE MODE_ll
+USE MODD_LBC_n
+!
+IMPLICIT NONE
+!
+!*       0.1   Declarations of dummy arguments :
+!
+!
+CHARACTER (LEN=4), INTENT(IN) :: HTURB !  Kind of turbulence parameterization
+INTEGER,           INTENT(IN) :: KRR   ! number of moist variables
+INTEGER,           INTENT(IN) :: KSV   ! number of scalar variables
+REAL, DIMENSION(:,:,:),   INTENT(IN)    :: PZZ_LS ! initial 3D grid
+REAL, DIMENSION(:,:,:),   INTENT(IN)    :: PZZ    ! new     3D grid
+!
+REAL, DIMENSION(:,:,:),   INTENT(INOUT) :: PUT,PVT,PWT        !  model 2
+REAL, DIMENSION(:,:,:),   INTENT(INOUT) :: PTKET              ! variables
+REAL, DIMENSION(:,:,:,:), INTENT(INOUT) :: PRT,PSVT           !   at t
+REAL, DIMENSION(:,:,:),   INTENT(INOUT) :: PTHVT,PHUT         !
+!
+REAL, DIMENSION(:,:,:),   INTENT(INOUT) :: PSRCT,PSIGS  ! secondary
+                                                       ! prognostic variables
+           ! Larger Scale fields
+REAL, DIMENSION(:,:,:),          INTENT(INOUT) :: PLSUM, PLSVM, PLSWM  ! Wind
+REAL, DIMENSION(:,:,:),          INTENT(INOUT) :: PLSTHM,  PLSRVM      ! Mass
+!*       0.2    Declarations of local variables
+!
+INTEGER :: JRR, JSV
+INTEGER :: IKU
+INTEGER :: IKB
+REAL, DIMENSION(SIZE(PZZ_LS,1),SIZE(PZZ_LS,2),SIZE(PZZ_LS,3)) :: ZGRID1, ZGRID2
+!$20140709
+TYPE(LIST_ll), POINTER :: TZLSFIELD_ll   ! list of LS fields
+INTEGER :: IINFO_ll
+!$20140710
+INTEGER JI,JJ,IIB,IJB,IIE,IJE
+!
+!-------------------------------------------------------------------------------
+!
+!*       1.     Prologue
+!               --------
+!
+IKU=SIZE(PZZ,3)
+!
+IKB=1+JPVEXT
+!$20140710
+CALL GET_INDICE_ll (IIB,IJB,IIE,IJE)
+!
+!-------------------------------------------------------------------------------
+!
+!*       2.     variables which always exist
+!               ----------------------------
+!
+!*       2.1    U component
+!               -----------
+!
+!* shift of grids to mass points
+ZGRID1(:,:,:)=MZF(PZZ_LS(:,:,:))
+ZGRID1(:,:,IKU)=2.*ZGRID1(:,:,IKU-1)-ZGRID1(:,:,IKU-2)
+ZGRID2(:,:,:)=MZF(PZZ(:,:,:))
+ZGRID2(:,:,IKU)=2.*ZGRID2(:,:,IKU-1)-ZGRID2(:,:,IKU-2)
+!* move the first physical level if above the target grid
+ZGRID1(:,:,1:IKB)=MIN(ZGRID1(:,:,1:IKB),ZGRID2(:,:,1:IKB))
+!$20140710
+CALL MPPDB_CHECK3D(ZGRID1,"VERINTERPFIELDbefMXM:ZGRID1",PRECISION)
+CALL MPPDB_CHECK3D(ZGRID2,"VERINTERPFIELDbefMXM:ZGRID2",PRECISION)
+!* shift to U points
+!$20140710pb with MXM,MYM: MPPDB pb
+!$if cancel MXM, MYM then PUM,PVM are ok
+ZGRID1(:,:,:)=MXM(ZGRID1(:,:,:))
+ZGRID2(:,:,:)=MXM(ZGRID2(:,:,:))
+DO JI=JPHEXT,1,-1
+   ZGRID1(JI,:,:)=2.*ZGRID1(JI+1,:,:)-ZGRID1(JI+2,:,:)
+   ZGRID2(JI,:,:)=2.*ZGRID2(JI+1,:,:)-ZGRID2(JI+2,:,:)
+ENDDO
+!$20140710 update_halo
+NULLIFY(TZLSFIELD_ll)
+CALL ADD3DFIELD_ll( TZLSFIELD_ll, ZGRID1, 'VER_INTERP_FIELD::ZGRID1' )
+CALL ADD3DFIELD_ll( TZLSFIELD_ll, ZGRID2, 'VER_INTERP_FIELD::ZGRID2' )
+CALL UPDATE_HALO_ll(TZLSFIELD_ll,IINFO_ll)
+CALL CLEANLIST_ll(TZLSFIELD_ll)
+!
+!$20140710
+CALL MPPDB_CHECK3D(ZGRID1,"VERINTERPFIELDaftMXM:ZGRID1",PRECISION)
+CALL MPPDB_CHECK3D(ZGRID2,"VERINTERPFIELDaftMXM:ZGRID2",PRECISION)
+!
+!$20140710 add NKLIN and XCOEFLIN in COEF_VER_INTERP
+CALL COEF_VER_INTERP_LIN(ZGRID1(:,:,:),ZGRID2(:,:,:))
+!
+PUT  (:,:,:)   =  VER_INTERP_LIN(PUT   (:,:,:),NKLIN(:,:,:),XCOEFLIN(:,:,:))
+PLSUM (:,:,:)  =  VER_INTERP_LIN(PLSUM (:,:,:),NKLIN(:,:,:),XCOEFLIN(:,:,:))
+!$20140709
+CALL MPPDB_CHECK3D(PUT,"VERINTERPFIELD:PUT",PRECISION)
+!$
+!
+!*       2.2    V component
+!               -----------
+!
+!* shift of grids to mass points
+ZGRID1(:,:,:)=MZF(PZZ_LS(:,:,:))
+ZGRID1(:,:,IKU)=2.*ZGRID1(:,:,IKU-1)-ZGRID1(:,:,IKU-2)
+ZGRID2(:,:,:)=MZF(PZZ(:,:,:))
+ZGRID2(:,:,IKU)=2.*ZGRID2(:,:,IKU-1)-ZGRID2(:,:,IKU-2)
+!* move the first physical level if above the target grid
+ZGRID1(:,:,1:IKB)=MIN(ZGRID1(:,:,1:IKB),ZGRID2(:,:,1:IKB))
+!* shift to V points
+
+ZGRID1(:,:,:)=MYM(ZGRID1(:,:,:))
+ZGRID2(:,:,:)=MYM(ZGRID2(:,:,:))
+DO JJ=JPHEXT,1,-1
+   ZGRID1(:,JJ,:)=2.*ZGRID1(:,JJ+1,:)-ZGRID1(:,JJ+2,:)
+   ZGRID2(:,JJ,:)=2.*ZGRID2(:,JJ+1,:)-ZGRID2(:,JJ+2,:)
+ENDDO
+!$20140711 updatehalo(zg1,2) also here
+NULLIFY(TZLSFIELD_ll)
+CALL ADD3DFIELD_ll( TZLSFIELD_ll, ZGRID1, 'VER_INTERP_FIELD::ZGRID1' )
+CALL ADD3DFIELD_ll( TZLSFIELD_ll, ZGRID2, 'VER_INTERP_FIELD::ZGRID2' )
+CALL UPDATE_HALO_ll(TZLSFIELD_ll,IINFO_ll)
+CALL CLEANLIST_ll(TZLSFIELD_ll)
+!$
+CALL COEF_VER_INTERP_LIN(ZGRID1(:,:,:),ZGRID2(:,:,:))
+!
+!$20140710
+CALL MPPDB_CHECK3D(XCOEFLIN,"VERINTERPFIELDaftVerinterplin:XCOEFLIN",PRECISION)
+PVT  (:,:,:)   =  VER_INTERP_LIN(PVT   (:,:,:),NKLIN(:,:,:),XCOEFLIN(:,:,:))
+PLSVM (:,:,:)  =  VER_INTERP_LIN(PLSVM (:,:,:),NKLIN(:,:,:),XCOEFLIN(:,:,:))
+!$20140710
+CALL MPPDB_CHECK3D(PVT,"VERINTERPFIELDaftVerinterplin:PVT",PRECISION)
+!
+!*       2.3    W component
+!               -----------
+!
+ZGRID1(:,:,:)=PZZ_LS(:,:,:)
+ZGRID2(:,:,:)=PZZ   (:,:,:)
+!* move the first physical level if above the target grid
+ZGRID1(:,:,1:IKB)=MIN(ZGRID1(:,:,1:IKB),ZGRID2(:,:,1:IKB))
+!
+CALL COEF_VER_INTERP_LIN(ZGRID1(:,:,:),ZGRID2(:,:,:))
+!
+PWT  (:,:,:)   =  VER_INTERP_LIN(PWT   (:,:,:),NKLIN(:,:,:),XCOEFLIN(:,:,:))
+PLSWM (:,:,:)  =  VER_INTERP_LIN(PLSWM (:,:,:),NKLIN(:,:,:),XCOEFLIN(:,:,:))
+!
+!*       2.4    thermodynamical variables
+!               -------------------------
+!
+!* shift of grids to mass points
+ZGRID1(:,:,:)=MZF(PZZ_LS(:,:,:))
+ZGRID1(:,:,IKU)=2.*ZGRID1(:,:,IKU-1)-ZGRID1(:,:,IKU-2)
+ZGRID2(:,:,:)=MZF(PZZ(:,:,:))
+ZGRID2(:,:,IKU)=2.*ZGRID2(:,:,IKU-1)-ZGRID2(:,:,IKU-2)
+!
+CALL COEF_VER_INTERP_LIN(ZGRID1(:,:,:),ZGRID2(:,:,:))
+!
+PTHVT (:,:,:)   =  VER_INTERP_LIN(PTHVT  (:,:,:),NKLIN(:,:,:),XCOEFLIN(:,:,:))
+PLSTHM(:,:,:)  =  VER_INTERP_LIN(PLSTHM(:,:,:),NKLIN(:,:,:),XCOEFLIN(:,:,:))
+!
+IF ( SIZE(PLSRVM,1) /= 0 ) THEN
+  PLSRVM(:,:,:)  =  VER_INTERP_LIN(PLSRVM(:,:,:),NKLIN(:,:,:),XCOEFLIN(:,:,:))
+  PLSRVM=MAX(PLSRVM,0.)
+END IF
+!
+!-------------------------------------------------------------------------------
+!
+!*       3.     moist variables
+!               ---------------
+!
+DO JRR=1,KRR
+  PRT  (:,:,:,JRR) =  VER_INTERP_LIN(PRT (:,:,:,JRR),NKLIN(:,:,:),XCOEFLIN(:,:,:))
+  PRT (:,:,:,JRR) = MAX(PRT(:,:,:,JRR),0.)
+END DO
+!
+IF (CONF_MODEL(1)%NRR>=1) THEN
+  PHUT(:,:,:)   =  VER_INTERP_LIN(PHUT  (:,:,:),NKLIN(:,:,:),XCOEFLIN(:,:,:))
+  PHUT(:,:,:)   = MIN(MAX(PHUT(:,:,:),0.),100.)
+END IF
+!
+!-------------------------------------------------------------------------------
+!
+!*       4.     scalar variables
+!               ----------------
+!
+DO JSV=1,KSV
+  PSVT (:,:,:,JSV) =  VER_INTERP_LIN(PSVT (:,:,:,JSV),NKLIN(:,:,:),XCOEFLIN(:,:,:))
+  PSVT (:,:,:,JSV) = MAX(PSVT(:,:,:,JSV),0.)
+END DO
+!
+!-------------------------------------------------------------------------------
+!
+!*       5.     TKE variable
+!               ------------
+!
+!* shift of grids to mass points
+ZGRID1(:,:,:)=MZF(PZZ_LS(:,:,:))
+ZGRID1(:,:,IKU)=2.*ZGRID1(:,:,IKU-1)-ZGRID1(:,:,IKU-2)
+ZGRID2(:,:,:)=MZF(PZZ(:,:,:))
+ZGRID2(:,:,IKU)=2.*ZGRID2(:,:,IKU-1)-ZGRID2(:,:,IKU-2)
+!* move the first physical level if above the target grid
+ZGRID1(:,:,1:IKB)=MIN(ZGRID1(:,:,1:IKB),ZGRID2(:,:,1:IKB))
+!
+CALL COEF_VER_INTERP_LIN(ZGRID1(:,:,:),ZGRID2(:,:,:))
+!
+IF (HTURB /= 'NONE') THEN
+  PTKET(:,:,:)   =  VER_INTERP_LIN(PTKET (:,:,:),NKLIN(:,:,:),XCOEFLIN(:,:,:))
+  PTKET=MAX(PTKET,XTKEMIN)
+ENDIF
+!
+!
+!-------------------------------------------------------------------------------
+!
+!*       6.     secondary prognostic variables
+!               ------------------------------
+!
+IF (KRR > 1 .AND. HTURB /= 'NONE') THEN
+  PSRCT (:,:,:) =  VER_INTERP_LIN(PSRCT (:,:,:),NKLIN(:,:,:),XCOEFLIN(:,:,:))
+  PSIGS (:,:,:) =  VER_INTERP_LIN(PSIGS (:,:,:),NKLIN(:,:,:),XCOEFLIN(:,:,:))
+ENDIF
+!
+!-------------------------------------------------------------------------------
+!
+DEALLOCATE(NKLIN)
+DEALLOCATE(XCOEFLIN)
+!-------------------------------------------------------------------------------
+!
+END SUBROUTINE VER_INTERP_FIELD
+!
diff --git a/src/PHYEX/ext/write_desfmn.f90 b/src/PHYEX/ext/write_desfmn.f90
new file mode 100644
index 0000000000000000000000000000000000000000..908c2eff83a767d24cddf6d5c7b1aebdb7f589ea
--- /dev/null
+++ b/src/PHYEX/ext/write_desfmn.f90
@@ -0,0 +1,730 @@
+!MNH_LIC Copyright 1994-2023 CNRS, Meteo-France and Universite Paul Sabatier
+!MNH_LIC This is part of the Meso-NH software governed by the CeCILL-C licence
+!MNH_LIC version 1. See LICENSE, CeCILL-C_V1-en.txt and CeCILL-C_V1-fr.txt  
+!MNH_LIC for details. version 1.
+!-----------------------------------------------------------------
+!     #########################
+      MODULE MODI_WRITE_DESFM_n
+!     #########################
+!
+INTERFACE
+!
+SUBROUTINE WRITE_DESFM_n(KMI,TPDATAFILE)
+!
+USE MODD_IO, ONLY: TFILEDATA
+!
+INTEGER,            INTENT(IN)  :: KMI        ! Model index
+TYPE(TFILEDATA),    INTENT(IN)  :: TPDATAFILE ! Datafile
+!
+END SUBROUTINE WRITE_DESFM_n
+!
+END INTERFACE
+!
+END MODULE MODI_WRITE_DESFM_n
+!
+!
+!     ###################################################
+      SUBROUTINE WRITE_DESFM_n(KMI,TPDATAFILE)
+!     ###################################################
+!
+!!****  *WRITE_DESFM_n * - routine to write a descriptor file ( DESFM )
+!!
+!!    PURPOSE
+!!    -------
+!       The purpose of this routine is to write the descriptive part of a Mesonh
+!     file (FM-file). The resulting file is called  DESFM. 
+!       
+!!
+!!**  METHOD
+!!    ------
+!!     
+!!     This routine writes in the file HDESFM, previously opened, the group of
+!!     all the namelists used to specify a Mesonh simulation.
+!!     If verbose option is high enough : NVERB>=5, the variables in descriptor
+!!     file are printed on the right output-listing corresponding tomodel _n.
+!!
+!!    EXTERNAL
+!!    --------
+!!
+!!
+!!    IMPLICIT ARGUMENTS
+!!    ------------------
+!!
+!!      Module MODN_LUNIT_n : contains declarations of namelist NAM_LUNITn
+!!                           and module MODD_LUNIT_n 
+!!
+!!
+!!      Module MODN_CONF_n : contains declaration of namelist NAM_CONFn and
+!!                          uses module MODD_CONF1 (configuration variables
+!!                             for  model _n )
+!!
+!!      Module MODN_DYN_n : contains declaration of namelist NAM_DYNn and
+!!                         uses module MODD_DYN_n (dynamic control variables
+!!                             for   model _n )
+!!
+!!      Module MODN_ADV_n : contains declaration of namelist NAM_ADVn and
+!!                         uses module MODD_ADV_n (control variables for the
+!!                         advection scheme for model _n )
+!!
+!!      Module MODN_PARAM_n : contains declaration of namelist NAM_PARAMn and
+!!                         uses module MODD_PARAM_n (names of the physical
+!!                         parameterizations for model _n )
+!!
+!!      Module MODN_PARAM_RAD_n : contains declaration of the control parameters
+!!                                for calling the radiation scheme
+!!
+!!      Module MODN_PARAM_KAFR_n : contains declaration of control parameters
+!!                                    for calling the deep convection scheme
+!! 
+!!      Module MODN_LBC_n : contains declaration of namelis NAM_LBCn and
+!!                         uses module MODD_LBC_n (lateral boundary conditions)
+!!
+!!
+!!      Module MODN_TURB_n : contains declaration of turbulence scheme options
+!!                        present in the namelist
+!!
+!!      Module MODN_CONF : contains declaration of namelist NAM_CONF and 
+!!                        uses module MODD_CONF (configuration variables) 
+!!
+!!      Module MODN_DYN : contains the  declaration of namelist NAM_DYN and
+!!                        uses module MODD_DYN (dynamic control variables)
+!!                         
+!!      Module MODN_BUDGET : contains declaration of all the namelists
+!!                        related to the budget computations
+!!
+!!      Module MODN_LES  : contains declaration of the control parameters
+!!                                for Large Eddy Simulations' storages
+!!      Module MODN_BLANK_n : contains declaration of MesoNH developper variables
+!!                                for test and debugging purposes.
+!!           
+!!
+!!    REFERENCE
+!!    ---------
+!!      None
+!!      
+!!
+!!    AUTHOR
+!!    ------
+!!	V. Ducrocq       * Meteo France *
+!!
+!!    MODIFICATIONS
+!!    -------------
+!!      Original                      07/06/94 
+!!      Updated      V.Ducrocq        06/09/94
+!!      Updated      J.Stein          20/10/94 to include NAM_OUTn
+!!      Updated      J.Stein          24/10/94 change routine name
+!!      Updated      J.Stein          26/10/94 add the OWRIGET argument
+!!      Updated      J.Stein          06/12/94 add the LS fields       
+!!      Updated      J.Stein          09/01/95 add the turbulence scheme     
+!!      Updated      J.Stein          09/01/95 add the 1D switch
+!!      Updated      J.Stein          20/03/95 remove R from the historical var.
+!!      Updated      Ph.Hereil        20/06/95 add the budgets
+!!      Updated      J.-P. Pinty      15/09/95 add the radiations
+!!      Updated      J.Vila           06/02/96 implementation of scalar
+!!                                             advection schemes
+!!      Updated      J.Stein          20/02/96 cleaning + add the LES namelist
+!!      Modifications  25/04/96  (Suhre)  add NAM_BLANK
+!!      Modifications  25/04/96  (Suhre)  add NAM_FRC
+!!      Modifications  25/04/96  (Suhre)  add NAM_CH_MNHCn and NAM_CH_SOLVER
+!!      Modifications  11/04/96  (Pinty)  add the ice concentration
+!!      Modifications  11/01/97  (Pinty)  add the deep convection
+!!      Temporary Modification (Masson 06/09/96) manual write of the first and
+!!                              third namelists because of compiler version.
+!!      Modifications  J.-P. Lafore   22/07/96 gridnesting implementation
+!!      Modifications  J.-P. Lafore   29/07/96 add NAM_FMOUT (renamed in NAM_OUTPUT/NAM_BACKUP)
+!!      Modifications  V. Masson      10/07/97 add NAM_PARAM_GROUNDn
+!!      Modifications  V. Masson      28/07/97 supress LSTEADY_DMASS
+!!      Modifications  P. Jabouille   03/10/01 LHORELAX_ modifications
+!!      Modifications  P. Jabouille   12/03/02 conditional writing of namelists
+!!      Modifications  J.-P. Pinty    29/11/02 add C3R5, ICE2, ICE4, CELEC
+!!      Modification   V. Masson      01/2004  removes surface (externalization)
+!!      Modification   P. Tulet       01/2005  add dust, orilam
+!!      Modification                  05/2006  Remove EPS and OWRIGET
+!!      Modification    01/2016  (JP Pinty) Add LIMA
+!!                   02/2018 Q.Libois ECRAD
+!!  Philippe Wautelet: 05/2016-04/2018: new data structures and calls for I/O
+!!      Modification   V. Vionnet     07/2017  add blowing snow variables
+!!      Modification   F.Auguste      02/2021  add IBM
+!!                     E.Jezequel     02/2021  add stations read from CSV file
+!  A. Costes      12/2021: add Blaze fire model
+!  P. Wautelet 27/04/2022: add namelist for profilers
+!  P. Wautelet 13/07/2022: add namelist for flyers and balloons
+!  P. Wautelet 19/01/2023: bugfix for ForeFire
+!-------------------------------------------------------------------------------
+!
+!*       0.    DECLARATIONS
+!              ------------
+USE MODD_CONF
+USE MODD_DYN_n,      ONLY: LHORELAX_SVLIMA, LHORELAX_SVFIRE
+#ifdef MNH_FOREFIRE
+USE MODD_FOREFIRE,   ONLY: LFOREFIRE
+#endif
+USE MODD_IBM_LSF,    ONLY: LIBM_LSF
+USE MODD_IO,         ONLY: TFILEDATA
+USE MODD_LUNIT_n,    ONLY: TLUOUT
+USE MODD_PARAMETERS
+USE MODD_PROFILER_n, ONLY: LPROFILER
+USE MODD_STATION_n,  ONLY: LSTATION
+!
+USE MODE_MSG
+!
+! USE MODN_AIRCRAFTS
+USE MODN_BACKUP
+! USE MODN_BALLOONS
+USE MODN_CONF
+USE MODN_DYN
+USE MODN_NESTING
+USE MODN_OUTPUT
+USE MODN_BUDGET
+USE MODN_LES
+USE MODN_DYN_n
+USE MODN_ADV_n
+USE MODN_PARAM_n
+USE MODN_PARAM_RAD_n
+USE MODN_PARAM_ECRAD_n
+USE MODN_PARAM_KAFR_n
+USE MODD_PARAM_MFSHALL_n, ONLY: PARAM_MFSHALLN_INIT
+USE MODD_PARAM_ICE_n, ONLY: PARAM_ICEN_INIT
+USE MODD_PARAM_LIMA, ONLY: PARAM_LIMA_INIT
+USE MODN_CONF_n
+USE MODN_LUNIT_n
+USE MODN_LBC_n
+USE MODN_NUDGING_n
+USE MODD_TURB_n, ONLY: TURBN_INIT
+USE MODD_NEB_n, ONLY: NEBN_INIT
+USE MODN_BLANK_n
+USE MODN_FRC
+USE MODN_CH_MNHC_n
+USE MODN_CH_SOLVER_n
+USE MODN_PARAM_C2R2
+USE MODN_PARAM_C1R3
+USE MODN_ELEC
+USE MODN_SERIES
+USE MODN_SERIES_n 
+USE MODN_TURB_CLOUD
+USE MODN_CH_ORILAM
+USE MODN_DUST
+USE MODN_SALT
+USE MODN_PASPOL
+USE MODN_CONDSAMP
+USE MODN_2D_FRC
+USE MODN_LATZ_EDFLX
+#ifdef MNH_FOREFIRE
+USE MODN_FOREFIRE
+#endif
+USE MODN_BLOWSNOW_n
+USE MODN_BLOWSNOW
+USE MODN_IBM_PARAM_n
+USE MODN_RECYCL_PARAM_n
+USE MODN_PROFILER_n,     LDIAG_SURFRAD_PROF => LDIAG_SURFRAD
+USE MODN_STATION_n,      LDIAG_SURFRAD_STAT => LDIAG_SURFRAD
+USE MODN_FIRE_n
+USE MODN_FLYERS
+!
+IMPLICIT NONE
+!
+!*       0.1   declarations of arguments
+!
+INTEGER,            INTENT(IN)  :: KMI     ! Model index
+TYPE(TFILEDATA),    INTENT(IN)  :: TPDATAFILE ! Datafile
+!
+!*       0.2   declarations of local variables
+!
+INTEGER :: ILUSEG  ! logical unit number of EXSEG file
+INTEGER :: ILUOUT  ! Logical unit number for output-listing TLUOUT file
+!
+LOGICAL                     ::  GHORELAX_UVWTH,                               &
+                                GHORELAX_RV,  GHORELAX_RC, GHORELAX_RR,       &
+                                GHORELAX_RI,  GHORELAX_RS, GHORELAX_RG,       &
+                                GHORELAX_TKE, GHORELAX_SVC2R2, GHORELAX_SVPP, &
+                                GHORELAX_SVCS, GHORELAX_SVCHIC, GHORELAX_SVFIRE,&
+#ifdef MNH_FOREFIRE
+                                GHORELAX_SVFF,                                &
+#endif
+                                GHORELAX_SVCHEM, GHORELAX_SVC1R3,             &
+                                GHORELAX_SVELEC, GHORELAX_SVLIMA,GHORELAX_SVSNW
+LOGICAL                     ::  GHORELAX_SVDST, GHORELAX_SVSLT,  GHORELAX_SVAER
+LOGICAL, DIMENSION(JPSVMAX) ::  GHORELAX_SV
+!
+!-------------------------------------------------------------------------------
+!
+!*       1.    UPDATE DESFM FILE
+!              -----------------
+!
+CALL PRINT_MSG(NVERB_DEBUG,'IO','WRITE_DESFM_n','called for '//TRIM(TPDATAFILE%CNAME))
+!
+IF (.NOT.ASSOCIATED(TPDATAFILE%TDESFILE)) &
+  CALL PRINT_MSG(NVERB_FATAL,'IO','WRITE_DESFM_n','TDESFILE not associated for '//TRIM(TPDATAFILE%CNAME))
+!
+ILUSEG = TPDATAFILE%TDESFILE%NLU
+!
+CALL INIT_NAM_LUNITn
+WRITE(UNIT=ILUSEG,NML=NAM_LUNITn)
+IF (CPROGRAM/='MESONH') THEN
+  LUSECI=.FALSE.
+  NSV_USER = 0      
+ENDIF
+CALL INIT_NAM_CONFn
+WRITE(UNIT=ILUSEG,NML=NAM_CONFn)
+!
+!
+CALL INIT_NAM_DYNn
+IF (CPROGRAM/='MESONH') THEN   ! impose default value for next simulation
+  GHORELAX_UVWTH = LHORELAX_UVWTH
+  GHORELAX_RV    = LHORELAX_RV
+  GHORELAX_RC    = LHORELAX_RC
+  GHORELAX_RR    = LHORELAX_RR
+  GHORELAX_RI    = LHORELAX_RI
+  GHORELAX_RS    = LHORELAX_RS
+  GHORELAX_RG    = LHORELAX_RG
+  GHORELAX_TKE   = LHORELAX_TKE
+  GHORELAX_SV(:) = LHORELAX_SV(:)
+  GHORELAX_SVC2R2= LHORELAX_SVC2R2
+  GHORELAX_SVC1R3= LHORELAX_SVC1R3
+  GHORELAX_SVLIMA= LHORELAX_SVLIMA
+  GHORELAX_SVELEC= LHORELAX_SVELEC
+  GHORELAX_SVCHEM= LHORELAX_SVCHEM
+  GHORELAX_SVCHIC= LHORELAX_SVCHIC
+  GHORELAX_SVDST = LHORELAX_SVDST
+  GHORELAX_SVSLT = LHORELAX_SVSLT
+  GHORELAX_SVPP  = LHORELAX_SVPP
+  GHORELAX_SVFIRE  = LHORELAX_SVFIRE
+#ifdef MNH_FOREFIRE
+  GHORELAX_SVFF  = LHORELAX_SVFF
+#endif
+  GHORELAX_SVCS  = LHORELAX_SVCS 
+  GHORELAX_SVAER = LHORELAX_SVAER
+  GHORELAX_SVSNW = LHORELAX_SVSNW    
+!
+  LHORELAX_UVWTH = .FALSE.
+  LHORELAX_RV    = .FALSE.
+  LHORELAX_RC    = .FALSE.
+  LHORELAX_RR    = .FALSE.
+  LHORELAX_RI    = .FALSE.
+  LHORELAX_RS    = .FALSE.
+  LHORELAX_RG    = .FALSE.
+  LHORELAX_TKE   = .FALSE.
+  LHORELAX_SV(:) = .FALSE.
+  LHORELAX_SVC2R2= .FALSE.
+  LHORELAX_SVC1R3= .FALSE.
+  LHORELAX_SVLIMA= .FALSE.
+  LHORELAX_SVELEC= .FALSE.
+  LHORELAX_SVCHEM= .FALSE.
+  LHORELAX_SVCHIC= .FALSE.
+  LHORELAX_SVLG  = .FALSE.
+  LHORELAX_SVPP  = .FALSE.
+  LHORELAX_SVFIRE  = .FALSE.
+#ifdef MNH_FOREFIRE
+  LHORELAX_SVFF  = .FALSE.
+#endif
+  LHORELAX_SVCS  = .FALSE.
+  LHORELAX_SVDST= .FALSE.
+  LHORELAX_SVSLT= .FALSE.
+  LHORELAX_SVAER= .FALSE.
+  LHORELAX_SVSNW= .FALSE.    
+ELSE  !return to namelist meaning of LHORELAX_SV
+  GHORELAX_SV(:) = LHORELAX_SV(:)
+  LHORELAX_SV(NSV_USER+1:)=.FALSE. 
+END IF
+WRITE(UNIT=ILUSEG,NML=NAM_DYNn)
+!
+IF (LIBM_LSF) THEN
+  !
+  CALL INIT_NAM_IBM_PARAMn
+  !
+  WRITE(UNIT=ILUSEG,NML=NAM_IBM_PARAMn)
+  !
+  IF (CPROGRAM/='MESONH') THEN
+    LIBM         = .FALSE.
+    LIBM_TROUBLE = .FALSE.  
+    CIBM_ADV     = 'NOTHIN' 
+  END IF
+  !
+END IF
+!
+CALL INIT_NAM_ADVn
+WRITE(UNIT=ILUSEG,NML=NAM_ADVn)
+IF (CPROGRAM/='MESONH') THEN
+  CTURB   = 'NONE'
+  CRAD    = 'NONE'
+  CCLOUD  = 'NONE'
+  CDCONV  = 'NONE'
+  CSCONV  = 'NONE'
+  CELEC   = 'NONE'
+  CACTCCN = 'NONE'
+END IF
+CALL INIT_NAM_PARAMn
+WRITE(UNIT=ILUSEG,NML=NAM_PARAMn)
+!
+CALL INIT_NAM_PARAM_RADn
+IF(CRAD /= 'NONE') WRITE(UNIT=ILUSEG,NML=NAM_PARAM_RADn)
+#ifdef MNH_ECRAD
+CALL INIT_NAM_PARAM_ECRADn
+IF(CRAD /= 'NONE') WRITE(UNIT=ILUSEG,NML=NAM_PARAM_ECRADn)
+#endif
+!
+CALL INIT_NAM_PARAM_KAFRn
+IF(CDCONV /= 'NONE' .OR. CSCONV == 'KAFR') &
+       WRITE(UNIT=ILUSEG,NML=NAM_PARAM_KAFRn)
+!
+IF (CSCONV == 'EDKF' ) CALL PARAM_MFSHALLN_INIT(CPROGRAM, TPDATAFILE, .FALSE., ILUSEG, .FALSE., .FALSE., .FALSE., 1)
+!
+CALL INIT_NAM_LBCn
+WRITE(UNIT=ILUSEG,NML=NAM_LBCn)
+!
+CALL INIT_NAM_NUDGINGn
+WRITE(UNIT=ILUSEG,NML=NAM_NUDGINGn)
+!
+IF(CTURB /= 'NONE') CALL TURBN_INIT(CPROGRAM, TPDATAFILE, .FALSE., ILUSEG, .FALSE., .FALSE., .FALSE., 1)
+!
+CALL NEBN_INIT(CPROGRAM, TPDATAFILE, .FALSE., ILUSEG, .FALSE., .FALSE., .FALSE., 1)
+!
+CALL INIT_NAM_BLANKn
+WRITE(UNIT=ILUSEG,NML=NAM_BLANKn)
+!
+!IF (CPROGRAM/='MESONH') THEN
+!  LUSECHEM   = .FALSE.
+!  LORILAM    = .FALSE.
+!  LDEPOS_AER = .FALSE.
+!  LDUST      = .FALSE.
+!  LDEPOS_DST = .FALSE.
+!  LSALT      = .FALSE.
+!  LDEPOS_SLT = .FALSE.
+!  LPASPOL    = .FALSE.
+!  LCONDSAMP  = .FALSE.
+!END IF
+CALL INIT_NAM_CH_MNHCn
+IF(LUSECHEM .OR. LCH_CONV_LINOX .OR. LCH_CONV_SCAV) &
+ WRITE(UNIT=ILUSEG,NML=NAM_CH_MNHCn)
+!
+CALL INIT_NAM_CH_SOLVERn
+IF(LUSECHEM) WRITE(UNIT=ILUSEG,NML=NAM_CH_SOLVERn)
+!
+CALL INIT_NAM_BLOWSNOWn
+IF(LBLOWSNOW) WRITE(UNIT=ILUSEG,NML=NAM_BLOWSNOWn)
+IF(LBLOWSNOW) WRITE(UNIT=ILUSEG,NML=NAM_BLOWSNOW)
+!
+CALL INIT_NAM_PROFILERn
+IF(LPROFILER) WRITE(UNIT=ILUSEG,NML=NAM_PROFILERn)
+!
+CALL INIT_NAM_STATIONn
+IF(LSTATION) WRITE(UNIT=ILUSEG,NML=NAM_STATIONn)
+!
+IF(LDUST) WRITE(UNIT=ILUSEG,NML=NAM_DUST)
+IF(LSALT) WRITE(UNIT=ILUSEG,NML=NAM_SALT)
+IF(LPASPOL) WRITE(UNIT=ILUSEG,NML=NAM_PASPOL)
+#ifdef MNH_FOREFIRE
+IF(LFOREFIRE) WRITE(UNIT=ILUSEG,NML=NAM_FOREFIRE)
+#endif
+!
+CALL INIT_NAM_FIREn
+WRITE(UNIT=ILUSEG,NML=NAM_FIREn)
+!
+IF(LCONDSAMP) WRITE(UNIT=ILUSEG,NML=NAM_CONDSAMP)
+IF(LORILAM.AND.LUSECHEM) WRITE(UNIT=ILUSEG,NML=NAM_CH_ORILAM)
+!
+CALL INIT_NAM_SERIESn
+IF(LSERIES) WRITE(UNIT=ILUSEG,NML=NAM_SERIESn)
+IF(L2D_ADV_FRC .OR. L2D_REL_FRC) WRITE(UNIT=ILUSEG,NML=NAM_2D_FRC)
+!
+IF (LUV_FLX .OR. LTH_FLX) WRITE(UNIT=ILUSEG,NML=NAM_LATZ_EDFLX)
+!
+IF (CPROGRAM/='MESONH') THEN
+  LLG  = .FALSE.
+END IF
+WRITE(UNIT=ILUSEG,NML=NAM_CONF)
+WRITE(UNIT=ILUSEG,NML=NAM_DYN)
+WRITE(UNIT=ILUSEG,NML=NAM_NESTING)
+!WRITE(UNIT=ILUSEG,NML=NAM_BACKUP)
+!WRITE(UNIT=ILUSEG,NML=NAM_OUTPUT)
+IF(CBUTYPE /= 'NONE') THEN
+  IF(CBUTYPE=='SKIP') CBUTYPE='CART'
+  WRITE(UNIT=ILUSEG,NML=NAM_BUDGET)
+END IF
+IF(LBU_RU) WRITE(UNIT=ILUSEG,NML=NAM_BU_RU)
+IF(LBU_RV) WRITE(UNIT=ILUSEG,NML=NAM_BU_RV)
+IF(LBU_RW) WRITE(UNIT=ILUSEG,NML=NAM_BU_RW)
+IF(LBU_RTH) WRITE(UNIT=ILUSEG,NML=NAM_BU_RTH)
+IF(LBU_RTKE) WRITE(UNIT=ILUSEG,NML=NAM_BU_RTKE)
+IF(LBU_RRV) WRITE(UNIT=ILUSEG,NML=NAM_BU_RRV)
+IF(LBU_RRC) WRITE(UNIT=ILUSEG,NML=NAM_BU_RRC)
+IF(LBU_RRR) WRITE(UNIT=ILUSEG,NML=NAM_BU_RRR)
+IF(LBU_RRI) WRITE(UNIT=ILUSEG,NML=NAM_BU_RRI)
+IF(LBU_RRS) WRITE(UNIT=ILUSEG,NML=NAM_BU_RRS)
+IF(LBU_RRG) WRITE(UNIT=ILUSEG,NML=NAM_BU_RRG)
+IF(LBU_RRH) WRITE(UNIT=ILUSEG,NML=NAM_BU_RRH)
+IF(LBU_RSV) WRITE(UNIT=ILUSEG,NML=NAM_BU_RSV)
+IF(LLES_MEAN .OR. LLES_RESOLVED .OR. LLES_SUBGRID .OR. LLES_UPDRAFT  &
+.OR. LLES_DOWNDRAFT .OR. LLES_SPECTRA) WRITE(UNIT=ILUSEG,NML=NAM_LES)
+IF(LFORCING .OR. LTRANS) WRITE(UNIT=ILUSEG,NML=NAM_FRC)
+IF(CCLOUD(1:3) == 'ICE') CALL PARAM_ICEN_INIT(CPROGRAM, TPDATAFILE, .FALSE., ILUSEG, .FALSE., .FALSE., .FALSE., 1)
+IF(CCLOUD == 'C2R2' .OR. CCLOUD == 'C3R5' .OR. CCLOUD == 'KHKO') &
+                     WRITE(UNIT=ILUSEG,NML=NAM_PARAM_C2R2)
+IF(CCLOUD == 'C3R5' ) WRITE(UNIT=ILUSEG,NML=NAM_PARAM_C1R3) 
+IF(CCLOUD == 'LIMA' ) CALL PARAM_LIMA_INIT(CPROGRAM, TPDATAFILE, .FALSE., ILUSEG, .FALSE., .FALSE., .FALSE., 1)
+IF(CELEC /= 'NONE') WRITE(UNIT=ILUSEG,NML=NAM_ELEC) 
+IF(LSERIES) WRITE(UNIT=ILUSEG,NML=NAM_SERIES)
+IF(CTURB /= 'NONE') CALL TURBN_INIT(CPROGRAM, TPDATAFILE, .FALSE., ILUSEG, .FALSE., .FALSE., .FALSE., 1)
+CALL NEBN_INIT(CPROGRAM, TPDATAFILE, .FALSE., ILUSEG, .FALSE., .FALSE., .FALSE., 1)
+WRITE(UNIT=ILUSEG,NML=NAM_FLYERS)
+!Not possible (for the moment): arrays have been deallocated after ini_aircraft: WRITE(UNIT=ILUSEG,NML=NAM_AIRCRAFTS)
+!Not possible (for the moment): arrays have been deallocated after ini_balloon:  WRITE(UNIT=ILUSEG,NML=NAM_BALLOONS)
+!
+!
+!
+!-------------------------------------------------------------------------------
+!
+!*       2.    WRITE UPDATED DESFM ON OUTPUT LISTING
+!              -------------------------------------
+!
+IF (NVERB >= 5) THEN
+!
+  ILUOUT = TLUOUT%NLU
+!
+  WRITE(UNIT=ILUOUT,FMT="(/,'DESCRIPTOR OF SEGMENT FOR MODEL ',I2)") KMI
+  WRITE(UNIT=ILUOUT,FMT="(  '------------------------------- '   )")
+!
+  WRITE(UNIT=ILUOUT,FMT="('********** LOGICAL UNITSn **********')")
+  WRITE(UNIT=ILUOUT,NML=NAM_LUNITn)
+!  
+  WRITE(UNIT=ILUOUT,FMT="('********** CONFIGURATIONn **********')")
+  WRITE(UNIT=ILUOUT,NML=NAM_CONFn)
+!  
+!  
+  WRITE(UNIT=ILUOUT,FMT="('********** DYNAMICn ****************')")
+  WRITE(UNIT=ILUOUT,NML=NAM_DYNn)
+!  
+  WRITE(UNIT=ILUOUT,FMT="('********** ADVECTIONn **************')")
+  WRITE(UNIT=ILUOUT,NML=NAM_ADVn)
+  !  
+  IF (LIBM_LSF) THEN
+    WRITE(UNIT=ILUOUT,FMT="('********** IBM_PARAMn **************')")                           
+    WRITE(UNIT=ILUOUT,NML=NAM_IBM_PARAMn)
+  ENDIF
+  !
+  IF (LRECYCL) THEN
+    WRITE(UNIT=ILUOUT,FMT="('********** RECYCL_PARAMn **************')")
+    WRITE(UNIT=ILUOUT,NML=NAM_RECYCL_PARAMn)
+  ENDIF
+  !  
+  WRITE(UNIT=ILUOUT,FMT="('********** PARAMETERIZATIONSn ******')")
+  WRITE(UNIT=ILUOUT,NML=NAM_PARAMn)
+!  
+  WRITE(UNIT=ILUOUT,FMT="('********** RADIATIONn **************')")
+  WRITE(UNIT=ILUOUT,NML=NAM_PARAM_RADn)
+#ifdef MNH_ECRAD
+  WRITE(UNIT=ILUOUT,FMT="('********** ECRADn **************')")
+  WRITE(UNIT=ILUOUT,NML=NAM_PARAM_ECRADn)
+#endif
+!  
+  WRITE(UNIT=ILUOUT,FMT="('********** CONVECTIONn *************')")
+  WRITE(UNIT=ILUOUT,NML=NAM_PARAM_KAFRn)
+!  
+  WRITE(UNIT=ILUOUT,FMT="('************ PARAM_MFSHALLn  *******')")
+  CALL PARAM_MFSHALLN_INIT(CPROGRAM, TPDATAFILE, .FALSE., ILUOUT, .FALSE., .FALSE., .FALSE., 2)
+!
+  WRITE(UNIT=ILUOUT,FMT="('********** LBCn ********************')")
+  WRITE(UNIT=ILUOUT,NML=NAM_LBCn)
+!
+  WRITE(UNIT=ILUOUT,FMT="('********** NUDGINGn*****************')")  
+  WRITE(UNIT=ILUOUT,NML=NAM_NUDGINGn)
+!  
+  WRITE(UNIT=ILUOUT,FMT="('********** TURBn *******************')")  
+  CALL TURBN_INIT(CPROGRAM, TPDATAFILE, .FALSE., ILUOUT, .FALSE., .FALSE., .FALSE., 2)
+!  
+  WRITE(UNIT=ILUOUT,FMT="('********** NEBn *******************')")  
+  CALL NEBN_INIT(CPROGRAM, TPDATAFILE, .FALSE., ILUOUT, .FALSE., .FALSE., .FALSE., 2)
+!  
+  WRITE(UNIT=ILUOUT,FMT="('********** CHEMICAL MONITORn *******')")  
+  WRITE(UNIT=ILUOUT,NML=NAM_CH_MNHCn)
+!
+  WRITE(UNIT=ILUOUT,FMT="('************ CHEMICAL SOLVERn ******************')")
+  WRITE(UNIT=ILUOUT,NML=NAM_CH_SOLVERn)
+!
+  WRITE(UNIT=ILUOUT,FMT="('************ TEMPORAL SERIESn ******************')")
+  WRITE(UNIT=ILUOUT,NML=NAM_SERIESn)
+!  
+  WRITE(UNIT=ILUOUT,FMT="('********** BLOWING SNOW SCHEME ****************')")
+  WRITE(UNIT=ILUOUT,NML=NAM_BLOWSNOWn)
+!
+  WRITE(UNIT=ILUOUT,FMT="('********** BLAZE *******************')")
+  WRITE(UNIT=ILUOUT,NML=NAM_FIREn)
+!
+  WRITE(UNIT=ILUOUT,FMT="('********** BLANKn *****************************')")
+  WRITE(UNIT=ILUOUT,NML=NAM_BLANKn)
+!
+  WRITE(UNIT=ILUOUT,FMT="('************ ICE SCHEME ***********************')")
+  CALL PARAM_ICEN_INIT(CPROGRAM, TPDATAFILE, .FALSE., ILUOUT, .FALSE., .FALSE., .FALSE., 2)
+!    
+  IF (KMI==1) THEN
+    WRITE(UNIT=ILUOUT,FMT="(/,'PART OF SEGMENT FILE COMMON TO ALL THE MODELS')")
+    WRITE(UNIT=ILUOUT,FMT="(  '---------------------------------------------')")
+!
+    WRITE(UNIT=ILUOUT,FMT="('************ CONFIGURATION ********************')")
+    WRITE(UNIT=ILUOUT,NML=NAM_CONF)
+!    
+    WRITE(UNIT=ILUOUT,FMT="('************ DYNAMIC **************************')")
+    WRITE(UNIT=ILUOUT,NML=NAM_DYN)
+!
+    WRITE(UNIT=ILUOUT,FMT="(/,'********** NESTING **************************')")
+    WRITE(UNIT=ILUOUT,NML=NAM_NESTING)
+!
+!    WRITE(UNIT=ILUOUT,FMT="(/,'********** BACKUP ***************************')")
+!    WRITE(UNIT=ILUOUT,NML=NAM_BACKUP)
+!
+!    WRITE(UNIT=ILUOUT,FMT="(/,'********** OUTPUT ***************************')")
+!    WRITE(UNIT=ILUOUT,NML=NAM_OUTPUT)
+!
+    WRITE(UNIT=ILUOUT,FMT="('************ BUDGET ***************************')")
+    WRITE(UNIT=ILUOUT,NML=NAM_BUDGET)
+!    
+    IF ( .NOT. ALLOCATED( CBULIST_RU ) ) ALLOCATE( CHARACTER(LEN=NBULISTMAXLEN) :: CBULIST_RU(0) )
+    WRITE(UNIT=ILUOUT,FMT="('************ U BUDGET *************************')")
+    WRITE(UNIT=ILUOUT,NML=NAM_BU_RU)
+!
+    IF ( .NOT. ALLOCATED( CBULIST_RV ) ) ALLOCATE( CHARACTER(LEN=NBULISTMAXLEN) :: CBULIST_RV(0) )
+    WRITE(UNIT=ILUOUT,FMT="('************ V BUDGET *************************')")
+    WRITE(UNIT=ILUOUT,NML=NAM_BU_RV)
+!    
+    IF ( .NOT. ALLOCATED( CBULIST_RW ) ) ALLOCATE( CHARACTER(LEN=NBULISTMAXLEN) :: CBULIST_RW(0) )
+    WRITE(UNIT=ILUOUT,FMT="('************ W BUDGET *************************')")
+    WRITE(UNIT=ILUOUT,NML=NAM_BU_RW)
+!    
+    IF ( .NOT. ALLOCATED( CBULIST_RTH ) ) ALLOCATE( CHARACTER(LEN=NBULISTMAXLEN) :: CBULIST_RTH(0) )
+    WRITE(UNIT=ILUOUT,FMT="('************ TH BUDGET ************************')")
+    WRITE(UNIT=ILUOUT,NML=NAM_BU_RTH)
+!    
+    IF ( .NOT. ALLOCATED( CBULIST_RTKE ) ) ALLOCATE( CHARACTER(LEN=NBULISTMAXLEN) :: CBULIST_RTKE(0) )
+    WRITE(UNIT=ILUOUT,FMT="('************ TKE BUDGET ***********************')")
+    WRITE(UNIT=ILUOUT,NML=NAM_BU_RTKE)
+!    
+    IF ( .NOT. ALLOCATED( CBULIST_RRV ) ) ALLOCATE( CHARACTER(LEN=NBULISTMAXLEN) :: CBULIST_RRV(0) )
+    WRITE(UNIT=ILUOUT,FMT="('************ RV BUDGET ************************')")
+    WRITE(UNIT=ILUOUT,NML=NAM_BU_RRV)
+!    
+    IF ( .NOT. ALLOCATED( CBULIST_RRC ) ) ALLOCATE( CHARACTER(LEN=NBULISTMAXLEN) :: CBULIST_RRC(0) )
+    WRITE(UNIT=ILUOUT,FMT="('************ RC BUDGET ************************')")
+    WRITE(UNIT=ILUOUT,NML=NAM_BU_RRC)
+!    
+    IF ( .NOT. ALLOCATED( CBULIST_RRR ) ) ALLOCATE( CHARACTER(LEN=NBULISTMAXLEN) :: CBULIST_RRR(0) )
+    WRITE(UNIT=ILUOUT,FMT="('************ RR BUDGET ************************')")
+    WRITE(UNIT=ILUOUT,NML=NAM_BU_RRR)
+!    
+    IF ( .NOT. ALLOCATED( CBULIST_RRI ) ) ALLOCATE( CHARACTER(LEN=NBULISTMAXLEN) :: CBULIST_RRI(0) )
+    WRITE(UNIT=ILUOUT,FMT="('************ RI BUDGET ************************')")
+    WRITE(UNIT=ILUOUT,NML=NAM_BU_RRI)
+!    
+    IF ( .NOT. ALLOCATED( CBULIST_RRS ) ) ALLOCATE( CHARACTER(LEN=NBULISTMAXLEN) :: CBULIST_RRS(0) )
+    WRITE(UNIT=ILUOUT,FMT="('************ RS BUDGET ************************')")
+    WRITE(UNIT=ILUOUT,NML=NAM_BU_RRS)
+!    
+    IF ( .NOT. ALLOCATED( CBULIST_RRG ) ) ALLOCATE( CHARACTER(LEN=NBULISTMAXLEN) :: CBULIST_RRG(0) )
+    WRITE(UNIT=ILUOUT,FMT="('************ RG BUDGET ************************')")
+    WRITE(UNIT=ILUOUT,NML=NAM_BU_RRG)
+!    
+    IF ( .NOT. ALLOCATED( CBULIST_RRH ) ) ALLOCATE( CHARACTER(LEN=NBULISTMAXLEN) :: CBULIST_RRH(0) )
+    WRITE(UNIT=ILUOUT,FMT="('************ RH BUDGET ************************')")
+    WRITE(UNIT=ILUOUT,NML=NAM_BU_RRH)
+!
+    IF ( .NOT. ALLOCATED( CBULIST_RSV ) ) ALLOCATE( CHARACTER(LEN=NBULISTMAXLEN) :: CBULIST_RSV(0) )
+    WRITE(UNIT=ILUOUT,FMT="('************ SVx BUDGET ***********************')")
+    WRITE(UNIT=ILUOUT,NML=NAM_BU_RSV)
+!    
+    WRITE(UNIT=ILUOUT,FMT="('************ LES ******************************')")
+    WRITE(UNIT=ILUOUT,NML=NAM_LES)
+!    
+    WRITE(UNIT=ILUOUT,FMT="('************ FORCING **************************')")
+    WRITE(UNIT=ILUOUT,NML=NAM_FRC)
+!    
+    WRITE(UNIT=ILUOUT,FMT="('********** DUST SCHEME ************************')")
+    WRITE(UNIT=ILUOUT,NML=NAM_DUST)
+!
+    WRITE(UNIT=ILUOUT,FMT="('********** PASPOL *****************************')")
+    WRITE(UNIT=ILUOUT,NML=NAM_PASPOL)
+!
+#ifdef MNH_FOREFIRE
+    WRITE(UNIT=ILUOUT,FMT="('********** FOREFIRE *****************************')")
+    WRITE(UNIT=ILUOUT,NML=NAM_FOREFIRE)
+!
+#endif
+!
+    WRITE(UNIT=ILUOUT,FMT="('********** CONDSAMP****************************')")
+    WRITE(UNIT=ILUOUT,NML=NAM_CONDSAMP)
+!
+    WRITE(UNIT=ILUOUT,FMT="('********** SALT SCHEME ************************')")
+    WRITE(UNIT=ILUOUT,NML=NAM_SALT)
+!
+    WRITE(UNIT=ILUOUT,FMT="('********** BLOWING SNOW SCHEME ****************')")
+    WRITE(UNIT=ILUOUT,NML=NAM_BLOWSNOW)    
+!
+    WRITE(UNIT=ILUOUT,FMT="('************ ORILAM SCHEME ********************')")
+    WRITE(UNIT=ILUOUT,NML=NAM_CH_ORILAM)
+!    
+    IF( CCLOUD == 'C2R2' .OR. CCLOUD == 'C3R5') THEN
+      WRITE(UNIT=ILUOUT,FMT="('*********** C2R2 SCHEME *********************')")
+      WRITE(UNIT=ILUOUT,NML=NAM_PARAM_C2R2)
+      IF( CCLOUD == 'C3R5' ) THEN
+        WRITE(UNIT=ILUOUT,FMT="('*********** C1R3 SCHEME *********************')")
+        WRITE(UNIT=ILUOUT,NML=NAM_PARAM_C1R3)
+      END IF
+    END IF
+!
+    IF( CCLOUD == 'LIMA' ) THEN
+      WRITE(UNIT=ILUOUT,FMT="('*********** LIMA SCHEME *********************')")
+      CALL PARAM_LIMA_INIT(CPROGRAM, TPDATAFILE, .FALSE., ILUOUT, .FALSE., .FALSE., .FALSE., 2)
+    END IF
+!
+    IF( CCLOUD == 'KHKO' ) THEN
+      WRITE(UNIT=ILUOUT,FMT="('*********** KHKO SCHEME *********************')")
+      WRITE(UNIT=ILUOUT,NML=NAM_PARAM_C2R2)
+    END IF
+!
+    IF( CELEC /= 'NONE' ) THEN
+      WRITE(UNIT=ILUOUT,FMT="('*********** ELEC SCHEME *********************')")
+      WRITE(UNIT=ILUOUT,NML=NAM_ELEC)
+    END IF
+!
+    WRITE(UNIT=ILUOUT,FMT="('************ TEMPORAL SERIES ****************')")
+    WRITE(UNIT=ILUOUT,NML=NAM_SERIES)
+!
+    WRITE(UNIT=ILUOUT,FMT="('************ MIXING LENGTH FOR CLOUD ***********')")
+    WRITE(UNIT=ILUOUT,NML=NAM_TURB_CLOUD)
+!
+  END IF
+!
+END IF  
+!
+IF (CPROGRAM /='MESONH') THEN !return to previous LHORELAX_
+  LHORELAX_UVWTH = GHORELAX_UVWTH
+  LHORELAX_RV    = GHORELAX_RV
+  LHORELAX_RC    = GHORELAX_RC
+  LHORELAX_RR    = GHORELAX_RR
+  LHORELAX_RI    = GHORELAX_RI
+  LHORELAX_RS    = GHORELAX_RS
+  LHORELAX_RG    = GHORELAX_RG
+  LHORELAX_TKE   = GHORELAX_TKE
+  LHORELAX_SV(:) = GHORELAX_SV(:)
+  LHORELAX_SVC2R2= GHORELAX_SVC2R2
+  LHORELAX_SVC1R3= GHORELAX_SVC1R3
+  LHORELAX_SVLIMA= GHORELAX_SVLIMA
+  LHORELAX_SVELEC= GHORELAX_SVELEC
+  LHORELAX_SVCHEM= GHORELAX_SVCHEM
+  LHORELAX_SVCHIC= GHORELAX_SVCHIC
+  LHORELAX_SVLG  = .FALSE.
+  LHORELAX_SVDST = GHORELAX_SVDST
+  LHORELAX_SVSLT = GHORELAX_SVSLT
+  LHORELAX_SVPP  = GHORELAX_SVPP 
+  LHORELAX_SVFIRE  = GHORELAX_SVFIRE
+#ifdef MNH_FOREFIRE
+  LHORELAX_SVFF  = GHORELAX_SVFF
+#endif
+  LHORELAX_SVCS  = GHORELAX_SVCS 
+  LHORELAX_SVAER = GHORELAX_SVAER
+  LHORELAX_SVSNW = GHORELAX_SVSNW  
+ELSE
+  LHORELAX_SV(:) = GHORELAX_SV(:)
+ENDIF
+CALL UPDATE_NAM_DYNn
+!------------------------------------------------------------------------------
+!
+END SUBROUTINE WRITE_DESFM_n
diff --git a/src/PHYEX/ext/write_lesn.f90 b/src/PHYEX/ext/write_lesn.f90
new file mode 100644
index 0000000000000000000000000000000000000000..44f915343d63daec3f7f285412ab3fdb75b6fd2d
--- /dev/null
+++ b/src/PHYEX/ext/write_lesn.f90
@@ -0,0 +1,1319 @@
+!MNH_LIC Copyright 2000-2021 CNRS, Meteo-France and Universite Paul Sabatier
+!MNH_LIC This is part of the Meso-NH software governed by the CeCILL-C licence
+!MNH_LIC version 1. See LICENSE, CeCILL-C_V1-en.txt and CeCILL-C_V1-fr.txt
+!MNH_LIC for details. version 1.
+!-----------------------------------------------------------------
+!######################
+module mode_write_les_n
+!######################
+
+use modd_field, only: tfieldmetadata_base
+
+implicit none
+
+private
+
+public :: Write_les_n
+
+
+character(len=:), allocatable :: cgroup
+character(len=:), allocatable :: cgroupcomment
+
+logical :: ldoavg    ! Compute and store time average
+logical :: ldonorm   ! Compute and store normalized field
+
+type(tfieldmetadata_base) :: tfield
+type(tfieldmetadata_base) :: tfieldx
+type(tfieldmetadata_base) :: tfieldy
+
+interface Les_diachro_write
+  module procedure Les_diachro_write_1D, Les_diachro_write_2D, Les_diachro_write_3D, Les_diachro_write_4D
+end interface
+
+contains
+
+!###################################
+subroutine  Write_les_n( tpdiafile )
+!###################################
+!
+!
+!!****  *WRITE_LES_n* writes the LES final diagnostics for model _n
+!!
+!!
+!!    PURPOSE
+!!    -------
+!!
+!!    EXTERNAL
+!!    --------
+!!
+!!    IMPLICIT ARGUMENTS
+!!    ------------------
+!!
+!!    REFERENCE
+!!    ---------
+!!
+!!    AUTHOR
+!!    ------
+!!      V. Masson
+!!
+!!    MODIFICATIONS
+!!    -------------
+!!      Original         07/02/00
+!!                       01/02/01 (D. Gazen) add module MODD_NSV for NSV variable
+!!                       06/11/02 (V. Masson) some minor bugs
+!!                       01/04/03 (V. Masson) idem
+!!                       10/10/09 (P. Aumond) Add user multimaskS
+!!                          11/15 (C.Lac) Add production terms of TKE
+!!                    10/2016 (C.Lac) Add droplet deposition
+!  P. Wautelet 05/2016-04/2018: new data structures and calls for I/O
+!  C. Lac         02/2019: add rain fraction as a LES diagnostic
+!  P. Wautelet 13/09/2019: budget: simplify and modernize date/time management
+!  P. Wautelet 12/10/2020: remove HLES_AVG dummy argument and group all 4 calls
+!  P. Wautelet 13/10/2020: bugfix: correct some names for LES_DIACHRO_2PT diagnostics (Ri)
+!  P. Wautelet 26/10/2020: bugfix: correct some comments and conditions + add missing RES_RTPZ
+!  P. Wautelet 26/10/2020: restructure subroutines to use tfieldmetadata_base type
+! --------------------------------------------------------------------------
+!
+!*      0. DECLARATIONS
+!          ------------
+!
+use modd_conf_n,     only: luserv, luserc, luserr, luseri, lusers, luserg, luserh
+use modd_io,         only: tfiledata
+use modd_field,      only: NMNHDIM_BUDGET_LES_TIME, NMNHDIM_BUDGET_LES_LEVEL, NMNHDIM_BUDGET_LES_SV, NMNHDIM_BUDGET_LES_MASK, &
+                           NMNHDIM_BUDGET_LES_PDF,                                                                            &
+                           NMNHDIM_SPECTRA_2PTS_NI, NMNHDIM_SPECTRA_2PTS_NJ,  NMNHDIM_SPECTRA_LEVEL, NMNHDIM_UNUSED,          &
+                           TYPEREAL
+use modd_grid_n,     only: xdxhat, xdyhat
+use modd_nsv,        only: nsv
+use modd_les
+use modd_les_n
+use modd_param_n,    only: ccloud
+use modd_param_c2r2, only: ldepoc
+USE MODD_PARAM_ICE_n,  only: ldeposc
+use modd_parameters, only: XUNDEF
+
+use mode_les_spec_n,            only: Les_spec_n
+use mode_modeln_handler,        only: Get_current_model_index
+use mode_write_les_budget_n,    only: Write_les_budget_n
+use mode_write_les_rt_budget_n, only: Write_les_rt_budget_n
+use mode_write_les_sv_budget_n, only: Write_les_sv_budget_n
+
+IMPLICIT NONE
+!
+!*      0.1  declarations of arguments
+!
+TYPE(TFILEDATA),  INTENT(IN) :: TPDIAFILE! file to write
+!
+!
+!*      0.2  declaration of local variables
+!
+INTEGER :: IMASK
+!
+INTEGER :: JSV       ! scalar loop counter
+INTEGER :: JI        ! loop counter
+!
+character(len=3)                        :: ynum
+CHARACTER(len=5)                        :: YGROUP
+character(len=7), dimension(nles_masks) :: ymasks
+!
+logical :: gdoavg    ! Compute and store time average
+logical :: gdonorm   ! Compute and store normalized field
+REAL, DIMENSION(:,:,:), ALLOCATABLE     :: ZAVG_PTS_ll
+REAL, DIMENSION(:,:,:), ALLOCATABLE     :: ZUND_PTS_ll
+REAL                                    :: ZCART_PTS_ll
+INTEGER                                 :: IMI ! Current model inde
+!
+!-------------------------------------------------------------------------------
+!
+IF (.NOT. LLES) RETURN
+!
+!
+!*      1.   Initializations
+!            ---------------
+!
+IMI = GET_CURRENT_MODEL_INDEX()
+!
+!
+!*      1.1  Normalization variables
+!            -----------------------
+!
+IF (CLES_NORM_TYPE/='NONE' ) THEN
+  CALL LES_ALLOCATE('XLES_NORM_M',  (/NLES_TIMES/))
+  CALL LES_ALLOCATE('XLES_NORM_S',  (/NLES_TIMES/))
+  CALL LES_ALLOCATE('XLES_NORM_K',  (/NLES_TIMES/))
+  CALL LES_ALLOCATE('XLES_NORM_RHO',(/NLES_TIMES/))
+  CALL LES_ALLOCATE('XLES_NORM_RV', (/NLES_TIMES/))
+  CALL LES_ALLOCATE('XLES_NORM_SV', (/NLES_TIMES,NSV/))
+  CALL LES_ALLOCATE('XLES_NORM_P',  (/NLES_TIMES/))
+  !
+  IF (CLES_NORM_TYPE=='CONV') THEN
+    WHERE (XLES_WSTAR(:)>0.)
+      XLES_NORM_M(:)   = XLES_BL_HEIGHT(:)
+      XLES_NORM_S(:)   = XLES_NORM_M(:) / XLES_WSTAR(:)
+      XLES_NORM_K(:)   = XLES_Q0(:) / XLES_WSTAR(:)
+      XLES_NORM_RHO(:) = XLES_MEAN_RHO(1,:,1)
+      XLES_NORM_RV(:)  = XLES_E0(:) / XLES_WSTAR(:)
+      XLES_NORM_P(:)   = XLES_MEAN_RHO(1,:,1) * XLES_WSTAR(:)**2
+    ELSEWHERE
+      XLES_NORM_M(:)   = 0.
+      XLES_NORM_S(:)   = 0.
+      XLES_NORM_K(:)   = 0.
+      XLES_NORM_RHO(:) = 0.
+      XLES_NORM_RV(:)  = 0.
+      XLES_NORM_P(:)   = 0.
+    END WHERE
+    DO JSV=1,NSV
+      WHERE (XLES_WSTAR(:)>0.)
+        XLES_NORM_SV(:,JSV)= XLES_SV0(:,JSV) / XLES_WSTAR(:)
+      ELSEWHERE
+        XLES_NORM_SV(:,JSV)= 0.
+      END WHERE
+    END DO
+  ELSE IF (CLES_NORM_TYPE=='EKMA') THEN
+    WHERE (XLES_USTAR(:)>0.)
+      XLES_NORM_M(:)   = XLES_BL_HEIGHT(:)
+      XLES_NORM_S(:)   = XLES_NORM_M(:) / XLES_USTAR(:)
+      XLES_NORM_K(:)   = XLES_Q0(:) / XLES_USTAR(:)
+      XLES_NORM_RHO(:) = XLES_MEAN_RHO(1,:,1)
+      XLES_NORM_RV(:)  = XLES_E0(:) / XLES_USTAR(:)
+      XLES_NORM_P(:)   = XLES_MEAN_RHO(1,:,1) * XLES_USTAR(:)**2
+    ELSEWHERE
+      XLES_NORM_M(:)   = 0.
+      XLES_NORM_S(:)   = 0.
+      XLES_NORM_K(:)   = 0.
+      XLES_NORM_RHO(:) = 0.
+      XLES_NORM_RV(:)  = 0.
+      XLES_NORM_P(:)   = 0.
+    END WHERE
+    DO JSV=1,NSV
+      WHERE (XLES_USTAR(:)>0.)
+        XLES_NORM_SV(:,JSV)= XLES_SV0(:,JSV) / XLES_USTAR(:)
+      ELSEWHERE
+        XLES_NORM_SV(:,JSV)= 0.
+      END WHERE
+    END DO
+  ELSE IF (CLES_NORM_TYPE=='MOBU') THEN
+    XLES_NORM_M(:) = XLES_MO_LENGTH(:)
+    WHERE (XLES_USTAR(:)>0.)
+      XLES_NORM_S(:)   = XLES_NORM_M(:) / XLES_USTAR(:)
+      XLES_NORM_K(:)   = XLES_Q0(:) / XLES_USTAR(:)
+      XLES_NORM_RHO(:) = XLES_MEAN_RHO(1,:,1)
+      XLES_NORM_RV(:)  = XLES_E0(:) / XLES_USTAR(:)
+      XLES_NORM_P(:)   = XLES_MEAN_RHO(1,:,1) * XLES_USTAR(:)**2
+    ELSEWHERE
+      XLES_NORM_S(:)   = 0.
+      XLES_NORM_K(:)   = 0.
+      XLES_NORM_RHO(:) = 0.
+      XLES_NORM_RV(:)  = 0.
+      XLES_NORM_P(:)   = 0.
+    END WHERE
+    DO JSV=1,NSV
+      WHERE (XLES_USTAR(:)>0.)
+        XLES_NORM_SV(:,JSV)= XLES_SV0(:,JSV) / XLES_USTAR(:)
+      ELSEWHERE
+        XLES_NORM_SV(:,JSV)= 0.
+      END WHERE
+    END DO
+  END IF
+END IF
+!
+!*      1.2  Initializations for WRITE_DIACHRO
+!            ---------------------------------
+!
+NLES_CURRENT_TIMES=NLES_TIMES
+!
+CALL LES_ALLOCATE('XLES_CURRENT_Z',(/NLES_K/))
+
+XLES_CURRENT_Z(:) = XLES_Z(:)
+!
+XLES_CURRENT_ZS = XLES_ZS
+!
+NLES_CURRENT_IINF=NLESn_IINF(IMI)
+NLES_CURRENT_ISUP=NLESn_ISUP(IMI)
+NLES_CURRENT_JINF=NLESn_JINF(IMI)
+NLES_CURRENT_JSUP=NLESn_JSUP(IMI)
+!
+XLES_CURRENT_DOMEGAX=XDXHAT(1)
+XLES_CURRENT_DOMEGAY=XDYHAT(1)
+
+tfield%ngrid = 0 !Not on the Arakawa grid
+tfield%ntype = TYPEREAL
+!
+!*      2.   (z,t) profiles (all masks)
+!            --------------
+IMASK = 1
+ymasks(imask) = 'cart'
+IF (LLES_NEB_MASK) THEN
+  IMASK=IMASK+1
+  ymasks(imask) = 'neb'
+  IMASK=IMASK+1
+  ymasks(imask) = 'clear'
+END IF
+IF (LLES_CORE_MASK) THEN
+  IMASK=IMASK+1
+  ymasks(imask) = 'core'
+  IMASK=IMASK+1
+  ymasks(imask) = 'env'
+END IF
+IF (LLES_MY_MASK) THEN
+   DO JI=1,NLES_MASKS_USER
+        IMASK=IMASK+1
+        Write( ynum, '( i3.3 )' ) ji
+        ymasks(imask) = 'user' // ynum
+   END DO
+END IF
+IF (LLES_CS_MASK) THEN
+  IMASK=IMASK+1
+  ymasks(imask) = 'cs1'
+  IMASK=IMASK+1
+  ymasks(imask) = 'cs2'
+  IMASK=IMASK+1
+  ymasks(imask) = 'cs3'
+END IF
+!
+!*      2.0  averaging diagnostics
+!            ---------------------
+!
+ALLOCATE(ZAVG_PTS_ll (NLES_K,NLES_TIMES,NLES_MASKS))
+ALLOCATE(ZUND_PTS_ll (NLES_K,NLES_TIMES,NLES_MASKS))
+
+ZAVG_PTS_ll(:,:,:) = NLES_AVG_PTS_ll(:,:,:)
+ZUND_PTS_ll(:,:,:) = NLES_UND_PTS_ll(:,:,:)
+ZCART_PTS_ll       = (NLESn_ISUP(IMI)-NLESn_IINF(IMI)+1) * (NLESn_JSUP(IMI)-NLESn_JINF(IMI)+1)
+
+tfield%ndims = 3
+tfield%ndimlist(1)  = NMNHDIM_BUDGET_LES_LEVEL
+tfield%ndimlist(2)  = NMNHDIM_BUDGET_LES_TIME
+tfield%ndimlist(3)  = NMNHDIM_BUDGET_LES_MASK
+tfield%ndimlist(4:) = NMNHDIM_UNUSED
+
+ldoavg  = xles_temp_mean_start /= XUNDEF .and. xles_temp_mean_end /= XUNDEF
+ldonorm = .false.
+
+cgroup        = 'Miscellaneous'
+cgroupcomment = 'Miscellaneous terms (geometry, various unclassified averaged terms...)'
+
+call Les_diachro_write( tpdiafile, zavg_pts_ll,                'AVG_PTS',  'number of points used for averaging',   '1', ymasks )
+call Les_diachro_write( tpdiafile, zavg_pts_ll / zcart_pts_ll, 'AVG_PTSF', 'fraction of points used for averaging', '1', ymasks )
+call Les_diachro_write( tpdiafile, zund_pts_ll,                'UND_PTS',  'number of points below orography',      '1', ymasks )
+call Les_diachro_write( tpdiafile, zund_pts_ll / zcart_pts_ll, 'UND_PTSF', 'fraction of points below orography',    '1', ymasks )
+
+DEALLOCATE(ZAVG_PTS_ll)
+DEALLOCATE(ZUND_PTS_ll)
+!
+!*      2.1  mean quantities
+!            ---------------
+!
+cgroup = 'Mean'
+cgroupcomment = 'Mean vertical profiles of the model variables'
+
+tfield%ndims = 3
+tfield%ndimlist(1)  = NMNHDIM_BUDGET_LES_LEVEL
+tfield%ndimlist(2)  = NMNHDIM_BUDGET_LES_TIME
+tfield%ndimlist(3)  = NMNHDIM_BUDGET_LES_MASK
+tfield%ndimlist(4:) = NMNHDIM_UNUSED
+
+ldoavg  = xles_temp_mean_start /= XUNDEF .and. xles_temp_mean_end /= XUNDEF
+ldonorm = trim(cles_norm_type) /= 'NONE'
+
+call Les_diachro_write( tpdiafile, XLES_MEAN_U,      'MEAN_U',      'Mean U Profile',                        'm s-1',  ymasks )
+call Les_diachro_write( tpdiafile, XLES_MEAN_V,      'MEAN_V',      'Mean V Profile',                        'm s-1',  ymasks )
+call Les_diachro_write( tpdiafile, XLES_MEAN_W,      'MEAN_W',      'Mean W Profile',                        'm s-1',  ymasks )
+call Les_diachro_write( tpdiafile, XLES_MEAN_P,      'MEAN_PRE',    'Mean pressure Profile',                 'Pa',     ymasks )
+call Les_diachro_write( tpdiafile, XLES_MEAN_DP,     'MEAN_DP',     'Mean Dyn production TKE Profile',       'm2 s-3', ymasks )
+call Les_diachro_write( tpdiafile, XLES_MEAN_TP,     'MEAN_TP',     'Mean Thermal production TKE Profile',   'm2 s-3', ymasks )
+call Les_diachro_write( tpdiafile, XLES_MEAN_TR,     'MEAN_TR',     'Mean transport production TKE Profile', 'm2 s-3', ymasks )
+call Les_diachro_write( tpdiafile, XLES_MEAN_DISS,   'MEAN_DISS',   'Mean Dissipation TKE Profile',          'm2 s-3', ymasks )
+call Les_diachro_write( tpdiafile, XLES_MEAN_LM,     'MEAN_LM',     'Mean mixing length Profile',            'm',      ymasks )
+call Les_diachro_write( tpdiafile, XLES_MEAN_RHO,    'MEAN_RHO',    'Mean density Profile',                  'kg m-3', ymasks )
+call Les_diachro_write( tpdiafile, XLES_MEAN_Th,     'MEAN_TH',     'Mean potential temperature Profile',    'K',      ymasks )
+call Les_diachro_write( tpdiafile, XLES_MEAN_Mf,     'MEAN_MF',     'Mass-flux Profile',                     'm s-1',  ymasks )
+if ( luserc ) &
+call Les_diachro_write( tpdiafile, XLES_MEAN_Thl,    'MEAN_THL',    'Mean liquid potential temperature Profile',  'K', ymasks )
+if ( luserv ) &
+call Les_diachro_write( tpdiafile, XLES_MEAN_Thv,    'MEAN_THV',    'Mean virtual potential temperature Profile', 'K', ymasks )
+if ( luserc ) &
+call Les_diachro_write( tpdiafile, XLES_MEAN_Rt,     'MEAN_RT',     'Mean Rt Profile', 'kg kg-1', ymasks )
+if ( luserv ) &
+call Les_diachro_write( tpdiafile, XLES_MEAN_Rv,     'MEAN_RV',     'Mean Rv Profile', 'kg kg-1', ymasks )
+if ( luserv ) &
+call Les_diachro_write( tpdiafile, XLES_MEAN_Rehu,   'MEAN_REHU',   'Mean Rh Profile', 'percent', ymasks )
+if ( luserv ) &
+call Les_diachro_write( tpdiafile, XLES_MEAN_Qs,     'MEAN_QS',     'Mean Qs Profile', 'kg kg-1', ymasks )
+if ( luserc ) &
+call Les_diachro_write( tpdiafile, XLES_MEAN_KHt,    'MEAN_KHT',    'Eddy-diffusivity (temperature) Profile', 'm2 s-1', ymasks )
+if ( luserc ) &
+call Les_diachro_write( tpdiafile, XLES_MEAN_KHr,    'MEAN_KHR',    'Eddy-diffusivity (vapor) Profile',      'm2 s-1', ymasks )
+if ( luserc ) &
+call Les_diachro_write( tpdiafile, XLES_MEAN_Rc,     'MEAN_RC',     'Mean Rc Profile',              'kg kg-1', ymasks )
+if ( luserc ) &
+call Les_diachro_write( tpdiafile, XLES_MEAN_Cf,     'MEAN_CF',     'Mean Cf Profile',              '1',       ymasks )
+if ( luserc ) &
+call Les_diachro_write( tpdiafile, XLES_MEAN_INDCf,  'MEAN_INDCF',  'Mean Cf>1-6 Profile (0 or 1)', '1',       ymasks )
+if ( luserc ) &
+call Les_diachro_write( tpdiafile, XLES_MEAN_INDCf2, 'MEAN_INDCF2', 'Mean Cf>1-5 Profile (0 or 1)', '1',       ymasks )
+if ( luserr ) &
+call Les_diachro_write( tpdiafile, XLES_MEAN_Rr,     'MEAN_RR',     'Mean Rr Profile',              'kg kg-1', ymasks )
+if ( luserr ) &
+call Les_diachro_write( tpdiafile, XLES_MEAN_RF,     'MEAN_RF',     'Mean RF Profile',              '1',       ymasks )
+if ( luseri ) &
+call Les_diachro_write( tpdiafile, XLES_MEAN_Ri,     'MEAN_RI',     'Mean Ri Profile',              'kg kg-1', ymasks )
+if ( luseri ) &
+call Les_diachro_write( tpdiafile, XLES_MEAN_If,     'MEAN_IF',     'Mean If Profile',              '1',       ymasks )
+if ( lusers ) &
+call Les_diachro_write( tpdiafile, XLES_MEAN_Rs,     'MEAN_RS',     'Mean Rs Profile',              'kg kg-1', ymasks )
+if ( luserg ) &
+call Les_diachro_write( tpdiafile, XLES_MEAN_Rg,     'MEAN_RG',     'Mean Rg Profile',              'kg kg-1', ymasks )
+if ( luserh ) &
+call Les_diachro_write( tpdiafile, XLES_MEAN_Rh,     'MEAN_RH',     'Mean Rh Profile',              'kg kg-1', ymasks )
+
+if ( nsv > 0 ) then
+  tfield%ndims = 4
+  tfield%ndimlist(1)  = NMNHDIM_BUDGET_LES_LEVEL
+  tfield%ndimlist(2)  = NMNHDIM_BUDGET_LES_TIME
+  tfield%ndimlist(3)  = NMNHDIM_BUDGET_LES_MASK
+  tfield%ndimlist(4)  = NMNHDIM_BUDGET_LES_SV
+  tfield%ndimlist(5:) = NMNHDIM_UNUSED
+
+  call Les_diachro_write( tpdiafile, XLES_MEAN_Sv, 'MEAN_SV', 'Mean Sv Profiles', 'kg kg-1', ymasks )
+
+  tfield%ndims = 3
+  !tfield%ndimlist(1)  = NMNHDIM_BUDGET_LES_LEVEL
+  !tfield%ndimlist(2)  = NMNHDIM_BUDGET_LES_TIME
+  !tfield%ndimlist(3)  = NMNHDIM_BUDGET_LES_MASK
+  tfield%ndimlist(4)  = NMNHDIM_UNUSED
+  !tfield%ndimlist(5:) = NMNHDIM_UNUSED
+end if
+
+call Les_diachro_write( tpdiafile, XLES_MEAN_WIND, 'MEANWIND',       'Profile of Mean Modulus of Wind', 'm s-1',      ymasks )
+call Les_diachro_write( tpdiafile, XLES_RESOLVED_MASSFX, 'MEANMSFX', 'Total updraft mass flux',         'kg m-2 s-1', ymasks )
+
+if ( lles_pdf ) then
+  cgroup = 'PDF'
+  cgroupcomment = ''
+
+  tfield%ndims = 4
+  !tfield%ndimlist(1)  = NMNHDIM_BUDGET_LES_LEVEL
+  !tfield%ndimlist(2)  = NMNHDIM_BUDGET_LES_TIME
+  !tfield%ndimlist(3)  = NMNHDIM_BUDGET_LES_MASK
+  tfield%ndimlist(4)  = NMNHDIM_BUDGET_LES_PDF
+  tfield%ndimlist(5:) = NMNHDIM_UNUSED
+
+  call Les_diachro_write( tpdiafile,   XLES_PDF_TH,  'PDF_TH',  'Pdf potential temperature Profiles', '1', ymasks )
+  call Les_diachro_write( tpdiafile,   XLES_PDF_W,   'PDF_W',   'Pdf vertical velocity Profiles',     '1', ymasks )
+  call Les_diachro_write( tpdiafile,   XLES_PDF_THV, 'PDF_THV', 'Pdf virtual pot. temp. Profiles',    '1', ymasks )
+  if ( luserv ) &
+  call Les_diachro_write( tpdiafile,   XLES_PDF_RV,  'PDF_RV',  'Pdf Rv Profiles',                    '1', ymasks )
+  if ( luserc ) then
+    call Les_diachro_write( tpdiafile, XLES_PDF_RC,  'PDF_RC',  'Pdf Rc Profiles',                    '1', ymasks )
+    call Les_diachro_write( tpdiafile, XLES_PDF_RT,  'PDF_RT',  'Pdf Rt Profiles',                    '1', ymasks )
+    call Les_diachro_write( tpdiafile, XLES_PDF_THL, 'PDF_THL', 'Pdf Thl Profiles',                   '1', ymasks )
+  end if
+  if ( luserr ) &
+  call Les_diachro_write( tpdiafile,   XLES_PDF_RR,  'PDF_RR',  'Pdf Rr Profiles',                    '1', ymasks )
+  if ( luseri ) &
+  call Les_diachro_write( tpdiafile,   XLES_PDF_RI,  'PDF_RI',  'Pdf Ri Profiles',                    '1', ymasks )
+  if ( lusers ) &
+  call Les_diachro_write( tpdiafile,   XLES_PDF_RS,  'PDF_RS',  'Pdf Rs Profiles',                    '1', ymasks )
+  if ( luserg ) &
+  call Les_diachro_write( tpdiafile,   XLES_PDF_RG,  'PDF_RG',  'Pdf Rg Profiles',                    '1', ymasks )
+end if
+!
+!*      2.2  resolved quantities
+!            -------------------
+!
+if ( lles_resolved ) then
+  !Prepare metadata (used in Les_diachro_write calls)
+  ldoavg  = xles_temp_mean_start /= XUNDEF .and. xles_temp_mean_end /= XUNDEF
+  ldonorm = trim(cles_norm_type) /= 'NONE'
+
+  cgroup = 'Resolved'
+  cgroupcomment = 'Mean vertical profiles of the resolved fluxes, variances and covariances'
+
+  tfield%ndims = 3
+  tfield%ndimlist(1)  = NMNHDIM_BUDGET_LES_LEVEL
+  tfield%ndimlist(2)  = NMNHDIM_BUDGET_LES_TIME
+  tfield%ndimlist(3)  = NMNHDIM_BUDGET_LES_MASK
+  tfield%ndimlist(4:) = NMNHDIM_UNUSED
+
+  call Les_diachro_write( tpdiafile, XLES_RESOLVED_U2, 'RES_U2',  'Resolved <u2> variance',        'm2 s-2', ymasks )
+  call Les_diachro_write( tpdiafile, XLES_RESOLVED_V2, 'RES_V2',  'Resolved <v2> variance',        'm2 s-2', ymasks )
+  call Les_diachro_write( tpdiafile, XLES_RESOLVED_W2, 'RES_W2',  'Resolved <w2> variance',        'm2 s-2', ymasks )
+  call Les_diachro_write( tpdiafile, XLES_RESOLVED_UV, 'RES_UV',  'Resolved <uv> Flux',            'm2 s-2', ymasks )
+  call Les_diachro_write( tpdiafile, XLES_RESOLVED_WU, 'RES_WU',  'Resolved <wu> Flux',            'm2 s-2', ymasks )
+  call Les_diachro_write( tpdiafile, XLES_RESOLVED_WV, 'RES_WV',  'Resolved <wv> Flux',            'm2 s-2', ymasks )
+  call Les_diachro_write( tpdiafile, XLES_RESOLVED_Ke, 'RES_KE',  'Resolved TKE Profile',          'm2 s-2', ymasks )
+  call Les_diachro_write( tpdiafile, XLES_RESOLVED_P2, 'RES_P2',  'Resolved pressure variance',    'Pa2',    ymasks )
+  call Les_diachro_write( tpdiafile, XLES_RESOLVED_UP, 'RES_UPZ', 'Resolved <up> horizontal Flux', 'Pa s-1', ymasks )
+  call Les_diachro_write( tpdiafile, XLES_RESOLVED_VP, 'RES_VPZ', 'Resolved <vp> horizontal Flux', 'Pa s-1', ymasks )
+  call Les_diachro_write( tpdiafile, XLES_RESOLVED_WP, 'RES_WPZ', 'Resolved <wp> vertical Flux',   'Pa s-1', ymasks )
+
+  if ( luserv ) &
+  call Les_diachro_write( tpdiafile, XLES_RESOLVED_ThThv, 'RES_THTV', &
+                          'Resolved potential temperature - virtual potential temperature covariance',        'K2', ymasks )
+  if ( luserc ) &
+  call Les_diachro_write( tpdiafile, XLES_RESOLVED_ThlThv, 'RES_TLTV', &
+                          'Resolved liquid potential temperature - virtual potential temperature covariance', 'K2', ymasks )
+  call Les_diachro_write( tpdiafile, XLES_RESOLVED_Th2, 'RES_TH2', 'Resolved potential temperature variance', 'K2', ymasks )
+  if ( luserc ) &
+  call Les_diachro_write( tpdiafile, XLES_RESOLVED_Thl2, 'RES_THL2', 'Resolved liquid potential temperature variance', 'K2',&
+                          ymasks )
+  call Les_diachro_write( tpdiafile, XLES_RESOLVED_UTh, 'RES_UTH', 'Resolved <uth> horizontal Flux', 'm K s-1', ymasks )
+  call Les_diachro_write( tpdiafile, XLES_RESOLVED_VTh, 'RES_VTH', 'Resolved <vth> horizontal Flux', 'm K s-1', ymasks )
+  call Les_diachro_write( tpdiafile, XLES_RESOLVED_WTh, 'RES_WTH', 'Resolved <wth> vertical Flux',   'm K s-1', ymasks )
+
+  if ( luserc ) then
+    call Les_diachro_write( tpdiafile, XLES_RESOLVED_UThl, 'RES_UTHL', 'Resolved <uthl> horizontal Flux', 'm K s-1',       ymasks )
+    call Les_diachro_write( tpdiafile, XLES_RESOLVED_VThl, 'RES_VTHL', 'Resolved <vthl> horizontal Flux', 'm K s-1',       ymasks )
+    call Les_diachro_write( tpdiafile, XLES_RESOLVED_WThl, 'RES_WTHL', 'Resolved <wthl> vertical Flux',   'm K s-1',       ymasks )
+    call Les_diachro_write( tpdiafile, XLES_RESOLVED_Rt2,  'RES_RT2',  'Resolved total water variance',   'kg2 kg-2',      ymasks )
+    call Les_diachro_write( tpdiafile, XLES_RESOLVED_WRt,  'RES_WRT',  'Resolved <wrt> vertical Flux',    'm kg kg-1 s-1', ymasks )
+  end if
+
+  if ( luserv ) then
+    call Les_diachro_write( tpdiafile, XLES_RESOLVED_UThv,  'RES_UTHV', 'Resolved <uthv> horizontal Flux', 'm K s-1',       ymasks )
+    call Les_diachro_write( tpdiafile, XLES_RESOLVED_VThv,  'RES_VTHV', 'Resolved <vthv> horizontal Flux', 'm K s-1',       ymasks )
+    call Les_diachro_write( tpdiafile, XLES_RESOLVED_WThv,  'RES_WTHV', 'Resolved <wthv> vertical Flux',   'm K s-1',       ymasks )
+    call Les_diachro_write( tpdiafile, XLES_RESOLVED_Rv2,   'RES_RV2',  'Resolved water vapor variance',   'kg2 kg-2',      ymasks )
+    call Les_diachro_write( tpdiafile, XLES_RESOLVED_ThRv,  'RES_THRV', 'Resolved <thrv> covariance',      'K kg kg-1',     ymasks )
+    if ( luserc ) &
+    call Les_diachro_write( tpdiafile, XLES_RESOLVED_ThlRv, 'RES_TLRV', 'Resolved <thlrv> covariance',     'K kg kg-1',     ymasks )
+    call Les_diachro_write( tpdiafile, XLES_RESOLVED_ThvRv, 'RES_TVRV', 'Resolved <thvrv> covariance',     'K kg kg-1',     ymasks )
+    call Les_diachro_write( tpdiafile, XLES_RESOLVED_URv,   'RES_URV',  'Resolved <urv> horizontal flux',  'm kg kg-1 s-1', ymasks )
+    call Les_diachro_write( tpdiafile, XLES_RESOLVED_VRv,   'RES_VRV',  'Resolved <vrv> horizontal flux',  'm kg kg-1 s-1', ymasks )
+    call Les_diachro_write( tpdiafile, XLES_RESOLVED_WRv,   'RES_WRV',  'Resolved <wrv> vertical flux',    'm kg kg-1 s-1', ymasks )
+  end if
+
+  if ( luserc ) then
+    call Les_diachro_write( tpdiafile, XLES_RESOLVED_Rc2,   'RES_RC2',  'Resolved cloud water variance',  'kg2 kg-2',      ymasks )
+    call Les_diachro_write( tpdiafile, XLES_RESOLVED_ThRc,  'RES_THRC', 'Resolved <thrc> covariance',     'K kg kg-1',     ymasks )
+    call Les_diachro_write( tpdiafile, XLES_RESOLVED_ThlRc, 'RES_TLRC', 'Resolved <thlrc> covariance',    'K kg kg-1',     ymasks )
+    call Les_diachro_write( tpdiafile, XLES_RESOLVED_ThvRc, 'RES_TVRC', 'Resolved <thvrc> covariance',    'K kg kg-1',     ymasks )
+    call Les_diachro_write( tpdiafile, XLES_RESOLVED_URc,   'RES_URC',  'Resolved <urc> horizontal flux', 'm kg kg-1 s-1', ymasks )
+    call Les_diachro_write( tpdiafile, XLES_RESOLVED_VRc,   'RES_VRC',  'Resolved <vrc> horizontal flux', 'm kg kg-1 s-1', ymasks )
+    call Les_diachro_write( tpdiafile, XLES_RESOLVED_WRc,   'RES_WRC',  'Resolved <wrc> vertical flux',   'm kg kg-1 s-1', ymasks )
+  end if
+
+  if ( luseri ) then
+    call Les_diachro_write( tpdiafile, XLES_RESOLVED_Ri2,   'RES_RI2',  'Resolved cloud ice variance',    'kg2 kg-2',      ymasks )
+    call Les_diachro_write( tpdiafile, XLES_RESOLVED_ThRi,  'RES_THRI', 'Resolved <thri> covariance',     'K kg kg-1',     ymasks )
+    call Les_diachro_write( tpdiafile, XLES_RESOLVED_ThlRi, 'RES_TLRI', 'Resolved <thlri> covariance',    'K kg kg-1',     ymasks )
+    call Les_diachro_write( tpdiafile, XLES_RESOLVED_ThvRi, 'RES_TVRI', 'Resolved <thvri> covariance',    'K kg kg-1',     ymasks )
+    call Les_diachro_write( tpdiafile, XLES_RESOLVED_URi,   'RES_URI',  'Resolved <uri> horizontal flux', 'm kg kg-1 s-1', ymasks )
+    call Les_diachro_write( tpdiafile, XLES_RESOLVED_VRi,   'RES_VRI',  'Resolved <vri> horizontal flux', 'm kg kg-1 s-1', ymasks )
+    call Les_diachro_write( tpdiafile, XLES_RESOLVED_WRi,   'RES_WRI',  'Resolved <wri> vertical flux',   'm kg kg-1 s-1', ymasks )
+  end if
+
+  if ( luserr ) then
+    call Les_diachro_write( tpdiafile, XLES_RESOLVED_WRr,   'RES_WRR',   'Resolved <wrr> vertical flux', 'm kg kg-1 s-1', ymasks )
+    call Les_diachro_write( tpdiafile, XLES_INPRR3D,        'INPRR3D',   'Precipitation flux',           'm s-1',         ymasks )
+    call Les_diachro_write( tpdiafile, XLES_MAX_INPRR3D,    'MAXINPR3D', 'Max Precip flux',              'm s-1',         ymasks )
+    call Les_diachro_write( tpdiafile, XLES_EVAP3D,         'EVAP3D',    'Evaporation profile',          'kg kg-1 s-1',   ymasks )
+  end if
+
+  if ( nsv > 0 ) then
+    tfield%ndims = 4
+    tfield%ndimlist(1)  = NMNHDIM_BUDGET_LES_LEVEL
+    tfield%ndimlist(2)  = NMNHDIM_BUDGET_LES_TIME
+    tfield%ndimlist(3)  = NMNHDIM_BUDGET_LES_MASK
+    tfield%ndimlist(4)  = NMNHDIM_BUDGET_LES_SV
+    tfield%ndimlist(5:) = NMNHDIM_UNUSED
+
+    call Les_diachro_write( tpdiafile, XLES_RESOLVED_Sv2,   'RES_SV2',  'Resolved scalar variables variances', 'kg2 kg-2', ymasks )
+    call Les_diachro_write( tpdiafile, XLES_RESOLVED_ThSv,  'RES_THSV', 'Resolved <ThSv> variance',  'K kg kg-1',          ymasks )
+    if ( luserc ) &
+    call Les_diachro_write( tpdiafile, XLES_RESOLVED_ThlSv, 'RES_TLSV', 'Resolved <ThlSv> variance', 'K kg kg-1',          ymasks )
+    if ( luserv ) &
+    call Les_diachro_write( tpdiafile, XLES_RESOLVED_ThvSv, 'RES_TVSV', 'Resolved <ThvSv> variance', 'K kg kg-1',          ymasks )
+    call Les_diachro_write( tpdiafile, XLES_RESOLVED_USv,   'RES_USV',  'Resolved <uSv> horizontal flux', 'm kg kg-1 s-1', ymasks )
+    call Les_diachro_write( tpdiafile, XLES_RESOLVED_VSv,   'RES_VSV',  'Resolved <vSv> horizontal flux', 'm kg kg-1 s-1', ymasks )
+    call Les_diachro_write( tpdiafile, XLES_RESOLVED_WSv,   'RES_WSV',  'Resolved <wSv> vertical flux', 'm kg kg-1 s-1',   ymasks )
+
+    tfield%ndims = 3
+    !tfield%ndimlist(1)  = NMNHDIM_BUDGET_LES_LEVEL
+    !tfield%ndimlist(2)  = NMNHDIM_BUDGET_LES_TIME
+    !tfield%ndimlist(3)  = NMNHDIM_BUDGET_LES_MASK
+    tfield%ndimlist(4)  = NMNHDIM_UNUSED
+    !tfield%ndimlist(5:) = NMNHDIM_UNUSED
+  end if
+
+  call Les_diachro_write( tpdiafile, XLES_RESOLVED_U3, 'RES_U3', 'Resolved <u3>', 'm3 s-3', ymasks )
+  call Les_diachro_write( tpdiafile, XLES_RESOLVED_V3, 'RES_V3', 'Resolved <v3>', 'm3 s-3', ymasks )
+  call Les_diachro_write( tpdiafile, XLES_RESOLVED_W3, 'RES_W3', 'Resolved <w3>', 'm3 s-3', ymasks )
+  call Les_diachro_write( tpdiafile, XLES_RESOLVED_U4, 'RES_U4', 'Resolved <u4>', 'm4 s-4', ymasks )
+  call Les_diachro_write( tpdiafile, XLES_RESOLVED_V4, 'RES_V4', 'Resolved <v4>', 'm4 s-4', ymasks )
+  call Les_diachro_write( tpdiafile, XLES_RESOLVED_W4, 'RES_W4', 'Resolved <w4>', 'm4 s-4', ymasks )
+
+  call Les_diachro_write( tpdiafile, XLES_RESOLVED_WThl2, 'RES_WTL2', 'Resolved <wThl2>', 'm K2 s-1', ymasks )
+  call Les_diachro_write( tpdiafile, XLES_RESOLVED_W2Thl, 'RES_W2TL', 'Resolved <w2Thl>', 'm2 K s-2', ymasks )
+
+  if ( luserv ) then
+    call Les_diachro_write( tpdiafile, XLES_RESOLVED_WRv2,   'RES_WRV2', 'Resolved <wRv2>',   'm kg2 kg-2 s-1',  ymasks )
+    call Les_diachro_write( tpdiafile, XLES_RESOLVED_W2Rv,   'RES_W2RV', 'Resolved <w2Rv>',   'm2 kg kg-1 s-2',  ymasks )
+    call Les_diachro_write( tpdiafile, XLES_RESOLVED_WRt2,   'RES_WRT2', 'Resolved <wRt2>',   'm kg2 kg-2 s-1',  ymasks )
+    call Les_diachro_write( tpdiafile, XLES_RESOLVED_W2Rt,   'RES_W2RT', 'Resolved <w2Rt>',   'm2 kg kg-1 s-2',  ymasks )
+    call Les_diachro_write( tpdiafile, XLES_RESOLVED_WThlRv, 'RE_WTLRV', 'Resolved <wThlRv>', 'm K kg kg-1 s-1', ymasks )
+    call Les_diachro_write( tpdiafile, XLES_RESOLVED_WThlRt, 'RE_WTLRT', 'Resolved <wThlRt>', 'm K kg kg-1 s-1', ymasks )
+  end if
+
+  if ( luserc ) then
+    call Les_diachro_write( tpdiafile, XLES_RESOLVED_WRc2,   'RES_WRC2', 'Resolved <wRc2>',   'm kg2 kg-2 s-1',  ymasks )
+    call Les_diachro_write( tpdiafile, XLES_RESOLVED_W2Rc,   'RES_W2RC', 'Resolved <w2Rc>',   'm2 kg kg-1 s-2',  ymasks )
+    call Les_diachro_write( tpdiafile, XLES_RESOLVED_WThlRc, 'RE_WTLRC', 'Resolved <wThlRc>', 'm K kg kg-1 s-1', ymasks )
+    call Les_diachro_write( tpdiafile, XLES_RESOLVED_WRvRc,  'RE_WRVRC', 'Resolved <wRvRc>',  'm kg2 kg-2 s-1',  ymasks )
+  end if
+
+  if ( luseri ) then
+    call Les_diachro_write( tpdiafile, XLES_RESOLVED_WRi2,   'RES_WRI2', 'Resolved <wRi2>',   'm kg2 kg-2 s-1',  ymasks )
+    call Les_diachro_write( tpdiafile, XLES_RESOLVED_W2Ri,   'RES_W2RI', 'Resolved <w2Ri>',   'm2 kg kg-1 s-2',  ymasks )
+    call Les_diachro_write( tpdiafile, XLES_RESOLVED_WThlRi, 'RE_WTLRI', 'Resolved <wThlRi>', 'm K kg kg-1 s-1', ymasks )
+    call Les_diachro_write( tpdiafile, XLES_RESOLVED_WRvRi,  'RE_WRVRI', 'Resolved <wRvRi>',  'm kg2 kg-2 s-1',  ymasks )
+  end if
+
+  if ( nsv > 0 ) then
+    tfield%ndims = 4
+    tfield%ndimlist(1)  = NMNHDIM_BUDGET_LES_LEVEL
+    tfield%ndimlist(2)  = NMNHDIM_BUDGET_LES_TIME
+    tfield%ndimlist(3)  = NMNHDIM_BUDGET_LES_MASK
+    tfield%ndimlist(4)  = NMNHDIM_BUDGET_LES_SV
+    tfield%ndimlist(5:) = NMNHDIM_UNUSED
+
+    call Les_diachro_write( tpdiafile, XLES_RESOLVED_WSv2,   'RES_WSV2', 'Resolved <wSv2>',   'm kg2 kg-2 s-1',  ymasks )
+    call Les_diachro_write( tpdiafile, XLES_RESOLVED_W2Sv,   'RES_W2SV', 'Resolved <w2Sv>',   'm2 kg kg-1 s-2',  ymasks )
+    call Les_diachro_write( tpdiafile, XLES_RESOLVED_WThlSv, 'RE_WTLSV', 'Resolved <wThlSv>', 'm K kg kg-1 s-1', ymasks )
+    if ( luserv ) &
+    call Les_diachro_write( tpdiafile, XLES_RESOLVED_WRvSv,  'RE_WRVSV', 'Resolved <wRvSv>',  'm kg2 kg-2 s-1',  ymasks )
+
+    tfield%ndims = 3
+    !tfield%ndimlist(1)  = NMNHDIM_BUDGET_LES_LEVEL
+    !tfield%ndimlist(2)  = NMNHDIM_BUDGET_LES_TIME
+    !tfield%ndimlist(3)  = NMNHDIM_BUDGET_LES_MASK
+    tfield%ndimlist(4)  = NMNHDIM_UNUSED
+    !tfield%ndimlist(5:) = NMNHDIM_UNUSED
+  end if
+
+  call Les_diachro_write( tpdiafile, XLES_RESOLVED_ThlPz, 'RES_TLPZ', 'Resolved <Thldp/dz>', 'K Pa m-1',        ymasks )
+  if ( luserc ) &
+  call Les_diachro_write( tpdiafile, XLES_RESOLVED_RtPz,  'RES_RTPZ', 'Resolved <Rtdp/dz>',  'kg2 kg-2 Pa m-1', ymasks )
+  if ( luserv ) &
+  call Les_diachro_write( tpdiafile, XLES_RESOLVED_RvPz,  'RES_RVPZ', 'Resolved <Rvdp/dz>',  'kg2 kg-2 Pa m-1', ymasks )
+  if ( luserc ) &
+  call Les_diachro_write( tpdiafile, XLES_RESOLVED_RcPz,  'RES_RCPZ', 'Resolved <Rcdp/dz>',  'kg2 kg-2 Pa m-1', ymasks )
+  if ( luseri ) &
+  call Les_diachro_write( tpdiafile, XLES_RESOLVED_RiPz,  'RES_RIPZ', 'Resolved <Ridp/dz>',  'kg2 kg-2 Pa m-1', ymasks )
+
+  if ( nsv > 0 ) then
+    tfield%ndims = 4
+    tfield%ndimlist(1)  = NMNHDIM_BUDGET_LES_LEVEL
+    tfield%ndimlist(2)  = NMNHDIM_BUDGET_LES_TIME
+    tfield%ndimlist(3)  = NMNHDIM_BUDGET_LES_MASK
+    tfield%ndimlist(4)  = NMNHDIM_BUDGET_LES_SV
+    tfield%ndimlist(5:) = NMNHDIM_UNUSED
+
+    call Les_diachro_write( tpdiafile, XLES_RESOLVED_SvPz, 'RES_SVPZ', 'Resolved <Svdp/dz>', 'kg2 kg-2 Pa m-1', ymasks )
+
+    tfield%ndims = 3
+    !tfield%ndimlist(1)  = NMNHDIM_BUDGET_LES_LEVEL
+    !tfield%ndimlist(2)  = NMNHDIM_BUDGET_LES_TIME
+    !tfield%ndimlist(3)  = NMNHDIM_BUDGET_LES_MASK
+    tfield%ndimlist(4)  = NMNHDIM_UNUSED
+    !tfield%ndimlist(5:) = NMNHDIM_UNUSED
+  end if
+
+  call Les_diachro_write( tpdiafile, XLES_RESOLVED_UKe, 'RES_UKE', 'Resolved flux of resolved kinetic energy', 'm3 s-3', ymasks )
+  call Les_diachro_write( tpdiafile, XLES_RESOLVED_VKe, 'RES_VKE', 'Resolved flux of resolved kinetic energy', 'm3 s-3', ymasks )
+  call Les_diachro_write( tpdiafile, XLES_RESOLVED_WKe, 'RES_WKE', 'Resolved flux of resolved kinetic energy', 'm3 s-3', ymasks )
+end if
+!
+!
+!*      2.3  subgrid quantities
+!            ------------------
+!
+if ( lles_subgrid ) then
+  !Prepare metadata (used in Les_diachro_write calls)
+  ldoavg  = xles_temp_mean_start /= XUNDEF .and. xles_temp_mean_end /= XUNDEF
+  ldonorm = trim(cles_norm_type) /= 'NONE'
+
+  cgroup = 'Subgrid'
+  cgroupcomment = 'Mean vertical profiles of the subgrid fluxes, variances and covariances'
+
+  tfield%ndims = 3
+  tfield%ndimlist(1)  = NMNHDIM_BUDGET_LES_LEVEL
+  tfield%ndimlist(2)  = NMNHDIM_BUDGET_LES_TIME
+  tfield%ndimlist(3)  = NMNHDIM_BUDGET_LES_MASK
+  tfield%ndimlist(4:) = NMNHDIM_UNUSED
+
+  call Les_diachro_write( tpdiafile, XLES_SUBGRID_Tke,  'SBG_TKE',  'Subgrid TKE',           'm2 s-2', ymasks )
+  call Les_diachro_write( tpdiafile, XLES_SUBGRID_U2,   'SBG_U2',   'Subgrid <u2> variance', 'm2 s-2', ymasks )
+  call Les_diachro_write( tpdiafile, XLES_SUBGRID_V2,   'SBG_V2',   'Subgrid <v2> variance', 'm2 s-2', ymasks )
+  call Les_diachro_write( tpdiafile, XLES_SUBGRID_W2,   'SBG_W2',   'Subgrid <w2> variance', 'm2 s-2', ymasks )
+  call Les_diachro_write( tpdiafile, XLES_SUBGRID_UV,   'SBG_UV',   'Subgrid <uv> flux',     'm2 s-2', ymasks )
+  call Les_diachro_write( tpdiafile, XLES_SUBGRID_WU,   'SBG_WU',   'Subgrid <wu> flux',     'm2 s-2', ymasks )
+  call Les_diachro_write( tpdiafile, XLES_SUBGRID_WV,   'SBG_WV',   'Subgrid <wv> flux',     'm2 s-2', ymasks )
+  call Les_diachro_write( tpdiafile, XLES_SUBGRID_Thl2, 'SBG_THL2', 'Subgrid liquid potential temperature variance', &
+                          'K2', ymasks )
+  call Les_diachro_write( tpdiafile, XLES_SUBGRID_UThl, 'SBG_UTHL', 'Subgrid horizontal flux of liquid potential temperature',  &
+                          'm K s-1', ymasks )
+  call Les_diachro_write( tpdiafile, XLES_SUBGRID_VThl, 'SBG_VTHL', 'Subgrid horizontal flux of liquid potential temperature',  &
+                          'm K s-1', ymasks )
+  call Les_diachro_write( tpdiafile, XLES_SUBGRID_WThl, 'SBG_WTHL', 'Subgrid vertical flux of liquid potential temperature', &
+                          'm K s-1', ymasks )
+  call Les_diachro_write( tpdiafile, XLES_SUBGRID_WP,   'SBG_WP',   'Subgrid <wp> vertical Flux', 'm Pa s-1', ymasks )
+
+  call Les_diachro_write( tpdiafile, XLES_SUBGRID_THLUP_MF, 'THLUP_MF', 'Subgrid <thl> of updraft',    'K',          ymasks )
+  call Les_diachro_write( tpdiafile, XLES_SUBGRID_RTUP_MF,  'RTUP_MF',  'Subgrid <rt> of updraft',     'kg kg-1',    ymasks )
+  call Les_diachro_write( tpdiafile, XLES_SUBGRID_RVUP_MF,  'RVUP_MF',  'Subgrid <rv> of updraft',     'kg kg-1',    ymasks )
+  call Les_diachro_write( tpdiafile, XLES_SUBGRID_RCUP_MF,  'RCUP_MF',  'Subgrid <rc> of updraft',     'kg kg-1',    ymasks )
+  call Les_diachro_write( tpdiafile, XLES_SUBGRID_RIUP_MF,  'RIUP_MF',  'Subgrid <ri> of updraft',     'kg kg-1',    ymasks )
+  call Les_diachro_write( tpdiafile, XLES_SUBGRID_WUP_MF,   'WUP_MF',   'Subgrid <w> of updraft',      'm s-1',      ymasks )
+  call Les_diachro_write( tpdiafile, XLES_SUBGRID_MASSFLUX, 'MAFLX_MF', 'Subgrid <MF> of updraft',     'kg m-2 s-1', ymasks )
+  call Les_diachro_write( tpdiafile, XLES_SUBGRID_DETR,     'DETR_MF',  'Subgrid <detr> of updraft',   'kg m-3 s-1', ymasks )
+  call Les_diachro_write( tpdiafile, XLES_SUBGRID_ENTR,     'ENTR_MF',  'Subgrid <entr> of updraft',   'kg m-3 s-1', ymasks )
+  call Les_diachro_write( tpdiafile, XLES_SUBGRID_FRACUP,   'FRCUP_MF', 'Subgrid <FracUp> of updraft', '1',          ymasks )
+  call Les_diachro_write( tpdiafile, XLES_SUBGRID_THVUP_MF, 'THVUP_MF', 'Subgrid <thv> of updraft',    'K',          ymasks )
+  call Les_diachro_write( tpdiafile, XLES_SUBGRID_WTHLMF,   'WTHL_MF',  'Subgrid <wthl> of mass flux convection scheme', &
+                          'm K s-1', ymasks )
+  call Les_diachro_write( tpdiafile, XLES_SUBGRID_WRTMF,    'WRT_MF',   'Subgrid <wrt> of mass flux convection scheme',  &
+                          'm kg kg-1 s-1', ymasks )
+  call Les_diachro_write( tpdiafile, XLES_SUBGRID_WTHVMF,   'WTHV_MF',  'Subgrid <wthv> of mass flux convection scheme', &
+                          'm K s-1', ymasks )
+  call Les_diachro_write( tpdiafile, XLES_SUBGRID_WUMF,     'WU_MF',    'Subgrid <wu> of mass flux convection scheme',   &
+                          'm2 s-2', ymasks )
+  call Les_diachro_write( tpdiafile, XLES_SUBGRID_WVMF,     'WV_MF',    'Subgrid <wv> of mass flux convection scheme',   &
+                          'm2 s-2', ymasks )
+
+  call Les_diachro_write( tpdiafile, XLES_SUBGRID_PHI3,  'SBG_PHI3', 'Subgrid Phi3 function',         '1',      ymasks )
+  call Les_diachro_write( tpdiafile, XLES_SUBGRID_LMix,  'SBG_LMIX', 'Subgrid Mixing Length',         '1',      ymasks )
+  call Les_diachro_write( tpdiafile, XLES_SUBGRID_LDiss, 'SBG_LDIS', 'Subgrid Dissipation Length',    '1',      ymasks )
+  call Les_diachro_write( tpdiafile, XLES_SUBGRID_Km,    'SBG_KM',   'Eddy diffusivity for momentum', 'm2 s-1', ymasks )
+  call Les_diachro_write( tpdiafile, XLES_SUBGRID_Kh,    'SBG_KH',   'Eddy diffusivity for heat',     'm2 s-1', ymasks )
+
+  if ( luserv ) then
+    call Les_diachro_write( tpdiafile, XLES_SUBGRID_WThv,  'SBG_WTHV', 'Subgrid vertical flux of liquid potential temperature', &
+                            'm K s-1', ymasks )
+    call Les_diachro_write( tpdiafile, XLES_SUBGRID_Rt2,   'SBG_RT2',  'Subgrid total water variance', 'kg2 kg-2', ymasks )
+    call Les_diachro_write( tpdiafile, XLES_SUBGRID_ThlRt, 'SBG_TLRT', 'Subgrid <thlrt> covariance',  'K kg kg-1', ymasks )
+    call Les_diachro_write( tpdiafile, XLES_SUBGRID_URt,   'SBG_URT',  'Subgrid total water horizontal flux', &
+                            'm kg kg-1 s-1', ymasks )
+    call Les_diachro_write( tpdiafile, XLES_SUBGRID_VRt,   'SBG_VRT',  'Subgrid total water horizontal flux', &
+                            'm kg kg-1 s-1', ymasks )
+    call Les_diachro_write( tpdiafile, XLES_SUBGRID_WRt,   'SBG_WRT',  'Subgrid total water vertical flux',   &
+                            'm kg kg-1 s-1', ymasks )
+    call Les_diachro_write( tpdiafile, XLES_SUBGRID_PSI3,  'SBG_PSI3', 'Subgrid Psi3 function', '1', ymasks )
+  end if
+
+  if ( luserc ) then
+    call Les_diachro_write( tpdiafile, XLES_SUBGRID_Rc2, 'SBG_RC2', 'Subgrid cloud water variance',        'kg2 kg-2', ymasks )
+    call Les_diachro_write( tpdiafile, XLES_SUBGRID_URc, 'SBG_URC', 'Subgrid cloud water horizontal flux', 'm kg kg-1 s-1', &
+                            ymasks )
+    call Les_diachro_write( tpdiafile, XLES_SUBGRID_VRc, 'SBG_VRC', 'Subgrid cloud water horizontal flux', 'm kg kg-1 s-1', &
+                            ymasks )
+    call Les_diachro_write( tpdiafile, XLES_SUBGRID_WRc, 'SBG_WRC', 'Subgrid cloud water vertical flux',   'm kg kg-1 s-1', &
+                            ymasks )
+  end if
+
+  if ( nsv > 0 ) then
+    tfield%ndims = 4
+    tfield%ndimlist(1)  = NMNHDIM_BUDGET_LES_LEVEL
+    tfield%ndimlist(2)  = NMNHDIM_BUDGET_LES_TIME
+    tfield%ndimlist(3)  = NMNHDIM_BUDGET_LES_MASK
+    tfield%ndimlist(4)  = NMNHDIM_BUDGET_LES_SV
+    tfield%ndimlist(5:) = NMNHDIM_UNUSED
+
+    call Les_diachro_write( tpdiafile, XLES_SUBGRID_USv, 'SBG_USV', 'Subgrid <uSv> horizontal flux', 'm kg kg-1 s-1', ymasks )
+    call Les_diachro_write( tpdiafile, XLES_SUBGRID_VSv, 'SBG_VSV', 'Subgrid <vSv> horizontal flux', 'm kg kg-1 s-1', ymasks )
+    call Les_diachro_write( tpdiafile, XLES_SUBGRID_WSv, 'SBG_WSV', 'Subgrid <wSv> vertical flux',   'm kg kg-1 s-1', ymasks )
+
+    tfield%ndims = 3
+    !tfield%ndimlist(1)  = NMNHDIM_BUDGET_LES_LEVEL
+    !tfield%ndimlist(2)  = NMNHDIM_BUDGET_LES_TIME
+    !tfield%ndimlist(3)  = NMNHDIM_BUDGET_LES_MASK
+    tfield%ndimlist(4)  = NMNHDIM_UNUSED
+    !tfield%ndimlist(5:) = NMNHDIM_UNUSED
+
+
+  end if
+
+  call Les_diachro_write( tpdiafile, XLES_SUBGRID_UTke,  'SBG_UTKE', 'Subgrid flux of subgrid kinetic energy', 'm3 s-3',   ymasks )
+  call Les_diachro_write( tpdiafile, XLES_SUBGRID_VTke,  'SBG_VTKE', 'Subgrid flux of subgrid kinetic energy', 'm3 s-3',   ymasks )
+  call Les_diachro_write( tpdiafile, XLES_SUBGRID_WTke,  'SBG_WTKE', 'Subgrid flux of subgrid kinetic energy', 'm3 s-3',   ymasks )
+  call Les_diachro_write( tpdiafile, XLES_SUBGRID_W2Thl, 'SBG_W2TL', 'Subgrid flux of subgrid kinetic energy', 'm2 K s-2', ymasks )
+  call Les_diachro_write( tpdiafile, XLES_SUBGRID_WThl2, 'SBG_WTL2', 'Subgrid flux of subgrid kinetic energy', 'm K2 s-1', ymasks )
+end if
+
+
+!Prepare metadata (used in Les_diachro_write calls)
+tfield%ndims = 2
+tfield%ndimlist(1)  = NMNHDIM_BUDGET_LES_LEVEL
+tfield%ndimlist(2)  = NMNHDIM_BUDGET_LES_TIME
+tfield%ndimlist(3:) = NMNHDIM_UNUSED
+
+ldoavg  = xles_temp_mean_start /= XUNDEF .and. xles_temp_mean_end /= XUNDEF
+ldonorm = trim(cles_norm_type) /= 'NONE'
+!
+!*      2.4  Updraft quantities
+!            ------------------
+!
+if ( lles_updraft ) then
+  cgroup = 'Updraft'
+  cgroupcomment = 'Updraft vertical profiles of some resolved and subgrid fluxes, variances and covariances'
+
+  call Les_diachro_write( tpdiafile, XLES_UPDRAFT,     'UP_FRAC', 'Updraft fraction',                                 '1' )
+  call Les_diachro_write( tpdiafile, XLES_UPDRAFT_W,   'UP_W',    'Updraft W mean value',                             'm s-1' )
+  call Les_diachro_write( tpdiafile, XLES_UPDRAFT_Th,  'UP_TH',   'Updraft potential temperature mean value',         'K' )
+  if ( luserc ) &
+  call Les_diachro_write( tpdiafile, XLES_UPDRAFT_Thl, 'UP_THL',  'Updraft liquid potential temperature mean value',  'K' )
+  if ( luserv ) &
+  call Les_diachro_write( tpdiafile, XLES_UPDRAFT_Thv, 'UP_THV',  'Updraft virtual potential temperature mean value', 'K' )
+  call Les_diachro_write( tpdiafile, XLES_UPDRAFT_Ke,  'UP_KE',   'Updraft resolved TKE mean value',                   'm2 s-2' )
+  call Les_diachro_write( tpdiafile, XLES_UPDRAFT_Tke, 'UP_TKE',  'Updraft subgrid TKE mean value',                    'm2 s-2' )
+  if ( luserv ) &
+  call Les_diachro_write( tpdiafile, XLES_UPDRAFT_Rv,  'UP_RV',   'Updraft water vapor mean value',                    'kg kg-1' )
+  if ( luserc ) &
+  call Les_diachro_write( tpdiafile, XLES_UPDRAFT_Rc,  'UP_RC',   'Updraft cloud water mean value',                    'kg kg-1' )
+  if ( luserr ) &
+  call Les_diachro_write( tpdiafile, XLES_UPDRAFT_Rr,  'UP_RR',   'Updraft rain mean value',                           'kg kg-1' )
+  if ( luseri ) &
+  call Les_diachro_write( tpdiafile, XLES_UPDRAFT_Ri,  'UP_RI',   'Updraft ice mean value',                            'kg kg-1' )
+  if ( lusers ) &
+  call Les_diachro_write( tpdiafile, XLES_UPDRAFT_Rs,  'UP_RS',   'Updraft snow mean value',                           'kg kg-1' )
+  if ( luserg ) &
+  call Les_diachro_write( tpdiafile, XLES_UPDRAFT_Rg,  'UP_RG',   'Updraft graupel mean value',                        'kg kg-1' )
+  if ( luserh ) &
+  call Les_diachro_write( tpdiafile, XLES_UPDRAFT_Rh,  'UP_RH',   'Updraft hail mean value',                           'kg kg-1' )
+
+  if ( nsv > 0 ) then
+    tfield%ndims = 3
+    tfield%ndimlist(1)  = NMNHDIM_BUDGET_LES_LEVEL
+    tfield%ndimlist(2)  = NMNHDIM_BUDGET_LES_TIME
+    tfield%ndimlist(3)  = NMNHDIM_BUDGET_LES_SV
+    tfield%ndimlist(4:) = NMNHDIM_UNUSED
+
+    call Les_diachro_write( tpdiafile, XLES_UPDRAFT_Sv, 'UP_SV', 'Updraft scalar variables mean values', 'kg kg-1' )
+
+    tfield%ndims = 2
+    !tfield%ndimlist(1)  = NMNHDIM_BUDGET_LES_LEVEL
+    !tfield%ndimlist(2)  = NMNHDIM_BUDGET_LES_TIME
+    tfield%ndimlist(3) = NMNHDIM_UNUSED
+    !tfield%ndimlist(4:) = NMNHDIM_UNUSED
+  end if
+
+  call Les_diachro_write( tpdiafile, XLES_UPDRAFT_Th2,    'UP_TH2',  'Updraft resolved Theta variance',             'K2' )
+  if ( luserc ) &
+  call Les_diachro_write( tpdiafile, XLES_UPDRAFT_Thl2,   'UP_THL2', 'Updraft resolved Theta_l variance',           'K2' )
+  if ( luserv ) &
+  call Les_diachro_write( tpdiafile, XLES_UPDRAFT_ThThv,  'UP_THTV', 'Updraft resolved Theta Theta_v covariance',   'K2' )
+  if ( luserc ) &
+  call Les_diachro_write( tpdiafile, XLES_UPDRAFT_ThlThv, 'UP_TLTV', 'Updraft resolved Theta_l Theta_v covariance', 'K2' )
+  call Les_diachro_write( tpdiafile, XLES_UPDRAFT_WTh,    'UP_WTH',  'Updraft resolved WTh flux',                    'm K s-1' )
+  if ( luserc ) &
+  call Les_diachro_write( tpdiafile, XLES_UPDRAFT_WThl,   'UP_WTHL', 'Updraft resolved WThl flux',                   'm K s-1' )
+  if ( luserv ) &
+  call Les_diachro_write( tpdiafile, XLES_UPDRAFT_WThv,   'UP_WTHV', 'Updraft resolved WThv flux',                   'm K s-1' )
+
+  if ( luserv ) then
+    call Les_diachro_write( tpdiafile, XLES_UPDRAFT_Rv2,   'UP_RV2',   'Updraft resolved water vapor variance', 'kg2 kg-2' )
+    call Les_diachro_write( tpdiafile, XLES_UPDRAFT_ThRv,  'UP_THRV',  'Updraft resolved <thrv> covariance',    'K kg kg-1' )
+    if ( luserc ) &
+    call Les_diachro_write( tpdiafile, XLES_UPDRAFT_ThlRv, 'UP_THLRV', 'Updraft resolved <thlrv> covariance',   'K kg kg-1' )
+    call Les_diachro_write( tpdiafile, XLES_UPDRAFT_ThvRv, 'UP_THVRV', 'Updraft resolved <thvrv> covariance',   'K kg kg-1' )
+    call Les_diachro_write( tpdiafile, XLES_UPDRAFT_WRv,   'UP_WRV',   'Updraft resolved <wrv> vertical flux',  'm kg kg-1 s-1' )
+  end if
+
+  if ( luserc ) then
+    call Les_diachro_write( tpdiafile, XLES_UPDRAFT_Rc2,   'UP_RC2',   'Updraft resolved cloud water variance', 'kg2 kg-2' )
+    call Les_diachro_write( tpdiafile, XLES_UPDRAFT_ThRc,  'UP_THRC',  'Updraft resolved <thrc> covariance',    'K kg kg-1' )
+    call Les_diachro_write( tpdiafile, XLES_UPDRAFT_ThlRc, 'UP_THLRC', 'Updraft resolved <thlrc> covariance',   'K kg kg-1' )
+    call Les_diachro_write( tpdiafile, XLES_UPDRAFT_ThvRc, 'UP_THVRC', 'Updraft resolved <thvrc> covariance',   'K kg kg-1' )
+    call Les_diachro_write( tpdiafile, XLES_UPDRAFT_WRc,   'UP_WRC',   'Updraft resolved <wrc> vertical flux',  'm kg kg-1 s-1' )
+  end if
+
+  if ( luseri ) then
+    call Les_diachro_write( tpdiafile, XLES_UPDRAFT_Ri2,   'UP_RI2',   'Updraft resolved cloud ice variance',   'kg2 kg-2' )
+    call Les_diachro_write( tpdiafile, XLES_UPDRAFT_ThRi,  'UP_THRI',  'Updraft resolved <thri> covariance',    'K kg kg-1' )
+    call Les_diachro_write( tpdiafile, XLES_UPDRAFT_ThlRi, 'UP_THLRI', 'Updraft resolved <thlri> covariance',   'K kg kg-1' )
+    call Les_diachro_write( tpdiafile, XLES_UPDRAFT_ThvRi, 'UP_THVRI', 'Updraft resolved <thvri> covariance',   'K kg kg-1' )
+    call Les_diachro_write( tpdiafile, XLES_UPDRAFT_WRi,   'UP_WRI',   'Updraft resolved <wri> vertical flux',  'm kg kg-1 s-1' )
+  end if
+
+
+  if ( nsv > 0 ) then
+    tfield%ndims = 3
+    tfield%ndimlist(1)  = NMNHDIM_BUDGET_LES_LEVEL
+    tfield%ndimlist(2)  = NMNHDIM_BUDGET_LES_TIME
+    tfield%ndimlist(3)  = NMNHDIM_BUDGET_LES_SV
+    tfield%ndimlist(4:) = NMNHDIM_UNUSED
+
+    call Les_diachro_write( tpdiafile, XLES_UPDRAFT_Sv2,   'UP_SV2',   'Updraft resolved scalar variables variances', 'kg2 kg-2' )
+    call Les_diachro_write( tpdiafile, XLES_UPDRAFT_ThSv,  'UP_THSV',  'Updraft resolved <ThSv> variance',            'K kg kg-1' )
+    if ( luserc ) &
+    call Les_diachro_write( tpdiafile, XLES_UPDRAFT_ThlSv, 'UP_THLSV', 'Updraft resolved <ThlSv> variance',           'K kg kg-1' )
+    if ( luserv ) &
+    call Les_diachro_write( tpdiafile, XLES_UPDRAFT_ThvSv, 'UP_THVSV', 'Updraft resolved <ThvSv> variance',           'K kg kg-1' )
+    call Les_diachro_write( tpdiafile, XLES_UPDRAFT_WSv,   'UP_WSV',   'Updraft resolved <wSv> vertical flux', 'm kg kg-1 s-1' )
+
+    tfield%ndims = 2
+    !tfield%ndimlist(1)  = NMNHDIM_BUDGET_LES_LEVEL
+    !tfield%ndimlist(2)  = NMNHDIM_BUDGET_LES_TIME
+    tfield%ndimlist(3) = NMNHDIM_UNUSED
+    !tfield%ndimlist(4:) = NMNHDIM_UNUSED
+  end if
+end if
+!
+!
+!*      2.5  Downdraft quantities
+!            --------------------
+!
+if ( lles_downdraft ) then
+  cgroup = 'Downdraft'
+  cgroupcomment = 'Downdraft vertical profiles of some resolved and subgrid fluxes, variances and covariances'
+
+  call Les_diachro_write( tpdiafile, XLES_DOWNDRAFT,     'DW_FRAC', 'Downdraft fraction',                                 '1' )
+  call Les_diachro_write( tpdiafile, XLES_DOWNDRAFT_W,   'DW_W',    'Downdraft W mean value',                             'm s-1' )
+  call Les_diachro_write( tpdiafile, XLES_DOWNDRAFT_Th,  'DW_TH',   'Downdraft potential temperature mean value',         'K' )
+  if ( luserc ) &
+  call Les_diachro_write( tpdiafile, XLES_DOWNDRAFT_Thl, 'DW_THL',  'Downdraft liquid potential temperature mean value',  'K' )
+  if ( luserv ) &
+  call Les_diachro_write( tpdiafile, XLES_DOWNDRAFT_Thv, 'DW_THV',  'Downdraft virtual potential temperature mean value', 'K' )
+  call Les_diachro_write( tpdiafile, XLES_DOWNDRAFT_Ke,  'DW_KE',   'Downdraft resolved TKE mean value',                 'm2 s-2' )
+  call Les_diachro_write( tpdiafile, XLES_DOWNDRAFT_Tke, 'DW_TKE',  'Downdraft subgrid TKE mean value',                  'm2 s-2' )
+  if ( luserv ) &
+  call Les_diachro_write( tpdiafile, XLES_DOWNDRAFT_Rv,  'DW_RV',   'Downdraft water vapor mean value',                 'kg kg-1' )
+  if ( luserc ) &
+  call Les_diachro_write( tpdiafile, XLES_DOWNDRAFT_Rc,  'DW_RC',   'Downdraft cloud water mean value',                 'kg kg-1' )
+  if ( luserr ) &
+  call Les_diachro_write( tpdiafile, XLES_DOWNDRAFT_Rr,  'DW_RR',   'Downdraft rain mean value',                        'kg kg-1' )
+  if ( luseri ) &
+  call Les_diachro_write( tpdiafile, XLES_DOWNDRAFT_Ri,  'DW_RI',   'Downdraft ice mean value',                         'kg kg-1' )
+  if ( lusers ) &
+  call Les_diachro_write( tpdiafile, XLES_DOWNDRAFT_Rs,  'DW_RS',   'Downdraft snow mean value',                        'kg kg-1' )
+  if ( luserg ) &
+  call Les_diachro_write( tpdiafile, XLES_DOWNDRAFT_Rg,  'DW_RG',   'Downdraft graupel mean value',                     'kg kg-1' )
+  if ( luserh ) &
+  call Les_diachro_write( tpdiafile, XLES_DOWNDRAFT_Rh,  'DW_RH',   'Downdraft hail mean value',                        'kg kg-1' )
+
+  if ( nsv > 0 ) then
+    tfield%ndims = 3
+    tfield%ndimlist(1)  = NMNHDIM_BUDGET_LES_LEVEL
+    tfield%ndimlist(2)  = NMNHDIM_BUDGET_LES_TIME
+    tfield%ndimlist(3)  = NMNHDIM_BUDGET_LES_SV
+    tfield%ndimlist(4:) = NMNHDIM_UNUSED
+
+    call Les_diachro_write( tpdiafile, XLES_DOWNDRAFT_Sv, 'DW_SV', 'Downdraft scalar variables mean values', 'kg kg-1' )
+
+    tfield%ndims = 2
+    !tfield%ndimlist(1)  = NMNHDIM_BUDGET_LES_LEVEL
+    !tfield%ndimlist(2)  = NMNHDIM_BUDGET_LES_TIME
+    tfield%ndimlist(3) = NMNHDIM_UNUSED
+    !tfield%ndimlist(4:) = NMNHDIM_UNUSED
+  end if
+
+  call Les_diachro_write( tpdiafile, XLES_DOWNDRAFT_Th2,    'DW_TH2',  'Downdraft resolved Theta variance',             'K2' )
+  if ( luserc ) &
+  call Les_diachro_write( tpdiafile, XLES_DOWNDRAFT_Thl2,   'DW_THL2', 'Downdraft resolved Theta_l variance',           'K2' )
+  if ( luserv ) &
+  call Les_diachro_write( tpdiafile, XLES_DOWNDRAFT_ThThv,  'DW_THTV', 'Downdraft resolved Theta Theta_v covariance',   'K2' )
+  if ( luserc ) &
+  call Les_diachro_write( tpdiafile, XLES_DOWNDRAFT_ThlThv, 'DW_TLTV', 'Downdraft resolved Theta_l Theta_v covariance', 'K2' )
+  call Les_diachro_write( tpdiafile, XLES_DOWNDRAFT_WTh,    'DW_WTH',  'Downdraft resolved WTh flux',                   'm K s-1' )
+  if ( luserc ) &
+  call Les_diachro_write( tpdiafile, XLES_DOWNDRAFT_WThl,   'DW_WTHL', 'Downdraft resolved WThl flux',                  'm K s-1' )
+  if ( luserv ) &
+  call Les_diachro_write( tpdiafile, XLES_DOWNDRAFT_WThv,   'DW_WTHV', 'Downdraft resolved WThv flux',                  'm K s-1' )
+
+  if ( luserv ) then
+    call Les_diachro_write( tpdiafile, XLES_DOWNDRAFT_Rv2,   'DW_RV2',   'Downdraft resolved water vapor variance', 'kg2 kg-2' )
+    call Les_diachro_write( tpdiafile, XLES_DOWNDRAFT_ThRv,  'DW_THRV',  'Downdraft resolved <thrv> covariance',    'K kg kg-1' )
+    if ( luserc ) &
+    call Les_diachro_write( tpdiafile, XLES_DOWNDRAFT_ThlRv, 'DW_THLRV', 'Downdraft resolved <thlrv> covariance',   'K kg kg-1' )
+    call Les_diachro_write( tpdiafile, XLES_DOWNDRAFT_ThvRv, 'DW_THVRV', 'Downdraft resolved <thvrv> covariance',   'K kg kg-1' )
+    call Les_diachro_write( tpdiafile, XLES_DOWNDRAFT_WRv,   'DW_WRV',   'Downdraft resolved <wrv> vertical flux',  &
+                            'm kg kg-1 s-1' )
+  end if
+
+  if ( luserc ) then
+    call Les_diachro_write( tpdiafile, XLES_DOWNDRAFT_Rc2,   'DW_RC2',   'Downdraft resolved cloud water variance', 'kg2 kg-2' )
+    call Les_diachro_write( tpdiafile, XLES_DOWNDRAFT_ThRc,  'DW_THRC',  'Downdraft resolved <thrc> covariance',    'K kg kg-1' )
+    call Les_diachro_write( tpdiafile, XLES_DOWNDRAFT_ThlRc, 'DW_THLRC', 'Downdraft resolved <thlrc> covariance',   'K kg kg-1' )
+    call Les_diachro_write( tpdiafile, XLES_DOWNDRAFT_ThvRc, 'DW_THVRC', 'Downdraft resolved <thvrc> covariance',   'K kg kg-1' )
+    call Les_diachro_write( tpdiafile, XLES_DOWNDRAFT_WRc,   'DW_WRC',   'Downdraft resolved <wrc> vertical flux',  &
+                            'm kg kg-1 s-1' )
+  end if
+
+  if ( luseri ) then
+    call Les_diachro_write( tpdiafile, XLES_DOWNDRAFT_Ri2,   'DW_RI2',   'Downdraft resolved cloud ice variance',   'kg2 kg-2' )
+    call Les_diachro_write( tpdiafile, XLES_DOWNDRAFT_ThRi,  'DW_THRI',  'Downdraft resolved <thri> covariance',    'K kg kg-1' )
+    call Les_diachro_write( tpdiafile, XLES_DOWNDRAFT_ThlRi, 'DW_THLRI', 'Downdraft resolved <thlri> covariance',   'K kg kg-1' )
+    call Les_diachro_write( tpdiafile, XLES_DOWNDRAFT_ThvRi, 'DW_THVRI', 'Downdraft resolved <thvri> covariance',   'K kg kg-1' )
+    call Les_diachro_write( tpdiafile, XLES_DOWNDRAFT_WRi,   'DW_WRI',   'Downdraft resolved <wri> vertical flux',  &
+                            'm kg kg-1 s-1' )
+  end if
+
+
+  if ( nsv > 0 ) then
+    tfield%ndims = 3
+    tfield%ndimlist(1)  = NMNHDIM_BUDGET_LES_LEVEL
+    tfield%ndimlist(2)  = NMNHDIM_BUDGET_LES_TIME
+    tfield%ndimlist(3)  = NMNHDIM_BUDGET_LES_SV
+    tfield%ndimlist(4:) = NMNHDIM_UNUSED
+
+    call Les_diachro_write( tpdiafile, XLES_DOWNDRAFT_Sv2,   'DW_SV2',   'Downdraft resolved scalar variables variances', &
+                            'kg2 kg-2' )
+    call Les_diachro_write( tpdiafile, XLES_DOWNDRAFT_ThSv,  'DW_THSV',  'Downdraft resolved <ThSv> variance',            &
+                            'K kg kg-1' )
+    if ( luserc ) &
+    call Les_diachro_write( tpdiafile, XLES_DOWNDRAFT_ThlSv, 'DW_THLSV', 'Downdraft resolved <ThlSv> variance',           &
+                            'K kg kg-1' )
+    if ( luserv ) &
+    call Les_diachro_write( tpdiafile, XLES_DOWNDRAFT_ThvSv, 'DW_THVSV', 'Downdraft resolved <ThvSv> variance',           &
+                            'K kg kg-1' )
+    call Les_diachro_write( tpdiafile, XLES_DOWNDRAFT_WSv,   'DW_WSV',   'Downdraft resolved <wSv> vertical flux',        &
+                            'm kg kg-1 s-1' )
+
+    tfield%ndims = 2
+    !tfield%ndimlist(1)  = NMNHDIM_BUDGET_LES_LEVEL
+    !tfield%ndimlist(2)  = NMNHDIM_BUDGET_LES_TIME
+    tfield%ndimlist(3) = NMNHDIM_UNUSED
+    !tfield%ndimlist(4:) = NMNHDIM_UNUSED
+  end if
+end if
+!
+!-------------------------------------------------------------------------------
+!
+!*      3.   surface normalization parameters
+!            --------------------------------
+!
+cgroup = 'Radiation'
+cgroupcomment = 'Radiative terms'
+
+!Prepare metadata (used in Les_diachro_write calls)
+tfield%ndims = 2
+tfield%ndimlist(1)  = NMNHDIM_BUDGET_LES_LEVEL
+tfield%ndimlist(2)  = NMNHDIM_BUDGET_LES_TIME
+tfield%ndimlist(3:) = NMNHDIM_UNUSED
+
+ldoavg  = xles_temp_mean_start /= XUNDEF .and. xles_temp_mean_end /= XUNDEF
+ldonorm = .false.
+
+call Les_diachro_write( tpdiafile, XLES_SWU,      'SWU',      'SW upward radiative flux',          'W m-2' )
+call Les_diachro_write( tpdiafile, XLES_SWD,      'SWD',      'SW downward radiative flux',        'W m-2' )
+call Les_diachro_write( tpdiafile, XLES_LWU,      'LWU',      'LW upward radiative flux',          'W m-2' )
+call Les_diachro_write( tpdiafile, XLES_LWD,      'LWD',      'LW downward radiative flux',        'W m-2' )
+call Les_diachro_write( tpdiafile, XLES_DTHRADSW, 'DTHRADSW', 'SW radiative temperature tendency', 'K s-1' )
+call Les_diachro_write( tpdiafile, XLES_DTHRADLW, 'DTHRADLW', 'LW radiative temperature tendency', 'K s-1' )
+!writes mean_effective radius at all levels
+call Les_diachro_write( tpdiafile, XLES_RADEFF,   'RADEFF',   'Mean effective radius',             'micron' )
+
+
+cgroup = 'Surface'
+cgroupcomment = 'Averaged surface fields'
+
+! !Prepare metadate (used in Les_diachro_write calls)
+tfield%ndims = 1
+tfield%ndimlist(1)  = NMNHDIM_BUDGET_LES_TIME
+tfield%ndimlist(2:) = NMNHDIM_UNUSED
+
+call Les_diachro_write( tpdiafile, XLES_Q0, 'Q0', 'Sensible heat flux at the surface', 'm K s-1' )
+if ( luserv ) &
+call Les_diachro_write( tpdiafile, XLES_E0, 'E0', 'Latent heat flux at the surface',   'kg kg-1 m s-1' )
+
+if ( nsv > 0 ) then
+  tfield%ndims = 2
+  tfield%ndimlist(1)  = NMNHDIM_BUDGET_LES_TIME
+  tfield%ndimlist(2)  = NMNHDIM_BUDGET_LES_SV
+  tfield%ndimlist(3:) = NMNHDIM_UNUSED
+
+  call Les_diachro_write( tpdiafile, XLES_SV0, 'SV0', 'Scalar variable fluxes at the surface', 'kg kg-1 m s-1' )
+
+  tfield%ndims = 1
+  !tfield%ndimlist(1)  = NMNHDIM_BUDGET_LES_TIME
+  tfield%ndimlist(2)  = NMNHDIM_UNUSED
+  !tfield%ndimlist(3:) = NMNHDIM_UNUSED
+end if
+
+call Les_diachro_write( tpdiafile, XLES_USTAR,      'Ustar',      'Friction velocity',                   'm s-1' )
+call Les_diachro_write( tpdiafile, XLES_WSTAR,      'Wstar',      'Convective velocity',                 'm s-1' )
+call Les_diachro_write( tpdiafile, XLES_MO_LENGTH,  'L_MO',       'Monin-Obukhov length',                'm' )
+if ( luserr ) &
+call Les_diachro_write( tpdiafile, XLES_PRECFR,     'PREC_FRAC',  'Fraction of columns where rain at surface',  '1' )
+if ( luserr ) &
+call Les_diachro_write( tpdiafile, XLES_INPRR,      'INST_PREC',  'Instantaneous precipitation rate',       'mm day-1' )
+if ( luserc ) &
+call Les_diachro_write( tpdiafile, XLES_INPRC,      'INST_SEDIM', 'Instantaneous cloud precipitation rate', 'mm day-1' )
+if ( luserc .and. ( ldeposc .or. ldepoc ) ) &
+call Les_diachro_write( tpdiafile, XLES_INDEP,      'INST_DEPOS', 'Instantaneous cloud deposition rate',    'mm day-1' )
+if ( luserr ) &
+call Les_diachro_write( tpdiafile, XLES_RAIN_INPRR, 'RAIN_PREC',  'Instantaneous precipitation rate over rainy grid cells', &
+                        'mm day-1' )
+if ( luserr ) &
+call Les_diachro_write( tpdiafile, XLES_ACPRR,      'ACCU_PREC',  'Accumulated precipitation rate',             'mm' )
+
+
+cgroup        = 'Miscellaneous'
+cgroupcomment = 'Miscellaneous terms (geometry, various unclassified averaged terms...)'
+
+call Les_diachro_write( tpdiafile, XLES_BL_HEIGHT,  'BL_H',       'Boundary Layer Height',               'm' )
+call Les_diachro_write( tpdiafile, XLES_INT_TKE,    'INT_TKE',    'Vertical integrated TKE',             'm2 s-2' )
+if ( luserc ) &
+call Les_diachro_write( tpdiafile, XLES_ZCB,        'ZCB',        'Cloud base Height',                   'm' )
+if ( luserc ) &
+call Les_diachro_write( tpdiafile, XLES_CFtot,      'ZCFTOT',     'Total cloud cover (rc>1e-6)',         '1' )
+if ( luserc ) &
+call Les_diachro_write( tpdiafile, XLES_CF2tot,     'ZCF2TOT',    'Total cloud cover (rc>1e-5)',         '1' )
+if ( luserc ) &
+call Les_diachro_write( tpdiafile, XLES_LWP,        'LWP',        'Liquid Water path',                   'kg m-2' )
+if ( luserc ) &
+call Les_diachro_write( tpdiafile, XLES_LWPVAR,     'LWPVAR',     'Liquid Water path variance',          'kg m-4' )
+if ( luserr ) &
+call Les_diachro_write( tpdiafile, XLES_RWP,        'RWP',        'Rain Water path',                     'kg m-2' )
+if ( luseri ) &
+call Les_diachro_write( tpdiafile, XLES_IWP,        'IWP',        'Ice Water path',                      'kg m-2' )
+if ( lusers ) &
+call Les_diachro_write( tpdiafile, XLES_SWP,        'SWP',        'Snow Water path',                     'kg m-2' )
+if ( luserg ) &
+call Les_diachro_write( tpdiafile, XLES_GWP,        'GWP',        'Graupel Water path',                  'kg m-2' )
+if ( luserh ) &
+call Les_diachro_write( tpdiafile, XLES_HWP,        'HWP',        'Hail Water path',                     'kg m-2' )
+if ( luserc ) &
+call Les_diachro_write( tpdiafile, XLES_ZMAXCF,     'ZMAXCF',     'Height of Cloud fraction maximum (rc>1e-6)', 'm' )
+if ( luserc ) &
+call Les_diachro_write( tpdiafile, XLES_ZMAXCF2,    'ZMAXCF2',    'Height of Cloud fraction maximum (rc>1e-5)', 'm' )
+
+!-------------------------------------------------------------------------------
+!
+!*      4.   LES budgets
+!            -----------
+!
+call Write_les_budget_n( tpdiafile )
+
+if ( luserv )  call Write_les_rt_budget_n( tpdiafile )
+
+if ( nsv > 0 ) call Write_les_sv_budget_n( tpdiafile )
+!
+!-------------------------------------------------------------------------------
+!
+!*      5.   (ni,z,t) and (nj,z,t) 2points correlations
+!            ------------------------------------------
+!
+if ( nspectra_k > 0 ) then
+  tfieldx%cstdname = ''
+  tfieldx%ngrid    = 0 !Not on the Arakawa grid
+  tfieldx%ntype    = TYPEREAL
+  tfieldx%ndims    = 3
+  tfieldx%ndimlist(1)  = NMNHDIM_SPECTRA_2PTS_NI
+  tfieldx%ndimlist(2)  = NMNHDIM_SPECTRA_LEVEL
+  tfieldx%ndimlist(3)  = NMNHDIM_BUDGET_LES_TIME
+  tfieldx%ndimlist(4:) = NMNHDIM_UNUSED
+
+  tfieldy%cstdname = ''
+  tfieldy%ngrid    = 0 !Not on the Arakawa grid
+  tfieldy%ntype    = TYPEREAL
+  tfieldy%ndims    = 3
+  tfieldy%ndimlist(1)  = NMNHDIM_SPECTRA_2PTS_NJ
+  tfieldy%ndimlist(2)  = NMNHDIM_SPECTRA_LEVEL
+  tfieldy%ndimlist(3)  = NMNHDIM_BUDGET_LES_TIME
+  tfieldy%ndimlist(4:) = NMNHDIM_UNUSED
+
+  call Les_diachro_2pt_write( tpdiafile, XCORRi_UU, XCORRj_UU, 'UU', 'U*U     2 points correlations', 'm2 s-2' )
+  call Les_diachro_2pt_write( tpdiafile, XCORRi_VV, XCORRj_VV, 'VV', 'V*V     2 points correlations', 'm2 s-2' )
+  call Les_diachro_2pt_write( tpdiafile, XCORRi_WW, XCORRj_WW, 'WW', 'W*W     2 points correlations', 'm2 s-2' )
+  call Les_diachro_2pt_write( tpdiafile, XCORRi_UV, XCORRj_UV, 'UV', 'U*V     2 points correlations', 'm2 s-2' )
+  call Les_diachro_2pt_write( tpdiafile, XCORRi_WU, XCORRj_WU, 'WU', 'W*U     2 points correlations', 'm2 s-2' )
+  call Les_diachro_2pt_write( tpdiafile, XCORRi_WV, XCORRj_WV, 'WV', 'W*V     2 points correlations', 'm2 s-2' )
+
+  call Les_diachro_2pt_write( tpdiafile, XCORRi_ThTh, XCORRj_ThTh, 'THTH', 'Th*Th   2 points correlations', 'K2' )
+  if ( luserc ) &
+  call Les_diachro_2pt_write( tpdiafile, XCORRi_ThlThl, XCORRj_ThlThl, 'TLTL', 'Thl*Thl 2 points correlations', 'K2' )
+  call Les_diachro_2pt_write( tpdiafile, XCORRi_WTh,    XCORRj_WTh,    'WTH',  'W*Th    2 points correlations', 'm K s-1' )
+  if ( luserc ) &
+  call Les_diachro_2pt_write( tpdiafile, XCORRi_WThl,   XCORRj_WThl,   'WTHL', 'W*Thl   2 points correlations', 'm K s-1' )
+
+  if ( luserv ) then
+    call Les_diachro_2pt_write( tpdiafile, XCORRi_RvRv,  XCORRj_RvRv,  'RVRV', 'rv*rv   2 points correlations', 'kg2 kg-2' )
+    call Les_diachro_2pt_write( tpdiafile, XCORRi_ThRv,  XCORRj_ThRv,  'THRV', 'TH*RV   2 points correlations', 'K kg kg-1' )
+    if ( luserc ) &
+    call Les_diachro_2pt_write( tpdiafile, XCORRi_ThlRv, XCORRj_ThlRv, 'TLRV', 'thl*rv  2 points correlations', 'K kg kg-1' )
+    call Les_diachro_2pt_write( tpdiafile, XCORRi_WRv,   XCORRj_WRv,   'WRV',  'W*rv    2 points correlations', 'm kg s-1 kg-1' )
+  end if
+
+  if ( luserc ) then
+    call Les_diachro_2pt_write( tpdiafile, XCORRi_RcRc,  XCORRj_RcRc,  'RCRC', 'rc*rc   2 points correlations', 'kg2 kg-2' )
+    call Les_diachro_2pt_write( tpdiafile, XCORRi_ThRc,  XCORRj_ThRc,  'THRC', 'th*rc   2 points correlations', 'K kg kg-1' )
+    call Les_diachro_2pt_write( tpdiafile, XCORRi_ThlRc, XCORRj_ThlRc, 'TLRC', 'thl*rc  2 points correlations', 'K kg kg-1' )
+    call Les_diachro_2pt_write( tpdiafile, XCORRi_WRc,   XCORRj_WRc,   'WRC',  'W*rc    2 points correlations', 'm kg s-1 kg-1' )
+  end if
+
+  if ( luseri ) then
+    call Les_diachro_2pt_write( tpdiafile, XCORRi_RiRi,  XCORRj_RiRi,  'RIRI', 'ri*ri   2 points correlations', 'kg2 kg-2' )
+    call Les_diachro_2pt_write( tpdiafile, XCORRi_ThRi,  XCORRj_ThRi,  'THRI', 'th*ri   2 points correlations', 'K kg kg-1' )
+    call Les_diachro_2pt_write( tpdiafile, XCORRi_ThlRi, XCORRj_ThlRi, 'TLRI', 'thl*ri  2 points correlations', 'K kg kg-1' )
+    call Les_diachro_2pt_write( tpdiafile, XCORRi_WRi,   XCORRj_WRi,   'WRI',  'W*ri    2 points correlations', 'm kg s-1 kg-1' )
+  end if
+
+!PW: TODO: ameliorer le ygroup (tenir compte de ce qu'est la variable scalaire et pas juste son jsv!)
+  do jsv = 1, nsv
+    Write( ygroup, fmt = "( a2, i3.3 )" ) "SS", jsv
+    call Les_diachro_2pt_write( tpdiafile, XCORRi_SvSv(:,:,:,JSV), XCORRj_SvSv(:,:,:,JSV), ygroup, &
+                                'Sv*Sv   2 points correlations','kg2 kg-2' )
+  end do
+
+!PW: TODO: ameliorer le ygroup (tenir compte de ce qu'est la variable scalaire et pas juste son jsv!)
+  do jsv = 1, nsv
+    Write( ygroup, fmt = "( a2, i3.3 )" ) "WS", jsv
+    call Les_diachro_2pt_write( tpdiafile, XCORRi_WSv(:,:,:,JSV), XCORRj_WSv(:,:,:,JSV), ygroup, &
+                                'W*Sv    2 points correlations','m kg s-1 kg-1' )
+  end do
+end if
+!
+!-------------------------------------------------------------------------------
+!
+!*      6.   spectra and time-averaged profiles (if first call to WRITE_LES_n)
+!            ----------------------------------
+!
+call Les_spec_n( tpdiafile )
+!
+!-------------------------------------------------------------------------------
+!
+!*      7.   deallocations
+!            -------------
+!
+CALL LES_DEALLOCATE('XLES_CURRENT_Z')
+
+IF (CLES_NORM_TYPE/='NONE' ) THEN
+  CALL LES_DEALLOCATE('XLES_NORM_M')
+  CALL LES_DEALLOCATE('XLES_NORM_S')
+  CALL LES_DEALLOCATE('XLES_NORM_K')
+  CALL LES_DEALLOCATE('XLES_NORM_RHO')
+  CALL LES_DEALLOCATE('XLES_NORM_RV')
+  CALL LES_DEALLOCATE('XLES_NORM_SV')
+  CALL LES_DEALLOCATE('XLES_NORM_P')
+END IF
+
+end subroutine Write_les_n
+
+!------------------------------------------------------------------------------
+
+subroutine Les_diachro_write_1D( tpdiafile, pdata, hmnhname, hcomment, hunits )
+
+use modd_io,          only: tfiledata
+
+use mode_les_diachro, only: Les_diachro
+
+type(tfiledata),    intent(in) :: tpdiafile ! file to write
+real, dimension(:), intent(in) :: pdata
+character(len=*),   intent(in) :: hmnhname
+character(len=*),   intent(in) :: hcomment
+character(len=*),   intent(in) :: hunits
+
+tfield%cmnhname  = hmnhname
+tfield%clongname = hmnhname
+tfield%ccomment  = hcomment
+tfield%cunits    = hunits
+
+call Les_diachro( tpdiafile, tfield, cgroup, cgroupcomment, ldoavg, ldonorm, pdata )
+
+end subroutine Les_diachro_write_1D
+
+!------------------------------------------------------------------------------
+
+subroutine Les_diachro_write_2D( tpdiafile, pdata, hmnhname, hcomment, hunits )
+
+use modd_io,          only: tfiledata
+
+use mode_les_diachro, only: Les_diachro
+
+type(tfiledata),      intent(in) :: tpdiafile ! file to write
+real, dimension(:,:), intent(in) :: pdata
+character(len=*),     intent(in) :: hmnhname
+character(len=*),     intent(in) :: hcomment
+character(len=*),     intent(in) :: hunits
+
+tfield%cmnhname  = hmnhname
+tfield%clongname = hmnhname
+tfield%ccomment  = hcomment
+tfield%cunits    = hunits
+
+call Les_diachro( tpdiafile, tfield, cgroup, cgroupcomment, ldoavg, ldonorm, pdata )
+
+end subroutine Les_diachro_write_2D
+
+!------------------------------------------------------------------------------
+
+subroutine Les_diachro_write_3D( tpdiafile, pdata, hmnhname, hcomment, hunits, hmasks )
+
+use modd_io,          only: tfiledata
+
+use mode_les_diachro, only: Les_diachro
+
+type(tfiledata),                          intent(in) :: tpdiafile ! file to write
+real,             dimension(:,:,:),       intent(in) :: pdata
+character(len=*),                         intent(in) :: hmnhname
+character(len=*),                         intent(in) :: hcomment
+character(len=*),                         intent(in) :: hunits
+character(len=*), dimension(:), optional, intent(in) :: hmasks
+
+tfield%cmnhname  = hmnhname
+tfield%clongname = hmnhname
+tfield%ccomment  = hcomment
+tfield%cunits    = hunits
+
+call Les_diachro( tpdiafile, tfield, cgroup, cgroupcomment, ldoavg, ldonorm, pdata, hmasks = hmasks )
+
+end subroutine Les_diachro_write_3D
+
+!------------------------------------------------------------------------------
+
+subroutine Les_diachro_write_4D( tpdiafile, pdata, hmnhname, hcomment, hunits, hmasks )
+
+use modd_io,          only: tfiledata
+
+use mode_les_diachro, only: Les_diachro
+
+type(tfiledata),                            intent(in) :: tpdiafile ! file to write
+real,             dimension(:,:,:,:),       intent(in) :: pdata
+character(len=*),                           intent(in) :: hmnhname
+character(len=*),                           intent(in) :: hcomment
+character(len=*),                           intent(in) :: hunits
+character(len=*), dimension(:),   optional, intent(in) :: hmasks
+
+tfield%cmnhname  = hmnhname
+tfield%clongname = hmnhname
+tfield%ccomment  = hcomment
+tfield%cunits    = hunits
+
+call Les_diachro( tpdiafile, tfield, cgroup, cgroupcomment, ldoavg, ldonorm, pdata, hmasks = hmasks )
+
+end subroutine Les_diachro_write_4D
+
+!------------------------------------------------------------------------------
+
+subroutine Les_diachro_2pt_write( tpdiafile, zcorri, zcorrj, hmnhname, hcomment, hunits )
+
+use modd_io,          only: tfiledata
+
+use mode_les_diachro, only: Les_diachro_2pt
+
+type(tfiledata),          intent(in) :: tpdiafile ! file to write
+real, dimension(:,:,:),   intent(in) :: zcorri    ! 2 pts correlation data
+real, dimension(:,:,:),   intent(in) :: zcorrj    ! 2 pts correlation data
+character(len=*),         intent(in) :: hmnhname
+character(len=*),         intent(in) :: hcomment
+character(len=*),         intent(in) :: hunits
+
+tfieldx%cmnhname  = hmnhname
+tfieldx%clongname = hmnhname
+tfieldx%ccomment  = hcomment
+tfieldx%cunits    = hunits
+
+tfieldy%cmnhname  = hmnhname
+tfieldy%clongname = hmnhname
+tfieldy%ccomment  = hcomment
+tfieldy%cunits    = hunits
+
+call Les_diachro_2pt( tpdiafile, tfieldx, tfieldy, zcorri, zcorrj )
+
+end subroutine Les_diachro_2pt_write
+
+!------------------------------------------------------------------------------
+
+end module mode_write_les_n
diff --git a/src/PHYEX/ext/write_lfifm1_for_diag.f90 b/src/PHYEX/ext/write_lfifm1_for_diag.f90
new file mode 100644
index 0000000000000000000000000000000000000000..84ff78bdab8ce9d1759df3baa7a02dc307bd0382
--- /dev/null
+++ b/src/PHYEX/ext/write_lfifm1_for_diag.f90
@@ -0,0 +1,4201 @@
+!MNH_LIC Copyright 1994-2023 CNRS, Meteo-France and Universite Paul Sabatier
+!MNH_LIC This is part of the Meso-NH software governed by the CeCILL-C licence
+!MNH_LIC version 1. See LICENSE, CeCILL-C_V1-en.txt and CeCILL-C_V1-fr.txt
+!MNH_LIC for details. version 1.
+!-----------------------------------------------------------------
+!################################
+MODULE MODI_WRITE_LFIFM1_FOR_DIAG
+!################################
+INTERFACE
+      SUBROUTINE WRITE_LFIFM1_FOR_DIAG(TPFILE,HDADFILE)
+!
+USE MODD_IO, ONLY: TFILEDATA
+!
+TYPE(TFILEDATA),   INTENT(IN) :: TPFILE       ! outpput data file
+CHARACTER(LEN=28), INTENT(IN) :: HDADFILE     ! corresponding FM-file name of 
+                                              ! its DAD model
+!
+END SUBROUTINE WRITE_LFIFM1_FOR_DIAG
+END INTERFACE
+END MODULE MODI_WRITE_LFIFM1_FOR_DIAG
+!
+!     ##################################################
+      SUBROUTINE WRITE_LFIFM1_FOR_DIAG(TPFILE,HDADFILE)
+!     ##################################################
+!
+!!****  *WRITE_LFIFM1* - routine to write a LFIFM file for model 1
+!!
+!!    PURPOSE
+!!    -------
+!        The purpose of this routine is to write an initial LFIFM File 
+!     of name YFMFILE2//'.lfi' with the FM routines.  
+!
+!!**  METHOD
+!!    ------
+!!      The data are written in the LFIFM file :
+!!        - dimensions
+!!        - grid variables
+!!        - configuration variables
+!!        - prognostic variables at time t and t-dt
+!!        - 1D anelastic reference state
+!!
+!!      The localization on the model grid is also indicated :
+!!
+!!        IGRID = 1 for mass grid point
+!!        IGRID = 2 for U grid point
+!!        IGRID = 3 for V grid point
+!!        IGRID = 4 for w grid point
+!!        IGRID = 0 for meaningless case
+!!          
+!!
+!!    EXTERNAL
+!!    --------
+!!      FMWRIT : FM-routine to write a record
+!!
+!!
+!!    IMPLICIT ARGUMENTS
+!!    ------------------
+!!      Module MODD_DIM1   : contains dimensions
+!!      Module MODD_TIME1   : contains time variables and uses MODD_TIME
+!!      Module MODD_GRID    : contains spatial grid variables for all models
+!!      Module MODD_GRID1 : contains spatial grid variables
+!!      Module MODD_REF     : contains reference state variables
+!!      Module MODD_LUNIT1: contains logical unit variables.
+!!      Module MODD_CONF    : contains configuration variables for all models
+!!      Module MODD_CONF1  : contains configuration variables
+!!      Module MODD_FIELD1  : contains prognostic variables
+!!      Module MODD_GR_FIELD1 : contains surface prognostic variables
+!!      Module MODD_LSFIELD1  : contains Larger Scale variables
+!!      Module MODD_PARAM1    : contains parameterization options
+!!      Module MODD_TURB1    : contains turbulence options
+!!      Module MODD_FRC    : contains forcing variables
+!!
+!!    REFERENCE
+!!    ---------
+!!
+!!
+!!    AUTHOR
+!!    ------
+!!  	V. Ducrocq   *Meteo France* 
+!!
+!!    MODIFICATIONS
+!!    -------------
+!!      Original    06/05/94 
+!!       V. Ducrocq    27/06/94
+!!       J.Stein       20/10/94 (name of the FMFILE)
+!!       J.Stein       06/12/94 add the LS fields
+!!       J.P. Lafore   09/01/95 add the DRYMASST
+!!       J.Stein       20/01/95 add TKE and change the ycomment for the water
+!!                              variables
+!!       J.Stein       23/01/95 add a TKE switch and MODD_PARAM1
+!!       J.Stein       16/03/95 remove R from the historical variables
+!!       J.Stein       20/03/95 add the EPS var.
+!!       J.Stein       30/06/95 add the variables related to the subgrid condens
+!!       S. Belair     01/09/95 add surface variables and ground parameters
+!!       J.-P. Pinty   15/09/95 add the radiation parameters
+!!       J.Stein       23/01/96 add the TSZ0 option for the surface scheme
+!!       M.Georgelin   13/12/95 add the forcing variables
+!!       J.-P. Pinty   15/02/96 add external control for the forcing
+!!       J.Stein P.Bougeault  15/03/96 add the cloud fraction and change the
+!!                                     surface parameters for TSZ0 option
+!!       J.Stein P.Jabouille  30/04/96 add the storage type
+!!       J.Stein P.Jabouille  20/05/96 switch for XSIGS and XSRC
+!!       J.Stein              10/10/96 change Xsrc into XSRCM and XRCT
+!!       J.P. Lafore          30/07/96 add YFMFILE2 and HDADFILE writing
+!!                                     corresponding to MY_NAME and DAD_NAME (for nesting)
+!!       V.Masson             08/10/96 add LTHINSHELL
+!!       J.-P. Pinty   15/12/96 add the microphysics (ice)
+!!       J.-P. Pinty   11/01/97 add the deep convection
+!!       J.-P. Pinty   27/01/97 split the recording of the SV array
+!!       J.-P. Pinty   29/01/97 set recording of PRCONV and PACCONV in mm/h and
+!!                                                         mm respectively
+!!       J. Viviand    04/02/97 convert precipitation rates in mm/h
+!!       P. Hereil     04/12/97 add the calculation of cloud top and moist PV
+!!       P.Hereil N Asencio 3/02/98 add the calculation of  precipitation on large scale grid mesh
+!!       N Asencio 2/10/98 suppress flux calculation if start file
+!!       V Masson 25/11/98 places dummy arguments in module MODD_DIAG_FLAG
+!!       V Masson 04/01/00 removes TSZ0 option
+!!       J.-P. Pinty   29/11/02 add C3R5, ICE2, ICE4, CELEC
+!!       V Masson 01/2004  removes surface (externalization)
+!!       P. Tulet 01/2005   add dust, orilam
+!!       M. Leriche 04/2007 add aqueous concentration in M
+!!       O. Caumont 03/2008 add simulation of radar observations
+!!       O. Caumont 14/09/2009 modifications to allow for polar outputs (radar diagnostics)
+!!       October 2009 (G. Tanguy) add ILENCH=LEN(YCOMMENT) after
+!!                                              change of YCOMMENT
+!!       G. Tanguy  10/2009 add possibility to run radar after 
+!!                          PREP_REAL_CASE with AROME
+!!       O. Caumont 01/2011 [radar diagnostics] add control check for NMAX; revise comments
+!!       O. Caumont 05/2011 [radar diagnostics] change output format
+!!       G.Tanguy/ JP Pinty/ JP Chabureau 18/05/2011 : add lidar simulator
+!!       S.Bielli 12/2012 : add latitude and longitude
+!!       F. Duffourg 02/2013 : add new fields
+!!      J.Escobar 21/03/2013: for HALOK get correctly local array dim/bound
+!!       J. escobar 27/03/2014 : write LAT/LON only in not CARTESIAN case
+!!       G.Delautier    2014 : remplace MODD_RAIN_C2R2_PARAM par MODD_RAIN_C2R2_KHKO_PARAM
+!!       C. Augros 2014 : new radar simulator (T matrice)
+!!       D.Ricard 2015 : add THETAES + POVOES  (LMOIST_ES=T)
+!!      Modification    01/2016  (JP Pinty) Add LIMA
+!!       C.Lac  04/2016 : add visibility and droplet deposition
+!! 10/2017      (G.Delautier) New boundary layer height : replace LBLTOP by CBLTOP 
+!!       T.Dauhut      10/2017 : add parallel 3D clustering
+!!  Philippe Wautelet: 05/2016-04/2018: new data structures and calls for I/O
+!!       D.Ricard and P.Marquet 2016-2017 : THETAL + THETAS1 POVOS1 or THETAS2 POVOS2
+!!                                        if  LMOIST_L     LMOIST_S1   or  LMOIST_S2
+!  P. Wautelet 08/02/2019: minor bug: compute ZWORK36 only when needed
+!  S  Bielli      02/2019: sea salt: significant sea wave height influences salt emission; 5 salt modes
+!  P. Wautelet 18/03/2020: remove ICE2 option
+!  B. Vie         06/2020: Add prognostic supersaturation for LIMA
+!  P. Wautelet 11/03/2021: bugfix: correct name for NSV_LIMA_IMM_NUCL
+!  J.L Redelsperger 03/2021 Adding OCEAN LES Case and Autocoupled O-A LES 
+!  P. Wautelet 04/02/2022: use TSVLIST to manage metadata of scalar variables
+!-------------------------------------------------------------------------------
+!
+!*       0.    DECLARATIONS
+!              ------------
+!
+USE MODD_BLOWSNOW,          ONLY: LBLOWSNOW, NBLOWSNOW3D
+USE MODD_BLOWSNOW_n,        ONLY: XSNWSUBL3D
+USE MODD_CH_AERO_n,         ONLY: XN3D, XRG3D, XSIG3D
+USE MODD_CH_AEROSOL
+USE MODD_CH_M9_n,           ONLY: NEQAQ
+USE MODD_CH_MNHC_n,         ONLY: LCH_CONV_LINOX, LUSECHEM, XRTMIN_AQ
+USE MODD_CONDSAMP,          ONLY: LCONDSAMP
+USE MODD_CONF,              ONLY: CBIBUSER, CEQNSYS, CPROGRAM, L1D, L2D, LCARTESIAN, LFORCING, LPACK, LTHINSHELL, NBUGFIX, NMASDEV
+USE MODD_CONF_n,            ONLY: IDX_RVT, IDX_RCT, IDX_RRT, IDX_RIT, IDX_RST, IDX_RGT, IDX_RHT, &
+                                  LUSERV,  LUSERC,  LUSERR,  LUSERI,  LUSERS,  LUSERG,  LUSERH,  &
+                                  LUSECI, NRR, NRRI, NRRL
+USE MODD_CST,               ONLY: XALPI, XAVOGADRO, XBETAI, XCI, XCL, XCPD, XCPV, XG, XGAMI, XLSTT, XLVTT, &
+                                  XMD, XMV, XP00, XPI, XRADIUS, XRHOLW, XRD, XRV, XTT
+USE MODD_CSTS_DUST,         ONLY: XDENSITY_DUST, XM3TOUM3, XMOLARWEIGHT_DUST
+USE MODD_CURVCOR_n,         ONLY: XCORIOZ
+USE MODD_DEEP_CONVECTION_n, ONLY: XCG_RATE, XCG_TOTAL_NUMBER, XIC_RATE, XIC_TOTAL_NUMBER, XPACCONV, XPRCONV, XPRSCONV
+USE MODD_DIAG_FLAG
+USE MODD_DIM_n,             ONLY: NIMAX_ll, NJMAX_ll, NKMAX
+USE MODD_DUST,              ONLY: LDEPOS_DST, LDUST, NMODE_DST
+USE MODD_DYN_n,             ONLY: LOCEAN
+use modd_field,             only: tfieldmetadata, tfieldlist, TYPEINT, TYPEREAL
+USE MODD_FIELD_n,           ONLY: XCIT, XCLDFR, XICEFR, XPABSM, XPABST, XRT, XSIGS, XSRCT, XSVT, XTHT, XTKET, XUT, XVT, XWT, XZWS
+USE MODD_FRC,               ONLY: NFRC, XGXTHFRC, XGYTHFRC, XPGROUNDFRC, XRVFRC, XTENDRVFRC, XTENDTHFRC, XTHFRC, XUFRC, XVFRC, XWFRC
+USE MODD_GRID,              ONLY: XBETA, XLAT0, XLATORI, XLON0, XLONORI, XRPK
+USE MODD_GRID_n,            only: LSLEVE, NEXTE_XMIN, NEXTE_YMIN, XHATM_BOUND, &
+                                  XLAT, XLEN1, XLEN2, XLON, XZS, XXHAT, XXHATM, XYHAT, XYHATM, XZHAT, XZSMT, XZTOP, XZZ
+USE MODD_IO,                ONLY: TFILEDATA
+USE MODD_LSFIELD_n,         ONLY: XLSRVM, XLSTHM, XLSUM, XLSVM, XLSWM
+USE MODD_LUNIT,             ONLY: TLUOUT0
+USE MODD_METRICS_n,         ONLY: XDXX, XDYY, XDZX, XDZY, XDZZ
+USE MODD_MPIF
+USE MODD_NESTING,           ONLY: NDXRATIO_ALL, NDYRATIO_ALL, NXOR_ALL, NYOR_ALL
+USE MODD_NSV
+USE MODD_PARAMETERS,        ONLY: JPHEXT, JPVEXT, XUNDEF
+USE MODD_PARAM_LIMA_COLD,   ONLY: CLIMA_COLD_CONC
+USE MODD_PARAM_LIMA,        ONLY: NMOD_CCN, NMOD_IFN, NMOD_IMM, NINDICE_CCN_IMM, &
+                                  LSCAV, LLIMA_DIAG, NMOM_S, NMOM_G, NMOM_H
+USE MODD_PARAM_LIMA_WARM,   ONLY: CLIMA_WARM_CONC, CAERO_MASS
+USE MODD_PARAM_n,           ONLY: CCLOUD, CDCONV, CELEC, CSURF, CTURB
+USE MODD_PASPOL,            ONLY: LPASPOL
+USE MODD_PRECIP_n,          ONLY: XACDEP, XACPRC, XACPRG, XACPRH, XACPRR, XACPRS, XEVAP3D, &
+                                  XINDEP, XINPRC, XINPRG, XINPRH, XINPRR, XINPRR3D, XINPRS
+use modd_precision,         only: MNHREAL_MPI
+USE MODD_RADAR,             ONLY: CNAME_RAD, LATT, LCART_RAD, LDNDZ, LREFR, LWBSCS, LWREFL,                      &
+                                  NBAZIM, NBELEV, NBRAD, NBSTEPMAX, NCURV_INTERPOL, NDIFF, NMAX, NPTS_H, NPTS_V, &
+                                  XALT_RAD, XDT_RAD, XELEV, XGRID, XLAM_RAD, XLAT_RAD, XLON_RAD, XSTEP_RAD
+USE MODD_REF,               ONLY: LBOUSS, LCOUPLES, XEXNTOP, XEXNTOPO, XRHODREFZ, XRHODREFZO, XTHVREFZ, XTHVREFZO
+USE MODD_REF_n,             ONLY: XEXNREF, XRHODREF, XTHVREF
+USE MODD_SALT,              ONLY: LDEPOS_SLT, LSALT, NMODE_SLT
+USE MODD_TIME,              ONLY: TDTEXP, TDTSEG
+USE MODD_TIME_n,            ONLY: TDTCUR, TDTMOD
+USE MODD_TURB_n,            only: CTOM, XBL_DEPTH
+USE MODD_VAR_ll,            ONLY: NMNH_COMM_WORLD
+
+USE MODE_AERO_PSD,          ONLY: PPP2AERO
+USE MODE_BLOWSNOW_PSD,      ONLY: PPP2SNOW
+USE MODE_DUST_PSD,          ONLY: PPP2DUST
+use mode_field,             only: Find_field_id_from_mnhname
+USE MODE_GRIDPROJ,          ONLY: SM_LATLON
+USE MODE_IO_FIELD_WRITE,    only: IO_Field_write
+USE MODE_IO_FILE,           only: IO_File_close, IO_File_open
+USE MODE_IO_MANAGE_STRUCT,  only: IO_File_add2list
+USE MODE_MODELN_HANDLER,    only: GET_CURRENT_MODEL_INDEX
+use mode_msg
+USE MODE_SALT_PSD,          ONLY: PPP2SALT
+USE MODE_THERMO,            ONLY: QSAT, SM_FOES
+USE MODE_TOOLS,             ONLY: UPCASE
+USE MODE_TOOLS_ll,          ONLY: GET_DIM_EXT_ll, GET_INDICE_ll
+
+USE MODI_CALCSOUND
+USE MODI_CLUSTERING
+USE MODI_COMPUTE_MEAN_PRECIP
+USE MODI_CONTRAV
+USE MODI_GPS_ZENITH
+USE MODI_GRADIENT_M
+USE MODI_GRADIENT_U
+USE MODI_GRADIENT_V
+USE MODI_GRADIENT_W
+USE MODI_INI_RADAR
+USE MODI_LIDAR
+USE MODI_RADAR_RAIN_ICE
+USE MODI_RADAR_SIMULATOR
+USE MODI_SHUMAN
+USE MODI_UV_TO_ZONAL_AND_MERID
+!
+IMPLICIT NONE
+!
+!*       0.1   Declarations of arguments
+!
+TYPE(TFILEDATA),   INTENT(IN) :: TPFILE       ! outpput data file
+CHARACTER(LEN=28), INTENT(IN) :: HDADFILE     ! corresponding FM-file name of 
+                                              ! its DAD model
+!
+!*       0.2   Declarations of local variables
+!
+INTEGER           :: IRESP          ! return-code for the file routines 
+!
+CHARACTER(LEN=3)  :: YFRC           ! to mark the time of the forcing
+CHARACTER(LEN=31) :: YFGRI          ! file name for GPS stations
+!
+INTEGER           :: IIU,IJU,IKU,IIB,IJB,IKB,IIE,IJE,IKE ! Arrays bounds
+! 
+INTEGER                :: JLOOP,JI,JJ,JK,JSV,JT,JH,JV,JEL    ! loop index
+INTEGER :: IMI ! Current model index
+! 
+REAL :: ZRV_OV_RD !  XRV / XRD
+REAL :: ZGAMREF   ! Standard atmosphere lapse rate (K/m)
+REAL :: ZX0D      ! work real scalar  
+REAL :: ZLATOR, ZLONOR ! geographical coordinates of 1st mass point
+!
+REAL,DIMENSION(SIZE(XTHT,1),SIZE(XTHT,2),SIZE(XTHT,3))  :: ZPOVO
+REAL,DIMENSION(SIZE(XTHT,1),SIZE(XTHT,2),SIZE(XTHT,3))  :: ZTEMP
+REAL,DIMENSION(SIZE(XTHT,1),SIZE(XTHT,2),SIZE(XTHT,3))  :: ZVOX,ZVOY,ZVOZ 
+REAL,DIMENSION(SIZE(XTHT,1),SIZE(XTHT,2),SIZE(XTHT,3))  :: ZCORIOZ 
+REAL,DIMENSION(SIZE(XTHT,1),SIZE(XTHT,2),SIZE(XTHT,3))  :: ZWORK31,ZWORK32
+REAL,DIMENSION(SIZE(XTHT,1),SIZE(XTHT,2),SIZE(XTHT,3))  :: ZWORK33,ZWORK34
+REAL,DIMENSION(SIZE(XTHT,1),SIZE(XTHT,2))               :: ZWORK21,ZWORK22
+REAL,DIMENSION(SIZE(XTHT,1),SIZE(XTHT,2))               :: ZWORK23,ZWORK24
+REAL,DIMENSION(:,:,:,:,:), ALLOCATABLE                  :: ZWORK42 ! reflectivity on a cartesian grid (PREFL_CART)
+REAL,DIMENSION(:,:,:,:,:), ALLOCATABLE                  :: ZWORK42_BIS
+REAL,DIMENSION(:,:,:), ALLOCATABLE                      :: ZWORK43 ! latlon coordinates of cartesian grid points (PLATLON)
+REAL,DIMENSION(:,:,:), ALLOCATABLE                      :: ZPHI,ZTHETAE,ZTHETAV
+REAL,DIMENSION(:,:,:), ALLOCATABLE                      :: ZTHETAES,ZTHETAL,ZTHETAS1,ZTHETAS2
+REAL,DIMENSION(:,:,:), ALLOCATABLE                      :: ZVISIKUN,ZVISIGUL,ZVISIZHA 
+INTEGER, DIMENSION(:,:), ALLOCATABLE                    :: IWORK1
+integer :: ICURR,INBOUT,IERR
+!
+REAL,DIMENSION(SIZE(XSVT,1),SIZE(XSVT,2),SIZE(XSVT,3),NSP+NCARB+NSOA,JPMODE):: ZPTOTA
+REAL,DIMENSION(:,:,:,:), POINTER :: ZSDSTDEP
+REAL,DIMENSION(:,:,:,:), POINTER :: ZSSLTDEP
+REAL,DIMENSION(:,:,:,:), ALLOCATABLE  :: ZSIG_DST, ZRG_DST, ZN0_DST
+REAL,DIMENSION(:,:,:,:), ALLOCATABLE  :: ZSIG_SLT, ZRG_SLT, ZN0_SLT
+REAL,DIMENSION(:,:,:), ALLOCATABLE    :: ZBET_SNW, ZRG_SNW
+REAL,DIMENSION(:,:,:,:), ALLOCATABLE  :: ZMA_SNW
+REAL,DIMENSION(:,:,:), ALLOCATABLE  :: ZRHOT, ZTMP ! work array
+!
+! GBOTUP = True does clustering from bottom up to top, False top down to surface
+LOGICAL                                                   :: GBOTUP ! clustering propagation
+LOGICAL,DIMENSION(SIZE(XTHT,1),SIZE(XTHT,2),SIZE(XTHT,3)) :: GCLOUD ! mask
+INTEGER,DIMENSION(SIZE(XTHT,1),SIZE(XTHT,2),SIZE(XTHT,3)) :: ICLUSTERID, ICLUSTERLV
+REAL,   DIMENSION(SIZE(XTHT,1),SIZE(XTHT,2),SIZE(XTHT,3)) :: ZCLDSIZE
+
+!ECRITURE DANS UN FICHIER ASCII DE RESULTATS 
+!INITIALISATION DU NOM DE FICHIER CREE EN PARALLELE AVEC CELUI LFI
+TYPE(TFILEDATA),POINTER :: TZRSFILE
+INTEGER :: ILURS
+CHARACTER(LEN=32) :: YRS
+CHARACTER(LEN=3),DIMENSION(:),ALLOCATABLE  :: YRAD
+CHARACTER(LEN=2*INT(NBSTEPMAX*XSTEP_RAD/XGRID)*2*9+1), DIMENSION(:), ALLOCATABLE :: CLATLON
+CHARACTER(LEN=2*9) :: CBUFFER
+CHARACTER(LEN=4)  :: YELEV
+CHARACTER(LEN=3)  :: YGRID_SIZE
+INTEGER :: IEL,IIELV
+CHARACTER(LEN=5)  :: YVIEW   ! Upward or Downward integration
+INTEGER           :: IACCMODE
+!
+!-------------------------------------------------------------------------------
+INTEGER :: IAUX ! work variable
+REAL, DIMENSION(:,:,:), ALLOCATABLE                    :: ZW1, ZW2, ZW3
+REAL,DIMENSION(SIZE(XTHT,1),SIZE(XTHT,2),SIZE(XTHT,3)) :: ZWORK35,ZWORK36
+REAL,DIMENSION(SIZE(XTHT,1),SIZE(XTHT,2))              :: ZWORK25,ZWORK26
+REAL    :: ZEAU ! Mean precipitable water
+INTEGER, DIMENSION(SIZE(XZZ,1),SIZE(XZZ,2))          ::IKTOP ! level in which is the altitude 3000m
+REAL, DIMENSION(SIZE(XZZ,1),SIZE(XZZ,2),SIZE(XZZ,3)) :: ZDELTAZ ! interval (m) between two levels K
+INTEGER :: ILUOUT0 ! Logical unit number for output-listing
+!
+CHARACTER(LEN=2)  :: INDICE
+CHARACTER(LEN=100) :: YMSG
+INTEGER           :: IID
+TYPE(TFIELDMETADATA)               :: TZFIELD, TZFIELD2D
+TYPE(TFIELDMETADATA), DIMENSION(2) :: TZFIELD2
+!
+! LIMA LIDAR
+REAL,DIMENSION(:,:,:,:), ALLOCATABLE :: ZTMP1, ZTMP2, ZTMP3, ZTMP4
+!
+! hauteur couche limite
+REAL,DIMENSION(:,:,:),ALLOCATABLE :: ZZZ_GRID1
+REAL,DIMENSION(:,:),ALLOCATABLE :: ZTHVSOL,ZSHMIX
+REAL,DIMENSION(:,:,:),ALLOCATABLE :: ZZONWIND,ZMERWIND,ZFFWIND2,ZRIB
+!
+!-------------------------------------------------------------------------------
+!
+!*       0.     ARRAYS BOUNDS INITIALIZATION
+!
+CALL GET_DIM_EXT_ll ('B',IIU,IJU)
+CALL GET_INDICE_ll (IIB,IJB,IIE,IJE)
+IKU=NKMAX+2*JPVEXT
+IKB=1+JPVEXT
+IKE=IKU-JPVEXT
+
+IMI = GET_CURRENT_MODEL_INDEX()
+ILUOUT0 = TLUOUT0%NLU
+TZRSFILE => NULL()
+!-------------------------------------------------------------------------------
+!
+!*       1.     WRITES IN THE LFI FILE
+!               ---------------------- 
+!
+!*       1.0    TPFILE%CNAME and HDADFILE :
+!
+CALL IO_Field_write(TPFILE,'MASDEV',   NMASDEV)
+CALL IO_Field_write(TPFILE,'BUGFIX',   NBUGFIX)
+CALL IO_Field_write(TPFILE,'BIBUSER',  CBIBUSER)
+CALL IO_Field_write(TPFILE,'PROGRAM',  CPROGRAM)
+!
+CALL IO_Field_write(TPFILE,'L1D',      L1D)
+CALL IO_Field_write(TPFILE,'L2D',      L2D)
+CALL IO_Field_write(TPFILE,'PACK',     LPACK)
+!
+CALL IO_Field_write(TPFILE,'MY_NAME',  TPFILE%CNAME)
+CALL IO_Field_write(TPFILE,'DAD_NAME', HDADFILE)
+!
+IF (LEN_TRIM(HDADFILE)>0) THEN
+  CALL IO_Field_write(TPFILE,'DXRATIO',NDXRATIO_ALL(1))
+  CALL IO_Field_write(TPFILE,'DYRATIO',NDYRATIO_ALL(1))
+  CALL IO_Field_write(TPFILE,'XOR',    NXOR_ALL(1))
+  CALL IO_Field_write(TPFILE,'YOR',    NYOR_ALL(1))
+END IF
+!
+CALL IO_Field_write(TPFILE,'SURF',     CSURF)
+!
+!*       1.1    Type and Dimensions :
+!
+CALL IO_Field_write(TPFILE,'STORAGE_TYPE','DI')
+!
+CALL IO_Field_write(TPFILE,'IMAX',NIMAX_ll)
+CALL IO_Field_write(TPFILE,'JMAX',NJMAX_ll)
+CALL IO_Field_write(TPFILE,'KMAX',NKMAX)
+!
+CALL IO_Field_write(TPFILE,'JPHEXT',JPHEXT)
+!
+!*       1.2    Grid variables :
+!
+IF (.NOT.LCARTESIAN) THEN
+  CALL IO_Field_write(TPFILE,'RPK',   XRPK)
+  CALL IO_Field_write(TPFILE,'LONORI',XLONORI)
+  CALL IO_Field_write(TPFILE,'LATORI',XLATORI)
+! 
+!* diagnostic of 1st mass point
+!
+  CALL SM_LATLON( XLATORI, XLONORI, XHATM_BOUND(NEXTE_XMIN), XHATM_BOUND(NEXTE_YMIN), ZLATOR, ZLONOR )
+!
+  CALL IO_Field_write(TPFILE,'LONOR',ZLONOR)
+  CALL IO_Field_write(TPFILE,'LATOR',ZLATOR)
+!
+END IF 
+!
+CALL IO_Field_write(TPFILE,'THINSHELL',LTHINSHELL)
+CALL IO_Field_write(TPFILE,'LAT0',XLAT0)
+CALL IO_Field_write(TPFILE,'LON0',XLON0)
+CALL IO_Field_write(TPFILE,'BETA',XBETA)
+!
+CALL IO_Field_write(TPFILE,'XHAT',XXHAT)
+CALL IO_Field_write(TPFILE,'YHAT',XYHAT)
+CALL IO_Field_write(TPFILE,'ZHAT',XZHAT)
+CALL IO_Field_write(TPFILE,'ZTOP',XZTOP)
+!
+CALL IO_Field_write(TPFILE,'ZS',   XZS)
+CALL IO_Field_write(TPFILE,'ZWS',  XZWS)
+CALL IO_Field_write(TPFILE,'ZSMT', XZSMT)
+CALL IO_Field_write(TPFILE,'SLEVE',LSLEVE)
+!
+IF (LSLEVE) THEN
+  CALL IO_Field_write(TPFILE,'LEN1',XLEN1)
+  CALL IO_Field_write(TPFILE,'LEN2',XLEN2)
+END IF
+!
+!
+CALL IO_Field_write(TPFILE,'DTMOD',TDTMOD)
+CALL IO_Field_write(TPFILE,'DTCUR',TDTCUR)
+CALL IO_Field_write(TPFILE,'DTEXP',TDTEXP)
+CALL IO_Field_write(TPFILE,'DTSEG',TDTSEG)
+!
+!*       1.3    Configuration  variables :
+!
+CALL IO_Field_write(TPFILE,'CARTESIAN',LCARTESIAN)
+CALL IO_Field_write(TPFILE,'LBOUSS',   LBOUSS)
+CALL IO_Field_write(TPFILE,'LOCEAN',   LOCEAN)
+CALL IO_Field_write(TPFILE,'LCOUPLES', LCOUPLES)
+!
+IF (LCARTESIAN .AND. LWIND_ZM) THEN
+  LWIND_ZM=.FALSE.
+  PRINT*,'YOU ARE IN CARTESIAN GEOMETRY SO LWIND_ZM IS FORCED TO FALSE'
+END IF
+!*       1.4    Reference state variables :
+!
+IF (LCOUPLES.AND.LOCEAN) THEN
+  CALL IO_Field_write(TPFILE,'RHOREFZ',XRHODREFZO)
+  CALL IO_Field_write(TPFILE,'THVREFZ',XTHVREFZO)
+  CALL IO_Field_write(TPFILE,'EXNTOP', XEXNTOPO)
+ELSE
+  CALL IO_Field_write(TPFILE,'RHOREFZ',XRHODREFZ)
+  CALL IO_Field_write(TPFILE,'THVREFZ',XTHVREFZ)
+  CALL IO_Field_write(TPFILE,'EXNTOP', XEXNTOP)
+END IF
+!
+CALL IO_Field_write(TPFILE,'RHODREF',XRHODREF)
+CALL IO_Field_write(TPFILE,'THVREF', XTHVREF)
+!
+!
+!*       1.5    Variables necessary for plots
+!
+! PABST,THT,POVOM for cross sections at constant pressure 
+! level or constant theta level or constant PV level
+!
+IF (INDEX(CISO,'PR') /= 0) THEN
+  CALL IO_Field_write(TPFILE,'PABST',XPABST)
+END IF
+!
+IF (INDEX(CISO,'TK') /= 0) THEN
+  CALL IO_Field_write(TPFILE,'THT',XTHT)
+END IF
+!
+ZCORIOZ(:,:,:)=SPREAD( XCORIOZ(:,:),DIM=3,NCOPIES=IKU )
+ZVOX(:,:,:)=GY_W_VW(XWT,XDYY,XDZZ,XDZY)-GZ_V_VW(XVT,XDZZ)
+ZVOX(:,:,2)=ZVOX(:,:,3)
+ZVOY(:,:,:)=GZ_U_UW(XUT,XDZZ)-GX_W_UW(XWT,XDXX,XDZZ,XDZX)
+ZVOY(:,:,2)=ZVOY(:,:,3)
+ZVOZ(:,:,:)=GX_V_UV(XVT,XDXX,XDZZ,XDZX)-GY_U_UV(XUT,XDYY,XDZZ,XDZY)
+ZVOZ(:,:,2)=ZVOZ(:,:,3)
+ZVOZ(:,:,1)=ZVOZ(:,:,3)
+ZWORK31(:,:,:)=GX_M_M(XTHT,XDXX,XDZZ,XDZX)
+ZWORK32(:,:,:)=GY_M_M(XTHT,XDYY,XDZZ,XDZY)
+ZWORK33(:,:,:)=GZ_M_M(XTHT,XDZZ)
+ZPOVO(:,:,:)= ZWORK31(:,:,:)*MZF(MYF(ZVOX(:,:,:)))     &
+             + ZWORK32(:,:,:)*MZF(MXF(ZVOY(:,:,:)))     &
+             + ZWORK33(:,:,:)*(MYF(MXF(ZVOZ(:,:,:))) + ZCORIOZ(:,:,:))
+ZPOVO(:,:,:)= ZPOVO(:,:,:)*1E6/XRHODREF(:,:,:)
+ZPOVO(:,:,1)  =-1.E+11
+ZPOVO(:,:,IKU)=-1.E+11
+IF (INDEX(CISO,'EV') /= 0) THEN
+  TZFIELD = TFIELDMETADATA(                   &
+    CMNHNAME   = 'POVOT',                     &
+    CSTDNAME   = '',                          &
+    CLONGNAME  = 'POVOT',                     &
+    CUNITS     = 'PVU',                       & ! 1 PVU = 1e-6 m^2 s^-1 K kg^-1
+    CDIR       = 'XY',                        &
+    CCOMMENT   = 'X_Y_Z_POtential VOrticity', &
+    NGRID      = 1,                           &
+    NTYPE      = TYPEREAL,                    &
+    NDIMS      = 3,                           &
+    LTIMEDEP   = .TRUE.                       )
+  CALL IO_Field_write(TPFILE,TZFIELD,ZPOVO)
+END IF
+!
+!
+IF (LVAR_RS) THEN
+  CALL IO_Field_write(TPFILE,'UT',XUT)
+  CALL IO_Field_write(TPFILE,'VT',XVT)
+  !
+  IF (LWIND_ZM) THEN
+    TZFIELD2(1) = TFIELDMETADATA(                        &
+      CMNHNAME   = 'UM_ZM',                              &
+      CSTDNAME   = '',                                   &
+      CLONGNAME  = 'UM_ZM',                              &
+      CUNITS     = 'm s-1',                              &
+      CDIR       = 'XY',                                 &
+      CCOMMENT   = 'Zonal component of horizontal wind', &
+      NGRID      = 2,                                    &
+      NTYPE      = TYPEREAL,                             &
+      NDIMS      = 3,                                    &
+      LTIMEDEP   = .TRUE.                                )
+    !
+    TZFIELD2(2) = TFIELDMETADATA(                           &
+      CMNHNAME   = 'VM_ZM',                                 &
+      CSTDNAME   = '',                                      &
+      CLONGNAME  = 'VM_ZM',                                 &
+      CUNITS     = 'm s-1',                                 &
+      CDIR       = 'XY',                                    &
+      CCOMMENT   = 'Meridian component of horizontal wind', &
+      NGRID      = 3,                                       &
+      NTYPE      = TYPEREAL,                                &
+      NDIMS      = 3,                                       &
+      LTIMEDEP   = .TRUE.                                   )
+    !
+    CALL UV_TO_ZONAL_AND_MERID(XUT,XVT,23,TPFILE=TPFILE,TZFIELDS=TZFIELD2)
+  END IF
+  !
+  CALL IO_Field_write(TPFILE,'WT',XWT)
+  !
+  !   write mixing ratio for water vapor required to plot radio-soundings
+  !
+  IF (LUSERV) THEN
+    CALL IO_Field_write(TPFILE,'RVT',XRT(:,:,:,IDX_RVT))
+  END IF
+END IF
+!
+!*   Latitude and Longitude arrays
+!
+IF (.NOT.LCARTESIAN) THEN
+  CALL IO_Field_write(TPFILE,'LAT',XLAT)
+  CALL IO_Field_write(TPFILE,'LON',XLON)
+END IF
+!
+!
+!-------------------------------------------------------------------------------
+!
+!*       1.6    Other pronostic variables
+!
+ZTEMP(:,:,:)=XTHT(:,:,:)*(XPABST(:,:,:)/ XP00) **(XRD/XCPD)
+!
+IF (LVAR_TURB) THEN
+  IF (CTURB /= 'NONE') THEN
+    CALL IO_Field_write(TPFILE,'TKET',XTKET)
+    !
+    IF( NRR > 1 ) THEN
+      CALL IO_Field_write(TPFILE,'SRCT',XSRCT)
+      CALL IO_Field_write(TPFILE,'SIGS',XSIGS)
+    END IF
+    ! 
+    IF(CTOM=='TM06') THEN
+      CALL IO_Field_write(TPFILE,'BL_DEPTH',XBL_DEPTH)
+    END IF
+  END IF
+END IF
+!
+!* Rains
+!
+IF (LVAR_PR .AND. LUSERR .AND. SIZE(XINPRR)>0 ) THEN
+  !
+  ! explicit species
+  !
+  CALL FIND_FIELD_ID_FROM_MNHNAME('INPRR',IID,IRESP)
+  TZFIELD = TFIELDMETADATA( TFIELDLIST(IID) )
+  TZFIELD%CUNITS = 'mm hour-1'
+  CALL IO_Field_write(TPFILE,TZFIELD,XINPRR*3.6E6)
+  !
+  CALL IO_Field_write(TPFILE,'INPRR3D',XINPRR3D)
+  CALL IO_Field_write(TPFILE,'EVAP3D', XEVAP3D)
+  !
+  CALL FIND_FIELD_ID_FROM_MNHNAME('ACPRR',IID,IRESP)
+  TZFIELD = TFIELDMETADATA( TFIELDLIST(IID) )
+  TZFIELD%CUNITS = 'mm'
+  CALL IO_Field_write(TPFILE,TZFIELD,XACPRR*1.0E3)
+  !
+  IF (CCLOUD(1:3) == 'ICE' .OR. CCLOUD == 'C2R2' .OR. CCLOUD == 'C3R5' .OR.&
+      CCLOUD == 'KHKO' .OR. CCLOUD == 'LIMA') THEN 
+    IF (SIZE(XINPRC) /= 0 ) THEN
+      CALL FIND_FIELD_ID_FROM_MNHNAME('INPRC',IID,IRESP)
+      TZFIELD = TFIELDMETADATA( TFIELDLIST(IID) )
+      TZFIELD%CUNITS = 'mm hour-1'
+      CALL IO_Field_write(TPFILE,TZFIELD,XINPRC*3.6E6)
+      !
+      CALL FIND_FIELD_ID_FROM_MNHNAME('ACPRC',IID,IRESP)
+      TZFIELD = TFIELDMETADATA( TFIELDLIST(IID) )
+      TZFIELD%CUNITS = 'mm'
+      CALL IO_Field_write(TPFILE,TZFIELD,XACPRC*1.0E3)
+    END IF 
+    IF (SIZE(XINDEP) /= 0 ) THEN
+      CALL FIND_FIELD_ID_FROM_MNHNAME('INDEP',IID,IRESP)
+      TZFIELD = TFIELDMETADATA( TFIELDLIST(IID) )
+      TZFIELD%CUNITS = 'mm hour-1'
+      CALL IO_Field_write(TPFILE,TZFIELD,XINDEP*3.6E6)
+      !
+      CALL FIND_FIELD_ID_FROM_MNHNAME('ACDEP',IID,IRESP)
+      TZFIELD = TFIELDMETADATA( TFIELDLIST(IID) )
+      TZFIELD%CUNITS = 'mm'
+      CALL IO_Field_write(TPFILE,TZFIELD,XACDEP*1.0E3)
+    END IF 
+  END IF 
+  IF (CCLOUD(1:3) == 'ICE' .OR. CCLOUD == 'C3R5' .OR. CCLOUD == 'LIMA') THEN
+    CALL FIND_FIELD_ID_FROM_MNHNAME('INPRS',IID,IRESP)
+    TZFIELD = TFIELDMETADATA( TFIELDLIST(IID) )
+    TZFIELD%CUNITS = 'mm hour-1'
+    CALL IO_Field_write(TPFILE,TZFIELD,XINPRS*3.6E6)
+    !
+    CALL FIND_FIELD_ID_FROM_MNHNAME('ACPRS',IID,IRESP)
+    TZFIELD = TFIELDMETADATA( TFIELDLIST(IID) )
+    TZFIELD%CUNITS = 'mm'
+    CALL IO_Field_write(TPFILE,TZFIELD,XACPRS*1.0E3)
+    !
+    CALL FIND_FIELD_ID_FROM_MNHNAME('INPRG',IID,IRESP)
+    TZFIELD = TFIELDMETADATA( TFIELDLIST(IID) )
+    TZFIELD%CUNITS = 'mm hour-1'
+    CALL IO_Field_write(TPFILE,TZFIELD,XINPRG*3.6E6)
+    !
+    CALL FIND_FIELD_ID_FROM_MNHNAME('ACPRG',IID,IRESP)
+    TZFIELD = TFIELDMETADATA( TFIELDLIST(IID) )
+    TZFIELD%CUNITS = 'mm'
+    CALL IO_Field_write(TPFILE,TZFIELD,XACPRG*1.0E3)
+  !
+    IF (SIZE(XINPRH) /= 0 ) THEN
+      CALL FIND_FIELD_ID_FROM_MNHNAME('INPRH',IID,IRESP)
+      TZFIELD = TFIELDMETADATA( TFIELDLIST(IID) )
+      TZFIELD%CUNITS = 'mm hour-1'
+      CALL IO_Field_write(TPFILE,TZFIELD,XINPRH*3.6E6)
+      !
+      CALL FIND_FIELD_ID_FROM_MNHNAME('ACPRH',IID,IRESP)
+      TZFIELD = TFIELDMETADATA( TFIELDLIST(IID) )
+      TZFIELD%CUNITS = 'mm'
+      CALL IO_Field_write(TPFILE,TZFIELD,XACPRH*1.0E3)
+    ENDIF
+  !
+    ZWORK21(:,:) = XINPRR(:,:) + XINPRS(:,:) + XINPRG(:,:)
+    IF (SIZE(XINPRC) /= 0 ) &     
+      ZWORK21(:,:) = ZWORK21(:,:) + XINPRC(:,:)
+    IF (SIZE(XINPRH) /= 0 ) &       
+      ZWORK21(:,:) = ZWORK21(:,:) + XINPRH(:,:)
+    CALL FIND_FIELD_ID_FROM_MNHNAME('INPRT',IID,IRESP)
+    TZFIELD = TFIELDMETADATA( TFIELDLIST(IID) )
+    TZFIELD%CUNITS = 'mm hour-1'
+    CALL IO_Field_write(TPFILE,TZFIELD,ZWORK21*3.6E6)
+  !
+    ZWORK21(:,:) = XACPRR(:,:) + XACPRS(:,:) + XACPRG(:,:)
+    IF (SIZE(XINPRC) /= 0 ) &      
+      ZWORK21(:,:) = ZWORK21(:,:) + XACPRC(:,:)
+    IF (SIZE(XINPRH) /= 0 ) &        
+      ZWORK21(:,:) = ZWORK21(:,:) + XACPRH(:,:)
+  !
+    CALL FIND_FIELD_ID_FROM_MNHNAME('ACPRT',IID,IRESP)
+    TZFIELD = TFIELDMETADATA( TFIELDLIST(IID) )
+    TZFIELD%CUNITS = 'mm'
+    CALL IO_Field_write(TPFILE,TZFIELD,ZWORK21*1.0E3)
+  !
+  END IF
+  !
+  !* Convective rain
+  !
+  IF (CDCONV /= 'NONE') THEN
+    CALL FIND_FIELD_ID_FROM_MNHNAME('PRCONV',IID,IRESP)
+    TZFIELD = TFIELDMETADATA( TFIELDLIST(IID) )
+    TZFIELD%CUNITS = 'mm hour-1'
+    CALL IO_Field_write(TPFILE,TZFIELD,XPRCONV*3.6E6)
+    !
+    CALL FIND_FIELD_ID_FROM_MNHNAME('PACCONV',IID,IRESP)
+    TZFIELD = TFIELDMETADATA( TFIELDLIST(IID) )
+    TZFIELD%CUNITS = 'mm'
+    CALL IO_Field_write(TPFILE,TZFIELD,XPACCONV*1.0E3)
+    !
+    CALL FIND_FIELD_ID_FROM_MNHNAME('PRSCONV',IID,IRESP)
+    TZFIELD = TFIELDMETADATA( TFIELDLIST(IID) )
+    TZFIELD%CUNITS = 'mm hour-1'
+    CALL IO_Field_write(TPFILE,TZFIELD,XPRSCONV*3.6E6)
+  END IF
+END IF
+IF (LVAR_PR ) THEN
+  !Precipitable water in kg/m**2 
+  ZWORK21(:,:) = 0.
+  ZWORK22(:,:) = 0.
+  ZWORK23(:,:) = 0.
+  ZWORK31(:,:,:) = DZF(XZZ(:,:,:))
+  DO JK = IKB,IKE
+    !* Calcul de qtot
+    IF  (CCLOUD(1:3) == 'ICE' .OR. CCLOUD == 'LIMA') THEN
+      ZWORK23(IIB:IIE,IJB:IJE) = XRT(IIB:IIE,IJB:IJE,JK,1) + &
+      XRT(IIB:IIE,IJB:IJE,JK,2) + XRT(IIB:IIE,IJB:IJE,JK,3) + &
+      XRT(IIB:IIE,IJB:IJE,JK,4) + XRT(IIB:IIE,IJB:IJE,JK,5) + &
+      XRT(IIB:IIE,IJB:IJE,JK,6)
+    ELSE
+      ZWORK23(IIB:IIE,IJB:IJE) = XRT(IIB:IIE,IJB:IJE,JK,1)
+    ENDIF
+    !* Calcul de l'eau precipitable
+    ZWORK21(IIB:IIE,IJB:IJE)=XRHODREF(IIB:IIE,IJB:IJE,JK)* &
+    ZWORK23(IIB:IIE,IJB:IJE)* ZWORK31(IIB:IIE,IJB:IJE,JK)
+    !* Sum 
+    ZWORK22(IIB:IIE,IJB:IJE) = ZWORK22(IIB:IIE,IJB:IJE)+ZWORK21(IIB:IIE,IJB:IJE)
+    ZWORK21(:,:) = 0.
+    ZWORK23(:,:) = 0.
+  END DO
+  !* Precipitable water in kg/m**2
+  TZFIELD = TFIELDMETADATA(          &
+    CMNHNAME   = 'PRECIP_WAT', &
+    CSTDNAME   = '',           &
+    CLONGNAME  = 'PRECIP_WAT', &
+    CUNITS     = 'kg m-2',     &
+    CDIR       = 'XY',         &
+    CCOMMENT   = '',           &
+    NGRID      = 1,            &
+    NTYPE      = TYPEREAL,     &
+    NDIMS      = 2,            &
+    LTIMEDEP   = .TRUE.        )
+  CALL IO_Field_write(TPFILE,TZFIELD,ZWORK22)
+ENDIF
+!
+!
+!* Flux d'humidite et d'hydrometeores
+IF (LHU_FLX) THEN
+  ZWORK35(:,:,:) = XRHODREF(:,:,:) * XRT(:,:,:,1)
+  ZWORK31(:,:,:) = MXM(ZWORK35(:,:,:)) * XUT(:,:,:)
+  ZWORK32(:,:,:) = MYM(ZWORK35(:,:,:)) * XVT(:,:,:)
+  ZWORK35(:,:,:) = GX_U_M(ZWORK31,XDXX,XDZZ,XDZX) + GY_V_M(ZWORK32,XDYY,XDZZ,XDZY)
+  IF  (CCLOUD(1:3) == 'ICE' .OR. CCLOUD == 'LIMA') THEN
+    ZWORK36(:,:,:) = ZWORK35(:,:,:) + XRHODREF(:,:,:) * (XRT(:,:,:,2) + &
+    XRT(:,:,:,3) + XRT(:,:,:,4) + XRT(:,:,:,5) + XRT(:,:,:,6))
+    ZWORK33(:,:,:) = MXM(ZWORK36(:,:,:)) * XUT(:,:,:)
+    ZWORK34(:,:,:) = MYM(ZWORK36(:,:,:)) * XVT(:,:,:)
+    ZWORK36(:,:,:) = GX_U_M(ZWORK33,XDXX,XDZZ,XDZX) + GY_V_M(ZWORK34,XDYY,XDZZ,XDZY)
+  ENDIF
+  !
+  ! Integration sur 3000 m
+  !
+  IKTOP(:,:)=0
+  DO JK=1,IKU-1
+    WHERE (((XZZ(:,:,JK) -XZS(:,:))<= 3000.0) .AND. ((XZZ(:,:,JK+1) -XZS(:,:))> 3000.0))
+      IKTOP(:,:)=JK
+    END WHERE
+  END DO
+  ZDELTAZ(:,:,:)=DZF(XZZ)
+  ZWORK21(:,:) = 0.
+  ZWORK22(:,:) = 0.
+  ZWORK25(:,:) = 0.  
+  DO JJ=1,IJU
+    DO JI=1,IIU
+      IAUX=IKTOP(JI,JJ)
+      DO JK=IKB,IAUX-1 
+        ZWORK21(JI,JJ) = ZWORK21(JI,JJ) + ZWORK31(JI,JJ,JK) * ZDELTAZ(JI,JJ,JK)
+        ZWORK22(JI,JJ) = ZWORK22(JI,JJ) + ZWORK32(JI,JJ,JK) * ZDELTAZ(JI,JJ,JK)
+        ZWORK25(JI,JJ) = ZWORK25(JI,JJ) + ZWORK35(JI,JJ,JK) * ZDELTAZ(JI,JJ,JK)
+      ENDDO
+      IF (IAUX >= IKB) THEN
+        ZDELTAZ(JI,JJ,IAUX)= 3000. - (XZZ(JI,JJ,IAUX) -XZS(JI,JJ))
+        ZWORK21(JI,JJ) = ZWORK21(JI,JJ) + ZWORK31(JI,JJ,IAUX) * ZDELTAZ(JI,JJ,IAUX) 
+        ZWORK22(JI,JJ) = ZWORK22(JI,JJ) + ZWORK32(JI,JJ,IAUX) * ZDELTAZ(JI,JJ,IAUX)
+        ZWORK25(JI,JJ) = ZWORK25(JI,JJ) + ZWORK35(JI,JJ,IAUX) * ZDELTAZ(JI,JJ,IAUX)
+      ENDIF
+    ENDDO
+  ENDDO
+  IF  (CCLOUD(1:3) == 'ICE' .OR. CCLOUD == 'LIMA') THEN
+    ZWORK23(:,:) = 0.
+    ZWORK24(:,:) = 0.
+    ZWORK26(:,:) = 0.
+    DO JJ=1,IJU
+      DO JI=1,IIU
+        IAUX=IKTOP(JI,JJ)
+        DO JK=IKB,IAUX-1 
+          ZWORK23(JI,JJ) = ZWORK23(JI,JJ) + ZWORK33(JI,JJ,JK) * ZDELTAZ(JI,JJ,JK)
+          ZWORK24(JI,JJ) = ZWORK24(JI,JJ) + ZWORK34(JI,JJ,JK) * ZDELTAZ(JI,JJ,JK)
+          ZWORK26(JI,JJ) = ZWORK26(JI,JJ) + ZWORK36(JI,JJ,JK) * ZDELTAZ(JI,JJ,JK)
+        ENDDO
+        IF (IAUX >= IKB) THEN
+          ZDELTAZ(JI,JJ,IAUX)= 3000. - (XZZ(JI,JJ,IAUX) -XZS(JI,JJ))
+          ZWORK23(JI,JJ) = ZWORK23(JI,JJ) + ZWORK33(JI,JJ,IAUX) * ZDELTAZ(JI,JJ,IAUX) 
+          ZWORK24(JI,JJ) = ZWORK24(JI,JJ) + ZWORK34(JI,JJ,IAUX) * ZDELTAZ(JI,JJ,IAUX)
+          ZWORK26(JI,JJ) = ZWORK26(JI,JJ) + ZWORK36(JI,JJ,IAUX) * ZDELTAZ(JI,JJ,IAUX)
+        ENDIF
+      ENDDO
+    ENDDO
+  ENDIF
+  ! Ecriture
+  !  composantes U et V du flux surfacique d'humidite
+  TZFIELD = TFIELDMETADATA(    &
+    CMNHNAME   = 'UM90',       &
+    CSTDNAME   = '',           &
+    CLONGNAME  = 'UM90',       &
+    CUNITS     = 'kg s-1 m-2', &
+    CDIR       = 'XY',         &
+    CCOMMENT   = '',           &
+    NGRID      = 2,            &
+    NTYPE      = TYPEREAL,     &
+    NDIMS      = 3,            &
+    LTIMEDEP   = .TRUE.        )
+  CALL IO_Field_write(TPFILE,TZFIELD,ZWORK31)
+  !  
+  TZFIELD = TFIELDMETADATA(    &
+    CMNHNAME   = 'VM90',       &
+    CSTDNAME   = '',           &
+    CLONGNAME  = 'VM90',       &
+    CUNITS     = 'kg s-1 m-2', &
+    CDIR       = 'XY',         &
+    CCOMMENT   = '',           &
+    NGRID      = 3,            &
+    NTYPE      = TYPEREAL,     &
+    NDIMS      = 3,            &
+    LTIMEDEP   = .TRUE.        )
+  CALL IO_Field_write(TPFILE,TZFIELD,ZWORK32)
+  !  composantes U et V du flux d'humidite integre sur 3000 metres
+  TZFIELD = TFIELDMETADATA(    &
+    CMNHNAME   = 'UM91',       &
+    CSTDNAME   = '',           &
+    CLONGNAME  = 'UM91',       &
+    CUNITS     = 'kg s-1 m-1', &
+    CDIR       = 'XY',         &
+    CCOMMENT   = '',           &
+    NGRID      = 2,            &
+    NTYPE      = TYPEREAL,     &
+    NDIMS      = 2,            &
+    LTIMEDEP   = .TRUE.        )
+  CALL IO_Field_write(TPFILE,TZFIELD,ZWORK21)
+  !
+  TZFIELD = TFIELDMETADATA(    &
+    CMNHNAME   = 'VM91',       &
+    CSTDNAME   = '',           &
+    CLONGNAME  = 'VM91',       &
+    CUNITS     = 'kg s-1 m-1', &
+    CDIR       = 'XY',         &
+    CCOMMENT   = '',           &
+    NGRID      = 3,            &
+    NTYPE      = TYPEREAL,     &
+    NDIMS      = 2,            &
+    LTIMEDEP   = .TRUE.        )
+  CALL IO_Field_write(TPFILE,TZFIELD,ZWORK22)
+  !
+  !   Convergence d'humidite
+  TZFIELD = TFIELDMETADATA(                                     &
+    CMNHNAME   = 'HMCONV',                                      &
+    CSTDNAME   = '',                                            &
+    CLONGNAME  = 'HMCONV',                                      &
+    CUNITS     = 'kg s-1 m-3',                                  &
+    CDIR       = 'XY',                                          &
+    CCOMMENT   = 'X_Y_Horizontal CONVergence of moisture flux', &
+    NGRID      = 1,                                             &
+    NTYPE      = TYPEREAL,                                      &
+    NDIMS      = 3,                                             &
+    LTIMEDEP   = .TRUE.                                         )
+  CALL IO_Field_write(TPFILE,TZFIELD,-ZWORK35)
+  !
+  !   Convergence d'humidite integre sur 3000 metres
+  TZFIELD = TFIELDMETADATA(                                     &
+    CMNHNAME   = 'HMCONV3000',                                  &
+    CSTDNAME   = '',                                            &
+    CLONGNAME  = 'HMCONV3000',                                  &
+    CUNITS     = 'kg s-1 m-3',                                  &
+    CDIR       = 'XY',                                          &
+    CCOMMENT   = 'X_Y_Horizontal CONVergence of moisture flux', &
+    NGRID      = 1,                                             &
+    NTYPE      = TYPEREAL,                                      &
+    NDIMS      = 2,                                             &
+    LTIMEDEP   = .TRUE.                                         )
+  CALL IO_Field_write(TPFILE,TZFIELD,-ZWORK25)
+  !
+  IF  (CCLOUD(1:3) == 'ICE' .OR. CCLOUD == 'LIMA') THEN
+    !  composantes U et V du flux surfacique d'hydrometeores  
+    TZFIELD = TFIELDMETADATA(    &
+      CMNHNAME   = 'UM92',       &
+      CSTDNAME   = '',           &
+      CLONGNAME  = 'UM92',       &
+      CUNITS     = 'kg s-1 m-2', &
+      CDIR       = 'XY',         &
+      CCOMMENT   = '',           &
+      NGRID      = 2,            &
+      NTYPE      = TYPEREAL,     &
+      NDIMS      = 3,            &
+      LTIMEDEP   = .TRUE.        )
+    CALL IO_Field_write(TPFILE,TZFIELD,ZWORK33)
+    ! 
+    TZFIELD = TFIELDMETADATA(    &
+      CMNHNAME   = 'VM92',       &
+      CSTDNAME   = '',           &
+      CLONGNAME  = 'VM92',       &
+      CUNITS     = 'kg s-1 m-2', &
+      CDIR       = 'XY',         &
+      CCOMMENT   = '',           &
+      NGRID      = 3,            &
+      NTYPE      = TYPEREAL,     &
+      NDIMS      = 3,            &
+      LTIMEDEP   = .TRUE.        )
+    CALL IO_Field_write(TPFILE,TZFIELD,ZWORK34)
+    !  composantes U et V du flux d'hydrometeores integre sur 3000 metres
+    TZFIELD = TFIELDMETADATA(    &
+      CMNHNAME   = 'UM93',       &
+      CSTDNAME   = '',           &
+      CLONGNAME  = 'UM93',       &
+      CUNITS     = 'kg s-1 m-1', &
+      CDIR       = 'XY',         &
+      CCOMMENT   = '',           &
+      NGRID      = 2,            &
+      NTYPE      = TYPEREAL,     &
+      NDIMS      = 2,            &
+      LTIMEDEP   = .TRUE.        )
+    CALL IO_Field_write(TPFILE,TZFIELD,ZWORK23)
+    ! 
+    TZFIELD = TFIELDMETADATA(    &
+      CMNHNAME   = 'VM93',       &
+      CSTDNAME   = '',           &
+      CLONGNAME  = 'VM93',       &
+      CUNITS     = 'kg s-1 m-1', &
+      CDIR       = 'XY',         &
+      CCOMMENT   = '',           &
+      NGRID      = 3,            &
+      NTYPE      = TYPEREAL,     &
+      NDIMS      = 2,            &
+      LTIMEDEP   = .TRUE.        )
+    CALL IO_Field_write(TPFILE,TZFIELD,ZWORK24)
+    !   Convergence d'hydrometeores
+    TZFIELD = TFIELDMETADATA(                                        &
+      CMNHNAME   = 'HMCONV_TT',                                      &
+      CSTDNAME   = '',                                               &
+      CLONGNAME  = 'HMCONV_TT',                                      &
+      CUNITS     = 'kg s-1 m-3',                                     &
+      CDIR       = 'XY',                                             &
+      CCOMMENT   = 'X_Y_Horizontal CONVergence of hydrometeor flux', &
+      NGRID      = 1,                                                &
+      NTYPE      = TYPEREAL,                                         &
+      NDIMS      = 3,                                                &
+      LTIMEDEP   = .TRUE.                                            )
+    CALL IO_Field_write(TPFILE,TZFIELD,-ZWORK36)
+    !   Convergence d'hydrometeores integre sur 3000 metres
+    TZFIELD = TFIELDMETADATA(                                        &
+      CMNHNAME   = 'HMCONV3000_TT',                                  &
+      CSTDNAME   = '',                                               &
+      CLONGNAME  = 'HMCONV3000_TT',                                  &
+      CUNITS     = 'kg s-1 m-3',                                     &
+      CDIR       = 'XY',                                             &
+      CCOMMENT   = 'X_Y_Horizontal CONVergence of hydrometeor flux', &
+      NGRID      = 1,                                                &
+      NTYPE      = TYPEREAL,                                         &
+      NDIMS      = 2,                                                &
+      LTIMEDEP   = .TRUE.                                            )
+    CALL IO_Field_write(TPFILE,TZFIELD,-ZWORK26)
+  ENDIF
+ENDIF
+!
+!* Moist variables
+!
+IF (LVAR_MRW .OR. LLIMA_DIAG) THEN
+  IF (NRR >=1) THEN
+    ! Moist variables are written individually in file
+    TZFIELD = TFIELDMETADATA(                     &
+      CMNHNAME   = 'generic for moist variables', & !Temporary name to ease identification
+      CSTDNAME   = '',                            &
+      CDIR       = 'XY',                          &
+      NGRID      = 1,                             &
+      NTYPE      = TYPEREAL,                      &
+      NDIMS      = 3,                             &
+      LTIMEDEP   = .TRUE.                         )
+    IF (LUSERV) THEN
+      TZFIELD%CMNHNAME   = 'MRV'
+      TZFIELD%CLONGNAME  = 'MRV'
+      TZFIELD%CUNITS     = 'g kg-1'
+      TZFIELD%CCOMMENT   = 'X_Y_Z_MRV'
+      CALL IO_Field_write(TPFILE,TZFIELD,XRT(:,:,:,IDX_RVT)*1.E3)
+    END IF
+    IF (LUSERC) THEN
+      TZFIELD%CMNHNAME   = 'MRC'
+      TZFIELD%CLONGNAME  = 'MRC'
+      TZFIELD%CUNITS     = 'g kg-1'
+      TZFIELD%CCOMMENT   = 'X_Y_Z_MRC'
+      CALL IO_Field_write(TPFILE,TZFIELD,XRT(:,:,:,IDX_RCT)*1.E3)
+!
+      TZFIELD%CMNHNAME   = 'VRC'
+      TZFIELD%CLONGNAME  = 'VRC'
+      TZFIELD%CUNITS     = 'ppv' !vol/vol
+      TZFIELD%CCOMMENT   = 'X_Y_Z_VRC (vol/vol)'
+      CALL IO_Field_write(TPFILE,TZFIELD,XRT(:,:,:,IDX_RCT)*XRHODREF(:,:,:)/1.E3)
+    END IF
+    IF (LUSERR) THEN
+      TZFIELD%CMNHNAME   = 'MRR'
+      TZFIELD%CLONGNAME  = 'MRR'
+      TZFIELD%CUNITS     = 'g kg-1'
+      TZFIELD%CCOMMENT   = 'X_Y_Z_MRR'
+      CALL IO_Field_write(TPFILE,TZFIELD,XRT(:,:,:,IDX_RRT)*1.E3)
+!
+      TZFIELD%CMNHNAME   = 'VRR'
+      TZFIELD%CLONGNAME  = 'VRR'
+      TZFIELD%CUNITS     = 'ppv' !vol/vol
+      TZFIELD%CCOMMENT   = 'X_Y_Z_VRR (vol/vol)'
+      CALL IO_Field_write(TPFILE,TZFIELD,XRT(:,:,:,IDX_RRT)*XRHODREF(:,:,:)/1.E3)
+    END IF
+    IF (LUSERI) THEN
+      TZFIELD%CMNHNAME   = 'MRI'
+      TZFIELD%CLONGNAME  = 'MRI'
+      TZFIELD%CUNITS     = 'g kg-1'
+      TZFIELD%CCOMMENT   = 'X_Y_Z_MRI'
+      CALL IO_Field_write(TPFILE,TZFIELD,XRT(:,:,:,IDX_RIT)*1.E3)
+!
+      IF (LUSECI) THEN
+        CALL IO_Field_write(TPFILE,'CIT',XCIT(:,:,:))
+      END IF
+    END IF
+    IF (LUSERS) THEN
+      TZFIELD%CMNHNAME   = 'MRS'
+      TZFIELD%CLONGNAME  = 'MRS'
+      TZFIELD%CUNITS     = 'g kg-1'
+      TZFIELD%CCOMMENT   = 'X_Y_Z_MRS'
+      CALL IO_Field_write(TPFILE,TZFIELD,XRT(:,:,:,IDX_RST)*1.E3)
+    END IF
+    IF (LUSERG) THEN
+      TZFIELD%CMNHNAME   = 'MRG'
+      TZFIELD%CLONGNAME  = 'MRG'
+      TZFIELD%CUNITS     = 'g kg-1'
+      TZFIELD%CCOMMENT   = 'X_Y_Z_MRG'
+      CALL IO_Field_write(TPFILE,TZFIELD,XRT(:,:,:,IDX_RGT)*1.E3)
+    END IF
+    IF (LUSERH) THEN
+      TZFIELD%CMNHNAME   = 'MRH'
+      TZFIELD%CLONGNAME  = 'MRH'
+      TZFIELD%CUNITS     = 'g kg-1'
+      TZFIELD%CCOMMENT   = 'X_Y_Z_MRH'
+      CALL IO_Field_write(TPFILE,TZFIELD,XRT(:,:,:,IDX_RHT)*1.E3)
+    END IF
+  END IF
+END IF
+!
+!* Scalar Variables
+!
+! User scalar variables
+! individually in the file
+IF (LVAR_MRSV) THEN
+  DO JSV = 1,NSV_USER
+    TZFIELD = TSVLIST(JSV)
+    WRITE( TZFIELD%CMNHNAME, '( A4, I3.3 )' ) 'MRSV', JSV
+    TZFIELD%CLONGNAME  = TRIM(TZFIELD%CMNHNAME)
+    TZFIELD%CUNITS     = 'g kg-1'
+    WRITE( TZFIELD%CCOMMENT, '( A, I3.3 )' ) 'Mixing Ratio for user Scalar Variable', JSV
+    CALL IO_Field_write( TPFILE, TZFIELD, XSVT(:,:,:,JSV) * 1.E3 )
+  END DO
+END IF
+! microphysical C2R2 scheme scalar variables
+IF(LVAR_MRW) THEN
+  DO JSV = NSV_C2R2BEG,NSV_C2R2END
+    TZFIELD = TSVLIST(JSV)
+   IF (JSV < NSV_C2R2END) THEN
+      TZFIELD%CUNITS     = 'cm-3'
+      ZWORK31(:,:,:)=XSVT(:,:,:,JSV)*1.E-6
+    ELSE
+      TZFIELD%CUNITS     = 'l-1'
+      ZWORK31(:,:,:)=XSVT(:,:,:,JSV)*1.E-3
+    END IF
+    WRITE(TZFIELD%CCOMMENT,'(A6,A4,I3.3)')'X_Y_Z_','MRSV',JSV
+    CALL IO_Field_write(TPFILE,TZFIELD,ZWORK31)
+  END DO
+  ! microphysical C3R5 scheme additional scalar variables
+  DO JSV = NSV_C1R3BEG,NSV_C1R3END
+    TZFIELD = TSVLIST(JSV)
+    TZFIELD%CUNITS     = 'l-1'
+    CALL IO_Field_write(TPFILE,TZFIELD,XSVT(:,:,:,JSV)*1.E-3)
+  END DO
+END IF
+!
+! microphysical LIMA scheme scalar variables
+!
+IF (LLIMA_DIAG) THEN
+  IF (NSV_LIMA_END>=NSV_LIMA_BEG) THEN
+    TZFIELD = TFIELDMETADATA(           &
+      CMNHNAME   = 'generic LIMA diag', & !Temporary name to ease identification
+      CDIR       = 'XY',                &
+      NGRID      = 1,                   &
+      NTYPE      = TYPEREAL,            &
+      NDIMS      = 3,                   &
+      LTIMEDEP   = .TRUE.               )
+  END IF
+  !
+  DO JSV = NSV_LIMA_BEG,NSV_LIMA_END
+    !
+    TZFIELD%CUNITS     = 'cm-3'
+    WRITE(TZFIELD%CCOMMENT,'(A6,A3,I3.3)')'X_Y_Z_','SVT',JSV
+    !
+! Nc
+    IF (JSV .EQ. NSV_LIMA_NC) THEN
+      TZFIELD%CMNHNAME   = TRIM(CLIMA_WARM_CONC(1))
+    END IF
+! Nr
+    IF (JSV .EQ. NSV_LIMA_NR) THEN
+      TZFIELD%CMNHNAME   = TRIM(CLIMA_WARM_CONC(2))
+    END IF
+! N CCN free
+    IF (JSV .GE. NSV_LIMA_CCN_FREE .AND. JSV .LT. NSV_LIMA_CCN_ACTI) THEN
+      WRITE(INDICE,'(I2.2)')(JSV - NSV_LIMA_CCN_FREE + 1)
+      TZFIELD%CMNHNAME   = TRIM(CLIMA_WARM_CONC(3))//INDICE
+    END IF
+! N CCN acti
+    IF (JSV .GE. NSV_LIMA_CCN_ACTI .AND. JSV .LT. NSV_LIMA_CCN_ACTI + NMOD_CCN) THEN
+      WRITE(INDICE,'(I2.2)')(JSV - NSV_LIMA_CCN_ACTI + 1)
+      TZFIELD%CMNHNAME   = TRIM(CLIMA_WARM_CONC(4))//INDICE
+    END IF
+! Scavenging
+    IF (JSV .EQ. NSV_LIMA_SCAVMASS) THEN
+      TZFIELD%CMNHNAME   = TRIM(CAERO_MASS(1))
+      TZFIELD%CUNITS     = 'kg cm-3'
+    END IF
+! Ni
+    IF (JSV .EQ. NSV_LIMA_NI) THEN
+      TZFIELD%CMNHNAME   = TRIM(CLIMA_COLD_CONC(1))
+    END IF
+! Ns
+    IF (JSV .EQ. NSV_LIMA_NS) THEN
+      TZFIELD%CMNHNAME   = TRIM(CLIMA_COLD_CONC(2))
+    END IF
+! Ng
+    IF (JSV .EQ. NSV_LIMA_NG) THEN
+      TZFIELD%CMNHNAME   = TRIM(CLIMA_COLD_CONC(3))
+    END IF
+! Nh
+    IF (JSV .EQ. NSV_LIMA_NH) THEN
+      TZFIELD%CMNHNAME   = TRIM(CLIMA_COLD_CONC(4))
+    END IF
+! N IFN free
+    IF (JSV .GE. NSV_LIMA_IFN_FREE .AND. JSV .LT. NSV_LIMA_IFN_NUCL) THEN
+      WRITE(INDICE,'(I2.2)')(JSV - NSV_LIMA_IFN_FREE + 1)
+      TZFIELD%CMNHNAME   = TRIM(CLIMA_COLD_CONC(5))//INDICE
+    END IF
+! N IFN nucl
+    IF (JSV .GE. NSV_LIMA_IFN_NUCL .AND. JSV .LT. NSV_LIMA_IFN_NUCL + NMOD_IFN) THEN
+      WRITE(INDICE,'(I2.2)')(JSV - NSV_LIMA_IFN_NUCL + 1)
+      TZFIELD%CMNHNAME   = TRIM(CLIMA_COLD_CONC(6))//INDICE
+    END IF
+! N IMM nucl
+    IF (JSV .GE. NSV_LIMA_IMM_NUCL .AND. JSV .LT. NSV_LIMA_IMM_NUCL + NMOD_IMM) THEN
+      WRITE(INDICE,'(I2.2)')(NINDICE_CCN_IMM(JSV - NSV_LIMA_IMM_NUCL + 1))
+      TZFIELD%CMNHNAME   = TRIM(CLIMA_COLD_CONC(7))//INDICE
+    END IF
+! Hom. freez. of CCN
+    IF (JSV .EQ. NSV_LIMA_HOM_HAZE) THEN
+      TZFIELD%CMNHNAME   = TRIM(CLIMA_COLD_CONC(8))
+    END IF
+    !
+! Supersaturation
+    IF (JSV .EQ. NSV_LIMA_SPRO) THEN
+      TZFIELD%CMNHNAME   = TRIM(CLIMA_WARM_CONC(5))
+    END IF
+    !
+    TZFIELD%CLONGNAME  = TRIM(TZFIELD%CMNHNAME)
+    ZWORK31(:,:,:)=XSVT(:,:,:,JSV)*1.E-6*XRHODREF(:,:,:)
+    CALL IO_Field_write(TPFILE,TZFIELD,ZWORK31)
+  END DO
+!
+  IF (LUSERC) THEN
+    TZFIELD = TFIELDMETADATA(    &
+      CMNHNAME   = 'LWC',        &
+      CSTDNAME   = '',           &
+      CLONGNAME  = 'LWC',        &
+      CUNITS     = 'g m-3',      &
+      CDIR       = 'XY',         &
+      CCOMMENT   = 'X_Y_Z_LWC',  &
+      NGRID      = 1,            &
+      NTYPE      = TYPEREAL,     &
+      NDIMS      = 3,            &
+      LTIMEDEP   = .TRUE.        )
+    ZWORK31(:,:,:)=XRT(:,:,:,2)*1.E3*XRHODREF(:,:,:)
+    CALL IO_Field_write(TPFILE,TZFIELD,ZWORK31)
+  END IF
+!
+  IF (LUSERI) THEN
+    TZFIELD = TFIELDMETADATA(   &
+      CMNHNAME   = 'IWC',       &
+      CSTDNAME   = '',          &
+      CLONGNAME  = 'IWC',       &
+      CUNITS     = 'g m-3',     &
+      CDIR       = 'XY',        &
+      CCOMMENT   = 'X_Y_Z_MRI', &
+      NGRID      = 1,           &
+      NTYPE      = TYPEREAL,    &
+      NDIMS      = 3,           &
+      LTIMEDEP   = .TRUE.       )
+    ZWORK31(:,:,:)=XRT(:,:,:,4)*1.E3*XRHODREF(:,:,:)
+    CALL IO_Field_write(TPFILE,TZFIELD,ZWORK31)
+  END IF
+!
+END IF
+IF (LELECDIAG .AND. CELEC .NE. "NONE") THEN
+  DO JSV = NSV_ELECBEG,NSV_ELECEND
+    TZFIELD = TSVLIST(JSV)
+    IF ( JSV > NSV_ELECBEG .AND. JSV < NSV_ELECEND ) THEN
+      TZFIELD%CUNITS = 'C m-3'
+      WRITE( TZFIELD%CCOMMENT, '( A6, A3, I3.3 )' ) 'X_Y_Z_', 'SVT', JSV
+    ELSE
+      TZFIELD%CUNITS = 'm-3'
+      WRITE( TZFIELD%CCOMMENT, '( A6, A3, I3.3, A8 )' ) 'X_Y_Z_', 'SVT', JSV, ' (nb ions/m3)'
+    END IF
+    ZWORK31(:,:,:)=XSVT(:,:,:,JSV) * XRHODREF(:,:,:)  ! C/kg --> C/m3
+    CALL IO_Field_write(TPFILE,TZFIELD,ZWORK31)
+  END DO
+END IF
+!
+! Lagrangian variables
+IF (LTRAJ) THEN
+  DO JSV = NSV_LGBEG, NSV_LGEND
+    TZFIELD = TSVLIST(JSV)
+    WRITE(TZFIELD%CCOMMENT,'(A6,A20,I3.3,A4)')'X_Y_Z_','Lagrangian variable ',JSV
+    CALL IO_Field_write(TPFILE,TZFIELD,XSVT(:,:,:,JSV))
+  END DO
+
+  ! X coordinate
+  DO JK=1,IKU
+    DO JJ=1,IJU
+      ZWORK31(:,JJ,JK) = 1E-3*XXHATM(:)
+    END DO
+  END DO
+
+  TZFIELD = TFIELDMETADATA(            &
+    CMNHNAME   = 'X',                  &
+    CSTDNAME   = '',                   &
+    CLONGNAME  = 'X',                  &
+    CUNITS     = 'km',                 &
+    CDIR       = 'XY',                 &
+    CCOMMENT   = 'X_Y_Z_X coordinate', &
+    NGRID      = 1,                    &
+    NTYPE      = TYPEREAL,             &
+    NDIMS      = 3,                    &
+    LTIMEDEP   = .TRUE.                )
+
+  CALL IO_Field_write(TPFILE,TZFIELD,ZWORK31)
+
+  ! Y coordinate
+  DO JK=1,IKU
+    DO JI=1,IIU
+      ZWORK31(JI,:,JK) = 1E-3 * XYHATM(:)
+    END DO
+  END DO
+
+  TZFIELD%CMNHNAME   = 'Y'
+  TZFIELD%CLONGNAME  = 'Y'
+  TZFIELD%CCOMMENT   = 'X_Y_Z_Y coordinate'
+
+  CALL IO_Field_write(TPFILE,TZFIELD,ZWORK31)
+END IF
+!
+! Passive polluant scalar variables
+IF (LPASPOL) THEN
+  ALLOCATE(ZRHOT( SIZE(XTHT,1), SIZE(XTHT,2),SIZE(XTHT,3)))
+  ALLOCATE(ZTMP(  SIZE(XTHT,1), SIZE(XTHT,2),SIZE(XTHT,3)))
+!
+!* Density
+!
+  ZRHOT(:,:,:)=XPABST(:,:,:)/(XRD*XTHT(:,:,:)*((XPABST(:,:,:)/XP00)**(XRD/XCPD)))
+!
+!* Conversion g/m3.
+!
+  ZRHOT(:,:,:)=ZRHOT(:,:,:)*1000.0
+  !
+  DO JSV = NSV_PPBEG, NSV_PPEND
+    TZFIELD = TSVLIST(JSV)
+    TZFIELD%CUNITS     = 'g m-3'
+
+    ZTMP(:,:,:)=ABS( XSVT(:,:,:,JSV)*ZRHOT(:,:,:) )
+    CALL IO_Field_write(TPFILE,TZFIELD,ZTMP)
+  END DO
+
+  DEALLOCATE(ZTMP)
+  DEALLOCATE(ZRHOT)
+END IF
+! Conditional sampling variables
+IF (LCONDSAMP) THEN
+  DO JSV = NSV_CSBEG, NSV_CSEND
+    TZFIELD = TSVLIST(JSV)
+    CALL IO_Field_write(TPFILE,TZFIELD,XSVT(:,:,:,JSV))
+  END DO
+END IF
+! chemical scalar variables in gas phase ppb
+IF (LCHEMDIAG) THEN
+  DO JSV = NSV_CHGSBEG,NSV_CHGSEND
+    TZFIELD = TSVLIST(JSV)
+    TZFIELD%CUNITS    = 'ppb'
+    WRITE(TZFIELD%CCOMMENT,'(A6,A4,I3.3)')'X_Y_Z_','CHIM',JSV
+    CALL IO_Field_write(TPFILE,TZFIELD,XSVT(:,:,:,JSV)*1.E9)
+  END DO
+END IF
+IF (LCHAQDIAG) THEN    !aqueous concentration in M
+  ZWORK31(:,:,:)=0.
+  DO JSV = NSV_CHACBEG, NSV_CHACBEG-1+NEQAQ/2   !cloud water
+    TZFIELD = TSVLIST(JSV)
+    TZFIELD%CUNITS    = 'mol l-1' !Original value: 'M' (molar) but not known by udunits => replaced by equivalent mol l-1
+    WRITE(TZFIELD%CCOMMENT,'(A6,A4,I3.3)')'X_Y_Z_','CHAQ',JSV
+    WHERE(((XRT(:,:,:,2)*XRHODREF(:,:,:))/1.e3) .GE. XRTMIN_AQ)
+      ZWORK31(:,:,:)=(XSVT(:,:,:,JSV)*1000.)/(XMD*1.E+3*XRT(:,:,:,2))
+    ENDWHERE
+    CALL IO_Field_write(TPFILE,TZFIELD,ZWORK31)
+  END DO
+  !
+  ZWORK31(:,:,:)=0.
+  DO JSV = NSV_CHACBEG+NEQAQ/2, NSV_CHACEND    !rain water
+    TZFIELD = TSVLIST(JSV)
+    TZFIELD%CUNITS    = 'mol l-1' !Original value: 'M' (molar) but not known by udunits => replaced by equivalent mol l-1
+    WRITE(TZFIELD%CCOMMENT,'(A6,A4,I3.3)')'X_Y_Z_','CHAQ',JSV
+    WHERE(((XRT(:,:,:,3)*XRHODREF(:,:,:))/1.e3) .GE. XRTMIN_AQ)
+      ZWORK31(:,:,:)=(XSVT(:,:,:,JSV)*1000.)/(XMD*1.E+3*XRT(:,:,:,3))
+    ENDWHERE
+    CALL IO_Field_write(TPFILE,TZFIELD,ZWORK31)
+  END DO
+
+
+
+
+!  ZWORK31(:,:,:)=0.
+!  DO JSV = NSV_CHICBEG,NSV_CHICEND   ! ice phase
+!    TZFIELD%CMNHNAME   = TRIM(CICNAMES(JSV-NSV_CHICBEG+1))
+!    TZFIELD%CLONGNAME  = TRIM(TZFIELD%CMNHNAME)
+!    WRITE(TZFIELD%CCOMMENT,'(A6,A4,I3.3,A4)')'X_Y_Z_','CHIC',JSV,' (M)'
+!    WHERE(((XRT(:,:,:,3)*XRHODREF(:,:,:))/1.e3) .GE. XRTMIN_AQ)
+!      ZWORK31(:,:,:)=(XSVT(:,:,:,JSV)*1000.)/(XMD*1.E+3*XRT(:,:,:,3))
+!    ENDWHERE
+!    CALL IO_Field_write(TPFILE,TZFIELD,ZWORK31)
+!  END DO
+END IF
+! Aerosol
+IF ((LCHEMDIAG).AND.(LORILAM).AND.(LUSECHEM)) THEN
+  DO JSV = NSV_AERBEG, NSV_AEREND
+    TZFIELD = TSVLIST(JSV)
+    TZFIELD%CUNITS    = 'ppb'
+    WRITE(TZFIELD%CCOMMENT,'(A6,A4,I3.3)')'X_Y_Z_','AERO',JSV
+    CALL IO_Field_write(TPFILE,TZFIELD,XSVT(:,:,:,JSV)*1.E9)
+  END DO
+  !
+  IF (.NOT.(ASSOCIATED(XN3D)))   &
+    ALLOCATE(XN3D(SIZE(XSVT,1),SIZE(XSVT,2),SIZE(XSVT,3),JPMODE))
+  IF (.NOT.(ASSOCIATED(XRG3D)))  &
+    ALLOCATE(XRG3D(SIZE(XSVT,1),SIZE(XSVT,2),SIZE(XSVT,3),JPMODE))
+  IF (.NOT.(ASSOCIATED(XSIG3D))) &
+    ALLOCATE(XSIG3D(SIZE(XSVT,1),SIZE(XSVT,2),SIZE(XSVT,3),JPMODE))
+  !
+  IF (CRGUNIT=="MASS") THEN
+  XRG3D(:,:,:,1) = XINIRADIUSI * EXP(-3.*(LOG(XINISIGI))**2)
+  XRG3D(:,:,:,2) = XINIRADIUSJ * EXP(-3.*(LOG(XINISIGJ))**2)
+  ELSE
+  XRG3D(:,:,:,1) = XINIRADIUSI
+  XRG3D(:,:,:,2) = XINIRADIUSJ
+  END IF
+  XSIG3D(:,:,:,1) = XINISIGI
+  XSIG3D(:,:,:,2) = XINISIGJ
+  XN3D(:,:,:,1) = XN0IMIN
+  XN3D(:,:,:,2) = XN0JMIN
+  
+  ZPTOTA(:,:,:,:,:) = 0.
+
+  CALL  PPP2AERO(XSVT(IIB:IIE,IJB:IJE,IKB:IKE,NSV_AERBEG:NSV_AEREND),&
+                 XRHODREF(IIB:IIE,IJB:IJE,IKB:IKE), &
+                 PSIG3D=XSIG3D(IIB:IIE,IJB:IJE,IKB:IKE,:),&
+                 PRG3D=XRG3D(IIB:IIE,IJB:IJE,IKB:IKE,:),&
+                 PN3D=XN3D(IIB:IIE,IJB:IJE,IKB:IKE,:),& 
+                 PCTOTA=ZPTOTA(IIB:IIE,IJB:IJE,IKB:IKE,:,:))
+
+  TZFIELD = TFIELDMETADATA(                   &
+    CMNHNAME   = 'generic for aerosol modes', &
+    CSTDNAME   = '',                          &
+    CDIR       = 'XY',                        &
+    NGRID      = 1,                           &
+    NTYPE      = TYPEREAL,                    &
+    NDIMS      = 3,                           &
+    LTIMEDEP   = .TRUE.                       )
+
+  DO JJ=1,JPMODE
+    WRITE(TZFIELD%CMNHNAME,'(A3,I1)')'RGA',JJ
+    TZFIELD%CLONGNAME  = TRIM(TZFIELD%CMNHNAME)
+    TZFIELD%CUNITS     = 'um'
+    WRITE(TZFIELD%CCOMMENT,'(A21,I1)')'RG (nb) AEROSOL MODE ',JJ
+    CALL IO_Field_write(TPFILE,TZFIELD,XRG3D(:,:,:,JJ))
+    !
+    WRITE(TZFIELD%CMNHNAME,'(A4,I1)')'RGAM',JJ
+    TZFIELD%CLONGNAME  = TRIM(TZFIELD%CMNHNAME)
+    TZFIELD%CUNITS     = 'um'
+    WRITE(TZFIELD%CCOMMENT,'(A20,I1)')'RG (m) AEROSOL MODE ',JJ
+    ZWORK31(:,:,:)=XRG3D(:,:,:,JJ) / (EXP(-3.*(LOG(XSIG3D(:,:,:,JJ)))**2))
+    CALL IO_Field_write(TPFILE,TZFIELD,ZWORK31)
+    !
+    WRITE(TZFIELD%CMNHNAME,'(A3,I1)')'N0A',JJ
+    TZFIELD%CLONGNAME  = TRIM(TZFIELD%CMNHNAME)
+    TZFIELD%CUNITS     = 'cm-3'
+    WRITE(TZFIELD%CCOMMENT,'(A16,I1)')'N0 AEROSOL MODE ',JJ
+    CALL IO_Field_write(TPFILE,TZFIELD,XN3D(:,:,:,JJ)*1.E-6)
+    !
+    WRITE(TZFIELD%CMNHNAME,'(A4,I1)')'SIGA',JJ
+    TZFIELD%CLONGNAME  = TRIM(TZFIELD%CMNHNAME)
+    TZFIELD%CUNITS     = '1'
+    WRITE(TZFIELD%CCOMMENT,'(A19,I1)')'SIGMA AEROSOL MODE ',JJ
+    CALL IO_Field_write(TPFILE,TZFIELD,XSIG3D(:,:,:,JJ))
+    !
+    WRITE(TZFIELD%CMNHNAME,'(A4,I1)')'MSO4',JJ
+    TZFIELD%CLONGNAME  = TRIM(TZFIELD%CMNHNAME)
+    TZFIELD%CUNITS     = 'ug m-3'
+    WRITE(TZFIELD%CCOMMENT,'(A22,I1)')'MASS SO4 AEROSOL MODE ',JJ
+    CALL IO_Field_write(TPFILE,TZFIELD,ZPTOTA(:,:,:,JP_AER_SO4,JJ))
+    !
+    WRITE(TZFIELD%CMNHNAME,'(A4,I1)')'MNO3',JJ
+    TZFIELD%CLONGNAME  = TRIM(TZFIELD%CMNHNAME)
+    TZFIELD%CUNITS     = 'ug m-3'
+    WRITE(TZFIELD%CCOMMENT,'(A22,I1)')'MASS NO3 AEROSOL MODE ',JJ
+    CALL IO_Field_write(TPFILE,TZFIELD,ZPTOTA(:,:,:,JP_AER_NO3,JJ))
+    !
+    WRITE(TZFIELD%CMNHNAME,'(A4,I1)')'MNH3',JJ
+    TZFIELD%CLONGNAME  = TRIM(TZFIELD%CMNHNAME)
+    TZFIELD%CUNITS     = 'ug m-3'
+    WRITE(TZFIELD%CCOMMENT,'(A22,I1)')'MASS NH3 AEROSOL MODE ',JJ
+    CALL IO_Field_write(TPFILE,TZFIELD,ZPTOTA(:,:,:,JP_AER_NH3,JJ))
+    !
+    WRITE(TZFIELD%CMNHNAME,'(A4,I1)')'MH2O',JJ
+    TZFIELD%CLONGNAME  = TRIM(TZFIELD%CMNHNAME)
+    TZFIELD%CUNITS     = 'ug m-3'
+    WRITE(TZFIELD%CCOMMENT,'(A22,I1)')'MASS H2O AEROSOL MODE ',JJ
+    CALL IO_Field_write(TPFILE,TZFIELD,ZPTOTA(:,:,:,JP_AER_H2O,JJ))
+    !
+    IF (NSOA .EQ. 10) THEN
+      WRITE(TZFIELD%CMNHNAME,'(A5,I1)')'MSOA1',JJ
+      TZFIELD%CLONGNAME  = TRIM(TZFIELD%CMNHNAME)
+      TZFIELD%CUNITS     = 'ug m-3'
+      WRITE(TZFIELD%CCOMMENT,'(A23,I1)')'MASS SOA1 AEROSOL MODE ',JJ
+      CALL IO_Field_write(TPFILE,TZFIELD,ZPTOTA(:,:,:,JP_AER_SOA1,JJ))
+      !
+      WRITE(TZFIELD%CMNHNAME,'(A5,I1)')'MSOA2',JJ
+      TZFIELD%CLONGNAME  = TRIM(TZFIELD%CMNHNAME)
+      TZFIELD%CUNITS     = 'ug m-3'
+      WRITE(TZFIELD%CCOMMENT,'(A23,I1)')'MASS SOA2 AEROSOL MODE ',JJ
+      CALL IO_Field_write(TPFILE,TZFIELD,ZPTOTA(:,:,:,JP_AER_SOA2,JJ))
+      !
+      WRITE(TZFIELD%CMNHNAME,'(A5,I1)')'MSOA3',JJ
+      TZFIELD%CLONGNAME  = TRIM(TZFIELD%CMNHNAME)
+      TZFIELD%CUNITS     = 'ug m-3'
+      WRITE(TZFIELD%CCOMMENT,'(A23,I1)')'MASS SOA3 AEROSOL MODE ',JJ
+      CALL IO_Field_write(TPFILE,TZFIELD,ZPTOTA(:,:,:,JP_AER_SOA3,JJ))
+      !
+      WRITE(TZFIELD%CMNHNAME,'(A5,I1)')'MSOA4',JJ
+      TZFIELD%CLONGNAME  = TRIM(TZFIELD%CMNHNAME)
+      TZFIELD%CUNITS     = 'ug m-3'
+      WRITE(TZFIELD%CCOMMENT,'(A23,I1)')'MASS SOA4 AEROSOL MODE ',JJ
+      CALL IO_Field_write(TPFILE,TZFIELD,ZPTOTA(:,:,:,JP_AER_SOA4,JJ))
+      !
+      WRITE(TZFIELD%CMNHNAME,'(A5,I1)')'MSOA5',JJ
+      TZFIELD%CLONGNAME  = TRIM(TZFIELD%CMNHNAME)
+      TZFIELD%CUNITS     = 'ug m-3'
+      WRITE(TZFIELD%CCOMMENT,'(A23,I1)')'MASS SOA5 AEROSOL MODE ',JJ
+      CALL IO_Field_write(TPFILE,TZFIELD,ZPTOTA(:,:,:,JP_AER_SOA5,JJ))
+      !
+      WRITE(TZFIELD%CMNHNAME,'(A5,I1)')'MSOA6',JJ
+      TZFIELD%CLONGNAME  = TRIM(TZFIELD%CMNHNAME)
+      TZFIELD%CUNITS     = 'ug m-3'
+      WRITE(TZFIELD%CCOMMENT,'(A23,I1)')'MASS SOA6 AEROSOL MODE ',JJ
+      CALL IO_Field_write(TPFILE,TZFIELD,ZPTOTA(:,:,:,JP_AER_SOA6,JJ))
+      !
+      WRITE(TZFIELD%CMNHNAME,'(A5,I1)')'MSOA7',JJ
+      TZFIELD%CLONGNAME  = TRIM(TZFIELD%CMNHNAME)
+      TZFIELD%CUNITS     = 'ug m-3'
+      WRITE(TZFIELD%CCOMMENT,'(A23,I1)')'MASS SOA7 AEROSOL MODE ',JJ
+      CALL IO_Field_write(TPFILE,TZFIELD,ZPTOTA(:,:,:,JP_AER_SOA7,JJ))
+      !
+      WRITE(TZFIELD%CMNHNAME,'(A5,I1)')'MSOA8',JJ
+      TZFIELD%CLONGNAME  = TRIM(TZFIELD%CMNHNAME)
+      TZFIELD%CUNITS     = 'ug m-3'
+      WRITE(TZFIELD%CCOMMENT,'(A23,I1)')'MASS SOA8 AEROSOL MODE ',JJ
+      CALL IO_Field_write(TPFILE,TZFIELD,ZPTOTA(:,:,:,JP_AER_SOA8,JJ))
+      !
+      WRITE(TZFIELD%CMNHNAME,'(A5,I1)')'MSOA9',JJ
+      TZFIELD%CLONGNAME  = TRIM(TZFIELD%CMNHNAME)
+      TZFIELD%CUNITS     = 'ug m-3'
+      WRITE(TZFIELD%CCOMMENT,'(A23,I1)')'MASS SOA9 AEROSOL MODE ',JJ
+      CALL IO_Field_write(TPFILE,TZFIELD,ZPTOTA(:,:,:,JP_AER_SOA9,JJ))
+      !
+      WRITE(TZFIELD%CMNHNAME,'(A6,I1)')'MSOA10',JJ
+      TZFIELD%CLONGNAME  = TRIM(TZFIELD%CMNHNAME)
+      TZFIELD%CUNITS     = 'ug m-3'
+      WRITE(TZFIELD%CCOMMENT,'(A24,I1)')'MASS SOA10 AEROSOL MODE ',JJ
+      CALL IO_Field_write(TPFILE,TZFIELD,ZPTOTA(:,:,:,JP_AER_SOA10,JJ))
+    END IF
+    !
+    WRITE(TZFIELD%CMNHNAME,'(A3,I1)')'MOC',JJ
+    TZFIELD%CLONGNAME  = TRIM(TZFIELD%CMNHNAME)
+    TZFIELD%CUNITS     = 'ug m-3'
+    WRITE(TZFIELD%CCOMMENT,'(A21,I1)')'MASS OC AEROSOL MODE ',JJ
+    CALL IO_Field_write(TPFILE,TZFIELD,ZPTOTA(:,:,:,JP_AER_OC,JJ))
+    !
+    WRITE(TZFIELD%CMNHNAME,'(A3,I1)')'MBC',JJ
+    TZFIELD%CLONGNAME  = TRIM(TZFIELD%CMNHNAME)
+    TZFIELD%CUNITS     = 'ug m-3'
+    WRITE(TZFIELD%CCOMMENT,'(A21,I1)')'MASS BC AEROSOL MODE ',JJ
+    CALL IO_Field_write(TPFILE,TZFIELD,ZPTOTA(:,:,:,JP_AER_BC,JJ))
+  ENDDO
+END IF
+! Dust variables
+IF (LDUST) THEN
+  IF(.NOT.ALLOCATED(ZSIG_DST)) &
+    ALLOCATE(ZSIG_DST(SIZE(XSVT,1), SIZE(XSVT,2), SIZE(XSVT,3), NMODE_DST))
+  IF(.NOT.ALLOCATED(ZRG_DST))  &
+    ALLOCATE(ZRG_DST(SIZE(XSVT,1), SIZE(XSVT,2), SIZE(XSVT,3), NMODE_DST))
+  IF(.NOT.ALLOCATED(ZN0_DST))  &
+    ALLOCATE(ZN0_DST(SIZE(XSVT,1), SIZE(XSVT,2), SIZE(XSVT,3), NMODE_DST))
+  !
+  DO JSV = NSV_DSTBEG, NSV_DSTEND
+    TZFIELD = TSVLIST(JSV)
+    TZFIELD%CUNITS    = 'ppb'
+    WRITE(TZFIELD%CCOMMENT,'(A6,A4,I3.3)')'X_Y_Z_','DUST',JSV
+    CALL IO_Field_write(TPFILE,TZFIELD,XSVT(:,:,:,JSV)*1.E9)
+  END DO
+  !
+  CALL PPP2DUST(XSVT(:,:,:,NSV_DSTBEG:NSV_DSTEND),XRHODREF,&
+               PSIG3D=ZSIG_DST, PRG3D=ZRG_DST, PN3D=ZN0_DST)
+
+  TZFIELD = TFIELDMETADATA(                &
+    CMNHNAME   = 'generic for dust modes', &
+    CSTDNAME   = '',                       &
+    CDIR       = 'XY',                     &
+    NGRID      = 1,                        &
+    NTYPE      = TYPEREAL,                 &
+    NDIMS      = 3,                        &
+    LTIMEDEP   = .TRUE.                    )
+
+  TZFIELD2D = TFIELDMETADATA(              &
+    CMNHNAME   = 'generic for dust modes', &
+    CSTDNAME   = '',                       &
+    CDIR       = 'XY',                     &
+    NGRID      = 1,                        &
+    NTYPE      = TYPEREAL,                 &
+    NDIMS      = 2,                        &
+    LTIMEDEP   = .TRUE.                    )
+
+  DO JJ=1,NMODE_DST
+    WRITE(TZFIELD%CMNHNAME,'(A6,I1)')'DSTRGA',JJ
+    TZFIELD%CLONGNAME  = TRIM(TZFIELD%CMNHNAME)
+    TZFIELD%CUNITS     = 'um'
+    WRITE(TZFIELD%CCOMMENT,'(A18,I1)')'RG (nb) DUST MODE ',JJ
+    CALL IO_Field_write(TPFILE,TZFIELD,ZRG_DST(:,:,:,JJ))
+    !
+    WRITE(TZFIELD%CMNHNAME,'(A7,I1)')'DSTRGAM',JJ
+    TZFIELD%CLONGNAME  = TRIM(TZFIELD%CMNHNAME)
+    TZFIELD%CUNITS     = 'um'
+    WRITE(TZFIELD%CCOMMENT,'(A17,I1)')'RG (m) DUST MODE ',JJ
+    ZWORK31(:,:,:)=ZRG_DST(:,:,:,JJ) / (EXP(-3.*(LOG(ZSIG_DST(:,:,:,JJ)))**2))
+    CALL IO_Field_write(TPFILE,TZFIELD,ZWORK31)
+    !
+    WRITE(TZFIELD%CMNHNAME,'(A6,I1)')'DSTN0A',JJ
+    TZFIELD%CLONGNAME  = TRIM(TZFIELD%CMNHNAME)
+    TZFIELD%CUNITS     = 'm-3'
+    WRITE(TZFIELD%CCOMMENT,'(A13,I1)')'N0 DUST MODE ',JJ
+    CALL IO_Field_write(TPFILE,TZFIELD,ZN0_DST(:,:,:,JJ))
+    !
+    WRITE(TZFIELD%CMNHNAME,'(A7,I1)')'DSTSIGA',JJ
+    TZFIELD%CLONGNAME  = TRIM(TZFIELD%CMNHNAME)
+    TZFIELD%CUNITS     = '1'
+    WRITE(TZFIELD%CCOMMENT,'(A16,I1)')'SIGMA DUST MODE ',JJ
+    CALL IO_Field_write(TPFILE,TZFIELD,ZSIG_DST(:,:,:,JJ))
+    !DUST MASS CONCENTRATION
+    WRITE(TZFIELD%CMNHNAME,'(A4,I1)')'DSTMSS',JJ
+    TZFIELD%CLONGNAME  = TRIM(TZFIELD%CMNHNAME)
+    TZFIELD%CUNITS     = 'ug m-3'
+    WRITE(TZFIELD%CCOMMENT,'(A14,I1)')'MASSCONC MODE ',JJ
+    ZWORK31(:,:,:)= ZN0_DST(:,:,:,JJ)*4./3.*3.14*2500.*1e9 & !kg-->ug
+       * (ZRG_DST(:,:,:,JJ)**3)*1.d-18 &  !um-->m
+       * exp(4.5*log(ZSIG_DST(:,:,:,JJ))*log(ZSIG_DST(:,:,:,JJ)))
+    CALL IO_Field_write(TPFILE,TZFIELD,ZWORK31)
+    !DUST BURDEN (g/m2)
+    ZWORK21(:,:)=0.0
+    DO JK=IKB,IKE
+      ZWORK31(:,:,JK) = ZWORK31(:,:,JK) *(XZZ(:,:,JK+1)-XZZ(:,:,JK))      &
+                       *1.d-6 ! Convert to ug/m2-->g/m2 in each layer
+    END DO
+    !
+    DO JK=IKB,IKE
+      DO JT=IJB,IJE
+        DO JI=IIB,IIE
+           ZWORK21(JI,JT)=ZWORK21(JI,JT)+ZWORK31(JI,JT,JK)
+        ENDDO
+      ENDDO
+    ENDDO
+    WRITE(TZFIELD2D%CMNHNAME,'(A7,I1)')'DSTBRDN',JJ
+    TZFIELD2D%CLONGNAME  = TRIM(TZFIELD2D%CMNHNAME)
+    TZFIELD2D%CUNITS     = 'g m-2'
+    WRITE(TZFIELD2D%CCOMMENT,'(A6,I1)')'BURDEN',JJ
+    CALL IO_Field_write(TPFILE,TZFIELD2D,ZWORK21)
+  ENDDO
+END IF
+IF (LDUST.AND.LDEPOS_DST(IMI)) THEN
+  DO JSV = NSV_DSTBEG, NSV_DSTEND
+    TZFIELD = TSVLIST(JSV)
+    TZFIELD%CUNITS    = 'ppb'
+    WRITE(TZFIELD%CCOMMENT,'(A,I3.3)') 'X_Y_Z_DUSTDEP', JSV
+    CALL IO_Field_write(TPFILE,TZFIELD,XSVT(:,:,:,JSV)*1.E9)
+  END DO
+  !
+  ZSDSTDEP => XSVT(:,:,:,NSV_DSTDEPBEG:NSV_DSTDEPEND)
+  !
+  TZFIELD = TFIELDMETADATA(                   &
+    CMNHNAME   = 'generic for dustdep modes', &
+    CSTDNAME   = '',                          &
+    CDIR       = 'XY',                        &
+    NGRID      = 1,                           &
+    NTYPE      = TYPEREAL,                    &
+    NDIMS      = 3,                           &
+    LTIMEDEP   = .TRUE.                       )
+  !
+  DO JJ=1,NMODE_DST
+    ! FOR CLOUDS
+    WRITE(TZFIELD%CMNHNAME,'(A9,I1)')'DSTDEPN0A',JJ
+    TZFIELD%CLONGNAME  = TRIM(TZFIELD%CMNHNAME)
+    WRITE(TZFIELD%CCOMMENT,'(A16,I1)')'N0 DUSTDEP MODE ',JJ
+    TZFIELD%CUNITS     = 'm-3'
+    ! CLOUD: CALCULATE MOMENT 3 FROM TOTAL AEROSOL MASS
+    ZWORK31(:,:,:) = ZSDSTDEP(:,:,:,JJ)         &!==>molec_{aer}/molec_{air}
+                     *(XMOLARWEIGHT_DUST/XMD)   &!==>kg_{aer}/kg_{air}
+                     *XRHODREF(:,:,:)           &!==>kg_{aer}/m3_{air}
+                     /XDENSITY_DUST             &!==>m3_{aer}/m3_{air}
+                     *XM3TOUM3                  &!==>um3_{aer}/m3_{air}
+                     /(XPI*4./3.)                !==>um3_{aer}/m3_{air}
+            !==>volume 3rd moment
+    !CLOUD: CALCULATE MOMENT 0 FROM DISPERSION AND MEAN RADIUS
+    ZWORK31(:,:,:)=  ZWORK31(:,:,:)/      &
+                    ((ZRG_DST(:,:,:,JJ)**3)*      &
+                    EXP(4.5 * LOG(ZSIG_DST(:,:,:,JJ))**2))
+    !CLOUD: RETURN TO CONCENTRATION #/m3
+    ZWORK31(:,:,:)= ZWORK31(:,:,:) *   XMD/ &
+                     (XAVOGADRO*XRHODREF(:,:,:))
+    !CLOUD:  Get number concentration (#/molec_{air}==>#/m3)
+    ZWORK31(:,:,:)=                         &
+                    ZWORK31(:,:,:)                  & !#/molec_{air}
+                    * XAVOGADRO                     & !==>#/mole
+                    / XMD                           & !==>#/kg_{air}
+                    * XRHODREF(:,:,:)                 !==>#/m3
+    CALL IO_Field_write(TPFILE,TZFIELD,ZWORK31)
+    ! CLOUD:   DUST MASS CONCENTRATION
+    WRITE(TZFIELD%CMNHNAME,'(A9,I1)')'DSTDEPMSS',JJ
+    TZFIELD%CLONGNAME  = TRIM(TZFIELD%CMNHNAME)
+    WRITE(TZFIELD%CCOMMENT,'(A17,I1)')'DEPMASSCONC MODE ',JJ
+    TZFIELD%CUNITS     = 'ug m-3'
+    ZWORK31(:,:,:)= ZWORK31(:,:,:)*4./3.*3.14*2500.*1e9 & !kg-->ug
+          * (ZRG_DST(:,:,:,JJ)**3)*1.d-18               &  !um-->m
+          * exp(4.5*log(ZSIG_DST(:,:,:,JJ))*log(ZSIG_DST(:,:,:,JJ)))
+    CALL IO_Field_write(TPFILE,TZFIELD,ZWORK31)
+    !   FOR RAIN DROPS
+    WRITE(TZFIELD%CMNHNAME,'(A9,I1)')'DSTDEPN0A',JJ+NMODE_DST
+    TZFIELD%CLONGNAME  = TRIM(TZFIELD%CMNHNAME)
+    WRITE(TZFIELD%CCOMMENT,'(A16,I1)')'N0 DUSTDEP MODE ',JJ+NMODE_DST
+    TZFIELD%CUNITS     = 'm-3'
+    ! RAIN: CALCULATE MOMENT 3 FROM TOTAL AEROSOL MASS
+    ZWORK31(:,:,:)=ZSDSTDEP(:,:,:,JJ+NMODE_DST)  &!==>molec_{aer}/molec_{air}
+            *(XMOLARWEIGHT_DUST/XMD)             &!==>kg_{aer}/kg_{air}
+            *XRHODREF(:,:,:)                     &!==>kg_{aer}/m3_{air}
+            *(1.d0/XDENSITY_DUST)                &!==>m3_{aer}/m3_{air}
+            *XM3TOUM3                            &!==>um3_{aer}/m3_{air}
+            /(XPI*4./3.)                          !==>um3_{aer}/m3_{air}
+            !==>volume 3rd moment
+    !RAIN: CALCULATE MOMENT 0 FROM DISPERSION AND MEAN RADIUS
+    ZWORK31(:,:,:)= ZWORK31(:,:,:)/                 &
+             ((ZRG_DST(:,:,:,JJ)**3)*               &
+              EXP(4.5 * LOG(ZSIG_DST(:,:,:,JJ))**2))
+    !RAIN: RETURN TO CONCENTRATION #/m3
+    ZWORK31(:,:,:)= ZWORK31(:,:,:) *   XMD/ &
+                    (XAVOGADRO*XRHODREF(:,:,:))
+    !RAIN: Get number concentration (#/molec_{air}==>#/m3)
+    ZWORK31(:,:,:)=                   &
+                    ZWORK31(:,:,:)    & !#/molec_{air}
+                    * XAVOGADRO       & !==>#/mole
+                    / XMD             & !==>#/kg_{air}
+                    * XRHODREF(:,:,:)   !==>#/m3
+    CALL IO_Field_write(TPFILE,TZFIELD,ZWORK31)
+    ! RAIN:   DUST MASS CONCENTRATION
+    WRITE(TZFIELD%CMNHNAME,'(A9,I1)')'DSTDEPMSS',JJ+NMODE_DST
+    TZFIELD%CLONGNAME  = TRIM(TZFIELD%CMNHNAME)
+    WRITE(TZFIELD%CCOMMENT,'(A17,I1)')'DEPMASSCONC MODE ',JJ+NMODE_DST
+    TZFIELD%CUNITS     = 'ug m-3'
+    ZWORK31(:,:,:)= ZWORK31(:,:,:)*4./3.*3.14*2500.*1e9 & !kg-->ug
+                    * (ZRG_DST(:,:,:,JJ)**3)*1.d-18     &  !um-->m
+                    * exp(4.5*log(ZSIG_DST(:,:,:,JJ))*log(ZSIG_DST(:,:,:,JJ)))
+    CALL IO_Field_write(TPFILE,TZFIELD,ZWORK31)
+  END DO
+
+  ZSDSTDEP => NULL()
+!
+END IF
+! Sea Salt variables
+IF (LSALT) THEN
+  IF(.NOT.ALLOCATED(ZSIG_SLT)) &
+    ALLOCATE(ZSIG_SLT(SIZE(XSVT,1), SIZE(XSVT,2), SIZE(XSVT,3), NMODE_SLT))
+  IF(.NOT.ALLOCATED(ZRG_SLT))  &
+    ALLOCATE(ZRG_SLT(SIZE(XSVT,1), SIZE(XSVT,2), SIZE(XSVT,3), NMODE_SLT))
+  IF(.NOT.ALLOCATED(ZN0_SLT))  &
+    ALLOCATE(ZN0_SLT(SIZE(XSVT,1), SIZE(XSVT,2), SIZE(XSVT,3), NMODE_SLT))
+  !
+  DO JSV = NSV_SLTBEG, NSV_SLTEND
+    TZFIELD = TSVLIST(JSV)
+    TZFIELD%CUNITS    = 'ppb'
+    WRITE(TZFIELD%CCOMMENT,'(A,I3.3)') 'X_Y_Z_SALT', JSV
+    CALL IO_Field_write(TPFILE,TZFIELD,XSVT(:,:,:,JSV)*1.E9)
+  END DO
+  !
+  CALL PPP2SALT(XSVT(:,:,:,NSV_SLTBEG:NSV_SLTEND),XRHODREF,&
+               PSIG3D=ZSIG_SLT, PRG3D=ZRG_SLT, PN3D=ZN0_SLT)
+  !
+  TZFIELD = TFIELDMETADATA(                &
+    CMNHNAME   = 'generic for salt modes', &
+    CSTDNAME   = '',                       &
+    CDIR       = 'XY',                     &
+    NGRID      = 1,                        &
+    NTYPE      = TYPEREAL,                 &
+    NDIMS      = 3,                        &
+    LTIMEDEP   = .TRUE.                    )
+  !
+  TZFIELD2D = TFIELDMETADATA(              &
+    CMNHNAME   = 'generic for salt modes', &
+    CSTDNAME   = '',                       &
+    CDIR       = 'XY',                     &
+    NGRID      = 1,                        &
+    NTYPE      = TYPEREAL,                 &
+    NDIMS      = 2,                        &
+    LTIMEDEP   = .TRUE.                    )
+  !
+  DO JJ=1,NMODE_SLT
+    WRITE(TZFIELD%CMNHNAME,'(A6,I1)')'SLTRGA',JJ
+    TZFIELD%CLONGNAME  = TRIM(TZFIELD%CMNHNAME)
+    TZFIELD%CUNITS     = 'um'
+    WRITE(TZFIELD%CCOMMENT,'(A18,I1)')'RG (nb) SALT MODE ',JJ
+    CALL IO_Field_write(TPFILE,TZFIELD,ZRG_SLT(:,:,:,JJ))
+    !
+    WRITE(TZFIELD%CMNHNAME,'(A7,I1)')'SLTRGAM',JJ
+    TZFIELD%CLONGNAME  = TRIM(TZFIELD%CMNHNAME)
+    TZFIELD%CUNITS     = 'um'
+    WRITE(TZFIELD%CCOMMENT,'(A17,I1)')'RG (m) SALT MODE ',JJ
+    ZWORK31(:,:,:)=ZRG_SLT(:,:,:,JJ) / (EXP(-3.*(LOG(ZSIG_SLT(:,:,:,JJ)))**2))
+    CALL IO_Field_write(TPFILE,TZFIELD,ZWORK31)
+    !
+    WRITE(TZFIELD%CMNHNAME,'(A6,I1)')'SLTN0A',JJ
+    TZFIELD%CLONGNAME  = TRIM(TZFIELD%CMNHNAME)
+    TZFIELD%CUNITS     = 'm-3'
+    WRITE(TZFIELD%CCOMMENT,'(A13,I1)')'N0 SALT MODE ',JJ
+    CALL IO_Field_write(TPFILE,TZFIELD,ZN0_SLT(:,:,:,JJ))
+    !
+    WRITE(TZFIELD%CMNHNAME,'(A7,I1)')'SLTSIGA',JJ
+    TZFIELD%CLONGNAME  = TRIM(TZFIELD%CMNHNAME)
+    TZFIELD%CUNITS     = '1'
+    WRITE(TZFIELD%CCOMMENT,'(A16,I1)')'SIGMA SALT MODE ',JJ
+    CALL IO_Field_write(TPFILE,TZFIELD,ZSIG_SLT(:,:,:,JJ))
+    !SALT MASS CONCENTRATION
+    WRITE(TZFIELD%CMNHNAME,'(A4,I1)')'SLTMSS',JJ
+    TZFIELD%CLONGNAME  = TRIM(TZFIELD%CMNHNAME)
+    TZFIELD%CUNITS     = 'ug m-3'
+    WRITE(TZFIELD%CCOMMENT,'(A14,I1)')'MASSCONC MODE ',JJ
+    ZWORK31(:,:,:)= ZN0_SLT(:,:,:,JJ)*4./3.*3.14*2500.*1e9 & !kg-->ug
+       * (ZRG_SLT(:,:,:,JJ)**3)*1.d-18 &  !um-->m
+       * exp(4.5*log(ZSIG_SLT(:,:,:,JJ))*log(ZSIG_SLT(:,:,:,JJ)))
+    CALL IO_Field_write(TPFILE,TZFIELD,ZWORK31)
+    !SALT BURDEN (g/m2)
+    ZWORK21(:,:)=0.0
+    DO JK=IKB,IKE
+      ZWORK31(:,:,JK) = ZWORK31(:,:,JK) *(XZZ(:,:,JK+1)-XZZ(:,:,JK))      &
+                       *1.d-6 ! Convert to ug/m2-->g/m2 in each layer
+    END DO
+    !
+    DO JK=IKB,IKE
+      DO JT=IJB,IJE
+        DO JI=IIB,IIE
+           ZWORK21(JI,JT)=ZWORK21(JI,JT)+ZWORK31(JI,JT,JK)
+        ENDDO
+      ENDDO
+    ENDDO
+    WRITE(TZFIELD2D%CMNHNAME,'(A7,I1)')'SLTBRDN',JJ
+    TZFIELD2D%CLONGNAME  = TRIM(TZFIELD2D%CMNHNAME)
+    TZFIELD2D%CUNITS     = 'g m-2'
+    WRITE(TZFIELD2D%CCOMMENT,'(A6,I1)')'BURDEN',JJ
+    CALL IO_Field_write(TPFILE,TZFIELD2D,ZWORK21)
+  ENDDO
+END IF
+IF (LSALT.AND.LDEPOS_SLT(IMI)) THEN
+  !
+  DO JSV = NSV_SLTDEPBEG, NSV_SLTDEPEND
+    TZFIELD = TSVLIST(JSV)
+    TZFIELD%CUNITS    = 'ppb'
+    WRITE(TZFIELD%CCOMMENT,'(A,I3.3)') 'X_Y_Z_SALTDEP', JSV
+    CALL IO_Field_write(TPFILE,TZFIELD,XSVT(:,:,:,JSV)*1.E9)
+  END DO
+  !
+  ZSSLTDEP => XSVT(:,:,:,NSV_SLTDEPBEG:NSV_SLTDEPEND)
+  !
+  TZFIELD = TFIELDMETADATA(                   &
+    CMNHNAME   = 'generic for saltdep modes', &
+    CSTDNAME   = '',                          &
+    CDIR       = 'XY',                        &
+    NGRID      = 1,                           &
+    NTYPE      = TYPEREAL,                    &
+    NDIMS      = 3,                           &
+    LTIMEDEP   = .TRUE.                       )
+  !
+  DO JJ=1,NMODE_SLT
+    ! FOR CLOUDS
+    WRITE(TZFIELD%CMNHNAME,'(A9,I1)')'SLTDEPN0A',JJ
+    TZFIELD%CLONGNAME  = TRIM(TZFIELD%CMNHNAME)
+    WRITE(TZFIELD%CCOMMENT,'(A16,I1)')'N0 DUSTDEP MODE ',JJ
+    TZFIELD%CUNITS     = 'm-3'
+    ! CLOUD: CALCULATE MOMENT 3 FROM TOTAL AEROSOL MASS
+    ZWORK31(:,:,:) = ZSSLTDEP(:,:,:,JJ)         &!==>molec_{aer}/molec_{air}
+                     *(XMOLARWEIGHT_DUST/XMD)   &!==>kg_{aer}/kg_{air}
+                     *XRHODREF(:,:,:)           &!==>kg_{aer}/m3_{air}
+                     /XDENSITY_DUST             &!==>m3_{aer}/m3_{air}
+                     *XM3TOUM3                  &!==>um3_{aer}/m3_{air}
+                     /(XPI*4./3.)                !==>um3_{aer}/m3_{air}
+            !==>volume 3rd moment
+    !CLOUD: CALCULATE MOMENT 0 FROM DISPERSION AND MEAN RADIUS
+    ZWORK31(:,:,:) =  ZWORK31(:,:,:)/                        &
+                      ((ZRG_SLT(:,:,:,JJ)**3)*               &
+                      EXP(4.5 * LOG(ZSIG_SLT(:,:,:,JJ))**2))
+    !CLOUD: RETURN TO CONCENTRATION #/m3
+    ZWORK31(:,:,:)= ZWORK31(:,:,:) *   XMD/ &
+                    (XAVOGADRO*XRHODREF(:,:,:))
+    !CLOUD:  Get number concentration (#/molec_{air}==>#/m3)
+    ZWORK31(:,:,:)=                   &
+                    ZWORK31(:,:,:)    & !#/molec_{air}
+                    * XAVOGADRO       & !==>#/mole
+                    / XMD             & !==>#/kg_{air}
+                    * XRHODREF(:,:,:)   !==>#/m3
+    CALL IO_Field_write(TPFILE,TZFIELD,ZWORK31)
+    ! CLOUD:   DUST MASS CONCENTRATION
+    WRITE(TZFIELD%CMNHNAME,'(A9,I1)')'SLTDEPMSS',JJ
+    TZFIELD%CLONGNAME  = TRIM(TZFIELD%CMNHNAME)
+    WRITE(TZFIELD%CCOMMENT,'(A17,I1)')'DEPMASSCONC MODE ',JJ
+    TZFIELD%CUNITS     = 'ug m-3'
+    ZWORK31(:,:,:)= ZWORK31(:,:,:)*4./3.*3.14*2500.*1e9 & !kg-->ug
+                    * (ZRG_SLT(:,:,:,JJ)**3)*1.d-18     &  !um-->m
+                    * exp(4.5*log(ZSIG_SLT(:,:,:,JJ))*log(ZSIG_SLT(:,:,:,JJ)))
+    CALL IO_Field_write(TPFILE,TZFIELD,ZWORK31)
+    !   FOR RAIN DROPS
+    WRITE(TZFIELD%CMNHNAME,'(A9,I1)')'SLTDEPN0A',JJ+NMODE_SLT
+    TZFIELD%CLONGNAME  = TRIM(TZFIELD%CMNHNAME)
+    WRITE(TZFIELD%CCOMMENT,'(A16,I1)')'N0 DUSTDEP MODE ',JJ+NMODE_SLT
+    TZFIELD%CUNITS     = 'm-3'
+    ! RAIN: CALCULATE MOMENT 3 FROM TOTAL AEROSOL MASS
+    ZWORK31(:,:,:) = ZSSLTDEP(:,:,:,JJ+NMODE_SLT)  &!==>molec_{aer}/molec_{air}
+                     *(XMOLARWEIGHT_DUST/XMD)      &!==>kg_{aer}/kg_{air}
+                     *XRHODREF(:,:,:)              &!==>kg_{aer}/m3_{air}
+                     /XDENSITY_DUST                &!==>m3_{aer}/m3_{air}
+                     *XM3TOUM3                     &!==>um3_{aer}/m3_{air}
+                     /(XPI*4./3.)                   !==>um3_{aer}/m3_{air}
+            !==>volume 3rd moment
+    !RAIN: CALCULATE MOMENT 0 FROM DISPERSION AND MEAN RADIUS
+    ZWORK31(:,:,:)= ZWORK31(:,:,:)/                        &
+                    ((ZRG_SLT(:,:,:,JJ)**3)*               &
+                    EXP(4.5 * LOG(ZSIG_SLT(:,:,:,JJ))**2))
+    !RAIN: RETURN TO CONCENTRATION #/m3
+    ZWORK31(:,:,:)= ZWORK31(:,:,:) *   XMD/ &
+                    (XAVOGADRO*XRHODREF(:,:,:))
+    !RAIN: Get number concentration (#/molec_{air}==>#/m3)
+    ZWORK31(:,:,:)=                   &
+                    ZWORK31(:,:,:)    & !#/molec_{air}
+                    * XAVOGADRO       & !==>#/mole
+                    / XMD             & !==>#/kg_{air}
+                    * XRHODREF(:,:,:)   !==>#/m3
+    CALL IO_Field_write(TPFILE,TZFIELD,ZWORK31)
+    ! RAIN:   DUST MASS CONCENTRATION
+    WRITE(TZFIELD%CMNHNAME,'(A9,I1)')'SLTDEPMSS',JJ+NMODE_SLT
+    TZFIELD%CLONGNAME  = TRIM(TZFIELD%CMNHNAME)
+    WRITE(TZFIELD%CCOMMENT,'(A17,I1)')'DEPMASSCONC MODE ',JJ+NMODE_SLT
+    TZFIELD%CUNITS     = 'ug m-3'
+    ZWORK31(:,:,:)= ZWORK31(:,:,:)*4./3.*3.14*2500.*1e9 & !kg-->ug
+                    * (ZRG_SLT(:,:,:,JJ)**3)*1.d-18     &  !um-->m
+                    * exp(4.5*log(ZSIG_SLT(:,:,:,JJ))*log(ZSIG_SLT(:,:,:,JJ)))
+    CALL IO_Field_write(TPFILE,TZFIELD,ZWORK31)
+  END DO
+
+  ZSSLTDEP => NULL()
+!
+END IF
+!
+!  Blowing snow variables
+!
+IF(LBLOWSNOW) THEN
+  TZFIELD = TFIELDMETADATA(                                             &
+    CMNHNAME   = 'SNWSUBL3D',                                           &
+    CSTDNAME   = '',                                                    &
+    CLONGNAME  = 'SNWSUBL3D',                                           &
+    CUNITS     = 'kg m-3 s-1',                                          &
+    CDIR       = 'XY',                                                  &
+    CCOMMENT   = 'X_Y_INstantaneous 3D Drifting snow sublimation flux', &
+    NGRID      = 1,                                                     &
+    NTYPE      = TYPEREAL,                                              &
+    NDIMS      = 3,                                                     &
+    LTIMEDEP   = .TRUE.                                                 )
+  CALL IO_Field_write(TPFILE,TZFIELD,XSNWSUBL3D(:,:,:))
+  !
+  ZWORK21(:,:) = 0.
+  DO JK = IKB,IKE
+    ZWORK21(:,:) = ZWORK21(:,:)+XSNWSUBL3D(:,:,JK) * &
+                  (XZZ(:,:,JK+1)-XZZ(:,:,JK))/XRHOLW*3600*24
+  END DO
+  ZWORK21(:,:) = ZWORK21(:,:)*1000. ! vapor water in mm unit
+  !
+  TZFIELD = TFIELDMETADATA(                                 &
+    CMNHNAME   = 'COL_SNWSUBL',                             &
+    CSTDNAME   = '',                                        &
+    CLONGNAME  = 'COL_SNWSUBL',                             &
+    CUNITS     = 'mm day-1',                                &
+    CDIR       = 'XY',                                      &
+    CCOMMENT   = 'X_Y_Column Sublimation Rate (mmSWE/day)', &
+    NGRID      = 4,                                         &
+    NTYPE      = TYPEREAL,                                  &
+    NDIMS      = 2,                                         &
+    LTIMEDEP   = .TRUE.                                     )
+  CALL IO_Field_write(TPFILE,TZFIELD,ZWORK21(:,:))
+  !
+  IF(.NOT.ALLOCATED(ZBET_SNW)) &
+        ALLOCATE(ZBET_SNW(SIZE(XSVT,1), SIZE(XSVT,2), SIZE(XSVT,3)))
+  IF(.NOT.ALLOCATED(ZRG_SNW))  &
+    ALLOCATE(ZRG_SNW(SIZE(XSVT,1), SIZE(XSVT,2), SIZE(XSVT,3)))
+  IF(.NOT.ALLOCATED(ZMA_SNW))  &
+    ALLOCATE(ZMA_SNW(SIZE(XSVT,1), SIZE(XSVT,2), SIZE(XSVT,3),NBLOWSNOW3D))
+  !
+  CALL PPP2SNOW(XSVT(:,:,:,NSV_SNWBEG:NSV_SNWEND),XRHODREF,&
+               PBET3D=ZBET_SNW, PRG3D=ZRG_SNW, PM3D=ZMA_SNW)
+  !
+  TZFIELD = TFIELDMETADATA(        &
+    CMNHNAME   = 'SNWRGA',         &
+    CSTDNAME   = '',               &
+    CLONGNAME  = 'SNWRGA',         &
+    CUNITS     = 'm',              &
+    CDIR       = 'XY',             &
+    CCOMMENT   = 'RG (mean) SNOW', &
+    NGRID      = 1,                &
+    NTYPE      = TYPEREAL,         &
+    NDIMS      = 3,                &
+    LTIMEDEP   = .TRUE.            )
+  CALL IO_Field_write(TPFILE,TZFIELD,ZRG_SNW(:,:,:))
+  !
+  TZFIELD = TFIELDMETADATA(   &
+    CMNHNAME   = 'SNWBETA',   &
+    CSTDNAME   = '',          &
+    CLONGNAME  = 'SNWBETA',   &
+    CUNITS     = 'm',         &
+    CDIR       = 'XY',        &
+    CCOMMENT   = 'BETA SNOW', &
+    NGRID      = 1,           &
+    NTYPE      = TYPEREAL,    &
+    NDIMS      = 3,           &
+    LTIMEDEP   = .TRUE.       )
+  CALL IO_Field_write(TPFILE,TZFIELD,ZBET_SNW(:,:,:))
+  !
+  TZFIELD = TFIELDMETADATA(              &
+    CMNHNAME   = 'SNWNOA',               &
+    CSTDNAME   = '',                     &
+    CLONGNAME  = 'SNWNOA',               &
+    CUNITS     = 'm-3',                  &
+    CDIR       = 'XY',                   &
+    CCOMMENT   = 'NUM CONC SNOW (#/m3)', &
+    NGRID      = 1,                      &
+    NTYPE      = TYPEREAL,               &
+    NDIMS      = 3,                      &
+    LTIMEDEP   = .TRUE.                  )
+  CALL IO_Field_write(TPFILE,TZFIELD,ZMA_SNW(:,:,:,1))
+  !
+  TZFIELD = TFIELDMETADATA(        &
+    CMNHNAME   = 'SNWMASS',        &
+    CSTDNAME   = '',               &
+    CLONGNAME  = 'SNWMASS',        &
+    CUNITS     = 'kg m-3',         &
+    CDIR       = 'XY',             &
+    CCOMMENT   = 'MASS CONC SNOW', &
+    NGRID      = 1,                &
+    NTYPE      = TYPEREAL,         &
+    NDIMS      = 3,                &
+    LTIMEDEP   = .TRUE.            )
+  CALL IO_Field_write(TPFILE,TZFIELD,ZMA_SNW(:,:,:,2))
+  !
+  ZWORK21(:,:) = 0.
+  DO JK = IKB,IKE
+    ZWORK21(:,:) = ZWORK21(:,:)+ZMA_SNW(:,:,JK,2) * &
+                   (XZZ(:,:,JK+1)-XZZ(:,:,JK))/XRHOLW
+  END DO
+  ZWORK21(:,:) = ZWORK21(:,:)*1000. ! vapor water in mm unit
+  TZFIELD = TFIELDMETADATA(                                 &
+    CMNHNAME   = 'THDS',                                    &
+    CSTDNAME   = '',                                        &
+    CLONGNAME  = 'THDS',                                    &
+    CUNITS     = 'mm',                                      &
+    CDIR       = 'XY',                                      &
+    CCOMMENT   = 'X_Y_THickness of Drifting Snow (mm SWE)', &
+    NGRID      = 4,                                         &
+    NTYPE      = TYPEREAL,                                  &
+    NDIMS      = 2,                                         &
+    LTIMEDEP   = .TRUE.                                     )
+  CALL IO_Field_write(TPFILE,TZFIELD,ZWORK21(:,:))
+END IF
+! linox scalar variables
+IF (.NOT.(LUSECHEM .OR. LCHEMDIAG) .AND. LCH_CONV_LINOX) THEN
+  DO JSV = NSV_LNOXBEG, NSV_LNOXEND
+    TZFIELD = TSVLIST(JSV)
+    TZFIELD%CUNITS    = 'ppb'
+    WRITE(TZFIELD%CCOMMENT,'(A,I3.3)') 'X_Y_Z_LNOX', JSV
+    CALL IO_Field_write(TPFILE,TZFIELD,XSVT(:,:,:,JSV)*1.E9)
+  END DO
+END IF
+!
+!* Large Scale variables
+!
+IF (LVAR_LS) THEN
+  CALL IO_Field_write(TPFILE,'LSUM', XLSUM)
+  CALL IO_Field_write(TPFILE,'LSVM', XLSVM)
+  !
+  IF (LWIND_ZM) THEN
+    TZFIELD2(1) = TFIELDMETADATA(                                    &
+      CMNHNAME   = 'LSUM_ZM',                                        &
+      CSTDNAME   = '',                                               &
+      CLONGNAME  = 'LSUM_ZM',                                        &
+      CUNITS     = 'm s-1',                                          &
+      CDIR       = 'XY',                                             &
+      CCOMMENT   = 'Large Scale Zonal component of horizontal wind', &
+      NGRID      = 2,                                                &
+      NTYPE      = TYPEREAL,                                         &
+      NDIMS      = 3,                                                &
+      LTIMEDEP   = .TRUE.                                            )
+    !
+    TZFIELD2(2) = TFIELDMETADATA(                                       &
+      CMNHNAME   = 'LSVM_ZM',                                           &
+      CSTDNAME   = '',                                                  &
+      CLONGNAME  = 'LSVM_ZM',                                           &
+      CUNITS     = 'm s-1',                                             &
+      CDIR       = 'XY',                                                &
+      CCOMMENT   = 'Large Scale Meridian component of horizontal wind', &
+      NGRID      = 3,                                                   &
+      NTYPE      = TYPEREAL,                                            &
+      NDIMS      = 3,                                                   &
+      LTIMEDEP   = .TRUE.                                               )
+    !
+    CALL UV_TO_ZONAL_AND_MERID(XLSUM,XLSVM,23,TPFILE=TPFILE,TZFIELDS=TZFIELD2)
+  ENDIF
+  !
+  CALL IO_Field_write(TPFILE,'LSWM', XLSWM)
+  CALL IO_Field_write(TPFILE,'LSTHM',XLSTHM)
+!
+  IF (LUSERV) THEN
+    CALL FIND_FIELD_ID_FROM_MNHNAME('LSRVM',IID,IRESP)
+    TZFIELD = TFIELDMETADATA( TFIELDLIST(IID) )
+    TZFIELD%CUNITS = 'g kg-1'
+    CALL IO_Field_write(TPFILE,TZFIELD,XLSRVM(:,:,:)*1.E3)
+  END IF
+END IF
+!
+!* Forcing variables
+!
+IF (LVAR_FRC .AND. LFORCING) THEN
+!
+  DO JT=1,NFRC
+    WRITE (YFRC,'(I3.3)') JT
+!
+    TZFIELD = TFIELDMETADATA(                                    &
+      CMNHNAME   = 'UFRC'//YFRC,                                 &
+      CSTDNAME   = '',                                           &
+      CLONGNAME  = 'UFRC'//YFRC,                                 &
+      CUNITS     = 'm s-1',                                      &
+      CDIR       = '--',                                         &
+      CCOMMENT   = 'Zonal component of horizontal forcing wind', &
+      NGRID      = 1,                                            &
+      NTYPE      = TYPEREAL,                                     &
+      NDIMS      = 1,                                            &
+      LTIMEDEP   = .FALSE.                                       )
+    CALL IO_Field_write(TPFILE,TZFIELD,XUFRC(:,JT))
+!
+    TZFIELD = TFIELDMETADATA(                                       &
+      CMNHNAME   = 'VFRC'//YFRC,                                    &
+      CSTDNAME   = '',                                              &
+      CLONGNAME  = 'VFRC'//YFRC,                                    &
+      CUNITS     = 'm s-1',                                         &
+      CDIR       = '--',                                            &
+      CCOMMENT   = 'Meridian component of horizontal forcing wind', &
+      NGRID      = 1,                                               &
+      NTYPE      = TYPEREAL,                                        &
+      NDIMS      = 1,                                               &
+      LTIMEDEP   = .FALSE.                                          )
+    CALL IO_Field_write(TPFILE,TZFIELD,XVFRC(:,JT))
+!
+    TZFIELD = TFIELDMETADATA(               &
+      CMNHNAME   = 'WFRC'//YFRC,            &
+      CSTDNAME   = '',                      &
+      CLONGNAME  = 'WFRC'//YFRC,            &
+      CUNITS     = 'm s-1',                 &
+      CDIR       = '--',                    &
+      CCOMMENT   = 'Vertical forcing wind', &
+      NGRID      = 4,                       &
+      NTYPE      = TYPEREAL,                &
+      NDIMS      = 1,                       &
+      LTIMEDEP   = .FALSE.                  )
+    CALL IO_Field_write(TPFILE,TZFIELD,XWFRC(:,JT))
+!
+    TZFIELD = TFIELDMETADATA(                       &
+      CMNHNAME   = 'THFRC'//YFRC,                   &
+      CSTDNAME   = '',                              &
+      CLONGNAME  = 'THFRC'//YFRC,                   &
+      CUNITS     = 'K',                             &
+      CDIR       = '--',                            &
+      CCOMMENT   = 'Forcing potential temperature', &
+      NGRID      = 1,                               &
+      NTYPE      = TYPEREAL,                        &
+      NDIMS      = 1,                               &
+      LTIMEDEP   = .FALSE.                          )
+    CALL IO_Field_write(TPFILE,TZFIELD,XTHFRC(:,JT))
+!
+    TZFIELD = TFIELDMETADATA(                    &
+      CMNHNAME   = 'RVFRC'//YFRC,                &
+      CSTDNAME   = '',                           &
+      CLONGNAME  = 'RVFRC'//YFRC,                &
+      CUNITS     = 'kg kg-1',                    &
+      CDIR       = '--',                         &
+      CCOMMENT   = 'Forcing vapor mixing ratio', &
+      NGRID      = 1,                            &
+      NTYPE      = TYPEREAL,                     &
+      NDIMS      = 1,                            &
+      LTIMEDEP   = .FALSE.                       )
+    CALL IO_Field_write(TPFILE,TZFIELD,XRVFRC(:,JT))
+!
+    TZFIELD = TFIELDMETADATA(                                                &
+      CMNHNAME   = 'TENDTHFRC'//YFRC,                                        &
+      CSTDNAME   = '',                                                       &
+      CLONGNAME  = 'TENDTHFRC'//YFRC,                                        &
+      CUNITS     = 'K s-1',                                                  &
+      CDIR       = '--',                                                     &
+      CCOMMENT   = 'Large-scale potential temperature tendency for forcing', &
+      NGRID      = 1,                                                        &
+      NTYPE      = TYPEREAL,                                                 &
+      NDIMS      = 1,                                                        &
+      LTIMEDEP   = .FALSE.                                                   )
+    CALL IO_Field_write(TPFILE,TZFIELD,XTENDTHFRC(:,JT))
+!
+    TZFIELD = TFIELDMETADATA(                                             &
+      CMNHNAME   = 'TENDRVFRC'//YFRC,                                     &
+      CSTDNAME   = '',                                                    &
+      CLONGNAME  = 'TENDRVFRC'//YFRC,                                     &
+      CUNITS     = 'kg kg-1 s-1',                                         &
+      CDIR       = '--',                                                  &
+      CCOMMENT   = 'Large-scale vapor mixing ratio tendency for forcing', &
+      NGRID      = 1,                                                     &
+      NTYPE      = TYPEREAL,                                              &
+      NDIMS      = 1,                                                     &
+      LTIMEDEP   = .FALSE.                                                )
+    CALL IO_Field_write(TPFILE,TZFIELD,XTENDRVFRC(:,JT))
+!
+    TZFIELD = TFIELDMETADATA(                                                &
+      CMNHNAME   = 'GXTHFRC'//YFRC,                                          &
+      CSTDNAME   = '',                                                       &
+      CLONGNAME  = 'GXTHFRC'//YFRC,                                          &
+      CUNITS     = 'K m-1',                                                  &
+      CDIR       = '--',                                                     &
+      CCOMMENT   = 'Large-scale potential temperature gradient for forcing', &
+      NGRID      = 1,                                                        &
+      NTYPE      = TYPEREAL,                                                 &
+      NDIMS      = 1,                                                        &
+      LTIMEDEP   = .FALSE.                                                   )
+    CALL IO_Field_write(TPFILE,TZFIELD,XGXTHFRC(:,JT))
+!
+    TZFIELD = TFIELDMETADATA(                                                &
+      CMNHNAME   = 'GYTHFRC'//YFRC,                                          &
+      CSTDNAME   = '',                                                       &
+      CLONGNAME  = 'GYTHFRC'//YFRC,                                          &
+      CUNITS     = 'K m-1',                                                  &
+      CDIR       = '--',                                                     &
+      CCOMMENT   = 'Large-scale potential temperature gradient for forcing', &
+      NGRID      = 1,                                                        &
+      NTYPE      = TYPEREAL,                                                 &
+      NDIMS      = 1,                                                        &
+      LTIMEDEP   = .FALSE.                                                   )
+    CALL IO_Field_write(TPFILE,TZFIELD,XGYTHFRC(:,JT))
+!
+    TZFIELD = TFIELDMETADATA(                 &
+      CMNHNAME   = 'PGROUNDFRC'//YFRC,        &
+      CSTDNAME   = '',                        &
+      CLONGNAME  = 'PGROUNDFRC'//YFRC,        &
+      CUNITS     = 'Pa',                      &
+      CDIR       = '--',                      &
+      CCOMMENT   = 'Forcing ground pressure', &
+      NGRID      = 1,                         &
+      NTYPE      = TYPEREAL,                  &
+      NDIMS      = 0,                         &
+      LTIMEDEP   = .FALSE.                    )
+    CALL IO_Field_write(TPFILE,TZFIELD,XPGROUNDFRC(JT))
+!
+  END DO
+END IF
+!
+!-------------------------------------------------------------------------------
+!
+!*       1.7    Some diagnostic variables
+!
+IF (LTPZH .OR. LCOREF) THEN
+!
+!* Temperature in celsius
+  TZFIELD = TFIELDMETADATA(           &
+    CMNHNAME   = 'TEMP',              &
+    CSTDNAME   = 'air_temperature',   &
+    CLONGNAME  = 'TEMP',              &
+    CUNITS     = 'celsius',           &
+    CDIR       = 'XY',                &
+    CCOMMENT   = 'X_Y_Z_TEMPerature', &
+    NGRID      = 1,                   &
+    NTYPE      = TYPEREAL,            &
+    NDIMS      = 3,                   &
+    LTIMEDEP   = .TRUE.               )
+  ZWORK31(:,:,:)=ZTEMP(:,:,:) - XTT
+  CALL IO_Field_write(TPFILE,TZFIELD,ZWORK31)
+!
+!* Pressure in hPa        
+  CALL FIND_FIELD_ID_FROM_MNHNAME('PABST',IID,IRESP)
+  TZFIELD = TFIELDMETADATA( TFIELDLIST(IID) )
+  TZFIELD%CMNHNAME = 'PRES'
+  TZFIELD%CUNITS = 'hPa'
+  CALL IO_Field_write(TPFILE,TZFIELD,XPABST(:,:,:)*1E-2)
+!
+!* Geopotential in meters
+  CALL IO_Field_write(TPFILE,'ALT',XZZ)
+!
+!* Relative humidity in percent
+  IF (LUSERV) THEN
+    ZWORK31(:,:,:)=SM_FOES(ZTEMP(:,:,:))
+    ZWORK33(:,:,:)=ZWORK31(:,:,:)
+    ZWORK31(:,:,:)=(XMV/XMD)*ZWORK31(:,:,:)/(XPABST(:,:,:)-ZWORK31(:,:,:))
+    ZWORK32(:,:,:)=100.*XRT(:,:,:,1)/ZWORK31(:,:,:)
+    IF (CCLOUD(1:3) =='ICE' .OR. CCLOUD =='C3R5' .OR. CCLOUD == 'LIMA')  THEN
+      WHERE ( ZTEMP(:,:,:)< XTT)
+        ZWORK31(:,:,:) = EXP( XALPI - XBETAI/ZTEMP(:,:,:) &
+                       - XGAMI*ALOG(ZTEMP(:,:,:)) ) !saturation over ice
+        ZWORK33(:,:,:)=ZWORK31(:,:,:)
+        ZWORK31(:,:,:)=(XMV/XMD)*ZWORK31(:,:,:)/(XPABST(:,:,:)-ZWORK31(:,:,:))
+        ZWORK32(:,:,:)=100.*XRT(:,:,:,1)/ZWORK31(:,:,:)
+      END WHERE
+    END IF
+    !
+    TZFIELD = TFIELDMETADATA(                 &
+      CMNHNAME   = 'REHU',                    &
+      CSTDNAME   = 'relative_humidity',       &
+      CLONGNAME  = 'REHU',                    &
+      CUNITS     = 'percent',                 &
+      CDIR       = 'XY',                      &
+      CCOMMENT   = 'X_Y_Z_RElative HUmidity', &
+      NGRID      = 1,                         &
+      NTYPE      = TYPEREAL,                  &
+      NDIMS      = 3,                         &
+      LTIMEDEP   = .TRUE.                     )
+    CALL IO_Field_write(TPFILE,TZFIELD,ZWORK32)
+    !
+    TZFIELD = TFIELDMETADATA(                             &
+      CMNHNAME   = 'VPRES',                               &
+      CSTDNAME   = 'water_vapor_partial_pressure_in_air', &
+      CLONGNAME  = 'VPRES',                               &
+      CUNITS     = 'hPa',                                 &
+      CDIR       = 'XY',                                  &
+      CCOMMENT   = 'X_Y_Z_Vapor PRESsure',                &
+      NGRID      = 1,                                     &
+      NTYPE      = TYPEREAL,                              &
+      NDIMS      = 3,                                     &
+      LTIMEDEP   = .TRUE.                                 )
+    ZWORK33(:,:,:)=ZWORK33(:,:,:)*ZWORK32(:,:,:)*1E-4
+    CALL IO_Field_write(TPFILE,TZFIELD,ZWORK33)
+    !
+    IF (LCOREF) THEN
+      ZWORK33(:,:,:)=(77.6*( XPABST(:,:,:)*1E-2                &
+                            +ZWORK33(:,:,:)*4810/ZTEMP(:,:,:)) &
+                      -6*ZWORK33(:,:,:)                        )/ZTEMP(:,:,:)
+      TZFIELD = TFIELDMETADATA(                            &
+        CMNHNAME   = 'COREF',                              &
+        CSTDNAME   = '',                                   &
+        CLONGNAME  = 'COREF',                              &
+        CUNITS     = '1',                                  &
+        CDIR       = 'XY',                                 &
+        CCOMMENT   = 'X_Y_Z_REFraction COindex (N-units)', &
+        NGRID      = 1,                                    &
+        NTYPE      = TYPEREAL,                             &
+        NDIMS      = 3,                                    &
+        LTIMEDEP   = .TRUE.                                )
+      CALL IO_Field_write(TPFILE,TZFIELD,ZWORK33)
+      !
+      ZWORK33(:,:,:)=ZWORK33(:,:,:)+MZF(XZZ(:,:,:))*1E6/XRADIUS
+      TZFIELD = TFIELDMETADATA(                                     &
+        CMNHNAME   = 'MCOREF',                                      &
+        CSTDNAME   = '',                                            &
+        CLONGNAME  = 'MCOREF',                                      &
+        CUNITS     = '1',                                           &
+        CDIR       = 'XY',                                          &
+        CCOMMENT   = 'X_Y_Z_Modified REFraction COindex (M-units)', &
+        NGRID      = 1,                                             &
+        NTYPE      = TYPEREAL,                                      &
+        NDIMS      = 3,                                             &
+        LTIMEDEP   = .TRUE.                                         )
+      CALL IO_Field_write(TPFILE,TZFIELD,ZWORK33)
+    END IF
+  ELSE
+    PRINT*, 'NO WATER VAPOR IN ',TPFILE%CNAME,' RELATIVE HUMIDITY IS NOT COMPUTED'
+  END IF
+!
+END IF
+!
+!-------------------------------------------------------------------------------
+!
+!* Virtual potential temperature
+!
+IF ( LMOIST_V .OR. LMSLP .OR. CBLTOP/='NONE' ) THEN
+  ALLOCATE(ZTHETAV(IIU,IJU,IKU))
+!
+  IF(NRR > 0) THEN
+!   compute the ratio : 1 + total water mass / dry air mass
+    ZRV_OV_RD = XRV / XRD
+    ZTHETAV(:,:,:) = 1. + XRT(:,:,:,1)
+    DO JLOOP = 2,1+NRRL+NRRI                
+      ZTHETAV(:,:,:) = ZTHETAV(:,:,:) + XRT(:,:,:,JLOOP)
+    END DO
+! compute the virtual potential temperature when water is present in any form
+    ZTHETAV(:,:,:) = XTHT(:,:,:) * (1.+XRT(:,:,:,1)*ZRV_OV_RD) / ZTHETAV(:,:,:)
+  ELSE
+! compute the virtual potential temperature when water is absent
+    ZTHETAV(:,:,:) = XTHT(:,:,:)
+  END IF
+!
+  IF (LMOIST_V .AND. NRR > 0) THEN
+! Virtual potential temperature
+    TZFIELD = TFIELDMETADATA(                             &
+      CMNHNAME   = 'THETAV',                              &
+      CSTDNAME   = '',                                    &
+      CLONGNAME  = 'THETAV',                              &
+      CUNITS     = 'K',                                   &
+      CDIR       = 'XY',                                  &
+      CCOMMENT   = 'X_Y_Z_Virtual potential temperature', &
+      NGRID      = 1,                                     &
+      NTYPE      = TYPEREAL,                              &
+      NDIMS      = 3,                                     &
+      LTIMEDEP   = .TRUE.                                 )
+    CALL IO_Field_write(TPFILE,TZFIELD,ZTHETAV)
+  END IF
+!
+END IF
+!
+!-------------------------------------------------------------------------------
+!
+!* Fog Visibility
+!
+IF (LVISI) THEN
+!
+  IF ((CCLOUD /= 'NONE') .AND. (CCLOUD /='REVE')) ALLOCATE(ZVISIKUN(IIU,IJU,IKU))
+  IF ((CCLOUD == 'C2R2') .OR. (CCLOUD =='KHKO')) THEN
+    ALLOCATE(ZVISIGUL(IIU,IJU,IKU))
+    ALLOCATE(ZVISIZHA(IIU,IJU,IKU))
+  END IF
+!
+  IF ((CCLOUD /= 'NONE') .AND. (CCLOUD /='REVE')) THEN
+    ZVISIKUN(:,:,:) = 10000.
+    WHERE ( XRT(:,:,:,2) >= 1E-08 )
+     ZVISIKUN(:,:,:) =0.027/(XRT(:,:,:,2)*XRHODREF(:,:,:))**0.88*1000.
+    END WHERE
+! Visibity Kunkel                     
+    TZFIELD = TFIELDMETADATA(                 &
+      CMNHNAME   = 'VISIKUN',                 &
+      CSTDNAME   = '',                        &
+      CLONGNAME  = 'VISIKUN',                 &
+      CUNITS     = 'm',                       &
+      CDIR       = 'XY',                      &
+      CCOMMENT   = 'X_Y_Z_Visibility Kunkel', &
+      NGRID      = 1,                         &
+      NTYPE      = TYPEREAL,                  &
+      NDIMS      = 3,                         &
+      LTIMEDEP   = .TRUE.                     )
+    CALL IO_Field_write(TPFILE,TZFIELD,ZVISIKUN)
+!
+    IF ((CCLOUD == 'C2R2') .OR. (CCLOUD =='KHKO')) THEN
+      ZVISIGUL(:,:,:) = 10000.
+      ZVISIZHA(:,:,:) = 10000.
+      WHERE ( (XRT(:,:,:,2) >= 1E-08 ) .AND. (XSVT(:,:,:,NSV_C2R2BEG+1) >=0.001 ) )
+       ZVISIGUL(:,:,:) =1.002/(XRT(:,:,:,2)*XRHODREF(:,:,:)*XSVT(:,:,:,NSV_C2R2BEG+1))**0.6473*1000.
+       ZVISIZHA(:,:,:) =0.187/(XRT(:,:,:,2)*XRHODREF(:,:,:)*XSVT(:,:,:,NSV_C2R2BEG+1))**0.34*1000.
+      END WHERE
+! Visibity Gultepe                    
+      TZFIELD = TFIELDMETADATA(                  &
+        CMNHNAME   = 'VISIGUL',                  &
+        CSTDNAME   = '',                         &
+        CLONGNAME  = 'VISIGUL',                  &
+        CUNITS     = 'm',                        &
+        CDIR       = 'XY',                       &
+        CCOMMENT   = 'X_Y_Z_Visibility Gultepe', &
+        NGRID      = 1,                          &
+        NTYPE      = TYPEREAL,                   &
+        NDIMS      = 3,                          &
+      LTIMEDEP   = .TRUE.                        )
+      CALL IO_Field_write(TPFILE,TZFIELD,ZVISIGUL)
+! Visibity Zhang                      
+      TZFIELD = TFIELDMETADATA(                &
+        CMNHNAME   = 'VISIZHA',                &
+        CSTDNAME   = '',                       &
+        CLONGNAME  = 'VISIZHA',                &
+        CUNITS     = 'm',                      &
+        CDIR       = 'XY',                     &
+        CCOMMENT   = 'X_Y_Z_Visibility Zhang', &
+        NGRID      = 1,                        &
+        NTYPE      = TYPEREAL,                 &
+        NDIMS      = 3,                        &
+      LTIMEDEP   = .TRUE.                      )
+      CALL IO_Field_write(TPFILE,TZFIELD,ZVISIZHA)
+!
+      DEALLOCATE(ZVISIGUL,ZVISIZHA)
+    END IF
+    DEALLOCATE(ZVISIKUN)
+  END IF
+!
+END IF
+!
+!-------------------------------------------------------------------------------
+!
+!* Thetae computation according eq.(21), (43) of Bolton 1980 (MWR108,p 1046-1053)
+!
+IF (( LMOIST_E .OR. LBV_FR ) .AND. (NRR>0)) THEN
+  ALLOCATE(ZTHETAE(IIU,IJU,IKU))
+  !
+  ZWORK31(:,:,:) = MAX(XRT(:,:,:,1),1.E-10)
+  ZTHETAE(:,:,:)= (    2840./                                          &
+         (3.5*ALOG(XTHT(:,:,:)*( XPABST(:,:,:)/XP00 )**(XRD/XCPD)  )   &
+         - ALOG( XPABST(:,:,:)*0.01*ZWORK31(:,:,:) / ( 0.622+ZWORK31(:,:,:) ) ) &
+         -4.805   )    ) + 55.
+  ZTHETAE(:,:,:)= XTHT(:,:,:) * EXP( (3376. / ZTHETAE(:,:,:) - 2.54)  &
+                 *ZWORK31(:,:,:) *(1. +0.81 *ZWORK31(:,:,:)) )
+!
+  IF (LMOIST_E) THEN
+    TZFIELD = TFIELDMETADATA(                                &
+      CMNHNAME   = 'THETAE',                                 &
+      CSTDNAME   = '',                                       &
+      CLONGNAME  = 'THETAE',                                 &
+      CUNITS     = 'K',                                      &
+      CDIR       = 'XY',                                     &
+      CCOMMENT   = 'X_Y_Z_Equivalent potential temperature', &
+      NGRID      = 1,                                        &
+      NTYPE      = TYPEREAL,                                 &
+      NDIMS      = 3,                                        &
+      LTIMEDEP   = .TRUE.                                    )
+    CALL IO_Field_write(TPFILE,TZFIELD,ZTHETAE)
+  END IF
+END IF
+!-------------------------------------------------------------------------------
+!
+!* Thetaes computation 
+!
+IF (LMOIST_ES .AND. (NRR>0)) THEN
+  ALLOCATE(ZTHETAES(IIU,IJU,IKU))
+  ZWORK31(:,:,:) = MAX(QSAT(ZTEMP(:,:,:),XPABST(:,:,:)),1.E-10)
+  ZTHETAES(:,:,:)= (    2840./                                          &
+       (3.5*ALOG(XTHT(:,:,:)*( XPABST(:,:,:)/XP00 )**(XRD/XCPD)  )   &
+       - ALOG( XPABST(:,:,:)*0.01*ZWORK31(:,:,:) / ( 0.622+ZWORK31(:,:,:) ) ) &
+       -4.805   )    ) + 55.
+  ZTHETAES(:,:,:)= XTHT(:,:,:) * EXP( (3376. / ZTHETAE(:,:,:) - 2.54)  &
+               *ZWORK31(:,:,:) *(1. +0.81 *ZWORK31(:,:,:)) )
+  TZFIELD = TFIELDMETADATA(                                          &
+    CMNHNAME   = 'THETAES',                                          &
+    CSTDNAME   = '',                                                 &
+    CLONGNAME  = 'THETAES',                                          &
+    CUNITS     = 'K',                                                &
+    CDIR       = 'XY',                                               &
+    CCOMMENT   = 'X_Y_Z_Equivalent Saturated potential temperature', &
+    NGRID      = 1,                                                  &
+    NTYPE      = TYPEREAL,                                           &
+    NDIMS      = 3,                                                  &
+    LTIMEDEP   = .TRUE.                                              )
+  CALL IO_Field_write(TPFILE,TZFIELD,ZTHETAES)
+ENDIF
+!
+!-------------------------------------------------------------------------------
+!* The Liquid-Water potential temperature (Betts, 1973)
+!  (also needed for THETAS1 or THETAS2)
+!
+IF ( LMOIST_L .OR. LMOIST_S1 .OR. LMOIST_S2 ) THEN
+!
+  ALLOCATE(ZTHETAL(IIU,IJU,IKU))
+!
+  IF(NRR > 1) THEN
+!  The latent heat of Vaporization:
+    ZWORK31(:,:,:) = XLVTT + (XCPV-XCL)*(ZTEMP(:,:,:)-XTT)
+!  The latent heat of Sublimation:
+    ZWORK32(:,:,:) = XLSTT + (XCPV-XCI)*(ZTEMP(:,:,:)-XTT)
+!  The numerator in the exponential 
+!  and the total water mixing ratio:
+    ZTHETAL(:,:,:) = 0.0
+    ZWORK33(:,:,:) = XRT(:,:,:,1)
+    DO JLOOP = 2,1+NRRL              
+       ZTHETAL(:,:,:) = ZTHETAL(:,:,:) + XRT(:,:,:,JLOOP)*ZWORK31(:,:,:)
+       ZWORK33(:,:,:) = ZWORK33(:,:,:) + XRT(:,:,:,JLOOP)
+    END DO
+    DO JLOOP = 1+NRRL+1,1+NRRL+NRRI              
+       ZTHETAL(:,:,:) = ZTHETAL(:,:,:) + XRT(:,:,:,JLOOP)*ZWORK32(:,:,:)
+       ZWORK33(:,:,:) = ZWORK33(:,:,:) + XRT(:,:,:,JLOOP)
+    END DO
+!   compute the liquid-water potential temperature 
+!   theta_l = theta * exp[ -(L_vap * ql + L_sub * qi) / (c_pd * T) ]
+!   when water is present in any form:
+    ZTHETAL(:,:,:) = XTHT(:,:,:) &
+            * exp(-ZTHETAL(:,:,:)/(1.0+ZWORK33(:,:,:))/XCPD/ZTEMP(:,:,:))
+  ELSE
+!   compute the liquid-water potential temperature 
+!    when water is absent:
+    ZTHETAL(:,:,:) = XTHT(:,:,:)
+  END IF
+!
+  IF (LMOIST_L .AND. NRR > 0) THEN
+    ! Liquid-Water potential temperature
+    TZFIELD = TFIELDMETADATA(                                  &
+      CMNHNAME   = 'THETAL',                                   &
+      CSTDNAME   = '',                                         &
+      CLONGNAME  = 'THETAL',                                   &
+      CUNITS     = 'K',                                        &
+      CDIR       = 'XY',                                       &
+      CCOMMENT   = 'X_Y_Z_Liquid water potential temperature', &
+      NGRID      = 1,                                          &
+      NTYPE      = TYPEREAL,                                   &
+      NDIMS      = 3,                                          &
+      LTIMEDEP   = .TRUE.                                      )
+    CALL IO_Field_write(TPFILE,TZFIELD,ZTHETAL)
+  END IF
+!
+END IF
+!
+!-------------------------------------------------------------------------------
+!
+!* The Moist-air Entropy potential temperature (Marquet, QJ2011, HDR2016)
+!
+IF ( LMOIST_S1 .OR. LMOIST_S2 ) THEN
+  IF (LMOIST_S1) THEN
+    ALLOCATE(ZTHETAS1(IIU,IJU,IKU))
+  END IF
+  IF (LMOIST_S2) THEN
+    ALLOCATE(ZTHETAS2(IIU,IJU,IKU))
+  END IF
+!
+! The total water (ZWORK31) and condensed water (ZWORK32) mixing ratios:
+  ZWORK32(:,:,:) = 0.0
+  IF(NRR > 0) THEN
+    DO JLOOP = 2,1+NRRL+NRRI  
+       ZWORK32(:,:,:) = ZWORK32(:,:,:) + XRT(:,:,:,JLOOP)
+    END DO
+  END IF
+  ZWORK31(:,:,:) =  ZWORK32(:,:,:) + XRT(:,:,:,1)
+!
+  IF (LMOIST_S1) THEN
+!- - - - - - - - - - - - - - - - - - - - - - - - - - - - -
+! thetas1 = thetal * exp[ 5.87 * qt ] ; with qt=rt/(1+rt)
+!- - - - - - - - - - - - - - - - - - - - - - - - - - - - -
+    ZTHETAS1(:,:,:) = ZTHETAL(:,:,:) * &
+     exp( 5.87*ZWORK31(:,:,:)/(1.0+ZWORK31(:,:,:)) )
+  END IF
+  IF (LMOIST_S2) THEN
+!- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
+! thetas2 = thetal * exp[ (5.87-0.46*ln(rv/0.0124)-0.46*qc) * qt ]
+!           where qt=rt/(1+rt)  and qc=rc/(1+rt)
+!- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
+    ZWORK33(:,:,:) =  5.87 - 0.46 * log(MAX(XRT(:,:,:,1),1.E-10)/0.0124)
+    ZTHETAS2(:,:,:) = ZTHETAL(:,:,:) * &
+     exp( ZWORK33(:,:,:)*ZWORK31(:,:,:)/(1.0+ZWORK31(:,:,:)) &
+                  - 0.46*ZWORK32(:,:,:)/(1.0+ZWORK31(:,:,:)) )
+  END IF
+  IF (LMOIST_S1) THEN
+! The Moist-air Entropy potential temperature (1st order)
+    TZFIELD = TFIELDMETADATA(                                                   &
+      CMNHNAME   = 'THETAS1',                                                   &
+      CSTDNAME   = '',                                                          &
+      CLONGNAME  = 'THETAS1',                                                   &
+      CUNITS     = 'K',                                                         &
+      CDIR       = 'XY',                                                        &
+      CCOMMENT   = 'X_Y_Z_Moist air Entropy (1st order) potential temperature', &
+      NGRID      = 1,                                                           &
+      NTYPE      = TYPEREAL,                                                    &
+      NDIMS      = 3,                                                           &
+      LTIMEDEP   = .TRUE.                                                       )
+    CALL IO_Field_write(TPFILE,TZFIELD,ZTHETAS1)
+  END IF
+  IF (LMOIST_S2) THEN
+! The Moist-air Entropy potential temperature (2nd order)
+    TZFIELD = TFIELDMETADATA(                                                   &
+      CMNHNAME   = 'THETAS2',                                                   &
+      CSTDNAME   = '',                                                          &
+      CLONGNAME  = 'THETAS2',                                                   &
+      CUNITS     = 'K',                                                         &
+      CDIR       = 'XY',                                                        &
+      CCOMMENT   = 'X_Y_Z_Moist air Entropy (2nd order) potential temperature', &
+      NGRID      = 1,                                                           &
+      NTYPE      = TYPEREAL,                                                    &
+      NDIMS      = 3,                                                           &
+      LTIMEDEP   = .TRUE.                                                       )
+    CALL IO_Field_write(TPFILE,TZFIELD,ZTHETAS2)  
+  END IF
+!
+END IF
+!
+!-------------------------------------------------------------------------------
+!!
+!
+!* Vorticity quantities
+!
+IF (LVORT) THEN
+! Vorticity x
+  ZWORK31(:,:,:)=MYF(MZF(MXM(ZVOX(:,:,:))))
+  TZFIELD = TFIELDMETADATA(                        &
+    CMNHNAME   = 'UM1',                            &
+    CSTDNAME   = '',                               &
+    CLONGNAME  = 'UM1',                            &
+    CUNITS     = 's-1',                            &
+    CDIR       = 'XY',                             &
+    CCOMMENT   = 'X_Y_Z_x component of vorticity', &
+    NGRID      = 2,                                &
+    NTYPE      = TYPEREAL,                         &
+    NDIMS      = 3,                                &
+    LTIMEDEP   = .TRUE.                            )
+  CALL IO_Field_write(TPFILE,TZFIELD,ZWORK31)
+!    
+! Vorticity y
+  ZWORK32(:,:,:)=MZF(MXF(MYM(ZVOY(:,:,:))))
+  TZFIELD = TFIELDMETADATA(                        &
+    CMNHNAME   = 'VM1',                            &
+    CSTDNAME   = '',                               &
+    CLONGNAME  = 'VM1',                            &
+    CUNITS     = 's-1',                            &
+    CDIR       = 'XY',                             &
+    CCOMMENT   = 'X_Y_Z_y component of vorticity', &
+    NGRID      = 3,                                &
+    NTYPE      = TYPEREAL,                         &
+    NDIMS      = 3,                                &
+    LTIMEDEP   = .TRUE.                            )
+  CALL IO_Field_write(TPFILE,TZFIELD,ZWORK32)
+  !
+  IF (LWIND_ZM) THEN
+    TZFIELD2(1) = TFIELDMETADATA(                             &
+      CMNHNAME   = 'UM1_ZM',                                  &
+      CSTDNAME   = '',                                        &
+      CLONGNAME  = 'UM1_ZM',                                  &
+      CUNITS     = 'm s-1',                                   &
+      CDIR       = 'XY',                                      &
+      CCOMMENT   = 'Zonal component of horizontal vorticity', &
+      NGRID      = 2,                                         &
+      NTYPE      = TYPEREAL,                                  &
+      NDIMS      = 3,                                         &
+      LTIMEDEP   = .TRUE.                                     )
+    !
+    TZFIELD2(2) = TFIELDMETADATA(                                &
+      CMNHNAME   = 'VM1_ZM',                                     &
+      CSTDNAME   = '',                                           &
+      CLONGNAME  = 'VM1_ZM',                                     &
+      CUNITS     = 'm s-1',                                      &
+      CDIR       = 'XY',                                         &
+      CCOMMENT   = 'Meridian component of horizontal vorticity', &
+      NGRID      = 3,                                            &
+      NTYPE      = TYPEREAL,                                     &
+      NDIMS      = 3,                                            &
+      LTIMEDEP   = .TRUE.                                        )
+    !
+    CALL UV_TO_ZONAL_AND_MERID(ZWORK31,ZWORK32,23,TPFILE=TPFILE,TZFIELDS=TZFIELD2)
+  ENDIF
+!    
+! Vorticity z
+  ZWORK31(:,:,:)=MXF(MYF(MZM(ZVOZ(:,:,:))))
+  TZFIELD = TFIELDMETADATA(                  &
+    CMNHNAME   = 'WM1',                      &
+    CSTDNAME   = '',                         &
+    CLONGNAME  = 'WM1',                      &
+    CUNITS     = 's-1',                      &
+    CDIR       = 'XY',                       &
+    CCOMMENT   = 'X_Y_Z_relative vorticity', &
+    NGRID      = 4,                          &
+    NTYPE      = TYPEREAL,                   &
+    NDIMS      = 3,                          &
+    LTIMEDEP   = .TRUE.                      )
+  CALL IO_Field_write(TPFILE,TZFIELD,ZWORK31)
+!
+! Absolute Vorticity 
+  ZWORK31(:,:,:)=MYF(MXF(ZVOZ(:,:,:))) + ZCORIOZ(:,:,:)
+  TZFIELD = TFIELDMETADATA(                    &
+    CMNHNAME   = 'ABVOR',                      &
+    CSTDNAME   = '',                           &
+    CLONGNAME  = 'ABVOR',                      &
+    CUNITS     = 's-1',                        &
+    CDIR       = 'XY',                         &
+    CCOMMENT   = 'X_Y_Z_z ABsolute VORticity', &
+    NGRID      = 1,                            &
+    NTYPE      = TYPEREAL,                     &
+    NDIMS      = 3,                            &
+    LTIMEDEP   = .TRUE.                        )
+  CALL IO_Field_write(TPFILE,TZFIELD,ZWORK31)
+!
+END IF
+!    
+IF ( LMEAN_POVO ) THEN 
+  !
+  ALLOCATE(IWORK1(SIZE(XTHT,1),SIZE(XTHT,2)))
+  !
+  IWORK1(:,:)=0
+  ZWORK21(:,:)=0.
+  IF (XMEAN_POVO(1)>XMEAN_POVO(2)) THEN
+    !Invert values (smallest must be first)
+    ZX0D = XMEAN_POVO(1)
+    XMEAN_POVO(1) = XMEAN_POVO(2)
+    XMEAN_POVO(2) = ZX0D
+  END IF
+  DO JK=IKB,IKE
+    WHERE((XPABST(:,:,JK)>XMEAN_POVO(1)).AND.(XPABST(:,:,JK)<XMEAN_POVO(2)))
+      ZWORK21(:,:)=ZWORK21(:,:)+ZPOVO(:,:,JK)
+      IWORK1(:,:)=IWORK1(:,:)+1
+    END WHERE
+  END DO
+  WHERE (IWORK1(:,:)>0) ZWORK21(:,:)=ZWORK21(:,:)/REAL( IWORK1(:,:) )
+  TZFIELD = TFIELDMETADATA(                           &
+    CMNHNAME   = 'MEAN_POVO',                         &
+    CSTDNAME   = '',                                  &
+    CLONGNAME  = 'MEAN_POVO',                         &
+    CUNITS     = 'PVU',                               & ! 1 PVU = 1e-6 m^2 s^-1 K kg^-1
+    CDIR       = 'XY',                                &
+    CCOMMENT   = 'X_Y_Z_MEAN of POtential VOrticity', &
+    NGRID      = 4,                                   &
+    NTYPE      = TYPEREAL,                            &
+    NDIMS      = 2,                                   &
+    LTIMEDEP   = .TRUE.                               )
+  CALL IO_Field_write(TPFILE,TZFIELD,ZWORK21)
+END IF
+!
+! Virtual Potential Vorticity in PV units
+IF (LMOIST_V .AND. (NRR>0) ) THEN
+  ZWORK31(:,:,:)=GX_M_M(ZTHETAV,XDXX,XDZZ,XDZX)
+  ZWORK32(:,:,:)=GY_M_M(ZTHETAV,XDYY,XDZZ,XDZY)
+  ZWORK33(:,:,:)=GZ_M_M(ZTHETAV,XDZZ)
+  ZWORK34(:,:,:)= ZWORK31(:,:,:)*MZF(MYF(ZVOX(:,:,:)))     &
+               + ZWORK32(:,:,:)*MZF(MXF(ZVOY(:,:,:)))     &
+               + ZWORK33(:,:,:)*(MYF(MXF(ZVOZ(:,:,:))) + ZCORIOZ(:,:,:))
+  ZWORK34(:,:,:)=ZWORK34(:,:,:)*1E6/XRHODREF(:,:,:)
+  TZFIELD = TFIELDMETADATA(                           &
+    CMNHNAME   = 'POVOV',                             &
+    CSTDNAME   = '',                                  &
+    CLONGNAME  = 'POVOV',                             &
+    CUNITS     = 'PVU',                               & ! 1 PVU = 1e-6 m^2 s^-1 K kg^-1
+    CDIR       = 'XY',                                &
+    CCOMMENT   = 'X_Y_Z_Virtual POtential VOrticity', &
+    NGRID      = 1,                                   &
+    NTYPE      = TYPEREAL,                            &
+    NDIMS      = 3,                                   &
+    LTIMEDEP   = .TRUE.                               )
+  CALL IO_Field_write(TPFILE,TZFIELD,ZWORK34)
+!
+  IF (LMEAN_POVO) THEN
+    IWORK1(:,:)=0
+    ZWORK21(:,:)=0.
+    DO JK=IKB,IKE
+      WHERE((XPABST(:,:,JK)>XMEAN_POVO(1)).AND.(XPABST(:,:,JK)<XMEAN_POVO(2)))
+          ZWORK21(:,:)=ZWORK21(:,:)+ZWORK34(:,:,JK)
+          IWORK1(:,:)=IWORK1(:,:)+1
+      END WHERE
+    END DO
+    WHERE(IWORK1(:,:)>0) ZWORK21(:,:)=ZWORK21(:,:)/REAL( IWORK1(:,:) )
+    TZFIELD = TFIELDMETADATA(                                   &
+      CMNHNAME   = 'MEAN_POVOV',                                &
+      CSTDNAME   = '',                                          &
+      CLONGNAME  = 'MEAN_POVOV',                                &
+      CUNITS     = 'PVU',                                       & ! 1 PVU = 1e-6 m^2 s^-1 K kg^-1
+      CDIR       = 'XY',                                        &
+      CCOMMENT   = 'X_Y_Z_MEAN of Virtual POtential VOrticity', &
+      NGRID      = 4,                                           &
+      NTYPE      = TYPEREAL,                                    &
+      NDIMS      = 2,                                           &
+      LTIMEDEP   = .TRUE.                                       )
+    CALL IO_Field_write(TPFILE,TZFIELD,ZWORK21)
+  END IF
+END IF
+!
+! Equivalent Potential Vorticity in PV units
+IF (LMOIST_E .AND. (NRR>0) ) THEN
+!
+  ZWORK31(:,:,:)=GX_M_M(ZTHETAE,XDXX,XDZZ,XDZX)
+  ZWORK32(:,:,:)=GY_M_M(ZTHETAE,XDYY,XDZZ,XDZY)
+  ZWORK33(:,:,:)=GZ_M_M(ZTHETAE,XDZZ)
+  ZWORK34(:,:,:)= ZWORK31(:,:,:)*MZF(MYF(ZVOX(:,:,:)))     &
+                + ZWORK32(:,:,:)*MZF(MXF(ZVOY(:,:,:)))     &
+                + ZWORK33(:,:,:)*(MYF(MXF(ZVOZ(:,:,:))) + ZCORIOZ(:,:,:))
+  ZWORK34(:,:,:)=ZWORK34(:,:,:)*1E6/XRHODREF(:,:,:)
+  TZFIELD = TFIELDMETADATA(                              &
+    CMNHNAME   = 'POVOE',                                &
+    CSTDNAME   = '',                                     &
+    CLONGNAME  = 'POVOE',                                &
+    CUNITS     = 'PVU',                                  & ! 1 PVU = 1e-6 m^2 s^-1 K kg^-1
+    CDIR       = 'XY',                                   &
+    CCOMMENT   = 'X_Y_Z_Equivalent POtential VOrticity', &
+    NGRID      = 1,                                      &
+    NTYPE      = TYPEREAL,                               &
+    NDIMS      = 3,                                      &
+    LTIMEDEP   = .TRUE.                                  )
+  CALL IO_Field_write(TPFILE,TZFIELD,ZWORK34)
+!
+  IF (LMEAN_POVO) THEN
+    IWORK1(:,:)=0
+    ZWORK21(:,:)=0.
+    DO JK=IKB,IKE
+      WHERE((XPABST(:,:,JK)>XMEAN_POVO(1)).AND.(XPABST(:,:,JK)<XMEAN_POVO(2)))
+        ZWORK21(:,:)=ZWORK21(:,:)+ZWORK34(:,:,JK)
+        IWORK1(:,:)=IWORK1(:,:)+1
+      END WHERE
+    END DO
+    WHERE(IWORK1(:,:)>0) ZWORK21(:,:)=ZWORK21(:,:)/REAL( IWORK1(:,:) )
+    TZFIELD = TFIELDMETADATA(                                      &
+      CMNHNAME   = 'MEAN_POVOE',                                   &
+      CSTDNAME   = '',                                             &
+      CLONGNAME  = 'MEAN_POVOE',                                   &
+      CUNITS     = 'PVU',                                          & ! 1 PVU = 1e-6 m^2 s^-1 K kg^-1
+      CDIR       = 'XY',                                           &
+      CCOMMENT   = 'X_Y_Z_MEAN of Equivalent POtential VOrticity', &
+      NGRID      = 4,                                              &
+      NTYPE      = TYPEREAL,                                       &
+      NDIMS      = 2,                                              &
+      LTIMEDEP   = .TRUE.                                          )
+    CALL IO_Field_write(TPFILE,TZFIELD,ZWORK21)
+    DEALLOCATE(IWORK1)
+  END IF 
+  !
+END IF
+!
+! Equivalent Saturated Potential Vorticity in PV units
+IF (LMOIST_ES .AND. (NRR>0) ) THEN
+  ZWORK31(:,:,:)=GX_M_M(ZTHETAES,XDXX,XDZZ,XDZX)
+  ZWORK32(:,:,:)=GY_M_M(ZTHETAES,XDYY,XDZZ,XDZY)
+  ZWORK33(:,:,:)=GZ_M_M(ZTHETAES,XDZZ)
+  ZWORK34(:,:,:)= ZWORK31(:,:,:)*MZF(MYF(ZVOX(:,:,:)))     &
+                + ZWORK32(:,:,:)*MZF(MXF(ZVOY(:,:,:)))     &
+                + ZWORK33(:,:,:)*(MYF(MXF(ZVOZ(:,:,:))) + ZCORIOZ(:,:,:))
+  ZWORK34(:,:,:)=ZWORK34(:,:,:)*1E6/XRHODREF(:,:,:)
+  TZFIELD = TFIELDMETADATA(                                        &
+    CMNHNAME   = 'POVOES',                                         &
+    CSTDNAME   = '',                                               &
+    CLONGNAME  = 'POVOES',                                         &
+    CUNITS     = 'PVU',                                            & ! 1 PVU = 1e-6 m^2 s^-1 K kg^-1
+    CDIR       = 'XY',                                             &
+    CCOMMENT   = 'X_Y_Z_Equivalent Saturated POtential VOrticity', &
+    NGRID      = 1,                                                &
+    NTYPE      = TYPEREAL,                                         &
+    NDIMS      = 3,                                                &
+    LTIMEDEP   = .TRUE.                                            )
+  CALL IO_Field_write(TPFILE,TZFIELD,ZWORK34)
+ENDIF
+!
+!
+!-------------------------------------------------------------------------------
+!
+!* Horizontal divergence
+!
+IF (LDIV) THEN
+!
+  ZWORK31=GX_U_M(XUT,XDXX,XDZZ,XDZX) + GY_V_M(XVT,XDYY,XDZZ,XDZY)
+  TZFIELD = TFIELDMETADATA(                     &
+    CMNHNAME   = 'HDIV',                        &
+    CSTDNAME   = '',                            &
+    CLONGNAME  = 'HDIV',                        &
+    CUNITS     = 's-1',                         &
+    CDIR       = 'XY',                          &
+    CCOMMENT   = 'X_Y_Z_Horizontal DIVergence', &
+    NGRID      = 1,                             &
+    NTYPE      = TYPEREAL,                      &
+    NDIMS      = 3,                             &
+    LTIMEDEP   = .TRUE.                         )
+  CALL IO_Field_write(TPFILE,TZFIELD,ZWORK31)
+!
+  IF (LUSERV) THEN
+    TZFIELD = TFIELDMETADATA(                                    &
+      CMNHNAME   = 'HMDIV',                                      &
+      CSTDNAME   = '',                                           &
+      CLONGNAME  = 'HMDIV',                                      &
+      CUNITS     = 'kg m-3 s-1',                                 &
+      CDIR       = 'XY',                                         &
+      CCOMMENT   = 'X_Y_Z_Horizontal Moisture DIVergence HMDIV', &
+      NGRID      = 1,                                            &
+      NTYPE      = TYPEREAL,                                     &
+      NDIMS      = 3,                                            &
+      LTIMEDEP   = .TRUE.                                        )
+    ZWORK31=MXM(XRHODREF*XRT(:,:,:,1))*XUT
+    ZWORK32=MYM(XRHODREF*XRT(:,:,:,1))*XVT
+    ZWORK33=GX_U_M(ZWORK31,XDXX,XDZZ,XDZX) + GY_V_M(ZWORK32,XDYY,XDZZ,XDZY)
+    CALL IO_Field_write(TPFILE,TZFIELD,ZWORK33)
+  END IF
+!
+ENDIF
+!
+!-------------------------------------------------------------------------------
+!
+!* Clustering
+!
+IF (LCLSTR) THEN
+  GCLOUD(:,:,:)=.FALSE.
+  GBOTUP=LBOTUP
+  IF (CFIELD=='W') THEN
+  WHERE(XWT(:,:,:).GT.XTHRES) GCLOUD(:,:,:)=.TRUE.
+  END IF
+  IF (CFIELD=='CLOUD') THEN
+  WHERE((XRT(:,:,:,2)+XRT(:,:,:,4)+XRT(:,:,:,5)+XRT(:,:,:,6)).GT.XTHRES) GCLOUD(:,:,:)=.TRUE.
+  END IF
+  PRINT *,'CALL CLUSTERING COUNT(GCLOUD)=',COUNT(GCLOUD)
+  CALL CLUSTERING(GBOTUP,GCLOUD,XWT,ICLUSTERID,ICLUSTERLV,ZCLDSIZE)
+  PRINT *,'GOT OUT OF CLUSTERING'
+  !
+  TZFIELD = TFIELDMETADATA(                   &
+    CMNHNAME   = 'CLUSTERID',                 &
+    CSTDNAME   = '',                          &
+    CLONGNAME  = 'CLUSTERID',                 &
+    CUNITS     = '',                          &
+    CDIR       = 'XY',                        &
+    CCOMMENT   = 'X_Y_Z_CLUSTER (ID NUMBER)', &
+    NGRID      = 1,                           &
+    NTYPE      = TYPEINT,                     &
+    NDIMS      = 3,                           &
+    LTIMEDEP   = .TRUE.                       )
+  CALL IO_Field_write(TPFILE,TZFIELD,ICLUSTERID)
+  !
+  TZFIELD = TFIELDMETADATA(                           &
+    CMNHNAME   = 'CLUSTERLV',                         &
+    CSTDNAME   = '',                                  &
+    CLONGNAME  = 'CLUSTERLV',                         &
+    CUNITS     = '',                                  &
+    CDIR       = 'XY',                                &
+    CCOMMENT   = 'X_Y_Z_CLUSTER (BASE OR TOP LEVEL)', &
+    NGRID      = 1,                                   &
+    NTYPE      = TYPEINT,                             &
+    NDIMS      = 3,                                   &
+    LTIMEDEP   = .TRUE.                               )
+  CALL IO_Field_write(TPFILE,TZFIELD,ICLUSTERLV)
+  !
+  TZFIELD = TFIELDMETADATA(                      &
+    CMNHNAME   = 'CLDSIZE',                      &
+    CSTDNAME   = '',                             &
+    CLONGNAME  = 'CLDSIZE',                      &
+    CUNITS     = '',                             &
+    CDIR       = 'XY',                           &
+    CCOMMENT   = 'X_Y_Z_CLDSIZE (HOR. SECTION)', &
+    NGRID      = 1,                              &
+    NTYPE      = TYPEREAL,                       &
+    NDIMS      = 3,                              &
+    LTIMEDEP   = .TRUE.                          )
+  CALL IO_Field_write(TPFILE,TZFIELD,ZCLDSIZE)
+END IF
+!
+!-------------------------------------------------------------------------------
+!
+!* Geostrophic and Ageostrophic wind (m/s)
+!
+IF (LGEO .OR. LAGEO) THEN
+  ALLOCATE(ZPHI(IIU,IJU,IKU))
+  IF(CEQNSYS=='MAE' .OR. CEQNSYS=='DUR') THEN
+    ZPHI(:,:,:)=(XPABST(:,:,:)/XP00)**(XRD/XCPD)-XEXNREF(:,:,:)
+    !
+    ZPHI(1,1,:)=2*ZPHI(1,2,:)-ZPHI(1,3,:)
+    ZPHI(1,IJU,:)=2*ZPHI(1,IJU-1,:)-ZPHI(1,IJU-2,:)
+    ZPHI(IIU,1,:)=2*ZPHI(IIU,2,:)-ZPHI(IIU,3,:)
+    ZPHI(IIU,IJU,:)=2*ZPHI(IIU,IJU-1,:)-ZPHI(IIU,IJU-2,:)
+    ZWORK31(:,:,:)=-MXM(GY_M_M(ZPHI,XDYY,XDZZ,XDZY)*XCPD*XTHVREF/ZCORIOZ)
+    !
+    ZPHI(1,1,:)=2*ZPHI(2,1,:)-ZPHI(3,1,:)
+    ZPHI(IIU,1,:)=2*ZPHI(IIU-1,1,:)-ZPHI(IIU-2,1,:)
+    ZPHI(1,IJU,:)=2*ZPHI(2,IJU,:)-ZPHI(3,IJU,:)
+    ZPHI(IIU,IJU,:)=2*ZPHI(IIU-1,IJU,:)-ZPHI(IIU-2,IJU,:)
+    ZWORK32(:,:,:)=MYM(GX_M_M(ZPHI,XDXX,XDZZ,XDZX)*XCPD*XTHVREF/ZCORIOZ)
+  !
+  ELSE IF(CEQNSYS=='LHE') THEN
+    ZPHI(:,:,:)= ((XPABST(:,:,:)/XP00)**(XRD/XCPD)-XEXNREF(:,:,:))   &
+               * XCPD * XTHVREF(:,:,:)
+    !
+    ZPHI(1,1,:)=2*ZPHI(1,2,:)-ZPHI(1,3,:)
+    ZPHI(1,IJU,:)=2*ZPHI(1,IJU-1,:)-ZPHI(1,IJU-2,:)
+    ZPHI(IIU,1,:)=2*ZPHI(IIU,2,:)-ZPHI(IIU,3,:)
+    ZPHI(IIU,IJU,:)=2*ZPHI(IIU,IJU-1,:)-ZPHI(IIU,IJU-2,:)
+    ZWORK31(:,:,:)=-MXM(GY_M_M(ZPHI,XDYY,XDZZ,XDZY)/ZCORIOZ)
+    !
+    ZPHI(1,1,:)=2*ZPHI(2,1,:)-ZPHI(3,1,:)
+    ZPHI(IIU,1,:)=2*ZPHI(IIU-1,1,:)-ZPHI(IIU-2,1,:)
+    ZPHI(1,IJU,:)=2*ZPHI(2,IJU,:)-ZPHI(3,IJU,:)
+    ZPHI(IIU,IJU,:)=2*ZPHI(IIU-1,IJU,:)-ZPHI(IIU-2,IJU,:)
+    ZWORK32(:,:,:)=MYM(GX_M_M(ZPHI,XDXX,XDZZ,XDZX)/ZCORIOZ)
+  END IF
+  DEALLOCATE(ZPHI)
+!
+  IF (LGEO) THEN 
+    TZFIELD = TFIELDMETADATA(                               &
+      CMNHNAME   = 'UM88',                                  &
+      CSTDNAME   = '',                                      &
+      CLONGNAME  = 'UM88',                                  &
+      CUNITS     = 'm s-1',                                 &
+      CDIR       = 'XY',                                    &
+      CCOMMENT   = 'X_Y_Z_U component of GEOstrophic wind', &
+      NGRID      = 2,                                       &
+      NTYPE      = TYPEREAL,                                &
+      NDIMS      = 3,                                       &
+      LTIMEDEP   = .TRUE.                                   )
+    CALL IO_Field_write(TPFILE,TZFIELD,ZWORK31)
+! 
+    TZFIELD = TFIELDMETADATA(                               &
+      CMNHNAME   = 'VM88',                                  &
+      CSTDNAME   = '',                                      &
+      CLONGNAME  = 'VM88',                                  &
+      CUNITS     = 'm s-1',                                 &
+      CDIR       = 'XY',                                    &
+      CCOMMENT   = 'X_Y_Z_V component of GEOstrophic wind', &
+      NGRID      = 3,                                       &
+      NTYPE      = TYPEREAL,                                &
+      NDIMS      = 3,                                       &
+      LTIMEDEP   = .TRUE.                                   )
+    CALL IO_Field_write(TPFILE,TZFIELD,ZWORK32)
+    !
+    IF (LWIND_ZM) THEN
+      TZFIELD2(1) = TFIELDMETADATA(                         &
+        CMNHNAME   = 'UM88_ZM',                             &
+        CSTDNAME   = '',                                    &
+        CLONGNAME  = 'UM88_ZM',                             &
+        CUNITS     = 'm s-1',                               &
+        CDIR       = 'XY',                                  &
+        CCOMMENT   = 'Zonal component of GEOstrophic wind', &
+        NGRID      = 2,                                     &
+        NTYPE      = TYPEREAL,                              &
+        NDIMS      = 3,                                     &
+        LTIMEDEP   = .TRUE.                                 )
+      !
+      TZFIELD2(2) = TFIELDMETADATA(                            &
+        CMNHNAME   = 'VM88_ZM',                                &
+        CSTDNAME   = '',                                       &
+        CLONGNAME  = 'VM88_ZM',                                &
+        CUNITS     = 'm s-1',                                  &
+        CDIR       = 'XY',                                     &
+        CCOMMENT   = 'Meridian component of GEOstrophic wind', &
+        NGRID      = 3,                                        &
+        NTYPE      = TYPEREAL,                                 &
+        NDIMS      = 3,                                        &
+        LTIMEDEP   = .TRUE.                                    )
+      !
+      CALL UV_TO_ZONAL_AND_MERID(ZWORK31,ZWORK32,23,TPFILE=TPFILE,TZFIELDS=TZFIELD2)
+    ENDIF
+!
+! wm necessary to plot vertical cross sections of wind vectors
+    CALL FIND_FIELD_ID_FROM_MNHNAME('WT',IID,IRESP)
+    TZFIELD = TFIELDMETADATA( TFIELDLIST(IID) )
+    TZFIELD%CMNHNAME  = 'WM88'
+    TZFIELD%CLONGNAME = 'WM88'
+    CALL IO_Field_write(TPFILE,TZFIELD,XWT)
+  END IF
+!
+  IF (LAGEO) THEN
+    ZWORK31(:,:,:)=XUT(:,:,:)-ZWORK31(:,:,:)
+    ZWORK32(:,:,:)=XVT(:,:,:)-ZWORK32(:,:,:)
+    !
+    TZFIELD = TFIELDMETADATA(                                &
+      CMNHNAME   = 'UM89',                                   &
+      CSTDNAME   = '',                                       &
+      CLONGNAME  = 'UM89',                                   &
+      CUNITS     = 'm s-1',                                  &
+      CDIR       = 'XY',                                     &
+      CCOMMENT   = 'X_Y_Z_U component of AGEOstrophic wind', &
+      NGRID      = 2,                                        &
+      NTYPE      = TYPEREAL,                                 &
+      NDIMS      = 3,                                        &
+      LTIMEDEP   = .TRUE.                                    )
+    CALL IO_Field_write(TPFILE,TZFIELD,ZWORK31)
+    !
+    TZFIELD = TFIELDMETADATA(                                &
+      CMNHNAME   = 'VM89',                                   &
+      CSTDNAME   = '',                                       &
+      CLONGNAME  = 'VM89',                                   &
+      CUNITS     = 'm s-1',                                  &
+      CDIR       = 'XY',                                     &
+      CCOMMENT   = 'X_Y_Z_V component of AGEOstrophic wind', &
+      NGRID      = 3,                                        &
+      NTYPE      = TYPEREAL,                                 &
+      NDIMS      = 3,                                        &
+      LTIMEDEP   = .TRUE.                                    )
+    CALL IO_Field_write(TPFILE,TZFIELD,ZWORK32)
+    !
+    IF (LWIND_ZM) THEN
+      TZFIELD2(1) = TFIELDMETADATA(                          &
+        CMNHNAME   = 'UM89_ZM',                              &
+        CSTDNAME   = '',                                     &
+        CLONGNAME  = 'UM89_ZM',                              &
+        CUNITS     = 'm s-1',                                &
+        CDIR       = 'XY',                                   &
+        CCOMMENT   = 'Zonal component of AGEOstrophic wind', &
+        NGRID      = 2,                                      &
+        NTYPE      = TYPEREAL,                               &
+        NDIMS      = 3,                                      &
+        LTIMEDEP   = .TRUE.                                  )
+      !
+      TZFIELD2(2) = TFIELDMETADATA(                             &
+        CMNHNAME   = 'VM89_ZM',                                 &
+        CSTDNAME   = '',                                        &
+        CLONGNAME  = 'VM89_ZM',                                 &
+        CUNITS     = 'm s-1',                                   &
+        CDIR       = 'XY',                                      &
+        CCOMMENT   = 'Meridian component of AGEOstrophic wind', &
+        NGRID      = 3,                                         &
+        NTYPE      = TYPEREAL,                                  &
+        NDIMS      = 3,                                         &
+        LTIMEDEP   = .TRUE.                                     )
+      !
+      CALL UV_TO_ZONAL_AND_MERID(ZWORK31,ZWORK32,23,TPFILE=TPFILE,TZFIELDS=TZFIELD2)
+    ENDIF
+!
+! wm necessary to plot vertical cross sections of wind vectors
+    CALL FIND_FIELD_ID_FROM_MNHNAME('WT',IID,IRESP)
+    TZFIELD = TFIELDMETADATA( TFIELDLIST(IID) )
+    TZFIELD%CMNHNAME  = 'WM89'
+    TZFIELD%CLONGNAME = 'WM89'
+    CALL IO_Field_write(TPFILE,TZFIELD,XWT)
+  END IF
+!
+END IF
+!
+!-------------------------------------------------------------------------------
+!
+!* Contravariant wind field
+!
+!
+IF(LWIND_CONTRAV) THEN!$
+  CALL CONTRAV ((/"TEST","TEST"/),(/"TEST","TEST"/),XUT,XVT,XWT,XDXX,XDYY,XDZZ,XDZX,XDZY, &
+                ZWORK31,ZWORK32,ZWORK33,2)
+  !
+  TZFIELD = TFIELDMETADATA(                     &
+    CMNHNAME   = 'WNORM',                       &
+    CSTDNAME   = '',                            &
+    CLONGNAME  = 'WNORM',                       &
+    CUNITS     = 'm s-1',                       &
+    CDIR       = 'XY',                          &
+    CCOMMENT   = 'X_Y_Z_W surface normal wind', &
+    NGRID      = 4,                             &
+    NTYPE      = TYPEREAL,                      &
+    NDIMS      = 3,                             &
+    LTIMEDEP   = .TRUE.                         )
+  CALL IO_Field_write(TPFILE,TZFIELD,ZWORK33)
+END IF
+!-------------------------------------------------------------------------------
+!
+!* Mean Sea Level Pressure in hPa   
+!
+IF (LMSLP) THEN
+  ZGAMREF=-6.5E-3
+!  Exner function at the first mass point
+  ZWORK21(:,:) = (XPABST(:,:,IKB) /XP00)**(XRD/XCPD)
+!  virtual temperature at the first mass point
+  ZWORK21(:,:) = ZWORK21(:,:) * ZTHETAV(:,:,IKB)
+!  virtual temperature at ground level
+  ZWORK21(:,:) = ZWORK21(:,:) - ZGAMREF*((XZZ(:,:,IKB)+XZZ(:,:,IKB+1))/2.-XZS(:,:))
+!  virtual temperature at sea level
+  ZWORK22(:,:) = ZWORK21(:,:) - ZGAMREF*XZS(:,:)
+!  average underground virtual temperature
+  ZWORK22(:,:) = 0.5*(ZWORK21(:,:)+ZWORK22(:,:))
+!  surface pressure
+  ZWORK21(:,:) = ( XPABST(:,:,IKB) + XPABST(:,:,IKB-1) )*.5
+!  sea level pressure (hPa)
+  ZWORK22(:,:) = 1.E-2*ZWORK21(:,:)*EXP(XG*XZS(:,:)/(XRD*ZWORK22(:,:)))
+!
+  TZFIELD = TFIELDMETADATA(                     &
+    CMNHNAME   = 'MSLP',                        &
+    CSTDNAME   = 'air_pressure_at_sea_level',   &
+    CLONGNAME  = 'MSLP',                        &
+    CUNITS     = 'hPa',                         &
+    CDIR       = 'XY',                          &
+    CCOMMENT   = 'X_Y_Mean Sea Level Pressure', &
+    NGRID      = 1,                             &
+    NTYPE      = TYPEREAL,                      &
+    NDIMS      = 2,                             &
+    LTIMEDEP   = .TRUE.                         )
+  CALL IO_Field_write(TPFILE,TZFIELD,ZWORK22)
+END IF
+!-------------------------------------------------------------------------------
+!
+!* Vapor, cloud water and ice thickness
+!
+IF (LTHW) THEN
+!
+  ZWORK21(:,:) = 0.
+  IF(SIZE(XRT,4)>=1)THEN
+    DO JK = IKB,IKE
+      ZWORK21(:,:) = ZWORK21(:,:)+XRHODREF(:,:,JK)*XRT(:,:,JK,1) * &
+                     (XZZ(:,:,JK+1)-XZZ(:,:,JK))/XRHOLW
+    END DO
+    ZWORK21(:,:) = ZWORK21(:,:)*1000. ! vapor water in mm unit
+    TZFIELD = TFIELDMETADATA(                      &
+      CMNHNAME   = 'THVW',                         &
+      CSTDNAME   = '',                             &
+      CLONGNAME  = 'THVW',                         &
+      CUNITS     = 'mm',                           &
+      CDIR       = 'XY',                           &
+      CCOMMENT   = 'X_Y_THickness of Vapor Water', &
+      NGRID      = 1,                              &
+      NTYPE      = TYPEREAL,                       &
+      NDIMS      = 2,                              &
+      LTIMEDEP   = .TRUE.                          )
+    CALL IO_Field_write(TPFILE,TZFIELD,ZWORK21)
+  END IF
+  !
+  ZWORK21(:,:) = 0.
+  IF(SIZE(XRT,4)>=2)THEN
+    DO JK = IKB,IKE
+      ZWORK21(:,:) = ZWORK21(:,:)+XRHODREF(:,:,JK)*XRT(:,:,JK,2) * &
+                     (XZZ(:,:,JK+1)-XZZ(:,:,JK))/XRHOLW
+    END DO
+    ZWORK21(:,:) = ZWORK21(:,:)*1000. ! cloud water in mm unit
+    TZFIELD = TFIELDMETADATA(                      &
+      CMNHNAME   = 'THCW',                         &
+      CSTDNAME   = '',                             &
+      CLONGNAME  = 'THCW',                         &
+      CUNITS     = 'mm',                           &
+      CDIR       = 'XY',                           &
+      CCOMMENT   = 'X_Y_THickness of Cloud Water', &
+      NGRID      = 1,                              &
+      NTYPE      = TYPEREAL,                       &
+      NDIMS      = 2,                              &
+      LTIMEDEP   = .TRUE.                          )
+    CALL IO_Field_write(TPFILE,TZFIELD,ZWORK21)
+  END IF
+  !
+  ZWORK21(:,:) = 0.
+  IF(SIZE(XRT,4)>=3)THEN
+    DO JK = IKB,IKE
+      ZWORK21(:,:) = ZWORK21(:,:)+XRHODREF(:,:,JK)*XRT(:,:,JK,3) * &
+                     (XZZ(:,:,JK+1)-XZZ(:,:,JK))/XRHOLW
+    END DO
+    ZWORK21(:,:) = ZWORK21(:,:)*1000. ! rain water in mm unit
+    TZFIELD = TFIELDMETADATA(                     &
+      CMNHNAME   = 'THRW',                        &
+      CSTDNAME   = '',                            &
+      CLONGNAME  = 'THRW',                        &
+      CUNITS     = 'mm',                          &
+      CDIR       = 'XY',                          &
+      CCOMMENT   = 'X_Y_THickness of Rain Water', &
+      NGRID      = 1,                             &
+      NTYPE      = TYPEREAL,                      &
+      NDIMS      = 2,                             &
+      LTIMEDEP   = .TRUE.                         )
+    CALL IO_Field_write(TPFILE,TZFIELD,ZWORK21)
+  END IF
+  !
+  ZWORK21(:,:)   = 0.
+  IF(SIZE(XRT,4)>=4)THEN
+    DO JK = IKB,IKE
+      ZWORK21(:,:) = ZWORK21(:,:)+XRHODREF(:,:,JK)*XRT(:,:,JK,4) * &
+                   (XZZ(:,:,JK+1)-XZZ(:,:,JK))/XRHOLW
+    END DO
+    ZWORK21(:,:) = ZWORK21(:,:)*1000.   ! ice thickness in mm unit
+    TZFIELD = TFIELDMETADATA(              &
+      CMNHNAME   = 'THIC',                 &
+      CSTDNAME   = '',                     &
+      CLONGNAME  = 'THIC',                 &
+      CUNITS     = 'mm',                   &
+      CDIR       = 'XY',                   &
+      CCOMMENT   = 'X_Y_THickness of ICe', &
+      NGRID      = 1,                      &
+      NTYPE      = TYPEREAL,               &
+      NDIMS      = 2,                      &
+      LTIMEDEP   = .TRUE.                  )
+    CALL IO_Field_write(TPFILE,TZFIELD,ZWORK21)
+  END IF
+  !
+  ZWORK21(:,:)   = 0.
+  IF(SIZE(XRT,4)>=5)THEN
+    DO JK = IKB,IKE
+      ZWORK21(:,:) = ZWORK21(:,:)+XRHODREF(:,:,JK)*XRT(:,:,JK,5) * &
+                   (XZZ(:,:,JK+1)-XZZ(:,:,JK))/XRHOLW
+    END DO
+    ZWORK21(:,:) = ZWORK21(:,:)*1000.   ! snow thickness in mm unit
+    TZFIELD = TFIELDMETADATA(               &
+      CMNHNAME   = 'THSN',                  &
+      CSTDNAME   = '',                      &
+      CLONGNAME  = 'THSN',                  &
+      CUNITS     = 'mm',                    &
+      CDIR       = 'XY',                    &
+      CCOMMENT   = 'X_Y_THickness of SNow', &
+      NGRID      = 1,                       &
+      NTYPE      = TYPEREAL,                &
+      NDIMS      = 2,                       &
+      LTIMEDEP   = .TRUE.                   )
+    CALL IO_Field_write(TPFILE,TZFIELD,ZWORK21)
+  END IF
+  !
+  ZWORK21(:,:)   = 0.
+  IF(SIZE(XRT,4)>=6)THEN
+    DO JK = IKB,IKE
+      ZWORK21(:,:) = ZWORK21(:,:)+XRHODREF(:,:,JK)*XRT(:,:,JK,6) * &
+                   (XZZ(:,:,JK+1)-XZZ(:,:,JK))/XRHOLW
+    END DO
+    ZWORK21(:,:) = ZWORK21(:,:)*1000.   ! graupel thickness in mm unit
+    TZFIELD = TFIELDMETADATA(                  &
+      CMNHNAME   = 'THGR',                     &
+      CSTDNAME   = '',                         &
+      CLONGNAME  = 'THGR',                     &
+      CUNITS     = 'mm',                       &
+      CDIR       = 'XY',                       &
+      CCOMMENT   = 'X_Y_THickness of GRaupel', &
+      NGRID      = 1,                          &
+      NTYPE      = TYPEREAL,                   &
+      NDIMS      = 2,                          &
+      LTIMEDEP   = .TRUE.                      )
+    CALL IO_Field_write(TPFILE,TZFIELD,ZWORK21)
+  END IF
+  !
+  ZWORK21(:,:)   = 0.
+  IF(SIZE(XRT,4)>=7)THEN
+    DO JK = IKB,IKE
+      ZWORK21(:,:) = ZWORK21(:,:)+XRHODREF(:,:,JK)*XRT(:,:,JK,7) * &
+                   (XZZ(:,:,JK+1)-XZZ(:,:,JK))/XRHOLW
+    END DO
+    ZWORK21(:,:) = ZWORK21(:,:)*1000.   ! hail thickness in mm unit
+    TZFIELD = TFIELDMETADATA(               &
+      CMNHNAME   = 'THHA',                  &
+      CSTDNAME   = '',                      &
+      CLONGNAME  = 'THHA',                  &
+      CUNITS     = 'mm',                    &
+      CDIR       = 'XY',                    &
+      CCOMMENT   = 'X_Y_THickness of HAil', &
+      NGRID      = 1,                       &
+      NTYPE      = TYPEREAL,                &
+      NDIMS      = 2,                       &
+      LTIMEDEP   = .TRUE.                   )
+    CALL IO_Field_write(TPFILE,TZFIELD,ZWORK21)
+  END IF
+END IF
+!
+!-------------------------------------------------------------------------------
+!
+!* Accumulated and instantaneous total precip rates  in mm and mm/h
+!
+IF (LTOTAL_PR .AND. SIZE (XACPRR)>0 ) THEN
+  ZWORK21(:,:) = 0.
+  !
+  IF (LUSERR) THEN
+    ZWORK21(:,:) = XACPRR(:,:)*1E3      
+  END IF
+  IF (CCLOUD(1:3) == 'ICE' .OR. CCLOUD == 'C3R5' .OR. CCLOUD == 'LIMA') THEN
+    ZWORK21(:,:) = ZWORK21(:,:) + (XACPRS(:,:) + XACPRG(:,:))*1E3
+    IF (SIZE(XINPRC) /= 0 ) &         
+      ZWORK21(:,:) = ZWORK21(:,:) + XACPRC(:,:) *1E3
+    IF (SIZE(XINPRH) /= 0 ) &        
+      ZWORK21(:,:) = ZWORK21(:,:) + XACPRH(:,:) *1E3
+  END IF
+  IF (CCLOUD == 'C2R2' .OR. CCLOUD == 'C3R5' .OR. CCLOUD == 'KHKO' &
+                                             .OR. CCLOUD == 'LIMA' ) THEN
+    IF (SIZE(XINPRC) /= 0 ) &         
+      ZWORK21(:,:) = ZWORK21(:,:) + XACPRC(:,:) *1E3
+  END IF
+  IF (CDCONV /= 'NONE') THEN
+    ZWORK21(:,:) = ZWORK21(:,:) + XPACCONV(:,:)*1E3    
+  END IF
+  IF (LUSERR .OR. CCLOUD(1:3) == 'ICE' .OR. CCLOUD == 'C3R5' .OR. &
+                  CCLOUD == 'LIMA' .OR. CDCONV /= 'NONE') THEN
+    TZFIELD = TFIELDMETADATA(                                   &
+      CMNHNAME   = 'ACTOPR',                                    &
+      CSTDNAME   = '',                                          &
+      CLONGNAME  = 'ACTOPR',                                    &
+      CUNITS     = 'mm',                                        &
+      CDIR       = 'XY',                                        &
+      CCOMMENT   = 'X_Y_ACccumulated TOtal Precipitation Rate', &
+      NGRID      = 1,                                           &
+      NTYPE      = TYPEREAL,                                    &
+      NDIMS      = 2,                                           &
+      LTIMEDEP   = .TRUE.                                       )
+    CALL IO_Field_write(TPFILE,TZFIELD,ZWORK21)
+  ELSE
+    PRINT * ,'YOU WANT TO COMPUTE THE ACCUMULATED RAIN'
+    PRINT * ,'BUT NO RAIN IS PRESENT IN THE MODEL' 
+  END IF
+  ! 
+  ! calculation of the mean accumulated precipitations in the mesh-grid of a 
+  !large-scale model
+  IF (LMEAN_PR .AND. LUSERR) THEN
+    TZFIELD = TFIELDMETADATA(                                               &
+      CMNHNAME   = 'generic LS_ACTOPR',                                     & !Temporary name to ease identification
+      CUNITS     = 'mm',                                                    &
+      CDIR       = 'XY',                                                    &
+      CCOMMENT   = 'X_Y_Large Scale ACccumulated TOtal Precipitation Rate', &
+      NGRID      = 1,                                                       &
+      NTYPE      = TYPEREAL,                                                &
+      NDIMS      = 2,                                                       &
+      LTIMEDEP   = .TRUE.                                                   )
+    !
+    DO JK=1,SIZE(XMEAN_PR),2
+      IF (XMEAN_PR(JK) .NE. XUNDEF .AND. XMEAN_PR(JK+1) .NE. XUNDEF) THEN
+        PRINT * ,'MEAN accumulated RAIN: GRID ', XMEAN_PR(JK), XMEAN_PR(JK+1)
+        CALL COMPUTE_MEAN_PRECIP(ZWORK21,XMEAN_PR(JK:JK+1),ZWORK22,TZFIELD%NGRID)
+        !
+        JI=INT(XMEAN_PR(JK))
+        JJ=INT(XMEAN_PR(JK+1))
+        WRITE(TZFIELD%CMNHNAME,'(A9,2I2.2)')'LS_ACTOPR',JI,JJ
+        TZFIELD%CLONGNAME  = TRIM(TZFIELD%CMNHNAME)
+        CALL IO_Field_write(TPFILE,TZFIELD,ZWORK22)
+      END IF
+    END DO
+    !
+  END IF
+  !
+  !
+  ZWORK21(:,:) = 0.
+  !    
+  IF (LUSERR) THEN
+    ZWORK21(:,:) = XINPRR(:,:)*3.6E6      
+  END IF
+  IF (CCLOUD(1:3) == 'ICE' .OR. CCLOUD == 'C3R5' .OR. CCLOUD == 'LIMA') THEN
+    ZWORK21(:,:) = ZWORK21(:,:) + (XINPRS(:,:) + XINPRG(:,:))*3.6E6
+    IF (SIZE(XINPRC) /= 0 ) &      
+      ZWORK21(:,:) = ZWORK21(:,:) + XINPRC(:,:) *3.6E6       
+    IF (SIZE(XINPRH) /= 0 ) &      
+      ZWORK21(:,:) = ZWORK21(:,:) + XINPRH(:,:) *3.6E6       
+  END IF
+  IF (CCLOUD == 'C2R2' .OR. CCLOUD == 'C3R5' .OR. CCLOUD == 'KHKO' &
+                                             .OR. CCLOUD == 'LIMA' ) THEN
+    IF (SIZE(XINPRC) /= 0 ) &         
+      ZWORK21(:,:) = ZWORK21(:,:) + XINPRC(:,:) *3.6E6        
+  END IF
+  IF (CDCONV /= 'NONE') THEN
+    ZWORK21(:,:) = ZWORK21(:,:) + XPRCONV(:,:)*3.6E6  
+  END IF
+  IF (LUSERR .OR. CCLOUD(1:3) == 'ICE' .OR. CCLOUD == 'C3R5' .OR. &
+                  CCLOUD == 'LIMA' .OR. CDCONV /= 'NONE') THEN
+    TZFIELD = TFIELDMETADATA(                                    &
+      CMNHNAME   = 'INTOPR',                                     &
+      CSTDNAME   = '',                                           &
+      CLONGNAME  = 'INTOPR',                                     &
+      CUNITS     = 'mm hour-1',                                  &
+      CDIR       = 'XY',                                         &
+      CCOMMENT   = 'X_Y_INstantaneous TOtal Precipitation Rate', &
+      NGRID      = 1,                                            &
+      NTYPE      = TYPEREAL,                                     &
+      NDIMS      = 2,                                            &
+      LTIMEDEP   = .TRUE.                                        )
+    CALL IO_Field_write(TPFILE,TZFIELD,ZWORK21)
+  ELSE
+    PRINT * ,'YOU WANT TO COMPUTE THE RAIN RATE'
+    PRINT * ,'BUT NO RAIN IS PRESENT IN THE MODEL' 
+  END IF
+!
+  ! calculation of the mean instantaneous precipitations in the mesh-grid of a 
+  ! large-scale model
+  IF (LMEAN_PR .AND. LUSERR) THEN
+    CALL COMPUTE_MEAN_PRECIP(ZWORK21,XMEAN_PR,ZWORK22,TZFIELD%NGRID)
+!
+    TZFIELD = TFIELDMETADATA(                                                &
+      CMNHNAME   = 'LS_INTOPR',                                              &
+      CSTDNAME   = '',                                                       &
+      CLONGNAME  = 'LS_INTOPR',                                              &
+      CUNITS     = 'mm hour-1',                                              &
+      CDIR       = 'XY',                                                     &
+      CCOMMENT   = 'X_Y_Large Scale INstantaneous TOtal Precipitation Rate', &
+      NGRID      = 1,                                                        &
+      NTYPE      = TYPEREAL,                                                 &
+      NDIMS      = 2,                                                        &
+      LTIMEDEP   = .TRUE.                                                    )
+    CALL IO_Field_write(TPFILE,TZFIELD,ZWORK22)
+  END IF
+!
+END IF
+!
+!-------------------------------------------------------------------------------
+!
+!* CAPEMAX, CINMAX (corresponding to CAPEMAX), CAPE, CIN, DCAPE, VKE in J/kg
+!
+IF (NCAPE >=0 .AND. LUSERV) THEN
+   ZWORK31(:,:,:) = XRT(:,:,:,1) * 1000.  ! vapour mixing ratio in g/kg
+   ZWORK32(:,:,:)=0.0
+   ZWORK33(:,:,:)=0.0
+   ZWORK34(:,:,:)=0.0
+   CALL CALCSOUND( XPABST(:,:,IKB:IKE)* 0.01 ,ZTEMP(:,:,IKB:IKE)- XTT, &
+                   ZWORK31(:,:,IKB:IKE),                               &
+                   ZWORK32(:,:,IKB:IKE),ZWORK33(:,:,IKB:IKE),          &
+                   ZWORK34(:,:,IKB:IKE),ZWORK21,ZWORK22                )
+  !
+  TZFIELD = TFIELDMETADATA(                                          &
+    CMNHNAME   = 'CAPEMAX',                                          &
+    CSTDNAME   = '',                                                 &
+    CLONGNAME  = 'CAPEMAX',                                          &
+    CUNITS     = 'J kg-1',                                           &
+    CDIR       = 'XY',                                               &
+    CCOMMENT   = 'X_Y_MAX of Convective Available Potential Energy', &
+    NGRID      = 1,                                                  &
+    NTYPE      = TYPEREAL,                                           &
+    NDIMS      = 2,                                                  &
+    LTIMEDEP   = .TRUE.                                              )
+  CALL IO_Field_write(TPFILE,TZFIELD,ZWORK21)
+  !
+  TZFIELD = TFIELDMETADATA(                                 &
+    CMNHNAME   = 'CINMAX',                                  &
+    CSTDNAME   = '',                                        &
+    CLONGNAME  = 'CINMAX',                                  &
+    CUNITS     = 'J kg-1',                                  &
+    CDIR       = 'XY',                                      &
+    CCOMMENT   = 'X_Y_MAX of Convective INhibition energy', &
+    NGRID      = 1,                                         &
+    NTYPE      = TYPEREAL,                                  &
+    NDIMS      = 2,                                         &
+    LTIMEDEP   = .TRUE.                                     )
+  CALL IO_Field_write(TPFILE,TZFIELD,ZWORK22)
+  !
+  IF (NCAPE >=1) THEN
+    TZFIELD = TFIELDMETADATA(                                          &
+      CMNHNAME   = 'CAPE3D',                                           &
+      CSTDNAME   = 'atmosphere_convective_available_potential_energy', &
+      CLONGNAME  = 'CAPE3D',                                           &
+      CUNITS     = 'J kg-1',                                           &
+      CDIR       = 'XY',                                               &
+      CCOMMENT   = 'X_Y_Z_Convective Available Potential Energy',      &
+      NGRID      = 1,                                                  &
+      NTYPE      = TYPEREAL,                                           &
+      NDIMS      = 3,                                                  &
+      LTIMEDEP   = .TRUE.                                              )
+    CALL IO_Field_write(TPFILE,TZFIELD,ZWORK32)
+    !
+    TZFIELD = TFIELDMETADATA(                            &
+      CMNHNAME   = 'CIN3D',                              &
+      CSTDNAME   = 'atmosphere_convective_inhibition',   &
+      CLONGNAME  = 'CIN3D',                              &
+      CUNITS     = 'J kg-1',                             &
+      CDIR       = 'XY',                                 &
+      CCOMMENT   = 'X_Y_Z_Convective INhibition energy', &
+      NGRID      = 1,                                    &
+      NTYPE      = TYPEREAL,                             &
+      NDIMS      = 3,                                    &
+      LTIMEDEP   = .TRUE.                                )
+    CALL IO_Field_write(TPFILE,TZFIELD,ZWORK33)
+    !
+    TZFIELD = TFIELDMETADATA( &
+      CMNHNAME   = 'DCAPE3D', &
+      CSTDNAME   = '',        &
+      CLONGNAME  = 'DCAPE3D', &
+      CUNITS     = 'J kg-1',  &
+      CDIR       = 'XY',      &
+      CCOMMENT   = '',        &
+      NGRID      = 1,         &
+      NTYPE      = TYPEREAL,  &
+      NDIMS      = 3,         &
+      LTIMEDEP   = .TRUE.     )
+    CALL IO_Field_write(TPFILE,TZFIELD,ZWORK34)
+  END IF
+  !
+  IF (NCAPE >=2) THEN
+    ZWORK31(:,:,1:IKU-1)= 0.5*(XWT(:,:,1:IKU-1)+XWT(:,:,2:IKU))
+    ZWORK31(:,:,IKU)    = 0.
+    ZWORK31=0.5*ZWORK31**2
+    !
+    TZFIELD = TFIELDMETADATA(                       &
+      CMNHNAME   = 'VKE',                           &
+      CSTDNAME   = '',                              &
+      CLONGNAME  = 'VKE',                           &
+      CUNITS     = 'J kg-1',                        &
+      CDIR       = 'XY',                            &
+      CCOMMENT   = 'X_Y_Z_Vertical Kinetic Energy', &
+      NGRID      = 1,                               &
+      NTYPE      = TYPEREAL,                        &
+      NDIMS      = 3,                               &
+      LTIMEDEP   = .TRUE.                           )
+    CALL IO_Field_write(TPFILE,TZFIELD,ZWORK31)
+  END IF
+ENDIF
+!
+!-------------------------------------------------------------------------------
+!
+!* B-V frequency to assess thermal tropopause
+!
+IF (LBV_FR) THEN
+  ZWORK32(:,:,:)=DZM(XTHT(:,:,:))/ MZM(XTHT(:,:,:))
+  DO JK=1,IKU
+   DO JJ=1,IJU
+    DO JI=1,IIU
+      IF(ZWORK32(JI,JJ,JK)<0.) THEN
+        ZWORK31(JI,JJ,JK)= -1.*SQRT( ABS( XG*ZWORK32(JI,JJ,JK)/ XDZZ(JI,JJ,JK) ) )
+      ELSE
+        ZWORK31(JI,JJ,JK)= SQRT( ABS( XG*ZWORK32(JI,JJ,JK)/ XDZZ(JI,JJ,JK) ) )
+      END IF
+    ENDDO
+   ENDDO
+  ENDDO
+  !
+  TZFIELD = TFIELDMETADATA(                        &
+    CMNHNAME   = 'BV',                             &
+    CSTDNAME   = '',                               &
+    CLONGNAME  = 'BV',                             &
+    CUNITS     = 's-1',                            &
+    CDIR       = 'XY',                             &
+    CCOMMENT   = 'X_Y_Z_Brunt-Vaissala frequency', &
+    NGRID      = 4,                                &
+    NTYPE      = TYPEREAL,                         &
+    NDIMS      = 3,                                &
+    LTIMEDEP   = .TRUE.                            )
+  CALL IO_Field_write(TPFILE,TZFIELD,ZWORK31)
+!  
+  IF (NRR > 0) THEN
+    ZWORK32(:,:,:)=DZM(ZTHETAE(:,:,:))/ MZM(ZTHETAE(:,:,:))
+    DO JK=1,IKU
+     DO JJ=1,IJU
+      DO JI=1,IIU
+        IF (ZWORK32(JI,JJ,JK)<0.) THEN
+          ZWORK31(JI,JJ,JK)= -1.*SQRT( ABS( XG*ZWORK32(JI,JJ,JK)/ XDZZ(JI,JJ,JK) ) )
+        ELSE
+          ZWORK31(JI,JJ,JK)= SQRT( ABS( XG*ZWORK32(JI,JJ,JK)/ XDZZ(JI,JJ,JK) ) )
+        END IF
+      ENDDO
+     ENDDO
+    ENDDO
+!
+    TZFIELD = TFIELDMETADATA(                                   &
+      CMNHNAME   = 'BVE',                                       &
+      CSTDNAME   = '',                                          &
+      CLONGNAME  = 'BVE',                                       &
+      CUNITS     = 's-1',                                       &
+      CDIR       = 'XY',                                        &
+      CCOMMENT   = 'X_Y_Z_Equivalent Brunt-Vaissala frequency', &
+      NGRID      = 4,                                           &
+      NTYPE      = TYPEREAL,                                    &
+      NDIMS      = 3,                                           &
+      LTIMEDEP   = .TRUE.                                       )
+    CALL IO_Field_write(TPFILE,TZFIELD,ZWORK31)
+  END IF
+END IF
+!
+IF(ALLOCATED(ZTHETAE)) DEALLOCATE(ZTHETAE)
+IF(ALLOCATED(ZTHETAES)) DEALLOCATE(ZTHETAES)
+!-------------------------------------------------------------------------------
+!
+!* GPS synthetic ZTD, ZHD, ZWD 
+!
+IF ( NGPS>=0 ) THEN
+  !  surface temperature
+  ZGAMREF=-6.5E-3
+  ZWORK21(:,:) = ZTEMP(:,:,IKB) - ZGAMREF*((XZZ(:,:,IKB)+XZZ(:,:,IKB+1))/2.-XZS(:,:))
+  !
+  YFGRI=ADJUSTL(ADJUSTR(TPFILE%CNAME)//'GPS')
+  CALL GPS_ZENITH (YFGRI,XRT(:,:,:,1),ZTEMP,XPABST,ZWORK21,ZWORK22,ZWORK23,ZWORK24)    
+  !
+  TZFIELD = TFIELDMETADATA(                    &
+    CMNHNAME   = 'ZTD',                        &
+    CSTDNAME   = '',                           &
+    CLONGNAME  = 'ZTD',                        &
+    CUNITS     = 'm',                          &
+    CDIR       = 'XY',                         &
+    CCOMMENT   = 'X_Y_Z_Zenithal Total Delay', &
+    NGRID      = 1,                            &
+    NTYPE      = TYPEREAL,                     &
+    NDIMS      = 2,                            &
+    LTIMEDEP   = .TRUE.                        )
+  CALL IO_Field_write(TPFILE,TZFIELD,ZWORK22)
+  !
+  IF (NGPS>=1) THEN
+    TZFIELD = TFIELDMETADATA(                          &
+      CMNHNAME   = 'ZHD',                              &
+      CSTDNAME   = '',                                 &
+      CLONGNAME  = 'ZHD',                              &
+      CUNITS     = 'm',                                &
+      CDIR       = 'XY',                               &
+      CCOMMENT   = 'X_Y_Z_Zenithal Hydrostatic Delay', &
+      NGRID      = 1,                                  &
+      NTYPE      = TYPEREAL,                           &
+      NDIMS      = 2,                                  &
+      LTIMEDEP   = .TRUE.                              )
+    CALL IO_Field_write(TPFILE,TZFIELD,ZWORK23)
+    !
+    TZFIELD = TFIELDMETADATA(                  &
+      CMNHNAME   = 'ZWD',                      &
+      CSTDNAME   = '',                         &
+      CLONGNAME  = 'ZWD',                      &
+      CUNITS     = 'm',                        &
+      CDIR       = 'XY',                       &
+      CCOMMENT   = 'X_Y_Z_Zenithal Wet Delay', &
+      NGRID      = 1,                          &
+      NTYPE      = TYPEREAL,                   &
+      NDIMS      = 2,                          &
+      LTIMEDEP   = .TRUE.                      )
+    CALL IO_Field_write(TPFILE,TZFIELD,ZWORK24)
+    !
+  END IF
+  !
+END IF
+!
+!-------------------------------------------------------------------------------
+!
+!* Radar reflectivities
+!
+IF(LRADAR .AND. LUSERR) THEN
+! CASE  PREP_REAL_CASE after arome
+  IF (CCLOUD=='NONE' .OR. CCLOUD=='KESS') THEN
+    DEALLOCATE(XCIT)
+    ALLOCATE(XCIT(IIU,IJU,IKU))    
+    XCIT(:,:,:)=800.
+    CALL INI_RADAR('PLAT')
+  ELSE IF (CCLOUD=='LIMA') THEN
+    DEALLOCATE(XCIT)
+    ALLOCATE(XCIT(IIU,IJU,IKU))    
+    XCIT(:,:,:)=XSVT(:,:,:,NSV_LIMA_NI)
+    CALL INI_RADAR('PLAT')
+  END IF
+!       
+  IF (NVERSION_RAD == 1) THEN 
+! original version of radar diagnostics 
+      WRITE(ILUOUT0,*) 'radar diagnostics from RADAR_RAIN_ICE routine'
+    IF (CCLOUD=='LIMA') THEN
+      ALLOCATE( ZW1(SIZE(XSVT,1),SIZE(XSVT,2),SIZE(XSVT,3)) )
+      ALLOCATE( ZW2(SIZE(XSVT,1),SIZE(XSVT,2),SIZE(XSVT,3)) )
+      ALLOCATE( ZW3(SIZE(XSVT,1),SIZE(XSVT,2),SIZE(XSVT,3)) )
+      IF ( NMOM_S >= 2 ) ZW1(:,:,:)=XSVT(:,:,:,NSV_LIMA_NS)
+      IF ( NMOM_G >= 2 ) ZW2(:,:,:)=XSVT(:,:,:,NSV_LIMA_NG)
+      IF ( NMOM_H >= 2 ) ZW3(:,:,:)=XSVT(:,:,:,NSV_LIMA_NH)
+      CALL RADAR_RAIN_ICE( XRT, XCIT, XRHODREF, ZTEMP, ZWORK31, ZWORK32, &
+                           ZWORK33, ZWORK34,XSVT(:,:,:,NSV_LIMA_NR),     &
+                           ZW1(:,:,:), ZW2(:,:,:), ZW3(:,:,:) )
+      DEALLOCATE( ZW1, ZW2, ZW3 )
+    ELSE          
+      CALL RADAR_RAIN_ICE (XRT, XCIT, XRHODREF, ZTEMP, ZWORK31, ZWORK32, &
+                                                         ZWORK33, ZWORK34 )
+  ENDIF 
+!
+  TZFIELD = TFIELDMETADATA(                        &
+    CMNHNAME   = 'RARE',                           &
+    CSTDNAME   = 'equivalent_reflectivity_factor', &
+    CLONGNAME  = 'RARE',                           &
+    CUNITS     = 'dBZ',                            &
+    CDIR       = 'XY',                             &
+    CCOMMENT   = 'X_Y_Z_RAdar REflectivity',       &
+    NGRID      = 1,                                &
+    NTYPE      = TYPEREAL,                         &
+    NDIMS      = 3,                                &
+    LTIMEDEP   = .TRUE.                            )
+  CALL IO_Field_write(TPFILE,TZFIELD,ZWORK31)
+!
+  TZFIELD = TFIELDMETADATA(                        &
+    CMNHNAME   = 'VDOP',                           &
+    CSTDNAME   = '',                               &
+    CLONGNAME  = 'VDOP',                           &
+    CUNITS     = 'm s-1',                          &
+    CDIR       = 'XY',                             &
+    CCOMMENT   = 'X_Y_Z_radar DOPpler fall speed', &
+    NGRID      = 1,                                &
+    NTYPE      = TYPEREAL,                         &
+    NDIMS      = 3,                                &
+    LTIMEDEP   = .TRUE.                            )
+  CALL IO_Field_write(TPFILE,TZFIELD,ZWORK32)
+!
+  TZFIELD = TFIELDMETADATA(                               &
+    CMNHNAME   = 'ZDR',                                   &
+    CSTDNAME   = '',                                      &
+    CLONGNAME  = 'ZDR',                                   &
+    CUNITS     = 'dBZ',                                   &
+    CDIR       = 'XY',                                    &
+    CCOMMENT   = 'X_Y_Z_Differential polar Reflectivity', &
+    NGRID      = 1,                                       &
+    NTYPE      = TYPEREAL,                                &
+    NDIMS      = 3,                                       &
+    LTIMEDEP   = .TRUE.                                   )
+  CALL IO_Field_write(TPFILE,TZFIELD,ZWORK33)
+!
+  TZFIELD = TFIELDMETADATA(                               &
+    CMNHNAME   = 'KDP',                                   &
+    CSTDNAME   = '',                                      &
+    CLONGNAME  = 'KDP',                                   &
+    CUNITS     = 'degree km-1',                           &
+    CDIR       = 'XY',                                    &
+    CCOMMENT   = 'X_Y_Z_Differential Phase Reflectivity', &
+    NGRID      = 1,                                       &
+    NTYPE      = TYPEREAL,                                &
+    NDIMS      = 3,                                       &
+    LTIMEDEP   = .TRUE.                                   )
+  CALL IO_Field_write(TPFILE,TZFIELD,ZWORK34)
+!
+   ELSE 
+    !
+    WRITE(ILUOUT0,*) 'radar diagnostics from RADAR_SIMULATOR routine'
+    
+    NBRAD=COUNT(XLAT_RAD(:) /= XUNDEF)
+    NMAX=INT(NBSTEPMAX*XSTEP_RAD/XGRID)
+    IF(NBSTEPMAX*XSTEP_RAD/XGRID/=NMAX .AND. (LCART_RAD)) THEN
+      CALL PRINT_MSG(NVERB_FATAL,'GEN','WRITE_LFIFM1_FOR_DIAG', &
+                    'NBSTEPMAX*XSTEP_RAD/XGRID is not an integer; please choose another combination')
+    ENDIF
+    DO JI=1,NBRAD
+       NBELEV(JI)=COUNT(XELEV(JI,:) /= XUNDEF)
+       WRITE(ILUOUT0,*) 'Number of ELEVATIONS : ', NBELEV(JI), 'FOR RADAR:', JI
+    END DO
+    IIELV=MAXVAL(NBELEV(1:NBRAD))
+    WRITE(ILUOUT0,*) 'Maximum number of ELEVATIONS',IIELV
+    WRITE(ILUOUT0,*) 'YOU HAVE ASKED FOR ', NBRAD, 'RADARS'
+    !
+    IF (LCART_RAD) NBAZIM=8*NMAX  ! number of azimuths 
+    WRITE(ILUOUT0,*) ' Number of AZIMUTHS : ', NBAZIM
+    IF (LCART_RAD) THEN
+      ALLOCATE(ZWORK43(NBRAD,4*NMAX,2*NMAX))
+    ELSE
+      ALLOCATE(ZWORK43(1,NBAZIM,1))
+    END IF
+!! Some controls...
+    IF(NBRAD/=COUNT(XLON_RAD(:) /= XUNDEF).OR.NBRAD/=COUNT(XALT_RAD(:) /= XUNDEF).OR. &
+       NBRAD/=COUNT(XLAM_RAD(:) /= XUNDEF).OR.NBRAD/=COUNT(XDT_RAD(:) /= XUNDEF).OR. &
+       NBRAD/=COUNT(CNAME_RAD(:) /= "UNDEF")) THEN
+      CALL PRINT_MSG(NVERB_FATAL,'GEN','WRITE_LFIFM1_FOR_DIAG','inconsistency in DIAG1.nam')
+    END IF
+    IF(NCURV_INTERPOL==0.AND.(LREFR.OR.LDNDZ)) THEN
+      LREFR=.FALSE.
+      LDNDZ=.FALSE.
+      WRITE(ILUOUT0,*) "Warning: cannot output refractivity nor its vertical gradient when NCURV_INTERPOL=0"
+    END IF
+    IF(MOD(NPTS_H,2)==0) THEN
+      NPTS_H=NPTS_H+1
+      WRITE(ILUOUT0,*) "Warning: NPTS_H has to be ODD. Setting it to ",NPTS_H
+    END IF
+    IF(MOD(NPTS_V,2)==0) THEN
+      NPTS_V=NPTS_V+1
+      WRITE(ILUOUT0,*) "Warning: NPTS_V has to be ODD. Setting it to ",NPTS_V
+    END IF
+    IF(LWBSCS.AND.LWREFL) THEN
+      LWREFL=.FALSE.
+      WRITE(ILUOUT0,*) "Warning: LWREFL cannot be set to .TRUE. if LWBSCS is also set to .TRUE.. Setting LWREFL to .FALSE.."
+    END IF
+    IF(CCLOUD=="LIMA" .AND. NDIFF/=7) THEN
+      WRITE(YMSG,*) 'NDIFF=',NDIFF,' not available with CCLOUD=LIMA'
+      CALL PRINT_MSG(NVERB_FATAL,'GEN','WRITE_LFIFM1_FOR_DIAG',YMSG)
+    END IF
+    INBOUT=28 !28: Temperature + RHR, RHS, RHG, ZDA, ZDS, ZDG, KDR, KDS, KDG      
+    IF (CCLOUD=='LIMA') INBOUT=INBOUT+1 ! rain concentration CRT
+    IF(LREFR) INBOUT=INBOUT+1 !+refractivity
+    IF(LDNDZ) INBOUT=INBOUT+1 !+refractivity vertical gradient 
+    IF(LATT)  INBOUT=INBOUT+12 !+AER-AEG AVR-AVG (vertical specific attenuation) and ATR-ATG 
+    IF ( CCLOUD=='ICE4' ) THEN
+      INBOUT=INBOUT+5 ! HAIL ZEH RHH ZDH KDH M_H 
+      IF (LATT) THEN
+        INBOUT=INBOUT+3  ! AEH AVH ATH
+      ENDIF
+    END IF
+    WRITE(ILUOUT0,*) "Nombre de variables dans ZWORK42 en sortie de radar_simulator:",INBOUT
+
+    IF (LCART_RAD) THEN
+      ALLOCATE(ZWORK42(NBRAD,IIELV,2*NMAX,2*NMAX,INBOUT))
+    ELSE
+      ALLOCATE(ZWORK42(NBRAD,IIELV,NBAZIM,NBSTEPMAX+1,INBOUT))
+      ALLOCATE(ZWORK42_BIS(NBRAD,IIELV,NBAZIM,NBSTEPMAX+1,INBOUT))
+    END IF
+    !
+    IF (CCLOUD=='LIMA') THEN
+      CALL RADAR_SIMULATOR(XUT,XVT,XWT,XRT,XSVT(:,:,:,NSV_LIMA_NI),XRHODREF,&
+                      ZTEMP,XPABST,ZWORK42,ZWORK43,XSVT(:,:,:,NSV_LIMA_NR))
+    ELSE ! ICE3
+      CALL RADAR_SIMULATOR(XUT,XVT,XWT,XRT,XCIT,XRHODREF,ZTEMP,XPABSM,ZWORK42,ZWORK43)      
+    ENDIF
+    ALLOCATE(YRAD(INBOUT))
+    YRAD(1:8)=(/"ZHH","ZDR","KDP","CSR","ZER","ZEI","ZES","ZEG"/)
+    ICURR=9
+    IF (CCLOUD=='ICE4') THEN
+      YRAD(ICURR)="ZEH"
+      ICURR=ICURR+1      
+    END IF
+    YRAD(ICURR)="VRU"
+    ICURR=ICURR+1
+    IF(LATT) THEN
+      IF (CCLOUD=='ICE4') THEN
+        YRAD(ICURR:ICURR+14)=(/"AER","AEI","AES","AEG","AEH","AVR","AVI","AVS","AVG","AVH","ATR","ATI","ATS","ATG","ATH"/)
+        ICURR=ICURR+15
+      ELSE
+        YRAD(ICURR:ICURR+11)=(/"AER","AEI","AES","AEG","AVR","AVI","AVS","AVG","ATR","ATI","ATS","ATG"/)
+        ICURR=ICURR+12
+      END IF
+    END IF
+    YRAD(ICURR:ICURR+2)=(/"RHV","PDP","DHV"/)
+    ICURR=ICURR+3
+    YRAD(ICURR:ICURR+2)=(/"RHR","RHS","RHG"/)
+    ICURR=ICURR+3
+    IF (CCLOUD=='ICE4') THEN
+      YRAD(ICURR)="RHH"
+      ICURR=ICURR+1      
+    END IF
+    YRAD(ICURR:ICURR+2)=(/"ZDA","ZDS","ZDG"/)
+    ICURR=ICURR+3
+    IF (CCLOUD=='ICE4') THEN
+      YRAD(ICURR)="ZDH"
+      ICURR=ICURR+1      
+    END IF
+    YRAD(ICURR:ICURR+2)=(/"KDR","KDS","KDG"/)
+    ICURR=ICURR+3
+    IF (CCLOUD=='ICE4') THEN
+      YRAD(ICURR)="KDH"
+      ICURR=ICURR+1      
+    END IF
+    YRAD(ICURR:ICURR+4)=(/"HAS","M_R","M_I","M_S","M_G"/)
+    ICURR=ICURR+5
+    IF (CCLOUD=='ICE4') THEN
+      YRAD(ICURR)="M_H"
+      ICURR=ICURR+1      
+    END IF
+    YRAD(ICURR:ICURR+1)=(/"CIT","TEM"/)
+    ICURR=ICURR+2
+    IF (CCLOUD=='LIMA') THEN
+      YRAD(ICURR)="CRT"
+      ICURR=ICURR+1
+    ENDIF
+    IF(LREFR) THEN
+      YRAD(ICURR)="RFR"
+      ICURR=ICURR+1
+    END IF
+    IF(LDNDZ) THEN
+      YRAD(ICURR)="DNZ"
+      ICURR=ICURR+1
+    END IF
+    IF (LCART_RAD) THEN
+      DO JI=1,NBRAD
+        IEL=NBELEV(JI)
+        ! writing latlon in internal files 
+        ALLOCATE(CLATLON(2*NMAX))
+        CLATLON=""
+        DO JV=2*NMAX,1,-1
+          DO JH=1,2*NMAX
+            WRITE(CBUFFER,'(2(f8.3,1X))') ZWORK43(JI,2*JH-1,JV),ZWORK43(JI,2*JH,JV)
+                  CLATLON(JV)=TRIM(CLATLON(JV)) // " " // TRIM(CBUFFER)
+          END DO
+          CLATLON(JV)=TRIM(ADJUSTL(CLATLON(JV)))
+        END DO            
+        DO JEL=1,IEL
+          WRITE(YELEV,'(I2.2,A1,I1.1)') FLOOR(XELEV(JI,JEL)),'.',&
+                 INT(ANINT(10.*XELEV(JI,JEL))-10*INT(XELEV(JI,JEL)))
+          WRITE(YGRID_SIZE,'(I3.3)') 2*NMAX
+          DO JJ=1,SIZE(ZWORK42(:,:,:,:,:),5)
+            YRS=YRAD(JJ)//CNAME_RAD(JI)(1:3)//YELEV//YGRID_SIZE//TRIM(TPFILE%CNAME)
+            CALL IO_File_add2list(TZRSFILE,YRS,'TXT','WRITE',KRECL=8192)
+            CALL IO_File_open(TZRSFILE,HSTATUS='NEW')
+            ILURS = TZRSFILE%NLU
+            WRITE(ILURS,'(A,4F12.6,2I5)') '**domaine LATLON ',ZWORK43(JI,1,1),ZWORK43(JI,4*NMAX-1,2*NMAX), &
+                  ZWORK43(JI,2,1),ZWORK43(JI,4*NMAX,2*NMAX),2*NMAX,2*NMAX !! HEADER
+            DO JV=2*NMAX,1,-1
+              DO JH=1,2*NMAX
+                WRITE(ILURS,'(E11.5,1X)',ADVANCE='NO') ZWORK42(JI,JEL,JH,JV,JJ)
+              END DO
+              WRITE(ILURS,*) ''
+            END DO
+                  
+            DO JV=2*NMAX,1,-1
+              WRITE(ILURS,*) CLATLON(JV)
+            END DO                  
+            CALL IO_File_close(TZRSFILE)
+            TZRSFILE => NULL()
+          END DO               
+        END DO
+        DEALLOCATE(CLATLON)
+      END DO
+    ELSE ! polar output
+       CALL MPI_ALLREDUCE(ZWORK42, ZWORK42_BIS, SIZE(ZWORK42), MNHREAL_MPI, MPI_MAX, NMNH_COMM_WORLD, IERR)
+      DO JI=1,NBRAD
+        IEL=NBELEV(JI)
+        DO JEL=1,IEL
+          WRITE(YELEV,'(I2.2,A1,I1.1)') FLOOR(XELEV(JI,JEL)),'.',&
+                INT(ANINT(10.*XELEV(JI,JEL))-10*INT(XELEV(JI,JEL)))
+          DO JJ=1,SIZE(ZWORK42(:,:,:,:,:),5)
+            YRS="P"//YRAD(JJ)//CNAME_RAD(JI)(1:3)//YELEV//TRIM(TPFILE%CNAME)
+            CALL IO_File_add2list(TZRSFILE,YRS,'TXT','WRITE')
+            CALL IO_File_open(TZRSFILE)
+            ILURS = TZRSFILE%NLU
+            DO JH=1,NBAZIM
+              DO JV=1,NBSTEPMAX+1
+                WRITE(ILURS,"(F15.7)") ZWORK42_BIS(JI,JEL,JH,JV,JJ)
+              END DO
+            END DO                                    
+            CALL IO_File_close(TZRSFILE)
+            TZRSFILE => NULL()
+          END DO
+        END DO
+      END DO
+    END IF !polar output
+    DEALLOCATE(ZWORK42,ZWORK43)
+   END IF
+END IF
+!
+IF (LLIDAR) THEN
+  PRINT *,'CALL LIDAR/RADAR with TPFILE%CNAME =',TPFILE%CNAME
+  YVIEW='     '
+  YVIEW=TRIM(CVIEW_LIDAR)
+  PRINT *,'CVIEW_LIDAR REQUESTED ',YVIEW
+  IF (YVIEW/='NADIR'.AND.YVIEW/='ZENIT') YVIEW='NADIR'
+  PRINT *,'CVIEW_LIDAR USED ',YVIEW
+  PRINT *,'XALT_LIDAR REQUESTED (m) ',XALT_LIDAR
+  PRINT *,'XWVL_LIDAR REQUESTED (m) ',XWVL_LIDAR
+  IF (XWVL_LIDAR==XUNDEF) XWVL_LIDAR=0.532E-6
+  IF (XWVL_LIDAR<1.E-7.OR.XWVL_LIDAR>2.E-6) THEN
+    PRINT *,'CAUTION: THE XWVL_LIDAR REQUESTED IS OUTSIDE THE USUAL RANGE'
+    XWVL_LIDAR=0.532E-6
+  ENDIF
+  PRINT *,'XWVL_LIDAR USED (m) ',XWVL_LIDAR
+!
+  IF (LDUST) THEN
+    IACCMODE=MIN(2,NMODE_DST)
+    ALLOCATE(ZTMP1(SIZE(XSVT,1), SIZE(XSVT,2), SIZE(XSVT,3), 1))
+    ALLOCATE(ZTMP2(SIZE(XSVT,1), SIZE(XSVT,2), SIZE(XSVT,3), 1))
+    ALLOCATE(ZTMP3(SIZE(XSVT,1), SIZE(XSVT,2), SIZE(XSVT,3), 1))
+    ZTMP1(:,:,:,1)=ZN0_DST(:,:,:,IACCMODE)
+    ZTMP2(:,:,:,1)=ZRG_DST(:,:,:,IACCMODE)
+    ZTMP3(:,:,:,1)=ZSIG_DST(:,:,:,IACCMODE)
+    SELECT CASE ( CCLOUD )
+    CASE('KESS''ICE3','ICE4')
+      CALL LIDAR(CCLOUD, YVIEW, XALT_LIDAR, XWVL_LIDAR, XZZ, XRHODREF, ZTEMP, XCLDFR, &
+                 XRT, ZWORK31, ZWORK32,                                        &
+                 PDSTC=ZTMP1,                                                  &
+                 PDSTD=ZTMP2,                                                  &
+                 PDSTS=ZTMP3)
+    CASE('C2R2')
+      CALL LIDAR(CCLOUD, YVIEW, XALT_LIDAR, XWVL_LIDAR, XZZ, XRHODREF, ZTEMP, XCLDFR, &
+                 XRT, ZWORK31, ZWORK32,                                        &
+                 PCT=XSVT(:,:,:,NSV_C2R2BEG+1:NSV_C2R2END),                    &
+                 PDSTC=ZTMP1,                                                  &
+                 PDSTD=ZTMP2,                                                  &
+                 PDSTS=ZTMP3)
+    CASE('C3R5')
+      CALL LIDAR(CCLOUD, YVIEW, XALT_LIDAR, XWVL_LIDAR, XZZ, XRHODREF, ZTEMP, XCLDFR, &
+                 XRT, ZWORK31, ZWORK32,                                        &
+                 PCT=XSVT(:,:,:,NSV_C2R2BEG+1:NSV_C1R3END-1),                  &
+                 PDSTC=ZTMP1,                                                  &
+                 PDSTD=ZTMP2,                                                  &
+                 PDSTS=ZTMP3)
+    CASE('LIMA')
+! PCT(2) = droplets (3)=drops (4)=ice crystals
+       ALLOCATE(ZTMP4(SIZE(XSVT,1), SIZE(XSVT,2), SIZE(XSVT,3), 4))
+       ZTMP4(:,:,:,1)=0.
+       ZTMP4(:,:,:,2)=XSVT(:,:,:,NSV_LIMA_NC)
+       ZTMP4(:,:,:,3)=XSVT(:,:,:,NSV_LIMA_NR)
+       ZTMP4(:,:,:,4)=XSVT(:,:,:,NSV_LIMA_NI)
+!
+       CALL LIDAR(CCLOUD, YVIEW, XALT_LIDAR, XWVL_LIDAR, XZZ, XRHODREF, ZTEMP, MAX(XCLDFR,XICEFR),&
+            XRT, ZWORK31, ZWORK32,                                  &
+            PCT=ZTMP4,                            &
+            PDSTC=ZTMP1,                          &
+            PDSTD=ZTMP2,                          &
+            PDSTS=ZTMP3)
+!
+    END SELECT
+  ELSE
+    SELECT CASE ( CCLOUD )
+    CASE('KESS','ICE3','ICE4')
+      CALL LIDAR(CCLOUD, YVIEW, XALT_LIDAR, XWVL_LIDAR, XZZ, XRHODREF, ZTEMP, XCLDFR, &
+           XRT, ZWORK31, ZWORK32)
+    CASE('C2R2')
+      CALL LIDAR(CCLOUD, YVIEW, XALT_LIDAR, XWVL_LIDAR, XZZ, XRHODREF, ZTEMP, XCLDFR, &
+           XRT, ZWORK31, ZWORK32,                                  &
+           PCT=XSVT(:,:,:,NSV_C2R2BEG+1:NSV_C2R2END))
+    CASE('C3R5')
+      CALL LIDAR(CCLOUD, YVIEW, XALT_LIDAR, XWVL_LIDAR, XZZ, XRHODREF, ZTEMP, XCLDFR, &
+           XRT, ZWORK31, ZWORK32,                                  &
+           PCT=XSVT(:,:,:,NSV_C2R2BEG+1:NSV_C1R3END-1))
+    CASE('LIMA')
+! PCT(2) = droplets (3)=drops (4)=ice crystals
+       ALLOCATE(ZTMP4(SIZE(XSVT,1), SIZE(XSVT,2), SIZE(XSVT,3), 4))
+       ZTMP4(:,:,:,1)=0.
+       ZTMP4(:,:,:,2)=XSVT(:,:,:,NSV_LIMA_NC)
+       ZTMP4(:,:,:,3)=XSVT(:,:,:,NSV_LIMA_NR)
+       ZTMP4(:,:,:,4)=XSVT(:,:,:,NSV_LIMA_NI)
+!
+       CALL LIDAR(CCLOUD, YVIEW, XALT_LIDAR, XWVL_LIDAR, XZZ, XRHODREF, ZTEMP, MAX(XCLDFR,XICEFR),&
+            XRT, ZWORK31, ZWORK32,                                  &
+            PCT=ZTMP4)
+    END SELECT
+  ENDIF
+!
+  IF( ALLOCATED(ZTMP1) ) DEALLOCATE(ZTMP1)
+  IF( ALLOCATED(ZTMP2) ) DEALLOCATE(ZTMP2)
+  IF( ALLOCATED(ZTMP3) ) DEALLOCATE(ZTMP3)
+  IF( ALLOCATED(ZTMP4) ) DEALLOCATE(ZTMP4)
+!
+  TZFIELD = TFIELDMETADATA(                        &
+    CMNHNAME   = 'LIDAR',                          &
+    CSTDNAME   = '',                               &
+    CLONGNAME  = 'LIDAR',                          &
+    CUNITS     = 'm-1 sr-1',                       &
+    CDIR       = 'XY',                             &
+    CCOMMENT   = 'X_Y_Z_Normalized_Lidar_Profile', &
+    NGRID      = 1,                                &
+    NTYPE      = TYPEREAL,                         &
+    NDIMS      = 3,                                &
+    LTIMEDEP   = .TRUE.                            )
+  CALL IO_Field_write(TPFILE,TZFIELD,ZWORK31)
+!
+  TZFIELD = TFIELDMETADATA(                      &
+    CMNHNAME   = 'LIPAR',                        &
+    CSTDNAME   = '',                             &
+    CLONGNAME  = 'LIPAR',                        &
+    CUNITS     = 'm-1 sr-1',                     &
+    CDIR       = 'XY',                           &
+    CCOMMENT   = 'X_Y_Z_Particle_Lidar_Profile', &
+    NGRID      = 1,                              &
+    NTYPE      = TYPEREAL,                       &
+    NDIMS      = 3,                              &
+    LTIMEDEP   = .TRUE.                          )
+  CALL IO_Field_write(TPFILE,TZFIELD,ZWORK32)
+!
+END IF
+!
+!-------------------------------------------------------------------------------
+!
+!* Height of boundary layer
+!
+IF (CBLTOP == 'THETA') THEN
+  !
+  ! methode de la parcelle
+  !
+  ALLOCATE(ZSHMIX(IIU,IJU))
+
+  ZWORK31(:,:,1:IKU-1)=0.5*(XZZ(:,:,1:IKU-1)+XZZ(:,:,2:IKU))
+  ZWORK31(:,:,IKU)=2.*ZWORK31(:,:,IKU-1)-ZWORK31(:,:,IKU-2)
+  ZWORK21(:,:) = ZTHETAV(:,:,IKB)+0.5
+  ZSHMIX(:,:)  = 0.0
+  DO JJ=1,IJU
+    DO JI=1,IIU 
+      DO JK=IKB,IKE
+        IF ( ZTHETAV(JI,JJ,JK).GT.ZWORK21(JI,JJ) ) THEN
+          ZSHMIX(JI,JJ) =  ZWORK31(JI,JJ,JK-1)  &
+                        +( ZWORK31(JI,JJ,JK) - ZWORK31 (JI,JJ,JK-1) )  &
+                        /( ZTHETAV(JI,JJ,JK) - ZTHETAV(JI,JJ,JK-1) )  &
+                        *( ZWORK21(JI,JJ)    - ZTHETAV(JI,JJ,JK-1) )
+          EXIT
+        END IF
+      END DO
+    END DO
+  END DO
+  ZSHMIX(:,:)=ZSHMIX(:,:)-XZS(:,:)
+  ZSHMIX(:,:)=MAX(ZSHMIX(:,:),50.0)
+  !
+  TZFIELD = TFIELDMETADATA(                             &
+    CMNHNAME   = 'HBLTOP',                              &
+    CSTDNAME   = 'atmosphere_boundary_layer_thickness', &
+    CLONGNAME  = 'HBLTOP',                              &
+    CUNITS     = 'm',                                   &
+    CDIR       = 'XY',                                  &
+    CCOMMENT   = 'Height of Boundary Layer TOP',        &
+    NGRID      = 1,                                     &
+    NTYPE      = TYPEREAL,                              &
+    NDIMS      = 2,                                     &
+    LTIMEDEP   = .TRUE.                                 )
+  CALL IO_Field_write(TPFILE,TZFIELD,ZSHMIX)
+  !
+  DEALLOCATE(ZSHMIX)
+ELSEIF (CBLTOP == 'RICHA') THEN
+  !
+  ! methode du "bulk Richardson number"
+  !
+  ALLOCATE(ZRIB(IIU,IJU,IKU))
+  ALLOCATE(ZSHMIX(IIU,IJU))
+
+  ZWORK31(:,:,1:IKU-1)=0.5*(XZZ(:,:,1:IKU-1)+XZZ(:,:,2:IKU))
+  ZWORK31(:,:,IKU)=2.*ZWORK31(:,:,IKU-1)-ZWORK31(:,:,IKU-2)
+  ZWORK32=MXF(XUT)
+  ZWORK33=MYF(XVT)
+  ZWORK34=ZWORK32**2+ZWORK33**2
+  DO JK=IKB,IKE  
+    ZRIB(:,:,JK)=XG*ZWORK31(:,:,JK)*(ZTHETAV(:,:,JK)-ZTHETAV(:,:,IKB))/(ZTHETAV(:,:,IKB)*ZWORK34(:,:,JK))
+  ENDDO
+  ZSHMIX=0.0
+  DO JJ=1,IJU
+    DO JI=1,IIU 
+      DO JK=IKB,IKE
+        IF ( ZRIB(JI,JJ,JK).GT.0.25 ) THEN
+          ZSHMIX(JI,JJ) = ZWORK31(JI,JJ,JK-1)  &
+                        +( ZWORK31(JI,JJ,JK) - ZWORK31(JI,JJ,JK-1) )  &
+                        *( 0.25 - ZRIB(JI,JJ,JK-1) )  &
+                        /( ZRIB(JI,JJ,JK)    - ZRIB(JI,JJ,JK-1) )
+          EXIT
+        END IF
+      END DO
+    END DO
+  END DO
+  ZSHMIX(:,:)=ZSHMIX(:,:)-XZS(:,:)
+  !
+  TZFIELD = TFIELDMETADATA(                             &
+    CMNHNAME   = 'HBLTOP',                              &
+    CSTDNAME   = 'atmosphere_boundary_layer_thickness', &
+    CLONGNAME  = 'HBLTOP',                              &
+    CUNITS     = 'm',                                   &
+    CDIR       = 'XY',                                  &
+    CCOMMENT   = 'Height of Boundary Layer TOP',        &
+    NGRID      = 1,                                     &
+    NTYPE      = TYPEREAL,                              &
+    NDIMS      = 2,                                     &
+    LTIMEDEP   = .TRUE.                                 )
+  CALL IO_Field_write(TPFILE,TZFIELD,ZSHMIX)
+  !
+  DEALLOCATE(ZRIB,ZSHMIX)
+ENDIF
+!
+IF (ALLOCATED(ZTHETAV)) DEALLOCATE(ZTHETAV)
+!
+!
+!* Ligthning
+!
+IF ( LCH_CONV_LINOX ) THEN 
+  CALL IO_Field_write(TPFILE,'IC_RATE',    XIC_RATE)
+  CALL IO_Field_write(TPFILE,'CG_RATE',    XCG_RATE)
+  CALL IO_Field_write(TPFILE,'IC_TOTAL_NB',XIC_TOTAL_NUMBER)
+  CALL IO_Field_write(TPFILE,'CG_TOTAL_NB',XCG_TOTAL_NUMBER)
+END IF
+!-------------------------------------------------------------------------------
+!-------------------------------------------------------------------------------
+!
+!*       1.8    My own  variables :
+!
+!-------------------------------------------------------------------------------
+!-------------------------------------------------------------------------------
+!
+!-------------------------------------------------------------------------------
+END SUBROUTINE WRITE_LFIFM1_FOR_DIAG  
diff --git a/src/PHYEX/ext/write_lfifm1_for_diag_supp.f90 b/src/PHYEX/ext/write_lfifm1_for_diag_supp.f90
new file mode 100644
index 0000000000000000000000000000000000000000..380dc9fd629a10d16c344098535ea0a109226bd3
--- /dev/null
+++ b/src/PHYEX/ext/write_lfifm1_for_diag_supp.f90
@@ -0,0 +1,1664 @@
+!MNH_LIC Copyright 2000-2023 CNRS, Meteo-France and Universite Paul Sabatier
+!MNH_LIC This is part of the Meso-NH software governed by the CeCILL-C licence
+!MNH_LIC version 1. See LICENSE, CeCILL-C_V1-en.txt and CeCILL-C_V1-fr.txt
+!MNH_LIC for details. version 1.
+!-----------------------------------------------------------------
+!     ######################################
+      MODULE MODI_WRITE_LFIFM1_FOR_DIAG_SUPP
+!     ######################################
+INTERFACE
+!
+   SUBROUTINE WRITE_LFIFM1_FOR_DIAG_SUPP(TPFILE)
+!
+USE MODD_IO, ONLY: TFILEDATA
+!
+!*       0.1   Declarations of arguments
+!
+TYPE(TFILEDATA),   INTENT(IN) :: TPFILE ! Output file
+!
+END SUBROUTINE WRITE_LFIFM1_FOR_DIAG_SUPP
+!
+END INTERFACE
+!
+END MODULE MODI_WRITE_LFIFM1_FOR_DIAG_SUPP
+!
+!     ##############################################
+      SUBROUTINE WRITE_LFIFM1_FOR_DIAG_SUPP(TPFILE)
+!     ##############################################
+!
+!!****  *WRITE_LFIFM1_FOR_DIAG_SUPP* - write records in the diag file
+!!
+!!    PURPOSE
+!!    -------
+!        The purpose of this routine is to write in the file
+!     of name YFMFILE//'.lfi' with the FM routines.  
+!
+!!**  METHOD
+!!    ------
+!!      The data are written in the LFIFM file :
+!!        - diagnostics from the convection
+!!        - diagnostics from the radiatif transfer code
+!!
+!!      The localization on the model grid is also indicated :
+!!        IGRID = 1 for mass grid point
+!!        IGRID = 2 for U grid point
+!!        IGRID = 3 for V grid point
+!!        IGRID = 4 for w grid point
+!!        IGRID = 0 for meaningless case
+!!
+!!    EXTERNAL
+!!    --------
+!!      FMWRIT : FM-routine to write a record
+!!
+!!
+!!    IMPLICIT ARGUMENTS
+!!    ------------------
+!!
+!!    REFERENCE
+!!    ---------
+!!
+!!    AUTHOR
+!!    ------
+!!  	J. Stein   *Meteo France* 
+!!
+!!    MODIFICATIONS
+!!    -------------
+!!      Original    13/09/00
+!!      N. Asencio  15/09/00 computation of temperature and height of clouds is moved
+!!                           here and deleted in WRITE_LFIFM1_FOR_DIAG routine
+!!      I. Mallet   02/11/00 add the call to RADTR_SATEL
+!!      J.-P. Chaboureau 11/12/03 add call the CALL_RTTOV (table NRTTOVINFO to
+!!              choose the platform, the satellite, the sensor for all channels 
+!!              (see the table in rttov science and validation report) and the
+!!              type of calculations in the namelist: 0 = tb, 1 = tb + jacobian,
+!!              2 = tb + adjoint, 3 = tb + jacobian + adjoint)
+!!      V. Masson   01/2004  removes surface (externalization)
+!!      October 2009 (G. Tanguy) add ILENCH=LEN(YCOMMENT) after
+!!                                              change of YCOMMENT
+!!      October 2011 (C.Lac) FF10MAX  : interpolation of 10m wind
+!!        between 2 Meso-NH levels if 10m is above the first atmospheric level
+!!      2015 : D.Ricard add UM10/VM10 for LCARTESIAN=T cases
+!!      J.Escobar : 15/09/2015 : WENO5 & JPHEXT <> 1 
+!!      P.Tulet : Diag for salt and orilam
+!!      J.-P. Chaboureau 07/03/2016 fix the dimensions of local arrays
+!!      P.Wautelet : 11/07/2016 : removed MNH_NCWRIT define
+!!      J.-P. Chaboureau 31/10/2016 add the call to RTTOV11
+!!      F. Brosse 10/2016 add chemical production destruction terms outputs
+!!      M.Leriche 01/07/2017 Add DIAG chimical surface fluxes
+!!      J.-P. Chaboureau 01/2018 add altitude interpolation
+!!      J.-P. Chaboureau 01/2018 add coarse graining
+!!  Philippe Wautelet: 05/2016-04/2018: new data structures and calls for I/O
+!!      J.-P. Chaboureau 07/2018 bug fix on XEMIS when calling CALL_RTTOVxx
+!!      J.-P. Chaboureau 09/04/2021 add the call to RTTOV13
+!  P. Wautelet 04/02/2022: use TSVLIST to manage metadata of scalar variables
+!!      D. Ricard & Q.Rodier 08/2023 add some diagnostics on pressure levels 
+!!     (temperature, relative and specific humidity, vertical velocity, TKE)
+!!      D. Ricard 08/2023 add a diagnostic: maximum of cloud fraction on vertical levels
+!-------------------------------------------------------------------------------
+!
+!*       0.    DECLARATIONS
+!              ------------
+!
+USE MODD_CH_AEROSOL,        ONLY: LORILAM
+USE MODD_CH_BUDGET_n,       ONLY: CNAMES_BUDGET, NEQ_BUDGET, XTCHEM
+USE MODD_CH_FLX_n,          ONLY: XCHFLX
+USE MODD_CH_PRODLOSSTOT_n,  ONLY: CNAMES_PRODLOSST, NEQ_PLT, XLOSS, XPROD
+USE MODD_CST,               ONLY: XCPD, XP00, XRD, XTT, XMV, XMD, XALPI, XGAMI, XBETAI
+USE MODD_CURVCOR_n,         ONLY: XCORIOZ
+USE MODD_DIAG_IN_RUN,       ONLY: XCURRENT_ZON10M, XCURRENT_MER10M,           &
+                                  XCURRENT_SFCO2, XCURRENT_SWD, XCURRENT_LWD, &
+                                  XCURRENT_SWU, XCURRENT_LWU
+USE MODD_DUST,              ONLY: LDUST
+use modd_field,             only: NMNHDIM_NI, NMNHDIM_NJ, NMNHDIM_NOTLISTED, NMNHDIM_UNUSED, &
+                                  tfieldmetadata, tfieldlist, TYPEINT, TYPEREAL
+use modd_field
+USE MODD_IO,                ONLY: TFILEDATA
+USE MODD_CONF,              ONLY: LCARTESIAN
+USE MODD_CONF_n,            ONLY: LUSERC, LUSERI, LUSERV, NRR
+USE MODD_DEEP_CONVECTION_n, ONLY: NCLBASCONV, NCLTOPCONV, XCAPE, XDMFCONV, XDRCCONV, XDRICONV, XDRVCONV, &
+                                  XDTHCONV, XDSVCONV, XMFCONV, XPRLFLXCONV, XPRSFLXCONV, XUMFCONV
+USE MODD_DIAG_FLAG,         ONLY: CRAD_SAT, LCHEMDIAG, LCLD_COV, LCOARSE, LISOAL, LISOPR, LISOTH, LRAD_SUBG_COND, &
+                                  NCONV_KF, NDXCOARSE, NRAD_3D, NRTTOVINFO, XISOAL, XISOPR, XISOTH
+USE MODD_FIELD_n,           ONLY: XCLDFR, XICEFR, XPABST, XSIGS, XTHT, XTKET, XRT, XUT, XVT, XWT
+USE MODD_GRID_n,            ONLY: XZHAT, XZZ
+USE MODD_METRICS_n,         ONLY: XDXX, XDYY, XDZX, XDZY, XDZZ
+USE MODD_NEB_n, ONLY: LSIGMAS, LSUBG_COND, VSIGQSAT
+USE MODD_NSV,               ONLY: NSV, NSV_CHEMBEG, NSV_CHEMEND, TSVLIST
+USE MODD_PARAMETERS,        ONLY: JPVEXT, NUNDEF, XUNDEF
+USE MODD_PARAM_KAFR_n,      ONLY: LCHTRANS
+USE MODD_PARAM_n,           ONLY: CRAD, CSURF, CCLOUD
+USE MODD_PARAM_RAD_n,       only: NRAD_COLNBR
+USE MODD_RADIATIONS_N,      ONLY: NCLEARCOL_TM1, NDLON, NFLEV, NSTATM,                                  &
+                                  XAER, XAZIM, XCCO2, XDIR_ALB, XDIRFLASWD, XDIRSRFSWD, XDTHRAD, XEMIS, &
+                                  XFLALWD, XSCA_ALB, XSCAFLASWD, XSTATM, XTSRAD, XZENITH
+USE MODD_RAD_TRANSF,        ONLY: JPGEOST
+USE MODD_REF_n,             ONLY: XRHODREF
+USE MODD_SALT,              ONLY: LSALT
+USE MODD_TIME_n,            ONLY: TDTCUR
+USE MODD_NEB_n,            ONLY: LSIGMAS, LSUBG_COND, VSIGQSAT
+
+use mode_field,             only: Find_field_id_from_mnhname
+USE MODE_IO_FIELD_WRITE,    only: IO_Field_write
+USE MODE_MSG
+USE MODE_NEIGHBORAVG,       ONLY: BLOCKAVG, MOVINGAVG
+USE MODE_THERMO,            ONLY: SM_FOES
+USE MODE_TOOLS_LL,          ONLY: GET_INDICE_ll
+
+#ifdef MNH_RTTOV_8
+USE MODI_CALL_RTTOV8
+#endif
+#ifdef MNH_RTTOV_11
+USE MODI_CALL_RTTOV11
+#endif
+#ifdef MNH_RTTOV_13
+USE MODI_CALL_RTTOV13
+#endif
+USE MODI_GET_SURF_UNDEF
+USE MODI_GRADIENT_M
+USE MODI_GRADIENT_U
+USE MODI_GRADIENT_UV
+USE MODI_GRADIENT_V
+USE MODI_GRADIENT_W
+USE MODI_PINTER
+USE MODI_SHUMAN
+USE MODI_RADTR_SATEL
+USE MODI_UV_TO_ZONAL_AND_MERID
+USE MODI_ZINTER
+
+IMPLICIT NONE
+!
+!*       0.1   Declarations of arguments
+!
+TYPE(TFILEDATA),   INTENT(IN) :: TPFILE ! Output file
+!
+!*       0.2   Declarations of local variables
+!
+INTEGER           :: IIU,IJU,IKU,IIB,IJB,IKB,IIE,IJE,IKE ! Arrays bounds
+INTEGER           :: IKRAD  
+! 
+INTEGER           :: JI,JJ,JK,JSV,JRR   ! loop index
+! 
+! variables for Diagnostic variables related to deep convection
+REAL,DIMENSION(:,:), ALLOCATABLE              :: ZWORK21,ZWORK22
+!
+! variables for computation of temperature and height of clouds
+REAL :: ZCLMR ! value of mixing ratio tendency  for detection of cloud top
+LOGICAL, DIMENSION(:,:), ALLOCATABLE          :: GMASK2 
+INTEGER, DIMENSION(:,:), ALLOCATABLE          :: IWORK1, IWORK2
+INTEGER, DIMENSION(:,:), ALLOCATABLE          :: ICL_HE_ST
+REAL,    DIMENSION(:,:,:), ALLOCATABLE        :: ZWORK31,ZTEMP
+!
+! variables needed for the transfer radiatif diagnostic code
+INTEGER :: ITOTGEO
+INTEGER, DIMENSION (JPGEOST) :: INDGEO
+CHARACTER(LEN=8), DIMENSION (JPGEOST) :: YNAM_SAT
+REAL, DIMENSION(:,:), ALLOCATABLE :: ZIRBT, ZWVBT
+REAL  :: ZUNDEF ! undefined value in SURFEX
+!
+! variables needed for 10m wind                                 
+INTEGER :: ILEVEL
+!
+INTEGER :: IPRES, ITH
+CHARACTER(LEN=4) :: YCAR4
+CHARACTER(LEN=4), DIMENSION(SIZE(XISOPR)) :: YPRES
+CHARACTER(LEN=4), DIMENSION(SIZE(XISOTH)) :: YTH
+REAL, DIMENSION(:,:,:), ALLOCATABLE :: ZWORK32,ZWORK33,ZWORK34,ZWRES,ZPRES,ZWTH, &
+                                       ZRT,ZQV,ZMRVP,ZWRES1,ZTEMPP
+REAL, DIMENSION(:), ALLOCATABLE :: ZTH
+REAL,DIMENSION(SIZE(XTHT,1),SIZE(XTHT,2),SIZE(XTHT,3))  :: ZPOVO
+REAL,DIMENSION(SIZE(XTHT,1),SIZE(XTHT,2),SIZE(XTHT,3))  :: ZVOX,ZVOY,ZVOZ
+REAL,DIMENSION(SIZE(XTHT,1),SIZE(XTHT,2),SIZE(XTHT,3))  :: ZCORIOZ
+TYPE(TFIELDMETADATA)               :: TZFIELD
+TYPE(TFIELDMETADATA), DIMENSION(2) :: TZFIELD2
+!
+! variables needed for altitude interpolation                                 
+INTEGER :: IAL
+REAL :: ZFILLVAL
+REAL, DIMENSION(:), ALLOCATABLE :: ZAL
+REAL, DIMENSION(:,:,:), ALLOCATABLE :: ZWAL
+!
+! variables needed for coarse graining
+REAL,DIMENSION(SIZE(XTHT,1),SIZE(XTHT,2),SIZE(XTHT,3)) :: ZUT_PRM,ZVT_PRM,ZWT_PRM
+REAL,DIMENSION(SIZE(XTHT,1),SIZE(XTHT,2),SIZE(XTHT,3)) :: ZUU_AVG,ZVV_AVG,ZWW_AVG
+INTEGER :: IDX, IID, IRESP
+CHARACTER(LEN=3) :: YDX
+!-------------------------------------------------------------------------------
+!
+!*       0.     ARRAYS BOUNDS INITIALIZATION
+!
+IIU=SIZE(XTHT,1)
+IJU=SIZE(XTHT,2)
+IKU=SIZE(XTHT,3)
+CALL GET_INDICE_ll (IIB,IJB,IIE,IJE)
+IKB=1+JPVEXT
+IKE=IKU-JPVEXT
+!
+ALLOCATE(ZWORK21(IIU,IJU))
+ALLOCATE(ZWORK31(IIU,IJU,IKU))
+ALLOCATE(ZTEMP(IIU,IJU,IKU))
+ZTEMP(:,:,:)=XTHT(:,:,:)*(XPABST(:,:,:)/ XP00) **(XRD/XCPD)
+!
+!-------------------------------------------------------------------------------
+!
+!*       1.     DIAGNOSTIC RELATED TO CONVECTION
+!               -------------------------------- 
+!
+!* Diagnostic variables related to deep convection
+!
+IF (NCONV_KF >= 0) THEN
+  CALL IO_Field_write(TPFILE,'CAPE',XCAPE)
+!
+  ! top height (km) of convective clouds
+  ZWORK21(:,:)= 0.
+  DO JJ=IJB,IJE
+    DO JI=IIB,IIE
+      IF (NCLTOPCONV(JI,JJ)/=0) ZWORK21(JI,JJ)= XZZ(JI,JJ,NCLTOPCONV(JI,JJ))/1.E3
+    END DO
+  END DO
+  TZFIELD = TFIELDMETADATA(                       &
+    CMNHNAME   = 'CLTOPCONV',                     &
+    CSTDNAME   = 'convective_cloud_top_altitude', &
+    CLONGNAME  = 'CLTOPCONV',                     &
+    CUNITS     = 'km',                            &
+    CDIR       = 'XY',                            &
+    CCOMMENT   = 'X_Y_Top of Convective Cloud',   &
+    NGRID      = 4,                               &
+    NTYPE      = TYPEREAL,                        &
+    NDIMS      = 2,                               &
+    LTIMEDEP   = .TRUE.                           )
+  CALL IO_Field_write(TPFILE,TZFIELD,ZWORK21)
+!
+  ! base height (km) of convective clouds
+  ZWORK21(:,:)= 0.
+  DO JJ=IJB,IJE
+    DO JI=IIB,IIE
+      IF (NCLBASCONV(JI,JJ)/=0) ZWORK21(JI,JJ)= XZZ(JI,JJ,NCLBASCONV(JI,JJ))/1.E3
+    END DO
+  END DO
+  TZFIELD = TFIELDMETADATA(                        &
+    CMNHNAME   = 'CLBASCONV',                      &
+    CSTDNAME   = 'convective_cloud_base_altitude', &
+    CLONGNAME  = 'CLBASCONV',                      &
+    CUNITS     = 'km',                             &
+    CDIR       = 'XY',                             &
+    CCOMMENT   = 'X_Y_Base of Convective Cloud',   &
+    NGRID      = 4,                                &
+    NTYPE      = TYPEREAL,                         &
+    NDIMS      = 2,                                &
+    LTIMEDEP   = .TRUE.                            )
+  CALL IO_Field_write(TPFILE,TZFIELD,ZWORK21)
+END IF
+
+IF (NCONV_KF >= 1) THEN
+  CALL IO_Field_write(TPFILE,'DTHCONV',XDTHCONV)
+  CALL IO_Field_write(TPFILE,'DRVCONV',XDRVCONV)
+  CALL IO_Field_write(TPFILE,'DRCCONV',XDRCCONV)
+  CALL IO_Field_write(TPFILE,'DRICONV',XDRICONV)
+!
+  IF ( LCHTRANS .AND. NSV > 0 ) THEN
+   ! scalar variables are recorded
+   ! individually in the file
+    TZFIELD = TFIELDMETADATA(     &
+      CMNHNAME   = 'generic for DSVCONV', & !Temporary name to ease identification
+      CUNITS     = 's-1',         &
+      CDIR       = 'XY',          &
+      NGRID      = 1,             &
+      NTYPE      = TYPEREAL,      &
+      NDIMS      = 3,             &
+      LTIMEDEP   = .TRUE.         )
+
+    DO JSV = 1, NSV
+      TZFIELD%CMNHNAME   = 'DSVCONV_' // TRIM( TSVLIST(JSV)%CMNHNAME )
+      TZFIELD%CLONGNAME  = 'DSVCONV_' // TRIM( TSVLIST(JSV)%CLONGNAME )
+      TZFIELD%CCOMMENT   = 'Convective tendency for ' // TRIM( TSVLIST(JSV)%CMNHNAME )
+      CALL IO_Field_write( TPFILE, TZFIELD, XDSVCONV(:,:,:,JSV) )
+    END DO
+  END IF
+END IF
+
+IF (NCONV_KF >= 2) THEN
+  CALL IO_Field_write(TPFILE,'PRLFLXCONV',XPRLFLXCONV)
+  CALL IO_Field_write(TPFILE,'PRSFLXCONV',XPRSFLXCONV)
+  CALL IO_Field_write(TPFILE,'UMFCONV',   XUMFCONV)
+  CALL IO_Field_write(TPFILE,'DMFCONV',   XDMFCONV)
+END IF
+!-------------------------------------------------------------------------------
+!
+!* Height and temperature of clouds top
+!
+IF (LCLD_COV .AND. LUSERC) THEN
+  ALLOCATE(IWORK1(IIU,IJU),IWORK2(IIU,IJU))
+  ALLOCATE(ICL_HE_ST(IIU,IJU))
+  ALLOCATE(GMASK2(IIU,IJU))
+  ALLOCATE(ZWORK22(IIU,IJU))
+!
+! Explicit clouds
+!
+  ICL_HE_ST(:,:)=IKB  !initialization
+  IWORK1(:,:)=IKB     ! with the
+  IWORK2(:,:)=IKB     ! ground values
+  ZCLMR=1.E-4         ! detection of clouds for cloud mixing ratio > .1g/kg
+!
+  GMASK2(:,:)=.TRUE.
+  ZWORK31(:,:,:)= MZM( XRT(:,:,:,2) ) ! cloud mixing ratio at zz levels
+  DO JK=IKE,IKB,-1
+    WHERE ( (GMASK2(:,:)).AND.(ZWORK31(:,:,JK)>ZCLMR) )
+      GMASK2(:,:)=.FALSE.
+      IWORK1(:,:)=JK
+    END WHERE
+  END DO
+!
+  IF (LUSERI) THEN
+    GMASK2(:,:)=.TRUE.
+    ZWORK31(:,:,:)= MZM( XRT(:,:,:,4) ) ! cloud mixing ratio at zz levels
+    DO JK=IKE,IKB,-1
+      WHERE ( (GMASK2(:,:)).AND.(ZWORK31(:,:,JK)>ZCLMR) )
+        GMASK2(:,:)=.FALSE.
+        IWORK2(:,:)=JK
+      END WHERE
+    END DO
+  END IF
+!
+  ZWORK21(:,:)=0.
+  DO JJ=IJB,IJE
+   DO JI=IIB,IIE
+     ICL_HE_ST(JI,JJ)=MAX(IWORK1(JI,JJ),IWORK2(JI,JJ) )
+     ZWORK21(JI,JJ)  =XZZ(JI,JJ,ICL_HE_ST(JI,JJ)) ! height (m) of explicit clouds
+   END DO
+  END DO 
+!
+  WHERE ( ZWORK21(:,:)==XZZ(:,:,IKB) ) ZWORK21=0. ! set the height to 
+                                                  ! 0 if there is no cloud
+  ZWORK21(:,:)=ZWORK21(:,:)/1.E3            ! height (km) of explicit clouds
+!
+  TZFIELD = TFIELDMETADATA(                          &
+    CMNHNAME   = 'HECL',                             &
+    CSTDNAME   = '',                                 &
+    CLONGNAME  = 'HECL',                             &
+    CUNITS     = 'km',                               &
+    CDIR       = 'XY',                               &
+    CCOMMENT   = 'X_Y_Height of Explicit CLoud top', &
+    NGRID      = 4,                                  &
+    NTYPE      = TYPEREAL,                           &
+    NDIMS      = 2,                                  &
+    LTIMEDEP   = .TRUE.                              )
+  CALL IO_Field_write(TPFILE,TZFIELD,ZWORK21)
+!
+!  Higher top of the different species of clouds
+!
+  IWORK1(:,:)=IKB  ! initialization with the ground values
+  ZWORK31(:,:,:)=MZM(ZTEMP(:,:,:)) ! temperature (K) at zz levels
+  IF(CRAD/='NONE')  ZWORK31(:,:,IKB)=XTSRAD(:,:)
+  ZWORK21(:,:)=0.
+  ZWORK22(:,:)=0.
+  DO JJ=IJB,IJE
+    DO JI=IIB,IIE
+      IWORK1(JI,JJ)=ICL_HE_ST(JI,JJ)
+      IF (NCONV_KF >=0) &
+      IWORK1(JI,JJ)= MAX(ICL_HE_ST(JI,JJ),NCLTOPCONV(JI,JJ))
+      ZWORK21(JI,JJ)= XZZ(JI,JJ,IWORK1(JI,JJ))         ! max. cloud height (m)
+      ZWORK22(JI,JJ)= ZWORK31(JI,JJ,IWORK1(JI,JJ))-XTT ! cloud temperature (C)
+    END DO
+  END DO 
+!
+  IF (NCONV_KF <0) THEN
+    PRINT*,'YOU DO NOT ASK FOR CONVECTIVE DIAGNOSTICS (NCONV_KF<0), SO'
+    PRINT*,'  HC not written in FM-file (equal to HEC)'
+  ELSE
+    WHERE ( ZWORK21(:,:)==XZZ(:,:,IKB) ) ZWORK21(:,:)=0. ! set the height to 
+                                                         ! 0 if there is no cloud
+    ZWORK21(:,:)=ZWORK21(:,:)/1.E3                 ! max. cloud height (km)
+!
+    TZFIELD = TFIELDMETADATA(                 &
+      CMNHNAME   = 'HCL',                     &
+      CSTDNAME   = 'cloud_top_altitude',      &
+      CLONGNAME  = 'HCL',                     &
+      CUNITS     = 'km',                      &
+      CDIR       = 'XY',                      &
+      CCOMMENT   = 'X_Y_Height of CLoud top', &
+      NGRID      = 4,                         &
+      NTYPE      = TYPEREAL,                  &
+      NDIMS      = 2,                         &
+      LTIMEDEP   = .TRUE.                     )
+    CALL IO_Field_write(TPFILE,TZFIELD,ZWORK21)
+  ENDIF
+!
+  TZFIELD = TFIELDMETADATA(                      &
+    CMNHNAME   = 'TCL',                          &
+    CSTDNAME   = 'air_temperature_at_cloud_top', &
+    CLONGNAME  = 'TCL',                          &
+    CUNITS     = 'celsius',                      &
+    CDIR       = 'XY',                           &
+    CCOMMENT   = 'X_Y_Height of CLoud top',      &
+    NGRID      = 4,                              &
+    NTYPE      = TYPEREAL,                       &
+    NDIMS      = 2,                              &
+    LTIMEDEP   = .TRUE.                          )
+  CALL IO_Field_write(TPFILE,TZFIELD,ZWORK22)
+!
+  CALL IO_Field_write(TPFILE,'CLDFR',XCLDFR)
+  CALL IO_Field_write(TPFILE,'ICEFR',XICEFR)
+!
+  ZWORK21(:,:)=0.0
+  ZWORK21(IIB:IIE,IJB:IJE)=MAXVAL(XCLDFR(IIB:IIE,IJB:IJE,JPVEXT+1:IKE),DIM=3)
+ 
+  TZFIELD = TFIELDMETADATA(                   &
+    CMNHNAME   = 'CLDFRMAX',                  &
+    !Invalid CF convention standard name: CSTDNAME   = 'max_cloud_fraction', &
+    CLONGNAME  = 'CLDFRMAX',                  &
+    CUNITS     = '1',                         &
+    CDIR       = 'XY',                        &
+    CCOMMENT   = 'X_Y_MAx of CLoud fraction', &
+    NGRID      = 1,                           &
+    NTYPE      = TYPEREAL,                    &
+    NDIMS      = 2,                           &
+    LTIMEDEP   = .TRUE.                       )
+  CALL IO_Field_write(TPFILE,TZFIELD,ZWORK21)
+  !
+!  Visibility                                    
+!
+  ZWORK31(:,:,:)= 1.E4                ! 10 km for clear sky
+  WHERE (XRT(:,:,:,2) > 0.)
+    ZWORK31(:,:,:)=3.9E3/(144.7*(XRHODREF(:,:,:)*1.E3*XRT(:,:,:,2)/(1.+XRT(:,:,:,2)))**0.88)
+  END WHERE
+!
+  TZFIELD = TFIELDMETADATA(           &
+    CMNHNAME   = 'VISI_HOR',          &
+    CSTDNAME   = 'visibility_in_air', &
+    CLONGNAME  = 'VISI_HOR',          &
+    CUNITS     = 'm',                 &
+    CDIR       = 'XY',                &
+    CCOMMENT   = 'X_Y_Z_VISI_HOR',    &
+    NGRID      = 1,                   &
+    NTYPE      = TYPEREAL,            &
+    NDIMS      = 3,                   &
+    LTIMEDEP   = .TRUE.               )
+  CALL IO_Field_write(TPFILE,TZFIELD,ZWORK31)
+!
+  DEALLOCATE(IWORK1,IWORK2,ICL_HE_ST,GMASK2,ZWORK22)
+END IF
+!
+!-------------------------------------------------------------------------------
+!
+!*       2.    DIAGNOSTIC RELATED TO RADIATIONS
+!              --------------------------------
+!
+IF (NRAD_3D >= 0) THEN
+  IF (CRAD /= 'NONE') THEN
+    CALL IO_Field_write(TPFILE,'DTHRAD',      XDTHRAD)
+    CALL IO_Field_write(TPFILE,'FLALWD',      XFLALWD)
+    CALL IO_Field_write(TPFILE,'DIRFLASWD',   XDIRFLASWD)
+    CALL IO_Field_write(TPFILE,'SCAFLASWD',   XSCAFLASWD)
+    CALL IO_Field_write(TPFILE,'DIRSRFSWD',   XDIRSRFSWD)
+    CALL IO_Field_write(TPFILE,'CLEARCOL_TM1',NCLEARCOL_TM1)
+    CALL IO_Field_write(TPFILE,'ZENITH',      XZENITH)
+    CALL IO_Field_write(TPFILE,'AZIM',        XAZIM)
+    CALL IO_Field_write(TPFILE,'DIR_ALB',     XDIR_ALB)
+    CALL IO_Field_write(TPFILE,'SCA_ALB',     XSCA_ALB)
+    !
+    CALL PRINT_MSG(NVERB_INFO,'IO','WRITE_LFIFM1_FOR_DIAG_SUPP','EMIS: writing only first band')
+    CALL FIND_FIELD_ID_FROM_MNHNAME('EMIS',IID,IRESP)
+    TZFIELD = TFIELDMETADATA( TFIELDLIST(IID) )
+    TZFIELD%NDIMS = 2
+    TZFIELD%NDIMLIST(3) = TZFIELD%NDIMLIST(4)
+    TZFIELD%NDIMLIST(4) = NMNHDIM_UNUSED
+    CALL IO_Field_write(TPFILE,TZFIELD,XEMIS(:,:,1))
+    !
+    CALL IO_Field_write(TPFILE,'TSRAD',       XTSRAD)
+  ELSE
+    PRINT*,'YOU WANT DIAGNOSTICS RELATED TO RADIATION'
+    PRINT*,' BUT NO RADIATIVE SCHEME WAS ACTIVATED IN THE MODEL'
+  END IF
+END IF
+IF (NRAD_3D >= 1) THEN
+  IF (LDUST) THEN
+!Dust optical depth between two vertical levels
+    ZWORK31(:,:,:)=0.
+    DO JK=IKB,IKE
+      IKRAD = JK - JPVEXT
+      ZWORK31(:,:,JK)= XAER(:,:,IKRAD,3)
+    END DO
+    TZFIELD = TFIELDMETADATA(                          &
+      CMNHNAME   = 'DSTAOD3D',                         &
+      CSTDNAME   = '',                                 &
+      CLONGNAME  = 'DSTAOD3D',                         &
+      CUNITS     = 'm',                                &
+      CDIR       = 'XY',                               &
+      CCOMMENT   = 'X_Y_Z_DuST Aerosol Optical Depth', &
+      NGRID      = 1,                                  &
+      NTYPE      = TYPEREAL,                           &
+      NDIMS      = 3,                                  &
+      LTIMEDEP   = .TRUE.                              )
+    CALL IO_Field_write(TPFILE,TZFIELD,ZWORK31)
+!Dust optical depth
+    ZWORK21(:,:)=0.0
+    DO JK=IKB,IKE
+      IKRAD = JK - JPVEXT
+      DO JJ=IJB,IJE
+        DO JI=IIB,IIE
+          ZWORK21(JI,JJ)=ZWORK21(JI,JJ)+XAER(JI,JJ,IKRAD,3)
+        ENDDO
+      ENDDO
+    ENDDO
+    TZFIELD = TFIELDMETADATA(                        &
+      CMNHNAME   = 'DSTAOD2D',                       &
+      CSTDNAME   = '',                               &
+      CLONGNAME  = 'DSTAOD2D',                       &
+      CUNITS     = 'm',                              &
+      CDIR       = 'XY',                             &
+      CCOMMENT   = 'X_Y_DuST Aerosol Optical Depth', &
+      NGRID      = 1,                                &
+      NTYPE      = TYPEREAL,                         &
+      NDIMS      = 2,                                &
+      LTIMEDEP   = .TRUE.                            )
+    CALL IO_Field_write(TPFILE,TZFIELD,ZWORK21)
+!Dust extinction (optical depth per km)
+    DO JK=IKB,IKE
+      IKRAD = JK - JPVEXT
+      ZWORK31(:,:,JK)= XAER(:,:,IKRAD,3)/(XZZ(:,:,JK+1)-XZZ(:,:,JK))*1.D3
+    ENDDO
+    TZFIELD = TFIELDMETADATA(               &
+      CMNHNAME   = 'DSTEXT',                &
+      CSTDNAME   = '',                      &
+      CLONGNAME  = 'DSTEXT',                &
+      CUNITS     = 'km-1',                  &
+      CDIR       = 'XY',                    &
+      CCOMMENT   = 'X_Y_Z_DuST EXTinction', &
+      NGRID      = 1,                       &
+      NTYPE      = TYPEREAL,                &
+      NDIMS      = 3,                       &
+      LTIMEDEP   = .TRUE.                   )
+    CALL IO_Field_write(TPFILE,TZFIELD,ZWORK31)
+  END IF
+  IF (LSALT) THEN
+!Salt optical depth between two vertical levels
+    ZWORK31(:,:,:)=0.
+    DO JK=IKB,IKE
+      IKRAD = JK - JPVEXT
+      ZWORK31(:,:,JK)= XAER(:,:,IKRAD,2)
+    END DO
+    TZFIELD = TFIELDMETADATA(                          &
+      CMNHNAME   = 'SLTAOD3D',                         &
+      CSTDNAME   = '',                                 &
+      CLONGNAME  = 'SLTAOD3D',                         &
+      CUNITS     = 'm',                                &
+      CDIR       = 'XY',                               &
+      CCOMMENT   = 'X_Y_Z_Salt Aerosol Optical Depth', &
+      NGRID      = 1,                                  &
+      NTYPE      = TYPEREAL,                           &
+      NDIMS      = 3,                                  &
+      LTIMEDEP   = .TRUE.                              )
+    CALL IO_Field_write(TPFILE,TZFIELD,ZWORK31)
+!Salt optical depth
+    ZWORK21(:,:)=0.0
+    DO JK=IKB,IKE
+      IKRAD = JK - JPVEXT
+      DO JJ=IJB,IJE
+        DO JI=IIB,IIE
+          ZWORK21(JI,JJ)=ZWORK21(JI,JJ)+XAER(JI,JJ,IKRAD,2)
+        ENDDO
+      ENDDO
+    ENDDO
+    TZFIELD = TFIELDMETADATA(                        &
+      CMNHNAME   = 'SLTAOD2D',                       &
+      CSTDNAME   = '',                               &
+      CLONGNAME  = 'SLTAOD2D',                       &
+      CUNITS     = 'm',                              &
+      CDIR       = 'XY',                             &
+      CCOMMENT   = 'X_Y_Salt Aerosol Optical Depth', &
+      NGRID      = 1,                                &
+      NTYPE      = TYPEREAL,                         &
+      NDIMS      = 2,                                &
+      LTIMEDEP   = .TRUE.                            )
+    CALL IO_Field_write(TPFILE,TZFIELD,ZWORK21)
+!Salt extinction (optical depth per km)
+    DO JK=IKB,IKE
+      IKRAD = JK - JPVEXT
+      ZWORK31(:,:,JK)= XAER(:,:,IKRAD,2)/(XZZ(:,:,JK+1)-XZZ(:,:,JK))*1.D3
+    ENDDO
+    TZFIELD = TFIELDMETADATA(               &
+      CMNHNAME   = 'SLTEXT',                &
+      CSTDNAME   = '',                      &
+      CLONGNAME  = 'SLTEXT',                &
+      CUNITS     = 'km-1',                  &
+      CDIR       = 'XY',                    &
+      CCOMMENT   = 'X_Y_Z_Salt EXTinction', &
+      NGRID      = 1,                       &
+      NTYPE      = TYPEREAL,                &
+      NDIMS      = 3,                       &
+      LTIMEDEP   = .TRUE.                   )
+    CALL IO_Field_write(TPFILE,TZFIELD,ZWORK31)
+  END IF
+  IF (LORILAM) THEN
+!Orilam anthropogenic optical depth between two vertical levels
+    ZWORK31(:,:,:)=0.
+    DO JK=IKB,IKE
+      IKRAD = JK - JPVEXT
+      ZWORK31(:,:,JK)= XAER(:,:,IKRAD,4)
+    END DO
+    TZFIELD = TFIELDMETADATA(                                   &
+      CMNHNAME   = 'AERAOD3D',                                  &
+      CSTDNAME   = '',                                          &
+      CLONGNAME  = 'AERAOD3D',                                  &
+      CUNITS     = 'm',                                         &
+      CDIR       = 'XY',                                        &
+      CCOMMENT   = 'X_Y_Z_Anthropogenic Aerosol Optical Depth', &
+      NGRID      = 1,                                           &
+      NTYPE      = TYPEREAL,                                    &
+      NDIMS      = 3,                                           &
+      LTIMEDEP   = .TRUE.                                       )
+    CALL IO_Field_write(TPFILE,TZFIELD,ZWORK31)
+!Orilam anthropogenic optical depth
+    ZWORK21(:,:)=0.0
+    DO JK=IKB,IKE
+      IKRAD = JK - JPVEXT
+      DO JJ=IJB,IJE
+        DO JI=IIB,IIE
+          ZWORK21(JI,JJ)=ZWORK21(JI,JJ)+XAER(JI,JJ,IKRAD,4)
+        ENDDO
+      ENDDO
+    ENDDO
+    TZFIELD = TFIELDMETADATA(                                 &
+      CMNHNAME   = 'AERAOD2D',                                &
+      CSTDNAME   = '',                                        &
+      CLONGNAME  = 'AERAOD2D',                                &
+      CUNITS     = 'm',                                       &
+      CDIR       = 'XY',                                      &
+      CCOMMENT   = 'X_Y_Anthropogenic Aerosol Optical Depth', &
+      NGRID      = 1,                                         &
+      NTYPE      = TYPEREAL,                                  &
+      NDIMS      = 2,                                         &
+      LTIMEDEP   = .TRUE.                                     )
+    CALL IO_Field_write(TPFILE,TZFIELD,ZWORK21)
+!Orilam anthropogenic extinction (optical depth per km)
+    DO JK=IKB,IKE
+      IKRAD = JK - JPVEXT
+      ZWORK31(:,:,JK)= XAER(:,:,IKRAD,4)/(XZZ(:,:,JK+1)-XZZ(:,:,JK))*1.D3
+    ENDDO
+    TZFIELD = TFIELDMETADATA(                        &
+      CMNHNAME   = 'AEREXT',                         &
+      CSTDNAME   = '',                               &
+      CLONGNAME  = 'AEREXT',                         &
+      CUNITS     = 'km-1',                           &
+      CDIR       = 'XY',                             &
+      CCOMMENT   = 'X_Y_Z_Anthropogenic EXTinction', &
+      NGRID      = 1,                                &
+      NTYPE      = TYPEREAL,                         &
+      NDIMS      = 3,                                &
+      LTIMEDEP   = .TRUE.                            )
+    CALL IO_Field_write(TPFILE,TZFIELD,ZWORK31)
+  END IF
+END IF
+!
+!-------------------------------------------------------------------------------
+! Net surface gaseous fluxes
+IF (LCHEMDIAG) THEN
+  TZFIELD = TFIELDMETADATA(     &
+    CMNHNAME   = 'generic for net chemical flux', & !Temporary name to ease identification
+    CUNITS     = 'ppb m s-1',   &
+    CDIR       = 'XY',          &
+    NGRID      = 1,             &
+    NTYPE      = TYPEREAL,      &
+    NDIMS      = 2,             &
+    LTIMEDEP   = .TRUE.         )
+  !
+  DO JSV = NSV_CHEMBEG, NSV_CHEMEND
+    TZFIELD%CMNHNAME  = 'FLX_' // TRIM( TSVLIST(JSV)%CMNHNAME )
+    TZFIELD%CLONGNAME = 'FLX_' // TRIM( TSVLIST(JSV)%CLONGNAME )
+    WRITE(TZFIELD%CCOMMENT,'(A6,A,A)')'X_Y_Z_',TRIM( TSVLIST(JSV)%CMNHNAME ),' Net chemical flux'
+    CALL IO_Field_write(TPFILE,TZFIELD,XCHFLX(:,:,JSV-NSV_CHEMBEG+1) * 1E9)
+  END DO
+END IF
+!-------------------------------------------------------------------------------
+!
+!* Brightness temperatures from the radiatif transfer code (Morcrette, 1991)
+!
+IF (LEN_TRIM(CRAD_SAT) /= 0 .AND. NRR /=0) THEN
+  ALLOCATE (ZIRBT(IIU,IJU),ZWVBT(IIU,IJU))
+  ITOTGEO=0
+  IF (INDEX(CRAD_SAT,'GOES-E')   /= 0) THEN
+    ITOTGEO= ITOTGEO+1
+    INDGEO(ITOTGEO) = 1
+    YNAM_SAT(ITOTGEO) = 'GOES-E'
+  END IF
+  IF (INDEX(CRAD_SAT,'GOES-W')   /= 0) THEN
+    ITOTGEO= ITOTGEO+1
+    INDGEO(ITOTGEO) = 2
+    YNAM_SAT(ITOTGEO) = 'GOES-W'
+  END IF
+  IF (INDEX(CRAD_SAT,'GMS')      /= 0) THEN
+    ITOTGEO= ITOTGEO+1
+    INDGEO(ITOTGEO) = 3
+    YNAM_SAT(ITOTGEO) = 'GMS'
+  END IF
+  IF (INDEX(CRAD_SAT,'INDSAT')   /= 0) THEN
+    ITOTGEO= ITOTGEO+1
+    INDGEO(ITOTGEO) = 4
+    YNAM_SAT(ITOTGEO) = 'INDSAT'
+  END IF
+  IF (INDEX(CRAD_SAT,'METEOSAT') /= 0) THEN
+    ITOTGEO= ITOTGEO+1
+    INDGEO(ITOTGEO) = 5
+    YNAM_SAT(ITOTGEO) = 'METEOSAT'
+  END IF
+  PRINT*,'YOU ASK FOR BRIGHTNESS TEMPERATURES FOR ',ITOTGEO,' SATELLITE(S)'
+  IF (NRR==1) THEN
+    PRINT*,' THERE IS ONLY VAPOR WATER IN YOUR ATMOSPHERE'
+    PRINT*,' IRBT WILL NOT TAKE INTO ACCOUNT CLOUDS.'
+  END IF
+  !
+  DO JI=1,ITOTGEO
+    ZIRBT(:,:) = XUNDEF
+    ZWVBT(:,:) = XUNDEF
+    CALL RADTR_SATEL( TDTCUR%nyear, TDTCUR%nmonth, TDTCUR%nday, TDTCUR%xtime, &
+                      NDLON, NFLEV, NSTATM, NRAD_COLNBR, XEMIS(:,:,1),        &
+                      XCCO2, XTSRAD, XSTATM, XTHT, XRT, XPABST, XZZ,          &
+                      XSIGS, XMFCONV, MAX(XCLDFR,XICEFR), LUSERI, LSIGMAS,    &
+                      LSUBG_COND, LRAD_SUBG_COND, ZIRBT, ZWVBT,               &
+                      INDGEO(JI), VSIGQSAT                                    )
+    !
+    TZFIELD = TFIELDMETADATA(                                               &
+      CMNHNAME   = TRIM(YNAM_SAT(JI))//'_IRBT',                             &
+      CSTDNAME   = '',                                                      &
+      CLONGNAME  = TRIM(YNAM_SAT(JI))//'_IRBT',                             &
+      CUNITS     = 'K',                                                     &
+      CDIR       = 'XY',                                                    &
+      CCOMMENT   = TRIM(YNAM_SAT(JI))//' Infra-Red Brightness Temperature', &
+      NGRID      = 1,                                                       &
+      NTYPE      = TYPEREAL,                                                &
+      NDIMS      = 2,                                                       &
+      LTIMEDEP   = .TRUE.                                                   )
+    CALL IO_Field_write(TPFILE,TZFIELD,ZIRBT)
+    !
+    TZFIELD = TFIELDMETADATA(                                                 &
+      CMNHNAME   = TRIM(YNAM_SAT(JI))//'_WVBT',                               &
+      CSTDNAME   = '',                                                        &
+      CLONGNAME  = TRIM(YNAM_SAT(JI))//'_WVBT',                               &
+      CUNITS     = 'K',                                                       &
+      CDIR       = 'XY',                                                      &
+      CCOMMENT   = TRIM(YNAM_SAT(JI))//' Water-Vapor Brightness Temperature', &
+      NGRID      = 1,                                                         &
+      NTYPE      = TYPEREAL,                                                  &
+      NDIMS      = 2,                                                         &
+      LTIMEDEP   = .TRUE.                                                     )
+    CALL IO_Field_write(TPFILE,TZFIELD,ZWVBT)
+  END DO
+  DEALLOCATE(ZIRBT,ZWVBT)
+END IF
+!
+!-------------------------------------------------------------------------------
+!
+!* Brightness temperatures from the Radiatif Transfer for Tiros Operational
+! Vertical Sounder (RTTOV) code
+!
+IF (NRTTOVINFO(1,1) /= NUNDEF) THEN
+! PRINT*,'YOU ASK FOR BRIGHTNESS TEMPERATURE COMPUTED BY THE RTTOV CODE'
+#if defined(MNH_RTTOV_8)
+  CALL CALL_RTTOV8(NDLON, NFLEV, NSTATM, XEMIS(:,:,1), XTSRAD, XSTATM, XTHT, XRT, &
+                  XPABST, XZZ, XMFCONV, MAX(XCLDFR,XICEFR), XUT(:,:,IKB), XVT(:,:,IKB),   &
+                  LUSERI, NRTTOVINFO, TPFILE                                  )
+#elif defined(MNH_RTTOV_11)
+  CALL CALL_RTTOV11(NDLON, NFLEV, XEMIS(:,:,1), XTSRAD, XTHT, XRT,            &
+                  XPABST, XZZ, XMFCONV, MAX(XCLDFR,XICEFR), XUT(:,:,IKB), XVT(:,:,IKB),   &
+                  LUSERI, NRTTOVINFO, TPFILE                                  )
+#elif defined(MNH_RTTOV_13)
+  CALL CALL_RTTOV13(NDLON, NFLEV, XEMIS(:,:,1), XTSRAD, XTHT, XRT,            &
+                  XPABST, XZZ, XMFCONV, MAX(XCLDFR,XICEFR), XUT(:,:,IKB), XVT(:,:,IKB),   &
+                  LUSERI, NRTTOVINFO, TPFILE                                  )
+#else
+PRINT *, "RTTOV LIBRARY NOT AVAILABLE = ###CALL_RTTOV####"
+#endif
+END IF
+!
+!-------------------------------------------------------------------------------
+!
+!*       3.    DIAGNOSTIC RELATED TO SURFACE
+!              -----------------------------
+!
+IF (CSURF=='EXTE') THEN
+!! Since SURFEX7 (masdev49) XCURRENT_ZON10M and XCURRENT_MER10M
+!! are equal to XUNDEF of SURFEX if the first atmospheric level
+!! is under 10m
+  CALL GET_SURF_UNDEF(ZUNDEF)
+!
+  ILEVEL=IKB 
+  !While there are XUNDEF values and we aren't at model's top
+  DO WHILE(ANY(XCURRENT_ZON10M(IIB:IIE,IJB:IJE)==ZUNDEF) .AND. (ILEVEL/=IKE-1) )
+
+    !Where interpolation is needed and possible
+    !(10m is between ILEVEL and ILEVEL+1 or 10m is below the bottom level)
+    WHERE(XCURRENT_ZON10M(IIB:IIE,IJB:IJE)==ZUNDEF .AND. &
+                   ( XZHAT(ILEVEL+1) + XZHAT(ILEVEL+2)) /2. >10.)
+
+      !Interpolation between ILEVEL and ILEVEL+1
+      XCURRENT_ZON10M(IIB:IIE,IJB:IJE)=XUT(IIB:IIE,IJB:IJE,ILEVEL) + &
+            (XUT(IIB:IIE,IJB:IJE,ILEVEL+1)-XUT(IIB:IIE,IJB:IJE,ILEVEL)) * &
+            ( 10.- (XZHAT(ILEVEL)+XZHAT(ILEVEL+1))/2. ) / &
+           ( (XZHAT(ILEVEL+2)-XZHAT(ILEVEL)) /2.)
+      XCURRENT_MER10M(IIB:IIE,IJB:IJE)=XVT(IIB:IIE,IJB:IJE,ILEVEL) + &
+            (XVT(IIB:IIE,IJB:IJE,ILEVEL+1)-XVT(IIB:IIE,IJB:IJE,ILEVEL)) * &
+            (10.- (XZHAT(ILEVEL)+XZHAT(ILEVEL+1))/2. ) / &                                    
+           ( (XZHAT(ILEVEL+2)-XZHAT(ILEVEL)) /2.)
+    END WHERE
+    ILEVEL=ILEVEL+1 !level just higher
+  END DO
+  !
+  ! in this case (argument KGRID=0), input winds are ZONal and MERidian 
+  !          and, output ones are in MesoNH grid   
+  IF (.NOT. LCARTESIAN) THEN
+    TZFIELD2(1) = TFIELDMETADATA(       &
+      CMNHNAME   = 'UM10',              &
+      CSTDNAME   = '',                  &
+      CLONGNAME  = 'UM10',              &
+      CUNITS     = 'm s-1',             &
+      CDIR       = 'XY',                &
+      CCOMMENT   = 'Zonal wind at 10m', &
+      NGRID      = 1,                   &
+      NTYPE      = TYPEREAL,            &
+      NDIMS      = 2,                   &
+      LTIMEDEP   = .TRUE.               )
+    !
+    TZFIELD2(2) = TFIELDMETADATA(          &
+      CMNHNAME   = 'VM10',                 &
+      CSTDNAME   = '',                     &
+      CLONGNAME  = 'VM10',                 &
+      CUNITS     = 'm s-1',                &
+      CDIR       = 'XY',                   &
+      CCOMMENT   = 'Meridian wind at 10m', &
+      NGRID      = 1,                      &
+      NTYPE      = TYPEREAL,               &
+      NDIMS      = 2,                      &
+      LTIMEDEP   = .TRUE.                  )
+    !
+    CALL UV_TO_ZONAL_AND_MERID(XCURRENT_ZON10M,XCURRENT_MER10M,KGRID=0,TPFILE=TPFILE,TZFIELDS=TZFIELD2)
+  ELSE
+    TZFIELD = TFIELDMETADATA(           &
+      CMNHNAME   = 'UM10',              &
+      CSTDNAME   = '',                  &
+      CLONGNAME  = 'UM10',              &
+      CUNITS     = 'm s-1',             &
+      CDIR       = 'XY',                &
+      CCOMMENT   = 'Zonal wind at 10m', &
+      NGRID      = 1,                   &
+      NTYPE      = TYPEREAL,            &
+      NDIMS      = 2,                   &
+      LTIMEDEP   = .TRUE.               )
+    CALL IO_Field_write(TPFILE,TZFIELD,XCURRENT_ZON10M)
+    !
+    TZFIELD = TFIELDMETADATA(              &
+      CMNHNAME   = 'VM10',                 &
+      CSTDNAME   = '',                     &
+      CLONGNAME  = 'VM10',                 &
+      CUNITS     = 'm s-1',                &
+      CDIR       = 'XY',                   &
+      CCOMMENT   = 'Meridian wind at 10m', &
+      NGRID      = 1,                      &
+      NTYPE      = TYPEREAL,               &
+      NDIMS      = 2,                      &
+      LTIMEDEP   = .TRUE.                  )
+    CALL IO_Field_write(TPFILE,TZFIELD,XCURRENT_MER10M)
+  ENDIF
+  !
+  IF (SIZE(XTKET)>0) THEN
+    ZWORK21(:,:) = SQRT(XCURRENT_ZON10M(:,:)**2+XCURRENT_MER10M(:,:)**2)
+    ZWORK21(:,:) = ZWORK21(:,:) + 4. * SQRT(XTKET(:,:,IKB))
+    TZFIELD = TFIELDMETADATA(     &
+      CMNHNAME   = 'FF10MAX',     &
+      CSTDNAME   = '',            &
+      CLONGNAME  = 'FF10MAX',     &
+      CUNITS     = 'm s-1',       &
+      CDIR       = 'XY',          &
+      CCOMMENT   = 'X_Y_FF10MAX', &
+      NGRID      = 1,             &
+      NTYPE      = TYPEREAL,      &
+      NDIMS      = 2,             &
+      LTIMEDEP   = .TRUE.         )
+    CALL IO_Field_write(TPFILE,TZFIELD,ZWORK21)
+  END IF
+  !
+  IF(ANY(XCURRENT_SFCO2/=XUNDEF))THEN
+    TZFIELD = TFIELDMETADATA(          &
+      CMNHNAME   = 'SFCO2',            &
+      CSTDNAME   = '',                 &
+      CLONGNAME  = 'SFCO2',            &
+      CUNITS     = 'mg m-2 s-1',       &
+      CDIR       = 'XY',               &
+      CCOMMENT   = 'CO2 Surface flux', &
+      NGRID      = 1,                  &
+      NTYPE      = TYPEREAL,           &
+      NDIMS      = 2,                  &
+      LTIMEDEP   = .TRUE.              )
+    CALL IO_Field_write(TPFILE,TZFIELD,XCURRENT_SFCO2)
+  END IF
+  !
+  IF ( CRAD /= 'NONE' ) THEN
+  IF(ANY(XCURRENT_SWD/=XUNDEF))THEN
+    TZFIELD = TFIELDMETADATA(                           &
+      CMNHNAME   = 'SWD',                               &
+      CSTDNAME   = '',                                  &
+      CLONGNAME  = 'SWD',                               &
+      CUNITS     = 'W m-2',                             &
+      CDIR       = 'XY',                                &
+      CCOMMENT   = 'incoming ShortWave at the surface', &
+      NGRID      = 1,                                   &
+      NTYPE      = TYPEREAL,                            &
+      NDIMS      = 2,                                   &
+      LTIMEDEP   = .TRUE.                               )
+    CALL IO_Field_write(TPFILE,TZFIELD,XCURRENT_SWD)
+  END IF
+  !
+  IF(ANY(XCURRENT_SWU/=XUNDEF))THEN
+    TZFIELD = TFIELDMETADATA(                            &
+      CMNHNAME   = 'SWU',                                &
+      CSTDNAME   = '',                                   &
+      CLONGNAME  = 'SWU',                                &
+      CUNITS     = 'W m-2',                              &
+      CDIR       = 'XY',                                 &
+      CCOMMENT   = 'outcoming ShortWave at the surface', &
+      NGRID      = 1,                                    &
+      NTYPE      = TYPEREAL,                             &
+      NDIMS      = 2,                                    &
+      LTIMEDEP   = .TRUE.                                )
+    CALL IO_Field_write(TPFILE,TZFIELD,XCURRENT_SWU)
+  END IF
+!
+  IF(ANY(XCURRENT_LWD/=XUNDEF))THEN
+    TZFIELD = TFIELDMETADATA(                          &
+      CMNHNAME   = 'LWD',                              &
+      CSTDNAME   = '',                                 &
+      CLONGNAME  = 'LWD',                              &
+      CUNITS     = 'W m-2',                            &
+      CDIR       = 'XY',                               &
+      CCOMMENT   = 'incoming LongWave at the surface', &
+      NGRID      = 1,                                  &
+      NTYPE      = TYPEREAL,                           &
+      NDIMS      = 2,                                  &
+      LTIMEDEP   = .TRUE.                              )
+    CALL IO_Field_write(TPFILE,TZFIELD,XCURRENT_LWD)
+  END IF
+!
+  IF(ANY(XCURRENT_LWU/=XUNDEF))THEN
+    TZFIELD = TFIELDMETADATA(                           &
+      CMNHNAME   = 'LWU',                               &
+      CSTDNAME   = '',                                  &
+      CLONGNAME  = 'LWU',                               &
+      CUNITS     = 'W m-2',                             &
+      CDIR       = 'XY',                                &
+      CCOMMENT   = 'outcoming LongWave at the surface', &
+      NGRID      = 1,                                   &
+      NTYPE      = TYPEREAL,                            &
+      NDIMS      = 2,                                   &
+      LTIMEDEP   = .TRUE.                               )
+    CALL IO_Field_write(TPFILE,TZFIELD,XCURRENT_LWU)
+  END IF
+  END IF ! CRAD/='NONE'
+END IF
+
+! MODIF FP NOV 2012
+!-------------------------------------------------------------------------------
+!
+!*       4.     DIAGNOSTIC ON PRESSURE LEVELS
+!               -----------------------------
+!
+IF (LISOPR .AND. XISOPR(1)/=0.) THEN
+!
+!
+ALLOCATE(ZWORK32(IIU,IJU,IKU))
+ALLOCATE(ZWORK33(IIU,IJU,IKU))
+ALLOCATE(ZWORK34(IIU,IJU,IKU))
+!
+! *************************************************
+! Determine the pressure level where to interpolate
+! *************************************************
+  IPRES=0
+  DO JI=1,SIZE(XISOPR)
+    IF (XISOPR(JI)<=10..OR.XISOPR(JI)>1000.) EXIT
+    IPRES=IPRES+1
+    WRITE(YCAR4,'(I4)') INT(XISOPR(JI))
+    YPRES(IPRES)=ADJUSTL(YCAR4)
+  END DO
+
+  ALLOCATE(ZWRES(IIU,IJU,IPRES))
+  ALLOCATE(ZTEMPP(IIU,IJU,IPRES))
+  ZWRES(:,:,:)=XUNDEF
+  ALLOCATE(ZPRES(IIU,IJU,IPRES))
+  IPRES=0
+  DO JI=1,SIZE(XISOPR)
+    IF (XISOPR(JI)<=10..OR.XISOPR(JI)>1000.) EXIT
+    IPRES=IPRES+1
+    ZPRES(:,:,IPRES)=XISOPR(JI)*100.
+  END DO
+  PRINT *,'PRESSURE LEVELS WHERE TO INTERPOLATE=',ZPRES(1,1,:)
+  !
+  TZFIELD = TFIELDMETADATA(&
+    CMNHNAME   = 'variables at pressure levels', & !Temporary name to ease identification
+    CSTDNAME   = '',       &
+    CDIR       = 'XY',     &
+    NGRID      = 1,        &
+    NTYPE      = TYPEREAL, &
+    NDIMS      = 2,        &
+    LTIMEDEP   = .TRUE.    )
+  !
+!
+!*       Standard Variables
+!
+! *********************
+! Potential Temperature
+! *********************
+  CALL PINTER(XTHT, XPABST, XZZ, ZTEMP, ZWRES, ZPRES, &
+         IIU, IJU, IKU, IKB, IPRES, 'LOG', 'RHU.')
+  DO JK=1,IPRES
+    TZFIELD%CMNHNAME   = 'THT'//TRIM(YPRES(JK))//'HPA'
+    TZFIELD%CLONGNAME  = TRIM(TZFIELD%CMNHNAME)
+    TZFIELD%CUNITS     = 'K'
+    TZFIELD%CCOMMENT   = 'X_Y_potential temperature '//TRIM(YPRES(JK))//' hPa'
+    CALL IO_Field_write(TPFILE,TZFIELD,ZWRES(:,:,JK))
+  END DO
+! *********************
+! Temperature
+! *********************
+  DO JK=1,IPRES
+    TZFIELD%CMNHNAME   = 'TEMP'//TRIM(YPRES(JK))//'HPA'
+    TZFIELD%CLONGNAME  = TRIM(TZFIELD%CMNHNAME)
+    TZFIELD%CUNITS     = 'K'
+    TZFIELD%CCOMMENT   = 'X_Y_air temperature '//TRIM(YPRES(JK))//' hPa'
+    CALL IO_Field_write(TPFILE,TZFIELD,ZWRES(:,:,JK)*(ZPRES(:,:,JK)/XP00)**(XRD/XCPD))
+  END DO
+  ZTEMPP(:,:,:)=ZWRES(:,:,:)
+! *********************
+! Wind
+! *********************
+  ZWORK31(:,:,:) = MXF(XUT(:,:,:))
+  CALL PINTER(ZWORK31, XPABST, XZZ, ZTEMP, ZWRES, ZPRES, &
+         IIU, IJU, IKU, IKB, IPRES, 'LOG', 'RHU.')
+  DO JK=1,IPRES
+    TZFIELD%CMNHNAME   = 'UT'//TRIM(YPRES(JK))//'HPA'
+    TZFIELD%CLONGNAME  = TRIM(TZFIELD%CMNHNAME)
+    TZFIELD%CUNITS     = 'm s-1'
+    TZFIELD%CCOMMENT   = 'X_Y_U component of wind '//TRIM(YPRES(JK))//' hPa'
+    CALL IO_Field_write(TPFILE,TZFIELD,ZWRES(:,:,JK))
+  END DO
+  !
+  ZWORK31(:,:,:) = MYF(XVT(:,:,:))
+  CALL PINTER(ZWORK31, XPABST, XZZ, ZTEMP, ZWRES, ZPRES, &
+          IIU, IJU, IKU, IKB, IPRES, 'LOG', 'RHU.')
+  DO JK=1,IPRES
+    TZFIELD%CMNHNAME   = 'VT'//TRIM(YPRES(JK))//'HPA'
+    TZFIELD%CLONGNAME  = TRIM(TZFIELD%CMNHNAME)
+    TZFIELD%CUNITS     = 'm s-1'
+    TZFIELD%CCOMMENT   = 'X_Y_V component of wind '//TRIM(YPRES(JK))//' hPa'
+    CALL IO_Field_write(TPFILE,TZFIELD,ZWRES(:,:,JK))
+  END DO
+  !
+  ZWORK31(:,:,:) = MZF(XWT(:,:,:))
+  CALL PINTER(ZWORK31, XPABST, XZZ, ZTEMP, ZWRES, ZPRES, &
+          IIU, IJU, IKU, IKB, IPRES, 'LOG', 'RHU.')
+  DO JK=1,IPRES
+    TZFIELD%CMNHNAME   = 'WT'//TRIM(YPRES(JK))//'HPA'
+    TZFIELD%CLONGNAME  = TRIM(TZFIELD%CMNHNAME)
+    TZFIELD%CUNITS     = 'm s-1'
+    TZFIELD%CCOMMENT   = 'X_Y_V component of wind '//TRIM(YPRES(JK))//' hPa'
+    CALL IO_Field_write(TPFILE,TZFIELD,ZWRES(:,:,JK))
+  END DO
+! *********************
+! Turbulent kinetic energy
+! *********************
+  CALL PINTER(XTKET, XPABST, XZZ, ZTEMP, ZWRES, ZPRES, &
+         IIU, IJU, IKU, IKB, IPRES, 'LOG', 'RHU.')
+  DO JK=1,IPRES
+    TZFIELD%CMNHNAME   = 'TKET'//TRIM(YPRES(JK))//'HPA'
+    TZFIELD%CLONGNAME  = TRIM(TZFIELD%CMNHNAME)
+    TZFIELD%CUNITS     = 'm 2 s-2'
+    TZFIELD%CCOMMENT   = 'X_Y_turbulent kinetic energy '//TRIM(YPRES(JK))//' hPa'
+    CALL IO_Field_write(TPFILE,TZFIELD,ZWRES(:,:,JK))
+  END DO
+! *********************
+! Water Vapour Mixing Ratio
+! *********************
+  CALL PINTER(XRT(:,:,:,1), XPABST, XZZ, ZTEMP, ZWRES, ZPRES, &
+         IIU, IJU, IKU, IKB, IPRES, 'LOG', 'RHU.')
+  DO JK=1,IPRES
+    TZFIELD%CMNHNAME   = 'MRV'//TRIM(YPRES(JK))//'HPA'
+    TZFIELD%CLONGNAME  = TRIM(TZFIELD%CMNHNAME)
+    TZFIELD%CUNITS     = 'g kg-1'
+    TZFIELD%CCOMMENT   = 'X_Y_Vapor Mixing Ratio '//TRIM(YPRES(JK))//' hPa'
+    CALL IO_Field_write(TPFILE,TZFIELD,ZWRES(:,:,JK)*1.E3)
+  END DO
+!
+! *********************
+! Relative humidity
+! *********************
+  IF (LUSERV) THEN
+    ALLOCATE(ZWRES1(IIU,IJU,IPRES))
+    ALLOCATE(ZMRVP(IIU,IJU,IPRES))
+    ZMRVP(:,:,:)=ZWRES(:,:,:)
+    ZWRES1(:,:,:)=SM_FOES(ZTEMPP(:,:,:))
+    ZWRES1(:,:,:)=(XMV/XMD)*ZWRES1(:,:,:)/(ZPRES(:,:,:)-ZWRES1(:,:,:))
+    ZWRES(:,:,:)=100.*ZMRVP(:,:,:)/ZWRES1(:,:,:)
+    IF (CCLOUD(1:3) =='ICE' .OR. CCLOUD =='C3R5' .OR. CCLOUD == 'LIMA')  THEN
+      WHERE ( ZTEMPP(:,:,:)< XTT)
+        ZWRES1(:,:,:) = EXP( XALPI - XBETAI/ZTEMPP(:,:,:) &
+                       - XGAMI*ALOG(ZTEMPP(:,:,:)) ) !saturation over ice
+        ZWRES1(:,:,:)=(XMV/XMD)*ZWRES1(:,:,:)/(ZPRES(:,:,:)-ZWRES1(:,:,:))
+        ZWRES(:,:,:)=100.*ZMRVP(:,:,:)/ZWRES1(:,:,:)
+      END WHERE
+    END IF
+    DO JK=1,IPRES
+      TZFIELD%CMNHNAME   = 'REHU'//TRIM(YPRES(JK))//'HPA'
+      TZFIELD%CLONGNAME  = TRIM(TZFIELD%CMNHNAME)
+      TZFIELD%CUNITS     = 'percent'
+      TZFIELD%CCOMMENT   = 'X_Y_Relative humidity '//TRIM(YPRES(JK))//' hPa'
+      CALL IO_Field_write(TPFILE,TZFIELD,ZWRES(:,:,JK))
+    END DO
+    DEALLOCATE(ZWRES1,ZMRVP,ZTEMPP)
+  END IF
+  !
+  ALLOCATE(ZRT(IIU,IJU,IKU))
+  ALLOCATE(ZQV(IIU,IJU,IKU))
+  ZRT(:,:,:)=0.
+  DO JRR=1,NRR
+    ZRT(:,:,:) = ZRT(:,:,:) + XRT(:,:,:,JRR)
+  END DO
+  ZQV(:,:,:) = XRT(:,:,:,1) / (1.0 + ZRT(:,:,:))
+  ! *********************
+  ! Water specific humidity
+  ! *********************
+  CALL PINTER(ZQV, XPABST, XZZ, ZTEMP, ZWRES, ZPRES, &
+         IIU, IJU, IKU, IKB, IPRES, 'LOG', 'RHU.')
+  DO JK=1,IPRES
+    TZFIELD%CMNHNAME   = 'QV'//TRIM(YPRES(JK))//'HPA'
+    TZFIELD%CLONGNAME  = TRIM(TZFIELD%CMNHNAME)
+    TZFIELD%CUNITS     = 'kg kg-1'
+    TZFIELD%CCOMMENT   = 'X_Y_Vapor Specific humidity '//TRIM(YPRES(JK))//' hPa'
+    CALL IO_Field_write(TPFILE,TZFIELD,ZWRES(:,:,JK))
+  END DO
+  DEALLOCATE(ZRT,ZQV)
+! *********************
+! Geopotential in meters
+! *********************
+  ZWORK31(:,:,:) = MZF(XZZ(:,:,:))
+  CALL PINTER(ZWORK31, XPABST, XZZ, ZTEMP, ZWRES, ZPRES, &
+           IIU, IJU, IKU, IKB, IPRES, 'LOG', 'RHU.')
+  DO JK=1,IPRES
+    TZFIELD%CMNHNAME   = 'ALT'//TRIM(YPRES(JK))//'HPA'
+    TZFIELD%CLONGNAME  = TRIM(TZFIELD%CMNHNAME)
+    TZFIELD%CUNITS     = 'm'
+    TZFIELD%CCOMMENT   = 'X_Y_ALTitude '//TRIM(YPRES(JK))//' hPa'
+    CALL IO_Field_write(TPFILE,TZFIELD,ZWRES(:,:,JK))
+  END DO
+!
+  DEALLOCATE(ZWRES,ZPRES,ZWORK32,ZWORK33,ZWORK34)
+END IF
+!
+!-------------------------------------------------------------------------------
+!
+!*       5.     DIAGNOSTIC ON POTENTIEL TEMPERATURE LEVELS
+!               -----------------------------
+!
+IF (LISOTH .AND.XISOTH(1)/=0.) THEN
+!
+!
+ALLOCATE(ZWORK32(IIU,IJU,IKU))
+ALLOCATE(ZWORK33(IIU,IJU,IKU))
+ALLOCATE(ZWORK34(IIU,IJU,IKU))
+!
+! *************************************************
+! Determine the potentiel temperature level where to interpolate
+! *************************************************
+  ITH=0
+  DO JI=1,SIZE(XISOTH)
+    IF (XISOTH(JI)<=100..OR.XISOTH(JI)>1000.) EXIT
+    ITH=ITH+1
+    WRITE(YCAR4,'(I4)') INT(XISOTH(JI))
+    YTH(ITH)=ADJUSTL(YCAR4)
+  END DO
+
+  ALLOCATE(ZWTH(IIU,IJU,ITH))
+  ZWTH(:,:,:)=XUNDEF
+  ALLOCATE(ZTH(ITH))
+  ZTH(:) = XISOTH(1:ITH)
+
+  PRINT *,'POTENTIAL TEMPERATURE LEVELS WHERE TO INTERPOLATE=',ZTH(:)
+  !
+  TZFIELD = TFIELDMETADATA(&
+    CMNHNAME   = 'variables at pot. temp. levels', & !Temporary name to ease identification
+    CSTDNAME   = '',       &
+    CDIR       = 'XY',     &
+    NGRID      = 1,        &
+    NTYPE      = TYPEREAL, &
+    NDIMS      = 2,        &
+    LTIMEDEP   = .TRUE.    )
+  !
+!
+!*       Standard Variables
+!
+! *********************
+! Pressure
+! *********************
+  CALL ZINTER(XPABST, XTHT, ZWTH, ZTH, IIU, IJU, IKU, IKB, ITH, XUNDEF)
+  DO JK=1,ITH
+    TZFIELD%CMNHNAME   = 'PABST'//TRIM(YTH(JK))//'K'
+    TZFIELD%CLONGNAME  = TRIM(TZFIELD%CMNHNAME)
+    TZFIELD%CUNITS     = 'Pa'
+    TZFIELD%CCOMMENT   = 'X_Y_pressure '//TRIM(YTH(JK))//' K'
+    CALL IO_Field_write(TPFILE,TZFIELD,ZWTH(:,:,JK))
+  END DO
+! *********************
+! Potential Vorticity
+! *********************
+  ZCORIOZ(:,:,:)=SPREAD( XCORIOZ(:,:),DIM=3,NCOPIES=IKU )
+  ZVOX(:,:,:)=GY_W_VW(XWT,XDYY,XDZZ,XDZY)-GZ_V_VW(XVT,XDZZ)
+  ZVOX(:,:,2)=ZVOX(:,:,3)
+  ZVOY(:,:,:)=GZ_U_UW(XUT,XDZZ)-GX_W_UW(XWT,XDXX,XDZZ,XDZX)
+  ZVOY(:,:,2)=ZVOY(:,:,3)
+  ZVOZ(:,:,:)=GX_V_UV(XVT,XDXX,XDZZ,XDZX)-GY_U_UV(XUT,XDYY,XDZZ,XDZY)
+  ZVOZ(:,:,2)=ZVOZ(:,:,3)
+  ZVOZ(:,:,1)=ZVOZ(:,:,3)
+  ZWORK31(:,:,:)=GX_M_M(XTHT,XDXX,XDZZ,XDZX)
+  ZWORK32(:,:,:)=GY_M_M(XTHT,XDYY,XDZZ,XDZY)
+  ZWORK33(:,:,:)=GZ_M_M(XTHT,XDZZ)
+  ZPOVO(:,:,:)= ZWORK31(:,:,:)*MZF(MYF(ZVOX(:,:,:)))     &
+  + ZWORK32(:,:,:)*MZF(MXF(ZVOY(:,:,:)))     &
+   + ZWORK33(:,:,:)*(MYF(MXF(ZVOZ(:,:,:))) + ZCORIOZ(:,:,:))
+  ZPOVO(:,:,:)= ZPOVO(:,:,:)*1E6/XRHODREF(:,:,:)
+  ZPOVO(:,:,1)  =-1.E+11
+  ZPOVO(:,:,IKU)=-1.E+11
+  CALL ZINTER(ZPOVO, XTHT, ZWTH, ZTH, IIU, IJU, IKU, IKB, ITH, XUNDEF)
+  DO JK=1,ITH
+    TZFIELD%CMNHNAME   = 'POVOT'//TRIM(YTH(JK))//'K'
+    TZFIELD%CLONGNAME  = TRIM(TZFIELD%CMNHNAME)
+    TZFIELD%CUNITS     = 'PVU'
+    TZFIELD%CCOMMENT   = 'X_Y_POtential VOrticity '//TRIM(YTH(JK))//' K'
+    CALL IO_Field_write(TPFILE,TZFIELD,ZWTH(:,:,JK))
+  END DO
+! *********************
+! Wind
+! *********************
+  ZWORK31(:,:,:) = MXF(XUT(:,:,:))
+  CALL ZINTER(ZWORK31, XTHT, ZWTH, ZTH, IIU, IJU, IKU, IKB, ITH, XUNDEF)
+  DO JK=1,ITH
+    TZFIELD%CMNHNAME   = 'UT'//TRIM(YTH(JK))//'K'
+    TZFIELD%CLONGNAME  = TRIM(TZFIELD%CMNHNAME)
+    TZFIELD%CUNITS     = 'm s-1'
+    TZFIELD%CCOMMENT   = 'X_Y_U component of wind '//TRIM(YTH(JK))//' K'
+    CALL IO_Field_write(TPFILE,TZFIELD,ZWTH(:,:,JK))
+  END DO
+  !
+  ZWORK31(:,:,:) = MYF(XVT(:,:,:))
+  CALL ZINTER(ZWORK31, XTHT, ZWTH, ZTH, IIU, IJU, IKU, IKB, ITH, XUNDEF)
+  DO JK=1,ITH
+    TZFIELD%CMNHNAME   = 'VT'//TRIM(YTH(JK))//'K'
+    TZFIELD%CLONGNAME  = TRIM(TZFIELD%CMNHNAME)
+    TZFIELD%CUNITS     = 'm s-1'
+    TZFIELD%CCOMMENT   = 'X_Y_V component of wind '//TRIM(YTH(JK))//' K'
+    CALL IO_Field_write(TPFILE,TZFIELD,ZWTH(:,:,JK))
+  END DO
+!
+  DEALLOCATE(ZWTH,ZTH,ZWORK32,ZWORK33,ZWORK34)
+END IF
+!-------------------------------------------------------------------------------
+!
+!*       6.     DIAGNOSTIC ON ALTITUDE LEVELS
+!               -----------------------------
+!
+IF (LISOAL .AND.XISOAL(1)/=0.) THEN
+!
+!
+  ZFILLVAL = -99999.
+  ALLOCATE(ZWORK32(IIU,IJU,IKU))
+  ALLOCATE(ZWORK33(IIU,IJU,IKU))
+!
+! *************************************************
+! Determine the altitude level where to interpolate
+! *************************************************
+  IAL=0
+  DO JI=1,SIZE(XISOAL)
+    IF (XISOAL(JI)<0.) EXIT
+    IAL=IAL+1
+  END DO
+  ALLOCATE(ZWAL(IIU,IJU,IAL))
+  ZWAL(:,:,:)=XUNDEF
+  ALLOCATE(ZAL(IAL))
+  ZAL(:) = XISOAL(1:IAL)
+  PRINT *,'ALTITUDE LEVELS WHERE TO INTERPOLATE=',ZAL(:)
+! *********************
+! Altitude
+! *********************
+  TZFIELD = TFIELDMETADATA(   &
+    CMNHNAME   = 'ALT_ALT',   &
+    CSTDNAME   = '',          &
+    CLONGNAME  = 'ALT_ALT',   &
+    CUNITS     = 'm',         &
+    CDIR       = '--',        &
+    CCOMMENT   = 'Z_alt ALT', &
+    NGRID      = 0,           &
+    NTYPE      = TYPEREAL,    &
+    NDIMS      = 1,           &
+    LTIMEDEP   = .FALSE.      )
+  CALL IO_Field_write(TPFILE,TZFIELD,ZAL)
+!
+!*       Standard Variables
+!
+! *********************
+! Cloud
+! *********************
+  ZWORK31(:,:,:) = 0.
+  IF (SIZE(XRT,4) >= 2) ZWORK31(:,:,:) = XRT(:,:,:,2) ! Rc
+  IF (SIZE(XRT,4) >= 4) ZWORK31(:,:,:) = ZWORK31(:,:,:) + XRT(:,:,:,4) !Ri
+  ZWORK31(:,:,:) = ZWORK31(:,:,:)*1.E3
+  CALL ZINTER(ZWORK31, XZZ, ZWAL, ZAL, IIU, IJU, IKU, IKB, IAL, XUNDEF)
+  WHERE(ZWAL.EQ.XUNDEF) ZWAL=ZFILLVAL
+  TZFIELD = TFIELDMETADATA(       &
+    CMNHNAME   = 'ALT_CLOUD',     &
+    CSTDNAME   = '',              &
+    CLONGNAME  = 'ALT_CLOUD',     &
+    CUNITS     = 'g kg-1',        &
+    CDIR       = 'XY',            &
+    CCOMMENT   = 'X_Y_cloud ALT', &
+    NGRID      = 1,               &
+    NTYPE      = TYPEREAL,        &
+    NDIMS      = 3,               &
+    NDIMLIST   = [ NMNHDIM_NI, NMNHDIM_NJ, NMNHDIM_NOTLISTED ], &
+    LTIMEDEP   = .TRUE.           )
+  CALL IO_Field_write(TPFILE,TZFIELD,ZWAL)
+! *********************
+! Precipitation
+! *********************
+  ZWORK31(:,:,:) = 0.
+  IF (SIZE(XRT,4) >= 3) ZWORK31(:,:,:) = XRT(:,:,:,3) ! Rr
+  IF (SIZE(XRT,4) >= 5) ZWORK31(:,:,:) = ZWORK31(:,:,:) + XRT(:,:,:,5) !Rsnow
+  IF (SIZE(XRT,4) >= 6) ZWORK31(:,:,:) = ZWORK31(:,:,:) + XRT(:,:,:,6) !Rgraupel
+  IF (SIZE(XRT,4) >= 7) ZWORK31(:,:,:) = ZWORK31(:,:,:) + XRT(:,:,:,7) !Rhail
+  ZWORK31(:,:,:) = ZWORK31(:,:,:)*1.E3
+  CALL ZINTER(ZWORK31, XZZ, ZWAL, ZAL, IIU, IJU, IKU, IKB, IAL, XUNDEF)
+  WHERE(ZWAL.EQ.XUNDEF) ZWAL=ZFILLVAL
+  TZFIELD = TFIELDMETADATA(               &
+    CMNHNAME   = 'ALT_PRECIP',            &
+    CSTDNAME   = '',                      &
+    CLONGNAME  = 'ALT_PRECIP',            &
+    CUNITS     = 'g kg-1',                &
+    CDIR       = 'XY',                    &
+    CCOMMENT   = 'X_Y_precipitation ALT', &
+    NGRID      = 1,                       &
+    NTYPE      = TYPEREAL,                &
+    NDIMS      = 3,                       &
+    NDIMLIST   = [ NMNHDIM_NI, NMNHDIM_NJ, NMNHDIM_NOTLISTED ], &
+    LTIMEDEP   = .TRUE.                   )
+  CALL IO_Field_write(TPFILE,TZFIELD,ZWAL)
+! *********************
+! Potential temperature
+! *********************
+  CALL ZINTER(XTHT, XZZ, ZWAL, ZAL, IIU, IJU, IKU, IKB, IAL, XUNDEF)
+  WHERE(ZWAL.EQ.XUNDEF) ZWAL=ZFILLVAL
+  TZFIELD = TFIELDMETADATA(                       &
+    CMNHNAME   = 'ALT_THETA',                     &
+    CSTDNAME   = '',                              &
+    CLONGNAME  = 'ALT_THETA',                     &
+    CUNITS     = 'K',                             &
+    CDIR       = 'XY',                            &
+    CCOMMENT   = 'X_Y_potential temperature ALT', &
+    NGRID      = 1,                               &
+    NTYPE      = TYPEREAL,                        &
+    NDIMS      = 3,                               &
+    NDIMLIST   = [ NMNHDIM_NI, NMNHDIM_NJ, NMNHDIM_NOTLISTED ], &
+    LTIMEDEP   = .TRUE.                           )
+  CALL IO_Field_write(TPFILE,TZFIELD,ZWAL)
+! *********************
+! Pressure
+! *********************
+  CALL ZINTER(XPABST, XZZ, ZWAL, ZAL, IIU, IJU, IKU, IKB, IAL, XUNDEF)
+  WHERE(ZWAL.EQ.XUNDEF) ZWAL=ZFILLVAL
+  TZFIELD = TFIELDMETADATA(          &
+    CMNHNAME   = 'ALT_PRESSURE',     &
+    CSTDNAME   = '',                 &
+    CLONGNAME  = 'ALT_PRESSURE',     &
+    CUNITS     = 'Pa',               &
+    CDIR       = 'XY',               &
+    CCOMMENT   = 'X_Y_pressure ALT', &
+    NGRID      = 1,                  &
+    NTYPE      = TYPEREAL,           &
+    NDIMS      = 3,                  &
+    NDIMLIST   = [ NMNHDIM_NI, NMNHDIM_NJ, NMNHDIM_NOTLISTED ], &
+    LTIMEDEP   = .TRUE.              )
+  CALL IO_Field_write(TPFILE,TZFIELD,ZWAL)
+! *********************
+! Potential Vorticity
+! *********************
+  ZCORIOZ(:,:,:)=SPREAD( XCORIOZ(:,:),DIM=3,NCOPIES=IKU )
+  ZVOX(:,:,:)=GY_W_VW(XWT,XDYY,XDZZ,XDZY)-GZ_V_VW(XVT,XDZZ)
+  ZVOX(:,:,2)=ZVOX(:,:,3)
+  ZVOY(:,:,:)=GZ_U_UW(XUT,XDZZ)-GX_W_UW(XWT,XDXX,XDZZ,XDZX)
+  ZVOY(:,:,2)=ZVOY(:,:,3)
+  ZVOZ(:,:,:)=GX_V_UV(XVT,XDXX,XDZZ,XDZX)-GY_U_UV(XUT,XDYY,XDZZ,XDZY)
+  ZVOZ(:,:,2)=ZVOZ(:,:,3)
+  ZVOZ(:,:,1)=ZVOZ(:,:,3)
+  ZWORK31(:,:,:)=GX_M_M(XTHT,XDXX,XDZZ,XDZX)
+  ZWORK32(:,:,:)=GY_M_M(XTHT,XDYY,XDZZ,XDZY)
+  ZWORK33(:,:,:)=GZ_M_M(XTHT,XDZZ)
+  ZPOVO(:,:,:)= ZWORK31(:,:,:)*MZF(MYF(ZVOX(:,:,:)))     &
+  + ZWORK32(:,:,:)*MZF(MXF(ZVOY(:,:,:)))     &
+   + ZWORK33(:,:,:)*(MYF(MXF(ZVOZ(:,:,:))) + ZCORIOZ(:,:,:))
+  ZPOVO(:,:,:)= ZPOVO(:,:,:)*1E6/XRHODREF(:,:,:)
+  ZPOVO(:,:,1)  =-1.E+11
+  ZPOVO(:,:,IKU)=-1.E+11
+  CALL ZINTER(ZPOVO, XZZ, ZWAL, ZAL, IIU, IJU, IKU, IKB, IAL, XUNDEF)
+  WHERE(ZWAL.EQ.XUNDEF) ZWAL=ZFILLVAL
+  TZFIELD = TFIELDMETADATA(                     &
+    CMNHNAME   = 'ALT_PV',                      &
+    CSTDNAME   = '',                            &
+    CLONGNAME  = 'ALT_PV',                      &
+    CUNITS     = 'PVU',                         &
+    CDIR       = 'XY',                          &
+    CCOMMENT   = 'X_Y_Potential Vorticity ALT', &
+    NGRID      = 1,                             &
+    NTYPE      = TYPEREAL,                      &
+    NDIMS      = 3,                             &
+    NDIMLIST   = [ NMNHDIM_NI, NMNHDIM_NJ, NMNHDIM_NOTLISTED ], &
+    LTIMEDEP   = .TRUE.                         )
+  CALL IO_Field_write(TPFILE,TZFIELD,ZWAL)
+! *********************
+! Wind
+! *********************
+  ZWORK31(:,:,:) = MXF(XUT(:,:,:))
+  CALL ZINTER(ZWORK31, XZZ, ZWAL, ZAL, IIU, IJU, IKU, IKB, IAL, XUNDEF)
+  WHERE(ZWAL.EQ.XUNDEF) ZWAL=ZFILLVAL
+  TZFIELD = TFIELDMETADATA(                     &
+    CMNHNAME   = 'ALT_U',                       &
+    CSTDNAME   = '',                            &
+    CLONGNAME  = 'ALT_U',                       &
+    CUNITS     = 'm s-1',                       &
+    CDIR       = 'XY',                          &
+    CCOMMENT   = 'X_Y_U component of wind ALT', &
+    NGRID      = 1,                             &
+    NTYPE      = TYPEREAL,                      &
+    NDIMS      = 3,                             &
+    NDIMLIST   = [ NMNHDIM_NI, NMNHDIM_NJ, NMNHDIM_NOTLISTED ], &
+    LTIMEDEP   = .TRUE.                         )
+  CALL IO_Field_write(TPFILE,TZFIELD,ZWAL)
+  !
+  ZWORK31(:,:,:) = MYF(XVT(:,:,:))
+  CALL ZINTER(ZWORK31, XZZ, ZWAL, ZAL, IIU, IJU, IKU, IKB, IAL, XUNDEF)
+  WHERE(ZWAL.EQ.XUNDEF) ZWAL=ZFILLVAL
+  TZFIELD = TFIELDMETADATA(                     &
+    CMNHNAME   = 'ALT_V',                       &
+    CSTDNAME   = '',                            &
+    CLONGNAME  = 'ALT_V',                       &
+    CUNITS     = 'm s-1',                       &
+    CDIR       = 'XY',                          &
+    CCOMMENT   = 'X_Y_V component of wind ALT', &
+    NGRID      = 1,                             &
+    NTYPE      = TYPEREAL,                      &
+    NDIMS      = 3,                             &
+    NDIMLIST   = [ NMNHDIM_NI, NMNHDIM_NJ, NMNHDIM_NOTLISTED ], &
+    LTIMEDEP   = .TRUE.                         )
+  CALL IO_Field_write(TPFILE,TZFIELD,ZWAL)
+! *********************
+! Dust extinction (optical depth per km)
+! *********************
+  IF (NRAD_3D >= 1.AND.LDUST) THEN
+    DO JK=IKB,IKE
+      IKRAD = JK - JPVEXT
+      ZWORK31(:,:,JK)= XAER(:,:,IKRAD,3)/(XZZ(:,:,JK+1)-XZZ(:,:,JK))*1.D3
+    ENDDO
+    CALL ZINTER(ZWORK31, XZZ, ZWAL, ZAL, IIU, IJU, IKU, IKB, IAL, XUNDEF)
+    WHERE(ZWAL.EQ.XUNDEF) ZWAL=ZFILLVAL
+    TZFIELD = TFIELDMETADATA(                 &
+      CMNHNAME   = 'ALT_DSTEXT',              &
+      CSTDNAME   = '',                        &
+      CLONGNAME  = 'ALT_DSTEXT',              &
+      CUNITS     = 'km-1',                    &
+      CDIR       = 'XY',                      &
+      CCOMMENT   = 'X_Y_DuST EXTinction ALT', &
+      NGRID      = 1,                         &
+      NTYPE      = TYPEREAL,                  &
+      NDIMS      = 3,                         &
+      NDIMLIST   = [ NMNHDIM_NI, NMNHDIM_NJ, NMNHDIM_NOTLISTED ], &
+      LTIMEDEP   = .TRUE.                     )
+    CALL IO_Field_write(TPFILE,TZFIELD,ZWAL)
+  END IF
+!
+! *********************
+  DEALLOCATE(ZWAL,ZAL,ZWORK32,ZWORK33)
+END IF
+!
+!-------------------------------------------------------------------------------
+!
+!*       7.     COARSE GRAINING DIAGNOSTIC
+!               --------------------------
+!
+IF (LCOARSE) THEN
+  IDX = NDXCOARSE
+!-------------------------------
+! AVERAGE OF TKE BY BLOCK OF IDX POINTS
+  CALL BLOCKAVG(XUT,IDX,IDX,ZWORK31)
+  ZUT_PRM=XUT-ZWORK31
+  CALL BLOCKAVG(XVT,IDX,IDX,ZWORK31)
+  ZVT_PRM=XVT-ZWORK31
+  CALL BLOCKAVG(XWT,IDX,IDX,ZWORK31)
+  ZWT_PRM=XWT-ZWORK31
+!
+  ZWORK31=MXF(ZUT_PRM*ZUT_PRM)
+  CALL BLOCKAVG(ZWORK31,IDX,IDX,ZUU_AVG)
+  ZWORK31=MYF(ZVT_PRM*ZVT_PRM)
+  CALL BLOCKAVG(ZWORK31,IDX,IDX,ZVV_AVG)
+  ZWORK31=MZF(ZWT_PRM*ZWT_PRM)
+  CALL BLOCKAVG(ZWORK31,IDX,IDX,ZWW_AVG)
+  CALL BLOCKAVG(XTKET,IDX,IDX,ZWORK31)
+  ZWORK31=0.5*( ZUU_AVG+ZVV_AVG+ZWW_AVG ) + ZWORK31
+  WRITE (YDX,FMT='(I3.3)') IDX
+  TZFIELD = TFIELDMETADATA(           &
+    CMNHNAME   = 'TKEBAVG'//YDX,      &
+    CSTDNAME   = '',                  &
+    CLONGNAME  = 'TKEBAVG'//YDX,      &
+    CUNITS     = 'm2 s-2',            &
+    CDIR       = 'XY',                &
+    CCOMMENT   = 'TKE_BLOCKAVG'//YDX, &
+    NGRID      = 1,                   &
+    NTYPE      = TYPEREAL,            &
+    NDIMS      = 3,                   &
+    LTIMEDEP   = .TRUE.               )
+  CALL IO_Field_write(TPFILE,TZFIELD,ZWORK31)
+!---------------------------------
+! MOVING AVERAGE OF TKE OVER IDX+1 POINTS
+  IDX = IDX/2
+  CALL MOVINGAVG(XUT,IDX,IDX,ZWORK31)
+  ZUT_PRM=XUT-ZWORK31
+  CALL MOVINGAVG(XVT,IDX,IDX,ZWORK31)
+  ZVT_PRM=XVT-ZWORK31
+  CALL MOVINGAVG(XWT,IDX,IDX,ZWORK31)
+  ZWT_PRM=XWT-ZWORK31
+!
+  ZWORK31=MXF(ZUT_PRM*ZUT_PRM)
+  CALL MOVINGAVG(ZWORK31,IDX,IDX,ZUU_AVG)
+  ZWORK31=MYF(ZVT_PRM*ZVT_PRM)
+  CALL MOVINGAVG(ZWORK31,IDX,IDX,ZVV_AVG)
+  ZWORK31=MZF(ZWT_PRM*ZWT_PRM)
+  CALL MOVINGAVG(ZWORK31,IDX,IDX,ZWW_AVG)
+  CALL MOVINGAVG(XTKET,IDX,IDX,ZWORK31)
+  ZWORK31=0.5*( ZUU_AVG+ZVV_AVG+ZWW_AVG ) + ZWORK31
+  WRITE (YDX,FMT='(I3.3)') 2*IDX+1
+  TZFIELD = TFIELDMETADATA(            &
+    CMNHNAME   = 'TKEMAVG'//YDX,       &
+    CSTDNAME   = '',                   &
+    CLONGNAME  = 'TKEMAVG'//YDX,       &
+    CUNITS     = 'm2 s-2',             &
+    CDIR       = 'XY',                 &
+    CCOMMENT   = 'TKE_MOVINGAVG'//YDX, &
+    NGRID      = 1,                    &
+    NTYPE      = TYPEREAL,             &
+    NDIMS      = 3,                    &
+    LTIMEDEP   = .TRUE.                )
+  CALL IO_Field_write(TPFILE,TZFIELD,ZWORK31)
+END IF
+!
+!-------------------------------------------------------------------------------
+!
+!*       8.     DIAGNOSTIC RELATED TO CHEMISTRY
+!               -------------------------------
+!
+IF (NEQ_BUDGET>0) THEN
+  TZFIELD = TFIELDMETADATA(                   &
+    CMNHNAME   = 'generic for CNAMES_BUDGET', & !Temporary name to ease identification
+    CSTDNAME   = '',                          &
+    CUNITS     = 'ppv s-1',                   &
+    CDIR       = 'XY',                        &
+    NGRID      = 1,                           &
+    NTYPE      = TYPEREAL,                    &
+    NDIMS      = 4,                           &
+    LTIMEDEP   = .TRUE.                       )
+  !
+  DO JSV = 1, NEQ_BUDGET
+    TZFIELD%CMNHNAME   = TRIM(CNAMES_BUDGET(JSV))//'_BUDGET'
+    TZFIELD%CLONGNAME  = TRIM(TZFIELD%CMNHNAME)
+    TZFIELD%CCOMMENT   = 'X_Y_Z_'//TRIM(CNAMES_BUDGET(JSV))//'_BUDGET'
+    CALL IO_Field_write(TPFILE,TZFIELD,XTCHEM(JSV)%XB_REAC(:,:,:,:))
+  END DO
+  !
+  TZFIELD = TFIELDMETADATA(                   &
+    CMNHNAME   = 'generic for reaction list', & !Temporary name to ease identification
+    CSTDNAME   = '',                          &
+    CUNITS     = '',                          &
+    CDIR       = 'XY',                        &
+    NGRID      = 1,                           &
+    NTYPE      = TYPEINT,                     &
+    NDIMS      = 1,                           &
+    LTIMEDEP   = .TRUE.                       )
+  !
+  DO JSV=1, NEQ_BUDGET
+    TZFIELD%CMNHNAME   = TRIM(CNAMES_BUDGET(JSV))//'_CHREACLIST'
+    TZFIELD%CLONGNAME  = TRIM(TZFIELD%CMNHNAME)
+    TZFIELD%CCOMMENT   = TRIM(CNAMES_BUDGET(JSV))//'_REACTION_LIST'
+    CALL IO_Field_write(TPFILE,TZFIELD,XTCHEM(JSV)%NB_REAC(:))
+  END DO
+END IF
+!
+!
+! chemical prod/loss terms
+IF (NEQ_PLT>0) THEN
+  TZFIELD = TFIELDMETADATA(                      &
+    CMNHNAME   = 'generic for CNAMES_PRODLOSST', & !Temporary name to ease identification
+    CSTDNAME   = '',                             &
+    CUNITS     = 'ppv s-1',                      &
+    CDIR       = 'XY',                           &
+    NGRID      = 1,                              &
+    NTYPE      = TYPEREAL,                       &
+    NDIMS      = 3,                              &
+    LTIMEDEP   = .TRUE.                          )
+  !
+  DO JSV = 1, NEQ_PLT
+    TZFIELD%CMNHNAME   = TRIM(CNAMES_PRODLOSST(JSV))//'_PROD'
+    TZFIELD%CLONGNAME  = TRIM(TZFIELD%CMNHNAME)
+    TZFIELD%CCOMMENT   = 'X_Y_Z_'//TRIM(CNAMES_PRODLOSST(JSV))//'_PROD'
+    CALL IO_Field_write(TPFILE,TZFIELD,XPROD(:,:,:,JSV))
+    !
+    TZFIELD%CMNHNAME   = TRIM(CNAMES_PRODLOSST(JSV))//'_LOSS'
+    TZFIELD%CLONGNAME  = TRIM(TZFIELD%CMNHNAME)
+    TZFIELD%CCOMMENT   = 'X_Y_Z_'//TRIM(CNAMES_PRODLOSST(JSV))//'_LOSS'
+    CALL IO_Field_write(TPFILE,TZFIELD,XLOSS(:,:,:,JSV))
+  END DO
+END IF
+!
+!
+DEALLOCATE(ZWORK21,ZWORK31,ZTEMP)
+!
+END SUBROUTINE WRITE_LFIFM1_FOR_DIAG_SUPP 
diff --git a/src/PHYEX/ext/xy_to_latlon.f90 b/src/PHYEX/ext/xy_to_latlon.f90
new file mode 100644
index 0000000000000000000000000000000000000000..9effbed461cfe363dbffd7da68038ce37bd3763e
--- /dev/null
+++ b/src/PHYEX/ext/xy_to_latlon.f90
@@ -0,0 +1,204 @@
+!MNH_LIC Copyright 1996-2023 CNRS, Meteo-France and Universite Paul Sabatier
+!MNH_LIC This is part of the Meso-NH software governed by the CeCILL-C licence
+!MNH_LIC version 1. See LICENSE, CeCILL-C_V1-en.txt and CeCILL-C_V1-fr.txt
+!MNH_LIC for details. version 1.
+!-----------------------------------------------------------------
+!     ####################
+      PROGRAM XY_TO_LATLON
+!     ####################
+!
+!!**** *XY_TO_LATLON* program to compute latitude and longiude from x and y
+!!                    for a MESONH file
+!!
+!!    PURPOSE
+!!    -------
+!!
+!!    METHOD
+!!    ------
+!!   
+!!    EXTERNAL
+!!    --------
+!!
+!!    module MODE_GRIDPROJ : contains projection routines
+!!                         SM_LATLON and SM_XYHAT
+!!                           
+!!
+!!    IMPLICIT ARGUMENTS
+!!    ------------------
+!!
+!!    module MODD_GRID     : variables for projection:
+!!                         XLAT0,XLON0,XRPK,XBETA
+!!
+!!    module MODD_PGDDIM  : specify the dimentions of the data arrays:
+!!                         NPGDIMAX and NPGDJMAX
+!!
+!!    module MODD_PGDGRID : grid variables:
+!!                         XPGDLONOR,XPGDLATOR: longitude and latitude of the
+!!                           origine point for the conformal projection.
+!!                         XPGDXHAT,XPGDYHAT: position x,y in the conformal plane   
+!!
+!!
+!!    REFERENCE
+!!    ---------
+!!
+!!    AUTHOR
+!!    ------
+!!
+!!    V. Masson          Meteo-France
+!!
+!!    MODIFICATION
+!!    ------------
+!!
+!!    Original     26/01/96
+!!
+!!    no transfer of the file when closing   Dec. 09, 1996 (V.Masson)
+!!    + changes call to READ_HGRID
+!  P. Wautelet 05/2016-04/2018: new data structures and calls for I/O
+!  P. Wautelet 07/02/2019: force TYPE to a known value for IO_File_add2list
+!  P. Wautelet 26/04/2019: replace non-standard FLOAT function by REAL function
+!  P. Wautelet 14/04/2020: add missing initializations (XY_TO_LATLON was not working)
+!----------------------------------------------------------------------------
+!
+!*    0.     DECLARATION
+!            -----------
+!
+use MODD_CONF,             only: CPROGRAM
+USE MODD_DIM_n
+USE MODD_GRID
+USE MODD_IO,               ONLY: TFILEDATA
+USE MODD_PGDDIM
+USE MODD_PGDGRID
+USE MODD_PARAMETERS
+USE MODD_LUNIT
+!
+USE MODE_FIELD,            ONLY: INI_FIELD_LIST
+USE MODE_GRIDPROJ
+USE MODE_INIT_ll,          only: SET_DIM_ll, SET_JP_ll
+USE MODE_IO,               only: IO_Config_set, IO_Init
+use MODE_IO_FIELD_READ,    only: IO_Field_read
+USE MODE_IO_FILE,          only: IO_File_close, IO_File_open
+USE MODE_IO_MANAGE_STRUCT, only: IO_File_add2list
+USE MODE_MODELN_HANDLER,   ONLY: GOTO_MODEL
+use MODE_SPLITTINGZ_ll
+!
+USE MODE_INI_CST, ONLY: INI_CST
+USE MODI_READ_HGRID
+!
+USE MODN_CONFIO,           ONLY: NAM_CONFIO
+!
+IMPLICIT NONE
+!
+!*    0.2    Declaration of variables
+!            ------------------------
+!
+CHARACTER(LEN=28) :: YINIFILE  ! name of input FM file
+CHARACTER(LEN=28) :: YNAME     ! true name of input FM file
+CHARACTER(LEN=28) :: YDAD      ! name of dad of input FM file
+CHARACTER(LEN=2)  :: YSTORAGE_TYPE
+INTEGER :: INAM                ! Logical unit for namelist file
+INTEGER :: ILUOUT0             ! Logical unit for output file.
+INTEGER :: IRESP               ! Return-code if problem eraised.
+REAL    :: ZI,ZJ               ! input positions of the point
+INTEGER :: II,IJ               ! integer positions of the point
+REAL    :: ZXHAT               ! output conformal coodinate x
+REAL    :: ZYHAT               ! output conformal coodinate y
+REAL    :: ZLAT                ! output latitude
+REAL    :: ZLON                ! output longitude
+TYPE(TFILEDATA),POINTER :: TZINIFILE => NULL()
+TYPE(TFILEDATA),POINTER :: TZNMLFILE => NULL()
+!
+!*    0.3    Declaration of namelists
+!            ------------------------
+!
+NAMELIST/NAM_INIFILE/ YINIFILE
+!----------------------------------------------------------------------------
+!
+    WRITE(*,*) '+---------------------------------+'
+    WRITE(*,*) '|      program xy_to_latlon       |'
+    WRITE(*,*) '+---------------------------------+'
+    WRITE(*,*) ''
+    WRITE(*,*) 'Warning: I and J are integer for flux points'
+!
+!*    1.     Initializations
+!            ---------------
+!
+CALL GOTO_MODEL(1)
+!
+CALL VERSION()
+!
+CPROGRAM='LAT2XY'
+!
+CALL IO_Init()
+!
+CALL INI_CST()
+!
+CALL INI_FIELD_LIST()
+!
+!*    2.     Reading of namelist file
+!            ------------------------
+!
+CALL IO_File_add2list(TZNMLFILE,'XY2LATLON1.nam','NML','READ')
+CALL IO_File_open(TZNMLFILE)
+INAM=TZNMLFILE%NLU
+READ(INAM,NAM_INIFILE)
+!
+READ(INAM,NAM_CONFIO)
+CALL IO_Config_set()
+CALL IO_File_close(TZNMLFILE)
+!
+!*    1.     Opening of MESONH file
+!            ----------------------
+!
+CALL IO_File_add2list(TZINIFILE,TRIM(YINIFILE),'MNH','READ',KLFITYPE=2,KLFIVERB=2)
+CALL IO_File_open(TZINIFILE)
+!
+CALL IO_Field_read(TZINIFILE,'IMAX',  NIMAX)
+CALL IO_Field_read(TZINIFILE,'JMAX',  NJMAX)
+NKMAX = 1
+CALL IO_Field_read(TZINIFILE,'JPHEXT',JPHEXT)
+!
+CALL SET_JP_ll(1,JPHEXT,JPVEXT,JPHEXT)
+CALL SET_DIM_ll(NIMAX, NJMAX, NKMAX)
+CALL INI_PARAZ_ll(IRESP)
+!
+!*    2.     Reading of MESONH file
+!            ----------------------
+!
+CALL READ_HGRID(0,TZINIFILE,YNAME,YDAD,YSTORAGE_TYPE)
+!
+!*    3.     Closing of MESONH file
+!            ----------------------
+!
+CALL IO_File_close(TZINIFILE)
+!
+!-------------------------------------------------------------------------------
+!
+!*    4.     Reading of I and J
+!            ------------------
+!
+DO
+  WRITE(*,*) '-------------------------------------------------------------------'
+  WRITE(*,*) 'please enter index I  (real, quit or q to stop):'
+  READ(*,*,ERR=1) ZI
+  WRITE(*,*) 'please enter index J  (real, quit or q to stop):'
+  READ(*,*,ERR=1) ZJ
+!
+  II=MAX(MIN(INT(ZI),NPGDIMAX+2*JPHEXT-1),1)
+  IJ=MAX(MIN(INT(ZJ),NPGDJMAX+2*JPHEXT-1),1)
+  ZXHAT=XPGDXHAT(II) + (ZI-REAL(II)) * ( XPGDXHAT(II+1) - XPGDXHAT(II) )
+  ZYHAT=XPGDYHAT(IJ) + (ZJ-REAL(IJ)) * ( XPGDYHAT(IJ+1) - XPGDYHAT(IJ) )
+!
+  WRITE(*,*) 'x=', ZXHAT
+  WRITE(*,*) 'y=', ZYHAT
+!
+  CALL SM_LATLON(XPGDLATOR,XPGDLONOR,   &
+                 ZXHAT,ZYHAT,ZLAT,ZLON)
+!
+  WRITE(*,*) 'lat=', ZLAT
+  WRITE(*,*) 'lon=', ZLON
+END DO
+1   WRITE(*,*) 'good bye'
+!
+!-------------------------------------------------------------------------------
+!
+END PROGRAM XY_TO_LATLON
diff --git a/src/PHYEX/ext/yomhook.f90 b/src/PHYEX/ext/yomhook.f90
new file mode 100644
index 0000000000000000000000000000000000000000..a0b84f76453a48b91853e335a1d44433f981d457
--- /dev/null
+++ b/src/PHYEX/ext/yomhook.f90
@@ -0,0 +1,156 @@
+!MNH_LIC Copyright 1994-2014 CNRS, Meteo-France and Universite Paul Sabatier
+!MNH_LIC This is part of the Meso-NH software governed by the CeCILL-C licence
+!MNH_LIC version 1. See LICENSE, CeCILL-C_V1-en.txt and CeCILL-C_V1-fr.txt  
+!MNH_LIC for details. version 1.
+MODULE YOMHOOK
+USE PARKIND1  ,ONLY : JPIM     ,JPRB
+LOGICAL :: LHOOK=.FALSE.
+INTEGER, PARAMETER :: JPHOOK=JPRB
+INTERFACE DR_HOOK  
+MODULE PROCEDURE &
+  DR_HOOK_DEFAULT, &
+  DR_HOOK_FILE, &
+  DR_HOOK_SIZE, &
+  DR_HOOK_FILE_SIZE, &
+  DR_HOOK_MULTI_DEFAULT, &
+  DR_HOOK_MULTI_FILE, &
+  DR_HOOK_MULTI_SIZE, &
+  DR_HOOK_MULTI_FILE_SIZE
+END INTERFACE
+
+CONTAINS 
+
+SUBROUTINE DR_HOOK_DEFAULT(CDNAME,KSWITCH,PKEY)
+CHARACTER(LEN=*), INTENT(IN) :: CDNAME
+INTEGER(KIND=JPIM),        INTENT(IN) :: KSWITCH
+REAL(KIND=JPRB),        INTENT(INOUT) :: PKEY
+!CALL DR_HOOK_UTIL(CDNAME,KSWITCH,PKEY,'',0)
+END SUBROUTINE DR_HOOK_DEFAULT
+
+SUBROUTINE DR_HOOK_MULTI_DEFAULT(CDNAME,KSWITCH,PKEY)
+CHARACTER(LEN=*), INTENT(IN) :: CDNAME
+INTEGER(KIND=JPIM),        INTENT(IN) :: KSWITCH
+REAL(KIND=JPRB),        INTENT(INOUT) :: PKEY(:)
+!CALL DR_HOOK_UTIL_MULTI(CDNAME,KSWITCH,PKEY,SIZE(PKEY),'',0)
+END SUBROUTINE DR_HOOK_MULTI_DEFAULT
+
+
+
+SUBROUTINE DR_HOOK_FILE(CDNAME,KSWITCH,PKEY,CDFILE)
+CHARACTER(LEN=*), INTENT(IN) :: CDNAME,CDFILE
+INTEGER(KIND=JPIM),        INTENT(IN) :: KSWITCH
+REAL(KIND=JPRB),        INTENT(INOUT) :: PKEY
+!CALL DR_HOOK_UTIL(CDNAME,KSWITCH,PKEY,CDFILE,0)
+END SUBROUTINE DR_HOOK_FILE
+
+SUBROUTINE DR_HOOK_MULTI_FILE(CDNAME,KSWITCH,PKEY,CDFILE)
+CHARACTER(LEN=*), INTENT(IN) :: CDNAME,CDFILE
+INTEGER(KIND=JPIM),        INTENT(IN) :: KSWITCH
+REAL(KIND=JPRB),        INTENT(INOUT) :: PKEY(:)
+!CALL DR_HOOK_UTIL_MULTI(CDNAME,KSWITCH,PKEY,SIZE(PKEY),CDFILE,0)
+END SUBROUTINE DR_HOOK_MULTI_FILE
+
+
+
+SUBROUTINE DR_HOOK_SIZE(CDNAME,KSWITCH,PKEY,KSIZEINFO)
+CHARACTER(LEN=*), INTENT(IN) :: CDNAME
+INTEGER(KIND=JPIM),        INTENT(IN) :: KSWITCH,KSIZEINFO
+REAL(KIND=JPRB),        INTENT(INOUT) :: PKEY
+!CALL DR_HOOK_UTIL(CDNAME,KSWITCH,PKEY,'',KSIZEINFO)
+END SUBROUTINE DR_HOOK_SIZE
+
+SUBROUTINE DR_HOOK_MULTI_SIZE(CDNAME,KSWITCH,PKEY,KSIZEINFO)
+CHARACTER(LEN=*), INTENT(IN) :: CDNAME
+INTEGER(KIND=JPIM),        INTENT(IN) :: KSWITCH,KSIZEINFO
+REAL(KIND=JPRB),        INTENT(INOUT) :: PKEY(:)
+!CALL DR_HOOK_UTIL_MULTI(CDNAME,KSWITCH,PKEY,SIZE(PKEY),'',KSIZEINFO)
+END SUBROUTINE DR_HOOK_MULTI_SIZE
+
+
+
+SUBROUTINE DR_HOOK_FILE_SIZE(CDNAME,KSWITCH,PKEY,CDFILE,KSIZEINFO)
+CHARACTER(LEN=*), INTENT(IN) :: CDNAME,CDFILE
+INTEGER(KIND=JPIM),        INTENT(IN) :: KSWITCH,KSIZEINFO
+REAL(KIND=JPRB),        INTENT(INOUT) :: PKEY
+!CALL DR_HOOK_UTIL(CDNAME,KSWITCH,PKEY,CDFILE,KSIZEINFO)
+END SUBROUTINE DR_HOOK_FILE_SIZE
+
+SUBROUTINE DR_HOOK_MULTI_FILE_SIZE(CDNAME,KSWITCH,PKEY,CDFILE,KSIZEINFO)
+CHARACTER(LEN=*), INTENT(IN) :: CDNAME,CDFILE
+INTEGER(KIND=JPIM),        INTENT(IN) :: KSWITCH,KSIZEINFO
+REAL(KIND=JPRB),        INTENT(INOUT) :: PKEY(:)
+!CALL DR_HOOK_UTIL_MULTI(CDNAME,KSWITCH,PKEY,SIZE(PKEY),CDFILE,KSIZEINFO)
+END SUBROUTINE DR_HOOK_MULTI_FILE_SIZE
+
+END MODULE YOMHOOK
+!====================================================================
+SUBROUTINE DR_HOOK_DEFAULT(CDNAME,KSWITCH,PKEY)
+USE PARKIND1  ,ONLY : JPIM     ,JPRB
+CHARACTER(LEN=*), INTENT(IN) :: CDNAME
+INTEGER(KIND=JPIM),        INTENT(IN) :: KSWITCH
+REAL(KIND=JPRB),        INTENT(INOUT) :: PKEY
+!CALL DR_HOOK_UTIL(CDNAME,KSWITCH,PKEY,'',0)
+END SUBROUTINE DR_HOOK_DEFAULT
+
+SUBROUTINE DR_HOOK_MULTI_DEFAULT(CDNAME,KSWITCH,PKEY)
+USE PARKIND1  ,ONLY : JPIM     ,JPRB
+CHARACTER(LEN=*), INTENT(IN) :: CDNAME
+INTEGER(KIND=JPIM),        INTENT(IN) :: KSWITCH
+REAL(KIND=JPRB),        INTENT(INOUT) :: PKEY(:)
+!CALL DR_HOOK_UTIL_MULTI(CDNAME,KSWITCH,PKEY,SIZE(PKEY),'',0)
+END SUBROUTINE DR_HOOK_MULTI_DEFAULT
+
+
+
+SUBROUTINE DR_HOOK_FILE(CDNAME,KSWITCH,PKEY,CDFILE)
+USE PARKIND1  ,ONLY : JPIM     ,JPRB
+CHARACTER(LEN=*), INTENT(IN) :: CDNAME,CDFILE
+INTEGER(KIND=JPIM),        INTENT(IN) :: KSWITCH
+REAL(KIND=JPRB),        INTENT(INOUT) :: PKEY
+!CALL DR_HOOK_UTIL(CDNAME,KSWITCH,PKEY,CDFILE,0)
+END SUBROUTINE DR_HOOK_FILE
+
+SUBROUTINE DR_HOOK_MULTI_FILE(CDNAME,KSWITCH,PKEY,CDFILE)
+USE PARKIND1  ,ONLY : JPIM     ,JPRB
+CHARACTER(LEN=*), INTENT(IN) :: CDNAME,CDFILE
+INTEGER(KIND=JPIM),        INTENT(IN) :: KSWITCH
+REAL(KIND=JPRB),        INTENT(INOUT) :: PKEY(:)
+!CALL DR_HOOK_UTIL_MULTI(CDNAME,KSWITCH,PKEY,SIZE(PKEY),CDFILE,0)
+END SUBROUTINE DR_HOOK_MULTI_FILE
+
+
+
+SUBROUTINE DR_HOOK_SIZE(CDNAME,KSWITCH,PKEY,KSIZEINFO)
+USE PARKIND1  ,ONLY : JPIM     ,JPRB
+CHARACTER(LEN=*), INTENT(IN) :: CDNAME
+INTEGER(KIND=JPIM),        INTENT(IN) :: KSWITCH,KSIZEINFO
+REAL(KIND=JPRB),        INTENT(INOUT) :: PKEY
+!CALL DR_HOOK_UTIL(CDNAME,KSWITCH,PKEY,'',KSIZEINFO)
+END SUBROUTINE DR_HOOK_SIZE
+
+SUBROUTINE DR_HOOK_MULTI_SIZE(CDNAME,KSWITCH,PKEY,KSIZEINFO)
+USE PARKIND1  ,ONLY : JPIM     ,JPRB
+CHARACTER(LEN=*), INTENT(IN) :: CDNAME
+INTEGER(KIND=JPIM),        INTENT(IN) :: KSWITCH,KSIZEINFO
+REAL(KIND=JPRB),        INTENT(INOUT) :: PKEY(:)
+!CALL DR_HOOK_UTIL_MULTI(CDNAME,KSWITCH,PKEY,SIZE(PKEY),'',KSIZEINFO)
+END SUBROUTINE DR_HOOK_MULTI_SIZE
+
+
+
+SUBROUTINE DR_HOOK_FILE_SIZE(CDNAME,KSWITCH,PKEY,CDFILE,KSIZEINFO)
+USE PARKIND1  ,ONLY : JPIM     ,JPRB
+CHARACTER(LEN=*), INTENT(IN) :: CDNAME,CDFILE
+INTEGER(KIND=JPIM),        INTENT(IN) :: KSWITCH,KSIZEINFO
+REAL(KIND=JPRB),        INTENT(INOUT) :: PKEY
+!CALL DR_HOOK_UTIL(CDNAME,KSWITCH,PKEY,CDFILE,KSIZEINFO)
+END SUBROUTINE DR_HOOK_FILE_SIZE
+
+SUBROUTINE DR_HOOK_MULTI_FILE_SIZE(CDNAME,KSWITCH,PKEY,CDFILE,KSIZEINFO)
+USE PARKIND1  ,ONLY : JPIM     ,JPRB
+CHARACTER(LEN=*), INTENT(IN) :: CDNAME,CDFILE
+INTEGER(KIND=JPIM),        INTENT(IN) :: KSWITCH,KSIZEINFO
+REAL(KIND=JPRB),        INTENT(INOUT) :: PKEY(:)
+!CALL DR_HOOK_UTIL_MULTI(CDNAME,KSWITCH,PKEY,SIZE(PKEY),CDFILE,KSIZEINFO)
+END SUBROUTINE DR_HOOK_MULTI_FILE_SIZE
+
diff --git a/src/PHYEX/ext/zoom_pgd.f90 b/src/PHYEX/ext/zoom_pgd.f90
new file mode 100644
index 0000000000000000000000000000000000000000..2b50885c8b679b3940c28ef06825170ef5a02326
--- /dev/null
+++ b/src/PHYEX/ext/zoom_pgd.f90
@@ -0,0 +1,271 @@
+!MNH_LIC Copyright 2005-2023 CNRS, Meteo-France and Universite Paul Sabatier
+!MNH_LIC This is part of the Meso-NH software governed by the CeCILL-C licence
+!MNH_LIC version 1. See LICENSE, CeCILL-C_V1-en.txt and CeCILL-C_V1-fr.txt
+!MNH_LIC for details. version 1.
+!-----------------------------------------------------------------
+!     ################
+      PROGRAM ZOOM_PGD
+!     ################
+!!
+!!    PURPOSE
+!!    -------
+!!   This program zooms the physiographic data fields.
+!!
+!!    METHOD
+!!    ------
+!!   
+!!
+!!    EXTERNAL
+!!    --------
+!!
+!!
+!!    IMPLICIT ARGUMENTS
+!!    ------------------
+!!
+!!
+!!    REFERENCE
+!!    ---------
+!!
+!!    AUTHOR
+!!    ------
+!!
+!!    V. Masson                   Meteo-France
+!!
+!!    MODIFICATION
+!!    ------------
+!!
+!!    Original     march 2005
+!!    10/10/2011  J.Escobar call INI_PARAZ_ll
+!!    30/03/2012  S.Bielli  Add NAM_NCOUT
+!!  06/2016     (G.Delautier) phasage surfex 8
+!!    08/07/2016  P.Wautelet Removed MNH_NCWRIT define
+!!  Philippe Wautelet: 05/2016-04/2018: new data structures and calls for I/O
+!  P. Wautelet 07/02/2019: force TYPE to a known value for IO_File_add2list
+!  P. Wautelet 14/02/2019: remove CLUOUT/CLUOUT0 and associated variables
+!  P. Wautelet 06/07/2021: use FINALIZE_MNH
+!----------------------------------------------------------------------------
+!
+!*    0.     DECLARATION
+!            -----------
+!
+USE MODD_CONF,   ONLY : CPROGRAM, L1D, L2D, LPACK
+USE MODD_IO,               only:  TFILE_OUTPUTLISTING, TFILEDATA
+USE MODD_LUNIT,  ONLY : TLUOUT0, TOUTDATAFILE
+USE MODD_PARAMETERS, ONLY : XUNDEF, NUNDEF, JPVEXT, JPHEXT, JPMODELMAX
+USE MODD_PARAM_n,     ONLY : CSURF
+USE MODD_DIM_n,       ONLY : NIMAX, NJMAX
+USE MODD_CONF_n,   ONLY : CSTORAGE_TYPE
+use modd_precision, only: LFIINT
+!
+USE MODE_FINALIZE_MNH,     only: FINALIZE_MNH
+USE MODE_POS
+USE MODE_IO,               only: IO_Config_set, IO_Init
+USE MODE_IO_FIELD_READ,    only: IO_Field_read
+USE MODE_IO_FIELD_WRITE,   only: IO_Field_write, IO_Header_write
+USE MODE_IO_FILE,          only: IO_File_close, IO_File_open
+USE MODE_IO_MANAGE_STRUCT, only: IO_File_add2list
+USE MODE_ll
+USE MODE_MSG
+USE MODE_MODELN_HANDLER
+!
+USE MODI_READ_HGRID
+USE MODI_WRITE_HGRID
+USE MODI_SET_SUBDOMAIN
+!JUANZ
+USE MODE_SPLITTINGZ_ll
+!JUANZ
+!
+USE MODI_VERSION
+USE MODI_READ_ALL_NAMELISTS
+USE MODI_ZOOM_PGD_SURF_ATM
+USE MODI_WRITE_PGD_SURF_ATM_N
+USE MODD_MNH_SURFEX_n
+!
+USE MODN_CONFIO, ONLY : NAM_CONFIO
+USE MODE_INI_CST, ONLY: INI_CST
+!
+IMPLICIT NONE
+!
+!
+!*    0.2    Declaration of local variables
+!            ------------------------------
+!
+INTEGER :: IRESP    ! return code for I/O
+INTEGER :: ILUOUT0
+INTEGER :: ILUNAM
+INTEGER :: IINFO_ll
+CHARACTER(LEN=28)  :: CPGDFILE              ! name of the PGD file
+CHARACTER(LEN=28)  :: YZOOMFILE             ! name of the output file
+CHARACTER(LEN=2)   :: YZOOMNBR
+CHARACTER(LEN=28)  :: YMY_NAME,YDAD_NAME
+CHARACTER(LEN=28)  :: YPGDFILE
+CHARACTER(LEN=2)   :: YSTORAGE_TYPE
+LOGICAL :: GFOUND
+INTEGER            :: IXOR_DAD,IYOR_DAD  ! compared to Dad file, if any
+INTEGER            :: IXOR,IYOR          ! given or computed
+INTEGER            :: IDXRATIO,IDYRATIO
+TYPE(TFILEDATA),POINTER :: TZNMLFILE  => NULL()
+TYPE(TFILEDATA),POINTER :: TZPGDFILE  => NULL()
+TYPE(TFILEDATA),POINTER :: TZZOOMFILE => NULL()
+!
+REAL,  DIMENSION(:,:), ALLOCATABLE :: ZZS1,ZZSMT1,ZZS2,ZZSMT2
+!
+NAMELIST/NAM_PGDFILE/CPGDFILE,YZOOMFILE,YZOOMNBR
+!------------------------------------------------------------------------------
+!
+CALL GOTO_MODEL(1)
+CALL VERSION
+CPROGRAM='ZOOMPG'
+CSTORAGE_TYPE = 'PG'
+!
+CALL INI_CST
+! 
+!
+!*    1.      Set default names and parallelized I/O
+!             --------------------------------------
+!
+CALL IO_Init()
+!
+CALL IO_File_add2list(TLUOUT0,'OUTPUT_LISTING0','OUTPUTLISTING','WRITE')
+CALL IO_File_open(TLUOUT0)
+TFILE_OUTPUTLISTING => TLUOUT0
+ILUOUT0=TLUOUT0%NLU
+!
+CALL IO_File_add2list(TZNMLFILE,'PRE_ZOOM1.nam','NML','READ')
+CALL IO_File_open(TZNMLFILE)
+ILUNAM = TZNMLFILE%NLU
+!
+CPGDFILE  = 'PGDFILE'                         ! name of the input file
+YZOOMFILE = ''
+YZOOMNBR  = '00'
+CALL POSNAM( TZNMLFILE, 'NAM_PGDFILE', GFOUND )
+IF (GFOUND) READ(UNIT=ILUNAM,NML=NAM_PGDFILE)
+CALL POSNAM( TZNMLFILE, 'NAM_CONFIO', GFOUND )
+IF (GFOUND) READ(UNIT=ILUNAM,NML=NAM_CONFIO)
+CALL IO_Config_set()
+!
+!------------------------------------------------------------------------------
+!
+!*    2.      ZOOM OF PGD DOMAIN
+!             ------------------
+!
+!*    2.1     Open PGD file
+!             -------------
+!
+CALL IO_File_add2list(TZPGDFILE,TRIM(CPGDFILE),'PGD','READ',KLFINPRAR=INT(1,KIND=LFIINT),KLFITYPE=2,KLFIVERB=5)
+CALL IO_File_open(TZPGDFILE)
+!
+!*    2.2     Reading of initial grid
+!             -----------------------
+!
+CALL READ_HGRID(1,TZPGDFILE,YMY_NAME,YDAD_NAME,YSTORAGE_TYPE)
+!
+! NIMAX, NJMAX: size of input domain
+ALLOCATE(ZZS1  (NIMAX+2*JPHEXT,NJMAX+2*JPHEXT))
+ALLOCATE(ZZSMT1(NIMAX+2*JPHEXT,NJMAX+2*JPHEXT))
+CALL IO_Field_read(TZPGDFILE,'ZS',ZZS1)
+CALL IO_Field_read(TZPGDFILE,'ZSMT',ZZSMT1)
+!
+!*    2.3     Define subdomain
+!             ----------------
+!
+CALL SET_SUBDOMAIN(TZNMLFILE,TZPGDFILE,IXOR_DAD,IYOR_DAD,IXOR,IYOR,IDXRATIO,IDYRATIO)
+!
+CALL IO_File_close(TZNMLFILE)
+!
+! NIMAX, NJMAX: size of output domain
+!
+CALL SET_JP_ll(JPMODELMAX,JPHEXT,JPVEXT,JPHEXT)
+CALL SET_DAD0_ll()
+CALL SET_DIM_ll(NIMAX, NJMAX, 1)
+CALL SET_LBX_ll('OPEN',1)
+CALL SET_LBY_ll('OPEN', 1)
+CALL SET_XRATIO_ll(1, 1)
+CALL SET_YRATIO_ll(1, 1)
+CALL SET_XOR_ll(1, 1)
+CALL SET_XEND_ll(NIMAX+2*JPHEXT, 1)
+CALL SET_YOR_ll(1, 1)
+CALL SET_YEND_ll(NJMAX+2*JPHEXT, 1)
+CALL SET_DAD_ll(0, 1)
+!JUANZ CALL INI_PARA_ll(IINFO_ll)
+CALL INI_PARAZ_ll(IINFO_ll)
+!
+!
+!*    2.4     Writing of final grid
+!             ---------------------
+!
+IF ( (LEN_TRIM(YZOOMFILE) == 0) .OR. (ADJUSTL(YZOOMFILE) == ADJUSTL(CPGDFILE)) ) THEN
+  YZOOMFILE=ADJUSTL(ADJUSTR(CPGDFILE)//'.z'//ADJUSTL(YZOOMNBR))
+END IF
+!
+CALL IO_File_add2list(TZZOOMFILE,TRIM(YZOOMFILE),'PGD','WRITE',KLFINPRAR=INT(1,KIND=LFIINT),KLFITYPE=1,KLFIVERB=5)
+!
+CALL IO_File_open(TZZOOMFILE)
+CALL WRITE_HGRID(1,TZZOOMFILE)
+!
+!*    2.5     Preparation of surface physiographic fields
+!             -------------------------------------------
+!
+CALL IO_Field_read(TZPGDFILE,'SURF',CSURF)
+!
+!
+IF (CSURF=='EXTE') THEN
+  CALL SURFEX_ALLOC_LIST(1)
+  YSURF_CUR => YSURF_LIST(1)
+  CALL READ_ALL_NAMELISTS(YSURF_CUR,'MESONH','PRE',.FALSE.)      
+  YPGDFILE   = CPGDFILE
+  CPGDFILE   = YZOOMFILE
+  TOUTDATAFILE => TZZOOMFILE
+  CALL GOTO_SURFEX(1)
+  CALL ZOOM_PGD_SURF_ATM(YSURF_CUR,'MESONH',YPGDFILE,'MESONH',YZOOMFILE,'MESONH')
+!
+!*    2.6     Writes the physiographic fields
+!             -------------------------------
+!
+  CALL WRITE_PGD_SURF_ATM_n(YSURF_CUR,'MESONH')
+ELSE
+  ALLOCATE(ZZS2(NIMAX+2*JPHEXT,NJMAX+2*JPHEXT))
+  ZZS2(:,:)=ZZS1(IXOR:IXOR+NIMAX+2*JPHEXT-1,IYOR:IYOR+NJMAX+2*JPHEXT-1)
+  CALL IO_Field_write(TZZOOMFILE,'ZS',ZZS2)
+END IF
+!
+ALLOCATE(ZZSMT2(NIMAX+2*JPHEXT,NJMAX+2*JPHEXT))
+ZZSMT2(:,:)=ZZSMT1(IXOR:IXOR+NIMAX+2*JPHEXT-1,IYOR:IYOR+NJMAX+2*JPHEXT-1)
+CALL IO_Field_write(TZZOOMFILE,'ZSMT',ZZSMT2)
+!
+!*    2.7     Write configuration variables in the output file
+!             ------------------------------------------------
+!
+CALL IO_Header_write(TZZOOMFILE)
+CALL IO_Field_write(TZZOOMFILE,'DXRATIO',IDXRATIO)
+CALL IO_Field_write(TZZOOMFILE,'DYRATIO',IDYRATIO)
+CALL IO_Field_write(TZZOOMFILE,'XOR',    IXOR_DAD)
+CALL IO_Field_write(TZZOOMFILE,'YOR',    IYOR_DAD)
+CALL IO_Field_write(TZZOOMFILE,'L1D',    L1D)
+CALL IO_Field_write(TZZOOMFILE,'L2D',    L2D)
+CALL IO_Field_write(TZZOOMFILE,'PACK',   LPACK)
+CALL IO_Field_write(TZZOOMFILE,'SURF',   CSURF)
+CALL IO_File_close(TZZOOMFILE)
+!
+!*    2.8     Shift to new PGD file
+!             ---------------------
+!
+CPGDFILE = YZOOMFILE
+!                       
+!------------------------------------------------------------------------------
+!
+!*    3.     CLOSE PARALLELIZED I/O
+!            ----------------------
+!
+CALL IO_File_close(TZPGDFILE)
+!
+WRITE(ILUOUT0,*)
+WRITE(ILUOUT0,*) '***************************'
+WRITE(ILUOUT0,*) '* ZOOM_PGD ends correctly *'
+WRITE(ILUOUT0,*) '***************************'
+!
+CALL FINALIZE_MNH()
+!
+!-------------------------------------------------------------------------------
+!
+END PROGRAM ZOOM_PGD
diff --git a/src/PHYEX/micro/LICENCE b/src/PHYEX/micro/LICENCE
new file mode 100644
index 0000000000000000000000000000000000000000..132cc3f33fa7fd4169a92b05241db59c8428a7ab
--- /dev/null
+++ b/src/PHYEX/micro/LICENCE
@@ -0,0 +1,51 @@
+Minpack Copyright Notice (1999) University of Chicago.  All rights reserved
+
+Redistribution and use in source and binary forms, with or
+without modification, are permitted provided that the
+following conditions are met:
+
+1. Redistributions of source code must retain the above
+copyright notice, this list of conditions and the following
+disclaimer.
+
+2. Redistributions in binary form must reproduce the above
+copyright notice, this list of conditions and the following
+disclaimer in the documentation and/or other materials
+provided with the distribution.
+
+3. The end-user documentation included with the
+redistribution, if any, must include the following
+acknowledgment:
+
+   "This product includes software developed by the
+   University of Chicago, as Operator of Argonne National
+   Laboratory.
+
+Alternately, this acknowledgment may appear in the software
+itself, if and wherever such third-party acknowledgments
+normally appear.
+
+4. WARRANTY DISCLAIMER. THE SOFTWARE IS SUPPLIED "AS IS"
+WITHOUT WARRANTY OF ANY KIND. THE COPYRIGHT HOLDER, THE
+UNITED STATES, THE UNITED STATES DEPARTMENT OF ENERGY, AND
+THEIR EMPLOYEES: (1) DISCLAIM ANY WARRANTIES, EXPRESS OR
+IMPLIED, INCLUDING BUT NOT LIMITED TO ANY IMPLIED WARRANTIES
+OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE, TITLE
+OR NON-INFRINGEMENT, (2) DO NOT ASSUME ANY LEGAL LIABILITY
+OR RESPONSIBILITY FOR THE ACCURACY, COMPLETENESS, OR
+USEFULNESS OF THE SOFTWARE, (3) DO NOT REPRESENT THAT USE OF
+THE SOFTWARE WOULD NOT INFRINGE PRIVATELY OWNED RIGHTS, (4)
+DO NOT WARRANT THAT THE SOFTWARE WILL FUNCTION
+UNINTERRUPTED, THAT IT IS ERROR-FREE OR THAT ANY ERRORS WILL
+BE CORRECTED.
+
+5. LIMITATION OF LIABILITY. IN NO EVENT WILL THE COPYRIGHT
+HOLDER, THE UNITED STATES, THE UNITED STATES DEPARTMENT OF
+ENERGY, OR THEIR EMPLOYEES: BE LIABLE FOR ANY INDIRECT,
+INCIDENTAL, CONSEQUENTIAL, SPECIAL OR PUNITIVE DAMAGES OF
+ANY KIND OR NATURE, INCLUDING BUT NOT LIMITED TO LOSS OF
+PROFITS OR LOSS OF DATA, FOR ANY REASON WHATSOEVER, WHETHER
+SUCH LIABILITY IS ASSERTED ON THE BASIS OF CONTRACT, TORT
+(INCLUDING NEGLIGENCE OR STRICT LIABILITY), OR OTHERWISE,
+EVEN IF ANY OF SAID PARTIES HAS BEEN WARNED OF THE
+POSSIBILITY OF SUCH LOSS OR DAMAGES.
diff --git a/src/PHYEX/micro/c2r2_adjust.f90 b/src/PHYEX/micro/c2r2_adjust.f90
index c5e9d27bcd264a39895284056bb1fdaa9c22b715..7c2dc7e923d84ba8fed9e9af845fb0ef7a820bb6 100644
--- a/src/PHYEX/micro/c2r2_adjust.f90
+++ b/src/PHYEX/micro/c2r2_adjust.f90
@@ -7,6 +7,7 @@
       MODULE MODI_C2R2_ADJUST
 !     #######################
 !
+IMPLICIT NONE
 INTERFACE
 !
       SUBROUTINE C2R2_ADJUST(KRR, TPFILE, HRAD,                           &
@@ -16,6 +17,7 @@ INTERFACE
                              PCCS, PSRCS, PCLDFR, PRRS )
 !
 USE MODD_IO, ONLY: TFILEDATA
+IMPLICIT NONE
 !
 INTEGER,                          INTENT(IN)    :: KRR        ! Number of moist variables
 TYPE(TFILEDATA),                  INTENT(IN)    :: TPFILE     ! Output file
diff --git a/src/PHYEX/micro/compute_frac_ice.func.h b/src/PHYEX/micro/compute_frac_ice.func.h
index 8c6d4e617d519e2277d3a7defe3b11c95513cafc..b425ef0f928e8829fc33f2cc8438fb2e765e8c30 100644
--- a/src/PHYEX/micro/compute_frac_ice.func.h
+++ b/src/PHYEX/micro/compute_frac_ice.func.h
@@ -2,7 +2,7 @@
 !MNH_LIC This is part of the Meso-NH software governed by the CeCILL-C licence
 !MNH_LIC version 1. See LICENSE, CeCILL-C_V1-en.txt and CeCILL-C_V1-fr.txt
 !MNH_LIC for details. version 1.
-      ELEMENTAL SUBROUTINE COMPUTE_FRAC_ICE(HFRAC_ICE,NEB,PFRAC_ICE,PT,KERR)
+      ELEMENTAL SUBROUTINE COMPUTE_FRAC_ICE(HFRAC_ICE,NEBN,PFRAC_ICE,PT,KERR)
 
 ! ******* TO BE INCLUDED IN THE *CONTAINS* OF A SUBROUTINE, IN ORDER TO EASE AUTOMATIC INLINING ******
 ! => Don't use drHook !!!
@@ -21,13 +21,13 @@
 !!      R. El Khatib     12-Aug-2021 written as a include file
 !
 !! --------------------------------------------------------------------------
-USE MODD_NEB, ONLY : NEB_t
+USE MODD_NEB_n, ONLY : NEB_t
 USE MODD_CST, ONLY : XTT
 !
 IMPLICIT NONE
 !
 CHARACTER(LEN=1), INTENT(IN)    :: HFRAC_ICE       ! scheme to use
-TYPE(NEB_t),      INTENT(IN)    :: NEB
+TYPE(NEB_t),      INTENT(IN)    :: NEBN
 REAL,             INTENT(IN)    :: PT              ! temperature
 REAL,             INTENT(INOUT) :: PFRAC_ICE       ! Ice fraction (1 for ice only, 0 for liquid only)
 INTEGER, OPTIONAL,        INTENT(OUT)   :: KERR            ! Error code in return
@@ -39,7 +39,7 @@ INTEGER, OPTIONAL,        INTENT(OUT)   :: KERR            ! Error code in retur
 IF (PRESENT(KERR)) KERR=0
 SELECT CASE(HFRAC_ICE)
   CASE ('T') !using Temperature
-    PFRAC_ICE = MAX( 0., MIN(1., (( NEB%XTMAXMIX - PT ) / ( NEB%XTMAXMIX - NEB%XTMINMIX )) ) ) ! freezing interval
+    PFRAC_ICE = MAX( 0., MIN(1., (( NEBN%XTMAXMIX - PT ) / ( NEBN%XTMAXMIX - NEBN%XTMINMIX )) ) ) ! freezing interval
   CASE ('O') !using Temperature with old formulae
     PFRAC_ICE = MAX( 0., MIN(1., (( XTT - PT ) / 40.) ) ) ! freezing interval
   CASE ('N') !No ice
diff --git a/src/PHYEX/micro/condensation.f90 b/src/PHYEX/micro/condensation.f90
index 23a7e9bb7df8697a2efb70cc7f3a693593501e00..0bcb57d47016ce2bd47ad0bbdfd42dae01547e3f 100644
--- a/src/PHYEX/micro/condensation.f90
+++ b/src/PHYEX/micro/condensation.f90
@@ -4,11 +4,11 @@
 !MNH_LIC for details. version 1.
 !-----------------------------------------------------------------
 !     ######spl
-    SUBROUTINE CONDENSATION(D, CST, ICEP, NEB, TURBN, &
+    SUBROUTINE CONDENSATION(D, CST, ICEP, NEBN, TURBN, &
                            &HFRAC_ICE, HCONDENS, HLAMBDA3,                                                  &
                            &PPABS, PZZ, PRHODREF, PT, PRV_IN, PRV_OUT, PRC_IN, PRC_OUT, PRI_IN, PRI_OUT,    &
                            &PRR, PRS, PRG, PSIGS, LMFCONV, PMFCONV, PCLDFR, PSIGRC, OUSERI,                 &
-                           &OSIGMAS, OCND2, LHGT_QS,                                                        &
+                           &OSIGMAS, OCND2,                                                                 &
                            &PICLDFR, PWCLDFR, PSSIO, PSSIU, PIFR, PSIGQSAT,                                 &
                            &PLV, PLS, PCPH,                                                                 &
                            &PHLC_HRC, PHLC_HCF, PHLI_HRI, PHLI_HCF,                                         &
@@ -86,12 +86,11 @@
 !*       0.    DECLARATIONS
 !              ------------
 !
-USE PARKIND1, ONLY : JPRB
-USE YOMHOOK , ONLY : LHOOK, DR_HOOK
+USE YOMHOOK , ONLY : LHOOK, DR_HOOK, JPHOOK
 USE MODD_DIMPHYEX,       ONLY: DIMPHYEX_t
 USE MODD_CST,            ONLY: CST_t
-USE MODD_RAIN_ICE_PARAM, ONLY: RAIN_ICE_PARAM_t
-USE MODD_NEB,            ONLY: NEB_t
+USE MODD_RAIN_ICE_PARAM_n, ONLY: RAIN_ICE_PARAM_t
+USE MODD_NEB_n,          ONLY: NEB_t
 USE MODD_TURB_n,     ONLY: TURB_t
 USE MODE_TIWMX,          ONLY : ESATW, ESATI
 USE MODE_ICECLOUD,       ONLY : ICECLOUD
@@ -104,7 +103,7 @@ IMPLICIT NONE
 TYPE(DIMPHYEX_t),             INTENT(IN)    :: D
 TYPE(CST_t),                  INTENT(IN)    :: CST
 TYPE(RAIN_ICE_PARAM_t),       INTENT(IN)    :: ICEP
-TYPE(NEB_t),                  INTENT(IN)    :: NEB
+TYPE(NEB_t),                  INTENT(IN)    :: NEBN
 TYPE(TURB_t),                 INTENT(IN)    :: TURBN
 CHARACTER(LEN=1),             INTENT(IN)    :: HFRAC_ICE
 CHARACTER(LEN=4),             INTENT(IN)    :: HCONDENS
@@ -136,7 +135,6 @@ LOGICAL, INTENT(IN)                         :: OSIGMAS! use present global Sigma
                                                       ! or that from turbulence scheme
 LOGICAL, INTENT(IN)                         :: OCND2  ! logical switch to sparate liquid and ice
                                                       ! more rigid (DEFALT value : .FALSE.)
-LOGICAL, INTENT(IN)                         :: LHGT_QS! logical switch for height dependent VQSIGSAT
 REAL, DIMENSION(D%NIJT,D%NKT), INTENT(OUT)   :: PICLDFR  ! ice cloud fraction
 REAL, DIMENSION(D%NIJT,D%NKT), INTENT(OUT)   :: PWCLDFR  ! water or mixed-phase cloud fraction
 REAL, DIMENSION(D%NIJT,D%NKT), INTENT(OUT)   :: PSSIO    ! Super-saturation with respect to ice in the  
@@ -189,7 +187,7 @@ REAL, DIMENSION(D%NIJT) :: ZDZ, ZARDUM, ZARDUM2, ZCLDINI
 REAL :: ZDZFACT,ZDZREF
 ! LHGT_QS END
 
-REAL(KIND=JPRB) :: ZHOOK_HANDLE
+REAL(KIND=JPHOOK) :: ZHOOK_HANDLE
 INTEGER :: IERR
 !
 !
@@ -269,10 +267,7 @@ ELSE
   DO JK=IKTB,IKTE
     DO JIJ=IIJB,IIJE
       ZCPD(JIJ,JK) = CST%XCPD + CST%XCPV*PRV_IN(JIJ,JK) + CST%XCL*PRC_IN(JIJ,JK) + CST%XCI*PRI_IN(JIJ,JK) + &
-#if defined(REPRO48) 
-#else
                                   CST%XCL*PRR(JIJ,JK) +  &
-#endif
                                   CST%XCI*(PRS(JIJ,JK) + PRG(JIJ,JK) )
     ENDDO
   ENDDO
@@ -287,14 +282,7 @@ IF ( .NOT. OSIGMAS ) THEN
     END DO
   END DO
   ! Determine tropopause/inversion  height from minimum temperature
-#ifdef REPRO48
-  ITPL(:)  = IIJB+1
-  !I (Sébastien Riette) don't understand why tropopause level is set
-  !with the index of the second physical point on the horizontal (i.e. 2+JPHEXT)!!!
-  !I assume it is a bug...
-#else
   ITPL(:)  = IKB+IKL
-#endif
   ZTMIN(:) = 400.
   DO JK = IKTB+1,IKTE-1
     DO JIJ=IIJB,IIJE
@@ -357,7 +345,7 @@ DO JK=IKTB,IKTE
       ENDIF
     END DO
     DO JIJ=IIJB,IIJE
-      CALL COMPUTE_FRAC_ICE(HFRAC_ICE, NEB, ZFRAC(JIJ), PT(JIJ,JK), IERR) !error code IERR cannot be checked here to not break vectorization
+      CALL COMPUTE_FRAC_ICE(HFRAC_ICE, NEBN, ZFRAC(JIJ), PT(JIJ,JK), IERR) !error code IERR cannot be checked here to not break vectorization
     ENDDO
   ENDIF
   DO JIJ=IIJB,IIJE
@@ -382,18 +370,18 @@ DO JK=IKTB,IKTE
     DO JIJ=IIJB,IIJE
       IF (PSIGQSAT(JIJ)/=0.) THEN
         ZDZFACT = 1.
-        IF(LHGT_QS .AND. JK+1 <= IKTE)THEN
+        IF(NEBN%LHGT_QS .AND. JK+1 <= IKTE)THEN
            ZDZFACT= MAX(ICEP%XFRMIN(23),MIN(ICEP%XFRMIN(24),(PZZ(JIJ,JK) - PZZ(JIJ,JK+1))/ZDZREF))
-        ELSEIF(LHGT_QS)THEN
+        ELSEIF(NEBN%LHGT_QS)THEN
            ZDZFACT= MAX(ICEP%XFRMIN(23),MIN(ICEP%XFRMIN(24),((PZZ(JIJ,JK-1) - PZZ(JIJ,JK)))*0.8/ZDZREF))
         ENDIF
-        IF (TURBN%LSTATNW) THEN
+        IF (NEBN%LSTATNW) THEN
           ZSIGMA(JIJ) = SQRT((PSIGS(JIJ,JK))**2 + (PSIGQSAT(JIJ)*ZDZFACT*ZQSL(JIJ)*ZA(JIJ))**2)
         ELSE
           ZSIGMA(JIJ) = SQRT((2*PSIGS(JIJ,JK))**2 + (PSIGQSAT(JIJ)*ZQSL(JIJ)*ZA(JIJ))**2)
         ENDIF
       ELSE
-        IF (TURBN%LSTATNW) THEN
+        IF (NEBN%LSTATNW) THEN
           ZSIGMA(JIJ) = PSIGS(JIJ,JK)
         ELSE
           ZSIGMA(JIJ) = 2*PSIGS(JIJ,JK)
diff --git a/src/PHYEX/micro/hypgeo.f90 b/src/PHYEX/micro/hypgeo.f90
index 0d3697f71e6843ee6e0ea044a9965de7762cd36b..378c3ce3d011fa69f9748ae882b6fb081c351f60 100644
--- a/src/PHYEX/micro/hypgeo.f90
+++ b/src/PHYEX/micro/hypgeo.f90
@@ -7,9 +7,11 @@
 MODULE MODI_HYPGEO
 !####################
 !
+IMPLICIT NONE
 INTERFACE
 !
 FUNCTION HYPGEO(PA,PB,PC,PF,PX)  RESULT(PHYPGEO)
+IMPLICIT NONE
 REAL, INTENT(IN)                                  :: PA,PB,PC,PF
 REAL, INTENT(IN)                                  :: PX
 REAL                                              :: PHYPGEO
@@ -82,12 +84,9 @@ REAL                                 :: PHYPGEO
 !*       0.2 declarations of local variables
 !
 !
-INTEGER                              :: JN
-INTEGER                              :: ITMAX=100
 REAL                                 :: ZEPS,ZTEMP
-REAL                                 :: ZFPMIN=1.E-30
 REAL                                 :: ZXH
-REAL                                 :: ZX0,ZX1,ZZA,ZZB,ZZC,ZZD,Y(2)
+REAL                                 :: ZX0,ZX1
 !
 !------------------------------------------------------------------------------
 !
diff --git a/src/PHYEX/micro/hypser.f90 b/src/PHYEX/micro/hypser.f90
index 3a8bed13e8414d79e75eb4aa8d0b999aad0a36fb..330ba0bbecd501e68e4703a3178a2550fb497a6b 100644
--- a/src/PHYEX/micro/hypser.f90
+++ b/src/PHYEX/micro/hypser.f90
@@ -7,9 +7,11 @@
 MODULE MODI_HYPSER
 !####################
 !
+IMPLICIT NONE
 INTERFACE
 !
 SUBROUTINE HYPSER(PA,PB,PC,PX,PHYP)  
+IMPLICIT NONE
 REAL, INTENT(IN)                                  :: PA,PB,PC
 REAL, INTENT(IN)                                  :: PX
 REAL, INTENT(INOUT)                               :: PHYP
diff --git a/src/PHYEX/micro/ice_adjust.f90 b/src/PHYEX/micro/ice_adjust.f90
index e2981ff0107fa5d87b62c408022608aa35e95ca8..b480da71079ce570a02efe4b5e800f609bb1e9c6 100644
--- a/src/PHYEX/micro/ice_adjust.f90
+++ b/src/PHYEX/micro/ice_adjust.f90
@@ -4,8 +4,8 @@
 !MNH_LIC for details. version 1.
 !-----------------------------------------------------------------
 !     ##########################################################################
-      SUBROUTINE ICE_ADJUST (D, CST, ICEP, NEB, TURBN, BUCONF, KRR,            &
-                            &HFRAC_ICE, HBUNAME, OCND2, LHGT_QS,               &
+      SUBROUTINE ICE_ADJUST (D, CST, ICEP, NEBN, TURBN, PARAMI, BUCONF, KRR,   &
+                            &HBUNAME,                                          &
                             &PTSTEP, PSIGQSAT,                                 &
                             &PRHODJ, PEXNREF, PRHODREF, PSIGS, LMFCONV, PMFCONV,&
                             &PPABST, PZZ,                                      &
@@ -109,14 +109,14 @@
 !*       0.    DECLARATIONS
 !              ------------
 !
-USE PARKIND1, ONLY : JPRB
-USE YOMHOOK , ONLY : LHOOK, DR_HOOK
+USE YOMHOOK , ONLY : LHOOK, DR_HOOK, JPHOOK
 USE MODD_DIMPHYEX,   ONLY: DIMPHYEX_t
 USE MODD_CST,        ONLY: CST_t
-USE MODD_NEB,        ONLY: NEB_t
+USE MODD_NEB_n,      ONLY: NEB_t
 USE MODD_TURB_n,         ONLY: TURB_t
+USE MODD_PARAM_ICE_n,    ONLY: PARAM_ICE_t
 USE MODD_BUDGET,     ONLY: TBUDGETDATA, TBUDGETCONF_t, NBUDGET_TH, NBUDGET_RV, NBUDGET_RC, NBUDGET_RI
-USE MODD_RAIN_ICE_PARAM, ONLY : RAIN_ICE_PARAM_t
+USE MODD_RAIN_ICE_PARAM_n, ONLY : RAIN_ICE_PARAM_t
 !
 USE MODE_BUDGET_PHY,         ONLY: BUDGET_STORE_INIT_PHY, BUDGET_STORE_END_PHY
 !
@@ -131,16 +131,12 @@ IMPLICIT NONE
 TYPE(DIMPHYEX_t),         INTENT(IN)    :: D
 TYPE(CST_t),              INTENT(IN)    :: CST
 TYPE(RAIN_ICE_PARAM_t),   INTENT(IN)    :: ICEP
-TYPE(NEB_t),              INTENT(IN)    :: NEB
+TYPE(NEB_t),              INTENT(IN)    :: NEBN
 TYPE(TURB_t),             INTENT(IN)    :: TURBN
+TYPE(PARAM_ICE_t),        INTENT(IN)    :: PARAMI
 TYPE(TBUDGETCONF_t),      INTENT(IN)    :: BUCONF
 INTEGER,                  INTENT(IN)    :: KRR      ! Number of moist variables
-CHARACTER(LEN=1),         INTENT(IN)    :: HFRAC_ICE
 CHARACTER(LEN=4),         INTENT(IN)    :: HBUNAME  ! Name of the budget
-LOGICAL,                  INTENT(IN)    :: OCND2    ! logical switch to separate liquid
-                                                    ! and ice
-                                                    ! more rigid (DEFAULT value : .FALSE.)
-LOGICAL,                  INTENT(IN)   :: LHGT_QS   ! logical switch for height dependent VQSIGSAT
 REAL,                     INTENT(IN)   :: PTSTEP    ! Double Time step
                                                     ! (single if cold start)
 REAL, DIMENSION(D%NIJT),       INTENT(IN)    :: PSIGQSAT  ! coeff applied to qsat variance contribution
@@ -149,8 +145,8 @@ REAL, DIMENSION(D%NIJT,D%NKT), INTENT(IN)    ::  PRHODJ  ! Dry density * Jacobia
 REAL, DIMENSION(D%NIJT,D%NKT), INTENT(IN)    ::  PEXNREF ! Reference Exner function
 REAL, DIMENSION(D%NIJT,D%NKT), INTENT(IN)    ::  PRHODREF
 !
-REAL, DIMENSION(MERGE(D%NIJT,0,TURBN%LSUBG_COND),&
-                MERGE(D%NKT,0,TURBN%LSUBG_COND)),           INTENT(IN)    ::  PSIGS   ! Sigma_s at time t
+REAL, DIMENSION(MERGE(D%NIJT,0,NEBN%LSUBG_COND),&
+                MERGE(D%NKT,0,NEBN%LSUBG_COND)),           INTENT(IN)    ::  PSIGS   ! Sigma_s at time t
 LOGICAL,                                              INTENT(IN)    ::  LMFCONV ! =SIZE(PMFCONV)!=0
 REAL, DIMENSION(MERGE(D%NIJT,0,LMFCONV),&
                 MERGE(D%NKT,0,LMFCONV)),              INTENT(IN)   ::  PMFCONV ! convective mass flux
@@ -220,7 +216,7 @@ INTEGER :: IKTB, IKTE, IIJB, IIJE
 !
 REAL, DIMENSION(D%NIJT,D%NKT) :: ZSIGS, ZSRCS
 REAL, DIMENSION(D%NIJT) :: ZSIGQSAT
-REAL(KIND=JPRB) :: ZHOOK_HANDLE
+REAL(KIND=JPHOOK) :: ZHOOK_HANDLE
 !
 !-------------------------------------------------------------------------------
 !
@@ -311,7 +307,7 @@ DO JK=IKTB,IKTE
   !
   !*       5.2    compute the cloud fraction PCLDFR
   !
-  IF ( .NOT. TURBN%LSUBG_COND ) THEN
+  IF ( .NOT. NEBN%LSUBG_COND ) THEN
     DO JIJ=IIJB,IIJE
       IF (PRCS(JIJ,JK) + PRIS(JIJ,JK) > 1.E-12 / PTSTEP) THEN
         PCLDFR(JIJ,JK)  = 1.
@@ -322,7 +318,7 @@ DO JK=IKTB,IKTE
         PSRCS(JIJ,JK) = PCLDFR(JIJ,JK)
       END IF
     ENDDO
-  ELSE !TURBN%LSUBG_COND case
+  ELSE !NEBN%LSUBG_COND case
     DO JIJ=IIJB,IIJE
       !We limit PRC_MF+PRI_MF to PRVS*PTSTEP to avoid negative humidity
       ZW1=PRC_MF(JIJ,JK)/PTSTEP
@@ -340,12 +336,12 @@ DO JK=IKTB,IKTE
       !
       IF(PRESENT(PHLC_HRC) .AND. PRESENT(PHLC_HCF)) THEN
         ZCRIAUT=ICEP%XCRIAUTC/PRHODREF(JIJ,JK)
-        IF(TURBN%CSUBG_MF_PDF=='NONE')THEN
+        IF(PARAMI%CSUBG_MF_PDF=='NONE')THEN
           IF(ZW1*PTSTEP>PCF_MF(JIJ,JK) * ZCRIAUT) THEN
             PHLC_HRC(JIJ,JK)=PHLC_HRC(JIJ,JK)+ZW1*PTSTEP
             PHLC_HCF(JIJ,JK)=MIN(1.,PHLC_HCF(JIJ,JK)+PCF_MF(JIJ,JK))
           ENDIF
-        ELSEIF(TURBN%CSUBG_MF_PDF=='TRIANGLE')THEN
+        ELSEIF(PARAMI%CSUBG_MF_PDF=='TRIANGLE')THEN
           !ZHCF is the precipitating part of the *cloud* and not of the grid cell
           IF(ZW1*PTSTEP>PCF_MF(JIJ,JK)*ZCRIAUT) THEN
             ZHCF=1.-.5*(ZCRIAUT*PCF_MF(JIJ,JK) / MAX(1.E-20, ZW1*PTSTEP))**2
@@ -368,12 +364,12 @@ DO JK=IKTB,IKTE
       ENDIF
       IF(PRESENT(PHLI_HRI) .AND. PRESENT(PHLI_HCF)) THEN
         ZCRIAUT=MIN(ICEP%XCRIAUTI,10**(ICEP%XACRIAUTI*(ZT(JIJ,JK)-CST%XTT)+ICEP%XBCRIAUTI))
-        IF(TURBN%CSUBG_MF_PDF=='NONE')THEN
+        IF(PARAMI%CSUBG_MF_PDF=='NONE')THEN
           IF(ZW2*PTSTEP>PCF_MF(JIJ,JK) * ZCRIAUT) THEN
             PHLI_HRI(JIJ,JK)=PHLI_HRI(JIJ,JK)+ZW2*PTSTEP
             PHLI_HCF(JIJ,JK)=MIN(1.,PHLI_HCF(JIJ,JK)+PCF_MF(JIJ,JK))
           ENDIF
-        ELSEIF(TURBN%CSUBG_MF_PDF=='TRIANGLE')THEN
+        ELSEIF(PARAMI%CSUBG_MF_PDF=='TRIANGLE')THEN
           !ZHCF is the precipitating part of the *cloud* and not of the grid cell
           IF(ZW2*PTSTEP>PCF_MF(JIJ,JK)*ZCRIAUT) THEN
             ZHCF=1.-.5*(ZCRIAUT*PCF_MF(JIJ,JK) / (ZW2*PTSTEP))**2
@@ -409,7 +405,7 @@ DO JK=IKTB,IKTE
                     (ZW1 * ZLV(JIJ,JK) + ZW2 * ZLS(JIJ,JK)) / ZCPH(JIJ,JK)
       ENDDO
     ENDIF
-  ENDIF !TURBN%LSUBG_COND
+  ENDIF !NEBN%LSUBG_COND
 ENDDO
 !
 IF(PRESENT(POUT_RV)) POUT_RV=ZRV
@@ -466,18 +462,18 @@ DO JK=IKTB,IKTE
   ENDDO
 ENDDO
 !
-IF ( TURBN%LSUBG_COND ) THEN
+IF ( NEBN%LSUBG_COND ) THEN
   !
   !*       3.     SUBGRID CONDENSATION SCHEME
   !               ---------------------------
   !
   !   PSRC= s'rci'/Sigma_s^2
   !   ZT is INOUT
-  CALL CONDENSATION(D, CST, ICEP, NEB, TURBN, &
-       HFRAC_ICE,TURBN%CCONDENS, TURBN%CLAMBDA3,                             &
+  CALL CONDENSATION(D, CST, ICEP, NEBN, TURBN, &
+       NEBN%CFRAC_ICE_ADJUST,NEBN%CCONDENS, NEBN%CLAMBDA3,                             &
        PPABST, PZZ, PRHODREF, ZT, PRV_IN, PRV_OUT, PRC_IN, PRC_OUT, PRI_IN, PRI_OUT, &
        PRR, PRS, PRG, PSIGS, LMFCONV, PMFCONV, PCLDFR, &
-       PSRCS, .TRUE., TURBN%LSIGMAS,OCND2, LHGT_QS,                      &
+       PSRCS, .TRUE., NEBN%LSIGMAS, PARAMI%LOCND2,                       &
        PICLDFR, PWCLDFR, PSSIO, PSSIU, PIFR, PSIGQSAT,                   &
        PLV=ZLV, PLS=ZLS, PCPH=ZCPH,                                      &
        PHLC_HRC=PHLC_HRC, PHLC_HCF=PHLC_HCF, PHLI_HRI=PHLI_HRI, PHLI_HCF=PHLI_HCF,&
@@ -492,11 +488,11 @@ ELSE
   ZSIGQSAT(:)=0.
   !We use ZSRCS because in Méso-NH, PSRCS can be a zero-length array in this case
   !ZT is INOUT
-  CALL CONDENSATION(D, CST, ICEP, NEB, TURBN, &
-       HFRAC_ICE,TURBN%CCONDENS, TURBN%CLAMBDA3,                             &
+  CALL CONDENSATION(D, CST, ICEP, NEBN, TURBN, &
+       NEBN%CFRAC_ICE_ADJUST,NEBN%CCONDENS, NEBN%CLAMBDA3,                             &
        PPABST, PZZ, PRHODREF, ZT, PRV_IN, PRV_OUT, PRC_IN, PRC_OUT, PRI_IN, PRI_OUT, &
        PRR, PRS, PRG, ZSIGS, LMFCONV, PMFCONV, PCLDFR, &
-       ZSRCS, .TRUE., .TRUE., OCND2, LHGT_QS,                            &
+       ZSRCS, .TRUE., .TRUE., PARAMI%LOCND2,                             &
        PICLDFR, PWCLDFR, PSSIO, PSSIU, PIFR, ZSIGQSAT,                   &
        PLV=ZLV, PLS=ZLS, PCPH=ZCPH,                                      &
        PHLC_HRC=PHLC_HRC, PHLC_HCF=PHLC_HCF, PHLI_HRI=PHLI_HRI, PHLI_HCF=PHLI_HCF,&
diff --git a/src/PHYEX/micro/ice_adjust_elec.f90 b/src/PHYEX/micro/ice_adjust_elec.f90
index 5c8b704f97fc191e0dee9ec7d03e64b094a127af..64cdedf762c8c9bc2a02d0003385c649ce896b34 100644
--- a/src/PHYEX/micro/ice_adjust_elec.f90
+++ b/src/PHYEX/micro/ice_adjust_elec.f90
@@ -7,6 +7,7 @@
       MODULE MODI_ICE_ADJUST_ELEC
 !     ###########################
 !
+IMPLICIT NONE
 INTERFACE
 !
       SUBROUTINE ICE_ADJUST_ELEC (KRR, KMI, HRAD, HTURBDIM, HSCONV, HMF_CLOUD,    &
@@ -18,6 +19,7 @@ INTERFACE
                                   PQPIT, PQPIS, PQCT, PQCS,                       &
                                   PQRT, PQRS, PQIT, PQIS, PQST, PQSS, PQGT, PQGS, &
                                   PQNIT, PQNIS, PRHT, PRHS, PQHT, PQHS            )
+IMPLICIT NONE
 !
 INTEGER,                  INTENT(IN)    :: KRR      ! Number of moist variables
 INTEGER,                  INTENT(IN)    :: KMI      ! Model index 
@@ -28,7 +30,7 @@ CHARACTER(LEN=4),         INTENT(IN)    :: HMF_CLOUD! Type of statistical cloud
 CHARACTER(len=4),         INTENT(IN)    :: HRAD     ! Radiation scheme name
 LOGICAL,                  INTENT(IN)    :: OSUBG_COND ! Switch for Subgrid 
                                                     ! Condensation
-LOGICAL                                 :: OSIGMAS  ! Switch for Sigma_s: 
+LOGICAL,                  INTENT(IN)    :: OSIGMAS  ! Switch for Sigma_s: 
                                                     ! use values computed in CONDENSATION
                                                     ! or that from turbulence scheme
 REAL,                     INTENT(IN)   :: PTSTEP    ! Double Time step
@@ -172,9 +174,9 @@ USE MODD_CST
 USE MODD_ELEC_DESCR, ONLY : XRTMIN_ELEC, XQTMIN, XFC, XFI, XECHARGE
 USE MODD_NSV, ONLY : NSV_ELECBEG, NSV_ELECEND
 USE MODD_PARAMETERS
-USE MODD_RAIN_ICE_DESCR, ONLY : XRTMIN, XBI
-USE MODD_RAIN_ICE_PARAM,   ONLY: RAIN_ICE_PARAM
-USE MODD_NEB,              ONLY: NEB
+USE MODD_RAIN_ICE_DESCR_n, ONLY : XRTMIN, XBI
+USE MODD_RAIN_ICE_PARAM_n,   ONLY: RAIN_ICE_PARAMN
+USE MODD_NEB_n,            ONLY: NEBN
 USE MODD_TURB_n,           ONLY: TURBN
 USE MODD_DIMPHYEX,         ONLY: DIMPHYEX_t
 
@@ -199,7 +201,7 @@ CHARACTER(LEN=4),       INTENT(IN)    :: HMF_CLOUD! Type of statistical cloud
 CHARACTER(len=4),       INTENT(IN)    :: HRAD     ! Radiation scheme name
 LOGICAL,                INTENT(IN)    :: OSUBG_COND ! Switch for Subgrid 
                                                     ! Condensation
-LOGICAL                               :: OSIGMAS  ! Switch for Sigma_s: 
+LOGICAL,                INTENT(IN)    :: OSIGMAS  ! Switch for Sigma_s: 
                                                   ! use values computed in CONDENSATION
                                                   ! or that from turbulence scheme
 REAL,                   INTENT(IN)    :: PTSTEP   ! Double Time step
@@ -385,11 +387,11 @@ DO JITER = 1, ITERMAX
     ZSIGQSAT2D(:,:)=PSIGQSAT
     ZW4 = 1. ! PRODREF is not used if HL variables are not present
 !
-    CALL CONDENSATION(D, CST, RAIN_ICE_PARAM, NEB, TURBN, &
+    CALL CONDENSATION(D, CST, RAIN_ICE_PARAMN, NEBN, TURBN, &
                      &'T', 'CB02', 'CB',                                                  &
                      &PPABST, PZZ, ZW4, ZT, ZW3_IN, ZW3, ZW1_IN, ZW1, ZW2_IN, ZW2,    &
                      &PRRS*PTSTEP, PRSS*PTSTEP, PRGS*PTSTEP, PSIGS, .FALSE., PMFCONV, PCLDFR, PSRCS, .FALSE.,                 &
-                     &OSIGMAS, .FALSE., .FALSE.,                                                        &
+                     &OSIGMAS, .FALSE.,                                                                 &
                      &ZDUM, ZDUM, ZDUM, ZDUM, ZDUM, ZSIGQSAT2D, &
                      &ZLV, ZLS, ZCPH)
 !
diff --git a/src/PHYEX/micro/ini_ice_c1r3.f90 b/src/PHYEX/micro/ini_ice_c1r3.f90
index 3c4c6e266751e09f8aa78e26667b9c3d77ce2bf4..43d7c194f0aec823f993e9946451827722d5fc16 100644
--- a/src/PHYEX/micro/ini_ice_c1r3.f90
+++ b/src/PHYEX/micro/ini_ice_c1r3.f90
@@ -7,8 +7,10 @@
        MODULE MODI_INI_ICE_C1R3 
 !      ########################
 !
+IMPLICIT NONE
 INTERFACE
       SUBROUTINE INI_ICE_C1R3 ( PTSTEP, PDZMIN, KSPLITG )
+IMPLICIT NONE
 !
 INTEGER,                 INTENT(OUT):: KSPLITG   ! Number of small time step
                                                  ! integration for  rain
@@ -110,7 +112,7 @@ USE MODD_REF
 !
 use mode_msg
 !
-USE MODD_RAIN_ICE_DESCR, ONLY : XFVELOS
+USE MODD_RAIN_ICE_DESCR_n, ONLY : XFVELOS
 !
 USE MODI_GAMMA
 USE MODI_GAMMA_INC
@@ -1113,9 +1115,9 @@ CONTAINS
 !
   IMPLICIT NONE
 !
-  REAL     :: PALPHA ! first shape parameter of the dimensionnal distribution
-  REAL     :: PNU    ! second shape parameter of the dimensionnal distribution
-  REAL     :: PP     ! order of the moment
+  REAL, INTENT(IN)     :: PALPHA ! first shape parameter of the dimensionnal distribution
+  REAL, INTENT(IN)     :: PNU    ! second shape parameter of the dimensionnal distribution
+  REAL, INTENT(IN)     :: PP     ! order of the moment
   REAL     :: PMOMG  ! result: moment of order ZP
 !
 !------------------------------------------------------------------------------
diff --git a/src/PHYEX/micro/ini_param_elec.f90 b/src/PHYEX/micro/ini_param_elec.f90
index 4b889da2e9ea859f05d5d6303ac3778b0161ca32..03bc5fc30c2dc413ea721f83cdda88a4c543ae0e 100644
--- a/src/PHYEX/micro/ini_param_elec.f90
+++ b/src/PHYEX/micro/ini_param_elec.f90
@@ -7,12 +7,14 @@
         MODULE MODI_INI_PARAM_ELEC
 !      	##########################
 !
+IMPLICIT NONE
 INTERFACE
 !
         SUBROUTINE INI_PARAM_ELEC (TPINIFILE, HGETSVM, PRHO00,       &
                                    KRR, KND, PFDINFTY, IIU, IJU, IKU )
 !
 USE MODD_IO, ONLY : TFILEDATA
+IMPLICIT NONE
 !
 TYPE(TFILEDATA),   INTENT(IN) :: TPINIFILE ! Initial file
 CHARACTER (LEN=*), DIMENSION(:),INTENT(IN)  :: HGETSVM
@@ -99,9 +101,9 @@ USE MODD_ELEC_PARAM
 USE MODD_IO,             ONLY: TFILEDATA
 USE MODD_NSV,            ONLY: NSV_ELECEND
 USE MODD_PARAMETERS
-USE MODD_PARAM_ICE
-USE MODD_RAIN_ICE_DESCR
-USE MODD_RAIN_ICE_PARAM
+USE MODD_PARAM_ICE_n
+USE MODD_RAIN_ICE_DESCR_n
+USE MODD_RAIN_ICE_PARAM_n
 USE MODD_VAR_ll
 !
 USE MODE_IO_FIELD_READ,  only: IO_Field_read
diff --git a/src/PHYEX/micro/ini_rain_c2r2.f90 b/src/PHYEX/micro/ini_rain_c2r2.f90
index b436b832df4291f0fcfe3b238435df0f4a5bc845..0989dc52dc8c64679eaaa4a718b81f54614f8f85 100644
--- a/src/PHYEX/micro/ini_rain_c2r2.f90
+++ b/src/PHYEX/micro/ini_rain_c2r2.f90
@@ -7,8 +7,10 @@
        MODULE MODI_INI_RAIN_C2R2 
 !      #########################
 !
+IMPLICIT NONE
 INTERFACE
       SUBROUTINE INI_RAIN_C2R2 ( PTSTEP, PDZMIN, KSPLITR, HCLOUD )
+IMPLICIT NONE
 !
 INTEGER,                 INTENT(OUT):: KSPLITR   ! Number of small time step
                                                  ! integration for  rain
@@ -619,9 +621,9 @@ CONTAINS
 !
   IMPLICIT NONE
 !
-  REAL     :: PALPHA ! first shape parameter of the dimensionnal distribution
-  REAL     :: PNU    ! second shape parameter of the dimensionnal distribution
-  REAL     :: PP     ! order of the moment
+  REAL, INTENT(IN)     :: PALPHA ! first shape parameter of the dimensionnal distribution
+  REAL, INTENT(IN)     :: PNU    ! second shape parameter of the dimensionnal distribution
+  REAL, INTENT(IN)     :: PP     ! order of the moment
   REAL     :: PMOMG  ! result: moment of order ZP
 !
 !------------------------------------------------------------------------------
diff --git a/src/PHYEX/micro/ini_rain_ice_elec.f90 b/src/PHYEX/micro/ini_rain_ice_elec.f90
index f926dc064811621ab57deddb76b4bbbbbed435f0..3a0279455f46639c20443f68f27caa1b166700f3 100644
--- a/src/PHYEX/micro/ini_rain_ice_elec.f90
+++ b/src/PHYEX/micro/ini_rain_ice_elec.f90
@@ -7,9 +7,11 @@
        MODULE MODI_INI_RAIN_ICE_ELEC
 !      #############################
 !
+IMPLICIT NONE
 INTERFACE
       SUBROUTINE INI_RAIN_ICE_ELEC (KLUOUT, PTSTEP, PDZMIN, KSPLITR, HCLOUD, &
                                     KINTVL, PFDINFTY                         )
+IMPLICIT NONE
 !
 INTEGER,           INTENT(IN) :: KLUOUT    ! Logical unit number for prints
 INTEGER,           INTENT(OUT):: KSPLITR   ! Number of small time step
@@ -96,9 +98,9 @@ END MODULE MODI_INI_RAIN_ICE_ELEC
 USE MODD_CST
 USE MODD_LUNIT
 USE MODD_PARAMETERS
-USE MODD_PARAM_ICE
-USE MODD_RAIN_ICE_DESCR
-USE MODD_RAIN_ICE_PARAM
+USE MODD_PARAM_ICE_n
+USE MODD_RAIN_ICE_DESCR_n
+USE MODD_RAIN_ICE_PARAM_n
 USE MODD_REF
 USE MODD_ELEC_PARAM, ONLY : XGAMINC_RIM3, XFCI
 USE MODD_ELEC_DESCR, ONLY : XFS
@@ -172,8 +174,6 @@ REAL     :: PDRYLBDAR_MAX, PDRYLBDAR_MIN
 REAL     :: PWETLBDAS_MAX, PWETLBDAG_MAX, PWETLBDAS_MIN, PWETLBDAG_MIN
 REAL     :: PWETLBDAH_MAX, PWETLBDAH_MIN
 !
-IF(.NOT.ASSOCIATED(XCEXVT)) CALL RAIN_ICE_DESCR_ASSOCIATE()                                
-IF(.NOT.ASSOCIATED(XFSEDC)) CALL RAIN_ICE_PARAM_ASSOCIATE()
 !
 !-------------------------------------------------------------------------------
 !
@@ -208,13 +208,6 @@ IF (CSEDIM == 'SPLI') THEN
   END DO SPLIT
 END IF
 !
-IF (ASSOCIATED(XRTMIN)) THEN       ! In case of nesting microphysics constants of
-                                  ! MODD_RAIN_ICE_PARAM are computed only once,
-                                  ! but if INI_RAIN_ICE has been called already
-                                  ! one must change the XRTMIN size.
-  CALL RAIN_ICE_DESCR_DEALLOCATE()
-END IF
-!
 IF (HCLOUD == 'ICE4') THEN
   CALL RAIN_ICE_DESCR_ALLOCATE(7)
 ELSE IF (HCLOUD == 'ICE3') THEN
diff --git a/src/PHYEX/micro/lima.f90 b/src/PHYEX/micro/lima.f90
index 36474a920f88ec2b69ca5ca86947fa837a375b33..6665319bc5689b249629c1cf42b6ce5ded85919b 100644
--- a/src/PHYEX/micro/lima.f90
+++ b/src/PHYEX/micro/lima.f90
@@ -49,24 +49,20 @@ USE MODD_DIMPHYEX,        ONLY: DIMPHYEX_t
 USE MODD_BUDGET,          ONLY: TBUDGETDATA, TBUDGETCONF_t, NBUDGET_TH, NBUDGET_RV, NBUDGET_RC, &
                                 NBUDGET_RI, NBUDGET_RR, NBUDGET_RS, NBUDGET_RG, NBUDGET_RH, NBUDGET_SV1
 USE MODD_CST,             ONLY: CST_t
-USE MODD_IO,              ONLY: TFILEDATA
 USE MODD_NSV,             ONLY: NSV_LIMA_NC, NSV_LIMA_NR, NSV_LIMA_CCN_FREE, NSV_LIMA_CCN_ACTI, &
                                 NSV_LIMA_NI, NSV_LIMA_NS, NSV_LIMA_NG, NSV_LIMA_NH,             &
                                 NSV_LIMA_IFN_FREE, NSV_LIMA_IFN_NUCL, NSV_LIMA_IMM_NUCL, NSV_LIMA_HOM_HAZE, &
                                 NSV_LIMA_BEG
-USE MODD_PARAMETERS,      ONLY: JPHEXT, JPVEXT
 USE MODD_PARAM_LIMA,      ONLY: NMOD_CCN, NMOD_IFN, NMOD_IMM, LHHONI,      &
-                                LACTIT, LFEEDBACKT, NMAXITER, XMRSTEP, XTSTEP_TS,               &
+                                LFEEDBACKT, NMAXITER, XMRSTEP, XTSTEP_TS,               &
                                 LSEDC, LSEDI, XRTMIN, XCTMIN, LDEPOC, XVDEPOC,                  &
                                 NMOM_C, NMOM_R, NMOM_I, NMOM_S, NMOM_G, NMOM_H
-USE MODD_PARAM_LIMA_COLD, ONLY: XAI, XBI
-USE MODD_PARAM_LIMA_WARM, ONLY: XLBC, XLBEXC, XAC, XBC, XAR, XBR
 
 USE MODE_BUDGET_PHY,      ONLY: BUDGET_STORE_ADD_PHY, BUDGET_STORE_INIT_PHY, BUDGET_STORE_END_PHY
 use mode_tools,           only: Countjv
 
 USE MODE_LIMA_COMPUTE_CLOUD_FRACTIONS, ONLY: LIMA_COMPUTE_CLOUD_FRACTIONS
-USE MODE_LIMA_DROPS_TO_DROPLETS_CONV, ONLY: LIMA_DROPS_TO_DROPLETS_CONV
+
 USE MODE_LIMA_INST_PROCS, ONLY: LIMA_INST_PROCS
 USE MODE_LIMA_NUCLEATION_PROCS, ONLY: LIMA_NUCLEATION_PROCS
 USE MODE_LIMA_SEDIMENTATION, ONLY: LIMA_SEDIMENTATION
@@ -273,13 +269,12 @@ REAL, DIMENSION(:), ALLOCATABLE                      :: ZCF1D, ZIF1D, ZPF1D
 ! domain size and levels (AROME compatibility)
 INTEGER :: KRR
 ! loops and packing
-INTEGER :: II, IPACK, JI, JJ, JK
+INTEGER :: II, IPACK, JI
 integer :: idx
 INTEGER, DIMENSION(:), ALLOCATABLE :: I1, I2, I3
 ! Inverse ov PTSTEP
 REAL :: ZINV_TSTEP
 ! Work arrays
-REAL, DIMENSION(SIZE(PRT,1),SIZE(PRT,2),SIZE(PRT,3)) :: ZW3D
 REAL, DIMENSION(SIZE(PRT,1),SIZE(PRT,2))             :: ZW2D
 REAL, DIMENSION(SIZE(PRT,1),SIZE(PRT,2),SIZE(PRT,3)) :: ZRT_SUM ! Total condensed water mr
 REAL, DIMENSION(SIZE(PRT,1),SIZE(PRT,2),SIZE(PRT,3)) :: ZCPT    ! Total condensed water mr
diff --git a/src/PHYEX/micro/lima_adjust.f90 b/src/PHYEX/micro/lima_adjust.f90
index abfe49fb7ebc640c3de1588cc78a245db2e6745a..4fab2b6109053a0651037d5549c914afe9f25cf5 100644
--- a/src/PHYEX/micro/lima_adjust.f90
+++ b/src/PHYEX/micro/lima_adjust.f90
@@ -7,6 +7,7 @@
       MODULE MODI_LIMA_ADJUST
 !     #######################
 !
+IMPLICIT NONE
 INTERFACE
 !
       SUBROUTINE LIMA_ADJUST(KRR, KMI, TPFILE,                    &
@@ -18,6 +19,7 @@ INTERFACE
 !
 USE MODD_IO,  ONLY: TFILEDATA
 USE MODD_NSV, only: NSV_LIMA_BEG
+IMPLICIT NONE
 !
 INTEGER,                  INTENT(IN)   :: KRR        ! Number of moist variables
 INTEGER,                  INTENT(IN)   :: KMI        ! Model index 
diff --git a/src/PHYEX/micro/lima_adjust_split.f90 b/src/PHYEX/micro/lima_adjust_split.f90
index e5d164e8b825675385fa1f301ef88dd305706440..5ad444ac70a7f4809ac7c52ce72aade0965e1a09 100644
--- a/src/PHYEX/micro/lima_adjust_split.f90
+++ b/src/PHYEX/micro/lima_adjust_split.f90
@@ -88,7 +88,7 @@ SUBROUTINE LIMA_ADJUST_SPLIT(D, CST, BUCONF, TBUDGETS, KBUDGETS,
 USE MODD_BUDGET,   ONLY: TBUDGETDATA, TBUDGETCONF_t, NBUDGET_TH, NBUDGET_RV, &
                          NBUDGET_RC, NBUDGET_RI, NBUDGET_RV, NBUDGET_SV1, NBUMOD        
 USE MODD_CST,            ONLY: CST_t
-USE MODD_CONF
+!USE MODD_CONF
 !use modd_field,            only: TFIELDDATA, TYPEREAL
 !USE MODD_IO,               ONLY: TFILEDATA
 !USE MODD_LUNIT_n,          ONLY: TLUOUT
@@ -98,15 +98,14 @@ USE MODD_PARAM_LIMA
 USE MODD_PARAM_LIMA_COLD
 USE MODD_PARAM_LIMA_MIXED
 USE MODD_PARAM_LIMA_WARM
-USE MODD_RAIN_ICE_PARAM,   ONLY: RAIN_ICE_PARAM
-USE MODD_NEB,              ONLY: NEB
+USE MODD_RAIN_ICE_PARAM_n,   ONLY: RAIN_ICE_PARAMN
+USE MODD_NEB_n,            ONLY: NEBN
 USE MODD_TURB_n,           ONLY: TURBN
 USE MODD_DIMPHYEX,         ONLY: DIMPHYEX_t
 !
 USE MODE_BUDGET_PHY,       ONLY: BUDGET_STORE_INIT_PHY, BUDGET_STORE_END_PHY
 !USE MODE_IO_FIELD_WRITE,   only: IO_Field_write
 use mode_msg
-use mode_tools,            only: Countjv
 !
 USE MODI_CONDENSATION
 USE MODE_LIMA_CCN_ACTIVATION, ONLY: LIMA_CCN_ACTIVATION
@@ -191,8 +190,7 @@ REAL, DIMENSION(SIZE(PRHODJ,1),SIZE(PRHODJ,2),SIZE(PRHODJ,3)) &
                             PCIT,        & ! Cloud ice   conc. at t
 !
                             PCCS,        & ! Cloud water C. source
-                            PMAS,        & ! Mass of scavenged AP
-                            PCIS           ! Ice crystal C. source
+                            PMAS           ! Mass of scavenged AP
 !
 REAL, DIMENSION(:,:,:,:), ALLOCATABLE &
                          :: PNFS,        & ! Free      CCN C. source
@@ -228,11 +226,6 @@ REAL, DIMENSION(SIZE(PRHODJ,1),SIZE(PRHODJ,2)) :: ZSIGQSAT2D
 INTEGER, DIMENSION(SIZE(PRHODJ,1),SIZE(PRHODJ,2),SIZE(PRHODJ,3)) :: IVEC1
 !
 !INTEGER                  :: IRESP      ! Return code of FM routines
-INTEGER                  :: IIU,IJU,IKU! dimensions of dummy arrays
-INTEGER                  :: IKB        ! K index value of the first inner mass point
-INTEGER                  :: IKE        ! K index value of the last inner mass point
-INTEGER                  :: IIB,IJB    ! Horz index values of the first inner mass points
-INTEGER                  :: IIE,IJE    ! Horz index values of the last inner mass points
 INTEGER                  :: JITER,ITERMAX  ! iterative loop for first order adjustment
 !INTEGER                  :: ILUOUT     ! Logical unit of output listing 
 !
@@ -243,7 +236,7 @@ REAL, DIMENSION(:), ALLOCATABLE   :: ZCTMIN
 !
 integer :: idx
 integer :: JI, JJ, JK, jl
-INTEGER                           :: JMOD, JMOD_IFN, JMOD_IMM
+INTEGER                           :: JMOD
 !
 !!$TYPE(TFIELDMETADATA)     :: TZFIELD
 !
@@ -467,11 +460,11 @@ DO JITER =1,ITERMAX
    END IF
 
    IF (LADJ) THEN
-      CALL CONDENSATION(D, CST, RAIN_ICE_PARAM, NEB, TURBN,                    &
+      CALL CONDENSATION(D, CST, RAIN_ICE_PARAMN, NEBN, TURBN,                    &
           'S', HCONDENS, HLAMBDA3,                                             &
            PPABST, PZZ, PRHODREF, ZT, ZRV_IN, ZRV, ZRC_IN, ZRC, ZRI_IN, ZRI,   &
            PRRS*PTSTEP,PRSS*PTSTEP, PRGS*PTSTEP, &
-           Z_SIGS, .FALSE., PMFCONV, PCLDFR, Z_SRCS, GUSERI, G_SIGMAS, .FALSE., .FALSE.,&
+           Z_SIGS, .FALSE., PMFCONV, PCLDFR, Z_SRCS, GUSERI, G_SIGMAS, .FALSE., &
            ZDUM, ZDUM, ZDUM, ZDUM, ZDUM,              &
            ZSIGQSAT2D, PLV=ZLV, PLS=ZLS, PCPH=ZCPH )
    END IF
diff --git a/src/PHYEX/micro/lima_cold.f90 b/src/PHYEX/micro/lima_cold.f90
index b4c6b16540847310eea1d18a38e22c5713e339d0..b9be5a7aca535ad2b53341b25f47060c37f61b4e 100644
--- a/src/PHYEX/micro/lima_cold.f90
+++ b/src/PHYEX/micro/lima_cold.f90
@@ -7,6 +7,7 @@
        MODULE MODI_LIMA_COLD
 !      #####################
 !
+IMPLICIT NONE
 INTERFACE
       SUBROUTINE LIMA_COLD (CST, OSEDI, OHHONI, KSPLITG, PTSTEP, KMI,      &
                            KRR, PZZ, PRHODJ,                               &
@@ -17,6 +18,7 @@ INTERFACE
 !
 USE MODD_NSV,   only: NSV_LIMA_BEG
 USE MODD_CST,            ONLY: CST_t
+IMPLICIT NONE
 !
 TYPE(CST_t),              INTENT(IN)    :: CST
 !
diff --git a/src/PHYEX/micro/lima_cold_hom_nucl.f90 b/src/PHYEX/micro/lima_cold_hom_nucl.f90
index cf9fbfe5898328b4b9f941a15c5a8b6fcefbb910..4971d2215a15ab383b56047f7b555abd1defbdfe 100644
--- a/src/PHYEX/micro/lima_cold_hom_nucl.f90
+++ b/src/PHYEX/micro/lima_cold_hom_nucl.f90
@@ -7,6 +7,7 @@
        MODULE MODI_LIMA_COLD_HOM_NUCL
 !      ######################
 !
+IMPLICIT NONE
 INTERFACE
       SUBROUTINE LIMA_COLD_HOM_NUCL (OHHONI, PTSTEP, KMI,             &
                            PZZ, PRHODJ,                               &
@@ -15,6 +16,7 @@ INTERFACE
                            PTHS, PRVS, PRCS, PRRS, PRIS, PRGS,        &
                            PCCT,                                      &
                            PCCS, PCRS, PNFS, PCIS, PNHS               )
+IMPLICIT NONE
 !
 LOGICAL,                  INTENT(IN)    :: OHHONI  ! enable haze freezing
 REAL,                     INTENT(IN)    :: PTSTEP  ! Time step          
diff --git a/src/PHYEX/micro/lima_cold_sedimentation.f90 b/src/PHYEX/micro/lima_cold_sedimentation.f90
index ce1e7141cb834219582687c600d947c1714ecb4d..76468f87b302ea753b5131b31f46a87c989d65e1 100644
--- a/src/PHYEX/micro/lima_cold_sedimentation.f90
+++ b/src/PHYEX/micro/lima_cold_sedimentation.f90
@@ -7,6 +7,7 @@
        MODULE MODI_LIMA_COLD_SEDIMENTATION
 !      ###################################
 !
+IMPLICIT NONE
 INTERFACE
       SUBROUTINE LIMA_COLD_SEDIMENTATION (OSEDI, KSPLITG, PTSTEP, KMI,     &
                                           PZZ, PRHODJ, PRHODREF,           &
@@ -15,6 +16,7 @@ INTERFACE
                                           PINPRS, PINPRG, PINPRH,          &
                                           PCSS, PCGS, PCHS)
 !
+IMPLICIT NONE
 LOGICAL,                  INTENT(IN)    :: OSEDI      ! switch to activate the 
                                                       ! cloud ice sedimentation
 INTEGER,                  INTENT(IN)    :: KSPLITG    ! Number of small time step 
diff --git a/src/PHYEX/micro/lima_cold_slow_processes.f90 b/src/PHYEX/micro/lima_cold_slow_processes.f90
index 64917a92a27c4bc1f32425e3d931f9919750fd89..364a7007f2c98d705bcfcfbb3d328b084f75678b 100644
--- a/src/PHYEX/micro/lima_cold_slow_processes.f90
+++ b/src/PHYEX/micro/lima_cold_slow_processes.f90
@@ -7,12 +7,14 @@
        MODULE MODI_LIMA_COLD_SLOW_PROCESSES
 !      #####################
 !
+IMPLICIT NONE
 INTERFACE
       SUBROUTINE LIMA_COLD_SLOW_PROCESSES (PTSTEP, KMI, PZZ, PRHODJ,                 &
                                            PRHODREF, PEXNREF, PPABST,                &
                                            PTHT, PRVT, PRCT, PRRT, PRIT, PRST, PRGT, &
                                            PTHS, PRVS, PRIS, PRSS,                   &
                                            PCIT, PCIS, PCST, PCSS                    )
+IMPLICIT NONE
 !
 REAL,                     INTENT(IN)    :: PTSTEP  ! Time step          
 INTEGER,                  INTENT(IN)    :: KMI     ! Model index 
diff --git a/src/PHYEX/micro/lima_meyers.f90 b/src/PHYEX/micro/lima_meyers.f90
index 7e55e1ab7cbc257097990a208dfeebc1ecc50972..ca1c22825215509ad1cffa4097e0b5145f69ac23 100644
--- a/src/PHYEX/micro/lima_meyers.f90
+++ b/src/PHYEX/micro/lima_meyers.f90
@@ -7,12 +7,14 @@
        MODULE MODI_LIMA_MEYERS
 !      #######################
 !
+IMPLICIT NONE
 INTERFACE
       SUBROUTINE LIMA_MEYERS   (OHHONI, PTSTEP, KMI,                            &
                                 PZZ, PRHODJ, PRHODREF, PEXNREF, PPABST,         &
                                 PTHT, PRVT, PRCT, PRRT, PRIT, PRST, PRGT, PCCT, &
                                 PTHS, PRVS, PRCS, PRIS,                         &
                                 PCCS, PCIS, PINS )
+IMPLICIT NONE
 !
 LOGICAL,                  INTENT(IN)    :: OHHONI  ! enable haze freezing
 REAL,                     INTENT(IN)    :: PTSTEP  ! Time step          
diff --git a/src/PHYEX/micro/lima_mixed.f90 b/src/PHYEX/micro/lima_mixed.f90
index 96fa6513876b27137b222d8b68de552fa8b65c9a..251521427ddb0bcf6772c2bf1b0741e99dc82c6d 100644
--- a/src/PHYEX/micro/lima_mixed.f90
+++ b/src/PHYEX/micro/lima_mixed.f90
@@ -7,6 +7,7 @@
        MODULE MODI_LIMA_MIXED
 !      ######################
 !
+IMPLICIT NONE
 INTERFACE
       SUBROUTINE LIMA_MIXED (OSEDI, OHHONI, KSPLITG, PTSTEP, KMI, &
                              KRR, PZZ, PRHODJ,                    &
@@ -15,6 +16,7 @@ INTERFACE
                              PTHS, PRS, PSVS)
 !
 USE MODD_NSV,   only: NSV_LIMA_BEG
+IMPLICIT NONE
 !
 LOGICAL,                  INTENT(IN)    :: OSEDI   ! switch to activate the
                                                    ! cloud ice sedimentation
diff --git a/src/PHYEX/micro/lima_mixed_fast_processes.f90 b/src/PHYEX/micro/lima_mixed_fast_processes.f90
index fbd6f4262aeee15270085e26359d1cf0939daf31..47b59eb8066528c40a966b9b7e176aab7649e133 100644
--- a/src/PHYEX/micro/lima_mixed_fast_processes.f90
+++ b/src/PHYEX/micro/lima_mixed_fast_processes.f90
@@ -7,6 +7,7 @@
        MODULE MODI_LIMA_MIXED_FAST_PROCESSES
 !      #####################################
 !
+IMPLICIT NONE
 INTERFACE
       SUBROUTINE LIMA_MIXED_FAST_PROCESSES (PRHODREF, PZT, PPRES, PTSTEP,                   &
                                             PLSFACT, PLVFACT, PKA, PDV, PCJ,                &
@@ -18,6 +19,7 @@ INTERFACE
                                             PRHODJ1D, GMICRO, PRHODJ, KMI, PTHS,            &
                                             PRCS, PRRS, PRIS, PRSS, PRGS, PRHS,             &
                                             PCCS, PCRS, PCIS, PCSS, PCGS, PCHS              )
+IMPLICIT NONE
 !
 REAL, DIMENSION(:),   INTENT(IN)    :: PRHODREF  ! RHO Dry REFerence
 REAL, DIMENSION(:),   INTENT(IN)    :: PZT       ! Temperature
diff --git a/src/PHYEX/micro/lima_mixed_slow_processes.f90 b/src/PHYEX/micro/lima_mixed_slow_processes.f90
index 609f54dd8d8f6d0a7ca7af505805ca7b9be8083f..79b664bdf2544cd2fd72296e42459a88dde45ace 100644
--- a/src/PHYEX/micro/lima_mixed_slow_processes.f90
+++ b/src/PHYEX/micro/lima_mixed_slow_processes.f90
@@ -7,6 +7,7 @@
        MODULE MODI_LIMA_MIXED_SLOW_PROCESSES
 !      #####################################
 !
+IMPLICIT NONE
 INTERFACE
       SUBROUTINE LIMA_MIXED_SLOW_PROCESSES(ZRHODREF, ZZT, ZSSI, PTSTEP,        &
                                            ZLSFACT, ZLVFACT, ZAI, ZCJ,         &
@@ -17,6 +18,7 @@ INTERFACE
                                            PRHODJ1D, GMICRO, PRHODJ, KMI,      &
                                            PTHS, PRVS, PRCS, PRIS, PRGS, PRHS, &
                                            PCCS, PCIS                    )
+IMPLICIT NONE
 !
 REAL, DIMENSION(:),   INTENT(IN)    :: ZRHODREF  ! RHO Dry REFerence
 REAL, DIMENSION(:),   INTENT(IN)    :: ZZT       ! Temperature
diff --git a/src/PHYEX/micro/lima_mixrat_to_nconc.f90 b/src/PHYEX/micro/lima_mixrat_to_nconc.f90
index f21a1afe23918e0aaf509bdb44721646b7d1a812..854db4c89e65a0b87df300dbf69e50533f494756 100644
--- a/src/PHYEX/micro/lima_mixrat_to_nconc.f90
+++ b/src/PHYEX/micro/lima_mixrat_to_nconc.f90
@@ -6,9 +6,11 @@
 !     ################################
       MODULE MODI_LIMA_MIXRAT_TO_NCONC
 !     ################################
+IMPLICIT NONE
 INTERFACE
 SUBROUTINE LIMA_MIXRAT_TO_NCONC(PPABST, PTHT, PRVT, PSVT)
 !
+IMPLICIT NONE
 REAL, DIMENSION(:,:,:),   INTENT(IN)      :: PPABST ! Absolute pressure
 REAL, DIMENSION(:,:,:),   INTENT(IN)      :: PTHT   ! Potential temperature
 REAL, DIMENSION(:,:,:),   INTENT(IN)      :: PRVT   ! Water Vapor mix. ratio
@@ -52,7 +54,8 @@ USE MODD_PARAM_LIMA, ONLY : NMOD_CCN, NMOD_IFN,                   &
                             XR_MEAN_CCN, XLOGSIG_CCN, XRHO_CCN,   &
                             XMDIAM_IFN, XSIGMA_IFN, XRHO_IFN,     & 
                             NSPECIE, XFRAC,                       &
-                            CCCN_MODES, CIFN_SPECIES
+                            CCCN_MODES, CIFN_SPECIES,             &
+                            PARAM_LIMA_ALLOCATE
 !
 IMPLICIT NONE
 !
@@ -103,9 +106,9 @@ ZREHU(:,:,:) = MIN( 0.99, MAX( 0.01,ZREHU(:,:,:) ) )
 ! sea-salt, sulfate, hydrophilic (GADS data)
 !
 !  NMOD_CCN=3
-  IF (.NOT.(ALLOCATED(XR_MEAN_CCN))) ALLOCATE(XR_MEAN_CCN(NMOD_CCN))
-  IF (.NOT.(ALLOCATED(XLOGSIG_CCN))) ALLOCATE(XLOGSIG_CCN(NMOD_CCN))
-  IF (.NOT.(ALLOCATED(XRHO_CCN)))    ALLOCATE(XRHO_CCN(NMOD_CCN))
+  IF (.NOT.(ASSOCIATED(XR_MEAN_CCN))) CALL PARAM_LIMA_ALLOCATE('XR_MEAN_CCN', NMOD_CCN)
+  IF (.NOT.(ASSOCIATED(XLOGSIG_CCN))) CALL PARAM_LIMA_ALLOCATE('XLOGSIG_CCN', NMOD_CCN)
+  IF (.NOT.(ASSOCIATED(XRHO_CCN)))    CALL PARAM_LIMA_ALLOCATE('XRHO_CCN', NMOD_CCN)
   IF( CCCN_MODES=='CAMS_ACC') THEN
       XR_MEAN_CCN(:) = (/ 0.2E-6   , 0.5E-6    , 0.4E-6 /)
       XLOGSIG_CCN(:) = (/ 0.693    , 0.476     , 0.788  /)
@@ -149,9 +152,9 @@ END DO
 !
 !  NMOD_IFN=2
   NSPECIE=4
-  IF (.NOT.(ALLOCATED(XMDIAM_IFN))) ALLOCATE(XMDIAM_IFN(NSPECIE))
-  IF (.NOT.(ALLOCATED(XSIGMA_IFN))) ALLOCATE(XSIGMA_IFN(NSPECIE))
-  IF (.NOT.(ALLOCATED(XRHO_IFN)))   ALLOCATE(XRHO_IFN(NSPECIE))
+  IF (.NOT.(ASSOCIATED(XMDIAM_IFN))) CALL PARAM_LIMA_ALLOCATE('XMDIAM_IFN', NSPECIE)
+  IF (.NOT.(ASSOCIATED(XSIGMA_IFN))) CALL PARAM_LIMA_ALLOCATE('XSIGMA_IFN', NSPECIE)
+  IF (.NOT.(ASSOCIATED(XRHO_IFN)))   CALL PARAM_LIMA_ALLOCATE('XRHO_IFN', NSPECIE)
   IF( CIFN_SPECIES=='CAMS_ACC') THEN
       XMDIAM_IFN = (/0.8E-6, 3.0E-6, 0.04E-6, 0.8E-6 /)
       XSIGMA_IFN = (/2.0,    2.15,   2.0,     2.2    /)
@@ -162,7 +165,7 @@ END DO
       XSIGMA_IFN = (/2.0,    2.15,   2.0,     2.2 /)
       XRHO_IFN   = (/2600.,  2600.,  1000.,   1800./)
   END IF
-  IF (.NOT.(ALLOCATED(XFRAC))) ALLOCATE(XFRAC(NSPECIE,NMOD_IFN))
+  IF (.NOT.(ASSOCIATED(XFRAC))) CALL PARAM_LIMA_ALLOCATE('XFRAC', NSPECIE,NMOD_IFN)
       XFRAC(1,1)=1.0
       XFRAC(2,1)=0.0
       XFRAC(3,1)=0.0
diff --git a/src/PHYEX/micro/lima_notadjust.f90 b/src/PHYEX/micro/lima_notadjust.f90
index 255eaa618018099ffbd634f2e738f5541e0a4479..24a052b39d199db950b8313c10a0baaed41a80a2 100644
--- a/src/PHYEX/micro/lima_notadjust.f90
+++ b/src/PHYEX/micro/lima_notadjust.f90
@@ -7,6 +7,7 @@
       MODULE MODI_LIMA_NOTADJUST
 !     ##########################
 !
+IMPLICIT NONE
 INTERFACE
 !
       SUBROUTINE LIMA_NOTADJUST(KMI, TPFILE, HRAD,                                       &
@@ -15,6 +16,7 @@ INTERFACE
 !
 USE MODD_IO, ONLY: TFILEDATA
 USE MODD_NSV,   only: NSV_LIMA_BEG
+IMPLICIT NONE
 !
 INTEGER,                  INTENT(IN)    :: KMI        ! Model index
 TYPE(TFILEDATA),          INTENT(IN)    :: TPFILE   ! Output file
diff --git a/src/PHYEX/micro/lima_nucleation_procs.f90 b/src/PHYEX/micro/lima_nucleation_procs.f90
new file mode 100644
index 0000000000000000000000000000000000000000..c239ca84cf69c23c4370c8488ee9cb6428669957
--- /dev/null
+++ b/src/PHYEX/micro/lima_nucleation_procs.f90
@@ -0,0 +1,394 @@
+!MNH_LIC Copyright 2018-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_LIMA_NUCLEATION_PROCS
+!      ###############################
+!
+IMPLICIT NONE
+INTERFACE
+   SUBROUTINE LIMA_NUCLEATION_PROCS (PTSTEP, TPFILE, PRHODJ,                       &
+                                     PRHODREF, PEXNREF, PPABST, PT, PDTHRAD, PW_NU,&
+                                     PTHT, PRVT, PRCT, PRRT, PRIT, PRST, PRGT,     &
+                                     PCCT, PCRT, PCIT,                             &
+                                     PNFT, PNAT, PIFT, PINT, PNIT, PNHT,           &
+                                     PCLDFR, PICEFR, PPRCFR                        )
+!
+USE MODD_IO, ONLY: TFILEDATA
+IMPLICIT NONE
+!
+REAL,                     INTENT(IN)    :: PTSTEP     ! Double Time step
+TYPE(TFILEDATA),          INTENT(IN)    :: TPFILE     ! Output file
+!
+REAL, DIMENSION(:,:,:),   INTENT(IN)    :: PRHODJ     ! Reference density
+REAL, DIMENSION(:,:,:),   INTENT(IN)    :: PRHODREF   ! Reference density
+REAL, DIMENSION(:,:,:),   INTENT(IN)    :: PEXNREF    ! Reference Exner function
+REAL, DIMENSION(:,:,:),   INTENT(IN)    :: PPABST     ! abs. pressure at time t
+REAL, DIMENSION(:,:,:),   INTENT(IN)    :: PT         ! Temperature
+REAL, DIMENSION(:,:,:),   INTENT(IN)    :: PDTHRAD    ! Radiative temperature tendency
+REAL, DIMENSION(:,:,:),   INTENT(IN)    :: PW_NU      ! updraft velocity used for
+!
+REAL, DIMENSION(:,:,:),   INTENT(INOUT) :: PTHT       ! Theta at t 
+REAL, DIMENSION(:,:,:),   INTENT(INOUT) :: PRVT       ! Water vapor m.r. at t 
+REAL, DIMENSION(:,:,:),   INTENT(INOUT) :: PRCT       ! Cloud water m.r. at t 
+REAL, DIMENSION(:,:,:),   INTENT(IN)    :: PRRT       ! Rain water m.r. at t
+REAL, DIMENSION(:,:,:),   INTENT(INOUT) :: PRIT       ! Pristine ice m.r. at t
+REAL, DIMENSION(:,:,:),   INTENT(IN)    :: PRST       ! Snow m.r. at t
+REAL, DIMENSION(:,:,:),   INTENT(IN)    :: PRGT       ! Graupel m.r. at t
+!
+REAL, DIMENSION(:,:,:),   INTENT(INOUT) :: PCCT       ! Cloud water conc. at t 
+REAL, DIMENSION(:,:,:),   INTENT(IN)    :: PCRT       ! Rain water conc. at t
+REAL, DIMENSION(:,:,:),   INTENT(INOUT) :: PCIT       ! Prinstine ice conc. at t
+!
+REAL, DIMENSION(:,:,:,:), INTENT(INOUT) :: PNFT       ! CCN C. available at t
+REAL, DIMENSION(:,:,:,:), INTENT(INOUT) :: PNAT       ! CCN C. activated at t
+REAL, DIMENSION(:,:,:,:), INTENT(INOUT) :: PIFT       ! IFN C. available at t
+REAL, DIMENSION(:,:,:,:), INTENT(INOUT) :: PINT       ! IFN C. activated at t
+REAL, DIMENSION(:,:,:,:), INTENT(INOUT) :: PNIT       ! Coated IFN activated at t
+REAL, DIMENSION(:,:,:),   INTENT(INOUT) :: PNHT       ! CCN hom freezing
+!
+REAL, DIMENSION(:,:,:),   INTENT(INOUT) :: PCLDFR     ! Cloud fraction
+REAL, DIMENSION(:,:,:),   INTENT(INOUT) :: PICEFR     ! Ice fraction
+REAL, DIMENSION(:,:,:),   INTENT(INOUT) :: PPRCFR     ! Precipitation fraction
+!
+END SUBROUTINE LIMA_NUCLEATION_PROCS
+END INTERFACE
+END MODULE MODI_LIMA_NUCLEATION_PROCS
+!     #############################################################################
+SUBROUTINE LIMA_NUCLEATION_PROCS (PTSTEP, TPFILE, PRHODJ,                       &
+                                  PRHODREF, PEXNREF, PPABST, PT, PDTHRAD, PW_NU,&
+                                  PTHT, PRVT, PRCT, PRRT, PRIT, PRST, PRGT,     &
+                                  PCCT, PCRT, PCIT,                             &
+                                  PNFT, PNAT, PIFT, PINT, PNIT, PNHT,           &
+                                  PCLDFR, PICEFR, PPRCFR                        )
+!     #############################################################################
+!
+!!    PURPOSE
+!!    -------
+!!      Compute nucleation processes for the time-split version of LIMA
+!!
+!!    AUTHOR
+!!    ------
+!!      B.    Vié        * CNRM *
+!!
+!!    MODIFICATIONS
+!!    -------------
+!!      Original             15/03/2018
+!  M. Leriche     06/2019: missing update of PNFT after CCN hom. ncl.
+!  P. Wautelet 27/02/2020: bugfix: PNFT was not updated after LIMA_CCN_HOM_FREEZING
+!  P. Wautelet 27/02/2020: add Z_TH_HINC variable (for budgets)
+!  P. Wautelet    02/2020: use the new data structures and subroutines for budgets
+!  B. Vie      03/03/2020: use DTHRAD instead of dT/dt in Smax diagnostic computation
+!  B. Vie         03/2022: Add option for 1-moment pristine ice
+!-------------------------------------------------------------------------------
+!
+use modd_budget,     only: lbu_enable, lbudget_th, lbudget_rv, lbudget_rc, lbudget_rr,  &
+                           lbudget_ri, lbudget_rs, lbudget_rg, lbudget_rh, lbudget_sv,  &
+                           NBUDGET_TH, NBUDGET_RV, NBUDGET_RC, NBUDGET_RI, NBUDGET_SV1, &
+                           tbudgets
+USE MODD_IO,         ONLY: TFILEDATA
+USE MODD_PARAMETERS, ONLY : JPHEXT, JPVEXT
+USE MODD_NSV,        ONLY : NSV_LIMA_NC, NSV_LIMA_NR, NSV_LIMA_CCN_FREE, NSV_LIMA_CCN_ACTI, &
+                            NSV_LIMA_NI, NSV_LIMA_IFN_FREE, NSV_LIMA_IFN_NUCL, NSV_LIMA_IMM_NUCL, NSV_LIMA_HOM_HAZE
+USE MODD_PARAM_LIMA, ONLY : LCOLD, LNUCL, LMEYERS, LSNOW, LWARM, LACTI, LRAIN, LHHONI,  &
+                            NMOD_CCN, NMOD_IFN, NMOD_IMM, XCTMIN, XRTMIN, LSPRO, NMOM_I, NMOM_C
+USE MODD_NEB_n,      ONLY : LSUBG_COND
+
+use mode_budget,     only: Budget_store_add, Budget_store_init, Budget_store_end
+
+USE MODI_LIMA_CCN_ACTIVATION
+USE MODI_LIMA_CCN_HOM_FREEZING
+USE MODI_LIMA_MEYERS_NUCLEATION
+USE MODI_LIMA_PHILLIPS_IFN_NUCLEATION
+USE MODE_RAIN_ICE_NUCLEATION
+!
+!-------------------------------------------------------------------------------
+!
+IMPLICIT NONE
+!
+!-------------------------------------------------------------------------------
+!
+REAL,                     INTENT(IN)    :: PTSTEP     ! Double Time step
+TYPE(TFILEDATA),          INTENT(IN)    :: TPFILE     ! Output file
+!
+REAL, DIMENSION(:,:,:),   INTENT(IN)    :: PRHODJ     ! Reference density
+REAL, DIMENSION(:,:,:),   INTENT(IN)    :: PRHODREF   ! Reference density
+REAL, DIMENSION(:,:,:),   INTENT(IN)    :: PEXNREF    ! Reference Exner function
+REAL, DIMENSION(:,:,:),   INTENT(IN)    :: PPABST     ! abs. pressure at time t
+REAL, DIMENSION(:,:,:),   INTENT(IN)    :: PT         ! Temperature
+REAL, DIMENSION(:,:,:),   INTENT(IN)    :: PDTHRAD    ! Radiative temperature tendency
+REAL, DIMENSION(:,:,:),   INTENT(IN)    :: PW_NU      ! updraft velocity used for
+!
+REAL, DIMENSION(:,:,:),   INTENT(INOUT) :: PTHT       ! Theta at t 
+REAL, DIMENSION(:,:,:),   INTENT(INOUT) :: PRVT       ! Water vapor m.r. at t 
+REAL, DIMENSION(:,:,:),   INTENT(INOUT) :: PRCT       ! Cloud water m.r. at t 
+REAL, DIMENSION(:,:,:),   INTENT(IN)    :: PRRT       ! Rain water m.r. at t
+REAL, DIMENSION(:,:,:),   INTENT(INOUT) :: PRIT       ! Rain water m.r. at t
+REAL, DIMENSION(:,:,:),   INTENT(IN)    :: PRST       ! Rain water m.r. at t
+REAL, DIMENSION(:,:,:),   INTENT(IN)    :: PRGT       ! Rain water m.r. at t
+!
+REAL, DIMENSION(:,:,:),   INTENT(INOUT) :: PCCT       ! Cloud water conc. at t 
+REAL, DIMENSION(:,:,:),   INTENT(IN)    :: PCRT       ! Rain water conc. at t
+REAL, DIMENSION(:,:,:),   INTENT(INOUT) :: PCIT       ! Prinstine ice conc. at t
+!
+REAL, DIMENSION(:,:,:,:), INTENT(INOUT) :: PNFT       ! CCN C. available at t
+REAL, DIMENSION(:,:,:,:), INTENT(INOUT) :: PNAT       ! CCN C. activated at t
+REAL, DIMENSION(:,:,:,:), INTENT(INOUT) :: PIFT       ! IFN C. available at t
+REAL, DIMENSION(:,:,:,:), INTENT(INOUT) :: PINT       ! IFN C. activated at t
+REAL, DIMENSION(:,:,:,:), INTENT(INOUT) :: PNIT       ! Coated IFN activated at t
+REAL, DIMENSION(:,:,:),   INTENT(INOUT) :: PNHT       ! CCN hom. freezing
+!
+REAL, DIMENSION(:,:,:),   INTENT(INOUT) :: PCLDFR     ! Cloud fraction
+REAL, DIMENSION(:,:,:),   INTENT(INOUT) :: PICEFR     ! Ice fraction
+REAL, DIMENSION(:,:,:),   INTENT(INOUT) :: PPRCFR     ! Precipitation fraction
+!
+!-------------------------------------------------------------------------------
+!
+REAL, DIMENSION(SIZE(PT,1),SIZE(PT,2),SIZE(PT,3))          :: Z_TH_HIND, Z_RI_HIND, Z_CI_HIND, Z_TH_HINC, Z_RC_HINC, Z_CC_HINC
+REAL, DIMENSION(SIZE(PT,1),SIZE(PT,2),SIZE(PT,3))          :: ZTHS, ZRIS, ZRVS, ZRHT, ZCIT, ZT
+!
+integer :: idx
+INTEGER :: JL
+!
+!-------------------------------------------------------------------------------
+!
+IF ( LWARM .AND. LACTI .AND. NMOD_CCN >=1 .AND. NMOM_C.GE.2) THEN
+
+  IF (.NOT.LSUBG_COND .AND. .NOT.LSPRO) THEN
+
+    if ( lbu_enable ) then
+      if ( lbudget_th ) call Budget_store_init( tbudgets(NBUDGET_TH), 'HENU', ptht(:, :, :) * prhodj(:, :, :) / ptstep )
+      if ( lbudget_rv ) call Budget_store_init( tbudgets(NBUDGET_RV), 'HENU', prvt(:, :, :) * prhodj(:, :, :) / ptstep )
+      if ( lbudget_rc ) call Budget_store_init( tbudgets(NBUDGET_RC), 'HENU', prct(:, :, :) * prhodj(:, :, :) / ptstep )
+      if ( lbudget_sv ) then
+        call Budget_store_init( tbudgets(NBUDGET_SV1 - 1 + nsv_lima_nc), 'HENU', pcct(:, :, :) * prhodj(:, :, :) / ptstep )
+        do jl = 1, nmod_ccn
+          idx = NBUDGET_SV1 - 1 + nsv_lima_ccn_free - 1 + jl
+          call Budget_store_init( tbudgets(idx), 'HENU', pnft(:, :, :, jl) * prhodj(:, :, :) / ptstep )
+          idx = NBUDGET_SV1 - 1 + nsv_lima_ccn_acti - 1 + jl
+          call Budget_store_init( tbudgets(idx), 'HENU', pnat(:, :, :, jl) * prhodj(:, :, :) / ptstep )
+        end do
+      end if
+    end if
+
+    CALL LIMA_CCN_ACTIVATION( TPFILE,                                           &
+                              PRHODREF, PEXNREF, PPABST, PT, PDTHRAD, PW_NU,    &
+                              PTHT, PRVT, PRCT, PCCT, PRRT, PNFT, PNAT, PCLDFR  )
+    if ( lbu_enable ) then
+      if ( lbudget_th ) call Budget_store_end( tbudgets(NBUDGET_TH), 'HENU', ptht(:, :, :) * prhodj(:, :, :) / ptstep )
+      if ( lbudget_rv ) call Budget_store_end( tbudgets(NBUDGET_RV), 'HENU', prvt(:, :, :) * prhodj(:, :, :) / ptstep )
+      if ( lbudget_rc ) call Budget_store_end( tbudgets(NBUDGET_RC), 'HENU', prct(:, :, :) * prhodj(:, :, :) / ptstep )
+      if ( lbudget_sv ) then
+        call Budget_store_end( tbudgets(NBUDGET_SV1 - 1 + nsv_lima_nc), 'HENU', pcct(:, :, :) * prhodj(:, :, :) / ptstep )
+        do jl = 1, nmod_ccn
+          idx = NBUDGET_SV1 - 1 + nsv_lima_ccn_free - 1 + jl
+          call Budget_store_end( tbudgets(idx), 'HENU', pnft(:, :, :, jl) * prhodj(:, :, :) / ptstep )
+          idx = NBUDGET_SV1 - 1 + nsv_lima_ccn_acti - 1 + jl
+          call Budget_store_end( tbudgets(idx), 'HENU', pnat(:, :, :, jl) * prhodj(:, :, :) / ptstep )
+        end do
+      end if
+    end if
+
+  END IF
+
+  WHERE(PCLDFR(:,:,:)<1.E-10 .AND. PRCT(:,:,:)>XRTMIN(2) .AND. PCCT(:,:,:)>XCTMIN(2)) PCLDFR(:,:,:)=1.
+
+END IF
+!
+!-------------------------------------------------------------------------------
+!
+IF ( LCOLD .AND. LNUCL .AND. NMOM_I>=2 .AND. .NOT.LMEYERS .AND. NMOD_IFN >= 1 ) THEN
+  if ( lbu_enable ) then
+    if ( lbudget_sv ) then
+      do jl = 1, nmod_ifn
+        idx = NBUDGET_SV1 - 1 + nsv_lima_ifn_free - 1 + jl
+        call Budget_store_init( tbudgets(idx), 'HIND', pift(:, :, :, jl) * prhodj(:, :, :) / ptstep )
+        idx = NBUDGET_SV1 - 1 + nsv_lima_ifn_nucl - 1 + jl
+        call Budget_store_init( tbudgets(idx), 'HIND', pint(:, :, :, jl) * prhodj(:, :, :) / ptstep )
+      end do
+
+      do jl = 1, nmod_ccn
+        idx = NBUDGET_SV1 - 1 + nsv_lima_ccn_acti - 1 + jl
+        call Budget_store_init( tbudgets(idx), 'HINC', pnat(:, :, :, jl) * prhodj(:, :, :) / ptstep )
+      end do
+      do jl = 1, nmod_imm
+        idx = NBUDGET_SV1 - 1 + nsv_lima_imm_nucl - 1 + jl
+        call Budget_store_init( tbudgets(idx), 'HINC', pnit(:, :, :, jl) * prhodj(:, :, :) / ptstep )
+      end do
+    end if
+  end if
+
+   CALL LIMA_PHILLIPS_IFN_NUCLEATION (PTSTEP,                                           &
+                                      PRHODREF, PEXNREF, PPABST,                        &
+                                      PTHT, PRVT, PRCT, PRRT, PRIT, PRST, PRGT,         &
+                                      PCCT, PCIT, PNAT, PIFT, PINT, PNIT,               &
+                                      Z_TH_HIND, Z_RI_HIND, Z_CI_HIND,                  &
+                                      Z_TH_HINC, Z_RC_HINC, Z_CC_HINC,                  &
+                                      PICEFR                                            )
+  WHERE(PICEFR(:,:,:)<1.E-10 .AND. PRIT(:,:,:)>XRTMIN(4) .AND. PCIT(:,:,:)>XCTMIN(4)) PICEFR(:,:,:)=1.
+!
+  if ( lbu_enable ) then
+    if ( lbudget_th ) call Budget_store_add( tbudgets(NBUDGET_TH), 'HIND',  z_th_hind(:, :, :) * prhodj(:, :, :) / ptstep )
+    if ( lbudget_rv ) call Budget_store_add( tbudgets(NBUDGET_RV), 'HIND', -z_ri_hind(:, :, :) * prhodj(:, :, :) / ptstep )
+    if ( lbudget_ri ) call Budget_store_add( tbudgets(NBUDGET_RI), 'HIND',  z_ri_hind(:, :, :) * prhodj(:, :, :) / ptstep )
+    if ( lbudget_sv ) then
+      call Budget_store_add( tbudgets(NBUDGET_SV1 - 1 + nsv_lima_ni), 'HIND', z_ci_hind(:, :, :) * prhodj(:, :, :) / ptstep )
+      do jl = 1, nmod_ifn
+        idx = NBUDGET_SV1 - 1 + nsv_lima_ifn_free - 1 + jl
+        call Budget_store_end( tbudgets(idx), 'HIND', pift(:, :, :, jl) * prhodj(:, :, :) / ptstep )
+        idx = NBUDGET_SV1 - 1 + nsv_lima_ifn_nucl - 1 + jl
+        call Budget_store_end( tbudgets(idx), 'HIND', pint(:, :, :, jl) * prhodj(:, :, :) / ptstep )
+      end do
+    end if
+
+    if ( lbudget_th ) call Budget_store_add( tbudgets(NBUDGET_TH), 'HINC',  z_th_hinc(:, :, :) * prhodj(:, :, :) / ptstep )
+    if ( lbudget_rc ) call Budget_store_add( tbudgets(NBUDGET_RC), 'HINC',  z_rc_hinc(:, :, :) * prhodj(:, :, :) / ptstep )
+    if ( lbudget_ri ) call Budget_store_add( tbudgets(NBUDGET_RI), 'HINC', -z_rc_hinc(:, :, :) * prhodj(:, :, :) / ptstep )
+    if ( lbudget_sv ) then
+       if (nmom_c.ge.2) then
+          call Budget_store_add( tbudgets(NBUDGET_SV1 - 1 + nsv_lima_nc), 'HINC',  z_cc_hinc(:, :, :) * prhodj(:, :, :) / ptstep )
+       end if
+      call Budget_store_add( tbudgets(NBUDGET_SV1 - 1 + nsv_lima_ni), 'HINC', -z_cc_hinc(:, :, :) * prhodj(:, :, :) / ptstep )
+      do jl = 1, nmod_ccn
+        idx = NBUDGET_SV1 - 1 + nsv_lima_ccn_acti - 1 + jl
+        call Budget_store_end( tbudgets(idx), 'HINC', pnat(:, :, :, jl) * prhodj(:, :, :) / ptstep )
+      end do
+      do jl = 1, nmod_imm
+        idx = NBUDGET_SV1 - 1 + nsv_lima_imm_nucl - 1 + jl
+        call Budget_store_end( tbudgets(idx), 'HINC', pnit(:, :, :, jl) * prhodj(:, :, :) / ptstep )
+      end do
+    end if
+  end if
+END IF
+!
+!-------------------------------------------------------------------------------
+!
+IF (LCOLD .AND. LNUCL .AND. NMOM_I>=2 .AND. LMEYERS) THEN
+   CALL LIMA_MEYERS_NUCLEATION (PTSTEP,                                     &
+                                PRHODREF, PEXNREF, PPABST,                  &
+                                PTHT, PRVT, PRCT, PRRT, PRIT, PRST, PRGT,   &
+                                PCCT, PCIT, PINT,                           &
+                                Z_TH_HIND, Z_RI_HIND, Z_CI_HIND,            &
+                                Z_TH_HINC, Z_RC_HINC, Z_CC_HINC,            &
+                                PICEFR                                      )
+  WHERE(PICEFR(:,:,:)<1.E-10 .AND. PRIT(:,:,:)>XRTMIN(4) .AND. PCIT(:,:,:)>XCTMIN(4)) PICEFR(:,:,:)=1.
+  !
+  if ( lbu_enable ) then
+    if ( lbudget_th ) call Budget_store_add( tbudgets(NBUDGET_TH), 'HIND',  z_th_hind(:, :, :) * prhodj(:, :, :) / ptstep )
+    if ( lbudget_rv ) call Budget_store_add( tbudgets(NBUDGET_RV), 'HIND', -z_ri_hind(:, :, :) * prhodj(:, :, :) / ptstep )
+    if ( lbudget_ri ) call Budget_store_add( tbudgets(NBUDGET_RI), 'HIND',  z_ri_hind(:, :, :) * prhodj(:, :, :) / ptstep )
+    if ( lbudget_sv ) then
+      call Budget_store_add( tbudgets(NBUDGET_SV1 - 1 + nsv_lima_ni), 'HIND', z_ci_hind(:, :, :) * prhodj(:, :, :) / ptstep )
+      if (nmod_ifn > 0 ) &
+        call Budget_store_add( tbudgets(NBUDGET_SV1 - 1 + nsv_lima_ifn_nucl), 'HIND', &
+                               z_ci_hind(:, :, :) * prhodj(:, :, :) / ptstep )
+    end if
+
+    if ( lbudget_th ) call Budget_store_add( tbudgets(NBUDGET_TH), 'HINC',  z_th_hinc(:, :, :) * prhodj(:, :, :) / ptstep )
+    if ( lbudget_rc ) call Budget_store_add( tbudgets(NBUDGET_RC), 'HINC',  z_rc_hinc(:, :, :) * prhodj(:, :, :) / ptstep )
+    if ( lbudget_ri ) call Budget_store_add( tbudgets(NBUDGET_RI), 'HINC', -z_rc_hinc(:, :, :) * prhodj(:, :, :) / ptstep )
+    if ( lbudget_sv ) then
+       if (nmom_c.ge.2) then
+          call Budget_store_add( tbudgets(NBUDGET_SV1 - 1 + nsv_lima_nc), 'HINC',  z_cc_hinc(:, :, :) * prhodj(:, :, :) / ptstep )
+       end if
+      call Budget_store_add( tbudgets(NBUDGET_SV1 - 1 + nsv_lima_ni), 'HINC', -z_cc_hinc(:, :, :) * prhodj(:, :, :) / ptstep )
+      if (nmod_ifn > 0 ) &
+        call Budget_store_add( tbudgets(NBUDGET_SV1 - 1 + nsv_lima_ifn_nucl), 'HINC', &
+                               -z_cc_hinc(:, :, :) * prhodj(:, :, :) / ptstep )
+    end if
+  end if
+END IF
+!
+!-------------------------------------------------------------------------------
+!
+IF (LCOLD .AND. LNUCL .AND. NMOM_I.EQ.1) THEN
+  WHERE(PICEFR(:,:,:)<1.E-10 .AND. PRIT(:,:,:)>XRTMIN(4) .AND. PCIT(:,:,:)>XCTMIN(4)) PICEFR(:,:,:)=1.
+  !
+  ZTHS=PTHT/PTSTEP
+  ZRVS=PRVT/PTSTEP
+  ZRIS=PRIT/PTSTEP
+  ZRHT=0.
+  ZCIT=PCIT
+  ZT=PT
+  CALL RAIN_ICE_NUCLEATION(1+JPHEXT, SIZE(PT,1)-JPHEXT, 1+JPHEXT, SIZE(PT,2)-JPHEXT, 1+JPVEXT, SIZE(PT,3)-JPVEXT, 6, &
+                           PTSTEP, PTHT, PPABST, PRHODJ, PRHODREF, PRVT, PRCT, PRRT, PRIT, PRST, PRGT,               &
+                           ZCIT, PEXNREF, ZTHS, ZRVS, ZRIS, ZT, ZRHT)
+  !
+!  Z_TH_HIND=ZTHS*PTSTEP-PTHT
+!  Z_RI_HIND=ZRIS*PTSTEP-PRIT
+!  Z_CI_HIND=ZCIT-PCIT
+  PCIT=ZCIT
+  PRIT=ZRIS*PTSTEP
+  PTHT=ZTHS*PTSTEP
+  PRVT=ZRVS*PTSTEP
+!  Z_TH_HINC=0.
+!  Z_RC_HINC=0.
+!  Z_CC_HINC=0.
+!  !
+!  if ( lbu_enable ) then
+!    if ( lbudget_th ) call Budget_store_add( tbudgets(NBUDGET_TH), 'HIND',  z_th_hind(:, :, :) * prhodj(:, :, :) / ptstep )
+!    if ( lbudget_rv ) call Budget_store_add( tbudgets(NBUDGET_RV), 'HIND', -z_ri_hind(:, :, :) * prhodj(:, :, :) / ptstep )
+!    if ( lbudget_ri ) call Budget_store_add( tbudgets(NBUDGET_RI), 'HIND',  z_ri_hind(:, :, :) * prhodj(:, :, :) / ptstep )
+!    if ( lbudget_sv ) then
+!      call Budget_store_add( tbudgets(NBUDGET_SV1 - 1 + nsv_lima_ni), 'HIND', z_ci_hind(:, :, :) * prhodj(:, :, :) / ptstep )
+!      if (nmod_ifn > 0 ) &
+!        call Budget_store_add( tbudgets(NBUDGET_SV1 - 1 + nsv_lima_ifn_nucl), 'HIND', &
+!                               z_ci_hind(:, :, :) * prhodj(:, :, :) / ptstep )
+!    end if
+!
+!    if ( lbudget_th ) call Budget_store_add( tbudgets(NBUDGET_TH), 'HINC',  z_th_hinc(:, :, :) * prhodj(:, :, :) / ptstep )
+!    if ( lbudget_rc ) call Budget_store_add( tbudgets(NBUDGET_RC), 'HINC',  z_rc_hinc(:, :, :) * prhodj(:, :, :) / ptstep )
+!    if ( lbudget_ri ) call Budget_store_add( tbudgets(NBUDGET_RI), 'HINC', -z_rc_hinc(:, :, :) * prhodj(:, :, :) / ptstep )
+!    if ( lbudget_sv ) then
+!      call Budget_store_add( tbudgets(NBUDGET_SV1 - 1 + nsv_lima_nc), 'HINC',  z_cc_hinc(:, :, :) * prhodj(:, :, :) / ptstep )
+!      call Budget_store_add( tbudgets(NBUDGET_SV1 - 1 + nsv_lima_ni), 'HINC', -z_cc_hinc(:, :, :) * prhodj(:, :, :) / ptstep )
+!      if (nmod_ifn > 0 ) &
+!        call Budget_store_add( tbudgets(NBUDGET_SV1 - 1 + nsv_lima_ifn_nucl), 'HINC', &
+!                               -z_cc_hinc(:, :, :) * prhodj(:, :, :) / ptstep )
+!    end if
+!  end if
+END IF
+!
+!-------------------------------------------------------------------------------
+!
+IF ( LCOLD .AND. LNUCL .AND. LHHONI .AND. NMOD_CCN >= 1 .AND. NMOM_I.GE.2) THEN
+  if ( lbu_enable ) then
+    if ( lbudget_th ) call Budget_store_init( tbudgets(NBUDGET_TH), 'HONH', PTHT(:, :, :) * prhodj(:, :, :) / ptstep )
+    if ( lbudget_rv ) call Budget_store_init( tbudgets(NBUDGET_RV), 'HONH', PRVT(:, :, :) * prhodj(:, :, :) / ptstep )
+    if ( lbudget_ri ) call Budget_store_init( tbudgets(NBUDGET_RI), 'HONH', PRIT(:, :, :) * prhodj(:, :, :) / ptstep )
+    if ( lbudget_sv ) then
+      call Budget_store_init( tbudgets(NBUDGET_SV1 - 1 + nsv_lima_ni), 'HONH', PCIT(:, :, :) * prhodj(:, :, :) / ptstep )
+      do jl = 1, nmod_ccn
+        idx = NBUDGET_SV1 - 1 + nsv_lima_ccn_free - 1 + jl
+        call Budget_store_init( tbudgets(idx), 'HONH', PNFT(:, :, :, jl) * prhodj(:, :, :) / ptstep )
+      end do
+      call Budget_store_init( tbudgets(NBUDGET_SV1 - 1 + nsv_lima_hom_haze), 'HONH', PNHT(:, :, :) * prhodj(:, :, :) / ptstep )
+    end if
+  end if
+
+  CALL LIMA_CCN_HOM_FREEZING (PRHODREF, PEXNREF, PPABST, PW_NU,          &
+                               PTHT, PRVT, PRCT, PRRT, PRIT, PRST, PRGT, &
+                               PCCT, PCRT, PCIT, PNFT, PNHT,             &
+                               PICEFR                                    )
+  WHERE(PICEFR(:,:,:)<1.E-10 .AND. PRIT(:,:,:)>XRTMIN(4) .AND. PCIT(:,:,:)>XCTMIN(4)) PICEFR(:,:,:)=1.
+!
+  if ( lbu_enable ) then
+    if ( lbudget_th ) call Budget_store_end( tbudgets(NBUDGET_TH), 'HONH', PTHT(:, :, :) * prhodj(:, :, :) / ptstep )
+    if ( lbudget_rv ) call Budget_store_end( tbudgets(NBUDGET_RV), 'HONH', PRVT(:, :, :) * prhodj(:, :, :) / ptstep )
+    if ( lbudget_ri ) call Budget_store_end( tbudgets(NBUDGET_RI), 'HONH', PRIT(:, :, :) * prhodj(:, :, :) / ptstep )
+    if ( lbudget_sv ) then
+      call Budget_store_end( tbudgets(NBUDGET_SV1 - 1 + nsv_lima_ni), 'HONH', PCIT(:, :, :) * prhodj(:, :, :) / ptstep )
+      do jl = 1, nmod_ccn
+        idx = NBUDGET_SV1 - 1 + nsv_lima_ccn_free - 1 + jl
+        call Budget_store_end( tbudgets(idx), 'HONH', PNFT(:, :, :, jl) * prhodj(:, :, :) / ptstep )
+      end do
+      call Budget_store_end( tbudgets(NBUDGET_SV1 - 1 + nsv_lima_hom_haze), 'HONH', PNHT(:, :, :) * prhodj(:, :, :) / ptstep )
+    end if
+  end if
+ENDIF
+!
+!-------------------------------------------------------------------------------
+!
+END SUBROUTINE LIMA_NUCLEATION_PROCS
diff --git a/src/PHYEX/micro/lima_phillips.f90 b/src/PHYEX/micro/lima_phillips.f90
index 2374f6725e657d915e3dce6501dab6ff527b0025..a2fb7d4ed358b40b14e2f32f95a528cf1a346fb3 100644
--- a/src/PHYEX/micro/lima_phillips.f90
+++ b/src/PHYEX/micro/lima_phillips.f90
@@ -7,6 +7,7 @@
        MODULE MODI_LIMA_PHILLIPS
 !      #########################
 !
+IMPLICIT NONE
 INTERFACE
       SUBROUTINE LIMA_PHILLIPS (CST, OHHONI, PTSTEP, KMI,                 &
                                 PZZ, PRHODJ, PRHODREF, PEXNREF, PPABST,   &
@@ -16,6 +17,7 @@ INTERFACE
                                 PNAS, PIFS, PINS, PNIS   )
 !
 USE MODD_CST,            ONLY: CST_t
+IMPLICIT NONE
 TYPE(CST_t),              INTENT(IN)    :: CST
 !
 LOGICAL,                  INTENT(IN)    :: OHHONI  ! enable haze freezing
diff --git a/src/PHYEX/micro/lima_precip_scavenging.f90 b/src/PHYEX/micro/lima_precip_scavenging.f90
index ef8e03cf87cab141c05eeff43dd1aa52a02206bd..78d415912605c585c35ffe75c47985db47629aa2 100644
--- a/src/PHYEX/micro/lima_precip_scavenging.f90
+++ b/src/PHYEX/micro/lima_precip_scavenging.f90
@@ -5,7 +5,7 @@
 !-----------------------------------------------------------------
 !########################################################################
    SUBROUTINE LIMA_PRECIP_SCAVENGING (D, CST, BUCONF, TBUDGETS, KBUDGETS, &
-                                      HCLOUD, KLUOUT, KTCOUNT, PTSTEP,    &
+                                      HCLOUD, CDCONF, KLUOUT, KTCOUNT, PTSTEP,    &
                                       PRRT, PRHODREF, PRHODJ, PZZ,        &
                                       PPABST, PTHT, PSVT, PRSVS, PINPAP )
 !########################################################################x
@@ -86,7 +86,7 @@ USE MODD_PARAM_LIMA,      ONLY: NMOD_IFN, NSPECIE, XFRAC,
                                 XMDIAM_IFN, XSIGMA_IFN, XRHO_IFN,                 &
                                 NMOD_CCN, XR_MEAN_CCN, XLOGSIG_CCN, XRHO_CCN,     &
                                 XALPHAR, XNUR,                                    &
-                                LAERO_MASS, NDIAMR, NDIAMP, XT0SCAV, XTREF, XNDO, &
+                                LAERO_MASS, NDIAMR, NDIAMP, XT0SCAV, XTREF,       &
                                 XMUA0, XT_SUTH_A, XMFPA0, XVISCW, XRHO00,         &
                                 XRTMIN, XCTMIN
 USE MODD_PARAM_LIMA_WARM, ONLY: XCR, XDR
@@ -108,6 +108,7 @@ TYPE(TBUDGETDATA), DIMENSION(KBUDGETS), INTENT(INOUT) :: TBUDGETS
 INTEGER,                  INTENT(IN)    :: KBUDGETS
 !
 CHARACTER(LEN=4),       INTENT(IN)    :: HCLOUD   ! cloud paramerization
+CHARACTER(LEN=5),       INTENT(IN)    :: CDCONF   ! CCONF from MODD_CONF
 INTEGER,                INTENT(IN)    :: KLUOUT   ! unit for output listing
 INTEGER,                INTENT(IN)    :: KTCOUNT  ! iteration count
 REAL,                   INTENT(IN)    :: PTSTEP   ! Double timestep except 
@@ -135,7 +136,7 @@ INTEGER :: IKB           !
 INTEGER :: IKE           !
 !
 INTEGER :: JSV               ! CCN or IFN mode 
-INTEGER :: J1, J2, IJ, JMOD
+INTEGER :: J1, J2, JMOD
 !
 LOGICAL, DIMENSION(SIZE(PRHODREF,1),SIZE(PRHODREF,2),SIZE(PRHODREF,3)) &
                                  :: GRAIN,  &! Test where rain is present
@@ -148,7 +149,6 @@ REAL                     :: ZDENS_RATIO, & !density ratio
                             ZNUM,        & !PNU-1.               
                             ZSHAPE_FACTOR
 !
-REAL,    DIMENSION(SIZE(PZZ,1),SIZE(PZZ,2),SIZE(PZZ,3))  :: ZW     ! work array
 REAL,    DIMENSION(SIZE(PZZ,1),SIZE(PZZ,2),SIZE(PZZ,3))  :: PCRT   ! cloud droplet conc.
 !
 REAL, DIMENSION(:), ALLOCATABLE :: ZLAMBDAR,      &  !slope parameter of the 
@@ -189,7 +189,6 @@ REAL, DIMENSION(:,:,:), ALLOCATABLE :: ZCOL_EF,     &! Collision efficiency
                                        ZSIZE_RATIO, &! Size Ratio
                                        ZST           ! Stokes number
 !
-REAL, DIMENSION(SIZE(PRRT,1),SIZE(PRRT,2),SIZE(PRRT,3)) :: ZRRS          
 !
 REAL, DIMENSION(SIZE(PRHODREF,1),SIZE(PRHODREF,2),SIZE(PRHODREF,3)) &
                                     :: PMEAN_SCAV_COEF, & !Mean Scavenging 
@@ -500,7 +499,7 @@ DO JSV = 1, NMOD_CCN+NMOD_IFN
          IF (LAERO_MASS)THEN
             PTOT_MASS_RATE(:,:,:) = PTOT_MASS_RATE(:,:,:) +                         &
                  UNPACK(ZTOT_MASS_RATE(:), MASK=GSCAV(:,:,:), FIELD=0.0)
-            CALL SCAV_MASS_SEDIMENTATION( HCLOUD, PTSTEP, KTCOUNT, PZZ, PRHODJ,     &
+            CALL SCAV_MASS_SEDIMENTATION( HCLOUD, CDCONF, PTSTEP, KTCOUNT, PZZ, PRHODJ,     &
                                       PRHODREF, PRRT, PSVT(:,:,:,ISV_LIMA_SCAVMASS),&
                                       PRSVS(:,:,:,ISV_LIMA_SCAVMASS), PINPAP        )
             PRSVS(:,:,:,ISV_LIMA_SCAVMASS)=PRSVS(:,:,:,ISV_LIMA_SCAVMASS) +         &
@@ -576,7 +575,7 @@ CONTAINS
 !
 !------------------------------------------------------------------------------
 !     ##########################################################################
-      SUBROUTINE SCAV_MASS_SEDIMENTATION( HCLOUD, PTSTEP, KTCOUNT, PZZ, PRHODJ,&
+      SUBROUTINE SCAV_MASS_SEDIMENTATION( HCLOUD, CDCONF, PTSTEP, KTCOUNT, PZZ, PRHODJ,&
                                 PRHODREF, PRAIN, PSVT_MASS, PRSVS_MASS, PINPAP )
 !     ##########################################################################
 !
@@ -599,8 +598,6 @@ CONTAINS
 !!      Module MODD_PARAMETERS
 !!          JPHEXT       : Horizontal external points number
 !!          JPVEXT       : Vertical external points number
-!!      Module MODD_CONF :
-!!          CCONF configuration of the model for the first time step
 !!
 !!    REFERENCE
 !!    ---------
@@ -620,7 +617,6 @@ CONTAINS
 !              ------------
 !
 USE MODD_PARAMETERS
-USE MODD_CONF
 !
 USE MODD_PARAM_LIMA,      ONLY : XCEXVT, XRTMIN
 USE MODD_PARAM_LIMA_WARM, ONLY : XBR, XDR, XFSEDRR
@@ -631,6 +627,7 @@ IMPLICIT NONE
 !
 !
 CHARACTER (LEN=4),        INTENT(IN)    :: HCLOUD  ! Cloud parameterization
+CHARACTER(LEN=5),         INTENT(IN)    :: CDCONF
 REAL,                     INTENT(IN)    :: PTSTEP  ! Time step  
 INTEGER,                  INTENT(IN)    :: KTCOUNT ! Current time step number
 !
@@ -645,7 +642,7 @@ REAL, DIMENSION(:,:),     INTENT(INOUT) :: PINPAP
 !
 !*       0.2   Declarations of local variables :
 !
-INTEGER :: JJ, JK, JN, JRR                ! Loop indexes 
+INTEGER :: JK, JN                         ! Loop indexes 
 INTEGER :: IIB, IIE, IJB, IJE, IKB, IKE   ! Physical domain
 !
 REAL    :: ZTSPLITR      ! Small time step for rain sedimentation
@@ -712,7 +709,7 @@ END IF firstcall
 !
 !*       2.2    time splitting loop initialization        
 !
-IF( (KTCOUNT==1) .AND. (CCONF=='START') ) THEN
+IF( (KTCOUNT==1) .AND. (CDCONF=='START') ) THEN
   ZTSPLITR = PTSTEP / REAL(ISPLITR)       ! Small time step
   ZTSTEP   = PTSTEP                        ! Large time step
   ELSE
diff --git a/src/PHYEX/micro/lima_warm.f90 b/src/PHYEX/micro/lima_warm.f90
index 4f954463b5071171871a778652241b6c1bc44738..e4f1db134a5f1b3f1dad42bca2cf83a7eb048d88 100644
--- a/src/PHYEX/micro/lima_warm.f90
+++ b/src/PHYEX/micro/lima_warm.f90
@@ -7,6 +7,7 @@
        MODULE MODI_LIMA_WARM
 !      #####################
 !
+IMPLICIT NONE
 INTERFACE
       SUBROUTINE LIMA_WARM (OACTIT, OSEDC, ORAIN, KSPLITR, PTSTEP, KMI,   &
                             TPFILE, KRR, PZZ, PRHODJ,                     &
@@ -18,6 +19,7 @@ INTERFACE
 !
 USE MODD_IO,   ONLY: TFILEDATA
 USE MODD_NSV, only: NSV_LIMA_BEG
+IMPLICIT NONE
 !
 LOGICAL,                  INTENT(IN)    :: OACTIT     ! Switch to activate the
                                                       ! activation by radiative
diff --git a/src/PHYEX/micro/lima_warm_coal.f90 b/src/PHYEX/micro/lima_warm_coal.f90
index 01d0bd60c6ecccca42efa09722ba36e0fda446f0..bac9042e65e5d46f2e3109f54f59b833e1d59d7e 100644
--- a/src/PHYEX/micro/lima_warm_coal.f90
+++ b/src/PHYEX/micro/lima_warm_coal.f90
@@ -7,12 +7,14 @@
        MODULE MODI_LIMA_WARM_COAL
 !      ##########################
 !
+IMPLICIT NONE
 INTERFACE
       SUBROUTINE LIMA_WARM_COAL (PTSTEP, KMI,                                &
                                  PRHODREF, ZWLBDC3, ZWLBDC, ZWLBDR3, ZWLBDR, &
                                  PRCT, PRRT, PCCT, PCRT,                     &
                                  PRCS, PRRS, PCCS, PCRS,                     &
                                  PRHODJ                              )
+IMPLICIT NONE
 !
 REAL,                     INTENT(IN)    :: PTSTEP     ! Double Time step
                                                       ! (single if cold start)
diff --git a/src/PHYEX/micro/lima_warm_evap.f90 b/src/PHYEX/micro/lima_warm_evap.f90
index ac7ff4da9c14532290969bb9d6006e0fc39b3840..7d374b464bc55aa26354582183ed144ebcc6bcd2 100644
--- a/src/PHYEX/micro/lima_warm_evap.f90
+++ b/src/PHYEX/micro/lima_warm_evap.f90
@@ -7,6 +7,7 @@
        MODULE MODI_LIMA_WARM_EVAP
 !      ##########################
 !
+IMPLICIT NONE
 INTERFACE
       SUBROUTINE LIMA_WARM_EVAP (PTSTEP, KMI,                                &
                                  PRHODREF, PEXNREF, PPABST, ZT,              &
@@ -14,6 +15,7 @@ INTERFACE
                                  PRVT, PRCT, PRRT, PCRT,                     &
                                  PRVS, PRCS, PRRS, PCCS, PCRS, PTHS,         &
                                  PEVAP3D)
+IMPLICIT NONE
 !
 REAL,                     INTENT(IN)    :: PTSTEP     ! Double Time step
                                                       ! (single if cold start)
diff --git a/src/PHYEX/micro/lima_warm_nucl.f90 b/src/PHYEX/micro/lima_warm_nucl.f90
index 8591b848e0ade496014c0816624fb589b36b7804..2b4ce331ef47a3ea0ac34d839a5c021d9a5e7412 100644
--- a/src/PHYEX/micro/lima_warm_nucl.f90
+++ b/src/PHYEX/micro/lima_warm_nucl.f90
@@ -7,6 +7,7 @@
        MODULE MODI_LIMA_WARM_NUCL
 !      ##########################
 !
+IMPLICIT NONE
 INTERFACE
       SUBROUTINE LIMA_WARM_NUCL( OACTIT, PTSTEP, KMI, TPFILE,               &
                                  PRHODREF, PEXNREF, PPABST, PT, PTM, PW_NU, &
@@ -14,6 +15,7 @@ INTERFACE
                                  PTHS, PRVS, PRCS, PCCS, PNFS, PNAS         )
 !
 USE MODD_IO,   ONLY: TFILEDATA
+IMPLICIT NONE
 !
 LOGICAL,                  INTENT(IN)    :: OACTIT     ! Switch to activate the
                                                       ! activation by radiative
diff --git a/src/PHYEX/micro/lima_warm_sedimentation.f90 b/src/PHYEX/micro/lima_warm_sedimentation.f90
index f74899b381c08493f242eef9f5685cc514a95667..41e3c1ff18ab3af66e02a354f966eced7064c4a8 100644
--- a/src/PHYEX/micro/lima_warm_sedimentation.f90
+++ b/src/PHYEX/micro/lima_warm_sedimentation.f90
@@ -7,6 +7,7 @@
        MODULE MODI_LIMA_WARM_SEDIMENTATION
 !      ###################################
 !
+IMPLICIT NONE
 INTERFACE
       SUBROUTINE LIMA_WARM_SEDIMENTATION (OSEDC, KSPLITR, PTSTEP, KMI,  &
                                           PZZ, PRHODREF, PPABST, ZT,    &
@@ -14,6 +15,7 @@ INTERFACE
                                           PRCT, PRRT, PCCT, PCRT,       &
                                           PRCS, PRRS, PCCS, PCRS,       &
                                           PINPRC, PINPRR, PINPRR3D )
+IMPLICIT NONE
 !
 LOGICAL,                  INTENT(IN)    :: OSEDC      ! switch to activate the 
                                                       ! cloud droplet sedimentation
diff --git a/src/PHYEX/micro/modd_cloudparn.f90 b/src/PHYEX/micro/modd_cloudparn.f90
new file mode 100644
index 0000000000000000000000000000000000000000..fd8f2297149c9eab2daf277cac9f4bf9baecfefa
--- /dev/null
+++ b/src/PHYEX/micro/modd_cloudparn.f90
@@ -0,0 +1,79 @@
+!MNH_LIC Copyright 1994-2014 CNRS, Meteo-France and Universite Paul Sabatier
+!MNH_LIC This is part of the Meso-NH software governed by the CeCILL-C licence
+!MNH_LIC version 1. See LICENSE, CeCILL-C_V1-en.txt and CeCILL-C_V1-fr.txt  
+!MNH_LIC for details. version 1.
+!-----------------------------------------------------------------
+!--------------- special set of characters for RCS information
+!-----------------------------------------------------------------
+! $Source$ $Revision$
+! MASDEV4_7 modd 2006/05/18 13:07:25
+!-----------------------------------------------------------------
+!     ######################
+      MODULE MODD_CLOUDPAR_n
+!     ######################
+!
+!!****  *MODD_CLOUDPAR$n* - declaration of the model-n dependant Microphysics 
+!!   constants 
+!!
+!!    PURPOSE
+!!    -------
+!       The purpose of this declarative module is to declare  the 
+!     model-n dependant Microhysics constants.    
+!
+!!
+!!**  IMPLICIT ARGUMENTS
+!!    ------------------
+!!      None 
+!!
+!!    REFERENCE
+!!    ---------
+!!      Book2 of documentation of Meso-NH (MODD_CLOUDPARn)
+!!          
+!!    AUTHOR
+!!    ------
+!!	E. Richard   *Laboratoire d'Aerologie*
+!!
+!!    MODIFICATIONS
+!!    -------------
+!!      Original    20/12/95                      
+!!       J.-P. Pinty   29/11/02 add C3R5, ICE2, ICE4, ELEC
+!!
+!-------------------------------------------------------------------------------
+!
+!*       0.   DECLARATIONS
+!             ------------
+!
+USE MODD_PARAMETERS, ONLY: JPMODELMAX
+IMPLICIT NONE
+
+TYPE CLOUDPAR_t
+!
+  INTEGER :: NSPLITR      !< Number of required small time step integration
+                          !! for rain sedimentation computation
+  INTEGER :: NSPLITG      !< Number of required small time step integration
+                          !! for ice hydrometeor sedimentation computation
+!
+!
+END TYPE CLOUDPAR_t
+
+TYPE(CLOUDPAR_t), DIMENSION(JPMODELMAX), TARGET, SAVE :: CLOUDPAR_MODEL
+TYPE(CLOUDPAR_t), POINTER, SAVE :: CLOUDPARN => NULL()
+INTEGER, POINTER :: NSPLITR=>NULL()
+INTEGER, POINTER :: NSPLITG=>NULL()
+
+CONTAINS
+
+SUBROUTINE CLOUDPAR_GOTO_MODEL(KFROM, KTO)
+INTEGER, INTENT(IN) :: KFROM, KTO
+!
+CLOUDPARN => CLOUDPAR_MODEL(KTO)
+!
+! Save current state for allocated arrays
+!
+! Current model is set to model KTO
+NSPLITR=>CLOUDPAR_MODEL(KTO)%NSPLITR
+NSPLITG=>CLOUDPAR_MODEL(KTO)%NSPLITG
+
+END SUBROUTINE CLOUDPAR_GOTO_MODEL
+
+END MODULE MODD_CLOUDPAR_n
diff --git a/src/PHYEX/micro/modd_neb.f90 b/src/PHYEX/micro/modd_neb.f90
deleted file mode 100644
index ebca8d22354bb6009ad39ce5a5ba7abe5440485b..0000000000000000000000000000000000000000
--- a/src/PHYEX/micro/modd_neb.f90
+++ /dev/null
@@ -1,56 +0,0 @@
-!MNH_LIC Copyright 1994-2014 CNRS, Meteo-France and Universite Paul Sabatier
-!MNH_LIC This is part of the Meso-NH software governed by the CeCILL-C licence
-!MNH_LIC version 1. See LICENSE, CeCILL-C_V1-en.txt and CeCILL-C_V1-fr.txt  
-!MNH_LIC for details. version 1.
-!     ######spl
-      MODULE MODD_NEB
-!     #############################
-!
-!!****  *MODD_NEB* - Declaration of nebulosity constants
-!!
-!!    PURPOSE
-!!    -------
-!!      The purpose of this declarative module is to declare some
-!!      constants for nebulosity calculation
-!
-!!
-!!**  IMPLICIT ARGUMENTS
-!!    ------------------
-!!      None
-!!
-!!    REFERENCE
-!!    ---------
-!!
-!!
-!!    AUTHOR
-!!    ------
-!!       S. Riette (Meteo France)
-!!
-!!    MODIFICATIONS
-!!    -------------
-!!      Original    24 Aug 2011
-!-------------------------------------------------------------------------------
-!
-!*       0.   DECLARATIONS
-!             ------------
-!
-IMPLICIT NONE
-!
-TYPE NEB_t
-  REAL          :: XTMINMIX   ! minimum temperature of mixed phase
-  REAL          :: XTMAXMIX   ! maximum temperature of mixed phase
-END TYPE NEB_t
-
-TYPE(NEB_t), SAVE, TARGET :: NEB
-
-REAL, POINTER :: XTMINMIX=>NULL(), &
-                 XTMAXMIX=>NULL()
-!
-CONTAINS
-SUBROUTINE NEB_ASSOCIATE()
-  IMPLICIT NONE
-  XTMINMIX => NEB%XTMINMIX
-  XTMAXMIX => NEB%XTMAXMIX
-END SUBROUTINE NEB_ASSOCIATE
-!
-END MODULE MODD_NEB
diff --git a/src/PHYEX/micro/modd_nebn.f90 b/src/PHYEX/micro/modd_nebn.f90
new file mode 100644
index 0000000000000000000000000000000000000000..dce8f1d9aab9b16e9728812d8fbd01d52c26e5a3
--- /dev/null
+++ b/src/PHYEX/micro/modd_nebn.f90
@@ -0,0 +1,223 @@
+!MNH_LIC Copyright 1994-2014 CNRS, Meteo-France and Universite Paul Sabatier
+!MNH_LIC This is part of the Meso-NH software governed by the CeCILL-C licence
+!MNH_LIC version 1. See LICENSE, CeCILL-C_V1-en.txt and CeCILL-C_V1-fr.txt  
+!MNH_LIC for details. version 1.
+!     ######spl
+      MODULE MODD_NEB_n
+!     #############################
+!> @file
+!!****  *MODD_NEB_n* - Declaration of nebulosity constants
+!!
+!!    PURPOSE
+!!    -------
+!!      The purpose of this declarative module is to declare some
+!!      constants for nebulosity calculation
+!
+!!
+!!    IMPLICIT ARGUMENTS
+!!    ------------------
+!!      None
+!!
+!!    REFERENCE
+!!    ---------
+!!
+!!
+!!    AUTHOR
+!!    ------
+!!       S. Riette (Meteo France)
+!!
+!!    MODIFICATIONS
+!!    -------------
+!!      Original    24 Aug 2011
+!-------------------------------------------------------------------------------
+!
+!*       0.   DECLARATIONS
+!             ------------
+!
+USE MODD_PARAMETERS, ONLY: JPMODELMAX
+IMPLICIT NONE
+!
+TYPE NEB_t
+  REAL          :: XTMINMIX   !< minimum temperature of mixed phase
+  REAL          :: XTMAXMIX   !< maximum temperature of mixed phase
+  LOGICAL       :: LHGT_QS    !< Switch for height dependent VQSIGSAT
+  CHARACTER(LEN=1) :: CFRAC_ICE_ADJUST     !< ice fraction for adjustments
+  CHARACTER(LEN=1) :: CFRAC_ICE_SHALLOW_MF !< ice fraction for shallow_mf
+  REAL               :: VSIGQSAT      !< coeff applied to qsat variance contribution
+  CHARACTER(LEN=80)  :: CCONDENS      !< subrgrid condensation PDF
+  CHARACTER(LEN=4)   :: CLAMBDA3      !< lambda3 choice for subgrid cloud scheme
+  LOGICAL            :: LSTATNW       !< updated full statistical cloud scheme
+  LOGICAL            :: LSIGMAS       !< Switch for using Sigma_s from turbulence scheme
+  LOGICAL            :: LSUBG_COND    !< Switch for subgrid condensation 
+END TYPE NEB_t
+
+TYPE(NEB_t), DIMENSION(JPMODELMAX), SAVE, TARGET :: NEB_MODEL
+TYPE(NEB_t), POINTER, SAVE :: NEBN => NULL()
+
+REAL, POINTER :: XTMINMIX=>NULL(), &
+                 XTMAXMIX=>NULL()
+LOGICAL, POINTER :: LHGT_QS=>NULL()
+CHARACTER(LEN=1), POINTER :: CFRAC_ICE_ADJUST => NULL()
+CHARACTER(LEN=1), POINTER :: CFRAC_ICE_SHALLOW_MF => NULL()
+REAL, POINTER :: VSIGQSAT=>NULL()
+CHARACTER(LEN=80),POINTER :: CCONDENS=>NULL()
+CHARACTER(LEN=4),POINTER :: CLAMBDA3=>NULL()
+LOGICAL, POINTER :: LSTATNW=>NULL()
+LOGICAL, POINTER :: LSIGMAS=>NULL()
+LOGICAL, POINTER :: LSUBG_COND=>NULL()
+!
+NAMELIST/NAM_NEBn/XTMINMIX, XTMAXMIX, LHGT_QS, CFRAC_ICE_ADJUST, CFRAC_ICE_SHALLOW_MF, &
+                 &VSIGQSAT, CCONDENS, CLAMBDA3, LSTATNW, LSIGMAS, LSUBG_COND
+!
+!-------------------------------------------------------------------------------
+!
+CONTAINS
+SUBROUTINE NEB_GOTO_MODEL(KFROM, KTO)
+!! This subroutine associate all the pointers to the right component of
+!! the right strucuture. A value can be accessed through the structure NEBN
+!! or through the strucuture NEB_MODEL(KTO) or directly through these pointers.
+IMPLICIT NONE
+INTEGER, INTENT(IN) :: KFROM, KTO
+!
+IF(.NOT. ASSOCIATED(NEBN, NEB_MODEL(KTO))) THEN
+  !
+  NEBN => NEB_MODEL(KTO)
+  !
+  XTMINMIX => NEBN%XTMINMIX
+  XTMAXMIX => NEBN%XTMAXMIX
+  LHGT_QS => NEBN%LHGT_QS
+  CFRAC_ICE_ADJUST => NEBN%CFRAC_ICE_ADJUST
+  CFRAC_ICE_SHALLOW_MF => NEBN%CFRAC_ICE_SHALLOW_MF
+  VSIGQSAT => NEBN%VSIGQSAT
+  CCONDENS => NEBN%CCONDENS
+  CLAMBDA3 => NEBN%CLAMBDA3
+  LSTATNW => NEBN%LSTATNW
+  LSIGMAS => NEBN%LSIGMAS
+  LSUBG_COND => NEBN%LSUBG_COND
+  !
+ENDIF
+END SUBROUTINE NEB_GOTO_MODEL
+!
+SUBROUTINE NEBN_INIT(HPROGRAM, KUNITNML, LDNEEDNAM, KLUOUT, &
+                    &LDDEFAULTVAL, LDREADNAM, LDCHECK, KPRINT)
+!!*** *NEBN_INIT* - Code needed to initialize the MODD_NEB_n module
+!!
+!!*   PURPOSE
+!!    -------
+!!    Sets the default values, reads the namelist, performs the checks and prints
+!!
+!!*   METHOD
+!!    ------
+!!    0. Declarations
+!!       1. Declaration of arguments
+!!       2. Declaration of local variables
+!!    1. Default values
+!!    2. Namelist
+!!    3. Checks
+!!    4. Prints
+!!
+!!    AUTHOR
+!!    ------
+!!    S. Riette
+!!
+!!    MODIFICATIONS
+!!    -------------
+!!      Original    Mar 2023
+!-------------------------------------------------------------------------------
+!
+!*      0. DECLARATIONS
+!       ---------------
+!
+USE MODE_POSNAM_PHY, ONLY: POSNAM_PHY
+USE MODE_CHECK_NAM_VAL, ONLY: CHECK_NAM_VAL_CHAR
+!
+IMPLICIT NONE
+!
+!* 0.1. Declaration of arguments
+!       ------------------------
+!
+CHARACTER(LEN=6),  INTENT(IN) :: HPROGRAM     !< Name of the calling program
+INTEGER,           INTENT(IN) :: KUNITNML     !< Logical unit to access the namelist
+LOGICAL,           INTENT(IN) :: LDNEEDNAM    !< True to abort if namelist is absent
+INTEGER,           INTENT(IN) :: KLUOUT       !< Logical unit for outputs
+LOGICAL, OPTIONAL, INTENT(IN) :: LDDEFAULTVAL !< Must we initialize variables with default values (defaults to .TRUE.)
+LOGICAL, OPTIONAL, INTENT(IN) :: LDREADNAM    !< Must we read the namelist (defaults to .TRUE.)
+LOGICAL, OPTIONAL, INTENT(IN) :: LDCHECK      !< Must we perform some checks on values (defaults to .TRUE.)
+INTEGER, OPTIONAL, INTENT(IN) :: KPRINT       !< Print level (defaults to 0): 0 for no print, 1 to safely print namelist,
+                                              !! 2 to print informative messages
+!
+!* 0.2 Declaration of local variables
+!      ------------------------------
+!
+LOGICAL :: LLDEFAULTVAL, LLREADNAM, LLCHECK, LLFOUND
+INTEGER :: IPRINT
+
+LLDEFAULTVAL=.TRUE.
+LLREADNAM=.TRUE.
+LLCHECK=.TRUE.
+IPRINT=0
+IF(PRESENT(LDDEFAULTVAL)) LLDEFAULTVAL=LDDEFAULTVAL
+IF(PRESENT(LDREADNAM   )) LLREADNAM   =LDREADNAM
+IF(PRESENT(LDCHECK     )) LLCHECK     =LDCHECK
+IF(PRESENT(KPRINT      )) IPRINT      =KPRINT
+!
+!*      1. DEFAULT VALUES
+!       -----------------
+!
+IF(LLDEFAULTVAL) THEN
+  !NOTES ON GENERAL DEFAULTS AND MODEL-SPECIFIC DEFAULTS :
+  !- General default values *MUST* remain unchanged.
+  !- To change the default value for a given application,
+  !  an "IF(HPROGRAM=='...')" condition must be used.
+
+  !Freezing between 0 and -20. Other possibilities are 0/-40 or -5/-25
+  XTMAXMIX    = 273.16
+  XTMINMIX    = 253.16
+  LHGT_QS     = .FALSE.
+  CFRAC_ICE_ADJUST='S'
+  CFRAC_ICE_SHALLOW_MF='S'
+  VSIGQSAT  = 0.02
+  CCONDENS='CB02'
+  CLAMBDA3='CB'
+  LSUBG_COND=.FALSE.
+  LSIGMAS   =.TRUE.
+  LSTATNW=.FALSE.
+
+  IF(HPROGRAM=='AROME') THEN
+    CFRAC_ICE_ADJUST='T'
+    CFRAC_ICE_SHALLOW_MF='T'
+    VSIGQSAT=0.
+    LSIGMAS=.FALSE.
+  ELSEIF(HPROGRAM=='LMDZ') THEN
+    LSUBG_COND=.TRUE.
+  ENDIF
+ENDIF
+!
+!*      2. NAMELIST
+!       -----------
+!
+IF(LLREADNAM) THEN
+  CALL POSNAM_PHY(KUNITNML, 'NAM_NEBN', LDNEEDNAM, LLFOUND, KLUOUT)
+  IF(LLFOUND) READ(UNIT=KUNITNML, NML=NAM_NEBn)
+ENDIF
+!
+!*      3. CHECKS
+!       ---------
+!
+IF(LLCHECK) THEN
+  CALL CHECK_NAM_VAL_CHAR(KLUOUT, 'CFRAC_ICE_ADJUST', CFRAC_ICE_ADJUST, 'T', 'O', 'N', 'S')
+  CALL CHECK_NAM_VAL_CHAR(KLUOUT, 'CFRAC_ICE_SHALLOW_MF', CFRAC_ICE_SHALLOW_MF, 'T', 'O', 'N', 'S')
+  CALL CHECK_NAM_VAL_CHAR(KLUOUT, 'CCONDENS', CCONDENS, 'CB02', 'GAUS')
+  CALL CHECK_NAM_VAL_CHAR(KLUOUT, 'CLAMBDA3', CLAMBDA3, 'CB', 'NONE')
+ENDIF
+!
+!*      3. PRINTS
+!       ---------
+!
+IF(IPRINT>=1) THEN
+  WRITE(UNIT=KLUOUT,NML=NAM_NEBn)
+ENDIF
+!
+END SUBROUTINE NEBN_INIT
+!
+END MODULE MODD_NEB_n
diff --git a/src/PHYEX/micro/modd_param_c1r3.f90 b/src/PHYEX/micro/modd_param_c1r3.f90
index 700526c7aefa06b094cbae708a7095f6afb4e90d..cc1e68531da53b478c04ce72ffdfc50a9bbea151 100644
--- a/src/PHYEX/micro/modd_param_c1r3.f90
+++ b/src/PHYEX/micro/modd_param_c1r3.f90
@@ -45,6 +45,7 @@
 !*       0.   DECLARATIONS
 !             ------------
 !
+IMPLICIT NONE
 REAL,SAVE :: XALPHAI,XNUI,            & ! Pristine ice   distribution parameters
 	     XALPHAS,XNUS,            & ! Snow/aggregate distribution parameters
 	     XALPHAG,XNUG               ! Graupel        distribution parameters
diff --git a/src/PHYEX/micro/modd_param_c2r2.f90 b/src/PHYEX/micro/modd_param_c2r2.f90
index 83d7f5d1cce8141fc6afc959356126181e0d2c1d..20f080c031a0494c221ec46b43f882902c6d620e 100644
--- a/src/PHYEX/micro/modd_param_c2r2.f90
+++ b/src/PHYEX/micro/modd_param_c2r2.f90
@@ -50,6 +50,7 @@
 !*       0.   DECLARATIONS
 !             ------------
 !
+IMPLICIT NONE
 REAL,SAVE :: XALPHAR,XNUR,           & ! Raindrop       distribution parameters
           XALPHAC,XNUC              ! Cloud droplet  distribution parameters
 !
diff --git a/src/PHYEX/micro/modd_param_icen.f90 b/src/PHYEX/micro/modd_param_icen.f90
index 8f7ea8f52195660c051d6204d788300fc215c487..9ea39306b764f20e53c5046b9341022d8d150e7b 100644
--- a/src/PHYEX/micro/modd_param_icen.f90
+++ b/src/PHYEX/micro/modd_param_icen.f90
@@ -4,10 +4,10 @@
 !MNH_LIC for details. version 1.
 !-----------------------------------------------------------------
 !     ######spl
-      MODULE MODD_PARAM_ICE
+      MODULE MODD_PARAM_ICE_n
 !     #####################
-!
-!!****  *MODD_PARAM_ICE* - declaration of the control parameters for the
+!> @file
+!!      *MODD_PARAM_ICE_n* - declaration of the control parameters for the
 !!                           mixed phase cloud parameterization
 !!
 !!    PURPOSE
@@ -15,8 +15,7 @@
 !!      The purpose of this declarative module is to define the set of space
 !!    and time control parameters for the microphysics.
 !!
-!!
-!!**  IMPLICIT ARGUMENTS
+!!    IMPLICIT ARGUMENTS
 !!    ------------------
 !!      None
 !!
@@ -30,61 +29,81 @@
 !!
 !!    MODIFICATIONS
 !!    -------------
-!!      Original      14/12/95
-!!      Jan 2015 S. Riette: new ICE3/ICE4 parameters
-!!      01/10/16 (C.Lac)  Add droplet deposition for fog
+!!
+!!    -  Original      14/12/95
+!!    -  Jan 2015 S. Riette: new ICE3/ICE4 parameters
+!!    -  01/10/16 (C.Lac)  Add droplet deposition for fog
 !!
 !-------------------------------------------------------------------------------
 !
 !*       0.   DECLARATIONS
 !             ------------
 !
+USE MODD_PARAMETERS, ONLY: JPMODELMAX
 IMPLICIT NONE
 !
 TYPE PARAM_ICE_t
-LOGICAL :: LWARM       ! When .TRUE. activates the formation of rain by
-                             ! the warm microphysical processes
-LOGICAL :: LSEDIC      ! TRUE to enable the droplet sedimentation
-LOGICAL :: LDEPOSC     ! TRUE to enable cloud droplet deposition
-REAL    :: XVDEPOSC    ! Droplet deposition velocity
-!
-CHARACTER(LEN=4) :: CPRISTINE_ICE ! Pristine ice type PLAT, COLU or BURO
-CHARACTER(LEN=4) :: CSEDIM        ! Sedimentation calculation mode      
-!
-LOGICAL :: LRED       ! To use modified ICE3/ICE4 to reduce time step dependency
-LOGICAL :: LFEEDBACKT ! When .TRUE. feed back on temperature is taken into account
-LOGICAL :: LEVLIMIT   ! When .TRUE. water vapour pressure is limited by saturation
-LOGICAL :: LNULLWETG  ! When .TRUE. graupel wet growth is activated with null rate (to allow water shedding)
-LOGICAL :: LWETGPOST  ! When .TRUE. graupel wet growth is activated with positive temperature (to allow water shedding)
-LOGICAL :: LNULLWETH  ! Same as LNULLWETG but for hail
-LOGICAL :: LWETHPOST  ! Same as LWETGPOST but for hail
-CHARACTER(LEN=4) :: CSNOWRIMING ! OLD or M90 for Murakami 1990 formulation
-REAL :: XFRACM90 ! Fraction used for the Murakami 1990 formulation
-INTEGER :: NMAXITER ! Maximum number of iterations for mixing ratio or time splitting
-REAL :: XMRSTEP ! maximum mixing ratio step for mixing ratio splitting
-LOGICAL :: LCONVHG ! TRUE to allow the conversion from hail to graupel
-LOGICAL :: LCRFLIMIT !True to limit rain contact freezing to possible heat exchange
-!
-REAL :: XTSTEP_TS ! Approximative time step for time-splitting (0 for no time-splitting)
-!
-CHARACTER(LEN=80) :: CSUBG_RC_RR_ACCR ! subgrid rc-rr accretion
-CHARACTER(LEN=80) :: CSUBG_RR_EVAP ! subgrid rr evaporation
-CHARACTER(LEN=80) :: CSUBG_PR_PDF ! pdf for subgrid precipitation
-!
-LOGICAL :: LADJ_BEFORE ! must we perform an adjustment before rain_ice call
-LOGICAL :: LADJ_AFTER ! must we perform an adjustment after rain_ice call
-CHARACTER(LEN=1) :: CFRAC_ICE_ADJUST ! ice fraction for adjustments
-CHARACTER(LEN=1) :: CFRAC_ICE_SHALLOW_MF ! ice fraction for shallow_mf
-LOGICAL :: LSEDIM_AFTER ! sedimentation done before (.FALSE.) or after (.TRUE.) microphysics
-!
-REAL :: XSPLIT_MAXCFL ! Maximum CFL number allowed for SPLIT scheme
-LOGICAL :: LSNOW_T         ! Snow parameterization from Wurtz (2021)
-!
-LOGICAL :: LPACK_INTERP !To pack arrays before computing the different interpolations (kernels and other)
-LOGICAL :: LPACK_MICRO !To pack arrays before computing the process tendencies
+LOGICAL :: LWARM       !< When .TRUE. activates the formation of rain by
+                       !! the warm microphysical processes
+LOGICAL :: LSEDIC      !< TRUE to enable the droplet sedimentation
+LOGICAL :: LDEPOSC     !< TRUE to enable cloud droplet deposition
+REAL    :: XVDEPOSC    !< Droplet deposition velocity
+!
+CHARACTER(LEN=4) :: CPRISTINE_ICE !< Pristine ice type PLAT, COLU or BURO
+CHARACTER(LEN=4) :: CSEDIM        !< Sedimentation calculation mode      
+!
+LOGICAL :: LRED       !< To use modified ICE3/ICE4 to reduce time step dependency
+LOGICAL :: LFEEDBACKT !< When .TRUE. feed back on temperature is taken into account
+LOGICAL :: LEVLIMIT   !< When .TRUE. water vapour pressure is limited by saturation
+LOGICAL :: LNULLWETG  !< When .TRUE. graupel wet growth is activated with null rate (to allow water shedding)
+LOGICAL :: LWETGPOST  !< When .TRUE. graupel wet growth is activated with positive temperature (to allow water shedding)
+LOGICAL :: LNULLWETH  !< Same as LNULLWETG but for hail
+LOGICAL :: LWETHPOST  !< Same as LWETGPOST but for hail
+CHARACTER(LEN=4) :: CSNOWRIMING !< OLD or M90 for Murakami 1990 formulation
+REAL :: XFRACM90      !< Fraction used for the Murakami 1990 formulation
+INTEGER :: NMAXITER_MICRO   !< Maximum number of iterations for mixing ratio or time splitting
+REAL :: XMRSTEP       !< maximum mixing ratio step for mixing ratio splitting
+LOGICAL :: LCONVHG    !< TRUE to allow the conversion from hail to graupel
+LOGICAL :: LCRFLIMIT  !< True to limit rain contact freezing to possible heat exchange
+!
+REAL :: XTSTEP_TS     !< Approximative time step for time-splitting (0 for no time-splitting)
+!
+CHARACTER(LEN=80) :: CSUBG_RC_RR_ACCR !< subgrid rc-rr accretion
+CHARACTER(LEN=80) :: CSUBG_RR_EVAP    !< subgrid rr evaporation
+CHARACTER(LEN=80) :: CSUBG_PR_PDF     !< pdf for subgrid precipitation
+CHARACTER(LEN=4)  :: CSUBG_AUCV_RC    !< type of subgrid rc->rr autoconv. method
+CHARACTER(LEN=80) :: CSUBG_AUCV_RI    !< type of subgrid ri->rs autoconv. method
+CHARACTER(LEN=80) :: CSUBG_MF_PDF     !< PDF to use for MF cloud autoconversions
+!
+LOGICAL :: LADJ_BEFORE !< must we perform an adjustment before rain_ice call
+LOGICAL :: LADJ_AFTER  !< must we perform an adjustment after rain_ice call
+LOGICAL :: LSEDIM_AFTER !< sedimentation done before (.FALSE.) or after (.TRUE.) microphysics
+!
+REAL :: XSPLIT_MAXCFL   !< Maximum CFL number allowed for SPLIT scheme
+LOGICAL :: LSNOW_T      !< Snow parameterization from Wurtz (2021)
+!
+LOGICAL :: LPACK_INTERP !< To pack arrays before computing the different interpolations (kernels and other)
+LOGICAL :: LPACK_MICRO  !< To pack arrays before computing the process tendencies
+!
+INTEGER :: NPROMICRO    !< Size of cache-blocking bloc (0 to deactivate)
+!
+LOGICAL :: LCRIAUTI     !< .T. to compute XACRIAUTI and XBCRIAUTI (from XCRIAUTI and XT0CRIAUTI);
+                        !! .F. to compute XT0CRIAUTI (from XCRIAUTI and XBCRIAUTI)
+REAL :: XCRIAUTI_NAM    !< Minimum value for the ice->snow autoconversion threshold
+REAL :: XT0CRIAUTI_NAM  !< Threshold temperature (???) for the ice->snow autoconversion threshold
+REAL :: XBCRIAUTI_NAM   !< B barameter for the ice->snow autoconversion 10**(aT+b) law
+REAL :: XACRIAUTI_NAM   !< A barameter for the ice->snow autoconversion 10**(aT+b) law
+REAL :: XCRIAUTC_NAM    !< Threshold for liquid cloud -> rain autoconversion (kg/m**3)
+REAL :: XRDEPSRED_NAM   !< Tuning factor of sublimation of snow
+REAL :: XRDEPGRED_NAM   !< Tuning factor of sublimation of graupel
+!
+LOGICAL :: LOCND2       !< Logical switch to separate liquid and ice
+REAL, DIMENSION(40) :: XFRMIN_NAM
+!
 END TYPE PARAM_ICE_t
 !
-TYPE(PARAM_ICE_t), SAVE, TARGET :: PARAM_ICE
+TYPE(PARAM_ICE_t), DIMENSION(JPMODELMAX), TARGET, SAVE :: PARAM_ICE_MODEL
+TYPE(PARAM_ICE_t), POINTER, SAVE :: PARAM_ICEN => NULL()
 !
 LOGICAL, POINTER :: LWARM => NULL(), &
                     LSEDIC => NULL(), &
@@ -100,67 +119,322 @@ LOGICAL, POINTER :: LWARM => NULL(), &
                     LCRFLIMIT => NULL(), &
                     LADJ_BEFORE => NULL(), &
                     LADJ_AFTER => NULL(), &
-                    LSEDIM_AFTER => NULL(),&
-                    LSNOW_T => NULL(),&
-                    LPACK_INTERP => NULL(),&
-                    LPACK_MICRO => NULL()
+                    LSEDIM_AFTER => NULL(), &
+                    LSNOW_T => NULL(), &
+                    LPACK_INTERP => NULL(), &
+                    LPACK_MICRO => NULL(), &
+                    LCRIAUTI => NULL(), &
+                    LOCND2 => NULL()
 
 REAL, POINTER :: XVDEPOSC => NULL(), &
                  XFRACM90 => NULL(), &
                  XMRSTEP => NULL(), &
                  XTSTEP_TS => NULL(), &
-                 XSPLIT_MAXCFL => NULL()
+                 XSPLIT_MAXCFL => NULL(), &
+                 XCRIAUTI_NAM => NULL(), &
+                 XT0CRIAUTI_NAM => NULL(), &
+                 XBCRIAUTI_NAM => NULL(), &
+                 XACRIAUTI_NAM => NULL(), &
+                 XCRIAUTC_NAM => NULL(), &
+                 XRDEPSRED_NAM => NULL(), &
+                 XRDEPGRED_NAM => NULL()
+REAL, DIMENSION(:), POINTER :: XFRMIN_NAM => NULL()
 
-INTEGER, POINTER :: NMAXITER => NULL()
+INTEGER, POINTER :: NMAXITER_MICRO => NULL(), &
+                    NPROMICRO => NULL()
 
-CHARACTER(LEN=1), POINTER :: CFRAC_ICE_ADJUST => NULL()
-CHARACTER(LEN=1), POINTER :: CFRAC_ICE_SHALLOW_MF => NULL()
 CHARACTER(LEN=4), POINTER :: CPRISTINE_ICE => NULL()
 CHARACTER(LEN=4), POINTER :: CSEDIM => NULL()
 CHARACTER(LEN=4), POINTER :: CSNOWRIMING => NULL()
 CHARACTER(LEN=80),POINTER :: CSUBG_RC_RR_ACCR => NULL()
 CHARACTER(LEN=80),POINTER :: CSUBG_RR_EVAP => NULL()
 CHARACTER(LEN=80),POINTER :: CSUBG_PR_PDF => NULL()
+CHARACTER(LEN=4),POINTER :: CSUBG_AUCV_RC=>NULL()
+CHARACTER(LEN=80),POINTER :: CSUBG_AUCV_RI=>NULL()
+CHARACTER(LEN=80),POINTER :: CSUBG_MF_PDF=>NULL()
+!
+NAMELIST/NAM_PARAM_ICEn/LWARM,LSEDIC,LCONVHG,CPRISTINE_ICE,CSEDIM,LDEPOSC,XVDEPOSC, &
+                       LRED, LFEEDBACKT, &
+                       LEVLIMIT,LNULLWETG,LWETGPOST,LNULLWETH,LWETHPOST, &
+                       CSNOWRIMING,XFRACM90,NMAXITER_MICRO,XMRSTEP,XTSTEP_TS, &
+                       LADJ_BEFORE, LADJ_AFTER, LCRFLIMIT, &
+                       XSPLIT_MAXCFL, LSEDIM_AFTER, LSNOW_T, &
+                       LPACK_INTERP, LPACK_MICRO, NPROMICRO, CSUBG_RC_RR_ACCR, &
+                       CSUBG_RR_EVAP, CSUBG_PR_PDF, CSUBG_AUCV_RC, CSUBG_AUCV_RI, &
+                       LCRIAUTI, XCRIAUTI_NAM, XT0CRIAUTI_NAM, XBCRIAUTI_NAM, &
+                       XACRIAUTI_NAM, XCRIAUTC_NAM, XRDEPSRED_NAM, XRDEPGRED_NAM, &
+                       LOCND2, XFRMIN_NAM, CSUBG_MF_PDF
 !
 !-------------------------------------------------------------------------------
 !
 CONTAINS
-SUBROUTINE PARAM_ICE_ASSOCIATE()
-  IMPLICIT NONE
-  LWARM => PARAM_ICE%LWARM
-  LSEDIC => PARAM_ICE%LSEDIC
-  LDEPOSC => PARAM_ICE%LDEPOSC
-  LRED => PARAM_ICE%LRED
-  LFEEDBACKT => PARAM_ICE%LFEEDBACKT
-  LEVLIMIT => PARAM_ICE%LEVLIMIT
-  LNULLWETG => PARAM_ICE%LNULLWETG
-  LWETGPOST => PARAM_ICE%LWETGPOST
-  LNULLWETH => PARAM_ICE%LNULLWETH
-  LWETHPOST => PARAM_ICE%LWETHPOST
-  LCONVHG => PARAM_ICE%LCONVHG
-  LCRFLIMIT => PARAM_ICE%LCRFLIMIT
-  LADJ_BEFORE => PARAM_ICE%LADJ_BEFORE
-  LADJ_AFTER => PARAM_ICE%LADJ_AFTER
-  LSEDIM_AFTER => PARAM_ICE%LSEDIM_AFTER
-  LSNOW_T => PARAM_ICE%LSNOW_T
-  LPACK_INTERP => PARAM_ICE%LPACK_INTERP
-  LPACK_MICRO => PARAM_ICE%LPACK_MICRO
+SUBROUTINE PARAM_ICE_GOTO_MODEL(KFROM, KTO)
+!! This subroutine associate all the pointers to the right component of
+!! the right strucuture. A value can be accessed through the structure PARAM_ICEN
+!! or through the strucuture PARAM_ICE_MODEL(KTO) or directly through these pointers.
+IMPLICIT NONE
+INTEGER, INTENT(IN) :: KFROM, KTO
+!
+IF(.NOT. ASSOCIATED(PARAM_ICEN, PARAM_ICE_MODEL(KTO))) THEN
+  !
+  PARAM_ICEN => PARAM_ICE_MODEL(KTO)
   !
-  XVDEPOSC => PARAM_ICE%XVDEPOSC
-  XFRACM90 => PARAM_ICE%XFRACM90
-  XMRSTEP => PARAM_ICE%XMRSTEP
-  XTSTEP_TS => PARAM_ICE%XTSTEP_TS
-  XSPLIT_MAXCFL => PARAM_ICE%XSPLIT_MAXCFL
+  LWARM => PARAM_ICEN%LWARM
+  LSEDIC => PARAM_ICEN%LSEDIC
+  LDEPOSC => PARAM_ICEN%LDEPOSC
+  LRED => PARAM_ICEN%LRED
+  LFEEDBACKT => PARAM_ICEN%LFEEDBACKT
+  LEVLIMIT => PARAM_ICEN%LEVLIMIT
+  LNULLWETG => PARAM_ICEN%LNULLWETG
+  LWETGPOST => PARAM_ICEN%LWETGPOST
+  LNULLWETH => PARAM_ICEN%LNULLWETH
+  LWETHPOST => PARAM_ICEN%LWETHPOST
+  LCONVHG => PARAM_ICEN%LCONVHG
+  LCRFLIMIT => PARAM_ICEN%LCRFLIMIT
+  LADJ_BEFORE => PARAM_ICEN%LADJ_BEFORE
+  LADJ_AFTER => PARAM_ICEN%LADJ_AFTER
+  LSEDIM_AFTER => PARAM_ICEN%LSEDIM_AFTER
+  LSNOW_T => PARAM_ICEN%LSNOW_T
+  LPACK_INTERP => PARAM_ICEN%LPACK_INTERP
+  LPACK_MICRO => PARAM_ICEN%LPACK_MICRO
+  LCRIAUTI => PARAM_ICEN%LCRIAUTI
+  LOCND2 => PARAM_ICEN%LOCND2
   !
-  NMAXITER => PARAM_ICE%NMAXITER
+  XVDEPOSC => PARAM_ICEN%XVDEPOSC
+  XFRACM90 => PARAM_ICEN%XFRACM90
+  XMRSTEP => PARAM_ICEN%XMRSTEP
+  XTSTEP_TS => PARAM_ICEN%XTSTEP_TS
+  XSPLIT_MAXCFL => PARAM_ICEN%XSPLIT_MAXCFL
+  XCRIAUTI_NAM => PARAM_ICEN%XCRIAUTI_NAM
+  XT0CRIAUTI_NAM => PARAM_ICEN%XT0CRIAUTI_NAM
+  XBCRIAUTI_NAM => PARAM_ICEN%XBCRIAUTI_NAM
+  XACRIAUTI_NAM => PARAM_ICEN%XACRIAUTI_NAM
+  XCRIAUTC_NAM => PARAM_ICEN%XCRIAUTC_NAM
+  XRDEPSRED_NAM => PARAM_ICEN%XRDEPSRED_NAM
+  XRDEPGRED_NAM => PARAM_ICEN%XRDEPGRED_NAM
+  XFRMIN_NAM => PARAM_ICEN%XFRMIN_NAM
   !
-  CFRAC_ICE_ADJUST => PARAM_ICE%CFRAC_ICE_ADJUST
-  CFRAC_ICE_SHALLOW_MF => PARAM_ICE%CFRAC_ICE_SHALLOW_MF
-  CPRISTINE_ICE => PARAM_ICE%CPRISTINE_ICE
-  CSEDIM => PARAM_ICE%CSEDIM
-  CSNOWRIMING => PARAM_ICE%CSNOWRIMING
-  CSUBG_RC_RR_ACCR => PARAM_ICE%CSUBG_RC_RR_ACCR
-  CSUBG_RR_EVAP => PARAM_ICE%CSUBG_RR_EVAP
-  CSUBG_PR_PDF => PARAM_ICE%CSUBG_PR_PDF
-END SUBROUTINE PARAM_ICE_ASSOCIATE
-END MODULE MODD_PARAM_ICE
+  NMAXITER_MICRO => PARAM_ICEN%NMAXITER_MICRO
+  NPROMICRO => PARAM_ICEN%NPROMICRO
+  !
+  CPRISTINE_ICE => PARAM_ICEN%CPRISTINE_ICE
+  CSEDIM => PARAM_ICEN%CSEDIM
+  CSNOWRIMING => PARAM_ICEN%CSNOWRIMING
+  CSUBG_RC_RR_ACCR => PARAM_ICEN%CSUBG_RC_RR_ACCR
+  CSUBG_RR_EVAP => PARAM_ICEN%CSUBG_RR_EVAP
+  CSUBG_PR_PDF => PARAM_ICEN%CSUBG_PR_PDF
+  CSUBG_AUCV_RC=>PARAM_ICEN%CSUBG_AUCV_RC
+  CSUBG_AUCV_RI=>PARAM_ICEN%CSUBG_AUCV_RI
+  CSUBG_MF_PDF=>PARAM_ICEN%CSUBG_MF_PDF
+ENDIF
+END SUBROUTINE PARAM_ICE_GOTO_MODEL
+!
+SUBROUTINE PARAM_ICEN_INIT(HPROGRAM, KUNITNML, LDNEEDNAM, KLUOUT, &
+                          &LDDEFAULTVAL, LDREADNAM, LDCHECK, KPRINT)
+!!*** *PARAM_ICEN_INIT* - Code needed to initialize the MODD_PARAM_ICE_n module
+!!
+!!*   PURPOSE
+!!    -------
+!!    Sets the default values, reads the namelist, performs the checks and prints
+!!
+!!*   METHOD
+!!    ------
+!!    0. Declarations
+!!       1. Declaration of arguments
+!!       2. Declaration of local variables
+!!    1. Default values
+!!    2. Namelist
+!!    3. Checks
+!!    4. Prints
+!!
+!!    AUTHOR
+!!    ------
+!!    S. Riette
+!!
+!!    MODIFICATIONS
+!!    -------------
+!!      Original    Feb 2023
+!-------------------------------------------------------------------------------
+!
+!*      0. DECLARATIONS
+!       ---------------
+!
+USE MODE_POSNAM_PHY, ONLY: POSNAM_PHY
+USE MODE_MSG, ONLY: PRINT_MSG, NVERB_FATAL
+USE MODE_CHECK_NAM_VAL, ONLY: CHECK_NAM_VAL_CHAR, CHECK_NAM_VAL_REAL, CHECK_NAM_VAL_INT
+!
+IMPLICIT NONE
+!
+!* 0.1. Declaration of arguments
+!       ------------------------
+!
+CHARACTER(LEN=6),  INTENT(IN) :: HPROGRAM     !< Name of the calling program
+INTEGER,           INTENT(IN) :: KUNITNML     !< Logical unit to access the namelist
+LOGICAL,           INTENT(IN) :: LDNEEDNAM    !< True to abort if namelist is absent
+INTEGER,           INTENT(IN) :: KLUOUT       !< Logical unit for outputs
+LOGICAL, OPTIONAL, INTENT(IN) :: LDDEFAULTVAL !< Must we initialize variables with default values (defaults to .TRUE.)
+LOGICAL, OPTIONAL, INTENT(IN) :: LDREADNAM    !< Must we read the namelist (defaults to .TRUE.)
+LOGICAL, OPTIONAL, INTENT(IN) :: LDCHECK      !< Must we perform some checks on values (defaults to .TRUE.)
+INTEGER, OPTIONAL, INTENT(IN) :: KPRINT       !< Print level (defaults to 0): 0 for no print, 1 to safely print namelist,
+                                              !! 2 to print informative messages
+!
+!* 0.2 Declaration of local variables
+!      ------------------------------
+!
+LOGICAL :: LLDEFAULTVAL, LLREADNAM, LLCHECK, LLFOUND
+INTEGER :: IPRINT
+
+LLDEFAULTVAL=.TRUE.
+LLREADNAM=.TRUE.
+LLCHECK=.TRUE.
+IPRINT=0
+IF(PRESENT(LDDEFAULTVAL)) LLDEFAULTVAL=LDDEFAULTVAL
+IF(PRESENT(LDREADNAM   )) LLREADNAM   =LDREADNAM
+IF(PRESENT(LDCHECK     )) LLCHECK     =LDCHECK
+IF(PRESENT(KPRINT      )) IPRINT      =KPRINT
+!
+!*      1. DEFAULT VALUES
+!       -----------------
+!
+IF(LLDEFAULTVAL) THEN
+  !NOTES ON GENERAL DEFAULTS AND MODEL-SPECIFIC DEFAULTS :
+  !- General default values *MUST* remain unchanged.
+  !- To change the default value for a given application,                                                 
+  !  an "IF(HPROGRAM=='...')" condition must be used.
+
+  LWARM=.TRUE.
+  LSEDIC=.TRUE.
+  LDEPOSC=.FALSE.
+  XVDEPOSC= 0.02 ! 2 cm/s
+  CPRISTINE_ICE='PLAT'
+  CSEDIM='SPLI'
+  LRED=.TRUE.
+  LFEEDBACKT=.TRUE.
+  LEVLIMIT=.TRUE.
+  LNULLWETG=.TRUE.
+  LWETGPOST=.TRUE.
+  LNULLWETH=.TRUE.
+  LWETHPOST=.TRUE.
+  CSNOWRIMING='M90'
+  XFRACM90=0.1
+  NMAXITER_MICRO=5
+  XMRSTEP=0.00005
+  LCONVHG=.FALSE.
+  LCRFLIMIT=.TRUE.
+  XTSTEP_TS=0.
+  CSUBG_RC_RR_ACCR='NONE'
+  CSUBG_RR_EVAP='NONE'
+  CSUBG_PR_PDF='SIGM'
+  CSUBG_AUCV_RC='NONE'
+  CSUBG_AUCV_RI='NONE'
+  CSUBG_MF_PDF='TRIANGLE'
+  LADJ_BEFORE=.TRUE.
+  LADJ_AFTER=.TRUE.
+  LSEDIM_AFTER=.FALSE.
+  XSPLIT_MAXCFL=0.8
+  LSNOW_T=.FALSE.
+  LPACK_INTERP=.TRUE.
+  LPACK_MICRO=.TRUE.
+  NPROMICRO=0
+  LCRIAUTI=.FALSE.
+  !!XCRIAUTIi_NAM = 0.25E-3 !  Critical ice content for the autoconversion to occur
+  XCRIAUTI_NAM = 0.2E-4 !  Revised value by Chaboureau et al. (2001)
+  XACRIAUTI_NAM=0.06
+  XBCRIAUTI_NAM=-3.5
+  XT0CRIAUTI_NAM=(LOG10(XCRIAUTI_NAM)-XBCRIAUTI_NAM)/0.06
+  XCRIAUTC_NAM=0.5E-3
+  XRDEPSRED_NAM=1.
+  XRDEPGRED_NAM=1.
+  LOCND2=.FALSE.
+  ! Tuning and modication of graupeln etc:
+  XFRMIN_NAM(1:6)=0.
+  XFRMIN_NAM(7:9)=1.
+  XFRMIN_NAM(10) =10.
+  XFRMIN_NAM(11) =1.
+  XFRMIN_NAM(12) =0.
+  XFRMIN_NAM(13) =1.0E-15
+  XFRMIN_NAM(14) =120.
+  XFRMIN_NAM(15) =1.0E-4
+  XFRMIN_NAM(16:20)=0.
+  XFRMIN_NAM(21:22)=1.
+  XFRMIN_NAM(23)=0.5
+  XFRMIN_NAM(24)=1.5
+  XFRMIN_NAM(25)=30.
+  XFRMIN_NAM(26:38)=0.
+  XFRMIN_NAM(39)=0.25
+  XFRMIN_NAM(40)=0.15
+
+  IF(HPROGRAM=='AROME') THEN
+    LCONVHG=.TRUE.
+    LADJ_BEFORE=.TRUE.
+    LADJ_AFTER=.FALSE.
+    LRED=.FALSE.
+    CSEDIM='STAT'
+    LSEDIC=.FALSE.
+    XMRSTEP=0.
+    CSUBG_AUCV_RC='PDF'
+  ELSEIF(HPROGRAM=='LMDZ') THEN
+    CSUBG_AUCV_RC='PDF'
+    CSEDIM='STAT'
+    NMAXITER_MICRO=1
+    LCRIAUTI=.TRUE.
+    XCRIAUTC_NAM=0.001
+    XCRIAUTI_NAM=0.0002
+    XT0CRIAUTI_NAM=-5.
+    LRED=.TRUE.
+    LCONVHG=.TRUE.
+    LADJ_BEFORE=.TRUE.
+    LADJ_AFTER=.FALSE.
+  ENDIF
+ENDIF
+!
+!*      2. NAMELIST
+!       -----------
+!
+IF(LLREADNAM) THEN
+  CALL POSNAM_PHY(KUNITNML, 'NAM_PARAM_ICEN', LDNEEDNAM, LLFOUND, KLUOUT)
+  IF(LLFOUND) READ(UNIT=KUNITNML, NML=NAM_PARAM_ICEn)
+ENDIF
+!
+!*      3. CHECKS
+!       ---------
+!
+IF(LLCHECK) THEN
+  CALL CHECK_NAM_VAL_CHAR(KLUOUT, 'CPRISTINE_ICE', CPRISTINE_ICE, 'PLAT', 'COLU', 'BURO')
+  CALL CHECK_NAM_VAL_CHAR(KLUOUT, 'CSEDIM', CSEDIM, 'SPLI', 'STAT', 'NONE')
+  CALL CHECK_NAM_VAL_CHAR(KLUOUT, 'CSUBG_RC_RR_ACCR', CSUBG_RC_RR_ACCR, 'NONE', 'PRFR')
+  CALL CHECK_NAM_VAL_CHAR(KLUOUT, 'CSUBG_RR_EVAP', CSUBG_RR_EVAP, 'NONE', 'CLFR', 'PRFR')
+  CALL CHECK_NAM_VAL_CHAR(KLUOUT, 'CSUBG_PR_PDF', CSUBG_PR_PDF, 'SIGM', 'HLCRECTPD', 'HLCTRIANGPDF', &
+                                                                'HLCQUADRAPDF', 'HLCISOTRIPDF')
+  CALL CHECK_NAM_VAL_CHAR(KLUOUT, 'CSUBG_AUCV_RC', CSUBG_AUCV_RC, 'PDF ', 'CLFR', 'NONE', 'ADJU', 'SIGM')
+  CALL CHECK_NAM_VAL_CHAR(KLUOUT, 'CSUBG_AUCV_RI', CSUBG_AUCV_RI, 'NONE', 'CLFR', 'ADJU')
+  CALL CHECK_NAM_VAL_CHAR(KLUOUT, 'CSUBG_MF_PDF', CSUBG_MF_PDF, 'NONE', 'TRIANGLE')
+  CALL CHECK_NAM_VAL_CHAR(KLUOUT, 'CSNOWRIMING', CSNOWRIMING, 'OLD ', 'M90 ')
+  CALL CHECK_NAM_VAL_REAL(KLUOUT, 'XTSTEP_TS', XTSTEP_TS, '>=', 0.)
+  CALL CHECK_NAM_VAL_REAL(KLUOUT, 'XSPLIT_MAXCFL', XSPLIT_MAXCFL, '>', 0., '<=', 1.)
+  CALL CHECK_NAM_VAL_REAL(KLUOUT, 'XVDEPOSC', XVDEPOSC, '>=', 0.)
+  CALL CHECK_NAM_VAL_REAL(KLUOUT, 'XFRACM90', XFRACM90, '>=', 0., '<=', 1.)
+  CALL CHECK_NAM_VAL_REAL(KLUOUT, 'XMRSTEP', XMRSTEP, '>=', 0.)
+  CALL CHECK_NAM_VAL_INT(KLUOUT, 'NPROMICRO', NPROMICRO, '>=', 0)
+
+  IF (LOCND2 .AND. (XRDEPSRED_NAM /= 1 .OR. XRDEPGRED_NAM /= 1)) THEN
+    CALL ABOR1 ("XRDESRED_NAM and XRDEGRED_NAM must not be activated together with LOCND2")
+  ENDIF
+
+  IF(HPROGRAM=='AROME' .OR. HPROGRAM=='LMDZ') THEN
+    IF(.NOT. (LADJ_BEFORE .AND. .NOT. LADJ_AFTER)) THEN
+      CALL PRINT_MSG(NVERB_FATAL, 'GEN', 'MODD_PARAM_ICE_n', 'With AROME/LMDZ, LADJ_BEFORE must be .T. and LADJ_AFTER must be .F.')
+    ENDIF
+  ENDIF
+ENDIF
+!
+!*      3. PRINTS
+!       ---------
+!
+IF(IPRINT>=1) THEN
+  WRITE(UNIT=KLUOUT,NML=NAM_PARAM_ICEn)
+ENDIF
+!
+END SUBROUTINE PARAM_ICEN_INIT
+!
+END MODULE MODD_PARAM_ICE_n
diff --git a/src/PHYEX/micro/modd_param_lima.f90 b/src/PHYEX/micro/modd_param_lima.f90
index 00af77b8569018404060bee7c6672e849b02f504..3565e1d9a705310dd2c37f73b2768b296fa88c53 100644
--- a/src/PHYEX/micro/modd_param_lima.f90
+++ b/src/PHYEX/micro/modd_param_lima.f90
@@ -6,8 +6,8 @@
 !     ######################
       MODULE MODD_PARAM_LIMA
 !     ######################
-!
-!!****  *MODD_PARAM_LIMA* - declaration of the control parameters
+!> @file
+!!      *MODD_PARAM_LIMA* - declaration of the control parameters
 !!                               for use in the LIMA scheme.
 !!
 !!    PURPOSE
@@ -18,7 +18,7 @@
 !!
 !!
 !!
-!!**  IMPLICIT ARGUMENTS
+!!    IMPLICIT ARGUMENTS
 !!    ------------------
 !!      None 
 !!
@@ -39,89 +39,90 @@ USE MODD_PARAMETERS, ONLY : JPLIMACCNMAX, JPLIMAIFNMAX
 !
 IMPLICIT NONE
 !
-LOGICAL, SAVE :: LLIMA_DIAG             ! Compute diagnostics for concentration /m3
+TYPE PARAM_LIMA_t
+LOGICAL :: LLIMA_DIAG             ! Compute diagnostics for concentration /m3
 !
-LOGICAL, SAVE :: LPTSPLIT               ! activate time-splitting technique by S. Riette
-LOGICAL, SAVE :: LFEEDBACKT             ! recompute tendencies if T changes sign
-INTEGER, SAVE :: NMAXITER               ! maximum number of iterations
-REAL,    SAVE :: XMRSTEP                ! maximum change in mixing ratio allowed before recomputing tedencies
-REAL,    SAVE :: XTSTEP_TS              ! maximum time for the sub-time-step
+LOGICAL :: LPTSPLIT               ! activate time-splitting technique by S. Riette
+LOGICAL :: LFEEDBACKT             ! recompute tendencies if T changes sign
+INTEGER :: NMAXITER               ! maximum number of iterations
+REAL    :: XMRSTEP                ! maximum change in mixing ratio allowed before recomputing tedencies
+REAL    :: XTSTEP_TS              ! maximum time for the sub-time-step
 !
 !*       1.   COLD SCHEME
 !             -----------
 !
 ! 1.1 Cold scheme configuration
 !
-LOGICAL, SAVE :: LNUCL                  ! TRUE to enable ice nucleation
-LOGICAL, SAVE :: LSEDI                  ! TRUE to enable pristine ice sedimentation
-LOGICAL, SAVE :: LHHONI                 ! TRUE to enable freezing of haze particules
-LOGICAL, SAVE :: LMEYERS                ! TRUE to use Meyers nucleation
-LOGICAL, SAVE :: LCIBU                  ! TRUE to use collisional ice breakup
-LOGICAL, SAVE :: LRDSF                  ! TRUE to use rain drop shattering by freezing
-INTEGER, SAVE :: NMOM_I                 ! Number of moments for pristine ice
-INTEGER, SAVE :: NMOM_S                 ! Number of moments for snow
-INTEGER, SAVE :: NMOM_G                 ! Number of moments for graupel
-INTEGER, SAVE :: NMOM_H                 ! Number of moments for hail
+LOGICAL :: LNUCL                  ! TRUE to enable ice nucleation
+LOGICAL :: LSEDI                  ! TRUE to enable pristine ice sedimentation
+LOGICAL :: LHHONI                 ! TRUE to enable freezing of haze particules
+LOGICAL :: LMEYERS                ! TRUE to use Meyers nucleation
+LOGICAL :: LCIBU                  ! TRUE to use collisional ice breakup
+LOGICAL :: LRDSF                  ! TRUE to use rain drop shattering by freezing
+INTEGER :: NMOM_I                 ! Number of moments for pristine ice
+INTEGER :: NMOM_S                 ! Number of moments for snow
+INTEGER :: NMOM_G                 ! Number of moments for graupel
+INTEGER :: NMOM_H                 ! Number of moments for hail
 !
 ! 1.2 IFN initialisation
 !
-INTEGER, SAVE          :: NMOD_IFN               ! Number of IFN modes
-REAL, DIMENSION(JPLIMAIFNMAX), SAVE :: XIFN_CONC ! Ref. concentration of IFN(#/L)
-LOGICAL, SAVE          :: LIFN_HOM               ! True for z-homogeneous IFN concentrations
-CHARACTER(LEN=8), SAVE :: CIFN_SPECIES           ! Internal mixing species definitions
-CHARACTER(LEN=8), SAVE :: CINT_MIXING            ! Internal mixing type selection (pure DM1 ...)
-INTEGER, SAVE          :: NMOD_IMM               ! Number of CCN modes acting by immersion
-INTEGER, SAVE          :: NIND_SPECIE            ! CCN acting by immersion are considered pure
-                                                 ! IFN of either DM = 1, BC = 2 or O = 3
-INTEGER, DIMENSION(:), SAVE, ALLOCATABLE :: NIMM            ! Link between CCN and IMM modes
-INTEGER, DIMENSION(:), SAVE, ALLOCATABLE :: NINDICE_CCN_IMM ! ??????????
-INTEGER, SAVE                            :: NSPECIE         ! Internal mixing number of species
-REAL, DIMENSION(:),    SAVE, ALLOCATABLE :: XMDIAM_IFN      ! Mean diameter of IFN modes
-REAL, DIMENSION(:),    SAVE, ALLOCATABLE :: XSIGMA_IFN      ! Sigma of IFN modes
-REAL, DIMENSION(:),    SAVE, ALLOCATABLE :: XRHO_IFN        ! Density of IFN modes 
-REAL, DIMENSION(:,:),  SAVE, ALLOCATABLE :: XFRAC           ! Composition of each IFN mode
-REAL, DIMENSION(:),    SAVE, ALLOCATABLE :: XFRAC_REF       ! AP compostion in Phillips 08
+INTEGER          :: NMOD_IFN               ! Number of IFN modes
+REAL, DIMENSION(JPLIMAIFNMAX) :: XIFN_CONC ! Ref. concentration of IFN(#/L)
+LOGICAL          :: LIFN_HOM               ! True for z-homogeneous IFN concentrations
+CHARACTER(LEN=8) :: CIFN_SPECIES           ! Internal mixing species definitions
+CHARACTER(LEN=8) :: CINT_MIXING            ! Internal mixing type selection (pure DM1 ...)
+INTEGER          :: NMOD_IMM               ! Number of CCN modes acting by immersion
+INTEGER          :: NIND_SPECIE            ! CCN acting by immersion are considered pure
+                                           ! IFN of either DM = 1, BC = 2 or O = 3
+INTEGER, DIMENSION(:), ALLOCATABLE :: NIMM            ! Link between CCN and IMM modes
+INTEGER, DIMENSION(:), ALLOCATABLE :: NINDICE_CCN_IMM ! ??????????
+INTEGER                            :: NSPECIE         ! Internal mixing number of species
+REAL, DIMENSION(:),    ALLOCATABLE :: XMDIAM_IFN      ! Mean diameter of IFN modes
+REAL, DIMENSION(:),    ALLOCATABLE :: XSIGMA_IFN      ! Sigma of IFN modes
+REAL, DIMENSION(:),    ALLOCATABLE :: XRHO_IFN        ! Density of IFN modes 
+REAL, DIMENSION(:,:),  ALLOCATABLE :: XFRAC           ! Composition of each IFN mode
+REAL, DIMENSION(:),    ALLOCATABLE :: XFRAC_REF       ! AP compostion in Phillips 08
 !
 ! 1.3 Ice characteristics
 !
-LOGICAL, SAVE :: LSNOW_T                     ! TRUE to enable snow param. after Wurtz 2021
-LOGICAL, SAVE :: LMURAKAMI                   ! snow + liq -> graupel after Murakami (as in RAIN_ICE_RED)
-CHARACTER(LEN=4), SAVE :: CPRISTINE_ICE_LIMA ! Pristine type PLAT, COLU or BURO
-CHARACTER(LEN=4), SAVE :: CHEVRIMED_ICE_LIMA ! Heavily rimed type GRAU or HAIL
-REAL,SAVE              :: XALPHAI,XNUI,    & ! Pristine ice   distribution parameters
+LOGICAL :: LSNOW_T                     ! TRUE to enable snow param. after Wurtz 2021
+LOGICAL :: LMURAKAMI                   ! snow + liq -> graupel after Murakami (as in RAIN_ICE_RED)
+CHARACTER(LEN=4) :: CPRISTINE_ICE_LIMA ! Pristine type PLAT, COLU or BURO
+CHARACTER(LEN=4) :: CHEVRIMED_ICE_LIMA ! Heavily rimed type GRAU or HAIL
+REAL                   :: XALPHAI,XNUI,    & ! Pristine ice   distribution parameters
                           XALPHAS,XNUS,    & ! Snow/aggregate distribution parameters
                           XALPHAG,XNUG       ! Graupel        distribution parameters
 !
 ! 1.4 Phillips (2013) nucleation parameterization
 !
-INTEGER, SAVE          :: NPHILLIPS     ! =8 for Phillips08, =13 for Phillips13
-!
-REAL, DIMENSION(4), SAVE   :: XT0       ! Threshold of T in H_X for X={DM1,DM2,BC,O} [K]
-REAL, DIMENSION(4), SAVE   :: XDT0      ! Range in T for transition of H_X near XT0 [K]
-REAL, DIMENSION(4), SAVE   :: XDSI0     ! Range in Si for transition of H_X near XSI0
-REAL,               SAVE   :: XSW0      ! Threshold of Sw in H_X 
-REAL,               SAVE   :: XRHO_CFDC ! Air density at which CFDC data were reported [kg m**3]
-REAL, DIMENSION(4), SAVE   :: XH        ! Fraction<<1 of aerosol for X={DM,BC,O}
-REAL, DIMENSION(4), SAVE   :: XAREA1    ! Total surface of all aerosols in group X with
-                            ! diameters between 0.1 and 1 µm, for X={DM1,DM2,BC,O} [m**2 kg**-1]
-REAL,               SAVE   :: XGAMMA    ! Factor boosting IN concentration due to 
+INTEGER              :: NPHILLIPS     ! =8 for Phillips08, =13 for Phillips13
+!
+REAL, DIMENSION(4)   :: XT0       ! Threshold of T in H_X for X={DM1,DM2,BC,O} [K]
+REAL, DIMENSION(4)   :: XDT0      ! Range in T for transition of H_X near XT0 [K]
+REAL, DIMENSION(4)   :: XDSI0     ! Range in Si for transition of H_X near XSI0
+REAL                 :: XSW0      ! Threshold of Sw in H_X 
+REAL                 :: XRHO_CFDC ! Air density at which CFDC data were reported [kg m**3]
+REAL, DIMENSION(4)   :: XH        ! Fraction<<1 of aerosol for X={DM,BC,O}
+REAL, DIMENSION(4)   :: XAREA1    ! Total surface of all aerosols in group X with
+                                  ! diameters between 0.1 and 1 µm, for X={DM1,DM2,BC,O} [m**2 kg**-1]
+REAL                 :: XGAMMA    ! Factor boosting IN concentration due to 
                                         ! bulk-liquid modes
 !
-REAL, DIMENSION(4), SAVE   :: XTX1      ! Threshold of T in Xi for X={DM1,DM2,BC,O} [K]
-REAL, DIMENSION(4), SAVE   :: XTX2      ! Threshold of T in Xi for X={DM1,DM2,BC,O} [K]
+REAL, DIMENSION(4)   :: XTX1      ! Threshold of T in Xi for X={DM1,DM2,BC,O} [K]
+REAL, DIMENSION(4)   :: XTX2      ! Threshold of T in Xi for X={DM1,DM2,BC,O} [K]
 !
-REAL,DIMENSION(:), SAVE, ALLOCATABLE :: XABSCISS, XWEIGHT ! Gauss quadrature method 
-INTEGER,           SAVE              :: NDIAM             ! Gauss quadrature accuracy 
+REAL,DIMENSION(:), ALLOCATABLE :: XABSCISS, XWEIGHT ! Gauss quadrature method 
+INTEGER                        :: NDIAM             ! Gauss quadrature accuracy 
 !
 ! 1.5 Meyers (1992) nucleation parameterization
 !
-REAL,SAVE :: XFACTNUC_DEP,XFACTNUC_CON  ! Amplification factor for IN conc.
+REAL      :: XFACTNUC_DEP,XFACTNUC_CON  ! Amplification factor for IN conc.
                                         !   DEP refers to DEPosition mode
                                         !   CON refers to CONtact    mode
 !
 ! 1.6 Collisional Ice Break Up parameterization
 !
-REAL,SAVE :: XNDEBRIS_CIBU              ! Number of ice crystal debris produced
+REAL      :: XNDEBRIS_CIBU              ! Number of ice crystal debris produced
                                         ! by the break up of aggregate particles
 !
 !-------------------------------------------------------------------------------
@@ -132,54 +133,51 @@ REAL,SAVE :: XNDEBRIS_CIBU              ! Number of ice crystal debris produced
 !
 ! 2.1 Warm scheme configuration
 !
-LOGICAL, SAVE :: LACTI         ! TRUE to enable CCN activation
-LOGICAL, SAVE :: LSEDC         ! TRUE to enable the droplet sedimentation
-LOGICAL, SAVE :: LACTIT        ! TRUE to enable the usage of dT/dt in CCN activation
-LOGICAL, SAVE :: LBOUND        ! TRUE to enable the continuously replenishing
-                               ! aerosol concentrations through the open
-                               ! lateral boundaries -> boundaries.f90
-LOGICAL, SAVE :: LDEPOC        ! Deposition of rc at 1st level above ground
-LOGICAL, SAVE :: LACTTKE       ! TRUE to take into account TKE in W for activation
-LOGICAL, SAVE :: LADJ          ! TRUE for adjustment procedure + Smax (false for diagnostic supersaturation)
-LOGICAL, SAVE :: LSPRO         ! TRUE for prognostic supersaturation                     
-LOGICAL, SAVE :: LKHKO         ! TRUE for Scu simulation (replicates the previous KHKO scheme)                     
-LOGICAL, SAVE :: LKESSLERAC    ! TRUE for Kessler autoconversion (if NMOM_C=1)
-!
-INTEGER, SAVE :: NMOM_C        ! Number of moments for cloud droplets
-INTEGER, SAVE :: NMOM_R        ! Number of moments for rain drops
+LOGICAL :: LACTI         ! TRUE to enable CCN activation
+LOGICAL :: LSEDC         ! TRUE to enable the droplet sedimentation
+LOGICAL :: LACTIT        ! TRUE to enable the usage of dT/dt in CCN activation
+LOGICAL :: LDEPOC        ! Deposition of rc at 1st level above ground
+LOGICAL :: LACTTKE       ! TRUE to take into account TKE in W for activation
+LOGICAL :: LADJ          ! TRUE for adjustment procedure + Smax (false for diagnostic supersaturation)
+LOGICAL :: LSPRO         ! TRUE for prognostic supersaturation                     
+LOGICAL :: LKHKO         ! TRUE for Scu simulation (replicates the previous KHKO scheme)                     
+LOGICAL :: LKESSLERAC    ! TRUE for Kessler autoconversion (if NMOM_C=1)
+!
+INTEGER :: NMOM_C        ! Number of moments for cloud droplets
+INTEGER :: NMOM_R        ! Number of moments for rain drops
 !
 ! 2.2 CCN initialisation
 !
-INTEGER,         SAVE                     :: NMOD_CCN         ! Number of CCN modes
-REAL, DIMENSION(JPLIMACCNMAX), SAVE       :: XCCN_CONC        ! CCN conc.  (#/cm3)
-LOGICAL,         SAVE                     :: LCCN_HOM         ! True for z-homogeneous CCN concentrations
-CHARACTER(LEN=8),SAVE                     :: CCCN_MODES       ! CCN modes characteristics (Jungfraujoch ...)
-REAL, DIMENSION(:), SAVE, ALLOCATABLE     :: XR_MEAN_CCN,   & ! Mean radius of CCN modes
-                                             XLOGSIG_CCN,   & ! Log of geometric dispersion of the CCN modes
-                                             XRHO_CCN         ! Density of the CCN modes
-REAL, DIMENSION(:), SAVE, ALLOCATABLE     :: XKHEN_MULTI,   & ! Parameters defining the CCN activation
-                                             XMUHEN_MULTI,  & ! spectra for a multimodal aerosol distribution
-                                             XBETAHEN_MULTI   ! 
-REAL, DIMENSION(:,:,:) ,SAVE, ALLOCATABLE :: XCONC_CCN_TOT    ! Total aerosol number concentration
-REAL, DIMENSION(:),     SAVE, ALLOCATABLE :: XLIMIT_FACTOR    ! compute CHEN ????????????
+INTEGER                             :: NMOD_CCN         ! Number of CCN modes
+REAL, DIMENSION(JPLIMACCNMAX)       :: XCCN_CONC        ! CCN conc.  (#/cm3)
+LOGICAL                             :: LCCN_HOM         ! True for z-homogeneous CCN concentrations
+CHARACTER(LEN=8)                    :: CCCN_MODES       ! CCN modes characteristics (Jungfraujoch ...)
+REAL, DIMENSION(:), ALLOCATABLE     :: XR_MEAN_CCN,   & ! Mean radius of CCN modes
+                                       XLOGSIG_CCN,   & ! Log of geometric dispersion of the CCN modes
+                                       XRHO_CCN         ! Density of the CCN modes
+REAL, DIMENSION(:), ALLOCATABLE     :: XKHEN_MULTI,   & ! Parameters defining the CCN activation
+                                       XMUHEN_MULTI,  & ! spectra for a multimodal aerosol distribution
+                                       XBETAHEN_MULTI   ! 
+REAL, DIMENSION(:,:,:), ALLOCATABLE :: XCONC_CCN_TOT    ! Total aerosol number concentration
+REAL, DIMENSION(:),     ALLOCATABLE :: XLIMIT_FACTOR    ! compute CHEN ????????????
 !
 ! 2.3 Water particles characteristics
 !
-REAL,SAVE     :: XALPHAR,XNUR,       & ! Raindrop      distribution parameters
+REAL          :: XALPHAR,XNUR,       & ! Raindrop      distribution parameters
                  XALPHAC,XNUC          ! Cloud droplet distribution parameters
 !
 ! 2.4 CCN activation
 !
-CHARACTER(LEN=3),SAVE :: HPARAM_CCN = 'CPB'   ! Parameterization of the CCN activation
-CHARACTER(LEN=3),SAVE :: HINI_CCN             ! Initialization type of CCN activation
-CHARACTER(LEN=10),DIMENSION(JPLIMACCNMAX),SAVE :: HTYPE_CCN ! 'M' or 'C' CCN type
-REAL,SAVE             :: XFSOLUB_CCN,       & ! Fractionnal solubility of the CCN
+CHARACTER(LEN=3)      :: HPARAM_CCN = 'CPB'   ! Parameterization of the CCN activation
+CHARACTER(LEN=3)      :: HINI_CCN             ! Initialization type of CCN activation
+CHARACTER(LEN=10), DIMENSION(JPLIMACCNMAX) :: HTYPE_CCN ! 'M' or 'C' CCN type
+REAL                  :: XFSOLUB_CCN,       & ! Fractionnal solubility of the CCN
                          XACTEMP_CCN,       & ! Expected temperature of CCN activation
                          XAERDIFF, XAERHEIGHT ! For the vertical gradient of aerosol distribution
 !
 ! Cloud droplet deposition
 !
-REAL, SAVE :: XVDEPOC
+REAL :: XVDEPOC
 !
 !-------------------------------------------------------------------------------
 !
@@ -187,15 +185,15 @@ REAL, SAVE :: XVDEPOC
 !*       3.   BELOW CLOUD SCAVENGING
 !             ----------------------
 !
-LOGICAL, SAVE :: LSCAV           ! TRUE for aerosol scavenging by precipitations 
-LOGICAL, SAVE :: LAERO_MASS      ! TRUE to compute the total aerosol mass scavenging rate 
+LOGICAL :: LSCAV           ! TRUE for aerosol scavenging by precipitations 
+LOGICAL :: LAERO_MASS      ! TRUE to compute the total aerosol mass scavenging rate 
 !
-INTEGER       :: NDIAMR = 20     ! Max Number of droplet for quadrature method  
-INTEGER       :: NDIAMP = 20     ! Max Number of aerosol particle for quadrature method  
+INTEGER :: NDIAMR = 20     ! Max Number of droplet for quadrature method  
+INTEGER :: NDIAMP = 20     ! Max Number of aerosol particle for quadrature method  
 !
-REAL, SAVE    :: XT0SCAV = 293.15  ! [K]
-REAL, SAVE    :: XTREF = 273.15    ! [K]
-REAL, SAVE    :: XNDO = 8.*1.0E6   ! [/m**4]
+REAL    :: XT0SCAV = 293.15  ! [K]
+REAL    :: XTREF = 273.15    ! [K]
+REAL    :: XNDO = 8.*1.0E6   ! [/m**4]
 !
 !-------------------------------------------------------------------------------
 !
@@ -203,28 +201,558 @@ REAL, SAVE    :: XNDO = 8.*1.0E6   ! [/m**4]
 !*       4.   ATMOSPHERIC & OTHER PARAMETERS
 !             ------------------------------
 !
-REAL, SAVE    :: XMUA0     = 1.711E-05  ![Pa.s] Air Viscosity at T=273.15K
-REAL, SAVE    :: XT_SUTH_A = 110.4      ![K] Sutherland Temperature for Air
-REAL, SAVE    :: XMFPA0    = 6.6E-08    ![m] Mean Free Path of Air under standard conditions
+REAL    :: XMUA0     = 1.711E-05  ![Pa.s] Air Viscosity at T=273.15K
+REAL    :: XT_SUTH_A = 110.4      ![K] Sutherland Temperature for Air
+REAL    :: XMFPA0    = 6.6E-08    ![m] Mean Free Path of Air under standard conditions
 !
-REAL, SAVE    :: XVISCW = 1.0E-3        ![Pa.s] water viscosity at 20°C
+REAL    :: XVISCW = 1.0E-3        ![Pa.s] water viscosity at 20°C
 ! Correction
-!REAL, SAVE    :: XRHO00 = 1.292        !rho on the floor    [Kg/m**3]
-REAL, SAVE    :: XRHO00 = 1.2041        !rho at P=1013.25 and T=20°C
+!REAL    :: XRHO00 = 1.292        !rho on the floor    [Kg/m**3]
+REAL    :: XRHO00 = 1.2041        !rho at P=1013.25 and T=20°C
 !
-REAL,SAVE :: XCEXVT                     ! air density fall speed correction
+REAL    :: XCEXVT                     ! air density fall speed correction
 !
-REAL,DIMENSION(:),SAVE,ALLOCATABLE :: XRTMIN ! Min values of the mixing ratios
-REAL,DIMENSION(:),SAVE,ALLOCATABLE :: XCTMIN ! Min values of the drop concentrations
+REAL, DIMENSION(:), ALLOCATABLE :: XRTMIN ! Min values of the mixing ratios
+REAL, DIMENSION(:), ALLOCATABLE :: XCTMIN ! Min values of the drop concentrations
 !
 !
 ! Sedimentation variables
 !
-INTEGER,DIMENSION(7),SAVE :: NSPLITSED
-REAL,DIMENSION(7),SAVE :: XLB
-REAL,DIMENSION(7),SAVE :: XLBEX
-REAL,DIMENSION(7),SAVE :: XD
-REAL,DIMENSION(7),SAVE :: XFSEDR
-REAL,DIMENSION(7),SAVE :: XFSEDC
+INTEGER,DIMENSION(7)   :: NSPLITSED
+REAL,DIMENSION(7)      :: XLB
+REAL,DIMENSION(7)      :: XLBEX
+REAL,DIMENSION(7)      :: XD
+REAL,DIMENSION(7)      :: XFSEDR
+REAL,DIMENSION(7)      :: XFSEDC
+END TYPE PARAM_LIMA_t
+!
+TYPE(PARAM_LIMA_t), TARGET, SAVE :: PARAM_LIMA
+!
+LOGICAL, POINTER :: LLIMA_DIAG => NULL(), &
+                    LPTSPLIT => NULL(), &
+                    LFEEDBACKT => NULL(), &
+                    LNUCL => NULL(), &
+                    LSEDI => NULL(), &
+                    LHHONI => NULL(), &
+                    LMEYERS => NULL(), &
+                    LCIBU => NULL(), &
+                    LRDSF => NULL(), &
+                    LIFN_HOM => NULL(), &
+                    LSNOW_T => NULL(), &
+                    LMURAKAMI => NULL(), &
+                    LACTI => NULL(), &
+                    LSEDC => NULL(), &
+                    LACTIT => NULL(), &
+                    LDEPOC => NULL(), &
+                    LACTTKE => NULL(), &
+                    LADJ => NULL(), &
+                    LSPRO => NULL(), &
+                    LKHKO => NULL(), &
+                    LKESSLERAC => NULL(), &
+                    LCCN_HOM => NULL(), &
+                    LSCAV => NULL(), &
+                    LAERO_MASS => NULL()
+
+INTEGER, POINTER :: NMAXITER => NULL(), &
+                    NMOM_I => NULL(), &
+                    NMOM_S => NULL(), &
+                    NMOM_G => NULL(), &
+                    NMOM_H => NULL(), &
+                    NMOD_IFN => NULL(), &
+                    NMOD_IMM => NULL(), &
+                    NIND_SPECIE => NULL(), &
+                    NSPECIE => NULL(), &
+                    NPHILLIPS => NULL(), &
+                    NDIAM => NULL(), &
+                    NMOM_C => NULL(), &
+                    NMOM_R => NULL(), &
+                    NMOD_CCN => NULL(), &
+                    NDIAMR => NULL(), &
+                    NDIAMP => NULL()
+
+REAL, POINTER :: XMRSTEP => NULL(), &
+                 XTSTEP_TS => NULL(), &
+                 XALPHAI => NULL(), &
+                 XNUI => NULL(), &
+                 XALPHAS => NULL(), &
+                 XNUS => NULL(), &
+                 XALPHAG => NULL(), &
+                 XNUG => NULL(), &
+                 XSW0 => NULL(), &
+                 XRHO_CFDC => NULL(), &
+                 XGAMMA => NULL(), &
+                 XFACTNUC_DEP => NULL(), &
+                 XFACTNUC_CON => NULL(), &
+                 XNDEBRIS_CIBU => NULL(), &
+                 XALPHAR => NULL(), &
+                 XNUR => NULL(), &
+                 XALPHAC => NULL(), &
+                 XNUC => NULL(), &
+                 XFSOLUB_CCN => NULL(), &
+                 XACTEMP_CCN => NULL(), &
+                 XAERDIFF => NULL(), &
+                 XAERHEIGHT => NULL(), &
+                 XVDEPOC => NULL(), &
+                 XT0SCAV => NULL(), &
+                 XTREF => NULL(), &
+                 XNDO => NULL(), &
+                 XMUA0 => NULL(), &
+                 XT_SUTH_A => NULL(), &
+                 XMFPA0 => NULL(), &
+                 XVISCW => NULL(), &
+                 XRHO00 => NULL(), &
+                 XCEXVT => NULL()
+
+REAL, DIMENSION(:), POINTER :: XIFN_CONC => NULL(), &
+                               XMDIAM_IFN => NULL(), &
+                               XSIGMA_IFN => NULL(), &
+                               XRHO_IFN => NULL(), &
+                               XFRAC_REF => NULL(), &
+                               XT0 => NULL(), &
+                               XDT0 => NULL(), &
+                               XDSI0 => NULL(), &
+                               XH => NULL(), &
+                               XAREA1 => NULL(), &
+                               XTX1 => NULL(), &
+                               XTX2 => NULL(), &
+                               XABSCISS => NULL(), &
+                               XWEIGHT => NULL(), &
+                               XCCN_CONC => NULL(), &
+                               XR_MEAN_CCN => NULL(), &
+                               XLOGSIG_CCN => NULL(), &
+                               XRHO_CCN => NULL(), &
+                               XKHEN_MULTI => NULL(), &
+                               XMUHEN_MULTI => NULL(), &
+                               XBETAHEN_MULTI => NULL(), &
+                               XLIMIT_FACTOR => NULL(), &
+                               XRTMIN => NULL(), &
+                               XCTMIN => NULL(), &
+                               XLB => NULL(), &
+                               XLBEX => NULL(), &
+                               XD => NULL(), &
+                               XFSEDR => NULL(), &
+                               XFSEDC => NULL()
+
+REAL, DIMENSION(:,:),  POINTER :: XFRAC => NULL()
+REAL, DIMENSION(:,:,:), POINTER :: XCONC_CCN_TOT => NULL()
+
+INTEGER, DIMENSION(:), POINTER :: NIMM => NULL(), &
+                                  NINDICE_CCN_IMM => NULL(), &
+                                  NSPLITSED => NULL()
+
+CHARACTER(LEN=8), POINTER :: CIFN_SPECIES => NULL()
+CHARACTER(LEN=8), POINTER :: CINT_MIXING => NULL()
+CHARACTER(LEN=4), POINTER :: CPRISTINE_ICE_LIMA => NULL()
+CHARACTER(LEN=4), POINTER :: CHEVRIMED_ICE_LIMA => NULL()
+CHARACTER(LEN=8), POINTER :: CCCN_MODES => NULL()
+CHARACTER(LEN=3), POINTER :: HPARAM_CCN => NULL()
+CHARACTER(LEN=3), POINTER :: HINI_CCN => NULL()
+CHARACTER(LEN=10), DIMENSION(:), POINTER :: HTYPE_CCN
+
+NAMELIST/NAM_PARAM_LIMA/LNUCL, LSEDI, LHHONI, LMEYERS,                     &         
+                        NMOM_I, NMOM_S, NMOM_G, NMOM_H,                    & 
+                        NMOD_IFN, XIFN_CONC, LIFN_HOM,                     &
+                        CIFN_SPECIES, CINT_MIXING, NMOD_IMM, NIND_SPECIE,  &
+                        LSNOW_T, CPRISTINE_ICE_LIMA, CHEVRIMED_ICE_LIMA,   &                                   
+                        !XALPHAI, XNUI, XALPHAS, XNUS, XALPHAG, XNUG,       &    
+                        XFACTNUC_DEP, XFACTNUC_CON, NPHILLIPS,             &    
+                        LCIBU, XNDEBRIS_CIBU, LRDSF, LMURAKAMI,            &                                         
+                        LACTI, LSEDC, LACTIT, LSPRO,                       &                                         
+                        LADJ, LKHKO, LKESSLERAC, NMOM_C, NMOM_R,           &                                         
+                        NMOD_CCN, XCCN_CONC,                               &                                         
+                        LCCN_HOM, CCCN_MODES, HINI_CCN, HTYPE_CCN,         &                                         
+                        XALPHAC, XNUC, XALPHAR, XNUR,                      &                                         
+                        XFSOLUB_CCN, XACTEMP_CCN, XAERDIFF, XAERHEIGHT,    &                                         
+                        LSCAV, LAERO_MASS, LDEPOC, XVDEPOC, LACTTKE,       &                                         
+                        LPTSPLIT, LFEEDBACKT, NMAXITER, XMRSTEP, XTSTEP_TS
+
+CONTAINS
+SUBROUTINE PARAM_LIMA_ASSOCIATE()
+IMPLICIT NONE
+
+IF(.NOT. ASSOCIATED(LLIMA_DIAG)) THEN
+  LLIMA_DIAG         => PARAM_LIMA%LLIMA_DIAG          
+  LPTSPLIT           => PARAM_LIMA%LPTSPLIT
+  LFEEDBACKT         => PARAM_LIMA%LFEEDBACKT
+  LNUCL              => PARAM_LIMA%LNUCL
+  LSEDI              => PARAM_LIMA%LSEDI
+  LHHONI             => PARAM_LIMA%LHHONI
+  LMEYERS            => PARAM_LIMA%LMEYERS
+  LCIBU              => PARAM_LIMA%LCIBU
+  LRDSF              => PARAM_LIMA%LRDSF
+  LIFN_HOM           => PARAM_LIMA%LIFN_HOM
+  LSNOW_T            => PARAM_LIMA%LSNOW_T
+  LMURAKAMI          => PARAM_LIMA%LMURAKAMI
+  LACTI              => PARAM_LIMA%LACTI
+  LSEDC              => PARAM_LIMA%LSEDC
+  LACTIT             => PARAM_LIMA%LACTIT
+  LDEPOC             => PARAM_LIMA%LDEPOC
+  LACTTKE            => PARAM_LIMA%LACTTKE
+  LADJ               => PARAM_LIMA%LADJ
+  LSPRO              => PARAM_LIMA%LSPRO
+  LKHKO              => PARAM_LIMA%LKHKO
+  LKESSLERAC         => PARAM_LIMA%LKESSLERAC
+  LCCN_HOM           => PARAM_LIMA%LCCN_HOM
+  LSCAV              => PARAM_LIMA%LSCAV
+  LAERO_MASS         => PARAM_LIMA%LAERO_MASS
+
+  NMAXITER           => PARAM_LIMA%NMAXITER
+  NMOM_I             => PARAM_LIMA%NMOM_I
+  NMOM_S             => PARAM_LIMA%NMOM_S
+  NMOM_G             => PARAM_LIMA%NMOM_G
+  NMOM_H             => PARAM_LIMA%NMOM_H
+  NMOD_IFN           => PARAM_LIMA%NMOD_IFN
+  NMOD_IMM           => PARAM_LIMA%NMOD_IMM
+  NIND_SPECIE        => PARAM_LIMA%NIND_SPECIE
+  NSPECIE            => PARAM_LIMA%NSPECIE
+  NPHILLIPS          => PARAM_LIMA%NPHILLIPS
+  NDIAM              => PARAM_LIMA%NDIAM
+  NMOM_C             => PARAM_LIMA%NMOM_C
+  NMOM_R             => PARAM_LIMA%NMOM_R
+  NMOD_CCN           => PARAM_LIMA%NMOD_CCN
+  NDIAMR             => PARAM_LIMA%NDIAMR
+  NDIAMP             => PARAM_LIMA%NDIAMP
+
+  XMRSTEP            => PARAM_LIMA%XMRSTEP
+  XTSTEP_TS          => PARAM_LIMA%XTSTEP_TS
+  XALPHAI            => PARAM_LIMA%XALPHAI
+  XNUI               => PARAM_LIMA%XNUI
+  XALPHAS            => PARAM_LIMA%XALPHAS
+  XNUS               => PARAM_LIMA%XNUS
+  XALPHAG            => PARAM_LIMA%XALPHAG
+  XNUG               => PARAM_LIMA%XNUG
+  XSW0               => PARAM_LIMA%XSW0
+  XRHO_CFDC          => PARAM_LIMA%XRHO_CFDC
+  XGAMMA             => PARAM_LIMA%XGAMMA
+  XFACTNUC_DEP       => PARAM_LIMA%XFACTNUC_DEP
+  XFACTNUC_CON       => PARAM_LIMA%XFACTNUC_CON
+  XNDEBRIS_CIBU      => PARAM_LIMA%XNDEBRIS_CIBU
+  XALPHAR            => PARAM_LIMA%XALPHAR
+  XNUR               => PARAM_LIMA%XNUR
+  XALPHAC            => PARAM_LIMA%XALPHAC
+  XNUC               => PARAM_LIMA%XNUC
+  XFSOLUB_CCN        => PARAM_LIMA%XFSOLUB_CCN
+  XACTEMP_CCN        => PARAM_LIMA%XACTEMP_CCN
+  XAERDIFF           => PARAM_LIMA%XAERDIFF
+  XAERHEIGHT         => PARAM_LIMA%XAERHEIGHT
+  XVDEPOC            => PARAM_LIMA%XVDEPOC
+  XT0SCAV            => PARAM_LIMA%XT0SCAV
+  XTREF              => PARAM_LIMA%XTREF
+  XNDO               => PARAM_LIMA%XNDO
+  XMUA0              => PARAM_LIMA%XMUA0
+  XT_SUTH_A          => PARAM_LIMA%XT_SUTH_A
+  XMFPA0             => PARAM_LIMA%XMFPA0
+  XVISCW             => PARAM_LIMA%XVISCW
+  XRHO00             => PARAM_LIMA%XRHO00
+  XCEXVT             => PARAM_LIMA%XCEXVT
+
+  XIFN_CONC          => PARAM_LIMA%XIFN_CONC
+  XT0                => PARAM_LIMA%XT0
+  XDT0               => PARAM_LIMA%XDT0
+  XDSI0              => PARAM_LIMA%XDSI0
+  XH                 => PARAM_LIMA%XH
+  XAREA1             => PARAM_LIMA%XAREA1
+  XTX1               => PARAM_LIMA%XTX1
+  XTX2               => PARAM_LIMA%XTX2
+  XCCN_CONC          => PARAM_LIMA%XCCN_CONC
+  XLB                => PARAM_LIMA%XLB
+  XLBEX              => PARAM_LIMA%XLBEX
+  XD                 => PARAM_LIMA%XD
+  XFSEDR             => PARAM_LIMA%XFSEDR
+  XFSEDC             => PARAM_LIMA%XFSEDC
+
+  NSPLITSED          => PARAM_LIMA%NSPLITSED
+
+  CIFN_SPECIES       => PARAM_LIMA%CIFN_SPECIES
+  CINT_MIXING        => PARAM_LIMA%CINT_MIXING
+  CPRISTINE_ICE_LIMA => PARAM_LIMA%CPRISTINE_ICE_LIMA
+  CHEVRIMED_ICE_LIMA => PARAM_LIMA%CHEVRIMED_ICE_LIMA
+  CCCN_MODES         => PARAM_LIMA%CCCN_MODES
+  HPARAM_CCN         => PARAM_LIMA%HPARAM_CCN
+  HINI_CCN           => PARAM_LIMA%HINI_CCN
+  HTYPE_CCN          => PARAM_LIMA%HTYPE_CCN
+ENDIF
+END SUBROUTINE PARAM_LIMA_ASSOCIATE
+!
+SUBROUTINE PARAM_LIMA_DEALLOCATE(HNAME)
+  IMPLICIT NONE
+  CHARACTER(LEN=*), INTENT(IN) :: HNAME
+  SELECT CASE(TRIM(HNAME))
+    CASE('NINDICE_CCN_IMM')
+      DEALLOCATE(PARAM_LIMA%NINDICE_CCN_IMM)
+      NINDICE_CCN_IMM => NULL()
+  END SELECT
+END SUBROUTINE PARAM_LIMA_DEALLOCATE
+!
+SUBROUTINE PARAM_LIMA_ALLOCATE(HNAME, KDIM1, KDIM2, KDIM3)
+  IMPLICIT NONE
+  CHARACTER(LEN=*), INTENT(IN)  :: HNAME
+  INTEGER, INTENT(IN)           :: KDIM1
+  INTEGER, OPTIONAL, INTENT(IN) :: KDIM2
+  INTEGER, OPTIONAL, INTENT(IN) :: KDIM3
+
+  SELECT CASE(TRIM(HNAME))
+    !1D arrays
+    CASE('NIMM')
+      ALLOCATE(PARAM_LIMA%NIMM(KDIM1))
+      NIMM => PARAM_LIMA%NIMM
+    CASE('NINDICE_CCN_IMM')
+      ALLOCATE(PARAM_LIMA%NINDICE_CCN_IMM(KDIM1))
+      NINDICE_CCN_IMM => PARAM_LIMA%NINDICE_CCN_IMM
+    CASE('XMDIAM_IFN')
+      ALLOCATE(PARAM_LIMA%XMDIAM_IFN(KDIM1))
+      XMDIAM_IFN => PARAM_LIMA%XMDIAM_IFN
+    CASE('XSIGMA_IFN')
+      ALLOCATE(PARAM_LIMA%XSIGMA_IFN(KDIM1))
+      XSIGMA_IFN => PARAM_LIMA%XSIGMA_IFN
+    CASE('XRHO_IFN')
+      ALLOCATE(PARAM_LIMA%XRHO_IFN(KDIM1))
+      XRHO_IFN => PARAM_LIMA%XRHO_IFN
+    CASE('XFRAC_REF')
+      ALLOCATE(PARAM_LIMA%XFRAC_REF(KDIM1))
+      XFRAC_REF => PARAM_LIMA%XFRAC_REF
+    CASE('XABSCISS')
+      ALLOCATE(PARAM_LIMA%XABSCISS(KDIM1))
+      XABSCISS => PARAM_LIMA%XABSCISS
+    CASE('XWEIGHT')
+      ALLOCATE(PARAM_LIMA%XWEIGHT(KDIM1))
+      XWEIGHT => PARAM_LIMA%XWEIGHT
+    CASE('XR_MEAN_CCN')
+      ALLOCATE(PARAM_LIMA%XR_MEAN_CCN(KDIM1))
+      XR_MEAN_CCN => PARAM_LIMA%XR_MEAN_CCN
+    CASE('XLOGSIG_CCN')
+      ALLOCATE(PARAM_LIMA%XLOGSIG_CCN(KDIM1))
+      XLOGSIG_CCN => PARAM_LIMA%XLOGSIG_CCN
+    CASE('XRHO_CCN')
+      ALLOCATE(PARAM_LIMA%XRHO_CCN(KDIM1))
+      XRHO_CCN => PARAM_LIMA%XRHO_CCN
+    CASE('XKHEN_MULTI')
+      ALLOCATE(PARAM_LIMA%XKHEN_MULTI(KDIM1))
+      XKHEN_MULTI => PARAM_LIMA%XKHEN_MULTI
+    CASE('XMUHEN_MULTI')
+      ALLOCATE(PARAM_LIMA%XMUHEN_MULTI(KDIM1))
+      XMUHEN_MULTI => PARAM_LIMA%XMUHEN_MULTI
+    CASE('XBETAHEN_MULTI')
+      ALLOCATE(PARAM_LIMA%XBETAHEN_MULTI(KDIM1))
+      XBETAHEN_MULTI => PARAM_LIMA%XBETAHEN_MULTI
+    CASE('XLIMIT_FACTOR')
+      ALLOCATE(PARAM_LIMA%XLIMIT_FACTOR(KDIM1))
+      XLIMIT_FACTOR => PARAM_LIMA%XLIMIT_FACTOR
+    CASE('XRTMIN')
+      ALLOCATE(PARAM_LIMA%XRTMIN(KDIM1))
+      XRTMIN => PARAM_LIMA%XRTMIN
+    CASE('XCTMIN')
+      ALLOCATE(PARAM_LIMA%XCTMIN(KDIM1))
+      XCTMIN => PARAM_LIMA%XCTMIN
+    !
+    !2D arrays
+    CASE('XFRAC')
+      ALLOCATE(PARAM_LIMA%XFRAC(KDIM1, KDIM2))
+      XFRAC => PARAM_LIMA%XFRAC
+    !
+    !3D arrays
+!    CASE('XCONC_CCN_TOT')
+!      ALLOCATE(PARAM_LIMA%XCONC_CCN_TOT(KDIM1, KDIM2))
+!      XCONC_CCN_TOT => PARAM_LIMA%XCONC_CCN_TOT
+  END SELECT
+END SUBROUTINE PARAM_LIMA_ALLOCATE
+!
+SUBROUTINE PARAM_LIMA_INIT(HPROGRAM, KUNITNML, LDNEEDNAM, KLUOUT, &
+                          &LDDEFAULTVAL, LDREADNAM, LDCHECK, KPRINT)
+!!*** *PARAM_ICEN_INIT* - Code needed to initialize the MODD_PARAM_LIMA module
+!!
+!!*   PURPOSE
+!!    -------
+!!    Sets the default values, reads the namelist, performs the checks and prints
+!!
+!!*   METHOD
+!!    ------
+!!    0. Declarations
+!!       1. Declaration of arguments
+!!       2. Declaration of local variables
+!!    1. Default values
+!!    2. Namelist
+!!    3. Checks
+!!    4. Prints
+!!
+!!    AUTHOR
+!!    ------
+!!    S. Riette
+!!
+!!    MODIFICATIONS
+!!    -------------
+!!      Original    Apr 2023
+!-------------------------------------------------------------------------------
+!
+!*      0. DECLARATIONS
+!       ---------------
+!
+USE MODE_POSNAM_PHY, ONLY: POSNAM_PHY
+USE MODE_MSG, ONLY: PRINT_MSG, NVERB_FATAL
+USE MODE_CHECK_NAM_VAL, ONLY: CHECK_NAM_VAL_CHAR
+!
+IMPLICIT NONE
+!
+!* 0.1. Declaration of arguments
+!       ------------------------
+!
+CHARACTER(LEN=6),  INTENT(IN) :: HPROGRAM     !< Name of the calling program
+INTEGER,           INTENT(IN) :: KUNITNML     !< Logical unit to access the namelist
+LOGICAL,           INTENT(IN) :: LDNEEDNAM    !< True to abort if namelist is absent
+INTEGER,           INTENT(IN) :: KLUOUT       !< Logical unit for outputs
+LOGICAL, OPTIONAL, INTENT(IN) :: LDDEFAULTVAL !< Must we initialize variables with default values (defaults to .TRUE.)
+LOGICAL, OPTIONAL, INTENT(IN) :: LDREADNAM    !< Must we read the namelist (defaults to .TRUE.)
+LOGICAL, OPTIONAL, INTENT(IN) :: LDCHECK      !< Must we perform some checks on values (defaults to .TRUE.)
+INTEGER, OPTIONAL, INTENT(IN) :: KPRINT       !< Print level (defaults to 0): 0 for no print, 1 to safely print namelist,
+                                              !! 2 to print informative messages
+!
+!* 0.2 Declaration of local variables
+!      ------------------------------
+!
+LOGICAL :: LLDEFAULTVAL, LLREADNAM, LLCHECK, LLFOUND
+INTEGER :: IPRINT 
+ 
+LLDEFAULTVAL=.TRUE. 
+LLREADNAM=.TRUE. 
+LLCHECK=.TRUE. 
+IPRINT=0 
+IF(PRESENT(LDDEFAULTVAL)) LLDEFAULTVAL=LDDEFAULTVAL 
+IF(PRESENT(LDREADNAM   )) LLREADNAM   =LDREADNAM 
+IF(PRESENT(LDCHECK     )) LLCHECK     =LDCHECK 
+IF(PRESENT(KPRINT      )) IPRINT      =KPRINT 
+! 
+!*      1. DEFAULT VALUES 
+!       ----------------- 
+! 
+IF(LLDEFAULTVAL) THEN 
+  !NOTES ON GENERAL DEFAULTS AND MODEL-SPECIFIC DEFAULTS :
+  !- General default values *MUST* remain unchanged.
+  !- To change the default value for a given application,                                                 
+  !  an "IF(HPROGRAM=='...')" condition must be used.
+
+  LNUCL=.TRUE.
+  LSEDI=.TRUE.
+  LHHONI = .FALSE.
+  LMEYERS = .FALSE.
+  NMOM_I = 2
+  NMOM_S = 1
+  NMOM_G = 1
+  NMOM_H = 0
+  NMOD_IFN = 1
+  XIFN_CONC(:) = 100.
+  LIFN_HOM = .TRUE.
+  CIFN_SPECIES = 'PHILLIPS'
+  CINT_MIXING = 'DM2'
+  NMOD_IMM = 0
+  NIND_SPECIE = 1
+  LSNOW_T = .FALSE.
+  CPRISTINE_ICE_LIMA = 'PLAT'
+  CHEVRIMED_ICE_LIMA = 'GRAU'
+  !XALPHAI=
+  !XNUI=
+  !XALPHAS=
+  !XNUS=
+  !XALPHAG=
+  !XNUG=
+  XFACTNUC_DEP = 1.0
+  XFACTNUC_CON = 1.0
+  NPHILLIPS=8
+  LCIBU = .FALSE.
+  XNDEBRIS_CIBU = 50.0
+  LRDSF = .FALSE.
+  LMURAKAMI=.TRUE.
+  LACTI  = .TRUE.
+  LSEDC  = .TRUE.
+  LACTIT = .FALSE.
+  LSPRO = .FALSE.
+  LADJ   = .TRUE.
+  LKHKO  = .FALSE.
+  LKESSLERAC = .FALSE.
+  NMOM_C = 2
+  NMOM_R = 2
+  NMOD_CCN = 1
+  XCCN_CONC(:)=300.
+  LCCN_HOM = .TRUE.
+  CCCN_MODES = 'COPT'
+  HINI_CCN   = 'AER'
+  HTYPE_CCN(:) = 'M'
+  XALPHAC = 3.0
+  XNUC    = 1.0
+  XALPHAR = 1.0
+  XNUR    = 2.0
+  XFSOLUB_CCN = 1.0
+  XACTEMP_CCN = 280.
+  XAERDIFF    = 0.0
+  XAERHEIGHT  = 2000.
+  LSCAV      = .FALSE.
+  LAERO_MASS = .FALSE.
+  LDEPOC = .TRUE.
+  XVDEPOC = 0.02 ! 2 cm/s
+  LACTTKE = .TRUE.
+  LPTSPLIT     = .TRUE.
+  LFEEDBACKT = .TRUE.
+  NMAXITER  =  5
+  XMRSTEP    = 0.005
+  XTSTEP_TS  = 20.
+ENDIF
+!
+!*      2. NAMELIST
+!       -----------
+!
+IF(LLREADNAM) THEN
+  CALL POSNAM_PHY(KUNITNML, 'NAM_PARAM_LIMA', LDNEEDNAM, LLFOUND, KLUOUT)
+  IF(LLFOUND) READ(UNIT=KUNITNML, NML=NAM_PARAM_LIMA)
+ENDIF
+!
+!*      3. CHECKS
+!       ---------
+!
+IF(LLCHECK) THEN
+  CALL CHECK_NAM_VAL_CHAR(KLUOUT, 'CPRISTINE_ICE_LIMA', CPRISTINE_ICE_LIMA, &
+                                                'PLAT', 'COLU', 'BURO')
+  CALL CHECK_NAM_VAL_CHAR(KLUOUT, 'CHEVRIMED_ICE_LIMA', CHEVRIMED_ICE_LIMA, &
+                                                'GRAU', 'HAIL')
+
+  IF ((LACTI .AND. HINI_CCN  == 'XXX')) THEN
+    CALL PRINT_MSG(NVERB_FATAL, 'GEN', 'MODD_PARAM_LIMA', &
+           &"YOU WANT TO USE A 2-MOMENT MICROPHYSICAL " // &
+           &" SCHEME BUT YOU DIDNT FILL CORRECTLY NAM_PARAM_LIMA" // &
+           &" YOU HAVE TO FILL HINI_CCN ")
+  END IF
+
+  IF(LACTI .AND. NMOD_CCN == 0) THEN
+    CALL PRINT_MSG(NVERB_FATAL, 'GEN', 'MODD_PARAM_LIMA', &
+           &"ACTIVATION OF AEROSOL PARTICLES IS NOT " // &
+           &"POSSIBLE IF NMOD_CCN HAS VALUE ZERO. YOU HAVE TO SET AN UPPER " // &
+           &"VALUE OF NMOD_CCN IN ORDER TO USE LIMA WARM ACTIVATION SCHEME.") 
+  END IF
+
+  IF(LNUCL .AND. NMOD_IFN == 0 .AND. (.NOT.LMEYERS)) THEN
+    CALL PRINT_MSG(NVERB_FATAL, 'GEN', 'MODD_PARAM_LIMA', &
+           &"NUCLEATION BY DEPOSITION AND CONTACT IS NOT " // &
+           &"POSSIBLE IF NMOD_IFN HAS VALUE ZERO. YOU HAVE TO SET AN UPPER" //  &
+           &"VALUE OF NMOD_IFN IN ORDER TO USE LIMA COLD NUCLEATION SCHEME.") 
+  END IF
+
+  IF(HPROGRAM=='AROME' .OR. HPROGRAM=='PHYEX') THEN
+    IF(.NOT. LPTSPLIT) THEN
+      CALL PRINT_MSG(NVERB_FATAL, 'GEN', 'MODD_PARAM_LIMA', &
+           &"LPTSPLIT must be .TRUE. with this program: " // HPROGRAM)
+    ENDIF
+    IF(LSPRO) THEN
+      CALL PRINT_MSG(NVERB_FATAL, 'GEN', 'MODD_PARAM_LIMA', &
+           &"LSPRO must be .FALSE. with this program: " // HPROGRAM)
+    ENDIF
+  ENDIF
+ENDIF
+!
+!*      3. PRINTS
+!       ---------
+!
+IF(IPRINT>=1) THEN
+  WRITE(UNIT=KLUOUT, NML=NAM_PARAM_LIMA)
+ENDIF
+!
+END SUBROUTINE PARAM_LIMA_INIT
 !
 END MODULE MODD_PARAM_LIMA
diff --git a/src/PHYEX/micro/modd_param_lima_cold.f90 b/src/PHYEX/micro/modd_param_lima_cold.f90
index 337480312280e054f1abdaabadfa4ca829fda3ae..3134e583f585419a5121808a9ac0fd302a1b9e89 100644
--- a/src/PHYEX/micro/modd_param_lima_cold.f90
+++ b/src/PHYEX/micro/modd_param_lima_cold.f90
@@ -6,9 +6,9 @@
 !     ###########################
       MODULE MODD_PARAM_LIMA_COLD
 !     ###########################
-!
+!> @file
 !!****  *MODD_PARAM_LIMA_COLD* - declaration of some descriptive parameters and
-!!                               microphysical factors extensively used in 
+!!                               microphysical factors extensively used in
 !!                               the LIMA cold scheme.
 !!    AUTHOR
 !!    ------
@@ -18,7 +18,7 @@
 !!
 !!    MODIFICATIONS
 !!    -------------
-!!      Original             ??/??/13 
+!!      Original             ??/??/13
 !!      C. Barthe            14/03/2022  add CIBU and RDSF
 !       J. Wurtz                03/2022: new snow characteristics
 !       M. Taufour              07/2022: add concentration for snow, graupel, hail
@@ -26,13 +26,13 @@
 !-------------------------------------------------------------------------------
 USE MODD_PARAMETERS, ONLY: JPSVNAMELGTMAX
 !
-IMPLICIT NONE 
+IMPLICIT NONE
 !
 !*       1.   DESCRIPTIVE PARAMETERS
 !             ----------------------
 !
 !     Declaration of microphysical constants, including the descriptive
-!     parameters for the raindrop and the ice crystal habits, and the 
+!     parameters for the raindrop and the ice crystal habits, and the
 !     parameters relevant of the dimensional distributions.
 !
 !         m(D)    = XAx * D**XBx      : Mass-MaxDim relationship
@@ -43,109 +43,379 @@ IMPLICIT NONE
 !
 !              and
 !
-!         XALPHAx, XNUx                        : Generalized GAMMA law 
-!         Lbda = XLBx * (r_x*rho_dref)**XLBEXx : Slope parameter of the 
+!         XALPHAx, XNUx                        : Generalized GAMMA law
+!         Lbda = XLBx * (r_x*rho_dref)**XLBEXx : Slope parameter of the
 !                                                distribution law
 !
-REAL,SAVE :: XLBEXI,XLBI              ! Prist. ice     distribution parameters
-REAL,SAVE :: XLBEXS,XLBS,XNS          ! Snow/agg.      distribution parameters
+TYPE PARAM_LIMA_COLD_t
+REAL      :: XLBEXI,XLBI              ! Prist. ice     distribution parameters
+REAL      :: XLBEXS,XLBS,XNS          ! Snow/agg.      distribution parameters
 !
-REAL,SAVE :: XAI,XBI,XC_I,XDI         ,XF0I,XF2I,XC1I ! Cloud ice      charact.
-REAL,SAVE ::                           XF0IS,XF1IS    ! (large Di vent. coef.)
-REAL,SAVE :: XAS,XBS,XCS,XDS,XCCS,XCXS,XF0S,XF1S,XC1S ! Snow/agg.      charact.
+REAL      :: XAI,XBI,XC_I,XDI         ,XF0I,XF2I,XC1I ! Cloud ice      charact.
+REAL      ::                           XF0IS,XF1IS    ! (large Di vent. coef.)
+REAL      :: XAS,XBS,XCS,XDS,XCCS,XCXS,XF0S,XF1S,XC1S ! Snow/agg.      charact.
 !
-REAL,SAVE :: XLBDAS_MIN, XLBDAS_MAX   ! Max values allowed for the shape parameter of snow
-REAL,SAVE :: XFVELOS                  ! Wurtz - snow fall speed parameterizaed after Thompson 2008
-REAL,SAVE :: XTRANS_MP_GAMMAS         ! Wurtz - change between lambda value for MP and gen. gamma
+REAL      :: XLBDAS_MIN, XLBDAS_MAX   ! Max values allowed for the shape parameter of snow
+REAL      :: XFVELOS                  ! Wurtz - snow fall speed parameterizaed after Thompson 2008
+REAL      :: XTRANS_MP_GAMMAS         ! Wurtz - change between lambda value for MP and gen. gamma
 !
-CHARACTER(LEN=JPSVNAMELGTMAX),DIMENSION(8),PARAMETER &
-                              :: CLIMA_COLD_NAMES=(/'CICE    ','CSNOW   ','CGRAUPEL','CHAIL   ',&
-                                                        'CIFNFREE','CIFNNUCL', &
-                                                        'CCNINIMM','CCCNNUCL'/)
-                                 ! basenames of the SV articles stored
-                                 ! in the binary files
-                                 !with IF:Ice-nuclei Free (nonactivated IFN by Dep/Cond)
-                                 !     IN:Ice-nuclei Nucleated (activated IFN by Dep/Cond)
-                                 !     NI:Nuclei Immersed (activated IFN by Imm)
-                                 !     HF:Homogeneous Freezing
-CHARACTER(LEN=JPSVNAMELGTMAX),DIMENSION(8),PARAMETER &
-                              :: CLIMA_COLD_CONC=(/'NI ','NS ','NG ','NH ','NIF','NIN','NNI','NNH'/)!for DIAG
 !
 !-------------------------------------------------------------------------------
 !
 !*       2.   MICROPHYSICAL FACTORS
 !             ---------------------
 !
-REAL,SAVE :: XFSEDRI,XFSEDCI,                  & ! Constants for sedimentation
-             XFSEDRS,XFSEDCS,                  & !         
-    	     XFSEDS, XEXSEDS                     ! fluxes of ice and snow
+REAL      :: XFSEDRI,XFSEDCI,                  & ! Constants for sedimentation
+             XFSEDRS,XFSEDCS,                  & !
+             XFSEDS, XEXSEDS                     ! fluxes of ice and snow
 !
-REAL,SAVE :: XNUC_DEP,XEXSI_DEP,XEX_DEP,       & ! Constants for heterogeneous
+REAL      :: XNUC_DEP,XEXSI_DEP,XEX_DEP,       & ! Constants for heterogeneous
              XNUC_CON,XEXTT_CON,XEX_CON,       & ! ice nucleation : DEP et CON
              XMNU0                               ! mass of nucleated ice crystal
 !
-REAL,SAVE :: XRHOI_HONH,XCEXP_DIFVAP_HONH,     & ! Constants for homogeneous
+REAL      :: XRHOI_HONH,XCEXP_DIFVAP_HONH,     & ! Constants for homogeneous
              XCOEF_DIFVAP_HONH,XRCOEF_HONH,    & ! haze freezing : HHONI
              XCRITSAT1_HONH,XCRITSAT2_HONH,    &
              XTMIN_HONH,XTMAX_HONH,            &
              XDLNJODT1_HONH,XDLNJODT2_HONH,    &
              XC1_HONH,XC2_HONH,XC3_HONH
 !
-REAL,SAVE :: XC_HONC,XR_HONC,                  & ! Constants for homogeneous
+REAL      :: XC_HONC,XR_HONC,                  & ! Constants for homogeneous
              XTEXP1_HONC,XTEXP2_HONC,          & ! droplet freezing : CHONI
              XTEXP3_HONC,XTEXP4_HONC,          &
              XTEXP5_HONC
 !
-REAL,SAVE :: XCSCNVI_MAX, XLBDASCNVI_MAX,      &
+REAL      :: XCSCNVI_MAX, XLBDASCNVI_MAX,      &
              XRHORSMIN,                        &
              XDSCNVI_LIM, XLBDASCNVI_LIM,      & ! Constants for snow
              XC0DEPSI,XC1DEPSI,                & ! sublimation conversion to
              XR0DEPSI,XR1DEPSI                   ! pristine ice : SCNVI
 !
-REAL,SAVE :: XSCFAC,                           & ! Constants for the Bergeron
+REAL      :: XSCFAC,                           & ! Constants for the Bergeron
              X0DEPI,X2DEPI,                    & ! Findeisen process and
              X0DEPS,X1DEPS,XEX0DEPS,XEX1DEPS     ! deposition
 !
-REAL,SAVE :: XDICNVS_LIM, XLBDAICNVS_LIM,      & ! Constants for pristine ice
+REAL      :: XDICNVS_LIM, XLBDAICNVS_LIM,      & ! Constants for pristine ice
              XC0DEPIS,XC1DEPIS,                & ! deposition conversion to
              XR0DEPIS,XR1DEPIS                   ! snow : ICNVS
 !
-REAL,SAVE :: XCOLEXIS,                         & ! Constants for snow 
-    	     XAGGS_CLARGE1,XAGGS_CLARGE2,      & ! aggregation : AGG
+REAL      :: XCOLEXIS,                         & ! Constants for snow
+             XAGGS_CLARGE1,XAGGS_CLARGE2,      & ! aggregation : AGG
              XAGGS_RLARGE1,XAGGS_RLARGE2,      &
              XFIAGGS,XEXIAGGS
 !
-REAL,SAVE :: XACCS1, XSPONBUDS1, XSPONBUDS2,   & ! Constant for snow
+REAL      :: XACCS1, XSPONBUDS1, XSPONBUDS2,   & ! Constant for snow
              XSPONBUDS3, XSPONCOEFS2             ! spontaneous break-up
 !
 !??????????????????
-REAL,SAVE :: XKER_ZRNIC_A1,XKER_ZRNIC_A2         ! Long-Zrnic Kernels (ini_ice_coma)
+REAL      :: XKER_ZRNIC_A1,XKER_ZRNIC_A2         ! Long-Zrnic Kernels (ini_ice_coma)
 !
-REAL,SAVE :: XSELFI,XCOLEXII                     ! Constants for pristine ice
+REAL      :: XSELFI,XCOLEXII                     ! Constants for pristine ice
                                                  ! self-collection (ini_ice_coma)
 !
-REAL,DIMENSION(:,:), SAVE, ALLOCATABLE :: XKER_N_SSCS
-REAL,SAVE :: XCOLSS,XCOLEXSS,XFNSSCS,          & !
+REAL,DIMENSION(:,:), ALLOCATABLE :: XKER_N_SSCS
+REAL      :: XCOLSS,XCOLEXSS,XFNSSCS,          & !
              XLBNSSCS1,XLBNSSCS2,              & ! Constants for snow self collection
-             XSCINTP1S,XSCINTP2S                 ! 
-INTEGER,SAVE :: NSCLBDAS                         !
+             XSCINTP1S,XSCINTP2S                 !
+INTEGER      :: NSCLBDAS                         !
 
-REAL,SAVE :: XAUTO3, XAUTO4,                   & ! Constants for pristine ice
+REAL      :: XAUTO3, XAUTO4,                   & ! Constants for pristine ice
              XLAUTS,   XLAUTS_THRESHOLD,       & ! autoconversion : AUT
-             XITAUTS, XITAUTS_THRESHOLD,       & ! (ini_ice_com) 
+             XITAUTS, XITAUTS_THRESHOLD,       & ! (ini_ice_com)
              XTEXAUTI
 !
-REAL,SAVE :: XCONCI_MAX                          ! Limitation of the pristine 
-                                   ! ice concentration (init and grid-nesting) 
-REAL,SAVE :: XFREFFI  ! Factor to compute the cloud ice effective radius
+REAL      :: XCONCI_MAX                          ! Limitation of the pristine
+                                   ! ice concentration (init and grid-nesting)
+REAL      :: XFREFFI  ! Factor to compute the cloud ice effective radius
 !
 ! For ICE4 nucleation
-REAL, SAVE :: XALPHA1
-REAL, SAVE :: XALPHA2
-REAL, SAVE :: XBETA1
-REAL, SAVE :: XBETA2
-REAL, SAVE :: XNU10
-REAL, SAVE :: XNU20
+REAL      :: XALPHA1
+REAL      :: XALPHA2
+REAL      :: XBETA1
+REAL      :: XBETA2
+REAL      :: XNU10
+REAL      :: XNU20
+END TYPE PARAM_LIMA_COLD_t
+!
+TYPE(PARAM_LIMA_COLD_t), TARGET, SAVE :: PARAM_LIMA_COLD
+!
+REAL, POINTER :: XLBEXI => NULL(), &
+                 XLBI => NULL(), &
+                 XLBEXS => NULL(), &
+                 XLBS => NULL(), &
+                 XNS => NULL(), &
+                 XAI => NULL(), &
+                 XBI => NULL(), &
+                 XC_I => NULL(), &
+                 XDI => NULL(), &
+                 XF0I => NULL(), &
+                 XF2I => NULL(), &
+                 XC1I => NULL(), &
+                 XF0IS => NULL(), &
+                 XF1IS => NULL(), &
+                 XAS => NULL(), &
+                 XBS => NULL(), &
+                 XCS => NULL(), &
+                 XDS => NULL(), &
+                 XCCS => NULL(), &
+                 XCXS => NULL(), &
+                 XF0S => NULL(), &
+                 XF1S => NULL(), &
+                 XC1S => NULL(), &
+                 XLBDAS_MIN => NULL(), &
+                 XLBDAS_MAX => NULL(), &
+                 XFVELOS => NULL(), &
+                 XTRANS_MP_GAMMAS => NULL(), &
+                 XFSEDRI => NULL(), &
+                 XFSEDCI => NULL(), &
+                 XFSEDRS => NULL(), &
+                 XFSEDCS => NULL(), &
+                 XFSEDS => NULL(), &
+                 XEXSEDS => NULL(), &
+                 XNUC_DEP => NULL(), &
+                 XEXSI_DEP => NULL(), &
+                 XEX_DEP => NULL(), &
+                 XNUC_CON => NULL(), &
+                 XEXTT_CON => NULL(), &
+                 XEX_CON => NULL(), &
+                 XMNU0 => NULL(), &
+                 XRHOI_HONH => NULL(), &
+                 XCEXP_DIFVAP_HONH => NULL(), &
+                 XCOEF_DIFVAP_HONH => NULL(), &
+                 XRCOEF_HONH => NULL(), &
+                 XCRITSAT1_HONH => NULL(), &
+                 XCRITSAT2_HONH => NULL(), &
+                 XTMIN_HONH => NULL(), &
+                 XTMAX_HONH => NULL(), &
+                 XDLNJODT1_HONH => NULL(), &
+                 XDLNJODT2_HONH => NULL(), &
+                 XC1_HONH => NULL(), &
+                 XC2_HONH => NULL(), &
+                 XC3_HONH => NULL(), &
+                 XC_HONC => NULL(), &
+                 XR_HONC => NULL(), &
+                 XTEXP1_HONC => NULL(), &
+                 XTEXP2_HONC => NULL(), &
+                 XTEXP3_HONC => NULL(), &
+                 XTEXP4_HONC => NULL(), &
+                 XTEXP5_HONC => NULL(), &
+                 XCSCNVI_MAX => NULL(), &
+                 XLBDASCNVI_MAX => NULL(), &
+                 XRHORSMIN => NULL(), &
+                 XDSCNVI_LIM => NULL(), &
+                 XLBDASCNVI_LIM => NULL(), &
+                 XC0DEPSI => NULL(), &
+                 XC1DEPSI => NULL(), &
+                 XR0DEPSI => NULL(), &
+                 XR1DEPSI => NULL(), &
+                 XSCFAC => NULL(), &
+                 X0DEPI => NULL(), &
+                 X2DEPI => NULL(), &
+                 X0DEPS => NULL(), &
+                 X1DEPS => NULL(), &
+                 XEX0DEPS => NULL(), &
+                 XEX1DEPS => NULL(), &
+                 XDICNVS_LIM => NULL(), &
+                 XLBDAICNVS_LIM => NULL(), &
+                 XC0DEPIS => NULL(), &
+                 XC1DEPIS => NULL(), &
+                 XR0DEPIS => NULL(), &
+                 XR1DEPIS => NULL(), &
+                 XCOLEXIS => NULL(), &
+                 XAGGS_CLARGE1 => NULL(), &
+                 XAGGS_CLARGE2 => NULL(), &
+                 XAGGS_RLARGE1 => NULL(), &
+                 XAGGS_RLARGE2 => NULL(), &
+                 XFIAGGS => NULL(), &
+                 XEXIAGGS => NULL(), &
+                 XACCS1 => NULL(), &
+                 XSPONBUDS1 => NULL(), &
+                 XSPONBUDS2 => NULL(), &
+                 XSPONBUDS3 => NULL(), &
+                 XSPONCOEFS2 => NULL(), &
+                 XKER_ZRNIC_A1 => NULL(), &
+                 XKER_ZRNIC_A2 => NULL(), &
+                 XSELFI => NULL(), &
+                 XCOLEXII => NULL(), &
+                 XCOLSS => NULL(), &
+                 XCOLEXSS => NULL(), &
+                 XFNSSCS => NULL(), &
+                 XLBNSSCS1 => NULL(), &
+                 XLBNSSCS2 => NULL(), &
+                 XSCINTP1S => NULL(), &
+                 XSCINTP2S  => NULL(), &
+                 XAUTO3 => NULL(), &
+                 XAUTO4 => NULL(), &
+                 XLAUTS => NULL(), &
+                 XLAUTS_THRESHOLD => NULL(), &
+                 XITAUTS => NULL(), &
+                 XITAUTS_THRESHOLD => NULL(), &
+                 XTEXAUTI => NULL(), &
+                 XCONCI_MAX => NULL(), &
+                 XFREFFI => NULL(), &
+                 XALPHA1 => NULL(), &
+                 XALPHA2 => NULL(), &
+                 XBETA1 => NULL(), &
+                 XBETA2 => NULL(), &
+                 XNU10 => NULL(), &
+                 XNU20 => NULL()
+INTEGER, POINTER :: NSCLBDAS => NULL()
+REAL,DIMENSION(:,:),POINTER :: XKER_N_SSCS => NULL()
+CHARACTER(LEN=JPSVNAMELGTMAX),DIMENSION(8),PARAMETER &
+                              :: CLIMA_COLD_NAMES=(/'CICE    ','CSNOW   ','CGRAUPEL','CHAIL   ',&
+                                                        'CIFNFREE','CIFNNUCL', &
+                                                        'CCNINIMM','CCCNNUCL'/)
+                                 ! basenames of the SV articles stored
+                                 ! in the binary files
+                                 !with IF:Ice-nuclei Free (nonactivated IFN by Dep/Cond)
+                                 !     IN:Ice-nuclei Nucleated (activated IFN by Dep/Cond)
+                                 !     NI:Nuclei Immersed (activated IFN by Imm)
+                                 !     HF:Homogeneous Freezing
+CHARACTER(LEN=JPSVNAMELGTMAX),DIMENSION(8),PARAMETER &
+                              :: CLIMA_COLD_CONC=(/'NI ','NS ','NG ','NH ','NIF','NIN','NNI','NNH'/)!for DIAG
+
+!
+CONTAINS
+SUBROUTINE PARAM_LIMA_COLD_ASSOCIATE()
+IMPLICIT NONE
+IF(.NOT. ASSOCIATED(XLBEXI)) THEN
+  XLBEXI             => PARAM_LIMA_COLD%XLBEXI
+  XLBI               => PARAM_LIMA_COLD%XLBI
+  XLBEXS             => PARAM_LIMA_COLD%XLBEXS
+  XLBS               => PARAM_LIMA_COLD%XLBS
+  XNS                => PARAM_LIMA_COLD%XNS
+  XAI                => PARAM_LIMA_COLD%XAI
+  XBI                => PARAM_LIMA_COLD%XBI
+  XC_I               => PARAM_LIMA_COLD%XC_I
+  XDI                => PARAM_LIMA_COLD%XDI
+  XF0I               => PARAM_LIMA_COLD%XF0I
+  XF2I               => PARAM_LIMA_COLD%XF2I
+  XC1I               => PARAM_LIMA_COLD%XC1I
+  XF0IS              => PARAM_LIMA_COLD%XF0IS
+  XF1IS              => PARAM_LIMA_COLD%XF1IS
+  XAS                => PARAM_LIMA_COLD%XAS
+  XBS                => PARAM_LIMA_COLD%XBS
+  XCS                => PARAM_LIMA_COLD%XCS
+  XDS                => PARAM_LIMA_COLD%XDS
+  XCCS               => PARAM_LIMA_COLD%XCCS
+  XCXS               => PARAM_LIMA_COLD%XCXS
+  XF0S               => PARAM_LIMA_COLD%XF0S
+  XF1S               => PARAM_LIMA_COLD%XF1S
+  XC1S               => PARAM_LIMA_COLD%XC1S
+  XLBDAS_MIN         => PARAM_LIMA_COLD%XLBDAS_MIN
+  XLBDAS_MAX         => PARAM_LIMA_COLD%XLBDAS_MAX
+  XFVELOS            => PARAM_LIMA_COLD%XFVELOS
+  XTRANS_MP_GAMMAS   => PARAM_LIMA_COLD%XTRANS_MP_GAMMAS
+  XFSEDRI            => PARAM_LIMA_COLD%XFSEDRI
+  XFSEDCI            => PARAM_LIMA_COLD%XFSEDCI
+  XFSEDRS            => PARAM_LIMA_COLD%XFSEDRS
+  XFSEDCS            => PARAM_LIMA_COLD%XFSEDCS
+  XFSEDS             => PARAM_LIMA_COLD%XFSEDS
+  XEXSEDS            => PARAM_LIMA_COLD%XEXSEDS
+  XNUC_DEP           => PARAM_LIMA_COLD%XNUC_DEP
+  XEXSI_DEP          => PARAM_LIMA_COLD%XEXSI_DEP
+  XEX_DEP            => PARAM_LIMA_COLD%XEX_DEP
+  XNUC_CON           => PARAM_LIMA_COLD%XNUC_CON
+  XEXTT_CON          => PARAM_LIMA_COLD%XEXTT_CON
+  XEX_CON            => PARAM_LIMA_COLD%XEX_CON
+  XMNU0              => PARAM_LIMA_COLD%XMNU0
+  XRHOI_HONH         => PARAM_LIMA_COLD%XRHOI_HONH
+  XCEXP_DIFVAP_HONH  => PARAM_LIMA_COLD%XCEXP_DIFVAP_HONH
+  XCOEF_DIFVAP_HONH  => PARAM_LIMA_COLD%XCOEF_DIFVAP_HONH
+  XRCOEF_HONH        => PARAM_LIMA_COLD%XRCOEF_HONH
+  XCRITSAT1_HONH     => PARAM_LIMA_COLD%XCRITSAT1_HONH
+  XCRITSAT2_HONH     => PARAM_LIMA_COLD%XCRITSAT2_HONH
+  XTMIN_HONH         => PARAM_LIMA_COLD%XTMIN_HONH
+  XTMAX_HONH         => PARAM_LIMA_COLD%XTMAX_HONH
+  XDLNJODT1_HONH     => PARAM_LIMA_COLD%XDLNJODT1_HONH
+  XDLNJODT2_HONH     => PARAM_LIMA_COLD%XDLNJODT2_HONH
+  XC1_HONH           => PARAM_LIMA_COLD%XC1_HONH
+  XC2_HONH           => PARAM_LIMA_COLD%XC2_HONH
+  XC3_HONH           => PARAM_LIMA_COLD%XC3_HONH
+  XC_HONC            => PARAM_LIMA_COLD%XC_HONC
+  XR_HONC            => PARAM_LIMA_COLD%XR_HONC
+  XTEXP1_HONC        => PARAM_LIMA_COLD%XTEXP1_HONC
+  XTEXP2_HONC        => PARAM_LIMA_COLD%XTEXP2_HONC
+  XTEXP3_HONC        => PARAM_LIMA_COLD%XTEXP3_HONC
+  XTEXP4_HONC        => PARAM_LIMA_COLD%XTEXP4_HONC
+  XTEXP5_HONC        => PARAM_LIMA_COLD%XTEXP5_HONC
+  XCSCNVI_MAX        => PARAM_LIMA_COLD%XCSCNVI_MAX
+  XLBDASCNVI_MAX     => PARAM_LIMA_COLD%XLBDASCNVI_MAX
+  XRHORSMIN          => PARAM_LIMA_COLD%XRHORSMIN
+  XDSCNVI_LIM        => PARAM_LIMA_COLD%XDSCNVI_LIM
+  XLBDASCNVI_LIM     => PARAM_LIMA_COLD%XLBDASCNVI_LIM
+  XC0DEPSI           => PARAM_LIMA_COLD%XC0DEPSI
+  XC1DEPSI           => PARAM_LIMA_COLD%XC1DEPSI
+  XR0DEPSI           => PARAM_LIMA_COLD%XR0DEPSI
+  XR1DEPSI           => PARAM_LIMA_COLD%XR1DEPSI
+  XSCFAC             => PARAM_LIMA_COLD%XSCFAC
+  X0DEPI             => PARAM_LIMA_COLD%X0DEPI
+  X2DEPI             => PARAM_LIMA_COLD%X2DEPI
+  X0DEPS             => PARAM_LIMA_COLD%X0DEPS
+  X1DEPS             => PARAM_LIMA_COLD%X1DEPS
+  XEX0DEPS           => PARAM_LIMA_COLD%XEX0DEPS
+  XEX1DEPS           => PARAM_LIMA_COLD%XEX1DEPS
+  XDICNVS_LIM        => PARAM_LIMA_COLD%XDICNVS_LIM
+  XLBDAICNVS_LIM     => PARAM_LIMA_COLD%XLBDAICNVS_LIM
+  XC0DEPIS           => PARAM_LIMA_COLD%XC0DEPIS
+  XC1DEPIS           => PARAM_LIMA_COLD%XC1DEPIS
+  XR0DEPIS           => PARAM_LIMA_COLD%XR0DEPIS
+  XR1DEPIS           => PARAM_LIMA_COLD%XR1DEPIS
+  XCOLEXIS           => PARAM_LIMA_COLD%XCOLEXIS
+  XAGGS_CLARGE1      => PARAM_LIMA_COLD%XAGGS_CLARGE1
+  XAGGS_CLARGE2      => PARAM_LIMA_COLD%XAGGS_CLARGE2
+  XAGGS_RLARGE1      => PARAM_LIMA_COLD%XAGGS_RLARGE1
+  XAGGS_RLARGE2      => PARAM_LIMA_COLD%XAGGS_RLARGE2
+  XFIAGGS            => PARAM_LIMA_COLD%XFIAGGS
+  XEXIAGGS           => PARAM_LIMA_COLD%XEXIAGGS
+  XACCS1             => PARAM_LIMA_COLD%XACCS1
+  XSPONBUDS1         => PARAM_LIMA_COLD%XSPONBUDS1
+  XSPONBUDS2         => PARAM_LIMA_COLD%XSPONBUDS2
+  XSPONBUDS3         => PARAM_LIMA_COLD%XSPONBUDS3
+  XSPONCOEFS2        => PARAM_LIMA_COLD%XSPONCOEFS2
+  XKER_ZRNIC_A1      => PARAM_LIMA_COLD%XKER_ZRNIC_A1
+  XKER_ZRNIC_A2      => PARAM_LIMA_COLD%XKER_ZRNIC_A2
+  XSELFI             => PARAM_LIMA_COLD%XSELFI
+  XCOLEXII           => PARAM_LIMA_COLD%XCOLEXII
+  XCOLSS             => PARAM_LIMA_COLD%XCOLSS
+  XCOLEXSS           => PARAM_LIMA_COLD%XCOLEXSS
+  XFNSSCS            => PARAM_LIMA_COLD%XFNSSCS
+  XLBNSSCS1          => PARAM_LIMA_COLD%XLBNSSCS1
+  XLBNSSCS2          => PARAM_LIMA_COLD%XLBNSSCS2
+  XSCINTP1S          => PARAM_LIMA_COLD%XSCINTP1S
+  XSCINTP2S          => PARAM_LIMA_COLD%XSCINTP2S
+  XAUTO3             => PARAM_LIMA_COLD%XAUTO3
+  XAUTO4             => PARAM_LIMA_COLD%XAUTO4
+  XLAUTS             => PARAM_LIMA_COLD%XLAUTS
+  XLAUTS_THRESHOLD   => PARAM_LIMA_COLD%XLAUTS_THRESHOLD
+  XITAUTS            => PARAM_LIMA_COLD%XITAUTS
+  XITAUTS_THRESHOLD  => PARAM_LIMA_COLD%XITAUTS_THRESHOLD
+  XTEXAUTI           => PARAM_LIMA_COLD%XTEXAUTI
+  XCONCI_MAX         => PARAM_LIMA_COLD%XCONCI_MAX
+  XFREFFI            => PARAM_LIMA_COLD%XFREFFI
+  XALPHA1            => PARAM_LIMA_COLD%XALPHA1
+  XALPHA2            => PARAM_LIMA_COLD%XALPHA2
+  XBETA1             => PARAM_LIMA_COLD%XBETA1
+  XBETA2             => PARAM_LIMA_COLD%XBETA2
+  XNU10              => PARAM_LIMA_COLD%XNU10
+  XNU20              => PARAM_LIMA_COLD%XNU20
+
+  NSCLBDAS           => PARAM_LIMA_COLD%NSCLBDAS
+ENDIF
+END SUBROUTINE PARAM_LIMA_COLD_ASSOCIATE
+!
+SUBROUTINE PARAM_LIMA_COLD_ALLOCATE(HNAME, KDIM1, KDIM2)
+  IMPLICIT NONE
+  CHARACTER(LEN=*), INTENT(IN) :: HNAME
+  INTEGER, INTENT(IN)          :: KDIM1
+  INTEGER, INTENT(IN)          :: KDIM2
+
+  SELECT CASE(TRIM(HNAME))
+    CASE('XKER_N_SSCS')
+      ALLOCATE(PARAM_LIMA_COLD%XKER_N_SSCS(KDIM1, KDIM2))
+      XKER_N_SSCS => PARAM_LIMA_COLD%XKER_N_SSCS
+  END SELECT
+END SUBROUTINE PARAM_LIMA_COLD_ALLOCATE
 !
 !-------------------------------------------------------------------------------
 !
diff --git a/src/PHYEX/micro/modd_param_lima_mixed.f90 b/src/PHYEX/micro/modd_param_lima_mixed.f90
index 6a9c763dc3fef2905f7767731bfb151e6356bfe6..66b0d047876808d415b4530583aa19feb576eaf0 100644
--- a/src/PHYEX/micro/modd_param_lima_mixed.f90
+++ b/src/PHYEX/micro/modd_param_lima_mixed.f90
@@ -3,17 +3,17 @@
 !     ###########################{
 !
 !!****  *MODD_PARAM_LIMA_MIXED* - declaration of some descriptive parameters and
-!!                                microphysical factors extensively used in 
+!!                                microphysical factors extensively used in
 !!                                the LIMA mixed scheme.
 !!    AUTHOR
 !!    ------
-!!  	J.-P. Pinty  *Laboratoire d'Aerologie*
+!!      J.-P. Pinty  *Laboratoire d'Aerologie*
 !!      S.    Berthet    * Laboratoire d'Aerologie*
 !!      B.    Vié        * Laboratoire d'Aerologie*
 !!
 !!    MODIFICATIONS
 !!    -------------
-!!      Original             ??/??/13 
+!!      Original             ??/??/13
 !!      C. Barthe            14/03/2022  add CIBU and RDSF
 !       J. Wurtz                03/2022: new snow characteristics
 !       M. Taufour              07/2022: add concentration for snow, graupel, hail
@@ -21,12 +21,13 @@
 !-------------------------------------------------------------------------------
 !
 IMPLICIT NONE
+TYPE PARAM_LIMA_MIXED_t
 !
 !*       1.   DESCRIPTIVE PARAMETERS
 !             ----------------------
 !
 !     Declaration of microphysical constants, including the descriptive
-!     parameters for the raindrop and the ice crystal habits, and the 
+!     parameters for the raindrop and the ice crystal habits, and the
 !     parameters relevant of the dimensional distributions.
 !
 !         m(D)    = XAx * D**XBx      : Mass-MaxDim relationship
@@ -37,17 +38,17 @@ IMPLICIT NONE
 !
 !              and
 !
-!         XALPHAx, XNUx                        : Generalized GAMMA law 
-!         Lbda = XLBx * (r_x*rho_dref)**XLBEXx : Slope parameter of the 
+!         XALPHAx, XNUx                        : Generalized GAMMA law
+!         Lbda = XLBx * (r_x*rho_dref)**XLBEXx : Slope parameter of the
 !                                                distribution law
 !
-REAL,SAVE :: XAG,XBG,XCG,XDG,XCCG,XCXG,XF0G,XF1G,XC1G ! Graupel        charact.
-REAL,SAVE :: XLBEXG,XLBG,XNG          ! Graupel        distribution parameters 
-REAL,SAVE :: XLBDAG_MAX               ! Max values allowed for the shape
+REAL      :: XAG,XBG,XCG,XDG,XCCG,XCXG,XF0G,XF1G,XC1G ! Graupel        charact.
+REAL      :: XLBEXG,XLBG,XNG          ! Graupel        distribution parameters
+REAL      :: XLBDAG_MAX               ! Max values allowed for the shape
                                       ! parameter of graupeln
 !
-REAL,SAVE :: XAH,XBH,XCH,XDH,XCCH,XCXH,XF0H,XF1H,XC1H ! Hail           charact.
-REAL,SAVE :: XALPHAH,XNUH,XLBEXH,XLBH ! Hail           distribution parameters
+REAL      :: XAH,XBH,XCH,XDH,XCCH,XCXH,XF0H,XF1H,XC1H ! Hail           charact.
+REAL      :: XALPHAH,XNUH,XLBEXH,XLBH ! Hail           distribution parameters
 !
 !-------------------------------------------------------------------------------
 !
@@ -56,7 +57,7 @@ REAL,SAVE :: XALPHAH,XNUH,XLBEXH,XLBH ! Hail           distribution parameters
 !
 ! Constants for ice-ice collision : CIBU
 !
-REAL, SAVE :: XDCSLIM_CIBU_MIN,                & ! aggregates min diam. : 0.2 mm
+REAL       :: XDCSLIM_CIBU_MIN,                & ! aggregates min diam. : 0.2 mm
               XDCSLIM_CIBU_MAX,                & ! aggregates max diam. : 1.0 mm
               XDCGLIM_CIBU_MIN,                & ! graupel min diam. : 2 mm
               XGAMINC_BOUND_CIBU_SMIN,         & ! Min val. of Lbda_s*dlim
@@ -71,136 +72,136 @@ REAL, SAVE :: XDCSLIM_CIBU_MIN,                & ! aggregates min diam. : 0.2 mm
               XMOMGS_CIBU_1,XMOMGS_CIBU_2,     &
               XMOMGS_CIBU_3
 !
-REAL, DIMENSION(:,:), SAVE, ALLOCATABLE        &
+REAL, DIMENSION(:,:)      , ALLOCATABLE        &
                        :: XGAMINC_CIBU_S,      & ! Tab.incomplete Gamma function
                           XGAMINC_CIBU_G         ! Tab.incomplete Gamma function
 !
 ! Constants for raindrop shattering : RDSF
 !
-REAL, SAVE :: XDCRLIM_RDSF_MIN,                & ! Raindrops min diam. : 0.2 mm
+REAL       :: XDCRLIM_RDSF_MIN,                & ! Raindrops min diam. : 0.2 mm
               XGAMINC_BOUND_RDSF_RMIN,         & ! Min val. of Lbda_r*dlim
               XGAMINC_BOUND_RDSF_RMAX,         & ! Max val. of Lbda_r*dlim
               XRDSFINTP_R,XRDSFINTP1_R,        & !
               XFACTOR_RDSF_NI,                 & ! Factor for final RDSF Eq.
               XMOMGR_RDSF
 !
-REAL, DIMENSION(:), SAVE, ALLOCATABLE          &
+REAL, DIMENSION(:)      , ALLOCATABLE          &
                        :: XGAMINC_RDSF_R         ! Tab.incomplete Gamma function
 !
 !
 !*       3.   MICROPHYSICAL FACTORS - Graupel
 !             -------------------------------
 !
-REAL,SAVE :: XFSEDG, XEXSEDG, XFSEDRG, XFSEDCG   ! Sedimentation fluxes of Graupel
+REAL      :: XFSEDG, XEXSEDG, XFSEDRG, XFSEDCG   ! Sedimentation fluxes of Graupel
 !
-REAL,SAVE :: X0DEPG,X1DEPG,XEX0DEPG,XEX1DEPG     ! Deposition on graupel
+REAL      :: X0DEPG,X1DEPG,XEX0DEPG,XEX1DEPG     ! Deposition on graupel
 !
-REAL,SAVE :: XHMTMIN,XHMTMAX,XHM1,XHM2,        & ! Constants for the
+REAL      :: XHMTMIN,XHMTMAX,XHM1,XHM2,        & ! Constants for the
              XHM_YIELD,XHM_COLLCS,XHM_FACTS,   & !      revised
                        XHM_COLLCG,XHM_FACTG,   & ! Hallett-Mossop process
-    	     XGAMINC_HMC_BOUND_MIN,            & ! Min val. of Lbda_c for HMC
-    	     XGAMINC_HMC_BOUND_MAX,            & ! Max val. of Lbda_c for HMC
+             XGAMINC_HMC_BOUND_MIN,            & ! Min val. of Lbda_c for HMC
+             XGAMINC_HMC_BOUND_MAX,            & ! Max val. of Lbda_c for HMC
              XHMSINTP1,XHMSINTP2,              & ! (this is no more used !)
              XHMLINTP1,XHMLINTP2
 !
-REAL,SAVE :: XDCSLIM,XCOLCS,                   & ! Constants for the riming of
-    	     XEXCRIMSS,XCRIMSS,                & ! the aggregates : RIM
-    	     XEXCRIMSG,XCRIMSG,                & !
-    	     XEXSRIMCG,XSRIMCG,                & !
+REAL      :: XDCSLIM,XCOLCS,                   & ! Constants for the riming of
+             XEXCRIMSS,XCRIMSS,                & ! the aggregates : RIM
+             XEXCRIMSG,XCRIMSG,                & !
+             XEXSRIMCG,XSRIMCG,                & !
              XSRIMCG2, XSRIMCG3, XEXSRIMCG2,   & ! Murakami 1990
-    	     XGAMINC_BOUND_MIN,                & ! Min val. of Lbda_s for RIM
-    	     XGAMINC_BOUND_MAX,                & ! Max val. of Lbda_s for RIM
-    	     XRIMINTP1,XRIMINTP2                 ! Csts for lin. interpol. of 
+             XGAMINC_BOUND_MIN,                & ! Min val. of Lbda_s for RIM
+             XGAMINC_BOUND_MAX,                & ! Max val. of Lbda_s for RIM
+             XRIMINTP1,XRIMINTP2                 ! Csts for lin. interpol. of
                                                  ! the tab. incomplete Gamma law
-INTEGER,SAVE :: NGAMINC                          ! Number of tab. Lbda_s
-REAL, DIMENSION(:), SAVE, ALLOCATABLE          &
+INTEGER      :: NGAMINC                          ! Number of tab. Lbda_s
+REAL, DIMENSION(:)      , ALLOCATABLE          &
                        :: XGAMINC_RIM1,        & ! Tab. incomplete Gamma funct.
                           XGAMINC_RIM2,        & ! for XDS+2 and for XBS
                           XGAMINC_RIM4,        & ! Murakami
                           XGAMINC_HMC            ! and for the HM process
 !
-REAL,SAVE :: XFRACCSS,                         & ! Constants for the accretion 
-             XFNRACCSS,                        & ! Constants for the accretion 
+REAL      :: XFRACCSS,                         & ! Constants for the accretion
+             XFNRACCSS,                        & ! Constants for the accretion
              XLBRACCS1,XLBRACCS2,XLBRACCS3,    & ! raindrops onto the aggregates
-             XLBNRACCS1,XLBNRACCS2,XLBNRACCS3, & ! raindrops onto the aggregates 
+             XLBNRACCS1,XLBNRACCS2,XLBNRACCS3, & ! raindrops onto the aggregates
              XFSACCRG,                         & ! ACC (processes RACCSS and
-             XFNSACCRG,                        & ! ACC (processes RACCSS and 
+             XFNSACCRG,                        & ! ACC (processes RACCSS and
              XLBSACCR1,XLBSACCR2,XLBSACCR3,    & !                SACCRG)
-             XLBNSACCR1,XLBNSACCR2,XLBNSACCR3, & !                SACCRG)             
+             XLBNSACCR1,XLBNSACCR2,XLBNSACCR3, & !                SACCRG)
              XSCLBDAS_MIN,                     & ! Min val. of Lbda_s for ACC
-    	     XSCLBDAS_MAX,                     & ! Max val. of Lbda_s for ACC   
-    	     XACCLBDAS_MIN,                    & ! Min val. of Lbda_s for ACC
-    	     XACCLBDAS_MAX,                    & ! Max val. of Lbda_s for ACC
-    	     XACCLBDAR_MIN,                    & ! Min val. of Lbda_r for ACC
-    	     XACCLBDAR_MAX,                    & ! Max val. of Lbda_r for ACC
-    	     XACCINTP1S,XACCINTP2S,            & ! Csts for bilin. interpol. of 
-    	     XACCINTP1R,XACCINTP2R               !   Lbda_s and Lbda_r in the 
-                        			 ! XKER_RACCSS and XKER_SACCRG
-                          			 !            tables
-INTEGER,SAVE :: NACCLBDAS,                     & ! Number of Lbda_s values and
-    	        NACCLBDAR                        !   of Lbda_r values in the
-                        			 ! XKER_RACCSS and XKER_SACCRG
-                        			 !            tables
-REAL,DIMENSION(:,:), SAVE, ALLOCATABLE         &
-       			 :: XKER_RACCSS,       & ! Normalized kernel for RACCSS
-       			    XKER_RACCS,        & ! Normalized kernel for RACCS
-       			    XKER_SACCRG,        & ! Normalized kernel for SACCRG 
-       			    XKER_N_RACCSS,     & ! Normalized kernel for RACCSS  
-       			    XKER_N_RACCS,      & ! Normalized kernel for RACCS   
-       			    XKER_N_SACCRG        ! Normalized kernel for SACCRG
-REAL,SAVE :: XFSCVMG                             ! Melting-conversion factor of
+             XSCLBDAS_MAX,                     & ! Max val. of Lbda_s for ACC
+             XACCLBDAS_MIN,                    & ! Min val. of Lbda_s for ACC
+             XACCLBDAS_MAX,                    & ! Max val. of Lbda_s for ACC
+             XACCLBDAR_MIN,                    & ! Min val. of Lbda_r for ACC
+             XACCLBDAR_MAX,                    & ! Max val. of Lbda_r for ACC
+             XACCINTP1S,XACCINTP2S,            & ! Csts for bilin. interpol. of
+             XACCINTP1R,XACCINTP2R               !   Lbda_s and Lbda_r in the
+                                                 ! XKER_RACCSS and XKER_SACCRG
+                                                 !            tables
+INTEGER      :: NACCLBDAS,                     & ! Number of Lbda_s values and
+                NACCLBDAR                        !   of Lbda_r values in the
+                                                 ! XKER_RACCSS and XKER_SACCRG
+                                                 !            tables
+REAL,DIMENSION(:,:)      , ALLOCATABLE         &
+                    :: XKER_RACCSS,       & ! Normalized kernel for RACCSS
+                       XKER_RACCS,        & ! Normalized kernel for RACCS
+                       XKER_SACCRG,       & ! Normalized kernel for SACCRG
+                       XKER_N_RACCSS,     & ! Normalized kernel for RACCSS
+                       XKER_N_RACCS,      & ! Normalized kernel for RACCS
+                       XKER_N_SACCRG        ! Normalized kernel for SACCRG
+REAL      :: XFSCVMG                             ! Melting-conversion factor of
                                                  ! the aggregates
 !
-REAL,SAVE :: XCOLIR,                           & ! Constants for rain contact
-    	     XEXRCFRI,XRCFRI,                  & ! freezing : CFR
-    	     XEXICFRR,XICFRR                     !
+REAL      :: XCOLIR,                           & ! Constants for rain contact
+             XEXRCFRI,XRCFRI,                  & ! freezing : CFR
+             XEXICFRR,XICFRR                     !
 !
-REAL,SAVE :: XFCDRYG,                          & ! Constants for the dry growth
+REAL      :: XFCDRYG,                          & ! Constants for the dry growth
              XCOLCG,                           & ! of the graupeln :
-             XCOLIG,XCOLEXIG,XFIDRYG,          & ! 
+             XCOLIG,XCOLEXIG,XFIDRYG,          & !
              XCOLSG,XCOLEXSG,XFSDRYG,XFNSDRYG, & !             RCDRYG
              XLBSDRYG1,XLBSDRYG2,XLBSDRYG3,    & !             RIDRYG
-             XLBNSDRYG1,XLBNSDRYG2,XLBNSDRYG3, & !             RIDRYG  
+             XLBNSDRYG1,XLBNSDRYG2,XLBNSDRYG3, & !             RIDRYG
              XFRDRYG,XFNRDRYG,                 & !             RSDRYG
              XLBRDRYG1,XLBRDRYG2,XLBRDRYG3,    & !             RRDRYG
-             XLBNRDRYG1,XLBNRDRYG2,XLBNRDRYG3, & !             RRDRYG         
+             XLBNRDRYG1,XLBNRDRYG2,XLBNRDRYG3, & !             RRDRYG
              XDRYLBDAR_MIN,                    & ! Min val. of Lbda_r for DRY
-    	     XDRYLBDAR_MAX,                    & ! Max val. of Lbda_r for DRY
+             XDRYLBDAR_MAX,                    & ! Max val. of Lbda_r for DRY
              XDRYLBDAS_MIN,                    & ! Min val. of Lbda_s for DRY
-    	     XDRYLBDAS_MAX,                    & ! Max val. of Lbda_s for DRY
-    	     XDRYLBDAG_MIN,                    & ! Min val. of Lbda_g for DRY
-    	     XDRYLBDAG_MAX,                    & ! Max val. of Lbda_g for DRY
-    	     XDRYINTP1R,XDRYINTP2R,            & ! Csts for bilin. interpol. of 
-    	     XDRYINTP1S,XDRYINTP2S,            & ! Lbda_r, Lbda_s and Lbda_g in
-    	     XDRYINTP1G,XDRYINTP2G               ! the XKER_SDRYG and XKER_RDRYG
+             XDRYLBDAS_MAX,                    & ! Max val. of Lbda_s for DRY
+             XDRYLBDAG_MIN,                    & ! Min val. of Lbda_g for DRY
+             XDRYLBDAG_MAX,                    & ! Max val. of Lbda_g for DRY
+             XDRYINTP1R,XDRYINTP2R,            & ! Csts for bilin. interpol. of
+             XDRYINTP1S,XDRYINTP2S,            & ! Lbda_r, Lbda_s and Lbda_g in
+             XDRYINTP1G,XDRYINTP2G               ! the XKER_SDRYG and XKER_RDRYG
+                                                 !            tables
+INTEGER      :: NDRYLBDAR,                     & ! Number of Lbda_r,
+                NDRYLBDAS,                     & !        of Lbda_s and
+                NDRYLBDAG                        !        of Lbda_g values in
+                                                 ! the XKER_SDRYG and XKER_RDRYG
                                                  !            tables
-INTEGER,SAVE :: NDRYLBDAR,                     & ! Number of Lbda_r,
-    	        NDRYLBDAS,                     & !        of Lbda_s and
-    	        NDRYLBDAG                        !        of Lbda_g values in
-    	                                         ! the XKER_SDRYG and XKER_RDRYG
-                        			 !            tables
-REAL,DIMENSION(:,:), SAVE, ALLOCATABLE         &
+REAL,DIMENSION(:,:)      , ALLOCATABLE         &
                          :: XKER_SDRYG,        & ! Normalized kernel for SDRYG
-       			    XKER_RDRYG,        & ! Normalized kernel for RDRYG 
-       			    XKER_N_SDRYG,      & ! Normalized kernel for RDRYG    
-       			    XKER_N_RDRYG         ! Normalized kernel for RDRYG 
+                            XKER_RDRYG,        & ! Normalized kernel for RDRYG
+                            XKER_N_SDRYG,      & ! Normalized kernel for RDRYG
+                            XKER_N_RDRYG         ! Normalized kernel for RDRYG
 !
 !-------------------------------------------------------------------------------
 !
 !*       4.   MICROPHYSICAL FACTORS - Hail
 !             ----------------------------
 !
-REAL,SAVE :: XFSEDH,XEXSEDH,XFSEDRH,XFSEDCH      ! Constants for sedimentation
+REAL      :: XFSEDH,XEXSEDH,XFSEDRH,XFSEDCH      ! Constants for sedimentation
 !
 !
-REAL,SAVE :: X0DEPH,X1DEPH,XEX0DEPH,XEX1DEPH     ! Constants for deposition
+REAL      :: X0DEPH,X1DEPH,XEX0DEPH,XEX1DEPH     ! Constants for deposition
 !
-REAL,SAVE :: XFWETH,XFSWETH,XFNSWETH,          & ! Constants for the wet growth
+REAL      :: XFWETH,XFSWETH,XFNSWETH,          & ! Constants for the wet growth
              XLBSWETH1,XLBSWETH2,XLBSWETH3,    & ! of the hailstones : WET
-             XLBNSWETH1,XLBNSWETH2,XLBNSWETH3, & ! of the hailstones : WET 
+             XLBNSWETH1,XLBNSWETH2,XLBNSWETH3, & ! of the hailstones : WET
              XFGWETH, XFNGWETH,                & !   processes RSWETH
              XLBGWETH1,XLBGWETH2,XLBGWETH3,    & !             RGWETH
-             XLBNGWETH1,XLBNGWETH2,XLBNGWETH3, & !             RGWETH   
+             XLBNGWETH1,XLBNGWETH2,XLBNGWETH3, & !             RGWETH
              XWETLBDAS_MIN,                    & ! Min val. of Lbda_s for WET
              XWETLBDAS_MAX,                    & ! Max val. of Lbda_s for WET
              XWETLBDAG_MIN,                    & ! Min val. of Lbda_g for WET
@@ -211,17 +212,530 @@ REAL,SAVE :: XFWETH,XFSWETH,XFNSWETH,          & ! Constants for the wet growth
              XWETINTP1G,XWETINTP2G,            & ! Lbda_r, Lbda_s and Lbda_g in
              XWETINTP1H,XWETINTP2H               ! the XKER_SWETH and XKER_GWETH
                                                  !            tables
-INTEGER,SAVE :: NWETLBDAS,                     & ! Number of Lbda_s,
+INTEGER      :: NWETLBDAS,                     & ! Number of Lbda_s,
                 NWETLBDAG,                     & !        of Lbda_g and
                 NWETLBDAH                        !        of Lbda_h values in
                                                  ! the XKER_SWETH and XKER_GWETH
                                                  !            tables
-REAL,DIMENSION(:,:), SAVE, ALLOCATABLE         &
+REAL,DIMENSION(:,:), ALLOCATABLE               &
                          :: XKER_SWETH,        & ! Normalized kernel for SWETH
                             XKER_GWETH,        & ! Normalized kernel for GWETH
-                            XKER_N_SWETH,      & ! Normalized kernel for GWETH 
+                            XKER_N_SWETH,      & ! Normalized kernel for GWETH
                             XKER_N_GWETH         ! Normalized kernel for GWETH
+END TYPE PARAM_LIMA_MIXED_t
+!
+TYPE(PARAM_LIMA_MIXED_t), TARGET       :: PARAM_LIMA_MIXED
+!
+REAL, POINTER :: XAG => NULL(), &
+                 XBG => NULL(), &
+                 XCG => NULL(), &
+                 XDG => NULL(), &
+                 XCCG => NULL(), &
+                 XCXG => NULL(), &
+                 XF0G => NULL(), &
+                 XF1G => NULL(), &
+                 XC1G => NULL(), &
+                 XLBEXG => NULL(), &
+                 XLBG => NULL(), &
+                 XNG => NULL(), &
+                 XLBDAG_MAX => NULL(), &
+                 XAH => NULL(), &
+                 XBH => NULL(), &
+                 XCH => NULL(), &
+                 XDH => NULL(), &
+                 XCCH => NULL(), &
+                 XCXH => NULL(), &
+                 XF0H => NULL(), &
+                 XF1H => NULL(), &
+                 XC1H => NULL(), &
+                 XALPHAH => NULL(), &
+                 XNUH => NULL(), &
+                 XLBEXH => NULL(), &
+                 XLBH => NULL(), &
+                 XDCSLIM_CIBU_MIN => NULL(), &
+                 XDCSLIM_CIBU_MAX => NULL(), &
+                 XDCGLIM_CIBU_MIN => NULL(), &
+                 XGAMINC_BOUND_CIBU_SMIN => NULL(), &
+                 XGAMINC_BOUND_CIBU_SMAX => NULL(), &
+                 XGAMINC_BOUND_CIBU_GMIN => NULL(), &
+                 XGAMINC_BOUND_CIBU_GMAX => NULL(), &
+                 XCIBUINTP_S => NULL(), &
+                 XCIBUINTP1_S => NULL(), &
+                 XCIBUINTP2_S => NULL(), &
+                 XCIBUINTP_G => NULL(), &
+                 XCIBUINTP1_G => NULL(), &
+                 XFACTOR_CIBU_NI => NULL(), &
+                 XFACTOR_CIBU_RI => NULL(), &
+                 XMOMGG_CIBU_1 => NULL(), &
+                 XMOMGG_CIBU_2 => NULL(), &
+                 XMOMGS_CIBU_1 => NULL(), &
+                 XMOMGS_CIBU_2 => NULL(), &
+                 XMOMGS_CIBU_3 => NULL(), &
+                 XDCRLIM_RDSF_MIN => NULL(), &
+                 XGAMINC_BOUND_RDSF_RMIN => NULL(), &
+                 XGAMINC_BOUND_RDSF_RMAX => NULL(), &
+                 XRDSFINTP_R => NULL(), &
+                 XRDSFINTP1_R => NULL(), &
+                 XFACTOR_RDSF_NI => NULL(), &
+                 XMOMGR_RDSF => NULL(), &
+                 XFSEDG => NULL(), &
+                 XEXSEDG => NULL(), &
+                 XFSEDRG => NULL(), &
+                 XFSEDCG => NULL(), &
+                 X0DEPG => NULL(), &
+                 X1DEPG => NULL(), &
+                 XEX0DEPG => NULL(), &
+                 XEX1DEPG => NULL(), &
+                 XHMTMIN => NULL(), &
+                 XHMTMAX => NULL(), &
+                 XHM1 => NULL(), &
+                 XHM2 => NULL(), &
+                 XHM_YIELD => NULL(), &
+                 XHM_COLLCS => NULL(), &
+                 XHM_FACTS => NULL(), &
+                 XHM_COLLCG => NULL(), &
+                 XHM_FACTG => NULL(), &
+                 XGAMINC_HMC_BOUND_MIN => NULL(), &
+                 XGAMINC_HMC_BOUND_MAX => NULL(), &
+                 XHMSINTP1 => NULL(), &
+                 XHMSINTP2 => NULL(), &
+                 XHMLINTP1 => NULL(), &
+                 XHMLINTP2 => NULL(), &
+                 XDCSLIM => NULL(), &
+                 XCOLCS => NULL(), &
+                 XEXCRIMSS => NULL(), &
+                 XCRIMSS => NULL(), &
+                 XEXCRIMSG => NULL(), &
+                 XCRIMSG => NULL(), &
+                 XEXSRIMCG => NULL(), &
+                 XSRIMCG => NULL(), &
+                 XSRIMCG2 => NULL(), &
+                 XSRIMCG3 => NULL(), &
+                 XEXSRIMCG2 => NULL(), &
+                 XGAMINC_BOUND_MIN => NULL(), &
+                 XGAMINC_BOUND_MAX => NULL(), &
+                 XRIMINTP1 => NULL(), &
+                 XRIMINTP2 => NULL(), &
+                 XFRACCSS => NULL(), &
+                 XFNRACCSS => NULL(), &
+                 XLBRACCS1 => NULL(), &
+                 XLBRACCS2 => NULL(), &
+                 XLBRACCS3 => NULL(), &
+                 XLBNRACCS1 => NULL(), &
+                 XLBNRACCS2 => NULL(), &
+                 XLBNRACCS3 => NULL(), &
+                 XFSACCRG => NULL(), &
+                 XFNSACCRG => NULL(), &
+                 XLBSACCR1 => NULL(), &
+                 XLBSACCR2 => NULL(), &
+                 XLBSACCR3 => NULL(), &
+                 XLBNSACCR1 => NULL(), &
+                 XLBNSACCR2 => NULL(), &
+                 XLBNSACCR3 => NULL(), &
+                 XSCLBDAS_MIN => NULL(), &
+                 XSCLBDAS_MAX => NULL(), &
+                 XACCLBDAS_MIN => NULL(), &
+                 XACCLBDAS_MAX => NULL(), &
+                 XACCLBDAR_MIN => NULL(), &
+                 XACCLBDAR_MAX => NULL(), &
+                 XACCINTP1S => NULL(), &
+                 XACCINTP2S => NULL(), &
+                 XACCINTP1R => NULL(), &
+                 XACCINTP2R => NULL(), &
+                 XFSCVMG => NULL(), &
+                 XCOLIR => NULL(), &
+                 XEXRCFRI => NULL(), &
+                 XRCFRI => NULL(), &
+                 XEXICFRR => NULL(), &
+                 XICFRR => NULL(), &
+                 XFCDRYG => NULL(), &
+                 XCOLCG => NULL(), &
+                 XCOLIG => NULL(), &
+                 XCOLEXIG => NULL(), &
+                 XFIDRYG => NULL(), &
+                 XCOLSG => NULL(), &
+                 XCOLEXSG => NULL(), &
+                 XFSDRYG => NULL(), &
+                 XFNSDRYG => NULL(), &
+                 XLBSDRYG1 => NULL(), &
+                 XLBSDRYG2 => NULL(), &
+                 XLBSDRYG3 => NULL(), &
+                 XLBNSDRYG1 => NULL(), &
+                 XLBNSDRYG2 => NULL(), &
+                 XLBNSDRYG3 => NULL(), &
+                 XFRDRYG => NULL(), &
+                 XFNRDRYG => NULL(), &
+                 XLBRDRYG1 => NULL(), &
+                 XLBRDRYG2 => NULL(), &
+                 XLBRDRYG3 => NULL(), &
+                 XLBNRDRYG1 => NULL(), &
+                 XLBNRDRYG2 => NULL(), &
+                 XLBNRDRYG3 => NULL(), &
+                 XDRYLBDAR_MIN => NULL(), &
+                 XDRYLBDAR_MAX => NULL(), &
+                 XDRYLBDAS_MIN => NULL(), &
+                 XDRYLBDAS_MAX => NULL(), &
+                 XDRYLBDAG_MIN => NULL(), &
+                 XDRYLBDAG_MAX => NULL(), &
+                 XDRYINTP1R => NULL(), &
+                 XDRYINTP2R => NULL(), &
+                 XDRYINTP1S => NULL(), &
+                 XDRYINTP2S => NULL(), &
+                 XDRYINTP1G => NULL(), &
+                 XDRYINTP2G => NULL(), &
+                 XFSEDH => NULL(), &
+                 XEXSEDH => NULL(), &
+                 XFSEDRH => NULL(), &
+                 XFSEDCH => NULL(), &
+                 X0DEPH => NULL(), &
+                 X1DEPH => NULL(), &
+                 XEX0DEPH => NULL(), &
+                 XEX1DEPH => NULL(), &
+                 XFWETH => NULL(), &
+                 XFSWETH => NULL(), &
+                 XFNSWETH => NULL(), &
+                 XLBSWETH1 => NULL(), &
+                 XLBSWETH2 => NULL(), &
+                 XLBSWETH3 => NULL(), &
+                 XLBNSWETH1 => NULL(), &
+                 XLBNSWETH2 => NULL(), &
+                 XLBNSWETH3 => NULL(), &
+                 XFGWETH => NULL(), &
+                 XFNGWETH => NULL(), &
+                 XLBGWETH1 => NULL(), &
+                 XLBGWETH2 => NULL(), &
+                 XLBGWETH3 => NULL(), &
+                 XLBNGWETH1 => NULL(), &
+                 XLBNGWETH2 => NULL(), &
+                 XLBNGWETH3 => NULL(), &
+                 XWETLBDAS_MIN => NULL(), &
+                 XWETLBDAS_MAX => NULL(), &
+                 XWETLBDAG_MIN => NULL(), &
+                 XWETLBDAG_MAX => NULL(), &
+                 XWETLBDAH_MIN => NULL(), &
+                 XWETLBDAH_MAX => NULL(), &
+                 XWETINTP1S => NULL(), &
+                 XWETINTP2S => NULL(), &
+                 XWETINTP1G => NULL(), &
+                 XWETINTP2G => NULL(), &
+                 XWETINTP1H => NULL(), &
+                 XWETINTP2H => NULL()
+
+INTEGER, POINTER :: NGAMINC => NULL(), &
+                    NACCLBDAS => NULL(), &
+                    NACCLBDAR => NULL(), &
+                    NDRYLBDAR => NULL(), &
+                    NDRYLBDAS => NULL(), &
+                    NDRYLBDAG => NULL(), &
+                    NWETLBDAS => NULL(), &
+                    NWETLBDAG => NULL(), &
+                    NWETLBDAH => NULL()
+
+REAL, DIMENSION(:), POINTER :: XGAMINC_RDSF_R => NULL(), &
+                               XGAMINC_RIM1 => NULL(), &
+                               XGAMINC_RIM2 => NULL(), &
+                               XGAMINC_RIM4 => NULL(), &
+                               XGAMINC_HMC => NULL()
+REAL, DIMENSION(:,:), POINTER :: XGAMINC_CIBU_S => NULL(), &
+                                 XGAMINC_CIBU_G => NULL(), &
+                                 XKER_RACCSS => NULL(), &
+                                 XKER_RACCS => NULL(), &
+                                 XKER_SACCRG => NULL(), &
+                                 XKER_N_RACCSS => NULL(), &
+                                 XKER_N_RACCS => NULL(), &
+                                 XKER_N_SACCRG => NULL(), &
+                                 XKER_SDRYG => NULL(), &
+                                 XKER_RDRYG => NULL(), &
+                                 XKER_N_SDRYG => NULL(), &
+                                 XKER_N_RDRYG => NULL(), &
+                                 XKER_SWETH => NULL(), &
+                                 XKER_GWETH => NULL(), &
+                                 XKER_N_SWETH => NULL(), &
+                                 XKER_N_GWETH => NULL()
+CONTAINS
+SUBROUTINE PARAM_LIMA_MIXED_ASSOCIATE()
+IF(.NOT. ASSOCIATED(XAG)) THEN
+  XAG                      => PARAM_LIMA_MIXED%XAG
+  XBG                      => PARAM_LIMA_MIXED%XBG
+  XCG                      => PARAM_LIMA_MIXED%XCG
+  XDG                      => PARAM_LIMA_MIXED%XDG
+  XCCG                     => PARAM_LIMA_MIXED%XCCG
+  XCXG                     => PARAM_LIMA_MIXED%XCXG
+  XF0G                     => PARAM_LIMA_MIXED%XF0G
+  XF1G                     => PARAM_LIMA_MIXED%XF1G
+  XC1G                     => PARAM_LIMA_MIXED%XC1G
+  XLBEXG                   => PARAM_LIMA_MIXED%XLBEXG
+  XLBG                     => PARAM_LIMA_MIXED%XLBG
+  XNG                      => PARAM_LIMA_MIXED%XNG
+  XLBDAG_MAX               => PARAM_LIMA_MIXED%XLBDAG_MAX
+  XAH                      => PARAM_LIMA_MIXED%XAH
+  XBH                      => PARAM_LIMA_MIXED%XBH
+  XCH                      => PARAM_LIMA_MIXED%XCH
+  XDH                      => PARAM_LIMA_MIXED%XDH
+  XCCH                     => PARAM_LIMA_MIXED%XCCH
+  XCXH                     => PARAM_LIMA_MIXED%XCXH
+  XF0H                     => PARAM_LIMA_MIXED%XF0H
+  XF1H                     => PARAM_LIMA_MIXED%XF1H
+  XC1H                     => PARAM_LIMA_MIXED%XC1H
+  XALPHAH                  => PARAM_LIMA_MIXED%XALPHAH
+  XNUH                     => PARAM_LIMA_MIXED%XNUH
+  XLBEXH                   => PARAM_LIMA_MIXED%XLBEXH
+  XLBH                     => PARAM_LIMA_MIXED%XLBH
+  XDCSLIM_CIBU_MIN         => PARAM_LIMA_MIXED%XDCSLIM_CIBU_MIN
+  XDCSLIM_CIBU_MAX         => PARAM_LIMA_MIXED%XDCSLIM_CIBU_MAX
+  XDCGLIM_CIBU_MIN         => PARAM_LIMA_MIXED%XDCGLIM_CIBU_MIN
+  XGAMINC_BOUND_CIBU_SMIN  => PARAM_LIMA_MIXED%XGAMINC_BOUND_CIBU_SMIN
+  XGAMINC_BOUND_CIBU_SMAX  => PARAM_LIMA_MIXED%XGAMINC_BOUND_CIBU_SMAX
+  XGAMINC_BOUND_CIBU_GMIN  => PARAM_LIMA_MIXED%XGAMINC_BOUND_CIBU_GMIN
+  XGAMINC_BOUND_CIBU_GMAX  => PARAM_LIMA_MIXED%XGAMINC_BOUND_CIBU_GMAX
+  XCIBUINTP_S              => PARAM_LIMA_MIXED%XCIBUINTP_S
+  XCIBUINTP1_S             => PARAM_LIMA_MIXED%XCIBUINTP1_S
+  XCIBUINTP2_S             => PARAM_LIMA_MIXED%XCIBUINTP2_S
+  XCIBUINTP_G              => PARAM_LIMA_MIXED%XCIBUINTP_G
+  XCIBUINTP1_G             => PARAM_LIMA_MIXED%XCIBUINTP1_G
+  XFACTOR_CIBU_NI          => PARAM_LIMA_MIXED%XFACTOR_CIBU_NI
+  XFACTOR_CIBU_RI          => PARAM_LIMA_MIXED%XFACTOR_CIBU_RI
+  XMOMGG_CIBU_1            => PARAM_LIMA_MIXED%XMOMGG_CIBU_1
+  XMOMGG_CIBU_2            => PARAM_LIMA_MIXED%XMOMGG_CIBU_2
+  XMOMGS_CIBU_1            => PARAM_LIMA_MIXED%XMOMGS_CIBU_1
+  XMOMGS_CIBU_2            => PARAM_LIMA_MIXED%XMOMGS_CIBU_2
+  XMOMGS_CIBU_3            => PARAM_LIMA_MIXED%XMOMGS_CIBU_3
+  XDCRLIM_RDSF_MIN         => PARAM_LIMA_MIXED%XDCRLIM_RDSF_MIN
+  XGAMINC_BOUND_RDSF_RMIN  => PARAM_LIMA_MIXED%XGAMINC_BOUND_RDSF_RMIN
+  XGAMINC_BOUND_RDSF_RMAX  => PARAM_LIMA_MIXED%XGAMINC_BOUND_RDSF_RMAX
+  XRDSFINTP_R              => PARAM_LIMA_MIXED%XRDSFINTP_R
+  XRDSFINTP1_R             => PARAM_LIMA_MIXED%XRDSFINTP1_R
+  XFACTOR_RDSF_NI          => PARAM_LIMA_MIXED%XFACTOR_RDSF_NI
+  XMOMGR_RDSF              => PARAM_LIMA_MIXED%XMOMGR_RDSF
+  XFSEDG                   => PARAM_LIMA_MIXED%XFSEDG
+  XEXSEDG                  => PARAM_LIMA_MIXED%XEXSEDG
+  XFSEDRG                  => PARAM_LIMA_MIXED%XFSEDRG
+  XFSEDCG                  => PARAM_LIMA_MIXED%XFSEDCG
+  X0DEPG                   => PARAM_LIMA_MIXED%X0DEPG
+  X1DEPG                   => PARAM_LIMA_MIXED%X1DEPG
+  XEX0DEPG                 => PARAM_LIMA_MIXED%XEX0DEPG
+  XEX1DEPG                 => PARAM_LIMA_MIXED%XEX1DEPG
+  XHMTMIN                  => PARAM_LIMA_MIXED%XHMTMIN
+  XHMTMAX                  => PARAM_LIMA_MIXED%XHMTMAX
+  XHM1                     => PARAM_LIMA_MIXED%XHM1
+  XHM2                     => PARAM_LIMA_MIXED%XHM2
+  XHM_YIELD                => PARAM_LIMA_MIXED%XHM_YIELD
+  XHM_COLLCS               => PARAM_LIMA_MIXED%XHM_COLLCS
+  XHM_FACTS                => PARAM_LIMA_MIXED%XHM_FACTS
+  XHM_COLLCG               => PARAM_LIMA_MIXED%XHM_COLLCG
+  XHM_FACTG                => PARAM_LIMA_MIXED%XHM_FACTG
+  XGAMINC_HMC_BOUND_MIN    => PARAM_LIMA_MIXED%XGAMINC_HMC_BOUND_MIN
+  XGAMINC_HMC_BOUND_MAX    => PARAM_LIMA_MIXED%XGAMINC_HMC_BOUND_MAX
+  XHMSINTP1                => PARAM_LIMA_MIXED%XHMSINTP1
+  XHMSINTP2                => PARAM_LIMA_MIXED%XHMSINTP2
+  XHMLINTP1                => PARAM_LIMA_MIXED%XHMLINTP1
+  XHMLINTP2                => PARAM_LIMA_MIXED%XHMLINTP2
+  XDCSLIM                  => PARAM_LIMA_MIXED%XDCSLIM
+  XCOLCS                   => PARAM_LIMA_MIXED%XCOLCS
+  XEXCRIMSS                => PARAM_LIMA_MIXED%XEXCRIMSS
+  XCRIMSS                  => PARAM_LIMA_MIXED%XCRIMSS
+  XEXCRIMSG                => PARAM_LIMA_MIXED%XEXCRIMSG
+  XCRIMSG                  => PARAM_LIMA_MIXED%XCRIMSG
+  XEXSRIMCG                => PARAM_LIMA_MIXED%XEXSRIMCG
+  XSRIMCG                  => PARAM_LIMA_MIXED%XSRIMCG
+  XSRIMCG2                 => PARAM_LIMA_MIXED%XSRIMCG2
+  XSRIMCG3                 => PARAM_LIMA_MIXED%XSRIMCG3
+  XEXSRIMCG2               => PARAM_LIMA_MIXED%XEXSRIMCG2
+  XGAMINC_BOUND_MIN        => PARAM_LIMA_MIXED%XGAMINC_BOUND_MIN
+  XGAMINC_BOUND_MAX        => PARAM_LIMA_MIXED%XGAMINC_BOUND_MAX
+  XRIMINTP1                => PARAM_LIMA_MIXED%XRIMINTP1
+  XRIMINTP2                => PARAM_LIMA_MIXED%XRIMINTP2
+  XFRACCSS                 => PARAM_LIMA_MIXED%XFRACCSS
+  XFNRACCSS                => PARAM_LIMA_MIXED%XFNRACCSS
+  XLBRACCS1                => PARAM_LIMA_MIXED%XLBRACCS1
+  XLBRACCS2                => PARAM_LIMA_MIXED%XLBRACCS2
+  XLBRACCS3                => PARAM_LIMA_MIXED%XLBRACCS3
+  XLBNRACCS1               => PARAM_LIMA_MIXED%XLBNRACCS1
+  XLBNRACCS2               => PARAM_LIMA_MIXED%XLBNRACCS2
+  XLBNRACCS3               => PARAM_LIMA_MIXED%XLBNRACCS3
+  XFSACCRG                 => PARAM_LIMA_MIXED%XFSACCRG
+  XFNSACCRG                => PARAM_LIMA_MIXED%XFNSACCRG
+  XLBSACCR1                => PARAM_LIMA_MIXED%XLBSACCR1
+  XLBSACCR2                => PARAM_LIMA_MIXED%XLBSACCR2
+  XLBSACCR3                => PARAM_LIMA_MIXED%XLBSACCR3
+  XLBNSACCR1               => PARAM_LIMA_MIXED%XLBNSACCR1
+  XLBNSACCR2               => PARAM_LIMA_MIXED%XLBNSACCR2
+  XLBNSACCR3               => PARAM_LIMA_MIXED%XLBNSACCR3
+  XSCLBDAS_MIN             => PARAM_LIMA_MIXED%XSCLBDAS_MIN
+  XSCLBDAS_MAX             => PARAM_LIMA_MIXED%XSCLBDAS_MAX
+  XACCLBDAS_MIN            => PARAM_LIMA_MIXED%XACCLBDAS_MIN
+  XACCLBDAS_MAX            => PARAM_LIMA_MIXED%XACCLBDAS_MAX
+  XACCLBDAR_MIN            => PARAM_LIMA_MIXED%XACCLBDAR_MIN
+  XACCLBDAR_MAX            => PARAM_LIMA_MIXED%XACCLBDAR_MAX
+  XACCINTP1S               => PARAM_LIMA_MIXED%XACCINTP1S
+  XACCINTP2S               => PARAM_LIMA_MIXED%XACCINTP2S
+  XACCINTP1R               => PARAM_LIMA_MIXED%XACCINTP1R
+  XACCINTP2R               => PARAM_LIMA_MIXED%XACCINTP2R
+  XFSCVMG                  => PARAM_LIMA_MIXED%XFSCVMG
+  XCOLIR                   => PARAM_LIMA_MIXED%XCOLIR
+  XEXRCFRI                 => PARAM_LIMA_MIXED%XEXRCFRI
+  XRCFRI                   => PARAM_LIMA_MIXED%XRCFRI
+  XEXICFRR                 => PARAM_LIMA_MIXED%XEXICFRR
+  XICFRR                   => PARAM_LIMA_MIXED%XICFRR
+  XFCDRYG                  => PARAM_LIMA_MIXED%XFCDRYG
+  XCOLCG                   => PARAM_LIMA_MIXED%XCOLCG
+  XCOLIG                   => PARAM_LIMA_MIXED%XCOLIG
+  XCOLEXIG                 => PARAM_LIMA_MIXED%XCOLEXIG
+  XFIDRYG                  => PARAM_LIMA_MIXED%XFIDRYG
+  XCOLSG                   => PARAM_LIMA_MIXED%XCOLSG
+  XCOLEXSG                 => PARAM_LIMA_MIXED%XCOLEXSG
+  XFSDRYG                  => PARAM_LIMA_MIXED%XFSDRYG
+  XFNSDRYG                 => PARAM_LIMA_MIXED%XFNSDRYG
+  XLBSDRYG1                => PARAM_LIMA_MIXED%XLBSDRYG1
+  XLBSDRYG2                => PARAM_LIMA_MIXED%XLBSDRYG2
+  XLBSDRYG3                => PARAM_LIMA_MIXED%XLBSDRYG3
+  XLBNSDRYG1               => PARAM_LIMA_MIXED%XLBNSDRYG1
+  XLBNSDRYG2               => PARAM_LIMA_MIXED%XLBNSDRYG2
+  XLBNSDRYG3               => PARAM_LIMA_MIXED%XLBNSDRYG3
+  XFRDRYG                  => PARAM_LIMA_MIXED%XFRDRYG
+  XFNRDRYG                 => PARAM_LIMA_MIXED%XFNRDRYG
+  XLBRDRYG1                => PARAM_LIMA_MIXED%XLBRDRYG1
+  XLBRDRYG2                => PARAM_LIMA_MIXED%XLBRDRYG2
+  XLBRDRYG3                => PARAM_LIMA_MIXED%XLBRDRYG3
+  XLBNRDRYG1               => PARAM_LIMA_MIXED%XLBNRDRYG1
+  XLBNRDRYG2               => PARAM_LIMA_MIXED%XLBNRDRYG2
+  XLBNRDRYG3               => PARAM_LIMA_MIXED%XLBNRDRYG3
+  XDRYLBDAR_MIN            => PARAM_LIMA_MIXED%XDRYLBDAR_MIN
+  XDRYLBDAR_MAX            => PARAM_LIMA_MIXED%XDRYLBDAR_MAX
+  XDRYLBDAS_MIN            => PARAM_LIMA_MIXED%XDRYLBDAS_MIN
+  XDRYLBDAS_MAX            => PARAM_LIMA_MIXED%XDRYLBDAS_MAX
+  XDRYLBDAG_MIN            => PARAM_LIMA_MIXED%XDRYLBDAG_MIN
+  XDRYLBDAG_MAX            => PARAM_LIMA_MIXED%XDRYLBDAG_MAX
+  XDRYINTP1R               => PARAM_LIMA_MIXED%XDRYINTP1R
+  XDRYINTP2R               => PARAM_LIMA_MIXED%XDRYINTP2R
+  XDRYINTP1S               => PARAM_LIMA_MIXED%XDRYINTP1S
+  XDRYINTP2S               => PARAM_LIMA_MIXED%XDRYINTP2S
+  XDRYINTP1G               => PARAM_LIMA_MIXED%XDRYINTP1G
+  XDRYINTP2G               => PARAM_LIMA_MIXED%XDRYINTP2G
+  XFSEDH                   => PARAM_LIMA_MIXED%XFSEDH
+  XEXSEDH                  => PARAM_LIMA_MIXED%XEXSEDH
+  XFSEDRH                  => PARAM_LIMA_MIXED%XFSEDRH
+  XFSEDCH                  => PARAM_LIMA_MIXED%XFSEDCH
+  X0DEPH                   => PARAM_LIMA_MIXED%X0DEPH
+  X1DEPH                   => PARAM_LIMA_MIXED%X1DEPH
+  XEX0DEPH                 => PARAM_LIMA_MIXED%XEX0DEPH
+  XEX1DEPH                 => PARAM_LIMA_MIXED%XEX1DEPH
+  XFWETH                   => PARAM_LIMA_MIXED%XFWETH
+  XFSWETH                  => PARAM_LIMA_MIXED%XFSWETH
+  XFNSWETH                 => PARAM_LIMA_MIXED%XFNSWETH
+  XLBSWETH1                => PARAM_LIMA_MIXED%XLBSWETH1
+  XLBSWETH2                => PARAM_LIMA_MIXED%XLBSWETH2
+  XLBSWETH3                => PARAM_LIMA_MIXED%XLBSWETH3
+  XLBNSWETH1               => PARAM_LIMA_MIXED%XLBNSWETH1
+  XLBNSWETH2               => PARAM_LIMA_MIXED%XLBNSWETH2
+  XLBNSWETH3               => PARAM_LIMA_MIXED%XLBNSWETH3
+  XFGWETH                  => PARAM_LIMA_MIXED%XFGWETH
+  XFNGWETH                 => PARAM_LIMA_MIXED%XFNGWETH
+  XLBGWETH1                => PARAM_LIMA_MIXED%XLBGWETH1
+  XLBGWETH2                => PARAM_LIMA_MIXED%XLBGWETH2
+  XLBGWETH3                => PARAM_LIMA_MIXED%XLBGWETH3
+  XLBNGWETH1               => PARAM_LIMA_MIXED%XLBNGWETH1
+  XLBNGWETH2               => PARAM_LIMA_MIXED%XLBNGWETH2
+  XLBNGWETH3               => PARAM_LIMA_MIXED%XLBNGWETH3
+  XWETLBDAS_MIN            => PARAM_LIMA_MIXED%XWETLBDAS_MIN
+  XWETLBDAS_MAX            => PARAM_LIMA_MIXED%XWETLBDAS_MAX
+  XWETLBDAG_MIN            => PARAM_LIMA_MIXED%XWETLBDAG_MIN
+  XWETLBDAG_MAX            => PARAM_LIMA_MIXED%XWETLBDAG_MAX
+  XWETLBDAH_MIN            => PARAM_LIMA_MIXED%XWETLBDAH_MIN
+  XWETLBDAH_MAX            => PARAM_LIMA_MIXED%XWETLBDAH_MAX
+  XWETINTP1S               => PARAM_LIMA_MIXED%XWETINTP1S
+  XWETINTP2S               => PARAM_LIMA_MIXED%XWETINTP2S
+  XWETINTP1G               => PARAM_LIMA_MIXED%XWETINTP1G
+  XWETINTP2G               => PARAM_LIMA_MIXED%XWETINTP2G
+  XWETINTP1H               => PARAM_LIMA_MIXED%XWETINTP1H
+  XWETINTP2H               => PARAM_LIMA_MIXED%XWETINTP2H
+
+  NGAMINC                  => PARAM_LIMA_MIXED%NGAMINC
+  NACCLBDAS                => PARAM_LIMA_MIXED%NACCLBDAS
+  NACCLBDAR                => PARAM_LIMA_MIXED%NACCLBDAR
+  NDRYLBDAR                => PARAM_LIMA_MIXED%NDRYLBDAR
+  NDRYLBDAS                => PARAM_LIMA_MIXED%NDRYLBDAS
+  NDRYLBDAG                => PARAM_LIMA_MIXED%NDRYLBDAG
+  NWETLBDAS                => PARAM_LIMA_MIXED%NWETLBDAS
+  NWETLBDAG                => PARAM_LIMA_MIXED%NWETLBDAG
+  NWETLBDAH                => PARAM_LIMA_MIXED%NWETLBDAH
+ENDIF
+END SUBROUTINE PARAM_LIMA_MIXED_ASSOCIATE
+!
+SUBROUTINE PARAM_LIMA_MIXED_ALLOCATE(HNAME, KDIM1, KDIM2)
+  IMPLICIT NONE
+  CHARACTER(LEN=*), INTENT(IN) :: HNAME
+  INTEGER, INTENT(IN)          :: KDIM1
+  INTEGER, OPTIONAL, INTENT(IN):: KDIM2
 
+  SELECT CASE(TRIM(HNAME))
+    !1d
+    CASE('XGAMINC_RDSF_R')
+      ALLOCATE(PARAM_LIMA_MIXED%XGAMINC_RDSF_R(KDIM1))
+      XGAMINC_RDSF_R => PARAM_LIMA_MIXED%XGAMINC_RDSF_R
+    CASE('XGAMINC_RIM1')
+      ALLOCATE(PARAM_LIMA_MIXED%XGAMINC_RIM1(KDIM1))
+      XGAMINC_RIM1 => PARAM_LIMA_MIXED%XGAMINC_RIM1
+    CASE('XGAMINC_RIM2')
+      ALLOCATE(PARAM_LIMA_MIXED%XGAMINC_RIM2(KDIM1))
+      XGAMINC_RIM2 => PARAM_LIMA_MIXED%XGAMINC_RIM2
+    CASE('XGAMINC_RIM4')
+      ALLOCATE(PARAM_LIMA_MIXED%XGAMINC_RIM4(KDIM1))
+      XGAMINC_RIM4 => PARAM_LIMA_MIXED%XGAMINC_RIM4
+    CASE('XGAMINC_HMC')
+      ALLOCATE(PARAM_LIMA_MIXED%XGAMINC_HMC(KDIM1))
+      XGAMINC_HMC => PARAM_LIMA_MIXED%XGAMINC_HMC
+   !2d
+   CASE('XGAMINC_CIBU_S')
+      ALLOCATE(PARAM_LIMA_MIXED%XGAMINC_CIBU_S(KDIM1, KDIM2))
+      XGAMINC_CIBU_S => PARAM_LIMA_MIXED%XGAMINC_CIBU_S
+   CASE('XGAMINC_CIBU_G')
+      ALLOCATE(PARAM_LIMA_MIXED%XGAMINC_CIBU_G(KDIM1, KDIM2))
+      XGAMINC_CIBU_G => PARAM_LIMA_MIXED%XGAMINC_CIBU_G
+   CASE('XKER_RACCSS')
+      ALLOCATE(PARAM_LIMA_MIXED%XKER_RACCSS(KDIM1, KDIM2))
+      XKER_RACCSS => PARAM_LIMA_MIXED%XKER_RACCSS
+  CASE('XKER_RACCS')
+      ALLOCATE(PARAM_LIMA_MIXED%XKER_RACCS(KDIM1, KDIM2))
+      XKER_RACCS => PARAM_LIMA_MIXED%XKER_RACCS
+  CASE('XKER_SACCRG')
+      ALLOCATE(PARAM_LIMA_MIXED%XKER_SACCRG(KDIM1, KDIM2))
+      XKER_SACCRG => PARAM_LIMA_MIXED%XKER_SACCRG
+  CASE('XKER_N_RACCSS')
+      ALLOCATE(PARAM_LIMA_MIXED%XKER_N_RACCSS(KDIM1, KDIM2))
+      XKER_N_RACCSS => PARAM_LIMA_MIXED%XKER_N_RACCSS
+  CASE('XKER_N_RACCS')
+      ALLOCATE(PARAM_LIMA_MIXED%XKER_N_RACCS(KDIM1, KDIM2))
+      XKER_N_RACCS => PARAM_LIMA_MIXED%XKER_N_RACCS
+  CASE('XKER_N_SACCRG')
+      ALLOCATE(PARAM_LIMA_MIXED%XKER_N_SACCRG(KDIM1, KDIM2))
+      XKER_N_SACCRG => PARAM_LIMA_MIXED%XKER_N_SACCRG
+  CASE('XKER_SDRYG')
+      ALLOCATE(PARAM_LIMA_MIXED%XKER_SDRYG(KDIM1, KDIM2))
+      XKER_SDRYG => PARAM_LIMA_MIXED%XKER_SDRYG
+  CASE('XKER_RDRYG')
+      ALLOCATE(PARAM_LIMA_MIXED%XKER_RDRYG(KDIM1, KDIM2))
+      XKER_RDRYG => PARAM_LIMA_MIXED%XKER_RDRYG
+  CASE('XKER_N_SDRYG')
+      ALLOCATE(PARAM_LIMA_MIXED%XKER_N_SDRYG(KDIM1, KDIM2))
+      XKER_N_SDRYG => PARAM_LIMA_MIXED%XKER_N_SDRYG
+  CASE('XKER_N_RDRYG')
+      ALLOCATE(PARAM_LIMA_MIXED%XKER_N_RDRYG(KDIM1, KDIM2))
+      XKER_N_RDRYG => PARAM_LIMA_MIXED%XKER_N_RDRYG
+  CASE('XKER_SWETH')
+      ALLOCATE(PARAM_LIMA_MIXED%XKER_SWETH(KDIM1, KDIM2))
+      XKER_SWETH => PARAM_LIMA_MIXED%XKER_SWETH
+  CASE('XKER_GWETH')
+      ALLOCATE(PARAM_LIMA_MIXED%XKER_GWETH(KDIM1, KDIM2))
+      XKER_GWETH => PARAM_LIMA_MIXED%XKER_GWETH
+  CASE('XKER_N_SWETH')
+      ALLOCATE(PARAM_LIMA_MIXED%XKER_N_SWETH(KDIM1, KDIM2))
+      XKER_N_SWETH => PARAM_LIMA_MIXED%XKER_N_SWETH
+  CASE('XKER_N_GWETH')
+      ALLOCATE(PARAM_LIMA_MIXED%XKER_N_GWETH(KDIM1, KDIM2))
+      XKER_N_GWETH => PARAM_LIMA_MIXED%XKER_N_GWETH
+  END SELECT
+END SUBROUTINE PARAM_LIMA_MIXED_ALLOCATE
 !
 !-------------------------------------------------------------------------------
 !
diff --git a/src/PHYEX/micro/modd_param_lima_warm.f90 b/src/PHYEX/micro/modd_param_lima_warm.f90
index cf555286d5cf4f3b6a402abb08dd2276d9c5a988..dceef01470aa8824b0edb130585b766ab956fad9 100644
--- a/src/PHYEX/micro/modd_param_lima_warm.f90
+++ b/src/PHYEX/micro/modd_param_lima_warm.f90
@@ -8,119 +8,369 @@
 !     ###########################
 !
 !!****  *MODD_PARAM_LIMA_WARM* - declaration of some descriptive parameters and
-!!                               microphysical factors extensively used in 
+!!                               microphysical factors extensively used in
 !!                               the LIMA warm scheme.
 !!    AUTHOR
 !!    ------
-!!  	J.-P. Pinty  *Laboratoire d'Aerologie*
+!!      J.-P. Pinty      * Laboratoire d'Aerologie*
 !!      S.    Berthet    * Laboratoire d'Aerologie*
 !!      B.    Vié        * Laboratoire d'Aerologie*
 !!
 !!    MODIFICATIONS
 !!    -------------
-!!      Original             ??/??/13 
+!!      Original             ??/??/13
 !!
 !-------------------------------------------------------------------------------
 USE MODD_PARAMETERS, ONLY: JPSVNAMELGTMAX
 !
-IMPLICIT NONE 
+IMPLICIT NONE
 !
 !*       1.   DESCRIPTIVE PARAMETERS
 !             ----------------------
 !
-REAL,SAVE ::  XLBC, XLBEXC,          & ! shape parameters of the cloud droplets
+TYPE PARAM_LIMA_WARM_t
+REAL      ::  XLBC, XLBEXC,          & ! shape parameters of the cloud droplets
               XLBR, XLBEXR, XNR        ! shape parameters of the raindrops
 !
-REAL,SAVE :: XAR,XBR,XCR,XDR,XF0R,XF1R,     & ! Raindrop       charact.
+REAL      :: XAR,XBR,XCR,XDR,XF0R,XF1R,     & ! Raindrop       charact.
                              XCCR,XCXR,     & !For diagnostics
              XAC,XBC,XCC,XDC,XF0C,XF2C,XC1C   ! Cloud droplet  charact.
 !
 !
-CHARACTER(LEN=JPSVNAMELGTMAX),DIMENSION(5),PARAMETER &
-                     :: CLIMA_WARM_NAMES=(/'CCLOUD  ','CRAIN   ','CCCNFREE','CCCNACTI','SPRO    '/)
-                                       ! basenames of the SV articles stored
-                                       ! in the binary files
-CHARACTER(LEN=JPSVNAMELGTMAX),DIMENSION(5),PARAMETER &
-                     :: CLIMA_WARM_CONC=(/'NC   ','NR   ','NFREE','NCCN ','SS   '/)
-!                                       ! basenames of the SV articles stored
-!                                       ! in the binary files for DIAG
-!
-!* Special issue for Below-Cloud SCAVenging of Aerosol particles 
-CHARACTER(LEN=JPSVNAMELGTMAX),DIMENSION(2) :: CAERO_MASS =(/'MASSAP', 'MAP   '/)
 !
 !-------------------------------------------------------------------------------
 !
 !*       2.   MICROPHYSICAL FACTORS
 !             ---------------------
 !
-REAL,SAVE :: XFSEDRR,XFSEDCR,                  & ! Constants for sedimentation
+REAL      :: XFSEDRR,XFSEDCR,                  & ! Constants for sedimentation
              XFSEDRC,XFSEDCC                     ! fluxes of R, C
 !
 !
-REAL,SAVE :: XDIVA,                            & ! Diffusivity of water vapor
-	     XTHCO                               ! Thermal conductivity
-REAL,SAVE :: XWMIN                               ! Min value of updraft velocity
-				                 ! to enable nucleation process
-REAL,SAVE :: XTMIN                               ! Min value of
+REAL      :: XDIVA,                            & ! Diffusivity of water vapor
+             XTHCO                               ! Thermal conductivity
+REAL      :: XWMIN                               ! Min value of updraft velocity
+                                                 ! to enable nucleation process
+REAL      :: XTMIN                               ! Min value of
                                                  ! temperature evolution
-				                 ! to enable nucleation process
-REAL,SAVE :: XCSTHEN,XCSTDCRIT                   ! Cst for HEN precalculations
-INTEGER, SAVE :: NHYP                            ! Number of value of the HYP
-						 !    functions
-REAL,SAVE :: XHYPINTP1, XHYPINTP2                ! Factors defining the
-						 ! supersaturation log scale
-REAL, DIMENSION(:,:), SAVE, ALLOCATABLE        & ! Tabulated HYPgeometric
-	  :: XHYPF12, XHYPF32                    !   functions used in HEN
-INTEGER, SAVE :: NAHEN                           ! Number of value of the AHEN
-		                        	 !    functions
-REAL,SAVE :: XAHENINTP1, XAHENINTP2              ! Factors defining the
-						 ! temperatures in lin scale
-REAL, DIMENSION(:), SAVE, ALLOCATABLE          & ! 
+                                                 ! to enable nucleation process
+REAL      :: XCSTHEN,XCSTDCRIT                   ! Cst for HEN precalculations
+INTEGER   :: NHYP                                ! Number of value of the HYP
+                                                 !    functions
+REAL      :: XHYPINTP1, XHYPINTP2                ! Factors defining the
+                                                 ! supersaturation log scale
+REAL, DIMENSION(:,:), ALLOCATABLE              & ! Tabulated HYPgeometric
+          :: XHYPF12, XHYPF32                    !   functions used in HEN
+INTEGER   :: NAHEN                               ! Number of value of the AHEN
+                                                 !    functions
+REAL      :: XAHENINTP1, XAHENINTP2              ! Factors defining the
+                                                 ! temperatures in lin scale
+REAL, DIMENSION(:), ALLOCATABLE                & !
           :: XAHENG,XAHENG2,XAHENG3,XPSI1, XPSI3,      & ! Twomey-CPB98 and
-	     XAHENF,XAHENY                       ! Feingold-Heymsfield
-	                                         ! parameterization to compute Smax
-REAL,SAVE :: XWCOEF_F1, XWCOEF_F2, XWCOEF_F3,  & ! COEF_F of the polynomial temp.
+             XAHENF,XAHENY                       ! Feingold-Heymsfield
+                                                 ! parameterization to compute Smax
+REAL      :: XWCOEF_F1, XWCOEF_F2, XWCOEF_F3,  & ! COEF_F of the polynomial temp.
              XWCOEF_Y1, XWCOEF_Y2, XWCOEF_Y3     ! COEF_Y of the polynomial temp.
-						 ! function powering W
+                                                 ! function powering W
 !
 !
-REAL,SAVE :: XKERA1, XKERA2                      ! Constants to define the lin
-						 ! and parabolic kernel param. 
-REAL,SAVE :: XSELFC                              ! Constants for cloud droplet
+REAL      :: XKERA1, XKERA2                      ! Constants to define the lin
+                                                 ! and parabolic kernel param.
+REAL      :: XSELFC                              ! Constants for cloud droplet
                                                  ! selfcollection : SELF
 !
-REAL,SAVE :: XAUTO1, XAUTO2, XCAUTR,           & ! Constants for cloud droplet
-    	     XLAUTR, XLAUTR_THRESHOLD,         & ! autoconversion : AUT
-    	     XITAUTR, XITAUTR_THRESHOLD, XR0     ! XR0 for KHKO autoconversion
+REAL      :: XAUTO1, XAUTO2, XCAUTR,           & ! Constants for cloud droplet
+                 XLAUTR, XLAUTR_THRESHOLD,         & ! autoconversion : AUT
+                 XITAUTR, XITAUTR_THRESHOLD, XR0     ! XR0 for KHKO autoconversion
 !
-REAL,SAVE :: XACCR1, XACCR2, XACCR3,           & ! Constants for the accretion
-	     XACCR4, XACCR5, XACCR6,           & ! process
+REAL      :: XACCR1, XACCR2, XACCR3,           & ! Constants for the accretion
+             XACCR4, XACCR5, XACCR6,           & ! process
              XACCR_CLARGE1, XACCR_CLARGE2, XACCR_RLARGE1, XACCR_RLARGE2, &
              XACCR_CSMALL1, XACCR_CSMALL2, XACCR_RSMALL1, XACCR_RSMALL2, &
              XFCACCR, XEXCACCR
 !
-REAL,SAVE :: XSCBU2, XSCBU3,                   & ! Constants for the raindrop
+REAL      :: XSCBU2, XSCBU3,                   & ! Constants for the raindrop
              XSCBU_EFF1, XSCBU_EFF2, XSCBUEXP1   ! breakup-selfcollection: SCBU
 !
-REAL,SAVE :: XSPONBUD1,XSPONBUD2,XSPONBUD3,    & ! Spontaneous Break-up
+REAL      :: XSPONBUD1,XSPONBUD2,XSPONBUD3,    & ! Spontaneous Break-up
              XSPONCOEF2                          ! (drop size limiter)
 !
-REAL,SAVE :: X0EVAR, X1EVAR,                   & ! Constants for raindrop
-	     XEX0EVAR, XEX1EVAR, XEX2EVAR,     & ! evaporation: EVA 
+REAL      :: X0EVAR, X1EVAR,                   & ! Constants for raindrop
+             XEX0EVAR, XEX1EVAR, XEX2EVAR,     & ! evaporation: EVA
              XCEVAP                              ! for KHKO
 !
-REAL,DIMENSION(:,:,:,:), SAVE, ALLOCATABLE :: XCONCC_INI
-REAL,SAVE                                  :: XCONCR_PARAM_INI        
-                                      ! Used to initialize the 
+REAL,DIMENSION(:,:,:,:), ALLOCATABLE :: XCONCC_INI
+REAL                                 :: XCONCR_PARAM_INI
+                                      ! Used to initialize the
                                       ! concentrations from mixing ratios
                                       ! (init and grid-nesting from Kessler)
 !
-REAL,SAVE :: X0CNDC, X2CNDC                   ! Constants for cloud droplet
+REAL      :: X0CNDC, X2CNDC                   ! Constants for cloud droplet
                                               ! condensation/evaporation
-REAL,SAVE :: XFREFFC  ! Factor to compute the cloud droplet effective radius
-REAL,SAVE :: XFREFFR  ! Factor to compute the rain drop     effective radius
-REAL,SAVE :: XCREC, XCRER
+REAL      :: XFREFFC  ! Factor to compute the cloud droplet effective radius
+REAL      :: XFREFFR  ! Factor to compute the rain drop     effective radius
+REAL      :: XCREC, XCRER
                       ! Factors to compute reff when cloud and rain are present
+END TYPE PARAM_LIMA_WARM_t
+!
+TYPE(PARAM_LIMA_WARM_t), TARGET, SAVE :: PARAM_LIMA_WARM
+!
+REAL, POINTER :: XLBC => NULL(), &
+                 XLBEXC => NULL(), &
+                 XLBR => NULL(), &
+                 XLBEXR => NULL(), &
+                 XNR => NULL(), &
+                 XAR => NULL(), &
+                 XBR => NULL(), &
+                 XCR => NULL(), &
+                 XDR => NULL(), &
+                 XF0R => NULL(), &
+                 XF1R => NULL(), &
+                 XCCR => NULL(), &
+                 XCXR => NULL(), &
+                 XAC => NULL(), &
+                 XBC => NULL(), &
+                 XCC => NULL(), &
+                 XDC => NULL(), &
+                 XF0C => NULL(), &
+                 XF2C => NULL(), &
+                 XC1C => NULL(), &
+                 XFSEDRR => NULL(), &
+                 XFSEDCR => NULL(), &
+                 XFSEDRC => NULL(), &
+                 XFSEDCC => NULL(), &
+                 XDIVA => NULL(), &
+                 XTHCO => NULL(), &
+                 XWMIN => NULL(), &
+                 XTMIN => NULL(), &
+                 XCSTHEN => NULL(), &
+                 XCSTDCRIT => NULL(), &
+                 XHYPINTP1 => NULL(), &
+                 XHYPINTP2 => NULL(), &
+                 XAHENINTP1 => NULL(), &
+                 XAHENINTP2 => NULL(), &
+                 XWCOEF_F1 => NULL(), &
+                 XWCOEF_F2 => NULL(), &
+                 XWCOEF_F3 => NULL(), &
+                 XWCOEF_Y1 => NULL(), &
+                 XWCOEF_Y2 => NULL(), &
+                 XWCOEF_Y3 => NULL(), &
+                 XKERA1 => NULL(), &
+                 XKERA2 => NULL(), &
+                 XSELFC => NULL(), &
+                 XAUTO1 => NULL(), &
+                 XAUTO2 => NULL(), &
+                 XCAUTR => NULL(), &
+                 XLAUTR => NULL(), &
+                 XLAUTR_THRESHOLD => NULL(), &
+                 XITAUTR => NULL(), &
+                 XITAUTR_THRESHOLD => NULL(), &
+                 XR0 => NULL(), &
+                 XACCR1 => NULL(), &
+                 XACCR2 => NULL(), &
+                 XACCR3 => NULL(), &
+                 XACCR4 => NULL(), &
+                 XACCR5 => NULL(), &
+                 XACCR6 => NULL(), &
+                 XACCR_CLARGE1 => NULL(), &
+                 XACCR_CLARGE2 => NULL(), &
+                 XACCR_RLARGE1 => NULL(), &
+                 XACCR_RLARGE2 => NULL(), &
+                 XACCR_CSMALL1 => NULL(), &
+                 XACCR_CSMALL2 => NULL(), &
+                 XACCR_RSMALL1 => NULL(), &
+                 XACCR_RSMALL2 => NULL(), &
+                 XFCACCR => NULL(), &
+                 XEXCACCR => NULL(), &
+                 XSCBU2 => NULL(), &
+                 XSCBU3 => NULL(), &
+                 XSCBU_EFF1 => NULL(), &
+                 XSCBU_EFF2 => NULL(), &
+                 XSCBUEXP1 => NULL(), &
+                 XSPONBUD1 => NULL(), &
+                 XSPONBUD2 => NULL(), &
+                 XSPONBUD3 => NULL(), &
+                 XSPONCOEF2 => NULL(), &
+                 X0EVAR => NULL(), &
+                 X1EVAR => NULL(), &
+                 XEX0EVAR => NULL(), &
+                 XEX1EVAR => NULL(), &
+                 XEX2EVAR => NULL(), &
+                 XCEVAP => NULL(), &
+                 XCONCR_PARAM_INI => NULL(), &
+                 X0CNDC => NULL(), &
+                 X2CNDC => NULL(), &
+                 XFREFFC => NULL(), &
+                 XFREFFR => NULL(), &
+                 XCREC => NULL(), &
+                 XCRER => NULL()
+
+INTEGER, POINTER :: NHYP => NULL(), &
+                    NAHEN => NULL()
+
+REAL, DIMENSION(:,:), POINTER :: XHYPF12 => NULL(), &
+                                 XHYPF32 => NULL()
+REAL, DIMENSION(:), POINTER :: XAHENG => NULL(), &
+                               XAHENG2 => NULL(), &
+                               XAHENG3 => NULL(), &
+                               XPSI1 => NULL(), &
+                               XPSI3 => NULL(), &
+                               XAHENF => NULL(), &
+                               XAHENY => NULL()
+REAL,DIMENSION(:,:,:,:), POINTER :: XCONCC_INI => NULL()
+!
+CHARACTER(LEN=JPSVNAMELGTMAX),DIMENSION(5),PARAMETER &
+                     :: CLIMA_WARM_NAMES=(/'CCLOUD  ','CRAIN   ','CCCNFREE','CCCNACTI','SPRO    '/)
+                                       ! basenames of the SV articles stored
+                                       ! in the binary files
+CHARACTER(LEN=JPSVNAMELGTMAX),DIMENSION(5),PARAMETER &
+                     :: CLIMA_WARM_CONC=(/'NC   ','NR   ','NFREE','NCCN ','SS   '/)
+!                                       ! basenames of the SV articles stored
+!                                       ! in the binary files for DIAG
+!
+!* Special issue for Below-Cloud SCAVenging of Aerosol particles
+CHARACTER(LEN=JPSVNAMELGTMAX),DIMENSION(2),PARAMETER :: CAERO_MASS =(/'MASSAP', 'MAP   '/)
+!
+CONTAINS
+SUBROUTINE PARAM_LIMA_WARM_ASSOCIATE()
+IMPLICIT NONE
+IF(.NOT. ASSOCIATED(XLBC)) THEN
+  XLBC              => PARAM_LIMA_WARM%XLBC
+  XLBEXC            => PARAM_LIMA_WARM%XLBEXC
+  XLBR              => PARAM_LIMA_WARM%XLBR
+  XLBEXR            => PARAM_LIMA_WARM%XLBEXR
+  XNR               => PARAM_LIMA_WARM%XNR
+  XAR               => PARAM_LIMA_WARM%XAR
+  XBR               => PARAM_LIMA_WARM%XBR
+  XCR               => PARAM_LIMA_WARM%XCR
+  XDR               => PARAM_LIMA_WARM%XDR
+  XF0R              => PARAM_LIMA_WARM%XF0R
+  XF1R              => PARAM_LIMA_WARM%XF1R
+  XCCR              => PARAM_LIMA_WARM%XCCR
+  XCXR              => PARAM_LIMA_WARM%XCXR
+  XAC               => PARAM_LIMA_WARM%XAC
+  XBC               => PARAM_LIMA_WARM%XBC
+  XCC               => PARAM_LIMA_WARM%XCC
+  XDC               => PARAM_LIMA_WARM%XDC
+  XF0C              => PARAM_LIMA_WARM%XF0C
+  XF2C              => PARAM_LIMA_WARM%XF2C
+  XC1C              => PARAM_LIMA_WARM%XC1C
+  XFSEDRR           => PARAM_LIMA_WARM%XFSEDRR
+  XFSEDCR           => PARAM_LIMA_WARM%XFSEDCR
+  XFSEDRC           => PARAM_LIMA_WARM%XFSEDRC
+  XFSEDCC           => PARAM_LIMA_WARM%XFSEDCC
+  XDIVA             => PARAM_LIMA_WARM%XDIVA
+  XTHCO             => PARAM_LIMA_WARM%XTHCO
+  XWMIN             => PARAM_LIMA_WARM%XWMIN
+  XTMIN             => PARAM_LIMA_WARM%XTMIN
+  XCSTHEN           => PARAM_LIMA_WARM%XCSTHEN
+  XCSTDCRIT         => PARAM_LIMA_WARM%XCSTDCRIT
+  XHYPINTP1         => PARAM_LIMA_WARM%XHYPINTP1
+  XHYPINTP2         => PARAM_LIMA_WARM%XHYPINTP2
+  XAHENINTP1        => PARAM_LIMA_WARM%XAHENINTP1
+  XAHENINTP2        => PARAM_LIMA_WARM%XAHENINTP2
+  XWCOEF_F1         => PARAM_LIMA_WARM%XWCOEF_F1
+  XWCOEF_F2         => PARAM_LIMA_WARM%XWCOEF_F2
+  XWCOEF_F3         => PARAM_LIMA_WARM%XWCOEF_F3
+  XWCOEF_Y1         => PARAM_LIMA_WARM%XWCOEF_Y1
+  XWCOEF_Y2         => PARAM_LIMA_WARM%XWCOEF_Y2
+  XWCOEF_Y3         => PARAM_LIMA_WARM%XWCOEF_Y3
+  XKERA1            => PARAM_LIMA_WARM%XKERA1
+  XKERA2            => PARAM_LIMA_WARM%XKERA2
+  XSELFC            => PARAM_LIMA_WARM%XSELFC
+  XAUTO1            => PARAM_LIMA_WARM%XAUTO1
+  XAUTO2            => PARAM_LIMA_WARM%XAUTO2
+  XCAUTR            => PARAM_LIMA_WARM%XCAUTR
+  XLAUTR            => PARAM_LIMA_WARM%XLAUTR
+  XLAUTR_THRESHOLD  => PARAM_LIMA_WARM%XLAUTR_THRESHOLD
+  XITAUTR           => PARAM_LIMA_WARM%XITAUTR
+  XITAUTR_THRESHOLD => PARAM_LIMA_WARM%XITAUTR_THRESHOLD
+  XR0               => PARAM_LIMA_WARM%XR0
+  XACCR1            => PARAM_LIMA_WARM%XACCR1
+  XACCR2            => PARAM_LIMA_WARM%XACCR2
+  XACCR3            => PARAM_LIMA_WARM%XACCR3
+  XACCR4            => PARAM_LIMA_WARM%XACCR4
+  XACCR5            => PARAM_LIMA_WARM%XACCR5
+  XACCR6            => PARAM_LIMA_WARM%XACCR6
+  XACCR_CLARGE1     => PARAM_LIMA_WARM%XACCR_CLARGE1
+  XACCR_CLARGE2     => PARAM_LIMA_WARM%XACCR_CLARGE2
+  XACCR_RLARGE1     => PARAM_LIMA_WARM%XACCR_RLARGE1
+  XACCR_RLARGE2     => PARAM_LIMA_WARM%XACCR_RLARGE2
+  XACCR_CSMALL1     => PARAM_LIMA_WARM%XACCR_CSMALL1
+  XACCR_CSMALL2     => PARAM_LIMA_WARM%XACCR_CSMALL2
+  XACCR_RSMALL1     => PARAM_LIMA_WARM%XACCR_RSMALL1
+  XACCR_RSMALL2     => PARAM_LIMA_WARM%XACCR_RSMALL2
+  XFCACCR           => PARAM_LIMA_WARM%XFCACCR
+  XEXCACCR          => PARAM_LIMA_WARM%XEXCACCR
+  XSCBU2            => PARAM_LIMA_WARM%XSCBU2
+  XSCBU3            => PARAM_LIMA_WARM%XSCBU3
+  XSCBU_EFF1        => PARAM_LIMA_WARM%XSCBU_EFF1
+  XSCBU_EFF2        => PARAM_LIMA_WARM%XSCBU_EFF2
+  XSCBUEXP1         => PARAM_LIMA_WARM%XSCBUEXP1
+  XSPONBUD1         => PARAM_LIMA_WARM%XSPONBUD1
+  XSPONBUD2         => PARAM_LIMA_WARM%XSPONBUD2
+  XSPONBUD3         => PARAM_LIMA_WARM%XSPONBUD3
+  XSPONCOEF2        => PARAM_LIMA_WARM%XSPONCOEF2
+  X0EVAR            => PARAM_LIMA_WARM%X0EVAR
+  X1EVAR            => PARAM_LIMA_WARM%X1EVAR
+  XEX0EVAR          => PARAM_LIMA_WARM%XEX0EVAR
+  XEX1EVAR          => PARAM_LIMA_WARM%XEX1EVAR
+  XEX2EVAR          => PARAM_LIMA_WARM%XEX2EVAR
+  XCEVAP            => PARAM_LIMA_WARM%XCEVAP
+  XCONCR_PARAM_INI  => PARAM_LIMA_WARM%XCONCR_PARAM_INI
+  X0CNDC            => PARAM_LIMA_WARM%X0CNDC
+  X2CNDC            => PARAM_LIMA_WARM%X2CNDC
+  XFREFFC           => PARAM_LIMA_WARM%XFREFFC
+  XFREFFR           => PARAM_LIMA_WARM%XFREFFR
+  XCREC             => PARAM_LIMA_WARM%XCREC
+  XCRER             => PARAM_LIMA_WARM%XCRER
+
+  NHYP              => PARAM_LIMA_WARM%NHYP
+  NAHEN             => PARAM_LIMA_WARM%NAHEN
+ENDIF
+END SUBROUTINE PARAM_LIMA_WARM_ASSOCIATE
+!
+SUBROUTINE PARAM_LIMA_WARM_ALLOCATE(HNAME, KDIM1, KDIM2, KDIM3, KDIM4)
+  IMPLICIT NONE
+  CHARACTER(LEN=*), INTENT(IN) :: HNAME
+  INTEGER, INTENT(IN)          :: KDIM1
+  INTEGER, OPTIONAL, INTENT(IN):: KDIM2
+  INTEGER, OPTIONAL, INTENT(IN):: KDIM3
+  INTEGER, OPTIONAL, INTENT(IN):: KDIM4
+
+  SELECT CASE(TRIM(HNAME))
+    CASE('XHYPF12')
+      ALLOCATE(PARAM_LIMA_WARM%XHYPF12(KDIM1, KDIM2))
+      XHYPF12 => PARAM_LIMA_WARM%XHYPF12
+    CASE('XHYPF32')
+      ALLOCATE(PARAM_LIMA_WARM%XHYPF32(KDIM1, KDIM2))
+      XHYPF32 => PARAM_LIMA_WARM%XHYPF32
+    CASE('XAHENG')
+      ALLOCATE(PARAM_LIMA_WARM%XAHENG(KDIM1))
+      XAHENG => PARAM_LIMA_WARM%XAHENG
+    CASE('XAHENG2')
+      ALLOCATE(PARAM_LIMA_WARM%XAHENG2(KDIM1))
+      XAHENG2 => PARAM_LIMA_WARM%XAHENG2
+    CASE('XAHENG3')
+      ALLOCATE(PARAM_LIMA_WARM%XAHENG3(KDIM1))
+      XAHENG3 => PARAM_LIMA_WARM%XAHENG3
+    CASE('XPSI1')
+      ALLOCATE(PARAM_LIMA_WARM%XPSI1(KDIM1))
+      XPSI1 => PARAM_LIMA_WARM%XPSI1
+    CASE('XPSI3')
+      ALLOCATE(PARAM_LIMA_WARM%XPSI3(KDIM1))
+      XPSI3 => PARAM_LIMA_WARM%XPSI3
+    CASE('XAHENF')
+      ALLOCATE(PARAM_LIMA_WARM%XAHENF(KDIM1))
+      XAHENF => PARAM_LIMA_WARM%XAHENF
+    CASE('XAHENY')
+      ALLOCATE(PARAM_LIMA_WARM%XAHENY(KDIM1))
+      XAHENY => PARAM_LIMA_WARM%XAHENY
+    CASE('XCONCC_INI')
+      ALLOCATE(PARAM_LIMA_WARM%XCONCC_INI(KDIM1,KDIM2,KDIM3,KDIM4))
+      XCONCC_INI => PARAM_LIMA_WARM%XCONCC_INI
+  END SELECT
+END SUBROUTINE PARAM_LIMA_WARM_ALLOCATE
 !
 !-------------------------------------------------------------------------------
 !
diff --git a/src/PHYEX/micro/modd_rain_c2r2_descr.f90 b/src/PHYEX/micro/modd_rain_c2r2_descr.f90
index 82146aac4fbb15f11b6e90534fec2dab76af9772..cabbebbd7f02b319e10869d5efa4bcfdc44772f4 100644
--- a/src/PHYEX/micro/modd_rain_c2r2_descr.f90
+++ b/src/PHYEX/micro/modd_rain_c2r2_descr.f90
@@ -46,6 +46,7 @@
 !!
 !-------------------------------------------------------------------------------
 USE MODD_PARAMETERS, ONLY: JPSVNAMELGTMAX
+IMPLICIT NONE
 !
 !*       0.   DECLARATIONS
 !             ------------
diff --git a/src/PHYEX/micro/modd_rain_ice_descrn.f90 b/src/PHYEX/micro/modd_rain_ice_descrn.f90
index a7b8113de349c3a565fde4d35868393d618d8890..c34d41fa90ebd451f8c3536550803086a4893445 100644
--- a/src/PHYEX/micro/modd_rain_ice_descrn.f90
+++ b/src/PHYEX/micro/modd_rain_ice_descrn.f90
@@ -3,11 +3,11 @@
 !MNH_LIC version 1. See LICENSE, CeCILL-C_V1-en.txt and CeCILL-C_V1-fr.txt  
 !MNH_LIC for details. version 1.
 !     ##########################
-      MODULE MODD_RAIN_ICE_DESCR
+      MODULE MODD_RAIN_ICE_DESCR_n
 !     ##########################
-!
-!!****  *MODD_RAIN_ICE_DESCR* - declaration of the microphysical descriptive
-!!                              constants for use in the warm and cold schemes.
+!> @file
+!!****  *MODD_RAIN_ICE_DESCR_n* - declaration of the microphysical descriptive
+!!                                constants for use in the warm and cold schemes.
 !!
 !!    PURPOSE
 !!    -------
@@ -52,6 +52,7 @@
 !*       0.   DECLARATIONS
 !             ------------
 !
+USE MODD_PARAMETERS, ONLY: JPMODELMAX
 IMPLICIT NONE
 TYPE RAIN_ICE_DESCR_t
 REAL :: XCEXVT               ! air density fall speed correction
@@ -82,7 +83,8 @@ REAL :: XCONC_LAND  !  Diagnostic concentration of droplets over land
 REAL :: XCONC_URBAN ! Diagnostic concentration of droplets over urban area
 END TYPE RAIN_ICE_DESCR_t
 !
-TYPE(RAIN_ICE_DESCR_t), SAVE, TARGET :: RAIN_ICE_DESCR
+TYPE(RAIN_ICE_DESCR_t), DIMENSION(JPMODELMAX), TARGET, SAVE :: RAIN_ICE_DESCR_MODEL
+TYPE(RAIN_ICE_DESCR_t), POINTER, SAVE :: RAIN_ICE_DESCRN => NULL()
 !
 REAL,DIMENSION(:),POINTER :: XLBC=>NULL(), XRTMIN=>NULL()
 REAL, POINTER :: XCEXVT => NULL(), &
@@ -169,104 +171,114 @@ REAL, POINTER :: XCEXVT => NULL(), &
                  XLBDAS_MIN => NULL()
 !
 CONTAINS
-SUBROUTINE RAIN_ICE_DESCR_ASSOCIATE()
-  IMPLICIT NONE
-  XCEXVT => RAIN_ICE_DESCR%XCEXVT
-  XAC => RAIN_ICE_DESCR%XAC
-  XBC => RAIN_ICE_DESCR%XBC
-  XCC => RAIN_ICE_DESCR%XCC
-  XDC => RAIN_ICE_DESCR%XDC
-  XAR => RAIN_ICE_DESCR%XAR
-  XBR => RAIN_ICE_DESCR%XBR
-  XCR => RAIN_ICE_DESCR%XCR
-  XDR => RAIN_ICE_DESCR%XDR
-  XCCR => RAIN_ICE_DESCR%XCCR
-  XF0R => RAIN_ICE_DESCR%XF0R
-  XF1R => RAIN_ICE_DESCR%XF1R
-  XC1R => RAIN_ICE_DESCR%XC1R
-  XAI => RAIN_ICE_DESCR%XAI
-  XBI => RAIN_ICE_DESCR%XBI
-  XC_I => RAIN_ICE_DESCR%XC_I
-  XDI => RAIN_ICE_DESCR%XDI
-  XF0I => RAIN_ICE_DESCR%XF0I
-  XF2I => RAIN_ICE_DESCR%XF2I
-  XC1I => RAIN_ICE_DESCR%XC1I
-  XAS => RAIN_ICE_DESCR%XAS
-  XBS => RAIN_ICE_DESCR%XBS
-  XCS => RAIN_ICE_DESCR%XCS
-  XDS => RAIN_ICE_DESCR%XDS
-  XCCS => RAIN_ICE_DESCR%XCCS
-  XCXS => RAIN_ICE_DESCR%XCXS
-  XF0S => RAIN_ICE_DESCR%XF0S
-  XF1S => RAIN_ICE_DESCR%XF1S
-  XC1S => RAIN_ICE_DESCR%XC1S
-  XAG => RAIN_ICE_DESCR%XAG
-  XBG => RAIN_ICE_DESCR%XBG
-  XCG => RAIN_ICE_DESCR%XCG
-  XDG => RAIN_ICE_DESCR%XDG
-  XCCG => RAIN_ICE_DESCR%XCCG
-  XCXG => RAIN_ICE_DESCR%XCXG
-  XF0G => RAIN_ICE_DESCR%XF0G
-  XF1G => RAIN_ICE_DESCR%XF1G
-  XC1G => RAIN_ICE_DESCR%XC1G
-  XAH => RAIN_ICE_DESCR%XAH
-  XBH => RAIN_ICE_DESCR%XBH
-  XCH => RAIN_ICE_DESCR%XCH
-  XDH => RAIN_ICE_DESCR%XDH
-  XCCH => RAIN_ICE_DESCR%XCCH
-  XCXH => RAIN_ICE_DESCR%XCXH
-  XF0H => RAIN_ICE_DESCR%XF0H
-  XF1H => RAIN_ICE_DESCR%XF1H
-  XC1H => RAIN_ICE_DESCR%XC1H
-  XALPHAC => RAIN_ICE_DESCR%XALPHAC
-  XNUC => RAIN_ICE_DESCR%XNUC
-  XALPHAC2 => RAIN_ICE_DESCR%XALPHAC2
-  XNUC2 => RAIN_ICE_DESCR%XNUC2
-  XLBEXC => RAIN_ICE_DESCR%XLBEXC
-  XALPHAR => RAIN_ICE_DESCR%XALPHAR
-  XNUR => RAIN_ICE_DESCR%XNUR
-  XLBEXR => RAIN_ICE_DESCR%XLBEXR
-  XLBR => RAIN_ICE_DESCR%XLBR
-  XALPHAI => RAIN_ICE_DESCR%XALPHAI
-  XNUI => RAIN_ICE_DESCR%XNUI
-  XLBEXI => RAIN_ICE_DESCR%XLBEXI
-  XLBI => RAIN_ICE_DESCR%XLBI
-  XALPHAS => RAIN_ICE_DESCR%XALPHAS
-  XNUS => RAIN_ICE_DESCR%XNUS
-  XLBEXS => RAIN_ICE_DESCR%XLBEXS
-  XLBS => RAIN_ICE_DESCR%XLBS
-  XALPHAG => RAIN_ICE_DESCR%XALPHAG
-  XNUG => RAIN_ICE_DESCR%XNUG
-  XLBEXG => RAIN_ICE_DESCR%XLBEXG
-  XLBG => RAIN_ICE_DESCR%XLBG
-  XALPHAH => RAIN_ICE_DESCR%XALPHAH
-  XNUH => RAIN_ICE_DESCR%XNUH
-  XLBEXH => RAIN_ICE_DESCR%XLBEXH
-  XLBH => RAIN_ICE_DESCR%XLBH
-  XLBDAR_MAX => RAIN_ICE_DESCR%XLBDAR_MAX
-  XLBDAS_MAX => RAIN_ICE_DESCR%XLBDAS_MAX
-  XLBDAG_MAX => RAIN_ICE_DESCR%XLBDAG_MAX
-  XCONC_SEA => RAIN_ICE_DESCR%XCONC_SEA
-  XCONC_LAND => RAIN_ICE_DESCR%XCONC_LAND
-  XCONC_URBAN => RAIN_ICE_DESCR%XCONC_URBAN
-  XNS => RAIN_ICE_DESCR%XNS
-  XFVELOS => RAIN_ICE_DESCR%XFVELOS
-  XTRANS_MP_GAMMAS => RAIN_ICE_DESCR%XTRANS_MP_GAMMAS
-  XLBDAS_MIN => RAIN_ICE_DESCR%XLBDAS_MIN
-END SUBROUTINE
+SUBROUTINE RAIN_ICE_DESCR_GOTO_MODEL(KFROM, KTO)
+!! This subroutine associate all the pointers to the right component of
+!! the right strucuture. A value can be accessed through the structure RAIN_ICE_DESCRN
+!! or through the strucuture RAIN_ICE_DESCR_MODEL(KTO) or directly through these pointers.
+IMPLICIT NONE
+INTEGER, INTENT(IN) :: KFROM, KTO
+!
+IF(.NOT. ASSOCIATED(RAIN_ICE_DESCRN, RAIN_ICE_DESCR_MODEL(KTO))) THEN    
+  !
+  RAIN_ICE_DESCRN => RAIN_ICE_DESCR_MODEL(KTO) 
+  !
+  XCEXVT => RAIN_ICE_DESCRN%XCEXVT
+  XAC => RAIN_ICE_DESCRN%XAC
+  XBC => RAIN_ICE_DESCRN%XBC
+  XCC => RAIN_ICE_DESCRN%XCC
+  XDC => RAIN_ICE_DESCRN%XDC
+  XAR => RAIN_ICE_DESCRN%XAR
+  XBR => RAIN_ICE_DESCRN%XBR
+  XCR => RAIN_ICE_DESCRN%XCR
+  XDR => RAIN_ICE_DESCRN%XDR
+  XCCR => RAIN_ICE_DESCRN%XCCR
+  XF0R => RAIN_ICE_DESCRN%XF0R
+  XF1R => RAIN_ICE_DESCRN%XF1R
+  XC1R => RAIN_ICE_DESCRN%XC1R
+  XAI => RAIN_ICE_DESCRN%XAI
+  XBI => RAIN_ICE_DESCRN%XBI
+  XC_I => RAIN_ICE_DESCRN%XC_I
+  XDI => RAIN_ICE_DESCRN%XDI
+  XF0I => RAIN_ICE_DESCRN%XF0I
+  XF2I => RAIN_ICE_DESCRN%XF2I
+  XC1I => RAIN_ICE_DESCRN%XC1I
+  XAS => RAIN_ICE_DESCRN%XAS
+  XBS => RAIN_ICE_DESCRN%XBS
+  XCS => RAIN_ICE_DESCRN%XCS
+  XDS => RAIN_ICE_DESCRN%XDS
+  XCCS => RAIN_ICE_DESCRN%XCCS
+  XCXS => RAIN_ICE_DESCRN%XCXS
+  XF0S => RAIN_ICE_DESCRN%XF0S
+  XF1S => RAIN_ICE_DESCRN%XF1S
+  XC1S => RAIN_ICE_DESCRN%XC1S
+  XAG => RAIN_ICE_DESCRN%XAG
+  XBG => RAIN_ICE_DESCRN%XBG
+  XCG => RAIN_ICE_DESCRN%XCG
+  XDG => RAIN_ICE_DESCRN%XDG
+  XCCG => RAIN_ICE_DESCRN%XCCG
+  XCXG => RAIN_ICE_DESCRN%XCXG
+  XF0G => RAIN_ICE_DESCRN%XF0G
+  XF1G => RAIN_ICE_DESCRN%XF1G
+  XC1G => RAIN_ICE_DESCRN%XC1G
+  XAH => RAIN_ICE_DESCRN%XAH
+  XBH => RAIN_ICE_DESCRN%XBH
+  XCH => RAIN_ICE_DESCRN%XCH
+  XDH => RAIN_ICE_DESCRN%XDH
+  XCCH => RAIN_ICE_DESCRN%XCCH
+  XCXH => RAIN_ICE_DESCRN%XCXH
+  XF0H => RAIN_ICE_DESCRN%XF0H
+  XF1H => RAIN_ICE_DESCRN%XF1H
+  XC1H => RAIN_ICE_DESCRN%XC1H
+  XALPHAC => RAIN_ICE_DESCRN%XALPHAC
+  XNUC => RAIN_ICE_DESCRN%XNUC
+  XALPHAC2 => RAIN_ICE_DESCRN%XALPHAC2
+  XNUC2 => RAIN_ICE_DESCRN%XNUC2
+  XLBEXC => RAIN_ICE_DESCRN%XLBEXC
+  XALPHAR => RAIN_ICE_DESCRN%XALPHAR
+  XNUR => RAIN_ICE_DESCRN%XNUR
+  XLBEXR => RAIN_ICE_DESCRN%XLBEXR
+  XLBR => RAIN_ICE_DESCRN%XLBR
+  XALPHAI => RAIN_ICE_DESCRN%XALPHAI
+  XNUI => RAIN_ICE_DESCRN%XNUI
+  XLBEXI => RAIN_ICE_DESCRN%XLBEXI
+  XLBI => RAIN_ICE_DESCRN%XLBI
+  XALPHAS => RAIN_ICE_DESCRN%XALPHAS
+  XNUS => RAIN_ICE_DESCRN%XNUS
+  XLBEXS => RAIN_ICE_DESCRN%XLBEXS
+  XLBS => RAIN_ICE_DESCRN%XLBS
+  XALPHAG => RAIN_ICE_DESCRN%XALPHAG
+  XNUG => RAIN_ICE_DESCRN%XNUG
+  XLBEXG => RAIN_ICE_DESCRN%XLBEXG
+  XLBG => RAIN_ICE_DESCRN%XLBG
+  XALPHAH => RAIN_ICE_DESCRN%XALPHAH
+  XNUH => RAIN_ICE_DESCRN%XNUH
+  XLBEXH => RAIN_ICE_DESCRN%XLBEXH
+  XLBH => RAIN_ICE_DESCRN%XLBH
+  XLBDAR_MAX => RAIN_ICE_DESCRN%XLBDAR_MAX
+  XLBDAS_MAX => RAIN_ICE_DESCRN%XLBDAS_MAX
+  XLBDAG_MAX => RAIN_ICE_DESCRN%XLBDAG_MAX
+  XCONC_SEA => RAIN_ICE_DESCRN%XCONC_SEA
+  XCONC_LAND => RAIN_ICE_DESCRN%XCONC_LAND
+  XCONC_URBAN => RAIN_ICE_DESCRN%XCONC_URBAN
+  XNS => RAIN_ICE_DESCRN%XNS
+  XFVELOS => RAIN_ICE_DESCRN%XFVELOS
+  XTRANS_MP_GAMMAS => RAIN_ICE_DESCRN%XTRANS_MP_GAMMAS
+  XLBDAS_MIN => RAIN_ICE_DESCRN%XLBDAS_MIN
+ENDIF
+END SUBROUTINE RAIN_ICE_DESCR_GOTO_MODEL
 !
 SUBROUTINE RAIN_ICE_DESCR_ALLOCATE(KRR)
   IMPLICIT NONE
   INTEGER, INTENT(IN) :: KRR
-  ALLOCATE(RAIN_ICE_DESCR%XRTMIN(KRR))
-  XRTMIN=>RAIN_ICE_DESCR%XRTMIN
-  XLBC=>RAIN_ICE_DESCR%XLBC
+  ALLOCATE(RAIN_ICE_DESCRN%XRTMIN(KRR))
+  XRTMIN=>RAIN_ICE_DESCRN%XRTMIN
+  XLBC=>RAIN_ICE_DESCRN%XLBC
 END SUBROUTINE RAIN_ICE_DESCR_ALLOCATE
 !
 SUBROUTINE RAIN_ICE_DESCR_DEALLOCATE()
   IMPLICIT NONE
   XRTMIN=>NULL()
-  DEALLOCATE(RAIN_ICE_DESCR%XRTMIN)
+  DEALLOCATE(RAIN_ICE_DESCRN%XRTMIN)
 END SUBROUTINE RAIN_ICE_DESCR_DEALLOCATE
 !
-END MODULE MODD_RAIN_ICE_DESCR
+END MODULE MODD_RAIN_ICE_DESCR_n
diff --git a/src/PHYEX/micro/modd_rain_ice_paramn.f90 b/src/PHYEX/micro/modd_rain_ice_paramn.f90
index 40acb8f56888d5193c2fc09e7acc36993814beb2..c3919cf7d4b44a015bcc86ed55fb38b6d849ce62 100644
--- a/src/PHYEX/micro/modd_rain_ice_paramn.f90
+++ b/src/PHYEX/micro/modd_rain_ice_paramn.f90
@@ -3,11 +3,11 @@
 !MNH_LIC version 1. See LICENSE, CeCILL-C_V1-en.txt and CeCILL-C_V1-fr.txt  
 !MNH_LIC for details. version 1.
 !     ######spl
-      MODULE MODD_RAIN_ICE_PARAM
+      MODULE MODD_RAIN_ICE_PARAM_n
 !     ##########################
-!
-!!****  *MODD_RAIN_ICE_PARAM* - declaration of some microphysical factors
-!!                              extensively used in the warm and cold schemes.
+!> @file
+!!****  *MODD_RAIN_ICE_PARAM_n* - declaration of some microphysical factors
+!!                                extensively used in the warm and cold schemes.
 !!
 !!    PURPOSE
 !!    -------
@@ -38,6 +38,7 @@
 !*       0.   DECLARATIONS
 !             ------------
 !
+USE MODD_PARAMETERS, ONLY: JPMODELMAX
 IMPLICIT NONE
 !
 TYPE RAIN_ICE_PARAM_t
@@ -187,7 +188,8 @@ REAL,DIMENSION(:,:), ALLOCATABLE         &
 REAL, DIMENSION(40) :: XFRMIN                    ! Parmeters to modify melt and growth of graupels etc.
 END TYPE RAIN_ICE_PARAM_t
 !
-TYPE(RAIN_ICE_PARAM_t), SAVE, TARGET :: RAIN_ICE_PARAM
+TYPE(RAIN_ICE_PARAM_t), DIMENSION(JPMODELMAX), TARGET, SAVE :: RAIN_ICE_PARAM_MODEL
+TYPE(RAIN_ICE_PARAM_t), POINTER, SAVE :: RAIN_ICE_PARAMN => NULL()
 !
 REAL,DIMENSION(:),POINTER :: XFSEDC => NULL()
 REAL,DIMENSION(:),POINTER :: XFRMIN => NULL()
@@ -373,179 +375,224 @@ REAL,DIMENSION(:,:), POINTER :: XKER_RACCSS => NULL(), &
                                 XKER_GWETH => NULL(), &
                                 XKER_RWETH => NULL()
 CONTAINS
-SUBROUTINE RAIN_ICE_PARAM_ASSOCIATE()
-  IMPLICIT NONE
-  XFSEDC => RAIN_ICE_PARAM%XFSEDC
-  XFRMIN => RAIN_ICE_PARAM%XFRMIN
+SUBROUTINE RAIN_ICE_PARAM_GOTO_MODEL(KFROM, KTO)
+!! This subroutine associate all the pointers to the right component of
+!! the right strucuture. A value can be accessed through the structure RAIN_ICE_PARAMN
+!! or through the strucuture RAIN_ICE_PARAM_MODEL(KTO) or directly through these pointers.
+IMPLICIT NONE
+INTEGER, INTENT(IN) :: KFROM, KTO
+!
+IF(.NOT. ASSOCIATED(RAIN_ICE_PARAMN, RAIN_ICE_PARAM_MODEL(KTO))) THEN
+  !
+  RAIN_ICE_PARAMN => RAIN_ICE_PARAM_MODEL(KTO)
+  !
+  XFSEDC => RAIN_ICE_PARAMN%XFSEDC
+  XFRMIN => RAIN_ICE_PARAMN%XFRMIN
+  !
+  XFSEDR => RAIN_ICE_PARAMN%XFSEDR
+  XEXSEDR => RAIN_ICE_PARAMN%XEXSEDR
+  XFSEDI => RAIN_ICE_PARAMN%XFSEDI
+  XEXCSEDI => RAIN_ICE_PARAMN%XEXCSEDI
+  XEXRSEDI => RAIN_ICE_PARAMN%XEXRSEDI
+  XFSEDS => RAIN_ICE_PARAMN%XFSEDS
+  XEXSEDS => RAIN_ICE_PARAMN%XEXSEDS
+  XFSEDG => RAIN_ICE_PARAMN%XFSEDG
+  XEXSEDG => RAIN_ICE_PARAMN%XEXSEDG
+  XNU10 => RAIN_ICE_PARAMN%XNU10
+  XALPHA1 => RAIN_ICE_PARAMN%XALPHA1
+  XBETA1 => RAIN_ICE_PARAMN%XBETA1
+  XNU20 => RAIN_ICE_PARAMN%XNU20
+  XALPHA2 => RAIN_ICE_PARAMN%XALPHA2
+  XBETA2 => RAIN_ICE_PARAMN%XBETA2
+  XMNU0 => RAIN_ICE_PARAMN%XMNU0
+  XALPHA3 => RAIN_ICE_PARAMN%XALPHA3
+  XBETA3 => RAIN_ICE_PARAMN%XBETA3
+  XHON => RAIN_ICE_PARAMN%XHON
+  XSCFAC => RAIN_ICE_PARAMN%XSCFAC
+  X0EVAR => RAIN_ICE_PARAMN%X0EVAR
+  X1EVAR => RAIN_ICE_PARAMN%X1EVAR
+  XEX0EVAR => RAIN_ICE_PARAMN%XEX0EVAR
+  XEX1EVAR => RAIN_ICE_PARAMN%XEX1EVAR
+  X0DEPI => RAIN_ICE_PARAMN%X0DEPI
+  X2DEPI => RAIN_ICE_PARAMN%X2DEPI
+  X0DEPS => RAIN_ICE_PARAMN%X0DEPS
+  X1DEPS => RAIN_ICE_PARAMN%X1DEPS
+  XEX0DEPS => RAIN_ICE_PARAMN%XEX0DEPS
+  XEX1DEPS => RAIN_ICE_PARAMN%XEX1DEPS
+  XRDEPSRED => RAIN_ICE_PARAMN%XRDEPSRED
+  X0DEPG => RAIN_ICE_PARAMN%X0DEPG
+  X1DEPG => RAIN_ICE_PARAMN%X1DEPG
+  XEX0DEPG => RAIN_ICE_PARAMN%XEX0DEPG
+  XEX1DEPG => RAIN_ICE_PARAMN%XEX1DEPG
+  XRDEPGRED => RAIN_ICE_PARAMN%XRDEPGRED
+  XTIMAUTI => RAIN_ICE_PARAMN%XTIMAUTI
+  XTEXAUTI => RAIN_ICE_PARAMN%XTEXAUTI
+  XCRIAUTI => RAIN_ICE_PARAMN%XCRIAUTI
+  XT0CRIAUTI => RAIN_ICE_PARAMN%XT0CRIAUTI
+  XACRIAUTI => RAIN_ICE_PARAMN%XACRIAUTI
+  XBCRIAUTI => RAIN_ICE_PARAMN%XBCRIAUTI
+  XCOLIS => RAIN_ICE_PARAMN%XCOLIS
+  XCOLEXIS => RAIN_ICE_PARAMN%XCOLEXIS
+  XFIAGGS => RAIN_ICE_PARAMN%XFIAGGS
+  XEXIAGGS => RAIN_ICE_PARAMN%XEXIAGGS
+  XTIMAUTC => RAIN_ICE_PARAMN%XTIMAUTC
+  XCRIAUTC => RAIN_ICE_PARAMN%XCRIAUTC
+  XFCACCR => RAIN_ICE_PARAMN%XFCACCR
+  XEXCACCR => RAIN_ICE_PARAMN%XEXCACCR
+  XDCSLIM => RAIN_ICE_PARAMN%XDCSLIM
+  XCOLCS => RAIN_ICE_PARAMN%XCOLCS
+  XEXCRIMSS => RAIN_ICE_PARAMN%XEXCRIMSS
+  XCRIMSS => RAIN_ICE_PARAMN%XCRIMSS
+  XEXCRIMSG => RAIN_ICE_PARAMN%XEXCRIMSG
+  XCRIMSG => RAIN_ICE_PARAMN%XCRIMSG
+  XEXSRIMCG => RAIN_ICE_PARAMN%XEXSRIMCG
+  XSRIMCG => RAIN_ICE_PARAMN%XSRIMCG
+  XEXSRIMCG2 => RAIN_ICE_PARAMN%XEXSRIMCG2
+  XSRIMCG2 => RAIN_ICE_PARAMN%XSRIMCG2
+  XSRIMCG3 => RAIN_ICE_PARAMN%XSRIMCG3
+  XGAMINC_BOUND_MIN => RAIN_ICE_PARAMN%XGAMINC_BOUND_MIN
+  XGAMINC_BOUND_MAX => RAIN_ICE_PARAMN%XGAMINC_BOUND_MAX
+  XRIMINTP1 => RAIN_ICE_PARAMN%XRIMINTP1
+  XRIMINTP2 => RAIN_ICE_PARAMN%XRIMINTP2
+  XFRACCSS => RAIN_ICE_PARAMN%XFRACCSS
+  XLBRACCS1 => RAIN_ICE_PARAMN%XLBRACCS1
+  XLBRACCS2 => RAIN_ICE_PARAMN%XLBRACCS2
+  XLBRACCS3 => RAIN_ICE_PARAMN%XLBRACCS3
+  XFSACCRG => RAIN_ICE_PARAMN%XFSACCRG
+  XLBSACCR1 => RAIN_ICE_PARAMN%XLBSACCR1
+  XLBSACCR2 => RAIN_ICE_PARAMN%XLBSACCR2
+  XLBSACCR3 => RAIN_ICE_PARAMN%XLBSACCR3
+  XACCLBDAS_MIN => RAIN_ICE_PARAMN%XACCLBDAS_MIN
+  XACCLBDAS_MAX => RAIN_ICE_PARAMN%XACCLBDAS_MAX
+  XACCLBDAR_MIN => RAIN_ICE_PARAMN%XACCLBDAR_MIN
+  XACCLBDAR_MAX => RAIN_ICE_PARAMN%XACCLBDAR_MAX
+  XACCINTP1S => RAIN_ICE_PARAMN%XACCINTP1S
+  XACCINTP2S => RAIN_ICE_PARAMN%XACCINTP2S
+  XACCINTP1R => RAIN_ICE_PARAMN%XACCINTP1R
+  XACCINTP2R => RAIN_ICE_PARAMN%XACCINTP2R
+  XFSCVMG => RAIN_ICE_PARAMN%XFSCVMG
+  XCOLIR => RAIN_ICE_PARAMN%XCOLIR
+  XEXRCFRI => RAIN_ICE_PARAMN%XEXRCFRI
+  XRCFRI => RAIN_ICE_PARAMN%XRCFRI
+  XEXICFRR => RAIN_ICE_PARAMN%XEXICFRR
+  XICFRR => RAIN_ICE_PARAMN%XICFRR
+  XFCDRYG => RAIN_ICE_PARAMN%XFCDRYG
+  XCOLIG => RAIN_ICE_PARAMN%XCOLIG
+  XCOLEXIG => RAIN_ICE_PARAMN%XCOLEXIG
+  XFIDRYG => RAIN_ICE_PARAMN%XFIDRYG
+  XFIDRYG2 => RAIN_ICE_PARAMN%XFIDRYG2
+  XEXFIDRYG => RAIN_ICE_PARAMN%XEXFIDRYG
+  XCOLSG => RAIN_ICE_PARAMN%XCOLSG
+  XCOLEXSG => RAIN_ICE_PARAMN%XCOLEXSG
+  XFSDRYG => RAIN_ICE_PARAMN%XFSDRYG
+  XLBSDRYG1 => RAIN_ICE_PARAMN%XLBSDRYG1
+  XLBSDRYG2 => RAIN_ICE_PARAMN%XLBSDRYG2
+  XLBSDRYG3 => RAIN_ICE_PARAMN%XLBSDRYG3
+  XFRDRYG => RAIN_ICE_PARAMN%XFRDRYG
+  XLBRDRYG1 => RAIN_ICE_PARAMN%XLBRDRYG1
+  XLBRDRYG2 => RAIN_ICE_PARAMN%XLBRDRYG2
+  XLBRDRYG3 => RAIN_ICE_PARAMN%XLBRDRYG3
+  XDRYLBDAR_MIN => RAIN_ICE_PARAMN%XDRYLBDAR_MIN
+  XDRYLBDAR_MAX => RAIN_ICE_PARAMN%XDRYLBDAR_MAX
+  XDRYLBDAS_MIN => RAIN_ICE_PARAMN%XDRYLBDAS_MIN
+  XDRYLBDAS_MAX => RAIN_ICE_PARAMN%XDRYLBDAS_MAX
+  XDRYLBDAG_MIN => RAIN_ICE_PARAMN%XDRYLBDAG_MIN
+  XDRYLBDAG_MAX => RAIN_ICE_PARAMN%XDRYLBDAG_MAX
+  XDRYINTP1R => RAIN_ICE_PARAMN%XDRYINTP1R
+  XDRYINTP2R => RAIN_ICE_PARAMN%XDRYINTP2R
+  XDRYINTP1S => RAIN_ICE_PARAMN%XDRYINTP1S
+  XDRYINTP2S => RAIN_ICE_PARAMN%XDRYINTP2S
+  XDRYINTP1G => RAIN_ICE_PARAMN%XDRYINTP1G
+  XDRYINTP2G => RAIN_ICE_PARAMN%XDRYINTP2G
+  XFSEDH => RAIN_ICE_PARAMN%XFSEDH
+  XEXSEDH => RAIN_ICE_PARAMN%XEXSEDH
+  X0DEPH => RAIN_ICE_PARAMN%X0DEPH
+  X1DEPH => RAIN_ICE_PARAMN%X1DEPH
+  XEX0DEPH => RAIN_ICE_PARAMN%XEX0DEPH
+  XEX1DEPH => RAIN_ICE_PARAMN%XEX1DEPH
+  XCOLIH => RAIN_ICE_PARAMN%XCOLIH
+  XCOLEXIH => RAIN_ICE_PARAMN%XCOLEXIH
+  XCOLSH => RAIN_ICE_PARAMN%XCOLSH
+  XCOLEXSH => RAIN_ICE_PARAMN%XCOLEXSH
+  XCOLGH => RAIN_ICE_PARAMN%XCOLGH
+  XCOLEXGH => RAIN_ICE_PARAMN%XCOLEXGH
+  XFWETH => RAIN_ICE_PARAMN%XFWETH
+  XFSWETH => RAIN_ICE_PARAMN%XFSWETH
+  XLBSWETH1 => RAIN_ICE_PARAMN%XLBSWETH1
+  XLBSWETH2 => RAIN_ICE_PARAMN%XLBSWETH2
+  XLBSWETH3 => RAIN_ICE_PARAMN%XLBSWETH3
+  XFGWETH => RAIN_ICE_PARAMN%XFGWETH
+  XLBGWETH1 => RAIN_ICE_PARAMN%XLBGWETH1
+  XLBGWETH2 => RAIN_ICE_PARAMN%XLBGWETH2
+  XLBGWETH3 => RAIN_ICE_PARAMN%XLBGWETH3
+  XFRWETH => RAIN_ICE_PARAMN%XFRWETH
+  XLBRWETH1 => RAIN_ICE_PARAMN%XLBRWETH1
+  XLBRWETH2 => RAIN_ICE_PARAMN%XLBRWETH2
+  XLBRWETH3 => RAIN_ICE_PARAMN%XLBRWETH3
+  XWETLBDAS_MIN => RAIN_ICE_PARAMN%XWETLBDAS_MIN
+  XWETLBDAS_MAX => RAIN_ICE_PARAMN%XWETLBDAS_MAX
+  XWETLBDAG_MIN => RAIN_ICE_PARAMN%XWETLBDAG_MIN
+  XWETLBDAG_MAX => RAIN_ICE_PARAMN%XWETLBDAG_MAX
+  XWETLBDAR_MIN => RAIN_ICE_PARAMN%XWETLBDAR_MIN
+  XWETLBDAR_MAX => RAIN_ICE_PARAMN%XWETLBDAR_MAX
+  XWETLBDAH_MIN => RAIN_ICE_PARAMN%XWETLBDAH_MIN
+  XWETLBDAH_MAX => RAIN_ICE_PARAMN%XWETLBDAH_MAX
+  XWETINTP1S => RAIN_ICE_PARAMN%XWETINTP1S
+  XWETINTP2S => RAIN_ICE_PARAMN%XWETINTP2S
+  XWETINTP1G => RAIN_ICE_PARAMN%XWETINTP1G
+  XWETINTP2G => RAIN_ICE_PARAMN%XWETINTP2G
+  XWETINTP1R => RAIN_ICE_PARAMN%XWETINTP1R
+  XWETINTP2R => RAIN_ICE_PARAMN%XWETINTP2R
+  XWETINTP1H => RAIN_ICE_PARAMN%XWETINTP1H
+  XWETINTP2H => RAIN_ICE_PARAMN%XWETINTP2H
   !
-  XFSEDR => RAIN_ICE_PARAM%XFSEDR
-  XEXSEDR => RAIN_ICE_PARAM%XEXSEDR
-  XFSEDI => RAIN_ICE_PARAM%XFSEDI
-  XEXCSEDI => RAIN_ICE_PARAM%XEXCSEDI
-  XEXRSEDI => RAIN_ICE_PARAM%XEXRSEDI
-  XFSEDS => RAIN_ICE_PARAM%XFSEDS
-  XEXSEDS => RAIN_ICE_PARAM%XEXSEDS
-  XFSEDG => RAIN_ICE_PARAM%XFSEDG
-  XEXSEDG => RAIN_ICE_PARAM%XEXSEDG
-  XNU10 => RAIN_ICE_PARAM%XNU10
-  XALPHA1 => RAIN_ICE_PARAM%XALPHA1
-  XBETA1 => RAIN_ICE_PARAM%XBETA1
-  XNU20 => RAIN_ICE_PARAM%XNU20
-  XALPHA2 => RAIN_ICE_PARAM%XALPHA2
-  XBETA2 => RAIN_ICE_PARAM%XBETA2
-  XMNU0 => RAIN_ICE_PARAM%XMNU0
-  XALPHA3 => RAIN_ICE_PARAM%XALPHA3
-  XBETA3 => RAIN_ICE_PARAM%XBETA3
-  XHON => RAIN_ICE_PARAM%XHON
-  XSCFAC => RAIN_ICE_PARAM%XSCFAC
-  X0EVAR => RAIN_ICE_PARAM%X0EVAR
-  X1EVAR => RAIN_ICE_PARAM%X1EVAR
-  XEX0EVAR => RAIN_ICE_PARAM%XEX0EVAR
-  XEX1EVAR => RAIN_ICE_PARAM%XEX1EVAR
-  X0DEPI => RAIN_ICE_PARAM%X0DEPI
-  X2DEPI => RAIN_ICE_PARAM%X2DEPI
-  X0DEPS => RAIN_ICE_PARAM%X0DEPS
-  X1DEPS => RAIN_ICE_PARAM%X1DEPS
-  XEX0DEPS => RAIN_ICE_PARAM%XEX0DEPS
-  XEX1DEPS => RAIN_ICE_PARAM%XEX1DEPS
-  XRDEPSRED => RAIN_ICE_PARAM%XRDEPSRED
-  X0DEPG => RAIN_ICE_PARAM%X0DEPG
-  X1DEPG => RAIN_ICE_PARAM%X1DEPG
-  XEX0DEPG => RAIN_ICE_PARAM%XEX0DEPG
-  XEX1DEPG => RAIN_ICE_PARAM%XEX1DEPG
-  XRDEPGRED => RAIN_ICE_PARAM%XRDEPGRED
-  XTIMAUTI => RAIN_ICE_PARAM%XTIMAUTI
-  XTEXAUTI => RAIN_ICE_PARAM%XTEXAUTI
-  XCRIAUTI => RAIN_ICE_PARAM%XCRIAUTI
-  XT0CRIAUTI => RAIN_ICE_PARAM%XT0CRIAUTI
-  XACRIAUTI => RAIN_ICE_PARAM%XACRIAUTI
-  XBCRIAUTI => RAIN_ICE_PARAM%XBCRIAUTI
-  XCOLIS => RAIN_ICE_PARAM%XCOLIS
-  XCOLEXIS => RAIN_ICE_PARAM%XCOLEXIS
-  XFIAGGS => RAIN_ICE_PARAM%XFIAGGS
-  XEXIAGGS => RAIN_ICE_PARAM%XEXIAGGS
-  XTIMAUTC => RAIN_ICE_PARAM%XTIMAUTC
-  XCRIAUTC => RAIN_ICE_PARAM%XCRIAUTC
-  XFCACCR => RAIN_ICE_PARAM%XFCACCR
-  XEXCACCR => RAIN_ICE_PARAM%XEXCACCR
-  XDCSLIM => RAIN_ICE_PARAM%XDCSLIM
-  XCOLCS => RAIN_ICE_PARAM%XCOLCS
-  XEXCRIMSS => RAIN_ICE_PARAM%XEXCRIMSS
-  XCRIMSS => RAIN_ICE_PARAM%XCRIMSS
-  XEXCRIMSG => RAIN_ICE_PARAM%XEXCRIMSG
-  XCRIMSG => RAIN_ICE_PARAM%XCRIMSG
-  XEXSRIMCG => RAIN_ICE_PARAM%XEXSRIMCG
-  XSRIMCG => RAIN_ICE_PARAM%XSRIMCG
-  XEXSRIMCG2 => RAIN_ICE_PARAM%XEXSRIMCG2
-  XSRIMCG2 => RAIN_ICE_PARAM%XSRIMCG2
-  XSRIMCG3 => RAIN_ICE_PARAM%XSRIMCG3
-  XGAMINC_BOUND_MIN => RAIN_ICE_PARAM%XGAMINC_BOUND_MIN
-  XGAMINC_BOUND_MAX => RAIN_ICE_PARAM%XGAMINC_BOUND_MAX
-  XRIMINTP1 => RAIN_ICE_PARAM%XRIMINTP1
-  XRIMINTP2 => RAIN_ICE_PARAM%XRIMINTP2
-  XFRACCSS => RAIN_ICE_PARAM%XFRACCSS
-  XLBRACCS1 => RAIN_ICE_PARAM%XLBRACCS1
-  XLBRACCS2 => RAIN_ICE_PARAM%XLBRACCS2
-  XLBRACCS3 => RAIN_ICE_PARAM%XLBRACCS3
-  XFSACCRG => RAIN_ICE_PARAM%XFSACCRG
-  XLBSACCR1 => RAIN_ICE_PARAM%XLBSACCR1
-  XLBSACCR2 => RAIN_ICE_PARAM%XLBSACCR2
-  XLBSACCR3 => RAIN_ICE_PARAM%XLBSACCR3
-  XACCLBDAS_MIN => RAIN_ICE_PARAM%XACCLBDAS_MIN
-  XACCLBDAS_MAX => RAIN_ICE_PARAM%XACCLBDAS_MAX
-  XACCLBDAR_MIN => RAIN_ICE_PARAM%XACCLBDAR_MIN
-  XACCLBDAR_MAX => RAIN_ICE_PARAM%XACCLBDAR_MAX
-  XACCINTP1S => RAIN_ICE_PARAM%XACCINTP1S
-  XACCINTP2S => RAIN_ICE_PARAM%XACCINTP2S
-  XACCINTP1R => RAIN_ICE_PARAM%XACCINTP1R
-  XACCINTP2R => RAIN_ICE_PARAM%XACCINTP2R
-  XFSCVMG => RAIN_ICE_PARAM%XFSCVMG
-  XCOLIR => RAIN_ICE_PARAM%XCOLIR
-  XEXRCFRI => RAIN_ICE_PARAM%XEXRCFRI
-  XRCFRI => RAIN_ICE_PARAM%XRCFRI
-  XEXICFRR => RAIN_ICE_PARAM%XEXICFRR
-  XICFRR => RAIN_ICE_PARAM%XICFRR
-  XFCDRYG => RAIN_ICE_PARAM%XFCDRYG
-  XCOLIG => RAIN_ICE_PARAM%XCOLIG
-  XCOLEXIG => RAIN_ICE_PARAM%XCOLEXIG
-  XFIDRYG => RAIN_ICE_PARAM%XFIDRYG
-  XFIDRYG2 => RAIN_ICE_PARAM%XFIDRYG2
-  XEXFIDRYG => RAIN_ICE_PARAM%XEXFIDRYG
-  XCOLSG => RAIN_ICE_PARAM%XCOLSG
-  XCOLEXSG => RAIN_ICE_PARAM%XCOLEXSG
-  XFSDRYG => RAIN_ICE_PARAM%XFSDRYG
-  XLBSDRYG1 => RAIN_ICE_PARAM%XLBSDRYG1
-  XLBSDRYG2 => RAIN_ICE_PARAM%XLBSDRYG2
-  XLBSDRYG3 => RAIN_ICE_PARAM%XLBSDRYG3
-  XFRDRYG => RAIN_ICE_PARAM%XFRDRYG
-  XLBRDRYG1 => RAIN_ICE_PARAM%XLBRDRYG1
-  XLBRDRYG2 => RAIN_ICE_PARAM%XLBRDRYG2
-  XLBRDRYG3 => RAIN_ICE_PARAM%XLBRDRYG3
-  XDRYLBDAR_MIN => RAIN_ICE_PARAM%XDRYLBDAR_MIN
-  XDRYLBDAR_MAX => RAIN_ICE_PARAM%XDRYLBDAR_MAX
-  XDRYLBDAS_MIN => RAIN_ICE_PARAM%XDRYLBDAS_MIN
-  XDRYLBDAS_MAX => RAIN_ICE_PARAM%XDRYLBDAS_MAX
-  XDRYLBDAG_MIN => RAIN_ICE_PARAM%XDRYLBDAG_MIN
-  XDRYLBDAG_MAX => RAIN_ICE_PARAM%XDRYLBDAG_MAX
-  XDRYINTP1R => RAIN_ICE_PARAM%XDRYINTP1R
-  XDRYINTP2R => RAIN_ICE_PARAM%XDRYINTP2R
-  XDRYINTP1S => RAIN_ICE_PARAM%XDRYINTP1S
-  XDRYINTP2S => RAIN_ICE_PARAM%XDRYINTP2S
-  XDRYINTP1G => RAIN_ICE_PARAM%XDRYINTP1G
-  XDRYINTP2G => RAIN_ICE_PARAM%XDRYINTP2G
-  XFSEDH => RAIN_ICE_PARAM%XFSEDH
-  XEXSEDH => RAIN_ICE_PARAM%XEXSEDH
-  X0DEPH => RAIN_ICE_PARAM%X0DEPH
-  X1DEPH => RAIN_ICE_PARAM%X1DEPH
-  XEX0DEPH => RAIN_ICE_PARAM%XEX0DEPH
-  XEX1DEPH => RAIN_ICE_PARAM%XEX1DEPH
-  XCOLIH => RAIN_ICE_PARAM%XCOLIH
-  XCOLEXIH => RAIN_ICE_PARAM%XCOLEXIH
-  XCOLSH => RAIN_ICE_PARAM%XCOLSH
-  XCOLEXSH => RAIN_ICE_PARAM%XCOLEXSH
-  XCOLGH => RAIN_ICE_PARAM%XCOLGH
-  XCOLEXGH => RAIN_ICE_PARAM%XCOLEXGH
-  XFWETH => RAIN_ICE_PARAM%XFWETH
-  XFSWETH => RAIN_ICE_PARAM%XFSWETH
-  XLBSWETH1 => RAIN_ICE_PARAM%XLBSWETH1
-  XLBSWETH2 => RAIN_ICE_PARAM%XLBSWETH2
-  XLBSWETH3 => RAIN_ICE_PARAM%XLBSWETH3
-  XFGWETH => RAIN_ICE_PARAM%XFGWETH
-  XLBGWETH1 => RAIN_ICE_PARAM%XLBGWETH1
-  XLBGWETH2 => RAIN_ICE_PARAM%XLBGWETH2
-  XLBGWETH3 => RAIN_ICE_PARAM%XLBGWETH3
-  XFRWETH => RAIN_ICE_PARAM%XFRWETH
-  XLBRWETH1 => RAIN_ICE_PARAM%XLBRWETH1
-  XLBRWETH2 => RAIN_ICE_PARAM%XLBRWETH2
-  XLBRWETH3 => RAIN_ICE_PARAM%XLBRWETH3
-  XWETLBDAS_MIN => RAIN_ICE_PARAM%XWETLBDAS_MIN
-  XWETLBDAS_MAX => RAIN_ICE_PARAM%XWETLBDAS_MAX
-  XWETLBDAG_MIN => RAIN_ICE_PARAM%XWETLBDAG_MIN
-  XWETLBDAG_MAX => RAIN_ICE_PARAM%XWETLBDAG_MAX
-  XWETLBDAR_MIN => RAIN_ICE_PARAM%XWETLBDAR_MIN
-  XWETLBDAR_MAX => RAIN_ICE_PARAM%XWETLBDAR_MAX
-  XWETLBDAH_MIN => RAIN_ICE_PARAM%XWETLBDAH_MIN
-  XWETLBDAH_MAX => RAIN_ICE_PARAM%XWETLBDAH_MAX
-  XWETINTP1S => RAIN_ICE_PARAM%XWETINTP1S
-  XWETINTP2S => RAIN_ICE_PARAM%XWETINTP2S
-  XWETINTP1G => RAIN_ICE_PARAM%XWETINTP1G
-  XWETINTP2G => RAIN_ICE_PARAM%XWETINTP2G
-  XWETINTP1R => RAIN_ICE_PARAM%XWETINTP1R
-  XWETINTP2R => RAIN_ICE_PARAM%XWETINTP2R
-  XWETINTP1H => RAIN_ICE_PARAM%XWETINTP1H
-  XWETINTP2H => RAIN_ICE_PARAM%XWETINTP2H
+  NGAMINC => RAIN_ICE_PARAMN%NGAMINC
+  NACCLBDAS => RAIN_ICE_PARAMN%NACCLBDAS
+  NACCLBDAR => RAIN_ICE_PARAMN%NACCLBDAR
+  NDRYLBDAR => RAIN_ICE_PARAMN%NDRYLBDAR
+  NDRYLBDAS => RAIN_ICE_PARAMN%NDRYLBDAS
+  NDRYLBDAG => RAIN_ICE_PARAMN%NDRYLBDAG
+  NWETLBDAS => RAIN_ICE_PARAMN%NWETLBDAS
+  NWETLBDAG => RAIN_ICE_PARAMN%NWETLBDAG
+  NWETLBDAR => RAIN_ICE_PARAMN%NWETLBDAR
+  NWETLBDAH => RAIN_ICE_PARAMN%NWETLBDAH
   !
-  NGAMINC => RAIN_ICE_PARAM%NGAMINC
-  NACCLBDAS => RAIN_ICE_PARAM%NACCLBDAS
-  NACCLBDAR => RAIN_ICE_PARAM%NACCLBDAR
-  NDRYLBDAR => RAIN_ICE_PARAM%NDRYLBDAR
-  NDRYLBDAS => RAIN_ICE_PARAM%NDRYLBDAS
-  NDRYLBDAG => RAIN_ICE_PARAM%NDRYLBDAG
-  NWETLBDAS => RAIN_ICE_PARAM%NWETLBDAS
-  NWETLBDAG => RAIN_ICE_PARAM%NWETLBDAG
-  NWETLBDAR => RAIN_ICE_PARAM%NWETLBDAR
-  NWETLBDAH => RAIN_ICE_PARAM%NWETLBDAH
-END SUBROUTINE RAIN_ICE_PARAM_ASSOCIATE
+  CALL HELPER1(XGAMINC_RIM1, RAIN_ICE_PARAMN%XGAMINC_RIM1)
+  CALL HELPER1(XGAMINC_RIM2, RAIN_ICE_PARAMN%XGAMINC_RIM2)
+  CALL HELPER1(XGAMINC_RIM4, RAIN_ICE_PARAMN%XGAMINC_RIM4)
+  CALL HELPER2(XKER_RACCSS, RAIN_ICE_PARAMN%XKER_RACCSS)
+  CALL HELPER2(XKER_RACCS, RAIN_ICE_PARAMN%XKER_RACCS)
+  CALL HELPER2(XKER_SACCRG, RAIN_ICE_PARAMN%XKER_SACCRG)
+  CALL HELPER2(XKER_SDRYG, RAIN_ICE_PARAMN%XKER_SDRYG)
+  CALL HELPER2(XKER_RDRYG, RAIN_ICE_PARAMN%XKER_RDRYG)
+  CALL HELPER2(XKER_SWETH, RAIN_ICE_PARAMN%XKER_SWETH)
+  CALL HELPER2(XKER_GWETH, RAIN_ICE_PARAMN%XKER_GWETH)
+  CALL HELPER2(XKER_RWETH, RAIN_ICE_PARAMN%XKER_RWETH)
+
+ENDIF
+END SUBROUTINE RAIN_ICE_PARAM_GOTO_MODEL
+!
+SUBROUTINE HELPER1(XPT, XARR)
+  IMPLICIT NONE
+  REAL, POINTER, DIMENSION(:), INTENT(INOUT) :: XPT
+  REAL, DIMENSION(:), ALLOCATABLE, TARGET, INTENT(INOUT) :: XARR
+  IF(ALLOCATED(XARR)) THEN
+    XPT => XARR
+  ELSE
+    XPT => NULL()
+  ENDIF
+END SUBROUTINE HELPER1
+!
+SUBROUTINE HELPER2(XPT, XARR)
+  IMPLICIT NONE
+  REAL, POINTER, DIMENSION(:,:), INTENT(INOUT) :: XPT
+  REAL, DIMENSION(:,:), ALLOCATABLE, TARGET, INTENT(INOUT) :: XARR
+  IF(ALLOCATED(XARR)) THEN
+    XPT => XARR
+  ELSE
+    XPT => NULL()
+  ENDIF
+END SUBROUTINE HELPER2
 !
 SUBROUTINE RAIN_ICE_PARAM_ALLOCATE(HNAME, KDIM1, KDIM2)
   IMPLICIT NONE
@@ -556,57 +603,59 @@ SUBROUTINE RAIN_ICE_PARAM_ALLOCATE(HNAME, KDIM1, KDIM2)
   SELECT CASE(TRIM(HNAME))
     !1D arrays
     CASE('XGAMINC_RIM1')
-      ALLOCATE(RAIN_ICE_PARAM%XGAMINC_RIM1(KDIM1))
-      XGAMINC_RIM1 => RAIN_ICE_PARAM%XGAMINC_RIM1
+      ALLOCATE(RAIN_ICE_PARAMN%XGAMINC_RIM1(KDIM1))
+      XGAMINC_RIM1 => RAIN_ICE_PARAMN%XGAMINC_RIM1
     CASE('XGAMINC_RIM2')
-      ALLOCATE(RAIN_ICE_PARAM%XGAMINC_RIM2(KDIM1))
-      XGAMINC_RIM2 => RAIN_ICE_PARAM%XGAMINC_RIM2
+      ALLOCATE(RAIN_ICE_PARAMN%XGAMINC_RIM2(KDIM1))
+      XGAMINC_RIM2 => RAIN_ICE_PARAMN%XGAMINC_RIM2
     CASE('XGAMINC_RIM4')
-      ALLOCATE(RAIN_ICE_PARAM%XGAMINC_RIM4(KDIM1))
-      XGAMINC_RIM4 => RAIN_ICE_PARAM%XGAMINC_RIM4
+      ALLOCATE(RAIN_ICE_PARAMN%XGAMINC_RIM4(KDIM1))
+      XGAMINC_RIM4 => RAIN_ICE_PARAMN%XGAMINC_RIM4
     !
     !2D arrays
     CASE('XKER_RACCSS')
-      ALLOCATE(RAIN_ICE_PARAM%XKER_RACCSS(KDIM1, KDIM2))
-      XKER_RACCSS=> RAIN_ICE_PARAM%XKER_RACCSS
+      ALLOCATE(RAIN_ICE_PARAMN%XKER_RACCSS(KDIM1, KDIM2))
+      XKER_RACCSS=> RAIN_ICE_PARAMN%XKER_RACCSS
     CASE('XKER_RACCS')
-      ALLOCATE(RAIN_ICE_PARAM%XKER_RACCS(KDIM1, KDIM2))
-      XKER_RACCS=> RAIN_ICE_PARAM%XKER_RACCS
+      ALLOCATE(RAIN_ICE_PARAMN%XKER_RACCS(KDIM1, KDIM2))
+      XKER_RACCS=> RAIN_ICE_PARAMN%XKER_RACCS
     CASE('XKER_SACCRG')
-      ALLOCATE(RAIN_ICE_PARAM%XKER_SACCRG(KDIM1, KDIM2))
-      XKER_SACCRG=> RAIN_ICE_PARAM%XKER_SACCRG
+      ALLOCATE(RAIN_ICE_PARAMN%XKER_SACCRG(KDIM1, KDIM2))
+      XKER_SACCRG=> RAIN_ICE_PARAMN%XKER_SACCRG
     CASE('XKER_SDRYG')
-      ALLOCATE(RAIN_ICE_PARAM%XKER_SDRYG(KDIM1, KDIM2))
-      XKER_SDRYG=> RAIN_ICE_PARAM%XKER_SDRYG
+      ALLOCATE(RAIN_ICE_PARAMN%XKER_SDRYG(KDIM1, KDIM2))
+      XKER_SDRYG=> RAIN_ICE_PARAMN%XKER_SDRYG
     CASE('XKER_RDRYG')
-      ALLOCATE(RAIN_ICE_PARAM%XKER_RDRYG(KDIM1, KDIM2))
-      XKER_RDRYG=> RAIN_ICE_PARAM%XKER_RDRYG
+      ALLOCATE(RAIN_ICE_PARAMN%XKER_RDRYG(KDIM1, KDIM2))
+      XKER_RDRYG=> RAIN_ICE_PARAMN%XKER_RDRYG
     CASE('XKER_SWETH')
-      ALLOCATE(RAIN_ICE_PARAM%XKER_SWETH(KDIM1, KDIM2))
-      XKER_SWETH=> RAIN_ICE_PARAM%XKER_SWETH
+      ALLOCATE(RAIN_ICE_PARAMN%XKER_SWETH(KDIM1, KDIM2))
+      XKER_SWETH=> RAIN_ICE_PARAMN%XKER_SWETH
     CASE('XKER_GWETH')
-      ALLOCATE(RAIN_ICE_PARAM%XKER_GWETH(KDIM1, KDIM2))
-      XKER_GWETH=> RAIN_ICE_PARAM%XKER_GWETH
+      ALLOCATE(RAIN_ICE_PARAMN%XKER_GWETH(KDIM1, KDIM2))
+      XKER_GWETH=> RAIN_ICE_PARAMN%XKER_GWETH
     CASE('XKER_RWETH')
-      ALLOCATE(RAIN_ICE_PARAM%XKER_RWETH(KDIM1, KDIM2))
-      XKER_RWETH=> RAIN_ICE_PARAM%XKER_RWETH
+      ALLOCATE(RAIN_ICE_PARAMN%XKER_RWETH(KDIM1, KDIM2))
+      XKER_RWETH=> RAIN_ICE_PARAMN%XKER_RWETH
   END SELECT
 END SUBROUTINE RAIN_ICE_PARAM_ALLOCATE
+!
 SUBROUTINE RAIN_ICE_PARAM_DEALLOCATE()
   IMPLICIT NONE
   XGAMINC_RIM1=>NULL()
-  DEALLOCATE(RAIN_ICE_PARAM%XGAMINC_RIM1)
+  DEALLOCATE(RAIN_ICE_PARAMN%XGAMINC_RIM1)
   XGAMINC_RIM2=>NULL()
-  DEALLOCATE(RAIN_ICE_PARAM%XGAMINC_RIM2)
+  DEALLOCATE(RAIN_ICE_PARAMN%XGAMINC_RIM2)
   XKER_RACCSS=>NULL()
-  DEALLOCATE(RAIN_ICE_PARAM%XKER_RACCSS)
+  DEALLOCATE(RAIN_ICE_PARAMN%XKER_RACCSS)
   XKER_RACCS=>NULL()
-  DEALLOCATE(RAIN_ICE_PARAM%XKER_RACCS)
+  DEALLOCATE(RAIN_ICE_PARAMN%XKER_RACCS)
   XKER_SACCRG=>NULL()
-  DEALLOCATE(RAIN_ICE_PARAM%XKER_SACCRG)
+  DEALLOCATE(RAIN_ICE_PARAMN%XKER_SACCRG)
   XKER_SDRYG=>NULL()
-  DEALLOCATE(RAIN_ICE_PARAM%XKER_SDRYG)
+  DEALLOCATE(RAIN_ICE_PARAMN%XKER_SDRYG)
   XKER_RDRYG=>NULL()
-  DEALLOCATE(RAIN_ICE_PARAM%XKER_RDRYG)
+  DEALLOCATE(RAIN_ICE_PARAMN%XKER_RDRYG)
 END SUBROUTINE RAIN_ICE_PARAM_DEALLOCATE
-END MODULE MODD_RAIN_ICE_PARAM
+!
+END MODULE MODD_RAIN_ICE_PARAM_n
diff --git a/src/PHYEX/micro/mode_ice4_budgets.f90 b/src/PHYEX/micro/mode_ice4_budgets.f90
index a33b0acf7fca490a07caaa8b10bdb4fb70a89924..64ccbefc4edd50cbe922d1eeaaed8785b2ce297e 100644
--- a/src/PHYEX/micro/mode_ice4_budgets.f90
+++ b/src/PHYEX/micro/mode_ice4_budgets.f90
@@ -17,17 +17,16 @@ SUBROUTINE ICE4_BUDGETS(D, PARAMI, BUCONF, KSIZE, PTSTEP, KRR, K1, K2, &
 !*       0.    DECLARATIONS
 !              ------------
 !
-USE PARKIND1, ONLY : JPRB
-USE YOMHOOK , ONLY : LHOOK, DR_HOOK
+USE YOMHOOK , ONLY : LHOOK, DR_HOOK, JPHOOK
 
 USE MODD_DIMPHYEX,   ONLY: DIMPHYEX_t
 USE MODD_BUDGET,     ONLY: TBUDGETDATA, TBUDGETCONF_t, NBUDGET_TH, NBUDGET_RV, NBUDGET_RC, &
                            NBUDGET_RI, NBUDGET_RR, NBUDGET_RS, NBUDGET_RG, NBUDGET_RH
-USE MODD_PARAM_ICE,  ONLY: PARAM_ICE_t
+USE MODD_PARAM_ICE_n,  ONLY: PARAM_ICE_t
 !
 USE MODD_FIELDS_ADDRESS ! index number for prognostic (theta and mixing ratios) and budgets
 !
-USE MODE_BUDGET_PHY,     ONLY: BUDGET_STORE_ADD_PHY, BUDGET_STORE_INIT_PHY, BUDGET_STORE_END_PHY
+USE MODE_BUDGET_PHY,     ONLY: BUDGET_STORE_ADD_PHY
 !
 !
 IMPLICIT NONE
@@ -56,11 +55,11 @@ INTEGER,                                     INTENT(IN)    :: KBUDGETS
 !
 !*       0.2   Declarations of local variables :
 !
-REAL(KIND=JPRB) :: ZHOOK_HANDLE
+REAL(KIND=JPHOOK) :: ZHOOK_HANDLE
 !
 INTEGER :: JIJ, JK, JL
 INTEGER :: IKTB, IKTE, IKB, IIJB, IIJE
-REAL,    DIMENSION(D%NIJT, D%NKT) :: ZW1, ZW2, ZW3, ZW4, ZW5, ZW6 ! work array
+REAL,    DIMENSION(D%NIJT, D%NKT) :: ZW1, ZW2, ZW3, ZW4, ZW5 ! work array
 REAL, DIMENSION(D%NIJT, D%NKT) :: ZZ_DIFF, ZZ_LVFACT, ZZ_LSFACT
 REAL :: ZINV_TSTEP
 !
@@ -96,15 +95,9 @@ DO JK = IKTB, IKTE
     ZW1(JIJ,JK)=ZW1(JIJ,JK)+PRVHENI(JIJ,JK)
   ENDDO
 ENDDO
-#ifdef REPRO48
-IF (BUCONF%LBUDGET_TH) CALL BUDGET_STORE_ADD_PHY(D, TBUDGETS(NBUDGET_TH), 'HENU',  ZW1(:, :)*ZZ_LSFACT(:, :)*PRHODJ(:, :))
-IF (BUCONF%LBUDGET_RV) CALL BUDGET_STORE_ADD_PHY(D, TBUDGETS(NBUDGET_RV), 'HENU', -ZW1(:, :)                *PRHODJ(:, :))
-IF (BUCONF%LBUDGET_RI) CALL BUDGET_STORE_ADD_PHY(D, TBUDGETS(NBUDGET_RI), 'HENU',  ZW1(:, :)                *PRHODJ(:, :))
-#else
 IF (BUCONF%LBUDGET_TH) CALL BUDGET_STORE_ADD_PHY(D, TBUDGETS(NBUDGET_TH), 'HIN',  ZW1(:, :)*ZZ_LSFACT(:, :)*PRHODJ(:, :))
 IF (BUCONF%LBUDGET_RV) CALL BUDGET_STORE_ADD_PHY(D, TBUDGETS(NBUDGET_RV), 'HIN', -ZW1(:, :)                *PRHODJ(:, :))
 IF (BUCONF%LBUDGET_RI) CALL BUDGET_STORE_ADD_PHY(D, TBUDGETS(NBUDGET_RI), 'HIN',  ZW1(:, :)                *PRHODJ(:, :))
-#endif
 ZW1(:,:) = 0.
 DO JL=1, KSIZE
   ZW1(K1(JL), K2(JL)) = PBU_PACK(JL, IRCHONI) * ZINV_TSTEP
@@ -336,26 +329,10 @@ IF(KRR==7) THEN
   IF (BUCONF%LBUDGET_RR) CALL BUDGET_STORE_ADD_PHY(D, TBUDGETS(NBUDGET_RR), 'WETH', -ZW2(:, :)    *PRHODJ(:, :))
   IF (BUCONF%LBUDGET_RI) CALL BUDGET_STORE_ADD_PHY(D, TBUDGETS(NBUDGET_RI), 'WETH', -ZW3(:, :)    *PRHODJ(:, :))
   IF (BUCONF%LBUDGET_RS) CALL BUDGET_STORE_ADD_PHY(D, TBUDGETS(NBUDGET_RS), 'WETH', -ZW4(:, :)    *PRHODJ(:, :))
-#ifdef REPRO48
-#else
   IF (BUCONF%LBUDGET_RG) CALL BUDGET_STORE_ADD_PHY(D, TBUDGETS(NBUDGET_RG), 'WETH', -ZW5(:, :)    *PRHODJ(:, :))
-#endif
   IF (BUCONF%LBUDGET_RH) CALL BUDGET_STORE_ADD_PHY(D, TBUDGETS(NBUDGET_RH), 'WETH', (ZW1(:, :)+ZW2(:, :)+ZW3(:, :)+ &
                                                                         &ZW4(:, :)+ZW5(:, : ))  *PRHODJ(:, :))
 
-#if defined(REPRO48) 
-  ZW1(:,:) = 0.
-  DO JL=1, KSIZE
-    ZW1(K1(JL), K2(JL)) = PBU_PACK(JL, IRGWETH) * ZINV_TSTEP
-  END DO
-#endif 
-#ifdef REPRO48
-  IF (BUCONF%LBUDGET_RG) CALL BUDGET_STORE_ADD_PHY(D, TBUDGETS(NBUDGET_RG), 'HGCV', (-ZW5(:, :)-ZW1(:, :))*PRHODJ(:, :))
-#endif
-#if defined(REPRO48) 
-  IF (BUCONF%LBUDGET_RH) CALL BUDGET_STORE_ADD_PHY(D, TBUDGETS(NBUDGET_RH), 'HGCV',  ZW1(:, :)*PRHODJ(:, :))
-#endif
-
   ZW1(:,:) = 0.
   DO JL=1, KSIZE
     ZW1(K1(JL), K2(JL)) = PBU_PACK(JL, IRCDRYH) * ZINV_TSTEP
@@ -376,34 +353,23 @@ IF(KRR==7) THEN
   DO JL=1, KSIZE
     ZW5(K1(JL), K2(JL)) = PBU_PACK(JL, IRGDRYH) * ZINV_TSTEP
   END DO
-  ZW6(:,:) = 0.
-#if defined(REPRO48) 
-  !ZW6 must be removed when REPRO* will be suppressed
-  DO JL=1, KSIZE
-    ZW6(K1(JL), K2(JL)) = PBU_PACK(JL, IRDRYHG) * ZINV_TSTEP
-  END DO
-#endif
   IF (BUCONF%LBUDGET_TH) &
     CALL BUDGET_STORE_ADD_PHY(D, TBUDGETS(NBUDGET_TH), 'DRYH', (ZW1(:, :)+ZW2(:, :))*ZZ_DIFF(:, :)*PRHODJ(:, :))
   IF (BUCONF%LBUDGET_RC) CALL BUDGET_STORE_ADD_PHY(D, TBUDGETS(NBUDGET_RC), 'DRYH', -ZW1(:, :)                 *PRHODJ(:, :))
   IF (BUCONF%LBUDGET_RR) CALL BUDGET_STORE_ADD_PHY(D, TBUDGETS(NBUDGET_RR), 'DRYH', -ZW2(:, :)                 *PRHODJ(:, :))
   IF (BUCONF%LBUDGET_RI) CALL BUDGET_STORE_ADD_PHY(D, TBUDGETS(NBUDGET_RI), 'DRYH', -ZW3(:, :)                 *PRHODJ(:, :))
   IF (BUCONF%LBUDGET_RS) CALL BUDGET_STORE_ADD_PHY(D, TBUDGETS(NBUDGET_RS), 'DRYH', -ZW4(:, :)                 *PRHODJ(:, :))
-  IF (BUCONF%LBUDGET_RG) CALL BUDGET_STORE_ADD_PHY(D, TBUDGETS(NBUDGET_RG), 'DRYH', (-ZW5(:, :)+ZW6(:, :))     *PRHODJ(:, :))
+  IF (BUCONF%LBUDGET_RG) CALL BUDGET_STORE_ADD_PHY(D, TBUDGETS(NBUDGET_RG), 'DRYH', -ZW5(:, :)                 *PRHODJ(:, :))
   IF (BUCONF%LBUDGET_RH) CALL BUDGET_STORE_ADD_PHY(D, TBUDGETS(NBUDGET_RH), 'DRYH', (ZW1(:, :)+ZW2(:, :)+ZW3(:, :)+   &
-                                                                      &ZW4(:, :)+ZW5(:, :)-ZW6(:, :)) &
+                                                                      &ZW4(:, :)+ZW5(:, :)) &
                                                                       &                             *PRHODJ(:, :))
 
-#if defined(REPRO48) 
-#else
-  !When REPRO48 will be suppressed, ZW6 must be removed
   ZW1(:,:) = 0.
   DO JL=1, KSIZE
     ZW1(K1(JL), K2(JL)) = PBU_PACK(JL, IRDRYHG) * ZINV_TSTEP
   END DO
   IF (BUCONF%LBUDGET_RG) CALL BUDGET_STORE_ADD_PHY(D, TBUDGETS(NBUDGET_RG), 'HGCV', -ZW1(:, :)*PRHODJ(:, :))
   IF (BUCONF%LBUDGET_RH) CALL BUDGET_STORE_ADD_PHY(D, TBUDGETS(NBUDGET_RH), 'HGCV',  ZW1(:, :)*PRHODJ(:, :))
-#endif
 
   ZW1(:,:) = 0.
   DO JL=1, KSIZE
diff --git a/src/PHYEX/micro/mode_ice4_compute_pdf.f90 b/src/PHYEX/micro/mode_ice4_compute_pdf.f90
index 7ccb88c1274867edbcff476743ebf920ea8dc2cc..771d42c94ca8e72087891d2fcaf21ad5b222bfab 100644
--- a/src/PHYEX/micro/mode_ice4_compute_pdf.f90
+++ b/src/PHYEX/micro/mode_ice4_compute_pdf.f90
@@ -29,10 +29,9 @@ SUBROUTINE ICE4_COMPUTE_PDF(CST, ICEP, ICED, KSIZE, HSUBG_AUCV_RC, HSUBG_AUCV_RI
 !
 !
 USE MODD_CST,            ONLY: CST_t
-USE MODD_RAIN_ICE_DESCR, ONLY: RAIN_ICE_DESCR_t
-USE MODD_RAIN_ICE_PARAM, ONLY: RAIN_ICE_PARAM_t
-USE PARKIND1, ONLY : JPRB
-USE YOMHOOK , ONLY : LHOOK, DR_HOOK
+USE MODD_RAIN_ICE_DESCR_n, ONLY: RAIN_ICE_DESCR_t
+USE MODD_RAIN_ICE_PARAM_n, ONLY: RAIN_ICE_PARAM_t
+USE YOMHOOK , ONLY : LHOOK, DR_HOOK, JPHOOK
 !
 USE MODE_MSG
 !
@@ -77,7 +76,7 @@ REAL, DIMENSION(KSIZE) :: ZRCRAUTC,      & !RC value to begin rain formation =XC
                                                     !                     = PHLC_HRC/HCF+ PHLC_LRC/LCF
                           ZSUMRC, ZSUMRI
 REAL :: ZCOEFFRCM
-REAL(KIND=JPRB) :: ZHOOK_HANDLE
+REAL(KIND=JPHOOK) :: ZHOOK_HANDLE
 INTEGER :: JI
 !-------------------------------------------------------------------------------
 !
@@ -319,11 +318,7 @@ ELSE
 ENDIF
 !
 !$mnh_expand_where(JI=1:KSIZE)
-#ifdef REPRO48
-  PRF(:)=PHLC_HCF(:)
-#else
   PRF(:)=MAX(PHLC_HCF(:),PHLI_HCF(:))
-#endif
 !$mnh_end_expand_where(JI=1:KSIZE)
 !
 IF (LHOOK) CALL DR_HOOK('ICE4_COMPUTE_PDF', 1, ZHOOK_HANDLE)
diff --git a/src/PHYEX/micro/mode_ice4_correct_negativities.f90 b/src/PHYEX/micro/mode_ice4_correct_negativities.f90
index 12f8b08aa4eed8fc9565d2fc7462d48cf92eabff..cf569687e9cf6ddaac782d09e9f869eb0c5dde51 100644
--- a/src/PHYEX/micro/mode_ice4_correct_negativities.f90
+++ b/src/PHYEX/micro/mode_ice4_correct_negativities.f90
@@ -10,10 +10,9 @@ SUBROUTINE ICE4_CORRECT_NEGATIVITIES(D, ICED, KRR, PRV, PRC, PRR, &
                                     &PRI, PRS, PRG, &
                                     &PTH, PLVFACT, PLSFACT, PRH)
 !
-USE PARKIND1, ONLY : JPRB
-USE YOMHOOK , ONLY : LHOOK, DR_HOOK
+USE YOMHOOK , ONLY : LHOOK, DR_HOOK, JPHOOK
 USE MODD_DIMPHYEX,   ONLY: DIMPHYEX_t
-USE MODD_RAIN_ICE_DESCR, ONLY: RAIN_ICE_DESCR_t
+USE MODD_RAIN_ICE_DESCR_n, ONLY: RAIN_ICE_DESCR_t
 !
 IMPLICIT NONE
 !
@@ -27,7 +26,7 @@ REAL, DIMENSION(D%NIJT, D%NKT), OPTIONAL, INTENT(INOUT) :: PRH
 REAL :: ZW
 INTEGER :: JIJ, JK, IKTB, IKTE, IIJB, IIJE
 
-REAL(KIND=JPRB) :: ZHOOK_HANDLE
+REAL(KIND=JPHOOK) :: ZHOOK_HANDLE
 !
 IF (LHOOK) CALL DR_HOOK('ICE4_CORRECT_NEGATIVITIES', 0, ZHOOK_HANDLE)
 !
diff --git a/src/PHYEX/micro/mode_ice4_fast_rg.f90 b/src/PHYEX/micro/mode_ice4_fast_rg.f90
index 0b7a6ef508cdf6b5677b49a01a0b47ea731e62cc..e51bd4a7aba794b5b05c52394a994bcd87a4ce10 100644
--- a/src/PHYEX/micro/mode_ice4_fast_rg.f90
+++ b/src/PHYEX/micro/mode_ice4_fast_rg.f90
@@ -37,11 +37,10 @@ SUBROUTINE ICE4_FAST_RG(CST, PARAMI, ICEP, ICED, KPROMA, KSIZE, LDSOFT, LDCOMPUT
 !          ------------
 !
 USE MODD_CST,            ONLY: CST_t
-USE MODD_PARAM_ICE,      ONLY: PARAM_ICE_t
-USE MODD_RAIN_ICE_DESCR, ONLY: RAIN_ICE_DESCR_t
-USE MODD_RAIN_ICE_PARAM, ONLY: RAIN_ICE_PARAM_t
-USE PARKIND1, ONLY : JPRB
-USE YOMHOOK , ONLY : LHOOK, DR_HOOK
+USE MODD_PARAM_ICE_n,      ONLY: PARAM_ICE_t
+USE MODD_RAIN_ICE_DESCR_n, ONLY: RAIN_ICE_DESCR_t
+USE MODD_RAIN_ICE_PARAM_n, ONLY: RAIN_ICE_PARAM_t
+USE YOMHOOK , ONLY : LHOOK, DR_HOOK, JPHOOK
 !
 IMPLICIT NONE
 !
@@ -106,7 +105,7 @@ REAL, DIMENSION(KPROMA) :: ZZW, &
 REAL :: ZZW0D
 INTEGER :: JL
 
-REAL(KIND=JPRB) :: ZHOOK_HANDLE
+REAL(KIND=JPHOOK) :: ZHOOK_HANDLE
 !-------------------------------------------------------------------------------
 !
 IF (LHOOK) CALL DR_HOOK('ICE4_FAST_RG', 0, ZHOOK_HANDLE)
@@ -189,18 +188,23 @@ IF(.NOT. LDSOFT) THEN
   IF(IGDRY>0)THEN
     !$mnh_expand_where(JL=1:KSIZE)
     WHERE(GDRY(1:KSIZE))
+#ifdef REPRO48
       PRG_TEND(1:KSIZE, IRSWETG)=ICEP%XFSDRYG*ZZW(1:KSIZE)                         & ! RSDRYG
                                     / ICEP%XCOLSG &
-#if defined(REPRO48) 
                   *(PLBDAS(1:KSIZE)**(ICED%XCXS-ICED%XBS))*( PLBDAG(1:KSIZE)**ICED%XCXG )    &
                   *(PRHODREF(1:KSIZE)**(-ICED%XCEXVT-1.))                    &
+                       *( ICEP%XLBSDRYG1/( PLBDAG(1:KSIZE)**2              ) + &
+                          ICEP%XLBSDRYG2/( PLBDAG(1:KSIZE)   * PLBDAS(1:KSIZE)   ) + &
+                          ICEP%XLBSDRYG3/(               PLBDAS(1:KSIZE)**2))
 #else
+      PRG_TEND(1:KSIZE, IRSWETG)=ICEP%XFSDRYG*ZZW(1:KSIZE)                         & ! RSDRYG
+                                    / ICEP%XCOLSG &
                   *(PRST(1:KSIZE))*( PLBDAG(1:KSIZE)**ICED%XCXG )    &
                   *(PRHODREF(1:KSIZE)**(-ICED%XCEXVT))                    &
-#endif
                        *( ICEP%XLBSDRYG1/( PLBDAG(1:KSIZE)**2              ) + &
                           ICEP%XLBSDRYG2/( PLBDAG(1:KSIZE)   * PLBDAS(1:KSIZE)   ) + &
                           ICEP%XLBSDRYG3/(               PLBDAS(1:KSIZE)**2))
+#endif
       PRG_TEND(1:KSIZE, IRSDRYG)=PRG_TEND(1:KSIZE, IRSWETG)*ICEP%XCOLSG*EXP(ICEP%XCOLEXSG*(PT(1:KSIZE)-CST%XTT))
     END WHERE
     !$mnh_end_expand_where(JL=1:KSIZE)
@@ -278,11 +282,7 @@ DO JL=1, KSIZE
       LDWETG(JL) = LDWETG(JL) .AND. PT(JL)<CST%XTT
     ENDIF
 
-#ifdef REPRO48
-    LLDRYG(JL)=PT(JL)<CST%XTT .AND. ZRDRYG_INIT(JL)>0. .AND. &
-#else
     LLDRYG(JL)=PT(JL)<CST%XTT .AND. ZRDRYG_INIT(JL)>1.E-20 .AND. &
-#endif
               &MAX(0., ZRWETG_INIT(JL)-PRG_TEND(JL, IRIWETG)-PRG_TEND(JL, IRSWETG))>&
               &MAX(0., ZRDRYG_INIT(JL)-PRG_TEND(JL, IRIDRYG)-PRG_TEND(JL, IRSDRYG))
   ELSE
diff --git a/src/PHYEX/micro/mode_ice4_fast_rh.f90 b/src/PHYEX/micro/mode_ice4_fast_rh.f90
index 8ac5a7b7e13ffb73eca7f232b86e679d2868936d..ecb8d0c0a206de4b23a3012d86638149a43b5892 100644
--- a/src/PHYEX/micro/mode_ice4_fast_rh.f90
+++ b/src/PHYEX/micro/mode_ice4_fast_rh.f90
@@ -35,12 +35,11 @@ SUBROUTINE ICE4_FAST_RH(CST, PARAMI, ICEP, ICED, KPROMA, KSIZE, LDSOFT, LDCOMPUT
 !          ------------
 !
 USE MODD_CST,            ONLY: CST_t
-USE MODD_PARAM_ICE,      ONLY: PARAM_ICE_t
-USE MODD_RAIN_ICE_DESCR, ONLY: RAIN_ICE_DESCR_t
-USE MODD_RAIN_ICE_PARAM, ONLY: RAIN_ICE_PARAM_t
+USE MODD_PARAM_ICE_n,      ONLY: PARAM_ICE_t
+USE MODD_RAIN_ICE_DESCR_n, ONLY: RAIN_ICE_DESCR_t
+USE MODD_RAIN_ICE_PARAM_n, ONLY: RAIN_ICE_PARAM_t
 !
-USE PARKIND1, ONLY : JPRB
-USE YOMHOOK , ONLY : LHOOK, DR_HOOK
+USE YOMHOOK , ONLY : LHOOK, DR_HOOK, JPHOOK
 !
 IMPLICIT NONE
 !
@@ -98,8 +97,8 @@ INTEGER, DIMENSION(KPROMA) :: IBUF1, IBUF2, IBUF3
 REAL, DIMENSION(KPROMA) :: ZZW, &
                            ZRDRYH_INIT, ZRWETH_INIT, &
                            ZRDRYHG
-INTEGER :: JJ, JL
-REAL(KIND=JPRB) :: ZHOOK_HANDLE
+INTEGER :: JL
+REAL(KIND=JPHOOK) :: ZHOOK_HANDLE
 LOGICAL, DIMENSION(KPROMA) :: LLWETH, LLDRYH
 !
 !-------------------------------------------------------------------------------
@@ -151,17 +150,21 @@ IF(.NOT. LDSOFT) THEN
   IF(IGWET>0)THEN
     !$mnh_expand_where(JL=1:KSIZE)
     WHERE(GWET(1:KSIZE))
+#ifdef REPRO48
       PRH_TEND(1:KSIZE, IRSWETH)=ICEP%XFSWETH*ZZW(1:KSIZE)                       & ! RSWETH
-#if defined(REPRO48) 
                     *( PLBDAS(1:KSIZE)**(ICED%XCXS-ICED%XBS) )*( PLBDAH(1:KSIZE)**ICED%XCXH )  &
                        *( PRHODREF(1:KSIZE)**(-ICED%XCEXVT-1.) )               &
+                       *( ICEP%XLBSWETH1/( PLBDAH(1:KSIZE)**2              ) + &                                  
+                          ICEP%XLBSWETH2/( PLBDAH(1:KSIZE)   * PLBDAS(1:KSIZE)   ) + &
+                          ICEP%XLBSWETH3/(               PLBDAS(1:KSIZE)**2) )
 #else
+      PRH_TEND(1:KSIZE, IRSWETH)=ICEP%XFSWETH*ZZW(1:KSIZE)                       & ! RSWETH
                     *( PRST(1:KSIZE))*( PLBDAH(1:KSIZE)**ICED%XCXH )  &
                        *( PRHODREF(1:KSIZE)**(-ICED%XCEXVT) )               &
-#endif
-                       *( ICEP%XLBSWETH1/( PLBDAH(1:KSIZE)**2              ) + &
+                       *( ICEP%XLBSWETH1/( PLBDAH(1:KSIZE)**2              ) + &                                  
                           ICEP%XLBSWETH2/( PLBDAH(1:KSIZE)   * PLBDAS(1:KSIZE)   ) + &
                           ICEP%XLBSWETH3/(               PLBDAS(1:KSIZE)**2) )
+#endif
       PRH_TEND(1:KSIZE, IRSDRYH)=PRH_TEND(1:KSIZE, IRSWETH)*(ICEP%XCOLSH*EXP(ICEP%XCOLEXSH*(PT(1:KSIZE)-CST%XTT)))
     END WHERE
     !$mnh_end_expand_where(JL=1:KSIZE)
@@ -278,11 +281,7 @@ DO JL=1, KSIZE
     ENDIF
 
     !Dry case
-#ifdef REPRO48
-    LLDRYH(JL)=PT(JL)<CST%XTT .AND. ZRDRYH_INIT(JL)>0. .AND. &
-#else
     LLDRYH(JL)=PT(JL)<CST%XTT .AND. ZRDRYH_INIT(JL)>1.E-20 .AND. &
-#endif
               &MAX(0., ZRWETH_INIT(JL)-PRH_TEND(JL, IRIWETH)-PRH_TEND(JL, IRSWETH))>&
               &MAX(0., ZRDRYH_INIT(JL)-PRH_TEND(JL, IRIDRYH)-PRH_TEND(JL, IRSDRYH))
 
diff --git a/src/PHYEX/micro/mode_ice4_fast_ri.f90 b/src/PHYEX/micro/mode_ice4_fast_ri.f90
index abd41bdce2a1db4fef6343c43eaf4612020537e7..836fe99387096e55bb6407d886b0b34f632a6ca8 100644
--- a/src/PHYEX/micro/mode_ice4_fast_ri.f90
+++ b/src/PHYEX/micro/mode_ice4_fast_ri.f90
@@ -30,10 +30,9 @@ SUBROUTINE ICE4_FAST_RI(ICEP, ICED, KPROMA, KSIZE, LDSOFT, LDCOMPUTE, &
 !*      0. DECLARATIONS
 !          ------------
 !
-USE MODD_RAIN_ICE_DESCR, ONLY: RAIN_ICE_DESCR_t
-USE MODD_RAIN_ICE_PARAM, ONLY: RAIN_ICE_PARAM_t
-USE PARKIND1, ONLY : JPRB
-USE YOMHOOK , ONLY : LHOOK, DR_HOOK
+USE MODD_RAIN_ICE_DESCR_n, ONLY: RAIN_ICE_DESCR_t
+USE MODD_RAIN_ICE_PARAM_n, ONLY: RAIN_ICE_PARAM_t
+USE YOMHOOK , ONLY : LHOOK, DR_HOOK, JPHOOK
 !
 IMPLICIT NONE
 !
@@ -57,7 +56,7 @@ REAL, DIMENSION(KPROMA),      INTENT(INOUT) :: PRCBERI  ! Bergeron-Findeisen eff
 !
 !*       0.2  declaration of local variables
 !
-REAL(KIND=JPRB) :: ZHOOK_HANDLE
+REAL(KIND=JPHOOK) :: ZHOOK_HANDLE
 INTEGER :: JL
 !
 !-------------------------------------------------------------------------------
@@ -69,11 +68,7 @@ IF (LHOOK) CALL DR_HOOK('ICE4_FAST_RI',0,ZHOOK_HANDLE)
 !
 DO JL=1, KSIZE
   IF(PSSI(JL)>0. .AND. PRCT(JL)>ICED%XRTMIN(2) .AND. PRIT(JL)>ICED%XRTMIN(4) &
-#ifdef REPRO48
-     .AND. PCIT(JL)>0. .AND. LDCOMPUTE(JL)) THEN
-#else
      .AND. PCIT(JL)>1.E-20 .AND. LDCOMPUTE(JL)) THEN
-#endif
     IF(.NOT. LDSOFT) THEN
       PRCBERI(JL) = MIN(1.E8, ICED%XLBI*(PRHODREF(JL)*PRIT(JL)/PCIT(JL))**ICED%XLBEXI) ! Lbda_i
       PRCBERI(JL) = ( PSSI(JL) / (PRHODREF(JL)*PAI(JL)) ) * PCIT(JL) * &
diff --git a/src/PHYEX/micro/mode_ice4_fast_rs.f90 b/src/PHYEX/micro/mode_ice4_fast_rs.f90
index 8d6109f9b47e3dfee988da65dfbd986d56227d13..89828f3446054c8fe2c3801864f76edcd30f0b58 100644
--- a/src/PHYEX/micro/mode_ice4_fast_rs.f90
+++ b/src/PHYEX/micro/mode_ice4_fast_rs.f90
@@ -38,11 +38,10 @@ SUBROUTINE ICE4_FAST_RS(CST, PARAMI, ICEP, ICED, KPROMA, KSIZE, LDSOFT, LDCOMPUT
 !          ------------
 !
 USE MODD_CST,            ONLY: CST_t
-USE MODD_PARAM_ICE,      ONLY: PARAM_ICE_t
-USE MODD_RAIN_ICE_DESCR, ONLY: RAIN_ICE_DESCR_t
-USE MODD_RAIN_ICE_PARAM, ONLY: RAIN_ICE_PARAM_t
-USE PARKIND1, ONLY : JPRB
-USE YOMHOOK , ONLY : LHOOK, DR_HOOK
+USE MODD_PARAM_ICE_n,      ONLY: PARAM_ICE_t
+USE MODD_RAIN_ICE_DESCR_n, ONLY: RAIN_ICE_DESCR_t
+USE MODD_RAIN_ICE_PARAM_n, ONLY: RAIN_ICE_PARAM_t
+USE YOMHOOK , ONLY : LHOOK, DR_HOOK, JPHOOK
 !
 IMPLICIT NONE
 !
@@ -89,9 +88,9 @@ INTEGER :: IGRIM, IGACC
 INTEGER, DIMENSION(KPROMA) :: IBUF1, IBUF2, IBUF3
 REAL, DIMENSION(KPROMA) :: ZBUF1, ZBUF2, ZBUF3
 REAL, DIMENSION(KPROMA) :: ZZW, ZZW1, ZZW2, ZZW3, ZFREEZ_RATE
-INTEGER :: JJ, JL
+INTEGER :: JL
 REAL :: ZZW0D
-REAL(KIND=JPRB) :: ZHOOK_HANDLE
+REAL(KIND=JPHOOK) :: ZHOOK_HANDLE
 !-------------------------------------------------------------------------------
 !
 IF (LHOOK) CALL DR_HOOK('ICE4_FAST_RS', 0, ZHOOK_HANDLE)
@@ -112,15 +111,16 @@ DO JL=1, KSIZE
       PRS_TEND(JL, IFREEZ1)=PKA(JL)*(CST%XTT-PT(JL)) +                              &
                            &(PDV(JL)*(CST%XLVTT+(CST%XCPV-CST%XCL)*(PT(JL)-CST%XTT)) &
                            &*(CST%XESTT-PRS_TEND(JL, IFREEZ1))/(CST%XRV*PT(JL))           )
-#if defined(REPRO48) 
+#ifdef REPRO48
       PRS_TEND(JL, IFREEZ1)=PRS_TEND(JL, IFREEZ1)* (ICEP%X0DEPS*       PLBDAS(JL)**ICEP%XEX0DEPS +     &
                            &                        ICEP%X1DEPS*PCJ(JL)*PLBDAS(JL)**ICEP%XEX1DEPS )/ &
+                           &(PRHODREF(JL)*(CST%XLMTT-CST%XCL*(CST%XTT-PT(JL))))
 #else
       PRS_TEND(JL, IFREEZ1)=PRS_TEND(JL, IFREEZ1)* PRST(JL) *(ICEP%X0DEPS*       PLBDAS(JL)**ICEP%XEX0DEPS +     &
                            &                        ICEP%X1DEPS*PCJ(JL)*PLBDAS(JL)**(ICED%XBS+ICEP%XEX1DEPS )*   &
          (1+0.5*(ICED%XFVELOS/PLBDAS(JL))**ICED%XALPHAS)**(-ICED%XNUS+ICEP%XEX1DEPS/ICED%XALPHAS))/ &
-#endif
                            &(PRHODREF(JL)*(CST%XLMTT-CST%XCL*(CST%XTT-PT(JL))))
+#endif
       PRS_TEND(JL, IFREEZ2)=(PRHODREF(JL)*(CST%XLMTT+(CST%XCI-CST%XCL)*(CST%XTT-PT(JL)))   ) / &
                            &(PRHODREF(JL)*(CST%XLMTT-CST%XCL*(CST%XTT-PT(JL))))
     ENDIF
@@ -140,7 +140,7 @@ ENDDO
 !
 DO JL=1, KSIZE
   IF (PRCT(JL)>ICED%XRTMIN(2) .AND. PRST(JL)>ICED%XRTMIN(5) .AND. LDCOMPUTE(JL)) THEN
-#if defined(REPRO48) 
+#ifdef REPRO48
     ZZW(JL) = PLBDAS(JL)
 #else
     ZZW(JL) = (PLBDAS(JL)**ICED%XALPHAS + ICED%XFVELOS**ICED%XALPHAS)**(1./ICED%XALPHAS)
@@ -166,11 +166,12 @@ IF(.NOT. LDSOFT) THEN
     !
     !$mnh_expand_where(JL=1:KSIZE)
     WHERE (GRIM(1:KSIZE))
+#ifdef REPRO48
       PRS_TEND(1:KSIZE, IRCRIMSS) = ICEP%XCRIMSS * ZZW1(1:KSIZE) * PRCT(1:KSIZE) & ! RCRIMSS
-#if defined(REPRO48) 
                                       * PLBDAS(1:KSIZE)**ICEP%XEXCRIMSS &
                                       * PRHODREF(1:KSIZE)**(-ICED%XCEXVT)
 #else
+      PRS_TEND(1:KSIZE, IRCRIMSS) = ICEP%XCRIMSS * ZZW1(1:KSIZE) * PRCT(1:KSIZE) & ! RCRIMSS
                                       * PRST(1:KSIZE)*(1+(ICED%XFVELOS/PLBDAS(1:KSIZE))**ICED%XALPHAS) &
                                         **(-ICED%XNUS+ICEP%XEXCRIMSS/ICED%XALPHAS) &
                                       * PRHODREF(1:KSIZE)**(-ICED%XCEXVT+1.) &
@@ -184,11 +185,12 @@ IF(.NOT. LDSOFT) THEN
     !
     !$mnh_expand_where(JL=1:KSIZE)
     WHERE(GRIM(1:KSIZE))
+#ifdef REPRO48
       PRS_TEND(1:KSIZE, IRCRIMS)=ICEP%XCRIMSG * PRCT(1:KSIZE)               & ! RCRIMS
-#if defined(REPRO48) 
                                    * PLBDAS(1:KSIZE)**ICEP%XEXCRIMSG  &
                                    * PRHODREF(1:KSIZE)**(-ICED%XCEXVT)
 #else
+      PRS_TEND(1:KSIZE, IRCRIMS)=ICEP%XCRIMSG * PRCT(1:KSIZE)               & ! RCRIMS
                                    * PRST(1:KSIZE)*(1+(ICED%XFVELOS/PLBDAS(1:KSIZE))**(ICED%XALPHAS)) &
                                      **(-ICED%XNUS+ICEP%XEXCRIMSG/ICED%XALPHAS) &
                                    * PRHODREF(1:KSIZE)**(-ICED%XCEXVT+1.) &
@@ -202,21 +204,24 @@ IF(.NOT. LDSOFT) THEN
       !$mnh_expand_where(JL=1:KSIZE)
       WHERE(GRIM(1:KSIZE))
         ZZW(1:KSIZE) = PRS_TEND(1:KSIZE, IRCRIMS) - PRS_TEND(1:KSIZE, IRCRIMSS) ! RCRIMSG
-#if defined(REPRO48) 
+#ifdef REPRO48
         PRS_TEND(1:KSIZE, IRSRIMCG)=ICEP%XSRIMCG * PLBDAS(1:KSIZE)**ICEP%XEXSRIMCG*(1.0-ZZW2(1:KSIZE))
 #else
         PRS_TEND(1:KSIZE, IRSRIMCG)=ICEP%XSRIMCG * PRST(1:KSIZE)*PRHODREF(1:KSIZE) &
                                                  * PLBDAS(1:KSIZE)**(ICEP%XEXSRIMCG+ICED%XBS)*(1.0-ZZW2(1:KSIZE))
 #endif
+#ifdef REPRO48
         PRS_TEND(1:KSIZE, IRSRIMCG)=ZZW(1:KSIZE)*PRS_TEND(1:KSIZE, IRSRIMCG)/ &
                        MAX(1.E-20, &
-#if defined(REPRO48) 
                            ICEP%XSRIMCG3*ICEP%XSRIMCG2*PLBDAS(1:KSIZE)**ICEP%XEXSRIMCG2*(1.-ZZW3(1:KSIZE)) - &
+                           ICEP%XSRIMCG3*PRS_TEND(1:KSIZE, IRSRIMCG))
 #else
+        PRS_TEND(1:KSIZE, IRSRIMCG)=ZZW(1:KSIZE)*PRS_TEND(1:KSIZE, IRSRIMCG)/ &
+                       MAX(1.E-20, &
                            ICEP%XSRIMCG3*ICEP%XSRIMCG2*PRST(1:KSIZE)*PRHODREF(1:KSIZE) &
                                                       *PLBDAS(1:KSIZE)**ICEP%XEXSRIMCG2*(1.-ZZW3(1:KSIZE)) - &
-#endif
                            ICEP%XSRIMCG3*PRS_TEND(1:KSIZE, IRSRIMCG))
+#endif
       END WHERE
       !$mnh_end_expand_where(JL=1:KSIZE)
     ELSE
@@ -270,15 +275,19 @@ IF(.NOT. LDSOFT) THEN
     !
     !$mnh_expand_where(JL=1:KSIZE)
     WHERE(GACC(1:KSIZE))
+#ifdef REPRO48
       ZZW(1:KSIZE) =                                                        & !! coef of RRACCS
-#if defined(REPRO48) 
             ICEP%XFRACCSS*( PLBDAS(1:KSIZE)**ICED%XCXS )*( PRHODREF(1:KSIZE)**(-ICED%XCEXVT-1.) ) &
+       *( ICEP%XLBRACCS1/((PLBDAS(1:KSIZE)**2)               ) +                  &
+          ICEP%XLBRACCS2/( PLBDAS(1:KSIZE)    * PLBDAR(1:KSIZE)    ) +                  &
+          ICEP%XLBRACCS3/(               (PLBDAR(1:KSIZE)**2)) )/PLBDAR(1:KSIZE)**4
 #else
+      ZZW(1:KSIZE) =                                                        & !! coef of RRACCS
             ICEP%XFRACCSS*( PRST(1:KSIZE)*PLBDAS(1:KSIZE)**ICED%XBS )*( PRHODREF(1:KSIZE)**(-ICED%XCEXVT) ) &
-#endif
        *( ICEP%XLBRACCS1/((PLBDAS(1:KSIZE)**2)               ) +                  &
           ICEP%XLBRACCS2/( PLBDAS(1:KSIZE)    * PLBDAR(1:KSIZE)    ) +                  &
           ICEP%XLBRACCS3/(               (PLBDAR(1:KSIZE)**2)) )/PLBDAR(1:KSIZE)**4
+#endif
       PRS_TEND(1:KSIZE, IRRACCSS) =ZZW1(1:KSIZE)*ZZW(1:KSIZE)
     END WHERE
     !$mnh_end_expand_where(JL=1:KSIZE)
@@ -294,15 +303,19 @@ IF(.NOT. LDSOFT) THEN
     !
     !$mnh_expand_where(JL=1:KSIZE)
     WHERE(GACC(1:KSIZE))
+#ifdef REPRO48
       PRS_TEND(1:KSIZE, IRSACCRG) = ICEP%XFSACCRG*ZZW3(1:KSIZE)*                    & ! RSACCRG
-#if defined(REPRO48) 
           ( PLBDAS(1:KSIZE)**(ICED%XCXS-ICED%XBS) )*( PRHODREF(1:KSIZE)**(-ICED%XCEXVT-1.) ) &
+         *( ICEP%XLBSACCR1/((PLBDAR(1:KSIZE)**2)               ) +           &
+            ICEP%XLBSACCR2/( PLBDAR(1:KSIZE)    * PLBDAS(1:KSIZE)    ) +           &
+            ICEP%XLBSACCR3/(               (PLBDAS(1:KSIZE)**2)) )/PLBDAR(1:KSIZE)
 #else
+      PRS_TEND(1:KSIZE, IRSACCRG) = ICEP%XFSACCRG*ZZW3(1:KSIZE)*                    & ! RSACCRG
           ( PRST(1:KSIZE))*( PRHODREF(1:KSIZE)**(-ICED%XCEXVT) ) &
-#endif
          *( ICEP%XLBSACCR1/((PLBDAR(1:KSIZE)**2)               ) +           &
             ICEP%XLBSACCR2/( PLBDAR(1:KSIZE)    * PLBDAS(1:KSIZE)    ) +           &
             ICEP%XLBSACCR3/(               (PLBDAS(1:KSIZE)**2)) )/PLBDAR(1:KSIZE)
+#endif
     END WHERE
     !$mnh_end_expand_where(JL=1:KSIZE)
   ENDIF
@@ -343,19 +356,23 @@ DO JL=1, KSIZE
       !
       ! compute RSMLT
       !
+#ifdef REPRO48
       PRSMLTG(JL)  = ICEP%XFSCVMG*MAX(0., (-PRSMLTG(JL) * &
-#if defined(REPRO48) 
                  (ICEP%X0DEPS*       PLBDAS(JL)**ICEP%XEX0DEPS +     &
                  ICEP%X1DEPS*PCJ(JL)*PLBDAS(JL)**ICEP%XEX1DEPS)    &
+                 -(PRS_TEND(JL, IRCRIMS) + PRS_TEND(JL, IRRACCS)) *       &
+                 (PRHODREF(JL)*CST%XCL*(CST%XTT-PT(JL))) &
+                 ) / (PRHODREF(JL)*CST%XLMTT))
 #else
+      PRSMLTG(JL)  = ICEP%XFSCVMG*MAX(0., (-PRSMLTG(JL) * &
                  PRST(JL)*PRHODREF(JL) *    &
                  (ICEP%X0DEPS*       PLBDAS(JL)**(ICED%XBS+ICEP%XEX0DEPS) + &
                  ICEP%X1DEPS*PCJ(JL)*(1+0.5*(ICED%XFVELOS/PLBDAS(JL))**ICED%XALPHAS)**(-ICED%XNUS+ICEP%XEX1DEPS/ICED%XALPHAS) &
                  *PLBDAS(JL)**(ICED%XBS+ICEP%XEX1DEPS)) &
-#endif
                  -(PRS_TEND(JL, IRCRIMS) + PRS_TEND(JL, IRRACCS)) *       &
                  (PRHODREF(JL)*CST%XCL*(CST%XTT-PT(JL))) &
                  ) / (PRHODREF(JL)*CST%XLMTT))
+#endif
       !
       ! note that RSCVMG = RSMLT*XFSCVMG but no heat is exchanged (at the rate RSMLT)
       ! because the graupeln produced by this process are still icy!!!
diff --git a/src/PHYEX/micro/mode_ice4_nucleation.f90 b/src/PHYEX/micro/mode_ice4_nucleation.f90
index 3135a3a67a5588859110b0d52e796029b25e9e56..90a3fbba33b64d05decc1d75b8593f759ed98b83 100644
--- a/src/PHYEX/micro/mode_ice4_nucleation.f90
+++ b/src/PHYEX/micro/mode_ice4_nucleation.f90
@@ -29,11 +29,10 @@ SUBROUTINE ICE4_NUCLEATION(CST, PARAMI, ICEP, ICED, KSIZE, ODCOMPUTE, &
 !          ------------
 !
 USE MODD_CST,            ONLY: CST_t
-USE MODD_PARAM_ICE,      ONLY: PARAM_ICE_t
-USE MODD_RAIN_ICE_DESCR, ONLY: RAIN_ICE_DESCR_t
-USE MODD_RAIN_ICE_PARAM, ONLY: RAIN_ICE_PARAM_t
-USE PARKIND1, ONLY : JPRB
-USE YOMHOOK , ONLY : LHOOK, DR_HOOK
+USE MODD_PARAM_ICE_n,      ONLY: PARAM_ICE_t
+USE MODD_RAIN_ICE_DESCR_n, ONLY: RAIN_ICE_DESCR_t
+USE MODD_RAIN_ICE_PARAM_n, ONLY: RAIN_ICE_PARAM_t
+USE YOMHOOK , ONLY : LHOOK, DR_HOOK, JPHOOK
 !
 IMPLICIT NONE
 !
@@ -58,7 +57,7 @@ REAL, DIMENSION(KSIZE),   INTENT(OUT)   :: PRVHENI_MR ! Mixing ratio change due
 !*       0.2  declaration of local variables
 !
 REAL, DIMENSION(KSIZE) :: ZW ! work array
-REAL(KIND=JPRB) :: ZHOOK_HANDLE
+REAL(KIND=JPHOOK) :: ZHOOK_HANDLE
 LOGICAL, DIMENSION(KSIZE) :: GNEGT  ! Test where to compute the HEN process
 REAL, DIMENSION(KSIZE)  :: ZZW,      & ! Work array
                            ZUSW,     & ! Undersaturation over water
diff --git a/src/PHYEX/micro/mode_ice4_pack.f90 b/src/PHYEX/micro/mode_ice4_pack.f90
index 3300125dcc0c1f05da394f72953ac77e6fa3bfb9..558f0ab52a7b1da958a7f4f89a8a0aabc022d474 100644
--- a/src/PHYEX/micro/mode_ice4_pack.f90
+++ b/src/PHYEX/micro/mode_ice4_pack.f90
@@ -8,7 +8,6 @@ IMPLICIT NONE
 CONTAINS
 SUBROUTINE ICE4_PACK(D, CST, PARAMI, ICEP, ICED, BUCONF,                   &
                      KPROMA, KSIZE, KSIZE2,                                &
-                     HSUBG_AUCV_RC, HSUBG_AUCV_RI,                         &
                      PTSTEP, KRR, ODMICRO, PEXN,                           &
                      PRHODJ, PRHODREF, PEXNREF, PPABST, PCIT, PCLDFR,      &
                      PHLC_HRC, PHLC_HCF, PHLI_HRI, PHLI_HCF,               &
@@ -19,20 +18,37 @@ SUBROUTINE ICE4_PACK(D, CST, PARAMI, ICEP, ICED, BUCONF,                   &
                      PWR,                                                  &
                      TBUDGETS, KBUDGETS,                                   &
                      PRHS                                                  )
+!     ######################################################################
+!
+!!****  * -  compute the explicit microphysical sources
+!!
+!!    PURPOSE
+!!    -------
+!!      The purpose of this routine is to pack arrays to compute
+!!      the microphysics tendencies
+!!
+!!
+!!    METHOD
+!!    ------
+!!      Pack arrays by chuncks
+!!
+!!
+!!    MODIFICATIONS
+!!    -------------
+!!     R. El Khatib 28-Apr-2023 Fix (and re-enable) the cache-blocking mechanism on top of phyex
 !  -----------------------------------------------------------------
 !
 !*       0.    DECLARATIONS
 !              ------------
 !
-USE PARKIND1, ONLY : JPRB
-USE YOMHOOK , ONLY : LHOOK, DR_HOOK
+USE YOMHOOK , ONLY : LHOOK, DR_HOOK, JPHOOK
 
 USE MODD_DIMPHYEX,       ONLY: DIMPHYEX_t
 USE MODD_BUDGET,         ONLY: TBUDGETDATA, TBUDGETCONF_t
 USE MODD_CST,            ONLY: CST_t
-USE MODD_PARAM_ICE,      ONLY: PARAM_ICE_t
-USE MODD_RAIN_ICE_DESCR, ONLY: RAIN_ICE_DESCR_t
-USE MODD_RAIN_ICE_PARAM, ONLY: RAIN_ICE_PARAM_t
+USE MODD_PARAM_ICE_n,      ONLY: PARAM_ICE_t
+USE MODD_RAIN_ICE_DESCR_n, ONLY: RAIN_ICE_DESCR_t
+USE MODD_RAIN_ICE_PARAM_n, ONLY: RAIN_ICE_PARAM_t
 USE MODD_FIELDS_ADDRESS, ONLY : & ! common fields adress
       & ITH,     & ! Potential temperature
       & IRV,     & ! Water vapor
@@ -82,8 +98,6 @@ TYPE(TBUDGETCONF_t),      INTENT(IN)    :: BUCONF
 INTEGER,                  INTENT(IN)    :: KPROMA ! cache-blocking factor for microphysic loop
 INTEGER,                  INTENT(IN)    :: KSIZE
 INTEGER,                  INTENT(IN)    :: KSIZE2
-CHARACTER(LEN=4),         INTENT(IN)    :: HSUBG_AUCV_RC ! Kind of Subgrid autoconversion method
-CHARACTER(LEN=80),        INTENT(IN)    :: HSUBG_AUCV_RI ! Kind of Subgrid autoconversion method
 REAL,                     INTENT(IN)    :: PTSTEP  ! Double Time step (single if cold start)
 INTEGER,                  INTENT(IN)    :: KRR     ! Number of moist variable
 LOGICAL, DIMENSION(D%NIJT,D%NKT), INTENT(IN)   :: ODMICRO ! mask to limit computation
@@ -109,13 +123,13 @@ REAL, DIMENSION(D%NIJT,D%NKT),   INTENT(INOUT) :: PRIS    ! Pristine ice m.r. so
 REAL, DIMENSION(D%NIJT,D%NKT),   INTENT(INOUT) :: PRSS    ! Snow/aggregate m.r. source
 REAL, DIMENSION(D%NIJT,D%NKT),   INTENT(INOUT) :: PRGS    ! Graupel m.r. source
 !
-REAL, DIMENSION(D%NIJT,D%NKT),   INTENT(OUT)   :: PEVAP3D! Rain evap profile
-REAL, DIMENSION(D%NIJT,D%NKT),   INTENT(OUT)   :: PRAINFR !Precipitation fraction
+REAL, DIMENSION(D%NIJT,D%NKT),   INTENT(INOUT) :: PEVAP3D! Rain evap profile
+REAL, DIMENSION(D%NIJT,D%NKT),   INTENT(INOUT) :: PRAINFR !Precipitation fraction
 REAL, DIMENSION(D%NIJT,D%NKT),   INTENT(IN)    :: PSIGS   ! Sigma_s at t
 REAL, DIMENSION(D%NIJT,D%NKT),   INTENT(IN)    :: PRVHENI ! heterogeneous nucleation
 REAL, DIMENSION(D%NIJT,D%NKT),   INTENT(IN)    :: PLVFACT
 REAL, DIMENSION(D%NIJT,D%NKT),   INTENT(IN)    :: PLSFACT
-REAL, DIMENSION(D%NIJT,D%NKT,0:7), INTENT(OUT) :: PWR
+REAL, DIMENSION(D%NIJT,D%NKT,0:7), INTENT(INOUT) :: PWR
 TYPE(TBUDGETDATA), DIMENSION(KBUDGETS), INTENT(INOUT) :: TBUDGETS
 INTEGER, INTENT(IN) :: KBUDGETS
 REAL, DIMENSION(D%NIJT,D%NKT), OPTIONAL,  INTENT(INOUT) :: PRHS    ! Hail m.r. source
@@ -123,10 +137,10 @@ REAL, DIMENSION(D%NIJT,D%NKT), OPTIONAL,  INTENT(INOUT) :: PRHS    ! Hail m.r. s
 !
 !*       0.2   Declarations of local variables :
 !
-REAL(KIND=JPRB) :: ZHOOK_HANDLE
+REAL(KIND=JPHOOK) :: ZHOOK_HANDLE
 !
 INTEGER :: JIJ, JK
-INTEGER :: IKTB, IKTE, IIJB, IIJE
+INTEGER :: IKT, IKTB, IKTE, IIJT, IIJB, IIJE
 INTEGER :: ISTIJ, ISTK
 !
 LOGICAL :: GEXT_TEND
@@ -170,19 +184,21 @@ IF (LHOOK) CALL DR_HOOK('ICE4_PACK', 0, ZHOOK_HANDLE)
 !*       1.     GENERALITIES
 !               ------------
 !
+IKT=D%NKT
 IKTB=D%NKTB
 IKTE=D%NKTE
+IIJT=D%NIJT
 IIJB=D%NIJB
 IIJE=D%NIJE
 GEXT_TEND=.TRUE.
-LLSIGMA_RC=(HSUBG_AUCV_RC=='PDF ' .AND. PARAMI%CSUBG_PR_PDF=='SIGM')
-LL_AUCV_ADJU=(HSUBG_AUCV_RC=='ADJU' .OR. HSUBG_AUCV_RI=='ADJU')
+LLSIGMA_RC=(PARAMI%CSUBG_AUCV_RC=='PDF ' .AND. PARAMI%CSUBG_PR_PDF=='SIGM')
+LL_AUCV_ADJU=(PARAMI%CSUBG_AUCV_RC=='ADJU' .OR. PARAMI%CSUBG_AUCV_RI=='ADJU')
 !
 IF(PARAMI%LPACK_MICRO) THEN
-  IF(KPROMA /= KSIZE) THEN
+  IF(KPROMA /= KSIZE .AND. (PARAMI%CSUBG_RR_EVAP=='PRFR' .OR. PARAMI%CSUBG_RC_RR_ACCR=='PRFR')) THEN
     CALL PRINT_MSG(NVERB_FATAL, 'GEN', 'RAIN_ICE', 'For now, KPROMA must be equal to KSIZE, see comments in code for explanation')
     ! Microphyscs was optimized by introducing chunks of KPROMA size
-    ! Thus, in ice4_tendencies, the 1D array represent only a fraction of the points where microphisical species are present
+    ! Thus, in ice4_tendencies, the 1D array represent only a fraction of the points where microphysical species are present
     ! We cannot rebuild the entire 3D arrays in the subroutine, so we cannot call ice4_rainfr_vert in it
     ! A solution would be to suppress optimisation in this case by setting KPROMA=KSIZE in rain_ice
     ! Another solution would be to compute column by column?
@@ -272,8 +288,10 @@ IF(PARAMI%LPACK_MICRO) THEN
               ! Save indices for later usages:
               I1(IC) = JIJ
               I2(IC) = JK
-              I1TOT(JMICRO+IC-1)=JIJ
-              I2TOT(JMICRO+IC-1)=JK
+              IF(BUCONF%LBU_ENABLE) THEN
+                I1TOT(JMICRO+IC-1)=JIJ
+                I2TOT(JMICRO+IC-1)=JK
+              ENDIF
               IF (IC==IMICRO) THEN
                 ! the end of the chunk has been reached, then reset the starting index :
                 ISTIJ=JIJ+1
@@ -281,6 +299,7 @@ IF(PARAMI%LPACK_MICRO) THEN
                   ISTK=JK
                 ELSE
                   ! end of line, restart from 1 and increment upper loop
+                  ISTIJ=D%NIJB
                   ISTK=JK+1
                   IF (ISTK > IKTE) THEN
                     ! end of line, restart from 1
@@ -305,7 +324,6 @@ IF(PARAMI%LPACK_MICRO) THEN
                         &LLSIGMA_RC, LL_AUCV_ADJU, GEXT_TEND, &
                         &KPROMA, IMICRO, LLMICRO, PTSTEP, &
                         &KRR, &
-                        &HSUBG_AUCV_RC, HSUBG_AUCV_RI, &
                         &ZEXN, ZRHODREF, I1, I2, &
                         &ZPRES, ZCF, ZSIGMA_RC, &
                         &ZCIT, &
@@ -345,13 +363,20 @@ IF(PARAMI%LPACK_MICRO) THEN
   ENDIF ! KSIZE > 0
 
 ELSE ! PARAMI%LPACK_MICRO
+  !We assume, here, that points outside the physical domain of the model (extral levels,
+  !horizontal points in the halo) contain valid values, sufficiently valid to be used in tests
+  !such as "PTHT(JL)>ZTHRESHOLD .AND. LLMICRO(JL)". In these tests, LLMICRO(JL) will be evaluated
+  !to .FALSE. on these kind of points but valid values for PTHT are needed to prevent crash.
+  !
   IF (KSIZE /= D%NIJT*D%NKT) THEN
       CALL PRINT_MSG(NVERB_FATAL, 'GEN', 'ICE4_PACK', 'ICE4_PACK : KSIZE /= NIJT*NKT')
   ENDIF
 
+  !Some arrays must be copied. In order not to waste memory, we re-use temporary arrays
+  !declared for the pack case.
   IC=0
-  DO JK = IKTB, IKTE
-    DO JIJ = IIJB, IIJE
+  DO JK = 1, IKT
+    DO JIJ = 1, IIJT
       IC=IC+1
       I1TOT(IC)=JIJ
       I2TOT(IC)=JK
@@ -367,13 +392,40 @@ ELSE ! PARAMI%LPACK_MICRO
         IF (KRR==7) THEN
           ZEXTPK(IC, IRH)=PRHS(JIJ, JK)
         ENDIF
-        IF(LLSIGMA_RC) THEN
-          ZSIGMA_RC(IC)=PSIGS(JIJ, JK)
-        ENDIF
+      ENDIF
+      IF(LLSIGMA_RC) THEN
+        !Copy needed because sigma is modified in ice4_stepping
+        ZSIGMA_RC(IC)=PSIGS(JIJ, JK)
       ENDIF
     ENDDO
   ENDDO
   !
+  !When PARAMI%LPACK_MICRO=T, values on the extra levels are not given to ice4_stepping,
+  !so there was not filled in rain_ice.
+  !When PARAMI%LPACK_MICRO=F, we need to complement the work done in rain_ice to provide
+  !valid values on these levels.
+  !The same applies for the first points and last points on the horizontal dimension.
+  IF (IKTB /= 1) THEN
+    DO JK=1, IKTB-1
+      PWR(:, JK, :)=PWR(:, IKTB, :)
+    ENDDO
+  ENDIF
+  IF (IKTE /= IKT) THEN
+    DO JK=IKTE+1, IKT
+      PWR(:, JK, :)=PWR(:, IKTE, :)
+    ENDDO
+  ENDIF
+  IF (IIJB /= 1) THEN
+    DO JIJ=1, IIJB-1
+      PWR(JIJ, :, :)=PWR(IIJB, :, :)
+    ENDDO
+  ENDIF
+  IF (IIJE /= IIJT) THEN
+    DO JIJ=IIJE+1, IIJT
+      PWR(JIJ, :, :)=PWR(IIJE, :, :) 
+    ENDDO
+  ENDIF
+  !
   !*       5bis.  TENDENCIES COMPUTATION
   !               ----------------------
   !
@@ -381,7 +433,6 @@ ELSE ! PARAMI%LPACK_MICRO
                     &LLSIGMA_RC, LL_AUCV_ADJU, GEXT_TEND, &
                     &KSIZE, KSIZE, ODMICRO, PTSTEP, &
                     &KRR, &
-                    &HSUBG_AUCV_RC, HSUBG_AUCV_RI, &
                     &PEXN, PRHODREF, I1TOT, I2TOT, &
                     &PPABST, PCLDFR, ZSIGMA_RC, &
                     &PCIT, &
diff --git a/src/PHYEX/micro/mode_ice4_rainfr_vert.f90 b/src/PHYEX/micro/mode_ice4_rainfr_vert.f90
index e432813b1424aad05eb1261d89cce1eb707da6fe..43d8410c8399c909602dc320f6479bf76ef6584a 100644
--- a/src/PHYEX/micro/mode_ice4_rainfr_vert.f90
+++ b/src/PHYEX/micro/mode_ice4_rainfr_vert.f90
@@ -25,10 +25,9 @@ SUBROUTINE ICE4_RAINFR_VERT(D, ICED, PPRFR, PRR, PRS, PRG, PRH)
 !*      0. DECLARATIONS
 !          ------------
 !
-USE PARKIND1, ONLY : JPRB
-USE YOMHOOK , ONLY : LHOOK, DR_HOOK
+USE YOMHOOK , ONLY : LHOOK, DR_HOOK, JPHOOK
 USE MODD_DIMPHYEX, ONLY: DIMPHYEX_t
-USE MODD_RAIN_ICE_DESCR, ONLY : RAIN_ICE_DESCR_t
+USE MODD_RAIN_ICE_DESCR_n, ONLY : RAIN_ICE_DESCR_t
 !
 IMPLICIT NONE
 !
@@ -45,7 +44,7 @@ REAL, DIMENSION(D%NIT,D%NJT,D%NKT), OPTIONAL, INTENT(IN)    :: PRH !Hail field
 INTEGER :: IKB, IKE, IKL, IIE, IIB, IJB, IJE
 !*       0.2  declaration of local variables
 !
-REAL(KIND=JPRB) :: ZHOOK_HANDLE
+REAL(KIND=JPHOOK) :: ZHOOK_HANDLE
 INTEGER :: JI, JJ, JK
 LOGICAL :: MASK
 !
diff --git a/src/PHYEX/micro/mode_ice4_rimltc.f90 b/src/PHYEX/micro/mode_ice4_rimltc.f90
index 012add3b46b1313eda451dc2b12103694eaf7e63..8eae95bf67409630fcc29e599bac3e90628608b5 100644
--- a/src/PHYEX/micro/mode_ice4_rimltc.f90
+++ b/src/PHYEX/micro/mode_ice4_rimltc.f90
@@ -30,9 +30,8 @@ SUBROUTINE ICE4_RIMLTC(CST, PARAMI, KPROMA, KSIZE, LDCOMPUTE, &
 !          ------------
 !
 USE MODD_CST,       ONLY: CST_t
-USE MODD_PARAM_ICE, ONLY: PARAM_ICE_t
-USE PARKIND1, ONLY : JPRB
-USE YOMHOOK , ONLY : LHOOK, DR_HOOK
+USE MODD_PARAM_ICE_n, ONLY: PARAM_ICE_t
+USE YOMHOOK , ONLY : LHOOK, DR_HOOK, JPHOOK
 !
 IMPLICIT NONE
 !
@@ -52,7 +51,7 @@ REAL, DIMENSION(KPROMA),       INTENT(OUT)   :: PRIMLTC_MR ! Mixing ratio change
 !
 !*       0.2  declaration of local variables
 !
-REAL(KIND=JPRB) :: ZHOOK_HANDLE
+REAL(KIND=JPHOOK) :: ZHOOK_HANDLE
 INTEGER :: JL
 !
 !-------------------------------------------------------------------------------
diff --git a/src/PHYEX/micro/mode_ice4_rrhong.f90 b/src/PHYEX/micro/mode_ice4_rrhong.f90
index ba318d1d69b7d5f1a11df9afed41818e92d57781..bdc95727d996905f907ee793d0a2b2c317bee806 100644
--- a/src/PHYEX/micro/mode_ice4_rrhong.f90
+++ b/src/PHYEX/micro/mode_ice4_rrhong.f90
@@ -29,10 +29,9 @@ SUBROUTINE ICE4_RRHONG(CST, PARAMI, ICED, KPROMA, KSIZE, LDCOMPUTE, &
 !          ------------
 !
 USE MODD_CST,            ONLY: CST_t
-USE MODD_PARAM_ICE,      ONLY: PARAM_ICE_t
-USE MODD_RAIN_ICE_DESCR, ONLY: RAIN_ICE_DESCR_t
-USE PARKIND1, ONLY : JPRB
-USE YOMHOOK , ONLY : LHOOK, DR_HOOK
+USE MODD_PARAM_ICE_n,      ONLY: PARAM_ICE_t
+USE MODD_RAIN_ICE_DESCR_n, ONLY: RAIN_ICE_DESCR_t
+USE YOMHOOK , ONLY : LHOOK, DR_HOOK, JPHOOK
 !
 IMPLICIT NONE
 !
@@ -53,7 +52,7 @@ REAL, DIMENSION(KPROMA),       INTENT(OUT)   :: PRRHONG_MR ! Mixing ratio change
 !
 !*       0.2  declaration of local variables
 !
-REAL(KIND=JPRB) :: ZHOOK_HANDLE
+REAL(KIND=JPHOOK) :: ZHOOK_HANDLE
 INTEGER :: JL
 !
 !-------------------------------------------------------------------------------
diff --git a/src/PHYEX/micro/mode_ice4_rsrimcg_old.f90 b/src/PHYEX/micro/mode_ice4_rsrimcg_old.f90
index a273dbd9441c356db8b744d40778a8a12945bd56..76728b648736dfd29bf343db093221a65c0f3af3 100644
--- a/src/PHYEX/micro/mode_ice4_rsrimcg_old.f90
+++ b/src/PHYEX/micro/mode_ice4_rsrimcg_old.f90
@@ -31,11 +31,10 @@ SUBROUTINE ICE4_RSRIMCG_OLD(CST, PARAMI, ICEP, ICED, KPROMA, KSIZE, LDSOFT, LDCO
 !          ------------
 !
 USE MODD_CST,            ONLY: CST_t
-USE MODD_PARAM_ICE,      ONLY: PARAM_ICE_t
-USE MODD_RAIN_ICE_DESCR, ONLY: RAIN_ICE_DESCR_t
-USE MODD_RAIN_ICE_PARAM, ONLY: RAIN_ICE_PARAM_t
-USE PARKIND1, ONLY : JPRB
-USE YOMHOOK , ONLY : LHOOK, DR_HOOK
+USE MODD_PARAM_ICE_n,      ONLY: PARAM_ICE_t
+USE MODD_RAIN_ICE_DESCR_n, ONLY: RAIN_ICE_DESCR_t
+USE MODD_RAIN_ICE_PARAM_n, ONLY: RAIN_ICE_PARAM_t
+USE YOMHOOK , ONLY : LHOOK, DR_HOOK, JPHOOK
 !
 IMPLICIT NONE
 !
@@ -63,7 +62,7 @@ REAL, DIMENSION(KPROMA) :: ZBUF1, ZBUF2
 INTEGER, DIMENSION(KPROMA) :: IBUF1, IBUF2
 REAL, DIMENSION(KPROMA) :: ZZW
 INTEGER :: JL
-REAL(KIND=JPRB) :: ZHOOK_HANDLE
+REAL(KIND=JPHOOK) :: ZHOOK_HANDLE
 !-------------------------------------------------------------------------------
 !
 IF (LHOOK) CALL DR_HOOK('ICE4_RSRIMCG_OLD', 0, ZHOOK_HANDLE)
@@ -86,10 +85,11 @@ IF(.NOT. LDSOFT) THEN
   IF(IGRIM>0) THEN
     !$mnh_expand_where(JL=1:KSIZE)
     WHERE(GRIM(1:KSIZE))
+#ifdef REPRO48
       PRSRIMCG_MR(1:KSIZE) = ICEP%XSRIMCG * PLBDAS(1:KSIZE)**ICEP%XEXSRIMCG   & ! RSRIMCG
-#if defined(REPRO48) 
                                * (1.0 - ZZW(1:KSIZE) )/PRHODREF(1:KSIZE)
 #else
+      PRSRIMCG_MR(1:KSIZE) = ICEP%XSRIMCG * PLBDAS(1:KSIZE)**ICEP%XEXSRIMCG   & ! RSRIMCG
                                * (1.0 - ZZW(1:KSIZE) )*PRST(1:KSIZE)
 #endif
       PRSRIMCG_MR(1:KSIZE)=MIN(PRST(1:KSIZE), PRSRIMCG_MR(1:KSIZE))
diff --git a/src/PHYEX/micro/mode_ice4_sedimentation.f90 b/src/PHYEX/micro/mode_ice4_sedimentation.f90
index 7b73ed5492a7c877159ea7a3524b940529161946..0a59d64e3d9c0407b4738743b36e99728933bb1a 100644
--- a/src/PHYEX/micro/mode_ice4_sedimentation.f90
+++ b/src/PHYEX/micro/mode_ice4_sedimentation.f90
@@ -31,15 +31,14 @@ SUBROUTINE ICE4_SEDIMENTATION(D, CST, ICEP, ICED, PARAMI, BUCONF, &
 !*      0. DECLARATIONS
 !          ------------
 !
-USE PARKIND1, ONLY : JPRB
-USE YOMHOOK , ONLY : LHOOK, DR_HOOK
+USE YOMHOOK , ONLY : LHOOK, DR_HOOK, JPHOOK
 USE MODD_DIMPHYEX, ONLY: DIMPHYEX_t
-USE MODD_BUDGET,         ONLY: TBUDGETDATA, TBUDGETCONF_t, NBUDGET_TH, NBUDGET_RV, NBUDGET_RC, &
+USE MODD_BUDGET,         ONLY: TBUDGETDATA, TBUDGETCONF_t, NBUDGET_RC, &
                                NBUDGET_RI, NBUDGET_RR, NBUDGET_RS, NBUDGET_RG, NBUDGET_RH
 USE MODD_CST, ONLY: CST_t
-USE MODD_RAIN_ICE_DESCR, ONLY: RAIN_ICE_DESCR_t
-USE MODD_RAIN_ICE_PARAM, ONLY: RAIN_ICE_PARAM_t
-USE MODD_PARAM_ICE,      ONLY: PARAM_ICE_t
+USE MODD_RAIN_ICE_DESCR_n, ONLY: RAIN_ICE_DESCR_t
+USE MODD_RAIN_ICE_PARAM_n, ONLY: RAIN_ICE_PARAM_t
+USE MODD_PARAM_ICE_n,      ONLY: PARAM_ICE_t
 !
 USE MODE_MSG, ONLY: PRINT_MSG, NVERB_FATAL
 USE MODE_BUDGET_PHY,         ONLY: BUDGET_STORE_INIT_PHY, BUDGET_STORE_END_PHY
@@ -99,7 +98,7 @@ REAL, DIMENSION(D%NIJT,D%NKT,KRR), OPTIONAL, INTENT(OUT)   :: PFPR    ! upper-ai
 REAL, DIMENSION(D%NIJT,D%NKT) :: ZRCT, ZRRT, ZRIT, ZRST, ZRGT, ZRHT
 REAL, DIMENSION(D%NIJT) :: ZINPRI
 INTEGER :: JK, JIJ, IKTB, IKTE, IIJB, IIJE
-REAL(KIND=JPRB) :: ZHOOK_HANDLE
+REAL(KIND=JPHOOK) :: ZHOOK_HANDLE
 !
 IF (LHOOK) CALL DR_HOOK('ICE4_SEDIMENTATION', 0, ZHOOK_HANDLE)
 IKTB=D%NKTB
diff --git a/src/PHYEX/micro/mode_ice4_sedimentation_split.f90 b/src/PHYEX/micro/mode_ice4_sedimentation_split.f90
index 1fcaf9244b1a4981080e445f34fb113216bd8844..b2ef8d05bda3cadc3cca8095a718c98e4f880adc 100644
--- a/src/PHYEX/micro/mode_ice4_sedimentation_split.f90
+++ b/src/PHYEX/micro/mode_ice4_sedimentation_split.f90
@@ -33,13 +33,12 @@ SUBROUTINE ICE4_SEDIMENTATION_SPLIT(D, CST, ICEP, ICED, PARAMI, &
 !*      0. DECLARATIONS
 !          ------------
 !
-USE PARKIND1, ONLY : JPRB
-USE YOMHOOK , ONLY : LHOOK, DR_HOOK
+USE YOMHOOK , ONLY : LHOOK, DR_HOOK, JPHOOK
 USE MODD_DIMPHYEX, ONLY: DIMPHYEX_t
 USE MODD_CST, ONLY: CST_t
-USE MODD_RAIN_ICE_DESCR, ONLY: RAIN_ICE_DESCR_t
-USE MODD_RAIN_ICE_PARAM, ONLY: RAIN_ICE_PARAM_t
-USE MODD_PARAM_ICE,      ONLY: PARAM_ICE_t
+USE MODD_RAIN_ICE_DESCR_n, ONLY: RAIN_ICE_DESCR_t
+USE MODD_RAIN_ICE_PARAM_n, ONLY: RAIN_ICE_PARAM_t
+USE MODD_PARAM_ICE_n,      ONLY: PARAM_ICE_t
 !
 USE MODE_MSG, ONLY: PRINT_MSG, NVERB_FATAL
 !
@@ -88,7 +87,7 @@ REAL, DIMENSION(D%NIJT,D%NKT,KRR), OPTIONAL, INTENT(OUT)   :: PFPR    ! upper-ai
 !
 !
 INTEGER                                                             :: JIJ, JK
-INTEGER :: IKTB, IKTE, IKB, IKL, IIJE, IIJB
+INTEGER :: IKTB, IKTE, IIJE, IIJB
 INTEGER                                                             :: IRR !Workaround of PGI bug with OpenACC (at least up to 18.10 version)
 LOGICAL                                                             :: GSEDIC !Workaround of PGI bug with OpenACC (at least up to 18.10 version)
 LOGICAL                                                             :: GPRESENT_PFPR, GPRESENT_PSEA
@@ -106,7 +105,7 @@ REAL, DIMENSION(D%NIJT, D%NKT)                                      :: ZCONC3D,
                                                                      & ZRST, &
                                                                      & ZRGT, &
                                                                      & ZRHT
-REAL(KIND=JPRB) :: ZHOOK_HANDLE
+REAL(KIND=JPHOOK) :: ZHOOK_HANDLE
 !-------------------------------------------------------------------------------
 !
 IF (LHOOK) CALL DR_HOOK('ICE4_SEDIMENTATION_SPLIT', 0, ZHOOK_HANDLE)
@@ -279,9 +278,9 @@ SUBROUTINE INTERNAL_SEDIM_SPLI(D, CST, ICEP, ICED, PARAMI, KRR, &
 !          ------------
 !
 USE MODD_CST,            ONLY: CST_t
-USE MODD_RAIN_ICE_DESCR, ONLY: RAIN_ICE_DESCR_t
-USE MODD_RAIN_ICE_PARAM, ONLY: RAIN_ICE_PARAM_t
-USE MODD_PARAM_ICE,      ONLY: PARAM_ICE_t
+USE MODD_RAIN_ICE_DESCR_n, ONLY: RAIN_ICE_DESCR_t
+USE MODD_RAIN_ICE_PARAM_n, ONLY: RAIN_ICE_PARAM_t
+USE MODD_PARAM_ICE_n,      ONLY: PARAM_ICE_t
 !
 IMPLICIT NONE
 !
@@ -311,7 +310,7 @@ REAL, DIMENSION(D%NIJT,D%NKT,KRR), INTENT(INOUT), OPTIONAL :: PFPR    ! upper-ai
 !*       0.2  declaration of local variables
 !
 CHARACTER(LEN=10) :: YSPE ! String for error message
-INTEGER                         :: JIJ, JK, JL
+INTEGER                         :: JIJ, JK
 LOGICAL                         :: GPRESENT_PFPR
 REAL                            :: ZINVTSTEP
 REAL                            :: ZZWLBDC, ZRAY, ZZT, ZZWLBDA, ZZCC
@@ -323,7 +322,7 @@ REAL, DIMENSION(SIZE(ICED%XRTMIN))   :: ZRSMIN
 REAL, DIMENSION(D%NIJT)       :: ZREMAINT   ! Remaining time until the timestep end
 REAL, DIMENSION(D%NIJT, 0:D%NKT+1) :: ZWSED   ! Sedimentation fluxes
 INTEGER :: IKTB, IKTE, IKB, IKL, IIJE, IIJB
-REAL(KIND=JPRB) :: ZHOOK_HANDLE
+REAL(KIND=JPHOOK) :: ZHOOK_HANDLE
 IF (LHOOK) CALL DR_HOOK('ICE4_SEDIMENTATION_SPLIT:INTERNAL_SEDIM_SPLIT', 0, ZHOOK_HANDLE)
 !
 IKTB=D%NKTB
@@ -387,7 +386,7 @@ DO WHILE (ANY(ZREMAINT>0.))
         ENDIF
       ENDDO
     ENDDO
-#if defined(REPRO48) 
+#ifdef REPRO48
 #else
   ELSEIF(KSPE==5) THEN
     ! ******* for snow
@@ -418,7 +417,7 @@ DO WHILE (ANY(ZREMAINT>0.))
       CASE(3)
         ZFSED=ICEP%XFSEDR
         ZEXSED=ICEP%XEXSEDR
-#if defined(REPRO48) 
+#ifdef REPRO48
       CASE(5)
         ZFSED=ICEP%XFSEDS
         ZEXSED=ICEP%XEXSEDS
diff --git a/src/PHYEX/micro/mode_ice4_sedimentation_stat.f90 b/src/PHYEX/micro/mode_ice4_sedimentation_stat.f90
index bf5a71b554dca4a76a0df8c346eb36cc865e6420..60c599a483638c4ae09548075ad1248d20b51fc0 100644
--- a/src/PHYEX/micro/mode_ice4_sedimentation_stat.f90
+++ b/src/PHYEX/micro/mode_ice4_sedimentation_stat.f90
@@ -38,13 +38,12 @@ SUBROUTINE ICE4_SEDIMENTATION_STAT(D, CST, ICEP, ICED, PARAMI, &
 !*      0. DECLARATIONS
 !          ------------
 !
-USE PARKIND1, ONLY : JPRB
-USE YOMHOOK , ONLY : LHOOK, DR_HOOK
+USE YOMHOOK , ONLY : LHOOK, DR_HOOK, JPHOOK
 USE MODD_DIMPHYEX, ONLY: DIMPHYEX_t
 USE MODD_CST, ONLY: CST_t
-USE MODD_RAIN_ICE_DESCR, ONLY: RAIN_ICE_DESCR_t
-USE MODD_RAIN_ICE_PARAM, ONLY: RAIN_ICE_PARAM_t
-USE MODD_PARAM_ICE,      ONLY: PARAM_ICE_t
+USE MODD_RAIN_ICE_DESCR_n, ONLY: RAIN_ICE_DESCR_t
+USE MODD_RAIN_ICE_PARAM_n, ONLY: RAIN_ICE_PARAM_t
+USE MODD_PARAM_ICE_n,      ONLY: PARAM_ICE_t
 USE MODI_GAMMA, ONLY: GAMMA
 !
 IMPLICIT NONE
@@ -91,22 +90,15 @@ REAL, DIMENSION(D%NIJT,D%NKT,KRR), OPTIONAL, INTENT(OUT)   :: PFPR    ! upper-ai
 LOGICAL :: LLSEA_AND_TOWN
 INTEGER :: JRR, JIJ, JK, IKB, IKE,IKL, IIJB, IIJE, IKTB, IKTE
 INTEGER :: ISHIFT, IK, IKPLUS
-REAL :: ZQP, ZP1, ZINVTSTEP, ZGAC, ZGC, ZGAC2, ZGC2, ZRAYDEFO, ZLBDAS
+REAL :: ZQP, ZINVTSTEP, ZGAC, ZGC, ZGAC2, ZGC2, ZRAYDEFO, ZLBDAS
 REAL, DIMENSION(D%NIJT) :: ZWSEDW1, ZWSEDW2 ! sedimentation speed
 REAL, DIMENSION(D%NIJT) :: ZTSORHODZ        ! TimeStep Over (Rhodref times delta Z)
 REAL, DIMENSION(D%NIJT,0:1,2:KRR) :: ZSED   ! sedimentation flux array for each species and for above and current levels
 REAL :: FWSED1, FWSED2, PWSEDW, PWSEDWSUP, PINVTSTEP, PTSTEP1, PDZZ1, PRHODREF1, PRXT1
 
-REAL(KIND=JPRB) :: ZHOOK_HANDLE
+REAL(KIND=JPHOOK) :: ZHOOK_HANDLE
 !
-#if defined(REPRO48) 
-! 5 multiplications + 1 division => cost = 7X
-FWSED1(PWSEDW,PTSTEP1,PDZZ1,PRHODREF1,PRXT1,PINVTSTEP)=MIN(1.,PWSEDW*PTSTEP1/PDZZ1 )*PRHODREF1*PDZZ1*PRXT1*PINVTSTEP
-#else
-! 5 multiplications only => cost = 5X
 FWSED1(PWSEDW,PTSTEP1,PDZZ1,PRHODREF1,PRXT1,PINVTSTEP)=MIN(PRHODREF1*PDZZ1*PRXT1*PINVTSTEP,PWSEDW*PRHODREF1*PRXT1)
-#endif
-
 FWSED2(PWSEDW,PTSTEP1,PDZZ1,PWSEDWSUP)=MAX(0.,1.-PDZZ1/(PTSTEP1*PWSEDW))*PWSEDWSUP
 
 !-------------------------------------------------------------------------------
@@ -253,7 +245,7 @@ CONTAINS
     REAL :: ZRAY    ! Cloud Mean radius
     REAL :: ZZWLBDA, ZZWLBDC, ZZCC
 
-    REAL(KIND=JPRB) :: ZHOOK_HANDLE
+    !!REAL(KIND=JPHOOK) :: ZHOOK_HANDLE
 
     !!IF (LHOOK) CALL DR_HOOK('ICE4_SEDIMENTATION_STAT:CLOUD',0,ZHOOK_HANDLE)
 
@@ -312,7 +304,7 @@ CONTAINS
 
     REAL, INTENT(IN)    :: PRXT(D%NIJT) ! mr of specy X
 
-    REAL(KIND=JPRB) :: ZHOOK_HANDLE
+    !!REAL(KIND=JPHOOK) :: ZHOOK_HANDLE
 
     !!IF (LHOOK) CALL DR_HOOK('ICE4_SEDIMENTATION_STAT:PRISTINE_ICE',0,ZHOOK_HANDLE)
 
@@ -359,7 +351,7 @@ CONTAINS
 
     REAL, INTENT(IN)    :: PRXT(D%NIJT) ! mr of specy X
 
-    REAL(KIND=JPRB) :: ZHOOK_HANDLE
+    !!REAL(KIND=JPHOOK) :: ZHOOK_HANDLE
 
     !!IF (LHOOK) CALL DR_HOOK('ICE4_SEDIMENTATION_STAT:SNOW',0,ZHOOK_HANDLE)
 
@@ -418,7 +410,7 @@ CONTAINS
     REAL, INTENT(IN)    :: PEXSED
     REAL, INTENT(IN)    :: PRXT(D%NIJT) ! mr of specy X
 
-    REAL(KIND=JPRB) :: ZHOOK_HANDLE
+    !!REAL(KIND=JPHOOK) :: ZHOOK_HANDLE
 
     !!IF (LHOOK) CALL DR_HOOK('ICE4_SEDIMENTATION_STAT:OTHER_SPECIES',0,ZHOOK_HANDLE)
 
diff --git a/src/PHYEX/micro/mode_ice4_slow.f90 b/src/PHYEX/micro/mode_ice4_slow.f90
index 78aa35289b34904b586917b3c80d8428469cf587..e05c784fae93f11baa945c7859f61084cd5ccbcc 100644
--- a/src/PHYEX/micro/mode_ice4_slow.f90
+++ b/src/PHYEX/micro/mode_ice4_slow.f90
@@ -31,10 +31,9 @@ SUBROUTINE ICE4_SLOW(CST, ICEP, ICED, KPROMA, KSIZE, LDSOFT, LDCOMPUTE, PRHODREF
 !          ------------
 !
 USE MODD_CST,            ONLY: CST_t
-USE MODD_RAIN_ICE_DESCR, ONLY: RAIN_ICE_DESCR_t
-USE MODD_RAIN_ICE_PARAM, ONLY: RAIN_ICE_PARAM_t
-USE PARKIND1, ONLY : JPRB
-USE YOMHOOK , ONLY : LHOOK, DR_HOOK
+USE MODD_RAIN_ICE_DESCR_n, ONLY: RAIN_ICE_DESCR_t
+USE MODD_RAIN_ICE_PARAM_n, ONLY: RAIN_ICE_PARAM_t
+USE YOMHOOK , ONLY : LHOOK, DR_HOOK, JPHOOK
 !
 IMPLICIT NONE
 !
@@ -71,9 +70,8 @@ REAL, DIMENSION(KPROMA),      INTENT(INOUT) :: PRVDEPG  ! Deposition on r_g
 !*       0.2  declaration of local variables
 !
 REAL, DIMENSION(KPROMA) :: ZCRIAUTI
-REAL                    :: ZTIMAUTIC
 INTEGER                 :: JL
-REAL(KIND=JPRB) :: ZHOOK_HANDLE
+REAL(KIND=JPHOOK) :: ZHOOK_HANDLE
 !-------------------------------------------------------------------------------
 !
 IF (LHOOK) CALL DR_HOOK('ICE4_SLOW', 0, ZHOOK_HANDLE)
@@ -113,7 +111,7 @@ ENDDO
 DO JL=1, KSIZE
   IF(PRVT(JL)>ICED%XRTMIN(1) .AND. PRST(JL)>ICED%XRTMIN(5) .AND. LDCOMPUTE(JL)) THEN
     IF(.NOT. LDSOFT) THEN
-#if defined(REPRO48) 
+#ifdef REPRO48
       PRVDEPS(JL) = ( PSSI(JL)/(PRHODREF(JL)*PAI(JL)) ) *                               &
                  ( ICEP%X0DEPS*PLBDAS(JL)**ICEP%XEX0DEPS + ICEP%X1DEPS*PCJ(JL)*PLBDAS(JL)**ICEP%XEX1DEPS )
 #else
@@ -133,12 +131,14 @@ ENDDO
 DO JL=1, KSIZE
   IF(PRIT(JL)>ICED%XRTMIN(4) .AND. PRST(JL)>ICED%XRTMIN(5) .AND. LDCOMPUTE(JL)) THEN
     IF(.NOT. LDSOFT) THEN
+#ifdef REPRO48
       PRIAGGS(JL) = ICEP%XFIAGGS * EXP( ICEP%XCOLEXIS*(PT(JL)-CST%XTT) ) &
                          * PRIT(JL)                      &
-#if defined(REPRO48) 
                          * PLBDAS(JL)**ICEP%XEXIAGGS          &
                          * PRHODREF(JL)**(-ICED%XCEXVT)
 #else
+      PRIAGGS(JL) = ICEP%XFIAGGS * EXP( ICEP%XCOLEXIS*(PT(JL)-CST%XTT) ) &
+                         * PRIT(JL)                      &
                          * PRST(JL) * (1+(ICED%XFVELOS/PLBDAS(JL))**ICED%XALPHAS)**&
                          (-ICED%XNUS+ICEP%XEXIAGGS/ICED%XALPHAS) &
                          * PRHODREF(JL)**(-ICED%XCEXVT+1.) &
@@ -153,13 +153,7 @@ ENDDO
 !*       3.4.5  compute the autoconversion of r_i for r_s production: RIAUTS
 !
 DO JL=1, KSIZE
-#ifdef REPRO48
-  !This was wrong because, with this formulation and in the LDSOFT case, PRIAUTS
-  !was not set to 0 when ri is inferior to the autoconversion threshold
-  IF(PRIT(JL)>ICED%XRTMIN(4) .AND. LDCOMPUTE(JL)) THEN
-#else
   IF(PHLI_HRI(JL)>ICED%XRTMIN(4) .AND. LDCOMPUTE(JL)) THEN
-#endif
     IF(.NOT. LDSOFT) THEN
       !ZCRIAUTI(:)=MIN(ICEP%XCRIAUTI,10**(0.06*(PT(:)-CST%XTT)-3.5))
       ZCRIAUTI(JL)=MIN(ICEP%XCRIAUTI,10**(ICEP%XACRIAUTI*(PT(JL)-CST%XTT)+ICEP%XBCRIAUTI))
diff --git a/src/PHYEX/micro/mode_ice4_stepping.f90 b/src/PHYEX/micro/mode_ice4_stepping.f90
index b4879faa523564249664c799dee5384d6bf26c9c..43604d778dd49d7da69518fc55b4ad0b608e4165 100644
--- a/src/PHYEX/micro/mode_ice4_stepping.f90
+++ b/src/PHYEX/micro/mode_ice4_stepping.f90
@@ -10,7 +10,6 @@ SUBROUTINE ICE4_STEPPING(D, CST, PARAMI, ICEP, ICED, BUCONF, &
                         &LDSIGMA_RC, LDAUCV_ADJU, LDEXT_TEND, &
                         &KPROMA, KMICRO, LDMICRO, PTSTEP, &
                         &KRR, &
-                        &HSUBG_AUCV_RC, HSUBG_AUCV_RI, &
                         &PEXN, PRHODREF, K1, K2, &
                         &PPRES, PCF, PSIGMA_RC, &
                         &PCIT, &
@@ -18,21 +17,37 @@ SUBROUTINE ICE4_STEPPING(D, CST, PARAMI, ICEP, ICED, BUCONF, &
                         &PHLC_HCF, PHLC_HRC, &
                         &PHLI_HCF, PHLI_HRI, PRAINFR, &
                         &PEXTPK, PBU_SUM, PRREVAV)
-
+!     ######################################################################
+!
+!!****  * -  compute the explicit microphysical sources
+!!
+!!    PURPOSE
+!!    -------
+!!      The purpose of this routine is to pack arrays to compute
+!!      the microphysics tendencies
+!!
+!!
+!!    METHOD
+!!    ------
+!!      Pack arrays by chuncks
+!!
+!!
+!!    MODIFICATIONS
+!!    -------------
+!!     R. El Khatib 03-May-2023 Replace OMP SIMD loops by explicit loops : more portable and even slightly faster
 !  -----------------------------------------------------------------
 !
 !*       0.    DECLARATIONS
 !              ------------
 !
-USE PARKIND1, ONLY : JPRB
-USE YOMHOOK , ONLY : LHOOK, DR_HOOK
+USE YOMHOOK , ONLY : LHOOK, DR_HOOK, JPHOOK
 
 USE MODD_DIMPHYEX,       ONLY: DIMPHYEX_t
 USE MODD_BUDGET,         ONLY: TBUDGETCONF_t
 USE MODD_CST,            ONLY: CST_t
-USE MODD_PARAM_ICE,      ONLY: PARAM_ICE_t
-USE MODD_RAIN_ICE_DESCR, ONLY: RAIN_ICE_DESCR_t
-USE MODD_RAIN_ICE_PARAM, ONLY: RAIN_ICE_PARAM_t
+USE MODD_PARAM_ICE_n,      ONLY: PARAM_ICE_t
+USE MODD_RAIN_ICE_DESCR_n, ONLY: RAIN_ICE_DESCR_t
+USE MODD_RAIN_ICE_PARAM_n, ONLY: RAIN_ICE_PARAM_t
 USE MODD_FIELDS_ADDRESS, ONLY : & ! common fields adress
       & ITH,     & ! Potential temperature
       & IRV,     & ! Water vapor
@@ -45,8 +60,6 @@ USE MODD_FIELDS_ADDRESS, ONLY : & ! common fields adress
       & IRREVAV,      & ! Index for the evaporation tendency
       & IBUEXTRAIND     ! Index indirection
 
-USE MODE_MSG,            ONLY: PRINT_MSG, NVERB_FATAL
-
 USE MODE_ICE4_TENDENCIES, ONLY: ICE4_TENDENCIES
 !
 IMPLICIT NONE
@@ -69,8 +82,6 @@ INTEGER,                  INTENT(IN)    :: KMICRO ! Case r_x>0 locations
 LOGICAL, DIMENSION(KPROMA), INTENT(IN)  :: LDMICRO
 REAL,                     INTENT(IN)    :: PTSTEP  ! Double Time step (single if cold start)
 INTEGER,                  INTENT(IN)    :: KRR     ! Number of moist variable
-CHARACTER(LEN=4),         INTENT(IN)    :: HSUBG_AUCV_RC ! Kind of Subgrid autoconversion method
-CHARACTER(LEN=80),        INTENT(IN)    :: HSUBG_AUCV_RI ! Kind of Subgrid autoconversion method
 !
 REAL,    DIMENSION(KPROMA),                     INTENT(IN)    :: PEXN    ! Exner function
 REAL,    DIMENSION(KPROMA),                     INTENT(IN)    :: PRHODREF! Reference density
@@ -87,12 +98,12 @@ REAL,    DIMENSION(KPROMA),                     INTENT(INOUT) :: PHLI_HCF
 REAL,    DIMENSION(KPROMA),                     INTENT(OUT)   :: PRAINFR
 REAL,    DIMENSION(KPROMA,0:7),                 INTENT(INOUT) :: PEXTPK !To take into acount external tendencies inside the splitting
 REAL,    DIMENSION(KPROMA, IBUNUM-IBUNUM_EXTRA),INTENT(OUT)   :: PBU_SUM
-REAL,    DIMENSION(KPROMA),                     INTENT(OUT)   :: PRREVAV
+REAL,    DIMENSION(KPROMA),                     INTENT(INOUT) :: PRREVAV
 !
 !
 !*       0.2   Declarations of local variables :
 !
-REAL(KIND=JPRB) :: ZHOOK_HANDLE
+REAL(KIND=JPHOOK) :: ZHOOK_HANDLE
 !
 LOGICAL :: LSOFT ! Must we really compute tendencies or only adjust them to new T variables
 INTEGER :: INB_ITER_MAX ! Maximum number of iterations (with real tendencies computation)
@@ -153,11 +164,11 @@ ENDIF
 
 !Maximum number of iterations
 !We only count real iterations (those for which we *compute* tendencies)
-INB_ITER_MAX=PARAMI%NMAXITER
+INB_ITER_MAX=PARAMI%NMAXITER_MICRO
 IF(PARAMI%XTSTEP_TS/=0.)THEN
   INB_ITER_MAX=MAX(1, INT(PTSTEP/PARAMI%XTSTEP_TS)) !At least the number of iterations needed for the time-splitting
   ZTSTEP=PTSTEP/INB_ITER_MAX
-  INB_ITER_MAX=MAX(PARAMI%NMAXITER, INB_ITER_MAX) !For the case XMRSTEP/=0. at the same time
+  INB_ITER_MAX=MAX(PARAMI%NMAXITER_MICRO, INB_ITER_MAX) !For the case XMRSTEP/=0. at the same time
 ENDIF
 
 IF (LDEXT_TEND) THEN
@@ -223,9 +234,11 @@ DO WHILE(ANY(ZTIME(1:KMICRO)<PTSTEP)) ! Loop to *really* compute tendencies
   LSOFT=.FALSE. ! We *really* compute the tendencies
 
   DO WHILE(ANY(LLCOMPUTE(1:KMICRO))) ! Loop to adjust tendencies when we cross the 0°C or when a species disappears
-!$OMP SIMD
-    DO JL=1, KMICRO
-      ZSUM2(JL)=SUM(PVART(JL,IRI:KRR))
+    ZSUM2(1:KMICRO)=PVART(1:KMICRO, IRI)
+    DO JV=IRI+1,KRR
+      DO JL=1, KMICRO
+        ZSUM2(JL)=ZSUM2(JL)+PVART(JL, JV)
+      ENDDO
     ENDDO
     DO JL=1, KMICRO
       ZDEVIDE=(CST%XCPD + CST%XCPV*PVART(JL, IRV) + CST%XCL*(PVART(JL, IRC)+PVART(JL, IRR)) + CST%XCI*ZSUM2(JL)) * PEXN(JL)
@@ -242,7 +255,6 @@ DO WHILE(ANY(ZTIME(1:KMICRO)<PTSTEP)) ! Loop to *really* compute tendencies
     CALL ICE4_TENDENCIES(D, CST, PARAMI, ICEP, ICED, BUCONF, &
                         &KPROMA, KMICRO, &
                         &KRR, LSOFT, LLCOMPUTE, &
-                        &HSUBG_AUCV_RC, HSUBG_AUCV_RI, &
                         &PEXN, PRHODREF, ZLVFACT, ZLSFACT, K1, K2, &
                         &PPRES, PCF, PSIGMA_RC, &
                         &PCIT, &
@@ -328,7 +340,9 @@ DO WHILE(ANY(ZTIME(1:KMICRO)<PTSTEP)) ! Loop to *really* compute tendencies
         ! because when mixing ratio has evolved more than a threshold, we must re-compute tendencies
         ! Thus, at first iteration (ie when LLCPZ0RT=.TRUE.) we copy PVART into Z0RT
         DO JV=1,KRR
-          IF (LLCPZ0RT) Z0RT(1:KMICRO, JV)=PVART(1:KMICRO, JV)
+          IF (LLCPZ0RT) THEN
+            Z0RT(1:KMICRO, JV)=PVART(1:KMICRO, JV)
+          ENDIF
           DO JL=1, KMICRO
             IF (IITER(JL)<INB_ITER_MAX .AND. ABS(ZA(JL,JV))>1.E-20) THEN
               ZTIME_THRESHOLD1D(JL)=(SIGN(1., ZA(JL, JV))*PARAMI%XMRSTEP+ &
@@ -344,12 +358,17 @@ DO WHILE(ANY(ZTIME(1:KMICRO)<PTSTEP)) ! Loop to *really* compute tendencies
               LLCOMPUTE(JL)=.FALSE.
             ENDIF
           ENDDO
+          IF (JV == 1) THEN
+            DO JL=1, KMICRO
+              ZMAXB(JL)=ABS(ZB(JL, JV))
+            ENDDO
+          ELSE
+            DO JL=1, KMICRO
+              ZMAXB(JL)=MAX(ZMAXB(JL), ABS(ZB(JL, JV)))
+            ENDDO
+          ENDIF
         ENDDO
         LLCPZ0RT=.FALSE.
-!$OMP SIMD
-        DO JL=1,KMICRO
-          ZMAXB(JL)=MAXVAL(ABS(ZB(JL,1:KRR)))
-        ENDDO
         DO JL=1, KMICRO
           IF (IITER(JL)<INB_ITER_MAX .AND. ZMAXB(JL)>PARAMI%XMRSTEP) THEN
             ZMAXTIME(JL)=0.
diff --git a/src/PHYEX/micro/mode_ice4_tendencies.f90 b/src/PHYEX/micro/mode_ice4_tendencies.f90
index c2f59e5e198e902ebdf9fd1e71179780c60b5ed4..0883b6c8fa9fc2e7bceb0216b00f48c84382b1f5 100644
--- a/src/PHYEX/micro/mode_ice4_tendencies.f90
+++ b/src/PHYEX/micro/mode_ice4_tendencies.f90
@@ -8,7 +8,6 @@ IMPLICIT NONE
 CONTAINS
 SUBROUTINE ICE4_TENDENCIES(D, CST, PARAMI, ICEP, ICED, BUCONF, KPROMA, KSIZE, &
                           &KRR, ODSOFT, LDCOMPUTE, &
-                          &HSUBG_AUCV_RC, HSUBG_AUCV_RI,  &
                           &PEXN, PRHODREF, PLVFACT, PLSFACT, K1, K2, &
                           &PPRES, PCF, PSIGMA_RC, &
                           &PCIT, &
@@ -40,11 +39,10 @@ SUBROUTINE ICE4_TENDENCIES(D, CST, PARAMI, ICEP, ICED, BUCONF, KPROMA, KSIZE, &
 !
 USE MODD_BUDGET,         ONLY: TBUDGETCONF_t
 USE MODD_DIMPHYEX,       ONLY: DIMPHYEX_t
-USE MODE_MSG,            ONLY: PRINT_MSG, NVERB_FATAL
 USE MODD_CST,            ONLY: CST_t
-USE MODD_PARAM_ICE,      ONLY: PARAM_ICE_t
-USE MODD_RAIN_ICE_DESCR, ONLY: RAIN_ICE_DESCR_t
-USE MODD_RAIN_ICE_PARAM, ONLY: RAIN_ICE_PARAM_t
+USE MODD_PARAM_ICE_n,      ONLY: PARAM_ICE_t
+USE MODD_RAIN_ICE_DESCR_n, ONLY: RAIN_ICE_DESCR_t
+USE MODD_RAIN_ICE_PARAM_n, ONLY: RAIN_ICE_PARAM_t
 !
 USE MODD_FIELDS_ADDRESS
 USE MODE_ICE4_RRHONG, ONLY: ICE4_RRHONG
@@ -60,8 +58,7 @@ USE MODE_ICE4_FAST_RH, ONLY: ICE4_FAST_RH
 USE MODE_ICE4_FAST_RI, ONLY: ICE4_FAST_RI
 USE MODE_ICE4_NUCLEATION, ONLY: ICE4_NUCLEATION
 !
-USE PARKIND1, ONLY : JPRB
-USE YOMHOOK , ONLY : LHOOK, DR_HOOK
+USE YOMHOOK , ONLY : LHOOK, DR_HOOK, JPHOOK
 !
 IMPLICIT NONE
 !
@@ -77,8 +74,6 @@ INTEGER,                      INTENT(IN)    :: KPROMA, KSIZE
 INTEGER,                      INTENT(IN)    :: KRR
 LOGICAL,                      INTENT(IN)    :: ODSOFT
 LOGICAL, DIMENSION(KPROMA),   INTENT(IN)    :: LDCOMPUTE
-CHARACTER(LEN=4),             INTENT(IN)    :: HSUBG_AUCV_RC
-CHARACTER(LEN=80),            INTENT(IN)    :: HSUBG_AUCV_RI
 REAL, DIMENSION(KPROMA),       INTENT(IN)    :: PEXN
 REAL, DIMENSION(KPROMA),       INTENT(IN)    :: PRHODREF
 REAL, DIMENSION(KPROMA),       INTENT(IN)    :: PLVFACT
@@ -121,7 +116,7 @@ LOGICAL, DIMENSION(KPROMA) :: LLWETG ! .TRUE. if graupel growths in wet mode
 REAL :: ZZW
 LOGICAL :: LLRFR
 !
-REAL(KIND=JPRB) :: ZHOOK_HANDLE
+REAL(KIND=JPHOOK) :: ZHOOK_HANDLE
 
 IF (LHOOK) CALL DR_HOOK('ICE4_TENDENCIES', 0, ZHOOK_HANDLE)
 
@@ -214,7 +209,7 @@ ELSE
   ELSE
     PBU_INST(:, IRSRIMCG_MR) = 0.
   ENDIF
- 
+
   DO JL=1, KSIZE
     PB(JL, ITH)=PB(JL, ITH) + PBU_INST(JL, IRVHENI_MR)*PLSFACT(JL)
     PB(JL, ITH)=PB(JL, ITH) + PBU_INST(JL, IRRHONG_MR)*(PLSFACT(JL)-PLVFACT(JL))
@@ -250,7 +245,7 @@ ELSE
 ENDIF ! ODSOFT
 !
 !Cloud water split between high and low content part is done here
-CALL ICE4_COMPUTE_PDF(CST, ICEP, ICED, KSIZE, HSUBG_AUCV_RC, HSUBG_AUCV_RI, PARAMI%CSUBG_PR_PDF,&
+CALL ICE4_COMPUTE_PDF(CST, ICEP, ICED, KSIZE, PARAMI%CSUBG_AUCV_RC, PARAMI%CSUBG_AUCV_RI, PARAMI%CSUBG_PR_PDF,&
                       PRHODREF, ZVART(:,IRC), ZVART(:,IRI), PCF, ZT, PSIGMA_RC, &
                       PHLC_HCF, PHLC_LCF, PHLC_HRC, PHLC_LRC, &
                       PHLI_HCF, PHLI_LCF, PHLI_HRI, PHLI_LRI, ZRAINFR)
@@ -265,13 +260,11 @@ IF (LLRFR) THEN
   DO JL=1,KSIZE
     PRAINFR(K1(JL), K2(JL)) = ZRAINFR(JL)
     ZRRT3D (K1(JL), K2(JL)) = ZVART(JL,IRR)
-#ifndef REPRO48
     ZRST3D (K1(JL), K2(JL)) = ZVART(JL,IRS)
     ZRGT3D (K1(JL), K2(JL)) = ZVART(JL,IRG)
-#endif
   END DO
   IF (KRR==7) THEN
-    DO JL=1,KSIZE    
+    DO JL=1,KSIZE
       ZRHT3D (K1(JL), K2(JL)) = ZVART(JL,IRH)
     ENDDO
     CALL ICE4_RAINFR_VERT(D, ICED, PRAINFR(:,:), &
@@ -309,9 +302,9 @@ DO JL=1, KSIZE
   ENDIF
   IF (PARAMI%LSNOW_T) THEN 
    IF (ZVART(JL,IRS)>0. .AND. ZT(JL)>263.15) THEN
-      ZLBDAS(:) = MAX(MIN(ICED%XLBDAS_MAX, 10**(14.554-0.0423*ZT(JL))),ICED%XLBDAS_MIN)*ICED%XTRANS_MP_GAMMAS
+      ZLBDAS(JL) = MAX(MIN(ICED%XLBDAS_MAX, 10**(14.554-0.0423*ZT(JL))),ICED%XLBDAS_MIN)*ICED%XTRANS_MP_GAMMAS
    ELSE IF (ZVART(JL,IRS)>0. .AND. ZT(JL)<=263.15) THEN
-      ZLBDAS(:) = MAX(MIN(ICED%XLBDAS_MAX, 10**(6.226-0.0106*ZT(JL))),ICED%XLBDAS_MIN)*ICED%XTRANS_MP_GAMMAS
+      ZLBDAS(JL) = MAX(MIN(ICED%XLBDAS_MAX, 10**(6.226-0.0106*ZT(JL))),ICED%XLBDAS_MIN)*ICED%XTRANS_MP_GAMMAS
    ELSE
       ZLBDAS(JL)=0.
    END IF
diff --git a/src/PHYEX/micro/mode_ice4_warm.f90 b/src/PHYEX/micro/mode_ice4_warm.f90
index 317b57839b7f503e05bbde975eedec0c74713d54..edcb2e465f5c8470b0aafddc8a80d19dd77de3c1 100644
--- a/src/PHYEX/micro/mode_ice4_warm.f90
+++ b/src/PHYEX/micro/mode_ice4_warm.f90
@@ -32,12 +32,11 @@ SUBROUTINE ICE4_WARM(CST, ICEP, ICED, KPROMA, KSIZE, LDSOFT, LDCOMPUTE, HSUBG_RC
 !          ------------
 !
 USE MODD_CST,            ONLY: CST_t
-USE MODD_RAIN_ICE_DESCR, ONLY: RAIN_ICE_DESCR_t
-USE MODD_RAIN_ICE_PARAM, ONLY: RAIN_ICE_PARAM_t
+USE MODD_RAIN_ICE_DESCR_n, ONLY: RAIN_ICE_DESCR_t
+USE MODD_RAIN_ICE_PARAM_n, ONLY: RAIN_ICE_PARAM_t
 !
 USE MODE_MSG
-USE PARKIND1, ONLY : JPRB
-USE YOMHOOK , ONLY : LHOOK, DR_HOOK
+USE YOMHOOK , ONLY : LHOOK, DR_HOOK, JPHOOK
 !
 IMPLICIT NONE
 !
@@ -79,7 +78,7 @@ REAL, DIMENSION(KPROMA),      INTENT(INOUT) :: PRREVAV  ! Evaporation of r_r
 REAL :: ZZW2, ZZW3, ZZW4
 REAL, DIMENSION(KPROMA) :: ZUSW ! Undersaturation over water
 REAL, DIMENSION(KPROMA) :: ZTHLT    ! Liquid potential temperature
-REAL(KIND=JPRB) :: ZHOOK_HANDLE
+REAL(KIND=JPHOOK) :: ZHOOK_HANDLE
 INTEGER :: JL
 LOGICAL :: LMASK, LMASK1, LMASK2
 !-------------------------------------------------------------------------------
@@ -94,13 +93,8 @@ IF (LHOOK) CALL DR_HOOK('ICE4_WARM', 0, ZHOOK_HANDLE)
 DO JL=1, KSIZE
   IF(PHLC_HRC(JL)>ICED%XRTMIN(2) .AND. PHLC_HCF(JL)>0. .AND. LDCOMPUTE(JL)) THEN
     IF(.NOT. LDSOFT) THEN
-#if defined(REPRO48) 
-      PRCAUTR(JL) = ICEP%XTIMAUTC*MAX(PHLC_HRC(JL)/PHLC_HCF(JL) - ICEP%XCRIAUTC/PRHODREF(JL), 0.0)
-      PRCAUTR(JL) = PHLC_HCF(JL)*PRCAUTR(JL)
-#else
       !HCF*autoconv(HRC/HCF) with simplification
       PRCAUTR(JL) = ICEP%XTIMAUTC*MAX(PHLC_HRC(JL) - PHLC_HCF(JL)*ICEP%XCRIAUTC/PRHODREF(JL), 0.0)
-#endif
     ENDIF
   ELSE
     PRCAUTR(JL) = 0.
@@ -135,26 +129,15 @@ ELSEIF (HSUBG_RC_RR_ACCR=='PRFR') THEN
   DO JL=1, KSIZE
     LMASK = PRCT(JL)>ICED%XRTMIN(2) .AND. PRRT(JL)>ICED%XRTMIN(3) .AND. LDCOMPUTE(JL)
     LMASK1 = LMASK .AND. PHLC_HRC(JL)>ICED%XRTMIN(2) .AND. PHLC_HCF(JL)>0.
-#ifdef REPRO48
-    LMASK2 = LMASK .AND. PHLC_LRC(JL)>ICED%XRTMIN(2) .AND. PHLC_LCF(JL)>0.
-#else
     LMASK2 = LMASK .AND. PHLC_LRC(JL)>ICED%XRTMIN(2) .AND. PHLC_LCF(JL)>1.E-20
-#endif
     IF(LMASK1 .OR. LMASK2) THEN
       IF(.NOT. LDSOFT) THEN
         IF(LMASK1) THEN
           !Accretion due to rain falling in high cloud content
-#if defined(REPRO48) 
-          PRCACCR(JL) = ICEP%XFCACCR * ( PHLC_HRC(JL)/PHLC_HCF(JL) )     &
-                      &*PLBDAR_RF(JL)**ICEP%XEXCACCR &
-                      &*PRHODREF(JL)**(-ICED%XCEXVT) &
-                      &*PHLC_HCF(JL)
-#else
           !HCF*accretion(HRC/HCF) with simplification
           PRCACCR(:) = ICEP%XFCACCR * PHLC_HRC(JL)     &
                       &*PLBDAR_RF(JL)**ICEP%XEXCACCR &
                       &*PRHODREF(JL)**(-ICED%XCEXVT)
-#endif
         ELSE
           PRCACCR(JL)=0.
         ENDIF
diff --git a/src/PHYEX/micro/mode_icecloud.f90 b/src/PHYEX/micro/mode_icecloud.f90
index e05effa6e2f66def26ffba530cc9601c3348b921..5f44bf9a07a50a38d50f8df88cba054496f40e19 100644
--- a/src/PHYEX/micro/mode_icecloud.f90
+++ b/src/PHYEX/micro/mode_icecloud.f90
@@ -7,10 +7,9 @@ SUBROUTINE ICECLOUD  &
 !   Output :
      &  SIFRC,SSIO,SSIU,W2D,RSI)
 
-  USE PARKIND1, ONLY : JPRB
-  USE YOMHOOK , ONLY : LHOOK, DR_HOOK
+  USE YOMHOOK , ONLY : LHOOK, DR_HOOK, JPHOOK
   USE MODD_DIMPHYEX,       ONLY: DIMPHYEX_t
-  USE MODD_CST,ONLY : XCPD,XCPV,XLVTT,XLSTT,XG,XRD,XEPSILO
+  USE MODD_CST,ONLY : XCPD,XLVTT,XG,XRD,XEPSILO
   USE MODE_TIWMX, ONLY: ESATW, ESATI
   USE MODE_QSATMX_TAB, ONLY: QSATMX_TAB
   IMPLICIT NONE
@@ -73,11 +72,11 @@ REAL,  INTENT(OUT) ::      RSI(D%NIJT)
 
 !     Working variables:
 REAL :: ZSIGMAX,ZSIGMAY,ZSIGMAZ,ZXDIST,ZYDIST,&
-     & ZRSW,ZRHW,ZRHIN,ZDRHDZ,ZZ,ZRHDIST,ZRHLIM, &
+     & ZRHW,ZRHIN,ZDRHDZ,ZZ,ZRHDIST,ZRHLIM, &
      & ZRHDIF,ZWCLD,ZI2W,ZRHLIMICE,ZRHLIMINV,ZA,ZRHI,ZR
 INTEGER :: JIJ, IIJB, IIJE
 
-REAL(KIND=JPRB) :: ZHOOK_HANDLE
+REAL(KIND=JPHOOK) :: ZHOOK_HANDLE
 IF (LHOOK) CALL DR_HOOK('ICECLOUD',0,ZHOOK_HANDLE)
 !
 IIJB=D%NIJB
diff --git a/src/PHYEX/micro/mode_ini_lima.f90 b/src/PHYEX/micro/mode_ini_lima.f90
index 6f4bdcd0015f42e8c770bac6981c0542eb09ee4a..3fba2eaabb5078c0426457590e71941afb8e1e3b 100644
--- a/src/PHYEX/micro/mode_ini_lima.f90
+++ b/src/PHYEX/micro/mode_ini_lima.f90
@@ -4,26 +4,11 @@
 !MNH_LIC for details. version 1.
 !-----------------------------------------------------------------
 !      ####################
-       MODULE MODI_INI_LIMA
+       MODULE MODE_INI_LIMA
 !      ####################
 !
-INTERFACE
-      SUBROUTINE INI_LIMA (PTSTEP, PDZMIN, KSPLITR, KSPLITG)
-!
-INTEGER,                 INTENT(OUT):: KSPLITR   ! Number of small time step
-                                                 ! integration for  rain
-                                                 ! sedimendation
-INTEGER,                 INTENT(OUT):: KSPLITG   ! Number of small time step
-                                                 ! integration for graupel
-                                                 ! sedimendation
-REAL,                    INTENT(IN) :: PTSTEP    ! Effective Time step 
-REAL,                    INTENT(IN) :: PDZMIN    ! minimun vertical mesh size
-!
-END SUBROUTINE INI_LIMA
-!
-END INTERFACE
-!
-END MODULE MODI_INI_LIMA
+IMPLICIT NONE
+CONTAINS
 !     ######################################################
       SUBROUTINE INI_LIMA (PTSTEP, PDZMIN, KSPLITR, KSPLITG)
 !     ######################################################
@@ -52,9 +37,10 @@ END MODULE MODI_INI_LIMA
 !              ------------
 !
 USE MODD_CST
-USE MODD_REF
 USE MODD_PARAM_LIMA
 USE MODD_PARAMETERS
+USE MODE_INI_LIMA_WARM, ONLY: INI_LIMA_WARM
+USE MODE_INI_LIMA_COLD_MIXED, ONLY: INI_LIMA_COLD_MIXED
 !USE MODD_LUNIT, ONLY : TLUOUT0
 !
 IMPLICIT NONE
@@ -77,8 +63,6 @@ REAL     :: ZT      ! Work variable
 REAL, DIMENSION(7)  :: ZVTRMAX
 !
 INTEGER  :: JI
-INTEGER  :: ILUOUT0 ! Logical unit number for output-listing
-INTEGER  :: IRESP   ! Return code of FM-routines
 !  
 !-------------------------------------------------------------------------------
 !
@@ -130,12 +114,12 @@ END DO SPLITG
 !
 !
 !
-IF (ALLOCATED(XRTMIN)) RETURN    ! In case of nesting microphysics, constants of
-                                 ! MODD_RAIN_C2R2_PARAM are computed only once.
+IF (ASSOCIATED(XRTMIN)) RETURN    ! In case of nesting microphysics, constants of
+                                  ! MODD_RAIN_C2R2_PARAM are computed only once.
 !
 !
 ! Set bounds for mixing ratios and concentrations
-ALLOCATE( XRTMIN(7) )
+CALL PARAM_LIMA_ALLOCATE('XRTMIN', 7)
 XRTMIN(1) = 1.0E-10   ! rv
 XRTMIN(2) = 1.0E-10   ! rc
 XRTMIN(3) = 1.0E-10   ! rr
@@ -143,7 +127,7 @@ XRTMIN(4) = 1.0E-10   ! ri
 XRTMIN(5) = 1.0E-10   ! rs
 XRTMIN(6) = 1.0E-10   ! rg
 XRTMIN(7) = 1.0E-10   ! rh
-ALLOCATE( XCTMIN(7) )
+CALL PARAM_LIMA_ALLOCATE('XCTMIN', 7)
 XCTMIN(1) = 1.0       ! Not used
 XCTMIN(2) = 1.0E-3    ! Nc
 XCTMIN(3) = 1.0E-3    ! Nr
@@ -171,3 +155,5 @@ CALL INI_LIMA_COLD_MIXED(PTSTEP, PDZMIN)
 !------------------------------------------------------------------------------
 !
 END SUBROUTINE INI_LIMA
+!
+END MODULE MODE_INI_LIMA
diff --git a/src/PHYEX/micro/mode_ini_lima_cold_mixed.f90 b/src/PHYEX/micro/mode_ini_lima_cold_mixed.f90
index 55303431f6c033e1ae31ab923f02f13b7570af5a..e8774847097e970a599f89335616b835b54b3c94 100644
--- a/src/PHYEX/micro/mode_ini_lima_cold_mixed.f90
+++ b/src/PHYEX/micro/mode_ini_lima_cold_mixed.f90
@@ -4,20 +4,13 @@
 !MNH_LIC for details. version 1.
 !-----------------------------------------------------------------
 !      ###############################
-       MODULE MODI_INI_LIMA_COLD_MIXED
+       MODULE MODE_INI_LIMA_COLD_MIXED
 !      ###############################
 !
-INTERFACE
-      SUBROUTINE INI_LIMA_COLD_MIXED (PTSTEP, PDZMIN)
-!
-REAL,                    INTENT(IN) :: PTSTEP    ! Effective Time step 
-REAL,                    INTENT(IN) :: PDZMIN    ! minimun vertical mesh size
-!
-END SUBROUTINE INI_LIMA_COLD_MIXED
+IMPLICIT NONE
 !
-END INTERFACE
+CONTAINS
 !
-END MODULE MODI_INI_LIMA_COLD_MIXED
 !     ###############################################
       SUBROUTINE INI_LIMA_COLD_MIXED (PTSTEP, PDZMIN)
 !     ###############################################
@@ -57,7 +50,6 @@ USE MODD_PARAM_LIMA
 USE MODD_PARAM_LIMA_WARM
 USE MODD_PARAM_LIMA_COLD
 USE MODD_PARAM_LIMA_MIXED
-USE MODD_REF
 !
 use mode_msg
 !
@@ -88,13 +80,11 @@ REAL,                    INTENT(IN) :: PDZMIN    ! minimun vertical mesh size
 character(len=13) :: yval     ! String for error message
 INTEGER :: IKB                ! Coordinates of the first  physical 
                               ! points along z
-INTEGER :: J1,J2              ! Internal loop indexes
+INTEGER :: J1                 ! Internal loop indexes
 !
 REAL, DIMENSION(8)  :: ZGAMI  ! parameters involving various moments
 REAL, DIMENSION(2)  :: ZGAMS  ! of the generalized gamma law
 !
-REAL :: ZT                    ! Work variable
-REAL :: ZVTRMAX               ! Raindrop maximal fall velocity
 REAL :: ZRHO00                ! Surface reference air density
 REAL :: ZRATE                 ! Geometrical growth of Lbda in the tabulated
                               ! functions and kernels
@@ -117,7 +107,7 @@ INTEGER  :: KND
 INTEGER  :: KACCLBDAS,KACCLBDAR,KDRYLBDAG,KDRYLBDAS,KDRYLBDAR
 REAL     :: PALPHAR,PALPHAS,PALPHAG,PALPHAH
 REAL     :: PNUR,PNUS,PNUG,PNUH
-REAL     :: PBR,PBS,PBG,PBH
+REAL     :: PBR,PBS,PBG
 REAL     :: PCR,PCS,PCG,PCH
 REAL     :: PDR,PDS,PFVELOS,PDG,PDH
 REAL     :: PESR,PEGS,PEGR,PEHS,PEHG
@@ -131,24 +121,21 @@ INTEGER  :: KWETLBDAS,KWETLBDAG,KWETLBDAH
 !
 REAL     :: ZFAC_ZRNIC ! Zrnic factor used to decrease Long Kernels
 !
-REAL :: ZBOUND_CIBU_SMIN    ! XDCSLIM*Lbda_s : lower & upper bound used
-REAL :: ZBOUND_CIBU_SMAX    !        in the tabulated function
-REAL :: ZBOUND_CIBU_GMIN    ! XDCGLIM*Lbda_g : lower & upper bound used
-REAL :: ZBOUND_CIBU_GMAX    !        in the tabulated function
+REAL :: ZBOUND_CIBU_SMIN    ! XDCSLIM*Lbda_s : lower bound used in the tabulated function
+REAL :: ZBOUND_CIBU_GMIN    ! XDCGLIM*Lbda_g : lower bound used in the tabulated function
 REAL :: ZRATE_S             ! Geometrical growth of Lbda_s in the tabulated function
 REAL :: ZRATE_G             ! Geometrical growth of Lbda_g in the tabulated function
 !
-REAL :: ZBOUND_RDSF_RMIN    ! XDCRLIM*Lbda_r : lower & upper bound used
-REAL :: ZBOUND_RDSF_RMAX    ! in the tabulated function
+REAL :: ZBOUND_RDSF_RMIN    ! XDCRLIM*Lbda_r : lower bound used in the tabulated function
 REAL :: ZRATE_R             ! Geometrical growth of Lbda_r in the tabulated function
 REAL :: ZKHI_LWM            ! Coefficient of Lawson et al. (2015)
 !
-REAL :: ZRHOIW ! ice density
-!
 !-------------------------------------------------------------------------------
 !
 !
 !ILUOUT0 = TLUOUT0%NLU
+CALL PARAM_LIMA_COLD_ASSOCIATE()
+CALL PARAM_LIMA_MIXED_ASSOCIATE()
 !
 !
 !*       1.     CHARACTERISTICS OF THE SPECIES
@@ -568,8 +555,8 @@ END IF
 !
 NDIAM = 70
 !
-ALLOCATE(XABSCISS(NDIAM))
-ALLOCATE(XWEIGHT (NDIAM))
+CALL PARAM_LIMA_ALLOCATE('XABSCISS', NDIAM)
+CALL PARAM_LIMA_ALLOCATE('XWEIGHT',  NDIAM)
 !
 CALL GAUHER(XABSCISS, XWEIGHT, NDIAM)
 !
@@ -814,17 +801,17 @@ XEXSRIMCG2=XBG
 !!$  WRITE(UNIT=ILUOUT0,FMT='(" Coll. efficiency          XCOLCS=",E13.6)') XCOLCS
 !!$END IF
 !!$!
-NGAMINC = 80
-XGAMINC_BOUND_MIN = (1000.*XTRANS_MP_GAMMAS*XDCSLIM)**XALPHAS !1.0E-1 ! Minimal value of (Lbda * D_cs^lim)**alpha
-XGAMINC_BOUND_MAX = (50000.*XTRANS_MP_GAMMAS*XDCSLIM)**XALPHAS !1.0E7 ! Maximal value of (Lbda * D_cs^lim)**alpha
-ZRATE = EXP(LOG(XGAMINC_BOUND_MAX/XGAMINC_BOUND_MIN)/FLOAT(NGAMINC-1))
+PARAM_LIMA_MIXED%NGAMINC = 80
+PARAM_LIMA_MIXED%XGAMINC_BOUND_MIN = (1000.*XTRANS_MP_GAMMAS*XDCSLIM)**XALPHAS !1.0E-1 ! Minimal value of (Lbda * D_cs^lim)**alpha
+PARAM_LIMA_MIXED%XGAMINC_BOUND_MAX = (50000.*XTRANS_MP_GAMMAS*XDCSLIM)**XALPHAS !1.0E7 ! Maximal value of (Lbda * D_cs^lim)**alpha
+ZRATE = EXP(LOG(PARAM_LIMA_MIXED%XGAMINC_BOUND_MAX/PARAM_LIMA_MIXED%XGAMINC_BOUND_MIN)/FLOAT(PARAM_LIMA_MIXED%NGAMINC-1))
 !
-ALLOCATE( XGAMINC_RIM1(NGAMINC) )
-ALLOCATE( XGAMINC_RIM2(NGAMINC) )
-ALLOCATE( XGAMINC_RIM4(NGAMINC) )
+CALL PARAM_LIMA_MIXED_ALLOCATE('XGAMINC_RIM1', NGAMINC)
+CALL PARAM_LIMA_MIXED_ALLOCATE('XGAMINC_RIM2', NGAMINC)
+CALL PARAM_LIMA_MIXED_ALLOCATE('XGAMINC_RIM4', NGAMINC)
 !
 DO J1=1,NGAMINC
-  ZBOUND = XGAMINC_BOUND_MIN*ZRATE**(J1-1)
+  ZBOUND = PARAM_LIMA_MIXED%XGAMINC_BOUND_MIN*ZRATE**(J1-1)
   XGAMINC_RIM1(J1) = GAMMA_INC(XNUS+(2.0+XDS)/XALPHAS,ZBOUND)
   XGAMINC_RIM2(J1) = GAMMA_INC(XNUS+XBS/XALPHAS      ,ZBOUND)
   XGAMINC_RIM4(J1) = GAMMA_INC(XNUS+XBG/XALPHAS      ,ZBOUND) ! Pour Murakami 1990
@@ -846,14 +833,14 @@ XHM_FACTS = XHM_YIELD*(XHM_COLLCS/XCOLCS)
 !
 ! Notice: One magnitude of lambda discretized over 10 points for the droplets 
 !
-XGAMINC_HMC_BOUND_MIN = 1.0E-3 ! Min value of (Lbda * (12,25) microns)**alpha
-XGAMINC_HMC_BOUND_MAX = 1.0E5  ! Max value of (Lbda * (12,25) microns)**alpha
-ZRATE = EXP(LOG(XGAMINC_HMC_BOUND_MAX/XGAMINC_HMC_BOUND_MIN)/REAL(NGAMINC-1))
+PARAM_LIMA_MIXED%XGAMINC_HMC_BOUND_MIN = 1.0E-3 ! Min value of (Lbda * (12,25) microns)**alpha
+PARAM_LIMA_MIXED%XGAMINC_HMC_BOUND_MAX = 1.0E5  ! Max value of (Lbda * (12,25) microns)**alpha
+ZRATE = EXP(LOG(PARAM_LIMA_MIXED%XGAMINC_HMC_BOUND_MAX/PARAM_LIMA_MIXED%XGAMINC_HMC_BOUND_MIN)/REAL(PARAM_LIMA_MIXED%NGAMINC-1))
 !
-ALLOCATE( XGAMINC_HMC(NGAMINC) )
+CALL PARAM_LIMA_MIXED_ALLOCATE('XGAMINC_HMC', NGAMINC)
 !
 DO J1=1,NGAMINC
-  ZBOUND = XGAMINC_HMC_BOUND_MIN*ZRATE**(J1-1)
+  ZBOUND = PARAM_LIMA_MIXED%XGAMINC_HMC_BOUND_MIN*ZRATE**(J1-1)
   XGAMINC_HMC(J1) = GAMMA_INC(XNUC,ZBOUND)
 END DO
 !
@@ -890,18 +877,18 @@ XLBNSACCR3  =                          MOMG(XALPHAS,XNUS,2.)
 ! Notice: One magnitude of lambda discretized over 10 points for rain
 ! Notice: One magnitude of lambda discretized over 10 points for snow
 !
-NACCLBDAS = 40
-XACCLBDAS_MIN = 5.0E1*XTRANS_MP_GAMMAS !5.0E1*XTRANS_MP_GAMMAS ! Minimal value of Lbda_s to tabulate XKER_RACCS
-XACCLBDAS_MAX = 5.0E5*XTRANS_MP_GAMMAS !5.0E5*XTRANS_MP_GAMMAS ! Maximal value of Lbda_s to tabulate XKER_RACCS
+PARAM_LIMA_MIXED%NACCLBDAS = 40
+PARAM_LIMA_MIXED%XACCLBDAS_MIN = 5.0E1*XTRANS_MP_GAMMAS !5.0E1*XTRANS_MP_GAMMAS ! Minimal value of Lbda_s to tabulate XKER_RACCS
+PARAM_LIMA_MIXED%XACCLBDAS_MAX = 5.0E5*XTRANS_MP_GAMMAS !5.0E5*XTRANS_MP_GAMMAS ! Maximal value of Lbda_s to tabulate XKER_RACCS
 ZRATE = LOG(XACCLBDAS_MAX/XACCLBDAS_MIN)/FLOAT(NACCLBDAS-1)
-XACCINTP1S = 1.0 / ZRATE
-XACCINTP2S = 1.0 - LOG( XACCLBDAS_MIN ) / ZRATE
-NACCLBDAR = 40
-XACCLBDAR_MIN = 1.0E3 ! Minimal value of Lbda_r to tabulate XKER_RACCS
-XACCLBDAR_MAX = 1.0E7 ! Maximal value of Lbda_r to tabulate XKER_RACCS
-ZRATE = LOG(XACCLBDAR_MAX/XACCLBDAR_MIN)/REAL(NACCLBDAR-1)
+PARAM_LIMA_MIXED%XACCINTP1S = 1.0 / ZRATE
+PARAM_LIMA_MIXED%XACCINTP2S = 1.0 - LOG( XACCLBDAS_MIN ) / ZRATE
+PARAM_LIMA_MIXED%NACCLBDAR = 40
+PARAM_LIMA_MIXED%XACCLBDAR_MIN = 1.0E3 ! Minimal value of Lbda_r to tabulate XKER_RACCS
+PARAM_LIMA_MIXED%XACCLBDAR_MAX = 1.0E7 ! Maximal value of Lbda_r to tabulate XKER_RACCS
+ZRATE = LOG(PARAM_LIMA_MIXED%XACCLBDAR_MAX/PARAM_LIMA_MIXED%XACCLBDAR_MIN)/REAL(NACCLBDAR-1)
 XACCINTP1R = 1.0 / ZRATE
-XACCINTP2R = 1.0 - LOG( XACCLBDAR_MIN ) / ZRATE
+XACCINTP2R = 1.0 - LOG( PARAM_LIMA_MIXED%XACCLBDAR_MIN ) / ZRATE
 !
 !*       7.2.2  Computations of the tabulated normalized kernels
 !
@@ -909,12 +896,12 @@ IND      = 50    ! Interval number, collection efficiency and infinite diameter
 ZESR     = 1.0   ! factor used to integrate the dimensional distributions when
 ZFDINFTY = 20.0  ! computing the kernels XKER_RACCSS, XKER_RACCS and XKER_SACCRG
 !
-ALLOCATE( XKER_RACCSS(NACCLBDAS,NACCLBDAR) )
-ALLOCATE( XKER_RACCS (NACCLBDAS,NACCLBDAR) )
-ALLOCATE( XKER_SACCRG(NACCLBDAR,NACCLBDAS) )
-ALLOCATE( XKER_N_RACCSS(NACCLBDAS,NACCLBDAR) )
-ALLOCATE( XKER_N_RACCS (NACCLBDAS,NACCLBDAR) )
-ALLOCATE( XKER_N_SACCRG(NACCLBDAR,NACCLBDAS) )
+CALL PARAM_LIMA_MIXED_ALLOCATE('XKER_RACCSS', NACCLBDAS,NACCLBDAR)
+CALL PARAM_LIMA_MIXED_ALLOCATE('XKER_RACCS', NACCLBDAS,NACCLBDAR)
+CALL PARAM_LIMA_MIXED_ALLOCATE('XKER_SACCRG', NACCLBDAR,NACCLBDAS)
+CALL PARAM_LIMA_MIXED_ALLOCATE('XKER_N_RACCSS', NACCLBDAS,NACCLBDAR)
+CALL PARAM_LIMA_MIXED_ALLOCATE('XKER_N_RACCS', NACCLBDAS,NACCLBDAR)
+CALL PARAM_LIMA_MIXED_ALLOCATE('XKER_N_SACCRG', NACCLBDAR,NACCLBDAS)
 CALL NRCOLSS ( IND, XALPHAS, XNUS, XALPHAR, XNUR,                        & 
                ZESR, XCS, XDS, XFVELOS, XCR, XDR,                        & 
                XACCLBDAS_MAX, XACCLBDAR_MAX, XACCLBDAS_MIN, XACCLBDAR_MIN, & 
@@ -1062,10 +1049,10 @@ END IF
 !
 ! Notice: One magnitude of lambda discretized over 10 points for snow
 !
-NSCLBDAS = 80
-XSCLBDAS_MIN = 1.0E0*XTRANS_MP_GAMMAS  ! Minimal value of Lbda_s to tabulate XKER_RSCS
-XSCLBDAS_MAX = 5.0E10*XTRANS_MP_GAMMAS ! Maximal value of Lbda_s to tabulate XKER_RSCS
-ZRATE = LOG(XSCLBDAS_MAX/XSCLBDAS_MIN)/FLOAT(NSCLBDAS-1)
+PARAM_LIMA_COLD%NSCLBDAS = 80
+PARAM_LIMA_MIXED%XSCLBDAS_MIN = 1.0E0*XTRANS_MP_GAMMAS  ! Minimal value of Lbda_s to tabulate XKER_RSCS
+PARAM_LIMA_MIXED%XSCLBDAS_MAX = 5.0E10*XTRANS_MP_GAMMAS ! Maximal value of Lbda_s to tabulate XKER_RSCS
+ZRATE = LOG(PARAM_LIMA_MIXED%XSCLBDAS_MAX/PARAM_LIMA_MIXED%XSCLBDAS_MIN)/FLOAT(PARAM_LIMA_COLD%NSCLBDAS-1)
 XSCINTP1S = 1.0 / ZRATE
 XSCINTP2S = 1.0 - LOG( XSCLBDAS_MIN ) / ZRATE
 !
@@ -1074,7 +1061,7 @@ XSCINTP2S = 1.0 - LOG( XSCLBDAS_MIN ) / ZRATE
   ZESS     = 1.0   ! factor used to integrate the dimensional distributions when
   ZFDINFTY = 20.0  ! computing the kernels XKER_SSCSS
 !
-  ALLOCATE( XKER_N_SSCS(NSCLBDAS,NSCLBDAS) )
+  CALL PARAM_LIMA_COLD_ALLOCATE('XKER_N_SSCS', NSCLBDAS,NSCLBDAS)
 !
   CALL NZCOLX  ( IND, XALPHAS, XNUS, XALPHAS, XNUS,                          & 
                ZESS, XCS, XDS, XFVELOS, XCS, XDS, XFVELOS,                   & 
@@ -1141,23 +1128,25 @@ XDCGLIM_CIBU_MIN = 2.0E-3 ! D_cg lim min
 !!$  WRITE(UNIT=ILUOUT0,FMT='(" D_cg^lim min     =",E13.6)') XDCGLIM_CIBU_MIN
 !!$END IF
 !
-NGAMINC = 80
+PARAM_LIMA_MIXED%NGAMINC = 80
 !
 !Note : Boundaries are rounded at 5.0 or 1.0 (down for Bound_min and up for Bound_max)
-XGAMINC_BOUND_CIBU_SMIN = 1.0E-5 * XTRANS_MP_GAMMAS**XALPHAS ! Minimal value of (Lbda_s * D_cs^lim)**alpha) 0.2 mm
-XGAMINC_BOUND_CIBU_SMAX = 5.0E+2 * XTRANS_MP_GAMMAS**XALPHAS ! Maximal value of (Lbda_s * D_cs^lim)**alpha) 1 mm
-ZRATE_S = EXP(LOG(XGAMINC_BOUND_CIBU_SMAX/XGAMINC_BOUND_CIBU_SMIN)/FLOAT(NGAMINC-1))
+PARAM_LIMA_MIXED%XGAMINC_BOUND_CIBU_SMIN = 1.0E-5 * XTRANS_MP_GAMMAS**XALPHAS ! Minimal value of (Lbda_s * D_cs^lim)**alpha) 0.2 mm
+PARAM_LIMA_MIXED%XGAMINC_BOUND_CIBU_SMAX = 5.0E+2 * XTRANS_MP_GAMMAS**XALPHAS ! Maximal value of (Lbda_s * D_cs^lim)**alpha) 1 mm
+ZRATE_S = EXP(LOG(PARAM_LIMA_MIXED%XGAMINC_BOUND_CIBU_SMAX/PARAM_LIMA_MIXED%XGAMINC_BOUND_CIBU_SMIN)/&
+              FLOAT(PARAM_LIMA_MIXED%NGAMINC-1))
 !
-XGAMINC_BOUND_CIBU_GMIN = 1.0E-1 ! Minimal value of (Lbda_g * D_cg^lim)**alpha) 2 mm
-XGAMINC_BOUND_CIBU_GMAX = 5.0E+1 ! Maximal value of (Lbda_g * D_cg^lim)**alpha) 2 mm
-ZRATE_G = EXP(LOG(XGAMINC_BOUND_CIBU_GMAX/XGAMINC_BOUND_CIBU_GMIN)/FLOAT(NGAMINC-1))
+PARAM_LIMA_MIXED%XGAMINC_BOUND_CIBU_GMIN = 1.0E-1 ! Minimal value of (Lbda_g * D_cg^lim)**alpha) 2 mm
+PARAM_LIMA_MIXED%XGAMINC_BOUND_CIBU_GMAX = 5.0E+1 ! Maximal value of (Lbda_g * D_cg^lim)**alpha) 2 mm
+ZRATE_G = EXP(LOG(PARAM_LIMA_MIXED%XGAMINC_BOUND_CIBU_GMAX/PARAM_LIMA_MIXED%XGAMINC_BOUND_CIBU_GMIN)/&
+              FLOAT(PARAM_LIMA_MIXED%NGAMINC-1))
 !
-ALLOCATE( XGAMINC_CIBU_S(4,NGAMINC) )
-ALLOCATE( XGAMINC_CIBU_G(2,NGAMINC) )
+CALL PARAM_LIMA_MIXED_ALLOCATE('XGAMINC_CIBU_S', 4,PARAM_LIMA_MIXED%NGAMINC)
+CALL PARAM_LIMA_MIXED_ALLOCATE('XGAMINC_CIBU_G', 2,PARAM_LIMA_MIXED%NGAMINC)
 !
 DO J1 = 1, NGAMINC
-  ZBOUND_CIBU_SMIN = XGAMINC_BOUND_CIBU_SMIN * ZRATE_S**(J1-1)
-  ZBOUND_CIBU_GMIN = XGAMINC_BOUND_CIBU_GMIN * ZRATE_G**(J1-1)
+  ZBOUND_CIBU_SMIN = PARAM_LIMA_MIXED%XGAMINC_BOUND_CIBU_SMIN * ZRATE_S**(J1-1)
+  ZBOUND_CIBU_GMIN = PARAM_LIMA_MIXED%XGAMINC_BOUND_CIBU_GMIN * ZRATE_G**(J1-1)
 !
 ! For ZNI_CIBU
   XGAMINC_CIBU_S(1,J1) = GAMMA_INC(XNUS,ZBOUND_CIBU_SMIN)
@@ -1200,16 +1189,17 @@ XDCRLIM_RDSF_MIN = 0.1E-3 ! D_cr lim min
 !!$  WRITE(UNIT=ILUOUT0,FMT='(" D_cr^lim min     =",E13.6)') XDCRLIM_RDSF_MIN
 !!$END IF
 !
-NGAMINC = 80
+PARAM_LIMA_MIXED%NGAMINC = 80
 !
-XGAMINC_BOUND_RDSF_RMIN = 1.0E-5    ! Minimal value of (Lbda_r * D_cr^lim)**alpha) 0.1 mm
-XGAMINC_BOUND_RDSF_RMAX = 5.0E-3    ! Maximal value of (Lbda_r * D_cr^lim)**alpha) 1 mm
-ZRATE_R = EXP(LOG(XGAMINC_BOUND_RDSF_RMAX/XGAMINC_BOUND_RDSF_RMIN)/FLOAT(NGAMINC-1))
+PARAM_LIMA_MIXED%XGAMINC_BOUND_RDSF_RMIN = 1.0E-5    ! Minimal value of (Lbda_r * D_cr^lim)**alpha) 0.1 mm
+PARAM_LIMA_MIXED%XGAMINC_BOUND_RDSF_RMAX = 5.0E-3    ! Maximal value of (Lbda_r * D_cr^lim)**alpha) 1 mm
+ZRATE_R = EXP(LOG(PARAM_LIMA_MIXED%XGAMINC_BOUND_RDSF_RMAX/PARAM_LIMA_MIXED%XGAMINC_BOUND_RDSF_RMIN)/&
+              FLOAT(PARAM_LIMA_MIXED%NGAMINC-1))
 !
-ALLOCATE( XGAMINC_RDSF_R(NGAMINC) )
+CALL PARAM_LIMA_MIXED_ALLOCATE('XGAMINC_RDSF_R', NGAMINC)
 !
 DO J1 = 1, NGAMINC
-  ZBOUND_RDSF_RMIN = XGAMINC_BOUND_RDSF_RMIN * ZRATE_R**(J1-1)
+  ZBOUND_RDSF_RMIN = PARAM_LIMA_MIXED%XGAMINC_BOUND_RDSF_RMIN * ZRATE_R**(J1-1)
 !
 ! For ZNI_RDSF
   XGAMINC_RDSF_R(J1) = GAMMA_INC(XNUR+((6.0+XDR)/XALPHAR),ZBOUND_RDSF_RMIN)
@@ -1318,24 +1308,24 @@ XLBNRDRYG3  =                          MOMG(XALPHAR,XNUR,2.)
 !
 ! Notice: One magnitude of lambda discretized over 10 points
 !
-NDRYLBDAR = 40
-XDRYLBDAR_MIN = 1.0E3 ! Minimal value of Lbda_r to tabulate XKER_RDRYG
-XDRYLBDAR_MAX = 1.0E7 ! Maximal value of Lbda_r to tabulate XKER_RDRYG
-ZRATE = LOG(XDRYLBDAR_MAX/XDRYLBDAR_MIN)/REAL(NDRYLBDAR-1)
+PARAM_LIMA_MIXED%NDRYLBDAR = 40
+PARAM_LIMA_MIXED%XDRYLBDAR_MIN = 1.0E3 ! Minimal value of Lbda_r to tabulate XKER_RDRYG
+PARAM_LIMA_MIXED%XDRYLBDAR_MAX = 1.0E7 ! Maximal value of Lbda_r to tabulate XKER_RDRYG
+ZRATE = LOG(PARAM_LIMA_MIXED%XDRYLBDAR_MAX/PARAM_LIMA_MIXED%XDRYLBDAR_MIN)/REAL(PARAM_LIMA_MIXED%NDRYLBDAR-1)
 XDRYINTP1R = 1.0 / ZRATE
 XDRYINTP2R = 1.0 - LOG( XDRYLBDAR_MIN ) / ZRATE
-NDRYLBDAS = 80
-XDRYLBDAS_MIN = 5.0E1*XTRANS_MP_GAMMAS ! Minimal value of Lbda_s to tabulate XKER_SDRYG
-XDRYLBDAS_MAX = 5.0E8*XTRANS_MP_GAMMAS ! Maximal value of Lbda_s to tabulate XKER_SDRYG
-ZRATE = LOG(XDRYLBDAS_MAX/XDRYLBDAS_MIN)/REAL(NDRYLBDAS-1)
+PARAM_LIMA_MIXED%NDRYLBDAS = 80
+PARAM_LIMA_MIXED%XDRYLBDAS_MIN = 5.0E1*XTRANS_MP_GAMMAS ! Minimal value of Lbda_s to tabulate XKER_SDRYG
+PARAM_LIMA_MIXED%XDRYLBDAS_MAX = 5.0E8*XTRANS_MP_GAMMAS ! Maximal value of Lbda_s to tabulate XKER_SDRYG
+ZRATE = LOG(PARAM_LIMA_MIXED%XDRYLBDAS_MAX/PARAM_LIMA_MIXED%XDRYLBDAS_MIN)/REAL(PARAM_LIMA_MIXED%NDRYLBDAS-1)
 XDRYINTP1S = 1.0 / ZRATE
 XDRYINTP2S = 1.0 - LOG( XDRYLBDAS_MIN ) / ZRATE
-NDRYLBDAG = 40
-XDRYLBDAG_MIN = 1.0E3 ! Min value of Lbda_g to tabulate XKER_SDRYG,XKER_RDRYG
-XDRYLBDAG_MAX = 1.0E7 ! Max value of Lbda_g to tabulate XKER_SDRYG,XKER_RDRYG
-ZRATE = LOG(XDRYLBDAG_MAX/XDRYLBDAG_MIN)/REAL(NDRYLBDAG-1)
+PARAM_LIMA_MIXED%NDRYLBDAG = 40
+PARAM_LIMA_MIXED%XDRYLBDAG_MIN = 1.0E3 ! Min value of Lbda_g to tabulate XKER_SDRYG,XKER_RDRYG
+PARAM_LIMA_MIXED%XDRYLBDAG_MAX = 1.0E7 ! Max value of Lbda_g to tabulate XKER_SDRYG,XKER_RDRYG
+ZRATE = LOG(PARAM_LIMA_MIXED%XDRYLBDAG_MAX/PARAM_LIMA_MIXED%XDRYLBDAG_MIN)/REAL(PARAM_LIMA_MIXED%NDRYLBDAG-1)
 XDRYINTP1G = 1.0 / ZRATE
-XDRYINTP2G = 1.0 - LOG( XDRYLBDAG_MIN ) / ZRATE
+XDRYINTP2G = 1.0 - LOG( PARAM_LIMA_MIXED%XDRYLBDAG_MIN ) / ZRATE
 !
 !*       8.2.5  Computations of the tabulated normalized kernels
 !
@@ -1343,9 +1333,9 @@ IND      = 50    ! Interval number, collection efficiency and infinite diameter
 ZEGS     = 1.0   ! factor used to integrate the dimensional distributions when
 ZFDINFTY = 20.0  ! computing the kernels XKER_SDRYG
 !
-ALLOCATE( XKER_SDRYG(NDRYLBDAG,NDRYLBDAS) )
+CALL PARAM_LIMA_MIXED_ALLOCATE('XKER_SDRYG', NDRYLBDAG,NDRYLBDAS)
 !if (NMOM_S.GE.2) then
-  ALLOCATE( XKER_N_SDRYG(NDRYLBDAG,NDRYLBDAS) )
+  CALL PARAM_LIMA_MIXED_ALLOCATE('XKER_N_SDRYG', NDRYLBDAG,NDRYLBDAS)
   CALL NZCOLX  ( IND, XALPHAG, XNUG, XALPHAS, XNUS,                         & 
               ZEGS, XCG, XDG, 0., XCS, XDS, XFVELOS,                        & 
               XDRYLBDAG_MAX, XDRYLBDAS_MAX, XDRYLBDAG_MIN, XDRYLBDAS_MIN, & 
@@ -1426,9 +1416,9 @@ IND      = 50    ! Number of interval used to integrate the dimensional
 ZEGR     = 1.0   ! distributions when computing the kernel XKER_RDRYG
 ZFDINFTY = 20.0
 !
-ALLOCATE( XKER_RDRYG(NDRYLBDAG,NDRYLBDAR) )
+CALL PARAM_LIMA_MIXED_ALLOCATE('XKER_RDRYG', NDRYLBDAG,NDRYLBDAR)
 !if ( NMOM_R.GE.2 ) then
-  ALLOCATE( XKER_N_RDRYG(NDRYLBDAG,NDRYLBDAR) ) 
+  CALL PARAM_LIMA_MIXED_ALLOCATE('XKER_N_RDRYG', NDRYLBDAG,NDRYLBDAR)
   CALL NZCOLX  ( IND, XALPHAS, XNUS, XALPHAR, XNUR,                          & 
                ZEGR, XCG, XDG, 0., XCR, XDR, 0.,                            & 
                XDRYLBDAG_MAX, XDRYLBDAR_MAX, XDRYLBDAG_MIN, XDRYLBDAR_MIN, &
@@ -1542,24 +1532,24 @@ XLBNGWETH3  =                          MOMG(XALPHAG,XNUG,2.)
 !
 ! Notice: One magnitude of lambda discretized over 10 points
 !
-NWETLBDAS = 80
-XWETLBDAS_MIN = 5.0E1*XTRANS_MP_GAMMAS ! Minimal value of Lbda_s to tabulate XKER_SWETH
-XWETLBDAS_MAX = 5.0E8*XTRANS_MP_GAMMAS ! Maximal value of Lbda_s to tabulate XKER_SWETH
-ZRATE = LOG(XWETLBDAS_MAX/XWETLBDAS_MIN)/REAL(NWETLBDAS-1)
+PARAM_LIMA_MIXED%NWETLBDAS = 80
+PARAM_LIMA_MIXED%XWETLBDAS_MIN = 5.0E1*XTRANS_MP_GAMMAS ! Minimal value of Lbda_s to tabulate XKER_SWETH
+PARAM_LIMA_MIXED%XWETLBDAS_MAX = 5.0E8*XTRANS_MP_GAMMAS ! Maximal value of Lbda_s to tabulate XKER_SWETH
+ZRATE = LOG(PARAM_LIMA_MIXED%XWETLBDAS_MAX/PARAM_LIMA_MIXED%XWETLBDAS_MIN)/REAL(PARAM_LIMA_MIXED%NWETLBDAS-1)
 XWETINTP1S = 1.0 / ZRATE
-XWETINTP2S = 1.0 - LOG( XWETLBDAS_MIN ) / ZRATE
-NWETLBDAG = 40
-XWETLBDAG_MIN = 1.0E3 ! Min value of Lbda_g to tabulate XKER_GWETH
-XWETLBDAG_MAX = 1.0E7 ! Max value of Lbda_g to tabulate XKER_GWETH
-ZRATE = LOG(XWETLBDAG_MAX/XWETLBDAG_MIN)/REAL(NWETLBDAG-1)
+XWETINTP2S = 1.0 - LOG( PARAM_LIMA_MIXED%XWETLBDAS_MIN ) / ZRATE
+PARAM_LIMA_MIXED%NWETLBDAG = 40
+PARAM_LIMA_MIXED%XWETLBDAG_MIN = 1.0E3 ! Min value of Lbda_g to tabulate XKER_GWETH
+PARAM_LIMA_MIXED%XWETLBDAG_MAX = 1.0E7 ! Max value of Lbda_g to tabulate XKER_GWETH
+ZRATE = LOG(PARAM_LIMA_MIXED%XWETLBDAG_MAX/PARAM_LIMA_MIXED%XWETLBDAG_MIN)/REAL(PARAM_LIMA_MIXED%NWETLBDAG-1)
 XWETINTP1G = 1.0 / ZRATE
 XWETINTP2G = 1.0 - LOG( XWETLBDAG_MIN ) / ZRATE
-NWETLBDAH = 40
-XWETLBDAH_MIN = 1.0E3 ! Min value of Lbda_h to tabulate XKER_SWETH,XKER_GWETH
-XWETLBDAH_MAX = 1.0E7 ! Max value of Lbda_h to tabulate XKER_SWETH,XKER_GWETH
-ZRATE = LOG(XWETLBDAH_MAX/XWETLBDAH_MIN)/REAL(NWETLBDAH-1)
+PARAM_LIMA_MIXED%NWETLBDAH = 40
+PARAM_LIMA_MIXED%XWETLBDAH_MIN = 1.0E3 ! Min value of Lbda_h to tabulate XKER_SWETH,XKER_GWETH
+PARAM_LIMA_MIXED%XWETLBDAH_MAX = 1.0E7 ! Max value of Lbda_h to tabulate XKER_SWETH,XKER_GWETH
+ZRATE = LOG(PARAM_LIMA_MIXED%XWETLBDAH_MAX/PARAM_LIMA_MIXED%XWETLBDAH_MIN)/REAL(PARAM_LIMA_MIXED%NWETLBDAH-1)
 XWETINTP1H = 1.0 / ZRATE
-XWETINTP2H = 1.0 - LOG( XWETLBDAH_MIN ) / ZRATE
+XWETINTP2H = 1.0 - LOG( PARAM_LIMA_MIXED%XWETLBDAH_MIN ) / ZRATE
 !
 !*       9.2.4  Computations of the tabulated normalized kernels
 !
@@ -1568,7 +1558,7 @@ ZEHS     = 1.0   ! factor used to integrate the dimensional distributions when
 ZFDINFTY = 20.0  ! computing the kernels XKER_SWETH
 !
 !if ( NMOM_S.GE.2 ) then
-  IF( .NOT.ALLOCATED(XKER_N_SWETH) ) ALLOCATE( XKER_N_SWETH(NWETLBDAH,NWETLBDAS) )
+  IF( .NOT.ASSOCIATED(XKER_N_SWETH) ) CALL PARAM_LIMA_MIXED_ALLOCATE('XKER_N_SWETH', NWETLBDAH,NWETLBDAS)
   CALL NZCOLX ( IND, XALPHAH, XNUH, XALPHAS, XNUS,                          &  
               ZEHS, XCH, XDH, 0., XCS, XDS, XFVELOS,                       &  ! 
               XWETLBDAH_MAX, XWETLBDAS_MAX, XWETLBDAH_MIN, XWETLBDAS_MIN, &  ! 
@@ -1583,7 +1573,7 @@ ZFDINFTY = 20.0  ! computing the kernels XKER_SWETH
 !!$  END DO                                                                   
 !!$  WRITE(UNIT=ILUOUT0,FMT='("!")') 
 !end  if
-IF( .NOT.ALLOCATED(XKER_SWETH) ) ALLOCATE( XKER_SWETH(NWETLBDAH,NWETLBDAS) )
+IF( .NOT.ASSOCIATED(XKER_SWETH) ) CALL PARAM_LIMA_MIXED_ALLOCATE('XKER_SWETH', NWETLBDAH,NWETLBDAS)
 !
 CALL LIMA_READ_XKER_SWETH (KWETLBDAH,KWETLBDAS,KND,                                    &
                            PALPHAH,PNUH,PALPHAS,PNUS,PEHS,PBS,PCH,PDH,PCS,PDS,PFVELOS, &
@@ -1651,7 +1641,7 @@ ZEHG     = 1.0   ! distributions when computing the kernel XKER_GWETH
 ZFDINFTY = 20.0
 !
 !if ( NMOM_G.GE.2 ) then
-  IF( .NOT.ALLOCATED(XKER_N_GWETH) ) ALLOCATE( XKER_N_GWETH(NWETLBDAH,NWETLBDAG) )
+  IF( .NOT.ASSOCIATED(XKER_N_GWETH) ) CALL PARAM_LIMA_MIXED_ALLOCATE('XKER_N_GWETH', NWETLBDAH,NWETLBDAG)
   CALL NZCOLX ( IND, XALPHAH, XNUH, XALPHAG, XNUG,                          & 
               ZEHG, XCH, XDH, 0., XCG, XDG, 0.,                            & 
               XWETLBDAH_MAX, XWETLBDAG_MAX, XWETLBDAH_MIN, XWETLBDAG_MIN, & 
@@ -1666,7 +1656,7 @@ ZFDINFTY = 20.0
 !!$  END DO                                                                   
 !!$  WRITE(UNIT=ILUOUT0,FMT='("!")') 
 !end if
-IF( .NOT.ALLOCATED(XKER_GWETH) ) ALLOCATE( XKER_GWETH(NWETLBDAH,NWETLBDAG) )
+IF( .NOT.ASSOCIATED(XKER_GWETH) ) CALL PARAM_LIMA_MIXED_ALLOCATE('XKER_GWETH', NWETLBDAH,NWETLBDAG)
 !
 CALL LIMA_READ_XKER_GWETH (KWETLBDAH,KWETLBDAG,KND,                                 &
                            PALPHAH,PNUH,PALPHAG,PNUG,PEHG,PBG,PCH,PDH,PCG,PDG,      &
@@ -1779,3 +1769,5 @@ XFREFFI = 0.5 * ZGAMI(8) * (1.0/XLBI)**XLBEXI
 !------------------------------------------------------------------------------
 !
 END SUBROUTINE INI_LIMA_COLD_MIXED
+!
+END MODULE MODE_INI_LIMA_COLD_MIXED
diff --git a/src/PHYEX/micro/mode_ini_lima_warm.f90 b/src/PHYEX/micro/mode_ini_lima_warm.f90
index 8ae14ed0fe38348f4a761530db6ec43c75b2238d..f3f8d60c1c12bee4bdaac51849dc01d9fa834d22 100644
--- a/src/PHYEX/micro/mode_ini_lima_warm.f90
+++ b/src/PHYEX/micro/mode_ini_lima_warm.f90
@@ -4,20 +4,12 @@
 !MNH_LIC for details. version 1.
 !-----------------------------------------------------------------
 !      #########################
-       MODULE MODI_INI_LIMA_WARM
+       MODULE MODE_INI_LIMA_WARM
 !      #########################
 !
-INTERFACE
-      SUBROUTINE INI_LIMA_WARM (PTSTEP, PDZMIN)
-!
-REAL,                    INTENT(IN) :: PTSTEP    ! Effective Time step 
-REAL,                    INTENT(IN) :: PDZMIN    ! minimun vertical mesh size
-!
-END SUBROUTINE INI_LIMA_WARM
-!
-END INTERFACE
+IMPLICIT NONE
 !
-END MODULE MODI_INI_LIMA_WARM
+CONTAINS
 !     #########################################
       SUBROUTINE INI_LIMA_WARM (PTSTEP, PDZMIN)
 !     #########################################
@@ -46,7 +38,6 @@ END MODULE MODI_INI_LIMA_WARM
 !              ------------
 !
 USE MODD_CST
-USE MODD_REF
 USE MODD_PARAM_LIMA
 USE MODD_PARAM_LIMA_WARM
 USE MODD_PARAMETERS
@@ -76,9 +67,7 @@ REAL, DIMENSION(6)  :: ZGAMC, ZGAMR ! parameters involving various moments of
 REAL :: ZTT                   ! Temperature in Celsius
 REAL :: ZLV                   ! Latent heat of vaporization
 REAL :: ZSS                   ! Supersaturation
-REAL :: ZPSI1, ZG             ! Psi1 and G functions
-REAL :: ZAHENR                ! r_star (FH92)
-REAL :: ZVTRMAX               ! Raindrop maximal fall velocity
+REAL :: ZG                    ! G function
 REAL :: ZRHO00                ! Surface reference air density
 REAL :: ZSURF_TEN             ! Water drop surface tension
 REAL :: ZSMIN, ZSMAX          ! Minimal and maximal supersaturation used to
@@ -92,6 +81,7 @@ REAL :: ZSMIN, ZSMAX          ! Minimal and maximal supersaturation used to
 !  
 !-------------------------------------------------------------------------------
 !
+CALL PARAM_LIMA_WARM_ASSOCIATE()
 !
 !*       1.     CHARACTERISTICS OF THE SPECIES
 !   	        ------------------------------
@@ -249,8 +239,8 @@ XCSTDCRIT = (XPI/6.)*XRHOLW*( (8.0*ZSURF_TEN )/( 3.0*XRV*XRHOLW ) )**3
 !               using a logarithmic scale for S
 !
 NHYP = 500 ! Number of points for the tabulation
-ALLOCATE (XHYPF12( NHYP, NMOD_CCN ))
-ALLOCATE (XHYPF32( NHYP, NMOD_CCN ))
+CALL PARAM_LIMA_WARM_ALLOCATE('XHYPF12', NHYP, NMOD_CCN)
+CALL PARAM_LIMA_WARM_ALLOCATE('XHYPF32', NHYP, NMOD_CCN)
 !
 ZSMIN = 1.0E-5  ! Minimum supersaturation set at 0.001 % 
 ZSMAX = 5.0E-2  ! Maximum supersaturation set at 5 %
@@ -285,11 +275,11 @@ XAHENINTP2 = 0.5*REAL(NAHEN-1) - XTT
 !            Lv
 !            G
 !
-ALLOCATE (XAHENG(NAHEN))
-ALLOCATE (XAHENG2(NAHEN))
-ALLOCATE (XAHENG3(NAHEN))
-ALLOCATE (XPSI1(NAHEN))
-ALLOCATE (XPSI3(NAHEN))
+CALL PARAM_LIMA_WARM_ALLOCATE('XAHENG', NAHEN)
+CALL PARAM_LIMA_WARM_ALLOCATE('XAHENG2', NAHEN)
+CALL PARAM_LIMA_WARM_ALLOCATE('XAHENG3', NAHEN)
+CALL PARAM_LIMA_WARM_ALLOCATE('XPSI1', NAHEN)
+CALL PARAM_LIMA_WARM_ALLOCATE('XPSI3', NAHEN)
 XCSTHEN = 1.0 / ( XRHOLW*2.0*XPI )
 DO J1 = 1,NAHEN
    ZTT = XTT + REAL(J1-(NAHEN-1)/2)                                          ! T
@@ -475,3 +465,5 @@ XCRER = 1.0/ (ZGAMR(6) * XAR**(2.0/3.0))
 !------------------------------------------------------------------------------
 !
 END SUBROUTINE INI_LIMA_WARM
+!
+END MODULE MODE_INI_LIMA_WARM
diff --git a/src/PHYEX/micro/mode_ini_rain_ice.f90 b/src/PHYEX/micro/mode_ini_rain_ice.f90
index 1118b9aaf7e47dd2a7ee37fcbab2dc17f9afbda5..3f4ac2ad27ea2d182de387ad6988eca1dc597547 100644
--- a/src/PHYEX/micro/mode_ini_rain_ice.f90
+++ b/src/PHYEX/micro/mode_ini_rain_ice.f90
@@ -4,6 +4,9 @@
 !MNH_LIC for details. version 1.
 !-----------------------------------------------------------------
 !     ######spl
+MODULE MODE_INI_RAIN_ICE
+IMPLICIT NONE
+CONTAINS
       SUBROUTINE INI_RAIN_ICE ( KLUOUT, PTSTEP, PDZMIN, KSPLITR, HCLOUD )
 !     ###########################################################
 !
@@ -79,6 +82,10 @@
 !!      S. Riette 2016-11: new ICE3/ICE4 options
 !!      P. Wautelet 22/01/2019 bug correction: incorrect write
 !  P. Wautelet 26/04/2019: replace non-standard FLOAT function by REAL function
+!!      S. Riette 2022-03: use of RAIN_ICE_PARAM structure for some variables
+!!                         to reproduce results on belenos. The reason why
+!!                         those variables must have a specifi treatment was
+!!                         not understood
 !  J. Wurtz       03/2022: New snow characteristics with LSNOW_T
 !
 !-------------------------------------------------------------------------------
@@ -87,12 +94,11 @@
 !              ------------
 !
 USE MODD_CST
-USE MODD_LUNIT
-USE MODD_PARAMETERS
-USE MODD_PARAM_ICE
-USE MODD_RAIN_ICE_DESCR
-USE MODD_RAIN_ICE_PARAM
-USE MODD_REF
+USE MODD_PARAM_ICE_n, ONLY: LSNOW_T, CSEDIM, LRED, CPRISTINE_ICE, &
+                        & LCRIAUTI, XACRIAUTI_NAM, XBCRIAUTI_NAM, XCRIAUTC_NAM, XCRIAUTI_NAM, XT0CRIAUTI_NAM, &
+                        & XFRACM90, XFRMIN_NAM, XRDEPGRED_NAM, XRDEPSRED_NAM
+USE MODD_RAIN_ICE_DESCR_n
+USE MODD_RAIN_ICE_PARAM_n
 !
 USE MODI_GAMMA
 USE MODI_GAMMA_INC
@@ -106,8 +112,7 @@ USE MODE_READ_XKER_SWETH, ONLY: READ_XKER_SWETH
 USE MODE_READ_XKER_GWETH, ONLY: READ_XKER_GWETH
 USE MODE_READ_XKER_RWETH, ONLY: READ_XKER_RWETH
 !
-USE PARKIND1, ONLY : JPRB
-USE YOMHOOK , ONLY : LHOOK, DR_HOOK
+USE YOMHOOK , ONLY : LHOOK, DR_HOOK, JPHOOK
 !
 IMPLICIT NONE
 !
@@ -129,8 +134,6 @@ CHARACTER (LEN=4), INTENT(IN)       :: HCLOUD    ! Indicator of the cloud scheme
 !
 !*       0.2   Declarations of local variables :
 !
-INTEGER :: IKB                ! Coordinates of the first physical
-                              ! points along z
 INTEGER :: J1,J2              ! Internal loop indexes
 REAL :: ZT                    ! Work variable
 REAL :: ZVTRMAX               ! Raindrop maximal fall velocity
@@ -147,6 +150,8 @@ INTEGER :: IND                ! Number of interval to integrate the kernels
 REAL :: ZESR                  ! Mean efficiency of rain-aggregate collection
 REAL :: ZFDINFTY              ! Factor used to define the "infinite" diameter
 !
+REAL :: ZCRI0, ZTCRI0         ! Second point to determine 10**(aT+b) law of ri->rs autoconversion
+!
 !
 !
 LOGICAL  :: GFLAG   ! Logical flag for printing the constatnts on the output
@@ -173,12 +178,10 @@ REAL     :: PDRYLBDAR_MAX,PDRYLBDAR_MIN
 REAL     :: PWETLBDAS_MAX,PWETLBDAG_MAX,PWETLBDAS_MIN,PWETLBDAG_MIN
 REAL     :: PWETLBDAR_MAX,PWETLBDAH_MAX,PWETLBDAR_MIN,PWETLBDAH_MIN
 !
-REAL(KIND=JPRB) :: ZHOOK_HANDLE
+REAL(KIND=JPHOOK) :: ZHOOK_HANDLE
 !-------------------------------------------------------------------------------
 IF (LHOOK) CALL DR_HOOK('INI_RAIN_ICE',0,ZHOOK_HANDLE)
 !
-IF(.NOT.ASSOCIATED(XCEXVT)) CALL RAIN_ICE_DESCR_ASSOCIATE()
-IF(.NOT.ASSOCIATED(XFSEDC)) CALL RAIN_ICE_PARAM_ASSOCIATE()
 !
 !
 !*       0.     FUNCTION STATEMENTS
@@ -194,8 +197,8 @@ IF(.NOT.ASSOCIATED(XFSEDC)) CALL RAIN_ICE_PARAM_ASSOCIATE()
 !
 !*       1.1    Set the hailstones maximum fall velocity
 !
-IF (CSEDIM == 'SPLI' .AND. .NOT. LRED ) THEN
- IF (HCLOUD == 'ICE4') THEN
+IF (CSEDIM == 'SPLI' .AND. .NOT. LRED) THEN
+ IF (HCLOUD == 'ICE4' .OR. HCLOUD=='LIMA') THEN
   ZVTRMAX = 40.
  ELSE IF (HCLOUD == 'ICE3') THEN
   ZVTRMAX = 10.
@@ -205,7 +208,7 @@ END IF
 !*       1.2    Compute the number of small time step integration
 !
 KSPLITR = 1
-IF (CSEDIM == 'SPLI' .AND. .NOT. LRED ) THEN
+IF (CSEDIM == 'SPLI' .AND. .NOT. LRED) THEN
  SPLIT : DO
   ZT = PTSTEP / REAL(KSPLITR)
   IF ( ZT * ZVTRMAX / PDZMIN .LT. 1.) EXIT SPLIT
@@ -213,14 +216,7 @@ IF (CSEDIM == 'SPLI' .AND. .NOT. LRED ) THEN
  END DO SPLIT
 END IF
 !
-IF (ASSOCIATED(XRTMIN)) THEN       ! In case of nesting microphysics constants of
-                                  ! MODD_RAIN_ICE_PARAM are computed only once,
-                                  ! but if INI_RAIN_ICE has been called already
-                                  ! one must change the XRTMIN size.
-  CALL RAIN_ICE_DESCR_DEALLOCATE()
-END IF
-!
-IF (HCLOUD == 'ICE4') THEN
+IF (HCLOUD == 'ICE4' .OR. HCLOUD=='LIMA') THEN
   CALL RAIN_ICE_DESCR_ALLOCATE(7)
 ELSE IF (HCLOUD == 'ICE3') THEN
   CALL RAIN_ICE_DESCR_ALLOCATE(6)
@@ -232,7 +228,7 @@ XRTMIN(3) = 1.0E-20
 XRTMIN(4) = 1.0E-20
 XRTMIN(5) = 1.0E-15
 XRTMIN(6) = 1.0E-15
-IF (HCLOUD == 'ICE4') XRTMIN(7) = 1.0E-15
+IF (HCLOUD == 'ICE4' .OR. HCLOUD=='LIMA') XRTMIN(7) = 1.0E-15
 !
 !-------------------------------------------------------------------------------
 !
@@ -424,7 +420,7 @@ XLBR   = ( XAR*XCCR*MOMG(XALPHAR,XNUR,XBR) )**(-XLBEXR)
 XLBEXI = 1.0/(-XBI)
 XLBI   = ( XAI*MOMG(XALPHAI,XNUI,XBI) )**(-XLBEXI)
 !
-#if defined(REPRO48) 
+#ifdef REPRO48
 #else
 XNS   = 1.0/(XAS*MOMG(XALPHAS,XNUS,XBS))
 #endif
@@ -439,11 +435,13 @@ XLBH   = ( XAH*XCCH*MOMG(XALPHAH,XNUH,XBH) )**(-XLBEXH)
 !
 !*       3.5    Minimal values allowed for the mixing ratios
 !
+XLBDAR_MAX = 100000.0
 XLBDAS_MAX = 100000.0
+XLBDAG_MAX = 100000.0
 !
 ZCONC_MAX  = 1.E6 ! Maximal concentration for falling particules set to 1 per cc
 IF(XCCS>0. .AND. XCXS>0. )XLBDAS_MAX = ( ZCONC_MAX/XCCS )**(1./XCXS)
-#if defined(REPRO48) 
+#ifdef REPRO48
 #else
 IF (LSNOW_T) XLBDAS_MAX = 1.E6
 XLBDAS_MIN = 1.E-10
@@ -463,8 +461,7 @@ XCONC_URBAN=5E8 ! 500/cm3
 !
 XCEXVT = 0.4
 !
-IKB = 1 + JPVEXT
-!ZRHO00 = XP00/(XRD*XTHVREFZ(IKB))
+!ZRHO00 = XP00/(XRD*XTHVREFZ(1+JPVEXT))
 !According to Foote and Du Toit (1969) and List (1958), ZRHO00 must be computed for Hu=50%, P=101325Pa and T=293.15K
 ZE = (50./100.) * EXP(XALPW-XBETAW/293.15-XGAMW*LOG(293.15))
 ZRV = (XRD/XRV) * ZE / (101325.-ZE)
@@ -500,7 +497,7 @@ XEXCSEDI =-0.9324*3.0
 WRITE (KLUOUT,FMT=*)' PRISTINE ICE SEDIMENTATION for columns XFSEDI =',XFSEDI
 !
 !
-#if defined(REPRO48) 
+#ifdef REPRO48
 XEXSEDS = (XBS+XDS-XCXS)/(XBS-XCXS)
 XFSEDS  = XCS*XAS*XCCS*MOMG(XALPHAS,XNUS,XBS+XDS)*                         &
          (XAS*XCCS*MOMG(XALPHAS,XNUS,XBS))**(-XEXSEDS)*(ZRHO00)**XCEXVT
@@ -587,24 +584,24 @@ XSCFAC = (0.63**(1./3.))*SQRT((ZRHO00)**XCEXVT) ! One assumes Sc=0.63
 X0DEPI = (4.0*XPI)*XC1I*XF0I*MOMG(XALPHAI,XNUI,1.)
 X2DEPI = (4.0*XPI)*XC1I*XF2I*XC_I*MOMG(XALPHAI,XNUI,XDI+2.0)
 !
-#if defined(REPRO48) 
+#ifdef REPRO48
 X0DEPS = (4.0*XPI)*XCCS*XC1S*XF0S*MOMG(XALPHAS,XNUS,1.)
 X1DEPS = (4.0*XPI)*XCCS*XC1S*XF1S*SQRT(XCS)*MOMG(XALPHAS,XNUS,0.5*XDS+1.5)
 XEX0DEPS = XCXS-1.0
 XEX1DEPS = XCXS-0.5*(XDS+3.0)
-XRDEPSRED = 1.0
 #else
 X0DEPS = XNS*(4.0*XPI)*XC1S*XF0S*MOMG(XALPHAS,XNUS,1.)
 X1DEPS = XNS*(4.0*XPI)*XC1S*XF1S*SQRT(XCS)*MOMG(XALPHAS,XNUS,0.5*XDS+1.5)
 XEX0DEPS = -1.0
 XEX1DEPS = -0.5*(XDS+3.0)
 #endif
+XRDEPSRED = XRDEPSRED_NAM
 !
 X0DEPG = (4.0*XPI)*XCCG*XC1G*XF0G*MOMG(XALPHAG,XNUG,1.)
 X1DEPG = (4.0*XPI)*XCCG*XC1G*XF1G*SQRT(XCG)*MOMG(XALPHAG,XNUG,0.5*XDG+1.5)
 XEX0DEPG = XCXG-1.0
 XEX1DEPG = XCXG-0.5*(XDG+3.0)
-XRDEPGRED = 1.0
+XRDEPGRED = XRDEPGRED_NAM
 !
 X0DEPH = (4.0*XPI)*XCCH*XC1H*XF0H*MOMG(XALPHAH,XNUH,1.)
 X1DEPH = (4.0*XPI)*XCCH*XC1H*XF1H*SQRT(XCH)*MOMG(XALPHAH,XNUH,0.5*XDH+1.5)
@@ -623,13 +620,20 @@ END IF
 !
 XTIMAUTI = 1.E-3  !  Time constant at T=T_t
 XTEXAUTI = 0.015  !  Temperature factor of the I+I collection efficiency
-!!XCRIAUTI = 0.25E-3 !  Critical ice content for the autoconversion to occur
-XCRIAUTI = 0.2E-4 !  Critical ice content for the autoconversion to occur
-                  !  Revised value by Chaboureau et al. (2001)
-XACRIAUTI=0.06
-XBCRIAUTI=-3.5
-XT0CRIAUTI=(LOG10(XCRIAUTI)-XBCRIAUTI)/0.06
-
+XCRIAUTI = XCRIAUTI_NAM
+IF(LCRIAUTI) THEN
+  XT0CRIAUTI = XT0CRIAUTI_NAM
+  !second point to determine 10**(aT+b) law
+  ZTCRI0=-40.0
+  ZCRI0=1.25E-6
+  XBCRIAUTI=-( LOG10(XCRIAUTI) - LOG10(ZCRI0)*XT0CRIAUTI/ZTCRI0 )&
+                   *ZTCRI0/(XT0CRIAUTI-ZTCRI0)
+  XACRIAUTI=(LOG10(ZCRI0)-XBCRIAUTI)/ZTCRI0
+ELSE
+  XACRIAUTI=XACRIAUTI_NAM
+  XBCRIAUTI=XBCRIAUTI_NAM
+  XT0CRIAUTI=(LOG10(XCRIAUTI)-XBCRIAUTI)/0.06
+ENDIF
 !
 GFLAG = .TRUE.
 IF (GFLAG) THEN
@@ -647,7 +651,7 @@ END IF
 !
 XCOLIS   = 0.25 ! Collection efficiency of I+S
 XCOLEXIS = 0.05 ! Temperature factor of the I+S collection efficiency
-#if defined(REPRO48) 
+#ifdef REPRO48
 XFIAGGS  = (XPI/4.0)*XCOLIS*XCCS*XCS*(ZRHO00**XCEXVT)*MOMG(XALPHAS,XNUS,XDS+2.0)
 XEXIAGGS = XCXS-XDS-2.0
 #else
@@ -672,7 +676,7 @@ END IF
 !*       6.1    Constants for the cloud droplets autoconversion
 !
 XTIMAUTC = 1.E-3
-XCRIAUTC = 0.5E-3
+XCRIAUTC = XCRIAUTC_NAM
 !
 GFLAG = .TRUE.
 IF (GFLAG) THEN
@@ -704,7 +708,7 @@ XEX1EVAR = -1.0-0.5*(XDR+3.0)
 !
 XDCSLIM  = 0.007 ! D_cs^lim = 7 mm as suggested by Farley et al. (1989)
 XCOLCS   = 1.0
-#if defined(REPRO48) 
+#ifdef REPRO48
 XEXCRIMSS= XCXS-XDS-2.0
 XCRIMSS  = (XPI/4.0)*XCOLCS*XCCS*XCS*(ZRHO00**XCEXVT)*MOMG(XALPHAS,XNUS,XDS+2.0)
 #else
@@ -713,7 +717,7 @@ XCRIMSS  = XNS * (XPI/4.0)*XCOLCS*XCS*(ZRHO00**XCEXVT)*MOMG(XALPHAS,XNUS,XDS+2.0
 #endif
 XEXCRIMSG= XEXCRIMSS
 XCRIMSG  = XCRIMSS
-#if defined(REPRO48) 
+#ifdef REPRO48
 XSRIMCG  = XCCS*XAS*MOMG(XALPHAS,XNUS,XBS)
 XEXSRIMCG= XCXS-XBS
 XSRIMCG2 = XCCS*XAG*MOMG(XALPHAS,XNUS,XBG)
@@ -734,28 +738,28 @@ IF (GFLAG) THEN
   WRITE(UNIT=KLUOUT,FMT='(" Coll. efficiency          XCOLCS=",E13.6)') XCOLCS
 END IF
 !
-NGAMINC = 80
-XGAMINC_BOUND_MIN = 1.0E-1 ! Minimal value of (Lbda * D_cs^lim)**alpha
-XGAMINC_BOUND_MAX = 1.0E7  ! Maximal value of (Lbda * D_cs^lim)**alpha
-ZRATE = EXP(LOG(XGAMINC_BOUND_MAX/XGAMINC_BOUND_MIN)/REAL(NGAMINC-1))
+RAIN_ICE_PARAMN%NGAMINC = 80
+RAIN_ICE_PARAMN%XGAMINC_BOUND_MIN = 1.0E-1 ! Minimal value of (Lbda * D_cs^lim)**alpha
+RAIN_ICE_PARAMN%XGAMINC_BOUND_MAX = 1.0E7  ! Maximal value of (Lbda * D_cs^lim)**alpha
+ZRATE = EXP(LOG(RAIN_ICE_PARAMN%XGAMINC_BOUND_MAX/RAIN_ICE_PARAMN%XGAMINC_BOUND_MIN)/REAL(RAIN_ICE_PARAMN%NGAMINC-1))
 !
-IF( .NOT.ASSOCIATED(XGAMINC_RIM1) ) CALL RAIN_ICE_PARAM_ALLOCATE('XGAMINC_RIM1', NGAMINC)
-IF( .NOT.ASSOCIATED(XGAMINC_RIM2) ) CALL RAIN_ICE_PARAM_ALLOCATE('XGAMINC_RIM2', NGAMINC)
-IF( .NOT.ASSOCIATED(XGAMINC_RIM4) ) CALL RAIN_ICE_PARAM_ALLOCATE('XGAMINC_RIM4', NGAMINC)
+IF( .NOT.ASSOCIATED(XGAMINC_RIM1) ) CALL RAIN_ICE_PARAM_ALLOCATE('XGAMINC_RIM1', RAIN_ICE_PARAMN%NGAMINC)
+IF( .NOT.ASSOCIATED(XGAMINC_RIM2) ) CALL RAIN_ICE_PARAM_ALLOCATE('XGAMINC_RIM2', RAIN_ICE_PARAMN%NGAMINC)
+IF( .NOT.ASSOCIATED(XGAMINC_RIM4) ) CALL RAIN_ICE_PARAM_ALLOCATE('XGAMINC_RIM4', RAIN_ICE_PARAMN%NGAMINC)
 !
-DO J1=1,NGAMINC
-  ZBOUND = XGAMINC_BOUND_MIN*ZRATE**(J1-1)
+DO J1=1,RAIN_ICE_PARAMN%NGAMINC
+  ZBOUND = RAIN_ICE_PARAMN%XGAMINC_BOUND_MIN*ZRATE**(J1-1)
   XGAMINC_RIM1(J1) = GAMMA_INC(XNUS+(2.0+XDS)/XALPHAS,ZBOUND)
   XGAMINC_RIM2(J1) = GAMMA_INC(XNUS+XBS/XALPHAS      ,ZBOUND)
   XGAMINC_RIM4(J1) = GAMMA_INC(XNUS+XBG/XALPHAS      ,ZBOUND)
 END DO
 !
-XRIMINTP1 = XALPHAS / LOG(ZRATE)
-XRIMINTP2 = 1.0 + XRIMINTP1*LOG( XDCSLIM/(XGAMINC_BOUND_MIN)**(1.0/XALPHAS) )
+RAIN_ICE_PARAMN%XRIMINTP1 = XALPHAS / LOG(ZRATE)
+RAIN_ICE_PARAMN%XRIMINTP2 = 1.0 + RAIN_ICE_PARAMN%XRIMINTP1*LOG( XDCSLIM/(RAIN_ICE_PARAMN%XGAMINC_BOUND_MIN)**(1.0/XALPHAS) )
 !
 !*       7.2    Constants for the accretion of raindrops onto aggregates
 !
-#if defined(REPRO48) 
+#ifdef REPRO48
 XFRACCSS = ((XPI**2)/24.0)*XCCS*XCCR*XRHOLW*(ZRHO00**XCEXVT)
 #else
 XFRACCSS = XNS*((XPI**2)/24.0)*XCCR*XRHOLW*(ZRHO00**XCEXVT)
@@ -765,7 +769,7 @@ XLBRACCS1   =    MOMG(XALPHAS,XNUS,2.)*MOMG(XALPHAR,XNUR,3.)
 XLBRACCS2   = 2.*MOMG(XALPHAS,XNUS,1.)*MOMG(XALPHAR,XNUR,4.)
 XLBRACCS3   =                          MOMG(XALPHAR,XNUR,5.)
 !
-#if defined(REPRO48) 
+#ifdef REPRO48
 XFSACCRG = (XPI/4.0)*XAS*XCCS*XCCR*(ZRHO00**XCEXVT)
 #else
 XFSACCRG = XNS*(XPI/4.0)*XAS*XCCR*(ZRHO00**XCEXVT)
@@ -780,18 +784,18 @@ XLBSACCR3   =                          MOMG(XALPHAS,XNUS,XBS+2.)
 ! Notice: One magnitude of lambda discretized over 10 points for rain
 ! Notice: One magnitude of lambda discretized over 10 points for snow
 !
-NACCLBDAS = 40
-XACCLBDAS_MIN = 5.0E1 ! Minimal value of Lbda_s to tabulate XKER_RACCS
-XACCLBDAS_MAX = 5.0E5 ! Maximal value of Lbda_s to tabulate XKER_RACCS
-ZRATE = LOG(XACCLBDAS_MAX/XACCLBDAS_MIN)/REAL(NACCLBDAS-1)
-XACCINTP1S = 1.0 / ZRATE
-XACCINTP2S = 1.0 - LOG( XACCLBDAS_MIN ) / ZRATE
-NACCLBDAR = 40
-XACCLBDAR_MIN = 1.0E3 ! Minimal value of Lbda_r to tabulate XKER_RACCS
-XACCLBDAR_MAX = 1.0E7 ! Maximal value of Lbda_r to tabulate XKER_RACCS
-ZRATE = LOG(XACCLBDAR_MAX/XACCLBDAR_MIN)/REAL(NACCLBDAR-1)
-XACCINTP1R = 1.0 / ZRATE
-XACCINTP2R = 1.0 - LOG( XACCLBDAR_MIN ) / ZRATE
+RAIN_ICE_PARAMN%NACCLBDAS = 40
+RAIN_ICE_PARAMN%XACCLBDAS_MIN = 5.0E1 ! Minimal value of Lbda_s to tabulate XKER_RACCS
+RAIN_ICE_PARAMN%XACCLBDAS_MAX = 5.0E5 ! Maximal value of Lbda_s to tabulate XKER_RACCS
+ZRATE = LOG(RAIN_ICE_PARAMN%XACCLBDAS_MAX/RAIN_ICE_PARAMN%XACCLBDAS_MIN)/REAL(RAIN_ICE_PARAMN%NACCLBDAS-1)
+RAIN_ICE_PARAMN%XACCINTP1S = 1.0 / ZRATE
+RAIN_ICE_PARAMN%XACCINTP2S = 1.0 - LOG( RAIN_ICE_PARAMN%XACCLBDAS_MIN ) / ZRATE
+RAIN_ICE_PARAMN%NACCLBDAR = 40
+RAIN_ICE_PARAMN%XACCLBDAR_MIN = 1.0E3 ! Minimal value of Lbda_r to tabulate XKER_RACCS
+RAIN_ICE_PARAMN%XACCLBDAR_MAX = 1.0E7 ! Maximal value of Lbda_r to tabulate XKER_RACCS
+ZRATE = LOG(RAIN_ICE_PARAMN%XACCLBDAR_MAX/RAIN_ICE_PARAMN%XACCLBDAR_MIN)/REAL(RAIN_ICE_PARAMN%NACCLBDAR-1)
+RAIN_ICE_PARAMN%XACCINTP1R = 1.0 / ZRATE
+RAIN_ICE_PARAMN%XACCINTP2R = 1.0 - LOG( RAIN_ICE_PARAMN%XACCLBDAR_MIN ) / ZRATE
 !
 !*       7.2.2  Computations of the tabulated normalized kernels
 !
@@ -799,33 +803,36 @@ IND      = 50    ! Interval number, collection efficiency and infinite diameter
 ZESR     = 1.0   ! factor used to integrate the dimensional distributions when
 ZFDINFTY = 20.0  ! computing the kernels XKER_RACCSS, XKER_RACCS and XKER_SACCRG
 !
-IF( .NOT.ASSOCIATED(XKER_RACCSS) ) CALL RAIN_ICE_PARAM_ALLOCATE('XKER_RACCSS', NACCLBDAS,NACCLBDAR)
-IF( .NOT.ASSOCIATED(XKER_RACCS ) ) CALL RAIN_ICE_PARAM_ALLOCATE('XKER_RACCS', NACCLBDAS,NACCLBDAR)
-IF( .NOT.ASSOCIATED(XKER_SACCRG) ) CALL RAIN_ICE_PARAM_ALLOCATE('XKER_SACCRG', NACCLBDAR,NACCLBDAS)
+IF( .NOT.ASSOCIATED(XKER_RACCSS) ) CALL RAIN_ICE_PARAM_ALLOCATE('XKER_RACCSS', RAIN_ICE_PARAMN%NACCLBDAS,RAIN_ICE_PARAMN%NACCLBDAR)
+IF( .NOT.ASSOCIATED(XKER_RACCS ) ) CALL RAIN_ICE_PARAM_ALLOCATE('XKER_RACCS', RAIN_ICE_PARAMN%NACCLBDAS,RAIN_ICE_PARAMN%NACCLBDAR)
+IF( .NOT.ASSOCIATED(XKER_SACCRG) ) CALL RAIN_ICE_PARAM_ALLOCATE('XKER_SACCRG', RAIN_ICE_PARAMN%NACCLBDAR,RAIN_ICE_PARAMN%NACCLBDAS)
 !
 CALL READ_XKER_RACCS (KACCLBDAS,KACCLBDAR,KND,                                        &
                       PALPHAS,PNUS,PALPHAR,PNUR,PESR,PBS,PBR,PCS,PDS,PFVELOS,PCR,PDR, &
                       PACCLBDAS_MAX,PACCLBDAR_MAX,PACCLBDAS_MIN,PACCLBDAR_MIN,        &
                       PFDINFTY                                                        )
-IF( (KACCLBDAS/=NACCLBDAS) .OR. (KACCLBDAR/=NACCLBDAR) .OR. (KND/=IND) .OR. &
+IF( (KACCLBDAS/=RAIN_ICE_PARAMN%NACCLBDAS) .OR. (KACCLBDAR/=RAIN_ICE_PARAMN%NACCLBDAR) .OR. (KND/=IND) .OR. &
     (PALPHAS/=XALPHAS) .OR. (PNUS/=XNUS)                               .OR. &
     (PALPHAR/=XALPHAR) .OR. (PNUR/=XNUR)                               .OR. &
     (PESR/=ZESR) .OR. (PBS/=XBS) .OR. (PBR/=XBR)                       .OR. &
     (PCS/=XCS) .OR. (PDS/=XDS) .OR. (PFVELOS/=XFVELOS) .OR. (PCR/=XCR) .OR. (PDR/=XDR) .OR. &
-    (PACCLBDAS_MAX/=XACCLBDAS_MAX) .OR. (PACCLBDAR_MAX/=XACCLBDAR_MAX) .OR. &
-    (PACCLBDAS_MIN/=XACCLBDAS_MIN) .OR. (PACCLBDAR_MIN/=XACCLBDAR_MIN) .OR. &
+    (PACCLBDAS_MAX/=RAIN_ICE_PARAMN%XACCLBDAS_MAX) .OR. (PACCLBDAR_MAX/=RAIN_ICE_PARAMN%XACCLBDAR_MAX) .OR. &
+    (PACCLBDAS_MIN/=RAIN_ICE_PARAMN%XACCLBDAS_MIN) .OR. (PACCLBDAR_MIN/=RAIN_ICE_PARAMN%XACCLBDAR_MIN) .OR. &
     (PFDINFTY/=ZFDINFTY)                                               ) THEN
   CALL RRCOLSS ( IND, XALPHAS, XNUS, XALPHAR, XNUR,                          &
-                 ZESR, XBR, XCS, XDS, XFVELOS, XCR, XDR,                     & 
-                 XACCLBDAS_MAX, XACCLBDAR_MAX, XACCLBDAS_MIN, XACCLBDAR_MIN, &
+                 ZESR, XBR, XCS, XDS, XFVELOS, XCR, XDR,                     &
+                 RAIN_ICE_PARAMN%XACCLBDAS_MAX, RAIN_ICE_PARAMN%XACCLBDAR_MAX, &
+                 RAIN_ICE_PARAMN%XACCLBDAS_MIN, RAIN_ICE_PARAMN%XACCLBDAR_MIN, &
                  ZFDINFTY, XKER_RACCSS, XAG, XBS, XAS                        )
   CALL RZCOLX  ( IND, XALPHAS, XNUS, XALPHAR, XNUR,                          &
-                 ZESR, XBR, XCS, XDS, XFVELOS, XCR, XDR, 0.,                 & 
-                 XACCLBDAS_MAX, XACCLBDAR_MAX, XACCLBDAS_MIN, XACCLBDAR_MIN, &
+                 ZESR, XBR, XCS, XDS, XFVELOS, XCR, XDR, 0.,                 &
+                 RAIN_ICE_PARAMN%XACCLBDAS_MAX, RAIN_ICE_PARAMN%XACCLBDAR_MAX, &
+                 RAIN_ICE_PARAMN%XACCLBDAS_MIN, RAIN_ICE_PARAMN%XACCLBDAR_MIN, &
                  ZFDINFTY, XKER_RACCS                                        )
   CALL RSCOLRG ( IND, XALPHAS, XNUS, XALPHAR, XNUR,                          &
                  ZESR, XBS, XCS, XDS, XFVELOS, XCR, XDR,                     & 
-                 XACCLBDAS_MAX, XACCLBDAR_MAX, XACCLBDAS_MIN, XACCLBDAR_MIN, &
+                 RAIN_ICE_PARAMN%XACCLBDAS_MAX, RAIN_ICE_PARAMN%XACCLBDAR_MAX, &
+                 RAIN_ICE_PARAMN%XACCLBDAS_MIN, RAIN_ICE_PARAMN%XACCLBDAR_MIN, &
                  ZFDINFTY, XKER_SACCRG,  XAG, XBS, XAS                       )
   WRITE(UNIT=KLUOUT,FMT='("*****************************************")')
   WRITE(UNIT=KLUOUT,FMT='("**** UPDATE NEW SET OF RACSS KERNELS ****")')
@@ -834,8 +841,8 @@ IF( (KACCLBDAS/=NACCLBDAS) .OR. (KACCLBDAR/=NACCLBDAR) .OR. (KND/=IND) .OR. &
   WRITE(UNIT=KLUOUT,FMT='("*****************************************")')
   WRITE(UNIT=KLUOUT,FMT='("!")')
   WRITE(UNIT=KLUOUT,FMT='("KND=",I3)') IND
-  WRITE(UNIT=KLUOUT,FMT='("KACCLBDAS=",I3)') NACCLBDAS
-  WRITE(UNIT=KLUOUT,FMT='("KACCLBDAR=",I3)') NACCLBDAR
+  WRITE(UNIT=KLUOUT,FMT='("KACCLBDAS=",I3)') RAIN_ICE_PARAMN%NACCLBDAS
+  WRITE(UNIT=KLUOUT,FMT='("KACCLBDAR=",I3)') RAIN_ICE_PARAMN%NACCLBDAR
   WRITE(UNIT=KLUOUT,FMT='("PALPHAS=",E13.6)') XALPHAS
   WRITE(UNIT=KLUOUT,FMT='("PNUS=",E13.6)') XNUS
   WRITE(UNIT=KLUOUT,FMT='("PALPHAR=",E13.6)') XALPHAR
@@ -849,18 +856,18 @@ IF( (KACCLBDAS/=NACCLBDAS) .OR. (KACCLBDAR/=NACCLBDAR) .OR. (KND/=IND) .OR. &
   WRITE(UNIT=KLUOUT,FMT='("PCR=",E13.6)') XCR
   WRITE(UNIT=KLUOUT,FMT='("PDR=",E13.6)') XDR
   WRITE(UNIT=KLUOUT,FMT='("PACCLBDAS_MAX=",E13.6)') &
-                                                    XACCLBDAS_MAX
+                                                    RAIN_ICE_PARAMN%XACCLBDAS_MAX
   WRITE(UNIT=KLUOUT,FMT='("PACCLBDAR_MAX=",E13.6)') &
-                                                    XACCLBDAR_MAX
+                                                    RAIN_ICE_PARAMN%XACCLBDAR_MAX
   WRITE(UNIT=KLUOUT,FMT='("PACCLBDAS_MIN=",E13.6)') &
-                                                    XACCLBDAS_MIN
+                                                    RAIN_ICE_PARAMN%XACCLBDAS_MIN
   WRITE(UNIT=KLUOUT,FMT='("PACCLBDAR_MIN=",E13.6)') &
-                                                    XACCLBDAR_MIN
+                                                    RAIN_ICE_PARAMN%XACCLBDAR_MIN
   WRITE(UNIT=KLUOUT,FMT='("PFDINFTY=",E13.6)') ZFDINFTY
   WRITE(UNIT=KLUOUT,FMT='("!")')
   WRITE(UNIT=KLUOUT,FMT='("IF( PRESENT(PKER_RACCSS) ) THEN")')
-  DO J1 = 1 , NACCLBDAS
-    DO J2 = 1 , NACCLBDAR
+  DO J1 = 1 , RAIN_ICE_PARAMN%NACCLBDAS
+    DO J2 = 1 , RAIN_ICE_PARAMN%NACCLBDAR
     WRITE(UNIT=KLUOUT,FMT='("  PKER_RACCSS(",I3,",",I3,") = ",E13.6)') &
                         J1,J2,XKER_RACCSS(J1,J2)
     END DO
@@ -868,8 +875,8 @@ IF( (KACCLBDAS/=NACCLBDAS) .OR. (KACCLBDAR/=NACCLBDAR) .OR. (KND/=IND) .OR. &
   WRITE(UNIT=KLUOUT,FMT='("END IF")')
   WRITE(UNIT=KLUOUT,FMT='("!")')
   WRITE(UNIT=KLUOUT,FMT='("IF( PRESENT(PKER_RACCS ) ) THEN")')
-  DO J1 = 1 , NACCLBDAS
-    DO J2 = 1 , NACCLBDAR
+  DO J1 = 1 , RAIN_ICE_PARAMN%NACCLBDAS
+    DO J2 = 1 , RAIN_ICE_PARAMN%NACCLBDAR
     WRITE(UNIT=KLUOUT,FMT='("  PKER_RACCS (",I3,",",I3,") = ",E13.6)') &
                         J1,J2,XKER_RACCS (J1,J2)
     END DO
@@ -877,8 +884,8 @@ IF( (KACCLBDAS/=NACCLBDAS) .OR. (KACCLBDAR/=NACCLBDAR) .OR. (KND/=IND) .OR. &
   WRITE(UNIT=KLUOUT,FMT='("END IF")')
   WRITE(UNIT=KLUOUT,FMT='("!")')
   WRITE(UNIT=KLUOUT,FMT='("IF( PRESENT(PKER_SACCRG) ) THEN")')
-  DO J1 = 1 , NACCLBDAR
-    DO J2 = 1 , NACCLBDAS
+  DO J1 = 1 , RAIN_ICE_PARAMN%NACCLBDAR
+    DO J2 = 1 , RAIN_ICE_PARAMN%NACCLBDAS
     WRITE(UNIT=KLUOUT,FMT='("  PKER_SACCRG(",I3,",",I3,") = ",E13.6)') &
                         J1,J2,XKER_SACCRG(J1,J2)
     END DO
@@ -962,7 +969,7 @@ XCOLSG   = 0.01 ! Collection efficiency of S+G
 XCOLEXSG = 0.1  ! Temperature factor of the S+G collection efficiency
 WRITE (KLUOUT, FMT=*) ' NEW Constants for the aggregate collection by the graupeln'
 WRITE (KLUOUT, FMT=*) ' XCOLSG, XCOLEXSG  = ',XCOLSG,XCOLEXSG
-#if defined(REPRO48) 
+#ifdef REPRO48
 XFSDRYG = (XPI/4.0)*XCOLSG*XCCG*XCCS*XAS*(ZRHO00**XCEXVT)
 #else
 XFSDRYG = XNS*(XPI/4.0)*XCOLSG*XCCG*XAS*(ZRHO00**XCEXVT)
@@ -989,24 +996,24 @@ XLBRDRYG3   =                          MOMG(XALPHAR,XNUR,5.)
 !
 ! Notice: One magnitude of lambda discretized over 10 points
 !
-NDRYLBDAR = 40
-XDRYLBDAR_MIN = 1.0E3 ! Minimal value of Lbda_r to tabulate XKER_RDRYG
-XDRYLBDAR_MAX = 1.0E7 ! Maximal value of Lbda_r to tabulate XKER_RDRYG
-ZRATE = LOG(XDRYLBDAR_MAX/XDRYLBDAR_MIN)/REAL(NDRYLBDAR-1)
-XDRYINTP1R = 1.0 / ZRATE
-XDRYINTP2R = 1.0 - LOG( XDRYLBDAR_MIN ) / ZRATE
-NDRYLBDAS = 80
-XDRYLBDAS_MIN = 2.5E1 ! Minimal value of Lbda_s to tabulate XKER_SDRYG
-XDRYLBDAS_MAX = 2.5E9 ! Maximal value of Lbda_s to tabulate XKER_SDRYG
-ZRATE = LOG(XDRYLBDAS_MAX/XDRYLBDAS_MIN)/REAL(NDRYLBDAS-1)
-XDRYINTP1S = 1.0 / ZRATE
-XDRYINTP2S = 1.0 - LOG( XDRYLBDAS_MIN ) / ZRATE
-NDRYLBDAG = 40
-XDRYLBDAG_MIN = 1.0E3 ! Min value of Lbda_g to tabulate XKER_SDRYG,XKER_RDRYG
-XDRYLBDAG_MAX = 1.0E7 ! Max value of Lbda_g to tabulate XKER_SDRYG,XKER_RDRYG
-ZRATE = LOG(XDRYLBDAG_MAX/XDRYLBDAG_MIN)/REAL(NDRYLBDAG-1)
-XDRYINTP1G = 1.0 / ZRATE
-XDRYINTP2G = 1.0 - LOG( XDRYLBDAG_MIN ) / ZRATE
+RAIN_ICE_PARAMN%NDRYLBDAR = 40
+RAIN_ICE_PARAMN%XDRYLBDAR_MIN = 1.0E3 ! Minimal value of Lbda_r to tabulate XKER_RDRYG
+RAIN_ICE_PARAMN%XDRYLBDAR_MAX = 1.0E7 ! Maximal value of Lbda_r to tabulate XKER_RDRYG
+ZRATE = LOG(RAIN_ICE_PARAMN%XDRYLBDAR_MAX/RAIN_ICE_PARAMN%XDRYLBDAR_MIN)/REAL(RAIN_ICE_PARAMN%NDRYLBDAR-1)
+RAIN_ICE_PARAMN%XDRYINTP1R = 1.0 / ZRATE
+RAIN_ICE_PARAMN%XDRYINTP2R = 1.0 - LOG( RAIN_ICE_PARAMN%XDRYLBDAR_MIN ) / ZRATE
+RAIN_ICE_PARAMN%NDRYLBDAS = 80
+RAIN_ICE_PARAMN%XDRYLBDAS_MIN = 2.5E1 ! Minimal value of Lbda_s to tabulate XKER_SDRYG
+RAIN_ICE_PARAMN%XDRYLBDAS_MAX = 2.5E9 ! Maximal value of Lbda_s to tabulate XKER_SDRYG
+ZRATE = LOG(RAIN_ICE_PARAMN%XDRYLBDAS_MAX/RAIN_ICE_PARAMN%XDRYLBDAS_MIN)/REAL(RAIN_ICE_PARAMN%NDRYLBDAS-1)
+RAIN_ICE_PARAMN%XDRYINTP1S = 1.0 / ZRATE
+RAIN_ICE_PARAMN%XDRYINTP2S = 1.0 - LOG( RAIN_ICE_PARAMN%XDRYLBDAS_MIN ) / ZRATE
+RAIN_ICE_PARAMN%NDRYLBDAG = 40
+RAIN_ICE_PARAMN%XDRYLBDAG_MIN = 1.0E3 ! Min value of Lbda_g to tabulate XKER_SDRYG,XKER_RDRYG
+RAIN_ICE_PARAMN%XDRYLBDAG_MAX = 1.0E7 ! Max value of Lbda_g to tabulate XKER_SDRYG,XKER_RDRYG
+ZRATE = LOG(RAIN_ICE_PARAMN%XDRYLBDAG_MAX/RAIN_ICE_PARAMN%XDRYLBDAG_MIN)/REAL(RAIN_ICE_PARAMN%NDRYLBDAG-1)
+RAIN_ICE_PARAMN%XDRYINTP1G = 1.0 / ZRATE
+RAIN_ICE_PARAMN%XDRYINTP2G = 1.0 - LOG( RAIN_ICE_PARAMN%XDRYLBDAG_MIN ) / ZRATE
 !
 !*       8.2.5  Computations of the tabulated normalized kernels
 !
@@ -1014,31 +1021,32 @@ IND      = 50    ! Interval number, collection efficiency and infinite diameter
 ZEGS     = 1.0   ! factor used to integrate the dimensional distributions when
 ZFDINFTY = 20.0  ! computing the kernels XKER_SDRYG
 !
-IF( .NOT.ASSOCIATED(XKER_SDRYG) ) CALL RAIN_ICE_PARAM_ALLOCATE('XKER_SDRYG', NDRYLBDAG,NDRYLBDAS)
+IF( .NOT.ASSOCIATED(XKER_SDRYG) ) CALL RAIN_ICE_PARAM_ALLOCATE('XKER_SDRYG', RAIN_ICE_PARAMN%NDRYLBDAG,RAIN_ICE_PARAMN%NDRYLBDAS)
 !
 CALL READ_XKER_SDRYG (KDRYLBDAG,KDRYLBDAS,KND,                              &
                    PALPHAG,PNUG,PALPHAS,PNUS,PEGS,PBS,PCG,PDG,PCS,PDS,PFVELOS, &
                    PDRYLBDAG_MAX,PDRYLBDAS_MAX,PDRYLBDAG_MIN,PDRYLBDAS_MIN, &
                    PFDINFTY                                                 )
-IF( (KDRYLBDAG/=NDRYLBDAG) .OR. (KDRYLBDAS/=NDRYLBDAS) .OR. (KND/=IND) .OR. &
+IF( (KDRYLBDAG/=RAIN_ICE_PARAMN%NDRYLBDAG) .OR. (KDRYLBDAS/=RAIN_ICE_PARAMN%NDRYLBDAS) .OR. (KND/=IND) .OR. &
     (PALPHAG/=XALPHAG) .OR. (PNUG/=XNUG)                               .OR. &
     (PALPHAS/=XALPHAS) .OR. (PNUS/=XNUS)                               .OR. &
     (PEGS/=ZEGS) .OR. (PBS/=XBS)                                       .OR. &
     (PCG/=XCG) .OR. (PDG/=XDG) .OR. (PCS/=XCS) .OR. (PDS/=XDS) .OR. (PFVELOS/=XFVELOS) .OR. &
-    (PDRYLBDAG_MAX/=XDRYLBDAG_MAX) .OR. (PDRYLBDAS_MAX/=XDRYLBDAS_MAX) .OR. &
-    (PDRYLBDAG_MIN/=XDRYLBDAG_MIN) .OR. (PDRYLBDAS_MIN/=XDRYLBDAS_MIN) .OR. &
+    (PDRYLBDAG_MAX/=RAIN_ICE_PARAMN%XDRYLBDAG_MAX) .OR. (PDRYLBDAS_MAX/=RAIN_ICE_PARAMN%XDRYLBDAS_MAX) .OR. &
+    (PDRYLBDAG_MIN/=RAIN_ICE_PARAMN%XDRYLBDAG_MIN) .OR. (PDRYLBDAS_MIN/=RAIN_ICE_PARAMN%XDRYLBDAS_MIN) .OR. &
     (PFDINFTY/=ZFDINFTY)                                               ) THEN
   CALL RZCOLX ( IND, XALPHAG, XNUG, XALPHAS, XNUS,                          &
                 ZEGS, XBS, XCG, XDG, 0., XCS, XDS, XFVELOS,                 &
-                XDRYLBDAG_MAX, XDRYLBDAS_MAX, XDRYLBDAG_MIN, XDRYLBDAS_MIN, &
+                RAIN_ICE_PARAMN%XDRYLBDAG_MAX, RAIN_ICE_PARAMN%XDRYLBDAS_MAX, &
+                RAIN_ICE_PARAMN%XDRYLBDAG_MIN, RAIN_ICE_PARAMN%XDRYLBDAS_MIN, &
                 ZFDINFTY, XKER_SDRYG                                        )
   WRITE(UNIT=KLUOUT,FMT='("*****************************************")')
   WRITE(UNIT=KLUOUT,FMT='("**** UPDATE NEW SET OF SDRYG KERNELS ****")')
   WRITE(UNIT=KLUOUT,FMT='("*****************************************")')
   WRITE(UNIT=KLUOUT,FMT='("!")')
   WRITE(UNIT=KLUOUT,FMT='("KND=",I3)') IND
-  WRITE(UNIT=KLUOUT,FMT='("KDRYLBDAG=",I3)') NDRYLBDAG
-  WRITE(UNIT=KLUOUT,FMT='("KDRYLBDAS=",I3)') NDRYLBDAS
+  WRITE(UNIT=KLUOUT,FMT='("KDRYLBDAG=",I3)') RAIN_ICE_PARAMN%NDRYLBDAG
+  WRITE(UNIT=KLUOUT,FMT='("KDRYLBDAS=",I3)') RAIN_ICE_PARAMN%NDRYLBDAS
   WRITE(UNIT=KLUOUT,FMT='("PALPHAG=",E13.6)') XALPHAG
   WRITE(UNIT=KLUOUT,FMT='("PNUG=",E13.6)') XNUG
   WRITE(UNIT=KLUOUT,FMT='("PALPHAS=",E13.6)') XALPHAS
@@ -1051,18 +1059,18 @@ IF( (KDRYLBDAG/=NDRYLBDAG) .OR. (KDRYLBDAS/=NDRYLBDAS) .OR. (KND/=IND) .OR. &
   WRITE(UNIT=KLUOUT,FMT='("PDS=",E13.6)') XDS
   WRITE(UNIT=KLUOUT,FMT='("PFVELOS=",E13.6)') XFVELOS
   WRITE(UNIT=KLUOUT,FMT='("PDRYLBDAG_MAX=",E13.6)') &
-                                                    XDRYLBDAG_MAX
+                                                    RAIN_ICE_PARAMN%XDRYLBDAG_MAX
   WRITE(UNIT=KLUOUT,FMT='("PDRYLBDAS_MAX=",E13.6)') &
-                                                    XDRYLBDAS_MAX
+                                                    RAIN_ICE_PARAMN%XDRYLBDAS_MAX
   WRITE(UNIT=KLUOUT,FMT='("PDRYLBDAG_MIN=",E13.6)') &
-                                                    XDRYLBDAG_MIN
+                                                    RAIN_ICE_PARAMN%XDRYLBDAG_MIN
   WRITE(UNIT=KLUOUT,FMT='("PDRYLBDAS_MIN=",E13.6)') &
-                                                    XDRYLBDAS_MIN
+                                                    RAIN_ICE_PARAMN%XDRYLBDAS_MIN
   WRITE(UNIT=KLUOUT,FMT='("PFDINFTY=",E13.6)') ZFDINFTY
   WRITE(UNIT=KLUOUT,FMT='("!")')
   WRITE(UNIT=KLUOUT,FMT='("IF( PRESENT(PKER_SDRYG) ) THEN")')
-  DO J1 = 1 , NDRYLBDAG
-    DO J2 = 1 , NDRYLBDAS
+  DO J1 = 1 , RAIN_ICE_PARAMN%NDRYLBDAG
+    DO J2 = 1 , RAIN_ICE_PARAMN%NDRYLBDAS
     WRITE(UNIT=KLUOUT,FMT='("PKER_SDRYG(",I3,",",I3,") = ",E13.6)') &
                         J1,J2,XKER_SDRYG(J1,J2)
     END DO
@@ -1081,31 +1089,32 @@ IND      = 50    ! Number of interval used to integrate the dimensional
 ZEGR     = 1.0   ! distributions when computing the kernel XKER_RDRYG
 ZFDINFTY = 20.0
 !
-IF( .NOT.ASSOCIATED(XKER_RDRYG) ) CALL RAIN_ICE_PARAM_ALLOCATE('XKER_RDRYG', NDRYLBDAG,NDRYLBDAR)
+IF( .NOT.ASSOCIATED(XKER_RDRYG) ) CALL RAIN_ICE_PARAM_ALLOCATE('XKER_RDRYG', RAIN_ICE_PARAMN%NDRYLBDAG,RAIN_ICE_PARAMN%NDRYLBDAR)
 !
 CALL READ_XKER_RDRYG (KDRYLBDAG,KDRYLBDAR,KND,                              &
                    PALPHAG,PNUG,PALPHAR,PNUR,PEGR,PBR,PCG,PDG,PCR,PDR,      &
                    PDRYLBDAG_MAX,PDRYLBDAR_MAX,PDRYLBDAG_MIN,PDRYLBDAR_MIN, &
                    PFDINFTY                                                 )
-IF( (KDRYLBDAG/=NDRYLBDAG) .OR. (KDRYLBDAR/=NDRYLBDAR) .OR. (KND/=IND) .OR. &
+IF( (KDRYLBDAG/=RAIN_ICE_PARAMN%NDRYLBDAG) .OR. (KDRYLBDAR/=RAIN_ICE_PARAMN%NDRYLBDAR) .OR. (KND/=IND) .OR. &
     (PALPHAG/=XALPHAG) .OR. (PNUG/=XNUG)                               .OR. &
     (PALPHAR/=XALPHAR) .OR. (PNUR/=XNUR)                               .OR. &
     (PEGR/=ZEGR) .OR. (PBR/=XBR)                                       .OR. &
     (PCG/=XCG) .OR. (PDG/=XDG) .OR. (PCR/=XCR) .OR. (PDR/=XDR)         .OR. &
-    (PDRYLBDAG_MAX/=XDRYLBDAG_MAX) .OR. (PDRYLBDAR_MAX/=XDRYLBDAR_MAX) .OR. &
-    (PDRYLBDAG_MIN/=XDRYLBDAG_MIN) .OR. (PDRYLBDAR_MIN/=XDRYLBDAR_MIN) .OR. &
+    (PDRYLBDAG_MAX/=RAIN_ICE_PARAMN%XDRYLBDAG_MAX) .OR. (PDRYLBDAR_MAX/=RAIN_ICE_PARAMN%XDRYLBDAR_MAX) .OR. &
+    (PDRYLBDAG_MIN/=RAIN_ICE_PARAMN%XDRYLBDAG_MIN) .OR. (PDRYLBDAR_MIN/=RAIN_ICE_PARAMN%XDRYLBDAR_MIN) .OR. &
     (PFDINFTY/=ZFDINFTY)                                               ) THEN
   CALL RZCOLX ( IND, XALPHAG, XNUG, XALPHAR, XNUR,                          &
                 ZEGR, XBR, XCG, XDG, 0., XCR, XDR, 0.,                      &
-                XDRYLBDAG_MAX, XDRYLBDAR_MAX, XDRYLBDAG_MIN, XDRYLBDAR_MIN, &
+                RAIN_ICE_PARAMN%XDRYLBDAG_MAX, RAIN_ICE_PARAMN%XDRYLBDAR_MAX, &
+                RAIN_ICE_PARAMN%XDRYLBDAG_MIN, RAIN_ICE_PARAMN%XDRYLBDAR_MIN, &
                 ZFDINFTY, XKER_RDRYG                                        )
   WRITE(UNIT=KLUOUT,FMT='("*****************************************")')
   WRITE(UNIT=KLUOUT,FMT='("**** UPDATE NEW SET OF RDRYG KERNELS ****")')
   WRITE(UNIT=KLUOUT,FMT='("*****************************************")')
   WRITE(UNIT=KLUOUT,FMT='("!")')
   WRITE(UNIT=KLUOUT,FMT='("KND=",I3)') IND
-  WRITE(UNIT=KLUOUT,FMT='("KDRYLBDAG=",I3)') NDRYLBDAG
-  WRITE(UNIT=KLUOUT,FMT='("KDRYLBDAR=",I3)') NDRYLBDAR
+  WRITE(UNIT=KLUOUT,FMT='("KDRYLBDAG=",I3)') RAIN_ICE_PARAMN%NDRYLBDAG
+  WRITE(UNIT=KLUOUT,FMT='("KDRYLBDAR=",I3)') RAIN_ICE_PARAMN%NDRYLBDAR
   WRITE(UNIT=KLUOUT,FMT='("PALPHAG=",E13.6)') XALPHAG
   WRITE(UNIT=KLUOUT,FMT='("PNUG=",E13.6)') XNUG
   WRITE(UNIT=KLUOUT,FMT='("PALPHAR=",E13.6)') XALPHAR
@@ -1117,18 +1126,18 @@ IF( (KDRYLBDAG/=NDRYLBDAG) .OR. (KDRYLBDAR/=NDRYLBDAR) .OR. (KND/=IND) .OR. &
   WRITE(UNIT=KLUOUT,FMT='("PCR=",E13.6)') XCR
   WRITE(UNIT=KLUOUT,FMT='("PDR=",E13.6)') XDR
   WRITE(UNIT=KLUOUT,FMT='("PDRYLBDAG_MAX=",E13.6)') &
-                                                    XDRYLBDAG_MAX
+                                                    RAIN_ICE_PARAMN%XDRYLBDAG_MAX
   WRITE(UNIT=KLUOUT,FMT='("PDRYLBDAR_MAX=",E13.6)') &
-                                                    XDRYLBDAR_MAX
+                                                    RAIN_ICE_PARAMN%XDRYLBDAR_MAX
   WRITE(UNIT=KLUOUT,FMT='("PDRYLBDAG_MIN=",E13.6)') &
-                                                    XDRYLBDAG_MIN
+                                                    RAIN_ICE_PARAMN%XDRYLBDAG_MIN
   WRITE(UNIT=KLUOUT,FMT='("PDRYLBDAR_MIN=",E13.6)') &
-                                                    XDRYLBDAR_MIN
+                                                    RAIN_ICE_PARAMN%XDRYLBDAR_MIN
   WRITE(UNIT=KLUOUT,FMT='("PFDINFTY=",E13.6)') ZFDINFTY
   WRITE(UNIT=KLUOUT,FMT='("!")')
   WRITE(UNIT=KLUOUT,FMT='("IF( PRESENT(PKER_RDRYG) ) THEN")')
-  DO J1 = 1 , NDRYLBDAG
-    DO J2 = 1 , NDRYLBDAR
+  DO J1 = 1 , RAIN_ICE_PARAMN%NDRYLBDAG
+    DO J2 = 1 , RAIN_ICE_PARAMN%NDRYLBDAR
     WRITE(UNIT=KLUOUT,FMT='("PKER_RDRYG(",I3,",",I3,") = ",E13.6)') &
                         J1,J2,XKER_RDRYG(J1,J2)
     END DO
@@ -1145,22 +1154,7 @@ END IF
 !          8.2.6 Constants for possible modifying some processes related to 
 !                graupeln in XFRMIN(1:8),  IN - concentration in XFRMIN(9) and Kogan 
 !                autoconversion in XFRMIN(10:11). May be used for e.g. ensemble spread
-  XFRMIN(1:6)=0.
-  XFRMIN(7:9)=1.
-  XFRMIN(10) =10.
-  XFRMIN(11) =1.
-  XFRMIN(12) =100. !0 in suparar
-  XFRMIN(13) =1.0E-15
-  XFRMIN(14) =120.
-  XFRMIN(15) =1.0E-4
-  XFRMIN(16:20)=0.
-  XFRMIN(21:22)=1.
-  XFRMIN(23)=0.5
-  XFRMIN(24)=1.5
-  XFRMIN(25)=30.
-  XFRMIN(26:38)=0.
-  XFRMIN(39)=0.25
-  XFRMIN(40)=0.15
+  XFRMIN=XFRMIN_NAM
 !
 !
 !-------------------------------------------------------------------------------
@@ -1182,7 +1176,7 @@ XFWETH = (XPI/4.0)*XCCH*XCH*(ZRHO00**XCEXVT)*MOMG(XALPHAH,XNUH,XDH+2.0)
 !
 XCOLSH   = 0.01 ! Collection efficiency of S+H
 XCOLEXSH = 0.1  ! Temperature factor of the S+H collection efficiency
-#if defined(REPRO48) 
+#ifdef REPRO48
 XFSWETH = (XPI/4.0)*XCCH*XCCS*XAS*(ZRHO00**XCEXVT)
 #else
 XFSWETH = XNS*(XPI/4.0)*XCCH*XAS*(ZRHO00**XCEXVT) ! Wurtz
@@ -1212,30 +1206,30 @@ XLBRWETH3   =                          MOMG(XALPHAR,XNUR,XBR+2.)
 !
 ! Notice: One magnitude of lambda discretized over 10 points
 !
-NWETLBDAS = 80
-XWETLBDAS_MIN = 2.5E1 ! Minimal value of Lbda_s to tabulate XKER_SWETH
-XWETLBDAS_MAX = 2.5E9 ! Maximal value of Lbda_s to tabulate XKER_SWETH
-ZRATE = LOG(XWETLBDAS_MAX/XWETLBDAS_MIN)/REAL(NWETLBDAS-1)
-XWETINTP1S = 1.0 / ZRATE
-XWETINTP2S = 1.0 - LOG( XWETLBDAS_MIN ) / ZRATE
-NWETLBDAG = 40
-XWETLBDAG_MIN = 1.0E3 ! Min value of Lbda_g to tabulate XKER_GWETH
-XWETLBDAG_MAX = 1.0E7 ! Max value of Lbda_g to tabulate XKER_GWETH
-ZRATE = LOG(XWETLBDAG_MAX/XWETLBDAG_MIN)/REAL(NWETLBDAG-1)
-XWETINTP1G = 1.0 / ZRATE
-XWETINTP2G = 1.0 - LOG( XWETLBDAG_MIN ) / ZRATE
-NWETLBDAR = 40
-XWETLBDAR_MIN = 1.0E3 ! Minimal value of Lbda_r to tabulate XKER_RWETH
-XWETLBDAR_MAX = 1.0E7 ! Maximal value of Lbda_r to tabulate XKER_RWETH
-ZRATE = LOG(XWETLBDAR_MAX/XWETLBDAR_MIN)/REAL(NWETLBDAR-1)
-XWETINTP1R = 1.0 / ZRATE
-XWETINTP2R = 1.0 - LOG( XWETLBDAR_MIN ) / ZRATE
-NWETLBDAH = 40
-XWETLBDAH_MIN = 1.0E3 ! Min value of Lbda_h to tabulate XKER_SWETH,XKER_GWETH,XKER_RWETH
-XWETLBDAH_MAX = 1.0E7 ! Max value of Lbda_h to tabulate XKER_SWETH,XKER_GWETH,XKER_RWETH
-ZRATE = LOG(XWETLBDAH_MAX/XWETLBDAH_MIN)/REAL(NWETLBDAH-1)
-XWETINTP1H = 1.0 / ZRATE
-XWETINTP2H = 1.0 - LOG( XWETLBDAH_MIN ) / ZRATE
+RAIN_ICE_PARAMN%NWETLBDAS = 80
+RAIN_ICE_PARAMN%XWETLBDAS_MIN = 2.5E1 ! Minimal value of Lbda_s to tabulate XKER_SWETH
+RAIN_ICE_PARAMN%XWETLBDAS_MAX = 2.5E9 ! Maximal value of Lbda_s to tabulate XKER_SWETH
+ZRATE = LOG(RAIN_ICE_PARAMN%XWETLBDAS_MAX/RAIN_ICE_PARAMN%XWETLBDAS_MIN)/REAL(RAIN_ICE_PARAMN%NWETLBDAS-1)
+RAIN_ICE_PARAMN%XWETINTP1S = 1.0 / ZRATE
+RAIN_ICE_PARAMN%XWETINTP2S = 1.0 - LOG( RAIN_ICE_PARAMN%XWETLBDAS_MIN ) / ZRATE
+RAIN_ICE_PARAMN%NWETLBDAG = 40
+RAIN_ICE_PARAMN%XWETLBDAG_MIN = 1.0E3 ! Min value of Lbda_g to tabulate XKER_GWETH
+RAIN_ICE_PARAMN%XWETLBDAG_MAX = 1.0E7 ! Max value of Lbda_g to tabulate XKER_GWETH
+ZRATE = LOG(RAIN_ICE_PARAMN%XWETLBDAG_MAX/RAIN_ICE_PARAMN%XWETLBDAG_MIN)/REAL(RAIN_ICE_PARAMN%NWETLBDAG-1)
+RAIN_ICE_PARAMN%XWETINTP1G = 1.0 / ZRATE
+RAIN_ICE_PARAMN%XWETINTP2G = 1.0 - LOG( RAIN_ICE_PARAMN%XWETLBDAG_MIN ) / ZRATE
+RAIN_ICE_PARAMN%NWETLBDAR = 40
+RAIN_ICE_PARAMN%XWETLBDAR_MIN = 1.0E3 ! Minimal value of Lbda_r to tabulate XKER_RWETH
+RAIN_ICE_PARAMN%XWETLBDAR_MAX = 1.0E7 ! Maximal value of Lbda_r to tabulate XKER_RWETH
+ZRATE = LOG(RAIN_ICE_PARAMN%XWETLBDAR_MAX/RAIN_ICE_PARAMN%XWETLBDAR_MIN)/REAL(RAIN_ICE_PARAMN%NWETLBDAR-1)
+RAIN_ICE_PARAMN%XWETINTP1R = 1.0 / ZRATE
+RAIN_ICE_PARAMN%XWETINTP2R = 1.0 - LOG( RAIN_ICE_PARAMN%XWETLBDAR_MIN ) / ZRATE
+RAIN_ICE_PARAMN%NWETLBDAH = 40
+RAIN_ICE_PARAMN%XWETLBDAH_MIN = 1.0E3 ! Min value of Lbda_h to tabulate XKER_SWETH,XKER_GWETH,XKER_RWETH
+RAIN_ICE_PARAMN%XWETLBDAH_MAX = 1.0E7 ! Max value of Lbda_h to tabulate XKER_SWETH,XKER_GWETH,XKER_RWETH
+ZRATE = LOG(RAIN_ICE_PARAMN%XWETLBDAH_MAX/RAIN_ICE_PARAMN%XWETLBDAH_MIN)/REAL(RAIN_ICE_PARAMN%NWETLBDAH-1)
+RAIN_ICE_PARAMN%XWETINTP1H = 1.0 / ZRATE
+RAIN_ICE_PARAMN%XWETINTP2H = 1.0 - LOG( RAIN_ICE_PARAMN%XWETLBDAH_MIN ) / ZRATE
 !
 !*       9.2.4  Computations of the tabulated normalized kernels
 !
@@ -1243,31 +1237,32 @@ IND      = 50    ! Interval number, collection efficiency and infinite diameter
 ZEHS     = 1.0   ! factor used to integrate the dimensional distributions when
 ZFDINFTY = 20.0  ! computing the kernels XKER_SWETH
 !
-IF( .NOT.ASSOCIATED(XKER_SWETH) ) CALL RAIN_ICE_PARAM_ALLOCATE('XKER_SWETH', NWETLBDAH,NWETLBDAS)
+IF( .NOT.ASSOCIATED(XKER_SWETH) ) CALL RAIN_ICE_PARAM_ALLOCATE('XKER_SWETH', RAIN_ICE_PARAMN%NWETLBDAH,RAIN_ICE_PARAMN%NWETLBDAS)
 !
 CALL READ_XKER_SWETH (KWETLBDAH,KWETLBDAS,KND,                              &
                    PALPHAH,PNUH,PALPHAS,PNUS,PEHS,PBS,PCH,PDH,PCS,PDS,PFVELOS, &
                    PWETLBDAH_MAX,PWETLBDAS_MAX,PWETLBDAH_MIN,PWETLBDAS_MIN, &
                    PFDINFTY                                                 )
-IF( (KWETLBDAH/=NWETLBDAH) .OR. (KWETLBDAS/=NWETLBDAS) .OR. (KND/=IND) .OR. &
+IF( (KWETLBDAH/=RAIN_ICE_PARAMN%NWETLBDAH) .OR. (KWETLBDAS/=RAIN_ICE_PARAMN%NWETLBDAS) .OR. (KND/=IND) .OR. &
     (PALPHAH/=XALPHAH) .OR. (PNUH/=XNUH)                               .OR. &
     (PALPHAS/=XALPHAS) .OR. (PNUS/=XNUS)                               .OR. &
     (PEHS/=ZEHS) .OR. (PBS/=XBS)                                       .OR. &
     (PCH/=XCH) .OR. (PDH/=XDH) .OR. (PCS/=XCS) .OR. (PDS/=XDS) .OR. (PFVELOS/=XFVELOS) .OR. &
-    (PWETLBDAH_MAX/=XWETLBDAH_MAX) .OR. (PWETLBDAS_MAX/=XWETLBDAS_MAX) .OR. &
-    (PWETLBDAH_MIN/=XWETLBDAH_MIN) .OR. (PWETLBDAS_MIN/=XWETLBDAS_MIN) .OR. &
+    (PWETLBDAH_MAX/=RAIN_ICE_PARAMN%XWETLBDAH_MAX) .OR. (PWETLBDAS_MAX/=RAIN_ICE_PARAMN%XWETLBDAS_MAX) .OR. &
+    (PWETLBDAH_MIN/=RAIN_ICE_PARAMN%XWETLBDAH_MIN) .OR. (PWETLBDAS_MIN/=RAIN_ICE_PARAMN%XWETLBDAS_MIN) .OR. &
     (PFDINFTY/=ZFDINFTY)                                               ) THEN
   CALL RZCOLX ( IND, XALPHAH, XNUH, XALPHAS, XNUS,                          &
                 ZEHS, XBS, XCH, XDH, 0., XCS, XDS, XFVELOS,                 &
-                XWETLBDAH_MAX, XWETLBDAS_MAX, XWETLBDAH_MIN, XWETLBDAS_MIN, &
+                RAIN_ICE_PARAMN%XWETLBDAH_MAX, RAIN_ICE_PARAMN%XWETLBDAS_MAX, &
+                RAIN_ICE_PARAMN%XWETLBDAH_MIN, RAIN_ICE_PARAMN%XWETLBDAS_MIN, &
                 ZFDINFTY, XKER_SWETH                                        )
   WRITE(UNIT=KLUOUT,FMT='("*****************************************")')
   WRITE(UNIT=KLUOUT,FMT='("**** UPDATE NEW SET OF SWETH KERNELS ****")')
   WRITE(UNIT=KLUOUT,FMT='("*****************************************")')
   WRITE(UNIT=KLUOUT,FMT='("!")')
   WRITE(UNIT=KLUOUT,FMT='("KND=",I3)') IND
-  WRITE(UNIT=KLUOUT,FMT='("KWETLBDAH=",I3)') NWETLBDAH
-  WRITE(UNIT=KLUOUT,FMT='("KWETLBDAS=",I3)') NWETLBDAS
+  WRITE(UNIT=KLUOUT,FMT='("KWETLBDAH=",I3)') RAIN_ICE_PARAMN%NWETLBDAH
+  WRITE(UNIT=KLUOUT,FMT='("KWETLBDAS=",I3)') RAIN_ICE_PARAMN%NWETLBDAS
   WRITE(UNIT=KLUOUT,FMT='("PALPHAH=",E13.6)') XALPHAH
   WRITE(UNIT=KLUOUT,FMT='("PNUH=",E13.6)') XNUH
   WRITE(UNIT=KLUOUT,FMT='("PALPHAS=",E13.6)') XALPHAS
@@ -1280,18 +1275,18 @@ IF( (KWETLBDAH/=NWETLBDAH) .OR. (KWETLBDAS/=NWETLBDAS) .OR. (KND/=IND) .OR. &
   WRITE(UNIT=KLUOUT,FMT='("PDS=",E13.6)') XDS
   WRITE(UNIT=KLUOUT,FMT='("PFVELOS=",E13.6)') XFVELOS
   WRITE(UNIT=KLUOUT,FMT='("PWETLBDAH_MAX=",E13.6)') &
-                                                    XWETLBDAH_MAX
+                                                    RAIN_ICE_PARAMN%XWETLBDAH_MAX
   WRITE(UNIT=KLUOUT,FMT='("PWETLBDAS_MAX=",E13.6)') &
-                                                    XWETLBDAS_MAX
+                                                    RAIN_ICE_PARAMN%XWETLBDAS_MAX
   WRITE(UNIT=KLUOUT,FMT='("PWETLBDAH_MIN=",E13.6)') &
-                                                    XWETLBDAH_MIN
+                                                    RAIN_ICE_PARAMN%XWETLBDAH_MIN
   WRITE(UNIT=KLUOUT,FMT='("PWETLBDAS_MIN=",E13.6)') &
-                                                    XWETLBDAS_MIN
+                                                    RAIN_ICE_PARAMN%XWETLBDAS_MIN
   WRITE(UNIT=KLUOUT,FMT='("PFDINFTY=",E13.6)') ZFDINFTY
   WRITE(UNIT=KLUOUT,FMT='("!")')
   WRITE(UNIT=KLUOUT,FMT='("IF( PRESENT(PKER_SWETH) ) THEN")')
-  DO J1 = 1 , NWETLBDAH
-    DO J2 = 1 , NWETLBDAS
+  DO J1 = 1 , RAIN_ICE_PARAMN%NWETLBDAH
+    DO J2 = 1 , RAIN_ICE_PARAMN%NWETLBDAS
     WRITE(UNIT=KLUOUT,FMT='("PKER_SWETH(",I3,",",I3,") = ",E13.6)') &
                         J1,J2,XKER_SWETH(J1,J2)
     END DO
@@ -1310,31 +1305,32 @@ IND      = 50    ! Number of interval used to integrate the dimensional
 ZEHG     = 1.0   ! distributions when computing the kernel XKER_GWETH
 ZFDINFTY = 20.0
 !
-IF( .NOT.ASSOCIATED(XKER_GWETH) ) CALL RAIN_ICE_PARAM_ALLOCATE('XKER_GWETH', NWETLBDAH,NWETLBDAG)
+IF( .NOT.ASSOCIATED(XKER_GWETH) ) CALL RAIN_ICE_PARAM_ALLOCATE('XKER_GWETH', RAIN_ICE_PARAMN%NWETLBDAH,RAIN_ICE_PARAMN%NWETLBDAG)
 !
 CALL READ_XKER_GWETH (KWETLBDAH,KWETLBDAG,KND,                              &
                    PALPHAH,PNUH,PALPHAG,PNUG,PEHG,PBG,PCH,PDH,PCG,PDG,      &
                    PWETLBDAH_MAX,PWETLBDAG_MAX,PWETLBDAH_MIN,PWETLBDAG_MIN, &
                    PFDINFTY                                                 )
-IF( (KWETLBDAH/=NWETLBDAH) .OR. (KWETLBDAG/=NWETLBDAG) .OR. (KND/=IND) .OR. &
+IF( (KWETLBDAH/=RAIN_ICE_PARAMN%NWETLBDAH) .OR. (KWETLBDAG/=RAIN_ICE_PARAMN%NWETLBDAG) .OR. (KND/=IND) .OR. &
     (PALPHAH/=XALPHAH) .OR. (PNUH/=XNUH)                               .OR. &
     (PALPHAG/=XALPHAG) .OR. (PNUG/=XNUG)                               .OR. &
     (PEHG/=ZEHG) .OR. (PBG/=XBG)                                       .OR. &
     (PCH/=XCH) .OR. (PDH/=XDH) .OR. (PCG/=XCG) .OR. (PDG/=XDG)         .OR. &
-    (PWETLBDAH_MAX/=XWETLBDAH_MAX) .OR. (PWETLBDAG_MAX/=XWETLBDAG_MAX) .OR. &
-    (PWETLBDAH_MIN/=XWETLBDAH_MIN) .OR. (PWETLBDAG_MIN/=XWETLBDAG_MIN) .OR. &
+    (PWETLBDAH_MAX/=RAIN_ICE_PARAMN%XWETLBDAH_MAX) .OR. (PWETLBDAG_MAX/=RAIN_ICE_PARAMN%XWETLBDAG_MAX) .OR. &
+    (PWETLBDAH_MIN/=RAIN_ICE_PARAMN%XWETLBDAH_MIN) .OR. (PWETLBDAG_MIN/=RAIN_ICE_PARAMN%XWETLBDAG_MIN) .OR. &
     (PFDINFTY/=ZFDINFTY)                                               ) THEN
   CALL RZCOLX ( IND, XALPHAH, XNUH, XALPHAG, XNUG,                          &
                 ZEHG, XBG, XCH, XDH, 0., XCG, XDG, 0.,                      &
-                XWETLBDAH_MAX, XWETLBDAG_MAX, XWETLBDAH_MIN, XWETLBDAG_MIN, &
+                RAIN_ICE_PARAMN%XWETLBDAH_MAX, RAIN_ICE_PARAMN%XWETLBDAG_MAX, &
+                RAIN_ICE_PARAMN%XWETLBDAH_MIN, RAIN_ICE_PARAMN%XWETLBDAG_MIN, &
                 ZFDINFTY, XKER_GWETH                                        )
   WRITE(UNIT=KLUOUT,FMT='("*****************************************")')
   WRITE(UNIT=KLUOUT,FMT='("**** UPDATE NEW SET OF GWETH KERNELS ****")')
   WRITE(UNIT=KLUOUT,FMT='("*****************************************")')
   WRITE(UNIT=KLUOUT,FMT='("!")')
   WRITE(UNIT=KLUOUT,FMT='("KND=",I3)') IND
-  WRITE(UNIT=KLUOUT,FMT='("KWETLBDAH=",I3)') NWETLBDAH
-  WRITE(UNIT=KLUOUT,FMT='("KWETLBDAG=",I3)') NWETLBDAG
+  WRITE(UNIT=KLUOUT,FMT='("KWETLBDAH=",I3)') RAIN_ICE_PARAMN%NWETLBDAH
+  WRITE(UNIT=KLUOUT,FMT='("KWETLBDAG=",I3)') RAIN_ICE_PARAMN%NWETLBDAG
   WRITE(UNIT=KLUOUT,FMT='("PALPHAH=",E13.6)') XALPHAH
   WRITE(UNIT=KLUOUT,FMT='("PNUH=",E13.6)') XNUH
   WRITE(UNIT=KLUOUT,FMT='("PALPHAG=",E13.6)') XALPHAG
@@ -1346,18 +1342,18 @@ IF( (KWETLBDAH/=NWETLBDAH) .OR. (KWETLBDAG/=NWETLBDAG) .OR. (KND/=IND) .OR. &
   WRITE(UNIT=KLUOUT,FMT='("PCG=",E13.6)') XCG
   WRITE(UNIT=KLUOUT,FMT='("PDG=",E13.6)') XDG
   WRITE(UNIT=KLUOUT,FMT='("PWETLBDAH_MAX=",E13.6)') &
-                                                    XWETLBDAH_MAX
+                                                    RAIN_ICE_PARAMN%XWETLBDAH_MAX
   WRITE(UNIT=KLUOUT,FMT='("PWETLBDAG_MAX=",E13.6)') &
-                                                    XWETLBDAG_MAX
+                                                    RAIN_ICE_PARAMN%XWETLBDAG_MAX
   WRITE(UNIT=KLUOUT,FMT='("PWETLBDAH_MIN=",E13.6)') &
-                                                    XWETLBDAH_MIN
+                                                    RAIN_ICE_PARAMN%XWETLBDAH_MIN
   WRITE(UNIT=KLUOUT,FMT='("PWETLBDAG_MIN=",E13.6)') &
-                                                    XWETLBDAG_MIN
+                                                    RAIN_ICE_PARAMN%XWETLBDAG_MIN
   WRITE(UNIT=KLUOUT,FMT='("PFDINFTY=",E13.6)') ZFDINFTY
   WRITE(UNIT=KLUOUT,FMT='("!")')
   WRITE(UNIT=KLUOUT,FMT='("IF( PRESENT(PKER_GWETH) ) THEN")')
-  DO J1 = 1 , NWETLBDAH
-    DO J2 = 1 , NWETLBDAG
+  DO J1 = 1 , RAIN_ICE_PARAMN%NWETLBDAH
+    DO J2 = 1 , RAIN_ICE_PARAMN%NWETLBDAG
     WRITE(UNIT=KLUOUT,FMT='("PKER_GWETH(",I3,",",I3,") = ",E13.6)') &
                         J1,J2,XKER_GWETH(J1,J2)
     END DO
@@ -1376,31 +1372,32 @@ IND      = 50    ! Number of interval used to integrate the dimensional
 ZEHR     = 1.0   ! distributions when computing the kernel XKER_RWETH
 ZFDINFTY = 20.0
 !
-IF( .NOT.ASSOCIATED(XKER_RWETH) ) CALL RAIN_ICE_PARAM_ALLOCATE('XKER_RWETH', NWETLBDAH,NWETLBDAR)
+IF( .NOT.ASSOCIATED(XKER_RWETH) ) CALL RAIN_ICE_PARAM_ALLOCATE('XKER_RWETH', RAIN_ICE_PARAMN%NWETLBDAH,RAIN_ICE_PARAMN%NWETLBDAR)
 !
 CALL READ_XKER_RWETH (KWETLBDAH,KWETLBDAR,KND,                              &
                    PALPHAH,PNUH,PALPHAR,PNUR,PEHR,PBR,PCH,PDH,PCR,PDR,      &
                    PWETLBDAH_MAX,PWETLBDAR_MAX,PWETLBDAH_MIN,PWETLBDAR_MIN, &
                    PFDINFTY                                                 )
-IF( (KWETLBDAH/=NWETLBDAH) .OR. (KWETLBDAR/=NWETLBDAR) .OR. (KND/=IND) .OR. &
+IF( (KWETLBDAH/=RAIN_ICE_PARAMN%NWETLBDAH) .OR. (KWETLBDAR/=RAIN_ICE_PARAMN%NWETLBDAR) .OR. (KND/=IND) .OR. &
     (PALPHAH/=XALPHAH) .OR. (PNUH/=XNUH)                               .OR. &
     (PALPHAR/=XALPHAR) .OR. (PNUR/=XNUR)                               .OR. &
     (PEHR/=ZEHR) .OR. (PBR/=XBR)                                       .OR. &
     (PCH/=XCH) .OR. (PDH/=XDH) .OR. (PCR/=XCR) .OR. (PDR/=XDR)         .OR. &
-    (PWETLBDAH_MAX/=XWETLBDAH_MAX) .OR. (PWETLBDAR_MAX/=XWETLBDAR_MAX) .OR. &
-    (PWETLBDAH_MIN/=XWETLBDAH_MIN) .OR. (PWETLBDAR_MIN/=XWETLBDAR_MIN) .OR. &
+    (PWETLBDAH_MAX/=RAIN_ICE_PARAMN%XWETLBDAH_MAX) .OR. (PWETLBDAR_MAX/=RAIN_ICE_PARAMN%XWETLBDAR_MAX) .OR. &
+    (PWETLBDAH_MIN/=RAIN_ICE_PARAMN%XWETLBDAH_MIN) .OR. (PWETLBDAR_MIN/=RAIN_ICE_PARAMN%XWETLBDAR_MIN) .OR. &
     (PFDINFTY/=ZFDINFTY)                                               ) THEN
   CALL RZCOLX ( IND, XALPHAH, XNUH, XALPHAR, XNUR,                          &
                 ZEHR, XBR, XCH, XDH, 0., XCR, XDR, 0.,                      &
-                XWETLBDAH_MAX, XWETLBDAR_MAX, XWETLBDAH_MIN, XWETLBDAR_MIN, &
+                RAIN_ICE_PARAMN%XWETLBDAH_MAX, RAIN_ICE_PARAMN%XWETLBDAR_MAX, &
+                RAIN_ICE_PARAMN%XWETLBDAH_MIN, RAIN_ICE_PARAMN%XWETLBDAR_MIN, &
                 ZFDINFTY, XKER_RWETH                                        )
   WRITE(UNIT=KLUOUT,FMT='("*****************************************")')
   WRITE(UNIT=KLUOUT,FMT='("**** UPDATE NEW SET OF RWETH KERNELS ****")')
   WRITE(UNIT=KLUOUT,FMT='("*****************************************")')
   WRITE(UNIT=KLUOUT,FMT='("!")')
   WRITE(UNIT=KLUOUT,FMT='("KND=",I3)') IND
-  WRITE(UNIT=KLUOUT,FMT='("KWETLBDAH=",I3)') NWETLBDAH
-  WRITE(UNIT=KLUOUT,FMT='("KWETLBDAR=",I3)') NWETLBDAR
+  WRITE(UNIT=KLUOUT,FMT='("KWETLBDAH=",I3)') RAIN_ICE_PARAMN%NWETLBDAH
+  WRITE(UNIT=KLUOUT,FMT='("KWETLBDAR=",I3)') RAIN_ICE_PARAMN%NWETLBDAR
   WRITE(UNIT=KLUOUT,FMT='("PALPHAH=",E13.6)') XALPHAH
   WRITE(UNIT=KLUOUT,FMT='("PNUH=",E13.6)') XNUH
   WRITE(UNIT=KLUOUT,FMT='("PALPHAR=",E13.6)') XALPHAR
@@ -1412,18 +1409,18 @@ IF( (KWETLBDAH/=NWETLBDAH) .OR. (KWETLBDAR/=NWETLBDAR) .OR. (KND/=IND) .OR. &
   WRITE(UNIT=KLUOUT,FMT='("PCR=",E13.6)') XCR
   WRITE(UNIT=KLUOUT,FMT='("PDR=",E13.6)') XDR
   WRITE(UNIT=KLUOUT,FMT='("PWETLBDAH_MAX=",E13.6)') &
-                                                    XWETLBDAH_MAX
+                                                    RAIN_ICE_PARAMN%XWETLBDAH_MAX
   WRITE(UNIT=KLUOUT,FMT='("PWETLBDAR_MAX=",E13.6)') &
-                                                    XWETLBDAR_MAX
+                                                    RAIN_ICE_PARAMN%XWETLBDAR_MAX
   WRITE(UNIT=KLUOUT,FMT='("PWETLBDAH_MIN=",E13.6)') &
-                                                    XWETLBDAH_MIN
+                                                    RAIN_ICE_PARAMN%XWETLBDAH_MIN
   WRITE(UNIT=KLUOUT,FMT='("PWETLBDAR_MIN=",E13.6)') &
-                                                    XWETLBDAR_MIN
+                                                    RAIN_ICE_PARAMN%XWETLBDAR_MIN
   WRITE(UNIT=KLUOUT,FMT='("PFDINFTY=",E13.6)') ZFDINFTY
   WRITE(UNIT=KLUOUT,FMT='("!")')
   WRITE(UNIT=KLUOUT,FMT='("IF( PRESENT(PKER_RWETH) ) THEN")')
-  DO J1 = 1 , NWETLBDAH
-    DO J2 = 1 , NWETLBDAR
+  DO J1 = 1 , RAIN_ICE_PARAMN%NWETLBDAH
+    DO J2 = 1 , RAIN_ICE_PARAMN%NWETLBDAR
     WRITE(UNIT=KLUOUT,FMT='("PKER_RWETH(",I3,",",I3,") = ",E13.6)') &
                         J1,J2,XKER_RWETH(J1,J2)
     END DO
@@ -1496,9 +1493,9 @@ CONTAINS
 !
   IMPLICIT NONE
 !
-  REAL     :: PALPHA ! first shape parameter of the dimensionnal distribution
-  REAL     :: PNU    ! second shape parameter of the dimensionnal distribution
-  REAL     :: PP     ! order of the moment
+  REAL, INTENT(IN)     :: PALPHA ! first shape parameter of the dimensionnal distribution
+  REAL, INTENT(IN)     :: PNU    ! second shape parameter of the dimensionnal distribution
+  REAL, INTENT(IN)     :: PP     ! order of the moment
   REAL     :: PMOMG  ! result: moment of order ZP
 !
 !------------------------------------------------------------------------------
@@ -1512,3 +1509,4 @@ CONTAINS
 !
 !
 END SUBROUTINE INI_RAIN_ICE
+END MODULE MODE_INI_RAIN_ICE
diff --git a/src/PHYEX/micro/mode_ini_snow.f90 b/src/PHYEX/micro/mode_ini_snow.f90
index c61f54a0d762adf2110157acc003e05d11335e4f..313659cb48675e0b94dbbc55f1b026f0ca1bcddd 100644
--- a/src/PHYEX/micro/mode_ini_snow.f90
+++ b/src/PHYEX/micro/mode_ini_snow.f90
@@ -1,7 +1,9 @@
 !     ######spl
+MODULE MODE_INI_SNOW
+IMPLICIT NONE
+CONTAINS
       SUBROUTINE INI_SNOW ( KLUOUT )
-      USE PARKIND1, ONLY : JPRB
-      USE YOMHOOK , ONLY : LHOOK, DR_HOOK
+      USE YOMHOOK , ONLY : LHOOK, DR_HOOK, JPHOOK
 !     ###########################################################
 !
 !!****  *INI_SNOW * - re-initialize the constants based on snow-size distubutio
@@ -47,9 +49,9 @@
 !
 USE MODD_CST
 USE MODD_PARAMETERS
-USE MODD_PARAM_ICE
-USE MODD_RAIN_ICE_DESCR
-USE MODD_RAIN_ICE_PARAM
+USE MODD_PARAM_ICE_n
+USE MODD_RAIN_ICE_DESCR_n
+USE MODD_RAIN_ICE_PARAM_n
 !
 USE MODI_GAMMA
 USE MODI_GAMMA_INC
@@ -76,7 +78,7 @@ REAL :: ZRHO00                ! Surface reference air density
 REAL :: ZCONC_MAX ! Maximal concentration for snow
 
 
-REAL(KIND=JPRB) :: ZHOOK_HANDLE
+REAL(KIND=JPHOOK) :: ZHOOK_HANDLE
 IF (LHOOK) CALL DR_HOOK('INI_RAIN_ICE',0,ZHOOK_HANDLE)
 
 
@@ -145,9 +147,9 @@ CONTAINS
 !
   IMPLICIT NONE
 !
-  REAL     :: PALPHA ! first shape parameter of the dimensionnal distribution
-  REAL     :: PNU    ! second shape parameter of the dimensionnal distribution
-  REAL     :: PP     ! order of the moment
+  REAL, INTENT(IN)     :: PALPHA ! first shape parameter of the dimensionnal distribution
+  REAL, INTENT(IN)     :: PNU    ! second shape parameter of the dimensionnal distribution
+  REAL, INTENT(IN)     :: PP     ! order of the moment
   REAL     :: PMOMG  ! result: moment of order ZP
 !
 !------------------------------------------------------------------------------
@@ -161,3 +163,4 @@ CONTAINS
 !
 !
 END SUBROUTINE INI_SNOW
+END MODULE MODE_INI_SNOW
diff --git a/src/PHYEX/micro/mode_ini_tiwmx.f90 b/src/PHYEX/micro/mode_ini_tiwmx.f90
index 2e3209a38d5bd88f21ac0fa68d98172da3692d99..1d0ab80f6b5c883ec63f8568cad9368a7867e5fc 100644
--- a/src/PHYEX/micro/mode_ini_tiwmx.f90
+++ b/src/PHYEX/micro/mode_ini_tiwmx.f90
@@ -1,19 +1,19 @@
+MODULE MODE_INI_TIWMX
+IMPLICIT NONE
+CONTAINS
 SUBROUTINE INI_TIWMX
-  USE PARKIND1, ONLY  : JPRB
-  USE MODD_CST, ONLY  :  XALPW,XBETAW,XGAMW,XALPI,XBETAI,XGAMI,  &
-       &  XTT,XRV,XLVTT,XLSTT
 ! Include function definitions
   USE MODE_TIWMX_FUN, ONLY : ESATW,DESDTW,ESATI,DESDTI,AA2,AA2W,AM3,AF3,BB3,BB3W,REDIN
 ! Only the tables, _NOT_ the functions!
   USE MODE_TIWMX, ONLY : XNDEGR,NSTART,NSTOP,ESTABW,DESTABW,ESTABI,DESTABI, &
        & A2TAB,BB3TAB,AM3TAB,AF3TAB,A2WTAB,BB3WTAB,REDINTAB
-  USE YOMHOOK, ONLY : LHOOK, DR_HOOK
+  USE YOMHOOK, ONLY : LHOOK, DR_HOOK, JPHOOK
   IMPLICIT NONE
 
   INTEGER :: JK
   REAL :: ZTEMP
 
-  REAL(KIND=JPRB) :: ZHOOK_HANDLE
+  REAL(KIND=JPHOOK) :: ZHOOK_HANDLE
 
   IF (LHOOK) CALL DR_HOOK('INI_TIWMX',0,ZHOOK_HANDLE)
 
@@ -53,3 +53,4 @@ SUBROUTINE INI_TIWMX
   IF (LHOOK) CALL DR_HOOK('INI_TIWMX',1,ZHOOK_HANDLE)
 
 END SUBROUTINE INI_TIWMX
+END MODULE MODE_INI_TIWMX
diff --git a/src/PHYEX/micro/mode_init_aerosol_properties.f90 b/src/PHYEX/micro/mode_init_aerosol_properties.f90
index f7ea0bad7052595e6ba6b0b7560a40f7205280fa..8664af9f3519e53e54e1edbeb3684d05e92dda1a 100644
--- a/src/PHYEX/micro/mode_init_aerosol_properties.f90
+++ b/src/PHYEX/micro/mode_init_aerosol_properties.f90
@@ -4,13 +4,10 @@
 !MNH_LIC for details. version 1.
 !-----------------------------------------------------------------
 !      ####################
-       MODULE MODI_INIT_AEROSOL_PROPERTIES
-INTERFACE
-   SUBROUTINE INIT_AEROSOL_PROPERTIES
-   END SUBROUTINE INIT_AEROSOL_PROPERTIES
-END INTERFACE
-END MODULE MODI_INIT_AEROSOL_PROPERTIES
+       MODULE MODE_INIT_AEROSOL_PROPERTIES
 !      ####################
+IMPLICIT NONE
+CONTAINS
 !
 !     #############################################################
       SUBROUTINE INIT_AEROSOL_PROPERTIES
@@ -52,7 +49,8 @@ USE MODD_PARAM_LIMA,      ONLY : NMOD_CCN, HINI_CCN, HTYPE_CCN,        &
                                  NMOD_IFN, NSPECIE, CIFN_SPECIES,       &
                                  XMDIAM_IFN, XSIGMA_IFN, XRHO_IFN, XFRAC, XFRAC_REF, &
                                  CINT_MIXING, NPHILLIPS,           &
-                                 NIMM, NMOD_IMM, NINDICE_CCN_IMM
+                                 NIMM, NMOD_IMM, NINDICE_CCN_IMM, &
+                                 PARAM_LIMA_ALLOCATE, PARAM_LIMA_DEALLOCATE
 !
 USE MODD_CH_AEROSOL
 USE MODD_SALT
@@ -107,9 +105,9 @@ INTEGER :: II, IJ, IK
 !
 IF ( NMOD_CCN .GE. 1 ) THEN
 !
-   IF (.NOT.(ALLOCATED(XR_MEAN_CCN))) ALLOCATE(XR_MEAN_CCN(NMOD_CCN))
-   IF (.NOT.(ALLOCATED(XLOGSIG_CCN))) ALLOCATE(XLOGSIG_CCN(NMOD_CCN))
-   IF (.NOT.(ALLOCATED(XRHO_CCN)))    ALLOCATE(XRHO_CCN(NMOD_CCN))
+   IF (.NOT.(ASSOCIATED(XR_MEAN_CCN))) CALL PARAM_LIMA_ALLOCATE('XR_MEAN_CCN', NMOD_CCN)
+   IF (.NOT.(ASSOCIATED(XLOGSIG_CCN))) CALL PARAM_LIMA_ALLOCATE('XLOGSIG_CCN', NMOD_CCN)
+   IF (.NOT.(ASSOCIATED(XRHO_CCN)))    CALL PARAM_LIMA_ALLOCATE('XRHO_CCN', NMOD_CCN)
 !
    SELECT CASE (CCCN_MODES)
    CASE ('JUNGFRAU')
@@ -222,10 +220,10 @@ END IF
 !* INPUT : XBETAHEN_TEST is in 'percent' and XBETAHEN_MULTI in 'no units', 
 !  XK... and XMU... are invariant
 !
-  IF (.NOT.(ALLOCATED(XKHEN_MULTI)))    ALLOCATE(XKHEN_MULTI(NMOD_CCN))  
-  IF (.NOT.(ALLOCATED(XMUHEN_MULTI)))   ALLOCATE(XMUHEN_MULTI(NMOD_CCN))
-  IF (.NOT.(ALLOCATED(XBETAHEN_MULTI))) ALLOCATE(XBETAHEN_MULTI(NMOD_CCN))
-  IF (.NOT.(ALLOCATED(XLIMIT_FACTOR)))  ALLOCATE(XLIMIT_FACTOR(NMOD_CCN))
+  IF (.NOT.(ASSOCIATED(XKHEN_MULTI)))    CALL PARAM_LIMA_ALLOCATE('XKHEN_MULTI', NMOD_CCN)
+  IF (.NOT.(ASSOCIATED(XMUHEN_MULTI)))   CALL PARAM_LIMA_ALLOCATE('XMUHEN_MULTI', NMOD_CCN)
+  IF (.NOT.(ASSOCIATED(XBETAHEN_MULTI))) CALL PARAM_LIMA_ALLOCATE('XBETAHEN_MULTI', NMOD_CCN)
+  IF (.NOT.(ASSOCIATED(XLIMIT_FACTOR)))  CALL PARAM_LIMA_ALLOCATE('XLIMIT_FACTOR', NMOD_CCN)
 !
   IF (HINI_CCN == 'CCN') THEN
 !!$    IF (LSCAV) THEN
@@ -336,9 +334,9 @@ IF ( NMOD_IFN .GE. 1 ) THEN
   SELECT CASE (CIFN_SPECIES)
    CASE ('MOCAGE')
          NSPECIE = 4
-         IF (.NOT.(ALLOCATED(XMDIAM_IFN))) ALLOCATE(XMDIAM_IFN(NSPECIE))
-         IF (.NOT.(ALLOCATED(XSIGMA_IFN))) ALLOCATE(XSIGMA_IFN(NSPECIE))
-         IF (.NOT.(ALLOCATED(XRHO_IFN)))   ALLOCATE(XRHO_IFN(NSPECIE))
+         IF (.NOT.(ASSOCIATED(XMDIAM_IFN))) CALL PARAM_LIMA_ALLOCATE('XMDIAM_IFN', NSPECIE)
+         IF (.NOT.(ASSOCIATED(XSIGMA_IFN))) CALL PARAM_LIMA_ALLOCATE('XSIGMA_IFN', NSPECIE)
+         IF (.NOT.(ASSOCIATED(XRHO_IFN)))   CALL PARAM_LIMA_ALLOCATE('XRHO_IFN', NSPECIE)
          XMDIAM_IFN = (/ 0.05E-6 , 3.E-6 , 0.016E-6 , 0.016E-6 /)
          XSIGMA_IFN = (/ 2.4 , 1.6 , 2.5 , 2.5 /)
          XRHO_IFN   = (/ 2650. , 2650. , 1000. , 1000. /)
@@ -347,9 +345,9 @@ IF ( NMOD_IFN .GE. 1 ) THEN
 ! 2 species, dust-metallic and hydrophobic (as BC)
 ! (Phillips et al. 2013 and GADS data)
       NSPECIE = 4 ! DM1, DM2, BC, BIO+(O)
-      IF (.NOT.(ALLOCATED(XMDIAM_IFN))) ALLOCATE(XMDIAM_IFN(NSPECIE))
-      IF (.NOT.(ALLOCATED(XSIGMA_IFN))) ALLOCATE(XSIGMA_IFN(NSPECIE))
-      IF (.NOT.(ALLOCATED(XRHO_IFN)))   ALLOCATE(XRHO_IFN(NSPECIE))
+      IF (.NOT.(ASSOCIATED(XMDIAM_IFN))) CALL PARAM_LIMA_ALLOCATE('XMDIAM_IFN', NSPECIE)
+      IF (.NOT.(ASSOCIATED(XSIGMA_IFN))) CALL PARAM_LIMA_ALLOCATE('XSIGMA_IFN', NSPECIE)
+      IF (.NOT.(ASSOCIATED(XRHO_IFN)))   CALL PARAM_LIMA_ALLOCATE('XRHO_IFN', NSPECIE)
       XMDIAM_IFN = (/0.8E-6, 3.0E-6, 0.025E-6, 0.2E-6/)
       XSIGMA_IFN = (/2.0, 2.15, 2.0, 1.6 /)
       XRHO_IFN   = (/2600., 2600., 1000., 1500./) 
@@ -358,9 +356,9 @@ IF ( NMOD_IFN .GE. 1 ) THEN
 ! 2 species, dust-metallic and hydrophobic (as BC)
 ! (Phillips et al. 2013 and GADS data)
       NSPECIE = 4 ! DM1, DM2, BC, BIO+(O)
-      IF (.NOT.(ALLOCATED(XMDIAM_IFN))) ALLOCATE(XMDIAM_IFN(NSPECIE))
-      IF (.NOT.(ALLOCATED(XSIGMA_IFN))) ALLOCATE(XSIGMA_IFN(NSPECIE))
-      IF (.NOT.(ALLOCATED(XRHO_IFN)))   ALLOCATE(XRHO_IFN(NSPECIE))
+      IF (.NOT.(ASSOCIATED(XMDIAM_IFN))) CALL PARAM_LIMA_ALLOCATE('XMDIAM_IFN', NSPECIE)
+      IF (.NOT.(ASSOCIATED(XSIGMA_IFN))) CALL PARAM_LIMA_ALLOCATE('XSIGMA_IFN', NSPECIE)
+      IF (.NOT.(ASSOCIATED(XRHO_IFN)))   CALL PARAM_LIMA_ALLOCATE('XRHO_IFN', NSPECIE)
       XMDIAM_IFN = (/0.8E-6, 3.0E-6, 0.04E-6, 0.8E-6 /)
       XSIGMA_IFN = (/2.0,    2.15,   2.0,     2.2    /)
       XRHO_IFN   = (/2600.,  2600.,  1000.,   2000.  /)
@@ -369,9 +367,9 @@ IF ( NMOD_IFN .GE. 1 ) THEN
 ! 2 species, dust-metallic and hydrophobic (as BC)
 ! (Phillips et al. 2013 and GADS data)
       NSPECIE = 4 ! DM1, DM2, BC, BIO+(O)
-      IF (.NOT.(ALLOCATED(XMDIAM_IFN))) ALLOCATE(XMDIAM_IFN(NSPECIE))
-      IF (.NOT.(ALLOCATED(XSIGMA_IFN))) ALLOCATE(XSIGMA_IFN(NSPECIE))
-      IF (.NOT.(ALLOCATED(XRHO_IFN)))   ALLOCATE(XRHO_IFN(NSPECIE))
+      IF (.NOT.(ASSOCIATED(XMDIAM_IFN))) CALL PARAM_LIMA_ALLOCATE('XMDIAM_IFN', NSPECIE)
+      IF (.NOT.(ASSOCIATED(XSIGMA_IFN))) CALL PARAM_LIMA_ALLOCATE('XSIGMA_IFN', NSPECIE)
+      IF (.NOT.(ASSOCIATED(XRHO_IFN)))   CALL PARAM_LIMA_ALLOCATE('XRHO_IFN', NSPECIE)
       XMDIAM_IFN = (/0.8E-6, 3.0E-6, 0.04E-6, 0.04E-6/)
       XSIGMA_IFN = (/2.0,    2.15,   2.0,     2.2 /)
       XRHO_IFN   = (/2600.,  2600.,  1000.,   1800./)
@@ -379,18 +377,18 @@ IF ( NMOD_IFN .GE. 1 ) THEN
       IF (NPHILLIPS == 8) THEN
 ! 4 species, according to Phillips et al. 2008
          NSPECIE = 4
-         IF (.NOT.(ALLOCATED(XMDIAM_IFN))) ALLOCATE(XMDIAM_IFN(NSPECIE))
-         IF (.NOT.(ALLOCATED(XSIGMA_IFN))) ALLOCATE(XSIGMA_IFN(NSPECIE))
-         IF (.NOT.(ALLOCATED(XRHO_IFN)))   ALLOCATE(XRHO_IFN(NSPECIE))
+         IF (.NOT.(ASSOCIATED(XMDIAM_IFN))) CALL PARAM_LIMA_ALLOCATE('XMDIAM_IFN', NSPECIE)
+         IF (.NOT.(ASSOCIATED(XSIGMA_IFN))) CALL PARAM_LIMA_ALLOCATE('XSIGMA_IFN', NSPECIE)
+         IF (.NOT.(ASSOCIATED(XRHO_IFN)))   CALL PARAM_LIMA_ALLOCATE('XRHO_IFN', NSPECIE)
          XMDIAM_IFN = (/0.8E-6, 3.0E-6, 0.2E-6, 0.2E-6/)
          XSIGMA_IFN = (/1.9, 1.6, 1.6, 1.6 /)
          XRHO_IFN   = (/2300., 2300., 1860., 1500./)
       ELSE IF (NPHILLIPS == 13) THEN
 ! 4 species, according to Phillips et al. 2013
          NSPECIE = 4
-         IF (.NOT.(ALLOCATED(XMDIAM_IFN))) ALLOCATE(XMDIAM_IFN(NSPECIE))
-         IF (.NOT.(ALLOCATED(XSIGMA_IFN))) ALLOCATE(XSIGMA_IFN(NSPECIE))
-         IF (.NOT.(ALLOCATED(XRHO_IFN)))   ALLOCATE(XRHO_IFN(NSPECIE))
+         IF (.NOT.(ASSOCIATED(XMDIAM_IFN))) CALL PARAM_LIMA_ALLOCATE('XMDIAM_IFN', NSPECIE)
+         IF (.NOT.(ASSOCIATED(XSIGMA_IFN))) CALL PARAM_LIMA_ALLOCATE('XSIGMA_IFN', NSPECIE)
+         IF (.NOT.(ASSOCIATED(XRHO_IFN)))   CALL PARAM_LIMA_ALLOCATE('XRHO_IFN', NSPECIE)
          XMDIAM_IFN = (/0.8E-6, 3.0E-6, 90.E-9, 0.163E-6/)
          XSIGMA_IFN = (/1.9, 1.6, 1.6, 2.54 /)
          XRHO_IFN   = (/2300., 2300., 1860., 1000./)
@@ -427,7 +425,7 @@ END IF
 !
 ! internal mixing
 !
-   IF (.NOT.(ALLOCATED(XFRAC))) ALLOCATE(XFRAC(NSPECIE,NMOD_IFN))
+   IF (.NOT.(ASSOCIATED(XFRAC))) CALL PARAM_LIMA_ALLOCATE('XFRAC', NSPECIE,NMOD_IFN)
    XFRAC(:,:)=0. 
    SELECT CASE (CINT_MIXING)
    CASE ('DM1')
@@ -491,7 +489,7 @@ END IF
    ENDSELECT
 !
 ! Phillips 08 alpha (table 1) 
-   IF (.NOT.(ALLOCATED(XFRAC_REF))) ALLOCATE(XFRAC_REF(4))
+   IF (.NOT.(ASSOCIATED(XFRAC_REF))) CALL PARAM_LIMA_ALLOCATE('XFRAC_REF', 4)
       IF (NPHILLIPS == 13) THEN
          XFRAC_REF(1)=0.66
          XFRAC_REF(2)=0.66
@@ -507,3 +505,5 @@ END IF
 END IF ! NMOD_IFN > 0
 ! 
 END SUBROUTINE INIT_AEROSOL_PROPERTIES
+!
+END MODULE MODE_INIT_AEROSOL_PROPERTIES
diff --git a/src/PHYEX/micro/mode_lima_ccn_activation.f90 b/src/PHYEX/micro/mode_lima_ccn_activation.f90
index 36a2d7384f87d78995a0a580a5dcc07bbb88d1be..38732eee869583c4958e6624ee743a1e322a847f 100644
--- a/src/PHYEX/micro/mode_lima_ccn_activation.f90
+++ b/src/PHYEX/micro/mode_lima_ccn_activation.f90
@@ -74,7 +74,7 @@ USE MODD_PARAM_LIMA,      ONLY: LADJ, LACTIT, NMOD_CCN, XCTMIN, XKHEN_MULTI, XRT
 USE MODD_PARAM_LIMA_WARM, ONLY: XWMIN, NAHEN, NHYP, XAHENINTP1, XAHENINTP2, XCSTDCRIT, XHYPF12,      &
                                 XHYPINTP1, XHYPINTP2, XTMIN, XHYPF32, XPSI3, XAHENG, XAHENG2, XPSI1, &
                                 XLBC, XLBEXC
-USE MODD_TURB_n,          ONLY: LSUBG_COND
+USE MODD_NEB_n,           ONLY: LSUBG_COND
 
 !USE MODE_IO_FIELD_WRITE,  only: IO_Field_write
 use mode_tools,           only: Countjv
@@ -136,7 +136,7 @@ REAL, DIMENSION(:), ALLOCATABLE    :: ZZW1, ZZW2, ZZW3, ZZW4, ZZW5, ZZW6, &
 REAL, DIMENSION(:,:), ALLOCATABLE  :: ZTMP, ZCHEN_MULTI
 !
 REAL, DIMENSION(SIZE(PRHODREF,1),SIZE(PRHODREF,2),SIZE(PRHODREF,3))   &
-                                   :: ZTDT, ZDRC, ZRVSAT, ZW, ZW2, ZCLDFR  
+                                   :: ZTDT, ZRVSAT, ZW, ZW2, ZCLDFR  
 REAL, DIMENSION(SIZE(PNFT,1),SIZE(PNFT,2),SIZE(PNFT,3))               &
                                    :: ZCONC_TOT         ! total CCN C. available
 !
diff --git a/src/PHYEX/micro/mode_lima_ccn_hom_freezing.f90 b/src/PHYEX/micro/mode_lima_ccn_hom_freezing.f90
index 25744d42abb867dfca9935a86bb924329e49ee8e..38f760fc59473f3cad1d4d5ef76083cf52a7bd16 100644
--- a/src/PHYEX/micro/mode_lima_ccn_hom_freezing.f90
+++ b/src/PHYEX/micro/mode_lima_ccn_hom_freezing.f90
@@ -38,14 +38,11 @@ CONTAINS
 USE MODD_CST,            ONLY: CST_t
 USE MODD_NSV
 USE MODD_PARAMETERS,      ONLY: JPHEXT, JPVEXT
-USE MODD_PARAM_LIMA,      ONLY: NMOD_CCN, NMOD_IMM, XRTMIN, XCTMIN, XNUC
+USE MODD_PARAM_LIMA,      ONLY: NMOD_CCN
 USE MODD_PARAM_LIMA_COLD, ONLY: XRCOEF_HONH, XCEXP_DIFVAP_HONH, XCOEF_DIFVAP_HONH,&
                                 XCRITSAT1_HONH, XCRITSAT2_HONH, XTMAX_HONH,       &
                                 XTMIN_HONH, XC1_HONH, XC2_HONH, XC3_HONH,         &
-                                XDLNJODT1_HONH, XDLNJODT2_HONH, XRHOI_HONH,       &
-                                XC_HONC, XTEXP1_HONC, XTEXP2_HONC, XTEXP3_HONC,   &
-                                XTEXP4_HONC, XTEXP5_HONC
-USE MODD_PARAM_LIMA_WARM, ONLY: XLBC
+                                XDLNJODT1_HONH, XDLNJODT2_HONH, XRHOI_HONH
 !
 use mode_tools,           only: Countjv
 !
@@ -99,11 +96,10 @@ REAL, DIMENSION(SIZE(PRHODREF,1),SIZE(PRHODREF,2),SIZE(PRHODREF,3))   &
                                   :: ZNHT  ! Nucleated Ice nuclei conc. source
                                            ! by Homogeneous freezing of haze
 REAL, DIMENSION(SIZE(PRHODREF,1),SIZE(PRHODREF,2),SIZE(PRHODREF,3))   &
-                                  :: ZW, ZT ! work arrays
+                                  :: ZT ! work arrays
 !
 REAL, DIMENSION(:), ALLOCATABLE &
                            :: ZRHODREF, & ! RHO Dry REFerence
-                              ZRHODJ,   & ! RHO times Jacobian
                               ZZT,      & ! Temperature
                               ZPRES,    & ! Pressure
                               ZEXNREF,  & ! EXNer Pressure REFerence
@@ -125,11 +121,11 @@ REAL, DIMENSION(:), ALLOCATABLE &
                               ZCCNFROZEN
 !
 INTEGER :: IIB, IIE, IJB, IJE, IKB, IKE   ! Physical domain
-INTEGER :: JL, JMOD_CCN, JMOD_IMM         ! Loop index
+INTEGER :: JL, JMOD_CCN                   ! Loop index
 !
 INTEGER :: INEGT                          ! Case number of hom. nucleation
 LOGICAL, DIMENSION(SIZE(PRHODREF,1),SIZE(PRHODREF,2),SIZE(PRHODREF,3)) &
-			  :: GNEGT        ! Test where to compute the hom. nucleation
+        :: GNEGT        ! Test where to compute the hom. nucleation
 INTEGER , DIMENSION(SIZE(GNEGT)) :: I1,I2,I3 ! Used to replace the COUNT
 !
 REAL    :: ZEPS                           ! molar mass ratio
diff --git a/src/PHYEX/micro/mode_lima_collisional_ice_breakup.f90 b/src/PHYEX/micro/mode_lima_collisional_ice_breakup.f90
index 58a040f5af64a6c7b1b780d32a0b6ea0a448709a..35542d9c2ccdd6c56aa86219a830cf8a127824d1 100644
--- a/src/PHYEX/micro/mode_lima_collisional_ice_breakup.f90
+++ b/src/PHYEX/micro/mode_lima_collisional_ice_breakup.f90
@@ -36,7 +36,7 @@ CONTAINS
 USE MODD_PARAM_LIMA,       ONLY : LCIBU, XRTMIN, XCTMIN, XCEXVT, XALPHAS, XNUS, XNDEBRIS_CIBU
 
 USE MODD_PARAM_LIMA_COLD,  ONLY : XBS, XCS, XDS, XFVELOS, XMNU0
-USE MODD_PARAM_LIMA_MIXED, ONLY : XCG, XDG, XCXG,                              &
+USE MODD_PARAM_LIMA_MIXED, ONLY : XCG, XDG,                                    &
                                   XCIBUINTP_S, XCIBUINTP1_S, XCIBUINTP2_S,     &
                                   XCIBUINTP_G, XCIBUINTP1_G,                   &
                                   XFACTOR_CIBU_NI, XFACTOR_CIBU_RI,            &
diff --git a/src/PHYEX/micro/mode_lima_compute_cloud_fractions.f90 b/src/PHYEX/micro/mode_lima_compute_cloud_fractions.f90
index 98ac4ae517cd8b246674fd551efabd46b21cd441..325e04864aa96085cebf933f563936ab68cde7cd 100644
--- a/src/PHYEX/micro/mode_lima_compute_cloud_fractions.f90
+++ b/src/PHYEX/micro/mode_lima_compute_cloud_fractions.f90
@@ -69,7 +69,6 @@ REAL, DIMENSION(:,:,:),INTENT(INOUT) :: PPRCFR        !
 !
 !*       0.2   Declarations of local variables :
 !
-INTEGER :: JI, JJ, JK
 !
 !-------------------------------------------------------------------------------
 !
diff --git a/src/PHYEX/micro/mode_lima_conversion_melting_snow.f90 b/src/PHYEX/micro/mode_lima_conversion_melting_snow.f90
index 0921e3f73188b680251bbae80789d0f74870c35c..32537b585e8663dafafcc2499113e27100a67722 100644
--- a/src/PHYEX/micro/mode_lima_conversion_melting_snow.f90
+++ b/src/PHYEX/micro/mode_lima_conversion_melting_snow.f90
@@ -38,7 +38,7 @@ CONTAINS
 USE MODD_CST,              ONLY : XTT, XMV, XMD, XLVTT, XCPV, XCL, XESTT, XRV
 USE MODD_PARAM_LIMA,       ONLY : XRTMIN, XCTMIN, XNUS, XALPHAS
 USE MODD_PARAM_LIMA_MIXED, ONLY : XFSCVMG
-USE MODD_PARAM_LIMA_COLD,  ONLY : X0DEPS, XEX0DEPS, X1DEPS, XEX1DEPS, XBS, XFVELOS
+USE MODD_PARAM_LIMA_COLD,  ONLY : X0DEPS, XEX0DEPS, X1DEPS, XEX1DEPS, XFVELOS
 !
 IMPLICIT NONE
 !
diff --git a/src/PHYEX/micro/mode_lima_droplets_riming_snow.f90 b/src/PHYEX/micro/mode_lima_droplets_riming_snow.f90
index 70ab95d4787ed23f3b4e12fb544d6c25f3edcf40..9974166a1111a0ed9f0815781a6333b6eac5661e 100644
--- a/src/PHYEX/micro/mode_lima_droplets_riming_snow.f90
+++ b/src/PHYEX/micro/mode_lima_droplets_riming_snow.f90
@@ -42,7 +42,7 @@ USE MODD_PARAM_LIMA,       ONLY : XRTMIN, XCTMIN, XCEXVT, XNUS, XALPHAS, LMURAKA
 USE MODD_PARAM_LIMA_MIXED, ONLY : NGAMINC, XRIMINTP1, XRIMINTP2, XGAMINC_RIM1, XGAMINC_RIM2, XGAMINC_RIM4, &
                                   XCRIMSS, XEXCRIMSS, XSRIMCG, XEXSRIMCG, XSRIMCG2, XSRIMCG3, XEXSRIMCG2, &
                                   XHMLINTP1, XHMLINTP2, XGAMINC_HMC, XHM_FACTS, XHMTMIN, XHMTMAX
-USE MODD_PARAM_LIMA_COLD,  ONLY : XMNU0, XBS, XFVELOS
+USE MODD_PARAM_LIMA_COLD,  ONLY : XMNU0, XFVELOS
 !
 IMPLICIT NONE
 !
@@ -78,7 +78,7 @@ REAL, DIMENSION(:),   INTENT(OUT)   :: P_RS_HMS
 !
 REAL,    DIMENSION(SIZE(PRCT))  :: ZZW1, ZZW2, ZZW3, ZZW4, ZZW5
 !
-INTEGER, DIMENSION(SIZE(PRCT))  :: IVEC1,IVEC2        ! Vectors of indices
+INTEGER, DIMENSION(SIZE(PRCT))  :: IVEC2              ! Vector of indices
 REAL,    DIMENSION(SIZE(PRCT))  :: ZVEC1,ZVEC2,ZVEC1W ! Work vectors
 INTEGER                         :: JI
 !
diff --git a/src/PHYEX/micro/mode_lima_drops_break_up.f90 b/src/PHYEX/micro/mode_lima_drops_break_up.f90
index e2b36c2ab18e6bfa233bd9c9e27f5c40bbb62927..67f119b54563f20013621a6fa30afb911a43185e 100644
--- a/src/PHYEX/micro/mode_lima_drops_break_up.f90
+++ b/src/PHYEX/micro/mode_lima_drops_break_up.f90
@@ -52,7 +52,6 @@ REAL, DIMENSION(:),    INTENT(INOUT) :: PB_CR            ! Cumulated concentrati
 !*       0.2   Declarations of local variables :
 !
 REAL,    DIMENSION(SIZE(PCRT)) :: ZWLBDR,ZWLBDR3
-INTEGER :: JL
 !
 !-------------------------------------------------------------------------------
 !
diff --git a/src/PHYEX/micro/mode_lima_drops_to_droplets_conv.f90 b/src/PHYEX/micro/mode_lima_drops_to_droplets_conv.f90
index 808bed2403a360d48509250e1925cea5d12a25ca..daaf68b457e58724983dc01d88d162d60ab56bbf 100644
--- a/src/PHYEX/micro/mode_lima_drops_to_droplets_conv.f90
+++ b/src/PHYEX/micro/mode_lima_drops_to_droplets_conv.f90
@@ -33,8 +33,6 @@ CONTAINS
 !
 USE MODD_CST,             ONLY : CST_t
 USE MODD_PARAM_LIMA,      ONLY : XRTMIN, XCTMIN
-USE MODD_PARAM_LIMA_WARM, ONLY : XLBR, XLBEXR, XLBC, XLBEXC, &
-                                 XACCR1, XACCR3, XACCR4, XACCR5
 !
 IMPLICIT NONE
 !
@@ -58,7 +56,6 @@ REAL, DIMENSION(SIZE(PRCT,1),SIZE(PRCT,2),SIZE(PRCT,3)) :: ZDR
 !
 LOGICAL, DIMENSION(SIZE(PRCT,1),SIZE(PRCT,2),SIZE(PRCT,3)) :: ZMASKR, ZMASKC
 !
-REAL :: ZFACT
 !
 !
 !
diff --git a/src/PHYEX/micro/mode_lima_functions.f90 b/src/PHYEX/micro/mode_lima_functions.f90
index c65e6e23cbca066c1e02102e150f1284118134eb..59e1896d96293e6843fa11bb3942c45e7a19128b 100644
--- a/src/PHYEX/micro/mode_lima_functions.f90
+++ b/src/PHYEX/micro/mode_lima_functions.f90
@@ -19,9 +19,9 @@ CONTAINS
 ! Pth moment order of the generalized gamma law
     USE MODI_GAMMA
     IMPLICIT NONE
-    REAL     :: PALPHA ! first shape parameter of the dimensionnal distribution
-    REAL     :: PNU    ! second shape parameter of the dimensionnal distribution
-    REAL     :: PP     ! order of the moment
+    REAL, INTENT(IN)     :: PALPHA ! first shape parameter of the dimensionnal distribution
+    REAL, INTENT(IN)     :: PNU    ! second shape parameter of the dimensionnal distribution
+    REAL, INTENT(IN)     :: PP     ! order of the moment
     REAL     :: PMOMG  ! result: moment of order ZP
     PMOMG = GAMMA_X0D(PNU+PP/PALPHA)/GAMMA_X0D(PNU)
   END FUNCTION MOMG
@@ -103,8 +103,10 @@ CONTAINS
 !
 SUBROUTINE gaulag(x,w,n,alf)
   use modd_precision, only: MNHREAL64
-  INTEGER n,MAXIT
-  REAL alf,w(n),x(n)
+  INTEGER, intent(in) :: n
+  INTEGER MAXIT
+  REAL, intent(IN)  :: alf
+  REAL, intent(out) :: w(n),x(n)
   REAL(kind=MNHREAL64) :: EPS
   PARAMETER (EPS=3.D-14,MAXIT=10)
   INTEGER i,its,j
@@ -155,8 +157,9 @@ END SUBROUTINE gaulag
 !
 SUBROUTINE gauher(x,w,n)
   use modd_precision, only: MNHREAL64
-  INTEGER n,MAXIT
-  REAL w(n),x(n)
+  INTEGER, intent(in) :: n
+  INTEGER MAXIT
+  REAL, intent(out) ::  w(n),x(n)
   REAL(kind=MNHREAL64) :: EPS,PIM4
   PARAMETER (EPS=3.D-14,PIM4=.7511255444649425D0,MAXIT=10)
   INTEGER i,its,j,m
diff --git a/src/PHYEX/micro/mode_lima_graupel.f90 b/src/PHYEX/micro/mode_lima_graupel.f90
index 42dfa71fbae577e18dab94b672e7be2cb42dae02..84f56e43dc2e839cde629f0c423da950d8b6064c 100644
--- a/src/PHYEX/micro/mode_lima_graupel.f90
+++ b/src/PHYEX/micro/mode_lima_graupel.f90
@@ -46,9 +46,9 @@ CONTAINS
 !*       0.    DECLARATIONS
 !              ------------
 !
-USE MODD_CST,              ONLY : XTT, XMD, XMV, XRD, XRV, XLVTT, XLMTT, XESTT, XCL, XCI, XCPV
+USE MODD_CST,              ONLY : XTT, XMD, XMV, XRV, XLVTT, XLMTT, XESTT, XCL, XCI, XCPV
 USE MODD_PARAM_LIMA,       ONLY : XRTMIN, XCTMIN, XCEXVT, NMOM_H
-USE MODD_PARAM_LIMA_MIXED, ONLY : XCXG, XDG, X0DEPG, X1DEPG, NGAMINC,                             &
+USE MODD_PARAM_LIMA_MIXED, ONLY : XDG, X0DEPG, X1DEPG, NGAMINC,                                   &
                                   XFCDRYG, XFIDRYG, XCOLIG, XCOLSG, XCOLEXIG, XCOLEXSG,           &
                                   XFSDRYG, XLBSDRYG1, XLBSDRYG2, XLBSDRYG3, XKER_SDRYG,           &
                                   XFNSDRYG, XLBNSDRYG1, XLBNSDRYG2, XLBNSDRYG3, XKER_N_SDRYG,     &
@@ -59,7 +59,7 @@ USE MODD_PARAM_LIMA_MIXED, ONLY : XCXG, XDG, X0DEPG, X1DEPG, NGAMINC,
                                   XDRYINTP1R, XDRYINTP1S, XDRYINTP1G,                             &
                                   XDRYINTP2R, XDRYINTP2S, XDRYINTP2G,                             &
                                   NDRYLBDAR, NDRYLBDAS, NDRYLBDAG
-USE MODD_PARAM_LIMA_COLD,  ONLY : XMNU0, XCXS, XBS
+USE MODD_PARAM_LIMA_COLD,  ONLY : XMNU0
 !
 IMPLICIT NONE
 !
@@ -146,8 +146,6 @@ REAL, DIMENSION(:),   INTENT(INOUT) :: PA_CH
 !*       0.2   Declarations of local variables :
 !
 LOGICAL, DIMENSION(SIZE(PRCT))  :: GDRY
-INTEGER                         :: IGDRY
-INTEGER                         :: JJ
 !
 REAL,    DIMENSION(SIZE(PRCT))  :: Z1, Z2, Z3, Z4
 REAL,    DIMENSION(SIZE(PRCT))  :: ZZX, ZZW, ZZW1, ZZW2, ZZW3, ZZW4, ZZW5, ZZW6, ZZW7
@@ -513,8 +511,8 @@ PA_TH(:) = PA_TH(:) + P_TH_WETG(:) + P_TH_DRYG(:)               + P_TH_GMLT(:)
 !
 CONTAINS
   FUNCTION GET_XKER_SDRYG(GRAUPEL,SNOW) RESULT(RET)
-    INTEGER, DIMENSION(:) :: GRAUPEL
-    INTEGER, DIMENSION(:) :: SNOW
+    INTEGER, DIMENSION(:), INTENT(IN) :: GRAUPEL
+    INTEGER, DIMENSION(:), INTENT(IN) :: SNOW
     REAL, DIMENSION(SIZE(SNOW)) :: RET
     !
     INTEGER I
@@ -527,8 +525,8 @@ CONTAINS
 !-------------------------------------------------------------------------------
 !
   FUNCTION GET_XKER_N_SDRYG(GRAUPEL,SNOW) RESULT(RET)
-    INTEGER, DIMENSION(:) :: GRAUPEL
-    INTEGER, DIMENSION(:) :: SNOW
+    INTEGER, DIMENSION(:), INTENT(IN) :: GRAUPEL
+    INTEGER, DIMENSION(:), INTENT(IN) :: SNOW
     REAL, DIMENSION(SIZE(SNOW)) :: RET
     !
     INTEGER I
@@ -541,8 +539,8 @@ CONTAINS
 !-------------------------------------------------------------------------------
 !
   FUNCTION GET_XKER_RDRYG(GRAUPEL,RAIN) RESULT(RET)
-    INTEGER, DIMENSION(:) :: GRAUPEL
-    INTEGER, DIMENSION(:) :: RAIN
+    INTEGER, DIMENSION(:), INTENT(IN) :: GRAUPEL
+    INTEGER, DIMENSION(:), INTENT(IN) :: RAIN
     REAL, DIMENSION(SIZE(RAIN)) :: RET
     !
     INTEGER I
@@ -555,8 +553,8 @@ CONTAINS
 !-------------------------------------------------------------------------------
 !
   FUNCTION GET_XKER_N_RDRYG(GRAUPEL,RAIN) RESULT(RET)
-    INTEGER, DIMENSION(:) :: GRAUPEL
-    INTEGER, DIMENSION(:) :: RAIN
+    INTEGER, DIMENSION(:), INTENT(IN) :: GRAUPEL
+    INTEGER, DIMENSION(:), INTENT(IN) :: RAIN
     REAL, DIMENSION(SIZE(RAIN)) :: RET
     !
     INTEGER I
diff --git a/src/PHYEX/micro/mode_lima_hail.f90 b/src/PHYEX/micro/mode_lima_hail.f90
index 4d1fef9038708a7578e9491e8cccc2b215d2fb65..7c0231d89ae203c89aaedf4e014bb86e85b232ce 100644
--- a/src/PHYEX/micro/mode_lima_hail.f90
+++ b/src/PHYEX/micro/mode_lima_hail.f90
@@ -44,7 +44,7 @@ CONTAINS
 !*       0.    DECLARATIONS
 !              ------------
 !
-USE MODD_CST,              ONLY : XTT, XMD, XMV, XRD, XRV, XLVTT, XLMTT, XESTT, XCL, XCI, XCPV
+USE MODD_CST,              ONLY : XTT, XMD, XMV, XRV, XLVTT, XLMTT, XESTT, XCL, XCI, XCPV
 USE MODD_PARAM_LIMA,       ONLY : XRTMIN, XCTMIN, XCEXVT
 USE MODD_PARAM_LIMA_MIXED, ONLY : NWETLBDAG, XWETINTP1G, XWETINTP2G, &
                                   NWETLBDAH, X0DEPH, X1DEPH, XDH, XEX0DEPH, XEX1DEPH, &
@@ -56,7 +56,6 @@ USE MODD_PARAM_LIMA_MIXED, ONLY : NWETLBDAG, XWETINTP1G, XWETINTP2G, &
                                   XFGWETH, XLBGWETH1, XLBGWETH2, XLBGWETH3, &
                                   XFNGWETH, XLBNGWETH1, XLBNGWETH2, XLBNGWETH3
 
-USE MODD_PARAM_LIMA_COLD,  ONLY : XMNU0, XCXS, XBS
 !
 IMPLICIT NONE
 !
@@ -134,17 +133,15 @@ REAL, DIMENSION(:),   INTENT(INOUT) :: PA_CH
 !*       0.2   Declarations of local variables :
 !
 LOGICAL, DIMENSION(SIZE(PRCT))  :: GWET
-INTEGER                         :: JJ
 !
 REAL,    DIMENSION(SIZE(PRCT))  :: Z1, Z2, Z3, Z4
-REAL,    DIMENSION(SIZE(PRCT))  :: ZZX, ZZW, ZZW1, ZZW2, ZZW3, ZZW4, ZZW5, ZZW6
-REAL,    DIMENSION(SIZE(PRCT))  :: ZZW3N, ZZW4N, ZZW6N 
+REAL,    DIMENSION(SIZE(PRCT))  :: ZZW, ZZW1, ZZW2, ZZW3, ZZW4, ZZW5, ZZW6
+REAL,    DIMENSION(SIZE(PRCT))  :: ZZW3N, ZZW4N
 REAL,    DIMENSION(SIZE(PRCT))  :: ZRWETH
 !
 INTEGER, DIMENSION(SIZE(PRCT))  :: IVEC1,IVEC2        ! Vectors of indices
 REAL,    DIMENSION(SIZE(PRCT))  :: ZVEC1,ZVEC2, ZVEC3 ! Work vectors
 !
-INTEGER                         :: NHAIL
 REAL                            :: ZTHRH, ZTHRC
 !
 !-------------------------------------------------------------------------------
@@ -430,8 +427,8 @@ PA_TH(:) = PA_TH(:) + P_TH_WETH(:)                + P_TH_HMLT(:)
 !
 CONTAINS
   FUNCTION GET_XKER_SWETH(GRAUPEL,SNOW) RESULT(RET)
-    INTEGER, DIMENSION(:) :: GRAUPEL
-    INTEGER, DIMENSION(:) :: SNOW
+    INTEGER, DIMENSION(:), INTENT(IN) :: GRAUPEL
+    INTEGER, DIMENSION(:), INTENT(IN) :: SNOW
     REAL, DIMENSION(SIZE(SNOW)) :: RET
     !
     INTEGER I
@@ -444,8 +441,8 @@ CONTAINS
 !-------------------------------------------------------------------------------
 !
   FUNCTION GET_XKER_N_SWETH(GRAUPEL,SNOW) RESULT(RET)
-    INTEGER, DIMENSION(:) :: GRAUPEL
-    INTEGER, DIMENSION(:) :: SNOW
+    INTEGER, DIMENSION(:), INTENT(IN) :: GRAUPEL
+    INTEGER, DIMENSION(:), INTENT(IN) :: SNOW
     REAL, DIMENSION(SIZE(SNOW)) :: RET
     !
     INTEGER I
@@ -458,8 +455,8 @@ CONTAINS
 !-------------------------------------------------------------------------------
 !
   FUNCTION GET_XKER_GWETH(GRAUPEL,SNOW) RESULT(RET)
-    INTEGER, DIMENSION(:) :: GRAUPEL
-    INTEGER, DIMENSION(:) :: SNOW
+    INTEGER, DIMENSION(:), INTENT(IN) :: GRAUPEL
+    INTEGER, DIMENSION(:), INTENT(IN) :: SNOW
     REAL, DIMENSION(SIZE(SNOW)) :: RET
     !
     INTEGER I
@@ -472,8 +469,8 @@ CONTAINS
 !-------------------------------------------------------------------------------
 !
   FUNCTION GET_XKER_N_GWETH(GRAUPEL,SNOW) RESULT(RET)
-    INTEGER, DIMENSION(:) :: GRAUPEL
-    INTEGER, DIMENSION(:) :: SNOW
+    INTEGER, DIMENSION(:), INTENT(IN) :: GRAUPEL
+    INTEGER, DIMENSION(:), INTENT(IN) :: SNOW
     REAL, DIMENSION(SIZE(SNOW)) :: RET
     !
     INTEGER I
diff --git a/src/PHYEX/micro/mode_lima_ice4_nucleation.f90 b/src/PHYEX/micro/mode_lima_ice4_nucleation.f90
index 082b3c3e5f86ba5343e2bf2a243c58feb3a98253..387280c4b13619ef2d9e1cdbd43fd6a5b152a408 100644
--- a/src/PHYEX/micro/mode_lima_ice4_nucleation.f90
+++ b/src/PHYEX/micro/mode_lima_ice4_nucleation.f90
@@ -29,8 +29,7 @@ SUBROUTINE LIMA_ICE4_NUCLEATION(CST, KSIZE, &
 !          ------------
 !
 USE MODD_CST,            ONLY: CST_t
-USE PARKIND1, ONLY : JPRB
-USE YOMHOOK , ONLY : LHOOK, DR_HOOK
+USE YOMHOOK , ONLY : LHOOK, DR_HOOK, JPHOOK
 USE MODD_PARAM_LIMA_COLD, ONLY : XALPHA1, XBETA1, XALPHA2, XBETA2, XNU10, XNU20, XMNU0
 USE MODD_PARAM_LIMA, ONLY: LFEEDBACKT, XRTMIN
 !
@@ -53,7 +52,7 @@ REAL, DIMENSION(KSIZE),   INTENT(OUT)   :: PRVHENI_MR ! Mixing ratio change due
 !*       0.2  declaration of local variables
 !
 REAL, DIMENSION(KSIZE) :: ZW ! work array
-REAL(KIND=JPRB) :: ZHOOK_HANDLE
+REAL(KIND=JPHOOK) :: ZHOOK_HANDLE
 LOGICAL, DIMENSION(KSIZE) :: GNEGT  ! Test where to compute the HEN process
 REAL, DIMENSION(KSIZE)  :: ZZW,      & ! Work array
                            ZUSW,     & ! Undersaturation over water
diff --git a/src/PHYEX/micro/mode_lima_ice_aggregation_snow.f90 b/src/PHYEX/micro/mode_lima_ice_aggregation_snow.f90
index 03f4c10b228955877104f014612422e0374ce9d2..c442ab8b02965cbbf95a0a20709632085783b02b 100644
--- a/src/PHYEX/micro/mode_lima_ice_aggregation_snow.f90
+++ b/src/PHYEX/micro/mode_lima_ice_aggregation_snow.f90
@@ -38,8 +38,8 @@ CONTAINS
 !
 USE MODD_CST,             ONLY : XTT
 USE MODD_PARAM_LIMA,      ONLY : XRTMIN, XCTMIN, XCEXVT, NMOM_I, XNUS, XALPHAS, XCEXVT
-USE MODD_PARAM_LIMA_COLD, ONLY : XBI, XCCS, XCXS, XCOLEXIS, XAGGS_CLARGE1, XAGGS_CLARGE2, &
-                                 XAGGS_RLARGE1, XAGGS_RLARGE2, XFIAGGS, XBS, XNS, XFVELOS, XEXIAGGS
+USE MODD_PARAM_LIMA_COLD, ONLY : XBI, XCOLEXIS, XAGGS_CLARGE1, XAGGS_CLARGE2, &
+                                 XAGGS_RLARGE1, XAGGS_RLARGE2, XFIAGGS, XFVELOS, XEXIAGGS
 !
 IMPLICIT NONE
 !
diff --git a/src/PHYEX/micro/mode_lima_ice_deposition.f90 b/src/PHYEX/micro/mode_lima_ice_deposition.f90
index ed7540ca238a6898c0c9c4a61ac52eaad60d2035..99ea4469cca24a3066f51ca7ee305a3558130b26 100644
--- a/src/PHYEX/micro/mode_lima_ice_deposition.f90
+++ b/src/PHYEX/micro/mode_lima_ice_deposition.f90
@@ -40,15 +40,10 @@ CONTAINS
 !*       0.    DECLARATIONS
 !              ------------
 !
-USE MODD_PARAM_LIMA,      ONLY : XRTMIN, XCTMIN, XALPHAI, XALPHAS, XNUI, XNUS,&
+USE MODD_PARAM_LIMA,      ONLY : XRTMIN, XCTMIN, XALPHAI, XNUI, &
                                  NMOM_I, NMOM_S 
-USE MODD_PARAM_LIMA_COLD, ONLY : XCXS, XCCS,                                  &
-                                 XLBDAS_MAX, XDSCNVI_LIM, XLBDASCNVI_MAX,     &
-                                 XC0DEPSI, XC1DEPSI, XR0DEPSI, XR1DEPSI,      &
-                                 XSCFAC, XDICNVS_LIM, XLBDAICNVS_LIM,         &
+USE MODD_PARAM_LIMA_COLD, ONLY : XDICNVS_LIM, XLBDAICNVS_LIM,         &
                                  XC0DEPIS, XC1DEPIS, XR0DEPIS, XR1DEPIS,      &
-                                 XCOLEXIS, XAGGS_CLARGE1, XAGGS_CLARGE2,      &
-                                 XAGGS_RLARGE1, XAGGS_RLARGE2,                &
                                  XDI, X0DEPI, X2DEPI
 USE MODD_CST,             ONLY : XTT
 !
diff --git a/src/PHYEX/micro/mode_lima_init_ccn_activation_spectrum.f90 b/src/PHYEX/micro/mode_lima_init_ccn_activation_spectrum.f90
index c11b9222e8a25524ee32b40d0a16b49c0abd7077..a706525749d8ca10a8ea1ab46481cc58927d683c 100644
--- a/src/PHYEX/micro/mode_lima_init_ccn_activation_spectrum.f90
+++ b/src/PHYEX/micro/mode_lima_init_ccn_activation_spectrum.f90
@@ -230,10 +230,9 @@ REAL                    :: PZRIDDR
 !
 !
 INTEGER, PARAMETER      :: MAXIT=60
-REAL,    PARAMETER      :: UNUSED=0.0 !-1.11e30
 REAL                    :: fh,fl, fm,fnew
 REAL                    :: s,xh,xl,xm,xnew
-INTEGER                 :: j, JL
+INTEGER                 :: j
 !
 PZRIDDR= 999999.
 fl     = DSDD(PX1,XDDRY,XKAPPA,XT)
@@ -397,17 +396,17 @@ END FUNCTION DSDD
 !
 !*       0.1 declarations of arguments and result
 !
-    integer M
-    integer N
-    real    X(N)
-    real    FVEC(M)
-    integer IFLAG
+    integer, intent(in) :: M
+    integer, intent(in) :: N
+    real, intent(in) ::    X(N)
+    real, intent(out) ::    FVEC(M)
+    integer, intent(inout) :: IFLAG
 !
 !*       0.2 declarations of local variables
 !
     integer I
     real    C
-    real    ZW, ZW2
+    real    ZW
 !    
     ! print *, "X = ", X
     IF ( ANY(X .LT.0.) .OR. X(1).gt.2*X(2)) THEN
diff --git a/src/PHYEX/micro/mode_lima_nucleation_procs.f90 b/src/PHYEX/micro/mode_lima_nucleation_procs.f90
index 7bb5431361d9da3ab465178815ae9eed43e56d30..58f9212cc92f27eeca5fb93952f8a5e476357ba9 100644
--- a/src/PHYEX/micro/mode_lima_nucleation_procs.f90
+++ b/src/PHYEX/micro/mode_lima_nucleation_procs.f90
@@ -39,13 +39,11 @@ USE MODD_DIMPHYEX, ONLY: DIMPHYEX_t
 USE MODD_BUDGET,   ONLY: TBUDGETDATA, TBUDGETCONF_t
 USE MODD_CST,            ONLY: CST_t
 use modd_budget,     only: NBUDGET_TH, NBUDGET_RV, NBUDGET_RC, NBUDGET_RI, NBUDGET_SV1
-!USE MODD_IO,         ONLY: TFILEDATA
-USE MODD_PARAMETERS, ONLY : JPHEXT, JPVEXT
-USE MODD_NSV,        ONLY : NSV_LIMA_NC, NSV_LIMA_NR, NSV_LIMA_CCN_FREE, NSV_LIMA_CCN_ACTI, &
+USE MODD_NSV,        ONLY : NSV_LIMA_NC,  NSV_LIMA_CCN_FREE, NSV_LIMA_CCN_ACTI, &
                             NSV_LIMA_NI, NSV_LIMA_IFN_FREE, NSV_LIMA_IFN_NUCL, NSV_LIMA_IMM_NUCL, NSV_LIMA_HOM_HAZE
 USE MODD_PARAM_LIMA, ONLY : LNUCL, LMEYERS, LACTI, LHHONI,  &
                             NMOD_CCN, NMOD_IFN, NMOD_IMM, XCTMIN, XRTMIN, LSPRO, NMOM_I, NMOM_C
-USE MODD_TURB_n,     ONLY : LSUBG_COND
+USE MODD_NEB_n,      ONLY : LSUBG_COND
 
 USE MODE_BUDGET_PHY,     ONLY: BUDGET_STORE_ADD_PHY, BUDGET_STORE_INIT_PHY, BUDGET_STORE_END_PHY
 
diff --git a/src/PHYEX/micro/mode_lima_phillips_ifn_nucleation.f90 b/src/PHYEX/micro/mode_lima_phillips_ifn_nucleation.f90
index 37d4b321f11f73814c63fb5fd163bd87b9ecf614..41b8b5762cf9f83d9fbe762a21061fcfff7133ae 100644
--- a/src/PHYEX/micro/mode_lima_phillips_ifn_nucleation.f90
+++ b/src/PHYEX/micro/mode_lima_phillips_ifn_nucleation.f90
@@ -75,7 +75,7 @@ USE MODD_CST,            ONLY: CST_t
 USE MODD_PARAMETERS,      ONLY : JPHEXT, JPVEXT
 USE MODD_PARAM_LIMA,      ONLY : NMOD_IFN, NSPECIE, XFRAC,                         &
                                  NMOD_CCN, NMOD_IMM, NIND_SPECIE, NINDICE_CCN_IMM,  &
-                                 XDSI0, XRTMIN, XCTMIN, NPHILLIPS
+                                 XDSI0, NPHILLIPS
 USE MODD_PARAM_LIMA_COLD, ONLY : XMNU0
 
 use mode_tools,           only: Countjv
@@ -149,7 +149,6 @@ REAL, DIMENSION(:,:), ALLOCATABLE :: ZNIT    ! Nucleated Ice nuclei conc. source
 !
 REAL, DIMENSION(:), ALLOCATABLE &
                            :: ZRHODREF, & ! RHO Dry REFerence
-                              ZRHODJ,   & ! RHO times Jacobian
                               ZZT,      & ! Temperature
                               ZPRES,    & ! Pressure
                               ZEXNREF,  & ! EXNer Pressure REFerence
diff --git a/src/PHYEX/micro/mode_lima_rain_accr_snow.f90 b/src/PHYEX/micro/mode_lima_rain_accr_snow.f90
index 66f06a67fe17542a7f11409800e09a9ea9f75d8e..6c83bf6cd49554c08f21caed8d9d6258be9d5fd5 100644
--- a/src/PHYEX/micro/mode_lima_rain_accr_snow.f90
+++ b/src/PHYEX/micro/mode_lima_rain_accr_snow.f90
@@ -281,8 +281,8 @@ END WHERE
 !
 CONTAINS
   FUNCTION GET_XKER_RACCSS(I1,I2) RESULT(RET)
-    INTEGER, DIMENSION(:) :: I1
-    INTEGER, DIMENSION(:) :: I2
+    INTEGER, DIMENSION(:), INTENT(IN) :: I1
+    INTEGER, DIMENSION(:), INTENT(IN) :: I2
     REAL, DIMENSION(SIZE(I1)) :: RET
     !
     INTEGER I
@@ -295,8 +295,8 @@ CONTAINS
 !-------------------------------------------------------------------------------
 !
   FUNCTION GET_XKER_N_RACCSS(I1,I2) RESULT(RET)
-    INTEGER, DIMENSION(:) :: I1
-    INTEGER, DIMENSION(:) :: I2
+    INTEGER, DIMENSION(:), INTENT(IN) :: I1
+    INTEGER, DIMENSION(:), INTENT(IN) :: I2
     REAL, DIMENSION(SIZE(I1)) :: RET
     !
     INTEGER I
@@ -309,8 +309,8 @@ CONTAINS
 !-------------------------------------------------------------------------------
 !
   FUNCTION GET_XKER_RACCS(I1,I2) RESULT(RET)
-    INTEGER, DIMENSION(:) :: I1
-    INTEGER, DIMENSION(:) :: I2
+    INTEGER, DIMENSION(:), INTENT(IN) :: I1
+    INTEGER, DIMENSION(:), INTENT(IN) :: I2
     REAL, DIMENSION(SIZE(I1)) :: RET
     !
     INTEGER I
@@ -323,8 +323,8 @@ CONTAINS
 !-------------------------------------------------------------------------------
 !
   FUNCTION GET_XKER_N_RACCS(I1,I2) RESULT(RET)
-    INTEGER, DIMENSION(:) :: I1
-    INTEGER, DIMENSION(:) :: I2
+    INTEGER, DIMENSION(:), INTENT(IN) :: I1
+    INTEGER, DIMENSION(:), INTENT(IN) :: I2
     REAL, DIMENSION(SIZE(I1)) :: RET
     !
     INTEGER I
@@ -337,8 +337,8 @@ CONTAINS
 !-------------------------------------------------------------------------------
 !
   FUNCTION GET_XKER_SACCRG(I1,I2) RESULT(RET)
-    INTEGER, DIMENSION(:) :: I1
-    INTEGER, DIMENSION(:) :: I2
+    INTEGER, DIMENSION(:), INTENT(IN) :: I1
+    INTEGER, DIMENSION(:), INTENT(IN) :: I2
     REAL, DIMENSION(SIZE(I1)) :: RET
     !
     INTEGER I
@@ -351,8 +351,8 @@ CONTAINS
 !-------------------------------------------------------------------------------
 !
   FUNCTION GET_XKER_N_SACCRG(I1,I2) RESULT(RET)
-    INTEGER, DIMENSION(:) :: I1
-    INTEGER, DIMENSION(:) :: I2
+    INTEGER, DIMENSION(:), INTENT(IN) :: I1
+    INTEGER, DIMENSION(:), INTENT(IN) :: I2
     REAL, DIMENSION(SIZE(I1)) :: RET
     !
     INTEGER I
diff --git a/src/PHYEX/micro/mode_lima_sedimentation.f90 b/src/PHYEX/micro/mode_lima_sedimentation.f90
index dc6164d492aedbacd1aa7819285d9289d210e909..1efeb31919684052c0a3fe5ba224450e668fb0e9 100644
--- a/src/PHYEX/micro/mode_lima_sedimentation.f90
+++ b/src/PHYEX/micro/mode_lima_sedimentation.f90
@@ -47,12 +47,11 @@ CONTAINS
 !
 USE MODD_DIMPHYEX,         ONLY: DIMPHYEX_t
 USE MODD_CST,              ONLY: CST_t
-USE MODD_PARAMETERS,       ONLY: JPHEXT, JPVEXT
 USE MODD_PARAM_LIMA,       ONLY: XCEXVT, XRTMIN, XCTMIN, NSPLITSED,           &
                                  XLB, XLBEX, XD, XFSEDR, XFSEDC,              &
                                  XALPHAC, XNUC, XALPHAS, XNUS, LSNOW_T,       &
                                  NMOM_S
-USE MODD_PARAM_LIMA_COLD,  ONLY: XLBEXI, XLBI, XDI, XLBDAS_MAX, XBS, XEXSEDS, &
+USE MODD_PARAM_LIMA_COLD,  ONLY: XLBDAS_MAX, XBS, &
                                  XLBDAS_MIN, XTRANS_MP_GAMMAS, XFVELOS
 
 use mode_tools,            only: Countjv
diff --git a/src/PHYEX/micro/mode_lima_snow_deposition.f90 b/src/PHYEX/micro/mode_lima_snow_deposition.f90
index 0a520c063aa1e96b4c6631a836ab3c4470b62023..c45153e9e817098e2f0dbaebdd43829dd08efaf2 100644
--- a/src/PHYEX/micro/mode_lima_snow_deposition.f90
+++ b/src/PHYEX/micro/mode_lima_snow_deposition.f90
@@ -42,15 +42,11 @@ CONTAINS
 !*       0.    DECLARATIONS
 !              ------------
 !
-USE MODD_PARAM_LIMA,      ONLY : XRTMIN, XCTMIN, XALPHAI, XALPHAS, XNUI, XNUS, NMOM_I
-USE MODD_PARAM_LIMA_COLD, ONLY : XNS,XBS, &
-                                 XLBDAS_MAX, XDSCNVI_LIM, XLBDASCNVI_MAX,     &
+USE MODD_PARAM_LIMA,      ONLY : XRTMIN, XCTMIN, XALPHAS, XNUS, NMOM_I
+USE MODD_PARAM_LIMA_COLD, ONLY : XDSCNVI_LIM, XLBDASCNVI_MAX,     &
                                  XC0DEPSI, XC1DEPSI, XR0DEPSI, XR1DEPSI,      &
-                                 XSCFAC, X1DEPS, X0DEPS, XEX1DEPS, XEX0DEPS,  &
-                                 XDICNVS_LIM, XLBDAICNVS_LIM,                 &
-                                 XC0DEPIS, XC1DEPIS, XR0DEPIS, XR1DEPIS,      &
-                                 XCOLEXIS, XAGGS_CLARGE1, XAGGS_CLARGE2,      &
-                                 XAGGS_RLARGE1, XAGGS_RLARGE2, XFVELOS
+                                 X1DEPS, X0DEPS, XEX1DEPS, XEX0DEPS,  &
+                                 XFVELOS
 
 !
 IMPLICIT NONE
diff --git a/src/PHYEX/micro/mode_lima_snow_self_collection.f90 b/src/PHYEX/micro/mode_lima_snow_self_collection.f90
index 50339a87f9cfab882ee4e4ea81fea509d1aebfd2..1a3bdb581aedd1a875c96665989f8f6c1747a220 100644
--- a/src/PHYEX/micro/mode_lima_snow_self_collection.f90
+++ b/src/PHYEX/micro/mode_lima_snow_self_collection.f90
@@ -61,8 +61,8 @@ REAL, DIMENSION(SIZE(PCST)) :: &
                                            ZW2
 LOGICAL, DIMENSION(SIZE(PCST)) :: GSSC
 INTEGER :: IGSSC, JJ
-INTEGER, DIMENSION(:), ALLOCATABLE :: IVEC1,IVEC2        ! Vectors of indices
-REAL,    DIMENSION(:), ALLOCATABLE :: ZVEC1,ZVEC2, ZVEC3 ! Work vectors
+INTEGER, DIMENSION(:), ALLOCATABLE :: IVEC1        ! Vectors of indices
+REAL,    DIMENSION(:), ALLOCATABLE :: ZVEC1, ZVEC3 ! Work vectors
 !
 !-------------------------------------------------------------------------------
 !
diff --git a/src/PHYEX/micro/mode_lima_tendencies.f90 b/src/PHYEX/micro/mode_lima_tendencies.f90
index d25250bcc03b6020789d727a7b4d915fce8ef20c..cbfde662f9a2a3c67c487e313b5199da0dd7ebc1 100644
--- a/src/PHYEX/micro/mode_lima_tendencies.f90
+++ b/src/PHYEX/micro/mode_lima_tendencies.f90
@@ -72,13 +72,12 @@ CONTAINS
 !
 USE MODD_CST,              ONLY : XP00, XRD, XRV, XMD, XMV, XCPD, XCPV, XCL, XCI, XLVTT, XLSTT, XTT, &
                                   XALPW, XBETAW, XGAMW, XALPI, XBETAI, XGAMI
-USE MODD_PARAM_LIMA,       ONLY : XRTMIN, XCTMIN, XNUS, LCIBU, LRDSF,                                &
-                                  LNUCL, LACTI, LKHKO, LSNOW_T,   &
+USE MODD_PARAM_LIMA,       ONLY : XRTMIN, XCTMIN,  LCIBU, LRDSF, LKHKO, LSNOW_T, &
                                   NMOM_C, NMOM_R, NMOM_I, NMOM_S, NMOM_G, NMOM_H
 USE MODD_PARAM_LIMA_WARM,  ONLY : XLBC, XLBEXC, XLBR, XLBEXR, XCCR, XCXR
-USE MODD_PARAM_LIMA_MIXED, ONLY : XLBG, XLBEXG, XCCG, XCXG, XLBH, XLBEXH, XCCH, XCXH, XLBDAG_MAX
+USE MODD_PARAM_LIMA_MIXED, ONLY : XLBG, XLBEXG, XCCG, XCXG, XLBH, XLBEXH, XCCH, XCXH
 USE MODD_PARAM_LIMA_COLD,  ONLY : XSCFAC, XLBI, XLBEXI, XLBS, XLBEXS, XLBDAS_MAX, XTRANS_MP_GAMMAS,  &
-                                  XFVELOS, XLBDAS_MIN, XCCS, XCXS, XBS, XNS
+                                   XLBDAS_MIN, XCCS, XCXS, XBS, XNS
 !
 USE MODE_LIMA_DROPLETS_HOM_FREEZING, ONLY: LIMA_DROPLETS_HOM_FREEZING
 USE MODE_LIMA_DROPLETS_SELF_COLLECTION, ONLY: LIMA_DROPLETS_SELF_COLLECTION
diff --git a/src/PHYEX/micro/mode_lima_update_nsv.f90 b/src/PHYEX/micro/mode_lima_update_nsv.f90
new file mode 100644
index 0000000000000000000000000000000000000000..b6d507d2cb5dd8f9d14ad2e265ff658c34b00c40
--- /dev/null
+++ b/src/PHYEX/micro/mode_lima_update_nsv.f90
@@ -0,0 +1,188 @@
+!MNH_LIC Copyright 1995-2023 CNRS, Meteo-France and Universite Paul Sabatier
+!MNH_LIC This is part of the Meso-NH software governed by the CeCILL-C licence
+!MNH_LIC version 1. See LICENSE, CeCILL-C_V1-en.txt and CeCILL-C_V1-fr.txt
+!MNH_LIC for details. version 1.
+!-----------------------------------------------------------------
+MODULE MODE_LIMA_UPDATE_NSV
+!> @file
+!! This module contains code to update the NSV module variable relative to the LIMA scheme
+!
+IMPLICIT NONE
+!
+CONTAINS
+!
+SUBROUTINE LIMA_UPDATE_NSV(LDINIT, KMI, KSV, CDCLOUD, LDUPDATE)
+!!*** *LIMA_UPDATE_NSV* - update modd_nsv values realtive to LIMA
+!!
+!!*   PURPOSE
+!!    -------
+!!    The modd_nsv values relative to the LIMA scheme are initialised (if LDINIT is .TRUE)
+!!    according to the micromisics scheme used.
+!!    If LDUPDATE is .TRUE., the scalar values of modd_nsv module receive the values
+!!    assigned for the KMI model.
+!!
+!!*   METHOD
+!!    ------
+!!
+!!*   EXTERNAL
+!!    --------
+!!
+!!*   IMPLICIT ARGUMENTS
+!!    ------------------
+!!    MODD_NSV, MODD_PARAM_LIMA
+!!
+!!*   REFERENCE
+!!    ---------
+!!
+!!    AUTHOR
+!!    ------
+!!    S. Riette
+!!
+!!    MODIFICATIONS
+!!    -------------
+!!      Original    April 2023
+!-------------------------------------------------------------------------------
+!
+!*      0. DECLARATIONS
+!       ---------------
+!
+USE MODD_NSV, ONLY: NSV_LIMA_BEG_A, NSV_LIMA_END_A, NSV_LIMA_A, &
+                  & NSV_LIMA_NC_A, NSV_LIMA_NR_A, NSV_LIMA_NI_A, NSV_LIMA_NS_A, NSV_LIMA_NG_A, NSV_LIMA_NH_A, &
+                  & NSV_LIMA_CCN_FREE_A, NSV_LIMA_CCN_ACTI_A, NSV_LIMA_SCAVMASS_A, &
+                  & NSV_LIMA_IFN_FREE_A, NSV_LIMA_IFN_NUCL_A, NSV_LIMA_IMM_NUCL_A, &
+                  & NSV_LIMA_HOM_HAZE_A, NSV_LIMA_SPRO_A, &
+                  & NSV_LIMA_BEG, NSV_LIMA_END, NSV_LIMA, &
+                  & NSV_LIMA_NC, NSV_LIMA_NR, NSV_LIMA_NI, NSV_LIMA_NS, NSV_LIMA_NG, NSV_LIMA_NH, &
+                  & NSV_LIMA_CCN_FREE, NSV_LIMA_CCN_ACTI, NSV_LIMA_SCAVMASS, &
+                  & NSV_LIMA_IFN_FREE, NSV_LIMA_IFN_NUCL, NSV_LIMA_IMM_NUCL, &
+                  & NSV_LIMA_HOM_HAZE, NSV_LIMA_SPRO
+USE MODD_PARAM_LIMA,      ONLY: NMOD_CCN, LSCAV, LAERO_MASS, &
+                                NMOD_IFN, NMOD_IMM, LHHONI, &
+                                LSPRO,  &
+                                NMOM_C, NMOM_R, NMOM_I, NMOM_S, NMOM_G, NMOM_H
+!
+!* 0.1. Declaration of arguments
+!       ------------------------
+!
+IMPLICIT NONE
+LOGICAL,          INTENT(IN)    :: LDINIT   !< .TRUE. to fill the different NSV_LIMA_*_A arrays
+INTEGER,          INTENT(IN)    :: KMI      !< model number
+INTEGER,          INTENT(INOUT) :: KSV      !< IN: Initial value to use when filling the NSV_LIMA_*_A arrays; 
+                                            !! OUT: Final value after having filled the arrays
+CHARACTER(LEN=4), INTENT(IN)    :: CDCLOUD  !< Cloud scheme
+LOGICAL,          INTENT(IN)    :: LDUPDATE !< .TRUE. to goto model
+!
+!*      1. INITIALISATION
+!       -----------------
+!
+IF(LDINIT) THEN
+  IF(CDCLOUD=='LIMA') THEN
+    KSV = KSV+1
+    NSV_LIMA_BEG_A(KMI) = KSV
+    ! Nc
+    IF (NMOM_C.GE.2) THEN
+      NSV_LIMA_NC_A(KMI) = KSV
+      KSV = KSV+1
+    END IF
+    ! Nr
+    IF (NMOM_R.GE.2) THEN
+      NSV_LIMA_NR_A(KMI) = KSV
+      KSV = KSV+1
+    END IF
+    ! CCN
+    IF (NMOD_CCN .GT. 0) THEN
+      NSV_LIMA_CCN_FREE_A(KMI) = KSV
+      KSV = KSV + NMOD_CCN
+      NSV_LIMA_CCN_ACTI_A(KMI) = KSV
+      KSV = KSV + NMOD_CCN
+    END IF
+    ! Scavenging
+    IF (LSCAV .AND. LAERO_MASS) THEN
+      NSV_LIMA_SCAVMASS_A(KMI) = KSV
+      KSV = KSV+1
+    END IF
+    ! Ni
+    IF (NMOM_I.GE.2) THEN
+      NSV_LIMA_NI_A(KMI) = KSV
+      KSV = KSV+1
+    END IF
+    ! Ns
+    IF (NMOM_S.GE.2) THEN
+      NSV_LIMA_NS_A(KMI) = KSV
+      KSV = KSV+1
+    END IF
+    ! Ng
+    IF (NMOM_G.GE.2) THEN
+      NSV_LIMA_NG_A(KMI) = KSV
+      KSV = KSV+1
+    END IF
+    ! Nh
+    IF (NMOM_H.GE.2) THEN
+      NSV_LIMA_NH_A(KMI) = KSV
+      KSV = KSV+1
+    END IF
+    ! IFN
+    IF (NMOD_IFN .GT. 0) THEN
+      NSV_LIMA_IFN_FREE_A(KMI) = KSV
+      KSV = KSV + NMOD_IFN
+      NSV_LIMA_IFN_NUCL_A(KMI) = KSV
+      KSV = KSV + NMOD_IFN
+    END IF
+    ! IMM
+    IF (NMOD_IMM .GT. 0) THEN
+      NSV_LIMA_IMM_NUCL_A(KMI) = KSV
+      KSV = KSV + MAX(1,NMOD_IMM)
+    END IF
+    ! Homogeneous freezing of CCN
+    IF (LHHONI) THEN
+      NSV_LIMA_HOM_HAZE_A(KMI) = KSV
+      KSV = KSV + 1
+    END IF
+    ! Supersaturation
+    IF (LSPRO) THEN
+      NSV_LIMA_SPRO_A(KMI) = KSV
+      KSV = KSV + 1
+    END IF
+    !
+    ! End and total variables
+    !
+    KSV = KSV - 1
+    NSV_LIMA_END_A(KMI) = KSV
+    NSV_LIMA_A(KMI) = NSV_LIMA_END_A(KMI) - NSV_LIMA_BEG_A(KMI) + 1
+  ELSE
+    NSV_LIMA_A(KMI)    = 0
+    !
+    ! force First index to be superior to last index
+    ! in order to create a null section
+    !
+    NSV_LIMA_BEG_A(KMI) = 1
+    NSV_LIMA_END_A(KMI) = 0
+  ENDIF
+ENDIF
+!
+!*      2. UPDATE
+!       ---------
+!
+IF(LDUPDATE) THEN
+  NSV_LIMA          = NSV_LIMA_A(KMI)
+  NSV_LIMA_BEG      = NSV_LIMA_BEG_A(KMI)
+  NSV_LIMA_END      = NSV_LIMA_END_A(KMI)
+  NSV_LIMA_NC       = NSV_LIMA_NC_A(KMI)
+  NSV_LIMA_NR       = NSV_LIMA_NR_A(KMI)
+  NSV_LIMA_CCN_FREE = NSV_LIMA_CCN_FREE_A(KMI)
+  NSV_LIMA_CCN_ACTI = NSV_LIMA_CCN_ACTI_A(KMI)
+  NSV_LIMA_SCAVMASS = NSV_LIMA_SCAVMASS_A(KMI)
+  NSV_LIMA_NI       = NSV_LIMA_NI_A(KMI)
+  NSV_LIMA_NS       = NSV_LIMA_NS_A(KMI)
+  NSV_LIMA_NG       = NSV_LIMA_NG_A(KMI)
+  NSV_LIMA_NH       = NSV_LIMA_NH_A(KMI)
+  NSV_LIMA_IFN_FREE = NSV_LIMA_IFN_FREE_A(KMI)
+  NSV_LIMA_IFN_NUCL = NSV_LIMA_IFN_NUCL_A(KMI)
+  NSV_LIMA_IMM_NUCL = NSV_LIMA_IMM_NUCL_A(KMI)
+  NSV_LIMA_HOM_HAZE = NSV_LIMA_HOM_HAZE_A(KMI)
+  NSV_LIMA_SPRO     = NSV_LIMA_SPRO_A(KMI)
+ENDIF
+!
+END SUBROUTINE LIMA_UPDATE_NSV
+!
+END MODULE MODE_LIMA_UPDATE_NSV
diff --git a/src/PHYEX/micro/mode_nrcolss.f90 b/src/PHYEX/micro/mode_nrcolss.f90
index 3da87d0a49abb048b03c968b8334228ac906dd62..85d083bb430cb7a33f13abc9fa02e0fea7d8a36c 100644
--- a/src/PHYEX/micro/mode_nrcolss.f90
+++ b/src/PHYEX/micro/mode_nrcolss.f90
@@ -87,7 +87,7 @@ CONTAINS
 USE MODI_GENERAL_GAMMA
 !
 USE MODD_CST
-USE MODD_RAIN_ICE_DESCR
+USE MODD_RAIN_ICE_DESCR_n
 !
 IMPLICIT NONE
 !
diff --git a/src/PHYEX/micro/mode_nscolrg.f90 b/src/PHYEX/micro/mode_nscolrg.f90
index 593d838d6951769c140653ea40fecdaac2352948..f3d3a8e911c69bc2b473ce5b6d35ec80cf52bb84 100644
--- a/src/PHYEX/micro/mode_nscolrg.f90
+++ b/src/PHYEX/micro/mode_nscolrg.f90
@@ -86,7 +86,7 @@ CONTAINS
 USE MODI_GENERAL_GAMMA
 !
 USE MODD_CST
-USE MODD_RAIN_ICE_DESCR
+USE MODD_RAIN_ICE_DESCR_n
 !
 IMPLICIT NONE
 !
diff --git a/src/PHYEX/micro/mode_qsatmx_tab.f90 b/src/PHYEX/micro/mode_qsatmx_tab.f90
index 01d697b19bdeeb1cc011c4826e8c37da037cb944..9e2c333735104e66e635cd3c205db2623b2f6994 100644
--- a/src/PHYEX/micro/mode_qsatmx_tab.f90
+++ b/src/PHYEX/micro/mode_qsatmx_tab.f90
@@ -3,7 +3,6 @@ IMPLICIT NONE
 CONTAINS
 FUNCTION QSATMX_TAB(P,T,FICE)
 
-  USE PARKIND1, ONLY : JPRB
   USE MODD_CST ,ONLY : XEPSILO
   USE MODE_TIWMX, ONLY : ESATI,ESATW
 
diff --git a/src/PHYEX/micro/mode_read_xker_gweth.f90 b/src/PHYEX/micro/mode_read_xker_gweth.f90
index c0e18f57e5bfad43bc9fe712abfcf7a5e2774595..bca7bc043c5d7eb9774ac03e54c2685dd5f5942a 100644
--- a/src/PHYEX/micro/mode_read_xker_gweth.f90
+++ b/src/PHYEX/micro/mode_read_xker_gweth.f90
@@ -12,8 +12,7 @@ CONTAINS
                     PWETLBDAH_MAX,PWETLBDAG_MAX,PWETLBDAH_MIN,PWETLBDAG_MIN, &
                     PFDINFTY,PKER_GWETH                                      )
 !DEC$ OPTIMIZE:0
-      USE PARKIND1, ONLY : JPRB
-      USE YOMHOOK , ONLY : LHOOK, DR_HOOK
+      USE YOMHOOK , ONLY : LHOOK, DR_HOOK, JPHOOK
 !     ########################################################################
 !
 !!****  * * - initialize the kernels for the graupel-hail wet growth process
@@ -81,7 +80,7 @@ REAL, DIMENSION(:,:), INTENT(OUT), OPTIONAL :: PKER_GWETH
 ! #INSERT HERE THE OUTPUT OF INI_RAIN_ICE_HAIL IF THE KERNELS ARE UPDATED#
 ! ########################################################################
 !
-REAL(KIND=JPRB) :: ZHOOK_HANDLE
+REAL(KIND=JPHOOK) :: ZHOOK_HANDLE
 IF (LHOOK) CALL DR_HOOK('READ_XKER_GWETH',0,ZHOOK_HANDLE)
 KND= 50
 KWETLBDAH= 40
diff --git a/src/PHYEX/micro/mode_read_xker_raccs.f90 b/src/PHYEX/micro/mode_read_xker_raccs.f90
index 8ca45d9bfacfaee372868359d79a73fddbed233f..eeae9e13d8991d2b73ad9fe99bd75abeb5035d07 100644
--- a/src/PHYEX/micro/mode_read_xker_raccs.f90
+++ b/src/PHYEX/micro/mode_read_xker_raccs.f90
@@ -12,8 +12,7 @@ CONTAINS
                       PACCLBDAS_MAX,PACCLBDAR_MAX,PACCLBDAS_MIN,PACCLBDAR_MIN, &
                       PFDINFTY,PKER_RACCSS,PKER_RACCS,PKER_SACCRG              )
 !DEC$ OPTIMIZE:0
-      USE PARKIND1, ONLY : JPRB
-      USE YOMHOOK , ONLY : LHOOK, DR_HOOK
+      USE YOMHOOK , ONLY : LHOOK, DR_HOOK, JPHOOK
 !     ##########################################################################
 !
 !!****  * * - initialize the kernels for the rain-snow accretion process
@@ -85,7 +84,7 @@ REAL, DIMENSION(:,:), INTENT(OUT), OPTIONAL :: PKER_SACCRG
 ! #INSERT HERE THE OUTPUT OF INI_RAIN_ICE IF THE KERNELS ARE UPDATED#
 ! ###################################################################
 !
-REAL(KIND=JPRB) :: ZHOOK_HANDLE
+REAL(KIND=JPHOOK) :: ZHOOK_HANDLE
 IF (LHOOK) CALL DR_HOOK('READ_XKER_RACCS',0,ZHOOK_HANDLE)
 KND= 50
 KACCLBDAS= 40
diff --git a/src/PHYEX/micro/mode_read_xker_rdryg.f90 b/src/PHYEX/micro/mode_read_xker_rdryg.f90
index 4ab0f47df6a4fd4cc7d263dacdc8385ddf49d8d0..20e0f6a45a3f2ee59fb6466124f750b30dcdf418 100644
--- a/src/PHYEX/micro/mode_read_xker_rdryg.f90
+++ b/src/PHYEX/micro/mode_read_xker_rdryg.f90
@@ -18,8 +18,7 @@ CONTAINS
                     PDRYLBDAG_MAX,PDRYLBDAR_MAX,PDRYLBDAG_MIN,PDRYLBDAR_MIN, &
                     PFDINFTY,PKER_RDRYG                                      )
 !DEC$ OPTIMIZE:0
-      USE PARKIND1, ONLY : JPRB
-      USE YOMHOOK , ONLY : LHOOK, DR_HOOK
+      USE YOMHOOK , ONLY : LHOOK, DR_HOOK, JPHOOK
 !     ########################################################################
 !
 !!****  * * - initialize the kernels for the snow-graupel dry growth process
@@ -86,7 +85,7 @@ REAL, DIMENSION(:,:), INTENT(OUT), OPTIONAL :: PKER_RDRYG
 ! #INSERT HERE THE OUTPUT OF INI_RAIN_ICE IF THE KERNELS ARE UPDATED#
 ! ###################################################################
 !
-REAL(KIND=JPRB) :: ZHOOK_HANDLE
+REAL(KIND=JPHOOK) :: ZHOOK_HANDLE
 IF (LHOOK) CALL DR_HOOK('READ_XKER_RDRYG',0,ZHOOK_HANDLE)
 KND= 50
 KDRYLBDAG= 40
diff --git a/src/PHYEX/micro/mode_read_xker_rweth.f90 b/src/PHYEX/micro/mode_read_xker_rweth.f90
index 9f04157ad7bf94878e24ab0bc57ccb2c8438a3b9..1d011283bfe775421fbb8d5b8afaa32d86b32741 100644
--- a/src/PHYEX/micro/mode_read_xker_rweth.f90
+++ b/src/PHYEX/micro/mode_read_xker_rweth.f90
@@ -12,8 +12,7 @@ CONTAINS
                     PWETLBDAH_MAX,PWETLBDAR_MAX,PWETLBDAH_MIN,PWETLBDAR_MIN, &
                     PFDINFTY,PKER_RWETH                                      )
 !DEC$ OPTIMIZE:0
-      USE PARKIND1, ONLY : JPRB
-      USE YOMHOOK , ONLY : LHOOK, DR_HOOK
+      USE YOMHOOK , ONLY : LHOOK, DR_HOOK, JPHOOK
 !     ########################################################################
 !
 !!****  * * - initialize the kernels for the rain-hail wet growth process
@@ -80,7 +79,7 @@ REAL, DIMENSION(:,:), INTENT(OUT), OPTIONAL :: PKER_RWETH
 ! #INSERT HERE THE OUTPUT OF INI_RAIN_ICE IF THE KERNELS ARE UPDATED#
 ! ###################################################################
 !
-REAL(KIND=JPRB) :: ZHOOK_HANDLE
+REAL(KIND=JPHOOK) :: ZHOOK_HANDLE
 IF (LHOOK) CALL DR_HOOK('READ_XKER_RWETH',0,ZHOOK_HANDLE)
 KND= 50
 KWETLBDAH= 40
diff --git a/src/PHYEX/micro/mode_read_xker_sdryg.f90 b/src/PHYEX/micro/mode_read_xker_sdryg.f90
index 088e569cd1b552ed48b8007d4fec57c04537ab2d..bb46c16be3eec47e6b274862f5951cec78b0956b 100644
--- a/src/PHYEX/micro/mode_read_xker_sdryg.f90
+++ b/src/PHYEX/micro/mode_read_xker_sdryg.f90
@@ -12,8 +12,7 @@ CONTAINS
                     PDRYLBDAG_MAX,PDRYLBDAS_MAX,PDRYLBDAG_MIN,PDRYLBDAS_MIN, &
                     PFDINFTY,PKER_SDRYG                                      )
 !DEC$ OPTIMIZE:0
-      USE PARKIND1, ONLY : JPRB
-      USE YOMHOOK , ONLY : LHOOK, DR_HOOK
+      USE YOMHOOK , ONLY : LHOOK, DR_HOOK, JPHOOK
 !     ########################################################################
 !
 !!****  * * - initialize the kernels for the snow-graupel dry growth process
@@ -82,7 +81,7 @@ REAL, DIMENSION(:,:), INTENT(OUT), OPTIONAL :: PKER_SDRYG
 ! #INSERT HERE THE OUTPUT OF INI_RAIN_ICE IF THE KERNELS ARE UPDATED#
 ! ###################################################################
 !
-REAL(KIND=JPRB) :: ZHOOK_HANDLE
+REAL(KIND=JPHOOK) :: ZHOOK_HANDLE
 IF (LHOOK) CALL DR_HOOK('READ_XKER_SDRYG',0,ZHOOK_HANDLE)
 KND= 50
 KDRYLBDAG= 40
diff --git a/src/PHYEX/micro/mode_read_xker_sweth.f90 b/src/PHYEX/micro/mode_read_xker_sweth.f90
index 48d4b1aa4fdaaff9a24e2096f9ddd1e1137624c7..a10c94f466f70d1a44b1dabae9c8e69d3cb4f3fe 100644
--- a/src/PHYEX/micro/mode_read_xker_sweth.f90
+++ b/src/PHYEX/micro/mode_read_xker_sweth.f90
@@ -12,8 +12,7 @@ CONTAINS
                     PWETLBDAH_MAX,PWETLBDAS_MAX,PWETLBDAH_MIN,PWETLBDAS_MIN, &
                     PFDINFTY,PKER_SWETH                                      )
 !DEC$ OPTIMIZE:0
-      USE PARKIND1, ONLY : JPRB
-      USE YOMHOOK , ONLY : LHOOK, DR_HOOK
+      USE YOMHOOK , ONLY : LHOOK, DR_HOOK, JPHOOK
 !     ########################################################################
 !
 !!****  * * - initialize the kernels for the snow-hail wet growth process
@@ -82,7 +81,7 @@ REAL, DIMENSION(:,:), INTENT(OUT), OPTIONAL :: PKER_SWETH
 ! #INSERT HERE THE OUTPUT OF INI_RAIN_ICE_HAIL IF THE KERNELS ARE UPDATED#
 ! ########################################################################
 !
-REAL(KIND=JPRB) :: ZHOOK_HANDLE
+REAL(KIND=JPHOOK) :: ZHOOK_HANDLE
 IF (LHOOK) CALL DR_HOOK('READ_XKER_SWETH',0,ZHOOK_HANDLE)
 KND= 50
 KWETLBDAH= 40
diff --git a/src/PHYEX/micro/mode_rrcolss.f90 b/src/PHYEX/micro/mode_rrcolss.f90
index bfeaa1adb56745853e3da69cb13334c27da8e29f..78413f699b76884a7b3593335837b961f81ded3f 100644
--- a/src/PHYEX/micro/mode_rrcolss.f90
+++ b/src/PHYEX/micro/mode_rrcolss.f90
@@ -13,8 +13,7 @@ CONTAINS
                          PESR, PEXMASSR, PFALLS, PEXFALLS, PFALLEXPS, PFALLR, PEXFALLR, &
                          PLBDASMAX, PLBDARMAX, PLBDASMIN, PLBDARMIN,         &
                          PDINFTY, PRRCOLSS, PAG, PBS, PAS                    )
-      USE PARKIND1, ONLY : JPRB
-      USE YOMHOOK , ONLY : LHOOK, DR_HOOK
+      USE YOMHOOK , ONLY : LHOOK, DR_HOOK, JPHOOK
 !     ########################################################################
 !
 !
@@ -92,7 +91,7 @@ CONTAINS
 USE MODI_GENERAL_GAMMA
 !
 USE MODD_CST
-USE MODD_RAIN_ICE_DESCR
+USE MODD_RAIN_ICE_DESCR_n
 !
 IMPLICIT NONE
 !
@@ -177,7 +176,7 @@ REAL :: ZCST1
 !
 !*       1.0     Initialization
 !
-REAL(KIND=JPRB) :: ZHOOK_HANDLE
+REAL(KIND=JPHOOK) :: ZHOOK_HANDLE
 IF (LHOOK) CALL DR_HOOK('RRCOLSS',0,ZHOOK_HANDLE)
 PRRCOLSS(:,:) = 0.0
 ZCST1 = (3.0/XPI)/XRHOLW
@@ -243,21 +242,25 @@ DO JLBDAS = 1,SIZE(PRRCOLSS(:,:),1)
           END IF
           DO JDR = 1,INR-1
             ZDR = ZDDCOLLR * REAL(JDR)
+#ifdef REPRO48
             ZCOLLR = ZCOLLR + (ZDS+ZDR)**2 * ZDR**PEXMASSR                     &
-#if defined(REPRO48) 
                        * PESR * ABS(PFALLS*ZDS**PEXFALLS-PFALLR*ZDR**PEXFALLR) &
+                                      * GENERAL_GAMMA(PALPHAR,PNUR,ZLBDAR,ZDR)
 #else
+            ZCOLLR = ZCOLLR + (ZDS+ZDR)**2 * ZDR**PEXMASSR                     &
                        * PESR * ABS(PFALLS*ZDS**PEXFALLS * EXP(-(PFALLEXPS*ZDS)**PALPHAS)-PFALLR*ZDR**PEXFALLR) &
-#endif
                                       * GENERAL_GAMMA(PALPHAR,PNUR,ZLBDAR,ZDR)
+#endif
           END DO
+#ifdef REPRO48
           ZCOLLDRMAX = (ZDS+ZDRMAX)**2 * ZDRMAX**PEXMASSR                      &
-#if defined(REPRO48) 
                     * PESR * ABS(PFALLS*ZDS**PEXFALLS-PFALLR*ZDRMAX**PEXFALLR) &
+                                   * GENERAL_GAMMA(PALPHAR,PNUR,ZLBDAR,ZDRMAX)
 #else
+          ZCOLLDRMAX = (ZDS+ZDRMAX)**2 * ZDRMAX**PEXMASSR                      &
                     * PESR * ABS(PFALLS*ZDS**PEXFALLS* EXP(-(PFALLEXPS*ZDS)**PALPHAS)-PFALLR*ZDRMAX**PEXFALLR) &
-#endif
                                    * GENERAL_GAMMA(PALPHAR,PNUR,ZLBDAR,ZDRMAX)
+#endif
           ZCOLLR = (ZCOLLR + 0.5*ZCOLLDRMAX)*(ZDDCOLLR/ZDDSCALR)
 !
 !*       1.9     Compute the normalization factor by integration over the
diff --git a/src/PHYEX/micro/mode_rscolrg.f90 b/src/PHYEX/micro/mode_rscolrg.f90
index 77e00251fce73e7531074f6bf3bd382245cf8f1e..2eb4d272a0535136b954cdcecb2b188689061615 100644
--- a/src/PHYEX/micro/mode_rscolrg.f90
+++ b/src/PHYEX/micro/mode_rscolrg.f90
@@ -13,8 +13,7 @@ CONTAINS
                          PESR, PEXMASSS, PFALLS, PEXFALLS, PFALLEXPS, PFALLR, PEXFALLR, &
                          PLBDASMAX, PLBDARMAX, PLBDASMIN, PLBDARMIN,         &
                          PDINFTY, PRSCOLRG,PAG, PBS, PAS                     )
-      USE PARKIND1, ONLY : JPRB
-      USE YOMHOOK , ONLY : LHOOK, DR_HOOK
+      USE YOMHOOK , ONLY : LHOOK, DR_HOOK, JPHOOK
 !     ########################################################################
 !
 !
@@ -91,7 +90,7 @@ CONTAINS
 USE MODI_GENERAL_GAMMA
 !
 USE MODD_CST
-USE MODD_RAIN_ICE_DESCR
+USE MODD_RAIN_ICE_DESCR_n
 !
 IMPLICIT NONE
 !
@@ -174,7 +173,7 @@ REAL :: ZCST1
 !
 !*       1.0     Initialization
 !
-REAL(KIND=JPRB) :: ZHOOK_HANDLE
+REAL(KIND=JPHOOK) :: ZHOOK_HANDLE
 IF (LHOOK) CALL DR_HOOK('RSCOLRG',0,ZHOOK_HANDLE)
 PRSCOLRG(:,:) = 0.0
 ZCST1  = (3.0/XPI)/XRHOLW
@@ -236,20 +235,24 @@ DO JLBDAR = 1,SIZE(PRSCOLRG(:,:),1)
           ZDDCOLLR = (ZDRMAX-ZDRMIN) / REAL(INR)
           DO JDR = 1,INR-1
             ZDR = ZDDCOLLR * REAL(JDR) + ZDRMIN
+#ifdef REPRO48
             ZCOLLR = ZCOLLR + (ZDS+ZDR)**2                                     &
                        * GENERAL_GAMMA(PALPHAR,PNUR,ZLBDAR,ZDR)                &
-#if defined(REPRO48) 
                          * PESR * ABS(PFALLS*ZDS**PEXFALLS-PFALLR*ZDR**PEXFALLR)
 #else
+            ZCOLLR = ZCOLLR + (ZDS+ZDR)**2                                     &
+                       * GENERAL_GAMMA(PALPHAR,PNUR,ZLBDAR,ZDR)                &
                          * PESR * ABS(PFALLS*ZDS**PEXFALLS*EXP(-(ZDS*PFALLEXPS)**PALPHAS)-PFALLR*ZDR**PEXFALLR)
 #endif
           END DO
           IF( ZDRMIN>0.0 ) THEN
+#ifdef REPRO48
             ZCOLLDRMIN = (ZDS+ZDRMIN)**2                                       &
                       * GENERAL_GAMMA(PALPHAR,PNUR,ZLBDAR,ZDRMIN)              &
-#if defined(REPRO48) 
                       * PESR * ABS(PFALLS*ZDS**PEXFALLS-PFALLR*ZDRMIN**PEXFALLR)
 #else
+            ZCOLLDRMIN = (ZDS+ZDRMIN)**2                                       &
+                      * GENERAL_GAMMA(PALPHAR,PNUR,ZLBDAR,ZDRMIN)              &
                       * PESR * ABS(PFALLS*ZDS**PEXFALLS*EXP(-(ZDS*PFALLEXPS)**PALPHAS)-PFALLR*ZDRMIN**PEXFALLR)
 #endif
             ELSE
diff --git a/src/PHYEX/micro/mode_rzcolx.f90 b/src/PHYEX/micro/mode_rzcolx.f90
index 3370bc01fc979498af1073544a4b7efa7013c3f6..f3ef464948915356ab5f1884b0a0af8e18e604ef 100644
--- a/src/PHYEX/micro/mode_rzcolx.f90
+++ b/src/PHYEX/micro/mode_rzcolx.f90
@@ -14,8 +14,7 @@ CONTAINS
                          PFALLZ, PEXFALLZ, PFALLEXPZ,                        &
 		         PLBDAXMAX, PLBDAZMAX, PLBDAXMIN, PLBDAZMIN,         &
                          PDINFTY, PRZCOLX                                    )
-      USE PARKIND1, ONLY : JPRB
-      USE YOMHOOK , ONLY : LHOOK, DR_HOOK
+      USE YOMHOOK , ONLY : LHOOK, DR_HOOK, JPHOOK
 !     ########################################################################
 !
 !
@@ -173,7 +172,7 @@ REAL    :: ZFUNC   ! Ancillary function
 !
 !*       1.1     Compute the growth rate of the slope factors LAMBDA
 !
-REAL(KIND=JPRB) :: ZHOOK_HANDLE
+REAL(KIND=JPHOOK) :: ZHOOK_HANDLE
 IF (LHOOK) CALL DR_HOOK('RZCOLX',0,ZHOOK_HANDLE)
 ZDLBDAX = EXP( LOG(PLBDAXMAX/PLBDAXMIN)/REAL(SIZE(PRZCOLX(:,:),1)-1) )
 ZDLBDAZ = EXP( LOG(PLBDAZMAX/PLBDAZMIN)/REAL(SIZE(PRZCOLX(:,:),2)-1) )
@@ -215,7 +214,7 @@ DO JLBDAX = 1,SIZE(PRZCOLX(:,:),1)
 !*       1.7     Compute the scaled fall speed difference by integration over
 !                the dimensional spectrum of specy Z
 !
-#if defined(REPRO48) 
+#ifdef REPRO48
         ZCOLLZ = ZCOLLZ + ZFUNC                                               &
                         * PEXZ * ABS(PFALLX*ZDX**PEXFALLX-PFALLZ*ZDZ**PEXFALLZ)
 #else
diff --git a/src/PHYEX/micro/mode_set_conc_lima.f90 b/src/PHYEX/micro/mode_set_conc_lima.f90
index 6c132a78edde92569f54a608e1d145f4ad1ebb8e..c7ffbfc6efe0b98ed56b2e9907e33e2645007642 100644
--- a/src/PHYEX/micro/mode_set_conc_lima.f90
+++ b/src/PHYEX/micro/mode_set_conc_lima.f90
@@ -12,7 +12,7 @@ implicit none
 contains
 
 !     ###########################################################################
-      SUBROUTINE SET_CONC_LIMA( kmi, HGETCLOUD, PRHODREF, PRT, PSVT )
+      SUBROUTINE SET_CONC_LIMA( kmi, HGETCLOUD, PRHODREF, PRT, PSVT, LDLBC )
 !     ###########################################################################
 !
 !!****  *SET_CONC_LIMA * - initialize droplet, raindrop and ice
@@ -73,16 +73,13 @@ contains
 !*       0.    DECLARATIONS
 !              ------------
 !
-USE MODD_PARAM_LIMA,      ONLY : XRTMIN, XCTMIN, NMOD_CCN, NMOD_IFN, &
+USE MODD_PARAM_LIMA,      ONLY : NMOD_CCN, NMOD_IFN, &
                                  NMOM_C, NMOM_R, NMOM_I
-USE MODD_PARAM_LIMA_COLD, ONLY : XAI, XBI, XAS, XBS
+USE MODD_PARAM_LIMA_COLD, ONLY : XAS, XBS
 USE MODD_PARAM_LIMA_MIXED,ONLY : XAG, XBG, XAH, XBH
-USE MODD_NSV,             ONLY : NSV_LIMA_BEG_A, NSV_LIMA_NC_A, NSV_LIMA_NR_A, NSV_LIMA_CCN_ACTI_A, &
-                                 NSV_LIMA_NI_A, NSV_LIMA_NS_A, NSV_LIMA_NG_A, NSV_LIMA_NH_A, NSV_LIMA_IFN_NUCL_A, &
-                                 NSV_LIMA_BEG, NSV_LIMA_NC, NSV_LIMA_NR, NSV_LIMA_CCN_ACTI, &
+USE MODD_NSV,             ONLY : NSV_LIMA_BEG, NSV_LIMA_NC, NSV_LIMA_NR, NSV_LIMA_CCN_ACTI, &
                                  NSV_LIMA_NI, NSV_LIMA_NS, NSV_LIMA_NG, NSV_LIMA_NH, NSV_LIMA_IFN_NUCL
-USE MODD_CST,             ONLY : XPI, XRHOLW, XRHOLI
-USE MODD_CONF,            ONLY : NVERB
+USE MODD_CST,             ONLY : XPI, XRHOLW
 !
 IMPLICIT NONE
 !
@@ -95,6 +92,7 @@ REAL, DIMENSION(:,:,:),    INTENT(IN) :: PRHODREF   ! Reference density
 REAL, DIMENSION(:,:,:,:),  INTENT(INOUT) :: PRT     ! microphysical mixing ratios
 !
 REAL,  DIMENSION(:,:,:,:), INTENT(INOUT) :: PSVT     ! microphys. concentrations
+LOGICAL, OPTIONAL,         INTENT(IN)    :: LDLBC    ! T to activate LBC mode
 !
 !
 !*       0.2   Declarations of local variables :
@@ -102,6 +100,8 @@ REAL,  DIMENSION(:,:,:,:), INTENT(INOUT) :: PSVT     ! microphys. concentrations
 REAL       :: ZCONC
 INTEGER    :: ISV_LIMA_NC, ISV_LIMA_NR, ISV_LIMA_CCN_ACTI
 INTEGER    :: ISV_LIMA_NI, ISV_LIMA_NS, ISV_LIMA_NG, ISV_LIMA_NH, ISV_LIMA_IFN_NUCL
+LOGICAL    :: LLLBC
+REAL       :: ZSVTHR
 !
 !-------------------------------------------------------------------------------
 !*       1.    RETRIEVE LOGICAL UNIT NUMBER
@@ -119,24 +119,32 @@ ISV_LIMA_IFN_NUCL = NSV_LIMA_IFN_NUCL - NSV_LIMA_BEG + 1
 !*       2.    INITIALIZATION
 !              --------------
 !
+LLLBC=.FALSE.
+IF(PRESENT(LDLBC)) LLLBC=LDLBC
+IF(LLLBC) THEN
+  ZSVTHR=1.E-11 ! valid value to check
+ELSE
+  ZSVTHR=1.E20  ! to deactivate this test
+ENDIF
+!
 IF (NMOM_C.GE.2) THEN
 !
 !  droplets
 !
    ZCONC = 300.E6 ! droplet concentration set at 300 cm-3
-   WHERE ( PRT(:,:,:,2) > 1.E-11 )
+   WHERE ( PRT(:,:,:,2) > 1.E-11 .AND. PSVT(:,:,:,ISV_LIMA_NC)<ZSVTHR)
       PSVT(:,:,:,ISV_LIMA_NC) = ZCONC
    END WHERE
-   WHERE ( PRT(:,:,:,2) <= 1.E-11 )
+   WHERE ( PRT(:,:,:,2) <= 1.E-11  .AND. PSVT(:,:,:,ISV_LIMA_NC)<ZSVTHR)
       PRT(:,:,:,2)  = 0.0
       PSVT(:,:,:,ISV_LIMA_NC) = 0.0
    END WHERE
    
    IF (NMOD_CCN .GE. 1) THEN
-      WHERE ( PRT(:,:,:,2) > 1.E-11 )
+      WHERE ( PRT(:,:,:,2) > 1.E-11  .AND. PSVT(:,:,:,ISV_LIMA_NC)<ZSVTHR)
          PSVT(:,:,:,ISV_LIMA_CCN_ACTI) = ZCONC
       END WHERE
-      WHERE ( PRT(:,:,:,2) <= 1.E-11 )
+      WHERE ( PRT(:,:,:,2) <= 1.E-11  .AND. PSVT(:,:,:,ISV_LIMA_NC)<ZSVTHR)
          PSVT(:,:,:,ISV_LIMA_CCN_ACTI) = 0.0
       END WHERE
    END IF
@@ -151,11 +159,11 @@ IF (NMOM_R.GE.2) THEN
    IF (HGETCLOUD == 'INI1') THEN ! init from REVE scheme
       PSVT(:,:,:,ISV_LIMA_NR) = 0.0
    ELSE ! init from KESS, ICE3...
-      WHERE ( PRT(:,:,:,3) > 1.E-11 )
+      WHERE ( PRT(:,:,:,3) > 1.E-11 .AND. PSVT(:,:,:,ISV_LIMA_NR)<ZSVTHR )
          PSVT(:,:,:,ISV_LIMA_NR) = MAX( SQRT(SQRT(PRHODREF(:,:,:)*PRT(:,:,:,3) &
               *ZCONC)),1. )
       END WHERE
-      WHERE ( PRT(:,:,:,3) <= 1.E-11 )
+      WHERE ( PRT(:,:,:,3) <= 1.E-11 .AND. PSVT(:,:,:,ISV_LIMA_NR)<ZSVTHR )
          PRT(:,:,:,3)  = 0.0
          PSVT(:,:,:,ISV_LIMA_NR) = 0.0
       END WHERE
@@ -167,7 +175,7 @@ IF (NMOM_I.GE.2) THEN
 ! ice crystals
 !
    ZCONC = 100.E3 ! maximum ice concentration set at 100/L
-   WHERE ( PRT(:,:,:,4) > 1.E-11 )
+   WHERE ( PRT(:,:,:,4) > 1.E-11 .AND. PSVT(:,:,:,ISV_LIMA_NI)<ZSVTHR )
 !
 !      PSVT(:,:,:,NSV_LIMA_NI_A(kmi)) = MIN( PRHODREF(:,:,:) /                                     &
 !           ( XRHOLI * XAI*(10.E-06)**XBI * PRT(:,:,:,4) ), &
@@ -175,16 +183,16 @@ IF (NMOM_I.GE.2) THEN
 ! Correction
       PSVT(:,:,:,ISV_LIMA_NI) = MIN(PRT(:,:,:,4)/(0.82*(10.E-06)**2.5),ZCONC )
    END WHERE
-   WHERE ( PRT(:,:,:,4) <= 1.E-11 )
+   WHERE ( PRT(:,:,:,4) <= 1.E-11 .AND. PSVT(:,:,:,ISV_LIMA_NI)<ZSVTHR )
       PRT(:,:,:,4)  = 0.0
       PSVT(:,:,:,ISV_LIMA_NI) = 0.0
    END WHERE
 
    IF (NMOD_IFN .GE. 1) THEN
-      WHERE ( PRT(:,:,:,4) > 1.E-11 )
+      WHERE ( PRT(:,:,:,4) > 1.E-11 .AND. PSVT(:,:,:,ISV_LIMA_NI)<ZSVTHR )
          PSVT(:,:,:,ISV_LIMA_IFN_NUCL) = PSVT(:,:,:,ISV_LIMA_NI)
       END WHERE
-      WHERE ( PRT(:,:,:,4) <= 1.E-11 )
+      WHERE ( PRT(:,:,:,4) <= 1.E-11 .AND. PSVT(:,:,:,ISV_LIMA_NI)<ZSVTHR )
          PSVT(:,:,:,ISV_LIMA_IFN_NUCL) = 0.0
       END WHERE
    END IF
@@ -196,9 +204,10 @@ IF (ISV_LIMA_NS.GE.1) THEN
 !  snow
 !
    ZCONC = 1./ (XAS*0.001**XBS) ! 1mm particle size
-   WHERE ( PRT(:,:,:,5) > 1.E-11 )
+   WHERE ( PRT(:,:,:,5) > 1.E-11 .AND. PSVT(:,:,:,ISV_LIMA_NS)<ZSVTHR )
       PSVT(:,:,:,ISV_LIMA_NS) = PRT(:,:,:,5) * ZCONC
-   ELSEWHERE
+   END WHERE
+   WHERE ( PRT(:,:,:,5) <= 1.E-11 .AND. PSVT(:,:,:,ISV_LIMA_NS)<ZSVTHR )
       PRT(:,:,:,5)  = 0.0
       PSVT(:,:,:,ISV_LIMA_NS) = 0.0
    END WHERE
@@ -209,9 +218,10 @@ IF (ISV_LIMA_NG.GE.1) THEN
 !  graupel
 !
    ZCONC = 1./ (XAG*0.001**XBG) ! 1mm particle size
-   WHERE ( PRT(:,:,:,6) > 1.E-11 )
+   WHERE ( PRT(:,:,:,6) > 1.E-11 .AND. PSVT(:,:,:,ISV_LIMA_NG)<ZSVTHR )
       PSVT(:,:,:,ISV_LIMA_NG) = PRT(:,:,:,6) * ZCONC
-   ELSEWHERE
+   END WHERE
+   WHERE ( PRT(:,:,:,6) <= 1.E-11 .AND. PSVT(:,:,:,ISV_LIMA_NG)<ZSVTHR )
       PRT(:,:,:,6)  = 0.0
       PSVT(:,:,:,ISV_LIMA_NG) = 0.0
    END WHERE
@@ -222,9 +232,10 @@ IF (ISV_LIMA_NH.GE.1) THEN
 !  hail
 !
    ZCONC = 1./ (XAH*0.001**XBH) ! 1mm particle size
-   WHERE ( PRT(:,:,:,7) > 1.E-11 )
+   WHERE ( PRT(:,:,:,7) > 1.E-11 .AND. PSVT(:,:,:,ISV_LIMA_NH)<ZSVTHR )
       PSVT(:,:,:,ISV_LIMA_NH) = PRT(:,:,:,7) * ZCONC
-   ELSEWHERE
+   END WHERE
+   WHERE ( PRT(:,:,:,7) <= 1.E-11 .AND. PSVT(:,:,:,ISV_LIMA_NH)<ZSVTHR )
       PRT(:,:,:,7)  = 0.0
       PSVT(:,:,:,ISV_LIMA_NH) = 0.0
    END WHERE
diff --git a/src/PHYEX/micro/mode_tiwmx.f90 b/src/PHYEX/micro/mode_tiwmx.f90
index dbfbdc712330cd2f959e1bbccd1c0b3f642b9137..dc98d10c2bfa819b09dfea670358bbee73a1a176 100644
--- a/src/PHYEX/micro/mode_tiwmx.f90
+++ b/src/PHYEX/micro/mode_tiwmx.f90
@@ -29,7 +29,7 @@
 IMPLICIT NONE
 
 REAL, PARAMETER :: XNDEGR = 100.0
-INTEGER, PARAMETER :: NSTART = 10000
+INTEGER, PARAMETER :: NSTART = 13200 ! A too small value may result into a FPE in single precision mode. REK.
 INTEGER, PARAMETER :: NSTOP = 37316
 
 ! Saturation tables and derivatives
diff --git a/src/PHYEX/micro/mode_tiwmx_tab.f90 b/src/PHYEX/micro/mode_tiwmx_tab.f90
index e8e42bcd6ef2d9082705d9351d42db729ebca2d9..4921638028c7fdede4d22c1785736d3670ed9e64 100644
--- a/src/PHYEX/micro/mode_tiwmx_tab.f90
+++ b/src/PHYEX/micro/mode_tiwmx_tab.f90
@@ -49,9 +49,8 @@ FUNCTION TIWMX_TAB(P,T,QR,FICE,QRSN,RS,EPS)
 !     1.1 MODULES USED
  
   USE MODD_CST, ONLY  : XEPSILO, XCPD, XLSTT, XLVTT
+  USE YOMHOOK , ONLY : LHOOK, DR_HOOK, JPHOOK
   USE MODE_TIWMX, ONLY : ESATI, ESATW, DESDTI, DESDTW
-  USE YOMHOOK , ONLY : LHOOK, DR_HOOK
-  USE PARKIND1, ONLY : JPRB
   
   IMPLICIT NONE
 
@@ -68,7 +67,7 @@ FUNCTION TIWMX_TAB(P,T,QR,FICE,QRSN,RS,EPS)
   REAL :: F,DFDT,T2,DT,QSN,DQSDT,B
   REAL :: ZES,ZDESDT
   INTEGER :: ITER
-  REAL(KIND=JPRB) :: ZHOOK_HANDLE
+  REAL(KIND=JPHOOK) :: ZHOOK_HANDLE
 
   IF (LHOOK) CALL DR_HOOK('TIWMX_TAB',0,ZHOOK_HANDLE)
 
diff --git a/src/PHYEX/micro/modi_condensation.f90 b/src/PHYEX/micro/modi_condensation.f90
index 812dae784eb9a29e7c860111520c12e6fc82a32c..ff01c3fb000451049dd0c2608861786d94b1de73 100644
--- a/src/PHYEX/micro/modi_condensation.f90
+++ b/src/PHYEX/micro/modi_condensation.f90
@@ -2,13 +2,14 @@
       MODULE MODI_CONDENSATION
 !     ########################
 !
+IMPLICIT NONE
 INTERFACE
 !
-    SUBROUTINE CONDENSATION(D, CST, ICEP, NEB, TURBN, &
+    SUBROUTINE CONDENSATION(D, CST, ICEP, NEBN, TURBN, &
                            &HFRAC_ICE, HCONDENS, HLAMBDA3,                                                  &
                            &PPABS, PZZ, PRHODREF, PT, PRV_IN, PRV_OUT, PRC_IN, PRC_OUT, PRI_IN, PRI_OUT,    &
                            &PRR, PRS, PRG, PSIGS, LMFCONV, PMFCONV, PCLDFR, PSIGRC, OUSERI,                 &
-                           &OSIGMAS, OCND2, LHGT_QS,                                                        &
+                           &OSIGMAS, OCND2,                                                                 &
                            &PICLDFR, PWCLDFR, PSSIO, PSSIU, PIFR, PSIGQSAT,                                 &
                            &PLV, PLS, PCPH,                                                                 &
                            &PHLC_HRC, PHLC_HCF, PHLI_HRI, PHLI_HCF,                                         &
@@ -16,14 +17,15 @@ INTERFACE
 !
 USE MODD_DIMPHYEX,   ONLY: DIMPHYEX_t
 USE MODD_CST,        ONLY: CST_t
-USE MODD_NEB,        ONLY: NEB_t
+USE MODD_NEB_n,      ONLY: NEB_t
 USE MODD_TURB_n,     ONLY: TURB_t
-USE MODD_RAIN_ICE_PARAM, ONLY: RAIN_ICE_PARAM_t
+USE MODD_RAIN_ICE_PARAM_n, ONLY: RAIN_ICE_PARAM_t
+IMPLICIT NONE
 !
 TYPE(DIMPHYEX_t),             INTENT(IN)    :: D
 TYPE(CST_t),                  INTENT(IN)    :: CST
 TYPE(RAIN_ICE_PARAM_t),       INTENT(IN)    :: ICEP
-TYPE(NEB_t),                  INTENT(IN)    :: NEB
+TYPE(NEB_t),                  INTENT(IN)    :: NEBN
 TYPE(TURB_t),                 INTENT(IN)    :: TURBN
 CHARACTER(LEN=1),             INTENT(IN)    :: HFRAC_ICE
 CHARACTER(LEN=4),             INTENT(IN)    :: HCONDENS
@@ -55,7 +57,6 @@ LOGICAL, INTENT(IN)                         :: OSIGMAS! use present global Sigma
                                                       ! or that from turbulence scheme
 LOGICAL, INTENT(IN)                         :: OCND2  ! logical switch to sparate liquid and ice
                                                       ! more rigid (DEFALT value : .FALSE.)
-LOGICAL, INTENT(IN)                         :: LHGT_QS! logical switch for height dependent VQSIGSAT
 REAL, DIMENSION(D%NIJT,D%NKT), INTENT(OUT)   :: PICLDFR  ! ice cloud fraction
 REAL, DIMENSION(D%NIJT,D%NKT), INTENT(OUT)   :: PWCLDFR  ! water or mixed-phase cloud fraction
 REAL, DIMENSION(D%NIJT,D%NKT), INTENT(OUT)   :: PSSIO    ! Super-saturation with respect to ice in the  
diff --git a/src/PHYEX/micro/modi_ice_adjust.f90 b/src/PHYEX/micro/modi_ice_adjust.f90
index 95680b082309ec4a6e00eb196b0028a770c96550..578d405386546b250d36563124d1d68f2e258cbf 100644
--- a/src/PHYEX/micro/modi_ice_adjust.f90
+++ b/src/PHYEX/micro/modi_ice_adjust.f90
@@ -2,11 +2,11 @@
       MODULE MODI_ICE_ADJUST
 !     ######################
 !
+IMPLICIT NONE
 INTERFACE
 !
-      SUBROUTINE ICE_ADJUST (D, CST, ICEP, NEB, TURBN, BUCONF, KRR,            &
-                            &HFRAC_ICE,                                        &
-                            &HBUNAME, OCND2, LHGT_QS,                          &
+      SUBROUTINE ICE_ADJUST (D, CST, ICEP, NEBN, TURBN, PARAMI, BUCONF, KRR,   &
+                            &HBUNAME,                                          &
                             &PTSTEP, PSIGQSAT,                                 &
                             &PRHODJ, PEXNREF, PRHODREF, PSIGS, LMFCONV, PMFCONV,&
                             &PPABST, PZZ,                                      &
@@ -21,9 +21,10 @@ INTERFACE
                             &PHLC_HRC, PHLC_HCF, PHLI_HRI, PHLI_HCF)
 USE MODD_BUDGET,         ONLY: TBUDGETDATA, TBUDGETCONF_t
 USE MODD_CST,            ONLY: CST_t
-USE MODD_RAIN_ICE_PARAM, ONLY: RAIN_ICE_PARAM_t
-USE MODD_NEB,            ONLY: NEB_t
+USE MODD_RAIN_ICE_PARAM_n, ONLY: RAIN_ICE_PARAM_t
+USE MODD_NEB_n,          ONLY: NEB_t
 USE MODD_TURB_n,         ONLY: TURB_t
+USE MODD_PARAM_ICE_n,    ONLY: PARAM_ICE_t
 USE MODD_DIMPHYEX,       ONLY: DIMPHYEX_t
 IMPLICIT NONE
 !
@@ -34,16 +35,12 @@ IMPLICIT NONE
 TYPE(DIMPHYEX_t),         INTENT(IN)    :: D
 TYPE(CST_t),              INTENT(IN)    :: CST
 TYPE(RAIN_ICE_PARAM_t),   INTENT(IN)    :: ICEP
-TYPE(NEB_t),              INTENT(IN)    :: NEB
+TYPE(NEB_t),              INTENT(IN)    :: NEBN
 TYPE(TURB_t),             INTENT(IN)    :: TURBN
+TYPE(PARAM_ICE_t),        INTENT(IN)    :: PARAMI
 TYPE(TBUDGETCONF_t),      INTENT(IN)    :: BUCONF
 INTEGER,                  INTENT(IN)    :: KRR      ! Number of moist variables
-CHARACTER(LEN=1),         INTENT(IN)    :: HFRAC_ICE
 CHARACTER(LEN=4),         INTENT(IN)    :: HBUNAME  ! Name of the budget
-LOGICAL,                  INTENT(IN)    :: OCND2    ! logical switch to separate liquid
-                                                    ! and ice
-                                                    ! more rigid (DEFAULT value : .FALSE.)
-LOGICAL,                  INTENT(IN)   :: LHGT_QS   ! logical switch for height dependent VQSIGSAT
 REAL,                     INTENT(IN)   :: PTSTEP    ! Double Time step
                                                     ! (single if cold start)
 REAL, DIMENSION(D%NIJT),       INTENT(IN)    :: PSIGQSAT  ! coeff applied to qsat variance contribution
@@ -52,8 +49,8 @@ REAL, DIMENSION(D%NIJT,D%NKT), INTENT(IN)    ::  PRHODJ  ! Dry density * Jacobia
 REAL, DIMENSION(D%NIJT,D%NKT), INTENT(IN)    ::  PEXNREF ! Reference Exner function
 REAL, DIMENSION(D%NIJT,D%NKT), INTENT(IN)    ::  PRHODREF
 !
-REAL, DIMENSION(MERGE(D%NIJT,0,TURBN%LSUBG_COND),&
-                MERGE(D%NKT,0,TURBN%LSUBG_COND)),           INTENT(IN)    ::  PSIGS   ! Sigma_s at time t
+REAL, DIMENSION(MERGE(D%NIJT,0,NEBN%LSUBG_COND),&
+                MERGE(D%NKT,0,NEBN%LSUBG_COND)),           INTENT(IN)    ::  PSIGS   ! Sigma_s at time t
 LOGICAL,                                              INTENT(IN)    ::  LMFCONV ! =SIZE(PMFCONV)!=0
 REAL, DIMENSION(MERGE(D%NIJT,0,LMFCONV),&
                 MERGE(D%NKT,0,LMFCONV)),              INTENT(IN)   ::  PMFCONV ! convective mass flux
diff --git a/src/PHYEX/micro/modi_ini_neb.f90 b/src/PHYEX/micro/modi_ini_neb.f90
deleted file mode 100644
index eaa71d814aba5264d69e8de759b00ce5f52d9190..0000000000000000000000000000000000000000
--- a/src/PHYEX/micro/modi_ini_neb.f90
+++ /dev/null
@@ -1,16 +0,0 @@
-!MNH_LIC Copyright 1994-2014 CNRS, Meteo-France and Universite Paul Sabatier
-!MNH_LIC This is part of the Meso-NH software governed by the CeCILL-C licence
-!MNH_LIC version 1. See LICENSE, CeCILL-C_V1-en.txt and CeCILL-C_V1-fr.txt  
-!MNH_LIC for details. version 1.
-!     ######spl
-        MODULE MODI_INI_NEB
-!       #####################
-!
-INTERFACE
-!
-SUBROUTINE INI_NEB
-END SUBROUTINE INI_NEB
-!
-END INTERFACE
-!
-END MODULE MODI_INI_NEB
diff --git a/src/PHYEX/micro/modi_ini_rain_ice.f90 b/src/PHYEX/micro/modi_ini_rain_ice.f90
deleted file mode 100644
index 24dd0d68de12ce2b27d5d2ef3f0a9e60f1978fa1..0000000000000000000000000000000000000000
--- a/src/PHYEX/micro/modi_ini_rain_ice.f90
+++ /dev/null
@@ -1,23 +0,0 @@
-!     ######spl
-       MODULE MODI_INI_RAIN_ICE
-!      ########################
-!
-INTERFACE
-      SUBROUTINE INI_RAIN_ICE ( KLUOUT, PTSTEP, PDZMIN, KSPLITR, HCLOUD )
-!
-INTEGER,                 INTENT(IN) :: KLUOUT    ! Logical unit number for prints
-INTEGER,                 INTENT(OUT):: KSPLITR   ! Number of small time step
-                                                 ! integration for  rain
-                                                 ! sedimendation
-!
-REAL,                    INTENT(IN) :: PTSTEP    ! Effective Time step
-!
-REAL,                    INTENT(IN) :: PDZMIN    ! minimun vertical mesh size
-!
-CHARACTER (LEN=4), INTENT(IN)       :: HCLOUD    ! Indicator of the cloud scheme
-!
-END SUBROUTINE INI_RAIN_ICE
-!
-END INTERFACE
-!
-END MODULE MODI_INI_RAIN_ICE
diff --git a/src/PHYEX/micro/modi_ini_snow.f90 b/src/PHYEX/micro/modi_ini_snow.f90
deleted file mode 100644
index 788ec7c9a8f216a921b5ddcbba27ab78195188b0..0000000000000000000000000000000000000000
--- a/src/PHYEX/micro/modi_ini_snow.f90
+++ /dev/null
@@ -1,15 +0,0 @@
-!     ######spl
-       MODULE MODI_INI_SNOW
-!      ########################
-!
-INTERFACE
-      SUBROUTINE INI_SNOW ( KLUOUT )
-!
-INTEGER,                 INTENT(IN) :: KLUOUT    ! Logical unit number for prints
-
-!
-END SUBROUTINE INI_SNOW
-!
-END INTERFACE
-!
-END MODULE MODI_INI_SNOW
diff --git a/src/PHYEX/micro/modi_ini_tiwmx.f90 b/src/PHYEX/micro/modi_ini_tiwmx.f90
deleted file mode 100644
index 9ef7e6409e537b13fe57af01140bc353dddfe029..0000000000000000000000000000000000000000
--- a/src/PHYEX/micro/modi_ini_tiwmx.f90
+++ /dev/null
@@ -1,16 +0,0 @@
-!MNH_LIC Copyright 1994-2014 CNRS, Meteo-France and Universite Paul Sabatier
-!MNH_LIC This is part of the Meso-NH software governed by the CeCILL-C licence
-!MNH_LIC version 1. See LICENSE, CeCILL-C_V1-en.txt and CeCILL-C_V1-fr.txt  
-!MNH_LIC for details. version 1.
-!     ######spl
-        MODULE MODI_INI_TIWMX
-!       #####################
-!
-INTERFACE
-!
-SUBROUTINE INI_TIWMX
-END SUBROUTINE INI_TIWMX
-!
-END INTERFACE
-!
-END MODULE MODI_INI_TIWMX
diff --git a/src/PHYEX/micro/modi_lima.f90 b/src/PHYEX/micro/modi_lima.f90
index 6cd5fa338a4bde2175fa985d0e14d370718c9ec7..383df6c4d7fcad487defdff132df7cca37bb3b74 100644
--- a/src/PHYEX/micro/modi_lima.f90
+++ b/src/PHYEX/micro/modi_lima.f90
@@ -1,5 +1,6 @@
 MODULE MODI_LIMA
 !
+IMPLICIT NONE
 INTERFACE
 !
    SUBROUTINE LIMA ( D, CST, BUCONF, TBUDGETS, KBUDGETS,                     &
@@ -16,6 +17,7 @@ USE MODD_IO,  ONLY: TFILEDATA
 USE MODD_DIMPHYEX, ONLY: DIMPHYEX_t
 USE MODD_BUDGET,   ONLY: TBUDGETDATA, TBUDGETCONF_t
 USE MODD_CST,            ONLY: CST_t
+IMPLICIT NONE
 !
 TYPE(DIMPHYEX_t),         INTENT(IN)    :: D
 TYPE(CST_t),              INTENT(IN)    :: CST
diff --git a/src/PHYEX/micro/modi_lima_adjust_split.f90 b/src/PHYEX/micro/modi_lima_adjust_split.f90
index aeb84748a1a24cd73f99e9c042969df03f645deb..cc4920e2f6c3284d349fec561e1693b4856424a5 100644
--- a/src/PHYEX/micro/modi_lima_adjust_split.f90
+++ b/src/PHYEX/micro/modi_lima_adjust_split.f90
@@ -2,6 +2,7 @@
       MODULE MODI_LIMA_ADJUST_SPLIT
 !     #############################
 !
+IMPLICIT NONE
 INTERFACE
 !
    SUBROUTINE LIMA_ADJUST_SPLIT(D, CST, BUCONF, TBUDGETS, KBUDGETS, &
@@ -16,6 +17,7 @@ INTERFACE
 USE MODD_DIMPHYEX,       ONLY: DIMPHYEX_t
 USE MODD_BUDGET,   ONLY: TBUDGETDATA, TBUDGETCONF_t
 USE MODD_CST,            ONLY: CST_t
+IMPLICIT NONE
 !
 TYPE(DIMPHYEX_t),         INTENT(IN)   :: D
 TYPE(CST_t),              INTENT(IN)    :: CST
diff --git a/src/PHYEX/micro/modi_lima_precip_scavenging.f90 b/src/PHYEX/micro/modi_lima_precip_scavenging.f90
index 918e2982eba4d565648da504c0051aa88922fb34..2a4708fdf509a8810a8c90d4905f72badb9c28a5 100644
--- a/src/PHYEX/micro/modi_lima_precip_scavenging.f90
+++ b/src/PHYEX/micro/modi_lima_precip_scavenging.f90
@@ -2,15 +2,17 @@
 MODULE MODI_LIMA_PRECIP_SCAVENGING
 !#################################
 !
+  IMPLICIT NONE
   INTERFACE
 !
      SUBROUTINE LIMA_PRECIP_SCAVENGING (D, CST, BUCONF, TBUDGETS, KBUDGETS, &
-                                        HCLOUD, KLUOUT, KTCOUNT, PTSTEP,    &
+                                        HCLOUD, CDCONF, KLUOUT, KTCOUNT, PTSTEP,    &
                                         PRRT, PRHODREF, PRHODJ, PZZ,        &
                                         PPABST, PTHT, PSVT, PRSVS, PINPAP )
        USE MODD_DIMPHYEX,        ONLY: DIMPHYEX_t
        use modd_budget,          only: TBUDGETDATA,TBUDGETCONF_t
        USE MODD_CST,             ONLY: CST_t
+       IMPLICIT NONE
 !
        TYPE(DIMPHYEX_t),         INTENT(IN)    :: D
        TYPE(CST_t),              INTENT(IN)    :: CST
@@ -19,6 +21,7 @@ MODULE MODI_LIMA_PRECIP_SCAVENGING
        INTEGER,                  INTENT(IN)    :: KBUDGETS
 !
        CHARACTER(LEN=4),       INTENT(IN)      :: HCLOUD   ! cloud paramerization
+       CHARACTER(LEN=5),       INTENT(IN)      :: CDCONF   ! CCONF from MODD_CONF
        INTEGER,                INTENT(IN)      :: KLUOUT   ! unit for output listing
        INTEGER,                INTENT(IN)      :: KTCOUNT  ! iteration count
        REAL,                   INTENT(IN)      :: PTSTEP   ! Double timestep except 
diff --git a/src/PHYEX/micro/modi_rain_ice.f90 b/src/PHYEX/micro/modi_rain_ice.f90
index bf65a39d521a0b9ce389d053524d36f815a21f44..abb7ff6b5430b32c0da9cda82f0fe64b99c91c96 100644
--- a/src/PHYEX/micro/modi_rain_ice.f90
+++ b/src/PHYEX/micro/modi_rain_ice.f90
@@ -2,9 +2,9 @@
        MODULE MODI_RAIN_ICE
 !      ####################
 !
+IMPLICIT NONE
 INTERFACE
       SUBROUTINE RAIN_ICE ( D, CST, PARAMI, ICEP, ICED, BUCONF,                   &
-                            KPROMA, OCND2, HSUBG_AUCV_RC, HSUBG_AUCV_RI,          &
                             PTSTEP, KRR, PEXN,                                    &
                             PDZZ, PRHODJ, PRHODREF, PEXNREF, PPABST, PCIT, PCLDFR,&
                             PHLC_HRC, PHLC_HCF, PHLI_HRI, PHLI_HCF,               &
@@ -18,9 +18,10 @@ INTERFACE
 !
 USE MODD_BUDGET,         ONLY: TBUDGETDATA, TBUDGETCONF_t
 USE MODD_CST,            ONLY: CST_t
-USE MODD_PARAM_ICE,      ONLY: PARAM_ICE_t
-USE MODD_RAIN_ICE_PARAM, ONLY: RAIN_ICE_PARAM_t
-USE MODD_RAIN_ICE_DESCR, ONLY: RAIN_ICE_DESCR_t
+USE MODD_PARAM_ICE_n,      ONLY: PARAM_ICE_t
+USE MODD_RAIN_ICE_PARAM_n, ONLY: RAIN_ICE_PARAM_t
+USE MODD_RAIN_ICE_DESCR_n, ONLY: RAIN_ICE_DESCR_t
+USE MODD_TURB_n,         ONLY: TURB_t
 USE MODD_DIMPHYEX,       ONLY: DIMPHYEX_t
 !
 IMPLICIT NONE
@@ -31,10 +32,6 @@ TYPE(PARAM_ICE_t),        INTENT(IN)    :: PARAMI
 TYPE(RAIN_ICE_PARAM_t),   INTENT(IN)    :: ICEP
 TYPE(RAIN_ICE_DESCR_t),   INTENT(IN)    :: ICED
 TYPE(TBUDGETCONF_t),      INTENT(IN)    :: BUCONF
-INTEGER,                  INTENT(IN)    :: KPROMA ! cache-blocking factor for microphysic loop
-LOGICAL                                 :: OCND2  ! Logical switch to separate liquid and ice
-CHARACTER(LEN=4),         INTENT(IN)    :: HSUBG_AUCV_RC ! Kind of Subgrid autoconversion method
-CHARACTER(LEN=80),        INTENT(IN)    :: HSUBG_AUCV_RI ! Kind of Subgrid autoconversion method
 REAL,                     INTENT(IN)    :: PTSTEP  ! Double Time step (single if cold start)
 INTEGER,                  INTENT(IN)    :: KRR     ! Number of moist variable
 !
diff --git a/src/PHYEX/micro/modn_param_lima.f90 b/src/PHYEX/micro/modn_param_lima.f90
deleted file mode 100644
index 390ba1dc8853237ddf00550f04dbeb9465636c3d..0000000000000000000000000000000000000000
--- a/src/PHYEX/micro/modn_param_lima.f90
+++ /dev/null
@@ -1,37 +0,0 @@
-!MNH_LIC Copyright 2001-2021 CNRS, Meteo-France and Universite Paul Sabatier
-!MNH_LIC This is part of the Meso-NH software governed by the CeCILL-C licence
-!MNH_LIC version 1. See LICENSE, CeCILL-C_V1-en.txt and CeCILL-C_V1-fr.txt
-!MNH_LIC for details. version 1.
-!-------------------------------------------------------------------------------
-!     ######################
-      MODULE MODN_PARAM_LIMA
-!     ######################
-!
-!-------------------------------------------------------------------------------
-!
-!*       0.   DECLARATIONS
-!             ------------
-!
-USE MODD_PARAM_LIMA
-!
-IMPLICIT NONE
-!
-!
-NAMELIST/NAM_PARAM_LIMA/LNUCL, LSEDI, LHHONI, LMEYERS,                     &
-                        NMOM_I, NMOM_S, NMOM_G, NMOM_H,                    &
-                        NMOD_IFN, XIFN_CONC, LIFN_HOM,                     &
-                        CIFN_SPECIES, CINT_MIXING, NMOD_IMM, NIND_SPECIE,  &
-                        LSNOW_T, CPRISTINE_ICE_LIMA, CHEVRIMED_ICE_LIMA,   &
-                        XALPHAI, XNUI, XALPHAS, XNUS, XALPHAG, XNUG,       &
-                        XFACTNUC_DEP, XFACTNUC_CON, NPHILLIPS,             &
-                        LCIBU, XNDEBRIS_CIBU, LRDSF, LMURAKAMI,            &
-                        LACTI, LSEDC, LACTIT, LBOUND, LSPRO,               &
-                        LADJ, LKHKO, LKESSLERAC, NMOM_C, NMOM_R,           &
-                        NMOD_CCN, XCCN_CONC,                               &
-                        LCCN_HOM, CCCN_MODES, HINI_CCN, HTYPE_CCN,         &
-                        XALPHAC, XNUC, XALPHAR, XNUR,                      &
-                        XFSOLUB_CCN, XACTEMP_CCN, XAERDIFF, XAERHEIGHT,    &
-                        LSCAV, LAERO_MASS, LDEPOC, XVDEPOC, LACTTKE,       &
-                        LPTSPLIT, LFEEDBACKT, NMAXITER, XMRSTEP, XTSTEP_TS
-!
-END MODULE MODN_PARAM_LIMA
diff --git a/src/PHYEX/micro/prognos_lima.f90 b/src/PHYEX/micro/prognos_lima.f90
index 64834850299bea38e862fe05238081fc5dac9b1a..aaba695968f56ce9cff37a79ed2e5689e8b4f2fa 100644
--- a/src/PHYEX/micro/prognos_lima.f90
+++ b/src/PHYEX/micro/prognos_lima.f90
@@ -7,9 +7,11 @@
       MODULE MODI_PROGNOS_LIMA
 !     #######################
 !
+IMPLICIT NONE
 INTERFACE
 !
 SUBROUTINE PROGNOS_LIMA(PTSTEP,PDZ,PLV,PCPH,PPRES,PRHOD,PRR,PTT,PRV,PRC,PS0,PNAS,PCCS,PNFS)
+IMPLICIT NONE
 !
 REAL,                     INTENT(IN)    :: PTSTEP
 REAL, DIMENSION(:),       INTENT(IN)    :: PPRES
@@ -382,9 +384,9 @@ CONTAINS
 FUNCTION MOMG (PALPHA,PNU,PP) RESULT (PMOMG)
 USE MODI_GAMMA
 IMPLICIT NONE
-REAL     :: PALPHA ! first shape parameter of the DIMENSIONnal distribution
-REAL     :: PNU    ! second shape parameter of the DIMENSIONnal distribution
-REAL     :: PP     ! order of the moment
+REAL, INTENT(IN)     :: PALPHA ! first shape parameter of the DIMENSIONnal distribution
+REAL, INTENT(IN)     :: PNU    ! second shape parameter of the DIMENSIONnal distribution
+REAL, INTENT(IN)     :: PP     ! order of the moment
 REAL     :: PMOMG  ! result: moment of order ZP
 PMOMG = GAMMA(PNU+PP/PALPHA)/GAMMA(PNU)
 !
diff --git a/src/PHYEX/micro/radar_rain_ice.f90 b/src/PHYEX/micro/radar_rain_ice.f90
index cf97a981ade422f5d257a46c93a48cf234056ce1..13cfa19bd0b4abc4d53a3b7552431aae46ec1aa3 100644
--- a/src/PHYEX/micro/radar_rain_ice.f90
+++ b/src/PHYEX/micro/radar_rain_ice.f90
@@ -7,9 +7,11 @@
        MODULE MODI_RADAR_RAIN_ICE 
 !      ##########################
 !
+IMPLICIT NONE
 INTERFACE
       SUBROUTINE RADAR_RAIN_ICE(PRT,PCIT,PRHODREF,PTEMP,PRARE,PVDOP,PRZDR,PRKDP,&
                              PCRT,PCST,PCGT,PCHT)
+IMPLICIT NONE
 !
 REAL,  DIMENSION(:,:,:,:), INTENT(IN)  :: PRT  ! microphysical  mix. ratios at t
 REAL,  DIMENSION(:,:,:),   INTENT(IN)  :: PCIT ! pristine ice concentration at t
@@ -98,8 +100,8 @@ END MODULE MODI_RADAR_RAIN_ICE
 !
 USE MODD_CST
 USE MODD_REF
-USE MODD_PARAM_ICE,      ONLY: LSNOW_T_I=>LSNOW_T
-USE MODD_RAIN_ICE_DESCR, ONLY: XALPHAR_I=>XALPHAR,XNUR_I=>XNUR,XLBEXR_I=>XLBEXR,&
+USE MODD_PARAM_ICE_n,      ONLY: LSNOW_T_I=>LSNOW_T
+USE MODD_RAIN_ICE_DESCR_n, ONLY: XALPHAR_I=>XALPHAR,XNUR_I=>XNUR,XLBEXR_I=>XLBEXR,&
                                XLBR_I=>XLBR,XCCR_I=>XCCR,XBR_I=>XBR,XAR_I=>XAR,&
                                XALPHAC_I=>XALPHAC,XNUC_I=>XNUC,&
                                XLBC_I=>XLBC,XBC_I=>XBC,XAC_I=>XAC,&
@@ -554,9 +556,9 @@ CONTAINS
 !
   IMPLICIT NONE
 !
-  REAL     :: PALPHA ! first shape parameter of the dimensionnal distribution
-  REAL     :: PNU    ! second shape parameter of the dimensionnal distribution
-  REAL     :: PP     ! order of the moment
+  REAL, INTENT(IN)     :: PALPHA ! first shape parameter of the dimensionnal distribution
+  REAL, INTENT(IN)     :: PNU    ! second shape parameter of the dimensionnal distribution
+  REAL, INTENT(IN)     :: PP     ! order of the moment
   REAL     :: PMOMG  ! result: moment of order ZP
 !
 !------------------------------------------------------------------------------
diff --git a/src/PHYEX/micro/radtr_satel.f90 b/src/PHYEX/micro/radtr_satel.f90
index 5c79550bb3f34b5eb7929616036b6468aa5c01ec..5f29acd95a57c40e775b0d2b07a23b00bb83727e 100644
--- a/src/PHYEX/micro/radtr_satel.f90
+++ b/src/PHYEX/micro/radtr_satel.f90
@@ -6,6 +6,7 @@
 !    #######################
      MODULE MODI_RADTR_SATEL 
 !    #######################
+IMPLICIT NONE
 INTERFACE
 !
      SUBROUTINE RADTR_SATEL(KYEARF, KMONTHF, KDAYF, PSECF,         &
@@ -13,6 +14,7 @@ INTERFACE
                 PTSRAD, PSTATM, PTHT, PRT, PPABST, PZZ,            &
                 PSIGS, PMFCONV, PCLDFR, OUSERI, OSIGMAS,           &
                 OSUBG_COND, ORAD_SUBG_COND, PIRBT, PWVBT, KGEO,PSIGQSAT )
+IMPLICIT NONE
 !
 INTEGER, INTENT(IN) :: KYEARF  ! year of Final date
 INTEGER, INTENT(IN) :: KMONTHF ! month of Final date
@@ -111,8 +113,8 @@ END MODULE MODI_RADTR_SATEL
 USE MODD_CST
 USE MODD_PARAMETERS
 USE MODD_GRID_n
-USE MODD_RAIN_ICE_PARAM,   ONLY: RAIN_ICE_PARAM
-USE MODD_NEB,              ONLY: NEB
+USE MODD_RAIN_ICE_PARAM_n,   ONLY: RAIN_ICE_PARAMN
+USE MODD_NEB_n,            ONLY: NEBN
 USE MODD_TURB_n,           ONLY: TURBN
 USE MODD_DIMPHYEX,         ONLY: DIMPHYEX_t
 !
@@ -497,11 +499,11 @@ IF( SIZE(PRT(:,:,:,:),4) >= 2 ) THEN
     !     PRT(:,:,:,2), PRT(:,:,:,5), PRT(:,:,:,6), PSIGS, PMFCONV, ZNCLD, &
     !     ZSIGRC, OUSERI, OSIGMAS, .FALSE., .FALSE., &
     !     ZDUM, ZDUM, ZDUM, ZDUM, ZDUM, ZSIGQSAT2D )
-    CALL CONDENSATION(D, CST, RAIN_ICE_PARAM, NEB, TURBN, &                                                                         
+    CALL CONDENSATION(D, CST, RAIN_ICE_PARAMN, NEBN, TURBN, &                                                                         
                      &'T', 'CB02', 'CB',                                                  &                                         
                      &PPABST, PZZ, ZRHO, ZTEMP, ZRV_IN, ZRV_OUT, ZRC_IN, ZRC_OUT, ZRI_IN, ZRI_OUT,    &                                             
                      &PRT(:,:,:,2), PRT(:,:,:,5), PRT(:,:,:,6), PSIGS, .FALSE., PMFCONV, ZNCLD, ZSIGRC, .FALSE.,                 &     
-                     &OSIGMAS, .FALSE., .FALSE.,                                                        &                           
+                     &OSIGMAS, .FALSE.,                                                                 &                           
                      &ZDUM, ZDUM, ZDUM, ZDUM, ZDUM, ZSIGQSAT2D)
     DEALLOCATE(ZTEMP,ZSIGRC)
     DEALLOCATE(ZRV_OUT)
diff --git a/src/PHYEX/micro/rain_c2r2_khko.f90 b/src/PHYEX/micro/rain_c2r2_khko.f90
index cc19dbbf0cc7dc6aa5a287f8dec73f6ba3b46952..6284e4f1fbbc787d4305cf1811b216db85401634 100644
--- a/src/PHYEX/micro/rain_c2r2_khko.f90
+++ b/src/PHYEX/micro/rain_c2r2_khko.f90
@@ -7,6 +7,7 @@
        MODULE MODI_RAIN_C2R2_KHKO
 !      ######################
 !
+IMPLICIT NONE
 INTERFACE
       SUBROUTINE RAIN_C2R2_KHKO(HCLOUD,OACTIT, OSEDC, ORAIN, KSPLITR, PTSTEP,   &
                             KMI,TPFILE,                                         &
@@ -21,6 +22,7 @@ INTERFACE
                             PINDEP, PSUPSAT, PNACT                      )
 !
 USE MODD_IO, ONLY: TFILEDATA
+IMPLICIT NONE
 !
 CHARACTER(LEN=*),         INTENT(IN)    :: HCLOUD   !  kind of cloud
 
diff --git a/src/PHYEX/micro/rain_ice.f90 b/src/PHYEX/micro/rain_ice.f90
index db2f59b2341f0faaaf64534e05eb032995493b27..18b10bb3de19c5c346847d2688fd77479c0c4a74 100644
--- a/src/PHYEX/micro/rain_ice.f90
+++ b/src/PHYEX/micro/rain_ice.f90
@@ -5,7 +5,6 @@
 !-----------------------------------------------------------------
 !     ######spl
       SUBROUTINE RAIN_ICE ( D, CST, PARAMI, ICEP, ICED, BUCONF,                   &
-                            KPROMA, OCND2, HSUBG_AUCV_RC, HSUBG_AUCV_RI,          &
                             PTSTEP, KRR, PEXN,                                    &
                             PDZZ, PRHODJ, PRHODREF, PEXNREF, PPABST, PCIT, PCLDFR,&
                             PHLC_HRC, PHLC_HCF, PHLI_HRI, PHLI_HCF,               &
@@ -177,16 +176,15 @@
 !*       0.    DECLARATIONS
 !              ------------
 !
-USE PARKIND1, ONLY : JPRB
-USE YOMHOOK , ONLY : LHOOK, DR_HOOK
+USE YOMHOOK , ONLY : LHOOK, DR_HOOK, JPHOOK
 
 USE MODD_DIMPHYEX,   ONLY: DIMPHYEX_t
 USE MODD_BUDGET,         ONLY: TBUDGETDATA, TBUDGETCONF_t, NBUDGET_TH, NBUDGET_RV, NBUDGET_RC, &
                                NBUDGET_RI, NBUDGET_RR, NBUDGET_RS, NBUDGET_RG, NBUDGET_RH
 USE MODD_CST,            ONLY: CST_t
-USE MODD_PARAM_ICE,      ONLY: PARAM_ICE_t
-USE MODD_RAIN_ICE_DESCR, ONLY: RAIN_ICE_DESCR_t
-USE MODD_RAIN_ICE_PARAM, ONLY: RAIN_ICE_PARAM_t
+USE MODD_PARAM_ICE_n,      ONLY: PARAM_ICE_t
+USE MODD_RAIN_ICE_DESCR_n, ONLY: RAIN_ICE_DESCR_t
+USE MODD_RAIN_ICE_PARAM_n, ONLY: RAIN_ICE_PARAM_t
 USE MODD_FIELDS_ADDRESS, ONLY : & ! common fields adress
       & ITH,     & ! Potential temperature
       & IRV,     & ! Water vapor
@@ -197,10 +195,10 @@ USE MODD_FIELDS_ADDRESS, ONLY : & ! common fields adress
       & IRG,     & ! Graupel
       & IRH        ! Hail
 
-USE MODE_BUDGET_PHY,         ONLY: BUDGET_STORE_ADD_PHY, BUDGET_STORE_INIT_PHY, BUDGET_STORE_END_PHY
-USE MODE_MSG,            ONLY: PRINT_MSG, NVERB_FATAL
+USE MODE_BUDGET_PHY,         ONLY: BUDGET_STORE_INIT_PHY, BUDGET_STORE_END_PHY
+USE MODE_MSG,                ONLY: PRINT_MSG, NVERB_FATAL
 
-USE MODE_ICE4_RAINFR_VERT, ONLY: ICE4_RAINFR_VERT
+USE MODE_ICE4_RAINFR_VERT,   ONLY: ICE4_RAINFR_VERT
 USE MODE_ICE4_SEDIMENTATION, ONLY: ICE4_SEDIMENTATION
 USE MODE_ICE4_PACK, ONLY: ICE4_PACK
 USE MODE_ICE4_NUCLEATION, ONLY: ICE4_NUCLEATION
@@ -218,10 +216,6 @@ TYPE(PARAM_ICE_t),        INTENT(IN)    :: PARAMI
 TYPE(RAIN_ICE_PARAM_t),   INTENT(IN)    :: ICEP
 TYPE(RAIN_ICE_DESCR_t),   INTENT(IN)    :: ICED
 TYPE(TBUDGETCONF_t),      INTENT(IN)    :: BUCONF
-INTEGER,                  INTENT(IN)    :: KPROMA ! cache-blocking factor for microphysic loop
-LOGICAL                                 :: OCND2  ! Logical switch to separate liquid and ice
-CHARACTER(LEN=4),         INTENT(IN)    :: HSUBG_AUCV_RC ! Kind of Subgrid autoconversion method
-CHARACTER(LEN=80),        INTENT(IN)    :: HSUBG_AUCV_RI ! Kind of Subgrid autoconversion method
 REAL,                     INTENT(IN)    :: PTSTEP  ! Double Time step (single if cold start)
 INTEGER,                  INTENT(IN)    :: KRR     ! Number of moist variable
 !
@@ -276,7 +270,7 @@ REAL, DIMENSION(D%NIJT,D%NKT,KRR), OPTIONAL, INTENT(OUT)  :: PFPR ! upper-air pr
 !
 !*       0.2   Declarations of local variables :
 !
-REAL(KIND=JPRB) :: ZHOOK_HANDLE
+REAL(KIND=JPHOOK) :: ZHOOK_HANDLE
 !
 INTEGER :: JIJ, JK
 INTEGER :: IKTB, IKTE, IKB, IIJB, IIJE
@@ -311,8 +305,8 @@ IIJB=D%NIJB
 IIJE=D%NIJE
 !-------------------------------------------------------------------------------
 !
-IF(OCND2) THEN
-  CALL PRINT_MSG(NVERB_FATAL, 'GEN', 'RAIN_ICE', 'OCND2 OPTION NOT CODED IN THIS RAIN_ICE VERSION')
+IF(PARAMI%LOCND2) THEN
+  CALL PRINT_MSG(NVERB_FATAL, 'GEN', 'RAIN_ICE', 'LOCND2 OPTION NOT CODED IN THIS RAIN_ICE VERSION')
 END IF
 ZINV_TSTEP=1./PTSTEP
 !
@@ -432,13 +426,13 @@ ENDDO
 !
 IF(PARAMI%LPACK_MICRO) THEN
   ISIZE=COUNT(LLMICRO) ! Number of points with active microphysics
-  !KPROMA is the requested size for cache_blocking loop
+  !PARAMI%NPROMICRO is the requested size for cache_blocking loop
   !IPROMA is the effective size
   !This parameter must be computed here because it is used for array dimensioning in ice4_pack
-  IF (KPROMA > 0 .AND. ISIZE > 0) THEN
+  IF (PARAMI%NPROMICRO > 0 .AND. ISIZE > 0) THEN
     ! Cache-blocking is active
     ! number of chunks :
-    IGPBLKS = (ISIZE-1)/MIN(KPROMA,ISIZE)+1
+    IGPBLKS = (ISIZE-1)/MIN(PARAMI%NPROMICRO,ISIZE)+1
     ! Adjust IPROMA to limit the number of small chunks
     IPROMA=(ISIZE-1)/IGPBLKS+1
   ELSE
@@ -453,7 +447,6 @@ ENDIF
 !This part is put in another routine to separate pack/unpack operations from computations
 CALL ICE4_PACK(D, CST, PARAMI, ICEP, ICED, BUCONF,                   &
                IPROMA, ISIZE, ISIZE2,                                &
-               HSUBG_AUCV_RC, HSUBG_AUCV_RI,                         &
                PTSTEP, KRR, LLMICRO, PEXN,                           &
                PRHODJ, PRHODREF, PEXNREF, PPABST, PCIT, PCLDFR,      &
                PHLC_HRC, PHLC_HCF, PHLI_HRI, PHLI_HCF,               &
@@ -474,7 +467,7 @@ CALL ICE4_PACK(D, CST, PARAMI, ICEP, ICED, BUCONF,                   &
 !***     6.1    total tendencies limited by available species
 !
 DO JK = IKTB, IKTE
-  DO CONCURRENT (JIJ=IIJB:IIJE)
+  DO JIJ=IIJB, IIJE
     !LV/LS
     ZZ_LSFACT(JIJ,JK)=ZZ_LSFACT(JIJ,JK)/PEXNREF(JIJ,JK)
     ZZ_LVFACT(JIJ,JK)=ZZ_LVFACT(JIJ,JK)/PEXNREF(JIJ,JK)
diff --git a/src/PHYEX/micro/rain_ice_elec.f90 b/src/PHYEX/micro/rain_ice_elec.f90
index d1a432f20b26e1f371778fd54366e65bb2e0c784..bdd4de76281fe67a4fc3285f3f8e7ea957e2adf8 100644
--- a/src/PHYEX/micro/rain_ice_elec.f90
+++ b/src/PHYEX/micro/rain_ice_elec.f90
@@ -7,6 +7,7 @@
        MODULE MODI_RAIN_ICE_ELEC
 !      #########################
 !
+IMPLICIT NONE
 INTERFACE
       SUBROUTINE RAIN_ICE_ELEC (OSEDIC, HSUBG_AUCV, OWARM,                            &
                                 KSPLITR, PTSTEP, KMI, KRR,                            &
@@ -19,6 +20,7 @@ INTERFACE
                                 PQPIS, PQCS, PQRS, PQIS, PQSS, PQGS, PQNIS,           &
                                 PSEA, PTOWN,                                          &
                                 PRHT, PRHS, PINPRH, PQHT, PQHS                        )
+IMPLICIT NONE
 !
 !
 LOGICAL,                  INTENT(IN)    :: OSEDIC ! Switch for droplet sedim.
@@ -219,9 +221,9 @@ USE MODD_LES
 USE MODE_ll
 USE MODD_NSV,             ONLY: NSV_ELECBEG, NSV_ELECEND ! Scalar variables for budgets
 USE MODD_PARAMETERS
-USE MODD_PARAM_ICE
-USE MODD_RAIN_ICE_DESCR
-USE MODD_RAIN_ICE_PARAM
+USE MODD_PARAM_ICE_n
+USE MODD_RAIN_ICE_DESCR_n
+USE MODD_RAIN_ICE_PARAM_n
 USE MODD_REF,             ONLY: XTHVREFZ
 
 use mode_budget,          only: Budget_store_add, Budget_store_init, Budget_store_end
@@ -5132,9 +5134,9 @@ END SUBROUTINE ELEC_INI_NI_SAUNQ
 !
 IMPLICIT NONE
 !
-REAL, DIMENSION(IMICRO) :: ZEW
-REAL, DIMENSION(IMICRO) :: ZDQTAKA_AUX
-REAL, DIMENSION(NIND_LWC+1,NIND_TEMP+1) :: XTAKA_AUX  !XMANSELL or XTAKA_TM)
+REAL, DIMENSION(IMICRO), INTENT(IN) :: ZEW
+REAL, DIMENSION(IMICRO), INTENT(INOUT) :: ZDQTAKA_AUX
+REAL, DIMENSION(NIND_LWC+1,NIND_TEMP+1), INTENT(IN) :: XTAKA_AUX  !XMANSELL or XTAKA_TM)
 !
 !
   ALLOCATE ( IVEC1(IGTAKA) )
@@ -5824,9 +5826,9 @@ IMPLICIT NONE
 !
 !*	0.2	Declaration of local variables
 !
-INTEGER                          :: KN        ! Size of the result vector
-INTEGER,          DIMENSION(KN)  :: KI        ! Tabulated  coordinate
-INTEGER,          DIMENSION(KN)  :: KJ        ! Tabulated  coordinate
+INTEGER,          INTENT(IN)                  :: KN        ! Size of the result vector
+INTEGER,          INTENT(IN),  DIMENSION(KN)  :: KI        ! Tabulated  coordinate
+INTEGER,          INTENT(IN),  DIMENSION(KN)  :: KJ        ! Tabulated  coordinate
 REAL, INTENT(IN), DIMENSION(:,:) :: ZT        ! Tabulated data
 REAL, INTENT(IN), DIMENSION(KN)  :: PDX, PDY  ! 
 REAL,             DIMENSION(KN)  :: Y         ! Interpolated value
diff --git a/src/PHYEX/micro/rain_ice_fast_rg.f90 b/src/PHYEX/micro/rain_ice_fast_rg.f90
index 0799d824aa16f617ead6073703f4ba18f4229347..0cb5620003a9e6899a8be9db0bac62a3880269ce 100644
--- a/src/PHYEX/micro/rain_ice_fast_rg.f90
+++ b/src/PHYEX/micro/rain_ice_fast_rg.f90
@@ -33,9 +33,9 @@ SUBROUTINE RAIN_ICE_FAST_RG(KRR, OMICRO, PRHODREF, PRVT, PRCT, PRRT, PRIT, PRST,
 use modd_budget,         only: lbudget_th, lbudget_rc, lbudget_rr, lbudget_ri, lbudget_rs, lbudget_rg, lbudget_rh, &
                                NBUDGET_TH, NBUDGET_RC, NBUDGET_RR, NBUDGET_RI, NBUDGET_RS, NBUDGET_RG, NBUDGET_RH, &
                                tbudgets
-use MODD_CST,            only: XCI, XCL, XCPV, XESTT, XLMTT, XLVTT, XMD, XMV, XRV, XTT
-use MODD_RAIN_ICE_DESCR, only: XBS, XCEXVT, XCXG, XCXS, XDG, XRTMIN
-use MODD_RAIN_ICE_PARAM, only: NDRYLBDAG, NDRYLBDAR, NDRYLBDAS, X0DEPG, X1DEPG, XCOLEXIG, XCOLEXSG, XCOLIG, XCOLSG, XDRYINTP1G, &
+USE MODD_CST,            only: XCI, XCL, XCPV, XESTT, XLMTT, XLVTT, XMD, XMV, XRV, XTT
+USE MODD_RAIN_ICE_DESCR_n, only: XBS, XCEXVT, XCXG, XCXS, XDG, XRTMIN
+USE MODD_RAIN_ICE_PARAM_n, only: NDRYLBDAG, NDRYLBDAR, NDRYLBDAS, X0DEPG, X1DEPG, XCOLEXIG, XCOLEXSG, XCOLIG, XCOLSG, XDRYINTP1G, &
                                XDRYINTP1R, XDRYINTP1S, XDRYINTP2G, XDRYINTP2R, XDRYINTP2S, XEX0DEPG, XEX1DEPG, XEXICFRR,        &
                                XEXRCFRI, XFCDRYG, XFIDRYG, XFRDRYG, XFSDRYG, XICFRR, XKER_RDRYG, XKER_SDRYG, XLBRDRYG1,         &
                                XLBRDRYG2, XLBRDRYG3, XLBSDRYG1, XLBSDRYG2, XLBSDRYG3, XRCFRI
@@ -204,13 +204,8 @@ REAL,    DIMENSION(size(PRHODREF),7) :: ZZW1              ! Work arrays
       JL = I1(JJ)
       ZZW1(JL,3) = MIN( PRSS(JL),XFSDRYG*ZVEC3(JJ)                         & ! RSDRYG
                                       * EXP( XCOLEXSG*(PZT(JL)-XTT) )  &
-#if defined(REPRO48) 
-                    *( ZVECLBDAS(JJ)**(XCXS-XBS) )*( ZVECLBDAG(JJ)**XCXG )    &
-                    *( PRHODREF(JL)**(-XCEXVT-1.) )                    &
-#else
                     *PRST(JL)*( ZVECLBDAG(JJ)**XCXG )    &
                     *( PRHODREF(JL)**(-XCEXVT) )                    &
-#endif
                          *( XLBSDRYG1/( ZVECLBDAG(JJ)**2              ) + &
                             XLBSDRYG2/( ZVECLBDAG(JJ)   * ZVECLBDAS(JJ)   ) + &
                             XLBSDRYG3/(               ZVECLBDAS(JJ)**2) ) )
diff --git a/src/PHYEX/micro/rain_ice_fast_rh.f90 b/src/PHYEX/micro/rain_ice_fast_rh.f90
index d41b61143d2db7ef49ab7926d371e2dc53a7b972..b962448be59de5dc28e9ee9e7c0b3a99c59ab691 100644
--- a/src/PHYEX/micro/rain_ice_fast_rh.f90
+++ b/src/PHYEX/micro/rain_ice_fast_rh.f90
@@ -30,9 +30,9 @@ SUBROUTINE RAIN_ICE_FAST_RH(OMICRO, PRHODREF, PRVT, PRCT, PRIT, PRST, PRGT, PRHT
 use modd_budget,         only: lbudget_th, lbudget_rc, lbudget_rr, lbudget_ri, lbudget_rs, lbudget_rg, lbudget_rh, &
                                NBUDGET_TH, NBUDGET_RC, NBUDGET_RR, NBUDGET_RI, NBUDGET_RS, NBUDGET_RG, NBUDGET_RH, &
                                tbudgets
-use MODD_CST,            only: XCI, XCL, XCPV, XESTT, XLMTT, XLVTT, XMD, XMV, XRV, XTT
-use MODD_RAIN_ICE_DESCR, only: XBG, XBS, XCEXVT, XCXG, XCXH, XCXS, XDH, XLBEXH, XLBH, XRTMIN
-use MODD_RAIN_ICE_PARAM, only: NWETLBDAG, NWETLBDAH, NWETLBDAS, X0DEPH, X1DEPH, &
+USE MODD_CST,            only: XCI, XCL, XCPV, XESTT, XLMTT, XLVTT, XMD, XMV, XRV, XTT
+USE MODD_RAIN_ICE_DESCR_n, only: XBG, XBS, XCEXVT, XCXG, XCXH, XCXS, XDH, XLBEXH, XLBH, XRTMIN
+USE MODD_RAIN_ICE_PARAM_n, only: NWETLBDAG, NWETLBDAH, NWETLBDAS, X0DEPH, X1DEPH, &
                                XEX0DEPH, XEX1DEPH, XFGWETH, XFSWETH, XFWETH, XKER_GWETH, XKER_SWETH, &
                                XLBGWETH1, XLBGWETH2, XLBGWETH3, XLBSWETH1, XLBSWETH2, XLBSWETH3,     &
                                XWETINTP1G, XWETINTP1H, XWETINTP1S, XWETINTP2G, XWETINTP2H, XWETINTP2S
@@ -186,13 +186,8 @@ REAL,    DIMENSION(size(PRHODREF),6) :: ZZW1              ! Work arrays
       DO JJ = 1, IGWET
         JL = I1W(JJ)
         ZZW1(JL,3) = MIN( PRSS(JL),XFSWETH*ZVEC3(JJ)                       & ! RSWETH
-#if defined(REPRO48) 
-                      *( ZVECLBDAS(JJ)**(XCXS-XBS) )*( ZVECLBDAH(JJ)**XCXH )  &
-                         *( PRHODREF(JL)**(-XCEXVT-1.) )               &
-#else
                       *PRST(JL)*( ZVECLBDAH(JJ)**XCXH )  &
                          *( PRHODREF(JL)**(-XCEXVT) )               &
-#endif
                          *( XLBSWETH1/( ZVECLBDAH(JJ)**2              ) + &
                             XLBSWETH2/( ZVECLBDAH(JJ)   * ZVECLBDAS(JJ)   ) + &
                             XLBSWETH3/(               ZVECLBDAS(JJ)**2) ) )
diff --git a/src/PHYEX/micro/rain_ice_fast_ri.f90 b/src/PHYEX/micro/rain_ice_fast_ri.f90
index edb36a38b90fded9262d13f47e042247f5b448d5..3bb56e144f895b6259a55367c365379dcf7adc12 100644
--- a/src/PHYEX/micro/rain_ice_fast_ri.f90
+++ b/src/PHYEX/micro/rain_ice_fast_ri.f90
@@ -27,9 +27,9 @@ SUBROUTINE RAIN_ICE_FAST_RI(OMICRO, PRHODREF, PRIT, PRHODJ, PZT, PSSI, PLSFACT,
 use modd_budget,         only: lbudget_th, lbudget_rc, lbudget_ri, &
                                NBUDGET_TH, NBUDGET_RC, NBUDGET_RI, &
                                tbudgets
-use MODD_CST,            only: XTT
-use MODD_RAIN_ICE_DESCR, only: XDI, XLBEXI, XLBI, XRTMIN
-use MODD_RAIN_ICE_PARAM, only: X0DEPI, X2DEPI
+USE MODD_CST,            only: XTT
+USE MODD_RAIN_ICE_DESCR_n, only: XDI, XLBEXI, XLBI, XRTMIN
+USE MODD_RAIN_ICE_PARAM_n, only: X0DEPI, X2DEPI
 
 use mode_budget,         only: Budget_store_add, Budget_store_end, Budget_store_init
 
diff --git a/src/PHYEX/micro/rain_ice_fast_rs.f90 b/src/PHYEX/micro/rain_ice_fast_rs.f90
index 682a1ba3fe3148aa37be1f6e705b789fd84542ec..7d90f8034d2fcbee3b35d9ad61e040c63b103c1b 100644
--- a/src/PHYEX/micro/rain_ice_fast_rs.f90
+++ b/src/PHYEX/micro/rain_ice_fast_rs.f90
@@ -31,9 +31,9 @@ SUBROUTINE RAIN_ICE_FAST_RS(PTSTEP, OMICRO, PRHODREF, PRVT, PRCT, PRRT, PRST, PR
 use modd_budget,         only: lbudget_th, lbudget_rc, lbudget_rr, lbudget_rs, lbudget_rg, &
                                NBUDGET_TH, NBUDGET_RC, NBUDGET_RR, NBUDGET_RS, NBUDGET_RG, &
                                tbudgets
-use MODD_CST,            only: XCL, XCPV, XESTT, XLMTT, XLVTT, XMD, XMV, XRV, XTT
-use MODD_RAIN_ICE_DESCR, only: XBS, XCEXVT, XCXS, XRTMIN
-use MODD_RAIN_ICE_PARAM, only: NACCLBDAR, NACCLBDAS, NGAMINC, X0DEPS, X1DEPS, XACCINTP1R, XACCINTP1S, XACCINTP2R, XACCINTP2S, &
+USE MODD_CST,            only: XCL, XCPV, XESTT, XLMTT, XLVTT, XMD, XMV, XRV, XTT
+USE MODD_RAIN_ICE_DESCR_n, only: XBS, XCEXVT, XCXS, XRTMIN
+USE MODD_RAIN_ICE_PARAM_n, only: NACCLBDAR, NACCLBDAS, NGAMINC, X0DEPS, X1DEPS, XACCINTP1R, XACCINTP1S, XACCINTP2R, XACCINTP2S, &
                                XCRIMSG, XCRIMSS, XEX0DEPS, XEX1DEPS, XEXCRIMSG, XEXCRIMSS, XEXSRIMCG, XFRACCSS,               &
                                XFSACCRG, XFSCVMG, XGAMINC_RIM1, XGAMINC_RIM1, XGAMINC_RIM2, XKER_RACCS,                       &
                                XKER_RACCSS, XKER_SACCRG, XLBRACCS1, XLBRACCS2, XLBRACCS3, XLBSACCR1, XLBSACCR2, XLBSACCR3,    &
@@ -136,15 +136,9 @@ REAL,    DIMENSION(:), ALLOCATABLE :: ZZW1, ZZW2, ZZW3, ZZW4 ! Work arrays
     DO JJ = 1, IGRIM
       JL = I1(JJ)
       ZZW1(JJ) = MIN( PRCS(JL),                                &
-#if defined(REPRO48) 
-                     XCRIMSS * ZVEC1(JJ) * PRCT(JL)                & ! RCRIMSS
-                                       *   ZVECLBDAS(JJ)**XEXCRIMSS &
-                                       * PRHODREF(JL)**(-XCEXVT) )
-#else
                      XCRIMSS * ZVEC1(JJ) * PRCT(JL) * PRST(JL)      & ! RCRIMSS
                                        *   ZVECLBDAS(JJ)**(XBS+XEXCRIMSS) &
                                        * PRHODREF(JL)**(-XCEXVT+1) )
-#endif
       PRCS(JL) = PRCS(JL) - ZZW1(JJ)
       PRSS(JL) = PRSS(JL) + ZZW1(JJ)
       PTHS(JL) = PTHS(JL) + ZZW1(JJ)*(PLSFACT(JL)-PLVFACT(JL)) ! f(L_f*(RCRIMSS))
@@ -163,21 +157,12 @@ REAL,    DIMENSION(:), ALLOCATABLE :: ZZW1, ZZW2, ZZW3, ZZW4 ! Work arrays
       JL = I1(JJ)
       IF ( PRSS(JL) > 0.0 ) THEN
         ZZW2(JJ) = MIN( PRCS(JL),                     &
-#if defined(REPRO48) 
-                    XCRIMSG * PRCT(JL)                & ! RCRIMSG
-                            *  ZVECLBDAS(JJ)**XEXCRIMSG  &
-                            * PRHODREF(JL)**(-XCEXVT) &
-                            - ZZW1(JJ)              )
-        ZZW3(JJ) = MIN( PRSS(JL),                         &
-                        XSRIMCG * ZVECLBDAS(JJ)**XEXSRIMCG   & ! RSRIMCG
-#else
                     XCRIMSG * PRCT(JL) *PRST(JL)         & ! RCRIMSG
                             *  ZVECLBDAS(JJ)**(XBS+XEXCRIMSG)  &
                             * PRHODREF(JL)**(-XCEXVT+1) &
                             - ZZW1(JJ)              )
         ZZW3(JJ) = MIN( PRSS(JL),                         &
                         PRST(JL) * PRHODREF(JL) * XSRIMCG * ZVECLBDAS(JJ)**(XBS+XEXSRIMCG)   & ! RSRIMCG
-#endif
                                 * (1.0 - ZVEC1(JJ) )/(PTSTEP*PRHODREF(JL)) )
         PRCS(JL) = PRCS(JL) - ZZW2(JJ)
         PRSS(JL) = PRSS(JL) - ZZW3(JJ)
@@ -275,11 +260,7 @@ REAL,    DIMENSION(:), ALLOCATABLE :: ZZW1, ZZW2, ZZW3, ZZW4 ! Work arrays
     DO JJ = 1, IGACC
       JL = I1(JJ)
       ZZW2(JJ) =                                            & !! coef of RRACCS
-#if defined(REPRO48) 
-              XFRACCSS*( ZVECLBDAS(JJ)**XCXS )*( PRHODREF(JL)**(-XCEXVT-1.) ) &
-#else
               XFRACCSS*( PRST(JL)*ZVECLBDAS(JJ)**XBS )*( PRHODREF(JL)**(-XCEXVT) ) &
-#endif
          *( XLBRACCS1/((ZVECLBDAS(JJ)**2)               ) +                  &
             XLBRACCS2/( ZVECLBDAS(JJ)    * ZVECLBDAR(JJ)    ) +                  &
             XLBRACCS3/(               (ZVECLBDAR(JJ)**2)) )/ZVECLBDAR(JJ)**4
@@ -325,11 +306,7 @@ REAL,    DIMENSION(:), ALLOCATABLE :: ZZW1, ZZW2, ZZW3, ZZW4 ! Work arrays
         ZZW2(JJ) = MAX( MIN( PRRS(JL),ZZW2(JJ)-ZZW4(JJ) ),0.0 )       ! RRACCSG
         IF ( ZZW2(JJ) > 0.0 ) THEN
           ZZW3(JJ) = MIN( PRSS(JL),XFSACCRG*ZVEC3(JJ)*                     & ! RSACCRG
-#if defined(REPRO48) 
-                ( ZVECLBDAS(JJ)**(XCXS-XBS) )*( PRHODREF(JL)**(-XCEXVT-1.) ) &
-#else
                 PRST(JL)*( PRHODREF(JL)**(-XCEXVT) ) &
-#endif
               *( XLBSACCR1/((ZVECLBDAR(JJ)**2)               ) +           &
                   XLBSACCR2/( ZVECLBDAR(JJ)    * ZVECLBDAS(JJ)    ) +           &
                   XLBSACCR3/(               (ZVECLBDAS(JJ)**2)) )/ZVECLBDAR(JJ) )
@@ -376,15 +353,9 @@ REAL,    DIMENSION(:), ALLOCATABLE :: ZZW1, ZZW2, ZZW3, ZZW4 ! Work arrays
 !
 ! compute RSMLT
 !
-#if defined(REPRO48) 
-    ZZW(:)  = MIN( PRSS(:), XFSCVMG*MAX( 0.0,( -ZZW(:) *             &
-                           ( X0DEPS*       PLBDAS(:)**XEX0DEPS +     &
-                             X1DEPS*PCJ(:)*PLBDAS(:)**XEX1DEPS ) ) / &
-#else
     ZZW(:)  = MIN( PRSS(:), XFSCVMG*MAX( 0.0,( -ZZW(:) * PRST(:) * PRHODREF(:) * &
                            ( X0DEPS*       PLBDAS(:)**(XBS+XEX0DEPS) +     &
                              X1DEPS*PCJ(:)*PLBDAS(:)**(XBS+XEX1DEPS) ) ) / &
-#endif
                                              ( PRHODREF(:)*XLMTT ) ) )
 !
 ! note that RSCVMG = RSMLT*XFSCVMG but no heat is exchanged (at the rate RSMLT)
diff --git a/src/PHYEX/micro/rain_ice_nucleation.f90 b/src/PHYEX/micro/rain_ice_nucleation.f90
index 701e30282f15c6c3083767192f3d33f07f177d02..34b9c8efb4d90c5989bf421b25e3c15e56165f99 100644
--- a/src/PHYEX/micro/rain_ice_nucleation.f90
+++ b/src/PHYEX/micro/rain_ice_nucleation.f90
@@ -29,9 +29,9 @@ SUBROUTINE RAIN_ICE_NUCLEATION(KIB, KIE, KJB, KJE, KKTB, KKTE,KRR,PTSTEP,&
 use modd_budget,          only: lbudget_th, lbudget_rv, lbudget_ri, &
                                 NBUDGET_TH, NBUDGET_RV, NBUDGET_RI, &
                                 tbudgets
-use MODD_CST,             only: XALPI, XALPW, XBETAI, XBETAW, XCI, XCL, XCPD, XCPV, XGAMI, XGAMW, &
+USE MODD_CST,             only: XALPI, XALPW, XBETAI, XBETAW, XCI, XCL, XCPD, XCPV, XGAMI, XGAMW, &
                                 XLSTT, XMD, XMV, XP00, XRD, XTT
-use MODD_RAIN_ICE_PARAM,  only: XALPHA1, XALPHA2, XBETA1, XBETA2, XMNU0, XNU10, XNU20
+USE MODD_RAIN_ICE_PARAM_n,  only: XALPHA1, XALPHA2, XBETA1, XBETA2, XMNU0, XNU10, XNU20
 
 use mode_budget,          only: Budget_store_init, Budget_store_end
 use mode_tools,           only: Countjv
diff --git a/src/PHYEX/micro/rain_ice_old.f90 b/src/PHYEX/micro/rain_ice_old.f90
index d3edd8708cd5ac272febb7861a620ab9b9377c44..5535910e7c6150c627347bb26067373062ec901c 100644
--- a/src/PHYEX/micro/rain_ice_old.f90
+++ b/src/PHYEX/micro/rain_ice_old.f90
@@ -7,6 +7,7 @@
        MODULE MODI_RAIN_ICE_OLD
 !      ####################
 !
+IMPLICIT NONE
 INTERFACE
       SUBROUTINE RAIN_ICE_OLD (D, OSEDIC,HSEDIM, HSUBG_AUCV, OWARM, KKA, KKU, KKL,      &
                             KSPLITR, PTSTEP, KRR,                            &
@@ -18,6 +19,7 @@ INTERFACE
                             PRHT, PRHS, PINPRH, PFPR                        )
 !
 USE MODD_DIMPHYEX,   ONLY: DIMPHYEX_t
+IMPLICIT NONE
 !
 TYPE(DIMPHYEX_t),         INTENT(IN)    :: D
 LOGICAL,                  INTENT(IN)    :: OSEDIC ! Switch for droplet sedim.
@@ -224,29 +226,29 @@ END MODULE MODI_RAIN_ICE_OLD
 !*       0.    DECLARATIONS
 !              ------------
 !
-use modd_budget,         only: lbu_enable
-use MODD_CONF,           only: LCHECK
-use MODD_CST,            only: XCI, XCL, XCPD, XCPV, XLSTT, XLVTT, XTT, &
+USE modd_budget,         only: lbu_enable
+USE MODD_CONF,           only: LCHECK
+USE MODD_CST,            only: XCI, XCL, XCPD, XCPV, XLSTT, XLVTT, XTT, &
                                XALPI, XBETAI, XGAMI, XMD, XMV, XTT
-use MODD_LES,            only: LLES_CALL
-use MODD_PARAMETERS,     only: JPVEXT
-use MODD_PARAM_ICE,      only: CSUBG_PR_PDF, LDEPOSC
-use MODD_RAIN_ICE_DESCR, only: RAIN_ICE_DESCR, XLBEXR, XLBR, XRTMIN
-use MODD_RAIN_ICE_PARAM, only: XCRIAUTC
+USE MODD_LES,            only: LLES_CALL
+USE MODD_PARAMETERS,     only: JPVEXT
+USE MODD_PARAM_ICE_n,      only: CSUBG_PR_PDF, LDEPOSC
+USE MODD_RAIN_ICE_DESCR_n, only: RAIN_ICE_DESCRN, XLBEXR, XLBR, XRTMIN
+USE MODD_RAIN_ICE_PARAM_n, only: XCRIAUTC
 USE MODD_DIMPHYEX,       ONLY: DIMPHYEX_t
 
-use MODE_MSG
-use MODE_RAIN_ICE_FAST_RG,             only: RAIN_ICE_FAST_RG
-use MODE_RAIN_ICE_FAST_RH,             only: RAIN_ICE_FAST_RH
-use MODE_RAIN_ICE_FAST_RI,             only: RAIN_ICE_FAST_RI
-use MODE_RAIN_ICE_FAST_RS,             only: RAIN_ICE_FAST_RS
-use MODE_RAIN_ICE_NUCLEATION,          only: RAIN_ICE_NUCLEATION
-use MODE_RAIN_ICE_SEDIMENTATION_SPLIT, only: RAIN_ICE_SEDIMENTATION_SPLIT
-use MODE_RAIN_ICE_SEDIMENTATION_STAT,  only: RAIN_ICE_SEDIMENTATION_STAT
-use MODE_RAIN_ICE_SLOW,                only: RAIN_ICE_SLOW
-use MODE_RAIN_ICE_WARM,                only: RAIN_ICE_WARM
-use mode_tools,                        only: Countjv
-use mode_tools_ll,                     only: GET_INDICE_ll
+USE MODE_MSG
+USE MODE_RAIN_ICE_FAST_RG,             only: RAIN_ICE_FAST_RG
+USE MODE_RAIN_ICE_FAST_RH,             only: RAIN_ICE_FAST_RH
+USE MODE_RAIN_ICE_FAST_RI,             only: RAIN_ICE_FAST_RI
+USE MODE_RAIN_ICE_FAST_RS,             only: RAIN_ICE_FAST_RS
+USE MODE_RAIN_ICE_NUCLEATION,          only: RAIN_ICE_NUCLEATION
+USE MODE_RAIN_ICE_SEDIMENTATION_SPLIT, only: RAIN_ICE_SEDIMENTATION_SPLIT
+USE MODE_RAIN_ICE_SEDIMENTATION_STAT,  only: RAIN_ICE_SEDIMENTATION_STAT
+USE MODE_RAIN_ICE_SLOW,                only: RAIN_ICE_SLOW
+USE MODE_RAIN_ICE_WARM,                only: RAIN_ICE_WARM
+USE mode_tools,                        only: Countjv
+USE mode_tools_ll,                     only: GET_INDICE_ll
 
 USE MODE_ICE4_RAINFR_VERT
 !
@@ -756,7 +758,7 @@ IF( IMICRO >= 0 ) THEN
   DO JL=1,IMICRO
     PRAINFR(I1(JL),I2(JL),I3(JL)) = ZRF(JL)
   END DO
-  CALL ICE4_RAINFR_VERT(D, RAIN_ICE_DESCR, PRAINFR, PRRT(:,:,:),      &
+  CALL ICE4_RAINFR_VERT(D, RAIN_ICE_DESCRN, PRAINFR, PRRT(:,:,:),      &
                          RESHAPE( SOURCE = [ ( 0., JL = 1, SIZE( PRSS ) ) ], SHAPE = SHAPE( PRSS ) ), &
                          RESHAPE( SOURCE = [ ( 0., JL = 1, SIZE( PRGS ) ) ], SHAPE = SHAPE( PRGS ) )  )
   DO JL=1,IMICRO
@@ -942,7 +944,7 @@ ELSE
   call Print_msg( NVERB_FATAL, 'GEN', 'RAIN_ICE_OLD', 'no sedimentation scheme for HSEDIM='//HSEDIM )
 END IF
 !sedimentation of rain fraction
-CALL ICE4_RAINFR_VERT(D, RAIN_ICE_DESCR, PRAINFR, PRRS(:,:,:)*PTSTEP,  &
+CALL ICE4_RAINFR_VERT(D, RAIN_ICE_DESCRN, PRAINFR, PRRS(:,:,:)*PTSTEP,  &
                       PRSS(:,:,:)*PTSTEP, PRGS(:,:,:)*PTSTEP)
 !
 !-------------------------------------------------------------------------------
diff --git a/src/PHYEX/micro/rain_ice_sedimentation_split.f90 b/src/PHYEX/micro/rain_ice_sedimentation_split.f90
index 370cc07ef9bea548c8fe2aef7dfd5aab70afffd2..0240caabe19ba979068a66eb234965edee8af32b 100644
--- a/src/PHYEX/micro/rain_ice_sedimentation_split.f90
+++ b/src/PHYEX/micro/rain_ice_sedimentation_split.f90
@@ -30,11 +30,11 @@ SUBROUTINE RAIN_ICE_SEDIMENTATION_SPLIT(KIB, KIE, KJB, KJE, KKB, KKE, KKTB, KKTE
 use modd_budget,         only: lbudget_rc, lbudget_rr, lbudget_ri, lbudget_rs, lbudget_rg, lbudget_rh, &
                                NBUDGET_RC, NBUDGET_RR, NBUDGET_RI, NBUDGET_RS, NBUDGET_RG, NBUDGET_RH, &
                                tbudgets
-use MODD_CST,            only: XCPD, XP00, XRD, XRHOLW
-use MODD_PARAM_ICE,      only: XVDEPOSC
-use MODD_RAIN_ICE_DESCR, only: XCC, XCONC_LAND, xconc_sea, xconc_urban, XDC, XCEXVT, &
+USE MODD_CST,            only: XCPD, XP00, XRD, XRHOLW
+USE MODD_PARAM_ICE_n,      only: XVDEPOSC
+USE MODD_RAIN_ICE_DESCR_n, only: XCC, XCONC_LAND, xconc_sea, xconc_urban, XDC, XCEXVT, &
                                XALPHAC, XNUC, XALPHAC2, XNUC2, XLBEXC, XRTMIN, XLBEXC, XLBC
-use MODD_RAIN_ICE_PARAM, only: XEXSEDG, XEXSEDH, XEXCSEDI, XEXSEDR, XEXSEDS, &
+USE MODD_RAIN_ICE_PARAM_n, only: XEXSEDG, XEXSEDH, XEXCSEDI, XEXSEDR, XEXSEDS, &
                                XFSEDG, XFSEDH, XFSEDI, XFSEDR, XFSEDS, XFSEDC
 
 use mode_budget,         only: Budget_store_init, Budget_store_end
diff --git a/src/PHYEX/micro/rain_ice_sedimentation_stat.f90 b/src/PHYEX/micro/rain_ice_sedimentation_stat.f90
index 68eff90a2773e9ab61b3280428467a96662383ff..e25073ed075b47fcb13ab41774fec7db282e6ff0 100644
--- a/src/PHYEX/micro/rain_ice_sedimentation_stat.f90
+++ b/src/PHYEX/micro/rain_ice_sedimentation_stat.f90
@@ -30,11 +30,11 @@ SUBROUTINE RAIN_ICE_SEDIMENTATION_STAT( KIB, KIE, KJB, KJE, KKB, KKE, KKTB, KKTE
 use modd_budget,         only: lbudget_rc, lbudget_rr, lbudget_ri, lbudget_rs, lbudget_rg, lbudget_rh, &
                                NBUDGET_RC, NBUDGET_RR, NBUDGET_RI, NBUDGET_RS, NBUDGET_RG, NBUDGET_RH, &
                                tbudgets
-use MODD_CST,            only: XRHOLW
-use MODD_PARAM_ICE,      only: LDEPOSC, XVDEPOSC
-use MODD_RAIN_ICE_PARAM, only: XEXSEDG, XEXSEDH, XEXCSEDI, XEXSEDR, XEXSEDS, &
+USE MODD_CST,            only: XRHOLW
+USE MODD_PARAM_ICE_n,      only: LDEPOSC, XVDEPOSC
+USE MODD_RAIN_ICE_PARAM_n, only: XEXSEDG, XEXSEDH, XEXCSEDI, XEXSEDR, XEXSEDS, &
                                XFSEDC, XFSEDG, XFSEDH, XFSEDI, XFSEDR, XFSEDS
-use MODD_RAIN_ICE_DESCR, only: XALPHAC, XALPHAC2, XCC, XCEXVT, XCONC_LAND, XCONC_SEA, XCONC_URBAN, &
+USE MODD_RAIN_ICE_DESCR_n, only: XALPHAC, XALPHAC2, XCC, XCEXVT, XCONC_LAND, XCONC_SEA, XCONC_URBAN, &
                                XDC, XLBC, XLBEXC, XNUC, XNUC2, XRTMIN
 
 use mode_budget,         only: Budget_store_init, Budget_store_end
diff --git a/src/PHYEX/micro/rain_ice_slow.f90 b/src/PHYEX/micro/rain_ice_slow.f90
index 4f590c70d81c87262cfe19e85325f1d4206b6f80..fbd645ac665b78ca483a8df20d726d622a1bf909 100644
--- a/src/PHYEX/micro/rain_ice_slow.f90
+++ b/src/PHYEX/micro/rain_ice_slow.f90
@@ -29,9 +29,9 @@ SUBROUTINE RAIN_ICE_SLOW(OMICRO, PINVTSTEP, PRHODREF,
 use modd_budget,         only: lbudget_th, lbudget_rv, lbudget_rc, lbudget_rr, lbudget_ri, lbudget_rs, lbudget_rg, &
                                NBUDGET_TH, NBUDGET_RV, NBUDGET_RC, NBUDGET_RR, NBUDGET_RI, NBUDGET_RS, NBUDGET_RG, &
                                tbudgets
-use MODD_CST,            only: XALPI, XBETAI, XCI, XCPV, XGAMI, XLSTT, XMNH_HUGE_12_LOG, XP00, XRV, XTT
-use MODD_RAIN_ICE_DESCR, only: XCEXVT, XLBDAS_MAX, XLBEXG, XLBEXS, XLBG, XLBS, XRTMIN, XBS
-use MODD_RAIN_ICE_PARAM, only: X0DEPG, X0DEPS, X1DEPG, X1DEPS, XACRIAUTI, XALPHA3, XBCRIAUTI, XBETA3, XCOLEXIS, XCRIAUTI, &
+USE MODD_CST,            only: XALPI, XBETAI, XCI, XCPV, XGAMI, XLSTT, XMNH_HUGE_12_LOG, XP00, XRV, XTT
+USE MODD_RAIN_ICE_DESCR_n, only: XCEXVT, XLBDAS_MAX, XLBEXG, XLBEXS, XLBG, XLBS, XRTMIN, XBS
+USE MODD_RAIN_ICE_PARAM_n, only: X0DEPG, X0DEPS, X1DEPG, X1DEPS, XACRIAUTI, XALPHA3, XBCRIAUTI, XBETA3, XCOLEXIS, XCRIAUTI, &
                                XEX0DEPG, XEX0DEPS, XEX1DEPG, XEX1DEPS, XEXIAGGS, XFIAGGS, XHON, XSCFAC, XTEXAUTI, XTIMAUTI
 
 use mode_budget,         only: Budget_store_add
@@ -147,11 +147,7 @@ real, dimension(size(plsfact))  :: zz_diff
   END WHERE
   ZZW(:) = 0.0
   WHERE ( (PRST(:)>XRTMIN(5)) .AND. (PRSS(:)>0.0) )
-#if defined(REPRO48) 
-    ZZW(:) = ( PSSI(:)/(PRHODREF(:)*PAI(:)) ) *                               &
-#else
     ZZW(:) = ( PRST(:) * PLBDAS(:)**XBS * PSSI(:)/PAI(:) ) *          &
-#endif
              ( X0DEPS*PLBDAS(:)**XEX0DEPS + X1DEPS*PCJ(:)*PLBDAS(:)**XEX1DEPS )
     ZZW(:) =         MIN( PRVS(:),ZZW(:)      )*(0.5+SIGN(0.5,ZZW(:))) &
                    - MIN( PRSS(:),ABS(ZZW(:)) )*(0.5-SIGN(0.5,ZZW(:)))
@@ -173,13 +169,8 @@ real, dimension(size(plsfact))  :: zz_diff
   WHERE ( (PRIT(:)>XRTMIN(4)) .AND. (PRST(:)>XRTMIN(5)) .AND. (PRIS(:)>0.0) )
     ZZW(:) = MIN( PRIS(:),XFIAGGS * EXP( XCOLEXIS*(PZT(:)-XTT) ) &
                                   * PRIT(:)                      &
-#if defined(REPRO48) 
-                                  * PLBDAS(:)**XEXIAGGS          &
-                                  * PRHODREF(:)**(-XCEXVT)       )
-#else
                                   * PRST(:) * PLBDAS(:)**(XBS+XEXIAGGS)    &
                                   * PRHODREF(:)**(-XCEXVT+1)       )
-#endif
     PRSS(:)  = PRSS(:)  + ZZW(:)
     PRIS(:)  = PRIS(:)  - ZZW(:)
   END WHERE
diff --git a/src/PHYEX/micro/rain_ice_warm.f90 b/src/PHYEX/micro/rain_ice_warm.f90
index 0a781900c768fdd2cf37a3d36ecc27c238709efe..e31659abd784050f458ff6f7fe531a13dcc53a06 100644
--- a/src/PHYEX/micro/rain_ice_warm.f90
+++ b/src/PHYEX/micro/rain_ice_warm.f90
@@ -29,10 +29,10 @@ SUBROUTINE RAIN_ICE_WARM(OMICRO, KMICRO, K1, K2, K3,
 use modd_budget,         only: lbudget_th, lbudget_rv, lbudget_rc, lbudget_rr, &
                                NBUDGET_TH, NBUDGET_RV, NBUDGET_RC, NBUDGET_RR, &
                                tbudgets
-use MODD_CST,            only: XALPW, XBETAW, XCL, XCPV, XGAMW, XLVTT, XMD, XMV, XRV, XTT
-use MODD_PARAM_ICE,      only: CSUBG_RC_RR_ACCR, CSUBG_RR_EVAP
-use MODD_RAIN_ICE_DESCR, only: XCEXVT, XRTMIN
-use MODD_RAIN_ICE_PARAM, only: X0EVAR, X1EVAR, XCRIAUTC, XEX0EVAR, XEX1EVAR, XEXCACCR, XFCACCR, XTIMAUTC
+USE MODD_CST,            only: XALPW, XBETAW, XCL, XCPV, XGAMW, XLVTT, XMD, XMV, XRV, XTT
+USE MODD_PARAM_ICE_n,      only: CSUBG_RC_RR_ACCR, CSUBG_RR_EVAP
+USE MODD_RAIN_ICE_DESCR_n, only: XCEXVT, XRTMIN
+USE MODD_RAIN_ICE_PARAM_n, only: X0EVAR, X1EVAR, XCRIAUTC, XEX0EVAR, XEX1EVAR, XEXCACCR, XFCACCR, XTIMAUTC
 
 use mode_budget,         only: Budget_store_add
 use MODE_MSG
diff --git a/src/PHYEX/turb/les_mean_subgrid.f90 b/src/PHYEX/turb/les_mean_subgrid.f90
index 24895fdb06e56b851a2297c1c025eb9881da7c3c..a2b5854fd64c6a3f5fffc223403f965f3104dd36 100644
--- a/src/PHYEX/turb/les_mean_subgrid.f90
+++ b/src/PHYEX/turb/les_mean_subgrid.f90
@@ -12,9 +12,11 @@
 MODULE MODI_LES_MEAN_SUBGRID
 !      #####################
 !
+IMPLICIT NONE
 INTERFACE LES_MEAN_SUBGRID
 !
       SUBROUTINE LES_MEAN_SUBGRID_3D(PA, PA_MEAN, OSUM)
+IMPLICIT NONE
 
 REAL,    DIMENSION(:,:,:), INTENT(IN)    :: PA
 !
@@ -26,6 +28,7 @@ END SUBROUTINE LES_MEAN_SUBGRID_3D
 !
 
       SUBROUTINE LES_MEAN_SUBGRID_SURF(PA, PA_MEAN, OSUM)
+IMPLICIT NONE
 
 REAL,    DIMENSION(:,:), INTENT(IN)    :: PA
 !
diff --git a/src/PHYEX/turb/les_mean_subgrid_phy.f90 b/src/PHYEX/turb/les_mean_subgrid_phy.f90
index 92d0629464e0cff34788b70ae8bcc8cd6d4071b5..a8ca991c2ee6406bce503da0484d1e37c31f014b 100644
--- a/src/PHYEX/turb/les_mean_subgrid_phy.f90
+++ b/src/PHYEX/turb/les_mean_subgrid_phy.f90
@@ -12,6 +12,7 @@
 MODULE MODI_LES_MEAN_SUBGRID_PHY
 !      #####################
 !
+IMPLICIT NONE
 INTERFACE LES_MEAN_SUBGRID_PHY
 !
 
diff --git a/src/PHYEX/turb/modd_cturb.f90 b/src/PHYEX/turb/modd_cturb.f90
index 10b21c7580b75424c1eca936247d1f46ff4c7635..166228d89a0d09d8a716800e22f77c512ee902f4 100644
--- a/src/PHYEX/turb/modd_cturb.f90
+++ b/src/PHYEX/turb/modd_cturb.f90
@@ -44,30 +44,20 @@ TYPE CSTURB_t
 !
 REAL :: XCMFS        ! constant for the momentum flux due to shear   
 REAL :: XCMFB        ! constant for the momentum flux due to buoyancy
-REAL :: XCSHF        ! constant for the sensible heat flux 
-REAL :: XCHF         ! constant for the humidity flux 
-REAL :: XCTV         ! constant for the temperature variance
-REAL :: XCHV         ! constant for the humidity variance
-REAL :: XCHT1        ! first ct. for the humidity-temperature correlation
-REAL :: XCHT2        ! second ct. for the humidity-temperature correlation
-!
-REAL :: XCPR1        ! first ct. for the turbulent Prandtl numbers
+!
 REAL :: XCPR2        ! second ct. for the turbulent Prandtl numbers
 REAL :: XCPR3        ! third ct. for the turbulent Prandtl numbers
 REAL :: XCPR4        ! fourth ct. for the turbulent Prandtl numbers
 REAL :: XCPR5        ! fifth ct. for the turbulent Prandtl numbers
 !
 REAL :: XCET         ! constant into the transport term of the TKE eq.
-REAL :: XCED         ! constant into the dissipation term of the TKE eq.
 !
 REAL :: XCDP         ! ct. for the production term in the dissipation eq.
 REAL :: XCDD         ! ct. for the destruction term in the dissipation eq.
 REAL :: XCDT         ! ct. for the transport term in the dissipation eq.
 !
-REAL :: XTKEMIN      ! mimimum value for the TKE
 REAL :: XRM17        ! Rodier et al 2017 constant in shear term for mixing length
 !
-REAL :: XLINI        ! initial value for BL mixing length
 REAL :: XLINF        ! to prevent division by zero in the BL algorithm
 !
 REAL :: XALPSBL      ! constant linking TKE and friction velocity in the SBL
@@ -78,7 +68,6 @@ REAL :: XA2          ! Constant a2 for wind pressure-correlations
 REAL :: XA3          ! Constant a3 for wind pressure-correlations
 REAL :: XA5          ! Constant a5 for temperature pressure-correlations
 REAL :: XCTD         ! Constant for temperature and vapor dissipation
-REAL :: XCTP         ! Constant for temperature and vapor pressure-correlations
 !
 REAL :: XPHI_LIM     ! Threshold value for Phi3 and Psi3
 REAL :: XSBL_O_BL    ! SBL height / BL height ratio
@@ -90,30 +79,20 @@ TYPE(CSTURB_t), TARGET, SAVE :: CSTURB
 !
 REAL,POINTER :: XCMFS => NULL()
 REAL,POINTER :: XCMFB => NULL()
-REAL,POINTER :: XCSHF => NULL()
-REAL,POINTER :: XCHF => NULL()
-REAL,POINTER :: XCTV => NULL()
-REAL,POINTER :: XCHV => NULL()
-REAL,POINTER :: XCHT1 => NULL()
-REAL,POINTER :: XCHT2 => NULL()
-!
-REAL,POINTER :: XCPR1 => NULL()
+!
 REAL,POINTER :: XCPR2 => NULL()
 REAL,POINTER :: XCPR3 => NULL()
 REAL,POINTER :: XCPR4 => NULL()
 REAL,POINTER :: XCPR5 => NULL()
 !
 REAL,POINTER :: XCET => NULL()
-REAL,POINTER :: XCED => NULL()
 !
 REAL,POINTER :: XCDP => NULL()
 REAL,POINTER :: XCDD => NULL()
 REAL,POINTER :: XCDT => NULL()
 !
-REAL,POINTER :: XTKEMIN => NULL()
 REAL,POINTER :: XRM17 => NULL()
 !
-REAL,POINTER :: XLINI => NULL()
 REAL,POINTER :: XLINF => NULL()
 !
 REAL,POINTER :: XALPSBL => NULL()
@@ -124,7 +103,6 @@ REAL,POINTER :: XA2 => NULL()
 REAL,POINTER :: XA3 => NULL()
 REAL,POINTER :: XA5 => NULL()
 REAL,POINTER :: XCTD => NULL()
-REAL,POINTER :: XCTP => NULL()
 !
 REAL,POINTER :: XPHI_LIM => NULL()
 REAL,POINTER :: XSBL_O_BL => NULL()
@@ -135,30 +113,20 @@ SUBROUTINE CTURB_ASSOCIATE()
 IMPLICIT NONE
   XCMFS=>CSTURB%XCMFS
   XCMFB=>CSTURB%XCMFB
-  XCSHF=>CSTURB%XCSHF
-  XCHF=>CSTURB%XCHF
-  XCTV=>CSTURB%XCTV
-  XCHV=>CSTURB%XCHV
-  XCHT1=>CSTURB%XCHT1
-  XCHT2=>CSTURB%XCHT2
   !
-  XCPR1=>CSTURB%XCPR1
   XCPR2=>CSTURB%XCPR2
   XCPR3=>CSTURB%XCPR3
   XCPR4=>CSTURB%XCPR4
   XCPR5=>CSTURB%XCPR5
   !
   XCET=>CSTURB%XCET
-  XCED=>CSTURB%XCED
   !
   XCDP=>CSTURB%XCDP
   XCDD=>CSTURB%XCDD
   XCDT=>CSTURB%XCDT
   !
-  XTKEMIN=>CSTURB%XTKEMIN
   XRM17=>CSTURB%XRM17
   !
-  XLINI=>CSTURB%XLINI
   XLINF=>CSTURB%XLINF
   !
   XALPSBL=>CSTURB%XALPSBL
@@ -169,7 +137,6 @@ IMPLICIT NONE
   XA3=>CSTURB%XA3
   XA5=>CSTURB%XA5
   XCTD=>CSTURB%XCTD
-  XCTP=>CSTURB%XCTP
   !
   XPHI_LIM=>CSTURB%XPHI_LIM
   XSBL_O_BL=>CSTURB%XSBL_O_BL
diff --git a/src/PHYEX/turb/modd_param_mfshalln.f90 b/src/PHYEX/turb/modd_param_mfshalln.f90
index 72a5644bf955b2cf90266ebeed7b161564f081bc..664812c582f179a458ab25c786b1c0db22964a46 100644
--- a/src/PHYEX/turb/modd_param_mfshalln.f90
+++ b/src/PHYEX/turb/modd_param_mfshalln.f90
@@ -1,21 +1,21 @@
 !MNH_LIC Copyright 1994-2014 CNRS, Meteo-France and Universite Paul Sabatier
 !MNH_LIC This is part of the Meso-NH software governed by the CeCILL-C licence
-!MNH_LIC version 1. See LICENSE, CeCILL-C_V1-en.txt and CeCILL-C_V1-fr.txt  
+!MNH_LIC version 1. See LICENSE, CeCILL-C_V1-en.txt and CeCILL-C_V1-fr.txt
 !MNH_LIC for details. version 1.
 !-----------------------------------------------------------------
 !-----------------------------------------------------------------
 !     #############################
       MODULE MODD_PARAM_MFSHALL_n
 !     #############################
-!
-!!****  *MODD_PARAM_MFSHALL_n* - Declaration of Mass flux scheme free parameters
+!> @file
+!!      *MODD_PARAM_MFSHALL_n* - Declaration of Mass flux scheme free parameters
 !!
 !!    PURPOSE
 !!    -------
 !!    The purpose of this declarative module is to declare the
 !!    variables that may be set by namelist for the mass flux scheme
 !!
-!!**  IMPLICIT ARGUMENTS
+!!    IMPLICIT ARGUMENTS
 !!    ------------------
 !!      None 
 !!
@@ -42,54 +42,46 @@ IMPLICIT NONE
 
 TYPE PARAM_MFSHALL_t
 
-REAL               :: XIMPL_MF     ! degre of implicitness
+REAL               :: XIMPL_MF     !< degre of implicitness
       
-CHARACTER (LEN=4)  :: CMF_UPDRAFT  ! Type of Mass Flux Scheme
-                                     ! 'NONE' if no parameterization 
-CHARACTER (LEN=4)  :: CMF_CLOUD
+CHARACTER (LEN=4)  :: CMF_UPDRAFT  !< Type of Mass Flux Scheme
+                                   !! 'NONE' if no parameterization 
+CHARACTER (LEN=4)  :: CMF_CLOUD    !< Type of cloud scheme associated
 
                                      
-LOGICAL       :: LMIXUV      ! True if mixing of momentum
-LOGICAL       :: LMF_FLX     ! logical switch for the storage of
-                             ! the mass flux fluxes
-REAL          :: XALP_PERT   ! coefficient for the perturbation of
-                             ! theta_l and r_t at the first level of 
-                             ! the updraft
-REAL          ::    XABUO    ! coefficient of the buoyancy term in the w_up equation
-REAL          ::    XBENTR   ! coefficient of the entrainment term in the w_up equation
-REAL          ::    XBDETR   ! coefficient of the detrainment term in the w_up equation
-REAL          ::    XCMF     ! coefficient for the mass flux at the first level 
-                             ! of the updraft (closure)
-REAL          :: XENTR_MF    ! entrainment constant (m/Pa) = 0.2 (m) 
-REAL          :: XCRAD_MF    ! cloud radius in cloudy part
-REAL          :: XENTR_DRY   ! coefficient for entrainment in dry part 
-REAL          :: XDETR_DRY   ! coefficient for detrainment in dry part
-REAL          :: XDETR_LUP   ! coefficient for detrainment in dry part
-REAL          :: XKCF_MF     ! coefficient for cloud fraction
-REAL          :: XKRC_MF     ! coefficient for convective rc
+LOGICAL       :: LMIXUV      !< True if mixing of momentum
+LOGICAL       :: LMF_FLX     !< logical switch for the storage of the mass flux fluxes
+REAL          :: XALP_PERT   !< coefficient for the perturbation of
+                             !! theta_l and r_t at the first level of the updraft
+REAL          ::    XABUO    !< coefficient of the buoyancy term in the w_up equation
+REAL          ::    XBENTR   !< coefficient of the entrainment term in the w_up equation
+REAL          ::    XBDETR   !< coefficient of the detrainment term in the w_up equation
+REAL          ::    XCMF     !< coefficient for the mass flux at the first level of the updraft (closure)
+REAL          :: XENTR_MF    !< entrainment constant (m/Pa) = 0.2 (m) 
+REAL          :: XCRAD_MF    !< cloud radius in cloudy part
+REAL          :: XENTR_DRY   !< coefficient for entrainment in dry part 
+REAL          :: XDETR_DRY   !< coefficient for detrainment in dry part
+REAL          :: XDETR_LUP   !< coefficient for detrainment in dry part
+REAL          :: XKCF_MF     !< coefficient for cloud fraction
+REAL          :: XKRC_MF     !< coefficient for convective rc
 REAL          :: XTAUSIGMF
-REAL          :: XPRES_UV    ! coefficient for pressure term in wind
-                             ! mixing
-REAL          :: XALPHA_MF   ! coefficient for cloudy fraction
-REAL          :: XSIGMA_MF   ! coefficient for sigma computation
-REAL          :: XFRAC_UP_MAX! maximum Updraft fraction
-!
-!  Parameter for Rio et al (2010) formulation for entrainment and detrainment (RHCJ10)
-REAL          :: XA1
-REAL          :: XB
-REAL          :: XC
-REAL          :: XBETA1
-!
-!  Parameters for closure assumption of Hourdin et al 2002
-
-REAL          :: XR      ! Aspect ratio of updraft
+REAL          :: XPRES_UV    !< coefficient for pressure term in wind mixing
+REAL          :: XALPHA_MF   !< coefficient for cloudy fraction
+REAL          :: XSIGMA_MF   !< coefficient for sigma computation
+REAL          :: XFRAC_UP_MAX!< maximum Updraft fraction
+!
+REAL          :: XA1         !< Parameter for Rio et al (2010) formulation for entrainment and detrainment (RHCJ10)
+REAL          :: XB          !!
+REAL          :: XC          !!
+REAL          :: XBETA1      !!
 !
-!  Grey Zone 
-LOGICAL       :: LGZ      ! Grey Zone Surface Closure
-REAL          :: XGZ      ! Tuning of the surface initialisation
+REAL          :: XR          !< Parameter for closure assumption of Hourdin et al (2002): aspect ratio of updraft
 !
-!  Thermodynamic parameter
-REAL          :: XLAMBDA_MF      ! Lambda to compute ThetaS1 from ThetaL
+LOGICAL       :: LGZ         !< Grey Zone Surface Closure
+REAL          :: XGZ         !< Tuning of the surface initialisation for Grey Zone
+!
+LOGICAL       :: LTHETAS_MF      !< .TRUE. to use ThetaS1 instead of ThetaL
+REAL          :: XLAMBDA_MF      !< Thermodynamic parameter: Lambda to compute ThetaS1 from ThetaL
 
 END TYPE PARAM_MFSHALL_t
 
@@ -124,14 +116,29 @@ REAL, POINTER          :: XB=>NULL()
 REAL, POINTER          :: XC=>NULL()  
 REAL, POINTER          :: XBETA1=>NULL()
 REAL, POINTER          :: XR=>NULL() 
+LOGICAL, POINTER       :: LTHETAS_MF=>NULL()
 REAL, POINTER          :: XLAMBDA_MF=>NULL() 
 LOGICAL, POINTER       :: LGZ=>NULL() 
 REAL, POINTER          :: XGZ=>NULL() 
+!
+NAMELIST/NAM_PARAM_MFSHALLn/XIMPL_MF,CMF_UPDRAFT,CMF_CLOUD,LMIXUV,LMF_FLX,&
+                            XALP_PERT,XABUO,XBENTR,XBDETR,XCMF,XENTR_MF,&
+                            XCRAD_MF,XENTR_DRY,XDETR_DRY,XDETR_LUP,XKCF_MF,&
+                            XKRC_MF,XTAUSIGMF,XPRES_UV,XALPHA_MF,XSIGMA_MF,&
+                            XFRAC_UP_MAX,XA1,XB,XC,XBETA1,XR,LTHETAS_MF,LGZ,XGZ
+!
+!-------------------------------------------------------------------------------
+!
 CONTAINS
 
 SUBROUTINE PARAM_MFSHALL_GOTO_MODEL(KFROM, KTO)
+!! This subroutine associate all the pointers to the right component of
+!! the right strucuture. A value can be accessed through the structure PARAM_MFSHALLN
+!! or through the strucuture PARAM_MFSHALL_MODEL(KTO) or directly through these pointers.
 INTEGER, INTENT(IN) :: KFROM, KTO
 !
+IF(.NOT. ASSOCIATED(PARAM_MFSHALLN, PARAM_MFSHALL_MODEL(KTO))) THEN
+!
 PARAM_MFSHALLN => PARAM_MFSHALL_MODEL(KTO)
 !
 ! Save current state for allocated arrays
@@ -165,10 +172,143 @@ XB=>PARAM_MFSHALL_MODEL(KTO)%XB
 XC=>PARAM_MFSHALL_MODEL(KTO)%XC
 XBETA1=>PARAM_MFSHALL_MODEL(KTO)%XBETA1
 XR=>PARAM_MFSHALL_MODEL(KTO)%XR
+LTHETAS_MF=>PARAM_MFSHALL_MODEL(KTO)%LTHETAS_MF
 XLAMBDA_MF=>PARAM_MFSHALL_MODEL(KTO)%XLAMBDA_MF
 LGZ=>PARAM_MFSHALL_MODEL(KTO)%LGZ
 XGZ=>PARAM_MFSHALL_MODEL(KTO)%XGZ
 !
+ENDIF
+!
 END SUBROUTINE PARAM_MFSHALL_GOTO_MODEL
 
+SUBROUTINE PARAM_MFSHALLN_INIT(HPROGRAM, KUNITNML, LDNEEDNAM, KLUOUT, &
+                         &LDDEFAULTVAL, LDREADNAM, LDCHECK, KPRINT)
+!!*** *PARAM_MFSHALLN* - Code needed to initialize the MODD_PARAM_MFSHALL_n module
+!!
+!!*   PURPOSE
+!!    -------
+!!    Sets the default values, reads the namelist, performs the checks and prints
+!!
+!!*   METHOD
+!!    ------
+!!    0. Declarations
+!!       1. Declaration of arguments
+!!       2. Declaration of local variables
+!!    1. Default values
+!!    2. Namelist
+!!    3. Checks
+!!    4. Prints
+!!
+!!    AUTHOR
+!!    ------
+!!    S. Riette
+!!
+!!    MODIFICATIONS
+!!    -------------
+!!      Original    Feb 2023
+!-------------------------------------------------------------------------------
+!
+!*      0. DECLARATIONS
+!       ---------------
+!
+USE MODE_POSNAM_PHY, ONLY: POSNAM_PHY
+USE MODE_CHECK_NAM_VAL, ONLY: CHECK_NAM_VAL_CHAR
+!
+IMPLICIT NONE
+!
+!* 0.1. Declaration of arguments
+!       ------------------------
+!
+CHARACTER(LEN=6),  INTENT(IN) :: HPROGRAM     !< Name of the calling program
+INTEGER,           INTENT(IN) :: KUNITNML     !< Logical unit to access the namelist
+LOGICAL,           INTENT(IN) :: LDNEEDNAM    !< True to abort if namelist is absent
+INTEGER,           INTENT(IN) :: KLUOUT       !< Logical unit for outputs
+LOGICAL, OPTIONAL, INTENT(IN) :: LDDEFAULTVAL !< Must we initialize variables with default values (defaults to .TRUE.)
+LOGICAL, OPTIONAL, INTENT(IN) :: LDREADNAM    !< Must we read the namelist (defaults to .TRUE.)
+LOGICAL, OPTIONAL, INTENT(IN) :: LDCHECK      !< Must we perform some checks on values (defaults to .TRUE.)
+INTEGER, OPTIONAL, INTENT(IN) :: KPRINT       !< Print level (defaults to 0): 0 for no print, 1 to safely print namelist,
+                                              !! 2 to print informative messages
+!
+!* 0.2 Declaration of local variables
+!      ------------------------------
+!
+LOGICAL :: LLDEFAULTVAL, LLREADNAM, LLCHECK, LLFOUND
+INTEGER :: IPRINT
+
+LLDEFAULTVAL=.TRUE.
+LLREADNAM=.TRUE.
+LLCHECK=.TRUE.
+IPRINT=0
+IF(PRESENT(LDDEFAULTVAL)) LLDEFAULTVAL=LDDEFAULTVAL
+IF(PRESENT(LDREADNAM   )) LLREADNAM   =LDREADNAM
+IF(PRESENT(LDCHECK     )) LLCHECK     =LDCHECK
+IF(PRESENT(KPRINT      )) IPRINT      =KPRINT
+!
+!*      1. DEFAULT VALUES
+!       -----------------
+!
+IF(LLDEFAULTVAL) THEN
+  !NOTES ON GENERAL DEFAULTS AND MODEL-SPECIFIC DEFAULTS :
+  !- General default values *MUST* remain unchanged.
+  !- To change the default value for a given application,                                                 
+  !  an "IF(HPROGRAM=='...')" condition must be used.
+
+  XIMPL_MF=1.
+  CMF_UPDRAFT='EDKF'
+  CMF_CLOUD='DIRE'
+  LMIXUV=.TRUE.
+  LMF_FLX=.FALSE.
+  XALP_PERT=0.3
+  XABUO=1.
+  XBENTR=1.
+  XBDETR=0.
+  XCMF=0.065
+  XENTR_MF=0.035
+  XCRAD_MF=50.
+  XENTR_DRY=0.55
+  XDETR_DRY=10.
+  XDETR_LUP=1.
+  XKCF_MF=2.75
+  XKRC_MF=1.
+  XTAUSIGMF=600.
+  XPRES_UV=0.5
+  XALPHA_MF=2.
+  XSIGMA_MF=20.
+  XFRAC_UP_MAX=0.33
+  XA1=2./3.
+  XB=0.002
+  XC=0.012
+  XBETA1=0.9
+  XR=2.
+  LTHETAS_MF=.FALSE.
+  XLAMBDA_MF=0.
+  LGZ=.FALSE.
+  XGZ=1.83 ! between 1.83 and 1.33
+ENDIF
+!
+!*      2. NAMELIST
+!       -----------
+!
+IF(LLREADNAM) THEN
+  CALL POSNAM_PHY(KUNITNML, 'NAM_PARAM_MFSHALLN', LDNEEDNAM, LLFOUND, KLUOUT)
+  IF(LLFOUND) READ(UNIT=KUNITNML, NML=NAM_PARAM_MFSHALLn)
+ENDIF
+!
+!*      3. CHECKS
+!       ---------
+!
+IF(LLCHECK) THEN
+  CALL CHECK_NAM_VAL_CHAR(KLUOUT, 'CMF_CLOUD', CMF_CLOUD, 'NONE', 'STAT', 'DIRE', 'BIGA')
+  CALL CHECK_NAM_VAL_CHAR(KLUOUT, 'CMF_UPDRAFT', CMF_UPDRAFT, 'NONE', 'EDKF', 'RHCJ', 'RAHA')
+ENDIF
+!
+!*      3. PRINTS
+!       ---------
+!
+IF(IPRINT>=1) THEN
+  WRITE(UNIT=KLUOUT,NML=NAM_PARAM_MFSHALLn)
+ENDIF
+!
+END SUBROUTINE PARAM_MFSHALLN_INIT
+!
 END MODULE MODD_PARAM_MFSHALL_n
diff --git a/src/PHYEX/turb/modd_turbn.f90 b/src/PHYEX/turb/modd_turbn.f90
index defaab643b41917ccd50e45c98c533aee266b3bf..b4c173c55c0f15b29987a2d25658bbb25a326a2f 100644
--- a/src/PHYEX/turb/modd_turbn.f90
+++ b/src/PHYEX/turb/modd_turbn.f90
@@ -6,7 +6,7 @@
 !     ##################
       MODULE MODD_TURB_n
 !     ##################
-!
+!> @file
 !!****  *MODD_TURB$n* - declaration of turbulence scheme free parameters
 !!
 !!    PURPOSE
@@ -41,6 +41,7 @@
 !!  Philippe Wautelet: 05/2016-04/2018: new data structures and calls for I/O
 !!      D. Ricard     May 2021      add the switches for Leonard terms
 !!    JL Redelsperger  03/2021   Add O-A flux for auto-coupled LES case
+!!      S. Riette June 2023: add LSMOOTH_PRANDTL, XMINSIGS and XBL89EXP/XUSRBL89
 !!
 !-------------------------------------------------------------------------------
 !
@@ -53,90 +54,104 @@ IMPLICIT NONE
 TYPE TURB_t
 ! 
 ! 
-  REAL               :: XIMPL     ! implicitness degree for the vertical terms of 
-                                     ! the turbulence scheme
-  REAL               :: XKEMIN      ! mimimum value for the TKE                                  
-  REAL               :: XCEDIS      ! Constant for dissipation of Tke                            
-  REAL               :: XCADAP      ! Coefficient for ADAPtative mixing length
-  CHARACTER (LEN=4)  :: CTURBLEN  ! type of length used for the closure
-                                     ! 'BL89' Bougeault and Lacarrere scheme
-                                     ! 'DELT' length = ( volum) ** 1/3
-  CHARACTER (LEN=4)  :: CTURBDIM  ! dimensionality of the turbulence scheme
-                                     ! '1DIM' for purely vertical computations
-                                     ! '3DIM' for computations in the 3 
-                                     ! directions
-  LOGICAL            :: LTURB_FLX ! logical switch for the storage of all  
-                                     ! the turbulent fluxes
-  LOGICAL            :: LTURB_DIAG! logical switch for the storage of some 
-                                     ! turbulence related diagnostics
-  LOGICAL            :: LSUBG_COND! Switch for subgrid condensation 
-  LOGICAL            :: LSIGMAS   ! Switch for using Sigma_s from turbulence scheme
-  LOGICAL            :: LSIG_CONV ! Switch for computing Sigma_s due to convection
-!
-  LOGICAL            :: LHARAT
-  LOGICAL            :: LSTATNW   ! SWITCH LSTATNW
-  LOGICAL            :: LRMC01    ! Switch for computing separate mixing
-!                                    ! and dissipative length in the SBL
-!                                    ! according to Redelsperger, Mahe &
-!                                    ! Carlotti 2001
-  CHARACTER(LEN=4)   :: CTOM      ! type of Third Order Moments
-                                  ! 'NONE' none
-                                  ! 'TM06' Tomas Masson 2006
-  CHARACTER(LEN=4)   :: CSUBG_AUCV ! type of subgrid rc->rr autoconv. method
-  CHARACTER(LEN=80)  :: CSUBG_AUCV_RI ! type of subgrid ri->rs autoconv. method
-  CHARACTER(LEN=80)  :: CCONDENS ! subrgrid condensation PDF
-  CHARACTER(LEN=4)   :: CLAMBDA3 ! lambda3 choice for subgrid cloud scheme
-  CHARACTER(LEN=80)  :: CSUBG_MF_PDF ! PDF to use for MF cloud autoconversions
+  REAL               :: XIMPL       !< implicitness degree for the vertical terms of the turbulence scheme
+  REAL               :: XTKEMIN     !< mimimum value for the TKE                                  
+  REAL               :: XCED        !< Constant for dissipation of Tke                            
+  REAL               :: XCTP        !< Constant for temperature and vapor pressure-correlations
+  REAL               :: XCSHF       !< constant for the sensible heat flux 
+  REAL               :: XCHF        !< constant for the humidity flux 
+  REAL               :: XCTV        !< constant for the temperature variance
+  REAL               :: XCHV        !< constant for the humidity variance
+  REAL               :: XCHT1       !< first ct. for the humidity-temperature correlation
+  REAL               :: XCHT2       !< second ct. for the humidity-temperature correlation
+  REAL               :: XCPR1       !< first ct. for the turbulent Prandtl numbers
+  REAL               :: XCADAP      !< Coefficient for ADAPtative mixing length
+  CHARACTER (LEN=4)  :: CTURBLEN    !< type of length used for the closure:
+                                    !! 'BL89' Bougeault and Lacarrere scheme;
+                                    !! 'DELT' length = ( volum) ** 1/3
+  CHARACTER (LEN=4)  :: CTURBDIM    !< dimensionality of the turbulence scheme:
+                                    !! '1DIM' for purely vertical computations;
+                                    !! '3DIM' for computations in the 3 directions
+  LOGICAL            :: LTURB_FLX   !< logical switch for the storage of all the turbulent fluxes
+  LOGICAL            :: LTURB_DIAG  !< logical switch for the storage of some turbulence related diagnostics
+  LOGICAL            :: LSIG_CONV   !< Switch for computing Sigma_s due to convection
+!
+  LOGICAL            :: LHARAT      !< if true RACMO turbulence is used
+  LOGICAL            :: LRMC01      !< Switch for computing separate mixing and dissipative length in the SBL
+                                    !! according to Redelsperger, Mahe & Carlotti 2001
+  CHARACTER(LEN=4)   :: CTOM        !< type of Third Order Moments:
+                                    !! 'NONE' none;
+                                    !! 'TM06' Tomas Masson 2006
 
 !  REAL, DIMENSION(:,:), POINTER :: XBL_DEPTH=>NULL() ! BL depth for TOMS computations
 !  REAL, DIMENSION(:,:), POINTER :: XSBL_DEPTH=>NULL()! SurfaceBL depth for RMC01 computations
 !  REAL, DIMENSION(:,:,:), POINTER :: XWTHVMF=>NULL()! Mass Flux vert. transport of buoyancy
-  REAL               :: VSIGQSAT  ! coeff applied to qsat variance contribution
-  REAL, DIMENSION(:,:,:), POINTER :: XDYP=>NULL()    ! Dynamical production of Kinetic energy
-  REAL, DIMENSION(:,:,:), POINTER :: XTHP=>NULL()    ! Thermal production of Kinetic energy
-  REAL, DIMENSION(:,:,:), POINTER :: XTR=>NULL()    ! Transport production of Kinetic energy
-  REAL, DIMENSION(:,:,:), POINTER :: XDISS=>NULL()    ! Dissipation of Kinetic energy
-  REAL, DIMENSION(:,:,:), POINTER :: XLEM=>NULL()    ! Mixing length
-  REAL, DIMENSION(:,:,:), POINTER :: XSSUFL_C=>NULL() ! O-A interface flux for u
-  REAL, DIMENSION(:,:,:), POINTER :: XSSVFL_C=>NULL() ! O-A interface flux for v
-  REAL, DIMENSION(:,:,:), POINTER :: XSSTFL_C=>NULL() ! O-A interface flux for theta
-  REAL, DIMENSION(:,:,:), POINTER :: XSSRFL_C=>NULL() ! O-A interface flux for vapor
-  LOGICAL            :: LLEONARD ! logical switch for the computation of the Leornard Terms
-  REAL               :: XCOEFHGRADTHL  ! coeff applied to thl contribution
-  REAL               :: XCOEFHGRADRM  ! coeff applied to mixing ratio contribution
-  REAL               :: XALTHGRAD  ! altitude from which to apply the Leonard terms
-  REAL               :: XCLDTHOLD  ! cloud threshold to apply the Leonard terms
-                                   ! negative value : applied everywhere
-                                   ! 0.000001 applied only inside the clouds ri+rc > 10**-6 kg/kg
-!
+  REAL, DIMENSION(:,:,:), POINTER :: XDYP=>NULL()     !< Dynamical production of Kinetic energy
+  REAL, DIMENSION(:,:,:), POINTER :: XTHP=>NULL()     !< Thermal production of Kinetic energy
+  REAL, DIMENSION(:,:,:), POINTER :: XTR=>NULL()      !< Transport production of Kinetic energy
+  REAL, DIMENSION(:,:,:), POINTER :: XDISS=>NULL()    !< Dissipation of Kinetic energy
+  REAL, DIMENSION(:,:,:), POINTER :: XLEM=>NULL()     !< Mixing length
+  REAL, DIMENSION(:,:,:), POINTER :: XSSUFL_C=>NULL() !< O-A interface flux for u
+  REAL, DIMENSION(:,:,:), POINTER :: XSSVFL_C=>NULL() !< O-A interface flux for v
+  REAL, DIMENSION(:,:,:), POINTER :: XSSTFL_C=>NULL() !< O-A interface flux for theta
+  REAL, DIMENSION(:,:,:), POINTER :: XSSRFL_C=>NULL() !< O-A interface flux for vapor
+  LOGICAL            :: LLEONARD      !< logical switch for the computation of the Leornard Terms
+  REAL               :: XCOEFHGRADTHL !< coeff applied to thl contribution
+  REAL               :: XCOEFHGRADRM  !< coeff applied to mixing ratio contribution
+  REAL               :: XALTHGRAD  !< altitude from which to apply the Leonard terms
+  REAL               :: XCLDTHOLD  !< cloud threshold to apply the Leonard terms:
+                                   !!  negative value to apply everywhere;
+                                   !!  0.000001 applied only inside the clouds ri+rc > 10**-6 kg/kg
+  REAL               :: XLINI      !< initial value for BL mixing length
+  LOGICAL            :: LROTATE_WIND !< .TRUE. to rotate wind components
+  LOGICAL            :: LTKEMINTURB  !< set a minimum value for the TKE in the turbulence scheme
+  LOGICAL            :: LPROJQITURB  !< project the rt tendency on rc/ri
+  LOGICAL            :: LSMOOTH_PRANDTL !< .TRUE. to smooth prandtl functions
+  REAL               :: XMINSIGS     !< minimum value for SIGS computed by the turbulence scheme
+  REAL               :: XBL89EXP, XUSRBL89 !< exponent on final BL89 length
+  INTEGER           ::  NTURBSPLIT !<number of time-splitting for turb_hor
+  LOGICAL            :: LCLOUDMODIFLM !< .TRUE. to activate modification of mixing length in clouds
+  CHARACTER(LEN=4)  :: CTURBLEN_CLOUD  !< type of length in the clouds
+                                     ! 'DEAR' Deardorff mixing length
+                                     ! 'BL89' Bougeault and Lacarrere scheme
+                                     ! 'DELT' length = ( volum) ** 1/3
+REAL               :: XCOEF_AMPL_SAT  !< saturation of the amplification coefficient
+REAL               :: XCEI_MIN  !< minimum threshold for the instability index CEI
+                                     !(beginning of the amplification)
+REAL               :: XCEI_MAX  !< maximum threshold for the instability index CEI
+                                     !(beginning of the saturation of the amplification)
+REAL, DIMENSION(:,:,:), POINTER  :: XCEI !< Cloud Entrainment instability index to emphasize localy 
+                                         ! turbulent fluxes
+
+!  
 END TYPE TURB_t
 
 TYPE(TURB_t), DIMENSION(JPMODELMAX), TARGET, SAVE :: TURB_MODEL
 TYPE(TURB_t), POINTER, SAVE :: TURBN => NULL()
+!
 REAL, POINTER :: XIMPL=>NULL()
-REAL, POINTER :: XKEMIN=>NULL()
-REAL, POINTER :: XCEDIS=>NULL()
+REAL, POINTER :: XTKEMIN=>NULL()
+REAL, POINTER :: XCED=>NULL()
+REAL, POINTER :: XCTP=>NULL()
+REAL, POINTER :: XCSHF=>NULL()
+REAL, POINTER :: XCHF=>NULL()
+REAL, POINTER :: XCTV=>NULL()
+REAL, POINTER :: XCHV=>NULL()
+REAL, POINTER :: XCHT1=>NULL()
+REAL, POINTER :: XCHT2=>NULL()
+REAL, POINTER :: XCPR1=>NULL()
 REAL, POINTER :: XCADAP=>NULL()
 CHARACTER (LEN=4), POINTER :: CTURBLEN=>NULL()
 CHARACTER (LEN=4), POINTER :: CTURBDIM=>NULL()
 LOGICAL, POINTER :: LTURB_FLX=>NULL()
 LOGICAL, POINTER :: LTURB_DIAG=>NULL()
-LOGICAL, POINTER :: LSUBG_COND=>NULL()
-LOGICAL, POINTER :: LSIGMAS=>NULL()
 LOGICAL, POINTER :: LSIG_CONV=>NULL()
 LOGICAL, POINTER :: LRMC01=>NULL()
 LOGICAL, POINTER :: LHARAT=>NULL()
-LOGICAL, POINTER :: LSTATNW=>NULL()
 CHARACTER(LEN=4),POINTER :: CTOM=>NULL()
-CHARACTER(LEN=4),POINTER :: CSUBG_AUCV=>NULL()
-CHARACTER(LEN=80),POINTER :: CSUBG_AUCV_RI=>NULL()
-CHARACTER(LEN=80),POINTER :: CCONDENS=>NULL()
-CHARACTER(LEN=4),POINTER :: CLAMBDA3=>NULL()
-CHARACTER(LEN=80),POINTER :: CSUBG_MF_PDF=>NULL()
 REAL, DIMENSION(:,:), POINTER :: XBL_DEPTH=>NULL()
 REAL, DIMENSION(:,:), POINTER :: XSBL_DEPTH=>NULL()
 REAL, DIMENSION(:,:,:), POINTER :: XWTHVMF=>NULL()
-REAL, POINTER :: VSIGQSAT=>NULL()
 REAL, DIMENSION(:,:,:), POINTER :: XDYP=>NULL()
 REAL, DIMENSION(:,:,:), POINTER :: XTHP=>NULL()
 REAL, DIMENSION(:,:,:), POINTER :: XTR=>NULL()
@@ -151,54 +166,87 @@ REAL, POINTER :: XCOEFHGRADTHL=>NULL()
 REAL, POINTER :: XCOEFHGRADRM=>NULL()
 REAL, POINTER :: XALTHGRAD=>NULL()
 REAL, POINTER :: XCLDTHOLD=>NULL()
-
+REAL, POINTER :: XLINI=>NULL()
+LOGICAL, POINTER   :: LROTATE_WIND=>NULL()
+LOGICAL, POINTER   :: LTKEMINTURB=>NULL()
+LOGICAL, POINTER   :: LPROJQITURB=>NULL()
+LOGICAL, POINTER   :: LSMOOTH_PRANDTL=>NULL()
+REAL, POINTER :: XMINSIGS=>NULL()
+REAL, POINTER :: XBL89EXP=>NULL(), XUSRBL89=>NULL()
+INTEGER, POINTER :: NTURBSPLIT=>NULL()
+LOGICAL, POINTER :: LCLOUDMODIFLM=>NULL()
+CHARACTER(LEN=4), POINTER  :: CTURBLEN_CLOUD=>NULL()
+REAL, POINTER :: XCOEF_AMPL_SAT=>NULL()
+REAL, POINTER :: XCEI_MIN=>NULL()
+REAL, POINTER :: XCEI_MAX =>NULL()
+REAL, DIMENSION(:,:,:), POINTER  :: XCEI=>NULL()
+!
+NAMELIST/NAM_TURBn/XIMPL,CTURBLEN,CTURBDIM,LTURB_FLX,LTURB_DIAG,  &
+                   LSIG_CONV,LRMC01,CTOM,&
+                   XTKEMIN,XCED,XCTP,XCADAP,&
+                   LLEONARD,XCOEFHGRADTHL, XCOEFHGRADRM, &
+                   XALTHGRAD, XCLDTHOLD, XLINI, LHARAT, &
+                   LPROJQITURB, LSMOOTH_PRANDTL, XMINSIGS, NTURBSPLIT, &
+                   LCLOUDMODIFLM, CTURBLEN_CLOUD, &
+                   XCOEF_AMPL_SAT, XCEI_MIN, XCEI_MAX
+!
+!-------------------------------------------------------------------------------
+!
 CONTAINS
 
 SUBROUTINE TURB_GOTO_MODEL(KFROM, KTO)
+!! This subroutine associate all the pointers to the right component of
+!! the right strucuture. A value can be accessed through the structure TURBN
+!! or through the strucuture TURB_MODEL(KTO) or directly through these pointers.
+IMPLICIT NONE
 INTEGER, INTENT(IN) :: KFROM, KTO
 !
+IF(.NOT. ASSOCIATED(TURBN, TURB_MODEL(KTO))) THEN
+!
 TURBN => TURB_MODEL(KTO)
 !
 ! Save current state for allocated arrays
 !
-!TURB_MODEL(KFROM)%XBL_DEPTH=>XBL_DEPTH !Done in FIELDLIST_GOTO_MODEL
-!TURB_MODEL(KFROM)%XSBL_DEPTH=>XSBL_DEPTH !Done in FIELDLIST_GOTO_MODEL
-!TURB_MODEL(KFROM)%XWTHVMF=>XWTHVMF !Done in FIELDLIST_GOTO_MODEL
-TURB_MODEL(KFROM)%XDYP=>XDYP 
-TURB_MODEL(KFROM)%XTHP=>XTHP 
-TURB_MODEL(KFROM)%XTR=>XTR 
-TURB_MODEL(KFROM)%XDISS=>XDISS
-TURB_MODEL(KFROM)%XLEM=>XLEM
-TURB_MODEL(KFROM)%XSSUFL_C=>XSSUFL_C
-TURB_MODEL(KFROM)%XSSVFL_C=>XSSVFL_C
-TURB_MODEL(KFROM)%XSSTFL_C=>XSSTFL_C
-TURB_MODEL(KFROM)%XSSRFL_C=>XSSRFL_C
+IF(KFROM>0 .AND. KFROM<=JPMODELMAX) THEN
+  !TURB_MODEL(KFROM)%XBL_DEPTH=>XBL_DEPTH !Done in FIELDLIST_GOTO_MODEL
+  !TURB_MODEL(KFROM)%XSBL_DEPTH=>XSBL_DEPTH !Done in FIELDLIST_GOTO_MODEL
+  !TURB_MODEL(KFROM)%XWTHVMF=>XWTHVMF !Done in FIELDLIST_GOTO_MODEL
+  TURB_MODEL(KFROM)%XDYP=>XDYP 
+  TURB_MODEL(KFROM)%XTHP=>XTHP 
+  TURB_MODEL(KFROM)%XTR=>XTR 
+  TURB_MODEL(KFROM)%XDISS=>XDISS
+  TURB_MODEL(KFROM)%XLEM=>XLEM
+  TURB_MODEL(KFROM)%XSSUFL_C=>XSSUFL_C
+  TURB_MODEL(KFROM)%XSSVFL_C=>XSSVFL_C
+  TURB_MODEL(KFROM)%XSSTFL_C=>XSSTFL_C
+  TURB_MODEL(KFROM)%XSSRFL_C=>XSSRFL_C
+  TURB_MODEL(KFROM)%XCEI=>XCEI
+ENDIF
 !
 ! Current model is set to model KTO
 XIMPL=>TURB_MODEL(KTO)%XIMPL
-XKEMIN=>TURB_MODEL(KTO)%XKEMIN
-XCEDIS=>TURB_MODEL(KTO)%XCEDIS
+XTKEMIN=>TURB_MODEL(KTO)%XTKEMIN
+XCED=>TURB_MODEL(KTO)%XCED
+XCTP=>TURB_MODEL(KTO)%XCTP
+XCSHF=>TURB_MODEL(KTO)%XCSHF
+XCHF=>TURB_MODEL(KTO)%XCHF
+XCTV=>TURB_MODEL(KTO)%XCTV
+XCHV=>TURB_MODEL(KTO)%XCHV
+XCHT1=>TURB_MODEL(KTO)%XCHT1
+XCHT2=>TURB_MODEL(KTO)%XCHT2
+XCPR1=>TURB_MODEL(KTO)%XCPR1
 XCADAP=>TURB_MODEL(KTO)%XCADAP
 CTURBLEN=>TURB_MODEL(KTO)%CTURBLEN
 CTURBDIM=>TURB_MODEL(KTO)%CTURBDIM
 LTURB_FLX=>TURB_MODEL(KTO)%LTURB_FLX
 LHARAT=>TURB_MODEL(KTO)%LHARAT
-LSTATNW=>TURB_MODEL(KTO)%LSTATNW
 LTURB_DIAG=>TURB_MODEL(KTO)%LTURB_DIAG
-LSUBG_COND=>TURB_MODEL(KTO)%LSUBG_COND
-LSIGMAS=>TURB_MODEL(KTO)%LSIGMAS
 LSIG_CONV=>TURB_MODEL(KTO)%LSIG_CONV
 LRMC01=>TURB_MODEL(KTO)%LRMC01
 CTOM=>TURB_MODEL(KTO)%CTOM
-CSUBG_AUCV=>TURB_MODEL(KTO)%CSUBG_AUCV
-CSUBG_AUCV_RI=>TURB_MODEL(KTO)%CSUBG_AUCV_RI
-CCONDENS=>TURB_MODEL(KTO)%CCONDENS
-CLAMBDA3=>TURB_MODEL(KTO)%CLAMBDA3
-CSUBG_MF_PDF=>TURB_MODEL(KTO)%CSUBG_MF_PDF
 !XBL_DEPTH=>TURB_MODEL(KTO)%XBL_DEPTH !Done in FIELDLIST_GOTO_MODEL
 !XSBL_DEPTH=>TURB_MODEL(KTO)%XSBL_DEPTH !Done in FIELDLIST_GOTO_MODEL
 !XWTHVMF=>TURB_MODEL(KTO)%XWTHVMF !Done in FIELDLIST_GOTO_MODEL
-VSIGQSAT=>TURB_MODEL(KTO)%VSIGQSAT
 XDYP=>TURB_MODEL(KTO)%XDYP 
 XTHP=>TURB_MODEL(KTO)%XTHP 
 XTR=>TURB_MODEL(KTO)%XTR  
@@ -213,7 +261,171 @@ XCOEFHGRADTHL=>TURB_MODEL(KTO)%XCOEFHGRADTHL
 XCOEFHGRADRM=>TURB_MODEL(KTO)%XCOEFHGRADRM
 XALTHGRAD=>TURB_MODEL(KTO)%XALTHGRAD
 XCLDTHOLD=>TURB_MODEL(KTO)%XCLDTHOLD
-
+XLINI=>TURB_MODEL(KTO)%XLINI
+LROTATE_WIND=>TURB_MODEL(KTO)%LROTATE_WIND
+LTKEMINTURB=>TURB_MODEL(KTO)%LTKEMINTURB
+LPROJQITURB=>TURB_MODEL(KTO)%LPROJQITURB
+LSMOOTH_PRANDTL=>TURB_MODEL(KTO)%LSMOOTH_PRANDTL
+XMINSIGS=>TURB_MODEL(KTO)%XMINSIGS
+XBL89EXP=>TURB_MODEL(KTO)%XBL89EXP
+XUSRBL89=>TURB_MODEL(KTO)%XUSRBL89
+NTURBSPLIT=>TURB_MODEL(KTO)%NTURBSPLIT
+LCLOUDMODIFLM=>TURB_MODEL(KTO)%LCLOUDMODIFLM
+CTURBLEN_CLOUD=>TURB_MODEL(KTO)%CTURBLEN_CLOUD
+XCOEF_AMPL_SAT=>TURB_MODEL(KTO)%XCOEF_AMPL_SAT
+XCEI_MIN=>TURB_MODEL(KTO)%XCEI_MIN
+XCEI_MAX =>TURB_MODEL(KTO)%XCEI_MAX
+XCEI=>TURB_MODEL(KTO)%XCEI
+!
+ENDIF
+!
 END SUBROUTINE TURB_GOTO_MODEL
 
+SUBROUTINE TURBN_INIT(HPROGRAM, KUNITNML, LDNEEDNAM, KLUOUT, &
+                     &LDDEFAULTVAL, LDREADNAM, LDCHECK, KPRINT)
+!!*** *TURBN_INIT* - Code needed to initialize the MODD_TURB_n module
+!!
+!!*   PURPOSE
+!!    -------
+!!    Sets the default values, reads the namelist, performs the checks and prints
+!!
+!!*   METHOD
+!!    ------
+!!    0. Declarations
+!!       1. Declaration of arguments
+!!       2. Declaration of local variables
+!!    1. Default values
+!!    2. Namelist
+!!    3. Checks
+!!    4. Prints
+!!
+!!    AUTHOR
+!!    ------
+!!    S. Riette
+!!
+!!    MODIFICATIONS
+!!    -------------
+!!      Original    Feb 2023
+!-------------------------------------------------------------------------------
+!
+!*      0. DECLARATIONS
+!       ---------------
+!
+USE MODE_POSNAM_PHY, ONLY: POSNAM_PHY
+USE MODE_CHECK_NAM_VAL, ONLY: CHECK_NAM_VAL_CHAR
+USE MODD_PARAMETERS, ONLY: XUNDEF
+!
+IMPLICIT NONE
+!
+!* 0.1. Declaration of arguments
+!       ------------------------
+!
+CHARACTER(LEN=6),  INTENT(IN) :: HPROGRAM     !< Name of the calling program
+INTEGER,           INTENT(IN) :: KUNITNML     !< Logical unit to access the namelist
+LOGICAL,           INTENT(IN) :: LDNEEDNAM    !< True to abort if namelist is absent
+INTEGER,           INTENT(IN) :: KLUOUT       !< Logical unit for outputs
+LOGICAL, OPTIONAL, INTENT(IN) :: LDDEFAULTVAL !< Must we initialize variables with default values (defaults to .TRUE.)
+LOGICAL, OPTIONAL, INTENT(IN) :: LDREADNAM    !< Must we read the namelist (defaults to .TRUE.)
+LOGICAL, OPTIONAL, INTENT(IN) :: LDCHECK      !< Must we perform some checks on values (defaults to .TRUE.)
+INTEGER, OPTIONAL, INTENT(IN) :: KPRINT       !< Print level (defaults to 0): 0 for no print, 1 to safely print namelist,
+                                              !! 2 to print informative messages
+!
+!* 0.2 Declaration of local variables
+!      ------------------------------
+!
+LOGICAL :: LLDEFAULTVAL, LLREADNAM, LLCHECK, LLFOUND
+INTEGER :: IPRINT
+
+LLDEFAULTVAL=.TRUE.
+LLREADNAM=.TRUE.
+LLCHECK=.TRUE.
+IPRINT=0
+IF(PRESENT(LDDEFAULTVAL)) LLDEFAULTVAL=LDDEFAULTVAL
+IF(PRESENT(LDREADNAM   )) LLREADNAM   =LDREADNAM
+IF(PRESENT(LDCHECK     )) LLCHECK     =LDCHECK
+IF(PRESENT(KPRINT      )) IPRINT      =KPRINT
+!
+!*      1. DEFAULT VALUES
+!       -----------------
+!
+IF(LLDEFAULTVAL) THEN
+  !NOTES ON GENERAL DEFAULTS AND MODEL-SPECIFIC DEFAULTS :
+  !- General default values *MUST* remain unchanged.
+  !- To change the default value for a given application,                                                 
+  !  an "IF(HPROGRAM=='...')" condition must be used.
+
+  XIMPL     = 1.
+  XTKEMIN   = 0.01
+  XCED      = XUNDEF
+  XCTP      = XUNDEF
+  XCADAP    = 0.5
+  CTURBLEN  = 'BL89'
+  CTURBDIM  = '1DIM'
+  LTURB_FLX =.FALSE.
+  LTURB_DIAG=.FALSE.
+  LSIG_CONV =.FALSE.
+  LRMC01    =.FALSE.
+  CTOM      ='NONE'
+  LLEONARD =.FALSE.
+  XCOEFHGRADTHL = 1.0
+  XCOEFHGRADRM = 1.0
+  XALTHGRAD = 2000.0
+  XCLDTHOLD = -1.0
+  XLINI=0.1 !old value: 10.
+  LHARAT=.FALSE.
+  LROTATE_WIND=.FALSE.
+  LTKEMINTURB=.TRUE.
+  LPROJQITURB=.TRUE.
+  LSMOOTH_PRANDTL=.TRUE.
+  XMINSIGS=0.
+  NTURBSPLIT=1
+  LCLOUDMODIFLM = .FALSE.
+  CTURBLEN_CLOUD = 'DELT'
+  XCOEF_AMPL_SAT = 5.
+  XCEI_MIN = 0.001E-06
+  XCEI_MAX = 0.01E-06
+  !
+  IF(HPROGRAM=='AROME') THEN
+    XTKEMIN=1.E-6
+    XLINI=0.
+    LPROJQITURB=.FALSE.
+    LSMOOTH_PRANDTL=.FALSE.
+  ELSEIF(HPROGRAM=='MESONH') THEN
+    LROTATE_WIND=.TRUE.
+    LTKEMINTURB=.FALSE.
+    XMINSIGS=1.E-12
+  ELSEIF(HPROGRAM=='LMDZ') THEN
+    XTKEMIN=1.E-6
+    XLINI=0.
+  ENDIF
+ENDIF
+!
+!*      2. NAMELIST
+!       -----------
+!
+IF(LLREADNAM) THEN
+  CALL POSNAM_PHY(KUNITNML, 'NAM_TURBN', LDNEEDNAM, LLFOUND, KLUOUT) 
+  IF(LLFOUND) READ(UNIT=KUNITNML, NML=NAM_TURBn) 
+ENDIF
+!
+!*      3. CHECKS
+!       ---------
+!
+IF(LLCHECK) THEN
+  CALL CHECK_NAM_VAL_CHAR(KLUOUT, 'CTURBDIM', CTURBDIM, '1DIM', '3DIM')
+  CALL CHECK_NAM_VAL_CHAR(KLUOUT, 'CTURBLEN', CTURBLEN, 'DELT', 'BL89', 'RM17', 'DEAR', 'BLKR', 'ADAP')
+  CALL CHECK_NAM_VAL_CHAR(KLUOUT, 'CTOM', CTOM, 'NONE', 'TM06')
+  CALL CHECK_NAM_VAL_CHAR(KLUOUT, 'CTURBLEN_CLOUD', CTURBLEN_CLOUD, 'DELT', 'BL89', 'RM17', 'DEAR', 'BLKR', 'ADAP')
+
+ENDIF
+!
+!*      3. PRINTS
+!       ---------
+!
+IF(IPRINT>=1) THEN
+  WRITE(UNIT=KLUOUT,NML=NAM_TURBn) 
+ENDIF
+!
+END SUBROUTINE TURBN_INIT
+!
 END MODULE MODD_TURB_n
diff --git a/src/PHYEX/turb/mode_bl89.f90 b/src/PHYEX/turb/mode_bl89.f90
index 6a24431aebf4772b89a9fe6fe282f2a8357c0edd..dc0afbd4c22cf84d7a9448eaf81a9d173f3ee4ec 100644
--- a/src/PHYEX/turb/mode_bl89.f90
+++ b/src/PHYEX/turb/mode_bl89.f90
@@ -6,9 +6,8 @@ MODULE MODE_BL89
 IMPLICIT NONE
 CONTAINS
 !     ######spl
-      SUBROUTINE BL89(D,CST,CSTURB,PZZ,PDZZ,PTHVREF,PTHLM,KRR,PRM,PTKEM,PSHEAR,PLM,OOCEAN,HPROGRAM)
-      USE PARKIND1, ONLY : JPRB
-      USE YOMHOOK , ONLY : LHOOK, DR_HOOK
+      SUBROUTINE BL89(D,CST,CSTURB,TURBN,PZZ,PDZZ,PTHVREF,PTHLM,KRR,PRM,PTKEM,PSHEAR,PLM,OOCEAN)
+      USE YOMHOOK , ONLY : LHOOK, DR_HOOK, JPHOOK
 !     #########################################################
 !
 !!****  *BL89* -
@@ -58,8 +57,8 @@ CONTAINS
 !
 USE MODD_CST, ONLY: CST_t
 USE MODD_CTURB, ONLY: CSTURB_t
+USE MODD_TURB_n, ONLY: TURB_t
 USE MODD_DIMPHYEX,   ONLY: DIMPHYEX_t
-USE MODD_PARAMETERS, ONLY: JPVEXT_TURB
 USE MODD_PRECISION, ONLY: MNHREAL
 !
 !
@@ -71,6 +70,7 @@ IMPLICIT NONE
 TYPE(DIMPHYEX_t),         INTENT(IN)  :: D
 TYPE(CST_t),              INTENT(IN)  :: CST
 TYPE(CSTURB_t),           INTENT(IN)  :: CSTURB
+TYPE(TURB_t),             INTENT(IN)  :: TURBN
 REAL, DIMENSION(D%NIJT,D%NKT),   INTENT(IN),TARGET  :: PZZ
 REAL, DIMENSION(D%NIJT,D%NKT),   INTENT(IN),TARGET  :: PDZZ
 REAL, DIMENSION(D%NIJT,D%NKT),   INTENT(IN),TARGET  :: PTHVREF
@@ -81,7 +81,6 @@ REAL, DIMENSION(D%NIJT,D%NKT),   INTENT(IN),TARGET  :: PTKEM     ! TKE
 REAL, DIMENSION(D%NIJT,D%NKT),   INTENT(IN),TARGET  :: PSHEAR
 REAL, DIMENSION(D%NIJT,D%NKT),   INTENT(OUT),TARGET :: PLM       ! Mixing length
 LOGICAL,                  INTENT(IN)  ::  OOCEAN       ! switch for Ocean model version
-CHARACTER(LEN=6),         INTENT(IN)  ::  HPROGRAM     ! CPROGRAM is the program currently running (modd_conf)
 !   thermodynamical variables PTHLM=Theta at the begining
 !
 !*       0.2   Declaration of local variables
@@ -113,10 +112,10 @@ INTEGER :: JRR        ! moist loop counter
 REAL    :: ZRVORD     ! Rv/Rd
 REAL    :: ZPOTE,ZLWORK1,ZLWORK2
 REAL    :: ZTEST,ZTEST0,ZTESTM ! test for vectorization
-REAL    :: Z2SQRT2,ZUSRBL89,ZBL89EXP
+REAL    :: Z2SQRT2
 !-------------------------------------------------------------------------------
 !
-REAL(KIND=JPRB) :: ZHOOK_HANDLE
+REAL(KIND=JPHOOK) :: ZHOOK_HANDLE
 IF (LHOOK) CALL DR_HOOK('BL89',0,ZHOOK_HANDLE)
 Z2SQRT2=2.*SQRT(2.)
 !
@@ -158,9 +157,6 @@ END IF
 ZSQRT_TKE(:,:) = SQRT(PTKEM(:,:))
 !$mnh_end_expand_array(JIJ=IIJB:IIJE,JK=1:IKT)
 !
-!ZBL89EXP is defined here because (and not in ini_cturb) because CSTURB%XCED is defined in read_exseg (depending on BL89/RM17)
-ZBL89EXP = LOG(16.)/(4.*LOG(CST%XKARMAN)+LOG(CSTURB%XCED)-3.*LOG(CSTURB%XCMFS))
-ZUSRBL89 = 1./ZBL89EXP
 !-------------------------------------------------------------------------------
 !
 !*       2.    Virtual potential temperature on the model grid
@@ -249,11 +245,7 @@ DO JK=IKTB,IKTE
           + sqrt(abs( (CSTURB%XRM17*PSHEAR(JIJ,JKK)*ZSQRT_TKE(JIJ,JK) &
           + ( -ZG_O_THVREF(JIJ,JK) * (ZVPT(JIJ,JKK) - ZVPT(JIJ,JK)) ))**2.0 + &
           2. * ZINTE(JIJ) * &
-#ifdef REPRO48
-          ZG_O_THVREF(JIJ,JK) * ZDELTVPT(JIJ,JKK)/ PDZZ(JIJ,JKK)))) / &
-#else
           (ZG_O_THVREF(JIJ,JK) * ZDELTVPT(JIJ,JKK)/ PDZZ(JIJ,JKK))))) / &
-#endif
           (ZG_O_THVREF(JIJ,JK) * ZDELTVPT(JIJ,JKK) / PDZZ(JIJ,JKK))
         ZLWORK(JIJ)=ZLWORK(JIJ)+ZTEST0*(ZTEST*ZLWORK1+(1-ZTEST)*ZLWORK2)
         ZINTE(JIJ) = ZINTE(JIJ) - ZPOTE
@@ -298,11 +290,7 @@ DO JK=IKTB,IKTE
           (CSTURB%XRM17*PSHEAR(JIJ,JKK)*ZSQRT_TKE(JIJ,JK)   &
             + ( ZG_O_THVREF(JIJ,JK) * (ZVPT(JIJ,JKK-IKL) - ZVPT(JIJ,JK))) )**2    &
             + 2. * ZINTE(JIJ) * &
-#ifdef REPRO48
-             ZG_O_THVREF(JIJ,JK)* ZDELTVPT(JIJ,JKK)/PDZZ(JIJ,JKK)))) / &
-#else
             (ZG_O_THVREF(JIJ,JK)* ZDELTVPT(JIJ,JKK)/PDZZ(JIJ,JKK))))) / &
-#endif
             (ZG_O_THVREF(JIJ,JK) * ZDELTVPT(JIJ,JKK) / PDZZ(JIJ,JKK))
         ZLWORK(JIJ)=ZLWORK(JIJ)+ZTEST0*(ZTEST*ZLWORK1+(1-ZTEST)*ZLWORK2)
         ZINTE(JIJ) = ZINTE(JIJ) - ZPOTE
@@ -318,14 +306,9 @@ DO JK=IKTB,IKTE
     ZLWORK1=MAX(PLMDN(JIJ,JK),1.E-10_MNHREAL)
     ZLWORK2=MAX(ZLWORK(JIJ),1.E-10_MNHREAL)
     ZPOTE = ZLWORK1 / ZLWORK2
-#ifdef REPRO48
-    ZLWORK2=1.d0 + ZPOTE**(2./3.)
-    PLM(JIJ,JK) = Z2SQRT2*ZLWORK1/(ZLWORK2*SQRT(ZLWORK2))
-#else
-    ZLWORK2=1.d0 + ZPOTE**ZBL89EXP
-    PLM(JIJ,JK) = ZLWORK1*(2./ZLWORK2)**ZUSRBL89
-#endif
-    PLM(JIJ,JK)=MAX(PLM(JIJ,JK),CSTURB%XLINI)
+    ZLWORK2=1.d0 + ZPOTE**TURBN%XBL89EXP
+    PLM(JIJ,JK) = ZLWORK1*(2./ZLWORK2)**TURBN%XUSRBL89
+    PLM(JIJ,JK)=MAX(PLM(JIJ,JK),TURBN%XLINI)
   END DO
 
 
diff --git a/src/PHYEX/turb/mode_bl_depth_diag.f90 b/src/PHYEX/turb/mode_bl_depth_diag.f90
index a5e897a8dd12b49922dcc1c1a54c6897f4e26e8b..8d91826c43e86f086f655bab19ede5b561a3c616 100644
--- a/src/PHYEX/turb/mode_bl_depth_diag.f90
+++ b/src/PHYEX/turb/mode_bl_depth_diag.f90
@@ -3,6 +3,7 @@
 !MNH_LIC version 1. See LICENSE, CeCILL-C_V1-en.txt and CeCILL-C_V1-fr.txt  
 !MNH_LIC for details. version 1.
 MODULE MODE_BL_DEPTH_DIAG
+IMPLICIT NONE
 !
 INTERFACE BL_DEPTH_DIAG  
       MODULE PROCEDURE BL_DEPTH_DIAG_3D
@@ -12,8 +13,7 @@ END INTERFACE
 CONTAINS
 !
 SUBROUTINE BL_DEPTH_DIAG_3D(D,PSURF,PZS,PFLUX,PZZ,PFTOP_O_FSURF,BL_DEPTH_DIAG3D)
-USE PARKIND1, ONLY : JPRB
-USE YOMHOOK , ONLY : LHOOK, DR_HOOK
+USE YOMHOOK , ONLY : LHOOK, DR_HOOK, JPHOOK
 !
 !
 !!****  *SBL_DEPTH* - computes SBL depth
@@ -72,7 +72,7 @@ REAL    :: ZFLX     ! flux at top of BL
 !
 !----------------------------------------------------------------------------
 !
-REAL(KIND=JPRB) :: ZHOOK_HANDLE
+REAL(KIND=JPHOOK) :: ZHOOK_HANDLE
 IF (LHOOK) CALL DR_HOOK('BL_DEPTH_DIAG_3D',0,ZHOOK_HANDLE)
 IKB=D%NKTB
 IKE=D%NKTE
@@ -106,8 +106,7 @@ IF (LHOOK) CALL DR_HOOK('BL_DEPTH_DIAG_3D',1,ZHOOK_HANDLE)
 END SUBROUTINE BL_DEPTH_DIAG_3D
 !
 SUBROUTINE BL_DEPTH_DIAG_1D(D,PSURF,PZS,PFLUX,PZZ,PFTOP_O_FSURF,BL_DEPTH_DIAG1D)
-USE PARKIND1, ONLY : JPRB
-USE YOMHOOK , ONLY : LHOOK, DR_HOOK
+USE YOMHOOK , ONLY : LHOOK, DR_HOOK, JPHOOK
 !
 USE MODD_DIMPHYEX, ONLY: DIMPHYEX_t
 !
@@ -128,7 +127,7 @@ REAL, DIMENSION(1,1,D%NKT)       :: ZZZ
 REAL, DIMENSION(1,1)             :: ZBL_DEPTH_DIAG
 !
 INTEGER :: IKT
-REAL(KIND=JPRB) :: ZHOOK_HANDLE
+REAL(KIND=JPHOOK) :: ZHOOK_HANDLE
 IF (LHOOK) CALL DR_HOOK('BL_DEPTH_DIAG_1D',0,ZHOOK_HANDLE)
 IKT=D%NKT
 ZSURF        = PSURF
diff --git a/src/PHYEX/turb/mode_compute_bl89_ml.f90 b/src/PHYEX/turb/mode_compute_bl89_ml.f90
index f59e548a91da1410966c8e8f78bf8db1b66cb56b..8ebf242e6e46eb0cc03322a68d8e5cead996cbca 100644
--- a/src/PHYEX/turb/mode_compute_bl89_ml.f90
+++ b/src/PHYEX/turb/mode_compute_bl89_ml.f90
@@ -5,8 +5,7 @@ CONTAINS
       SUBROUTINE COMPUTE_BL89_ML(D, CST, CSTURB,PDZZ2D, &
              PTKEM_DEP,PG_O_THVREF,PVPT,KK,OUPORDN,OFLUX,PSHEAR,PLWORK)
 
-      USE PARKIND1, ONLY : JPRB
-      USE YOMHOOK , ONLY : LHOOK, DR_HOOK
+      USE YOMHOOK , ONLY : LHOOK, DR_HOOK, JPHOOK
 !     ###################################################################
 !!
 !!     COMPUTE_BL89_ML routine to:
@@ -88,7 +87,7 @@ REAL    :: ZTEST,ZTEST0,ZTESTM  !test for vectorization
 !
 !*       1.    INITIALISATION
 !              --------------
-REAL(KIND=JPRB) :: ZHOOK_HANDLE
+REAL(KIND=JPHOOK) :: ZHOOK_HANDLE
 IF (LHOOK) CALL DR_HOOK('COMPUTE_BL89_ML',0,ZHOOK_HANDLE)
 !
 IIJE=D%NIJE
diff --git a/src/PHYEX/turb/mode_compute_function_thermo_mf.f90 b/src/PHYEX/turb/mode_compute_function_thermo_mf.f90
index 2e294edf612d092d297afe27ba293a86e96a588e..6ec457e681f18793cb28cbe4b62a52e4e89a84a7 100644
--- a/src/PHYEX/turb/mode_compute_function_thermo_mf.f90
+++ b/src/PHYEX/turb/mode_compute_function_thermo_mf.f90
@@ -53,8 +53,7 @@ CONTAINS
 !
 USE MODD_DIMPHYEX,        ONLY: DIMPHYEX_t
 USE MODD_CST,             ONLY: CST_t
-USE PARKIND1, ONLY : JPRB
-USE YOMHOOK , ONLY : LHOOK, DR_HOOK
+USE YOMHOOK , ONLY : LHOOK, DR_HOOK, JPHOOK
 !
 IMPLICIT NONE
 !
@@ -95,7 +94,7 @@ REAL, DIMENSION(D%NIJT,D%NKT) ::      &
 INTEGER             :: JRR, JIJ, JK
 INTEGER :: IIJB,IIJE ! physical horizontal domain indices
 INTEGER :: IKTB,IKTE
-REAL(KIND=JPRB) :: ZHOOK_HANDLE
+REAL(KIND=JPHOOK) :: ZHOOK_HANDLE
 !
 !-------------------------------------------------------------------------------
 !
diff --git a/src/PHYEX/turb/mode_compute_mf_cloud.f90 b/src/PHYEX/turb/mode_compute_mf_cloud.f90
index c1ee0cfd6d86aca723cc05f4b4f8d73582ef19df..a9a6d456848a4ccfc3ed64fa2c5798c134574f2e 100644
--- a/src/PHYEX/turb/mode_compute_mf_cloud.f90
+++ b/src/PHYEX/turb/mode_compute_mf_cloud.f90
@@ -11,7 +11,7 @@ IMPLICIT NONE
 CONTAINS
 !
 !     ######spl
-      SUBROUTINE COMPUTE_MF_CLOUD(D, CST, CSTURB, PARAMMF, OSTATNW,         &
+      SUBROUTINE COMPUTE_MF_CLOUD(D, CST, TURBN, PARAMMF, OSTATNW,         &
                                   KRR, KRRL, KRRI,                          &
                                   PFRAC_ICE,                                &
                                   PRC_UP,PRI_UP,PEMF,                       &
@@ -63,7 +63,7 @@ CONTAINS
 !
 USE MODD_DIMPHYEX,        ONLY: DIMPHYEX_t
 USE MODD_CST,             ONLY: CST_t
-USE MODD_CTURB,           ONLY: CSTURB_t
+USE MODD_TURB_n,          ONLY: TURB_t
 USE MODD_PARAM_MFSHALL_n, ONLY: PARAM_MFSHALL_t
 !
 USE MODE_MSG
@@ -72,8 +72,7 @@ USE MODE_COMPUTE_MF_CLOUD_DIRECT, ONLY: COMPUTE_MF_CLOUD_DIRECT
 USE MODE_COMPUTE_MF_CLOUD_STAT, ONLY: COMPUTE_MF_CLOUD_STAT
 USE MODE_COMPUTE_MF_CLOUD_BIGAUS, ONLY: COMPUTE_MF_CLOUD_BIGAUS
 !
-USE PARKIND1, ONLY : JPRB
-USE YOMHOOK , ONLY : LHOOK, DR_HOOK
+USE YOMHOOK , ONLY : LHOOK, DR_HOOK, JPHOOK
 
 IMPLICIT NONE
 
@@ -83,7 +82,7 @@ IMPLICIT NONE
 !
 TYPE(DIMPHYEX_t),       INTENT(IN)   :: D
 TYPE(CST_t),            INTENT(IN)   :: CST
-TYPE(CSTURB_t),         INTENT(IN)   :: CSTURB
+TYPE(TURB_t),           INTENT(IN)   :: TURBN
 TYPE(PARAM_MFSHALL_t),  INTENT(IN)   :: PARAMMF
 INTEGER,                INTENT(IN)   ::  KRR          ! number of moist var.
 INTEGER,                INTENT(IN)   ::  KRRL         ! number of liquid water var.
@@ -110,7 +109,7 @@ REAL, DIMENSION(D%NIJT),     INTENT(IN)   ::  PDEPTH            ! Deepness of cl
 !
 !                       1.2  Declaration of local variables
 !
-REAL(KIND=JPRB) :: ZHOOK_HANDLE
+REAL(KIND=JPHOOK) :: ZHOOK_HANDLE
 !------------------------------------------------------------------------
 
 !                     1. INITIALISATION
@@ -132,7 +131,7 @@ IF (PARAMMF%CMF_CLOUD == 'DIRE') THEN
 ELSEIF (PARAMMF%CMF_CLOUD == 'STAT') THEN
   !Statistical scheme using the PDF proposed by Bougeault (81, 82) and
   !Bechtold et al (95).
-  CALL COMPUTE_MF_CLOUD_STAT(D, CST, CSTURB, PARAMMF, &
+  CALL COMPUTE_MF_CLOUD_STAT(D, CST, TURBN, PARAMMF, &
                             &KRR, KRRL, KRRI, OSTATNW, &
                             &PFRAC_ICE,&
                             &PTHLM, PRTM, PPABSM, PRM,&
diff --git a/src/PHYEX/turb/mode_compute_mf_cloud_bigaus.f90 b/src/PHYEX/turb/mode_compute_mf_cloud_bigaus.f90
index a9bd850469bcbe06e7b6d74a8828e0f07c1f5480..6b8045050b8ebb900200d447a49bcf116ffef79b 100644
--- a/src/PHYEX/turb/mode_compute_mf_cloud_bigaus.f90
+++ b/src/PHYEX/turb/mode_compute_mf_cloud_bigaus.f90
@@ -63,8 +63,7 @@ USE MODD_PARAM_MFSHALL_n, ONLY: PARAM_MFSHALL_t
 !
 USE MODI_SHUMAN_MF, ONLY: MZF_MF, GZ_M_W_MF
 !
-USE PARKIND1, ONLY : JPRB
-USE YOMHOOK , ONLY : LHOOK, DR_HOOK
+USE YOMHOOK , ONLY : LHOOK, DR_HOOK, JPHOOK
 !
 IMPLICIT NONE
 !
@@ -99,7 +98,7 @@ REAL, DIMENSION(D%NIJT,D%NKT) :: ZCOND ! condensate
 REAL, DIMENSION(D%NIJT,D%NKT) :: ZA, ZGAM ! used for integration
 INTEGER :: IIJB,IIJE ! physical horizontal domain indices
 INTEGER :: IKT,IKB,IKA,IKU,IKE,IKL
-REAL(KIND=JPRB) :: ZHOOK_HANDLE
+REAL(KIND=JPHOOK) :: ZHOOK_HANDLE
 
 IF (LHOOK) CALL DR_HOOK('COMPUTE_MF_CLOUD_BIGAUS',0,ZHOOK_HANDLE)
 !
diff --git a/src/PHYEX/turb/mode_compute_mf_cloud_direct.f90 b/src/PHYEX/turb/mode_compute_mf_cloud_direct.f90
index 2323b77f523cf7d886bc038730eabe17d0052916..b742e0fc2fb3f804b29a2f6a0e82625274f4c6a8 100644
--- a/src/PHYEX/turb/mode_compute_mf_cloud_direct.f90
+++ b/src/PHYEX/turb/mode_compute_mf_cloud_direct.f90
@@ -55,8 +55,7 @@ CONTAINS
 !          ------------
 USE MODD_DIMPHYEX,        ONLY: DIMPHYEX_t
 USE MODD_PARAM_MFSHALL_n, ONLY : PARAM_MFSHALL_t
-USE PARKIND1, ONLY : JPRB
-USE YOMHOOK , ONLY : LHOOK, DR_HOOK
+USE YOMHOOK , ONLY : LHOOK, DR_HOOK, JPHOOK
 !
 IMPLICIT NONE
 !
@@ -72,8 +71,8 @@ REAL, DIMENSION(D%NIJT,D%NKT),   INTENT(OUT)  :: PCF_MF         ! and cloud frac
 !
 !*                    0.1  Declaration of local variables
 !
+REAL(KIND=JPHOOK) :: ZHOOK_HANDLE
 INTEGER  :: JI,JK, JK0, IKB,IKE,IKL,IIJB,IIJE
-REAL(KIND=JPRB) :: ZHOOK_HANDLE
 !
 !*                    0.2 Initialisation
 !
@@ -95,14 +94,10 @@ PRI_MF(:,:)=0.
 PCF_MF(:,:)=0.
 
 DO JI=IIJB,IIJE
-#ifdef REPRO48
   JK0=KKLCL(JI)-IKL ! first mass level with cloud
   JK0=MAX(JK0, MIN(IKB,IKE)) !protection if KKL=1
   JK0=MIN(JK0, MAX(IKB,IKE)) !protection if KKL=-1
   DO JK=JK0,IKE-IKL,IKL
-#else
-  DO JK=KKLCL(JI),IKE-IKL,IKL
-#endif
     PCF_MF(JI,JK ) = MAX( 0., MIN(1.,PARAMMF%XKCF_MF *0.5* (       &
                 &    PFRAC_UP(JI,JK) +  PFRAC_UP(JI,JK+IKL) ) ))
     PRC_MF(JI,JK)  = 0.5* PARAMMF%XKCF_MF * ( PFRAC_UP(JI,JK)*PRC_UP(JI,JK)  &
diff --git a/src/PHYEX/turb/mode_compute_mf_cloud_stat.f90 b/src/PHYEX/turb/mode_compute_mf_cloud_stat.f90
index 027cc3c7906d9c326412da3c3f955aa347219e57..6d3c4b0fb2e9399e17e9ae26f703335f0f754d58 100644
--- a/src/PHYEX/turb/mode_compute_mf_cloud_stat.f90
+++ b/src/PHYEX/turb/mode_compute_mf_cloud_stat.f90
@@ -9,7 +9,7 @@
 IMPLICIT NONE
 CONTAINS
 !     ######spl
-      SUBROUTINE COMPUTE_MF_CLOUD_STAT(D, CST, CSTURB, PARAMMF, &
+      SUBROUTINE COMPUTE_MF_CLOUD_STAT(D, CST, TURBN, PARAMMF, &
                             &KRR, KRRL, KRRI, OSTATNW,     &
                             &PFRAC_ICE,&
                             &PTHLM, PRTM, PPABSM, PRM,&
@@ -58,14 +58,13 @@ CONTAINS
 USE MODD_DIMPHYEX,        ONLY: DIMPHYEX_t
 USE MODD_CST,             ONLY: CST_t
 USE MODD_PARAM_MFSHALL_n, ONLY: PARAM_MFSHALL_t
-USE MODD_CTURB,           ONLY: CSTURB_t
+USE MODD_TURB_n,          ONLY: TURB_t
 
 !
 USE MODI_SHUMAN_MF, ONLY: MZF_MF, MZM_MF, GZ_M_W_MF
 USE MODE_COMPUTE_FUNCTION_THERMO_MF, ONLY: COMPUTE_FUNCTION_THERMO_MF
 !
-USE PARKIND1, ONLY : JPRB
-USE YOMHOOK , ONLY : LHOOK, DR_HOOK
+USE YOMHOOK , ONLY : LHOOK, DR_HOOK, JPHOOK
 !
 IMPLICIT NONE
 !
@@ -73,7 +72,7 @@ IMPLICIT NONE
 !
 TYPE(DIMPHYEX_t),       INTENT(IN)   :: D
 TYPE(CST_t),            INTENT(IN)   :: CST
-TYPE(CSTURB_t),         INTENT(IN)   :: CSTURB
+TYPE(TURB_t),           INTENT(IN)   :: TURBN
 TYPE(PARAM_MFSHALL_t),  INTENT(IN)   :: PARAMMF
 LOGICAL,                INTENT(IN)   :: OSTATNW      ! cloud scheme inclues convect. covar. contrib
 INTEGER,                INTENT(IN)   :: KRR                     ! number of moist var.
@@ -100,7 +99,7 @@ REAL, DIMENSION(D%NIJT,D%NKT) :: ZWK,ZWK2
 INTEGER :: JIJ, JK
 INTEGER :: IIJB,IIJE ! physical horizontal domain indices
 INTEGER :: IKT
-REAL(KIND=JPRB) :: ZHOOK_HANDLE
+REAL(KIND=JPHOOK) :: ZHOOK_HANDLE
 !
 !*                    0.2 initialisation
 !
@@ -131,7 +130,7 @@ IF (KRRL > 0)  THEN
     CALL GZ_M_W_MF(D, PTHLM(:,:), PDZZ(:,:), ZWK(:,:))
     IF (OSTATNW) THEN
       !$mnh_expand_array(JIJ=IIJB:IIJE,JK=1:IKT)
-      ZFLXZ(:,:) = -2 * CSTURB%XCTV* PARAMMF%XTAUSIGMF * PEMF(:,:)* &
+      ZFLXZ(:,:) = -2 * TURBN%XCTV* PARAMMF%XTAUSIGMF * PEMF(:,:)* &
                            & (PTHL_UP(:,:)-ZFLXZ(:,:)) * ZWK(:,:)
       !$mnh_end_expand_array(JIJ=IIJB:IIJE,JK=1:IKT)
     ELSE
@@ -163,7 +162,7 @@ IF (KRRL > 0)  THEN
     CALL GZ_M_W_MF(D, PRTM(:,:), PDZZ(:,:), ZWK2(:,:))
     IF (OSTATNW) THEN
       !$mnh_expand_array(JIJ=IIJB:IIJE,JK=1:IKT)
-      ZFLXZ2(:,:) = -2 * CSTURB%XCTV * PARAMMF%XTAUSIGMF * PEMF(:,:)* &
+      ZFLXZ2(:,:) = -2 * TURBN%XCTV * PARAMMF%XTAUSIGMF * PEMF(:,:)* &
                            & (PRT_UP(:,:)-ZFLXZ2(:,:)) * ZWK2(:,:)
       !$mnh_end_expand_array(JIJ=IIJB:IIJE,JK=1:IKT)
     ELSE
@@ -187,7 +186,7 @@ IF (KRRL > 0)  THEN
       !
       !       1.2.2 contribution from <Rnp Thl>
       !$mnh_expand_array(JIJ=IIJB:IIJE,JK=1:IKT)
-      ZFLXZ3(:,:) = - CSTURB%XCTV * PARAMMF%XTAUSIGMF * &
+      ZFLXZ3(:,:) = - TURBN%XCTV * PARAMMF%XTAUSIGMF * &
                     (PEMF(:,:)*(PRT_UP(:,:)-ZFLXZ2(:,:)) * &
                                    ZWK(:,:) + &
                                    PEMF(:,:)*(PTHL_UP(:,:)-ZFLXZ(:,:)) * &
diff --git a/src/PHYEX/turb/mode_compute_updraft.f90 b/src/PHYEX/turb/mode_compute_updraft.f90
index 6dc98937cf12519875bce491bd190d226658f874..810cb023091493b45d8985171b38932395252e92 100644
--- a/src/PHYEX/turb/mode_compute_updraft.f90
+++ b/src/PHYEX/turb/mode_compute_updraft.f90
@@ -9,8 +9,8 @@
 !
 IMPLICIT NONE
 CONTAINS
-      SUBROUTINE COMPUTE_UPDRAFT(D,CST,NEB,PARAMMF,TURBN,CSTURB,  &
-                                 KSV, HFRAC_ICE,                  &
+      SUBROUTINE COMPUTE_UPDRAFT(D,CST,NEBN,PARAMMF,TURBN,CSTURB, &
+                                 KSV,                             &
                                  OENTR_DETR,                      &
                                  ONOMIXLG,KSV_LGBEG,KSV_LGEND,    &
                                  PZZ,PDZZ,                        &
@@ -69,7 +69,7 @@ CONTAINS
 !
 USE MODD_DIMPHYEX,        ONLY: DIMPHYEX_t
 USE MODD_CST,             ONLY: CST_t
-USE MODD_NEB,             ONLY: NEB_t
+USE MODD_NEB_n,           ONLY: NEB_t
 USE MODD_PARAM_MFSHALL_n, ONLY: PARAM_MFSHALL_t
 USE MODD_TURB_n,          ONLY: TURB_t
 USE MODD_CTURB,           ONLY: CSTURB_t
@@ -78,8 +78,7 @@ USE MODI_SHUMAN_MF, ONLY: MZM_MF, MZF_MF, GZ_M_W_MF
 
 USE MODE_COMPUTE_BL89_ML, ONLY: COMPUTE_BL89_ML
 USE MODE_MSG, ONLY: PRINT_MSG, NVERB_FATAL
-USE PARKIND1, ONLY : JPRB
-USE YOMHOOK , ONLY : LHOOK, DR_HOOK
+USE YOMHOOK , ONLY : LHOOK, DR_HOOK, JPHOOK
 
 IMPLICIT NONE
 
@@ -89,12 +88,11 @@ IMPLICIT NONE
 !
 TYPE(DIMPHYEX_t),       INTENT(IN)   :: D
 TYPE(CST_t),            INTENT(IN)   :: CST
-TYPE(NEB_t),            INTENT(IN)   :: NEB
+TYPE(NEB_t),            INTENT(IN)   :: NEBN
 TYPE(PARAM_MFSHALL_t),  INTENT(IN)   :: PARAMMF
 TYPE(TURB_t),           INTENT(IN)   :: TURBN
 TYPE(CSTURB_t),         INTENT(IN)   :: CSTURB
 INTEGER,                INTENT(IN)   :: KSV
-CHARACTER(LEN=1),       INTENT(IN)   :: HFRAC_ICE    ! partition liquid/ice scheme
 LOGICAL,                INTENT(IN) :: OENTR_DETR! flag to recompute entrainment, detrainment and mass flux
 LOGICAL,                INTENT(IN)   :: ONOMIXLG  ! False if mixing of lagrangian tracer
 INTEGER,                INTENT(IN)   :: KSV_LGBEG ! first index of lag. tracer
@@ -195,7 +193,7 @@ REAL, DIMENSION(D%NIJT,D%NKT) :: ZSHEAR,ZDUDZ,ZDVDZ ! vertical wind shear
 REAL, DIMENSION(D%NIJT,D%NKT) :: ZWK
 REAL, DIMENSION(D%NIJT,16) :: ZBUF
 !
-REAL(KIND=JPRB) :: ZHOOK_HANDLE
+REAL(KIND=JPHOOK) :: ZHOOK_HANDLE
 !
 !                       1.3  Declaration of additional local variables for compute_entr_detr
 !
@@ -354,7 +352,7 @@ IF (OENTR_DETR) THEN
   PRC_UP(:,IKB)=0.
   PRI_UP(:,IKB)=0.
   !$mnh_end_expand_array(JIJ=IIJB:IIJE)
-  CALL TH_R_FROM_THL_RT(CST, NEB, D%NIJT, HFRAC_ICE,PFRAC_ICE_UP(:,IKB),ZPRES_F(:,IKB), &
+  CALL TH_R_FROM_THL_RT(CST, NEBN, D%NIJT, NEBN%CFRAC_ICE_SHALLOW_MF,PFRAC_ICE_UP(:,IKB),ZPRES_F(:,IKB), &
              PTHL_UP(:,IKB),PRT_UP(:,IKB),ZTH_UP(:,IKB), &
              PRV_UP(:,IKB),PRC_UP(:,IKB),PRI_UP(:,IKB),ZRSATW(:),ZRSATI(:), OOCEAN=.FALSE., &
              PBUF=ZBUF(:,:), KB=D%NIJB, KE=D%NIJE)
@@ -392,29 +390,28 @@ IF (OENTR_DETR) THEN
     ZSHEAR = 0. !no shear in bl89 mixing length
   END IF
   !
-#ifdef REPRO48
   CALL COMPUTE_BL89_ML(D, CST, CSTURB, PDZZ,ZTKEM_F(:,IKB),&
                       &ZG_O_THVREF(:,IKB),ZTHVM,IKB,GLMIX,.TRUE.,ZSHEAR,ZLUP)
-#else
-  CALL COMPUTE_BL89_ML(D, CST, CSTURB, PDZZ,ZTKEM_F(:,IKB),&
-                      &ZG_O_THVREF(:,IKB),ZTHVM,IKB,GLMIX,.FALSE.,ZSHEAR,ZLUP)
-#endif
-  !$mnh_expand_where(JIJ=IIJB:IIJE)
+  !$mnh_expand_array(JIJ=IIJB:IIJE)
   ZLUP(:)=MAX(ZLUP(:),1.E-10)
 
   ! Compute Buoyancy flux at the ground
   ZWTHVSURF(:) = (ZTHVM_F(:,IKB)/ZTHM_F(:,IKB))*PSFTH(:)+     &
                 (0.61*ZTHM_F(:,IKB))*PSFRV(:)
+  !$mnh_end_expand_array(JIJ=IIJB:IIJE)
 
   ! Mass flux at KKB level (updraft triggered if PSFTH>0.)
   IF (PARAMMF%LGZ) THEN
     IF(PDX==0. .OR. PDY==0.) THEN                                                                                                   
       CALL PRINT_MSG(NVERB_FATAL, 'GEN', 'COMPUTE_UPDRAFT', 'PDX or PDY is NULL with option LGZ!')                                  
     ENDIF
+    !$mnh_expand_array(JIJ=IIJB:IIJE)
     ZSURF(:)=TANH(PARAMMF%XGZ*SQRT(PDX*PDY)/ZLUP(:))
+    !$mnh_end_expand_array(JIJ=IIJB:IIJE)
   ELSE
     ZSURF(:)=1.
   END IF
+  !$mnh_expand_where(JIJ=IIJB:IIJE)
   WHERE (ZWTHVSURF(:)>0.)
     PEMF(:,IKB) = PARAMMF%XCMF * ZSURF(:) * ZRHO_F(:,IKB) *  &
             ((ZG_O_THVREF(:,IKB))*ZWTHVSURF(:)*ZLUP(:))**(1./3.)
@@ -472,7 +469,7 @@ DO JK=IKB,IKE-IKL,IKL
       ZRI_MIX(:,JK) = ZRI_MIX(:,JK-IKL) ! guess of Ri of mixture
       !$mnh_end_expand_array(JIJ=IIJB:IIJE)
     ENDIF
-    CALL COMPUTE_ENTR_DETR(D, CST, NEB, PARAMMF, JK,IKB,IKE,IKL,GTEST,GTESTLCL,HFRAC_ICE,PFRAC_ICE_UP(:,JK),&
+    CALL COMPUTE_ENTR_DETR(D, CST, NEBN, PARAMMF, JK,IKB,IKE,IKL,GTEST,GTESTLCL,PFRAC_ICE_UP(:,JK),&
                            PRHODREF(:,JK),ZPRES_F(:,JK),ZPRES_F(:,JK+IKL),&
                            PZZ(:,:),PDZZ(:,:),ZTHVM(:,:),  &
                            PTHLM(:,:),PRTM(:,:),ZW_UP2(:,:),ZTH_UP(:,JK),   &
@@ -520,15 +517,10 @@ DO JK=IKB,IKE-IKL,IKL
       ZMIX2(JIJ) = (PZZ(JIJ,JK+IKL)-PZZ(JIJ,JK))*PENTR(JIJ,JK) !&
       ZMIX3_CLD(JIJ) = (PZZ(JIJ,JK+IKL)-PZZ(JIJ,JK))*(1.-ZPART_DRY(JIJ))*ZDETR_CLD(JIJ,JK) !&                   
       ZMIX2_CLD(JIJ) = (PZZ(JIJ,JK+IKL)-PZZ(JIJ,JK))*(1.-ZPART_DRY(JIJ))*ZENTR_CLD(JIJ,JK)
-#ifdef REPRO48                  
       PTHL_UP(JIJ,JK+IKL)=(PTHL_UP(JIJ,JK)*(1.-0.5*ZMIX2(JIJ)) + PTHLM(JIJ,JK)*ZMIX2(JIJ)) &
                             /(1.+0.5*ZMIX2(JIJ))   
       PRT_UP(JIJ,JK+IKL) =(PRT_UP (JIJ,JK)*(1.-0.5*ZMIX2(JIJ)) + PRTM(JIJ,JK)*ZMIX2(JIJ))  &
                             /(1.+0.5*ZMIX2(JIJ))
-#else
-      PTHL_UP(JIJ,JK+IKL)=PTHL_UP(JIJ,JK)*EXP(-ZMIX2(JIJ)) + PTHLM(JIJ,JK)*(1-EXP(-ZMIX2(JIJ)))
-      PRT_UP(JIJ,JK+IKL) =PRT_UP (JIJ,JK)*EXP(-ZMIX2(JIJ)) +  PRTM(JIJ,JK)*(1-EXP(-ZMIX2(JIJ)))
-#endif
     ENDIF
   ENDDO
   
@@ -584,7 +576,7 @@ DO JK=IKB,IKE-IKL,IKL
     ZRC_UP(:)=PRC_UP(:,JK) ! guess = level just below
     ZRI_UP(:)=PRI_UP(:,JK) ! guess = level just below
     !$mnh_end_expand_array(JIJ=IIJB:IIJE)
-    CALL TH_R_FROM_THL_RT(CST, NEB, D%NIJT, HFRAC_ICE,PFRAC_ICE_UP(:,JK+IKL),ZPRES_F(:,JK+IKL), &
+    CALL TH_R_FROM_THL_RT(CST, NEBN, D%NIJT, NEBN%CFRAC_ICE_SHALLOW_MF,PFRAC_ICE_UP(:,JK+IKL),ZPRES_F(:,JK+IKL), &
             PTHL_UP(:,JK+IKL),PRT_UP(:,JK+IKL),ZTH_UP(:,JK+IKL),              &
             ZRV_UP(:),ZRC_UP(:),ZRI_UP(:),ZRSATW(:),ZRSATI(:), OOCEAN=.FALSE., &
             PBUF=ZBUF(:,:), KB=D%NIJB, KE=D%NIJE)
@@ -703,9 +695,9 @@ IF (LHOOK) CALL DR_HOOK('COMPUTE_UPDRAFT',1,ZHOOK_HANDLE)
 CONTAINS
 INCLUDE "th_r_from_thl_rt.func.h"
 INCLUDE "compute_frac_ice.func.h"
-          SUBROUTINE COMPUTE_ENTR_DETR(D, CST, NEB, PARAMMF,&
+          SUBROUTINE COMPUTE_ENTR_DETR(D, CST, NEBN, PARAMMF,&
                             KK,KKB,KKE,KKL,OTEST,OTESTLCL,&
-                            HFRAC_ICE,PFRAC_ICE,PRHODREF,&
+                            PFRAC_ICE,PRHODREF,&
                             PPRE_MINUS_HALF,&
                             PPRE_PLUS_HALF,PZZ,PDZZ,&
                             PTHVM,PTHLM,PRTM,PW_UP2,PTH_UP,&
@@ -770,7 +762,7 @@ INCLUDE "compute_frac_ice.func.h"
 !
 USE MODD_DIMPHYEX,        ONLY: DIMPHYEX_t
 USE MODD_CST,             ONLY: CST_t
-USE MODD_NEB,             ONLY: NEB_t
+USE MODD_NEB_n,           ONLY: NEB_t
 USE MODD_PARAM_MFSHALL_n, ONLY: PARAM_MFSHALL_t
 !
 IMPLICIT NONE
@@ -781,7 +773,7 @@ IMPLICIT NONE
 !
 TYPE(DIMPHYEX_t),       INTENT(IN)   :: D
 TYPE(CST_t),            INTENT(IN)   :: CST
-TYPE(NEB_t),            INTENT(IN)   :: NEB
+TYPE(NEB_t),            INTENT(IN)   :: NEBN
 TYPE(PARAM_MFSHALL_t),  INTENT(IN)   :: PARAMMF
 !
 INTEGER,                INTENT(IN)   :: KK
@@ -790,9 +782,6 @@ INTEGER,                INTENT(IN)   :: KKE          ! uppest atmosphere physica
 INTEGER,                INTENT(IN)   :: KKL          ! +1 if grid goes from ground to atmosphere top, -1 otherwise
 LOGICAL,DIMENSION(D%NIJT),   INTENT(IN)   :: OTEST ! test to see if updraft is running
 LOGICAL,DIMENSION(D%NIJT),   INTENT(IN)   :: OTESTLCL !test of condensation 
-CHARACTER(LEN=1),       INTENT(IN)   :: HFRAC_ICE ! frac_ice can be compute using
-                                              ! Temperature (T) or prescribed
-                                              ! (Y)
 REAL, DIMENSION(D%NIJT), INTENT(IN)  :: PFRAC_ICE ! fraction of ice
 !
 !    prognostic variables at t- deltat
@@ -949,7 +938,7 @@ ENDDO
 ZRCMIX(:)=PRC_UP(:)
 ZRIMIX(:)=PRI_UP(:)
 !$mnh_end_expand_array(JIJ=IIJB:IIJE)
-CALL TH_R_FROM_THL_RT(CST,NEB,D%NIJT,HFRAC_ICE,ZFRAC_ICE,&
+CALL TH_R_FROM_THL_RT(CST,NEBN,D%NIJT,NEBN%CFRAC_ICE_SHALLOW_MF,ZFRAC_ICE,&
              PPRE_PLUS_HALF,PTHL_UP,PRT_UP,&
              ZTHMIX,ZRVMIX,ZRCMIX,ZRIMIX,&
              ZRSATW_ED, ZRSATI_ED,OOCEAN=.FALSE.,&
@@ -1025,7 +1014,7 @@ DO JIJ=IIJB,IIJE
     ZMIXRT(JIJ) = 0.1
   ENDIF
 ENDDO
-CALL TH_R_FROM_THL_RT(CST,NEB,D%NIJT,HFRAC_ICE,ZFRAC_ICE,&
+CALL TH_R_FROM_THL_RT(CST,NEBN,D%NIJT,NEBN%CFRAC_ICE_SHALLOW_MF,ZFRAC_ICE,&
              ZPRE,ZMIXTHL,ZMIXRT,&
              ZTHMIX,ZRVMIX,PRC_MIX,PRI_MIX,&
              ZRSATW_ED, ZRSATI_ED,OOCEAN=.FALSE.,&
@@ -1039,7 +1028,7 @@ ZMIXTHL(:) = ZKIC_INIT * 0.5*(PTHLM(:,KK)+PTHLM(:,KK+KKL))+&
 ZMIXRT(:)  = ZKIC_INIT * 0.5*(PRTM(:,KK)+PRTM(:,KK+KKL))+&
                        & (1. - ZKIC_INIT)*PRT_UP(:)
 !$mnh_end_expand_array(JIJ=IIJB:IIJE)
-CALL TH_R_FROM_THL_RT(CST,NEB,D%NIJT,HFRAC_ICE,ZFRAC_ICE,&
+CALL TH_R_FROM_THL_RT(CST,NEBN,D%NIJT,NEBN%CFRAC_ICE_SHALLOW_MF,ZFRAC_ICE,&
              PPRE_PLUS_HALF,ZMIXTHL,ZMIXRT,&
              ZTHMIX,ZRVMIX,PRC_MIX,PRI_MIX,&
              ZRSATW_ED, ZRSATI_ED,OOCEAN=.FALSE.,&
diff --git a/src/PHYEX/turb/mode_compute_updraft_raha.f90 b/src/PHYEX/turb/mode_compute_updraft_raha.f90
index b8b4969997b0f412ee8b5c3859d419fa4893f3c0..9eb868cc8664947d4a6196cb2a6d52d1dacb344b 100644
--- a/src/PHYEX/turb/mode_compute_updraft_raha.f90
+++ b/src/PHYEX/turb/mode_compute_updraft_raha.f90
@@ -9,8 +9,8 @@
 !
 IMPLICIT NONE
 CONTAINS
-      SUBROUTINE COMPUTE_UPDRAFT_RAHA(D, CST, NEB, PARAMMF,          &
-                                 KSV, HFRAC_ICE, OENTR_DETR,         &
+      SUBROUTINE COMPUTE_UPDRAFT_RAHA(D, CST, NEBN, PARAMMF,         &
+                                 KSV, OENTR_DETR,                    &
                                  ONOMIXLG,KSV_LGBEG,KSV_LGEND,       &
                                  PZZ,PDZZ,                           &
                                  PSFTH,PSFRV,                        &
@@ -60,13 +60,12 @@ CONTAINS
 !          ------------
 USE MODD_DIMPHYEX,        ONLY: DIMPHYEX_t
 USE MODD_CST,             ONLY: CST_t
-USE MODD_NEB,             ONLY: NEB_t
+USE MODD_NEB_n,           ONLY: NEB_t
 USE MODD_PARAM_MFSHALL_n, ONLY: PARAM_MFSHALL_t
 !
 USE MODI_SHUMAN_MF, ONLY: MZM_MF
 !
-USE PARKIND1, ONLY : JPRB
-USE YOMHOOK , ONLY : LHOOK, DR_HOOK
+USE YOMHOOK , ONLY : LHOOK, DR_HOOK, JPHOOK
 
 IMPLICIT NONE
 
@@ -76,10 +75,9 @@ IMPLICIT NONE
 !
 TYPE(DIMPHYEX_t),       INTENT(IN)   :: D
 TYPE(CST_t),            INTENT(IN)   :: CST
-TYPE(NEB_t),            INTENT(IN)   :: NEB
+TYPE(NEB_t),            INTENT(IN)   :: NEBN
 TYPE(PARAM_MFSHALL_t),  INTENT(IN)   :: PARAMMF
 INTEGER,                INTENT(IN)   :: KSV
-CHARACTER(LEN=1),       INTENT(IN)   :: HFRAC_ICE    ! partition liquid/ice scheme
 LOGICAL,                INTENT(IN) :: OENTR_DETR! flag to recompute entrainment, detrainment and mass flux
 LOGICAL,                INTENT(IN)   :: ONOMIXLG  ! False if mixing of lagrangian tracer
 INTEGER,                INTENT(IN)   :: KSV_LGBEG ! first index of lag. tracer
@@ -123,18 +121,13 @@ REAL, DIMENSION(D%NIJT),     INTENT(OUT)   :: PDEPTH           ! Deepness of clo
 !
 !
 ! Mean environment variables at t-dt at flux point
-REAL, DIMENSION(D%NIJT,D%NKT) ::    ZTHM_F,ZRVM_F,ZRCM_F    ! Theta,rv of
-                                                                  ! updraft environnement
+REAL, DIMENSION(D%NIJT,D%NKT) :: ZTHM_F,ZRVM_F                 ! Theta,rv of updraft environnement
 REAL, DIMENSION(D%NIJT,D%NKT) :: ZRTM_F, ZTHLM_F, ZTKEM_F      ! rt, thetal,TKE,pressure,
 REAL, DIMENSION(D%NIJT,D%NKT) :: ZUM_F,ZVM_F,ZRHO_F            ! density,momentum
 REAL, DIMENSION(D%NIJT,D%NKT) :: ZPRES_F,ZTHVM_F,ZTHVM         ! interpolated at the flux point
 REAL, DIMENSION(D%NIJT,D%NKT) :: ZG_O_THVREF                   ! g*ThetaV ref
 REAL, DIMENSION(D%NIJT,D%NKT) :: ZW_UP2                        ! w**2  of the updraft
 
-REAL, DIMENSION(D%NIJT,D%NKT,KSV) :: ZSVM_F ! scalar variables 
-                        
-
-                        
 REAL, DIMENSION(D%NIJT,D%NKT) :: ZTH_UP                        ! updraft THETA 
 REAL, DIMENSION(D%NIJT)              :: ZT_UP                         ! updraft T
 REAL, DIMENSION(D%NIJT)              :: ZLVOCPEXN                     ! updraft L
@@ -144,35 +137,26 @@ REAL, DIMENSION(D%NIJT,D%NKT) :: ZTHS_UP,ZTHSM
 
 REAL, DIMENSION(D%NIJT,D%NKT) ::  ZCOEF  ! diminution coefficient for too high clouds 
                         
-REAL, DIMENSION(D%NIJT)            ::  ZWTHVSURF  ! Surface w'thetav'
-
 REAL  :: ZRDORV       ! RD/RV
 REAL  :: ZRVORD       ! RV/RD
 
 
 REAL, DIMENSION(D%NIJT) :: ZMIX1,ZMIX2,ZMIX3
 
-REAL, DIMENSION(D%NIJT) :: ZLUP         ! Upward Mixing length from the ground
-
-REAL, DIMENSION(D%NIJT) :: ZDEPTH       ! Deepness limit for cloud
 
-INTEGER  :: JK,JIJ,JSV          ! loop counters
+INTEGER  :: JK,JIJ          ! loop counters
 INTEGER :: IIJB,IIJE ! physical horizontal domain indices
 INTEGEr :: IKT,IKB,IKE,IKL
 
 LOGICAL, DIMENSION(D%NIJT) ::  GTEST,GTESTLCL,GTESTETL
                                ! Test if the ascent continue, if LCL or ETL is reached
-LOGICAL                          ::  GLMIX 
-                               ! To choose upward or downward mixing length
 LOGICAL, DIMENSION(D%NIJT)              :: GWORK1
 LOGICAL, DIMENSION(D%NIJT,D%NKT) :: GWORK2
 
 
-INTEGER  :: ITEST
 
-REAL, DIMENSION(D%NIJT) :: ZRC_UP, ZRI_UP, ZRV_UP, ZWP2, ZRSATW, ZRSATI
+REAL, DIMENSION(D%NIJT) :: ZRC_UP, ZRI_UP, ZRV_UP, ZRSATW, ZRSATI
 
-LOGICAL, DIMENSION(D%NIJT) :: GTEST_FER
 REAL,    DIMENSION(D%NIJT) :: ZPHI,ZALIM_STAR_TOT
 REAL,    DIMENSION(D%NIJT,D%NKT) :: ZDTHETASDZ,ZALIM_STAR,ZZDZ,ZZZ
 INTEGER, DIMENSION(D%NIJT) :: IALIM
@@ -182,14 +166,14 @@ REAL, DIMENSION(D%NIJT)              ::  ZCOE,ZWCOE,ZBUCOE
 REAL, DIMENSION(D%NIJT)              ::  ZDETR_BUO, ZDETR_RT
 REAL, DIMENSION(D%NIJT)              ::  ZW_MAX               ! w**2  max of the updraft
 REAL, DIMENSION(D%NIJT)              ::  ZZTOP                ! Top of the updraft
-REAL, DIMENSION(D%NIJT)              ::  ZA,ZB,ZQTM,ZQT_UP
+REAL, DIMENSION(D%NIJT)              ::  ZQTM,ZQT_UP
 
 REAL  :: ZDEPTH_MAX1, ZDEPTH_MAX2 ! control auto-extinction process
 
 REAL  :: ZTMAX,ZRMAX, ZEPS  ! control value
 REAL, DIMENSION(D%NIJT,16)           ::  ZBUF
 
-REAL(KIND=JPRB) :: ZHOOK_HANDLE
+REAL(KIND=JPHOOK) :: ZHOOK_HANDLE
 IF (LHOOK) CALL DR_HOOK('COMPUTE_UPDRAF_RAHA',0,ZHOOK_HANDLE)
 !
 IIJE=D%NIJE
@@ -316,7 +300,7 @@ PRC_UP(:,IKB)=0.
 PRI_UP(:,IKB)=0.
 !$mnh_end_expand_array(JIJ=IIJB:IIJE)
 
-CALL TH_R_FROM_THL_RT(CST, NEB, D%NIJT, HFRAC_ICE,PFRAC_ICE_UP(:,IKB),ZPRES_F(:,IKB), &
+CALL TH_R_FROM_THL_RT(CST, NEBN, D%NIJT, NEBN%CFRAC_ICE_SHALLOW_MF,PFRAC_ICE_UP(:,IKB),ZPRES_F(:,IKB), &
              PTHL_UP(:,IKB),PRT_UP(:,IKB),ZTH_UP(:,IKB), &
              PRV_UP(:,IKB),PRC_UP(:,IKB),PRI_UP(:,IKB),ZRSATW(:),ZRSATI(:),OOCEAN=.FALSE.,&
              PBUF=ZBUF, KB=D%NIJB, KE=D%NIJE)
@@ -512,7 +496,7 @@ DO JK=IKB,IKE-IKL,IKL
   ZRI_UP(:)=PRI_UP(:,JK) ! guess = level just below
   ZRV_UP(:)=PRV_UP(:,JK)
   !$mnh_end_expand_where(JIJ=IIJB:IIJE)
-  CALL TH_R_FROM_THL_RT(CST,NEB, D%NIJT, HFRAC_ICE,PFRAC_ICE_UP(:,JK+IKL),ZPRES_F(:,JK+IKL), &
+  CALL TH_R_FROM_THL_RT(CST,NEBN, D%NIJT, NEBN%CFRAC_ICE_SHALLOW_MF,PFRAC_ICE_UP(:,JK+IKL),ZPRES_F(:,JK+IKL), &
           PTHL_UP(:,JK+IKL),PRT_UP(:,JK+IKL),ZTH_UP(:,JK+IKL),              &
           ZRV_UP(:),ZRC_UP(:),ZRI_UP(:),ZRSATW(:),ZRSATI(:),OOCEAN=.FALSE.,&
           PBUF=ZBUF, KB=D%NIJB, KE=D%NIJE)
diff --git a/src/PHYEX/turb/mode_compute_updraft_rhcj10.f90 b/src/PHYEX/turb/mode_compute_updraft_rhcj10.f90
index 85eccf595c1bc53c0f2abbe529d838d4b0050cda..13d3153076f4d874e981746f1607bd6887ad4211 100644
--- a/src/PHYEX/turb/mode_compute_updraft_rhcj10.f90
+++ b/src/PHYEX/turb/mode_compute_updraft_rhcj10.f90
@@ -10,8 +10,8 @@
 IMPLICIT NONE
 CONTAINS
 !
-SUBROUTINE COMPUTE_UPDRAFT_RHCJ10(D,CST,NEB,PARAMMF,TURBN,CSTURB, &
-                                 KSV, HFRAC_ICE,                  &
+SUBROUTINE COMPUTE_UPDRAFT_RHCJ10(D,CST,NEBN,PARAMMF,TURBN,CSTURB,&
+                                 KSV,                             &
                                  OENTR_DETR,                      &
                                  ONOMIXLG,KSV_LGBEG,KSV_LGEND,    &
                                  PZZ,PDZZ,                        &
@@ -63,7 +63,7 @@ SUBROUTINE COMPUTE_UPDRAFT_RHCJ10(D,CST,NEB,PARAMMF,TURBN,CSTURB, &
 !
 USE MODD_DIMPHYEX,        ONLY: DIMPHYEX_t
 USE MODD_CST,             ONLY: CST_t
-USE MODD_NEB,             ONLY: NEB_t
+USE MODD_NEB_n,           ONLY: NEB_t
 USE MODD_PARAM_MFSHALL_n, ONLY: PARAM_MFSHALL_t
 USE MODD_TURB_n,          ONLY: TURB_t
 USE MODD_CTURB,           ONLY: CSTURB_t
@@ -71,8 +71,7 @@ USE MODD_CTURB,           ONLY: CSTURB_t
 USE MODI_SHUMAN_MF, ONLY: MZF_MF, MZM_MF, GZ_M_W_MF
 
 USE MODE_COMPUTE_BL89_ML, ONLY: COMPUTE_BL89_ML
-USE PARKIND1, ONLY : JPRB
-USE YOMHOOK , ONLY : LHOOK, DR_HOOK
+USE YOMHOOK , ONLY : LHOOK, DR_HOOK, JPHOOK
 
 
 IMPLICIT NONE
@@ -82,12 +81,11 @@ IMPLICIT NONE
 !
 TYPE(DIMPHYEX_t),       INTENT(IN)   :: D
 TYPE(CST_t),            INTENT(IN)   :: CST
-TYPE(NEB_t),            INTENT(IN)   :: NEB
+TYPE(NEB_t),            INTENT(IN)   :: NEBN
 TYPE(PARAM_MFSHALL_t),  INTENT(IN)   :: PARAMMF
 TYPE(TURB_t),           INTENT(IN)   :: TURBN
 TYPE(CSTURB_t),         INTENT(IN)   :: CSTURB
 INTEGER,                INTENT(IN)   :: KSV
-CHARACTER(LEN=1),       INTENT(IN)   :: HFRAC_ICE    ! partition liquid/ice scheme
 LOGICAL,                INTENT(IN)   :: OENTR_DETR! flag to recompute entrainment, detrainment and mass flux
 LOGICAL,                INTENT(IN)   :: ONOMIXLG  ! False if mixing of lagrangian tracer
 INTEGER,                INTENT(IN)   :: KSV_LGBEG ! first index of lag. tracer
@@ -139,10 +137,6 @@ REAL, DIMENSION(D%NIJT,D%NKT) :: ZPRES_F,ZTHVM_F               ! interpolated at
 REAL, DIMENSION(D%NIJT,D%NKT) :: ZG_O_THVREF                   ! g*ThetaV ref
 REAL, DIMENSION(D%NIJT,D%NKT) :: ZW_UP2                        ! w**2  of the updraft
 
-REAL, DIMENSION(D%NIJT,D%NKT,KSV) :: ZSVM_F ! scalar variables 
-                        
-
-                        
 REAL, DIMENSION(D%NIJT,D%NKT) :: ZTH_UP                        ! updraft THETA 
 !REAL, DIMENSION(SIZE(PTHM,1))              :: ZT_UP                         ! updraft T
 !REAL, DIMENSION(SIZE(PTHM,1))              :: ZLVOCPEXN                     ! updraft L
@@ -161,7 +155,7 @@ REAL, DIMENSION(D%NIJT) :: ZMIX1,ZMIX2
 
 REAL, DIMENSION(D%NIJT) :: ZLUP         ! Upward Mixing length from the ground
 
-INTEGER  :: JK,JIJ,JSV          ! loop counters
+INTEGER  :: JK,JIJ          ! loop counters
 INTEGER :: IIJB,IIJE ! physical horizontal domain indices
 INTEGER :: IKT,IKB,IKE,IKL
 LOGICAL, DIMENSION(D%NIJT) ::  GTEST,GTESTLCL
@@ -171,8 +165,6 @@ LOGICAL                          ::  GLMIX
 LOGICAL, DIMENSION(D%NIJT)              :: GWORK1
 LOGICAL, DIMENSION(D%NIJT,D%NKT) :: GWORK2
 
-INTEGER  :: ITEST
-
 REAL, DIMENSION(D%NIJT) :: ZRC_UP, ZRI_UP, ZRV_UP, ZRSATW, ZRSATI
 
 REAL,    DIMENSION(D%NIJT,D%NKT) :: ZZDZ
@@ -193,7 +185,7 @@ REAL, DIMENSION(D%NIJT,D%NKT) :: ZSHEAR,ZDUDZ,ZDVDZ ! vertical wind shear
 REAL, DIMENSION(D%NIJT,D%NKT) :: ZWK
 REAL, DIMENSION(D%NIJT,16)    :: ZBUF
 !
-REAL(KIND=JPRB) :: ZHOOK_HANDLE
+REAL(KIND=JPHOOK) :: ZHOOK_HANDLE
 IF (LHOOK) CALL DR_HOOK('COMPUTE_UPDRAFT_RHCJ10',0,ZHOOK_HANDLE)
 !
 IIJE=D%NIJE
@@ -327,7 +319,7 @@ ZW_UP2(:,IKB) = MAX(0.0001,(2./3.)*ZTKEM_F(:,IKB))
 PRC_UP(:,IKB)=0.
 PRI_UP(:,IKB)=0.
 !$mnh_end_expand_array(JIJ=IIJB:IIJE)
-CALL TH_R_FROM_THL_RT(CST,NEB,D%NIJT,HFRAC_ICE,PFRAC_ICE_UP(:,IKB),ZPRES_F(:,IKB), &
+CALL TH_R_FROM_THL_RT(CST,NEBN,D%NIJT,NEBN%CFRAC_ICE_SHALLOW_MF,PFRAC_ICE_UP(:,IKB),ZPRES_F(:,IKB), &
              PTHL_UP(:,IKB),PRT_UP(:,IKB),ZTH_UP(:,IKB), &
              PRV_UP(:,IKB),PRC_UP(:,IKB),PRI_UP(:,IKB),ZRSATW(:),ZRSATI(:),OOCEAN=.FALSE.,&
              PBUF=ZBUF, KB=D%NIJB, KE=D%NIJE)
@@ -446,7 +438,7 @@ DO JK=IKB,IKE-IKL,IKL
     ZRI_UP(:)   =PRI_UP(:,JK) ! guess 
     ZRV_UP(:)   =PRV_UP(:,JK)
     !$mnh_end_expand_array(JIJ=IIJB:IIJE)
-    CALL TH_R_FROM_THL_RT(CST,NEB, D%NIJT, HFRAC_ICE,PFRAC_ICE_UP(:,JK),&
+    CALL TH_R_FROM_THL_RT(CST,NEBN, D%NIJT, NEBN%CFRAC_ICE_SHALLOW_MF,PFRAC_ICE_UP(:,JK),&
                PPABSM(:,JK),PTHL_UP(:,JK),PRT_UP(:,JK),&
                ZTH_UP(:,JK),ZRV_UP,ZRC_UP,ZRI_UP,ZRSATW(:),ZRSATI(:),OOCEAN=.FALSE.,&
                PBUF=ZBUF, KB=D%NIJB, KE=D%NIJE)
@@ -549,7 +541,7 @@ DO JK=IKB,IKE-IKL,IKL
   ZRI_UP(:)=PRI_UP(:,JK) ! guess = level just below
   ZRV_UP(:)=PRV_UP(:,JK)
   !$mnh_end_expand_array(JIJ=IIJB:IIJE)
-  CALL TH_R_FROM_THL_RT(CST,NEB, D%NIJT, HFRAC_ICE,PFRAC_ICE_UP(:,JK+IKL),ZPRES_F(:,JK+IKL), &
+  CALL TH_R_FROM_THL_RT(CST,NEBN, D%NIJT, NEBN%CFRAC_ICE_SHALLOW_MF,PFRAC_ICE_UP(:,JK+IKL),ZPRES_F(:,JK+IKL), &
           PTHL_UP(:,JK+IKL),PRT_UP(:,JK+IKL),ZTH_UP(:,JK+IKL),              &
           ZRV_UP(:),ZRC_UP(:),ZRI_UP(:),ZRSATW(:),ZRSATI(:),OOCEAN=.FALSE.,&
           PBUF=ZBUF, KB=D%NIJB, KE=D%NIJE)
diff --git a/src/PHYEX/turb/mode_emoist.f90 b/src/PHYEX/turb/mode_emoist.f90
index d3e920d614937d61a4940fbcb7fe1f20c341539c..2ea9b0a80c76943e47c687a2168d024797c45d75 100644
--- a/src/PHYEX/turb/mode_emoist.f90
+++ b/src/PHYEX/turb/mode_emoist.f90
@@ -6,8 +6,7 @@ MODULE MODE_EMOIST
 IMPLICIT NONE
 CONTAINS
 SUBROUTINE EMOIST(D,CST,KRR,KRRI,PTHLM,PRM,PLOCPEXNM,PAMOIST,PSRCM,OOCEAN,PEMOIST)
-USE PARKIND1, ONLY : JPRB
-USE YOMHOOK , ONLY : LHOOK, DR_HOOK
+USE YOMHOOK , ONLY : LHOOK, DR_HOOK, JPHOOK
 !   ############################################################################
 !
 !      PURPOSE
@@ -68,8 +67,8 @@ IMPLICIT NONE
 !
 TYPE(DIMPHYEX_t),       INTENT(IN)   :: D
 TYPE(CST_t),            INTENT(IN)   :: CST
-INTEGER                              :: KRR        ! number of moist var.
-INTEGER                              :: KRRI       ! number of ice var.
+INTEGER,                INTENT(IN)   :: KRR        ! number of moist var.
+INTEGER,                INTENT(IN)   :: KRRI       ! number of ice var.
 LOGICAL,                INTENT(IN)   ::  OOCEAN       ! switch for Ocean model version
 !
 REAL, DIMENSION(D%NIJT,D%NKT),  INTENT(IN)  ::   PTHLM    ! Conservative pot. temperature
@@ -98,7 +97,7 @@ INTEGER                               :: IIJB,IIJE,IKT
 !*       1. COMPUTE EMOIST
 !           --------------
 !
-REAL(KIND=JPRB) :: ZHOOK_HANDLE
+REAL(KIND=JPHOOK) :: ZHOOK_HANDLE
 IF (LHOOK) CALL DR_HOOK('EMOIST',0,ZHOOK_HANDLE)
 !
 IIJB=D%NIJB
diff --git a/src/PHYEX/turb/mode_etheta.f90 b/src/PHYEX/turb/mode_etheta.f90
index 41ba28fb1653c6f00391983107baa22d6b9a2f30..9296b922c226c77f4501b51efd0731b30a60c307 100644
--- a/src/PHYEX/turb/mode_etheta.f90
+++ b/src/PHYEX/turb/mode_etheta.f90
@@ -6,8 +6,7 @@ MODULE MODE_ETHETA
 IMPLICIT NONE
 CONTAINS
 SUBROUTINE ETHETA(D,CST,KRR,KRRI,PTHLM,PRM,PLOCPEXNM,PATHETA,PSRCM,OOCEAN,OCOMPUTE_SRC,PETHETA)
-USE PARKIND1, ONLY : JPRB
-USE YOMHOOK , ONLY : LHOOK, DR_HOOK
+USE YOMHOOK , ONLY : LHOOK, DR_HOOK, JPHOOK
 !   ############################################################################
 !
 !      PURPOSE
@@ -66,8 +65,8 @@ IMPLICIT NONE
 !
 TYPE(DIMPHYEX_t),       INTENT(IN)   :: D
 TYPE(CST_t),            INTENT(IN)   :: CST
-INTEGER                              :: KRR          ! number of moist var.
-INTEGER                              :: KRRI         ! number of ice var.
+INTEGER,                INTENT(IN)   :: KRR          ! number of moist var.
+INTEGER,                INTENT(IN)   :: KRRI         ! number of ice var.
 LOGICAL,                INTENT(IN)   ::  OOCEAN       ! switch for Ocean model version
 !
 REAL, DIMENSION(D%NIJT,D%NKT),  INTENT(IN)  ::   PTHLM     ! Conservative pot. temperature
@@ -102,7 +101,7 @@ INTEGER                               :: IIJB,IIJE,IKT
 !           --------------
 !
 !
-REAL(KIND=JPRB) :: ZHOOK_HANDLE
+REAL(KIND=JPHOOK) :: ZHOOK_HANDLE
 IF (LHOOK) CALL DR_HOOK('ETHETA',0,ZHOOK_HANDLE)
 !
 IIJB=D%NIJB
diff --git a/src/PHYEX/turb/mode_ibm_mixinglength.f90 b/src/PHYEX/turb/mode_ibm_mixinglength.f90
index bc584c94082a6a3b64adb527556d6373f11e944b..608af23415bcba280ec196b3d60deda7e21367cb 100644
--- a/src/PHYEX/turb/mode_ibm_mixinglength.f90
+++ b/src/PHYEX/turb/mode_ibm_mixinglength.f90
@@ -54,6 +54,7 @@ SUBROUTINE IBM_MIXINGLENGTH(D,PLM,PLEPS,PMU,PHI,PTKE)
   USE MODD_IBM_PARAM_n
   USE MODD_REF_n, ONLY: XRHODJ,XRHODREF
   USE MODD_CTURB
+  USE MODD_TURB_n, ONLY: XCED
   USE MODD_CST
   USE MODD_GRID_n, ONLY: XZZ
   !
diff --git a/src/PHYEX/turb/mode_ini_mfshall.f90 b/src/PHYEX/turb/mode_ini_mfshall.f90
new file mode 100644
index 0000000000000000000000000000000000000000..56973284350b4d8a1d3665de3aab17f3ed5cef5b
--- /dev/null
+++ b/src/PHYEX/turb/mode_ini_mfshall.f90
@@ -0,0 +1,66 @@
+MODULE MODE_INI_MFSHALL
+IMPLICIT NONE
+CONTAINS
+SUBROUTINE INI_MFSHALL()
+!     ###########################################################
+!
+!!****  *INI_MFSHALL * - initialize the constants necessary for the
+!!                       shallow convection scheme.
+!!
+!!    PURPOSE
+!!    -------
+!!      The purpose of this routine is to initialize the constants used by
+!!    the shallow convection scheme.
+!!
+!!**  METHOD
+!!    ------
+!!      The constants are initialized to their numerical values.
+!!
+!!    EXTERNAL
+!!    --------
+!!
+!!
+!!    IMPLICIT ARGUMENTS
+!!    ------------------
+!!
+!!    REFERENCE
+!!    ---------
+!!
+!!    AUTHOR
+!!    ------
+!!
+!!    MODIFICATIONS
+!!    -------------
+!!
+!-------------------------------------------------------------------------------
+!
+!*       0.    DECLARATIONS
+!              ------------
+!
+USE MODD_PARAM_MFSHALL_n, ONLY: LTHETAS_MF, XLAMBDA_MF
+USE YOMHOOK , ONLY : LHOOK, DR_HOOK, JPHOOK
+!
+IMPLICIT NONE
+!
+!*       0.1   Declarations of dummy arguments :
+!
+!
+
+!
+!*       0.2   Declarations of local variables :
+!
+REAL(KIND=JPHOOK) :: ZHOOK_HANDLE
+!-------------------------------------------------------------------------------
+IF (LHOOK) CALL DR_HOOK('INI_MFSHALL',0,ZHOOK_HANDLE)
+!
+IF(LTHETAS_MF) THEN
+  XLAMBDA_MF=5.87
+ELSE
+  XLAMBDA_MF=0.
+ENDIF
+!
+IF (LHOOK) CALL DR_HOOK('INI_MFSHALL',1,ZHOOK_HANDLE)
+!
+END SUBROUTINE INI_MFSHALL
+!
+END MODULE MODE_INI_MFSHALL
diff --git a/src/PHYEX/turb/ini_cturb.f90 b/src/PHYEX/turb/mode_ini_turb.f90
similarity index 79%
rename from src/PHYEX/turb/ini_cturb.f90
rename to src/PHYEX/turb/mode_ini_turb.f90
index ea3f0c70d937df63992fde48dba3347e5f6b5fd4..fc70cfaf945db2312defa67a60b887f9f3bea4af 100644
--- a/src/PHYEX/turb/ini_cturb.f90
+++ b/src/PHYEX/turb/mode_ini_turb.f90
@@ -2,38 +2,20 @@
 !MNH_LIC This is part of the Meso-NH software governed by the CeCILL-C licence
 !MNH_LIC version 1. See LICENSE, CeCILL-C_V1-en.txt and CeCILL-C_V1-fr.txt  
 !MNH_LIC for details. version 1.
-!-----------------------------------------------------------------
-!--------------- special set of characters for RCS information
-!-----------------------------------------------------------------
-! $Source$ $Revision$ $Date$
-!-----------------------------------------------------------------
-!-----------------------------------------------------------------
-!       #####################
-        MODULE MODI_INI_CTURB
-!       #####################
-!
-INTERFACE
-!
-SUBROUTINE INI_CTURB
-END SUBROUTINE INI_CTURB
-!
-END INTERFACE
-!
-END MODULE MODI_INI_CTURB
-!
-!
-!
+MODULE MODE_INI_TURB
+IMPLICIT NONE
+CONTAINS
 !       ####################
-        SUBROUTINE INI_CTURB
+        SUBROUTINE INI_TURB(HPROGRAM)
 !       ####################
 !
-!!****     *INI_CTURB*  - routine to initialize the turbulence scheme 
+!!****     *INI_TURB*  - routine to initialize the turbulence scheme 
 !!                        constants.
 !!
 !!      PURPOSE
 !!      -------
 !         The purpose of this routine is to initialize the turbulence 
-!       scheme constants that are stored in module MODD_CTURB
+!       scheme constants that are stored in module MODD_CTURB and MODD_TURBN
 !
 !!      METHOD
 !!      ------
@@ -63,24 +45,27 @@ END MODULE MODI_INI_CTURB
 !!        P.Jabouille       20/10/99   XCET=0.4
 !!        V.Masson          13/11/02   XALPSBL and XASBL
 !!                             05/06   Remove KEPS
-!!        Q.Rodier             01/19   XCED replaced by XCEDIS in read_exsegn.f90 and ini_modeln.f90
-!!                                     Remove XASBL (not used)
+!!        Q.Rodier             01/19   Remove XASBL (not used)
 !! --------------------------------------------------------------------------
 !
 !*        0. DECLARATIONS
 !            ------------
 !
 USE MODD_CST
-USE MODD_CTURB
+USE MODD_TURB_n, ONLY : XCTP, XCED, XCSHF, XCHF, XCTV, XCHV, XCHT1, XCHT2, XCPR1, CTURBLEN, &
+                      & XBL89EXP,  XUSRBL89
+USE MODD_NEB_n, ONLY: LSTATNW
+USE MODD_CTURB ! For true constants (not tunable)
+USE MODD_PARAMETERS, ONLY : XUNDEF
 !
-USE PARKIND1, ONLY : JPRB
-USE YOMHOOK , ONLY : LHOOK, DR_HOOK
+USE YOMHOOK , ONLY : LHOOK, DR_HOOK, JPHOOK
 !
 IMPLICIT NONE
 !
-REAL(KIND=JPRB) :: ZHOOK_HANDLE
+CHARACTER(LEN=6),  INTENT(IN) :: HPROGRAM
+REAL(KIND=JPHOOK) :: ZHOOK_HANDLE
 !
-IF (LHOOK) CALL DR_HOOK('INI_CTURB',0,ZHOOK_HANDLE)
+IF (LHOOK) CALL DR_HOOK('INI_TURB',0,ZHOOK_HANDLE)
 !
 CALL CTURB_ASSOCIATE()
 !
@@ -91,13 +76,22 @@ CALL CTURB_ASSOCIATE()
 !
 !         1.1 Constant for dissipation of Tke
 !
-!XCED is now replaced by XCEDIS
-!XCED  = 0.70
-!XCED  = 0.84
-!       Redelsperger-Sommeria (1981) = 0.70
-!       Schmidt-Schumann      (1989) = 0.845
-!       Cheng-Canuto-Howard   (2002) = 0.845
-!       Rodier, Masson, Couvreux, Paci (2017) = 0.34
+!
+IF(XCED == XUNDEF) THEN
+  !       Redelsperger-Sommeria (1981) = 0.70
+  !       Schmidt-Schumann      (1989) = 0.845
+  !       Cheng-Canuto-Howard   (2002) = 0.845
+  !       Rodier, Masson, Couvreux, Paci (2017) = 0.34
+  IF(CTURBLEN=='RM17' .OR. CTURBLEN=='ADAP') THEN
+    XCED=0.34
+  ELSE
+    IF(HPROGRAM=='AROME') THEN
+      XCED=0.85
+    ELSE
+      XCED=0.84
+    END IF
+  ENDIF
+ENDIF
 !
 !
 !         1.2 Constant for wind pressure-correlations
@@ -143,7 +137,14 @@ XCTD  = 1.2
 !
 !         1.7 Constant for temperature and vapor pressure-correlations
 !
-XCTP  = 4.65
+IF(XCTP == XUNDEF) THEN
+  IF (LSTATNW) THEN
+    !wc in STATNW consistent use of Redelsperger-Sommeria for (co)variances
+    XCTP  = 4.0
+  ELSE
+    XCTP  = 4.65
+  ENDIF
+ENDIF
 !       Redelsperger-Sommeria (1981) = 4.
 !       Schmidt-Schumann      (1989) = 3.25
 !       Cheng-Canuto-Howard   (2002) = 4.65
@@ -225,10 +226,6 @@ XCPR5= XCPR2
 !         3. MINIMUM VALUES 
 !            --------------
 !
-XTKEMIN=0.01 ! This value is replaced by XKEMIN in &NAM_TURBn
-!
-!XLINI=10.   ! BL mixing length
-XLINI=0.1   ! BL mixing length
 XLINF=1.E-10! to prevent division by zero
 !
 !
@@ -259,5 +256,12 @@ XSBL_O_BL     = 0.05 ! SBL height / BL height ratio
 XFTOP_O_FSURF = 0.05 ! Fraction of surface (heat or momentum) flux used to define top of BL
 !
 !
-IF (LHOOK) CALL DR_HOOK('INI_CTURB',1,ZHOOK_HANDLE)
-END SUBROUTINE INI_CTURB
+!         7. Constants for BL89 computation
+!
+XBL89EXP=LOG(16.)/(4.*LOG(XKARMAN)+LOG(XCED)-3.*LOG(XCMFS))
+XUSRBL89=1./XBL89EXP
+!
+!
+IF (LHOOK) CALL DR_HOOK('INI_TURB',1,ZHOOK_HANDLE)
+END SUBROUTINE INI_TURB
+END MODULE MODE_INI_TURB
diff --git a/src/PHYEX/turb/mode_mf_turb.f90 b/src/PHYEX/turb/mode_mf_turb.f90
index 0cede49ad0e9f14b030d1d005c51ffd31f246681..dd39e118828ce8aefcc48266c5e14b931eec566d 100644
--- a/src/PHYEX/turb/mode_mf_turb.f90
+++ b/src/PHYEX/turb/mode_mf_turb.f90
@@ -67,8 +67,7 @@ USE MODD_DIMPHYEX,        ONLY: DIMPHYEX_t
 USE MODI_SHUMAN_MF, ONLY: MZM_MF
 USE MODE_TRIDIAG_MASSFLUX, ONLY: TRIDIAG_MASSFLUX
 !
-USE PARKIND1, ONLY : JPRB
-USE YOMHOOK , ONLY : LHOOK, DR_HOOK
+USE YOMHOOK , ONLY : LHOOK, DR_HOOK, JPHOOK
 !
 IMPLICIT NONE
 !
@@ -131,7 +130,7 @@ INTEGER :: JSV          !number of scalar variables and Loop counter
 INTEGER :: JIJ, JK
 INTEGER :: IIJB,IIJE ! physical horizontal domain indices
 INTEGER :: IKT
-REAL(KIND=JPRB) :: ZHOOK_HANDLE
+REAL(KIND=JPHOOK) :: ZHOOK_HANDLE
 !
 !----------------------------------------------------------------------------
 !
diff --git a/src/PHYEX/turb/mode_mf_turb_expl.f90 b/src/PHYEX/turb/mode_mf_turb_expl.f90
index 8463dd902a9d46b751d72663cd10101cc9ddfefc..16d1e9f8a545fa9feb9673b824d361b6470afc5c 100644
--- a/src/PHYEX/turb/mode_mf_turb_expl.f90
+++ b/src/PHYEX/turb/mode_mf_turb_expl.f90
@@ -53,8 +53,7 @@ CONTAINS
 USE MODD_DIMPHYEX,        ONLY: DIMPHYEX_t
 USE MODD_PARAM_MFSHALL_n, ONLY: PARAM_MFSHALL_t
 !
-USE PARKIND1, ONLY : JPRB
-USE YOMHOOK , ONLY : LHOOK, DR_HOOK
+USE YOMHOOK , ONLY : LHOOK, DR_HOOK, JPHOOK
 USE MODI_SHUMAN_MF, ONLY: MZM_MF
 
 IMPLICIT NONE
@@ -100,7 +99,7 @@ REAL, DIMENSION(D%NIJT,D%NKT) :: ZTHLM_F,ZRTM_F
 INTEGER                              :: JK, JIJ            ! loop counter
 INTEGER :: IIJB,IIJE ! physical horizontal domain indices
 INTEGER :: IKT,IKB,IKE,IKL
-REAL(KIND=JPRB) :: ZHOOK_HANDLE
+REAL(KIND=JPHOOK) :: ZHOOK_HANDLE
 
 !----------------------------------------------------------------------------
 !
diff --git a/src/PHYEX/turb/mode_prandtl.f90 b/src/PHYEX/turb/mode_prandtl.f90
index f8f63f41324260074f34c016112306acd8e4fae9..6158c5c4dff154f19e9667605580dd5067c860a3 100644
--- a/src/PHYEX/turb/mode_prandtl.f90
+++ b/src/PHYEX/turb/mode_prandtl.f90
@@ -5,15 +5,16 @@
 !-----------------------------------------------------------------
 !    #################### 
      MODULE MODE_PRANDTL
-     USE PARKIND1, ONLY : JPRB
-     USE YOMHOOK , ONLY : LHOOK, DR_HOOK
+USE YOMHOOK , ONLY : LHOOK, DR_HOOK, JPHOOK
 !    #################### 
 !
 !* modification 08/2010  V. Masson  smoothing of the discontinuity in functions 
 !                                   used for implicitation of exchange coefficients
 !               05/2020   V. Masson and C. Lac : bug in D_PHI3DTDZ2_O_DDTDZ
+!               06/2023   S. Riette add the LSMOOTH_PRANDTL key
 !
 USE MODD_CTURB,      ONLY : CSTURB_t
+USE MODD_TURB_n,     ONLY : TURB_t
 USE MODD_DIMPHYEX,   ONLY : DIMPHYEX_t
 USE MODD_PARAMETERS, ONLY : JPVEXT_TURB
 !
@@ -23,7 +24,7 @@ IMPLICIT NONE
 !----------------------------------------------------------------------------
 CONTAINS
 !----------------------------------------------------------------------------
-      SUBROUTINE PRANDTL(D,CST,CSTURB,KRR,KSV,KRRI,OTURB_DIAG,&
+      SUBROUTINE PRANDTL(D,CST,CSTURB,TURBN,KRR,KSV,KRRI,OTURB_DIAG,&
                          HTURBDIM,OOCEAN,OHARAT,O2D,OCOMPUTE_SRC,&
                          TPFILE, OFLAT,                        &
                          PDXX,PDYY,PDZZ,PDZX,PDZY,             &
@@ -87,7 +88,7 @@ CONTAINS
 !!
 !!      Module MODD_CTURB: contains the set of constants for
 !!                        the turbulence scheme
-!!       CSTURB%XCTV,XCPR2    : constants for the turbulent prandtl numbers
+!!       TURBN%XCTV,XCPR2    : constants for the turbulent prandtl numbers
 !!       XTKEMIN        : minimum value allowed for the TKE
 !!
 !!      Module MODD_PARAMETERS 
@@ -141,15 +142,13 @@ CONTAINS
 !*      0. DECLARATIONS
 !          ------------
 !
-USE PARKIND1, ONLY : JPRB
-USE YOMHOOK , ONLY : LHOOK, DR_HOOK
 !
 USE MODD_CST,            ONLY: CST_t
 USE MODD_CTURB,          ONLY: CSTURB_t
 USE MODD_DIMPHYEX,       ONLY: DIMPHYEX_t
 USE MODD_FIELD,          ONLY: TFIELDMETADATA, TYPEREAL
+USE MODD_TURB_n,         ONLY: TURB_t
 USE MODD_IO,             ONLY: TFILEDATA
-USE MODD_PARAMETERS,     ONLY: JPVEXT_TURB
 !
 USE MODE_EMOIST,         ONLY: EMOIST
 USE MODE_ETHETA,         ONLY: ETHETA
@@ -164,6 +163,7 @@ IMPLICIT NONE
 TYPE(DIMPHYEX_t),       INTENT(IN)   :: D
 TYPE(CST_t),            INTENT(IN)   :: CST
 TYPE(CSTURB_t),         INTENT(IN)   :: CSTURB
+TYPE(TURB_t),           INTENT(IN)   :: TURBN
 INTEGER,                INTENT(IN)   :: KSV           ! number of scalar variables
 
 INTEGER,                INTENT(IN)   :: KRR           ! number of moist var.
@@ -217,9 +217,9 @@ REAL, DIMENSION(D%NIJT,D%NKT), INTENT(OUT)  ::  PEMOIST ! coefficient E_moist
 !       0.2  declaration of local variables
 !
 REAL, DIMENSION(D%NIJT,D%NKT) ::  &
-                  ZW1, ZW2, ZW3, &
+                  ZW1, ZW2,  &
 !                                                 working variables
-                  ZWORK1,ZWORK2,ZWORK3,ZWORK4, ZWORK5, ZWORK6,ZWORK7, &
+                  ZWORK1,ZWORK2,ZWORK3,ZWORK4, &
                   ZGXMM_PTH,ZGYMM_PTH,ZGXMM_PRM,ZGYMM_PRM, ZGXMM_PSV,ZGYMM_PSV
 !                                                 working variables for explicit array
 !                                                     
@@ -228,7 +228,6 @@ INTEGER :: IKE      ! vertical index value for the last inner mass point
 INTEGER::  JSV,JIJ,JK ! loop index
 INTEGER :: IIJB,IIJE,IKT,IKA,IKL
 
-INTEGER :: JLOOP
 REAL    :: ZMINVAL
 TYPE(TFIELDMETADATA) :: TZFIELD
 ! ---------------------------------------------------------------------------
@@ -236,7 +235,7 @@ TYPE(TFIELDMETADATA) :: TZFIELD
 !*      1.  DEFAULT VALUES,  1D REDELSPERGER NUMBERS 
 !           ----------------------------------------
 !
-REAL(KIND=JPRB) :: ZHOOK_HANDLE
+REAL(KIND=JPHOOK) :: ZHOOK_HANDLE
 IF (LHOOK) CALL DR_HOOK('PRANDTL',0,ZHOOK_HANDLE)
 
 IF (OHARAT) THEN
@@ -290,21 +289,21 @@ CALL GZ_M_W_PHY(D,PTHLM,PDZZ,ZWORK1)
 !
 IF (OOCEAN) THEN
   !$mnh_expand_array(JIJ=IIJB:IIJE,JK=1:IKT)
-  PREDTH1(:,:)= CSTURB%XCTV*PBLL_O_E(:,:)*ZWORK1(:,:)
+  PREDTH1(:,:)= TURBN%XCTV*PBLL_O_E(:,:)*ZWORK1(:,:)
   !$mnh_end_expand_array(JIJ=IIJB:IIJE,JK=1:IKT)
   PREDR1(:,:) = 0.
 ELSE
   IF (KRR /= 0) THEN                ! moist case
     CALL GZ_M_W_PHY(D,PRM(:,:,1),PDZZ,ZWORK2)
     !$mnh_expand_array(JIJ=IIJB:IIJE,JK=1:IKT)
-    PREDTH1(:,:)= CSTURB%XCTV*PBLL_O_E(:,:) * PETHETA(:,:) &
+    PREDTH1(:,:)= TURBN%XCTV*PBLL_O_E(:,:) * PETHETA(:,:) &
                                       * ZWORK1(:,:)
-    PREDR1(:,:) = CSTURB%XCTV*PBLL_O_E(:,:) * PEMOIST(:,:) &
+    PREDR1(:,:) = TURBN%XCTV*PBLL_O_E(:,:) * PEMOIST(:,:) &
                                       * ZWORK2(:,:)
     !$mnh_end_expand_array(JIJ=IIJB:IIJE,JK=1:IKT)
   ELSE                              ! dry case
     !$mnh_expand_array(JIJ=IIJB:IIJE,JK=1:IKT)
-    PREDTH1(:,:)= CSTURB%XCTV*PBLL_O_E(:,:)  * ZWORK1(:,:)
+    PREDTH1(:,:)= TURBN%XCTV*PBLL_O_E(:,:)  * ZWORK1(:,:)
     PREDR1(:,:) = 0.
     !$mnh_end_expand_array(JIJ=IIJB:IIJE,JK=1:IKT)
   END IF
@@ -371,7 +370,7 @@ ENDDO
 DO JSV=1,KSV
   CALL GZ_M_W_PHY(D,PSVM(:,:,JSV),PDZZ,ZWORK1)
   !$mnh_expand_array(JIJ=IIJB:IIJE,JK=1:IKT)
-  PREDS1(:,:,JSV)=CSTURB%XCTV*PBLL_O_E(:,:)*ZWORK1(:,:)
+  PREDS1(:,:,JSV)=TURBN%XCTV*PBLL_O_E(:,:)*ZWORK1(:,:)
   !$mnh_end_expand_array(JIJ=IIJB:IIJE,JK=1:IKT)
 END DO
 !
@@ -425,13 +424,13 @@ ELSE IF (O2D) THEN                      ! 3D case in a 2D model
     CALL MZM_PHY(D,ZWORK1,ZWORK4)
     !
     !$mnh_expand_array(JIJ=IIJB:IIJE,JK=1:IKT)
-    PRED2TH3(:,:)= PREDTH1(:,:)**2+(CSTURB%XCTV*PBLL_O_E(:,:) &
+    PRED2TH3(:,:)= PREDTH1(:,:)**2+(TURBN%XCTV*PBLL_O_E(:,:) &
                                        *PETHETA(:,:) )**2 * ZWORK2(:,:)
 !
-    PRED2R3(:,:)= PREDR1(:,:)**2 + (CSTURB%XCTV*PBLL_O_E(:,:) &
+    PRED2R3(:,:)= PREDR1(:,:)**2 + (TURBN%XCTV*PBLL_O_E(:,:) &
                                      * PEMOIST(:,:))**2 * ZWORK3(:,:)
 !
-    PRED2THR3(:,:)= PREDR1(:,:) * PREDTH1(:,:) +  CSTURB%XCTV**2 &
+    PRED2THR3(:,:)= PREDR1(:,:) * PREDTH1(:,:) +  TURBN%XCTV**2 &
                                         * PBLL_O_E(:,:)**2   &
                                         * PEMOIST(:,:) * PETHETA(:,:) &
                                         * ZWORK4(:,:)
@@ -443,7 +442,7 @@ ELSE IF (O2D) THEN                      ! 3D case in a 2D model
 !
   ELSE                 ! dry 3D case in a 2D model
     !$mnh_expand_array(JIJ=IIJB:IIJE,JK=1:IKT)
-    PRED2TH3(:,:) = PREDTH1(:,:)**2 +  CSTURB%XCTV**2 & 
+    PRED2TH3(:,:) = PREDTH1(:,:)**2 +  TURBN%XCTV**2 & 
                                        * PBLL_O_E(:,:)**2 * ZWORK2(:,:)      
     !$mnh_end_expand_array(JIJ=IIJB:IIJE,JK=1:IKT)
     PRED2TH3(:,IKB)=PRED2TH3(:,IKB+IKL)
@@ -478,13 +477,13 @@ ELSE                                 ! 3D case in a 3D model
     CALL MZM_PHY(D,ZWORK1,ZWORK4)
     !
     !$mnh_expand_array(JIJ=IIJB:IIJE,JK=1:IKT)
-    PRED2TH3(:,:)= PREDTH1(:,:)**2 +  ( CSTURB%XCTV*PBLL_O_E(:,:) &
+    PRED2TH3(:,:)= PREDTH1(:,:)**2 +  ( TURBN%XCTV*PBLL_O_E(:,:) &
                                       * PETHETA(:,:) )**2 * ZWORK2(:,:)      
 !
-    PRED2R3(:,:)= PREDR1(:,:)**2 + (CSTURB%XCTV*PBLL_O_E(:,:) &
+    PRED2R3(:,:)= PREDR1(:,:)**2 + (TURBN%XCTV*PBLL_O_E(:,:) &
                                      * PEMOIST(:,:))**2 * ZWORK3(:,:)
 !
-    PRED2THR3(:,:)= PREDR1(:,:) * PREDTH1(:,:) +  CSTURB%XCTV**2 &
+    PRED2THR3(:,:)= PREDR1(:,:) * PREDTH1(:,:) + TURBN%XCTV**2 &
                                        * PBLL_O_E(:,:)**2 *   &
                             PEMOIST(:,:) * PETHETA(:,:) * ZWORK4(:,:)
 
@@ -496,7 +495,7 @@ ELSE                                 ! 3D case in a 3D model
 !
   ELSE                 ! dry 3D case in a 3D model
     !$mnh_expand_array(JIJ=IIJB:IIJE,JK=1:IKT)
-    PRED2TH3(:,:) = PREDTH1(:,:)**2 +  CSTURB%XCTV**2 &
+    PRED2TH3(:,:) = PREDTH1(:,:)**2 + TURBN%XCTV**2 &
                                         * PBLL_O_E(:,:)**2 * ZWORK2(:,:)
     !$mnh_end_expand_array(JIJ=IIJB:IIJE,JK=1:IKT)
 ! 
@@ -733,9 +732,10 @@ ENDIF ! (Done only if OHARAT is FALSE)
 IF (LHOOK) CALL DR_HOOK('PRANDTL',1,ZHOOK_HANDLE)
 END SUBROUTINE PRANDTL
 !
-SUBROUTINE SMOOTH_TURB_FUNCT(D,CSTURB,PPHI3,PF_LIM,PF)
+SUBROUTINE SMOOTH_TURB_FUNCT(D,CSTURB,TURBN,PPHI3,PF_LIM,PF)
 !
 TYPE(CSTURB_t),                  INTENT(IN)    :: CSTURB
+TYPE(TURB_t),                    INTENT(IN)    :: TURBN
 TYPE(DIMPHYEX_t),       INTENT(IN)   :: D
 REAL, DIMENSION(D%NIJT,D%NKT), INTENT(IN)    :: PPHI3   ! Phi3
 REAL, DIMENSION(D%NIJT,D%NKT), INTENT(IN)    :: PF_LIM  ! Value of F when Phi3 is
@@ -754,17 +754,20 @@ IIJE=D%NIJE
 IIJB=D%NIJB
 IKT=D%NKT
 !
-!$mnh_expand_array(JIJ=IIJB:IIJE,JK=1:IKT)    
-ZCOEF(:,:) = MAX(MIN((  10.*(1.-PPHI3(:,:)/CSTURB%XPHI_LIM)) ,1.), 0.) 
-!
-PF(:,:) =     ZCOEF(:,:)   * PF(:,:)    &
-          + (1.-ZCOEF(:,:))  * PF_LIM(:,:)
-!$mnh_end_expand_array(JIJ=IIJB:IIJE,JK=1:IKT)    
+IF(TURBN%LSMOOTH_PRANDTL) THEN
+  !$mnh_expand_array(JIJ=IIJB:IIJE,JK=1:IKT)    
+  ZCOEF(:,:) = MAX(MIN((  10.*(1.-PPHI3(:,:)/CSTURB%XPHI_LIM)) ,1.), 0.) 
+  !
+  PF(:,:) =     ZCOEF(:,:)   * PF(:,:)    &
+            + (1.-ZCOEF(:,:))  * PF_LIM(:,:)
+  !$mnh_end_expand_array(JIJ=IIJB:IIJE,JK=1:IKT)    
+ENDIF
 !
 END SUBROUTINE SMOOTH_TURB_FUNCT
 !----------------------------------------------------------------------------
-SUBROUTINE PHI3(D,CSTURB,PREDTH1,PREDR1,PRED2TH3,PRED2R3,PRED2THR3,HTURBDIM,OUSERV,PPHI3)
+SUBROUTINE PHI3(D,CSTURB,TURBN,PREDTH1,PREDR1,PRED2TH3,PRED2R3,PRED2THR3,HTURBDIM,OUSERV,PPHI3)
   TYPE(CSTURB_t),                  INTENT(IN)    :: CSTURB
+  TYPE(TURB_t),                    INTENT(IN)    :: TURBN
   TYPE(DIMPHYEX_t),                   INTENT(IN)   :: D
   REAL, DIMENSION(D%NIJT,D%NKT), INTENT(IN) :: PREDTH1
   REAL, DIMENSION(D%NIJT,D%NKT), INTENT(IN) :: PREDR1
@@ -778,7 +781,7 @@ SUBROUTINE PHI3(D,CSTURB,PREDTH1,PREDR1,PRED2TH3,PRED2R3,PRED2THR3,HTURBDIM,OUSE
   REAL, DIMENSION(D%NIJT,D%NKT) :: ZW1, ZW2
   INTEGER :: IKB, IKE, JIJ,JK, IIJB,IIJE, IKT
 !
-REAL(KIND=JPRB) :: ZHOOK_HANDLE
+REAL(KIND=JPHOOK) :: ZHOOK_HANDLE
 IF (LHOOK) CALL DR_HOOK('MODE_PRANDTL:PHI3',0,ZHOOK_HANDLE)
 IKB=D%NKTB
 IKE=D%NKTE
@@ -836,8 +839,9 @@ PPHI3(:,IKE+1)=PPHI3(:,IKE)
 IF (LHOOK) CALL DR_HOOK('MODE_PRANDTL:PHI3',1,ZHOOK_HANDLE)
 END SUBROUTINE PHI3
 !----------------------------------------------------------------------------
-SUBROUTINE PSI_SV(D,CSTURB,KSV,PREDTH1,PREDR1,PREDS1,PRED2THS,PRED2RS,PPHI3,PPSI3,PPSI_SV)
+SUBROUTINE PSI_SV(D,CSTURB,TURBN,KSV,PREDTH1,PREDR1,PREDS1,PRED2THS,PRED2RS,PPHI3,PPSI3,PPSI_SV)
   TYPE(CSTURB_t),                  INTENT(IN)      :: CSTURB
+  TYPE(TURB_t),                    INTENT(IN)    :: TURBN
   TYPE(DIMPHYEX_t),                INTENT(IN)      :: D
   INTEGER,                         INTENT(IN)      :: KSV
   REAL, DIMENSION(D%NIJT,D%NKT),   INTENT(IN) :: PREDTH1
@@ -852,7 +856,7 @@ SUBROUTINE PSI_SV(D,CSTURB,KSV,PREDTH1,PREDR1,PREDS1,PRED2THS,PRED2RS,PPHI3,PPSI
   INTEGER :: IKB, IKE, IIJB,IIJE, IKT
   INTEGER :: JSV,JIJ,JK
 !
-REAL(KIND=JPRB) :: ZHOOK_HANDLE
+REAL(KIND=JPHOOK) :: ZHOOK_HANDLE
 IF (LHOOK) CALL DR_HOOK('MODE_PRANDTL:PSI_SV',0,ZHOOK_HANDLE)
 IKB=D%NKTB
 IKE=D%NKTE
@@ -891,8 +895,9 @@ END DO
 IF (LHOOK) CALL DR_HOOK('MODE_PRANDTL:PSI_SV',1,ZHOOK_HANDLE)
 END SUBROUTINE PSI_SV
 !----------------------------------------------------------------------------
-SUBROUTINE D_PHI3DTDZ_O_DDTDZ(D,CSTURB,PPHI3,PREDTH1,PREDR1,PRED2TH3,PRED2THR3,HTURBDIM,OUSERV,PD_PHI3DTDZ_O_DDTDZ)
+SUBROUTINE D_PHI3DTDZ_O_DDTDZ(D,CSTURB,TURBN,PPHI3,PREDTH1,PREDR1,PRED2TH3,PRED2THR3,HTURBDIM,OUSERV,PD_PHI3DTDZ_O_DDTDZ)
   TYPE(CSTURB_t),                  INTENT(IN)    :: CSTURB
+  TYPE(TURB_t),                    INTENT(IN)    :: TURBN
   TYPE(DIMPHYEX_t),                   INTENT(IN)   :: D
   REAL, DIMENSION(D%NIJT,D%NKT), INTENT(IN) :: PPHI3
   REAL, DIMENSION(D%NIJT,D%NKT), INTENT(IN) :: PREDTH1
@@ -904,7 +909,7 @@ SUBROUTINE D_PHI3DTDZ_O_DDTDZ(D,CSTURB,PPHI3,PREDTH1,PREDR1,PRED2TH3,PRED2THR3,H
   REAL, DIMENSION(D%NIJT,D%NKT),INTENT(OUT) :: PD_PHI3DTDZ_O_DDTDZ
   INTEGER :: IKB, IKE,JIJ,JK, IIJB,IIJE,IKT
 !
-REAL(KIND=JPRB) :: ZHOOK_HANDLE
+REAL(KIND=JPHOOK) :: ZHOOK_HANDLE
 IF (LHOOK) CALL DR_HOOK('MODE_PRANDTL:D_PHI3DTDZ_O_DDTDZ',0,ZHOOK_HANDLE)
 IKB=D%NKTB
 IKE=D%NKTE
@@ -916,11 +921,7 @@ IF (HTURBDIM=='3DIM') THEN
         !* 3DIM case
   IF (OUSERV) THEN
    !$mnh_expand_where(JIJ=IIJB:IIJE,JK=1:IKT)    
-#ifdef REPRO48
-    WHERE (PPHI3(:,:)/=CSTURB%XPHI_LIM)
-#else
     WHERE (PPHI3(:,:)<=CSTURB%XPHI_LIM)
-#endif
       PD_PHI3DTDZ_O_DDTDZ(:,:) = PPHI3(:,:)                       &
           * (1. - PREDTH1(:,:) * (3./2.+PREDTH1(:,:)+PREDR1(:,:))   &
                /((1.+PREDTH1(:,:)+PREDR1(:,:)) &
@@ -940,11 +941,7 @@ IF (HTURBDIM=='3DIM') THEN
 !
   ELSE
    !$mnh_expand_where(JIJ=IIJB:IIJE,JK=1:IKT)    
-#ifdef REPRO48
-    WHERE (PPHI3(:,:)/=CSTURB%XPHI_LIM)
-#else
     WHERE (PPHI3(:,:)<=CSTURB%XPHI_LIM)
-#endif
     PD_PHI3DTDZ_O_DDTDZ(:,:) = PPHI3(:,:)             &
           * (1. - PREDTH1(:,:) * (3./2.+PREDTH1(:,:))      &
                /((1.+PREDTH1(:,:))*(1.+1./2.*PREDTH1(:,:))))        &
@@ -972,11 +969,8 @@ DO JK=1,IKT
 ENDDO
 END IF
 !
-#ifdef REPRO48
-#else
 !* smoothing
-CALL SMOOTH_TURB_FUNCT(D,CSTURB,PPHI3,PPHI3,PD_PHI3DTDZ_O_DDTDZ)
-#endif
+CALL SMOOTH_TURB_FUNCT(D,CSTURB,TURBN,PPHI3,PPHI3,PD_PHI3DTDZ_O_DDTDZ)
 !
 PD_PHI3DTDZ_O_DDTDZ(:,IKB-1)=PD_PHI3DTDZ_O_DDTDZ(:,IKB)
 PD_PHI3DTDZ_O_DDTDZ(:,IKE+1)=PD_PHI3DTDZ_O_DDTDZ(:,IKE)
@@ -984,8 +978,9 @@ PD_PHI3DTDZ_O_DDTDZ(:,IKE+1)=PD_PHI3DTDZ_O_DDTDZ(:,IKE)
 IF (LHOOK) CALL DR_HOOK('MODE_PRANDTL:D_PHI3DTDZ_O_DDTDZ',1,ZHOOK_HANDLE)
 END SUBROUTINE D_PHI3DTDZ_O_DDTDZ
 !----------------------------------------------------------------------------
-SUBROUTINE D_PHI3DRDZ_O_DDRDZ(D,CSTURB,PPHI3,PREDTH1,PREDR1,PRED2TH3,PRED2THR3,HTURBDIM,OUSERV,PD_PHI3DRDZ_O_DDRDZ)
+SUBROUTINE D_PHI3DRDZ_O_DDRDZ(D,CSTURB,TURBN,PPHI3,PREDTH1,PREDR1,PRED2TH3,PRED2THR3,HTURBDIM,OUSERV,PD_PHI3DRDZ_O_DDRDZ)
   TYPE(CSTURB_t),                     INTENT(IN) :: CSTURB
+  TYPE(TURB_t),                    INTENT(IN)    :: TURBN
   TYPE(DIMPHYEX_t),                   INTENT(IN) :: D
   REAL, DIMENSION(D%NIJT,D%NKT), INTENT(IN) :: PPHI3
   REAL, DIMENSION(D%NIJT,D%NKT), INTENT(IN) :: PREDTH1
@@ -997,7 +992,7 @@ SUBROUTINE D_PHI3DRDZ_O_DDRDZ(D,CSTURB,PPHI3,PREDTH1,PREDR1,PRED2TH3,PRED2THR3,H
   REAL, DIMENSION(D%NIJT,D%NKT),INTENT(OUT) :: PD_PHI3DRDZ_O_DDRDZ
   INTEGER :: IKB, IKE, JIJ,JK, IIJB,IIJE,IKT
 !
-REAL(KIND=JPRB) :: ZHOOK_HANDLE
+REAL(KIND=JPHOOK) :: ZHOOK_HANDLE
 IF (LHOOK) CALL DR_HOOK('MODE_PRANDTL:D_PHI3DRDZ_O_DDRDZ',0,ZHOOK_HANDLE)
 IKB=D%NKTB
 IKE=D%NKTE
@@ -1010,11 +1005,7 @@ IF (HTURBDIM=='3DIM') THEN
         !* 3DIM case
   IF (OUSERV) THEN
    !$mnh_expand_where(JIJ=IIJB:IIJE,JK=1:IKT)    
-#ifdef REPRO48
-    WHERE (PPHI3(:,:)/=CSTURB%XPHI_LIM)
-#else
     WHERE (PPHI3(:,:)<=CSTURB%XPHI_LIM)
-#endif
       PD_PHI3DRDZ_O_DDRDZ(:,:) = PPHI3(:,:) &
       * (1.-PREDR1(:,:)*(3./2.+PREDTH1(:,:)+PREDR1(:,:)) &
       / ((1.+PREDTH1(:,:)+PREDR1(:,:)) & 
@@ -1036,11 +1027,7 @@ IF (HTURBDIM=='3DIM') THEN
 ELSE
         !* 1DIM case
     !$mnh_expand_where(JIJ=IIJB:IIJE,JK=1:IKT)    
-#ifdef REPRO48
-    WHERE (PPHI3(:,:)/=CSTURB%XPHI_LIM)
-#else
     WHERE (PPHI3(:,:)<=CSTURB%XPHI_LIM)
-#endif
     PD_PHI3DRDZ_O_DDRDZ(:,:) = PPHI3(:,:)                           &
           * (1. - PREDR1(:,:)*PPHI3(:,:))
   ELSEWHERE
@@ -1049,11 +1036,8 @@ ELSE
   !$mnh_end_expand_where(JIJ=IIJB:IIJE,JK=1:IKT)    
 END IF
 !
-#ifdef REPRO48
-#else
 !* smoothing
-CALL SMOOTH_TURB_FUNCT(D,CSTURB,PPHI3,PPHI3,PD_PHI3DRDZ_O_DDRDZ)
-#endif
+CALL SMOOTH_TURB_FUNCT(D,CSTURB,TURBN,PPHI3,PPHI3,PD_PHI3DRDZ_O_DDRDZ)
 !
 PD_PHI3DRDZ_O_DDRDZ(:,IKB-1)=PD_PHI3DRDZ_O_DDRDZ(:,IKB)
 PD_PHI3DRDZ_O_DDRDZ(:,IKE+1)=PD_PHI3DRDZ_O_DDRDZ(:,IKE)
@@ -1061,8 +1045,9 @@ PD_PHI3DRDZ_O_DDRDZ(:,IKE+1)=PD_PHI3DRDZ_O_DDRDZ(:,IKE)
 IF (LHOOK) CALL DR_HOOK('MODE_PRANDTL:D_PHI3DRDZ_O_DDRDZ',1,ZHOOK_HANDLE)
 END SUBROUTINE D_PHI3DRDZ_O_DDRDZ
 !----------------------------------------------------------------------------
-SUBROUTINE D_PHI3DTDZ2_O_DDTDZ(D,CSTURB,PPHI3,PREDTH1,PREDR1,PRED2TH3,PRED2THR3,PDTDZ,HTURBDIM,OUSERV,PD_PHI3DTDZ2_O_DDTDZ)
+SUBROUTINE D_PHI3DTDZ2_O_DDTDZ(D,CSTURB,TURBN,PPHI3,PREDTH1,PREDR1,PRED2TH3,PRED2THR3,PDTDZ,HTURBDIM,OUSERV,PD_PHI3DTDZ2_O_DDTDZ)
   TYPE(CSTURB_t),                     INTENT(IN) :: CSTURB
+  TYPE(TURB_t),                    INTENT(IN)    :: TURBN
   TYPE(DIMPHYEX_t),                   INTENT(IN) :: D
   REAL, DIMENSION(D%NIJT,D%NKT), INTENT(IN) :: PPHI3
   REAL, DIMENSION(D%NIJT,D%NKT), INTENT(IN) :: PREDTH1
@@ -1076,7 +1061,7 @@ SUBROUTINE D_PHI3DTDZ2_O_DDTDZ(D,CSTURB,PPHI3,PREDTH1,PREDR1,PRED2TH3,PRED2THR3,
   REAL, DIMENSION(D%NIJT,D%NKT) :: ZWORK1 ! working array
   INTEGER :: IKB, IKE, JIJ,JK, IIJB,IIJE,IKT
 !
-REAL(KIND=JPRB) :: ZHOOK_HANDLE
+REAL(KIND=JPHOOK) :: ZHOOK_HANDLE
 IF (LHOOK) CALL DR_HOOK('MODE_PRANDTL:D_PHI3DTDZ2_O_DDTDZ',0,ZHOOK_HANDLE)
 IKB=D%NKTB
 IKE=D%NKTE
@@ -1087,7 +1072,7 @@ IKT=D%NKT
 !
 IF (HTURBDIM=='3DIM') THEN
    ! by derivation of (phi3 dtdz) * dtdz according to dtdz we obtain:
-   CALL D_PHI3DTDZ_O_DDTDZ(D,CSTURB,PPHI3,PREDTH1,PREDR1,PRED2TH3,PRED2THR3,HTURBDIM,OUSERV,ZWORK1)
+   CALL D_PHI3DTDZ_O_DDTDZ(D,CSTURB,TURBN,PPHI3,PREDTH1,PREDR1,PRED2TH3,PRED2THR3,HTURBDIM,OUSERV,ZWORK1)
    !$mnh_expand_array(JIJ=IIJB:IIJE,JK=1:IKT)
    PD_PHI3DTDZ2_O_DDTDZ(:,:) = PDTDZ(:,:) &
    * (PPHI3(:,:) +  ZWORK1(:,:))
@@ -1095,11 +1080,7 @@ IF (HTURBDIM=='3DIM') THEN
 ELSE
         !* 1DIM case
     !$mnh_expand_where(JIJ=IIJB:IIJE,JK=1:IKT)    
-#ifdef REPRO48
-    WHERE (PPHI3(:,:)/=CSTURB%XPHI_LIM)
-#else
     WHERE (PPHI3(:,:)<=CSTURB%XPHI_LIM)
-#endif
       PD_PHI3DTDZ2_O_DDTDZ(:,:) = PPHI3(:,:)*PDTDZ(:,:)             &
           * (2. - PREDTH1(:,:)*PPHI3(:,:))
     ELSEWHERE
@@ -1108,11 +1089,8 @@ ELSE
     !$mnh_end_expand_where(JIJ=IIJB:IIJE,JK=1:IKT)    
 END IF
 !
-#ifdef REPRO48
-#else
 !* smoothing
-CALL SMOOTH_TURB_FUNCT(D,CSTURB,PPHI3,PPHI3*2.*PDTDZ,PD_PHI3DTDZ2_O_DDTDZ)
-#endif
+CALL SMOOTH_TURB_FUNCT(D,CSTURB,TURBN,PPHI3,PPHI3*2.*PDTDZ,PD_PHI3DTDZ2_O_DDTDZ)
 !
 !
 PD_PHI3DTDZ2_O_DDTDZ(:,IKB-1)=PD_PHI3DTDZ2_O_DDTDZ(:,IKB)
@@ -1121,9 +1099,10 @@ PD_PHI3DTDZ2_O_DDTDZ(:,IKE+1)=PD_PHI3DTDZ2_O_DDTDZ(:,IKE)
 IF (LHOOK) CALL DR_HOOK('MODE_PRANDTL:D_PHI3DTDZ2_O_DDTDZ',1,ZHOOK_HANDLE)
 END SUBROUTINE D_PHI3DTDZ2_O_DDTDZ
 !----------------------------------------------------------------------------
-SUBROUTINE M3_WTH_WTH2(D,CSTURB,PREDTH1,PREDR1,PD,PBLL_O_E,PETHETA,PM3_WTH_WTH2)
+SUBROUTINE M3_WTH_WTH2(D,CSTURB,TURBN,PREDTH1,PREDR1,PD,PBLL_O_E,PETHETA,PM3_WTH_WTH2)
   TYPE(DIMPHYEX_t),                   INTENT(IN) :: D
   TYPE(CSTURB_t),                     INTENT(IN) :: CSTURB
+  TYPE(TURB_t),                    INTENT(IN)    :: TURBN
   REAL, DIMENSION(D%NIJT,D%NKT), INTENT(IN) :: PREDTH1
   REAL, DIMENSION(D%NIJT,D%NKT), INTENT(IN) :: PREDR1
   REAL, DIMENSION(D%NIJT,D%NKT), INTENT(IN) :: PD
@@ -1132,7 +1111,7 @@ SUBROUTINE M3_WTH_WTH2(D,CSTURB,PREDTH1,PREDR1,PD,PBLL_O_E,PETHETA,PM3_WTH_WTH2)
   REAL, DIMENSION(D%NIJT,D%NKT),INTENT(OUT) :: PM3_WTH_WTH2
   INTEGER :: IKB, IKE, JIJ,JK, IIJB,IIJE,IKT
 !
-REAL(KIND=JPRB) :: ZHOOK_HANDLE
+REAL(KIND=JPHOOK) :: ZHOOK_HANDLE
 IF (LHOOK) CALL DR_HOOK('MODE_PRANDTL:M3_WTH_WTH2',0,ZHOOK_HANDLE)
 IKB=D%NKTB
 IKE=D%NKTE
@@ -1141,7 +1120,7 @@ IIJB=D%NIJB
 IKT=D%NKT
 !
 !$mnh_expand_array(JIJ=IIJB:IIJE,JK=1:IKT)
-PM3_WTH_WTH2(:,:) = CSTURB%XCSHF*PBLL_O_E(:,:)&
+PM3_WTH_WTH2(:,:) = TURBN%XCSHF*PBLL_O_E(:,:)&
                    * PETHETA(:,:)*0.5/CSTURB%XCTD        &
                    * (1.+0.5*PREDTH1(:,:)+PREDR1(:,:)) / PD(:,:)
 !$mnh_end_expand_array(JIJ=IIJB:IIJE,JK=1:IKT)
@@ -1151,9 +1130,10 @@ PM3_WTH_WTH2(:,IKE+1)=PM3_WTH_WTH2(:,IKE)
 IF (LHOOK) CALL DR_HOOK('MODE_PRANDTL:M3_WTH_WTH2',1,ZHOOK_HANDLE)
 END SUBROUTINE M3_WTH_WTH2
 !----------------------------------------------------------------------------
-SUBROUTINE D_M3_WTH_WTH2_O_DDTDZ(D,CSTURB,PM3_WTH_WTH2,PREDTH1,PREDR1,PD,PBLL_O_E,PETHETA,PD_M3_WTH_WTH2_O_DDTDZ)
+SUBROUTINE D_M3_WTH_WTH2_O_DDTDZ(D,CSTURB,TURBN,PM3_WTH_WTH2,PREDTH1,PREDR1,PD,PBLL_O_E,PETHETA,PD_M3_WTH_WTH2_O_DDTDZ)
   TYPE(DIMPHYEX_t),                   INTENT(IN) :: D
   TYPE(CSTURB_t),                     INTENT(IN) :: CSTURB
+  TYPE(TURB_t),                    INTENT(IN)    :: TURBN
   REAL, DIMENSION(D%NIJT,D%NKT), INTENT(IN) :: PM3_WTH_WTH2
   REAL, DIMENSION(D%NIJT,D%NKT), INTENT(IN) :: PREDTH1
   REAL, DIMENSION(D%NIJT,D%NKT), INTENT(IN) :: PREDR1
@@ -1163,7 +1143,7 @@ SUBROUTINE D_M3_WTH_WTH2_O_DDTDZ(D,CSTURB,PM3_WTH_WTH2,PREDTH1,PREDR1,PD,PBLL_O_
   REAL, DIMENSION(D%NIJT,D%NKT),INTENT(OUT) :: PD_M3_WTH_WTH2_O_DDTDZ
   INTEGER :: IKB, IKE, JIJ,JK, IIJB,IIJE,IKT
 !
-REAL(KIND=JPRB) :: ZHOOK_HANDLE
+REAL(KIND=JPHOOK) :: ZHOOK_HANDLE
 IF (LHOOK) CALL DR_HOOK('MODE_PRANDTL:D_M3_WTH_WTH2_O_DDTDZ',0,ZHOOK_HANDLE)
 IKB=D%NKTB
 IKE=D%NKTE
@@ -1173,10 +1153,10 @@ IKT=D%NKT
 !
 !$mnh_expand_array(JIJ=IIJB:IIJE,JK=1:IKT)
 PD_M3_WTH_WTH2_O_DDTDZ(:,:) = &
-(0.5*CSTURB%XCSHF*PBLL_O_E(:,:)*PETHETA(:,:)*0.5/CSTURB%XCTD/PD(:,:) &
+(0.5*TURBN%XCSHF*PBLL_O_E(:,:)*PETHETA(:,:)*0.5/CSTURB%XCTD/PD(:,:) &
 - PM3_WTH_WTH2(:,:)/PD(:,:)&
 *(1.5+PREDTH1(:,:)+PREDR1(:,:))  )&
-* PBLL_O_E(:,:) * PETHETA(:,:) * CSTURB%XCTV
+* PBLL_O_E(:,:) * PETHETA(:,:) * TURBN%XCTV
 !$mnh_end_expand_array(JIJ=IIJB:IIJE,JK=1:IKT)
 !
 PD_M3_WTH_WTH2_O_DDTDZ(:,IKB-1)=PD_M3_WTH_WTH2_O_DDTDZ(:,IKB)
@@ -1185,9 +1165,10 @@ PD_M3_WTH_WTH2_O_DDTDZ(:,IKE+1)=PD_M3_WTH_WTH2_O_DDTDZ(:,IKE)
 IF (LHOOK) CALL DR_HOOK('MODE_PRANDTL:D_M3_WTH_WTH2_O_DDTDZ',1,ZHOOK_HANDLE)
 END SUBROUTINE D_M3_WTH_WTH2_O_DDTDZ
 !----------------------------------------------------------------------------
-SUBROUTINE M3_WTH_W2TH(D,CSTURB,PREDTH1,PREDR1,PD,PKEFF,PTKE,PM3_WTH_W2TH)
+SUBROUTINE M3_WTH_W2TH(D,CSTURB,TURBN,PREDTH1,PREDR1,PD,PKEFF,PTKE,PM3_WTH_W2TH)
   TYPE(DIMPHYEX_t),                   INTENT(IN) :: D
   TYPE(CSTURB_t),                     INTENT(IN) :: CSTURB
+  TYPE(TURB_t),                    INTENT(IN)    :: TURBN
   REAL, DIMENSION(D%NIJT,D%NKT), INTENT(IN) :: PREDTH1
   REAL, DIMENSION(D%NIJT,D%NKT), INTENT(IN) :: PREDR1
   REAL, DIMENSION(D%NIJT,D%NKT), INTENT(IN) :: PD
@@ -1197,7 +1178,7 @@ SUBROUTINE M3_WTH_W2TH(D,CSTURB,PREDTH1,PREDR1,PD,PKEFF,PTKE,PM3_WTH_W2TH)
   REAL, DIMENSION(D%NIJT,D%NKT) :: ZWORK1 ! working array
   INTEGER :: IKB, IKE, JIJ,JK, IIJB,IIJE,IKT
 !
-REAL(KIND=JPRB) :: ZHOOK_HANDLE
+REAL(KIND=JPHOOK) :: ZHOOK_HANDLE
 IF (LHOOK) CALL DR_HOOK('MODE_PRANDTL:M3_WTH_W2TH',0,ZHOOK_HANDLE)
 IKB=D%NKTB
 IKE=D%NKTE
@@ -1207,7 +1188,7 @@ IKT=D%NKT
 !
 CALL MZM_PHY(D,PTKE,ZWORK1)
 !$mnh_expand_array(JIJ=IIJB:IIJE,JK=1:IKT)
-PM3_WTH_W2TH(:,:) = CSTURB%XCSHF*PKEFF(:,:)*1.5/ZWORK1(:,:) &
+PM3_WTH_W2TH(:,:) = TURBN%XCSHF*PKEFF(:,:)*1.5/ZWORK1(:,:) &
   * (1. - 0.5*PREDR1(:,:)*(1.+PREDR1(:,:))/PD(:,:) ) &
   / (1.+PREDTH1(:,:))
 !$mnh_end_expand_array(JIJ=IIJB:IIJE,JK=1:IKT)
@@ -1218,9 +1199,10 @@ PM3_WTH_W2TH(:,IKE+1)=PM3_WTH_W2TH(:,IKE)
 IF (LHOOK) CALL DR_HOOK('MODE_PRANDTL:M3_WTH_W2TH',1,ZHOOK_HANDLE)
 END SUBROUTINE M3_WTH_W2TH
 !----------------------------------------------------------------------------
-SUBROUTINE D_M3_WTH_W2TH_O_DDTDZ(D,CSTURB,PREDTH1,PREDR1,PD,PBLL_O_E,PETHETA,PKEFF,PTKE,PD_M3_WTH_W2TH_O_DDTDZ)
+SUBROUTINE D_M3_WTH_W2TH_O_DDTDZ(D,CSTURB,TURBN,PREDTH1,PREDR1,PD,PBLL_O_E,PETHETA,PKEFF,PTKE,PD_M3_WTH_W2TH_O_DDTDZ)
   TYPE(DIMPHYEX_t),                   INTENT(IN) :: D
   TYPE(CSTURB_t),                     INTENT(IN) :: CSTURB
+  TYPE(TURB_t),                    INTENT(IN)    :: TURBN
   REAL, DIMENSION(D%NIJT,D%NKT), INTENT(IN) :: PREDTH1
   REAL, DIMENSION(D%NIJT,D%NKT), INTENT(IN) :: PREDR1
   REAL, DIMENSION(D%NIJT,D%NKT), INTENT(IN) :: PD
@@ -1232,7 +1214,7 @@ SUBROUTINE D_M3_WTH_W2TH_O_DDTDZ(D,CSTURB,PREDTH1,PREDR1,PD,PBLL_O_E,PETHETA,PKE
   REAL, DIMENSION(D%NIJT,D%NKT) :: ZWORK1 ! working array
   INTEGER :: IKB, IKE, JIJ,JK, IIJB,IIJE,IKT
 !
-REAL(KIND=JPRB) :: ZHOOK_HANDLE
+REAL(KIND=JPHOOK) :: ZHOOK_HANDLE
 IF (LHOOK) CALL DR_HOOK('MODE_PRANDTL:D_M3_WTH_W2TH_O_DDTDZ',0,ZHOOK_HANDLE)
 IKB=D%NKTB
 IKE=D%NKTE
@@ -1243,8 +1225,8 @@ IKT=D%NKT
 CALL MZM_PHY(D,PTKE,ZWORK1)
 !$mnh_expand_array(JIJ=IIJB:IIJE,JK=1:IKT)
 PD_M3_WTH_W2TH_O_DDTDZ(:,:) = &
- - CSTURB%XCSHF*PKEFF(:,:)*1.5/ZWORK1(:,:)/(1.+PREDTH1(:,:))**2 &
- * CSTURB%XCTV*PBLL_O_E(:,:)*PETHETA(:,:)  &
+ - TURBN%XCSHF*PKEFF(:,:)*1.5/ZWORK1(:,:)/(1.+PREDTH1(:,:))**2 &
+ * TURBN%XCTV*PBLL_O_E(:,:)*PETHETA(:,:)  &
  * (1. - 0.5*PREDR1(:,:)*(1.+PREDR1(:,:))/PD(:,:)* &
    ( 1.+(1.+PREDTH1(:,:))*(1.5+PREDR1(:,:)+PREDTH1(:,:))&
    /PD(:,:)) )
@@ -1256,9 +1238,10 @@ PD_M3_WTH_W2TH_O_DDTDZ(:,IKE+1)=PD_M3_WTH_W2TH_O_DDTDZ(:,IKE)
 IF (LHOOK) CALL DR_HOOK('MODE_PRANDTL:D_M3_WTH_W2TH_O_DDTDZ',1,ZHOOK_HANDLE)
 END SUBROUTINE D_M3_WTH_W2TH_O_DDTDZ
 !----------------------------------------------------------------------------
-SUBROUTINE M3_WTH_W2R(D,CSTURB,PD,PKEFF,PTKE,PBLL_O_E,PEMOIST,PDTDZ,PM3_WTH_W2R)
+SUBROUTINE M3_WTH_W2R(D,CSTURB,TURBN,PD,PKEFF,PTKE,PBLL_O_E,PEMOIST,PDTDZ,PM3_WTH_W2R)
   TYPE(DIMPHYEX_t),                   INTENT(IN) :: D
   TYPE(CSTURB_t),                     INTENT(IN) :: CSTURB
+  TYPE(TURB_t),                    INTENT(IN)    :: TURBN
   REAL, DIMENSION(D%NIJT,D%NKT), INTENT(IN) :: PD
   REAL, DIMENSION(D%NIJT,D%NKT), INTENT(IN) :: PKEFF
   REAL, DIMENSION(D%NIJT,D%NKT), INTENT(IN) :: PTKE
@@ -1269,7 +1252,7 @@ SUBROUTINE M3_WTH_W2R(D,CSTURB,PD,PKEFF,PTKE,PBLL_O_E,PEMOIST,PDTDZ,PM3_WTH_W2R)
   REAL, DIMENSION(D%NIJT,D%NKT) :: ZWORK1 ! working array
   INTEGER :: IKB, IKE, JIJ,JK,IIJB,IIJE,IKT
 !
-REAL(KIND=JPRB) :: ZHOOK_HANDLE
+REAL(KIND=JPHOOK) :: ZHOOK_HANDLE
 IF (LHOOK) CALL DR_HOOK('MODE_PRANDTL:M3_WTH_W2R',0,ZHOOK_HANDLE)
 IKB=D%NKTB
 IKE=D%NKTE
@@ -1280,7 +1263,7 @@ IKT=D%NKT
 CALL MZM_PHY(D,PTKE,ZWORK1)
 !$mnh_expand_array(JIJ=IIJB:IIJE,JK=1:IKT)
 PM3_WTH_W2R(:,:) = &
-  - CSTURB%XCSHF*PKEFF(:,:)*0.75*CSTURB%XCTV*PBLL_O_E(:,:) &
+  - TURBN%XCSHF*PKEFF(:,:)*0.75*TURBN%XCTV*PBLL_O_E(:,:) &
   /ZWORK1(:,:)*PEMOIST(:,:)*PDTDZ(:,:)/PD(:,:)
 !$mnh_end_expand_array(JIJ=IIJB:IIJE,JK=1:IKT)
 !
@@ -1290,9 +1273,10 @@ PM3_WTH_W2R(:,IKE+1)=PM3_WTH_W2R(:,IKE)
 IF (LHOOK) CALL DR_HOOK('MODE_PRANDTL:M3_WTH_W2R',1,ZHOOK_HANDLE)
 END SUBROUTINE M3_WTH_W2R
 !----------------------------------------------------------------------------
-SUBROUTINE D_M3_WTH_W2R_O_DDTDZ(D,CSTURB,PREDTH1,PREDR1,PD,PKEFF,PTKE,PBLL_O_E,PEMOIST,PD_M3_WTH_W2R_O_DDTDZ)
+SUBROUTINE D_M3_WTH_W2R_O_DDTDZ(D,CSTURB,TURBN,PREDTH1,PREDR1,PD,PKEFF,PTKE,PBLL_O_E,PEMOIST,PD_M3_WTH_W2R_O_DDTDZ)
   TYPE(DIMPHYEX_t),                   INTENT(IN) :: D
   TYPE(CSTURB_t),                     INTENT(IN) :: CSTURB
+  TYPE(TURB_t),                    INTENT(IN)    :: TURBN
   REAL, DIMENSION(D%NIJT,D%NKT), INTENT(IN) :: PREDTH1
   REAL, DIMENSION(D%NIJT,D%NKT), INTENT(IN) :: PREDR1
   REAL, DIMENSION(D%NIJT,D%NKT), INTENT(IN) :: PD
@@ -1304,7 +1288,7 @@ SUBROUTINE D_M3_WTH_W2R_O_DDTDZ(D,CSTURB,PREDTH1,PREDR1,PD,PKEFF,PTKE,PBLL_O_E,P
   REAL, DIMENSION(D%NIJT,D%NKT) :: ZWORK1 ! working array
   INTEGER :: IKB, IKE, JIJ,JK,IIJB,IIJE,IKT
 !
-REAL(KIND=JPRB) :: ZHOOK_HANDLE
+REAL(KIND=JPHOOK) :: ZHOOK_HANDLE
 IF (LHOOK) CALL DR_HOOK('MODE_PRANDTL:D_M3_WTH_W2R_O_DDTDZ',0,ZHOOK_HANDLE)
 IKB=D%NKTB
 IKE=D%NKTE
@@ -1315,7 +1299,7 @@ IKT=D%NKT
 CALL MZM_PHY(D,PTKE,ZWORK1)
 !$mnh_expand_array(JIJ=IIJB:IIJE,JK=1:IKT)
 PD_M3_WTH_W2R_O_DDTDZ(:,:) = &
-- CSTURB%XCSHF*PKEFF(:,:)*0.75*CSTURB%XCTV*PBLL_O_E(:,:) &
+- TURBN%XCSHF*PKEFF(:,:)*0.75*TURBN%XCTV*PBLL_O_E(:,:) &
                                /ZWORK1(:,:)*PEMOIST(:,:)/PD(:,:) &
                                      * (1. -  PREDTH1(:,:)*(1.5+PREDTH1(:,:)& 
                                      +PREDR1(:,:))/PD(:,:))
@@ -1327,9 +1311,10 @@ PD_M3_WTH_W2R_O_DDTDZ(:,IKE+1)=PD_M3_WTH_W2R_O_DDTDZ(:,IKE)
 IF (LHOOK) CALL DR_HOOK('MODE_PRANDTL:D_M3_WTH_W2R_O_DDTDZ',1,ZHOOK_HANDLE)
 END SUBROUTINE D_M3_WTH_W2R_O_DDTDZ
 !----------------------------------------------------------------------------
-SUBROUTINE M3_WTH_WR2(D,CSTURB,PD,PKEFF,PTKE,PSQRT_TKE,PBLL_O_E,PBETA,PLEPS,PEMOIST,PDTDZ,PM3_WTH_WR2)
+SUBROUTINE M3_WTH_WR2(D,CSTURB,TURBN,PD,PKEFF,PTKE,PSQRT_TKE,PBLL_O_E,PBETA,PLEPS,PEMOIST,PDTDZ,PM3_WTH_WR2)
   TYPE(DIMPHYEX_t),                   INTENT(IN) :: D
   TYPE(CSTURB_t),                     INTENT(IN) :: CSTURB
+  TYPE(TURB_t),                    INTENT(IN)    :: TURBN
   REAL, DIMENSION(D%NIJT,D%NKT), INTENT(IN) :: PD
   REAL, DIMENSION(D%NIJT,D%NKT), INTENT(IN) :: PKEFF
   REAL, DIMENSION(D%NIJT,D%NKT), INTENT(IN) :: PTKE
@@ -1343,7 +1328,7 @@ SUBROUTINE M3_WTH_WR2(D,CSTURB,PD,PKEFF,PTKE,PSQRT_TKE,PBLL_O_E,PBETA,PLEPS,PEMO
   REAL, DIMENSION(D%NIJT,D%NKT) :: ZWORK1,ZWORK2 ! working array
   INTEGER :: IKB, IKE, JIJ,JK,IIJB,IIJE,IKT
 !
-REAL(KIND=JPRB) :: ZHOOK_HANDLE
+REAL(KIND=JPHOOK) :: ZHOOK_HANDLE
 IF (LHOOK) CALL DR_HOOK('MODE_PRANDTL:M3_WTH_WR2',0,ZHOOK_HANDLE)
 IKB=D%NKTB
 IKE=D%NKTE
@@ -1357,8 +1342,8 @@ ZWORK1(:,:) = PBETA(:,:)*PLEPS(:,:) &
 !$mnh_end_expand_array(JIJ=IIJB:IIJE,JK=1:IKT)
 CALL MZM_PHY(D,ZWORK1,ZWORK2)
 !$mnh_expand_array(JIJ=IIJB:IIJE,JK=1:IKT)
-PM3_WTH_WR2(:,:) = - CSTURB%XCSHF*PKEFF(:,:)& 
-                           *0.25*PBLL_O_E(:,:)*CSTURB%XCTV*PEMOIST(:,:)**2 &
+PM3_WTH_WR2(:,:) = - TURBN%XCSHF*PKEFF(:,:)& 
+                           *0.25*PBLL_O_E(:,:)*TURBN%XCTV*PEMOIST(:,:)**2 &
                            *ZWORK2(:,:)/CSTURB%XCTD*PDTDZ(:,:)/PD(:,:)
 !$mnh_end_expand_array(JIJ=IIJB:IIJE,JK=1:IKT)
 !
@@ -1368,9 +1353,11 @@ PM3_WTH_WR2(:,IKE+1)=PM3_WTH_WR2(:,IKE)
 IF (LHOOK) CALL DR_HOOK('MODE_PRANDTL:M3_WTH_WR2',1,ZHOOK_HANDLE)
 END SUBROUTINE M3_WTH_WR2
 !----------------------------------------------------------------------------
-SUBROUTINE D_M3_WTH_WR2_O_DDTDZ(D,CSTURB,PREDTH1,PREDR1,PD,PKEFF,PTKE,PSQRT_TKE,PBLL_O_E,PBETA,PLEPS,PEMOIST,PD_M3_WTH_WR2_O_DDTDZ)
+SUBROUTINE D_M3_WTH_WR2_O_DDTDZ(D,CSTURB,TURBN,PREDTH1,PREDR1,PD,PKEFF,PTKE,PSQRT_TKE,PBLL_O_E,&
+                               &PBETA,PLEPS,PEMOIST,PD_M3_WTH_WR2_O_DDTDZ)
   TYPE(DIMPHYEX_t),                   INTENT(IN) :: D
   TYPE(CSTURB_t),                     INTENT(IN) :: CSTURB
+  TYPE(TURB_t),                    INTENT(IN)    :: TURBN
   REAL, DIMENSION(D%NIJT,D%NKT), INTENT(IN) :: PREDTH1
   REAL, DIMENSION(D%NIJT,D%NKT), INTENT(IN) :: PREDR1
   REAL, DIMENSION(D%NIJT,D%NKT), INTENT(IN) :: PD
@@ -1385,7 +1372,7 @@ SUBROUTINE D_M3_WTH_WR2_O_DDTDZ(D,CSTURB,PREDTH1,PREDR1,PD,PKEFF,PTKE,PSQRT_TKE,
   REAL, DIMENSION(D%NIJT,D%NKT) :: ZWORK1,ZWORK2 ! working array
   INTEGER :: IKB, IKE, JIJ,JK,IIJB,IIJE,IKT
 !
-REAL(KIND=JPRB) :: ZHOOK_HANDLE
+REAL(KIND=JPHOOK) :: ZHOOK_HANDLE
 IF (LHOOK) CALL DR_HOOK('MODE_PRANDTL:D_M3_WTH_WR2_O_DDTDZ',0,ZHOOK_HANDLE)
 IKB=D%NKTB
 IKE=D%NKTE
@@ -1399,8 +1386,8 @@ ZWORK1(:,:) = PBETA(:,:)*PLEPS(:,:)&
 !$mnh_end_expand_array(JIJ=IIJB:IIJE,JK=1:IKT)
 CALL MZM_PHY(D,ZWORK1,ZWORK2)
 !$mnh_expand_array(JIJ=IIJB:IIJE,JK=1:IKT)
-PD_M3_WTH_WR2_O_DDTDZ(:,:) = - CSTURB%XCSHF*PKEFF(:,:)& 
-                           *0.25*PBLL_O_E(:,:)*CSTURB%XCTV*PEMOIST(:,:)**2 &
+PD_M3_WTH_WR2_O_DDTDZ(:,:) = - TURBN%XCSHF*PKEFF(:,:)& 
+                           *0.25*PBLL_O_E(:,:)*TURBN%XCTV*PEMOIST(:,:)**2 &
                            *ZWORK2(:,:)/CSTURB%XCTD/PD(:,:)     &
                            * (1. -  PREDTH1(:,:)* &
                            (1.5+PREDTH1(:,:)+PREDR1(:,:))/PD(:,:))
@@ -1412,9 +1399,10 @@ PD_M3_WTH_WR2_O_DDTDZ(:,IKE+1)=PD_M3_WTH_WR2_O_DDTDZ(:,IKE)
 IF (LHOOK) CALL DR_HOOK('MODE_PRANDTL:D_M3_WTH_WR2_O_DDTDZ',1,ZHOOK_HANDLE)
 END SUBROUTINE D_M3_WTH_WR2_O_DDTDZ
 !----------------------------------------------------------------------------
-SUBROUTINE M3_WTH_WTHR(D,CSTURB,PREDR1,PD,PKEFF,PTKE,PSQRT_TKE,PBETA,PLEPS,PEMOIST,PM3_WTH_WTHR)
+SUBROUTINE M3_WTH_WTHR(D,CSTURB,TURBN,PREDR1,PD,PKEFF,PTKE,PSQRT_TKE,PBETA,PLEPS,PEMOIST,PM3_WTH_WTHR)
   TYPE(DIMPHYEX_t),                   INTENT(IN) :: D
   TYPE(CSTURB_t),                     INTENT(IN) :: CSTURB
+  TYPE(TURB_t),                    INTENT(IN)    :: TURBN
   REAL, DIMENSION(D%NIJT,D%NKT), INTENT(IN) :: PREDR1
   REAL, DIMENSION(D%NIJT,D%NKT), INTENT(IN) :: PD
   REAL, DIMENSION(D%NIJT,D%NKT), INTENT(IN) :: PKEFF
@@ -1427,7 +1415,7 @@ SUBROUTINE M3_WTH_WTHR(D,CSTURB,PREDR1,PD,PKEFF,PTKE,PSQRT_TKE,PBETA,PLEPS,PEMOI
   REAL, DIMENSION(D%NIJT,D%NKT) :: ZWORK1,ZWORK2 ! working array
   INTEGER :: IKB, IKE, JIJ,JK,IIJB,IIJE,IKT
 !
-REAL(KIND=JPRB) :: ZHOOK_HANDLE
+REAL(KIND=JPHOOK) :: ZHOOK_HANDLE
 IF (LHOOK) CALL DR_HOOK('MODE_PRANDTL:M3_WTH_WTHR',0,ZHOOK_HANDLE)
 IKB=D%NKTB
 IKE=D%NKTE
@@ -1442,7 +1430,7 @@ ZWORK1(:,:) = PBETA(:,:)*PLEPS(:,:)&
 CALL MZM_PHY(D,ZWORK1,ZWORK2)
 !$mnh_expand_array(JIJ=IIJB:IIJE,JK=1:IKT)
 PM3_WTH_WTHR(:,:) = &
-                   CSTURB%XCSHF*PKEFF(:,:)*PEMOIST(:,:)*ZWORK2(:,:) &
+                   TURBN%XCSHF*PKEFF(:,:)*PEMOIST(:,:)*ZWORK2(:,:) &
                    *0.5*PLEPS(:,:)/CSTURB%XCTD*(1+PREDR1(:,:))/PD(:,:)
 !$mnh_end_expand_array(JIJ=IIJB:IIJE,JK=1:IKT)
 !
@@ -1452,9 +1440,10 @@ PM3_WTH_WTHR(:,IKE+1)=PM3_WTH_WTHR(:,IKE)
 IF (LHOOK) CALL DR_HOOK('MODE_PRANDTL:M3_WTH_WTHR',1,ZHOOK_HANDLE)
 END SUBROUTINE M3_WTH_WTHR
 !----------------------------------------------------------------------------
-SUBROUTINE D_M3_WTH_WTHR_O_DDTDZ(D,CSTURB,PM3_WTH_WTHR,PREDTH1,PREDR1,PD,PBLL_O_E,PETHETA,PD_M3_WTH_WTHR_O_DDTDZ)
+SUBROUTINE D_M3_WTH_WTHR_O_DDTDZ(D,CSTURB,TURBN,PM3_WTH_WTHR,PREDTH1,PREDR1,PD,PBLL_O_E,PETHETA,PD_M3_WTH_WTHR_O_DDTDZ)
   TYPE(DIMPHYEX_t),                   INTENT(IN) :: D
   TYPE(CSTURB_t),                     INTENT(IN) :: CSTURB
+  TYPE(TURB_t),                    INTENT(IN)    :: TURBN
   REAL, DIMENSION(D%NIJT,D%NKT), INTENT(IN) :: PM3_WTH_WTHR
   REAL, DIMENSION(D%NIJT,D%NKT), INTENT(IN) :: PREDTH1
   REAL, DIMENSION(D%NIJT,D%NKT), INTENT(IN) :: PREDR1
@@ -1464,7 +1453,7 @@ SUBROUTINE D_M3_WTH_WTHR_O_DDTDZ(D,CSTURB,PM3_WTH_WTHR,PREDTH1,PREDR1,PD,PBLL_O_
   REAL, DIMENSION(D%NIJT,D%NKT),INTENT(OUT) :: PD_M3_WTH_WTHR_O_DDTDZ
   INTEGER :: IKB, IKE, JIJ,JK,IIJB,IIJE,IKT
 !
-REAL(KIND=JPRB) :: ZHOOK_HANDLE
+REAL(KIND=JPHOOK) :: ZHOOK_HANDLE
 IF (LHOOK) CALL DR_HOOK('MODE_PRANDTL:D_M3_WTH_WTHR_O_DDTDZ',0,ZHOOK_HANDLE)
 IKB=D%NKTB
 IKE=D%NKTE
@@ -1475,7 +1464,7 @@ IKT=D%NKT
 !$mnh_expand_array(JIJ=IIJB:IIJE,JK=1:IKT)
 PD_M3_WTH_WTHR_O_DDTDZ(:,:) = &
                 - PM3_WTH_WTHR(:,:) * (1.5+PREDTH1(:,:)+PREDR1(:,:))&
-                /PD(:,:)*CSTURB%XCTV*PBLL_O_E(:,:)*PETHETA(:,:)
+                /PD(:,:)*TURBN%XCTV*PBLL_O_E(:,:)*PETHETA(:,:)
 !$mnh_end_expand_array(JIJ=IIJB:IIJE,JK=1:IKT)
 !
 PD_M3_WTH_WTHR_O_DDTDZ(:,IKB-1)=PD_M3_WTH_WTHR_O_DDTDZ(:,IKB)
@@ -1484,9 +1473,10 @@ PD_M3_WTH_WTHR_O_DDTDZ(:,IKE+1)=PD_M3_WTH_WTHR_O_DDTDZ(:,IKE)
 IF (LHOOK) CALL DR_HOOK('MODE_PRANDTL:D_M3_WTH_WTHR_O_DDTDZ',1,ZHOOK_HANDLE)
 END SUBROUTINE D_M3_WTH_WTHR_O_DDTDZ
 !----------------------------------------------------------------------------
-SUBROUTINE M3_TH2_W2TH(D,CSTURB,PREDTH1,PREDR1,PD,PDTDZ,PLM,PLEPS,PTKE,PM3_TH2_W2TH)
+SUBROUTINE M3_TH2_W2TH(D,CSTURB,TURBN,PREDTH1,PREDR1,PD,PDTDZ,PLM,PLEPS,PTKE,PM3_TH2_W2TH)
   TYPE(DIMPHYEX_t),                   INTENT(IN) :: D
   TYPE(CSTURB_t),                     INTENT(IN) :: CSTURB
+  TYPE(TURB_t),                    INTENT(IN)    :: TURBN
   REAL, DIMENSION(D%NIJT,D%NKT), INTENT(IN) :: PREDTH1
   REAL, DIMENSION(D%NIJT,D%NKT), INTENT(IN) :: PREDR1
   REAL, DIMENSION(D%NIJT,D%NKT), INTENT(IN) :: PD
@@ -1498,7 +1488,7 @@ SUBROUTINE M3_TH2_W2TH(D,CSTURB,PREDTH1,PREDR1,PD,PDTDZ,PLM,PLEPS,PTKE,PM3_TH2_W
   REAL, DIMENSION(D%NIJT,D%NKT) :: ZWORK1,ZWORK2 ! working array
   INTEGER :: IKB, IKE, JIJ,JK,IIJB,IIJE,IKT
 !
-REAL(KIND=JPRB) :: ZHOOK_HANDLE
+REAL(KIND=JPHOOK) :: ZHOOK_HANDLE
 IF (LHOOK) CALL DR_HOOK('MODE_PRANDTL:M3_TH2_W2TH',0,ZHOOK_HANDLE)
 IKB=D%NKTB
 IKE=D%NKTE
@@ -1513,7 +1503,7 @@ ZWORK1(:,:) = (1.-0.5*PREDR1(:,:)*(1.+PREDR1(:,:))&
 CALL MZF_PHY(D,ZWORK1,ZWORK2)
 !$mnh_expand_array(JIJ=IIJB:IIJE,JK=1:IKT)
 PM3_TH2_W2TH(:,:) = - ZWORK2(:,:) &
-                       * 1.5*PLM(:,:)*PLEPS(:,:)/PTKE(:,:)*CSTURB%XCTV
+                       * 1.5*PLM(:,:)*PLEPS(:,:)/PTKE(:,:)*TURBN%XCTV
 !$mnh_end_expand_array(JIJ=IIJB:IIJE,JK=1:IKT)
 !
 PM3_TH2_W2TH(:,IKB-1)=PM3_TH2_W2TH(:,IKB)
@@ -1522,9 +1512,10 @@ PM3_TH2_W2TH(:,IKE+1)=PM3_TH2_W2TH(:,IKE)
 IF (LHOOK) CALL DR_HOOK('MODE_PRANDTL:M3_TH2_W2TH',1,ZHOOK_HANDLE)
 END SUBROUTINE M3_TH2_W2TH
 !----------------------------------------------------------------------------
-SUBROUTINE D_M3_TH2_W2TH_O_DDTDZ(D,CSTURB,PREDTH1,PREDR1,PD,PLM,PLEPS,PTKE,OUSERV,PD_M3_TH2_W2TH_O_DDTDZ)
+SUBROUTINE D_M3_TH2_W2TH_O_DDTDZ(D,CSTURB,TURBN,PREDTH1,PREDR1,PD,PLM,PLEPS,PTKE,OUSERV,PD_M3_TH2_W2TH_O_DDTDZ)
   TYPE(DIMPHYEX_t),                   INTENT(IN) :: D
   TYPE(CSTURB_t),                     INTENT(IN) :: CSTURB
+  TYPE(TURB_t),                    INTENT(IN)    :: TURBN
   REAL, DIMENSION(D%NIJT,D%NKT), INTENT(IN) :: PREDTH1
   REAL, DIMENSION(D%NIJT,D%NKT), INTENT(IN) :: PREDR1
   REAL, DIMENSION(D%NIJT,D%NKT), INTENT(IN) :: PD
@@ -1536,7 +1527,7 @@ SUBROUTINE D_M3_TH2_W2TH_O_DDTDZ(D,CSTURB,PREDTH1,PREDR1,PD,PLM,PLEPS,PTKE,OUSER
   REAL, DIMENSION(D%NIJT,D%NKT) :: ZWORK1,ZWORK2 ! working array
   INTEGER :: IKB, IKE, JIJ,JK,IIJB,IIJE,IKT
 !
-REAL(KIND=JPRB) :: ZHOOK_HANDLE
+REAL(KIND=JPHOOK) :: ZHOOK_HANDLE
 IF (LHOOK) CALL DR_HOOK('MODE_PRANDTL:D_M3_TH2_W2TH_O_DDTDZ',0,ZHOOK_HANDLE)
 IKB=D%NKTB
 IKE=D%NKTE
@@ -1545,7 +1536,7 @@ IIJB=D%NIJB
 IKT=D%NKT
 !
 IF (OUSERV) THEN
-!  D_M3_TH2_W2TH_O_DDTDZ(:,:) = - 1.5*PLM*PLEPS/PTKE*CSTURB%XCTV * MZF(                    &
+!  D_M3_TH2_W2TH_O_DDTDZ(:,:) = - 1.5*PLM*PLEPS/PTKE*TURBN%XCTV * MZF(                    &
 !          (1.-0.5*PREDR1*(1.+PREDR1)/PD)*(1.-(1.5+PREDTH1+PREDR1)*(1.+PREDTH1)/PD )  &
 !        / (1.+PREDTH1)**2, IKA, IKU, IKL)
   !$mnh_expand_array(JIJ=IIJB:IIJE,JK=1:IKT)
@@ -1557,7 +1548,7 @@ IF (OUSERV) THEN
   CALL MZF_PHY(D,ZWORK1,ZWORK2)
   !$mnh_expand_array(JIJ=IIJB:IIJE,JK=1:IKT)
   PD_M3_TH2_W2TH_O_DDTDZ(:,:) = - 1.5*PLM(:,:)*PLEPS(:,:) &
-                                                   /PTKE(:,:)*CSTURB%XCTV * ZWORK2(:,:)
+                                                   /PTKE(:,:)*TURBN%XCTV * ZWORK2(:,:)
   !$mnh_end_expand_array(JIJ=IIJB:IIJE,JK=1:IKT)
 ELSE
   !$mnh_expand_array(JIJ=IIJB:IIJE,JK=1:IKT)
@@ -1566,7 +1557,7 @@ ELSE
   CALL MZF_PHY(D,ZWORK1,ZWORK2)
   !$mnh_expand_array(JIJ=IIJB:IIJE,JK=1:IKT)
   PD_M3_TH2_W2TH_O_DDTDZ(:,:) = - 1.5*PLM(:,:)*PLEPS(:,:) & 
-                                                   /PTKE(:,:)*CSTURB%XCTV * ZWORK2(:,:)
+                                                   /PTKE(:,:)*TURBN%XCTV * ZWORK2(:,:)
   !$mnh_end_expand_array(JIJ=IIJB:IIJE,JK=1:IKT)
 END IF
 !
@@ -1576,9 +1567,10 @@ PD_M3_TH2_W2TH_O_DDTDZ(:,IKE+1)=PD_M3_TH2_W2TH_O_DDTDZ(:,IKE)
 IF (LHOOK) CALL DR_HOOK('MODE_PRANDTL:D_M3_TH2_W2TH_O_DDTDZ',1,ZHOOK_HANDLE)
 END SUBROUTINE D_M3_TH2_W2TH_O_DDTDZ
 !----------------------------------------------------------------------------
-SUBROUTINE M3_TH2_WTH2(D,CSTURB,PREDTH1,PREDR1,PD,PLEPS,PSQRT_TKE,PM3_TH2_WTH2)
+SUBROUTINE M3_TH2_WTH2(D,CSTURB,TURBN,PREDTH1,PREDR1,PD,PLEPS,PSQRT_TKE,PM3_TH2_WTH2)
   TYPE(DIMPHYEX_t),                   INTENT(IN) :: D
   TYPE(CSTURB_t),                     INTENT(IN) :: CSTURB
+  TYPE(TURB_t),                    INTENT(IN)    :: TURBN
   REAL, DIMENSION(D%NIJT,D%NKT), INTENT(IN) :: PREDTH1
   REAL, DIMENSION(D%NIJT,D%NKT), INTENT(IN) :: PREDR1
   REAL, DIMENSION(D%NIJT,D%NKT), INTENT(IN) :: PD
@@ -1588,7 +1580,7 @@ SUBROUTINE M3_TH2_WTH2(D,CSTURB,PREDTH1,PREDR1,PD,PLEPS,PSQRT_TKE,PM3_TH2_WTH2)
   REAL, DIMENSION(D%NIJT,D%NKT) :: ZWORK1,ZWORK2 ! working array
   INTEGER :: IKB, IKE, JIJ,JK,IIJB,IIJE,IKT
 !
-REAL(KIND=JPRB) :: ZHOOK_HANDLE
+REAL(KIND=JPHOOK) :: ZHOOK_HANDLE
 IF (LHOOK) CALL DR_HOOK('MODE_PRANDTL:M3_TH2_WTH2',0,ZHOOK_HANDLE)
 IKB=D%NKTB
 IKE=D%NKTE
@@ -1612,9 +1604,10 @@ PM3_TH2_WTH2(:,IKE+1)=PM3_TH2_WTH2(:,IKE)
 IF (LHOOK) CALL DR_HOOK('MODE_PRANDTL:M3_TH2_WTH2',1,ZHOOK_HANDLE)
 END SUBROUTINE M3_TH2_WTH2
 !----------------------------------------------------------------------------
-SUBROUTINE D_M3_TH2_WTH2_O_DDTDZ(D,CSTURB,PREDTH1,PREDR1,PD,PLEPS,PSQRT_TKE,PBLL_O_E,PETHETA,PD_M3_TH2_WTH2_O_DDTDZ)
+SUBROUTINE D_M3_TH2_WTH2_O_DDTDZ(D,CSTURB,TURBN,PREDTH1,PREDR1,PD,PLEPS,PSQRT_TKE,PBLL_O_E,PETHETA,PD_M3_TH2_WTH2_O_DDTDZ)
   TYPE(DIMPHYEX_t),                   INTENT(IN) :: D
   TYPE(CSTURB_t),                     INTENT(IN) :: CSTURB
+  TYPE(TURB_t),                    INTENT(IN)    :: TURBN
   REAL, DIMENSION(D%NIJT,D%NKT), INTENT(IN) :: PREDTH1
   REAL, DIMENSION(D%NIJT,D%NKT), INTENT(IN) :: PREDR1
   REAL, DIMENSION(D%NIJT,D%NKT), INTENT(IN) :: PD
@@ -1626,7 +1619,7 @@ SUBROUTINE D_M3_TH2_WTH2_O_DDTDZ(D,CSTURB,PREDTH1,PREDR1,PD,PLEPS,PSQRT_TKE,PBLL
   REAL, DIMENSION(D%NIJT,D%NKT) :: ZWORK1,ZWORK2 ! working array
   INTEGER :: IKB, IKE, JIJ,JK,IIJB,IIJE,IKT
 !
-REAL(KIND=JPRB) :: ZHOOK_HANDLE
+REAL(KIND=JPHOOK) :: ZHOOK_HANDLE
 IF (LHOOK) CALL DR_HOOK('MODE_PRANDTL:D_M3_TH2_WTH2_O_DDTDZ',0,ZHOOK_HANDLE)
 IKB=D%NKTB
 IKE=D%NKTE
@@ -1643,7 +1636,7 @@ ZWORK1(:,:) = PBLL_O_E(:,:)*PETHETA(:,:) &
 CALL MZF_PHY(D,ZWORK1,ZWORK2)
 !$mnh_expand_array(JIJ=IIJB:IIJE,JK=1:IKT)
 PD_M3_TH2_WTH2_O_DDTDZ(:,:) = PLEPS(:,:) & 
-                                 *0.5/CSTURB%XCTD/PSQRT_TKE(:,:)*CSTURB%XCTV * ZWORK2(:,:)
+                                 *0.5/CSTURB%XCTD/PSQRT_TKE(:,:)*TURBN%XCTV * ZWORK2(:,:)
 !$mnh_end_expand_array(JIJ=IIJB:IIJE,JK=1:IKT)
 !
 PD_M3_TH2_WTH2_O_DDTDZ(:,IKB-1)=PD_M3_TH2_WTH2_O_DDTDZ(:,IKB)
@@ -1652,9 +1645,10 @@ PD_M3_TH2_WTH2_O_DDTDZ(:,IKE+1)=PD_M3_TH2_WTH2_O_DDTDZ(:,IKE)
 IF (LHOOK) CALL DR_HOOK('MODE_PRANDTL:D_M3_TH2_WTH2_O_DDTDZ',1,ZHOOK_HANDLE)
 END SUBROUTINE D_M3_TH2_WTH2_O_DDTDZ
 !----------------------------------------------------------------------------
-SUBROUTINE M3_TH2_W2R(D,CSTURB,PD,PLM,PLEPS,PTKE,PBLL_O_E,PEMOIST,PDTDZ,PM3_TH2_W2R)
+SUBROUTINE M3_TH2_W2R(D,CSTURB,TURBN,PD,PLM,PLEPS,PTKE,PBLL_O_E,PEMOIST,PDTDZ,PM3_TH2_W2R)
   TYPE(DIMPHYEX_t),                   INTENT(IN) :: D
   TYPE(CSTURB_t),                     INTENT(IN) :: CSTURB
+  TYPE(TURB_t),                    INTENT(IN)    :: TURBN
   REAL, DIMENSION(D%NIJT,D%NKT), INTENT(IN) :: PD
   REAL, DIMENSION(D%NIJT,D%NKT), INTENT(IN) :: PLM
   REAL, DIMENSION(D%NIJT,D%NKT), INTENT(IN) :: PLEPS
@@ -1666,7 +1660,7 @@ SUBROUTINE M3_TH2_W2R(D,CSTURB,PD,PLM,PLEPS,PTKE,PBLL_O_E,PEMOIST,PDTDZ,PM3_TH2_
   REAL, DIMENSION(D%NIJT,D%NKT) :: ZWORK1,ZWORK2 ! working array
   INTEGER :: IKB, IKE, JIJ,JK,IIJB,IIJE,IKT
 !
-REAL(KIND=JPRB) :: ZHOOK_HANDLE
+REAL(KIND=JPHOOK) :: ZHOOK_HANDLE
 IF (LHOOK) CALL DR_HOOK('MODE_PRANDTL:M3_TH2_W2R',0,ZHOOK_HANDLE)
 IKB=D%NKTB
 IKE=D%NKTE
@@ -1680,7 +1674,7 @@ ZWORK1(:,:) = PBLL_O_E(:,:)*PEMOIST(:,:) &
 !$mnh_end_expand_array(JIJ=IIJB:IIJE,JK=1:IKT)
 CALL MZF_PHY(D,ZWORK1,ZWORK2)
 !$mnh_expand_array(JIJ=IIJB:IIJE,JK=1:IKT)
-PM3_TH2_W2R(:,:) = 0.75*CSTURB%XCTV**2*ZWORK2(:,:) &
+PM3_TH2_W2R(:,:) = 0.75*TURBN%XCTV**2*ZWORK2(:,:) &
                     *PLM(:,:)*PLEPS(:,:)/PTKE(:,:)
 !$mnh_end_expand_array(JIJ=IIJB:IIJE,JK=1:IKT)
 !
@@ -1690,9 +1684,10 @@ PM3_TH2_W2R(:,IKE+1)=PM3_TH2_W2R(:,IKE)
 IF (LHOOK) CALL DR_HOOK('MODE_PRANDTL:M3_TH2_W2R',1,ZHOOK_HANDLE)
 END SUBROUTINE M3_TH2_W2R
 !----------------------------------------------------------------------------
-SUBROUTINE D_M3_TH2_W2R_O_DDTDZ(D,CSTURB,PREDTH1,PREDR1,PD,PLM,PLEPS,PTKE,PBLL_O_E,PEMOIST,PDTDZ,PD_M3_TH2_W2R_O_DDTDZ)
+SUBROUTINE D_M3_TH2_W2R_O_DDTDZ(D,CSTURB,TURBN,PREDTH1,PREDR1,PD,PLM,PLEPS,PTKE,PBLL_O_E,PEMOIST,PDTDZ,PD_M3_TH2_W2R_O_DDTDZ)
   TYPE(DIMPHYEX_t),                   INTENT(IN) :: D
   TYPE(CSTURB_t),                     INTENT(IN) :: CSTURB
+  TYPE(TURB_t),                    INTENT(IN)    :: TURBN
   REAL, DIMENSION(D%NIJT,D%NKT), INTENT(IN) :: PREDTH1
   REAL, DIMENSION(D%NIJT,D%NKT), INTENT(IN) :: PREDR1
   REAL, DIMENSION(D%NIJT,D%NKT), INTENT(IN) :: PD
@@ -1706,7 +1701,7 @@ SUBROUTINE D_M3_TH2_W2R_O_DDTDZ(D,CSTURB,PREDTH1,PREDR1,PD,PLM,PLEPS,PTKE,PBLL_O
   REAL, DIMENSION(D%NIJT,D%NKT) :: ZWORK1,ZWORK2 ! working array
   INTEGER :: IKB, IKE, JIJ,JK,IIJB,IIJE,IKT
 !
-REAL(KIND=JPRB) :: ZHOOK_HANDLE
+REAL(KIND=JPHOOK) :: ZHOOK_HANDLE
 IF (LHOOK) CALL DR_HOOK('MODE_PRANDTL:D_M3_TH2_W2R_O_DDTDZ',0,ZHOOK_HANDLE)
 IKB=D%NKTB
 IKE=D%NKTE
@@ -1721,7 +1716,7 @@ ZWORK1(:,:) =  PBLL_O_E(:,:)*PEMOIST(:,:)&
 !$mnh_end_expand_array(JIJ=IIJB:IIJE,JK=1:IKT)
 CALL MZF_PHY(D,ZWORK1,ZWORK2)
 !$mnh_expand_array(JIJ=IIJB:IIJE,JK=1:IKT)
-PD_M3_TH2_W2R_O_DDTDZ(:,:) = 0.75*CSTURB%XCTV**2*PLM(:,:) *PLEPS(:,:) &
+PD_M3_TH2_W2R_O_DDTDZ(:,:) = 0.75*TURBN%XCTV**2*PLM(:,:) *PLEPS(:,:) &
                                                 /PTKE(:,:) * ZWORK2(:,:)
 !$mnh_end_expand_array(JIJ=IIJB:IIJE,JK=1:IKT)
 !
@@ -1731,9 +1726,10 @@ PD_M3_TH2_W2R_O_DDTDZ(:,IKE+1)=PD_M3_TH2_W2R_O_DDTDZ(:,IKE)
 IF (LHOOK) CALL DR_HOOK('MODE_PRANDTL:D_M3_TH2_W2R_O_DDTDZ',1,ZHOOK_HANDLE)
 END SUBROUTINE D_M3_TH2_W2R_O_DDTDZ
 !----------------------------------------------------------------------------
-SUBROUTINE M3_TH2_WR2(D,CSTURB,PD,PLEPS,PSQRT_TKE,PBLL_O_E,PEMOIST,PDTDZ,PM3_TH2_WR2)
+SUBROUTINE M3_TH2_WR2(D,CSTURB,TURBN,PD,PLEPS,PSQRT_TKE,PBLL_O_E,PEMOIST,PDTDZ,PM3_TH2_WR2)
   TYPE(DIMPHYEX_t),                   INTENT(IN) :: D
   TYPE(CSTURB_t),                     INTENT(IN) :: CSTURB
+  TYPE(TURB_t),                    INTENT(IN)    :: TURBN
   REAL, DIMENSION(D%NIJT,D%NKT), INTENT(IN) :: PD
   REAL, DIMENSION(D%NIJT,D%NKT), INTENT(IN) :: PLEPS
   REAL, DIMENSION(D%NIJT,D%NKT), INTENT(IN) :: PSQRT_TKE
@@ -1744,7 +1740,7 @@ SUBROUTINE M3_TH2_WR2(D,CSTURB,PD,PLEPS,PSQRT_TKE,PBLL_O_E,PEMOIST,PDTDZ,PM3_TH2
   REAL, DIMENSION(D%NIJT,D%NKT) :: ZWORK1,ZWORK2 ! working array
   INTEGER :: IKB, IKE, JIJ,JK,IIJB,IIJE,IKT
 !
-REAL(KIND=JPRB) :: ZHOOK_HANDLE
+REAL(KIND=JPHOOK) :: ZHOOK_HANDLE
 IF (LHOOK) CALL DR_HOOK('MODE_PRANDTL:M3_TH2_WR2',0,ZHOOK_HANDLE)
 IKB=D%NKTB
 IKE=D%NKTE
@@ -1758,7 +1754,7 @@ ZWORK1(:,:) = (PBLL_O_E(:,:)*PEMOIST(:,:)&
 !$mnh_end_expand_array(JIJ=IIJB:IIJE,JK=1:IKT)
 CALL MZF_PHY(D,ZWORK1,ZWORK2)
 !$mnh_expand_array(JIJ=IIJB:IIJE,JK=1:IKT)
-PM3_TH2_WR2(:,:) = 0.25*CSTURB%XCTV**2*ZWORK2(:,:)&
+PM3_TH2_WR2(:,:) = 0.25*TURBN%XCTV**2*ZWORK2(:,:)&
                     *PLEPS(:,:)/PSQRT_TKE(:,:)/CSTURB%XCTD
 !$mnh_end_expand_array(JIJ=IIJB:IIJE,JK=1:IKT)
 !
@@ -1768,9 +1764,10 @@ PM3_TH2_WR2(:,IKE+1)=PM3_TH2_WR2(:,IKE)
 IF (LHOOK) CALL DR_HOOK('MODE_PRANDTL:M3_TH2_WR2',1,ZHOOK_HANDLE)
 END SUBROUTINE M3_TH2_WR2
 !----------------------------------------------------------------------------
-SUBROUTINE D_M3_TH2_WR2_O_DDTDZ(D,CSTURB,PREDTH1,PREDR1,PD,PLEPS,PSQRT_TKE,PBLL_O_E,PEMOIST,PDTDZ,PD_M3_TH2_WR2_O_DDTDZ)
+SUBROUTINE D_M3_TH2_WR2_O_DDTDZ(D,CSTURB,TURBN,PREDTH1,PREDR1,PD,PLEPS,PSQRT_TKE,PBLL_O_E,PEMOIST,PDTDZ,PD_M3_TH2_WR2_O_DDTDZ)
   TYPE(DIMPHYEX_t),                   INTENT(IN) :: D
   TYPE(CSTURB_t),                     INTENT(IN) :: CSTURB
+  TYPE(TURB_t),                    INTENT(IN)    :: TURBN
   REAL, DIMENSION(D%NIJT,D%NKT), INTENT(IN) :: PREDTH1
   REAL, DIMENSION(D%NIJT,D%NKT), INTENT(IN) :: PREDR1
   REAL, DIMENSION(D%NIJT,D%NKT), INTENT(IN) :: PD
@@ -1783,7 +1780,7 @@ SUBROUTINE D_M3_TH2_WR2_O_DDTDZ(D,CSTURB,PREDTH1,PREDR1,PD,PLEPS,PSQRT_TKE,PBLL_
   REAL, DIMENSION(D%NIJT,D%NKT) :: ZWORK1,ZWORK2 ! working array
   INTEGER :: IKB, IKE, JIJ,JK,IIJB,IIJE,IKT
 !
-REAL(KIND=JPRB) :: ZHOOK_HANDLE
+REAL(KIND=JPHOOK) :: ZHOOK_HANDLE
 IF (LHOOK) CALL DR_HOOK('MODE_PRANDTL:D_M3_TH2_WR2_O_DDTDZ',0,ZHOOK_HANDLE)
 IKB=D%NKTB
 IKE=D%NKTE
@@ -1798,7 +1795,7 @@ ZWORK1(:,:) = (PBLL_O_E(:,:)*PEMOIST(:,:))**2 &
 !$mnh_end_expand_array(JIJ=IIJB:IIJE,JK=1:IKT)
 CALL MZF_PHY(D,ZWORK1,ZWORK2)
 !$mnh_expand_array(JIJ=IIJB:IIJE,JK=1:IKT)
-PD_M3_TH2_WR2_O_DDTDZ(:,:) = 0.25*CSTURB%XCTV**2*PLEPS(:,:) & 
+PD_M3_TH2_WR2_O_DDTDZ(:,:) = 0.25*TURBN%XCTV**2*PLEPS(:,:) & 
                                                / PSQRT_TKE(:,:)/CSTURB%XCTD * ZWORK2(:,:)
 !$mnh_end_expand_array(JIJ=IIJB:IIJE,JK=1:IKT)
 !
@@ -1808,9 +1805,10 @@ PD_M3_TH2_WR2_O_DDTDZ(:,IKE+1)=PD_M3_TH2_WR2_O_DDTDZ(:,IKE)
 IF (LHOOK) CALL DR_HOOK('MODE_PRANDTL:D_M3_TH2_WR2_O_DDTDZ',1,ZHOOK_HANDLE)
 END SUBROUTINE D_M3_TH2_WR2_O_DDTDZ
 !----------------------------------------------------------------------------
-SUBROUTINE M3_TH2_WTHR(D,CSTURB,PREDR1,PD,PLEPS,PSQRT_TKE,PBLL_O_E,PEMOIST,PDTDZ,PM3_TH2_WTHR)
+SUBROUTINE M3_TH2_WTHR(D,CSTURB,TURBN,PREDR1,PD,PLEPS,PSQRT_TKE,PBLL_O_E,PEMOIST,PDTDZ,PM3_TH2_WTHR)
   TYPE(DIMPHYEX_t),                   INTENT(IN) :: D
   TYPE(CSTURB_t),                     INTENT(IN) :: CSTURB
+  TYPE(TURB_t),                    INTENT(IN)    :: TURBN
   REAL, DIMENSION(D%NIJT,D%NKT), INTENT(IN) :: PREDR1
   REAL, DIMENSION(D%NIJT,D%NKT), INTENT(IN) :: PD
   REAL, DIMENSION(D%NIJT,D%NKT), INTENT(IN) :: PLEPS
@@ -1822,7 +1820,7 @@ SUBROUTINE M3_TH2_WTHR(D,CSTURB,PREDR1,PD,PLEPS,PSQRT_TKE,PBLL_O_E,PEMOIST,PDTDZ
   REAL, DIMENSION(D%NIJT,D%NKT) :: ZWORK1,ZWORK2 ! working array
   INTEGER :: IKB, IKE, JIJ,JK,IIJB,IIJE,IKT
 !
-REAL(KIND=JPRB) :: ZHOOK_HANDLE
+REAL(KIND=JPHOOK) :: ZHOOK_HANDLE
 IF (LHOOK) CALL DR_HOOK('MODE_PRANDTL:M3_TH2_WTHR',0,ZHOOK_HANDLE)
 IKB=D%NKTB
 IKE=D%NKTE
@@ -1836,7 +1834,7 @@ ZWORK1(:,:) = PBLL_O_E(:,:)*PEMOIST(:,:) &
 !$mnh_end_expand_array(JIJ=IIJB:IIJE,JK=1:IKT)
 CALL MZF_PHY(D,ZWORK1,ZWORK2)
 !$mnh_expand_array(JIJ=IIJB:IIJE,JK=1:IKT)
-PM3_TH2_WTHR(:,:) = - 0.5*CSTURB%XCTV*PLEPS(:,:) & 
+PM3_TH2_WTHR(:,:) = - 0.5*TURBN%XCTV*PLEPS(:,:) & 
                                        / PSQRT_TKE(:,:)/CSTURB%XCTD * ZWORK2(:,:)
 !$mnh_end_expand_array(JIJ=IIJB:IIJE,JK=1:IKT)
 !
@@ -1846,9 +1844,10 @@ PM3_TH2_WTHR(:,IKE+1)=PM3_TH2_WTHR(:,IKE)
 IF (LHOOK) CALL DR_HOOK('MODE_PRANDTL:M3_TH2_WTHR',1,ZHOOK_HANDLE)
 END SUBROUTINE M3_TH2_WTHR
 !----------------------------------------------------------------------------
-SUBROUTINE D_M3_TH2_WTHR_O_DDTDZ(D,CSTURB,PREDTH1,PREDR1,PD,PLEPS,PSQRT_TKE,PBLL_O_E,PEMOIST,PDTDZ,PD_M3_TH2_WTHR_O_DDTDZ)
+SUBROUTINE D_M3_TH2_WTHR_O_DDTDZ(D,CSTURB,TURBN,PREDTH1,PREDR1,PD,PLEPS,PSQRT_TKE,PBLL_O_E,PEMOIST,PDTDZ,PD_M3_TH2_WTHR_O_DDTDZ)
   TYPE(DIMPHYEX_t),                   INTENT(IN) :: D
   TYPE(CSTURB_t),                     INTENT(IN) :: CSTURB
+  TYPE(TURB_t),                    INTENT(IN)    :: TURBN
   REAL, DIMENSION(D%NIJT,D%NKT), INTENT(IN) :: PREDTH1
   REAL, DIMENSION(D%NIJT,D%NKT), INTENT(IN) :: PREDR1
   REAL, DIMENSION(D%NIJT,D%NKT), INTENT(IN) :: PD
@@ -1861,7 +1860,7 @@ SUBROUTINE D_M3_TH2_WTHR_O_DDTDZ(D,CSTURB,PREDTH1,PREDR1,PD,PLEPS,PSQRT_TKE,PBLL
   REAL, DIMENSION(D%NIJT,D%NKT) :: ZWORK1,ZWORK2 ! working array
   INTEGER :: IKB, IKE, JIJ,JK,IIJB,IIJE,IKT
 !
-REAL(KIND=JPRB) :: ZHOOK_HANDLE
+REAL(KIND=JPHOOK) :: ZHOOK_HANDLE
 IF (LHOOK) CALL DR_HOOK('MODE_PRANDTL:D_M3_TH2_WTHR_O_DDTDZ',0,ZHOOK_HANDLE)
 IKB=D%NKTB
 IKE=D%NKTE
@@ -1876,7 +1875,7 @@ ZWORK1(:,:) = PBLL_O_E(:,:)*PEMOIST(:,:)* &
 !$mnh_end_expand_array(JIJ=IIJB:IIJE,JK=1:IKT)
 CALL MZF_PHY(D,ZWORK1,ZWORK2)
 !$mnh_expand_array(JIJ=IIJB:IIJE,JK=1:IKT)
-PD_M3_TH2_WTHR_O_DDTDZ(:,:) = - 0.5*CSTURB%XCTV*PLEPS(:,:) & 
+PD_M3_TH2_WTHR_O_DDTDZ(:,:) = - 0.5*TURBN%XCTV*PLEPS(:,:) & 
                                                 / PSQRT_TKE(:,:)/CSTURB%XCTD * ZWORK2(:,:) 
 !$mnh_end_expand_array(JIJ=IIJB:IIJE,JK=1:IKT)
 !
@@ -1886,9 +1885,10 @@ PD_M3_TH2_WTHR_O_DDTDZ(:,IKE+1)=PD_M3_TH2_WTHR_O_DDTDZ(:,IKE)
 IF (LHOOK) CALL DR_HOOK('MODE_PRANDTL:D_M3_TH2_WTHR_O_DDTDZ',1,ZHOOK_HANDLE)
 END SUBROUTINE D_M3_TH2_WTHR_O_DDTDZ
 !----------------------------------------------------------------------------
-SUBROUTINE M3_THR_WTHR(D,CSTURB,PREDTH1,PREDR1,PD,PLEPS,PSQRT_TKE,PM3_THR_WTHR)
+SUBROUTINE M3_THR_WTHR(D,CSTURB,TURBN,PREDTH1,PREDR1,PD,PLEPS,PSQRT_TKE,PM3_THR_WTHR)
   TYPE(DIMPHYEX_t),                   INTENT(IN) :: D
   TYPE(CSTURB_t),                     INTENT(IN) :: CSTURB
+  TYPE(TURB_t),                    INTENT(IN)    :: TURBN
   REAL, DIMENSION(D%NIJT,D%NKT), INTENT(IN) :: PREDTH1
   REAL, DIMENSION(D%NIJT,D%NKT), INTENT(IN) :: PREDR1
   REAL, DIMENSION(D%NIJT,D%NKT), INTENT(IN) :: PD
@@ -1898,7 +1898,7 @@ SUBROUTINE M3_THR_WTHR(D,CSTURB,PREDTH1,PREDR1,PD,PLEPS,PSQRT_TKE,PM3_THR_WTHR)
   REAL, DIMENSION(D%NIJT,D%NKT) :: ZWORK1,ZWORK2 ! working array
   INTEGER :: IKB, IKE, JIJ,JK,IIJB,IIJE,IKT
 !
-REAL(KIND=JPRB) :: ZHOOK_HANDLE
+REAL(KIND=JPHOOK) :: ZHOOK_HANDLE
 IF (LHOOK) CALL DR_HOOK('MODE_PRANDTL:M3_THR_WTHR',0,ZHOOK_HANDLE)
 IKB=D%NKTB
 IKE=D%NKTE
@@ -1922,9 +1922,10 @@ PM3_THR_WTHR(:,IKE+1)=PM3_THR_WTHR(:,IKE)
 IF (LHOOK) CALL DR_HOOK('MODE_PRANDTL:M3_THR_WTHR',1,ZHOOK_HANDLE)
 END SUBROUTINE M3_THR_WTHR
 !----------------------------------------------------------------------------
-SUBROUTINE D_M3_THR_WTHR_O_DDTDZ(D,CSTURB,PREDTH1,PREDR1,PD,PLEPS,PSQRT_TKE,PBLL_O_E,PETHETA,PD_M3_THR_WTHR_O_DDTDZ)
+SUBROUTINE D_M3_THR_WTHR_O_DDTDZ(D,CSTURB,TURBN,PREDTH1,PREDR1,PD,PLEPS,PSQRT_TKE,PBLL_O_E,PETHETA,PD_M3_THR_WTHR_O_DDTDZ)
   TYPE(DIMPHYEX_t),                   INTENT(IN) :: D
   TYPE(CSTURB_t),                     INTENT(IN) :: CSTURB
+  TYPE(TURB_t),                    INTENT(IN)    :: TURBN
   REAL, DIMENSION(D%NIJT,D%NKT), INTENT(IN) :: PREDTH1
   REAL, DIMENSION(D%NIJT,D%NKT), INTENT(IN) :: PREDR1
   REAL, DIMENSION(D%NIJT,D%NKT), INTENT(IN) :: PD
@@ -1936,7 +1937,7 @@ SUBROUTINE D_M3_THR_WTHR_O_DDTDZ(D,CSTURB,PREDTH1,PREDR1,PD,PLEPS,PSQRT_TKE,PBLL
   REAL, DIMENSION(D%NIJT,D%NKT) :: ZWORK1,ZWORK2 ! working array
   INTEGER :: IKB, IKE, JIJ,JK,IIJB,IIJE,IKT
 !
-REAL(KIND=JPRB) :: ZHOOK_HANDLE
+REAL(KIND=JPHOOK) :: ZHOOK_HANDLE
 IF (LHOOK) CALL DR_HOOK('MODE_PRANDTL:D_M3_THR_WTHR_O_DDTDZ',0,ZHOOK_HANDLE)
 IKB=D%NKTB
 IKE=D%NKTE
@@ -1952,7 +1953,7 @@ ZWORK1(:,:) = PETHETA(:,:)*PBLL_O_E(:,:)/PD(:,:) &
 CALL MZF_PHY(D,ZWORK1,ZWORK2)
 !$mnh_expand_array(JIJ=IIJB:IIJE,JK=1:IKT)
 PD_M3_THR_WTHR_O_DDTDZ(:,:) = 0.5*PLEPS(:,:)/PSQRT_TKE(:,:) & 
-                                                / CSTURB%XCTD * CSTURB%XCTV * ZWORK2(:,:)
+                                                / CSTURB%XCTD * TURBN%XCTV * ZWORK2(:,:)
 !$mnh_end_expand_array(JIJ=IIJB:IIJE,JK=1:IKT)
 !
 PD_M3_THR_WTHR_O_DDTDZ(:,IKB-1)=PD_M3_THR_WTHR_O_DDTDZ(:,IKB)
@@ -1961,9 +1962,10 @@ PD_M3_THR_WTHR_O_DDTDZ(:,IKE+1)=PD_M3_THR_WTHR_O_DDTDZ(:,IKE)
 IF (LHOOK) CALL DR_HOOK('MODE_PRANDTL:D_M3_THR_WTHR_O_DDTDZ',1,ZHOOK_HANDLE)
 END SUBROUTINE D_M3_THR_WTHR_O_DDTDZ
 !----------------------------------------------------------------------------
-SUBROUTINE M3_THR_WTH2(D,CSTURB,PREDR1,PD,PLEPS,PSQRT_TKE,PBLL_O_E,PETHETA,PDRDZ,PM3_THR_WTH2)
+SUBROUTINE M3_THR_WTH2(D,CSTURB,TURBN,PREDR1,PD,PLEPS,PSQRT_TKE,PBLL_O_E,PETHETA,PDRDZ,PM3_THR_WTH2)
   TYPE(DIMPHYEX_t),                   INTENT(IN) :: D
   TYPE(CSTURB_t),                     INTENT(IN) :: CSTURB
+  TYPE(TURB_t),                    INTENT(IN)    :: TURBN
   REAL, DIMENSION(D%NIJT,D%NKT), INTENT(IN) :: PREDR1
   REAL, DIMENSION(D%NIJT,D%NKT), INTENT(IN) :: PD
   REAL, DIMENSION(D%NIJT,D%NKT), INTENT(IN) :: PLEPS
@@ -1975,7 +1977,7 @@ SUBROUTINE M3_THR_WTH2(D,CSTURB,PREDR1,PD,PLEPS,PSQRT_TKE,PBLL_O_E,PETHETA,PDRDZ
   REAL, DIMENSION(D%NIJT,D%NKT) :: ZWORK1,ZWORK2 ! working array
   INTEGER :: IKB, IKE, JIJ,JK,IIJB,IIJE,IKT
 !
-REAL(KIND=JPRB) :: ZHOOK_HANDLE
+REAL(KIND=JPHOOK) :: ZHOOK_HANDLE
 IF (LHOOK) CALL DR_HOOK('MODE_PRANDTL:M3_THR_WTH2',0,ZHOOK_HANDLE)
 IKB=D%NKTB
 IKE=D%NKTE
@@ -1990,7 +1992,7 @@ ZWORK1(:,:) = (1.+PREDR1(:,:))*PBLL_O_E(:,:)* &
 CALL MZF_PHY(D,ZWORK1,ZWORK2)
 !$mnh_expand_array(JIJ=IIJB:IIJE,JK=1:IKT)
 PM3_THR_WTH2(:,:) = - 0.25*PLEPS(:,:) & 
-                                    / PSQRT_TKE(:,:)/CSTURB%XCTD*CSTURB%XCTV * ZWORK2(:,:)
+                                    / PSQRT_TKE(:,:)/CSTURB%XCTD*TURBN%XCTV * ZWORK2(:,:)
 !$mnh_end_expand_array(JIJ=IIJB:IIJE,JK=1:IKT)
 !
 PM3_THR_WTH2(:,IKB-1)=PM3_THR_WTH2(:,IKB)
@@ -1999,9 +2001,10 @@ PM3_THR_WTH2(:,IKE+1)=PM3_THR_WTH2(:,IKE)
 IF (LHOOK) CALL DR_HOOK('MODE_PRANDTL:M3_THR_WTH2',1,ZHOOK_HANDLE)
 END SUBROUTINE M3_THR_WTH2
 !----------------------------------------------------------------------------
-SUBROUTINE D_M3_THR_WTH2_O_DDTDZ(D,CSTURB,PREDTH1,PREDR1,PD,PLEPS,PSQRT_TKE,PBLL_O_E,PETHETA,PDRDZ,PD_M3_THR_WTH2_O_DDTDZ)
+SUBROUTINE D_M3_THR_WTH2_O_DDTDZ(D,CSTURB,TURBN,PREDTH1,PREDR1,PD,PLEPS,PSQRT_TKE,PBLL_O_E,PETHETA,PDRDZ,PD_M3_THR_WTH2_O_DDTDZ)
   TYPE(DIMPHYEX_t),                   INTENT(IN) :: D
   TYPE(CSTURB_t),                     INTENT(IN) :: CSTURB
+  TYPE(TURB_t),                    INTENT(IN)    :: TURBN
   REAL, DIMENSION(D%NIJT,D%NKT), INTENT(IN) :: PREDTH1
   REAL, DIMENSION(D%NIJT,D%NKT), INTENT(IN) :: PREDR1
   REAL, DIMENSION(D%NIJT,D%NKT), INTENT(IN) :: PD
@@ -2014,7 +2017,7 @@ SUBROUTINE D_M3_THR_WTH2_O_DDTDZ(D,CSTURB,PREDTH1,PREDR1,PD,PLEPS,PSQRT_TKE,PBLL
   REAL, DIMENSION(D%NIJT,D%NKT) :: ZWORK1,ZWORK2 ! working array
   INTEGER :: IKB, IKE, JIJ,JK,IIJB,IIJE,IKT
 !
-REAL(KIND=JPRB) :: ZHOOK_HANDLE
+REAL(KIND=JPHOOK) :: ZHOOK_HANDLE
 IF (LHOOK) CALL DR_HOOK('MODE_PRANDTL:D_M3_THR_WTH2_O_DDTDZ',0,ZHOOK_HANDLE)
 IKB=D%NKTB
 IKE=D%NKTE
@@ -2031,7 +2034,7 @@ ZWORK1(:,:) = -(1.+PREDR1(:,:))*(PBLL_O_E(:,:) &
 CALL MZF_PHY(D,ZWORK1,ZWORK2)
 !$mnh_expand_array(JIJ=IIJB:IIJE,JK=1:IKT)
 PD_M3_THR_WTH2_O_DDTDZ(:,:) = - 0.25*PLEPS(:,:) &
-                                 /PSQRT_TKE(:,:)/CSTURB%XCTD*CSTURB%XCTV**2 * ZWORK2(:,:) 
+                                 /PSQRT_TKE(:,:)/CSTURB%XCTD*TURBN%XCTV**2 * ZWORK2(:,:) 
 !$mnh_end_expand_array(JIJ=IIJB:IIJE,JK=1:IKT)
 !
 PD_M3_THR_WTH2_O_DDTDZ(:,IKB-1)=PD_M3_THR_WTH2_O_DDTDZ(:,IKB)
@@ -2040,9 +2043,10 @@ PD_M3_THR_WTH2_O_DDTDZ(:,IKE+1)=PD_M3_THR_WTH2_O_DDTDZ(:,IKE)
 IF (LHOOK) CALL DR_HOOK('MODE_PRANDTL:D_M3_THR_WTH2_O_DDTDZ',1,ZHOOK_HANDLE)
 END SUBROUTINE D_M3_THR_WTH2_O_DDTDZ
 !----------------------------------------------------------------------------
-SUBROUTINE D_M3_THR_WTH2_O_DDRDZ(D,CSTURB,PREDTH1,PREDR1,PD,PLEPS,PSQRT_TKE,PBLL_O_E,PETHETA,PD_M3_THR_WTH2_O_DDRDZ)
+SUBROUTINE D_M3_THR_WTH2_O_DDRDZ(D,CSTURB,TURBN,PREDTH1,PREDR1,PD,PLEPS,PSQRT_TKE,PBLL_O_E,PETHETA,PD_M3_THR_WTH2_O_DDRDZ)
   TYPE(DIMPHYEX_t),                   INTENT(IN) :: D
   TYPE(CSTURB_t),                     INTENT(IN) :: CSTURB
+  TYPE(TURB_t),                    INTENT(IN)    :: TURBN
   REAL, DIMENSION(D%NIJT,D%NKT), INTENT(IN) :: PREDTH1
   REAL, DIMENSION(D%NIJT,D%NKT), INTENT(IN) :: PREDR1
   REAL, DIMENSION(D%NIJT,D%NKT), INTENT(IN) :: PD
@@ -2054,7 +2058,7 @@ SUBROUTINE D_M3_THR_WTH2_O_DDRDZ(D,CSTURB,PREDTH1,PREDR1,PD,PLEPS,PSQRT_TKE,PBLL
   REAL, DIMENSION(D%NIJT,D%NKT) :: ZWORK1,ZWORK2 ! working array
   INTEGER :: IKB, IKE, JIJ,JK,IIJB,IIJE,IKT
 !
-REAL(KIND=JPRB) :: ZHOOK_HANDLE
+REAL(KIND=JPHOOK) :: ZHOOK_HANDLE
 IF (LHOOK) CALL DR_HOOK('MODE_PRANDTL:D_M3_THR_WTH2_O_DDRDZ',0,ZHOOK_HANDLE)
 IKB=D%NKTB
 IKE=D%NKTE
@@ -2070,7 +2074,7 @@ ZWORK1(:,:) = PBLL_O_E(:,:)*PETHETA(:,:)/PD(:,:)&
 CALL MZF_PHY(D,ZWORK1,ZWORK2)
 !$mnh_expand_array(JIJ=IIJB:IIJE,JK=1:IKT)
 PD_M3_THR_WTH2_O_DDRDZ(:,:) = - 0.25*PLEPS(:,:)/PSQRT_TKE(:,:)& 
-                                                / CSTURB%XCTD*CSTURB%XCTV * ZWORK2(:,:)
+                                                / CSTURB%XCTD*TURBN%XCTV * ZWORK2(:,:)
 !$mnh_end_expand_array(JIJ=IIJB:IIJE,JK=1:IKT)
 !
 PD_M3_THR_WTH2_O_DDRDZ(:,IKB-1)=PD_M3_THR_WTH2_O_DDRDZ(:,IKB)
@@ -2079,9 +2083,10 @@ PD_M3_THR_WTH2_O_DDRDZ(:,IKE+1)=PD_M3_THR_WTH2_O_DDRDZ(:,IKE)
 IF (LHOOK) CALL DR_HOOK('MODE_PRANDTL:D_M3_THR_WTH2_O_DDRDZ',1,ZHOOK_HANDLE)
 END SUBROUTINE D_M3_THR_WTH2_O_DDRDZ
 !----------------------------------------------------------------------------
-SUBROUTINE M3_THR_W2TH(D,CSTURB,PREDR1,PD,PLM,PLEPS,PTKE,PDRDZ,PM3_THR_W2TH)
+SUBROUTINE M3_THR_W2TH(D,CSTURB,TURBN,PREDR1,PD,PLM,PLEPS,PTKE,PDRDZ,PM3_THR_W2TH)
   TYPE(DIMPHYEX_t),                   INTENT(IN) :: D
   TYPE(CSTURB_t),                     INTENT(IN) :: CSTURB
+  TYPE(TURB_t),                    INTENT(IN)    :: TURBN
   REAL, DIMENSION(D%NIJT,D%NKT), INTENT(IN) :: PREDR1
   REAL, DIMENSION(D%NIJT,D%NKT), INTENT(IN) :: PD
   REAL, DIMENSION(D%NIJT,D%NKT), INTENT(IN) :: PLM
@@ -2092,7 +2097,7 @@ SUBROUTINE M3_THR_W2TH(D,CSTURB,PREDR1,PD,PLM,PLEPS,PTKE,PDRDZ,PM3_THR_W2TH)
   REAL, DIMENSION(D%NIJT,D%NKT) :: ZWORK1,ZWORK2 ! working array
   INTEGER :: IKB, IKE, JIJ,JK,IIJB,IIJE,IKT
 !
-REAL(KIND=JPRB) :: ZHOOK_HANDLE
+REAL(KIND=JPHOOK) :: ZHOOK_HANDLE
 IF (LHOOK) CALL DR_HOOK('MODE_PRANDTL:M3_THR_W2TH',0,ZHOOK_HANDLE)
 IKB=D%NKTB
 IKE=D%NKTE
@@ -2106,7 +2111,7 @@ ZWORK1(:,:) = (1.+PREDR1(:,:))*PDRDZ(:,:)/PD(:,:)
 CALL MZF_PHY(D,ZWORK1,ZWORK2)
 !$mnh_expand_array(JIJ=IIJB:IIJE,JK=1:IKT)
 PM3_THR_W2TH(:,:) = - 0.75*PLM(:,:)*PLEPS(:,:)& 
-                                      / PTKE(:,:) * CSTURB%XCTV * ZWORK2(:,:)
+                                      / PTKE(:,:) * TURBN%XCTV * ZWORK2(:,:)
 !$mnh_end_expand_array(JIJ=IIJB:IIJE,JK=1:IKT)
 !
 PM3_THR_W2TH(:,IKB-1)=PM3_THR_W2TH(:,IKB)
@@ -2115,9 +2120,10 @@ PM3_THR_W2TH(:,IKE+1)=PM3_THR_W2TH(:,IKE)
 IF (LHOOK) CALL DR_HOOK('MODE_PRANDTL:M3_THR_W2TH',1,ZHOOK_HANDLE)
 END SUBROUTINE M3_THR_W2TH
 !----------------------------------------------------------------------------
-SUBROUTINE D_M3_THR_W2TH_O_DDTDZ(D,CSTURB,PREDTH1,PREDR1,PD,PLM,PLEPS,PTKE,PBLL_O_E,PDRDZ,PETHETA,PD_M3_THR_W2TH_O_DDTDZ)
+SUBROUTINE D_M3_THR_W2TH_O_DDTDZ(D,CSTURB,TURBN,PREDTH1,PREDR1,PD,PLM,PLEPS,PTKE,PBLL_O_E,PDRDZ,PETHETA,PD_M3_THR_W2TH_O_DDTDZ)
   TYPE(DIMPHYEX_t),                   INTENT(IN) :: D
   TYPE(CSTURB_t),                     INTENT(IN) :: CSTURB
+  TYPE(TURB_t),                    INTENT(IN)    :: TURBN
   REAL, DIMENSION(D%NIJT,D%NKT), INTENT(IN) :: PREDTH1
   REAL, DIMENSION(D%NIJT,D%NKT), INTENT(IN) :: PREDR1
   REAL, DIMENSION(D%NIJT,D%NKT), INTENT(IN) :: PD
@@ -2131,7 +2137,7 @@ SUBROUTINE D_M3_THR_W2TH_O_DDTDZ(D,CSTURB,PREDTH1,PREDR1,PD,PLM,PLEPS,PTKE,PBLL_
   REAL, DIMENSION(D%NIJT,D%NKT) :: ZWORK1,ZWORK2 ! working array
   INTEGER :: IKB, IKE, JIJ,JK,IIJB,IIJE,IKT
 !
-REAL(KIND=JPRB) :: ZHOOK_HANDLE
+REAL(KIND=JPHOOK) :: ZHOOK_HANDLE
 IF (LHOOK) CALL DR_HOOK('MODE_PRANDTL:D_M3_THR_W2TH_O_DDTDZ',0,ZHOOK_HANDLE)
 IKB=D%NKTB
 IKE=D%NKTE
@@ -2147,7 +2153,7 @@ ZWORK1(:,:) =  -PETHETA(:,:)*PBLL_O_E(:,:)*&
 CALL MZF_PHY(D,ZWORK1,ZWORK2)
 !$mnh_expand_array(JIJ=IIJB:IIJE,JK=1:IKT)
 PD_M3_THR_W2TH_O_DDTDZ(:,:) = - 0.75*PLM(:,:)*PLEPS(:,:)&
-                                                / PTKE(:,:) * CSTURB%XCTV**2 * ZWORK1(:,:)
+                                                / PTKE(:,:) * TURBN%XCTV**2 * ZWORK1(:,:)
 !$mnh_end_expand_array(JIJ=IIJB:IIJE,JK=1:IKT)
 !
 PD_M3_THR_W2TH_O_DDTDZ(:,IKB-1)=PD_M3_THR_W2TH_O_DDTDZ(:,IKB)
@@ -2156,9 +2162,10 @@ PD_M3_THR_W2TH_O_DDTDZ(:,IKE+1)=PD_M3_THR_W2TH_O_DDTDZ(:,IKE)
 IF (LHOOK) CALL DR_HOOK('MODE_PRANDTL:D_M3_THR_W2TH_O_DDTDZ',1,ZHOOK_HANDLE)
 END SUBROUTINE D_M3_THR_W2TH_O_DDTDZ
 !----------------------------------------------------------------------------
-SUBROUTINE D_M3_THR_W2TH_O_DDRDZ(D,CSTURB,PREDTH1,PREDR1,PD,PLM,PLEPS,PTKE,PD_M3_THR_W2TH_O_DDRDZ)
+SUBROUTINE D_M3_THR_W2TH_O_DDRDZ(D,CSTURB,TURBN,PREDTH1,PREDR1,PD,PLM,PLEPS,PTKE,PD_M3_THR_W2TH_O_DDRDZ)
   TYPE(DIMPHYEX_t),                   INTENT(IN) :: D
   TYPE(CSTURB_t),                     INTENT(IN) :: CSTURB
+  TYPE(TURB_t),                    INTENT(IN)    :: TURBN
   REAL, DIMENSION(D%NIJT,D%NKT), INTENT(IN) :: PREDTH1
   REAL, DIMENSION(D%NIJT,D%NKT), INTENT(IN) :: PREDR1
   REAL, DIMENSION(D%NIJT,D%NKT), INTENT(IN) :: PD
@@ -2169,7 +2176,7 @@ SUBROUTINE D_M3_THR_W2TH_O_DDRDZ(D,CSTURB,PREDTH1,PREDR1,PD,PLM,PLEPS,PTKE,PD_M3
   REAL, DIMENSION(D%NIJT,D%NKT) :: ZWORK1,ZWORK2 ! working array
   INTEGER :: IKB, IKE, JIJ,JK,IIJB,IIJE,IKT
 !
-REAL(KIND=JPRB) :: ZHOOK_HANDLE
+REAL(KIND=JPHOOK) :: ZHOOK_HANDLE
 IF (LHOOK) CALL DR_HOOK('MODE_PRANDTL:D_M3_THR_W2TH_O_DDRDZ',0,ZHOOK_HANDLE)
 IKB=D%NKTB
 IKE=D%NKTE
@@ -2185,7 +2192,7 @@ ZWORK1(:,:) =  -(1.+PREDR1(:,:))*PREDR1(:,:)&
 CALL MZF_PHY(D,ZWORK1,ZWORK2)
 !$mnh_expand_array(JIJ=IIJB:IIJE,JK=1:IKT)
 PD_M3_THR_W2TH_O_DDRDZ(:,:) = - 0.75*PLM(:,:)*PLEPS(:,:)&
-                                                / PTKE(:,:) * CSTURB%XCTV * ZWORK2(:,:)
+                                                / PTKE(:,:) * TURBN%XCTV * ZWORK2(:,:)
 !$mnh_end_expand_array(JIJ=IIJB:IIJE,JK=1:IKT)
 !
 PD_M3_THR_W2TH_O_DDRDZ(:,IKB-1)=PD_M3_THR_W2TH_O_DDRDZ(:,IKB)
@@ -2197,9 +2204,10 @@ END SUBROUTINE D_M3_THR_W2TH_O_DDRDZ
 !----------------------------------------------------------------------------
 !----------------------------------------------------------------------------
 !
-SUBROUTINE PSI3(D,CSTURB,PREDR1,PREDTH1,PRED2R3,PRED2TH3,PRED2THR3,HTURBDIM,OUSERV,PPSI3)
+SUBROUTINE PSI3(D,CSTURB,TURBN,PREDR1,PREDTH1,PRED2R3,PRED2TH3,PRED2THR3,HTURBDIM,OUSERV,PPSI3)
   TYPE(DIMPHYEX_t),                   INTENT(IN) :: D
   TYPE(CSTURB_t),                     INTENT(IN) :: CSTURB
+  TYPE(TURB_t),                    INTENT(IN)    :: TURBN
   REAL, DIMENSION(D%NIJT,D%NKT), INTENT(IN) :: PREDTH1
   REAL, DIMENSION(D%NIJT,D%NKT), INTENT(IN) :: PREDR1
   REAL, DIMENSION(D%NIJT,D%NKT), INTENT(IN) :: PRED2TH3
@@ -2209,16 +2217,17 @@ SUBROUTINE PSI3(D,CSTURB,PREDR1,PREDTH1,PRED2R3,PRED2TH3,PRED2THR3,HTURBDIM,OUSE
   LOGICAL,                INTENT(IN) :: OUSERV    ! flag to use vapor
   REAL, DIMENSION(D%NIJT,D%NKT),INTENT(OUT) :: PPSI3
 !
-REAL(KIND=JPRB) :: ZHOOK_HANDLE
+REAL(KIND=JPHOOK) :: ZHOOK_HANDLE
 IF (LHOOK) CALL DR_HOOK('MODE_PRANDTL:PSI3',0,ZHOOK_HANDLE)
-CALL PHI3(D,CSTURB,PREDR1,PREDTH1,PRED2R3,PRED2TH3,PRED2THR3,HTURBDIM,OUSERV,PPSI3)
+CALL PHI3(D,CSTURB,TURBN,PREDR1,PREDTH1,PRED2R3,PRED2TH3,PRED2THR3,HTURBDIM,OUSERV,PPSI3)
 !
 IF (LHOOK) CALL DR_HOOK('MODE_PRANDTL:PSI3',1,ZHOOK_HANDLE)
 END SUBROUTINE PSI3
 !----------------------------------------------------------------------------
-SUBROUTINE D_PSI3DRDZ_O_DDRDZ(D,CSTURB,PPSI3,PREDR1,PREDTH1,PRED2R3,PRED2THR3,HTURBDIM,OUSERV,PD_PSI3DRDZ_O_DDRDZ)
+SUBROUTINE D_PSI3DRDZ_O_DDRDZ(D,CSTURB,TURBN,PPSI3,PREDR1,PREDTH1,PRED2R3,PRED2THR3,HTURBDIM,OUSERV,PD_PSI3DRDZ_O_DDRDZ)
   TYPE(DIMPHYEX_t),                   INTENT(IN) :: D
   TYPE(CSTURB_t),                     INTENT(IN) :: CSTURB
+  TYPE(TURB_t),                    INTENT(IN)    :: TURBN
   REAL, DIMENSION(D%NIJT,D%NKT), INTENT(IN) :: PPSI3
   REAL, DIMENSION(D%NIJT,D%NKT), INTENT(IN) :: PREDTH1
   REAL, DIMENSION(D%NIJT,D%NKT), INTENT(IN) :: PREDR1
@@ -2228,18 +2237,19 @@ SUBROUTINE D_PSI3DRDZ_O_DDRDZ(D,CSTURB,PPSI3,PREDR1,PREDTH1,PRED2R3,PRED2THR3,HT
   LOGICAL,                INTENT(IN) :: OUSERV    ! flag to use vapor
   REAL, DIMENSION(D%NIJT,D%NKT),INTENT(OUT) :: PD_PSI3DRDZ_O_DDRDZ
 
-REAL(KIND=JPRB) :: ZHOOK_HANDLE
+REAL(KIND=JPHOOK) :: ZHOOK_HANDLE
 IF (LHOOK) CALL DR_HOOK('MODE_PRANDTL:D_PSI3DRDZ_O_DDRDZ',0,ZHOOK_HANDLE)
-CALL D_PHI3DTDZ_O_DDTDZ(D,CSTURB,PPSI3,PREDR1,PREDTH1,PRED2R3,PRED2THR3,HTURBDIM,OUSERV,PD_PSI3DRDZ_O_DDRDZ)
+CALL D_PHI3DTDZ_O_DDTDZ(D,CSTURB,TURBN,PPSI3,PREDR1,PREDTH1,PRED2R3,PRED2THR3,HTURBDIM,OUSERV,PD_PSI3DRDZ_O_DDRDZ)
 !
 !C'est ok?!
 !
 IF (LHOOK) CALL DR_HOOK('MODE_PRANDTL:D_PSI3DRDZ_O_DDRDZ',1,ZHOOK_HANDLE)
 END SUBROUTINE D_PSI3DRDZ_O_DDRDZ
 !----------------------------------------------------------------------------
-SUBROUTINE D_PSI3DTDZ_O_DDTDZ(D,CSTURB,PPSI3,PREDR1,PREDTH1,PRED2R3,PRED2THR3,HTURBDIM,OUSERV,PD_PSI3DTDZ_O_DDTDZ)
+SUBROUTINE D_PSI3DTDZ_O_DDTDZ(D,CSTURB,TURBN,PPSI3,PREDR1,PREDTH1,PRED2R3,PRED2THR3,HTURBDIM,OUSERV,PD_PSI3DTDZ_O_DDTDZ)
   TYPE(DIMPHYEX_t),                   INTENT(IN) :: D
   TYPE(CSTURB_t),                     INTENT(IN) :: CSTURB
+  TYPE(TURB_t),                    INTENT(IN)    :: TURBN
   REAL, DIMENSION(D%NIJT,D%NKT), INTENT(IN) :: PPSI3
   REAL, DIMENSION(D%NIJT,D%NKT), INTENT(IN) :: PREDTH1
   REAL, DIMENSION(D%NIJT,D%NKT), INTENT(IN) :: PREDR1
@@ -2249,16 +2259,17 @@ SUBROUTINE D_PSI3DTDZ_O_DDTDZ(D,CSTURB,PPSI3,PREDR1,PREDTH1,PRED2R3,PRED2THR3,HT
   LOGICAL,                INTENT(IN) :: OUSERV    ! flag to use vapor
   REAL, DIMENSION(D%NIJT,D%NKT),INTENT(OUT) :: PD_PSI3DTDZ_O_DDTDZ
 !
-REAL(KIND=JPRB) :: ZHOOK_HANDLE
+REAL(KIND=JPHOOK) :: ZHOOK_HANDLE
 IF (LHOOK) CALL DR_HOOK('MODE_PRANDTL:D_PSI3DTDZ_O_DDTDZ',0,ZHOOK_HANDLE)
-CALL D_PHI3DRDZ_O_DDRDZ(D,CSTURB,PPSI3,PREDR1,PREDTH1,PRED2R3,PRED2THR3,HTURBDIM,OUSERV,PD_PSI3DTDZ_O_DDTDZ)
+CALL D_PHI3DRDZ_O_DDRDZ(D,CSTURB,TURBN,PPSI3,PREDR1,PREDTH1,PRED2R3,PRED2THR3,HTURBDIM,OUSERV,PD_PSI3DTDZ_O_DDTDZ)
 !
 IF (LHOOK) CALL DR_HOOK('MODE_PRANDTL:D_PSI3DTDZ_O_DDTDZ',1,ZHOOK_HANDLE)
 END SUBROUTINE D_PSI3DTDZ_O_DDTDZ
 !----------------------------------------------------------------------------
-SUBROUTINE D_PSI3DRDZ2_O_DDRDZ(D,CSTURB,PPSI3,PREDR1,PREDTH1,PRED2R3,PRED2THR3,PDRDZ,HTURBDIM,OUSERV,PD_PSI3DRDZ2_O_DDRDZ)
+SUBROUTINE D_PSI3DRDZ2_O_DDRDZ(D,CSTURB,TURBN,PPSI3,PREDR1,PREDTH1,PRED2R3,PRED2THR3,PDRDZ,HTURBDIM,OUSERV,PD_PSI3DRDZ2_O_DDRDZ)
   TYPE(DIMPHYEX_t),                   INTENT(IN) :: D
   TYPE(CSTURB_t),                     INTENT(IN) :: CSTURB
+  TYPE(TURB_t),                    INTENT(IN)    :: TURBN
   REAL, DIMENSION(D%NIJT,D%NKT), INTENT(IN) :: PPSI3
   REAL, DIMENSION(D%NIJT,D%NKT), INTENT(IN) :: PREDR1
   REAL, DIMENSION(D%NIJT,D%NKT), INTENT(IN) :: PREDTH1
@@ -2269,16 +2280,17 @@ SUBROUTINE D_PSI3DRDZ2_O_DDRDZ(D,CSTURB,PPSI3,PREDR1,PREDTH1,PRED2R3,PRED2THR3,P
   LOGICAL,                INTENT(IN) :: OUSERV    ! flag to use vapor
   REAL, DIMENSION(D%NIJT,D%NKT),INTENT(OUT) :: PD_PSI3DRDZ2_O_DDRDZ
 !
-REAL(KIND=JPRB) :: ZHOOK_HANDLE
+REAL(KIND=JPHOOK) :: ZHOOK_HANDLE
 IF (LHOOK) CALL DR_HOOK('MODE_PRANDTL:D_PSI3DRDZ2_O_DDRDZ',0,ZHOOK_HANDLE)
-CALL D_PHI3DTDZ2_O_DDTDZ(D,CSTURB,PPSI3,PREDR1,PREDTH1,PRED2R3,PRED2THR3,PDRDZ,HTURBDIM,OUSERV,PD_PSI3DRDZ2_O_DDRDZ)
+CALL D_PHI3DTDZ2_O_DDTDZ(D,CSTURB,TURBN,PPSI3,PREDR1,PREDTH1,PRED2R3,PRED2THR3,PDRDZ,HTURBDIM,OUSERV,PD_PSI3DRDZ2_O_DDRDZ)
 !
 IF (LHOOK) CALL DR_HOOK('MODE_PRANDTL:D_PSI3DRDZ2_O_DDRDZ',1,ZHOOK_HANDLE)
 END SUBROUTINE D_PSI3DRDZ2_O_DDRDZ
 !----------------------------------------------------------------------------
-SUBROUTINE M3_WR_WR2(D,CSTURB,PREDR1,PREDTH1,PD,PBLL_O_E,PEMOIST,PM3_WR_WR2)
+SUBROUTINE M3_WR_WR2(D,CSTURB,TURBN,PREDR1,PREDTH1,PD,PBLL_O_E,PEMOIST,PM3_WR_WR2)
   TYPE(DIMPHYEX_t),                   INTENT(IN) :: D
   TYPE(CSTURB_t),                     INTENT(IN) :: CSTURB
+  TYPE(TURB_t),                    INTENT(IN)    :: TURBN
   REAL, DIMENSION(D%NIJT,D%NKT), INTENT(IN) :: PREDR1
   REAL, DIMENSION(D%NIJT,D%NKT), INTENT(IN) :: PREDTH1
   REAL, DIMENSION(D%NIJT,D%NKT), INTENT(IN) :: PD
@@ -2286,16 +2298,17 @@ SUBROUTINE M3_WR_WR2(D,CSTURB,PREDR1,PREDTH1,PD,PBLL_O_E,PEMOIST,PM3_WR_WR2)
   REAL, DIMENSION(D%NIJT,D%NKT), INTENT(IN) :: PEMOIST
   REAL, DIMENSION(D%NIJT,D%NKT),INTENT(OUT) :: PM3_WR_WR2
 !
-REAL(KIND=JPRB) :: ZHOOK_HANDLE
+REAL(KIND=JPHOOK) :: ZHOOK_HANDLE
 IF (LHOOK) CALL DR_HOOK('MODE_PRANDTL:M3_WR_WR2',0,ZHOOK_HANDLE)
-CALL M3_WTH_WTH2(D,CSTURB,PREDR1,PREDTH1,PD,PBLL_O_E,PEMOIST,PM3_WR_WR2)
+CALL M3_WTH_WTH2(D,CSTURB,TURBN,PREDR1,PREDTH1,PD,PBLL_O_E,PEMOIST,PM3_WR_WR2)
 !
 IF (LHOOK) CALL DR_HOOK('MODE_PRANDTL:M3_WR_WR2',1,ZHOOK_HANDLE)
 END SUBROUTINE M3_WR_WR2
 !----------------------------------------------------------------------------
-SUBROUTINE D_M3_WR_WR2_O_DDRDZ(D,CSTURB,PM3_WR_WR2,PREDR1,PREDTH1,PD,PBLL_O_E,PEMOIST,PD_M3_WR_WR2_O_DDRDZ)
+SUBROUTINE D_M3_WR_WR2_O_DDRDZ(D,CSTURB,TURBN,PM3_WR_WR2,PREDR1,PREDTH1,PD,PBLL_O_E,PEMOIST,PD_M3_WR_WR2_O_DDRDZ)
   TYPE(DIMPHYEX_t),                   INTENT(IN) :: D
   TYPE(CSTURB_t),                     INTENT(IN) :: CSTURB
+  TYPE(TURB_t),                    INTENT(IN)    :: TURBN
   REAL, DIMENSION(D%NIJT,D%NKT), INTENT(IN) :: PM3_WR_WR2
   REAL, DIMENSION(D%NIJT,D%NKT), INTENT(IN) :: PREDR1
   REAL, DIMENSION(D%NIJT,D%NKT), INTENT(IN) :: PREDTH1
@@ -2304,16 +2317,17 @@ SUBROUTINE D_M3_WR_WR2_O_DDRDZ(D,CSTURB,PM3_WR_WR2,PREDR1,PREDTH1,PD,PBLL_O_E,PE
   REAL, DIMENSION(D%NIJT,D%NKT), INTENT(IN) :: PEMOIST
   REAL, DIMENSION(D%NIJT,D%NKT),INTENT(OUT) :: PD_M3_WR_WR2_O_DDRDZ
 !
-REAL(KIND=JPRB) :: ZHOOK_HANDLE
+REAL(KIND=JPHOOK) :: ZHOOK_HANDLE
 IF (LHOOK) CALL DR_HOOK('MODE_PRANDTL:D_M3_WR_WR2_O_DDRDZ',0,ZHOOK_HANDLE)
-CALL D_M3_WTH_WTH2_O_DDTDZ(D,CSTURB,PM3_WR_WR2,PREDR1,PREDTH1,PD,PBLL_O_E,PEMOIST,PD_M3_WR_WR2_O_DDRDZ)
+CALL D_M3_WTH_WTH2_O_DDTDZ(D,CSTURB,TURBN,PM3_WR_WR2,PREDR1,PREDTH1,PD,PBLL_O_E,PEMOIST,PD_M3_WR_WR2_O_DDRDZ)
 !
 IF (LHOOK) CALL DR_HOOK('MODE_PRANDTL:D_M3_WR_WR2_O_DDRDZ',1,ZHOOK_HANDLE)
 END SUBROUTINE D_M3_WR_WR2_O_DDRDZ
 !----------------------------------------------------------------------------
-SUBROUTINE M3_WR_W2R(D,CSTURB,PREDR1,PREDTH1,PD,PKEFF,PTKE,PM3_WR_W2R)
+SUBROUTINE M3_WR_W2R(D,CSTURB,TURBN,PREDR1,PREDTH1,PD,PKEFF,PTKE,PM3_WR_W2R)
   TYPE(DIMPHYEX_t),                   INTENT(IN) :: D
   TYPE(CSTURB_t),                     INTENT(IN) :: CSTURB
+  TYPE(TURB_t),                    INTENT(IN)    :: TURBN
   REAL, DIMENSION(D%NIJT,D%NKT), INTENT(IN) :: PREDR1
   REAL, DIMENSION(D%NIJT,D%NKT), INTENT(IN) :: PREDTH1
   REAL, DIMENSION(D%NIJT,D%NKT), INTENT(IN) :: PD
@@ -2321,16 +2335,17 @@ SUBROUTINE M3_WR_W2R(D,CSTURB,PREDR1,PREDTH1,PD,PKEFF,PTKE,PM3_WR_W2R)
   REAL, DIMENSION(D%NIJT,D%NKT), INTENT(IN) :: PTKE
   REAL, DIMENSION(D%NIJT,D%NKT),INTENT(OUT) :: PM3_WR_W2R
 !
-REAL(KIND=JPRB) :: ZHOOK_HANDLE
+REAL(KIND=JPHOOK) :: ZHOOK_HANDLE
 IF (LHOOK) CALL DR_HOOK('MODE_PRANDTL:M3_WR_W2R',0,ZHOOK_HANDLE)
-CALL M3_WTH_W2TH(D,CSTURB,PREDR1,PREDTH1,PD,PKEFF,PTKE,PM3_WR_W2R)
+CALL M3_WTH_W2TH(D,CSTURB,TURBN,PREDR1,PREDTH1,PD,PKEFF,PTKE,PM3_WR_W2R)
 !
 IF (LHOOK) CALL DR_HOOK('MODE_PRANDTL:M3_WR_W2R',1,ZHOOK_HANDLE)
 END SUBROUTINE M3_WR_W2R
 !----------------------------------------------------------------------------
-SUBROUTINE D_M3_WR_W2R_O_DDRDZ(D,CSTURB,PREDR1,PREDTH1,PD,PBLL_O_E,PEMOIST,PKEFF,PTKE,PD_M3_WR_W2R_O_DDRDZ)
+SUBROUTINE D_M3_WR_W2R_O_DDRDZ(D,CSTURB,TURBN,PREDR1,PREDTH1,PD,PBLL_O_E,PEMOIST,PKEFF,PTKE,PD_M3_WR_W2R_O_DDRDZ)
   TYPE(DIMPHYEX_t),                   INTENT(IN) :: D
   TYPE(CSTURB_t),                     INTENT(IN) :: CSTURB
+  TYPE(TURB_t),                    INTENT(IN)    :: TURBN
   REAL, DIMENSION(D%NIJT,D%NKT), INTENT(IN) :: PREDR1
   REAL, DIMENSION(D%NIJT,D%NKT), INTENT(IN) :: PREDTH1
   REAL, DIMENSION(D%NIJT,D%NKT), INTENT(IN) :: PD
@@ -2340,16 +2355,17 @@ SUBROUTINE D_M3_WR_W2R_O_DDRDZ(D,CSTURB,PREDR1,PREDTH1,PD,PBLL_O_E,PEMOIST,PKEFF
   REAL, DIMENSION(D%NIJT,D%NKT), INTENT(IN) :: PTKE
   REAL, DIMENSION(D%NIJT,D%NKT),INTENT(OUT) :: PD_M3_WR_W2R_O_DDRDZ
 !
-REAL(KIND=JPRB) :: ZHOOK_HANDLE
+REAL(KIND=JPHOOK) :: ZHOOK_HANDLE
 IF (LHOOK) CALL DR_HOOK('MODE_PRANDTL:D_M3_WR_W2R_O_DDRDZ',0,ZHOOK_HANDLE)
-CALL D_M3_WTH_W2TH_O_DDTDZ(D,CSTURB,PREDR1,PREDTH1,PD,PBLL_O_E,PEMOIST,PKEFF,PTKE,PD_M3_WR_W2R_O_DDRDZ)
+CALL D_M3_WTH_W2TH_O_DDTDZ(D,CSTURB,TURBN,PREDR1,PREDTH1,PD,PBLL_O_E,PEMOIST,PKEFF,PTKE,PD_M3_WR_W2R_O_DDRDZ)
 !
 IF (LHOOK) CALL DR_HOOK('MODE_PRANDTL:D_M3_WR_W2R_O_DDRDZ',1,ZHOOK_HANDLE)
 END SUBROUTINE D_M3_WR_W2R_O_DDRDZ
 !----------------------------------------------------------------------------
-SUBROUTINE M3_WR_W2TH(D,CSTURB,PD,PKEFF,PTKE,PBLL_O_E,PETHETA,PDRDZ,PM3_WR_W2TH)
+SUBROUTINE M3_WR_W2TH(D,CSTURB,TURBN,PD,PKEFF,PTKE,PBLL_O_E,PETHETA,PDRDZ,PM3_WR_W2TH)
   TYPE(DIMPHYEX_t),                   INTENT(IN) :: D
   TYPE(CSTURB_t),                     INTENT(IN) :: CSTURB
+  TYPE(TURB_t),                    INTENT(IN)    :: TURBN
   REAL, DIMENSION(D%NIJT,D%NKT), INTENT(IN) :: PD
   REAL, DIMENSION(D%NIJT,D%NKT), INTENT(IN) :: PKEFF
   REAL, DIMENSION(D%NIJT,D%NKT), INTENT(IN) :: PTKE
@@ -2358,16 +2374,17 @@ SUBROUTINE M3_WR_W2TH(D,CSTURB,PD,PKEFF,PTKE,PBLL_O_E,PETHETA,PDRDZ,PM3_WR_W2TH)
   REAL, DIMENSION(D%NIJT,D%NKT), INTENT(IN) :: PDRDZ
   REAL, DIMENSION(D%NIJT,D%NKT),INTENT(OUT) :: PM3_WR_W2TH
 !
-REAL(KIND=JPRB) :: ZHOOK_HANDLE
+REAL(KIND=JPHOOK) :: ZHOOK_HANDLE
 IF (LHOOK) CALL DR_HOOK('MODE_PRANDTL:M3_WR_W2TH',0,ZHOOK_HANDLE)
-CALL M3_WTH_W2R(D,CSTURB,PD,PKEFF,PTKE,PBLL_O_E,PETHETA,PDRDZ,PM3_WR_W2TH)
+CALL M3_WTH_W2R(D,CSTURB,TURBN,PD,PKEFF,PTKE,PBLL_O_E,PETHETA,PDRDZ,PM3_WR_W2TH)
 !
 IF (LHOOK) CALL DR_HOOK('MODE_PRANDTL:M3_WR_W2TH',1,ZHOOK_HANDLE)
 END SUBROUTINE M3_WR_W2TH
 !----------------------------------------------------------------------------
-SUBROUTINE D_M3_WR_W2TH_O_DDRDZ(D,CSTURB,PREDR1,PREDTH1,PD,PKEFF,PTKE,PBLL_O_E,PETHETA,PD_M3_WR_W2TH_O_DDRDZ)
+SUBROUTINE D_M3_WR_W2TH_O_DDRDZ(D,CSTURB,TURBN,PREDR1,PREDTH1,PD,PKEFF,PTKE,PBLL_O_E,PETHETA,PD_M3_WR_W2TH_O_DDRDZ)
   TYPE(DIMPHYEX_t),                   INTENT(IN) :: D
   TYPE(CSTURB_t),                     INTENT(IN) :: CSTURB
+  TYPE(TURB_t),                    INTENT(IN)    :: TURBN
   REAL, DIMENSION(D%NIJT,D%NKT), INTENT(IN) :: PREDR1
   REAL, DIMENSION(D%NIJT,D%NKT), INTENT(IN) :: PREDTH1
   REAL, DIMENSION(D%NIJT,D%NKT), INTENT(IN) :: PD
@@ -2377,16 +2394,17 @@ SUBROUTINE D_M3_WR_W2TH_O_DDRDZ(D,CSTURB,PREDR1,PREDTH1,PD,PKEFF,PTKE,PBLL_O_E,P
   REAL, DIMENSION(D%NIJT,D%NKT), INTENT(IN) :: PETHETA
   REAL, DIMENSION(D%NIJT,D%NKT),INTENT(OUT) :: PD_M3_WR_W2TH_O_DDRDZ
 !
-REAL(KIND=JPRB) :: ZHOOK_HANDLE
+REAL(KIND=JPHOOK) :: ZHOOK_HANDLE
 IF (LHOOK) CALL DR_HOOK('MODE_PRANDTL:D_M3_WR_W2TH_O_DDRDZ',0,ZHOOK_HANDLE)
-CALL D_M3_WTH_W2R_O_DDTDZ(D,CSTURB,PREDR1,PREDTH1,PD,PKEFF,PTKE,PBLL_O_E,PETHETA,PD_M3_WR_W2TH_O_DDRDZ)
+CALL D_M3_WTH_W2R_O_DDTDZ(D,CSTURB,TURBN,PREDR1,PREDTH1,PD,PKEFF,PTKE,PBLL_O_E,PETHETA,PD_M3_WR_W2TH_O_DDRDZ)
 !
 IF (LHOOK) CALL DR_HOOK('MODE_PRANDTL:D_M3_WR_W2TH_O_DDRDZ',1,ZHOOK_HANDLE)
 END SUBROUTINE D_M3_WR_W2TH_O_DDRDZ
 !----------------------------------------------------------------------------
-SUBROUTINE M3_WR_WTH2(D,CSTURB,PD,PKEFF,PTKE,PSQRT_TKE,PBLL_O_E,PBETA,PLEPS,PETHETA,PDRDZ,PM3_WR_WTH2)
+SUBROUTINE M3_WR_WTH2(D,CSTURB,TURBN,PD,PKEFF,PTKE,PSQRT_TKE,PBLL_O_E,PBETA,PLEPS,PETHETA,PDRDZ,PM3_WR_WTH2)
   TYPE(DIMPHYEX_t),                   INTENT(IN) :: D
   TYPE(CSTURB_t),                     INTENT(IN) :: CSTURB
+  TYPE(TURB_t),                    INTENT(IN)    :: TURBN
   REAL, DIMENSION(D%NIJT,D%NKT), INTENT(IN) :: PD
   REAL, DIMENSION(D%NIJT,D%NKT), INTENT(IN) :: PKEFF
   REAL, DIMENSION(D%NIJT,D%NKT), INTENT(IN) :: PTKE
@@ -2398,16 +2416,18 @@ SUBROUTINE M3_WR_WTH2(D,CSTURB,PD,PKEFF,PTKE,PSQRT_TKE,PBLL_O_E,PBETA,PLEPS,PETH
   REAL, DIMENSION(D%NIJT,D%NKT), INTENT(IN) :: PDRDZ
   REAL, DIMENSION(D%NIJT,D%NKT),INTENT(OUT) :: PM3_WR_WTH2
 !
-REAL(KIND=JPRB) :: ZHOOK_HANDLE
+REAL(KIND=JPHOOK) :: ZHOOK_HANDLE
 IF (LHOOK) CALL DR_HOOK('MODE_PRANDTL:M3_WR_WTH2',0,ZHOOK_HANDLE)
-CALL M3_WTH_WR2(D,CSTURB,PD,PKEFF,PTKE,PSQRT_TKE,PBLL_O_E,PBETA,PLEPS,PETHETA,PDRDZ,PM3_WR_WTH2)
+CALL M3_WTH_WR2(D,CSTURB,TURBN,PD,PKEFF,PTKE,PSQRT_TKE,PBLL_O_E,PBETA,PLEPS,PETHETA,PDRDZ,PM3_WR_WTH2)
 !
 IF (LHOOK) CALL DR_HOOK('MODE_PRANDTL:M3_WR_WTH2',1,ZHOOK_HANDLE)
 END SUBROUTINE M3_WR_WTH2
 !----------------------------------------------------------------------------
-SUBROUTINE D_M3_WR_WTH2_O_DDRDZ(D,CSTURB,PREDR1,PREDTH1,PD,PKEFF,PTKE,PSQRT_TKE,PBLL_O_E,PBETA,PLEPS,PETHETA,PD_M3_WR_WTH2_O_DDRDZ)
+SUBROUTINE D_M3_WR_WTH2_O_DDRDZ(D,CSTURB,TURBN,PREDR1,PREDTH1,PD,PKEFF,PTKE,PSQRT_TKE,PBLL_O_E,&
+                               &PBETA,PLEPS,PETHETA,PD_M3_WR_WTH2_O_DDRDZ)
   TYPE(DIMPHYEX_t),                   INTENT(IN) :: D
   TYPE(CSTURB_t),                     INTENT(IN) :: CSTURB
+  TYPE(TURB_t),                    INTENT(IN)    :: TURBN
   REAL, DIMENSION(D%NIJT,D%NKT), INTENT(IN) :: PREDR1
   REAL, DIMENSION(D%NIJT,D%NKT), INTENT(IN) :: PREDTH1
   REAL, DIMENSION(D%NIJT,D%NKT), INTENT(IN) :: PD
@@ -2420,16 +2440,17 @@ SUBROUTINE D_M3_WR_WTH2_O_DDRDZ(D,CSTURB,PREDR1,PREDTH1,PD,PKEFF,PTKE,PSQRT_TKE,
   REAL, DIMENSION(D%NIJT,D%NKT), INTENT(IN) :: PETHETA
   REAL, DIMENSION(D%NIJT,D%NKT),INTENT(OUT) :: PD_M3_WR_WTH2_O_DDRDZ
 !
-REAL(KIND=JPRB) :: ZHOOK_HANDLE
+REAL(KIND=JPHOOK) :: ZHOOK_HANDLE
 IF (LHOOK) CALL DR_HOOK('MODE_PRANDTL:D_M3_WR_WTH2_O_DDRDZ',0,ZHOOK_HANDLE)
-CALL D_M3_WTH_WR2_O_DDTDZ(D,CSTURB,PREDR1,PREDTH1,PD,PKEFF,PTKE,PSQRT_TKE,PBLL_O_E,PBETA,PLEPS,PETHETA,PD_M3_WR_WTH2_O_DDRDZ)
+CALL D_M3_WTH_WR2_O_DDTDZ(D,CSTURB,TURBN,PREDR1,PREDTH1,PD,PKEFF,PTKE,PSQRT_TKE,PBLL_O_E,PBETA,PLEPS,PETHETA,PD_M3_WR_WTH2_O_DDRDZ)
 !
 IF (LHOOK) CALL DR_HOOK('MODE_PRANDTL:D_M3_WR_WTH2_O_DDRDZ',1,ZHOOK_HANDLE)
 END SUBROUTINE D_M3_WR_WTH2_O_DDRDZ
 !----------------------------------------------------------------------------
-SUBROUTINE M3_WR_WTHR(D,CSTURB,PREDTH1,PD,PKEFF,PTKE,PSQRT_TKE,PBETA,PLEPS,PETHETA,PM3_WR_WTHR)
+SUBROUTINE M3_WR_WTHR(D,CSTURB,TURBN,PREDTH1,PD,PKEFF,PTKE,PSQRT_TKE,PBETA,PLEPS,PETHETA,PM3_WR_WTHR)
   TYPE(DIMPHYEX_t),                   INTENT(IN) :: D
   TYPE(CSTURB_t),                     INTENT(IN) :: CSTURB
+  TYPE(TURB_t),                    INTENT(IN)    :: TURBN
   REAL, DIMENSION(D%NIJT,D%NKT), INTENT(IN) :: PREDTH1
   REAL, DIMENSION(D%NIJT,D%NKT), INTENT(IN) :: PD
   REAL, DIMENSION(D%NIJT,D%NKT), INTENT(IN) :: PKEFF
@@ -2440,16 +2461,17 @@ SUBROUTINE M3_WR_WTHR(D,CSTURB,PREDTH1,PD,PKEFF,PTKE,PSQRT_TKE,PBETA,PLEPS,PETHE
   REAL, DIMENSION(D%NIJT,D%NKT), INTENT(IN) :: PETHETA
   REAL, DIMENSION(D%NIJT,D%NKT),INTENT(OUT) :: PM3_WR_WTHR
 !
-REAL(KIND=JPRB) :: ZHOOK_HANDLE
+REAL(KIND=JPHOOK) :: ZHOOK_HANDLE
 IF (LHOOK) CALL DR_HOOK('MODE_PRANDTL:M3_WR_WTHR',0,ZHOOK_HANDLE)
-CALL M3_WTH_WTHR(D,CSTURB,PREDTH1,PD,PKEFF,PTKE,PSQRT_TKE,PBETA,PLEPS,PETHETA,PM3_WR_WTHR)
+CALL M3_WTH_WTHR(D,CSTURB,TURBN,PREDTH1,PD,PKEFF,PTKE,PSQRT_TKE,PBETA,PLEPS,PETHETA,PM3_WR_WTHR)
 !
 IF (LHOOK) CALL DR_HOOK('MODE_PRANDTL:M3_WR_WTHR',1,ZHOOK_HANDLE)
 END SUBROUTINE M3_WR_WTHR
 !----------------------------------------------------------------------------
-SUBROUTINE D_M3_WR_WTHR_O_DDRDZ(D,CSTURB,PM3_WR_WTHR,PREDR1,PREDTH1,PD,PBLL_O_E,PEMOIST,PD_M3_WR_WTHR_O_DDRDZ)
+SUBROUTINE D_M3_WR_WTHR_O_DDRDZ(D,CSTURB,TURBN,PM3_WR_WTHR,PREDR1,PREDTH1,PD,PBLL_O_E,PEMOIST,PD_M3_WR_WTHR_O_DDRDZ)
   TYPE(DIMPHYEX_t),                   INTENT(IN) :: D
   TYPE(CSTURB_t),                     INTENT(IN) :: CSTURB
+  TYPE(TURB_t),                    INTENT(IN)    :: TURBN
   REAL, DIMENSION(D%NIJT,D%NKT), INTENT(IN) :: PM3_WR_WTHR
   REAL, DIMENSION(D%NIJT,D%NKT), INTENT(IN) :: PREDR1
   REAL, DIMENSION(D%NIJT,D%NKT), INTENT(IN) :: PREDTH1
@@ -2458,16 +2480,17 @@ SUBROUTINE D_M3_WR_WTHR_O_DDRDZ(D,CSTURB,PM3_WR_WTHR,PREDR1,PREDTH1,PD,PBLL_O_E,
   REAL, DIMENSION(D%NIJT,D%NKT), INTENT(IN) :: PEMOIST
   REAL, DIMENSION(D%NIJT,D%NKT),INTENT(OUT) :: PD_M3_WR_WTHR_O_DDRDZ
 !
-REAL(KIND=JPRB) :: ZHOOK_HANDLE
+REAL(KIND=JPHOOK) :: ZHOOK_HANDLE
 IF (LHOOK) CALL DR_HOOK('MODE_PRANDTL:D_M3_WR_WTHR_O_DDRDZ',0,ZHOOK_HANDLE)
-CALL D_M3_WTH_WTHR_O_DDTDZ(D,CSTURB,PM3_WR_WTHR,PREDR1,PREDTH1,PD,PBLL_O_E,PEMOIST,PD_M3_WR_WTHR_O_DDRDZ)
+CALL D_M3_WTH_WTHR_O_DDTDZ(D,CSTURB,TURBN,PM3_WR_WTHR,PREDR1,PREDTH1,PD,PBLL_O_E,PEMOIST,PD_M3_WR_WTHR_O_DDRDZ)
 !
 IF (LHOOK) CALL DR_HOOK('MODE_PRANDTL:D_M3_WR_WTHR_O_DDRDZ',1,ZHOOK_HANDLE)
 END SUBROUTINE D_M3_WR_WTHR_O_DDRDZ
 !----------------------------------------------------------------------------
-SUBROUTINE M3_R2_W2R(D,CSTURB,PREDR1,PREDTH1,PD,PDRDZ,PLM,PLEPS,PTKE,PM3_R2_W2R)
+SUBROUTINE M3_R2_W2R(D,CSTURB,TURBN,PREDR1,PREDTH1,PD,PDRDZ,PLM,PLEPS,PTKE,PM3_R2_W2R)
   TYPE(DIMPHYEX_t),                   INTENT(IN) :: D
   TYPE(CSTURB_t),                     INTENT(IN) :: CSTURB
+  TYPE(TURB_t),                    INTENT(IN)    :: TURBN
   REAL, DIMENSION(D%NIJT,D%NKT), INTENT(IN) :: PREDR1
   REAL, DIMENSION(D%NIJT,D%NKT), INTENT(IN) :: PREDTH1
   REAL, DIMENSION(D%NIJT,D%NKT), INTENT(IN) :: PD
@@ -2477,16 +2500,17 @@ SUBROUTINE M3_R2_W2R(D,CSTURB,PREDR1,PREDTH1,PD,PDRDZ,PLM,PLEPS,PTKE,PM3_R2_W2R)
   REAL, DIMENSION(D%NIJT,D%NKT), INTENT(IN) :: PTKE
   REAL, DIMENSION(D%NIJT,D%NKT), INTENT(OUT) :: PM3_R2_W2R
 !
-REAL(KIND=JPRB) :: ZHOOK_HANDLE
+REAL(KIND=JPHOOK) :: ZHOOK_HANDLE
 IF (LHOOK) CALL DR_HOOK('MODE_PRANDTL:M3_R2_W2R',0,ZHOOK_HANDLE)
-CALL M3_TH2_W2TH(D,CSTURB,PREDR1,PREDTH1,PD,PDRDZ,PLM,PLEPS,PTKE,PM3_R2_W2R)
+CALL M3_TH2_W2TH(D,CSTURB,TURBN,PREDR1,PREDTH1,PD,PDRDZ,PLM,PLEPS,PTKE,PM3_R2_W2R)
 !
 IF (LHOOK) CALL DR_HOOK('MODE_PRANDTL:M3_R2_W2R',1,ZHOOK_HANDLE)
 END SUBROUTINE M3_R2_W2R
 !----------------------------------------------------------------------------
-SUBROUTINE D_M3_R2_W2R_O_DDRDZ(D,CSTURB,PREDR1,PREDTH1,PD,PLM,PLEPS,PTKE,OUSERV,PD_M3_R2_W2R_O_DDRDZ)
+SUBROUTINE D_M3_R2_W2R_O_DDRDZ(D,CSTURB,TURBN,PREDR1,PREDTH1,PD,PLM,PLEPS,PTKE,OUSERV,PD_M3_R2_W2R_O_DDRDZ)
   TYPE(DIMPHYEX_t),                   INTENT(IN) :: D
   TYPE(CSTURB_t),                     INTENT(IN) :: CSTURB
+  TYPE(TURB_t),                    INTENT(IN)    :: TURBN
   REAL, DIMENSION(D%NIJT,D%NKT), INTENT(IN) :: PREDR1
   REAL, DIMENSION(D%NIJT,D%NKT), INTENT(IN) :: PREDTH1
   REAL, DIMENSION(D%NIJT,D%NKT), INTENT(IN) :: PD
@@ -2496,16 +2520,17 @@ SUBROUTINE D_M3_R2_W2R_O_DDRDZ(D,CSTURB,PREDR1,PREDTH1,PD,PLM,PLEPS,PTKE,OUSERV,
   LOGICAL,                INTENT(IN) :: OUSERV
   REAL, DIMENSION(D%NIJT,D%NKT),INTENT(OUT) :: PD_M3_R2_W2R_O_DDRDZ
 !
-REAL(KIND=JPRB) :: ZHOOK_HANDLE
+REAL(KIND=JPHOOK) :: ZHOOK_HANDLE
 IF (LHOOK) CALL DR_HOOK('MODE_PRANDTL:D_M3_R2_W2R_O_DDRDZ',0,ZHOOK_HANDLE)
-CALL D_M3_TH2_W2TH_O_DDTDZ(D,CSTURB,PREDR1,PREDTH1,PD,PLM,PLEPS,PTKE,OUSERV,PD_M3_R2_W2R_O_DDRDZ)
+CALL D_M3_TH2_W2TH_O_DDTDZ(D,CSTURB,TURBN,PREDR1,PREDTH1,PD,PLM,PLEPS,PTKE,OUSERV,PD_M3_R2_W2R_O_DDRDZ)
 !
 IF (LHOOK) CALL DR_HOOK('MODE_PRANDTL:D_M3_R2_W2R_O_DDRDZ',1,ZHOOK_HANDLE)
 END SUBROUTINE D_M3_R2_W2R_O_DDRDZ
 !----------------------------------------------------------------------------
-SUBROUTINE M3_R2_WR2(D,CSTURB,PREDR1,PREDTH1,PD,PLEPS,PSQRT_TKE,PM3_R2_WR2)
+SUBROUTINE M3_R2_WR2(D,CSTURB,TURBN,PREDR1,PREDTH1,PD,PLEPS,PSQRT_TKE,PM3_R2_WR2)
   TYPE(DIMPHYEX_t),                   INTENT(IN) :: D
   TYPE(CSTURB_t),                     INTENT(IN) :: CSTURB
+  TYPE(TURB_t),                    INTENT(IN)    :: TURBN
   REAL, DIMENSION(D%NIJT,D%NKT), INTENT(IN) :: PREDR1
   REAL, DIMENSION(D%NIJT,D%NKT), INTENT(IN) :: PREDTH1
   REAL, DIMENSION(D%NIJT,D%NKT), INTENT(IN) :: PD
@@ -2513,16 +2538,17 @@ SUBROUTINE M3_R2_WR2(D,CSTURB,PREDR1,PREDTH1,PD,PLEPS,PSQRT_TKE,PM3_R2_WR2)
   REAL, DIMENSION(D%NIJT,D%NKT), INTENT(IN) :: PSQRT_TKE
   REAL, DIMENSION(D%NIJT,D%NKT),INTENT(OUT) :: PM3_R2_WR2
 !
-REAL(KIND=JPRB) :: ZHOOK_HANDLE
+REAL(KIND=JPHOOK) :: ZHOOK_HANDLE
 IF (LHOOK) CALL DR_HOOK('MODE_PRANDTL:M3_R2_WR2',0,ZHOOK_HANDLE)
-CALL M3_TH2_WTH2(D,CSTURB,PREDR1,PREDTH1,PD,PLEPS,PSQRT_TKE,PM3_R2_WR2)
+CALL M3_TH2_WTH2(D,CSTURB,TURBN,PREDR1,PREDTH1,PD,PLEPS,PSQRT_TKE,PM3_R2_WR2)
 !
 IF (LHOOK) CALL DR_HOOK('MODE_PRANDTL:M3_R2_WR2',1,ZHOOK_HANDLE)
 END SUBROUTINE M3_R2_WR2
 !----------------------------------------------------------------------------
-SUBROUTINE D_M3_R2_WR2_O_DDRDZ(D,CSTURB,PREDR1,PREDTH1,PD,PLEPS,PSQRT_TKE,PBLL_O_E,PEMOIST,PD_M3_R2_WR2_O_DDRDZ)
+SUBROUTINE D_M3_R2_WR2_O_DDRDZ(D,CSTURB,TURBN,PREDR1,PREDTH1,PD,PLEPS,PSQRT_TKE,PBLL_O_E,PEMOIST,PD_M3_R2_WR2_O_DDRDZ)
   TYPE(DIMPHYEX_t),                   INTENT(IN) :: D
   TYPE(CSTURB_t),                     INTENT(IN) :: CSTURB
+  TYPE(TURB_t),                    INTENT(IN)    :: TURBN
   REAL, DIMENSION(D%NIJT,D%NKT), INTENT(IN) :: PREDR1
   REAL, DIMENSION(D%NIJT,D%NKT), INTENT(IN) :: PREDTH1
   REAL, DIMENSION(D%NIJT,D%NKT), INTENT(IN) :: PD
@@ -2532,16 +2558,17 @@ SUBROUTINE D_M3_R2_WR2_O_DDRDZ(D,CSTURB,PREDR1,PREDTH1,PD,PLEPS,PSQRT_TKE,PBLL_O
   REAL, DIMENSION(D%NIJT,D%NKT), INTENT(IN) :: PEMOIST
   REAL, DIMENSION(D%NIJT,D%NKT),INTENT(OUT) :: PD_M3_R2_WR2_O_DDRDZ
 !
-REAL(KIND=JPRB) :: ZHOOK_HANDLE
+REAL(KIND=JPHOOK) :: ZHOOK_HANDLE
 IF (LHOOK) CALL DR_HOOK('MODE_PRANDTL:D_M3_R2_WR2_O_DDRDZ',0,ZHOOK_HANDLE)
-CALL D_M3_TH2_WTH2_O_DDTDZ(D,CSTURB,PREDR1,PREDTH1,PD,PLEPS,PSQRT_TKE,PBLL_O_E,PEMOIST,PD_M3_R2_WR2_O_DDRDZ)
+CALL D_M3_TH2_WTH2_O_DDTDZ(D,CSTURB,TURBN,PREDR1,PREDTH1,PD,PLEPS,PSQRT_TKE,PBLL_O_E,PEMOIST,PD_M3_R2_WR2_O_DDRDZ)
 !
 IF (LHOOK) CALL DR_HOOK('MODE_PRANDTL:D_M3_R2_WR2_O_DDRDZ',1,ZHOOK_HANDLE)
 END SUBROUTINE D_M3_R2_WR2_O_DDRDZ
 !----------------------------------------------------------------------------
-SUBROUTINE M3_R2_W2TH(D,CSTURB,PD,PLM,PLEPS,PTKE,PBLL_O_E,PETHETA,PDRDZ,PM3_R2_W2TH)
+SUBROUTINE M3_R2_W2TH(D,CSTURB,TURBN,PD,PLM,PLEPS,PTKE,PBLL_O_E,PETHETA,PDRDZ,PM3_R2_W2TH)
   TYPE(DIMPHYEX_t),                   INTENT(IN) :: D
   TYPE(CSTURB_t),                     INTENT(IN) :: CSTURB
+  TYPE(TURB_t),                    INTENT(IN)    :: TURBN
   REAL, DIMENSION(D%NIJT,D%NKT), INTENT(IN) :: PD
   REAL, DIMENSION(D%NIJT,D%NKT), INTENT(IN) :: PLM
   REAL, DIMENSION(D%NIJT,D%NKT), INTENT(IN) :: PLEPS
@@ -2551,16 +2578,17 @@ SUBROUTINE M3_R2_W2TH(D,CSTURB,PD,PLM,PLEPS,PTKE,PBLL_O_E,PETHETA,PDRDZ,PM3_R2_W
   REAL, DIMENSION(D%NIJT,D%NKT), INTENT(IN) :: PDRDZ
   REAL, DIMENSION(D%NIJT,D%NKT),INTENT(OUT) :: PM3_R2_W2TH
 !
-REAL(KIND=JPRB) :: ZHOOK_HANDLE
+REAL(KIND=JPHOOK) :: ZHOOK_HANDLE
 IF (LHOOK) CALL DR_HOOK('MODE_PRANDTL:M3_R2_W2TH',0,ZHOOK_HANDLE)
-CALL M3_TH2_W2R(D,CSTURB,PD,PLM,PLEPS,PTKE,PBLL_O_E,PETHETA,PDRDZ,PM3_R2_W2TH)
+CALL M3_TH2_W2R(D,CSTURB,TURBN,PD,PLM,PLEPS,PTKE,PBLL_O_E,PETHETA,PDRDZ,PM3_R2_W2TH)
 !
 IF (LHOOK) CALL DR_HOOK('MODE_PRANDTL:M3_R2_W2TH',1,ZHOOK_HANDLE)
 END SUBROUTINE M3_R2_W2TH
 !----------------------------------------------------------------------------
-SUBROUTINE D_M3_R2_W2TH_O_DDRDZ(D,CSTURB,PREDR1,PREDTH1,PD,PLM,PLEPS,PTKE,PBLL_O_E,PETHETA,PDRDZ,PD_M3_R2_W2TH_O_DDRDZ)
+SUBROUTINE D_M3_R2_W2TH_O_DDRDZ(D,CSTURB,TURBN,PREDR1,PREDTH1,PD,PLM,PLEPS,PTKE,PBLL_O_E,PETHETA,PDRDZ,PD_M3_R2_W2TH_O_DDRDZ)
   TYPE(DIMPHYEX_t),                   INTENT(IN) :: D
   TYPE(CSTURB_t),                     INTENT(IN) :: CSTURB
+  TYPE(TURB_t),                    INTENT(IN)    :: TURBN
   REAL, DIMENSION(D%NIJT,D%NKT), INTENT(IN) :: PREDR1
   REAL, DIMENSION(D%NIJT,D%NKT), INTENT(IN) :: PREDTH1
   REAL, DIMENSION(D%NIJT,D%NKT), INTENT(IN) :: PD
@@ -2572,16 +2600,17 @@ SUBROUTINE D_M3_R2_W2TH_O_DDRDZ(D,CSTURB,PREDR1,PREDTH1,PD,PLM,PLEPS,PTKE,PBLL_O
   REAL, DIMENSION(D%NIJT,D%NKT), INTENT(IN) :: PDRDZ
   REAL, DIMENSION(D%NIJT,D%NKT),INTENT(OUT) :: PD_M3_R2_W2TH_O_DDRDZ
 !
-REAL(KIND=JPRB) :: ZHOOK_HANDLE
+REAL(KIND=JPHOOK) :: ZHOOK_HANDLE
 IF (LHOOK) CALL DR_HOOK('MODE_PRANDTL:D_M3_R2_W2TH_O_DDRDZ',0,ZHOOK_HANDLE)
-CALL D_M3_TH2_W2R_O_DDTDZ(D,CSTURB,PREDR1,PREDTH1,PD,PLM,PLEPS,PTKE,PBLL_O_E,PETHETA,PDRDZ,PD_M3_R2_W2TH_O_DDRDZ)
+CALL D_M3_TH2_W2R_O_DDTDZ(D,CSTURB,TURBN,PREDR1,PREDTH1,PD,PLM,PLEPS,PTKE,PBLL_O_E,PETHETA,PDRDZ,PD_M3_R2_W2TH_O_DDRDZ)
 !
 IF (LHOOK) CALL DR_HOOK('MODE_PRANDTL:D_M3_R2_W2TH_O_DDRDZ',1,ZHOOK_HANDLE)
 END SUBROUTINE D_M3_R2_W2TH_O_DDRDZ
 !----------------------------------------------------------------------------
-SUBROUTINE M3_R2_WTH2(D,CSTURB,PD,PLEPS,PSQRT_TKE,PBLL_O_E,PETHETA,PDRDZ,PM3_R2_WTH2)
+SUBROUTINE M3_R2_WTH2(D,CSTURB,TURBN,PD,PLEPS,PSQRT_TKE,PBLL_O_E,PETHETA,PDRDZ,PM3_R2_WTH2)
   TYPE(DIMPHYEX_t),                   INTENT(IN) :: D
   TYPE(CSTURB_t),                     INTENT(IN) :: CSTURB
+  TYPE(TURB_t),                    INTENT(IN)    :: TURBN
   REAL, DIMENSION(D%NIJT,D%NKT), INTENT(IN) :: PD
   REAL, DIMENSION(D%NIJT,D%NKT), INTENT(IN) :: PLEPS
   REAL, DIMENSION(D%NIJT,D%NKT), INTENT(IN) :: PSQRT_TKE
@@ -2590,16 +2619,17 @@ SUBROUTINE M3_R2_WTH2(D,CSTURB,PD,PLEPS,PSQRT_TKE,PBLL_O_E,PETHETA,PDRDZ,PM3_R2_
   REAL, DIMENSION(D%NIJT,D%NKT), INTENT(IN) :: PDRDZ
   REAL, DIMENSION(D%NIJT,D%NKT),INTENT(OUT) :: PM3_R2_WTH2
 !
-REAL(KIND=JPRB) :: ZHOOK_HANDLE
+REAL(KIND=JPHOOK) :: ZHOOK_HANDLE
 IF (LHOOK) CALL DR_HOOK('MODE_PRANDTL:M3_R2_WTH2',0,ZHOOK_HANDLE)
-CALL M3_TH2_WR2(D,CSTURB,PD,PLEPS,PSQRT_TKE,PBLL_O_E,PETHETA,PDRDZ,PM3_R2_WTH2)
+CALL M3_TH2_WR2(D,CSTURB,TURBN,PD,PLEPS,PSQRT_TKE,PBLL_O_E,PETHETA,PDRDZ,PM3_R2_WTH2)
 !
 IF (LHOOK) CALL DR_HOOK('MODE_PRANDTL:M3_R2_WTH2',1,ZHOOK_HANDLE)
 END SUBROUTINE M3_R2_WTH2
 !----------------------------------------------------------------------------
-SUBROUTINE D_M3_R2_WTH2_O_DDRDZ(D,CSTURB,PREDR1,PREDTH1,PD,PLEPS,PSQRT_TKE,PBLL_O_E,PETHETA,PDRDZ,PD_M3_R2_WTH2_O_DDRDZ)
+SUBROUTINE D_M3_R2_WTH2_O_DDRDZ(D,CSTURB,TURBN,PREDR1,PREDTH1,PD,PLEPS,PSQRT_TKE,PBLL_O_E,PETHETA,PDRDZ,PD_M3_R2_WTH2_O_DDRDZ)
   TYPE(DIMPHYEX_t),                   INTENT(IN) :: D
   TYPE(CSTURB_t),                     INTENT(IN) :: CSTURB
+  TYPE(TURB_t),                    INTENT(IN)    :: TURBN
   REAL, DIMENSION(D%NIJT,D%NKT), INTENT(IN) :: PREDR1
   REAL, DIMENSION(D%NIJT,D%NKT), INTENT(IN) :: PREDTH1
   REAL, DIMENSION(D%NIJT,D%NKT), INTENT(IN) :: PD
@@ -2610,16 +2640,17 @@ SUBROUTINE D_M3_R2_WTH2_O_DDRDZ(D,CSTURB,PREDR1,PREDTH1,PD,PLEPS,PSQRT_TKE,PBLL_
   REAL, DIMENSION(D%NIJT,D%NKT), INTENT(IN) :: PDRDZ
   REAL, DIMENSION(D%NIJT,D%NKT),INTENT(OUT) :: PD_M3_R2_WTH2_O_DDRDZ
 !
-REAL(KIND=JPRB) :: ZHOOK_HANDLE
+REAL(KIND=JPHOOK) :: ZHOOK_HANDLE
 IF (LHOOK) CALL DR_HOOK('MODE_PRANDTL:D_M3_R2_WTH2_O_DDRDZ',0,ZHOOK_HANDLE)
-CALL D_M3_TH2_WR2_O_DDTDZ(D,CSTURB,PREDR1,PREDTH1,PD,PLEPS,PSQRT_TKE,PBLL_O_E,PETHETA,PDRDZ,PD_M3_R2_WTH2_O_DDRDZ)
+CALL D_M3_TH2_WR2_O_DDTDZ(D,CSTURB,TURBN,PREDR1,PREDTH1,PD,PLEPS,PSQRT_TKE,PBLL_O_E,PETHETA,PDRDZ,PD_M3_R2_WTH2_O_DDRDZ)
 !
 IF (LHOOK) CALL DR_HOOK('MODE_PRANDTL:D_M3_R2_WTH2_O_DDRDZ',1,ZHOOK_HANDLE)
 END SUBROUTINE D_M3_R2_WTH2_O_DDRDZ
 !----------------------------------------------------------------------------
-SUBROUTINE M3_R2_WTHR(D,CSTURB,PREDTH1,PD,PLEPS,PSQRT_TKE,PBLL_O_E,PETHETA,PDRDZ,PM3_R2_WTHR)
+SUBROUTINE M3_R2_WTHR(D,CSTURB,TURBN,PREDTH1,PD,PLEPS,PSQRT_TKE,PBLL_O_E,PETHETA,PDRDZ,PM3_R2_WTHR)
   TYPE(DIMPHYEX_t),                   INTENT(IN) :: D
   TYPE(CSTURB_t),                     INTENT(IN) :: CSTURB
+  TYPE(TURB_t),                    INTENT(IN)    :: TURBN
   REAL, DIMENSION(D%NIJT,D%NKT), INTENT(IN) :: PREDTH1
   REAL, DIMENSION(D%NIJT,D%NKT), INTENT(IN) :: PD
   REAL, DIMENSION(D%NIJT,D%NKT), INTENT(IN) :: PLEPS
@@ -2629,16 +2660,17 @@ SUBROUTINE M3_R2_WTHR(D,CSTURB,PREDTH1,PD,PLEPS,PSQRT_TKE,PBLL_O_E,PETHETA,PDRDZ
   REAL, DIMENSION(D%NIJT,D%NKT), INTENT(IN) :: PDRDZ
   REAL, DIMENSION(D%NIJT,D%NKT),INTENT(OUT) :: PM3_R2_WTHR
 !
-REAL(KIND=JPRB) :: ZHOOK_HANDLE
+REAL(KIND=JPHOOK) :: ZHOOK_HANDLE
 IF (LHOOK) CALL DR_HOOK('MODE_PRANDTL:M3_R2_WTHR',0,ZHOOK_HANDLE)
-CALL M3_TH2_WTHR(D,CSTURB,PREDTH1,PD,PLEPS,PSQRT_TKE,PBLL_O_E,PETHETA,PDRDZ,PM3_R2_WTHR)
+CALL M3_TH2_WTHR(D,CSTURB,TURBN,PREDTH1,PD,PLEPS,PSQRT_TKE,PBLL_O_E,PETHETA,PDRDZ,PM3_R2_WTHR)
 !
 IF (LHOOK) CALL DR_HOOK('MODE_PRANDTL:M3_R2_WTHR',1,ZHOOK_HANDLE)
 END SUBROUTINE M3_R2_WTHR
 !----------------------------------------------------------------------------
-SUBROUTINE D_M3_R2_WTHR_O_DDRDZ(D,CSTURB,PREDR1,PREDTH1,PD,PLEPS,PSQRT_TKE,PBLL_O_E,PETHETA,PDRDZ,PD_M3_R2_WTHR_O_DDRDZ)
+SUBROUTINE D_M3_R2_WTHR_O_DDRDZ(D,CSTURB,TURBN,PREDR1,PREDTH1,PD,PLEPS,PSQRT_TKE,PBLL_O_E,PETHETA,PDRDZ,PD_M3_R2_WTHR_O_DDRDZ)
   TYPE(DIMPHYEX_t),                   INTENT(IN) :: D
   TYPE(CSTURB_t),                     INTENT(IN) :: CSTURB
+  TYPE(TURB_t),                    INTENT(IN)    :: TURBN
   REAL, DIMENSION(D%NIJT,D%NKT), INTENT(IN) :: PREDR1
   REAL, DIMENSION(D%NIJT,D%NKT), INTENT(IN) :: PREDTH1
   REAL, DIMENSION(D%NIJT,D%NKT), INTENT(IN) :: PD
@@ -2649,16 +2681,17 @@ SUBROUTINE D_M3_R2_WTHR_O_DDRDZ(D,CSTURB,PREDR1,PREDTH1,PD,PLEPS,PSQRT_TKE,PBLL_
   REAL, DIMENSION(D%NIJT,D%NKT), INTENT(IN) :: PDRDZ
   REAL, DIMENSION(D%NIJT,D%NKT),INTENT(OUT) :: PD_M3_R2_WTHR_O_DDRDZ
 !
-REAL(KIND=JPRB) :: ZHOOK_HANDLE
+REAL(KIND=JPHOOK) :: ZHOOK_HANDLE
 IF (LHOOK) CALL DR_HOOK('MODE_PRANDTL:D_M3_R2_WTHR_O_DDRDZ',0,ZHOOK_HANDLE)
-CALL D_M3_TH2_WTHR_O_DDTDZ(D,CSTURB,PREDR1,PREDTH1,PD,PLEPS,PSQRT_TKE,PBLL_O_E,PETHETA,PDRDZ,PD_M3_R2_WTHR_O_DDRDZ)
+CALL D_M3_TH2_WTHR_O_DDTDZ(D,CSTURB,TURBN,PREDR1,PREDTH1,PD,PLEPS,PSQRT_TKE,PBLL_O_E,PETHETA,PDRDZ,PD_M3_R2_WTHR_O_DDRDZ)
 !
 IF (LHOOK) CALL DR_HOOK('MODE_PRANDTL:D_M3_R2_WTHR_O_DDRDZ',1,ZHOOK_HANDLE)
 END SUBROUTINE D_M3_R2_WTHR_O_DDRDZ
 !----------------------------------------------------------------------------
-SUBROUTINE D_M3_THR_WTHR_O_DDRDZ(D,CSTURB,PREDR1,PREDTH1,PD,PLEPS,PSQRT_TKE,PBLL_O_E,PEMOIST,PD_M3_THR_WTHR_O_DDRDZ)
+SUBROUTINE D_M3_THR_WTHR_O_DDRDZ(D,CSTURB,TURBN,PREDR1,PREDTH1,PD,PLEPS,PSQRT_TKE,PBLL_O_E,PEMOIST,PD_M3_THR_WTHR_O_DDRDZ)
   TYPE(DIMPHYEX_t),                   INTENT(IN) :: D
   TYPE(CSTURB_t),                     INTENT(IN) :: CSTURB
+  TYPE(TURB_t),                    INTENT(IN)    :: TURBN
   REAL, DIMENSION(D%NIJT,D%NKT), INTENT(IN) :: PREDR1
   REAL, DIMENSION(D%NIJT,D%NKT), INTENT(IN) :: PREDTH1
   REAL, DIMENSION(D%NIJT,D%NKT), INTENT(IN) :: PD
@@ -2668,16 +2701,17 @@ SUBROUTINE D_M3_THR_WTHR_O_DDRDZ(D,CSTURB,PREDR1,PREDTH1,PD,PLEPS,PSQRT_TKE,PBLL
   REAL, DIMENSION(D%NIJT,D%NKT), INTENT(IN) :: PEMOIST
   REAL, DIMENSION(D%NIJT,D%NKT),INTENT(OUT) :: PD_M3_THR_WTHR_O_DDRDZ
 !
-REAL(KIND=JPRB) :: ZHOOK_HANDLE
+REAL(KIND=JPHOOK) :: ZHOOK_HANDLE
 IF (LHOOK) CALL DR_HOOK('MODE_PRANDTL:D_M3_THR_WTHR_O_DDRDZ',0,ZHOOK_HANDLE)
-CALL D_M3_THR_WTHR_O_DDTDZ(D,CSTURB,PREDR1,PREDTH1,PD,PLEPS,PSQRT_TKE,PBLL_O_E,PEMOIST,PD_M3_THR_WTHR_O_DDRDZ)
+CALL D_M3_THR_WTHR_O_DDTDZ(D,CSTURB,TURBN,PREDR1,PREDTH1,PD,PLEPS,PSQRT_TKE,PBLL_O_E,PEMOIST,PD_M3_THR_WTHR_O_DDRDZ)
 !
 IF (LHOOK) CALL DR_HOOK('MODE_PRANDTL:D_M3_THR_WTHR_O_DDRDZ',1,ZHOOK_HANDLE)
 END SUBROUTINE D_M3_THR_WTHR_O_DDRDZ
 !----------------------------------------------------------------------------
-SUBROUTINE M3_THR_WR2(D,CSTURB,PREDTH1,PD,PLEPS,PSQRT_TKE,PBLL_O_E,PEMOIST,PDTDZ,PM3_THR_WR2)
+SUBROUTINE M3_THR_WR2(D,CSTURB,TURBN,PREDTH1,PD,PLEPS,PSQRT_TKE,PBLL_O_E,PEMOIST,PDTDZ,PM3_THR_WR2)
   TYPE(DIMPHYEX_t),                   INTENT(IN) :: D
   TYPE(CSTURB_t),                     INTENT(IN) :: CSTURB
+  TYPE(TURB_t),                    INTENT(IN)    :: TURBN
   REAL, DIMENSION(D%NIJT,D%NKT), INTENT(IN) :: PREDTH1
   REAL, DIMENSION(D%NIJT,D%NKT), INTENT(IN) :: PD
   REAL, DIMENSION(D%NIJT,D%NKT), INTENT(IN) :: PLEPS
@@ -2687,16 +2721,17 @@ SUBROUTINE M3_THR_WR2(D,CSTURB,PREDTH1,PD,PLEPS,PSQRT_TKE,PBLL_O_E,PEMOIST,PDTDZ
   REAL, DIMENSION(D%NIJT,D%NKT), INTENT(IN) :: PDTDZ
   REAL, DIMENSION(D%NIJT,D%NKT),INTENT(OUT) :: PM3_THR_WR2
 !
-REAL(KIND=JPRB) :: ZHOOK_HANDLE
+REAL(KIND=JPHOOK) :: ZHOOK_HANDLE
 IF (LHOOK) CALL DR_HOOK('MODE_PRANDTL:M3_THR_WR2',0,ZHOOK_HANDLE)
-CALL M3_THR_WTH2(D,CSTURB,PREDTH1,PD,PLEPS,PSQRT_TKE,PBLL_O_E,PEMOIST,PDTDZ,PM3_THR_WR2)
+CALL M3_THR_WTH2(D,CSTURB,TURBN,PREDTH1,PD,PLEPS,PSQRT_TKE,PBLL_O_E,PEMOIST,PDTDZ,PM3_THR_WR2)
 !
 IF (LHOOK) CALL DR_HOOK('MODE_PRANDTL:M3_THR_WR2',1,ZHOOK_HANDLE)
 END SUBROUTINE M3_THR_WR2
 !----------------------------------------------------------------------------
-SUBROUTINE D_M3_THR_WR2_O_DDRDZ(D,CSTURB,PREDR1,PREDTH1,PD,PLEPS,PSQRT_TKE,PBLL_O_E,PEMOIST,PDTDZ,PD_M3_THR_WR2_O_DDRDZ)
+SUBROUTINE D_M3_THR_WR2_O_DDRDZ(D,CSTURB,TURBN,PREDR1,PREDTH1,PD,PLEPS,PSQRT_TKE,PBLL_O_E,PEMOIST,PDTDZ,PD_M3_THR_WR2_O_DDRDZ)
   TYPE(DIMPHYEX_t),                   INTENT(IN) :: D
   TYPE(CSTURB_t),                     INTENT(IN) :: CSTURB
+  TYPE(TURB_t),                    INTENT(IN)    :: TURBN
   REAL, DIMENSION(D%NIJT,D%NKT), INTENT(IN) :: PREDR1
   REAL, DIMENSION(D%NIJT,D%NKT), INTENT(IN) :: PREDTH1
   REAL, DIMENSION(D%NIJT,D%NKT), INTENT(IN) :: PD
@@ -2707,16 +2742,17 @@ SUBROUTINE D_M3_THR_WR2_O_DDRDZ(D,CSTURB,PREDR1,PREDTH1,PD,PLEPS,PSQRT_TKE,PBLL_
   REAL, DIMENSION(D%NIJT,D%NKT), INTENT(IN) :: PDTDZ
   REAL, DIMENSION(D%NIJT,D%NKT),INTENT(OUT) :: PD_M3_THR_WR2_O_DDRDZ
 !
-REAL(KIND=JPRB) :: ZHOOK_HANDLE
+REAL(KIND=JPHOOK) :: ZHOOK_HANDLE
 IF (LHOOK) CALL DR_HOOK('MODE_PRANDTL:D_M3_THR_WR2_O_DDRDZ',0,ZHOOK_HANDLE)
-CALL D_M3_THR_WTH2_O_DDTDZ(D,CSTURB,PREDR1,PREDTH1,PD,PLEPS,PSQRT_TKE,PBLL_O_E,PEMOIST,PDTDZ,PD_M3_THR_WR2_O_DDRDZ)
+CALL D_M3_THR_WTH2_O_DDTDZ(D,CSTURB,TURBN,PREDR1,PREDTH1,PD,PLEPS,PSQRT_TKE,PBLL_O_E,PEMOIST,PDTDZ,PD_M3_THR_WR2_O_DDRDZ)
 !
 IF (LHOOK) CALL DR_HOOK('MODE_PRANDTL:D_M3_THR_WR2_O_DDRDZ',1,ZHOOK_HANDLE)
 END SUBROUTINE D_M3_THR_WR2_O_DDRDZ
 !----------------------------------------------------------------------------
-SUBROUTINE D_M3_THR_WR2_O_DDTDZ(D,CSTURB,PREDR1,PREDTH1,PD,PLEPS,PSQRT_TKE,PBLL_O_E,PEMOIST,PD_M3_THR_WR2_O_DDTDZ)
+SUBROUTINE D_M3_THR_WR2_O_DDTDZ(D,CSTURB,TURBN,PREDR1,PREDTH1,PD,PLEPS,PSQRT_TKE,PBLL_O_E,PEMOIST,PD_M3_THR_WR2_O_DDTDZ)
   TYPE(DIMPHYEX_t),                   INTENT(IN) :: D
   TYPE(CSTURB_t),                     INTENT(IN) :: CSTURB
+  TYPE(TURB_t),                    INTENT(IN)    :: TURBN
   REAL, DIMENSION(D%NIJT,D%NKT), INTENT(IN) :: PREDR1
   REAL, DIMENSION(D%NIJT,D%NKT), INTENT(IN) :: PREDTH1
   REAL, DIMENSION(D%NIJT,D%NKT), INTENT(IN) :: PD
@@ -2726,16 +2762,17 @@ SUBROUTINE D_M3_THR_WR2_O_DDTDZ(D,CSTURB,PREDR1,PREDTH1,PD,PLEPS,PSQRT_TKE,PBLL_
   REAL, DIMENSION(D%NIJT,D%NKT), INTENT(IN) :: PEMOIST
   REAL, DIMENSION(D%NIJT,D%NKT),INTENT(OUT) :: PD_M3_THR_WR2_O_DDTDZ
 !
-REAL(KIND=JPRB) :: ZHOOK_HANDLE
+REAL(KIND=JPHOOK) :: ZHOOK_HANDLE
 IF (LHOOK) CALL DR_HOOK('MODE_PRANDTL:D_M3_THR_WR2_O_DDTDZ',0,ZHOOK_HANDLE)
-CALL D_M3_THR_WTH2_O_DDRDZ(D,CSTURB,PREDR1,PREDTH1,PD,PLEPS,PSQRT_TKE,PBLL_O_E,PEMOIST,PD_M3_THR_WR2_O_DDTDZ)
+CALL D_M3_THR_WTH2_O_DDRDZ(D,CSTURB,TURBN,PREDR1,PREDTH1,PD,PLEPS,PSQRT_TKE,PBLL_O_E,PEMOIST,PD_M3_THR_WR2_O_DDTDZ)
 !
 IF (LHOOK) CALL DR_HOOK('MODE_PRANDTL:D_M3_THR_WR2_O_DDTDZ',1,ZHOOK_HANDLE)
 END SUBROUTINE D_M3_THR_WR2_O_DDTDZ
 !----------------------------------------------------------------------------
-SUBROUTINE M3_THR_W2R(D,CSTURB,PREDTH1,PD,PLM,PLEPS,PTKE,PDTDZ,PM3_THR_W2R)
+SUBROUTINE M3_THR_W2R(D,CSTURB,TURBN,PREDTH1,PD,PLM,PLEPS,PTKE,PDTDZ,PM3_THR_W2R)
   TYPE(DIMPHYEX_t),                   INTENT(IN) :: D
   TYPE(CSTURB_t),                     INTENT(IN) :: CSTURB
+  TYPE(TURB_t),                    INTENT(IN)    :: TURBN
   REAL, DIMENSION(D%NIJT,D%NKT), INTENT(IN) :: PREDTH1
   REAL, DIMENSION(D%NIJT,D%NKT), INTENT(IN) :: PD
   REAL, DIMENSION(D%NIJT,D%NKT), INTENT(IN) :: PLM
@@ -2744,16 +2781,17 @@ SUBROUTINE M3_THR_W2R(D,CSTURB,PREDTH1,PD,PLM,PLEPS,PTKE,PDTDZ,PM3_THR_W2R)
   REAL, DIMENSION(D%NIJT,D%NKT), INTENT(IN) :: PDTDZ
   REAL, DIMENSION(D%NIJT,D%NKT),INTENT(OUT) :: PM3_THR_W2R
 !
-REAL(KIND=JPRB) :: ZHOOK_HANDLE
+REAL(KIND=JPHOOK) :: ZHOOK_HANDLE
 IF (LHOOK) CALL DR_HOOK('MODE_PRANDTL:M3_THR_W2R',0,ZHOOK_HANDLE)
-CALL M3_THR_W2TH(D,CSTURB,PREDTH1,PD,PLM,PLEPS,PTKE,PDTDZ,PM3_THR_W2R)
+CALL M3_THR_W2TH(D,CSTURB,TURBN,PREDTH1,PD,PLM,PLEPS,PTKE,PDTDZ,PM3_THR_W2R)
 !
 IF (LHOOK) CALL DR_HOOK('MODE_PRANDTL:M3_THR_W2R',1,ZHOOK_HANDLE)
 END SUBROUTINE M3_THR_W2R
 !----------------------------------------------------------------------------
-SUBROUTINE D_M3_THR_W2R_O_DDRDZ(D,CSTURB,PREDR1,PREDTH1,PD,PLM,PLEPS,PTKE,PBLL_O_E,PDTDZ,PEMOIST,PD_M3_THR_W2R_O_DDRDZ)
+SUBROUTINE D_M3_THR_W2R_O_DDRDZ(D,CSTURB,TURBN,PREDR1,PREDTH1,PD,PLM,PLEPS,PTKE,PBLL_O_E,PDTDZ,PEMOIST,PD_M3_THR_W2R_O_DDRDZ)
   TYPE(DIMPHYEX_t),                   INTENT(IN) :: D
   TYPE(CSTURB_t),                     INTENT(IN) :: CSTURB
+  TYPE(TURB_t),                    INTENT(IN)    :: TURBN
   REAL, DIMENSION(D%NIJT,D%NKT), INTENT(IN) :: PREDR1
   REAL, DIMENSION(D%NIJT,D%NKT), INTENT(IN) :: PREDTH1
   REAL, DIMENSION(D%NIJT,D%NKT), INTENT(IN) :: PD
@@ -2765,16 +2803,17 @@ SUBROUTINE D_M3_THR_W2R_O_DDRDZ(D,CSTURB,PREDR1,PREDTH1,PD,PLM,PLEPS,PTKE,PBLL_O
   REAL, DIMENSION(D%NIJT,D%NKT), INTENT(IN) :: PEMOIST
   REAL, DIMENSION(D%NIJT,D%NKT),INTENT(OUT) :: PD_M3_THR_W2R_O_DDRDZ
 !
-REAL(KIND=JPRB) :: ZHOOK_HANDLE
+REAL(KIND=JPHOOK) :: ZHOOK_HANDLE
 IF (LHOOK) CALL DR_HOOK('MODE_PRANDTL:D_M3_THR_W2R_O_DDRDZ',0,ZHOOK_HANDLE)
-CALL D_M3_THR_W2TH_O_DDTDZ(D,CSTURB,PREDR1,PREDTH1,PD,PLM,PLEPS,PTKE,PBLL_O_E,PDTDZ,PEMOIST,PD_M3_THR_W2R_O_DDRDZ)
+CALL D_M3_THR_W2TH_O_DDTDZ(D,CSTURB,TURBN,PREDR1,PREDTH1,PD,PLM,PLEPS,PTKE,PBLL_O_E,PDTDZ,PEMOIST,PD_M3_THR_W2R_O_DDRDZ)
 !
 IF (LHOOK) CALL DR_HOOK('MODE_PRANDTL:D_M3_THR_W2R_O_DDRDZ',1,ZHOOK_HANDLE)
 END SUBROUTINE D_M3_THR_W2R_O_DDRDZ
 !----------------------------------------------------------------------------
-SUBROUTINE D_M3_THR_W2R_O_DDTDZ(D,CSTURB,PREDR1,PREDTH1,PD,PLM,PLEPS,PTKE,PD_M3_THR_W2R_O_DDTDZ)
+SUBROUTINE D_M3_THR_W2R_O_DDTDZ(D,CSTURB,TURBN,PREDR1,PREDTH1,PD,PLM,PLEPS,PTKE,PD_M3_THR_W2R_O_DDTDZ)
   TYPE(DIMPHYEX_t),                   INTENT(IN) :: D
   TYPE(CSTURB_t),                     INTENT(IN) :: CSTURB
+  TYPE(TURB_t),                    INTENT(IN)    :: TURBN
   REAL, DIMENSION(D%NIJT,D%NKT), INTENT(IN) :: PREDR1
   REAL, DIMENSION(D%NIJT,D%NKT), INTENT(IN) :: PREDTH1
   REAL, DIMENSION(D%NIJT,D%NKT), INTENT(IN) :: PD
@@ -2783,9 +2822,9 @@ SUBROUTINE D_M3_THR_W2R_O_DDTDZ(D,CSTURB,PREDR1,PREDTH1,PD,PLM,PLEPS,PTKE,PD_M3_
   REAL, DIMENSION(D%NIJT,D%NKT), INTENT(IN) :: PTKE
   REAL, DIMENSION(D%NIJT,D%NKT),INTENT(OUT) :: PD_M3_THR_W2R_O_DDTDZ
 !
-REAL(KIND=JPRB) :: ZHOOK_HANDLE
+REAL(KIND=JPHOOK) :: ZHOOK_HANDLE
 IF (LHOOK) CALL DR_HOOK('MODE_PRANDTL:D_M3_THR_W2R_O_DDTDZ',0,ZHOOK_HANDLE)
-CALL D_M3_THR_W2TH_O_DDRDZ(D,CSTURB,PREDR1,PREDTH1,PD,PLM,PLEPS,PTKE,PD_M3_THR_W2R_O_DDTDZ)
+CALL D_M3_THR_W2TH_O_DDRDZ(D,CSTURB,TURBN,PREDR1,PREDTH1,PD,PLM,PLEPS,PTKE,PD_M3_THR_W2R_O_DDTDZ)
 !
 IF (LHOOK) CALL DR_HOOK('MODE_PRANDTL:D_M3_THR_W2R_O_DDTDZ',1,ZHOOK_HANDLE)
 END SUBROUTINE D_M3_THR_W2R_O_DDTDZ
diff --git a/src/PHYEX/turb/mode_rmc01.f90 b/src/PHYEX/turb/mode_rmc01.f90
index cdd81bc62c496ee8377ba5b7ae852b66c676dd21..98f6db452f8880477d95205668fe0f53b25b4cbe 100644
--- a/src/PHYEX/turb/mode_rmc01.f90
+++ b/src/PHYEX/turb/mode_rmc01.f90
@@ -5,9 +5,8 @@
 MODULE MODE_RMC01
 IMPLICIT NONE
 CONTAINS
-SUBROUTINE RMC01(D,CST,CSTURB,HTURBLEN,PZZ,PDXX,PDYY,PDZZ,PDIRCOSZW,PSBL_DEPTH,PLMO,PLK,PLEPS)
-      USE PARKIND1, ONLY : JPRB
-      USE YOMHOOK , ONLY : LHOOK, DR_HOOK
+SUBROUTINE RMC01(D,CST,CSTURB,TURBN,PZZ,PDXX,PDYY,PDZZ,PDIRCOSZW,PSBL_DEPTH,PLMO,PLK,PLEPS)
+      USE YOMHOOK , ONLY : LHOOK, DR_HOOK, JPHOOK
 !     ##############################################################
 !
 !!****  *RMC01* -
@@ -49,6 +48,7 @@ USE MODD_PARAMETERS, ONLY: XUNDEF
 USE MODD_CST, ONLY : CST_t
 USE MODD_DIMPHYEX, ONLY: DIMPHYEX_t
 USE MODD_CTURB, ONLY: CSTURB_t
+USE MODD_TURB_n, ONLY: TURB_t
 !
 USE MODE_UPDATE_IIJU_PHY, ONLY: UPDATE_IIJU_PHY
 USE MODE_SBL_PHY, ONLY: BUSINGER_PHIM, BUSINGER_PHIE
@@ -63,7 +63,7 @@ IMPLICIT NONE
 TYPE(DIMPHYEX_t),         INTENT(IN)   :: D
 TYPE(CST_t),              INTENT(IN)   :: CST
 TYPE(CSTURB_t),           INTENT(IN)   :: CSTURB
-CHARACTER(LEN=4),         INTENT(IN)   :: HTURBLEN ! type of mixing length
+TYPE(TURB_t),             INTENT(IN)   :: TURBN
 REAL, DIMENSION(D%NIJT,D%NKT),   INTENT(IN)    :: PZZ   ! altitude of flux points
 REAL, DIMENSION(D%NIJT,D%NKT),   INTENT(IN)    :: PDXX  ! width of grid mesh (X dir)
 REAL, DIMENSION(D%NIJT,D%NKT),   INTENT(IN)    :: PDYY  ! width of grid mesh (Y dir)
@@ -103,7 +103,7 @@ REAL, DIMENSION(D%NIJT,D%NKT) :: ZDH  ! hor. grid mesh
 !         ---------------
 !
 ! horizontal boundaries
-REAL(KIND=JPRB) :: ZHOOK_HANDLE
+REAL(KIND=JPHOOK) :: ZHOOK_HANDLE
 IF (LHOOK) CALL DR_HOOK('RMC01',0,ZHOOK_HANDLE)
 IKTB=D%NKTB          
 IKTE=D%NKTE
@@ -157,7 +157,7 @@ CALL BUSINGER_PHIM(D,ZZ_O_LMO,ZPHIM)
 CALL BUSINGER_PHIE(D,CSTURB,ZZ_O_LMO,ZPHIE)
 !
 !-------------------------------------------------------------------------------
-SELECT CASE (HTURBLEN)
+SELECT CASE (TURBN%CTURBLEN)
 !-------------------------------------------------------------------------------
 !
 !*     3. altitude where turbulence is isotropic inside a layer of given width (3D case)
@@ -269,7 +269,7 @@ PLK(:,IKU) = PLK(:,IKE)
 !         --------------------------------------
 !
 !$mnh_expand_array(JIJ=IIJB:IIJE,JK=1:IKT)
-ZL(:,:) = ZL(:,:) * (CSTURB%XALPSBL**(3./2.)*CST%XKARMAN*CSTURB%XCED) &
+ZL(:,:) = ZL(:,:) * (CSTURB%XALPSBL**(3./2.)*CST%XKARMAN*TURBN%XCED) &
         / (CST%XKARMAN/SQRT(CSTURB%XALPSBL)/CSTURB%XCMFS)
 !$mnh_end_expand_array(JIJ=IIJB:IIJE,JK=1:IKT)
 !
diff --git a/src/PHYEX/turb/mode_sbl.f90 b/src/PHYEX/turb/mode_sbl.f90
index c219c43f422d073e7f1d3cc0f5743df1e6d9ecb9..1ccb9a47e061cb33e0179e140479c3c02b363806 100644
--- a/src/PHYEX/turb/mode_sbl.f90
+++ b/src/PHYEX/turb/mode_sbl.f90
@@ -39,8 +39,8 @@
 !!      V. Masson       06/11/02 optimization and add Businger fonction for TKE
 !!      V. Masson       01/01/03 use PAULSON_PSIM function
 !-----------------------------------------------------------------------------
-USE PARKIND1, ONLY : JPRB
-USE YOMHOOK , ONLY : LHOOK, DR_HOOK
+USE YOMHOOK , ONLY : LHOOK, DR_HOOK, JPHOOK
+IMPLICIT NONE
 !
 !*       0.    DECLARATIONS
 !
@@ -85,7 +85,7 @@ SUBROUTINE BUSINGER_PHIM_3D(PZ_O_LMO,BUSINGER_PHIM3D)
   REAL, DIMENSION(SIZE(PZ_O_LMO,1), &
                   SIZE(PZ_O_LMO,2),SIZE(PZ_O_LMO,3)),INTENT(OUT) :: BUSINGER_PHIM3D
 !
-  REAL(KIND=JPRB) :: ZHOOK_HANDLE
+  REAL(KIND=JPHOOK) :: ZHOOK_HANDLE
   IF (LHOOK) CALL DR_HOOK('MODE_SBL:BUSINGER_PHIM_3D',0,ZHOOK_HANDLE)
   WHERE ( PZ_O_LMO(:,:,:) < 0. )
     BUSINGER_PHIM3D(:,:,:) = (1.-15.*PZ_O_LMO)**(-0.25)
@@ -101,7 +101,7 @@ SUBROUTINE BUSINGER_PHIM_2D(PZ_O_LMO,BUSINGER_PHIM2D)
   REAL, DIMENSION(:,:), INTENT(IN)                   :: PZ_O_LMO
   REAL, DIMENSION(SIZE(PZ_O_LMO,1),SIZE(PZ_O_LMO,2)),INTENT(OUT) :: BUSINGER_PHIM2D
 !
-  REAL(KIND=JPRB) :: ZHOOK_HANDLE
+  REAL(KIND=JPHOOK) :: ZHOOK_HANDLE
   IF (LHOOK) CALL DR_HOOK('MODE_SBL:BUSINGER_PHIM_2D',0,ZHOOK_HANDLE)
   WHERE ( PZ_O_LMO(:,:) < 0. )
     BUSINGER_PHIM2D(:,:) = (1.-15.*PZ_O_LMO)**(-0.25)
@@ -117,7 +117,7 @@ SUBROUTINE BUSINGER_PHIM_1D(PZ_O_LMO,BUSINGER_PHIM1D)
   REAL, DIMENSION(:), INTENT(IN)  :: PZ_O_LMO
   REAL, DIMENSION(SIZE(PZ_O_LMO)),INTENT(OUT) :: BUSINGER_PHIM1D
 !
-  REAL(KIND=JPRB) :: ZHOOK_HANDLE
+  REAL(KIND=JPHOOK) :: ZHOOK_HANDLE
   IF (LHOOK) CALL DR_HOOK('MODE_SBL:BUSINGER_PHIM_1D',0,ZHOOK_HANDLE)
   WHERE ( PZ_O_LMO(:) < 0. )
     BUSINGER_PHIM1D(:) = (1.-15.*PZ_O_LMO)**(-0.25)
@@ -133,7 +133,7 @@ SUBROUTINE BUSINGER_PHIM_0D(PZ_O_LMO,BUSINGER_PHIM0D)
   REAL, INTENT(IN)                   :: PZ_O_LMO
   REAL,INTENT(OUT)                   :: BUSINGER_PHIM0D
 !
-  REAL(KIND=JPRB) :: ZHOOK_HANDLE
+  REAL(KIND=JPHOOK) :: ZHOOK_HANDLE
   IF (LHOOK) CALL DR_HOOK('MODE_SBL:BUSINGER_PHIM_0D',0,ZHOOK_HANDLE)
   IF ( PZ_O_LMO < 0. ) THEN
     BUSINGER_PHIM0D = (1.-15.*PZ_O_LMO)**(-0.25)
@@ -151,7 +151,7 @@ SUBROUTINE BUSINGER_PHIH_3D(PZ_O_LMO,BUSINGER_PHIH3D)
   REAL, DIMENSION(SIZE(PZ_O_LMO,1), &
                   SIZE(PZ_O_LMO,2),SIZE(PZ_O_LMO,3)),INTENT(OUT) :: BUSINGER_PHIH3D
 !
-  REAL(KIND=JPRB) :: ZHOOK_HANDLE
+  REAL(KIND=JPHOOK) :: ZHOOK_HANDLE
   IF (LHOOK) CALL DR_HOOK('MODE_SBL:BUSINGER_PHIH_3D',0,ZHOOK_HANDLE)
   WHERE ( PZ_O_LMO(:,:,:) < 0. )
     BUSINGER_PHIH3D(:,:,:) = 0.74 * (1.-9.*PZ_O_LMO)**(-0.5)
@@ -167,7 +167,7 @@ SUBROUTINE BUSINGER_PHIH_2D(PZ_O_LMO,BUSINGER_PHIH2D)
   REAL, DIMENSION(:,:), INTENT(IN)                   :: PZ_O_LMO
   REAL, DIMENSION(SIZE(PZ_O_LMO,1),SIZE(PZ_O_LMO,2)),INTENT(OUT) :: BUSINGER_PHIH2D
 !
-  REAL(KIND=JPRB) :: ZHOOK_HANDLE
+  REAL(KIND=JPHOOK) :: ZHOOK_HANDLE
   IF (LHOOK) CALL DR_HOOK('MODE_SBL:BUSINGER_PHIH_2D',0,ZHOOK_HANDLE)
   WHERE ( PZ_O_LMO(:,:) < 0. )
     BUSINGER_PHIH2D(:,:) = 0.74 * (1.-9.*PZ_O_LMO)**(-0.5)
@@ -183,7 +183,7 @@ SUBROUTINE BUSINGER_PHIH_1D(PZ_O_LMO,BUSINGER_PHIH1D)
   REAL, DIMENSION(:), INTENT(IN)  :: PZ_O_LMO
   REAL, DIMENSION(SIZE(PZ_O_LMO)),INTENT(OUT) :: BUSINGER_PHIH1D
 !
-  REAL(KIND=JPRB) :: ZHOOK_HANDLE
+  REAL(KIND=JPHOOK) :: ZHOOK_HANDLE
   IF (LHOOK) CALL DR_HOOK('MODE_SBL:BUSINGER_PHIH_1D',0,ZHOOK_HANDLE)
   WHERE ( PZ_O_LMO(:) < 0. )
     BUSINGER_PHIH1D(:) = 0.74 * (1.-9.*PZ_O_LMO)**(-0.5)
@@ -199,7 +199,7 @@ SUBROUTINE BUSINGER_PHIH_0D(PZ_O_LMO,BUSINGER_PHIH0D)
   REAL, INTENT(IN)                   :: PZ_O_LMO
   REAL,INTENT(OUT)                   :: BUSINGER_PHIH0D
 !
-  REAL(KIND=JPRB) :: ZHOOK_HANDLE
+  REAL(KIND=JPHOOK) :: ZHOOK_HANDLE
   IF (LHOOK) CALL DR_HOOK('MODE_SBL:BUSINGER_PHIH_0D',0,ZHOOK_HANDLE)
   IF ( PZ_O_LMO < 0. ) THEN
     BUSINGER_PHIH0D = 0.74 * (1.-9.*PZ_O_LMO)**(-0.5)
@@ -218,7 +218,7 @@ SUBROUTINE BUSINGER_PHIE_3D(PZ_O_LMO,BUSINGER_PHIE3D)
   REAL, DIMENSION(SIZE(PZ_O_LMO,1), &
                   SIZE(PZ_O_LMO,2),SIZE(PZ_O_LMO,3)),INTENT(OUT) :: BUSINGER_PHIE3D
 !
-  REAL(KIND=JPRB) :: ZHOOK_HANDLE
+  REAL(KIND=JPHOOK) :: ZHOOK_HANDLE
   IF (LHOOK) CALL DR_HOOK('MODE_SBL:BUSINGER_PHIE_3D',0,ZHOOK_HANDLE)
   WHERE ( PZ_O_LMO(:,:,:) < 0. )
     BUSINGER_PHIE3D(:,:,:) =   (1.+(-PZ_O_LMO)**(2./3.)/XALPSBL) &
@@ -239,7 +239,7 @@ SUBROUTINE PAULSON_PSIM_2D(PZ_O_LMO,PAULSON_PSIM2D)
 !
   REAL, DIMENSION(SIZE(PZ_O_LMO,1),SIZE(PZ_O_LMO,2)) :: ZX
 
-  REAL(KIND=JPRB) :: ZHOOK_HANDLE
+  REAL(KIND=JPHOOK) :: ZHOOK_HANDLE
   IF (LHOOK) CALL DR_HOOK('MODE_SBL:PAULSON_PSIM_2D',0,ZHOOK_HANDLE)
   ZX=1.
   WHERE ( PZ_O_LMO(:,:) < 0. )
@@ -260,7 +260,7 @@ SUBROUTINE PAULSON_PSIM_1D(PZ_O_LMO,PAULSON_PSIM1D)
 !
   REAL, DIMENSION(SIZE(PZ_O_LMO,1)) :: ZX
 
-  REAL(KIND=JPRB) :: ZHOOK_HANDLE
+  REAL(KIND=JPHOOK) :: ZHOOK_HANDLE
   IF (LHOOK) CALL DR_HOOK('MODE_SBL:PAULSON_PSIM_1D',0,ZHOOK_HANDLE)
   ZX=1.
   WHERE ( PZ_O_LMO(:) < 0. )
@@ -281,7 +281,7 @@ SUBROUTINE PAULSON_PSIM_0D(PZ_O_LMO,PAULSON_PSIM0D)
 !
   REAL                :: ZX
 
-  REAL(KIND=JPRB) :: ZHOOK_HANDLE
+  REAL(KIND=JPHOOK) :: ZHOOK_HANDLE
   IF (LHOOK) CALL DR_HOOK('MODE_SBL:PAULSON_PSIM_0D',0,ZHOOK_HANDLE)
   ZX=1.
   IF ( PZ_O_LMO < 0. ) THEN
@@ -298,7 +298,7 @@ END SUBROUTINE PAULSON_PSIM_0D
 !
 SUBROUTINE LMO_2D(PUSTAR,PTHETA,PRV,PSFTH,PSFRV,LMO2D)
   USE MODD_CST
-  USE MODD_PARAMETERS, ONLY: JPVEXT_TURB,XUNDEF
+  USE MODD_PARAMETERS, ONLY: XUNDEF
   REAL, DIMENSION(:,:), INTENT(IN)               :: PUSTAR
   REAL, DIMENSION(:,:), INTENT(IN)               :: PTHETA
   REAL, DIMENSION(:,:), INTENT(IN)               :: PRV
@@ -311,7 +311,7 @@ SUBROUTINE LMO_2D(PUSTAR,PTHETA,PRV,PSFTH,PSFRV,LMO2D)
   REAL                                           :: ZEPS
 !
 !
-  REAL(KIND=JPRB) :: ZHOOK_HANDLE
+  REAL(KIND=JPHOOK) :: ZHOOK_HANDLE
   IF (LHOOK) CALL DR_HOOK('MODE_SBL:LMO_2D',0,ZHOOK_HANDLE)
   ZEPS=(XRV-XRD)/XRD
   ZTHETAV(:,:) = PTHETA(:,:) * ( 1. +ZEPS * PRV(:,:))
@@ -329,7 +329,7 @@ END SUBROUTINE LMO_2D
 !
 SUBROUTINE LMO_1D(PUSTAR,PTHETA,PRV,PSFTH,PSFRV,LMO1D)
   USE MODD_CST
-  USE MODD_PARAMETERS, ONLY: JPVEXT_TURB,XUNDEF
+  USE MODD_PARAMETERS, ONLY: XUNDEF
   REAL, DIMENSION(:), INTENT(IN)  :: PUSTAR
   REAL, DIMENSION(:), INTENT(IN)  :: PTHETA
   REAL, DIMENSION(:), INTENT(IN)  :: PRV
@@ -341,7 +341,7 @@ SUBROUTINE LMO_1D(PUSTAR,PTHETA,PRV,PSFTH,PSFRV,LMO1D)
   REAL                                           :: ZEPS
 !
 !
-  REAL(KIND=JPRB) :: ZHOOK_HANDLE
+  REAL(KIND=JPHOOK) :: ZHOOK_HANDLE
   IF (LHOOK) CALL DR_HOOK('MODE_SBL:LMO_1D',0,ZHOOK_HANDLE)
   ZEPS=(XRV-XRD)/XRD
 !
@@ -359,7 +359,7 @@ END SUBROUTINE LMO_1D
 !
 SUBROUTINE LMO_0D(PUSTAR,PTHETA,PRV,PSFTH,PSFRV,LMO0D)
   USE MODD_CST
-  USE MODD_PARAMETERS, ONLY: JPVEXT_TURB,XUNDEF
+  USE MODD_PARAMETERS, ONLY: XUNDEF
   REAL, INTENT(IN)  :: PUSTAR
   REAL, INTENT(IN)  :: PTHETA
   REAL, INTENT(IN)  :: PRV
@@ -371,7 +371,7 @@ SUBROUTINE LMO_0D(PUSTAR,PTHETA,PRV,PSFTH,PSFRV,LMO0D)
   REAL              :: ZEPS
 !
 !
-  REAL(KIND=JPRB) :: ZHOOK_HANDLE
+  REAL(KIND=JPHOOK) :: ZHOOK_HANDLE
   IF (LHOOK) CALL DR_HOOK('MODE_SBL:LMO_0D',0,ZHOOK_HANDLE)
   ZEPS=(XRV-XRD)/XRD
 !
@@ -391,7 +391,7 @@ END SUBROUTINE LMO_0D
 !
 SUBROUTINE USTAR_2D(PU,PV,PZ,PZ0,PLMO,USTAR2D)
   USE MODD_CST
-  USE MODD_PARAMETERS, ONLY: JPVEXT_TURB,XUNDEF
+  USE MODD_PARAMETERS, ONLY: XUNDEF
   REAL, DIMENSION(:,:), INTENT(IN)               :: PU
   REAL, DIMENSION(:,:), INTENT(IN)               :: PV
   REAL, DIMENSION(:,:), INTENT(IN)               :: PZ
@@ -404,7 +404,7 @@ SUBROUTINE USTAR_2D(PU,PV,PZ,PZ0,PLMO,USTAR2D)
   REAL, DIMENSION(SIZE(PU,1),SIZE(PU,2))         :: ZWORK1,ZWORK2
 !
 !* purely unstable case
-  REAL(KIND=JPRB) :: ZHOOK_HANDLE
+  REAL(KIND=JPHOOK) :: ZHOOK_HANDLE
   IF (LHOOK) CALL DR_HOOK('MODE_SBL:USTAR_2D',0,ZHOOK_HANDLE)
   USTAR2D(:,:) = 0.
   ZZ_O_LMO(:,:) = XUNDEF
@@ -435,7 +435,7 @@ END SUBROUTINE USTAR_2D
 !
 SUBROUTINE USTAR_1D(PU,PV,PZ,PZ0,PLMO,USTAR1D)
   USE MODD_CST
-  USE MODD_PARAMETERS, ONLY: JPVEXT_TURB,XUNDEF
+  USE MODD_PARAMETERS, ONLY: XUNDEF
   REAL, DIMENSION(:), INTENT(IN)               :: PU
   REAL, DIMENSION(:), INTENT(IN)               :: PV
   REAL, DIMENSION(:), INTENT(IN)               :: PZ
@@ -448,7 +448,7 @@ SUBROUTINE USTAR_1D(PU,PV,PZ,PZ0,PLMO,USTAR1D)
   REAL, DIMENSION(SIZE(PU))                    :: ZWORK1,ZWORK2
 !
 !* purely unstable case
-  REAL(KIND=JPRB) :: ZHOOK_HANDLE
+  REAL(KIND=JPHOOK) :: ZHOOK_HANDLE
   IF (LHOOK) CALL DR_HOOK('MODE_SBL:USTAR_1D',0,ZHOOK_HANDLE)
   USTAR1D(:) = 0.
   ZZ_O_LMO(:) = XUNDEF
@@ -479,17 +479,17 @@ END SUBROUTINE USTAR_1D
 !
 SUBROUTINE USTAR_0D(PU,PV,PZ,PZ0,PLMO,USTAR0D)
   USE MODD_CST
-  USE MODD_PARAMETERS, ONLY: JPVEXT_TURB,XUNDEF
+  USE MODD_PARAMETERS, ONLY: XUNDEF
   REAL, INTENT(IN)               :: PU
   REAL, INTENT(IN)               :: PV
   REAL, INTENT(IN)               :: PZ
   REAL, INTENT(IN)               :: PZ0
   REAL, INTENT(IN)               :: PLMO
   REAL, INTENT(OUT)              :: USTAR0D
-  REAL :: ZWORK, ZWORK2
+  REAL :: ZWORK1, ZWORK2
 !
 !* purely unstable case
-  REAL(KIND=JPRB) :: ZHOOK_HANDLE
+  REAL(KIND=JPHOOK) :: ZHOOK_HANDLE
   IF (LHOOK) CALL DR_HOOK('MODE_SBL:USTAR_0D',0,ZHOOK_HANDLE)
   USTAR0D = 0.
 !
diff --git a/src/PHYEX/turb/mode_sbl_depth.f90 b/src/PHYEX/turb/mode_sbl_depth.f90
index 351b732f54cf3d143386566806c333778ceac496..8da65ac5643dc573d4e5706c1a4b76cbb8456464 100644
--- a/src/PHYEX/turb/mode_sbl_depth.f90
+++ b/src/PHYEX/turb/mode_sbl_depth.f90
@@ -7,8 +7,7 @@ IMPLICIT NONE
 CONTAINS
 !     ######spl
       SUBROUTINE SBL_DEPTH(D,CSTURB,PZZ,PFLXU,PFLXV,PWTHV,PLMO,PSBL_DEPTH)
-      USE PARKIND1, ONLY : JPRB
-      USE YOMHOOK , ONLY : LHOOK, DR_HOOK
+      USE YOMHOOK , ONLY : LHOOK, DR_HOOK, JPHOOK
 !     #################################################################
 !
 !
@@ -86,7 +85,7 @@ REAL, DIMENSION(D%NIJT) :: ZA       ! ponderation coefficient
 !* initialisations
 !
 !
-REAL(KIND=JPRB) :: ZHOOK_HANDLE
+REAL(KIND=JPHOOK) :: ZHOOK_HANDLE
 IF (LHOOK) CALL DR_HOOK('SBL_DEPTH',0,ZHOOK_HANDLE)
 !
 IKB=D%NKTB
@@ -131,7 +130,7 @@ ZSBL_THER(:)= CSTURB%XSBL_O_BL * ZSBL_THER(:)
 PSBL_DEPTH(:) = 0.
 !$mnh_expand_where(JIJ=IIJB:IIJE)
 WHERE (ZSBL_THER(:)> 0. .AND. ZSBL_DYN(:)> 0.) 
-  PSBL_DEPTH = MIN(ZSBL_THER(:),ZSBL_DYN(:))
+  PSBL_DEPTH(:) = MIN(ZSBL_THER(:),ZSBL_DYN(:))
 END WHERE
 !$mnh_end_expand_where(JIJ=IIJB:IIJE)
 !
diff --git a/src/PHYEX/turb/mode_sbl_phy.f90 b/src/PHYEX/turb/mode_sbl_phy.f90
index fcf58f980249bfde88387bf499b8aedf3cab1061..f4e17e1ab94f004f7848f9771f303e7e8a55af64 100644
--- a/src/PHYEX/turb/mode_sbl_phy.f90
+++ b/src/PHYEX/turb/mode_sbl_phy.f90
@@ -39,8 +39,7 @@
 !!      V. Masson       06/11/02 optimization and add Businger fonction for TKE
 !!      V. Masson       01/01/03 use PAULSON_PSIM function
 !-----------------------------------------------------------------------------
-USE PARKIND1, ONLY : JPRB
-USE YOMHOOK , ONLY : LHOOK, DR_HOOK
+USE YOMHOOK , ONLY : LHOOK, DR_HOOK, JPHOOK
 !
 IMPLICIT NONE
 !-------------------------------------------------------------------------------
@@ -57,7 +56,7 @@ TYPE(DIMPHYEX_t),                   INTENT(IN)  :: D
 REAL, DIMENSION(D%NIJT,D%NKT), INTENT(IN)  :: PZ_O_LMO
 REAL, DIMENSION(D%NIJT,D%NKT), INTENT(OUT) :: BUSINGERPHIM
 !
-REAL(KIND=JPRB) :: ZHOOK_HANDLE
+REAL(KIND=JPHOOK) :: ZHOOK_HANDLE
 INTEGER :: JIJ,JK,IIJB,IIJE,IKT
 !
 IF (LHOOK) CALL DR_HOOK('MODE_SBL:BUSINGER_PHIM',0,ZHOOK_HANDLE)
@@ -88,7 +87,7 @@ TYPE(DIMPHYEX_t),                   INTENT(IN)  :: D
 REAL, DIMENSION(D%NIJT,D%NKT), INTENT(IN)  :: PZ_O_LMO
 REAL, DIMENSION(D%NIJT,D%NKT), INTENT(OUT) :: BUSINGERPHIH
 !
-REAL(KIND=JPRB) :: ZHOOK_HANDLE
+REAL(KIND=JPHOOK) :: ZHOOK_HANDLE
 INTEGER :: JIJ,JK,IIJB,IIJE,IKT
 !
 IF (LHOOK) CALL DR_HOOK('MODE_SBL:BUSINGER_PHIH',0,ZHOOK_HANDLE)
@@ -120,7 +119,7 @@ TYPE(CSTURB_t),                     INTENT(IN)   :: CSTURB
 REAL, DIMENSION(D%NIJT,D%NKT), INTENT(IN)   :: PZ_O_LMO
 REAL, DIMENSION(D%NIJT,D%NKT), INTENT(OUT)  :: BUSINGERPHIE
 !
-REAL(KIND=JPRB) :: ZHOOK_HANDLE
+REAL(KIND=JPHOOK) :: ZHOOK_HANDLE
 INTEGER :: JIJ,JK,IIJB,IIJE,IKT
 !
 IF (LHOOK) CALL DR_HOOK('MODE_SBL:BUSINGER_PHIE',0,ZHOOK_HANDLE)
@@ -143,7 +142,7 @@ END SUBROUTINE BUSINGER_PHIE
 SUBROUTINE LMO(D,CST,PUSTAR,PTHETA,PRV,PSFTH,PSFRV,PLMO)
   USE MODD_DIMPHYEX, ONLY: DIMPHYEX_t
   USE MODD_CST, ONLY: CST_t
-  USE MODD_PARAMETERS, ONLY: JPVEXT_TURB,XUNDEF
+  USE MODD_PARAMETERS, ONLY: XUNDEF
   !
   TYPE(DIMPHYEX_t),        INTENT(IN)  :: D
   TYPE(CST_t),             INTENT(IN)  :: CST
@@ -158,7 +157,7 @@ SUBROUTINE LMO(D,CST,PUSTAR,PTHETA,PRV,PSFTH,PSFRV,PLMO)
   REAL                            :: ZEPS
   INTEGER :: IIJB,IIJE, JIJ,IKT
 !
-  REAL(KIND=JPRB) :: ZHOOK_HANDLE
+  REAL(KIND=JPHOOK) :: ZHOOK_HANDLE
   IF (LHOOK) CALL DR_HOOK('MODE_SBL:LMO',0,ZHOOK_HANDLE)
 !
   IIJE=D%NIJE
diff --git a/src/PHYEX/turb/mode_thl_rt_from_th_r_mf.f90 b/src/PHYEX/turb/mode_thl_rt_from_th_r_mf.f90
index 59c68a39727156ea751af1d1e622f02d24ca0ab0..cd56c9dcfea18b326a2aff8775dd63c40bb3240a 100644
--- a/src/PHYEX/turb/mode_thl_rt_from_th_r_mf.f90
+++ b/src/PHYEX/turb/mode_thl_rt_from_th_r_mf.f90
@@ -49,8 +49,7 @@ CONTAINS
 !
 USE MODD_DIMPHYEX,        ONLY: DIMPHYEX_t
 USE MODD_CST, ONLY : CST_t
-USE PARKIND1, ONLY : JPRB
-USE YOMHOOK , ONLY : LHOOK, DR_HOOK
+USE YOMHOOK , ONLY : LHOOK, DR_HOOK, JPHOOK
 !
 IMPLICIT NONE
 !
@@ -81,7 +80,7 @@ REAL, DIMENSION(D%NIJT,D%NKT) :: ZLVOCPEXN, ZLSOCPEXN
 INTEGER :: JRR, JIJ, JK
 INTEGER :: IIJB,IIJE ! physical horizontal domain indices
 INTEGER :: IKT
-REAL(KIND=JPRB) :: ZHOOK_HANDLE
+REAL(KIND=JPHOOK) :: ZHOOK_HANDLE
 !----------------------------------------------------------------------------
 !
 !
diff --git a/src/PHYEX/turb/mode_tke_eps_sources.f90 b/src/PHYEX/turb/mode_tke_eps_sources.f90
index ef2af6385bb73cc3853bb6998a045dea8c4e445f..b6f059aa2f0408bd48501e491acae9c940ccca44 100644
--- a/src/PHYEX/turb/mode_tke_eps_sources.f90
+++ b/src/PHYEX/turb/mode_tke_eps_sources.f90
@@ -7,7 +7,7 @@ MODULE MODE_TKE_EPS_SOURCES
 IMPLICIT NONE
 CONTAINS
       SUBROUTINE TKE_EPS_SOURCES(D,CST,CSTURB,BUCONF,TURBN,TLES,       &
-                    & HPROGRAM, KMI,PTKEM,PLM,PLEPS,PDP,               &
+                    & PTKEM,PLM,PLEPS,PDP,                             &
                     & PTRH,PRHODJ,PDZZ,PDXX,PDYY,PDZX,PDZY,PZZ,        &
                     & PTSTEP,PEXPL,                                    &
                     & TPFILE,ODIAG_IN_RUN,OOCEAN,                      &
@@ -60,10 +60,10 @@ CONTAINS
 !!      Module MODD_CTURB: contains the set of constants for
 !!                        the turbulence scheme
 !!
-!!           CSTURB%XCET,CSTURB%XCED  : transport and dissipation cts. for the TKE
+!!           CSTURB%XCET,TURBN%XCED  : transport and dissipation cts. for the TKE
 !!           XCDP,XCDD,XCDT: constants from the parameterization of
 !!                        the K-epsilon equation
-!!           CSTURB%XTKEMIN,XEPSMIN : minimum values for the TKE and its
+!!           TURBN%XTKEMIN,XEPSMIN : minimum values for the TKE and its
 !!                        dissipation
 !!
 !!      Module MODD_PARAMETERS: 
@@ -127,19 +127,17 @@ CONTAINS
 !*       0.   DECLARATIONS
 !             ------------
 !
-USE PARKIND1,   ONLY: JPRB
 USE MODE_SHUMAN_PHY, ONLY: MZM_PHY, MZF_PHY, DZF_PHY, DZM_PHY
-USE YOMHOOK,    ONLY: LHOOK, DR_HOOK
+USE YOMHOOK,    ONLY: LHOOK, DR_HOOK, JPHOOK
 !
 USE MODD_ARGSLIST_ll,    ONLY: LIST_ll
-USE MODD_BUDGET,         ONLY: TBUDGETCONF_t, NBUDGET_TKE, NBUDGET_TH, TBUDGETDATA
+USE MODD_BUDGET,         ONLY: TBUDGETCONF_t, NBUDGET_TKE, TBUDGETDATA
 USE MODD_CST,            ONLY: CST_t
 USE MODD_CTURB,          ONLY: CSTURB_t
 USE MODD_DIMPHYEX,       ONLY: DIMPHYEX_t
 USE MODD_FIELD,          ONLY: TFIELDMETADATA, TYPEREAL
 USE MODD_IO,             ONLY: TFILEDATA
 USE MODD_LES,            ONLY: TLES_t
-USE MODD_PARAMETERS,     ONLY: JPVEXT_TURB
 USE MODD_TURB_n,         ONLY: TURB_t
 !
 USE MODE_BUDGET_PHY,         ONLY: BUDGET_STORE_ADD_PHY, BUDGET_STORE_END_PHY, BUDGET_STORE_INIT_PHY
@@ -164,8 +162,6 @@ TYPE(CSTURB_t),          INTENT(IN)   :: CSTURB
 TYPE(TBUDGETCONF_t),     INTENT(IN)   :: BUCONF
 TYPE(TURB_t),            INTENT(IN)   :: TURBN
 TYPE(TLES_t),            INTENT(INOUT):: TLES
-CHARACTER(LEN=6),        INTENT(IN)   ::  HPROGRAM     ! CPROGRAM is the program currently running (modd_conf)
-INTEGER,                 INTENT(IN)   ::  KMI          ! model index number  
 REAL, DIMENSION(D%NIJT,D%NKT),  INTENT(IN)   ::  PTKEM        ! TKE at t-deltat
 REAL, DIMENSION(D%NIJT,D%NKT),  INTENT(IN)   ::  PLM          ! mixing length         
 REAL, DIMENSION(D%NIJT,D%NKT),  INTENT(IN)   ::  PLEPS        ! dissipative length
@@ -219,7 +215,7 @@ INTEGER             :: IIJB,IIJE,IKB,IKE,IKT,IKA,IKL  ! Index value for the mass
 TYPE(LIST_ll), POINTER :: TZFIELDDISS_ll ! list of fields to exchange
 INTEGER                :: IINFO_ll       ! return code of parallel routine
 TYPE(TFIELDMETADATA)   :: TZFIELD
-REAL(KIND=JPRB) :: ZHOOK_HANDLE
+REAL(KIND=JPHOOK) :: ZHOOK_HANDLE
 INTEGER :: JIJ,JK
 !
 !----------------------------------------------------------------------------
@@ -282,7 +278,7 @@ CALL MZM_PHY(D,ZKEFF,ZMWORK1)
 CALL MZM_PHY(D,PRHODJ,ZMWORK2)
 !
 !$mnh_expand_array(JIJ=IIJB:IIJE,JK=1:IKT)
-ZFLX(:,:) = CSTURB%XCED * SQRT(PTKEM(:,:)) / PLEPS(:,:)
+ZFLX(:,:) = TURBN%XCED * SQRT(PTKEM(:,:)) / PLEPS(:,:)
 ZSOURCE(:,:) = ( PRTKES(:,:) +  PRTKEMS(:,:) ) &
                                      / PRHODJ(:,:) - PTKEM(:,:) / PTSTEP &
    + PDP(:,:) + PTP(:,:) + ZTR(:,:) & 
@@ -328,11 +324,11 @@ ENDIF
 !
 ! TKE must be greater than its minimum value
 ! CL : Now done at the end of the time step in ADVECTION_METSV for MesoNH
-IF(HPROGRAM/='MESONH') THEN
+IF(TURBN%LTKEMINTURB) THEN
  !$mnh_expand_where(JIJ=IIJB:IIJE,JK=1:IKT)
- GTKENEG(:,:) =  ZRES(:,:) <= CSTURB%XTKEMIN
+ GTKENEG(:,:) =  ZRES(:,:) <= TURBN%XTKEMIN
  WHERE ( GTKENEG(:,:) ) 
-   ZRES(:,:) = CSTURB%XTKEMIN
+   ZRES(:,:) = TURBN%XTKEMIN
  END WHERE
  !$mnh_end_expand_where(JIJ=IIJB:IIJE,JK=1:IKT)
 END IF
@@ -400,7 +396,7 @@ IF (BUCONF%LBUDGET_TKE) THEN
   !
   ! Dissipation
   !$mnh_expand_array(JIJ=IIJB:IIJE,JK=1:IKT)
-  ZMWORK1(:,:) = -CSTURB%XCED * SQRT(PTKEM(:,:))/PLEPS(:,:) * &
+  ZMWORK1(:,:) = -TURBN%XCED * SQRT(PTKEM(:,:))/PLEPS(:,:) * &
                 (PEXPL*PTKEM(:,:) + TURBN%XIMPL*ZRES(:,:))*PRHODJ(:,:)
   !$mnh_end_expand_array(JIJ=IIJB:IIJE,JK=1:IKT) 
   CALL BUDGET_STORE_ADD_PHY(D, TBUDGETS(NBUDGET_TKE), 'DISS',ZMWORK1)
@@ -411,19 +407,10 @@ END IF
 
 !Should be in IF LBUDGET_TKE only. Was removed out for a correct comput. of PTDIFF in case of LBUDGET_TKE=F in AROME
 !$mnh_expand_array(JIJ=IIJB:IIJE,JK=1:IKT)
-#ifdef REPRO48
-IF (BUCONF%LBUDGET_TKE) THEN
-PRTKES(:,:) = PRTKES(:,:) + PDP(:,:) * PRHODJ(:,:)
-PRTKES(:,:) = PRTKES(:,:) + PTP(:,:) * PRHODJ(:,:)
-PRTKES(:,:) = PRTKES(:,:) - CSTURB%XCED * SQRT(PTKEM(:,:)) / PLEPS(:,:) * &
-                (PEXPL*PTKEM(:,:) + TURBN%XIMPL*ZRES(:,:)) * PRHODJ(:,:)
-END IF
-#else
 PRTKES(:,:) = PRTKES(:,:) + PRHODJ(:,:) * &
                 ( PDP(:,:) + PTP(:,:)                           &
-                  - CSTURB%XCED * SQRT(PTKEM(:,:)) / PLEPS(:,:) &
+                  - TURBN%XCED * SQRT(PTKEM(:,:)) / PLEPS(:,:) &
                   * ( PEXPL*PTKEM(:,:) + TURBN%XIMPL*ZRES(:,:) ) )
-#endif
 !
 PTDIFF(:,:) =  ZRES(:,:) / PTSTEP - PRTKES(:,:)&
                                      /PRHODJ(:,:) &
@@ -448,7 +435,7 @@ IF (BUCONF%LBUDGET_TKE) CALL BUDGET_STORE_END_PHY(D, TBUDGETS(NBUDGET_TKE), 'TR'
 !
 !$mnh_expand_array(JIJ=IIJB:IIJE,JK=1:IKT)
 PRTHLS(:,:) = PRTHLS(:,:) + &
-                                    CSTURB%XCED * SQRT(PTKEM(:,:)) / PLEPS(:,:) * &
+                                    TURBN%XCED * SQRT(PTKEM(:,:)) / PLEPS(:,:) * &
                 (PEXPL*PTKEM(:,:) + TURBN%XIMPL*ZRES(:,:)) &
                 * PRHODJ(:,:) * PCOEF_DISS(:,:)
 !$mnh_end_expand_array(JIJ=IIJB:IIJE,JK=1:IKT)
@@ -460,13 +447,13 @@ PRTHLS(:,:) = PRTHLS(:,:) + &
 IF(PRESENT(PTR)) PTR=ZTR
 IF(PRESENT(PDISS)) THEN
   !$mnh_expand_array(JIJ=IIJB:IIJE,JK=1:IKT)
-  PDISS(:,:) =  -CSTURB%XCED * (PTKEM(:,:)**1.5) / PLEPS(:,:)
+  PDISS(:,:) =  -TURBN%XCED * (PTKEM(:,:)**1.5) / PLEPS(:,:)
   !$mnh_end_expand_array(JIJ=IIJB:IIJE,JK=1:IKT)
 END IF
 !
 IF(PRESENT(PEDR)) THEN
   !$mnh_expand_array(JIJ=IIJB:IIJE,JK=1:IKT)
-  PEDR(:,:) = CSTURB%XCED * (PTKEM(:,:)**1.5) / PLEPS(:,:)
+  PEDR(:,:) = TURBN%XCED * (PTKEM(:,:)**1.5) / PLEPS(:,:)
   !$mnh_end_expand_array(JIJ=IIJB:IIJE,JK=1:IKT)
 END IF
 !
diff --git a/src/PHYEX/turb/mode_tm06.f90 b/src/PHYEX/turb/mode_tm06.f90
index 1da05315c07f0d7ee905b59894d3368f51ff5b5c..c626ed489e62f9e509a4ada01bbe6d49b7c6668f 100644
--- a/src/PHYEX/turb/mode_tm06.f90
+++ b/src/PHYEX/turb/mode_tm06.f90
@@ -6,8 +6,7 @@ MODULE MODE_TM06
 IMPLICIT NONE
 CONTAINS
 SUBROUTINE TM06(D,CST,PTHVREF,PBL_DEPTH,PZZ,PSFTH,PMWTH,PMTH2)
-      USE PARKIND1, ONLY : JPRB
-      USE YOMHOOK , ONLY : LHOOK, DR_HOOK
+      USE YOMHOOK , ONLY : LHOOK, DR_HOOK, JPHOOK
 !     #################################################################
 !
 !
@@ -47,7 +46,7 @@ SUBROUTINE TM06(D,CST,PTHVREF,PBL_DEPTH,PZZ,PSFTH,PMWTH,PMTH2)
 !
 USE MODD_CST,        ONLY: CST_t
 USE MODD_DIMPHYEX,   ONLY: DIMPHYEX_t
-USE MODD_PARAMETERS, ONLY: XUNDEF,JPVEXT_TURB
+USE MODD_PARAMETERS, ONLY: XUNDEF
 !
 !
 IMPLICIT NONE
@@ -77,7 +76,7 @@ INTEGER                                             :: IIJE,IIJB
 INTEGER                                             :: IKTB,IKTE,IKB,IKE,IKT,IKU ! vertical levels
 !----------------------------------------------------------------------------
 !
-REAL(KIND=JPRB) :: ZHOOK_HANDLE
+REAL(KIND=JPHOOK) :: ZHOOK_HANDLE
 IF (LHOOK) CALL DR_HOOK('TM06',0,ZHOOK_HANDLE)
 IKTB=D%NKTB          
 IKTE=D%NKTE
diff --git a/src/PHYEX/turb/mode_tm06_h.f90 b/src/PHYEX/turb/mode_tm06_h.f90
index f250ee3af27b1ba1e0b048caed4a3df84b93b495..22a1e8e99d08b8ddaa42fad52f7d4a80efeb37d0 100644
--- a/src/PHYEX/turb/mode_tm06_h.f90
+++ b/src/PHYEX/turb/mode_tm06_h.f90
@@ -6,8 +6,7 @@ MODULE MODE_TM06_H
 IMPLICIT NONE
 CONTAINS
 SUBROUTINE TM06_H(D,PTSTEP,PZZ,PFLXZ,PBL_DEPTH)
-      USE PARKIND1, ONLY : JPRB
-      USE YOMHOOK , ONLY : LHOOK, DR_HOOK
+      USE YOMHOOK , ONLY : LHOOK, DR_HOOK, JPHOOK
 !     #################################################################
 !
 !
@@ -73,7 +72,7 @@ REAL                                     :: ZGROWTH  ! maximum BL growth rate
 !----------------------------------------------------------------------------
 !
 !* mixed boundary layer cannot grow more rapidly than 1800m/h
-REAL(KIND=JPRB) :: ZHOOK_HANDLE
+REAL(KIND=JPHOOK) :: ZHOOK_HANDLE
 IF (LHOOK) CALL DR_HOOK('TM06_H',0,ZHOOK_HANDLE)
 ZGROWTH = 2.0 ! (m/s)
 !
diff --git a/src/PHYEX/turb/mode_tridiag.f90 b/src/PHYEX/turb/mode_tridiag.f90
index 6b6b6bfae0c4fa504bfa7d64913db5332775d6de..1da934a793b37e925f15151c94ce01a765d36782 100644
--- a/src/PHYEX/turb/mode_tridiag.f90
+++ b/src/PHYEX/turb/mode_tridiag.f90
@@ -7,8 +7,7 @@ IMPLICIT NONE
 CONTAINS
 SUBROUTINE TRIDIAG(D,PVARM,PA,PTSTEP,PEXPL,PIMPL, &
                                   PRHODJ,PSOURCE,PVARP )
-       USE PARKIND1, ONLY : JPRB
-       USE YOMHOOK , ONLY : LHOOK, DR_HOOK
+       USE YOMHOOK , ONLY : LHOOK, DR_HOOK, JPHOOK
 !      #################################################
 !
 !
@@ -114,7 +113,6 @@ SUBROUTINE TRIDIAG(D,PVARM,PA,PTSTEP,PEXPL,PIMPL, &
 !
 !*       0. DECLARATIONS
 !
-USE MODD_PARAMETERS, ONLY: JPVEXT_TURB
 USE MODD_DIMPHYEX,   ONLY: DIMPHYEX_t
 !
 IMPLICIT NONE
@@ -150,7 +148,7 @@ INTEGER                              :: IIJB, IIJE    ! start, end of ij loops i
 !*      1.  COMPUTE THE RIGHT HAND SIDE
 !           ---------------------------
 !
-REAL(KIND=JPRB) :: ZHOOK_HANDLE
+REAL(KIND=JPHOOK) :: ZHOOK_HANDLE
 IF (LHOOK) CALL DR_HOOK('TRIDIAG',0,ZHOOK_HANDLE)
 !
 IKT=D%NKT
diff --git a/src/PHYEX/turb/mode_tridiag_massflux.f90 b/src/PHYEX/turb/mode_tridiag_massflux.f90
index 871eaa033524cb38cba360ca18c4c649cf5b0fc1..802cea0435b1e638e0ce755dcfe78e89163f24f7 100644
--- a/src/PHYEX/turb/mode_tridiag_massflux.f90
+++ b/src/PHYEX/turb/mode_tridiag_massflux.f90
@@ -8,8 +8,7 @@ CONTAINS
 SUBROUTINE TRIDIAG_MASSFLUX(D,PVARM,PF,PDFDT,PTSTEP,PIMPL,  &
                                  PDZZ,PRHODJ,PVARP             )
 
-       USE PARKIND1, ONLY : JPRB
-       USE YOMHOOK , ONLY : LHOOK, DR_HOOK
+       USE YOMHOOK , ONLY : LHOOK, DR_HOOK, JPHOOK
 !      #################################################
 !
 !
@@ -162,7 +161,7 @@ INTEGER :: IKL
 !*      1.  Preliminaries
 !           -------------
 !
-REAL(KIND=JPRB) :: ZHOOK_HANDLE
+REAL(KIND=JPHOOK) :: ZHOOK_HANDLE
 IF (LHOOK) CALL DR_HOOK('TRIDIAG_MASSFLUX',0,ZHOOK_HANDLE)
 !
 IIJE=D%NIJE
diff --git a/src/PHYEX/turb/mode_tridiag_thermo.f90 b/src/PHYEX/turb/mode_tridiag_thermo.f90
index a4070154427e7a7082d1c1e47fd576bed641b3a5..9f9c17b10fb4bd4c33768da7a89c76bc0e8914d3 100644
--- a/src/PHYEX/turb/mode_tridiag_thermo.f90
+++ b/src/PHYEX/turb/mode_tridiag_thermo.f90
@@ -116,12 +116,9 @@ SUBROUTINE TRIDIAG_THERMO(D,PVARM,PF,PDFDDTDZ,PTSTEP,PIMPL,  &
 !
 !*       0. DECLARATIONS
 !
-USE PARKIND1, ONLY : JPRB
-USE YOMHOOK , ONLY : LHOOK, DR_HOOK
+USE YOMHOOK , ONLY : LHOOK, DR_HOOK, JPHOOK
 USE MODD_DIMPHYEX, ONLY : DIMPHYEX_t
-USE MODD_PARAMETERS, ONLY : JPVEXT_TURB
 !
-USE MODI_SHUMAN, ONLY : MZM
 USE MODE_SHUMAN_PHY, ONLY: MZM_PHY
 !
 IMPLICIT NONE
@@ -162,7 +159,7 @@ INTEGER             :: IKL
 !*      1.  Preliminaries
 !           -------------
 !
-REAL(KIND=JPRB) :: ZHOOK_HANDLE
+REAL(KIND=JPHOOK) :: ZHOOK_HANDLE
 IF (LHOOK) CALL DR_HOOK('TRIDIAG_THERMO',0,ZHOOK_HANDLE)
 IKT=D%NKT  
 IKTB=D%NKTB          
diff --git a/src/PHYEX/turb/mode_tridiag_tke.f90 b/src/PHYEX/turb/mode_tridiag_tke.f90
index 1c11a85689bc57b2155d185fc47d02cee5031c8d..a51e71c61bbe0eeda6c3402c1924ccebf4ed675d 100644
--- a/src/PHYEX/turb/mode_tridiag_tke.f90
+++ b/src/PHYEX/turb/mode_tridiag_tke.f90
@@ -7,8 +7,7 @@ IMPLICIT NONE
 CONTAINS       
 SUBROUTINE TRIDIAG_TKE(D,PVARM,PA,PTSTEP,PEXPL,PIMPL, &
                                   PRHODJ,PSOURCE,PDIAG,PVARP )
-       USE PARKIND1, ONLY : JPRB
-       USE YOMHOOK , ONLY : LHOOK, DR_HOOK
+       USE YOMHOOK , ONLY : LHOOK, DR_HOOK, JPHOOK
 !      ########################################################
 !
 !
@@ -150,7 +149,7 @@ INTEGER             :: IKL
 !*      1.  COMPUTE THE RIGHT HAND SIDE
 !           ---------------------------
 !
-REAL(KIND=JPRB) :: ZHOOK_HANDLE
+REAL(KIND=JPHOOK) :: ZHOOK_HANDLE
 IF (LHOOK) CALL DR_HOOK('TRIDIAG_TKE',0,ZHOOK_HANDLE)
 !
 IKT=D%NKT
diff --git a/src/PHYEX/turb/mode_tridiag_wind.f90 b/src/PHYEX/turb/mode_tridiag_wind.f90
index b19d6dd2174956d997bab38744a52065d4b22de9..aee067175d2c2404ab4c1d47a68212a01bbf7253 100644
--- a/src/PHYEX/turb/mode_tridiag_wind.f90
+++ b/src/PHYEX/turb/mode_tridiag_wind.f90
@@ -7,8 +7,7 @@ IMPLICIT NONE
 CONTAINS       
 SUBROUTINE TRIDIAG_WIND(D,PVARM,PA,PCOEFS,PTSTEP,PEXPL,PIMPL, &
                                              PRHODJA,PSOURCE,PVARP )
-       USE PARKIND1, ONLY : JPRB
-       USE YOMHOOK , ONLY : LHOOK, DR_HOOK
+       USE YOMHOOK , ONLY : LHOOK, DR_HOOK, JPHOOK
 !      #############################################################
 !
 !
@@ -155,7 +154,7 @@ INTEGER             :: IKL
 !*      1.  COMPUTE THE RIGHT HAND SIDE
 !           ---------------------------
 !
-REAL(KIND=JPRB) :: ZHOOK_HANDLE
+REAL(KIND=JPHOOK) :: ZHOOK_HANDLE
 IF (LHOOK) CALL DR_HOOK('TRIDIAG_WIND',0,ZHOOK_HANDLE)
 !
 IKT=D%NKT
diff --git a/src/PHYEX/turb/mode_turb_hor.f90 b/src/PHYEX/turb/mode_turb_hor.f90
index c4a03a1be51710935bc3defb4f7827c96137c079..490fca72344b1c225eb75d798e721eec403c2b7f 100644
--- a/src/PHYEX/turb/mode_turb_hor.f90
+++ b/src/PHYEX/turb/mode_turb_hor.f90
@@ -5,7 +5,7 @@
 MODULE MODE_TURB_HOR  
 IMPLICIT NONE
 CONTAINS
-             SUBROUTINE TURB_HOR(D,CST,CSTURB,TURBN,TLES,            &
+             SUBROUTINE TURB_HOR(D,CST,CSTURB,TURBN,NEBN,TLES,       &
                       KSPLT, KRR, KRRL, KRRI, PTSTEP,                &
                       KSV, KSV_LGBEG, KSV_LGEND, OFLAT,O2D,ONOMIXLG, &                      
                       OOCEAN,OCOMPUTE_SRC,OBLOWSNOW,                 &
@@ -141,6 +141,7 @@ CONTAINS
 USE MODD_CST, ONLY : CST_t
 USE MODD_CTURB, ONLY : CSTURB_t
 USE MODD_TURB_n, ONLY: TURB_t
+USE MODD_NEB_n, ONLY: NEB_t
 USE MODD_DIMPHYEX,   ONLY: DIMPHYEX_t
 USE MODD_IO, ONLY: TFILEDATA
 USE MODD_PARAMETERS
@@ -165,6 +166,7 @@ TYPE(DIMPHYEX_t),       INTENT(IN)   :: D
 TYPE(CST_t),            INTENT(IN)   :: CST
 TYPE(CSTURB_t),         INTENT(IN)   :: CSTURB
 TYPE(TURB_t),           INTENT(IN)   :: TURBN
+TYPE(NEB_t),            INTENT(IN)   :: NEBN
 TYPE(TLES_t),           INTENT(INOUT):: TLES          ! modd_les structure
 INTEGER,                INTENT(IN)   :: KSPLT         ! current split index
 INTEGER,                INTENT(IN)   :: KRR           ! number of moist var.
@@ -277,7 +279,7 @@ REAL, DIMENSION(:,:,:),   INTENT(INOUT) ::  PSIGS
 !*       8.   TURBULENT CORRELATIONS : <THl THl>, <THl Rnp>, <Rnp Rnp>, Sigma_s
 !
       IF (KSPLT==1)                                                  &
-      CALL      TURB_HOR_THERMO_CORR(D,CST,TURBN,TLES,               &
+      CALL      TURB_HOR_THERMO_CORR(D,CST,TURBN,NEBN,TLES,          &
                       KRR, KRRL, KRRI,                               &
                       OOCEAN,OCOMPUTE_SRC,O2D,                       &
                       TPFILE,                                        &
@@ -367,7 +369,7 @@ REAL, DIMENSION(:,:,:),   INTENT(INOUT) ::  PSIGS
                       PRSVS                                          )
 !
       IF (KSPLT==1 .AND. TLES%LLES_CALL)                             &
-      CALL      TURB_HOR_SV_CORR(D,CST,CSTURB,TLES,                  &
+      CALL      TURB_HOR_SV_CORR(D,CST,CSTURB,TURBN,TLES,            &
                       KSV,KSV_LGBEG,KSV_LGEND,                       &
                       KRR,KRRL,KRRI,OOCEAN,OCOMPUTE_SRC,OBLOWSNOW,   &
                       ONOMIXLG,O2D,                                  &
diff --git a/src/PHYEX/turb/mode_turb_hor_dyn_corr.f90 b/src/PHYEX/turb/mode_turb_hor_dyn_corr.f90
index 32270e64e5176722c2eaf993ef9376614878d4e9..7acf5b2c9630309c2ac0d30e31f47912c273dd10 100644
--- a/src/PHYEX/turb/mode_turb_hor_dyn_corr.f90
+++ b/src/PHYEX/turb/mode_turb_hor_dyn_corr.f90
@@ -88,7 +88,6 @@ USE MODI_GRADIENT_U
 USE MODI_GRADIENT_V
 USE MODI_GRADIENT_W
 USE MODI_SHUMAN 
-USE MODE_COEFJ, ONLY: COEFJ
 USE MODI_LES_MEAN_SUBGRID
 USE MODE_TRIDIAG_W, ONLY: TRIDIAG_W
 !
diff --git a/src/PHYEX/turb/mode_turb_hor_splt.f90 b/src/PHYEX/turb/mode_turb_hor_splt.f90
index 83fdd1ed2d39f76780a3613955029e4f50e1dfa5..323542374780af5b9061fb6687d84319bcbc3ec2 100644
--- a/src/PHYEX/turb/mode_turb_hor_splt.f90
+++ b/src/PHYEX/turb/mode_turb_hor_splt.f90
@@ -5,11 +5,11 @@
 MODULE MODE_TURB_HOR_SPLT
 IMPLICIT NONE
 CONTAINS
-           SUBROUTINE TURB_HOR_SPLT(D,CST,CSTURB,TURBN,TLES,         &
+           SUBROUTINE TURB_HOR_SPLT(D,CST,CSTURB,TURBN,NEBN,TLES,    &
                       KSPLIT, KRR,KRRL,KRRI,KSV, KSV_LGBEG,KSV_LGEND,&
                       PTSTEP,HLBCX,HLBCY, OFLAT, O2D, ONOMIXLG,      &
                       OOCEAN,OCOMPUTE_SRC,OBLOWSNOW,PRSNOW,          &
-                      TPFILE, HPROGRAM, KHALO,                       &
+                      TPFILE, KHALO,                                 &
                       PDXX,PDYY,PDZZ,PDZX,PDZY,PZZ,                  &
                       PDIRCOSXW,PDIRCOSYW,PDIRCOSZW,                 &
                       PCOSSLOPE,PSINSLOPE,                           &
@@ -162,6 +162,7 @@ USE MODD_CTURB, ONLY: CSTURB_t
 USE MODD_DIMPHYEX, ONLY : DIMPHYEX_t
 USE MODD_LES, ONLY: TLES_t
 USE MODD_TURB_n, ONLY: TURB_t
+USE MODD_NEB_n, ONLY: NEB_t
 !
 USE MODD_IO, ONLY: TFILEDATA
 USE MODD_PARAMETERS
@@ -183,6 +184,7 @@ TYPE(DIMPHYEX_t),       INTENT(IN)   :: D
 TYPE(CST_t),            INTENT(IN)   :: CST
 TYPE(CSTURB_t),         INTENT(IN)   :: CSTURB
 TYPE(TURB_t),           INTENT(IN)   :: TURBN
+TYPE(NEB_t),            INTENT(IN)   :: NEBN
 TYPE(TLES_t),           INTENT(INOUT):: TLES          ! modd_les structure
 INTEGER,                INTENT(IN)   :: KSPLIT        ! number of time splitting
 INTEGER,                INTENT(IN)   :: KRR           ! number of moist var.
@@ -197,7 +199,6 @@ LOGICAL,                INTENT(IN)   ::  O2D          ! Logical for 2D model ver
 LOGICAL,                INTENT(IN)   ::  OOCEAN       ! switch for Ocean model version
 LOGICAL,                INTENT(IN)   ::  OCOMPUTE_SRC ! flag to define dimensions of SIGS and SRCT variables
 LOGICAL,                INTENT(IN)   ::  OBLOWSNOW    ! switch to activate pronostic blowing snow
-CHARACTER(LEN=6), INTENT(IN) :: HPROGRAM ! HPROGRAM is the program currently running (modd_conf)
 INTEGER,                INTENT(IN)   ::  KHALO        ! Size of the halo for parallel distribution
 REAL,                   INTENT(IN)   ::  PRSNOW       ! Ratio for diffusion coeff. scalar (blowing snow)
 TYPE(TFILEDATA),          INTENT(IN)    ::  TPFILE       ! Output file
@@ -314,7 +315,7 @@ NULLIFY(TZFIELDS_ll)
 !*       2.   SPLIT PROCESS LOOP
 !             ------------------
 !
-IF (KSPLIT>1 .AND. HPROGRAM=='MESONH') THEN
+IF (KSPLIT>1) THEN
 !
 !*       2.1  allocations
 !             -----------
@@ -372,7 +373,7 @@ IF (KSPLIT>1 .AND. HPROGRAM=='MESONH') THEN
   DO JSPLT=1,KSPLIT
 !
 ! compute the turbulent tendencies for the small time step
-    CALL TURB_HOR(D,CST,CSTURB,TURBN,TLES,                        &
+    CALL TURB_HOR(D,CST,CSTURB,TURBN,NEBN,TLES,                   &
                    JSPLT, KRR, KRRL, KRRI, PTSTEP,                &
                    KSV, KSV_LGBEG, KSV_LGEND, OFLAT,O2D, ONOMIXLG,&
                    OOCEAN,OCOMPUTE_SRC,OBLOWSNOW,                 &
@@ -515,7 +516,7 @@ IF (KSPLIT>1 .AND. HPROGRAM=='MESONH') THEN
 !
 ELSE
 !
-  CALL TURB_HOR(D,CST,CSTURB,TURBN,TLES,                       &
+  CALL TURB_HOR(D,CST,CSTURB,TURBN,NEBN,TLES,                  &
                 1, KRR, KRRL, KRRI,  PTSTEP,                   &
                 KSV, KSV_LGBEG, KSV_LGEND, OFLAT,O2D, ONOMIXLG,&                
                 OOCEAN,OCOMPUTE_SRC,OBLOWSNOW,                 &
diff --git a/src/PHYEX/turb/mode_turb_hor_sv_corr.f90 b/src/PHYEX/turb/mode_turb_hor_sv_corr.f90
index 1ebc83f7fdef805bfb4504376260aecb9009c9bb..35878c3d4420c2b43ff987a97cb78f4d15c55bac 100644
--- a/src/PHYEX/turb/mode_turb_hor_sv_corr.f90
+++ b/src/PHYEX/turb/mode_turb_hor_sv_corr.f90
@@ -5,7 +5,7 @@
 MODULE MODE_TURB_HOR_SV_CORR
 IMPLICIT NONE
 CONTAINS
-      SUBROUTINE TURB_HOR_SV_CORR(D,CST,CSTURB,TLES,KSV,KSV_LGBEG,KSV_LGEND,&
+      SUBROUTINE TURB_HOR_SV_CORR(D,CST,CSTURB,TURBN,TLES,KSV,KSV_LGBEG,KSV_LGEND,&
                       KRR,KRRL,KRRI,OOCEAN,OCOMPUTE_SRC,OBLOWSNOW,   &
                       ONOMIXLG,O2D,                                  &
                       PDXX,PDYY,PDZZ,PDZX,PDZY,PRSNOW,               &
@@ -51,6 +51,7 @@ CONTAINS
 !
 USE MODD_CST, ONLY: CST_t
 USE MODD_CTURB, ONLY : CSTURB_t
+USE MODD_TURB_n, ONLY: TURB_t
 USE MODD_DIMPHYEX,   ONLY: DIMPHYEX_t
 USE MODD_PARAMETERS
 USE MODD_LES, ONLY: TLES_t
@@ -76,6 +77,7 @@ IMPLICIT NONE
 TYPE(DIMPHYEX_t),         INTENT(IN)    ::  D
 TYPE(CST_t),              INTENT(IN)    ::  CST
 TYPE(CSTURB_t),           INTENT(IN)    ::  CSTURB
+TYPE(TURB_t),             INTENT(IN)    :: TURBN
 TYPE(TLES_t),             INTENT(INOUT) :: TLES          ! modd_les structure
 INTEGER,                  INTENT(IN)    ::  KRR          ! number of moist var.
 INTEGER,                  INTENT(IN)    ::  KRRL         ! number of liquid var.
@@ -127,9 +129,9 @@ CALL SECOND_MNH(ZTIME1)
 !
 IF(OBLOWSNOW) THEN
 ! See Vionnet (PhD, 2012) for a complete discussion around the value of the Schmidt number for blowing snow variables        
-   ZCSV= CSTURB%XCHF/PRSNOW 
+   ZCSV= TURBN%XCHF/PRSNOW 
 ELSE
-   ZCSV= CSTURB%XCHF
+   ZCSV= TURBN%XCHF
 ENDIF
 !
 DO JSV=1,KSV
@@ -160,11 +162,11 @@ DO JSV=1,KSV
       ZFLX(:,:,:)=  PLM(:,:,:) * PLEPS(:,:,:)                                          &
           *  (  GX_M_M(PTHLM,PDXX,PDZZ,PDZX) * GX_M_M(PSVM(:,:,:,JSV),PDXX,PDZZ,PDZX)  &
               + GY_M_M(PTHLM,PDYY,PDZZ,PDZY) * GY_M_M(PSVM(:,:,:,JSV),PDYY,PDZZ,PDZY)  &
-             ) * (CSTURB%XCSHF+ZCSV) / (2.*ZCTSVD)
+             ) * (TURBN%XCSHF+ZCSV) / (2.*ZCTSVD)
     ELSE
       ZFLX(:,:,:)=  PLM(:,:,:) * PLEPS(:,:,:)                                          &
               * GX_M_M(PTHLM,PDXX,PDZZ,PDZX) * GX_M_M(PSVM(:,:,:,JSV),PDXX,PDZZ,PDZX)  &
-              * (CSTURB%XCSHF+ZCSV) / (2.*ZCTSVD)
+              * (TURBN%XCSHF+ZCSV) / (2.*ZCTSVD)
     END IF
     CALL LES_MEAN_SUBGRID( ZA*ZFLX, TLES%X_LES_SUBGRID_SvThv(:,:,:,JSV) , .TRUE.)
     CALL LES_MEAN_SUBGRID( -CST%XG/PTHVREF/3.*ZA*ZFLX, TLES%X_LES_SUBGRID_SvPz(:,:,:,JSV), .TRUE. )
@@ -175,11 +177,11 @@ DO JSV=1,KSV
         ZFLX(:,:,:)=  PLM(:,:,:) * PLEPS(:,:,:)                                                 &
             *  (  GX_M_M(PRM(:,:,:,1),PDXX,PDZZ,PDZX) * GX_M_M(PSVM(:,:,:,JSV),PDXX,PDZZ,PDZX)  &
                 + GY_M_M(PRM(:,:,:,1),PDYY,PDZZ,PDZY) * GY_M_M(PSVM(:,:,:,JSV),PDYY,PDZZ,PDZY)  &
-               ) * (CSTURB%XCHF+ZCSV) / (2.*ZCQSVD)
+               ) * (TURBN%XCHF+ZCSV) / (2.*ZCQSVD)
       ELSE
         ZFLX(:,:,:)=  PLM(:,:,:) * PLEPS(:,:,:)                                                 &
                 * GX_M_M(PRM(:,:,:,1),PDXX,PDZZ,PDZX) * GX_M_M(PSVM(:,:,:,JSV),PDXX,PDZZ,PDZX)  &
-                * (CSTURB%XCHF+ZCSV) / (2.*ZCQSVD)
+                * (TURBN%XCHF+ZCSV) / (2.*ZCQSVD)
       END IF
       CALL LES_MEAN_SUBGRID( ZA*ZFLX, TLES%X_LES_SUBGRID_SvThv(:,:,:,JSV) , .TRUE.)
       CALL LES_MEAN_SUBGRID( -CST%XG/PTHVREF/3.*ZA*ZFLX, TLES%X_LES_SUBGRID_SvPz(:,:,:,JSV), .TRUE. )
diff --git a/src/PHYEX/turb/mode_turb_hor_sv_flux.f90 b/src/PHYEX/turb/mode_turb_hor_sv_flux.f90
index db1b033eb0a08f2670ba8cc52706c4b97b8bf8f1..a84139fe54080bfcbcfdfd05c232b728e9287f7e 100644
--- a/src/PHYEX/turb/mode_turb_hor_sv_flux.f90
+++ b/src/PHYEX/turb/mode_turb_hor_sv_flux.f90
@@ -75,7 +75,6 @@ USE MODI_GRADIENT_U
 USE MODI_GRADIENT_V
 USE MODI_GRADIENT_W
 USE MODI_SHUMAN 
-USE MODE_COEFJ, ONLY: COEFJ
 USE MODI_LES_MEAN_SUBGRID
 !
 USE MODI_SECOND_MNH
@@ -156,9 +155,9 @@ ISV = SIZE(PSVM,4)
 !
 IF(OBLOWSNOW) THEN
 ! See Vionnet (PhD, 2012) for a complete discussion around the value of the Schmidt number for blowing snow variables              
-   ZCSV= XCHF/PRSNOW
+   ZCSV= TURBN%XCHF/PRSNOW
 ELSE
-   ZCSV= XCHF
+   ZCSV= TURBN%XCHF
 ENDIF
 !
 !  compute the coefficients for the uncentred gradient computation near the 
diff --git a/src/PHYEX/turb/mode_turb_hor_thermo_corr.f90 b/src/PHYEX/turb/mode_turb_hor_thermo_corr.f90
index 268f923931607513832a9af54690e02638893bde..cded77fc60b907ffcad81edf3ffe289d86dac95a 100644
--- a/src/PHYEX/turb/mode_turb_hor_thermo_corr.f90
+++ b/src/PHYEX/turb/mode_turb_hor_thermo_corr.f90
@@ -6,7 +6,7 @@
 MODULE MODE_TURB_HOR_THERMO_CORR
 IMPLICIT NONE
 CONTAINS
-      SUBROUTINE TURB_HOR_THERMO_CORR(D,CST,TURBN,TLES,              &
+      SUBROUTINE TURB_HOR_THERMO_CORR(D,CST,TURBN,NEBN,TLES,         &
                       KRR, KRRL, KRRI,                               &
                       OOCEAN,OCOMPUTE_SRC,O2D,                       &
                       TPFILE,                                        &
@@ -63,6 +63,7 @@ USE MODD_CST,           ONLY : CST_t
 USE MODD_CTURB
 USE MODD_DIMPHYEX,       ONLY: DIMPHYEX_t
 USE MODD_FIELD,          ONLY: TFIELDMETADATA, TYPEREAL
+USE MODD_NEB_n,          ONLY: NEB_t
 USE MODD_IO,             ONLY: TFILEDATA
 USE MODD_LES, ONLY: TLES_t
 USE MODD_PARAMETERS
@@ -92,6 +93,7 @@ IMPLICIT NONE
 TYPE(DIMPHYEX_t),       INTENT(IN)   :: D
 TYPE(CST_t),            INTENT(IN)   :: CST
 TYPE(TURB_t),           INTENT(IN)   :: TURBN
+TYPE(NEB_t),            INTENT(IN)   :: NEBN
 TYPE(TLES_t),           INTENT(INOUT):: TLES          ! modd_les structure
 INTEGER,                INTENT(IN)   :: KRR           ! number of moist var.
 INTEGER,                INTENT(IN)   :: KRRL          ! number of liquid water var.
@@ -169,24 +171,24 @@ ZCOEFF(:,:,IKB)= - (PDZZ(:,:,IKB+2)+2.*PDZZ(:,:,IKB+1)) /      &
 !
 !
 !
-IF ( ( KRRL > 0 .AND. TURBN%LSUBG_COND) .OR. ( TURBN%LTURB_FLX .AND. TPFILE%LOPENED ) &
+IF ( ( KRRL > 0 .AND. NEBN%LSUBG_COND) .OR. ( TURBN%LTURB_FLX .AND. TPFILE%LOPENED ) &
                                   .OR. ( TLES%LLES_CALL )                  ) THEN
 !
 !*       8.1  <THl THl>
 !
   ! Computes the horizontal variance <THl THl>
   IF (.NOT. O2D) THEN
-    ZFLX(:,:,:) = XCTV * PLM(:,:,:) * PLEPS(:,:,:) *                           &
+    ZFLX(:,:,:) = TURBN%XCTV * PLM(:,:,:) * PLEPS(:,:,:) *                           &
        ( GX_M_M(PTHLM,PDXX,PDZZ,PDZX)**2 + GY_M_M(PTHLM,PDYY,PDZZ,PDZY)**2 )
   ELSE
-    ZFLX(:,:,:) = XCTV * PLM(:,:,:) * PLEPS(:,:,:) *                           &
+    ZFLX(:,:,:) = TURBN%XCTV * PLM(:,:,:) * PLEPS(:,:,:) *                           &
          GX_M_M(PTHLM,PDXX,PDZZ,PDZX)**2
   END IF
 !
 ! Compute the flux at the first inner U-point with an uncentred vertical  
 ! gradient
 !
-  ZFLX(:,:,IKB:IKB) = XCTV * PLM(:,:,IKB:IKB)                  &
+  ZFLX(:,:,IKB:IKB) = TURBN%XCTV * PLM(:,:,IKB:IKB)                  &
   * PLEPS(:,:,IKB:IKB) *  (                                    &
   ( MXF(DXM(PTHLM(:,:,IKB:IKB)) * PINV_PDXX(:,:,IKB:IKB))      &
    - ( ZCOEFF(:,:,IKB+2:IKB+2)*PTHLM(:,:,IKB+2:IKB+2)          &
@@ -249,18 +251,18 @@ IF ( ( KRRL > 0 .AND. TURBN%LSUBG_COND) .OR. ( TURBN%LTURB_FLX .AND. TPFILE%LOPE
             PLM(:,:,:) * PLEPS(:,:,:) *                                          &
             (GX_M_M(PTHLM,PDXX,PDZZ,PDZX) * GX_M_M(PRM(:,:,:,1),PDXX,PDZZ,PDZX)  &
            + GY_M_M(PTHLM,PDYY,PDZZ,PDZY) * GY_M_M(PRM(:,:,:,1),PDYY,PDZZ,PDZY)  &
-            ) * (XCHT1+XCHT2)
+            ) * (TURBN%XCHT1+TURBN%XCHT2)
     ELSE
       ZFLX(:,:,:)=                                                               &
             PLM(:,:,:) * PLEPS(:,:,:) *                                          &
             (GX_M_M(PTHLM,PDXX,PDZZ,PDZX) * GX_M_M(PRM(:,:,:,1),PDXX,PDZZ,PDZX)  &
-            ) * (XCHT1+XCHT2)
+            ) * (TURBN%XCHT1+TURBN%XCHT2)
 
     END IF
 !
 ! Compute the flux at the first inner U-point with an uncentred vertical  
 ! gradient
-    ZFLX(:,:,IKB:IKB) = (XCHT1+XCHT2) * PLM(:,:,IKB:IKB)         &
+    ZFLX(:,:,IKB:IKB) = (TURBN%XCHT1+TURBN%XCHT2) * PLM(:,:,IKB:IKB)         &
     * PLEPS(:,:,IKB:IKB)  *  (                                   &
     ( MXF(DXM(PTHLM(:,:,IKB:IKB)) * PINV_PDXX(:,:,IKB:IKB))      &
      - ( ZCOEFF(:,:,IKB+2:IKB+2)*PTHLM(:,:,IKB+2:IKB+2)          &
@@ -334,17 +336,17 @@ IF ( ( KRRL > 0 .AND. TURBN%LSUBG_COND) .OR. ( TURBN%LTURB_FLX .AND. TPFILE%LOPE
 !
     ! Computes the horizontal variance <Rnp Rnp>
     IF (.NOT. O2D) THEN
-      ZFLX(:,:,:) = XCHV * PLM(:,:,:) * PLEPS(:,:,:) *                      &
+      ZFLX(:,:,:) = TURBN%XCHV * PLM(:,:,:) * PLEPS(:,:,:) *                      &
            ( GX_M_M(PRM(:,:,:,1),PDXX,PDZZ,PDZX)**2 +                       &
              GY_M_M(PRM(:,:,:,1),PDYY,PDZZ,PDZY)**2 )
     ELSE
-      ZFLX(:,:,:) = XCHV * PLM(:,:,:) * PLEPS(:,:,:) *                      &
+      ZFLX(:,:,:) = TURBN%XCHV * PLM(:,:,:) * PLEPS(:,:,:) *                      &
            ( GX_M_M(PRM(:,:,:,1),PDXX,PDZZ,PDZX)**2  )
     END IF
 !
 ! Compute the flux at the first inner U-point with an uncentred vertical  
 ! gradient
-    ZFLX(:,:,IKB:IKB) = XCHV * PLM(:,:,IKB:IKB)                  &
+    ZFLX(:,:,IKB:IKB) = TURBN%XCHV * PLM(:,:,IKB:IKB)                  &
     * PLEPS(:,:,IKB:IKB) *  (                                    &
     ( MXF(DXM(PRM(:,:,IKB:IKB,1)) * PINV_PDXX(:,:,IKB:IKB))      &
      - ( ZCOEFF(:,:,IKB+2:IKB+2)*PRM(:,:,IKB+2:IKB+2,1)          &
diff --git a/src/PHYEX/turb/mode_turb_hor_thermo_flux.f90 b/src/PHYEX/turb/mode_turb_hor_thermo_flux.f90
index 0654ed9918e6e044ccc1c1ee87988a1e6d9e674c..67ac0255e117b590fc449aaa72d633576f3e5089 100644
--- a/src/PHYEX/turb/mode_turb_hor_thermo_flux.f90
+++ b/src/PHYEX/turb/mode_turb_hor_thermo_flux.f90
@@ -173,12 +173,12 @@ ZCOEFF(:,:,IKB)= - (PDZZ(:,:,IKB+2)+2.*PDZZ(:,:,IKB+1)) /      &
 !             --------------
 !
 ! 
-ZFLX(:,:,:)     = -XCSHF * MXM( PK ) * GX_M_U(1,IKU,1,PTHLM,PDXX,PDZZ,PDZX)
+ZFLX(:,:,:)     = -TURBN%XCSHF * MXM( PK ) * GX_M_U(1,IKU,1,PTHLM,PDXX,PDZZ,PDZX)
 ZFLX(:,:,IKE+1) = ZFLX(:,:,IKE) 
 !
 ! Compute the flux at the first inner U-point with an uncentred vertical  
 ! gradient
-ZFLX(:,:,IKB:IKB) = -XCSHF * MXM( PK(:,:,IKB:IKB) ) *          &
+ZFLX(:,:,IKB:IKB) = -TURBN%XCSHF * MXM( PK(:,:,IKB:IKB) ) *          &
   ( DXM(PTHLM(:,:,IKB:IKB)) * PINV_PDXX(:,:,IKB:IKB)           &
    -MXM( ZCOEFF(:,:,IKB+2:IKB+2)*PTHLM(:,:,IKB+2:IKB+2)        &
          +ZCOEFF(:,:,IKB+1:IKB+1)*PTHLM(:,:,IKB+1:IKB+1)       &
@@ -279,12 +279,12 @@ END IF
 !             -----------
 IF (KRR/=0) THEN
   !
-  ZFLX(:,:,:)     = -XCHF * MXM( PK ) * GX_M_U(1,IKU,1,PRM(:,:,:,1),PDXX,PDZZ,PDZX)
+  ZFLX(:,:,:)     = -TURBN%XCHF * MXM( PK ) * GX_M_U(1,IKU,1,PRM(:,:,:,1),PDXX,PDZZ,PDZX)
   ZFLX(:,:,IKE+1) = ZFLX(:,:,IKE) 
 !
 ! Compute the flux at the first inner U-point with an uncentred vertical  
 ! gradient
-  ZFLX(:,:,IKB:IKB) = -XCHF * MXM( PK(:,:,IKB:IKB) ) *           &
+  ZFLX(:,:,IKB:IKB) = -TURBN%XCHF * MXM( PK(:,:,IKB:IKB) ) *           &
     ( DXM(PRM(:,:,IKB:IKB,1)) * PINV_PDXX(:,:,IKB:IKB)           &
      -MXM( ZCOEFF(:,:,IKB+2:IKB+2)*PRM(:,:,IKB+2:IKB+2,1)        &
            +ZCOEFF(:,:,IKB+1:IKB+1)*PRM(:,:,IKB+1:IKB+1,1)       &
@@ -424,7 +424,7 @@ END IF
 !
 !
 IF (.NOT. O2D) THEN
-  ZFLX(:,:,:)     = -XCSHF * MYM( PK ) * GY_M_V(1,IKU,1,PTHLM,PDYY,PDZZ,PDZY)
+  ZFLX(:,:,:)     = -TURBN%XCSHF * MYM( PK ) * GY_M_V(1,IKU,1,PTHLM,PDYY,PDZZ,PDZY)
   ZFLX(:,:,IKE+1) = ZFLX(:,:,IKE) 
 ELSE
   ZFLX(:,:,:)     = 0.
@@ -433,7 +433,7 @@ END IF
 !
 ! Compute the flux at the first inner U-point with an uncentred vertical  
 ! gradient
-ZFLX(:,:,IKB:IKB) = -XCSHF * MYM( PK(:,:,IKB:IKB) ) *          &
+ZFLX(:,:,IKB:IKB) = -TURBN%XCSHF * MYM( PK(:,:,IKB:IKB) ) *          &
   ( DYM(PTHLM(:,:,IKB:IKB)) * PINV_PDYY(:,:,IKB:IKB)           &
    -MYM( ZCOEFF(:,:,IKB+2:IKB+2)*PTHLM(:,:,IKB+2:IKB+2)        &
          +ZCOEFF(:,:,IKB+1:IKB+1)*PTHLM(:,:,IKB+1:IKB+1)       &
@@ -540,7 +540,7 @@ END IF
 IF (KRR/=0) THEN
   !
   IF (.NOT. O2D) THEN
-    ZFLX(:,:,:)     = -XCHF * MYM( PK ) * GY_M_V(1,IKU,1,PRM(:,:,:,1),PDYY,PDZZ,PDZY)
+    ZFLX(:,:,:)     = -TURBN%XCHF * MYM( PK ) * GY_M_V(1,IKU,1,PRM(:,:,:,1),PDYY,PDZZ,PDZY)
     ZFLX(:,:,IKE+1) = ZFLX(:,:,IKE) 
   ELSE
     ZFLX(:,:,:)     = 0.
@@ -548,7 +548,7 @@ IF (KRR/=0) THEN
 !
 ! Compute the flux at the first inner U-point with an uncentred vertical  
 ! gradient
-  ZFLX(:,:,IKB:IKB) = -XCHF * MYM( PK(:,:,IKB:IKB) ) *           &
+  ZFLX(:,:,IKB:IKB) = -TURBN%XCHF * MYM( PK(:,:,IKB:IKB) ) *           &
     ( DYM(PRM(:,:,IKB:IKB,1)) * PINV_PDYY(:,:,IKB:IKB)           &
      -MYM( ZCOEFF(:,:,IKB+2:IKB+2)*PRM(:,:,IKB+2:IKB+2,1)        &
            +ZCOEFF(:,:,IKB+1:IKB+1)*PRM(:,:,IKB+1:IKB+1,1)       &
diff --git a/src/PHYEX/turb/mode_turb_hor_uv.f90 b/src/PHYEX/turb/mode_turb_hor_uv.f90
index 717ef59073695384a958d49e2c3a1ff00090ec2b..e0ad7d63d4e2c5b113e500e067bd469effe91dfd 100644
--- a/src/PHYEX/turb/mode_turb_hor_uv.f90
+++ b/src/PHYEX/turb/mode_turb_hor_uv.f90
@@ -74,7 +74,6 @@ USE MODI_GRADIENT_U
 USE MODI_GRADIENT_V
 USE MODI_GRADIENT_W
 USE MODI_SHUMAN 
-USE MODE_COEFJ, ONLY: COEFJ
 USE MODI_LES_MEAN_SUBGRID
 !
 USE MODI_SECOND_MNH
diff --git a/src/PHYEX/turb/mode_turb_hor_uw.f90 b/src/PHYEX/turb/mode_turb_hor_uw.f90
index 1885d3d9eda92940af4df9714b87cb8cf6db225a..918c5fac1fc0a56d5970f33554523f37952eacc5 100644
--- a/src/PHYEX/turb/mode_turb_hor_uw.f90
+++ b/src/PHYEX/turb/mode_turb_hor_uw.f90
@@ -78,7 +78,6 @@ USE MODI_GRADIENT_U
 USE MODI_GRADIENT_V
 USE MODI_GRADIENT_W
 USE MODI_SHUMAN 
-USE MODE_COEFJ, ONLY: COEFJ
 USE MODI_LES_MEAN_SUBGRID
 !
 USE MODI_SECOND_MNH
diff --git a/src/PHYEX/turb/mode_turb_hor_vw.f90 b/src/PHYEX/turb/mode_turb_hor_vw.f90
index 2fe089f60f8dc098787ad3c5dea9dd9b858fa9d2..c6cfd8294a5ef99e37de2aad206daa43c788b904 100644
--- a/src/PHYEX/turb/mode_turb_hor_vw.f90
+++ b/src/PHYEX/turb/mode_turb_hor_vw.f90
@@ -77,7 +77,6 @@ USE MODI_GRADIENT_U
 USE MODI_GRADIENT_V
 USE MODI_GRADIENT_W
 USE MODI_SHUMAN 
-USE MODE_COEFJ, ONLY: COEFJ
 USE MODI_LES_MEAN_SUBGRID
 !
 USE MODI_SECOND_MNH
diff --git a/src/PHYEX/turb/mode_turb_ver.f90 b/src/PHYEX/turb/mode_turb_ver.f90
index 848abf83551f9c3d2650604e58cb71fbf54a0de0..5b767c7e0aa72375096a291797cb0e07931fbbc7 100644
--- a/src/PHYEX/turb/mode_turb_ver.f90
+++ b/src/PHYEX/turb/mode_turb_ver.f90
@@ -6,10 +6,11 @@
 MODULE MODE_TURB_VER
 IMPLICIT NONE
 CONTAINS
-SUBROUTINE TURB_VER(D,CST,CSTURB,TURBN,TLES,KRR,KRRL,KRRI,KGRADIENTS,&
+SUBROUTINE TURB_VER(D,CST,CSTURB,TURBN,NEBN,TLES,                   &
+                      KRR,KRRL,KRRI,KGRADIENTS,                     &
                       OOCEAN,ODEEPOC,OCOMPUTE_SRC,                  &
                       KSV,KSV_LGBEG,KSV_LGEND,                      &
-                      PEXPL, HPROGRAM, O2D, ONOMIXLG, OFLAT,        &
+                      PEXPL, O2D, ONOMIXLG, OFLAT,                  &
                       OCOUPLES,OBLOWSNOW,OFLYER,PRSNOW,             & 
                       PTSTEP, TPFILE,                               &
                       PDXX,PDYY,PDZZ,PDZX,PDZY,PDIRCOSZW,PZZ,       &
@@ -210,20 +211,17 @@ SUBROUTINE TURB_VER(D,CST,CSTURB,TURBN,TLES,KRR,KRRL,KRRI,KGRADIENTS,&
 !*      0. DECLARATIONS
 !          ------------
 !
-USE PARKIND1, ONLY: JPRB
-USE YOMHOOK,  ONLY: LHOOK, DR_HOOK
+USE YOMHOOK,  ONLY: LHOOK, DR_HOOK, JPHOOK
 !
 USE MODD_CST,            ONLY: CST_t
 USE MODD_CTURB,          ONLY: CSTURB_t
 USE MODD_DIMPHYEX,       ONLY: DIMPHYEX_t
 USE MODD_FIELD,          ONLY: TFIELDMETADATA, TYPEREAL
 USE MODD_IO,             ONLY: TFILEDATA
-USE MODD_PARAMETERS,     ONLY: JPVEXT_TURB
 USE MODD_LES,            ONLY: TLES_t
 USE MODD_TURB_n,         ONLY: TURB_t
+USE MODD_NEB_n,          ONLY: NEB_t
 !
-USE MODE_EMOIST,               ONLY: EMOIST
-USE MODE_ETHETA,               ONLY: ETHETA
 USE MODE_GRADIENT_M_PHY,       ONLY: GZ_M_W_PHY
 USE MODE_IO_FIELD_WRITE_PHY,       ONLY: IO_FIELD_WRITE_PHY
 USE MODE_PRANDTL,              ONLY: PSI_SV, PSI3, PHI3, PRANDTL
@@ -245,6 +243,7 @@ TYPE(DIMPHYEX_t),       INTENT(IN)   :: D
 TYPE(CST_t),            INTENT(IN)   :: CST
 TYPE(CSTURB_t),         INTENT(IN)   :: CSTURB
 TYPE(TURB_t),           INTENT(IN)   :: TURBN
+TYPE(NEB_t),            INTENT(IN)   :: NEBN
 TYPE(TLES_t),           INTENT(INOUT):: TLES          ! modd_les structure
 INTEGER,                INTENT(IN)   :: KGRADIENTS    ! Number of stored horizontal gradients
 INTEGER,                INTENT(IN)   :: KRR           ! number of moist var.
@@ -259,7 +258,6 @@ LOGICAL,                INTENT(IN)   ::  OFLAT        ! Logical for zero ororogr
 LOGICAL,                INTENT(IN)   ::  OCOUPLES     ! switch to activate atmos-ocean LES version 
 LOGICAL,                INTENT(IN)   ::  OBLOWSNOW    ! switch to activate pronostic blowing snow
 REAL,                   INTENT(IN)   ::  PRSNOW       ! Ratio for diffusion coeff. scalar (blowing snow)
-CHARACTER(LEN=6),       INTENT(IN)   ::  HPROGRAM     ! HPROGRAM is the program currently running
 LOGICAL,                INTENT(IN)   ::  ONOMIXLG     ! to use turbulence for lagrangian variables
 LOGICAL,                INTENT(IN)   ::  O2D          ! Logical for 2D model version
 REAL,                   INTENT(IN)   ::  PEXPL        ! Coef. for temporal disc.
@@ -388,7 +386,7 @@ INTEGER :: IKB,IKE,IIJE,IIJB,IKT   ! index value for the Beginning
 INTEGER :: JSV,JIJ,JK ! loop counter
 REAL    :: ZTIME1
 REAL    :: ZTIME2
-REAL(KIND=JPRB)      :: ZHOOK_HANDLE
+REAL(KIND=JPHOOK)    :: ZHOOK_HANDLE
 TYPE(TFIELDMETADATA) :: TZFIELD
 !----------------------------------------------------------------------------
 !----------------------------------------------------------------------------
@@ -408,7 +406,7 @@ IIJB=D%NIJB
 ! 3D Redelsperger numbers
 !
 !
-CALL PRANDTL(D,CST,CSTURB,KRR,KSV,KRRI,TURBN%LTURB_FLX,  &
+CALL PRANDTL(D,CST,CSTURB,TURBN, KRR,KSV,KRRI,TURBN%LTURB_FLX,  &
              TURBN%CTURBDIM,OOCEAN,TURBN%LHARAT,O2D,OCOMPUTE_SRC,&
              TPFILE, OFLAT,                        &
              PDXX,PDYY,PDZZ,PDZX,PDZY,             &
@@ -462,13 +460,13 @@ ENDIF
 !
 GUSERV = KRR/=0
 !
-CALL PHI3(D,CSTURB,ZREDTH1,ZREDR1,ZRED2TH3,ZRED2R3,ZRED2THR3,TURBN%CTURBDIM,GUSERV,ZPHI3)
+CALL PHI3(D,CSTURB,TURBN,ZREDTH1,ZREDR1,ZRED2TH3,ZRED2R3,ZRED2THR3,TURBN%CTURBDIM,GUSERV,ZPHI3)
 IF(KRR/=0) &
-CALL PSI3(D,CSTURB,ZREDR1,ZREDTH1,ZRED2R3,ZRED2TH3,ZRED2THR3,TURBN%CTURBDIM,GUSERV,ZPSI3)
+CALL PSI3(D,CSTURB,TURBN,ZREDR1,ZREDTH1,ZRED2R3,ZRED2TH3,ZRED2THR3,TURBN%CTURBDIM,GUSERV,ZPSI3)
 !
 ! Prandtl numbers for scalars
 !
-CALL PSI_SV(D,CSTURB,KSV,ZREDTH1,ZREDR1,ZREDS1,ZRED2THS,ZRED2RS,ZPHI3,ZPSI3,ZPSI_SV)
+CALL PSI_SV(D,CSTURB,TURBN,KSV,ZREDTH1,ZREDR1,ZREDS1,ZRED2THS,ZRED2RS,ZPHI3,ZPSI3,ZPSI_SV)
 !
 ! LES diagnostics
 !
@@ -506,7 +504,7 @@ ENDIF
                         KRR,KRRL,KRRI,KSV,KGRADIENTS,                 &
                         OOCEAN,ODEEPOC,OFLYER,                        &
                         OCOUPLES,OCOMPUTE_SRC,                        &
-                        PEXPL,PTSTEP,HPROGRAM,TPFILE,                 &
+                        PEXPL,PTSTEP,TPFILE,                          &
                         PDXX,PDYY,PDZZ,PDZX,PDZY,PDIRCOSZW,PZZ,       &
                         PRHODJ,PTHVREF,PHGRAD,PZS,                    &
                         PSFTHM,PSFRM,PSFTHP,PSFRP,                    &
@@ -521,7 +519,7 @@ ENDIF
                         PRTHLS,PRRS,ZTHLP,ZRP,PTP,PWTH,PWRC,          &
                         PSSTFL, PSSTFL_C, PSSRFL_C                    )
 !
-  CALL  TURB_VER_THERMO_CORR(D,CST,CSTURB,TURBN,TLES,                 &
+  CALL  TURB_VER_THERMO_CORR(D,CST,CSTURB,TURBN,NEBN,TLES,            &
                         KRR,KRRL,KRRI,KSV,                            &
                         OCOMPUTE_SRC,                                 &
                         OCOUPLES,                                     &
@@ -588,7 +586,7 @@ CALL  TURB_VER_SV_FLUX(D,CST,CSTURB,TURBN,TLES,ONOMIXLG,            &
 !
 !
 IF (KSV>0 .AND. TLES%LLES_CALL)                                          &
-CALL  TURB_VER_SV_CORR(D,CST,CSTURB,TLES,KRR,KRRL,KRRI,OOCEAN,      &
+CALL  TURB_VER_SV_CORR(D,CST,CSTURB,TURBN,TLES,KRR,KRRL,KRRI,OOCEAN,&
                       PDZZ,KSV,KSV_LGBEG,KSV_LGEND,ONOMIXLG,        &
                       OBLOWSNOW,OCOMPUTE_SRC,PRSNOW,                &
                       PTHLM,PRM,PTHVREF,                            &
diff --git a/src/PHYEX/turb/mode_turb_ver_dyn_flux.f90 b/src/PHYEX/turb/mode_turb_ver_dyn_flux.f90
index e500f4e5dbde508a36f94d8c68b4bee391d82b47..a5ed7627c1583b15f95ae79d8d771bcb716b8680 100644
--- a/src/PHYEX/turb/mode_turb_ver_dyn_flux.f90
+++ b/src/PHYEX/turb/mode_turb_ver_dyn_flux.f90
@@ -204,9 +204,8 @@ SUBROUTINE TURB_VER_DYN_FLUX(D,CST,CSTURB,TURBN,TLES,KSV,O2D,OFLAT, &
 !*      0. DECLARATIONS
 !          ------------
 !
-USE PARKIND1,   ONLY: JPRB
 USE MODE_SHUMAN_PHY
-USE YOMHOOK,    ONLY: LHOOK, DR_HOOK
+USE YOMHOOK,    ONLY: LHOOK, DR_HOOK, JPHOOK
 !
 USE MODD_CST,            ONLY: CST_t
 USE MODD_CTURB,          ONLY: CSTURB_t
@@ -214,7 +213,7 @@ USE MODD_DIMPHYEX,       ONLY: DIMPHYEX_t
 USE MODD_FIELD,          ONLY: TFIELDMETADATA, TYPEREAL
 USE MODD_IO,             ONLY: TFILEDATA
 USE MODD_LES,            ONLY: TLES_t
-USE MODD_PARAMETERS,     ONLY: JPVEXT_TURB, XUNDEF
+USE MODD_PARAMETERS,     ONLY: XUNDEF
 USE MODD_TURB_n,         ONLY: TURB_t
 !
 USE MODE_GRADIENT_U_PHY, ONLY : GZ_U_UW_PHY, GX_U_M_PHY
@@ -317,7 +316,7 @@ REAL, DIMENSION(D%NIJT,D%NKT)  ::  &
        ZKEFF,    & ! effectif diffusion coeff = LT * SQRT( TKE )
        ZWORK1,ZWORK2,&
        ZWORK3,ZWORK4,&
-       ZWORK5,ZWORK6! working var. for shuman operators (array syntax)
+       ZWORK5        ! working var. for shuman operators (array syntax)
 !
 INTEGER             :: IIJE,IIJB,IKB,IKE,IKA,IKU ! index value for the mass points of the domain 
 INTEGER             :: IKT          ! array size in k direction
@@ -337,7 +336,7 @@ TYPE(TFIELDMETADATA) :: TZFIELD
 !
 !*       1.   PRELIMINARIES
 !             -------------
-REAL(KIND=JPRB) :: ZHOOK_HANDLE
+REAL(KIND=JPHOOK) :: ZHOOK_HANDLE
 IF (LHOOK) CALL DR_HOOK('TURB_VER_DYN_FLUX',0,ZHOOK_HANDLE)
 !
 ZA(:,:)=XUNDEF
diff --git a/src/PHYEX/turb/mode_turb_ver_sv_corr.f90 b/src/PHYEX/turb/mode_turb_ver_sv_corr.f90
index 2f1dc8d9ac32d9ac2c56c338a897b55ee1426501..414746214615b1fee83f80ecbe2948b2033c890a 100644
--- a/src/PHYEX/turb/mode_turb_ver_sv_corr.f90
+++ b/src/PHYEX/turb/mode_turb_ver_sv_corr.f90
@@ -5,7 +5,7 @@
 MODULE MODE_TURB_VER_SV_CORR
 IMPLICIT NONE
 CONTAINS
-SUBROUTINE TURB_VER_SV_CORR(D,CST,CSTURB,TLES,KRR,KRRL,KRRI,OOCEAN, &
+SUBROUTINE TURB_VER_SV_CORR(D,CST,CSTURB,TURBN,TLES,KRR,KRRL,KRRI,OOCEAN, &
                       PDZZ,KSV,KSV_LGBEG,KSV_LGEND,ONOMIXLG,        &
                       OBLOWSNOW,OCOMPUTE_SRC,PRSNOW,                &
                       PTHLM,PRM,PTHVREF,                            &
@@ -53,13 +53,12 @@ SUBROUTINE TURB_VER_SV_CORR(D,CST,CSTURB,TLES,KRR,KRRL,KRRI,OOCEAN, &
 !*      0. DECLARATIONS
 !          ------------
 !
-USE PARKIND1, ONLY : JPRB
-USE YOMHOOK , ONLY : LHOOK, DR_HOOK
+USE YOMHOOK , ONLY : LHOOK, DR_HOOK, JPHOOK
 !
 USE MODD_CST, ONLY: CST_t
 USE MODD_CTURB, ONLY: CSTURB_t
+USE MODD_TURB_n, ONLY: TURB_t
 USE MODD_DIMPHYEX, ONLY: DIMPHYEX_t
-USE MODD_PARAMETERS, ONLY: JPVEXT_TURB
 USE MODD_LES, ONLY: TLES_t
 !
 USE MODE_SHUMAN_PHY, ONLY:  MZF_PHY
@@ -79,6 +78,7 @@ IMPLICIT NONE
 TYPE(DIMPHYEX_t),       INTENT(IN)   ::  D
 TYPE(CST_t),            INTENT(IN)   ::  CST
 TYPE(CSTURB_t),         INTENT(IN)   ::  CSTURB
+TYPE(TURB_t),           INTENT(IN)   ::  TURBN
 TYPE(TLES_t),           INTENT(INOUT)::  TLES         ! modd_les structure
 INTEGER,                INTENT(IN)   ::  KSV, KSV_LGBEG, KSV_LGEND ! number of scalar variables
 LOGICAL,                INTENT(IN)   ::  OOCEAN       ! switch for Ocean model version
@@ -131,7 +131,7 @@ REAL :: ZCTSVD = 2.4  ! constant for temperature - scalar covariance dissipation
 REAL :: ZCQSVD = 2.4  ! constant for humidity - scalar covariance dissipation
 !----------------------------------------------------------------------------
 !
-REAL(KIND=JPRB) :: ZHOOK_HANDLE
+REAL(KIND=JPHOOK) :: ZHOOK_HANDLE
 IF (LHOOK) CALL DR_HOOK('TURB_VER_SV_CORR',0,ZHOOK_HANDLE)
 !
 IIJE=D%NIJE
@@ -142,9 +142,9 @@ CALL SECOND_MNH(ZTIME1)
 !
 IF(OBLOWSNOW) THEN
 ! See Vionnet (PhD, 2012) for a complete discussion around the value of the Schmidt number for blowing snow variables          
-   ZCSV= CSTURB%XCHF/PRSNOW
+   ZCSV= TURBN%XCHF/PRSNOW
 ELSE
-   ZCSV= CSTURB%XCHF
+   ZCSV= TURBN%XCHF
 ENDIF
 !
 DO JSV=1,KSV
@@ -178,7 +178,7 @@ DO JSV=1,KSV
     CALL GZ_M_W_PHY(D,PSVM(:,:,JSV),PDZZ,ZWORK2)
     !
     !$mnh_expand_array(JIJ=IIJB:IIJE,JK=1:IKT)
-    ZFLXZ(:,:)= ( CSTURB%XCSHF * PPHI3(:,:) + ZCSV * PPSI_SV(:,:,JSV) ) &
+    ZFLXZ(:,:)= ( TURBN%XCSHF * PPHI3(:,:) + ZCSV * PPSI_SV(:,:,JSV) ) &
                   *  ZWORK1(:,:) *  ZWORK2(:,:)
     !$mnh_end_expand_array(JIJ=IIJB:IIJE,JK=1:IKT)
     !
diff --git a/src/PHYEX/turb/mode_turb_ver_sv_flux.f90 b/src/PHYEX/turb/mode_turb_ver_sv_flux.f90
index 21443271df8bc1968d471c2e683e20003032c6b9..b91bca2b68fe7b2debfaa13368868f1b37e6b1e1 100644
--- a/src/PHYEX/turb/mode_turb_ver_sv_flux.f90
+++ b/src/PHYEX/turb/mode_turb_ver_sv_flux.f90
@@ -210,9 +210,8 @@ SUBROUTINE TURB_VER_SV_FLUX(D,CST,CSTURB,TURBN,TLES,ONOMIXLG,       &
 !*      0. DECLARATIONS
 !          ------------
 !
-USE PARKIND1,   ONLY: JPRB
 USE MODE_SHUMAN_PHY, ONLY: DZM_PHY, MZM_PHY, MZF_PHY
-USE YOMHOOK,    ONLY: LHOOK, DR_HOOK
+USE YOMHOOK,    ONLY: LHOOK, DR_HOOK, JPHOOK
 !
 USE MODD_CST,              ONLY: CST_t
 USE MODD_CTURB,            ONLY: CSTURB_t
@@ -220,11 +219,9 @@ USE MODD_DIMPHYEX,         ONLY: DIMPHYEX_t
 USE MODD_FIELD,            ONLY: TFIELDMETADATA, TYPEREAL
 USE MODD_IO,               ONLY: TFILEDATA
 USE MODD_LES,              ONLY: TLES_t
-USE MODD_PARAMETERS,       ONLY: JPVEXT_TURB, NMNHNAMELGTMAX
+USE MODD_PARAMETERS,       ONLY: NMNHNAMELGTMAX
 USE MODD_TURB_n,           ONLY: TURB_t
 !
-USE MODE_EMOIST,         ONLY: EMOIST
-USE MODE_ETHETA,         ONLY: ETHETA
 USE MODE_GRADIENT_W_PHY, ONLY: GZ_W_M_PHY
 USE MODE_GRADIENT_M_PHY, ONLY: GZ_M_W_PHY
 USE MODE_IO_FIELD_WRITE_PHY, ONLY: IO_FIELD_WRITE_PHY
@@ -306,7 +303,7 @@ REAL :: ZCSVP = 4.0  ! constant for scalar flux presso-correlation (RS81)
 REAL :: ZCSV          !constant for the scalar flux
 !
 CHARACTER(LEN=NMNHNAMELGTMAX) :: YMNHNAME
-REAL(KIND=JPRB)               :: ZHOOK_HANDLE
+REAL(KIND=JPHOOK)             :: ZHOOK_HANDLE
 TYPE(TFIELDMETADATA)          :: TZFIELD
 !----------------------------------------------------------------------------
 !
@@ -338,9 +335,9 @@ ENDIF
 !
 IF(OBLOWSNOW) THEN
 ! See Vionnet (PhD, 2012) for a complete discussion around the value of the Schmidt number for blowing snow variables
-   ZCSV=CSTURB%XCHF/PRSNOW
+   ZCSV=TURBN%XCHF/PRSNOW
 ELSE
-   ZCSV=CSTURB%XCHF
+   ZCSV=TURBN%XCHF
 ENDIF
 !----------------------------------------------------------------------------
 !
diff --git a/src/PHYEX/turb/mode_turb_ver_thermo_corr.f90 b/src/PHYEX/turb/mode_turb_ver_thermo_corr.f90
index 2ee5d5de45e9fe302c8fd4af1c058719b03aafcc..d93fbfb87a71e076307a436dd14912812c083167 100644
--- a/src/PHYEX/turb/mode_turb_ver_thermo_corr.f90
+++ b/src/PHYEX/turb/mode_turb_ver_thermo_corr.f90
@@ -6,7 +6,7 @@
 MODULE MODE_TURB_VER_THERMO_CORR
 IMPLICIT NONE
 CONTAINS      
-SUBROUTINE TURB_VER_THERMO_CORR(D,CST,CSTURB,TURBN,TLES,            &
+SUBROUTINE TURB_VER_THERMO_CORR(D,CST,CSTURB,TURBN,NEBN,TLES,       &
                       KRR,KRRL,KRRI,KSV,                            &
                       OCOMPUTE_SRC,OCOUPLES,                        &
                       PEXPL,TPFILE,                                 &
@@ -140,7 +140,7 @@ SUBROUTINE TURB_VER_THERMO_CORR(D,CST,CSTURB,TURBN,TLES,            &
 !!           CSTURB%XCMFS,XCMFB : cts for the momentum flux
 !!           CSTURB%XCSHF       : ct for the sensible heat flux
 !!           CSTURB%XCHF        : ct for the moisture flux
-!!           CSTURB%XCTV,CSTURB%XCHV   : cts for the T and moisture variances
+!!           TURBN%XCTV,TURBN%XCHV   : cts for the T and moisture variances
 !!
 !!      Module MODD_PARAMETERS
 !!
@@ -199,14 +199,14 @@ SUBROUTINE TURB_VER_THERMO_CORR(D,CST,CSTURB,TURBN,TLES,            &
 !!      Modifications  July 2015 (Wim de Rooy) TURBN%LHARAT switch
 !!  Philippe Wautelet: 05/2016-04/2018: new data structures and calls for I/O
 !!      Modifications  June 2019 (Wim de Rooy) New set up cloud scheme
+!!      Modifications: June 2023 (S. Riette) tunable value for SIGS minimum value
 !!--------------------------------------------------------------------------
 !
 !*      0. DECLARATIONS
 !          ------------
 !
-USE PARKIND1,   ONLY: JPRB
 USE MODE_SHUMAN_PHY, ONLY: MZM_PHY, MZF_PHY, DZM_PHY
-USE YOMHOOK,    ONLY: LHOOK, DR_HOOK
+USE YOMHOOK,    ONLY: LHOOK, DR_HOOK, JPHOOK
 !
 USE MODD_CST,            ONLY: CST_t
 USE MODD_CTURB,          ONLY: CSTURB_t
@@ -216,6 +216,7 @@ USE MODD_IO,             ONLY: TFILEDATA
 USE MODD_LES,            ONLY: TLES_t
 USE MODD_PARAMETERS,     ONLY: JPVEXT_TURB
 USE MODD_TURB_n,         ONLY: TURB_t
+USE MODD_NEB_n,          ONLY: NEB_t
 !
 USE MODE_IO_FIELD_WRITE_PHY, ONLY: IO_FIELD_WRITE_PHY
 USE MODE_PRANDTL
@@ -233,6 +234,7 @@ TYPE(DIMPHYEX_t),       INTENT(IN)   :: D
 TYPE(CST_t),            INTENT(IN)   :: CST
 TYPE(CSTURB_t),         INTENT(IN)   :: CSTURB
 TYPE(TURB_t),           INTENT(IN)   :: TURBN
+TYPE(NEB_t),            INTENT(IN)   :: NEBN
 TYPE(TLES_t),           INTENT(INOUT):: TLES          ! modd_les structure
 INTEGER,                INTENT(IN)   :: KRR           ! number of moist var.
 INTEGER,                INTENT(IN)   :: KSV           ! number of scalar var.
@@ -309,14 +311,11 @@ REAL, DIMENSION(MERGE(D%NIJT,0,OCOMPUTE_SRC),&
 !
 !
 REAL, DIMENSION(D%NIJT,D%NKT)  ::  &
-       ZA,       & ! work variable for wrc
        ZFLXZ,    & ! vertical flux of the treated variable
-       ZSOURCE,  & ! source of evolution for the treated variable
        ZKEFF,    & ! effectif diffusion coeff = LT * SQRT( TKE )
        ZF,       & ! Flux in dTh/dt =-dF/dz (evaluated at t-1)(or rt instead of Th)
        ZDFDDTDZ, & ! dF/d(dTh/dz)
        ZDFDDRDZ, & ! dF/d(dr/dz)
-       Z3RDMOMENT, & ! 3 order term in flux or variance equation
 ! Estimate of full level length and dissipation length scale in case TURBN%LHARATU
        PLMF,     & ! estimate full level length scale from half levels (sub optimal)
        PLEPSF,   & ! estimate full level diss length scale from half levels (sub optimal)
@@ -353,7 +352,7 @@ TYPE(TFIELDMETADATA) :: TZFIELD
 !*       1.   PRELIMINARIES
 !             -------------
 !
-REAL(KIND=JPRB) :: ZHOOK_HANDLE
+REAL(KIND=JPHOOK) :: ZHOOK_HANDLE
 IF (LHOOK) CALL DR_HOOK('TURB_VER_THERMO_CORR',0,ZHOOK_HANDLE)
 !
 IKB=D%NKB
@@ -382,7 +381,7 @@ ZCOEFF(:,IKB)= - (PDZZ(:,IKB+2*IKL)+2.*PDZZ(:,IKB+IKL)) /      &
 IF (TURBN%LHARAT) THEN
   CALL MZF_PHY(D,PLM,PLMF)
   !wc Part of the new statistical cloud scheme set up
-  IF (TURBN%LSTATNW) THEN
+  IF (NEBN%LSTATNW) THEN
     CALL MZF_PHY(D,PLEPS,PLEPSF)
   ELSE
     PLEPSF(:,:)=PLMF(:,:)
@@ -435,9 +434,9 @@ END IF
     ZWORK1(:,:)=PDTH_DZ(:,:)**2
     !$mnh_end_expand_array(JIJ=IIJB:IIJE,JK=1:IKT)
     CALL MZF_PHY(D,ZWORK1,ZWORK2)
-    IF (TURBN%LSTATNW) THEN
+    IF (NEBN%LSTATNW) THEN
       !$mnh_expand_array(JIJ=IIJB:IIJE,JK=1:IKT)
-      ZF(:,:) = CSTURB%XCTV * & 
+      ZF(:,:) = TURBN%XCTV * & 
                               PLMF(:,:)*PLEPSF(:,:)*ZWORK2(:,:)
       !$mnh_end_expand_array(JIJ=IIJB:IIJE,JK=1:IKT)
     ELSE
@@ -451,7 +450,7 @@ END IF
     !$mnh_end_expand_array(JIJ=IIJB:IIJE,JK=1:IKT)
     CALL MZF_PHY(D,ZWORK1,ZWORK2)
     !$mnh_expand_array(JIJ=IIJB:IIJE,JK=1:IKT)
-    ZF(:,:) = CSTURB%XCTV*PLM(:,:)*PLEPS(:,:)& 
+    ZF(:,:) = TURBN%XCTV*PLM(:,:)*PLEPS(:,:)& 
                                  * ZWORK2(:,:)
     !$mnh_end_expand_array(JIJ=IIJB:IIJE,JK=1:IKT)
   ENDIF
@@ -461,8 +460,8 @@ END IF
   !
   ! d(w'th'2)/dz
   IF (GFTH2) THEN
-    CALL M3_TH2_WTH2(D,CSTURB,PREDTH1,PREDR1,PD,PLEPS,PSQRT_TKE,ZWORK1)
-    CALL D_M3_TH2_WTH2_O_DDTDZ(D,CSTURB,PREDTH1,PREDR1,&
+    CALL M3_TH2_WTH2(D,CSTURB,TURBN,PREDTH1,PREDR1,PD,PLEPS,PSQRT_TKE,ZWORK1)
+    CALL D_M3_TH2_WTH2_O_DDTDZ(D,CSTURB,TURBN,PREDTH1,PREDR1,&
      & PD,PLEPS,PSQRT_TKE,PBLL_O_E,PETHETA,ZWORK2)
     !
     !$mnh_expand_array(JIJ=IIJB:IIJE,JK=1:IKT)
@@ -475,10 +474,10 @@ END IF
   !
   ! d(w'2th')/dz
   IF (GFWTH) THEN
-    CALL M3_TH2_W2TH(D,CSTURB,PREDTH1,PREDR1,PD,PDTH_DZ,&
+    CALL M3_TH2_W2TH(D,CSTURB,TURBN,PREDTH1,PREDR1,PD,PDTH_DZ,&
      & PLM,PLEPS,PTKEM,ZWORK1)
     CALL MZF_PHY(D,PFWTH,ZWORK2)
-    CALL D_M3_TH2_W2TH_O_DDTDZ(D,CSTURB,PREDTH1,PREDR1,PD,&
+    CALL D_M3_TH2_W2TH_O_DDTDZ(D,CSTURB,TURBN,PREDTH1,PREDR1,PD,&
      & PLM,PLEPS,PTKEM,GUSERV,ZWORK3)
     !
     !$mnh_expand_array(JIJ=IIJB:IIJE,JK=1:IKT)
@@ -492,9 +491,9 @@ END IF
   IF (KRR/=0) THEN
     ! d(w'r'2)/dz
     IF (GFR2) THEN
-      CALL M3_TH2_WR2(D,CSTURB,PD,PLEPS,PSQRT_TKE,PBLL_O_E,&
+      CALL M3_TH2_WR2(D,CSTURB,TURBN,PD,PLEPS,PSQRT_TKE,PBLL_O_E,&
        & PEMOIST,PDTH_DZ,ZWORK1)
-      CALL D_M3_TH2_WR2_O_DDTDZ(D,CSTURB,PREDTH1,PREDR1,PD,&
+      CALL D_M3_TH2_WR2_O_DDTDZ(D,CSTURB,TURBN,PREDTH1,PREDR1,PD,&
        & PLEPS,PSQRT_TKE,PBLL_O_E,PEMOIST,PDTH_DZ,ZWORK2)
       !
       !$mnh_expand_array(JIJ=IIJB:IIJE,JK=1:IKT)
@@ -507,10 +506,10 @@ END IF
     !
     ! d(w'2r')/dz
     IF (GFWR) THEN
-      CALL M3_TH2_W2R(D,CSTURB,PD,PLM,PLEPS,PTKEM,PBLL_O_E,&
+      CALL M3_TH2_W2R(D,CSTURB,TURBN,PD,PLM,PLEPS,PTKEM,PBLL_O_E,&
        & PEMOIST,PDTH_DZ,ZWORK1)
     CALL MZF_PHY(D,PFWR,ZWORK2)
-      CALL D_M3_TH2_W2R_O_DDTDZ(D,CSTURB,PREDTH1,PREDR1,PD,&
+      CALL D_M3_TH2_W2R_O_DDTDZ(D,CSTURB,TURBN,PREDTH1,PREDR1,PD,&
        & PLM,PLEPS,PTKEM,PBLL_O_E,PEMOIST,PDTH_DZ,ZWORK3)
       !
       !$mnh_expand_array(JIJ=IIJB:IIJE,JK=1:IKT)
@@ -523,9 +522,9 @@ END IF
     !
     ! d(w'th'r')/dz
     IF (GFTHR) THEN
-      CALL M3_TH2_WTHR(D,CSTURB,PREDR1,PD,PLEPS,PSQRT_TKE,&
+      CALL M3_TH2_WTHR(D,CSTURB,TURBN,PREDR1,PD,PLEPS,PSQRT_TKE,&
        & PBLL_O_E,PEMOIST,PDTH_DZ,ZWORK1)
-       CALL D_M3_TH2_WTHR_O_DDTDZ(D,CSTURB,PREDTH1,PREDR1,&
+       CALL D_M3_TH2_WTHR_O_DDTDZ(D,CSTURB,TURBN,PREDTH1,PREDR1,&
        & PD,PLEPS,PSQRT_TKE,PBLL_O_E,PEMOIST,PDTH_DZ,ZWORK2)
       !
       !$mnh_expand_array(JIJ=IIJB:IIJE,JK=1:IKT)
@@ -567,14 +566,14 @@ END IF
       +ZCOEFF(:,IKB      )*PTHLP(:,IKB  )   )**2          &
     ) 
     !$mnh_end_expand_array(JIJ=IIJB:IIJE)
-    IF (TURBN%LSTATNW) THEN
+    IF (NEBN%LSTATNW) THEN
       !$mnh_expand_array(JIJ=IIJB:IIJE)
-      ZFLXZ(:,IKB) = CSTURB%XCTV * ZFLXZ(:,IKB)
+      ZFLXZ(:,IKB) = TURBN%XCTV * ZFLXZ(:,IKB)
       !$mnh_end_expand_array(JIJ=IIJB:IIJE)
-     END IF
+    END IF
   ELSE
      !$mnh_expand_array(JIJ=IIJB:IIJE)
-     ZFLXZ(:,IKB) = CSTURB%XCTV * PPHI3(:,IKB+IKL) * PLM(:,IKB)   &
+     ZFLXZ(:,IKB) = TURBN%XCTV * PPHI3(:,IKB+IKL) * PLM(:,IKB)   &
      * PLEPS(:,IKB)                                         &
      *( PEXPL *                                                  &
      ( ZCOEFF(:,IKB+2*IKL)*PTHLM(:,IKB+2*IKL)             &
@@ -592,7 +591,7 @@ END IF
   ZFLXZ(:,IKA) = ZFLXZ(:,IKB)
   !$mnh_end_expand_array(JIJ=IIJB:IIJE)
   !
-  IF (TURBN%LSTATNW) THEN
+  IF (NEBN%LSTATNW) THEN
     !wc  The variance from the budget eq should be multiplied by 2 here
     !    thl'2=2*L*LEPS*(dthl/dz**2)
     !$mnh_expand_array(JIJ=IIJB:IIJE,JK=1:IKT)
@@ -674,9 +673,9 @@ END IF
     ZWORK1(:,:) = PDTH_DZ(:,:)*PDR_DZ(:,:)
     !$mnh_end_expand_array(JIJ=IIJB:IIJE,JK=1:IKT)
     CALL MZF_PHY(D,ZWORK1,ZWORK2)
-    IF (TURBN%LSTATNW) THEN
+    IF (NEBN%LSTATNW) THEN
       !$mnh_expand_array(JIJ=IIJB:IIJE,JK=1:IKT)
-      ZF(:,:) = CSTURB%XCTV * &
+      ZF(:,:) = TURBN%XCTV * &
                               PLMF(:,:)*PLEPSF(:,:)*ZWORK2(:,:)
       !$mnh_end_expand_array(JIJ=IIJB:IIJE,JK=1:IKT)
     ELSE
@@ -691,7 +690,7 @@ END IF
     !$mnh_end_expand_array(JIJ=IIJB:IIJE,JK=1:IKT)
     CALL MZF_PHY(D,ZWORK1,ZWORK2)
     !$mnh_expand_array(JIJ=IIJB:IIJE,JK=1:IKT)
-    ZF(:,:) = CSTURB%XCTV*PLM(:,:)*PLEPS(:,:)& 
+    ZF(:,:) = TURBN%XCTV*PLM(:,:)*PLEPS(:,:)& 
                                  * ZWORK2(:,:)
     !$mnh_end_expand_array(JIJ=IIJB:IIJE,JK=1:IKT)
   ENDIF
@@ -702,11 +701,11 @@ END IF
     !
     ! d(w'th'2)/dz
     IF (GFTH2) THEN
-      CALL M3_THR_WTH2(D,CSTURB,PREDR1,PD,PLEPS,PSQRT_TKE,&
+      CALL M3_THR_WTH2(D,CSTURB,TURBN,PREDR1,PD,PLEPS,PSQRT_TKE,&
        & PBLL_O_E,PETHETA,PDR_DZ,ZWORK1)
-      CALL D_M3_THR_WTH2_O_DDTDZ(D,CSTURB,PREDTH1,PREDR1,&
+      CALL D_M3_THR_WTH2_O_DDTDZ(D,CSTURB,TURBN,PREDTH1,PREDR1,&
        & PD,PLEPS,PSQRT_TKE,PBLL_O_E,PETHETA,PDR_DZ,ZWORK2)
-      CALL D_M3_THR_WTH2_O_DDRDZ(D,CSTURB,PREDTH1,PREDR1,&
+      CALL D_M3_THR_WTH2_O_DDRDZ(D,CSTURB,TURBN,PREDTH1,PREDR1,&
        & PD,PLEPS,PSQRT_TKE,PBLL_O_E,PETHETA,ZWORK3)
       !
       !$mnh_expand_array(JIJ=IIJB:IIJE,JK=1:IKT)
@@ -721,11 +720,11 @@ END IF
     ! d(w'2th')/dz
     IF (GFWTH) THEN
       CALL MZF_PHY(D,PFWTH,ZWORK1)
-      CALL M3_THR_W2TH(D,CSTURB,PREDR1,PD,PLM,PLEPS,PTKEM,&
+      CALL M3_THR_W2TH(D,CSTURB,TURBN,PREDR1,PD,PLM,PLEPS,PTKEM,&
        & PDR_DZ,ZWORK2)
-      CALL D_M3_THR_W2TH_O_DDTDZ(D,CSTURB,PREDTH1,PREDR1,&
+      CALL D_M3_THR_W2TH_O_DDTDZ(D,CSTURB,TURBN,PREDTH1,PREDR1,&
        & PD,PLM,PLEPS,PTKEM,PBLL_O_E,PDR_DZ,PETHETA,ZWORK3)
-      CALL D_M3_THR_W2TH_O_DDRDZ(D,CSTURB,PREDTH1,PREDR1,&
+      CALL D_M3_THR_W2TH_O_DDRDZ(D,CSTURB,TURBN,PREDTH1,PREDR1,&
        & PD,PLM,PLEPS,PTKEM,ZWORK4)
       !
       !$mnh_expand_array(JIJ=IIJB:IIJE,JK=1:IKT)
@@ -740,11 +739,11 @@ END IF
     !
     ! d(w'r'2)/dz
     IF (GFR2) THEN
-      CALL M3_THR_WR2(D,CSTURB,PREDTH1,PD,PLEPS,PSQRT_TKE,&
+      CALL M3_THR_WR2(D,CSTURB,TURBN,PREDTH1,PD,PLEPS,PSQRT_TKE,&
        & PBLL_O_E,PEMOIST,PDTH_DZ,ZWORK1)
-      CALL D_M3_THR_WR2_O_DDTDZ(D,CSTURB,PREDR1,PREDTH1,PD,&
+      CALL D_M3_THR_WR2_O_DDTDZ(D,CSTURB,TURBN,PREDR1,PREDTH1,PD,&
        & PLEPS,PSQRT_TKE,PBLL_O_E,PEMOIST,ZWORK2)
-      CALL D_M3_THR_WR2_O_DDRDZ(D,CSTURB,PREDR1,PREDTH1,PD,&
+      CALL D_M3_THR_WR2_O_DDRDZ(D,CSTURB,TURBN,PREDR1,PREDTH1,PD,&
        & PLEPS,PSQRT_TKE,PBLL_O_E,PEMOIST,PDTH_DZ,ZWORK3)
       !
       !$mnh_expand_array(JIJ=IIJB:IIJE,JK=1:IKT)
@@ -759,11 +758,11 @@ END IF
       ! d(w'2r')/dz
     IF (GFWR) THEN
       CALL MZF_PHY(D,PFWR,ZWORK1)
-      CALL M3_THR_W2R(D,CSTURB,PREDTH1,PD,PLM,PLEPS,PTKEM,&
+      CALL M3_THR_W2R(D,CSTURB,TURBN,PREDTH1,PD,PLM,PLEPS,PTKEM,&
       & PDTH_DZ,ZWORK2)
-      CALL D_M3_THR_W2R_O_DDTDZ(D,CSTURB,PREDR1,PREDTH1,PD,&
+      CALL D_M3_THR_W2R_O_DDTDZ(D,CSTURB,TURBN,PREDR1,PREDTH1,PD,&
       & PLM,PLEPS,PTKEM,ZWORK3)
-      CALL D_M3_THR_W2R_O_DDRDZ(D,CSTURB,PREDR1,PREDTH1,PD,&
+      CALL D_M3_THR_W2R_O_DDRDZ(D,CSTURB,TURBN,PREDR1,PREDTH1,PD,&
       & PLM,PLEPS,PTKEM,PBLL_O_E,PDTH_DZ,PEMOIST,ZWORK4)
       !
       !$mnh_expand_array(JIJ=IIJB:IIJE,JK=1:IKT)
@@ -777,11 +776,11 @@ END IF
     !
     ! d(w'th'r')/dz
     IF (GFTHR) THEN
-      CALL M3_THR_WTHR(D,CSTURB,PREDTH1,PREDR1,PD,PLEPS,&
+      CALL M3_THR_WTHR(D,CSTURB,TURBN,PREDTH1,PREDR1,PD,PLEPS,&
       & PSQRT_TKE,ZWORK1)
-      CALL D_M3_THR_WTHR_O_DDTDZ(D,CSTURB,PREDTH1,PREDR1,&
+      CALL D_M3_THR_WTHR_O_DDTDZ(D,CSTURB,TURBN,PREDTH1,PREDR1,&
       & PD,PLEPS,PSQRT_TKE,PBLL_O_E,PETHETA,ZWORK2)
-      CALL D_M3_THR_WTHR_O_DDRDZ(D,CSTURB,PREDR1,PREDTH1,&
+      CALL D_M3_THR_WTHR_O_DDRDZ(D,CSTURB,TURBN,PREDR1,PREDTH1,&
       & PD,PLEPS,PSQRT_TKE,PBLL_O_E,PEMOIST,ZWORK3)
       !
       !$mnh_expand_array(JIJ=IIJB:IIJE,JK=1:IKT)
@@ -821,19 +820,19 @@ END IF
         + TURBN%XIMPL * ZDFDDTDZ(:,:) * ZWORK7(:,:) &
         + TURBN%XIMPL * ZDFDDRDZ(:,:) * ZWORK8(:,:)
       !$mnh_end_expand_array(JIJ=IIJB:IIJE,JK=1:IKT)
-      IF (TURBN%LSTATNW) THEN    
+      IF (NEBN%LSTATNW) THEN    
         !$mnh_expand_array(JIJ=IIJB:IIJE,JK=1:IKT)
-        ZFLXZ(:,:)   = CSTURB%XCTV * ZFLXZ(:,:)
+        ZFLXZ(:,:)   = TURBN%XCTV * ZFLXZ(:,:)
         !$mnh_end_expand_array(JIJ=IIJB:IIJE,JK=1:IKT)
       END IF
     ELSE
-      CALL D_PHI3DTDZ_O_DDTDZ(D,CSTURB,PPHI3,PREDTH1,PREDR1,PRED2TH3,PRED2THR3,TURBN%CTURBDIM,GUSERV,ZWKPHIPSI1) 
+      CALL D_PHI3DTDZ_O_DDTDZ(D,CSTURB,TURBN,PPHI3,PREDTH1,PREDR1,PRED2TH3,PRED2THR3,TURBN%CTURBDIM,GUSERV,ZWKPHIPSI1) 
       ! d(phi3*dthdz)/ddthdz term
-      CALL D_PSI3DTDZ_O_DDTDZ(D,CSTURB,PPSI3,PREDR1,PREDTH1,PRED2R3,PRED2THR3,TURBN%CTURBDIM,GUSERV,ZWKPHIPSI2) 
+      CALL D_PSI3DTDZ_O_DDTDZ(D,CSTURB,TURBN,PPSI3,PREDR1,PREDTH1,PRED2R3,PRED2THR3,TURBN%CTURBDIM,GUSERV,ZWKPHIPSI2) 
       ! d(psi3*dthdz)/ddthdz term
-      CALL D_PHI3DRDZ_O_DDRDZ(D,CSTURB,PPHI3,PREDTH1,PREDR1,PRED2TH3,PRED2THR3,TURBN%CTURBDIM,GUSERV,ZWKPHIPSI3)
+      CALL D_PHI3DRDZ_O_DDRDZ(D,CSTURB,TURBN,PPHI3,PREDTH1,PREDR1,PRED2TH3,PRED2THR3,TURBN%CTURBDIM,GUSERV,ZWKPHIPSI3)
       ! d(phi3*drdz )/ddrdz term
-      CALL D_PSI3DRDZ_O_DDRDZ(D,CSTURB,PPSI3,PREDR1,PREDTH1,PRED2R3,PRED2THR3,TURBN%CTURBDIM,GUSERV,ZWKPHIPSI4)
+      CALL D_PSI3DRDZ_O_DDRDZ(D,CSTURB,TURBN,PPSI3,PREDR1,PREDTH1,PRED2R3,PRED2THR3,TURBN%CTURBDIM,GUSERV,ZWKPHIPSI4)
       ! d(psi3*drdz )/ddrdz term
  
       !$mnh_expand_array(JIJ=IIJB:IIJE,JK=1:IKT)
@@ -846,7 +845,7 @@ END IF
       
       !$mnh_expand_array(JIJ=IIJB:IIJE,JK=1:IKT)
       ZFLXZ(:,:)   = ZF(:,:)                          &
-        + TURBN%XIMPL * CSTURB%XCTV*PLM(:,:)*PLEPS(:,:)*0.5 &
+        + TURBN%XIMPL * TURBN%XCTV*PLM(:,:)*PLEPS(:,:)*0.5 &
           * ZWORK6(:,:)                                                   &
         + TURBN%XIMPL * ZDFDDTDZ(:,:) * ZWORK7(:,:)         &
         + TURBN%XIMPL * ZDFDDRDZ(:,:) * ZWORK8(:,:)
@@ -874,15 +873,15 @@ END IF
           +ZCOEFF(:,IKB      )*PRP(:,IKB        ))                &
        )
       !$mnh_end_expand_array(JIJ=IIJB:IIJE)
-    IF (TURBN%LSTATNW) THEN
+    IF (NEBN%LSTATNW) THEN
       !$mnh_expand_array(JIJ=IIJB:IIJE)
-      ZFLXZ(:,IKB) = (CSTURB%XCHT1 + CSTURB%XCHT2) * ZFLXZ(:,IKB)
+      ZFLXZ(:,IKB) = (TURBN%XCHT1 + TURBN%XCHT2) * ZFLXZ(:,IKB)
       !$mnh_end_expand_array(JIJ=IIJB:IIJE)
     END IF
     ELSE 
       !$mnh_expand_array(JIJ=IIJB:IIJE)
       ZFLXZ(:,IKB) =                                                            & 
-      (CSTURB%XCHT1 * PPHI3(:,IKB+IKL) + CSTURB%XCHT2 * PPSI3(:,IKB+IKL))   &
+      (TURBN%XCHT1 * PPHI3(:,IKB+IKL) + TURBN%XCHT2 * PPSI3(:,IKB+IKL))   &
       *( PEXPL *                                                                              &
          ( ZCOEFF(:,IKB+2*IKL)*PTHLM(:,IKB+2*IKL)             &
           +ZCOEFF(:,IKB+IKL  )*PTHLM(:,IKB+IKL  )             & 
@@ -905,7 +904,7 @@ END IF
     ZFLXZ(:,IKA) = ZFLXZ(:,IKB)
     !$mnh_end_expand_array(JIJ=IIJB:IIJE)
     !
-    IF (TURBN%LSTATNW) THEN
+    IF (NEBN%LSTATNW) THEN
       !wc  The variance from the budget eq should be multiplied by 2 here
       !    e.g. thl'2=2*L*LEPS*(cab)^-1 *(dthl/dz**2)
       !$mnh_expand_array(JIJ=IIJB:IIJE,JK=1:IKT)
@@ -913,7 +912,7 @@ END IF
       !$mnh_end_expand_array(JIJ=IIJB:IIJE,JK=1:IKT)
     ENDIF
     IF ( KRRL > 0 ) THEN
-      IF (TURBN%LSTATNW) THEN
+      IF (NEBN%LSTATNW) THEN
         !wc Part of the new statistical cloud scheme set up. Normal notation so - sign
         !$mnh_expand_array(JIJ=IIJB:IIJE,JK=1:IKT)
         PSIGS(:,:) = PSIGS(:,:) -     &
@@ -1001,9 +1000,9 @@ IF (TURBN%LHARAT) THEN
   !$mnh_expand_array(JIJ=IIJB:IIJE,JK=1:IKT)
   ZF(:,:) = PLMF(:,:)*PLEPSF(:,:)*ZWORK2(:,:)
   !$mnh_end_expand_array(JIJ=IIJB:IIJE,JK=1:IKT)
-  IF (TURBN%LSTATNW) THEN
+  IF (NEBN%LSTATNW) THEN
     !$mnh_expand_array(JIJ=IIJB:IIJE,JK=1:IKT)
-    ZF(:,:) = CSTURB%XCTV * ZF(:,:)
+    ZF(:,:) = TURBN%XCTV * ZF(:,:)
     !$mnh_end_expand_array(JIJ=IIJB:IIJE,JK=1:IKT)
   END IF
 ELSE
@@ -1012,7 +1011,7 @@ ELSE
   !$mnh_end_expand_array(JIJ=IIJB:IIJE,JK=1:IKT)
   CALL MZF_PHY(D,ZWORK1,ZWORK2)
   !$mnh_expand_array(JIJ=IIJB:IIJE,JK=1:IKT)
-  ZF(:,:) = CSTURB%XCTV*PLM(:,:)*PLEPS(:,:)& 
+  ZF(:,:) = TURBN%XCTV*PLM(:,:)*PLEPS(:,:)& 
                                 *ZWORK2(:,:)
   !$mnh_end_expand_array(JIJ=IIJB:IIJE,JK=1:IKT)
 ENDIF
@@ -1022,9 +1021,9 @@ ENDIF
     !
     ! d(w'r'2)/dz
     IF (GFR2) THEN
-      CALL M3_R2_WR2(D,CSTURB,PREDR1,PREDTH1,PD,PLEPS,&
+      CALL M3_R2_WR2(D,CSTURB,TURBN,PREDR1,PREDTH1,PD,PLEPS,&
       & PSQRT_TKE,ZWORK1)
-      CALL D_M3_R2_WR2_O_DDRDZ(D,CSTURB,PREDR1,PREDTH1,&
+      CALL D_M3_R2_WR2_O_DDRDZ(D,CSTURB,TURBN,PREDR1,PREDTH1,&
       & PD,PLEPS,PSQRT_TKE,PBLL_O_E,PEMOIST,ZWORK2)
       !
       !$mnh_expand_array(JIJ=IIJB:IIJE,JK=1:IKT)
@@ -1037,9 +1036,9 @@ ENDIF
     ! d(w'2r')/dz
     IF (GFWR) THEN
       CALL MZF_PHY(D,PFWR,ZWORK1)
-      CALL M3_R2_W2R(D,CSTURB,PREDR1,PREDTH1,PD,PDR_DZ,&
+      CALL M3_R2_W2R(D,CSTURB,TURBN,PREDR1,PREDTH1,PD,PDR_DZ,&
       & PLM,PLEPS,PTKEM,ZWORK2)
-      CALL D_M3_R2_W2R_O_DDRDZ(D,CSTURB,PREDR1,PREDTH1,&
+      CALL D_M3_R2_W2R_O_DDRDZ(D,CSTURB,TURBN,PREDR1,PREDTH1,&
       & PD,PLM,PLEPS,PTKEM,GUSERV,ZWORK3)
       !
       !$mnh_expand_array(JIJ=IIJB:IIJE,JK=1:IKT)
@@ -1052,9 +1051,9 @@ ENDIF
     IF (KRR/=0) THEN
       ! d(w'r'2)/dz
       IF (GFTH2) THEN
-        CALL M3_R2_WTH2(D,CSTURB,PD,PLEPS,PSQRT_TKE,&
+        CALL M3_R2_WTH2(D,CSTURB,TURBN,PD,PLEPS,PSQRT_TKE,&
           & PBLL_O_E,PETHETA,PDR_DZ,ZWORK1)
-        CALL D_M3_R2_WTH2_O_DDRDZ(D,CSTURB,PREDR1,&
+        CALL D_M3_R2_WTH2_O_DDRDZ(D,CSTURB,TURBN,PREDR1,&
           & PREDTH1,PD,PLEPS,PSQRT_TKE,PBLL_O_E,PETHETA,PDR_DZ,ZWORK2)
         !
         !$mnh_expand_array(JIJ=IIJB:IIJE,JK=1:IKT)
@@ -1067,9 +1066,9 @@ ENDIF
       ! d(w'2r')/dz
       IF (GFWTH) THEN
       CALL MZF_PHY(D,PFWTH,ZWORK1)
-        CALL M3_R2_W2TH(D,CSTURB,PD,PLM,PLEPS,PTKEM,&
+        CALL M3_R2_W2TH(D,CSTURB,TURBN,PD,PLM,PLEPS,PTKEM,&
           & PBLL_O_E,PETHETA,PDR_DZ,ZWORK2)
-        CALL D_M3_R2_W2TH_O_DDRDZ(D,CSTURB,PREDR1,PREDTH1,&
+        CALL D_M3_R2_W2TH_O_DDRDZ(D,CSTURB,TURBN,PREDR1,PREDTH1,&
           & PD,PLM,PLEPS,PTKEM,PBLL_O_E,PETHETA,PDR_DZ,ZWORK3)
         !
         !$mnh_expand_array(JIJ=IIJB:IIJE,JK=1:IKT)
@@ -1081,9 +1080,9 @@ ENDIF
       !
       ! d(w'th'r')/dz
       IF (GFTHR) THEN
-        CALL M3_R2_WTHR(D,CSTURB,PREDTH1,PD,PLEPS,&
+        CALL M3_R2_WTHR(D,CSTURB,TURBN,PREDTH1,PD,PLEPS,&
           & PSQRT_TKE,PBLL_O_E,PETHETA,PDR_DZ,ZWORK1)
-        CALL D_M3_R2_WTHR_O_DDRDZ(D,CSTURB,PREDR1,PREDTH1,&
+        CALL D_M3_R2_WTHR_O_DDRDZ(D,CSTURB,TURBN,PREDR1,PREDTH1,&
           & PD,PLEPS,PSQRT_TKE,PBLL_O_E,PETHETA,PDR_DZ,ZWORK2)
         !
         !$mnh_expand_array(JIJ=IIJB:IIJE,JK=1:IKT)
@@ -1114,13 +1113,13 @@ ENDIF
             * ZWORK4(:,:) &
           + TURBN%XIMPL * ZDFDDRDZ(:,:) * ZWORK6(:,:)
     !$mnh_end_expand_array(JIJ=IIJB:IIJE,JK=1:IKT)
-    IF (TURBN%LSTATNW) THEN
+    IF (NEBN%LSTATNW) THEN
       !$mnh_expand_array(JIJ=IIJB:IIJE,JK=1:IKT)
-      ZFLXZ(:,:) = CSTURB%XCTV * ZFLXZ(:,:)
+      ZFLXZ(:,:) = TURBN%XCTV * ZFLXZ(:,:)
       !$mnh_end_expand_array(JIJ=IIJB:IIJE,JK=1:IKT) 
      END IF
   ELSE
-    CALL D_PSI3DRDZ2_O_DDRDZ(D,CSTURB,PPSI3,PREDR1,PREDTH1,PRED2R3,PRED2THR3,PDR_DZ,TURBN%CTURBDIM,GUSERV,ZWKPHIPSI1)
+    CALL D_PSI3DRDZ2_O_DDRDZ(D,CSTURB,TURBN,PPSI3,PREDR1,PREDTH1,PRED2R3,PRED2THR3,PDR_DZ,TURBN%CTURBDIM,GUSERV,ZWKPHIPSI1)
     !$mnh_expand_array(JIJ=IIJB:IIJE,JK=1:IKT)
     ZWORK1(:,:) = ZWKPHIPSI1(:,:)*ZWORK2(:,:) &
                                       / PDZZ(:,:)
@@ -1134,7 +1133,7 @@ ENDIF
     !
     !$mnh_expand_array(JIJ=IIJB:IIJE,JK=1:IKT)
     ZFLXZ(:,:) = ZF(:,:)                             &
-          + TURBN%XIMPL * CSTURB%XCTV*PLM(:,:) *PLEPS(:,:) &
+          + TURBN%XIMPL * TURBN%XCTV*PLM(:,:) *PLEPS(:,:) &
             * ZWORK3(:,:) &
           + TURBN%XIMPL * ZDFDDRDZ(:,:) * ZWORK5(:,:)
     !$mnh_end_expand_array(JIJ=IIJB:IIJE,JK=1:IKT)  
@@ -1155,14 +1154,14 @@ ENDIF
         +ZCOEFF(:,IKB      )*PRP(:,IKB      ))**2           &
     )
     !$mnh_end_expand_array(JIJ=IIJB:IIJE)
-    IF (TURBN%LSTATNW) THEN
+    IF (NEBN%LSTATNW) THEN
       !$mnh_expand_array(JIJ=IIJB:IIJE)
-      ZFLXZ(:,IKB) = CSTURB%XCHV * ZFLXZ(:,IKB)
+      ZFLXZ(:,IKB) = TURBN%XCHV * ZFLXZ(:,IKB)
       !$mnh_end_expand_array(JIJ=IIJB:IIJE)
     END IF 
   ELSE
     !$mnh_expand_array(JIJ=IIJB:IIJE)
-    ZFLXZ(:,IKB) = CSTURB%XCHV * PPSI3(:,IKB+IKL) * PLM(:,IKB)   &
+    ZFLXZ(:,IKB) = TURBN%XCHV * PPSI3(:,IKB+IKL) * PLM(:,IKB)   &
         * PLEPS(:,IKB)                                        &
     *( PEXPL *                                                  &
        ( ZCOEFF(:,IKB+2*IKL)*PRM(:,IKB+2*IKL,1)             &
@@ -1179,7 +1178,7 @@ ENDIF
     !$mnh_expand_array(JIJ=IIJB:IIJE)
     ZFLXZ(:,IKA) = ZFLXZ(:,IKB)
     !$mnh_end_expand_array(JIJ=IIJB:IIJE)
-    IF (TURBN%LSTATNW) THEN
+    IF (NEBN%LSTATNW) THEN
       !wc  The variance from the budget eq should be multiplied by 2 here
       !    thl'2=2*L*LEPS*(dthl/dz**2)
       !$mnh_expand_array(JIJ=IIJB:IIJE,JK=1:IKT)
@@ -1255,12 +1254,7 @@ ENDIF
     PSIGS(:,IKU) = PSIGS(:,IKE)
     !$mnh_end_expand_array(JIJ=IIJB:IIJE)
     !$mnh_expand_array(JIJ=IIJB:IIJE,JK=1:IKT)
-#ifdef REPRO48
-    PSIGS(:,:) =  MAX (PSIGS(:,:) , 0.)
-    PSIGS(:,:) =  SQRT(PSIGS(:,:))
-#else
-    PSIGS(:,:) =  SQRT( MAX (PSIGS(:,:) , 1.E-12) )
-#endif
+    PSIGS(:,:) =  SQRT( MAX (PSIGS(:,:) , TURBN%XMINSIGS) )
     !$mnh_end_expand_array(JIJ=IIJB:IIJE,JK=1:IKT)
   END IF
 
diff --git a/src/PHYEX/turb/mode_turb_ver_thermo_flux.f90 b/src/PHYEX/turb/mode_turb_ver_thermo_flux.f90
index 470a474cce203d400740c9a1c9086f5a6e363ed4..642acf3e12abd8935db4dcf8e9b161c1a6b9942c 100644
--- a/src/PHYEX/turb/mode_turb_ver_thermo_flux.f90
+++ b/src/PHYEX/turb/mode_turb_ver_thermo_flux.f90
@@ -10,7 +10,7 @@ SUBROUTINE TURB_VER_THERMO_FLUX(D,CST,CSTURB,TURBN,TLES,            &
                       KRR,KRRL,KRRI,KSV,KGRADIENTS,                 &
                       OOCEAN,ODEEPOC,OFLYER,                        &
                       OCOUPLES, OCOMPUTE_SRC,                       &
-                      PEXPL,PTSTEP,HPROGRAM,                        &
+                      PEXPL,PTSTEP,                                 &
                       TPFILE,                                       &
                       PDXX,PDYY,PDZZ,PDZX,PDZY,PDIRCOSZW,PZZ,       &
                       PRHODJ,PTHVREF,PHGRAD,PZS,                    &
@@ -147,9 +147,9 @@ SUBROUTINE TURB_VER_THERMO_FLUX(D,CST,CSTURB,TURBN,TLES,            &
 !!                        the turbulence scheme
 !!
 !!           CSTURB%XCMFS,XCMFB : cts for the momentum flux
-!!           CSTURB%XCSHF       : ct for the sensible heat flux
+!!           TURBN%XCSHF       : ct for the sensible heat flux
 !!           CSTURB%XCHF        : ct for the moisture flux
-!!           CSTURB%XCTV,CSTURB%XCHV   : cts for the T and moisture variances
+!!           TURBN%XCTV,CSTURB%XCHV   : cts for the T and moisture variances
 !!
 !!      Module MODD_PARAMETERS
 !!
@@ -229,9 +229,8 @@ SUBROUTINE TURB_VER_THERMO_FLUX(D,CST,CSTURB,TURBN,TLES,            &
 !*      0. DECLARATIONS
 !          ------------
 !
-USE PARKIND1,   ONLY: JPRB
 USE MODE_SHUMAN_PHY, ONLY: DZF_PHY, DZM_PHY, MXF_PHY, MYF_PHY, MZF_PHY, MZM_PHY
-USE YOMHOOK,    ONLY: LHOOK, DR_HOOK
+USE YOMHOOK,    ONLY: LHOOK, DR_HOOK, JPHOOK
 !
 USE MODD_CST,              ONLY: CST_t
 USE MODD_CTURB,            ONLY: CSTURB_t
@@ -239,7 +238,7 @@ USE MODD_DIMPHYEX,         ONLY: DIMPHYEX_t
 USE MODD_FIELD,            ONLY: TFIELDMETADATA, TYPEREAL
 USE MODD_IO,               ONLY: TFILEDATA
 USE MODD_LES,              ONLY: TLES_t
-USE MODD_PARAMETERS,       ONLY: JPVEXT_TURB, JPHEXT, XUNDEF
+USE MODD_PARAMETERS,       ONLY: XUNDEF
 USE MODD_TURB_n,           ONLY: TURB_t
 !
 USE MODE_GRADIENT_W_PHY, ONLY: GZ_W_M_PHY
@@ -274,7 +273,6 @@ LOGICAL,                INTENT(IN)   ::  OCOUPLES     ! switch to activate atmos
 LOGICAL,                INTENT(IN)   ::  OCOMPUTE_SRC ! flag to define dimensions of SIGS and
 REAL,                   INTENT(IN)   ::  PEXPL        ! Coef. for temporal disc.
 REAL,                   INTENT(IN)   ::  PTSTEP       ! Double Time Step
-CHARACTER(LEN=6),       INTENT(IN)   :: HPROGRAM      ! CPROGRAM is the program currently running (modd_conf)
 TYPE(TFILEDATA),        INTENT(IN)   ::  TPFILE       ! Output file
 !
 REAL, DIMENSION(D%NIJT,D%NKT), INTENT(IN)   ::  PDZZ, PDXX, PDYY, PDZX, PDZY ! Metric coefficients
@@ -352,7 +350,6 @@ REAL, DIMENSION(D%NIJT), INTENT(IN),OPTIONAL   ::  PSSRFL_C  ! O-A interface flu
 REAL, DIMENSION(D%NIJT,D%NKT)  ::  &
        ZA,       & ! work variable for wrc or LES computation
        ZFLXZ,    & ! vertical flux of the treated variable
-       ZSOURCE,  & ! source of evolution for the treated variable
        ZKEFF,    & ! effectif diffusion coeff = LT * SQRT( TKE )
        ZF,       & ! Flux in dTh/dt =-dF/dz (evaluated at t-1)(or rt instead of Th)
        ZDFDDTDZ, & ! dF/d(dTh/dz)
@@ -375,10 +372,6 @@ INTEGER             :: IIJB, IIJE
 INTEGER             :: IKL
 !
 REAL :: ZTIME1, ZTIME2
-REAL :: ZFLPROV
-INTEGER           :: JKM          ! vertical index loop
-INTEGER           :: JSW
-REAL :: ZSWA     ! index for time flux interpolation
 !
 INTEGER :: IIU, IJU
 LOGICAL :: GUSERV   ! flag to use water
@@ -393,7 +386,7 @@ TYPE(TFIELDMETADATA) :: TZFIELD
 !*       1.   PRELIMINARIES
 !             -------------
 !
-REAL(KIND=JPRB) :: ZHOOK_HANDLE
+REAL(KIND=JPHOOK) :: ZHOOK_HANDLE
 IF (LHOOK) CALL DR_HOOK('TURB_VER_THERMO_FLUX',0,ZHOOK_HANDLE)
 !
 ! Size for a given proc & a given model
@@ -469,7 +462,7 @@ END IF
 ! Compute the turbulent flux F and F' at time t-dt.
 !
 CALL DZM_PHY(D,PTHLM,ZWORK1)
-CALL D_PHI3DTDZ_O_DDTDZ(D,CSTURB,PPHI3,PREDTH1,PREDR1,PRED2TH3,PRED2THR3,TURBN%CTURBDIM,GUSERV,ZWORK2)
+CALL D_PHI3DTDZ_O_DDTDZ(D,CSTURB,TURBN,PPHI3,PREDTH1,PREDR1,PRED2TH3,PRED2THR3,TURBN%CTURBDIM,GUSERV,ZWORK2)
 IF (TURBN%LHARAT) THEN
   !$mnh_expand_array(JIJ=IIJB:IIJE,JK=1:IKT)
   ZF(:,:) = -ZKEFF(:,:)*ZWORK1(:,:)/PDZZ(:,:)
@@ -477,9 +470,9 @@ IF (TURBN%LHARAT) THEN
   !$mnh_end_expand_array(JIJ=IIJB:IIJE,JK=1:IKT)
 ELSE
   !$mnh_expand_array(JIJ=IIJB:IIJE,JK=1:IKT)
-  ZF(:,:) = -CSTURB%XCSHF*PPHI3(:,:)*ZKEFF(:,:)& 
+  ZF(:,:) = -TURBN%XCSHF*PPHI3(:,:)*ZKEFF(:,:)& 
                                 *ZWORK1(:,:)/PDZZ(:,:)
-  ZDFDDTDZ(:,:) = -CSTURB%XCSHF*ZKEFF(:,:)*ZWORK2(:,:)
+  ZDFDDTDZ(:,:) = -TURBN%XCSHF*ZKEFF(:,:)*ZWORK2(:,:)
   !$mnh_end_expand_array(JIJ=IIJB:IIJE,JK=1:IKT)
 END IF
 !
@@ -500,8 +493,8 @@ END IF
 !
 ! d(w'2th')/dz
 IF (GFWTH) THEN
-  CALL M3_WTH_W2TH(D,CSTURB,PREDTH1,PREDR1,PD,ZKEFF,PTKEM,Z3RDMOMENT)
-  CALL D_M3_WTH_W2TH_O_DDTDZ(D,CSTURB,PREDTH1,PREDR1,&
+  CALL M3_WTH_W2TH(D,CSTURB,TURBN,PREDTH1,PREDR1,PD,ZKEFF,PTKEM,Z3RDMOMENT)
+  CALL D_M3_WTH_W2TH_O_DDTDZ(D,CSTURB,TURBN,PREDTH1,PREDR1,&
    & PD,PBLL_O_E,PETHETA,ZKEFF,PTKEM,ZWORK1)
 !
   !$mnh_expand_array(JIJ=IIJB:IIJE,JK=1:IKT)
@@ -513,8 +506,8 @@ END IF
 !
 ! d(w'th'2)/dz
 IF (GFTH2) THEN
-  CALL M3_WTH_WTH2(D,CSTURB,PREDTH1,PREDR1,PD,PBLL_O_E,PETHETA,Z3RDMOMENT)
-  CALL D_M3_WTH_WTH2_O_DDTDZ(D,CSTURB,Z3RDMOMENT,PREDTH1,PREDR1,&
+  CALL M3_WTH_WTH2(D,CSTURB,TURBN,PREDTH1,PREDR1,PD,PBLL_O_E,PETHETA,Z3RDMOMENT)
+  CALL D_M3_WTH_WTH2_O_DDTDZ(D,CSTURB,TURBN,Z3RDMOMENT,PREDTH1,PREDR1,&
     & PD,PBLL_O_E,PETHETA,ZWORK1)
   CALL MZM_PHY(D,PFTH2,ZWORK2)
 !
@@ -528,8 +521,8 @@ END IF
 !
 ! d(w'2r')/dz
 IF (GFWR) THEN
-  CALL M3_WTH_W2R(D,CSTURB,PD,ZKEFF,PTKEM,PBLL_O_E,PEMOIST,PDTH_DZ,ZWORK1)
-  CALL D_M3_WTH_W2R_O_DDTDZ(D,CSTURB,PREDTH1,PREDR1,PD,ZKEFF,PTKEM,PBLL_O_E,PEMOIST,ZWORK2)
+  CALL M3_WTH_W2R(D,CSTURB,TURBN,PD,ZKEFF,PTKEM,PBLL_O_E,PEMOIST,PDTH_DZ,ZWORK1)
+  CALL D_M3_WTH_W2R_O_DDTDZ(D,CSTURB,TURBN,PREDTH1,PREDR1,PD,ZKEFF,PTKEM,PBLL_O_E,PEMOIST,ZWORK2)
 !
   !$mnh_expand_array(JIJ=IIJB:IIJE,JK=1:IKT)
   ZF(:,:) = ZF(:,:) + ZWORK1(:,:) * PFWR(:,:)
@@ -540,9 +533,9 @@ END IF
 !
 ! d(w'r'2)/dz
 IF (GFR2) THEN
-  CALL M3_WTH_WR2(D,CSTURB,PD,ZKEFF,PTKEM,PSQRT_TKE,PBLL_O_E,PBETA,PLEPS,PEMOIST,PDTH_DZ,ZWORK1)
+  CALL M3_WTH_WR2(D,CSTURB,TURBN,PD,ZKEFF,PTKEM,PSQRT_TKE,PBLL_O_E,PBETA,PLEPS,PEMOIST,PDTH_DZ,ZWORK1)
   CALL MZM_PHY(D,PFR2,ZWORK2)
-  CALL D_M3_WTH_WR2_O_DDTDZ(D,CSTURB,PREDTH1,PREDR1,PD,&
+  CALL D_M3_WTH_WR2_O_DDTDZ(D,CSTURB,TURBN,PREDTH1,PREDR1,PD,&
     & ZKEFF,PTKEM,PSQRT_TKE,PBLL_O_E,PBETA,PLEPS,PEMOIST,ZWORK3)
 !
   !$mnh_expand_array(JIJ=IIJB:IIJE,JK=1:IKT)    
@@ -554,9 +547,9 @@ END IF
 !
 ! d(w'th'r')/dz
 IF (GFTHR) THEN
-  CALL M3_WTH_WTHR(D,CSTURB,PREDR1,PD,ZKEFF,PTKEM,PSQRT_TKE,PBETA,&
+  CALL M3_WTH_WTHR(D,CSTURB,TURBN,PREDR1,PD,ZKEFF,PTKEM,PSQRT_TKE,PBETA,&
     & PLEPS,PEMOIST,Z3RDMOMENT)
-  CALL D_M3_WTH_WTHR_O_DDTDZ(D,CSTURB,Z3RDMOMENT,PREDTH1,PREDR1,PD,PBLL_O_E,PETHETA,ZWORK1)
+  CALL D_M3_WTH_WTHR_O_DDTDZ(D,CSTURB,TURBN,Z3RDMOMENT,PREDTH1,PREDR1,PD,PBLL_O_E,PETHETA,ZWORK1)
   CALL MZM_PHY(D,PFTHR, ZWORK2)
 !
   !$mnh_expand_array(JIJ=IIJB:IIJE,JK=1:IKT)
@@ -591,10 +584,7 @@ ELSE ! atmosp bottom
   END IF
 !
     ! atmos top
-#ifdef REPRO48
-#else
       ZF(:,IKE+1)=0.
-#endif
 END IF
 !
 ! Compute the split conservative potential temperature at t+deltat
@@ -753,7 +743,7 @@ IF (OOCEAN) THEN
 END IF
 !*       2.3  Partial vertical divergence of the < Rc w > flux
 ! Correction for qc and qi negative in AROME
-IF(HPROGRAM/='AROME  ') THEN
+IF(TURBN%LPROJQITURB) THEN
  IF ( KRRL >= 1 ) THEN
    !$mnh_expand_array(JIJ=IIJB:IIJE,JK=1:IKT)
    ZWORK1(:,:) = ZFLXZ(:,:)/PDZZ(:,:)
@@ -813,7 +803,7 @@ IF (TLES%LLES_CALL) THEN
   CALL LES_MEAN_SUBGRID_PHY(D,TLES,ZWORK4, TLES%X_LES_SUBGRID_WThv , .TRUE. ) 
   !
   !$mnh_expand_array(JIJ=IIJB:IIJE,JK=1:IKT)
-  ZWORK2(:,:) = -CSTURB%XCTP*PSQRT_TKE(:,:)/PLM(:,:) &
+  ZWORK2(:,:) = -TURBN%XCTP*PSQRT_TKE(:,:)/PLM(:,:) &
                                     *ZWORK1(:,:)
   !$mnh_end_expand_array(JIJ=IIJB:IIJE,JK=1:IKT)
   CALL LES_MEAN_SUBGRID_PHY(D,TLES,ZWORK2, TLES%X_LES_SUBGRID_ThlPz ) 
@@ -837,7 +827,7 @@ IF (TLES%LLES_CALL) THEN
   ZA(:,:) = - ZFLXZ(:,:) / ZA(:,:) * PDZZ(:,:)
   !$mnh_end_expand_array(JIJ=IIJB:IIJE,JK=1:IKT)
   !$mnh_expand_array(JIJ=IIJB:IIJE)
-  ZA(:,IKB) = CSTURB%XCSHF*PPHI3(:,IKB)*ZKEFF(:,IKB)
+  ZA(:,IKB) = TURBN%XCSHF*PPHI3(:,IKB)*ZKEFF(:,IKB)
   !$mnh_end_expand_array(JIJ=IIJB:IIJE)
   CALL MZF_PHY(D,ZA,ZA)
   !$mnh_expand_array(JIJ=IIJB:IIJE,JK=1:IKT)
@@ -873,11 +863,11 @@ IF (KRR /= 0) THEN
   ZDFDDRDZ(:,:) = -ZKEFF(:,:)
   !$mnh_end_expand_array(JIJ=IIJB:IIJE,JK=1:IKT)    
  ELSE
-  CALL D_PSI3DRDZ_O_DDRDZ(D,CSTURB,PPSI3,PREDR1,PREDTH1,PRED2R3,PRED2THR3,TURBN%CTURBDIM,GUSERV,ZWORK2)
+  CALL D_PSI3DRDZ_O_DDRDZ(D,CSTURB,TURBN,PPSI3,PREDR1,PREDTH1,PRED2R3,PRED2THR3,TURBN%CTURBDIM,GUSERV,ZWORK2)
   !$mnh_expand_array(JIJ=IIJB:IIJE,JK=1:IKT)    
-  ZF(:,:) = -CSTURB%XCSHF*PPSI3(:,:)*ZKEFF(:,:)& 
+  ZF(:,:) = -TURBN%XCSHF*PPSI3(:,:)*ZKEFF(:,:)& 
                                 *ZWORK1(:,:)/PDZZ(:,:)
-  ZDFDDRDZ(:,:) = -CSTURB%XCSHF*ZKEFF(:,:)*ZWORK2(:,:)
+  ZDFDDRDZ(:,:) = -TURBN%XCSHF*ZKEFF(:,:)*ZWORK2(:,:)
   !$mnh_end_expand_array(JIJ=IIJB:IIJE,JK=1:IKT)    
  ENDIF
   !
@@ -898,8 +888,8 @@ IF (KRR /= 0) THEN
   !
   ! d(w'2r')/dz
   IF (GFWR) THEN
-    CALL M3_WR_W2R(D,CSTURB,PREDR1,PREDTH1,PD,ZKEFF,PTKEM,Z3RDMOMENT)
-    CALL D_M3_WR_W2R_O_DDRDZ(D,CSTURB,PREDR1,PREDTH1,PD,&
+    CALL M3_WR_W2R(D,CSTURB,TURBN,PREDR1,PREDTH1,PD,ZKEFF,PTKEM,Z3RDMOMENT)
+    CALL D_M3_WR_W2R_O_DDRDZ(D,CSTURB,TURBN,PREDR1,PREDTH1,PD,&
      & PBLL_O_E,PEMOIST,ZKEFF,PTKEM,ZWORK1)
   !
     !$mnh_expand_array(JIJ=IIJB:IIJE,JK=1:IKT)
@@ -911,9 +901,9 @@ IF (KRR /= 0) THEN
   !
   ! d(w'r'2)/dz
   IF (GFR2) THEN
-    CALL M3_WR_WR2(D,CSTURB,PREDR1,PREDTH1,PD,PBLL_O_E,PEMOIST,Z3RDMOMENT)
+    CALL M3_WR_WR2(D,CSTURB,TURBN,PREDR1,PREDTH1,PD,PBLL_O_E,PEMOIST,Z3RDMOMENT)
     CALL MZM_PHY(D,PFR2,ZWORK1)
-    CALL D_M3_WR_WR2_O_DDRDZ(D,CSTURB,Z3RDMOMENT,PREDR1,&
+    CALL D_M3_WR_WR2_O_DDRDZ(D,CSTURB,TURBN,Z3RDMOMENT,PREDR1,&
      & PREDTH1,PD,PBLL_O_E,PEMOIST,ZWORK2)
   !
     !$mnh_expand_array(JIJ=IIJB:IIJE,JK=1:IKT)
@@ -926,9 +916,9 @@ IF (KRR /= 0) THEN
   !
   ! d(w'2th')/dz
   IF (GFWTH) THEN
-    CALL M3_WR_W2TH(D,CSTURB,PD,ZKEFF,&
+    CALL M3_WR_W2TH(D,CSTURB,TURBN,PD,ZKEFF,&
      & PTKEM,PBLL_O_E,PETHETA,PDR_DZ,ZWORK1)
-    CALL D_M3_WR_W2TH_O_DDRDZ(D,CSTURB,PREDR1,PREDTH1,&
+    CALL D_M3_WR_W2TH_O_DDRDZ(D,CSTURB,TURBN,PREDR1,PREDTH1,&
      & PD,ZKEFF,PTKEM,PBLL_O_E,PETHETA,ZWORK2)
   !
     !$mnh_expand_array(JIJ=IIJB:IIJE,JK=1:IKT)
@@ -941,9 +931,9 @@ IF (KRR /= 0) THEN
   ! d(w'th'2)/dz
   IF (GFTH2) THEN
     CALL MZM_PHY(D,PFTH2,ZWORK1)
-    CALL M3_WR_WTH2(D,CSTURB,PD,ZKEFF,PTKEM,&
+    CALL M3_WR_WTH2(D,CSTURB,TURBN,PD,ZKEFF,PTKEM,&
     & PSQRT_TKE,PBLL_O_E,PBETA,PLEPS,PETHETA,PDR_DZ,ZWORK2)
-    CALL D_M3_WR_WTH2_O_DDRDZ(D,CSTURB,PREDR1,PREDTH1,PD,&
+    CALL D_M3_WR_WTH2_O_DDRDZ(D,CSTURB,TURBN,PREDR1,PREDTH1,PD,&
      &ZKEFF,PTKEM,PSQRT_TKE,PBLL_O_E,PBETA,PLEPS,PETHETA,ZWORK3)
     !
     !$mnh_expand_array(JIJ=IIJB:IIJE,JK=1:IKT)
@@ -955,10 +945,10 @@ IF (KRR /= 0) THEN
   !
   ! d(w'th'r')/dz
   IF (GFTHR) THEN
-    CALL M3_WR_WTHR(D,CSTURB,PREDTH1,PD,ZKEFF,PTKEM,PSQRT_TKE,PBETA,&
+    CALL M3_WR_WTHR(D,CSTURB,TURBN,PREDTH1,PD,ZKEFF,PTKEM,PSQRT_TKE,PBETA,&
      & PLEPS,PETHETA,Z3RDMOMENT)
     CALL MZM_PHY(D,PFTHR,ZWORK1)
-    CALL D_M3_WR_WTHR_O_DDRDZ(D,CSTURB,Z3RDMOMENT,PREDR1, &
+    CALL D_M3_WR_WTHR_O_DDRDZ(D,CSTURB,TURBN,Z3RDMOMENT,PREDR1, &
      & PREDTH1,PD,PBLL_O_E,PEMOIST,ZWORK2)
   !
     !$mnh_expand_array(JIJ=IIJB:IIJE,JK=1:IKT)
@@ -995,10 +985,7 @@ IF (KRR /= 0) THEN
       !$mnh_end_expand_array(JIJ=IIJB:IIJE) 
     END IF
       ! atmos top
-#ifdef REPRO48
-#else
       ZF(:,IKE+1)=0.
-#endif
     END IF
   ! Compute the split conservative potential temperature at t+deltat
   CALL TRIDIAG_THERMO(D,PRM(:,:,1),ZF,ZDFDDRDZ,PTSTEP,TURBN%XIMPL,&
@@ -1141,7 +1128,7 @@ IF (KRR /= 0) THEN
 !
 !*       3.3  Complete vertical divergence of the < Rc w > flux
 ! Correction of qc and qi negative for AROME
-IF(HPROGRAM/='AROME  ') THEN
+IF(TURBN%LPROJQITURB) THEN
    IF ( KRRL >= 1 ) THEN
        !$mnh_expand_array(JIJ=IIJB:IIJE,JK=1:IKT)
        ZWORK2(:,:) = ZFLXZ(:,:) / &
@@ -1209,7 +1196,7 @@ END IF
     CALL LES_MEAN_SUBGRID_PHY(D,TLES,ZWORK4, TLES%X_LES_SUBGRID_WThv , .TRUE. )
     !
     !$mnh_expand_array(JIJ=IIJB:IIJE,JK=1:IKT)
-    ZWORK2(:,:) = -CSTURB%XCTP*PSQRT_TKE(:,:)/PLM(:,:) &
+    ZWORK2(:,:) = -TURBN%XCTP*PSQRT_TKE(:,:)/PLM(:,:) &
                                       *ZWORK1(:,:)
     !$mnh_end_expand_array(JIJ=IIJB:IIJE,JK=1:IKT)
     CALL LES_MEAN_SUBGRID_PHY(D,TLES,ZWORK2, TLES%X_LES_SUBGRID_RtPz )
@@ -1249,7 +1236,7 @@ IF ( ((TURBN%LTURB_FLX .AND. TPFILE%LOPENED) .OR. TLES%LLES_CALL) .AND. (KRRL >
   CALL MZM_PHY(D,ZWORK1,ZWORK3)
   !$mnh_expand_array(JIJ=IIJB:IIJE,JK=1:IKT)
   ZA(:,:)   = ZWORK2(:,:)/ PDZZ(:,:) * &
-                                  (-PPHI3(:,:)*ZWORK3(:,:)) * CSTURB%XCSHF 
+                                  (-PPHI3(:,:)*ZWORK3(:,:)) * TURBN%XCSHF 
   !$mnh_end_expand_array(JIJ=IIJB:IIJE,JK=1:IKT)
  ENDIF
   !$mnh_expand_array(JIJ=IIJB:IIJE)
diff --git a/src/PHYEX/turb/mode_update_iiju_phy.f90 b/src/PHYEX/turb/mode_update_iiju_phy.f90
index 92686e36ba21604116206a7fd8ba72108deb1fd0..382d57459335e9c53400bec9c74f15e3aaebc7d8 100644
--- a/src/PHYEX/turb/mode_update_iiju_phy.f90
+++ b/src/PHYEX/turb/mode_update_iiju_phy.f90
@@ -6,8 +6,7 @@ MODULE MODE_UPDATE_IIJU_PHY
 IMPLICIT NONE
 CONTAINS
 SUBROUTINE UPDATE_IIJU_PHY(D,PVAR)
-      USE PARKIND1, ONLY : JPRB
-      USE YOMHOOK , ONLY : LHOOK, DR_HOOK
+      USE YOMHOOK , ONLY : LHOOK, DR_HOOK, JPHOOK
 !     ##############################################################
 !
 !!****  *MODE_UPDATE_IIJU_PHY* -
@@ -54,7 +53,7 @@ REAL, DIMENSION(D%NIT,D%NJT,D%NKT),   INTENT(INOUT)    :: PVAR  ! working variab
 !
 INTEGER :: IIE,IIB,IJE,IJB,IIU,IJU,IKT
 !
-REAL(KIND=JPRB) :: ZHOOK_HANDLE
+REAL(KIND=JPHOOK) :: ZHOOK_HANDLE
 IF (LHOOK) CALL DR_HOOK('UPDATE_IIJU_PHY',0,ZHOOK_HANDLE)
 IIE=D%NIEC
 IIB=D%NIBC
diff --git a/src/PHYEX/turb/modi_shallow_mf.f90 b/src/PHYEX/turb/modi_shallow_mf.f90
index 564fdaa0927adf939bf8dc0a2066d54dc7b24d42..089fa4fbb037136510e790fb2c72fd4a0609b283 100644
--- a/src/PHYEX/turb/modi_shallow_mf.f90
+++ b/src/PHYEX/turb/modi_shallow_mf.f90
@@ -2,12 +2,13 @@
      MODULE MODI_SHALLOW_MF
 !    ######################
 !
+IMPLICIT NONE
 INTERFACE
 !     #################################################################
-      SUBROUTINE SHALLOW_MF(D, CST, NEB, PARAMMF, TURBN, CSTURB,       &
+      SUBROUTINE SHALLOW_MF(D, CST, NEBN, PARAMMF, TURBN, CSTURB,     &
                 KRR, KRRL, KRRI, KSV,                                 &
-                HFRAC_ICE,ONOMIXLG,KSV_LGBEG,KSV_LGEND,               &
-                PIMPL_MF, PTSTEP,                                     &
+                ONOMIXLG,KSV_LGBEG,KSV_LGEND,                         &
+                PTSTEP,                                               &
                 PDZZ, PZZ,                                            &
                 PRHODJ, PRHODREF,                                     &
                 PPABSM, PEXNM,                                        &
@@ -27,18 +28,19 @@ INTERFACE
 USE MODD_BUDGET,          ONLY: TBUDGETCONF_t, TBUDGETDATA
 USE MODD_DIMPHYEX,        ONLY: DIMPHYEX_t
 USE MODD_CST,             ONLY: CST_t
-USE MODD_NEB,             ONLY: NEB_t
+USE MODD_NEB_n,           ONLY: NEB_t
 USE MODD_PARAM_MFSHALL_n, ONLY: PARAM_MFSHALL_t
 USE MODD_TURB_n,          ONLY: TURB_t
 USE MODD_CTURB,           ONLY: CSTURB_t
 USE MODD_PARAMETERS,      ONLY: JPSVMAX
+IMPLICIT NONE
 !               
 !*               1.1  Declaration of Arguments
 !                
 !
 TYPE(DIMPHYEX_t),       INTENT(IN)   :: D            ! PHYEX variables dimensions structure
 TYPE(CST_t),            INTENT(IN)   :: CST          ! modd_cst general constant structure
-TYPE(NEB_t),            INTENT(IN)   :: NEB
+TYPE(NEB_t),            INTENT(IN)   :: NEBN
 TYPE(PARAM_MFSHALL_t),  INTENT(IN)   :: PARAMMF
 TYPE(TURB_t),           INTENT(IN)   :: TURBN        ! modn_turbn (turb namelist) structure
 TYPE(CSTURB_t),         INTENT(IN)   :: CSTURB       ! modd_csturb turb constant structure
@@ -46,11 +48,9 @@ INTEGER,                INTENT(IN)   :: KRR          ! number of moist var.
 INTEGER,                INTENT(IN)   :: KRRL         ! number of liquid water var.
 INTEGER,                INTENT(IN)   :: KRRI         ! number of ice water var.
 INTEGER,                INTENT(IN)   :: KSV          ! number of scalar var.
-CHARACTER*1,            INTENT(IN)   :: HFRAC_ICE    ! partition liquid/ice scheme
 LOGICAL,                INTENT(IN)   :: ONOMIXLG  ! False if mixing of lagrangian tracer
 INTEGER,                INTENT(IN)   :: KSV_LGBEG ! first index of lag. tracer
 INTEGER,                INTENT(IN)   :: KSV_LGEND ! last  index of lag. tracer
-REAL,                   INTENT(IN)   :: PIMPL_MF     ! degre of implicitness
 REAL,                   INTENT(IN)   :: PTSTEP    ! Dynamical timestep 
 REAL, DIMENSION(D%NIJT,D%NKT),   INTENT(IN) ::  PZZ         ! Height of flux point
 REAL, DIMENSION(D%NIJT,D%NKT),   INTENT(IN) ::  PDZZ        ! Metric coefficients
@@ -62,7 +62,7 @@ REAL, DIMENSION(D%NIJT,D%NKT),   INTENT(IN) ::  PEXNM       ! Exner function at
 
 REAL, DIMENSION(D%NIJT),         INTENT(IN) ::  PSFTH,PSFRV ! normal surface fluxes of theta and Rv 
 REAL, DIMENSION(D%NIJT,D%NKT),   INTENT(IN) ::  PTHM        ! Theta at t-dt
-REAL, DIMENSION(D%NIJT,KRR),     INTENT(IN) ::  PRM         ! water var. at t-dt
+REAL, DIMENSION(D%NIJT,D%NKT,KRR), INTENT(IN) ::  PRM         ! water var. at t-dt
 REAL, DIMENSION(D%NIJT,D%NKT),   INTENT(IN) ::  PUM,PVM     ! wind components at t-dt
 REAL, DIMENSION(D%NIJT,D%NKT),   INTENT(IN) ::  PTKEM       ! tke at t-dt
 REAL, DIMENSION(D%NIJT,D%NKT,KSV), INTENT(IN) ::  PSVM        ! scalar variable a t-dt
@@ -73,7 +73,7 @@ REAL, DIMENSION(D%NIJT,D%NKT),   INTENT(OUT)::  PDTHLDT_MF   ! tendency of thl b
 REAL, DIMENSION(D%NIJT,D%NKT),   INTENT(OUT)::  PDRTDT_MF    ! tendency of rt  by massflux scheme
 REAL, DIMENSION(D%NIJT,D%NKT,KSV), INTENT(OUT)::  PDSVDT_MF    ! tendency of Sv  by massflux scheme
 
-REAL, DIMENSION(D%NIJT,D%NKT),   INTENT(OUT)   ::  PSIGMF,PRC_MF,PRI_MF,PCF_MF ! cloud info for the cloud scheme
+REAL, DIMENSION(D%NIJT,D%NKT), INTENT(OUT)     ::  PSIGMF,PRC_MF,PRI_MF,PCF_MF ! cloud info for the cloud scheme
 REAL, DIMENSION(D%NIJT,D%NKT), INTENT(OUT)     ::  PFLXZTHVMF           ! Thermal production for TKE scheme
 REAL, DIMENSION(D%NIJT,D%NKT), INTENT(OUT)     ::  PFLXZTHMF
 REAL, DIMENSION(D%NIJT,D%NKT), INTENT(OUT)     ::  PFLXZRMF
@@ -81,7 +81,7 @@ REAL, DIMENSION(D%NIJT,D%NKT), INTENT(OUT)     ::  PFLXZUMF
 REAL, DIMENSION(D%NIJT,D%NKT), INTENT(OUT)     ::  PFLXZVMF
 REAL, DIMENSION(D%NIJT,D%NKT), INTENT(INOUT) ::  PTHL_UP   ! Thl updraft characteristics
 REAL, DIMENSION(D%NIJT,D%NKT), INTENT(INOUT) ::  PRT_UP    ! Rt  updraft characteristics
-REAL, DIMENSION(D%NIJT,D%NKT), INTENT(OUT) ::  PRV_UP    ! Vapor updraft characteristics
+REAL, DIMENSION(D%NIJT,D%NKT), INTENT(INOUT) ::  PRV_UP    ! Vapor updraft characteristics
 REAL, DIMENSION(D%NIJT,D%NKT), INTENT(INOUT) ::  PU_UP     ! U wind updraft characteristics
 REAL, DIMENSION(D%NIJT,D%NKT), INTENT(INOUT) ::  PV_UP     ! V wind updraft characteristics
 REAL, DIMENSION(D%NIJT,D%NKT), INTENT(INOUT) ::  PRC_UP    ! cloud content updraft characteristics
@@ -93,12 +93,12 @@ REAL, DIMENSION(D%NIJT,D%NKT), INTENT(INOUT) ::  PEMF      ! updraft mass flux
 REAL, DIMENSION(D%NIJT,D%NKT), INTENT(OUT) ::  PDETR     ! updraft detrainment
 REAL, DIMENSION(D%NIJT,D%NKT), INTENT(OUT) ::  PENTR     ! updraft entrainment
 INTEGER,DIMENSION(D%NIJT),     INTENT(OUT) :: KKLCL,KKETL,KKCTL ! level of LCL,ETL and CTL
-REAL,                               INTENT(IN)  :: PDX, PDY
+REAL,                          INTENT(IN)  :: PDX, PDY
 REAL, DIMENSION(D%NIJT,D%NKT,KSV), INTENT(IN),OPTIONAL ::  PRSVS ! sources of sv (for Budgets with lagrangian tracer)
 TYPE(TBUDGETCONF_t),    INTENT(IN),OPTIONAL   :: BUCONF       ! budget structure
 INTEGER,                INTENT(IN)   :: KBUDGETS     ! option. because not used in arpifs
 TYPE(TBUDGETDATA), DIMENSION(KBUDGETS), INTENT(INOUT),OPTIONAL :: TBUDGETS
-REAL,DIMENSION(JPSVMAX),INTENT(IN),OPTIONAL   :: PSVMIN       ! minimum value for SV variables
+REAL,DIMENSION(JPSVMAX),INTENT(IN),OPTIONAL   :: PSVMIN       ! minimum value for SV variables (for Budgets)
 
 END SUBROUTINE SHALLOW_MF
 
diff --git a/src/PHYEX/turb/modi_turb.f90 b/src/PHYEX/turb/modi_turb.f90
index 747f10538154c6456a3824f929eff22814de4330..f7141ca30fca10492d45724fba9bc77b5e8ec1fb 100644
--- a/src/PHYEX/turb/modi_turb.f90
+++ b/src/PHYEX/turb/modi_turb.f90
@@ -2,11 +2,12 @@
      MODULE MODI_TURB  
 !    ################ 
 !
+IMPLICIT NONE
 INTERFACE
 !
-      SUBROUTINE TURB(CST,CSTURB,BUCONF,TURBN,D,TLES,                 &
-              & KMI,KRR,KRRL,KRRI,HLBCX,HLBCY,KGRADIENTS,KHALO,       &
-              & KSPLIT,KMODEL_CL,KSV,KSV_LGBEG,KSV_LGEND,HPROGRAM,    &
+      SUBROUTINE TURB(CST,CSTURB,BUCONF,TURBN,NEBN,D,TLES,            &
+              & KRR,KRRL,KRRI,HLBCX,HLBCY,KGRADIENTS,KHALO,           &
+              & KSPLIT,OCLOUDMODIFLM,KSV,KSV_LGBEG,KSV_LGEND,         &
               & KSV_LIMA_NR, KSV_LIMA_NS, KSV_LIMA_NG, KSV_LIMA_NH,   &
               & O2D,ONOMIXLG,OFLAT,OCOUPLES,OBLOWSNOW,OIBM,OFLYER,    &
               & OCOMPUTE_SRC, PRSNOW,                                 &
@@ -38,17 +39,19 @@ USE MODD_IO, ONLY : TFILEDATA
 USE MODD_CST, ONLY: CST_t
 USE MODD_CTURB, ONLY: CSTURB_t
 USE MODD_TURB_n, ONLY: TURB_t
+USE MODD_NEB_n, ONLY: NEB_t
 USE MODD_DIMPHYEX,   ONLY: DIMPHYEX_t
 USE MODD_LES, ONLY: TLES_t
+IMPLICIT NONE
 !
 TYPE(DIMPHYEX_t),       INTENT(IN)   :: D             ! PHYEX variables dimensions structure
 TYPE(CST_t),            INTENT(IN)   :: CST           ! modd_cst general constant structure
 TYPE(CSTURB_t),         INTENT(IN)   :: CSTURB        ! modd_csturb turb constant structure
 TYPE(TBUDGETCONF_t),    INTENT(IN)   :: BUCONF        ! budget structure
 TYPE(TURB_t),           INTENT(IN)   :: TURBN         ! modn_turbn (turb namelist) structure
-TYPE(TLES_t),           INTENT(IN)   :: TLES          ! modd_les structure
+TYPE(NEB_t),            INTENT(IN)   :: NEBN          ! modd_nebn structure
+TYPE(TLES_t),           INTENT(INOUT)   :: TLES          ! modd_les structure
 INTEGER,                INTENT(IN)   :: KGRADIENTS    ! Number of stored horizontal gradients
-INTEGER,                INTENT(IN)   :: KMI           ! model index number
 INTEGER,                INTENT(IN)   :: KRR           ! number of moist var.
 INTEGER,                INTENT(IN)   :: KRRL          ! number of liquid water var.
 INTEGER,                INTENT(IN)   :: KRRI          ! number of ice water var.
@@ -56,7 +59,7 @@ INTEGER,                INTENT(IN)   :: KSV, KSV_LGBEG, KSV_LGEND ! number of sc
 INTEGER,                INTENT(IN)   :: KSV_LIMA_NR,KSV_LIMA_NS,KSV_LIMA_NG,KSV_LIMA_NH
 CHARACTER(LEN=4),DIMENSION(2),INTENT(IN):: HLBCX, HLBCY  ! X- and Y-direc LBC
 INTEGER,                INTENT(IN)   :: KSPLIT        ! number of time-splitting
-INTEGER,                INTENT(IN)   :: KMODEL_CL     ! model number for cloud mixing length
+LOGICAL,                INTENT(IN)   :: OCLOUDMODIFLM ! cloud mixing length modifs
 INTEGER,                INTENT(IN)   ::  KHALO        ! Size of the halo for parallel distribution
 LOGICAL,                INTENT(IN)   ::  OCOMPUTE_SRC ! flag to define dimensions of SIGS and SRCT variables
 LOGICAL,                INTENT(IN)   ::  OOCEAN       ! switch for Ocean model version
@@ -109,8 +112,8 @@ REAL, DIMENSION(MERGE(D%NIJT,0,TURBN%CTOM=='TM06')),INTENT(INOUT) :: PBL_DEPTH
 REAL, DIMENSION(MERGE(D%NIJT,0,TURBN%LRMC01)),INTENT(INOUT) :: PSBL_DEPTH ! SBL depth for RMC01
 !
 !    variables for cloud mixing length
-REAL, DIMENSION(MERGE(D%NIJT,0,KMODEL_CL==KMI .AND. HTURBLEN_CL/='NONE'),&
-                MERGE(D%NKT,0,KMODEL_CL==KMI .AND. HTURBLEN_CL/='NONE')),INTENT(IN)      ::  PCEI
+REAL, DIMENSION(MERGE(D%NIJT,0,OCLOUDMODIFLM),&
+                MERGE(D%NKT,0,OCLOUDMODIFLM)),INTENT(IN)      ::  PCEI
                                                  ! Cloud Entrainment instability
                                                  ! index to emphasize localy
                                                  ! turbulent fluxes
@@ -158,7 +161,6 @@ REAL, DIMENSION(D%NIJT,D%NKT), INTENT(OUT)  :: PTDISS     ! Dissipation TKE term
 TYPE(TBUDGETDATA), DIMENSION(KBUDGETS), INTENT(INOUT) :: TBUDGETS
 INTEGER, INTENT(IN) :: KBUDGETS
 !
-CHARACTER(LEN=6), INTENT(IN) :: HPROGRAM ! CPROGRAM is the program currently running (modd_conf)
 LOGICAL, INTENT(IN) :: ONOMIXLG          ! to use turbulence for lagrangian variables (modd_conf)
 LOGICAL, INTENT(IN) :: O2D               ! Logical for 2D model version (modd_conf)
 !
@@ -178,8 +180,8 @@ REAL, DIMENSION(D%NIJT), INTENT(IN),OPTIONAL   ::  PSSVFL_C  !
 REAL, DIMENSION(D%NIJT), INTENT(IN),OPTIONAL   ::  PSSUFL   
 REAL, DIMENSION(D%NIJT), INTENT(IN),OPTIONAL   ::  PSSVFL  !
 !
-REAL, DIMENSION(D%NIJT,D%NKT), INTENT(IN), OPTIONAL :: PIBM_XMUT ! IBM turbulent viscosity
-REAL, DIMENSION(D%NIJT,D%NKT), INTENT(IN), OPTIONAL :: PIBM_LS ! IBM Level-set function
+REAL, DIMENSION(D%NIJT,D%NKT), INTENT(OUT), OPTIONAL :: PIBM_XMUT ! IBM turbulent viscosity
+REAL, DIMENSION(D%NIJT,D%NKT), INTENT(IN), OPTIONAL  :: PIBM_LS ! IBM Level-set function
 !
 !-------------------------------------------------------------------------------
 !
diff --git a/src/PHYEX/turb/modn_param_mfshalln.f90 b/src/PHYEX/turb/modn_param_mfshalln.f90
new file mode 100644
index 0000000000000000000000000000000000000000..8b137891791fe96927ad78e64b0aad7bded08bdc
--- /dev/null
+++ b/src/PHYEX/turb/modn_param_mfshalln.f90
@@ -0,0 +1 @@
+
diff --git a/src/PHYEX/turb/shallow_mf.f90 b/src/PHYEX/turb/shallow_mf.f90
index 85c85e6fcedb012268c91cb1c6788cb91e49ec5e..4488cea00924ce0abea7027e78b961794ec3d0f4 100644
--- a/src/PHYEX/turb/shallow_mf.f90
+++ b/src/PHYEX/turb/shallow_mf.f90
@@ -3,11 +3,11 @@
 !MNH_LIC version 1. See LICENSE, CeCILL-C_V1-en.txt and CeCILL-C_V1-fr.txt
 !MNH_LIC for details. version 1.
 !-----------------------------------------------------------------
-!     ################################################################
-      SUBROUTINE SHALLOW_MF(D, CST, NEB, PARAMMF, TURBN, CSTURB,      &
+!     #################################################################
+      SUBROUTINE SHALLOW_MF(D, CST, NEBN, PARAMMF, TURBN, CSTURB,     &
                 KRR, KRRL, KRRI, KSV,                                 &
-                HFRAC_ICE,ONOMIXLG,KSV_LGBEG,KSV_LGEND,               &
-                PIMPL_MF, PTSTEP,                                     &
+                ONOMIXLG,KSV_LGBEG,KSV_LGEND,                         &
+                PTSTEP,                                               &
                 PDZZ, PZZ,                                            &
                 PRHODJ, PRHODREF,                                     &
                 PPABSM, PEXNM,                                        &
@@ -22,7 +22,6 @@
                 PFRAC_UP,PEMF,PDETR,PENTR,                            &
                 KKLCL,KKETL,KKCTL,PDX,PDY,PRSVS,PSVMIN,               &
                 BUCONF, TBUDGETS, KBUDGETS                            )
-
 !     #################################################################
 !!
 !!****  *SHALLOW_MF* - 
@@ -72,15 +71,14 @@
 !*      0. DECLARATIONS
 !          ------------
 !
-USE PARKIND1,   ONLY: JPRB
 USE MODE_SHUMAN_PHY, ONLY: MXM_PHY, MYM_PHY
-USE YOMHOOK,    ONLY: LHOOK, DR_HOOK
+USE YOMHOOK,    ONLY: LHOOK, DR_HOOK, JPHOOK
 !
 USE MODD_BUDGET,          ONLY: TBUDGETCONF_t, TBUDGETDATA, NBUDGET_U,  NBUDGET_V, &
                                 NBUDGET_TH,  NBUDGET_RV, NBUDGET_SV1
 USE MODD_DIMPHYEX,        ONLY: DIMPHYEX_t
 USE MODD_CST,             ONLY: CST_t
-USE MODD_NEB,             ONLY: NEB_t
+USE MODD_NEB_n,           ONLY: NEB_t
 USE MODD_PARAM_MFSHALL_n, ONLY: PARAM_MFSHALL_t
 USE MODD_TURB_n,          ONLY: TURB_t
 USE MODD_CTURB,           ONLY: CSTURB_t
@@ -104,7 +102,7 @@ IMPLICIT NONE
 !
 TYPE(DIMPHYEX_t),       INTENT(IN)   :: D            ! PHYEX variables dimensions structure
 TYPE(CST_t),            INTENT(IN)   :: CST          ! modd_cst general constant structure
-TYPE(NEB_t),            INTENT(IN)   :: NEB
+TYPE(NEB_t),            INTENT(IN)   :: NEBN
 TYPE(PARAM_MFSHALL_t),  INTENT(IN)   :: PARAMMF
 TYPE(TURB_t),           INTENT(IN)   :: TURBN        ! modn_turbn (turb namelist) structure
 TYPE(CSTURB_t),         INTENT(IN)   :: CSTURB       ! modd_csturb turb constant structure
@@ -112,11 +110,9 @@ INTEGER,                INTENT(IN)   :: KRR          ! number of moist var.
 INTEGER,                INTENT(IN)   :: KRRL         ! number of liquid water var.
 INTEGER,                INTENT(IN)   :: KRRI         ! number of ice water var.
 INTEGER,                INTENT(IN)   :: KSV          ! number of scalar var.
-CHARACTER(LEN=1),       INTENT(IN)   :: HFRAC_ICE    ! partition liquid/ice scheme
 LOGICAL,                INTENT(IN)   :: ONOMIXLG  ! False if mixing of lagrangian tracer
 INTEGER,                INTENT(IN)   :: KSV_LGBEG ! first index of lag. tracer
 INTEGER,                INTENT(IN)   :: KSV_LGEND ! last  index of lag. tracer
-REAL,                   INTENT(IN)   :: PIMPL_MF     ! degre of implicitness
 REAL,                   INTENT(IN)   :: PTSTEP    ! Dynamical timestep 
 REAL, DIMENSION(D%NIJT,D%NKT),   INTENT(IN) ::  PZZ         ! Height of flux point
 REAL, DIMENSION(D%NIJT,D%NKT),   INTENT(IN) ::  PDZZ        ! Metric coefficients
@@ -191,7 +187,7 @@ INTEGER :: JIJ, JK, JSV
 INTEGER :: IIJB,IIJE ! physical horizontal domain indices
 INTEGER :: IKT
 !
-REAL(KIND=JPRB) :: ZHOOK_HANDLE
+REAL(KIND=JPHOOK) :: ZHOOK_HANDLE
 !------------------------------------------------------------------------
 
 !!! 1. Initialisation
@@ -221,7 +217,7 @@ ENDIF
 !$mnh_expand_array(JIJ=IIJB:IIJE,JK=1:IKT)
 ZWK(:,:)=PTHM(:,:)*PEXNM(:,:)
 !$mnh_end_expand_array(JIJ=IIJB:IIJE,JK=1:IKT)
-CALL COMPUTE_FRAC_ICE(HFRAC_ICE,NEB,ZFRAC_ICE(:,:),ZWK(:,:), IERR(:,:))
+CALL COMPUTE_FRAC_ICE(NEBN%CFRAC_ICE_SHALLOW_MF,NEBN,ZFRAC_ICE(:,:),ZWK(:,:), IERR(:,:))
 
 ! Conservative variables at t-dt
 CALL THL_RT_FROM_TH_R_MF(D, CST, KRR,KRRL,KRRI,    &
@@ -239,8 +235,8 @@ ZTHVM(:,:) = PTHM(:,:)*&
 !
 IF (PARAMMF%CMF_UPDRAFT == 'EDKF') THEN
   GENTR_DETR = .TRUE.
-  CALL COMPUTE_UPDRAFT(D, CST, NEB, PARAMMF, TURBN, CSTURB,      &
-                       KSV, HFRAC_ICE, GENTR_DETR,               &
+  CALL COMPUTE_UPDRAFT(D, CST, NEBN, PARAMMF, TURBN, CSTURB,     &
+                       KSV, GENTR_DETR,                          &
                        ONOMIXLG,KSV_LGBEG,KSV_LGEND,             &
                        PZZ,PDZZ,                                 &
                        PSFTH,PSFRV,PPABSM,PRHODREF,              &
@@ -253,8 +249,8 @@ IF (PARAMMF%CMF_UPDRAFT == 'EDKF') THEN
                        PDX,PDY)
 ELSEIF (PARAMMF%CMF_UPDRAFT == 'RHCJ') THEN
   GENTR_DETR = .TRUE.
-  CALL COMPUTE_UPDRAFT_RHCJ10(D, CST, NEB, PARAMMF, TURBN, CSTURB,&
-                       KSV, HFRAC_ICE, GENTR_DETR,               &
+  CALL COMPUTE_UPDRAFT_RHCJ10(D, CST, NEBN, PARAMMF, TURBN, CSTURB,&
+                       KSV, GENTR_DETR,                          &
                        ONOMIXLG,KSV_LGBEG,KSV_LGEND,             &
                        PZZ,PDZZ,                                 &
                        PSFTH,PSFRV,PPABSM,PRHODREF,              &
@@ -265,8 +261,8 @@ ELSEIF (PARAMMF%CMF_UPDRAFT == 'RHCJ') THEN
                        PFRAC_UP,ZFRAC_ICE_UP,ZRSAT_UP,PEMF,PDETR,&
                        PENTR,ZBUO_INTEG,KKLCL,KKETL,KKCTL,ZDEPTH )
 ELSEIF (PARAMMF%CMF_UPDRAFT == 'RAHA') THEN
-   CALL COMPUTE_UPDRAFT_RAHA(D, CST, NEB, PARAMMF,               &
-                       KSV, HFRAC_ICE, GENTR_DETR,               &
+   CALL COMPUTE_UPDRAFT_RAHA(D, CST, NEBN, PARAMMF,              &
+                       KSV, GENTR_DETR,                          &
                        ONOMIXLG,KSV_LGBEG,KSV_LGEND,             &
                        PZZ,PDZZ,                                 &
                        PSFTH,PSFRV,                              &
@@ -288,7 +284,7 @@ ENDIF
 !!! 5. Compute diagnostic convective cloud fraction and content
 !!!    --------------------------------------------------------
 !
-CALL COMPUTE_MF_CLOUD(D,CST,CSTURB,PARAMMF,TURBN%LSTATNW,&
+CALL COMPUTE_MF_CLOUD(D,CST,TURBN,PARAMMF,NEBN%LSTATNW, &
                       KRR, KRRL, KRRI,                  &
                       ZFRAC_ICE,                        &
                       PRC_UP,PRI_UP,PEMF,               &
@@ -308,10 +304,10 @@ CALL COMPUTE_MF_CLOUD(D,CST,CSTURB,PARAMMF,TURBN%LSTATNW,&
 ZEMF_O_RHODREF(:,:)=PEMF(:,:)/PRHODREF(:,:)
 !$mnh_end_expand_array(JIJ=IIJB:IIJE,JK=1:IKT)
 
-IF ( PIMPL_MF > 1.E-10 ) THEN  
+IF ( PARAMMF%XIMPL_MF > 1.E-10 ) THEN  
   CALL MF_TURB(D, KSV, PARAMMF%LMIXUV,                                &
              ONOMIXLG,KSV_LGBEG,KSV_LGEND,                            &
-             PIMPL_MF, PTSTEP,                                        &
+             PARAMMF%XIMPL_MF, PTSTEP,                                &
              PDZZ,                                                    &
              PRHODJ,                                                  &
              ZTHLM,ZTHVM,ZRTM,PUM,PVM,PSVM,                           &
@@ -337,8 +333,6 @@ IF( PARAMMF%CMF_UPDRAFT == 'DUAL') THEN
 !  PDVDT_MF=0.
 ENDIF
 !
-#ifdef REPRO48
-#else
 IF(PRESENT(BUCONF)) THEN
  IF( BUCONF%LBUDGET_U ) THEN
    !$mnh_expand_array(JIJ=IIJB:IIJE,JK=1:IKT)
@@ -387,7 +381,6 @@ IF(PRESENT(BUCONF)) THEN
    END DO
  END IF
 END IF
-#endif
 !
 IF (LHOOK) CALL DR_HOOK('SHALLOW_MF',1,ZHOOK_HANDLE)
 !
diff --git a/src/PHYEX/turb/shuman_mf.f90 b/src/PHYEX/turb/shuman_mf.f90
index 1ec7bc1ae92a1447a5d833aadc36bc26d5e0f563..ccab5397ddabda35921dd35a990113c88cfc13b1 100644
--- a/src/PHYEX/turb/shuman_mf.f90
+++ b/src/PHYEX/turb/shuman_mf.f90
@@ -6,6 +6,7 @@
       MODULE MODI_SHUMAN_MF
 !     ##################
 !
+IMPLICIT NONE
 INTERFACE
 !
 SUBROUTINE DZF_MF(D, PA, PDZF)
diff --git a/src/PHYEX/turb/th_r_from_thl_rt.func.h b/src/PHYEX/turb/th_r_from_thl_rt.func.h
index 93467975a73440ffeb71c4f2c1059a5fedc8749d..fc5071e3727276956b50b7149f44a1a5ac6b8be6 100644
--- a/src/PHYEX/turb/th_r_from_thl_rt.func.h
+++ b/src/PHYEX/turb/th_r_from_thl_rt.func.h
@@ -2,7 +2,7 @@
 !MNH_LIC This is part of the Meso-NH software governed by the CeCILL-C licence
 !MNH_LIC version 1. See LICENSE, CeCILL-C_V1-en.txt and CeCILL-C_V1-fr.txt
 !MNH_LIC for details. version 1.
-      SUBROUTINE TH_R_FROM_THL_RT(CST, NEB, KT, HFRAC_ICE,PFRAC_ICE,PP, &
+      SUBROUTINE TH_R_FROM_THL_RT(CST, NEBN, KT, HFRAC_ICE,PFRAC_ICE,PP, &
                                   PTHL, PRT, PTH, PRV, PRL, PRI,           &
                                   PRSATW, PRSATI, PRR, PRS, PRG, PRH, OOCEAN,&
                                   PBUF, KB, KE)
@@ -51,7 +51,7 @@
 !          ------------
 !
 USE MODD_CST, ONLY : CST_t
-USE MODD_NEB, ONLY : NEB_t
+USE MODD_NEB_n, ONLY : NEB_t
 !
 IMPLICIT NONE
 !
@@ -59,7 +59,7 @@ IMPLICIT NONE
 !*      0.1  declarations of arguments
 !
 TYPE(CST_t),        INTENT(IN) :: CST
-TYPE(NEB_t),        INTENT(IN) :: NEB
+TYPE(NEB_t),        INTENT(IN) :: NEBN
 INTEGER,            INTENT(IN) :: KT
 CHARACTER(LEN=1),   INTENT(IN) :: HFRAC_ICE
 LOGICAL,            INTENT(IN)   ::  OOCEAN       ! switch for Ocean model version
@@ -150,7 +150,7 @@ DO II=1,JITER
       PFRAC_ICE(J) = PRI(J) / (PRL(J)+PRI(J))
     ENDIF
   ENDDO
-  CALL COMPUTE_FRAC_ICE(HFRAC_ICE,NEB,PFRAC_ICE(IB:IE),PBUF(IB:IE, IT))
+  CALL COMPUTE_FRAC_ICE(HFRAC_ICE,NEBN,PFRAC_ICE(IB:IE),PBUF(IB:IE, IT))
 
   !Computation of Rvsat and dRsat/dT
   !In this version QSAT, QSATI, DQSAT and DQASATI functions are not used
diff --git a/src/PHYEX/turb/turb.f90 b/src/PHYEX/turb/turb.f90
index 6da9720217d0eb18e185c7ad7dcfc35ec207a771..5549a0c826674351524f2707876a10a87816e827 100644
--- a/src/PHYEX/turb/turb.f90
+++ b/src/PHYEX/turb/turb.f90
@@ -3,9 +3,9 @@
 !MNH_LIC version 1. See LICENSE, CeCILL-C_V1-en.txt and CeCILL-C_V1-fr.txt
 !MNH_LIC for details. version 1.
 !-----------------------------------------------------------------
-      SUBROUTINE TURB(CST,CSTURB,BUCONF,TURBN,D,TLES,                 &
-              & KMI,KRR,KRRL,KRRI,HLBCX,HLBCY,KGRADIENTS,KHALO,       &
-              & KSPLIT,KMODEL_CL,KSV,KSV_LGBEG,KSV_LGEND,HPROGRAM,    &
+      SUBROUTINE TURB(CST,CSTURB,BUCONF,TURBN,NEBN,D,TLES,            &
+              & KRR,KRRL,KRRI,HLBCX,HLBCY,KGRADIENTS,KHALO,           &
+              & KSPLIT, OCLOUDMODIFLM, KSV,KSV_LGBEG,KSV_LGEND,       &
               & KSV_LIMA_NR, KSV_LIMA_NS, KSV_LIMA_NG, KSV_LIMA_NH,   &
               & O2D,ONOMIXLG,OFLAT,OCOUPLES,OBLOWSNOW,OIBM,OFLYER,    &
               & OCOMPUTE_SRC, PRSNOW,                                 &
@@ -239,12 +239,11 @@
 !*      0. DECLARATIONS
 !          ------------
 !
-USE PARKIND1,   ONLY: JPRB
 USE MODE_SHUMAN_PHY, ONLY: MZF_PHY,MXF_PHY,MYF_PHY
-USE YOMHOOK ,   ONLY: LHOOK, DR_HOOK
+USE YOMHOOK ,   ONLY: LHOOK, DR_HOOK, JPHOOK
 !
 USE MODD_BUDGET,     ONLY:  NBUDGET_U,  NBUDGET_V,  NBUDGET_W,  NBUDGET_TH, NBUDGET_RV, NBUDGET_RC,  &
-                            NBUDGET_RR, NBUDGET_RI, NBUDGET_RS, NBUDGET_RG, NBUDGET_RH, NBUDGET_SV1, &
+                             NBUDGET_RI, NBUDGET_SV1, &
                             TBUDGETDATA, TBUDGETCONF_t
 USE MODD_CST,        ONLY: CST_t
 USE MODD_CTURB,      ONLY: CSTURB_t
@@ -254,6 +253,7 @@ USE MODD_IO,         ONLY: TFILEDATA
 USE MODD_LES,        ONLY: TLES_t
 USE MODD_PARAMETERS, ONLY: JPVEXT_TURB, XUNDEF
 USE MODD_TURB_n,     ONLY: TURB_t
+USE MODD_NEB_n,      ONLY: NEB_t
 !
 USE MODE_BL89,                ONLY: BL89
 USE MODE_BUDGET_PHY,              ONLY: BUDGET_STORE_INIT_PHY, BUDGET_STORE_END_PHY
@@ -290,9 +290,9 @@ TYPE(CST_t),            INTENT(IN)   :: CST           ! modd_cst general constan
 TYPE(CSTURB_t),         INTENT(IN)   :: CSTURB        ! modd_csturb turb constant structure
 TYPE(TBUDGETCONF_t),    INTENT(IN)   :: BUCONF        ! budget structure
 TYPE(TURB_t),           INTENT(IN)   :: TURBN         ! modn_turbn (turb namelist) structure
+TYPE(NEB_t),            INTENT(IN)   :: NEBN          ! modd_nebn structure
 TYPE(TLES_t),           INTENT(INOUT)   :: TLES          ! modd_les structure
 INTEGER,                INTENT(IN)   :: KGRADIENTS    ! Number of stored horizontal gradients
-INTEGER,                INTENT(IN)   :: KMI           ! model index number
 INTEGER,                INTENT(IN)   :: KRR           ! number of moist var.
 INTEGER,                INTENT(IN)   :: KRRL          ! number of liquid water var.
 INTEGER,                INTENT(IN)   :: KRRI          ! number of ice water var.
@@ -300,7 +300,8 @@ INTEGER,                INTENT(IN)   :: KSV, KSV_LGBEG, KSV_LGEND ! number of sc
 INTEGER,                INTENT(IN)   :: KSV_LIMA_NR,KSV_LIMA_NS,KSV_LIMA_NG,KSV_LIMA_NH
 CHARACTER(LEN=4),DIMENSION(2),INTENT(IN):: HLBCX, HLBCY  ! X- and Y-direc LBC
 INTEGER,                INTENT(IN)   :: KSPLIT        ! number of time-splitting
-INTEGER,                INTENT(IN)   :: KMODEL_CL     ! model number for cloud mixing length
+LOGICAL,                INTENT(IN)   :: OCLOUDMODIFLM ! cloud mixing length modifications
+INTEGER,                INTENT(IN)   ::  KHALO        ! Size of the halo for parallel distribution
 LOGICAL,                INTENT(IN)   ::  OCOMPUTE_SRC ! flag to define dimensions of SIGS and SRCT variables
 LOGICAL,                INTENT(IN)   ::  OOCEAN       ! switch for Ocean model version
 LOGICAL,                INTENT(IN)   ::  ODEEPOC      ! activates sfc forcing for ideal ocean deep conv
@@ -312,8 +313,6 @@ LOGICAL,                INTENT(IN)   ::  ODIAG_IN_RUN ! switch to activate onlin
 LOGICAL,                INTENT(IN)   ::  OIBM         ! switch to modity mixing length near building with IBM
 CHARACTER(LEN=4),       INTENT(IN)   ::  HTURBLEN_CL  ! kind of cloud mixing length
 CHARACTER (LEN=4),      INTENT(IN)   ::  HCLOUD       ! Kind of microphysical scheme
-INTEGER,                INTENT(IN)   ::  KHALO        ! Size of the halo for parallel distribution
-
 REAL,                   INTENT(IN)   ::  PRSNOW       ! Ratio for diffusion coeff. scalar (blowing snow)
 REAL,                   INTENT(IN)   ::  PTSTEP       ! timestep
 TYPE(TFILEDATA),        INTENT(IN)   ::  TPFILE       ! Output file
@@ -333,6 +332,7 @@ REAL, DIMENSION(D%NIJT,D%NKT), INTENT(IN)      ::  PRHODJ    ! dry density * Gri
 REAL, DIMENSION(D%NIJT,D%NKT), INTENT(IN)      ::  MFMOIST ! moist mass flux dual scheme
 REAL, DIMENSION(D%NIJT,D%NKT), INTENT(IN)      ::  PTHVREF   ! Virtual Potential
                                         ! Temperature of the reference state
+REAL, DIMENSION(D%NIJT,D%NKT,KGRADIENTS),   INTENT(IN) ::  PHGRAD      ! horizontal gradients
 !
 REAL, DIMENSION(D%NIJT),   INTENT(IN)      ::  PSFTH,PSFRV,   &
 ! normal surface fluxes of theta and Rv
@@ -340,7 +340,6 @@ REAL, DIMENSION(D%NIJT),   INTENT(IN)      ::  PSFTH,PSFRV,   &
 ! normal surface fluxes of (u,v) parallel to the orography
 REAL, DIMENSION(D%NIJT,KSV), INTENT(IN)      ::  PSFSV
 ! normal surface fluxes of Scalar var.
-REAL, DIMENSION(D%NIJT,D%NKT,KGRADIENTS),   INTENT(IN) ::  PHGRAD      ! horizontal gradients
 !
 !    prognostic variables at t- deltat
 REAL, DIMENSION(D%NIJT,D%NKT),   INTENT(IN) ::  PPABST      ! Pressure at time t
@@ -354,8 +353,8 @@ REAL, DIMENSION(MERGE(D%NIJT,0,TURBN%CTOM=='TM06')),INTENT(INOUT) :: PBL_DEPTH
 REAL, DIMENSION(MERGE(D%NIJT,0,TURBN%LRMC01)),INTENT(INOUT) :: PSBL_DEPTH ! SBL depth for RMC01
 !
 !    variables for cloud mixing length
-REAL, DIMENSION(MERGE(D%NIJT,0,KMODEL_CL==KMI .AND. HTURBLEN_CL/='NONE'),&
-                MERGE(D%NKT,0,KMODEL_CL==KMI .AND. HTURBLEN_CL/='NONE')),INTENT(IN)      ::  PCEI
+REAL, DIMENSION(MERGE(D%NIJT,0,OCLOUDMODIFLM),&
+                MERGE(D%NKT,0,OCLOUDMODIFLM)),INTENT(IN)      ::  PCEI
                                                  ! Cloud Entrainment instability
                                                  ! index to emphasize localy
                                                  ! turbulent fluxes
@@ -403,7 +402,6 @@ REAL, DIMENSION(D%NIJT,D%NKT), INTENT(OUT)  :: PTDISS     ! Dissipation TKE term
 TYPE(TBUDGETDATA), DIMENSION(KBUDGETS), INTENT(INOUT) :: TBUDGETS
 INTEGER, INTENT(IN) :: KBUDGETS
 !
-CHARACTER(LEN=6), INTENT(IN) :: HPROGRAM ! CPROGRAM is the program currently running (modd_conf)
 LOGICAL, INTENT(IN) :: ONOMIXLG          ! to use turbulence for lagrangian variables (modd_conf)
 LOGICAL, INTENT(IN) :: O2D               ! Logical for 2D model version (modd_conf)
 !
@@ -487,7 +485,6 @@ REAL                :: ZCOEF_AMPL_CEI_NUL! Ordonnate at the origin of the
                                          ! amplification straight line (for routine CLOUD_MODIF_LM)
 !
 INTEGER             :: IIJB,IIJE,IKB,IKE      ! index value for the
-INTEGER             :: IINFO_ll     ! return code of parallel routine
 ! Beginning and the End of the physical domain for the mass points
 INTEGER             :: IKT,IKA,IKU  ! array size in k direction
 INTEGER             :: IKL
@@ -508,7 +505,7 @@ TYPE(TFIELDMETADATA) :: TZFIELD
 !*      1.1 Set the internal domains, ZEXPL
 !
 !
-REAL(KIND=JPRB) :: ZHOOK_HANDLE,ZHOOK_HANDLE2
+REAL(KIND=JPHOOK) :: ZHOOK_HANDLE,ZHOOK_HANDLE2
 IF (LHOOK) CALL DR_HOOK('TURB',0,ZHOOK_HANDLE)
 !
 IF (TURBN%LHARAT .AND. TURBN%CTURBDIM /= '1DIM') THEN
@@ -600,7 +597,7 @@ IF (KRRL >=1) THEN
 !*       2.5 Lv/Cph/Exn
 !
   IF ( KRRI >= 1 ) THEN
-    IF (TURBN%LSTATNW) THEN
+    IF (NEBN%LSTATNW) THEN
     !wc call new functions depending on statnew
        CALL COMPUTE_FUNCTION_THERMO_NEW_STAT(CST%XALPW,CST%XBETAW,CST%XGAMW,CST%XLVTT,CST%XCL,ZT,ZEXN,ZCP, &
                                  ZLVOCPEXNM,ZAMOIST,ZATHETA)
@@ -630,7 +627,7 @@ IF (KRRL >=1) THEN
     !$mnh_end_expand_array(JIJ=IIJB:IIJE,JK=1:IKT)
   ELSE
     !wc call new stat functions or not
-    IF (TURBN%LSTATNW) THEN
+    IF (NEBN%LSTATNW) THEN
       CALL COMPUTE_FUNCTION_THERMO_NEW_STAT(CST%XALPW,CST%XBETAW,CST%XGAMW,CST%XLVTT,CST%XCL,ZT,ZEXN,ZCP, &
                                  ZLOCPEXNM,ZAMOIST,ZATHETA)
     ELSE
@@ -727,7 +724,7 @@ SELECT CASE (TURBN%CTURBLEN)
 
   CASE ('BL89')
     ZSHEAR(:,:)=0.
-    CALL BL89(D,CST,CSTURB,PZZ,PDZZ,PTHVREF,ZTHLM,KRR,ZRM,PTKET,ZSHEAR,ZLM,OOCEAN,HPROGRAM)
+    CALL BL89(D,CST,CSTURB,TURBN,PZZ,PDZZ,PTHVREF,ZTHLM,KRR,ZRM,PTKET,ZSHEAR,ZLM,OOCEAN)
 !
 !*      3.2 RM17 mixing length
 !           ------------------
@@ -745,7 +742,7 @@ SELECT CASE (TURBN%CTURBLEN)
     ZSHEAR(:,:) = SQRT(ZDUDZ(:,:)*ZDUDZ(:,:) &
                                     + ZDVDZ(:,:)*ZDVDZ(:,:))
     !$mnh_end_expand_array(JIJ=IIJB:IIJE,JK=1:IKT)
-    CALL BL89(D,CST,CSTURB,PZZ,PDZZ,PTHVREF,ZTHLM,KRR,ZRM,PTKET,ZSHEAR,ZLM,OOCEAN,HPROGRAM)
+    CALL BL89(D,CST,CSTURB,TURBN,PZZ,PDZZ,PTHVREF,ZTHLM,KRR,ZRM,PTKET,ZSHEAR,ZLM,OOCEAN)
 !
 !*      3.3 Grey-zone combined RM17 & Deardorff mixing lengths
 !           --------------------------------------------------
@@ -763,7 +760,7 @@ SELECT CASE (TURBN%CTURBLEN)
     ZSHEAR(:,:) = SQRT(ZDUDZ(:,:)*ZDUDZ(:,:) &
                                     + ZDVDZ(:,:)*ZDVDZ(:,:))
     !$mnh_end_expand_array(JIJ=IIJB:IIJE,JK=1:IKT)
-    CALL BL89(D,CST,CSTURB,PZZ,PDZZ,PTHVREF,ZTHLM,KRR,ZRM,PTKET,ZSHEAR,ZLM,OOCEAN,HPROGRAM)
+    CALL BL89(D,CST,CSTURB,TURBN,PZZ,PDZZ,PTHVREF,ZTHLM,KRR,ZRM,PTKET,ZSHEAR,ZLM,OOCEAN)
 
     CALL DELT(ZLMW,ODZ=.FALSE.)
     ! The minimum mixing length is chosen between Horizontal grid mesh (not taking into account the vertical grid mesh) and RM17.
@@ -818,7 +815,7 @@ END SELECT
 !
 !*      3.5 Mixing length modification for cloud
 !           -----------------------
-IF (KMODEL_CL==KMI .AND. HTURBLEN_CL/='NONE') CALL CLOUD_MODIF_LM
+IF (OCLOUDMODIFLM) CALL CLOUD_MODIF_LM
 ENDIF  ! end LHARRAT
 
 !
@@ -850,7 +847,7 @@ IF (TURBN%LRMC01) THEN
     ZSFRV(:)=0.
     CALL LMO(D,CST,ZUSTAR,ZTHLM(:,IKB),ZRVM,PSFTH,ZSFRV,ZLMO)
   END IF
-  CALL RMC01(D,CST,CSTURB,TURBN%CTURBLEN,PZZ,PDXX,PDYY,PDZZ,PDIRCOSZW,PSBL_DEPTH,ZLMO,ZLM,ZLEPS)
+  CALL RMC01(D,CST,CSTURB,TURBN,PZZ,PDXX,PDYY,PDZZ,PDIRCOSZW,PSBL_DEPTH,ZLMO,ZLM,ZLEPS)
 END IF
 !
 !RMC01 is only applied on RM17 in HM21
@@ -883,7 +880,7 @@ ENDIF
 !
 !
 !
-IF (HPROGRAM/='AROME ') THEN
+IF (TURBN%LROTATE_WIND) THEN
   CALL ROTATE_WIND(D,PUT,PVT,PWT,                       &
                      PDIRCOSXW, PDIRCOSYW, PDIRCOSZW,   &
                      PCOSSLOPE,PSINSLOPE,               &
@@ -905,11 +902,7 @@ END IF
 !
 !$mnh_expand_array(JIJ=IIJB:IIJE)
 ZCDUEFF(:) =-SQRT ( (PSFU(:)**2 + PSFV(:)**2) /               &
-#ifdef REPRO48
-                    (1.E-60 + ZUSLOPE(:)**2 + ZVSLOPE(:)**2 ) )
-#else
                     (CST%XMNH_TINY + ZUSLOPE(:)**2 + ZVSLOPE(:)**2 ) )
-#endif
 !$mnh_end_expand_array(JIJ=IIJB:IIJE)
 !
 !*       4.6 compute the surface tangential fluxes
@@ -1003,11 +996,11 @@ IF( BUCONF%LBUDGET_SV ) THEN
   END DO
 END IF
 
-CALL TURB_VER(D,CST,CSTURB,TURBN,TLES,                   &
+CALL TURB_VER(D,CST,CSTURB,TURBN,NEBN,TLES,              &
           KRR,KRRL,KRRI,KGRADIENTS,                      &
           OOCEAN, ODEEPOC, OCOMPUTE_SRC,                 &
           KSV,KSV_LGBEG,KSV_LGEND,                       &
-          ZEXPL,HPROGRAM, O2D, ONOMIXLG, OFLAT,          &
+          ZEXPL, O2D, ONOMIXLG, OFLAT,                   &
           OCOUPLES,OBLOWSNOW,OFLYER, PRSNOW,             &
           PTSTEP,TPFILE,                                 &
           PDXX,PDYY,PDZZ,PDZX,PDZY,PDIRCOSZW,PZZ,        &
@@ -1066,12 +1059,7 @@ IF( BUCONF%LBUDGET_SV )  THEN
   END DO
 END IF
 !
-!Les budgets des termes horizontaux de la turb sont présents dans AROME
-! alors que ces termes ne sont pas calculés
-#ifdef REPRO48
-#else
 IF( TURBN%CTURBDIM == '3DIM' ) THEN
-#endif
   IF( BUCONF%LBUDGET_U  ) CALL BUDGET_STORE_INIT_PHY(D, TBUDGETS(NBUDGET_U ), 'HTURB', PRUS  (:,:) )
   IF( BUCONF%LBUDGET_V  ) CALL BUDGET_STORE_INIT_PHY(D, TBUDGETS(NBUDGET_V ), 'HTURB', PRVS  (:,:) )
   IF( BUCONF%LBUDGET_W  ) CALL BUDGET_STORE_INIT_PHY(D, TBUDGETS(NBUDGET_W ), 'HTURB', PRWS  (:,:) )
@@ -1105,14 +1093,11 @@ IF( TURBN%CTURBDIM == '3DIM' ) THEN
       CALL BUDGET_STORE_INIT_PHY(D, TBUDGETS(NBUDGET_SV1 - 1 + JSV), 'HTURB', PRSVS(:,:, JSV) )
     END DO
   END IF
-!à supprimer une fois le précédent ifdef REPRO48 validé
-#ifdef REPRO48
-#else
-    CALL TURB_HOR_SPLT(D,CST,CSTURB, TURBN, TLES,              &
+    CALL TURB_HOR_SPLT(D,CST,CSTURB, TURBN, NEBN, TLES,        &
           KSPLIT, KRR, KRRL, KRRI, KSV,KSV_LGBEG,KSV_LGEND,    & 
           PTSTEP,HLBCX,HLBCY, OFLAT,O2D, ONOMIXLG,             & 
           OOCEAN,OCOMPUTE_SRC,OBLOWSNOW,PRSNOW,                &
-          TPFILE, HPROGRAM, KHALO,                             &
+          TPFILE, KHALO,                                       &
           PDXX,PDYY,PDZZ,PDZX,PDZY,PZZ,                        &
           PDIRCOSXW,PDIRCOSYW,PDIRCOSZW,                       &
           PCOSSLOPE,PSINSLOPE,                                 &
@@ -1125,7 +1110,6 @@ IF( TURBN%CTURBDIM == '3DIM' ) THEN
           PDP,PTP,PSIGS,                                       &
           ZTRH,                                                &
           PRUS,PRVS,PRWS,PRTHLS,PRRS,PRSVS                     )
-#endif
   !
 !  IF (HCLOUD == 'LIMA') THEN
 !     IF (KSV_LIMA_NR.GT.0) PRSVS(:,:,KSV_LIMA_NR) = ZRSVS(:,:,KSV_LIMA_NR) 
@@ -1167,10 +1151,7 @@ IF( TURBN%CTURBDIM == '3DIM' ) THEN
       CALL BUDGET_STORE_END_PHY(D, TBUDGETS(NBUDGET_SV1 - 1 + JSV), 'HTURB', PRSVS(:,:, JSV) )
     END DO
   END IF
-#ifdef REPRO48
-#else
 END IF
-#endif
 !----------------------------------------------------------------------------
 !
 !*      6. EVOLUTION OF THE TKE AND ITS DISSIPATION
@@ -1210,8 +1191,8 @@ ELSE
   ZRTKEMS(:,:)=0.
 END IF
 !
-CALL TKE_EPS_SOURCES(D,CST,CSTURB,BUCONF,TURBN,TLES,HPROGRAM,           &
-                   & KMI,PTKET,ZLM,ZLEPS,PDP,ZTRH,                      &
+CALL TKE_EPS_SOURCES(D,CST,CSTURB,BUCONF,TURBN,TLES,                    &
+                   & PTKET,ZLM,ZLEPS,PDP,ZTRH,                          &
                    & PRHODJ,PDZZ,PDXX,PDYY,PDZX,PDZY,PZZ,               &
                    & PTSTEP,ZEXPL,                                      &
                    & TPFILE,ODIAG_IN_RUN,OOCEAN,                        &
@@ -1958,7 +1939,7 @@ ELSE
 !           ------------------
   CASE ('BL89','RM17','HM21')
     ZSHEAR(:,:)=0.
-    CALL BL89(D,CST,CSTURB,PZZ,PDZZ,PTHVREF,ZTHLM,KRR,ZRM,PTKET,ZSHEAR,ZLM_CLOUD,OOCEAN,HPROGRAM)
+    CALL BL89(D,CST,CSTURB,TURBN,PZZ,PDZZ,PTHVREF,ZTHLM,KRR,ZRM,PTKET,ZSHEAR,ZLM_CLOUD,OOCEAN)
 !
 !*         3.2 Delta mixing length
 !           -------------------