From 1173e76c32fd473554934e9820b76105a365f4a8 Mon Sep 17 00:00:00 2001
From: Quentin Rodier <quentin.rodier@meteo.fr>
Date: Mon, 2 Mar 2020 18:09:44 +0100
Subject: [PATCH] Benoit V. 02/03/2020: LIMA negativity checks in budgets for
 turbulence, advection and microphysics

---
 src/MNH/advection_metsv.f90 | 151 +++++++++++++++++++++++----
 src/MNH/ini_budget.f90      | 202 ++++++++++++++++++++++++++++++++----
 src/MNH/modd_budget.f90     |  16 +++
 src/MNH/modn_budget.f90     |  16 ++-
 src/MNH/resolved_cloud.f90  | 177 +++++++++++++++++++++++++++++--
 src/MNH/turb.f90            | 157 +++++++++++++++++++++++-----
 6 files changed, 638 insertions(+), 81 deletions(-)

diff --git a/src/MNH/advection_metsv.f90 b/src/MNH/advection_metsv.f90
index 3ec0b2a5c..0d76a09cf 100644
--- a/src/MNH/advection_metsv.f90
+++ b/src/MNH/advection_metsv.f90
@@ -136,6 +136,8 @@ END MODULE MODI_ADVECTION_METSV
 !!  Philippe Wautelet: 05/2016-04/2018: new data structures and calls for I/O
 !!                  07/2017  (V. Vionnet)  : add advection of 2D variables at
 !!                                      the surface for the blowing snow scheme
+!!                  03/2020 (B.Vie) : LIMA negativity checks after turbulence, advection and 
+!!                                    microphysics budgets 
 !-------------------------------------------------------------------------------
 !
 !*       0.    DECLARATIONS
@@ -153,6 +155,9 @@ USE MODD_BLOWSNOW
 USE MODD_BLOWSNOW_n
 USE MODD_PARAMETERS
 !
+USE MODD_NSV
+USE MODD_PARAM_LIMA
+!
 USE MODE_FIELD,     ONLY: TFIELDDATA, TYPEREAL
 USE MODE_FMWRIT
 USE MODE_IO_ll
@@ -253,7 +258,7 @@ REAL, DIMENSION(SIZE(PSVT,1),SIZE(PSVT,2),SIZE(PSVT,3),NBLOWSNOW_2D) :: ZRSNWCS_
 REAL, DIMENSION(SIZE(PUT,1),SIZE(PUT,2),SIZE(PUT,3)) :: ZRHOX1,ZRHOX2
 REAL, DIMENSION(SIZE(PUT,1),SIZE(PUT,2),SIZE(PUT,3)) :: ZRHOY1,ZRHOY2
 REAL, DIMENSION(SIZE(PUT,1),SIZE(PUT,2),SIZE(PUT,3)) :: ZRHOZ1,ZRHOZ2
-REAL, DIMENSION(SIZE(PUT,1),SIZE(PUT,2),SIZE(PUT,3)):: ZT,ZEXN,ZLV,ZLS,ZCPH
+REAL, DIMENSION(SIZE(PUT,1),SIZE(PUT,2),SIZE(PUT,3)):: ZT,ZEXN,ZLV,ZLS,ZCPH,ZCOR
 ! Temporary advected rhodj for PPM routines
 !
 INTEGER :: JS,JR,JSV,JSPL, JI, JJ  ! Loop index
@@ -685,34 +690,136 @@ DO JSV=1,KSV
   IF (LBUDGET_SV) CALL BUDGET (PRSVS(:,:,:,JSV),JSV+12,'ADV_BU_RSV')
 END DO
 !
-IF ((HCLOUD == 'KHKO') .OR. (HCLOUD == 'C2R2')) THEN
-  ZEXN(:,:,:)= (PPABST(:,:,:)/XP00)**(XRD/XCPD)
-  ZT(:,:,:)= PTHT(:,:,:)*ZEXN(:,:,:)
-  ZLV(:,:,:)=XLVTT +(XCPV-XCL) *(ZT(:,:,:)-XTT)
-  ZLS(:,:,:)=XLSTT +(XCPV-XCI) *(ZT(:,:,:)-XTT)
-  ZCPH(:,:,:)=XCPD +XCPV*PRT(:,:,:,1)
+SELECT CASE ( HCLOUD )
+  CASE('ICE3','ICE4')
+     ZEXN(:,:,:)= (PPABST(:,:,:)/XP00)**(XRD/XCPD)
+     ZT(:,:,:)= PTHT(:,:,:)*ZEXN(:,:,:)
+     ZLV(:,:,:)=XLVTT +(XCPV-XCL) *(ZT(:,:,:)-XTT)
+     ZLS(:,:,:)=XLSTT +(XCPV-XCI) *(ZT(:,:,:)-XTT)
+     ZCPH(:,:,:)=XCPD +XCPV*PRT(:,:,:,1)
+    WHERE (PRRS(:,:,:,4) < 0.)
+      PRRS(:,:,:,1) = PRRS(:,:,:,1) + PRRS(:,:,:,4)
+      PRTHS(:,:,:) = PRTHS(:,:,:) - PRRS(:,:,:,4) * ZLS(:,:,:) /  &
+           ZCPH(:,:,:) / ZEXN(:,:,:)
+      PRRS(:,:,:,4) = 0.
+    END WHERE
+!
+!   cloud
+    WHERE (PRRS(:,:,:,2) < 0.)
+      PRRS(:,:,:,1) = PRRS(:,:,:,1) + PRRS(:,:,:,2)
+      PRTHS(:,:,:) = PRTHS(:,:,:) - PRRS(:,:,:,2) * ZLV(:,:,:) /  &
+           ZCPH(:,:,:) / ZEXN(:,:,:)
+      PRRS(:,:,:,2) = 0.
+    END WHERE
+!
+! if rc or ri are positive, we can correct negative rv
+!   cloud
+    WHERE ((PRRS(:,:,:,1) <0.) .AND. (PRRS(:,:,:,2)> 0.) )
+      PRRS(:,:,:,1) = PRRS(:,:,:,1) + PRRS(:,:,:,2)
+      PRTHS(:,:,:) = PRTHS(:,:,:) - PRRS(:,:,:,2) * ZLV(:,:,:) /  &
+           ZCPH(:,:,:) / ZEXN(:,:,:)
+      PRRS(:,:,:,2) = 0.
+    END WHERE
+!   ice
+    IF(KRR > 3) THEN
+      WHERE ((PRRS(:,:,:,1) < 0.).AND.(PRRS(:,:,:,4) > 0.))
+        ZCOR(:,:,:)=MIN(-PRRS(:,:,:,1),PRRS(:,:,:,4))
+        PRRS(:,:,:,1) = PRRS(:,:,:,1) + ZCOR(:,:,:)
+        PRTHS(:,:,:) = PRTHS(:,:,:) - ZCOR(:,:,:) * ZLS(:,:,:) /  &
+             ZCPH(:,:,:) / ZEXN(:,:,:)
+        PRRS(:,:,:,4) = PRRS(:,:,:,4) -ZCOR(:,:,:)
+      END WHERE
+    END IF
+!
+  CASE('C2R2','KHKO')
+     ZEXN(:,:,:)= (PPABST(:,:,:)/XP00)**(XRD/XCPD)
+     ZT(:,:,:)= PTHT(:,:,:)*ZEXN(:,:,:)
+     ZLV(:,:,:)=XLVTT +(XCPV-XCL) *(ZT(:,:,:)-XTT)
+     ZLS(:,:,:)=XLSTT +(XCPV-XCI) *(ZT(:,:,:)-XTT)
+     ZCPH(:,:,:)=XCPD +XCPV*PRT(:,:,:,1)
 !  CALL GET_HALO(PRRS(:,:,:,2))
 !  CALL GET_HALO(PRSVS(:,:,:,2))
 !  CALL GET_HALO(PRSVS(:,:,:,3))
-  WHERE (PRRS(:,:,:,2) < 0. .OR. PRSVS(:,:,:,2) < 0.)
-      PRSVS(:,:,:,1) = 0.0
-  END WHERE
-  DO JSV = 2, 3
-    WHERE (PRRS(:,:,:,JSV) < 0. .OR. PRSVS(:,:,:,JSV) < 0.)
-      PRRS(:,:,:,1) = PRRS(:,:,:,1) + PRRS(:,:,:,JSV)
-      PRTHS(:,:,:) = PRTHS(:,:,:) - PRRS(:,:,:,JSV) * ZLV(:,:,:) /  &
-             ZCPH(:,:,:) / ZEXN(:,:,:)
-      PRRS(:,:,:,JSV)  = 0.0
-      PRSVS(:,:,:,JSV) = 0.0
-    END WHERE
-  END DO
-!
+     WHERE (PRRS(:,:,:,2) < 0. .OR. PRSVS(:,:,:,2) < 0.)
+        PRSVS(:,:,:,1) = 0.0
+     END WHERE
+     DO JSV = 2, 3
+        WHERE (PRRS(:,:,:,JSV) < 0. .OR. PRSVS(:,:,:,JSV) < 0.)
+           PRRS(:,:,:,1) = PRRS(:,:,:,1) + PRRS(:,:,:,JSV)
+           PRTHS(:,:,:) = PRTHS(:,:,:) - PRRS(:,:,:,JSV) * ZLV(:,:,:) /  &
+                ZCPH(:,:,:) / ZEXN(:,:,:)
+           PRRS(:,:,:,JSV)  = 0.0
+           PRSVS(:,:,:,JSV) = 0.0
+        END WHERE
+     END DO
+     !
+   CASE('LIMA')   
+     ZEXN(:,:,:)= (PPABST(:,:,:)/XP00)**(XRD/XCPD)
+     ZT(:,:,:)= PTHT(:,:,:)*ZEXN(:,:,:)
+     ZLV(:,:,:)=XLVTT +(XCPV-XCL) *(ZT(:,:,:)-XTT)
+     ZLS(:,:,:)=XLSTT +(XCPV-XCI) *(ZT(:,:,:)-XTT)
+     ZCPH(:,:,:)=XCPD +XCPV*PRT(:,:,:,1)
+! Correction where rc<0 or Nc<0
+      IF (LWARM) THEN
+         WHERE (PRRS(:,:,:,2) < XRTMIN(2)/PTSTEP .OR. PRSVS(:,:,:,NSV_LIMA_NC) < XCTMIN(2)/PTSTEP)
+            PRRS(:,:,:,1) = PRRS(:,:,:,1) + PRRS(:,:,:,2)
+            PRTHS(:,:,:) = PRTHS(:,:,:) - PRRS(:,:,:,2) * ZLV(:,:,:) /  &
+                 ZCPH(:,:,:) / ZEXN(:,:,:)
+            PRRS(:,:,:,2)  = 0.0
+            PRSVS(:,:,:,NSV_LIMA_NC) = 0.0
+         END WHERE
+      END IF
+! Correction where rr<0 or Nr<0
+      IF (LWARM .AND. LRAIN) THEN
+         WHERE (PRRS(:,:,:,3) < XRTMIN(3)/PTSTEP .OR. PRSVS(:,:,:,NSV_LIMA_NR) < XCTMIN(3)/PTSTEP)
+            PRRS(:,:,:,1) = PRRS(:,:,:,1) + PRRS(:,:,:,3)
+            PRTHS(:,:,:) = PRTHS(:,:,:) - PRRS(:,:,:,3) * ZLV(:,:,:) /  &
+                 ZCPH(:,:,:) / ZEXN(:,:,:)
+            PRRS(:,:,:,3)  = 0.0
+            PRSVS(:,:,:,NSV_LIMA_NR) = 0.0
+         END WHERE
+      END IF
+! Correction where ri<0 or Ni<0
+      IF (LCOLD) THEN
+         WHERE (PRRS(:,:,:,4) < XRTMIN(4)/PTSTEP .OR. PRSVS(:,:,:,NSV_LIMA_NI) < XCTMIN(4)/PTSTEP)
+            PRRS(:,:,:,1) = PRRS(:,:,:,1) + PRRS(:,:,:,4)
+            PRTHS(:,:,:) = PRTHS(:,:,:) - PRRS(:,:,:,4) * ZLS(:,:,:) /  &
+                 ZCPH(:,:,:) / ZEXN(:,:,:)
+            PRRS(:,:,:,4)  = 0.0
+            PRSVS(:,:,:,NSV_LIMA_NI) = 0.0
+         END WHERE
+      END IF
+!
+      PRSVS(:,:,:,:) = MAX( 0.0,PRSVS(:,:,:,:) )
+      PRRS(:,:,:,:) = MAX( 0.0,PRRS(:,:,:,:) )
+!
+END SELECT
+!
+IF ((HCLOUD == 'ICE3') .OR. (HCLOUD == 'ICE4') .OR. (HCLOUD == 'KHKO') .OR. (HCLOUD /= 'C2R2') .OR. (HCLOUD /= 'LIMA') ) THEN
   IF (LBUDGET_TH) CALL BUDGET (PRTHS(:,:,:) , 4,'NEADV_BU_RTH')
   IF (LBUDGET_RV) CALL BUDGET (PRRS(:,:,:,1), 6,'NEADV_BU_RRV')
   IF (LBUDGET_RC) CALL BUDGET (PRRS(:,:,:,2), 7,'NEADV_BU_RRC')
