Newer
Older

WAUTELET Philippe
committed
!MNH_LIC Copyright 2001-2023 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.
!-----------------------------------------------------------------
! ######spl
MODULE MODI_UPDATE_NSV
! ######################
!
INTERFACE
SUBROUTINE UPDATE_NSV(KMI)
INTEGER, INTENT(IN) :: KMI ! Model index
END SUBROUTINE UPDATE_NSV
!
END INTERFACE
END MODULE MODI_UPDATE_NSV
! ######spl
SUBROUTINE UPDATE_NSV(KMI)
! ##########################
!!**** *UPDATE_NSV* - routine that updates the NSV_* variables for the
!! current model. It is intended to be called from
!! any MesoNH routine WITH or WITHOUT $n before using
!! the NSV_* variables.
!! Modify (Escobar ) 2/2014 : add Forefire var
!! V. Vionnet 7/2017 : add blowing snow var
! P. Wautelet 10/04/2019: replace ABORT and STOP calls by Print_msg

WAUTELET Philippe
committed
! P. Wautelet 26/11/2021: add TSVLIST and TSVLIST_A to store the metadata of all the scalar variables

WAUTELET Philippe
committed
! P. Wautelet 14/01/2022: add CSV_CHEM_LIST(_A) to store the list of all chemical variables

WAUTELET Philippe
committed
! P. Wautelet 20/02/2023: manage CSV(_A) + bugfix: reallocate size was wrong in some scenarii

WAUTELET Philippe
committed
!-------------------------------------------------------------------------------

WAUTELET Philippe
committed
USE MODD_CONF, ONLY: NVERB
USE MODD_FIELD, ONLY: tfieldmetadata

WAUTELET Philippe
committed
USE MODD_PARAMETERS, ONLY: JPSVNAMELGTMAX, NMNHNAMELGTMAX
use mode_msg
INTEGER, INTENT(IN) :: KMI ! Model index

WAUTELET Philippe
committed
CHARACTER(LEN=JPSVNAMELGTMAX), DIMENSION(:,:), ALLOCATABLE :: YSVNAMES_TMP

WAUTELET Philippe
committed
CHARACTER(LEN=6), DIMENSION(:,:), ALLOCATABLE :: YSV_TMP

WAUTELET Philippe
committed
CHARACTER(LEN=NMNHNAMELGTMAX), DIMENSION(:,:), ALLOCATABLE :: YSVCHEM_LIST_TMP

WAUTELET Philippe
committed
INTEGER :: JI, JJ

WAUTELET Philippe
committed
TYPE(tfieldmetadata), DIMENSION(:,:), ALLOCATABLE :: YSVLIST_TMP
!
! STOP if INI_NSV has not be called yet
IF ( .NOT. LINI_NSV(KMI) ) THEN
call Print_msg( NVERB_FATAL, 'GEN', 'UPDATE_NSV', 'can not continue because INI_NSV was not called' )
END IF
!
! Update the NSV_* variables from original NSV_*_A arrays
! that have been initialized in ini_nsv.f90 for model KMI
!

WAUTELET Philippe
committed

WAUTELET Philippe
committed
! 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

WAUTELET Philippe
committed
ALLOCATE( YSVCHEM_LIST_TMP( MAX( SIZE(CSV_CHEM_LIST_A,1), NSV_CHEM_LIST_A(KMI) ), MAX( SIZE(CSV_CHEM_LIST_A,2), KMI ) ) )

WAUTELET Philippe
committed
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)

WAUTELET Philippe
committed
END DO
END DO

WAUTELET Philippe
committed
CALL MOVE_ALLOC( FROM = YSVCHEM_LIST_TMP, TO = CSV_CHEM_LIST_A )

WAUTELET Philippe
committed
END IF

WAUTELET Philippe
committed
CSV_CHEM_LIST => CSV_CHEM_LIST_A(:,KMI)

WAUTELET Philippe
committed
! Allocate/reallocate CSV_A
IF ( .NOT. ALLOCATED( CSV_A ) ) ALLOCATE( CSV_A( NSV_A(KMI), KMI) )
!If CSV_A is too small, enlarge it and transfer data
IF ( SIZE( CSV_A, 1 ) < NSV_A(KMI) .OR. SIZE( CSV_A, 2 ) < KMI ) THEN
ALLOCATE( YSV_TMP( MAX( SIZE(CSV_A,1), NSV_A(KMI) ), MAX( SIZE(CSV_A,2), KMI ) ) )
DO JJ = 1, SIZE( CSV_A, 2 )
DO JI = 1, SIZE( CSV_A, 1 )
YSV_TMP(JI, JJ) = CSV_A(JI, JJ)
END DO
END DO
CALL MOVE_ALLOC( FROM = YSV_TMP, TO = CSV_A )
END IF
CSV => CSV_A(:,KMI)

WAUTELET Philippe
committed
! 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
IF ( SIZE( TSVLIST_A, 1 ) < NSV_A(KMI) .OR. SIZE( TSVLIST_A, 2 ) < KMI ) THEN

WAUTELET Philippe
committed
ALLOCATE( YSVLIST_TMP( MAX( SIZE(TSVLIST_A,1), NSV_A(KMI) ), MAX( SIZE(TSVLIST_A,2), KMI ) ) )

WAUTELET Philippe
committed
DO JJ = 1, SIZE( TSVLIST_A, 2 )
DO JI = 1, SIZE( TSVLIST_A, 1 )
YSVLIST_TMP(JI, JJ) = TSVLIST_A(JI, JJ)
END DO
END DO
CALL MOVE_ALLOC( FROM = YSVLIST_TMP, TO = TSVLIST_A )
END IF
TSVLIST => TSVLIST_A(:,KMI)

