From f84e94e81d7c09d935c02a489120543376793ab5 Mon Sep 17 00:00:00 2001
From: Philippe WAUTELET <philippe.wautelet@aero.obs-mip.fr>
Date: Wed, 10 Mar 2021 14:06:13 +0100
Subject: [PATCH] Philippe 10/03/2021: add CSVNAMES and CSVNAMES_A to store the
 name of all the scalar variables

---
 src/MNH/ini_nsv.f90    | 144 +++++++++++++++++++++++++++++++++++++++--
 src/MNH/modd_nsv.f90   |  15 +++--
 src/MNH/update_nsv.f90 |   6 +-
 3 files changed, 153 insertions(+), 12 deletions(-)

diff --git a/src/MNH/ini_nsv.f90 b/src/MNH/ini_nsv.f90
index 0124c93e9..3af5e4c35 100644
--- a/src/MNH/ini_nsv.f90
+++ b/src/MNH/ini_nsv.f90
@@ -67,14 +67,16 @@ END MODULE MODI_INI_NSV
 !!      Modification    07/2017  (V. Vionnet) Add blowing snow condition
 !  P. Wautelet 09/03/2021: move some chemistry initializations to ini_nsv
 !  P. Wautelet 10/03/2021: move scalar variable name initializations to ini_nsv
+!  P. Wautelet 10/03/2021: add CSVNAMES and CSVNAMES_A to store the name of all the scalar variables
 !-------------------------------------------------------------------------------
 !
 !*       0.   DECLARATIONS
 !             ------------
 !
 USE MODD_BLOWSNOW,        ONLY: CSNOWNAMES, LBLOWSNOW, NBLOWSNOW3D, YPSNOW_INI
-USE MODD_CH_AEROSOL,      ONLY: JPMODE, LAERINIT, LDEPOS_AER, LORILAM, LVARSIGI, LVARSIGJ, NCARB, NM6_AER, NSOA, NSP
-USE MODD_CH_M9_n,         ONLY: NEQ, NEQAQ
+USE MODD_CH_AEROSOL,      ONLY: CAERONAMES, CDEAERNAMES, JPMODE, LAERINIT, LDEPOS_AER, LORILAM, &
+                                LVARSIGI, LVARSIGJ, NCARB, NM6_AER, NSOA, NSP
+USE MODD_CH_M9_n,         ONLY: CICNAMES, CNAMES, NEQ, NEQAQ
 USE MODD_CH_MNHC_n,       ONLY: LCH_PH, LUSECHEM, LUSECHAQ, LUSECHIC, CCH_SCHEME, LCH_CONV_LINOX
 USE MODD_CONDSAMP,        ONLY: LCONDSAMP, NCONDSAMP
 USE MODD_CONF,            ONLY: LLG, CPROGRAM, NVERB
@@ -96,22 +98,28 @@ USE MODD_ELEC_DESCR,      ONLY: CELECNAMES
 #ifdef MNH_FOREFIRE
 USE MODD_FOREFIRE
 #endif
-USE MODD_PARAM_n,         ONLY: CCLOUD, CELEC
-USE MODD_LG,              ONLY: XLG1MIN, XLG2MIN, XLG3MIN
+USE MODD_ICE_C1R3_DESCR,  ONLY: C1R3NAMES
+USE MODD_LG,              ONLY: CLGNAMES, XLG1MIN, XLG2MIN, XLG3MIN
 USE MODD_LUNIT_n,         ONLY: TLUOUT
 USE MODD_NSV
 USE MODD_PARAM_C2R2,      ONLY: LSUPSAT
-USE MODD_PARAM_LIMA,      ONLY: NMOD_CCN, LSCAV, LAERO_MASS, &
+USE MODD_PARAM_LIMA,      ONLY: NINDICE_CCN_IMM, NMOD_CCN, LSCAV, LAERO_MASS, &
                                 NMOD_IFN, NMOD_IMM, LHHONI,  &
                                 LWARM, LCOLD, LRAIN
