From 76703d28e1c1ffe8a45009d68cd541ccce65b6c0 Mon Sep 17 00:00:00 2001
From: Quentin Rodier <quentin.rodier@meteo.fr>
Date: Wed, 16 Feb 2022 17:46:49 +0100
Subject: [PATCH] Quentin 16/02/2022: Merge from commit c8v54912 + -
 modi_condensation : remove MODD_SPP_TYPE (not used) - condensation : fill
 HALO (NaN present) of PRC,PRV,PRI (OUT) with IN values (should be only on
 HALO instead of full copy) ==> on GPU branch, NaN should not trigg an
 exception in ice_adjust on the test of ZW1< 0.0  (SR) + PT computation on
 KIB:KIE only (because ZFRAC is defined on physical point only) in the CALL
 COMPUTE_FRAC_ICE - modi/ice_adjust, condensation : move the TBUDGETS/KBUDGETS
 args (non optional possible) before the optionnal args - mode_icecloud :
 modi_tiwmx was removed and the QSATMX_TAB is now in MODE_QSATMW_TAB -
 lima_adjust_split, : SIGQSAT is now 2D

---
 docs/TODO                                    |  10 +-
 src/common/micro/condensation.F90            |  10 +-
 src/common/micro/ice_adjust.F90              |   3 +-
 src/common/micro/mode_icecloud.F90           |   5 +-
 src/common/micro/modi_condensation.F90       |   1 -
 src/common/micro/modi_ice_adjust.F90         |   3 +-
 src/mesonh/{micro => ext}/resolved_cloud.f90 |   0
 src/mesonh/micro/ice_adjust_elec.f90         | 651 ++++++++++++++++
 src/mesonh/micro/lima_adjust_split.f90       |  18 +-
 src/mesonh/micro/radtr_satel.f90             | 738 +++++++++++++++++++
 src/mesonh/mode_qsatmx_tab.F90               |  27 +
 src/mesonh/turb/th_r_from_thl_rt_1d.f90      |   4 +-
 12 files changed, 1448 insertions(+), 22 deletions(-)
 rename src/mesonh/{micro => ext}/resolved_cloud.f90 (100%)
 create mode 100644 src/mesonh/micro/ice_adjust_elec.f90
 create mode 100644 src/mesonh/micro/radtr_satel.f90
 create mode 100644 src/mesonh/mode_qsatmx_tab.F90

diff --git a/docs/TODO b/docs/TODO
index 2d1ac4b2b..65fbe237e 100644
--- a/docs/TODO
+++ b/docs/TODO
@@ -10,10 +10,10 @@ Dependencies:
   - liste dans document Interfaces
   - pour AROME placés, en attendant, dans phyex/externals
 
-Clé de compilation REPRO48 ajoutée pour permettre de reproduire le cycle 48, elle:
-- contourne des corrections de bug
-- modifie l'organisation de calculs
-Cette clé devra être supprimée
+Clé de compilation REPRO48 + REPRO55 ajoutées pour permettre de reproduire le cycle 48 MNH-5.5.0, elles:
+- contournent des corrections de bug
+- modifient l'organisation de calculs
+Ces clés devront être supprimées
 
 Merge pb:
 - ice4_nucleation_wrapper:
@@ -45,7 +45,7 @@ Pb identifiés à corriger plus tard:
        => à corriger
 - seules les options oper ont été testées, il manque des test pour sedim_after, nmaxiter, xmrstep, xtstep, autoconv, rainfr
 
-Répertoire arome/ext contient les codes non PHYEX qu'il faut modifier dans le pack pour qu'il puisse être compilé.
+Répertoire arome/ext et mesonh/ext contient les codes non PHYEX qu'il faut modifier dans le pack pour qu'il puisse être compilé.
 Ce répertoire devra être vidé à la fin du phasage, les modifications nécessaires ayadevront avoir été fournies par ailleurs
 
 Budgets/DDH
diff --git a/src/common/micro/condensation.F90 b/src/common/micro/condensation.F90
index 2e8112fc2..49cf4e896 100644
--- a/src/common/micro/condensation.F90
+++ b/src/common/micro/condensation.F90
@@ -173,7 +173,7 @@ REAL, DIMENSION(KIU,KJU,KKU) :: TCLD
 REAL :: ZDZ(KIB:KIE), ZARDUM(KIE-KIB+1),ZCLDUM(KIE-KIB+1)
 ! end OCND2
 REAL(KIND=JPRB) :: ZHOOK_HANDLE
-INTEGER, DIMENSION(KIU) :: IERR
+INTEGER, DIMENSION(KIB:KIE) :: IERR
 !
 !*       0.3  Definition of constants :
 !
@@ -207,6 +207,12 @@ PCLDFR(:,:,:) = 0. ! Initialize values
 PSIGRC(:,:,:) = 0. ! Initialize values
 ZPRIFACT = 1.      ! Initialize value
 ZCLDUM=-1.         ! Initialize value
+! Init of the HALO (should be on HALO points only)
+#ifdef REPRO55
+PRC_OUT = PRC_IN
+PRV_OUT = PRV_IN
+PRI_OUT = PRI_IN
+#endif
 IF(OCND2)ZPRIFACT = 0.
 !
 !
@@ -325,7 +331,7 @@ DO JK=IKTB,IKTE
           ZFRAC(JI) = PRI_IN(JI,JJ,JK) / (PRC_IN(JI,JJ,JK)+PRI_IN(JI,JJ,JK))
         ENDIF
       END DO
-      CALL COMPUTE_FRAC_ICE(HFRAC_ICE, ZFRAC(:), PT(:,JJ,JK), IERR) !error code IERR cannot be checked here to not break vectorization
+      CALL COMPUTE_FRAC_ICE(HFRAC_ICE, ZFRAC(:), PT(KIB:KIE,JJ,JK), IERR) !error code IERR cannot be checked here to not break vectorization
     ENDIF
     DO JI=KIB,KIE
       ZQSL(JI)   = XRD / XRV * ZPV(JI) / ( PPABS(JI,JJ,JK) - ZPV(JI) )
diff --git a/src/common/micro/ice_adjust.F90 b/src/common/micro/ice_adjust.F90
index 355cb63cc..5196f0b94 100644
--- a/src/common/micro/ice_adjust.F90
+++ b/src/common/micro/ice_adjust.F90
@@ -11,10 +11,9 @@
                              PPABST, PZZ,                                      &
                              PEXN, PCF_MF, PRC_MF, PRI_MF,                     &
                              PRV, PRC, PRVS, PRCS, PTH, PTHS, PSRCS, PCLDFR,   &
-                             PRR, PRI, PRIS, PRS, PRG, PRH,                    &
+                             PRR, PRI, PRIS, PRS, PRG, TBUDGETS, KBUDGETS, PRH,&
                              POUT_RV, POUT_RC, POUT_RI, POUT_TH,               &
                              PHLC_HRC, PHLC_HCF, PHLI_HRI, PHLI_HCF,           &
-                             TBUDGETS, KBUDGETS,                               &
                              PICE_CLD_WGT)
 !     #########################################################################
 !
diff --git a/src/common/micro/mode_icecloud.F90 b/src/common/micro/mode_icecloud.F90
index 43b394d21..774dd6887 100644
--- a/src/common/micro/mode_icecloud.F90
+++ b/src/common/micro/mode_icecloud.F90
@@ -11,7 +11,8 @@ SUBROUTINE ICECLOUD  &
   USE YOMHOOK , ONLY : LHOOK, DR_HOOK
   USE MODD_CST,ONLY : XCPD,XCPV,XLVTT,XLSTT,XG,XRD,XEPSILO
   USE MODE_TIWMX, ONLY: ESATW, ESATI
-  USE MODI_TIWMX
+  USE MODE_QSATMX_TAB
+!  USE MODI_TIWMX
   IMPLICIT NONE
 !-----------------------------------------------------------------------
 !
@@ -77,7 +78,7 @@ REAL :: ZSIGMAX,ZSIGMAY,ZSIGMAZ,ZXDIST,ZYDIST,&
 INTEGER :: JK
 
 !     External function
-REAL :: QSATMX_TAB
+!REAL :: QSATMX_TAB
 
 REAL(KIND=JPRB) :: ZHOOK_HANDLE
 IF (LHOOK) CALL DR_HOOK('ICECLOUD',0,ZHOOK_HANDLE)
diff --git a/src/common/micro/modi_condensation.F90 b/src/common/micro/modi_condensation.F90
index 7163e8208..4f1a548de 100644
--- a/src/common/micro/modi_condensation.F90
+++ b/src/common/micro/modi_condensation.F90
@@ -12,7 +12,6 @@ INTERFACE
           PLV, PLS, PCPH, &
           PHLC_HRC, PHLC_HCF, PHLI_HRI, PHLI_HCF, PICE_CLD_WGT)
 !
-USE MODD_SPP_TYPE
 !
 INTEGER,                      INTENT(IN)    :: KIU    ! horizontal dimension in x
 INTEGER,                      INTENT(IN)    :: KJU    ! horizontal dimension in y
diff --git a/src/common/micro/modi_ice_adjust.F90 b/src/common/micro/modi_ice_adjust.F90
index e949147f5..147a971cd 100644
--- a/src/common/micro/modi_ice_adjust.F90
+++ b/src/common/micro/modi_ice_adjust.F90
@@ -11,10 +11,9 @@ INTERFACE
                              PPABST, PZZ,                                      &
                              PEXN, PCF_MF, PRC_MF, PRI_MF,                     &
                              PRV, PRC, PRVS, PRCS, PTH, PTHS, PSRCS, PCLDFR,   &
-                             PRR, PRI, PRIS, PRS, PRG, PRH,                    &
+                             PRR, PRI, PRIS, PRS, PRG, TBUDGETS, KBUDGETS, PRH,&
                              POUT_RV, POUT_RC, POUT_RI, POUT_TH,               &
                              PHLC_HRC, PHLC_HCF, PHLI_HRI, PHLI_HCF,           &
-                             TBUDGETS, KBUDGETS,                               &
                              PICE_CLD_WGT)
 USE MODD_BUDGET,         ONLY: TBUDGETDATA
 IMPLICIT NONE