-
+  IF (LBUDGET_RR) CALL BUDGET (PRRS(:,:,:,3), 8,'NEADV_BU_RRR')
+  IF (LBUDGET_RI) CALL BUDGET (PRRS(:,:,:,4), 9,'NEADV_BU_RRI')
+  IF (LBUDGET_RS) CALL BUDGET (PRRS(:,:,:,5),10,'NEADV_BU_RRS')
+  IF (LBUDGET_RG) CALL BUDGET (PRRS(:,:,:,6),11,'NEADV_BU_RRG')
+  IF (LBUDGET_RH) CALL BUDGET (PRRS(:,:,:,7),12,'NEADV_BU_RRH')
+END IF
+IF (LBUDGET_SV .AND. (HCLOUD == 'LIMA')) THEN
+   IF (LWARM) CALL BUDGET (PRSVS(:,:,:,NSV_LIMA_NC),12+NSV_LIMA_NC,'NEADV_BU_RSV')
+   IF (LWARM.AND.LRAIN) CALL BUDGET (PRSVS(:,:,:,NSV_LIMA_NR),12+NSV_LIMA_NR,'NEADV_BU_RSV')
+   IF (LCOLD) CALL BUDGET (PRSVS(:,:,:,NSV_LIMA_NI),12+NSV_LIMA_NI,'NEADV_BU_RSV')
+   IF (NMOD_CCN.GE.1) THEN
+      DO JI=1, NMOD_CCN
+         CALL BUDGET ( PRSVS(:,:,:,NSV_LIMA_CCN_FREE+JI-1),12+NSV_LIMA_CCN_FREE+JI-1,'NEADV_BU_RSV') 
+      END DO
+   END IF
+   IF (NMOD_IFN.GE.1) THEN
+      DO JI=1, NMOD_IFN
+         CALL BUDGET ( PRSVS(:,:,:,NSV_LIMA_IFN_FREE+JI-1),12+NSV_LIMA_IFN_FREE+JI-1,'NEADV_BU_RSV') 
+      END DO
+   END IF
 END IF
-
 
 !-------------------------------------------------------------------------------
 !
diff --git a/src/MNH/ini_budget.f90 b/src/MNH/ini_budget.f90
index 5282ebc82..baaa59fb6 100644
--- a/src/MNH/ini_budget.f90
+++ b/src/MNH/ini_budget.f90
@@ -156,6 +156,7 @@ END MODULE MODI_INI_BUDGET
 !  P. Wautelet 24/02/2020: bugfix: corrected condition for budget NCDEPITH
 !  P. Wautelet 26/02/2020: bugfix: rename CEVA->REVA for budget for raindrop evaporation in C2R2 (necessary after commit 4ed805fc)
 !  P. Wautelet 26/02/2020: bugfix: add missing condition on OCOLD for NSEDIRH budget in LIMA case
+!  B. Vie      02/03/2020 : LIMA negativity checks after turbulence, advection and microphysics budgets 
 !-------------------------------------------------------------------------------
 !
 !*       0.    DECLARATIONS
@@ -779,14 +780,16 @@ IF (LBU_RTH) THEN
   IPROC=IPROC+1
   IF (HTURB /= 'NONE')     IPROACTV(4,IPROC) = NDISSHTH
   IPROC=IPROC+1
-  IF (HTURB /= 'NONE' .AND. ( (HCLOUD == 'KHKO') .OR.  (HCLOUD == 'C2R2'))) &
+  IF (HTURB /= 'NONE' .AND. ( (HCLOUD == 'KHKO') .OR. (HCLOUD == 'C2R2') &
+       .OR. (HCLOUD == 'ICE3') .OR. (HCLOUD == 'ICE4') .OR. (HCLOUD == 'LIMA') )) &
           IPROACTV(4,IPROC) = NNETURTH
   IPROC=IPROC+1
   IF ( HSCONV == 'EDKF' ) IPROACTV(4,IPROC) = NMAFLTH
   IPROC=IPROC+1
   IPROACTV(4,IPROC) = NADVTH
   IPROC=IPROC+1
-  IF ((HCLOUD == 'KHKO')  .OR.  (HCLOUD == 'C2R2'))  IPROACTV(4,IPROC) = NNEADVTH
+  IF ((HCLOUD == 'KHKO')  .OR.  (HCLOUD == 'C2R2')&
+       .OR. (HCLOUD == 'ICE3') .OR. (HCLOUD == 'ICE4') .OR. (HCLOUD == 'LIMA'))  IPROACTV(4,IPROC) = NNEADVTH
   IPROC=IPROC+1
   IF (HCLOUD /= 'NONE' .AND. HCLOUD /= 'KHKO' .AND. HCLOUD /= 'C2R2') &
           IPROACTV(4,IPROC) = NNEGATH
@@ -889,9 +892,10 @@ IF (LBU_RTH) THEN
       IF (HCLOUD == 'C2R2' .OR. HCLOUD == 'KHKO' .OR. HCLOUD(1:3) == 'KES' .OR.   &
       HCLOUD == 'REVE')   IPROACTV(4,IPROC) = NCONDTH                     
       IPROC=IPROC+1
-      IF ((HCLOUD == 'KHKO')  .OR.  (HCLOUD == 'C2R2'))&
+   END IF
+      IF ((HCLOUD == 'KHKO')  .OR.  (HCLOUD == 'C2R2').OR.  (HCLOUD == 'KESS')&
+       .OR. (HCLOUD == 'ICE3') .OR. (HCLOUD == 'ICE4') .OR. (HCLOUD == 'LIMA'))&
           IPROACTV(4,IPROC) = NNECONTH
-    END IF
 !
   YWORK2(4,1) = 'INIF_'
   YWORK2(4,2) = 'ENDF_'
@@ -1028,8 +1032,9 @@ IF (LBU_RTH) THEN
      IPROC=IPROC+1
      YWORK2(4,IPROC) = 'COND_'
      IPROC=IPROC+1
-     YWORK2(4,IPROC) = 'NECON_'
   END IF
+  YWORK2(4,IPROC) = 'NECON_'
+  IPROC=IPROC+1
 !
   YEND_COMMENT(4) = 'BU_RTH'
   NBUPROCNBR(4) = 3
@@ -1159,14 +1164,16 @@ IF (LBU_RRV) THEN
     END IF
   END IF 
   IPROC=IPROC+1 
-  IF (HTURB /= 'NONE' .AND. ( (HCLOUD == 'KHKO') .OR.  (HCLOUD == 'C2R2'))) &
+  IF (HTURB /= 'NONE' .AND. ( (HCLOUD == 'KHKO') .OR.  (HCLOUD == 'C2R2')&
+       .OR. (HCLOUD == 'ICE3') .OR. (HCLOUD == 'ICE4') .OR. (HCLOUD == 'LIMA'))) &
    IPROACTV(6,IPROC) = NNETURRV
   IPROC=IPROC+1 
   IF ( HSCONV == 'EDKF' ) IPROACTV(6,IPROC) = NMAFLRV
   IPROC=IPROC+1 
   IPROACTV(6,IPROC) = NADVRV
   IPROC=IPROC+1   
-  IF ((HCLOUD == 'KHKO')  .OR.  (HCLOUD == 'C2R2'))  IPROACTV(6,IPROC) = NNEADVRV
+  IF ((HCLOUD == 'KHKO')  .OR.  (HCLOUD == 'C2R2')&
+       .OR. (HCLOUD == 'ICE3') .OR. (HCLOUD == 'ICE4') .OR. (HCLOUD == 'LIMA'))  IPROACTV(6,IPROC) = NNEADVRV
   IPROC=IPROC+1 
   IF (HCLOUD /= 'NONE' .AND. HCLOUD /= 'KHKO' .AND. HCLOUD /= 'C2R2') &
      IPROACTV(6,IPROC) = NNEGARV
@@ -1218,10 +1225,11 @@ IF (LBU_RRV) THEN
   IF (HCLOUD(1:3) == 'ICE' .AND. (.NOT. LRED .OR. (LRED .AND. LADJ_AFTER) )) &
           IPROACTV(6,IPROC) = NCDEPIRV 
   IPROC=IPROC+1
-  IF ( (HCLOUD == 'KHKO' )  .OR.  (HCLOUD == 'C2R2')) &
+END IF
+  IF ( (HCLOUD == 'KHKO' )  .OR.  (HCLOUD == 'C2R2') .OR.  (HCLOUD == 'KESS')&
+       .OR. (HCLOUD == 'ICE3') .OR. (HCLOUD == 'ICE4') .OR. (HCLOUD == 'LIMA')) &
           IPROACTV(6,IPROC) = NNECONRV
   IPROC=IPROC+1   
-END IF
 
 !
   YWORK2(6,1) = 'INIF_'
@@ -1296,9 +1304,9 @@ ELSE
   YWORK2(6,IPROC) = 'CORR_'
   IPROC=IPROC+1
   YWORK2(6,IPROC) = 'CDEPI_'
+END IF
   IPROC=IPROC+1
   YWORK2(6,IPROC) = 'NECON_'
-END IF
 !
   YEND_COMMENT(6) = 'BU_RRV'
   NBUPROCNBR(6) = 3
@@ -1353,12 +1361,14 @@ IF (LBU_RRC) THEN
     END IF
   END IF 
   IPROC=IPROC+1
-  IF (HTURB /= 'NONE' .AND. ( (HCLOUD == 'KHKO') .OR.  (HCLOUD == 'C2R2'))) &
+  IF (HTURB /= 'NONE' .AND. ( (HCLOUD == 'KHKO') .OR.  (HCLOUD == 'C2R2')&
+       .OR. (HCLOUD == 'ICE3') .OR. (HCLOUD == 'ICE4') .OR. (HCLOUD == 'LIMA'))) &
       IPROACTV(7,IPROC) = NNETURRC
   IPROC=IPROC+1
   IPROACTV(7,IPROC) = NADVRC
   IPROC=IPROC+1
