From d0bb67c3fe7391be6c07e11ad74d4f72dfa32485 Mon Sep 17 00:00:00 2001
From: Philippe WAUTELET <philippe.wautelet@aero.obs-mip.fr>
Date: Tue, 8 Nov 2016 17:18:04 +0100
Subject: [PATCH] Philippe 08/11/2016: add and treat all OUTPUT namelist
 variables + separate outputs and backups lists

---
 src/LIB/SURCOUCHE/src/modd_io.f90             |   9 +-
 .../SURCOUCHE/src/mode_io_manage_struct.f90   | 493 ++++++++++++------
 src/MNH/ini_modeln.f90                        |   2 +-
 src/MNH/ini_spectren.f90                      |   2 +-
 src/MNH/modd_fmout.f90                        |  33 +-
 src/MNH/modd_outn.f90                         |  13 +-
 src/MNH/modd_sub_modeln.f90                   |   4 +-
 src/MNH/modeln.f90                            |  18 +-
 src/MNH/modn_fmout.f90                        |  11 +-
 src/MNH/read_desfmn.f90                       |   5 +
 src/MNH/read_exsegn.f90                       |   5 +
 src/MNH/set_grid.f90                          |  18 +-
 12 files changed, 397 insertions(+), 216 deletions(-)

diff --git a/src/LIB/SURCOUCHE/src/modd_io.f90 b/src/LIB/SURCOUCHE/src/modd_io.f90
index 41dd6cc85..4fd3dbfd7 100644
--- a/src/LIB/SURCOUCHE/src/modd_io.f90
+++ b/src/LIB/SURCOUCHE/src/modd_io.f90
@@ -38,8 +38,7 @@ END TYPE LFIPARAM
 
 !Structure describing the characteristics of an output or a backup
 TYPE TOUTBAK
-  INTEGER           :: NBAKID = -1  !Backup number
-  INTEGER           :: NOUTID = -1  !Output number
+  INTEGER           :: NID = -1     !Backup number
   INTEGER           :: NSTEP        !Timestep number
   REAL              :: XTIME        !Time from start of the segment (in seconds and rounded to a timestep)
   INTEGER           :: NOUTDAD = -1 !Index of the corresponding dad file (file with same time)
@@ -66,7 +65,9 @@ TYPE TFILEDATA
   TYPE(TFILEDATA),POINTER :: TFILE_NEXT => NULL()
 END TYPE TFILEDATA
 
-TYPE(TFILEDATA),POINTER,SAVE :: TFILE_FIRST => NULL()
-TYPE(TFILEDATA),POINTER,SAVE :: TFILE_LAST  => NULL()
+TYPE(TFILEDATA),POINTER,SAVE :: TFILE_BAK_FIRST => NULL()
+TYPE(TFILEDATA),POINTER,SAVE :: TFILE_OUT_FIRST => NULL()
+TYPE(TFILEDATA),POINTER,SAVE :: TFILE_BAK_LAST  => NULL()
+TYPE(TFILEDATA),POINTER,SAVE :: TFILE_OUT_LAST  => NULL()
 
 END MODULE MODD_IO_ll
diff --git a/src/LIB/SURCOUCHE/src/mode_io_manage_struct.f90 b/src/LIB/SURCOUCHE/src/mode_io_manage_struct.f90
index 8194e711a..5c6fe1f83 100644
--- a/src/LIB/SURCOUCHE/src/mode_io_manage_struct.f90
+++ b/src/LIB/SURCOUCHE/src/mode_io_manage_struct.f90
@@ -38,131 +38,74 @@ REAL,    INTENT(IN) :: PTSTEP  ! time step of model KMI
 REAL,    INTENT(IN) :: PSEGLEN ! segment duration (in seconds)
 !
 INTEGER           :: IMI              ! Model number for loop
-INTEGER           :: IBAK_NUMB        ! Number of outputs
+INTEGER           :: IBAK_NUMB, IOUT_NUMB ! Number of backups/outputs
 INTEGER           :: ISTEP_MAX        ! Number of timesteps
-INTEGER           :: ITEMP            ! Intermediate variable
 INTEGER           :: IPOS             ! Index
-INTEGER           :: JKLOOP,JOUT,IDX  ! Loop indices
-INTEGER, DIMENSION(:), ALLOCATABLE :: IBAK_STEP ! Array to store list of backup steps (intermediate array)
-CHARACTER (LEN=4) :: YNUMBER          ! Character string for the file number
+INTEGER           :: JOUT,IDX         ! Loop indices
+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
-REAL              :: ZOUT, ZOUTMAX    ! Time of output/backup
 !
 !
 DO IMI = 1, NMODEL
   IBAK_NUMB = 0
+  IOUT_NUMB = 0
   ISTEP_MAX = NINT(XSEGLEN/DYN_MODEL(IMI)%XTSTEP)+1
   IF (IMI == 1) ISTEP_MAX = ISTEP_MAX - KSUP
   !
-  !* Insert regular backups into XBAK_TIME array
-  !
-  IF (XBAK_TIME_FREQ(IMI)>0.) THEN
-    IDX = 1
-    ZOUT = XBAK_TIME_FREQ_FIRST(IMI)
-    ZOUTMAX = PSEGLEN - PTSTEP*KSUP
-    DO WHILE ( ZOUT <= ZOUTMAX )
-      !Find first non 'allocated' element
-      DO WHILE ( XBAK_TIME(IMI,IDX) >= 0. )
-        IDX = IDX + 1
-        IF (IDX > JPOUTMAX) THEN
-          PRINT *,'Error in SET_GRID when treating output list (JPOUTMAX too small)'
-          CALL ABORT
-          STOP
-        END IF
-      END DO
-      XBAK_TIME(IMI,IDX) = ZOUT
-      ZOUT = ZOUT + XBAK_TIME_FREQ(IMI)
-    END DO
-  END IF
+  !* Insert regular backups/outputs into XBAK_TIME/XOUT_TIME arrays
   !
-  !* Synchronization between nested models through XBAK_TIME arrays (MODD_FMOUT)
+  IF (XBAK_TIME_FREQ(IMI)>0.) CALL IO_INSERT_REGULAR_FLOAT(XBAK_TIME_FREQ_FIRST(IMI),XBAK_TIME_FREQ(IMI),XBAK_TIME(IMI,:))
+  IF (XOUT_TIME_FREQ(IMI)>0.) CALL IO_INSERT_REGULAR_FLOAT(XOUT_TIME_FREQ_FIRST(IMI),XOUT_TIME_FREQ(IMI),XOUT_TIME(IMI,:))
   !
-  DO JOUT = 1,JPOUTMAX
-    IF (XBAK_TIME(IMI,JOUT) >= 0.) THEN
-      IBAK_NUMB = IBAK_NUMB + 1
-      !Value is rounded to nearest timestep
-      XBAK_TIME(IMI,JOUT) = NINT(XBAK_TIME(IMI,JOUT)/DYN_MODEL(IMI)%XTSTEP) * DYN_MODEL(IMI)%XTSTEP
-      !Output/backup time is propagated to nested models (with higher numbers)
-      !PW: TODO: BUG?: what happens if 2 dissociated models? Use NSON(:) array?
-      DO JKLOOP = IMI+1,NMODEL
-        IDX = 1
-        !Find first non 'allocated' element
-        DO WHILE ( XBAK_TIME(JKLOOP,IDX) >= 0. )
-          IDX = IDX + 1
-          IF (IDX > JPOUTMAX) THEN
-            PRINT *,'Error in SET_GRID when treating output list (JPOUTMAX too small)'
-            CALL ABORT
-            STOP
-          END IF
-        END DO
-        XBAK_TIME(JKLOOP,IDX) = XBAK_TIME(IMI,JOUT)
-      END DO
-    END IF
-  END DO
+  !* Synchronization between nested models through XBAK_TIME/XOUT_TIME arrays
   !