+USE MODD_PARAM_LIMA_COLD, ONLY: CLIMA_COLD_NAMES
+USE MODD_PARAM_LIMA_WARM, ONLY: CAERO_MASS, CLIMA_WARM_NAMES
+USE MODD_PARAM_n,         ONLY: CCLOUD, CELEC
 USE MODD_PASPOL,          ONLY: LPASPOL, NRELEASE
 USE MODD_PREP_REAL,       ONLY: XT_LS
+USE MODD_RAIN_C2R2_DESCR, ONLY: C2R2NAMES
 USE MODD_SALT,            ONLY: CSALTNAMES, CDESLTNAMES, JPSALTORDER, &
                                 LRGFIX_SLT, LSALT, LSLTINIT, LSLTPRES, LDEPOS_SLT, LVARSIG_SLT, NMODE_SLT, YPDESLT_INI, YPSALT_INI
 
 USE MODE_MSG
 
-USE MODI_UPDATE_NSV,      ONLY: UPDATE_NSV
+USE MODI_CH_AER_INIT_SOA,  ONLY: CH_AER_INIT_SOA
+USE MODI_CH_INIT_SCHEME_n, ONLY: CH_INIT_SCHEME_n
+USE MODI_UPDATE_NSV,       ONLY: UPDATE_NSV
 !
 IMPLICIT NONE 
 !
@@ -744,4 +752,128 @@ IF ( LBLOWSNOW ) THEN
     ENDDO ! Loop on moments
   END IF
 END IF
