From 0f8028a84e6d1ce953f06b853c5a466aba0d401d Mon Sep 17 00:00:00 2001
From: Philippe WAUTELET <philippe.wautelet@aero.obs-mip.fr>
Date: Thu, 11 Jun 2020 18:20:26 +0200
Subject: [PATCH] Philippe 11/06/2020: bugfix: correct scalar-variables array
 indices

---
 src/MNH/advection_metsv.f90 | 18 ++++++-------
 src/MNH/resolved_cloud.f90  | 53 +++++++++++++++++++------------------
 src/MNH/turb.f90            | 18 ++++++-------
 3 files changed, 43 insertions(+), 46 deletions(-)

diff --git a/src/MNH/advection_metsv.f90 b/src/MNH/advection_metsv.f90
index 93c1b7edb..e5cf670a1 100644
--- a/src/MNH/advection_metsv.f90
+++ b/src/MNH/advection_metsv.f90
@@ -1,6 +1,6 @@
-!MNH_LIC Copyright 1994-2018 CNRS, Meteo-France and Universite Paul Sabatier
+!MNH_LIC Copyright 1994-2020 CNRS, Meteo-France and Universite Paul Sabatier
 !MNH_LIC This is part of the Meso-NH software governed by the CeCILL-C licence
-!MNH_LIC version 1. See LICENSE, CeCILL-C_V1-en.txt and CeCILL-C_V1-fr.txt  
+!MNH_LIC version 1. See LICENSE, CeCILL-C_V1-en.txt and CeCILL-C_V1-fr.txt
 !MNH_LIC for details. version 1.
 !-----------------------------------------------------------------
 !     ###########################
@@ -138,6 +138,7 @@ END MODULE MODI_ADVECTION_METSV
 !!                                      the surface for the blowing snow scheme
 !!                  03/2020 (B.Vie) : LIMA negativity checks after turbulence, advection and 
 !!                                    microphysics budgets 
+!  P. Wautelet 11/06/2020: bugfix: correct PRSVS array indices
 !-------------------------------------------------------------------------------
 !
 !*       0.    DECLARATIONS
@@ -737,19 +738,16 @@ SELECT CASE ( HCLOUD )
      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
+     WHERE (PRRS(:,:,:,2) < 0. .OR. PRSVS(:,:,:,NSV_C2R2BEG+1) < 0.)
+        PRSVS(:,:,:,NSV_C2R2BEG) = 0.0
      END WHERE
      DO JSV = 2, 3
-        WHERE (PRRS(:,:,:,JSV) < 0. .OR. PRSVS(:,:,:,JSV) < 0.)
+        WHERE (PRRS(:,:,:,JSV) < 0. .OR. PRSVS(:,:,:,NSV_C2R2BEG-1+JSV) < 0.)
            PRRS(:,:,:,1) = PRRS(:,:,:,1) + PRRS(:,:,:,JSV)
            PRTHS(:,:,:) = PRTHS(:,:,:) - PRRS(:,:,:,JSV) * ZLV(:,:,:) /  &
                 ZCPH(:,:,:) / ZEXN(:,:,:)
            PRRS(:,:,:,JSV)  = 0.0
-           PRSVS(:,:,:,JSV) = 0.0
+           PRSVS(:,:,:,NSV_C2R2BEG-1+JSV) = 0.0
         END WHERE
      END DO
      !
@@ -790,7 +788,7 @@ SELECT CASE ( HCLOUD )
          END WHERE
       END IF
 !
-      PRSVS(:,:,:,:) = MAX( 0.0,PRSVS(:,:,:,:) )
+      PRSVS(:, :, :, NSV_LIMA_BEG:NSV_LIMA_END) = MAX( 0.0, PRSVS(:, :, :, NSV_LIMA_BEG:NSV_LIMA_END) )
       PRRS(:,:,:,:) = MAX( 0.0,PRRS(:,:,:,:) )
 !
 END SELECT
diff --git a/src/MNH/resolved_cloud.f90 b/src/MNH/resolved_cloud.f90
index 4595a1411..34945c07d 100644
--- a/src/MNH/resolved_cloud.f90
+++ b/src/MNH/resolved_cloud.f90
@@ -270,6 +270,7 @@ END MODULE MODI_RESOLVED_CLOUD
 !!  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
 !!      B.Vié 03/03/2020 : use DTHRAD instead of dT/dt in Smax diagnostic computation
+!  P. Wautelet 11/06/2020: bugfix: correct ZSVS array indices
 !-------------------------------------------------------------------------------
 !
 !*       0.    DECLARATIONS