-  !* Insert regular backups into NBAK_STEP array
+  CALL IO_SYNC_MODELS_FLOAT(IBAK_NUMB,XBAK_TIME)
+  CALL IO_SYNC_MODELS_FLOAT(IOUT_NUMB,XOUT_TIME)
   !
-  IF (NBAK_STEP_FREQ(IMI)>0) THEN
-    IDX = 1
-    DO JOUT = NBAK_STEP_FREQ_FIRST(IMI), ISTEP_MAX, NBAK_STEP_FREQ(IMI)
-      !Find first non 'allocated' element
-      DO WHILE ( NBAK_STEP(IMI,IDX) >= 0 )
-        IDX = IDX + 1
-        IF (IDX > JPOUTMAX) THEN
-          PRINT *,'Error in SET_GRID when treating output list (JPOUTMAX too small)'
-          CALL ABORT
-          STOP
-        END IF
-      END DO
-      NBAK_STEP(IMI,IDX) = JOUT
-    END DO
-  END IF
+  !* Insert regular backups/outputs into NBAK_STEP/NOUT_STEP arrays
   !
-  !* Synchronization between nested models through NBAK_STEP arrays (MODD_FMOUT)
+  IF (NBAK_STEP_FREQ(IMI)>0) CALL IO_INSERT_REGULAR_INT(NBAK_STEP_FREQ_FIRST(IMI),NBAK_STEP_FREQ(IMI),NBAK_STEP(IMI,:))
+  IF (NOUT_STEP_FREQ(IMI)>0) CALL IO_INSERT_REGULAR_INT(NOUT_STEP_FREQ_FIRST(IMI),NOUT_STEP_FREQ(IMI),NOUT_STEP(IMI,:))
   !
-  DO JOUT = 1,JPOUTMAX
-    IF (NBAK_STEP(IMI,JOUT) > 0) THEN
-      IBAK_NUMB = IBAK_NUMB + 1
-      !Output/backup time is propagated to nested models (with higher numbers)
-      !PW: TODO: BUG?: what happens if 2 dissociated models? Use NSON(:) array?
-      DO JKLOOP = IMI+1,NMODEL
-        IDX = 1
-        !Find first non 'allocated' element
-        DO WHILE ( NBAK_STEP(JKLOOP,IDX) >= 0 )
-          IDX = IDX + 1
-        END DO
-        IF (IDX > JPOUTMAX) THEN
-          PRINT *,'Error in SET_GRID when treating output list (JPOUTMAX too small)'
-          CALL ABORT
-          STOP
-        END IF
-        ! Use of NINT and real to prevent rounding errors
-        ! (STEP-1)* ... +1 because step numbers begin at 1
-        NBAK_STEP(JKLOOP,IDX) = (NBAK_STEP(IMI,JOUT)-1) * NINT( DYN_MODEL(JKLOOP)%XTSTEP/DYN_MODEL(IMI)%XTSTEP ) + 1
-      END DO
-    END IF
-  END DO
+  !* Synchronization between nested models through NBAK_STEP/NOUT_STEP arrays
   !
-  !* Group all backups in a common form and add backups at beginning and end if requested
+  CALL IO_SYNC_MODELS_INT(IBAK_NUMB,NBAK_STEP)
+  CALL IO_SYNC_MODELS_INT(IOUT_NUMB,NOUT_STEP)
+  !
+  !* Group all backups/outputs in a common form and add backups/outputs at beginning and end if requested
   !
   IF (LBAK_BEG) IBAK_NUMB = IBAK_NUMB + 1
   IF (LBAK_END) IBAK_NUMB = IBAK_NUMB + 1
+  IF (LOUT_BEG) IOUT_NUMB = IOUT_NUMB + 1
+  IF (LOUT_END) IOUT_NUMB = IOUT_NUMB + 1
   !
   ALLOCATE(IBAK_STEP(IBAK_NUMB))
   IBAK_STEP(:) = NNEGUNDEF
+  ALLOCATE(IOUT_STEP(IOUT_NUMB))
+  IOUT_STEP(:) = NNEGUNDEF
   !
   IBAK_NUMB = 0
+  IOUT_NUMB = 0
   !
   IF (LBAK_BEG) THEN
     IBAK_NUMB = IBAK_NUMB + 1
     IBAK_STEP(IBAK_NUMB) = 1 ! 1 is the 1st step number
   END IF
+  IF (LOUT_BEG) THEN
+    IOUT_NUMB = IOUT_NUMB + 1
+    IOUT_STEP(IOUT_NUMB) = 1 ! 1 is the 1st step number
+  END IF
   !
   DO JOUT = 1,JPOUTMAX
     IF (XBAK_TIME(IMI,JOUT) >= 0.) THEN
       IBAK_NUMB = IBAK_NUMB + 1
       IBAK_STEP(IBAK_NUMB) = NINT(XBAK_TIME(IMI,JOUT)/DYN_MODEL(IMI)%XTSTEP) + 1
     END IF
+    IF (XOUT_TIME(IMI,JOUT) >= 0.) THEN
+      IOUT_NUMB = IOUT_NUMB + 1
+      IOUT_STEP(IOUT_NUMB) = NINT(XOUT_TIME(IMI,JOUT)/DYN_MODEL(IMI)%XTSTEP) + 1
+    END IF
   END DO
   !
   DO JOUT = 1,JPOUTMAX
@@ -170,43 +113,32 @@ DO IMI = 1, NMODEL
       IBAK_NUMB = IBAK_NUMB + 1
       IBAK_STEP(IBAK_NUMB) = NBAK_STEP(IMI,JOUT)
     END IF
+    IF (NOUT_STEP(IMI,JOUT) > 0) THEN
+      IOUT_NUMB = IOUT_NUMB + 1
+      IOUT_STEP(IOUT_NUMB) = NOUT_STEP(IMI,JOUT)
+    END IF
   END DO
   !
   IF (LBAK_END) THEN
     IBAK_NUMB = IBAK_NUMB + 1
     IBAK_STEP(IBAK_NUMB) = ISTEP_MAX
   END IF
+  IF (LOUT_END) THEN
+    IOUT_NUMB = IOUT_NUMB + 1
+    IOUT_STEP(IOUT_NUMB) = ISTEP_MAX
+  END IF
   !
   !* Find and remove duplicated entries
   !
-  DO JOUT = 1,IBAK_NUMB
-    DO JKLOOP = JOUT+1,IBAK_NUMB
-      IF ( IBAK_STEP(JKLOOP) == IBAK_STEP(JOUT) .AND. IBAK_STEP(JKLOOP) > 0 ) THEN
-        print *,'WARNING: found duplicated backup step (removed extra one)'
-        IBAK_STEP(JKLOOP) = NNEGUNDEF
-      END IF
-    END DO
-  END DO
+  CALL FIND_REMOVE_DUPLICATES(IBAK_NUMB,IBAK_STEP)
+  CALL FIND_REMOVE_DUPLICATES(IOUT_NUMB,IOUT_STEP)
   !
   !* Sort entries
   !
-  DO JOUT = 1,IBAK_NUMB
-    ITEMP = IBAK_STEP(JOUT)
-    IF (ITEMP<=0) ITEMP = HUGE(ITEMP)
-    IPOS = -1
-    DO JKLOOP = JOUT+1,IBAK_NUMB
-      IF ( IBAK_STEP(JKLOOP) < ITEMP .AND. IBAK_STEP(JKLOOP) >= 0 ) THEN
-        ITEMP = IBAK_STEP(JKLOOP)
-        IPOS = JKLOOP
-      END IF
-    END DO
-    IF (IPOS >= JOUT) THEN
-      IBAK_STEP(IPOS) = IBAK_STEP(JOUT)
-      IBAK_STEP(JOUT) = ITEMP
-    END IF
-  END DO
+  CALL SORT_ENTRIES(IBAK_NUMB,IBAK_STEP)
+  CALL SORT_ENTRIES(IOUT_NUMB,IOUT_STEP)
   !
