From 70b0e1fe38353b1cae6fcbb41331683df5e793f0 Mon Sep 17 00:00:00 2001
From: =?UTF-8?q?S=C3=A9bastien=20Riette?= <sebastien.riette@meteo.fr>
Date: Thu, 19 Jan 2023 12:47:35 +0100
Subject: [PATCH] S. Riette 19 Jan 2022: enable rain_ice to run without packing

---
 docs/TODO                                |   2 +-
 src/arome/ext/aro_rain_ice.F90           |   8 +-
 src/arome/ext/aro_rain_ice.h             |   8 +-
 src/arome/ext/aroini_micro.F90           |   1 +
 src/common/micro/modd_param_ice.F90      |   5 +-
 src/common/micro/mode_ice4_budgets.F90   |   7 +-
 src/common/micro/mode_ice4_pack.F90      | 397 +++++++++++++----------
 src/common/micro/mode_ice4_stepping.F90  |  21 +-
 src/common/micro/modi_rain_ice.F90       |   8 +-
 src/common/micro/rain_ice.F90            |  51 +--
 src/mesonh/ext/default_desfmn.f90        |   1 +
 src/testprogs/rain_ice/main_rain_ice.F90 |   6 +-
 12 files changed, 298 insertions(+), 217 deletions(-)

diff --git a/docs/TODO b/docs/TODO
index 419bcb0ab..a67078606 100644
--- a/docs/TODO
+++ b/docs/TODO
@@ -48,7 +48,7 @@ Pb identifiés à corriger plus tard:
   - th_r_from_thl_rt appelée partout, il faudrait limiter à OTEST
   - La taille du buffer utilisé pour th_r_from_thl_rt doit être mise en module et
     utilisée pour déclarer le buffer dans les routines appelantes et dans th_r_from_thl_rt
-  - rain_ice: coder d'autres implémentations de ice4_pack (filtre LLMICRO seul et/ou découpage en sous-blocs, rien)
+  - l'option LPACK_MICRO=FALSE ne fonctionne pas dans Méso-NH (commentaire dans default_desfmn)
   - shuman, turb, shuman_mf, apl_arome
     - peut-on remettre à jour la partie sous le sol des variables pronostiques avant d'entrer dans EDKFi dans Méso-NH? Si oui, on devrait pouvoir
       récrire les shuman_mf pour qu'ils produisent les mêmes résultats qu'aujourd'hui mais sans utiliser les valeurs sous le sol ou dans "l'espace infini"
diff --git a/src/arome/ext/aro_rain_ice.F90 b/src/arome/ext/aro_rain_ice.F90
index a1ffbacc4..9fbb93287 100644
--- a/src/arome/ext/aro_rain_ice.F90
+++ b/src/arome/ext/aro_rain_ice.F90
@@ -144,10 +144,10 @@ REAL, DIMENSION(KLON,1,KLEV),   INTENT(IN)   :: PEXNREF ! Reference Exner functi
 !
 !
 REAL, DIMENSION(KLON,1,KLEV),   INTENT(IN)   :: PPABSM  ! abs. pressure at time t-dt
-REAL, DIMENSION(KLON,1,KLEV),   INTENT(IN)   :: PHLC_HRC
-REAL, DIMENSION(KLON,1,KLEV),   INTENT(IN)   :: PHLC_HCF
-REAL, DIMENSION(KLON,1,KLEV),   INTENT(IN)   :: PHLI_HRI
-REAL, DIMENSION(KLON,1,KLEV),   INTENT(IN)   :: PHLI_HCF
+REAL, DIMENSION(KLON,1,KLEV),   INTENT(INOUT):: PHLC_HRC
+REAL, DIMENSION(KLON,1,KLEV),   INTENT(INOUT):: PHLC_HCF
+REAL, DIMENSION(KLON,1,KLEV),   INTENT(INOUT):: PHLI_HRI
+REAL, DIMENSION(KLON,1,KLEV),   INTENT(INOUT):: PHLI_HCF
 REAL, DIMENSION(KLON,1,KLEV),   INTENT(IN)   :: PTHT    ! Theta at time t
 REAL, DIMENSION(KLON,1,KLEV,KRR), INTENT(INOUT):: PRT   ! Moist variables at time t
 REAL, DIMENSION(KLON,1,KLEV),   INTENT(IN)   :: PSIGS   ! Sigma_s at time t
diff --git a/src/arome/ext/aro_rain_ice.h b/src/arome/ext/aro_rain_ice.h
index e2fa8e26d..8f60c9152 100644
--- a/src/arome/ext/aro_rain_ice.h
+++ b/src/arome/ext/aro_rain_ice.h
@@ -38,10 +38,10 @@ REAL(KIND=JPRB), DIMENSION(KLON,1,KLEV), INTENT(IN) :: PRHODJ
 REAL(KIND=JPRB), DIMENSION(KLON,1,KLEV), INTENT(IN) :: PRHODREF
 REAL(KIND=JPRB), DIMENSION(KLON,1,KLEV), INTENT(IN) :: PEXNREF
 REAL(KIND=JPRB), DIMENSION(KLON,1,KLEV), INTENT(IN) :: PPABSM
-REAL(KIND=JPRB), DIMENSION(KLON,1,KLEV), INTENT(IN) :: PHLC_HRC
-REAL(KIND=JPRB), DIMENSION(KLON,1,KLEV), INTENT(IN) :: PHLC_HCF
-REAL(KIND=JPRB), DIMENSION(KLON,1,KLEV), INTENT(IN) :: PHLI_HRI
-REAL(KIND=JPRB), DIMENSION(KLON,1,KLEV), INTENT(IN) :: PHLI_HCF
+REAL(KIND=JPRB), DIMENSION(KLON,1,KLEV), INTENT(INOUT) :: PHLC_HRC
+REAL(KIND=JPRB), DIMENSION(KLON,1,KLEV), INTENT(INOUT) :: PHLC_HCF
+REAL(KIND=JPRB), DIMENSION(KLON,1,KLEV), INTENT(INOUT) :: PHLI_HRI
+REAL(KIND=JPRB), DIMENSION(KLON,1,KLEV), INTENT(INOUT) :: PHLI_HCF
 REAL(KIND=JPRB), DIMENSION(KLON,1,KLEV), INTENT(IN) :: PTHT
 REAL(KIND=JPRB), DIMENSION(KLON,1,KLEV,KRR), INTENT(INOUT):: PRT
 REAL(KIND=JPRB), DIMENSION(KLON,1,KLEV), INTENT(IN) :: PSIGS
diff --git a/src/arome/ext/aroini_micro.F90 b/src/arome/ext/aroini_micro.F90
index 2c58dac78..faee8673b 100644
--- a/src/arome/ext/aroini_micro.F90
+++ b/src/arome/ext/aroini_micro.F90
@@ -151,6 +151,7 @@ LSEDIC=LDSEDIC
 LSNOW_T=.FALSE.
 LRED=CMICRO=='ICE3' .OR. CMICRO=='ICE4'
 LPACK_INTERP=.TRUE.