@@ -723,32 +724,32 @@ SELECT CASE ( HCLOUD )
    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)
+         WHERE (PRS(:,:,:,2) < YRTMIN(2)/PTSTEP .OR. ZSVS(:,:,:,NSV_LIMA_NC-NSV_LIMA_BEG+1) < 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
+            ZSVS(:,:,:,NSV_LIMA_NC-NSV_LIMA_BEG+1) = 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)
+         WHERE (PRS(:,:,:,3) < YRTMIN(3)/PTSTEP .OR. ZSVS(:,:,:,NSV_LIMA_NR-NSV_LIMA_BEG+1) < 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
+            ZSVS(:,:,:,NSV_LIMA_NR-NSV_LIMA_BEG+1) = 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)
+         WHERE (PRS(:,:,:,4) < YRTMIN(4)/PTSTEP .OR. ZSVS(:,:,:,NSV_LIMA_NI-NSV_LIMA_BEG+1) < 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
+            ZSVS(:,:,:,NSV_LIMA_NI-NSV_LIMA_BEG+1) = 0.0
          END WHERE
       END IF
 !
@@ -772,19 +773,19 @@ IF (LBUDGET_RS) CALL BUDGET (PRS(:,:,:,5) * PRHODJ(:,:,:),10,'NEGA_BU_RRS')
 IF (LBUDGET_RG) CALL BUDGET (PRS(:,:,:,6) * PRHODJ(:,:,:),11,'NEGA_BU_RRG')
 IF (LBUDGET_RH) CALL BUDGET (PRS(:,:,:,7) * PRHODJ(:,:,:),12,'NEGA_BU_RRH')
 IF (LBUDGET_SV .AND. (HCLOUD == 'LIMA')) THEN
-   IF (OWARM) CALL BUDGET (ZSVS(:,:,:,NSV_LIMA_NC) * PRHODJ(:,:,:),12+NSV_LIMA_NC,'NEGA_BU_RSV')
-   IF (OWARM.AND.ORAIN) CALL BUDGET (ZSVS(:,:,:,NSV_LIMA_NR) * PRHODJ(:,:,:),12+NSV_LIMA_NR,'NEGA_BU_RSV')
-   IF (LCOLD) CALL BUDGET (ZSVS(:,:,:,NSV_LIMA_NI) * PRHODJ(:,:,:),12+NSV_LIMA_NI,'NEGA_BU_RSV')
+   IF (OWARM) CALL BUDGET (ZSVS(:,:,:,NSV_LIMA_NC-NSV_LIMA_BEG+1) * PRHODJ(:,:,:),12+NSV_LIMA_NC,'NEGA_BU_RSV')
+   IF (OWARM.AND.ORAIN) CALL BUDGET (ZSVS(:,:,:,NSV_LIMA_NR-NSV_LIMA_BEG+1) * PRHODJ(:,:,:),12+NSV_LIMA_NR,'NEGA_BU_RSV')
+   IF (LCOLD) CALL BUDGET (ZSVS(:,:,:,NSV_LIMA_NI-NSV_LIMA_BEG+1) * PRHODJ(:,:,:),12+NSV_LIMA_NI,'NEGA_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,'NEGA_BU_RSV') 
+         CALL BUDGET ( ZSVS(:,:,:,NSV_LIMA_CCN_FREE+JL-NSV_LIMA_BEG)* &
+              PRHODJ(:,:,:),12+NSV_LIMA_CCN_FREE+JL-1,'NEGA_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,'NEGA_BU_RSV') 
+         CALL BUDGET ( ZSVS(:,:,:,NSV_LIMA_IFN_FREE+JL-NSV_LIMA_BEG)* &
+              PRHODJ(:,:,:),12+NSV_LIMA_IFN_FREE+JL-1,'NEGA_BU_RSV')
       END DO
    END IF
 END IF
@@ -1250,32 +1251,32 @@ SELECT CASE ( HCLOUD )
    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)
+         WHERE (PRS(:,:,:,2) < YRTMIN(2)/PTSTEP .OR. ZSVS(:,:,:,NSV_LIMA_NC-NSV_LIMA_BEG+1) < 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
+            ZSVS(:,:,:,NSV_LIMA_NC-NSV_LIMA_BEG+1) = 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)
+         WHERE (PRS(:,:,:,3) < YRTMIN(3)/PTSTEP .OR. ZSVS(:,:,:,NSV_LIMA_NR-NSV_LIMA_BEG+1) < 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
+            ZSVS(:,:,:,NSV_LIMA_NR-NSV_LIMA_BEG+1) = 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)
+         WHERE (PRS(:,:,:,4) < YRTMIN(4)/PTSTEP .OR. ZSVS(:,:,:,NSV_LIMA_NI-NSV_LIMA_BEG+1) < 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
+            ZSVS(:,:,:,NSV_LIMA_NI-NSV_LIMA_BEG+1) = 0.0
          END WHERE
       END IF
 !
@@ -1297,19 +1298,19 @@ 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 (OWARM) CALL BUDGET (ZSVS(:,:,:,NSV_LIMA_NC-NSV_LIMA_BEG+1) * PRHODJ(:,:,:),12+NSV_LIMA_NC,'NECON_BU_RSV')
+   IF (OWARM.AND.ORAIN) CALL BUDGET (ZSVS(:,:,:,NSV_LIMA_NR-NSV_LIMA_BEG+1) * PRHODJ(:,:,:),12+NSV_LIMA_NR,'NECON_BU_RSV')
+   IF (LCOLD) CALL BUDGET (ZSVS(:,:,:,NSV_LIMA_NI-NSV_LIMA_BEG+1) * 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') 
+         CALL BUDGET ( ZSVS(:,:,:,NSV_LIMA_CCN_FREE+JL-NSV_LIMA_BEG)* &
+              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') 
+         CALL BUDGET ( ZSVS(:,:,:,NSV_LIMA_IFN_FREE+JL-NSV_LIMA_BEG)* &
+              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 547a1a573..ac6bbfa34 100644
--- a/src/MNH/turb.f90
+++ b/src/MNH/turb.f90
@@ -1,6 +1,6 @@
-!MNH_LIC Copyright 1994-2018 CNRS, Meteo-France and Universite Paul Sabatier
+!MNH_LIC Copyright 1994-2020 CNRS, Meteo-France and Universite Paul Sabatier
 !MNH_LIC This is part of the Meso-NH software governed by the CeCILL-C licence
-!MNH_LIC version 1. See LICENSE, CeCILL-C_V1-en.txt and CeCILL-C_V1-fr.txt  
+!MNH_LIC version 1. See LICENSE, CeCILL-C_V1-en.txt and CeCILL-C_V1-fr.txt
 !MNH_LIC for details. version 1.
 !-----------------------------------------------------------------
 !    ################ 
@@ -341,6 +341,7 @@ END MODULE MODI_TURB
 !!  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 
+!  P. Wautelet 11/06/2020: bugfix: correct PRSVS array indices
 !! --------------------------------------------------------------------------
 !       
 !*      0. DECLARATIONS
@@ -1165,19 +1166,16 @@ SELECT CASE ( HCLOUD )
      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
+     WHERE (PRRS(:,:,:,2) < 0. .OR. PRSVS(:,:,:,NSV_C2R2BEG+1) < 0.)
+        PRSVS(:,:,:,NSV_C2R2BEG) = 0.0
      END WHERE
      DO JSV = 2, 3
-        WHERE (PRRS(:,:,:,JSV) < 0. .OR. PRSVS(:,:,:,JSV) < 0.)
+        WHERE (PRRS(:,:,:,JSV) < 0. .OR. PRSVS(:,:,:,NSV_C2R2BEG-1+JSV) < 0.)
            PRRS(:,:,:,1) = PRRS(:,:,:,1) + PRRS(:,:,:,JSV)
            PRTHLS(:,:,:) = PRTHLS(:,:,:) - PRRS(:,:,:,JSV) * ZLV(:,:,:) /  &
                 ZCPH(:,:,:) / ZEXNE(:,:,:)
            PRRS(:,:,:,JSV)  = 0.0
-           PRSVS(:,:,:,JSV) = 0.0
+           PRSVS(:,:,:,NSV_C2R2BEG-1+JSV) = 0.0
         END WHERE
      END DO
      !
@@ -1218,7 +1216,7 @@ SELECT CASE ( HCLOUD )
          END WHERE
       END IF
 !
-      PRSVS(:,:,:,:) = MAX( 0.0,PRSVS(:,:,:,:) )
+      PRSVS(:, :, :, NSV_LIMA_BEG:NSV_LIMA_END) = MAX( 0.0, PRSVS(:, :, :, NSV_LIMA_BEG:NSV_LIMA_END) )
       PRRS(:,:,:,:) = MAX( 0.0,PRRS(:,:,:,:) )
 !
 END SELECT
-- 
GitLab