-  IF ((HCLOUD == 'KHKO')  .OR.  (HCLOUD == 'C2R2'))  &
+  IF ((HCLOUD == 'KHKO')  .OR.  (HCLOUD == 'C2R2')&
+       .OR. (HCLOUD == 'ICE3') .OR. (HCLOUD == 'ICE4') .OR. (HCLOUD == 'LIMA'))  &
       IPROACTV(7,IPROC) = NNEADVRC
   IPROC=IPROC+1
   IF (HCLOUD /= 'NONE' .AND. HCLOUD /= 'KHKO' .AND. HCLOUD /= 'C2R2') &
@@ -1465,10 +1475,11 @@ IF (LBU_RRC) THEN
   IF (HCLOUD == 'C2R2'.OR. HCLOUD == 'KHKO' .OR. &
       HCLOUD(1:3) == 'KES'.OR. HCLOUD == 'REVE') IPROACTV(7,IPROC) = NCONDRC
   IPROC=IPROC+1
-  IF ( (HCLOUD == 'KHKO' )  .OR.  (HCLOUD == 'C2R2')) &
+END IF
+  IF ( (HCLOUD == 'KHKO' )  .OR.  (HCLOUD == 'C2R2') .OR.  (HCLOUD == 'KESS')&
+       .OR. (HCLOUD == 'ICE3') .OR. (HCLOUD == 'ICE4') .OR. (HCLOUD == 'LIMA')) &
      IPROACTV(7,IPROC) = NNECONRC
   IPROC=IPROC+1
-  END IF
 
 !
   YWORK2(7,1) = 'INIF_'
@@ -1586,9 +1597,9 @@ IF (LBU_RRC) THEN
      YWORK2(7,IPROC) = 'CDEPI_'
      IPROC=IPROC+1
      YWORK2(7,IPROC) = 'COND_'
-     IPROC=IPROC+1
-     YWORK2(7,IPROC) = 'NECON_'
   END IF
+  IPROC=IPROC+1
+  YWORK2(7,IPROC) = 'NECON_'
 !
   YEND_COMMENT(7) = 'BU_RRC'
   NBUPROCNBR(7) = 3
@@ -1627,8 +1638,14 @@ IF (LBU_RRR) THEN
     END IF
   END IF
   IPROC=IPROC+1
+  IF ((HCLOUD == 'KHKO')  .OR.  (HCLOUD == 'C2R2')&
+       .OR. (HCLOUD == 'ICE3') .OR. (HCLOUD == 'ICE4') .OR. (HCLOUD == 'LIMA'))  IPROACTV(8,IPROC) = NNETURRR
+  IPROC=IPROC+1
   IPROACTV(8,IPROC) = NADVRR
   IPROC=IPROC+1
+  IF ((HCLOUD == 'KHKO')  .OR.  (HCLOUD == 'C2R2')&
+       .OR. (HCLOUD == 'ICE3') .OR. (HCLOUD == 'ICE4') .OR. (HCLOUD == 'LIMA'))  IPROACTV(8,IPROC) = NNEADVRR
+  IPROC=IPROC+1
   IF ( HCLOUD /= 'NONE' ) IPROACTV(8,IPROC) = NNEGARR
   IPROC=IPROC+1
 
@@ -1662,6 +1679,7 @@ IF (LBU_RRR) THEN
      IF (.NOT.OPTSPLIT .AND. OHAIL)                     IPROACTV(8,IPROC) = NWETHRR 
      IPROC=IPROC+1
      IF (.NOT.OPTSPLIT .AND. OHAIL)                     IPROACTV(8,IPROC) = NHMLTRR 
+     IPROC=IPROC+1
   ELSE
      IF (HCLOUD(1:3) == 'KES' )   IPROACTV(8,IPROC) = NSEDIRR 
      IPROC=IPROC+1
@@ -1718,6 +1736,9 @@ IF (LBU_RRR) THEN
        IPROACTV(8,IPROC) = NSEDIRR
      IPROC=IPROC+1
   END IF
+      IF ((HCLOUD == 'KHKO')  .OR.  (HCLOUD == 'C2R2')&
+       .OR. (HCLOUD == 'ICE3') .OR. (HCLOUD == 'ICE4') .OR. (HCLOUD == 'LIMA'))&
+          IPROACTV(8,IPROC) = NNECONRR
 !
   YWORK2(8,1) = 'INIF_'
   YWORK2(8,2) = 'ENDF_'
@@ -1733,8 +1754,12 @@ IF (LBU_RRR) THEN
   IPROC=IPROC+1
   YWORK2(8,IPROC) = 'REL_'
   IPROC=IPROC+1
+  YWORK2(8,IPROC) = 'NETUR_'
+  IPROC=IPROC+1
   YWORK2(8,IPROC) = 'ADV_'
   IPROC=IPROC+1
+  YWORK2(8,IPROC) = 'NEADV_'
+  IPROC=IPROC+1
   YWORK2(8,IPROC) = 'NEGA_'
   IPROC=IPROC+1
 
@@ -1768,7 +1793,6 @@ IF (HCLOUD == 'LIMA') THEN
   YWORK2(8,IPROC) = 'WETH_'
   IPROC=IPROC+1
   YWORK2(8,IPROC) = 'HMLT_'
-  IPROC=IPROC+1
 ELSE
   YWORK2(8,IPROC) = 'SEDI_'
   IPROC=IPROC+1
@@ -1816,6 +1840,8 @@ ELSE
   IPROC=IPROC+1
   YWORK2(8,IPROC) = 'SEDI_'
 END IF
+  IPROC=IPROC+1
+  YWORK2(8,IPROC) = 'NECON_'
 !
   YEND_COMMENT(8) = 'BU_RRR'
   NBUPROCNBR(8) = 3
@@ -1868,8 +1894,15 @@ IF (LBU_RRI) THEN
     END IF
   END IF 
   IPROC=IPROC+1
+  IF (HTURB /= 'NONE' .AND. ( (HCLOUD == 'KHKO') .OR. (HCLOUD == 'C2R2') &
+       .OR. (HCLOUD == 'ICE3') .OR. (HCLOUD == 'ICE4') .OR. (HCLOUD == 'LIMA') )) &
+          IPROACTV(9,IPROC) = NNETURRI
+  IPROC=IPROC+1
   IPROACTV(9,IPROC) = NADVRI
   IPROC=IPROC+1
+  IF ((HCLOUD == 'KHKO')  .OR.  (HCLOUD == 'C2R2')&
+       .OR. (HCLOUD == 'ICE3') .OR. (HCLOUD == 'ICE4') .OR. (HCLOUD == 'LIMA'))  IPROACTV(9,IPROC) = NNEADVRI
+  IPROC=IPROC+1
   IF( HCLOUD /= 'NONE' ) IPROACTV(9,IPROC) = NNEGARI
   IPROC=IPROC+1
 
@@ -1908,7 +1941,8 @@ IF (LBU_RRI) THEN
      IPROC=IPROC+1
      IF (.NOT.OPTSPLIT .AND. OHAIL) IPROACTV(9,IPROC) = NWETHRI
      IPROC=IPROC+1
-                                       IPROACTV(9,IPROC) = NCEDSRI
+     IPROACTV(9,IPROC) = NCEDSRI
+     IPROC=IPROC+1
   ELSE
      IF (HCLOUD(1:3) == 'ICE' .AND. LRED .AND. LADJ_BEFORE) IPROACTV(9,IPROC) = NADJURI
      IPROC=IPROC+1
@@ -1947,6 +1981,9 @@ IF (LBU_RRI) THEN
              IPROACTV(9,IPROC) = NCDEPIRI
      IPROC=IPROC+1
   END IF
+      IF ((HCLOUD == 'KHKO')  .OR.  (HCLOUD == 'C2R2')&
+       .OR. (HCLOUD == 'ICE3') .OR. (HCLOUD == 'ICE4') .OR. (HCLOUD == 'LIMA'))&
+          IPROACTV(9,IPROC) = NNECONRI
 !
   YWORK2(9,1) = 'INIF_'
   YWORK2(9,2) = 'ENDF_'
@@ -1968,8 +2005,12 @@ IF (LBU_RRI) THEN
   IPROC=IPROC+1
   YWORK2(9,IPROC) = 'HTURB_'
   IPROC=  IPROC+1
+  YWORK2(9,IPROC) = 'NETUR_'
+  IPROC=  IPROC+1
   YWORK2(9,IPROC) = 'ADV_'
   IPROC=IPROC+1
+  YWORK2(9,IPROC) = 'NEADV_'
+  IPROC=  IPROC+1
   YWORK2(9,IPROC) = 'NEGA_'
   IPROC=  IPROC+1
   IF (HCLOUD=='LIMA') THEN
@@ -2041,6 +2082,8 @@ IF (LBU_RRI) THEN
      IPROC=  IPROC+1
      YWORK2(9,IPROC) = 'CDEPI_'
   END IF
+  IPROC=IPROC+1
+  YWORK2(9,IPROC) = 'NECON_'
 !
   YEND_COMMENT(9) = 'BU_RRI'
   NBUPROCNBR(9) = 3
@@ -2078,8 +2121,15 @@ IF (LBU_RRS) THEN
       IPROACTV(10,IPROC) = 3
     END IF
   END IF
+  IPROC=IPROC+1
+  IF (HTURB /= 'NONE' .AND. ( (HCLOUD == 'KHKO') .OR. (HCLOUD == 'C2R2') &
+       .OR. (HCLOUD == 'ICE3') .OR. (HCLOUD == 'ICE4') .OR. (HCLOUD == 'LIMA') )) &
+          IPROACTV(10,IPROC) = NNETURRS
   IPROC=  IPROC+1
   IPROACTV(10,IPROC) = NADVRS
+  IPROC=IPROC+1
+  IF ((HCLOUD == 'KHKO')  .OR.  (HCLOUD == 'C2R2')&
+       .OR. (HCLOUD == 'ICE3') .OR. (HCLOUD == 'ICE4') .OR. (HCLOUD == 'LIMA'))  IPROACTV(10,IPROC) = NNEADVRS
   IPROC=  IPROC+1
   IF( HCLOUD /= 'NONE' ) IPROACTV(10,IPROC) = NNEGARS
   IPROC=IPROC+1
@@ -2142,6 +2192,9 @@ IF (HCLOUD=='LIMA') THEN
           IPROACTV(10,IPROC) = NSEDIRS
   IPROC=IPROC+1
 END IF
+      IF ((HCLOUD == 'KHKO')  .OR.  (HCLOUD == 'C2R2')&
+       .OR. (HCLOUD == 'ICE3') .OR. (HCLOUD == 'ICE4') .OR. (HCLOUD == 'LIMA'))&
+          IPROACTV(10,IPROC) = NNECONRS
 !
   YWORK2(10,1) = 'INIF_'
   YWORK2(10,2) = 'ENDF_'
@@ -2156,9 +2209,13 @@ END IF
   YWORK2(10,IPROC) = 'DIF_'
   IPROC=  IPROC+1
   YWORK2(10,IPROC) = 'REL_'
+  IPROC=IPROC+1
+  YWORK2(10,IPROC) = 'NETUR_'
   IPROC=  IPROC+1
   YWORK2(10,IPROC) = 'ADV_'
   IPROC=IPROC+1
+  YWORK2(10,IPROC) = 'NEADV_'
+  IPROC=IPROC+1
   YWORK2(10,IPROC) = 'NEGA_'
   IPROC=  IPROC+1
 IF (HCLOUD=='LIMA') THEN