+LPACK_MICRO=.TRUE.
 CALL INI_RAIN_ICE (KULOUT, PTSTEP, 20.,KSPLITR,CMICRO)
 CALL INI_TIWMX
 
diff --git a/src/common/micro/modd_param_ice.F90 b/src/common/micro/modd_param_ice.F90
index 948129a68..8f7ea8f52 100644
--- a/src/common/micro/modd_param_ice.F90
+++ b/src/common/micro/modd_param_ice.F90
@@ -81,6 +81,7 @@ REAL :: XSPLIT_MAXCFL ! Maximum CFL number allowed for SPLIT scheme
 LOGICAL :: LSNOW_T         ! Snow parameterization from Wurtz (2021)
 !
 LOGICAL :: LPACK_INTERP !To pack arrays before computing the different interpolations (kernels and other)
+LOGICAL :: LPACK_MICRO !To pack arrays before computing the process tendencies
 END TYPE PARAM_ICE_t
 !
 TYPE(PARAM_ICE_t), SAVE, TARGET :: PARAM_ICE
@@ -101,7 +102,8 @@ LOGICAL, POINTER :: LWARM => NULL(), &
                     LADJ_AFTER => NULL(), &
                     LSEDIM_AFTER => NULL(),&
                     LSNOW_T => NULL(),&
-                    LPACK_INTERP => NULL()
+                    LPACK_INTERP => NULL(),&
+                    LPACK_MICRO => NULL()
 
 REAL, POINTER :: XVDEPOSC => NULL(), &
                  XFRACM90 => NULL(), &
@@ -142,6 +144,7 @@ SUBROUTINE PARAM_ICE_ASSOCIATE()
   LSEDIM_AFTER => PARAM_ICE%LSEDIM_AFTER
   LSNOW_T => PARAM_ICE%LSNOW_T
   LPACK_INTERP => PARAM_ICE%LPACK_INTERP
+  LPACK_MICRO => PARAM_ICE%LPACK_MICRO
   !
   XVDEPOSC => PARAM_ICE%XVDEPOSC
   XFRACM90 => PARAM_ICE%XFRACM90
diff --git a/src/common/micro/mode_ice4_budgets.F90 b/src/common/micro/mode_ice4_budgets.F90
index c6b32dee9..99cf34f31 100644
--- a/src/common/micro/mode_ice4_budgets.F90
+++ b/src/common/micro/mode_ice4_budgets.F90
@@ -7,7 +7,7 @@
 MODULE MODE_ICE4_BUDGETS
 IMPLICIT NONE
 CONTAINS
-SUBROUTINE ICE4_BUDGETS(D, PARAMI, BUCONF, KSIZE, KPROMA, PTSTEP, KRR, K1, K2, &
+SUBROUTINE ICE4_BUDGETS(D, PARAMI, BUCONF, KSIZE, PTSTEP, KRR, K1, K2, &
                         PLVFACT, PLSFACT, PRHODJ, PEXNREF, &
                         PRVHENI, PBU_PACK, &
                         TBUDGETS, KBUDGETS)
@@ -38,11 +38,10 @@ TYPE(DIMPHYEX_t),                            INTENT(IN)    :: D
 TYPE(PARAM_ICE_t),                           INTENT(IN)    :: PARAMI
 TYPE(TBUDGETCONF_t),                         INTENT(IN)    :: BUCONF
 INTEGER,                                     INTENT(IN)    :: KSIZE
-INTEGER,                                     INTENT(IN)    :: KPROMA
 REAL,                                        INTENT(IN)    :: PTSTEP
 INTEGER,                                     INTENT(IN)    :: KRR
-INTEGER, DIMENSION(KPROMA),                  INTENT(IN)    :: K1
-INTEGER, DIMENSION(KPROMA),                  INTENT(IN)    :: K2
+INTEGER, DIMENSION(KSIZE),                   INTENT(IN)    :: K1
+INTEGER, DIMENSION(KSIZE),                   INTENT(IN)    :: K2
 REAL, DIMENSION(D%NIJT, D%NKT),              INTENT(IN)    :: PLVFACT
 REAL, DIMENSION(D%NIJT, D%NKT),              INTENT(IN)    :: PLSFACT
 REAL, DIMENSION(D%NIJT, D%NKT),              INTENT(IN)    :: PRHODJ
diff --git a/src/common/micro/mode_ice4_pack.F90 b/src/common/micro/mode_ice4_pack.F90
index 486cd66ce..e955a223d 100644
--- a/src/common/micro/mode_ice4_pack.F90
+++ b/src/common/micro/mode_ice4_pack.F90
@@ -7,19 +7,18 @@ MODULE MODE_ICE4_PACK
 IMPLICIT NONE
 CONTAINS
 SUBROUTINE ICE4_PACK(D, CST, PARAMI, ICEP, ICED, BUCONF,                   &
-                     KPROMA, KSIZE,                                        &
+                     KPROMA, KSIZE, KSIZE2,                                &
                      HSUBG_AUCV_RC, HSUBG_AUCV_RI,                         &
                      PTSTEP, KRR, ODMICRO, PEXN,                           &
                      PRHODJ, PRHODREF, PEXNREF, PPABST, PCIT, PCLDFR,      &
                      PHLC_HRC, PHLC_HCF, PHLI_HRI, PHLI_HCF,               &
-                     PTHT, PRVT, PRCT, PRRT, PRIT, PRST,                   &
-                     PRGT, PTHS, PRVS, PRCS, PRRS, PRIS, PRSS, PRGS,       &
+                     PTHS, PRVS, PRCS, PRRS, PRIS, PRSS, PRGS,             &
                      PEVAP3D,                                              &
                      PRAINFR, PSIGS,                                       &
                      PRVHENI, PLVFACT, PLSFACT,                            &
                      PWR,                                                  &
                      TBUDGETS, KBUDGETS,                                   &
-                     PRHT, PRHS                                            )
+                     PRHS                                                  )
 !  -----------------------------------------------------------------
 !
 !*       0.    DECLARATIONS
@@ -52,6 +51,23 @@ USE MODE_ICE4_STEPPING, ONLY: ICE4_STEPPING
 USE MODE_ICE4_BUDGETS, ONLY: ICE4_BUDGETS
 !
 IMPLICIT NONE
+
+!NOTES ON SIZES
+!If we pack:
+! - KSIZE is the number of relevant point (with mixing ratio different from 0)
+! - KPROMA is the size of bloc of points
+! - ZSIZE2 has the same value as KPROMA
+!If we do not pack:
+! - KSIZE is the total number of points
+! - KPROMA is null for memory saving
+! - KSIZE2 has the same value as KSIZE
+!
+!When we do not pack, we can transmit directly the 3D arrays to the ice4_stepping subroutine, we do not need
+!to copy the values. It is why KPROMA is null because we do not need these arrays.
+!But some arrays must me manipulated before being transmitted and we need temporary arrays for this.
+!KSIZE2 is used for those arrays that must be dimensioned KPROMA if we pack or with the total size if not.
+
+
 !
 !*       0.1   Declarations of dummy arguments :
 !