-  !* Count the number of backups of model IMI
+  !* Count the number of backups/outputs of model IMI
   !
   IBAK_NUMB = 0
   DO JOUT = 1,SIZE(IBAK_STEP)
@@ -214,55 +146,23 @@ DO IMI = 1, NMODEL
       IBAK_NUMB = IBAK_NUMB + 1
     END IF
   END DO
+  IOUT_NUMB = 0
+  DO JOUT = 1,SIZE(IOUT_STEP)
+    IF (IOUT_STEP(JOUT) >= 0) THEN
+      IOUT_NUMB = IOUT_NUMB + 1
+    END IF
+  END DO
   !
-  OUT_MODEL(IMI)%NOUT_NUMB = IBAK_NUMB
-  ALLOCATE(OUT_MODEL(IMI)%TOUTBAKN(IBAK_NUMB))
+  OUT_MODEL(IMI)%NBAK_NUMB = IBAK_NUMB
+  OUT_MODEL(IMI)%NOUT_NUMB = IOUT_NUMB
   !
-  !* Populate the backup data structures
+  !* Populate the backup/output data structures
   !
-  IPOS = 0
-  DO JOUT = 1,SIZE(IBAK_STEP)
-    IF (IBAK_STEP(JOUT) >= 0) THEN
-        IPOS = IPOS + 1
-        OUT_MODEL(IMI)%TOUTBAKN(IPOS)%NBAKID = IPOS
-        OUT_MODEL(IMI)%TOUTBAKN(IPOS)%NOUTID = -1
-        OUT_MODEL(IMI)%TOUTBAKN(IPOS)%NSTEP = IBAK_STEP(JOUT)
-        OUT_MODEL(IMI)%TOUTBAKN(IPOS)%XTIME = (IBAK_STEP(JOUT)-1)*DYN_MODEL(IMI)%XTSTEP
-        IF (IPOS>999) THEN
-          print *,'ERROR in SET_GRID: more than 999 backups'
-          STOP
-        END IF
-        IF (.NOT.ASSOCIATED(TFILE_FIRST)) THEN
-          ALLOCATE(TFILE_FIRST)
-          TFILE_LAST => TFILE_FIRST
-        ELSE
-          ALLOCATE(TFILE_LAST%TFILE_NEXT)
-          TFILE_LAST%TFILE_NEXT%TFILE_PREV => TFILE_LAST
-          TFILE_LAST => TFILE_LAST%TFILE_NEXT
-        ENDIF
-        OUT_MODEL(IMI)%TOUTBAKN(IPOS)%TFILE => TFILE_LAST
-        OUT_MODEL(IMI)%TOUTBAKN(IPOS)%TFILE%CTYPE="BACKUP"
-        OUT_MODEL(IMI)%TOUTBAKN(IPOS)%TFILE%CMODE="WRITE"
-        WRITE (YNUMBER,FMT="('.',I3.3)") IPOS
-        OUT_MODEL(IMI)%TOUTBAKN(IPOS)%TFILE%CNAME=ADJUSTL(ADJUSTR(IO_SURF_MNH_MODEL(IMI)%COUTFILE)//YNUMBER)
-        OUT_MODEL(IMI)%TOUTBAKN(IPOS)%TFILE%NLFITYPE=1 !1: to be transfered
-!PW: TODO: set NLFIVERB only when useful (only if LFI file...)
-        OUT_MODEL(IMI)%TOUTBAKN(IPOS)%TFILE%NLFIVERB=NVERB
-        IF (LIOCDF4) THEN
-          OUT_MODEL(IMI)%TOUTBAKN(IPOS)%TFILE%CTYPE='NETCDF4'
-          IF (LLFIOUT) THEN
-            PRINT *,'Warning: LLFIOUT + LIOCDF4 = .TRUE. not yet implemented with new IO data structures'
-            OUT_MODEL(IMI)%TOUTBAKN(IPOS)%TFILE%NLFINPRAR= 22+2*(4+NRR+NSV)
-          END IF
-        ELSE IF (LLFIOUT) THEN
-          OUT_MODEL(IMI)%TOUTBAKN(IPOS)%TFILE%CTYPE='LFI'
-          OUT_MODEL(IMI)%TOUTBAKN(IPOS)%TFILE%NLFINPRAR= 22+2*(4+NRR+NSV)
-        ELSE
-          PRINT *,'Error: unknown backup fileformat'
-          CALL ABORT
-        ENDIF
-    END IF
-  END DO
+  ALLOCATE(OUT_MODEL(IMI)%TBACKUPN(IBAK_NUMB))
+  ALLOCATE(OUT_MODEL(IMI)%TOUTPUTN(IOUT_NUMB))
+  !
+  CALL POPULATE_STRUCT(TFILE_BAK_FIRST,TFILE_BAK_LAST,IBAK_STEP,"BACKUP",OUT_MODEL(IMI)%TBACKUPN)
+  CALL POPULATE_STRUCT(TFILE_OUT_FIRST,TFILE_OUT_LAST,IOUT_STEP,"OUTPUT",OUT_MODEL(IMI)%TOUTPUTN)
   !
   !* Find dad output number
   !
@@ -272,31 +172,55 @@ DO IMI = 1, NMODEL
     STOP
   END IF
   IF (NDAD(IMI) == IMI .OR.  IMI == 1) THEN
-    OUT_MODEL(IMI)%TOUTBAKN(:)%NOUTDAD = 0
-    !Check IPOS>0 because TOUTBAKN(0) does not exist (IPOS=0 only if no backups)
-    IF(IPOS>0) OUT_MODEL(IMI)%TOUTBAKN(IPOS)%CDADFILENAME = OUT_MODEL(IMI)%TOUTBAKN(IPOS)%TFILE%CNAME
+    OUT_MODEL(IMI)%TBACKUPN(:)%NOUTDAD = 0
+    DO IPOS = 1,OUT_MODEL(IMI)%NBAK_NUMB
+      OUT_MODEL(IMI)%TBACKUPN(IPOS)%CDADFILENAME = OUT_MODEL(IMI)%TBACKUPN(IPOS)%TFILE%CNAME
+    END DO
+    OUT_MODEL(IMI)%TOUTPUTN(:)%NOUTDAD = 0
+    DO IPOS = 1,OUT_MODEL(IMI)%NOUT_NUMB
+      OUT_MODEL(IMI)%TOUTPUTN(IPOS)%CDADFILENAME = OUT_MODEL(IMI)%TOUTPUTN(IPOS)%TFILE%CNAME
+    END DO
   ELSE
+    DO IPOS = 1,OUT_MODEL(IMI)%NBAK_NUMB
+      IDX = 0
+      DO JOUT = 1,OUT_MODEL(NDAD(IMI))%NBAK_NUMB
+        IF ( OUT_MODEL(NDAD(IMI))%TBACKUPN(JOUT)%XTIME <= OUT_MODEL(IMI)%TBACKUPN(IPOS)%XTIME+1.E-6 ) THEN
+          IDX = JOUT
+        ELSE
+          EXIT
+        END IF
+      END DO
+      IF (IDX>0) THEN
+        OUT_MODEL(IMI)%TBACKUPN(IPOS)%NOUTDAD = IDX
+        WRITE (YDADNUMBER,FMT="('.',I3.3)") OUT_MODEL(IMI)%TBACKUPN(IPOS)%NOUTDAD
+        OUT_MODEL(IMI)%TBACKUPN(IPOS)%CDADFILENAME = ADJUSTL(ADJUSTR(CDAD_NAME(IMI))//YDADNUMBER)
+      ELSE
+        OUT_MODEL(IMI)%TBACKUPN(IPOS)%NOUTDAD = -1
+        WRITE ( OUT_MODEL(IMI)%TBACKUPN(IPOS)%CDADFILENAME , FMT="('NO_DAD_FILE')" )
+      END IF
+    END DO
     DO IPOS = 1,OUT_MODEL(IMI)%NOUT_NUMB
       IDX = 0
       DO JOUT = 1,OUT_MODEL(NDAD(IMI))%NOUT_NUMB
-        IF ( OUT_MODEL(NDAD(IMI))%TOUTBAKN(JOUT)%XTIME <= OUT_MODEL(IMI)%TOUTBAKN(IPOS)%XTIME+1.E-6 ) THEN
+        IF ( OUT_MODEL(NDAD(IMI))%TOUTPUTN(JOUT)%XTIME <= OUT_MODEL(IMI)%TOUTPUTN(IPOS)%XTIME+1.E-6 ) THEN
           IDX = JOUT
         ELSE
           EXIT
         END IF
       END DO
       IF (IDX>0) THEN
-        OUT_MODEL(IMI)%TOUTBAKN(IPOS)%NOUTDAD = IDX
-        WRITE (YDADNUMBER,FMT="('.',I3.3)") OUT_MODEL(IMI)%TOUTBAKN(IPOS)%NOUTDAD
-        OUT_MODEL(IMI)%TOUTBAKN(IPOS)%CDADFILENAME = ADJUSTL(ADJUSTR(CDAD_NAME(IMI))//YDADNUMBER)
+        OUT_MODEL(IMI)%TOUTPUTN(IPOS)%NOUTDAD = IDX
+        WRITE (YDADNUMBER,FMT="('.',I3.3)") OUT_MODEL(IMI)%TOUTPUTN(IPOS)%NOUTDAD
+        OUT_MODEL(IMI)%TOUTPUTN(IPOS)%CDADFILENAME = ADJUSTL(ADJUSTR(CDAD_NAME(IMI))//YDADNUMBER)
       ELSE
-        OUT_MODEL(IMI)%TOUTBAKN(IPOS)%NOUTDAD = -1
-        WRITE ( OUT_MODEL(IMI)%TOUTBAKN(IPOS)%CDADFILENAME , FMT="('NO_DAD_FILE')" )
+        OUT_MODEL(IMI)%TOUTPUTN(IPOS)%NOUTDAD = -1
+        WRITE ( OUT_MODEL(IMI)%TOUTPUTN(IPOS)%CDADFILENAME , FMT="('NO_DAD_FILE')" )
       END IF
     END DO
   END IF
   !
   DEALLOCATE(IBAK_STEP)
+  DEALLOCATE(IOUT_STEP)
   !
   IF (IP==1) THEN
   PRINT *,'-------------------------'
@@ -304,7 +228,14 @@ DO IMI = 1, NMODEL
   PRINT *,'Number of backups: ',IBAK_NUMB
   PRINT *,'Timestep     Time'
   DO JOUT = 1,IBAK_NUMB
-    WRITE(*,'( I9 F12.3 )'  ) OUT_MODEL(IMI)%TOUTBAKN(JOUT)%NSTEP,OUT_MODEL(IMI)%TOUTBAKN(JOUT)%XTIME
+    WRITE(*,'( I9 F12.3 )'  ) OUT_MODEL(IMI)%TBACKUPN(JOUT)%NSTEP,OUT_MODEL(IMI)%TBACKUPN(JOUT)%XTIME
+  END DO
+  PRINT *,'-------------------------'
+  PRINT *,'Model number:      ',IMI
+  PRINT *,'Number of outputs: ',IOUT_NUMB
+  PRINT *,'Timestep     Time'
+  DO JOUT = 1,IOUT_NUMB
+    WRITE(*,'( I9 F12.3 )'  ) OUT_MODEL(IMI)%TOUTPUTN(JOUT)%NSTEP,OUT_MODEL(IMI)%TOUTPUTN(JOUT)%XTIME
   END DO
   PRINT *,'-------------------------'
   END IF
@@ -312,7 +243,231 @@ DO IMI = 1, NMODEL
 END DO ! IMI=1,NMODEL
 !
 DEALLOCATE(NBAK_STEP)
+DEALLOCATE(NOUT_STEP)
 DEALLOCATE(XBAK_TIME)
+DEALLOCATE(XOUT_TIME)
+!
+CONTAINS
+!
+!#########################################################################
+SUBROUTINE IO_INSERT_REGULAR_FLOAT(PFIRST,PFREQ,PTIMES)
+!#########################################################################
+  !
+  REAL,              INTENT(IN)    :: PFIRST,PFREQ
+  REAL,DIMENSION(:), INTENT(INOUT) :: PTIMES
+  !
+  REAL              :: ZOUT, ZOUTMAX    ! Time of output/backup
+  !
+  IDX = 1
+  ZOUT = PFIRST
+  ZOUTMAX = PSEGLEN - PTSTEP*KSUP
+  DO WHILE ( ZOUT <= ZOUTMAX )
+    CALL FIND_NEXT_AVAIL_SLOT_FLOAT(PTIMES,IDX)
+    PTIMES(IDX) = ZOUT
+    ZOUT = ZOUT + PFREQ
+  END DO
+END SUBROUTINE IO_INSERT_REGULAR_FLOAT
+!
+!#########################################################################
+SUBROUTINE IO_INSERT_REGULAR_INT(KFIRST,KFREQ,KSTEPS)
+!#########################################################################
+  !
+  INTEGER,              INTENT(IN)    :: KFIRST,KFREQ
+  INTEGER,DIMENSION(:), INTENT(INOUT) :: KSTEPS
+  !
+  IDX = 1
+  DO JOUT = KFIRST, ISTEP_MAX, KFREQ
+    CALL FIND_NEXT_AVAIL_SLOT_INT(KSTEPS,IDX)
+    KSTEPS(IDX) = JOUT
+  END DO
+END SUBROUTINE IO_INSERT_REGULAR_INT
+!
+!#########################################################################
+SUBROUTINE IO_SYNC_MODELS_FLOAT(KNUMB,PTIMES)
+!#########################################################################
+  !
+  INTEGER,             INTENT(INOUT) :: KNUMB
+  REAL,DIMENSION(:,:), INTENT(INOUT) :: PTIMES
+  !
+  INTEGER :: JKLOOP ! Loop index
+  !
+  DO JOUT = 1,JPOUTMAX
+    IF (PTIMES(IMI,JOUT) >= 0.) THEN
+      KNUMB = KNUMB + 1
+      !Value is rounded to nearest timestep
+      PTIMES(IMI,JOUT) = NINT(PTIMES(IMI,JOUT)/DYN_MODEL(IMI)%XTSTEP) * DYN_MODEL(IMI)%XTSTEP
+      !Output/backup time is propagated to nested models (with higher numbers)
+      !PW: TODO: BUG?: what happens if 2 dissociated models? Use NSON(:) array?
+      DO JKLOOP = IMI+1,NMODEL
+        IDX = 1
+        CALL FIND_NEXT_AVAIL_SLOT_FLOAT(PTIMES(JKLOOP,:),IDX)
+        PTIMES(JKLOOP,IDX) = PTIMES(IMI,JOUT)
+      END DO
+    END IF
+  END DO
+END SUBROUTINE IO_SYNC_MODELS_FLOAT
+!
+!#########################################################################
+SUBROUTINE IO_SYNC_MODELS_INT(KNUMB,KSTEPS)
+!#########################################################################
+  !
+  INTEGER,                INTENT(INOUT) :: KNUMB
+  INTEGER,DIMENSION(:,:), INTENT(INOUT) :: KSTEPS
+  !
+  INTEGER :: JKLOOP ! Loop index
+  !
+  DO JOUT = 1,JPOUTMAX
+    IF (KSTEPS(IMI,JOUT) > 0) THEN
+      KNUMB = KNUMB + 1
+      !Output/backup time is propagated to nested models (with higher numbers)
+      !PW: TODO: BUG?: what happens if 2 dissociated models? Use NSON(:) array?
+      DO JKLOOP = IMI+1,NMODEL
+        IDX = 1
+        CALL FIND_NEXT_AVAIL_SLOT_INT(KSTEPS(JKLOOP,:),IDX)
+        ! Use of NINT and real to prevent rounding errors
+        ! (STEP-1)* ... +1 because step numbers begin at 1
+        KSTEPS(JKLOOP,IDX) = (KSTEPS(IMI,JOUT)-1) * NINT( DYN_MODEL(JKLOOP)%XTSTEP/DYN_MODEL(IMI)%XTSTEP ) + 1
+      END DO
+    END IF
+  END DO
+END SUBROUTINE IO_SYNC_MODELS_INT
+!
+!#########################################################################
+SUBROUTINE FIND_NEXT_AVAIL_SLOT_FLOAT(PTIMES,kIDX)
+!#########################################################################
+  !
+  REAL,DIMENSION(:), INTENT(IN)    :: PTIMES
+  INTEGER,           INTENT(INOUT) :: KIDX
+  !
+  !Find next (starting from KIDX) non 'allocated' element
+  DO WHILE ( PTIMES(KIDX) >= 0. )
+    KIDX = KIDX + 1
+    IF (KIDX > JPOUTMAX) THEN
+      PRINT *,'Error in SET_GRID when treating backup/output list (JPOUTMAX too small)'
+      CALL ABORT
+      STOP
+    END IF
+  END DO
+END SUBROUTINE FIND_NEXT_AVAIL_SLOT_FLOAT
+!
+!#########################################################################
+SUBROUTINE FIND_NEXT_AVAIL_SLOT_INT(KSTEPS,KIDX)
+!#########################################################################
+  !
+  INTEGER,DIMENSION(:), INTENT(IN)    :: KSTEPS
+  INTEGER,              INTENT(INOUT) :: KIDX
+  !
+  !Find next (starting from KIDX) non 'allocated' element
+  DO WHILE ( KSTEPS(IDX) >= 0 )
+    KIDX = KIDX + 1
+    IF (KIDX > JPOUTMAX) THEN
+      PRINT *,'Error in SET_GRID when treating backup/output list (JPOUTMAX too small)'
+      CALL ABORT
+      STOP
+    END IF
+  END DO
+END SUBROUTINE FIND_NEXT_AVAIL_SLOT_INT
+!
+!#########################################################################
+SUBROUTINE FIND_REMOVE_DUPLICATES(KNUMB,KSTEPS)
+!#########################################################################
+  !
+  INTEGER,              INTENT(IN)    :: KNUMB
+  INTEGER,DIMENSION(:), INTENT(INOUT) :: KSTEPS
+  !
+  INTEGER :: JKLOOP ! Loop index
+  !
+  DO JOUT = 1,KNUMB
+    DO JKLOOP = JOUT+1,KNUMB
+      IF ( KSTEPS(JKLOOP) == KSTEPS(JOUT) .AND. KSTEPS(JKLOOP) > 0 ) THEN
+        print *,'WARNING: found duplicated backup/output step (removed extra one)'
+        KSTEPS(JKLOOP) = NNEGUNDEF
+      END IF
+    END DO
+  END DO
+END SUBROUTINE FIND_REMOVE_DUPLICATES
+!
+!#########################################################################
+SUBROUTINE SORT_ENTRIES(KNUMB,KSTEPS)
+!#########################################################################
+  !
+  INTEGER,              INTENT(IN)    :: KNUMB
+  INTEGER,DIMENSION(:), INTENT(INOUT) :: KSTEPS
+  !
+  INTEGER :: ITEMP  ! Intermediate variable
+  INTEGER :: JKLOOP ! Loop index
+  !
+  DO JOUT = 1,KNUMB
+    ITEMP = KSTEPS(JOUT)
+    IF (ITEMP<=0) ITEMP = HUGE(ITEMP)
+    IPOS = -1
+    DO JKLOOP = JOUT+1,KNUMB
+      IF ( KSTEPS(JKLOOP) < ITEMP .AND. KSTEPS(JKLOOP) >= 0 ) THEN
+        ITEMP = KSTEPS(JKLOOP)
+        IPOS = JKLOOP
+      END IF
+    END DO
+    IF (IPOS >= JOUT) THEN
+      KSTEPS(IPOS) = KSTEPS(JOUT)
+      KSTEPS(JOUT) = ITEMP
+    END IF
+  END DO
+END SUBROUTINE SORT_ENTRIES
+!
+!#########################################################################
+SUBROUTINE POPULATE_STRUCT(TPFILE_FIRST,TPFILE_LAST,KSTEPS,HFILETYPE,TPBAKOUTN)
+!#########################################################################
+  !
+  TYPE(TFILEDATA),           POINTER,INTENT(INOUT) :: TPFILE_FIRST,TPFILE_LAST
+  INTEGER,DIMENSION(:),              INTENT(IN)    :: KSTEPS
+  CHARACTER(LEN=*),                  INTENT(IN)    :: HFILETYPE
+  TYPE(TOUTBAK),DIMENSION(:),POINTER,INTENT(OUT)   :: TPBAKOUTN
+  !
+  CHARACTER (LEN=4) :: YNUMBER          ! Character string for the file number
+  !
+  IPOS = 0
+  DO JOUT = 1,SIZE(KSTEPS)
+    IF (KSTEPS(JOUT) >= 0) THEN
+        IPOS = IPOS + 1
+        TPBAKOUTN(IPOS)%NID = IPOS
+        TPBAKOUTN(IPOS)%NSTEP = KSTEPS(JOUT)
+        TPBAKOUTN(IPOS)%XTIME = (KSTEPS(JOUT)-1)*DYN_MODEL(IMI)%XTSTEP
+        IF (IPOS>999) THEN
+          print *,'ERROR in SET_GRID: more than 999 backups/outputs'
+          STOP
+        END IF
+        IF (.NOT.ASSOCIATED(TPFILE_FIRST)) THEN
+          ALLOCATE(TPFILE_FIRST)
+          TPFILE_LAST => TPFILE_FIRST
+        ELSE
+          ALLOCATE(TPFILE_LAST%TFILE_NEXT)
+          TPFILE_LAST%TFILE_NEXT%TFILE_PREV => TPFILE_LAST
+          TPFILE_LAST => TPFILE_LAST%TFILE_NEXT
+        ENDIF
+        TPBAKOUTN(IPOS)%TFILE => TPFILE_LAST
+        TPBAKOUTN(IPOS)%TFILE%CTYPE=HFILETYPE
+        TPBAKOUTN(IPOS)%TFILE%CMODE="WRITE"
+        WRITE (YNUMBER,FMT="('.',I3.3)") IPOS
+        TPBAKOUTN(IPOS)%TFILE%CNAME=ADJUSTL(ADJUSTR(IO_SURF_MNH_MODEL(IMI)%COUTFILE)//YNUMBER)
+        TPBAKOUTN(IPOS)%TFILE%NLFITYPE=1 !1: to be transfered
+!PW: TODO: set NLFIVERB only when useful (only if LFI file...)
+        TPBAKOUTN(IPOS)%TFILE%NLFIVERB=NVERB
+        IF (LIOCDF4) THEN
+          TPBAKOUTN(IPOS)%TFILE%CTYPE='NETCDF4'
+          IF (LLFIOUT) THEN
+            PRINT *,'Warning: LLFIOUT + LIOCDF4 = .TRUE. not yet implemented with new IO data structures'
+            TPBAKOUTN(IPOS)%TFILE%NLFINPRAR= 22+2*(4+NRR+NSV)
+          END IF
+        ELSE IF (LLFIOUT) THEN
+          TPBAKOUTN(IPOS)%TFILE%CTYPE='LFI'
+          TPBAKOUTN(IPOS)%TFILE%NLFINPRAR= 22+2*(4+NRR+NSV)
+        ELSE
+          PRINT *,'Error: unknown backup/output fileformat'
+          CALL ABORT
+        ENDIF
+    END IF
+  END DO
+END SUBROUTINE POPULATE_STRUCT
 !
 END SUBROUTINE IO_PREPARE_BAKOUT_STRUCT
 !
diff --git a/src/MNH/ini_modeln.f90 b/src/MNH/ini_modeln.f90
index 12972c657..deb55ee7d 100644
--- a/src/MNH/ini_modeln.f90
+++ b/src/MNH/ini_modeln.f90
@@ -1555,7 +1555,7 @@ CALL SET_GRID(KMI,HINIFILE,HLUOUT,IIU,IJU,IKU,NIMAX_ll,NJMAX_ll,         &
               XXHAT,XYHAT,XDXHAT,XDYHAT, XMAP,                           &
               XZS,XZZ,XZHAT,LSLEVE,XLEN1,XLEN2,XZSMT,                    &
               ZJ,                                                        &
-              TDTMOD,TDTCUR,NSTOP,NOUT_NUMB,TOUTBAKN)
+              TDTMOD,TDTCUR,NSTOP,NBAK_NUMB,NOUT_NUMB,TBACKUPN,TOUTPUTN)
 !
 CALL METRICS(XMAP,XDXHAT,XDYHAT,XZZ,XDXX,XDYY,XDZX,XDZY,XDZZ)
 !
diff --git a/src/MNH/ini_spectren.f90 b/src/MNH/ini_spectren.f90
index 9777966f9..3aca74575 100644
--- a/src/MNH/ini_spectren.f90
+++ b/src/MNH/ini_spectren.f90
@@ -740,7 +740,7 @@ CALL SET_GRID(KMI,HINIFILE,HLUOUT,IIU,IJU,IKU,NIMAX_ll,NJMAX_ll,         &
               XXHAT,XYHAT,XDXHAT,XDYHAT, XMAP,                           &
               XZS,XZZ,XZHAT,LSLEVE,XLEN1,XLEN2,XZSMT,                    &
               ZJ,                                                        &
-              TDTMOD,TDTCUR,NSTOP,NOUT_NUMB,TOUTBAKN)
+              TDTMOD,TDTCUR,NSTOP,NBAK_NUMB,NOUT_NUMB,TBACKUPN,TOUTPUTN)
 !
 CALL METRICS(XMAP,XDXHAT,XDYHAT,XZZ,XDXX,XDYY,XDZX,XDZY,XDZZ)
 !
diff --git a/src/MNH/modd_fmout.f90 b/src/MNH/modd_fmout.f90
index df8ddd54e..d43402d8e 100644
--- a/src/MNH/modd_fmout.f90
+++ b/src/MNH/modd_fmout.f90
@@ -38,6 +38,7 @@
 !!    MODIFICATIONS
 !!    -------------
 !!      Original    26/07/96                     
+!!      Ph. Wautelet : 2016: new structures for outputs/backups
 !-------------------------------------------------------------------------------
 !
 !*       0.   DECLARATIONS
@@ -47,26 +48,26 @@ USE MODD_PARAMETERS
 !
 IMPLICIT NONE
 !
-LOGICAL,SAVE :: LBAK_BEG = .FALSE. ! Force a backup at the first timestep
-                                   ! of the segment for all models
-LOGICAL,SAVE :: LBAK_END = .FALSE. ! Force a backup at the last timestep
-                                   ! of the segment for all models
-REAL,SAVE,ALLOCATABLE,DIMENSION(:,:)  ::   XBAK_TIME 
-! XBAK_TIME(m,i) array of 
+LOGICAL,SAVE :: LBAK_BEG = .FALSE. ! Force a backup/output at the first timestep
+LOGICAL,SAVE :: LOUT_BEG = .FALSE. ! of the segment for all models
+LOGICAL,SAVE :: LBAK_END = .FALSE. ! Force a backup/output at the last timestep
+LOGICAL,SAVE :: LOUT_END = .FALSE. ! of the segment for all models
+REAL,SAVE,ALLOCATABLE,DIMENSION(:,:)  ::   XBAK_TIME, XOUT_TIME
+! XBAK_TIME(m,i) / XOUT_TIME(m,i) array of 
 ! the increments in seconds from the beginning of the segment to the
 ! instant where the i-th fields output on FM-files is realized by model "m"
-INTEGER,SAVE,ALLOCATABLE,DIMENSION(:,:)  ::   NBAK_STEP
-! NBAK_STEP(m,i) array of
+INTEGER,SAVE,ALLOCATABLE,DIMENSION(:,:)  ::   NBAK_STEP, NOUT_STEP
+! NBAK_STEP(m,i) / NOUT_STEP(m,i) array of
 ! the increments in steps from the beginning of the segment to the
 ! step where the i-th fields output on FM-files is realized by model "m"
-INTEGER,SAVE,DIMENSION(JPMODELMAX) :: NBAK_STEP_FREQ = NNEGUNDEF ! Number
-! of timesteps between 2 backups for each model
-INTEGER,SAVE,DIMENSION(JPMODELMAX) :: NBAK_STEP_FREQ_FIRST = 1   ! First
-! timestep numbers between 2 backups for each model (if NBAK_STEP_FREQ is set)
-REAL,SAVE,DIMENSION(JPMODELMAX) :: XBAK_TIME_FREQ = XNEGUNDEF ! Time between
-! 2 backups for each model
-REAL,SAVE,DIMENSION(JPMODELMAX) :: XBAK_TIME_FREQ_FIRST = 0.   ! Time for first
-! backup for each model (if XBAK_TIME_FREQ is set)
+INTEGER,SAVE,DIMENSION(JPMODELMAX) :: NBAK_STEP_FREQ = NNEGUNDEF, NOUT_STEP_FREQ = NNEGUNDEF
+! Number of timesteps between 2 backups/outputs for each model
+INTEGER,SAVE,DIMENSION(JPMODELMAX) :: NBAK_STEP_FREQ_FIRST = 1, NOUT_STEP_FREQ_FIRST = 1
+! First timestep numbers between 2 backups/outputs for each model (if NBAK/OUT_STEP_FREQ is set)
+REAL,SAVE,DIMENSION(JPMODELMAX) :: XBAK_TIME_FREQ = XNEGUNDEF, XOUT_TIME_FREQ = XNEGUNDEF
+! 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)
 !
 !
 END MODULE MODD_FMOUT
diff --git a/src/MNH/modd_outn.f90 b/src/MNH/modd_outn.f90
index a51dc5863..531d77413 100644
--- a/src/MNH/modd_outn.f90
+++ b/src/MNH/modd_outn.f90
@@ -48,16 +48,17 @@ IMPLICIT NONE
 
 TYPE OUT_t
 !
-  INTEGER             :: NOUT_NUMB ! number of outputs perform by model n
-  TYPE(TOUTBAK),DIMENSION(:),POINTER :: TOUTBAKN=>NULL() ! List of the outputs and backups
+  INTEGER             :: NBAK_NUMB, NOUT_NUMB ! number of outputs and backups performed by model n
+  TYPE(TOUTBAK),DIMENSION(:),POINTER :: TBACKUPN=>NULL(),TOUTPUTN=>NULL()
+! Lists of the outputs and backups
 !
 !
 END TYPE OUT_t
 
 TYPE(OUT_t), DIMENSION(JPMODELMAX), TARGET, SAVE :: OUT_MODEL
 
-INTEGER, POINTER :: NOUT_NUMB=>NULL()
-TYPE(TOUTBAK),DIMENSION(:),POINTER :: TOUTBAKN=>NULL()
+INTEGER, POINTER :: NBAK_NUMB=>NULL(), NOUT_NUMB=>NULL()
+TYPE(TOUTBAK),DIMENSION(:),POINTER :: TBACKUPN=>NULL(), TOUTPUTN=>NULL()
 
 CONTAINS
 
@@ -65,8 +66,10 @@ SUBROUTINE OUT_GOTO_MODEL(KFROM, KTO)
 INTEGER, INTENT(IN) :: KFROM, KTO
 !
 ! Current model is set to model KTO
+NBAK_NUMB=>OUT_MODEL(KTO)%NBAK_NUMB
 NOUT_NUMB=>OUT_MODEL(KTO)%NOUT_NUMB
-TOUTBAKN=>OUT_MODEL(KTO)%TOUTBAKN
+TBACKUPN=>OUT_MODEL(KTO)%TBACKUPN
+TOUTPUTN=>OUT_MODEL(KTO)%TOUTPUTN
 
 END SUBROUTINE OUT_GOTO_MODEL
 
diff --git a/src/MNH/modd_sub_modeln.f90 b/src/MNH/modd_sub_modeln.f90
index 0acf53a8a..bb8eae10d 100644
--- a/src/MNH/modd_sub_modeln.f90
+++ b/src/MNH/modd_sub_modeln.f90
@@ -31,7 +31,7 @@ TYPE SUB_MODEL_t
   TYPE(HALO2LIST_ll), POINTER :: TZHALO2T_ll
   TYPE(HALO2LIST_ll), POINTER :: TZHALO2MT_ll
   TYPE(HALO2LIST_ll), POINTER :: TZHALO2SC_ll
-  INTEGER :: IOUT          ! numero of the OUTPUT FM-file
+  INTEGER :: IBAK, IOUT       ! number of the backup / output
   REAL*8,DIMENSION(2)    :: XT_START
   REAL*8,DIMENSION(2)    :: XT_STORE,XT_BOUND,XT_GUESS
   REAL*8,DIMENSION(2)    :: XT_ADV,XT_SOURCES,XT_DRAG
@@ -58,6 +58,7 @@ TYPE(LIST_ll), POINTER :: TZFIELDS_ll=>NULL(),TZLSFIELD_ll=>NULL(),TZFIELDM_ll=>
 TYPE(LIST_ll), POINTER :: TZFIELDT_ll=>NULL(),TZFIELDMT_ll=>NULL(),TZFIELDSC_ll=>NULL()
 TYPE(HALO2LIST_ll), POINTER :: TZHALO2M_ll=>NULL(), TZLSHALO2_ll=>NULL()
 TYPE(HALO2LIST_ll), POINTER :: TZHALO2T_ll=>NULL(), TZHALO2MT_ll=>NULL(), TZHALO2SC_ll=>NULL()
+INTEGER, POINTER :: IBAK=>NULL()
 INTEGER, POINTER :: IOUT=>NULL()
 REAL*8,DIMENSION(:), POINTER :: XT_START=>NULL()
 REAL*8,DIMENSION(:), POINTER :: XT_STORE=>NULL(),XT_BOUND=>NULL(),XT_GUESS=>NULL()
@@ -107,6 +108,7 @@ TZLSHALO2_ll=>SUB_MODEL_MODEL(KTO)%TZLSHALO2_ll
 TZHALO2T_ll=>SUB_MODEL_MODEL(KTO)%TZHALO2T_ll
 TZHALO2MT_ll=>SUB_MODEL_MODEL(KTO)%TZHALO2MT_ll
 TZHALO2SC_ll=>SUB_MODEL_MODEL(KTO)%TZHALO2SC_ll
+IBAK=>SUB_MODEL_MODEL(KTO)%IBAK
 IOUT=>SUB_MODEL_MODEL(KTO)%IOUT
 XT_START=>SUB_MODEL_MODEL(KTO)%XT_START
 XT_STORE=>SUB_MODEL_MODEL(KTO)%XT_STORE
diff --git a/src/MNH/modeln.f90 b/src/MNH/modeln.f90
index 7788c1848..7ba4a816a 100644
--- a/src/MNH/modeln.f90
+++ b/src/MNH/modeln.f90
@@ -602,7 +602,7 @@ IF (KTCOUNT == 1) THEN
   ALLOCATE(GMASKkids(SIZE(XWT,1),SIZE(XWT,2)))
 !
 ! initialization of the FM file output number
-  IOUT=0
+  IBAK=0
 !
   INPRAR = 50
   CALL FMOPEN_ll(CFMDIAC,'WRITE',CLUOUT,INPRAR,ITYPE,NVERB,ININAR,IRESP)
@@ -906,14 +906,14 @@ IF (CSURF=='EXTE') CALL GOTO_SURFEX(IMI)
 ZTIME1 = ZTIME2
 !
 YFMFILE='                            '
-IF (IOUT < NOUT_NUMB ) THEN
-  IF (KTCOUNT == TOUTBAKN(IOUT+1)%NSTEP) THEN
-    IOUT=IOUT+1
+IF (IBAK < NBAK_NUMB ) THEN
+  IF (KTCOUNT == TBACKUPN(IBAK+1)%NSTEP) THEN
+    IBAK=IBAK+1
     GCLOSE_OUT=.TRUE.
     !
-    TZFILE => TOUTBAKN(IOUT)%TFILE
+    TZFILE => TBACKUPN(IBAK)%TFILE
     YFMFILE  = TZFILE%CNAME
-    YDADFILE = TOUTBAKN(IOUT)%CDADFILENAME
+    YDADFILE = TBACKUPN(IBAK)%CDADFILENAME
     YMODE    = TZFILE%CMODE
     INPRAR   = TZFILE%NLFINPRAR
     ITYPE    = TZFILE%NLFITYPE
@@ -928,7 +928,7 @@ IF (IOUT < NOUT_NUMB ) THEN
     YDESFM=ADJUSTL(ADJUSTR(YFMFILE)//'.des')
     !    
     CALL WRITE_DESFM_n(IMI,YDESFM,CLUOUT)
-    CALL WRITE_LFIFM_n(YFMFILE,YDADFILE,TOUTBAKN(IOUT)%TFILE)
+    CALL WRITE_LFIFM_n(YFMFILE,YDADFILE,TBACKUPN(IBAK)%TFILE)
     COUTFMFILE = YFMFILE
     CALL MNHWRITE_ZS_DUMMY_n(CPROGRAM)
     IF (CSURF=='EXTE') THEN
@@ -1301,8 +1301,8 @@ IF (CDCONV/='NONE') THEN
   END IF
 END IF
 !
-IF (IOUT>0 .AND. IOUT <= NOUT_NUMB ) THEN
-  IF (KTCOUNT == TOUTBAKN(IOUT)%NSTEP) THEN
+IF (IBAK>0 .AND. IBAK <= NBAK_NUMB ) THEN
+  IF (KTCOUNT == TBACKUPN(IBAK)%NSTEP) THEN
     IF (CSURF=='EXTE') THEN
       CALL GOTO_SURFEX(IMI)
       CALL DIAG_SURF_ATM_n(YSURF_CUR%IM%DGEI, YSURF_CUR%FM%DGF, YSURF_CUR%DGL, YSURF_CUR%IM%DGI, &
diff --git a/src/MNH/modn_fmout.f90 b/src/MNH/modn_fmout.f90
index eba6b91cc..7793d94cb 100644
--- a/src/MNH/modn_fmout.f90
+++ b/src/MNH/modn_fmout.f90
@@ -24,10 +24,6 @@
 !!      Module MODD_FMOUT : contains declaration of the variables describing 
 !!                          the instants for the outputs
 !!
-!!         XFMOUT :  XFMOUT(m,i) array of increments in seconds from 
-!!                 the beginning of the segment to the instant where the i-th
-!!                 fields output on FM-files is realized by model "m"
-!!
 !!    REFERENCE
 !!    ---------
 !!      Book2 of Meso-NH documentation (module MODD_FMOUT)
@@ -39,6 +35,7 @@
 !!    MODIFICATIONS
 !!    -------------
 !!      Original    26/07/96                      
+!!      Ph. Wautelet : 2016: new structures for outputs/backups
 !-------------------------------------------------------------------------------
 !
 !*       0.   DECLARATIONS
@@ -51,6 +48,10 @@ IMPLICIT NONE
 NAMELIST/NAM_FMOUT/LBAK_BEG,LBAK_END,&
                    XBAK_TIME,NBAK_STEP,&
                    NBAK_STEP_FREQ,NBAK_STEP_FREQ_FIRST,&
-                   XBAK_TIME_FREQ,XBAK_TIME_FREQ_FIRST
+                   XBAK_TIME_FREQ,XBAK_TIME_FREQ_FIRST, &
+                   LOUT_BEG,LOUT_END,&
+                   XOUT_TIME,NOUT_STEP,&
+                   NOUT_STEP_FREQ,NOUT_STEP_FREQ_FIRST,&
+                   XOUT_TIME_FREQ,XOUT_TIME_FREQ_FIRST
 !
 END MODULE MODN_FMOUT
diff --git a/src/MNH/read_desfmn.f90 b/src/MNH/read_desfmn.f90
index 9612d778a..287f5f8e6 100644
--- a/src/MNH/read_desfmn.f90
+++ b/src/MNH/read_desfmn.f90
@@ -191,6 +191,7 @@ END MODULE MODI_READ_DESFM_n
 !!      Modification   07/2013   (Bosseur & Filippi) Adds Forefire
 !!      Modification   01/2015   (C. Barthe) Add explicit LNOx
 !!      Modification   2016      (B.VIE) LIMA
+!!      Modification   11/2016   (Ph. Wautelet) Allocate/initialise some output/backup structures
 !-------------------------------------------------------------------------------
 !
 !*       0.    DECLARATIONS
@@ -425,10 +426,14 @@ IF (KMI == 1) THEN
   CALL POSNAM(ILUDES,'NAM_FMOUT',GFOUND)
   IF (GFOUND) THEN
     IF (.NOT.ALLOCATED(XBAK_TIME)) ALLOCATE(XBAK_TIME(NMODEL,JPOUTMAX))
+    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))
     READ(UNIT=ILUDES,NML=NAM_FMOUT)
     XBAK_TIME(:,:) = XNEGUNDEF
+    XOUT_TIME(:,:) = XNEGUNDEF
     NBAK_STEP(:,:) = NNEGUNDEF
+    NOUT_STEP(:,:) = NNEGUNDEF
   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 6460939ca..4ac2f3ed8 100644
--- a/src/MNH/read_exsegn.f90
+++ b/src/MNH/read_exsegn.f90
@@ -285,6 +285,7 @@ END MODULE MODI_READ_EXSEG_n
 !!      P.Wautelet 08/07/2016 : removed MNH_NCWRIT define
 !!      Modification   10/2016    (C.LAC) Add OSPLIT_WENO + Add droplet
 !!                                deposition + Add max values
+!!      Modification   11/2016   (Ph. Wautelet) Allocate/initialise some output/backup structures
 !!------------------------------------------------------------------------------
 !
 !*       0.    DECLARATIONS
@@ -497,9 +498,13 @@ IF (KMI == 1) THEN
   IF (GFOUND) THEN
     !Should have been allocated before in READ_DESFM_n 
     IF (.NOT.ALLOCATED(XBAK_TIME)) ALLOCATE(XBAK_TIME(NMODEL,JPOUTMAX))
+    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))
     XBAK_TIME(:,:) = XNEGUNDEF