@@ -2187,7 +2244,6 @@ IF (HCLOUD=='LIMA') THEN
   YWORK2(10,IPROC) = 'DRYG_'
   IPROC=  IPROC+1
   YWORK2(10,IPROC) = 'WETH_'
-  IPROC=  IPROC+1
 ELSE
   YWORK2(10,IPROC) = 'SEDI_'
   IPROC=  IPROC+1
@@ -2215,6 +2271,8 @@ ELSE
   IPROC=IPROC+1
   YWORK2(10,IPROC) = 'SEDI_'
 END IF
+  IPROC=IPROC+1
+  YWORK2(10,IPROC) = 'NECON_'
 !
   YEND_COMMENT(10) = 'BU_RRS'
   NBUPROCNBR(10) = 3
@@ -2253,8 +2311,15 @@ IF (LBU_RRG) THEN
     END IF
   END IF
   IPROC=IPROC+1
+  IF (HTURB /= 'NONE' .AND. ( (HCLOUD == 'KHKO') .OR. (HCLOUD == 'C2R2') &
+       .OR. (HCLOUD == 'ICE3') .OR. (HCLOUD == 'ICE4') .OR. (HCLOUD == 'LIMA') )) &
+          IPROACTV(11,IPROC) = NNETURRG
+  IPROC=IPROC+1
   IPROACTV(11,IPROC) = NADVRG
   IPROC=IPROC+1
+  IF ((HCLOUD == 'KHKO')  .OR.  (HCLOUD == 'C2R2')&
+       .OR. (HCLOUD == 'ICE3') .OR. (HCLOUD == 'ICE4') .OR. (HCLOUD == 'LIMA'))  IPROACTV(11,IPROC) = NNEADVRG
+  IPROC=IPROC+1
   IF( HCLOUD /= 'NONE'  ) IPROACTV(11,IPROC) = NNEGARG
   IPROC=IPROC+1
 IF (HCLOUD=='LIMA') THEN
@@ -2321,6 +2386,9 @@ ELSE
           IPROACTV(11,IPROC) = NSEDIRG
   IPROC=IPROC+1
 END IF
+      IF ((HCLOUD == 'KHKO')  .OR.  (HCLOUD == 'C2R2')&
+       .OR. (HCLOUD == 'ICE3') .OR. (HCLOUD == 'ICE4') .OR. (HCLOUD == 'LIMA'))&
+          IPROACTV(11,IPROC) = NNECONRG
 !
   YWORK2(11,1) = 'INIF_'
   YWORK2(11,2) = 'ENDF_'
@@ -2336,8 +2404,12 @@ END IF
   IPROC=IPROC+1
   YWORK2(11,IPROC) = 'REL_'
   IPROC=IPROC+1
+  YWORK2(11,IPROC) = 'NETUR_'
+  IPROC=IPROC+1
   YWORK2(11,IPROC) = 'ADV_'
   IPROC=IPROC+1
+  YWORK2(11,IPROC) = 'NEADV_'
+  IPROC=IPROC+1
   YWORK2(11,IPROC) = 'NEGA_'
   IPROC=IPROC+1
 IF (HCLOUD=='LIMA') THEN
@@ -2399,6 +2471,8 @@ ELSE
   IPROC=IPROC+1
   YWORK2(11,IPROC)= 'SEDI_'
 END IF
+  IPROC=IPROC+1
+  YWORK2(11,IPROC) = 'NECON_'
 !
   YEND_COMMENT(11) = 'BU_RRG'
   NBUPROCNBR(11) = 3
@@ -2449,8 +2523,15 @@ IF (LBU_RRH) THEN
     END IF
   END IF
   IPROC=IPROC+1
+  IF (HTURB /= 'NONE' .AND. ( (HCLOUD == 'KHKO') .OR. (HCLOUD == 'C2R2') &
+       .OR. (HCLOUD == 'ICE3') .OR. (HCLOUD == 'ICE4') .OR. (HCLOUD == 'LIMA') )) &
+          IPROACTV(12,IPROC) = NNETURRH
+  IPROC=IPROC+1
   IPROACTV(12,IPROC) = NADVRH
   IPROC=IPROC+1
+  IF ((HCLOUD == 'KHKO')  .OR.  (HCLOUD == 'C2R2')&
+       .OR. (HCLOUD == 'ICE3') .OR. (HCLOUD == 'ICE4') .OR. (HCLOUD == 'LIMA'))  IPROACTV(12,IPROC) = NNEADVRH
+  IPROC=IPROC+1
   IF( HCLOUD /= 'NONE' ) THEN
     IPROACTV(12,IPROC) = NNEGARH 
   ELSE
@@ -2490,6 +2571,9 @@ IF (LBU_RRH) THEN
      (HCLOUD(1:3) == 'ICE' .AND. LRED .AND. LSEDIM_AFTER)) &
           IPROACTV(12,IPROC) = NSEDIRH
   END IF
+      IF ((HCLOUD == 'KHKO')  .OR.  (HCLOUD == 'C2R2')&
+       .OR. (HCLOUD == 'ICE3') .OR. (HCLOUD == 'ICE4') .OR. (HCLOUD == 'LIMA'))&
+          IPROACTV(12,IPROC) = NNECONRH
 !
   YWORK2(12,1) = 'INIF_'
   YWORK2(12,2) = 'ENDF_'
@@ -2505,8 +2589,12 @@ IF (LBU_RRH) THEN
   IPROC=IPROC+1
   YWORK2(12,IPROC) = 'REL_'
   IPROC=IPROC+1
+  YWORK2(12,IPROC) = 'NETUR_'
+  IPROC=IPROC+1
   YWORK2(12,IPROC) = 'ADV_'
   IPROC=IPROC+1
+  YWORK2(12,IPROC) = 'NEADV_'
+  IPROC=IPROC+1
   YWORK2(12,IPROC) = 'NEGA_'
   IPROC=IPROC+1
   IF (HCLOUD=='LIMA' .AND. OHAIL) THEN
@@ -2539,6 +2627,8 @@ IF (LBU_RRH) THEN
      IPROC=IPROC+1
      YWORK2(12,IPROC) = 'SEDI_'
   END IF
+  IPROC=IPROC+1
+  YWORK2(12,IPROC) = 'NECON_'
 !
   YEND_COMMENT(12) = 'BU_RRH'
   NBUPROCNBR(12) = 3
@@ -2600,7 +2690,7 @@ IF (LBU_RSV) THEN
     IPROC=IPROC+1
     IF ( HSCONV == 'EDKF' ) IPROACTV(12+JSV,IPROC)= NMAFLSV
     IPROC=IPROC+1
-    IPROACTV(12+JSV,IPROC)= NADVSV
+    IF ( HCLOUD /= 'LIMA' ) IPROACTV(12+JSV,IPROC)= NADVSV
     IPROC=IPROC+1
 !
     YWORK2(12+JSV,1) = 'INIF_'
@@ -2975,6 +3065,15 @@ ELSEIF (JSV >= NSV_LIMA_BEG .AND. JSV <= NSV_LIMA_END) THEN
    IF (JSV == NSV_LIMA_NC) THEN
       ! Cloud droplets conc.
       ILAST_PROC_NBR = ILAST_PROC_NBR + 1
+      YWORK2(12+JSV,ILAST_PROC_NBR)= 'NETUR_'
+      IPROACTV(12+JSV,ILAST_PROC_NBR) = 1
+      ILAST_PROC_NBR = ILAST_PROC_NBR + 1
+      YWORK2(12+JSV,ILAST_PROC_NBR)= 'ADV_'
+      IPROACTV(12+JSV,ILAST_PROC_NBR) = 1
+      ILAST_PROC_NBR = ILAST_PROC_NBR + 1
+      YWORK2(12+JSV,ILAST_PROC_NBR)= 'NEADV_'
+      IPROACTV(12+JSV,ILAST_PROC_NBR) = 1
+      ILAST_PROC_NBR = ILAST_PROC_NBR + 1
       YWORK2(12+JSV,ILAST_PROC_NBR)= 'NEGA_'
       IPROACTV(12+JSV,ILAST_PROC_NBR) = 1
       IF (OPTSPLIT .AND. OWARM .AND. ORAIN) THEN
@@ -3070,10 +3169,22 @@ ELSEIF (JSV >= NSV_LIMA_BEG .AND. JSV <= NSV_LIMA_END) THEN
       ILAST_PROC_NBR = ILAST_PROC_NBR + 1
       YWORK2(12+JSV,ILAST_PROC_NBR)= 'CEDS_'
       IPROACTV(12+JSV,ILAST_PROC_NBR) = 1
+      ILAST_PROC_NBR = ILAST_PROC_NBR + 1
+      YWORK2(12+JSV,ILAST_PROC_NBR)= 'NECON_'
+      IPROACTV(12+JSV,ILAST_PROC_NBR) = 1
       !
    ELSE IF (JSV == NSV_LIMA_NR) THEN
       ! Rain drops conc.
       ILAST_PROC_NBR = ILAST_PROC_NBR + 1
+      YWORK2(12+JSV,ILAST_PROC_NBR)= 'NETUR_'
+      IPROACTV(12+JSV,ILAST_PROC_NBR) = 1
+      ILAST_PROC_NBR = ILAST_PROC_NBR + 1
+      YWORK2(12+JSV,ILAST_PROC_NBR)= 'ADV_'
+      IPROACTV(12+JSV,ILAST_PROC_NBR) = 1
+      ILAST_PROC_NBR = ILAST_PROC_NBR + 1
+      YWORK2(12+JSV,ILAST_PROC_NBR)= 'NEADV_'
+      IPROACTV(12+JSV,ILAST_PROC_NBR) = 1
+      ILAST_PROC_NBR = ILAST_PROC_NBR + 1
       YWORK2(12+JSV,ILAST_PROC_NBR)= 'NEGA_'
       IPROACTV(12+JSV,ILAST_PROC_NBR) = 1
       IF (OPTSPLIT .AND. OWARM .AND. ORAIN) THEN
@@ -3156,10 +3267,22 @@ ELSEIF (JSV >= NSV_LIMA_BEG .AND. JSV <= NSV_LIMA_END) THEN
          YWORK2(12+JSV,ILAST_PROC_NBR)= 'HMLT_'
          IPROACTV(12+JSV,ILAST_PROC_NBR) = 1
       END IF
+      ILAST_PROC_NBR = ILAST_PROC_NBR + 1
+      YWORK2(12+JSV,ILAST_PROC_NBR)= 'NECON_'
+      IPROACTV(12+JSV,ILAST_PROC_NBR) = 1
       !
    ELSE IF (JSV.GE.NSV_LIMA_CCN_FREE .AND. JSV.LT.(NSV_LIMA_CCN_FREE+NMOD_CCN)) THEN
       ! Free CCN conc.
       ILAST_PROC_NBR = ILAST_PROC_NBR + 1
+      YWORK2(12+JSV,ILAST_PROC_NBR)= 'NETUR_'
+      IPROACTV(12+JSV,ILAST_PROC_NBR) = 1
+      ILAST_PROC_NBR = ILAST_PROC_NBR + 1
+      YWORK2(12+JSV,ILAST_PROC_NBR)= 'ADV_'
+      IPROACTV(12+JSV,ILAST_PROC_NBR) = 1
+      ILAST_PROC_NBR = ILAST_PROC_NBR + 1
+      YWORK2(12+JSV,ILAST_PROC_NBR)= 'NEADV_'
+      IPROACTV(12+JSV,ILAST_PROC_NBR) = 1
+      ILAST_PROC_NBR = ILAST_PROC_NBR + 1
       YWORK2(12+JSV,ILAST_PROC_NBR)= 'NEGA_'
       IPROACTV(12+JSV,ILAST_PROC_NBR) = 1
       IF (OWARM .AND. OACTI .AND. NMOD_CCN.GE.1) THEN
