diff --git a/src/MNH/ini_nsv.f90 b/src/MNH/ini_nsv.f90 index ee054b9724cbe770159ffcc7d4c8b6391c4912ca..01d0547f9252de45737bd28f2c9f1ce7cf1ab323 100644 --- a/src/MNH/ini_nsv.f90 +++ b/src/MNH/ini_nsv.f90 @@ -71,6 +71,8 @@ END MODULE MODI_INI_NSV ! P. Wautelet 30/03/2021: move NINDICE_CCN_IMM and NIMM initializations from init_aerosol_properties to ini_nsv ! B. Vie 06/2021: add prognostic supersaturation for LIMA ! P. Wautelet 26/11/2021: initialize TSVLIST_A +! P. Wautelet 14/01/2022: add CSV_CHEM_LIST(_A) to store the list of all chemical variables +! + NSV_CHEM_LIST(_A) the size of the list !------------------------------------------------------------------------------- ! !* 0. DECLARATIONS @@ -141,6 +143,7 @@ CHARACTER(LEN=3) :: YNUM3 CHARACTER(LEN=NCOMMENTLGTMAX) :: YCOMMENT CHARACTER(LEN=NUNITLGTMAX) :: YUNITS INTEGER :: ILUOUT +INTEGER :: ICHIDX ! Index for position in CSV_CHEM_LIST_A array INTEGER :: ISV ! total number of scalar variables INTEGER :: IMODEIDX, IMOMENTS INTEGER :: JI, JJ, JSV @@ -151,6 +154,9 @@ INTEGER :: JMODE, JMOM, JSV_NAME LINI_NSV(KMI) = .TRUE. ILUOUT = TLUOUT%NLU + +ICHIDX = 0 +NSV_CHEM_LIST_A(KMI) = 0 ! ! Users scalar variables are first considered ! @@ -386,6 +392,7 @@ IF (LUSECHEM .AND.(NEQ .GT. 0)) THEN NSV_CHEMBEG_A(KMI)= ISV+1 NSV_CHEMEND_A(KMI)= ISV+NSV_CHEM_A(KMI) ISV = NSV_CHEMEND_A(KMI) + NSV_CHEM_LIST_A(KMI) = NSV_CHEM_LIST_A(KMI) + NSV_CHEM_A(KMI) ELSE NSV_CHEM_A(KMI) = 0 ! force First index to be superior to last index @@ -409,6 +416,7 @@ IF ((LUSECHAQ .OR. LCHAQDIAG).AND.(NEQ .GT. 0)) THEN NSV_CHICBEG_A(KMI)= ISV+1 NSV_CHICEND_A(KMI)= ISV+NSV_CHIC_A(KMI) ISV = NSV_CHICEND_A(KMI) + NSV_CHEM_LIST_A(KMI) = NSV_CHEM_LIST_A(KMI) + NSV_CHIC_A(KMI) ELSE NSV_CHIC_A(KMI) = 0 NSV_CHICBEG_A(KMI)= 1 @@ -447,6 +455,7 @@ IF (LORILAM.AND.(NEQ .GT. 0)) THEN NSV_AERBEG_A(KMI)= ISV+1 NSV_AEREND_A(KMI)= ISV+NSV_AER_A(KMI) ISV = NSV_AEREND_A(KMI) + NSV_CHEM_LIST_A(KMI) = NSV_CHEM_LIST_A(KMI) + NSV_AER_A(KMI) ELSE NSV_AER_A(KMI) = 0 ! force First index to be superior to last index @@ -459,6 +468,7 @@ IF (LORILAM .AND. LDEPOS_AER(KMI)) THEN NSV_AERDEPBEG_A(KMI)= ISV+1 NSV_AERDEPEND_A(KMI)= ISV+NSV_AERDEP_A(KMI) ISV = NSV_AERDEPEND_A(KMI) + NSV_CHEM_LIST_A(KMI) = NSV_CHEM_LIST_A(KMI) + NSV_AERDEP_A(KMI) ELSE NSV_AERDEP_A(KMI) = 0 ! force First index to be superior to last index @@ -484,6 +494,7 @@ IF (LDUST) THEN NSV_DSTBEG_A(KMI)= ISV+1 NSV_DSTEND_A(KMI)= ISV+NSV_DST_A(KMI) ISV = NSV_DSTEND_A(KMI) + NSV_CHEM_LIST_A(KMI) = NSV_CHEM_LIST_A(KMI) + NSV_DST_A(KMI) ELSE NSV_DST_A(KMI) = 0 ! force First index to be superior to last index @@ -496,6 +507,7 @@ IF ( LDUST .AND. LDEPOS_DST(KMI) ) THEN NSV_DSTDEPBEG_A(KMI)= ISV+1 NSV_DSTDEPEND_A(KMI)= ISV+NSV_DSTDEP_A(KMI) ISV = NSV_DSTDEPEND_A(KMI) + NSV_CHEM_LIST_A(KMI) = NSV_CHEM_LIST_A(KMI) + NSV_DSTDEP_A(KMI) ELSE NSV_DSTDEP_A(KMI) = 0 ! force First index to be superior to last index @@ -521,6 +533,7 @@ IF (LSALT) THEN NSV_SLTBEG_A(KMI)= ISV+1 NSV_SLTEND_A(KMI)= ISV+NSV_SLT_A(KMI) ISV = NSV_SLTEND_A(KMI) + NSV_CHEM_LIST_A(KMI) = NSV_CHEM_LIST_A(KMI) + NSV_SLT_A(KMI) ELSE NSV_SLT_A(KMI) = 0 ! force First index to be superior to last index @@ -533,6 +546,7 @@ IF ( LSALT .AND. LDEPOS_SLT(KMI) ) THEN NSV_SLTDEPBEG_A(KMI)= ISV+1 NSV_SLTDEPEND_A(KMI)= ISV+NSV_SLTDEP_A(KMI) ISV = NSV_SLTDEPEND_A(KMI) + NSV_CHEM_LIST_A(KMI) = NSV_CHEM_LIST_A(KMI) + NSV_SLTDEP_A(KMI) ELSE NSV_SLTDEP_A(KMI) = 0 ! force First index to be superior to last index @@ -566,6 +580,7 @@ IF (.NOT.(LUSECHEM.OR.LCHEMDIAG) .AND. (LCH_CONV_LINOX.OR.LLNOX_EXPLICIT)) THEN NSV_LNOXBEG_A(KMI)= ISV+1 NSV_LNOXEND_A(KMI)= ISV+NSV_LNOX_A(KMI) ISV = NSV_LNOXEND_A(KMI) + NSV_CHEM_LIST_A(KMI) = NSV_CHEM_LIST_A(KMI) + NSV_LNOX_A(KMI) ELSE NSV_LNOX_A(KMI) = 0 ! force First index to be superior to last index @@ -997,6 +1012,9 @@ END DO DO JSV = NSV_CHEMBEG_A(KMI), NSV_CHEMEND_A(KMI) CSVNAMES_A(JSV,KMI) = TRIM( CNAMES(JSV-NSV_CHEMBEG_A(KMI)+1) ) + ICHIDX = ICHIDX + 1 + CSV_CHEM_LIST_A(ICHIDX, KMI) = TRIM( CNAMES(JSV-NSV_CHEMBEG_A(KMI)+1) ) + WRITE( YNUM3, '( I3.3 )' ) JSV TSVLIST_A(JSV, KMI) = TFIELDMETADATA( & @@ -1015,6 +1033,9 @@ END DO DO JSV = NSV_CHICBEG_A(KMI), NSV_CHICEND_A(KMI) CSVNAMES_A(JSV,KMI) = TRIM( CICNAMES(JSV-NSV_CHICBEG_A(KMI)+1) ) + ICHIDX = ICHIDX + 1 + CSV_CHEM_LIST_A(ICHIDX, KMI) = TRIM( CICNAMES(JSV-NSV_CHICBEG_A(KMI)+1) ) + WRITE( YNUM3, '( I3.3 )' ) JSV TSVLIST_A(JSV, KMI) = TFIELDMETADATA( & @@ -1033,6 +1054,9 @@ END DO DO JSV = NSV_AERBEG_A(KMI), NSV_AEREND_A(KMI) CSVNAMES_A(JSV,KMI) = TRIM( CAERONAMES(JSV-NSV_AERBEG_A(KMI)+1) ) + ICHIDX = ICHIDX + 1 + CSV_CHEM_LIST_A(ICHIDX, KMI) = TRIM( CAERONAMES(JSV-NSV_AERBEG_A(KMI)+1) ) + WRITE( YNUM3, '( I3.3 )' ) JSV TSVLIST_A(JSV, KMI) = TFIELDMETADATA( & @@ -1051,6 +1075,9 @@ END DO DO JSV = NSV_AERDEPBEG_A(KMI), NSV_AERDEPEND_A(KMI) CSVNAMES_A(JSV,KMI) = TRIM( CDEAERNAMES(JSV-NSV_AERDEPBEG_A(KMI)+1) ) + ICHIDX = ICHIDX + 1 + CSV_CHEM_LIST_A(ICHIDX, KMI) = TRIM( CDEAERNAMES(JSV-NSV_AERDEPBEG_A(KMI)+1) ) + WRITE( YNUM3, '( I3.3 )' ) JSV TSVLIST_A(JSV, KMI) = TFIELDMETADATA( & @@ -1069,6 +1096,9 @@ END DO DO JSV = NSV_DSTBEG_A(KMI), NSV_DSTEND_A(KMI) CSVNAMES_A(JSV,KMI) = TRIM( CDUSTNAMES(JSV-NSV_DSTBEG_A(KMI)+1) ) + ICHIDX = ICHIDX + 1 + CSV_CHEM_LIST_A(ICHIDX, KMI) = TRIM( CDUSTNAMES(JSV-NSV_DSTBEG_A(KMI)+1) ) + WRITE( YNUM3, '( I3.3 )' ) JSV TSVLIST_A(JSV, KMI) = TFIELDMETADATA( & @@ -1087,6 +1117,9 @@ END DO DO JSV = NSV_DSTDEPBEG_A(KMI), NSV_DSTDEPEND_A(KMI) CSVNAMES_A(JSV,KMI) = TRIM( CDEDSTNAMES(JSV-NSV_DSTDEPBEG_A(KMI)+1) ) + ICHIDX = ICHIDX + 1 + CSV_CHEM_LIST_A(ICHIDX, KMI) = TRIM( CDEDSTNAMES(JSV-NSV_DSTDEPBEG_A(KMI)+1) ) + WRITE( YNUM3, '( I3.3 )' ) JSV TSVLIST_A(JSV, KMI) = TFIELDMETADATA( & @@ -1105,6 +1138,9 @@ END DO DO JSV = NSV_SLTBEG_A(KMI), NSV_SLTEND_A(KMI) CSVNAMES_A(JSV,KMI) = TRIM( CSALTNAMES(JSV-NSV_SLTBEG_A(KMI)+1) ) + ICHIDX = ICHIDX + 1 + CSV_CHEM_LIST_A(ICHIDX, KMI) = TRIM( CSALTNAMES(JSV-NSV_SLTBEG_A(KMI)+1) ) + WRITE( YNUM3, '( I3.3 )' ) JSV TSVLIST_A(JSV, KMI) = TFIELDMETADATA( & @@ -1123,6 +1159,9 @@ END DO DO JSV = NSV_SLTDEPBEG_A(KMI), NSV_SLTDEPEND_A(KMI) CSVNAMES_A(JSV,KMI) = TRIM( CDESLTNAMES(JSV-NSV_SLTDEPBEG_A(KMI)+1) ) + ICHIDX = ICHIDX + 1 + CSV_CHEM_LIST_A(ICHIDX, KMI) = TRIM( CDESLTNAMES(JSV-NSV_SLTDEPBEG_A(KMI)+1) ) + WRITE( YNUM3, '( I3.3 )' ) JSV TSVLIST_A(JSV, KMI) = TFIELDMETADATA( & @@ -1164,6 +1203,9 @@ IF ( NSV_LNOX_A(KMI) > 1 ) & DO JSV = NSV_LNOXBEG_A(KMI), NSV_LNOXEND_A(KMI) CSVNAMES_A(JSV,KMI) = 'LINOX' + ICHIDX = ICHIDX + 1 + CSV_CHEM_LIST_A(ICHIDX, KMI) = 'LINOX' + WRITE( YNUM3, '( I3.3 )' ) JSV TSVLIST_A(JSV, KMI) = TFIELDMETADATA( & @@ -1179,4 +1221,7 @@ DO JSV = NSV_LNOXBEG_A(KMI), NSV_LNOXEND_A(KMI) LTIMEDEP = .TRUE. ) END DO +IF ( ICHIDX /= NSV_CHEM_LIST_A(KMI) ) & + CALL Print_msg( NVERB_ERROR, 'GEN', 'INI_NSV', 'ICHIDX /= NSV_CHEM_LIST_A(KMI)' ) + END SUBROUTINE INI_NSV diff --git a/src/MNH/modd_nsv.f90 b/src/MNH/modd_nsv.f90 index 6ab654ead2f5b40e58499ca2110035c796b5150a..03631f3fe5121e9ad589dfee143899050fd5544b 100644 --- a/src/MNH/modd_nsv.f90 +++ b/src/MNH/modd_nsv.f90 @@ -31,15 +31,18 @@ ! P. Wautelet 10/03/2021: add CSVNAMES and CSVNAMES_A to store the name of all the scalar variables ! B. Vie 06/2021: add prognostic supersaturation for LIMA ! P. Wautelet 26/11/2021: add TSVLIST and TSVLIST_A to store the metadata of all the scalar variables +! P. Wautelet 14/01/2022: add CSV_CHEM_LIST(_A) to store the list of all chemical variables +! + NSV_CHEM_LIST(_A) the size of the list !------------------------------------------------------------------------------- ! !* 0. DECLARATIONS ! ------------ ! USE MODD_FIELD, ONLY: tfieldmetadata -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 +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 + NMNHNAMELGTMAX ! IMPLICIT NONE SAVE @@ -49,10 +52,12 @@ REAL,DIMENSION(JPSVMAX) :: XSVMIN ! minimum value for SV variables LOGICAL :: LINI_NSV(JPMODELMAX) = .FALSE. ! becomes True when routine INI_NSV is called ! CHARACTER(LEN=JPSVNAMELGTMAX), DIMENSION(:,:), ALLOCATABLE, TARGET :: CSVNAMES_A !Names of all the scalar variables +CHARACTER(LEN=NMNHNAMELGTMAX), DIMENSION(:,:), ALLOCATABLE, TARGET :: CSV_CHEM_LIST_A !Names of all the chemical variables TYPE(tfieldmetadata), DIMENSION(:,:), ALLOCATABLE, TARGET :: TSVLIST_A !Metadata 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_CHEM_LIST_A = 0 ! total number of chemical variables (including dust, salt...) INTEGER,DIMENSION(JPMODELMAX)::NSV_USER_A = 0 ! number of user scalar variables with ! indices in the range : 1...NSV_USER_A ! @@ -154,12 +159,15 @@ 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=NMNHNAMELGTMAX), DIMENSION(:), POINTER :: CSV_CHEM_LIST !Names of all the chemical variables TYPE(tfieldmetadata), DIMENSION(:), POINTER :: TSVLIST !Metadata 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 ! +INTEGER :: NSV_CHEM_LIST = 0 ! total number of chemical variables (including dust, salt...) +! INTEGER :: NSV_USER = 0 ! number of user scalar variables with indices ! in the range : 1...NSV_USER INTEGER :: NSV_C2R2 = 0 ! number of liq scalar used in C2R2 and in C3R5 diff --git a/src/MNH/update_nsv.f90 b/src/MNH/update_nsv.f90 index 58b3abc9e4eb3641918a0d30e638eeccdf92fbe0..a8bbe8e7baf547de03ad1d6a17637989da614a5a 100644 --- a/src/MNH/update_nsv.f90 +++ b/src/MNH/update_nsv.f90 @@ -28,11 +28,13 @@ END MODULE MODI_UPDATE_NSV ! 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 ! P. Wautelet 26/11/2021: add TSVLIST and TSVLIST_A to store the metadata of all the scalar variables +! P. Wautelet 14/01/2022: add CSV_CHEM_LIST(_A) to store the list of all chemical variables !------------------------------------------------------------------------------- ! -USE MODD_CONF, ONLY: NVERB -USE MODD_FIELD, ONLY: tfieldmetadata +USE MODD_CONF, ONLY: NVERB +USE MODD_FIELD, ONLY: tfieldmetadata USE MODD_NSV +USE MODD_PARAMETERS, ONLY: JPSVNAMELGTMAX, NMNHNAMELGTMAX use mode_msg @@ -41,6 +43,7 @@ IMPLICIT NONE INTEGER, INTENT(IN) :: KMI ! Model index CHARACTER(LEN=JPSVNAMELGTMAX), DIMENSION(:,:), ALLOCATABLE :: YSVNAMES_TMP +CHARACTER(LEN=NMNHNAMELGTMAX), DIMENSION(:,:), ALLOCATABLE :: YSVCHEM_LIST_TMP INTEGER :: JI, JJ TYPE(tfieldmetadata), DIMENSION(:,:), ALLOCATABLE :: YSVLIST_TMP ! @@ -68,6 +71,21 @@ END IF CSVNAMES => CSVNAMES_A(:,KMI) +! Allocate/reallocate CSV_CHEM_LIST_A +IF ( .NOT. ALLOCATED( CSV_CHEM_LIST_A ) ) ALLOCATE( CSV_CHEM_LIST_A( NSV_CHEM_LIST_A(KMI), KMI) ) +!If CSV_CHEM_LIST_A is too small, enlarge it and transfer data +IF ( SIZE( CSV_CHEM_LIST_A, 1 ) < NSV_CHEM_LIST_A(KMI) .OR. SIZE( CSV_CHEM_LIST_A, 2 ) < KMI ) THEN + ALLOCATE( YSVCHEM_LIST_TMP(NSV_CHEM_LIST_A(KMI), KMI) ) + DO JJ = 1, SIZE( CSV_CHEM_LIST_A, 2 ) + DO JI = 1, SIZE( CSV_CHEM_LIST_A, 1 ) + YSVCHEM_LIST_TMP(JI, JJ) = CSV_CHEM_LIST_A(JI, JJ) + END DO + END DO + CALL MOVE_ALLOC( FROM = YSVCHEM_LIST_TMP, TO = CSV_CHEM_LIST_A ) +END IF + +CSV_CHEM_LIST => CSV_CHEM_LIST_A(:,KMI) + ! Allocate/reallocate TSVLIST_A IF ( .NOT. ALLOCATED( TSVLIST_A ) ) ALLOCATE( TSVLIST_A( NSV_A(KMI), KMI) ) !If TSVLIST_A is too small, enlarge it and transfer data