From 77bb80c1af2ae4407260a38c255f3bce2cbc9b92 Mon Sep 17 00:00:00 2001
From: VIE Benoit <vie@sxphynh>
Date: Thu, 16 Jun 2022 13:16:56 +0200
Subject: [PATCH] bugfix sedim NMOM_I=1 & compute tendencies where mr>xrtmin

---
 src/MNH/lima_adjust_split.f90   |  18 ++---
 src/MNH/lima_sedimentation.f90  |  19 ++++--
 src/MNH/lima_tendencies.f90     | 113 +++++++++++++++++++++-----------
 src/MNH/sources_neg_correct.f90 |  33 +++++++---
 4 files changed, 123 insertions(+), 60 deletions(-)

diff --git a/src/MNH/lima_adjust_split.f90 b/src/MNH/lima_adjust_split.f90
index a1afd1350..672e293f1 100644
--- a/src/MNH/lima_adjust_split.f90
+++ b/src/MNH/lima_adjust_split.f90
@@ -519,7 +519,7 @@ DO JITER =1,ITERMAX
            Z_SIGS, PMFCONV, PCLDFR, Z_SRCS, GUSERI, G_SIGMAS,                  &
            Z_SIGQSAT, PLV=ZLV, PLS=ZLS, PCPH=ZCPH )
    END IF