@@ -3175,6 +3298,9 @@ ELSEIF (JSV >= NSV_LIMA_BEG .AND. JSV <= NSV_LIMA_END) THEN
       ILAST_PROC_NBR = ILAST_PROC_NBR + 1
       YWORK2(12+JSV,ILAST_PROC_NBR)= 'CEDS_'
       IPROACTV(12+JSV,ILAST_PROC_NBR) = 1
+      ILAST_PROC_NBR = ILAST_PROC_NBR + 1
+      YWORK2(12+JSV,ILAST_PROC_NBR)= 'NECON_'
+      IPROACTV(12+JSV,ILAST_PROC_NBR) = 1
       IF (OSCAV) THEN
          ILAST_PROC_NBR = ILAST_PROC_NBR + 1
          YWORK2(12+JSV,ILAST_PROC_NBR)= 'SCAV_'
@@ -3182,11 +3308,23 @@ ELSEIF (JSV >= NSV_LIMA_BEG .AND. JSV <= NSV_LIMA_END) THEN
       END IF
       !
    ELSE IF (JSV.GE.NSV_LIMA_CCN_ACTI .AND. JSV.LT.(NSV_LIMA_CCN_ACTI+NMOD_CCN)) THEN
+      ILAST_PROC_NBR = ILAST_PROC_NBR + 1
+      YWORK2(12+JSV,ILAST_PROC_NBR)= 'ADV_'
+      IPROACTV(12+JSV,ILAST_PROC_NBR) = 1
       ! Activated CCN conc.
 
    ELSE IF (JSV == NSV_LIMA_NI) THEN
       ! Pristine ice crystals conc.
       ILAST_PROC_NBR = ILAST_PROC_NBR + 1
+      YWORK2(12+JSV,ILAST_PROC_NBR)= 'NETUR_'
+      IPROACTV(12+JSV,ILAST_PROC_NBR) = 1
+      ILAST_PROC_NBR = ILAST_PROC_NBR + 1
+      YWORK2(12+JSV,ILAST_PROC_NBR)= 'ADV_'
+      IPROACTV(12+JSV,ILAST_PROC_NBR) = 1
+      ILAST_PROC_NBR = ILAST_PROC_NBR + 1
+      YWORK2(12+JSV,ILAST_PROC_NBR)= 'NEADV_'
+      IPROACTV(12+JSV,ILAST_PROC_NBR) = 1
+      ILAST_PROC_NBR = ILAST_PROC_NBR + 1
       YWORK2(12+JSV,ILAST_PROC_NBR)= 'NEGA_'
       IPROACTV(12+JSV,ILAST_PROC_NBR) = 1
       IF (OPTSPLIT .AND. OCOLD .AND. OSNOW) THEN
@@ -3272,10 +3410,22 @@ ELSEIF (JSV >= NSV_LIMA_BEG .AND. JSV <= NSV_LIMA_END) THEN
       ILAST_PROC_NBR = ILAST_PROC_NBR + 1
       YWORK2(12+JSV,ILAST_PROC_NBR)= 'CEDS_'
       IPROACTV(12+JSV,ILAST_PROC_NBR) = 1
+      ILAST_PROC_NBR = ILAST_PROC_NBR + 1
+      YWORK2(12+JSV,ILAST_PROC_NBR)= 'NECON_'
+      IPROACTV(12+JSV,ILAST_PROC_NBR) = 1
       !
    ELSE IF (JSV.GE.NSV_LIMA_IFN_FREE .AND. JSV.LT.(NSV_LIMA_IFN_FREE+NMOD_IFN)) THEN
       ! Free IFN conc.
       ILAST_PROC_NBR = ILAST_PROC_NBR + 1
+      YWORK2(12+JSV,ILAST_PROC_NBR)= 'NETUR_'
+      IPROACTV(12+JSV,ILAST_PROC_NBR) = 1
+      ILAST_PROC_NBR = ILAST_PROC_NBR + 1
+      YWORK2(12+JSV,ILAST_PROC_NBR)= 'ADV_'
+      IPROACTV(12+JSV,ILAST_PROC_NBR) = 1
+      ILAST_PROC_NBR = ILAST_PROC_NBR + 1
+      YWORK2(12+JSV,ILAST_PROC_NBR)= 'NEADV_'
+      IPROACTV(12+JSV,ILAST_PROC_NBR) = 1
+      ILAST_PROC_NBR = ILAST_PROC_NBR + 1
       YWORK2(12+JSV,ILAST_PROC_NBR)= 'NEGA_'
       IPROACTV(12+JSV,ILAST_PROC_NBR) = 1
       IF (OCOLD .AND. ONUCL .AND. (.NOT.OMEYERS)) THEN
@@ -3286,6 +3436,9 @@ ELSEIF (JSV >= NSV_LIMA_BEG .AND. JSV <= NSV_LIMA_END) THEN
       ILAST_PROC_NBR = ILAST_PROC_NBR + 1
       YWORK2(12+JSV,ILAST_PROC_NBR)= 'CEDS_'
       IPROACTV(12+JSV,ILAST_PROC_NBR) = 1
+      ILAST_PROC_NBR = ILAST_PROC_NBR + 1
+      YWORK2(12+JSV,ILAST_PROC_NBR)= 'NECON_'
+      IPROACTV(12+JSV,ILAST_PROC_NBR) = 1
       IF (OSCAV) THEN
          ILAST_PROC_NBR = ILAST_PROC_NBR + 1
          YWORK2(12+JSV,ILAST_PROC_NBR)= 'SCAV_'
@@ -3293,13 +3446,22 @@ ELSEIF (JSV >= NSV_LIMA_BEG .AND. JSV <= NSV_LIMA_END) THEN
       END IF
       !
    ELSE IF (JSV.GE.NSV_LIMA_IFN_NUCL .AND. JSV.LT.(NSV_LIMA_IFN_NUCL+NMOD_IFN)) THEN
+      ILAST_PROC_NBR = ILAST_PROC_NBR + 1
+      YWORK2(12+JSV,ILAST_PROC_NBR)= 'ADV_'
+      IPROACTV(12+JSV,ILAST_PROC_NBR) = 1
       ! Nucleated IFN conc.
 
    ELSE IF (JSV.GE.NSV_LIMA_IMM_NUCL .AND. JSV.LT.(NSV_LIMA_IMM_NUCL+NMOD_IMM)) THEN
+      ILAST_PROC_NBR = ILAST_PROC_NBR + 1
+      YWORK2(12+JSV,ILAST_PROC_NBR)= 'ADV_'
+      IPROACTV(12+JSV,ILAST_PROC_NBR) = 1
       ! Nucleated IMM conc.
 
    ELSE IF (JSV == NSV_LIMA_HOM_HAZE) THEN
       ! Homogeneous freezing of CCN
+      ILAST_PROC_NBR = ILAST_PROC_NBR + 1
+      YWORK2(12+JSV,ILAST_PROC_NBR)= 'ADV_'
+      IPROACTV(12+JSV,ILAST_PROC_NBR) = 1
       IF (OCOLD .AND. ONUCL .AND. OWARM .AND. OHHONI) THEN
          ILAST_PROC_NBR = ILAST_PROC_NBR + 1
          YWORK2(12+JSV,ILAST_PROC_NBR)= 'HONH_'
diff --git a/src/MNH/modd_budget.f90 b/src/MNH/modd_budget.f90
index 14387e9f0..ee2b7af9e 100644
--- a/src/MNH/modd_budget.f90
+++ b/src/MNH/modd_budget.f90
@@ -42,6 +42,7 @@
 !!      C. LAc          10/2016 add droplets deposition
 !!      S. Riette       11/2016  New budgets for ICE3/ICE4
 !!  Philippe Wautelet: 05/2016-04/2018: new data structures and calls for I/O
+!!      B.Vie   03/02/2020 : LIMA negativity checks after turbulence, advection and microphysics budgets 
 !-------------------------------------------------------------------------------
 !
 !*       0.   DECLARATIONS
@@ -399,6 +400,9 @@ INTEGER, SAVE :: NFRCRR     ! forcing
 INTEGER, SAVE :: NDIFRR     ! numerical diffusion
 INTEGER, SAVE :: NRELRR     ! relaxation
 INTEGER, SAVE :: NNEGARR    ! negative correction                            
+INTEGER, SAVE :: NNETURRR    ! negative correction
+INTEGER, SAVE :: NNEADVRR    ! negative correction
+INTEGER, SAVE :: NNECONRR    ! negative correction
 INTEGER, SAVE :: NACCRRR    ! accretion
 INTEGER, SAVE :: NAUTORR    ! autoconversion
 INTEGER, SAVE :: NREVARR    ! rain evaporation
@@ -434,6 +438,9 @@ INTEGER, SAVE :: NDCONVRI   ! Deep CONVection
 INTEGER, SAVE :: NHTURBRI   ! horizontal turbulence
 INTEGER, SAVE :: NVTURBRI   ! vertical turbulence
 INTEGER, SAVE :: NNEGARI    ! negative correction                            
+INTEGER, SAVE :: NNETURRI    ! negative correction
+INTEGER, SAVE :: NNEADVRI    ! negative correction
+INTEGER, SAVE :: NNECONRI    ! negative correction
 INTEGER, SAVE :: NSEDIRI    ! SEDImentation           ICE3
 INTEGER, SAVE :: NHENURI    ! HEterogenous NUcleation ICE3
 INTEGER, SAVE :: NHONRI     ! HOmogeneous Nucleation  ICE3
@@ -472,6 +479,9 @@ INTEGER, SAVE :: NFRCRS     ! forcing
 INTEGER, SAVE :: NDIFRS     ! numerical diffusion
 INTEGER, SAVE :: NRELRS     ! relaxation
 INTEGER, SAVE :: NNEGARS    ! negative correction                            
+INTEGER, SAVE :: NNETURRS    ! negative correction
+INTEGER, SAVE :: NNEADVRS    ! negative correction
+INTEGER, SAVE :: NNECONRS    ! negative correction
 INTEGER, SAVE :: NSEDIRS    ! SEDImentation           ICE3
 INTEGER, SAVE :: NDEPSRS    ! DEPosition on Snow      ICE3
 INTEGER, SAVE :: NAGGSRS    ! AGGregation of snow     ICE3
@@ -501,6 +511,9 @@ INTEGER, SAVE :: NFRCRG     ! forcing
 INTEGER, SAVE :: NDIFRG     ! numerical diffusion
 INTEGER, SAVE :: NRELRG     ! relaxation
 INTEGER, SAVE :: NNEGARG    ! negative correction                            
+INTEGER, SAVE :: NNETURRG    ! negative correction
+INTEGER, SAVE :: NNEADVRG    ! negative correction
+INTEGER, SAVE :: NNECONRG    ! negative correction
 INTEGER, SAVE :: NSEDIRG    ! SEDImentation           ICE3
 INTEGER, SAVE :: NSFRRG     ! Spontaneous FReezing    ICE3
 INTEGER, SAVE :: NDEPGRG    ! DEPosition on Snow      ICE3
@@ -533,6 +546,9 @@ INTEGER, SAVE :: NFRCRH     ! forcing
 INTEGER, SAVE :: NDIFRH     ! numerical diffusion
 INTEGER, SAVE :: NRELRH     ! relaxation
 INTEGER, SAVE :: NNEGARH    ! negative correction 
