diff --git a/src/LIB/SURCOUCHE/src/fmwrit_ll.f90 b/src/LIB/SURCOUCHE/src/fmwrit_ll.f90 index 6c3bf214526370f5adf677c180f472cec9497323..526a972e83265a2f80dc273e1ef7b8445e1e38d7 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 0d04fa9bccdeb40bde9a680e248dd25a536aa348..4d4fd98dcf7090b79279cb4f7c555fadaeaf3033 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 5f8a70bdd7d68f853a4c9141bb02ce45c54a52a1..e08d5a6af3732791683db36924fb69de7fd4e9c6 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 d43402d8e0145162885b0862a59e53fc42e25490..d9811f75ebe21c1c0358cbe9ae23d41787e95281 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 b2c7421d875e9b4c7ff2fdee102d5ad9ab51106f..ae029c22da06e185d07b13ed797afa8fed7c5187 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 7793d94cb0c2c481414fdabec9a4d3720debb885..f67f995a93912b972eeb64da51a3de70b1660613 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 287f5f8e61f15a6150da2b5d99456280c40b6936..4e727b307add875fb8c958d8a5957ace84e882cb 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 4ac2f3ed812ec73a77d88fe5161725ae5475b782..1e4695d867fd8c098c615f4e0029e5a42574237e 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)