-   IF (OSUBG_COND .AND. NMOM_C.GE.2) THEN
+   IF (OSUBG_COND .AND. NMOM_C.GE.2 .AND. LACTI) THEN
       PSRCS=Z_SRCS
       ZW_MF=0.
       CALL LIMA_CCN_ACTIVATION (TPFILE,                          &
@@ -630,13 +630,15 @@ END IF
 !
 ZMASK(:,:,:) = 0.0
 ZW(:,:,:) = 0.
-WHERE (PRCS(:,:,:) <= ZRTMIN(2) .OR. PCCS(:,:,:) <0.) 
-   PRVS(:,:,:) = PRVS(:,:,:) + PRCS(:,:,:) 
-   PTHS(:,:,:) = PTHS(:,:,:) - PRCS(:,:,:)*ZLV(:,:,:)/(ZCPH(:,:,:)*ZEXNS(:,:,:))
-   PRCS(:,:,:) = 0.0
-   ZW(:,:,:)   = MAX(PCCS(:,:,:),0.)
-   PCCS(:,:,:) = 0.0
-END WHERE
+IF (NMOM_C .GE. 2) THEN
+   WHERE (PRCS(:,:,:) <= ZRTMIN(2) .OR. PCCS(:,:,:) <=0.) 
+      PRVS(:,:,:) = PRVS(:,:,:) + PRCS(:,:,:) 
+      PTHS(:,:,:) = PTHS(:,:,:) - PRCS(:,:,:)*ZLV(:,:,:)/(ZCPH(:,:,:)*ZEXNS(:,:,:))
+      PRCS(:,:,:) = 0.0
+      ZW(:,:,:)   = MAX(PCCS(:,:,:),0.)
+      PCCS(:,:,:) = 0.0
+   END WHERE
+END IF
 !
 ZW1(:,:,:) = 0.
 IF (LWARM .AND. NMOD_CCN.GE.1) ZW1(:,:,:) = SUM(PNAS,DIM=4)
diff --git a/src/MNH/lima_sedimentation.f90 b/src/MNH/lima_sedimentation.f90
index cd90504a1..d7d26bf02 100644
--- a/src/MNH/lima_sedimentation.f90
+++ b/src/MNH/lima_sedimentation.f90
@@ -72,7 +72,7 @@ END MODULE MODI_LIMA_SEDIMENTATION
 !*       0.    DECLARATIONS
 !              ------------
 !
-USE MODD_CST,              ONLY: XRHOLW, XCL, XCI
+USE MODD_CST,              ONLY: XRHOLW, XCL, XCI, XPI
 USE MODD_PARAMETERS,       ONLY: JPHEXT, JPVEXT
 USE MODD_PARAM_LIMA,       ONLY: XCEXVT, XRTMIN, XCTMIN, NSPLITSED,           &
                                  XLB, XLBEX, XD, XFSEDR, XFSEDC,              &
@@ -133,10 +133,13 @@ INTEGER , DIMENSION(SIZE(PRHODREF)) :: I1,I2,I3 ! Indexes for PACK replacement
 !
 REAL    :: ZTSPLITG                       ! Small time step for rain sedimentation
 REAL    :: ZC                             ! Cpl or Cpi
+INTEGER :: ZMOMENTS
 !
 !
 !-------------------------------------------------------------------------------
 !
+ZMOMENTS=KMOMENTS
+!
 ! Time splitting
 !
 ZTSPLITG= PTSTEP / REAL(NSPLITSED(KID))
@@ -153,6 +156,12 @@ END DO
 IF (HPHASE=='L') ZC=XCL
 IF (HPHASE=='I') ZC=XCI
 !
+IF (KID==4 .AND. ZMOMENTS==1) THEN
+   ZMOMENTS=2
+   WHERE(PRS(:,:,:)>0) PCS(:,:,:)=1/(4*XPI*900.) * PRS(:,:,:) * &
+        MAX(0.05E6,-0.15319E6-0.021454E6*ALOG(PRHODREF(:,:,:)*PRS(:,:,:)))**3
+END IF
+!
 ! ################################
 ! Compute the sedimentation fluxes
 ! ################################
@@ -161,7 +170,7 @@ DO JN = 1 ,  NSPLITSED(KID)
   ! Computation only where enough ice, snow, graupel or hail
    GSEDIM(:,:,:) = .FALSE.
    GSEDIM(KIB:KIE,KJB:KJE,KKTB:KKTE) = PRS(KIB:KIE,KJB:KJE,KKTB:KKTE)>XRTMIN(KID)
-   IF (KMOMENTS==2)  GSEDIM(:,:,:) = GSEDIM(:,:,:) .AND. PCS(:,:,:)>XCTMIN(KID)
+   IF (ZMOMENTS==2)  GSEDIM(:,:,:) = GSEDIM(:,:,:) .AND. PCS(:,:,:)>XCTMIN(KID)
    ISEDIM = COUNTJV( GSEDIM(:,:,:),I1(:),I2(:),I3(:))
 !
    IF( ISEDIM >= 1 ) THEN
@@ -182,7 +191,7 @@ DO JN = 1 ,  NSPLITSED(KID)
          ZPABST(JL) = PPABST(I1(JL),I2(JL),I3(JL))
          ZT(JL) = PT(I1(JL),I2(JL),I3(JL))
          ZRS(JL) = PRS(I1(JL),I2(JL),I3(JL))
-         IF (KMOMENTS==2) ZCS(JL) = PCS(I1(JL),I2(JL),I3(JL))
+         IF (ZMOMENTS==2) ZCS(JL) = PCS(I1(JL),I2(JL),I3(JL))
       END DO
 !
       IF (KID == 5 .AND. LSNOW_T) THEN
@@ -197,8 +206,8 @@ DO JN = 1 ,  NSPLITSED(KID)
          ZZW(:) = XFSEDR(KID) * ZRHODREF(:)**(1.-XCEXVT)*ZRS(:)* &
               (1 + (XFVELOS/ZLBDA(:))**XALPHAS)**(-XNUS-(XD(KID)+XBS)/XALPHAS) * ZLBDA(:)**(-XD(KID))
       ELSE
-         IF (KMOMENTS==1) ZLBDA(:) = XLB(KID) * ( ZRHODREF(:) * ZRS(:) )**XLBEX(KID)
-         IF (KMOMENTS==2) ZLBDA(:) = ( XLB(KID)*ZCS(:) / ZRS(:) )**XLBEX(KID)
+         IF (ZMOMENTS==1) ZLBDA(:) = XLB(KID) * ( ZRHODREF(:) * ZRS(:) )**XLBEX(KID)
+         IF (ZMOMENTS==2) ZLBDA(:) = ( XLB(KID)*ZCS(:) / ZRS(:) )**XLBEX(KID)
          ZZY(:) = ZRHODREF(:)**(-XCEXVT) * ZLBDA(:)**(-XD(KID))
          ZZW(:) = XFSEDR(KID) * ZRS(:) * ZZY(:) * ZRHODREF(:)
       END IF ! Wurtz
diff --git a/src/MNH/lima_tendencies.f90 b/src/MNH/lima_tendencies.f90
index 0d46f5d36..3e63f4d38 100644
--- a/src/MNH/lima_tendencies.f90
+++ b/src/MNH/lima_tendencies.f90
@@ -471,6 +471,12 @@ REAL,    DIMENSION(SIZE(PRCT))  :: ZCF1D
 REAL,    DIMENSION(SIZE(PRCT))  :: ZIF1D
 REAL,    DIMENSION(SIZE(PRCT))  :: ZPF1D
 !
+REAL,    DIMENSION(SIZE(PRCT))  :: ZRCT
+REAL,    DIMENSION(SIZE(PRCT))  :: ZRRT
+REAL,    DIMENSION(SIZE(PRCT))  :: ZRIT
+REAL,    DIMENSION(SIZE(PRCT))  :: ZRST
+REAL,    DIMENSION(SIZE(PRCT))  :: ZRGT
+REAL,    DIMENSION(SIZE(PRCT))  :: ZRHT
 !-------------------------------------------------------------------------------
 ! Pre-compute quantities
 !
@@ -480,6 +486,39 @@ ZCF1D(:) = MAX(PCF1D(:),0.01)
 ZIF1D(:) = MAX(PIF1D(:),0.01)
 ZPF1D(:) = MAX(PPF1D(:),0.01)
 !
+!
+!
+WHERE (PRCT(:).GE.XRTMIN(2))
+   ZRCT(:)=PRCT(:)
+ELSEWHERE
+   ZRCT(:)=0.
+END WHERE
+WHERE (PRRT(:).GE.XRTMIN(3))
+   ZRRT(:)=PRRT(:)
+ELSEWHERE
+   ZRRT(:)=0.
+END WHERE
+WHERE (PRIT(:).GE.XRTMIN(4))
+   ZRIT(:)=PRIT(:)
+ELSEWHERE
+   ZRIT(:)=0.
+END WHERE
+WHERE (PRST(:).GE.XRTMIN(5))
+   ZRST(:)=PRST(:)
+ELSEWHERE
+   ZRST(:)=0.
+END WHERE
+WHERE (PRGT(:).GE.XRTMIN(6))
+   ZRGT(:)=PRGT(:)
+ELSEWHERE
+   ZRGT(:)=0.
+END WHERE
+WHERE (PRHT(:).GE.XRTMIN(7))
+   ZRHT(:)=PRHT(:)
+ELSEWHERE
+   ZRHT(:)=0.
+END WHERE
+!
 ! Is it necessary to compute the following quantities
 ! accounting for subgrig cloud fraction ?
 ! lambda does not depend on cloud fraction for 2-m species
@@ -494,8 +533,8 @@ WHERE (LDCOMPUTE(:))
 !
    ZW(:) = PEXNREF(:)*( XCPD &
                                +XCPV*PRVT(:) &
-                               +XCL*(PRCT(:)+PRRT(:)) &
-                               +XCI*(PRIT(:)+PRST(:)+PRGT(:)+PRHT(:)) )
+                               +XCL*(ZRCT(:)+ZRRT(:)) &
+                               +XCI*(ZRIT(:)+ZRST(:)+ZRGT(:)+ZRHT(:)) )
 !
    ZLV(:) = XLVTT + (XCPV-XCL)*(ZT(:)-XTT)
    ZLVFACT(:) = ZLV(:)/ZW(:)               ! L_v/(Pi_ref*C_ph)