@@ -65,6 +81,7 @@ TYPE(RAIN_ICE_DESCR_t),   INTENT(IN)    :: ICED
 TYPE(TBUDGETCONF_t),      INTENT(IN)    :: BUCONF
 INTEGER,                  INTENT(IN)    :: KPROMA ! cache-blocking factor for microphysic loop
 INTEGER,                  INTENT(IN)    :: KSIZE
+INTEGER,                  INTENT(IN)    :: KSIZE2
 CHARACTER(LEN=4),         INTENT(IN)    :: HSUBG_AUCV_RC ! Kind of Subgrid autoconversion method
 CHARACTER(LEN=80),        INTENT(IN)    :: HSUBG_AUCV_RI ! Kind of Subgrid autoconversion method
 REAL,                     INTENT(IN)    :: PTSTEP  ! Double Time step (single if cold start)
@@ -79,17 +96,10 @@ REAL, DIMENSION(D%NIJT,D%NKT),   INTENT(IN)    :: PPABST  ! absolute pressure at
 !
 REAL, DIMENSION(D%NIJT,D%NKT),   INTENT(INOUT) :: PCIT    ! Pristine ice n.c. at t
 REAL, DIMENSION(D%NIJT,D%NKT),   INTENT(IN)    :: PCLDFR  ! Cloud fraction
-REAL, DIMENSION(D%NIJT,D%NKT),   INTENT(IN)    :: PHLC_HRC
-REAL, DIMENSION(D%NIJT,D%NKT),   INTENT(IN)    :: PHLC_HCF
-REAL, DIMENSION(D%NIJT,D%NKT),   INTENT(IN)    :: PHLI_HRI
-REAL, DIMENSION(D%NIJT,D%NKT),   INTENT(IN)    :: PHLI_HCF
-REAL, DIMENSION(D%NIJT,D%NKT),   INTENT(IN)    :: PTHT    ! Theta at time t
-REAL, DIMENSION(D%NIJT,D%NKT),   INTENT(IN)    :: PRVT    ! Water vapor m.r. at t
-REAL, DIMENSION(D%NIJT,D%NKT),   INTENT(IN)    :: PRCT    ! Cloud water m.r. at t
-REAL, DIMENSION(D%NIJT,D%NKT),   INTENT(IN)    :: PRRT    ! Rain water m.r. at t
-REAL, DIMENSION(D%NIJT,D%NKT),   INTENT(IN)    :: PRIT    ! Pristine ice m.r. at t
-REAL, DIMENSION(D%NIJT,D%NKT),   INTENT(IN)    :: PRST    ! Snow/aggregate m.r. at t
-REAL, DIMENSION(D%NIJT,D%NKT),   INTENT(IN)    :: PRGT    ! Graupel/hail m.r. at t
+REAL, DIMENSION(D%NIJT,D%NKT),   INTENT(INOUT) :: PHLC_HRC
+REAL, DIMENSION(D%NIJT,D%NKT),   INTENT(INOUT) :: PHLC_HCF
+REAL, DIMENSION(D%NIJT,D%NKT),   INTENT(INOUT) :: PHLI_HRI
+REAL, DIMENSION(D%NIJT,D%NKT),   INTENT(INOUT) :: PHLI_HCF
 !
 REAL, DIMENSION(D%NIJT,D%NKT),   INTENT(INOUT) :: PTHS    ! Theta source
 REAL, DIMENSION(D%NIJT,D%NKT),   INTENT(INOUT) :: PRVS    ! Water vapor m.r. source
@@ -108,7 +118,6 @@ REAL, DIMENSION(D%NIJT,D%NKT),   INTENT(IN)    :: PLSFACT
 REAL, DIMENSION(D%NIJT,D%NKT,0:7), INTENT(OUT) :: PWR
 TYPE(TBUDGETDATA), DIMENSION(KBUDGETS), INTENT(INOUT) :: TBUDGETS
 INTEGER, INTENT(IN) :: KBUDGETS
-REAL, DIMENSION(D%NIJT,D%NKT), OPTIONAL,  INTENT(IN)    :: PRHT    ! Hail m.r. at t
 REAL, DIMENSION(D%NIJT,D%NKT), OPTIONAL,  INTENT(INOUT) :: PRHS    ! Hail m.r. source
 !
 !
@@ -133,21 +142,21 @@ REAL, DIMENSION(KPROMA) :: &
                         & ZRHODREF, & ! RHO Dry REFerence
                         & ZPRES,    & ! Pressure
                         & ZEXN,     & ! EXNer Pressure
-                        & ZSIGMA_RC,& ! Standard deviation of rc at time t
                         & ZCF,      & ! Cloud fraction
                         & ZHLC_HCF, & ! HLCLOUDS : fraction of High Cloud Fraction in grid
                         & ZHLC_HRC, & ! HLCLOUDS : LWC that is High LWC in grid
                         & ZHLI_HCF, &
                         & ZHLI_HRI, &
                         & ZRREVAV
+REAL, DIMENSION(KSIZE2) :: ZSIGMA_RC ! Standard deviation of rc at time t
+LOGICAL, DIMENSION(KPROMA) :: LLMICRO
 !
 !Output packed tendencies (for budgets only)
 REAL, DIMENSION(KPROMA, IBUNUM-IBUNUM_EXTRA) :: ZBU_SUM
 !
 !For mixing-ratio-splitting
-REAL, DIMENSION(KPROMA,0:7) :: &
-                        & ZVART, & !Packed variables
-                        & ZEXTPK   !To take into acount external tendencies inside the splitting
+REAL, DIMENSION(KPROMA,0:7) :: ZVART !Packed variables
+REAL, DIMENSION(KSIZE2,0:7) :: ZEXTPK   !To take into acount external tendencies inside the splitting
 !
 INTEGER, DIMENSION(KPROMA) :: I1,I2 ! Used to replace the COUNT and PACK intrinsics on variables
 INTEGER, DIMENSION(KSIZE) :: I1TOT, I2TOT ! Used to replace the COUNT and PACK intrinsics
@@ -169,176 +178,226 @@ GEXT_TEND=.TRUE.
 LLSIGMA_RC=(HSUBG_AUCV_RC=='PDF ' .AND. PARAMI%CSUBG_PR_PDF=='SIGM')
 LL_AUCV_ADJU=(HSUBG_AUCV_RC=='ADJU' .OR. HSUBG_AUCV_RI=='ADJU')
 !