+    XOUT_TIME(:,:) = XNEGUNDEF
     NBAK_STEP(:,:) = NNEGUNDEF
+    NOUT_STEP(:,:) = NNEGUNDEF
     READ(UNIT=ILUSEG,NML=NAM_FMOUT)
   END IF
   CALL POSNAM(ILUSEG,'NAM_BUDGET',GFOUND,ILUOUT)
diff --git a/src/MNH/set_grid.f90 b/src/MNH/set_grid.f90
index d91f3538c..1aca11b48 100644
--- a/src/MNH/set_grid.f90
+++ b/src/MNH/set_grid.f90
@@ -25,7 +25,8 @@ INTERFACE
                           PXHAT,PYHAT,PDXHAT,PDYHAT, PMAP,                    &
                           PZS,PZZ,PZHAT,OSLEVE,PLEN1,PLEN2,PZSMT,             &
                           PJ,                                                 &
-                          TPDTMOD,TPDTCUR,KSTOP,KOUT_NUMB,TPOUTBAKN           )
+                          TPDTMOD,TPDTCUR,KSTOP,                              &
+                          KBAK_NUMB,KOUT_NUMB,TPBACKUPN,TPOUTPUTN             )
 !
 USE MODD_TYPE_DATE
 USE MODD_IO_ll, ONLY:TOUTBAK