@@ -526,8 +565,8 @@ END WHERE
 ! Cloud droplets : same formula for 1 and 2 moments, but using real or fixed Nc value
 ZLBDC(:)  = 1.E10
 ZLBDC3(:) = 1.E30
-WHERE (PRCT(:)>XRTMIN(2) .AND. PCCT(:)>XCTMIN(2) .AND. LDCOMPUTE(:))
-   ZLBDC3(:) = XLBC*PCCT(:) / PRCT(:)
+WHERE (ZRCT(:)>XRTMIN(2) .AND. PCCT(:)>XCTMIN(2) .AND. LDCOMPUTE(:))
+   ZLBDC3(:) = XLBC*PCCT(:) / ZRCT(:)
    ZLBDC(:)  = ZLBDC3(:)**XLBEXC
 END WHERE
 !
@@ -535,29 +574,29 @@ END WHERE
 ZLBDR(:)  = 1.E10
 ZLBDR3(:) = 1.E30
 IF (NMOM_R.EQ.1) THEN
-   WHERE (PRRT(:)>XRTMIN(3) .AND. LDCOMPUTE(:) )
-      ZLBDR(:) = XLBR*(PRHODREF(:)*PRRT(:) )**XLBEXR
+   WHERE (ZRRT(:)>XRTMIN(3) .AND. LDCOMPUTE(:) )
+      ZLBDR(:) = XLBR*(PRHODREF(:)*ZRRT(:) )**XLBEXR
       ZLBDR3(:) = ZLBDR(:)**3.
    END WHERE
    PCRT(:) = XCCR * ZLBDR(:)**XCXR / PRHODREF(:)
 ELSE
-   WHERE (PRRT(:)>XRTMIN(3) .AND. PCRT(:)>XCTMIN(3) .AND. LDCOMPUTE(:))
-      ZLBDR3(:) = XLBR*PCRT(:) / PRRT(:)
+   WHERE (ZRRT(:)>XRTMIN(3) .AND. PCRT(:)>XCTMIN(3) .AND. LDCOMPUTE(:))
+      ZLBDR3(:) = XLBR*PCRT(:) / ZRRT(:)
       ZLBDR(:)  = ZLBDR3(:)**XLBEXR
    END WHERE
 END IF
 !
 ! Pristine ice : same formula for 1 and 2 moments, using real or diagnosed Ni
 ZLBDI(:)  = 1.E10
