From f1a5efae286ed82328010bd1ab47952ba08c05e5 Mon Sep 17 00:00:00 2001
From: Gaelle DELAUTIER <gaelle.delautier@meteo.fr>
Date: Tue, 15 May 2018 14:26:52 +0200
Subject: [PATCH] S.Riette 15/5/2018 : Modified version ICE3/ICE4 under LRED=T

---
 src/MNH/resolved_cloud.f90 | 228 +++++++++++++++++++++++++++++--------
 1 file changed, 183 insertions(+), 45 deletions(-)

diff --git a/src/MNH/resolved_cloud.f90 b/src/MNH/resolved_cloud.f90
index 9cb969090..38e8b8c93 100644
--- a/src/MNH/resolved_cloud.f90
+++ b/src/MNH/resolved_cloud.f90
@@ -10,7 +10,7 @@
 INTERFACE
       SUBROUTINE RESOLVED_CLOUD ( HCLOUD, HACTCCN, HSCONV, HMF_CLOUD,                  &
                                   KRR, KSPLITR, KSPLITG, KMI, KTCOUNT,                 &
-                                  HLBCX, HLBCY, TPFILE, HRAD, HTURBDIM,       &
+                                  HLBCX, HLBCY, TPFILE, HRAD, HTURBDIM,                &
                                   OCLOSE_OUT, OSUBG_COND, OSIGMAS, HSUBG_AUCV,         &
                                   PTSTEP, PZZ, PRHODJ, PRHODREF, PEXNREF,              &
                                   PPABST, PTHT, PRT, PSIGS, PSIGQSAT, PMFCONV,         &
@@ -19,9 +19,10 @@ INTERFACE
                                   PCIT, OSEDIC, OACTIT, OSEDC, OSEDI,                  &
                                   ORAIN, OWARM, OHHONI, OCONVHG,                       &
                                   PCF_MF,PRC_MF, PRI_MF,                               &
-                                  PINPRC,PINPRR,PINPRR3D, PEVAP3D,            &
-                                  PINPRS,PINPRG,PINPRH,     &
+                                  PINPRC,PINPRC3D,PINPRR,PINPRR3D, PEVAP3D,            &
+                                  PINPRS,PINPRS3D,PINPRG,PINPRG3D,PINPRH,PINPRH3D,     &
                                   PSOLORG,PMI,                                         &
+                                  PSPEEDC, PSPEEDR, PSPEEDS, PSPEEDG, PSPEEDH,         &
                                   PINDEP, PSUPSAT,  PNACT, PNPRO,PSSPRO,               &
                                   PSEA,PTOWN          )   
 !
@@ -117,8 +118,17 @@ REAL, DIMENSION(:,:,:), INTENT(INOUT)   :: PEVAP3D  ! evap profile
 REAL, DIMENSION(:,:), INTENT(INOUT)     :: PINPRS! Snow instant precip
 REAL, DIMENSION(:,:), INTENT(INOUT)     :: PINPRG! Graupel instant precip
 REAL, DIMENSION(:,:), INTENT(INOUT)     :: PINPRH! Hail instant precip
+REAL, DIMENSION(:,:,:), INTENT(INOUT)   :: PINPRC3D ! sed flux of precip
+REAL, DIMENSION(:,:,:), INTENT(INOUT)   :: PINPRS3D ! sed flux of precip
+REAL, DIMENSION(:,:,:), INTENT(INOUT)   :: PINPRG3D ! sed flux of precip
+REAL, DIMENSION(:,:,:), INTENT(INOUT)   :: PINPRH3D ! sed flux of precip
 REAL, DIMENSION(:,:,:,:), INTENT(IN)    :: PSOLORG ![%] solubility fraction of soa
 REAL, DIMENSION(:,:,:,:), INTENT(IN)    :: PMI !
+REAL, DIMENSION(:,:,:),   INTENT(OUT)   :: PSPEEDC ! Cloud sedimentation speed
+REAL, DIMENSION(:,:,:),   INTENT(OUT)   :: PSPEEDR ! Rain sedimentation speed
+REAL, DIMENSION(:,:,:),   INTENT(OUT)   :: PSPEEDS ! Snow sedimentation speed
+REAL, DIMENSION(:,:,:),   INTENT(OUT)   :: PSPEEDG ! Graupel sedimentation speed
+REAL, DIMENSION(:,:,:),   INTENT(OUT)   :: PSPEEDH ! Hail sedimentation speed
 REAL, DIMENSION(:,:), INTENT(INOUT)     :: PINDEP! Cloud instant deposition
 REAL, DIMENSION(:,:,:),   INTENT(INOUT) :: PSUPSAT  !sursat
 REAL, DIMENSION(:,:,:),   INTENT(INOUT) :: PNACT  !concentrtaion d'aérosols activés au temps t
