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