+
+! Allocate/reallocate CSVNAMES_A
+IF ( .NOT. ALLOCATED( CSVNAMES_A ) ) ALLOCATE( CSVNAMES_A( NSV, KMI) )
+IF ( SIZE( CSVNAMES_A, 1 ) < NSV .OR. SIZE( CSVNAMES_A, 2 ) < KMI ) THEN
+  ALLOCATE( YSVNAMES_TMP(NSV, KMI) )
+  DO JJ = 1, SIZE( CSVNAMES_A, 2 )
+    DO JI = 1, SIZE( CSVNAMES_A, 1 )
+      YSVNAMES_TMP(JI, JJ) = CSVNAMES_A(JI, JJ)
+    END DO
+  END DO
+  CALL MOVE_ALLOC( FROM = YSVNAMES_TMP, TO = CSVNAMES_A )
+END IF
+
+!Fill CSVNAMES_A for model KMI
+DO JSV = 1, NSV_USER_A(KMI)
+  WRITE( YNUM3, '( I3.3 )' ) JSV
+  CSVNAMES_A(JSV,KMI) = 'SVUSER'//YNUM3
+END DO
+
+DO JSV = NSV_C2R2BEG_A(KMI), NSV_C2R2END_A(KMI)
+  CSVNAMES_A(JSV,KMI) = TRIM( C2R2NAMES(JSV-NSV_C2R2BEG_A(KMI)+1) )
+END DO
+
+DO JSV = NSV_C1R3BEG_A(KMI), NSV_C1R3END_A(KMI)
+  CSVNAMES_A(JSV,KMI) = TRIM( C1R3NAMES(JSV-NSV_C1R3BEG_A(KMI)+1) )
+END DO
+
+DO JSV = NSV_LIMA_BEG_A(KMI), NSV_LIMA_END_A(KMI)
+  IF ( JSV == NSV_LIMA_NC_A(KMI) ) THEN
+    CSVNAMES_A(JSV,KMI) = TRIM( CLIMA_WARM_NAMES(1) )
+  ELSE IF ( JSV == NSV_LIMA_NR_A(KMI) ) THEN
+    CSVNAMES_A(JSV,KMI) = TRIM( CLIMA_WARM_NAMES(2) )
+  ELSE IF ( JSV >= NSV_LIMA_CCN_FREE_A(KMI) .AND. JSV < NSV_LIMA_CCN_ACTI_A(KMI) ) THEN
+    WRITE( YNUM2, '( I2.2 )' ) JSV - NSV_LIMA_CCN_FREE_A(KMI) + 1
+    CSVNAMES_A(JSV,KMI) = TRIM( CLIMA_WARM_NAMES(3) ) // YNUM2
+  ELSE IF (JSV >= NSV_LIMA_CCN_ACTI_A(KMI) .AND. JSV < ( NSV_LIMA_CCN_ACTI_A(KMI) + NMOD_CCN ) ) THEN
+    WRITE( YNUM2, '( I2.2 )' ) JSV - NSV_LIMA_CCN_ACTI_A(KMI) + 1
+    CSVNAMES_A(JSV,KMI) = TRIM( CLIMA_WARM_NAMES(4) ) // YNUM2
+  ELSE IF ( JSV == NSV_LIMA_SCAVMASS_A(KMI) ) THEN
+    CSVNAMES_A(JSV,KMI) = TRIM( CAERO_MASS(1) )
+  ELSE IF ( JSV == NSV_LIMA_NI_A(KMI) ) THEN
+    CSVNAMES_A(JSV,KMI) = TRIM( CLIMA_COLD_NAMES(1) )
+  ELSE IF ( JSV >= NSV_LIMA_IFN_FREE_A(KMI) .AND. JSV < NSV_LIMA_IFN_NUCL_A(KMI) ) THEN
+    WRITE( YNUM2, '( I2.2 )' ) JSV - NSV_LIMA_IFN_FREE_A(KMI) + 1
+    CSVNAMES_A(JSV,KMI) = TRIM( CLIMA_COLD_NAMES(2) ) // YNUM2
+  ELSE IF ( JSV >= NSV_LIMA_IFN_NUCL_A(KMI) .AND. JSV < ( NSV_LIMA_IFN_NUCL_A(KMI) + NMOD_IFN ) ) THEN
+    WRITE( YNUM2, '( I2.2 )' ) JSV - NSV_LIMA_IFN_NUCL_A(KMI) + 1
+    CSVNAMES_A(JSV,KMI) = TRIM( CLIMA_COLD_NAMES(3) ) // YNUM2
+  ELSE IF ( JSV >= NSV_LIMA_IMM_NUCL_A(KMI) .AND. JSV < ( NSV_LIMA_IMM_NUCL_A(KMI) + NMOD_IMM ) ) THEN
+    WRITE( YNUM2, '( I2.2 )' ) NINDICE_CCN_IMM(JSV-NSV_LIMA_IMM_NUCL_A(KMI)+1)
+    CSVNAMES_A(JSV,KMI) = TRIM( CLIMA_COLD_NAMES(4) ) // YNUM2
+  ELSE IF ( JSV == NSV_LIMA_HOM_HAZE_A(KMI) ) THEN
+    CSVNAMES_A(JSV,KMI) = TRIM( CLIMA_COLD_NAMES(5) )
+  ELSE
+    CALL Print_msg( NVERB_FATAL, 'GEN', 'INI_NSV', 'invalid index for LIMA' )
+  END IF
+END DO
+
+DO JSV = NSV_ELECBEG_A(KMI), NSV_ELECEND_A(KMI)
+  CSVNAMES_A(JSV,KMI) = TRIM( CELECNAMES(JSV-NSV_ELECBEG_A(KMI)+1) )
+END DO
+
+DO JSV = NSV_LGBEG_A(KMI), NSV_LGEND_A(KMI)
+  CSVNAMES_A(JSV,KMI) = TRIM( CLGNAMES(JSV-NSV_LGBEG_A(KMI)+1) )
+END DO
+
+DO JSV = NSV_PPBEG_A(KMI), NSV_PPEND_A(KMI)
+  WRITE( YNUM3, '( I3.3 )' ) JSV-NSV_PPBEG_A(KMI)+1
+  CSVNAMES_A(JSV,KMI) = 'SVPP'//YNUM3
+END DO
+
+#ifdef MNH_FOREFIRE
+DO JSV = NSV_FFBEG_A(KMI), NSV_FFEND_A(KMI)
+  WRITE( YNUM3, '( I3.3 )' ) JSV-NSV_FFBEG_A(KMI)+1
+  CSVNAMES_A(JSV,KMI) = 'SVFF'//YNUM3
+END DO
+#endif
+
+DO JSV = NSV_CSBEG_A(KMI), NSV_CSEND_A(KMI)
+  WRITE( YNUM3, '( I3.3 )' ) JSV-NSV_CSBEG_A(KMI)
+  CSVNAMES_A(JSV,KMI) = 'SVCS'//YNUM3
+END DO
+
+DO JSV = NSV_CHEMBEG_A(KMI), NSV_CHEMEND_A(KMI)
+  CSVNAMES_A(JSV,KMI) = TRIM( CNAMES(JSV-NSV_CHEMBEG_A(KMI)+1) )
+END DO
+
+DO JSV = NSV_CHICBEG_A(KMI), NSV_CHICEND_A(KMI)
+  CSVNAMES_A(JSV,KMI) = TRIM( CICNAMES(JSV-NSV_CHICBEG_A(KMI)+1) )
+END DO
+
+DO JSV = NSV_AERBEG_A(KMI), NSV_AEREND_A(KMI)
+  CSVNAMES_A(JSV,KMI) = TRIM( CAERONAMES(JSV-NSV_AERBEG_A(KMI)+1) )
+END DO
+
+DO JSV = NSV_AERDEPBEG_A(KMI), NSV_AERDEPEND_A(KMI)
+  CSVNAMES_A(JSV,KMI) = TRIM( CDEAERNAMES(JSV-NSV_AERDEPBEG_A(KMI)+1) )
+END DO
+
+DO JSV = NSV_DSTBEG_A(KMI), NSV_DSTEND_A(KMI)
+  CSVNAMES_A(JSV,KMI) = TRIM( CDUSTNAMES(JSV-NSV_DSTBEG_A(KMI)+1) )
+END DO
+
+DO JSV = NSV_DSTDEPBEG_A(KMI), NSV_DSTDEPEND_A(KMI)
+  CSVNAMES_A(JSV,KMI) = TRIM( CDEDSTNAMES(JSV-NSV_DSTDEPBEG_A(KMI)+1) )
+END DO
+
+DO JSV = NSV_SLTBEG_A(KMI), NSV_SLTEND_A(KMI)
+  CSVNAMES_A(JSV,KMI) = TRIM( CSALTNAMES(JSV-NSV_SLTBEG_A(KMI)+1) )
+END DO
+
+DO JSV = NSV_SLTDEPBEG_A(KMI), NSV_SLTDEPEND_A(KMI)
+  CSVNAMES_A(JSV,KMI) = TRIM( CDESLTNAMES(JSV-NSV_SLTDEPBEG_A(KMI)+1) )
+END DO
+
+DO JSV = NSV_SNWBEG_A(KMI), NSV_SNWEND_A(KMI)
+  CSVNAMES_A(JSV,KMI) = TRIM( CSNOWNAMES(JSV-NSV_SNWBEG_A(KMI)+1) )
+END DO
+
+DO JSV = NSV_LNOXBEG_A(KMI), NSV_LNOXEND_A(KMI)
+  WRITE( YNUM3, '( I3.3 )' ) JSV-NSV_LNOXBEG_A(KMI)+1
+  CSVNAMES_A(JSV,KMI) = 'SVLNOX'//YNUM3
+END DO
+
 END SUBROUTINE INI_NSV