@@ -134,7 +144,7 @@ END MODULE MODI_RESOLVED_CLOUD
 !     ##########################################################################
       SUBROUTINE RESOLVED_CLOUD ( HCLOUD, HACTCCN, HSCONV, HMF_CLOUD,                  &
                                   KRR, KSPLITR, KSPLITG, KMI, KTCOUNT,                 &
-                                  HLBCX, HLBCY,TPFILE, HRAD, HTURBDIM,       &
+                                  HLBCX, HLBCY, TPFILE, HRAD, HTURBDIM,                &
                                   OCLOSE_OUT, OSUBG_COND, OSIGMAS, HSUBG_AUCV,         &
                                   PTSTEP, PZZ, PRHODJ, PRHODREF, PEXNREF,              &
                                   PPABST, PTHT, PRT, PSIGS, PSIGQSAT, PMFCONV,         &
@@ -143,9 +153,10 @@ END MODULE MODI_RESOLVED_CLOUD
                                   PCIT, OSEDIC, OACTIT, OSEDC, OSEDI,                  &
                                   ORAIN, OWARM, OHHONI, OCONVHG,                       &
                                   PCF_MF,PRC_MF, PRI_MF,                               &
-                                  PINPRC,PINPRR,PINPRR3D, PEVAP3D,            &
-                                  PINPRS,PINPRG,PINPRH,     &
+                                  PINPRC,PINPRC3D,PINPRR,PINPRR3D, PEVAP3D,            &
+                                  PINPRS,PINPRS3D,PINPRG,PINPRG3D,PINPRH,PINPRH3D,     &
                                   PSOLORG,PMI,                                         &
+                                  PSPEEDC, PSPEEDR, PSPEEDS, PSPEEDG, PSPEEDH,         &
                                   PINDEP, PSUPSAT,  PNACT, PNPRO,PSSPRO,               &
                                   PSEA,PTOWN          )   
 !     ##########################################################################
@@ -251,8 +262,9 @@ END MODULE MODI_RESOLVED_CLOUD
 !!      Modification    01/2016  (JP Pinty) Add LIMA
 !!                     10/2016 M.Mazoyer New KHKO output fields
 !!                    10/2016 (C.Lac) Add droplet deposition
+!!      S.Riette  : 11/2016 : ice_adjust before and after rain_ice
+!!                            ICE3/ICE4 modified, old version under LRED=F   
 !!  Philippe Wautelet: 05/2016-04/2018: new data structures and calls for I/O
-
 !-------------------------------------------------------------------------------
 !
 !*       0.    DECLARATIONS
@@ -264,7 +276,7 @@ USE MODD_CONF
 USE MODD_CST
 USE MODD_IO_ll, ONLY: TFILEDATA
 USE MODD_PARAMETERS
-USE MODD_PARAM_ICE,  ONLY : CSEDIM
+USE MODD_PARAM_ICE,  ONLY : CSEDIM, LADJ_BEFORE, LADJ_AFTER, CFRAC_ICE_ADJUST, LRED
 USE MODD_RAIN_ICE_DESCR
 USE MODD_PARAM_C2R2
 USE MODD_BUDGET
@@ -275,11 +287,13 @@ USE MODD_SALT , ONLY : LSALT
 !
 USE MODD_PARAM_LIMA, ONLY : LCOLD, XCONC_CCN_TOT, NMOD_CCN, NMOD_IFN, NMOD_IMM, LPTSPLIT, &
                             YRTMIN=>XRTMIN, YCTMIN=>XCTMIN
+
 !
 USE MODI_SLOW_TERMS
 USE MODI_FAST_TERMS
 USE MODI_ICE_ADJUST
 USE MODI_RAIN_ICE
+USE MODI_RAIN_ICE_RED
 USE MODI_RAIN_C2R2_KHKO
 USE MODI_ICE_C1R3
 USE MODI_C2R2_ADJUST
@@ -390,8 +404,17 @@ REAL, DIMENSION(:,:,:), INTENT(INOUT)   :: PEVAP3D  ! evap profile
 REAL, DIMENSION(:,:), INTENT(INOUT)     :: PINPRS! Snow instant precip
 REAL, DIMENSION(:,:), INTENT(INOUT)     :: PINPRG! Graupel instant precip
 REAL, DIMENSION(:,:), INTENT(INOUT)     :: PINPRH! Hail instant precip