-WHERE (PRIT(:)>XRTMIN(4) .AND. PCIT(:)>XCTMIN(4) .AND. LDCOMPUTE(:))
-   ZLBDI(:) = ( XLBI*PCIT(:) / PRIT(:) )**XLBEXI
+WHERE (ZRIT(:)>XRTMIN(4) .AND. PCIT(:)>XCTMIN(4) .AND. LDCOMPUTE(:))
+   ZLBDI(:) = ( XLBI*PCIT(:) / ZRIT(:) )**XLBEXI
 END WHERE
 !
 ! Snow : additional option for LSNOW_T if NMOM_S=1
 ZLBDS(:)  = 1.E10
 IF (NMOM_S.EQ.1) THEN
    IF (LSNOW_T) THEN
-      WHERE (PRST(:)>XRTMIN(5) .AND. LDCOMPUTE(:) )
+      WHERE (ZRST(:)>XRTMIN(5) .AND. LDCOMPUTE(:) )
          WHERE(ZT(:)>263.15)
             ZLBDS(:) = MAX(MIN(XLBDAS_MAX, 10**(14.554-0.0423*ZT(:))),XLBDAS_MIN)
          END WHERE
@@ -566,37 +605,37 @@ IF (NMOM_S.EQ.1) THEN
          END WHERE
       END WHERE
       ZLBDS(:) =  ZLBDS(:) * XTRANS_MP_GAMMAS
-      PCST(:) = XNS * PRST(:) * ZLBDS(:)**XBS
+      PCST(:) = XNS * ZRST(:) * ZLBDS(:)**XBS
    ELSE
-      WHERE (PRST(:)>XRTMIN(5) .AND. LDCOMPUTE(:) )
-         ZLBDS(:) = XLBS*( PRHODREF(:)*PRST(:) )**XLBEXS
+      WHERE (ZRST(:)>XRTMIN(5) .AND. LDCOMPUTE(:) )
+         ZLBDS(:) = XLBS*( PRHODREF(:)*ZRST(:) )**XLBEXS
       END WHERE
       PCST(:) = XCCS * ZLBDS(:)**XCXS / PRHODREF(:)
    END IF
 ELSE
-   ZLBDS(:) = (XLBS*PCST(:)/PRST(:))**XLBEXS
+   ZLBDS(:) = (XLBS*PCST(:)/ZRST(:))**XLBEXS
 END IF
 !
 ! Graupel
 ZLBDG(:)  = 1.E10
 IF (NMOM_G.EQ.1) THEN
-   WHERE (PRGT(:)>XRTMIN(6) .AND. LDCOMPUTE(:) )
-      ZLBDG(:) = XLBG*( PRHODREF(:)*PRGT(:) )**XLBEXG
+   WHERE (ZRGT(:)>XRTMIN(6) .AND. LDCOMPUTE(:) )
+      ZLBDG(:) = XLBG*( PRHODREF(:)*ZRGT(:) )**XLBEXG
    END WHERE
       PCGT(:) = XCCG * ZLBDG(:)**XCXG / PRHODREF(:)
 ELSE
-   ZLBDG(:) = (XLBG*PCGT(:)/PRGT(:))**XLBEXG
+   ZLBDG(:) = (XLBG*PCGT(:)/ZRGT(:))**XLBEXG
 END IF
 !
 ! Hail
 ZLBDH(:)  = 1.E10
 IF (NMOM_H.EQ.1) THEN
-   WHERE (PRHT(:)>XRTMIN(7) .AND. LDCOMPUTE(:) )
-      ZLBDH(:) = XLBH*( PRHODREF(:)*PRHT(:) )**XLBEXH
+   WHERE (ZRHT(:)>XRTMIN(7) .AND. LDCOMPUTE(:) )
+      ZLBDH(:) = XLBH*( PRHODREF(:)*ZRHT(:) )**XLBEXH
       PCHT(:) = XCCH * ZLBDH(:)**XCXH / PRHODREF(:)
    END WHERE
 ELSE
-   ZLBDH(:) = (XLBH*PCHT(:)/PRHT(:))**XLBEXH
+   ZLBDH(:) = (XLBH*PCHT(:)/ZRHT(:))**XLBEXH
 END IF
 !
 !-------------------------------------------------------------------------------
