From c6f6da23724c48d9ee60eec616e61c7baa9f03d0 Mon Sep 17 00:00:00 2001 From: Philippe WAUTELET <philippe.wautelet@aero.obs-mip.fr> Date: Tue, 6 Dec 2016 10:12:57 +0100 Subject: [PATCH] Philippe 06/12/2016: IO: * added COUT_VAR in the NAM_FMOUT namelist to get the list of the fields to output * added NFIELDLIST in the TOUTBAK structure to store the list of the fields to output * added NMNHNAMELGTMAX parameter --- src/LIB/SURCOUCHE/src/fmwrit_ll.f90 | 2 +- src/LIB/SURCOUCHE/src/modd_io.f90 | 1 + .../SURCOUCHE/src/mode_io_manage_struct.f90 | 45 ++++++++++++++++++- src/MNH/modd_fmout.f90 | 1 + src/MNH/modd_parameters.f90 | 5 ++- src/MNH/modn_fmout.f90 | 3 +- src/MNH/read_desfmn.f90 | 2 + src/MNH/read_exsegn.f90 | 2 + 8 files changed, 57 insertions(+), 4 deletions(-) diff --git a/src/LIB/SURCOUCHE/src/fmwrit_ll.f90 b/src/LIB/SURCOUCHE/src/fmwrit_ll.f90 index 6c3bf2145..526a972e8 100644 --- a/src/LIB/SURCOUCHE/src/fmwrit_ll.f90 +++ b/src/LIB/SURCOUCHE/src/fmwrit_ll.f90 @@ -998,7 +998,7 @@ CONTAINS !* 0.2 Declarations of local variables ! CHARACTER(LEN=28) :: YFILEM ! FM-file name - CHARACTER(LEN=16) :: YRECFM ! name of the article to write + CHARACTER(LEN=NMNHNAMELGTMAX) :: YRECFM ! name of the article to write CHARACTER(LEN=2) :: YDIR ! field form CHARACTER(LEN=JPFINL) :: YFNLFI INTEGER :: IERR diff --git a/src/LIB/SURCOUCHE/src/modd_io.f90 b/src/LIB/SURCOUCHE/src/modd_io.f90 index 0d04fa9bc..4d4fd98dc 100644 --- a/src/LIB/SURCOUCHE/src/modd_io.f90 +++ b/src/LIB/SURCOUCHE/src/modd_io.f90 @@ -44,6 +44,7 @@ TYPE TOUTBAK INTEGER :: NOUTDAD = -1 !Index of the corresponding dad file (file with same time) CHARACTER(LEN=28) :: CDADFILENAME !Filename of dad TYPE(TFILEDATA),POINTER :: TFILE => NULL() !Corresponding file + INTEGER,DIMENSION(:),POINTER :: NFIELDLIST => NULL() !List of the fields to read or write END TYPE TOUTBAK !Structure describing the characteristics of a file diff --git a/src/LIB/SURCOUCHE/src/mode_io_manage_struct.f90 b/src/LIB/SURCOUCHE/src/mode_io_manage_struct.f90 index 5f8a70bdd..e08d5a6af 100644 --- a/src/LIB/SURCOUCHE/src/mode_io_manage_struct.f90 +++ b/src/LIB/SURCOUCHE/src/mode_io_manage_struct.f90 @@ -30,6 +30,7 @@ USE MODD_NESTING, ONLY : CDAD_NAME,NDAD USE MODD_NSV, ONLY: NSV USE MODD_OUT_n, ONLY : OUT_MODEL USE MODD_VAR_ll, ONLY : IP +USE MODE_FIELD ! IMPLICIT NONE ! @@ -39,9 +40,11 @@ REAL, INTENT(IN) :: PSEGLEN ! segment duration (in seconds) ! INTEGER :: IMI ! Model number for loop INTEGER :: IBAK_NUMB, IOUT_NUMB ! Number of backups/outputs +INTEGER :: IVAR ! Number of variables INTEGER :: ISTEP_MAX ! Number of timesteps -INTEGER :: IPOS ! Index +INTEGER :: IPOS,IFIELD ! Indices INTEGER :: JOUT,IDX ! Loop indices +INTEGER :: IRESP INTEGER, DIMENSION(:), ALLOCATABLE :: IBAK_STEP, IOUT_STEP ! Arrays to store list of backup/output steps (intermediate array) CHARACTER (LEN=4) :: YDADNUMBER ! Character string for the DAD model file number @@ -219,6 +222,40 @@ DO IMI = 1, NMODEL END DO END IF ! + !Determine the list of the fields to write in each output + IF (IOUT_NUMB>0) THEN + !Count the number of fields to output + IVAR = 0 + DO IPOS = 1,JPOUTVARMAX + IF (COUT_VAR(IMI,IPOS)/='') IVAR = IVAR + 1 + END DO + IF (IVAR==0) THEN + PRINT *,'ERROR: no fields chosen for output' + END IF + ALLOCATE(OUT_MODEL(IMI)%TOUTPUTN(1)%NFIELDLIST(IVAR)) + !Determine the list of the outputs to do (by field number) + IVAR = 1 + !Set the NFIELDLIST for the 1st output + !All the others will use the same list (for the moment) + DO IPOS = 1,JPOUTVARMAX + IF (COUT_VAR(IMI,IPOS)/='') THEN + CALL FIND_FIELD_ID_FROM_MNHNAME(COUT_VAR(IMI,IPOS),IFIELD,IRESP) + OUT_MODEL(IMI)%TOUTPUTN(1)%NFIELDLIST(IVAR) = IFIELD + IF (IRESP/=0) THEN + PRINT *,'FATAL: unknown field for output: ',TRIM(COUT_VAR(IMI,IPOS)) + !MNH is killed to prevent problems with wrong values in NFIELDLIST + STOP + END IF + ! + IVAR=IVAR+1 + END IF + END DO + !All the outputs use the same field list (for the moment) + DO IPOS = 2,IOUT_NUMB + OUT_MODEL(IMI)%TOUTPUTN(IPOS)%NFIELDLIST => OUT_MODEL(IMI)%TOUTPUTN(1)%NFIELDLIST + END DO + END IF + ! DEALLOCATE(IBAK_STEP) DEALLOCATE(IOUT_STEP) ! @@ -237,6 +274,11 @@ DO IMI = 1, NMODEL DO JOUT = 1,IOUT_NUMB WRITE(*,'( I9 F12.3 )' ) OUT_MODEL(IMI)%TOUTPUTN(JOUT)%NSTEP,OUT_MODEL(IMI)%TOUTPUTN(JOUT)%XTIME END DO + PRINT *,'Field list:' + DO JOUT = 1,SIZE(OUT_MODEL(IMI)%TOUTPUTN(1)%NFIELDLIST) + IDX=OUT_MODEL(IMI)%TOUTPUTN(1)%NFIELDLIST(JOUT) + PRINT *,' ',TRIM(TFIELDLIST(IDX)%CMNHNAME) + END DO PRINT *,'-------------------------' END IF ! @@ -246,6 +288,7 @@ DEALLOCATE(NBAK_STEP) DEALLOCATE(NOUT_STEP) DEALLOCATE(XBAK_TIME) DEALLOCATE(XOUT_TIME) +DEALLOCATE(COUT_VAR) ! CONTAINS ! diff --git a/src/MNH/modd_fmout.f90 b/src/MNH/modd_fmout.f90 index d43402d8e..d9811f75e 100644 --- a/src/MNH/modd_fmout.f90 +++ b/src/MNH/modd_fmout.f90 @@ -68,6 +68,7 @@ REAL,SAVE,DIMENSION(JPMODELMAX) :: XBAK_TIME_FREQ = XNEGUNDEF, XOUT_TIME_FREQ = ! Time between 2 backups/outputs for each model REAL,SAVE,DIMENSION(JPMODELMAX) :: XBAK_TIME_FREQ_FIRST = 0., XOUT_TIME_FREQ_FIRST = 0. ! Time for first backup/output for each model (if XBAK/OUT_TIME_FREQ is set) +CHARACTER(LEN=NMNHNAMELGTMAX),SAVE,ALLOCATABLE,DIMENSION(:,:) :: COUT_VAR ! Name of the fields to output ! ! END MODULE MODD_FMOUT diff --git a/src/MNH/modd_parameters.f90 b/src/MNH/modd_parameters.f90 index b2c7421d8..ae029c22d 100644 --- a/src/MNH/modd_parameters.f90 +++ b/src/MNH/modd_parameters.f90 @@ -77,7 +77,10 @@ INTEGER, PARAMETER :: NNEGUNDEF = -999 ! default value for undefined or unused ! ! field (negative value guaranteed) INTEGER, PARAMETER :: JPDUMMY = 20 ! Size of dummy array ! -INTEGER, PARAMETER :: JPOUTMAX = 192 ! Maximum allowed number of OUTput files +INTEGER, PARAMETER :: JPOUTMAX = 192 ! Maximum allowed number of OUTput files +INTEGER, PARAMETER :: JPOUTVARMAX = 192 ! Maximum allowed number of variables in an output file +! +INTEGER, PARAMETER :: NMNHNAMELGTMAX = 32 ! Maximum length of a MNH variable name ! INTEGER, PARAMETER :: JPLIMACCNMAX = 10 ! Maximum allowed number of CCN modes in LIMA INTEGER, PARAMETER :: JPLIMAIFNMAX = 10 ! Maximum allowed number of IFN modes in LIMA diff --git a/src/MNH/modn_fmout.f90 b/src/MNH/modn_fmout.f90 index 7793d94cb..f67f995a9 100644 --- a/src/MNH/modn_fmout.f90 +++ b/src/MNH/modn_fmout.f90 @@ -52,6 +52,7 @@ NAMELIST/NAM_FMOUT/LBAK_BEG,LBAK_END,& LOUT_BEG,LOUT_END,& XOUT_TIME,NOUT_STEP,& NOUT_STEP_FREQ,NOUT_STEP_FREQ_FIRST,& - XOUT_TIME_FREQ,XOUT_TIME_FREQ_FIRST + XOUT_TIME_FREQ,XOUT_TIME_FREQ_FIRST, & + COUT_VAR ! END MODULE MODN_FMOUT diff --git a/src/MNH/read_desfmn.f90 b/src/MNH/read_desfmn.f90 index 287f5f8e6..4e727b307 100644 --- a/src/MNH/read_desfmn.f90 +++ b/src/MNH/read_desfmn.f90 @@ -429,11 +429,13 @@ IF (KMI == 1) THEN IF (.NOT.ALLOCATED(XOUT_TIME)) ALLOCATE(XOUT_TIME(NMODEL,JPOUTMAX)) IF (.NOT.ALLOCATED(NBAK_STEP)) ALLOCATE(NBAK_STEP(NMODEL,JPOUTMAX)) IF (.NOT.ALLOCATED(NOUT_STEP)) ALLOCATE(NOUT_STEP(NMODEL,JPOUTMAX)) + IF (.NOT.ALLOCATED(COUT_VAR)) ALLOCATE(COUT_VAR (NMODEL,JPOUTVARMAX)) READ(UNIT=ILUDES,NML=NAM_FMOUT) XBAK_TIME(:,:) = XNEGUNDEF XOUT_TIME(:,:) = XNEGUNDEF NBAK_STEP(:,:) = NNEGUNDEF NOUT_STEP(:,:) = NNEGUNDEF + COUT_VAR(:,:) = '' END IF CALL POSNAM(ILUDES,'NAM_BUDGET',GFOUND) IF (GFOUND) READ(UNIT=ILUDES,NML=NAM_BUDGET) diff --git a/src/MNH/read_exsegn.f90 b/src/MNH/read_exsegn.f90 index 4ac2f3ed8..1e4695d86 100644 --- a/src/MNH/read_exsegn.f90 +++ b/src/MNH/read_exsegn.f90 @@ -501,10 +501,12 @@ IF (KMI == 1) THEN IF (.NOT.ALLOCATED(XOUT_TIME)) ALLOCATE(XOUT_TIME(NMODEL,JPOUTMAX)) IF (.NOT.ALLOCATED(NBAK_STEP)) ALLOCATE(NBAK_STEP(NMODEL,JPOUTMAX)) IF (.NOT.ALLOCATED(NOUT_STEP)) ALLOCATE(NOUT_STEP(NMODEL,JPOUTMAX)) + IF (.NOT.ALLOCATED(COUT_VAR)) ALLOCATE(COUT_VAR (NMODEL,JPOUTVARMAX)) XBAK_TIME(:,:) = XNEGUNDEF XOUT_TIME(:,:) = XNEGUNDEF NBAK_STEP(:,:) = NNEGUNDEF NOUT_STEP(:,:) = NNEGUNDEF + COUT_VAR(:,:) = '' READ(UNIT=ILUSEG,NML=NAM_FMOUT) END IF CALL POSNAM(ILUSEG,'NAM_BUDGET',GFOUND,ILUOUT) -- GitLab