+REAL, DIMENSION(:,:,:), INTENT(INOUT)   :: PINPRC3D ! sed flux of precip
+REAL, DIMENSION(:,:,:), INTENT(INOUT)   :: PINPRS3D ! sed flux of precip
+REAL, DIMENSION(:,:,:), INTENT(INOUT)   :: PINPRG3D ! sed flux of precip
+REAL, DIMENSION(:,:,:), INTENT(INOUT)   :: PINPRH3D ! sed flux of precip
 REAL, DIMENSION(:,:,:,:), INTENT(IN)    :: PSOLORG ![%] solubility fraction of soa
 REAL, DIMENSION(:,:,:,:), INTENT(IN)    :: PMI !
+REAL, DIMENSION(:,:,:),   INTENT(OUT)   :: PSPEEDC ! Cloud sedimentation speed
+REAL, DIMENSION(:,:,:),   INTENT(OUT)   :: PSPEEDR ! Rain sedimentation speed
+REAL, DIMENSION(:,:,:),   INTENT(OUT)   :: PSPEEDS ! Snow sedimentation speed
+REAL, DIMENSION(:,:,:),   INTENT(OUT)   :: PSPEEDG ! Graupel sedimentation speed
+REAL, DIMENSION(:,:,:),   INTENT(OUT)   :: PSPEEDH ! Hail sedimentation speed
 REAL, DIMENSION(:,:),     INTENT(INOUT) :: PINDEP! Cloud instant deposition
 REAL, DIMENSION(:,:,:),   INTENT(INOUT) :: PSUPSAT  !sursat
 REAL, DIMENSION(:,:,:),   INTENT(INOUT) :: PNACT  !concentrtaion d'aérosols activés au temps t
@@ -433,11 +456,14 @@ INTEGER                               :: ISVBEG ! first scalar index for microph
 INTEGER                               :: ISVEND ! last  scalar index for microphysics
 REAL, DIMENSION(:,:,:,:), ALLOCATABLE :: ZSVT   ! scalar variable for microphysics only
 REAL, DIMENSION(:,:,:,:), ALLOCATABLE :: ZSVS   ! scalar tendency for microphysics only
+LOGICAL, DIMENSION(SIZE(PZZ,1),SIZE(PZZ,2),SIZE(PZZ,3)):: LLMICRO ! mask to limit computation
+REAL, DIMENSION(SIZE(XRTMIN)) :: ZRSMIN ! Minimum value for tendencies
+REAL, DIMENSION(SIZE(PZZ,1),SIZE(PZZ,2),SIZE(PZZ,3), KRR) :: ZFPR
 !
 INTEGER                               :: JMOD, JMOD_IFN
-!
 ! BVIE work array waiting for PINPRI
 REAL, DIMENSION(SIZE(PZZ,1),SIZE(PZZ,2)):: ZINPRI
+!
 !------------------------------------------------------------------------------
 !
 !*       1.     PRELIMINARY COMPUTATIONS
@@ -468,6 +494,7 @@ IF (HCLOUD=='C2R2' .OR. HCLOUD=='C3R5' .OR. HCLOUD=='KHKO' .OR. HCLOUD=='LIMA')
   ZSVT(:,:,:,:) = PSVT(:,:,:,ISVBEG:ISVEND)
   ZSVS(:,:,:,:) = PSVS(:,:,:,ISVBEG:ISVEND)
 END IF
+IF (HCLOUD(1:3)=='ICE') ZRSMIN(:) = XRTMIN(:) / PTSTEP
 !
 !*       2.     TRANSFORMATION INTO PHYSICAL TENDENCIES
 !               ---------------------------------------
@@ -555,7 +582,8 @@ ZCPH(:,:,:)=XCPD +XCPV*PRT(:,:,:,1)
 !
 !*       3.1    Non local correction for precipitating species (Rood 87)
 !
