From 5ec6bca08646cb415f5e59583dabb9c7a75bec57 Mon Sep 17 00:00:00 2001
From: Philippe WAUTELET <philippe.wautelet@aero.obs-mip.fr>
Date: Wed, 10 Mar 2021 10:49:05 +0100
Subject: [PATCH] Philippe 10/03/2021: move scalar variable name
 initializations to ini_nsv

---
 src/MNH/ini_nsv.f90      | 117 +++++++++++++++++++++++++++++++++++++--
 src/MNH/ini_prog_var.f90 |  19 +------
 src/MNH/read_exsegn.f90  |  87 +----------------------------
 3 files changed, 116 insertions(+), 107 deletions(-)

diff --git a/src/MNH/ini_nsv.f90 b/src/MNH/ini_nsv.f90
index 14ff53bec..0124c93e9 100644
--- a/src/MNH/ini_nsv.f90
+++ b/src/MNH/ini_nsv.f90
@@ -66,12 +66,13 @@ END MODULE MODI_INI_NSV
 !!      Modification    01/2016  (JP Pinty) Add LIMA and LUSECHEM condition
 !!      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
 !-------------------------------------------------------------------------------
 !
 !*       0.   DECLARATIONS
 !             ------------
 !
-USE MODD_BLOWSNOW,        ONLY: LBLOWSNOW, NBLOWSNOW3D
+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_MNHC_n,       ONLY: LCH_PH, LUSECHEM, LUSECHAQ, LUSECHIC, CCH_SCHEME, LCH_CONV_LINOX
@@ -79,7 +80,8 @@ USE MODD_CONDSAMP,        ONLY: LCONDSAMP, NCONDSAMP
 USE MODD_CONF,            ONLY: LLG, CPROGRAM, NVERB
 USE MODD_CST,             ONLY: XMNH_TINY
 USE MODD_DIAG_FLAG,       ONLY: LCHEMDIAG, LCHAQDIAG
-USE MODD_DUST,            ONLY: LDEPOS_DST, LDSTINIT, LDSTPRES, LDUST, LRGFIX_DST, LVARSIG, NMODE_DST
+USE MODD_DUST,            ONLY: CDEDSTNAMES, CDUSTNAMES, JPDUSTORDER, LDEPOS_DST, LDSTINIT, LDSTPRES, LDUST, &
+                                LRGFIX_DST, LVARSIG, NMODE_DST, YPDEDST_INI, YPDUST_INI
 USE MODD_DYN_n,           ONLY: LHORELAX_SV,LHORELAX_SVC2R2,LHORELAX_SVC1R3,   &
                                 LHORELAX_SVLIMA,                               &
                                 LHORELAX_SVELEC,LHORELAX_SVCHEM,LHORELAX_SVLG, &
@@ -104,8 +106,11 @@ USE MODD_PARAM_LIMA,      ONLY: NMOD_CCN, LSCAV, LAERO_MASS, &
                                 LWARM, LCOLD, LRAIN
 USE MODD_PASPOL,          ONLY: LPASPOL, NRELEASE
 USE MODD_PREP_REAL,       ONLY: XT_LS
-USE MODD_SALT,            ONLY: LRGFIX_SLT, LSALT, LSLTINIT, LSLTPRES, NMODE_SLT, LDEPOS_SLT, LVARSIG_SLT
-!
+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
 !
 IMPLICIT NONE 
@@ -118,8 +123,14 @@ INTEGER, INTENT(IN)             :: KMI ! model index
 !
 !*       0.2   Declarations of local variables
 !
+CHARACTER(LEN=2) :: YNUM2
+CHARACTER(LEN=3) :: YNUM3
+CHARACTER(LEN=JPSVNAMELGTMAX), DIMENSION(:,:), ALLOCATABLE :: YSVNAMES_TMP
 INTEGER :: ILUOUT
 INTEGER :: ISV ! total number of scalar variables