@@ -86,8 +87,10 @@ TYPE (DATE_TIME),       INTENT(OUT) :: TPDTMOD   ! date and time of the model
 TYPE (DATE_TIME),       INTENT(OUT) :: TPDTCUR   ! Current date and time
 INTEGER,                INTENT(OUT) :: KSTOP     ! number of time steps for
                                                  ! current segment
+INTEGER,POINTER,        INTENT(OUT) :: KBAK_NUMB ! number of backups
 INTEGER,POINTER,        INTENT(OUT) :: KOUT_NUMB ! number of outputs
-TYPE(TOUTBAK),DIMENSION(:),POINTER,INTENT(OUT) :: TPOUTBAKN ! List of outputs and backups
+TYPE(TOUTBAK),DIMENSION(:),POINTER,INTENT(OUT) :: TPBACKUPN ! List of backups
+TYPE(TOUTBAK),DIMENSION(:),POINTER,INTENT(OUT) :: TPOUTPUTN ! List of outputs
 !
 REAL, DIMENSION(:,:,:), INTENT(OUT) :: PJ        ! Jacobian
 !
@@ -113,7 +116,8 @@ END MODULE MODI_SET_GRID
                           PXHAT,PYHAT,PDXHAT,PDYHAT, PMAP,                    &
                           PZS,PZZ,PZHAT,OSLEVE,PLEN1,PLEN2,PZSMT,             &
                           PJ,                                                 &