diff --git a/src/MNH/modd_nsv.f90 b/src/MNH/modd_nsv.f90
index 2417f728a..50e18d615 100644
--- a/src/MNH/modd_nsv.f90
+++ b/src/MNH/modd_nsv.f90
@@ -1,7 +1,8 @@
-!MNH_LIC Copyright 1994-2014 CNRS, Meteo-France and Universite Paul Sabatier
+!MNH_LIC Copyright 2001-2021 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.
+!-------------------------------------------------------------------------------
 !        ###############
          MODULE MODD_NSV
 !        ###############
@@ -27,14 +28,15 @@
 !!       Pialat/Tulet  15/02/12 add ForeFire
 !!      Modification    01/2016  (JP Pinty) Add LIMA
 !!       V. Vionnet     07/17   add blowing snow
-!!
+!  P. Wautelet 10/03/2021: add CSVNAMES and CSVNAMES_A to store the name of all the scalar variables
 !-------------------------------------------------------------------------------
 !
 !*       0.   DECLARATIONS
 !             ------------
 !
-USE MODD_PARAMETERS, ONLY : JPMODELMAX,& ! Maximum allowed number of nested models
-                            JPSVMAX      ! Maximum number of scalar variables
+USE MODD_PARAMETERS, ONLY : JPMODELMAX, &  ! Maximum allowed number of nested models
+                            JPSVMAX,    &  ! Maximum number of scalar variables
+                            JPSVNAMELGTMAX ! Maximum length of a scalar variable name
 !
 IMPLICIT NONE
 SAVE