+INTEGER :: IMODEIDX, IMOMENTS
+INTEGER :: JI, JJ, JSV
+INTEGER :: JMODE, JMOM, JSV_NAME
 !
 !-------------------------------------------------------------------------------
 !
@@ -636,5 +647,101 @@ IF (LLG) THEN
   CSV(NSV_LGBEG_A(KMI)+1) = 'Y0     '
   CSV(NSV_LGEND_A(KMI)  ) = 'Z0     '
 ENDIF
-!
+
+! Initialize scalar variable names for dust
+IF ( LDUST ) THEN
+  IF ( NMODE_DST < 1 .OR. NMODE_DST > 3 ) CALL Print_msg( NVERB_FATAL, 'GEN', 'INI_NSV', 'NMODE_DST must in the 1 to 3 interval' )
+
+  ! Initialization of dust names
+  IF( .NOT. ALLOCATED( CDUSTNAMES ) ) THEN
+    IMOMENTS = ( NSV_DSTEND_A(KMI) - NSV_DSTBEG_A(KMI) + 1 ) / NMODE_DST
+    ALLOCATE( CDUSTNAMES(IMOMENTS * NMODE_DST) )
+    !Loop on all dust modes
+    IF ( IMOMENTS == 1 ) THEN
+      DO JMODE = 1, NMODE_DST
+        IMODEIDX = JPDUSTORDER(JMODE)
+        JSV_NAME = ( IMODEIDX - 1 ) * 3 + 2
+        CDUSTNAMES(JMODE) = YPDUST_INI(JSV_NAME)
+      END DO
+    ELSE
+      DO JMODE = 1,NMODE_DST
+        !Find which mode we are dealing with
+        IMODEIDX = JPDUSTORDER(JMODE)
+        DO JMOM = 1, IMOMENTS
+          !Find which number this is of the list of scalars
+          JSV = ( JMODE - 1 ) * IMOMENTS + JMOM
+          !Find what name this corresponds to, always 3 moments assumed in YPDUST_INI
+          JSV_NAME = ( IMODEIDX - 1) * 3 + JMOM
+          !Get the right CDUSTNAMES which should follow the list of scalars transported in XSVM/XSVT
+          CDUSTNAMES(JSV) = YPDUST_INI(JSV_NAME)
+        ENDDO ! Loop on moments
+      ENDDO    ! Loop on dust modes
+    END IF
+  END IF
+
+  ! Initialization of deposition scheme names
+  IF ( LDEPOS_DST(KMI) ) THEN
+    IF( .NOT. ALLOCATED( CDEDSTNAMES ) ) THEN
+      ALLOCATE( CDEDSTNAMES(NMODE_DST * 2) )
+      DO JMODE = 1, NMODE_DST
+        IMODEIDX = JPDUSTORDER(JMODE)
+        CDEDSTNAMES(JMODE)             = YPDEDST_INI(IMODEIDX)
+        CDEDSTNAMES(NMODE_DST + JMODE) = YPDEDST_INI(NMODE_DST + IMODEIDX)
+      ENDDO
+    END IF
+  END IF
+END IF
+
+! Initialize scalar variable names for salt
+IF ( LSALT ) THEN
+  IF ( NMODE_SLT < 1 .OR. NMODE_SLT > 5 ) CALL Print_msg( NVERB_FATAL, 'GEN', 'INI_NSV', 'NMODE_SLT must in the 1 to 5 interval' )
+
+  IF( .NOT. ALLOCATED( CSALTNAMES ) ) THEN
+    IMOMENTS = ( NSV_SLTEND_A(KMI) - NSV_SLTBEG_A(KMI) + 1 ) / NMODE_SLT
+    ALLOCATE( CSALTNAMES(IMOMENTS * NMODE_SLT) )
+    !Loop on all dust modes
+    IF ( IMOMENTS == 1 ) THEN
+      DO JMODE = 1, NMODE_SLT
+        IMODEIDX = JPSALTORDER(JMODE)
+        JSV_NAME = ( IMODEIDX - 1 ) * 3 + 2
+        CSALTNAMES(JMODE) = YPSALT_INI(JSV_NAME)
+      END DO
+    ELSE
+      DO JMODE = 1, NMODE_SLT
+        !Find which mode we are dealing with
+        IMODEIDX = JPSALTORDER(JMODE)
+        DO JMOM = 1, IMOMENTS
+          !Find which number this is of the list of scalars
+          JSV = ( JMODE - 1 ) * IMOMENTS + JMOM
+          !Find what name this corresponds to, always 3 moments assumed in YPSALT_INI
+          JSV_NAME = ( IMODEIDX - 1 ) * 3 + JMOM
+          !Get the right CSALTNAMES which should follow the list of scalars transported in XSVM/XSVT
+          CSALTNAMES(JSV) = YPSALT_INI(JSV_NAME)
+        ENDDO ! Loop on moments
+      ENDDO    ! Loop on dust modes
+    END IF
+  END IF
+  ! Initialization of deposition scheme
+  IF ( LDEPOS_SLT(KMI) ) THEN
+    IF( .NOT. ALLOCATED( CDESLTNAMES ) ) THEN
+      ALLOCATE( CDESLTNAMES(NMODE_SLT * 2) )
+      DO JMODE = 1, NMODE_SLT
+        IMODEIDX = JPSALTORDER(JMODE)
+        CDESLTNAMES(JMODE)             = YPDESLT_INI(IMODEIDX)
+        CDESLTNAMES(NMODE_SLT + JMODE) = YPDESLT_INI(NMODE_SLT + IMODEIDX)
+      ENDDO
+    ENDIF
+  ENDIF
+END IF
+
+! Initialize scalar variable names for snow
+IF ( LBLOWSNOW ) THEN
+  IF( .NOT. ALLOCATED( CSNOWNAMES ) ) THEN
+    IMOMENTS = ( NSV_SNWEND_A(KMI) - NSV_SNWBEG_A(KMI) + 1 )
+    ALLOCATE( CSNOWNAMES(IMOMENTS) )
+    DO JMOM = 1, IMOMENTS
+      CSNOWNAMES(JMOM) = YPSNOW_INI(JMOM)
+    ENDDO ! Loop on moments
+  END IF
+END IF
 END SUBROUTINE INI_NSV