-IF(KPROMA /= KSIZE) THEN
-  CALL PRINT_MSG(NVERB_FATAL, 'GEN', 'RAIN_ICE', 'For now, KPROMA must be equal to KSIZE, see code for explanation')
-  ! Microphyscs was optimized by introducing chunks of KPROMA size
-  ! Thus, in ice4_tendencies, the 1D array represent only a fraction of the points where microphisical species are present
-  ! 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
-ENDIF
-!
-IF(BUCONF%LBU_ENABLE) THEN
-  DO JV=1, IBUNUM-IBUNUM_EXTRA
-    ZBU_PACK(:, JV)=0.
-  ENDDO
-ENDIF
-!
-!*       2.     POINT SELECTION
-!               ---------------
-!
-!  optimization by looking for locations where
-!  the microphysical fields are larger than a minimal value only !!!
-!
-IF (KSIZE /= COUNT(ODMICRO(IIJB:IIJE,IKTB:IKTE))) THEN
-    CALL PRINT_MSG(NVERB_FATAL, 'GEN', 'RAIN_ICE', 'RAIN_ICE : KSIZE /= COUNT(ODMICRO)')
-ENDIF
-
-IF (KSIZE > 0) THEN
+IF(PARAMI%LPACK_MICRO) THEN
+  IF(KPROMA /= KSIZE) THEN
+    CALL PRINT_MSG(NVERB_FATAL, 'GEN', 'RAIN_ICE', 'For now, KPROMA must be equal to KSIZE, see comments in code for explanation')
+    ! Microphyscs was optimized by introducing chunks of KPROMA size
+    ! Thus, in ice4_tendencies, the 1D array represent only a fraction of the points where microphisical species are present
+    ! 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
+  ENDIF
   !
-  !*       3.     CACHE-BLOCKING LOOP
-  !               -------------------
+  IF(BUCONF%LBU_ENABLE) THEN
+    DO JV=1, IBUNUM-IBUNUM_EXTRA
+      ZBU_PACK(:, JV)=0.
+    ENDDO
+  ENDIF
   !
-
-  ! starting indexes :
-  IC=0
-  ISTK=IKTB
-  ISTIJ=IIJB
-
-  DO JMICRO=1,KSIZE,KPROMA
-
-    IMICRO=MIN(KPROMA,KSIZE-JMICRO+1)
+  !*       2.     POINT SELECTION
+  !               ---------------
+  !
+  !  optimization by looking for locations where
+  !  the microphysical fields are larger than a minimal value only !!!
+  !
+  IF (KSIZE /= COUNT(ODMICRO(IIJB:IIJE,IKTB:IKTE))) THEN
+      CALL PRINT_MSG(NVERB_FATAL, 'GEN', 'ICE4_PACK', 'ICE4_PACK : KSIZE /= COUNT(ODMICRO)')
+  ENDIF
+  
+  IF (KSIZE > 0) THEN
     !
-    !*       4.     PACKING
-    !               -------
+    !*       3.     CACHE-BLOCKING LOOP
+    !               -------------------
     !