-IF (HCLOUD == 'KESS' .OR. HCLOUD == 'ICE3' .OR. HCLOUD == 'C2R2' .OR. &
+IF (HCLOUD == 'KESS' .OR. HCLOUD == 'ICE3'                                &
+    .OR. HCLOUD == 'C2R2' .OR. &
     HCLOUD == 'C3R5' .OR. HCLOUD == 'KHKO' .OR. HCLOUD=='LIMA' ) THEN
 !
   DO JRR = 3,KRR
@@ -593,7 +621,7 @@ SELECT CASE ( HCLOUD )
     WHERE (PRS(:,:,:,2) < 0.)
       PRS(:,:,:,1) = PRS(:,:,:,1) + PRS(:,:,:,2)
       PTHS(:,:,:) = PTHS(:,:,:) - PRS(:,:,:,2) * ZLV(:,:,:) /  &
-           ZCPH(:,:,:) / ZEXN(:,:,:)
+           ZCPH(:,:,:) / PEXNREF(:,:,:)
       PRS(:,:,:,2) = 0.0
     END WHERE
 !
@@ -622,7 +650,7 @@ SELECT CASE ( HCLOUD )
     WHERE (PRS(:,:,:,4) < 0.)
       PRS(:,:,:,1) = PRS(:,:,:,1) + PRS(:,:,:,4)
       PTHS(:,:,:) = PTHS(:,:,:) - PRS(:,:,:,4) * ZLS(:,:,:) /  &
-           ZCPH(:,:,:) / ZEXN(:,:,:)
+           ZCPH(:,:,:) / PEXNREF(:,:,:)
       PRS(:,:,:,4) = 0.
     END WHERE
 !
@@ -630,7 +658,7 @@ SELECT CASE ( HCLOUD )
     WHERE (PRS(:,:,:,2) < 0.)
       PRS(:,:,:,1) = PRS(:,:,:,1) + PRS(:,:,:,2)
       PTHS(:,:,:) = PTHS(:,:,:) - PRS(:,:,:,2) * ZLV(:,:,:) /  &
-           ZCPH(:,:,:) / ZEXN(:,:,:)
+           ZCPH(:,:,:) / PEXNREF(:,:,:)
       PRS(:,:,:,2) = 0.
     END WHERE
 !
@@ -639,7 +667,7 @@ SELECT CASE ( HCLOUD )
     WHERE ((PRS(:,:,:,1) <0.) .AND. (PRS(:,:,:,2)> 0.) )
       PRS(:,:,:,1) = PRS(:,:,:,1) + PRS(:,:,:,2)
       PTHS(:,:,:) = PTHS(:,:,:) - PRS(:,:,:,2) * ZLV(:,:,:) /  &
-           ZCPH(:,:,:) / ZEXN(:,:,:)
+           ZCPH(:,:,:) / PEXNREF(:,:,:)
       PRS(:,:,:,2) = 0.
     END WHERE
 !   ice
@@ -648,7 +676,7 @@ SELECT CASE ( HCLOUD )
         ZCOR(:,:,:)=MIN(-PRS(:,:,:,1),PRS(:,:,:,4))
         PRS(:,:,:,1) = PRS(:,:,:,1) + ZCOR(:,:,:)
         PTHS(:,:,:) = PTHS(:,:,:) - ZCOR(:,:,:) * ZLS(:,:,:) /  &
-             ZCPH(:,:,:) / ZEXN(:,:,:)
+             ZCPH(:,:,:) / PEXNREF(:,:,:)
         PRS(:,:,:,4) = PRS(:,:,:,4) -ZCOR(:,:,:)
       END WHERE
     END IF
@@ -661,7 +689,7 @@ SELECT CASE ( HCLOUD )
       WHERE (PRS(:,:,:,JSV) < 0. .OR. ZSVS(:,:,:,JSV) < 0.)
         PRS(:,:,:,1) = PRS(:,:,:,1) + PRS(:,:,:,JSV)
         PTHS(:,:,:) = PTHS(:,:,:) - PRS(:,:,:,JSV) * ZLV(:,:,:) /  &
-             ZCPH(:,:,:) / ZEXN(:,:,:)
+             ZCPH(:,:,:) / PEXNREF(:,:,:)
         PRS(:,:,:,JSV)  = 0.0
         ZSVS(:,:,:,JSV) = 0.0
       END WHERE
@@ -671,7 +699,7 @@ SELECT CASE ( HCLOUD )
     WHERE (PRS(:,:,:,4) < 0.)
       PRS(:,:,:,1) = PRS(:,:,:,1) + PRS(:,:,:,4)
       PTHS(:,:,:) = PTHS(:,:,:) - PRS(:,:,:,4) * ZLV(:,:,:) /  &
-           ZCPH(:,:,:) / ZEXN(:,:,:)
+           ZCPH(:,:,:) / PEXNREF(:,:,:)
       PRS(:,:,:,4)  = 0.0
       PSVS(:,:,:,4) = 0.0
     END WHERE
@@ -679,7 +707,7 @@ SELECT CASE ( HCLOUD )
     WHERE (PRS(:,:,:,2) < 0.)
       PRS(:,:,:,1) = PRS(:,:,:,1) + PRS(:,:,:,2)
       PTHS(:,:,:) = PTHS(:,:,:) - PRS(:,:,:,2) * ZLV(:,:,:) /  &
-           ZCPH(:,:,:) / ZEXN(:,:,:)
+           ZCPH(:,:,:) / PEXNREF(:,:,:)
       PRS(:,:,:,2)  = 0.0
       PSVS(:,:,:,2) = 0.0
     END WHERE
@@ -842,7 +870,7 @@ SELECT CASE ( HCLOUD )
                          ZSVS(:,:,:,4), PCLDFR, PSRCS , PNPRO,PSSPRO             )
 !
    ELSE
