diff --git a/docs/TODO b/docs/TODO
index d90b2504c47a6d254b0c33334343ba07f397e30a..65478ac76781c5b6615fe3b0f58f1ff986993ce7 100644
--- a/docs/TODO
+++ b/docs/TODO
@@ -13,27 +13,28 @@ Clé de compilation REPRO48 + REPRO55 ajoutées pour permettre de reproduire le
   - contournent des corrections de bug
   - modifient l'organisation de calculs
   - REPRO48 reproduit les résultats obtenus avant l'introduction de la fraction précipitante froide dans l'ajustement
-Utilisation des clés:                                                                                             |                                                                                                                         
-    - REPRO48 seule: la version de code qui sera retenue à la fin est celle de Méso-NH 5.5                          |  Ecrire doc sur marche à suivre pour intégrer un nouveau développement:                                                 
-    - REPRO55 seule: la version de code qui sera retenue à la fin est celle du cycle 48 d'AROME                     |  - dev dans MNH à faire en array-syntax                                                                                 
+Utilisation des clés:
+    - REPRO48 seule: la version de code qui sera retenue à la fin est celle de Méso-NH 5.5
+    - REPRO55 seule: la version de code qui sera retenue à la fin est celle du cycle 48 d'AROME
     - defined(REPRO48) || defined(REPRO55): la version de code qui sera retenue à la fin est nouvelle
 Ces clés devront être supprimées
 
 Ecrire doc sur marche à suivre pour intégrer un nouveau développement:
-- dev dans MNH à faire en array-syntax
-- dev dans AROME à faire en boucles do
-- intégration dans PHYEX: en array-syntax avec directives mnh_expand
-- les 3 tests suivants doivent donner les mêmes résultats (au bit près) dans chacun des deux modèles:
-  - compilation directe sans activer mnh_expand
-  - compilation en activant mnh_expand
-  - exécution en changeant le nombre de processeurs
+  - dev dans MNH à faire en array-syntax
+  - dev dans AROME à faire en boucles do
+  - intégration dans PHYEX: en array-syntax avec directives mnh_expand
+  - les 3 tests suivants doivent donner les mêmes résultats (au bit près) dans chacun des deux modèles:
+    - compilation directe sans activer mnh_expand
+    - compilation en activant mnh_expand
+    - exécution en changeant le nombre de processeurs
 
 Merge pb:
-- rain_ice_red: le cas test MesoNH n'est pas bit repro (diffs > 1% sur rapports de melange)
-                sur la modif src/mesonh/rain_ice_red au commit bdd10dd (First rain_ice new/red merge)
-- shallow_mf (appels dans aro_shallow et arp_shallow):
-       Dans Méso-NH: shallow_mf doit être appelé avec PDX=XDXHAT(1) et PDY=XDYHAT(1)
-       Dans AROME/ARP: où trouver la taille de maille?
+  - rain_ice_old a rebrancher dans Meso-NH
+  - rain_ice_red: le cas test MesoNH n'est pas bit repro (diffs > 1% sur rapports de melange)
+                  sur la modif src/mesonh/rain_ice_red au commit bdd10dd (First rain_ice new/red merge)
+  - shallow_mf (appels dans aro_shallow et arp_shallow):
+         Dans Méso-NH: shallow_mf doit être appelé avec PDX=XDXHAT(1) et PDY=XDYHAT(1)
+         Dans AROME/ARP: où trouver la taille de maille?
 
 Pb identifiés à corriger plus tard:
   - deposition devrait être déplacée dans ice4_tendencies
diff --git a/src/arome/ext/aro_rain_ice.F90 b/src/arome/ext/aro_rain_ice.F90
index 009de4a99e54c0888c2308aa7b623b7e83640cf0..329b6859dc0546954392de8021875419d9c76c11 100644
--- a/src/arome/ext/aro_rain_ice.F90
+++ b/src/arome/ext/aro_rain_ice.F90
@@ -420,7 +420,7 @@ IF (CMICRO=='ICE4') THEN
                  &  HSUBG_AUCV_RC=CSUBG_AUCV_RC, HSUBG_AUCV_RI=CSUBG_AUCV_RI,&
                  &  OWARM=OWARM,KKA=KKA,KKU=KKU,KKL=KKL, &
                  &  PTSTEP=2*PTSTEP, &
-                 &  KRR=KRR, LDMICRO=LLMICRO, PEXN=PEXNREF,            &
+                 &  KRR=KRR, ODMICRO=LLMICRO, PEXN=PEXNREF,            &
                  &  PDZZ=PDZZ, PRHODJ=PRHODJ, PRHODREF=PRHODREF, PEXNREF=PEXNREF,&
                  &  PPABST=PPABSM, PCIT=PCIT, PCLDFR=PCLDFR,  &
                  &  PHLC_HRC=PHLC_HRC, PHLC_HCF=PHLC_HCF, &
@@ -434,16 +434,17 @@ IF (CMICRO=='ICE4') THEN
                  &  PRIS=PRS(:,:,:,4),PRSS= PRS(:,:,:,5),PRGS= PRS(:,:,:,6),&
                  &  PINPRC=ZINPRC,PINPRR=PINPRR,PEVAP3D=PEVAP,&
                  &  PINPRS=PINPRS, PINPRG=PINPRG, PINDEP=ZINDEP, PRAINFR=ZRAINFR, &
-                 &  PSIGS=PSIGS, PSEA=PSEA, PTOWN=PTOWN, PRHT=PRT(:,:,:,7),&
-                 &  PRHS=PRS(:,:,:,7), PINPRH=PINPRH, PFPR=PFPR, &
-                 &  TBUDGETS=YLBUDGET, KBUDGETS=SIZE(YLBUDGET))
+                 &  PSIGS=PSIGS, &
+                 &  TBUDGETS=YLBUDGET, KBUDGETS=SIZE(YLBUDGET), &
+                 &  PSEA=PSEA, PTOWN=PTOWN, &
+                 &  PRHT=PRT(:,:,:,7), PRHS=PRS(:,:,:,7), PINPRH=PINPRH, PFPR=PFPR)
 ELSEIF (CMICRO=='ICE3') THEN
     CALL RAIN_ICE(  IPROMA, KLON, 1, KLEV, ISIZE, &
                  &  OSEDIC=OSEDIC, OCND2=OCND2, HSEDIM=CSEDIM, &
                  &  HSUBG_AUCV_RC=CSUBG_AUCV_RC, HSUBG_AUCV_RI=CSUBG_AUCV_RI,&
                  &  OWARM=OWARM,KKA=KKA,KKU=KKU,KKL=KKL, &
                  &  PTSTEP=2*PTSTEP, &
-                 &  KRR=KRR, LDMICRO=LLMICRO, PEXN=PEXNREF,            &
+                 &  KRR=KRR, ODMICRO=LLMICRO, PEXN=PEXNREF,            &
                  &  PDZZ=PDZZ, PRHODJ=PRHODJ, PRHODREF=PRHODREF,PEXNREF=PEXNREF,&
                  &  PPABST=PPABSM, PCIT=PCIT, PCLDFR=PCLDFR,  &
                  &  PHLC_HRC=PHLC_HRC, PHLC_HCF=PHLC_HCF, &
@@ -457,8 +458,9 @@ ELSEIF (CMICRO=='ICE3') THEN
                  &  PRIS=PRS(:,:,:,4),PRSS= PRS(:,:,:,5),PRGS= PRS(:,:,:,6),&
                  &  PINPRC=ZINPRC,PINPRR=PINPRR,PEVAP3D=PEVAP,&
                  &  PINPRS=PINPRS, PINPRG=PINPRG, PINDEP=ZINDEP, PRAINFR=ZRAINFR, &
-                 &  PSIGS=PSIGS, PSEA=PSEA, PTOWN=PTOWN, PFPR=PFPR, &
-                 &  TBUDGETS=YLBUDGET, KBUDGETS=SIZE(YLBUDGET))
+                 &  PSIGS=PSIGS, &
+                 &  TBUDGETS=YLBUDGET, KBUDGETS=SIZE(YLBUDGET), &
+                 &  PSEA=PSEA, PTOWN=PTOWN, PFPR=PFPR)
 ELSEIF (CMICRO=='OLD4') THEN
     CALL RAIN_ICE_OLD( OSEDIC=OSEDIC, OCND2=OCND2, LGRSN=LGRSN, HSEDIM=CSEDIM, HSUBG_AUCV_RC=CSUBG_AUCV_RC,&
                  &  OWARM=OWARM,KKA=KKA,KKU=KKU,KKL=KKL,KSPLITR=KSPLITR, &
diff --git a/src/common/micro/condensation.F90 b/src/common/micro/condensation.F90
index 58452bd757bc089d0dd69c49a7dbb57131c5ec80..c1e03b3b9691e5f6c2e2a5a40c6acfc241591871 100644
--- a/src/common/micro/condensation.F90
+++ b/src/common/micro/condensation.F90
@@ -249,8 +249,9 @@ ELSE
     DO JJ=KJB,KJE
       DO JI=KIB,KIE
         ZCPD(JI,JJ,JK) = XCPD + XCPV*PRV_IN(JI,JJ,JK) + XCL*PRC_IN(JI,JJ,JK) + XCI*PRI_IN(JI,JJ,JK) + &
-#ifndef REPRO48
-                                XCL*PRR(JI,JJ,JK) +
+#if defined(REPRO48) || defined(REPRO55)
+#else
+                                XCL*PRR(JI,JJ,JK) + &
 #endif
                                 XCI*(PRS(JI,JJ,JK) + PRG(JI,JJ,JK) )
       ENDDO
@@ -316,8 +317,8 @@ DO JK=IKTB,IKTE
        ZDZ(KIB:KIE) = PZZ(KIB:KIE,JJ,JKP) - PZZ(KIB:KIE,JJ,JKP-KKL)
        CALL ICECLOUD(KIE-KIB+1,PPABS(KIB,JJ,JK),PZZ(KIB,JJ,JK),ZDZ(KIB), &
             & PT(KIB,JJ,JK),PRV_IN(KIB,JJ,JK),1.,-1., &
-            & ZCLDUM,1.,TCLD(KIB,JJ,JK), &
-            & ZARDUM,ZARDUM,ZARDUM,ZARDUM)
+            & ZCLDUM(KIB:KIE),1.,TCLD(KIB,JJ,JK), &
+            & ZARDUM(KIB:KIE),ZARDUM(KIB:KIE),ZARDUM(KIB:KIE),ZARDUM(KIB:KIE))
        ! latent heats
        ! saturated water vapor mixing ratio over liquid water and ice
        DO JI=KIB,KIE
@@ -341,7 +342,7 @@ DO JK=IKTB,IKTE
           ZFRAC(JI) = PRI_IN(JI,JJ,JK) / (PRC_IN(JI,JJ,JK)+PRI_IN(JI,JJ,JK))
         ENDIF
       END DO
-      CALL COMPUTE_FRAC_ICE(HFRAC_ICE, ZFRAC(:), PT(KIB:KIE,JJ,JK), IERR) !error code IERR cannot be checked here to not break vectorization
+      CALL COMPUTE_FRAC_ICE(HFRAC_ICE, ZFRAC(KIB:KIE), PT(KIB:KIE,JJ,JK), IERR(KIB:KIE)) !error code IERR cannot be checked here to not break vectorization
     ENDIF
     DO JI=KIB,KIE
       ZQSL(JI)   = XRD / XRV * ZPV(JI) / ( PPABS(JI,JJ,JK) - ZPV(JI) )
diff --git a/src/common/micro/modi_rain_ice.F90 b/src/common/micro/modi_rain_ice.F90
index d0f1cef0460e13d564d6ce5cc476494b82685fa5..6213ef09c334ad75ed1aebfd342736e48fa447f8 100644
--- a/src/common/micro/modi_rain_ice.F90
+++ b/src/common/micro/modi_rain_ice.F90
@@ -3,18 +3,19 @@
 !      ####################
 !
 INTERFACE
-      SUBROUTINE RAIN_ICE ( KPROMA, KIT, KJT, KKT, KSIZE,                                 &
-                            OSEDIC,OCND2, HSEDIM, HSUBG_AUCV_RC, HSUBG_AUCV_RI,   &
-                            OWARM, KKA, KKU, KKL,   &
-                            PTSTEP, KRR, LDMICRO, PEXN,             &
+      SUBROUTINE RAIN_ICE ( KPROMA, KIT, KJT, KKT, KSIZE,                         &
+                            OSEDIC, OCND2, 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, PEVAP3D,                    &
-                            PINPRS, PINPRG, PINDEP, PRAINFR, PSIGS, PSEA, PTOWN,            &
-                            PRHT, PRHS, PINPRH, PFPR, &
-                            TBUDGETS, KBUDGETS)
+                            PINPRC, PINPRR, PEVAP3D,                              &
+                            PINPRS, PINPRG, PINDEP, PRAINFR, PSIGS,               &
+                            TBUDGETS, KBUDGETS,                                   &
+                            PSEA, PTOWN,                                          &
+                            PRHT, PRHS, PINPRH, PFPR                              )
 !
 USE MODD_BUDGET, ONLY : TBUDGETDATA
 USE MODD_PARAM_ICE,      ONLY: LDEPOSC
@@ -33,13 +34,12 @@ LOGICAL,                  INTENT(IN)    :: OWARM   ! .TRUE. allows raindrops to
                                                    !   form by warm processes
                                                    !      (Kessler scheme)
 !
-INTEGER,                  INTENT(IN)    :: KKA   !near ground array index  
+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
-REAL,                     INTENT(IN)    :: PTSTEP  ! Double Time step
-                                                   ! (single if cold start)
+REAL,                     INTENT(IN)    :: PTSTEP  ! Double Time step (single if cold start)
 INTEGER,                  INTENT(IN)    :: KRR     ! Number of moist variable
-LOGICAL, DIMENSION(KIT,KJT,KKT), INTENT(IN)   :: LDMICRO ! mask to limit computation
+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)
@@ -63,8 +63,6 @@ REAL, DIMENSION(KIT,KJT,KKT),   INTENT(IN)    :: PRIT    ! Pristine ice m.r. at
 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(IN)    :: PSIGS   ! Sigma_s 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
@@ -72,7 +70,6 @@ REAL, DIMENSION(KIT,KJT,KKT),   INTENT(INOUT) :: PRRS    ! Rain water m.r. sourc
 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
@@ -81,6 +78,9 @@ REAL, DIMENSION(KIT,KJT), INTENT(OUT)       :: PINPRS! Snow instant precip
 REAL, DIMENSION(KIT,KJT), INTENT(OUT)       :: PINPRG! Graupel instant precip
 REAL, DIMENSION(MERGE(KIT, 0, LDEPOSC), MERGE(KJT, 0, LDEPOSC)),     INTENT(OUT)       :: PINDEP  ! Cloud instant deposition
 REAL, DIMENSION(KIT,KJT,KKT),   INTENT(OUT) :: PRAINFR !Precipitation fraction
+REAL, DIMENSION(KIT,KJT,KKT),   INTENT(IN)    :: PSIGS   ! Sigma_s at t
+TYPE(TBUDGETDATA), DIMENSION(KBUDGETS), INTENT(INOUT) :: TBUDGETS
+INTEGER, INTENT(IN) :: KBUDGETS
 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
@@ -88,8 +88,7 @@ REAL, DIMENSION(KIT,KJT,KKT), OPTIONAL,  INTENT(INOUT) :: PRHS    ! Hail m.r. so
 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
 !
-TYPE(TBUDGETDATA), DIMENSION(KBUDGETS), INTENT(INOUT) :: TBUDGETS
-INTEGER, INTENT(IN) :: KBUDGETS
+
 !
 END SUBROUTINE RAIN_ICE
 END INTERFACE
diff --git a/src/common/micro/rain_ice.F90 b/src/common/micro/rain_ice.F90
index b38392aaf02b9d7f02d8831fe0f694c98349d466..905eb1b0ee15d140653b92efad9d88bae00d3290 100644
--- a/src/common/micro/rain_ice.F90
+++ b/src/common/micro/rain_ice.F90
@@ -13,9 +13,10 @@
                             PTHT, PRVT, PRCT, PRRT, PRIT, PRST,                   &
                             PRGT, PTHS, PRVS, PRCS, PRRS, PRIS, PRSS, PRGS,       &
                             PINPRC, PINPRR, PEVAP3D,                              &
-                            PINPRS, PINPRG, PINDEP, PRAINFR, PSIGS, PSEA, PTOWN,  &
-                            PRHT, PRHS, PINPRH, PFPR,                             &
-                            TBUDGETS, KBUDGETS)
+                            PINPRS, PINPRG, PINDEP, PRAINFR, PSIGS,               &
+                            TBUDGETS, KBUDGETS,                                   &
+                            PSEA, PTOWN,                                          &
+                            PRHT, PRHS, PINPRH, PFPR                              )
 !     ######################################################################
 !
 !!****  * -  compute the explicit microphysical sources
@@ -224,6 +225,7 @@ CHARACTER(LEN=80),        INTENT(IN)    :: HSUBG_AUCV_RI ! Kind of Subgrid autoc
 LOGICAL,                  INTENT(IN)    :: OWARM   ! .TRUE. allows raindrops to
                                                    !   form by warm processes
                                                    !      (Kessler scheme)
+!
 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
@@ -239,11 +241,12 @@ REAL, DIMENSION(KIT,KJT,KKT),   INTENT(IN)    :: PEXNREF ! Reference Exner funct
 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)    :: 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
@@ -268,6 +271,8 @@ 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 !Precipitation fraction
 REAL, DIMENSION(KIT,KJT,KKT),   INTENT(IN)    :: PSIGS   ! Sigma_s at t
+TYPE(TBUDGETDATA), DIMENSION(KBUDGETS), INTENT(INOUT) :: TBUDGETS
+INTEGER, INTENT(IN) :: KBUDGETS
 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
@@ -275,8 +280,6 @@ REAL, DIMENSION(KIT,KJT,KKT), OPTIONAL,  INTENT(INOUT) :: PRHS    ! Hail m.r. so
 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
 !
-TYPE(TBUDGETDATA), DIMENSION(KBUDGETS), INTENT(INOUT) :: TBUDGETS
-INTEGER, INTENT(IN) :: KBUDGETS
 !
 !*       0.2   Declarations of local variables :
 !
diff --git a/src/mesonh/ext/resolved_cloud.f90 b/src/mesonh/ext/resolved_cloud.f90
index fe77e35d3e53e33e750edcf23eaa01e24e32ea5d..a425fe89cb0e566ad8701834891c16b9a16cea3e 100644
--- a/src/mesonh/ext/resolved_cloud.f90
+++ b/src/mesonh/ext/resolved_cloud.f90
@@ -318,7 +318,7 @@ USE MODI_LIMA_MIXED
 USE MODI_LIMA_NOTADJUST
 USE MODI_LIMA_WARM
 USE MODI_RAIN_C2R2_KHKO
-USE MODI_RAIN_ICE_RED
+USE MODI_RAIN_ICE
 USE MODI_SHUMAN
 USE MODI_SLOW_TERMS
 !
@@ -770,7 +770,7 @@ SELECT CASE ( HCLOUD )
                    PRS(:,:,:,4)>ZRSMIN(4) .OR. &
                    PRS(:,:,:,5)>ZRSMIN(5) .OR. &
                    PRS(:,:,:,6)>ZRSMIN(6)
-      CALL RAIN_ICE_RED (COUNT(LLMICRO), SIZE(PTHT, 1), SIZE(PTHT, 2), &
+      CALL RAIN_ICE (COUNT(LLMICRO), SIZE(PTHT, 1), SIZE(PTHT, 2), &
                     SIZE(PTHT, 3), COUNT(LLMICRO), &
                     OSEDIC, .FALSE.,CSEDIM, HSUBG_AUCV, CSUBG_AUCV_RI,&
                     OWARM,1,IKU,1,                                       &
@@ -787,22 +787,7 @@ SELECT CASE ( HCLOUD )
                     TBUDGETS,SIZE(TBUDGETS),           &
                     PSEA,PTOWN, PFPR=ZFPR                                )
     ELSE 
-          CALL RAIN_ICE_RED (COUNT(LLMICRO), SIZE(PTHT, 1), SIZE(PTHT, 2), &
-                    SIZE(PTHT, 3), COUNT(LLMICRO), &
-                    OSEDIC, .FALSE.,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,  PEVAP3D,                    &
-                    PINPRS, PINPRG, PINDEP, PRAINFR, PSIGS,              &
-                    TBUDGETS,SIZE(TBUDGETS),           &
-                    PSEA,PTOWN, PFPR=ZFPR                                )
+          !CALL RAIN_ICE_OLD
     END IF
 !
 !*       9.2    Perform the saturation adjustment over cloud ice and cloud water
@@ -875,7 +860,7 @@ SELECT CASE ( HCLOUD )
                    PRS(:,:,:,5)>ZRSMIN(5) .OR. &
                    PRS(:,:,:,6)>ZRSMIN(6) .OR. &
                    PRS(:,:,:,7)>ZRSMIN(7)
-     CALL RAIN_ICE_RED (COUNT(LLMICRO), SIZE(PTHT, 1), SIZE(PTHT, 2), SIZE(PTHT, 3),&
+     CALL RAIN_ICE (COUNT(LLMICRO), SIZE(PTHT, 1), SIZE(PTHT, 2), SIZE(PTHT, 3),&
                     COUNT(LLMICRO), OSEDIC, .FALSE., CSEDIM, HSUBG_AUCV, CSUBG_AUCV_RI,&
                     OWARM, 1, IKU, 1,             &
                     PTSTEP, KRR, LLMICRO, ZEXN,             &
@@ -893,22 +878,7 @@ SELECT CASE ( HCLOUD )
                     PRT(:,:,:,7), PRS(:,:,:,7), PINPRH, PFPR=ZFPR         )
  
     ELSE
-     CALL RAIN_ICE_RED (COUNT(LLMICRO), SIZE(PTHT, 1), SIZE(PTHT, 2), SIZE(PTHT, 3),&
-                    COUNT(LLMICRO), OSEDIC, .FALSE., 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, PEVAP3D,                    &
-                    PINPRS, PINPRG, PINDEP, PRAINFR, PSIGS,               &
-                    TBUDGETS,SIZE(TBUDGETS),                     &            
-                    PSEA, PTOWN,                                          &
-                    PRT(:,:,:,7), PRS(:,:,:,7), PINPRH, PFPR=ZFPR         )
+     !CALL RAIN_ICE_OLD
     END IF
 
 
diff --git a/src/mesonh/micro/ice_adjust_elec.f90 b/src/mesonh/micro/ice_adjust_elec.f90
index a52ffd2b375acda4dd911a74577409144202de0c..19ac78f72bec3358142b66047634bbf5a363e7e3 100644
--- a/src/mesonh/micro/ice_adjust_elec.f90
+++ b/src/mesonh/micro/ice_adjust_elec.f90
@@ -379,7 +379,7 @@ DO JITER = 1, ITERMAX
 !
     CALL CONDENSATION( IIU, IJU, IKU, IIB, IIE, IJB, IJE, IKB, IKE,1, 'T', 'CB02', 'CB',   &
        PPABST, PZZ, ZW4, ZT, ZW3_IN, ZW3, ZW1_IN, ZW1, ZW2_IN, ZW2, &
-       PRSS*PTSTEP, PRGS*PTSTEP, &
+       PRRS*PTSTEP, PRSS*PTSTEP, PRGS*PTSTEP, &
        PSIGS, PMFCONV, PCLDFR, PSRCS, .TRUE., &
        OSIGMAS, .FALSE., ZSIGQSAT2D, PLV=ZLV, PLS=ZLS, PCPH=ZCPH )
 !
diff --git a/src/mesonh/micro/lima_adjust_split.f90 b/src/mesonh/micro/lima_adjust_split.f90
index ab87f141f0ee8d1dc4cb3bae80bf3d81b4259f8c..15f6ad619a01ec2d9ad31ff531498c95ccd79b85 100644
--- a/src/mesonh/micro/lima_adjust_split.f90
+++ b/src/mesonh/micro/lima_adjust_split.f90
@@ -512,7 +512,7 @@ DO JITER =1,ITERMAX
       CALL CONDENSATION(IIU, IJU, IKU, IIB, IIE, IJB, IJE, IKB, IKE, 1, 'S',   &
            HCONDENS, HLAMBDA3, &
            PPABST, PZZ, PRHODREF, ZT, ZRV_IN, ZRV, ZRC_IN, ZRC, ZRI_IN, ZRI,&
-           PRSS*PTSTEP, PRGS*PTSTEP, &
+           PRRS*PTSTEP, PRSS*PTSTEP, PRGS*PTSTEP, &
            ZSIGS, PMFCONV, PCLDFR, PSRCS, .FALSE., OSIGMAS, .FALSE., &
            ZSIGQSAT2D, PLV=ZLV, PLS=ZLS, PCPH=ZCPH )
       PCLDFR(:,:,:) = MIN(PCLDFR(:,:,:) + PCF_MF(:,:,:) , 1.)
diff --git a/src/mesonh/micro/radtr_satel.f90 b/src/mesonh/micro/radtr_satel.f90
index ccad5e716ca659cfd4a058ce37ea5b38b06ad531..dbc0cd4e60f55a2a6d2b5483b15a615183d51dc3 100644
--- a/src/mesonh/micro/radtr_satel.f90
+++ b/src/mesonh/micro/radtr_satel.f90
@@ -485,7 +485,8 @@ IF( SIZE(PRT(:,:,:,:),4) >= 2 ) THEN
     ZRHO=1. !unused
     ZSIGQSAT2D(:,:)=PSIGQSAT
     CALL CONDENSATION( IIU, IJU, IKU, IIB, IIE, IJB, IJE, IKB, IKE, 1, 'T', 'CB02', 'CB',&
-         PPABST, PZZ, ZRHO, ZTEMP, ZRV_IN, ZRV_OUT, ZRC_IN, ZRC_OUT, ZRI_IN, ZRI_OUT, PRT(:,:,:,5), PRT(:,:,:,6), PSIGS,&
+         PPABST, PZZ, ZRHO, ZTEMP, ZRV_IN, ZRV_OUT, ZRC_IN, ZRC_OUT, ZRI_IN, ZRI_OUT, &
+         PRT(:,:,:,2), PRT(:,:,:,5), PRT(:,:,:,6), PSIGS,&
          PMFCONV, ZNCLD, ZSIGRC, OUSERI, OSIGMAS, .FALSE., PSIGQSAT=ZSIGQSAT2D )
     DEALLOCATE(ZTEMP,ZSIGRC)
     DEALLOCATE(ZRV_OUT)
diff --git a/src/mesonh/micro/rain_ice.f90 b/src/mesonh/micro/rain_ice.f90
index e6b139e055f168a59da23f171e952bd9afff6004..d0a1e8a0e02367840507c13213581f48d3cd0fb6 100644
--- a/src/mesonh/micro/rain_ice.f90
+++ b/src/mesonh/micro/rain_ice.f90
@@ -1,94 +1,30 @@
+
+!Note de phasage pour Méso-NH: dans resolved_cloud, il faut:
+! - récuperer le tbudgets de modd_budget pour le passer ici, kbudgets vaut size(tbudgets)
+! - passer OCND2=.FALSE.
+! - passer à KPROMA la même valeur que KSIZE (bug sinon)
+! - créer des tableaux temporaires pour PSIGS, PINDEP, PINPRC pour gérer les options
+
+
 !MNH_LIC Copyright 1995-2021 CNRS, Meteo-France and Universite Paul Sabatier
 !MNH_LIC This is part of the Meso-NH software governed by the CeCILL-C licence
 !MNH_LIC version 1. See LICENSE, CeCILL-C_V1-en.txt and CeCILL-C_V1-fr.txt
 !MNH_LIC for details. version 1.
 !-----------------------------------------------------------------
 !     ######spl
-       MODULE MODI_RAIN_ICE
-!      ####################
-!
-INTERFACE
-      SUBROUTINE RAIN_ICE ( OSEDIC,HSEDIM, HSUBG_AUCV, OWARM, KKA, KKU, KKL,      &
-                            KSPLITR, PTSTEP, KRR,                            &
+      SUBROUTINE RAIN_ICE ( KPROMA, KIT, KJT, KKT, KSIZE,                         &
+                            OSEDIC, OCND2, HSEDIM, HSUBG_AUCV_RC, HSUBG_AUCV_RI,  &
+                            OWARM, KKA, KKU, KKL,                                 &
+                            PTSTEP, KRR, ODMICRO, PEXN,                           &
                             PDZZ, PRHODJ, PRHODREF, PEXNREF, PPABST, PCIT, PCLDFR,&
-                            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,  &
-                            PRHT, PRHS, PINPRH, PFPR                        )
-!
-!
-LOGICAL,                  INTENT(IN)    :: OSEDIC ! Switch for droplet sedim.
-CHARACTER(LEN=4),         INTENT(IN)    :: HSEDIM ! Sedimentation scheme
-CHARACTER(LEN=4),         INTENT(IN)    :: HSUBG_AUCV ! Switch for rc->rr Subgrid autoconversion
-                                        ! Kind of Subgrid autoconversion method
-LOGICAL,                  INTENT(IN)    :: OWARM   ! .TRUE. allows raindrops to
-                                                   !   form by warm processes
-                                                   !      (Kessler scheme)
-!
-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)    :: KSPLITR ! Number of small time step 
-                                      ! integration for  rain sedimendation
-REAL,                     INTENT(IN)    :: PTSTEP  ! Double Time step
-                                                   ! (single if cold start)
-INTEGER,                  INTENT(IN)    :: KRR     ! Number of moist variable
-!
-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(INOUT) :: PINPRC! Cloud instant precip
-REAL, DIMENSION(:,:),     INTENT(INOUT) :: PINDEP  ! Cloud instant deposition
-REAL, DIMENSION(:,:),     INTENT(INOUT) :: PINPRR! Rain instant precip
-REAL, DIMENSION(:,:,:),   INTENT(OUT)   :: PINPRR3D! Rain inst precip 3D
-REAL, DIMENSION(:,:,:),   INTENT(INOUT) :: PEVAP3D! Rain evap profile
-REAL, DIMENSION(:,:),     INTENT(INOUT) :: PINPRS! Snow instant precip
-REAL, DIMENSION(:,:),     INTENT(INOUT) :: 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(INOUT) :: PINPRH! Hail instant precip
-REAL, DIMENSION(:,:,:,:), OPTIONAL, INTENT(OUT)   :: PFPR ! upper-air precipitation fluxes
-!
-END SUBROUTINE RAIN_ICE
-END INTERFACE
-END MODULE MODI_RAIN_ICE
-!     ######spl
-      SUBROUTINE RAIN_ICE ( OSEDIC,HSEDIM, HSUBG_AUCV, OWARM, KKA, KKU, KKL,      &
-                            KSPLITR, PTSTEP, KRR,                            &
-                            PDZZ, PRHODJ, PRHODREF, PEXNREF, PPABST, PCIT, PCLDFR,&
-                            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,  &
-                            PRHT, PRHS, PINPRH, PFPR                        )
+                            PHLC_HRC, PHLC_HCF, PHLI_HRI, PHLI_HCF,               &
+                            PTHT, PRVT, PRCT, PRRT, PRIT, PRST,                   &
+                            PRGT, PTHS, PRVS, PRCS, PRRS, PRIS, PRSS, PRGS,       &
+                            PINPRC, PINPRR, PEVAP3D,                              &
+                            PINPRS, PINPRG, PINDEP, PRAINFR, PSIGS,               &
+                            TBUDGETS, KBUDGETS,                                   &
+                            PSEA, PTOWN,                                          &
+                            PRHT, PRHS, PINPRH, PFPR                              )
 !     ######################################################################
 !
 !!****  * -  compute the explicit microphysical sources
@@ -135,6 +71,33 @@ END MODULE MODI_RAIN_ICE
 !!                               function over liquid water
 !!          XALPI,XBETAI,XGAMI ! Constants for saturation vapor pressure
 !!                               function over solid ice
+!!      Module MODD_BUDGET:
+!!         NBUMOD       : model in which budget is calculated
+!!         CBUTYPE      : type of desired budget
+!!                          'CART' for cartesian box configuration
+!!                          'MASK' for budget zone defined by a mask
+!!                          'NONE'  ' for no budget
+!!         LBU_RTH      : logical for budget of RTH (potential temperature)
+!!                        .TRUE. = budget of RTH
+!!                        .FALSE. = no budget of RTH
+!!         LBU_RRV      : logical for budget of RRV (water vapor)
+!!                        .TRUE. = budget of RRV
+!!                        .FALSE. = no budget of RRV
+!!         LBU_RRC      : logical for budget of RRC (cloud water)
+!!                        .TRUE. = budget of RRC
+!!                        .FALSE. = no budget of RRC
+!!         LBU_RRI      : logical for budget of RRI (cloud ice)
+!!                        .TRUE. = budget of RRI
+!!                        .FALSE. = no budget of RRI
+!!         LBU_RRR      : logical for budget of RRR (rain water)
+!!                        .TRUE. = budget of RRR
+!!                        .FALSE. = no budget of RRR
+!!         LBU_RRS      : logical for budget of RRS (aggregates)
+!!                        .TRUE. = budget of RRS
+!!                        .FALSE. = no budget of RRS
+!!         LBU_RRG      : logical for budget of RRG (graupeln)
+!!                        .TRUE. = budget of RRG
+!!                        .FALSE. = no budget of RRG
 !!
 !!    REFERENCE
 !!    ---------
@@ -208,709 +171,1366 @@ END MODULE MODI_RAIN_ICE
 !!      C.Lac : 01/2017 : correction on droplet deposition
 !!      J.Escobar : 10/2017 : for real*4 , limit exp() in RAIN_ICE_SLOW with XMNH_HUGE_12_LOG
 !!      (C. Abiven, Y. Léauté, V. Seigner, S. Riette) Phasing of Turner rain subgrid param
-!!      J.Escobar : 8/2018 : for real*4 , bis => limit exp() in RAIN_ICE_SLOW with XMNH_HUGE_12_LOG
-!!      P.Wautelet 01/02/2019: add missing initialization for PFPR
-!!                   02/2019 C.Lac add rain fraction as an output field
-!  P. Wautelet 25/02/2019: split rain_ice (cleaner and easier to maintain/debug)
+!!      (S. Riette) Source code split into several files
+!!                  02/2019 C.Lac add rain fraction as an output field
 !  P. Wautelet 10/04/2019: replace ABORT and STOP calls by Print_msg
 !  P. Wautelet 28/05/2019: move COUNTJV function to tools.f90
 !  P. Wautelet 29/05/2019: remove PACK/UNPACK intrinsics (to get more performance and better OpenACC support)
-!  J. Escobar  09/07/2019: for reproductiblity MPPDB_CHECK, add missing LCHECK test in ZRHODJ de/allocate
-!  P. Wautelet    02/2020: use the new data structures and subroutines for budgets (no more budget calls in this subroutine)
+!  P. Wautelet 17/01/2020: move Quicksort to tools.f90
+!  P. Wautelet    02/2020: use the new data structures and subroutines for budgets
+!  P. Wautelet 25/02/2020: bugfix: add missing budget: WETH_BU_RRG
+!!     R. El Khatib 24-Aug-2021 Optimizations
 !-----------------------------------------------------------------
 !
 !*       0.    DECLARATIONS
 !              ------------
 !
-use modd_budget,         only: lbu_enable
-use MODD_CONF,           only: LCHECK
-use MODD_CST,            only: XCI, XCL, XCPD, XCPV, XLSTT, XLVTT, XTT, &
-                               XALPI, XBETAI, XGAMI, XMD, XMV, XTT
-use MODD_LES,            only: LLES_CALL
-use MODD_PARAMETERS,     only: JPVEXT
-use MODD_PARAM_ICE,      only: CSUBG_PR_PDF, LDEPOSC
-use MODD_RAIN_ICE_DESCR, only: XLBEXR, XLBR, XRTMIN
-use MODD_RAIN_ICE_PARAM, only: XCRIAUTC
-
-use MODE_MSG
-use MODE_RAIN_ICE_FAST_RG,             only: RAIN_ICE_FAST_RG
-use MODE_RAIN_ICE_FAST_RH,             only: RAIN_ICE_FAST_RH
-use MODE_RAIN_ICE_FAST_RI,             only: RAIN_ICE_FAST_RI
-use MODE_RAIN_ICE_FAST_RS,             only: RAIN_ICE_FAST_RS
-use MODE_RAIN_ICE_NUCLEATION,          only: RAIN_ICE_NUCLEATION
-use MODE_RAIN_ICE_SEDIMENTATION_SPLIT, only: RAIN_ICE_SEDIMENTATION_SPLIT
-use MODE_RAIN_ICE_SEDIMENTATION_STAT,  only: RAIN_ICE_SEDIMENTATION_STAT
-use MODE_RAIN_ICE_SLOW,                only: RAIN_ICE_SLOW
-use MODE_RAIN_ICE_WARM,                only: RAIN_ICE_WARM
-use mode_tools,                        only: Countjv
-use mode_tools_ll,                     only: GET_INDICE_ll
-
-USE MODE_ICE4_RAINFR_VERT
+USE PARKIND1, ONLY : JPRB
+USE YOMHOOK , ONLY : LHOOK, DR_HOOK
+
+USE MODD_BUDGET,         ONLY: TBUDGETDATA, 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
+USE MODD_CST,            ONLY: XCI, XCL, XCPD, XCPV, XLSTT, XLVTT, XTT, XRHOLW
+USE MODD_PARAMETERS,     ONLY: JPVEXT
+USE MODD_PARAM_ICE,      ONLY: CSUBG_PR_PDF, CSUBG_RC_RR_ACCR, CSUBG_RR_EVAP, LDEPOSC, LFEEDBACKT, LSEDIM_AFTER, &
+                             & NMAXITER, XMRSTEP, XTSTEP_TS, XVDEPOSC
+USE MODD_RAIN_ICE_DESCR, ONLY: XRTMIN
+USE MODD_FIELDS_ADDRESS, ONLY : & ! common fields adress
+      & ITH,     & ! Potential temperature
+      & IRV,     & ! Water vapor
+      & IRC,     & ! Cloud water
+      & IRR,     & ! Rain water
+      & IRI,     & ! Pristine ice
+      & IRS,     & ! Snow/aggregate
+      & IRG,     & ! Graupel
+      & IRH        ! Hail
 
+USE MODE_BUDGET,         ONLY: BUDGET_STORE_ADD, BUDGET_STORE_INIT, BUDGET_STORE_END
+USE MODE_ll
+USE MODE_MSG,            ONLY: PRINT_MSG, NVERB_FATAL
+
+USE MODE_ICE4_RAINFR_VERT, ONLY: ICE4_RAINFR_VERT
+USE MODE_ICE4_SEDIMENTATION_STAT, ONLY: ICE4_SEDIMENTATION_STAT
+USE MODE_ICE4_SEDIMENTATION_SPLIT, ONLY: ICE4_SEDIMENTATION_SPLIT
+USE MODE_ICE4_SEDIMENTATION_SPLIT_MOMENTUM, ONLY: ICE4_SEDIMENTATION_SPLIT_MOMENTUM
+USE MODE_ICE4_TENDENCIES, ONLY: ICE4_TENDENCIES
+!
 IMPLICIT NONE
 !
 !*       0.1   Declarations of dummy arguments :
 !
 !
 !
+INTEGER,                  INTENT(IN)    :: KPROMA ! cache-blocking factor for microphysic loop
+INTEGER,                  INTENT(IN)    :: KIT, KJT, KKT ! arrays size
+INTEGER,                  INTENT(IN)    :: KSIZE
 LOGICAL,                  INTENT(IN)    :: OSEDIC ! Switch for droplet sedim.
+LOGICAL                                 :: OCND2  ! Logical switch to separate liquid and ice
 CHARACTER(LEN=4),         INTENT(IN)    :: HSEDIM ! Sedimentation scheme
-CHARACTER(LEN=4),         INTENT(IN)    :: HSUBG_AUCV ! Switch for rc->rr Subgrid autoconversion
-                                        ! 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
 LOGICAL,                  INTENT(IN)    :: OWARM   ! .TRUE. allows raindrops to
                                                    !   form by warm processes
                                                    !      (Kessler scheme)
-!
 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)    :: KSPLITR ! Number of small time step
-                                      ! integration for  rain sedimendation
-REAL,                     INTENT(IN)    :: PTSTEP  ! Double Time step
-                                                   ! (single if cold start)
+REAL,                     INTENT(IN)    :: PTSTEP  ! Double Time step (single if cold start)
 INTEGER,                  INTENT(IN)    :: KRR     ! Number of moist variable
-!
-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(INOUT) :: PINPRC! Cloud instant precip
-REAL, DIMENSION(:,:),     INTENT(INOUT) :: PINDEP  ! Cloud instant deposition
-REAL, DIMENSION(:,:),     INTENT(INOUT) :: PINPRR! Rain instant precip
-REAL, DIMENSION(:,:,:),   INTENT(OUT)   :: PINPRR3D! Rain inst precip 3D
-REAL, DIMENSION(:,:,:),   INTENT(INOUT) :: PEVAP3D! Rain evap profile
-REAL, DIMENSION(:,:),     INTENT(INOUT) :: PINPRS! Snow instant precip
-REAL, DIMENSION(:,:),     INTENT(INOUT) :: 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(INOUT) :: 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)     :: 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 !Precipitation fraction
+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
+!
+TYPE(TBUDGETDATA), DIMENSION(KBUDGETS), INTENT(INOUT) :: TBUDGETS
+INTEGER, INTENT(IN) :: KBUDGETS
 !
 !*       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                           :: IKE,IKTE      !
-!
-INTEGER                           :: IMICRO
-INTEGER, DIMENSION(SIZE(PEXNREF)) :: I1,I2,I3 ! Used to replace the COUNT
-INTEGER                           :: JL       ! and PACK intrinsics
-LOGICAL, DIMENSION(SIZE(PEXNREF,1),SIZE(PEXNREF,2),SIZE(PEXNREF,3)) &
-                                  :: GMICRO ! Test where to compute all processes
-REAL                              :: ZINVTSTEP
-REAL                              :: ZCOEFFRCM
-REAL, DIMENSION(:), ALLOCATABLE   :: ZRVT    ! Water vapor m.r. at t
-REAL, DIMENSION(:), ALLOCATABLE   :: ZRCT    ! Cloud water m.r. at t
-REAL, DIMENSION(:), ALLOCATABLE   :: ZRRT    ! Rain water m.r. at t
-REAL, DIMENSION(:), ALLOCATABLE   :: ZRIT    ! Pristine ice m.r. at t
-REAL, DIMENSION(:), ALLOCATABLE   :: ZRST    ! Snow/aggregate m.r. at t
-REAL, DIMENSION(:), ALLOCATABLE   :: ZRGT    ! Graupel m.r. at t
-REAL, DIMENSION(:), ALLOCATABLE   :: ZRHT    ! Hail m.r. at t
-REAL, DIMENSION(:), ALLOCATABLE   :: ZCIT    ! Pristine ice conc. at t
-!
-REAL, DIMENSION(:), ALLOCATABLE   :: ZRVS    ! Water vapor m.r. source
-REAL, DIMENSION(:), ALLOCATABLE   :: ZRCS    ! Cloud water m.r. source
-REAL, DIMENSION(:), ALLOCATABLE   :: ZRRS    ! Rain water m.r. source
-REAL, DIMENSION(:), ALLOCATABLE   :: ZRIS    ! Pristine ice m.r. source
-REAL, DIMENSION(:), ALLOCATABLE   :: ZRSS    ! Snow/aggregate m.r. source
-REAL, DIMENSION(:), ALLOCATABLE   :: ZRGS    ! Graupel m.r. source
-REAL, DIMENSION(:), ALLOCATABLE   :: ZRHS    ! Hail m.r. source
-REAL, DIMENSION(:), ALLOCATABLE   :: ZTHS    ! Theta source
-REAL, DIMENSION(:), ALLOCATABLE   :: ZTHT    ! Potential temperature
-REAL, DIMENSION(:), ALLOCATABLE   :: ZTHLT   ! Liquid potential temperature
-!
-REAL, DIMENSION(:), ALLOCATABLE   :: ZRHODREF, &      ! RHO Dry REFerence
-                                     ZRHODJ,   &      ! RHO times Jacobian
-                                     ZZT,      &      ! Temperature
-                                     ZPRES,    &      ! Pressure
-                                     ZEXNREF,  &      ! EXNer Pressure REFerence
-                                     ZZW,      &      ! Work array
-                                     ZLSFACT,  &      ! L_s/(Pi_ref*C_ph)
-                                     ZLVFACT,  &      ! L_v/(Pi_ref*C_ph)
-                                     ZUSW,     &      ! Undersaturation over water
-                                     ZSSI,     &      ! Supersaturation over ice
-                                     ZLBDAR,   &      ! Slope parameter of the raindrop  distribution
-                                     ZLBDAR_RF,&      ! Slope parameter of the raindrop  distribution
-                                                      ! for the Rain Fraction part
-                                     ZLBDAS,   &      ! Slope parameter of the aggregate distribution
-                                     ZLBDAG,   &      ! Slope parameter of the graupel   distribution
-                                     ZLBDAH,   &      ! Slope parameter of the hail      distribution
-                                     ZRDRYG,   &      ! Dry growth rate of the graupeln
-                                     ZRWETG,   &      ! Wet growth rate of the graupeln
-                                     ZAI,      &      ! Thermodynamical function
-                                     ZCJ,      &      ! Function to compute the ventilation coefficient
-                                     ZKA,      &      ! Thermal conductivity of the air
-                                     ZDV,      &      ! Diffusivity of water vapor in the air
-                                     ZSIGMA_RC,&      ! Standard deviation of rc at time t
-                                     ZCF,      &      ! Cloud fraction
-                                     ZRF,      &      ! Rain 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
-                                     ZHLC_RCMAX, &    ! HLCLOUDS : maximum value for RC in distribution
-                                     ZRCRAUTC, &      ! RC value to begin rain formation =XCRIAUTC/RHODREF
-                                     ZHLC_HRCLOCAL, & ! HLCLOUDS : LWC that is High LWC local in HCF
-                                     ZHLC_LRCLOCAL    ! HLCLOUDS : LWC that is Low  LWC local in LCF
-                                                      !    note that ZRC/CF = ZHLC_HRCLOCAL+ ZHLC_LRCLOCAL
-                                                      !                     = ZHLC_HRC/HCF+ ZHLC_LRC/LCF
-REAL, DIMENSION(:,:), ALLOCATABLE :: ZZW1 ! Work arrays
-REAL, DIMENSION(SIZE(PEXNREF,1),SIZE(PEXNREF,2),SIZE(PEXNREF,3))   &
-                                  :: ZW ! work array
-REAL, DIMENSION(SIZE(PEXNREF,1),SIZE(PEXNREF,2),SIZE(PEXNREF,3))   &
-                                  :: ZT ! Temperature
+REAL(KIND=JPRB) :: ZHOOK_HANDLE
+INTEGER :: IIU
+INTEGER :: IJU
+INTEGER :: IIB           !  Define the domain where is
+INTEGER :: IIE           !  the microphysical sources have to be computed
+INTEGER :: IJB           !
+INTEGER :: IJE           !
+INTEGER :: IKB, IKTB     !
+INTEGER :: IKE, IKTE     !
+!
+INTEGER :: JI, JJ, JK
+INTEGER :: ISTI, ISTJ, ISTK
+!
+!Arrays for nucleation call outisde of ODMICRO 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(MERGE(KIT, 0, LBU_ENABLE), &
+               &MERGE(KJT, 0, LBU_ENABLE), &
+               &MERGE(KKT, 0, LBU_ENABLE)) :: ZW1, ZW2, ZW3, ZW4, ZW5, ZW6 !Work arrays
+REAL, DIMENSION(KIT, KJT, KKT) :: ZZ_LVFACT, ZZ_LSFACT, ZZ_DIFF
+!
+REAL, DIMENSION(KIT,KJT,KKT) :: ZRCT    ! Cloud water m.r. source at t
+REAL, DIMENSION(KIT,KJT,KKT) :: ZRRT    ! Rain water m.r. source at t
+REAL, DIMENSION(KIT,KJT,KKT) :: ZRIT    ! Pristine ice m.r. source at t
+REAL, DIMENSION(KIT,KJT,KKT) :: ZRST    ! Snow/aggregate m.r. source at t
+REAL, DIMENSION(KIT,KJT,KKT) :: ZRGT    ! Graupel m.r. source at t
+REAL, DIMENSION(KIT,KJT,KKT) :: ZRHT    ! Hail m.r. source at t
+REAL, DIMENSION(KIT,KJT,KKT) :: ZCITOUT ! Output value for CIT
+
+!Diagnostics
+REAL, DIMENSION(SIZE(PTHT,1),SIZE(PTHT,2)) :: ZINPRI ! Pristine ice instant precip
+!
+LOGICAL :: GEXT_TEND
+LOGICAL :: LSOFT ! Must we really compute tendencies or only adjust them to new T variables
+INTEGER :: INB_ITER_MAX ! Maximum number of iterations (with real tendencies computation)
+REAL :: ZW1D
+REAL :: ZTSTEP ! length of sub-timestep in case of time splitting
+REAL :: ZINV_TSTEP ! Inverse ov PTSTEP
+REAL :: ZTIME_THRESHOLD ! Time to reach threshold
+!For total tendencies computation
+REAL, DIMENSION(SIZE(PTHT,1),SIZE(PTHT,2),SIZE(PTHT,3),0:7) :: ZWR
+!
+!Output packed total mixing ratio change (for budgets only)
+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 packing
+INTEGER :: IMICRO ! Case r_x>0 locations
+INTEGER :: JL, JV
+REAL, DIMENSION(KPROMA) :: ZTIME ! Current integration time (starts with 0 and ends with PTSTEP)
+REAL, DIMENSION(KPROMA) :: &
+                        & ZMAXTIME, & ! Time on which we can apply the current tendencies
+                        & ZTIME_LASTCALL, &     ! Integration time when last tendecies call has been done
+                        & ZCOMPUTE, & ! 1. for points where we must compute tendencies, 0. elsewhere
+                        & ZSSI,     &
+                        & ZCIT,     & ! Pristine ice conc. at t
+                        & 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
+!
+!Output packed tendencies (for budgets only)
+REAL, DIMENSION(KPROMA) :: 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
+!
+!For mixing-ratio-splitting
+LOGICAL :: LLCPZ0RT
+REAL, DIMENSION(KPROMA, KRR) :: Z0RT ! Mixing-ratios at the beginig of the current loop
+!
+REAL, DIMENSION(KPROMA,0:7) :: &
+                        & ZVART, & !Packed variables
+                        & ZEXTPK, & !To take into acount external tendencies inside the splitting
+                        & ZA, ZB
+!
+REAL, DIMENSION(KPROMA, 8) :: ZRS_TEND, ZRG_TEND
+REAL, DIMENSION(KPROMA,10) :: ZRH_TEND
+
+INTEGER, DIMENSION(KPROMA) :: &
+                       & I1,I2,I3, & ! Used to replace the COUNT and PACK intrinsics on variables
+                       & IITER       ! Number of iterations done (with real tendencies computation)
+INTEGER, DIMENSION(KSIZE) :: I1TOT, I2TOT, I3TOT ! Used to replace the COUNT and PACK intrinsics
+!
+REAL, DIMENSION(KPROMA) :: ZSUM2, ZMAXB
+REAL :: ZDEVIDE, ZX, ZRICE
+!
+INTEGER :: IC, JMICRO
+LOGICAL :: LLSIGMA_RC, LL_ANY_ITER, LL_AUCV_ADJU
+
+!
+!-------------------------------------------------------------------------------
+IF (LHOOK) CALL DR_HOOK('RAIN_ICE', 0, ZHOOK_HANDLE)
 !
 !-------------------------------------------------------------------------------
 !
+IF(OCND2) THEN
+  CALL PRINT_MSG(NVERB_FATAL, 'GEN', 'RAIN_ICE', 'OCND2 OPTION NOT CODED IN THIS RAIN_ICE VERSION')
+END IF
+IF(KPROMA /= KSIZE) THEN
+  CALL PRINT_MSG(NVERB_FATAL, 'GEN', 'RAIN_ICE', 'For now, KPROMA must be equal to KSIZE, see code for explanation')
+  ! 2 issues
+  !  * Microphyscs was optimized by introducing chunks of KPROMA size
+  !    Thus, in ice4_tendencies, the 1D array represent only a fraction of the points where microphisical species are present
+  !    We cannot rebuild the entire 3D arrays in the subroutine, so we cannot call ice4_rainfr_vert in it
+  !    A solution would be to suppress optimisation in this case by setting KPROMA=KSIZE in rain_ice
+  !    Another solution would be to compute column by column?
+  !    Another one would be to cut tendencies in 3 parts: before rainfr_vert, rainfr_vert, after rainfr_vert
+  !  * When chuncks are used, result is different
+ENDIF
+!
 !*       1.     COMPUTE THE LOOP BOUNDS
 !               -----------------------
 !
-CALL GET_INDICE_ll (IIB,IJB,IIE,IJE)
-IIT=SIZE(PDZZ,1)
-IJT=SIZE(PDZZ,2)
+IIU=SIZE(PDZZ,1)
+IJU=SIZE(PDZZ,2)
+CALL GET_INDICE_ll(IIB,IJB,IIE,IJE,IIU,IJU)
 IKB=KKA+JPVEXT*KKL
 IKE=KKU-JPVEXT*KKL
-IKT=SIZE(PDZZ,3)
 IKTB=1+JPVEXT
-IKTE=IKT-JPVEXT
-!
-!
-ZINVTSTEP=1./PTSTEP
-!
-!
-!*       2.     COMPUTES THE SLOW COLD PROCESS SOURCES
-!               --------------------------------------
-!
-CALL RAIN_ICE_NUCLEATION(IIB, IIE, IJB, IJE, IKTB, IKTE,KRR,PTSTEP,&
-     PTHT,PPABST,PRHODJ,PRHODREF,PRVT,PRCT,PRRT,PRIT,PRST,PRGT,&
-     PCIT,PEXNREF,PTHS,PRVS,PRIS,ZT,PRHT)
-!
+IKTE=KKT-JPVEXT
+!
+ZINV_TSTEP=1./PTSTEP
+GEXT_TEND=.TRUE.
+!
+! LSFACT and LVFACT without exner
+DO JK = 1, KKT
+  DO JJ = 1, KJT
+    DO JI = 1, KIT
+      IF (KRR==7) THEN
+        ZRICE=PRIT(JI,JJ,JK)+PRST(JI,JJ,JK)+PRGT(JI,JJ,JK)+PRHT(JI,JJ,JK)
+      ELSE
+        ZRICE=PRIT(JI,JJ,JK)+PRST(JI,JJ,JK)+PRGT(JI,JJ,JK)
+      ENDIF
+      ZDEVIDE = XCPD + XCPV*PRVT(JI,JJ,JK) + XCL*(PRCT(JI,JJ,JK)+PRRT(JI,JJ,JK)) + XCI*ZRICE
+      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)) / ZDEVIDE
+      ZZ_LVFACT(JI,JJ,JK)=(XLVTT+(XCPV-XCL)*(ZT(JI,JJ,JK)-XTT)) / ZDEVIDE
+    ENDDO
+  ENDDO
+ENDDO
 !
-!  optimization by looking for locations where
-!  the microphysical fields are larger than a minimal value only !!!
+!-------------------------------------------------------------------------------
 !
-GMICRO(:,:,:) = .FALSE.
-
- IF ( KRR == 7 ) THEN
-  GMICRO(IIB:IIE,IJB:IJE,IKTB:IKTE) =                          &
-                PRCT(IIB:IIE,IJB:IJE,IKTB:IKTE)>XRTMIN(2) .OR. &
-                PRRT(IIB:IIE,IJB:IJE,IKTB:IKTE)>XRTMIN(3) .OR. &
-                PRIT(IIB:IIE,IJB:IJE,IKTB:IKTE)>XRTMIN(4) .OR. &
-                PRST(IIB:IIE,IJB:IJE,IKTB:IKTE)>XRTMIN(5) .OR. &
-                PRGT(IIB:IIE,IJB:IJE,IKTB:IKTE)>XRTMIN(6) .OR. &
-                PRHT(IIB:IIE,IJB:IJE,IKTB:IKTE)>XRTMIN(7)
- ELSE IF( KRR == 6 ) THEN
-  GMICRO(IIB:IIE,IJB:IJE,IKTB:IKTE) =                          &
-                PRCT(IIB:IIE,IJB:IJE,IKTB:IKTE)>XRTMIN(2) .OR. &
-                PRRT(IIB:IIE,IJB:IJE,IKTB:IKTE)>XRTMIN(3) .OR. &
-                PRIT(IIB:IIE,IJB:IJE,IKTB:IKTE)>XRTMIN(4) .OR. &
-                PRST(IIB:IIE,IJB:IJE,IKTB:IKTE)>XRTMIN(5) .OR. &
-                PRGT(IIB:IIE,IJB:IJE,IKTB:IKTE)>XRTMIN(6)
- END IF
-
-IMICRO = COUNTJV( GMICRO(:,:,:),I1(:),I2(:),I3(:))
-IF( IMICRO >= 0 ) THEN
-  ALLOCATE(ZRVT(IMICRO))
-  ALLOCATE(ZRCT(IMICRO))
-  ALLOCATE(ZRRT(IMICRO))
-  ALLOCATE(ZRIT(IMICRO))
-  ALLOCATE(ZRST(IMICRO))
-  ALLOCATE(ZRGT(IMICRO))
-  IF ( KRR == 7 ) THEN
-    ALLOCATE(ZRHT(IMICRO))
-  ELSE
-    ALLOCATE(ZRHT(0))
-  END IF
-  ALLOCATE(ZCIT(IMICRO))
-  ALLOCATE(ZRVS(IMICRO))
-  ALLOCATE(ZRCS(IMICRO))
-  ALLOCATE(ZRRS(IMICRO))
-  ALLOCATE(ZRIS(IMICRO))
-  ALLOCATE(ZRSS(IMICRO))
-  ALLOCATE(ZRGS(IMICRO))
-  IF ( KRR == 7 ) THEN
-    ALLOCATE(ZRHS(IMICRO))
-  ELSE
-    ALLOCATE(ZRHS(0))
-  END IF
-  ALLOCATE(ZTHS(IMICRO))
-  ALLOCATE(ZTHT(IMICRO))
-  ALLOCATE(ZTHLT(IMICRO))
-  ALLOCATE(ZRHODREF(IMICRO))
-  ALLOCATE(ZZT(IMICRO))
-  ALLOCATE(ZPRES(IMICRO))
-  ALLOCATE(ZEXNREF(IMICRO))
-  ALLOCATE(ZSIGMA_RC(IMICRO))
-  ALLOCATE(ZCF(IMICRO))
-  ALLOCATE(ZRF(IMICRO))
-  ALLOCATE(ZHLC_HCF(IMICRO))
-  ALLOCATE(ZHLC_LCF(IMICRO))
-  ALLOCATE(ZHLC_HRC(IMICRO))
-  ALLOCATE(ZHLC_LRC(IMICRO))
-  ALLOCATE(ZHLC_RCMAX(IMICRO))
-  ALLOCATE(ZRCRAUTC(IMICRO))
-  ALLOCATE(ZHLC_HRCLOCAL(IMICRO))
-  ALLOCATE(ZHLC_LRCLOCAL(IMICRO))
-
-  DO JL=1,IMICRO
-    ZRVT(JL) = PRVT(I1(JL),I2(JL),I3(JL))
-    ZRCT(JL) = PRCT(I1(JL),I2(JL),I3(JL))
-    ZRRT(JL) = PRRT(I1(JL),I2(JL),I3(JL))
-    ZRIT(JL) = PRIT(I1(JL),I2(JL),I3(JL))
-    ZRST(JL) = PRST(I1(JL),I2(JL),I3(JL))
-    ZRGT(JL) = PRGT(I1(JL),I2(JL),I3(JL))
-    IF ( KRR == 7 ) ZRHT(JL) = PRHT(I1(JL),I2(JL),I3(JL))
-    ZCIT(JL) = PCIT(I1(JL),I2(JL),I3(JL))
-    ZCF(JL) = PCLDFR(I1(JL),I2(JL),I3(JL))
-    IF ( HSUBG_AUCV == 'PDF ' .AND. CSUBG_PR_PDF == 'SIGM' ) THEN
-      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)
-    END IF
-    ZRVS(JL) = PRVS(I1(JL),I2(JL),I3(JL))
-    ZRCS(JL) = PRCS(I1(JL),I2(JL),I3(JL))
-    ZRRS(JL) = PRRS(I1(JL),I2(JL),I3(JL))
-    ZRIS(JL) = PRIS(I1(JL),I2(JL),I3(JL))
-    ZRSS(JL) = PRSS(I1(JL),I2(JL),I3(JL))
-    ZRGS(JL) = PRGS(I1(JL),I2(JL),I3(JL))
-    IF ( KRR == 7 ) ZRHS(JL) = PRHS(I1(JL),I2(JL),I3(JL))
-    ZTHS(JL) = PTHS(I1(JL),I2(JL),I3(JL))
-!
-    ZRHODREF(JL) = PRHODREF(I1(JL),I2(JL),I3(JL))
-    ZZT(JL) = ZT(I1(JL),I2(JL),I3(JL))
-    ZTHT(JL) = PTHT(I1(JL),I2(JL),I3(JL))
-    ZTHLT(JL) = ZTHT(JL) - XLVTT * ZTHT(JL) / XCPD / ZZT(JL) * ZRCT(JL)
-    ZPRES(JL) = PPABST(I1(JL),I2(JL),I3(JL))
-    ZEXNREF(JL) = PEXNREF(I1(JL),I2(JL),I3(JL))
-  ENDDO
-  ALLOCATE(ZZW(IMICRO))
-  ALLOCATE(ZLSFACT(IMICRO))
-  ALLOCATE(ZLVFACT(IMICRO))
-    ZZW(:)  = ZEXNREF(:)*( XCPD+XCPV*ZRVT(:)+XCL*(ZRCT(:)+ZRRT(:)) &
-                                    +XCI*(ZRIT(:)+ZRST(:)+ZRGT(:)) )
-    ZLSFACT(:) = (XLSTT+(XCPV-XCI)*(ZZT(:)-XTT))/ZZW(:) ! L_s/(Pi_ref*C_ph)
-    ZLVFACT(:) = (XLVTT+(XCPV-XCL)*(ZZT(:)-XTT))/ZZW(:) ! L_v/(Pi_ref*C_ph)
-  ALLOCATE(ZUSW(IMICRO))
-  ALLOCATE(ZSSI(IMICRO))
-    ZZW(:) = EXP( XALPI - XBETAI/ZZT(:) - XGAMI*ALOG(ZZT(:) ) )
-    ZSSI(:) = ZRVT(:)*( ZPRES(:)-ZZW(:) ) / ( (XMV/XMD) * ZZW(:) ) - 1.0
-                                                      ! Supersaturation over ice
-!
-  ALLOCATE(ZLBDAR(IMICRO))
-  ALLOCATE(ZLBDAR_RF(IMICRO))
-  ALLOCATE(ZLBDAS(IMICRO))
-  ALLOCATE(ZLBDAG(IMICRO))
-  IF ( KRR == 7 ) THEN
-    ALLOCATE(ZLBDAH(IMICRO))
-  ELSE
-    ALLOCATE(ZLBDAH(0))
-  END IF
-  ALLOCATE(ZRDRYG(IMICRO))
-  ALLOCATE(ZRWETG(IMICRO))
-  ALLOCATE(ZAI(IMICRO))
-  ALLOCATE(ZCJ(IMICRO))
-  ALLOCATE(ZKA(IMICRO))
-  ALLOCATE(ZDV(IMICRO))
-!
-  IF ( KRR == 7 ) THEN
-    ALLOCATE(ZZW1(IMICRO,7))
-  ELSE IF( KRR == 6 ) THEN
-    ALLOCATE(ZZW1(IMICRO,6))
-  ENDIF
+!*       2.     COMPUTE THE SEDIMENTATION (RS) SOURCE
+!               -------------------------------------
 !
-  IF (LBU_ENABLE .OR. LLES_CALL .OR. LCHECK ) THEN
-    ALLOCATE(ZRHODJ(IMICRO))
-    DO JL=1,IMICRO
-      ZRHODJ(JL) = PRHODJ(I1(JL),I2(JL),I3(JL))
-    END DO
+IF(.NOT. LSEDIM_AFTER) THEN
+  !
+  !*       2.1     sedimentation
+  !
+  IF (LBUDGET_RC .AND. OSEDIC) CALL BUDGET_STORE_INIT(TBUDGETS(NBUDGET_RC), 'SEDI', PRCS(:, :, :) * PRHODJ(:, :, :))
+  IF (LBUDGET_RR)              CALL BUDGET_STORE_INIT(TBUDGETS(NBUDGET_RR), 'SEDI', PRRS(:, :, :) * PRHODJ(:, :, :))
+  IF (LBUDGET_RI)              CALL BUDGET_STORE_INIT(TBUDGETS(NBUDGET_RI), 'SEDI', PRIS(:, :, :) * PRHODJ(:, :, :))
+  IF (LBUDGET_RS)              CALL BUDGET_STORE_INIT(TBUDGETS(NBUDGET_RS), 'SEDI', PRSS(:, :, :) * PRHODJ(:, :, :))
+  IF (LBUDGET_RG)              CALL BUDGET_STORE_INIT(TBUDGETS(NBUDGET_RG), 'SEDI', PRGS(:, :, :) * PRHODJ(:, :, :))
+  IF (LBUDGET_RH .AND. KRR==7) CALL BUDGET_STORE_INIT(TBUDGETS(NBUDGET_RH), 'SEDI', PRHS(:, :, :) * PRHODJ(:, :, :))
+
+  IF(HSEDIM=='STAT') THEN
+    IF(KRR==7) THEN
+      DO JK = 1, KKT
+        DO JJ = 1, KJT
+          DO JI = 1, KIT
+            ZRCT(JI,JJ,JK)=PRCS(JI,JJ,JK)*PTSTEP
+            ZRRT(JI,JJ,JK)=PRRS(JI,JJ,JK)*PTSTEP
+            ZRIT(JI,JJ,JK)=PRIS(JI,JJ,JK)*PTSTEP
+            ZRST(JI,JJ,JK)=PRSS(JI,JJ,JK)*PTSTEP
+            ZRGT(JI,JJ,JK)=PRGS(JI,JJ,JK)*PTSTEP
+            ZRHT(JI,JJ,JK)=PRHS(JI,JJ,JK)*PTSTEP
+          ENDDO
+        ENDDO
+      ENDDO
+      CALL ICE4_SEDIMENTATION_STAT(IIB, IIE, KIT, IJB, IJE, KJT, IKB, IKE, IKTB, IKTE, KKT, KKL, &
+                                  &PTSTEP, KRR, OSEDIC, PDZZ, &
+                                  &PRHODREF, PPABST, PTHT, PRHODJ, &
+                                  &PRCS, ZRCT, PRRS, ZRRT, PRIS, ZRIT,&
+                                  &PRSS, ZRST, PRGS, ZRGT,&
+                                  &PINPRC, PINPRR, ZINPRI, PINPRS, PINPRG, &
+                                  &PSEA=PSEA, PTOWN=PTOWN, &
+                                  &PINPRH=PINPRH, PRHT=ZRHT, PRHS=PRHS, PFPR=PFPR)
+    ELSE
+      DO JK = 1, KKT
+        DO JJ = 1, KJT
+          DO JI = 1, KIT
+            ZRCT(JI,JJ,JK)=PRCS(JI,JJ,JK)*PTSTEP
+            ZRRT(JI,JJ,JK)=PRRS(JI,JJ,JK)*PTSTEP
+            ZRIT(JI,JJ,JK)=PRIS(JI,JJ,JK)*PTSTEP
+            ZRST(JI,JJ,JK)=PRSS(JI,JJ,JK)*PTSTEP
+            ZRGT(JI,JJ,JK)=PRGS(JI,JJ,JK)*PTSTEP
+          ENDDO
+        ENDDO
+      ENDDO
+      CALL ICE4_SEDIMENTATION_STAT(IIB, IIE, KIT, IJB, IJE, KJT, IKB, IKE, IKTB, IKTE, KKT, KKL, &
+                                  &PTSTEP, KRR, OSEDIC, PDZZ, &
+                                  &PRHODREF, PPABST, PTHT, PRHODJ, &
+                                  &PRCS, ZRCT, PRRS, ZRRT, PRIS, ZRIT,&
+                                  &PRSS, ZRST, PRGS, ZRGT,&
+                                  &PINPRC, PINPRR, ZINPRI, PINPRS, PINPRG, &
+                                  &PSEA=PSEA, PTOWN=PTOWN, &
+                                  &PFPR=PFPR)
+    ENDIF
+    PINPRS(:,:) = PINPRS(:,:) + ZINPRI(:,:)
+    !No negativity correction here as we apply sedimentation on PR.S*PTSTEP variables
+  ELSEIF(HSEDIM=='SPLI') THEN
+    IF(KRR==7) THEN
+      CALL ICE4_SEDIMENTATION_SPLIT(IIB, IIE, KIT, IJB, IJE, KJT, IKB, IKE, IKTB, IKTE, KKT, KKL, &
+                                   &PTSTEP, KRR, OSEDIC, PDZZ, &
+                                   &PRHODREF, PPABST, PTHT, PRHODJ, &
+                                   &PRCS, PRCT, PRRS, PRRT, PRIS, PRIT, PRSS, PRST, PRGS, PRGT,&
+                                   &PINPRC, PINPRR, ZINPRI, PINPRS, PINPRG, &
+                                   &PSEA=PSEA, PTOWN=PTOWN, &
+                                   &PINPRH=PINPRH, PRHT=PRHT, PRHS=PRHS, PFPR=PFPR)
+    ELSE
+      CALL ICE4_SEDIMENTATION_SPLIT(IIB, IIE, KIT, IJB, IJE, KJT, IKB, IKE, IKTB, IKTE, KKT, KKL, &
+                                   &PTSTEP, KRR, OSEDIC, PDZZ, &
+                                   &PRHODREF, PPABST, PTHT, PRHODJ, &
+                                   &PRCS, PRCT, PRRS, PRRT, PRIS, PRIT, PRSS, PRST, PRGS, PRGT,&
+                                   &PINPRC, PINPRR, ZINPRI, PINPRS, PINPRG, &
+                                   &PSEA=PSEA, PTOWN=PTOWN, &
+                                   &PFPR=PFPR)
+    ENDIF
+    PINPRS(:,:) = PINPRS(:,:) + ZINPRI(:,:)
+    !We correct negativities with conservation
+    !SPLI algorith uses a time-splitting. Inside the loop a temporary m.r. is used.
+    !   It is initialized with the m.r. at T and is modified by two tendencies:
+    !   sedimentation tendency and an external tendency which represents all other
+    !   processes (mainly advection and microphysical processes). If both tendencies
+    !   are negative, sedimentation can remove a species at a given sub-timestep. From
+    !   this point sedimentation stops for the remaining sub-timesteps but the other tendency
+    !   will be still active and will lead to negative values.
+    !   We could prevent the algorithm to not consume too much a species, instead we apply
+    !   a correction here.
+    CALL CORRECT_NEGATIVITIES(KIT, KJT, KKT, KRR, PRVS, PRCS, PRRS, &
+                             &PRIS, PRSS, PRGS, &
+                             &PTHS, ZZ_LVFACT, ZZ_LSFACT, PRHS)
+  ELSEIF(HSEDIM=='NONE') THEN
   ELSE
-    ALLOCATE(ZRHODJ(0))
+    CALL PRINT_MSG(NVERB_FATAL, 'GEN', 'RAIN_ICE', 'no sedimentation scheme for HSEDIM='//HSEDIM)
   END IF
-!
 
-  !Cloud water split between high and low content part is done here
-  !according to autoconversion option
-  ZRCRAUTC(:)   = XCRIAUTC/ZRHODREF(:) ! Autoconversion rc threshold
-  IF (HSUBG_AUCV == 'NONE') THEN
-    !Cloud water is entirely in low or high part
-    WHERE (ZRCT(:) > ZRCRAUTC(:))
-      ZHLC_HCF(:) = 1.
-      ZHLC_LCF(:) = 0.0
-      ZHLC_HRC(:) = ZRCT(:)
-      ZHLC_LRC(:) = 0.0
-      ZRF(:)      = 1.
-    ELSEWHERE (ZRCT(:) > XRTMIN(2))
-      ZHLC_HCF(:) = 0.0
-      ZHLC_LCF(:) = 1.
-      ZHLC_HRC(:) = 0.0
-      ZHLC_LRC(:) = ZRCT(:)
-      ZRF(:)      = 0.
-    ELSEWHERE
-      ZHLC_HCF(:) = 0.0
-      ZHLC_LCF(:) = 0.0
-      ZHLC_HRC(:) = 0.0
-      ZHLC_LRC(:) = 0.0
-      ZRF(:)      = 0.
-    END WHERE
-
-  ELSEIF (HSUBG_AUCV == 'CLFR') THEN
-    !Cloud water is only in the cloudy part and entirely in low or high part
-      WHERE (ZCF(:) > 0. .AND. ZRCT(:) > ZRCRAUTC(:)*ZCF(:))
-        ZHLC_HCF(:) = ZCF(:)
-        ZHLC_LCF(:) = 0.0
-        ZHLC_HRC(:) = ZRCT(:)
-        ZHLC_LRC(:) = 0.0
-        ZRF(:)      = ZCF(:)
-      ELSEWHERE (ZCF(:) > 0. .AND. ZRCT(:) > XRTMIN(2))
-        ZHLC_HCF(:) = 0.0
-        ZHLC_LCF(:) = ZCF(:)
-        ZHLC_HRC(:) = 0.0
-        ZHLC_LRC(:) = ZRCT(:)
-        ZRF(:)      = 0.
-      ELSEWHERE (ZCF(:) > 0.)
-        ZHLC_HCF(:) = 0.0
-        ZHLC_LCF(:) = 0.0
-        ZHLC_HRC(:) = 0.0
-        ZHLC_LRC(:) = 0.0
-        ZRF(:)      = 0.
-      ELSEWHERE
-        ZHLC_HCF(:) = 0.0
-        ZHLC_LCF(:) = 0.0
-        ZHLC_HRC(:) = 0.0
-        ZHLC_LRC(:) = 0.0
-        ZRF(:)      = 0.
-      END WHERE
-
-  ELSEIF (HSUBG_AUCV == 'PDF ') THEN
-    !Cloud water is split between high and low part according to a PDF
-    !    'HLCRECTPDF'    : rectangular PDF form
-    !    'HLCTRIANGPDF'  : triangular PDF form
-    !    'HLCQUADRAPDF'  : second order quadratic PDF form
-    !    'HLCISOTRIPDF'  : isocele triangular PDF
-    !    'SIGM'          : Redelsperger and Sommeria (1986)
-
-    IF ( CSUBG_PR_PDF == 'SIGM' ) THEN
-      ! Redelsperger and Sommeria (1986) but organised according to Turner (2011, 2012)
-      WHERE ( ZRCT(:) > ZRCRAUTC(:) + ZSIGMA_RC(:))
-        ZHLC_HCF(:) = 1.
-        ZHLC_LCF(:) = 0.0
-        ZHLC_HRC(:) = ZRCT(:)
-        ZHLC_LRC(:) = 0.0
-        ZRF(:)      = 1.
-      ELSEWHERE ( ZRCT(:) >  ( ZRCRAUTC(:) - ZSIGMA_RC(:) ) .AND. &
-                & ZRCT(:) <= ( ZRCRAUTC(:) + ZSIGMA_RC(:) )       )
-        ZHLC_HCF(:) = (ZRCT(:)+ZSIGMA_RC(:)-ZRCRAUTC(:))/ &
-                     &(2.*ZSIGMA_RC(:))
-        ZHLC_LCF(:) = MAX(0., ZCF(:)-ZHLC_HCF(:))
-        ZHLC_HRC(:) = (ZRCT(:)+ZSIGMA_RC(:)-ZRCRAUTC(:))* &
-                     &(ZRCT(:)+ZSIGMA_RC(:)+ZRCRAUTC(:))/ &
-                     &(4.*ZSIGMA_RC(:))
-        ZHLC_LRC(:) = MAX(0., ZRCT(:)-ZHLC_HRC(:))
-        ZRF(:)      = ZHLC_HCF(:)
-      ELSEWHERE ( ZRCT(:)>XRTMIN(2) .AND. ZCF(:)>0. )
-        ZHLC_LCF(:) = 0.0
-        ZHLC_LCF(:) = ZCF(:)
-        ZHLC_HRC(:) = 0.0
-        ZHLC_LRC(:) = ZRCT(:)
-        ZRF(:)      = 0.
-      ELSEWHERE
-        ZHLC_HCF(:) = 0.0
-        ZHLC_LCF(:) = 0.0
-        ZHLC_HRC(:) = 0.0
-        ZHLC_LRC(:) = 0.0
-        ZRF(:)      = 0.
-      END WHERE
-
-    ! Turner (2011, 2012)
-    ELSEIF ( CSUBG_PR_PDF== 'HLCRECTPDF' .OR. CSUBG_PR_PDF == 'HLCISOTRIPDF' .OR. &
-           & CSUBG_PR_PDF == 'HLCTRIANGPDF' .OR. CSUBG_PR_PDF == 'HLCQUADRAPDF' ) THEN
-      ! Calculate maximum value r_cM from PDF forms
-      IF ( CSUBG_PR_PDF == 'HLCRECTPDF' .OR. CSUBG_PR_PDF == 'HLCISOTRIPDF' ) THEN
-        ZCOEFFRCM = 2.0
-      ELSE IF ( CSUBG_PR_PDF == 'HLCTRIANGPDF' ) THEN
-        ZCOEFFRCM = 3.0
-      ELSE IF ( CSUBG_PR_PDF == 'HLCQUADRAPDF' ) THEN
-        ZCOEFFRCM = 4.0
-      END IF
-      WHERE (ZRCT(:).GT.0. .AND. ZCF(:).GT.0.)
-        ZHLC_RCMAX(:) = ZCOEFFRCM * ZRCT(:) / ZCF(:)
-      END WHERE
-
-      ! Split available water and cloud fraction in two parts
-      ! Calculate local mean values int he low and high parts for the 3 PDF forms:
-      IF ( CSUBG_PR_PDF == 'HLCRECTPDF' ) THEN
-        WHERE (ZRCT(:).GT.0. .AND. ZCF(:).GT.0. .AND. ZHLC_RCMAX(:).GT.ZRCRAUTC(:))
-          ZHLC_LRCLOCAL(:) = 0.5*ZRCRAUTC(:)
-          ZHLC_HRCLOCAL(:) = ( ZHLC_RCMAX(:) + ZRCRAUTC(:)) / 2.0
-        END WHERE
-      ELSE IF ( CSUBG_PR_PDF == 'HLCTRIANGPDF' ) THEN
-        WHERE (ZRCT(:).GT.0. .AND. ZCF(:).GT.0. .AND. ZHLC_RCMAX(:).GT.ZRCRAUTC(:))
-          ZHLC_LRCLOCAL(:) = ( ZRCRAUTC(:) *(3.0 * ZHLC_RCMAX(:) - 2.0 * ZRCRAUTC(:) ) ) &
-                          / (3.0 * (2.0 * ZHLC_RCMAX(:) - ZRCRAUTC(:)  ) )
-          ZHLC_HRCLOCAL(:) = (ZHLC_RCMAX(:) + 2.0*ZRCRAUTC(:)) / 3.0
-        END WHERE
-      ELSE IF ( CSUBG_PR_PDF == 'HLCQUADRAPDF' ) THEN
-        WHERE (ZRCT(:).GT.0. .AND. ZCF(:).GT.0. .AND. ZHLC_RCMAX(:).GT.ZRCRAUTC(:))
-          ZHLC_LRCLOCAL(:) = (3.0 *ZRCRAUTC(:)**3 - 8.0 *ZRCRAUTC(:)**2 * ZHLC_RCMAX(:) &
-                          + 6.0*ZRCRAUTC(:) *ZHLC_RCMAX(:)**2 ) &
-                          / &
-                          (4.0* ZRCRAUTC(:)**2 -12.0*ZRCRAUTC(:) *ZHLC_RCMAX(:) &
-                          + 12.0 * ZHLC_RCMAX(:)**2 )
-          ZHLC_HRCLOCAL(:) =  (ZHLC_RCMAX(:) + 3.0*ZRCRAUTC(:)) / 4.0
-        END WHERE
-      ELSE IF ( CSUBG_PR_PDF == 'HLCISOTRIPDF' ) THEN
-        WHERE (ZRCT(:).GT.0. .AND. ZCF(:).GT.0. .AND. ZHLC_RCMAX(:).GT.ZRCRAUTC(:))
-          WHERE ( (ZRCT(:) / ZCF(:)).LE.ZRCRAUTC(:) )
-            ZHLC_LRCLOCAL(:) = ( (ZHLC_RCMAX(:))**3 &
-                             - (12.0 * (ZHLC_RCMAX(:))*(ZRCRAUTC(:))**2) &
-                             + (8.0 * ZRCRAUTC(:)**3) ) &
-                             / ( (6.0 * (ZHLC_RCMAX(:))**2) &
-                             - (24.0 * (ZHLC_RCMAX(:)) * ZRCRAUTC(:)) &
-                             + (12.0 * ZRCRAUTC(:)**2) )
-            ZHLC_HRCLOCAL(:) = ( ZHLC_RCMAX(:) + 2.0 * ZRCRAUTC(:) ) / 3.0
-          ELSEWHERE
-            ZHLC_LRCLOCAL(:) = (2.0/3.0) * ZRCRAUTC(:)
-            ZHLC_HRCLOCAL(:) = (3.0*ZHLC_RCMAX(:)**3 - 8.0*ZRCRAUTC(:)**3) &
-                             / (6.0 * ZHLC_RCMAX(:)**2 - 12.0*ZRCRAUTC(:)**2)
-          END WHERE
-        END WHERE
-      END IF
-
-      ! Compare r_cM  to r_cR to know if cloud water content is high enough to split in two parts or not
-      WHERE (ZRCT(:).GT.0. .AND. ZCF(:).GT.0. .AND. ZHLC_RCMAX(:).GT.ZRCRAUTC(:))
-        ! Calculate final values for LCF and HCF:
-        ZHLC_LCF(:) = ZCF(:) &
-                       * ( ZHLC_HRCLOCAL - &
-                       ( ZRCT(:) / ZCF(:) ) ) &
-                       / (ZHLC_HRCLOCAL - ZHLC_LRCLOCAL)
-        ZHLC_HCF(:) = MAX(0., ZCF(:) - ZHLC_LCF(:))
-        !
-        ! Calculate final values for LRC and HRC:
-        ZHLC_LRC(:) = ZHLC_LRCLOCAL * ZHLC_LCF(:)
-        ZHLC_HRC(:) = MAX(0., ZRCT(:) - ZHLC_LRC(:))
-      ELSEWHERE (ZRCT(:).GT.0. .AND. ZCF(:).GT.0. .AND. ZHLC_RCMAX(:).LE.ZRCRAUTC(:))
-        ! Put all available cloud water and his fraction in the low part
-        ZHLC_LCF(:) = ZCF(:)
-        ZHLC_HCF(:) = 0.0
-        ZHLC_LRC(:) = ZRCT(:)
-        ZHLC_HRC(:) = 0.0
-      ELSEWHERE
-        ZHLC_LCF(:) = 0.
-        ZHLC_HCF(:) = 0.0
-        ZHLC_LRC(:) = 0.
-        ZHLC_HRC(:) = 0.0
-      END WHERE
-
-      ZRF(:)=ZHLC_HCF(:) !Precipitation fraction
 
-    ELSE
-      !wrong CSUBG_PR_PDF case
-      WRITE(*,*) 'wrong CSUBG_PR_PDF case'
-      CALL PRINT_MSG(NVERB_FATAL,'GEN','RAIN_ICE','')      
-    ENDIF
+
+
+
+
+!!!!! ajouter momentum
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+  !
+  !*       2.2     budget storage
+  !
+  IF (LBUDGET_RC .AND. OSEDIC) CALL BUDGET_STORE_END(TBUDGETS(NBUDGET_RC), 'SEDI', PRCS(:, :, :) * PRHODJ(:, :, :))
+  IF (LBUDGET_RR)              CALL BUDGET_STORE_END(TBUDGETS(NBUDGET_RR), 'SEDI', PRRS(:, :, :) * PRHODJ(:, :, :))
+  IF (LBUDGET_RI)              CALL BUDGET_STORE_END(TBUDGETS(NBUDGET_RI), 'SEDI', PRIS(:, :, :) * PRHODJ(:, :, :))
+  IF (LBUDGET_RS)              CALL BUDGET_STORE_END(TBUDGETS(NBUDGET_RS), 'SEDI', PRSS(:, :, :) * PRHODJ(:, :, :))
+  IF (LBUDGET_RG)              CALL BUDGET_STORE_END(TBUDGETS(NBUDGET_RG), 'SEDI', PRGS(:, :, :) * PRHODJ(:, :, :))
+  IF (LBUDGET_RH .AND. KRR==7) CALL BUDGET_STORE_END(TBUDGETS(NBUDGET_RH), 'SEDI', PRHS(:, :, :) * PRHODJ(:, :, :))
+ENDIF
+!
+
+DO JK = 1,KKT
+  !Backup of T variables
+  ZWR(:,:,JK,IRV)=PRVT(:,:,JK)
+  ZWR(:,:,JK,IRC)=PRCT(:,:,JK)
+  ZWR(:,:,JK,IRR)=PRRT(:,:,JK)
+  ZWR(:,:,JK,IRI)=PRIT(:,:,JK)
+  ZWR(:,:,JK,IRS)=PRST(:,:,JK)
+  ZWR(:,:,JK,IRG)=PRGT(:,:,JK)
+  IF (KRR==7) THEN
+    ZWR(:,:,JK,IRH)=PRHT(:,:,JK)
   ELSE
-    !wrong HSUBG_AUCV case
-    WRITE(*,*)'wrong HSUBG_AUCV case'
-    CALL PRINT_MSG(NVERB_FATAL,'GEN','RAIN_ICE','')  
+    ZWR(:,:,JK,IRH)=0.
   ENDIF
 
-  !Diagnostic of precipitation fraction
-  PRAINFR(:,:,:) = 0.
-  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(:,:,:),      &
-                         RESHAPE( SOURCE = [ ( 0., JL = 1, SIZE( PRSS ) ) ], SHAPE = SHAPE( PRSS ) ), &
-                         RESHAPE( SOURCE = [ ( 0., JL = 1, SIZE( PRGS ) ) ], SHAPE = SHAPE( PRGS ) )  )
-  DO JL=1,IMICRO
-    ZRF(JL)=PRAINFR(I1(JL),I2(JL),I3(JL))
-  END DO
-!
-  CALL RAIN_ICE_SLOW(GMICRO, ZINVTSTEP, ZRHODREF,                      &
-                     ZRCT, ZRRT, ZRIT, ZRST, ZRGT, ZRHODJ, ZZT, ZPRES, &
-                     ZLSFACT, ZLVFACT, ZSSI,                           &
-                     ZRVS, ZRCS, ZRRS, ZRIS, ZRSS, ZRGS, ZTHS,         &
-                     ZAI, ZCJ, ZKA, ZDV, ZLBDAS, ZLBDAG)
-!
-!-------------------------------------------------------------------------------
-!
-!
-!*       3.     COMPUTES THE SLOW WARM PROCESS SOURCES
-!               --------------------------------------
-!
-!*       3.1    compute the slope parameter Lbda_r
-!
-  !ZLBDAR will be used when we consider rain diluted over the grid box
-  WHERE( ZRRT(:)>0.0 )
-    ZLBDAR(:)  = XLBR*( ZRHODREF(:)*MAX( ZRRT(:),XRTMIN(3) ) )**XLBEXR
-  END WHERE
-  !ZLBDAR_RF will be used when we consider rain concentrated in its fraction
-  WHERE( ZRRT(:)>0.0 .AND. ZRF(:)>0.0 )
-    ZLBDAR_RF(:)  = XLBR*( ZRHODREF(:) *MAX( ZRRT(:)/ZRF(:)  , XRTMIN(3) ) )**XLBEXR
-  ELSEWHERE
-    ZLBDAR_RF(:)  = 0.
-  END WHERE
-!
-  IF( OWARM ) THEN    !  Check if the formation of the raindrops by the slow
-                      !  warm processes is allowed
-    PEVAP3D(:,:,:)= 0.
-    CALL RAIN_ICE_WARM(GMICRO, IMICRO, I1, I2, I3,                                                           &
-                       ZRHODREF, ZRVT, ZRCT, ZRRT, ZHLC_HCF, ZHLC_LCF, ZHLC_HRC, ZHLC_LRC,                   &
-                       ZRHODJ, ZPRES, ZZT, ZLBDAR, ZLBDAR_RF, ZLVFACT, ZCJ, ZKA, ZDV, ZRF, ZCF, ZTHT, ZTHLT, &
-                       ZRVS, ZRCS, ZRRS, ZTHS, ZUSW, PEVAP3D)
-  END IF
-!
+  !Preset for output 3D variables
+  IF(OWARM) THEN
+    PEVAP3D(:,:,JK)=0.
+  ENDIF
+  PRAINFR(:,:,JK)=0.
+  ZCITOUT(:,:,JK)=0.
+ENDDO
+
+IF(LBU_ENABLE) THEN
+  ZTOT_RVHENI(:)=0.
+  ZTOT_RCHONI(:)=0.
+  ZTOT_RRHONG(:)=0.
+  ZTOT_RVDEPS(:)=0.
+  ZTOT_RIAGGS(:)=0.
+  ZTOT_RIAUTS(:)=0.
+  ZTOT_RVDEPG(:)=0.
+  ZTOT_RCAUTR(:)=0.
+  ZTOT_RCACCR(:)=0.
+  ZTOT_RREVAV(:)=0.
+  ZTOT_RCRIMSS(:)=0.
+  ZTOT_RCRIMSG(:)=0.
+  ZTOT_RSRIMCG(:)=0.
+  ZTOT_RIMLTC(:)=0.
+  ZTOT_RCBERI(:)=0.
+  ZTOT_RHMLTR(:)=0.
+  ZTOT_RSMLTG(:)=0.
+  ZTOT_RCMLTSR(:)=0.
+  ZTOT_RRACCSS(:)=0.
+  ZTOT_RRACCSG(:)=0.
+  ZTOT_RSACCRG(:)=0.
+  ZTOT_RICFRRG(:)=0.
+  ZTOT_RRCFRIG(:)=0.
+  ZTOT_RICFRR(:)=0.
+  ZTOT_RCWETG(:)=0.
+  ZTOT_RIWETG(:)=0.
+  ZTOT_RRWETG(:)=0.
+  ZTOT_RSWETG(:)=0.
+  ZTOT_RCDRYG(:)=0.
+  ZTOT_RIDRYG(:)=0.
+  ZTOT_RRDRYG(:)=0.
+  ZTOT_RSDRYG(:)=0.
+  ZTOT_RWETGH(:)=0.
+  ZTOT_RGMLTR(:)=0.
+  ZTOT_RCWETH(:)=0.
+  ZTOT_RIWETH(:)=0.
+  ZTOT_RSWETH(:)=0.
+  ZTOT_RGWETH(:)=0.
+  ZTOT_RRWETH(:)=0.
+  ZTOT_RCDRYH(:)=0.
+  ZTOT_RIDRYH(:)=0.
+  ZTOT_RSDRYH(:)=0.
+  ZTOT_RRDRYH(:)=0.
+  ZTOT_RGDRYH(:)=0.
+  ZTOT_RDRYHG(:)=0.
+ENDIF
+
 !-------------------------------------------------------------------------------
+!  optimization by looking for locations where
+!  the microphysical fields are larger than a minimal value only !!!
 !
+IF (KSIZE /= COUNT(ODMICRO)) THEN
+    CALL PRINT_MSG(NVERB_FATAL, 'GEN', 'RAIN_ICE', 'RAIN_ICE : KSIZE /= COUNT(ODMICRO)')
+ENDIF
+
+IF (KSIZE > 0) THEN
+
+  !Maximum number of iterations
+  !We only count real iterations (those for which we *compute* tendencies)
+  INB_ITER_MAX=NMAXITER
+  IF(XTSTEP_TS/=0.)THEN
+    INB_ITER_MAX=MAX(1, INT(PTSTEP/XTSTEP_TS)) !At least the number of iterations needed for the time-splitting
+    ZTSTEP=PTSTEP/INB_ITER_MAX
+    INB_ITER_MAX=MAX(NMAXITER, INB_ITER_MAX) !For the case XMRSTEP/=0. at the same time
+  ENDIF
+
+!===============================================================================================================
+! Cache-blocking loop :
+
+  LLSIGMA_RC=(HSUBG_AUCV_RC=='PDF ' .AND. CSUBG_PR_PDF=='SIGM')
+  LL_AUCV_ADJU=(HSUBG_AUCV_RC=='ADJU' .OR. HSUBG_AUCV_RI=='ADJU')
+
+  ! starting indexes :
+  IC=0
+  ISTK=1
+  ISTJ=1
+  ISTI=1
+
+  DO JMICRO=1,KSIZE,KPROMA
+
+    IMICRO=MIN(KPROMA,KSIZE-JMICRO+1)
 !
-!*       4.     COMPUTES THE FAST COLD PROCESS SOURCES FOR r_s
-!               ----------------------------------------------
-!
-  CALL RAIN_ICE_FAST_RS(PTSTEP, GMICRO, ZRHODREF, ZRVT, ZRCT, ZRRT, ZRST, ZRHODJ, ZPRES, ZZT, &
-                        ZLBDAR, ZLBDAS, ZLSFACT, ZLVFACT, ZCJ, ZKA, ZDV, &
-                        ZRCS, ZRRS, ZRSS, ZRGS, ZTHS)
-!
+!*       3.     PACKING
+!               --------
+
+    ! Setup packing parameters
+    OUTER_LOOP: DO JK = ISTK, KKT
+      DO JJ = ISTJ, KJT
+        IF (ANY(ODMICRO(:,JJ,JK))) THEN
+          DO JI = ISTI, KIT
+            IF (ODMICRO(JI,JJ,JK)) THEN
+              IC=IC+1
+              ! Initialization of variables in packed format :
+              ZVART(IC, ITH)=PTHT(JI, JJ, JK)
+              ZVART(IC, IRV)=PRVT(JI, JJ, JK)
+              ZVART(IC, IRC)=PRCT(JI, JJ, JK)
+              ZVART(IC, IRR)=PRRT(JI, JJ, JK)
+              ZVART(IC, IRI)=PRIT(JI, JJ, JK)
+              ZVART(IC, IRS)=PRST(JI, JJ, JK)
+              ZVART(IC, IRG)=PRGT(JI, JJ, JK)
+              IF (KRR==7) THEN
+                ZVART(IC, IRH)=PRHT(JI, JJ, JK)
+              ENDIF
+              IF (GEXT_TEND) THEN
+                !The th tendency is not related to a mixing ratio change, there is no exn/exnref issue here
+                ZEXTPK(IC, ITH)=PTHS(JI, JJ, JK)
+                ZEXTPK(IC, IRV)=PRVS(JI, JJ, JK)
+                ZEXTPK(IC, IRC)=PRCS(JI, JJ, JK)
+                ZEXTPK(IC, IRR)=PRRS(JI, JJ, JK)
+                ZEXTPK(IC, IRI)=PRIS(JI, JJ, JK)
+                ZEXTPK(IC, IRS)=PRSS(JI, JJ, JK)
+                ZEXTPK(IC, IRG)=PRGS(JI, JJ, JK)
+                IF (KRR==7) THEN
+                  ZEXTPK(IC, IRH)=PRHS(JI, JJ, JK)
+                ENDIF
+              ENDIF
+              ZCIT       (IC)=PCIT    (JI, JJ, JK)
+              ZCF        (IC)=PCLDFR  (JI, JJ, JK)
+              ZRHODREF   (IC)=PRHODREF(JI, JJ, JK)
+              ZPRES      (IC)=PPABST  (JI, JJ, JK)
+              ZEXN       (IC)=PEXN    (JI, JJ, JK)
+              IF(LLSIGMA_RC) THEN
+                ZSIGMA_RC(IC)=PSIGS   (JI, JJ, JK)
+              ENDIF
+              IF (LL_AUCV_ADJU) THEN
+                ZHLC_HCF(IC) = PHLC_HCF(JI, JJ, JK)
+                ZHLC_HRC(IC) = PHLC_HRC(JI, JJ, JK)
+                ZHLI_HCF(IC) = PHLI_HCF(JI, JJ, JK)
+                ZHLI_HRI(IC) = PHLI_HRI(JI, JJ, JK)
+              ENDIF
+              ! Save indices for later usages:
+              I1(IC) = JI
+              I2(IC) = JJ
+              I3(IC) = JK
+              I1TOT(JMICRO+IC-1)=JI
+              I2TOT(JMICRO+IC-1)=JJ
+              I3TOT(JMICRO+IC-1)=JK
+              IF (IC==IMICRO) THEN
+                ! the end of the chunk has been reached, then reset the starting index :
+                ISTI=JI+1
+                IF (ISTI <= KIT) THEN
+                  ISTJ=JJ
+                  ISTK=JK
+                ELSE
+                  ! end of line, restart from 1 and increment upper loop
+                  ISTI=1
+                  ISTJ=JJ+1
+                  IF (ISTJ <= KJT) THEN
+                    ISTK=JK
+                  ELSE
+                    ! end of line, restart from 1 and increment upper loop
+                    ISTJ=1
+                    ISTK=JK+1
+                    IF (ISTK > KKT) THEN
+                      ! end of line, restart from 1
+                      ISTK=1
+                    ENDIF
+                  ENDIF
+                ENDIF
+                IC=0
+                EXIT OUTER_LOOP
+              ENDIF
+            ENDIF
+          ENDDO
+        ENDIF
+        ! restart inner loop on JI :
+        ISTI=1
+      ENDDO
+      ! restart inner loop on JJ :
+      ISTJ=1
+    ENDDO OUTER_LOOP
+
+    IF (GEXT_TEND) THEN
+      DO JV=0, KRR
+        DO JL=1, IMICRO
+          ZEXTPK(JL, JV)=ZEXTPK(JL, JV)-ZVART(JL, JV)*ZINV_TSTEP
+        ENDDO
+      ENDDO
+    ENDIF
+    IF (LLSIGMA_RC) THEN
+      DO JL=1, IMICRO
+        ZSIGMA_RC(JL)=ZSIGMA_RC(JL)*2.
+      ENDDO 
+    ENDIF
+    IF (LL_AUCV_ADJU) THEN
+      DO JL=1, IMICRO
+        ZHLC_LRC(JL) = ZVART(JL, IRC) - ZHLC_HRC(JL)
+        ZHLI_LRI(JL) = ZVART(JL, IRI) - ZHLI_HRI(JL)
+        IF(ZVART(JL, IRC)>0.) THEN
+          ZHLC_LCF(JL) = ZCF(JL)- ZHLC_HCF(JL)
+        ELSE
+          ZHLC_LCF(JL)=0.
+        ENDIF
+        IF(ZVART(JL, IRI)>0.) THEN
+          ZHLI_LCF(JL) = ZCF(JL)- ZHLI_HCF(JL)
+        ELSE
+          ZHLI_LCF(JL)=0.
+        ENDIF
+      ENDDO
+    ENDIF
+
 !-------------------------------------------------------------------------------
 !
+!*       4.     LOOP
+!               ----
 !
-!*       5.     COMPUTES THE FAST COLD PROCESS SOURCES FOR r_g
-!               ----------------------------------------------
-!
-  CALL RAIN_ICE_FAST_RG(KRR, GMICRO, ZRHODREF, ZRVT, ZRCT, ZRRT, ZRIT, ZRST, ZRGT, ZCIT, &
-                        ZRHODJ, ZPRES, ZZT, ZLBDAR, ZLBDAS, ZLBDAG, ZLSFACT, ZLVFACT, &
-                        ZCJ, ZKA, ZDV, &
-                        ZRCS, ZRRS, ZRIS, ZRSS, ZRGS, ZRHS, ZTHS, &
-                        ZUSW, ZRDRYG, ZRWETG)
-!
+    IITER(1:IMICRO)=0
+    ZTIME(1:IMICRO)=0. ! Current integration time (all points may have a different integration time)
+
+    DO WHILE(ANY(ZTIME(1:IMICRO)<PTSTEP)) ! Loop to *really* compute tendencies
+
+      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 tendencies
+        ZTIME_LASTCALL(1:IMICRO)=ZTIME(1:IMICRO)
+      ENDIF
+      DO JL=1, IMICRO
+        IF (ZTIME(JL) < PTSTEP) THEN
+          ZCOMPUTE(JL)=1. ! Computation (1.) only for points for which integration time has not reached the timestep
+          IITER(JL)=IITER(JL)+1
+        ELSE
+          ZCOMPUTE(JL)=0.
+        ENDIF
+      ENDDO
+      LL_ANY_ITER=ANY(IITER(1:IMICRO) < INB_ITER_MAX)
+      LLCPZ0RT=.TRUE.
+      LSOFT=.FALSE. ! We *really* compute the tendencies
+
+      DO WHILE(ANY(ZCOMPUTE(1:IMICRO)==1.)) ! Loop to adjust tendencies when we cross the 0°C or when a species disappears
+!$OMP SIMD
+        DO JL=1, IMICRO
+          ZSUM2(JL)=SUM(ZVART(JL,IRI:KRR))
+        ENDDO
+        DO JL=1, IMICRO
+          ZDEVIDE=(XCPD + XCPV*ZVART(JL, IRV) + XCL*(ZVART(JL, IRC)+ZVART(JL, IRR)) + XCI*ZSUM2(JL)) * ZEXN(JL)
+          ZZT(JL) = ZVART(JL, ITH) * ZEXN(JL)
+          ZLSFACT(JL)=(XLSTT+(XCPV-XCI)*(ZZT(JL)-XTT)) / ZDEVIDE
+          ZLVFACT(JL)=(XLVTT+(XCPV-XCL)*(ZZT(JL)-XTT)) / ZDEVIDE
+        ENDDO
+        !
+        !***       4.1 Tendencies computation
+        !
+        ! Tendencies are *really* computed when LSOFT==.FALSE. and only adjusted otherwise
+    CALL ICE4_TENDENCIES(KPROMA, 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, &
+                        &ZCIT, &
+                        &ZZT, ZVART, &
+                        &ZRVHENI_MR, ZRRHONG_MR, ZRIMLTC_MR, ZRSRIMCG_MR, &
+                        &ZRCHONI, ZRVDEPS, ZRIAGGS, ZRIAUTS, ZRVDEPG, &
+                        &ZRCAUTR, ZRCACCR, ZRREVAV, &
+                        &ZRCRIMSS, ZRCRIMSG, ZRSRIMCG, ZRRACCSS, ZRRACCSG, ZRSACCRG, ZRSMLTG, ZRCMLTSR, &
+                        &ZRICFRRG, ZRRCFRIG, ZRICFRR, ZRCWETG, ZRIWETG, ZRRWETG, ZRSWETG, &
+                        &ZRCDRYG, ZRIDRYG, ZRRDRYG, ZRSDRYG, ZRWETGH, ZRWETGH_MR, ZRGMLTR, &
+                        &ZRCWETH, ZRIWETH, ZRSWETH, ZRGWETH, ZRRWETH, &
+                        &ZRCDRYH, ZRIDRYH, ZRSDRYH, ZRRDRYH, ZRGDRYH, ZRDRYHG, ZRHMLTR, &
+                        &ZRCBERI, &
+                        &ZRS_TEND, ZRG_TEND, ZRH_TEND, ZSSI, &
+                        &ZA, ZB, &
+                        &ZHLC_HCF, ZHLC_LCF, ZHLC_HRC, ZHLC_LRC, &
+                        &ZHLI_HCF, ZHLI_LCF, ZHLI_HRI, ZHLI_LRI, PRAINFR)
+
+        ! External tendencies
+        IF(GEXT_TEND) THEN
+          DO JV=0, KRR
+            DO JL=1, IMICRO
+              ZA(JL, JV) = ZA(JL, JV) + ZEXTPK(JL, JV)
+            ENDDO
+          ENDDO
+        ENDIF
+        !
+        !***       4.2 Integration time
+        !
+        ! If we can, we shall use these tendencies until the end of the timestep
+        DO JL=1, IMICRO
+          ZMAXTIME(JL)=ZCOMPUTE(JL) * (PTSTEP-ZTIME(JL)) ! Remaining time until the end of the timestep
+        ENDDO
+
+        !We need to adjust tendencies when temperature reaches 0
+        IF(LFEEDBACKT) THEN
+          DO JL=1, IMICRO
+            !Is ZB(:, ITH) enough to change temperature sign?
+            ZX=XTT/ZEXN(JL)
+            IF ((ZVART(JL, ITH) - ZX) * (ZVART(JL, ITH) + ZB(JL, ITH) - ZX) < 0.) THEN
+              ZMAXTIME(JL)=0.
+            ENDIF
+            !Can ZA(:, ITH) make temperature change of sign?
+            IF (ABS(ZA(JL,ITH)) > 1.E-20 ) THEN
+              ZTIME_THRESHOLD=(ZX - ZB(JL, ITH) - ZVART(JL, ITH))/ZA(JL, ITH)
+              IF (ZTIME_THRESHOLD > 0.) THEN
+                ZMAXTIME(JL)=MIN(ZMAXTIME(JL), ZTIME_THRESHOLD)
+              ENDIF
+            ENDIF
+          ENDDO
+        ENDIF
+
+        !We need to adjust tendencies when a species disappears
+        !When a species is missing, only the external tendencies can be negative (and we must keep track of it)
+        DO JV=1, KRR
+          DO JL=1, IMICRO
+            IF (ZA(JL, JV) < -1.E-20 .AND. ZVART(JL, JV) > XRTMIN(JV)) THEN
+              ZMAXTIME(JL)=MIN(ZMAXTIME(JL), -(ZB(JL, JV)+ZVART(JL, JV))/ZA(JL, JV))
+            ENDIF
+          ENDDO
+        ENDDO
+
+        !We stop when the end of the timestep is reached
+        DO JL=1, IMICRO
+          IF (ZTIME(JL)+ZMAXTIME(JL) >= PTSTEP) THEN
+            ZCOMPUTE(JL)=0.
+          ENDIF
+        ENDDO
+        !We must recompute tendencies when the end of the sub-timestep is reached
+        IF (XTSTEP_TS/=0.) THEN
+          DO JL=1, IMICRO
+            IF ((IITER(JL) < INB_ITER_MAX) .AND. (ZTIME(JL)+ZMAXTIME(JL) > ZTIME_LASTCALL(JL)+ZTSTEP)) THEN
+              ZMAXTIME(JL)=ZTIME_LASTCALL(JL)-ZTIME(JL)+ZTSTEP
+              ZCOMPUTE(JL)=0.
+            ENDIF
+          ENDDO
+        ENDIF
+
+        !We must recompute tendencies when the maximum allowed change is reached
+        !When a species 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 species was already missing)
+        IF (XMRSTEP/=0.) THEN
+          IF (LL_ANY_ITER) THEN
+            ! In this case we need to remember the initial mixing ratios used to compute the tendencies
+            ! because when mixing ratio has evolved more than a threshold, we must re-compute tendencies
+            ! Thus, at first iteration (ie when LLCPZ0RT=.TRUE.) we copy ZVART into Z0RT
+            DO JV=1,KRR
+              IF (LLCPZ0RT) Z0RT(1:IMICRO, JV)=ZVART(1:IMICRO, JV)
+              DO JL=1, IMICRO
+                IF (IITER(JL)<INB_ITER_MAX .AND. ABS(ZA(JL,JV))>1.E-20) THEN
+                  ZTIME_THRESHOLD=(SIGN(1., ZA(JL, JV))*XMRSTEP+Z0RT(JL, JV)-ZVART(JL, JV)-ZB(JL, JV))/ZA(JL, JV)
+                ELSE
+                  ZTIME_THRESHOLD=-1.
+                ENDIF
+                IF (ZTIME_THRESHOLD>=0 .AND. ZTIME_THRESHOLD<ZMAXTIME(JL) .AND. (ZVART(JL, JV)>XRTMIN(JV) .OR. ZA(JL, JV)>0.)) THEN
+                  ZMAXTIME(JL)=MIN(ZMAXTIME(JL), ZTIME_THRESHOLD)
+                  ZCOMPUTE(JL)=0.
+                ENDIF
+              ENDDO
+            ENDDO
+            LLCPZ0RT=.FALSE.
+!$OMP SIMD
+            DO JL=1,IMICRO
+              ZMAXB(JL)=MAXVAL(ABS(ZB(JL,1:KRR)))
+            ENDDO
+            DO JL=1, IMICRO
+              IF (IITER(JL)<INB_ITER_MAX .AND. ZMAXB(JL)>XMRSTEP) THEN
+                ZMAXTIME(JL)=0.
+                ZCOMPUTE(JL)=0.
+              ENDIF
+            ENDDO
+          ENDIF ! LL_ANY_ITER
+        ENDIF ! XMRSTEP/=0.
+        !
+        !***       4.3 New values of variables for next iteration
+        !
+        DO JV=0, KRR
+          DO JL=1, IMICRO
+            ZVART(JL, JV)=ZVART(JL, JV)+ZA(JL, JV)*ZMAXTIME(JL)+ZB(JL, JV)
+          ENDDO
+        ENDDO
+        DO JL=1, IMICRO
+          IF (ZVART(JL,IRI)==0.) ZCIT(JL) = 0.
+          ZTIME(JL)=ZTIME(JL)+ZMAXTIME(JL)
+        ENDDO
+
+        !
+        !***       4.4 Mixing ratio change due to each process
+        !
+        IF(LBU_ENABLE) THEN
+          DO JL=1, IMICRO
+            ZTOT_RVHENI (JMICRO+JL-1)=ZTOT_RVHENI (JMICRO+JL-1)+ZRVHENI_MR(JL)
+            ZTOT_RCHONI (JMICRO+JL-1)=ZTOT_RCHONI (JMICRO+JL-1)+ZRCHONI   (JL)*ZMAXTIME(JL)
+            ZTOT_RRHONG (JMICRO+JL-1)=ZTOT_RRHONG (JMICRO+JL-1)+ZRRHONG_MR(JL)
+            ZTOT_RVDEPS (JMICRO+JL-1)=ZTOT_RVDEPS (JMICRO+JL-1)+ZRVDEPS   (JL)*ZMAXTIME(JL)
+            ZTOT_RIAGGS (JMICRO+JL-1)=ZTOT_RIAGGS (JMICRO+JL-1)+ZRIAGGS   (JL)*ZMAXTIME(JL)
+            ZTOT_RIAUTS (JMICRO+JL-1)=ZTOT_RIAUTS (JMICRO+JL-1)+ZRIAUTS   (JL)*ZMAXTIME(JL)
+            ZTOT_RVDEPG (JMICRO+JL-1)=ZTOT_RVDEPG (JMICRO+JL-1)+ZRVDEPG   (JL)*ZMAXTIME(JL)
+            ZTOT_RCAUTR (JMICRO+JL-1)=ZTOT_RCAUTR (JMICRO+JL-1)+ZRCAUTR   (JL)*ZMAXTIME(JL)
+            ZTOT_RCACCR (JMICRO+JL-1)=ZTOT_RCACCR (JMICRO+JL-1)+ZRCACCR   (JL)*ZMAXTIME(JL)
+            ZTOT_RREVAV (JMICRO+JL-1)=ZTOT_RREVAV (JMICRO+JL-1)+ZRREVAV   (JL)*ZMAXTIME(JL)
+            ZTOT_RCRIMSS(JMICRO+JL-1)=ZTOT_RCRIMSS(JMICRO+JL-1)+ZRCRIMSS  (JL)*ZMAXTIME(JL)
+            ZTOT_RCRIMSG(JMICRO+JL-1)=ZTOT_RCRIMSG(JMICRO+JL-1)+ZRCRIMSG  (JL)*ZMAXTIME(JL)
+            ZTOT_RSRIMCG(JMICRO+JL-1)=ZTOT_RSRIMCG(JMICRO+JL-1)+ZRSRIMCG  (JL)*ZMAXTIME(JL)+ZRSRIMCG_MR(JL)
+            ZTOT_RRACCSS(JMICRO+JL-1)=ZTOT_RRACCSS(JMICRO+JL-1)+ZRRACCSS  (JL)*ZMAXTIME(JL)
+            ZTOT_RRACCSG(JMICRO+JL-1)=ZTOT_RRACCSG(JMICRO+JL-1)+ZRRACCSG  (JL)*ZMAXTIME(JL)
+            ZTOT_RSACCRG(JMICRO+JL-1)=ZTOT_RSACCRG(JMICRO+JL-1)+ZRSACCRG  (JL)*ZMAXTIME(JL)
+            ZTOT_RSMLTG (JMICRO+JL-1)=ZTOT_RSMLTG (JMICRO+JL-1)+ZRSMLTG   (JL)*ZMAXTIME(JL)
+            ZTOT_RCMLTSR(JMICRO+JL-1)=ZTOT_RCMLTSR(JMICRO+JL-1)+ZRCMLTSR  (JL)*ZMAXTIME(JL)
+            ZTOT_RICFRRG(JMICRO+JL-1)=ZTOT_RICFRRG(JMICRO+JL-1)+ZRICFRRG  (JL)*ZMAXTIME(JL)
+            ZTOT_RRCFRIG(JMICRO+JL-1)=ZTOT_RRCFRIG(JMICRO+JL-1)+ZRRCFRIG  (JL)*ZMAXTIME(JL)
+            ZTOT_RICFRR (JMICRO+JL-1)=ZTOT_RICFRR (JMICRO+JL-1)+ZRICFRR   (JL)*ZMAXTIME(JL)
+            ZTOT_RCWETG (JMICRO+JL-1)=ZTOT_RCWETG (JMICRO+JL-1)+ZRCWETG   (JL)*ZMAXTIME(JL)
+            ZTOT_RIWETG (JMICRO+JL-1)=ZTOT_RIWETG (JMICRO+JL-1)+ZRIWETG   (JL)*ZMAXTIME(JL)
+            ZTOT_RRWETG (JMICRO+JL-1)=ZTOT_RRWETG (JMICRO+JL-1)+ZRRWETG   (JL)*ZMAXTIME(JL)
+            ZTOT_RSWETG (JMICRO+JL-1)=ZTOT_RSWETG (JMICRO+JL-1)+ZRSWETG   (JL)*ZMAXTIME(JL)
+            ZTOT_RWETGH (JMICRO+JL-1)=ZTOT_RWETGH (JMICRO+JL-1)+ZRWETGH   (JL)*ZMAXTIME(JL)+ZRWETGH_MR(JL)
+            ZTOT_RCDRYG (JMICRO+JL-1)=ZTOT_RCDRYG (JMICRO+JL-1)+ZRCDRYG   (JL)*ZMAXTIME(JL)
+            ZTOT_RIDRYG (JMICRO+JL-1)=ZTOT_RIDRYG (JMICRO+JL-1)+ZRIDRYG   (JL)*ZMAXTIME(JL)
+            ZTOT_RRDRYG (JMICRO+JL-1)=ZTOT_RRDRYG (JMICRO+JL-1)+ZRRDRYG   (JL)*ZMAXTIME(JL)
+            ZTOT_RSDRYG (JMICRO+JL-1)=ZTOT_RSDRYG (JMICRO+JL-1)+ZRSDRYG   (JL)*ZMAXTIME(JL)
+            ZTOT_RGMLTR (JMICRO+JL-1)=ZTOT_RGMLTR (JMICRO+JL-1)+ZRGMLTR   (JL)*ZMAXTIME(JL)
+            ZTOT_RCWETH (JMICRO+JL-1)=ZTOT_RCWETH (JMICRO+JL-1)+ZRCWETH   (JL)*ZMAXTIME(JL)
+            ZTOT_RIWETH (JMICRO+JL-1)=ZTOT_RIWETH (JMICRO+JL-1)+ZRIWETH   (JL)*ZMAXTIME(JL)
+            ZTOT_RSWETH (JMICRO+JL-1)=ZTOT_RSWETH (JMICRO+JL-1)+ZRSWETH   (JL)*ZMAXTIME(JL)
+            ZTOT_RGWETH (JMICRO+JL-1)=ZTOT_RGWETH (JMICRO+JL-1)+ZRGWETH   (JL)*ZMAXTIME(JL)
+            ZTOT_RRWETH (JMICRO+JL-1)=ZTOT_RRWETH (JMICRO+JL-1)+ZRRWETH   (JL)*ZMAXTIME(JL)
+            ZTOT_RCDRYH (JMICRO+JL-1)=ZTOT_RCDRYH (JMICRO+JL-1)+ZRCDRYH   (JL)*ZMAXTIME(JL)
+            ZTOT_RIDRYH (JMICRO+JL-1)=ZTOT_RIDRYH (JMICRO+JL-1)+ZRIDRYH   (JL)*ZMAXTIME(JL)
+            ZTOT_RSDRYH (JMICRO+JL-1)=ZTOT_RSDRYH (JMICRO+JL-1)+ZRSDRYH   (JL)*ZMAXTIME(JL)
+            ZTOT_RRDRYH (JMICRO+JL-1)=ZTOT_RRDRYH (JMICRO+JL-1)+ZRRDRYH   (JL)*ZMAXTIME(JL)
+            ZTOT_RGDRYH (JMICRO+JL-1)=ZTOT_RGDRYH (JMICRO+JL-1)+ZRGDRYH   (JL)*ZMAXTIME(JL)
+            ZTOT_RDRYHG (JMICRO+JL-1)=ZTOT_RDRYHG (JMICRO+JL-1)+ZRDRYHG   (JL)*ZMAXTIME(JL)
+            ZTOT_RHMLTR (JMICRO+JL-1)=ZTOT_RHMLTR (JMICRO+JL-1)+ZRHMLTR   (JL)*ZMAXTIME(JL)
+            ZTOT_RIMLTC (JMICRO+JL-1)=ZTOT_RIMLTC (JMICRO+JL-1)+ZRIMLTC_MR(JL)
+            ZTOT_RCBERI (JMICRO+JL-1)=ZTOT_RCBERI (JMICRO+JL-1)+ZRCBERI   (JL)*ZMAXTIME(JL)
+          ENDDO
+        ENDIF
+        !
+        !***       4.5 Next loop
+        !
+        LSOFT=.TRUE. ! We try to adjust tendencies (inner while loop)
+      ENDDO
+    ENDDO
+
+    IF(GEXT_TEND) THEN
+      !Z..T variables contain the external tendency, we substract it
+      DO JV=0, KRR
+        DO JL=1, IMICRO
+          ZVART(JL, JV) = ZVART(JL, JV) - ZEXTPK(JL, JV) * PTSTEP
+        ENDDO
+      ENDDO
+    ENDIF
+
 !-------------------------------------------------------------------------------
 !
+!*       5.     UNPACKING DIAGNOSTICS
+!               ---------------------
+!
+    DO JL=1, IMICRO
+      ZCITOUT  (I1(JL),I2(JL),I3(JL))=ZCIT   (JL)
+      IF(OWARM) THEN
+        PEVAP3D(I1(JL),I2(JL),I3(JL))=ZRREVAV(JL)
+      ENDIF
+      ZWR(I1(JL),I2(JL),I3(JL),IRV)=ZVART(JL, IRV)
+      ZWR(I1(JL),I2(JL),I3(JL),IRC)=ZVART(JL, IRC)
+      ZWR(I1(JL),I2(JL),I3(JL),IRR)=ZVART(JL, IRR)
+      ZWR(I1(JL),I2(JL),I3(JL),IRI)=ZVART(JL, IRI)
+      ZWR(I1(JL),I2(JL),I3(JL),IRS)=ZVART(JL, IRS)
+      ZWR(I1(JL),I2(JL),I3(JL),IRG)=ZVART(JL, IRG)
+      IF (KRR==7) THEN
+        ZWR(I1(JL),I2(JL),I3(JL),IRH)=ZVART(JL, IRH)
+      ENDIF
+    ENDDO
+
+  ENDDO ! JMICRO
+ENDIF ! KSIZE > 0
+PCIT(:,:,:)=ZCITOUT(:,:,:)
+
+!==========================================================================================================
+
+
 !
-!*       6.     COMPUTES THE FAST COLD PROCESS SOURCES FOR r_h
-!               ----------------------------------------------
+!*       6.     COMPUTES THE SLOW COLD PROCESS SOURCES OUTSIDE OF ODMICRO POINTS
+!               ----------------------------------------------------------------
 !
- IF ( KRR == 7 ) THEN
-  CALL RAIN_ICE_FAST_RH(GMICRO, ZRHODREF, ZRVT, ZRCT, ZRIT, ZRST, ZRGT, ZRHT, ZRHODJ, ZPRES, &
-                        ZZT, ZLBDAS, ZLBDAG, ZLBDAH, ZLSFACT, ZLVFACT, ZCJ, ZKA, ZDV, &
-                        ZRCS, ZRRS, ZRIS, ZRSS, ZRGS, ZRHS, ZTHS, ZUSW)
- END IF
+CALL ICE4_NUCLEATION_WRAPPER(KIT, KJT, KKT, .NOT. ODMICRO, &
+                             PTHT, PPABST, PRHODREF, PEXN, ZZ_LSFACT, ZT, &
+                             PRVT, &
+                             PCIT, ZZ_RVHENI_MR)
 !
 !-------------------------------------------------------------------------------
 !
-!
-!*       7.     COMPUTES SPECIFIC SOURCES OF THE WARM AND COLD CLOUDY SPECIES
-!               -------------------------------------------------------------
-!
-  CALL RAIN_ICE_FAST_RI(GMICRO, ZRHODREF, ZRIT, ZRHODJ, ZZT, ZSSI, ZLSFACT, ZLVFACT, &
-                        ZAI, ZCJ, ZCIT, ZRCS, ZRIS, ZTHS)
+!*       7.     TOTAL TENDENCIES
+!               ----------------
 !
 !
-!-------------------------------------------------------------------------------
+!***     7.1    total tendencies limited by available species
 !
+DO JK = 1, KKT
+  DO JJ = 1, KJT
+!DEC$ IVDEP
+    DO JI = 1, KIT
+      !LV/LS
+      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)
+
+      !Tendency dure to nucleation on non ODMICRO points
+      ZZ_RVHENI(JI,JJ,JK) = MIN(PRVS(JI,JJ,JK), ZZ_RVHENI_MR(JI,JJ,JK)/PTSTEP)
+
+      !Hydrometeor tendencies is the difference between old state and new state (can be negative)
+      ZWR(JI,JJ,JK,IRV)=(ZWR(JI,JJ,JK,IRV)-PRVT(JI,JJ,JK))*ZINV_TSTEP
+      ZWR(JI,JJ,JK,IRC)=(ZWR(JI,JJ,JK,IRC)-PRCT(JI,JJ,JK))*ZINV_TSTEP
+      ZWR(JI,JJ,JK,IRR)=(ZWR(JI,JJ,JK,IRR)-PRRT(JI,JJ,JK))*ZINV_TSTEP
+      ZWR(JI,JJ,JK,IRI)=(ZWR(JI,JJ,JK,IRI)-PRIT(JI,JJ,JK))*ZINV_TSTEP
+      ZWR(JI,JJ,JK,IRS)=(ZWR(JI,JJ,JK,IRS)-PRST(JI,JJ,JK))*ZINV_TSTEP
+      ZWR(JI,JJ,JK,IRG)=(ZWR(JI,JJ,JK,IRG)-PRGT(JI,JJ,JK))*ZINV_TSTEP
+      IF(KRR==7) THEN
+        ZWR(JI,JJ,JK,IRH)=(ZWR(JI,JJ,JK,IRH)-PRHT(JI,JJ,JK))*ZINV_TSTEP
+      ENDIF
+
+      !Theta tendency computed from hydrometeors tendencies
+      ZWR(JI,JJ,JK, ITH) = (ZWR(JI,JJ,JK,IRC)+ZWR(JI,JJ,JK,IRR))*ZZ_LVFACT(JI,JJ,JK)+ &
+                         & (ZWR(JI,JJ,JK,IRI)+ZWR(JI,JJ,JK,IRS)+ZWR(JI,JJ,JK,IRG)+ &
+                         &  ZWR(JI,JJ,JK,IRH))*ZZ_LSFACT(JI,JJ,JK)
+
+      !We apply these tendencies to the S variables
+      !including the nucleation part
+      PTHS(JI,JJ,JK) = PTHS(JI,JJ,JK) + ZWR(JI,JJ,JK,ITH)+ZZ_RVHENI(JI,JJ,JK)*ZZ_LSFACT(JI,JJ,JK)
+      PRVS(JI,JJ,JK) = PRVS(JI,JJ,JK) + ZWR(JI,JJ,JK,IRV)-ZZ_RVHENI(JI,JJ,JK)
+      PRCS(JI,JJ,JK) = PRCS(JI,JJ,JK) + ZWR(JI,JJ,JK,IRC)
+      PRRS(JI,JJ,JK) = PRRS(JI,JJ,JK) + ZWR(JI,JJ,JK,IRR)
+      PRIS(JI,JJ,JK) = PRIS(JI,JJ,JK) + ZWR(JI,JJ,JK,IRI)+ZZ_RVHENI(JI,JJ,JK)
+      PRSS(JI,JJ,JK) = PRSS(JI,JJ,JK) + ZWR(JI,JJ,JK,IRS)
+      PRGS(JI,JJ,JK) = PRGS(JI,JJ,JK) + ZWR(JI,JJ,JK,IRG)
+      IF (KRR==7) THEN
+        PRHS(JI,JJ,JK) = PRHS(JI,JJ,JK) + ZWR(JI,JJ,JK,IRH)
+      ENDIF
+    ENDDO
+  ENDDO
+ENDDO
+
 !
+!***     7.2    LBU_ENABLE case
 !
-  DO JL=1,IMICRO
-    PRVS(I1(JL),I2(JL),I3(JL)) = ZRVS(JL)
-    PRCS(I1(JL),I2(JL),I3(JL)) = ZRCS(JL)
-    PRRS(I1(JL),I2(JL),I3(JL)) = ZRRS(JL)
-    PRIS(I1(JL),I2(JL),I3(JL)) = ZRIS(JL)
-    PRSS(I1(JL),I2(JL),I3(JL)) = ZRSS(JL)
-    PRGS(I1(JL),I2(JL),I3(JL)) = ZRGS(JL)
-    PTHS(I1(JL),I2(JL),I3(JL)) = ZTHS(JL)
-    PCIT(I1(JL),I2(JL),I3(JL)) = ZCIT(JL)
-    !
-    PRAINFR(I1(JL),I2(JL),I3(JL)) = ZRF(JL)
+IF(LBU_ENABLE) THEN
+  IF (LBUDGET_TH) THEN
+    ZZ_DIFF(:, :, :) = ZZ_LSFACT(:, :, :) - ZZ_LVFACT(:, :, :)
+  END IF
+
+  ZW(:,:,:) = 0.
+  DO JL=1, KSIZE
+    ZW(I1TOT(JL), I2TOT(JL), I3TOT(JL)) = ZTOT_RVHENI(JL) * ZINV_TSTEP
+  END DO
+  ZW(:,:,:)=ZW(:,:,:)+ZZ_RVHENI
+  IF (LBUDGET_TH) CALL BUDGET_STORE_ADD(TBUDGETS(NBUDGET_TH), 'HENU',  ZW(:, :, :)*ZZ_LSFACT(:, :, :)*PRHODJ(:, :, :))
+  IF (LBUDGET_RV) CALL BUDGET_STORE_ADD(TBUDGETS(NBUDGET_RV), 'HENU', -ZW(:, :, :)                   *PRHODJ(:, :, :))
+  IF (LBUDGET_RI) CALL BUDGET_STORE_ADD(TBUDGETS(NBUDGET_RI), 'HENU',  ZW(:, :, :)                   *PRHODJ(:, :, :))
+
+  ZW(:,:,:) = 0.
+  DO JL=1, KSIZE
+    ZW(I1TOT(JL), I2TOT(JL), I3TOT(JL)) = ZTOT_RCHONI(JL) * ZINV_TSTEP
+  END DO
+  IF (LBUDGET_TH) CALL BUDGET_STORE_ADD(TBUDGETS(NBUDGET_TH), 'HON',  ZW(:, :, :)*ZZ_DIFF(:, :, :)*PRHODJ(:, :, :))
+  IF (LBUDGET_RC) CALL BUDGET_STORE_ADD(TBUDGETS(NBUDGET_RC), 'HON', -ZW(:, :, :)                 *PRHODJ(:, :, :))
+  IF (LBUDGET_RI) CALL BUDGET_STORE_ADD(TBUDGETS(NBUDGET_RI), 'HON',  ZW(:, :, :)                 *PRHODJ(:, :, :))
+
+  ZW(:,:,:) = 0.
+  DO JL=1, KSIZE
+    ZW(I1TOT(JL), I2TOT(JL), I3TOT(JL)) = ZTOT_RRHONG(JL) * ZINV_TSTEP
+  END DO
+  IF (LBUDGET_TH) CALL BUDGET_STORE_ADD(TBUDGETS(NBUDGET_TH), 'SFR',  ZW(:, :, :)*ZZ_DIFF(:, :, :)*PRHODJ(:, :, :))
+  IF (LBUDGET_RR) CALL BUDGET_STORE_ADD(TBUDGETS(NBUDGET_RR), 'SFR', -ZW(:, :, :)                 *PRHODJ(:, :, :))
+  IF (LBUDGET_RG) CALL BUDGET_STORE_ADD(TBUDGETS(NBUDGET_RG), 'SFR',  ZW(:, :, :)                 *PRHODJ(:, :, :))
+
+  ZW(:,:,:) = 0.
+  DO JL=1, KSIZE
+    ZW(I1TOT(JL), I2TOT(JL), I3TOT(JL)) = ZTOT_RVDEPS(JL) * ZINV_TSTEP
+  END DO
+  IF (LBUDGET_TH) CALL BUDGET_STORE_ADD(TBUDGETS(NBUDGET_TH), 'DEPS',  ZW(:, :, :)*ZZ_LSFACT(:, :, :)*PRHODJ(:, :, :))
+  IF (LBUDGET_RV) CALL BUDGET_STORE_ADD(TBUDGETS(NBUDGET_RV), 'DEPS', -ZW(:, :, :)                   *PRHODJ(:, :, :))
+  IF (LBUDGET_RS) CALL BUDGET_STORE_ADD(TBUDGETS(NBUDGET_RS), 'DEPS',  ZW(:, :, :)                   *PRHODJ(:, :, :))
+
+  ZW(:,:,:) = 0.
+  DO JL=1, KSIZE
+    ZW(I1TOT(JL), I2TOT(JL), I3TOT(JL)) = ZTOT_RIAGGS(JL) * ZINV_TSTEP
+  END DO
+  IF (LBUDGET_RI) CALL BUDGET_STORE_ADD(TBUDGETS(NBUDGET_RI), 'AGGS', -ZW(:, :, :)*PRHODJ(:, :, :))
+  IF (LBUDGET_RS) CALL BUDGET_STORE_ADD(TBUDGETS(NBUDGET_RS), 'AGGS',  ZW(:, :, :)*PRHODJ(:, :, :))
+
+  ZW(:,:,:) = 0.
+  DO JL=1, KSIZE
+    ZW(I1TOT(JL), I2TOT(JL), I3TOT(JL)) = ZTOT_RIAUTS(JL) * ZINV_TSTEP
   END DO
-  IF ( KRR == 7 ) THEN
-    DO JL=1,IMICRO
-      PRHS(I1(JL),I2(JL),I3(JL)) = ZRHS(JL)
+  IF (LBUDGET_RI) CALL BUDGET_STORE_ADD(TBUDGETS(NBUDGET_RI), 'AUTS', -ZW(:, :, :)*PRHODJ(:, :, :))
+  IF (LBUDGET_RS) CALL BUDGET_STORE_ADD(TBUDGETS(NBUDGET_RS), 'AUTS',  ZW(:, :, :)*PRHODJ(:, :, :))
+
+  ZW(:,:,:) = 0.
+  DO JL=1, KSIZE
+    ZW(I1TOT(JL), I2TOT(JL), I3TOT(JL)) = ZTOT_RVDEPG(JL) * ZINV_TSTEP
+  END DO
+  IF (LBUDGET_TH) CALL BUDGET_STORE_ADD(TBUDGETS(NBUDGET_TH), 'DEPG',  ZW(:, :, :)*ZZ_LSFACT(:, :, :)*PRHODJ(:, :, :))
+  IF (LBUDGET_RV) CALL BUDGET_STORE_ADD(TBUDGETS(NBUDGET_RV), 'DEPG', -ZW(:, :, :)                   *PRHODJ(:, :, :))
+  IF (LBUDGET_RG) CALL BUDGET_STORE_ADD(TBUDGETS(NBUDGET_RG), 'DEPG',  ZW(:, :, :)                   *PRHODJ(:, :, :))
+
+  IF(OWARM) THEN
+    ZW(:,:,:) = 0.
+    DO JL=1, KSIZE
+      ZW(I1TOT(JL), I2TOT(JL), I3TOT(JL)) = ZTOT_RCAUTR(JL) * ZINV_TSTEP
+    END DO
+    IF (LBUDGET_RC) CALL BUDGET_STORE_ADD(TBUDGETS(NBUDGET_RC), 'AUTO', -ZW(:, :, :)*PRHODJ(:, :, :))
+    IF (LBUDGET_RR) CALL BUDGET_STORE_ADD(TBUDGETS(NBUDGET_RR), 'AUTO',  ZW(:, :, :)*PRHODJ(:, :, :))
+
+    ZW(:,:,:) = 0.
+    DO JL=1, KSIZE
+      ZW(I1TOT(JL), I2TOT(JL), I3TOT(JL)) = ZTOT_RCACCR(JL) * ZINV_TSTEP
+    END DO
+    IF (LBUDGET_RC) CALL BUDGET_STORE_ADD(TBUDGETS(NBUDGET_RC), 'ACCR', -ZW(:, :, :)*PRHODJ(:, :, :))
+    IF (LBUDGET_RR) CALL BUDGET_STORE_ADD(TBUDGETS(NBUDGET_RR), 'ACCR',  ZW(:, :, :)*PRHODJ(:, :, :))
+
+    ZW(:,:,:) = 0.
+    DO JL=1, KSIZE
+      ZW(I1TOT(JL), I2TOT(JL), I3TOT(JL)) = ZTOT_RREVAV(JL) * ZINV_TSTEP
+    END DO
+    IF (LBUDGET_TH) CALL BUDGET_STORE_ADD(TBUDGETS(NBUDGET_TH), 'REVA', -ZW(:, :, :)*ZZ_LVFACT(:, :, :)*PRHODJ(:, :, :))
+    IF (LBUDGET_RV) CALL BUDGET_STORE_ADD(TBUDGETS(NBUDGET_RV), 'REVA',  ZW(:, :, :)                   *PRHODJ(:, :, :))
+    IF (LBUDGET_RR) CALL BUDGET_STORE_ADD(TBUDGETS(NBUDGET_RR), 'REVA', -ZW(:, :, :)                   *PRHODJ(:, :, :))
+  ENDIF
+
+  ZW1(:,:,:) = 0.
+  DO JL=1, KSIZE
+    ZW1(I1TOT(JL), I2TOT(JL), I3TOT(JL)) = ZTOT_RCRIMSS(JL) * ZINV_TSTEP
+  END DO
+  ZW2(:,:,:) = 0.
+  DO JL=1, KSIZE
+    ZW2(I1TOT(JL), I2TOT(JL), I3TOT(JL)) = ZTOT_RCRIMSG(JL) * ZINV_TSTEP
+  END DO
+  ZW3(:,:,:) = 0.
+  DO JL=1, KSIZE
+    ZW3(I1TOT(JL), I2TOT(JL), I3TOT(JL)) = ZTOT_RSRIMCG(JL) * ZINV_TSTEP
+  END DO
+  IF (LBUDGET_TH) &
+    CALL BUDGET_STORE_ADD(TBUDGETS(NBUDGET_TH), 'RIM', (ZW1(:, :, :)+ZW2(:, :, :))*ZZ_DIFF(:, :, :)*PRHODJ(:, :, :))
+  IF (LBUDGET_RC) CALL BUDGET_STORE_ADD(TBUDGETS(NBUDGET_RC), 'RIM', (-ZW1(:, :, :)-ZW2(:, :, :))*PRHODJ(:, :, :))
+  IF (LBUDGET_RS) CALL BUDGET_STORE_ADD(TBUDGETS(NBUDGET_RS), 'RIM', ( ZW1(:, :, :)-ZW3(:, :, :))*PRHODJ(:, :, :))
+  IF (LBUDGET_RG) CALL BUDGET_STORE_ADD(TBUDGETS(NBUDGET_RG), 'RIM', ( ZW2(:, :, :)+ZW3(:, :, :))*PRHODJ(:, :, :))
+
+  ZW1(:,:,:) = 0.
+  DO JL=1, KSIZE
+    ZW1(I1TOT(JL), I2TOT(JL), I3TOT(JL)) = ZTOT_RRACCSS(JL) * ZINV_TSTEP
+  END DO
+  ZW2(:,:,:) = 0.
+  DO JL=1, KSIZE
+    ZW2(I1TOT(JL), I2TOT(JL), I3TOT(JL)) = ZTOT_RRACCSG(JL) * ZINV_TSTEP
+  END DO
+  ZW3(:,:,:) = 0.
+  DO JL=1, KSIZE
+    ZW3(I1TOT(JL), I2TOT(JL), I3TOT(JL)) = ZTOT_RSACCRG(JL) * ZINV_TSTEP
+  END DO
+  IF (LBUDGET_TH) &
+    CALL BUDGET_STORE_ADD(TBUDGETS(NBUDGET_TH), 'ACC', (ZW1(:, :, :)+ZW2(:, :, :) )*ZZ_DIFF(:, :, :)*PRHODJ(:, :, :))
+  IF (LBUDGET_RR) CALL BUDGET_STORE_ADD(TBUDGETS(NBUDGET_RR), 'ACC', (-ZW1(:, :, :)-ZW2(:, :, :))*PRHODJ(:, :, :))
+  IF (LBUDGET_RS) CALL BUDGET_STORE_ADD(TBUDGETS(NBUDGET_RS), 'ACC', ( ZW1(:, :, :)-ZW3(:, :, :))*PRHODJ(:, :, :))
+  IF (LBUDGET_RG) CALL BUDGET_STORE_ADD(TBUDGETS(NBUDGET_RG), 'ACC', ( ZW2(:, :, :)+ZW3(:, :, :))*PRHODJ(:, :, :))
+
+  ZW(:,:,:) = 0.
+  DO JL=1, KSIZE
+    ZW(I1TOT(JL), I2TOT(JL), I3TOT(JL)) = ZTOT_RSMLTG(JL) * ZINV_TSTEP
+  END DO
+  IF (LBUDGET_RS) CALL BUDGET_STORE_ADD(TBUDGETS(NBUDGET_RS), 'CMEL', -ZW(:, :, :)*PRHODJ(:, :, :))
+  IF (LBUDGET_RG) CALL BUDGET_STORE_ADD(TBUDGETS(NBUDGET_RG), 'CMEL',  ZW(:, :, :)*PRHODJ(:, :, :))
+  ZW(:,:,:) = 0.
+  DO JL=1, KSIZE
+    ZW(I1TOT(JL), I2TOT(JL), I3TOT(JL)) = ZTOT_RCMLTSR(JL) * ZINV_TSTEP
+  END DO
+  IF (LBUDGET_RC) CALL BUDGET_STORE_ADD(TBUDGETS(NBUDGET_RC), 'CMEL', -ZW(:, :, :)*PRHODJ(:, :, :))
+  IF (LBUDGET_RR) CALL BUDGET_STORE_ADD(TBUDGETS(NBUDGET_RR), 'CMEL',  ZW(:, :, :)*PRHODJ(:, :, :))
+
+  ZW1(:,:,:) = 0.
+  DO JL=1, KSIZE
+    ZW1(I1TOT(JL), I2TOT(JL), I3TOT(JL)) = ZTOT_RICFRRG(JL) * ZINV_TSTEP
+  END DO
+  ZW2(:,:,:) = 0.
+  DO JL=1, KSIZE
+    ZW2(I1TOT(JL), I2TOT(JL), I3TOT(JL)) = ZTOT_RRCFRIG(JL) * ZINV_TSTEP
+  END DO
+  ZW3(:,:,:) = 0.
+  DO JL=1, KSIZE
+    ZW3(I1TOT(JL), I2TOT(JL), I3TOT(JL)) = ZTOT_RICFRR(JL) * ZINV_TSTEP
+  END DO
+  IF (LBUDGET_TH) &
+    CALL BUDGET_STORE_ADD(TBUDGETS(NBUDGET_TH), 'CFRZ', ZW2(:, :, :)*ZZ_DIFF(:, :, :)*PRHODJ(:, :, :))
+  IF (LBUDGET_RR) CALL BUDGET_STORE_ADD(TBUDGETS(NBUDGET_RR), 'CFRZ', (-ZW2(:, :, :)+ZW3(:, :, :))*PRHODJ(:, :, :))
+  IF (LBUDGET_RI) CALL BUDGET_STORE_ADD(TBUDGETS(NBUDGET_RI), 'CFRZ', (-ZW1(:, :, :)-ZW3(:, :, :))*PRHODJ(:, :, :))
+  IF (LBUDGET_RG) CALL BUDGET_STORE_ADD(TBUDGETS(NBUDGET_RG), 'CFRZ', ( ZW1(:, :, :)+ZW2(:, :, :))*PRHODJ(:, :, :))
+
+  ZW1(:,:,:) = 0.
+  DO JL=1, KSIZE
+    ZW1(I1TOT(JL), I2TOT(JL), I3TOT(JL)) = ZTOT_RCWETG(JL) * ZINV_TSTEP
+  END DO
+  ZW2(:,:,:) = 0.
+  DO JL=1, KSIZE
+    ZW2(I1TOT(JL), I2TOT(JL), I3TOT(JL)) = ZTOT_RRWETG(JL) * ZINV_TSTEP
+  END DO
+  ZW3(:,:,:) = 0.
+  DO JL=1, KSIZE
+    ZW3(I1TOT(JL), I2TOT(JL), I3TOT(JL)) = ZTOT_RIWETG(JL) * ZINV_TSTEP
+  END DO
+  ZW4(:,:,:) = 0.
+  DO JL=1, KSIZE
+    ZW4(I1TOT(JL), I2TOT(JL), I3TOT(JL)) = ZTOT_RSWETG(JL) * ZINV_TSTEP
+  END DO
+  IF (LBUDGET_TH) &
+    CALL BUDGET_STORE_ADD(TBUDGETS(NBUDGET_TH), 'WETG', (ZW1(:, :, :)+ZW2(:, :, :))*ZZ_DIFF(:, :, :)*PRHODJ(:, :, :))
+  IF (LBUDGET_RC) CALL BUDGET_STORE_ADD(TBUDGETS(NBUDGET_RC), 'WETG', -zw1(:, :, :)                 *PRHODJ(:, :, :))
+  IF (LBUDGET_RR) CALL BUDGET_STORE_ADD(TBUDGETS(NBUDGET_RR), 'WETG', -zw2(:, :, :)                 *PRHODJ(:, :, :))
+  IF (LBUDGET_RI) CALL BUDGET_STORE_ADD(TBUDGETS(NBUDGET_RI), 'WETG', -zw3(:, :, :)                 *PRHODJ(:, :, :))
+  IF (LBUDGET_RS) CALL BUDGET_STORE_ADD(TBUDGETS(NBUDGET_RS), 'WETG', -zw4(:, :, :)                 *PRHODJ(:, :, :))
+  IF (LBUDGET_RG) CALL BUDGET_STORE_ADD(TBUDGETS(NBUDGET_RG), 'WETG', (ZW1(:, :, :)+ZW2(:, :, :)+ZW3(:, :, :)+ZW4(:, :, :)) &
+                                                                      &                             *PRHODJ(:, :, :))
+
+  IF(KRR==7) THEN
+    ZW(:,:,:) = 0.
+    DO JL=1, KSIZE
+      ZW(I1TOT(JL), I2TOT(JL), I3TOT(JL)) = ZTOT_RWETGH(JL) * ZINV_TSTEP
     END DO
+    IF (LBUDGET_RG) CALL BUDGET_STORE_ADD(TBUDGETS(NBUDGET_RG), 'GHCV', -ZW(:, :, :)*PRHODJ(:, :, :))
+    IF (LBUDGET_RH) CALL BUDGET_STORE_ADD(TBUDGETS(NBUDGET_RH), 'GHCV',  ZW(:, :, :)*PRHODJ(:, :, :))
   END IF
-!
-!
-!
-  DEALLOCATE(ZZW1)
-  DEALLOCATE(ZDV)
-  DEALLOCATE(ZCJ)
-  DEALLOCATE(ZRDRYG)
-  DEALLOCATE(ZRWETG)
-  DEALLOCATE(ZLBDAG)
-  DEALLOCATE(ZLBDAH)
-  DEALLOCATE(ZLBDAS)
-  DEALLOCATE(ZLBDAR)
-  DEALLOCATE(ZLBDAR_RF)
-  DEALLOCATE(ZSSI)
-  DEALLOCATE(ZUSW)
-  DEALLOCATE(ZLVFACT)
-  DEALLOCATE(ZLSFACT)
-  DEALLOCATE(ZZW)
-  DEALLOCATE(ZEXNREF)
-  DEALLOCATE(ZPRES)
-  DEALLOCATE(ZRHODREF)
-  DEALLOCATE(ZZT)
-  IF(LBU_ENABLE .OR. LLES_CALL .OR. LCHECK ) DEALLOCATE(ZRHODJ)
-  DEALLOCATE(ZTHS)
-  DEALLOCATE(ZTHT)
-  DEALLOCATE(ZTHLT)
-  DEALLOCATE(ZRHS)
-  DEALLOCATE(ZRGS)
-  DEALLOCATE(ZRSS)
-  DEALLOCATE(ZRIS)
-  DEALLOCATE(ZRRS)
-  DEALLOCATE(ZRCS)
-  DEALLOCATE(ZRVS)
-  DEALLOCATE(ZCIT)
-  DEALLOCATE(ZRGT)
-  DEALLOCATE(ZRHT)
-  DEALLOCATE(ZRST)
-  DEALLOCATE(ZRIT)
-  DEALLOCATE(ZRRT)
-  DEALLOCATE(ZAI)
-  DEALLOCATE(ZRCT)
-  DEALLOCATE(ZKA)
-  DEALLOCATE(ZRVT)
-  DEALLOCATE(ZSIGMA_RC)
-  DEALLOCATE(ZCF)
-  DEALLOCATE(ZRF)
-  DEALLOCATE(ZHLC_HCF)
-  DEALLOCATE(ZHLC_LCF)
-  DEALLOCATE(ZHLC_HRC)
-  DEALLOCATE(ZHLC_LRC)
-  DEALLOCATE(ZHLC_RCMAX)
-  DEALLOCATE(ZRCRAUTC)
-  DEALLOCATE(ZHLC_HRCLOCAL)
-  DEALLOCATE(ZHLC_LRCLOCAL)
+
+  ZW1(:,:,:) = 0.
+  DO JL=1, KSIZE
+    ZW1(I1TOT(JL), I2TOT(JL), I3TOT(JL)) = ZTOT_RCDRYG(JL) * ZINV_TSTEP
+  END DO
+  ZW2(:,:,:) = 0.
+  DO JL=1, KSIZE
+    ZW2(I1TOT(JL), I2TOT(JL), I3TOT(JL)) = ZTOT_RRDRYG(JL) * ZINV_TSTEP
+  END DO
+  ZW3(:,:,:) = 0.
+  DO JL=1, KSIZE
+    ZW3(I1TOT(JL), I2TOT(JL), I3TOT(JL)) = ZTOT_RIDRYG(JL) * ZINV_TSTEP
+  END DO
+  ZW4(:,:,:) = 0.
+  DO JL=1, KSIZE
+    ZW4(I1TOT(JL), I2TOT(JL), I3TOT(JL)) = ZTOT_RSDRYG(JL) * ZINV_TSTEP
+  END DO
+  IF (LBUDGET_TH) &
+    CALL BUDGET_STORE_ADD(TBUDGETS(NBUDGET_TH), 'DRYG', (ZW1(:, :, :)+ZW2(:, :, :) )*ZZ_DIFF(:, :, :)*PRHODJ(:, :, :))
+  IF (LBUDGET_RC) CALL BUDGET_STORE_ADD(TBUDGETS(NBUDGET_RC), 'DRYG', -zw1(:, :, :)                  *PRHODJ(:, :, :))
+  IF (LBUDGET_RR) CALL BUDGET_STORE_ADD(TBUDGETS(NBUDGET_RR), 'DRYG', -zw2(:, :, :)                  *PRHODJ(:, :, :))
+  IF (LBUDGET_RI) CALL BUDGET_STORE_ADD(TBUDGETS(NBUDGET_RI), 'DRYG', -zw3(:, :, :)                  *PRHODJ(:, :, :))
+  IF (LBUDGET_RS) CALL BUDGET_STORE_ADD(TBUDGETS(NBUDGET_RS), 'DRYG', -zw4(:, :, :)                  *PRHODJ(:, :, :))
+  IF (LBUDGET_RG) CALL BUDGET_STORE_ADD(TBUDGETS(NBUDGET_RG), 'DRYG', (ZW1(:, :, :)+ZW2(:, :, :)+ZW3(:, :, :)+ZW4(:, :, :)) &
+                                                                      &                              *PRHODJ(:, :, :))
+
+  ZW(:,:,:) = 0.
+  DO JL=1, KSIZE
+    ZW(I1TOT(JL), I2TOT(JL), I3TOT(JL)) = ZTOT_RGMLTR(JL) * ZINV_TSTEP
+  END DO
+  IF (LBUDGET_TH) CALL BUDGET_STORE_ADD(TBUDGETS(NBUDGET_TH), 'GMLT', -ZW(:, :, :)*ZZ_DIFF(:, :, :)*PRHODJ(:, :, :))
+  IF (LBUDGET_RR) CALL BUDGET_STORE_ADD(TBUDGETS(NBUDGET_RR), 'GMLT',  ZW(:, :, :)                 *PRHODJ(:, :, :))
+  IF (LBUDGET_RG) CALL BUDGET_STORE_ADD(TBUDGETS(NBUDGET_RG), 'GMLT', -ZW(:, :, :)                 *PRHODJ(:, :, :))
+
+  IF(KRR==7) THEN
+    ZW1(:,:,:) = 0.
+    DO JL=1, KSIZE
+      ZW1(I1TOT(JL), I2TOT(JL), I3TOT(JL)) = ZTOT_RCWETH(JL) * ZINV_TSTEP
+    END DO
+    ZW2(:,:,:) = 0.
+    DO JL=1, KSIZE
+      ZW2(I1TOT(JL), I2TOT(JL), I3TOT(JL)) = ZTOT_RRWETH(JL) * ZINV_TSTEP
+    END DO
+    ZW3(:,:,:) = 0.
+    DO JL=1, KSIZE
+      ZW3(I1TOT(JL), I2TOT(JL), I3TOT(JL)) = ZTOT_RIWETH(JL) * ZINV_TSTEP
+    END DO
+    ZW4(:,:,:) = 0.
+    DO JL=1, KSIZE
+      ZW4(I1TOT(JL), I2TOT(JL), I3TOT(JL)) = ZTOT_RSWETH(JL) * ZINV_TSTEP
+    END DO
+    ZW5(:,:,:) = 0.
+    DO JL=1, KSIZE
+      ZW5(I1TOT(JL), I2TOT(JL), I3TOT(JL)) = ZTOT_RGWETH(JL) * ZINV_TSTEP
+    END DO
+    IF (LBUDGET_TH) &
+      CALL BUDGET_STORE_ADD(TBUDGETS(NBUDGET_TH), 'WETH', (ZW1(:, :, :)+ZW2(:, :, :))*ZZ_DIFF(:, :, :)*PRHODJ(:, :, :))
+    IF (LBUDGET_RC) CALL BUDGET_STORE_ADD(TBUDGETS(NBUDGET_RC), 'WETH', -ZW1(:, :, :)                 *PRHODJ(:, :, :))
+    IF (LBUDGET_RR) CALL BUDGET_STORE_ADD(TBUDGETS(NBUDGET_RR), 'WETH', -ZW2(:, :, :)                 *PRHODJ(:, :, :))
+    IF (LBUDGET_RI) CALL BUDGET_STORE_ADD(TBUDGETS(NBUDGET_RI), 'WETH', -ZW3(:, :, :)                 *PRHODJ(:, :, :))
+    IF (LBUDGET_RS) CALL BUDGET_STORE_ADD(TBUDGETS(NBUDGET_RS), 'WETH', -ZW4(:, :, :)                 *PRHODJ(:, :, :))
+    IF (LBUDGET_RG) CALL BUDGET_STORE_ADD(TBUDGETS(NBUDGET_RG), 'WETH', -ZW5(:, :, :)                 *PRHODJ(:, :, :))
+    IF (LBUDGET_RH) CALL BUDGET_STORE_ADD(TBUDGETS(NBUDGET_RH), 'WETH', (ZW1(:, :, :)+ZW2(:, :, :)+ZW3(:, :, :)+ &
+                                                                        &ZW4(:, :, :)+ZW5(:, :, : ))  *PRHODJ(:, :, :))
+
+    ZW(:,:,:) = 0.
+    DO JL=1, KSIZE
+      ZW(I1TOT(JL), I2TOT(JL), I3TOT(JL)) = ZTOT_RGWETH(JL) * ZINV_TSTEP
+    END DO
+    IF (LBUDGET_RG) CALL BUDGET_STORE_ADD(TBUDGETS(NBUDGET_RG), 'HGCV', -ZW(:, :, :)*PRHODJ(:, :, :))
+    IF (LBUDGET_RH) CALL BUDGET_STORE_ADD(TBUDGETS(NBUDGET_RH), 'HGCV',  ZW(:, :, :)*PRHODJ(:, :, :))
+
+    ZW1(:,:,:) = 0.
+    DO JL=1, KSIZE
+      ZW1(I1TOT(JL), I2TOT(JL), I3TOT(JL)) = ZTOT_RCDRYH(JL) * ZINV_TSTEP
+    END DO
+    ZW2(:,:,:) = 0.
+    DO JL=1, KSIZE
+      ZW2(I1TOT(JL), I2TOT(JL), I3TOT(JL)) = ZTOT_RRDRYH(JL) * ZINV_TSTEP
+    END DO
+    ZW3(:,:,:) = 0.
+    DO JL=1, KSIZE
+      ZW3(I1TOT(JL), I2TOT(JL), I3TOT(JL)) = ZTOT_RIDRYH(JL) * ZINV_TSTEP
+    END DO
+    ZW4(:,:,:) = 0.
+    DO JL=1, KSIZE
+      ZW4(I1TOT(JL), I2TOT(JL), I3TOT(JL)) = ZTOT_RSDRYH(JL) * ZINV_TSTEP
+    END DO
+    ZW5(:,:,:) = 0.
+    DO JL=1, KSIZE
+      ZW5(I1TOT(JL), I2TOT(JL), I3TOT(JL)) = ZTOT_RGDRYH(JL) * ZINV_TSTEP
+    END DO
+    ZW6(:,:,:) = 0.
+    DO JL=1, KSIZE
+      ZW6(I1TOT(JL), I2TOT(JL), I3TOT(JL)) = ZTOT_RDRYHG(JL) * ZINV_TSTEP
+    END DO
+    IF (LBUDGET_TH) &
+      CALL BUDGET_STORE_ADD(TBUDGETS(NBUDGET_TH), 'DRYH', (ZW1(:, :, :)+ZW2(:, :, :))*ZZ_DIFF(:, :, :)*PRHODJ(:, :, :))
+    IF (LBUDGET_RC) CALL BUDGET_STORE_ADD(TBUDGETS(NBUDGET_RC), 'DRYH', -ZW1(:, :, :)                 *PRHODJ(:, :, :))
+    IF (LBUDGET_RR) CALL BUDGET_STORE_ADD(TBUDGETS(NBUDGET_RR), 'DRYH', -ZW2(:, :, :)                 *PRHODJ(:, :, :))
+    IF (LBUDGET_RI) CALL BUDGET_STORE_ADD(TBUDGETS(NBUDGET_RI), 'DRYH', -ZW3(:, :, :)                 *PRHODJ(:, :, :))
+    IF (LBUDGET_RS) CALL BUDGET_STORE_ADD(TBUDGETS(NBUDGET_RS), 'DRYH', -ZW4(:, :, :)                 *PRHODJ(:, :, :))
+    IF (LBUDGET_RG) CALL BUDGET_STORE_ADD(TBUDGETS(NBUDGET_RG), 'DRYH', (-ZW5(:, :, :)+ZW6(:, :, : )) *PRHODJ(:, :, :))
+    IF (LBUDGET_RH) CALL BUDGET_STORE_ADD(TBUDGETS(NBUDGET_RH), 'DRYH', (ZW1(:, :, :)+ZW2(:, :, :)+ZW3(:, :, :)+   &
+                                                                        &ZW4(:, :, :)+ZW5(:, :, : )-ZW6(:, :, :)) &
+                                                                        &                             *PRHODJ(:, :, :))
+
+    ZW(:,:,:) = 0.
+    DO JL=1, KSIZE
+      ZW(I1TOT(JL), I2TOT(JL), I3TOT(JL)) = ZTOT_RHMLTR(JL) * ZINV_TSTEP
+    END DO
+    IF (LBUDGET_TH) CALL BUDGET_STORE_ADD(TBUDGETS(NBUDGET_TH), 'HMLT', -ZW(:, :, :)*ZZ_DIFF(:, :, :)*PRHODJ(:, :, :))
+    IF (LBUDGET_RR) CALL BUDGET_STORE_ADD(TBUDGETS(NBUDGET_RR), 'HMLT',  ZW(:, :, :)                 *PRHODJ(:, :, :))
+    IF (LBUDGET_RH) CALL BUDGET_STORE_ADD(TBUDGETS(NBUDGET_RH), 'HMLT', -ZW(:, :, :)                 *PRHODJ(:, :, :))
+  ENDIF
+
+  ZW(:,:,:) = 0.
+  DO JL=1, KSIZE
+    ZW(I1TOT(JL), I2TOT(JL), I3TOT(JL)) = ZTOT_RIMLTC(JL) * ZINV_TSTEP
+  END DO
+  IF (LBUDGET_TH) CALL BUDGET_STORE_ADD(TBUDGETS(NBUDGET_TH), 'IMLT', -ZW(:, :, :)*ZZ_DIFF(:, :, :)*PRHODJ(:, :, :))
+  IF (LBUDGET_RC) CALL BUDGET_STORE_ADD(TBUDGETS(NBUDGET_RC), 'IMLT',  ZW(:, :, :)                 *PRHODJ(:, :, :))
+  IF (LBUDGET_RI) CALL BUDGET_STORE_ADD(TBUDGETS(NBUDGET_RI), 'IMLT', -ZW(:, :, :)                 *PRHODJ(:, :, :))
+
+  ZW(:,:,:) = 0.
+  DO JL=1, KSIZE
+    ZW(I1TOT(JL), I2TOT(JL), I3TOT(JL)) = ZTOT_RCBERI(JL) * ZINV_TSTEP
+  END DO
+  IF (LBUDGET_TH) CALL BUDGET_STORE_ADD(TBUDGETS(NBUDGET_TH), 'BERFI',  ZW(:, :, :)*ZZ_DIFF(:, :, :)*PRHODJ(:, :, :))
+  IF (LBUDGET_RC) CALL BUDGET_STORE_ADD(TBUDGETS(NBUDGET_RC), 'BERFI', -ZW(:, :, :)                 *PRHODJ(:, :, :))
+  IF (LBUDGET_RI) CALL BUDGET_STORE_ADD(TBUDGETS(NBUDGET_RI), 'BERFI',  ZW(:, :, :)                 *PRHODJ(:, :, :))
+
+ENDIF
+!
+!***     7.3    Final tendencies
+!
+IF (LBU_ENABLE) THEN
+  IF (LBUDGET_TH) CALL BUDGET_STORE_INIT(TBUDGETS(NBUDGET_TH), 'CORR', PTHS(:, :, :)*PRHODJ(:, :, :))
+  IF (LBUDGET_RV) CALL BUDGET_STORE_INIT(TBUDGETS(NBUDGET_RV), 'CORR', PRVS(:, :, :)*PRHODJ(:, :, :))
+  IF (LBUDGET_RC) CALL BUDGET_STORE_INIT(TBUDGETS(NBUDGET_RC), 'CORR', PRCS(:, :, :)*PRHODJ(:, :, :))
+  IF (LBUDGET_RR) CALL BUDGET_STORE_INIT(TBUDGETS(NBUDGET_RR), 'CORR', PRSS(:, :, :)*PRHODJ(:, :, :))
+  IF (LBUDGET_RI) CALL BUDGET_STORE_INIT(TBUDGETS(NBUDGET_RI), 'CORR', PRIS(:, :, :)*PRHODJ(:, :, :))
+  IF (LBUDGET_RS) CALL BUDGET_STORE_INIT(TBUDGETS(NBUDGET_RS), 'CORR', PRSS(:, :, :)*PRHODJ(:, :, :))
+  IF (LBUDGET_RG) CALL BUDGET_STORE_INIT(TBUDGETS(NBUDGET_RG), 'CORR', PRGS(:, :, :)*PRHODJ(:, :, :))
+  IF (LBUDGET_RH .AND. KRR==7) CALL BUDGET_STORE_INIT(TBUDGETS(NBUDGET_RH), 'CORR', PRHS(:, :, :)*PRHODJ(:, :, :))
+END IF
+
+!NOTE:
+!  This call cannot be moved before the preeceding budget calls because,
+!  with AROME, the BUDGET_STORE_INIT does nothing. The equivalent is done only
+!  once before the physics call and copies of the S variables evolve automatically
+!  internally to the budget (DDH) machinery at each BUDGET_STORE_ADD and
+!  BUDGET_STORE_END calls. Thus, the difference between the DDH internal version
+!  of the S variables and the S variables used in the folowing BUDGET_STORE_END
+!  call must only be due to the correction of negativities.
+!
+!We correct negativities with conservation
+CALL CORRECT_NEGATIVITIES(KIT, KJT, KKT, KRR, PRVS, PRCS, PRRS, &
+                         &PRIS, PRSS, PRGS, &
+                         &PTHS, ZZ_LVFACT, ZZ_LSFACT, PRHS)
+
+IF (LBU_ENABLE) THEN
+  IF (LBUDGET_TH) CALL BUDGET_STORE_END(TBUDGETS(NBUDGET_TH), 'CORR', PTHS(:, :, :)*PRHODJ(:, :, :))
+  IF (LBUDGET_RV) CALL BUDGET_STORE_END(TBUDGETS(NBUDGET_RV), 'CORR', PRVS(:, :, :)*PRHODJ(:, :, :))
+  IF (LBUDGET_RC) CALL BUDGET_STORE_END(TBUDGETS(NBUDGET_RC), 'CORR', PRCS(:, :, :)*PRHODJ(:, :, :))
+  IF (LBUDGET_RR) CALL BUDGET_STORE_END(TBUDGETS(NBUDGET_RR), 'CORR', PRRS(:, :, :)*PRHODJ(:, :, :))
+  IF (LBUDGET_RI) CALL BUDGET_STORE_END(TBUDGETS(NBUDGET_RI), 'CORR', PRIS(:, :, :)*PRHODJ(:, :, :))
+  IF (LBUDGET_RS) CALL BUDGET_STORE_END(TBUDGETS(NBUDGET_RS), 'CORR', PRSS(:, :, :)*PRHODJ(:, :, :))
+  IF (LBUDGET_RG) CALL BUDGET_STORE_END(TBUDGETS(NBUDGET_RG), 'CORR', PRGS(:, :, :)*PRHODJ(:, :, :))
+  IF (LBUDGET_RH .AND. KRR==7) CALL BUDGET_STORE_END(TBUDGETS(NBUDGET_RH), 'CORR', PRHS(:, :, :)*PRHODJ(:, :, :))
 END IF
 !
 !-------------------------------------------------------------------------------
@@ -918,28 +1538,241 @@ END IF
 !*       8.     COMPUTE THE SEDIMENTATION (RS) SOURCE
 !               -------------------------------------
 !
-!*       8.1    time splitting loop initialization
-!
+IF(LSEDIM_AFTER) THEN
+  !
+  !*       8.1     sedimentation
+  !
+  IF (LBUDGET_RC .and. osedic) CALL BUDGET_STORE_INIT(TBUDGETS(NBUDGET_RC), 'SEDI', PRCS(:, :, :) * PRHODJ(:, :, :))
+  IF (LBUDGET_RR)              CALL BUDGET_STORE_INIT(TBUDGETS(NBUDGET_RR), 'SEDI', PRRS(:, :, :) * PRHODJ(:, :, :))
+  IF (LBUDGET_RI)              CALL BUDGET_STORE_INIT(TBUDGETS(NBUDGET_RI), 'SEDI', PRIS(:, :, :) * PRHODJ(:, :, :))
+  IF (LBUDGET_RS)              CALL BUDGET_STORE_INIT(TBUDGETS(NBUDGET_RS), 'SEDI', PRSS(:, :, :) * PRHODJ(:, :, :))
+  IF (LBUDGET_RG)              CALL BUDGET_STORE_INIT(TBUDGETS(NBUDGET_RG), 'SEDI', PRGS(:, :, :) * PRHODJ(:, :, :))
+  IF (LBUDGET_RH .AND. KRR==7) CALL BUDGET_STORE_INIT(TBUDGETS(NBUDGET_RH), 'SEDI', PRHS(:, :, :) * PRHODJ(:, :, :))
+
+  IF(HSEDIM=='STAT') THEN
+    IF (KRR==7) THEN
+      DO JK = 1, KKT
+        DO JJ = 1, KJT
+          DO JI = 1, KIT
+            ZRCT(JI,JJ,JK)=PRCS(JI,JJ,JK)*PTSTEP
+            ZRRT(JI,JJ,JK)=PRRS(JI,JJ,JK)*PTSTEP
+            ZRIT(JI,JJ,JK)=PRIS(JI,JJ,JK)*PTSTEP
+            ZRST(JI,JJ,JK)=PRSS(JI,JJ,JK)*PTSTEP
+            ZRGT(JI,JJ,JK)=PRGS(JI,JJ,JK)*PTSTEP
+            ZRHT(JI,JJ,JK)=PRHS(JI,JJ,JK)*PTSTEP
+          ENDDO
+        ENDDO
+      ENDDO
+      CALL ICE4_SEDIMENTATION_STAT(IIB, IIE, KIT, IJB, IJE, KJT, IKB, IKE, IKTB, IKTE, KKT, KKL, &
+                                  &PTSTEP, KRR, OSEDIC, PDZZ, &
+                                  &PRHODREF, PPABST, PTHT, PRHODJ, &
+                                  &PRCS, ZRCT, PRRS, ZRRT, PRIS, ZRIT,&
+                                  &PRSS, ZRST, PRGS, ZRGT,&
+                                  &PINPRC, PINPRR, ZINPRI, PINPRS, PINPRG, &
+                                  &PSEA=PSEA, PTOWN=PTOWN, &
+                                  &PINPRH=PINPRH, PRHT=ZRHT, PRHS=PRHS, PFPR=PFPR)
+    ELSE
+      DO JK = 1, KKT
+        DO JJ = 1, KJT
+          DO JI = 1, KIT
+            ZRCT(JI,JJ,JK)=PRCS(JI,JJ,JK)*PTSTEP
+            ZRRT(JI,JJ,JK)=PRRS(JI,JJ,JK)*PTSTEP
+            ZRIT(JI,JJ,JK)=PRIS(JI,JJ,JK)*PTSTEP
+            ZRST(JI,JJ,JK)=PRSS(JI,JJ,JK)*PTSTEP
+            ZRGT(JI,JJ,JK)=PRGS(JI,JJ,JK)*PTSTEP
+          ENDDO
+        ENDDO
+      ENDDO
+      CALL ICE4_SEDIMENTATION_STAT(IIB, IIE, KIT, IJB, IJE, KJT, IKB, IKE, IKTB, IKTE, KKT, KKL, &
+                                  &PTSTEP, KRR, OSEDIC, PDZZ, &
+                                  &PRHODREF, PPABST, PTHT, PRHODJ, &
+                                  &PRCS, ZRCT, PRRS, ZRRT, PRIS, ZRIT,&
+                                  &PRSS, ZRST, PRGS, ZRGT,&
+                                  &PINPRC, PINPRR, ZINPRI, PINPRS, PINPRG, &
+                                  &PSEA=PSEA, PTOWN=PTOWN, &
+                                  &PFPR=PFPR)
+    ENDIF
+    PINPRS(:,:) = PINPRS(:,:) + ZINPRI(:,:)
+    !No negativity correction here as we apply sedimentation on PR.S*PTSTEP variables
+  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, KIT, IJB, IJE, KJT, IKB, IKE, IKTB, IKTE, KKT, KKL, &
+                                   &PTSTEP, KRR, OSEDIC, PDZZ, &
+                                   &PRHODREF, PPABST, PTHT, PRHODJ, &
+                                   &PRCS, PRCT, PRRS, PRRT, PRIS, PRIT, PRSS, PRST, PRGS, PRGT,&
+                                   &PINPRC, PINPRR, ZINPRI, PINPRS, PINPRG, &
+                                   &PSEA=PSEA, PTOWN=PTOWN, &
+                                   &PINPRH=PINPRH, PRHT=PRHT, PRHS=PRHS, PFPR=PFPR)
+    ELSE
+      CALL ICE4_SEDIMENTATION_SPLIT(IIB, IIE, KIT, IJB, IJE, KJT, IKB, IKE, IKTB, IKTE, KKT, KKL, &
+                                   &PTSTEP, KRR, OSEDIC, PDZZ, &
+                                   &PRHODREF, PPABST, PTHT, PRHODJ, &
+                                   &PRCS, PRCT, PRRS, PRRT, PRIS, PRIT, PRSS, PRST, PRGS, PRGT,&
+                                   &PINPRC, PINPRR, ZINPRI, PINPRS, PINPRG, &
+                                   &PSEA=PSEA, PTOWN=PTOWN, &
+                                   &PFPR=PFPR)
+    ENDIF
+    PINPRS(:,:) = PINPRS(:,:) + ZINPRI(:,:)
+    !We correct negativities with conservation
+    !SPLI algorith uses a time-splitting. Inside the loop a temporary m.r. is used.
+    !   It is initialized with the m.r. at T and is modified by two tendencies:
+    !   sedimentation tendency and an external tendency which represents all other
+    !   processes (mainly advection and microphysical processes). If both tendencies
+    !   are negative, sedimentation can remove a species at a given sub-timestep. From
+    !   this point sedimentation stops for the remaining sub-timesteps but the other tendency
+    !   will be still active and will lead to negative values.
+    !   We could prevent the algorithm to not consume too much a species, instead we apply
+    !   a correction here.
+    CALL CORRECT_NEGATIVITIES(KIT, KJT, KKT, KRR, PRVS, PRCS, PRRS, &
+                             &PRIS, PRSS, PRGS, &
+                             &PTHS, ZZ_LVFACT, ZZ_LSFACT, PRHS)
+  ELSE
+    CALL PRINT_MSG(NVERB_FATAL, 'GEN', 'RAIN_ICE', 'no sedimentation scheme for HSEDIM='//HSEDIM)
+  END IF
+  !
+  !*       8.2     budget storage
+  !
+  IF (LBUDGET_RC .AND. OSEDIC)   CALL BUDGET_STORE_END(TBUDGETS(NBUDGET_RC), 'SEDI', PRCS(:, :, :) * PRHODJ(:, :, :))
+  IF (LBUDGET_RR)                CALL BUDGET_STORE_END(TBUDGETS(NBUDGET_RR), 'SEDI', PRRS(:, :, :) * PRHODJ(:, :, :))
+  IF (LBUDGET_RI)                CALL BUDGET_STORE_END(TBUDGETS(NBUDGET_RI), 'SEDI', PRIS(:, :, :) * PRHODJ(:, :, :))
+  IF (LBUDGET_RS)                CALL BUDGET_STORE_END(TBUDGETS(NBUDGET_RS), 'SEDI', PRSS(:, :, :) * PRHODJ(:, :, :))
+  IF (LBUDGET_RG)                CALL BUDGET_STORE_END(TBUDGETS(NBUDGET_RG), 'SEDI', PRGS(:, :, :) * PRHODJ(:, :, :))
+  IF (LBUDGET_RH .AND. KRR==7)   CALL BUDGET_STORE_END(TBUDGETS(NBUDGET_RH), 'SEDI', PRHS(:, :, :) * PRHODJ(:, :, :))
+
+  !"sedimentation" of rain fraction
+  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
 !
+!-------------------------------------------------------------------------------
 !
-IF (HSEDIM == 'STAT') THEN
-  CALL RAIN_ICE_SEDIMENTATION_STAT( IIB, IIE, IJB, IJE, IKB, IKE, IKTB, IKTE, IKT, KKL, KRR,                &
-                                    PTSTEP, OSEDIC, PINPRC, PINDEP,                                         &
-                                    PINPRR, PINPRS, PINPRG, PDZZ, PRHODREF, PPABST, PTHT, PRHODJ, PINPRR3D, &
-                                    PRCS, PRCT, PRRS, PRRT, PRIS, PRSS, PRST, PRGS, PRGT,                   &
-                                    PSEA, PTOWN, PINPRH, PRHS, PRHT, PFPR )
-ELSEIF (HSEDIM == 'SPLI') THEN
-  CALL RAIN_ICE_SEDIMENTATION_SPLIT(IIB, IIE, IJB, IJE, IKB, IKE, IKTB, IKTE, IKT, KKL,&
-  KSPLITR,PTSTEP, &
-  KRR,OSEDIC,LDEPOSC,PINPRC,PINDEP,PINPRR,PINPRS,PINPRG,PDZZ,PRHODREF,PPABST,PTHT,PRHODJ,&
-      PINPRR3D,PRCS,PRCT,PRRS,PRRT,PRIS,PRIT,PRSS,PRST,PRGS,PRGT,PSEA,PTOWN,PINPRH,PRHS,PRHT,PFPR)
-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,  &
-                      PRSS(:,:,:)*PTSTEP, PRGS(:,:,:)*PTSTEP)
+!*       9.     COMPUTE THE FOG DEPOSITION TERM 
+!               -------------------------------------
 !
-!-------------------------------------------------------------------------------
+IF (LDEPOSC) THEN !cloud water deposition on vegetation
+  IF (LBU_ENABLE .AND. LBUDGET_RC) &
+     & CALL BUDGET_STORE_INIT(TBUDGETS(NBUDGET_RC), 'DEPO', PRCS(:, :, :)*PRHODJ(:, :, :))
+
+  DO JJ = 1, KJT
+!DEC$ IVDEP
+    DO JI = 1, KIT
+      PINDEP(JI, JJ) = XVDEPOSC * PRCT(JI, JJ, IKB) * PRHODREF(JI, JJ, IKB) / XRHOLW
+      PRCS(JI, JJ, IKB) = PRCS(JI, JJ, IKB) - XVDEPOSC * PRCT(JI, JJ, IKB) / PDZZ(JI, JJ, IKB)
+      PINPRC(JI, JJ) = PINPRC(JI, JJ) + PINDEP(JI, JJ)
+    ENDDO
+  ENDDO
+
+  IF (LBU_ENABLE .AND. LBUDGET_RC) &
+     & CALL BUDGET_STORE_END(TBUDGETS(NBUDGET_RC), 'DEPO', PRCS(:, :, :)*PRHODJ(:, :, :))
+ENDIF
+
+IF (LHOOK) CALL DR_HOOK('RAIN_ICE', 1, ZHOOK_HANDLE)
+!
+CONTAINS
+  !
+  SUBROUTINE CORRECT_NEGATIVITIES(KIT, KJT, KKT, KRR, PRV, PRC, PRR, &
+                                 &PRI, PRS, PRG, &
+                                 &PTH, PLVFACT, PLSFACT, PRH)
+  !
+  IMPLICIT NONE
+  !
+  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 :: ZW
+  INTEGER :: JI, JJ, JK
+  REAL(KIND=JPRB) :: ZHOOK_HANDLE
+  !
+  IF (LHOOK) CALL DR_HOOK('RAIN_ICE:CORRECT_NEGATIVITIES', 0, ZHOOK_HANDLE)
+  !
+  !We correct negativities with conservation
+  DO JK = 1, KKT
+    DO JJ = 1, KJT
+      DO JI = 1, KIT
+        ! 1) deal with negative values for mixing ratio, except for vapor
+        ZW           =PRC(JI,JJ,JK)-MAX(PRC(JI,JJ,JK), 0.)
+        PRV(JI,JJ,JK)=PRV(JI,JJ,JK)+ZW
+        PTH(JI,JJ,JK)=PTH(JI,JJ,JK)-ZW*PLVFACT(JI,JJ,JK)
+        PRC(JI,JJ,JK)=PRC(JI,JJ,JK)-ZW
+
+        ZW           =PRR(JI,JJ,JK)-MAX(PRR(JI,JJ,JK), 0.)
+        PRV(JI,JJ,JK)=PRV(JI,JJ,JK)+ZW
+        PTH(JI,JJ,JK)=PTH(JI,JJ,JK)-ZW*PLVFACT(JI,JJ,JK)
+        PRR(JI,JJ,JK)=PRR(JI,JJ,JK)-ZW
+
+        ZW           =PRI(JI,JJ,JK)-MAX(PRI(JI,JJ,JK), 0.)
+        PRV(JI,JJ,JK)=PRV(JI,JJ,JK)+ZW
+        PTH(JI,JJ,JK)=PTH(JI,JJ,JK)-ZW*PLSFACT(JI,JJ,JK)
+        PRI(JI,JJ,JK)=PRI(JI,JJ,JK)-ZW
+
+        ZW           =PRS(JI,JJ,JK)-MAX(PRS(JI,JJ,JK), 0.)
+        PRV(JI,JJ,JK)=PRV(JI,JJ,JK)+ZW
+        PTH(JI,JJ,JK)=PTH(JI,JJ,JK)-ZW*PLSFACT(JI,JJ,JK)
+        PRS(JI,JJ,JK)=PRS(JI,JJ,JK)-ZW
+
+        ZW           =PRG(JI,JJ,JK)-MAX(PRG(JI,JJ,JK), 0.)
+        PRV(JI,JJ,JK)=PRV(JI,JJ,JK)+ZW
+        PTH(JI,JJ,JK)=PTH(JI,JJ,JK)-ZW*PLSFACT(JI,JJ,JK)
+        PRG(JI,JJ,JK)=PRG(JI,JJ,JK)-ZW
+
+        IF(KRR==7) THEN
+          ZW           =PRH(JI,JJ,JK)-MAX(PRH(JI,JJ,JK), 0.)
+          PRV(JI,JJ,JK)=PRV(JI,JJ,JK)+ZW
+          PTH(JI,JJ,JK)=PTH(JI,JJ,JK)-ZW*PLSFACT(JI,JJ,JK)
+          PRH(JI,JJ,JK)=PRH(JI,JJ,JK)-ZW
+        ENDIF
+
+        ! 2) deal with negative vapor mixing ratio
+
+        ! for rc and ri, we keep ice fraction constant
+        ZW=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* &
+                     &(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*(PRC(JI,JJ,JK)+PRI(JI,JJ,JK))
+        PRC(JI,JJ,JK)=(1.-ZW)*PRC(JI,JJ,JK)
+        PRI(JI,JJ,JK)=(1.-ZW)*PRI(JI,JJ,JK)
+
+        ZW=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
+        PRR(JI,JJ,JK)=PRR(JI,JJ,JK)-ZW
+        PTH(JI,JJ,JK)=PTH(JI,JJ,JK)-ZW*PLVFACT(JI,JJ,JK)
+
+        ZW=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
+        PRS(JI,JJ,JK)=PRS(JI,JJ,JK)-ZW
+        PTH(JI,JJ,JK)=PTH(JI,JJ,JK)-ZW*PLSFACT(JI,JJ,JK)
+
+        ZW=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
+        PRG(JI,JJ,JK)=PRG(JI,JJ,JK)-ZW
+        PTH(JI,JJ,JK)=PTH(JI,JJ,JK)-ZW*PLSFACT(JI,JJ,JK)
+
+        IF(KRR==7) THEN
+          ZW=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
+          PRH(JI,JJ,JK)=PRH(JI,JJ,JK)-ZW
+          PTH(JI,JJ,JK)=PTH(JI,JJ,JK)-ZW*PLSFACT(JI,JJ,JK)
+        ENDIF
+      ENDDO
+    ENDDO
+  ENDDO
+  !
+  IF (LHOOK) CALL DR_HOOK('RAIN_ICE:CORRECT_NEGATIVITIES', 1, ZHOOK_HANDLE)
+  !
+  END SUBROUTINE CORRECT_NEGATIVITIES
+
 !
 END SUBROUTINE RAIN_ICE
diff --git a/src/mesonh/micro/rain_ice_old.f90 b/src/mesonh/micro/rain_ice_old.f90
new file mode 100644
index 0000000000000000000000000000000000000000..abf9dd0c81790afe060f736e1905c7450e3b4036
--- /dev/null
+++ b/src/mesonh/micro/rain_ice_old.f90
@@ -0,0 +1,945 @@
+!!MNH_LIC Copyright 1995-2021 CNRS, Meteo-France and Universite Paul Sabatier
+!!MNH_LIC This is part of the Meso-NH software governed by the CeCILL-C licence
+!!MNH_LIC version 1. See LICENSE, CeCILL-C_V1-en.txt and CeCILL-C_V1-fr.txt
+!!MNH_LIC for details. version 1.
+!!-----------------------------------------------------------------
+!!     ######spl
+!       MODULE MODI_RAIN_ICE_OLD
+!!      ####################
+!!
+!INTERFACE
+!      SUBROUTINE RAIN_ICE_OLD ( OSEDIC,HSEDIM, HSUBG_AUCV, OWARM, KKA, KKU, KKL,      &
+!                            KSPLITR, PTSTEP, KRR,                            &
+!                            PDZZ, PRHODJ, PRHODREF, PEXNREF, PPABST, PCIT, PCLDFR,&
+!                            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,  &
+!                            PRHT, PRHS, PINPRH, PFPR                        )
+!!
+!!
+!LOGICAL,                  INTENT(IN)    :: OSEDIC ! Switch for droplet sedim.
+!CHARACTER(LEN=4),         INTENT(IN)    :: HSEDIM ! Sedimentation scheme
+!CHARACTER(LEN=4),         INTENT(IN)    :: HSUBG_AUCV ! Switch for rc->rr Subgrid autoconversion
+!                                        ! Kind of Subgrid autoconversion method
+!LOGICAL,                  INTENT(IN)    :: OWARM   ! .TRUE. allows raindrops to
+!                                                   !   form by warm processes
+!                                                   !      (Kessler scheme)
+!!
+!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)    :: KSPLITR ! Number of small time step 
+!                                      ! integration for  rain sedimendation
+!REAL,                     INTENT(IN)    :: PTSTEP  ! Double Time step
+!                                                   ! (single if cold start)
+!INTEGER,                  INTENT(IN)    :: KRR     ! Number of moist variable
+!!
+!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(INOUT) :: PINPRC! Cloud instant precip
+!REAL, DIMENSION(:,:),     INTENT(INOUT) :: PINDEP  ! Cloud instant deposition
+!REAL, DIMENSION(:,:),     INTENT(INOUT) :: PINPRR! Rain instant precip
+!REAL, DIMENSION(:,:,:),   INTENT(OUT)   :: PINPRR3D! Rain inst precip 3D
+!REAL, DIMENSION(:,:,:),   INTENT(INOUT) :: PEVAP3D! Rain evap profile
+!REAL, DIMENSION(:,:),     INTENT(INOUT) :: PINPRS! Snow instant precip
+!REAL, DIMENSION(:,:),     INTENT(INOUT) :: 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(INOUT) :: PINPRH! Hail instant precip
+!REAL, DIMENSION(:,:,:,:), OPTIONAL, INTENT(OUT)   :: PFPR ! upper-air precipitation fluxes
+!!
+!END SUBROUTINE RAIN_ICE_OLD
+!END INTERFACE
+!END MODULE MODI_RAIN_ICE_OLD
+!!     ######spl
+!      SUBROUTINE RAIN_ICE_OLD ( OSEDIC,HSEDIM, HSUBG_AUCV, OWARM, KKA, KKU, KKL,      &
+!                            KSPLITR, PTSTEP, KRR,                            &
+!                            PDZZ, PRHODJ, PRHODREF, PEXNREF, PPABST, PCIT, PCLDFR,&
+!                            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,  &
+!                            PRHT, PRHS, PINPRH, PFPR                        )
+!!     ######################################################################
+!!
+!!!****  * -  compute the explicit microphysical sources
+!!!
+!!!    PURPOSE
+!!!    -------
+!!!      The purpose of this routine is to compute the slow microphysical sources
+!!!    which can be computed explicitly
+!!!
+!!!
+!!!**  METHOD
+!!!    ------
+!!!      The autoconversion computation follows Kessler (1969).
+!!!      The sedimentation rate is computed with a time spliting technique and
+!!!    an upstream scheme, written as a difference of non-advective fluxes. This
+!!!    source term is added to the future instant ( split-implicit process ).
+!!!      The others microphysical processes are evaluated at the central instant
+!!!    (split-explicit process ): autoconversion, accretion and rain evaporation.
+!!!      These last 3 terms are bounded in order not to create negative values
+!!!    for the water species at the future instant.
+!!!
+!!!    EXTERNAL
+!!!    --------
+!!!      None
+!!!
+!!!
+!!!    IMPLICIT ARGUMENTS
+!!!    ------------------
+!!!      Module MODD_PARAMETERS
+!!!          JPHEXT       : Horizontal external points number
+!!!          JPVEXT       : Vertical external points number
+!!!      Module MODD_CONF :
+!!!          CCONF configuration of the model for the first time step
+!!!      Module MODD_CST
+!!!          XP00               ! Reference pressure
+!!!          XRD,XRV            ! Gaz  constant for dry air, vapor
+!!!          XMD,XMV            ! Molecular weight for dry air, vapor
+!!!          XCPD               ! Cpd (dry air)
+!!!          XCL                ! Cl (liquid)
+!!!          XCI                ! Ci (solid)
+!!!          XTT                ! Triple point temperature
+!!!          XLVTT              ! Vaporization heat constant
+!!!          XALPW,XBETAW,XGAMW ! Constants for saturation vapor pressure
+!!!                               function over liquid water
+!!!          XALPI,XBETAI,XGAMI ! Constants for saturation vapor pressure
+!!!                               function over solid ice
+!!!
+!!!    REFERENCE
+!!!    ---------
+!!!
+!!!      Book1 and Book2 of documentation ( routine RAIN_ICE_OLD )
+!!!
+!!!    AUTHOR
+!!!    ------
+!!!      J.-P. Pinty      * Laboratoire d'Aerologie*
+!!!
+!!!    MODIFICATIONS
+!!!    -------------
+!!!      Original    02/11/95
+!!!      (J.Viviand) 04/02/97  debug accumulated prcipitation & convert
+!!!                            precipitation rate in m/s
+!!!      (J.-P. Pinty) 17/02/97  add budget calls
+!!!      (J.-P. Pinty) 17/11/97  set ice sedim. for cirrus ice, reset RCHONI
+!!!                              and RRHONG, reverse order for DEALLOCATE
+!!!      (J.-P. Pinty) 11/02/98  correction of the air dynamical viscosity and
+!!!                              add advance of the budget calls
+!!!      (J.-P. Pinty) 18/05/98  correction of the air density in the RIAUTS
+!!!                              process
+!!!      (J.-P. Pinty) 18/11/98  split the main routine
+!!!      (V. Masson)   18/11/98  bug in IVEC1 and IVEC2 upper limits
+!!!      (J. Escobar & J.-P. Pinty)
+!!!                    11/12/98  contains and rewrite count+pack
+!!!      (J. Stein & J.-P. Pinty)
+!!!                    14/10/99  correction for very small RIT
+!!!      (J. Escobar & J.-P. Pinty)
+!!!                    24/07/00  correction for very samll m.r. in
+!!!                              the sedimentation subroutine
+!!!      (M. Tomasini) 11/05/01  Autoconversion of rc into rr modification to take
+!!!                              into account the subgrid variance
+!!!                              (cf Redelsperger & Sommeria JAS 86)
+!!!      (G. Molinie)  21/05/99  bug in RRCFRIG process, RHODREF**(-1) missing
+!!!                              in RSRIMCG
+!!!      (G. Molinie & J.-P. Pinty)
+!!!                    21/06/99  bug in RACCS process
+!!!      (P. Jabouille) 27/05/04 safety test for case where esw/i(T)> pabs (~Z>40km)
+!!!      (J-.P. Chaboureau) 12/02/05  temperature depending ice-to-snow autocon-
+!!                              version threshold (Chaboureau and Pinty GRL 2006)
+!!!      (J.-P. Pinty) 01/01/O1  add the hail category and correction of the
+!!!                              wet growth rate of the graupeln
+!!!      (S.Remy & C.Lac) 06/06 Add the cloud sedimentation
+!!!      (S.Remy & C.Lac) 06/06 Sedimentation becoming the last process
+!!!      to settle the precipitating species created during the current time step
+!!!      (S.Remy & C.Lac) 06/06 Modification of the algorithm of sedimentation
+!!!      to settle n times the precipitating species created during Dt/n instead
+!!!      of Dt
+!!!      (C.Lac) 11/06 Optimization of the sedimentation loop for NEC
+!!!      (J.Escobar) 18/01/2008 Parallel Bug in Budget when IMICRO >= 1
+!!!                  --> Path inhibit this test by IMICRO >= 0 allway true
+!!!      (Y.Seity) 03/2008 Add Statistic sedimentation
+!!!      (Y.Seity) 10/2009 Added condition for the raindrop accretion of the aggregates
+!!!         into graupeln process (5.2.6) to avoid negative graupel mixing ratio
+!!!      (V.Masson, C.Lac) 09/2010 Correction in split sedimentation for
+!!!                                reproducibility
+!!!      (S. Riette) Oct 2010 Better vectorisation of RAIN_ICE_SEDIMENTATION_STAT
+!!!      (Y. Seity), 02-2012  add possibility to run with reversed vertical levels
+!!!      (L. Bengtsson), 02-2013 Passing in land/sea mask and town fraction in
+!!!                      order to use different cloud droplet number conc. over
+!!!                      land, sea and urban areas in the cloud sedimentation.
+!!!      (D. Degrauwe), 2013-11: Export upper-air precipitation fluxes PFPR.
+!!!      (S. Riette) Nov 2013 Protection against null sigma
+!!!      (C. Lac) FIT temporal scheme : instant M removed
+!!!      (JP Pinty), 01-2014 : ICE4 : partial reconversion of hail to graupel
+!!!              July, 2015 (O.Nuissier/F.Duffourg) Add microphysics diagnostic for
+!!!                                      aircraft, ballon and profiler
+!!!      J.Escobar : 15/09/2015 : WENO5 & JPHEXT <> 1
+!!!      C.Lac : 10/2016 : add droplet deposition
+!!!      C.Lac : 01/2017 : correction on droplet deposition
+!!!      J.Escobar : 10/2017 : for real*4 , limit exp() in RAIN_ICE_SLOW with XMNH_HUGE_12_LOG
+!!!      (C. Abiven, Y. Léauté, V. Seigner, S. Riette) Phasing of Turner rain subgrid param
+!!!      J.Escobar : 8/2018 : for real*4 , bis => limit exp() in RAIN_ICE_SLOW with XMNH_HUGE_12_LOG
+!!!      P.Wautelet 01/02/2019: add missing initialization for PFPR
+!!!                   02/2019 C.Lac add rain fraction as an output field
+!!  P. Wautelet 25/02/2019: split rain_ice (cleaner and easier to maintain/debug)
+!!  P. Wautelet 10/04/2019: replace ABORT and STOP calls by Print_msg
+!!  P. Wautelet 28/05/2019: move COUNTJV function to tools.f90
+!!  P. Wautelet 29/05/2019: remove PACK/UNPACK intrinsics (to get more performance and better OpenACC support)
+!!  J. Escobar  09/07/2019: for reproductiblity MPPDB_CHECK, add missing LCHECK test in ZRHODJ de/allocate
+!!  P. Wautelet    02/2020: use the new data structures and subroutines for budgets (no more budget calls in this subroutine)
+!!-----------------------------------------------------------------
+!!
+!!*       0.    DECLARATIONS
+!!              ------------
+!!
+!use modd_budget,         only: lbu_enable
+!use MODD_CONF,           only: LCHECK
+!use MODD_CST,            only: XCI, XCL, XCPD, XCPV, XLSTT, XLVTT, XTT, &
+!                               XALPI, XBETAI, XGAMI, XMD, XMV, XTT
+!use MODD_LES,            only: LLES_CALL
+!use MODD_PARAMETERS,     only: JPVEXT
+!use MODD_PARAM_ICE,      only: CSUBG_PR_PDF, LDEPOSC
+!use MODD_RAIN_ICE_DESCR, only: XLBEXR, XLBR, XRTMIN
+!use MODD_RAIN_ICE_PARAM, only: XCRIAUTC
+!
+!use MODE_MSG
+!use MODE_RAIN_ICE_FAST_RG,             only: RAIN_ICE_FAST_RG
+!use MODE_RAIN_ICE_FAST_RH,             only: RAIN_ICE_FAST_RH
+!use MODE_RAIN_ICE_FAST_RI,             only: RAIN_ICE_FAST_RI
+!use MODE_RAIN_ICE_FAST_RS,             only: RAIN_ICE_FAST_RS
+!use MODE_RAIN_ICE_NUCLEATION,          only: RAIN_ICE_NUCLEATION
+!use MODE_RAIN_ICE_SEDIMENTATION_SPLIT, only: RAIN_ICE_SEDIMENTATION_SPLIT
+!use MODE_RAIN_ICE_SEDIMENTATION_STAT,  only: RAIN_ICE_SEDIMENTATION_STAT
+!use MODE_RAIN_ICE_SLOW,                only: RAIN_ICE_SLOW
+!use MODE_RAIN_ICE_WARM,                only: RAIN_ICE_WARM
+!use mode_tools,                        only: Countjv
+!use mode_tools_ll,                     only: GET_INDICE_ll
+!
+!USE MODE_ICE4_RAINFR_VERT
+!
+!IMPLICIT NONE
+!!
+!!*       0.1   Declarations of dummy arguments :
+!!
+!!
+!!
+!LOGICAL,                  INTENT(IN)    :: OSEDIC ! Switch for droplet sedim.
+!CHARACTER(LEN=4),         INTENT(IN)    :: HSEDIM ! Sedimentation scheme
+!CHARACTER(LEN=4),         INTENT(IN)    :: HSUBG_AUCV ! Switch for rc->rr Subgrid autoconversion
+!                                        ! Kind of Subgrid autoconversion method
+!LOGICAL,                  INTENT(IN)    :: OWARM   ! .TRUE. allows raindrops to
+!                                                   !   form by warm processes
+!                                                   !      (Kessler scheme)
+!!
+!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)    :: KSPLITR ! Number of small time step
+!                                      ! integration for  rain sedimendation
+!REAL,                     INTENT(IN)    :: PTSTEP  ! Double Time step
+!                                                   ! (single if cold start)
+!INTEGER,                  INTENT(IN)    :: KRR     ! Number of moist variable
+!!
+!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(INOUT) :: PINPRC! Cloud instant precip
+!REAL, DIMENSION(:,:),     INTENT(INOUT) :: PINDEP  ! Cloud instant deposition
+!REAL, DIMENSION(:,:),     INTENT(INOUT) :: PINPRR! Rain instant precip
+!REAL, DIMENSION(:,:,:),   INTENT(OUT)   :: PINPRR3D! Rain inst precip 3D
+!REAL, DIMENSION(:,:,:),   INTENT(INOUT) :: PEVAP3D! Rain evap profile
+!REAL, DIMENSION(:,:),     INTENT(INOUT) :: PINPRS! Snow instant precip
+!REAL, DIMENSION(:,:),     INTENT(INOUT) :: 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(INOUT) :: PINPRH! Hail instant precip
+!REAL, DIMENSION(:,:,:,:), 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                           :: IKE,IKTE      !
+!!
+!INTEGER                           :: IMICRO
+!INTEGER, DIMENSION(SIZE(PEXNREF)) :: I1,I2,I3 ! Used to replace the COUNT
+!INTEGER                           :: JL       ! and PACK intrinsics
+!LOGICAL, DIMENSION(SIZE(PEXNREF,1),SIZE(PEXNREF,2),SIZE(PEXNREF,3)) &
+!                                  :: GMICRO ! Test where to compute all processes
+!REAL                              :: ZINVTSTEP
+!REAL                              :: ZCOEFFRCM
+!REAL, DIMENSION(:), ALLOCATABLE   :: ZRVT    ! Water vapor m.r. at t
+!REAL, DIMENSION(:), ALLOCATABLE   :: ZRCT    ! Cloud water m.r. at t
+!REAL, DIMENSION(:), ALLOCATABLE   :: ZRRT    ! Rain water m.r. at t
+!REAL, DIMENSION(:), ALLOCATABLE   :: ZRIT    ! Pristine ice m.r. at t
+!REAL, DIMENSION(:), ALLOCATABLE   :: ZRST    ! Snow/aggregate m.r. at t
+!REAL, DIMENSION(:), ALLOCATABLE   :: ZRGT    ! Graupel m.r. at t
+!REAL, DIMENSION(:), ALLOCATABLE   :: ZRHT    ! Hail m.r. at t
+!REAL, DIMENSION(:), ALLOCATABLE   :: ZCIT    ! Pristine ice conc. at t
+!!
+!REAL, DIMENSION(:), ALLOCATABLE   :: ZRVS    ! Water vapor m.r. source
+!REAL, DIMENSION(:), ALLOCATABLE   :: ZRCS    ! Cloud water m.r. source
+!REAL, DIMENSION(:), ALLOCATABLE   :: ZRRS    ! Rain water m.r. source
+!REAL, DIMENSION(:), ALLOCATABLE   :: ZRIS    ! Pristine ice m.r. source
+!REAL, DIMENSION(:), ALLOCATABLE   :: ZRSS    ! Snow/aggregate m.r. source
+!REAL, DIMENSION(:), ALLOCATABLE   :: ZRGS    ! Graupel m.r. source
+!REAL, DIMENSION(:), ALLOCATABLE   :: ZRHS    ! Hail m.r. source
+!REAL, DIMENSION(:), ALLOCATABLE   :: ZTHS    ! Theta source
+!REAL, DIMENSION(:), ALLOCATABLE   :: ZTHT    ! Potential temperature
+!REAL, DIMENSION(:), ALLOCATABLE   :: ZTHLT   ! Liquid potential temperature
+!!
+!REAL, DIMENSION(:), ALLOCATABLE   :: ZRHODREF, &      ! RHO Dry REFerence
+!                                     ZRHODJ,   &      ! RHO times Jacobian
+!                                     ZZT,      &      ! Temperature
+!                                     ZPRES,    &      ! Pressure
+!                                     ZEXNREF,  &      ! EXNer Pressure REFerence
+!                                     ZZW,      &      ! Work array
+!                                     ZLSFACT,  &      ! L_s/(Pi_ref*C_ph)
+!                                     ZLVFACT,  &      ! L_v/(Pi_ref*C_ph)
+!                                     ZUSW,     &      ! Undersaturation over water
+!                                     ZSSI,     &      ! Supersaturation over ice
+!                                     ZLBDAR,   &      ! Slope parameter of the raindrop  distribution
+!                                     ZLBDAR_RF,&      ! Slope parameter of the raindrop  distribution
+!                                                      ! for the Rain Fraction part
+!                                     ZLBDAS,   &      ! Slope parameter of the aggregate distribution
+!                                     ZLBDAG,   &      ! Slope parameter of the graupel   distribution
+!                                     ZLBDAH,   &      ! Slope parameter of the hail      distribution
+!                                     ZRDRYG,   &      ! Dry growth rate of the graupeln
+!                                     ZRWETG,   &      ! Wet growth rate of the graupeln
+!                                     ZAI,      &      ! Thermodynamical function
+!                                     ZCJ,      &      ! Function to compute the ventilation coefficient
+!                                     ZKA,      &      ! Thermal conductivity of the air
+!                                     ZDV,      &      ! Diffusivity of water vapor in the air
+!                                     ZSIGMA_RC,&      ! Standard deviation of rc at time t
+!                                     ZCF,      &      ! Cloud fraction
+!                                     ZRF,      &      ! Rain 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
+!                                     ZHLC_RCMAX, &    ! HLCLOUDS : maximum value for RC in distribution
+!                                     ZRCRAUTC, &      ! RC value to begin rain formation =XCRIAUTC/RHODREF
+!                                     ZHLC_HRCLOCAL, & ! HLCLOUDS : LWC that is High LWC local in HCF
+!                                     ZHLC_LRCLOCAL    ! HLCLOUDS : LWC that is Low  LWC local in LCF
+!                                                      !    note that ZRC/CF = ZHLC_HRCLOCAL+ ZHLC_LRCLOCAL
+!                                                      !                     = ZHLC_HRC/HCF+ ZHLC_LRC/LCF
+!REAL, DIMENSION(:,:), ALLOCATABLE :: ZZW1 ! Work arrays
+!REAL, DIMENSION(SIZE(PEXNREF,1),SIZE(PEXNREF,2),SIZE(PEXNREF,3))   &
+!                                  :: ZW ! work array
+!REAL, DIMENSION(SIZE(PEXNREF,1),SIZE(PEXNREF,2),SIZE(PEXNREF,3))   &
+!                                  :: ZT ! Temperature
+!!
+!!-------------------------------------------------------------------------------
+!!
+!!*       1.     COMPUTE THE LOOP BOUNDS
+!!               -----------------------
+!!
+!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
+!!
+!!
+!ZINVTSTEP=1./PTSTEP
+!!
+!!
+!!*       2.     COMPUTES THE SLOW COLD PROCESS SOURCES
+!!               --------------------------------------
+!!
+!CALL RAIN_ICE_NUCLEATION(IIB, IIE, IJB, IJE, IKTB, IKTE,KRR,PTSTEP,&
+!     PTHT,PPABST,PRHODJ,PRHODREF,PRVT,PRCT,PRRT,PRIT,PRST,PRGT,&
+!     PCIT,PEXNREF,PTHS,PRVS,PRIS,ZT,PRHT)
+!!
+!!
+!!  optimization by looking for locations where
+!!  the microphysical fields are larger than a minimal value only !!!
+!!
+!GMICRO(:,:,:) = .FALSE.
+!
+! IF ( KRR == 7 ) THEN
+!  GMICRO(IIB:IIE,IJB:IJE,IKTB:IKTE) =                          &
+!                PRCT(IIB:IIE,IJB:IJE,IKTB:IKTE)>XRTMIN(2) .OR. &
+!                PRRT(IIB:IIE,IJB:IJE,IKTB:IKTE)>XRTMIN(3) .OR. &
+!                PRIT(IIB:IIE,IJB:IJE,IKTB:IKTE)>XRTMIN(4) .OR. &
+!                PRST(IIB:IIE,IJB:IJE,IKTB:IKTE)>XRTMIN(5) .OR. &
+!                PRGT(IIB:IIE,IJB:IJE,IKTB:IKTE)>XRTMIN(6) .OR. &
+!                PRHT(IIB:IIE,IJB:IJE,IKTB:IKTE)>XRTMIN(7)
+! ELSE IF( KRR == 6 ) THEN
+!  GMICRO(IIB:IIE,IJB:IJE,IKTB:IKTE) =                          &
+!                PRCT(IIB:IIE,IJB:IJE,IKTB:IKTE)>XRTMIN(2) .OR. &
+!                PRRT(IIB:IIE,IJB:IJE,IKTB:IKTE)>XRTMIN(3) .OR. &
+!                PRIT(IIB:IIE,IJB:IJE,IKTB:IKTE)>XRTMIN(4) .OR. &
+!                PRST(IIB:IIE,IJB:IJE,IKTB:IKTE)>XRTMIN(5) .OR. &
+!                PRGT(IIB:IIE,IJB:IJE,IKTB:IKTE)>XRTMIN(6)
+! END IF
+!
+!IMICRO = COUNTJV( GMICRO(:,:,:),I1(:),I2(:),I3(:))
+!IF( IMICRO >= 0 ) THEN
+!  ALLOCATE(ZRVT(IMICRO))
+!  ALLOCATE(ZRCT(IMICRO))
+!  ALLOCATE(ZRRT(IMICRO))
+!  ALLOCATE(ZRIT(IMICRO))
+!  ALLOCATE(ZRST(IMICRO))
+!  ALLOCATE(ZRGT(IMICRO))
+!  IF ( KRR == 7 ) THEN
+!    ALLOCATE(ZRHT(IMICRO))
+!  ELSE
+!    ALLOCATE(ZRHT(0))
+!  END IF
+!  ALLOCATE(ZCIT(IMICRO))
+!  ALLOCATE(ZRVS(IMICRO))
+!  ALLOCATE(ZRCS(IMICRO))
+!  ALLOCATE(ZRRS(IMICRO))
+!  ALLOCATE(ZRIS(IMICRO))
+!  ALLOCATE(ZRSS(IMICRO))
+!  ALLOCATE(ZRGS(IMICRO))
+!  IF ( KRR == 7 ) THEN
+!    ALLOCATE(ZRHS(IMICRO))
+!  ELSE
+!    ALLOCATE(ZRHS(0))
+!  END IF
+!  ALLOCATE(ZTHS(IMICRO))
+!  ALLOCATE(ZTHT(IMICRO))
+!  ALLOCATE(ZTHLT(IMICRO))
+!  ALLOCATE(ZRHODREF(IMICRO))
+!  ALLOCATE(ZZT(IMICRO))
+!  ALLOCATE(ZPRES(IMICRO))
+!  ALLOCATE(ZEXNREF(IMICRO))
+!  ALLOCATE(ZSIGMA_RC(IMICRO))
+!  ALLOCATE(ZCF(IMICRO))
+!  ALLOCATE(ZRF(IMICRO))
+!  ALLOCATE(ZHLC_HCF(IMICRO))
+!  ALLOCATE(ZHLC_LCF(IMICRO))
+!  ALLOCATE(ZHLC_HRC(IMICRO))
+!  ALLOCATE(ZHLC_LRC(IMICRO))
+!  ALLOCATE(ZHLC_RCMAX(IMICRO))
+!  ALLOCATE(ZRCRAUTC(IMICRO))
+!  ALLOCATE(ZHLC_HRCLOCAL(IMICRO))
+!  ALLOCATE(ZHLC_LRCLOCAL(IMICRO))
+!
+!  DO JL=1,IMICRO
+!    ZRVT(JL) = PRVT(I1(JL),I2(JL),I3(JL))
+!    ZRCT(JL) = PRCT(I1(JL),I2(JL),I3(JL))
+!    ZRRT(JL) = PRRT(I1(JL),I2(JL),I3(JL))
+!    ZRIT(JL) = PRIT(I1(JL),I2(JL),I3(JL))
+!    ZRST(JL) = PRST(I1(JL),I2(JL),I3(JL))
+!    ZRGT(JL) = PRGT(I1(JL),I2(JL),I3(JL))
+!    IF ( KRR == 7 ) ZRHT(JL) = PRHT(I1(JL),I2(JL),I3(JL))
+!    ZCIT(JL) = PCIT(I1(JL),I2(JL),I3(JL))
+!    ZCF(JL) = PCLDFR(I1(JL),I2(JL),I3(JL))
+!    IF ( HSUBG_AUCV == 'PDF ' .AND. CSUBG_PR_PDF == 'SIGM' ) THEN
+!      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)
+!    END IF
+!    ZRVS(JL) = PRVS(I1(JL),I2(JL),I3(JL))
+!    ZRCS(JL) = PRCS(I1(JL),I2(JL),I3(JL))
+!    ZRRS(JL) = PRRS(I1(JL),I2(JL),I3(JL))
+!    ZRIS(JL) = PRIS(I1(JL),I2(JL),I3(JL))
+!    ZRSS(JL) = PRSS(I1(JL),I2(JL),I3(JL))
+!    ZRGS(JL) = PRGS(I1(JL),I2(JL),I3(JL))
+!    IF ( KRR == 7 ) ZRHS(JL) = PRHS(I1(JL),I2(JL),I3(JL))
+!    ZTHS(JL) = PTHS(I1(JL),I2(JL),I3(JL))
+!!
+!    ZRHODREF(JL) = PRHODREF(I1(JL),I2(JL),I3(JL))
+!    ZZT(JL) = ZT(I1(JL),I2(JL),I3(JL))
+!    ZTHT(JL) = PTHT(I1(JL),I2(JL),I3(JL))
+!    ZTHLT(JL) = ZTHT(JL) - XLVTT * ZTHT(JL) / XCPD / ZZT(JL) * ZRCT(JL)
+!    ZPRES(JL) = PPABST(I1(JL),I2(JL),I3(JL))
+!    ZEXNREF(JL) = PEXNREF(I1(JL),I2(JL),I3(JL))
+!  ENDDO
+!  ALLOCATE(ZZW(IMICRO))
+!  ALLOCATE(ZLSFACT(IMICRO))
+!  ALLOCATE(ZLVFACT(IMICRO))
+!    ZZW(:)  = ZEXNREF(:)*( XCPD+XCPV*ZRVT(:)+XCL*(ZRCT(:)+ZRRT(:)) &
+!                                    +XCI*(ZRIT(:)+ZRST(:)+ZRGT(:)) )
+!    ZLSFACT(:) = (XLSTT+(XCPV-XCI)*(ZZT(:)-XTT))/ZZW(:) ! L_s/(Pi_ref*C_ph)
+!    ZLVFACT(:) = (XLVTT+(XCPV-XCL)*(ZZT(:)-XTT))/ZZW(:) ! L_v/(Pi_ref*C_ph)
+!  ALLOCATE(ZUSW(IMICRO))
+!  ALLOCATE(ZSSI(IMICRO))
+!    ZZW(:) = EXP( XALPI - XBETAI/ZZT(:) - XGAMI*ALOG(ZZT(:) ) )
+!    ZSSI(:) = ZRVT(:)*( ZPRES(:)-ZZW(:) ) / ( (XMV/XMD) * ZZW(:) ) - 1.0
+!                                                      ! Supersaturation over ice
+!!
+!  ALLOCATE(ZLBDAR(IMICRO))
+!  ALLOCATE(ZLBDAR_RF(IMICRO))
+!  ALLOCATE(ZLBDAS(IMICRO))
+!  ALLOCATE(ZLBDAG(IMICRO))
+!  IF ( KRR == 7 ) THEN
+!    ALLOCATE(ZLBDAH(IMICRO))
+!  ELSE
+!    ALLOCATE(ZLBDAH(0))
+!  END IF
+!  ALLOCATE(ZRDRYG(IMICRO))
+!  ALLOCATE(ZRWETG(IMICRO))
+!  ALLOCATE(ZAI(IMICRO))
+!  ALLOCATE(ZCJ(IMICRO))
+!  ALLOCATE(ZKA(IMICRO))
+!  ALLOCATE(ZDV(IMICRO))
+!!
+!  IF ( KRR == 7 ) THEN
+!    ALLOCATE(ZZW1(IMICRO,7))
+!  ELSE IF( KRR == 6 ) THEN
+!    ALLOCATE(ZZW1(IMICRO,6))
+!  ENDIF
+!!
+!  IF (LBU_ENABLE .OR. LLES_CALL .OR. LCHECK ) THEN
+!    ALLOCATE(ZRHODJ(IMICRO))
+!    DO JL=1,IMICRO
+!      ZRHODJ(JL) = PRHODJ(I1(JL),I2(JL),I3(JL))
+!    END DO
+!  ELSE
+!    ALLOCATE(ZRHODJ(0))
+!  END IF
+!!
+!
+!  !Cloud water split between high and low content part is done here
+!  !according to autoconversion option
+!  ZRCRAUTC(:)   = XCRIAUTC/ZRHODREF(:) ! Autoconversion rc threshold
+!  IF (HSUBG_AUCV == 'NONE') THEN
+!    !Cloud water is entirely in low or high part
+!    WHERE (ZRCT(:) > ZRCRAUTC(:))
+!      ZHLC_HCF(:) = 1.
+!      ZHLC_LCF(:) = 0.0
+!      ZHLC_HRC(:) = ZRCT(:)
+!      ZHLC_LRC(:) = 0.0
+!      ZRF(:)      = 1.
+!    ELSEWHERE (ZRCT(:) > XRTMIN(2))
+!      ZHLC_HCF(:) = 0.0
+!      ZHLC_LCF(:) = 1.
+!      ZHLC_HRC(:) = 0.0
+!      ZHLC_LRC(:) = ZRCT(:)
+!      ZRF(:)      = 0.
+!    ELSEWHERE
+!      ZHLC_HCF(:) = 0.0
+!      ZHLC_LCF(:) = 0.0
+!      ZHLC_HRC(:) = 0.0
+!      ZHLC_LRC(:) = 0.0
+!      ZRF(:)      = 0.
+!    END WHERE
+!
+!  ELSEIF (HSUBG_AUCV == 'CLFR') THEN
+!    !Cloud water is only in the cloudy part and entirely in low or high part
+!      WHERE (ZCF(:) > 0. .AND. ZRCT(:) > ZRCRAUTC(:)*ZCF(:))
+!        ZHLC_HCF(:) = ZCF(:)
+!        ZHLC_LCF(:) = 0.0
+!        ZHLC_HRC(:) = ZRCT(:)
+!        ZHLC_LRC(:) = 0.0
+!        ZRF(:)      = ZCF(:)
+!      ELSEWHERE (ZCF(:) > 0. .AND. ZRCT(:) > XRTMIN(2))
+!        ZHLC_HCF(:) = 0.0
+!        ZHLC_LCF(:) = ZCF(:)
+!        ZHLC_HRC(:) = 0.0
+!        ZHLC_LRC(:) = ZRCT(:)
+!        ZRF(:)      = 0.
+!      ELSEWHERE (ZCF(:) > 0.)
+!        ZHLC_HCF(:) = 0.0
+!        ZHLC_LCF(:) = 0.0
+!        ZHLC_HRC(:) = 0.0
+!        ZHLC_LRC(:) = 0.0
+!        ZRF(:)      = 0.
+!      ELSEWHERE
+!        ZHLC_HCF(:) = 0.0
+!        ZHLC_LCF(:) = 0.0
+!        ZHLC_HRC(:) = 0.0
+!        ZHLC_LRC(:) = 0.0
+!        ZRF(:)      = 0.
+!      END WHERE
+!
+!  ELSEIF (HSUBG_AUCV == 'PDF ') THEN
+!    !Cloud water is split between high and low part according to a PDF
+!    !    'HLCRECTPDF'    : rectangular PDF form
+!    !    'HLCTRIANGPDF'  : triangular PDF form
+!    !    'HLCQUADRAPDF'  : second order quadratic PDF form
+!    !    'HLCISOTRIPDF'  : isocele triangular PDF
+!    !    'SIGM'          : Redelsperger and Sommeria (1986)
+!
+!    IF ( CSUBG_PR_PDF == 'SIGM' ) THEN
+!      ! Redelsperger and Sommeria (1986) but organised according to Turner (2011, 2012)
+!      WHERE ( ZRCT(:) > ZRCRAUTC(:) + ZSIGMA_RC(:))
+!        ZHLC_HCF(:) = 1.
+!        ZHLC_LCF(:) = 0.0
+!        ZHLC_HRC(:) = ZRCT(:)
+!        ZHLC_LRC(:) = 0.0
+!        ZRF(:)      = 1.
+!      ELSEWHERE ( ZRCT(:) >  ( ZRCRAUTC(:) - ZSIGMA_RC(:) ) .AND. &
+!                & ZRCT(:) <= ( ZRCRAUTC(:) + ZSIGMA_RC(:) )       )
+!        ZHLC_HCF(:) = (ZRCT(:)+ZSIGMA_RC(:)-ZRCRAUTC(:))/ &
+!                     &(2.*ZSIGMA_RC(:))
+!        ZHLC_LCF(:) = MAX(0., ZCF(:)-ZHLC_HCF(:))
+!        ZHLC_HRC(:) = (ZRCT(:)+ZSIGMA_RC(:)-ZRCRAUTC(:))* &
+!                     &(ZRCT(:)+ZSIGMA_RC(:)+ZRCRAUTC(:))/ &
+!                     &(4.*ZSIGMA_RC(:))
+!        ZHLC_LRC(:) = MAX(0., ZRCT(:)-ZHLC_HRC(:))
+!        ZRF(:)      = ZHLC_HCF(:)
+!      ELSEWHERE ( ZRCT(:)>XRTMIN(2) .AND. ZCF(:)>0. )
+!        ZHLC_LCF(:) = 0.0
+!        ZHLC_LCF(:) = ZCF(:)
+!        ZHLC_HRC(:) = 0.0
+!        ZHLC_LRC(:) = ZRCT(:)
+!        ZRF(:)      = 0.
+!      ELSEWHERE
+!        ZHLC_HCF(:) = 0.0
+!        ZHLC_LCF(:) = 0.0
+!        ZHLC_HRC(:) = 0.0
+!        ZHLC_LRC(:) = 0.0
+!        ZRF(:)      = 0.
+!      END WHERE
+!
+!    ! Turner (2011, 2012)
+!    ELSEIF ( CSUBG_PR_PDF== 'HLCRECTPDF' .OR. CSUBG_PR_PDF == 'HLCISOTRIPDF' .OR. &
+!           & CSUBG_PR_PDF == 'HLCTRIANGPDF' .OR. CSUBG_PR_PDF == 'HLCQUADRAPDF' ) THEN
+!      ! Calculate maximum value r_cM from PDF forms
+!      IF ( CSUBG_PR_PDF == 'HLCRECTPDF' .OR. CSUBG_PR_PDF == 'HLCISOTRIPDF' ) THEN
+!        ZCOEFFRCM = 2.0
+!      ELSE IF ( CSUBG_PR_PDF == 'HLCTRIANGPDF' ) THEN
+!        ZCOEFFRCM = 3.0
+!      ELSE IF ( CSUBG_PR_PDF == 'HLCQUADRAPDF' ) THEN
+!        ZCOEFFRCM = 4.0
+!      END IF
+!      WHERE (ZRCT(:).GT.0. .AND. ZCF(:).GT.0.)
+!        ZHLC_RCMAX(:) = ZCOEFFRCM * ZRCT(:) / ZCF(:)
+!      END WHERE
+!
+!      ! Split available water and cloud fraction in two parts
+!      ! Calculate local mean values int he low and high parts for the 3 PDF forms:
+!      IF ( CSUBG_PR_PDF == 'HLCRECTPDF' ) THEN
+!        WHERE (ZRCT(:).GT.0. .AND. ZCF(:).GT.0. .AND. ZHLC_RCMAX(:).GT.ZRCRAUTC(:))
+!          ZHLC_LRCLOCAL(:) = 0.5*ZRCRAUTC(:)
+!          ZHLC_HRCLOCAL(:) = ( ZHLC_RCMAX(:) + ZRCRAUTC(:)) / 2.0
+!        END WHERE
+!      ELSE IF ( CSUBG_PR_PDF == 'HLCTRIANGPDF' ) THEN
+!        WHERE (ZRCT(:).GT.0. .AND. ZCF(:).GT.0. .AND. ZHLC_RCMAX(:).GT.ZRCRAUTC(:))
+!          ZHLC_LRCLOCAL(:) = ( ZRCRAUTC(:) *(3.0 * ZHLC_RCMAX(:) - 2.0 * ZRCRAUTC(:) ) ) &
+!                          / (3.0 * (2.0 * ZHLC_RCMAX(:) - ZRCRAUTC(:)  ) )
+!          ZHLC_HRCLOCAL(:) = (ZHLC_RCMAX(:) + 2.0*ZRCRAUTC(:)) / 3.0
+!        END WHERE
+!      ELSE IF ( CSUBG_PR_PDF == 'HLCQUADRAPDF' ) THEN
+!        WHERE (ZRCT(:).GT.0. .AND. ZCF(:).GT.0. .AND. ZHLC_RCMAX(:).GT.ZRCRAUTC(:))
+!          ZHLC_LRCLOCAL(:) = (3.0 *ZRCRAUTC(:)**3 - 8.0 *ZRCRAUTC(:)**2 * ZHLC_RCMAX(:) &
+!                          + 6.0*ZRCRAUTC(:) *ZHLC_RCMAX(:)**2 ) &
+!                          / &
+!                          (4.0* ZRCRAUTC(:)**2 -12.0*ZRCRAUTC(:) *ZHLC_RCMAX(:) &
+!                          + 12.0 * ZHLC_RCMAX(:)**2 )
+!          ZHLC_HRCLOCAL(:) =  (ZHLC_RCMAX(:) + 3.0*ZRCRAUTC(:)) / 4.0
+!        END WHERE
+!      ELSE IF ( CSUBG_PR_PDF == 'HLCISOTRIPDF' ) THEN
+!        WHERE (ZRCT(:).GT.0. .AND. ZCF(:).GT.0. .AND. ZHLC_RCMAX(:).GT.ZRCRAUTC(:))
+!          WHERE ( (ZRCT(:) / ZCF(:)).LE.ZRCRAUTC(:) )
+!            ZHLC_LRCLOCAL(:) = ( (ZHLC_RCMAX(:))**3 &
+!                             - (12.0 * (ZHLC_RCMAX(:))*(ZRCRAUTC(:))**2) &
+!                             + (8.0 * ZRCRAUTC(:)**3) ) &
+!                             / ( (6.0 * (ZHLC_RCMAX(:))**2) &
+!                             - (24.0 * (ZHLC_RCMAX(:)) * ZRCRAUTC(:)) &
+!                             + (12.0 * ZRCRAUTC(:)**2) )
+!            ZHLC_HRCLOCAL(:) = ( ZHLC_RCMAX(:) + 2.0 * ZRCRAUTC(:) ) / 3.0
+!          ELSEWHERE
+!            ZHLC_LRCLOCAL(:) = (2.0/3.0) * ZRCRAUTC(:)
+!            ZHLC_HRCLOCAL(:) = (3.0*ZHLC_RCMAX(:)**3 - 8.0*ZRCRAUTC(:)**3) &
+!                             / (6.0 * ZHLC_RCMAX(:)**2 - 12.0*ZRCRAUTC(:)**2)
+!          END WHERE
+!        END WHERE
+!      END IF
+!
+!      ! Compare r_cM  to r_cR to know if cloud water content is high enough to split in two parts or not
+!      WHERE (ZRCT(:).GT.0. .AND. ZCF(:).GT.0. .AND. ZHLC_RCMAX(:).GT.ZRCRAUTC(:))
+!        ! Calculate final values for LCF and HCF:
+!        ZHLC_LCF(:) = ZCF(:) &
+!                       * ( ZHLC_HRCLOCAL - &
+!                       ( ZRCT(:) / ZCF(:) ) ) &
+!                       / (ZHLC_HRCLOCAL - ZHLC_LRCLOCAL)
+!        ZHLC_HCF(:) = MAX(0., ZCF(:) - ZHLC_LCF(:))
+!        !
+!        ! Calculate final values for LRC and HRC:
+!        ZHLC_LRC(:) = ZHLC_LRCLOCAL * ZHLC_LCF(:)
+!        ZHLC_HRC(:) = MAX(0., ZRCT(:) - ZHLC_LRC(:))
+!      ELSEWHERE (ZRCT(:).GT.0. .AND. ZCF(:).GT.0. .AND. ZHLC_RCMAX(:).LE.ZRCRAUTC(:))
+!        ! Put all available cloud water and his fraction in the low part
+!        ZHLC_LCF(:) = ZCF(:)
+!        ZHLC_HCF(:) = 0.0
+!        ZHLC_LRC(:) = ZRCT(:)
+!        ZHLC_HRC(:) = 0.0
+!      ELSEWHERE
+!        ZHLC_LCF(:) = 0.
+!        ZHLC_HCF(:) = 0.0
+!        ZHLC_LRC(:) = 0.
+!        ZHLC_HRC(:) = 0.0
+!      END WHERE
+!
+!      ZRF(:)=ZHLC_HCF(:) !Precipitation fraction
+!
+!    ELSE
+!      !wrong CSUBG_PR_PDF case
+!      WRITE(*,*) 'wrong CSUBG_PR_PDF case'
+!      CALL PRINT_MSG(NVERB_FATAL,'GEN','RAIN_ICE_OLD','')      
+!    ENDIF
+!  ELSE
+!    !wrong HSUBG_AUCV case
+!    WRITE(*,*)'wrong HSUBG_AUCV case'
+!    CALL PRINT_MSG(NVERB_FATAL,'GEN','RAIN_ICE_OLD','')  
+!  ENDIF
+!
+!  !Diagnostic of precipitation fraction
+!  PRAINFR(:,:,:) = 0.
+!  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(:,:,:),      &
+!                         RESHAPE( SOURCE = [ ( 0., JL = 1, SIZE( PRSS ) ) ], SHAPE = SHAPE( PRSS ) ), &
+!                         RESHAPE( SOURCE = [ ( 0., JL = 1, SIZE( PRGS ) ) ], SHAPE = SHAPE( PRGS ) )  )
+!  DO JL=1,IMICRO
+!    ZRF(JL)=PRAINFR(I1(JL),I2(JL),I3(JL))
+!  END DO
+!!
+!  CALL RAIN_ICE_SLOW(GMICRO, ZINVTSTEP, ZRHODREF,                      &
+!                     ZRCT, ZRRT, ZRIT, ZRST, ZRGT, ZRHODJ, ZZT, ZPRES, &
+!                     ZLSFACT, ZLVFACT, ZSSI,                           &
+!                     ZRVS, ZRCS, ZRRS, ZRIS, ZRSS, ZRGS, ZTHS,         &
+!                     ZAI, ZCJ, ZKA, ZDV, ZLBDAS, ZLBDAG)
+!!
+!!-------------------------------------------------------------------------------
+!!
+!!
+!!*       3.     COMPUTES THE SLOW WARM PROCESS SOURCES
+!!               --------------------------------------
+!!
+!!*       3.1    compute the slope parameter Lbda_r
+!!
+!  !ZLBDAR will be used when we consider rain diluted over the grid box
+!  WHERE( ZRRT(:)>0.0 )
+!    ZLBDAR(:)  = XLBR*( ZRHODREF(:)*MAX( ZRRT(:),XRTMIN(3) ) )**XLBEXR
+!  END WHERE
+!  !ZLBDAR_RF will be used when we consider rain concentrated in its fraction
+!  WHERE( ZRRT(:)>0.0 .AND. ZRF(:)>0.0 )
+!    ZLBDAR_RF(:)  = XLBR*( ZRHODREF(:) *MAX( ZRRT(:)/ZRF(:)  , XRTMIN(3) ) )**XLBEXR
+!  ELSEWHERE
+!    ZLBDAR_RF(:)  = 0.
+!  END WHERE
+!!
+!  IF( OWARM ) THEN    !  Check if the formation of the raindrops by the slow
+!                      !  warm processes is allowed
+!    PEVAP3D(:,:,:)= 0.
+!    CALL RAIN_ICE_WARM(GMICRO, IMICRO, I1, I2, I3,                                                           &
+!                       ZRHODREF, ZRVT, ZRCT, ZRRT, ZHLC_HCF, ZHLC_LCF, ZHLC_HRC, ZHLC_LRC,                   &
+!                       ZRHODJ, ZPRES, ZZT, ZLBDAR, ZLBDAR_RF, ZLVFACT, ZCJ, ZKA, ZDV, ZRF, ZCF, ZTHT, ZTHLT, &
+!                       ZRVS, ZRCS, ZRRS, ZTHS, ZUSW, PEVAP3D)
+!  END IF
+!!
+!!-------------------------------------------------------------------------------
+!!
+!!
+!!*       4.     COMPUTES THE FAST COLD PROCESS SOURCES FOR r_s
+!!               ----------------------------------------------
+!!
+!  CALL RAIN_ICE_FAST_RS(PTSTEP, GMICRO, ZRHODREF, ZRVT, ZRCT, ZRRT, ZRST, ZRHODJ, ZPRES, ZZT, &
+!                        ZLBDAR, ZLBDAS, ZLSFACT, ZLVFACT, ZCJ, ZKA, ZDV, &
+!                        ZRCS, ZRRS, ZRSS, ZRGS, ZTHS)
+!!
+!!-------------------------------------------------------------------------------
+!!
+!!
+!!*       5.     COMPUTES THE FAST COLD PROCESS SOURCES FOR r_g
+!!               ----------------------------------------------
+!!
+!  CALL RAIN_ICE_FAST_RG(KRR, GMICRO, ZRHODREF, ZRVT, ZRCT, ZRRT, ZRIT, ZRST, ZRGT, ZCIT, &
+!                        ZRHODJ, ZPRES, ZZT, ZLBDAR, ZLBDAS, ZLBDAG, ZLSFACT, ZLVFACT, &
+!                        ZCJ, ZKA, ZDV, &
+!                        ZRCS, ZRRS, ZRIS, ZRSS, ZRGS, ZRHS, ZTHS, &
+!                        ZUSW, ZRDRYG, ZRWETG)
+!!
+!!-------------------------------------------------------------------------------
+!!
+!!
+!!*       6.     COMPUTES THE FAST COLD PROCESS SOURCES FOR r_h
+!!               ----------------------------------------------
+!!
+! IF ( KRR == 7 ) THEN
+!  CALL RAIN_ICE_FAST_RH(GMICRO, ZRHODREF, ZRVT, ZRCT, ZRIT, ZRST, ZRGT, ZRHT, ZRHODJ, ZPRES, &
+!                        ZZT, ZLBDAS, ZLBDAG, ZLBDAH, ZLSFACT, ZLVFACT, ZCJ, ZKA, ZDV, &
+!                        ZRCS, ZRRS, ZRIS, ZRSS, ZRGS, ZRHS, ZTHS, ZUSW)
+! END IF
+!!
+!!-------------------------------------------------------------------------------
+!!
+!!
+!!*       7.     COMPUTES SPECIFIC SOURCES OF THE WARM AND COLD CLOUDY SPECIES
+!!               -------------------------------------------------------------
+!!
+!  CALL RAIN_ICE_FAST_RI(GMICRO, ZRHODREF, ZRIT, ZRHODJ, ZZT, ZSSI, ZLSFACT, ZLVFACT, &
+!                        ZAI, ZCJ, ZCIT, ZRCS, ZRIS, ZTHS)
+!!
+!!
+!!-------------------------------------------------------------------------------
+!!
+!!
+!!
+!  DO JL=1,IMICRO
+!    PRVS(I1(JL),I2(JL),I3(JL)) = ZRVS(JL)
+!    PRCS(I1(JL),I2(JL),I3(JL)) = ZRCS(JL)
+!    PRRS(I1(JL),I2(JL),I3(JL)) = ZRRS(JL)
+!    PRIS(I1(JL),I2(JL),I3(JL)) = ZRIS(JL)
+!    PRSS(I1(JL),I2(JL),I3(JL)) = ZRSS(JL)
+!    PRGS(I1(JL),I2(JL),I3(JL)) = ZRGS(JL)
+!    PTHS(I1(JL),I2(JL),I3(JL)) = ZTHS(JL)
+!    PCIT(I1(JL),I2(JL),I3(JL)) = ZCIT(JL)
+!    !
+!    PRAINFR(I1(JL),I2(JL),I3(JL)) = ZRF(JL)
+!  END DO
+!  IF ( KRR == 7 ) THEN
+!    DO JL=1,IMICRO
+!      PRHS(I1(JL),I2(JL),I3(JL)) = ZRHS(JL)
+!    END DO
+!  END IF
+!!
+!!
+!!
+!  DEALLOCATE(ZZW1)
+!  DEALLOCATE(ZDV)
+!  DEALLOCATE(ZCJ)
+!  DEALLOCATE(ZRDRYG)
+!  DEALLOCATE(ZRWETG)
+!  DEALLOCATE(ZLBDAG)
+!  DEALLOCATE(ZLBDAH)
+!  DEALLOCATE(ZLBDAS)
+!  DEALLOCATE(ZLBDAR)
+!  DEALLOCATE(ZLBDAR_RF)
+!  DEALLOCATE(ZSSI)
+!  DEALLOCATE(ZUSW)
+!  DEALLOCATE(ZLVFACT)
+!  DEALLOCATE(ZLSFACT)
+!  DEALLOCATE(ZZW)
+!  DEALLOCATE(ZEXNREF)
+!  DEALLOCATE(ZPRES)
+!  DEALLOCATE(ZRHODREF)
+!  DEALLOCATE(ZZT)
+!  IF(LBU_ENABLE .OR. LLES_CALL .OR. LCHECK ) DEALLOCATE(ZRHODJ)
+!  DEALLOCATE(ZTHS)
+!  DEALLOCATE(ZTHT)
+!  DEALLOCATE(ZTHLT)
+!  DEALLOCATE(ZRHS)
+!  DEALLOCATE(ZRGS)
+!  DEALLOCATE(ZRSS)
+!  DEALLOCATE(ZRIS)
+!  DEALLOCATE(ZRRS)
+!  DEALLOCATE(ZRCS)
+!  DEALLOCATE(ZRVS)
+!  DEALLOCATE(ZCIT)
+!  DEALLOCATE(ZRGT)
+!  DEALLOCATE(ZRHT)
+!  DEALLOCATE(ZRST)
+!  DEALLOCATE(ZRIT)
+!  DEALLOCATE(ZRRT)
+!  DEALLOCATE(ZAI)
+!  DEALLOCATE(ZRCT)
+!  DEALLOCATE(ZKA)
+!  DEALLOCATE(ZRVT)
+!  DEALLOCATE(ZSIGMA_RC)
+!  DEALLOCATE(ZCF)
+!  DEALLOCATE(ZRF)
+!  DEALLOCATE(ZHLC_HCF)
+!  DEALLOCATE(ZHLC_LCF)
+!  DEALLOCATE(ZHLC_HRC)
+!  DEALLOCATE(ZHLC_LRC)
+!  DEALLOCATE(ZHLC_RCMAX)
+!  DEALLOCATE(ZRCRAUTC)
+!  DEALLOCATE(ZHLC_HRCLOCAL)
+!  DEALLOCATE(ZHLC_LRCLOCAL)
+!END IF
+!!
+!!-------------------------------------------------------------------------------
+!!
+!!*       8.     COMPUTE THE SEDIMENTATION (RS) SOURCE
+!!               -------------------------------------
+!!
+!!*       8.1    time splitting loop initialization
+!!
+!!
+!!
+!IF (HSEDIM == 'STAT') THEN
+!  CALL RAIN_ICE_SEDIMENTATION_STAT( IIB, IIE, IJB, IJE, IKB, IKE, IKTB, IKTE, IKT, KKL, KRR,                &
+!                                    PTSTEP, OSEDIC, PINPRC, PINDEP,                                         &
+!                                    PINPRR, PINPRS, PINPRG, PDZZ, PRHODREF, PPABST, PTHT, PRHODJ, PINPRR3D, &
+!                                    PRCS, PRCT, PRRS, PRRT, PRIS, PRSS, PRST, PRGS, PRGT,                   &
+!                                    PSEA, PTOWN, PINPRH, PRHS, PRHT, PFPR )
+!ELSEIF (HSEDIM == 'SPLI') THEN
+!  CALL RAIN_ICE_SEDIMENTATION_SPLIT(IIB, IIE, IJB, IJE, IKB, IKE, IKTB, IKTE, IKT, KKL,&
+!  KSPLITR,PTSTEP, &
+!  KRR,OSEDIC,LDEPOSC,PINPRC,PINDEP,PINPRR,PINPRS,PINPRG,PDZZ,PRHODREF,PPABST,PTHT,PRHODJ,&
+!      PINPRR3D,PRCS,PRCT,PRRS,PRRT,PRIS,PRIT,PRSS,PRST,PRGS,PRGT,PSEA,PTOWN,PINPRH,PRHS,PRHT,PFPR)
+!ELSE
+!  call Print_msg( NVERB_FATAL, 'GEN', 'RAIN_ICE_OLD', 'no sedimentation scheme for HSEDIM='//HSEDIM )
+!END IF
+!!sedimentation of rain fraction
+!CALL ICE4_RAINFR_VERT(IIB, IIE, IIT, IJB, IJE, IJT, IKB, IKE, IKT, KKL, PRAINFR, PRRS(:,:,:)*PTSTEP,  &
+!                      PRSS(:,:,:)*PTSTEP, PRGS(:,:,:)*PTSTEP)
+!!
+!!-------------------------------------------------------------------------------
+!!
+!END SUBROUTINE RAIN_ICE_OLD
diff --git a/src/mesonh/micro/rain_ice_red.f90 b/src/mesonh/micro/rain_ice_red.f90
deleted file mode 100644
index f309723132c26e799d934b13c4935126b82c37dc..0000000000000000000000000000000000000000
--- a/src/mesonh/micro/rain_ice_red.f90
+++ /dev/null
@@ -1,1873 +0,0 @@
-
-!Note de phasage pour Méso-NH: dans resolved_cloud, il faut:
-! - récuperer le tbudgets de modd_budget pour le passer ici, kbudgets vaut size(tbudgets)
-! - passer OCND2=.FALSE.
-! - passer à KPROMA la même valeur que KSIZE (bug sinon)
-! - créer des tableaux temporaires pour PSIGS, PINDEP, PINPRC pour gérer les options
-
-
-!MNH_LIC Copyright 1995-2021 CNRS, Meteo-France and Universite Paul Sabatier
-!MNH_LIC This is part of the Meso-NH software governed by the CeCILL-C licence
-!MNH_LIC version 1. See LICENSE, CeCILL-C_V1-en.txt and CeCILL-C_V1-fr.txt
-!MNH_LIC for details. version 1.
-!-----------------------------------------------------------------
-!     ######spl
-       MODULE MODI_RAIN_ICE_RED
-!      ########################
-!
-INTERFACE
-      SUBROUTINE RAIN_ICE_RED ( KPROMA, KIT, KJT, KKT, KSIZE,                                 &
-                            OSEDIC, OCND2, 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, PEVAP3D,                               &
-                            PINPRS, PINPRG, PINDEP, PRAINFR, PSIGS,               &
-                            TBUDGETS, KBUDGETS,                                   &
-                            PSEA, PTOWN,                                          &
-                            PRHT, PRHS, PINPRH, PFPR                              )
-!
-!
-USE MODD_BUDGET, ONLY: TBUDGETDATA
-INTEGER,                  INTENT(IN)    :: KPROMA ! cache-blocking factor for microphysic loop
-INTEGER,                  INTENT(IN)    :: KIT, KJT, KKT ! arrays size
-INTEGER,                  INTENT(IN)    :: KSIZE
-LOGICAL,                  INTENT(IN)    :: OSEDIC ! Switch for droplet sedim.
-LOGICAL                                 :: OCND2  ! Logical switch to separate liquid and ice
-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)
-!
-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
-REAL,                     INTENT(IN)    :: PTSTEP  ! Double Time step
-                                                   ! (single if cold start)
-INTEGER,                  INTENT(IN)    :: KRR     ! Number of moist variable
-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)     :: 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
-!
-TYPE(TBUDGETDATA), OPTIONAL, DIMENSION(KBUDGETS), INTENT(INOUT) :: TBUDGETS
-INTEGER, INTENT(IN) :: KBUDGETS
-!
-END SUBROUTINE RAIN_ICE_RED
-END INTERFACE
-END MODULE MODI_RAIN_ICE_RED
-!     ######spl
-      SUBROUTINE RAIN_ICE_RED ( KPROMA, KIT, KJT, KKT, KSIZE,                     &
-                            OSEDIC, OCND2, 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, PEVAP3D,                              &
-                            PINPRS, PINPRG, PINDEP, PRAINFR, PSIGS,               &
-                            TBUDGETS, KBUDGETS,                                   &
-                            PSEA, PTOWN,                                          &
-                            PRHT, PRHS, PINPRH, PFPR                              )
-!     ######################################################################
-!
-!!****  * -  compute the explicit microphysical sources
-!!
-!!    PURPOSE
-!!    -------
-!!      The purpose of this routine is to compute the slow microphysical sources
-!!    which can be computed explicitly
-!!
-!!
-!!**  METHOD
-!!    ------
-!!      The autoconversion computation follows Kessler (1969).
-!!      The sedimentation rate is computed with a time spliting technique and
-!!    an upstream scheme, written as a difference of non-advective fluxes. This
-!!    source term is added to the future instant ( split-implicit process ).
-!!      The others microphysical processes are evaluated at the central instant
-!!    (split-explicit process ): autoconversion, accretion and rain evaporation.
-!!      These last 3 terms are bounded in order not to create negative values
-!!    for the water species at the future instant.
-!!
-!!    EXTERNAL
-!!    --------
-!!      None
-!!
-!!
-!!    IMPLICIT ARGUMENTS
-!!    ------------------
-!!      Module MODD_PARAMETERS
-!!          JPHEXT       : Horizontal external points number
-!!          JPVEXT       : Vertical external points number
-!!      Module MODD_CONF :
-!!          CCONF configuration of the model for the first time step
-!!      Module MODD_CST
-!!          XP00               ! Reference pressure
-!!          XRD,XRV            ! Gaz  constant for dry air, vapor
-!!          XMD,XMV            ! Molecular weight for dry air, vapor
-!!          XCPD               ! Cpd (dry air)
-!!          XCL                ! Cl (liquid)
-!!          XCI                ! Ci (solid)
-!!          XTT                ! Triple point temperature
-!!          XLVTT              ! Vaporization heat constant
-!!          XALPW,XBETAW,XGAMW ! Constants for saturation vapor pressure
-!!                               function over liquid water
-!!          XALPI,XBETAI,XGAMI ! Constants for saturation vapor pressure
-!!                               function over solid ice
-!!      Module MODD_BUDGET:
-!!         NBUMOD       : model in which budget is calculated
-!!         CBUTYPE      : type of desired budget
-!!                          'CART' for cartesian box configuration
-!!                          'MASK' for budget zone defined by a mask
-!!                          'NONE'  ' for no budget
-!!         LBU_RTH      : logical for budget of RTH (potential temperature)
-!!                        .TRUE. = budget of RTH
-!!                        .FALSE. = no budget of RTH
-!!         LBU_RRV      : logical for budget of RRV (water vapor)
-!!                        .TRUE. = budget of RRV
-!!                        .FALSE. = no budget of RRV
-!!         LBU_RRC      : logical for budget of RRC (cloud water)
-!!                        .TRUE. = budget of RRC
-!!                        .FALSE. = no budget of RRC
-!!         LBU_RRI      : logical for budget of RRI (cloud ice)
-!!                        .TRUE. = budget of RRI
-!!                        .FALSE. = no budget of RRI
-!!         LBU_RRR      : logical for budget of RRR (rain water)
-!!                        .TRUE. = budget of RRR
-!!                        .FALSE. = no budget of RRR
-!!         LBU_RRS      : logical for budget of RRS (aggregates)
-!!                        .TRUE. = budget of RRS
-!!                        .FALSE. = no budget of RRS
-!!         LBU_RRG      : logical for budget of RRG (graupeln)
-!!                        .TRUE. = budget of RRG
-!!                        .FALSE. = no budget of RRG
-!!
-!!    REFERENCE
-!!    ---------
-!!
-!!      Book1 and Book2 of documentation ( routine RAIN_ICE )
-!!
-!!    AUTHOR
-!!    ------
-!!      J.-P. Pinty      * Laboratoire d'Aerologie*
-!!
-!!    MODIFICATIONS
-!!    -------------
-!!      Original    02/11/95
-!!      (J.Viviand) 04/02/97  debug accumulated prcipitation & convert
-!!                            precipitation rate in m/s
-!!      (J.-P. Pinty) 17/02/97  add budget calls
-!!      (J.-P. Pinty) 17/11/97  set ice sedim. for cirrus ice, reset RCHONI
-!!                              and RRHONG, reverse order for DEALLOCATE
-!!      (J.-P. Pinty) 11/02/98  correction of the air dynamical viscosity and
-!!                              add advance of the budget calls
-!!      (J.-P. Pinty) 18/05/98  correction of the air density in the RIAUTS
-!!                              process
-!!      (J.-P. Pinty) 18/11/98  split the main routine
-!!      (V. Masson)   18/11/98  bug in IVEC1 and IVEC2 upper limits
-!!      (J. Escobar & J.-P. Pinty)
-!!                    11/12/98  contains and rewrite count+pack
-!!      (J. Stein & J.-P. Pinty)
-!!                    14/10/99  correction for very small RIT
-!!      (J. Escobar & J.-P. Pinty)
-!!                    24/07/00  correction for very samll m.r. in
-!!                              the sedimentation subroutine
-!!      (M. Tomasini) 11/05/01  Autoconversion of rc into rr modification to take
-!!                              into account the subgrid variance
-!!                              (cf Redelsperger & Sommeria JAS 86)
-!!      (G. Molinie)  21/05/99  bug in RRCFRIG process, RHODREF**(-1) missing
-!!                              in RSRIMCG
-!!      (G. Molinie & J.-P. Pinty)
-!!                    21/06/99  bug in RACCS process
-!!      (P. Jabouille) 27/05/04 safety test for case where esw/i(T)> pabs (~Z>40km)
-!!      (J-.P. Chaboureau) 12/02/05  temperature depending ice-to-snow autocon-
-!                              version threshold (Chaboureau and Pinty GRL 2006)
-!!      (J.-P. Pinty) 01/01/O1  add the hail category and correction of the
-!!                              wet growth rate of the graupeln
-!!      (S.Remy & C.Lac) 06/06 Add the cloud sedimentation
-!!      (S.Remy & C.Lac) 06/06 Sedimentation becoming the last process
-!!      to settle the precipitating species created during the current time step
-!!      (S.Remy & C.Lac) 06/06 Modification of the algorithm of sedimentation
-!!      to settle n times the precipitating species created during Dt/n instead
-!!      of Dt
-!!      (C.Lac) 11/06 Optimization of the sedimentation loop for NEC
-!!      (J.Escobar) 18/01/2008 Parallel Bug in Budget when IMICRO >= 1
-!!                  --> Path inhibit this test by IMICRO >= 0 allway true
-!!      (Y.Seity) 03/2008 Add Statistic sedimentation
-!!      (Y.Seity) 10/2009 Added condition for the raindrop accretion of the aggregates
-!!         into graupeln process (5.2.6) to avoid negative graupel mixing ratio
-!!      (V.Masson, C.Lac) 09/2010 Correction in split sedimentation for
-!!                                reproducibility
-!!      (S. Riette) Oct 2010 Better vectorisation of RAIN_ICE_SEDIMENTATION_STAT
-!!      (Y. Seity), 02-2012  add possibility to run with reversed vertical levels
-!!      (L. Bengtsson), 02-2013 Passing in land/sea mask and town fraction in
-!!                      order to use different cloud droplet number conc. over
-!!                      land, sea and urban areas in the cloud sedimentation.
-!!      (D. Degrauwe), 2013-11: Export upper-air precipitation fluxes PFPR.
-!!      (S. Riette) Nov 2013 Protection against null sigma
-!!      (C. Lac) FIT temporal scheme : instant M removed
-!!      (JP Pinty), 01-2014 : ICE4 : partial reconversion of hail to graupel
-!!              July, 2015 (O.Nuissier/F.Duffourg) Add microphysics diagnostic for
-!!                                      aircraft, ballon and profiler
-!!      J.Escobar : 15/09/2015 : WENO5 & JPHEXT <> 1
-!!      C.Lac : 10/2016 : add droplet deposition
-!!      C.Lac : 01/2017 : correction on droplet deposition
-!!      J.Escobar : 10/2017 : for real*4 , limit exp() in RAIN_ICE_SLOW with XMNH_HUGE_12_LOG
-!!      (C. Abiven, Y. Léauté, V. Seigner, S. Riette) Phasing of Turner rain subgrid param
-!!      (S. Riette) Source code split into several files
-!!                  02/2019 C.Lac add rain fraction as an output field
-!  P. Wautelet 10/04/2019: replace ABORT and STOP calls by Print_msg
-!  P. Wautelet 28/05/2019: move COUNTJV function to tools.f90
-!  P. Wautelet 29/05/2019: remove PACK/UNPACK intrinsics (to get more performance and better OpenACC support)
-!  P. Wautelet 17/01/2020: move Quicksort to tools.f90
-!  P. Wautelet    02/2020: use the new data structures and subroutines for budgets
-!  P. Wautelet 25/02/2020: bugfix: add missing budget: WETH_BU_RRG
-!!     R. El Khatib 24-Aug-2021 Optimizations
-!-----------------------------------------------------------------
-!
-!*       0.    DECLARATIONS
-!              ------------
-!
-USE PARKIND1, ONLY : JPRB
-USE YOMHOOK , ONLY : LHOOK, DR_HOOK
-
-USE MODD_BUDGET,         ONLY: TBUDGETDATA, 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
-USE MODD_CST,            ONLY: XCI, XCL, XCPD, XCPV, XLSTT, XLVTT, XTT, XRHOLW
-USE MODD_PARAMETERS,     ONLY: JPVEXT
-USE MODD_PARAM_ICE,      ONLY: CSUBG_PR_PDF, CSUBG_RC_RR_ACCR, CSUBG_RR_EVAP, LDEPOSC, LFEEDBACKT, LSEDIM_AFTER, &
-                             & NMAXITER, XMRSTEP, XTSTEP_TS, XVDEPOSC
-USE MODD_RAIN_ICE_DESCR, ONLY: XRTMIN
-USE MODD_FIELDS_ADDRESS, ONLY : & ! common fields adress
-      & ITH,     & ! Potential temperature
-      & IRV,     & ! Water vapor
-      & IRC,     & ! Cloud water
-      & IRR,     & ! Rain water
-      & IRI,     & ! Pristine ice
-      & IRS,     & ! Snow/aggregate
-      & IRG,     & ! Graupel
-      & IRH        ! Hail
-
-USE MODE_BUDGET,         ONLY: BUDGET_STORE_ADD, BUDGET_STORE_INIT, BUDGET_STORE_END
-USE MODE_ll
-USE MODE_MSG,            ONLY: PRINT_MSG, NVERB_FATAL
-
-USE MODE_ICE4_RAINFR_VERT, ONLY: ICE4_RAINFR_VERT
-USE MODE_ICE4_SEDIMENTATION_STAT, ONLY: ICE4_SEDIMENTATION_STAT
-USE MODE_ICE4_SEDIMENTATION_SPLIT, ONLY: ICE4_SEDIMENTATION_SPLIT
-USE MODE_ICE4_SEDIMENTATION_SPLIT_MOMENTUM, ONLY: ICE4_SEDIMENTATION_SPLIT_MOMENTUM
-USE MODE_ICE4_TENDENCIES, ONLY: ICE4_TENDENCIES
-!
-IMPLICIT NONE
-!
-!*       0.1   Declarations of dummy arguments :
-!
-!
-!
-INTEGER,                  INTENT(IN)    :: KPROMA ! cache-blocking factor for microphysic loop
-INTEGER,                  INTENT(IN)    :: KIT, KJT, KKT ! arrays size
-INTEGER,                  INTENT(IN)    :: KSIZE
-LOGICAL,                  INTENT(IN)    :: OSEDIC ! Switch for droplet sedim.
-LOGICAL                                 :: OCND2  ! Logical switch to separate liquid and ice
-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)
-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
-REAL,                     INTENT(IN)    :: PTSTEP  ! Double Time step (single if cold start)
-INTEGER,                  INTENT(IN)    :: KRR     ! Number of moist variable
-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)     :: 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 !Precipitation fraction
-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
-!
-TYPE(TBUDGETDATA), DIMENSION(KBUDGETS), INTENT(INOUT) :: TBUDGETS
-INTEGER, INTENT(IN) :: KBUDGETS
-!
-!*       0.2   Declarations of local variables :
-!
-REAL(KIND=JPRB) :: ZHOOK_HANDLE
-INTEGER :: IIU
-INTEGER :: IJU
-INTEGER :: IIB           !  Define the domain where is
-INTEGER :: IIE           !  the microphysical sources have to be computed
-INTEGER :: IJB           !
-INTEGER :: IJE           !
-INTEGER :: IKB, IKTB     !
-INTEGER :: IKE, IKTE     !
-!
-INTEGER :: JI, JJ, JK
-INTEGER :: ISTI, ISTJ, ISTK
-!
-!Arrays for nucleation call outisde of ODMICRO 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(MERGE(KIT, 0, LBU_ENABLE), &
-               &MERGE(KJT, 0, LBU_ENABLE), &
-               &MERGE(KKT, 0, LBU_ENABLE)) :: ZW1, ZW2, ZW3, ZW4, ZW5, ZW6 !Work arrays
-REAL, DIMENSION(KIT, KJT, KKT) :: ZZ_LVFACT, ZZ_LSFACT, ZZ_DIFF
-!
-REAL, DIMENSION(KIT,KJT,KKT) :: ZRCT    ! Cloud water m.r. source at t
-REAL, DIMENSION(KIT,KJT,KKT) :: ZRRT    ! Rain water m.r. source at t
-REAL, DIMENSION(KIT,KJT,KKT) :: ZRIT    ! Pristine ice m.r. source at t
-REAL, DIMENSION(KIT,KJT,KKT) :: ZRST    ! Snow/aggregate m.r. source at t
-REAL, DIMENSION(KIT,KJT,KKT) :: ZRGT    ! Graupel m.r. source at t
-REAL, DIMENSION(KIT,KJT,KKT) :: ZRHT    ! Hail m.r. source at t
-REAL, DIMENSION(KIT,KJT,KKT) :: ZCITOUT ! Output value for CIT
-
-!Diagnostics
-REAL, DIMENSION(SIZE(PTHT,1),SIZE(PTHT,2)) :: ZINPRI ! Pristine ice instant precip
-!
-LOGICAL :: GEXT_TEND
-LOGICAL :: LSOFT ! Must we really compute tendencies or only adjust them to new T variables
-INTEGER :: INB_ITER_MAX ! Maximum number of iterations (with real tendencies computation)
-REAL :: ZW1D
-REAL :: ZTSTEP ! length of sub-timestep in case of time splitting
-REAL :: ZINV_TSTEP ! Inverse ov PTSTEP
-REAL :: ZTIME_THRESHOLD ! Time to reach threshold
-!For total tendencies computation
-REAL, DIMENSION(SIZE(PTHT,1),SIZE(PTHT,2),SIZE(PTHT,3),0:7) :: ZWR
-!
-!Output packed total mixing ratio change (for budgets only)
-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 packing
-INTEGER :: IMICRO ! Case r_x>0 locations
-INTEGER :: JL, JV
-REAL, DIMENSION(KPROMA) :: ZTIME ! Current integration time (starts with 0 and ends with PTSTEP)
-REAL, DIMENSION(KPROMA) :: &
-                        & ZMAXTIME, & ! Time on which we can apply the current tendencies
-                        & ZTIME_LASTCALL, &     ! Integration time when last tendecies call has been done
-                        & ZCOMPUTE, & ! 1. for points where we must compute tendencies, 0. elsewhere
-                        & ZSSI,     &
-                        & ZCIT,     & ! Pristine ice conc. at t
-                        & 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
-!
-!Output packed tendencies (for budgets only)
-REAL, DIMENSION(KPROMA) :: 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
-!
-!For mixing-ratio-splitting
-LOGICAL :: LLCPZ0RT
-REAL, DIMENSION(KPROMA, KRR) :: Z0RT ! Mixing-ratios at the beginig of the current loop
-!
-REAL, DIMENSION(KPROMA,0:7) :: &
-                        & ZVART, & !Packed variables
-                        & ZEXTPK, & !To take into acount external tendencies inside the splitting
-                        & ZA, ZB
-!
-REAL, DIMENSION(KPROMA, 8) :: ZRS_TEND, ZRG_TEND
-REAL, DIMENSION(KPROMA,10) :: ZRH_TEND
-
-INTEGER, DIMENSION(KPROMA) :: &
-                       & I1,I2,I3, & ! Used to replace the COUNT and PACK intrinsics on variables
-                       & IITER       ! Number of iterations done (with real tendencies computation)
-INTEGER, DIMENSION(KSIZE) :: I1TOT, I2TOT, I3TOT ! Used to replace the COUNT and PACK intrinsics
-!
-REAL, DIMENSION(KPROMA) :: ZSUM2, ZMAXB
-REAL :: ZDEVIDE, ZX, ZRICE
-!
-INTEGER :: IC, JMICRO
-LOGICAL :: LLSIGMA_RC, LL_ANY_ITER, LL_AUCV_ADJU
-
-!
-!-------------------------------------------------------------------------------
-IF (LHOOK) CALL DR_HOOK('RAIN_ICE', 0, ZHOOK_HANDLE)
-!
-!-------------------------------------------------------------------------------
-!
-IF(OCND2) THEN
-  CALL PRINT_MSG(NVERB_FATAL, 'GEN', 'RAIN_ICE', 'OCND2 OPTION NOT CODED IN THIS RAIN_ICE VERSION')
-END IF
-IF(KPROMA /= KSIZE) THEN
-  CALL PRINT_MSG(NVERB_FATAL, 'GEN', 'RAIN_ICE', 'For now, KPROMA must be equal to KSIZE, see code for explanation')
-  ! 2 issues
-  !  * Microphyscs was optimized by introducing chunks of KPROMA size
-  !    Thus, in ice4_tendencies, the 1D array represent only a fraction of the points where microphisical species are present
-  !    We cannot rebuild the entire 3D arrays in the subroutine, so we cannot call ice4_rainfr_vert in it
-  !    A solution would be to suppress optimisation in this case by setting KPROMA=KSIZE in rain_ice
-  !    Another solution would be to compute column by column?
-  !    Another one would be to cut tendencies in 3 parts: before rainfr_vert, rainfr_vert, after rainfr_vert
-  !  * When chuncks are used, result is different
-ENDIF
-!
-!*       1.     COMPUTE THE LOOP BOUNDS
-!               -----------------------
-!
-IIU=SIZE(PDZZ,1)
-IJU=SIZE(PDZZ,2)
-CALL GET_INDICE_ll(IIB,IJB,IIE,IJE,IIU,IJU)
-IKB=KKA+JPVEXT*KKL
-IKE=KKU-JPVEXT*KKL
-IKTB=1+JPVEXT
-IKTE=KKT-JPVEXT
-!
-ZINV_TSTEP=1./PTSTEP
-GEXT_TEND=.TRUE.
-!
-! LSFACT and LVFACT without exner
-DO JK = 1, KKT
-  DO JJ = 1, KJT
-    DO JI = 1, KIT
-      IF (KRR==7) THEN
-        ZRICE=PRIT(JI,JJ,JK)+PRST(JI,JJ,JK)+PRGT(JI,JJ,JK)+PRHT(JI,JJ,JK)
-      ELSE
-        ZRICE=PRIT(JI,JJ,JK)+PRST(JI,JJ,JK)+PRGT(JI,JJ,JK)
-      ENDIF
-      ZDEVIDE = XCPD + XCPV*PRVT(JI,JJ,JK) + XCL*(PRCT(JI,JJ,JK)+PRRT(JI,JJ,JK)) + XCI*ZRICE
-      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)) / ZDEVIDE
-      ZZ_LVFACT(JI,JJ,JK)=(XLVTT+(XCPV-XCL)*(ZT(JI,JJ,JK)-XTT)) / ZDEVIDE
-    ENDDO
-  ENDDO
-ENDDO
-!
-!-------------------------------------------------------------------------------
-!
-!*       2.     COMPUTE THE SEDIMENTATION (RS) SOURCE
-!               -------------------------------------
-!
-IF(.NOT. LSEDIM_AFTER) THEN
-  !
-  !*       2.1     sedimentation
-  !
-  IF (LBUDGET_RC .AND. OSEDIC) CALL BUDGET_STORE_INIT(TBUDGETS(NBUDGET_RC), 'SEDI', PRCS(:, :, :) * PRHODJ(:, :, :))
-  IF (LBUDGET_RR)              CALL BUDGET_STORE_INIT(TBUDGETS(NBUDGET_RR), 'SEDI', PRRS(:, :, :) * PRHODJ(:, :, :))
-  IF (LBUDGET_RI)              CALL BUDGET_STORE_INIT(TBUDGETS(NBUDGET_RI), 'SEDI', PRIS(:, :, :) * PRHODJ(:, :, :))
-  IF (LBUDGET_RS)              CALL BUDGET_STORE_INIT(TBUDGETS(NBUDGET_RS), 'SEDI', PRSS(:, :, :) * PRHODJ(:, :, :))
-  IF (LBUDGET_RG)              CALL BUDGET_STORE_INIT(TBUDGETS(NBUDGET_RG), 'SEDI', PRGS(:, :, :) * PRHODJ(:, :, :))
-  IF (LBUDGET_RH .AND. KRR==7) CALL BUDGET_STORE_INIT(TBUDGETS(NBUDGET_RH), 'SEDI', PRHS(:, :, :) * PRHODJ(:, :, :))
-
-  IF(HSEDIM=='STAT') THEN
-    IF(KRR==7) THEN
-      DO JK = 1, KKT
-        DO JJ = 1, KJT
-          DO JI = 1, KIT
-            ZRCT(JI,JJ,JK)=PRCS(JI,JJ,JK)*PTSTEP
-            ZRRT(JI,JJ,JK)=PRRS(JI,JJ,JK)*PTSTEP
-            ZRIT(JI,JJ,JK)=PRIS(JI,JJ,JK)*PTSTEP
-            ZRST(JI,JJ,JK)=PRSS(JI,JJ,JK)*PTSTEP
-            ZRGT(JI,JJ,JK)=PRGS(JI,JJ,JK)*PTSTEP
-            ZRHT(JI,JJ,JK)=PRHS(JI,JJ,JK)*PTSTEP
-          ENDDO
-        ENDDO
-      ENDDO
-      CALL ICE4_SEDIMENTATION_STAT(IIB, IIE, KIT, IJB, IJE, KJT, IKB, IKE, IKTB, IKTE, KKT, KKL, &
-                                  &PTSTEP, KRR, OSEDIC, PDZZ, &
-                                  &PRHODREF, PPABST, PTHT, PRHODJ, &
-                                  &PRCS, ZRCT, PRRS, ZRRT, PRIS, ZRIT,&
-                                  &PRSS, ZRST, PRGS, ZRGT,&
-                                  &PINPRC, PINPRR, ZINPRI, PINPRS, PINPRG, &
-                                  &PSEA=PSEA, PTOWN=PTOWN, &
-                                  &PINPRH=PINPRH, PRHT=ZRHT, PRHS=PRHS, PFPR=PFPR)
-    ELSE
-      DO JK = 1, KKT
-        DO JJ = 1, KJT
-          DO JI = 1, KIT
-            ZRCT(JI,JJ,JK)=PRCS(JI,JJ,JK)*PTSTEP
-            ZRRT(JI,JJ,JK)=PRRS(JI,JJ,JK)*PTSTEP
-            ZRIT(JI,JJ,JK)=PRIS(JI,JJ,JK)*PTSTEP
-            ZRST(JI,JJ,JK)=PRSS(JI,JJ,JK)*PTSTEP
-            ZRGT(JI,JJ,JK)=PRGS(JI,JJ,JK)*PTSTEP
-          ENDDO
-        ENDDO
-      ENDDO
-      CALL ICE4_SEDIMENTATION_STAT(IIB, IIE, KIT, IJB, IJE, KJT, IKB, IKE, IKTB, IKTE, KKT, KKL, &
-                                  &PTSTEP, KRR, OSEDIC, PDZZ, &
-                                  &PRHODREF, PPABST, PTHT, PRHODJ, &
-                                  &PRCS, ZRCT, PRRS, ZRRT, PRIS, ZRIT,&
-                                  &PRSS, ZRST, PRGS, ZRGT,&
-                                  &PINPRC, PINPRR, ZINPRI, PINPRS, PINPRG, &
-                                  &PSEA=PSEA, PTOWN=PTOWN, &
-                                  &PFPR=PFPR)
-    ENDIF
-    PINPRS(:,:) = PINPRS(:,:) + ZINPRI(:,:)
-    !No negativity correction here as we apply sedimentation on PR.S*PTSTEP variables
-  ELSEIF(HSEDIM=='SPLI') THEN
-    IF(KRR==7) THEN
-      CALL ICE4_SEDIMENTATION_SPLIT(IIB, IIE, KIT, IJB, IJE, KJT, IKB, IKE, IKTB, IKTE, KKT, KKL, &
-                                   &PTSTEP, KRR, OSEDIC, PDZZ, &
-                                   &PRHODREF, PPABST, PTHT, PRHODJ, &
-                                   &PRCS, PRCT, PRRS, PRRT, PRIS, PRIT, PRSS, PRST, PRGS, PRGT,&
-                                   &PINPRC, PINPRR, ZINPRI, PINPRS, PINPRG, &
-                                   &PSEA=PSEA, PTOWN=PTOWN, &
-                                   &PINPRH=PINPRH, PRHT=PRHT, PRHS=PRHS, PFPR=PFPR)
-    ELSE
-      CALL ICE4_SEDIMENTATION_SPLIT(IIB, IIE, KIT, IJB, IJE, KJT, IKB, IKE, IKTB, IKTE, KKT, KKL, &
-                                   &PTSTEP, KRR, OSEDIC, PDZZ, &
-                                   &PRHODREF, PPABST, PTHT, PRHODJ, &
-                                   &PRCS, PRCT, PRRS, PRRT, PRIS, PRIT, PRSS, PRST, PRGS, PRGT,&
-                                   &PINPRC, PINPRR, ZINPRI, PINPRS, PINPRG, &
-                                   &PSEA=PSEA, PTOWN=PTOWN, &
-                                   &PFPR=PFPR)
-    ENDIF
-    PINPRS(:,:) = PINPRS(:,:) + ZINPRI(:,:)
-    !We correct negativities with conservation
-    !SPLI algorith uses a time-splitting. Inside the loop a temporary m.r. is used.
-    !   It is initialized with the m.r. at T and is modified by two tendencies:
-    !   sedimentation tendency and an external tendency which represents all other
-    !   processes (mainly advection and microphysical processes). If both tendencies
-    !   are negative, sedimentation can remove a species at a given sub-timestep. From
-    !   this point sedimentation stops for the remaining sub-timesteps but the other tendency
-    !   will be still active and will lead to negative values.
-    !   We could prevent the algorithm to not consume too much a species, instead we apply
-    !   a correction here.
-    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', 'no sedimentation scheme for HSEDIM='//HSEDIM)
-  END IF
-
-
-
-
-
-
-!!!!! ajouter momentum
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-  !
-  !*       2.2     budget storage
-  !
-  IF (LBUDGET_RC .AND. OSEDIC) CALL BUDGET_STORE_END(TBUDGETS(NBUDGET_RC), 'SEDI', PRCS(:, :, :) * PRHODJ(:, :, :))
-  IF (LBUDGET_RR)              CALL BUDGET_STORE_END(TBUDGETS(NBUDGET_RR), 'SEDI', PRRS(:, :, :) * PRHODJ(:, :, :))
-  IF (LBUDGET_RI)              CALL BUDGET_STORE_END(TBUDGETS(NBUDGET_RI), 'SEDI', PRIS(:, :, :) * PRHODJ(:, :, :))
-  IF (LBUDGET_RS)              CALL BUDGET_STORE_END(TBUDGETS(NBUDGET_RS), 'SEDI', PRSS(:, :, :) * PRHODJ(:, :, :))
-  IF (LBUDGET_RG)              CALL BUDGET_STORE_END(TBUDGETS(NBUDGET_RG), 'SEDI', PRGS(:, :, :) * PRHODJ(:, :, :))
-  IF (LBUDGET_RH .AND. KRR==7) CALL BUDGET_STORE_END(TBUDGETS(NBUDGET_RH), 'SEDI', PRHS(:, :, :) * PRHODJ(:, :, :))
-ENDIF
-!
-
-DO JK = 1,KKT
-  !Backup of T variables
-  ZWR(:,:,JK,IRV)=PRVT(:,:,JK)
-  ZWR(:,:,JK,IRC)=PRCT(:,:,JK)
-  ZWR(:,:,JK,IRR)=PRRT(:,:,JK)
-  ZWR(:,:,JK,IRI)=PRIT(:,:,JK)
-  ZWR(:,:,JK,IRS)=PRST(:,:,JK)
-  ZWR(:,:,JK,IRG)=PRGT(:,:,JK)
-  IF (KRR==7) THEN
-    ZWR(:,:,JK,IRH)=PRHT(:,:,JK)
-  ELSE
-    ZWR(:,:,JK,IRH)=0.
-  ENDIF
-
-  !Preset for output 3D variables
-  IF(OWARM) THEN
-    PEVAP3D(:,:,JK)=0.
-  ENDIF
-  PRAINFR(:,:,JK)=0.
-  ZCITOUT(:,:,JK)=0.
-ENDDO
-
-IF(LBU_ENABLE) THEN
-  ZTOT_RVHENI(:)=0.
-  ZTOT_RCHONI(:)=0.
-  ZTOT_RRHONG(:)=0.
-  ZTOT_RVDEPS(:)=0.
-  ZTOT_RIAGGS(:)=0.
-  ZTOT_RIAUTS(:)=0.
-  ZTOT_RVDEPG(:)=0.
-  ZTOT_RCAUTR(:)=0.
-  ZTOT_RCACCR(:)=0.
-  ZTOT_RREVAV(:)=0.
-  ZTOT_RCRIMSS(:)=0.
-  ZTOT_RCRIMSG(:)=0.
-  ZTOT_RSRIMCG(:)=0.
-  ZTOT_RIMLTC(:)=0.
-  ZTOT_RCBERI(:)=0.
-  ZTOT_RHMLTR(:)=0.
-  ZTOT_RSMLTG(:)=0.
-  ZTOT_RCMLTSR(:)=0.
-  ZTOT_RRACCSS(:)=0.
-  ZTOT_RRACCSG(:)=0.
-  ZTOT_RSACCRG(:)=0.
-  ZTOT_RICFRRG(:)=0.
-  ZTOT_RRCFRIG(:)=0.
-  ZTOT_RICFRR(:)=0.
-  ZTOT_RCWETG(:)=0.
-  ZTOT_RIWETG(:)=0.
-  ZTOT_RRWETG(:)=0.
-  ZTOT_RSWETG(:)=0.
-  ZTOT_RCDRYG(:)=0.
-  ZTOT_RIDRYG(:)=0.
-  ZTOT_RRDRYG(:)=0.
-  ZTOT_RSDRYG(:)=0.
-  ZTOT_RWETGH(:)=0.
-  ZTOT_RGMLTR(:)=0.
-  ZTOT_RCWETH(:)=0.
-  ZTOT_RIWETH(:)=0.
-  ZTOT_RSWETH(:)=0.
-  ZTOT_RGWETH(:)=0.
-  ZTOT_RRWETH(:)=0.
-  ZTOT_RCDRYH(:)=0.
-  ZTOT_RIDRYH(:)=0.
-  ZTOT_RSDRYH(:)=0.
-  ZTOT_RRDRYH(:)=0.
-  ZTOT_RGDRYH(:)=0.
-  ZTOT_RDRYHG(:)=0.
-ENDIF
-
-!-------------------------------------------------------------------------------
-!  optimization by looking for locations where
-!  the microphysical fields are larger than a minimal value only !!!
-!
-IF (KSIZE /= COUNT(ODMICRO)) THEN
-    CALL PRINT_MSG(NVERB_FATAL, 'GEN', 'RAIN_ICE', 'RAIN_ICE : KSIZE /= COUNT(ODMICRO)')
-ENDIF
-
-IF (KSIZE > 0) THEN
-
-  !Maximum number of iterations
-  !We only count real iterations (those for which we *compute* tendencies)
-  INB_ITER_MAX=NMAXITER
-  IF(XTSTEP_TS/=0.)THEN
-    INB_ITER_MAX=MAX(1, INT(PTSTEP/XTSTEP_TS)) !At least the number of iterations needed for the time-splitting
-    ZTSTEP=PTSTEP/INB_ITER_MAX
-    INB_ITER_MAX=MAX(NMAXITER, INB_ITER_MAX) !For the case XMRSTEP/=0. at the same time
-  ENDIF
-
-!===============================================================================================================
-! Cache-blocking loop :
-
-  LLSIGMA_RC=(HSUBG_AUCV_RC=='PDF ' .AND. CSUBG_PR_PDF=='SIGM')
-  LL_AUCV_ADJU=(HSUBG_AUCV_RC=='ADJU' .OR. HSUBG_AUCV_RI=='ADJU')
-
-  ! starting indexes :
-  IC=0
-  ISTK=1
-  ISTJ=1
-  ISTI=1
-
-  DO JMICRO=1,KSIZE,KPROMA
-
-    IMICRO=MIN(KPROMA,KSIZE-JMICRO+1)
-!
-!*       3.     PACKING
-!               --------
-
-    ! Setup packing parameters
-    OUTER_LOOP: DO JK = ISTK, KKT
-      DO JJ = ISTJ, KJT
-        IF (ANY(ODMICRO(:,JJ,JK))) THEN
-          DO JI = ISTI, KIT
-            IF (ODMICRO(JI,JJ,JK)) THEN
-              IC=IC+1
-              ! Initialization of variables in packed format :
-              ZVART(IC, ITH)=PTHT(JI, JJ, JK)
-              ZVART(IC, IRV)=PRVT(JI, JJ, JK)
-              ZVART(IC, IRC)=PRCT(JI, JJ, JK)
-              ZVART(IC, IRR)=PRRT(JI, JJ, JK)
-              ZVART(IC, IRI)=PRIT(JI, JJ, JK)
-              ZVART(IC, IRS)=PRST(JI, JJ, JK)
-              ZVART(IC, IRG)=PRGT(JI, JJ, JK)
-              IF (KRR==7) THEN
-                ZVART(IC, IRH)=PRHT(JI, JJ, JK)
-              ENDIF
-              IF (GEXT_TEND) THEN
-                !The th tendency is not related to a mixing ratio change, there is no exn/exnref issue here
-                ZEXTPK(IC, ITH)=PTHS(JI, JJ, JK)
-                ZEXTPK(IC, IRV)=PRVS(JI, JJ, JK)
-                ZEXTPK(IC, IRC)=PRCS(JI, JJ, JK)
-                ZEXTPK(IC, IRR)=PRRS(JI, JJ, JK)
-                ZEXTPK(IC, IRI)=PRIS(JI, JJ, JK)
-                ZEXTPK(IC, IRS)=PRSS(JI, JJ, JK)
-                ZEXTPK(IC, IRG)=PRGS(JI, JJ, JK)
-                IF (KRR==7) THEN
-                  ZEXTPK(IC, IRH)=PRHS(JI, JJ, JK)
-                ENDIF
-              ENDIF
-              ZCIT       (IC)=PCIT    (JI, JJ, JK)
-              ZCF        (IC)=PCLDFR  (JI, JJ, JK)
-              ZRHODREF   (IC)=PRHODREF(JI, JJ, JK)
-              ZPRES      (IC)=PPABST  (JI, JJ, JK)
-              ZEXN       (IC)=PEXN    (JI, JJ, JK)
-              IF(LLSIGMA_RC) THEN
-                ZSIGMA_RC(IC)=PSIGS   (JI, JJ, JK)
-              ENDIF
-              IF (LL_AUCV_ADJU) THEN
-                ZHLC_HCF(IC) = PHLC_HCF(JI, JJ, JK)
-                ZHLC_HRC(IC) = PHLC_HRC(JI, JJ, JK)
-                ZHLI_HCF(IC) = PHLI_HCF(JI, JJ, JK)
-                ZHLI_HRI(IC) = PHLI_HRI(JI, JJ, JK)
-              ENDIF
-              ! Save indices for later usages:
-              I1(IC) = JI
-              I2(IC) = JJ
-              I3(IC) = JK
-              I1TOT(JMICRO+IC-1)=JI
-              I2TOT(JMICRO+IC-1)=JJ
-              I3TOT(JMICRO+IC-1)=JK
-              IF (IC==IMICRO) THEN
-                ! the end of the chunk has been reached, then reset the starting index :
-                ISTI=JI+1
-                IF (ISTI <= KIT) THEN
-                  ISTJ=JJ
-                  ISTK=JK
-                ELSE
-                  ! end of line, restart from 1 and increment upper loop
-                  ISTI=1
-                  ISTJ=JJ+1
-                  IF (ISTJ <= KJT) THEN
-                    ISTK=JK
-                  ELSE
-                    ! end of line, restart from 1 and increment upper loop
-                    ISTJ=1
-                    ISTK=JK+1
-                    IF (ISTK > KKT) THEN
-                      ! end of line, restart from 1
-                      ISTK=1
-                    ENDIF
-                  ENDIF
-                ENDIF
-                IC=0
-                EXIT OUTER_LOOP
-              ENDIF
-            ENDIF
-          ENDDO
-        ENDIF
-        ! restart inner loop on JI :
-        ISTI=1
-      ENDDO
-      ! restart inner loop on JJ :
-      ISTJ=1
-    ENDDO OUTER_LOOP
-
-    IF (GEXT_TEND) THEN
-      DO JV=0, KRR
-        DO JL=1, IMICRO
-          ZEXTPK(JL, JV)=ZEXTPK(JL, JV)-ZVART(JL, JV)*ZINV_TSTEP
-        ENDDO
-      ENDDO
-    ENDIF
-    IF (LLSIGMA_RC) THEN
-      DO JL=1, IMICRO
-        ZSIGMA_RC(JL)=ZSIGMA_RC(JL)*2.
-      ENDDO 
-    ENDIF
-    IF (LL_AUCV_ADJU) THEN
-      DO JL=1, IMICRO
-        ZHLC_LRC(JL) = ZVART(JL, IRC) - ZHLC_HRC(JL)
-        ZHLI_LRI(JL) = ZVART(JL, IRI) - ZHLI_HRI(JL)
-        IF(ZVART(JL, IRC)>0.) THEN
-          ZHLC_LCF(JL) = ZCF(JL)- ZHLC_HCF(JL)
-        ELSE
-          ZHLC_LCF(JL)=0.
-        ENDIF
-        IF(ZVART(JL, IRI)>0.) THEN
-          ZHLI_LCF(JL) = ZCF(JL)- ZHLI_HCF(JL)
-        ELSE
-          ZHLI_LCF(JL)=0.
-        ENDIF
-      ENDDO
-    ENDIF
-
-!-------------------------------------------------------------------------------
-!
-!*       4.     LOOP
-!               ----
-!
-    IITER(1:IMICRO)=0
-    ZTIME(1:IMICRO)=0. ! Current integration time (all points may have a different integration time)
-
-    DO WHILE(ANY(ZTIME(1:IMICRO)<PTSTEP)) ! Loop to *really* compute tendencies
-
-      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 tendencies
-        ZTIME_LASTCALL(1:IMICRO)=ZTIME(1:IMICRO)
-      ENDIF
-      DO JL=1, IMICRO
-        IF (ZTIME(JL) < PTSTEP) THEN
-          ZCOMPUTE(JL)=1. ! Computation (1.) only for points for which integration time has not reached the timestep
-          IITER(JL)=IITER(JL)+1
-        ELSE
-          ZCOMPUTE(JL)=0.
-        ENDIF
-      ENDDO
-      LL_ANY_ITER=ANY(IITER(1:IMICRO) < INB_ITER_MAX)
-      LLCPZ0RT=.TRUE.
-      LSOFT=.FALSE. ! We *really* compute the tendencies
-
-      DO WHILE(ANY(ZCOMPUTE(1:IMICRO)==1.)) ! Loop to adjust tendencies when we cross the 0°C or when a species disappears
-!$OMP SIMD
-        DO JL=1, IMICRO
-          ZSUM2(JL)=SUM(ZVART(JL,IRI:KRR))
-        ENDDO
-        DO JL=1, IMICRO
-          ZDEVIDE=(XCPD + XCPV*ZVART(JL, IRV) + XCL*(ZVART(JL, IRC)+ZVART(JL, IRR)) + XCI*ZSUM2(JL)) * ZEXN(JL)
-          ZZT(JL) = ZVART(JL, ITH) * ZEXN(JL)
-          ZLSFACT(JL)=(XLSTT+(XCPV-XCI)*(ZZT(JL)-XTT)) / ZDEVIDE
-          ZLVFACT(JL)=(XLVTT+(XCPV-XCL)*(ZZT(JL)-XTT)) / ZDEVIDE
-        ENDDO
-        !
-        !***       4.1 Tendencies computation
-        !
-        ! Tendencies are *really* computed when LSOFT==.FALSE. and only adjusted otherwise
-    CALL ICE4_TENDENCIES(KPROMA, 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, &
-                        &ZCIT, &
-                        &ZZT, ZVART, &
-                        &ZRVHENI_MR, ZRRHONG_MR, ZRIMLTC_MR, ZRSRIMCG_MR, &
-                        &ZRCHONI, ZRVDEPS, ZRIAGGS, ZRIAUTS, ZRVDEPG, &
-                        &ZRCAUTR, ZRCACCR, ZRREVAV, &
-                        &ZRCRIMSS, ZRCRIMSG, ZRSRIMCG, ZRRACCSS, ZRRACCSG, ZRSACCRG, ZRSMLTG, ZRCMLTSR, &
-                        &ZRICFRRG, ZRRCFRIG, ZRICFRR, ZRCWETG, ZRIWETG, ZRRWETG, ZRSWETG, &
-                        &ZRCDRYG, ZRIDRYG, ZRRDRYG, ZRSDRYG, ZRWETGH, ZRWETGH_MR, ZRGMLTR, &
-                        &ZRCWETH, ZRIWETH, ZRSWETH, ZRGWETH, ZRRWETH, &
-                        &ZRCDRYH, ZRIDRYH, ZRSDRYH, ZRRDRYH, ZRGDRYH, ZRDRYHG, ZRHMLTR, &
-                        &ZRCBERI, &
-                        &ZRS_TEND, ZRG_TEND, ZRH_TEND, ZSSI, &
-                        &ZA, ZB, &
-                        &ZHLC_HCF, ZHLC_LCF, ZHLC_HRC, ZHLC_LRC, &
-                        &ZHLI_HCF, ZHLI_LCF, ZHLI_HRI, ZHLI_LRI, PRAINFR)
-
-        ! External tendencies
-        IF(GEXT_TEND) THEN
-          DO JV=0, KRR
-            DO JL=1, IMICRO
-              ZA(JL, JV) = ZA(JL, JV) + ZEXTPK(JL, JV)
-            ENDDO
-          ENDDO
-        ENDIF
-        !
-        !***       4.2 Integration time
-        !
-        ! If we can, we shall use these tendencies until the end of the timestep
-        DO JL=1, IMICRO
-          ZMAXTIME(JL)=ZCOMPUTE(JL) * (PTSTEP-ZTIME(JL)) ! Remaining time until the end of the timestep
-        ENDDO
-
-        !We need to adjust tendencies when temperature reaches 0
-        IF(LFEEDBACKT) THEN
-          DO JL=1, IMICRO
-            !Is ZB(:, ITH) enough to change temperature sign?
-            ZX=XTT/ZEXN(JL)
-            IF ((ZVART(JL, ITH) - ZX) * (ZVART(JL, ITH) + ZB(JL, ITH) - ZX) < 0.) THEN
-              ZMAXTIME(JL)=0.
-            ENDIF
-            !Can ZA(:, ITH) make temperature change of sign?
-            IF (ABS(ZA(JL,ITH)) > 1.E-20 ) THEN
-              ZTIME_THRESHOLD=(ZX - ZB(JL, ITH) - ZVART(JL, ITH))/ZA(JL, ITH)
-              IF (ZTIME_THRESHOLD > 0.) THEN
-                ZMAXTIME(JL)=MIN(ZMAXTIME(JL), ZTIME_THRESHOLD)
-              ENDIF
-            ENDIF
-          ENDDO
-        ENDIF
-
-        !We need to adjust tendencies when a species disappears
-        !When a species is missing, only the external tendencies can be negative (and we must keep track of it)
-        DO JV=1, KRR
-          DO JL=1, IMICRO
-            IF (ZA(JL, JV) < -1.E-20 .AND. ZVART(JL, JV) > XRTMIN(JV)) THEN
-              ZMAXTIME(JL)=MIN(ZMAXTIME(JL), -(ZB(JL, JV)+ZVART(JL, JV))/ZA(JL, JV))
-            ENDIF
-          ENDDO
-        ENDDO
-
-        !We stop when the end of the timestep is reached
-        DO JL=1, IMICRO
-          IF (ZTIME(JL)+ZMAXTIME(JL) >= PTSTEP) THEN
-            ZCOMPUTE(JL)=0.
-          ENDIF
-        ENDDO
-        !We must recompute tendencies when the end of the sub-timestep is reached
-        IF (XTSTEP_TS/=0.) THEN
-          DO JL=1, IMICRO
-            IF ((IITER(JL) < INB_ITER_MAX) .AND. (ZTIME(JL)+ZMAXTIME(JL) > ZTIME_LASTCALL(JL)+ZTSTEP)) THEN
-              ZMAXTIME(JL)=ZTIME_LASTCALL(JL)-ZTIME(JL)+ZTSTEP
-              ZCOMPUTE(JL)=0.
-            ENDIF
-          ENDDO
-        ENDIF
-
-        !We must recompute tendencies when the maximum allowed change is reached
-        !When a species 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 species was already missing)
-        IF (XMRSTEP/=0.) THEN
-          IF (LL_ANY_ITER) THEN
-            ! In this case we need to remember the initial mixing ratios used to compute the tendencies
-            ! because when mixing ratio has evolved more than a threshold, we must re-compute tendencies
-            ! Thus, at first iteration (ie when LLCPZ0RT=.TRUE.) we copy ZVART into Z0RT
-            DO JV=1,KRR
-              IF (LLCPZ0RT) Z0RT(1:IMICRO, JV)=ZVART(1:IMICRO, JV)
-              DO JL=1, IMICRO
-                IF (IITER(JL)<INB_ITER_MAX .AND. ABS(ZA(JL,JV))>1.E-20) THEN
-                  ZTIME_THRESHOLD=(SIGN(1., ZA(JL, JV))*XMRSTEP+Z0RT(JL, JV)-ZVART(JL, JV)-ZB(JL, JV))/ZA(JL, JV)
-                ELSE
-                  ZTIME_THRESHOLD=-1.
-                ENDIF
-                IF (ZTIME_THRESHOLD>=0 .AND. ZTIME_THRESHOLD<ZMAXTIME(JL) .AND. (ZVART(JL, JV)>XRTMIN(JV) .OR. ZA(JL, JV)>0.)) THEN
-                  ZMAXTIME(JL)=MIN(ZMAXTIME(JL), ZTIME_THRESHOLD)
-                  ZCOMPUTE(JL)=0.
-                ENDIF
-              ENDDO
-            ENDDO
-            LLCPZ0RT=.FALSE.
-!$OMP SIMD
-            DO JL=1,IMICRO
-              ZMAXB(JL)=MAXVAL(ABS(ZB(JL,1:KRR)))
-            ENDDO
-            DO JL=1, IMICRO
-              IF (IITER(JL)<INB_ITER_MAX .AND. ZMAXB(JL)>XMRSTEP) THEN
-                ZMAXTIME(JL)=0.
-                ZCOMPUTE(JL)=0.
-              ENDIF
-            ENDDO
-          ENDIF ! LL_ANY_ITER
-        ENDIF ! XMRSTEP/=0.
-        !
-        !***       4.3 New values of variables for next iteration
-        !
-        DO JV=0, KRR
-          DO JL=1, IMICRO
-            ZVART(JL, JV)=ZVART(JL, JV)+ZA(JL, JV)*ZMAXTIME(JL)+ZB(JL, JV)
-          ENDDO
-        ENDDO
-        DO JL=1, IMICRO
-          IF (ZVART(JL,IRI)==0.) ZCIT(JL) = 0.
-          ZTIME(JL)=ZTIME(JL)+ZMAXTIME(JL)
-        ENDDO
-
-        !
-        !***       4.4 Mixing ratio change due to each process
-        !
-        IF(LBU_ENABLE) THEN
-          DO JL=1, IMICRO
-            ZTOT_RVHENI (JMICRO+JL-1)=ZTOT_RVHENI (JMICRO+JL-1)+ZRVHENI_MR(JL)
-            ZTOT_RCHONI (JMICRO+JL-1)=ZTOT_RCHONI (JMICRO+JL-1)+ZRCHONI   (JL)*ZMAXTIME(JL)
-            ZTOT_RRHONG (JMICRO+JL-1)=ZTOT_RRHONG (JMICRO+JL-1)+ZRRHONG_MR(JL)
-            ZTOT_RVDEPS (JMICRO+JL-1)=ZTOT_RVDEPS (JMICRO+JL-1)+ZRVDEPS   (JL)*ZMAXTIME(JL)
-            ZTOT_RIAGGS (JMICRO+JL-1)=ZTOT_RIAGGS (JMICRO+JL-1)+ZRIAGGS   (JL)*ZMAXTIME(JL)
-            ZTOT_RIAUTS (JMICRO+JL-1)=ZTOT_RIAUTS (JMICRO+JL-1)+ZRIAUTS   (JL)*ZMAXTIME(JL)
-            ZTOT_RVDEPG (JMICRO+JL-1)=ZTOT_RVDEPG (JMICRO+JL-1)+ZRVDEPG   (JL)*ZMAXTIME(JL)
-            ZTOT_RCAUTR (JMICRO+JL-1)=ZTOT_RCAUTR (JMICRO+JL-1)+ZRCAUTR   (JL)*ZMAXTIME(JL)
-            ZTOT_RCACCR (JMICRO+JL-1)=ZTOT_RCACCR (JMICRO+JL-1)+ZRCACCR   (JL)*ZMAXTIME(JL)
-            ZTOT_RREVAV (JMICRO+JL-1)=ZTOT_RREVAV (JMICRO+JL-1)+ZRREVAV   (JL)*ZMAXTIME(JL)
-            ZTOT_RCRIMSS(JMICRO+JL-1)=ZTOT_RCRIMSS(JMICRO+JL-1)+ZRCRIMSS  (JL)*ZMAXTIME(JL)
-            ZTOT_RCRIMSG(JMICRO+JL-1)=ZTOT_RCRIMSG(JMICRO+JL-1)+ZRCRIMSG  (JL)*ZMAXTIME(JL)
-            ZTOT_RSRIMCG(JMICRO+JL-1)=ZTOT_RSRIMCG(JMICRO+JL-1)+ZRSRIMCG  (JL)*ZMAXTIME(JL)+ZRSRIMCG_MR(JL)
-            ZTOT_RRACCSS(JMICRO+JL-1)=ZTOT_RRACCSS(JMICRO+JL-1)+ZRRACCSS  (JL)*ZMAXTIME(JL)
-            ZTOT_RRACCSG(JMICRO+JL-1)=ZTOT_RRACCSG(JMICRO+JL-1)+ZRRACCSG  (JL)*ZMAXTIME(JL)
-            ZTOT_RSACCRG(JMICRO+JL-1)=ZTOT_RSACCRG(JMICRO+JL-1)+ZRSACCRG  (JL)*ZMAXTIME(JL)
-            ZTOT_RSMLTG (JMICRO+JL-1)=ZTOT_RSMLTG (JMICRO+JL-1)+ZRSMLTG   (JL)*ZMAXTIME(JL)
-            ZTOT_RCMLTSR(JMICRO+JL-1)=ZTOT_RCMLTSR(JMICRO+JL-1)+ZRCMLTSR  (JL)*ZMAXTIME(JL)
-            ZTOT_RICFRRG(JMICRO+JL-1)=ZTOT_RICFRRG(JMICRO+JL-1)+ZRICFRRG  (JL)*ZMAXTIME(JL)
-            ZTOT_RRCFRIG(JMICRO+JL-1)=ZTOT_RRCFRIG(JMICRO+JL-1)+ZRRCFRIG  (JL)*ZMAXTIME(JL)
-            ZTOT_RICFRR (JMICRO+JL-1)=ZTOT_RICFRR (JMICRO+JL-1)+ZRICFRR   (JL)*ZMAXTIME(JL)
-            ZTOT_RCWETG (JMICRO+JL-1)=ZTOT_RCWETG (JMICRO+JL-1)+ZRCWETG   (JL)*ZMAXTIME(JL)
-            ZTOT_RIWETG (JMICRO+JL-1)=ZTOT_RIWETG (JMICRO+JL-1)+ZRIWETG   (JL)*ZMAXTIME(JL)
-            ZTOT_RRWETG (JMICRO+JL-1)=ZTOT_RRWETG (JMICRO+JL-1)+ZRRWETG   (JL)*ZMAXTIME(JL)
-            ZTOT_RSWETG (JMICRO+JL-1)=ZTOT_RSWETG (JMICRO+JL-1)+ZRSWETG   (JL)*ZMAXTIME(JL)
-            ZTOT_RWETGH (JMICRO+JL-1)=ZTOT_RWETGH (JMICRO+JL-1)+ZRWETGH   (JL)*ZMAXTIME(JL)+ZRWETGH_MR(JL)
-            ZTOT_RCDRYG (JMICRO+JL-1)=ZTOT_RCDRYG (JMICRO+JL-1)+ZRCDRYG   (JL)*ZMAXTIME(JL)
-            ZTOT_RIDRYG (JMICRO+JL-1)=ZTOT_RIDRYG (JMICRO+JL-1)+ZRIDRYG   (JL)*ZMAXTIME(JL)
-            ZTOT_RRDRYG (JMICRO+JL-1)=ZTOT_RRDRYG (JMICRO+JL-1)+ZRRDRYG   (JL)*ZMAXTIME(JL)
-            ZTOT_RSDRYG (JMICRO+JL-1)=ZTOT_RSDRYG (JMICRO+JL-1)+ZRSDRYG   (JL)*ZMAXTIME(JL)
-            ZTOT_RGMLTR (JMICRO+JL-1)=ZTOT_RGMLTR (JMICRO+JL-1)+ZRGMLTR   (JL)*ZMAXTIME(JL)
-            ZTOT_RCWETH (JMICRO+JL-1)=ZTOT_RCWETH (JMICRO+JL-1)+ZRCWETH   (JL)*ZMAXTIME(JL)
-            ZTOT_RIWETH (JMICRO+JL-1)=ZTOT_RIWETH (JMICRO+JL-1)+ZRIWETH   (JL)*ZMAXTIME(JL)
-            ZTOT_RSWETH (JMICRO+JL-1)=ZTOT_RSWETH (JMICRO+JL-1)+ZRSWETH   (JL)*ZMAXTIME(JL)
-            ZTOT_RGWETH (JMICRO+JL-1)=ZTOT_RGWETH (JMICRO+JL-1)+ZRGWETH   (JL)*ZMAXTIME(JL)
-            ZTOT_RRWETH (JMICRO+JL-1)=ZTOT_RRWETH (JMICRO+JL-1)+ZRRWETH   (JL)*ZMAXTIME(JL)
-            ZTOT_RCDRYH (JMICRO+JL-1)=ZTOT_RCDRYH (JMICRO+JL-1)+ZRCDRYH   (JL)*ZMAXTIME(JL)
-            ZTOT_RIDRYH (JMICRO+JL-1)=ZTOT_RIDRYH (JMICRO+JL-1)+ZRIDRYH   (JL)*ZMAXTIME(JL)
-            ZTOT_RSDRYH (JMICRO+JL-1)=ZTOT_RSDRYH (JMICRO+JL-1)+ZRSDRYH   (JL)*ZMAXTIME(JL)
-            ZTOT_RRDRYH (JMICRO+JL-1)=ZTOT_RRDRYH (JMICRO+JL-1)+ZRRDRYH   (JL)*ZMAXTIME(JL)
-            ZTOT_RGDRYH (JMICRO+JL-1)=ZTOT_RGDRYH (JMICRO+JL-1)+ZRGDRYH   (JL)*ZMAXTIME(JL)
-            ZTOT_RDRYHG (JMICRO+JL-1)=ZTOT_RDRYHG (JMICRO+JL-1)+ZRDRYHG   (JL)*ZMAXTIME(JL)
-            ZTOT_RHMLTR (JMICRO+JL-1)=ZTOT_RHMLTR (JMICRO+JL-1)+ZRHMLTR   (JL)*ZMAXTIME(JL)
-            ZTOT_RIMLTC (JMICRO+JL-1)=ZTOT_RIMLTC (JMICRO+JL-1)+ZRIMLTC_MR(JL)
-            ZTOT_RCBERI (JMICRO+JL-1)=ZTOT_RCBERI (JMICRO+JL-1)+ZRCBERI   (JL)*ZMAXTIME(JL)
-          ENDDO
-        ENDIF
-        !
-        !***       4.5 Next loop
-        !
-        LSOFT=.TRUE. ! We try to adjust tendencies (inner while loop)
-      ENDDO
-    ENDDO
-
-    IF(GEXT_TEND) THEN
-      !Z..T variables contain the external tendency, we substract it
-      DO JV=0, KRR
-        DO JL=1, IMICRO
-          ZVART(JL, JV) = ZVART(JL, JV) - ZEXTPK(JL, JV) * PTSTEP
-        ENDDO
-      ENDDO
-    ENDIF
-
-!-------------------------------------------------------------------------------
-!
-!*       5.     UNPACKING DIAGNOSTICS
-!               ---------------------
-!
-    DO JL=1, IMICRO
-      ZCITOUT  (I1(JL),I2(JL),I3(JL))=ZCIT   (JL)
-      IF(OWARM) THEN
-        PEVAP3D(I1(JL),I2(JL),I3(JL))=ZRREVAV(JL)
-      ENDIF
-      ZWR(I1(JL),I2(JL),I3(JL),IRV)=ZVART(JL, IRV)
-      ZWR(I1(JL),I2(JL),I3(JL),IRC)=ZVART(JL, IRC)
-      ZWR(I1(JL),I2(JL),I3(JL),IRR)=ZVART(JL, IRR)
-      ZWR(I1(JL),I2(JL),I3(JL),IRI)=ZVART(JL, IRI)
-      ZWR(I1(JL),I2(JL),I3(JL),IRS)=ZVART(JL, IRS)
-      ZWR(I1(JL),I2(JL),I3(JL),IRG)=ZVART(JL, IRG)
-      IF (KRR==7) THEN
-        ZWR(I1(JL),I2(JL),I3(JL),IRH)=ZVART(JL, IRH)
-      ENDIF
-    ENDDO
-
-  ENDDO ! JMICRO
-ENDIF ! KSIZE > 0
-PCIT(:,:,:)=ZCITOUT(:,:,:)
-
-!==========================================================================================================
-
-
-!
-!*       6.     COMPUTES THE SLOW COLD PROCESS SOURCES OUTSIDE OF ODMICRO POINTS
-!               ----------------------------------------------------------------
-!
-CALL ICE4_NUCLEATION_WRAPPER(KIT, KJT, KKT, .NOT. ODMICRO, &
-                             PTHT, PPABST, PRHODREF, PEXN, ZZ_LSFACT, ZT, &
-                             PRVT, &
-                             PCIT, ZZ_RVHENI_MR)
-!
-!-------------------------------------------------------------------------------
-!
-!*       7.     TOTAL TENDENCIES
-!               ----------------
-!
-!
-!***     7.1    total tendencies limited by available species
-!
-DO JK = 1, KKT
-  DO JJ = 1, KJT
-!DEC$ IVDEP
-    DO JI = 1, KIT
-      !LV/LS
-      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)
-
-      !Tendency dure to nucleation on non ODMICRO points
-      ZZ_RVHENI(JI,JJ,JK) = MIN(PRVS(JI,JJ,JK), ZZ_RVHENI_MR(JI,JJ,JK)/PTSTEP)
-
-      !Hydrometeor tendencies is the difference between old state and new state (can be negative)
-      ZWR(JI,JJ,JK,IRV)=(ZWR(JI,JJ,JK,IRV)-PRVT(JI,JJ,JK))*ZINV_TSTEP
-      ZWR(JI,JJ,JK,IRC)=(ZWR(JI,JJ,JK,IRC)-PRCT(JI,JJ,JK))*ZINV_TSTEP
-      ZWR(JI,JJ,JK,IRR)=(ZWR(JI,JJ,JK,IRR)-PRRT(JI,JJ,JK))*ZINV_TSTEP
-      ZWR(JI,JJ,JK,IRI)=(ZWR(JI,JJ,JK,IRI)-PRIT(JI,JJ,JK))*ZINV_TSTEP
-      ZWR(JI,JJ,JK,IRS)=(ZWR(JI,JJ,JK,IRS)-PRST(JI,JJ,JK))*ZINV_TSTEP
-      ZWR(JI,JJ,JK,IRG)=(ZWR(JI,JJ,JK,IRG)-PRGT(JI,JJ,JK))*ZINV_TSTEP
-      IF(KRR==7) THEN
-        ZWR(JI,JJ,JK,IRH)=(ZWR(JI,JJ,JK,IRH)-PRHT(JI,JJ,JK))*ZINV_TSTEP
-      ENDIF
-
-      !Theta tendency computed from hydrometeors tendencies
-      ZWR(JI,JJ,JK, ITH) = (ZWR(JI,JJ,JK,IRC)+ZWR(JI,JJ,JK,IRR))*ZZ_LVFACT(JI,JJ,JK)+ &
-                         & (ZWR(JI,JJ,JK,IRI)+ZWR(JI,JJ,JK,IRS)+ZWR(JI,JJ,JK,IRG)+ &
-                         &  ZWR(JI,JJ,JK,IRH))*ZZ_LSFACT(JI,JJ,JK)
-
-      !We apply these tendencies to the S variables
-      !including the nucleation part
-      PTHS(JI,JJ,JK) = PTHS(JI,JJ,JK) + ZWR(JI,JJ,JK,ITH)+ZZ_RVHENI(JI,JJ,JK)*ZZ_LSFACT(JI,JJ,JK)
-      PRVS(JI,JJ,JK) = PRVS(JI,JJ,JK) + ZWR(JI,JJ,JK,IRV)-ZZ_RVHENI(JI,JJ,JK)
-      PRCS(JI,JJ,JK) = PRCS(JI,JJ,JK) + ZWR(JI,JJ,JK,IRC)
-      PRRS(JI,JJ,JK) = PRRS(JI,JJ,JK) + ZWR(JI,JJ,JK,IRR)
-      PRIS(JI,JJ,JK) = PRIS(JI,JJ,JK) + ZWR(JI,JJ,JK,IRI)+ZZ_RVHENI(JI,JJ,JK)
-      PRSS(JI,JJ,JK) = PRSS(JI,JJ,JK) + ZWR(JI,JJ,JK,IRS)
-      PRGS(JI,JJ,JK) = PRGS(JI,JJ,JK) + ZWR(JI,JJ,JK,IRG)
-      IF (KRR==7) THEN
-        PRHS(JI,JJ,JK) = PRHS(JI,JJ,JK) + ZWR(JI,JJ,JK,IRH)
-      ENDIF
-    ENDDO
-  ENDDO
-ENDDO
-
-!
-!***     7.2    LBU_ENABLE case
-!
-IF(LBU_ENABLE) THEN
-  IF (LBUDGET_TH) THEN
-    ZZ_DIFF(:, :, :) = ZZ_LSFACT(:, :, :) - ZZ_LVFACT(:, :, :)
-  END IF
-
-  ZW(:,:,:) = 0.
-  DO JL=1, KSIZE
-    ZW(I1TOT(JL), I2TOT(JL), I3TOT(JL)) = ZTOT_RVHENI(JL) * ZINV_TSTEP
-  END DO
-  ZW(:,:,:)=ZW(:,:,:)+ZZ_RVHENI
-  IF (LBUDGET_TH) CALL BUDGET_STORE_ADD(TBUDGETS(NBUDGET_TH), 'HENU',  ZW(:, :, :)*ZZ_LSFACT(:, :, :)*PRHODJ(:, :, :))
-  IF (LBUDGET_RV) CALL BUDGET_STORE_ADD(TBUDGETS(NBUDGET_RV), 'HENU', -ZW(:, :, :)                   *PRHODJ(:, :, :))
-  IF (LBUDGET_RI) CALL BUDGET_STORE_ADD(TBUDGETS(NBUDGET_RI), 'HENU',  ZW(:, :, :)                   *PRHODJ(:, :, :))
-
-  ZW(:,:,:) = 0.
-  DO JL=1, KSIZE
-    ZW(I1TOT(JL), I2TOT(JL), I3TOT(JL)) = ZTOT_RCHONI(JL) * ZINV_TSTEP
-  END DO
-  IF (LBUDGET_TH) CALL BUDGET_STORE_ADD(TBUDGETS(NBUDGET_TH), 'HON',  ZW(:, :, :)*ZZ_DIFF(:, :, :)*PRHODJ(:, :, :))
-  IF (LBUDGET_RC) CALL BUDGET_STORE_ADD(TBUDGETS(NBUDGET_RC), 'HON', -ZW(:, :, :)                 *PRHODJ(:, :, :))
-  IF (LBUDGET_RI) CALL BUDGET_STORE_ADD(TBUDGETS(NBUDGET_RI), 'HON',  ZW(:, :, :)                 *PRHODJ(:, :, :))
-
-  ZW(:,:,:) = 0.
-  DO JL=1, KSIZE
-    ZW(I1TOT(JL), I2TOT(JL), I3TOT(JL)) = ZTOT_RRHONG(JL) * ZINV_TSTEP
-  END DO
-  IF (LBUDGET_TH) CALL BUDGET_STORE_ADD(TBUDGETS(NBUDGET_TH), 'SFR',  ZW(:, :, :)*ZZ_DIFF(:, :, :)*PRHODJ(:, :, :))
-  IF (LBUDGET_RR) CALL BUDGET_STORE_ADD(TBUDGETS(NBUDGET_RR), 'SFR', -ZW(:, :, :)                 *PRHODJ(:, :, :))
-  IF (LBUDGET_RG) CALL BUDGET_STORE_ADD(TBUDGETS(NBUDGET_RG), 'SFR',  ZW(:, :, :)                 *PRHODJ(:, :, :))
-
-  ZW(:,:,:) = 0.
-  DO JL=1, KSIZE
-    ZW(I1TOT(JL), I2TOT(JL), I3TOT(JL)) = ZTOT_RVDEPS(JL) * ZINV_TSTEP
-  END DO
-  IF (LBUDGET_TH) CALL BUDGET_STORE_ADD(TBUDGETS(NBUDGET_TH), 'DEPS',  ZW(:, :, :)*ZZ_LSFACT(:, :, :)*PRHODJ(:, :, :))
-  IF (LBUDGET_RV) CALL BUDGET_STORE_ADD(TBUDGETS(NBUDGET_RV), 'DEPS', -ZW(:, :, :)                   *PRHODJ(:, :, :))
-  IF (LBUDGET_RS) CALL BUDGET_STORE_ADD(TBUDGETS(NBUDGET_RS), 'DEPS',  ZW(:, :, :)                   *PRHODJ(:, :, :))
-
-  ZW(:,:,:) = 0.
-  DO JL=1, KSIZE
-    ZW(I1TOT(JL), I2TOT(JL), I3TOT(JL)) = ZTOT_RIAGGS(JL) * ZINV_TSTEP
-  END DO
-  IF (LBUDGET_RI) CALL BUDGET_STORE_ADD(TBUDGETS(NBUDGET_RI), 'AGGS', -ZW(:, :, :)*PRHODJ(:, :, :))
-  IF (LBUDGET_RS) CALL BUDGET_STORE_ADD(TBUDGETS(NBUDGET_RS), 'AGGS',  ZW(:, :, :)*PRHODJ(:, :, :))
-
-  ZW(:,:,:) = 0.
-  DO JL=1, KSIZE
-    ZW(I1TOT(JL), I2TOT(JL), I3TOT(JL)) = ZTOT_RIAUTS(JL) * ZINV_TSTEP
-  END DO
-  IF (LBUDGET_RI) CALL BUDGET_STORE_ADD(TBUDGETS(NBUDGET_RI), 'AUTS', -ZW(:, :, :)*PRHODJ(:, :, :))
-  IF (LBUDGET_RS) CALL BUDGET_STORE_ADD(TBUDGETS(NBUDGET_RS), 'AUTS',  ZW(:, :, :)*PRHODJ(:, :, :))
-
-  ZW(:,:,:) = 0.
-  DO JL=1, KSIZE
-    ZW(I1TOT(JL), I2TOT(JL), I3TOT(JL)) = ZTOT_RVDEPG(JL) * ZINV_TSTEP
-  END DO
-  IF (LBUDGET_TH) CALL BUDGET_STORE_ADD(TBUDGETS(NBUDGET_TH), 'DEPG',  ZW(:, :, :)*ZZ_LSFACT(:, :, :)*PRHODJ(:, :, :))
-  IF (LBUDGET_RV) CALL BUDGET_STORE_ADD(TBUDGETS(NBUDGET_RV), 'DEPG', -ZW(:, :, :)                   *PRHODJ(:, :, :))
-  IF (LBUDGET_RG) CALL BUDGET_STORE_ADD(TBUDGETS(NBUDGET_RG), 'DEPG',  ZW(:, :, :)                   *PRHODJ(:, :, :))
-
-  IF(OWARM) THEN
-    ZW(:,:,:) = 0.
-    DO JL=1, KSIZE
-      ZW(I1TOT(JL), I2TOT(JL), I3TOT(JL)) = ZTOT_RCAUTR(JL) * ZINV_TSTEP
-    END DO
-    IF (LBUDGET_RC) CALL BUDGET_STORE_ADD(TBUDGETS(NBUDGET_RC), 'AUTO', -ZW(:, :, :)*PRHODJ(:, :, :))
-    IF (LBUDGET_RR) CALL BUDGET_STORE_ADD(TBUDGETS(NBUDGET_RR), 'AUTO',  ZW(:, :, :)*PRHODJ(:, :, :))
-
-    ZW(:,:,:) = 0.
-    DO JL=1, KSIZE
-      ZW(I1TOT(JL), I2TOT(JL), I3TOT(JL)) = ZTOT_RCACCR(JL) * ZINV_TSTEP
-    END DO
-    IF (LBUDGET_RC) CALL BUDGET_STORE_ADD(TBUDGETS(NBUDGET_RC), 'ACCR', -ZW(:, :, :)*PRHODJ(:, :, :))
-    IF (LBUDGET_RR) CALL BUDGET_STORE_ADD(TBUDGETS(NBUDGET_RR), 'ACCR',  ZW(:, :, :)*PRHODJ(:, :, :))
-
-    ZW(:,:,:) = 0.
-    DO JL=1, KSIZE
-      ZW(I1TOT(JL), I2TOT(JL), I3TOT(JL)) = ZTOT_RREVAV(JL) * ZINV_TSTEP
-    END DO
-    IF (LBUDGET_TH) CALL BUDGET_STORE_ADD(TBUDGETS(NBUDGET_TH), 'REVA', -ZW(:, :, :)*ZZ_LVFACT(:, :, :)*PRHODJ(:, :, :))
-    IF (LBUDGET_RV) CALL BUDGET_STORE_ADD(TBUDGETS(NBUDGET_RV), 'REVA',  ZW(:, :, :)                   *PRHODJ(:, :, :))
-    IF (LBUDGET_RR) CALL BUDGET_STORE_ADD(TBUDGETS(NBUDGET_RR), 'REVA', -ZW(:, :, :)                   *PRHODJ(:, :, :))
-  ENDIF
-
-  ZW1(:,:,:) = 0.
-  DO JL=1, KSIZE
-    ZW1(I1TOT(JL), I2TOT(JL), I3TOT(JL)) = ZTOT_RCRIMSS(JL) * ZINV_TSTEP
-  END DO
-  ZW2(:,:,:) = 0.
-  DO JL=1, KSIZE
-    ZW2(I1TOT(JL), I2TOT(JL), I3TOT(JL)) = ZTOT_RCRIMSG(JL) * ZINV_TSTEP
-  END DO
-  ZW3(:,:,:) = 0.
-  DO JL=1, KSIZE
-    ZW3(I1TOT(JL), I2TOT(JL), I3TOT(JL)) = ZTOT_RSRIMCG(JL) * ZINV_TSTEP
-  END DO
-  IF (LBUDGET_TH) &
-    CALL BUDGET_STORE_ADD(TBUDGETS(NBUDGET_TH), 'RIM', (ZW1(:, :, :)+ZW2(:, :, :))*ZZ_DIFF(:, :, :)*PRHODJ(:, :, :))
-  IF (LBUDGET_RC) CALL BUDGET_STORE_ADD(TBUDGETS(NBUDGET_RC), 'RIM', (-ZW1(:, :, :)-ZW2(:, :, :))*PRHODJ(:, :, :))
-  IF (LBUDGET_RS) CALL BUDGET_STORE_ADD(TBUDGETS(NBUDGET_RS), 'RIM', ( ZW1(:, :, :)-ZW3(:, :, :))*PRHODJ(:, :, :))
-  IF (LBUDGET_RG) CALL BUDGET_STORE_ADD(TBUDGETS(NBUDGET_RG), 'RIM', ( ZW2(:, :, :)+ZW3(:, :, :))*PRHODJ(:, :, :))
-
-  ZW1(:,:,:) = 0.
-  DO JL=1, KSIZE
-    ZW1(I1TOT(JL), I2TOT(JL), I3TOT(JL)) = ZTOT_RRACCSS(JL) * ZINV_TSTEP
-  END DO
-  ZW2(:,:,:) = 0.
-  DO JL=1, KSIZE
-    ZW2(I1TOT(JL), I2TOT(JL), I3TOT(JL)) = ZTOT_RRACCSG(JL) * ZINV_TSTEP
-  END DO
-  ZW3(:,:,:) = 0.
-  DO JL=1, KSIZE
-    ZW3(I1TOT(JL), I2TOT(JL), I3TOT(JL)) = ZTOT_RSACCRG(JL) * ZINV_TSTEP
-  END DO
-  IF (LBUDGET_TH) &
-    CALL BUDGET_STORE_ADD(TBUDGETS(NBUDGET_TH), 'ACC', (ZW1(:, :, :)+ZW2(:, :, :) )*ZZ_DIFF(:, :, :)*PRHODJ(:, :, :))
-  IF (LBUDGET_RR) CALL BUDGET_STORE_ADD(TBUDGETS(NBUDGET_RR), 'ACC', (-ZW1(:, :, :)-ZW2(:, :, :))*PRHODJ(:, :, :))
-  IF (LBUDGET_RS) CALL BUDGET_STORE_ADD(TBUDGETS(NBUDGET_RS), 'ACC', ( ZW1(:, :, :)-ZW3(:, :, :))*PRHODJ(:, :, :))
-  IF (LBUDGET_RG) CALL BUDGET_STORE_ADD(TBUDGETS(NBUDGET_RG), 'ACC', ( ZW2(:, :, :)+ZW3(:, :, :))*PRHODJ(:, :, :))
-
-  ZW(:,:,:) = 0.
-  DO JL=1, KSIZE
-    ZW(I1TOT(JL), I2TOT(JL), I3TOT(JL)) = ZTOT_RSMLTG(JL) * ZINV_TSTEP
-  END DO
-  IF (LBUDGET_RS) CALL BUDGET_STORE_ADD(TBUDGETS(NBUDGET_RS), 'CMEL', -ZW(:, :, :)*PRHODJ(:, :, :))
-  IF (LBUDGET_RG) CALL BUDGET_STORE_ADD(TBUDGETS(NBUDGET_RG), 'CMEL',  ZW(:, :, :)*PRHODJ(:, :, :))
-  ZW(:,:,:) = 0.
-  DO JL=1, KSIZE
-    ZW(I1TOT(JL), I2TOT(JL), I3TOT(JL)) = ZTOT_RCMLTSR(JL) * ZINV_TSTEP
-  END DO
-  IF (LBUDGET_RC) CALL BUDGET_STORE_ADD(TBUDGETS(NBUDGET_RC), 'CMEL', -ZW(:, :, :)*PRHODJ(:, :, :))
-  IF (LBUDGET_RR) CALL BUDGET_STORE_ADD(TBUDGETS(NBUDGET_RR), 'CMEL',  ZW(:, :, :)*PRHODJ(:, :, :))
-
-  ZW1(:,:,:) = 0.
-  DO JL=1, KSIZE
-    ZW1(I1TOT(JL), I2TOT(JL), I3TOT(JL)) = ZTOT_RICFRRG(JL) * ZINV_TSTEP
-  END DO
-  ZW2(:,:,:) = 0.
-  DO JL=1, KSIZE
-    ZW2(I1TOT(JL), I2TOT(JL), I3TOT(JL)) = ZTOT_RRCFRIG(JL) * ZINV_TSTEP
-  END DO
-  ZW3(:,:,:) = 0.
-  DO JL=1, KSIZE
-    ZW3(I1TOT(JL), I2TOT(JL), I3TOT(JL)) = ZTOT_RICFRR(JL) * ZINV_TSTEP
-  END DO
-  IF (LBUDGET_TH) &
-    CALL BUDGET_STORE_ADD(TBUDGETS(NBUDGET_TH), 'CFRZ', ZW2(:, :, :)*ZZ_DIFF(:, :, :)*PRHODJ(:, :, :))
-  IF (LBUDGET_RR) CALL BUDGET_STORE_ADD(TBUDGETS(NBUDGET_RR), 'CFRZ', (-ZW2(:, :, :)+ZW3(:, :, :))*PRHODJ(:, :, :))
-  IF (LBUDGET_RI) CALL BUDGET_STORE_ADD(TBUDGETS(NBUDGET_RI), 'CFRZ', (-ZW1(:, :, :)-ZW3(:, :, :))*PRHODJ(:, :, :))
-  IF (LBUDGET_RG) CALL BUDGET_STORE_ADD(TBUDGETS(NBUDGET_RG), 'CFRZ', ( ZW1(:, :, :)+ZW2(:, :, :))*PRHODJ(:, :, :))
-
-  ZW1(:,:,:) = 0.
-  DO JL=1, KSIZE
-    ZW1(I1TOT(JL), I2TOT(JL), I3TOT(JL)) = ZTOT_RCWETG(JL) * ZINV_TSTEP
-  END DO
-  ZW2(:,:,:) = 0.
-  DO JL=1, KSIZE
-    ZW2(I1TOT(JL), I2TOT(JL), I3TOT(JL)) = ZTOT_RRWETG(JL) * ZINV_TSTEP
-  END DO
-  ZW3(:,:,:) = 0.
-  DO JL=1, KSIZE
-    ZW3(I1TOT(JL), I2TOT(JL), I3TOT(JL)) = ZTOT_RIWETG(JL) * ZINV_TSTEP
-  END DO
-  ZW4(:,:,:) = 0.
-  DO JL=1, KSIZE
-    ZW4(I1TOT(JL), I2TOT(JL), I3TOT(JL)) = ZTOT_RSWETG(JL) * ZINV_TSTEP
-  END DO
-  IF (LBUDGET_TH) &
-    CALL BUDGET_STORE_ADD(TBUDGETS(NBUDGET_TH), 'WETG', (ZW1(:, :, :)+ZW2(:, :, :))*ZZ_DIFF(:, :, :)*PRHODJ(:, :, :))
-  IF (LBUDGET_RC) CALL BUDGET_STORE_ADD(TBUDGETS(NBUDGET_RC), 'WETG', -zw1(:, :, :)                 *PRHODJ(:, :, :))
-  IF (LBUDGET_RR) CALL BUDGET_STORE_ADD(TBUDGETS(NBUDGET_RR), 'WETG', -zw2(:, :, :)                 *PRHODJ(:, :, :))
-  IF (LBUDGET_RI) CALL BUDGET_STORE_ADD(TBUDGETS(NBUDGET_RI), 'WETG', -zw3(:, :, :)                 *PRHODJ(:, :, :))
-  IF (LBUDGET_RS) CALL BUDGET_STORE_ADD(TBUDGETS(NBUDGET_RS), 'WETG', -zw4(:, :, :)                 *PRHODJ(:, :, :))
-  IF (LBUDGET_RG) CALL BUDGET_STORE_ADD(TBUDGETS(NBUDGET_RG), 'WETG', (ZW1(:, :, :)+ZW2(:, :, :)+ZW3(:, :, :)+ZW4(:, :, :)) &
-                                                                      &                             *PRHODJ(:, :, :))
-
-  IF(KRR==7) THEN
-    ZW(:,:,:) = 0.
-    DO JL=1, KSIZE
-      ZW(I1TOT(JL), I2TOT(JL), I3TOT(JL)) = ZTOT_RWETGH(JL) * ZINV_TSTEP
-    END DO
-    IF (LBUDGET_RG) CALL BUDGET_STORE_ADD(TBUDGETS(NBUDGET_RG), 'GHCV', -ZW(:, :, :)*PRHODJ(:, :, :))
-    IF (LBUDGET_RH) CALL BUDGET_STORE_ADD(TBUDGETS(NBUDGET_RH), 'GHCV',  ZW(:, :, :)*PRHODJ(:, :, :))
-  END IF
-
-  ZW1(:,:,:) = 0.
-  DO JL=1, KSIZE
-    ZW1(I1TOT(JL), I2TOT(JL), I3TOT(JL)) = ZTOT_RCDRYG(JL) * ZINV_TSTEP
-  END DO
-  ZW2(:,:,:) = 0.
-  DO JL=1, KSIZE
-    ZW2(I1TOT(JL), I2TOT(JL), I3TOT(JL)) = ZTOT_RRDRYG(JL) * ZINV_TSTEP
-  END DO
-  ZW3(:,:,:) = 0.
-  DO JL=1, KSIZE
-    ZW3(I1TOT(JL), I2TOT(JL), I3TOT(JL)) = ZTOT_RIDRYG(JL) * ZINV_TSTEP
-  END DO
-  ZW4(:,:,:) = 0.
-  DO JL=1, KSIZE
-    ZW4(I1TOT(JL), I2TOT(JL), I3TOT(JL)) = ZTOT_RSDRYG(JL) * ZINV_TSTEP
-  END DO
-  IF (LBUDGET_TH) &
-    CALL BUDGET_STORE_ADD(TBUDGETS(NBUDGET_TH), 'DRYG', (ZW1(:, :, :)+ZW2(:, :, :) )*ZZ_DIFF(:, :, :)*PRHODJ(:, :, :))
-  IF (LBUDGET_RC) CALL BUDGET_STORE_ADD(TBUDGETS(NBUDGET_RC), 'DRYG', -zw1(:, :, :)                  *PRHODJ(:, :, :))
-  IF (LBUDGET_RR) CALL BUDGET_STORE_ADD(TBUDGETS(NBUDGET_RR), 'DRYG', -zw2(:, :, :)                  *PRHODJ(:, :, :))
-  IF (LBUDGET_RI) CALL BUDGET_STORE_ADD(TBUDGETS(NBUDGET_RI), 'DRYG', -zw3(:, :, :)                  *PRHODJ(:, :, :))
-  IF (LBUDGET_RS) CALL BUDGET_STORE_ADD(TBUDGETS(NBUDGET_RS), 'DRYG', -zw4(:, :, :)                  *PRHODJ(:, :, :))
-  IF (LBUDGET_RG) CALL BUDGET_STORE_ADD(TBUDGETS(NBUDGET_RG), 'DRYG', (ZW1(:, :, :)+ZW2(:, :, :)+ZW3(:, :, :)+ZW4(:, :, :)) &
-                                                                      &                              *PRHODJ(:, :, :))
-
-  ZW(:,:,:) = 0.
-  DO JL=1, KSIZE
-    ZW(I1TOT(JL), I2TOT(JL), I3TOT(JL)) = ZTOT_RGMLTR(JL) * ZINV_TSTEP
-  END DO
-  IF (LBUDGET_TH) CALL BUDGET_STORE_ADD(TBUDGETS(NBUDGET_TH), 'GMLT', -ZW(:, :, :)*ZZ_DIFF(:, :, :)*PRHODJ(:, :, :))
-  IF (LBUDGET_RR) CALL BUDGET_STORE_ADD(TBUDGETS(NBUDGET_RR), 'GMLT',  ZW(:, :, :)                 *PRHODJ(:, :, :))
-  IF (LBUDGET_RG) CALL BUDGET_STORE_ADD(TBUDGETS(NBUDGET_RG), 'GMLT', -ZW(:, :, :)                 *PRHODJ(:, :, :))
-
-  IF(KRR==7) THEN
-    ZW1(:,:,:) = 0.
-    DO JL=1, KSIZE
-      ZW1(I1TOT(JL), I2TOT(JL), I3TOT(JL)) = ZTOT_RCWETH(JL) * ZINV_TSTEP
-    END DO
-    ZW2(:,:,:) = 0.
-    DO JL=1, KSIZE
-      ZW2(I1TOT(JL), I2TOT(JL), I3TOT(JL)) = ZTOT_RRWETH(JL) * ZINV_TSTEP
-    END DO
-    ZW3(:,:,:) = 0.
-    DO JL=1, KSIZE
-      ZW3(I1TOT(JL), I2TOT(JL), I3TOT(JL)) = ZTOT_RIWETH(JL) * ZINV_TSTEP
-    END DO
-    ZW4(:,:,:) = 0.
-    DO JL=1, KSIZE
-      ZW4(I1TOT(JL), I2TOT(JL), I3TOT(JL)) = ZTOT_RSWETH(JL) * ZINV_TSTEP
-    END DO
-    ZW5(:,:,:) = 0.
-    DO JL=1, KSIZE
-      ZW5(I1TOT(JL), I2TOT(JL), I3TOT(JL)) = ZTOT_RGWETH(JL) * ZINV_TSTEP
-    END DO
-    IF (LBUDGET_TH) &
-      CALL BUDGET_STORE_ADD(TBUDGETS(NBUDGET_TH), 'WETH', (ZW1(:, :, :)+ZW2(:, :, :))*ZZ_DIFF(:, :, :)*PRHODJ(:, :, :))
-    IF (LBUDGET_RC) CALL BUDGET_STORE_ADD(TBUDGETS(NBUDGET_RC), 'WETH', -ZW1(:, :, :)                 *PRHODJ(:, :, :))
-    IF (LBUDGET_RR) CALL BUDGET_STORE_ADD(TBUDGETS(NBUDGET_RR), 'WETH', -ZW2(:, :, :)                 *PRHODJ(:, :, :))
-    IF (LBUDGET_RI) CALL BUDGET_STORE_ADD(TBUDGETS(NBUDGET_RI), 'WETH', -ZW3(:, :, :)                 *PRHODJ(:, :, :))
-    IF (LBUDGET_RS) CALL BUDGET_STORE_ADD(TBUDGETS(NBUDGET_RS), 'WETH', -ZW4(:, :, :)                 *PRHODJ(:, :, :))
-    IF (LBUDGET_RG) CALL BUDGET_STORE_ADD(TBUDGETS(NBUDGET_RG), 'WETH', -ZW5(:, :, :)                 *PRHODJ(:, :, :))
-    IF (LBUDGET_RH) CALL BUDGET_STORE_ADD(TBUDGETS(NBUDGET_RH), 'WETH', (ZW1(:, :, :)+ZW2(:, :, :)+ZW3(:, :, :)+ &
-                                                                        &ZW4(:, :, :)+ZW5(:, :, : ))  *PRHODJ(:, :, :))
-
-    ZW(:,:,:) = 0.
-    DO JL=1, KSIZE
-      ZW(I1TOT(JL), I2TOT(JL), I3TOT(JL)) = ZTOT_RGWETH(JL) * ZINV_TSTEP
-    END DO
-    IF (LBUDGET_RG) CALL BUDGET_STORE_ADD(TBUDGETS(NBUDGET_RG), 'HGCV', -ZW(:, :, :)*PRHODJ(:, :, :))
-    IF (LBUDGET_RH) CALL BUDGET_STORE_ADD(TBUDGETS(NBUDGET_RH), 'HGCV',  ZW(:, :, :)*PRHODJ(:, :, :))
-
-    ZW1(:,:,:) = 0.
-    DO JL=1, KSIZE
-      ZW1(I1TOT(JL), I2TOT(JL), I3TOT(JL)) = ZTOT_RCDRYH(JL) * ZINV_TSTEP
-    END DO
-    ZW2(:,:,:) = 0.
-    DO JL=1, KSIZE
-      ZW2(I1TOT(JL), I2TOT(JL), I3TOT(JL)) = ZTOT_RRDRYH(JL) * ZINV_TSTEP
-    END DO
-    ZW3(:,:,:) = 0.
-    DO JL=1, KSIZE
-      ZW3(I1TOT(JL), I2TOT(JL), I3TOT(JL)) = ZTOT_RIDRYH(JL) * ZINV_TSTEP
-    END DO
-    ZW4(:,:,:) = 0.
-    DO JL=1, KSIZE
-      ZW4(I1TOT(JL), I2TOT(JL), I3TOT(JL)) = ZTOT_RSDRYH(JL) * ZINV_TSTEP
-    END DO
-    ZW5(:,:,:) = 0.
-    DO JL=1, KSIZE
-      ZW5(I1TOT(JL), I2TOT(JL), I3TOT(JL)) = ZTOT_RGDRYH(JL) * ZINV_TSTEP
-    END DO
-    ZW6(:,:,:) = 0.
-    DO JL=1, KSIZE
-      ZW6(I1TOT(JL), I2TOT(JL), I3TOT(JL)) = ZTOT_RDRYHG(JL) * ZINV_TSTEP
-    END DO
-    IF (LBUDGET_TH) &
-      CALL BUDGET_STORE_ADD(TBUDGETS(NBUDGET_TH), 'DRYH', (ZW1(:, :, :)+ZW2(:, :, :))*ZZ_DIFF(:, :, :)*PRHODJ(:, :, :))
-    IF (LBUDGET_RC) CALL BUDGET_STORE_ADD(TBUDGETS(NBUDGET_RC), 'DRYH', -ZW1(:, :, :)                 *PRHODJ(:, :, :))
-    IF (LBUDGET_RR) CALL BUDGET_STORE_ADD(TBUDGETS(NBUDGET_RR), 'DRYH', -ZW2(:, :, :)                 *PRHODJ(:, :, :))
-    IF (LBUDGET_RI) CALL BUDGET_STORE_ADD(TBUDGETS(NBUDGET_RI), 'DRYH', -ZW3(:, :, :)                 *PRHODJ(:, :, :))
-    IF (LBUDGET_RS) CALL BUDGET_STORE_ADD(TBUDGETS(NBUDGET_RS), 'DRYH', -ZW4(:, :, :)                 *PRHODJ(:, :, :))
-    IF (LBUDGET_RG) CALL BUDGET_STORE_ADD(TBUDGETS(NBUDGET_RG), 'DRYH', (-ZW5(:, :, :)+ZW6(:, :, : )) *PRHODJ(:, :, :))
-    IF (LBUDGET_RH) CALL BUDGET_STORE_ADD(TBUDGETS(NBUDGET_RH), 'DRYH', (ZW1(:, :, :)+ZW2(:, :, :)+ZW3(:, :, :)+   &
-                                                                        &ZW4(:, :, :)+ZW5(:, :, : )-ZW6(:, :, :)) &
-                                                                        &                             *PRHODJ(:, :, :))
-
-    ZW(:,:,:) = 0.
-    DO JL=1, KSIZE
-      ZW(I1TOT(JL), I2TOT(JL), I3TOT(JL)) = ZTOT_RHMLTR(JL) * ZINV_TSTEP
-    END DO
-    IF (LBUDGET_TH) CALL BUDGET_STORE_ADD(TBUDGETS(NBUDGET_TH), 'HMLT', -ZW(:, :, :)*ZZ_DIFF(:, :, :)*PRHODJ(:, :, :))
-    IF (LBUDGET_RR) CALL BUDGET_STORE_ADD(TBUDGETS(NBUDGET_RR), 'HMLT',  ZW(:, :, :)                 *PRHODJ(:, :, :))
-    IF (LBUDGET_RH) CALL BUDGET_STORE_ADD(TBUDGETS(NBUDGET_RH), 'HMLT', -ZW(:, :, :)                 *PRHODJ(:, :, :))
-  ENDIF
-
-  ZW(:,:,:) = 0.
-  DO JL=1, KSIZE
-    ZW(I1TOT(JL), I2TOT(JL), I3TOT(JL)) = ZTOT_RIMLTC(JL) * ZINV_TSTEP
-  END DO
-  IF (LBUDGET_TH) CALL BUDGET_STORE_ADD(TBUDGETS(NBUDGET_TH), 'IMLT', -ZW(:, :, :)*ZZ_DIFF(:, :, :)*PRHODJ(:, :, :))
-  IF (LBUDGET_RC) CALL BUDGET_STORE_ADD(TBUDGETS(NBUDGET_RC), 'IMLT',  ZW(:, :, :)                 *PRHODJ(:, :, :))
-  IF (LBUDGET_RI) CALL BUDGET_STORE_ADD(TBUDGETS(NBUDGET_RI), 'IMLT', -ZW(:, :, :)                 *PRHODJ(:, :, :))
-
-  ZW(:,:,:) = 0.
-  DO JL=1, KSIZE
-    ZW(I1TOT(JL), I2TOT(JL), I3TOT(JL)) = ZTOT_RCBERI(JL) * ZINV_TSTEP
-  END DO
-  IF (LBUDGET_TH) CALL BUDGET_STORE_ADD(TBUDGETS(NBUDGET_TH), 'BERFI',  ZW(:, :, :)*ZZ_DIFF(:, :, :)*PRHODJ(:, :, :))
-  IF (LBUDGET_RC) CALL BUDGET_STORE_ADD(TBUDGETS(NBUDGET_RC), 'BERFI', -ZW(:, :, :)                 *PRHODJ(:, :, :))
-  IF (LBUDGET_RI) CALL BUDGET_STORE_ADD(TBUDGETS(NBUDGET_RI), 'BERFI',  ZW(:, :, :)                 *PRHODJ(:, :, :))
-
-ENDIF
-!
-!***     7.3    Final tendencies
-!
-IF (LBU_ENABLE) THEN
-  IF (LBUDGET_TH) CALL BUDGET_STORE_INIT(TBUDGETS(NBUDGET_TH), 'CORR', PTHS(:, :, :)*PRHODJ(:, :, :))
-  IF (LBUDGET_RV) CALL BUDGET_STORE_INIT(TBUDGETS(NBUDGET_RV), 'CORR', PRVS(:, :, :)*PRHODJ(:, :, :))
-  IF (LBUDGET_RC) CALL BUDGET_STORE_INIT(TBUDGETS(NBUDGET_RC), 'CORR', PRCS(:, :, :)*PRHODJ(:, :, :))
-  IF (LBUDGET_RR) CALL BUDGET_STORE_INIT(TBUDGETS(NBUDGET_RR), 'CORR', PRSS(:, :, :)*PRHODJ(:, :, :))
-  IF (LBUDGET_RI) CALL BUDGET_STORE_INIT(TBUDGETS(NBUDGET_RI), 'CORR', PRIS(:, :, :)*PRHODJ(:, :, :))
-  IF (LBUDGET_RS) CALL BUDGET_STORE_INIT(TBUDGETS(NBUDGET_RS), 'CORR', PRSS(:, :, :)*PRHODJ(:, :, :))
-  IF (LBUDGET_RG) CALL BUDGET_STORE_INIT(TBUDGETS(NBUDGET_RG), 'CORR', PRGS(:, :, :)*PRHODJ(:, :, :))
-  IF (LBUDGET_RH .AND. KRR==7) CALL BUDGET_STORE_INIT(TBUDGETS(NBUDGET_RH), 'CORR', PRHS(:, :, :)*PRHODJ(:, :, :))
-END IF
-
-!NOTE:
-!  This call cannot be moved before the preeceding budget calls because,
-!  with AROME, the BUDGET_STORE_INIT does nothing. The equivalent is done only
-!  once before the physics call and copies of the S variables evolve automatically
-!  internally to the budget (DDH) machinery at each BUDGET_STORE_ADD and
-!  BUDGET_STORE_END calls. Thus, the difference between the DDH internal version
-!  of the S variables and the S variables used in the folowing BUDGET_STORE_END
-!  call must only be due to the correction of negativities.
-!
-!We correct negativities with conservation
-CALL CORRECT_NEGATIVITIES(KIT, KJT, KKT, KRR, PRVS, PRCS, PRRS, &
-                         &PRIS, PRSS, PRGS, &
-                         &PTHS, ZZ_LVFACT, ZZ_LSFACT, PRHS)
-
-IF (LBU_ENABLE) THEN
-  IF (LBUDGET_TH) CALL BUDGET_STORE_END(TBUDGETS(NBUDGET_TH), 'CORR', PTHS(:, :, :)*PRHODJ(:, :, :))
-  IF (LBUDGET_RV) CALL BUDGET_STORE_END(TBUDGETS(NBUDGET_RV), 'CORR', PRVS(:, :, :)*PRHODJ(:, :, :))
-  IF (LBUDGET_RC) CALL BUDGET_STORE_END(TBUDGETS(NBUDGET_RC), 'CORR', PRCS(:, :, :)*PRHODJ(:, :, :))
-  IF (LBUDGET_RR) CALL BUDGET_STORE_END(TBUDGETS(NBUDGET_RR), 'CORR', PRRS(:, :, :)*PRHODJ(:, :, :))
-  IF (LBUDGET_RI) CALL BUDGET_STORE_END(TBUDGETS(NBUDGET_RI), 'CORR', PRIS(:, :, :)*PRHODJ(:, :, :))
-  IF (LBUDGET_RS) CALL BUDGET_STORE_END(TBUDGETS(NBUDGET_RS), 'CORR', PRSS(:, :, :)*PRHODJ(:, :, :))
-  IF (LBUDGET_RG) CALL BUDGET_STORE_END(TBUDGETS(NBUDGET_RG), 'CORR', PRGS(:, :, :)*PRHODJ(:, :, :))
-  IF (LBUDGET_RH .AND. KRR==7) CALL BUDGET_STORE_END(TBUDGETS(NBUDGET_RH), 'CORR', PRHS(:, :, :)*PRHODJ(:, :, :))
-END IF
-!
-!-------------------------------------------------------------------------------
-!
-!*       8.     COMPUTE THE SEDIMENTATION (RS) SOURCE
-!               -------------------------------------
-!
-IF(LSEDIM_AFTER) THEN
-  !
-  !*       8.1     sedimentation
-  !
-  IF (LBUDGET_RC .and. osedic) CALL BUDGET_STORE_INIT(TBUDGETS(NBUDGET_RC), 'SEDI', PRCS(:, :, :) * PRHODJ(:, :, :))
-  IF (LBUDGET_RR)              CALL BUDGET_STORE_INIT(TBUDGETS(NBUDGET_RR), 'SEDI', PRRS(:, :, :) * PRHODJ(:, :, :))
-  IF (LBUDGET_RI)              CALL BUDGET_STORE_INIT(TBUDGETS(NBUDGET_RI), 'SEDI', PRIS(:, :, :) * PRHODJ(:, :, :))
-  IF (LBUDGET_RS)              CALL BUDGET_STORE_INIT(TBUDGETS(NBUDGET_RS), 'SEDI', PRSS(:, :, :) * PRHODJ(:, :, :))
-  IF (LBUDGET_RG)              CALL BUDGET_STORE_INIT(TBUDGETS(NBUDGET_RG), 'SEDI', PRGS(:, :, :) * PRHODJ(:, :, :))
-  IF (LBUDGET_RH .AND. KRR==7) CALL BUDGET_STORE_INIT(TBUDGETS(NBUDGET_RH), 'SEDI', PRHS(:, :, :) * PRHODJ(:, :, :))
-
-  IF(HSEDIM=='STAT') THEN
-    IF (KRR==7) THEN
-      DO JK = 1, KKT
-        DO JJ = 1, KJT
-          DO JI = 1, KIT
-            ZRCT(JI,JJ,JK)=PRCS(JI,JJ,JK)*PTSTEP
-            ZRRT(JI,JJ,JK)=PRRS(JI,JJ,JK)*PTSTEP
-            ZRIT(JI,JJ,JK)=PRIS(JI,JJ,JK)*PTSTEP
-            ZRST(JI,JJ,JK)=PRSS(JI,JJ,JK)*PTSTEP
-            ZRGT(JI,JJ,JK)=PRGS(JI,JJ,JK)*PTSTEP
-            ZRHT(JI,JJ,JK)=PRHS(JI,JJ,JK)*PTSTEP
-          ENDDO
-        ENDDO
-      ENDDO
-      CALL ICE4_SEDIMENTATION_STAT(IIB, IIE, KIT, IJB, IJE, KJT, IKB, IKE, IKTB, IKTE, KKT, KKL, &
-                                  &PTSTEP, KRR, OSEDIC, PDZZ, &
-                                  &PRHODREF, PPABST, PTHT, PRHODJ, &
-                                  &PRCS, ZRCT, PRRS, ZRRT, PRIS, ZRIT,&
-                                  &PRSS, ZRST, PRGS, ZRGT,&
-                                  &PINPRC, PINPRR, ZINPRI, PINPRS, PINPRG, &
-                                  &PSEA=PSEA, PTOWN=PTOWN, &
-                                  &PINPRH=PINPRH, PRHT=ZRHT, PRHS=PRHS, PFPR=PFPR)
-    ELSE
-      DO JK = 1, KKT
-        DO JJ = 1, KJT
-          DO JI = 1, KIT
-            ZRCT(JI,JJ,JK)=PRCS(JI,JJ,JK)*PTSTEP
-            ZRRT(JI,JJ,JK)=PRRS(JI,JJ,JK)*PTSTEP
-            ZRIT(JI,JJ,JK)=PRIS(JI,JJ,JK)*PTSTEP
-            ZRST(JI,JJ,JK)=PRSS(JI,JJ,JK)*PTSTEP
-            ZRGT(JI,JJ,JK)=PRGS(JI,JJ,JK)*PTSTEP
-          ENDDO
-        ENDDO
-      ENDDO
-      CALL ICE4_SEDIMENTATION_STAT(IIB, IIE, KIT, IJB, IJE, KJT, IKB, IKE, IKTB, IKTE, KKT, KKL, &
-                                  &PTSTEP, KRR, OSEDIC, PDZZ, &
-                                  &PRHODREF, PPABST, PTHT, PRHODJ, &
-                                  &PRCS, ZRCT, PRRS, ZRRT, PRIS, ZRIT,&
-                                  &PRSS, ZRST, PRGS, ZRGT,&
-                                  &PINPRC, PINPRR, ZINPRI, PINPRS, PINPRG, &
-                                  &PSEA=PSEA, PTOWN=PTOWN, &
-                                  &PFPR=PFPR)
-    ENDIF
-    PINPRS(:,:) = PINPRS(:,:) + ZINPRI(:,:)
-    !No negativity correction here as we apply sedimentation on PR.S*PTSTEP variables
-  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, KIT, IJB, IJE, KJT, IKB, IKE, IKTB, IKTE, KKT, KKL, &
-                                   &PTSTEP, KRR, OSEDIC, PDZZ, &
-                                   &PRHODREF, PPABST, PTHT, PRHODJ, &
-                                   &PRCS, PRCT, PRRS, PRRT, PRIS, PRIT, PRSS, PRST, PRGS, PRGT,&
-                                   &PINPRC, PINPRR, ZINPRI, PINPRS, PINPRG, &
-                                   &PSEA=PSEA, PTOWN=PTOWN, &
-                                   &PINPRH=PINPRH, PRHT=PRHT, PRHS=PRHS, PFPR=PFPR)
-    ELSE
-      CALL ICE4_SEDIMENTATION_SPLIT(IIB, IIE, KIT, IJB, IJE, KJT, IKB, IKE, IKTB, IKTE, KKT, KKL, &
-                                   &PTSTEP, KRR, OSEDIC, PDZZ, &
-                                   &PRHODREF, PPABST, PTHT, PRHODJ, &
-                                   &PRCS, PRCT, PRRS, PRRT, PRIS, PRIT, PRSS, PRST, PRGS, PRGT,&
-                                   &PINPRC, PINPRR, ZINPRI, PINPRS, PINPRG, &
-                                   &PSEA=PSEA, PTOWN=PTOWN, &
-                                   &PFPR=PFPR)
-    ENDIF
-    PINPRS(:,:) = PINPRS(:,:) + ZINPRI(:,:)
-    !We correct negativities with conservation
-    !SPLI algorith uses a time-splitting. Inside the loop a temporary m.r. is used.
-    !   It is initialized with the m.r. at T and is modified by two tendencies:
-    !   sedimentation tendency and an external tendency which represents all other
-    !   processes (mainly advection and microphysical processes). If both tendencies
-    !   are negative, sedimentation can remove a species at a given sub-timestep. From
-    !   this point sedimentation stops for the remaining sub-timesteps but the other tendency
-    !   will be still active and will lead to negative values.
-    !   We could prevent the algorithm to not consume too much a species, instead we apply
-    !   a correction here.
-    CALL CORRECT_NEGATIVITIES(KIT, KJT, KKT, KRR, PRVS, PRCS, PRRS, &
-                             &PRIS, PRSS, PRGS, &
-                             &PTHS, ZZ_LVFACT, ZZ_LSFACT, PRHS)
-  ELSE
-    CALL PRINT_MSG(NVERB_FATAL, 'GEN', 'RAIN_ICE', 'no sedimentation scheme for HSEDIM='//HSEDIM)
-  END IF
-  !
-  !*       8.2     budget storage
-  !
-  IF (LBUDGET_RC .AND. OSEDIC)   CALL BUDGET_STORE_END(TBUDGETS(NBUDGET_RC), 'SEDI', PRCS(:, :, :) * PRHODJ(:, :, :))
-  IF (LBUDGET_RR)                CALL BUDGET_STORE_END(TBUDGETS(NBUDGET_RR), 'SEDI', PRRS(:, :, :) * PRHODJ(:, :, :))
-  IF (LBUDGET_RI)                CALL BUDGET_STORE_END(TBUDGETS(NBUDGET_RI), 'SEDI', PRIS(:, :, :) * PRHODJ(:, :, :))
-  IF (LBUDGET_RS)                CALL BUDGET_STORE_END(TBUDGETS(NBUDGET_RS), 'SEDI', PRSS(:, :, :) * PRHODJ(:, :, :))
-  IF (LBUDGET_RG)                CALL BUDGET_STORE_END(TBUDGETS(NBUDGET_RG), 'SEDI', PRGS(:, :, :) * PRHODJ(:, :, :))
-  IF (LBUDGET_RH .AND. KRR==7)   CALL BUDGET_STORE_END(TBUDGETS(NBUDGET_RH), 'SEDI', PRHS(:, :, :) * PRHODJ(:, :, :))
-
-  !"sedimentation" of rain fraction
-  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
-!
-!-------------------------------------------------------------------------------
-!
-!*       9.     COMPUTE THE FOG DEPOSITION TERM 
-!               -------------------------------------
-!
-IF (LDEPOSC) THEN !cloud water deposition on vegetation
-  IF (LBU_ENABLE .AND. LBUDGET_RC) &
-     & CALL BUDGET_STORE_INIT(TBUDGETS(NBUDGET_RC), 'DEPO', PRCS(:, :, :)*PRHODJ(:, :, :))
-
-  DO JJ = 1, KJT
-!DEC$ IVDEP
-    DO JI = 1, KIT
-      PINDEP(JI, JJ) = XVDEPOSC * PRCT(JI, JJ, IKB) * PRHODREF(JI, JJ, IKB) / XRHOLW
-      PRCS(JI, JJ, IKB) = PRCS(JI, JJ, IKB) - XVDEPOSC * PRCT(JI, JJ, IKB) / PDZZ(JI, JJ, IKB)
-      PINPRC(JI, JJ) = PINPRC(JI, JJ) + PINDEP(JI, JJ)
-    ENDDO
-  ENDDO
-
-  IF (LBU_ENABLE .AND. LBUDGET_RC) &
-     & CALL BUDGET_STORE_END(TBUDGETS(NBUDGET_RC), 'DEPO', PRCS(:, :, :)*PRHODJ(:, :, :))
-ENDIF
-
-IF (LHOOK) CALL DR_HOOK('RAIN_ICE', 1, ZHOOK_HANDLE)
-!
-CONTAINS
-  !
-  SUBROUTINE CORRECT_NEGATIVITIES(KIT, KJT, KKT, KRR, PRV, PRC, PRR, &
-                                 &PRI, PRS, PRG, &
-                                 &PTH, PLVFACT, PLSFACT, PRH)
-  !
-  IMPLICIT NONE
-  !
-  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 :: ZW
-  INTEGER :: JI, JJ, JK
-  REAL(KIND=JPRB) :: ZHOOK_HANDLE
-  !
-  IF (LHOOK) CALL DR_HOOK('RAIN_ICE:CORRECT_NEGATIVITIES', 0, ZHOOK_HANDLE)
-  !
-  !We correct negativities with conservation
-  DO JK = 1, KKT
-    DO JJ = 1, KJT
-      DO JI = 1, KIT
-        ! 1) deal with negative values for mixing ratio, except for vapor
-        ZW           =PRC(JI,JJ,JK)-MAX(PRC(JI,JJ,JK), 0.)
-        PRV(JI,JJ,JK)=PRV(JI,JJ,JK)+ZW
-        PTH(JI,JJ,JK)=PTH(JI,JJ,JK)-ZW*PLVFACT(JI,JJ,JK)
-        PRC(JI,JJ,JK)=PRC(JI,JJ,JK)-ZW
-
-        ZW           =PRR(JI,JJ,JK)-MAX(PRR(JI,JJ,JK), 0.)
-        PRV(JI,JJ,JK)=PRV(JI,JJ,JK)+ZW
-        PTH(JI,JJ,JK)=PTH(JI,JJ,JK)-ZW*PLVFACT(JI,JJ,JK)
-        PRR(JI,JJ,JK)=PRR(JI,JJ,JK)-ZW
-
-        ZW           =PRI(JI,JJ,JK)-MAX(PRI(JI,JJ,JK), 0.)
-        PRV(JI,JJ,JK)=PRV(JI,JJ,JK)+ZW
-        PTH(JI,JJ,JK)=PTH(JI,JJ,JK)-ZW*PLSFACT(JI,JJ,JK)
-        PRI(JI,JJ,JK)=PRI(JI,JJ,JK)-ZW
-
-        ZW           =PRS(JI,JJ,JK)-MAX(PRS(JI,JJ,JK), 0.)
-        PRV(JI,JJ,JK)=PRV(JI,JJ,JK)+ZW
-        PTH(JI,JJ,JK)=PTH(JI,JJ,JK)-ZW*PLSFACT(JI,JJ,JK)
-        PRS(JI,JJ,JK)=PRS(JI,JJ,JK)-ZW
-
-        ZW           =PRG(JI,JJ,JK)-MAX(PRG(JI,JJ,JK), 0.)
-        PRV(JI,JJ,JK)=PRV(JI,JJ,JK)+ZW
-        PTH(JI,JJ,JK)=PTH(JI,JJ,JK)-ZW*PLSFACT(JI,JJ,JK)
-        PRG(JI,JJ,JK)=PRG(JI,JJ,JK)-ZW
-
-        IF(KRR==7) THEN
-          ZW           =PRH(JI,JJ,JK)-MAX(PRH(JI,JJ,JK), 0.)
-          PRV(JI,JJ,JK)=PRV(JI,JJ,JK)+ZW
-          PTH(JI,JJ,JK)=PTH(JI,JJ,JK)-ZW*PLSFACT(JI,JJ,JK)
-          PRH(JI,JJ,JK)=PRH(JI,JJ,JK)-ZW
-        ENDIF
-
-        ! 2) deal with negative vapor mixing ratio
-
-        ! for rc and ri, we keep ice fraction constant
-        ZW=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* &
-                     &(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*(PRC(JI,JJ,JK)+PRI(JI,JJ,JK))
-        PRC(JI,JJ,JK)=(1.-ZW)*PRC(JI,JJ,JK)
-        PRI(JI,JJ,JK)=(1.-ZW)*PRI(JI,JJ,JK)
-
-        ZW=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
-        PRR(JI,JJ,JK)=PRR(JI,JJ,JK)-ZW
-        PTH(JI,JJ,JK)=PTH(JI,JJ,JK)-ZW*PLVFACT(JI,JJ,JK)
-
-        ZW=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
-        PRS(JI,JJ,JK)=PRS(JI,JJ,JK)-ZW
-        PTH(JI,JJ,JK)=PTH(JI,JJ,JK)-ZW*PLSFACT(JI,JJ,JK)
-
-        ZW=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
-        PRG(JI,JJ,JK)=PRG(JI,JJ,JK)-ZW
-        PTH(JI,JJ,JK)=PTH(JI,JJ,JK)-ZW*PLSFACT(JI,JJ,JK)
-
-        IF(KRR==7) THEN
-          ZW=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
-          PRH(JI,JJ,JK)=PRH(JI,JJ,JK)-ZW
-          PTH(JI,JJ,JK)=PTH(JI,JJ,JK)-ZW*PLSFACT(JI,JJ,JK)
-        ENDIF
-      ENDDO
-    ENDDO
-  ENDDO
-  !
-  IF (LHOOK) CALL DR_HOOK('RAIN_ICE:CORRECT_NEGATIVITIES', 1, ZHOOK_HANDLE)
-  !
-  END SUBROUTINE CORRECT_NEGATIVITIES
-
-!
-END SUBROUTINE RAIN_ICE_RED