+INTEGER, SAVE :: NNETURRH    ! negative correction
+INTEGER, SAVE :: NNEADVRH    ! negative correction
+INTEGER, SAVE :: NNECONRH    ! negative correction
 INTEGER, SAVE :: NSEDIRH    ! sedimentation
 INTEGER, SAVE :: NWETGRH    ! wet growth of graupel
 INTEGER, SAVE :: NWETHRH    ! wet growth of hail
diff --git a/src/MNH/modn_budget.f90 b/src/MNH/modn_budget.f90
index faf5c1f76..da0053137 100644
--- a/src/MNH/modn_budget.f90
+++ b/src/MNH/modn_budget.f90
@@ -225,6 +225,7 @@
 !!      C. Barthe        /16  add budget terms for LIMA
 !!      C.Lac        10/2016  Add droplet deposition
 !!      S. Riette   11/2016 New budgets for ICE3/ICE4
+!!      B.Vie    03/02/2020 LIMA negativity checks after turbulence, advection and microphysics budgets 
 !-------------------------------------------------------------------------------
 !
 !*       0.   DECLARATIONS
@@ -274,28 +275,33 @@ NAMELIST/NAM_BU_RRC/LBU_RRC, NASSERC, NNESTRC, NADVRC, NFRCRC, &
 NAMELIST/NAM_BU_RRR/LBU_RRR, NASSERR, NNESTRR, NADVRR, NFRCRR, &
                     NDIFRR, NRELRR, NNEGARR, NACCRRR, NAUTORR, NREVARR, NSEDIRR,    &
                     NSFRRR, NACCRR, NCFRZRR, NWETGRR, NDRYGRR, NGMLTRR, NWETHRR,    &
-                    NHMLTRR, NDRYHRR, NCORRRR, NCMELRR,NHONRRR, NCORRRR, NR2C1RR, NCVRCRR
+                    NHMLTRR, NDRYHRR, NCORRRR, NCMELRR,NHONRRR, NCORRRR, NR2C1RR, NCVRCRR, &
+                    NNETURRR, NNEADVRR, NNECONRR
 ! 
 NAMELIST/NAM_BU_RRI/LBU_RRI, NASSERI, NNESTRI, NADVRI, NFRCRI, &
                     NDIFRI, NRELRI, NDCONVRI, NHTURBRI, NVTURBRI, NNEGARI, NSEDIRI, &
                     NHENURI, NHONRI, NAGGSRI, NAUTSRI, NCFRZRI, NWETGRI, NDRYGRI,   &
                     NIMLTRI, NBERFIRI, NCDEPIRI, NWETHRI, NDRYHRI, NADJURI, NCORRRI, &
                     NHINDRI, NHINCRI, NHONHRI, NHONCRI, NCNVIRI, NCNVSRI, &
-                    NHMSRI, NHMGRI, NCEDSRI, NCORRRI
+                    NHMSRI, NHMGRI, NCEDSRI, NCORRRI, &
+                    NNETURRI, NNEADVRI, NNECONRI
 ! 
 NAMELIST/NAM_BU_RRS/LBU_RRS, NASSERS, NNESTRS, NADVRS, NFRCRS, &
                     NDIFRS, NRELRS, NNEGARS, NSEDIRS, NDEPSRS, NAGGSRS, NAUTSRS,    &
                     NRIMRS, NACCRS, NCMELRS, NWETGRS, NDRYGRS, NWETHRS, NDRYHRS,    &
-                    NCORRRS, NCNVIRS, NCNVSRS, NHMSRS, NCORRRS
+                    NCORRRS, NCNVIRS, NCNVSRS, NHMSRS, NCORRRS, &
+                    NNETURRS, NNEADVRS, NNECONRS
 ! 
 NAMELIST/NAM_BU_RRG/LBU_RRG, NASSERG, NNESTRG, NADVRG, NFRCRG, &
                     NDIFRG, NRELRG, NNEGARG, NSEDIRG, NSFRRG, NDEPGRG, NRIMRG, NACCRG,    &
                     NCMELRG, NCFRZRG, NWETGRG, NDRYGRG, NGMLTRG, NWETHRG, &
-                    NDRYHRG, NCORRRG, NHGCVRG, NGHCVRG,NHONRRG, NHMGRG, NCOHGRG 
+                    NDRYHRG, NCORRRG, NHGCVRG, NGHCVRG,NHONRRG, NHMGRG, NCOHGRG, &
+                    NNETURRG, NNEADVRG, NNECONRG 
 ! 
 NAMELIST/NAM_BU_RRH/LBU_RRH, NASSERH, NNESTRH, NADVRH, NFRCRH, &
                     NDIFRH, NRELRH, NNEGARH, NSEDIRH, NWETGRH, NWETHRH, NDRYHRH, NHMLTRH, &
-                    NCORRRH, NHGCVRH, NGHCVRH, NCOHGRH, NHMLTRH
+                    NCORRRH, NHGCVRH, NGHCVRH, NCOHGRH, NHMLTRH, &
+                    NNETURRH, NNEADVRH, NNECONRH
 ! 
 NAMELIST/NAM_BU_RSV/ LBU_RSV, NASSESV, NNESTSV, NADVSV, NFRCSV, &
                      NDIFSV, NRELSV, NDCONVSV, NVTURBSV, NHTURBSV, NCHEMSV, NMAFLSV,       &
diff --git a/src/MNH/resolved_cloud.f90 b/src/MNH/resolved_cloud.f90
index 6be69455e..f3b451997 100644
--- a/src/MNH/resolved_cloud.f90
+++ b/src/MNH/resolved_cloud.f90
@@ -267,7 +267,8 @@ END MODULE MODI_RESOLVED_CLOUD
 !!  Philippe Wautelet: 05/2016-04/2018: new data structures and calls for I/O
 !!      P. Wautelet: 01/02/2019: ZRSMIN is now allocatable (instead of size of XRTMIN which was sometimes not allocated)
 !!                   02/2019 C.Lac add rain fraction as an output field
-!  P. Wautelet 24/02/2020: bugfix: corrected budget name (DEPI->CDEPI) for ice_adjust
+!!  P. Wautelet 24/02/2020: bugfix: corrected budget name (DEPI->CDEPI) for ice_adjust
+!!                  03/2020 (B.Vie) : LIMA negativity checks after turbulence, advection and microphysics budgets
 !-------------------------------------------------------------------------------
 !
 !*       0.    DECLARATIONS
@@ -721,7 +722,7 @@ SELECT CASE ( HCLOUD )
    CASE('LIMA')   
 ! Correction where rc<0 or Nc<0
       IF (OWARM) THEN
-         WHERE (PRS(:,:,:,2) < 0. .OR. ZSVS(:,:,:,NSV_LIMA_NC) < 0.)
+         WHERE (PRS(:,:,:,2) < YRTMIN(2)/PTSTEP .OR. ZSVS(:,:,:,NSV_LIMA_NC) < YCTMIN(2)/PTSTEP)
             PRS(:,:,:,1) = PRS(:,:,:,1) + PRS(:,:,:,2)
             PTHS(:,:,:) = PTHS(:,:,:) - PRS(:,:,:,2) * ZLV(:,:,:) /  &
                  ZCPH(:,:,:) / ZEXN(:,:,:)
@@ -1133,10 +1134,73 @@ IF(HCLOUD=='ICE3' .OR. HCLOUD=='ICE4' ) THEN
   ENDIF
 ENDIF
 !
-IF ( (HCLOUD == 'KHKO') .OR. (HCLOUD == 'C2R2') ) THEN
-!    CALL GET_HALO(PRS(:,:,:,2))
-!    CALL GET_HALO(ZSVS(:,:,:,2))
-!    CALL GET_HALO(ZSVS(:,:,:,3))
+!
+SELECT CASE ( HCLOUD )
+  CASE('KESS')
+    WHERE (PRS(:,:,:,2) < 0.)
+      PRS(:,:,:,1) = PRS(:,:,:,1) + PRS(:,:,:,2)
+      PTHS(:,:,:) = PTHS(:,:,:) - PRS(:,:,:,2) * ZLV(:,:,:) /  &
+           ZCPH(:,:,:) / PEXNREF(:,:,:)
+      PRS(:,:,:,2) = 0.0
+    END WHERE
+!
+!
+! CASE('C2R2','KHKO')                                 
+!   CALL GET_HALO(PRS(:,:,:,2))
+!   CALL GET_HALO(ZSVS(:,:,:,2))
+!   WHERE (PRS(:,:,:,2) < 0. .OR. ZSVS(:,:,:,2) < 0.)
+!     ZSVS(:,:,:,1) = 0.0
+!   END WHERE
+!   DO JSV = 2, 3
+!     WHERE (PRS(:,:,:,JSV) < 0. .OR. ZSVS(:,:,:,JSV) < 0.)
+!       PRS(:,:,:,1) = PRS(:,:,:,1) + PRS(:,:,:,JSV)
+!       PTHS(:,:,:) = PTHS(:,:,:) - PRS(:,:,:,JSV) * ZLV(:,:,:) /  &
+!            ZCPH(:,:,:) / ZEXN(:,:,:)
+!       PRS(:,:,:,JSV)  = 0.0
+!       ZSVS(:,:,:,JSV) = 0.0
+!     END WHERE
+!   ENDDO
+! Commented 03/2013 O.Thouron 
+! (at least necessary to be commented for supersaturation variable)
+!  ZSVS(:,:,:,:) = MAX( 0.0,ZSVS(:,:,:,:) )
+!
+!
+  CASE('ICE3','ICE4')
+    WHERE (PRS(:,:,:,4) < 0.)
+      PRS(:,:,:,1) = PRS(:,:,:,1) + PRS(:,:,:,4)
+      PTHS(:,:,:) = PTHS(:,:,:) - PRS(:,:,:,4) * ZLS(:,:,:) /  &
+           ZCPH(:,:,:) / PEXNREF(:,:,:)
+      PRS(:,:,:,4) = 0.
+    END WHERE
+!
+!   cloud
+    WHERE (PRS(:,:,:,2) < 0.)
+      PRS(:,:,:,1) = PRS(:,:,:,1) + PRS(:,:,:,2)
+      PTHS(:,:,:) = PTHS(:,:,:) - PRS(:,:,:,2) * ZLV(:,:,:) /  &
+           ZCPH(:,:,:) / PEXNREF(:,:,:)
+      PRS(:,:,:,2) = 0.
+    END WHERE
+!
+! if rc or ri are positive, we can correct negative rv
+!   cloud
+    WHERE ((PRS(:,:,:,1) <0.) .AND. (PRS(:,:,:,2)> 0.) )
+      PRS(:,:,:,1) = PRS(:,:,:,1) + PRS(:,:,:,2)
+      PTHS(:,:,:) = PTHS(:,:,:) - PRS(:,:,:,2) * ZLV(:,:,:) /  &
+           ZCPH(:,:,:) / PEXNREF(:,:,:)
+      PRS(:,:,:,2) = 0.
+    END WHERE
+!   ice
+    IF(KRR > 3) THEN
+      WHERE ((PRS(:,:,:,1) < 0.).AND.(PRS(:,:,:,4) > 0.))
+        ZCOR(:,:,:)=MIN(-PRS(:,:,:,1),PRS(:,:,:,4))
+        PRS(:,:,:,1) = PRS(:,:,:,1) + ZCOR(:,:,:)
+        PTHS(:,:,:) = PTHS(:,:,:) - ZCOR(:,:,:) * ZLS(:,:,:) /  &
+             ZCPH(:,:,:) / PEXNREF(:,:,:)
+        PRS(:,:,:,4) = PRS(:,:,:,4) -ZCOR(:,:,:)
+      END WHERE
+    END IF
+!
+   CASE('C2R2','KHKO')
     WHERE (PRS(:,:,:,2) < 0. .OR. ZSVS(:,:,:,2) < 0.)
       ZSVS(:,:,:,1) = 0.0
     END WHERE