@@ -605,7 +644,7 @@ END IF
 IF (LCOLD .AND. LWARM) THEN
    CALL LIMA_DROPLETS_HOM_FREEZING (PTSTEP, LDCOMPUTE,                 & ! independent from CF,IF,PF
                                     ZT, ZLVFACT, ZLSFACT,              &
-                                    PRCT, PCCT, ZLBDC,                 &
+                                    ZRCT, PCCT, ZLBDC,                 &
                                     P_TH_HONC, P_RC_HONC, P_CC_HONC    )
    PA_RC(:) = PA_RC(:) + P_RC_HONC(:)
    IF (NMOM_C.GE.2) PA_CC(:) = PA_CC(:) + P_CC_HONC(:)
@@ -627,7 +666,7 @@ END IF
 IF (LWARM .AND. LRAIN) THEN
    CALL LIMA_DROPLETS_AUTOCONVERSION (LDCOMPUTE,                             & ! depends on CF
                                       PRHODREF,                              &
-                                      PRCT/ZCF1D, PCCT/ZCF1D, ZLBDC, ZLBDR,  &
+                                      ZRCT/ZCF1D, PCCT/ZCF1D, ZLBDC, ZLBDR,  &
                                       P_RC_AUTO, P_CC_AUTO, P_CR_AUTO        )
    P_RC_AUTO(:) = P_RC_AUTO(:) * ZCF1D(:)
    P_CC_AUTO(:) = P_CC_AUTO(:) * ZCF1D(:)
@@ -642,7 +681,7 @@ END IF
 IF (LWARM .AND. LRAIN) THEN
    CALL LIMA_DROPLETS_ACCRETION (LDCOMPUTE,                                     & ! depends on CF, PF
                                  PRHODREF,                                      &
-                                 PRCT/ZCF1D, PRRT/ZPF1D, PCCT/ZCF1D, PCRT/ZPF1D,&
+                                 ZRCT/ZCF1D, ZRRT/ZPF1D, PCCT/ZCF1D, PCRT/ZPF1D,&
                                  ZLBDC, ZLBDC3, ZLBDR, ZLBDR3,                  &
                                  P_RC_ACCR, P_CC_ACCR                           )
    !
@@ -668,7 +707,7 @@ END IF
 IF (LWARM .AND. LRAIN) THEN
    CALL LIMA_RAIN_EVAPORATION (PTSTEP, LDCOMPUTE,                               & ! depends on PF > CF 
                                PRHODREF, ZT, ZLV, ZLVFACT, ZEVSAT, ZRVSAT,      &
-                               PRVT, PRCT/ZPF1D, PRRT/ZPF1D, PCRT/ZPF1D, ZLBDR, &
+                               PRVT, ZRCT/ZPF1D, ZRRT/ZPF1D, PCRT/ZPF1D, ZLBDR, &
                                P_TH_EVAP, P_RR_EVAP, P_CR_EVAP,                 &
                                PEVAP3D                                          )
    P_RR_EVAP(:) = P_RR_EVAP(:) * MAX((ZPF1D(:) - ZCF1D(:)),0.)
@@ -688,7 +727,7 @@ IF (LCOLD) THEN
    !
    CALL LIMA_ICE_DEPOSITION (PTSTEP, LDCOMPUTE,                 & ! depends on IF, PF
                              PRHODREF, ZT, ZSSI, ZAI, ZCJ, ZLSFACT, &
-                             PRIT/ZIF1D, PCIT/ZIF1D, ZLBDI,     &
+                             ZRIT/ZIF1D, PCIT/ZIF1D, ZLBDI,     &
                              P_TH_DEPI, P_RI_DEPI,              &
                              P_RI_CNVS, P_CI_CNVS               )
    !
@@ -711,7 +750,7 @@ IF (LCOLD .AND. LSNOW) THEN
    !
    CALL LIMA_SNOW_DEPOSITION (LDCOMPUTE,                         & ! depends on IF, PF
                               PRHODREF, ZSSI, ZAI, ZCJ, ZLSFACT, &
-                              PRST/ZPF1D, ZLBDS,                 &
+                              ZRST/ZPF1D, ZLBDS,                 &
                               P_RI_CNVI, P_CI_CNVI,              &
                               P_TH_DEPS, P_RS_DEPS               )
    !
@@ -737,7 +776,7 @@ END IF
 IF (LCOLD .AND. LSNOW) THEN
    CALL LIMA_ICE_AGGREGATION_SNOW (LDCOMPUTE,                                        & ! depends on IF, PF
                                    ZT, PRHODREF,                                     &
-                                   PRIT/ZIF1D, PRST/ZPF1D, PCIT/ZIF1D, ZLBDI, ZLBDS, &
+                                   ZRIT/ZIF1D, ZRST/ZPF1D, PCIT/ZIF1D, ZLBDI, ZLBDS, &
                                    P_RI_AGGS, P_CI_AGGS                              )
    P_CI_AGGS(:) = P_CI_AGGS(:) * ZIF1D(:)
    P_RI_AGGS(:) = P_RI_AGGS(:) * ZIF1D(:)