WAUTELET Philippe
committed
NSV = NSV_A(KMI)
NSV_USER = NSV_USER_A(KMI)
NSV_C2R2 = NSV_C2R2_A(KMI)
NSV_C2R2BEG = NSV_C2R2BEG_A(KMI)
NSV_C2R2END = NSV_C2R2END_A(KMI)
NSV_C1R3 = NSV_C1R3_A(KMI)
NSV_C1R3BEG = NSV_C1R3BEG_A(KMI)
NSV_C1R3END = NSV_C1R3END_A(KMI)
!
NSV_LIMA = NSV_LIMA_A(KMI)
NSV_LIMA_BEG = NSV_LIMA_BEG_A(KMI)
NSV_LIMA_END = NSV_LIMA_END_A(KMI)
NSV_LIMA_NC = NSV_LIMA_NC_A(KMI)
NSV_LIMA_NR = NSV_LIMA_NR_A(KMI)
NSV_LIMA_CCN_FREE = NSV_LIMA_CCN_FREE_A(KMI)
NSV_LIMA_CCN_ACTI = NSV_LIMA_CCN_ACTI_A(KMI)
NSV_LIMA_SCAVMASS = NSV_LIMA_SCAVMASS_A(KMI)
NSV_LIMA_NI = NSV_LIMA_NI_A(KMI)
NSV_LIMA_NS = NSV_LIMA_NS_A(KMI)
NSV_LIMA_NG = NSV_LIMA_NG_A(KMI)
NSV_LIMA_NH = NSV_LIMA_NH_A(KMI)
NSV_LIMA_IFN_FREE = NSV_LIMA_IFN_FREE_A(KMI)
NSV_LIMA_IFN_NUCL = NSV_LIMA_IFN_NUCL_A(KMI)
NSV_LIMA_IMM_NUCL = NSV_LIMA_IMM_NUCL_A(KMI)
NSV_LIMA_HOM_HAZE = NSV_LIMA_HOM_HAZE_A(KMI)
NSV_LIMA_SPRO = NSV_LIMA_SPRO_A(KMI)
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
NSV_ELEC = NSV_ELEC_A(KMI)
NSV_ELECBEG = NSV_ELECBEG_A(KMI)
NSV_ELECEND = NSV_ELECEND_A(KMI)
NSV_CHEM = NSV_CHEM_A(KMI)
NSV_CHEMBEG = NSV_CHEMBEG_A(KMI)
NSV_CHEMEND = NSV_CHEMEND_A(KMI)
NSV_CHGS = NSV_CHGS_A(KMI)
NSV_CHGSBEG = NSV_CHGSBEG_A(KMI)
NSV_CHGSEND = NSV_CHGSEND_A(KMI)
NSV_CHAC = NSV_CHAC_A(KMI)
NSV_CHACBEG = NSV_CHACBEG_A(KMI)
NSV_CHACEND = NSV_CHACEND_A(KMI)
NSV_CHIC = NSV_CHIC_A(KMI)
NSV_CHICBEG = NSV_CHICBEG_A(KMI)
NSV_CHICEND = NSV_CHICEND_A(KMI)
NSV_LNOX = NSV_LNOX_A(KMI)
NSV_LNOXBEG = NSV_LNOXBEG_A(KMI)
NSV_LNOXEND = NSV_LNOXEND_A(KMI)
NSV_DST = NSV_DST_A(KMI)
NSV_DSTBEG = NSV_DSTBEG_A(KMI)
NSV_DSTEND = NSV_DSTEND_A(KMI)
NSV_DSTDEP = NSV_DSTDEP_A(KMI)
NSV_DSTDEPBEG = NSV_DSTDEPBEG_A(KMI)
NSV_DSTDEPEND = NSV_DSTDEPEND_A(KMI)
NSV_SLT = NSV_SLT_A(KMI)
NSV_SLTBEG = NSV_SLTBEG_A(KMI)
NSV_SLTEND = NSV_SLTEND_A(KMI)
NSV_SLTDEPBEG = NSV_SLTDEPBEG_A(KMI)
NSV_SLTDEPEND = NSV_SLTDEPEND_A(KMI)
NSV_AER = NSV_AER_A(KMI)
NSV_AERBEG = NSV_AERBEG_A(KMI)
NSV_AEREND = NSV_AEREND_A(KMI)
NSV_AERDEPBEG = NSV_AERDEPBEG_A(KMI)
NSV_AERDEPEND = NSV_AERDEPEND_A(KMI)
NSV_LG = NSV_LG_A(KMI)
NSV_LGBEG = NSV_LGBEG_A(KMI)
NSV_LGEND = NSV_LGEND_A(KMI)
NSV_PP = NSV_PP_A(KMI)
NSV_PPBEG = NSV_PPBEG_A(KMI)
NSV_PPEND = NSV_PPEND_A(KMI)
#ifdef MNH_FOREFIRE
NSV_FF = NSV_FF_A(KMI)
NSV_FFBEG = NSV_FFBEG_A(KMI)
NSV_FFEND = NSV_FFEND_A(KMI)
#endif
NSV_FIRE = NSV_FIRE_A(KMI)
NSV_FIREBEG = NSV_FIREBEG_A(KMI)
NSV_FIREEND = NSV_FIREEND_A(KMI)
NSV_CS = NSV_CS_A(KMI)
NSV_CSBEG = NSV_CSBEG_A(KMI)
NSV_CSEND = NSV_CSEND_A(KMI)
NSV_SNW = NSV_SNW_A(KMI)
NSV_SNWBEG = NSV_SNWBEG_A(KMI)
NSV_SNWEND = NSV_SNWEND_A(KMI)
!
END SUBROUTINE UPDATE_NSV