@@ -1149,9 +1213,104 @@ IF ( (HCLOUD == 'KHKO') .OR. (HCLOUD == 'C2R2') ) THEN
         ZSVS(:,:,:,JSV) = 0.0
       END WHERE
     ENDDO
- IF (LBUDGET_TH) CALL BUDGET (PTHS(:,:,:)  * PRHODJ(:,:,:), 4,'NECON_BU_RTH')
- IF (LBUDGET_RV) CALL BUDGET (PRS(:,:,:,1) * PRHODJ(:,:,:), 6,'NECON_BU_RRV')
- IF (LBUDGET_RC) CALL BUDGET (PRS(:,:,:,2) * PRHODJ(:,:,:), 7,'NECON_BU_RRC')
+!      
+   CASE('C3R5')
+    WHERE (PRS(:,:,:,2) < 0. .OR. ZSVS(:,:,:,2) < 0.)
+      ZSVS(:,:,:,1) = 0.0
+    END WHERE
+    DO JSV = 2, 3
+      WHERE (PRS(:,:,:,JSV) < 0. .OR. ZSVS(:,:,:,JSV) < 0.)
+        PRS(:,:,:,1) = PRS(:,:,:,1) + PRS(:,:,:,JSV)
+        PTHS(:,:,:) = PTHS(:,:,:) - PRS(:,:,:,JSV) * ZLV(:,:,:) /  &
+             ZCPH(:,:,:) / PEXNREF(:,:,:)
+        PRS(:,:,:,JSV)  = 0.0
+        ZSVS(:,:,:,JSV) = 0.0
+      END WHERE
+    ENDDO
+    ZSVS(:,:,:,:) = MAX( 0.0,ZSVS(:,:,:,:) )
+!   ice
+    WHERE (PRS(:,:,:,4) < 0.)
+      PRS(:,:,:,1) = PRS(:,:,:,1) + PRS(:,:,:,4)
+      PTHS(:,:,:) = PTHS(:,:,:) - PRS(:,:,:,4) * ZLV(:,:,:) /  &
+           ZCPH(:,:,:) / PEXNREF(:,:,:)
+      PRS(:,:,:,4)  = 0.0
+      PSVS(:,:,:,4) = 0.0
+    END WHERE
+!   cloud
+    WHERE (PRS(:,:,:,2) < 0.)
+      PRS(:,:,:,1) = PRS(:,:,:,1) + PRS(:,:,:,2)
+      PTHS(:,:,:) = PTHS(:,:,:) - PRS(:,:,:,2) * ZLV(:,:,:) /  &
+           ZCPH(:,:,:) / PEXNREF(:,:,:)
+      PRS(:,:,:,2)  = 0.0
+      PSVS(:,:,:,2) = 0.0
+    END WHERE
+    PSVS(:,:,:,:) = MAX( 0.0,PSVS(:,:,:,:) )
+!
+   CASE('LIMA')   
+! Correction where rc<0 or Nc<0
+      IF (OWARM) THEN
+         WHERE (PRS(:,:,:,2) < YRTMIN(2)/PTSTEP .OR. ZSVS(:,:,:,NSV_LIMA_NC) < YCTMIN(2)/PTSTEP)
+            PRS(:,:,:,1) = PRS(:,:,:,1) + PRS(:,:,:,2)
+            PTHS(:,:,:) = PTHS(:,:,:) - PRS(:,:,:,2) * ZLV(:,:,:) /  &
+                 ZCPH(:,:,:) / ZEXN(:,:,:)
+            PRS(:,:,:,2)  = 0.0
+            ZSVS(:,:,:,NSV_LIMA_NC) = 0.0
+         END WHERE
+      END IF
+! Correction where rr<0 or Nr<0
+      IF (OWARM .AND. ORAIN) THEN
+         WHERE (PRS(:,:,:,3) < YRTMIN(3)/PTSTEP .OR. ZSVS(:,:,:,NSV_LIMA_NR) < YCTMIN(3)/PTSTEP)
+            PRS(:,:,:,1) = PRS(:,:,:,1) + PRS(:,:,:,3)
+            PTHS(:,:,:) = PTHS(:,:,:) - PRS(:,:,:,3) * ZLV(:,:,:) /  &
+                 ZCPH(:,:,:) / ZEXN(:,:,:)
+            PRS(:,:,:,3)  = 0.0
+            ZSVS(:,:,:,NSV_LIMA_NR) = 0.0
+         END WHERE
+      END IF
+! Correction where ri<0 or Ni<0
+      IF (LCOLD) THEN
+         WHERE (PRS(:,:,:,4) < YRTMIN(4)/PTSTEP .OR. ZSVS(:,:,:,NSV_LIMA_NI) < YCTMIN(4)/PTSTEP)
+            PRS(:,:,:,1) = PRS(:,:,:,1) + PRS(:,:,:,4)
+            PTHS(:,:,:) = PTHS(:,:,:) - PRS(:,:,:,4) * ZLS(:,:,:) /  &
+                 ZCPH(:,:,:) / ZEXN(:,:,:)
+            PRS(:,:,:,4)  = 0.0
+            ZSVS(:,:,:,NSV_LIMA_NI) = 0.0
+         END WHERE
+      END IF
+!
+     ZSVS(:,:,:,:) = MAX( 0.0,ZSVS(:,:,:,:) )
+     PRS(:,:,:,:) = MAX( 0.0,PRS(:,:,:,:) )
+!
+END SELECT
+!
+!
+!*       3.3  STORE THE BUDGET TERMS
+!            ----------------------
+!
+IF (LBUDGET_TH) CALL BUDGET (PTHS(:,:,:)  * PRHODJ(:,:,:), 4,'NECON_BU_RTH')
+IF (LBUDGET_RV) CALL BUDGET (PRS(:,:,:,1) * PRHODJ(:,:,:), 6,'NECON_BU_RRV')
+IF (LBUDGET_RC) CALL BUDGET (PRS(:,:,:,2) * PRHODJ(:,:,:), 7,'NECON_BU_RRC')
+IF (LBUDGET_RR) CALL BUDGET (PRS(:,:,:,3) * PRHODJ(:,:,:), 8,'NECON_BU_RRR')
+IF (LBUDGET_RI) CALL BUDGET (PRS(:,:,:,4) * PRHODJ(:,:,:) ,9,'NECON_BU_RRI')
+IF (LBUDGET_RS) CALL BUDGET (PRS(:,:,:,5) * PRHODJ(:,:,:),10,'NECON_BU_RRS')
+IF (LBUDGET_RG) CALL BUDGET (PRS(:,:,:,6) * PRHODJ(:,:,:),11,'NECON_BU_RRG')
+IF (LBUDGET_RH) CALL BUDGET (PRS(:,:,:,7) * PRHODJ(:,:,:),12,'NECON_BU_RRH')
+IF (LBUDGET_SV .AND. (HCLOUD == 'LIMA')) THEN
+   IF (OWARM) CALL BUDGET (ZSVS(:,:,:,NSV_LIMA_NC) * PRHODJ(:,:,:),12+NSV_LIMA_NC,'NECON_BU_RSV')
+   IF (OWARM.AND.ORAIN) CALL BUDGET (ZSVS(:,:,:,NSV_LIMA_NR) * PRHODJ(:,:,:),12+NSV_LIMA_NR,'NECON_BU_RSV')
+   IF (LCOLD) CALL BUDGET (ZSVS(:,:,:,NSV_LIMA_NI) * PRHODJ(:,:,:),12+NSV_LIMA_NI,'NECON_BU_RSV')
+   IF (NMOD_CCN.GE.1) THEN
+      DO JL=1, NMOD_CCN
+         CALL BUDGET ( ZSVS(:,:,:,NSV_LIMA_CCN_FREE+JL-1)* &
+              PRHODJ(:,:,:),12+NSV_LIMA_CCN_FREE+JL-1,'NECON_BU_RSV') 
+      END DO
+   END IF
+   IF (NMOD_IFN.GE.1) THEN
+      DO JL=1, NMOD_IFN
+         CALL BUDGET ( ZSVS(:,:,:,NSV_LIMA_IFN_FREE+JL-1)* &
+              PRHODJ(:,:,:),12+NSV_LIMA_IFN_FREE+JL-1,'NECON_BU_RSV') 
+      END DO
+   END IF
 END IF
 !-------------------------------------------------------------------------------
 !
diff --git a/src/MNH/turb.f90 b/src/MNH/turb.f90
index 5e304989b..93500879f 100644
--- a/src/MNH/turb.f90
+++ b/src/MNH/turb.f90
@@ -340,6 +340,7 @@ END MODULE MODI_TURB
 !!                     04/2016  (C.Lac) correction of negativity for KHKO
 !!  Philippe Wautelet: 05/2016-04/2018: new data structures and calls for I/O
 !!                     01/2018 (Q.Rodier) Introduction of RM17
+!!                  03/2020 (B.Vie) : LIMA negativity checks after turbulence, advection and microphysics budgets 
 !! --------------------------------------------------------------------------
 !       
 !*      0. DECLARATIONS
@@ -353,6 +354,7 @@ USE MODD_BUDGET
 USE MODD_IO_ll, ONLY: TFILEDATA
 USE MODD_LES
 USE MODD_NSV
+USE MODD_PARAM_LIMA
 !
 USE MODI_GRADIENT_M
 USE MODI_GRADIENT_U
@@ -539,7 +541,7 @@ REAL                :: ZALPHA       ! proportionnality constant between Dz/2 and
 !                                   ! BL89 mixing length near the surface
 !
 REAL :: ZTIME1, ZTIME2
-REAL, DIMENSION(SIZE(PUT,1),SIZE(PUT,2),SIZE(PUT,3)):: ZTT,ZEXNE,ZLV,ZLS,ZCPH
+REAL, DIMENSION(SIZE(PUT,1),SIZE(PUT,2),SIZE(PUT,3)):: ZTT,ZEXNE,ZLV,ZLS,ZCPH,ZCOR
 REAL, DIMENSION(SIZE(PUT,1),SIZE(PUT,2),SIZE(PUT,3))::  ZSHEAR, ZDUDZ, ZDVDZ
 TYPE(TFIELDDATA) :: TZFIELD
 !
@@ -1116,32 +1118,137 @@ IF ( KRRL >= 1 ) THEN
   END IF
 END IF
 !