@@ -749,7 +788,7 @@ END IF
 !
 IF (LWARM .AND. LCOLD) THEN
    CALL LIMA_GRAUPEL_DEPOSITION (LDCOMPUTE, PRHODREF,                        & ! depends on PF ?
-                                 PRGT/ZPF1D, ZSSI, ZLBDG, ZAI, ZCJ, ZLSFACT, &
+                                 ZRGT/ZPF1D, ZSSI, ZLBDG, ZAI, ZCJ, ZLSFACT, &
                                  P_TH_DEPG, P_RG_DEPG                        )
    P_RG_DEPG(:) = P_RG_DEPG(:) * ZPF1D(:)
    P_TH_DEPG(:) = P_RG_DEPG(:) * ZLSFACT(:)
@@ -761,7 +800,7 @@ END IF
 !
 IF (LWARM .AND. LCOLD .AND. NMOM_I.EQ.1) THEN
    CALL LIMA_BERGERON (LDCOMPUTE,                                 & ! depends on CF, IF
-                       PRCT/ZCF1D, PRIT/ZIF1D, PCIT/ZIF1D, ZLBDI, &
+                       ZRCT/ZCF1D, ZRIT/ZIF1D, PCIT/ZIF1D, ZLBDI, &
                        ZSSIW, ZAI, ZCJ, ZLVFACT, ZLSFACT,         &
                        P_TH_BERFI, P_RC_BERFI                     )
    P_TH_BERFI(:) = P_TH_BERFI(:) * MIN(ZCF1D,ZIF1D)
@@ -779,7 +818,7 @@ IF (LWARM .AND. LCOLD .AND. LSNOW) THEN
      !
    CALL LIMA_DROPLETS_RIMING_SNOW (PTSTEP, LDCOMPUTE,                                & ! depends on CF
                                    PRHODREF, ZT,                                     &
-                                   PRCT/ZCF1D, PCCT/ZCF1D, PRST/ZPF1D, ZLBDC, ZLBDS, ZLVFACT, ZLSFACT, &
+                                   ZRCT/ZCF1D, PCCT/ZCF1D, ZRST/ZPF1D, ZLBDC, ZLBDS, ZLVFACT, ZLSFACT, &
                                    P_TH_RIM, P_RC_RIM, P_CC_RIM, P_RS_RIM, P_RG_RIM, &
                                    P_RI_HMS, P_CI_HMS, P_RS_HMS                      )
    P_RC_RIM(:) = P_RC_RIM(:) * ZCF1D(:)
@@ -804,7 +843,7 @@ END IF
 IF (LWARM .AND. LRAIN .AND. LCOLD .AND. LSNOW) THEN
    CALL LIMA_RAIN_ACCR_SNOW (PTSTEP, LDCOMPUTE,                                & ! depends on PF
                              PRHODREF, ZT,                                     &
-                             PRRT/ZPF1D, PCRT/ZPF1D, PRST/ZPF1D, ZLBDR, ZLBDS, ZLVFACT, ZLSFACT, &
+                             ZRRT/ZPF1D, PCRT/ZPF1D, ZRST/ZPF1D, ZLBDR, ZLBDS, ZLVFACT, ZLSFACT, &
                              P_TH_ACC, P_RR_ACC, P_CR_ACC, P_RS_ACC, P_RG_ACC )
    P_RR_ACC(:) = P_RR_ACC(:) * ZPF1D(:)
    P_CR_ACC(:) = P_CR_ACC(:) * ZPF1D(:)
@@ -827,7 +866,7 @@ IF (LWARM .AND. LCOLD .AND. LSNOW) THEN
    !
    CALL LIMA_CONVERSION_MELTING_SNOW (LDCOMPUTE,                           & ! depends on PF
                                       PRHODREF, PPABST, ZT, ZKA, ZDV, ZCJ, &
-                                      PRVT, PRST/ZPF1D, ZLBDS,             &
+                                      PRVT, ZRST/ZPF1D, ZLBDS,             &
                                       P_RS_CMEL                           )
    P_RS_CMEL(:) = P_RS_CMEL(:) * ZPF1D(:)
    !
@@ -839,7 +878,7 @@ END IF
 IF (LWARM .AND. LRAIN .AND. LCOLD ) THEN
    CALL LIMA_RAIN_FREEZING (LDCOMPUTE,                                             & ! depends on PF, IF
                             PRHODREF, ZT, ZLVFACT, ZLSFACT,                        &
-                            PRRT/ZPF1D, PCRT/ZPF1D, PRIT/ZIF1D, PCIT/ZIF1D, ZLBDR, &
+                            ZRRT/ZPF1D, PCRT/ZPF1D, ZRIT/ZIF1D, PCIT/ZIF1D, ZLBDR, &
                             P_TH_CFRZ, P_RR_CFRZ, P_CR_CFRZ, P_RI_CFRZ, P_CI_CFRZ  )
    P_RR_CFRZ(:) = P_RR_CFRZ(:) * ZIF1D(:)
    P_CR_CFRZ(:) = P_CR_CFRZ(:) * ZIF1D(:)