@@ -43,6 +45,8 @@ REAL,DIMENSION(JPSVMAX) :: XSVMIN ! minimum value for SV variables
 !
 LOGICAL :: LINI_NSV = .FALSE. ! becomes True when routine INI_NSV is called
 !
+CHARACTER(LEN=JPSVNAMELGTMAX), DIMENSION(:,:), ALLOCATABLE, TARGET :: CSVNAMES_A !Names of all the scalar variables
+
 INTEGER,DIMENSION(JPMODELMAX)::NSV_A = 0 ! total number of scalar variables
                                          ! NSV_A = NSV_USER_A+NSV_C2R2_A+NSV_CHEM_A+..
 INTEGER,DIMENSION(JPMODELMAX)::NSV_USER_A = 0  ! number of user scalar variables with 
@@ -144,6 +148,7 @@ INTEGER,DIMENSION(JPMODELMAX)::NSV_SNWEND_A = 0 ! NSV_SNWBEG_A...NSV_SNWEND_A
 !
 ! variables updated for the current model
 !
+CHARACTER(LEN=JPSVNAMELGTMAX), DIMENSION(:), POINTER :: CSVNAMES !Names of all the scalar variables
 CHARACTER(LEN=6), DIMENSION(:), ALLOCATABLE :: CSV ! name of the scalar variables
 INTEGER :: NSV         = 0 ! total number of user scalar variables
 !
diff --git a/src/MNH/update_nsv.f90 b/src/MNH/update_nsv.f90
index 3d691aa48..807307a81 100644
--- a/src/MNH/update_nsv.f90
+++ b/src/MNH/update_nsv.f90
@@ -1,4 +1,4 @@
-!MNH_LIC Copyright 1994-2019 CNRS, Meteo-France and Universite Paul Sabatier
+!MNH_LIC Copyright 2001-2021 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 for details. version 1.
@@ -26,6 +26,8 @@ END MODULE MODI_UPDATE_NSV
 !!  Modify (Vie) 2016 : add LIMA
 !!         V. Vionnet 7/2017 : add blowing snow var
 !  P. Wautelet 10/04/2019: replace ABORT and STOP calls by Print_msg
+!  P. Wautelet 10/03/2021: add CSVNAMES and CSVNAMES_A to store the name of all the scalar variables
+!-------------------------------------------------------------------------------
 !
 USE MODD_CONF, ONLY : NVERB
 USE MODD_NSV
@@ -44,6 +46,8 @@ END IF
 ! Update the NSV_* variables from original NSV_*_A arrays
 ! that have been initialized in ini_nsv.f90 for model KMI
 !
+CSVNAMES => CSVNAMES_A(:,KMI)
+
 NSV         = NSV_A(KMI)
 NSV_USER    = NSV_USER_A(KMI)
 NSV_C2R2    = NSV_C2R2_A(KMI)
-- 
GitLab