diff --git a/src/MNH/ini_prog_var.f90 b/src/MNH/ini_prog_var.f90
index cd0210ab8..62b6ee923 100644
--- a/src/MNH/ini_prog_var.f90
+++ b/src/MNH/ini_prog_var.f90
@@ -97,6 +97,7 @@ END MODULE MODI_INI_PROG_VAR
 !  P. Wautelet 14/02/2019: remove CLUOUT/CLUOUT0 and associated variables
 !  P. Wautelet 09/03/2021: simplify allocation of scalar variable names
 !  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
 !-------------------------------------------------------------------------------
 !
 !*       0.    DECLARATIONS
@@ -381,15 +382,6 @@ IF(PRESENT(HCHEMFILE)) THEN
       END DO !JMOD
     END IF !if IMOMENTS   
     IF (LDEPOS_DST(IMI)) THEN   
-      IF(.NOT.ALLOCATED(CDEDSTNAMES)) THEN
-        ALLOCATE(CDEDSTNAMES(NMODE_DST*2))
-        DO JMODE=1,NMODE_DST  
-          IMODEIDX=JPDUSTORDER(JMODE)
-          CDEDSTNAMES(JMODE) = YPDEDST_INI(IMODEIDX)
-          CDEDSTNAMES(NMODE_DST+JMODE) = YPDEDST_INI(NMODE_DST+IMODEIDX)
-        ENDDO
-      ENDIF
-      !
       TZFIELD%CSTDNAME   = ''
       TZFIELD%CUNITS     = 'ppp'
       TZFIELD%CDIR       = 'XY'