@@ -863,7 +902,7 @@ IF (LWARM .AND. LCOLD .AND. LSNOW .AND. LCIBU) THEN
    !
    CALL LIMA_COLLISIONAL_ICE_BREAKUP (LDCOMPUTE,                                      & ! depends on PF (IF for fragments size)
                                       PRHODREF,                                       &
-                                      PRIT/ZIF1D, PRST/ZPF1D, PRGT/ZPF1D, PCIT/ZIF1D, &
+                                      ZRIT/ZIF1D, ZRST/ZPF1D, ZRGT/ZPF1D, PCIT/ZIF1D, &
                                       ZLBDS, ZLBDG,                                   &
                                       P_RI_CIBU, P_CI_CIBU                            )
    P_RI_CIBU(:) = P_RI_CIBU(:) * ZPF1D(:)
@@ -882,7 +921,7 @@ IF (LWARM .AND. LRAIN .AND. LCOLD .AND. LSNOW .AND. LRDSF) THEN
    !
    CALL LIMA_RAINDROP_SHATTERING_FREEZING (LDCOMPUTE,                                      & ! depends on PF, IF
                                            PRHODREF,                                       &
-                                           PRRT/ZPF1D, PCRT/ZPF1D, PRIT/ZIF1D, PCIT/ZIF1D, PRGT/ZPF1D, &
+                                           ZRRT/ZPF1D, PCRT/ZPF1D, ZRIT/ZIF1D, PCIT/ZIF1D, ZRGT/ZPF1D, &
                                            ZLBDR,                                          &
                                            P_RI_RDSF, P_CI_RDSF                            )
    P_RI_RDSF(:) = P_RI_RDSF(:) * ZIF1D(:)