-
-    ! Setup packing parameters
-    OUTER_LOOP: DO JK = ISTK, IKTE
-      IF (ANY(ODMICRO(:,JK))) THEN
-        DO JIJ = ISTIJ, IIJE
-          IF (ODMICRO(JIJ,JK)) THEN
-            IC=IC+1
-            ! Initialization of variables in packed format :
-            ZVART(IC, ITH)=PTHT(JIJ, JK)
-            ZVART(IC, IRV)=PRVT(JIJ, JK)
-            ZVART(IC, IRC)=PRCT(JIJ, JK)
-            ZVART(IC, IRR)=PRRT(JIJ, JK)
-            ZVART(IC, IRI)=PRIT(JIJ, JK)
-            ZVART(IC, IRS)=PRST(JIJ, JK)
-            ZVART(IC, IRG)=PRGT(JIJ, JK)
-            IF (KRR==7) THEN
-              ZVART(IC, IRH)=PRHT(JIJ, 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(JIJ, JK)
-              ZEXTPK(IC, IRV)=PRVS(JIJ, JK)
-              ZEXTPK(IC, IRC)=PRCS(JIJ, JK)
-              ZEXTPK(IC, IRR)=PRRS(JIJ, JK)
-              ZEXTPK(IC, IRI)=PRIS(JIJ, JK)
-              ZEXTPK(IC, IRS)=PRSS(JIJ, JK)
-              ZEXTPK(IC, IRG)=PRGS(JIJ, JK)
+  
+    ! starting indexes :
+    IC=0
+    ISTK=IKTB
+    ISTIJ=IIJB
+  
+    DO JMICRO=1,KSIZE,KPROMA
+  
+      IMICRO=MIN(KPROMA,KSIZE-JMICRO+1)
+      !
+      !*       4.     PACKING
+      !               -------
+      !
+  
+      ! Setup packing parameters
+      OUTER_LOOP: DO JK = ISTK, IKTE
+        IF (ANY(ODMICRO(:,JK))) THEN
+          DO JIJ = ISTIJ, IIJE
+            IF (ODMICRO(JIJ,JK)) THEN
+              IC=IC+1
+              LLMICRO(IC)=.TRUE.
+              ! Initialization of variables in packed format :
+              ZVART(IC, ITH)=PWR(JIJ, JK, ITH)
+              ZVART(IC, IRV)=PWR(JIJ, JK, IRV)
+              ZVART(IC, IRC)=PWR(JIJ, JK, IRC)
+              ZVART(IC, IRR)=PWR(JIJ, JK, IRR)
+              ZVART(IC, IRI)=PWR(JIJ, JK, IRI)
+              ZVART(IC, IRS)=PWR(JIJ, JK, IRS)
+              ZVART(IC, IRG)=PWR(JIJ, JK, IRG)
               IF (KRR==7) THEN
-                ZEXTPK(IC, IRH)=PRHS(JIJ, JK)
+                ZVART(IC, IRH)=PWR(JIJ, JK, IRH)
               ENDIF
-            ENDIF
-            ZCIT       (IC)=PCIT    (JIJ, JK)
-            ZCF        (IC)=PCLDFR  (JIJ, JK)
-            ZRHODREF   (IC)=PRHODREF(JIJ, JK)
-            ZPRES      (IC)=PPABST  (JIJ, JK)
-            ZEXN       (IC)=PEXN    (JIJ, JK)
-            IF(LLSIGMA_RC) THEN
-              ZSIGMA_RC(IC)=PSIGS   (JIJ, JK)
-            ENDIF
-            IF (LL_AUCV_ADJU) THEN
-              ZHLC_HCF(IC) = PHLC_HCF(JIJ, JK)
-              ZHLC_HRC(IC) = PHLC_HRC(JIJ, JK)
-              ZHLI_HCF(IC) = PHLI_HCF(JIJ, JK)
-              ZHLI_HRI(IC) = PHLI_HRI(JIJ, JK)
-            ENDIF
-            ! Save indices for later usages:
-            I1(IC) = JIJ
-            I2(IC) = JK
-            I1TOT(JMICRO+IC-1)=JIJ
-            I2TOT(JMICRO+IC-1)=JK
-            IF (IC==IMICRO) THEN
-              ! the end of the chunk has been reached, then reset the starting index :
-              ISTIJ=JIJ+1
-              IF (ISTIJ <= IIJE) THEN
-                ISTK=JK
-              ELSE
-                ! end of line, restart from 1 and increment upper loop
-                ISTK=JK+1
-                IF (ISTK > IKTE) THEN
-                  ! end of line, restart from 1
-                  ISTK=IKTB
+              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(JIJ, JK)
+                ZEXTPK(IC, IRV)=PRVS(JIJ, JK)
+                ZEXTPK(IC, IRC)=PRCS(JIJ, JK)
+                ZEXTPK(IC, IRR)=PRRS(JIJ, JK)
+                ZEXTPK(IC, IRI)=PRIS(JIJ, JK)
+                ZEXTPK(IC, IRS)=PRSS(JIJ, JK)
+                ZEXTPK(IC, IRG)=PRGS(JIJ, JK)
+                IF (KRR==7) THEN
+                  ZEXTPK(IC, IRH)=PRHS(JIJ, JK)
                 ENDIF
               ENDIF
-              IC=0
-              EXIT OUTER_LOOP
+              ZCIT       (IC)=PCIT    (JIJ, JK)
+              ZCF        (IC)=PCLDFR  (JIJ, JK)
+              ZRHODREF   (IC)=PRHODREF(JIJ, JK)
+              ZPRES      (IC)=PPABST  (JIJ, JK)
+              ZEXN       (IC)=PEXN    (JIJ, JK)
+              IF(LLSIGMA_RC) THEN
+                ZSIGMA_RC(IC)=PSIGS   (JIJ, JK)
+              ENDIF
+              IF (LL_AUCV_ADJU) THEN
+                ZHLC_HCF(IC) = PHLC_HCF(JIJ, JK)
+                ZHLC_HRC(IC) = PHLC_HRC(JIJ, JK)
+                ZHLI_HCF(IC) = PHLI_HCF(JIJ, JK)
+                ZHLI_HRI(IC) = PHLI_HRI(JIJ, JK)
+              ENDIF
+              ! Save indices for later usages:
+              I1(IC) = JIJ
+              I2(IC) = JK
+              I1TOT(JMICRO+IC-1)=JIJ
+              I2TOT(JMICRO+IC-1)=JK
+              IF (IC==IMICRO) THEN
+                ! the end of the chunk has been reached, then reset the starting index :
+                ISTIJ=JIJ+1
+                IF (ISTIJ <= IIJE) THEN
+                  ISTK=JK
+                ELSE
+                  ! end of line, restart from 1 and increment upper loop
+                  ISTK=JK+1
+                  IF (ISTK > IKTE) THEN
+                    ! end of line, restart from 1
+                    ISTK=IKTB
+                  ENDIF
+                ENDIF
+                IC=0
+                EXIT OUTER_LOOP
+              ENDIF
             ENDIF
-          ENDIF
+          ENDDO
+        ENDIF
+        ! restart inner loop on JIJ :
+        ISTIJ=IIJB
+      ENDDO OUTER_LOOP
+  
+      !
+      !*       5.     TENDENCIES COMPUTATION
+      !               ----------------------
+      !
+      CALL ICE4_STEPPING(D, CST, PARAMI, ICEP, ICED, BUCONF, &
+                        &LLSIGMA_RC, LL_AUCV_ADJU, GEXT_TEND, &
+                        &KPROMA, IMICRO, LLMICRO, PTSTEP, &
+                        &KRR, &
+                        &HSUBG_AUCV_RC, HSUBG_AUCV_RI, &
+                        &ZEXN, ZRHODREF, I1, I2, &
+                        &ZPRES, ZCF, ZSIGMA_RC, &
+                        &ZCIT, &
+                        &ZVART, &
+                        &ZHLC_HCF, ZHLC_HRC, &
+                        &ZHLI_HCF, ZHLI_HRI, PRAINFR, &
+                        &ZEXTPK, ZBU_SUM, ZRREVAV)
+      !
+      !*       6.     UNPACKING
+      !               ---------
+      !
+      DO JL=1, IMICRO
+        PCIT  (I1(JL),I2(JL))=ZCIT   (JL)
+        IF(PARAMI%LWARM) THEN
+          PEVAP3D(I1(JL),I2(JL))=ZRREVAV(JL)
+        ENDIF
+        PWR(I1(JL),I2(JL),IRV)=ZVART(JL, IRV)
+        PWR(I1(JL),I2(JL),IRC)=ZVART(JL, IRC)
+        PWR(I1(JL),I2(JL),IRR)=ZVART(JL, IRR)
+        PWR(I1(JL),I2(JL),IRI)=ZVART(JL, IRI)
+        PWR(I1(JL),I2(JL),IRS)=ZVART(JL, IRS)
+        PWR(I1(JL),I2(JL),IRG)=ZVART(JL, IRG)
+        IF (KRR==7) THEN
+          PWR(I1(JL),I2(JL),IRH)=ZVART(JL, IRH)
+        ENDIF
+      ENDDO
+      IF(BUCONF%LBU_ENABLE) THEN
+        DO JV=1, IBUNUM-IBUNUM_EXTRA
+          DO JL=1, IMICRO
+            ZBU_PACK(JMICRO+JL-1, JV) = ZBU_SUM(JL, JV)
+          ENDDO
         ENDDO
       ENDIF
-      ! restart inner loop on JIJ :
-      ISTIJ=IIJB
-    ENDDO OUTER_LOOP
+  
+  
+    ENDDO ! JMICRO
+  ENDIF ! KSIZE > 0
 
-    !
-    !*       5.     TENDENCIES COMPUTATION
-    !               ----------------------
-    !
-    CALL ICE4_STEPPING(D, CST, PARAMI, ICEP, ICED, BUCONF, &
-                      &LLSIGMA_RC, LL_AUCV_ADJU, GEXT_TEND, &
-                      &KPROMA, IMICRO, PTSTEP, &
-                      &KRR, &
-                      &HSUBG_AUCV_RC, HSUBG_AUCV_RI, &
-                      &ZEXN, ZRHODREF, I1, I2, &
-                      &ZPRES, ZCF, ZSIGMA_RC, &
-                      &ZCIT, &
-                      &ZVART, &
-                      &ZHLC_HCF, ZHLC_HRC, &
-                      &ZHLI_HCF, ZHLI_HRI, PRAINFR, &
-                      &ZEXTPK, ZBU_SUM, ZRREVAV)
-    !
-    !*       6.     UNPACKING
-    !               ---------
-    !
-    DO JL=1, IMICRO
-      PCIT  (I1(JL),I2(JL))=ZCIT   (JL)
-      IF(PARAMI%LWARM) THEN
-        PEVAP3D(I1(JL),I2(JL))=ZRREVAV(JL)
-      ENDIF
-      PWR(I1(JL),I2(JL),IRV)=ZVART(JL, IRV)
-      PWR(I1(JL),I2(JL),IRC)=ZVART(JL, IRC)
-      PWR(I1(JL),I2(JL),IRR)=ZVART(JL, IRR)
-      PWR(I1(JL),I2(JL),IRI)=ZVART(JL, IRI)
-      PWR(I1(JL),I2(JL),IRS)=ZVART(JL, IRS)
-      PWR(I1(JL),I2(JL),IRG)=ZVART(JL, IRG)
-      IF (KRR==7) THEN
-        PWR(I1(JL),I2(JL),IRH)=ZVART(JL, IRH)
+ELSE ! PARAMI%LPACK_MICRO
+  IF (KSIZE /= D%NIJT*D%NKT) THEN
+      CALL PRINT_MSG(NVERB_FATAL, 'GEN', 'ICE4_PACK', 'ICE4_PACK : KSIZE /= NIJT*NKT')
+  ENDIF
+
+  IC=0
+  DO JK = IKTB, IKTE
+    DO JIJ = IIJB, IIJE
+      IC=IC+1
+      I1TOT(IC)=JIJ
+      I2TOT(IC)=JK
+      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(JIJ, JK)
+        ZEXTPK(IC, IRV)=PRVS(JIJ, JK)
+        ZEXTPK(IC, IRC)=PRCS(JIJ, JK)
+        ZEXTPK(IC, IRR)=PRRS(JIJ, JK)
+        ZEXTPK(IC, IRI)=PRIS(JIJ, JK)
+        ZEXTPK(IC, IRS)=PRSS(JIJ, JK)
+        ZEXTPK(IC, IRG)=PRGS(JIJ, JK)
+        IF (KRR==7) THEN
+          ZEXTPK(IC, IRH)=PRHS(JIJ, JK)
+        ENDIF
+        IF(LLSIGMA_RC) THEN
+          ZSIGMA_RC(IC)=PSIGS(JIJ, JK)
+        ENDIF
       ENDIF
     ENDDO
-    IF(BUCONF%LBU_ENABLE) THEN
-      DO JV=1, IBUNUM-IBUNUM_EXTRA
-        DO JL=1, IMICRO
-          ZBU_PACK(JMICRO+JL-1, JV) = ZBU_SUM(JL, JV)
-        ENDDO
-      ENDDO
-    ENDIF
-
+  ENDDO
+  !
+  !*       5bis.  TENDENCIES COMPUTATION
+  !               ----------------------
+  !
+  CALL ICE4_STEPPING(D, CST, PARAMI, ICEP, ICED, BUCONF, &
+                    &LLSIGMA_RC, LL_AUCV_ADJU, GEXT_TEND, &
+                    &KSIZE, KSIZE, ODMICRO, PTSTEP, &
+                    &KRR, &
+                    &HSUBG_AUCV_RC, HSUBG_AUCV_RI, &
+                    &PEXN, PRHODREF, I1TOT, I2TOT, &
+                    &PPABST, PCLDFR, ZSIGMA_RC, &
+                    &PCIT, &
+                    &PWR, &
+                    &PHLC_HCF, PHLC_HRC, &
+                    &PHLI_HCF, PHLI_HRI, PRAINFR, &
+                    &ZEXTPK, ZBU_PACK, PEVAP3D)
 
-  ENDDO ! JMICRO
-ENDIF ! KSIZE > 0
+ENDIF ! PARAMI%LPACK_MICRO
 !
 !*       7.     BUDGETS
 !               -------
 !
 IF(BUCONF%LBU_ENABLE) THEN
   !Budgets for the different processes
-  CALL ICE4_BUDGETS(D, PARAMI, BUCONF, KSIZE, KPROMA, PTSTEP, KRR, I1TOT, I2TOT, &
+  CALL ICE4_BUDGETS(D, PARAMI, BUCONF, KSIZE, PTSTEP, KRR, I1TOT, I2TOT, &
                     PLVFACT, PLSFACT, PRHODJ, PEXNREF, &
                     PRVHENI, ZBU_PACK, &
                     TBUDGETS, KBUDGETS)
diff --git a/src/common/micro/mode_ice4_stepping.F90 b/src/common/micro/mode_ice4_stepping.F90
index fdd598b18..8a438a799 100644
--- a/src/common/micro/mode_ice4_stepping.F90
+++ b/src/common/micro/mode_ice4_stepping.F90
@@ -8,7 +8,7 @@ IMPLICIT NONE
 CONTAINS
 SUBROUTINE ICE4_STEPPING(D, CST, PARAMI, ICEP, ICED, BUCONF, &
                         &LDSIGMA_RC, LDAUCV_ADJU, LDEXT_TEND, &
-                        &KPROMA, KMICRO, PTSTEP, &
+                        &KPROMA, KMICRO, LDMICRO, PTSTEP, &
                         &KRR, &
                         &HSUBG_AUCV_RC, HSUBG_AUCV_RI, &
                         &PEXN, PRHODREF, K1, K2, &
@@ -66,6 +66,7 @@ LOGICAL,                  INTENT(IN)    :: LDAUCV_ADJU
 LOGICAL,                  INTENT(IN)    :: LDEXT_TEND
 INTEGER,                  INTENT(IN)    :: KPROMA ! cache-blocking factor for microphysic loop
 INTEGER,                  INTENT(IN)    :: KMICRO ! Case r_x>0 locations
+LOGICAL, DIMENSION(KPROMA), INTENT(IN)  :: LDMICRO
 REAL,                     INTENT(IN)    :: PTSTEP  ! Double Time step (single if cold start)
 INTEGER,                  INTENT(IN)    :: KRR     ! Number of moist variable
 CHARACTER(LEN=4),         INTENT(IN)    :: HSUBG_AUCV_RC ! Kind of Subgrid autoconversion method
@@ -194,7 +195,13 @@ ENDIF
 !
 !
 IITER(1:KMICRO)=0
-ZTIME(1:KMICRO)=0. ! Current integration time (all points may have a different integration time)
+DO JL=1, KMICRO
+  IF(LDMICRO(JL)) THEN
+    ZTIME(JL)=0. ! Current integration time (all points may have a different integration time)
+  ELSE
+    ZTIME(JL)=PTSTEP ! Nothing to do on this point, it has already reached the end of the timestep
+  ENDIF
+ENDDO
 
 DO WHILE(ANY(ZTIME(1:KMICRO)<PTSTEP)) ! Loop to *really* compute tendencies
 
@@ -358,14 +365,16 @@ DO WHILE(ANY(ZTIME(1:KMICRO)<PTSTEP)) ! Loop to *really* compute tendencies
     !
     DO JV=0, KRR
       DO JL=1, KMICRO
-        PVART(JL, JV)=PVART(JL, JV)+ZA(JL, JV)*ZMAXTIME(JL)+ZB(JL, JV)
+        IF(LDMICRO(JL)) THEN
+          PVART(JL, JV)=PVART(JL, JV)+ZA(JL, JV)*ZMAXTIME(JL)+ZB(JL, JV)
+        ENDIF
       ENDDO
     ENDDO
     DO JL=1, KMICRO
 #ifdef REPRO55
       PCIT(JL)=PCIT(JL) * MAX(0., -SIGN(1., -PVART(JL,IRI)))
 #else
-      IF (PVART(JL,IRI)<=0.) PCIT(JL) = 0.
+      IF (PVART(JL,IRI)<=0. .AND. LDMICRO(JL)) PCIT(JL) = 0.
 #endif
       ZTIME(JL)=ZTIME(JL)+ZMAXTIME(JL)
     ENDDO
@@ -408,7 +417,9 @@ IF(LDEXT_TEND) THEN
   !Z..T variables contain the external tendency, we substract it
   DO JV=0, KRR
     DO JL=1, KMICRO
-      PVART(JL, JV) = PVART(JL, JV) - PEXTPK(JL, JV) * PTSTEP
+      IF(LDMICRO(JL)) THEN
+        PVART(JL, JV) = PVART(JL, JV) - PEXTPK(JL, JV) * PTSTEP
+      ENDIF
     ENDDO
   ENDDO
 ENDIF
diff --git a/src/common/micro/modi_rain_ice.F90 b/src/common/micro/modi_rain_ice.F90
index 349c22192..bf65a39d5 100644
--- a/src/common/micro/modi_rain_ice.F90
+++ b/src/common/micro/modi_rain_ice.F90
@@ -47,10 +47,10 @@ REAL, DIMENSION(D%NIJT,D%NKT),   INTENT(IN)    :: PPABST  ! absolute pressure at
 !
 REAL, DIMENSION(D%NIJT,D%NKT),   INTENT(INOUT) :: PCIT    ! Pristine ice n.c. at t
 REAL, DIMENSION(D%NIJT,D%NKT),   INTENT(IN)    :: PCLDFR  ! Cloud fraction
-REAL, DIMENSION(D%NIJT,D%NKT),   INTENT(IN)    :: PHLC_HRC
-REAL, DIMENSION(D%NIJT,D%NKT),   INTENT(IN)    :: PHLC_HCF
-REAL, DIMENSION(D%NIJT,D%NKT),   INTENT(IN)    :: PHLI_HRI
-REAL, DIMENSION(D%NIJT,D%NKT),   INTENT(IN)    :: PHLI_HCF
+REAL, DIMENSION(D%NIJT,D%NKT),   INTENT(INOUT) :: PHLC_HRC
+REAL, DIMENSION(D%NIJT,D%NKT),   INTENT(INOUT) :: PHLC_HCF
+REAL, DIMENSION(D%NIJT,D%NKT),   INTENT(INOUT) :: PHLI_HRI
+REAL, DIMENSION(D%NIJT,D%NKT),   INTENT(INOUT) :: PHLI_HCF
 !
 REAL, DIMENSION(D%NIJT,D%NKT),   INTENT(IN)    :: PTHT    ! Theta at time t
 REAL, DIMENSION(D%NIJT,D%NKT),   INTENT(IN)    :: PRVT    ! Water vapor m.r. at t
diff --git a/src/common/micro/rain_ice.F90 b/src/common/micro/rain_ice.F90
index 9d61ccb5b..2008e76f6 100644
--- a/src/common/micro/rain_ice.F90
+++ b/src/common/micro/rain_ice.F90
@@ -234,10 +234,10 @@ REAL, DIMENSION(D%NIJT,D%NKT),   INTENT(IN)    :: PPABST  ! absolute pressure at
 !
 REAL, DIMENSION(D%NIJT,D%NKT),   INTENT(INOUT) :: PCIT    ! Pristine ice n.c. at t
 REAL, DIMENSION(D%NIJT,D%NKT),   INTENT(IN)    :: PCLDFR  ! Cloud fraction
-REAL, DIMENSION(D%NIJT,D%NKT),   INTENT(IN)    :: PHLC_HRC
-REAL, DIMENSION(D%NIJT,D%NKT),   INTENT(IN)    :: PHLC_HCF
-REAL, DIMENSION(D%NIJT,D%NKT),   INTENT(IN)    :: PHLI_HRI
-REAL, DIMENSION(D%NIJT,D%NKT),   INTENT(IN)    :: PHLI_HCF
+REAL, DIMENSION(D%NIJT,D%NKT),   INTENT(INOUT) :: PHLC_HRC
+REAL, DIMENSION(D%NIJT,D%NKT),   INTENT(INOUT) :: PHLC_HCF
+REAL, DIMENSION(D%NIJT,D%NKT),   INTENT(INOUT) :: PHLI_HRI
+REAL, DIMENSION(D%NIJT,D%NKT),   INTENT(INOUT) :: PHLI_HCF
 !
 REAL, DIMENSION(D%NIJT,D%NKT),   INTENT(IN)    :: PTHT    ! Theta at time t
 REAL, DIMENSION(D%NIJT,D%NKT),   INTENT(IN)    :: PRVT    ! Water vapor m.r. at t
@@ -296,7 +296,7 @@ REAL :: ZDEVIDE, ZRICE
 REAL, DIMENSION(D%NIJT,D%NKT) :: ZW3D
 LOGICAL, DIMENSION(D%NIJT,D%NKT) :: LLW3D
 REAL, DIMENSION(KRR) :: ZRSMIN
-INTEGER :: ISIZE, IPROMA, IGPBLKS
+INTEGER :: ISIZE, IPROMA, IGPBLKS, ISIZE2
 !
 !-------------------------------------------------------------------------------
 IF (LHOOK) CALL DR_HOOK('RAIN_ICE', 0, ZHOOK_HANDLE)
@@ -367,7 +367,6 @@ DO JK = IKTB,IKTE
     ENDIF
   ENDDO
 ENDDO
-ISIZE=COUNT(LLMICRO) ! Number of points with active microphysics
 !
 !
 !-------------------------------------------------------------------------------
@@ -394,7 +393,8 @@ ENDIF
 !
 
 DO JK = IKTB,IKTE
-  !Backup of T variables
+  !Copy of T variables to keep untouched the prognostic variables
+  ZWR(:,JK,ITH)=PTHT(:,JK)
   ZWR(:,JK,IRV)=PRVT(:,JK)
   ZWR(:,JK,IRC)=PRCT(:,JK)
   ZWR(:,JK,IRR)=PRRT(:,JK)
@@ -451,33 +451,40 @@ ENDDO
 !*       5.     TENDENCIES COMPUTATION
 !               ----------------------
 !
-!KPROMA is the requested size for cache_blocking loop
-!IPROMA is the effective size
-!This parameter must be computed here because it is used for array dimensioning in ice4_pack
-IF (KPROMA > 0 .AND. ISIZE > 0) THEN
-  ! Cache-blocking is active
-  ! number of chunks :
-  IGPBLKS = (ISIZE-1)/MIN(KPROMA,ISIZE)+1
-  ! Adjust IPROMA to limit the number of small chunks
-  IPROMA=(ISIZE-1)/IGPBLKS+1
+IF(PARAMI%LPACK_MICRO) THEN
+  ISIZE=COUNT(LLMICRO) ! Number of points with active microphysics
+  !KPROMA is the requested size for cache_blocking loop
+  !IPROMA is the effective size
+  !This parameter must be computed here because it is used for array dimensioning in ice4_pack
+  IF (KPROMA > 0 .AND. ISIZE > 0) THEN
+    ! Cache-blocking is active
+    ! number of chunks :
+    IGPBLKS = (ISIZE-1)/MIN(KPROMA,ISIZE)+1
+    ! Adjust IPROMA to limit the number of small chunks
+    IPROMA=(ISIZE-1)/IGPBLKS+1
+  ELSE
+    IPROMA=ISIZE ! no cache-blocking
+  ENDIF
+  ISIZE2=IPROMA
 ELSE
-  IPROMA=ISIZE ! no cache-blocking
+  ISIZE=D%NIJT*D%NKT
+  IPROMA=0
+  ISIZE2=ISIZE
 ENDIF
 !This part is put in another routine to separate pack/unpack operations from computations
 CALL ICE4_PACK(D, CST, PARAMI, ICEP, ICED, BUCONF,                   &
-               IPROMA, ISIZE,                                        &
+               IPROMA, ISIZE, ISIZE2,                                &
                HSUBG_AUCV_RC, HSUBG_AUCV_RI,                         &
                PTSTEP, KRR, LLMICRO, PEXN,                           &
                PRHODJ, PRHODREF, PEXNREF, PPABST, PCIT, PCLDFR,      &
                PHLC_HRC, PHLC_HCF, PHLI_HRI, PHLI_HCF,               &
-               PTHT, PRVT, PRCT, PRRT, PRIT, PRST,                   &
-               PRGT, PTHS, PRVS, PRCS, PRRS, PRIS, PRSS, PRGS,       &
+               PTHS, PRVS, PRCS, PRRS, PRIS, PRSS, PRGS,             &
                PEVAP3D,                                              &
                PRAINFR, PSIGS,                                       &
                ZZ_RVHENI, ZZ_LVFACT, ZZ_LSFACT,                      &
                ZWR,                                                  &
                TBUDGETS, KBUDGETS,                                   &
-               PRHT, PRHS                                            )
+               PRHS                                                  )
 !
 !-------------------------------------------------------------------------------
 !
@@ -493,7 +500,7 @@ DO JK = IKTB, IKTE
     ZZ_LSFACT(JIJ,JK)=ZZ_LSFACT(JIJ,JK)/PEXNREF(JIJ,JK)
     ZZ_LVFACT(JIJ,JK)=ZZ_LVFACT(JIJ,JK)/PEXNREF(JIJ,JK)
 
-    !Hydrometeor tendencies is the difference between old state and new state (can be negative)
+    !Hydrometeor tendencies is the difference between new state and old state (can be negative)
     ZWR(JIJ,JK,IRV)=(ZWR(JIJ,JK,IRV)-PRVT(JIJ,JK))*ZINV_TSTEP
     ZWR(JIJ,JK,IRC)=(ZWR(JIJ,JK,IRC)-PRCT(JIJ,JK))*ZINV_TSTEP
     ZWR(JIJ,JK,IRR)=(ZWR(JIJ,JK,IRR)-PRRT(JIJ,JK))*ZINV_TSTEP
diff --git a/src/mesonh/ext/default_desfmn.f90 b/src/mesonh/ext/default_desfmn.f90
index 66209eaca..8e1727695 100644
--- a/src/mesonh/ext/default_desfmn.f90
+++ b/src/mesonh/ext/default_desfmn.f90
@@ -881,6 +881,7 @@ IF (KMI == 1) THEN
   XVDEPOSC= 0.02 ! 2 cm/s
   LSNOW_T=.FALSE.
   LPACK_INTERP=.TRUE.
+  LPACK_MICRO=.TRUE. ! Meso-NH does not work with LPACK_MICRO=.FALSE.
 END IF
 !
 !-------------------------------------------------------------------------------
diff --git a/src/testprogs/rain_ice/main_rain_ice.F90 b/src/testprogs/rain_ice/main_rain_ice.F90
index 12c5e951e..21e51992e 100644
--- a/src/testprogs/rain_ice/main_rain_ice.F90
+++ b/src/testprogs/rain_ice/main_rain_ice.F90
@@ -241,14 +241,13 @@ JBLK2 =      (NGPBLKS * (ITID+1)) / NTID
 #endif
 
 IPROMA=COUNT(LLMICRO(D%NIB:D%NIE,D%NJB:D%NJE,D%NKTB:D%NKTE,IBL))
-ISIZE=IPROMA
 CALL RAIN_ICE (D, CST, PARAM_ICE, RAIN_ICE_PARAM, &
              & RAIN_ICE_DESCR, TBUCONF, &
-             & IPROMA, ISIZE, &
+             & IPROMA, &
              & OCND2=OCND2, &
              & HSUBG_AUCV_RC=CSUBG_AUCV_RC, HSUBG_AUCV_RI=CSUBG_AUCV_RI,&
              & PTSTEP=2*PTSTEP, &
-             & KRR=KRR, ODMICRO=LLMICRO(:,:,:,IBL), PEXN=PEXNREF(:,:,:,IBL),            &
+             & KRR=KRR, PEXN=PEXNREF(:,:,:,IBL),            &
              & PDZZ=PDZZ(:,:,:,IBL), PRHODJ=PRHODJ(:,:,:,IBL), PRHODREF=PRHODREF(:,:,:,IBL),PEXNREF=PEXNREF2(:,:,:,IBL),&
              & PPABST=PPABSM(:,:,:,IBL), PCIT=PCIT(:,:,:,IBL), PCLDFR=PCLDFR(:,:,:,IBL),  &
              & PHLC_HRC=PHLC_HRC(:,:,:,IBL), PHLC_HCF=PHLC_HCF(:,:,:,IBL), &
@@ -408,6 +407,7 @@ XSPLIT_MAXCFL=0.8
 LDEPOSC=.FALSE.  ! water deposition on vegetation
 XVDEPOSC=0.02    ! deposition speed (2 cm.s-1)
 LPACK_INTERP=.TRUE.
+LPACK_MICRO=.TRUE.
 !
 !        2. Set implicit default values for MODD_RAIN_ICE_DESCR 
 !                     et MODD_RAIN_ICE_PARAM
-- 
GitLab