@@ -455,15 +447,6 @@ IF(PRESENT(HCHEMFILE)) THEN
     END IF !if IMOMENTS
     !
     IF (LDEPOS_SLT(IMI)) THEN
-      IF(.NOT.ALLOCATED(CDESLTNAMES)) THEN
-        ALLOCATE(CDESLTNAMES(NMODE_SLT*2))
-        DO JMODE=1,NMODE_SLT  
-          IMODEIDX=JPDUSTORDER(JMODE)
-          CDESLTNAMES(JMODE) = YPDESLT_INI(IMODEIDX)
-          CDESLTNAMES(NMODE_SLT+JMODE) = YPDESLT_INI(NMODE_SLT+IMODEIDX)
-        ENDDO
-      ENDIF
-      !
       TZFIELD%CSTDNAME   = ''
       TZFIELD%CUNITS     = 'ppp'
       TZFIELD%CDIR       = 'XY'
diff --git a/src/MNH/read_exsegn.f90 b/src/MNH/read_exsegn.f90
index f8a8740cc..8ad067298 100644
--- a/src/MNH/read_exsegn.f90
+++ b/src/MNH/read_exsegn.f90
@@ -297,7 +297,8 @@ END MODULE MODI_READ_EXSEG_n
 !  Q. Rodier      03/2020: add abort if use of any LHORELAX and cyclic conditions
 !  P. Wautelet 09/03/2021: simplify allocation of scalar variable names
 !  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
+!------------------------------------------------------------------------------
 !
 !*       0.    DECLARATIONS
 !              ------------
@@ -448,8 +449,6 @@ INTEGER :: JS,JCI,JI,JSV       ! Loop indexes
 LOGICAL :: GRELAX              
 LOGICAL :: GFOUND              ! Return code when searching namelist
 !
-INTEGER :: IMOMENTS, JMODE, IMODEIDX, JMOM, JSV_NAME, JMOD, I
-!
 !-------------------------------------------------------------------------------
 !
 !*       1.    READ EXSEG FILE
@@ -1704,44 +1703,7 @@ IF (LDUST) THEN
  !callabortstop
     CALL PRINT_MSG(NVERB_FATAL,'GEN','READ_EXSEG_n','')
   END IF     
-  IF(.NOT.ALLOCATED(CDUSTNAMES)) THEN
-    IMOMENTS = (NSV_DSTEND - NSV_DSTBEG +1 )/NMODE_DST
-    ALLOCATE(CDUSTNAMES(IMOMENTS*NMODE_DST))
-    !Loop on all dust modes
-    IF (IMOMENTS == 1) THEN
-    DO JMODE=1,NMODE_DST
-      IMODEIDX=JPDUSTORDER(JMODE)
-      JSV_NAME = (IMODEIDX - 1)*3 + 2
-      CDUSTNAMES(JMODE) = YPDUST_INI(JSV_NAME)
-    END DO
-    ELSE
-    DO JMODE=1,NMODE_DST  
-      !Find which mode we are dealing with
-      IMODEIDX=JPDUSTORDER(JMODE)
-      DO JMOM=1,IMOMENTS
-        !Find which number this is of the list of scalars
-        JSV = (JMODE-1)*IMOMENTS + JMOM
-        !Find what name this corresponds to, always 3 moments assumed in YPDUST_INI
-        JSV_NAME = (IMODEIDX - 1)*3 + JMOM
-        !Get the right CDUSTNAMES which should follow the list of scalars transported in XSVM/XSVT
-        CDUSTNAMES(JSV) = YPDUST_INI(JSV_NAME)
-      ENDDO ! Loop on moments
-    ENDDO    ! Loop on dust modes
-    END IF 
-  END IF 
-  ! Initialization of deposition scheme
-  IF (LDEPOS_DST(KMI)) THEN
-    IF(.NOT.ALLOCATED(CDEDSTNAMES)) THEN
-      ALLOCATE(CDEDSTNAMES(NMODE_DST*2))
-      DO JMODE=1,NMODE_DST  
-        IMODEIDX=JPDUSTORDER(JMODE)
-        CDEDSTNAMES(JMODE) = YPDEDST_INI(IMODEIDX)
-        CDEDSTNAMES(NMODE_DST+JMODE) = YPDEDST_INI(NMODE_DST+IMODEIDX)
-      ENDDO
-    ENDIF    
-  ENDIF
-
-END IF 
+END IF
 !
 ! Sea Salt case
 !