@@ -904,7 +943,7 @@ IF (LWARM .AND. LCOLD) THEN
      !
    CALL LIMA_GRAUPEL (PTSTEP, LDCOMPUTE,                                     & ! depends on PF, CF, IF
                       PRHODREF, PPABST, ZT, ZKA, ZDV, ZCJ,                   &
-                      PRVT, PRCT, PRRT, PRIT, PRST, PRGT,                    &
+                      PRVT, ZRCT, ZRRT, ZRIT, ZRST, ZRGT,                    &
                       PCCT, PCRT, PCIT,                                      &
                       ZLBDC, ZLBDR, ZLBDS, ZLBDG,                            &
                       ZLVFACT, ZLSFACT,                                      &
diff --git a/src/MNH/sources_neg_correct.f90 b/src/MNH/sources_neg_correct.f90
index c17d1dbc1..aa5978a54 100644
--- a/src/MNH/sources_neg_correct.f90
+++ b/src/MNH/sources_neg_correct.f90
@@ -29,7 +29,7 @@ use modd_budget,     only: lbudget_th, lbudget_rv, lbudget_rc, lbudget_rr, lbudg
 use modd_cst,        only: xci, xcl, xcpd, xcpv, xlstt, xlvtt, xp00, xrd, xtt
 use modd_nsv,        only: nsv_c2r2beg, nsv_c2r2end, nsv_lima_beg, nsv_lima_end, nsv_lima_nc, nsv_lima_nr, nsv_lima_ni
 use modd_param_lima, only: lcold_lima => lcold, lrain_lima => lrain, lspro_lima => lspro, lwarm_lima => lwarm, &
-                           xctmin_lima => xctmin, xrtmin_lima => xrtmin
+                           xctmin_lima => xctmin, xrtmin_lima => xrtmin, nmom_c, nmom_r, nmom_i
 
 use mode_budget,         only: Budget_store_init, Budget_store_end
 use mode_msg
@@ -54,6 +54,7 @@ integer :: jrmax
 integer :: jsv
 integer :: isv_lima_end
 real, dimension(:, :, :), allocatable :: zt, zexn, zlv, zls, zcph, zcor
+logical, dimension(:, :, :), allocatable :: zmask
 
 if ( krr == 0 ) return
 
@@ -235,42 +236,51 @@ CLOUD: select case ( hcloud )
     end where
 !
 !
-  case( 'LIMA_OFF' )
+  case( 'LIMA' )
+    allocate( zmask  ( Size( prths, 1 ), Size( prths, 2 ), Size( prths, 3 ) ) )
 ! Correction where rc<0 or Nc<0
     if ( lwarm_lima ) then
-      where ( prrs(:, :, :, 2) < xrtmin_lima(2) / ptstep .or. prsvs(:, :, :, nsv_lima_nc) < xctmin_lima(2) / ptstep )
+      zmask(:,:,:)=(prrs(:, :, :, 2) < xrtmin_lima(2) / ptstep)
+      if (nmom_c.ge.2) zmask(:,:,:)=(zmask(:,:,:) .or. prsvs(:, :, :, nsv_lima_nc) < 0. )
+      where ( zmask(:,:,:) )
         prrs(:, :, :, 1) = prrs(:, :, :, 1) + prrs(:, :, :, 2)
         prths(:, :, :) = prths(:, :, :) - prrs(:, :, :, 2) * zlv(:, :, :) /  &
                  ( zcph(:, :, :) * zexn(:, :, :) )
         prrs(:, :, :, 2)  = 0.
-        prsvs(:, :, :, nsv_lima_nc) = 0.
       end where
       where ( prrs(:, :, :, 1) < 0. .and. prrs(:, :, :, 2) > 0. )
         prrs(:, :, :, 1) = prrs(:, :, :, 1) + prrs(:, :, :, 2)
         prths(:, :, :) = prths(:, :, :) - prrs(:, :, :, 2) * zlv(:, :, :) /  &
            ( zcph(:, :, :) * zexn(:, :, :) )
         prrs(:, :, :, 2) = 0.
-        prsvs(:, :, :, nsv_lima_nc) = 0.
       end where
+      if (nmom_c.ge.2) then
+         where (prrs(:, :, :, 2) == 0.)  prsvs(:, :, :, nsv_lima_nc) = 0.
+      end if
     end if
 ! Correction where rr<0 or Nr<0
     if ( lwarm_lima .and. lrain_lima ) then
-      where ( prrs(:, :, :, 3) < xrtmin_lima(3) / ptstep .or. prsvs(:, :, :, nsv_lima_nr) < xctmin_lima(3) / ptstep )
+      zmask(:,:,:)=(prrs(:, :, :, 3) < xrtmin_lima(3) / ptstep)
+      if (nmom_r.ge.2) zmask(:,:,:)=(zmask(:,:,:) .or. prsvs(:, :, :, nsv_lima_nr) < 0. )
+      where ( zmask(:,:,:) )
         prrs(:, :, :, 1) = prrs(:, :, :, 1) + prrs(:, :, :, 3)
         prths(:, :, :) = prths(:, :, :) - prrs(:, :, :, 3) * zlv(:, :, :) /  &
                  ( zcph(:, :, :) * zexn(:, :, :) )
         prrs(:, :, :, 3)  = 0.
-        prsvs(:, :, :, nsv_lima_nr) = 0.
       end where
+      if (nmom_r.ge.2) then
+         where (prrs(:, :, :, 3) == 0.)  prsvs(:, :, :, nsv_lima_nr) = 0.
+      end if
     end if
 ! Correction where ri<0 or Ni<0
     if ( lcold_lima ) then
-      where ( prrs(:, :, :, 4) < xrtmin_lima(4) / ptstep .or. prsvs(:, :, :, nsv_lima_ni) < xctmin_lima(4) / ptstep )
+      zmask(:,:,:)=(prrs(:, :, :, 4) < xrtmin_lima(4) / ptstep)
+      if (nmom_i.ge.2) zmask(:,:,:)=(zmask(:,:,:) .or. prsvs(:, :, :, nsv_lima_ni) < 0. )
+      where ( zmask(:,:,:) )
         prrs(:, :, :, 1) = prrs(:, :, :, 1) + prrs(:, :, :, 4)
         prths(:, :, :) = prths(:, :, :) - prrs(:, :, :, 4) * zls(:, :, :) /  &
                  ( zcph(:, :, :) * zexn(:, :, :) )
         prrs(:, :, :, 4)  = 0.
-        prsvs(:, :, :, nsv_lima_ni) = 0.
       end where
       if ( hbudname /= 'NETUR' ) then
         do jr = 5, Size( prrs, 4 )
@@ -293,10 +303,13 @@ CLOUD: select case ( hcloud )
         end where
         deallocate( zcor )
       end if
+      if (nmom_i.ge.2) then
+         where (prrs(:, :, :, 4) == 0.)  prsvs(:, :, :, nsv_lima_ni) = 0.
+      end if
     end if
 
     prsvs(:, :, :, nsv_lima_beg : isv_lima_end) = Max( 0.0, prsvs(:, :, :, nsv_lima_beg : isv_lima_end) )
-
+    deallocate(zmask)
 end select CLOUD
 
 
-- 
GitLab