diff --git a/src/mesonh/micro/resolved_cloud.f90 b/src/mesonh/ext/resolved_cloud.f90
similarity index 100%
rename from src/mesonh/micro/resolved_cloud.f90
rename to src/mesonh/ext/resolved_cloud.f90
diff --git a/src/mesonh/micro/ice_adjust_elec.f90 b/src/mesonh/micro/ice_adjust_elec.f90
new file mode 100644
index 000000000..a52ffd2b3
--- /dev/null
+++ b/src/mesonh/micro/ice_adjust_elec.f90
@@ -0,0 +1,651 @@
+!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_ICE_ADJUST_ELEC
+!     ###########################
+!
+INTERFACE
+!
+      SUBROUTINE ICE_ADJUST_ELEC (KRR, KMI, HRAD, HTURBDIM, HSCONV, HMF_CLOUD,    &
+                                  OSUBG_COND, OSIGMAS, PTSTEP,PSIGQSAT,           &
+                                  PRHODJ, PEXNREF, PSIGS, PPABST, PZZ,            &
+                                  PMFCONV, PCF_MF, PRC_MF, PRI_MF,                &
+                                  PRVT, PRCT, PRVS, PRCS, PTHS, PSRCS, PCLDFR ,   &
+                                  PRRT, PRRS, PRIT, PRIS, PRST, PRSS, PRGT, PRGS, &
+                                  PQPIT, PQPIS, PQCT, PQCS,                       &
+                                  PQRT, PQRS, PQIT, PQIS, PQST, PQSS, PQGT, PQGS, &
+                                  PQNIT, PQNIS, PRHT, PRHS, PQHT, PQHS            )
+!
+INTEGER,                  INTENT(IN)    :: KRR      ! Number of moist variables
+INTEGER,                  INTENT(IN)    :: KMI      ! Model index 
+CHARACTER(len=4),         INTENT(IN)    :: HTURBDIM ! Dimensionality of the
+                                                    ! turbulence scheme
+CHARACTER(LEN=4),         INTENT(IN)    :: HSCONV   ! Shallow convection scheme
+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: 
+                                                    ! use values computed in CONDENSATION
+                                                    ! or that from turbulence scheme
+REAL,                     INTENT(IN)   :: PTSTEP    ! Double Time step
+                                                    ! (single if cold start)
+REAL,                     INTENT(IN)   :: PSIGQSAT  ! coeff applied to qsat variance contribution
+!
+REAL, DIMENSION(:,:,:),   INTENT(IN)   ::  PRHODJ  ! Dry density * Jacobian
+REAL, DIMENSION(:,:,:),   INTENT(IN)   ::  PEXNREF ! Reference Exner function
+!
+REAL, DIMENSION(:,:,:),   INTENT(IN)   ::  PSIGS   ! Sigma_s at time t
+REAL, DIMENSION(:,:,:),   INTENT(IN)   ::  PMFCONV ! convective mass flux
+REAL, DIMENSION(:,:,:),   INTENT(IN)   ::  PPABST  ! Absolute Pressure at t        
+REAL, DIMENSION(:,:,:),   INTENT(IN)   ::  PZZ     ! height of model layer
+!
+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(IN)   ::  PRVT    ! Water vapor m.r. at t
+REAL, DIMENSION(:,:,:),   INTENT(IN)   ::  PRCT    ! Cloud water m.r. at t
+REAL, DIMENSION(:,:,:),   INTENT(INOUT) :: PRVS    ! Water vapor m.r. source
+REAL, DIMENSION(:,:,:),   INTENT(INOUT) :: PRCS    ! Cloud water m.r. source
+REAL, DIMENSION(:,:,:),   INTENT(INOUT) :: PTHS    ! Theta source
+REAL, DIMENSION(:,:,:),   INTENT(OUT)   :: PSRCS   ! Second-order flux
+                                                   ! s'rc'/2Sigma_s2 at time t+1
+                                                   ! multiplied by Lambda_3
+REAL, DIMENSION(:,:,:),   INTENT(OUT)   :: PCLDFR  ! Cloud fraction          
+REAL, DIMENSION(:,:,:),   INTENT(IN)   ::  PRRS ! Rain water m.r. at t+1
+REAL, DIMENSION(:,:,:),   INTENT(INOUT)::  PRIS ! Cloud ice  m.r. at t+1
+REAL, DIMENSION(:,:,:),   INTENT(IN)   ::  PRSS ! Aggregate  m.r. at t+1
+REAL, DIMENSION(:,:,:),   INTENT(IN)   ::  PRGS ! Graupel    m.r. at t+1
+REAL, DIMENSION(:,:,:),   INTENT(IN)   ::  PRRT ! Rain water m.r. at t
+REAL, DIMENSION(:,:,:),   INTENT(IN)   ::  PRIT ! Cloud ice  m.r. at t
+REAL, DIMENSION(:,:,:),   INTENT(IN)   ::  PRST ! Aggregate  m.r. at t
+REAL, DIMENSION(:,:,:),   INTENT(IN)   ::  PRGT ! Graupel    m.r. at t
+REAL, DIMENSION(:,:,:), OPTIONAL, INTENT(IN) ::  PRHT ! Hail m.r. at t
+REAL, DIMENSION(:,:,:), OPTIONAL, INTENT(IN) ::  PRHS ! Hail m.r. at t+1
+!
+REAL, DIMENSION(:,:,:),   INTENT(IN)      ::  PQPIT  ! positive ion m.r. at t
+REAL, DIMENSION(:,:,:),   INTENT(INOUT)   ::  PQPIS  !           source
+REAL, DIMENSION(:,:,:),   INTENT(IN)      ::  PQNIT  ! negative ion m.r. at t
+REAL, DIMENSION(:,:,:),   INTENT(INOUT)   ::  PQNIS  ! source
+REAL, DIMENSION(:,:,:),   INTENT(IN)   ::  PQCT    ! Cloud water m.r. at t
+REAL, DIMENSION(:,:,:),   INTENT(INOUT) :: PQCS    ! Cloud water m.r. source
+REAL, DIMENSION(:,:,:),   INTENT(IN)   ::  PQRS ! Rain water m.r. at t+1
+REAL, DIMENSION(:,:,:),   INTENT(INOUT)::  PQIS ! Cloud ice  m.r. at t+1
+REAL, DIMENSION(:,:,:),   INTENT(IN)   ::  PQSS ! Aggregate  m.r. at t+1
+REAL, DIMENSION(:,:,:),   INTENT(IN)   ::  PQGS ! Graupel    m.r. at t+1
+REAL, DIMENSION(:,:,:),   INTENT(IN)   ::  PQRT ! Rain water m.r. at t
+REAL, DIMENSION(:,:,:),   INTENT(IN)   ::  PQIT ! Cloud ice  m.r. at t
+REAL, DIMENSION(:,:,:),   INTENT(IN)   ::  PQST ! Aggregate  m.r. at t
+REAL, DIMENSION(:,:,:),   INTENT(IN)   ::  PQGT ! Graupel    m.r. at t
+REAL, DIMENSION(:,:,:), OPTIONAL, INTENT(IN) :: PQHT ! Hail  m.r. at t
+REAL, DIMENSION(:,:,:), OPTIONAL, INTENT(IN) :: PQHS ! Hail  m.r. at t+1
+!
+END SUBROUTINE ICE_ADJUST_ELEC
+END INTERFACE
+END MODULE MODI_ICE_ADJUST_ELEC
+!
+!     ########################################################################
+      SUBROUTINE ICE_ADJUST_ELEC (KRR, KMI, HRAD, HTURBDIM, HSCONV,          &
+                             HMF_CLOUD, OSUBG_COND, OSIGMAS, PTSTEP,PSIGQSAT,&
+                             PRHODJ, PEXNREF, PSIGS, PPABST, PZZ,            &
+                             PMFCONV, PCF_MF, PRC_MF, PRI_MF,                &  
+                             PRVT, PRCT, PRVS, PRCS, PTHS, PSRCS, PCLDFR ,   &
+                             PRRT, PRRS, PRIT, PRIS, PRST, PRSS, PRGT, PRGS, &
+                             PQPIT, PQPIS, PQCT, PQCS,                       &
+                             PQRT, PQRS, PQIT, PQIS, PQST, PQSS, PQGT, PQGS, &
+                             PQNIT, PQNIS, PRHT, PRHS, PQHT, PQHS            )
+!     ########################################################################
+!
+!!****  *ICE_ADJUST_ELEC* -  compute the ajustment of water vapor in mixed-phase 
+!!                           clouds
+!!
+!!    PURPOSE
+!!    -------
+!!    The purpose of this routine is to compute the fast microphysical sources
+!!    through a saturation ajustement procedure in case of mixed-phase clouds.
+!!
+!!
+!!**  METHOD
+!!    ------
+!!    Langlois, Tellus, 1973 for the cloudless version.
+!!    When cloud water is taken into account, refer to book 1 of the
+!!    documentation.
+!!
+!!
+!!    EXTERNAL
+!!    --------
+!!      None
+!!     
+!!
+!!    IMPLICIT ARGUMENTS
+!!    ------------------
+!!      Module MODD_CST
+!!         XP00               ! Reference pressure
+!!         XMD,XMV            ! Molar mass of dry air and molar mass of vapor
+!!         XRD,XRV            ! Gaz constant for dry air, gaz constant for vapor
+!!         XCPD,XCPV          ! Cpd (dry air), Cpv (vapor)
+!!         XCL                ! Cl (liquid)
+!!         XCI                ! Ci (ice)
+!!         XTT                ! Triple point temperature
+!!         XLVTT              ! Vaporization heat constant
+!!         XLSTT              ! Sublimation  heat constant
+!!         XALPW,XBETAW,XGAMW ! Constants for saturation vapor over liquid
+!!                            !  pressure  function 
+!!         XALPI,XBETAI,XGAMI ! Constants for saturation vapor over ice
+!!                            !  pressure  function 
+!!      Module  MODD_CONF 
+!!         CCONF
+!!
+!!
+!!    REFERENCE
+!!    ---------
+!!      Book 1 and Book2 of documentation ( routine ICE_ADJUST )
+!!      Langlois, Tellus, 1973
+!!
+!!    AUTHOR
+!!    ------
+!!      J.-P. Pinty    * Laboratoire d'Aerologie*
+!!   
+!!
+!!    MODIFICATIONS
+!!    -------------
+!!      Original    2002 
+!!      C. Barthe   19/11/09   update to version 4.8.1
+!!      M. Chong    Mar. 2010  Add small ions
+!!      J.Escobar : 15/09/2015 : WENO5 & JPHEXT <> 1 
+!  P. Wautelet 05/2016-04/2018: new data structures and calls for I/O
+!  P. Wautelet    03/2020: use the new data structures and subroutines for budgets
+!-------------------------------------------------------------------------------
+!
+!*       0.    DECLARATIONS
+!              ------------
+!
+use modd_budget,         only: lbudget_th, lbudget_rv, lbudget_rc, lbudget_ri, lbudget_sv,  &
+                               NBUDGET_TH, NBUDGET_RV, NBUDGET_RC, NBUDGET_RI, NBUDGET_SV1, &
+                               tbudgets
+USE MODD_CONF
+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 mode_budget,          only: Budget_store_init, Budget_store_end
+use mode_tools_ll,        only: GET_INDICE_ll
+
+USE MODI_CONDENSATION
+USE MODI_GET_HALO
+!
+IMPLICIT NONE
+!
+!
+!*       0.1   Declarations of dummy arguments 
+!
+INTEGER,                INTENT(IN)    :: KRR      ! Number of moist variables
+INTEGER,                INTENT(IN)    :: KMI      ! Model index 
+CHARACTER(len=4),       INTENT(IN)    :: HTURBDIM ! Dimensionality of the
+                                                  ! turbulence scheme
+CHARACTER(LEN=4),       INTENT(IN)    :: HSCONV   ! Shallow convection scheme
+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: 
+                                                  ! use values computed in CONDENSATION
+                                                  ! or that from turbulence scheme
+REAL,                   INTENT(IN)    :: PTSTEP   ! Double Time step
+                                                  ! (single if cold start)
+REAL,                     INTENT(IN)   :: PSIGQSAT  ! coeff applied to qsat variance contribution
+!
+REAL, DIMENSION(:,:,:), INTENT(IN)    :: PRHODJ  ! Dry density * Jacobian
+REAL, DIMENSION(:,:,:), INTENT(IN)    :: PEXNREF ! Reference Exner function
+REAL, DIMENSION(:,:,:), INTENT(IN)    :: PSIGS   ! Sigma_s at time t
+REAL, DIMENSION(:,:,:), INTENT(IN)    :: PMFCONV ! convective mass flux
+REAL, DIMENSION(:,:,:), INTENT(IN)    :: PPABST  ! Absolute Pressure at t        
+REAL, DIMENSION(:,:,:), INTENT(IN)    :: PZZ     ! height of model layer
+!
+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(IN)    :: PRVT    ! Water vapor m.r. at t
+REAL, DIMENSION(:,:,:), INTENT(IN)    :: PRCT    ! Cloud water m.r. at t
+REAL, DIMENSION(:,:,:), INTENT(INOUT) :: PRVS    ! Water vapor m.r. source
+REAL, DIMENSION(:,:,:), INTENT(INOUT) :: PRCS    ! Cloud water m.r. source
+REAL, DIMENSION(:,:,:), INTENT(INOUT) :: PTHS    ! Theta source
+REAL, DIMENSION(:,:,:), INTENT(OUT)   :: PSRCS   ! Second-order flux
+                                                 ! s'rc'/2Sigma_s2 at time t+1
+                                                 ! multiplied by Lambda_3
+REAL, DIMENSION(:,:,:), INTENT(OUT)   :: PCLDFR  ! Cloud fraction          
+!
+REAL, DIMENSION(:,:,:), INTENT(IN)    :: PRRS ! Rain water m.r. at t+1
+REAL, DIMENSION(:,:,:), INTENT(INOUT) :: PRIS ! Cloud ice  m.r. at t+1
+REAL, DIMENSION(:,:,:), INTENT(IN)    :: PRSS ! Aggregate  m.r. at t+1
+REAL, DIMENSION(:,:,:), INTENT(IN)    :: PRGS ! Graupel    m.r. at t+1
+REAL, DIMENSION(:,:,:), INTENT(IN)    :: PRRT ! Rain water m.r. at t
+REAL, DIMENSION(:,:,:), INTENT(IN)    :: PRIT ! Cloud ice  m.r. at t
+REAL, DIMENSION(:,:,:), INTENT(IN)    :: PRST ! Aggregate  m.r. at t
+REAL, DIMENSION(:,:,:), INTENT(IN)    :: PRGT ! Graupel    m.r. at t
+REAL, DIMENSION(:,:,:), OPTIONAL, INTENT(IN) :: PRHT ! Hail m.r. at t
+REAL, DIMENSION(:,:,:), OPTIONAL, INTENT(IN) :: PRHS ! Hail m.r. at t+1
+!
+REAL, DIMENSION(:,:,:),   INTENT(INOUT)   ::  PQPIT  ! positive ion m.r. at t
+REAL, DIMENSION(:,:,:),   INTENT(INOUT)   ::  PQPIS  !           source
+REAL, DIMENSION(:,:,:),   INTENT(INOUT)   ::  PQNIT  ! negative ion m.r. at t
+REAL, DIMENSION(:,:,:),   INTENT(INOUT)   ::  PQNIS  ! source
+REAL, DIMENSION(:,:,:),   INTENT(IN)   ::  PQCT    ! Cloud water m.r. at t
+REAL, DIMENSION(:,:,:), INTENT(INOUT) :: PQCS ! Cloud water m.r. source
+REAL, DIMENSION(:,:,:), INTENT(IN)    :: PQRS ! Rain water m.r. at t+1
+REAL, DIMENSION(:,:,:), INTENT(INOUT) :: PQIS ! Cloud ice  m.r. at t+1
+REAL, DIMENSION(:,:,:), INTENT(IN)    :: PQSS ! Aggregate  m.r. at t+1
+REAL, DIMENSION(:,:,:), INTENT(IN)    :: PQGS ! Graupel    m.r. at t+1
+REAL, DIMENSION(:,:,:), INTENT(IN)    :: PQRT ! Rain water m.r. at t
+REAL, DIMENSION(:,:,:), INTENT(IN)    :: PQIT ! Cloud ice  m.r. at t
+REAL, DIMENSION(:,:,:), INTENT(IN)    :: PQST ! Aggregate  m.r. at t
+REAL, DIMENSION(:,:,:), INTENT(IN)    :: PQGT ! Graupel    m.r. at t
+REAL, DIMENSION(:,:,:), OPTIONAL, INTENT(IN) :: PQHT ! Hail m.r. at t
+REAL, DIMENSION(:,:,:), OPTIONAL, INTENT(IN) :: PQHS ! Hail m.r. at t+1
+!
+!
+!*       0.2   Declarations of local variables :
+!
+REAL  :: ZEPS  ! Mv/Md
+REAL  :: ZT00,ZT0   ! Min and max temperature for the mixed phase liquid and solid water
+                    ! for the coeff CND of the barycentric mixing ratio
+REAL, DIMENSION(SIZE(PEXNREF,1),SIZE(PEXNREF,2),SIZE(PEXNREF,3)) &
+                         :: ZEXNS,&  ! guess of the Exner functon at t+1
+                            ZT,   &  ! guess of the temperature at t+1
+                            ZCPH, &  ! guess of the CPh for the mixing
+                            ZLV,  &  ! guess of the Lv at t+1
+                            ZLS,  &  ! guess of the Ls at t+1
+      ZW1,ZW2,ZW3,ZW4,ZW5,ZW6,ZW7,&  ! Work arrays for intermediate fields
+      ZW1_IN, ZW2_IN, ZW3_IN,     &
+                            ZCND     ! CND=(T-T00)/(T0-T00) cf sc doc and TAO etal (89)
+REAL, DIMENSION(SIZE(PEXNREF,1),SIZE(PEXNREF,2),SIZE(PEXNREF,3)) &
+                         :: ZWE1, &
+                            ZWE2
+REAL, DIMENSION(SIZE(PEXNREF,1),SIZE(PEXNREF,2),SIZE(PEXNREF,3)) &
+                         :: ZION_NUMBER,  &  !nearly Nb of elementary charge
+                                             ! in hydrometeor charge  
+                            ZADD             ! ratio (0 or 1) of ZION_NUMBER 
+                                             ! to add to positive
+                                             ! or negative ion number
+REAL, DIMENSION(SIZE(PEXNREF,1),SIZE(PEXNREF,2)) :: ZSIGQSAT2D
+                                             !
+INTEGER             :: IIU,IJU,IKU! dimensions of dummy arrays
+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             :: IKB        ! K index value of the first inner mass point
+INTEGER             :: IKE        ! K index value of the last inner mass point
+INTEGER             :: JITER,ITERMAX ! iterative loop for first order adjustment
+!
+LOGICAL             :: LPRETREATMENT, LNEW_ADJUST
+!
+!-------------------------------------------------------------------------------
+!
+!*       1.     PRELIMINARIES
+!               -------------
+!
+IIU = SIZE(PEXNREF,1)
+IJU = SIZE(PEXNREF,2)
+IKU = SIZE(PEXNREF,3)
+CALL GET_INDICE_ll (IIB,IJB,IIE,IJE)
+IKB = 1 + JPVEXT
+IKE = IKU - JPVEXT
+!
+ZEPS = XMV / XMD
+!
+ITERMAX = 1
+!
+LPRETREATMENT=.TRUE.     ! FALSE to retreive the previous MASDEV4_1 version
+LNEW_ADJUST  =.TRUE.     ! FALSE to retreive the previous MASDEV4_1 version
+ZT0  = XTT               ! Usefull if LPRETREATMENT=T or LNEW_ADJUST=T
+ZT00 = XTT-40.           ! Usefull if LPRETREATMENT=T or LNEW_ADJUST=T
+!
+!-------------------------------------------------------------------------------
+if ( lbudget_th ) call Budget_store_init( tbudgets(NBUDGET_TH), 'DEPI', pths(:, :, :) * prhodj(:, :, :) )
+if ( lbudget_rv ) call Budget_store_init( tbudgets(NBUDGET_RV), 'DEPI', prvs(:, :, :) * prhodj(:, :, :) )
+if ( lbudget_rc ) call Budget_store_init( tbudgets(NBUDGET_RC), 'DEPI', prcs(:, :, :) * prhodj(:, :, :) )
+if ( lbudget_ri ) call Budget_store_init( tbudgets(NBUDGET_RI), 'DEPI', pris(:, :, :) * prhodj(:, :, :) )
+if ( lbudget_sv ) then
+  call Budget_store_init( tbudgets(NBUDGET_SV1 - 1 + nsv_elecbeg     ), 'DEPI', pqpis(:, :, :) * prhodj(:, :, :) )
+  call Budget_store_init( tbudgets(NBUDGET_SV1 - 1 + nsv_elecend     ), 'DEPI', pqnis(:, :, :) * prhodj(:, :, :) )
+  call Budget_store_init( tbudgets(NBUDGET_SV1 - 1 + nsv_elecbeg + 1 ), 'DEPI', pqcs (:, :, :) * prhodj(:, :, :) )
+  call Budget_store_init( tbudgets(NBUDGET_SV1 - 1 + nsv_elecbeg + 3 ), 'DEPI', pqis (:, :, :) * prhodj(:, :, :) )
+end if
+!
+!*       2.     COMPUTE QUANTITIES WITH THE GUESS OF THE FUTURE INSTANT
+!               -------------------------------------------------------
+!
+!*       2.1    estimate the pressure at t+1
+!
+ZEXNS(:,:,:) = ( PPABST(:,:,:)  / XP00)**(XRD/XCPD)
+!
+!    beginning of the iterative loop
+!
+DO JITER = 1, ITERMAX
+!
+!*       2.2    compute the intermediate temperature at t+1, T*
+!  
+  ZT(:,:,:) = (PTHS(:,:,:) * PTSTEP) * ZEXNS(:,:,:)
+!
+!*       2.3    compute the latent heat of vaporization Lv(T*) at t+1
+!                   and the latent heat of sublimation  Ls(T*) at t+1
+!
+  ZLV(:,:,:) = XLVTT + (XCPV - XCL) * (ZT(:,:,:) - XTT)
+  ZLS(:,:,:) = XLSTT + (XCPV - XCI) * (ZT(:,:,:) - XTT)
+!
+!*       2.4    compute the specific heat for moist air (Cph) at t+1
+!
+  IF     ( KRR == 7 ) THEN
+    ZCPH(:,:,:) = XCPD + XCPV *PTSTEP*  PRVS(:,:,:)                             &
+                       + XCL  *PTSTEP* (PRCS(:,:,:) + PRRS(:,:,:))              &
+                       + XCI  *PTSTEP* (PRIS(:,:,:) + PRSS(:,:,:) + PRGS(:,:,:) &
+                                                                  + PRHS(:,:,:))
+  ELSE IF( KRR == 6 ) THEN
+    ZCPH(:,:,:) = XCPD + XCPV *PTSTEP*  PRVS(:,:,:)                            &
+                       + XCL  *PTSTEP* (PRCS(:,:,:) + PRRS(:,:,:))             &
+                       + XCI  *PTSTEP* (PRIS(:,:,:) + PRSS(:,:,:) + PRGS(:,:,:))
+  ELSE IF( KRR == 5 ) THEN
+    ZCPH(:,:,:) = XCPD + XCPV *PTSTEP*  PRVS(:,:,:)                            &
+                       + XCL  *PTSTEP* (PRCS(:,:,:) + PRRS(:,:,:))             &
+                       + XCI  *PTSTEP* (PRIS(:,:,:) + PRSS(:,:,:))
+  ELSE IF( KRR == 3 ) THEN
+    ZCPH(:,:,:) = XCPD + XCPV *PTSTEP*  PRVS(:,:,:)              &
+                       + XCL  *PTSTEP* (PRCS(:,:,:) + PRRS(:,:,:))
+  ELSE IF( KRR == 2 ) THEN
+    ZCPH(:,:,:) = XCPD + XCPV *PTSTEP*  PRVS(:,:,:) &
+                       + XCL  *PTSTEP*  PRCS(:,:,:)
+  END IF
+!
+!
+!*       3.     FIRST ORDER SUBGRID CONDENSATION SCHEME
+!               ---------------------------------------
+!
+  IF (OSUBG_COND) THEN
+!
+!*       3.1    compute condensate, cloud fraction
+!
+  !   ZW3=water vapor    ZW1=rc (OUT)  ZW2=ri (OUT)   PSRC= s'rci'/Sigma_s^2
+  ! ZW3_IN/ZW2_IN/ZW1_IN (IN)
+    ZW3_IN = PRVS * PTSTEP;     ZW1_IN = PRCS * PTSTEP;  ZW2_IN = PRIS * PTSTEP
+    ZW3=ZW3_IN; ZW2=ZW2_IN; ZW1=ZW1_IN 
+    ZSIGQSAT2D(:,:)=PSIGQSAT
+    ZW4 = 1. ! PRODREF is not used if HL variables are not present
+!
+    CALL CONDENSATION( IIU, IJU, IKU, IIB, IIE, IJB, IJE, IKB, IKE,1, 'T', 'CB02', 'CB',   &
+       PPABST, PZZ, ZW4, ZT, ZW3_IN, ZW3, ZW1_IN, ZW1, ZW2_IN, ZW2, &
+       PRSS*PTSTEP, PRGS*PTSTEP, &
+       PSIGS, PMFCONV, PCLDFR, PSRCS, .TRUE., &
+       OSIGMAS, .FALSE., ZSIGQSAT2D, PLV=ZLV, PLS=ZLS, PCPH=ZCPH )
+!
+!*       3.2    compute the variation of mixing ratio
+!
+                                                        !         Rc - Rc*
+    ZW1(:,:,:) = (ZW1(:,:,:) / PTSTEP) - PRCS(:,:,:)    ! Pcon = ----------
+                                                        !         2 Delta t
+
+    ZW2(:,:,:) = (ZW2(:,:,:) / PTSTEP) - PRIS(:,:,:)    ! idem ZW1 but for Ri
+
+  ELSE
+!
+!
+!*       4.     SECOND ORDER ALL OR NOTHING CONDENSATION SCHEME
+!                            FOR MIXED-PHASE CLOUD
+!               -----------------------------------------------
+!
+!
+!*       4.1    Eventually pretreatment
+!
+    IF (LPRETREATMENT) THEN
+!
+!     compute the saturation vapor pressures at t+1
+!
+      CALL GET_HALO(ZT)
+      ZW1(:,:,:) = EXP(XALPW - XBETAW/ZT(:,:,:) - XGAMW*ALOG(ZT(:,:,:))) ! e_sw
+      ZW2(:,:,:) = EXP(XALPI - XBETAI/ZT(:,:,:) - XGAMI*ALOG(ZT(:,:,:))) ! e_si
+      ZW1(:,:,:) = MIN(PPABST(:,:,:)/2.,ZW1(:,:,:))   ! safety limitation
+      ZW2(:,:,:) = MIN(PPABST(:,:,:)/2.,ZW2(:,:,:))   ! safety limitation
+!
+!     compute the saturation mixing ratios at t+1
+!
+      ZW3(:,:,:) = ZW1(:,:,:) * ZEPS / &
+                  ( PPABST(:,:,:) - ZW1(:,:,:))  ! r_sw
+      ZW4(:,:,:) = ZW2(:,:,:) * ZEPS / &
+                  ( PPABST(:,:,:) - ZW2(:,:,:))  ! r_si
+!
+      WHERE(PRVS(:,:,:)*PTSTEP .LT. ZW4(:,:,:) .AND. &
+            PRCS(:,:,:) .GT. 0. .AND. ZT(:,:,:) .LT. XTT)
+!
+!       Subsaturation case with respect to rsi(T,P) (and case rv<0):
+!       Evaporation of rc>0 (while enough) to decrease the lack of vapor 
+!
+        ZW5 (:,:,:)= MIN( PRCS , ZW4(:,:,:)/PTSTEP - PRVS(:,:,:) )                ! RVCNDC
+        PRVS(:,:,:)= PRVS(:,:,:) + ZW5(:,:,:) 
+        PRCS(:,:,:)= PRCS(:,:,:) - ZW5(:,:,:) 
+        PTHS(:,:,:)= PTHS(:,:,:) - ZW5(:,:,:) * ZLV(:,:,:) /(ZCPH(:,:,:)*PEXNREF(:,:,:))
+!
+      END WHERE
+!  
+      WHERE (PRVS(:,:,:)*PTSTEP .GT. ZW3(:,:,:))
+!
+!       Supersaturation case with respect to rsw(T,P):
+!       Condensation of the vapor that is left 
+!
+        ZW5 (:,:,:)= PRVS(:,:,:) - ZW3(:,:,:)/PTSTEP 
+        PRVS(:,:,:)= PRVS(:,:,:) - ZW5(:,:,:)                                  ! RVCNDC 
+        PRCS(:,:,:)= PRCS(:,:,:) + ZW5(:,:,:) 
+        PTHS(:,:,:)= PTHS(:,:,:) + ZW5(:,:,:) * ZLV(:,:,:) /(ZCPH(:,:,:)*PEXNREF(:,:,:))
+!
+      END WHERE
+!
+      WHERE (PRCS(:,:,:) .GT. 0. .AND. ZT(:,:,:) .LT. ZT00)
+!
+!       Treatment of rc>0 if T<T00:
+!
+        PRIS(:,:,:)= PRIS(:,:,:) + PRCS(:,:,:) 
+        PTHS(:,:,:)= PTHS(:,:,:) + PRCS(:,:,:) * &
+                    (ZLS(:,:,:) - ZLV(:,:,:)) / (ZCPH(:,:,:) * PEXNREF(:,:,:))
+        PRCS(:,:,:)= 0. 
+!
+      END WHERE
+!
+!*       4.2    compute the intermediate temperature at t+1, T*
+!  
+      ZT(:,:,:) = (PTHS(:,:,:) * PTSTEP) * ZEXNS(:,:,:)
+!
+    END IF  !end PRETREATMENT 
+!
+!*       4.3    compute the saturation vapor pressures at t+1
+!
+    ZW1(:,:,:) = EXP(XALPW - XBETAW / ZT(:,:,:) - XGAMW * ALOG(ZT(:,:,:))) ! e_sw
+    ZW2(:,:,:) = EXP(XALPI - XBETAI / ZT(:,:,:) - XGAMI * ALOG(ZT(:,:,:))) ! e_si
+    ZW1(:,:,:) = MIN(PPABST(:,:,:)/2.,ZW1(:,:,:))   ! safety limitation
+    ZW2(:,:,:) = MIN(PPABST(:,:,:)/2.,ZW2(:,:,:))   ! safety limitation
+!
+!*       4.4    compute the saturation mixing ratios at t+1
+!
+    ZW3(:,:,:) =  ZW1(:,:,:) * ZEPS     &
+               / ( PPABST(:,:,:)  - ZW1(:,:,:) ) ! r_sw
+    ZW4(:,:,:) =  ZW2(:,:,:) * ZEPS     &
+               / ( PPABST(:,:,:)  - ZW2(:,:,:) ) ! r_si
+!
+!*       4.5    compute the saturation mixing ratio derivatives (r'_vs)
+!
+    ZW1(:,:,:) = (( XBETAW/ZT(:,:,:) - XGAMW ) / ZT(:,:,:)) & ! r'_sw
+                    * ZW3(:,:,:) * ( 1. + ZW3(:,:,:)/ZEPS )
+    ZW2(:,:,:) = (( XBETAI/ZT(:,:,:) - XGAMI ) / ZT(:,:,:)) & ! r'_si
+                    * ZW4(:,:,:) * ( 1. + ZW4(:,:,:)/ZEPS )
+!
+    IF (LNEW_ADJUST) THEN
+      ZCND(:,:,:)= (ZT(:,:,:) - ZT00) / (ZT0 - ZT00)       ! Like Tao et al 89
+      ZCND(:,:,:)= MAX ( MIN(ZCND(:,:,:),1.) , 0. )
+    ELSE
+      WHERE ((PRCS(:,:,:)+PRIS(:,:,:)) .GT. 1.0E-20)      &
+      ZCND(:,:,:)= PRCS(:,:,:) / (PRCS(:,:,:) + PRIS(:,:,:)) ! Like the original version
+    END IF
+!
+!*       4.5    compute L_v CND + L_s DEP and F'(T)
+!
+    WHERE ((PRCS(:,:,:)+PRIS(:,:,:)) .GT. 1.0E-20)
+!
+      ZW5(:,:,:) = ZLS(:,:,:) + (ZLV(:,:,:) - ZLS(:,:,:)) * ZCND(:,:,:)
+      ZW6(:,:,:) = ZCPH(:,:,:) * (PRCS(:,:,:) + PRIS(:,:,:)) +          &
+                   ZW5(:,:,:)  * (PRCS(:,:,:) * ZW1(:,:,:)              &
+                                              + PRIS(:,:,:) * ZW2(:,:,:))
+!
+!*       4.6    compute Delta 2
+!
+      ZW7(:,:,:) = (ZW5(:,:,:) / (ZW6(:,:,:) * ZT(:,:,:))) *                                 &
+                   (PRCS(:,:,:) * ZW1(:,:,:) *                                               &
+        ((-2. * XBETAW + XGAMW * ZT(:,:,:)) / (XBETAW - XGAMW * ZT(:,:,:)) +                 &
+               (XBETAW - XGAMW * ZT(:,:,:)) * (1.0 + 2.0 * ZW3(:,:,:) / ZEPS) / ZT(:,:,:)) + &
+                    PRIS(:,:,:) * ZW2(:,:,:) *                                               &
+        ((-2. * XBETAI + XGAMI * ZT(:,:,:)) / (XBETAI - XGAMI * ZT(:,:,:)) +                 &
+               (XBETAI - XGAMI * ZT(:,:,:)) * (1.0 + 2.0 * ZW4(:,:,:) / ZEPS) / ZT(:,:,:)))
+!
+!*       4.7    compute Delta 1
+!
+      ZW6(:,:,:) = ZW5(:,:,:) * (PRCS(:,:,:) * ZW3(:,:,:) + PRIS(:,:,:) * ZW4(:,:,:) - &
+                                 PRVS(:,:,:) * PTSTEP * (PRCS(:,:,:) + PRIS(:,:,:))) / &
+                                 ZW6(:,:,:)
+!
+!*       4.8    compute the sources
+!
+      ZW3(:,:,:) = (ZCPH(:,:,:) / ZW5(:,:,:)) *  &
+                   (-ZW6(:,:,:) * (1.0 + 0.5 * ZW6(:,:,:) * ZW7(:,:,:))) / PTSTEP
+      ZW1(:,:,:) = ZW3(:,:,:) * ZCND(:,:,:)                               ! RVCNDC
+      ZW2(:,:,:) = ZW3(:,:,:) * (1.0 - ZCND(:,:,:))                       ! RVDEPI
+!
+    ELSEWHERE
+!
+!*       4.9    special case when both r_c and r_i are zero
+!
+      ZW6(:,:,:) = ZCPH(:,:,:) + ZLV(:,:,:) * ZW1(:,:,:)               ! F'(T)
+      ZW7(:,:,:) = (ZLV(:,:,:) / (ZW6(:,:,:) * ZT(:,:,:))) *                & ! Delta 2
+                   (ZW1(:,:,:) *                                            &
+       ((-2. * XBETAW + XGAMW * ZT(:,:,:)) / (XBETAW - XGAMW * ZT(:,:,:)) + &
+              (XBETAW - XGAMW * ZT(:,:,:)) * (1.0 + 2.0 * ZW3(:,:,:) / ZEPS) / ZT(:,:,:)))
+      ZW6(:,:,:) = ZLV(:,:,:) * (ZW3(:,:,:) - PRVS(:,:,:) * PTSTEP) / ZW6(:,:,:) ! Delta 1
+      ZW1(:,:,:) = (ZCPH(:,:,:) / ZLV(:,:,:)) *                          & ! RVCNDC
+                   (-ZW6(:,:,:) * ( 1.0 + 0.5 * ZW6(:,:,:) * ZW7(:,:,:))) / PTSTEP
+      ZW2(:,:,:) = 0.0                                                     ! RVDEPI
+!
+    END WHERE
+  END IF 
+!
+!*       5.     COMPUTE THE SOURCES AND STORES THE CLOUD FRACTION
+!               -------------------------------------------------
+!
+!*       5.1    compute the sources 
+!
+!*       5.1.1  microphysics
+!
+  WHERE (ZW1(:,:,:) < 0.0)
+    ZW1(:,:,:) = MAX (ZW1(:,:,:), -PRCS(:,:,:))        ! Evaporation rate
+  ELSEWHERE
+    ZW1(:,:,:) = MIN (ZW1(:,:,:),  PRVS(:,:,:))        ! Condensation rate
+  END WHERE
+!
+  PRVS(:,:,:) = PRVS(:,:,:) - ZW1(:,:,:)
+  PRCS(:,:,:) = PRCS(:,:,:) + ZW1(:,:,:)  
+  PTHS(:,:,:) = PTHS(:,:,:) +        &
+                 ZW1(:,:,:) * ZLV(:,:,:) / (ZCPH(:,:,:) * PEXNREF(:,:,:))
+!
+  WHERE (ZW2(:,:,:) < 0.0)
+    ZW2(:,:,:) = MAX (ZW2(:,:,:), -PRIS(:,:,:))        ! Sublimation rate
+  ELSEWHERE
+    ZW2(:,:,:) = MIN (ZW2(:,:,:),  PRVS(:,:,:))        ! Deposition rate
+  END WHERE
+!
+  PRVS(:,:,:) = PRVS(:,:,:) - ZW2(:,:,:)
+  PRIS(:,:,:) = PRIS(:,:,:) + ZW2(:,:,:)
+  PTHS(:,:,:) = PTHS(:,:,:) +        &
+                 ZW2(:,:,:) * ZLS(:,:,:) / (ZCPH(:,:,:) * PEXNREF(:,:,:))
+!
+!*       5.1.2  electricity
+!
+  ZWE1(:,:,:) = 0.
+  ZWE2(:,:,:) = 0.
+!
+! the electrical process due to condensation is removed and
+! capture of ions by cloud droplets is done in ion_attach_elec routine
+!
+! evaporation
+  WHERE (ABS(PRCT(:,:,:)) > XRTMIN_ELEC(2) .AND. &
+         ABS(PQCT(:,:,:)) > XQTMIN(2)      .AND. &
+              ZW1(:,:,:)  < -XRTMIN(1))
+    ZWE1(:,:,:) = (XFC / 3.) * (PQCT(:,:,:) / PRCT(:,:,:)) * (-ZW1(:,:,:))
+    ZION_NUMBER(:,:,:) = ABS(ZWE1(:,:,:)) / XECHARGE
+    ZADD(:,:,:) = 0.5 + SIGN(0.5, ZWE1(:,:,:))
+    PQPIS(:,:,:) = PQPIS(:,:,:) +  &
+                            ZADD(:,:,:) *ZION_NUMBER(:,:,:)
+    PQNIS(:,:,:) = PQNIS(:,:,:) +  &
+                            (1.-ZADD(:,:,:)) *ZION_NUMBER(:,:,:)
+    PQCS(:,:,:) = PQCS(:,:,:) - ZWE1(:,:,:)
+  END WHERE
+!
+! the electrical process due to deposition is removed and
+! capture of ions by raindropsp is done in ion_attach_elec routine
+!
+! sublimation
+  WHERE (ABS(PRIT(:,:,:)) > XRTMIN_ELEC(4) .AND. &
+         ABS(PQIT(:,:,:)) > XQTMIN(4)      .AND. &
+              ZW2(:,:,:)  < -XRTMIN(1))
+    ZWE2(:,:,:) = (XFI / XBI) * (PQIT(:,:,:) / PRIT(:,:,:)) * (-ZW2(:,:,:))
+    ZION_NUMBER(:,:,:) = ABS(ZWE2(:,:,:)) / XECHARGE
+    ZADD(:,:,:) = 0.5 + SIGN(0.5, ZWE2(:,:,:))
+    PQPIS(:,:,:) = PQPIS(:,:,:) +  &
+                            ZADD(:,:,:) *ZION_NUMBER(:,:,:)
+    PQNIS(:,:,:) = PQNIS(:,:,:) +  &
+                            (1.-ZADD(:,:,:)) *ZION_NUMBER(:,:,:)
+    PQIS(:,:,:) = PQIS(:,:,:) - ZWE2(:,:,:)
+  END WHERE
+END DO          ! end of the iterative loop
+!
+!
+!*       5.2    compute the cloud fraction PCLDFR
+!
+IF (.NOT. OSUBG_COND) THEN
+  WHERE (PRCS(:,:,:) + PRIS(:,:,:) > 1.E-12 / PTSTEP)
+    PCLDFR(:,:,:) = 1.
+  ELSEWHERE
+    PCLDFR(:,:,:) = 0. 
+  ENDWHERE 
+  IF (SIZE(PSRCS,3) /= 0) THEN
+    PSRCS(:,:,:) = PCLDFR(:,:,:) 
+  END IF
+ELSE
+  IF (HSCONV == 'EDKF' .AND. HMF_CLOUD == 'DIRE') THEN
+    PCLDFR(:,:,:) = MIN(1.,PCLDFR(:,:,:)+PCF_MF(:,:,:))
+    PRCS(:,:,:)   = PRCS(:,:,:) + PRC_MF(:,:,:) / PTSTEP
+    PRIS(:,:,:)   = PRIS(:,:,:)+PRI_MF(:,:,:)/PTSTEP
+    PRVS(:,:,:)   = PRVS(:,:,:)- ( PRC_MF(:,:,:) + PRI_MF(:,:,:)) /PTSTEP
+    PTHS(:,:,:)   = PTHS(:,:,:) +  ( PRC_MF(:,:,:) * ZLV(:,:,:) +    &
+                    PRI_MF(:,:,:) * ZLS(:,:,:) ) / ZCPH(:,:,:) /     &
+                    PEXNREF(:,:,:) / PTSTEP
+  END IF
+ENDIF
+!
+!
+!
+!*       6.  STORE THE BUDGET TERMS
+!            ----------------------
+!
+if ( lbudget_th ) call Budget_store_end( tbudgets(NBUDGET_TH), 'DEPI', pths(:, :, :) * prhodj(:, :, :) )
+if ( lbudget_rv ) call Budget_store_end( tbudgets(NBUDGET_RV), 'DEPI', prvs(:, :, :) * prhodj(:, :, :) )
+if ( lbudget_rc ) call Budget_store_end( tbudgets(NBUDGET_RC), 'DEPI', prcs(:, :, :) * prhodj(:, :, :) )
+if ( lbudget_ri ) call Budget_store_end( tbudgets(NBUDGET_RI), 'DEPI', pris(:, :, :) * prhodj(:, :, :) )
+if ( lbudget_sv ) then
+  call Budget_store_end( tbudgets(NBUDGET_SV1 - 1 + nsv_elecbeg     ), 'DEPI', pqpis(:, :, :) * prhodj(:, :, :) )
+  call Budget_store_end( tbudgets(NBUDGET_SV1 - 1 + nsv_elecend     ), 'DEPI', pqnis(:, :, :) * prhodj(:, :, :) )
+  call Budget_store_end( tbudgets(NBUDGET_SV1 - 1 + nsv_elecbeg + 1 ), 'DEPI', pqcs (:, :, :) * prhodj(:, :, :) )
+  call Budget_store_end( tbudgets(NBUDGET_SV1 - 1 + nsv_elecbeg + 3 ), 'DEPI', pqis (:, :, :) * prhodj(:, :, :) )
+end if
+!------------------------------------------------------------------------------
+!
+END SUBROUTINE ICE_ADJUST_ELEC 
diff --git a/src/mesonh/micro/lima_adjust_split.f90 b/src/mesonh/micro/lima_adjust_split.f90
index edaeec820..ab87f141f 100644
--- a/src/mesonh/micro/lima_adjust_split.f90
+++ b/src/mesonh/micro/lima_adjust_split.f90
@@ -269,11 +269,12 @@ REAL, DIMENSION(SIZE(PRHODJ,1),SIZE(PRHODJ,2),SIZE(PRHODJ,3)) &
                             ZLV,  &      ! guess of the Lv at t+1
                             ZLS,  &      ! guess of the Ls at t+1
                             ZMASK,&
-                            ZRV, ZRV2,  &
-                            ZRC, ZRC2,  &
-                            ZRI,  &
+                            ZRV, ZRV2,ZRV_IN,  &
+                            ZRC, ZRC2,ZRC_IN,  &
+                            ZRI, ZRI_IN, &
                             ZSIGS, &
                             ZW_MF
+REAL, DIMENSION(SIZE(PRHODJ,1),SIZE(PRHODJ,2)) :: ZSIGQSAT2D
 LOGICAL, DIMENSION(SIZE(PRHODJ,1),SIZE(PRHODJ,2),SIZE(PRHODJ,3)) &
                          :: GMICRO ! Test where to compute cond/dep proc.
 INTEGER                  :: IMICRO
@@ -500,15 +501,20 @@ DO JITER =1,ITERMAX
      !
       ZRV=PRVS*PTSTEP
       ZRC=PRCS*PTSTEP
+      ZRV_IN=ZRV
+      ZRC_IN=ZRC
+      ZRI_IN=0.
       ZRV2=PRVT
       ZRC2=PRCT
       ZRI=0.
       ZSIGS=PSIGS
+      ZSIGQSAT2D(:,:)=PSIGQSAT
       CALL CONDENSATION(IIU, IJU, IKU, IIB, IIE, IJB, IJE, IKB, IKE, 1, 'S',   &
            HCONDENS, HLAMBDA3, &
-           PPABST, PZZ, PRHODREF, ZT, ZRV, ZRC, ZRI, PRSS*PTSTEP, PRGS*PTSTEP, &
-           ZSIGS, PMFCONV, PCLDFR, PSRCS, .FALSE., OSIGMAS, &
-           PSIGQSAT, PLV=ZLV, PLS=ZLS, PCPH=ZCPH )
+           PPABST, PZZ, PRHODREF, ZT, ZRV_IN, ZRV, ZRC_IN, ZRC, ZRI_IN, ZRI,&
+           PRSS*PTSTEP, PRGS*PTSTEP, &
+           ZSIGS, PMFCONV, PCLDFR, PSRCS, .FALSE., OSIGMAS, .FALSE., &
+           ZSIGQSAT2D, PLV=ZLV, PLS=ZLS, PCPH=ZCPH )
       PCLDFR(:,:,:) = MIN(PCLDFR(:,:,:) + PCF_MF(:,:,:) , 1.)
       ZRV(:,:,:) = ZRV(:,:,:) - MAX(MIN(PRC_MF(:,:,:), ZRV(:,:,:)),0.)
       ZRC(:,:,:) = ZRC(:,:,:) + MAX(MIN(PRC_MF(:,:,:), ZRV(:,:,:)),0.)