@@ -1787,42 +1749,6 @@ IF (LSALT) THEN
  !callabortstop
     CALL PRINT_MSG(NVERB_FATAL,'GEN','READ_EXSEG_n','')
   END IF     
-  IF(.NOT.ALLOCATED(CSALTNAMES)) THEN
-    IMOMENTS = (NSV_SLTEND - NSV_SLTBEG +1 )/NMODE_SLT
-    ALLOCATE(CSALTNAMES(IMOMENTS*NMODE_SLT))
-    !Loop on all dust modes
-    IF (IMOMENTS == 1) THEN
-    DO JMODE=1,NMODE_SLT
-      IMODEIDX=JPSALTORDER(JMODE)
-      JSV_NAME = (IMODEIDX - 1)*3 + 2
-      CSALTNAMES(JMODE) = YPSALT_INI(JSV_NAME)
-    END DO
-    ELSE
-    DO JMODE=1,NMODE_SLT  
-      !Find which mode we are dealing with
-      IMODEIDX=JPSALTORDER(JMODE)
-      DO JMOM=1,IMOMENTS
-        !Find which number this is of the list of scalars
-        JSV = (JMODE-1)*IMOMENTS + JMOM
-        !Find what name this corresponds to, always 3 moments assumed in YPSALT_INI
-        JSV_NAME = (IMODEIDX - 1)*3 + JMOM
-        !Get the right CSALTNAMES which should follow the list of scalars transported in XSVM/XSVT
-        CSALTNAMES(JSV) = YPSALT_INI(JSV_NAME)
-      ENDDO ! Loop on moments
-    ENDDO    ! Loop on dust modes
-    END IF
-  END IF 
-  ! Initialization of deposition scheme
-  IF (LDEPOS_SLT(KMI)) THEN
-    IF(.NOT.ALLOCATED(CDESLTNAMES)) THEN
-      ALLOCATE(CDESLTNAMES(NMODE_SLT*2))
-      DO JMODE=1,NMODE_SLT  
-        IMODEIDX=JPSALTORDER(JMODE)
-        CDESLTNAMES(JMODE) = YPDESLT_INI(IMODEIDX)
-        CDESLTNAMES(NMODE_SLT+JMODE) = YPDESLT_INI(NMODE_SLT+IMODEIDX)
-      ENDDO
-    ENDIF    
-  ENDIF
 END IF 
 !
 ! Orilam SV case
@@ -1958,13 +1884,6 @@ IF (LBLOWSNOW) THEN
          & "THE BLOWING SNOW VARIABLES HAVE BEEN INITIALIZED TO ZERO ")')
     CGETSVT(NSV_SNWBEG:NSV_SNWEND)='INIT'
   END IF
-  IF(.NOT.ALLOCATED(CSNOWNAMES)) THEN
-    IMOMENTS = (NSV_SNWEND - NSV_SNWBEG +1 )
-    ALLOCATE(CSNOWNAMES(IMOMENTS))
-    DO JMOM=1,IMOMENTS
-      CSNOWNAMES(JMOM) = YPSNOW_INI(JMOM)
-    ENDDO ! Loop on moments
-  END IF
 END IF
 !
 !
-- 
GitLab