-                          TPDTMOD,TPDTCUR,KSTOP,KOUT_NUMB,TPOUTBAKN           )
+                          TPDTMOD,TPDTCUR,KSTOP,                              &
+                          KBAK_NUMB,KOUT_NUMB,TPBACKUPN,TPOUTPUTN             )
 !     #########################################################################
 !
 !!****  *SET_GRID* - routine to set grid variables
@@ -314,8 +318,10 @@ TYPE (DATE_TIME),       INTENT(OUT) :: TPDTMOD   ! date and time of the model
 TYPE (DATE_TIME),       INTENT(OUT) :: TPDTCUR   ! Current date and time
 INTEGER,                INTENT(OUT) :: KSTOP     ! number of time steps for
                                                  ! current segment
+INTEGER,POINTER,        INTENT(OUT) :: KBAK_NUMB ! number of backups
 INTEGER,POINTER,        INTENT(OUT) :: KOUT_NUMB ! number of outputs
-TYPE(TOUTBAK),DIMENSION(:),POINTER,INTENT(OUT) :: TPOUTBAKN ! List of outputs and backups
+TYPE(TOUTBAK),DIMENSION(:),POINTER,INTENT(OUT) :: TPBACKUPN ! List of backups
+TYPE(TOUTBAK),DIMENSION(:),POINTER,INTENT(OUT) :: TPOUTPUTN ! List of outputs
 !
 REAL, DIMENSION(:,:,:), INTENT(OUT) :: PJ        ! Jacobian
 !
@@ -512,8 +518,10 @@ KSTOP = NINT(PSEGLEN/PTSTEP)
 ! The output/backups times have been read only by model 1
 IF (KMI == 1) CALL IO_PREPARE_BAKOUT_STRUCT(ISUP,PTSTEP,PSEGLEN)
 !
+KBAK_NUMB => OUT_MODEL(KMI)%NBAK_NUMB
 KOUT_NUMB => OUT_MODEL(KMI)%NOUT_NUMB
-TPOUTBAKN => OUT_MODEL(KMI)%TOUTBAKN
+TPBACKUPN => OUT_MODEL(KMI)%TBACKUPN
+TPOUTPUTN => OUT_MODEL(KMI)%TOUTPUTN
 !
 !-------------------------------------------------------------------------------
 !
-- 
GitLab