-IF ((HCLOUD == 'KHKO') .OR. (HCLOUD == 'C2R2')) THEN
- ZEXNE(:,:,:)= (PPABST(:,:,:)/XP00)**(XRD/XCPD)
- ZTT(:,:,:)= PTHLT(:,:,:)*ZEXNE(:,:,:)
- ZLV(:,:,:)=XLVTT +(XCPV-XCL) *(ZTT(:,:,:)-XTT)
- ZLS(:,:,:)=XLSTT +(XCPV-XCI) *(ZTT(:,:,:)-XTT)
- ZCPH(:,:,:)=XCPD +XCPV*PRT(:,:,:,1)
-! CALL GET_HALO(PRRS(:,:,:,2))
-! CALL GET_HALO(PRSVS(:,:,:,2))
-! CALL GET_HALO(PRSVS(:,:,:,3))
- WHERE (PRRS(:,:,:,2) < 0. .OR. PRSVS(:,:,:,2) < 0.)
-      PRSVS(:,:,:,1) = 0.0
- END WHERE
- DO JSV = 2, 3
-  WHERE (PRRS(:,:,:,JSV) < 0. .OR. PRSVS(:,:,:,JSV) < 0.)
-      PRRS(:,:,:,1) = PRRS(:,:,:,1) + PRRS(:,:,:,JSV)
-      PRTHLS(:,:,:) = PRTHLS(:,:,:) - PRRS(:,:,:,JSV) * ZLV(:,:,:) /  &
+SELECT CASE ( HCLOUD )
+  CASE('ICE3','ICE4')
+     ZEXNE(:,:,:)= (PPABST(:,:,:)/XP00)**(XRD/XCPD)
+     ZTT(:,:,:)= PTHLT(:,:,:)*ZEXNE(:,:,:)
+     ZLV(:,:,:)=XLVTT +(XCPV-XCL) *(ZTT(:,:,:)-XTT)
+     ZLS(:,:,:)=XLSTT +(XCPV-XCI) *(ZTT(:,:,:)-XTT)
+     ZCPH(:,:,:)=XCPD +XCPV*PRT(:,:,:,1)
+    WHERE (PRRS(:,:,:,4) < 0.)
+      PRRS(:,:,:,1) = PRRS(:,:,:,1) + PRRS(:,:,:,4)
+      PRTHLS(:,:,:) = PRTHLS(:,:,:) - PRRS(:,:,:,4) * ZLS(:,:,:) /  &
+           ZCPH(:,:,:) / ZEXNE(:,:,:)
+      PRRS(:,:,:,4) = 0.
+    END WHERE
+!
+!   cloud
+    WHERE (PRRS(:,:,:,2) < 0.)
+      PRRS(:,:,:,1) = PRRS(:,:,:,1) + PRRS(:,:,:,2)
+      PRTHLS(:,:,:) = PRTHLS(:,:,:) - PRRS(:,:,:,2) * ZLV(:,:,:) /  &
+           ZCPH(:,:,:) / ZEXNE(:,:,:)
+      PRRS(:,:,:,2) = 0.
+    END WHERE
+!
+! if rc or ri are positive, we can correct negative rv
+!   cloud
+    WHERE ((PRRS(:,:,:,1) <0.) .AND. (PRRS(:,:,:,2)> 0.) )
+      PRRS(:,:,:,1) = PRRS(:,:,:,1) + PRRS(:,:,:,2)
+      PRTHLS(:,:,:) = PRTHLS(:,:,:) - PRRS(:,:,:,2) * ZLV(:,:,:) /  &
+           ZCPH(:,:,:) / ZEXNE(:,:,:)
+      PRRS(:,:,:,2) = 0.
+    END WHERE
+!   ice
+    IF(KRR > 3) THEN
+      WHERE ((PRRS(:,:,:,1) < 0.).AND.(PRRS(:,:,:,4) > 0.))
+        ZCOR(:,:,:)=MIN(-PRRS(:,:,:,1),PRRS(:,:,:,4))
+        PRRS(:,:,:,1) = PRRS(:,:,:,1) + ZCOR(:,:,:)
+        PRTHLS(:,:,:) = PRTHLS(:,:,:) - ZCOR(:,:,:) * ZLS(:,:,:) /  &
              ZCPH(:,:,:) / ZEXNE(:,:,:)
-      PRRS(:,:,:,JSV)  = 0.0
-      PRSVS(:,:,:,JSV) = 0.0
-  END WHERE
- END DO
-!
- IF (LBUDGET_TH) CALL BUDGET (PRTHLS(:,:,:), 4,'NETUR_BU_RTH')
- IF (LBUDGET_RV) CALL BUDGET (PRRS(:,:,:,1), 6,'NETUR_BU_RRV')
- IF (LBUDGET_RC) CALL BUDGET (PRRS(:,:,:,2), 7,'NETUR_BU_RRC')
+        PRRS(:,:,:,4) = PRRS(:,:,:,4) -ZCOR(:,:,:)
+      END WHERE
+    END IF
+!
+  CASE('C2R2','KHKO')
+     ZEXNE(:,:,:)= (PPABST(:,:,:)/XP00)**(XRD/XCPD)
+     ZTT(:,:,:)= PTHLT(:,:,:)*ZEXNE(:,:,:)
+     ZLV(:,:,:)=XLVTT +(XCPV-XCL) *(ZTT(:,:,:)-XTT)
+     ZLS(:,:,:)=XLSTT +(XCPV-XCI) *(ZTT(:,:,:)-XTT)
+     ZCPH(:,:,:)=XCPD +XCPV*PRT(:,:,:,1)
+!  CALL GET_HALO(PRRS(:,:,:,2))
+!  CALL GET_HALO(PRSVS(:,:,:,2))
+!  CALL GET_HALO(PRSVS(:,:,:,3))
+     WHERE (PRRS(:,:,:,2) < 0. .OR. PRSVS(:,:,:,2) < 0.)
+        PRSVS(:,:,:,1) = 0.0
+     END WHERE
+     DO JSV = 2, 3
+        WHERE (PRRS(:,:,:,JSV) < 0. .OR. PRSVS(:,:,:,JSV) < 0.)
+           PRRS(:,:,:,1) = PRRS(:,:,:,1) + PRRS(:,:,:,JSV)
+           PRTHLS(:,:,:) = PRTHLS(:,:,:) - PRRS(:,:,:,JSV) * ZLV(:,:,:) /  &
+                ZCPH(:,:,:) / ZEXNE(:,:,:)
+           PRRS(:,:,:,JSV)  = 0.0
+           PRSVS(:,:,:,JSV) = 0.0
+        END WHERE
+     END DO
+     !
+   CASE('LIMA')   
+     ZEXNE(:,:,:)= (PPABST(:,:,:)/XP00)**(XRD/XCPD)
+     ZTT(:,:,:)= PTHLT(:,:,:)*ZEXNE(:,:,:)
+     ZLV(:,:,:)=XLVTT +(XCPV-XCL) *(ZTT(:,:,:)-XTT)
+     ZLS(:,:,:)=XLSTT +(XCPV-XCI) *(ZTT(:,:,:)-XTT)
+     ZCPH(:,:,:)=XCPD +XCPV*PRT(:,:,:,1)
+! Correction where rc<0 or Nc<0
+      IF (LWARM) THEN
+         WHERE (PRRS(:,:,:,2) < XRTMIN(2)/PTSTEP .OR. PRSVS(:,:,:,NSV_LIMA_NC) < XCTMIN(2)/PTSTEP)
+            PRRS(:,:,:,1) = PRRS(:,:,:,1) + PRRS(:,:,:,2)
+            PRTHLS(:,:,:) = PRTHLS(:,:,:) - PRRS(:,:,:,2) * ZLV(:,:,:) /  &
+                 ZCPH(:,:,:) / ZEXNE(:,:,:)
+            PRRS(:,:,:,2)  = 0.0
+            PRSVS(:,:,:,NSV_LIMA_NC) = 0.0
+         END WHERE
+      END IF
+! Correction where rr<0 or Nr<0
+      IF (LWARM .AND. LRAIN) THEN
+         WHERE (PRRS(:,:,:,3) < XRTMIN(3)/PTSTEP .OR. PRSVS(:,:,:,NSV_LIMA_NR) < XCTMIN(3)/PTSTEP)
+            PRRS(:,:,:,1) = PRRS(:,:,:,1) + PRRS(:,:,:,3)
+            PRTHLS(:,:,:) = PRTHLS(:,:,:) - PRRS(:,:,:,3) * ZLV(:,:,:) /  &
+                 ZCPH(:,:,:) / ZEXNE(:,:,:)
+            PRRS(:,:,:,3)  = 0.0
+            PRSVS(:,:,:,NSV_LIMA_NR) = 0.0
+         END WHERE
+      END IF
+! Correction where ri<0 or Ni<0
+      IF (LCOLD) THEN
+         WHERE (PRRS(:,:,:,4) < XRTMIN(4)/PTSTEP .OR. PRSVS(:,:,:,NSV_LIMA_NI) < XCTMIN(4)/PTSTEP)
+            PRRS(:,:,:,1) = PRRS(:,:,:,1) + PRRS(:,:,:,4)
+            PRTHLS(:,:,:) = PRTHLS(:,:,:) - PRRS(:,:,:,4) * ZLS(:,:,:) /  &
+                 ZCPH(:,:,:) / ZEXNE(:,:,:)
+            PRRS(:,:,:,4)  = 0.0
+            PRSVS(:,:,:,NSV_LIMA_NI) = 0.0
+         END WHERE
+      END IF
+!
+      PRSVS(:,:,:,:) = MAX( 0.0,PRSVS(:,:,:,:) )
+      PRRS(:,:,:,:) = MAX( 0.0,PRRS(:,:,:,:) )
+!
+END SELECT
+!
+IF ((HCLOUD == 'ICE3') .OR. (HCLOUD == 'ICE4') .OR. (HCLOUD == 'KHKO') .OR. (HCLOUD /= 'C2R2') .OR. (HCLOUD /= 'LIMA') ) THEN
+  IF (LBUDGET_TH) CALL BUDGET (PRTHLS(:,:,:), 4,'NETUR_BU_RTH')
+  IF (LBUDGET_RV) CALL BUDGET (PRRS(:,:,:,1), 6,'NETUR_BU_RRV')
+  IF (LBUDGET_RC) CALL BUDGET (PRRS(:,:,:,2), 7,'NETUR_BU_RRC')
+  IF (LBUDGET_RR) CALL BUDGET (PRRS(:,:,:,3), 8,'NETUR_BU_RRR')
+  IF (LBUDGET_RI) CALL BUDGET (PRRS(:,:,:,4), 9,'NETUR_BU_RRI')
+  IF (LBUDGET_RS) CALL BUDGET (PRRS(:,:,:,5),10,'NETUR_BU_RRS')
+  IF (LBUDGET_RG) CALL BUDGET (PRRS(:,:,:,6),11,'NETUR_BU_RRG')
+  IF (LBUDGET_RH) CALL BUDGET (PRRS(:,:,:,7),12,'NETUR_BU_RRH')
 END IF
+IF (LBUDGET_SV .AND. (HCLOUD == 'LIMA')) THEN
+   IF (LWARM) CALL BUDGET (PRSVS(:,:,:,NSV_LIMA_NC),12+NSV_LIMA_NC,'NETUR_BU_RSV')
+   IF (LWARM.AND.LRAIN) CALL BUDGET (PRSVS(:,:,:,NSV_LIMA_NR),12+NSV_LIMA_NR,'NETUR_BU_RSV')
+   IF (LCOLD) CALL BUDGET (PRSVS(:,:,:,NSV_LIMA_NI),12+NSV_LIMA_NI,'NETUR_BU_RSV')
+   IF (NMOD_CCN.GE.1) THEN
+      DO JI=1, NMOD_CCN
+         CALL BUDGET ( PRSVS(:,:,:,NSV_LIMA_CCN_FREE+JI-1),12+NSV_LIMA_CCN_FREE+JI-1,'NETUR_BU_RSV') 
+      END DO
+   END IF
+   IF (NMOD_IFN.GE.1) THEN
+      DO JI=1, NMOD_IFN
+         CALL BUDGET ( PRSVS(:,:,:,NSV_LIMA_IFN_FREE+JI-1),12+NSV_LIMA_IFN_FREE+JI-1,'NETUR_BU_RSV') 
+      END DO
+   END IF
+END IF
+
 !
 !----------------------------------------------------------------------------
 !
-- 
GitLab