-    CALL C2R2_ADJUST ( KRR,TPFILE, HRAD,                                       &
+    CALL C2R2_ADJUST ( KRR,TPFILE, HRAD,                              &
                        HTURBDIM, OCLOSE_OUT, OSUBG_COND, PTSTEP,               &
                        PRHODJ, PSIGS, PPABST,                                  &
                        PTHS=PTHS, PRVS=PRS(:,:,:,1), PRCS=PRS(:,:,:,2),        &
@@ -863,8 +891,45 @@ SELECT CASE ( HCLOUD )
     DO JK=IKB,IKE
       ZDZZ(:,:,JK)=PZZ(:,:,JK+1)-PZZ(:,:,JK)    
     ENDDO
-    CALL RAIN_ICE ( OSEDIC,CSEDIM, HSUBG_AUCV, OWARM,1,IKU,1,            &
-                    KSPLITR, PTSTEP, KMI, KRR,                           &
+    ZZZ = MZF(1,IKU,1, PZZ )
+    IF(LRED .AND. LADJ_BEFORE) THEN
+      CALL ICE_ADJUST (1,IKU,1, KRR, CFRAC_ICE_ADJUST, 'ADJU',                 &
+                      OSUBG_COND, OSIGMAS, PTSTEP,PSIGQSAT,                    &
+                      PRHODJ, PEXNREF,  PSIGS, PMFCONV, PPABST, ZZZ,           &
+                      ZEXN, PCF_MF,PRC_MF,PRI_MF,                              &   
+                      PRV=PRS(:,:,:,1)*PTSTEP, PRC=PRS(:,:,:,2)*PTSTEP,        &
+                      PRVS=PRS(:,:,:,1), PRCS=PRS(:,:,:,2),                    &
+                      PTH=PTHS*PTSTEP, PTHS=PTHS, PSRCS=PSRCS, PCLDFR=PCLDFR,  &
+                      PRR=PRS(:,:,:,3)*PTSTEP,                                 &
+                      PRI=PRS(:,:,:,4)*PTSTEP, PRIS=PRS(:,:,:,4),              &
+                      PRS=PRS(:,:,:,5)*PTSTEP,                                 &
+                      PRG=PRS(:,:,:,6)*PTSTEP                                  )
+    ENDIF
+    IF (LRED) THEN
+      LLMICRO(:,:,:)=PRT(:,:,:,2)>XRTMIN(2) .OR. &
+                   PRT(:,:,:,3)>XRTMIN(3) .OR. &
+                   PRT(:,:,:,4)>XRTMIN(4) .OR. &
+                   PRT(:,:,:,5)>XRTMIN(5) .OR. &
+                   PRT(:,:,:,6)>XRTMIN(6)
+      LLMICRO(:,:,:)=LLMICRO(:,:,:) .OR. &
+                   PRS(:,:,:,2)>ZRSMIN(2) .OR. &
+                   PRS(:,:,:,3)>ZRSMIN(3) .OR. &
+                   PRS(:,:,:,4)>ZRSMIN(4) .OR. &
+                   PRS(:,:,:,5)>ZRSMIN(5) .OR. &
+                   PRS(:,:,:,6)>ZRSMIN(6)
+      CALL RAIN_ICE_RED ( OSEDIC,CSEDIM, HSUBG_AUCV, OWARM,1,IKU,1,            &
+                    PTSTEP, KRR, LLMICRO, ZEXN,            &
+                    ZDZZ, PRHODJ, PRHODREF, PEXNREF, PPABST, PCIT,PCLDFR,&
+                    PTHT, PRT(:,:,:,1), PRT(:,:,:,2),                    &
+                    PRT(:,:,:,3), PRT(:,:,:,4),                          &
+                    PRT(:,:,:,5), PRT(:,:,:,6),                          &
+                    PTHS, PRS(:,:,:,1), PRS(:,:,:,2), PRS(:,:,:,3),      &
+                    PRS(:,:,:,4), PRS(:,:,:,5), PRS(:,:,:,6),            &
+                    PINPRC,PINPRR, PINPRR3D, PEVAP3D,                    &
+                    PINPRS, PINPRG, PSIGS, PINDEP, PSEA,PTOWN, PFPR=ZFPR)
+    ELSE 
+      CALL RAIN_ICE ( OSEDIC,CSEDIM, HSUBG_AUCV, OWARM,1,IKU,1,            &
+                    KSPLITR, PTSTEP, KRR,                           &
                     ZDZZ, PRHODJ, PRHODREF, PEXNREF, PPABST, PCIT,PCLDFR,&
                     PTHT, PRT(:,:,:,1), PRT(:,:,:,2),                    &
                     PRT(:,:,:,3), PRT(:,:,:,4),                          &
@@ -873,22 +938,25 @@ SELECT CASE ( HCLOUD )
                     PRS(:,:,:,4), PRS(:,:,:,5), PRS(:,:,:,6),            &
                     PINPRC,PINPRR, PINPRR3D, PEVAP3D,           &
                     PINPRS, PINPRG, PSIGS,PINDEP,             &
-                    PSEA,PTOWN)
+                    PSEA,PTOWN, PFPR=ZFPR)
+    END IF
 !
 !*       9.2    Perform the saturation adjustment over cloud ice and cloud water
 !
-    ZZZ = MZF(1,IKU,1, PZZ )
-    CALL ICE_ADJUST (1,IKU,1, KRR, KMI, HRAD, HTURBDIM,                      &
+!
+    IF (.NOT. LRED .OR. (LRED .AND. LADJ_AFTER) ) THEN
+      CALL ICE_ADJUST (1,IKU,1, KRR, CFRAC_ICE_ADJUST, 'DEPI',    &
                     OSUBG_COND, OSIGMAS, PTSTEP,PSIGQSAT,                    &
                     PRHODJ, PEXNREF,  PSIGS, PMFCONV, PPABST, ZZZ,           &
-                    PCF_MF,PRC_MF,PRI_MF,                                    &   
-                    PRVT=PRT(:,:,:,1), PRCT=PRT(:,:,:,2),                    &
+                    ZEXN, PCF_MF,PRC_MF,PRI_MF,                                    &   
+                    PRV=PRS(:,:,:,1)*PTSTEP, PRC=PRS(:,:,:,2)*PTSTEP,                    &
                     PRVS=PRS(:,:,:,1), PRCS=PRS(:,:,:,2),                    &
-                    PTHS=PTHS, PSRCS=PSRCS, PCLDFR=PCLDFR,                   &
-                    PRRT=PRT(:,:,:,3), PRRS=PRS(:,:,:,3),                    &
-                    PRIT=PRT(:,:,:,4), PRIS=PRS(:,:,:,4),                    &
-                    PRST=PRT(:,:,:,5), PRSS=PRS(:,:,:,5),                    &
-                    PRGT=PRT(:,:,:,6), PRGS=PRS(:,:,:,6)                     )
+                    PTH=PTHS*PTSTEP, PTHS=PTHS, PSRCS=PSRCS, PCLDFR=PCLDFR,                   &
+                    PRR=PRS(:,:,:,3)*PTSTEP,                                 &
+                    PRI=PRS(:,:,:,4)*PTSTEP, PRIS=PRS(:,:,:,4),              &
+                    PRS=PRS(:,:,:,5)*PTSTEP,                                 &
+                    PRG=PRS(:,:,:,6)*PTSTEP                                  )
+    END IF
 !
   CASE ('ICE4')
 !
@@ -902,8 +970,49 @@ SELECT CASE ( HCLOUD )
     DO JK=IKB,IKE
       ZDZZ(:,:,JK)=PZZ(:,:,JK+1)-PZZ(:,:,JK)    
     ENDDO
-    CALL RAIN_ICE ( OSEDIC,CSEDIM, HSUBG_AUCV, OWARM,1,IKU,1,             &
-                    KSPLITR, PTSTEP, KMI, KRR,                            &
+    ZZZ = MZF(1,IKU,1, PZZ )
+    IF(LRED .AND. LADJ_BEFORE) THEN
+            CALL ICE_ADJUST (1,IKU,1, KRR, CFRAC_ICE_ADJUST, 'ADJU',                 &
+                      OSUBG_COND, OSIGMAS, PTSTEP,PSIGQSAT,                    &
+                      PRHODJ, PEXNREF, PSIGS, PMFCONV, PPABST, ZZZ,            &
+                      ZEXN, PCF_MF,PRC_MF,PRI_MF,                              & 
+                      PRV=PRS(:,:,:,1)*PTSTEP, PRC=PRS(:,:,:,2)*PTSTEP,        &
+                      PRVS=PRS(:,:,:,1), PRCS=PRS(:,:,:,2),                    &
+                      PTH=PTHS*PTSTEP, PTHS=PTHS, PSRCS=PSRCS, PCLDFR=PCLDFR,  &
+                      PRR=PRS(:,:,:,3)*PTSTEP,                                 &
+                      PRI=PRS(:,:,:,4)*PTSTEP, PRIS=PRS(:,:,:,4),              &
+                      PRS=PRS(:,:,:,5)*PTSTEP,                                 &
+                      PRG=PRS(:,:,:,6)*PTSTEP,                                 &
+                      PRH=PRS(:,:,:,7)*PTSTEP                                  )
+    ENDIF
+    IF  (LRED) THEN
+      LLMICRO(:,:,:)=PRT(:,:,:,2)>XRTMIN(2) .OR. &
+                   PRT(:,:,:,3)>XRTMIN(3) .OR. &
+                   PRT(:,:,:,4)>XRTMIN(4) .OR. &
+                   PRT(:,:,:,5)>XRTMIN(5) .OR. &
+                   PRT(:,:,:,6)>XRTMIN(6) .OR. &
+                   PRT(:,:,:,7)>XRTMIN(7)
+      LLMICRO(:,:,:)=LLMICRO(:,:,:) .OR. &
+                   PRS(:,:,:,2)>ZRSMIN(2) .OR. &
+                   PRS(:,:,:,3)>ZRSMIN(3) .OR. &
+                   PRS(:,:,:,4)>ZRSMIN(4) .OR. &
+                   PRS(:,:,:,5)>ZRSMIN(5) .OR. &
+                   PRS(:,:,:,6)>ZRSMIN(6) .OR. &
+                   PRS(:,:,:,7)>ZRSMIN(7)
+      CALL RAIN_ICE_RED ( OSEDIC,CSEDIM, HSUBG_AUCV, OWARM,1,IKU,1,             &
+                    PTSTEP, KRR, LLMICRO, ZEXN,             &
+                    ZDZZ, PRHODJ, PRHODREF, PEXNREF, PPABST, PCIT, PCLDFR,&
+                    PTHT, PRT(:,:,:,1), PRT(:,:,:,2),                     &
+                    PRT(:,:,:,3), PRT(:,:,:,4),                           &
+                    PRT(:,:,:,5), PRT(:,:,:,6),                           &
+                    PTHS, PRS(:,:,:,1), PRS(:,:,:,2), PRS(:,:,:,3),       &
+                    PRS(:,:,:,4), PRS(:,:,:,5), PRS(:,:,:,6),             &
+                    PINPRC, PINPRR, PINPRR3D, PEVAP3D,                    &
+                    PINPRS, PINPRG, PSIGS, PINDEP, PSEA, PTOWN,           &
+                    PRT(:,:,:,7), PRS(:,:,:,7), PINPRH, PFPR=ZFPR         )
+    ELSE
+      CALL RAIN_ICE ( OSEDIC,CSEDIM, HSUBG_AUCV, OWARM,1,IKU,1,         &
+                    KSPLITR, PTSTEP, KRR,                                 &
                     ZDZZ, PRHODJ, PRHODREF, PEXNREF, PPABST, PCIT, PCLDFR,&
                     PTHT, PRT(:,:,:,1), PRT(:,:,:,2),                     &
                     PRT(:,:,:,3), PRT(:,:,:,4),                           &
@@ -913,24 +1022,28 @@ SELECT CASE ( HCLOUD )
                     PINPRC, PINPRR, PINPRR3D, PEVAP3D,           &
                     PINPRS, PINPRG, PSIGS,PINDEP,              &
                     PSEA, PTOWN,                                          &
-                    PRT(:,:,:,7),  PRS(:,:,:,7), PINPRH,OCONVHG  )
+                    PRT(:,:,:,7),  PRS(:,:,:,7), PINPRH,PFPR=ZFPR )
+     END IF
+
 
 !
 !*       10.2   Perform the saturation adjustment over cloud ice and cloud water
 !
-    ZZZ = MZF(1,IKU,1, PZZ )
-    CALL ICE_ADJUST (1,IKU,1, KRR, KMI, HRAD, HTURBDIM,                      &
+    IF (.NOT. LRED .OR. (LRED .AND. LADJ_AFTER) ) THEN
+     CALL ICE_ADJUST (1,IKU,1, KRR, CFRAC_ICE_ADJUST, 'DEPI',                 &
                     OSUBG_COND, OSIGMAS, PTSTEP,PSIGQSAT,                    &
                     PRHODJ, PEXNREF, PSIGS, PMFCONV, PPABST, ZZZ,            &
-                    PCF_MF,PRC_MF,PRI_MF,                                    &                     
-                    PRVT=PRT(:,:,:,1), PRCT=PRT(:,:,:,2),                    &
+                    ZEXN, PCF_MF,PRC_MF,PRI_MF,                              &                     
+                    PRV=PRS(:,:,:,1)*PTSTEP, PRC=PRS(:,:,:,2)*PTSTEP,        &
                     PRVS=PRS(:,:,:,1), PRCS=PRS(:,:,:,2),                    &
-                    PTHS=PTHS, PSRCS=PSRCS, PCLDFR=PCLDFR,                   &
-                    PRRT=PRT(:,:,:,3), PRRS=PRS(:,:,:,3),                    &
-                    PRIT=PRT(:,:,:,4), PRIS=PRS(:,:,:,4),                    &
-                    PRST=PRT(:,:,:,5), PRSS=PRS(:,:,:,5),                    &
-                    PRGT=PRT(:,:,:,6), PRGS=PRS(:,:,:,6),                    &
-                    PRHT=PRT(:,:,:,7), PRHS=PRS(:,:,:,7)                     )
+                    PTH=PTHS*PTSTEP, PTHS=PTHS, PSRCS=PSRCS, PCLDFR=PCLDFR,  &
+                    PRR=PRS(:,:,:,3)*PTSTEP,                                 &
+                    PRI=PRS(:,:,:,4)*PTSTEP, PRIS=PRS(:,:,:,4),              &
+                    PRS=PRS(:,:,:,5)*PTSTEP,                                 &
+                    PRG=PRS(:,:,:,6)*PTSTEP,                                 &
+                    PRH=PRS(:,:,:,7)*PTSTEP                                  )
+    END IF
+!           
 !
 !*       12.    2-MOMENT MIXED-PHASE MICROPHYSICAL SCHEME LIMA
 !               --------------------------------------------------------------
@@ -985,6 +1098,31 @@ SELECT CASE ( HCLOUD )
 !
 END SELECT
 !
+IF(HCLOUD=='ICE3' .OR. HCLOUD=='ICE4' ) THEN
+  PINPRC3D=ZFPR(:,:,:,2) / XRHOLW
+  PINPRR3D=ZFPR(:,:,:,3) / XRHOLW
+  PINPRS3D=ZFPR(:,:,:,5) / XRHOLW
+  PINPRG3D=ZFPR(:,:,:,6) / XRHOLW
+  IF(KRR==7) PINPRH3D=ZFPR(:,:,:,7) / XRHOLW
+  WHERE (PRT(:,:,:,2) > 1.E-04 )
+    PSPEEDC=ZFPR(:,:,:,2) / (PRT(:,:,:,2) * PRHODREF(:,:,:))
+  ENDWHERE
+  WHERE (PRT(:,:,:,3) > 1.E-04 )
+    PSPEEDR=ZFPR(:,:,:,3) / (PRT(:,:,:,3) * PRHODREF(:,:,:))
+  ENDWHERE
+  WHERE (PRT(:,:,:,5) > 1.E-04 )
+    PSPEEDS=ZFPR(:,:,:,5) / (PRT(:,:,:,5) * PRHODREF(:,:,:))
+  ENDWHERE
+  WHERE (PRT(:,:,:,6) > 1.E-04 )
+    PSPEEDG=ZFPR(:,:,:,6) / (PRT(:,:,:,6) * PRHODREF(:,:,:))
+  ENDWHERE
+  IF(KRR==7) THEN
+    WHERE (PRT(:,:,:,7) > 1.E-04 )
+      PSPEEDH=ZFPR(:,:,:,7) / (PRT(:,:,:,7) * PRHODREF(:,:,:))
+    ENDWHERE
+  ENDIF
+ENDIF
+!
 IF ( (HCLOUD == 'KHKO') .OR. (HCLOUD == 'C2R2') ) THEN
 !    CALL GET_HALO(PRS(:,:,:,2))
 !    CALL GET_HALO(ZSVS(:,:,:,2))
@@ -996,7 +1134,7 @@ IF ( (HCLOUD == 'KHKO') .OR. (HCLOUD == 'C2R2') ) THEN
       WHERE (PRS(:,:,:,JSV) < 0. .OR. ZSVS(:,:,:,JSV) < 0.)
         PRS(:,:,:,1) = PRS(:,:,:,1) + PRS(:,:,:,JSV)
         PTHS(:,:,:) = PTHS(:,:,:) - PRS(:,:,:,JSV) * ZLV(:,:,:) /  &
-             ZCPH(:,:,:) / ZEXN(:,:,:)
+             ZCPH(:,:,:) / PEXNREF(:,:,:)
         PRS(:,:,:,JSV)  = 0.0
         ZSVS(:,:,:,JSV) = 0.0
       END WHERE
-- 
GitLab