diff --git a/src/mesonh/micro/radtr_satel.f90 b/src/mesonh/micro/radtr_satel.f90
new file mode 100644
index 000000000..ccad5e716
--- /dev/null
+++ b/src/mesonh/micro/radtr_satel.f90
@@ -0,0 +1,738 @@
+!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 MODI_RADTR_SATEL 
+!    #######################
+INTERFACE
+!
+     SUBROUTINE RADTR_SATEL(KYEARF, KMONTHF, KDAYF, PSECF,         &
+                KDLON, KFLEV, KSTATM, KRAD_COLNBR, PEMIS, PCCO2,   &
+                PTSRAD, PSTATM, PTHT, PRT, PPABST, PZZ,            &
+                PSIGS, PMFCONV, PCLDFR, OUSERI, OSIGMAS,           &
+                OSUBG_COND, ORAD_SUBG_COND, PIRBT, PWVBT, KGEO,PSIGQSAT )
+!
+INTEGER, INTENT(IN) :: KYEARF  ! year of Final date
+INTEGER, INTENT(IN) :: KMONTHF ! month of Final date
+INTEGER, INTENT(IN) :: KDAYF   ! day of Final date
+REAL,    INTENT(IN) :: PSECF   ! number of seconds since date at 00 UTC 
+!
+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)   :: KSTATM  !index of the standard atmosphere level
+                                 !just above the model top
+INTEGER, INTENT(IN)   :: KRAD_COLNBR !factor by which the memory is split
+!
+REAL, DIMENSION(:,:),     INTENT(IN) :: PEMIS  !Surface IR EMISsivity
+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
+REAL, DIMENSION(:,:,:),   INTENT(IN) :: PPABST !pressure at t
+REAL, DIMENSION(:,:,:),   INTENT(IN) :: PZZ    !Model level heights
+!
+REAL, DIMENSION(:,:,:),   INTENT(IN) :: PSIGS  ! Sigma_s from turbulence scheme
+REAL, DIMENSION(:,:,:),   INTENT(IN) :: PMFCONV! convective mass flux (kg /s m^2)
+REAL, DIMENSION(:,:,:),   INTENT(IN) :: PCLDFR  ! cloud fraction
+!
+LOGICAL, INTENT(IN)                  :: OUSERI ! logical switch to compute both
+                                               ! liquid and solid condensate (OUSERI=.TRUE.)
+                                               ! or only liquid condensate (OUSERI=.FALSE.)
+LOGICAL, INTENT(IN)                  :: OSIGMAS! use present global Sigma_s values
+                                               ! or that from turbulence scheme
+LOGICAL, INTENT(IN)                  :: OSUBG_COND ! Switch for Subgrid Condensation
+                                                   ! (prognotic mode)
+LOGICAL, INTENT(IN)                  :: ORAD_SUBG_COND ! Switch for Subgrid Condensation
+                                                       ! (diagnostic mode)
+!
+REAL, DIMENSION(:,:),     INTENT(OUT):: PIRBT  !IR Brightness Temp. (K)
+REAL, DIMENSION(:,:),     INTENT(OUT):: PWVBT  !WV Brightness Temp. (K)
+!
+INTEGER, INTENT(IN)   :: KGEO   !SATELLITE INDEX
+REAL, INTENT(IN)                            :: PSIGQSAT ! use an extra "qsat" variance contribution (OSIGMAS case)
+!
+END SUBROUTINE RADTR_SATEL
+END INTERFACE
+END MODULE MODI_RADTR_SATEL
+!    #####################################################################
+     SUBROUTINE RADTR_SATEL(KYEARF, KMONTHF, KDAYF, PSECF,         &
+                KDLON, KFLEV, KSTATM, KRAD_COLNBR, PEMIS, PCCO2,   &
+                PTSRAD, PSTATM, PTHT, PRT, PPABST, PZZ,            &
+                PSIGS, PMFCONV, PCLDFR, OUSERI, OSIGMAS,           &
+                OSUBG_COND, ORAD_SUBG_COND, PIRBT, PWVBT, KGEO,PSIGQSAT)
+!    #####################################################################
+!
+!!****  *RADTR_SATEL* - 
+!!
+!!    PURPOSE
+!!    -------
+!!
+!!**  METHOD
+!!    ------
+!!
+!!    EXTERNAL
+!!    --------
+!!
+!!    IMPLICIT ARGUMENTS
+!!    ------------------
+!!
+!!    REFERENCE
+!!    ---------
+!!    Chaboureau, J.-P., J.-P. Cammas, P. Mascart, J.-P. Pinty, C. Claud, R. Roca,
+!!       and J.-J. Morcrette, 2000: Evaluation of a cloud system life-cycle simulated
+!!       by Meso-NH during FASTEX using METEOSAT radiances and TOVS-3I cloud retrievals.
+!!       Q. J. R. Meteorol. Soc., 126, 1735-1750.
+!!    Chaboureau, J.-P. and P. Bechtold, 2002: A simple cloud parameterization from
+!!       cloud resolving model data: Theory and application. J. Atmos. Sci., 59, 2362-2372.
+!!
+!!    AUTHOR
+!!    ------
+!!      J.-P. Chaboureau       *L.A.*
+!!
+!!    MODIFICATIONS
+!!    -------------
+!!      Original    29/03/00
+!!      J.-P. Chaboureau 15/04/03  add call to the subgrid condensation scheme
+!!      J.Escobar : 15/09/2015 : WENO5 & JPHEXT <> 1 
+!!      G.Delautier 04/2016 : BUG JPHEXT
+!!      S. Riette 11/2016 : Condensation interface changed
+!  P. Wautelet 26/04/2019: replace non-standard FLOAT function by REAL function
+!-------------------------------------------------------------------------------
+!
+!*       0.    DECLARATIONS
+!              ------------
+!
+USE MODD_CST
+USE MODD_PARAMETERS
+USE MODD_GRID_n
+!
+USE MODD_RAD_TRANSF
+USE MODE_ll
+!
+USE MODI_INIT_NBMOD
+USE MODI_DETER_ANGLE
+USE MODI_MAKE_RADSAT
+!
+USE MODI_CONDENSATION
+!
+IMPLICIT NONE
+!
+!*       0.1   DECLARATIONS OF DUMMY ARGUMENTS :
+!
+INTEGER, INTENT(IN) :: KYEARF  ! year of Final date
+INTEGER, INTENT(IN) :: KMONTHF ! month of Final date
+INTEGER, INTENT(IN) :: KDAYF   ! day of Final date
+REAL,    INTENT(IN) :: PSECF   ! number of seconds since date at 00 UTC 
+!
+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)   :: KSTATM  !index of the standard atmosphere level
+                                 !just above the model top
+INTEGER, INTENT(IN)   :: KRAD_COLNBR !factor by which the memory is split
+!
+REAL, DIMENSION(:,:),     INTENT(IN) :: PEMIS  !Surface IR EMISsivity
+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
+REAL, DIMENSION(:,:,:),   INTENT(IN) :: PPABST !pressure at t
+REAL, DIMENSION(:,:,:),   INTENT(IN) :: PZZ    !Model level heights
+!
+!
+REAL, DIMENSION(:,:,:),   INTENT(IN) :: PSIGS  ! Sigma_s from turbulence scheme
+REAL, DIMENSION(:,:,:),   INTENT(IN) :: PMFCONV! convective mass flux (kg /s m^2)
+REAL, DIMENSION(:,:,:),   INTENT(IN) :: PCLDFR  ! cloud fraction
+!
+LOGICAL, INTENT(IN)                  :: OUSERI ! logical switch to compute both
+                                               ! liquid and solid condensate (OUSERI=.TRUE.)
+                                               ! or only liquid condensate (OUSERI=.FALSE.)
+LOGICAL, INTENT(IN)                  :: OSIGMAS! use present global Sigma_s values
+                                               ! or that from turbulence scheme
+LOGICAL, INTENT(IN)                  :: OSUBG_COND ! Switch for Subgrid Condensation
+                                                   ! (prognotic mode)
+LOGICAL, INTENT(IN)                  :: ORAD_SUBG_COND ! Switch for Subgrid Condensation
+                                                       ! (diagnostic mode)
+!
+REAL, DIMENSION(:,:),     INTENT(OUT):: PIRBT  !IR Brightness Temp. (K)
+REAL, DIMENSION(:,:),     INTENT(OUT):: PWVBT  !WV Brightness Temp. (K)
+!
+INTEGER, INTENT(IN)   :: KGEO   !SATELLITE INDEX
+REAL, INTENT(IN)                            :: PSIGQSAT ! use an extra "qsat" variance contribution (OSIGMAS case)
+!
+!*       0.2   DECLARATIONS OF LOCAL VARIABLES
+!
+LOGICAL :: GPTDEP, GPVOIGT
+!
+!   reference state
+!from inprof
+INTEGER :: IGL, ICABS, ING1, IUABS, IINIS, IENDS, ICONF, ICLOUD, IOVLP
+INTEGER :: IH2O, ICO2, IO3, ICNT, IN2O, ICH4, ICO, IC11, IC12, ICFC
+!
+LOGICAL, DIMENSION(KDLON)       :: GDOIT_2D ! .TRUE. for the larger scale
+LOGICAL, DIMENSION(KDLON,KFLEV) :: GDOIT  ! .TRUE. for all the levels of the 
+                                          !        larger scale columns
+!
+INTEGER :: JI,JJ,JK,JK1,JK2,JKRAD ! loop indexes
+!
+INTEGER :: IIB,IIE        ! I index value of the first/last inner mass point
+INTEGER :: IJB,IJE        ! J index value of the first/last inner mass point
+INTEGER :: IKB,IKE        ! K index value of the first/last inner mass point
+INTEGER :: IIU          ! array size for the first  index
+INTEGER :: IJU          ! array size for the second index
+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
+INTEGER :: IDOIT_COL    ! number of larger scale columns
+INTEGER :: IDOIT        ! number of levels corresponding of the larger scale 
+                        ! columns are filled in
+INTEGER :: IDIM         ! effective number of columns for which the radiation
+                        !                code is run
+INTEGER, DIMENSION(SIZE(PZZ,1),SIZE(PZZ,3)) :: IKKOZ ! indice array used to
+               ! vertically interpolate the ozone content on the model grid
+!
+REAL, DIMENSION(:,:), ALLOCATABLE :: ZTAVE  ! mean-layer temperature
+REAL, DIMENSION(:,:), ALLOCATABLE :: ZQVAVE ! mean-layer specific humidity
+REAL, DIMENSION(:,:), ALLOCATABLE :: ZO3AVE ! mean-layer ozone content
+REAL, DIMENSION(:,:), ALLOCATABLE :: ZPRES_HL ! half-level pressure
+REAL, DIMENSION(:,:), ALLOCATABLE :: ZT_HL    ! half-level temperature
+REAL, DIMENSION(:,:), ALLOCATABLE :: ZCLDLD ! Downward cloud emissivity
+REAL, DIMENSION(:,:), ALLOCATABLE :: ZCLDLU ! Upward cloud emissivity
+REAL, DIMENSION(:),   ALLOCATABLE :: ZVIEW  ! cosecant of viewing angle
+REAL, DIMENSION(:),   ALLOCATABLE :: ZREMIS ! Reformatted PEMIS array
+REAL, DIMENSION(:,:,:), ALLOCATABLE :: ZEXNT ! Exner function
+REAL, DIMENSION(SIZE(PSTATM,1)) :: ZSTAZZ,ZSTAOZ ! STAndard atmosphere height
+                                                 !    and OZone content
+REAL :: ZOZ ! variable used to interpolate the ozone profile
+!
+REAL, DIMENSION(:),   ALLOCATABLE   ::  ZDT0     ! surface discontinuity
+REAL, DIMENSION(:,:), ALLOCATABLE   ::  ZRADBT
+REAL, DIMENSION(:,:), ALLOCATABLE   ::  ZRADBC
+REAL, DIMENSION(:,:), ALLOCATABLE   ::  ZRADFT
+REAL, DIMENSION(:),   ALLOCATABLE   ::  ZULAT
+REAL, DIMENSION(:),   ALLOCATABLE   ::  ZULON
+!
+REAL, DIMENSION(:,:), ALLOCATABLE   ::  ZZRADFT
+!
+REAL, DIMENSION(:),   ALLOCATABLE :: ZWORK1, ZWORK3
+!
+!  split arrays used to split the memory required by the ECMWF_radiation 
+!  subroutine, the fields have the same meaning as their complete counterpart
+REAL, DIMENSION(:),     ALLOCATABLE :: ZREMIS_SPLIT
+REAL, DIMENSION(:,:),   ALLOCATABLE :: ZO3AVE_SPLIT
+REAL, DIMENSION(:,:),   ALLOCATABLE :: ZT_HL_SPLIT
+REAL, DIMENSION(:,:),   ALLOCATABLE :: ZPRES_HL_SPLIT
+REAL, DIMENSION(:,:),   ALLOCATABLE :: ZQVAVE_SPLIT
+REAL, DIMENSION(:,:),   ALLOCATABLE :: ZTAVE_SPLIT
+REAL, DIMENSION(:,:), ALLOCATABLE :: ZCLDLD_SPLIT
+REAL, DIMENSION(:,:), ALLOCATABLE :: ZCLDLU_SPLIT
+REAL, DIMENSION(:),     ALLOCATABLE :: ZVIEW_SPLIT
+REAL, DIMENSION(:),   ALLOCATABLE   ::  ZDT0_SPLIT
+REAL, DIMENSION(:,:), ALLOCATABLE   ::  ZRADBT_SPLIT
+REAL, DIMENSION(:,:), ALLOCATABLE   ::  ZRADBC_SPLIT
+!
+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
+!
+! Other arrays for emissivity
+REAL :: ZFLWP, ZFIWP, ZANGCOR, ZRADLP, ZMULTS, ZTMP, ZKI
+!
+! Other arrays for condensation
+REAL, DIMENSION(:,:,:), ALLOCATABLE  :: ZTEMP  ! Temperature
+REAL, DIMENSION(:,:,:), ALLOCATABLE  :: ZSIGRC ! s r_c / sig_s^2
+REAL, DIMENSION(:,:,:), ALLOCATABLE  :: ZNCLD  ! grid scale cloud fraction
+REAL, DIMENSION(:,:,:), ALLOCATABLE  :: ZRC_IN, ZRC_OUT ! grid scale r_c mixing ratio (kg/kg)
+REAL, DIMENSION(:,:,:), ALLOCATABLE  :: ZRI_IN, ZRI_OUT ! grid scale r_i (kg/kg)
+REAL, DIMENSION(:,:,:), ALLOCATABLE  :: ZRV_IN, ZRV_OUT ! grid scale r_v (kg/kg)
+REAL, DIMENSION(:,:,:), ALLOCATABLE  :: ZRHO
+REAL, DIMENSION(SIZE(PPABST,1),SIZE(PPABST,2)) :: ZSIGQSAT2D
+!----------------------------------------------------------------------------
+!
+!*       1.    INITIALIZATION OF CONSTANTS FOR TRANSFERT CODE
+!              ----------------------------------------------
+!
+CALL INIT_NBMOD(KFLEV, IGL, ICABS, ING1, IUABS, IINIS, IENDS, &
+       IH2O, ICO2, IO3, ICNT, IN2O, ICH4, ICO, IC11, IC12, ICFC, &
+       ICONF, ICLOUD, IOVLP, GPVOIGT, GPTDEP)
+X1CO2 = PCCO2 / 44.0 * XMD
+!
+!----------------------------------------------------------------------------
+!
+!*       2.    COMPUTE DIMENSIONS OF ARRAYS AND OTHER INDICES
+!              ----------------------------------------------
+!
+IIU = SIZE(PTHT,1)
+IJU = SIZE(PTHT,2)
+IKU = SIZE(PTHT,3)
+CALL GET_INDICE_ll (IIB,IJB,IIE,IJE)
+IKB = 1 + JPVEXT
+IKE = IKU - JPVEXT
+!
+IKSTAE = SIZE(PSTATM,1)
+IKUP   = IKE-JPVEXT+1
+!
+!----------------------------------------------------------------------------
+!
+!*       3.    INITIALIZES THE MEAN-LAYER VARIABLES
+!              ------------------------------------
+!
+ALLOCATE(ZEXNT(SIZE(PTHT,1),SIZE(PTHT,2),SIZE(PTHT,3)))
+ZEXNT(:,:,:)= ( PPABST(:,:,:)/XP00 ) ** (XRD/XCPD)
+! 
+ALLOCATE(ZTAVE(KDLON,KFLEV))
+ALLOCATE(ZQVAVE(KDLON,KFLEV))
+!
+ZQVAVE(:,:) = 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)
+      ZTAVE(IIJ,JKRAD)  = PTHT(JI,JJ,JK)*ZEXNT(JI,JJ,JK)
+    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) = PRT(JI,JJ,JK,1)
+      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
+!
+!----------------------------------------------------------------------------
+!
+!*       4.    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
+! 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
+END DO
+!
+!  Surface temperature at the first level
+DO JJ=IJB,IJE
+  DO JI=IIB,IIE
+    IIJ = 1 + (JI-IIB) + (IIE-IIB+1)*(JJ-IJB)
+    ZT_HL(IIJ,1) = 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
+! 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
+!
+!----------------------------------------------------------------------------
+!
+!*       5.    INITIALIZES THE OZONE PROFILES from the standard atmosphere
+!	           ------------------------------
+!
+ALLOCATE(ZO3AVE(KDLON,KFLEV))
+!
+ZSTAOZ(:) = PSTATM(:,6)/PSTATM(:,4)
+ZSTAZZ(:) = 1000.0*PSTATM(:,1)
+!
+DO JJ = IJB,IJE
+  DO JK2 = IKB,IKE
+    JKRAD = JK2-JPVEXT
+    IKKOZ(:,JK2) = IKB-1
+    DO JK1 = 1,IKSTAE
+      DO JI = IIB,IIE
+        IKKOZ(JI,JK2)=IKKOZ(JI,JK2) + NINT(0.5 + SIGN(0.5,    &
+                                          -ZSTAZZ(JK1)+0.5*(PZZ(JI,JJ,JK2)+PZZ(JI,JJ,JK2+1)) ))
+      END DO
+    END DO
+    DO JI = IIB,IIE
+      ZOZ=(0.5*(PZZ(JI,JJ,JK2)+PZZ(JI,JJ,JK2+1))- ZSTAZZ(IKKOZ(JI,JK2))) &
+           /( ZSTAZZ(IKKOZ(JI,JK2)+1)           - ZSTAZZ(IKKOZ(JI,JK2)))
+      IIJ = 1 + (JI-IIB) + (IIE-IIB+1)*(JJ-IJB)
+      ZO3AVE(IIJ,JKRAD) =( (1.- ZOZ) * ZSTAOZ(IKKOZ(JI,JK2))    &
+                         +  ZOZ     * ZSTAOZ(IKKOZ(JI,JK2)+1))
+    END DO
+  END DO
+END DO
+!
+DO JK=IKUP,KFLEV
+  JK1 = (KSTATM)+(JK-IKUP)
+  ZO3AVE(:,JK) = ZSTAOZ(JK1)
+END DO
+!
+!----------------------------------------------------------------------------
+!
+!*       6.    CALLS THE E.C.M.W.F. RADIATION CODE
+!	           -----------------------------------
+!
+!*       6.1   INITIALIZES 2D AND SURFACE FIELDS
+!
+ALLOCATE(ZREMIS(KDLON))
+DO JJ=IJB,IJE
+  DO JI=IIB,IIE
+    IIJ = 1 + (JI-IIB) + (IIE-IIB+1)*(JJ-IJB)
+    ZREMIS(IIJ)   = PEMIS(JI,JJ)
+  END DO
+END DO
+!
+! initializes surface discontinuity field
+ALLOCATE(ZDT0(KDLON))
+DO JJ=IJB,IJE
+  DO JI=IIB,IIE
+    IIJ = 1 + (JI-IIB) + (IIE-IIB+1)*(JJ-IJB)
+    ZDT0(IIJ) = PTSRAD(JI,JJ) - PTHT(JI,JJ,1)*ZEXNT(JI,JJ,1)
+  END DO
+END DO
+!
+ALLOCATE(ZULAT(KDLON))
+ALLOCATE(ZULON(KDLON))
+DO JJ=IJB,IJE
+  DO JI=IIB,IIE
+    IIJ = 1 + (JI-IIB) + (IIE-IIB+1)*(JJ-IJB)
+    ZULON(IIJ) = XLON(JI,JJ)
+    ZULAT(IIJ) = XLAT(JI,JJ)
+  END DO
+END DO
+ALLOCATE(ZVIEW(KDLON))
+CALL DETER_ANGLE(KGEO, KDLON, ZULAT, ZULON, ZVIEW)
+DEALLOCATE(ZULAT)
+DEALLOCATE(ZULON)
+!
+!
+ALLOCATE(ZCLDLD(KDLON,KFLEV))
+ALLOCATE(ZCLDLU(KDLON,KFLEV))
+ZCLDLD = 0.
+ZCLDLU = 0.
+!
+IF( SIZE(PRT(:,:,:,:),4) >= 2 ) THEN
+  ALLOCATE(ZNCLD(IIU,IJU,IKU))
+  ALLOCATE(ZRC_IN(IIU,IJU,IKU))
+  ALLOCATE(ZRC_OUT(IIU,IJU,IKU))
+  ZRC_IN=PRT(:,:,:,2)
+  ALLOCATE(ZRI_IN(IIU,IJU,IKU))
+  ALLOCATE(ZRI_OUT(IIU,IJU,IKU))
+  ZRI_IN=0.
+  IF( OUSERI ) ZRI_IN=PRT(:,:,:,4)
+  IF ( .NOT. OSUBG_COND .AND. ORAD_SUBG_COND) THEN
+    PRINT*,' THE SUBGRID CONDENSATION SCHEME IN DIAGNOSTIC MODE IS ACTIVATED'
+    ALLOCATE(ZTEMP(IIU,IJU,IKU))
+    ZTEMP=PTHT*ZEXNT
+    ALLOCATE(ZSIGRC(IIU,IJU,IKU))
+    ALLOCATE(ZRV_IN(IIU,IJU,IKU))
+
+    ZRV_IN=PRT(:,:,:,1)
+    ALLOCATE(ZRHO(IIU,IJU,IKU))
+    ZRHO=1. !unused
+    ZSIGQSAT2D(:,:)=PSIGQSAT
+    CALL CONDENSATION( IIU, IJU, IKU, IIB, IIE, IJB, IJE, IKB, IKE, 1, 'T', 'CB02', 'CB',&
+         PPABST, PZZ, ZRHO, ZTEMP, ZRV_IN, ZRV_OUT, ZRC_IN, ZRC_OUT, ZRI_IN, ZRI_OUT, PRT(:,:,:,5), PRT(:,:,:,6), PSIGS,&
+         PMFCONV, ZNCLD, ZSIGRC, OUSERI, OSIGMAS, .FALSE., PSIGQSAT=ZSIGQSAT2D )
+    DEALLOCATE(ZTEMP,ZSIGRC)
+    DEALLOCATE(ZRV_OUT)
+  ELSE
+    ZNCLD=PCLDFR
+  END IF
+  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)
+        IF ( ZVIEW(IIJ) /= XUNDEF .AND. &
+             (ZRC_OUT(JI,JJ,JK)  > 0. .OR. ZRI_OUT(JI,JJ,JK) > 0. ) ) THEN
+          ZFLWP = ZRC_OUT(JI,JJ,JK) / XG /MAX(1.E-10,ZNCLD(JI,JJ,JK)) &
+               * (PPABST(JI,JJ,JK)-PPABST(JI,JJ,JK+1))
+          ZFIWP = ZRI_OUT(JI,JJ,JK) / XG /MAX(1.E-10,ZNCLD(JI,JJ,JK)) &
+               * (PPABST(JI,JJ,JK)-PPABST(JI,JJ,JK+1))
+          ZANGCOR = ZVIEW(IIJ) / 1.66
+          !!!Parametrization following Ou and Chou, 1995 (Atmos. Res.)
+        ZTMP = ZTAVE(IIJ,JKRAD)-XTT !ZTMP in Celsius degree
+        ZRADLP = 326.3+12.42*ZTMP+0.197*(ZTMP**2)+0.0012*(ZTMP**3)
+        ZRADLP = MIN(140., MAX(20., ZRADLP))
+!!! Parametrization following Ebert and Curry, 1992 (JGR-d)
+        ZKI = 0.3 + 1290. / ZRADLP
+         ZCLDLD(IIJ,JKRAD) = ZNCLD(JI,JJ,JK)*(1.-EXP &
+                             ( -158.*ZFLWP *ZANGCOR-ZKI*ZFIWP*ZVIEW(IIJ)))
+         ZCLDLU(IIJ,JKRAD) = ZNCLD(JI,JJ,JK)*(1.-EXP &
+                             ( -130.*ZFLWP *ZANGCOR-ZKI*ZFIWP*ZVIEW(IIJ)))
+          END IF
+        END DO
+      END DO
+    END DO
+  DEALLOCATE(ZNCLD,ZRC_OUT,ZRI_OUT)
+END IF
+!
+DEALLOCATE(ZEXNT)
+!
+GDOIT_2D(:) = .FALSE.
+!
+! Flags the columns for which the computations have to be performed
+!
+DO JJ=IJB,IJE
+  DO JI=IIB,IIE
+    IIJ = 1 + (JI-IIB) + (IIE-IIB+1)*(JJ-IJB)
+    IF (ZVIEW(IIJ) /= XUNDEF) GDOIT_2D(IIJ) = .TRUE.
+  END DO
+END DO
+IDOIT_COL = COUNT( GDOIT_2D(:) )  ! number of larger scale columns
+!
+GDOIT(:,:) = SPREAD( GDOIT_2D(:),DIM=2,NCOPIES=KFLEV )
+IDOIT = IDOIT_COL*KFLEV
+ALLOCATE(ZWORK1(IDOIT))
+!
+! temperature profiles
+ZWORK1(:) = PACK( ZTAVE(:,:),MASK=GDOIT(:,:) )
+DEALLOCATE(ZTAVE)
+ALLOCATE(ZTAVE(IDOIT_COL,KFLEV))
+ZTAVE(:,:) = RESHAPE( ZWORK1(:),(/IDOIT_COL,KFLEV/) )
+!
+! vapor mixing ratio profiles
+ZWORK1(:) = PACK( ZQVAVE(:,:),MASK=GDOIT(:,:) )
+DEALLOCATE(ZQVAVE)
+ALLOCATE(ZQVAVE(IDOIT_COL,KFLEV))
+ZQVAVE(:,:) = RESHAPE( ZWORK1(:),(/IDOIT_COL,KFLEV/) )
+!
+! cloud emissivities
+ZWORK1(:) = PACK( ZCLDLD(:,:),MASK=GDOIT(:,:) )
+DEALLOCATE(ZCLDLD)
+ALLOCATE(ZCLDLD(IDOIT_COL,KFLEV))
+ZCLDLD(:,:) = RESHAPE( ZWORK1(:),(/IDOIT_COL,KFLEV/) )
+!
+ZWORK1(:) = PACK( ZCLDLU(:,:),MASK=GDOIT(:,:) )
+DEALLOCATE(ZCLDLU)
+ALLOCATE(ZCLDLU(IDOIT_COL,KFLEV))
+ZCLDLU(:,:) = RESHAPE( ZWORK1(:),(/IDOIT_COL,KFLEV/) )
+!
+! ozone content profiles
+ZWORK1(:) = PACK( ZO3AVE(:,:),MASK=GDOIT(:,:) )
+DEALLOCATE(ZO3AVE)
+ALLOCATE(ZO3AVE(IDOIT_COL,KFLEV))
+ZO3AVE(:,:) = RESHAPE( ZWORK1(:),(/IDOIT_COL,KFLEV/) )
+!
+! half-level variables
+ZWORK1(:) = PACK(  ZPRES_HL(:,1:KFLEV),MASK=GDOIT(:,:) )
+DEALLOCATE(ZPRES_HL)
+ALLOCATE(ZPRES_HL(IDOIT_COL,KFLEV+1))
+ZPRES_HL(:,1:KFLEV) = RESHAPE( ZWORK1(:),(/IDOIT_COL,KFLEV/) )
+ZPRES_HL(:,KFLEV+1) = PSTATM(IKSTAE,2)*100.0
+!
+ZWORK1(:) = PACK(  ZT_HL(:,1:KFLEV),MASK=GDOIT(:,:) )
+DEALLOCATE(ZT_HL)
+ALLOCATE(ZT_HL(IDOIT_COL,KFLEV+1))
+ZT_HL(:,1:KFLEV) = RESHAPE( ZWORK1(:),(/IDOIT_COL,KFLEV/) )
+ZT_HL(:,KFLEV+1) = PSTATM(IKSTAE,3)
+!
+! surface fields
+ALLOCATE(ZWORK3(IDOIT_COL))
+ZWORK3(:) = PACK( ZVIEW(:),MASK=GDOIT_2D(:) )
+DEALLOCATE(ZVIEW)
+ALLOCATE(ZVIEW(IDOIT_COL))
+ZVIEW(:) = ZWORK3(:)
+!
+ZWORK3(:) = PACK( ZREMIS(:),MASK=GDOIT_2D(:) )
+DEALLOCATE(ZREMIS)
+ALLOCATE(ZREMIS(IDOIT_COL))
+ZREMIS(:) = ZWORK3(:)
+!
+ZWORK3(:) = PACK( ZDT0(:),MASK=GDOIT_2D(:) )
+DEALLOCATE(ZDT0)
+ALLOCATE(ZDT0(IDOIT_COL))
+ZDT0(:) = ZWORK3(:)
+!
+DEALLOCATE(ZWORK1)
+DEALLOCATE(ZWORK3)
+!
+! radiation fields
+ALLOCATE(ZRADBC(IDOIT_COL,JPWVINT))
+ALLOCATE(ZRADBT(IDOIT_COL,JPWVINT))
+!
+IDIM = IDOIT_COL
+PRINT *,'KGEO =',KGEO,' IDIM =',IDIM
+!
+!*       6.2   CALLS THE ECMWF_RADIATION ROUTINES
+!
+!  ***********************************************************
+!  *CAUTION: Routine  nbmvec  is written in FORTRAN 77*
+!  ***********************************************************
+!
+!  mixing ratio -> specific humidity conversion
+ZQVAVE(:,:) = ZQVAVE(:,:) / (1.+ZQVAVE(:,:))
+!
+IF( IDIM <= KRAD_COLNBR ) THEN 
+   !
+   !  there is less than KRAD_COLNBR verticals to be considered therefore
+   ! no split of the arrays is performed
+   !
+   CALL NBMVEC( 1, IDIM, IDIM, KFLEV, IGL, ICABS, ING1, IUABS, &
+        IH2O, ICO2, IO3, ICNT, IN2O, ICH4, ICO, IC11, IC12, ICFC, &
+        IINIS, IENDS, ICONF, ICLOUD, IOVLP, GPVOIGT, GPTDEP, &
+        ZTAVE, ZQVAVE, ZO3AVE, ZPRES_HL, ZT_HL, &
+        ZVIEW, ZCLDLD, ZCLDLU, ZDT0, ZREMIS, ZRADBC, ZRADBT)
+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(  ZREMIS_SPLIT(IDIM_EFF))
+       ALLOCATE(  ZO3AVE_SPLIT(IDIM_EFF,KFLEV))
+       ALLOCATE(  ZT_HL_SPLIT(IDIM_EFF,KFLEV+1))
+       ALLOCATE(  ZPRES_HL_SPLIT(IDIM_EFF,KFLEV+1))
+       ALLOCATE(  ZQVAVE_SPLIT(IDIM_EFF,KFLEV))
+       ALLOCATE(  ZTAVE_SPLIT(IDIM_EFF,KFLEV))
+       ALLOCATE(  ZCLDLU_SPLIT(IDIM_EFF,KFLEV))
+       ALLOCATE(  ZCLDLD_SPLIT(IDIM_EFF,KFLEV))
+       ALLOCATE(  ZVIEW_SPLIT(IDIM_EFF))
+       ALLOCATE(  ZDT0_SPLIT(IDIM_EFF))
+       ALLOCATE(  ZRADBT_SPLIT(IDIM_EFF,JPWVINT))
+       ALLOCATE(  ZRADBC_SPLIT(IDIM_EFF,JPWVINT))
+     END IF
+     !
+     ! fill the split arrays with their values
+     ! taken from the full arrays 
+     !
+     IBEG = IDIM-IDIM_RESIDUE+1
+     IEND = IBEG+IDIM_EFF-1
+     ZREMIS_SPLIT(:)   = ZREMIS( IBEG:IEND )
+     ZO3AVE_SPLIT(:,:) = ZO3AVE( IBEG:IEND ,:)
+     ZT_HL_SPLIT(:,:)    = ZT_HL( IBEG:IEND ,:)
+     ZPRES_HL_SPLIT(:,:) = ZPRES_HL( IBEG:IEND ,:)
+     ZQVAVE_SPLIT(:,:) = ZQVAVE( IBEG:IEND ,:)
+     ZTAVE_SPLIT(:,:)  = ZTAVE ( IBEG:IEND ,:)
+     ZCLDLU_SPLIT(:,:)  = ZCLDLU ( IBEG:IEND ,:)
+     ZCLDLD_SPLIT(:,:)  = ZCLDLD ( IBEG:IEND ,:)
+     ZVIEW_SPLIT(:)    = ZVIEW ( IBEG:IEND )
+     ZDT0_SPLIT(:)    = ZDT0 ( IBEG:IEND )
+     !  
+     ! call ECMWF_radiation with the split arrays
+     !
+     CALL NBMVEC( 1, IDIM_EFF, IDIM_EFF, KFLEV, IGL, ICABS, ING1, IUABS,&
+          IH2O, ICO2, IO3, ICNT, IN2O, ICH4, ICO, IC11, IC12, ICFC, &
+          IINIS, IENDS, ICONF, ICLOUD, IOVLP, GPVOIGT, GPTDEP, &
+          ZTAVE_SPLIT, ZQVAVE_SPLIT, ZO3AVE_SPLIT, &
+          ZPRES_HL_SPLIT, ZT_HL_SPLIT, &
+          ZVIEW_SPLIT, ZCLDLD_SPLIT, ZCLDLU_SPLIT, ZDT0_SPLIT, &
+          ZREMIS_SPLIT, ZRADBC_SPLIT, ZRADBT_SPLIT)
+     !
+     ! fill the full output arrays with the split arrays
+     !
+     ZRADBT( IBEG:IEND ,:)  = ZRADBT_SPLIT(:,:)  
+     ZRADBC( IBEG:IEND ,:)  = ZRADBC_SPLIT(:,:)  
+     !
+     IDIM_RESIDUE = IDIM_RESIDUE - IDIM_EFF
+     !
+     ! desallocation of the split arrays
+     !
+     IF( JI_SPLIT >= INUM_CALL-1 ) THEN
+       DEALLOCATE(ZREMIS_SPLIT)
+       DEALLOCATE(ZO3AVE_SPLIT)
+       DEALLOCATE(ZT_HL_SPLIT)
+       DEALLOCATE(ZPRES_HL_SPLIT)
+       DEALLOCATE(ZQVAVE_SPLIT)
+       DEALLOCATE(ZTAVE_SPLIT)
+       DEALLOCATE(ZCLDLU_SPLIT)
+       DEALLOCATE(ZCLDLD_SPLIT)
+       DEALLOCATE(ZVIEW_SPLIT)
+       DEALLOCATE(ZDT0_SPLIT)
+       DEALLOCATE(ZRADBT_SPLIT)
+       DEALLOCATE(ZRADBC_SPLIT)
+     END IF
+   END DO
+END IF
+!
+DEALLOCATE(ZTAVE,ZQVAVE,ZO3AVE)
+DEALLOCATE(ZPRES_HL,ZT_HL)
+DEALLOCATE(ZREMIS)
+DEALLOCATE(ZDT0)
+DEALLOCATE(ZCLDLD,ZCLDLU)
+DEALLOCATE(ZVIEW)
+!
+ZRADBT = ZRADBT / XPI
+ALLOCATE(ZRADFT(IDIM,JPCAN))
+CALL MAKE_RADSAT(KYEARF, KMONTHF, KDAYF, PSECF, &
+                 KGEO, IDIM, ZRADBT, ZRADFT)
+DEALLOCATE(ZRADBT)
+DEALLOCATE(ZRADBC)
+!
+ALLOCATE(ZWORK1(IDIM*JPCAN))
+ZWORK1(:) = PACK( ZRADFT(:,:),MASK=.TRUE. )
+ALLOCATE(ZZRADFT(KDLON,JPCAN))
+ZZRADFT(:,:) = UNPACK( ZWORK1(:),MASK=GDOIT(:,1:JPCAN),FIELD=XUNDEF )
+DEALLOCATE(ZRADFT)
+DEALLOCATE(ZWORK1)
+!
+PIRBT = XUNDEF
+PWVBT = XUNDEF
+DO JJ=IJB,IJE
+  DO JI=IIB,IIE
+    IIJ = 1 + (JI-IIB) + (IIE-IIB+1)*(JJ-IJB)
+    PIRBT(JI,JJ) = ZZRADFT(IIJ,1)
+    PWVBT(JI,JJ) = ZZRADFT(IIJ,2)
+  END DO
+END DO
+DEALLOCATE(ZZRADFT)
+!
+END SUBROUTINE RADTR_SATEL
diff --git a/src/mesonh/mode_qsatmx_tab.F90 b/src/mesonh/mode_qsatmx_tab.F90
new file mode 100644
index 000000000..01d697b19
--- /dev/null
+++ b/src/mesonh/mode_qsatmx_tab.F90
@@ -0,0 +1,27 @@
+MODULE MODE_QSATMX_TAB
+IMPLICIT NONE
+CONTAINS
+FUNCTION QSATMX_TAB(P,T,FICE)
+
+  USE PARKIND1, ONLY : JPRB
+  USE MODD_CST ,ONLY : XEPSILO
+  USE MODE_TIWMX, ONLY : ESATI,ESATW
+
+  IMPLICIT NONE
+
+  REAL :: QSATMX_TAB
+  REAL, INTENT(IN) :: P,T,FICE
+
+  REAL :: ZES
+
+  ZES = ESATI(T)*FICE + ESATW(T)*(1.-FICE)
+  IF(ZES >= P)THEN ! temp > boiling point, condensation not possible.
+                   ! Then this function lacks physical meaning, 
+                   ! here set to one
+     QSATMX_TAB = 1.
+  ELSE
+     QSATMX_TAB = XEPSILO*ZES/(P-ZES) !r
+  ENDIF
+
+END FUNCTION QSATMX_TAB
+END MODULE MODE_QSATMX_TAB
diff --git a/src/mesonh/turb/th_r_from_thl_rt_1d.f90 b/src/mesonh/turb/th_r_from_thl_rt_1d.f90
index f89a211d6..dbb4d564a 100644
--- a/src/mesonh/turb/th_r_from_thl_rt_1d.f90
+++ b/src/mesonh/turb/th_r_from_thl_rt_1d.f90
@@ -104,6 +104,7 @@ REAL, DIMENSION(SIZE(PTHL,1)) :: ZRVSAT,ZCPH,ZRLTEMP,ZCPH2
 REAL, DIMENSION(SIZE(PTHL,1)) :: ZT,ZLVOCPEXN,ZLSOCPEXN
 REAL, DIMENSION(SIZE(PTHL,1)) :: ZDRSATODT,ZDRSATODTW,ZDRSATODTI
 REAL, DIMENSION(SIZE(PTHL,1)) :: ZFOESW, ZFOESI
+INTEGER, DIMENSION(SIZE(PTHL,1)) :: IERR
 !----------------------------------------------------------------------------
 !
 !*      1 Initialisation
@@ -147,8 +148,7 @@ DO II=1,JITER
   WHERE(PRL(:)+PRI(:) > 1.E-20)
     PFRAC_ICE(:) = PRI(:) / (PRL(:)+PRI(:))
   ENDWHERE
-  CALL COMPUTE_FRAC_ICE(SIZE(PFRAC_ICE,1),HFRAC_ICE,PFRAC_ICE(:),ZT(:))
-
+  CALL COMPUTE_FRAC_ICE(HFRAC_ICE,PFRAC_ICE(:),ZT(:), IERR(:))
   !Computation of Rvsat and dRsat/dT
   !In this version QSAT, QSATI, DQSAT and DQASATI functions are not used
   !due to performance issue
-- 
GitLab