From f397cb27a597b01200bac35d2543d73642eb133e Mon Sep 17 00:00:00 2001 From: Philippe WAUTELET <philippe.wautelet@aero.obs-mip.fr> Date: Mon, 20 Feb 2023 14:43:07 +0100 Subject: [PATCH] Philippe 20/02/2023: scalar variables: CSV is now allocated on each model --- src/MNH/ground_paramn.f90 | 2 +- src/MNH/ini_nsv.f90 | 10 ++++------ src/MNH/modd_nsv.f90 | 7 ++++--- src/MNH/update_nsv.f90 | 18 +++++++++++++++++- 4 files changed, 26 insertions(+), 11 deletions(-) diff --git a/src/MNH/ground_paramn.f90 b/src/MNH/ground_paramn.f90 index 509486fff..9eccd2a69 100644 --- a/src/MNH/ground_paramn.f90 +++ b/src/MNH/ground_paramn.f90 @@ -590,7 +590,7 @@ IF(LBLOWSNOW) THEN ELSE KSV_SURF = NSV ALLOCATE(YSV_SURF(KSV_SURF)) - YSV_SURF(:) = CSV(:) + YSV_SURF(:) = CSV(1:NSV) ENDIF ! !------------------------------------------------------------------------------- diff --git a/src/MNH/ini_nsv.f90 b/src/MNH/ini_nsv.f90 index d5b52afcb..42da93ebd 100644 --- a/src/MNH/ini_nsv.f90 +++ b/src/MNH/ini_nsv.f90 @@ -744,13 +744,11 @@ IF (LBLOWSNOW) XSVMIN(NSV_SNWBEG_A(KMI):NSV_SNWEND_A(KMI))=XMNH_TINY ! ! NAME OF THE SCALAR VARIABLES IN THE DIFFERENT SV GROUPS ! -IF (ALLOCATED(CSV)) DEALLOCATE(CSV) -ALLOCATE(CSV(NSV)) -CSV(:) = ' ' +CSV_A(:, KMI) = ' ' IF (LLG) THEN - CSV(NSV_LGBEG_A(KMI) ) = 'X0 ' - CSV(NSV_LGBEG_A(KMI)+1) = 'Y0 ' - CSV(NSV_LGEND_A(KMI) ) = 'Z0 ' + CSV_A(NSV_LGBEG_A(KMI), KMI) = 'X0 ' + CSV_A(NSV_LGBEG_A(KMI)+1, KMI) = 'Y0 ' + CSV_A(NSV_LGEND_A(KMI), KMI) = 'Z0 ' ENDIF ! Initialize scalar variable names for dust diff --git a/src/MNH/modd_nsv.f90 b/src/MNH/modd_nsv.f90 index 47fce4f4f..2d299c691 100644 --- a/src/MNH/modd_nsv.f90 +++ b/src/MNH/modd_nsv.f90 @@ -1,4 +1,4 @@ -!MNH_LIC Copyright 2001-2022 CNRS, Meteo-France and Universite Paul Sabatier +!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. @@ -52,6 +52,7 @@ REAL,DIMENSION(JPSVMAX) :: XSVMIN ! minimum value for SV variables LOGICAL :: LINI_NSV(JPMODELMAX) = .FALSE. ! becomes True when routine INI_NSV is called ! CHARACTER(LEN=NMNHNAMELGTMAX), DIMENSION(:,:), ALLOCATABLE, TARGET :: CSV_CHEM_LIST_A !Names of all the chemical variables +CHARACTER(LEN=6), DIMENSION(:,:), ALLOCATABLE, TARGET :: CSV_A !Names of the scalar 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 @@ -166,9 +167,9 @@ INTEGER,DIMENSION(JPMODELMAX)::NSV_SNWEND_A = 0 ! NSV_SNWBEG_A...NSV_SNWEND_A ! variables updated for the current model ! 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(:), POINTER :: CSV !Names of the scalar variables -CHARACTER(LEN=6), DIMENSION(:), ALLOCATABLE :: CSV ! name of the scalar variables +TYPE(tfieldmetadata), DIMENSION(:), POINTER :: TSVLIST !Metadata of all 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 be7fa1801..2ae37f91e 100644 --- a/src/MNH/update_nsv.f90 +++ b/src/MNH/update_nsv.f90 @@ -28,7 +28,7 @@ END MODULE MODI_UPDATE_NSV ! P. Wautelet 10/04/2019: replace ABORT and STOP calls by Print_msg ! 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 -! P. Wautelet 20/02/2023: bugfix: reallocate size was wrong in some scenarii +! P. Wautelet 20/02/2023: manage CSV(_A) + bugfix: reallocate size was wrong in some scenarii !------------------------------------------------------------------------------- ! USE MODD_CONF, ONLY: NVERB @@ -43,6 +43,7 @@ IMPLICIT NONE INTEGER, INTENT(IN) :: KMI ! Model index CHARACTER(LEN=JPSVNAMELGTMAX), DIMENSION(:,:), ALLOCATABLE :: YSVNAMES_TMP +CHARACTER(LEN=6), DIMENSION(:,:), ALLOCATABLE :: YSV_TMP CHARACTER(LEN=NMNHNAMELGTMAX), DIMENSION(:,:), ALLOCATABLE :: YSVCHEM_LIST_TMP INTEGER :: JI, JJ TYPE(tfieldmetadata), DIMENSION(:,:), ALLOCATABLE :: YSVLIST_TMP @@ -71,6 +72,21 @@ END IF CSV_CHEM_LIST => CSV_CHEM_LIST_A(:,KMI) +! 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) + ! 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 -- GitLab