From f13f6af5a8b8316dcf2689439489e66a31fe0ae6 Mon Sep 17 00:00:00 2001
From: Quentin Rodier <quentin.rodier@meteo.fr>
Date: Fri, 21 May 2021 18:45:55 +0200
Subject: [PATCH] Sebastien R. 21/05/2021: update the Gaussian PDF in subgrid
 condensation scheme + HighLow clouds

---
 src/MNH/compute_mf_cloud.f90         |    2 +-
 src/MNH/compute_mf_cloud_bigaus.f90  |   39 +-
 src/MNH/condensation.f90             |  178 +++-
 src/MNH/deallocate_model1.f90        |    8 +
 src/MNH/default_desfmn.f90           |    6 +
 src/MNH/ice4_compute_pdf.f90         |  137 ++-
 src/MNH/ice4_fast_rg.f90             |  350 ++++----
 src/MNH/ice4_fast_rh.f90             |  314 ++++---
 src/MNH/ice4_fast_ri.f90             |   36 +-
 src/MNH/ice4_fast_rs.f90             |  259 +++---
 src/MNH/ice4_nucleation.f90          |    4 +-
 src/MNH/ice4_nucleation_wrapper.f90  |    7 +-
 src/MNH/ice4_rainfr_vert.f90         |   20 +-
 src/MNH/ice4_rimltc.f90              |   35 +-
 src/MNH/ice4_rrhong.f90              |   35 +-
 src/MNH/ice4_rsrimcg_old.f90         |   14 +-
 src/MNH/ice4_sedimentation_split.f90 |    8 +-
 src/MNH/ice4_slow.f90                |  135 ++-
 src/MNH/ice4_tendencies.f90          |  309 ++++---
 src/MNH/ice4_warm.f90                |  126 ++-
 src/MNH/ice_adjust.f90               |  124 ++-
 src/MNH/ice_adjust_elec.f90          |    5 +-
 src/MNH/ini_cst.f90                  |    1 +
 src/MNH/ini_modeln.f90               |   16 +
 src/MNH/modd_cst.f90                 |    1 +
 src/MNH/modd_fieldn.f90              |    5 +
 src/MNH/modd_getn.f90                |    4 +
 src/MNH/modd_turbn.f90               |   15 +-
 src/MNH/modeln.f90                   |    4 +-
 src/MNH/modn_turbn.f90               |   21 +-
 src/MNH/radtr_satel.f90              |    7 +-
 src/MNH/rain_ice.f90                 |    6 +-
 src/MNH/rain_ice_red.f90             | 1202 +++++++++++++++-----------
 src/MNH/read_exsegn.f90              |    7 +-
 src/MNH/resolved_cloud.f90           |  128 +--
 35 files changed, 2181 insertions(+), 1387 deletions(-)

diff --git a/src/MNH/compute_mf_cloud.f90 b/src/MNH/compute_mf_cloud.f90
index 28ce08a6c..ac901dc3e 100644
--- a/src/MNH/compute_mf_cloud.f90
+++ b/src/MNH/compute_mf_cloud.f90
@@ -180,7 +180,7 @@ ELSEIF (HMF_CLOUD == 'STAT') THEN
 ELSEIF (HMF_CLOUD == 'BIGA') THEN
   !Statistical scheme using the bi-gaussian PDF proposed by E. Perraud.
   CALL COMPUTE_MF_CLOUD_BIGAUS(KKA, KKB, KKE, KKU, KKL,&
-                              &PRC_UP, PRI_UP, PEMF, PDEPTH,&
+                              &PEMF, PDEPTH,&
                               &PRT_UP, PTHV_UP, PFRAC_ICE_UP, PRSAT_UP,&
                               &PRTM, PTHM, PTHVM,&
                               &PDZZ, PZZ, PRHODREF,&
diff --git a/src/MNH/compute_mf_cloud_bigaus.f90 b/src/MNH/compute_mf_cloud_bigaus.f90
index 8d158567b..1ca60edd9 100644
--- a/src/MNH/compute_mf_cloud_bigaus.f90
+++ b/src/MNH/compute_mf_cloud_bigaus.f90
@@ -1,4 +1,4 @@
-!MNH_LIC Copyright 1994-2014 CNRS, Meteo-France and Universite Paul Sabatier
+!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.
@@ -9,7 +9,7 @@
 INTERFACE
 !     #################################################################
       SUBROUTINE COMPUTE_MF_CLOUD_BIGAUS(KKA, KKB, KKE, KKU, KKL,&
-                                  PRC_UP, PRI_UP, PEMF, PDEPTH,&
+                                  PEMF, PDEPTH,&
                                   PRT_UP, PTHV_UP, PFRAC_ICE_UP, PRSAT_UP,&
                                   PRTM, PTHM, PTHVM,&
                                   PDZZ, PZZ, PRHODREF,&
@@ -24,7 +24,7 @@ INTEGER,                INTENT(IN)   :: KKB          ! near ground physical inde
 INTEGER,                INTENT(IN)   :: KKE          ! uppest atmosphere physical index
 INTEGER,                INTENT(IN)   :: KKU          ! uppest atmosphere array index
 INTEGER,                INTENT(IN)   :: KKL                     ! +1 if grid goes from ground to atmosphere top, -1 otherwise
-REAL, DIMENSION(:,:),   INTENT(IN)   :: PRC_UP,PRI_UP,PEMF      ! updraft characteritics
+REAL, DIMENSION(:,:),   INTENT(IN)   :: PEMF                    ! updraft characteritics
 REAL, DIMENSION(:),     INTENT(IN)   :: PDEPTH                  ! Deepness of cloud
 REAL, DIMENSION(:,:),   INTENT(IN)   :: PTHV_UP, PRSAT_UP, PRT_UP ! updraft characteritics
 REAL, DIMENSION(:,:),   INTENT(IN)   :: PFRAC_ICE_UP            ! liquid/ice fraction in updraft
@@ -40,8 +40,8 @@ END INTERFACE
 !
 END MODULE MODI_COMPUTE_MF_CLOUD_BIGAUS
 !     ######spl
-      SUBROUTINE COMPUTE_MF_CLOUD_BIGAUS(KKA, KKB, KKE, KKU,KKL,&
-                                  PRC_UP, PRI_UP, PEMF, PDEPTH,&
+      SUBROUTINE COMPUTE_MF_CLOUD_BIGAUS(KKA, KKB, KKE, KKU, KKL,&
+                                  PEMF, PDEPTH,&
                                   PRT_UP, PTHV_UP, PFRAC_ICE_UP, PRSAT_UP,&
                                   PRTM, PTHM, PTHVM,&
                                   PDZZ, PZZ, PRHODREF,&
@@ -83,6 +83,7 @@ END MODULE MODI_COMPUTE_MF_CLOUD_BIGAUS
 !!    -------------
 !!      Original 25 Aug 2011
 !!      S. Riette Jan 2012: support for both order of vertical levels
+!!      S. Riette Jun 2019: remove unused PRC_UP and PRI_UP, use SIGN in ERFC computation
 !! --------------------------------------------------------------------------
 !
 !*      0. DECLARATIONS
@@ -105,7 +106,7 @@ INTEGER,                INTENT(IN)   :: KKB          ! near ground physical inde
 INTEGER,                INTENT(IN)   :: KKE          ! uppest atmosphere physical index
 INTEGER,                INTENT(IN)   :: KKU          ! uppest atmosphere array index
 INTEGER,                INTENT(IN)   :: KKL                     ! +1 if grid goes from ground to atmosphere top, -1 otherwise
-REAL, DIMENSION(:,:),   INTENT(IN)   :: PRC_UP,PRI_UP,PEMF      ! updraft characteritics
+REAL, DIMENSION(:,:),   INTENT(IN)   :: PEMF                    ! updraft characteritics
 REAL, DIMENSION(:),     INTENT(IN)   :: PDEPTH                  ! Deepness of cloud
 REAL, DIMENSION(:,:),   INTENT(IN)   :: PTHV_UP, PRSAT_UP, PRT_UP ! updraft characteritics
 REAL, DIMENSION(:,:),   INTENT(IN)   :: PFRAC_ICE_UP            ! liquid/ice fraction in updraft
@@ -125,8 +126,7 @@ REAL, DIMENSION(SIZE(PTHM,1))              :: ZOMEGA_UP_M              !
 REAL, DIMENSION(SIZE(PTHM,1),SIZE(PTHM,2)) :: ZW1 ! working array
 INTEGER                                    :: JK  ! vertical loop control
 REAL, DIMENSION(SIZE(PTHM,1),SIZE(PTHM,2)) :: ZEMF_M, ZTHV_UP_M, &   !
-                                            & ZRSAT_UP_M, ZRC_UP_M,& ! Interpolation on mass points
-                                            & ZRI_UP_M, ZRT_UP_M,&   !
+                                            & ZRSAT_UP_M, ZRT_UP_M,& ! Interpolation on mass points
                                             & ZFRAC_ICE_UP_M         !
 REAL, DIMENSION(SIZE(PTHM,1),SIZE(PTHM,2)) :: ZCOND ! condensate
 REAL, DIMENSION(SIZE(PTHM,1),SIZE(PTHM,2)) :: ZA, ZGAM ! used for integration
@@ -146,8 +146,6 @@ ZGRAD_Z_RT(:,:)=MZF_MF(KKA,KKU,KKL, ZW1(:,:))
 !Interpolation on mass points
 ZTHV_UP_M(:,:) = MZF_MF(KKA,KKU,KKL, PTHV_UP(:,:))
 ZRSAT_UP_M(:,:)= MZF_MF(KKA,KKU,KKL, PRSAT_UP(:,:))
-ZRC_UP_M(:,:)  = MZF_MF(KKA,KKU,KKL, PRC_UP(:,:))
-ZRI_UP_M(:,:)  = MZF_MF(KKA,KKU,KKL, PRI_UP(:,:))
 ZRT_UP_M(:,:)  = MZF_MF(KKA,KKU,KKL, PRT_UP(:,:))
 ZEMF_M(:,:)    = MZF_MF(KKA,KKU,KKL, PEMF(:,:))
 ZFRAC_ICE_UP_M(:,:) = MZF_MF(KKA,KKU,KKL, PFRAC_ICE_UP(:,:))
@@ -194,25 +192,8 @@ ZSIGMF(:,:)=SQRT(MAX(ABS(ZSIGMF(:,:)), 1.E-40))
 !Computation of ZA and ZGAM (=efrc(ZA)) coefficient
 ZA(:,:)=(ZRSAT_UP_M(:,:)-ZRT_UP_M(:,:))/(sqrt(2.)*ZSIGMF(:,:))
 
-!erf computed by an incomplete gamma function approximation
-!DO JK=KKA,KKU,KKL
-!  DO JI=1, SIZE(PCF_MF,1)
-!    IF(ZA(JI,JK)>1E-20) THEN
-!      ZGAM(JI,JK)=1-GAMMA_INC(0.5,ZA(JI,JK)**2)
-!    ELSEIF(ZA(JI,JK)<-1E-20) THEN
-!      ZGAM(JI,JK)=1+GAMMA_INC(0.5,ZA(JI,JK)**2)
-!    ELSE
-!      ZGAM(JI,JK)=1
-!    ENDIF
-!  ENDDO
-!ENDDO
-
-!alternative approximation of erf function (better for vectorisation)
-WHERE(ZA(:,:)>0)
-  ZGAM(:,:)=1-SQRT(1-EXP(-4*ZA(:,:)**2/XPI))
-ELSEWHERE
-  ZGAM(:,:)=1+SQRT(1-EXP(-4*ZA(:,:)**2/XPI))
-ENDWHERE
+!Approximation of erf function
+ZGAM(:,:)=1-SIGN(1., ZA(:,:))*SQRT(1-EXP(-4*ZA(:,:)**2/XPI))
 
 !computation of cloud fraction
 PCF_MF(:,:)=MAX( 0., MIN(1.,0.5*ZGAM(:,:) * ZALPHA_UP_M(:,:)))
diff --git a/src/MNH/condensation.f90 b/src/MNH/condensation.f90
index 7056f6e84..6eaafe5aa 100644
--- a/src/MNH/condensation.f90
+++ b/src/MNH/condensation.f90
@@ -8,10 +8,10 @@
 !
 INTERFACE
 !
-       SUBROUTINE CONDENSATION( KIU, KJU, KKU, KIB, KIE, KJB, KJE, KKB, KKE, KKL,         &
-          HFRAC_ICE,                                                                      &
-          PPABS, PZZ, PT, PRV, PRC, PRI, PRS, PRG, PSIGS, PMFCONV, PCLDFR, PSIGRC, OUSERI,&
-          OSIGMAS, PSIGQSAT, PLV, PLS, PCPH)
+       SUBROUTINE CONDENSATION( KIU, KJU, KKU, KIB, KIE, KJB, KJE, KKB, KKE, KKL,&
+          HFRAC_ICE, HCONDENS, HLAMBDA3, &
+          PPABS, PZZ, PRHODREF, PT, PRV, PRC, PRI, PRS, PRG, PSIGS, PMFCONV, PCLDFR, PSIGRC, OUSERI,&
+          OSIGMAS, PSIGQSAT, PLV, PLS, PCPH, PHLC_HRC, PHLC_HCF, PHLI_HRI, PHLI_HCF)
 !
 INTEGER,                      INTENT(IN)    :: KIU    ! horizontal dimension in x
 INTEGER,                      INTENT(IN)    :: KJU    ! horizontal dimension in y
@@ -23,9 +23,12 @@ INTEGER,                      INTENT(IN)    :: KJE    ! value of the last  point
 INTEGER,                      INTENT(IN)    :: KKB    ! value of the first point in z
 INTEGER,                      INTENT(IN)    :: KKE    ! value of the last  point in z
 INTEGER,                      INTENT(IN)    :: KKL    ! +1 if grid goes from ground to atmosphere top, -1 otherwise
-CHARACTER(len=1),             INTENT(IN)    :: HFRAC_ICE
+CHARACTER(len=1),                  INTENT(IN)    :: HFRAC_ICE
+CHARACTER(len=80),                 INTENT(IN)    :: HCONDENS
+CHARACTER(len=4),                  INTENT(IN)    :: HLAMBDA3 ! formulation for lambda3 coeff
 REAL, DIMENSION(KIU,KJU,KKU), INTENT(IN)    :: PPABS  ! pressure (Pa)
 REAL, DIMENSION(KIU,KJU,KKU), INTENT(IN)    :: PZZ    ! height of model levels (m)
+REAL, DIMENSION(KIU,KJU,KKU), INTENT(IN)    :: PRHODREF
 REAL, DIMENSION(KIU,KJU,KKU), INTENT(INOUT) :: PT     ! grid scale T  (K)
 REAL, DIMENSION(KIU,KJU,KKU), INTENT(INOUT) :: PRV    ! grid scale water vapor mixing ratio (kg/kg)
 LOGICAL, INTENT(IN)                         :: OUSERI ! logical switch to compute both
@@ -46,6 +49,11 @@ REAL, DIMENSION(KIU,KJU,KKU), INTENT(OUT)   :: PSIGRC ! s r_c / sig_s^2
 REAL, DIMENSION(KIU,KJU,KKU), OPTIONAL, INTENT(IN)    :: PLV
 REAL, DIMENSION(KIU,KJU,KKU), OPTIONAL, INTENT(IN)    :: PLS
 REAL, DIMENSION(KIU,KJU,KKU), OPTIONAL, INTENT(IN)    :: PCPH
+REAL, DIMENSION(KIU,KJU,KKU), OPTIONAL, INTENT(OUT)   :: PHLC_HRC   !cloud water content in precipitating part
+REAL, DIMENSION(KIU,KJU,KKU), OPTIONAL, INTENT(OUT)   :: PHLC_HCF   !precipitating part
+REAL, DIMENSION(KIU,KJU,KKU), OPTIONAL, INTENT(OUT)   :: PHLI_HRI   !
+REAL, DIMENSION(KIU,KJU,KKU), OPTIONAL, INTENT(OUT)   :: PHLI_HCF   !
+
 END SUBROUTINE CONDENSATION
 !
 END INTERFACE
@@ -53,9 +61,9 @@ END INTERFACE
 END MODULE MODI_CONDENSATION
 !     ######spl
     SUBROUTINE CONDENSATION( KIU, KJU, KKU, KIB, KIE, KJB, KJE, KKB, KKE, KKL,         &
-       HFRAC_ICE,                                                                      &
-       PPABS, PZZ, PT, PRV, PRC, PRI, PRS, PRG, PSIGS, PMFCONV, PCLDFR, PSIGRC, OUSERI,&
-       OSIGMAS, PSIGQSAT, PLV, PLS, PCPH )
+       HFRAC_ICE, HCONDENS, HLAMBDA3,                                                  &
+       PPABS, PZZ, PRHODREF, PT, PRV, PRC, PRI, PRS, PRG, PSIGS, PMFCONV, PCLDFR, PSIGRC, OUSERI,&
+       OSIGMAS, PSIGQSAT, PLV, PLS, PCPH, PHLC_HRC, PHLC_HCF, PHLI_HRI, PHLI_HCF )
 !   ################################################################################
 !
 !!
@@ -126,6 +134,7 @@ END MODULE MODI_CONDENSATION
 !
 USE MODD_CST
 USE MODD_PARAMETERS
+USE MODD_RAIN_ICE_PARAM, ONLY : XCRIAUTC, XCRIAUTI, XACRIAUTI, XBCRIAUTI
 USE MODI_COMPUTE_FRAC_ICE
 !
 IMPLICIT NONE
@@ -143,13 +152,16 @@ INTEGER,                      INTENT(IN)    :: KJE    ! value of the last  point
 INTEGER,                      INTENT(IN)    :: KKB    ! value of the first point in z
 INTEGER,                      INTENT(IN)    :: KKE    ! value of the last  point in z
 INTEGER,                      INTENT(IN)    :: KKL    ! +1 if grid goes from ground to atmosphere top, -1 otherwise
-CHARACTER(len=1),             INTENT(IN)    :: HFRAC_ICE
+CHARACTER(len=1),                  INTENT(IN)    :: HFRAC_ICE
+CHARACTER(len=80),                 INTENT(IN)    :: HCONDENS
+CHARACTER(len=4),                  INTENT(IN)    :: HLAMBDA3 ! formulation for lambda3 coeff
 REAL, DIMENSION(KIU,KJU,KKU), INTENT(IN)    :: PPABS  ! pressure (Pa)
 REAL, DIMENSION(KIU,KJU,KKU), INTENT(IN)    :: PZZ    ! height of model levels (m)
+REAL, DIMENSION(KIU,KJU,KKU), INTENT(IN)    :: PRHODREF
 REAL, DIMENSION(KIU,KJU,KKU), INTENT(INOUT) :: PT     ! grid scale T  (K)
 REAL, DIMENSION(KIU,KJU,KKU), INTENT(INOUT) :: PRV    ! grid scale water vapor mixing ratio (kg/kg)
 LOGICAL, INTENT(IN)                         :: OUSERI ! logical switch to compute both
-                                                      ! liquid and solid condensate (OUSERI=.TRUE.)
+						      ! liquid and solid condensate (OUSERI=.TRUE.)
                                                       ! or only solid condensate (OUSERI=.FALSE.)
 LOGICAL, INTENT(IN)                         :: OSIGMAS! use present global Sigma_s values
                                                       ! or that from turbulence scheme
@@ -163,9 +175,13 @@ REAL, DIMENSION(KIU,KJU,KKU), INTENT(IN)    :: PSIGS  ! Sigma_s from turbulence
 REAL, DIMENSION(:,:,:),       INTENT(IN)    :: PMFCONV! convective mass flux (kg /s m^2)
 REAL, DIMENSION(KIU,KJU,KKU), INTENT(OUT)   :: PCLDFR ! cloud fraction
 REAL, DIMENSION(KIU,KJU,KKU), INTENT(OUT)   :: PSIGRC ! s r_c / sig_s^2
-REAL, DIMENSION(KIU,KJU,KKU), OPTIONAL, INTENT(IN)    :: PLV
-REAL, DIMENSION(KIU,KJU,KKU), OPTIONAL, INTENT(IN)    :: PLS
-REAL, DIMENSION(KIU,KJU,KKU), OPTIONAL, INTENT(IN)    :: PCPH
+REAL, DIMENSION(KIU,KJU,KKU), OPTIONAL, INTENT(IN)    :: PLV    ! Latent heat L_v
+REAL, DIMENSION(KIU,KJU,KKU), OPTIONAL, INTENT(IN)    :: PLS    ! Latent heat L_s
+REAL, DIMENSION(KIU,KJU,KKU), OPTIONAL, INTENT(IN)    :: PCPH   ! Specific heat C_ph
+REAL, DIMENSION(KIU,KJU,KKU), OPTIONAL, INTENT(OUT)   :: PHLC_HRC
+REAL, DIMENSION(KIU,KJU,KKU), OPTIONAL, INTENT(OUT)   :: PHLC_HCF ! cloud fraction
+REAL, DIMENSION(KIU,KJU,KKU), OPTIONAL, INTENT(OUT)   :: PHLI_HRI
+REAL, DIMENSION(KIU,KJU,KKU), OPTIONAL, INTENT(OUT)   :: PHLI_HCF
 !
 !
 !*       0.2   Declarations of local variables :
@@ -174,13 +190,17 @@ INTEGER  :: JI, JJ, JK, JKP, JKM, IKTB, IKTE    ! loop index
 REAL, DIMENSION(KIU,KJU,KKU) :: ZTLK, ZRT       ! work arrays for T_l and total water mixing ratio
 REAL, DIMENSION(KIU,KJU,KKU) :: ZL              ! length scale
 REAL, DIMENSION(KIU,KJU,KKU) :: ZFRAC           ! Ice fraction
-INTEGER, DIMENSION(KIU,KJU)  :: ITPL            ! top levels of troposphere
+REAL, DIMENSION(KIU,KJU,KKU) :: ZCRIAUTI        !
+INTEGER, DIMENSION(KIU,KJU)  :: ITPL            ! top levels of troposphere 
 REAL,    DIMENSION(KIU,KJU)  :: ZTMIN           ! minimum Temp. related to ITPL
 !
 REAL, DIMENSION(KIU,KJU,KKU) :: ZLV, ZLS, ZCPD
-REAL :: ZTEMP, ZPV, ZQSL, ZPIV, ZQSI, ZCOND, ZLVS ! thermodynamics
-REAL :: ZLL, DZZ, ZZZ                           ! used for length scales
-REAL :: ZAH, ZA, ZB, ZSBAR, ZQ1, ZSIGMA, ZDRW, ZDTL, ZSIG_CONV ! related to computation of Sig_s
+REAL, DIMENSION(KIU,KJU,KKU) :: ZCOND
+REAL :: ZGCOND, ZSBAR, ZSBARC, ZQ1, ZAUTC, ZAUTI, ZGAUV, ZGAUC, ZGAUI, ZGAUTC, ZGAUTI   ! Used for integration in Gaussian Probability Density Function
+REAL :: ZTEMP, ZPV, ZQSL, ZPIV, ZQSI, ZLVS ! thermodynamics
+REAL :: ZLL, DZZ, ZZZ                           ! used for length scales 
+REAL :: ZAH, ZA, ZB, ZSIGMA, ZDRW, ZDTL, ZSIG_CONV ! related to computation of Sig_s
+REAL :: ZRCOLD, ZRIOLD
 INTEGER  :: INQ1
 REAL :: ZINC
 !
@@ -367,35 +387,105 @@ DO JK=IKTB,IKTE
       ! normalized saturation deficit
       ZQ1   = ZSBAR/ZSIGMA
 
-      ! cloud fraction
-      PCLDFR(JI,JJ,JK) = MAX( 0., MIN(1.,0.5+0.36*ATAN(1.55*ZQ1)) )
+      IF(HCONDENS == 'GAUS')THEN
+        ! Gaussian Probability Density Function around ZQ1
+        ! Computation of ZG and ZGAM(=erf(ZG))
+        ZGCOND = -ZQ1/SQRT(2.)
 
-      ! total condensate
-      IF (ZQ1 > 0. .AND. ZQ1 <= 2 ) THEN
-        ZCOND = MIN(EXP(-1.)+.66*ZQ1+.086*ZQ1**2, 2.) ! We use the MIN function for continuity
-      ELSE IF (ZQ1 > 2.) THEN
-        ZCOND = ZQ1
-      ELSE
-        ZCOND = EXP( 1.2*ZQ1-1. )
+        !Approximation of erf function for Gaussian distribution
+        ZGAUV = 1 - SIGN(1., ZGCOND) * SQRT(1-EXP(-4*ZGCOND**2/XPI))
+
+        !Computation Cloud Fraction
+        PCLDFR(JI,JJ,JK) = MAX( 0., MIN(1.,0.5*ZGAUV))
+
+        !Computation of condensate
+        ZCOND(JI,JJ,JK) = (EXP(-ZGCOND**2)-ZGCOND*SQRT(XPI)*ZGAUV)*ZSIGMA/SQRT(2.*XPI)
+        ZCOND(JI,JJ,JK) = MAX(ZCOND(JI,JJ,JK), 0.)
+
+        PSIGRC(JI,JJ,JK) = PCLDFR(JI,JJ,JK)
+
+        !Computation warm/cold Cloud Fraction and content in high water content part
+        IF(PRESENT(PHLC_HCF) .AND. PRESENT(PHLC_HRC))THEN
+          IF(1-ZFRAC(JI,JJ,JK) > 1.E-20)THEN
+            ZAUTC = (ZSBAR - XCRIAUTC/(PRHODREF(JI,JJ,JK)*(1-ZFRAC(JI,JJ,JK))))/ZSIGMA
+            ZGAUTC = -ZAUTC/SQRT(2.)
+            !Approximation of erf function for Gaussian distribution
+            ZGAUC = 1 - SIGN(1., ZGAUTC) * SQRT(1-EXP(-4*ZGAUTC**2/XPI))
+            PHLC_HCF(JI,JJ,JK) = MAX( 0., MIN(1.,0.5*ZGAUC))
+            PHLC_HRC(JI,JJ,JK) = (1-ZFRAC(JI,JJ,JK))*(EXP(-ZGAUTC**2)-ZGAUTC*SQRT(XPI)*ZGAUC)*ZSIGMA/SQRT(2.*XPI)
+            PHLC_HRC(JI,JJ,JK) = PHLC_HRC(JI,JJ,JK) + XCRIAUTC/PRHODREF(JI,JJ,JK) * PHLC_HCF(JI,JJ,JK)
+            PHLC_HRC(JI,JJ,JK) = MAX(PHLC_HRC(JI,JJ,JK), 0.)
+          ELSE
+            PHLC_HCF(JI,JJ,JK)=0.
+            PHLC_HRC(JI,JJ,JK)=0.
+          ENDIF
+        ENDIF
+
+        IF(PRESENT(PHLI_HCF) .AND. PRESENT(PHLI_HRI))THEN
+          IF(ZFRAC(JI,JJ,JK) > 1.E-20)THEN
+            ZCRIAUTI(JI,JJ,JK)=MIN(XCRIAUTI,10**(XACRIAUTI*(PT(JI,JJ,JK)-XTT)+XBCRIAUTI))
+            ZAUTI = (ZSBAR - ZCRIAUTI(JI,JJ,JK)/ZFRAC(JI,JJ,JK))/ZSIGMA
+            ZGAUTI = -ZAUTI/SQRT(2.)
+            !Approximation of erf function for Gaussian distribution
+            ZGAUI = 1 - SIGN(1., ZGAUTI) * SQRT(1-EXP(-4*ZGAUTI**2/XPI))
+            PHLI_HCF(JI,JJ,JK) = MAX( 0., MIN(1.,0.5*ZGAUI))
+            PHLI_HRI(JI,JJ,JK) = ZFRAC(JI,JJ,JK)*(EXP(-ZGAUTI**2)-ZGAUTI*SQRT(XPI)*ZGAUI)*ZSIGMA/SQRT(2.*XPI)
+            PHLI_HRI(JI,JJ,JK) = PHLI_HRI(JI,JJ,JK) + ZCRIAUTI(JI,JJ,JK)*PHLI_HCF(JI,JJ,JK)
+            PHLI_HRI(JI,JJ,JK) = MAX(PHLI_HRI(JI,JJ,JK), 0.)
+          ELSE
+            PHLI_HCF(JI,JJ,JK)=0.
+            PHLI_HRI(JI,JJ,JK)=0.
+          ENDIF
+        ENDIF
+
+      ELSEIF(HCONDENS == 'CB02')THEN
+        !Cloud fraction
+        PCLDFR(JI,JJ,JK) = MAX( 0., MIN(1.,0.5+0.36*ATAN(1.55*ZQ1)) )
+
+        !Total condensate
+        IF (ZQ1 > 0. .AND. ZQ1 <= 2) THEN
+                ZCOND(JI,JJ,JK) = MIN(EXP(-1.)+.66*ZQ1+.086*ZQ1**2, 2.) ! We use the MIN function for continuity
+        ELSE IF (ZQ1 > 2.) THEN
+                ZCOND(JI,JJ,JK) = ZQ1
+        ELSE
+                ZCOND(JI,JJ,JK) = EXP( 1.2*ZQ1-1. )
+        ENDIF
+        ZCOND(JI,JJ,JK) = ZCOND(JI,JJ,JK) * ZSIGMA
+
+        INQ1 = MIN( MAX(-22,FLOOR(MIN(100., MAX(-100., 2*ZQ1))) ), 10)  !inner min/max prevents sigfpe when 2*zq1 does not fit into an int
+        ZINC = 2.*ZQ1 - INQ1
+
+        PSIGRC(JI,JJ,JK) =  MIN(1.,(1.-ZINC)*ZSRC_1D(INQ1)+ZINC*ZSRC_1D(INQ1+1))
+
+        IF(PRESENT(PHLC_HCF) .AND. PRESENT(PHLC_HRC))THEN
+          PHLC_HCF(JI,JJ,JK)=0.
+          PHLC_HRC(JI,JJ,JK)=0.
+        ENDIF
+        IF(PRESENT(PHLI_HCF) .AND. PRESENT(PHLI_HRI))THEN
+          PHLI_HCF(JI,JJ,JK)=0.
+          PHLI_HRI(JI,JJ,JK)=0.
+        ENDIF
       ENDIF
-      ZCOND = ZCOND * ZSIGMA
 
-      IF ( ZCOND < 1.E-12 ) THEN
-        ZCOND = 0.
+      IF ( ZCOND(JI,JJ,JK) < 1.E-12 ) THEN
+        ZCOND(JI,JJ,JK) = 0.
         PCLDFR(JI,JJ,JK) = 0.
       ENDIF
       IF (PCLDFR(JI,JJ,JK)==0.) THEN
-        ZCOND=0.
+        ZCOND(JI,JJ,JK)=0.
       ENDIF
 
-      PT(JI,JJ,JK) = PT(JI,JJ,JK) + (((1.-ZFRAC(JI,JJ,JK))*ZCOND-PRC(JI,JJ,JK))*ZLV(JI,JJ,JK) + &
-                                    &(ZFRAC(JI,JJ,JK)     *ZCOND-PRI(JI,JJ,JK))*ZLS(JI,JJ,JK)   ) &
+      ZRCOLD=PRC(JI,JJ,JK)
+      ZRIOLD=PRI(JI,JJ,JK)
+
+      PRC(JI,JJ,JK) = (1.-ZFRAC(JI,JJ,JK)) * ZCOND(JI,JJ,JK) ! liquid condensate
+      PRI(JI,JJ,JK) = ZFRAC(JI,JJ,JK) * ZCOND(JI,JJ,JK)   ! solid condensate
+      
+      PT(JI,JJ,JK) = PT(JI,JJ,JK) + ((PRC(JI,JJ,JK)-ZRCOLD)*ZLV(JI,JJ,JK) + &
+                                    &(PRI(JI,JJ,JK)-ZRIOLD)*ZLS(JI,JJ,JK)   ) &
                                   & /ZCPD(JI,JJ,JK)
-      PRC(JI,JJ,JK) = (1.-ZFRAC(JI,JJ,JK)) * ZCOND ! liquid condensate
-      PRI(JI,JJ,JK) = ZFRAC(JI,JJ,JK) * ZCOND   ! solid condensate
       PRV(JI,JJ,JK) = ZRT(JI,JJ,JK) - PRC(JI,JJ,JK) - PRI(JI,JJ,JK)
 
-
 ! s r_c/ sig_s^2
 !    PSIGRC(JI,JJ,JK) = PCLDFR(JI,JJ,JK)  ! use simple Gaussian relation
 !
@@ -403,15 +493,17 @@ DO JK=IKTB,IKTE
 !
 !      PSIGRC(JI,JJ,JK) = 2.*PCLDFR(JI,JJ,JK) * MIN( 3. , MAX(1.,1.-ZQ1) )
 ! in the 3D case lambda_3 = 1.
-!     INQ1 = MIN( MAX(-22,FLOOR(2*ZQ1) ), 10)
-      INQ1 = MIN( MAX(-22,FLOOR(MIN(100.,MAX(-100.,2*ZQ1))) ), 10)
-      !inner min/max prevent sigfpe when 2*zq1 does not fit into an int
-      ZINC = 2.*ZQ1 - INQ1
-
-      PSIGRC(JI,JJ,JK) =  MIN(1.,(1.-ZINC)*ZSRC_1D(INQ1)+ZINC*ZSRC_1D(INQ1+1))
-
-      PSIGRC(JI,JJ,JK) = PSIGRC(JI,JJ,JK)* MIN( 3. , MAX(1.,1.-ZQ1) )
 
+      IF(HLAMBDA3=='CB')THEN
+          PSIGRC(JI,JJ,JK) = PSIGRC(JI,JJ,JK)* MIN( 3. , MAX(1.,1.-ZQ1) )
+      ELSEIF(HLAMBDA3=='NONE') THEN
+      ELSE
+        WRITE(*,*) ' STOP'
+        WRITE(*,*) ' INVALID VALUE FOR HLAMBDA3:', HLAMBDA3
+        CALL ABORT
+        STOP
+      ENDIF
+      
     END DO
   END DO
 END DO
diff --git a/src/MNH/deallocate_model1.f90 b/src/MNH/deallocate_model1.f90
index 113521daf..3de1fbb81 100644
--- a/src/MNH/deallocate_model1.f90
+++ b/src/MNH/deallocate_model1.f90
@@ -68,6 +68,7 @@ END MODULE MODI_DEALLOCATE_MODEL1
 !!  Philippe Wautelet: 05/2016-04/2018: new data structures and calls for I/O
 !!                   02/2019 C.Lac add rain fraction as an output field
 !  P. Wautelet 07/06/2019: bugfix: deallocate XLSRVM only if allocated
+!                    04/2020 S. Riette, XHL* fields
 !-------------------------------------------------------------------------------
 !
 !*       0.    DECLARATIONS
@@ -185,6 +186,13 @@ IF ( ASSOCIATED(XSRCT) .AND. KCALL==3 ) THEN
   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   
diff --git a/src/MNH/default_desfmn.f90 b/src/MNH/default_desfmn.f90
index 6dd86e70f..67fcde53e 100644
--- a/src/MNH/default_desfmn.f90
+++ b/src/MNH/default_desfmn.f90
@@ -208,6 +208,8 @@ END MODULE MODI_DEFAULT_DESFM_n
 !!                   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
+!  P-A Joulin  21/05/2021: add Wind turbines
+!  S. Riette   21/05/2021: add options to PDF subgrid scheme
 !
 !-------------------------------------------------------------------------------
 !
@@ -515,11 +517,15 @@ LTURB_FLX =.FALSE.
 LTURB_DIAG=.FALSE.
 LSUBG_COND=.FALSE.
 CSUBG_AUCV='NONE' 
+CSUBG_AUCV_RI='NONE'
 LSIGMAS   =.TRUE.
 LSIG_CONV =.FALSE.
 LRMC01    =.FALSE.
 CTOM      ='NONE'
 VSIGQSAT  = 0.02
+CCONDENS='CB02'
+CLAMBDA3='CB'
+CSUBG_MF_PDF='TRIANGLE'
 !-------------------------------------------------------------------------------
 !
 !*      10b.   SET DEFAULT VALUES FOR MODD_DRAGTREE :
diff --git a/src/MNH/ice4_compute_pdf.f90 b/src/MNH/ice4_compute_pdf.f90
index dc6a40759..a6fa358a8 100644
--- a/src/MNH/ice4_compute_pdf.f90
+++ b/src/MNH/ice4_compute_pdf.f90
@@ -4,16 +4,20 @@
 !MNH_LIC for details. version 1.
 MODULE MODI_ICE4_COMPUTE_PDF
 INTERFACE
-SUBROUTINE ICE4_COMPUTE_PDF(KSIZE, HSUBG_AUCV, HSUBG_PR_PDF, &
-                            PRHODREF, PRCT, PCF, PSIGMA_RC,&
-                            PHLC_HCF, PHLC_LCF, PHLC_HRC, PHLC_LRC, PRF)
+SUBROUTINE ICE4_COMPUTE_PDF(KSIZE, HSUBG_AUCV_RC, HSUBG_AUCV_RI, HSUBG_PR_PDF, &
+                            PRHODREF, PRCT, PRIT, PCF, PT, PSIGMA_RC,&
+                            PHLC_HCF, PHLC_LCF, PHLC_HRC, PHLC_LRC, &
+                            PHLI_HCF, PHLI_LCF, PHLI_HRI, PHLI_LRI, PRF)
 IMPLICIT NONE
 INTEGER,                INTENT(IN)  :: KSIZE
-CHARACTER(LEN=4),       INTENT(IN)  :: HSUBG_AUCV     ! Kind of Subgrid autoconversion method
+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
 CHARACTER(LEN=80),      INTENT(IN)  :: HSUBG_PR_PDF   ! pdf for subgrid precipitation
 REAL, DIMENSION(KSIZE), INTENT(IN)  :: PRHODREF   ! Reference density
 REAL, DIMENSION(KSIZE), INTENT(IN)  :: PRCT       ! Cloud water m.r. at t
+REAL, DIMENSION(KSIZE), INTENT(IN)  :: PRIT       ! Ice Crystal m.r. at t
 REAL, DIMENSION(KSIZE), INTENT(IN)  :: PCF        ! Cloud fraction
+REAL, DIMENSION(KSIZE), INTENT(IN)  :: PT         ! Temperature
 REAL, DIMENSION(KSIZE), INTENT(IN)  :: PSIGMA_RC  ! Standard deviation of rc at time t
 REAL, DIMENSION(KSIZE), INTENT(OUT) :: PHLC_HCF   ! HLCLOUDS : fraction of High Cloud Fraction in grid
 REAL, DIMENSION(KSIZE), INTENT(OUT) :: PHLC_LCF   ! HLCLOUDS : fraction of Low  Cloud Fraction in grid
@@ -21,13 +25,18 @@ REAL, DIMENSION(KSIZE), INTENT(OUT) :: PHLC_LCF   ! HLCLOUDS : fraction of Low
 REAL, DIMENSION(KSIZE), INTENT(OUT) :: PHLC_HRC   ! HLCLOUDS : LWC that is High LWC in grid
 REAL, DIMENSION(KSIZE), INTENT(OUT) :: PHLC_LRC   ! HLCLOUDS : LWC that is Low  LWC in grid
                                                   !    note that PRC = PHLC_HRC + PHLC_LRC
+REAL, DIMENSION(KSIZE), INTENT(OUT) :: PHLI_HCF   !
+REAL, DIMENSION(KSIZE), INTENT(OUT) :: PHLI_LCF
+REAL, DIMENSION(KSIZE), INTENT(OUT) :: PHLI_HRI   !
+REAL, DIMENSION(KSIZE), INTENT(OUT) :: PHLI_LRI   !
 REAL, DIMENSION(KSIZE), INTENT(OUT) :: PRF        ! Rain fraction
 END SUBROUTINE ICE4_COMPUTE_PDF
 END INTERFACE
 END MODULE MODI_ICE4_COMPUTE_PDF
-SUBROUTINE ICE4_COMPUTE_PDF(KSIZE, HSUBG_AUCV, HSUBG_PR_PDF, &
-                            PRHODREF, PRCT, PCF, PSIGMA_RC,&
-                            PHLC_HCF, PHLC_LCF, PHLC_HRC, PHLC_LRC, PRF)
+SUBROUTINE ICE4_COMPUTE_PDF(KSIZE, HSUBG_AUCV_RC, HSUBG_AUCV_RI, HSUBG_PR_PDF, &
+                            PRHODREF, PRCT, PRIT, PCF, PT, PSIGMA_RC,&
+                            PHLC_HCF, PHLC_LCF, PHLC_HRC, PHLC_LRC, &
+                            PHLI_HCF, PHLI_LCF, PHLI_HRI, PHLI_LRI, PRF)
 !!
 !!**  PURPOSE
 !!    -------
@@ -47,7 +56,8 @@ SUBROUTINE ICE4_COMPUTE_PDF(KSIZE, HSUBG_AUCV, HSUBG_PR_PDF, &
 !
 !
 USE MODD_RAIN_ICE_DESCR, ONLY: XRTMIN
-USE MODD_RAIN_ICE_PARAM, ONLY: XCRIAUTC
+USE MODD_RAIN_ICE_PARAM, ONLY: XCRIAUTC,XBCRIAUTI,XACRIAUTI,XCRIAUTI
+USE MODD_CST, ONLY : XTT
 !
 USE MODE_MSG
 !
@@ -56,11 +66,14 @@ IMPLICIT NONE
 !*       0.1   Declarations of dummy arguments :
 !
 INTEGER,                INTENT(IN)  :: KSIZE
-CHARACTER(LEN=4),       INTENT(IN)  :: HSUBG_AUCV     ! Kind of Subgrid autoconversion method
+CHARACTER(LEN=4),       INTENT(IN)  :: HSUBG_AUCV_RC     ! Kind of Subgrid autoconversion method for cloud water
+CHARACTER(LEN=80),      INTENT(IN)  :: HSUBG_AUCV_RI     ! Kind of Subgrid autoconversion method for cloud water
 CHARACTER(LEN=80),      INTENT(IN)  :: HSUBG_PR_PDF   ! pdf for subgrid precipitation
 REAL, DIMENSION(KSIZE), INTENT(IN)  :: PRHODREF   ! Reference density
 REAL, DIMENSION(KSIZE), INTENT(IN)  :: PRCT       ! Cloud water m.r. at t
+REAL, DIMENSION(KSIZE), INTENT(IN)  :: PRIT       ! Ice Crystal m.r. at t
 REAL, DIMENSION(KSIZE), INTENT(IN)  :: PCF        ! Cloud fraction
+REAL, DIMENSION(KSIZE), INTENT(IN)  :: PT         ! Temperature
 REAL, DIMENSION(KSIZE), INTENT(IN)  :: PSIGMA_RC  ! Standard deviation of rc at time t
 REAL, DIMENSION(KSIZE), INTENT(OUT) :: PHLC_HCF   ! HLCLOUDS : fraction of High Cloud Fraction in grid
 REAL, DIMENSION(KSIZE), INTENT(OUT) :: PHLC_LCF   ! HLCLOUDS : fraction of Low  Cloud Fraction in grid
@@ -68,72 +81,74 @@ REAL, DIMENSION(KSIZE), INTENT(OUT) :: PHLC_LCF   ! HLCLOUDS : fraction of Low
 REAL, DIMENSION(KSIZE), INTENT(OUT) :: PHLC_HRC   ! HLCLOUDS : LWC that is High LWC in grid
 REAL, DIMENSION(KSIZE), INTENT(OUT) :: PHLC_LRC   ! HLCLOUDS : LWC that is Low  LWC in grid
                                                   !    note that PRC = PHLC_HRC + PHLC_LRC
+REAL, DIMENSION(KSIZE), INTENT(OUT) :: PHLI_HCF
+REAL, DIMENSION(KSIZE), INTENT(OUT) :: PHLI_LCF
+REAL, DIMENSION(KSIZE), INTENT(OUT) :: PHLI_HRI  
+REAL, DIMENSION(KSIZE), INTENT(OUT) :: PHLI_LRI  
 REAL, DIMENSION(KSIZE), INTENT(OUT) :: PRF        ! Rain fraction
 !
 !*       0.2  declaration of local variables
 !
-REAL, DIMENSION(SIZE(PRHODREF)) :: ZRCRAUTC,      & !RC value to begin rain formation =XCRIAUTC/RHODREF
-                                   ZHLC_RCMAX,    & !HLCLOUDS : maximum value for RC in distribution
-                                   ZHLC_LRCLOCAL, & !HLCLOUDS : LWC that is Low  LWC local in LCF
-                                   ZHLC_HRCLOCAL    !HLCLOUDS : LWC that is High LWC local in HCF
+REAL, DIMENSION(KSIZE) :: ZRCRAUTC,      & !RC value to begin rain formation =XCRIAUTC/RHODREF
+                          ZCRIAUTI,      & !RI value to begin snow formation
+                          ZHLC_RCMAX,    & !HLCLOUDS : maximum value for RC in distribution
+                          ZHLC_LRCLOCAL, & !HLCLOUDS : LWC that is Low  LWC local in LCF
+                          ZHLC_HRCLOCAL, & !HLCLOUDS : LWC that is High LWC local in HCF
                                                     !    note that ZRC/CF = ZHLC_HRCLOCAL+ ZHLC_LRCLOCAL
                                                     !                     = PHLC_HRC/HCF+ PHLC_LRC/LCF
+                          ZSUMRC, ZSUMRI                          
 REAL :: ZCOEFFRCM
 !-------------------------------------------------------------------------------
 !
 !Cloud water split between high and low content part is done according to autoconversion option
 ZRCRAUTC(:)=XCRIAUTC/PRHODREF(:) ! Autoconversion rc threshold
-IF(HSUBG_AUCV=='NONE') THEN
+IF(HSUBG_AUCV_RC=='NONE') THEN
   !Cloud water is entirely in low or high part
   WHERE(PRCT(:)>ZRCRAUTC(:))
     PHLC_HCF(:)=1.
     PHLC_LCF(:)=0.
     PHLC_HRC(:)=PRCT(:)
     PHLC_LRC(:)=0.
-    PRF(:)     =1.
   ELSEWHERE(PRCT(:)>XRTMIN(2))
     PHLC_HCF(:)=0.
     PHLC_LCF(:)=1.
     PHLC_HRC(:)=0.
     PHLC_LRC(:)=PRCT(:)
-    PRF(:)     =0.
   ELSEWHERE
     PHLC_HCF(:)=0.
     PHLC_LCF(:)=0.
     PHLC_HRC(:)=0.
     PHLC_LRC(:)=0.
-    PRF(:)     =0.
   END WHERE
 
-ELSEIF(HSUBG_AUCV=='CLFR') THEN
+ELSEIF(HSUBG_AUCV_RC=='CLFR') THEN
   !Cloud water is only in the cloudy part and entirely in low or high part
-  WHERE(PCF(:) > 0. .AND. PRCT(:)>ZRCRAUTC(:)*PCF(:))
+  WHERE(PCF(:)>0. .AND. PRCT(:)>ZRCRAUTC(:)*PCF(:))
     PHLC_HCF(:)=PCF(:)
     PHLC_LCF(:)=0.
     PHLC_HRC(:)=PRCT(:)
     PHLC_LRC(:)=0.
-    PRF(:)     =PCF(:)
-  ELSEWHERE(PCF(:) > 0. .AND. PRCT(:)>XRTMIN(2))
+  ELSEWHERE(PCF(:)>0. .AND. PRCT(:)>XRTMIN(2))
     PHLC_HCF(:)=0.
     PHLC_LCF(:)=PCF(:)
     PHLC_HRC(:)=0.0
     PHLC_LRC(:)=PRCT(:)
-    PRF(:)     =0.
-  ELSEWHERE (PCF(:) > 0.)
-    PHLC_HCF(:)=0.
-    PHLC_LCF(:)=0.
-    PHLC_HRC(:)=0.
-    PHLC_LRC(:)=0.
-    PRF(:)     =0.
   ELSEWHERE
     PHLC_HCF(:)=0.
     PHLC_LCF(:)=0.
     PHLC_HRC(:)=0.
     PHLC_LRC(:)=0.
-    PRF(:)     =0.
   END WHERE
-
-ELSEIF(HSUBG_AUCV=='PDF ') THEN
+ELSEIF(HSUBG_AUCV_RC=='ADJU') THEN
+  ZSUMRC(:)=PHLC_LRC(:)+PHLC_HRC(:)
+  WHERE(ZSUMRC .GT. 0.)
+    PHLC_LRC(:)=PHLC_LRC(:)*PRCT(:)/ZSUMRC(:)
+    PHLC_HRC(:)=PHLC_HRC(:)*PRCT(:)/ZSUMRC(:)
+  ELSEWHERE
+    PHLC_LRC(:)=0.
+    PHLC_HRC(:)=0.
+  ENDWHERE 
+ELSEIF(HSUBG_AUCV_RC=='PDF ') THEN
   !Cloud water is split between high and low part according to a PDF
   !    'HLCRECTPDF'    : rectangular PDF form
   !    'HLCTRIANGPDF'  : triangular PDF form
@@ -147,7 +162,6 @@ ELSEIF(HSUBG_AUCV=='PDF ') THEN
       PHLC_LCF(:)=0.
       PHLC_HRC(:)=PRCT(:)
       PHLC_LRC(:)=0.
-      PRF(:)     =1.
     ELSEWHERE(PRCT(:)> (ZRCRAUTC(:)-PSIGMA_RC(:)) .AND. &
             & PRCT(:)<=(ZRCRAUTC(:)+PSIGMA_RC(:))       )
       PHLC_HCF(:)=(PRCT(:)+PSIGMA_RC(:)-ZRCRAUTC(:))/ &
@@ -157,19 +171,16 @@ ELSEIF(HSUBG_AUCV=='PDF ') THEN
                   &(PRCT(:)+PSIGMA_RC(:)+ZRCRAUTC(:))/ &
                   &(4.*PSIGMA_RC(:))
       PHLC_LRC(:)=MAX(0., PRCT(:)-PHLC_HRC(:))
-      PRF(:)     =PHLC_HCF(:)
     ELSEWHERE(PRCT(:)>XRTMIN(2) .AND. PCF(:)>0.)
       PHLC_HCF(:)=0.
       PHLC_LCF(:)=PCF(:)
       PHLC_HRC(:)=0.
       PHLC_LRC(:)=PRCT(:)
-      PRF(:)     =0.
     ELSEWHERE
       PHLC_HCF(:)=0.
       PHLC_LCF(:)=0.
       PHLC_HRC(:)=0.
       PHLC_LRC(:)=0.
-      PRF(:)     =0.
     END WHERE
    ! Turner (2011, 2012)
   ELSEIF(HSUBG_PR_PDF=='HLCRECTPDF' .OR. HSUBG_PR_PDF=='HLCISOTRIPDF' .OR. &
@@ -248,7 +259,6 @@ ELSEIF(HSUBG_AUCV=='PDF ') THEN
       PHLC_LRC(:)=0.
       PHLC_HRC(:)=0.
     END WHERE
-     PRF(:)=PHLC_HCF(:) !Precipitation fraction
    ELSE
      CALL PRINT_MSG(NVERB_FATAL,'GEN','ICE4_COMPUTE_PDF','wrong HSUBG_PR_PDF case')
    ENDIF
@@ -256,4 +266,59 @@ ELSE
   CALL PRINT_MSG(NVERB_FATAL,'GEN','ICE4_COMPUTE_PDF','wrong HSUBG_AUCV case')
 ENDIF
 !
+!Ice water split between high and low content part is done according to autoconversion option
+ZCRIAUTI(:)=MIN(XCRIAUTI,10**(XACRIAUTI*(PT(:)-XTT)+XBCRIAUTI)) ! Autoconversion ri threshold
+IF(HSUBG_AUCV_RI=='NONE') THEN
+  !Cloud water is entirely in low or high part
+  WHERE(PRIT(:)>ZCRIAUTI(:))
+    PHLI_HCF(:)=1.
+    PHLI_LCF(:)=0.
+    PHLI_HRI(:)=PRIT(:)
+    PHLI_LRI(:)=0.
+  ELSEWHERE(PRIT(:)>XRTMIN(2))
+    PHLI_HCF(:)=0.
+    PHLI_LCF(:)=1.
+    PHLI_HRI(:)=0.
+    PHLI_LRI(:)=PRIT(:)
+  ELSEWHERE
+    PHLI_HCF(:)=0.
+    PHLI_LCF(:)=0.
+    PHLI_HRI(:)=0.
+    PHLI_LRI(:)=0.
+  END WHERE
+ELSEIF(HSUBG_AUCV_RI=='CLFR') THEN
+  !Cloud water is only in the cloudy part and entirely in low or high part
+  WHERE(PCF(:)>0. .AND. PRIT(:)>ZCRIAUTI(:)*PCF(:))
+    PHLI_HCF(:)=PCF(:)
+    PHLI_LCF(:)=0.
+    PHLI_HRI(:)=PRIT(:)
+    PHLI_LRI(:)=0.
+  ELSEWHERE(PCF(:)>0. .AND. PRIT(:)>XRTMIN(2))
+    PHLI_HCF(:)=0.
+    PHLI_LCF(:)=PCF(:)
+    PHLI_HRI(:)=0.0
+    PHLI_LRI(:)=PRIT(:)
+  ELSEWHERE
+    PHLI_HCF(:)=0.
+    PHLI_LCF(:)=0.
+    PHLI_HRI(:)=0.
+    PHLI_LRI(:)=0.
+  END WHERE
+ELSEIF(HSUBG_AUCV_RI=='ADJU') THEN
+  ZSUMRI(:)=PHLI_LRI(:)+PHLI_HRI(:)
+  WHERE(ZSUMRI .GT. 0.)
+    PHLI_LRI(:)=PHLI_LRI(:)*PRIT(:)/ZSUMRI(:)
+    PHLI_HRI(:)=PHLI_HRI(:)*PRIT(:)/ZSUMRI(:)
+  ELSEWHERE
+    PHLI_LRI(:)=0.
+    PHLI_HRI(:)=0.
+  ENDWHERE
+ELSE
+  !wrong HSUBG_AUCV_RI case
+  CALL ABORT
+  STOP 'wrong HSUBG_AUCV_RI case'
+ENDIF
+!
+PRF=MAX(PHLC_HCF,PHLI_HCF)
+!
 END SUBROUTINE ICE4_COMPUTE_PDF
diff --git a/src/MNH/ice4_fast_rg.f90 b/src/MNH/ice4_fast_rg.f90
index 8a52f858e..053daf601 100644
--- a/src/MNH/ice4_fast_rg.f90
+++ b/src/MNH/ice4_fast_rg.f90
@@ -5,13 +5,13 @@
 !-----------------------------------------------------------------
 MODULE MODI_ICE4_FAST_RG
 INTERFACE
-SUBROUTINE ICE4_FAST_RG(KSIZE, LDSOFT, LDCOMPUTE, KRR, &
+SUBROUTINE ICE4_FAST_RG(KSIZE, LDSOFT, PCOMPUTE, KRR, &
                        &PRHODREF, PLVFACT, PLSFACT, PPRES, &
                        &PDV, PKA, PCJ, PCIT, &
                        &PLBDAR, PLBDAS, PLBDAG, &
                        &PT,  PRVT, PRCT, PRRT, PRIT, PRST, PRGT, &
                        &PRGSI, PRGSI_MR, &
-                       &LDWETG, &
+                       &PWETG, &
                        &PRICFRRG, PRRCFRIG, PRICFRR, PRCWETG, PRIWETG, PRRWETG, PRSWETG, &
                        &PRCDRYG, PRIDRYG, PRRDRYG, PRSDRYG, PRWETGH, PRWETGH_MR, PRGMLTR, &
                        &PRG_TEND, &
@@ -19,7 +19,7 @@ SUBROUTINE ICE4_FAST_RG(KSIZE, LDSOFT, LDCOMPUTE, KRR, &
 IMPLICIT NONE
 INTEGER,                      INTENT(IN)    :: KSIZE
 LOGICAL,                      INTENT(IN)    :: LDSOFT
-LOGICAL, DIMENSION(KSIZE),    INTENT(IN)    :: LDCOMPUTE
+REAL, DIMENSION(KSIZE),       INTENT(IN)    :: PCOMPUTE
 INTEGER,                      INTENT(IN)    :: KRR      ! Number of moist variable
 REAL, DIMENSION(KSIZE),       INTENT(IN)    :: PRHODREF ! Reference density
 REAL, DIMENSION(KSIZE),       INTENT(IN)    :: PLVFACT
@@ -41,7 +41,7 @@ REAL, DIMENSION(KSIZE),       INTENT(IN)    :: PRST     ! Snow/aggregate m.r. at
 REAL, DIMENSION(KSIZE),       INTENT(IN)    :: PRGT     ! Graupel m.r. at t
 REAL, DIMENSION(KSIZE),       INTENT(IN)    :: PRGSI    ! Graupel tendency by other processes
 REAL, DIMENSION(KSIZE),       INTENT(IN)    :: PRGSI_MR ! Graupel mr change by other processes
-LOGICAL, DIMENSION(KSIZE),    INTENT(OUT)   :: LDWETG   ! True where graupel grows in wet mode
+REAL, DIMENSION(KSIZE),       INTENT(OUT)   :: PWETG    ! 1. where graupel grows in wet mode, 0. elsewhere
 REAL, DIMENSION(KSIZE),       INTENT(INOUT) :: PRICFRRG ! Rain contact freezing
 REAL, DIMENSION(KSIZE),       INTENT(INOUT) :: PRRCFRIG ! Rain contact freezing
 REAL, DIMENSION(KSIZE),       INTENT(INOUT) :: PRICFRR  ! Rain contact freezing
@@ -56,7 +56,7 @@ REAL, DIMENSION(KSIZE),       INTENT(OUT)   :: PRSDRYG  ! Graupel dry growth
 REAL, DIMENSION(KSIZE),       INTENT(OUT)   :: PRWETGH  ! Conversion of graupel into hail
 REAL, DIMENSION(KSIZE),       INTENT(OUT)   :: PRWETGH_MR ! Conversion of graupel into hail, mr change
 REAL, DIMENSION(KSIZE),       INTENT(INOUT) :: PRGMLTR  ! Melting of the graupel
-REAL, DIMENSION(KSIZE, 6),    INTENT(INOUT) :: PRG_TEND ! Individual tendencies
+REAL, DIMENSION(KSIZE, 8),    INTENT(INOUT) :: PRG_TEND ! Individual tendencies
 REAL, DIMENSION(KSIZE),       INTENT(INOUT) :: PA_TH
 REAL, DIMENSION(KSIZE),       INTENT(INOUT) :: PA_RC
 REAL, DIMENSION(KSIZE),       INTENT(INOUT) :: PA_RR
@@ -69,13 +69,13 @@ REAL, DIMENSION(KSIZE),       INTENT(INOUT) :: PB_RH
 END SUBROUTINE ICE4_FAST_RG
 END INTERFACE
 END MODULE MODI_ICE4_FAST_RG
-SUBROUTINE ICE4_FAST_RG(KSIZE, LDSOFT, LDCOMPUTE, KRR, &
+SUBROUTINE ICE4_FAST_RG(KSIZE, LDSOFT, PCOMPUTE, KRR, &
                        &PRHODREF, PLVFACT, PLSFACT, PPRES, &
                        &PDV, PKA, PCJ, PCIT, &
                        &PLBDAR, PLBDAS, PLBDAG, &
                        &PT,  PRVT, PRCT, PRRT, PRIT, PRST, PRGT, &
                        &PRGSI, PRGSI_MR, &
-                       &LDWETG, &
+                       &PWETG, &
                        &PRICFRRG, PRRCFRIG, PRICFRR, PRCWETG, PRIWETG, PRRWETG, PRSWETG, &
                        &PRCDRYG, PRIDRYG, PRRDRYG, PRSDRYG, PRWETGH, PRWETGH_MR, PRGMLTR, &
                        &PRG_TEND, &
@@ -99,7 +99,8 @@ SUBROUTINE ICE4_FAST_RG(KSIZE, LDSOFT, LDCOMPUTE, KRR, &
 !*      0. DECLARATIONS
 !          ------------
 !
-USE MODD_CST,            ONLY: XALPI,XALPW,XBETAI,XBETAW,XGAMW,XCI,XCL,XCPV,XESTT,XGAMI,XLMTT,XLVTT,XMD,XMV,XRV,XTT
+USE MODD_CST,            ONLY: XALPI,XALPW,XBETAI,XBETAW,XGAMW,XCI,XCL,XCPV,XESTT,XGAMI,XLMTT,XLVTT,XMD,XMV,XRV,XTT,   &
+                               XEPSILO
 USE MODD_PARAM_ICE,      ONLY: LCRFLIMIT,LEVLIMIT,LNULLWETG,LWETGPOST
 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, &
@@ -113,7 +114,7 @@ IMPLICIT NONE
 !
 INTEGER,                      INTENT(IN)    :: KSIZE
 LOGICAL,                      INTENT(IN)    :: LDSOFT
-LOGICAL, DIMENSION(KSIZE),    INTENT(IN)    :: LDCOMPUTE
+REAL, DIMENSION(KSIZE),       INTENT(IN)    :: PCOMPUTE
 INTEGER,                      INTENT(IN)    :: KRR      ! Number of moist variable
 REAL, DIMENSION(KSIZE),       INTENT(IN)    :: PRHODREF ! Reference density
 REAL, DIMENSION(KSIZE),       INTENT(IN)    :: PLVFACT
@@ -135,7 +136,7 @@ REAL, DIMENSION(KSIZE),       INTENT(IN)    :: PRST     ! Snow/aggregate m.r. at
 REAL, DIMENSION(KSIZE),       INTENT(IN)    :: PRGT     ! Graupel m.r. at t
 REAL, DIMENSION(KSIZE),       INTENT(IN)    :: PRGSI    ! Graupel tendency by other processes
 REAL, DIMENSION(KSIZE),       INTENT(IN)    :: PRGSI_MR ! Graupel mr change by other processes
-LOGICAL, DIMENSION(KSIZE),    INTENT(OUT)   :: LDWETG   ! True where graupel grows in wet mode
+REAL, DIMENSION(KSIZE),       INTENT(OUT)   :: PWETG    ! 1. where graupel grows in wet mode, 0. elsewhere
 REAL, DIMENSION(KSIZE),       INTENT(INOUT) :: PRICFRRG ! Rain contact freezing
 REAL, DIMENSION(KSIZE),       INTENT(INOUT) :: PRRCFRIG ! Rain contact freezing
 REAL, DIMENSION(KSIZE),       INTENT(INOUT) :: PRICFRR  ! Rain contact freezing
@@ -150,7 +151,7 @@ REAL, DIMENSION(KSIZE),       INTENT(OUT)   :: PRSDRYG  ! Graupel dry growth
 REAL, DIMENSION(KSIZE),       INTENT(OUT)   :: PRWETGH  ! Conversion of graupel into hail
 REAL, DIMENSION(KSIZE),       INTENT(OUT)   :: PRWETGH_MR ! Conversion of graupel into hail, mr change
 REAL, DIMENSION(KSIZE),       INTENT(INOUT) :: PRGMLTR  ! Melting of the graupel
-REAL, DIMENSION(KSIZE, 6),    INTENT(INOUT) :: PRG_TEND ! Individual tendencies
+REAL, DIMENSION(KSIZE, 8),    INTENT(INOUT) :: PRG_TEND ! Individual tendencies
 REAL, DIMENSION(KSIZE),       INTENT(INOUT) :: PA_TH
 REAL, DIMENSION(KSIZE),       INTENT(INOUT) :: PA_RC
 REAL, DIMENSION(KSIZE),       INTENT(INOUT) :: PA_RR
@@ -163,34 +164,39 @@ REAL, DIMENSION(KSIZE),       INTENT(INOUT) :: PB_RH
 !
 !*       0.2  declaration of local variables
 !
-INTEGER, PARAMETER :: IRCDRYG=1, IRIDRYG=2, IRIWETG=3, IRSDRYG=4, IRSWETG=5, IRRDRYG=6
+INTEGER, PARAMETER :: IRCDRYG=1, IRIDRYG=2, IRIWETG=3, IRSDRYG=4, IRSWETG=5, IRRDRYG=6, &
+                    & IFREEZ1=7, IFREEZ2=8
 !
-LOGICAL, DIMENSION(SIZE(PRHODREF)) :: GDRY, LLDRYG, GMASK
+LOGICAL, DIMENSION(KSIZE) :: GDRY
+INTEGER, DIMENSION(KSIZE) :: I1
+REAL, DIMENSION(KSIZE) :: ZDRY, ZDRYG, ZMASK
 INTEGER :: IGDRY
-REAL, DIMENSION(SIZE(PRHODREF)) :: ZVEC1, ZVEC2, ZVEC3
-INTEGER, DIMENSION(SIZE(PRHODREF)) :: I1
-INTEGER, DIMENSION(SIZE(PRHODREF)) :: IVEC1, IVEC2
-REAL, DIMENSION(SIZE(PRHODREF)) :: ZZW, &
+REAL, DIMENSION(KSIZE) :: ZVEC1, ZVEC2, ZVEC3
+INTEGER, DIMENSION(KSIZE) :: IVEC1, IVEC2
+REAL, DIMENSION(KSIZE) :: ZZW, &
                                    ZRDRYG_INIT, & !Initial dry growth rate of the graupeln
                                    ZRWETG_INIT !Initial wet growth rate of the graupeln
-INTEGER :: JJ
+INTEGER :: JJ, JL
 !
 !-------------------------------------------------------------------------------
 !
 !*       6.1    rain contact freezing
 !
-GMASK(:)=PRIT(:)>XRTMIN(4) .AND. PRRT(:)>XRTMIN(3) .AND. LDCOMPUTE(:)
+DO JL=1, KSIZE
+  ZMASK(JL)=MAX(0., -SIGN(1., XRTMIN(4)-PRIT(JL))) * & ! WHERE(PRIT(:)>XRTMIN(4))
+           &MAX(0., -SIGN(1., XRTMIN(3)-PRRT(JL))) * & ! WHERE(PRRT(:)>XRTMIN(3))
+           &PCOMPUTE(JL)
+ENDDO
 IF(LDSOFT) THEN
-  WHERE(.NOT. GMASK(:))
-    PRICFRRG(:)=0.
-    PRRCFRIG(:)=0.
-    PRICFRR(:)=0.
-  ENDWHERE
+  DO JL=1, KSIZE
+    PRICFRRG(JL)=ZMASK(JL) * PRICFRRG(JL)
+    PRRCFRIG(JL)=ZMASK(JL) * PRRCFRIG(JL)
+    PRICFRR(JL)=ZMASK(JL) * PRICFRR(JL)
+  ENDDO
 ELSE
   PRICFRRG(:)=0.
   PRRCFRIG(:)=0.
-  PRICFRR(:)=0.
-  WHERE(GMASK(:))
+  WHERE(ZMASK(:)==1.)
     PRICFRRG(:) = XICFRR*PRIT(:)                & ! RICFRRG
                                  *PLBDAR(:)**XEXICFRR    &
                                  *PRHODREF(:)**(-XCEXVT)
@@ -198,50 +204,68 @@ ELSE
                                  * PLBDAR(:)**XEXRCFRI    &
                                  * PRHODREF(:)**(-XCEXVT-1.)
   END WHERE
-  ZZW(:)=1.
+
   IF(LCRFLIMIT) THEN
-    WHERE(GMASK(:))
+    DO JL=1, KSIZE
       !Comparison between heat to be released (to freeze rain) and heat sink (rain and ice temperature change)
       !ZZW is the proportion of process that can take place
-      ZZW(:) = MAX(0., MIN(1., (PRICFRRG(:)*XCI+PRRCFRIG(:)*XCL)*(XTT-PT(:)) / &
-                               MAX(1.E-20, XLVTT*PRRCFRIG(:))))
-    ENDWHERE
+      ZZW(JL)=(1.-ZMASK(JL)) + & ! 1. outside of mask
+              ZMASK(JL) * MAX(0., MIN(1., (PRICFRRG(JL)*XCI+PRRCFRIG(JL)*XCL)*(XTT-PT(JL)) / &
+                                          MAX(1.E-20, XLVTT*PRRCFRIG(JL))))
+    ENDDO
+  ELSE
+    ZZW(:)=1.
   ENDIF
-  PRRCFRIG(:) = ZZW(:) * PRRCFRIG(:) !Part of rain that can be freezed
-  PRICFRR(:) = (1-ZZW(:)) * PRICFRRG(:) !Part of collected pristine ice converted to rain
-  PRICFRRG(:) = ZZW(:) * PRICFRRG(:) !Part of collected pristine ice that lead to graupel
+  DO JL=1, KSIZE
+    PRRCFRIG(JL) = ZZW(JL) * PRRCFRIG(JL) !Part of rain that can be freezed
+    PRICFRR(JL) = (1.-ZZW(JL)) * PRICFRRG(JL) !Part of collected pristine ice converted to rain
+    PRICFRRG(JL) = ZZW(JL) * PRICFRRG(JL) !Part of collected pristine ice that lead to graupel
+  ENDDO
 ENDIF
-PA_RI(:) = PA_RI(:) - PRICFRRG(:) - PRICFRR(:)
-PA_RR(:) = PA_RR(:) - PRRCFRIG(:) + PRICFRR(:)
-PA_RG(:) = PA_RG(:) + PRICFRRG(:) + PRRCFRIG(:)
-PA_TH(:) = PA_TH(:) + (PRRCFRIG(:) - PRICFRR(:))*(PLSFACT(:)-PLVFACT(:))
+DO JL=1, KSIZE
+  PA_RI(JL) = PA_RI(JL) - PRICFRRG(JL) - PRICFRR(JL)
+  PA_RR(JL) = PA_RR(JL) - PRRCFRIG(JL) + PRICFRR(JL)
+  PA_RG(JL) = PA_RG(JL) + PRICFRRG(JL) + PRRCFRIG(JL)
+  PA_TH(JL) = PA_TH(JL) + (PRRCFRIG(JL) - PRICFRR(JL))*(PLSFACT(JL)-PLVFACT(JL))
+ENDDO
 !
 !
 !*       6.3    compute the graupel growth
 !
 ! Wet and dry collection of rc and ri on graupel
-GMASK(:)=PRGT(:)>XRTMIN(6) .AND. PRCT(:)>XRTMIN(2) .AND. LDCOMPUTE(:)
+DO JL=1, KSIZE
+  ZMASK(JL)=MAX(0., -SIGN(1., XRTMIN(6)-PRGT(JL))) * & ! WHERE(PRGT(:)>XRTMIN(6))
+           &MAX(0., -SIGN(1., XRTMIN(2)-PRCT(JL))) * & ! WHERE(PRCT(:)>XRTMIN(2))
+           &PCOMPUTE(JL)
+ENDDO
 IF(LDSOFT) THEN
-  WHERE(.NOT. GMASK(:))
-    PRG_TEND(:, IRCDRYG)=0.
-  END WHERE
+  DO JL=1, KSIZE
+    PRG_TEND(JL, IRCDRYG)=ZMASK(JL)*PRG_TEND(JL, IRCDRYG)
+  ENDDO
 ELSE
-  PRG_TEND(:, IRCDRYG)=0.
-  WHERE(GMASK(:))
+  ZZW(:)=0.
+  WHERE(ZMASK(:)==1.)
     ZZW(:)=PLBDAG(:)**(XCXG-XDG-2.) * PRHODREF(:)**(-XCEXVT)
-    PRG_TEND(:, IRCDRYG)=XFCDRYG * PRCT(:) * ZZW(:)
   END WHERE
+  DO JL=1, KSIZE
+    PRG_TEND(JL, IRCDRYG)=ZMASK(JL)*XFCDRYG * PRCT(JL) * ZZW(JL)
+  ENDDO
 ENDIF
-GMASK(:)=PRGT(:)>XRTMIN(6) .AND. PRIT(:)>XRTMIN(4) .AND. LDCOMPUTE(:)
+
+DO JL=1, KSIZE
+  ZMASK(JL)=MAX(0., -SIGN(1., XRTMIN(6)-PRGT(JL))) * & ! WHERE(PRGT(:)>XRTMIN(6))
+           &MAX(0., -SIGN(1., XRTMIN(4)-PRIT(JL))) * & ! WHERE(PRIT(:)>XRTMIN(4))
+           &PCOMPUTE(JL)
+ENDDO
 IF(LDSOFT) THEN
-  WHERE(.NOT. GMASK(:))
-    PRG_TEND(:, IRIDRYG)=0.
-    PRG_TEND(:, IRIWETG)=0.
-  END WHERE
+  DO JL=1, KSIZE
+    PRG_TEND(JL, IRIDRYG)=ZMASK(JL) * PRG_TEND(JL, IRIDRYG)
+    PRG_TEND(JL, IRIWETG)=ZMASK(JL) * PRG_TEND(JL, IRIWETG)
+  ENDDO
 ELSE
   PRG_TEND(:, IRIDRYG)=0.
   PRG_TEND(:, IRIWETG)=0.
-  WHERE(GMASK(:))
+  WHERE(ZMASK(:)==1.)
     ZZW(:)=PLBDAG(:)**(XCXG-XDG-2.) * PRHODREF(:)**(-XCEXVT)
     PRG_TEND(:, IRIDRYG)=XFIDRYG*EXP(XCOLEXIG*(PT(:)-XTT))*PRIT(:)*ZZW(:)
     PRG_TEND(:, IRIWETG)=PRG_TEND(:, IRIDRYG) / (XCOLIG*EXP(XCOLEXIG*(PT(:)-XTT)))
@@ -251,7 +275,10 @@ ENDIF
 ! Wet and dry collection of rs on graupel (6.2.1)
 IGDRY = 0
 DO JJ = 1, SIZE(GDRY)
-  IF (PRST(JJ)>XRTMIN(5) .AND. PRGT(JJ)>XRTMIN(6) .AND. LDCOMPUTE(JJ)) THEN
+  ZDRY(JJ)=MAX(0., -SIGN(1., XRTMIN(5)-PRST(JJ))) * & ! WHERE(PRST(:)>XRTMIN(5))
+          &MAX(0., -SIGN(1., XRTMIN(6)-PRGT(JJ))) * & ! WHERE(PRGT(:)>XRTMIN(6))
+          &PCOMPUTE(JJ)
+  IF (PRST(JJ)>XRTMIN(5) .AND. PRGT(JJ)>XRTMIN(6) .AND. PCOMPUTE(JJ)>0.) THEN
     IGDRY = IGDRY + 1
     I1(IGDRY) = JJ
     GDRY(JJ) = .TRUE.
@@ -261,10 +288,10 @@ DO JJ = 1, SIZE(GDRY)
 END DO
 
 IF(LDSOFT) THEN
-  WHERE(.NOT. GDRY(:))
-    PRG_TEND(:, IRSDRYG)=0.
-    PRG_TEND(:, IRSWETG)=0.
-  END WHERE
+  DO JL=1, KSIZE
+    PRG_TEND(JL, IRSDRYG)=ZDRY(JL) * PRG_TEND(JL, IRSDRYG)
+    PRG_TEND(JL, IRSWETG)=ZDRY(JL) * PRG_TEND(JL, IRSWETG)
+  ENDDO
 ELSE
   PRG_TEND(:, IRSDRYG)=0.
   PRG_TEND(:, IRSWETG)=0.
@@ -324,7 +351,10 @@ ENDIF
 !
 IGDRY = 0
 DO JJ = 1, SIZE(GDRY)
-  IF (PRRT(JJ)>XRTMIN(3) .AND. PRGT(JJ)>XRTMIN(6) .AND. LDCOMPUTE(JJ)) THEN
+  ZDRY(JJ)=MAX(0., -SIGN(1., XRTMIN(3)-PRRT(JJ))) * & ! WHERE(PRRT(:)>XRTMIN(3))
+          &MAX(0., -SIGN(1., XRTMIN(6)-PRGT(JJ))) * & ! WHERE(PRGT(:)>XRTMIN(6))
+          &PCOMPUTE(JJ)
+  IF (PRRT(JJ)>XRTMIN(3) .AND. PRGT(JJ)>XRTMIN(6) .AND. PCOMPUTE(JJ)>0.) THEN
     IGDRY = IGDRY + 1
     I1(IGDRY) = JJ
     GDRY(JJ) = .TRUE.
@@ -334,9 +364,9 @@ DO JJ = 1, SIZE(GDRY)
 END DO
 
 IF(LDSOFT) THEN
-  WHERE(.NOT. GDRY(:))
-    PRG_TEND(:, IRRDRYG)=0.
-  END WHERE
+  DO JL=1, KSIZE
+    PRG_TEND(JL, IRRDRYG)=ZDRY(JL) * PRG_TEND(JL, IRRDRYG)
+  ENDDO
 ELSE
   PRG_TEND(:, IRRDRYG)=0.
   !
@@ -390,47 +420,77 @@ ELSE
   ENDIF
 ENDIF
 
-ZRDRYG_INIT(:)=PRG_TEND(:, IRCDRYG)+PRG_TEND(:, IRIDRYG)+PRG_TEND(:, IRSDRYG)+PRG_TEND(:, IRRDRYG)
+DO JL=1, KSIZE
+  ZRDRYG_INIT(JL)=PRG_TEND(JL, IRCDRYG)+PRG_TEND(JL, IRIDRYG)+ &
+                 &PRG_TEND(JL, IRSDRYG)+PRG_TEND(JL, IRRDRYG)
+ENDDO
 
 !Freezing rate
-ZRWETG_INIT(:)=0.
-GMASK(:)=PRGT(:)>XRTMIN(6) .AND. LDCOMPUTE(:)
-WHERE(GMASK(:))
-  ZRWETG_INIT(:)=PRVT(:)*PPRES(:)/((XMV/XMD)+PRVT(:)) ! Vapor pressure
-END WHERE
-IF(LEVLIMIT) THEN
-  WHERE(GMASK(:))
-    ZRWETG_INIT(:)=MIN(ZRWETG_INIT(:), EXP(XALPI-XBETAI/PT(:)-XGAMI*ALOG(PT(:)))) ! min(ev, es_i(T))
+DO JL=1, KSIZE
+  ZMASK(JL)=MAX(0., -SIGN(1., XRTMIN(6)-PRGT(JL))) * & ! WHERE(PRGT(:)>XRTMIN(6))
+           &PCOMPUTE(JL)
+ENDDO
+IF(LDSOFT) THEN
+  DO JL=1, KSIZE
+    PRG_TEND(JL, IFREEZ1)=ZMASK(JL) * PRG_TEND(JL, IFREEZ1)
+    PRG_TEND(JL, IFREEZ2)=ZMASK(JL) * PRG_TEND(JL, IFREEZ2)
+  ENDDO
+ELSE
+  DO JL=1, KSIZE
+    PRG_TEND(JL, IFREEZ1)=ZMASK(JL) * PRVT(JL)*PPRES(JL)/(XEPSILO+PRVT(JL)) ! Vapor pressure
+  ENDDO
+  IF(LEVLIMIT) THEN
+    WHERE(ZMASK(:)==1.)
+      PRG_TEND(:, IFREEZ1)=MIN(PRG_TEND(:, IFREEZ1), EXP(XALPI-XBETAI/PT(:)-XGAMI*ALOG(PT(:)))) ! min(ev, es_i(T))
+    END WHERE
+  ENDIF
+  PRG_TEND(:, IFREEZ2)=0.
+  WHERE(ZMASK(:)==1.)
+    PRG_TEND(:, IFREEZ1)=PKA(:)*(XTT-PT(:)) +                              &
+             (PDV(:)*(XLVTT+(XCPV-XCL)*(PT(:)-XTT)) &
+                           *(XESTT-PRG_TEND(:, IFREEZ1))/(XRV*PT(:))           )
+    PRG_TEND(:, IFREEZ1)=PRG_TEND(:, IFREEZ1)* ( X0DEPG*       PLBDAG(:)**XEX0DEPG +     &
+                           X1DEPG*PCJ(:)*PLBDAG(:)**XEX1DEPG )/ &
+                          ( PRHODREF(:)*(XLMTT-XCL*(XTT-PT(:))) )
+    PRG_TEND(:, IFREEZ2)=(PRHODREF(:)*(XLMTT+(XCI-XCL)*(XTT-PT(:)))   ) / &
+                          ( PRHODREF(:)*(XLMTT-XCL*(XTT-PT(:))) )
   END WHERE
 ENDIF
-WHERE(GMASK(:))
-  ZRWETG_INIT(:)=PKA(:)*(XTT-PT(:)) +                              &
-           (PDV(:)*(XLVTT+(XCPV-XCL)*(PT(:)-XTT)) &
-                         *(XESTT-ZRWETG_INIT(:))/(XRV*PT(:))           )
-  ZRWETG_INIT(:)=MAX(0.,                                               &
-             (ZRWETG_INIT(:) * ( X0DEPG*       PLBDAG(:)**XEX0DEPG +     &
-                         X1DEPG*PCJ(:)*PLBDAG(:)**XEX1DEPG ) +   &
-             (PRG_TEND(:, IRIWETG)+PRG_TEND(:, IRSWETG) ) *                            &
-             (PRHODREF(:)*(XLMTT+(XCI-XCL)*(XTT-PT(:)))   ) ) / &
-                        ( PRHODREF(:)*(XLMTT-XCL*(XTT-PT(:))) )   )
+DO JL=1, KSIZE
   !We must agregate, at least, the cold species
-  ZRWETG_INIT(:)=MAX(ZRWETG_INIT(:), PRG_TEND(:, IRIWETG)+PRG_TEND(:, IRSWETG))
-END WHERE
+  ZRWETG_INIT(JL)=ZMASK(JL) * MAX(PRG_TEND(JL, IRIWETG)+PRG_TEND(JL, IRSWETG), &
+                                 &MAX(0., PRG_TEND(JL, IFREEZ1) + &
+                                         &PRG_TEND(JL, IFREEZ2) * ( &
+                     &PRG_TEND(JL, IRIWETG)+PRG_TEND(JL, IRSWETG) )))
+ENDDO
 
 !Growth mode
-LDWETG(:)=GMASK(:) .AND. &
-         &MAX(0., ZRDRYG_INIT(:)-PRG_TEND(:, IRIDRYG)-PRG_TEND(:, IRSDRYG))>= &
-         &MAX(0., ZRWETG_INIT(:)-PRG_TEND(:, IRIWETG)-PRG_TEND(:, IRSWETG))
+DO JL=1, KSIZE
+  PWETG(JL) = ZMASK(JL) * & !
+            & MAX(0., SIGN(1., MAX(0., ZRDRYG_INIT(JL)-PRG_TEND(JL, IRIDRYG)-PRG_TEND(JL, IRSDRYG)) - &
+                              &MAX(0., ZRWETG_INIT(JL)-PRG_TEND(JL, IRIWETG)-PRG_TEND(JL, IRSWETG))))
+ENDDO
 IF(LNULLWETG) THEN
-  LDWETG(:)=LDWETG(:) .AND. ZRDRYG_INIT(:)>0.
+  DO JL=1, KSIZE
+    PWETG(JL) = PWETG(JL) * MAX(0., -SIGN(1., -ZRDRYG_INIT(JL)))
+  ENDDO
 ELSE
-  LDWETG(:)=LDWETG(:) .AND. ZRWETG_INIT(:)>0.
+  DO JL=1, KSIZE
+    PWETG(JL) = PWETG(JL) * MAX(0., -SIGN(1., -ZRWETG_INIT(JL)))
+  ENDDO
 ENDIF
-IF(.NOT. LWETGPOST) LDWETG(:)=LDWETG(:) .AND. PT(:)<XTT
-
-LLDRYG(:)=GMASK(:) .AND. PT(:)<XTT .AND. ZRDRYG_INIT(:)>0. .AND. &
-    &MAX(0., ZRDRYG_INIT(:)-PRG_TEND(:, IRIDRYG)-PRG_TEND(:, IRSDRYG))<&
-    &MAX(0., ZRWETG_INIT(:)-PRG_TEND(:, IRIWETG)-PRG_TEND(:, IRSWETG))
+IF(.NOT. LWETGPOST) THEN
+  DO JL=1, KSIZE
+    PWETG(JL) = PWETG(JL) * MAX(0., -SIGN(1., PT(JL)-XTT))
+  ENDDO
+ENDIF
+DO JL=1, KSIZE
+  ZDRYG(JL) = ZMASK(JL) * & !
+            & MAX(0., -SIGN(1., PT(JL)-XTT)) * & ! WHERE(PT(:)<XTT)
+            & MAX(0., -SIGN(1., 1.E-20-ZRDRYG_INIT(JL))) * & ! WHERE(ZRDRYG_INIT(:)>0.)
+            & MAX(0., -SIGN(1., MAX(0., ZRDRYG_INIT(JL)-PRG_TEND(JL, IRIDRYG)-PRG_TEND(JL, IRSDRYG)) - &
+                               &MAX(0., ZRWETG_INIT(JL)-PRG_TEND(JL, IRIWETG)-PRG_TEND(JL, IRSWETG))))
+ENDDO
 
 ! Part of ZRWETG to be converted into hail
 ! Graupel can be produced by other processes instantaneously (inducing a mixing ratio change, PRGSI_MR) or
@@ -438,75 +498,70 @@ LLDRYG(:)=GMASK(:) .AND. PT(:)<XTT .AND. ZRDRYG_INIT(:)>0. .AND. &
 PRWETGH(:)=0.
 PRWETGH_MR(:)=0.
 IF(KRR==7) THEN
-  WHERE(LDWETG(:))
+  WHERE(PWETG(:)==1.)
     !assume a linear percent of conversion of produced graupel into hail
     PRWETGH(:)=(MAX(0., PRGSI(:)+PRICFRRG(:)+PRRCFRIG(:))+ZRWETG_INIT(:))*ZRDRYG_INIT(:)/(ZRWETG_INIT(:)+ZRDRYG_INIT(:))
     PRWETGH_MR(:)=MAX(0., PRGSI_MR(:))*ZRDRYG_INIT(:)/(ZRWETG_INIT(:)+ZRDRYG_INIT(:))
   END WHERE
 ENDIF
 
-PRCWETG(:)=0.
-PRIWETG(:)=0.
-PRSWETG(:)=0.
-PRRWETG(:)=0.
-WHERE(LDWETG(:))
+DO JL=1, KSIZE
   !Aggregated minus collected
-  PRRWETG(:)=-(PRG_TEND(:, IRIWETG)+PRG_TEND(:, IRSWETG)+PRG_TEND(:, IRCDRYG)-ZRWETG_INIT(:))
-  PRCWETG(:)=PRG_TEND(:, IRCDRYG)
-  PRIWETG(:)=PRG_TEND(:, IRIWETG)
-  PRSWETG(:)=PRG_TEND(:, IRSWETG)
-END WHERE
-PRCDRYG(:)=0.
-PRIDRYG(:)=0.
-PRRDRYG(:)=0.
-PRSDRYG(:)=0.
-WHERE(LLDRYG(:))
-  PRCDRYG(:)=PRG_TEND(:, IRCDRYG)
-  PRRDRYG(:)=PRG_TEND(:, IRRDRYG)
-  PRIDRYG(:)=PRG_TEND(:, IRIDRYG)
-  PRSDRYG(:)=PRG_TEND(:, IRSDRYG)
-END WHERE
-PA_RC(:) = PA_RC(:) - PRCWETG(:)
-PA_RI(:) = PA_RI(:) - PRIWETG(:)
-PA_RS(:) = PA_RS(:) - PRSWETG(:)
-PA_RG(:) = PA_RG(:) + PRCWETG(:) + PRIWETG(:) + PRSWETG(:) + PRRWETG(:)
-PA_RR(:) = PA_RR(:) - PRRWETG(:)
-PA_TH(:) = PA_TH(:) + (PRCWETG(:) + PRRWETG(:))*(PLSFACT(:)-PLVFACT(:))
-PA_RG(:) = PA_RG(:) - PRWETGH(:)
-PA_RH(:) = PA_RH(:) + PRWETGH(:)
-PB_RG(:) = PB_RG(:) - PRWETGH_MR(:)
-PB_RH(:) = PB_RH(:) + PRWETGH_MR(:)
-PA_RC(:) = PA_RC(:) - PRCDRYG(:)
-PA_RI(:) = PA_RI(:) - PRIDRYG(:)
-PA_RS(:) = PA_RS(:) - PRSDRYG(:)
-PA_RR(:) = PA_RR(:) - PRRDRYG(:)
-PA_RG(:) = PA_RG(:) + PRCDRYG(:) + PRIDRYG(:) + PRSDRYG(:) + PRRDRYG(:)
-PA_TH(:) = PA_TH(:) + (PRCDRYG(:)+PRRDRYG(:))*(PLSFACT(:)-PLVFACT(:))
+  PRRWETG(JL)=-PWETG(JL) * (PRG_TEND(JL, IRIWETG)+PRG_TEND(JL, IRSWETG)+&
+                           &PRG_TEND(JL, IRCDRYG)-ZRWETG_INIT(JL))
+  PRCWETG(JL)=PWETG(JL) * PRG_TEND(JL, IRCDRYG)
+  PRIWETG(JL)=PWETG(JL) * PRG_TEND(JL, IRIWETG)
+  PRSWETG(JL)=PWETG(JL) * PRG_TEND(JL, IRSWETG)
+
+  PRCDRYG(JL)=ZDRYG(JL) * PRG_TEND(JL, IRCDRYG)
+  PRRDRYG(JL)=ZDRYG(JL) * PRG_TEND(JL, IRRDRYG)
+  PRIDRYG(JL)=ZDRYG(JL) * PRG_TEND(JL, IRIDRYG)
+  PRSDRYG(JL)=ZDRYG(JL) * PRG_TEND(JL, IRSDRYG)
 
+  PA_RC(JL) = PA_RC(JL) - PRCWETG(JL)
+  PA_RI(JL) = PA_RI(JL) - PRIWETG(JL)
+  PA_RS(JL) = PA_RS(JL) - PRSWETG(JL)
+  PA_RG(JL) = PA_RG(JL) + PRCWETG(JL) + PRIWETG(JL) + PRSWETG(JL) + PRRWETG(JL)
+  PA_RR(JL) = PA_RR(JL) - PRRWETG(JL)
+  PA_TH(JL) = PA_TH(JL) + (PRCWETG(JL) + PRRWETG(JL))*(PLSFACT(JL)-PLVFACT(JL))
+  PA_RG(JL) = PA_RG(JL) - PRWETGH(JL)
+  PA_RH(JL) = PA_RH(JL) + PRWETGH(JL)
+  PB_RG(JL) = PB_RG(JL) - PRWETGH_MR(JL)
+  PB_RH(JL) = PB_RH(JL) + PRWETGH_MR(JL)
+  PA_RC(JL) = PA_RC(JL) - PRCDRYG(JL)
+  PA_RI(JL) = PA_RI(JL) - PRIDRYG(JL)
+  PA_RS(JL) = PA_RS(JL) - PRSDRYG(JL)
+  PA_RR(JL) = PA_RR(JL) - PRRDRYG(JL)
+  PA_RG(JL) = PA_RG(JL) + PRCDRYG(JL) + PRIDRYG(JL) + PRSDRYG(JL) + PRRDRYG(JL)
+  PA_TH(JL) = PA_TH(JL) + (PRCDRYG(JL)+PRRDRYG(JL))*(PLSFACT(JL)-PLVFACT(JL))
+ENDDO
 !
 !*       6.5    Melting of the graupeln
 !
-GMASK(:)=PRGT(:)>XRTMIN(6) .AND. PT(:)>XTT .AND. LDCOMPUTE(:)
+DO JL=1, KSIZE
+  ZMASK(JL)=MAX(0., -SIGN(1., XRTMIN(6)-PRGT(JL))) * & ! WHERE(PRGT(:)>XRTMIN(6))
+           &MAX(0., -SIGN(1., XTT-PT(JL))) * & ! WHERE(PT(:)>XTT)
+           &PCOMPUTE(JL)
+ENDDO
 IF(LDSOFT) THEN
-  WHERE(.NOT. GMASK(:))
-    PRGMLTR(:) = 0.
-  END WHERE
+  DO JL=1, KSIZE
+    PRGMLTR(JL)=ZMASK(JL) * PRGMLTR(JL)
+  ENDDO
 ELSE
-  PRGMLTR(:) = 0.
-  WHERE(GMASK(:))
-    PRGMLTR(:) = PRVT(:)*PPRES(:)/((XMV/XMD)+PRVT(:)) ! Vapor pressure
-  END WHERE
+  DO JL=1, KSIZE
+    PRGMLTR(JL)=ZMASK(JL) * PRVT(JL)*PPRES(JL)/(XEPSILO+PRVT(JL)) ! Vapor pressure
+  ENDDO
   IF(LEVLIMIT) THEN
-    WHERE(GMASK(:))
+    WHERE(ZMASK(:)==1.)
       PRGMLTR(:)=MIN(PRGMLTR(:), EXP(XALPW-XBETAW/PT(:)-XGAMW*ALOG(PT(:)))) ! min(ev, es_w(T))
     END WHERE
   ENDIF
-  WHERE(GMASK(:))
-    PRGMLTR(:) =  PKA(:)*(XTT-PT(:)) +                                 &
-               ( PDV(:)*(XLVTT + ( XCPV - XCL ) * ( PT(:) - XTT )) &
-                           *(XESTT-PRGMLTR(:))/(XRV*PT(:))             )
-  END WHERE
-  WHERE(GMASK(:))
+  DO JL=1, KSIZE
+    PRGMLTR(JL)=ZMASK(JL) * (PKA(JL)*(XTT-PT(JL)) +                                 &
+               ( PDV(JL)*(XLVTT + ( XCPV - XCL ) * ( PT(JL) - XTT )) &
+                           *(XESTT-PRGMLTR(JL))/(XRV*PT(JL))             ))
+  ENDDO
+  WHERE(ZMASK(:)==1.)
     !
     ! compute RGMLTR
     !
@@ -518,9 +573,10 @@ ELSE
                                              ( PRHODREF(:)*XLMTT ) )
   END WHERE
 ENDIF
-PA_RR(:) = PA_RR(:) + PRGMLTR(:)
-PA_RG(:) = PA_RG(:) - PRGMLTR(:)
-PA_TH(:) = PA_TH(:) - PRGMLTR(:)*(PLSFACT(:)-PLVFACT(:))
-
+DO JL=1, KSIZE
+  PA_RR(JL) = PA_RR(JL) + PRGMLTR(JL)
+  PA_RG(JL) = PA_RG(JL) - PRGMLTR(JL)
+  PA_TH(JL) = PA_TH(JL) - PRGMLTR(JL)*(PLSFACT(JL)-PLVFACT(JL))
+ENDDO
 !
 END SUBROUTINE ICE4_FAST_RG
diff --git a/src/MNH/ice4_fast_rh.f90 b/src/MNH/ice4_fast_rh.f90
index 9678dceb1..c06b206dd 100644
--- a/src/MNH/ice4_fast_rh.f90
+++ b/src/MNH/ice4_fast_rh.f90
@@ -5,7 +5,7 @@
 !-----------------------------------------------------------------
 MODULE MODI_ICE4_FAST_RH
 INTERFACE
-SUBROUTINE ICE4_FAST_RH(KSIZE, LDSOFT, LDCOMPUTE, LDWETG, &
+SUBROUTINE ICE4_FAST_RH(KSIZE, LDSOFT, PCOMPUTE, PWETG, &
                        &PRHODREF, PLVFACT, PLSFACT, PPRES, &
                        &PDV, PKA, PCJ, &
                        &PLBDAS, PLBDAG, PLBDAR, PLBDAH, &
@@ -17,8 +17,8 @@ SUBROUTINE ICE4_FAST_RH(KSIZE, LDSOFT, LDCOMPUTE, LDWETG, &
 IMPLICIT NONE
 INTEGER,                      INTENT(IN)    :: KSIZE
 LOGICAL,                      INTENT(IN)    :: LDSOFT
-LOGICAL, DIMENSION(KSIZE),    INTENT(IN)    :: LDCOMPUTE
-LOGICAL, DIMENSION(KSIZE),    INTENT(IN)    :: LDWETG   ! True where graupel grows in wet mode
+REAL, DIMENSION(KSIZE),       INTENT(IN)    :: PCOMPUTE
+REAL, DIMENSION(KSIZE),       INTENT(IN)    :: PWETG    ! 1. where graupel grows in wet mode, 0. elsewhere
 REAL, DIMENSION(KSIZE),       INTENT(IN)    :: PRHODREF ! Reference density
 REAL, DIMENSION(KSIZE),       INTENT(IN)    :: PLVFACT
 REAL, DIMENSION(KSIZE),       INTENT(IN)    :: PLSFACT
@@ -50,7 +50,7 @@ REAL, DIMENSION(KSIZE),       INTENT(OUT)   :: PRRDRYH  ! Wet growth of hailston
 REAL, DIMENSION(KSIZE),       INTENT(OUT)   :: PRGDRYH  ! Wet growth of hailstone
 REAL, DIMENSION(KSIZE),       INTENT(OUT)   :: PRDRYHG  ! Conversion of hailstone into graupel
 REAL, DIMENSION(KSIZE),       INTENT(INOUT) :: PRHMLTR  ! Melting of the hailstones
-REAL, DIMENSION(KSIZE, 8),    INTENT(INOUT) :: PRH_TEND ! Individual tendencies
+REAL, DIMENSION(KSIZE, 10),   INTENT(INOUT) :: PRH_TEND ! Individual tendencies
 REAL, DIMENSION(KSIZE),       INTENT(INOUT) :: PA_TH
 REAL, DIMENSION(KSIZE),       INTENT(INOUT) :: PA_RC
 REAL, DIMENSION(KSIZE),       INTENT(INOUT) :: PA_RR
@@ -61,7 +61,7 @@ REAL, DIMENSION(KSIZE),       INTENT(INOUT) :: PA_RH
 END SUBROUTINE ICE4_FAST_RH
 END INTERFACE
 END MODULE MODI_ICE4_FAST_RH
-SUBROUTINE ICE4_FAST_RH(KSIZE, LDSOFT, LDCOMPUTE, LDWETG, &
+SUBROUTINE ICE4_FAST_RH(KSIZE, LDSOFT, PCOMPUTE, PWETG, &
                        &PRHODREF, PLVFACT, PLSFACT, PPRES, &
                        &PDV, PKA, PCJ, &
                        &PLBDAS, PLBDAG, PLBDAR, PLBDAH, &
@@ -89,7 +89,7 @@ SUBROUTINE ICE4_FAST_RH(KSIZE, LDSOFT, LDCOMPUTE, LDWETG, &
 !*      0. DECLARATIONS
 !          ------------
 !
-USE MODD_CST,            ONLY: XALPI,XALPW,XBETAI,XBETAW,XGAMW,XCI,XCL,XCPV,XESTT,XGAMI,XLMTT,XLVTT,XMD,XMV,XRV,XTT
+USE MODD_CST,            ONLY: XALPI,XALPW,XBETAI,XBETAW,XGAMW,XCI,XCL,XCPV,XESTT,XGAMI,XLMTT,XLVTT,XMD,XMV,XRV,XTT,XEPSILO
 USE MODD_PARAM_ICE,      ONLY: LCONVHG,LEVLIMIT,LNULLWETH,LWETHPOST
 USE MODD_RAIN_ICE_DESCR, ONLY: XBG,XBS,XCEXVT,XCXG,XCXH,XCXS,XDH,XRTMIN
 USE MODD_RAIN_ICE_PARAM, ONLY: NWETLBDAG,NWETLBDAH,NWETLBDAR,NWETLBDAS,X0DEPH,X1DEPH,XCOLEXGH,XCOLEXIH,XCOLGH,XCOLIH,XCOLEXSH, &
@@ -105,8 +105,8 @@ IMPLICIT NONE
 !
 INTEGER,                      INTENT(IN)    :: KSIZE
 LOGICAL,                      INTENT(IN)    :: LDSOFT
-LOGICAL, DIMENSION(KSIZE),    INTENT(IN)    :: LDCOMPUTE
-LOGICAL, DIMENSION(KSIZE),    INTENT(IN)    :: LDWETG   ! True where graupel grows in wet mode
+REAL, DIMENSION(KSIZE),       INTENT(IN)    :: PCOMPUTE
+REAL, DIMENSION(KSIZE),       INTENT(IN)    :: PWETG    ! 1. where graupel grows in wet mode, 0. elsewhere
 REAL, DIMENSION(KSIZE),       INTENT(IN)    :: PRHODREF ! Reference density
 REAL, DIMENSION(KSIZE),       INTENT(IN)    :: PLVFACT
 REAL, DIMENSION(KSIZE),       INTENT(IN)    :: PLSFACT
@@ -138,7 +138,7 @@ REAL, DIMENSION(KSIZE),       INTENT(OUT)   :: PRRDRYH  ! Wet growth of hailston
 REAL, DIMENSION(KSIZE),       INTENT(OUT)   :: PRGDRYH  ! Wet growth of hailstone
 REAL, DIMENSION(KSIZE),       INTENT(OUT)   :: PRDRYHG  ! Conversion of hailstone into graupel
 REAL, DIMENSION(KSIZE),       INTENT(INOUT) :: PRHMLTR  ! Melting of the hailstones
-REAL, DIMENSION(KSIZE, 8),    INTENT(INOUT) :: PRH_TEND ! Individual tendencies
+REAL, DIMENSION(KSIZE, 10),   INTENT(INOUT) :: PRH_TEND ! Individual tendencies
 REAL, DIMENSION(KSIZE),       INTENT(INOUT) :: PA_TH
 REAL, DIMENSION(KSIZE),       INTENT(INOUT) :: PA_RC
 REAL, DIMENSION(KSIZE),       INTENT(INOUT) :: PA_RR
@@ -149,45 +149,55 @@ REAL, DIMENSION(KSIZE),       INTENT(INOUT) :: PA_RH
 !
 !*       0.2  declaration of local variables
 !
-INTEGER, PARAMETER :: IRCWETH=1, IRRWETH=2, IRIDRYH=3, IRIWETH=4, IRSDRYH=5, IRSWETH=6, IRGDRYH=7, IRGWETH=8
+INTEGER, PARAMETER :: IRCWETH=1, IRRWETH=2, IRIDRYH=3, IRIWETH=4, IRSDRYH=5, IRSWETH=6, IRGDRYH=7, IRGWETH=8, &
+                    & IFREEZ1=9, IFREEZ2=10
 !
-LOGICAL, DIMENSION(SIZE(PRHODREF)) :: GHAIL, GWET, GMASK, LLWETH, LLDRYH
+LOGICAL, DIMENSION(KSIZE) :: GWET
+REAL, DIMENSION(KSIZE) :: ZHAIL, ZWET, ZMASK, ZWETH, ZDRYH
 INTEGER :: IHAIL, IGWET
-REAL, DIMENSION(SIZE(PRHODREF)) :: ZVEC1, ZVEC2, ZVEC3
-INTEGER, DIMENSION(SIZE(PRHODREF)) :: I1
-INTEGER, DIMENSION(SIZE(PRHODREF)) :: IVEC1, IVEC2
-REAL, DIMENSION(SIZE(PRHODREF)) :: ZZW, &
+INTEGER, DIMENSION(KSIZE) :: I1
+REAL, DIMENSION(KSIZE) :: ZVEC1, ZVEC2, ZVEC3
+INTEGER, DIMENSION(KSIZE) :: IVEC1, IVEC2
+REAL, DIMENSION(KSIZE) :: ZZW, &
                                    ZRDRYH_INIT, ZRWETH_INIT, &
                                    ZRDRYHG
-INTEGER :: JJ
+INTEGER :: JJ, JL
 !
 !-------------------------------------------------------------------------------
 !
 !
 !*       7.2    compute the Wet and Dry growth of hail
 !
-GMASK(:)=PRHT(:)>XRTMIN(7) .AND. PRCT(:)>XRTMIN(2) .AND. LDCOMPUTE(:)
+DO JL=1, KSIZE
+  ZMASK(JL)=MAX(0., -SIGN(1., XRTMIN(7)-PRHT(JL))) * & ! WHERE(PRHT(:)>XRTMIN(7))
+           &MAX(0., -SIGN(1., XRTMIN(2)-PRCT(JL))) * & ! WHERE(PRCT(:)>XRTMIN(2))
+           &PCOMPUTE(JL)
+ENDDO
 IF(LDSOFT) THEN
-  WHERE(.NOT. GMASK(:))
-    PRH_TEND(:, IRCWETH)=0.
-  END WHERE
+  DO JL=1, KSIZE
+    PRH_TEND(JL, IRCWETH)=ZMASK(JL) * PRH_TEND(JL, IRCWETH)
+  ENDDO
 ELSE
   PRH_TEND(:, IRCWETH)=0.
-  WHERE(GMASK(:))
+  WHERE(ZMASK(:)==1.)
     ZZW(:) = PLBDAH(:)**(XCXH-XDH-2.0) * PRHODREF(:)**(-XCEXVT)
     PRH_TEND(:, IRCWETH)=XFWETH * PRCT(:) * ZZW(:)    ! RCWETH
   END WHERE
 ENDIF
-GMASK(:)=PRHT(:)>XRTMIN(7) .AND. PRIT(:)>XRTMIN(4) .AND. LDCOMPUTE(:)
+DO JL=1, KSIZE
+  ZMASK(JL)=MAX(0., -SIGN(1., XRTMIN(7)-PRHT(JL))) * & ! WHERE(PRHT(:)>XRTMIN(7))
+           &MAX(0., -SIGN(1., XRTMIN(4)-PRIT(JL))) * & ! WHERE(PRIT(:)>XRTMIN(4))
+           &PCOMPUTE(JL)
+ENDDO
 IF(LDSOFT) THEN
-  WHERE(.NOT. GMASK(:))
-    PRH_TEND(:, IRIWETH)=0.
-    PRH_TEND(:, IRIDRYH)=0.
-  END WHERE
+  DO JL=1, KSIZE
+    PRH_TEND(JL, IRIWETH)=ZMASK(JL) * PRH_TEND(JL, IRIWETH)
+    PRH_TEND(JL, IRIDRYH)=ZMASK(JL) * PRH_TEND(JL, IRIDRYH)
+  ENDDO
 ELSE
   PRH_TEND(:, IRIWETH)=0.
   PRH_TEND(:, IRIDRYH)=0.
-  WHERE(GMASK(:))
+  WHERE(ZMASK(:)==1.)
     ZZW(:) = PLBDAH(:)**(XCXH-XDH-2.0) * PRHODREF(:)**(-XCEXVT)
     PRH_TEND(:, IRIWETH)=XFWETH * PRIT(:) * ZZW(:)   ! RIWETH
     PRH_TEND(:, IRIDRYH)=PRH_TEND(:, IRIWETH)*(XCOLIH*EXP(XCOLEXIH*(PT(:)-XTT)))   ! RIDRYH
@@ -199,7 +209,10 @@ ENDIF
 !
 IGWET = 0
 DO JJ = 1, SIZE(GWET)
-  IF (PRHT(JJ)>XRTMIN(7) .AND. PRST(JJ)>XRTMIN(5) .AND. LDCOMPUTE(JJ)) THEN
+  ZWET(JJ) = MAX(0., -SIGN(1., XRTMIN(7)-PRHT(JJ))) * & ! WHERE(PRHT(:)>XRTMIN(7))
+            &MAX(0., -SIGN(1., XRTMIN(5)-PRST(JJ))) * & ! WHERE(PRST(:)>XRTMIN(5))
+            &PCOMPUTE(JJ)
+  IF (PRHT(JJ)>XRTMIN(7) .AND. PRST(JJ)>XRTMIN(5) .AND. PCOMPUTE(JJ)>0.) THEN
     IGWET = IGWET + 1
     I1(IGWET) = JJ
     GWET(JJ) = .TRUE.
@@ -209,10 +222,10 @@ DO JJ = 1, SIZE(GWET)
 END DO
 
 IF(LDSOFT) THEN
-  WHERE(.NOT. GWET(:))
-    PRH_TEND(:, IRSWETH)=0.
-    PRH_TEND(:, IRSDRYH)=0.
-  END WHERE
+  DO JL=1, KSIZE
+    PRH_TEND(JL, IRSWETH)=ZWET(JL) * PRH_TEND(JL, IRSWETH)
+    PRH_TEND(JL, IRSDRYH)=ZWET(JL) * PRH_TEND(JL, IRSDRYH)
+  ENDDO
 ELSE
   PRH_TEND(:, IRSWETH)=0.
   PRH_TEND(:, IRSDRYH)=0.
@@ -271,7 +284,10 @@ ENDIF
 !
 IGWET = 0
 DO JJ = 1, SIZE(GWET)
-  IF (PRHT(JJ)>XRTMIN(7) .AND. PRGT(JJ)>XRTMIN(6) .AND. LDCOMPUTE(JJ)) THEN
+  ZWET(JJ)=MAX(0., -SIGN(1., XRTMIN(7)-PRHT(JJ))) * & ! WHERE(PRHT(:)>XRTMIN(7))
+          &MAX(0., -SIGN(1., XRTMIN(6)-PRGT(JJ))) * & ! WHERE(PRGT(:)>XRTMIN(6))
+          &PCOMPUTE(JJ)
+  IF (PRHT(JJ)>XRTMIN(7) .AND. PRGT(JJ)>XRTMIN(6) .AND. PCOMPUTE(JJ)>0.) THEN
     IGWET = IGWET + 1
     I1(IGWET) = JJ
     GWET(JJ) = .TRUE.
@@ -281,10 +297,10 @@ DO JJ = 1, SIZE(GWET)
 END DO
 
 IF(LDSOFT) THEN
-  WHERE(.NOT. GWET(:))
-    PRH_TEND(:, IRGWETH)=0.
-    PRH_TEND(:, IRGDRYH)=0.
-  END WHERE
+  DO JL=1, KSIZE
+    PRH_TEND(JL, IRGWETH)=ZWET(JL) * PRH_TEND(JL, IRGWETH)
+    PRH_TEND(JL, IRGDRYH)=ZWET(JL) * PRH_TEND(JL, IRGDRYH)
+  ENDDO
 ELSE
   PRH_TEND(:, IRGWETH)=0.
   PRH_TEND(:, IRGDRYH)=0.
@@ -337,7 +353,7 @@ ELSE
       PRH_TEND(:, IRGDRYH)=PRH_TEND(:, IRGWETH)
     END WHERE
     !When graupel grows in wet mode, graupel is wet (!) and collection efficiency must remain the same
-    WHERE(GWET(:) .AND. .NOT. LDWETG(:))
+    WHERE(GWET(:) .AND. .NOT. PWETG(:)==1.)
       PRH_TEND(:, IRGDRYH)=PRH_TEND(:, IRGDRYH)*(XCOLGH*EXP(XCOLEXGH*(PT(:)-XTT)))
     END WHERE
   END IF
@@ -347,7 +363,10 @@ ENDIF
 !
 IGWET = 0
 DO JJ = 1, SIZE(GWET)
-  IF (PRHT(JJ)>XRTMIN(7) .AND. PRRT(JJ)>XRTMIN(3) .AND. LDCOMPUTE(JJ)) THEN
+  ZWET(JJ)=MAX(0., -SIGN(1., XRTMIN(7)-PRHT(JJ))) * & ! WHERE(PRHT(:)>XRTMIN(7))
+          &MAX(0., -SIGN(1., XRTMIN(3)-PRRT(JJ))) * & ! WHERE(PRRT(:)>XRTMIN(3))
+          &PCOMPUTE(JJ)
+  IF (PRHT(JJ)>XRTMIN(7) .AND. PRRT(JJ)>XRTMIN(3) .AND. PCOMPUTE(JJ)>0.) THEN
     IGWET = IGWET + 1
     I1(IGWET) = JJ
     GWET(JJ) = .TRUE.
@@ -357,9 +376,9 @@ DO JJ = 1, SIZE(GWET)
 END DO
 
 IF(LDSOFT) THEN
-  WHERE(.NOT. GWET(:))
-    PRH_TEND(:, IRRWETH)=0.
-  END WHERE
+  DO JL=1, KSIZE
+    PRH_TEND(JL, IRRWETH)=ZWET(JL) * PRH_TEND(JL, IRRWETH)
+  ENDDO
 ELSE
   PRH_TEND(:, IRRWETH)=0.
   IF(IGWET>0)THEN
@@ -412,122 +431,147 @@ ELSE
   ENDIF
 ENDIF
 !
-ZRDRYH_INIT(:)=PRH_TEND(:, IRCWETH)+PRH_TEND(:, IRIDRYH)+PRH_TEND(:, IRSDRYH)+PRH_TEND(:, IRRWETH)+PRH_TEND(:, IRGDRYH)
+DO JL=1, KSIZE
+  ZRDRYH_INIT(JL)=PRH_TEND(JL, IRCWETH)+PRH_TEND(JL, IRIDRYH)+ &
+                 &PRH_TEND(JL, IRSDRYH)+PRH_TEND(JL, IRRWETH)+PRH_TEND(JL, IRGDRYH)
+ENDDO
 !
 !*       7.3    compute the Wet growth of hail
 !
-GHAIL(:) = PRHT(:)>XRTMIN(7) .AND. LDCOMPUTE(:)
-ZRWETH_INIT(:)=0.
-WHERE(GHAIL(:))
-  ZRWETH_INIT(:) = PRVT(:)*PPRES(:)/((XMV/XMD)+PRVT(:)) ! Vapor pressure
-END WHERE
-IF(LEVLIMIT) THEN
-  WHERE(GHAIL(:))
-    ZRWETH_INIT(:) = MIN(ZRWETH_INIT(:), EXP(XALPI-XBETAI/PT(:)-XGAMI*ALOG(PT(:)))) ! min(ev, es_i(T))
+DO JL=1, KSIZE
+  ZHAIL(JL)=MAX(0., -SIGN(1., XRTMIN(7)-PRHT(JL))) * & ! WHERE(PRHT(:)>XRTMIN(7))
+           &PCOMPUTE(JL)
+ENDDO
+IF(LDSOFT) THEN
+  DO JL=1, KSIZE
+    PRH_TEND(JL, IFREEZ1)=ZHAIL(JL) * PRH_TEND(JL, IFREEZ1)
+    PRH_TEND(JL, IFREEZ2)=ZHAIL(JL) * PRH_TEND(JL, IFREEZ2)
+  ENDDO
+ELSE
+  DO JL=1, KSIZE
+    PRH_TEND(JL, IFREEZ1)=PRVT(JL)*PPRES(JL)/(XEPSILO+PRVT(JL)) ! Vapor pressure
+  ENDDO
+  IF(LEVLIMIT) THEN
+    WHERE(ZHAIL(:)==1.)
+      PRH_TEND(:, IFREEZ1)=MIN(PRH_TEND(:, IFREEZ1), EXP(XALPI-XBETAI/PT(:)-XGAMI*ALOG(PT(:)))) ! min(ev, es_i(T))
+    END WHERE
+  ENDIF
+  PRH_TEND(:, IFREEZ2)=0.
+  WHERE(ZHAIL(:)==1.)
+    PRH_TEND(:, IFREEZ1)=PKA(:)*(XTT-PT(:)) +                              &
+             (PDV(:)*(XLVTT+(XCPV-XCL)*(PT(:)-XTT)) &
+                           *(XESTT-PRH_TEND(:, IFREEZ1))/(XRV*PT(:))           )
+    PRH_TEND(:, IFREEZ1)=PRH_TEND(:, IFREEZ1)* ( X0DEPH*       PLBDAH(:)**XEX0DEPH +     &
+                           X1DEPH*PCJ(:)*PLBDAH(:)**XEX1DEPH )/ &
+                          ( PRHODREF(:)*(XLMTT-XCL*(XTT-PT(:))) )
+    PRH_TEND(:, IFREEZ2)=(PRHODREF(:)*(XLMTT+(XCI-XCL)*(XTT-PT(:)))   ) / &
+                          ( PRHODREF(:)*(XLMTT-XCL*(XTT-PT(:))) )
   END WHERE
 ENDIF
-WHERE(GHAIL(:))
-  ZRWETH_INIT(:) = PKA(:)*(XTT-PT(:)) +                                 &
-            ( PDV(:)*(XLVTT + ( XCPV - XCL ) * ( PT(:) - XTT )) &
-                        *(XESTT-ZRWETH_INIT(:))/(XRV*PT(:))             )
-  !
-  ! compute RWETH
-  !
-  ZRWETH_INIT(:)  =  MAX(0.,  ( ZRWETH_INIT(:) * ( X0DEPH*       PLBDAH(:)**XEX0DEPH +     &
-                            X1DEPH*PCJ(:)*PLBDAH(:)**XEX1DEPH ) +   &
-               ( PRH_TEND(:, IRIWETH)+PRH_TEND(:, IRSWETH)+PRH_TEND(:, IRGWETH) ) *                  &
-               ( PRHODREF(:)*(XLMTT+(XCI-XCL)*(XTT-PT(:)))   ) ) / &
-                     ( PRHODREF(:)*(XLMTT-XCL*(XTT-PT(:))) ) )
-  ZRWETH_INIT(:)=MAX(ZRWETH_INIT(:), PRH_TEND(:, IRIWETH)+PRH_TEND(:, IRSWETH)+PRH_TEND(:, IRGWETH))
-END WHERE
+DO JL=1, KSIZE
+  !We must agregate, at least, the cold species
+  ZRWETH_INIT(JL)=ZHAIL(JL) * MAX(PRH_TEND(JL, IRIWETH)+PRH_TEND(JL, IRSWETH)+PRH_TEND(JL, IRGWETH), &
+                                 &MAX(0., PRH_TEND(JL, IFREEZ1) + &
+                                         &PRH_TEND(JL, IFREEZ2) * ( &
+                     &PRH_TEND(JL, IRIWETH)+PRH_TEND(JL, IRSWETH)+PRH_TEND(JL, IRGWETH) )))
+ENDDO
 !
 !*       7.4    Select Wet or Dry case
 !
 !Wet case
-LLWETH(:)=GHAIL(:) .AND. MAX(0., ZRDRYH_INIT(:)-PRH_TEND(:, IRIDRYH)-PRH_TEND(:, IRSDRYH)-PRH_TEND(:, IRGDRYH))>= &
-                       & MAX(0., ZRWETH_INIT(:)-PRH_TEND(:, IRIWETH)-PRH_TEND(:, IRSWETH)-PRH_TEND(:, IRGWETH))
+DO JL=1, KSIZE
+  ZWETH(JL) = ZHAIL(JL) * &
+            & MAX(0., SIGN(1., MAX(0., ZRDRYH_INIT(JL)-PRH_TEND(JL, IRIDRYH)-PRH_TEND(JL, IRSDRYH)-PRH_TEND(JL, IRGDRYH)) - &
+                              &MAX(0., ZRWETH_INIT(JL)-PRH_TEND(JL, IRIWETH)-PRH_TEND(JL, IRSWETH)-PRH_TEND(JL, IRGWETH))))
+ENDDO
 IF(LNULLWETH) THEN
-  LLWETH(:)=LLWETH(:) .AND. ZRDRYH_INIT(:)>0.
+  DO JL=1, KSIZE
+    ZWETH(JL) = ZWETH(JL) * MAX(0., -SIGN(1., -ZRDRYH_INIT(JL))) ! WHERE(ZRDRYH_INIT(:)>0.)
+  ENDDO
 ELSE
-  LLWETH(:)=LLWETH(:) .AND. ZRWETH_INIT(:)>0.
+  DO JL=1, KSIZE
+    ZWETH(JL) = ZWETH(JL) * MAX(0., -SIGN(1., -ZRWETH_INIT(JL))) ! WHERE(ZRWETH_INIT(:)>0.)
+  ENDDO
 ENDIF
-IF(.NOT. LWETHPOST) LLWETH(:)=LLWETH(:) .AND. PT(:)<XTT
-LLDRYH(:)=GHAIL(:) .AND. PT(:)<XTT .AND. ZRDRYH_INIT(:)>0. .AND. &
-                      & MAX(0., ZRDRYH_INIT(:)-PRH_TEND(:, IRIDRYH)-PRH_TEND(:, IRSDRYH))< &
-                      & MAX(0., ZRWETH_INIT(:)-PRH_TEND(:, IRIWETH)-PRH_TEND(:, IRSWETH))
+IF(.NOT. LWETHPOST) THEN
+  DO JL=1, KSIZE
+    ZWETH(JL) = ZWETH(JL) * MAX(0., -SIGN(1., PT(JL)-XTT)) ! WHERE(PT(:)<XTT)
+  ENDDO
+ENDIF
+DO JL=1, KSIZE
+  ZDRYH(JL) = ZHAIL(JL) * &
+            & MAX(0., -SIGN(1., PT(JL)-XTT)) * & ! WHERE(PT(:)<XTT)
+            & MAX(0., -SIGN(1., 1.E-20-ZRDRYH_INIT(JL))) * & !WHERE(ZRDRYH_INIT(:)>0.)
+            & MAX(0., -SIGN(1., MAX(0., ZRDRYH_INIT(JL)-PRH_TEND(JL, IRIDRYH)-PRH_TEND(JL, IRSDRYH)) - &
+                               &MAX(0., ZRWETH_INIT(JL)-PRH_TEND(JL, IRIWETH)-PRH_TEND(JL, IRSWETH))))
+ENDDO
 !
-PRCWETH(:)=0.
-PRIWETH(:)=0.
-PRSWETH(:)=0.
-PRGWETH(:)=0.
-PRRWETH(:)=0.
-WHERE (LLWETH(:))
-  PRCWETH(:) = PRH_TEND(:, IRCWETH)
-  PRIWETH(:) = PRH_TEND(:, IRIWETH)
-  PRSWETH(:) = PRH_TEND(:, IRSWETH)
-  PRGWETH(:) = PRH_TEND(:, IRGWETH)
-  !Collected minus aggregated
-  PRRWETH(:) = ZRWETH_INIT(:) - PRH_TEND(:, IRIWETH) - PRH_TEND(:, IRSWETH) - PRH_TEND(:, IRGWETH) - PRH_TEND(:, IRCWETH)
-END WHERE
-
-PRCDRYH(:) = 0.
-PRIDRYH(:) = 0.
-PRSDRYH(:) = 0.
-PRRDRYH(:) = 0.
-PRGDRYH(:) = 0.
-PRDRYHG(:) = 0.
 ZRDRYHG(:)=0.
 IF(LCONVHG)THEN
-  WHERE(LLDRYH(:))
+  WHERE(ZDRYH(:)==1.)
     ZRDRYHG(:)=ZRDRYH_INIT(:)*ZRWETH_INIT(:)/(ZRDRYH_INIT(:)+ZRWETH_INIT(:))
   END WHERE
 ENDIF
-WHERE(LLDRYH(:)) ! Dry
-  PRCDRYH(:) = PRH_TEND(:, IRCWETH)
-  PRIDRYH(:) = PRH_TEND(:, IRIDRYH)
-  PRSDRYH(:) = PRH_TEND(:, IRSDRYH)
-  PRRDRYH(:) = PRH_TEND(:, IRRWETH)
-  PRGDRYH(:) = PRH_TEND(:, IRGDRYH)
-  PRDRYHG(:) = ZRDRYHG(:)
-END WHERE
-PA_RC(:) = PA_RC(:) - PRCWETH(:)
-PA_RI(:) = PA_RI(:) - PRIWETH(:)
-PA_RS(:) = PA_RS(:) - PRSWETH(:)
-PA_RG(:) = PA_RG(:) - PRGWETH(:)
-PA_RH(:) = PA_RH(:) + PRCWETH(:)+PRIWETH(:)+PRSWETH(:)+PRGWETH(:)+PRRWETH
-PA_RR(:) = PA_RR(:) - PRRWETH(:)
-PA_TH(:) = PA_TH(:) + (PRRWETH(:)+PRCWETH(:))*(PLSFACT(:)-PLVFACT(:))
-PA_RC(:) = PA_RC(:) - PRCDRYH(:)
-PA_RI(:) = PA_RI(:) - PRIDRYH(:)
-PA_RS(:) = PA_RS(:) - PRSDRYH(:)
-PA_RR(:) = PA_RR(:) - PRRDRYH(:)
-PA_RG(:) = PA_RG(:) - PRGDRYH(:) + PRDRYHG(:)
-PA_RH(:) = PA_RH(:) + PRCDRYH(:)+PRIDRYH(:)+PRSDRYH(:)+PRRDRYH(:)+PRGDRYH(:) - PRDRYHG(:)
-PA_TH(:) = PA_TH(:) + (PRCDRYH(:)+PRRDRYH(:))*(PLSFACT(:)-PLVFACT(:))
+DO JL=1, KSIZE
+  PRCWETH(JL) = ZWETH(JL) * PRH_TEND(JL, IRCWETH)
+  PRIWETH(JL) = ZWETH(JL) * PRH_TEND(JL, IRIWETH)
+  PRSWETH(JL) = ZWETH(JL) * PRH_TEND(JL, IRSWETH)
+  PRGWETH(JL) = ZWETH(JL) * PRH_TEND(JL, IRGWETH)
+  !Collected minus aggregated
+  PRRWETH(JL) = ZWETH(JL) * (ZRWETH_INIT(JL) - PRH_TEND(JL, IRIWETH) - &
+                             PRH_TEND(JL, IRSWETH) - PRH_TEND(JL, IRGWETH) - &
+                             PRH_TEND(JL, IRCWETH))
+
+  PRCDRYH(JL) = ZDRYH(JL) * PRH_TEND(JL, IRCWETH)
+  PRIDRYH(JL) = ZDRYH(JL) * PRH_TEND(JL, IRIDRYH)
+  PRSDRYH(JL) = ZDRYH(JL) * PRH_TEND(JL, IRSDRYH)
+  PRRDRYH(JL) = ZDRYH(JL) * PRH_TEND(JL, IRRWETH)
+  PRGDRYH(JL) = ZDRYH(JL) * PRH_TEND(JL, IRGDRYH)
+  PRDRYHG(JL) = ZDRYH(JL) * ZRDRYHG(JL)
+
+  PA_RC(JL) = PA_RC(JL) - PRCWETH(JL)
+  PA_RI(JL) = PA_RI(JL) - PRIWETH(JL)
+  PA_RS(JL) = PA_RS(JL) - PRSWETH(JL)
+  PA_RG(JL) = PA_RG(JL) - PRGWETH(JL)
+  PA_RH(JL) = PA_RH(JL) + PRCWETH(JL)+PRIWETH(JL)+PRSWETH(JL)+PRGWETH(JL)+PRRWETH(JL)
+  PA_RR(JL) = PA_RR(JL) - PRRWETH(JL)
+  PA_TH(JL) = PA_TH(JL) + (PRRWETH(JL)+PRCWETH(JL))*(PLSFACT(JL)-PLVFACT(JL))
+  PA_RC(JL) = PA_RC(JL) - PRCDRYH(JL)
+  PA_RI(JL) = PA_RI(JL) - PRIDRYH(JL)
+  PA_RS(JL) = PA_RS(JL) - PRSDRYH(JL)
+  PA_RR(JL) = PA_RR(JL) - PRRDRYH(JL)
+  PA_RG(JL) = PA_RG(JL) - PRGDRYH(JL) + PRDRYHG(JL)
+  PA_RH(JL) = PA_RH(JL) + PRCDRYH(JL)+PRIDRYH(JL)+PRSDRYH(JL)+&
+                         &PRRDRYH(JL)+PRGDRYH(JL) - PRDRYHG(JL)
+  PA_TH(JL) = PA_TH(JL) + (PRCDRYH(JL)+PRRDRYH(JL))*(PLSFACT(JL)-PLVFACT(JL))
+ENDDO
 !
 !*       7.5    Melting of the hailstones
 !
-GMASK(:)=PRHT(:)>XRTMIN(7) .AND. PT(:)>XTT .AND. LDCOMPUTE(:)
+DO JL=1, KSIZE
+  ZMASK(JL)=MAX(0., -SIGN(1., XRTMIN(7)-PRHT(JL))) * & ! WHERE(PRHT(:)>XRTMIN(7))
+           &MAX(0., -SIGN(1., XTT-PT(JL))) * & ! WHERE(PT(:)>XTT)
+           &PCOMPUTE(JL)
+ENDDO
 IF(LDSOFT) THEN
-  WHERE(.NOT. GMASK(:))
-    PRHMLTR(:) = 0.
-  END WHERE
+  DO JL=1, KSIZE
+    PRHMLTR(JL)=ZMASK(JL)*PRHMLTR(JL)
+  ENDDO
 ELSE
-  PRHMLTR(:) = 0.0
-  WHERE(GMASK(:))
-    PRHMLTR(:) = PRVT(:)*PPRES(:)/((XMV/XMD)+PRVT(:)) ! Vapor pressure
-  END WHERE
+  DO JL=1, KSIZE
+    PRHMLTR(JL) = ZMASK(JL)* PRVT(JL)*PPRES(JL)/(XEPSILO+PRVT(JL)) ! Vapor pressure
+  ENDDO
   IF(LEVLIMIT) THEN
-    WHERE(GMASK(:))
+    WHERE(ZMASK(:)==1.)
       PRHMLTR(:)=MIN(PRHMLTR(:), EXP(XALPW-XBETAW/PT(:)-XGAMW*ALOG(PT(:)))) ! min(ev, es_w(T))
     END WHERE
   ENDIF
-  WHERE(GMASK(:))
-    PRHMLTR(:) = PKA(:)*(XTT-PT(:)) +                              &
-           ( PDV(:)*(XLVTT + ( XCPV - XCL ) * ( PT(:) - XTT )) &
-                           *(XESTT-PRHMLTR(:))/(XRV*PT(:))         )
-  END WHERE
-  WHERE(GMASK(:))
+  DO JL=1, KSIZE
+    PRHMLTR(JL) = ZMASK(JL)* (PKA(JL)*(XTT-PT(JL)) +                              &
+           ( PDV(JL)*(XLVTT + ( XCPV - XCL ) * ( PT(JL) - XTT )) &
+                           *(XESTT-PRHMLTR(JL))/(XRV*PT(JL))         ))
+  ENDDO
+  WHERE(ZMASK(:)==1.)
     !
     ! compute RHMLTR
     !
@@ -539,9 +583,11 @@ ELSE
                                              ( PRHODREF(:)*XLMTT ) )
   END WHERE
 END IF
-PA_RR(:) = PA_RR(:) + PRHMLTR(:)
-PA_RH(:) = PA_RH(:) - PRHMLTR(:)
-PA_TH(:) = PA_TH(:) - PRHMLTR(:)*(PLSFACT(:)-PLVFACT(:))
+DO JL=1, KSIZE
+  PA_RR(JL) = PA_RR(JL) + PRHMLTR(JL)
+  PA_RH(JL) = PA_RH(JL) - PRHMLTR(JL)
+  PA_TH(JL) = PA_TH(JL) - PRHMLTR(JL)*(PLSFACT(JL)-PLVFACT(JL))
+ENDDO
 !
 !
 END SUBROUTINE ICE4_FAST_RH
diff --git a/src/MNH/ice4_fast_ri.f90 b/src/MNH/ice4_fast_ri.f90
index 1a067377a..469b6cf3d 100644
--- a/src/MNH/ice4_fast_ri.f90
+++ b/src/MNH/ice4_fast_ri.f90
@@ -5,7 +5,7 @@
 !-------------------------------------------------------------------------------
 MODULE MODI_ICE4_FAST_RI
 INTERFACE
-SUBROUTINE ICE4_FAST_RI(KSIZE, LDSOFT, LDCOMPUTE, &
+SUBROUTINE ICE4_FAST_RI(KSIZE, LDSOFT, PCOMPUTE, &
                        &PRHODREF, PLVFACT, PLSFACT, &
                        &PAI, PCJ, PCIT, &
                        &PSSI, &
@@ -25,7 +25,7 @@ IMPLICIT NONE
 !
 INTEGER,                      INTENT(IN)    :: KSIZE
 LOGICAL,                      INTENT(IN)    :: LDSOFT
-LOGICAL, DIMENSION(KSIZE),    INTENT(IN)    :: LDCOMPUTE
+REAL, DIMENSION(KSIZE),       INTENT(IN)    :: PCOMPUTE
 REAL, DIMENSION(KSIZE),       INTENT(IN)    :: PRHODREF ! Reference density
 REAL, DIMENSION(KSIZE),       INTENT(IN)    :: PLVFACT
 REAL, DIMENSION(KSIZE),       INTENT(IN)    :: PLSFACT
@@ -42,7 +42,7 @@ REAL, DIMENSION(KSIZE),       INTENT(INOUT) :: PA_RI
 END SUBROUTINE ICE4_FAST_RI
 END INTERFACE
 END MODULE MODI_ICE4_FAST_RI
-SUBROUTINE ICE4_FAST_RI(KSIZE, LDSOFT, LDCOMPUTE, &
+SUBROUTINE ICE4_FAST_RI(KSIZE, LDSOFT, PCOMPUTE, &
                        &PRHODREF, PLVFACT, PLSFACT, &
                        &PAI, PCJ, PCIT, &
                        &PSSI, &
@@ -74,7 +74,7 @@ IMPLICIT NONE
 !
 INTEGER,                      INTENT(IN)    :: KSIZE
 LOGICAL,                      INTENT(IN)    :: LDSOFT
-LOGICAL, DIMENSION(KSIZE),    INTENT(IN)    :: LDCOMPUTE
+REAL, DIMENSION(KSIZE),       INTENT(IN)    :: PCOMPUTE
 REAL, DIMENSION(KSIZE),       INTENT(IN)    :: PRHODREF ! Reference density
 REAL, DIMENSION(KSIZE),       INTENT(IN)    :: PLVFACT
 REAL, DIMENSION(KSIZE),       INTENT(IN)    :: PLSFACT
@@ -91,7 +91,8 @@ REAL, DIMENSION(KSIZE),       INTENT(INOUT) :: PA_RI
 !
 !*       0.2  declaration of local variables
 !
-LOGICAL, DIMENSION(SIZE(PRHODREF)) :: GMASK
+REAL, DIMENSION(KSIZE) :: ZMASK
+INTEGER :: JL
 !
 !-------------------------------------------------------------------------------
 !
@@ -99,23 +100,30 @@ LOGICAL, DIMENSION(SIZE(PRHODREF)) :: GMASK
 !
 !*       7.2    Bergeron-Findeisen effect: RCBERI
 !
-GMASK(:)=PSSI(:)>0. .AND. PRCT(:)>XRTMIN(2) .AND. PRIT(:)>XRTMIN(4) .AND. &
-        &PCIT(:)>0. .AND. LDCOMPUTE(:)
+DO JL=1, KSIZE
+  ZMASK(JL)=MAX(0., -SIGN(1., -PSSI(JL))) * &          ! PSSI(:)>0.
+           &MAX(0., -SIGN(1., XRTMIN(2)-PRCT(JL))) * & ! PRCT(:)>XRTMIN(2)
+           &MAX(0., -SIGN(1., XRTMIN(4)-PRIT(JL))) * & ! PRIT(:)>XRTMIN(4)
+           &MAX(0., -SIGN(1., 1.E-20-PCIT(JL))) * &          ! PCIT(:)>0.
+           &PCOMPUTE(JL)
+ENDDO
 IF(LDSOFT) THEN
-  WHERE(.NOT. GMASK(:))
-    PRCBERI(:) = 0.
-  END WHERE
+  DO JL=1, KSIZE
+    PRCBERI(JL) = PRCBERI(JL) * ZMASK(JL)
+  ENDDO
 ELSE
   PRCBERI(:) = 0.
-  WHERE(GMASK(:))
+  WHERE(ZMASK(:)==1.)
     PRCBERI(:) = MIN(1.E8, XLBI*(PRHODREF(:)*PRIT(:)/PCIT(:))**XLBEXI) ! Lbda_i
     PRCBERI(:) = ( PSSI(:) / (PRHODREF(:)*PAI(:)) ) * PCIT(:) * &
                  ( X0DEPI/PRCBERI(:) + X2DEPI*PCJ(:)*PCJ(:)/PRCBERI(:)**(XDI+2.0) )
   END WHERE
 ENDIF
-PA_RC(:) = PA_RC(:) - PRCBERI(:)
-PA_RI(:) = PA_RI(:) + PRCBERI(:)
-PA_TH(:) = PA_TH(:) + PRCBERI(:)*(PLSFACT(:)-PLVFACT(:))
+DO JL=1, KSIZE
+  PA_RC(JL) = PA_RC(JL) - PRCBERI(JL)
+  PA_RI(JL) = PA_RI(JL) + PRCBERI(JL)
+  PA_TH(JL) = PA_TH(JL) + PRCBERI(JL)*(PLSFACT(JL)-PLVFACT(JL))
+ENDDO
 !
 !
 END SUBROUTINE ICE4_FAST_RI
diff --git a/src/MNH/ice4_fast_rs.f90 b/src/MNH/ice4_fast_rs.f90
index b4cf9bd3b..83f8e6ccf 100644
--- a/src/MNH/ice4_fast_rs.f90
+++ b/src/MNH/ice4_fast_rs.f90
@@ -5,7 +5,7 @@
 !-----------------------------------------------------------------
 MODULE MODI_ICE4_FAST_RS
 INTERFACE
-SUBROUTINE ICE4_FAST_RS(KSIZE, LDSOFT, LDCOMPUTE, &
+SUBROUTINE ICE4_FAST_RS(KSIZE, LDSOFT, PCOMPUTE, &
                        &PRHODREF, PLVFACT, PLSFACT, PPRES, &
                        &PDV, PKA, PCJ, &
                        &PLBDAR, PLBDAS, &
@@ -19,7 +19,7 @@ SUBROUTINE ICE4_FAST_RS(KSIZE, LDSOFT, LDCOMPUTE, &
 IMPLICIT NONE
 INTEGER,                      INTENT(IN)    :: KSIZE
 LOGICAL,                      INTENT(IN)    :: LDSOFT
-LOGICAL, DIMENSION(KSIZE),    INTENT(IN)    :: LDCOMPUTE
+REAL, DIMENSION(KSIZE),       INTENT(IN)    :: PCOMPUTE
 REAL, DIMENSION(KSIZE),       INTENT(IN)    :: PRHODREF ! Reference density
 REAL, DIMENSION(KSIZE),       INTENT(IN)    :: PLVFACT
 REAL, DIMENSION(KSIZE),       INTENT(IN)    :: PLSFACT
@@ -43,7 +43,7 @@ REAL, DIMENSION(KSIZE),       INTENT(OUT)   :: PRRACCSG ! Rain accretion onto th
 REAL, DIMENSION(KSIZE),       INTENT(OUT)   :: PRSACCRG ! Rain accretion onto the aggregates
 REAL, DIMENSION(KSIZE),       INTENT(INOUT) :: PRSMLTG  ! Conversion-Melting of the aggregates
 REAL, DIMENSION(KSIZE),       INTENT(INOUT) :: PRCMLTSR ! Cloud droplet collection onto aggregates by positive temperature
-REAL, DIMENSION(KSIZE, 6),    INTENT(INOUT) :: PRS_TEND ! Individual tendencies
+REAL, DIMENSION(KSIZE, 8),    INTENT(INOUT) :: PRS_TEND ! Individual tendencies
 REAL, DIMENSION(KSIZE),       INTENT(INOUT) :: PA_TH
 REAL, DIMENSION(KSIZE),       INTENT(INOUT) :: PA_RC
 REAL, DIMENSION(KSIZE),       INTENT(INOUT) :: PA_RR
@@ -52,7 +52,7 @@ REAL, DIMENSION(KSIZE),       INTENT(INOUT) :: PA_RG
 END SUBROUTINE ICE4_FAST_RS
 END INTERFACE
 END MODULE MODI_ICE4_FAST_RS
-SUBROUTINE ICE4_FAST_RS(KSIZE, LDSOFT, LDCOMPUTE, &
+SUBROUTINE ICE4_FAST_RS(KSIZE, LDSOFT, PCOMPUTE, &
                        &PRHODREF, PLVFACT, PLSFACT, PPRES, &
                        &PDV, PKA, PCJ, &
                        &PLBDAR, PLBDAS, &
@@ -82,7 +82,8 @@ SUBROUTINE ICE4_FAST_RS(KSIZE, LDSOFT, LDCOMPUTE, &
 !*      0. DECLARATIONS
 !          ------------
 !
-USE MODD_CST,            ONLY: XALPI,XALPW,XBETAI,XBETAW,XCI,XCL,XCPV,XESTT,XGAMI,XGAMW,XLMTT,XLVTT,XMD,XMV,XRV,XTT
+USE MODD_CST,            ONLY: XALPI,XALPW,XBETAI,XBETAW,XCI,XCL,XCPV,XESTT,XGAMI,XGAMW,XLMTT,XLVTT,XMD,XMV,XRV,XTT,  &
+                               XEPSILO
 USE MODD_PARAM_ICE,      ONLY: LEVLIMIT, CSNOWRIMING
 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, &
@@ -97,7 +98,7 @@ IMPLICIT NONE
 !
 INTEGER,                      INTENT(IN)    :: KSIZE
 LOGICAL,                      INTENT(IN)    :: LDSOFT
-LOGICAL, DIMENSION(KSIZE),    INTENT(IN)    :: LDCOMPUTE
+REAL, DIMENSION(KSIZE),       INTENT(IN)    :: PCOMPUTE
 REAL, DIMENSION(KSIZE),       INTENT(IN)    :: PRHODREF ! Reference density
 REAL, DIMENSION(KSIZE),       INTENT(IN)    :: PLVFACT
 REAL, DIMENSION(KSIZE),       INTENT(IN)    :: PLSFACT
@@ -121,7 +122,7 @@ REAL, DIMENSION(KSIZE),       INTENT(OUT)   :: PRRACCSG ! Rain accretion onto th
 REAL, DIMENSION(KSIZE),       INTENT(OUT)   :: PRSACCRG ! Rain accretion onto the aggregates
 REAL, DIMENSION(KSIZE),       INTENT(INOUT) :: PRSMLTG  ! Conversion-Melting of the aggregates
 REAL, DIMENSION(KSIZE),       INTENT(INOUT) :: PRCMLTSR ! Cloud droplet collection onto aggregates by positive temperature
-REAL, DIMENSION(KSIZE, 6),    INTENT(INOUT) :: PRS_TEND ! Individual tendencies
+REAL, DIMENSION(KSIZE, 8),    INTENT(INOUT) :: PRS_TEND ! Individual tendencies
 REAL, DIMENSION(KSIZE),       INTENT(INOUT) :: PA_TH
 REAL, DIMENSION(KSIZE),       INTENT(INOUT) :: PA_RC
 REAL, DIMENSION(KSIZE),       INTENT(INOUT) :: PA_RR
@@ -130,50 +131,68 @@ REAL, DIMENSION(KSIZE),       INTENT(INOUT) :: PA_RG
 !
 !*       0.2  declaration of local variables
 !
-INTEGER, PARAMETER :: IRCRIMS=1, IRCRIMSS=2, IRSRIMCG=3, IRRACCS=4, IRRACCSS=5, IRSACCRG=6
+INTEGER, PARAMETER :: IRCRIMS=1, IRCRIMSS=2, IRSRIMCG=3, IRRACCS=4, IRRACCSS=5, IRSACCRG=6, &
+                    & IFREEZ1=7, IFREEZ2=8
 !
-LOGICAL, DIMENSION(SIZE(PRHODREF)) :: GRIM, GACC, GMASK
+REAL, DIMENSION(KSIZE) :: ZRIM, ZACC, ZMASK
+LOGICAL, DIMENSION(KSIZE) :: GRIM, GACC
 INTEGER :: IGRIM, IGACC
-REAL, DIMENSION(SIZE(PRHODREF)) :: ZVEC1, ZVEC2, ZVEC3
-INTEGER, DIMENSION(SIZE(PRHODREF)) :: I1
-INTEGER, DIMENSION(SIZE(PRHODREF)) :: IVEC1, IVEC2
-REAL, DIMENSION(SIZE(PRHODREF)) :: ZZW, ZZW2, ZZW6, ZFREEZ_RATE
-INTEGER :: JJ
+INTEGER, DIMENSION(KSIZE) :: I1
+REAL, DIMENSION(KSIZE) :: ZVEC1, ZVEC2, ZVEC3
+INTEGER, DIMENSION(KSIZE) :: IVEC1, IVEC2
+REAL, DIMENSION(KSIZE) :: ZZW, ZZW2, ZZW6, ZFREEZ_RATE
+INTEGER :: JJ, JL
 !-------------------------------------------------------------------------------
 !
 !
 !*       5.0    maximum freezing rate
 !
-ZFREEZ_RATE(:)=0.
-GMASK(:)=PRST(:)>XRTMIN(5) .AND. LDCOMPUTE(:)
-WHERE(GMASK(:))
-  ZFREEZ_RATE(:)=PRVT(:)*PPRES(:)/((XMV/XMD)+PRVT(:)) ! Vapor pressure
-END WHERE
-IF(LEVLIMIT) THEN
-  WHERE(GMASK(:))
-    ZFREEZ_RATE(:)=MIN(ZFREEZ_RATE(:), EXP(XALPI-XBETAI/PT(:)-XGAMI*ALOG(PT(:)))) ! min(ev, es_i(T))
+DO JL=1, KSIZE
+  ZMASK(JL)=MAX(0., -SIGN(1., XRTMIN(5)-PRST(JL))) * & ! WHERE(PRST(:)>XRTMIN(5))
+           &PCOMPUTE(JL)
+ENDDO
+IF(LDSOFT) THEN
+  DO JL=1, KSIZE
+    PRS_TEND(JL, IFREEZ1)=ZMASK(JL) * PRS_TEND(JL, IFREEZ1)
+    PRS_TEND(JL, IFREEZ2)=ZMASK(JL) * PRS_TEND(JL, IFREEZ2)
+  ENDDO
+ELSE
+  DO JL=1, KSIZE
+    PRS_TEND(JL, IFREEZ1)=ZMASK(JL) * PRVT(JL)*PPRES(JL)/(XEPSILO+PRVT(JL)) ! Vapor pressure
+  ENDDO
+  IF(LEVLIMIT) THEN
+    WHERE(ZMASK(:)==1.)
+      PRS_TEND(:, IFREEZ1)=MIN(PRS_TEND(:, IFREEZ1), EXP(XALPI-XBETAI/PT(:)-XGAMI*ALOG(PT(:)))) ! min(ev, es_i(T))
+    END WHERE
+  ENDIF
+  PRS_TEND(:, IFREEZ2)=0.
+  WHERE(ZMASK(:)==1.)
+    PRS_TEND(:, IFREEZ1)=PKA(:)*(XTT-PT(:)) +                              &
+             (PDV(:)*(XLVTT+(XCPV-XCL)*(PT(:)-XTT)) &
+                           *(XESTT-PRS_TEND(:, IFREEZ1))/(XRV*PT(:))           )
+    PRS_TEND(:, IFREEZ1)=PRS_TEND(:, IFREEZ1)* ( X0DEPS*       PLBDAS(:)**XEX0DEPS +     &
+                           X1DEPS*PCJ(:)*PLBDAS(:)**XEX1DEPS )/ &
+                          ( PRHODREF(:)*(XLMTT-XCL*(XTT-PT(:))) )
+    PRS_TEND(:, IFREEZ2)=(PRHODREF(:)*(XLMTT+(XCI-XCL)*(XTT-PT(:)))   ) / &
+                          ( PRHODREF(:)*(XLMTT-XCL*(XTT-PT(:))) )
   END WHERE
 ENDIF
-WHERE(GMASK(:))
-  ZFREEZ_RATE(:)=PKA(:)*(XTT-PT(:)) +                              &
-           (PDV(:)*(XLVTT+(XCPV-XCL)*(PT(:)-XTT)) &
-                         *(XESTT-ZFREEZ_RATE(:))/(XRV*PT(:))           )
-  ZFREEZ_RATE(:)=MAX(0.,                                               &
-             (ZFREEZ_RATE(:) * ( X0DEPS*       PLBDAS(:)**XEX0DEPS +     &
-                         X1DEPS*PCJ(:)*PLBDAS(:)**XEX1DEPS ) +   &
-             PRIAGGS(:) *                            &
-             (PRHODREF(:)*(XLMTT+(XCI-XCL)*(XTT-PT(:)))   ) ) / &
-                        ( PRHODREF(:)*(XLMTT-XCL*(XTT-PT(:))) )   )
+DO JL=1, KSIZE
   !We must agregate, at least, the cold species
   !And we are only interested by the freezing rate of liquid species
-  ZFREEZ_RATE(:)=MAX(ZFREEZ_RATE(:)-PRIAGGS(:), 0.)
-END WHERE
+  ZFREEZ_RATE(JL)=ZMASK(JL) * MAX(0., MAX(0., PRS_TEND(JL, IFREEZ1) + &
+                                              &PRS_TEND(JL, IFREEZ2) * PRIAGGS(JL)) - &
+                                      PRIAGGS(JL))
+ENDDO
 !
 !*       5.1    cloud droplet riming of the aggregates
 !
 IGRIM = 0
 DO JJ = 1, SIZE(GRIM)
-  IF (PRCT(JJ)>XRTMIN(2) .AND. PRST(JJ)>XRTMIN(5) .AND. LDCOMPUTE(JJ)) THEN
+  ZRIM(JJ)=MAX(0., -SIGN(1., XRTMIN(2)-PRCT(JJ))) * & !WHERE(PRCT(:)>XRTMIN(2))
+          &MAX(0., -SIGN(1., XRTMIN(5)-PRST(JJ))) * & !WHERE(PRST(:)>XRTMIN(5))
+          &PCOMPUTE(JJ)
+  IF (PRCT(JJ)>XRTMIN(2) .AND. PRST(JJ)>XRTMIN(5) .AND. PCOMPUTE(JJ)>0.) THEN
     IGRIM = IGRIM + 1
     I1(IGRIM) = JJ
     GRIM(JJ) = .TRUE.
@@ -184,11 +203,11 @@ END DO
 !
 ! Collection of cloud droplets by snow: this rate is used for riming (T<0) and for conversion/melting (T>0)
 IF(LDSOFT) THEN
-  WHERE(.NOT. GRIM(:))
-    PRS_TEND(:, IRCRIMS)=0.
-    PRS_TEND(:, IRCRIMSS)=0.
-    PRS_TEND(:, IRSRIMCG)=0.
-  END WHERE
+  DO JL=1, KSIZE
+    PRS_TEND(JL, IRCRIMS)=ZRIM(JL) * PRS_TEND(JL, IRCRIMS)
+    PRS_TEND(JL, IRCRIMSS)=ZRIM(JL) * PRS_TEND(JL, IRCRIMSS)
+    PRS_TEND(JL, IRSRIMCG)=ZRIM(JL) * PRS_TEND(JL, IRSRIMCG)
+  ENDDO
 ELSE
   PRS_TEND(:, IRCRIMS)=0.
   PRS_TEND(:, IRCRIMSS)=0.
@@ -272,35 +291,37 @@ ELSE
   ENDIF
 ENDIF
 !
-GRIM(:) = GRIM(:) .AND. PT(:)<XTT ! More restrictive GRIM mask to be used for riming by negative temperature only
-PRCRIMSS(:)=0.
-PRCRIMSG(:)=0.
-PRSRIMCG(:)=0.
-WHERE(GRIM(:))
-  PRCRIMSS(:) = MIN(ZFREEZ_RATE(:), PRS_TEND(:, IRCRIMSS))
-  ZFREEZ_RATE(:) = MAX(0., ZFREEZ_RATE(:)-PRCRIMSS(:))
-  ZZW(:) = MIN(1., ZFREEZ_RATE(:) / MAX(1.E-20, PRS_TEND(:, IRCRIMS) - PRCRIMSS(:))) ! proportion we are able to freeze
-  PRCRIMSG(:) = ZZW(:) * MAX(0., PRS_TEND(:, IRCRIMS) - PRCRIMSS(:)) ! RCRIMSG
-  ZFREEZ_RATE(:) = MAX(0., ZFREEZ_RATE(:)-PRCRIMSG(:))
-  PRSRIMCG(:) = ZZW(:) * PRS_TEND(:, IRSRIMCG)
-END WHERE
-WHERE(PRCRIMSG(:)<=0.)
-  PRCRIMSG(:)=0.
-  PRSRIMCG(:)=0.
-END WHERE
-PA_RC(:) = PA_RC(:) - PRCRIMSS(:)
-PA_RS(:) = PA_RS(:) + PRCRIMSS(:)
-PA_TH(:) = PA_TH(:) + PRCRIMSS(:)*(PLSFACT(:)-PLVFACT(:))
-PA_RC(:) = PA_RC(:) - PRCRIMSG(:)
-PA_RS(:) = PA_RS(:) - PRSRIMCG(:)
-PA_RG(:) = PA_RG(:) + PRCRIMSG(:)+PRSRIMCG(:)
-PA_TH(:) = PA_TH(:) + PRCRIMSG(:)*(PLSFACT(:)-PLVFACT(:))
+DO JL=1, KSIZE
+  ! More restrictive RIM mask to be used for riming by negative temperature only
+  ZRIM(JL)=ZRIM(JL) * &
+          &MAX(0., -SIGN(1., PT(JL)-XTT)) ! WHERE(PT(:)<XTT)
+  PRCRIMSS(JL)=ZRIM(JL)*MIN(ZFREEZ_RATE(JL), PRS_TEND(JL, IRCRIMSS))
+  ZFREEZ_RATE(JL)=MAX(0., ZFREEZ_RATE(JL)-PRCRIMSS(JL))
+  ZZW(JL) = MIN(1., ZFREEZ_RATE(JL) / MAX(1.E-20, PRS_TEND(JL, IRCRIMS) - PRCRIMSS(JL))) ! proportion we are able to freeze
+  PRCRIMSG(JL) = ZRIM(JL) * ZZW(JL) * MAX(0., PRS_TEND(JL, IRCRIMS) - PRCRIMSS(JL)) ! RCRIMSG
+  ZFREEZ_RATE(JL)=MAX(0., ZFREEZ_RATE(JL)-PRCRIMSG(JL))
+  PRSRIMCG(JL) = ZRIM(JL) * ZZW(JL) * PRS_TEND(JL, IRSRIMCG)
+
+  PRSRIMCG(JL) = PRSRIMCG(JL) * MAX(0., -SIGN(1., -PRCRIMSG(JL)))
+  PRCRIMSG(JL)=MAX(0., PRCRIMSG(JL))
+
+  PA_RC(JL) = PA_RC(JL) - PRCRIMSS(JL)
+  PA_RS(JL) = PA_RS(JL) + PRCRIMSS(JL)
+  PA_TH(JL) = PA_TH(JL) + PRCRIMSS(JL)*(PLSFACT(JL)-PLVFACT(JL))
+  PA_RC(JL) = PA_RC(JL) - PRCRIMSG(JL)
+  PA_RS(JL) = PA_RS(JL) - PRSRIMCG(JL)
+  PA_RG(JL) = PA_RG(JL) + PRCRIMSG(JL)+PRSRIMCG(JL)
+  PA_TH(JL) = PA_TH(JL) + PRCRIMSG(JL)*(PLSFACT(JL)-PLVFACT(JL))
+ENDDO
 !
 !*       5.2    rain accretion onto the aggregates
 !
 IGACC = 0
 DO JJ = 1, SIZE(GACC)
-  IF (PRRT(JJ)>XRTMIN(3) .AND. PRST(JJ)>XRTMIN(5) .AND. LDCOMPUTE(JJ)) THEN
+  ZACC(JJ)=MAX(0., -SIGN(1., XRTMIN(3)-PRRT(JJ))) * & !WHERE(PRRT(:)>XRTMIN(3))
+          &MAX(0., -SIGN(1., XRTMIN(5)-PRST(JJ))) * & !WHERE(PRST(:)>XRTMIN(5))
+          &PCOMPUTE(JJ)
+  IF (PRRT(JJ)>XRTMIN(3) .AND. PRST(JJ)>XRTMIN(5) .AND. PCOMPUTE(JJ)>0.) THEN
     IGACC = IGACC + 1
     I1(IGACC) = JJ
     GACC(JJ) = .TRUE.
@@ -310,11 +331,11 @@ DO JJ = 1, SIZE(GACC)
 END DO
 
 IF(LDSOFT) THEN
-  WHERE(.NOT. GACC(:))
-    PRS_TEND(:, IRRACCS)=0.
-    PRS_TEND(:, IRRACCSS)=0.
-    PRS_TEND(:, IRSACCRG)=0.
-  END WHERE
+  DO JL=1, KSIZE
+    PRS_TEND(JL, IRRACCS)=ZACC(JL) * PRS_TEND(JL, IRRACCS)
+    PRS_TEND(JL, IRRACCSS)=ZACC(JL) * PRS_TEND(JL, IRRACCSS)
+    PRS_TEND(JL, IRSACCRG)=ZACC(JL) * PRS_TEND(JL, IRSACCRG)
+  ENDDO
 ELSE
   PRS_TEND(:, IRRACCS)=0.
   PRS_TEND(:, IRRACCSS)=0.
@@ -417,54 +438,60 @@ ELSE
   ENDIF
 ENDIF
 !
-GACC(:) = GACC(:) .AND. PT(:)<XTT ! More restrictive GACC mask to be used for accretion by negative temperature only
-PRRACCSS(:)=0.
-PRRACCSG(:)=0.
-PRSACCRG(:)=0.
-WHERE(GACC(:))
-  PRRACCSS(:) = MIN(ZFREEZ_RATE(:), PRS_TEND(:, IRRACCSS))
-  ZFREEZ_RATE(:) = MAX(0., ZFREEZ_RATE(:)-PRRACCSS(:))
-  ZZW(:) = MIN(1., ZFREEZ_RATE(:) / MAX(1.E-20, PRS_TEND(:, IRRACCS)-PRRACCSS(:))) ! proportion we are able to freeze
-  PRRACCSG(:)=ZZW(:) * MAX(0., PRS_TEND(:, IRRACCS)-PRRACCSS(:))
-  ZFREEZ_RATE(:) = MAX(0., ZFREEZ_RATE(:)-PRRACCSG(:))
-  PRSACCRG(:)=ZZW(:) * PRS_TEND(:, IRSACCRG)
-END WHERE
-WHERE(PRRACCSG(:)<=0.)
-  PRRACCSG(:)=0.
-  PRSACCRG(:)=0.
-END WHERE
-PA_RR(:) = PA_RR(:) - PRRACCSS(:)
-PA_RS(:) = PA_RS(:) + PRRACCSS(:)
-PA_TH(:) = PA_TH(:) + PRRACCSS(:)*(PLSFACT(:)-PLVFACT(:))
-PA_RR(:) = PA_RR(:) - PRRACCSG(:)
-PA_RS(:) = PA_RS(:) - PRSACCRG(:)
-PA_RG(:) = PA_RG(:) + PRRACCSG(:)+PRSACCRG(:)
-PA_TH(:) = PA_TH(:) + PRRACCSG(:)*(PLSFACT(:)-PLVFACT(:))
+DO JL=1, KSIZE
+  ! More restrictive ACC mask to be used for accretion by negative temperature only
+  ZACC(JL) = ZACC(JL) * &
+           &MAX(0., -SIGN(1., PT(JL)-XTT)) ! WHERE(PT(:)<XTT)
+  PRRACCSS(JL)=ZACC(JL)*MIN(ZFREEZ_RATE(JL), PRS_TEND(JL, IRRACCSS))
+  ZFREEZ_RATE(JL)=MAX(0., ZFREEZ_RATE(JL)-PRRACCSS(JL))
+  ZZW(JL) = MIN(1., ZFREEZ_RATE(JL) / MAX(1.E-20, PRS_TEND(JL, IRRACCS)-PRRACCSS(JL))) ! proportion we are able to freeze
+  PRRACCSG(JL)=ZACC(JL)*ZZW(JL) * MAX(0., PRS_TEND(JL, IRRACCS)-PRRACCSS(JL))
+  ZFREEZ_RATE(JL) = MAX(0., ZFREEZ_RATE(JL)-PRRACCSG(JL))
+  PRSACCRG(JL)=ZACC(JL)*ZZW(JL) * PRS_TEND(JL, IRSACCRG)
+
+  PRSACCRG(JL) = PRSACCRG(JL) * MAX(0., -SIGN(1., -PRRACCSG(JL)))
+  PRRACCSG(JL)=MAX(0., PRRACCSG(JL))
+
+  PA_RR(JL) = PA_RR(JL) - PRRACCSS(JL)
+  PA_RS(JL) = PA_RS(JL) + PRRACCSS(JL)
+  PA_TH(JL) = PA_TH(JL) + PRRACCSS(JL)*(PLSFACT(JL)-PLVFACT(JL))
+  PA_RR(JL) = PA_RR(JL) - PRRACCSG(JL)
+  PA_RS(JL) = PA_RS(JL) - PRSACCRG(JL)
+  PA_RG(JL) = PA_RG(JL) + PRRACCSG(JL)+PRSACCRG(JL)
+  PA_TH(JL) = PA_TH(JL) + PRRACCSG(JL)*(PLSFACT(JL)-PLVFACT(JL))
+ENDDO
 !
 !
 !*       5.3    Conversion-Melting of the aggregates
 !
-GMASK(:)=PRST(:)>XRTMIN(5) .AND. PT(:)>XTT .AND. LDCOMPUTE(:)
+DO JL=1, KSIZE
+  ZMASK(JL)=MAX(0., -SIGN(1., XRTMIN(5)-PRST(JL))) * & ! WHERE(PRST(:)>XRTMIN(5))
+           &MAX(0., -SIGN(1., XTT-PT(JL))) * & ! WHERE(PT(:)>XTT)
+           &PCOMPUTE(JL)
+ENDDO
 IF(LDSOFT) THEN
-  WHERE(.NOT. GMASK(:))
-    PRSMLTG(:) = 0.
-    PRCMLTSR(:) = 0.
-  END WHERE
+  DO JL=1, KSIZE
+    PRSMLTG(JL)=ZMASK(JL)*PRSMLTG(JL)
+    PRCMLTSR(JL)=ZMASK(JL)*PRCMLTSR(JL)
+  ENDDO
 ELSE
-  PRSMLTG(:) = 0.
-  PRCMLTSR(:) = 0.
-  WHERE(GMASK(:))
-    PRSMLTG(:) = PRVT(:)*PPRES(:)/((XMV/XMD)+PRVT(:)) ! Vapor pressure
-  END WHERE
+  DO JL=1, KSIZE
+    PRSMLTG(JL)=ZMASK(JL)*PRVT(JL)*PPRES(JL)/(XEPSILO+PRVT(JL)) ! Vapor pressure
+  ENDDO
   IF(LEVLIMIT) THEN
-    WHERE(GMASK(:))
+    WHERE(ZMASK(:)==1.)
       PRSMLTG(:)=MIN(PRSMLTG(:), EXP(XALPW-XBETAW/PT(:)-XGAMW*ALOG(PT(:)))) ! min(ev, es_w(T))
     END WHERE
   ENDIF
-  WHERE(GMASK(:))
-    PRSMLTG(:) =  PKA(:)*(XTT-PT(:)) +                                 &
-               ( PDV(:)*(XLVTT + ( XCPV - XCL ) * ( PT(:) - XTT )) &
-                           *(XESTT-PRSMLTG(:))/(XRV*PT(:))             )
+  DO JL=1, KSIZE
+    PRSMLTG(JL)=ZMASK(JL)*( &
+                            & PKA(JL)*(XTT-PT(JL)) +                                 &
+                            & ( PDV(JL)*(XLVTT + ( XCPV - XCL ) * ( PT(JL) - XTT )) &
+                            & *(XESTT-PRSMLTG(JL))/(XRV*PT(JL))             ) &
+                          &)
+  ENDDO
+  PRCMLTSR(:) = 0.
+  WHERE(ZMASK(:)==1.)
     !
     ! compute RSMLT
     !
@@ -474,21 +501,21 @@ ELSE
                                    ( PRS_TEND(:, IRCRIMS) + PRS_TEND(:, IRRACCS) ) *       &
                             ( PRHODREF(:)*XCL*(XTT-PT(:))) ) /    &
                                            ( PRHODREF(:)*XLMTT ) )
-    !
-    ! note that RSCVMG = RSMLT*XFSCVMG but no heat is exchanged (at the rate RSMLT)
-    ! because the graupeln produced by this process are still icy!!!
-    !
     ! When T < XTT, rc is collected by snow (riming) to produce snow and graupel
     ! When T > XTT, if riming was still enabled, rc would produce snow and graupel with snow becomming graupel (conversion/melting) and graupel becomming rain (melting)
-    ! To insure consistency when crossint T=XTT, rc collected with T>XTT must be transformed in rain.
+    ! To insure consistency when crossing T=XTT, rc collected with T>XTT must be transformed in rain.
     ! rc cannot produce iced species with a positive temperature but is still collected with a good efficiency by snow
     PRCMLTSR(:) = PRS_TEND(:, IRCRIMS) ! both species are liquid, no heat is exchanged
   END WHERE
 ENDIF
-PA_RS(:) = PA_RS(:) - PRSMLTG(:)
-PA_RG(:) = PA_RG(:) + PRSMLTG(:)
-PA_RC(:) = PA_RC(:) - PRCMLTSR(:)
-PA_RR(:) = PA_RR(:) + PRCMLTSR(:)
+DO JL=1, KSIZE
+  ! note that RSCVMG = RSMLT*XFSCVMG but no heat is exchanged (at the rate RSMLT)
+  ! because the graupeln produced by this process are still icy!!!
+  PA_RS(JL) = PA_RS(JL) - PRSMLTG(JL)
+  PA_RG(JL) = PA_RG(JL) + PRSMLTG(JL)
+  PA_RC(JL) = PA_RC(JL) - PRCMLTSR(JL)
+  PA_RR(JL) = PA_RR(JL) + PRCMLTSR(JL)
+ENDDO
 
 !
 END SUBROUTINE ICE4_FAST_RS
diff --git a/src/MNH/ice4_nucleation.f90 b/src/MNH/ice4_nucleation.f90
index 549736b05..9eadc1d29 100644
--- a/src/MNH/ice4_nucleation.f90
+++ b/src/MNH/ice4_nucleation.f90
@@ -48,7 +48,7 @@ SUBROUTINE ICE4_NUCLEATION(KSIZE, ODSOFT, ODCOMPUTE, &
 !*      0. DECLARATIONS
 !          ------------
 !
-USE MODD_CST,            ONLY: XALPI,XALPW,XBETAI,XBETAW,XGAMI,XGAMW,XMD,XMV,XTT
+USE MODD_CST,            ONLY: XALPI,XALPW,XBETAI,XBETAW,XGAMI,XGAMW,XMD,XMV,XTT,XEPSILO
 USE MODD_PARAM_ICE,      ONLY: LFEEDBACKT
 USE MODD_RAIN_ICE_PARAM, ONLY: XALPHA1,XALPHA2,XBETA1,XBETA2,XMNU0,XNU10,XNU20
 USE MODD_RAIN_ICE_DESCR, ONLY: XRTMIN
@@ -99,7 +99,7 @@ IF(.NOT. ODSOFT) THEN
   END WHERE
   WHERE(GNEGT(:))
     ZZW(:)=MIN(PPABST(:)/2., ZZW(:))             ! safety limitation
-    ZSSI(:)=PRVT(:)*(PPABST(:)-ZZW(:)) / ((XMV/XMD)*ZZW(:)) - 1.0
+    ZSSI(:)=PRVT(:)*(PPABST(:)-ZZW(:)) / (XEPSILO*ZZW(:)) - 1.0
                                                  ! Supersaturation over ice
     ZUSW(:)=MIN(PPABST(:)/2., ZUSW(:))            ! safety limitation
     ZUSW(:)=(ZUSW(:)/ZZW(:))*((PPABST(:)-ZZW(:))/(PPABST(:)-ZUSW(:))) - 1.0
diff --git a/src/MNH/ice4_nucleation_wrapper.f90 b/src/MNH/ice4_nucleation_wrapper.f90
index 6bd37bd55..37b8fb8b6 100644
--- a/src/MNH/ice4_nucleation_wrapper.f90
+++ b/src/MNH/ice4_nucleation_wrapper.f90
@@ -112,10 +112,6 @@ ALLOCATE(ZB_TH(INEGT))
 ALLOCATE(ZB_RV(INEGT))
 ALLOCATE(ZB_RI(INEGT))
 !
-ZB_TH(:) = 0.
-ZB_RV(:) = 0.
-ZB_RI(:) = 0.
-!
 IF(INEGT>0) INEGT_TMP=COUNTJV(GNEGT(:,:,:), I1(:), I2(:), I3(:))
 !
 PRVHENI_MR(:,:,:)=0.
@@ -132,6 +128,9 @@ IF(INEGT>0) THEN
   ENDDO
   GDSOFT = .FALSE.
   GLDCOMPUTE(:) = ZZT(:)<XTT
+  ZB_TH(:) = 0.
+  ZB_RV(:) = 0.
+  ZB_RI(:) = 0.
   CALL ICE4_NUCLEATION(INEGT, GDSOFT, GLDCOMPUTE, &
                        ZTHT, ZPRES, ZRHODREF, ZEXN, ZLSFACT, ZZT, &
                        ZRVT, &
diff --git a/src/MNH/ice4_rainfr_vert.f90 b/src/MNH/ice4_rainfr_vert.f90
index a048fc341..620c732ca 100644
--- a/src/MNH/ice4_rainfr_vert.f90
+++ b/src/MNH/ice4_rainfr_vert.f90
@@ -4,15 +4,18 @@
 !MNH_LIC for details. version 1.
 MODULE MODI_ICE4_RAINFR_VERT
 INTERFACE
-SUBROUTINE ICE4_RAINFR_VERT(KIB, KIE, KIT, KJB, KJE, KJT, KKB, KKE, KKT, KKL, PPRFR, PRR)
+SUBROUTINE ICE4_RAINFR_VERT(KIB, KIE, KIT, KJB, KJE, KJT, KKB, KKE, KKT, KKL, PPRFR, PRR, PRS, PRG, PRH)
 IMPLICIT NONE
 INTEGER,                      INTENT(IN) :: KIB, KIE, KIT, KJB, KJE, KJT, KKB, KKE, KKT, KKL
 REAL, DIMENSION(KIT,KJT,KKT), INTENT(INOUT) :: PPRFR !Precipitation fraction
 REAL, DIMENSION(KIT,KJT,KKT), INTENT(IN)    :: PRR !Rain field
+REAL, DIMENSION(KIT,KJT,KKT), INTENT(IN)    :: PRS !Snow field
+REAL, DIMENSION(KIT,KJT,KKT), INTENT(IN)    :: PRG !Graupel field
+REAL, DIMENSION(KIT,KJT,KKT), OPTIONAL,INTENT(IN)    :: PRH !Hail field
 END SUBROUTINE ICE4_RAINFR_VERT
 END INTERFACE
 END MODULE MODI_ICE4_RAINFR_VERT
-SUBROUTINE ICE4_RAINFR_VERT(KIB, KIE, KIT, KJB, KJE, KJT, KKB, KKE, KKT, KKL, PPRFR, PRR)
+SUBROUTINE ICE4_RAINFR_VERT(KIB, KIE, KIT, KJB, KJE, KJT, KKB, KKE, KKT, KKL, PPRFR, PRR, PRS, PRG, PRH)
 !!
 !!**  PURPOSE
 !!    -------
@@ -40,10 +43,14 @@ IMPLICIT NONE
 INTEGER,                      INTENT(IN) :: KIB, KIE, KIT, KJB, KJE, KJT, KKB, KKE, KKT, KKL
 REAL, DIMENSION(KIT,KJT,KKT), INTENT(INOUT)    :: PPRFR !Precipitation fraction
 REAL, DIMENSION(KIT,KJT,KKT), INTENT(IN)    :: PRR !Rain field
+REAL, DIMENSION(KIT,KJT,KKT), INTENT(IN)    :: PRS !Snow field
+REAL, DIMENSION(KIT,KJT,KKT), INTENT(IN)    :: PRG !Graupel field
+REAL, DIMENSION(KIT,KJT,KKT), OPTIONAL, INTENT(IN)    :: PRH !Hail field
 !
 !*       0.2  declaration of local variables
 !
 INTEGER :: JI, JJ, JK
+LOGICAL :: MASK
 !
 !-------------------------------------------------------------------------------
 !
@@ -52,7 +59,14 @@ DO JI = KIB,KIE
    DO JJ = KJB, KJE
       PPRFR(JI,JJ,KKE)=0.
       DO JK=KKE-KKL, KKB, -KKL
-         IF (PRR(JI,JJ,JK) .GT. XRTMIN(3)) THEN
+         IF(PRESENT(PRH)) THEN
+            MASK=PRR(JI,JJ,JK) .GT. XRTMIN(3) .OR. PRS(JI,JJ,JK) .GT. XRTMIN(5) &
+            .OR. PRG(JI,JJ,JK) .GT. XRTMIN(6) .OR. PRH(JI,JJ,JK) .GT. XRTMIN(7)
+         ELSE
+            MASK=PRR(JI,JJ,JK) .GT. XRTMIN(3) .OR. PRS(JI,JJ,JK) .GT. XRTMIN(5) &
+            .OR. PRG(JI,JJ,JK) .GT. XRTMIN(6) 
+         END IF
+         IF (MASK) THEN
             PPRFR(JI,JJ,JK)=MAX(PPRFR(JI,JJ,JK),PPRFR(JI,JJ,JK+KKL))
             IF (PPRFR(JI,JJ,JK)==0) THEN
                PPRFR(JI,JJ,JK)=1.
diff --git a/src/MNH/ice4_rimltc.f90 b/src/MNH/ice4_rimltc.f90
index 6b63a46f5..ef1fb8082 100644
--- a/src/MNH/ice4_rimltc.f90
+++ b/src/MNH/ice4_rimltc.f90
@@ -4,7 +4,7 @@
 !MNH_LIC for details. version 1.
 MODULE MODI_ICE4_RIMLTC
 INTERFACE
-SUBROUTINE ICE4_RIMLTC(KSIZE, LDSOFT, LDCOMPUTE, &
+SUBROUTINE ICE4_RIMLTC(KSIZE, LDSOFT, PCOMPUTE, &
                        &PEXN, PLVFACT, PLSFACT, &
                        &PT, &
                        &PTHT, PRIT, &
@@ -12,7 +12,7 @@ SUBROUTINE ICE4_RIMLTC(KSIZE, LDSOFT, LDCOMPUTE, &
 IMPLICIT NONE
 INTEGER, INTENT(IN) :: KSIZE
 LOGICAL,                  INTENT(IN)    :: LDSOFT
-LOGICAL, DIMENSION(KSIZE),INTENT(IN)    :: LDCOMPUTE
+REAL, DIMENSION(KSIZE),       INTENT(IN)    :: PCOMPUTE
 REAL, DIMENSION(KSIZE),       INTENT(IN)    :: PEXN     ! Exner function
 REAL, DIMENSION(KSIZE),       INTENT(IN)    :: PLVFACT  ! L_v/(Pi_ref*C_ph)
 REAL, DIMENSION(KSIZE),       INTENT(IN)    :: PLSFACT  ! L_s/(Pi_ref*C_ph)
@@ -26,7 +26,7 @@ REAL, DIMENSION(KSIZE),       INTENT(INOUT) :: PB_RI
 END SUBROUTINE ICE4_RIMLTC
 END INTERFACE
 END MODULE MODI_ICE4_RIMLTC
-SUBROUTINE ICE4_RIMLTC(KSIZE, LDSOFT, LDCOMPUTE, &
+SUBROUTINE ICE4_RIMLTC(KSIZE, LDSOFT, PCOMPUTE, &
                        &PEXN, PLVFACT, PLSFACT, &
                        &PT, &
                        &PTHT, PRIT, &
@@ -57,7 +57,7 @@ IMPLICIT NONE
 !
 INTEGER,                      INTENT(IN)    :: KSIZE
 LOGICAL,                      INTENT(IN)    :: LDSOFT
-LOGICAL, DIMENSION(KSIZE),    INTENT(IN)    :: LDCOMPUTE
+REAL, DIMENSION(KSIZE),       INTENT(IN)    :: PCOMPUTE
 REAL, DIMENSION(KSIZE),       INTENT(IN)    :: PEXN     ! Exner function
 REAL, DIMENSION(KSIZE),       INTENT(IN)    :: PLVFACT  ! L_v/(Pi_ref*C_ph)
 REAL, DIMENSION(KSIZE),       INTENT(IN)    :: PLSFACT  ! L_s/(Pi_ref*C_ph)
@@ -71,7 +71,8 @@ REAL, DIMENSION(KSIZE),       INTENT(INOUT) :: PB_RI
 !
 !*       0.2  declaration of local variables
 !
-LOGICAL, DIMENSION(KSIZE) :: GMASK
+REAL, DIMENSION(KSIZE) :: ZMASK
+INTEGER :: JL
 !
 !-------------------------------------------------------------------------------
 !
@@ -79,21 +80,25 @@ LOGICAL, DIMENSION(KSIZE) :: GMASK
 !
 PRIMLTC_MR(:)=0.
 IF(.NOT. LDSOFT) THEN
-  GMASK(:)=PRIT(:)>0. .AND. PT(:)>XTT .AND. LDCOMPUTE(:)
-  WHERE(GMASK(:))
-    PRIMLTC_MR(:)=PRIT(:)
-  END WHERE
+  DO JL=1, KSIZE
+    ZMASK(JL)=MAX(0., -SIGN(1., -PRIT(JL))) * & ! PRIT(:)>0.
+             &MAX(0., -SIGN(1., XTT-PT(JL))) * & ! PT(:)>XTT
+             &PCOMPUTE(JL)
+    PRIMLTC_MR(JL)=PRIT(JL) * ZMASK(JL)
+  ENDDO
 
   IF(LFEEDBACKT) THEN
     !Limitation due to 0 crossing of temperature
-    WHERE(GMASK(:))
-      PRIMLTC_MR(:)=MIN(PRIMLTC_MR(:), MAX(0., (PTHT(:)-XTT/PEXN(:)) / (PLSFACT(:)-PLVFACT(:))))
-    END WHERE
+    DO JL=1, KSIZE
+      PRIMLTC_MR(JL)=MIN(PRIMLTC_MR(JL), MAX(0., (PTHT(JL)-XTT/PEXN(JL)) / (PLSFACT(JL)-PLVFACT(JL))))
+    ENDDO
   ENDIF
 ENDIF
-PB_RC(:) = PB_RC(:) + PRIMLTC_MR(:)
-PB_RI(:) = PB_RI(:) - PRIMLTC_MR(:)
-PB_TH(:) = PB_TH(:) - PRIMLTC_MR(:)*(PLSFACT(:)-PLVFACT(:))
+DO JL=1, KSIZE
+  PB_RC(JL) = PB_RC(JL) + PRIMLTC_MR(JL)
+  PB_RI(JL) = PB_RI(JL) - PRIMLTC_MR(JL)
+  PB_TH(JL) = PB_TH(JL) - PRIMLTC_MR(JL)*(PLSFACT(JL)-PLVFACT(JL))
+ENDDO
 !
 !
 END SUBROUTINE ICE4_RIMLTC
diff --git a/src/MNH/ice4_rrhong.f90 b/src/MNH/ice4_rrhong.f90
index 08d296a4d..f12048030 100644
--- a/src/MNH/ice4_rrhong.f90
+++ b/src/MNH/ice4_rrhong.f90
@@ -4,7 +4,7 @@
 !MNH_LIC for details. version 1.
 MODULE MODI_ICE4_RRHONG
 INTERFACE
-SUBROUTINE ICE4_RRHONG(KSIZE, LDSOFT, LDCOMPUTE, &
+SUBROUTINE ICE4_RRHONG(KSIZE, LDSOFT, PCOMPUTE, &
                        &PEXN, PLVFACT, PLSFACT, &
                        &PT,   PRRT, &
                        &PTHT, &
@@ -12,7 +12,7 @@ SUBROUTINE ICE4_RRHONG(KSIZE, LDSOFT, LDCOMPUTE, &
 IMPLICIT NONE
 INTEGER, INTENT(IN) :: KSIZE
 LOGICAL,                  INTENT(IN)    :: LDSOFT
-LOGICAL, DIMENSION(KSIZE),INTENT(IN)    :: LDCOMPUTE
+REAL, DIMENSION(KSIZE),       INTENT(IN)    :: PCOMPUTE
 REAL, DIMENSION(KSIZE),       INTENT(IN)    :: PEXN     ! Exner function
 REAL, DIMENSION(KSIZE),       INTENT(IN)    :: PLVFACT  ! L_v/(Pi_ref*C_ph)
 REAL, DIMENSION(KSIZE),       INTENT(IN)    :: PLSFACT  ! L_s/(Pi_ref*C_ph)
@@ -26,7 +26,7 @@ REAL, DIMENSION(KSIZE),       INTENT(INOUT) :: PB_RG
 END SUBROUTINE ICE4_RRHONG
 END INTERFACE
 END MODULE MODI_ICE4_RRHONG
-SUBROUTINE ICE4_RRHONG(KSIZE, LDSOFT, LDCOMPUTE, &
+SUBROUTINE ICE4_RRHONG(KSIZE, LDSOFT, PCOMPUTE, &
                        &PEXN, PLVFACT, PLSFACT, &
                        &PT,   PRRT, &
                        &PTHT, &
@@ -58,7 +58,7 @@ IMPLICIT NONE
 !
 INTEGER, INTENT(IN) :: KSIZE
 LOGICAL,                  INTENT(IN)    :: LDSOFT
-LOGICAL, DIMENSION(KSIZE),INTENT(IN)    :: LDCOMPUTE
+REAL, DIMENSION(KSIZE),       INTENT(IN)    :: PCOMPUTE
 REAL, DIMENSION(KSIZE),       INTENT(IN)    :: PEXN     ! Exner function
 REAL, DIMENSION(KSIZE),       INTENT(IN)    :: PLVFACT  ! L_v/(Pi_ref*C_ph)
 REAL, DIMENSION(KSIZE),       INTENT(IN)    :: PLSFACT  ! L_s/(Pi_ref*C_ph)
@@ -72,7 +72,8 @@ REAL, DIMENSION(KSIZE),       INTENT(INOUT) :: PB_RG
 !
 !*       0.2  declaration of local variables
 !
-LOGICAL, DIMENSION(SIZE(PRRT)) :: GMASK
+REAL, DIMENSION(KSIZE) :: ZMASK
+INTEGER :: JL
 !
 !-------------------------------------------------------------------------------
 !
@@ -80,20 +81,24 @@ LOGICAL, DIMENSION(SIZE(PRRT)) :: GMASK
 !
 PRRHONG_MR(:) = 0.
 IF(.NOT. LDSOFT) THEN
-  GMASK(:)=PT(:)<XTT-35.0 .AND. PRRT(:)>XRTMIN(3) .AND. LDCOMPUTE(:)
-  WHERE(GMASK(:))
-    PRRHONG_MR(:) = PRRT(:)
-  ENDWHERE
+  DO JL=1, KSIZE
+    ZMASK(JL)=MAX(0., -SIGN(1., PT(JL)-(XTT-35.0))) * & ! PT(:)<XTT-35.0
+             &MAX(0., -SIGN(1., XRTMIN(3)-PRRT(JL))) * & ! PRRT(:)>XRTMIN(3)
+             &PCOMPUTE(JL)
+    PRRHONG_MR(JL)=PRRT(JL) * ZMASK(JL)
+  ENDDO
   IF(LFEEDBACKT) THEN
     !Limitation due to -35 crossing of temperature
-    WHERE(GMASK(:))
-      PRRHONG_MR(:)=MIN(PRRHONG_MR(:), MAX(0., ((XTT-35.)/PEXN(:)-PTHT)/(PLSFACT(:)-PLVFACT(:))))
-    ENDWHERE
+    DO JL=1, KSIZE
+      PRRHONG_MR(JL)=MIN(PRRHONG_MR(JL), MAX(0., ((XTT-35.)/PEXN(JL)-PTHT(JL))/(PLSFACT(JL)-PLVFACT(JL))))
+    ENDDO
   ENDIF
 ENDIF
-PB_RG(:) = PB_RG(:) + PRRHONG_MR(:)
-PB_RR(:) = PB_RR(:) - PRRHONG_MR(:)
-PB_TH(:) = PB_TH(:) + PRRHONG_MR(:)*(PLSFACT(:)-PLVFACT(:))
+DO JL=1, KSIZE
+  PB_RG(JL) = PB_RG(JL) + PRRHONG_MR(JL)
+  PB_RR(JL) = PB_RR(JL) - PRRHONG_MR(JL)
+  PB_TH(JL) = PB_TH(JL) + PRRHONG_MR(JL)*(PLSFACT(JL)-PLVFACT(JL))
+ENDDO
 !
 !
 END SUBROUTINE ICE4_RRHONG
diff --git a/src/MNH/ice4_rsrimcg_old.f90 b/src/MNH/ice4_rsrimcg_old.f90
index 01f8f0310..1aa9afff0 100644
--- a/src/MNH/ice4_rsrimcg_old.f90
+++ b/src/MNH/ice4_rsrimcg_old.f90
@@ -72,11 +72,11 @@ REAL, DIMENSION(KSIZE),       INTENT(INOUT) :: PB_RG
 !
 !*       0.2  declaration of local variables
 !
-LOGICAL, DIMENSION(SIZE(PRHODREF)) :: GRIM, GACC, GMASK
-INTEGER :: IGRIM, IGACC
-REAL, DIMENSION(SIZE(PRHODREF)) :: ZVEC1, ZVEC2, ZVEC3
-INTEGER, DIMENSION(SIZE(PRHODREF)) :: IVEC1, IVEC2
-REAL, DIMENSION(SIZE(PRHODREF)) :: ZZW, ZZW2, ZZW6
+LOGICAL, DIMENSION(KSIZE) :: GRIM
+INTEGER :: IGRIM
+REAL, DIMENSION(KSIZE) :: ZVEC1, ZVEC2
+INTEGER, DIMENSION(KSIZE) :: IVEC2, IVEC1
+REAL, DIMENSION(KSIZE) :: ZZW
 INTEGER :: JL
 !-------------------------------------------------------------------------------
 !
@@ -98,7 +98,7 @@ IF(.NOT. ODSOFT) THEN
     END IF
   END DO
   !
-  IF(IGRIM>0 .AND. CSNOWRIMING=='OLD ') THEN
+  IF(IGRIM>0) THEN
     !
     !        5.1.1  select the PLBDAS
     !
@@ -133,8 +133,8 @@ IF(.NOT. ODSOFT) THEN
     WHERE(GRIM(:))
       PRSRIMCG_MR(:) = XSRIMCG * PLBDAS(:)**XEXSRIMCG   & ! RSRIMCG
                                * (1.0 - ZZW(:) )/PRHODREF(:)
+      PRSRIMCG_MR(:)=MIN(PRST(:), PRSRIMCG_MR(:))
     END WHERE
-    PRSRIMCG_MR(:)=MIN(PRST(:), PRSRIMCG_MR(:))
   END IF
 ENDIF
 PB_RS(:) = PB_RS(:) - PRSRIMCG_MR(:)
diff --git a/src/MNH/ice4_sedimentation_split.f90 b/src/MNH/ice4_sedimentation_split.f90
index cb0a147d0..62b21dfbd 100644
--- a/src/MNH/ice4_sedimentation_split.f90
+++ b/src/MNH/ice4_sedimentation_split.f90
@@ -35,8 +35,8 @@ REAL, DIMENSION(KIT,KJT,KKT), INTENT(INOUT)           :: PRSS    ! Snow/aggregat
 REAL, DIMENSION(KIT,KJT,KKT), INTENT(IN)              :: PRST    ! Snow/aggregate m.r. at t
 REAL, DIMENSION(KIT,KJT,KKT), INTENT(INOUT)           :: PRGS    ! Graupel m.r. source
 REAL, DIMENSION(KIT,KJT,KKT), INTENT(IN)              :: PRGT    ! Graupel/hail m.r. at t
-REAL, DIMENSION(:,:),         INTENT(OUT)             :: PINPRC  ! Cloud instant precip
-REAL, DIMENSION(:,:),         INTENT(OUT)             :: PINDEP  ! Cloud instant deposition
+REAL, DIMENSION(KIT,KJT),     INTENT(OUT)             :: PINPRC  ! Cloud instant precip
+REAL, DIMENSION(KIT,KJT),     INTENT(OUT)             :: PINDEP  ! Cloud instant deposition
 REAL, DIMENSION(KIT,KJT),     INTENT(OUT)             :: PINPRR  ! Rain instant precip
 REAL, DIMENSION(KIT,KJT),     INTENT(OUT)             :: PINPRI  ! Pristine ice instant precip
 REAL, DIMENSION(KIT,KJT),     INTENT(OUT)             :: PINPRS  ! Snow instant precip
@@ -112,8 +112,8 @@ REAL, DIMENSION(KIT,KJT,KKT), INTENT(INOUT)           :: PRSS    ! Snow/aggregat
 REAL, DIMENSION(KIT,KJT,KKT), INTENT(IN)              :: PRST    ! Snow/aggregate m.r. at t
 REAL, DIMENSION(KIT,KJT,KKT), INTENT(INOUT)           :: PRGS    ! Graupel m.r. source
 REAL, DIMENSION(KIT,KJT,KKT), INTENT(IN)              :: PRGT    ! Graupel/hail m.r. at t
-REAL, DIMENSION(:,:),         INTENT(OUT)             :: PINPRC  ! Cloud instant precip
-REAL, DIMENSION(:,:),         INTENT(OUT)             :: PINDEP  ! Cloud instant deposition
+REAL, DIMENSION(KIT,KJT),     INTENT(OUT)             :: PINPRC  ! Cloud instant precip
+REAL, DIMENSION(KIT,KJT),     INTENT(OUT)             :: PINDEP  ! Cloud instant deposition
 REAL, DIMENSION(KIT,KJT),     INTENT(OUT)             :: PINPRR  ! Rain instant precip
 REAL, DIMENSION(KIT,KJT),     INTENT(OUT)             :: PINPRI  ! Pristine ice instant precip
 REAL, DIMENSION(KIT,KJT),     INTENT(OUT)             :: PINPRS  ! Snow instant precip
diff --git a/src/MNH/ice4_slow.f90 b/src/MNH/ice4_slow.f90
index f264b0b6f..9f8511e4f 100644
--- a/src/MNH/ice4_slow.f90
+++ b/src/MNH/ice4_slow.f90
@@ -4,17 +4,18 @@
 !MNH_LIC for details. version 1.
 MODULE MODI_ICE4_SLOW
 INTERFACE
-SUBROUTINE ICE4_SLOW(KSIZE, LDSOFT, LDCOMPUTE, PRHODREF, PT,&
+SUBROUTINE ICE4_SLOW(KSIZE, LDSOFT, HSUBG_AUCV_RI, PCOMPUTE, PRHODREF, PT,&
                      &PSSI, PLVFACT, PLSFACT, &
                      &PRVT, PRCT, PRIT, PRST, PRGT,&
                      &PLBDAS, PLBDAG,&
-                     &PAI, PCJ,&
+                     &PAI, PCJ, PHLI_HCF, PHLI_HRI,&
                      &PRCHONI, PRVDEPS, PRIAGGS, PRIAUTS, PRVDEPG, &
                      &PA_TH, PA_RV, PA_RC, PA_RI, PA_RS, PA_RG)
 IMPLICIT NONE
 INTEGER,                      INTENT(IN)    :: KSIZE
 LOGICAL,                      INTENT(IN)    :: LDSOFT
-LOGICAL, DIMENSION(KSIZE),    INTENT(IN)    :: LDCOMPUTE
+CHARACTER(LEN=80),            INTENT(IN)    :: HSUBG_AUCV_RI
+REAL, DIMENSION(KSIZE),       INTENT(IN)    :: PCOMPUTE
 REAL, DIMENSION(KSIZE),       INTENT(IN)    :: PRHODREF ! Reference density
 REAL, DIMENSION(KSIZE),       INTENT(IN)    :: PT       ! Temperature
 REAL, DIMENSION(KSIZE),       INTENT(IN)    :: PSSI     ! Supersaturation over ice
@@ -29,6 +30,8 @@ REAL, DIMENSION(KSIZE),       INTENT(IN)    :: PLBDAS   ! Slope parameter of the
 REAL, DIMENSION(KSIZE),       INTENT(IN)    :: PLBDAG   ! Slope parameter of the graupel   distribution
 REAL, DIMENSION(KSIZE),       INTENT(IN)    :: PAI      ! Thermodynamical function
 REAL, DIMENSION(KSIZE),       INTENT(IN)    :: PCJ      ! Function to compute the ventilation coefficient
+REAL, DIMENSION(KSIZE),       INTENT(IN)    :: PHLI_HCF !
+REAL, DIMENSION(KSIZE),       INTENT(IN)    :: PHLI_HRI !
 REAL, DIMENSION(KSIZE),       INTENT(INOUT) :: PRCHONI  ! Homogeneous nucleation
 REAL, DIMENSION(KSIZE),       INTENT(INOUT) :: PRVDEPS  ! Deposition on r_s
 REAL, DIMENSION(KSIZE),       INTENT(INOUT) :: PRIAGGS  ! Aggregation on r_s
@@ -43,11 +46,11 @@ REAL, DIMENSION(KSIZE),       INTENT(INOUT) :: PA_RG
 END SUBROUTINE ICE4_SLOW
 END INTERFACE
 END MODULE MODI_ICE4_SLOW
-SUBROUTINE ICE4_SLOW(KSIZE, LDSOFT, LDCOMPUTE, PRHODREF, PT, &
+SUBROUTINE ICE4_SLOW(KSIZE, LDSOFT, HSUBG_AUCV_RI, PCOMPUTE, PRHODREF, PT, &
                      &PSSI, PLVFACT, PLSFACT, &
                      &PRVT, PRCT, PRIT, PRST, PRGT, &
                      &PLBDAS, PLBDAG, &
-                     &PAI, PCJ, &
+                     &PAI, PCJ, PHLI_HCF, PHLI_HRI,&
                      &PRCHONI, PRVDEPS, PRIAGGS, PRIAUTS, PRVDEPG, &
                      &PA_TH, PA_RV, PA_RC, PA_RI, PA_RS, PA_RG)
 !!
@@ -78,7 +81,8 @@ IMPLICIT NONE
 !
 INTEGER,                      INTENT(IN)    :: KSIZE
 LOGICAL,                      INTENT(IN)    :: LDSOFT
-LOGICAL, DIMENSION(KSIZE),    INTENT(IN)    :: LDCOMPUTE
+CHARACTER(LEN=80),            INTENT(IN)    :: HSUBG_AUCV_RI
+REAL, DIMENSION(KSIZE),       INTENT(IN)    :: PCOMPUTE
 REAL, DIMENSION(KSIZE),       INTENT(IN)    :: PRHODREF ! Reference density
 REAL, DIMENSION(KSIZE),       INTENT(IN)    :: PT       ! Temperature
 REAL, DIMENSION(KSIZE),       INTENT(IN)    :: PSSI     ! Supersaturation over ice
@@ -93,6 +97,8 @@ REAL, DIMENSION(KSIZE),       INTENT(IN)    :: PLBDAS   ! Slope parameter of the
 REAL, DIMENSION(KSIZE),       INTENT(IN)    :: PLBDAG   ! Slope parameter of the graupel   distribution
 REAL, DIMENSION(KSIZE),       INTENT(IN)    :: PAI      ! Thermodynamical function
 REAL, DIMENSION(KSIZE),       INTENT(IN)    :: PCJ      ! Function to compute the ventilation coefficient
+REAL, DIMENSION(KSIZE),       INTENT(IN)    :: PHLI_HCF !
+REAL, DIMENSION(KSIZE),       INTENT(IN)    :: PHLI_HRI !
 REAL, DIMENSION(KSIZE),       INTENT(INOUT) :: PRCHONI  ! Homogeneous nucleation
 REAL, DIMENSION(KSIZE),       INTENT(INOUT) :: PRVDEPS  ! Deposition on r_s
 REAL, DIMENSION(KSIZE),       INTENT(INOUT) :: PRIAGGS  ! Aggregation on r_s
@@ -107,9 +113,10 @@ REAL, DIMENSION(KSIZE),       INTENT(INOUT) :: PA_RG
 !
 !*       0.2  declaration of local variables
 !
-LOGICAL, DIMENSION(SIZE(PRHODREF)) :: GMASK
-REAL, DIMENSION(SIZE(PRHODREF))    :: ZCRIAUTI
-REAL                               :: ZTIMAUTIC
+REAL, DIMENSION(KSIZE) :: ZCRIAUTI, ZMASK
+REAL                   :: ZTIMAUTIC,ZRCHONI
+INTEGER                :: JL
+!-------------------------------------------------------------------------------
 !
 !
 !-------------------------------------------------------------------------------
@@ -117,21 +124,28 @@ REAL                               :: ZTIMAUTIC
 !
 !*       3.2     compute the homogeneous nucleation source: RCHONI
 !
-GMASK(:)=PT(:)<XTT-35.0 .AND. PRCT(:)>XRTMIN(2) .AND. LDCOMPUTE(:)
+DO JL=1, KSIZE
+  ZMASK(JL)=MAX(0., -SIGN(1., PT(JL)-(XTT-35.0))) * & ! PT(:)<XTT-35.0
+           &MAX(0., -SIGN(1., XRTMIN(2)-PRCT(JL))) * & ! PRCT(:)>XRTMIN(2)
+           &PCOMPUTE(JL)
+ENDDO
 IF(LDSOFT) THEN
-  WHERE(.NOT. GMASK(:))
-    PRCHONI(:) = 0.
-  END WHERE
+  DO JL=1, KSIZE
+    PRCHONI(JL) = PRCHONI(JL) * ZMASK(JL)
+  ENDDO
 ELSE
   PRCHONI(:) = 0.
-  WHERE(GMASK(:))
+  WHERE(ZMASK(:)==1.)
     PRCHONI(:) = XHON*PRHODREF(:)*PRCT(:)       &
                                  *EXP( XALPHA3*(PT(:)-XTT)-XBETA3 )
   ENDWHERE
 ENDIF
-PA_RI(:) = PA_RI(:) + PRCHONI(:)
-PA_RC(:) = PA_RC(:) - PRCHONI(:)
-PA_TH(:) = PA_TH(:) + PRCHONI(:)*(PLSFACT(:)-PLVFACT(:))
+DO JL=1, KSIZE
+  ZRCHONI=MIN(PRCHONI(JL),1000.)
+  PA_RI(JL) = PA_RI(JL) + ZRCHONI
+  PA_RC(JL) = PA_RC(JL) - ZRCHONI
+  PA_TH(JL) = PA_TH(JL) + ZRCHONI*(PLSFACT(JL)-PLVFACT(JL))
+ENDDO
 !
 !*       3.4    compute the deposition, aggregation and autoconversion sources
 !
@@ -149,78 +163,103 @@ PA_TH(:) = PA_TH(:) + PRCHONI(:)*(PLSFACT(:)-PLVFACT(:))
 !
 !*       3.4.3  compute the deposition on r_s: RVDEPS
 !
-GMASK(:)=PRVT(:)>XRTMIN(1) .AND. PRST(:)>XRTMIN(5) .AND. LDCOMPUTE(:)
+DO JL=1, KSIZE
+  ZMASK(JL)=MAX(0., -SIGN(1., XRTMIN(1)-PRVT(JL))) * & !PRVT(:)>XRTMIN(1)
+           &MAX(0., -SIGN(1., XRTMIN(5)-PRST(JL))) * & !PRST(:)>XRTMIN(5)
+           &PCOMPUTE(JL)
+ENDDO
 IF(LDSOFT) THEN
-  WHERE(.NOT. GMASK(:))
-    PRVDEPS(:) = 0.
-  END WHERE
+  DO JL=1, KSIZE
+    PRVDEPS(JL)=PRVDEPS(JL)*ZMASK(JL)
+  ENDDO
 ELSE
   PRVDEPS(:) = 0.
-  WHERE(GMASK(:))
+  WHERE(ZMASK(:)==1.)
     PRVDEPS(:) = ( PSSI(:)/(PRHODREF(:)*PAI(:)) ) *                               &
                  ( X0DEPS*PLBDAS(:)**XEX0DEPS + X1DEPS*PCJ(:)*PLBDAS(:)**XEX1DEPS )
   END WHERE
 ENDIF
-PA_RS(:) = PA_RS(:) + PRVDEPS(:)
-PA_RV(:) = PA_RV(:) - PRVDEPS(:)
-PA_TH(:) = PA_TH(:) + PRVDEPS(:)*PLSFACT(:)
+DO JL=1, KSIZE
+  PA_RS(JL) = PA_RS(JL) + PRVDEPS(JL)
+  PA_RV(JL) = PA_RV(JL) - PRVDEPS(JL)
+  PA_TH(JL) = PA_TH(JL) + PRVDEPS(JL)*PLSFACT(JL)
+ENDDO
 !
 !*       3.4.4  compute the aggregation on r_s: RIAGGS
 !
-GMASK(:)=PRIT(:)>XRTMIN(4) .AND. PRST(:)>XRTMIN(5) .AND. LDCOMPUTE(:)
+DO JL=1, KSIZE
+  ZMASK(JL)=MAX(0., -SIGN(1., XRTMIN(4)-PRIT(JL))) * & ! PRIT(:)>XRTMIN(4)
+           &MAX(0., -SIGN(1., XRTMIN(5)-PRST(JL))) * & ! PRST(:)>XRTMIN(5)
+           &PCOMPUTE(JL)
+ENDDO
 IF(LDSOFT) THEN
-  WHERE(.NOT. GMASK(:))
-    PRIAGGS(:) = 0.
-  END WHERE
+  DO JL=1, KSIZE
+    PRIAGGS(JL)=PRIAGGS(JL) * ZMASK(JL)
+  ENDDO
 ELSE
   PRIAGGS(:) = 0.
-  WHERE(GMASK(:))
+  WHERE(ZMASK(:)==1)
     PRIAGGS(:) = XFIAGGS * EXP( XCOLEXIS*(PT(:)-XTT) ) &
                          * PRIT(:)                      &
                          * PLBDAS(:)**XEXIAGGS          &
                          * PRHODREF(:)**(-XCEXVT)
   END WHERE
 ENDIF
-PA_RS(:) = PA_RS(:) + PRIAGGS(:)
-PA_RI(:) = PA_RI(:) - PRIAGGS(:)
+DO JL=1, KSIZE
+  PA_RS(JL) = PA_RS(JL) + PRIAGGS(JL)
+  PA_RI(JL) = PA_RI(JL) - PRIAGGS(JL)
+ENDDO
 !
 !*       3.4.5  compute the autoconversion of r_i for r_s production: RIAUTS
 !
-GMASK(:)=PRIT(:)>XRTMIN(4) .AND. LDCOMPUTE(:)
+DO JL=1, KSIZE
+  ZMASK(JL)=MAX(0., -SIGN(1., XRTMIN(4)-PHLI_HRI(JL))) * & ! PHLI_HRI(:)>XRTMIN(4)
+           &MAX(0., -SIGN(1., 1.E-20-PHLI_HCF(JL))) * & ! PHLI_HCF(:) .GT. 0.
+           &PCOMPUTE(JL)
+ENDDO
 IF(LDSOFT) THEN
-  WHERE(.NOT. GMASK(:))
-    PRIAUTS(:) = 0.
-  END WHERE
+  DO JL=1, KSIZE
+    PRIAUTS(JL) = PRIAUTS(JL) * ZMASK(JL)
+  ENDDO
 ELSE
   PRIAUTS(:) = 0.
   !ZCRIAUTI(:)=MIN(XCRIAUTI,10**(0.06*(PT(:)-XTT)-3.5))
   ZCRIAUTI(:)=MIN(XCRIAUTI,10**(XACRIAUTI*(PT(:)-XTT)+XBCRIAUTI))
-  WHERE(GMASK(:))
+  WHERE(ZMASK(:)==1.)
     PRIAUTS(:) = XTIMAUTI * EXP( XTEXAUTI*(PT(:)-XTT) ) &
-                          * MAX( PRIT(:)-ZCRIAUTI(:),0.0 )
+                          * MAX( PHLI_HRI(:)/PHLI_HCF(:)-ZCRIAUTI(:),0.0 )
+    PRIAUTS(:) = PHLI_HCF(:)*PRIAUTS(:)
   END WHERE
 ENDIF
-PA_RS(:) = PA_RS(:) + PRIAUTS(:)
-PA_RI(:) = PA_RI(:) - PRIAUTS(:)
+DO JL=1, KSIZE
+  PA_RS(JL) = PA_RS(JL) + PRIAUTS(JL)
+  PA_RI(JL) = PA_RI(JL) - PRIAUTS(JL)
+ENDDO
 !
 !*       3.4.6  compute the deposition on r_g: RVDEPG
 !
 !
-GMASK(:)=PRVT(:)>XRTMIN(1) .AND. PRGT(:)>XRTMIN(6) .AND. LDCOMPUTE(:)
+DO JL=1, KSIZE
+  ZMASK(JL)=MAX(0., -SIGN(1., XRTMIN(1)-PRVT(JL))) * & ! PRVT(:)>XRTMIN(1)
+           &MAX(0., -SIGN(1., XRTMIN(6)-PRGT(JL))) * & ! PRGT(:)>XRTMIN(6)
+           &PCOMPUTE(JL)
+ENDDO
 IF(LDSOFT) THEN
-  WHERE(.NOT. GMASK(:))
-    PRVDEPG(:) = 0.
-  END WHERE
+  DO JL=1, KSIZE
+    PRVDEPG(JL) = PRVDEPG(JL) * ZMASK(JL)
+  ENDDO
 ELSE
   PRVDEPG(:) = 0.
-  WHERE(GMASK(:))
+  WHERE(ZMASK(:)==1.)
     PRVDEPG(:) = ( PSSI(:)/(PRHODREF(:)*PAI(:)) ) *                               &
                  ( X0DEPG*PLBDAG(:)**XEX0DEPG + X1DEPG*PCJ(:)*PLBDAG(:)**XEX1DEPG )
   END WHERE
 ENDIF
-PA_RG(:) = PA_RG(:) + PRVDEPG(:)
-PA_RV(:) = PA_RV(:) - PRVDEPG(:)
-PA_TH(:) = PA_TH(:) + PRVDEPG(:)*PLSFACT(:)
+DO JL=1, KSIZE
+  PA_RG(JL) = PA_RG(JL) + PRVDEPG(JL)
+  PA_RV(JL) = PA_RV(JL) - PRVDEPG(JL)
+  PA_TH(JL) = PA_TH(JL) + PRVDEPG(JL)*PLSFACT(JL)
+ENDDO
 !
 !
 END SUBROUTINE ICE4_SLOW
diff --git a/src/MNH/ice4_tendencies.f90 b/src/MNH/ice4_tendencies.f90
index 3259c42fe..f5c2121fb 100644
--- a/src/MNH/ice4_tendencies.f90
+++ b/src/MNH/ice4_tendencies.f90
@@ -6,13 +6,14 @@
 MODULE MODI_ICE4_TENDENCIES
 INTERFACE
 SUBROUTINE ICE4_TENDENCIES(KSIZE, KIB, KIE, KIT, KJB, KJE, KJT, KKB, KKE, KKT, KKL, &
-                          &KRR, ODSOFT, ODCOMPUTE, &
-                          &OWARM, HSUBG_RC_RR_ACCR, HSUBG_RR_EVAP, HSUBG_AUCV_RC, HSUBG_PR_PDF, &
+                          &KRR, ODSOFT, PCOMPUTE, &
+                          &OWARM, HSUBG_RC_RR_ACCR, HSUBG_RR_EVAP, &
+                          &HSUBG_AUCV_RC, HSUBG_AUCV_RI, HSUBG_PR_PDF, &
                           &PEXN, PRHODREF, PLVFACT, PLSFACT, K1, K2, K3, &
                           &PPRES, PCF, PSIGMA_RC, &
                           &PCIT, &
                           &PT, PTHT, &
-                          &PRVT, PRCT, PRRT, PRIT, PRST, PRGT, PRHT, PRRT3D, &
+                          &PRVT, PRCT, PRRT, PRIT, PRST, PRGT, PRHT, &
                           &PRVHENI_MR, PRRHONG_MR, PRIMLTC_MR, PRSRIMCG_MR, &
                           &PRCHONI, PRVDEPS, PRIAGGS, PRIAUTS, PRVDEPG, &
                           &PRCAUTR, PRCACCR, PRREVAV, &
@@ -22,19 +23,21 @@ SUBROUTINE ICE4_TENDENCIES(KSIZE, KIB, KIE, KIT, KJB, KJE, KJT, KKB, KKE, KKT, K
                           &PRCWETH, PRIWETH, PRSWETH, PRGWETH, PRRWETH, &
                           &PRCDRYH, PRIDRYH, PRSDRYH, PRRDRYH, PRGDRYH, PRDRYHG, PRHMLTR, &
                           &PRCBERI, &
-                          &PRS_TEND, PRG_TEND, PRH_TEND, &
+                          &PRS_TEND, PRG_TEND, PRH_TEND, PSSI, &
                           &PA_TH, PA_RV, PA_RC, PA_RR, PA_RI, PA_RS, PA_RG, PA_RH, &
                           &PB_TH, PB_RV, PB_RC, PB_RR, PB_RI, PB_RS, PB_RG, PB_RH, &
-                          &PHLC_HCF, PHLC_LCF, PHLC_HRC, PHLC_LRC, PRAINFR)
+                          &PHLC_HCF, PHLC_LCF, PHLC_HRC, PHLC_LRC, &
+                          &PHLI_HCF, PHLI_LCF, PHLI_HRI, PHLI_LRI, PRAINFR)
 IMPLICIT NONE
 INTEGER,                      INTENT(IN)    :: KSIZE, KIB, KIE, KIT, KJB, KJE, KJT, KKB, KKE, KKT, KKL
 INTEGER,                      INTENT(IN)    :: KRR
 LOGICAL,                      INTENT(IN)    :: ODSOFT
-LOGICAL, DIMENSION(KSIZE),    INTENT(IN)    :: ODCOMPUTE
+REAL, DIMENSION(KSIZE),    INTENT(IN)       :: PCOMPUTE
 LOGICAL,                      INTENT(IN)    :: OWARM
 CHARACTER(len=80),            INTENT(IN)    :: HSUBG_RC_RR_ACCR
 CHARACTER(len=80),            INTENT(IN)    :: HSUBG_RR_EVAP
 CHARACTER(len=4),             INTENT(IN)    :: HSUBG_AUCV_RC
+CHARACTER(len=80),            INTENT(IN)    :: HSUBG_AUCV_RI
 CHARACTER(len=80),            INTENT(IN)    :: HSUBG_PR_PDF ! pdf for subgrid precipitation
 REAL, DIMENSION(KSIZE),       INTENT(IN)    :: PEXN
 REAL, DIMENSION(KSIZE),       INTENT(IN)    :: PRHODREF
@@ -56,7 +59,6 @@ REAL, DIMENSION(KSIZE),       INTENT(IN)    :: PRIT
 REAL, DIMENSION(KSIZE),       INTENT(IN)    :: PRST
 REAL, DIMENSION(KSIZE),       INTENT(IN)    :: PRGT
 REAL, DIMENSION(KSIZE),       INTENT(IN)    :: PRHT
-REAL, DIMENSION(KIT,KJT,KKT), INTENT(IN)    :: PRRT3D
 REAL, DIMENSION(KSIZE),       INTENT(OUT)   :: PRVHENI_MR
 REAL, DIMENSION(KSIZE),       INTENT(OUT)   :: PRRHONG_MR
 REAL, DIMENSION(KSIZE),       INTENT(OUT)   :: PRIMLTC_MR
@@ -104,9 +106,10 @@ REAL, DIMENSION(KSIZE),       INTENT(OUT)   :: PRGDRYH
 REAL, DIMENSION(KSIZE),       INTENT(OUT)   :: PRDRYHG
 REAL, DIMENSION(KSIZE),       INTENT(INOUT) :: PRHMLTR
 REAL, DIMENSION(KSIZE),       INTENT(INOUT) :: PRCBERI
-REAL, DIMENSION(KSIZE, 6),    INTENT(INOUT) :: PRS_TEND
-REAL, DIMENSION(KSIZE, 6),    INTENT(INOUT) :: PRG_TEND
-REAL, DIMENSION(KSIZE, 8),    INTENT(INOUT) :: PRH_TEND
+REAL, DIMENSION(KSIZE, 8),    INTENT(INOUT) :: PRS_TEND
+REAL, DIMENSION(KSIZE, 8),    INTENT(INOUT) :: PRG_TEND
+REAL, DIMENSION(KSIZE, 10),   INTENT(INOUT) :: PRH_TEND
+REAL, DIMENSION(KSIZE),       INTENT(OUT)   :: PSSI
 REAL, DIMENSION(KSIZE),       INTENT(OUT)   :: PA_TH
 REAL, DIMENSION(KSIZE),       INTENT(OUT)   :: PA_RV
 REAL, DIMENSION(KSIZE),       INTENT(OUT)   :: PA_RC
@@ -127,18 +130,23 @@ REAL, DIMENSION(KSIZE),       INTENT(OUT)   :: PHLC_HCF
 REAL, DIMENSION(KSIZE),       INTENT(OUT)   :: PHLC_LCF
 REAL, DIMENSION(KSIZE),       INTENT(OUT)   :: PHLC_HRC
 REAL, DIMENSION(KSIZE),       INTENT(OUT)   :: PHLC_LRC
+REAL, DIMENSION(KSIZE),       INTENT(OUT)   :: PHLI_HCF
+REAL, DIMENSION(KSIZE),       INTENT(OUT)   :: PHLI_LCF
+REAL, DIMENSION(KSIZE),       INTENT(OUT)   :: PHLI_HRI
+REAL, DIMENSION(KSIZE),       INTENT(OUT)   :: PHLI_LRI
 REAL, DIMENSION(KIT,KJT,KKT), INTENT(OUT)   :: PRAINFR   ! Rain fraction
 END SUBROUTINE ICE4_TENDENCIES
 END INTERFACE
 END MODULE MODI_ICE4_TENDENCIES
 SUBROUTINE ICE4_TENDENCIES(KSIZE, KIB, KIE, KIT, KJB, KJE, KJT, KKB, KKE, KKT, KKL, &
-                          &KRR, ODSOFT, ODCOMPUTE, &
-                          &OWARM, HSUBG_RC_RR_ACCR, HSUBG_RR_EVAP, HSUBG_AUCV_RC, HSUBG_PR_PDF, &
+                          &KRR, ODSOFT, PCOMPUTE, &
+                          &OWARM, HSUBG_RC_RR_ACCR, HSUBG_RR_EVAP, &
+                          &HSUBG_AUCV_RC, HSUBG_AUCV_RI, HSUBG_PR_PDF, &
                           &PEXN, PRHODREF, PLVFACT, PLSFACT, K1, K2, K3, &
                           &PPRES, PCF, PSIGMA_RC, &
                           &PCIT, &
                           &PT, PTHT, &
-                          &PRVT, PRCT, PRRT, PRIT, PRST, PRGT, PRHT, PRRT3D, &
+                          &PRVT, PRCT, PRRT, PRIT, PRST, PRGT, PRHT, &
                           &PRVHENI_MR, PRRHONG_MR, PRIMLTC_MR, PRSRIMCG_MR, &
                           &PRCHONI, PRVDEPS, PRIAGGS, PRIAUTS, PRVDEPG, &
                           &PRCAUTR, PRCACCR, PRREVAV, &
@@ -148,10 +156,11 @@ SUBROUTINE ICE4_TENDENCIES(KSIZE, KIB, KIE, KIT, KJB, KJE, KJT, KKB, KKE, KKT, K
                           &PRCWETH, PRIWETH, PRSWETH, PRGWETH, PRRWETH, &
                           &PRCDRYH, PRIDRYH, PRSDRYH, PRRDRYH, PRGDRYH, PRDRYHG, PRHMLTR, &
                           &PRCBERI, &
-                          &PRS_TEND, PRG_TEND, PRH_TEND, &
+                          &PRS_TEND, PRG_TEND, PRH_TEND, PSSI, &
                           &PA_TH, PA_RV, PA_RC, PA_RR, PA_RI, PA_RS, PA_RG, PA_RH, &
                           &PB_TH, PB_RV, PB_RC, PB_RR, PB_RI, PB_RS, PB_RG, PB_RH, &
-                          &PHLC_HCF, PHLC_LCF, PHLC_HRC, PHLC_LRC, PRAINFR)
+                          &PHLC_HCF, PHLC_LCF, PHLC_HRC, PHLC_LRC, &
+                          &PHLI_HCF, PHLI_LCF, PHLI_HRI, PHLI_LRI, PRAINFR)
 !!
 !!**  PURPOSE
 !!    -------
@@ -170,9 +179,10 @@ SUBROUTINE ICE4_TENDENCIES(KSIZE, KIB, KIE, KIT, KJB, KJE, KJT, KKB, KKE, KKT, K
 !*      0. DECLARATIONS
 !          ------------
 !
-USE MODD_CST,            ONLY: XALPI,XBETAI,XCI,XCPV,XGAMI,XLSTT,XMD,XMV,XP00,XRV,XTT
+USE MODD_CST,            ONLY: XALPI,XBETAI,XCI,XCPV,XGAMI,XLSTT,XMD,XMV,XP00,XRV,XTT,XEPSILO
 USE MODD_RAIN_ICE_DESCR, ONLY: XLBDAS_MAX,XLBEXG,XLBEXH,XLBEXR,XLBEXS,XLBG,XLBH,XLBR,XLBS,XRTMIN
 USE MODD_RAIN_ICE_PARAM, ONLY: XSCFAC
+USE MODD_PARAM_ICE, ONLY : CSNOWRIMING
 !
 USE MODI_ICE4_COMPUTE_PDF
 USE MODI_ICE4_FAST_RG
@@ -194,11 +204,12 @@ IMPLICIT NONE
 INTEGER,                      INTENT(IN)    :: KSIZE, KIB, KIE, KIT, KJB, KJE, KJT, KKB, KKE, KKT, KKL
 INTEGER,                      INTENT(IN)    :: KRR
 LOGICAL,                      INTENT(IN)    :: ODSOFT
-LOGICAL, DIMENSION(KSIZE),    INTENT(IN)    :: ODCOMPUTE
+REAL, DIMENSION(KSIZE),       INTENT(IN)    :: PCOMPUTE
 LOGICAL,                      INTENT(IN)    :: OWARM
 CHARACTER(len=80),            INTENT(IN)    :: HSUBG_RC_RR_ACCR
 CHARACTER(len=80),            INTENT(IN)    :: HSUBG_RR_EVAP
 CHARACTER(len=4),             INTENT(IN)    :: HSUBG_AUCV_RC
+CHARACTER(len=80),            INTENT(IN)    :: HSUBG_AUCV_RI
 CHARACTER(len=80),            INTENT(IN)    :: HSUBG_PR_PDF ! pdf for subgrid precipitation
 REAL, DIMENSION(KSIZE),       INTENT(IN)    :: PEXN
 REAL, DIMENSION(KSIZE),       INTENT(IN)    :: PRHODREF
@@ -209,6 +220,7 @@ INTEGER, DIMENSION(KSIZE),    INTENT(IN)    :: K2
 INTEGER, DIMENSION(KSIZE),    INTENT(IN)    :: K3
 REAL, DIMENSION(KSIZE),       INTENT(IN)    :: PPRES
 REAL, DIMENSION(KSIZE),       INTENT(IN)    :: PCF
+REAL, DIMENSION(KSIZE),       INTENT(IN)    :: PSIGMA_RC
 REAL, DIMENSION(KSIZE),       INTENT(INOUT) :: PCIT
 REAL, DIMENSION(KSIZE),       INTENT(IN)    :: PT
 REAL, DIMENSION(KSIZE),       INTENT(IN)    :: PTHT
@@ -219,8 +231,6 @@ REAL, DIMENSION(KSIZE),       INTENT(IN)    :: PRIT
 REAL, DIMENSION(KSIZE),       INTENT(IN)    :: PRST
 REAL, DIMENSION(KSIZE),       INTENT(IN)    :: PRGT
 REAL, DIMENSION(KSIZE),       INTENT(IN)    :: PRHT
-REAL, DIMENSION(KIT,KJT,KKT), INTENT(IN)    :: PRRT3D
-REAL, DIMENSION(KSIZE),       INTENT(IN)    :: PSIGMA_RC
 REAL, DIMENSION(KSIZE),       INTENT(OUT)   :: PRVHENI_MR
 REAL, DIMENSION(KSIZE),       INTENT(OUT)   :: PRRHONG_MR
 REAL, DIMENSION(KSIZE),       INTENT(OUT)   :: PRIMLTC_MR
@@ -268,9 +278,10 @@ REAL, DIMENSION(KSIZE),       INTENT(OUT)   :: PRGDRYH
 REAL, DIMENSION(KSIZE),       INTENT(OUT)   :: PRDRYHG
 REAL, DIMENSION(KSIZE),       INTENT(INOUT) :: PRHMLTR
 REAL, DIMENSION(KSIZE),       INTENT(INOUT) :: PRCBERI
-REAL, DIMENSION(KSIZE, 6),    INTENT(INOUT) :: PRS_TEND
-REAL, DIMENSION(KSIZE, 6),    INTENT(INOUT) :: PRG_TEND
-REAL, DIMENSION(KSIZE, 8),    INTENT(INOUT) :: PRH_TEND
+REAL, DIMENSION(KSIZE, 8),    INTENT(INOUT) :: PRS_TEND
+REAL, DIMENSION(KSIZE, 8),    INTENT(INOUT) :: PRG_TEND
+REAL, DIMENSION(KSIZE, 10),   INTENT(INOUT) :: PRH_TEND
+REAL, DIMENSION(KSIZE),       INTENT(OUT) :: PSSI
 REAL, DIMENSION(KSIZE),       INTENT(OUT)   :: PA_TH
 REAL, DIMENSION(KSIZE),       INTENT(OUT)   :: PA_RV
 REAL, DIMENSION(KSIZE),       INTENT(OUT)   :: PA_RC
@@ -291,20 +302,24 @@ REAL, DIMENSION(KSIZE),       INTENT(OUT)   :: PHLC_HCF
 REAL, DIMENSION(KSIZE),       INTENT(OUT)   :: PHLC_LCF
 REAL, DIMENSION(KSIZE),       INTENT(OUT)   :: PHLC_HRC
 REAL, DIMENSION(KSIZE),       INTENT(OUT)   :: PHLC_LRC
+REAL, DIMENSION(KSIZE),       INTENT(OUT)   :: PHLI_HCF
+REAL, DIMENSION(KSIZE),       INTENT(OUT)   :: PHLI_LCF
+REAL, DIMENSION(KSIZE),       INTENT(OUT)   :: PHLI_HRI
+REAL, DIMENSION(KSIZE),       INTENT(OUT)   :: PHLI_LRI
 REAL, DIMENSION(KIT,KJT,KKT), INTENT(OUT)   :: PRAINFR   ! Rain fraction
 !
 !*       0.2  declaration of local variables
 !
 REAL, DIMENSION(KSIZE) :: ZRVT, ZRCT, ZRRT, ZRIT, ZRST, ZRGT, &
-                        & ZT, ZTHT, &
+                        & ZT, ZTHT, ZRHT, &
                         & ZZW, &
-                        & ZSSI, ZKA, ZDV, ZAI, ZCJ, &
+                        & ZKA, ZDV, ZAI, ZCJ, &
                         & ZRF, &
                         & ZLBDAR, ZLBDAS, ZLBDAG, ZLBDAH, ZLBDAR_RF, &
                         & ZRGSI, ZRGSI_MR
-REAL, DIMENSION(KIT,KJT,KKT) :: ZRRT3D
+REAL, DIMENSION(KIT,KJT,KKT) :: ZRRT3D, ZRST3D, ZRGT3D, ZRHT3D
 INTEGER :: JL
-LOGICAL, DIMENSION(KSIZE) :: LLWETG
+REAL, DIMENSION(KSIZE) :: ZWETG ! 1. if graupel growths in wet mode, 0. otherwise
 
 PA_TH(:)=0.
 PA_RV(:)=0.
@@ -323,93 +338,134 @@ PB_RS(:)=0.
 PB_RG(:)=0.
 PB_RH(:)=0.
 !
-ZRVT(:)=PRVT(:)
-ZRCT(:)=PRCT(:)
-ZRRT(:)=PRRT(:)
-ZRIT(:)=PRIT(:)
-ZRST(:)=PRST(:)
-ZRGT(:)=PRGT(:)
-ZTHT(:)=PTHT(:)
-ZT(:)=PT(:)
-!
-!*       2.     COMPUTES THE SLOW COLD PROCESS SOURCES
-!               --------------------------------------
-CALL ICE4_NUCLEATION(KSIZE, ODSOFT, ODCOMPUTE, &
-                     ZTHT, PPRES, PRHODREF, PEXN, PLSFACT, ZT, &
-                     ZRVT, &
-                     PCIT, PRVHENI_MR, PB_TH, PB_RV, PB_RI)
-ZRIT(:)=ZRIT(:) + PRVHENI_MR(:)
-ZRVT(:)=ZRVT(:) - PRVHENI_MR(:)
-ZTHT(:)=ZTHT(:) + PRVHENI_MR(:)*PLSFACT(:)
-ZT(:) = ZTHT(:) * PEXN(:)
-!
-!*       3.3     compute the spontaneous freezing source: RRHONG
-!
-CALL ICE4_RRHONG(KSIZE, ODSOFT, ODCOMPUTE, &
-                &PEXN, PLVFACT, PLSFACT, &
-                &ZT,   ZRRT, &
-                &ZTHT, &
-                &PRRHONG_MR, PB_TH, PB_RR, PB_RG)
-ZRGT(:) = ZRGT(:) + PRRHONG_MR(:)
-ZRRT(:) = ZRRT(:) - PRRHONG_MR(:)
-ZTHT(:) = ZTHT(:) + PRRHONG_MR(:)*(PLSFACT(:)-PLVFACT(:)) ! f(L_f*(RRHONG))
-ZT(:) = ZTHT(:) * PEXN(:)
-!
-!*       7.1    cloud ice melting
-!
-CALL ICE4_RIMLTC(KSIZE, ODSOFT, ODCOMPUTE, &
-                &PEXN, PLVFACT, PLSFACT, &
-                &ZT, &
-                &ZTHT, ZRIT, &
-                &PRIMLTC_MR, PB_TH, PB_RC, PB_RI)
-ZRCT(:) = ZRCT(:) + PRIMLTC_MR(:)
-ZRIT(:) = ZRIT(:) - PRIMLTC_MR(:)
-ZTHT(:) = ZTHT(:) - PRIMLTC_MR(:)*(PLSFACT(:)-PLVFACT(:)) ! f(L_f*(-RIMLTC))
-ZT(:) = ZTHT(:) * PEXN(:)
-!
-!        5.1.6  riming-conversion of the large sized aggregates into graupel (old parametrisation)
-!
-ZLBDAS(:)=0.
-WHERE(ZRST(:)>0.)
-  ZLBDAS(:)  = MIN(XLBDAS_MAX, XLBS*(PRHODREF(:)*MAX(ZRST(:), XRTMIN(5)))**XLBEXS)
-END WHERE
-CALL ICE4_RSRIMCG_OLD(KSIZE, ODSOFT, ODCOMPUTE, &
-                     &PRHODREF, &
-                     &ZLBDAS, &
-                     &ZT, ZRCT, ZRST, &
-                     &PRSRIMCG_MR, PB_RS, PB_RG)
-ZRST(:) = ZRST(:) - PRSRIMCG_MR(:)
-ZRGT(:) = ZRGT(:) + PRSRIMCG_MR(:)
+DO JL=1, KSIZE
+  ZRVT(JL)=PRVT(JL)
+  ZRCT(JL)=PRCT(JL)
+  ZRRT(JL)=PRRT(JL)
+  ZRIT(JL)=PRIT(JL)
+  ZRST(JL)=PRST(JL)
+  ZRGT(JL)=PRGT(JL)
+  ZTHT(JL)=PTHT(JL)
+  ZRHT(JL)=PRHT(JL)
+  ZT(JL)=PT(JL)
+ENDDO
+IF(ODSOFT) THEN
+  PRVHENI_MR(:)=0.
+  PRRHONG_MR(:)=0.
+  PRIMLTC_MR(:)=0.
+  PRSRIMCG_MR(:)=0.
+ELSE
+  !
+  !*       2.     COMPUTES THE SLOW COLD PROCESS SOURCES
+  !               --------------------------------------
+  CALL ICE4_NUCLEATION(KSIZE, ODSOFT, PCOMPUTE==1., &
+                       ZTHT, PPRES, PRHODREF, PEXN, PLSFACT, ZT, &
+                       ZRVT, &
+                       PCIT, PRVHENI_MR, PB_TH, PB_RV, PB_RI)
+  DO JL=1, KSIZE
+    ZRIT(JL)=ZRIT(JL) + PRVHENI_MR(JL)
+    ZRVT(JL)=ZRVT(JL) - PRVHENI_MR(JL)
+    ZTHT(JL)=ZTHT(JL) + PRVHENI_MR(JL)*PLSFACT(JL)
+    ZT(JL) = ZTHT(JL) * PEXN(JL)
+  ENDDO
+  !
+  !*       3.3     compute the spontaneous freezing source: RRHONG
+  !
+  CALL ICE4_RRHONG(KSIZE, ODSOFT, PCOMPUTE, &
+                  &PEXN, PLVFACT, PLSFACT, &
+                  &ZT,   ZRRT, &
+                  &ZTHT, &
+                  &PRRHONG_MR, PB_TH, PB_RR, PB_RG)
+  DO JL=1, KSIZE
+    ZRGT(JL) = ZRGT(JL) + PRRHONG_MR(JL)
+    ZRRT(JL) = ZRRT(JL) - PRRHONG_MR(JL)
+    ZTHT(JL) = ZTHT(JL) + PRRHONG_MR(JL)*(PLSFACT(JL)-PLVFACT(JL)) ! f(L_f*(RRHONG))
+    ZT(JL) = ZTHT(JL) * PEXN(JL)
+  ENDDO
+  !
+  !*       7.1    cloud ice melting
+  !
+  CALL ICE4_RIMLTC(KSIZE, ODSOFT, PCOMPUTE, &
+                  &PEXN, PLVFACT, PLSFACT, &
+                  &ZT, &
+                  &ZTHT, ZRIT, &
+                  &PRIMLTC_MR, PB_TH, PB_RC, PB_RI)
+  DO JL=1, KSIZE
+    ZRCT(JL) = ZRCT(JL) + PRIMLTC_MR(JL)
+    ZRIT(JL) = ZRIT(JL) - PRIMLTC_MR(JL)
+    ZTHT(JL) = ZTHT(JL) - PRIMLTC_MR(JL)*(PLSFACT(JL)-PLVFACT(JL)) ! f(L_f*(-RIMLTC))
+    ZT(JL) = ZTHT(JL) * PEXN(JL)
+  ENDDO
+  !
+  !        5.1.6  riming-conversion of the large sized aggregates into graupel (old parametrisation)
+  !
+  IF(CSNOWRIMING=='OLD ') THEN
+    ZLBDAS(:)=0.
+    WHERE(ZRST(:)>0.)
+      ZLBDAS(:)  = MIN(XLBDAS_MAX, XLBS*(PRHODREF(:)*MAX(ZRST(:), XRTMIN(5)))**XLBEXS)
+    END WHERE
+    CALL ICE4_RSRIMCG_OLD(KSIZE, ODSOFT, PCOMPUTE==1., &
+                         &PRHODREF, &
+                         &ZLBDAS, &
+                         &ZT, ZRCT, ZRST, &
+                         &PRSRIMCG_MR, PB_RS, PB_RG)
+    DO JL=1, KSIZE
+      ZRST(JL) = ZRST(JL) - PRSRIMCG_MR(JL)
+      ZRGT(JL) = ZRGT(JL) + PRSRIMCG_MR(JL)
+    ENDDO
+  ELSE
+    PRSRIMCG_MR(:) = 0.
+  ENDIF
+ENDIF
 !
 !* Derived fields
 !
 IF(KSIZE>0) THEN
-  ZZW(:) = EXP(XALPI-XBETAI/ZT(:)-XGAMI*ALOG(ZT(:)))
-  DO JL=1, KSIZE
-    ZSSI(JL) = ZRVT(JL)*( PPRES(JL)-ZZW(JL) ) / ( (XMV/XMD) * ZZW(JL) ) - 1.0
-                                                      ! Supersaturation over ice
-    ZKA(JL) = 2.38E-2 + 0.0071E-2*(ZT(JL)-XTT) ! k_a
-    ZDV(JL) = 0.211E-4*(ZT(JL)/XTT)**1.94 * (XP00/PPRES(JL)) ! D_v
-    ZAI(JL) = (XLSTT+(XCPV-XCI)*(ZT(JL)-XTT))**2 / (ZKA(JL)*XRV*ZT(JL)**2) &
-                                 + ( XRV*ZT(JL) ) / (ZDV(JL)*ZZW(JL))
-    ZCJ(JL) = XSCFAC*PRHODREF(JL)**0.3 / SQRT(1.718E-5+0.0049E-5*(ZT(JL)-XTT))
-  ENDDO
+  IF(.NOT. ODSOFT) THEN
+    ZZW(:) = EXP(XALPI-XBETAI/ZT(:)-XGAMI*ALOG(ZT(:)))
+    DO JL=1, KSIZE
+      PSSI(JL) = ZRVT(JL)*( PPRES(JL)-ZZW(JL) ) / ( XEPSILO * ZZW(JL) ) - 1.0
+                                                        ! Supersaturation over ice
+      ZKA(JL) = 2.38E-2 + 0.0071E-2*(ZT(JL)-XTT) ! k_a
+      ZDV(JL) = 0.211E-4*(ZT(JL)/XTT)**1.94 * (XP00/PPRES(JL)) ! D_v
+      ZAI(JL) = (XLSTT+(XCPV-XCI)*(ZT(JL)-XTT))**2 / (ZKA(JL)*XRV*ZT(JL)**2) &
+                                   + ( XRV*ZT(JL) ) / (ZDV(JL)*ZZW(JL))
+      ZCJ(JL) = XSCFAC*PRHODREF(JL)**0.3 / SQRT(1.718E-5+0.0049E-5*(ZT(JL)-XTT))
+    ENDDO
+  ENDIF
   !
   !Cloud water split between high and low content part is done here
-  CALL ICE4_COMPUTE_PDF(KSIZE, HSUBG_AUCV_RC, HSUBG_PR_PDF,&
-                        PRHODREF, ZRCT, PCF, PSIGMA_RC,&
-                        PHLC_HCF, PHLC_LCF, PHLC_HRC, PHLC_LRC, ZRF)
-  !Diagnostic of precipitation fraction
-  PRAINFR(:,:,:) = 0.
-  ZRRT3D (:,:,:) = PRRT3D(:,:,:)
-  DO JL=1,KSIZE
-    PRAINFR(K1(JL), K2(JL), K3(JL)) = ZRF(JL)
-    ZRRT3D (K1(JL), K2(JL), K3(JL)) = ZRRT3D(K1(JL), K2(JL), K3(JL)) - PRRHONG_MR(JL)
-  END DO
-  CALL ICE4_RAINFR_VERT(KIB, KIE, KIT, KJB, KJE, KJT, KKB, KKE, KKT, KKL, PRAINFR(:,:,:), ZRRT3D(:,:,:))
-  DO JL=1,KSIZE
-    ZRF(JL)=PRAINFR(K1(JL), K2(JL), K3(JL))
-  END DO
+  CALL ICE4_COMPUTE_PDF(KSIZE, HSUBG_AUCV_RC, HSUBG_AUCV_RI, HSUBG_PR_PDF,&
+                        PRHODREF, ZRCT, ZRIT, PCF, ZT, PSIGMA_RC,&
+                        PHLC_HCF, PHLC_LCF, PHLC_HRC, PHLC_LRC,&
+                        PHLI_HCF, PHLI_LCF, PHLI_HRI, PHLI_LRI, ZRF)
+  IF(HSUBG_RC_RR_ACCR=='PRFR' .OR. HSUBG_RR_EVAP=='PRFR') THEN
+    !Diagnostic of precipitation fraction
+    PRAINFR(:,:,:) = 0.
+    ZRRT3D (:,:,:) = 0.
+    ZRST3D (:,:,:) = 0.
+    ZRGT3D (:,:,:) = 0.
+    ZRHT3D (:,:,:) = 0.
+    DO JL=1,KSIZE
+      PRAINFR(K1(JL), K2(JL), K3(JL)) = ZRF(JL)
+      ZRRT3D (K1(JL), K2(JL), K3(JL)) = ZRRT(JL)
+      ZRST3D (K1(JL), K2(JL), K3(JL)) = ZRST(JL)
+      ZRGT3D (K1(JL), K2(JL), K3(JL)) = ZRGT(JL)
+    END DO
+    IF (KRR==7) THEN
+      DO JL=1,KSIZE    
+        ZRHT3D (K1(JL), K2(JL), K3(JL)) = ZRHT(JL)
+      ENDDO
+    ENDIF
+    CALL ICE4_RAINFR_VERT(KIB, KIE, KIT, KJB, KJE, KJT, KKB, KKE, KKT, KKL, PRAINFR(:,:,:), ZRRT3D(:,:,:), &
+                         &ZRST3D(:,:,:), ZRGT3D(:,:,:), ZRHT3D(:,:,:))
+    DO JL=1,KSIZE
+      ZRF(JL)=PRAINFR(K1(JL), K2(JL), K3(JL))
+    END DO
+  ELSE
+    PRAINFR(:,:,:)=1.
+    ZRF(:)=1.
+  ENDIF
   !
   !*  compute the slope parameters
   !
@@ -427,10 +483,14 @@ IF(KSIZE>0) THEN
     ZLBDAR(:)  = XLBR*( PRHODREF(:)*MAX( ZRRT(:), XRTMIN(3)))**XLBEXR
   END WHERE
   !ZLBDAR_RF is used when we consider rain concentrated in its fraction
-  ZLBDAR_RF(:)=0.
-  WHERE(ZRRT(:)>0. .AND. ZRF(:)>0.)
-    ZLBDAR_RF(:) = XLBR*( PRHODREF(:) *MAX( ZRRT(:)/ZRF(:) , XRTMIN(3)))**XLBEXR
-  END WHERE
+  IF (HSUBG_RC_RR_ACCR=='PRFR' .OR. HSUBG_RR_EVAP=='PRFR') THEN
+    ZLBDAR_RF(:)=0.
+    WHERE(ZRRT(:)>0. .AND. ZRF(:)>0.)
+      ZLBDAR_RF(:) = XLBR*( PRHODREF(:) *MAX( ZRRT(:)/ZRF(:) , XRTMIN(3)))**XLBEXR
+    END WHERE
+  ELSE
+    ZLBDAR_RF(:) = ZLBDAR(:)
+  ENDIF
   IF(KRR==7) THEN
     ZLBDAH(:)=0.
     WHERE(PRHT(:)>0.)
@@ -440,11 +500,11 @@ IF(KSIZE>0) THEN
 ENDIF
 !
 !
-CALL ICE4_SLOW(KSIZE, ODSOFT, ODCOMPUTE, PRHODREF, ZT, &
-              &ZSSI, PLVFACT, PLSFACT, &
+CALL ICE4_SLOW(KSIZE, ODSOFT, HSUBG_AUCV_RI, PCOMPUTE, PRHODREF, ZT, &
+              &PSSI, PLVFACT, PLSFACT, &
               &ZRVT, ZRCT, ZRIT, ZRST, ZRGT, &
               &ZLBDAS, ZLBDAG, &
-              &ZAI, ZCJ, &
+              &ZAI, ZCJ, PHLI_HCF, PHLI_HRI, &
               &PRCHONI, PRVDEPS, PRIAGGS, PRIAUTS, PRVDEPG, &
               &PA_TH, PA_RV, PA_RC, PA_RI, PA_RS, PA_RG)
 !
@@ -457,7 +517,7 @@ CALL ICE4_SLOW(KSIZE, ODSOFT, ODCOMPUTE, PRHODREF, ZT, &
 !
 IF(OWARM) THEN    !  Check if the formation of the raindrops by the slow
                   !  warm processes is allowed
-  CALL ICE4_WARM(KSIZE, ODSOFT, ODCOMPUTE, HSUBG_RC_RR_ACCR, HSUBG_RR_EVAP, &
+  CALL ICE4_WARM(KSIZE, ODSOFT, PCOMPUTE, HSUBG_RC_RR_ACCR, HSUBG_RR_EVAP, &
                 &PRHODREF, PLVFACT, ZT, PPRES, ZTHT,&
                 &ZLBDAR, ZLBDAR_RF, ZKA, ZDV, ZCJ, &
                 &PHLC_LCF, PHLC_HCF, PHLC_LRC, PHLC_HRC, &
@@ -477,7 +537,7 @@ END IF
 !*       4.     COMPUTES THE FAST COLD PROCESS SOURCES FOR r_s
 !               ----------------------------------------------
 !
-CALL ICE4_FAST_RS(KSIZE, ODSOFT, ODCOMPUTE, &
+CALL ICE4_FAST_RS(KSIZE, ODSOFT, PCOMPUTE, &
                  &PRHODREF, PLVFACT, PLSFACT, PPRES, &
                  &ZDV, ZKA, ZCJ, &
                  &ZLBDAR, ZLBDAS, &
@@ -495,15 +555,18 @@ CALL ICE4_FAST_RS(KSIZE, ODSOFT, ODCOMPUTE, &
 !*       5.        COMPUTES THE FAST COLD PROCESS SOURCES FOR r_g
 !                  ------------------------------------------------------
 !
-ZRGSI(:) = PRVDEPG(:) + PRSMLTG(:) + PRRACCSG(:) + PRSACCRG(:) + PRCRIMSG(:) + PRSRIMCG(:)
-ZRGSI_MR(:) = PRRHONG_MR(:) + PRSRIMCG_MR(:)
-CALL ICE4_FAST_RG(KSIZE, ODSOFT, ODCOMPUTE, KRR, &
+DO JL=1, KSIZE
+  ZRGSI(JL) = PRVDEPG(JL) + PRSMLTG(JL) + PRRACCSG(JL) + &
+           & PRSACCRG(JL) + PRCRIMSG(JL) + PRSRIMCG(JL)
+  ZRGSI_MR(JL) = PRRHONG_MR(JL) + PRSRIMCG_MR(JL)
+ENDDO
+CALL ICE4_FAST_RG(KSIZE, ODSOFT, PCOMPUTE, KRR, &
                  &PRHODREF, PLVFACT, PLSFACT, PPRES, &
                  &ZDV, ZKA, ZCJ, PCIT, &
                  &ZLBDAR, ZLBDAS, ZLBDAG, &
                  &ZT, ZRVT, ZRCT, ZRRT, ZRIT, ZRST, ZRGT, &
                  &ZRGSI, ZRGSI_MR(:), &
-                 &LLWETG, &
+                 &ZWETG, &
                  &PRICFRRG, PRRCFRIG, PRICFRR, PRCWETG, PRIWETG, PRRWETG, PRSWETG, &
                  &PRCDRYG, PRIDRYG, PRRDRYG, PRSDRYG, PRWETGH, PRWETGH_MR, PRGMLTR, &
                  &PRG_TEND, &
@@ -516,7 +579,7 @@ CALL ICE4_FAST_RG(KSIZE, ODSOFT, ODCOMPUTE, KRR, &
 !               ----------------------------------------------
 !
 IF (KRR==7) THEN
-  CALL ICE4_FAST_RH(KSIZE, ODSOFT, ODCOMPUTE, LLWETG, &
+  CALL ICE4_FAST_RH(KSIZE, ODSOFT, PCOMPUTE, ZWETG, &
                    &PRHODREF, PLVFACT, PLSFACT, PPRES, &
                    &ZDV, ZKA, ZCJ, &
                    &ZLBDAS, ZLBDAG, ZLBDAR, ZLBDAH, &
@@ -546,10 +609,10 @@ END IF
 !*       7.     COMPUTES SPECIFIC SOURCES OF THE WARM AND COLD CLOUDY SPECIES
 !               -------------------------------------------------------------
 !
-CALL ICE4_FAST_RI(KSIZE, ODSOFT, ODCOMPUTE, &
+CALL ICE4_FAST_RI(KSIZE, ODSOFT, PCOMPUTE, &
                  &PRHODREF, PLVFACT, PLSFACT, &
                  &ZAI, ZCJ, PCIT, &
-                 &ZSSI, &
+                 &PSSI, &
                  &ZRCT, ZRIT, &
                  &PRCBERI, PA_TH, PA_RC, PA_RI)
 !
diff --git a/src/MNH/ice4_warm.f90 b/src/MNH/ice4_warm.f90
index 429c0522b..ff37bc325 100644
--- a/src/MNH/ice4_warm.f90
+++ b/src/MNH/ice4_warm.f90
@@ -5,7 +5,7 @@
 !-----------------------------------------------------------------
 MODULE MODI_ICE4_WARM
 INTERFACE
-SUBROUTINE ICE4_WARM(KSIZE, LDSOFT, LDCOMPUTE, HSUBG_RC_RR_ACCR, HSUBG_RR_EVAP, &
+SUBROUTINE ICE4_WARM(KSIZE, LDSOFT, PCOMPUTE, HSUBG_RC_RR_ACCR, HSUBG_RR_EVAP, &
                      PRHODREF, PLVFACT, PT, PPRES, PTHT, &
                      PLBDAR, PLBDAR_RF, PKA, PDV, PCJ, &
                      PHLC_LCF, PHLC_HCF, PHLC_LRC, PHLC_HRC, &
@@ -16,7 +16,7 @@ SUBROUTINE ICE4_WARM(KSIZE, LDSOFT, LDCOMPUTE, HSUBG_RC_RR_ACCR, HSUBG_RR_EVAP,
 IMPLICIT NONE
 INTEGER,                      INTENT(IN)    :: KSIZE
 LOGICAL,                      INTENT(IN)    :: LDSOFT
-LOGICAL, DIMENSION(KSIZE),    INTENT(IN)    :: LDCOMPUTE
+REAL, DIMENSION(KSIZE),       INTENT(IN)    :: PCOMPUTE
 CHARACTER(len=80),            INTENT(IN)    :: HSUBG_RC_RR_ACCR ! subgrid rc-rr accretion
 CHARACTER(len=80),            INTENT(IN)    :: HSUBG_RR_EVAP ! subgrid rr evaporation
 REAL, DIMENSION(KSIZE),       INTENT(IN)    :: PRHODREF ! Reference density
@@ -48,7 +48,7 @@ REAL, DIMENSION(KSIZE),       INTENT(INOUT) :: PA_RR
 END SUBROUTINE ICE4_WARM
 END INTERFACE
 END MODULE MODI_ICE4_WARM
-SUBROUTINE ICE4_WARM(KSIZE, LDSOFT, LDCOMPUTE, HSUBG_RC_RR_ACCR, HSUBG_RR_EVAP, &
+SUBROUTINE ICE4_WARM(KSIZE, LDSOFT, PCOMPUTE, HSUBG_RC_RR_ACCR, HSUBG_RR_EVAP, &
                      PRHODREF, PLVFACT, PT, PPRES, PTHT, &
                      PLBDAR, PLBDAR_RF, PKA, PDV, PCJ, &
                      PHLC_LCF, PHLC_HCF, PHLC_LRC, PHLC_HRC, &
@@ -73,7 +73,7 @@ SUBROUTINE ICE4_WARM(KSIZE, LDSOFT, LDCOMPUTE, HSUBG_RC_RR_ACCR, HSUBG_RR_EVAP,
 !*      0. DECLARATIONS
 !          ------------
 !
-USE MODD_CST,            ONLY: XALPW,XBETAW,XCL,XCPD,XCPV,XGAMW,XLVTT,XMD,XMV,XRV,XTT
+USE MODD_CST,            ONLY: XALPW,XBETAW,XCL,XCPD,XCPV,XGAMW,XLVTT,XMD,XMV,XRV,XTT,XEPSILO
 USE MODD_RAIN_ICE_DESCR, ONLY: XCEXVT,XRTMIN
 USE MODD_RAIN_ICE_PARAM, ONLY: X0EVAR,X1EVAR,XCRIAUTC,XEX0EVAR,XEX1EVAR,XEXCACCR,XFCACCR,XTIMAUTC
 !
@@ -85,7 +85,7 @@ IMPLICIT NONE
 !
 INTEGER,                      INTENT(IN)    :: KSIZE
 LOGICAL,                      INTENT(IN)    :: LDSOFT
-LOGICAL, DIMENSION(KSIZE),    INTENT(IN)    :: LDCOMPUTE
+REAL, DIMENSION(KSIZE),       INTENT(IN)    :: PCOMPUTE
 CHARACTER(len=80),            INTENT(IN)    :: HSUBG_RC_RR_ACCR ! subgrid rc-rr accretion
 CHARACTER(len=80),            INTENT(IN)    :: HSUBG_RR_EVAP ! subgrid rr evaporation
 REAL, DIMENSION(KSIZE),       INTENT(IN)    :: PRHODREF ! Reference density
@@ -117,10 +117,12 @@ REAL, DIMENSION(KSIZE),       INTENT(INOUT) :: PA_RR
 !
 !*       0.2  declaration of local variables
 !
-LOGICAL, DIMENSION(SIZE(PRHODREF)) :: GMASK, GMASK1, GMASK2
-REAL, DIMENSION(SIZE(PRHODREF))    :: ZZW2, ZZW3, ZZW4
-REAL, DIMENSION(SIZE(PRHODREF))    :: ZUSW ! Undersaturation over water
-REAL, DIMENSION(SIZE(PRHODREF))    :: ZTHLT    ! Liquid potential temperature
+REAL, DIMENSION(KSIZE) :: ZZW2, ZZW3, ZZW4
+REAL, DIMENSION(KSIZE) :: ZUSW ! Undersaturation over water
+REAL, DIMENSION(KSIZE) :: ZTHLT    ! Liquid potential temperature
+REAL, DIMENSION(KSIZE) :: ZMASK, ZMASK1, ZMASK2
+INTEGER :: JL
+!-------------------------------------------------------------------------------
 !
 !
 !
@@ -128,33 +130,44 @@ REAL, DIMENSION(SIZE(PRHODREF))    :: ZTHLT    ! Liquid potential temperature
 !
 !*       4.2    compute the autoconversion of r_c for r_r production: RCAUTR
 !
-GMASK(:)=PHLC_HRC(:)>XRTMIN(2) .AND. PHLC_HCF(:) .GT. 0. .AND. LDCOMPUTE(:)
+DO JL=1, KSIZE
+  ZMASK(JL)=MAX(0., -SIGN(1., XRTMIN(2)-PHLC_HRC(JL))) * & ! PHLC_HRC(:)>XRTMIN(2)
+           &MAX(0., -SIGN(1., 1.E-20-PHLC_HCF(JL))) * & ! PHLC_HCF(:) .GT. 0.
+           &PCOMPUTE(JL)
+ENDDO
 IF(LDSOFT) THEN
-  WHERE(.NOT. GMASK(:))
-    PRCAUTR(:) = 0.
-  END WHERE
+  DO JL=1, KSIZE
+    PRCAUTR(JL)=PRCAUTR(JL)*ZMASK(JL)
+  ENDDO
 ELSE
   PRCAUTR(:) = 0.
-  WHERE(GMASK(:))
+  WHERE(ZMASK(:)==1.)
     PRCAUTR(:) = XTIMAUTC*MAX(PHLC_HRC(:)/PHLC_HCF(:) - XCRIAUTC/PRHODREF(:), 0.0)
     PRCAUTR(:) = PHLC_HCF(:)*PRCAUTR(:)
   END WHERE
 ENDIF
-PA_RC(:) = PA_RC(:) - PRCAUTR(:)
-PA_RR(:) = PA_RR(:) + PRCAUTR(:)
+DO JL=1, KSIZE
+  PA_RC(JL) = PA_RC(JL) - PRCAUTR(JL)
+  PA_RR(JL) = PA_RR(JL) + PRCAUTR(JL)
+ENDDO
+!
 !
 !*       4.3    compute the accretion of r_c for r_r production: RCACCR
 !
 IF (HSUBG_RC_RR_ACCR=='NONE') THEN
   !CLoud water and rain are diluted over the grid box
-  GMASK(:)=PRCT(:)>XRTMIN(2) .AND. PRRT(:)>XRTMIN(3) .AND. LDCOMPUTE(:)
+  DO JL=1, KSIZE
+    ZMASK(JL)=MAX(0., -SIGN(1., XRTMIN(2)-PRCT(JL))) * & ! PRCT(:)>XRTMIN(2)
+             &MAX(0., -SIGN(1., XRTMIN(3)-PRRT(JL))) * & ! PRRT(:)>XRTMIN(3)
+             &PCOMPUTE(JL)
+  ENDDO
   IF(LDSOFT) THEN
-    WHERE(.NOT. GMASK(:))
-      PRCACCR(:)=0.
-    END WHERE
+    DO JL=1, KSIZE
+      PRCACCR(JL)=PRCACCR(JL) * ZMASK(JL)
+    ENDDO
   ELSE
     PRCACCR(:) = 0.
-    WHERE(GMASK(:))
+    WHERE(ZMASK(:)==1.)
       PRCACCR(:) = XFCACCR * PRCT(:)                &
                  * PLBDAR(:)**XEXCACCR    &
                  * PRHODREF(:)**(-XCEXVT)
@@ -169,23 +182,31 @@ ELSEIF (HSUBG_RC_RR_ACCR=='PRFR') THEN
   ! if PRF<PCF (rain is entirely falling in cloud): PRF-PHLC_HCF
   ! if PRF>PCF (rain is falling in cloud and in clear sky): PCF-PHLC_HCF
   ! => min(PCF, PRF)-PHLC_HCF
-  GMASK(:)=PRCT(:)>XRTMIN(2) .AND. PRRT(:)>XRTMIN(3) .AND. LDCOMPUTE(:)
-  GMASK1(:)=GMASK(:) .AND. PHLC_HRC(:)>XRTMIN(2) .AND. PHLC_HCF(:)>0.
-  GMASK2(:)=GMASK(:) .AND. PHLC_LRC(:)>XRTMIN(2) .AND. PHLC_LCF(:)>0.
+  DO JL=1, KSIZE
+    ZMASK(JL)=MAX(0., -SIGN(1., XRTMIN(2)-PRCT(JL))) * & ! PRCT(:)>XRTMIN(2)
+             &MAX(0., -SIGN(1., XRTMIN(3)-PRRT(JL))) * & ! PRRT(:)>XRTMIN(3)
+             &PCOMPUTE(JL)
+    ZMASK1(JL)=ZMASK(JL) * &
+              &MAX(0., -SIGN(1., XRTMIN(2)-PHLC_HRC(JL))) * & ! PHLC_HRC(:)>XRTMIN(2)
+              &MAX(0., -SIGN(1., 1.E-20-PHLC_HCF(JL))) ! PHLC_HCF(:)>0.
+    ZMASK2(JL)=ZMASK(JL) * &
+              &MAX(0., -SIGN(1., XRTMIN(2)-PHLC_LRC(JL))) * & ! PHLC_LRC(:)>XRTMIN(2)
+              &MAX(0., -SIGN(1., 1.E-20-PHLC_LCF(JL))) ! PHLC_LCF(:)>0.
+  ENDDO
   IF(LDSOFT) THEN
-    WHERE(.NOT. (GMASK1(:) .OR. GMASK2(:)))
-      PRCACCR(:)=0.
-    END WHERE
+    DO JL=1, KSIZE
+      PRCACCR(JL)=PRCACCR(JL) * MIN(1., ZMASK1(JL)+ZMASK2(JL))
+    ENDDO
   ELSE
     PRCACCR(:)=0.
-    WHERE(GMASK1(:))
+    WHERE(ZMASK1(:)==1.)
       !Accretion due to rain falling in high cloud content
       PRCACCR(:) = XFCACCR * ( PHLC_HRC(:)/PHLC_HCF(:) )     &
              * PLBDAR_RF(:)**XEXCACCR &
              * PRHODREF(:)**(-XCEXVT) &
              * PHLC_HCF
     END WHERE
-    WHERE(GMASK2(:))
+    WHERE(ZMASK2(:)==1.)
       !We add acrretion due to rain falling in low cloud content
       PRCACCR(:) = PRCACCR(:) + XFCACCR * ( PHLC_LRC(:)/PHLC_LCF(:) )     &
                       * PLBDAR_RF(:)**XEXCACCR &
@@ -196,24 +217,29 @@ ELSEIF (HSUBG_RC_RR_ACCR=='PRFR') THEN
 ELSE
   CALL PRINT_MSG(NVERB_FATAL,'GEN','ICE4_WARM','wrong HSUBG_RC_RR_ACCR case')
 ENDIF
-!
-PA_RC(:) = PA_RC(:) - PRCACCR(:)
-PA_RR(:) = PA_RR(:) + PRCACCR(:)
+DO JL=1, KSIZE
+  PA_RC(JL) = PA_RC(JL) - PRCACCR(JL)
+  PA_RR(JL) = PA_RR(JL) + PRCACCR(JL)
+ENDDO
 !
 !*       4.4    compute the evaporation of r_r: RREVAV
 !
 IF (HSUBG_RR_EVAP=='NONE') THEN
-  GMASK(:)=PRRT(:)>XRTMIN(3) .AND. PRCT(:)<=XRTMIN(2) .AND. LDCOMPUTE(:)
+  DO JL=1, KSIZE
+    ZMASK(JL)=MAX(0., -SIGN(1., XRTMIN(3)-PRRT(JL))) * & ! PRRT(:)>XRTMIN(3)
+             &MAX(0., SIGN(1., XRTMIN(2)-PRCT(JL))) * & ! PRCT(:)<=XRTMIN(2)
+             &PCOMPUTE(JL)
+  ENDDO
   IF(LDSOFT) THEN
-    WHERE(.NOT. GMASK(:))
-      PRREVAV(:)=0.
-    END WHERE
+    DO JL=1, KSIZE
+      PRREVAV(JL)=PRREVAV(JL)*ZMASK(JL)
+    ENDDO
   ELSE
     PRREVAV(:) = 0.
     !Evaporation only when there's no cloud (RC must be 0)
-    WHERE(GMASK(:))
+    WHERE(ZMASK(:)==1.)
       PRREVAV(:)  = EXP( XALPW - XBETAW/PT(:) - XGAMW*ALOG(PT(:) ) ) ! es_w
-      ZUSW(:) = 1.0 - PRVT(:)*( PPRES(:)-PRREVAV(:) ) / ( (XMV/XMD) * PRREVAV(:) )
+      ZUSW(:) = 1.0 - PRVT(:)*( PPRES(:)-PRREVAV(:) ) / ( XEPSILO * PRREVAV(:) )
                                                     ! Undersaturation over water
       PRREVAV(:) = ( XLVTT+(XCPV-XCL)*(PT(:)-XTT) )**2 / ( PKA(:)*XRV*PT(:)**2 ) &
            + ( XRV*PT(:) ) / ( PDV(:)*PRREVAV(:) )
@@ -240,14 +266,18 @@ ELSEIF (HSUBG_RR_EVAP=='CLFR' .OR. HSUBG_RR_EVAP=='PRFR') THEN
   !Ces variables devraient être sorties de rain_ice_slow et on mettrait le calcul de T^u, T^s
   !et plusieurs versions (comme actuellement, en ciel clair, en ciel nuageux) de PKA, PDV, PCJ dans rain_ice
   !On utiliserait la bonne version suivant l'option NONE, CLFR... dans l'évaporation et ailleurs
-  GMASK(:)=PRRT(:)>XRTMIN(3) .AND. ZZW4(:) > PCF(:) .AND. LDCOMPUTE(:)
+  DO JL=1, KSIZE
+    ZMASK(JL)=MAX(0., -SIGN(1., XRTMIN(3)-PRRT(JL))) * & ! PRRT(:)>XRTMIN(3)
+             &MAX(0., -SIGN(1., PCF(JL)-ZZW4(JL))) * & ! ZZW4(:) > PCF(:)
+             &PCOMPUTE(JL)
+  ENDDO
   IF(LDSOFT) THEN
-    WHERE(.NOT. GMASK(:))
-      PRREVAV(:)=0.
-    END WHERE
+    DO JL=1, KSIZE
+      PRREVAV(JL)=PRREVAV(JL)*ZMASK(JL)
+    ENDDO
   ELSE
     PRREVAV(:) = 0.
-    WHERE(GMASK(:))
+    WHERE(ZMASK(:)==1)
       ! outside the cloud (environment) the use of T^u (unsaturated) instead of T
       ! Bechtold et al. 1993
       !
@@ -261,7 +291,7 @@ ELSEIF (HSUBG_RR_EVAP=='CLFR' .OR. HSUBG_RR_EVAP=='PRFR') THEN
       PRREVAV(:)  = EXP( XALPW - XBETAW/ZZW2(:) - XGAMW*ALOG(ZZW2(:) ) )
       !
       ! S, Undersaturation over water (with new theta^u)
-      ZUSW(:) = 1.0 - PRVT(:)*( PPRES(:)-PRREVAV(:) ) / ( (XMV/XMD) * PRREVAV(:) )
+      ZUSW(:) = 1.0 - PRVT(:)*( PPRES(:)-PRREVAV(:) ) / ( XEPSILO * PRREVAV(:) )
       !
       PRREVAV(:) = ( XLVTT+(XCPV-XCL)*(ZZW2(:)-XTT) )**2 / ( PKA(:)*XRV*ZZW2(:)**2 ) &
              + ( XRV*ZZW2(:) ) / ( PDV(:)*PRREVAV(:) )
@@ -276,9 +306,11 @@ ELSEIF (HSUBG_RR_EVAP=='CLFR' .OR. HSUBG_RR_EVAP=='PRFR') THEN
 ELSE
   CALL PRINT_MSG(NVERB_FATAL,'GEN','ICE4_WARM','wrong HSUBG_RR_EVAP case')
 END IF
-PA_RR(:) = PA_RR(:) - PRREVAV(:)
-PA_RV(:) = PA_RV(:) + PRREVAV(:)
-PA_TH(:) = PA_TH(:) - PRREVAV(:)*PLVFACT(:)
+DO JL=1, KSIZE
+  PA_RR(JL) = PA_RR(JL) - PRREVAV(JL)
+  PA_RV(JL) = PA_RV(JL) + PRREVAV(JL)
+  PA_TH(JL) = PA_TH(JL) - PRREVAV(JL)*PLVFACT(JL)
+ENDDO
 !
 !
 END SUBROUTINE ICE4_WARM
diff --git a/src/MNH/ice_adjust.f90 b/src/MNH/ice_adjust.f90
index aaf7c903b..fa66ddbaa 100644
--- a/src/MNH/ice_adjust.f90
+++ b/src/MNH/ice_adjust.f90
@@ -9,32 +9,37 @@
 !
 INTERFACE
 !
-      SUBROUTINE ICE_ADJUST (KKA, KKU, KKL, KRR, HFRAC_ICE,                    &
-                             HBUNAME, OSUBG_COND, OSIGMAS,                     &
+      SUBROUTINE ICE_ADJUST (KKA, KKU, KKL, KRR, HFRAC_ICE, HCONDENS, HLAMBDA3,&
+                             HBUNAME, OSUBG_COND, OSIGMAS, HSUBG_MF_PDF,&
                              PTSTEP, PSIGQSAT,                                 &
-                             PRHODJ, PEXNREF, PSIGS, PMFCONV, PPABST, PZZ,     &
+                             PRHODJ, PEXNREF, PRHODREF, PSIGS, PMFCONV, PPABST, PZZ,     &
                              PEXN, PCF_MF, PRC_MF, PRI_MF,                     &
                              PRV, PRC, PRVS, PRCS, PTH, PTHS, PSRCS, PCLDFR ,  &
                              PRR, PRI, PRIS, PRS, PRG,                         &
-                             PRH, POUT_RV, POUT_RC, POUT_RI, POUT_TH           )
+                             PRH, POUT_RV, POUT_RC, POUT_RI, POUT_TH,          &
+                             PHLC_HRC, PHLC_HCF, PHLI_HRI, PHLI_HCF            )
 !
 INTEGER,                  INTENT(IN)    :: KKA   !near ground array index  
 INTEGER,                  INTENT(IN)    :: KKU   !uppest atmosphere array index
 INTEGER,                  INTENT(IN)    :: KKL   !vert. levels type 1=MNH -1=ARO
 INTEGER,                  INTENT(IN)    :: KRR      ! Number of moist variables
 CHARACTER(len=1),         INTENT(IN)    :: HFRAC_ICE
+CHARACTER(len=80),             INTENT(IN)    :: HCONDENS
+CHARACTER(len=4),              INTENT(IN)    :: HLAMBDA3 ! formulation for lambda3 coeff
 CHARACTER(len=*),         INTENT(IN)    :: HBUNAME  ! Name of the budget
 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
+CHARACTER(len=80),             INTENT(IN)    :: HSUBG_MF_PDF
 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)   ::  PRHODREF
 !
 REAL, DIMENSION(:,:,:),   INTENT(IN)   ::  PSIGS   ! Sigma_s at time t
 REAL, DIMENSION(:,:,:),   INTENT(IN)   ::  PMFCONV ! convective mass flux
@@ -66,6 +71,10 @@ REAL, DIMENSION(:,:,:), OPTIONAL, INTENT(OUT)  ::  POUT_RV ! Adjusted value
 REAL, DIMENSION(:,:,:), OPTIONAL, INTENT(OUT)  ::  POUT_RC ! Adjusted value
 REAL, DIMENSION(:,:,:), OPTIONAL, INTENT(OUT)  ::  POUT_RI ! Adjusted value
 REAL, DIMENSION(:,:,:), OPTIONAL, INTENT(OUT)  ::  POUT_TH ! Adjusted value
+REAL, DIMENSION(:,:,:), OPTIONAL, INTENT(OUT)  ::  PHLC_HRC
+REAL, DIMENSION(:,:,:), OPTIONAL, INTENT(OUT)  ::  PHLC_HCF
+REAL, DIMENSION(:,:,:), OPTIONAL, INTENT(OUT)  ::  PHLI_HRI
+REAL, DIMENSION(:,:,:), OPTIONAL, INTENT(OUT)  ::  PHLI_HCF
 !
 !
 END SUBROUTINE ICE_ADJUST
@@ -75,14 +84,16 @@ END INTERFACE
 END MODULE MODI_ICE_ADJUST
 
 !     ##########################################################################
-      SUBROUTINE ICE_ADJUST (KKA, KKU, KKL, KRR, HFRAC_ICE,                    &
-                             HBUNAME, OSUBG_COND, OSIGMAS,                     &
+      SUBROUTINE ICE_ADJUST (KKA, KKU, KKL, KRR, HFRAC_ICE, HCONDENS, HLAMBDA3,&
+                             HBUNAME, OSUBG_COND, OSIGMAS, HSUBG_MF_PDF,       &
                              PTSTEP, PSIGQSAT,                                 &
-                             PRHODJ, PEXNREF, PSIGS, PMFCONV, PPABST, PZZ,     &
+                             PRHODJ, PEXNREF, PRHODREF, PSIGS, PMFCONV,        &
+                             PPABST, PZZ,                                      &
                              PEXN, PCF_MF, PRC_MF, PRI_MF,                     &
-                             PRV, PRC, PRVS, PRCS, PTH, PTHS, PSRCS, PCLDFR ,  &
+                             PRV, PRC, PRVS, PRCS, PTH, PTHS, PSRCS, PCLDFR,   &
                              PRR, PRI, PRIS, PRS, PRG, PRH,                    &
-                             POUT_RV, POUT_RC, POUT_RI, POUT_TH                )
+                             POUT_RV, POUT_RC, POUT_RI, POUT_TH,               &
+                             PHLC_HRC, PHLC_HCF, PHLI_HRI, PHLI_HCF            )
 !     #########################################################################
 !
 !!****  *ICE_ADJUST* -  compute the ajustment of water vapor in mixed-phase 
@@ -178,6 +189,7 @@ USE MODD_CST
 USE MODD_PARAMETERS
 
 use mode_budget,       only: Budget_store_init, Budget_store_end
+USE MODD_RAIN_ICE_PARAM, ONLY : XCRIAUTC, XCRIAUTI, XACRIAUTI, XBCRIAUTI
 use mode_tools_ll,     only: GET_INDICE_ll
 
 USE MODI_CONDENSATION
@@ -194,18 +206,22 @@ INTEGER,                  INTENT(IN)    :: KKU  !uppest atmosphere array index
 INTEGER,                  INTENT(IN)    :: KKL  !vert. levels type 1=MNH -1=ARO
 INTEGER,                  INTENT(IN)    :: KRR      ! Number of moist variables
 CHARACTER(len=1),         INTENT(IN)    :: HFRAC_ICE
+CHARACTER(len=80),             INTENT(IN)    :: HCONDENS
+CHARACTER(len=4),              INTENT(IN)    :: HLAMBDA3 ! formulation for lambda3 coeff
 CHARACTER(len=*),         INTENT(IN)    :: HBUNAME  ! Name of the budget
 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
+CHARACTER(len=80),             INTENT(IN)    :: HSUBG_MF_PDF
 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)   ::  PRHODREF
 !
 REAL, DIMENSION(:,:,:),   INTENT(IN)   ::  PSIGS   ! Sigma_s at time t
 REAL, DIMENSION(:,:,:),   INTENT(IN)   ::  PMFCONV ! convective mass flux
@@ -238,6 +254,10 @@ REAL, DIMENSION(:,:,:), OPTIONAL, INTENT(OUT)  ::  POUT_RV ! Adjusted value
 REAL, DIMENSION(:,:,:), OPTIONAL, INTENT(OUT)  ::  POUT_RC ! Adjusted value
 REAL, DIMENSION(:,:,:), OPTIONAL, INTENT(OUT)  ::  POUT_RI ! Adjusted value
 REAL, DIMENSION(:,:,:), OPTIONAL, INTENT(OUT)  ::  POUT_TH ! Adjusted value
+REAL, DIMENSION(:,:,:), OPTIONAL, INTENT(OUT)  ::  PHLC_HRC
+REAL, DIMENSION(:,:,:), OPTIONAL, INTENT(OUT)  ::  PHLC_HCF
+REAL, DIMENSION(:,:,:), OPTIONAL, INTENT(OUT)  ::  PHLI_HRI
+REAL, DIMENSION(:,:,:), OPTIONAL, INTENT(OUT)  ::  PHLI_HCF
 !
 !*       0.2   Declarations of local variables :
 !
@@ -248,7 +268,9 @@ REAL, DIMENSION(SIZE(PEXNREF,1),SIZE(PEXNREF,2),SIZE(PEXNREF,3)) &
                             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    ! Work arrays for intermediate fields
+                         ZW1,ZW2, &  ! Work arrays for intermediate fields
+                         ZCRIAUT, &  ! Autoconversion thresholds
+                       ZHCF, ZHR
 !
 INTEGER             :: IIU,IJU,IKU! dimensions of dummy arrays
 INTEGER             :: IIB,IJB    ! Horz index values of the first inner mass points
@@ -327,10 +349,11 @@ DO JITER =1,ITERMAX
     !
     !   PSRC= s'rci'/Sigma_s^2
     !   ZT, ZRV, ZRC and ZRI are INOUT
-    CALL CONDENSATION(IIU, IJU, IKU, IIB, IIE, IJB, IJE, IKB, IKE, KKL,                  &
-         HFRAC_ICE,                                                                      &
-         PPABST, PZZ, ZT, ZRV, ZRC, ZRI, PRS, PRG, PSIGS, PMFCONV, PCLDFR, PSRCS, .TRUE., OSIGMAS, &
-         PSIGQSAT, PLV=ZLV, PLS=ZLS, PCPH=ZCPH )
+    CALL CONDENSATION(IIU, IJU, IKU, IIB, IIE, IJB, IJE, IKB, IKE, KKL, &
+         HFRAC_ICE, HCONDENS, HLAMBDA3,                                    &
+         PPABST, PZZ, PRHODREF, ZT, ZRV, ZRC, ZRI, PRS, PRG, PSIGS, PMFCONV, PCLDFR, &
+         PSRCS, .TRUE., OSIGMAS,                                           &
+         PSIGQSAT, PLV=ZLV, PLS=ZLS, PCPH=ZCPH, PHLC_HRC=PHLC_HRC, PHLC_HCF=PHLC_HCF, PHLI_HRI=PHLI_HRI, PHLI_HCF=PHLI_HCF)
   ELSE
     !
     !*       4.     ALL OR NOTHING CONDENSATION SCHEME
@@ -343,12 +366,12 @@ DO JITER =1,ITERMAX
     !CALL ADJUST_LANGLOIS(IIU, IJU, IKU, IIB, IIE, IJB, IJE, IKB, IKE, KKL,                &
     !                     PPABST, ZT, ZRV, ZRC, ZRI, ZLV, ZLS, ZCPH) HFRAC_ICE must be implemented in Langlois before using it again
     ZSIGS=0.
-    CALL CONDENSATION(IIU, IJU, IKU, IIB, IIE, IJB, IJE, IKB, IKE, KKL,        &
-         HFRAC_ICE,                                                            &
-         PPABST, PZZ, ZT, ZRV, ZRC, ZRI, PRS, PRG, ZSIGS, PMFCONV, PCLDFR,     &
-         ZSRCS, .TRUE., OSIGMAS=.TRUE.,                                        &
-         PSIGQSAT=0., PLV=ZLV, PLS=ZLS, PCPH=ZCPH )
-  END IF
+    CALL CONDENSATION(IIU, IJU, IKU, IIB, IIE, IJB, IJE, IKB, IKE, KKL, &
+         HFRAC_ICE, HCONDENS, HLAMBDA3,                                    &
+         PPABST, PZZ, PRHODREF, ZT, ZRV, ZRC, ZRI, PRS, PRG, ZSIGS, PMFCONV, PCLDFR, &
+         ZSRCS, .TRUE., OSIGMAS=.TRUE.,                                    &
+         PSIGQSAT=0., PLV=ZLV, PLS=ZLS, PHLC_HRC=PHLC_HRC, PHLC_HCF=PHLC_HCF, PHLI_HRI=PHLI_HRI, PHLI_HCF=PHLI_HCF)
+  ENDIF
 ENDDO         ! end of the iterative loop
 !
 !*       5.     COMPUTE THE SOURCES AND STORES THE CLOUD FRACTION
@@ -405,6 +428,59 @@ ELSE
     ZW1(:,:,:)=ZW1(:,:,:)*PRVS(:,:,:)/(ZW1(:,:,:)+ZW2(:,:,:))
     ZW2(:,:,:)=PRVS(:,:,:)-ZW1(:,:,:)
   ENDWHERE
+  IF(PRESENT(PHLC_HRC) .AND. PRESENT(PHLC_HCF)) THEN
+    ZCRIAUT(:,:,:)=XCRIAUTC/PRHODREF
+    IF(HSUBG_MF_PDF=='NONE')THEN
+      WHERE(ZW1(:,:,:)*PTSTEP>PCF_MF * ZCRIAUT)
+        PHLC_HRC(:,:,:)=PHLC_HRC(:,:,:)+ZW1(:,:,:)*PTSTEP
+        PHLC_HCF(:,:,:)=MIN(1.,PHLC_HCF(:,:,:)+PCF_MF(:,:,:))
+      ENDWHERE
+    ELSEIF(HSUBG_MF_PDF=='TRIANGLE')THEN
+      !ZHCF is the precipitating part of the *cloud* and not of the grid cell
+      WHERE(ZW1(:,:,:)*PTSTEP>PCF_MF*ZCRIAUT(:,:,:))
+        ZHCF(:,:,:)=1.-.5*(ZCRIAUT(:,:,:)*PCF_MF(:,:,:) / MAX(1.E-20, ZW1(:,:,:)*PTSTEP))**2
+        ZHR(:,:,:)=ZW1(:,:,:)*PTSTEP-(ZCRIAUT(:,:,:)*PCF_MF(:,:,:))**3 / &
+                                    &(3*MAX(1.E-20, ZW1(:,:,:)*PTSTEP)**2)
+      ELSEWHERE(2.*ZW1(:,:,:)*PTSTEP<=PCF_MF * ZCRIAUT(:,:,:))
+        ZHCF(:,:,:)=0.
+        ZHR(:,:,:)=0.
+      ELSEWHERE
+        ZHCF(:,:,:)=(2.*ZW1(:,:,:)*PTSTEP-ZCRIAUT(:,:,:)*PCF_MF(:,:,:))**2 / &
+                   &(2.*MAX(1.E-20, ZW1(:,:,:)*PTSTEP)**2)
+        ZHR(:,:,:)=(4.*(ZW1(:,:,:)*PTSTEP)**3-3.*ZW1(:,:,:)*PTSTEP*(ZCRIAUT(:,:,:)*PCF_MF(:,:,:))**2+&
+                    (ZCRIAUT(:,:,:)*PCF_MF(:,:,:))**3) / &
+                  &(3*MAX(1.E-20, ZW1(:,:,:)*PTSTEP)**2)
+      ENDWHERE
+      ZHCF(:,:,:)=ZHCF(:,:,:)*PCF_MF(:,:,:) !to retrieve the part of the grid cell
+      PHLC_HCF(:,:,:)=MIN(1.,PHLC_HCF(:,:,:)+ZHCF(:,:,:)) !total part of the grid cell that is precipitating
+      PHLC_HRC(:,:,:)=PHLC_HRC(:,:,:)+ZHR(:,:,:)
+    ENDIF
+  ENDIF
+  IF(PRESENT(PHLI_HRI) .AND. PRESENT(PHLI_HCF)) THEN
+    ZCRIAUT(:,:,:)=MIN(XCRIAUTI,10**(XACRIAUTI*(ZT(:,:,:)-XTT)+XBCRIAUTI))
+    IF(HSUBG_MF_PDF=='NONE')THEN
+      WHERE(ZW2(:,:,:)*PTSTEP>PCF_MF * ZCRIAUT(:,:,:))
+        PHLI_HRI(:,:,:)=PHLI_HRI(:,:,:)+ZW2(:,:,:)*PTSTEP
+        PHLI_HCF(:,:,:)=MIN(1.,PHLI_HCF(:,:,:)+PCF_MF(:,:,:))
+      ENDWHERE
+    ELSEIF(HSUBG_MF_PDF=='TRIANGLE')THEN
+      !ZHCF is the precipitating part of the *cloud* and not of the grid cell
+      WHERE(ZW2(:,:,:)*PTSTEP>PCF_MF*ZCRIAUT)
+        ZHCF(:,:,:)=1.-.5*(ZCRIAUT*PCF_MF(:,:,:) / (ZW2(:,:,:)*PTSTEP))**2
+        ZHR(:,:,:)=ZW2(:,:,:)*PTSTEP-(ZCRIAUT*PCF_MF(:,:,:))**3/(3*(ZW2(:,:,:)*PTSTEP)**2)
+      ELSEWHERE(2.*ZW2(:,:,:)*PTSTEP<=PCF_MF * ZCRIAUT)
+        ZHCF(:,:,:)=0.
+        ZHR(:,:,:)=0.
+      ELSEWHERE
+        ZHCF(:,:,:)=(2.*ZW2(:,:,:)*PTSTEP-ZCRIAUT*PCF_MF(:,:,:))**2 / (2.*(ZW2(:,:,:)*PTSTEP)**2)
+        ZHR(:,:,:)=(4.*(ZW2(:,:,:)*PTSTEP)**3-3.*ZW2(:,:,:)*PTSTEP*(ZCRIAUT*PCF_MF(:,:,:))**2+&
+                    (ZCRIAUT*PCF_MF(:,:,:))**3)/(3*(ZW2(:,:,:)*PTSTEP)**2)
+      ENDWHERE
+      ZHCF(:,:,:)=ZHCF(:,:,:)*PCF_MF(:,:,:) !to retrieve the part of the grid cell
+      PHLI_HCF(:,:,:)=MIN(1.,PHLI_HCF(:,:,:)+ZHCF(:,:,:)) !total part of the grid cell that is precipitating
+      PHLI_HRI(:,:,:)=PHLI_HRI(:,:,:)+ZHR(:,:,:)
+    ENDIF
+  ENDIF
   PCLDFR(:,:,:)=MIN(1.,PCLDFR(:,:,:)+PCF_MF(:,:,:))
   PRCS(:,:,:)=PRCS(:,:,:)+ZW1(:,:,:)
   PRIS(:,:,:)=PRIS(:,:,:)+ZW2(:,:,:)
@@ -425,13 +501,13 @@ ELSE
     ZRV(:,:,:)=ZRV(:,:,:)-(ZW1(:,:,:)+ZW2(:,:,:))
     ZT(:,:,:) = ZT(:,:,:) + &
                 (ZW1 * ZLV(:,:,:) + ZW2 * ZLS(:,:,:)) / ZCPH(:,:,:)
-    IF(PRESENT(POUT_RV)) POUT_RV=ZRV
-    IF(PRESENT(POUT_RC)) POUT_RC=ZRC
-    IF(PRESENT(POUT_RI)) POUT_RI=ZRI
-    IF(PRESENT(POUT_TH)) POUT_TH=ZT / PEXN(:,:,:)
   ENDIF
 ENDIF
 !
+IF(PRESENT(POUT_RV)) POUT_RV=ZRV
+IF(PRESENT(POUT_RC)) POUT_RC=ZRC
+IF(PRESENT(POUT_RI)) POUT_RI=ZRI
+IF(PRESENT(POUT_TH)) POUT_TH=ZT / PEXN(:,:,:)
 !
 !
 !*       6.  STORE THE BUDGET TERMS
diff --git a/src/MNH/ice_adjust_elec.f90 b/src/MNH/ice_adjust_elec.f90
index 6d766496d..9c4d20e41 100644
--- a/src/MNH/ice_adjust_elec.f90
+++ b/src/MNH/ice_adjust_elec.f90
@@ -370,9 +370,10 @@ DO JITER = 1, ITERMAX
 !
   !   ZW3=water vapor    ZW1=rc (INOUT)  ZW2=ri (INOUT)   PSRC= s'rci'/Sigma_s^2
     ZW3 = PRVS * PTSTEP;     ZW1 = PRCS * PTSTEP;  ZW2 = PRIS * PTSTEP
+    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',    &
-       PPABST, PZZ, ZT, ZW3, ZW1, ZW2, PRSS*PTSTEP, PRGS*PTSTEP, &
+    CALL CONDENSATION( IIU, IJU, IKU, IIB, IIE, IJB, IJE, IKB, IKE,1, 'T', 'CB02', 'CB',   &
+       PPABST, PZZ, ZW4, ZT, ZW3, ZW1, ZW2, PRSS*PTSTEP, PRGS*PTSTEP, &
        PSIGS, PMFCONV, PCLDFR, PSRCS, .TRUE., &
        OSIGMAS, PSIGQSAT, PLV=ZLV, PLS=ZLS, PCPH=ZCPH )
 !
diff --git a/src/MNH/ini_cst.f90 b/src/MNH/ini_cst.f90
index 91526bed4..8ce239471 100644
--- a/src/MNH/ini_cst.f90
+++ b/src/MNH/ini_cst.f90
@@ -132,6 +132,7 @@ 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.
diff --git a/src/MNH/ini_modeln.f90 b/src/MNH/ini_modeln.f90
index 49a15b336..d0020427d 100644
--- a/src/MNH/ini_modeln.f90
+++ b/src/MNH/ini_modeln.f90
@@ -289,6 +289,7 @@ END MODULE MODI_INI_MODEL_n
 !  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
 !---------------------------------------------------------------------------------
 !
 !*       0.    DECLARATIONS
@@ -846,6 +847,21 @@ 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.
diff --git a/src/MNH/modd_cst.f90 b/src/MNH/modd_cst.f90
index 0becaf15d..f6bc6c52f 100644
--- a/src/MNH/modd_cst.f90
+++ b/src/MNH/modd_cst.f90
@@ -68,6 +68,7 @@ REAL,SAVE :: XSTEFAN,XI0        ! Stefan-Boltzman constant, solar constant
 !
 REAL,SAVE :: XMD,XMV            ! Molar mass of dry air and molar mass of vapor
 REAL,SAVE :: XRD,XRV            ! Gaz constant for dry air, gaz constant for vapor
+REAL,SAVE :: XEPSILO            ! XMV/XMD
 REAL,SAVE :: XCPD,XCPV          ! Cpd (dry air), Cpv (vapor)
 REAL,SAVE :: XRHOLW             ! Volumic mass of liquid water
 REAL,SAVE :: XCL,XCI            ! Cl (liquid), Ci (ice)
diff --git a/src/MNH/modd_fieldn.f90 b/src/MNH/modd_fieldn.f90
index 92e3b89c6..32ba30187 100644
--- a/src/MNH/modd_fieldn.f90
+++ b/src/MNH/modd_fieldn.f90
@@ -53,6 +53,7 @@
 !!      Bielli S. 02/2019  Sea salt : significant sea wave height influences salt emission; 5 salt modes
 !  P. Wautelet 06/03/2019: correct XZWS entry
 !  P. Wautelet 14/03/2019: add XZWS_DEFAULT parameter
+!                      04/2020 S. Riette HighLow cloud
 !!
 !-------------------------------------------------------------------------------
 !
@@ -139,6 +140,10 @@ REAL, POINTER :: XDRYMASST=>NULL()
 REAL, POINTER :: XDRYMASSS=>NULL()
 REAL, DIMENSION(:,:,:), POINTER :: XSRC=>NULL()
 REAL, DIMENSION(:,:,:), POINTER :: XSRCT=>NULL()
+REAL, DIMENSION(:,:,:), POINTER :: XHLC_HRC=>NULL()
+REAL, DIMENSION(:,:,:), POINTER :: XHLC_HCF=>NULL()
+REAL, DIMENSION(:,:,:), POINTER :: XHLI_HRI=>NULL()
+REAL, DIMENSION(:,:,:), POINTER :: XHLI_HCF=>NULL()
 REAL, DIMENSION(:,:,:), POINTER :: XSIGS=>NULL()
 REAL, DIMENSION(:,:,:), POINTER :: XCLDFR=>NULL()
 REAL, DIMENSION(:,:,:), POINTER :: XRAINFR=>NULL()
diff --git a/src/MNH/modd_getn.f90 b/src/MNH/modd_getn.f90
index bae3402d5..282172d1d 100644
--- a/src/MNH/modd_getn.f90
+++ b/src/MNH/modd_getn.f90
@@ -53,6 +53,7 @@
 !!                  05/2006   Remove EPS and LGETALL
 !!      M. Leriche  04/2010   add get indicators for pH in cloud and rain
 !!      Bielli S. 02/2019  Sea salt : significant sea wave height influences salt emission; 5 salt modes
+!       S. Riette 04/2020 HighLow cloud
 !-------------------------------------------------------------------------------
 !
 !*       0.   DECLARATIONS
@@ -92,6 +93,7 @@ TYPE GET_t
                                 ! CLouD FRaction
   CHARACTER (LEN=4)  :: CGETSRCT              !  Get indicator for SRCM
                                 ! and SRCT related to the subgrid condensation
+  CHARACTER (LEN=4)  :: CGETHL                !  Get indicator for HighLow cloud
   CHARACTER (LEN=4)  :: CGETCIT               !  Get indicator for the
                                                  ! primary ice concentration
   CHARACTER (LEN=4)  :: CGETCONV              ! Get indicator for the
@@ -127,6 +129,7 @@ CHARACTER (LEN=4), POINTER :: CGETLSTHM=>NULL(), CGETLSRVM=>NULL()
 CHARACTER (LEN=4), POINTER :: CGETSIGS=>NULL(),CGETSRC=>NULL()
 CHARACTER (LEN=4), POINTER :: CGETCLDFR=>NULL()
 CHARACTER (LEN=4), POINTER :: CGETSRCT=>NULL()
+CHARACTER (LEN=4), POINTER :: CGETHL=>NULL()
 CHARACTER (LEN=4), POINTER :: CGETCIT=>NULL()
 CHARACTER (LEN=4), POINTER :: CGETCONV=>NULL()
 CHARACTER (LEN=4), POINTER :: CGETRAD=>NULL()
@@ -181,6 +184,7 @@ CGETSIGS=>GET_MODEL(KTO)%CGETSIGS
 CGETSRC=>GET_MODEL(KTO)%CGETSRC
 CGETCLDFR=>GET_MODEL(KTO)%CGETCLDFR
 CGETSRCT=>GET_MODEL(KTO)%CGETSRCT
+CGETHL=>GET_MODEL(KTO)%CGETHL
 CGETCIT=>GET_MODEL(KTO)%CGETCIT
 CGETZWS=>GET_MODEL(KTO)%CGETZWS
 CGETCONV=>GET_MODEL(KTO)%CGETCONV
diff --git a/src/MNH/modd_turbn.f90 b/src/MNH/modd_turbn.f90
index 8dc0cb5e1..7bb60fe40 100644
--- a/src/MNH/modd_turbn.f90
+++ b/src/MNH/modd_turbn.f90
@@ -77,7 +77,12 @@ TYPE TURB_t
   CHARACTER(LEN=4)   :: CTOM      ! type of Third Order Moments
                                   ! 'NONE' none
                                   ! 'TM06' Tomas Masson 2006
-  CHARACTER(LEN=4)   :: CSUBG_AUCV ! type of subgrid autoconv. method
+  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, 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
@@ -105,6 +110,10 @@ LOGICAL, POINTER :: LSIG_CONV=>NULL()
 LOGICAL, POINTER :: LRMC01=>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()
@@ -145,6 +154,10 @@ 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
diff --git a/src/MNH/modeln.f90 b/src/MNH/modeln.f90
index 585b131a3..934a06acc 100644
--- a/src/MNH/modeln.f90
+++ b/src/MNH/modeln.f90
@@ -1805,6 +1805,7 @@ IF (CCLOUD /= 'NONE' .AND. CELEC == 'NONE') THEN
                           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)
   ELSE
@@ -1822,7 +1823,8 @@ IF (CCLOUD /= 'NONE' .AND. CELEC == 'NONE') THEN
                           XINPRC,ZINPRC3D,XINPRR, XINPRR3D, XEVAP3D,           &
                           XINPRS,ZINPRS3D, XINPRG,ZINPRG3D, XINPRH,ZINPRH3D,   &
                           XSOLORG, XMI,ZSPEEDC, ZSPEEDR, ZSPEEDS, ZSPEEDG, ZSPEEDH, &
-                          XINDEP, XSUPSAT, XNACT, XNPRO,XSSPRO, XRAINFR        )
+                          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
diff --git a/src/MNH/modn_turbn.f90 b/src/MNH/modn_turbn.f90
index a91112bee..cce15ba12 100644
--- a/src/MNH/modn_turbn.f90
+++ b/src/MNH/modn_turbn.f90
@@ -66,7 +66,11 @@ USE MODD_TURB_n, ONLY: &
          LRMC01_n => LRMC01, &
          CTOM_n => CTOM, &
          CSUBG_AUCV_n => CSUBG_AUCV, &
-         VSIGQSAT_n => VSIGQSAT
+         VSIGQSAT_n => VSIGQSAT, &
+         CSUBG_AUCV_RI_n => CSUBG_AUCV_RI, &
+         CCONDENS_n => CCONDENS, &
+         CLAMBDA3_n => CLAMBDA3, &
+         CSUBG_MF_PDF_n => CSUBG_MF_PDF
 !
 IMPLICIT NONE
 !
@@ -83,11 +87,16 @@ LOGICAL,SAVE  :: LSIG_CONV
 LOGICAL,SAVE  :: LRMC01
 CHARACTER (LEN=4),SAVE  :: CTOM
 CHARACTER (LEN=4),SAVE  :: CSUBG_AUCV
+CHARACTER (LEN=80),SAVE  :: CSUBG_AUCV_RI
+CHARACTER (LEN=80),SAVE  :: CCONDENS
+CHARACTER (LEN=4),SAVE  :: CLAMBDA3
+CHARACTER (LEN=80),SAVE  :: CSUBG_MF_PDF
 REAL,SAVE :: VSIGQSAT
 !
 NAMELIST/NAM_TURBn/XIMPL,CTURBLEN,CTURBDIM,LTURB_FLX,LTURB_DIAG,  &
                    LSUBG_COND,LSIGMAS,LSIG_CONV,LRMC01,CTOM,CSUBG_AUCV,&
-                   XKEMIN,VSIGQSAT,XCEDIS
+                   XKEMIN,VSIGQSAT,XCEDIS,CSUBG_AUCV_RI,CCONDENS,&
+                   CLAMBDA3,CSUBG_MF_PDF
 
 !
 CONTAINS
@@ -107,6 +116,10 @@ SUBROUTINE INIT_NAM_TURBn
   CTOM = CTOM_n
   CSUBG_AUCV = CSUBG_AUCV_n
   VSIGQSAT = VSIGQSAT_n  
+  CSUBG_AUCV_RI = CSUBG_AUCV_RI_n
+  CCONDENS = CCONDENS_n
+  CLAMBDA3 = CLAMBDA3_n
+  CSUBG_MF_PDF = CSUBG_MF_PDF_n
 END SUBROUTINE INIT_NAM_TURBn
 
 SUBROUTINE UPDATE_NAM_TURBn
@@ -124,6 +137,10 @@ SUBROUTINE UPDATE_NAM_TURBn
   CTOM_n = CTOM
   CSUBG_AUCV_n = CSUBG_AUCV
   VSIGQSAT_n = VSIGQSAT
+  CSUBG_AUCV_RI_n = CSUBG_AUCV_RI
+  CCONDENS_n = CCONDENS
+  CLAMBDA3_n = CLAMBDA3
+  CSUBG_MF_PDF_n = CSUBG_MF_PDF
 END SUBROUTINE UPDATE_NAM_TURBn
 
 END MODULE MODN_TURB_n
diff --git a/src/MNH/radtr_satel.f90 b/src/MNH/radtr_satel.f90
index 851030cd8..b22d80313 100644
--- a/src/MNH/radtr_satel.f90
+++ b/src/MNH/radtr_satel.f90
@@ -257,6 +257,7 @@ REAL, DIMENSION(:,:,:), ALLOCATABLE  :: ZNCLD  ! grid scale cloud fraction
 REAL, DIMENSION(:,:,:), ALLOCATABLE  :: ZRC    ! grid scale r_c mixing ratio (kg/kg)
 REAL, DIMENSION(:,:,:), ALLOCATABLE  :: ZRI    ! grid scale r_i (kg/kg)
 REAL, DIMENSION(:,:,:), ALLOCATABLE  :: ZRV    ! grid scale r_v (kg/kg)
+REAL, DIMENSION(:,:,:), ALLOCATABLE  :: ZRHO
 !----------------------------------------------------------------------------
 !
 !*       1.    INITIALIZATION OF CONSTANTS FOR TRANSFERT CODE
@@ -476,8 +477,10 @@ IF( SIZE(PRT(:,:,:,:),4) >= 2 ) THEN
     ALLOCATE(ZSIGRC(IIU,IJU,IKU))
     ALLOCATE(ZRV(IIU,IJU,IKU))
     ZRV=PRT(:,:,:,1)
-    CALL CONDENSATION( IIU, IJU, IKU, IIB, IIE, IJB, IJE, IKB, IKE, 1, 'T',&
-         PPABST, PZZ, ZTEMP, ZRV, ZRC, ZRI, PRT(:,:,:,5), PRT(:,:,:,6), PSIGS,&
+    ALLOCATE(ZRHO(IIU,IJU,IKU))
+    ZRHO=1. !unused
+    CALL CONDENSATION( IIU, IJU, IKU, IIB, IIE, IJB, IJE, IKB, IKE, 1, 'T', 'CB02', 'CB',&
+         PPABST, PZZ, ZRHO, ZTEMP, ZRV, ZRC, ZRI, PRT(:,:,:,5), PRT(:,:,:,6), PSIGS,&
          PMFCONV, ZNCLD, ZSIGRC, OUSERI, OSIGMAS,PSIGQSAT )
     DEALLOCATE(ZTEMP,ZSIGRC)
   ELSE
diff --git a/src/MNH/rain_ice.f90 b/src/MNH/rain_ice.f90
index ec1f39204..a9bfe9104 100644
--- a/src/MNH/rain_ice.f90
+++ b/src/MNH/rain_ice.f90
@@ -751,7 +751,8 @@ IF( IMICRO >= 0 ) THEN
   DO JL=1,IMICRO
     PRAINFR(I1(JL),I2(JL),I3(JL)) = ZRF(JL)
   END DO
-  CALL ICE4_RAINFR_VERT(IIB, IIE, IIT, IJB, IJE, IJT, IKB, IKE, IKT, KKL, PRAINFR, PRRT(:,:,:))
+  CALL ICE4_RAINFR_VERT(IIB, IIE, IIT, IJB, IJE, IJT, IKB, IKE, IKT, KKL, PRAINFR, PRRT(:,:,:), &
+           PRSS(:,:,:)*0., PRGS(:,:,:)*0.)
   DO JL=1,IMICRO
     ZRF(JL)=PRAINFR(I1(JL),I2(JL),I3(JL))
   END DO
@@ -935,7 +936,8 @@ ELSE
   call Print_msg( NVERB_FATAL, 'GEN', 'RAIN_ICE', 'no sedimentation scheme for HSEDIM='//HSEDIM )
 END IF
 !sedimentation of rain fraction
-CALL ICE4_RAINFR_VERT(IIB, IIE, IIT, IJB, IJE, IJT, IKB, IKE, IKT, KKL, PRAINFR, PRRS(:,:,:)*PTSTEP)
+CALL ICE4_RAINFR_VERT(IIB, IIE, IIT, IJB, IJE, IJT, IKB, IKE, IKT, KKL, PRAINFR, PRRS(:,:,:)*PTSTEP,  &
+                      PRSS(:,:,:)*PTSTEP, PRGS(:,:,:)*PTSTEP)
 !
 !-------------------------------------------------------------------------------
 !
diff --git a/src/MNH/rain_ice_red.f90 b/src/MNH/rain_ice_red.f90
index 1a7088f18..5f347b729 100644
--- a/src/MNH/rain_ice_red.f90
+++ b/src/MNH/rain_ice_red.f90
@@ -8,20 +8,27 @@
 !      ########################
 !
 INTERFACE
-      SUBROUTINE RAIN_ICE_RED ( OSEDIC,HSEDIM, HSUBG_AUCV_RC, OWARM, KKA, KKU, KKL,   &
+      SUBROUTINE RAIN_ICE_RED ( KIT, KJT, KKT, KSIZE,                                 &
+                            OSEDIC, HSEDIM, HSUBG_AUCV_RC, HSUBG_AUCV_RI, &
+                            OWARM, KKA, KKU, KKL,   &
                             PTSTEP, KRR, ODMICRO, PEXN,             &
                             PDZZ, PRHODJ, PRHODREF, PEXNREF, PPABST, PCIT, PCLDFR,&
+                            PHLC_HRC, PHLC_HCF, PHLI_HRI, PHLI_HCF,&
                             PTHT, PRVT, PRCT, PRRT, PRIT, PRST,                   &
                             PRGT, PTHS, PRVS, PRCS, PRRS, PRIS, PRSS, PRGS,       &
                             PINPRC,PINPRR, PINPRR3D, PEVAP3D,           &
-                            PINPRS, PINPRG, PSIGS, PINDEP, PRAINFR, PSEA, PTOWN,  &
+                            PINPRS, PINPRG, PINDEP, PRAINFR, PSIGS, PSEA, PTOWN,  &
                             PRHT, PRHS, PINPRH, PFPR                              )
 !
 !
+INTEGER,                  INTENT(IN)    :: KIT, KJT, KKT ! arrays size
+INTEGER,                  INTENT(IN)    :: KSIZE
 LOGICAL,                  INTENT(IN)    :: OSEDIC ! Switch for droplet sedim.
 CHARACTER(LEN=4),         INTENT(IN)    :: HSEDIM ! Sedimentation scheme
 CHARACTER(LEN=4),         INTENT(IN)    :: HSUBG_AUCV_RC ! Switch for rc->rr Subgrid autoconversion
                                         ! Kind of Subgrid autoconversion method
+CHARACTER(LEN=80),        INTENT(IN)    :: HSUBG_AUCV_RI ! Switch for ri->rs Subgrid autoconversion
+                                        ! Kind of Subgrid autoconversion method
 LOGICAL,                  INTENT(IN)    :: OWARM   ! .TRUE. allows raindrops to
                                                    !   form by warm processes
                                                    !      (Kessler scheme)
@@ -32,63 +39,69 @@ INTEGER,                  INTENT(IN)    :: KKL   !vert. levels type 1=MNH -1=ARO
 REAL,                     INTENT(IN)    :: PTSTEP  ! Double Time step
                                                    ! (single if cold start)
 INTEGER,                  INTENT(IN)    :: KRR     ! Number of moist variable
-LOGICAL, DIMENSION(:,:,:), INTENT(IN)   :: ODMICRO ! mask to limit computation
-!
-REAL, DIMENSION(:,:,:),   INTENT(IN)    :: PEXN    ! Exner function
-REAL, DIMENSION(:,:,:),   INTENT(IN)    :: PDZZ    ! Layer thikness (m)
-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)    :: PPABST  ! absolute pressure at t
-!
-REAL, DIMENSION(:,:,:),   INTENT(INOUT) :: PCIT    ! Pristine ice n.c. at t
-REAL, DIMENSION(:,:,:),   INTENT(IN)    :: PCLDFR  ! Cloud fraction
-!
-REAL, DIMENSION(:,:,:),   INTENT(IN)    :: PTHT    ! Theta at time t
-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(IN)    :: PRRT    ! Rain water m.r. at t 
-REAL, DIMENSION(:,:,:),   INTENT(IN)    :: PRIT    ! Pristine ice m.r. at t
-REAL, DIMENSION(:,:,:),   INTENT(IN)    :: PRST    ! Snow/aggregate m.r. at t
-REAL, DIMENSION(:,:,:),   INTENT(IN)    :: PRGT    ! Graupel/hail m.r. at t
-!
-REAL, DIMENSION(:,:,:),   INTENT(IN)    :: PSIGS   ! Sigma_s at t
-!
-REAL, DIMENSION(:,:,:),   INTENT(INOUT) :: PTHS    ! Theta source
-REAL, DIMENSION(:,:,:),   INTENT(INOUT) :: PRVS    ! Water vapor m.r. source
-REAL, DIMENSION(:,:,:),   INTENT(INOUT) :: PRCS    ! Cloud water m.r. source
-REAL, DIMENSION(:,:,:),   INTENT(INOUT) :: PRRS    ! Rain water m.r. source
-REAL, DIMENSION(:,:,:),   INTENT(INOUT) :: PRIS    ! Pristine ice m.r. source
-REAL, DIMENSION(:,:,:),   INTENT(INOUT) :: PRSS    ! Snow/aggregate m.r. source
-REAL, DIMENSION(:,:,:),   INTENT(INOUT) :: PRGS    ! Graupel m.r. source
-
-!
-REAL, DIMENSION(:,:), INTENT(OUT)       :: PINPRC! Cloud instant precip
-REAL, DIMENSION(:,:), INTENT(INOUT)     :: PINDEP  ! Cloud instant deposition
-REAL, DIMENSION(:,:), INTENT(OUT)       :: PINPRR! Rain instant precip
-REAL, DIMENSION(:,:,:),INTENT(OUT)      :: PINPRR3D! Rain inst precip 3D
-REAL, DIMENSION(:,:,:), INTENT(OUT)     :: PEVAP3D! Rain evap profile
-REAL, DIMENSION(:,:), INTENT(OUT)       :: PINPRS! Snow instant precip
-REAL, DIMENSION(:,:), INTENT(OUT)       :: PINPRG! Graupel instant precip
-REAL, DIMENSION(:,:,:), INTENT(OUT)     :: PRAINFR! Rain fraction            
-REAL, DIMENSION(:,:), OPTIONAL, INTENT(IN) :: PSEA ! Sea Mask
-REAL, DIMENSION(:,:), OPTIONAL, INTENT(IN) :: PTOWN! Fraction that is town 
-REAL, DIMENSION(:,:,:), OPTIONAL,  INTENT(IN)    :: PRHT    ! Hail m.r. at t
-REAL, DIMENSION(:,:,:), OPTIONAL,  INTENT(INOUT) :: PRHS    ! Hail m.r. source
-REAL, DIMENSION(:,:), OPTIONAL, INTENT(OUT)      :: PINPRH! Hail instant precip
-REAL, DIMENSION(:,:,:,:), OPTIONAL, INTENT(OUT)  :: PFPR ! upper-air precipitation fluxes
+LOGICAL, DIMENSION(KIT,KJT,KKT), INTENT(IN)   :: ODMICRO ! mask to limit computation
+!
+REAL, DIMENSION(KIT,KJT,KKT),   INTENT(IN)    :: PEXN    ! Exner function
+REAL, DIMENSION(KIT,KJT,KKT),   INTENT(IN)    :: PDZZ    ! Layer thikness (m)
+REAL, DIMENSION(KIT,KJT,KKT),   INTENT(IN)    :: PRHODJ  ! Dry density * Jacobian
+REAL, DIMENSION(KIT,KJT,KKT),   INTENT(IN)    :: PRHODREF! Reference density
+REAL, DIMENSION(KIT,KJT,KKT),   INTENT(IN)    :: PEXNREF ! Reference Exner function
+REAL, DIMENSION(KIT,KJT,KKT),   INTENT(IN)    :: PPABST  ! absolute pressure at t
+!
+REAL, DIMENSION(KIT,KJT,KKT),   INTENT(INOUT) :: PCIT    ! Pristine ice n.c. at t
+REAL, DIMENSION(KIT,KJT,KKT),   INTENT(IN)    :: PCLDFR  ! Cloud fraction
+REAL, DIMENSION(KIT,KJT,KKT),   INTENT(IN)    :: PHLC_HRC
+REAL, DIMENSION(KIT,KJT,KKT),   INTENT(IN)    :: PHLC_HCF
+REAL, DIMENSION(KIT,KJT,KKT),   INTENT(IN)    :: PHLI_HRI
+REAL, DIMENSION(KIT,KJT,KKT),   INTENT(IN)    :: PHLI_HCF
+!
+REAL, DIMENSION(KIT,KJT,KKT),   INTENT(IN)    :: PTHT    ! Theta at time t
+REAL, DIMENSION(KIT,KJT,KKT),   INTENT(IN)    :: PRVT    ! Water vapor m.r. at t
+REAL, DIMENSION(KIT,KJT,KKT),   INTENT(IN)    :: PRCT    ! Cloud water m.r. at t
+REAL, DIMENSION(KIT,KJT,KKT),   INTENT(IN)    :: PRRT    ! Rain water m.r. at t
+REAL, DIMENSION(KIT,KJT,KKT),   INTENT(IN)    :: PRIT    ! Pristine ice m.r. at t
+REAL, DIMENSION(KIT,KJT,KKT),   INTENT(IN)    :: PRST    ! Snow/aggregate m.r. at t
+REAL, DIMENSION(KIT,KJT,KKT),   INTENT(IN)    :: PRGT    ! Graupel/hail m.r. at t
+!
+REAL, DIMENSION(KIT,KJT,KKT),   INTENT(INOUT) :: PTHS    ! Theta source
+REAL, DIMENSION(KIT,KJT,KKT),   INTENT(INOUT) :: PRVS    ! Water vapor m.r. source
+REAL, DIMENSION(KIT,KJT,KKT),   INTENT(INOUT) :: PRCS    ! Cloud water m.r. source
+REAL, DIMENSION(KIT,KJT,KKT),   INTENT(INOUT) :: PRRS    ! Rain water m.r. source
+REAL, DIMENSION(KIT,KJT,KKT),   INTENT(INOUT) :: PRIS    ! Pristine ice m.r. source
+REAL, DIMENSION(KIT,KJT,KKT),   INTENT(INOUT) :: PRSS    ! Snow/aggregate m.r. source
+REAL, DIMENSION(KIT,KJT,KKT),   INTENT(INOUT) :: PRGS    ! Graupel m.r. source
+
+!
+REAL, DIMENSION(KIT,KJT), INTENT(OUT)       :: PINPRC! Cloud instant precip
+REAL, DIMENSION(KIT,KJT), INTENT(OUT)       :: PINPRR! Rain instant precip
+REAL, DIMENSION(KIT,KJT,KKT), INTENT(OUT)   :: PINPRR3D! Rain inst precip 3D
+REAL, DIMENSION(KIT,KJT,KKT), INTENT(OUT)     :: PEVAP3D! Rain evap profile
+REAL, DIMENSION(KIT,KJT), INTENT(OUT)       :: PINPRS! Snow instant precip
+REAL, DIMENSION(KIT,KJT), INTENT(OUT)       :: PINPRG! Graupel instant precip
+REAL, DIMENSION(KIT,KJT), INTENT(OUT)       :: PINDEP  ! Cloud instant deposition
+REAL, DIMENSION(KIT,KJT,KKT),   INTENT(OUT) :: PRAINFR
+REAL, DIMENSION(KIT,KJT,KKT),   INTENT(IN)    :: PSIGS   ! Sigma_s at t
+REAL, DIMENSION(KIT,KJT), OPTIONAL, INTENT(IN)        :: PSEA ! Sea Mask
+REAL, DIMENSION(KIT,KJT), OPTIONAL, INTENT(IN)        :: PTOWN! Fraction that is town
+REAL, DIMENSION(KIT,KJT,KKT), OPTIONAL,  INTENT(IN)    :: PRHT    ! Hail m.r. at t
+REAL, DIMENSION(KIT,KJT,KKT), OPTIONAL,  INTENT(INOUT) :: PRHS    ! Hail m.r. source
+REAL, DIMENSION(KIT,KJT), OPTIONAL, INTENT(OUT)      :: PINPRH! Hail instant precip
+REAL, DIMENSION(KIT,KJT,KKT,KRR), OPTIONAL, INTENT(OUT)  :: PFPR ! upper-air precipitation fluxes
 !
 END SUBROUTINE RAIN_ICE_RED
 END INTERFACE
 END MODULE MODI_RAIN_ICE_RED
 !     ######spl
-      SUBROUTINE RAIN_ICE_RED ( OSEDIC,HSEDIM, HSUBG_AUCV_RC, OWARM, KKA, KKU, KKL,   &
-                            PTSTEP, KRR, ODMICRO, PEXN,             &
+      SUBROUTINE RAIN_ICE_RED ( KIT, KJT, KKT, KSIZE,                                 &
+                            OSEDIC, HSEDIM, HSUBG_AUCV_RC, HSUBG_AUCV_RI,  &
+                            OWARM,KKA,KKU,KKL,&
+                            PTSTEP, KRR, ODMICRO, PEXN,                           &
                             PDZZ, PRHODJ, PRHODREF, PEXNREF, PPABST, PCIT, PCLDFR,&
+                            PHLC_HRC, PHLC_HCF, PHLI_HRI,  PHLI_HCF,     &
                             PTHT, PRVT, PRCT, PRRT, PRIT, PRST,                   &
                             PRGT, PTHS, PRVS, PRCS, PRRS, PRIS, PRSS, PRGS,       &
                             PINPRC,PINPRR, PINPRR3D, PEVAP3D,           &
-                            PINPRS, PINPRG, PSIGS, PINDEP, PRAINFR, PSEA, PTOWN,  &
+                            PINPRS, PINPRG, PINDEP, PRAINFR, PSIGS, PSEA, PTOWN,  &
                             PRHT, PRHS, PINPRH, PFPR                              )
 !     ######################################################################
 !
@@ -249,6 +262,9 @@ END MODULE MODI_RAIN_ICE_RED
 !*       0.    DECLARATIONS
 !              ------------
 !
+USE PARKIND1, ONLY : JPRB
+USE YOMHOOK , ONLY : LHOOK, DR_HOOK
+
 use modd_budget,         only: lbu_enable,                                                                                     &
                                lbudget_th, lbudget_rv, lbudget_rc, lbudget_rr, lbudget_ri, lbudget_rs, lbudget_rg, lbudget_rh, &
                                NBUDGET_TH, NBUDGET_RV, NBUDGET_RC, NBUDGET_RR, NBUDGET_RI, NBUDGET_RS, NBUDGET_RG, NBUDGET_RH, &
@@ -277,9 +293,12 @@ IMPLICIT NONE
 !
 !
 !
+INTEGER,                  INTENT(IN)    :: KIT, KJT, KKT ! arrays size
+INTEGER,                  INTENT(IN)    :: KSIZE
 LOGICAL,                  INTENT(IN)    :: OSEDIC ! Switch for droplet sedim.
 CHARACTER(LEN=4),         INTENT(IN)    :: HSEDIM ! Sedimentation scheme
 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
 LOGICAL,                  INTENT(IN)    :: OWARM   ! .TRUE. allows raindrops to
                                                    !   form by warm processes
                                                    !      (Kessler scheme)
@@ -288,200 +307,216 @@ INTEGER,                  INTENT(IN)    :: KKU   !uppest atmosphere array index
 INTEGER,                  INTENT(IN)    :: KKL   !vert. levels type 1=MNH -1=ARO
 REAL,                     INTENT(IN)    :: PTSTEP  ! Double Time step (single if cold start)
 INTEGER,                  INTENT(IN)    :: KRR     ! Number of moist variable
-LOGICAL, DIMENSION(:,:,:), INTENT(IN)   :: ODMICRO ! mask to limit computation
-!
-REAL, DIMENSION(:,:,:),   INTENT(IN)    :: PEXN    ! Exner function
-REAL, DIMENSION(:,:,:),   INTENT(IN)    :: PDZZ    ! Layer thikness (m)
-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)    :: PPABST  ! absolute pressure at t
-!
-REAL, DIMENSION(:,:,:),   INTENT(INOUT) :: PCIT    ! Pristine ice n.c. at t
-REAL, DIMENSION(:,:,:),   INTENT(IN)    :: PCLDFR  ! Convective Mass Flux Cloud fraction
-REAL, DIMENSION(:,:,:),   INTENT(IN)    :: PTHT    ! Theta at time t
-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(IN)    :: PRRT    ! Rain water m.r. at t
-REAL, DIMENSION(:,:,:),   INTENT(IN)    :: PRIT    ! Pristine ice m.r. at t
-REAL, DIMENSION(:,:,:),   INTENT(IN)    :: PRST    ! Snow/aggregate m.r. at t
-REAL, DIMENSION(:,:,:),   INTENT(IN)    :: PRGT    ! Graupel/hail m.r. at t
-REAL, DIMENSION(:,:,:),   INTENT(IN)    :: PSIGS   ! Sigma_s at t
-!
-REAL, DIMENSION(:,:,:),   INTENT(INOUT) :: PTHS    ! Theta source
-REAL, DIMENSION(:,:,:),   INTENT(INOUT) :: PRVS    ! Water vapor m.r. source
-REAL, DIMENSION(:,:,:),   INTENT(INOUT) :: PRCS    ! Cloud water m.r. source
-REAL, DIMENSION(:,:,:),   INTENT(INOUT) :: PRRS    ! Rain water m.r. source
-REAL, DIMENSION(:,:,:),   INTENT(INOUT) :: PRIS    ! Pristine ice m.r. source
-REAL, DIMENSION(:,:,:),   INTENT(INOUT) :: PRSS    ! Snow/aggregate m.r. source
-REAL, DIMENSION(:,:,:),   INTENT(INOUT) :: PRGS    ! Graupel m.r. source
-!
-REAL, DIMENSION(:,:), INTENT(OUT)       :: PINPRC! Cloud instant precip
-REAL, DIMENSION(:,:), INTENT(INOUT)     :: PINDEP  ! Cloud instant deposition
-REAL, DIMENSION(:,:), INTENT(OUT)       :: PINPRR! Rain instant precip
-REAL, DIMENSION(:,:,:),INTENT(OUT)      :: PINPRR3D! Rain inst precip 3D
-REAL, DIMENSION(:,:,:), INTENT(OUT)     :: PEVAP3D! Rain evap profile
-REAL, DIMENSION(:,:), INTENT(OUT)       :: PINPRS! Snow instant precip
-REAL, DIMENSION(:,:), INTENT(OUT)       :: PINPRG! Graupel instant precip
-REAL, DIMENSION(:,:,:), INTENT(OUT)     :: PRAINFR! Rain fraction
-REAL, DIMENSION(:,:), OPTIONAL, INTENT(IN) :: PSEA ! Sea Mask
-REAL, DIMENSION(:,:), OPTIONAL, INTENT(IN) :: PTOWN! Fraction that is town 
-REAL, DIMENSION(:,:,:), OPTIONAL,  INTENT(IN)    :: PRHT    ! Hail m.r. at t
-REAL, DIMENSION(:,:,:), OPTIONAL,  INTENT(INOUT) :: PRHS    ! Hail m.r. source
-REAL, DIMENSION(:,:), OPTIONAL, INTENT(OUT)      :: PINPRH! Hail instant precip
-REAL, DIMENSION(:,:,:,:), OPTIONAL, INTENT(OUT)  :: PFPR ! upper-air precipitation fluxes
+LOGICAL, DIMENSION(KIT,KJT,KKT), INTENT(IN)   :: ODMICRO ! mask to limit computation
+!
+REAL, DIMENSION(KIT,KJT,KKT),   INTENT(IN)    :: PEXN    ! Exner function
+REAL, DIMENSION(KIT,KJT,KKT),   INTENT(IN)    :: PDZZ    ! Layer thikness (m)
+REAL, DIMENSION(KIT,KJT,KKT),   INTENT(IN)    :: PRHODJ  ! Dry density * Jacobian
+REAL, DIMENSION(KIT,KJT,KKT),   INTENT(IN)    :: PRHODREF! Reference density
+REAL, DIMENSION(KIT,KJT,KKT),   INTENT(IN)    :: PEXNREF ! Reference Exner function
+REAL, DIMENSION(KIT,KJT,KKT),   INTENT(IN)    :: PPABST  ! absolute pressure at t
+!
+REAL, DIMENSION(KIT,KJT,KKT),   INTENT(INOUT) :: PCIT    ! Pristine ice n.c. at t
+REAL, DIMENSION(KIT,KJT,KKT),   INTENT(IN)    :: PCLDFR  ! Convective Mass Flux Cloud fraction
+REAL, DIMENSION(KIT,KJT,KKT),   INTENT(IN)    :: PHLC_HRC
+REAL, DIMENSION(KIT,KJT,KKT),   INTENT(IN)    :: PHLC_HCF
+REAL, DIMENSION(KIT,KJT,KKT),   INTENT(IN)    :: PHLI_HRI
+REAL, DIMENSION(KIT,KJT,KKT),   INTENT(IN)    :: PHLI_HCF
+REAL, DIMENSION(KIT,KJT,KKT),   INTENT(IN)    :: PTHT    ! Theta at time t
+REAL, DIMENSION(KIT,KJT,KKT),   INTENT(IN)    :: PRVT    ! Water vapor m.r. at t
+REAL, DIMENSION(KIT,KJT,KKT),   INTENT(IN)    :: PRCT    ! Cloud water m.r. at t
+REAL, DIMENSION(KIT,KJT,KKT),   INTENT(IN)    :: PRRT    ! Rain water m.r. at t
+REAL, DIMENSION(KIT,KJT,KKT),   INTENT(IN)    :: PRIT    ! Pristine ice m.r. at t
+REAL, DIMENSION(KIT,KJT,KKT),   INTENT(IN)    :: PRST    ! Snow/aggregate m.r. at t
+REAL, DIMENSION(KIT,KJT,KKT),   INTENT(IN)    :: PRGT    ! Graupel/hail m.r. at t
+!
+REAL, DIMENSION(KIT,KJT,KKT),   INTENT(INOUT) :: PTHS    ! Theta source
+REAL, DIMENSION(KIT,KJT,KKT),   INTENT(INOUT) :: PRVS    ! Water vapor m.r. source
+REAL, DIMENSION(KIT,KJT,KKT),   INTENT(INOUT) :: PRCS    ! Cloud water m.r. source
+REAL, DIMENSION(KIT,KJT,KKT),   INTENT(INOUT) :: PRRS    ! Rain water m.r. source
+REAL, DIMENSION(KIT,KJT,KKT),   INTENT(INOUT) :: PRIS    ! Pristine ice m.r. source
+REAL, DIMENSION(KIT,KJT,KKT),   INTENT(INOUT) :: PRSS    ! Snow/aggregate m.r. source
+REAL, DIMENSION(KIT,KJT,KKT),   INTENT(INOUT) :: PRGS    ! Graupel m.r. source
+!
+REAL, DIMENSION(KIT,KJT), INTENT(OUT)       :: PINPRC! Cloud instant precip
+REAL, DIMENSION(KIT,KJT), INTENT(OUT)       :: PINPRR! Rain instant precip
+REAL, DIMENSION(KIT,KJT,KKT),INTENT(OUT)      :: PINPRR3D! Rain inst precip 3D
+REAL, DIMENSION(KIT,KJT,KKT), INTENT(OUT)     :: PEVAP3D! Rain evap profile
+REAL, DIMENSION(KIT,KJT), INTENT(OUT)       :: PINPRS! Snow instant precip
+REAL, DIMENSION(KIT,KJT), INTENT(OUT)       :: PINPRG! Graupel instant precip
+REAL, DIMENSION(KIT,KJT), INTENT(OUT)       :: PINDEP  ! Cloud instant deposition
+REAL, DIMENSION(KIT,KJT,KKT),   INTENT(OUT) :: PRAINFR
+REAL, DIMENSION(KIT,KJT,KKT),   INTENT(IN)    :: PSIGS   ! Sigma_s at t
+REAL, DIMENSION(KIT,KJT), OPTIONAL, INTENT(IN)        :: PSEA ! Sea Mask
+REAL, DIMENSION(KIT,KJT), OPTIONAL, INTENT(IN)        :: PTOWN! Fraction that is town
+REAL, DIMENSION(KIT,KJT,KKT), OPTIONAL,  INTENT(IN)    :: PRHT    ! Hail m.r. at t
+REAL, DIMENSION(KIT,KJT,KKT), OPTIONAL,  INTENT(INOUT) :: PRHS    ! Hail m.r. source
+REAL, DIMENSION(KIT,KJT), OPTIONAL, INTENT(OUT)      :: PINPRH! Hail instant precip
+REAL, DIMENSION(KIT,KJT,KKT,KRR), OPTIONAL, INTENT(OUT)  :: PFPR ! upper-air precipitation fluxes
 !
 !*       0.2   Declarations of local variables :
 !
 INTEGER :: IIB           !  Define the domain where is
 INTEGER :: IIE           !  the microphysical sources have to be computed
-INTEGER :: IIT           !
 INTEGER :: IJB           !
 INTEGER :: IJE           !
-INTEGER :: IJT           !
-INTEGER :: IKB, IKTB, IKT!
+INTEGER :: IKB, IKTB     !
 INTEGER :: IKE, IKTE     !
 !
+INTEGER :: JI, JJ, JK
+!
 !For packing
 INTEGER :: IMICRO ! Case r_x>0 locations
-INTEGER, DIMENSION(COUNT(ODMICRO)) :: I1,I2,I3 ! Used to replace the COUNT
-INTEGER                             :: JL       ! and PACK intrinsics
+INTEGER, DIMENSION(KSIZE) :: I1,I2,I3 ! Used to replace the COUNT
+INTEGER                   :: JL       ! and PACK intrinsics
 !
-!Arrays for nucleation call outisde of ODMICRO points
-REAL,    DIMENSION(SIZE(PEXNREF,1),SIZE(PEXNREF,2),SIZE(PEXNREF,3)) :: ZW ! work array
-real, dimension(:,:,:), allocatable :: zw1, zw2, zw3, zw4, zw5, zw6 !Work arrays
-REAL,    DIMENSION(SIZE(PEXNREF,1),SIZE(PEXNREF,2),SIZE(PEXNREF,3)) :: ZT ! Temperature
-REAL, DIMENSION(SIZE(PTHT,1),SIZE(PTHT,2),SIZE(PTHT,3)) :: &
+!Arrays for nucleation call outisde of LDMICRO points
+REAL,    DIMENSION(KIT, KJT, KKT) :: ZW ! work array
+REAL,    DIMENSION(KIT, KJT, KKT) :: ZT ! Temperature
+REAL, DIMENSION(KIT, KJT, KKT) :: &
                                   & ZZ_RVHENI_MR, & ! heterogeneous nucleation mixing ratio change
                                   & ZZ_RVHENI       ! heterogeneous nucleation
-REAL, DIMENSION(SIZE(PTHT,1),SIZE(PTHT,2),SIZE(PTHT,3)) :: ZZ_LVFACT, ZZ_LSFACT
+real, dimension(:,:,:), allocatable :: zw1, zw2, zw3, zw4, zw5, zw6 !Work arrays
 real, dimension(:,:,:), allocatable :: zz_diff
+REAL, DIMENSION(KIT, KJT, KKT) :: ZZ_LVFACT, ZZ_LSFACT
 !
 !Diagnostics
-REAL, DIMENSION(SIZE(PTHT,1),SIZE(PTHT,2),SIZE(PTHT,3)) ::            &
-                                                         & ZHLC_HCF3D,& ! HLCLOUDS cloud fraction in high water content part
-                                                         & ZHLC_LCF3D,& ! HLCLOUDS cloud fraction in low water content part
-                                                         & ZHLC_HRC3D,& ! HLCLOUDS cloud water content in high water content
-                                                         & ZHLC_LRC3D   ! HLCLOUDS cloud water content in low water content
+REAL, DIMENSION(KIT, KJT, KKT) :: &
+                                & ZHLC_HCF3D,& ! HLCLOUDS cloud fraction in high water content part
+                                & ZHLC_LCF3D,& ! HLCLOUDS cloud fraction in low water content part
+                                & ZHLC_HRC3D,& ! HLCLOUDS cloud water content in high water content
+                                & ZHLC_LRC3D,& ! HLCLOUDS cloud water content in low water content
+                                & ZHLI_HCF3D,& ! HLCLOUDS cloud fraction in high ice content part
+                                & ZHLI_LCF3D,& ! HLCLOUDS cloud fraction in low ice content part
+                                & ZHLI_HRI3D,& ! HLCLOUDS cloud water content in high ice content
+                                & ZHLI_LRI3D   ! HLCLOUDS cloud water content in high ice content
+
 REAL, DIMENSION(SIZE(PTHT,1),SIZE(PTHT,2)) :: ZINPRI ! Pristine ice instant precip
 !
 !Packed variables
-REAL, DIMENSION(COUNT(ODMICRO)) :: ZRVT,     & ! Water vapor m.r. at t
-                                 & ZRCT,     & ! Cloud water m.r. at t
-                                 & ZRRT,     & ! Rain water m.r. at t
-                                 & ZRIT,     & ! Pristine ice m.r. at t
-                                 & ZRST,     & ! Snow/aggregate m.r. at t
-                                 & ZRGT,     & ! Graupel m.r. at t
-                                 & ZRHT,     & ! Hail m.r. at t
-                                 & ZCIT,     & ! Pristine ice conc. at t
-                                 & ZTHT,     & ! Potential temperature
-                                 & ZRHODREF, & ! RHO Dry REFerence
-                                 & ZZT,      & ! Temperature
-                                 & ZPRES,    & ! Pressure
-                                 & ZEXN,     & ! EXNer Pressure
-                                 & ZLSFACT,  & ! L_s/(Pi*C_ph)
-                                 & ZLVFACT,  & ! L_v/(Pi*C_ph)
-                                 & ZSIGMA_RC,& ! Standard deviation of rc at time t
-                                 & ZCF,      & ! Cloud fraction
-                                 & ZHLC_HCF, & ! HLCLOUDS : fraction of High Cloud Fraction in grid
-                                 & ZHLC_LCF, & ! HLCLOUDS : fraction of Low  Cloud Fraction in grid
-                                               !    note that ZCF = ZHLC_HCF + ZHLC_LCF
-                                 & ZHLC_HRC, & ! HLCLOUDS : LWC that is High LWC in grid
-                                 & ZHLC_LRC    ! HLCLOUDS : LWC that is Low  LWC in grid
-                                               !    note that ZRC = ZHLC_HRC + ZHLC_LRC
+REAL, DIMENSION(KSIZE) :: ZRVT,     & ! Water vapor m.r. at t
+                        & ZRCT,     & ! Cloud water m.r. at t
+                        & ZRRT,     & ! Rain water m.r. at t
+                        & ZRIT,     & ! Pristine ice m.r. at t
+                        & ZRST,     & ! Snow/aggregate m.r. at t
+                        & ZRGT,     & ! Graupel m.r. at t
+                        & ZRHT,     & ! Hail m.r. at t
+                        & ZCIT,     & ! Pristine ice conc. at t
+                        & ZTHT,     & ! Potential temperature
+                        & ZRHODREF, & ! RHO Dry REFerence
+                        & ZZT,      & ! Temperature
+                        & ZPRES,    & ! Pressure
+                        & ZEXN,     & ! EXNer Pressure
+                        & ZLSFACT,  & ! L_s/(Pi*C_ph)
+                        & ZLVFACT,  & ! L_v/(Pi*C_ph)
+                        & ZSIGMA_RC,& ! Standard deviation of rc at time t
+                        & ZCF,      & ! Cloud fraction
+                        & ZHLC_HCF, & ! HLCLOUDS : fraction of High Cloud Fraction in grid
+                        & ZHLC_LCF, & ! HLCLOUDS : fraction of Low  Cloud Fraction in grid
+                                      !    note that ZCF = ZHLC_HCF + ZHLC_LCF
+                        & ZHLC_HRC, & ! HLCLOUDS : LWC that is High LWC in grid
+                        & ZHLC_LRC, & ! HLCLOUDS : LWC that is Low  LWC in grid
+                                      !    note that ZRC = ZHLC_HRC + ZHLC_LRC
+                        & ZHLI_HCF, &
+                        & ZHLI_LCF, &
+                        & ZHLI_HRI, &
+                        & ZHLI_LRI, &
+                        & ZFRAC
 !
 !Output packed tendencies (for budgets only)
-REAL, DIMENSION(COUNT(ODMICRO)) :: ZRVHENI_MR, & ! heterogeneous nucleation mixing ratio change
-                                 & ZRCHONI, & ! Homogeneous nucleation
-                                 & ZRRHONG_MR, & ! Spontaneous freezing mixing ratio change
-                                 & ZRVDEPS, & ! Deposition on r_s,
-                                 & ZRIAGGS, & ! Aggregation on r_s
-                                 & ZRIAUTS, & ! Autoconversion of r_i for r_s production
-                                 & ZRVDEPG, & ! Deposition on r_g
-                                 & ZRCAUTR,  & ! Autoconversion of r_c for r_r production
-                                 & ZRCACCR, & ! Accretion of r_c for r_r production
-                                 & ZRREVAV, & ! Evaporation of r_r
-                                 & ZRIMLTC_MR, & ! Cloud ice melting mixing ratio change
-                                 & ZRCBERI, & ! Bergeron-Findeisen effect
-                                 & ZRHMLTR, & ! Melting of the hailstones
-                                 & ZRSMLTG, & ! Conversion-Melting of the aggregates
-                                 & ZRCMLTSR, & ! Cloud droplet collection onto aggregates by positive temperature
-                                 & ZRRACCSS, ZRRACCSG, ZRSACCRG, & ! Rain accretion onto the aggregates
-                                 & ZRCRIMSS, ZRCRIMSG, ZRSRIMCG, ZRSRIMCG_MR, & ! Cloud droplet riming of the aggregates
-                                 & ZRICFRRG, ZRRCFRIG, ZRICFRR, & ! Rain contact freezing
-                                 & ZRCWETG, ZRIWETG, ZRRWETG, ZRSWETG, &  ! Graupel wet growth
-                                 & ZRCDRYG, ZRIDRYG, ZRRDRYG, ZRSDRYG, &  ! Graupel dry growth
-                                 & ZRWETGH, & ! Conversion of graupel into hail
-                                 & ZRWETGH_MR, & ! Conversion of graupel into hail, mr change
-                                 & ZRGMLTR, & ! Melting of the graupel
-                                 & ZRCWETH, ZRIWETH, ZRSWETH, ZRGWETH, ZRRWETH, & ! Dry growth of hailstone
-                                 & ZRCDRYH, ZRIDRYH, ZRSDRYH, ZRRDRYH, ZRGDRYH, & ! Wet growth of hailstone
-                                 & ZRDRYHG    ! Conversion of hailstone into graupel
+REAL, DIMENSION(KSIZE) :: ZRVHENI_MR, & ! heterogeneous nucleation mixing ratio change
+                        & ZRCHONI, & ! Homogeneous nucleation
+                        & ZRRHONG_MR, & ! Spontaneous freezing mixing ratio change
+                        & ZRVDEPS, & ! Deposition on r_s,
+                        & ZRIAGGS, & ! Aggregation on r_s
+                        & ZRIAUTS, & ! Autoconversion of r_i for r_s production
+                        & ZRVDEPG, & ! Deposition on r_g
+                        & ZRCAUTR,  & ! Autoconversion of r_c for r_r production
+                        & ZRCACCR, & ! Accretion of r_c for r_r production
+                        & ZRREVAV, & ! Evaporation of r_r
+                        & ZRIMLTC_MR, & ! Cloud ice melting mixing ratio change
+                        & ZRCBERI, & ! Bergeron-Findeisen effect
+                        & ZRHMLTR, & ! Melting of the hailstones
+                        & ZRSMLTG, & ! Conversion-Melting of the aggregates
+                        & ZRCMLTSR, & ! Cloud droplet collection onto aggregates by positive temperature
+                        & ZRRACCSS, ZRRACCSG, ZRSACCRG, & ! Rain accretion onto the aggregates
+                        & ZRCRIMSS, ZRCRIMSG, ZRSRIMCG, ZRSRIMCG_MR, & ! Cloud droplet riming of the aggregates
+                        & ZRICFRRG, ZRRCFRIG, ZRICFRR, & ! Rain contact freezing
+                        & ZRCWETG, ZRIWETG, ZRRWETG, ZRSWETG, &  ! Graupel wet growth
+                        & ZRCDRYG, ZRIDRYG, ZRRDRYG, ZRSDRYG, &  ! Graupel dry growth
+                        & ZRWETGH, & ! Conversion of graupel into hail
+                        & ZRWETGH_MR, & ! Conversion of graupel into hail, mr change
+                        & ZRGMLTR, & ! Melting of the graupel
+                        & ZRCWETH, ZRIWETH, ZRSWETH, ZRGWETH, ZRRWETH, & ! Dry growth of hailstone
+                        & ZRCDRYH, ZRIDRYH, ZRSDRYH, ZRRDRYH, ZRGDRYH, & ! Wet growth of hailstone
+                        & ZRDRYHG    ! Conversion of hailstone into graupel
 !
 !Output packed total mixing ratio change (for budgets only)
-REAL, DIMENSION(COUNT(ODMICRO)) :: ZTOT_RVHENI, & ! heterogeneous nucleation mixing ratio change
-                                 & ZTOT_RCHONI, & ! Homogeneous nucleation
-                                 & ZTOT_RRHONG, & ! Spontaneous freezing mixing ratio change
-                                 & ZTOT_RVDEPS, & ! Deposition on r_s,
-                                 & ZTOT_RIAGGS, & ! Aggregation on r_s
-                                 & ZTOT_RIAUTS, & ! Autoconversion of r_i for r_s production
-                                 & ZTOT_RVDEPG, & ! Deposition on r_g
-                                 & ZTOT_RCAUTR,  & ! Autoconversion of r_c for r_r production
-                                 & ZTOT_RCACCR, & ! Accretion of r_c for r_r production
-                                 & ZTOT_RREVAV, & ! Evaporation of r_r
-                                 & ZTOT_RCRIMSS, ZTOT_RCRIMSG, ZTOT_RSRIMCG, & ! Cloud droplet riming of the aggregates
-                                 & ZTOT_RIMLTC, & ! Cloud ice melting mixing ratio change
-                                 & ZTOT_RCBERI, & ! Bergeron-Findeisen effect
-                                 & ZTOT_RHMLTR, & ! Melting of the hailstones
-                                 & ZTOT_RSMLTG, & ! Conversion-Melting of the aggregates
-                                 & ZTOT_RCMLTSR, & ! Cloud droplet collection onto aggregates by positive temperature
-                                 & ZTOT_RRACCSS, ZTOT_RRACCSG, ZTOT_RSACCRG, & ! Rain accretion onto the aggregates
-                                 & ZTOT_RICFRRG, ZTOT_RRCFRIG, ZTOT_RICFRR, & ! Rain contact freezing
-                                 & ZTOT_RCWETG, ZTOT_RIWETG, ZTOT_RRWETG, ZTOT_RSWETG, &  ! Graupel wet growth
-                                 & ZTOT_RCDRYG, ZTOT_RIDRYG, ZTOT_RRDRYG, ZTOT_RSDRYG, &  ! Graupel dry growth
-                                 & ZTOT_RWETGH, & ! Conversion of graupel into hail
-                                 & ZTOT_RGMLTR, & ! Melting of the graupel
-                                 & ZTOT_RCWETH, ZTOT_RIWETH, ZTOT_RSWETH, ZTOT_RGWETH, ZTOT_RRWETH, & ! Dry growth of hailstone
-                                 & ZTOT_RCDRYH, ZTOT_RIDRYH, ZTOT_RSDRYH, ZTOT_RRDRYH, ZTOT_RGDRYH, & ! Wet growth of hailstone
-                                 & ZTOT_RDRYHG    ! Conversion of hailstone into graupel
+REAL, DIMENSION(KSIZE) :: ZTOT_RVHENI, & ! heterogeneous nucleation mixing ratio change
+                        & ZTOT_RCHONI, & ! Homogeneous nucleation
+                        & ZTOT_RRHONG, & ! Spontaneous freezing mixing ratio change
+                        & ZTOT_RVDEPS, & ! Deposition on r_s,
+                        & ZTOT_RIAGGS, & ! Aggregation on r_s
+                        & ZTOT_RIAUTS, & ! Autoconversion of r_i for r_s production
+                        & ZTOT_RVDEPG, & ! Deposition on r_g
+                        & ZTOT_RCAUTR,  & ! Autoconversion of r_c for r_r production
+                        & ZTOT_RCACCR, & ! Accretion of r_c for r_r production
+                        & ZTOT_RREVAV, & ! Evaporation of r_r
+                        & ZTOT_RCRIMSS, ZTOT_RCRIMSG, ZTOT_RSRIMCG, & ! Cloud droplet riming of the aggregates
+                        & ZTOT_RIMLTC, & ! Cloud ice melting mixing ratio change
+                        & ZTOT_RCBERI, & ! Bergeron-Findeisen effect
+                        & ZTOT_RHMLTR, & ! Melting of the hailstones
+                        & ZTOT_RSMLTG, & ! Conversion-Melting of the aggregates
+                        & ZTOT_RCMLTSR, & ! Cloud droplet collection onto aggregates by positive temperature
+                        & ZTOT_RRACCSS, ZTOT_RRACCSG, ZTOT_RSACCRG, & ! Rain accretion onto the aggregates
+                        & ZTOT_RICFRRG, ZTOT_RRCFRIG, ZTOT_RICFRR, & ! Rain contact freezing
+                        & ZTOT_RCWETG, ZTOT_RIWETG, ZTOT_RRWETG, ZTOT_RSWETG, &  ! Graupel wet growth
+                        & ZTOT_RCDRYG, ZTOT_RIDRYG, ZTOT_RRDRYG, ZTOT_RSDRYG, &  ! Graupel dry growth
+                        & ZTOT_RWETGH, & ! Conversion of graupel into hail
+                        & ZTOT_RGMLTR, & ! Melting of the graupel
+                        & ZTOT_RCWETH, ZTOT_RIWETH, ZTOT_RSWETH, ZTOT_RGWETH, ZTOT_RRWETH, & ! Dry growth of hailstone
+                        & ZTOT_RCDRYH, ZTOT_RIDRYH, ZTOT_RSDRYH, ZTOT_RRDRYH, ZTOT_RGDRYH, & ! Wet growth of hailstone
+                        & ZTOT_RDRYHG    ! Conversion of hailstone into graupel
 !
 !For time- or mixing-ratio- splitting
-REAL, DIMENSION(COUNT(ODMICRO)) :: Z0RVT,     &   ! Water vapor m.r. at the beginig of the current loop
-                                 & Z0RCT,     &   ! Cloud water m.r. at the beginig of the current loop
-                                 & Z0RRT,     &   ! Rain water m.r. at the beginig of the current loop
-                                 & Z0RIT,     &   ! Pristine ice m.r. at the beginig of the current loop
-                                 & Z0RST,     &   ! Snow/aggregate m.r. at the beginig of the current loop
-                                 & Z0RGT,     &   ! Graupel m.r. at the beginig of the current loop
-                                 & Z0RHT,     &   ! Hail m.r. at the beginig of the current loop
-                                 & ZA_TH, ZA_RV, ZA_RC, ZA_RR, ZA_RI, ZA_RS, ZA_RG, ZA_RH, &
-                                 & ZB_TH, ZB_RV, ZB_RC, ZB_RR, ZB_RI, ZB_RS, ZB_RG, ZB_RH
+REAL, DIMENSION(KSIZE) :: Z0RVT,     &   ! Water vapor m.r. at the beginig of the current loop
+                        & Z0RCT,     &   ! Cloud water m.r. at the beginig of the current loop
+                        & Z0RRT,     &   ! Rain water m.r. at the beginig of the current loop
+                        & Z0RIT,     &   ! Pristine ice m.r. at the beginig of the current loop
+                        & Z0RST,     &   ! Snow/aggregate m.r. at the beginig of the current loop
+                        & Z0RGT,     &   ! Graupel m.r. at the beginig of the current loop
+                        & Z0RHT,     &   ! Hail m.r. at the beginig of the current loop
+                        & ZA_TH, ZA_RV, ZA_RC, ZA_RR, ZA_RI, ZA_RS, ZA_RG, ZA_RH, &
+                        & ZB_TH, ZB_RV, ZB_RC, ZB_RR, ZB_RI, ZB_RS, ZB_RG, ZB_RH
 !
 !To take into acount external tendencies inside the splitting
-REAL, DIMENSION(COUNT(ODMICRO)) :: ZEXT_RV,   &   ! External tendencie for rv
-                                   ZEXT_RC,   &   ! External tendencie for rc
-                                   ZEXT_RR,   &   ! External tendencie for rr
-                                   ZEXT_RI,   &   ! External tendencie for ri
-                                   ZEXT_RS,   &   ! External tendencie for rs
-                                   ZEXT_RG,   &   ! External tendencie for rg
-                                   ZEXT_RH,   &   ! External tendencie for rh
-                                   ZEXT_TH,   &   ! External tendencie for th
-                                   ZEXT_WW        ! Working array
+REAL, DIMENSION(KSIZE) :: ZEXT_RV,   &   ! External tendencie for rv
+                        & ZEXT_RC,   &   ! External tendencie for rc
+                        & ZEXT_RR,   &   ! External tendencie for rr
+                        & ZEXT_RI,   &   ! External tendencie for ri
+                        & ZEXT_RS,   &   ! External tendencie for rs
+                        & ZEXT_RG,   &   ! External tendencie for rg
+                        & ZEXT_RH,   &   ! External tendencie for rh
+                        & ZEXT_TH,   &   ! External tendencie for th
+                        & ZEXT_WW        ! Working array
 LOGICAL :: GEXT_TEND
 !
-INTEGER, DIMENSION(COUNT(ODMICRO)) :: IITER ! Number of iterations done (with real tendencies computation)
+INTEGER, DIMENSION(KSIZE) :: IITER ! Number of iterations done (with real tendencies computation)
 INTEGER :: INB_ITER_MAX ! Maximum number of iterations (with real tendencies computation)
-REAL, DIMENSION(COUNT(ODMICRO)) :: ZTIME,    & ! Current integration time (starts with 0 and ends with PTSTEP)
-                                 & ZMAXTIME, & ! Time on which we can apply the current tendencies
-                                 & ZTIME_THRESHOLD, & ! Time to reach threshold
-                                 & ZTIME_LASTCALL     ! Integration time when last tendecies call has been done
-LOGICAL, DIMENSION(COUNT(ODMICRO)) :: LLCOMPUTE ! Points where we must compute tendenceis
+REAL, DIMENSION(KSIZE) :: ZTIME,    & ! Current integration time (starts with 0 and ends with PTSTEP)
+                        & ZMAXTIME, & ! Time on which we can apply the current tendencies
+                        & ZTIME_THRESHOLD, & ! Time to reach threshold
+                        & ZTIME_LASTCALL     ! Integration time when last tendecies call has been done
+REAL, DIMENSION(KSIZE) :: ZW1D
+REAL, DIMENSION(KSIZE) :: ZCOMPUTE ! 1. for points where we must compute tendencies, 0. elsewhere
 LOGICAL :: LSOFT ! Must we really compute tendencies or only adjust them to new T variables
 LOGICAL, DIMENSION(SIZE(PRHODREF,1),SIZE(PRHODREF,2)):: GDEP
 REAL :: ZTSTEP ! length of sub-timestep in case of time splitting
 REAL :: ZINV_TSTEP ! Inverse ov PTSTEP
-REAL, DIMENSION(COUNT(ODMICRO), 6) :: ZRS_TEND
-REAL, DIMENSION(COUNT(ODMICRO), 6) :: ZRG_TEND
-REAL, DIMENSION(COUNT(ODMICRO), 8) :: ZRH_TEND
+REAL, DIMENSION(KSIZE, 8) :: ZRS_TEND
+REAL, DIMENSION(KSIZE, 8) :: ZRG_TEND
+REAL, DIMENSION(KSIZE, 10) :: ZRH_TEND
+REAL, DIMENSION(KSIZE) :: ZSSI
 !
 !For total tendencies computation
 REAL, DIMENSION(SIZE(PTHT,1),SIZE(PTHT,2),SIZE(PTHT,3)) :: &
@@ -498,33 +533,43 @@ end if
 !               -----------------------
 !
 CALL GET_INDICE_ll (IIB,IJB,IIE,IJE)
-IIT=SIZE(PDZZ,1)
-IJT=SIZE(PDZZ,2)
 IKB=KKA+JPVEXT*KKL
 IKE=KKU-JPVEXT*KKL
-IKT=SIZE(PDZZ,3)
 IKTB=1+JPVEXT
-IKTE=IKT-JPVEXT
+IKTE=KKT-JPVEXT
 !
 ZINV_TSTEP=1./PTSTEP
 GEXT_TEND=.TRUE.
 !
-ZT(:,:,:) = PTHT(:,:,:) * PEXN(:,:,:)
 ! LSFACT and LVFACT without exner
 IF(KRR==7) THEN
-  ZZ_LSFACT(:,:,:)=(XLSTT+(XCPV-XCI)*(ZT(:,:,:)-XTT))   &
-                   /( XCPD + XCPV*PRVT(:,:,:) + XCL*(PRCT(:,:,:)+PRRT(:,:,:))   &
-                   + XCI*(PRIT(:,:,:)+PRST(:,:,:)+PRGT(:,:,:)+PRHT(:,:,:)))
-  ZZ_LVFACT(:,:,:)=(XLVTT+(XCPV-XCL)*(ZT(:,:,:)-XTT))   &
-                   /( XCPD + XCPV*PRVT(:,:,:) + XCL*(PRCT(:,:,:)+PRRT(:,:,:))   &
-                   + XCI*(PRIT(:,:,:)+PRST(:,:,:)+PRGT(:,:,:)+PRHT(:,:,:)))
+  DO JK = 1, KKT
+    DO JJ = 1, KJT
+      DO JI = 1, KIT
+        ZT(JI,JJ,JK) = PTHT(JI,JJ,JK) * PEXN(JI,JJ,JK)
+        ZZ_LSFACT(JI,JJ,JK)=(XLSTT+(XCPV-XCI)*(ZT(JI,JJ,JK)-XTT))   &
+                         /( XCPD + XCPV*PRVT(JI,JJ,JK) + XCL*(PRCT(JI,JJ,JK)+PRRT(JI,JJ,JK))   &
+                         + XCI*(PRIT(JI,JJ,JK)+PRST(JI,JJ,JK)+PRGT(JI,JJ,JK)+PRHT(JI,JJ,JK)))
+        ZZ_LVFACT(JI,JJ,JK)=(XLVTT+(XCPV-XCL)*(ZT(JI,JJ,JK)-XTT))   &
+                         /( XCPD + XCPV*PRVT(JI,JJ,JK) + XCL*(PRCT(JI,JJ,JK)+PRRT(JI,JJ,JK))   &
+                         + XCI*(PRIT(JI,JJ,JK)+PRST(JI,JJ,JK)+PRGT(JI,JJ,JK)+PRHT(JI,JJ,JK)))
+      ENDDO
+    ENDDO
+  ENDDO
 ELSE
-  ZZ_LSFACT(:,:,:)=(XLSTT+(XCPV-XCI)*(ZT(:,:,:)-XTT))   &
-                   /( XCPD + XCPV*PRVT(:,:,:) + XCL*(PRCT(:,:,:)+PRRT(:,:,:))   &
-                   + XCI*(PRIT(:,:,:)+PRST(:,:,:)+PRGT(:,:,:)))
-  ZZ_LVFACT(:,:,:)=(XLVTT+(XCPV-XCL)*(ZT(:,:,:)-XTT))   &
-                   /( XCPD + XCPV*PRVT(:,:,:) + XCL*(PRCT(:,:,:)+PRRT(:,:,:))   &
-                   + XCI*(PRIT(:,:,:)+PRST(:,:,:)+PRGT(:,:,:)))
+  DO JK = 1, KKT
+    DO JJ = 1, KJT
+      DO JI = 1, KIT
+        ZT(JI,JJ,JK) = PTHT(JI,JJ,JK) * PEXN(JI,JJ,JK)
+        ZZ_LSFACT(JI,JJ,JK)=(XLSTT+(XCPV-XCI)*(ZT(JI,JJ,JK)-XTT))   &
+                         /( XCPD + XCPV*PRVT(JI,JJ,JK) + XCL*(PRCT(JI,JJ,JK)+PRRT(JI,JJ,JK))   &
+                         + XCI*(PRIT(JI,JJ,JK)+PRST(JI,JJ,JK)+PRGT(JI,JJ,JK)))
+        ZZ_LVFACT(JI,JJ,JK)=(XLVTT+(XCPV-XCL)*(ZT(JI,JJ,JK)-XTT))   &
+                         /( XCPD + XCPV*PRVT(JI,JJ,JK) + XCL*(PRCT(JI,JJ,JK)+PRRT(JI,JJ,JK))   &
+                         + XCI*(PRIT(JI,JJ,JK)+PRST(JI,JJ,JK)+PRGT(JI,JJ,JK)))
+      ENDDO
+    ENDDO
+  ENDDO
 ENDIF
 !
 !-------------------------------------------------------------------------------
@@ -552,22 +597,22 @@ IF(.NOT. LSEDIM_AFTER) THEN
   IF(HSEDIM=='STAT') THEN
     !SR: It *seems* that we must have two separate calls for ifort
     IF(KRR==7) THEN
-      CALL ICE4_SEDIMENTATION_STAT(IIB, IIE, IIT, IJB, IJE, IJT, IKB, IKE, IKTB, IKTE, IKT, KKL, &
+      CALL ICE4_SEDIMENTATION_STAT(IIB, IIE, KIT, IJB, IJE, KJT, IKB, IKE, IKTB, IKTE, KKT, KKL, &
                                   &PTSTEP, KRR, OSEDIC, LDEPOSC, XVDEPOSC, PDZZ, &
                                   &PRHODREF, PPABST, PTHT, PRHODJ, &
                                   &PRCS, PRCS*PTSTEP, PRRS, PRRS*PTSTEP, PRIS, PRIS*PTSTEP,&
                                   &PRSS, PRSS*PTSTEP, PRGS, PRGS*PTSTEP,&
                                   &PINPRC, PINDEP, PINPRR, ZINPRI, PINPRS, PINPRG, &
-                                  &PSEA, PTOWN,  &
+                                  &PSEA=PSEA, PTOWN=PTOWN, &
                                   &PINPRH=PINPRH, PRHT=PRHS*PTSTEP, PRHS=PRHS, PFPR=PFPR)
     ELSE
-      CALL ICE4_SEDIMENTATION_STAT(IIB, IIE, IIT, IJB, IJE, IJT, IKB, IKE, IKTB, IKTE, IKT, KKL, &
-                                  &PTSTEP, KRR, OSEDIC, LDEPOSC, XVDEPOSC,  PDZZ, &
+      CALL ICE4_SEDIMENTATION_STAT(IIB, IIE, KIT, IJB, IJE, KJT, IKB, IKE, IKTB, IKTE, KKT, KKL, &
+                                  &PTSTEP, KRR, OSEDIC, LDEPOSC, XVDEPOSC, PDZZ, &
                                   &PRHODREF, PPABST, PTHT, PRHODJ, &
                                   &PRCS, PRCS*PTSTEP, PRRS, PRRS*PTSTEP, PRIS, PRIS*PTSTEP,&
                                   &PRSS, PRSS*PTSTEP, PRGS, PRGS*PTSTEP,&
                                   &PINPRC, PINDEP, PINPRR, ZINPRI, PINPRS, PINPRG, &
-                                  &PSEA, PTOWN,  &
+                                  &PSEA=PSEA, PTOWN=PTOWN, &
                                   &PFPR=PFPR)
     ENDIF
     PINPRS(:,:) = PINPRS(:,:) + ZINPRI(:,:)
@@ -575,20 +620,20 @@ IF(.NOT. LSEDIM_AFTER) THEN
   ELSEIF(HSEDIM=='SPLI') THEN
     !SR: It *seems* that we must have two separate calls for ifort
     IF(KRR==7) THEN
-      CALL ICE4_SEDIMENTATION_SPLIT(IIB, IIE, IIT, IJB, IJE, IJT, IKB, IKE, IKTB, IKTE, IKT, KKL, &
-                                   &PTSTEP, KRR, OSEDIC, LDEPOSC,XVDEPOSC, PDZZ, &
+      CALL ICE4_SEDIMENTATION_SPLIT(IIB, IIE, KIT, IJB, IJE, KJT, IKB, IKE, IKTB, IKTE, KKT, KKL, &
+                                   &PTSTEP, KRR, OSEDIC, LDEPOSC, XVDEPOSC, PDZZ, &
                                    &PRHODREF, PPABST, PTHT, PRHODJ, &
                                    &PRCS, PRCT, PRRS, PRRT, PRIS, PRIT, PRSS, PRST, PRGS, PRGT,&
                                    &PINPRC, PINDEP, PINPRR, ZINPRI, PINPRS, PINPRG, &
-                                   &PSEA, PTOWN,  &
+                                   &PSEA=PSEA, PTOWN=PTOWN, &
                                    &PINPRH=PINPRH, PRHT=PRHT, PRHS=PRHS, PFPR=PFPR)
     ELSE
-      CALL ICE4_SEDIMENTATION_SPLIT(IIB, IIE, IIT, IJB, IJE, IJT, IKB, IKE, IKTB, IKTE, IKT, KKL, &
-                                   &PTSTEP, KRR, OSEDIC, LDEPOSC,XVDEPOSC, PDZZ, &
+      CALL ICE4_SEDIMENTATION_SPLIT(IIB, IIE, KIT, IJB, IJE, KJT, IKB, IKE, IKTB, IKTE, KKT, KKL, &
+                                   &PTSTEP, KRR, OSEDIC, LDEPOSC, XVDEPOSC, PDZZ, &
                                    &PRHODREF, PPABST, PTHT, PRHODJ, &
                                    &PRCS, PRCT, PRRS, PRRT, PRIS, PRIT, PRSS, PRST, PRGS, PRGT,&
                                    &PINPRC, PINDEP, PINPRR, ZINPRI, PINPRS, PINPRG, &
-                                   &PSEA, PTOWN, &
+                                   &PSEA=PSEA, PTOWN=PTOWN, &
                                    &PFPR=PFPR)
     ENDIF
     PINPRS(:,:) = PINPRS(:,:) + ZINPRI(:,:)
@@ -602,9 +647,10 @@ IF(.NOT. LSEDIM_AFTER) THEN
     !   will be still active and will lead to negative values.
     !   We could prevent the algorithm to not consume too much a specie, instead we apply
     !   a correction here.
-    CALL CORRECT_NEGATIVITIES(KRR, PRVS, PRCS, PRRS, &
+    CALL CORRECT_NEGATIVITIES(KIT, KJT, KKT, KRR, PRVS, PRCS, PRRS, &
                              &PRIS, PRSS, PRGS, &
                              &PTHS, ZZ_LVFACT, ZZ_LSFACT, PRHS)
+  ELSEIF(HSEDIM=='NONE') THEN
   ELSE
     call Print_msg( NVERB_FATAL, 'GEN', 'RAIN_ICE_RED', 'no sedimentation scheme for HSEDIM='//HSEDIM )
   END IF
@@ -631,8 +677,8 @@ ENDIF
 !  optimization by looking for locations where
 !  the microphysical fields are larger than a minimal value only !!!
 !
-! IMICRO=0
-IMICRO=COUNTJV(ODMICRO(:,:,:), I1(:), I2(:), I3(:))
+!IMICRO=0
+IF(KSIZE/=0) IMICRO=COUNTJV(ODMICRO(:,:,:), I1(:), I2(:), I3(:))
 !Packing
 IF(IMICRO>0) THEN
   DO JL=1, IMICRO
@@ -648,6 +694,22 @@ IF(IMICRO>0) THEN
     ZTHT(JL) = PTHT(I1(JL),I2(JL),I3(JL))
     ZPRES(JL) = PPABST(I1(JL),I2(JL),I3(JL))
     ZEXN(JL) = PEXN(I1(JL),I2(JL),I3(JL))
+    ZHLC_HCF(JL) = PHLC_HCF(I1(JL),I2(JL),I3(JL))
+    ZHLC_HRC(JL) = PHLC_HRC(I1(JL),I2(JL),I3(JL))
+    ZHLC_LRC(JL) = ZRCT(JL) - ZHLC_HRC(JL)
+    ZHLI_HCF(JL) = PHLI_HCF(I1(JL),I2(JL),I3(JL))
+    ZHLI_HRI(JL) = PHLI_HRI(I1(JL),I2(JL),I3(JL))
+    ZHLI_LRI(JL) = ZRIT(JL) - ZHLI_HRI(JL)
+    IF(ZRCT(JL)>0.) THEN
+      ZHLC_LCF(JL) = ZCF(JL)- ZHLC_HCF(JL)
+    ELSE
+      ZHLC_LCF(JL)=0.
+    ENDIF
+    IF(ZRIT(JL)>0.) THEN
+      ZHLI_LCF(JL) = ZCF(JL)- ZHLI_HCF(JL)
+    ELSE
+      ZHLI_LCF(JL)=0.
+    ENDIF
   ENDDO
   IF(GEXT_TEND) THEN
     DO JL=1, IMICRO
@@ -664,7 +726,6 @@ IF(IMICRO>0) THEN
   IF(HSUBG_AUCV_RC=='PDF ' .AND. CSUBG_PR_PDF=='SIGM') THEN
     DO JL=1, IMICRO
       ZSIGMA_RC(JL) = PSIGS(I1(JL),I2(JL),I3(JL))*2.
-!     ZSIGMA_RC(JL) = MAX(PSIGS(I1(JL),I2(JL),I3(JL)) * 2., 1.E-12)
     ENDDO
   ENDIF
   IF(KRR==7) THEN
@@ -747,53 +808,59 @@ DO WHILE(ANY(ZTIME(:)<PTSTEP)) ! Loop to *really* compute tendencies
   IF(XMRSTEP/=0.) THEN
     ! In this case we need to remember the mixing ratios used to compute the tendencies
     ! because when mixing ratio has evolved more than a threshold, we must re-compute tendecies
-    Z0RVT(:)=ZRVT(:)
-    Z0RCT(:)=ZRCT(:)
-    Z0RRT(:)=ZRRT(:)
-    Z0RIT(:)=ZRIT(:)
-    Z0RST(:)=ZRST(:)
-    Z0RGT(:)=ZRGT(:)
-    Z0RHT(:)=ZRHT(:)
+    DO JL=1, IMICRO
+      Z0RVT(JL)=ZRVT(JL)
+      Z0RCT(JL)=ZRCT(JL)
+      Z0RRT(JL)=ZRRT(JL)
+      Z0RIT(JL)=ZRIT(JL)
+      Z0RST(JL)=ZRST(JL)
+      Z0RGT(JL)=ZRGT(JL)
+      Z0RHT(JL)=ZRHT(JL)
+    ENDDO
   ENDIF
   IF(XTSTEP_TS/=0.) THEN
     ! In this case we need to remember the time when tendencies were computed
     ! because when time has evolved more than a limit, we must re-compute tendecies
     ZTIME_LASTCALL(:)=ZTIME(:)
   ENDIF
-  LLCOMPUTE(:)=ZTIME(:)<PTSTEP ! Compuation only for points for which integration time has not reached the timestep
+  ZCOMPUTE(:)=MAX(0., -SIGN(1., ZTIME(:)-PTSTEP)) ! Compuation (1.) only for points for which integration time has not reached the timestep
   LSOFT=.FALSE. ! We *really* compute the tendencies
-  WHERE(LLCOMPUTE(:))
-    IITER(:)=IITER(:)+1
-  END WHERE
-  DO WHILE(ANY(LLCOMPUTE(:))) ! Loop to adjust tendencies when we cross the 0°C or when a specie disappears
-    ZZT(:) = ZTHT(:) * ZEXN(:)
+  IITER(:)=IITER(:)+INT(ZCOMPUTE(:))
+  DO WHILE(SUM(ZCOMPUTE(:))>0.) ! Loop to adjust tendencies when we cross the 0°C or when a specie disappears
     IF(KRR==7) THEN
-      ZLSFACT(:)=(XLSTT+(XCPV-XCI)*(ZZT(:)-XTT))   &
-                 /( (XCPD + XCPV*ZRVT(:) + XCL*(ZRCT(:)+ZRRT(:))   &
-                 + XCI*(ZRIT(:)+ZRST(:)+ZRGT(:)+ZRHT(:)))*ZEXN(:) )
-      ZLVFACT(:)=(XLVTT+(XCPV-XCL)*(ZZT(:)-XTT))   &
-                 /( (XCPD + XCPV*ZRVT(:) + XCL*(ZRCT(:)+ZRRT(:))   &
-                 + XCI*(ZRIT(:)+ZRST(:)+ZRGT(:)+ZRHT(:)))*ZEXN(:) )
+      DO JL=1, IMICRO
+        ZZT(JL) = ZTHT(JL) * ZEXN(JL)
+        ZLSFACT(JL)=(XLSTT+(XCPV-XCI)*(ZZT(JL)-XTT))   &
+                   &/( (XCPD + XCPV*ZRVT(JL) + XCL*(ZRCT(JL)+ZRRT(JL))   &
+                   &+ XCI*(ZRIT(JL)+ZRST(JL)+ZRGT(JL)+ZRHT(JL)))*ZEXN(JL) )
+        ZLVFACT(JL)=(XLVTT+(XCPV-XCL)*(ZZT(JL)-XTT))   &
+                   &/( (XCPD + XCPV*ZRVT(JL) + XCL*(ZRCT(JL)+ZRRT(JL))   &
+                   &+ XCI*(ZRIT(JL)+ZRST(JL)+ZRGT(JL)+ZRHT(JL)))*ZEXN(JL) )
+      ENDDO
     ELSE
-      ZLSFACT(:)=(XLSTT+(XCPV-XCI)*(ZZT(:)-XTT))   &
-                 /( (XCPD + XCPV*ZRVT(:) + XCL*(ZRCT(:)+ZRRT(:))   &
-                 + XCI*(ZRIT(:)+ZRST(:)+ZRGT(:)))*ZEXN(:) )
-      ZLVFACT(:)=(XLVTT+(XCPV-XCL)*(ZZT(:)-XTT))   &
-                 /( (XCPD + XCPV*ZRVT(:) + XCL*(ZRCT(:)+ZRRT(:))   &
-                 + XCI*(ZRIT(:)+ZRST(:)+ZRGT(:)))*ZEXN(:) )
+      DO JL=1, IMICRO
+        ZZT(JL) = ZTHT(JL) * ZEXN(JL)
+        ZLSFACT(JL)=(XLSTT+(XCPV-XCI)*(ZZT(JL)-XTT))   &
+                   &/( (XCPD + XCPV*ZRVT(JL) + XCL*(ZRCT(JL)+ZRRT(JL))   &
+                   &+ XCI*(ZRIT(JL)+ZRST(JL)+ZRGT(JL)))*ZEXN(JL) )
+        ZLVFACT(JL)=(XLVTT+(XCPV-XCL)*(ZZT(JL)-XTT))   &
+                   &/( (XCPD + XCPV*ZRVT(JL) + XCL*(ZRCT(JL)+ZRRT(JL))   &
+                   &+ XCI*(ZRIT(JL)+ZRST(JL)+ZRGT(JL)))*ZEXN(JL) )
+      ENDDO
     ENDIF
     !
     !***       4.1 Tendecies computation
     !
     ! Tendencies are *really* computed when LSOFT==.FALSE. and only adjusted otherwise
-    CALL ICE4_TENDENCIES(IMICRO, IIB, IIE, IIT, IJB, IJE, IJT, IKB, IKE, IKT, KKL, &
-                        &KRR, LSOFT, LLCOMPUTE, &
-                        &OWARM, CSUBG_RC_RR_ACCR, CSUBG_RR_EVAP, HSUBG_AUCV_RC, CSUBG_PR_PDF, &
+    CALL ICE4_TENDENCIES(IMICRO, IIB, IIE, KIT, IJB, IJE, KJT, IKB, IKE, KKT, KKL, &
+                        &KRR, LSOFT, ZCOMPUTE, &
+                        &OWARM, CSUBG_RC_RR_ACCR, CSUBG_RR_EVAP, &
+                        &HSUBG_AUCV_RC, HSUBG_AUCV_RI, CSUBG_PR_PDF, &
                         &ZEXN, ZRHODREF, ZLVFACT, ZLSFACT, I1, I2, I3, &
-                        &ZPRES, ZCF, ZSIGMA_RC, &
+                        &ZPRES, ZCF, ZSIGMA_RC,&
                         &ZCIT, &
                         &ZZT, ZTHT, &
-                        &ZRVT, ZRCT, ZRRT, ZRIT, ZRST, ZRGT, ZRHT, PRRT, &
+                        &ZRVT, ZRCT, ZRRT, ZRIT, ZRST, ZRGT, ZRHT, &
                         &ZRVHENI_MR, ZRRHONG_MR, ZRIMLTC_MR, ZRSRIMCG_MR, &
                         &ZRCHONI, ZRVDEPS, ZRIAGGS, ZRIAUTS, ZRVDEPG, &
                         &ZRCAUTR, ZRCACCR, ZRREVAV, &
@@ -803,181 +870,229 @@ DO WHILE(ANY(ZTIME(:)<PTSTEP)) ! Loop to *really* compute tendencies
                         &ZRCWETH, ZRIWETH, ZRSWETH, ZRGWETH, ZRRWETH, &
                         &ZRCDRYH, ZRIDRYH, ZRSDRYH, ZRRDRYH, ZRGDRYH, ZRDRYHG, ZRHMLTR, &
                         &ZRCBERI, &
-                        &ZRS_TEND, ZRG_TEND, ZRH_TEND, &
+                        &ZRS_TEND, ZRG_TEND, ZRH_TEND, ZSSI, &
                         &ZA_TH, ZA_RV, ZA_RC, ZA_RR, ZA_RI, ZA_RS, ZA_RG, ZA_RH, &
                         &ZB_TH, ZB_RV, ZB_RC, ZB_RR, ZB_RI, ZB_RS, ZB_RG, ZB_RH, &
-                        &ZHLC_HCF, ZHLC_LCF, ZHLC_HRC, ZHLC_LRC, PRAINFR)
+                        &ZHLC_HCF, ZHLC_LCF, ZHLC_HRC, ZHLC_LRC, &
+                        &ZHLI_HCF, ZHLI_LCF, ZHLI_HRI, ZHLI_LRI, PRAINFR)
     ! External tendencies
     IF(GEXT_TEND) THEN
-      ZA_TH(:) = ZA_TH(:) + ZEXT_TH(:)
-      ZA_RV(:) = ZA_RV(:) + ZEXT_RV(:)
-      ZA_RC(:) = ZA_RC(:) + ZEXT_RC(:)
-      ZA_RR(:) = ZA_RR(:) + ZEXT_RR(:)
-      ZA_RI(:) = ZA_RI(:) + ZEXT_RI(:)
-      ZA_RS(:) = ZA_RS(:) + ZEXT_RS(:)
-      ZA_RG(:) = ZA_RG(:) + ZEXT_RG(:)
-      ZA_RH(:) = ZA_RH(:) + ZEXT_RH(:)
+      DO JL=1, IMICRO
+        ZA_TH(JL) = ZA_TH(JL) + ZEXT_TH(JL)
+        ZA_RV(JL) = ZA_RV(JL) + ZEXT_RV(JL)
+        ZA_RC(JL) = ZA_RC(JL) + ZEXT_RC(JL)
+        ZA_RR(JL) = ZA_RR(JL) + ZEXT_RR(JL)
+        ZA_RI(JL) = ZA_RI(JL) + ZEXT_RI(JL)
+        ZA_RS(JL) = ZA_RS(JL) + ZEXT_RS(JL)
+        ZA_RG(JL) = ZA_RG(JL) + ZEXT_RG(JL)
+        ZA_RH(JL) = ZA_RH(JL) + ZEXT_RH(JL)
+      ENDDO
     ENDIF
     !
     !***       4.2 Integration time
     !
-    ! If we can, we will use these tendecies until the end of the timestep
-    ZMAXTIME(:)=0.
-    WHERE(LLCOMPUTE(:))
-      ZMAXTIME(:)=PTSTEP-ZTIME(:) ! Remaining time until the end of the timestep
-    ENDWHERE
+    ! If we can, we will use these tendencies until the end of the timestep
+    ZMAXTIME(:)=ZCOMPUTE(:) * (PTSTEP-ZTIME(:)) ! Remaining time until the end of the timestep
 
     !We need to adjust tendencies when temperature reaches 0
     IF(LFEEDBACKT) THEN
-      !Is ZB_TH enough to change temperature sign?
-      WHERE( (ZTHT(:) - XTT/ZEXN(:)) * (ZTHT(:) + ZB_TH(:) - XTT/ZEXN(:)) < 0. )
-        ZMAXTIME(:)=0.
-      ENDWHERE
-      !Can ZA_TH make temperature change of sign?
-      ZTIME_THRESHOLD(:)=-1.
-      WHERE(ABS(ZA_TH(:))>1.E-20)
-        ZTIME_THRESHOLD(:)=(XTT/ZEXN(:) - ZB_TH(:) - ZTHT(:))/ZA_TH(:)
-      ENDWHERE
-      WHERE(ZTIME_THRESHOLD(:)>0.)
-        ZMAXTIME(:)=MIN(ZMAXTIME(:), ZTIME_THRESHOLD(:))
-      ENDWHERE
+      DO JL=1, IMICRO
+        !Is ZB_TH enough to change temperature sign?
+        ZW1D(JL)=(ZTHT(JL) - XTT/ZEXN(JL)) * (ZTHT(JL) + ZB_TH(JL) - XTT/ZEXN(JL))
+        ZMAXTIME(JL)=ZMAXTIME(JL)*MAX(0., SIGN(1., ZW1D(JL)))
+        !Can ZA_TH make temperature change of sign?
+        ZW1D(JL)=MAX(0., -SIGN(1., 1.E-20 - ABS(ZA_TH(JL)))) ! WHERE(ABS(ZA_TH(:))>1.E-20)
+        ZTIME_THRESHOLD(JL)=(1. - ZW1D(JL))*(-1.) + &
+                            ZW1D(JL) * &
+                            (XTT/ZEXN(JL) - ZB_TH(JL) - ZTHT(JL))/ &
+                            SIGN(MAX(ABS(ZA_TH(JL)), 1.E-20), ZA_TH(JL))
+        ZW1D(JL)=MAX(0., -SIGN(1., 1.E-20 - ZTIME_THRESHOLD(JL))) ! WHERE(ZTIME_THRESHOLD(:)>1.E-20)
+        ZMAXTIME(JL)=(1.-ZW1D(JL)) * ZMAXTIME(JL) + &
+                     ZW1D(JL) * MIN(ZMAXTIME(JL), ZTIME_THRESHOLD(JL))
+      ENDDO
     ENDIF
 
     !We need to adjust tendencies when a specy disappears
     !When a species is missing, only the external tendencies can be negative (and we must keep track of it)
-    WHERE(ZA_RV(:)<-1.E-20 .AND. ZRVT(:)>XRTMIN(1))
-      ZMAXTIME(:)=MIN(ZMAXTIME(:), -(ZB_RV(:)+ZRVT(:))/ZA_RV(:))
-    END WHERE
-    WHERE(ZA_RC(:)<-1.E-20 .AND. ZRCT(:)>XRTMIN(2))
-      ZMAXTIME(:)=MIN(ZMAXTIME(:), -(ZB_RC(:)+ZRCT(:))/ZA_RC(:))
-    END WHERE
-    WHERE(ZA_RR(:)<-1.E-20 .AND. ZRRT(:)>XRTMIN(3))
-      ZMAXTIME(:)=MIN(ZMAXTIME(:), -(ZB_RR(:)+ZRRT(:))/ZA_RR(:))
-    END WHERE
-    WHERE(ZA_RI(:)<-1.E-20 .AND. ZRIT(:)>XRTMIN(4))
-      ZMAXTIME(:)=MIN(ZMAXTIME(:), -(ZB_RI(:)+ZRIT(:))/ZA_RI(:))
-    END WHERE
-    WHERE(ZA_RS(:)<-1.E-20 .AND. ZRST(:)>XRTMIN(5))
-      ZMAXTIME(:)=MIN(ZMAXTIME(:), -(ZB_RS(:)+ZRST(:))/ZA_RS(:))
-    END WHERE
-    WHERE(ZA_RG(:)<-1.E-20 .AND. ZRGT(:)>XRTMIN(6))
-      ZMAXTIME(:)=MIN(ZMAXTIME(:), -(ZB_RG(:)+ZRGT(:))/ZA_RG(:))
-    END WHERE
+    DO JL=1, IMICRO
+      ZW1D(JL)=MAX(0., -SIGN(1., ZA_RV(JL)+1.E-20)) * & ! WHERE(ZA_RV(:)<-1.E-20)
+              &MAX(0., -SIGN(1., XRTMIN(1)-ZRVT(JL)))   ! WHERE(ZRVT(:)>XRTMIN(1))
+      ZMAXTIME(JL)=(1.-ZW1D(JL)) * ZMAXTIME(JL) + &
+                  &ZW1D(JL) * MIN(ZMAXTIME(JL), -(ZB_RV(JL)+ZRVT(JL))/MIN(ZA_RV(JL), -1.E-20))
+
+      ZW1D(JL)=MAX(0., -SIGN(1., ZA_RC(JL)+1.E-20)) * & ! WHERE(ZA_RC(:)<-1.E-20)
+              &MAX(0., -SIGN(1., XRTMIN(2)-ZRCT(JL)))   ! WHERE(ZRCT(:)>XRTMIN(2))
+      ZMAXTIME(JL)=(1.-ZW1D(JL)) * ZMAXTIME(JL) + &
+                  &ZW1D(JL) * MIN(ZMAXTIME(JL), -(ZB_RC(JL)+ZRCT(JL))/MIN(ZA_RC(JL), -1.E-20))
+
+      ZW1D(JL)=MAX(0., -SIGN(1., ZA_RR(JL)+1.E-20)) * & ! WHERE(ZA_RR(:)<-1.E-20)
+              &MAX(0., -SIGN(1., XRTMIN(3)-ZRRT(JL)))   ! WHERE(ZRRT(:)>XRTMIN(3))
+      ZMAXTIME(JL)=(1.-ZW1D(JL)) * ZMAXTIME(JL) + &
+                  &ZW1D(JL) * MIN(ZMAXTIME(JL), -(ZB_RR(JL)+ZRRT(JL))/MIN(ZA_RR(JL), -1.E-20))
+
+      ZW1D(JL)=MAX(0., -SIGN(1., ZA_RI(JL)+1.E-20)) * & ! WHERE(ZI_RV(:)<-1.E-20)
+              &MAX(0., -SIGN(1., XRTMIN(4)-ZRIT(JL)))   ! WHERE(ZRIT(:)>XRTMIN(4))
+      ZMAXTIME(JL)=(1.-ZW1D(JL)) * ZMAXTIME(JL) + &
+                  &ZW1D(JL) * MIN(ZMAXTIME(JL), -(ZB_RI(JL)+ZRIT(JL))/MIN(ZA_RI(JL), -1.E-20))
+
+      ZW1D(JL)=MAX(0., -SIGN(1., ZA_RS(JL)+1.E-20)) * & ! WHERE(ZA_RS(:)<-1.E-20)
+              &MAX(0., -SIGN(1., XRTMIN(5)-ZRST(JL)))   ! WHERE(ZRST(:)>XRTMIN(5))
+      ZMAXTIME(JL)=(1.-ZW1D(JL)) * ZMAXTIME(JL) + &
+                  &ZW1D(JL) * MIN(ZMAXTIME(JL), -(ZB_RS(JL)+ZRST(JL))/MIN(ZA_RS(JL), -1.E-20))
+
+      ZW1D(JL)=MAX(0., -SIGN(1., ZA_RG(JL)+1.E-20)) * & ! WHERE(ZA_RG(:)<-1.E-20)
+              &MAX(0., -SIGN(1., XRTMIN(6)-ZRGT(JL)))   ! WHERE(ZRGT(:)>XRTMIN(6))
+      ZMAXTIME(JL)=(1.-ZW1D(JL)) * ZMAXTIME(JL) + &
+                  &ZW1D(JL) * MIN(ZMAXTIME(JL), -(ZB_RG(JL)+ZRGT(JL))/MIN(ZA_RG(JL), -1.E-20))
+    ENDDO
+
     IF(KRR==7) THEN
-      WHERE(ZA_RH(:)<-1.E-20 .AND. ZRHT(:)>XRTMIN(7))
-        ZMAXTIME(:)=MIN(ZMAXTIME(:), -(ZB_RH(:)+ZRHT(:))/ZA_RH(:))
-      END WHERE
+      DO JL=1, IMICRO
+        ZW1D(JL)=MAX(0., -SIGN(1., ZA_RH(JL)+1.E-20)) * & ! WHERE(ZA_RH(:)<-1.E-20)
+                &MAX(0., -SIGN(1., XRTMIN(7)-ZRHT(JL)))   ! WHERE(ZRHT(:)>XRTMIN(7))
+        ZMAXTIME(JL)=(1.-ZW1D(JL)) * ZMAXTIME(JL) + &
+                    &ZW1D(JL) * MIN(ZMAXTIME(JL), -(ZB_RH(JL)+ZRHT(JL))/MIN(ZA_RH(JL), -1.E-20))
+      ENDDO
     ENDIF
 
     !We stop when the end of the timestep is reached
-    WHERE(PTSTEP-ZTIME(:)-ZMAXTIME(:)<=0.)
-      LLCOMPUTE(:)=.FALSE.
-    ENDWHERE
+    ZCOMPUTE(:)=ZCOMPUTE(:) * MAX(0., -SIGN(1., ZTIME(:)+ZMAXTIME(:)-PTSTEP))
 
     !We must recompute tendencies when the end of the sub-timestep is reached
     IF(XTSTEP_TS/=0.) THEN
-      WHERE(IITER(:)<INB_ITER_MAX .AND. ZTIME(:)+ZMAXTIME(:)>ZTIME_LASTCALL(:)+ZTSTEP)
-        ZMAXTIME(:)=ZTIME_LASTCALL(:)-ZTIME(:)+ZTSTEP
-        LLCOMPUTE(:)=.FALSE.
-      ENDWHERE
+      DO JL=1, IMICRO
+        ZW1D(JL)=MAX(0., -SIGN(1., IITER(JL)-INB_ITER_MAX+0.)) * & ! WHERE(IITER(:)<INB_ITER_MAX)
+                &MAX(0., -SIGN(1., ZTIME_LASTCALL(JL)+ZTSTEP-ZTIME(JL)-ZMAXTIME(JL))) ! WHERE(ZTIME(:)+ZMAXTIME(:)>ZTIME_LASTCALL(:)+ZTSTEP)
+        ZMAXTIME(JL)=(1.-ZW1D(JL)) * ZMAXTIME(JL) + &
+                    &ZW1D(JL) * (ZTIME_LASTCALL(JL)-ZTIME(JL)+ZTSTEP)
+        ZCOMPUTE(JL)=ZCOMPUTE(JL) * (1. - ZW1D(JL))
+      ENDDO
     ENDIF
 
     !We must recompute tendencies when the maximum allowed change is reached
     !When a specy is missing, only the external tendencies can be active and we do not want to recompute
     !the microphysical tendencies when external tendencies are negative (results won't change because specy was already missing)
     IF(XMRSTEP/=0.) THEN
-      ZTIME_THRESHOLD(:)=-1.
-      WHERE(IITER(:)<INB_ITER_MAX .AND. ABS(ZA_RV(:))>1.E-20)
-        ZTIME_THRESHOLD(:)=(SIGN(1., ZA_RV(:))*XMRSTEP+Z0RVT(:)-ZRVT(:)-ZB_RV(:))/ZA_RV(:)
-      ENDWHERE
-      WHERE(ZTIME_THRESHOLD(:)>=0. .AND. ZTIME_THRESHOLD(:)<ZMAXTIME(:) .AND. &
-           &(ZRVT(:)>XRTMIN(1) .OR. ZA_RV(:)>0.))
-        ZMAXTIME(:)=MIN(ZMAXTIME(:), ZTIME_THRESHOLD(:))
-        LLCOMPUTE(:)=.FALSE.
-      ENDWHERE
-
-      ZTIME_THRESHOLD(:)=-1.
-      WHERE(IITER(:)<INB_ITER_MAX .AND. ABS(ZA_RC(:))>1.E-20)
-        ZTIME_THRESHOLD(:)=(SIGN(1., ZA_RC(:))*XMRSTEP+Z0RCT(:)-ZRCT(:)-ZB_RC(:))/ZA_RC(:)
-      ENDWHERE
-      WHERE(ZTIME_THRESHOLD(:)>=0. .AND. ZTIME_THRESHOLD(:)<ZMAXTIME(:) .AND. &
-           &(ZRCT(:)>XRTMIN(2) .OR. ZA_RC(:)>0.))
-        ZMAXTIME(:)=MIN(ZMAXTIME(:), ZTIME_THRESHOLD(:))
-        LLCOMPUTE(:)=.FALSE.
-      ENDWHERE
-
-      ZTIME_THRESHOLD(:)=-1.
-      WHERE(IITER(:)<INB_ITER_MAX .AND. ABS(ZA_RR(:))>1.E-20)
-        ZTIME_THRESHOLD(:)=(SIGN(1., ZA_RR(:))*XMRSTEP+Z0RRT(:)-ZRRT(:)-ZB_RR(:))/ZA_RR(:)
-      ENDWHERE
-      WHERE(ZTIME_THRESHOLD(:)>=0. .AND. ZTIME_THRESHOLD(:)<ZMAXTIME(:) .AND. &
-           &(ZRRT(:)>XRTMIN(3) .OR. ZA_RR(:)>0.))
-        ZMAXTIME(:)=MIN(ZMAXTIME(:), ZTIME_THRESHOLD(:))
-        LLCOMPUTE(:)=.FALSE.
-      ENDWHERE
-
-      ZTIME_THRESHOLD(:)=-1.
-      WHERE(IITER(:)<INB_ITER_MAX .AND. ABS(ZA_RI(:))>1.E-20)
-        ZTIME_THRESHOLD(:)=(SIGN(1., ZA_RI(:))*XMRSTEP+Z0RIT(:)-ZRIT(:)-ZB_RI(:))/ZA_RI(:)
-      ENDWHERE
-      WHERE(ZTIME_THRESHOLD(:)>=0. .AND. ZTIME_THRESHOLD(:)<ZMAXTIME(:) .AND. &
-           &(ZRIT(:)>XRTMIN(4) .OR. ZA_RI(:)>0.))
-        ZMAXTIME(:)=MIN(ZMAXTIME(:), ZTIME_THRESHOLD(:))
-        LLCOMPUTE(:)=.FALSE.
-      ENDWHERE
-
-      ZTIME_THRESHOLD(:)=-1.
-      WHERE(IITER(:)<INB_ITER_MAX .AND. ABS(ZA_RS(:))>1.E-20)
-        ZTIME_THRESHOLD(:)=(SIGN(1., ZA_RS(:))*XMRSTEP+Z0RST(:)-ZRST(:)-ZB_RS(:))/ZA_RS(:)
-      ENDWHERE
-      WHERE(ZTIME_THRESHOLD(:)>=0. .AND. ZTIME_THRESHOLD(:)<ZMAXTIME(:) .AND. &
-           &(ZRST(:)>XRTMIN(5) .OR. ZA_RS(:)>0.))
-        ZMAXTIME(:)=MIN(ZMAXTIME(:), ZTIME_THRESHOLD(:))
-        LLCOMPUTE(:)=.FALSE.
-      ENDWHERE
-
-      ZTIME_THRESHOLD(:)=-1.
-      WHERE(IITER(:)<INB_ITER_MAX .AND. ABS(ZA_RG(:))>1.E-20)
-        ZTIME_THRESHOLD(:)=(SIGN(1., ZA_RG(:))*XMRSTEP+Z0RGT(:)-ZRGT(:)-ZB_RG(:))/ZA_RG(:)
-      ENDWHERE
-      WHERE(ZTIME_THRESHOLD(:)>=0. .AND. ZTIME_THRESHOLD(:)<ZMAXTIME(:) .AND. &
-           &(ZRGT(:)>XRTMIN(6) .OR. ZA_RG(:)>0.))
-        ZMAXTIME(:)=MIN(ZMAXTIME(:), ZTIME_THRESHOLD(:))
-        LLCOMPUTE(:)=.FALSE.
-      ENDWHERE
+      DO JL=1, IMICRO
+        ZW1D(JL)=MAX(0., -SIGN(1., IITER(JL)-INB_ITER_MAX+0.)) * & ! WHERE(IITER(:)<INB_ITER_MAX)
+                &MAX(0., -SIGN(1., 1.E-20-ABS(ZA_RV(JL)))) ! WHERE(ABS(ZA_RV(:))>1.E-20)
+        ZTIME_THRESHOLD(JL)=(1.-ZW1D(JL))*(-1.) + &
+                           &ZW1D(JL)*(SIGN(1., ZA_RV(JL))*XMRSTEP+Z0RVT(JL)-ZRVT(JL)-ZB_RV(JL))/ &
+                           &SIGN(MAX(ABS(ZA_RV(JL)), 1.E-20), ZA_RV(JL))
+        ZW1D(JL)=MAX(0., SIGN(1., ZTIME_THRESHOLD(JL))) * & !WHERE(ZTIME_THRESHOLD(:)>=0.)
+                &MAX(0., -SIGN(1., ZTIME_THRESHOLD(JL)-ZMAXTIME(JL))) * & !WHERE(ZTIME_THRESHOLD(:)<ZMAXTIME(:))
+                &MIN(1., MAX(0., -SIGN(1., XRTMIN(6)-ZRVT(JL))) + & !WHERE(ZRVT(:)>XRTMIN(6)) .OR.
+                        &MAX(0., -SIGN(1., -ZA_RV(JL))))            !WHERE(ZA_RV(:)>0.)
+        ZMAXTIME(JL)=(1.-ZW1D(JL)) * ZMAXTIME(JL) + &
+                    &ZW1D(JL)*MIN(ZMAXTIME(JL), ZTIME_THRESHOLD(JL))
+        ZCOMPUTE(JL)=ZCOMPUTE(JL) * (1. - ZW1D(JL))
+
+        ZW1D(JL)=MAX(0., -SIGN(1., IITER(JL)-INB_ITER_MAX+0.)) * & ! WHERE(IITER(:)<INB_ITER_MAX)
+                &MAX(0., -SIGN(1., 1.E-20-ABS(ZA_RC(JL)))) ! WHERE(ABS(ZA_RC(:))>1.E-20)
+        ZTIME_THRESHOLD(JL)=(1.-ZW1D(JL))*(-1.) + &
+                           &ZW1D(JL)*(SIGN(1., ZA_RC(JL))*XMRSTEP+Z0RCT(JL)-ZRCT(JL)-ZB_RC(JL))/ &
+                           &SIGN(MAX(ABS(ZA_RC(JL)), 1.E-20), ZA_RC(JL))
+        ZW1D(JL)=MAX(0., SIGN(1., ZTIME_THRESHOLD(JL))) * & !WHERE(ZTIME_THRESHOLD(:)>=0.)
+                &MAX(0., -SIGN(1., ZTIME_THRESHOLD(JL)-ZMAXTIME(JL))) * & !WHERE(ZTIME_THRESHOLD(:)<ZMAXTIME(:))
+                &MIN(1., MAX(0., -SIGN(1., XRTMIN(6)-ZRCT(JL))) + & !WHERE(ZRCT(:)>XRTMIN(6)) .OR.
+                        &MAX(0., -SIGN(1., -ZA_RC(JL))))            !WHERE(ZA_RC(:)>0.)
+        ZMAXTIME(JL)=(1.-ZW1D(JL)) * ZMAXTIME(JL) + &
+                    &ZW1D(JL)*MIN(ZMAXTIME(JL), ZTIME_THRESHOLD(JL))
+        ZCOMPUTE(JL)=ZCOMPUTE(JL) * (1. - ZW1D(JL))
+
+        ZW1D(JL)=MAX(0., -SIGN(1., IITER(JL)-INB_ITER_MAX+0.)) * & ! WHERE(IITER(:)<INB_ITER_MAX)
+                &MAX(0., -SIGN(1., 1.E-20-ABS(ZA_RR(JL)))) ! WHERE(ABS(ZA_RR(:))>1.E-20)
+        ZTIME_THRESHOLD(JL)=(1.-ZW1D(JL))*(-1.) + &
+                           &ZW1D(JL)*(SIGN(1., ZA_RR(JL))*XMRSTEP+Z0RRT(JL)-ZRRT(JL)-ZB_RR(JL))/ &
+                           &SIGN(MAX(ABS(ZA_RR(JL)), 1.E-20), ZA_RR(JL))
+        ZW1D(JL)=MAX(0., SIGN(1., ZTIME_THRESHOLD(JL))) * & !WHERE(ZTIME_THRESHOLD(:)>=0.)
+                &MAX(0., -SIGN(1., ZTIME_THRESHOLD(JL)-ZMAXTIME(JL))) * & !WHERE(ZTIME_THRESHOLD(:)<ZMAXTIME(:))
+                &MIN(1., MAX(0., -SIGN(1., XRTMIN(6)-ZRRT(JL))) + & !WHERE(ZRRT(:)>XRTMIN(6)) .OR.
+                        &MAX(0., -SIGN(1., -ZA_RR(JL))))            !WHERE(ZA_RR(:)>0.)
+        ZMAXTIME(JL)=(1.-ZW1D(JL)) * ZMAXTIME(JL) + &
+                    &ZW1D(JL)*MIN(ZMAXTIME(JL), ZTIME_THRESHOLD(JL))
+        ZCOMPUTE(JL)=ZCOMPUTE(JL) * (1. - ZW1D(JL))
+
+        ZW1D(JL)=MAX(0., -SIGN(1., IITER(JL)-INB_ITER_MAX+0.)) * & ! WHERE(IITER(:)<INB_ITER_MAX)
+                &MAX(0., -SIGN(1., 1.E-20-ABS(ZA_RI(JL)))) ! WHERE(ABS(ZA_RI(:))>1.E-20)
+        ZTIME_THRESHOLD(JL)=(1.-ZW1D(JL))*(-1.) + &
+                           &ZW1D(JL)*(SIGN(1., ZA_RI(JL))*XMRSTEP+Z0RIT(JL)-ZRIT(JL)-ZB_RI(JL))/ &
+                           &SIGN(MAX(ABS(ZA_RI(JL)), 1.E-20), ZA_RI(JL))
+        ZW1D(JL)=MAX(0., SIGN(1., ZTIME_THRESHOLD(JL))) * & !WHERE(ZTIME_THRESHOLD(:)>=0.)
+                &MAX(0., -SIGN(1., ZTIME_THRESHOLD(JL)-ZMAXTIME(JL))) * & !WHERE(ZTIME_THRESHOLD(:)<ZMAXTIME(:))
+                &MIN(1., MAX(0., -SIGN(1., XRTMIN(6)-ZRIT(JL))) + & !WHERE(ZRIT(:)>XRTMIN(6)) .OR.
+                        &MAX(0., -SIGN(1., -ZA_RI(JL))))            !WHERE(ZA_RI(:)>0.)
+        ZMAXTIME(JL)=(1.-ZW1D(JL)) * ZMAXTIME(JL) + &
+                    &ZW1D(JL)*MIN(ZMAXTIME(JL), ZTIME_THRESHOLD(JL))
+        ZCOMPUTE(JL)=ZCOMPUTE(JL) * (1. - ZW1D(JL))
+
+        ZW1D(JL)=MAX(0., -SIGN(1., IITER(JL)-INB_ITER_MAX+0.)) * & ! WHERE(IITER(:)<INB_ITER_MAX)
+                &MAX(0., -SIGN(1., 1.E-20-ABS(ZA_RS(JL)))) ! WHERE(ABS(ZA_RS(:))>1.E-20)
+        ZTIME_THRESHOLD(JL)=(1.-ZW1D(JL))*(-1.) + &
+                           &ZW1D(JL)*(SIGN(1., ZA_RS(JL))*XMRSTEP+Z0RST(JL)-ZRST(JL)-ZB_RS(JL))/ &
+                           &SIGN(MAX(ABS(ZA_RS(JL)), 1.E-20), ZA_RS(JL))
+        ZW1D(JL)=MAX(0., SIGN(1., ZTIME_THRESHOLD(JL))) * & !WHERE(ZTIME_THRESHOLD(:)>=0.)
+                &MAX(0., -SIGN(1., ZTIME_THRESHOLD(JL)-ZMAXTIME(JL))) * & !WHERE(ZTIME_THRESHOLD(:)<ZMAXTIME(:))
+                &MIN(1., MAX(0., -SIGN(1., XRTMIN(6)-ZRST(JL))) + & !WHERE(ZRST(:)>XRTMIN(6)) .OR.
+                        &MAX(0., -SIGN(1., -ZA_RS(JL))))            !WHERE(ZA_RS(:)>0.)
+        ZMAXTIME(JL)=(1.-ZW1D(JL)) * ZMAXTIME(JL) + &
+                    &ZW1D(JL)*MIN(ZMAXTIME(JL), ZTIME_THRESHOLD(JL))
+        ZCOMPUTE(JL)=ZCOMPUTE(JL) * (1. - ZW1D(JL))
+
+        ZW1D(JL)=MAX(0., -SIGN(1., IITER(JL)-INB_ITER_MAX+0.)) * & ! WHERE(IITER(:)<INB_ITER_MAX)
+                &MAX(0., -SIGN(1., 1.E-20-ABS(ZA_RG(JL)))) ! WHERE(ABS(ZA_RG(:))>1.E-20)
+        ZTIME_THRESHOLD(JL)=(1.-ZW1D(JL))*(-1.) + &
+                           &ZW1D(JL)*(SIGN(1., ZA_RG(JL))*XMRSTEP+Z0RGT(JL)-ZRGT(JL)-ZB_RG(JL))/ &
+                           &SIGN(MAX(ABS(ZA_RG(JL)), 1.E-20), ZA_RG(JL))
+        ZW1D(JL)=MAX(0., SIGN(1., ZTIME_THRESHOLD(JL))) * & !WHERE(ZTIME_THRESHOLD(:)>=0.)
+                &MAX(0., -SIGN(1., ZTIME_THRESHOLD(JL)-ZMAXTIME(JL))) * & !WHERE(ZTIME_THRESHOLD(:)<ZMAXTIME(:))
+                &MIN(1., MAX(0., -SIGN(1., XRTMIN(6)-ZRGT(JL))) + & !WHERE(ZRGT(:)>XRTMIN(6)) .OR.
+                        &MAX(0., -SIGN(1., -ZA_RG(JL))))            !WHERE(ZA_RG(:)>0.)
+        ZMAXTIME(JL)=(1.-ZW1D(JL)) * ZMAXTIME(JL) + &
+                    &ZW1D(JL)*MIN(ZMAXTIME(JL), ZTIME_THRESHOLD(JL))
+        ZCOMPUTE(JL)=ZCOMPUTE(JL) * (1. - ZW1D(JL))
+      ENDDO
 
       IF(KRR==7) THEN
-        ZTIME_THRESHOLD(:)=-1.
-        WHERE(IITER(:)<INB_ITER_MAX .AND. ABS(ZA_RH(:))>1.E-20)
-          ZTIME_THRESHOLD(:)=(SIGN(1., ZA_RH(:))*XMRSTEP+Z0RHT(:)-ZRHT(:)-ZB_RH(:))/ZA_RH(:)
-        ENDWHERE
-        WHERE(ZTIME_THRESHOLD(:)>=0. .AND. ZTIME_THRESHOLD(:)<ZMAXTIME(:) .AND. &
-             &(ZRHT(:)>XRTMIN(7) .OR. ZA_RH(:)>0.))
-          ZMAXTIME(:)=MIN(ZMAXTIME(:), ZTIME_THRESHOLD(:))
-          LLCOMPUTE(:)=.FALSE.
-        ENDWHERE
+        DO JL=1, IMICRO
+          ZW1D(JL)=MAX(0., -SIGN(1., IITER(JL)-INB_ITER_MAX+0.)) * & ! WHERE(IITER(:)<INB_ITER_MAX)
+                  &MAX(0., -SIGN(1., 1.E-20-ABS(ZA_RH(JL)))) ! WHERE(ABS(ZA_RH(:))>1.E-20)
+          ZTIME_THRESHOLD(JL)=(1.-ZW1D(JL))*(-1.) + &
+                             &ZW1D(JL)*(SIGN(1., ZA_RH(JL))*XMRSTEP+Z0RHT(JL)-ZRHT(JL)-ZB_RH(JL))/ &
+                             &SIGN(MAX(ABS(ZA_RH(JL)), 1.E-20), ZA_RH(JL))
+          ZW1D(JL)=MAX(0., SIGN(1., ZTIME_THRESHOLD(JL))) * & !WHERE(ZTIME_THRESHOLD(:)>=0.)
+                  &MAX(0., -SIGN(1., ZTIME_THRESHOLD(JL)-ZMAXTIME(JL))) * & !WHERE(ZTIME_THRESHOLD(:)<ZMAXTIME(:))
+                  &MIN(1., MAX(0., -SIGN(1., XRTMIN(6)-ZRHT(JL))) + & !WHERE(ZRHT(:)>XRTMIN(6)) .OR.
+                          &MAX(0., -SIGN(1., -ZA_RH(JL))))            !WHERE(ZA_RH(:)>0.)
+          ZMAXTIME(JL)=(1.-ZW1D(JL)) * ZMAXTIME(JL) + &
+                      &ZW1D(JL)*MIN(ZMAXTIME(JL), ZTIME_THRESHOLD(JL))
+          ZCOMPUTE(JL)=ZCOMPUTE(JL) * (1. - ZW1D(JL))
+        ENDDO
       ENDIF
 
-      WHERE(IITER(:)<INB_ITER_MAX .AND. MAX(ABS(ZB_RV(:)), ABS(ZB_RC(:)), ABS(ZB_RR(:)), ABS(ZB_RI(:)), &
-                                            ABS(ZB_RS(:)), ABS(ZB_RG(:)), ABS(ZB_RH(:)))>XMRSTEP)
-        ZMAXTIME(:)=0.
-        LLCOMPUTE(:)=.FALSE.
-      ENDWHERE
+      DO JL=1, IMICRO
+        ZW1D(JL)=MAX(ABS(ZB_RV(JL)), ABS(ZB_RC(JL)), ABS(ZB_RR(JL)), ABS(ZB_RI(JL)), &
+                    &ABS(ZB_RS(JL)), ABS(ZB_RG(JL)), ABS(ZB_RH(JL)))
+        ZW1D(JL)=MAX(0., -SIGN(1., IITER(JL)-INB_ITER_MAX+0.)) * & !WHERE(IITER(:)<INB_ITER_MAX)
+                &MAX(0., -SIGN(1., XMRSTEP-ZW1D(JL))) !WHERE(ZW1D(:)>XMRSTEP)
+        ZMAXTIME(JL)=(1.-ZW1D(JL))*ZMAXTIME(JL)
+        ZCOMPUTE(JL)=ZCOMPUTE(JL) * (1. - ZW1D(JL))
+      ENDDO
     ENDIF
     !
     !***       4.3 New values of variables for next iteration
     !
-    ZTHT=ZTHT+ZA_TH(:)*ZMAXTIME(:)+ZB_TH(:)
-    ZRVT=ZRVT+ZA_RV(:)*ZMAXTIME(:)+ZB_RV(:)
-    ZRCT=ZRCT+ZA_RC(:)*ZMAXTIME(:)+ZB_RC(:)
-    ZRRT=ZRRT+ZA_RR(:)*ZMAXTIME(:)+ZB_RR(:)
-    ZRIT=ZRIT+ZA_RI(:)*ZMAXTIME(:)+ZB_RI(:)
-    ZRST=ZRST+ZA_RS(:)*ZMAXTIME(:)+ZB_RS(:)
-    ZRGT=ZRGT+ZA_RG(:)*ZMAXTIME(:)+ZB_RG(:)
-    IF(KRR==7) ZRHT=ZRHT+ZA_RH(:)*ZMAXTIME(:)+ZB_RH(:)
-    WHERE(ZRIT(:)==0.)
-      ZCIT(:) = 0.
-    END WHERE
+    DO JL=1, IMICRO
+      ZTHT(JL)=ZTHT(JL)+ZA_TH(JL)*ZMAXTIME(JL)+ZB_TH(JL)
+      ZRVT(JL)=ZRVT(JL)+ZA_RV(JL)*ZMAXTIME(JL)+ZB_RV(JL)
+      ZRCT(JL)=ZRCT(JL)+ZA_RC(JL)*ZMAXTIME(JL)+ZB_RC(JL)
+      ZRRT(JL)=ZRRT(JL)+ZA_RR(JL)*ZMAXTIME(JL)+ZB_RR(JL)
+      ZRIT(JL)=ZRIT(JL)+ZA_RI(JL)*ZMAXTIME(JL)+ZB_RI(JL)
+      ZRST(JL)=ZRST(JL)+ZA_RS(JL)*ZMAXTIME(JL)+ZB_RS(JL)
+      ZRGT(JL)=ZRGT(JL)+ZA_RG(JL)*ZMAXTIME(JL)+ZB_RG(JL)
+      ZCIT(JL)=ZCIT(JL) * MAX(0., -SIGN(1., -ZRIT(JL))) ! WHERE(ZRIT(:)==0.) ZCIT(:) = 0.
+    ENDDO
+    IF(KRR==7) ZRHT(:)=ZRHT(:)+ZA_RH(:)*ZMAXTIME(:)+ZB_RH(:)
     !
     !***       4.4 Mixing ratio change due to each process
     !
@@ -1045,11 +1160,19 @@ IF(IMICRO>0) THEN
   ZHLC_LCF3D(:,:,:)=0.
   ZHLC_HRC3D(:,:,:)=0.
   ZHLC_LRC3D(:,:,:)=0.
+  ZHLI_HCF3D(:,:,:)=0.
+  ZHLI_LCF3D(:,:,:)=0.
+  ZHLI_HRI3D(:,:,:)=0.
+  ZHLI_LRI3D(:,:,:)=0.
   DO JL=1,IMICRO
     ZHLC_HCF3D(I1(JL), I2(JL), I3(JL)) = ZHLC_HCF(JL)
     ZHLC_LCF3D(I1(JL), I2(JL), I3(JL)) = ZHLC_LCF(JL)
     ZHLC_HRC3D(I1(JL), I2(JL), I3(JL)) = ZHLC_HRC(JL)
     ZHLC_LRC3D(I1(JL), I2(JL), I3(JL)) = ZHLC_LRC(JL)
+    ZHLI_LCF3D(I1(JL), I2(JL), I3(JL)) = ZHLI_LCF(JL)
+    ZHLI_HCF3D(I1(JL), I2(JL), I3(JL)) = ZHLI_HCF(JL)
+    ZHLI_HRI3D(I1(JL), I2(JL), I3(JL)) = ZHLI_HRI(JL)
+    ZHLI_LRI3D(I1(JL), I2(JL), I3(JL)) = ZHLI_LRI(JL)
     PCIT(I1(JL), I2(JL), I3(JL)) = ZCIT(JL)
   END DO
 ELSE
@@ -1058,6 +1181,10 @@ ELSE
   ZHLC_LCF3D(:,:,:)=0.
   ZHLC_HRC3D(:,:,:)=0.
   ZHLC_LRC3D(:,:,:)=0.
+  ZHLI_HCF3D(:,:,:)=0.
+  ZHLI_LCF3D(:,:,:)=0.
+  ZHLI_HRI3D(:,:,:)=0.
+  ZHLI_LRI3D(:,:,:)=0.
   PCIT(:,:,:) = 0.
 ENDIF
 IF(OWARM) THEN
@@ -1071,24 +1198,29 @@ ENDIF
 !*       6.     COMPUTES THE SLOW COLD PROCESS SOURCES OUTSIDE OF ODMICRO POINTS
 !               ----------------------------------------------------------------
 !
-CALL ICE4_NUCLEATION_WRAPPER(IIT, IJT, IKT, .NOT. ODMICRO, &
+CALL ICE4_NUCLEATION_WRAPPER(KIT, KJT, KKT, .NOT. ODMICRO, &
                              PTHT, PPABST, PRHODREF, PEXN, ZZ_LSFACT/PEXN, ZT, &
                              PRVT, &
                              PCIT, ZZ_RVHENI_MR)
-ZZ_LSFACT(:,:,:)=ZZ_LSFACT(:,:,:)/PEXNREF(:,:,:)
-ZZ_LVFACT(:,:,:)=ZZ_LVFACT(:,:,:)/PEXNREF(:,:,:)
-ZZ_RVHENI(:,:,:) = MIN(PRVS(:,:,:), ZZ_RVHENI_MR(:,:,:)/PTSTEP)
-PRIS(:,:,:)=PRIS(:,:,:)+ZZ_RVHENI(:,:,:)
-PRVS(:,:,:)=PRVS(:,:,:)-ZZ_RVHENI(:,:,:)
-PTHS(:,:,:)=PTHS(:,:,:) + ZZ_RVHENI(:,:,:)*ZZ_LSFACT(:,:,:)
-
+DO JK = 1, KKT
+  DO JJ = 1, KJT
+    DO JI = 1, KIT
+      ZZ_LSFACT(JI,JJ,JK)=ZZ_LSFACT(JI,JJ,JK)/PEXNREF(JI,JJ,JK)
+      ZZ_LVFACT(JI,JJ,JK)=ZZ_LVFACT(JI,JJ,JK)/PEXNREF(JI,JJ,JK)
+      ZZ_RVHENI(JI,JJ,JK) = MIN(PRVS(JI,JJ,JK), ZZ_RVHENI_MR(JI,JJ,JK)/PTSTEP)
+      PRIS(JI,JJ,JK)=PRIS(JI,JJ,JK)+ZZ_RVHENI(JI,JJ,JK)
+      PRVS(JI,JJ,JK)=PRVS(JI,JJ,JK)-ZZ_RVHENI(JI,JJ,JK)
+      PTHS(JI,JJ,JK)=PTHS(JI,JJ,JK) + ZZ_RVHENI(JI,JJ,JK)*ZZ_LSFACT(JI,JJ,JK)
+    ENDDO
+  ENDDO
+ENDDO
+!
 if ( lbu_enable ) then
   !Note: there is an other contribution for HENU later
   if ( lbudget_th ) call Budget_store_end( tbudgets(NBUDGET_TH), 'HENU', pths(:, :, :) * prhodj(:, :, :) )
   if ( lbudget_rv ) call Budget_store_end( tbudgets(NBUDGET_RV), 'HENU', prvs(:, :, :) * prhodj(:, :, :) )
   if ( lbudget_ri ) call Budget_store_add( tbudgets(NBUDGET_RI), 'HENU', zz_rvheni(:, :, :) * prhodj(:, :, :) )
 end if
-
 !-------------------------------------------------------------------------------
 !
 !*       7.     UNPACKING AND TOTAL TENDENCIES
@@ -1101,14 +1233,16 @@ end if
 !
 IF(GEXT_TEND) THEN
   !Z..T variables contain the exeternal tendency, we substract it
-  ZRVT(:) = ZRVT(:) - ZEXT_RV(:) * PTSTEP
-  ZRCT(:) = ZRCT(:) - ZEXT_RC(:) * PTSTEP
-  ZRRT(:) = ZRRT(:) - ZEXT_RR(:) * PTSTEP
-  ZRIT(:) = ZRIT(:) - ZEXT_RI(:) * PTSTEP
-  ZRST(:) = ZRST(:) - ZEXT_RS(:) * PTSTEP
-  ZRGT(:) = ZRGT(:) - ZEXT_RG(:) * PTSTEP
+  DO JL=1, IMICRO
+    ZRVT(JL) = ZRVT(JL) - ZEXT_RV(JL) * PTSTEP
+    ZRCT(JL) = ZRCT(JL) - ZEXT_RC(JL) * PTSTEP
+    ZRRT(JL) = ZRRT(JL) - ZEXT_RR(JL) * PTSTEP
+    ZRIT(JL) = ZRIT(JL) - ZEXT_RI(JL) * PTSTEP
+    ZRST(JL) = ZRST(JL) - ZEXT_RS(JL) * PTSTEP
+    ZRGT(JL) = ZRGT(JL) - ZEXT_RG(JL) * PTSTEP
+    ZTHT(JL) = ZTHT(JL) - ZEXT_TH(JL) * PTSTEP
+  ENDDO
   IF (KRR==7) ZRHT(:) = ZRHT(:) - ZEXT_RH(:) * PTSTEP
-  ZTHT(:) = ZTHT(:) - ZEXT_TH(:) * PTSTEP
 ENDIF
 !Tendencies computed from difference between old state and new state (can be negative)
   ZW_RVS(:,:,:) = 0.
@@ -1155,7 +1289,7 @@ if ( lbu_enable ) then
 end if
 
 !We correct negativities with conservation
-CALL CORRECT_NEGATIVITIES(KRR, ZW_RVS, ZW_RCS, ZW_RRS, &
+CALL CORRECT_NEGATIVITIES(KIT, KJT, KKT, KRR, ZW_RVS, ZW_RCS, ZW_RRS, &
                          &ZW_RIS, ZW_RSS, ZW_RGS, &
                          &ZW_THS, ZZ_LVFACT, ZZ_LSFACT, ZW_RHS)
 
@@ -1507,16 +1641,20 @@ ENDIF
 !
 !***     7.3    Final tendencies
 !
-PRVS(:,:,:) = ZW_RVS(:,:,:)
-PRCS(:,:,:) = ZW_RCS(:,:,:)
-PRRS(:,:,:) = ZW_RRS(:,:,:)
-PRIS(:,:,:) = ZW_RIS(:,:,:)
-PRSS(:,:,:) = ZW_RSS(:,:,:)
-PRGS(:,:,:) = ZW_RGS(:,:,:)
-IF (KRR==7) THEN
-  PRHS(:,:,:) = ZW_RHS(:,:,:)
-ENDIF
-PTHS(:,:,:) = ZW_THS(:,:,:)
+DO JK = 1, KKT
+  DO JJ = 1, KJT
+    DO JI = 1, KIT
+      PRVS(JI,JJ,JK) = ZW_RVS(JI,JJ,JK)
+      PRCS(JI,JJ,JK) = ZW_RCS(JI,JJ,JK)
+      PRRS(JI,JJ,JK) = ZW_RRS(JI,JJ,JK)
+      PRIS(JI,JJ,JK) = ZW_RIS(JI,JJ,JK)
+      PRSS(JI,JJ,JK) = ZW_RSS(JI,JJ,JK)
+      PRGS(JI,JJ,JK) = ZW_RGS(JI,JJ,JK)
+      PTHS(JI,JJ,JK) = ZW_THS(JI,JJ,JK)
+    ENDDO
+  ENDDO
+ENDDO
+IF (KRR==7) PRHS(:,:,:) = ZW_RHS(:,:,:)
 !
 !-------------------------------------------------------------------------------
 !
@@ -1543,22 +1681,22 @@ IF(LSEDIM_AFTER) THEN
   IF(HSEDIM=='STAT') THEN
     !SR: It *seems* that we must have two separate calls for ifort
     IF(KRR==7) THEN
-      CALL ICE4_SEDIMENTATION_STAT(IIB, IIE, IIT, IJB, IJE, IJT, IKB, IKE, IKTB, IKTE, IKT, KKL, &
+      CALL ICE4_SEDIMENTATION_STAT(IIB, IIE, KIT, IJB, IJE, KJT, IKB, IKE, IKTB, IKTE, KKT, KKL, &
                                   &PTSTEP, KRR, OSEDIC, LDEPOSC, XVDEPOSC, PDZZ, &
                                   &PRHODREF, PPABST, PTHT, PRHODJ, &
                                   &PRCS, PRCS*PTSTEP, PRRS, PRRS*PTSTEP, PRIS, PRIS*PTSTEP,&
                                   &PRSS, PRSS*PTSTEP, PRGS, PRGS*PTSTEP,&
                                   &PINPRC, PINDEP, PINPRR, ZINPRI, PINPRS, PINPRG, &
-                                  &PSEA, PTOWN,  &
+                                  &PSEA=PSEA, PTOWN=PTOWN, &
                                   &PINPRH=PINPRH, PRHT=PRHS*PTSTEP, PRHS=PRHS, PFPR=PFPR)
     ELSE
-      CALL ICE4_SEDIMENTATION_STAT(IIB, IIE, IIT, IJB, IJE, IJT, IKB, IKE, IKTB, IKTE, IKT, KKL, &
+      CALL ICE4_SEDIMENTATION_STAT(IIB, IIE, KIT, IJB, IJE, KJT, IKB, IKE, IKTB, IKTE, KKT, KKL, &
                                   &PTSTEP, KRR, OSEDIC, LDEPOSC, XVDEPOSC, PDZZ,&
                                   &PRHODREF, PPABST, PTHT, PRHODJ, &
                                   &PRCS, PRCS*PTSTEP, PRRS, PRRS*PTSTEP, PRIS, PRIS*PTSTEP,&
                                   &PRSS, PRSS*PTSTEP, PRGS, PRGS*PTSTEP,&
                                   &PINPRC, PINDEP, PINPRR, ZINPRI, PINPRS, PINPRG, &
-                                  &PSEA, PTOWN,  &
+                                  &PSEA=PSEA, PTOWN=PTOWN, &
                                   &PFPR=PFPR)
     ENDIF
     PINPRS(:,:) = PINPRS(:,:) + ZINPRI(:,:)
@@ -1566,20 +1704,20 @@ IF(LSEDIM_AFTER) THEN
   ELSEIF(HSEDIM=='SPLI') THEN
     !SR: It *seems* that we must have two separate calls for ifort
     IF(KRR==7) THEN
-      CALL ICE4_SEDIMENTATION_SPLIT(IIB, IIE, IIT, IJB, IJE, IJT, IKB, IKE, IKTB, IKTE, IKT, KKL, &
+      CALL ICE4_SEDIMENTATION_SPLIT(IIB, IIE, KIT, IJB, IJE, KJT, IKB, IKE, IKTB, IKTE, KKT, KKL, &
                                    &PTSTEP, KRR, OSEDIC, LDEPOSC, XVDEPOSC, PDZZ, &
                                    &PRHODREF, PPABST, PTHT, PRHODJ, &
                                    &PRCS, PRCT, PRRS, PRRT, PRIS, PRIT, PRSS, PRST, PRGS, PRGT,&
                                    &PINPRC, PINDEP, PINPRR, ZINPRI, PINPRS, PINPRG, &
-                                   &PSEA, PTOWN,  &
+                                   &PSEA=PSEA, PTOWN=PTOWN, &
                                    &PINPRH=PINPRH, PRHT=PRHT, PRHS=PRHS, PFPR=PFPR)
     ELSE
-      CALL ICE4_SEDIMENTATION_SPLIT(IIB, IIE, IIT, IJB, IJE, IJT, IKB, IKE, IKTB, IKTE, IKT, KKL, &
+      CALL ICE4_SEDIMENTATION_SPLIT(IIB, IIE, KIT, IJB, IJE, KJT, IKB, IKE, IKTB, IKTE, KKT, KKL, &
                                    &PTSTEP, KRR, OSEDIC, LDEPOSC, XVDEPOSC, PDZZ, &
                                    &PRHODREF, PPABST, PTHT, PRHODJ, &
                                    &PRCS, PRCT, PRRS, PRRT, PRIS, PRIT, PRSS, PRST, PRGS, PRGT,&
                                    &PINPRC, PINDEP, PINPRR, ZINPRI, PINPRS, PINPRG, &
-                                   &PSEA, PTOWN,  &
+                                   &PSEA=PSEA, PTOWN=PTOWN, &
                                    &PFPR=PFPR)
     ENDIF
     PINPRS(:,:) = PINPRS(:,:) + ZINPRI(:,:)
@@ -1593,7 +1731,7 @@ IF(LSEDIM_AFTER) THEN
     !   will be still active and will lead to negative values.
     !   We could prevent the algorithm to not consume too much a specie, instead we apply
     !   a correction here.
-    CALL CORRECT_NEGATIVITIES(KRR, PRVS, PRCS, PRRS, &
+    CALL CORRECT_NEGATIVITIES(KIT, KJT, KKT, KRR, PRVS, PRCS, PRRS, &
                              &PRIS, PRSS, PRGS, &
                              &PTHS, ZZ_LVFACT, ZZ_LSFACT, PRHS)
   ELSE
@@ -1615,96 +1753,130 @@ IF(LSEDIM_AFTER) THEN
     call Budget_store_end( tbudgets(NBUDGET_RC), 'DEPO', prcs(:, :, :) * prhodj(:, :, :) )
 
   !sedimentation of rain fraction
-  CALL ICE4_RAINFR_VERT(IIB, IIE, IIT, IJB, IJE, IJT, IKB, IKE, IKT, KKL, PRAINFR, PRRS(:,:,:)*PTSTEP)
+  IF (PRESENT(PRHS)) THEN
+    CALL ICE4_RAINFR_VERT(IIB, IIE, KIT, IJB, IJE, KJT, IKB, IKE, KKT, KKL, PRAINFR, PRRS(:,:,:)*PTSTEP, &
+                       &PRSS(:,:,:)*PTSTEP, PRGS(:,:,:)*PTSTEP, PRHS(:,:,:)*PTSTEP)
+  ELSE
+    CALL ICE4_RAINFR_VERT(IIB, IIE, KIT, IJB, IJE, KJT, IKB, IKE, KKT, KKL, PRAINFR, PRRS(:,:,:)*PTSTEP, &
+                       &PRSS(:,:,:)*PTSTEP, PRGS(:,:,:)*PTSTEP)
+  ENDIF
 ENDIF
 !
 !
 CONTAINS
   !
-  SUBROUTINE CORRECT_NEGATIVITIES(KRR, PRV, PRC, PRR, &
+  SUBROUTINE CORRECT_NEGATIVITIES(KIT, KJT, KKT, KRR, PRV, PRC, PRR, &
                                  &PRI, PRS, PRG, &
                                  &PTH, PLVFACT, PLSFACT, PRH)
   !
   IMPLICIT NONE
   !
-  INTEGER,                INTENT(IN)    :: KRR
-  REAL, DIMENSION(:,:,:), INTENT(INOUT) :: PRV, PRC, PRR, PRI, PRS, PRG, PTH
-  REAL, DIMENSION(:,:,:), INTENT(IN)    :: PLVFACT, PLSFACT
-  REAL, DIMENSION(:,:,:), OPTIONAL, INTENT(INOUT) :: PRH
+  INTEGER,                INTENT(IN)    :: KIT, KJT, KKT, KRR
+  REAL, DIMENSION(KIT, KJT, KKT), INTENT(INOUT) :: PRV, PRC, PRR, PRI, PRS, PRG, PTH
+  REAL, DIMENSION(KIT, KJT, KKT), INTENT(IN)    :: PLVFACT, PLSFACT
+  REAL, DIMENSION(KIT, KJT, KKT), OPTIONAL, INTENT(INOUT) :: PRH
+  !
+  REAL, DIMENSION(KIT, KJT, KKT) :: ZW
+  INTEGER :: JI, JJ, JK
   !
-  REAL, DIMENSION(SIZE(PRV,1), SIZE(PRV,2), SIZE(PRV,3)) :: ZW
   !
   !We correct negativities with conservation
   ! 1) deal with negative values for mixing ratio, except for vapor
-  WHERE(PRC(:,:,:)<0.)
-    PRV(:,:,:)=PRV(:,:,:)+PRC(:,:,:)
-    PTH(:,:,:)=PTH(:,:,:)-PRC(:,:,:)*PLVFACT(:,:,:)
-    PRC(:,:,:)=0.
-  ENDWHERE
-  WHERE(PRR(:,:,:)<0.)
-    PRV(:,:,:)=PRV(:,:,:)+PRR(:,:,:)
-    PTH(:,:,:)=PTH(:,:,:)-PRR(:,:,:)*PLVFACT(:,:,:)
-    PRR(:,:,:)=0.
-  ENDWHERE
-  WHERE(PRI(:,:,:)<0.)
-    PRV(:,:,:)=PRV(:,:,:)+PRI(:,:,:)
-    PTH(:,:,:)=PTH(:,:,:)-PRI(:,:,:)*PLSFACT(:,:,:)
-    PRI(:,:,:)=0.
-  ENDWHERE
-  WHERE(PRS(:,:,:)<0.)
-    PRV(:,:,:)=PRV(:,:,:)+PRS(:,:,:)
-    PTH(:,:,:)=PTH(:,:,:)-PRS(:,:,:)*PLSFACT(:,:,:)
-    PRS(:,:,:)=0.
-  ENDWHERE
-  WHERE(PRG(:,:,:)<0.)
-    PRV(:,:,:)=PRV(:,:,:)+PRG(:,:,:)
-    PTH(:,:,:)=PTH(:,:,:)-PRG(:,:,:)*PLSFACT(:,:,:)
-    PRG(:,:,:)=0.
-  ENDWHERE
+  DO JK = 1, KKT
+    DO JJ = 1, KJT
+      DO JI = 1, KIT
+        ZW(JI,JJ,JK) =PRC(JI,JJ,JK)-MAX(PRC(JI,JJ,JK), 0.)
+        PRV(JI,JJ,JK)=PRV(JI,JJ,JK)+ZW(JI,JJ,JK)
+        PTH(JI,JJ,JK)=PTH(JI,JJ,JK)-ZW(JI,JJ,JK)*PLVFACT(JI,JJ,JK)
+        PRC(JI,JJ,JK)=PRC(JI,JJ,JK)-ZW(JI,JJ,JK)
+
+        ZW(JI,JJ,JK) =PRR(JI,JJ,JK)-MAX(PRR(JI,JJ,JK), 0.)
+        PRV(JI,JJ,JK)=PRV(JI,JJ,JK)+ZW(JI,JJ,JK)
+        PTH(JI,JJ,JK)=PTH(JI,JJ,JK)-ZW(JI,JJ,JK)*PLVFACT(JI,JJ,JK)
+        PRR(JI,JJ,JK)=PRR(JI,JJ,JK)-ZW(JI,JJ,JK)
+
+        ZW(JI,JJ,JK) =PRI(JI,JJ,JK)-MAX(PRI(JI,JJ,JK), 0.)
+        PRV(JI,JJ,JK)=PRV(JI,JJ,JK)+ZW(JI,JJ,JK)
+        PTH(JI,JJ,JK)=PTH(JI,JJ,JK)-ZW(JI,JJ,JK)*PLSFACT(JI,JJ,JK)
+        PRI(JI,JJ,JK)=PRI(JI,JJ,JK)-ZW(JI,JJ,JK)
+
+        ZW(JI,JJ,JK) =PRS(JI,JJ,JK)-MAX(PRS(JI,JJ,JK), 0.)
+        PRV(JI,JJ,JK)=PRV(JI,JJ,JK)+ZW(JI,JJ,JK)
+        PTH(JI,JJ,JK)=PTH(JI,JJ,JK)-ZW(JI,JJ,JK)*PLSFACT(JI,JJ,JK)
+        PRS(JI,JJ,JK)=PRS(JI,JJ,JK)-ZW(JI,JJ,JK)
+
+        ZW(JI,JJ,JK) =PRG(JI,JJ,JK)-MAX(PRG(JI,JJ,JK), 0.)
+        PRV(JI,JJ,JK)=PRV(JI,JJ,JK)+ZW(JI,JJ,JK)
+        PTH(JI,JJ,JK)=PTH(JI,JJ,JK)-ZW(JI,JJ,JK)*PLSFACT(JI,JJ,JK)
+        PRG(JI,JJ,JK)=PRG(JI,JJ,JK)-ZW(JI,JJ,JK)
+      ENDDO
+    ENDDO
+  ENDDO
+
   IF(KRR==7) THEN
-    WHERE(PRH(:,:,:)<0.)
-      PRV(:,:,:)=PRV(:,:,:)+PRH(:,:,:)
-      PTH(:,:,:)=PTH(:,:,:)-PRH(:,:,:)*PLSFACT(:,:,:)
-      PRH(:,:,:)=0.
-    ENDWHERE
+    DO JK = 1, KKT
+      DO JJ = 1, KJT
+        DO JI = 1, KIT
+          ZW(JI,JJ,JK) =PRH(JI,JJ,JK)-MAX(PRH(JI,JJ,JK), 0.)
+          PRV(JI,JJ,JK)=PRV(JI,JJ,JK)+ZW(JI,JJ,JK)
+          PTH(JI,JJ,JK)=PTH(JI,JJ,JK)-ZW(JI,JJ,JK)*PLSFACT(JI,JJ,JK)
+          PRH(JI,JJ,JK)=PRH(JI,JJ,JK)-ZW(JI,JJ,JK)
+        ENDDO
+      ENDDO
+    ENDDO
   ENDIF
+
   ! 2) deal with negative vapor mixing ratio
-  WHERE(PRV(:,:,:)<0. .AND. PRC(:,:,:)+PRI(:,:,:)>0.)
-    ! for rc and ri, we keep ice fraction constant
-    ZW(:,:,:)=MIN(1., -PRV(:,:,:)/(PRC(:,:,:)+PRI(:,:,:))) ! Proportion of rc+ri to convert into rv
-    PTH(:,:,:)=PTH(:,:,:)-ZW(:,:,:)*(PRC(:,:,:)*PLVFACT(:,:,:)+PRI(:,:,:)*PLSFACT(:,:,:))
-    PRV(:,:,:)=PRV(:,:,:)+ZW(:,:,:)*(PRC(:,:,:)+PRI(:,:,:))
-    PRC(:,:,:)=(1.-ZW(:,:,:))*PRC(:,:,:)
-    PRI(:,:,:)=(1.-ZW(:,:,:))*PRI(:,:,:)
-  ENDWHERE
-  WHERE(PRV(:,:,:)<0. .AND. PRR(:,:,:)>0.)
-    ZW(:,:,:)=MIN(PRR(:,:,:), -PRV(:,:,:)) ! Quantity of rr to convert into rv
-    PRV(:,:,:)=PRV(:,:,:)+ZW(:,:,:)
-    PRR(:,:,:)=PRR(:,:,:)-ZW(:,:,:)
-    PTH(:,:,:)=PTH(:,:,:)-ZW(:,:,:)*PLVFACT(:,:,:)
-  ENDWHERE
-  WHERE(PRV(:,:,:)<0. .AND. PRS(:,:,:)>0.)
-    ZW(:,:,:)=MIN(PRS(:,:,:), -PRV(:,:,:)) ! Quantity of rs to convert into rv
-    PRV(:,:,:)=PRV(:,:,:)+ZW(:,:,:)
-    PRS(:,:,:)=PRS(:,:,:)-ZW(:,:,:)
-    PTH(:,:,:)=PTH(:,:,:)-ZW(:,:,:)*PLSFACT(:,:,:)
-  ENDWHERE
-  WHERE(PRV(:,:,:)<0. .AND. PRG(:,:,:)>0.)
-    ZW(:,:,:)=MIN(PRG(:,:,:), -PRV(:,:,:)) ! Quantity of rg to convert into rv
-    PRV(:,:,:)=PRV(:,:,:)+ZW(:,:,:)
-    PRG(:,:,:)=PRG(:,:,:)-ZW(:,:,:)
-    PTH(:,:,:)=PTH(:,:,:)-ZW(:,:,:)*PLSFACT(:,:,:)
-  ENDWHERE
+
+  DO JK = 1, KKT
+    DO JJ = 1, KJT
+      DO JI = 1, KIT
+        ! for rc and ri, we keep ice fraction constant
+        ZW(JI,JJ,JK)=MIN(1., MAX(XRTMIN(1)-PRV(JI,JJ,JK), 0.) / &
+                            &MAX(PRC(JI,JJ,JK)+PRI(JI,JJ,JK), 1.E-20)) ! Proportion of rc+ri to convert into rv
+        PTH(JI,JJ,JK)=PTH(JI,JJ,JK)-ZW(JI,JJ,JK)* &
+                     &(PRC(JI,JJ,JK)*PLVFACT(JI,JJ,JK)+PRI(JI,JJ,JK)*PLSFACT(JI,JJ,JK))
+        PRV(JI,JJ,JK)=PRV(JI,JJ,JK)+ZW(JI,JJ,JK)*(PRC(JI,JJ,JK)+PRI(JI,JJ,JK))
+        PRC(JI,JJ,JK)=(1.-ZW(JI,JJ,JK))*PRC(JI,JJ,JK)
+        PRI(JI,JJ,JK)=(1.-ZW(JI,JJ,JK))*PRI(JI,JJ,JK)
+
+        ZW(JI,JJ,JK)=MIN(MAX(PRR(JI,JJ,JK), 0.), &
+                        &MAX(XRTMIN(1)-PRV(JI,JJ,JK), 0.)) ! Quantity of rr to convert into rv
+        PRV(JI,JJ,JK)=PRV(JI,JJ,JK)+ZW(JI,JJ,JK)
+        PRR(JI,JJ,JK)=PRR(JI,JJ,JK)-ZW(JI,JJ,JK)
+        PTH(JI,JJ,JK)=PTH(JI,JJ,JK)-ZW(JI,JJ,JK)*PLVFACT(JI,JJ,JK)
+
+        ZW(JI,JJ,JK)=MIN(MAX(PRS(JI,JJ,JK), 0.), &
+                        &MAX(XRTMIN(1)-PRV(JI,JJ,JK), 0.)) ! Quantity of rs to convert into rv
+        PRV(JI,JJ,JK)=PRV(JI,JJ,JK)+ZW(JI,JJ,JK)
+        PRS(JI,JJ,JK)=PRS(JI,JJ,JK)-ZW(JI,JJ,JK)
+        PTH(JI,JJ,JK)=PTH(JI,JJ,JK)-ZW(JI,JJ,JK)*PLSFACT(JI,JJ,JK)
+
+        ZW(JI,JJ,JK)=MIN(MAX(PRG(JI,JJ,JK), 0.), &
+                        &MAX(XRTMIN(1)-PRV(JI,JJ,JK), 0.)) ! Quantity of rg to convert into rv
+        PRV(JI,JJ,JK)=PRV(JI,JJ,JK)+ZW(JI,JJ,JK)
+        PRG(JI,JJ,JK)=PRG(JI,JJ,JK)-ZW(JI,JJ,JK)
+        PTH(JI,JJ,JK)=PTH(JI,JJ,JK)-ZW(JI,JJ,JK)*PLSFACT(JI,JJ,JK)
+      ENDDO
+    ENDDO
+  ENDDO
+
   IF(KRR==7) THEN
-    WHERE(PRV(:,:,:)<0. .AND. PRH(:,:,:)>0.)
-      ZW(:,:,:)=MIN(PRH(:,:,:), -PRV(:,:,:)) ! Quantity of rh to convert into rv
-      PRV(:,:,:)=PRV(:,:,:)+ZW(:,:,:)
-      PRH(:,:,:)=PRH(:,:,:)-ZW(:,:,:)
-      PTH(:,:,:)=PTH(:,:,:)-ZW(:,:,:)*PLSFACT(:,:,:)
-    ENDWHERE
+    DO JK = 1, KKT
+      DO JJ = 1, KJT
+        DO JI = 1, KIT
+          ZW(JI,JJ,JK)=MIN(MAX(PRH(JI,JJ,JK), 0.), &
+                          &MAX(XRTMIN(1)-PRV(JI,JJ,JK), 0.)) ! Quantity of rh to convert into rv
+          PRV(JI,JJ,JK)=PRV(JI,JJ,JK)+ZW(JI,JJ,JK)
+          PRH(JI,JJ,JK)=PRH(JI,JJ,JK)-ZW(JI,JJ,JK)
+          PTH(JI,JJ,JK)=PTH(JI,JJ,JK)-ZW(JI,JJ,JK)*PLSFACT(JI,JJ,JK)
+        ENDDO
+      ENDDO
+    ENDDO
   ENDIF
   !
   !
   END SUBROUTINE CORRECT_NEGATIVITIES
 
+!
 END SUBROUTINE RAIN_ICE_RED
diff --git a/src/MNH/read_exsegn.f90 b/src/MNH/read_exsegn.f90
index 5d1bb1470..b238faa9a 100644
--- a/src/MNH/read_exsegn.f90
+++ b/src/MNH/read_exsegn.f90
@@ -299,6 +299,7 @@ END MODULE MODI_READ_EXSEG_n
 !  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 ADAP mixing length and delete HRIO and BOUT from CMF_UPDRAFT
+!  S. Riette   11/05/2021  HighLow cloud
 !------------------------------------------------------------------------------
 !
 !*       0.    DECLARATIONS
@@ -869,7 +870,11 @@ CALL TEST_NAM_VAR(ILUOUT,'CLBCY(2)',CLBCY(2),'CYCL','WALL','OPEN')
 CALL TEST_NAM_VAR(ILUOUT,'CTURBDIM',CTURBDIM,'1DIM','3DIM')
 CALL TEST_NAM_VAR(ILUOUT,'CTURBLEN',CTURBLEN,'DELT','BL89','RM17','DEAR','BLKR','ADAP')
 CALL TEST_NAM_VAR(ILUOUT,'CTOM',CTOM,'NONE','TM06')
-CALL TEST_NAM_VAR(ILUOUT,'CSUBG_AUCV',CSUBG_AUCV,'NONE','CLFR','SIGM','PDF')
+CALL TEST_NAM_VAR(ILUOUT,'CSUBG_AUCV',CSUBG_AUCV,'NONE','CLFR','SIGM','PDF','ADJU')
+CALL TEST_NAM_VAR(ILUOUT,'CSUBG_AUCV_RI',CSUBG_AUCV_RI,'NONE','CLFR','ADJU')
+CALL TEST_NAM_VAR(ILUOUT,'CCONDENS',CCONDENS,'CB02','GAUS')
+CALL TEST_NAM_VAR(ILUOUT,'CLAMBDA3',CLAMBDA3,'CB','NONE')
+CALL TEST_NAM_VAR(ILUOUT,'CSUBG_MF_PDF',CSUBG_MF_PDF,'NONE','TRIANGLE')
 !
 CALL TEST_NAM_VAR(ILUOUT,'CCH_TDISCRETIZATION',CCH_TDISCRETIZATION, &
                  'SPLIT     ','CENTER    ','LAGGED    ')
diff --git a/src/MNH/resolved_cloud.f90 b/src/MNH/resolved_cloud.f90
index 6d4e94f46..9de88ea5b 100644
--- a/src/MNH/resolved_cloud.f90
+++ b/src/MNH/resolved_cloud.f90
@@ -23,6 +23,7 @@ INTERFACE
                                   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
@@ -132,8 +133,12 @@ REAL, DIMENSION(:,:,:),   INTENT(INOUT) :: PNACT    !concentrtaion d'aérosols a
 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(:,:), OPTIONAL, INTENT(IN) :: PSEA  ! Land Sea mask
-REAL, DIMENSION(:,:), OPTIONAL, INTENT(IN) :: PTOWN ! Town 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
@@ -156,6 +161,7 @@ END MODULE MODI_RESOLVED_CLOUD
                                   PSOLORG,PMI,                                         &
                                   PSPEEDC, PSPEEDR, PSPEEDS, PSPEEDG, PSPEEDH,         &
                                   PINDEP, PSUPSAT,  PNACT, PNPRO,PSSPRO, PRAINFR,      &
+                                  PHLC_HRC, PHLC_HCF, PHLI_HRI, PHLI_HCF,              &
                                   PSEA,PTOWN          )   
 !     ##########################################################################
 !
@@ -294,6 +300,7 @@ USE MODD_PARAM_LIMA,     ONLY: LCOLD, LRAIN, LWARM, XCONC_CCN_TOT, NMOD_CCN, NMO
                                YRTMIN=>XRTMIN, YCTMIN=>XCTMIN
 USE MODD_RAIN_ICE_DESCR, ONLY: XRTMIN
 USE MODD_SALT,           ONLY: LSALT
+USE MODD_TURB_n,         ONLY: CSUBG_AUCV_RI, CCONDENS, CLAMBDA3, CSUBG_MF_PDF
 !
 USE MODE_ll
 use mode_sources_neg_correct, only: Sources_neg_correct
@@ -423,8 +430,12 @@ REAL, DIMENSION(:,:,:),   INTENT(INOUT) :: PNACT    !concentrtaion d'aérosols a
 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(:,:), OPTIONAL, INTENT(IN) :: PSEA  ! Land Sea mask
-REAL, DIMENSION(:,:), OPTIONAL, INTENT(IN) :: PTOWN ! Town 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 :
@@ -725,17 +736,20 @@ SELECT CASE ( HCLOUD )
     ENDDO
     ZZZ = MZF( PZZ )
     IF(LRED .AND. LADJ_BEFORE) THEN
-      CALL ICE_ADJUST (1,IKU,1, KRR, CFRAC_ICE_ADJUST, 'ADJU',                 &
-                      OSUBG_COND, OSIGMAS, PTSTEP,PSIGQSAT,                    &
-                      PRHODJ, PEXNREF,  PSIGS, PMFCONV, PPABST, ZZZ,           &
-                      ZEXN, PCF_MF,PRC_MF,PRI_MF,                              &   
+      CALL ICE_ADJUST (1, IKU, 1, KRR, CFRAC_ICE_ADJUST, CCONDENS, CLAMBDA3,   &
+                      'ADJU', OSUBG_COND, OSIGMAS, CSUBG_MF_PDF,               &
+                      PTSTEP, PSIGQSAT,                                        &
+                      PRHODJ, PEXNREF, PRHODREF, PSIGS, PMFCONV, PPABST, ZZZ,  &
+                      ZEXN, PCF_MF, PRC_MF, PRI_MF,                            &
                       PRV=PRS(:,:,:,1)*PTSTEP, PRC=PRS(:,:,:,2)*PTSTEP,        &
                       PRVS=PRS(:,:,:,1), PRCS=PRS(:,:,:,2),                    &
                       PTH=PTHS*PTSTEP, PTHS=PTHS, PSRCS=PSRCS, PCLDFR=PCLDFR,  &
                       PRR=PRS(:,:,:,3)*PTSTEP,                                 &
                       PRI=PRS(:,:,:,4)*PTSTEP, PRIS=PRS(:,:,:,4),              &
                       PRS=PRS(:,:,:,5)*PTSTEP,                                 &
-                      PRG=PRS(:,:,:,6)*PTSTEP                                  )
+                      PRG=PRS(:,:,:,6)*PTSTEP,                                 &
+                      PHLC_HRC=PHLC_HRC, PHLC_HCF=PHLC_HCF,                    &
+                      PHLI_HRI=PHLI_HRI, PHLI_HCF=PHLI_HCF                     )
     ENDIF
     IF (LRED) THEN
       LLMICRO(:,:,:)=PRT(:,:,:,2)>XRTMIN(2) .OR. &
@@ -749,16 +763,20 @@ SELECT CASE ( HCLOUD )
                    PRS(:,:,:,4)>ZRSMIN(4) .OR. &
                    PRS(:,:,:,5)>ZRSMIN(5) .OR. &
                    PRS(:,:,:,6)>ZRSMIN(6)
-      CALL RAIN_ICE_RED ( OSEDIC,CSEDIM, HSUBG_AUCV, OWARM,1,IKU,1,      &
+      CALL RAIN_ICE_RED (SIZE(PTHT, 1), SIZE(PTHT, 2), SIZE(PTHT, 3), COUNT(LLMICRO), &
+                    OSEDIC, CSEDIM, HSUBG_AUCV, CSUBG_AUCV_RI,           &
+                    OWARM,1,IKU,1,                                       &
                     PTSTEP, KRR, LLMICRO, 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, PINPRR3D, PEVAP3D,                    &
-                    PINPRS, PINPRG, PSIGS, PINDEP, PRAINFR, PSEA,PTOWN, PFPR=ZFPR)
+                    PINPRS, PINPRG, PINDEP, PRAINFR, PSIGS,              &
+                    PSEA,PTOWN, PFPR=ZFPR                                )
     ELSE 
       CALL RAIN_ICE ( OSEDIC,CSEDIM, HSUBG_AUCV, OWARM,1,IKU,1,          &
                     KSPLITR, PTSTEP, KRR,                                &
@@ -777,17 +795,20 @@ SELECT CASE ( HCLOUD )
 !
 !
     IF (.NOT. LRED .OR. (LRED .AND. LADJ_AFTER) ) THEN
-      CALL ICE_ADJUST (1,IKU,1, KRR, CFRAC_ICE_ADJUST, 'CDEPI',    &
-                    OSUBG_COND, OSIGMAS, PTSTEP,PSIGQSAT,                    &
-                    PRHODJ, PEXNREF,  PSIGS, PMFCONV, PPABST, ZZZ,           &
-                    ZEXN, PCF_MF,PRC_MF,PRI_MF,                                    &   
-                    PRV=PRS(:,:,:,1)*PTSTEP, PRC=PRS(:,:,:,2)*PTSTEP,                    &
-                    PRVS=PRS(:,:,:,1), PRCS=PRS(:,:,:,2),                    &
-                    PTH=PTHS*PTSTEP, PTHS=PTHS, PSRCS=PSRCS, PCLDFR=PCLDFR,                   &
-                    PRR=PRS(:,:,:,3)*PTSTEP,                                 &
-                    PRI=PRS(:,:,:,4)*PTSTEP, PRIS=PRS(:,:,:,4),              &
-                    PRS=PRS(:,:,:,5)*PTSTEP,                                 &
-                    PRG=PRS(:,:,:,6)*PTSTEP                                  )
+      CALL ICE_ADJUST (1, IKU, 1, KRR, CFRAC_ICE_ADJUST, CCONDENS, CLAMBDA3,   &
+                       'CDEPI', OSUBG_COND, OSIGMAS, CSUBG_MF_PDF,             &
+                       PTSTEP, PSIGQSAT,                                       &
+                       PRHODJ, PEXNREF, PRHODREF, PSIGS, PMFCONV, PPABST, ZZZ, &
+                       ZEXN, PCF_MF, PRC_MF, PRI_MF,                           &
+                       PRV=PRS(:,:,:,1)*PTSTEP, PRC=PRS(:,:,:,2)*PTSTEP,       &
+                       PRVS=PRS(:,:,:,1), PRCS=PRS(:,:,:,2),                   &
+                       PTH=PTHS*PTSTEP, PTHS=PTHS, PSRCS=PSRCS, PCLDFR=PCLDFR, &
+                       PRR=PRS(:,:,:,3)*PTSTEP,                                &
+                       PRI=PRS(:,:,:,4)*PTSTEP, PRIS=PRS(:,:,:,4),             &
+                       PRS=PRS(:,:,:,5)*PTSTEP,                                &
+                       PRG=PRS(:,:,:,6)*PTSTEP,                                &
+                       PHLC_HRC=PHLC_HRC, PHLC_HCF=PHLC_HCF,                   &
+                       PHLI_HRI=PHLI_HRI, PHLI_HCF=PHLI_HCF                    )
     END IF
 
     deallocate( zexn )
@@ -808,18 +829,21 @@ SELECT CASE ( HCLOUD )
     ENDDO
     ZZZ = MZF( PZZ )
     IF(LRED .AND. LADJ_BEFORE) THEN
-            CALL ICE_ADJUST (1,IKU,1, KRR, CFRAC_ICE_ADJUST, 'ADJU',                 &
-                      OSUBG_COND, OSIGMAS, PTSTEP,PSIGQSAT,                    &
-                      PRHODJ, PEXNREF, PSIGS, PMFCONV, PPABST, ZZZ,            &
-                      ZEXN, PCF_MF,PRC_MF,PRI_MF,                              & 
-                      PRV=PRS(:,:,:,1)*PTSTEP, PRC=PRS(:,:,:,2)*PTSTEP,        &
-                      PRVS=PRS(:,:,:,1), PRCS=PRS(:,:,:,2),                    &
-                      PTH=PTHS*PTSTEP, PTHS=PTHS, PSRCS=PSRCS, PCLDFR=PCLDFR,  &
-                      PRR=PRS(:,:,:,3)*PTSTEP,                                 &
-                      PRI=PRS(:,:,:,4)*PTSTEP, PRIS=PRS(:,:,:,4),              &
-                      PRS=PRS(:,:,:,5)*PTSTEP,                                 &
-                      PRG=PRS(:,:,:,6)*PTSTEP,                                 &
-                      PRH=PRS(:,:,:,7)*PTSTEP                                  )
+      CALL ICE_ADJUST (1, IKU, 1, KRR, CFRAC_ICE_ADJUST, CCONDENS, CLAMBDA3,   &
+                       'ADJU', OSUBG_COND, OSIGMAS, CSUBG_MF_PDF,              &
+                       PTSTEP, PSIGQSAT,                                       &
+                       PRHODJ, PEXNREF, PRHODREF, PSIGS, PMFCONV, PPABST, ZZZ, &
+                       ZEXN, PCF_MF, PRC_MF, PRI_MF,                           &
+                       PRV=PRS(:,:,:,1)*PTSTEP, PRC=PRS(:,:,:,2)*PTSTEP,       &
+                       PRVS=PRS(:,:,:,1), PRCS=PRS(:,:,:,2),                   &
+                       PTH=PTHS*PTSTEP, PTHS=PTHS, PSRCS=PSRCS, PCLDFR=PCLDFR, &
+                       PRR=PRS(:,:,:,3)*PTSTEP,                                &
+                       PRI=PRS(:,:,:,4)*PTSTEP, PRIS=PRS(:,:,:,4),             &
+                       PRS=PRS(:,:,:,5)*PTSTEP,                                &
+                       PRG=PRS(:,:,:,6)*PTSTEP,                                &
+                       PRH=PRS(:,:,:,7)*PTSTEP,                                &
+                       PHLC_HRC=PHLC_HRC, PHLC_HCF=PHLC_HCF,                   &
+                       PHLI_HRI=PHLI_HRI, PHLI_HCF=PHLI_HCF                    )
     ENDIF
     IF  (LRED) THEN
       LLMICRO(:,:,:)=PRT(:,:,:,2)>XRTMIN(2) .OR. &
@@ -835,16 +859,19 @@ SELECT CASE ( HCLOUD )
                    PRS(:,:,:,5)>ZRSMIN(5) .OR. &
                    PRS(:,:,:,6)>ZRSMIN(6) .OR. &
                    PRS(:,:,:,7)>ZRSMIN(7)
-      CALL RAIN_ICE_RED ( OSEDIC,CSEDIM, HSUBG_AUCV, OWARM,1,IKU,1,       &
-                    PTSTEP, KRR, LLMICRO, ZEXN,                           &
+      CALL RAIN_ICE_RED (SIZE(PTHT, 1), SIZE(PTHT, 2), SIZE(PTHT, 3), COUNT(LLMICRO), &
+                    OSEDIC, CSEDIM, HSUBG_AUCV, CSUBG_AUCV_RI,&
+                    OWARM, 1, IKU, 1,             &
+                    PTSTEP, KRR, LLMICRO, 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, PINPRR3D, PEVAP3D,                    &
-                    PINPRS, PINPRG, PSIGS, PINDEP, PRAINFR, PSEA, PTOWN,  &
+                    PINPRS, PINPRG, PINDEP, PRAINFR, PSIGS, PSEA, PTOWN,  &
                     PRT(:,:,:,7), PRS(:,:,:,7), PINPRH, PFPR=ZFPR         )
     ELSE
       CALL RAIN_ICE ( OSEDIC,CSEDIM, HSUBG_AUCV, OWARM,1,IKU,1,           &
@@ -866,18 +893,21 @@ SELECT CASE ( HCLOUD )
 !*       10.2   Perform the saturation adjustment over cloud ice and cloud water
 !
     IF (.NOT. LRED .OR. (LRED .AND. LADJ_AFTER) ) THEN
-     CALL ICE_ADJUST (1,IKU,1, KRR, CFRAC_ICE_ADJUST, 'CDEPI',               &
-                    OSUBG_COND, OSIGMAS, PTSTEP,PSIGQSAT,                    &
-                    PRHODJ, PEXNREF, PSIGS, PMFCONV, PPABST, ZZZ,            &
-                    ZEXN, PCF_MF,PRC_MF,PRI_MF,                              &                     
-                    PRV=PRS(:,:,:,1)*PTSTEP, PRC=PRS(:,:,:,2)*PTSTEP,        &
-                    PRVS=PRS(:,:,:,1), PRCS=PRS(:,:,:,2),                    &
-                    PTH=PTHS*PTSTEP, PTHS=PTHS, PSRCS=PSRCS, PCLDFR=PCLDFR,  &
-                    PRR=PRS(:,:,:,3)*PTSTEP,                                 &
-                    PRI=PRS(:,:,:,4)*PTSTEP, PRIS=PRS(:,:,:,4),              &
-                    PRS=PRS(:,:,:,5)*PTSTEP,                                 &
-                    PRG=PRS(:,:,:,6)*PTSTEP,                                 &
-                    PRH=PRS(:,:,:,7)*PTSTEP                                  )
+     CALL ICE_ADJUST (1, IKU, 1, KRR, CFRAC_ICE_ADJUST, CCONDENS, CLAMBDA3,  &
+                     'CDEPI', OSUBG_COND, OSIGMAS, CSUBG_MF_PDF,             &
+                     PTSTEP, PSIGQSAT,                                       &
+                     PRHODJ, PEXNREF, PRHODREF, PSIGS, PMFCONV, PPABST, ZZZ, &
+                     ZEXN, PCF_MF, PRC_MF, PRI_MF,                           &
+                     PRV=PRS(:,:,:,1)*PTSTEP, PRC=PRS(:,:,:,2)*PTSTEP,       &
+                     PRVS=PRS(:,:,:,1), PRCS=PRS(:,:,:,2),                   &
+                     PTH=PTHS*PTSTEP, PTHS=PTHS, PSRCS=PSRCS, PCLDFR=PCLDFR, &
+                     PRR=PRS(:,:,:,3)*PTSTEP,                                &
+                     PRI=PRS(:,:,:,4)*PTSTEP, PRIS=PRS(:,:,:,4),             &
+                     PRS=PRS(:,:,:,5)*PTSTEP,                                &
+                     PRG=PRS(:,:,:,6)*PTSTEP,                                &
+                     PRH=PRS(:,:,:,7)*PTSTEP,                                &
+                     PHLC_HRC=PHLC_HRC, PHLC_HCF=PHLC_HCF,                   &
+                     PHLI_HRI=PHLI_HRI, PHLI_HCF=PHLI_HCF                    )
     END IF
 
     deallocate( zexn )
-- 
GitLab