From 220484c6953cc27797fb9bd8574e4592d2e30a06 Mon Sep 17 00:00:00 2001
From: Philippe WAUTELET <philippe.wautelet@aero.obs-mip.fr>
Date: Thu, 27 Jul 2017 15:33:14 +0200
Subject: [PATCH] Philippe 27/07/2017: IO: * added IO_FILE_ADD2LIST subroutine
 and use it * IO_FILE_OPEN now requires the file to be in the file list *
 IO_FILE_FIND_BYNAME: added optional argument useful when checking   that a
 file does not yet exist   + bug correction when filelist is empty * added
 IO_FILE_PRINT_LIST subroutine (only for debugging) * added TPTR2FILE
 structure to allow construction of arrays of   pointers to files * use
 IO_READ_FIELD for some 3D float arrays (in read_field.f90) * OPEN_ll: added
 UPDATE_METADATA internal subroutines to treat file metadata

---
 src/LIB/SURCOUCHE/src/modd_io.f90             |   5 +
 src/LIB/SURCOUCHE/src/mode_fm.f90             |  61 ++--
 src/LIB/SURCOUCHE/src/mode_io.f90             |  86 ++++--
 .../SURCOUCHE/src/mode_io_manage_struct.f90   | 187 ++++++++++--
 src/MNH/diag.f90                              |  45 +--
 src/MNH/ini_modeln.f90                        |  40 +--
 src/MNH/ini_segn.f90                          |  30 +-
 src/MNH/init_mnh.f90                          |  20 +-
 src/MNH/modd_lunitn.f90                       |   2 +-
 src/MNH/open_nestpgd_files.f90                |  79 ++----
 src/MNH/prep_ideal_case.f90                   |  46 +--
 src/MNH/prep_nest_pgd.f90                     |  68 ++---
 src/MNH/prep_pgd.f90                          |  23 +-
 src/MNH/prep_real_case.f90                    |  27 +-
 src/MNH/prep_surfex.f90                       |  25 +-
 src/MNH/read_field.f90                        | 265 ++++++++----------
 src/MNH/spawn_model2.f90                      |  26 +-
 src/MNH/zoom_pgd.f90                          |  24 +-
 18 files changed, 525 insertions(+), 534 deletions(-)

diff --git a/src/LIB/SURCOUCHE/src/modd_io.f90 b/src/LIB/SURCOUCHE/src/modd_io.f90
index d2eb939e0..809e1e089 100644
--- a/src/LIB/SURCOUCHE/src/modd_io.f90
+++ b/src/LIB/SURCOUCHE/src/modd_io.f90
@@ -92,6 +92,11 @@ TYPE TFILEDATA
   TYPE(TFILEDATA),POINTER :: TFILE_NEXT => NULL()
 END TYPE TFILEDATA
 
+!Structure containing a pointer to a file (useful to create arrays of pointers to files)
+TYPE TPTR2FILE
+  TYPE(TFILEDATA),POINTER :: TZFILE => NULL()
+END TYPE
+
 TYPE(TFILEDATA),POINTER,SAVE :: TFILE_FIRST => NULL()
 TYPE(TFILEDATA),POINTER,SAVE :: TFILE_LAST  => NULL()
 
diff --git a/src/LIB/SURCOUCHE/src/mode_fm.f90 b/src/LIB/SURCOUCHE/src/mode_fm.f90
index 9f478552d..04104bcc1 100644
--- a/src/LIB/SURCOUCHE/src/mode_fm.f90
+++ b/src/LIB/SURCOUCHE/src/mode_fm.f90
@@ -134,7 +134,7 @@ END SUBROUTINE FMLOOK_ll
 
 SUBROUTINE IO_FILE_OPEN_ll(TPFILE,HFIPRI,KRESP,OPARALLELIO)
 !
-USE MODD_IO_ll, ONLY: ISP,LIOCDF4,TFILEDATA
+USE MODD_IO_ll, ONLY: ISP,LIOCDF4,LLFIOUT,LLFIREAD,TFILEDATA
 USE MODE_FD_ll, ONLY: FD_ll,GETFD
 USE MODE_IO_MANAGE_STRUCT, ONLY: IO_FILE_FIND_BYNAME
 !
@@ -144,10 +144,9 @@ INTEGER,          INTENT(OUT)   :: KRESP  ! Return code
 LOGICAL,          INTENT(IN),  OPTIONAL :: OPARALLELIO
 !
 INTEGER :: ININAR ! Number of articles present in LFI file (unused here)
-INTEGER :: JI,IRESP
-CHARACTER (LEN=3) :: YNUMBER  ! Character string for Z-level
-TYPE(FD_ll), POINTER  :: TZFDLFI,TZFD_IOZ
-TYPE(TFILEDATA),POINTER :: TZFILE_IOZ
+INTEGER :: IRESP
+TYPE(FD_ll), POINTER  :: TZFDLFI
+TYPE(TFILEDATA),POINTER :: TZFILE
 !
 CALL PRINT_MSG(NVERB_DEBUG,'IO','IO_FILE_OPEN_ll','opening '//TRIM(TPFILE%CNAME)//' for '//TRIM(TPFILE%CMODE))
 !
@@ -156,33 +155,37 @@ IF (TPFILE%LOPENED) THEN
   RETURN
 END IF
 !
-IF (.NOT.PRESENT(OPARALLELIO)) THEN 
-  CALL FMOPEN_ll(TPFILE%CNAME,TPFILE%CMODE,HFIPRI,TPFILE%NLFINPRAR,TPFILE%NLFITYPE,TPFILE%NLFIVERB,ININAR,KRESP,TPFILE=TPFILE)
-ELSE
-  CALL FMOPEN_ll(TPFILE%CNAME,TPFILE%CMODE,HFIPRI,TPFILE%NLFINPRAR,TPFILE%NLFITYPE,TPFILE%NLFIVERB,ININAR,KRESP,&
-                 TPFILE=TPFILE,OPARALLELIO=OPARALLELIO)
-END IF
+!Check if file is in filelist
+CALL IO_FILE_FIND_BYNAME(TRIM(TPFILE%CNAME),TZFILE,IRESP)
+IF (IRESP/=0) CALL PRINT_MSG(NVERB_ERROR,'IO','IO_FILE_OPEN_ll','file '//TRIM(TPFILE%CNAME)//' not in filelist')
+!
+CALL FMOPEN_ll(TPFILE%CNAME,TPFILE%CMODE,HFIPRI,TPFILE%NLFINPRAR,TPFILE%NLFITYPE,TPFILE%NLFIVERB,ININAR,KRESP,&
+               TPFILE=TPFILE,OPARALLELIO=OPARALLELIO)
 !
 TPFILE%LOPENED = .TRUE.
 TPFILE%NOPEN   = TPFILE%NOPEN + 1
 !
 TZFDLFI=>GETFD(ADJUSTL(TRIM(TPFILE%CNAME)//'.lfi'))
 !TZFDLFI%CDF exists only if ISP == TZFDLFI%OWNER
-IF (ISP == TZFDLFI%OWNER .AND. LIOCDF4) TPFILE%NNCID = TZFDLFI%CDF%NCID
-!
-IF (TZFDLFI%NB_PROCIO>1) THEN
-  DO JI = 1,TZFDLFI%NB_PROCIO
-    WRITE (YNUMBER,FMT="(I3.3)") JI
-    TZFD_IOZ => GETFD(TRIM(TPFILE%CNAME)//'.Z'//YNUMBER//'.lfi')
-    IF (ISP == TZFD_IOZ%OWNER .AND. LIOCDF4) THEN
-      CALL IO_FILE_FIND_BYNAME(TRIM(TPFILE%CNAME)//'.Z'//YNUMBER,TZFILE_IOZ,IRESP)
-      IF (IRESP/=0) &
-        CALL PRINT_MSG(NVERB_FATAL,'IO','IO_FILE_OPEN_ll','file '//TRIM(TRIM(TPFILE%CNAME)//'.Z'//YNUMBER)//' not found in list')
-      TZFILE_IOZ%NNCID   = TZFD_IOZ%CDF%NCID
-      TZFILE_IOZ%LOPENED = .TRUE.
-      TZFILE_IOZ%NOPEN   = TZFILE_IOZ%NOPEN + 1
-    END IF
-  END DO
+IF (TRIM(TPFILE%CMODE) == 'READ' .AND. ISP == TZFDLFI%OWNER) THEN
+  IF (LIOCDF4 .AND. .NOT.LLFIREAD) THEN
+    TPFILE%NNCID = TZFDLFI%CDF%NCID
+    IF (TPFILE%NNCID<0) CALL PRINT_MSG(NVERB_FATAL,'IO','IO_FILE_OPEN_ll','invalid NNCID for '//TRIM(TPFILE%CNAME))
+  ELSE
+    TPFILE%NLFIFLU = TZFDLFI%FLU
+    IF (TPFILE%NLFIFLU<0) CALL PRINT_MSG(NVERB_FATAL,'IO','IO_FILE_OPEN_ll','invalid NLFIFLU for '//TRIM(TPFILE%CNAME))
+  ENDIF
+ELSE IF (TRIM(TPFILE%CMODE) == 'WRITE' .AND. ISP == TZFDLFI%OWNER) THEN
+  IF (LIOCDF4) THEN
+    TPFILE%NNCID = TZFDLFI%CDF%NCID
+    IF (TPFILE%NNCID<0) CALL PRINT_MSG(NVERB_FATAL,'IO','IO_FILE_OPEN_ll','invalid NNCID for '//TRIM(TPFILE%CNAME))
+  END IF
+  IF (.NOT.LIOCDF4 .OR. LLFIOUT) THEN
+    TPFILE%NLFIFLU = TZFDLFI%FLU
+    IF (TPFILE%NLFIFLU<0) CALL PRINT_MSG(NVERB_FATAL,'IO','IO_FILE_OPEN_ll','invalid NLFIFLU for '//TRIM(TPFILE%CNAME))
+  END IF
+ELSE IF (TRIM(TPFILE%CMODE) /= 'READ' .AND. TRIM(TPFILE%CMODE) /= 'WRITE') THEN
+  CALL PRINT_MSG(NVERB_FATAL,'IO','IO_FILE_OPEN_ll','unknown opening mode ('//TRIM(TPFILE%CMODE)//') for '//TRIM(TPFILE%CNAME))
 END IF
 !
 END SUBROUTINE IO_FILE_OPEN_ll
@@ -213,7 +216,7 @@ INTEGER,         INTENT(OUT)::KNINAR  ! number of articles
 INTEGER,         INTENT(OUT)::KRESP   ! return-code if a problem
 ! araised.
 LOGICAL,         INTENT(IN),  OPTIONAL :: OPARALLELIO
-TYPE(TFILEDATA), INTENT(IN),  OPTIONAL :: TPFILE ! File structure
+TYPE(TFILEDATA), INTENT(INOUT), OPTIONAL :: TPFILE ! File structure
 !
 !   Local variable
 !
@@ -238,6 +241,7 @@ INTEGER(KIND=IDCDF_KIND) :: INCERR
 CHARACTER(LEN=13) :: YTYPE
 
 CALL PRINT_MSG(NVERB_DEBUG,'IO','FMOPEN_ll','opening '//TRIM(HFILEM)//' for '//TRIM(HACTION))
+
 IF ( PRESENT(TPFILE) ) THEN
   YTYPE = TPFILE%CTYPE
 ELSE
@@ -291,7 +295,7 @@ ENDIF
 IF(YTYPE/='OUTPUT') THEN
   YFNDES=ADJUSTL(TRIM(HFILEM)//'.des')
   CALL OPEN_ll(UNIT=INUMBR,FILE=YFNDES,FORM='FORMATTED',ACTION=HACTION,DELIM&
-       & ='QUOTE',IOSTAT=IRESP,RECL=1024*8,OPARALLELIO=GPARALLELIO,TPFILE=TPFILE)
+       & ='QUOTE',IOSTAT=IRESP,RECL=1024*8,OPARALLELIO=GPARALLELIO)
 ENDIF
 
 IF (IRESP /= 0) GOTO 1000
@@ -505,6 +509,7 @@ LOGICAL :: GPARALLELIO
 CHARACTER(LEN=13) :: YTYPE
 
 CALL PRINT_MSG(NVERB_DEBUG,'IO','FMCLOS_ll','closing '//TRIM(HFILEM))
+
 IF ( PRESENT(TPFILE) ) THEN
   YTYPE = TPFILE%CTYPE
 ELSE
diff --git a/src/LIB/SURCOUCHE/src/mode_io.f90 b/src/LIB/SURCOUCHE/src/mode_io.f90
index 25fe5b610..b80650bc7 100644
--- a/src/LIB/SURCOUCHE/src/mode_io.f90
+++ b/src/LIB/SURCOUCHE/src/mode_io.f90
@@ -232,6 +232,8 @@ CONTAINS
   USE MODE_NETCDF
 #endif
   USE MODD_IO_ll
+  USE MODE_IO_MANAGE_STRUCT, ONLY: IO_FILE_ADD2LIST, IO_FILE_FIND_BYNAME
+
     INTEGER,         INTENT(OUT)           :: UNIT  !! Different from fortran OPEN
     CHARACTER(len=*),INTENT(IN),  OPTIONAL :: FILE
     CHARACTER(len=*),INTENT(IN),  OPTIONAL :: MODE
@@ -252,7 +254,7 @@ CONTAINS
     INTEGER(KIND=LFI_INT), INTENT(IN),  OPTIONAL :: KMELEV    
     LOGICAL,         INTENT(IN),  OPTIONAL :: OPARALLELIO
     !JUANZ
-    TYPE(TFILEDATA), INTENT(IN),  OPTIONAL :: TPFILE
+    TYPE(TFILEDATA), INTENT(INOUT), OPTIONAL :: TPFILE
     !
     ! local var
     !
@@ -280,7 +282,7 @@ CONTAINS
 #endif
     CHARACTER(len=20)    :: YACTION
     CHARACTER(len=20)    :: YMODE
-    INTEGER              :: IOS,IERR
+    INTEGER              :: IOS,IERR,IRESP
     INTEGER(KIND=IDCDF_KIND) :: IOSCDF
     INTEGER              :: ICOMM
     INTEGER              :: ICMPRES
@@ -292,6 +294,7 @@ CONTAINS
     !JUAN SX5 : probleme function retournant un pointer
     TYPE(FD_ll), POINTER :: TZJUAN
     LOGICAL               :: GPARALLELIO
+    TYPE(TFILEDATA),POINTER :: TZSPLITFILE
 
     IF ( PRESENT(FILE) ) THEN
       CALL PRINT_MSG(NVERB_DEBUG,'IO','OPEN_ll','opening '//TRIM(FILE)//' for '//TRIM(ACTION))
@@ -534,7 +537,7 @@ CONTAINS
        ELSE 
           !! NON I/O processors case
           IOS = 0
-          TZFD%FLU = JPFNULL 
+          TZFD%FLU = JPFNULL
        END IF
 
     CASE('SPECIFIC')
@@ -655,7 +658,8 @@ CONTAINS
           TZFD%FLU = -1
        END IF
        IF (TZFD%NB_PROCIO .GT. 1 ) THEN
-          IF (.NOT.PRESENT(TPFILE)) CALL PRINT_MSG(NVERB_FATAL,'IO','INI_MODEL_n','TPFILE not provided for IO_ZSPLIT case')
+          IF (.NOT.PRESENT(TPFILE)) CALL PRINT_MSG(NVERB_WARNING,'IO','OPEN_ll','TPFILE not provided for IO_ZSPLIT case for file '&
+                                                   //TRIM(FILE))
           DO ifile=0,TZFD%NB_PROCIO-1
              irank_procio = 1 + io_rank(ifile,ISNPROC,TZFD%NB_PROCIO)
              write(cfile ,'(".Z",i3.3)') ifile+1
@@ -669,21 +673,14 @@ CONTAINS
              TZFD_IOZ%FLU       = -1
              TZFD_IOZ%PARAM     =>LFIPAR
 
-             ALLOCATE(TFILE_LAST%TFILE_NEXT)
-             TFILE_LAST%TFILE_NEXT%TFILE_PREV => TFILE_LAST
-             TFILE_LAST => TFILE_LAST%TFILE_NEXT
-             ! Copy values from 'main' (non-splitted) file
-             TFILE_LAST%CNAME    = TRIM(TPFILE%CNAME)//TRIM(CFILE)
-             TFILE_LAST%CTYPE    = TPFILE%CTYPE
-             TFILE_LAST%CFORMAT  = TPFILE%CFORMAT
-             TFILE_LAST%CMODE    = TPFILE%CMODE
-             !
-             TFILE_LAST%NLFITYPE = TPFILE%NLFITYPE
-             TFILE_LAST%NLFIVERB = TPFILE%NLFIVERB
-             !
-             TFILE_LAST%LNCREDUCE_FLOAT_PRECISION = TPFILE%LNCREDUCE_FLOAT_PRECISION
-             TFILE_LAST%LNCCOMPRESS               = TPFILE%LNCCOMPRESS
-             TFILE_LAST%NNCCOMPRESS_LEVEL         = TPFILE%NNCCOMPRESS_LEVEL
+             IF (PRESENT(TPFILE)) THEN
+               CALL IO_FILE_FIND_BYNAME(TRIM(TPFILE%CNAME)//TRIM(CFILE),TZSPLITFILE,IRESP,OOLD=.FALSE.)
+
+               IF (IRESP/=0) THEN !File not yet in filelist => add it (nothing to do if already in list)
+                 CALL IO_FILE_ADD2LIST(TZSPLITFILE,TRIM(TPFILE%CNAME)//TRIM(CFILE),TPFILE%CTYPE,TPFILE%CMODE, &
+                                       KLFINPRAR=TPFILE%NLFINPRAR,KLFITYPE=TPFILE%NLFITYPE,KLFIVERB=TPFILE%NLFIVERB)
+               END IF
+             END IF
 
              IF ( irank_procio .EQ. ISP ) THEN
 #if defined(MNH_IOCDF4)                   
@@ -750,6 +747,9 @@ CONTAINS
                         ININAR8)
                    !KNINAR = ININAR8
                 END IF
+
+                IF (PRESENT(TPFILE)) CALL UPDATE_METADATA(TZSPLITFILE)
+
              ENDIF
           ENDDO
        END IF
@@ -757,6 +757,8 @@ CONTAINS
 
     END SELECT
 
+!    CALL UPDATE_METADATA(TPFILE)
+
     ! Recherche d'un communicateur a reutiliser
     ! TZFD is the first element
 
@@ -794,6 +796,52 @@ CONTAINS
 
     END FUNCTION SUFFIX
 
+    SUBROUTINE UPDATE_METADATA(TPFILEMD)
+      TYPE(TFILEDATA), INTENT(INOUT), OPTIONAL :: TPFILEMD
+
+      TYPE(FD_ll), POINTER  :: TZFDLFI
+
+      IF(.NOT.PRESENT(TPFILEMD)) RETURN
+
+      TPFILEMD%LOPENED = .TRUE.
+      TPFILEMD%NOPEN   = TPFILEMD%NOPEN + 1
+
+      NULLIFY(TZFDLFI)
+
+      TZFDLFI=>GETFD(ADJUSTL(TRIM(TPFILEMD%CNAME)//'.lfi'))
+
+      IF(.NOT.ASSOCIATED(TZFDLFI)) &
+        CALL PRINT_MSG(NVERB_FATAL,'IO','OPEN_ll::UPDATE_METADATA','TZFDLFI not found for '&
+                                               //TRIM(TPFILEMD%CNAME))
+
+      !TZFDLFI%CDF exists only if ISP == TZFDLFI%OWNER
+      IF (TRIM(TPFILEMD%CMODE) == 'READ' .AND. ISP == TZFDLFI%OWNER) THEN
+        IF (LIOCDF4 .AND. .NOT.LLFIREAD) THEN
+          TPFILEMD%NNCID = TZFDLFI%CDF%NCID
+          IF (TPFILEMD%NNCID<0) CALL PRINT_MSG(NVERB_FATAL,'IO','OPEN_ll::UPDATE_METADATA','invalid NNCID for '&
+                                               //TRIM(TPFILEMD%CNAME))
+        ELSE
+          TPFILEMD%NLFIFLU = TZFDLFI%FLU
+          IF (TPFILEMD%NLFIFLU<0) CALL PRINT_MSG(NVERB_FATAL,'IO','OPEN_ll::UPDATE_METADATA','invalid NLFIFLU for '&
+                                                //TRIM(TPFILEMD%CNAME))
+        ENDIF
+      ELSE IF (TRIM(TPFILEMD%CMODE) == 'WRITE' .AND. ISP == TZFDLFI%OWNER) THEN
+        IF (LIOCDF4) THEN
+          TPFILEMD%NNCID = TZFDLFI%CDF%NCID
+          IF (TPFILEMD%NNCID<0) CALL PRINT_MSG(NVERB_FATAL,'IO','OPEN_ll::UPDATE_METADATA','invalid NNCID for '&
+                                               //TRIM(TPFILEMD%CNAME))
+        END IF
+        IF (.NOT.LIOCDF4 .OR. LLFIOUT) THEN
+          TPFILEMD%NLFIFLU = TZFDLFI%FLU
+          IF (TPFILEMD%NLFIFLU<0) CALL PRINT_MSG(NVERB_FATAL,'IO','OPEN_ll::UPDATE_METADATA','invalid NLFIFLU for '&
+                                                 //TRIM(TPFILEMD%CNAME))
+        END IF
+      ELSE IF (TRIM(TPFILEMD%CMODE) /= 'READ' .AND. TRIM(TPFILEMD%CMODE) /= 'WRITE') THEN
+        CALL PRINT_MSG(NVERB_FATAL,'IO','OPEN_ll::UPDATE_METADATA','unknown opening mode ('//TRIM(TPFILEMD%CMODE)//') for '&
+                                                          //TRIM(TPFILEMD%CNAME))
+      END IF
+
+    END SUBROUTINE UPDATE_METADATA
   END SUBROUTINE OPEN_ll
 
   SUBROUTINE CLOSE_ll(HFILE,IOSTAT,STATUS,OPARALLELIO)
diff --git a/src/LIB/SURCOUCHE/src/mode_io_manage_struct.f90 b/src/LIB/SURCOUCHE/src/mode_io_manage_struct.f90
index bd3fd3145..af5188262 100644
--- a/src/LIB/SURCOUCHE/src/mode_io_manage_struct.f90
+++ b/src/LIB/SURCOUCHE/src/mode_io_manage_struct.f90
@@ -487,7 +487,7 @@ SUBROUTINE POPULATE_STRUCT(TPFILE_FIRST,TPFILE_LAST,KSTEPS,HFILETYPE,TPBAKOUTN)
         TPBAKOUTN(IPOS)%TFILE%CTYPE=HFILETYPE
         TPBAKOUTN(IPOS)%TFILE%CMODE="WRITE"
         WRITE (YNUMBER,FMT="(I3.3)") IPOS
-        IF (HFILETYPE=='OUTPUT') THEN
+        IF (TRIM(HFILETYPE)=='OUTPUT') THEN
           ! Add a "OUT" suffix for output files
           TPBAKOUTN(IPOS)%TFILE%CNAME=ADJUSTL(ADJUSTR(IO_SURF_MNH_MODEL(IMI)%COUTFILE)//'.OUT.'//YNUMBER)
           !Reduce the float precision if asked
@@ -500,7 +500,7 @@ SUBROUTINE POPULATE_STRUCT(TPFILE_FIRST,TPFILE_LAST,KSTEPS,HFILETYPE,TPBAKOUTN)
             NOUT_COMPRESS_LEVEL(IMI) = 4
           END IF
           TPBAKOUTN(IPOS)%TFILE%NNCCOMPRESS_LEVEL = NOUT_COMPRESS_LEVEL(IMI)
-        ELSE IF (HFILETYPE=='BACKUP') THEN
+        ELSE IF (TRIM(HFILETYPE)=='BACKUP') THEN
           TPBAKOUTN(IPOS)%TFILE%CNAME=ADJUSTL(ADJUSTR(IO_SURF_MNH_MODEL(IMI)%COUTFILE)//'.'//YNUMBER)
         ELSE
           CALL PRINT_MSG(NVERB_FATAL,'IO','POPULATE_STRUCT','unknown filetype ('//TRIM(HFILETYPE)//')')
@@ -513,11 +513,11 @@ SUBROUTINE POPULATE_STRUCT(TPFILE_FIRST,TPFILE_LAST,KSTEPS,HFILETYPE,TPBAKOUTN)
             TPBAKOUTN(IPOS)%TFILE%CFORMAT='NETCDF4'
           ELSE
             TPBAKOUTN(IPOS)%TFILE%CFORMAT='LFICDF4'
-            IF (HFILETYPE=='BACKUP') TPBAKOUTN(IPOS)%TFILE%NLFINPRAR= 22+2*(4+NRR+NSV)
+            IF (TRIM(HFILETYPE)=='BACKUP') TPBAKOUTN(IPOS)%TFILE%NLFINPRAR= 22+2*(4+NRR+NSV)
           END IF
         ELSE IF (LLFIOUT) THEN
           TPBAKOUTN(IPOS)%TFILE%CFORMAT='LFI'
-          IF (HFILETYPE=='BACKUP') TPBAKOUTN(IPOS)%TFILE%NLFINPRAR= 22+2*(4+NRR+NSV)
+          IF (TRIM(HFILETYPE)=='BACKUP') TPBAKOUTN(IPOS)%TFILE%NLFINPRAR= 22+2*(4+NRR+NSV)
         ELSE
           CALL PRINT_MSG(NVERB_FATAL,'IO','POPULATE_STRUCT','unknown backup/output fileformat')
         ENDIF
@@ -537,7 +537,7 @@ SUBROUTINE POPULATE_STRUCT(TPFILE_FIRST,TPFILE_LAST,KSTEPS,HFILETYPE,TPBAKOUTN)
             TPBAKOUTN(IPOS)%TFILE_IOZ(JI)%TFILE%CMODE="WRITE"
             WRITE (YNUMBER,FMT="(I3.3)") JI
             TPBAKOUTN(IPOS)%TFILE_IOZ(JI)%TFILE%CNAME = TRIM(TPBAKOUTN(IPOS)%TFILE%CNAME)//'.Z'//YNUMBER
-            IF (HFILETYPE=='OUTPUT') THEN
+            IF (TRIM(HFILETYPE)=='OUTPUT') THEN
               !Reduce the float precision if asked
               TPBAKOUTN(IPOS)%TFILE_IOZ(JI)%TFILE%LNCREDUCE_FLOAT_PRECISION = LOUT_REDUCE_FLOAT_PRECISION(IMI)
               !Set compression if asked
@@ -572,32 +572,160 @@ END SUBROUTINE POPULATE_STRUCT
 !
 END SUBROUTINE IO_PREPARE_BAKOUT_STRUCT
 !
-SUBROUTINE IO_FILE_FIND_BYNAME(HNAME,TPFILE,KRESP)
+SUBROUTINE IO_FILE_ADD2LIST(TPFILE,HNAME,HTYPE,HMODE,KLFINPRAR,KLFITYPE,KLFIVERB,TPDADFILE)
+!
+USE MODD_FMOUT,          ONLY : LOUT_COMPRESS,LOUT_REDUCE_FLOAT_PRECISION,NOUT_COMPRESS_LEVEL
+USE MODE_MODELN_HANDLER, ONLY : GET_CURRENT_MODEL_INDEX
+!
+TYPE(TFILEDATA),POINTER,         INTENT(OUT) :: TPFILE    !File structure to return
+CHARACTER(LEN=*),                INTENT(IN)  :: HNAME     !Filename
+CHARACTER(LEN=*),                INTENT(IN)  :: HTYPE     !Filetype (backup, output, prepidealcase...)
+CHARACTER(LEN=*),                INTENT(IN)  :: HMODE     !Opening mode (read, write...)
+INTEGER,                OPTIONAL,INTENT(IN)  :: KLFINPRAR !Number of predicted articles of the LFI file (non crucial)
+INTEGER,                OPTIONAL,INTENT(IN)  :: KLFITYPE  !Type of the file (used to generate list of files to transfers)
+INTEGER,                OPTIONAL,INTENT(IN)  :: KLFIVERB  !LFI verbosity level
+TYPE(TFILEDATA),POINTER,OPTIONAL,INTENT(IN)  :: TPDADFILE !Corresponding dad file
+!
+INTEGER :: IMI,IRESP
+INTEGER :: ILFINPRAR
+INTEGER :: ILFITYPE
+INTEGER :: ILFIVERB
+TYPE(TFILEDATA),POINTER :: TZFILE_DUMMY
+!
+CALL PRINT_MSG(NVERB_DEBUG,'IO','IO_FILE_ADD2LIST','called for '//TRIM(HNAME))
+!
+IF (ASSOCIATED(TPFILE)) CALL PRINT_MSG(NVERB_FATAL,'IO','IO_FILE_ADD2LIST','file '//TRIM(HNAME)//' already associated')
+!
+CALL IO_FILE_FIND_BYNAME(HNAME,TZFILE_DUMMY,IRESP,OOLD=.FALSE.)
+IF (IRESP==0) THEN
+  CALL PRINT_MSG(NVERB_ERROR,'IO','IO_FILE_ADD2LIST','file '//TRIM(HNAME)//' already in filelist')
+  RETURN
+END IF
+!
+IMI = GET_CURRENT_MODEL_INDEX()
+!
+IF(PRESENT(KLFINPRAR)) THEN
+  ILFINPRAR = KLFINPRAR
+ELSE
+  ILFINPRAR = 0
+END IF
+!
+IF(PRESENT(KLFITYPE)) THEN
+  ILFITYPE = KLFITYPE
+ELSE
+  ILFITYPE = -1
+END IF
+!
+IF(PRESENT(KLFIVERB)) THEN
+  ILFIVERB = KLFIVERB
+ELSE
+  ILFIVERB = -1
+END IF
+!
+IF (.NOT.ASSOCIATED(TFILE_LAST)) THEN
+  ALLOCATE(TFILE_LAST)
+  TFILE_FIRST => TFILE_LAST
+ELSE
+  ALLOCATE(TFILE_LAST%TFILE_NEXT)
+  TFILE_LAST%TFILE_NEXT%TFILE_PREV => TFILE_LAST
+  TFILE_LAST => TFILE_LAST%TFILE_NEXT
+END IF
+!
+TPFILE => TFILE_LAST
+!
+TPFILE%CNAME = HNAME
+TPFILE%CTYPE = HTYPE
+!
+IF (TRIM(HMODE)/='READ' .AND. TRIM(HMODE)/='WRITE') THEN
+  CALL PRINT_MSG(NVERB_FATAL,'IO','IO_FILE_ADD2LIST','unknown mode ('//TRIM(HMODE)//') for file '//TRIM(HNAME))
+END IF
+!
+TPFILE%CMODE = HMODE
+!
+IF (TRIM(HMODE)=='READ') THEN
+  IF (LLFIREAD) THEN
+    TPFILE%CFORMAT = 'LFI'
+    TPFILE%NLFINPRAR = ILFINPRAR
+  ELSE IF (LIOCDF4) THEN
+    TPFILE%CFORMAT = 'NETCDF4'
+  ELSE
+    CALL PRINT_MSG(NVERB_FATAL,'IO','IO_FILE_ADD2LIST','invalid format for file '//TRIM(HNAME))
+  END IF
+ELSE IF (TRIM(HMODE)=='WRITE') THEN
+  IF (LLFIOUT .AND. LIOCDF4) THEN
+    TPFILE%CFORMAT = 'LFICDF4'
+    TPFILE%NLFINPRAR = ILFINPRAR
+  ELSE IF (LIOCDF4) THEN
+    TPFILE%CFORMAT = 'NETCDF4'
+  ELSE IF (LLFIOUT) THEN
+    TPFILE%CFORMAT = 'LFI'
+    TPFILE%NLFINPRAR = ILFINPRAR
+  ELSE
+    CALL PRINT_MSG(NVERB_FATAL,'IO','IO_FILE_ADD2LIST','invalid format for file '//TRIM(HNAME))
+  END IF
+END IF
+!
+TPFILE%LOPENED = .FALSE.
+TPFILE%NOPEN   = 0
+TPFILE%NCLOSE  = 0
+!
+TPFILE%NLFITYPE = ILFITYPE
+TPFILE%NLFIVERB = ILFIVERB
+!
+IF (TRIM(HTYPE)=='OUTPUT') THEN
+  TPFILE%LNCREDUCE_FLOAT_PRECISION = LOUT_REDUCE_FLOAT_PRECISION(IMI)
+  TPFILE%LNCCOMPRESS               = LOUT_COMPRESS(IMI)
+  TPFILE%NNCCOMPRESS_LEVEL         = NOUT_COMPRESS_LEVEL(IMI)
+END IF
+!
+IF(PRESENT(TPDADFILE)) THEN
+  IF (.NOT.ASSOCIATED(TPDADFILE)) CALL PRINT_MSG(NVERB_WARNING,'IO','IO_FILE_ADD2LIST','TPDADFILE provided but not associated')
+  TPFILE%TDADFILE => TPDADFILE
+ELSE
+  TPFILE%TDADFILE => NULL()
+END IF
+!
+END SUBROUTINE IO_FILE_ADD2LIST
+!
+SUBROUTINE IO_FILE_FIND_BYNAME(HNAME,TPFILE,KRESP,OOLD)
 !
 CHARACTER(LEN=*),       INTENT(IN)  :: HNAME  ! Name of the file to find
 TYPE(TFILEDATA),POINTER,INTENT(OUT) :: TPFILE ! File structure to return
 INTEGER,                INTENT(OUT) :: KRESP  ! Return value
+LOGICAL, OPTIONAL,      INTENT(IN)  :: OOLD   ! FALSE if new file (should not be found)
 !
 TYPE(TFILEDATA),POINTER :: TZFILE ! File structure
+LOGICAL                 :: GOLD
 !
 CALL PRINT_MSG(NVERB_DEBUG,'IO','IO_FILE_FIND_BYNAME','looking for: '//TRIM(HNAME))
 !
 NULLIFY(TPFILE)
 KRESP = 0
 !
-TZFILE => TFILE_FIRST
+IF (PRESENT(OOLD)) THEN
+  GOLD = OOLD
+ELSE
+  GOLD = .TRUE.
+END IF
 !
-DO
-  IF (TRIM(TZFILE%CNAME) == TRIM(HNAME) ) THEN
-    TPFILE => TZFILE
-    EXIT
-  END IF
-  IF (.NOT.ASSOCIATED(TZFILE%TFILE_NEXT)) EXIT
-  TZFILE => TZFILE%TFILE_NEXT
-END DO
+IF (.NOT.ASSOCIATED(TFILE_FIRST)) THEN
+  IF (GOLD) CALL PRINT_MSG(NVERB_WARNING,'IO','IO_FILE_FIND_BYNAME','filelist is empty')
+ELSE
+  !
+  TZFILE => TFILE_FIRST
+  !
+  DO
+    IF (TRIM(TZFILE%CNAME) == TRIM(HNAME) ) THEN
+      TPFILE => TZFILE
+      EXIT
+    END IF
+    IF (.NOT.ASSOCIATED(TZFILE%TFILE_NEXT)) EXIT
+    TZFILE => TZFILE%TFILE_NEXT
+  END DO
+END IF
 !
 IF (.NOT.ASSOCIATED(TPFILE)) THEN
-  CALL PRINT_MSG(NVERB_WARNING,'IO','IO_FILE_FIND_BYNAME','file '//TRIM(HNAME)//' not found in list')
+  IF (GOLD) CALL PRINT_MSG(NVERB_WARNING,'IO','IO_FILE_FIND_BYNAME','file '//TRIM(HNAME)//' not found in list')
   KRESP = -1 !File not found
 ELSE
   CALL PRINT_MSG(NVERB_DEBUG,'IO','IO_FILE_FIND_BYNAME',TRIM(HNAME)//' was found')
@@ -605,4 +733,31 @@ END IF
 !
 END SUBROUTINE IO_FILE_FIND_BYNAME
 !
+SUBROUTINE IO_FILE_PRINT_LIST(TPFILE_FIRST)
+!
+TYPE(TFILEDATA),POINTER,OPTIONAL,INTENT(IN) :: TPFILE_FIRST
+!
+TYPE(TFILEDATA),POINTER :: TZFILE ! File structure
+!
+CALL PRINT_MSG(NVERB_DEBUG,'IO','IO_FILE_PRINT_LIST','called')
+!
+IF (PRESENT(TPFILE_FIRST)) THEN
+  IF (.NOT.ASSOCIATED(TPFILE_FIRST)) RETURN
+  TZFILE => TPFILE_FIRST
+ELSE
+  IF (.NOT.ASSOCIATED(TFILE_FIRST)) RETURN
+  TZFILE => TFILE_FIRST
+END IF
+!
+WRITE (*,'(A28," ",A13," ",A7," ",A7," ",L1," ",I6," ",I6," ",I3," ",I3)' ) TZFILE%CNAME,TZFILE%CTYPE,TZFILE%CFORMAT,&
+      TZFILE%CMODE,TZFILE%LOPENED,TZFILE%NLFIFLU,TZFILE%NNCID,TZFILE%NOPEN,TZFILE%NCLOSE
+!
+DO WHILE (ASSOCIATED(TZFILE%TFILE_NEXT))
+  TZFILE => TZFILE%TFILE_NEXT
+  WRITE (*,'(A28," ",A13," ",A7," ",A7," ",L1," ",I6," ",I6," ",I3," ",I3)' ) TZFILE%CNAME,TZFILE%CTYPE,TZFILE%CFORMAT,&
+        TZFILE%CMODE,TZFILE%LOPENED,TZFILE%NLFIFLU,TZFILE%NNCID,TZFILE%NOPEN,TZFILE%NCLOSE
+END DO
+!
+END SUBROUTINE IO_FILE_PRINT_LIST
+!
 END MODULE MODE_IO_MANAGE_STRUCT
diff --git a/src/MNH/diag.f90 b/src/MNH/diag.f90
index 380d8d698..12b94a11d 100644
--- a/src/MNH/diag.f90
+++ b/src/MNH/diag.f90
@@ -141,6 +141,7 @@ USE MODE_TIME
 USE MODE_FM
 USE MODE_FMWRIT, ONLY : IO_WRITE_HEADER
 USE MODE_IO_ll
+USE MODE_IO_MANAGE_STRUCT, ONLY : IO_FILE_ADD2LIST
 USE MODE_ll
 USE MODE_MODELN_HANDLER
 USE MODE_MSG
@@ -198,8 +199,8 @@ INTEGER :: IIU, IJU, IKU
 INTEGER :: IINFO_ll               ! return code for _ll routines 
 REAL, DIMENSION(:,:),ALLOCATABLE          :: ZSEA,ZTOWN
 !
-TYPE(TFILEDATA),TARGET :: TZFILE
-TYPE(TFILEDATA)        :: TZDIACFILE
+TYPE(TFILEDATA),POINTER :: TZFILE
+TYPE(TFILEDATA),POINTER :: TZDIACFILE
 !
 NAMELIST/NAM_DIAG/ CISO, LVAR_RS, LVAR_LS,   &
                    NCONV_KF, NRAD_3D, CRAD_SAT, NRTTOVINFO, LRAD_SUBG_COND,  &
@@ -233,6 +234,8 @@ NAMELIST/NAM_CONF_DIAG/JPHEXT, NHALO
 !*       0.0   Initializations
 !              ---------------
 !
+TZFILE => NULL()
+TZDIACFILE => NULL()
 !
 CALL GOTO_MODEL(1)
 !
@@ -448,24 +451,7 @@ ENDIF
 INPRAR = 24 +2*(4+NRR+NSV)
 COUTFMFILE=TRIM(CINIFILE)//YSUFFIX
 !
-TZFILE%CNAME      = TRIM(CINIFILE)//YSUFFIX
-TZFILE%CTYPE      = 'DIAG'
-IF (LIOCDF4) THEN
-  IF (.NOT.LLFIOUT) THEN
-    TZFILE%CFORMAT='NETCDF4'
-  ELSE
-    TZFILE%CFORMAT='LFICDF4'
-    TZFILE%NLFINPRAR= INPRAR
-  END IF
-ELSE IF (LLFIOUT) THEN
-  TZFILE%CFORMAT='LFI'
-  TZFILE%NLFINPRAR= INPRAR
-ELSE
-  CALL PRINT_MSG(NVERB_FATAL,'IO','DIAG','unknown backup/output fileformat')
-ENDIF
-TZFILE%CMODE      = 'WRITE'
-TZFILE%NLFITYPE   = 1
-TZFILE%NLFIVERB   = NVERB
+CALL IO_FILE_ADD2LIST(TZFILE,TRIM(CINIFILE)//YSUFFIX,'DIAG','WRITE',KLFINPRAR=INPRAR,KLFITYPE=1,KLFIVERB=NVERB)
 !
 CALL IO_FILE_OPEN_ll(TZFILE,CLUOUT,IRESP)
 !
@@ -530,24 +516,7 @@ ZTIME1=ZTIME2
 !
 IF ( LAIRCRAFT_BALLOON ) THEN
 !
-  TZDIACFILE%CNAME = TRIM(CINIFILE)//'BAL'
-  TZDIACFILE%CTYPE = 'DIACHRONIC'
-  IF (LIOCDF4) THEN
-    IF (.NOT.LLFIOUT) THEN
-      TZDIACFILE%CFORMAT = 'NETCDF4'
-    ELSE
-      TZDIACFILE%CFORMAT = 'LFICDF4'
-      TZDIACFILE%NLFINPRAR = INPRAR
-    END IF
-  ELSE IF (LLFIOUT) THEN
-    TZDIACFILE%CFORMAT = 'LFI'
-    TZDIACFILE%NLFINPRAR = INPRAR
-  ELSE
-    CALL PRINT_MSG(NVERB_FATAL,'IO','DIAG','unknown backup/output fileformat')
-  ENDIF
-  TZDIACFILE%CMODE      = 'WRITE'
-  TZDIACFILE%NLFITYPE   = 1
-  TZDIACFILE%NLFIVERB   = NVERB
+  CALL IO_FILE_ADD2LIST(TZDIACFILE,TRIM(CINIFILE)//'BAL','DIACHRONIC','WRITE',KLFINPRAR=INPRAR,KLFITYPE=1,KLFIVERB=NVERB)
 !
   CALL IO_FILE_OPEN_ll(TZDIACFILE,CLUOUT,IRESP)
 !
diff --git a/src/MNH/ini_modeln.f90 b/src/MNH/ini_modeln.f90
index 0027d610f..0f4b2d272 100644
--- a/src/MNH/ini_modeln.f90
+++ b/src/MNH/ini_modeln.f90
@@ -282,6 +282,7 @@ END MODULE MODI_INI_MODEL_n
 USE MODE_ll
 USE MODD_ARGSLIST_ll, ONLY : LIST_ll
 USE MODE_IO_ll
+USE MODE_IO_MANAGE_STRUCT, ONLY : IO_FILE_ADD2LIST
 USE MODE_FM
 USE MODE_FMREAD
 USE MODE_MSG
@@ -450,11 +451,7 @@ INTEGER             :: IRESP   ! Return code of FM routines
 INTEGER             :: ININAR  ! File management variable
 INTEGER             :: IMASDEV ! version of MESONH in the input file
 INTEGER             :: ILUOUT  ! Logical unit number of output-listing
-CHARACTER(LEN=2)    :: YDIR    ! Type  of the data field in LFIFM file
-INTEGER             :: IGRID   ! C-grid indicator in LFIFM file
-INTEGER             :: ILENCH  ! Length of comment string in LFIFM file
-CHARACTER (LEN=100) :: YCOMMENT!comment string in LFIFM file
-CHARACTER (LEN=16)  :: YRECFM  ! Name of the desired field in LFIFM file
+CHARACTER(LEN=28)   :: YNAME
 INTEGER             :: IIU     ! Upper dimension in x direction (local)
 INTEGER             :: IJU     ! Upper dimension in y direction (local)
 INTEGER             :: IIU_ll  ! Upper dimension in x direction (global)
@@ -1535,33 +1532,14 @@ CALL INI_BIKHARDT_n (NDXRATIO_ALL(KMI),NDYRATIO_ALL(KMI),KMI)
 IF (KMI == 1) THEN
   DO IMI = 1 , NMODEL
     WRITE(IO_SURF_MNH_MODEL(IMI)%COUTFILE,'(A,".",I1,".",A)') CEXP,IMI,TRIM(ADJUSTL(CSEG))
-    WRITE(LUNIT_MODEL(IMI)%TDIAFILE%CNAME, '(A,".",I1,".",A)') CEXP,IMI,TRIM(ADJUSTL(CSEG))//'.000'
-    LUNIT_MODEL(IMI)%TDIAFILE%CTYPE = 'DIACHRONIC'
-    IF (LIOCDF4) THEN
-      IF (.NOT.LLFIOUT) THEN
-        LUNIT_MODEL(IMI)%TDIAFILE%CFORMAT = 'NETCDF4'
-      ELSE
-        LUNIT_MODEL(IMI)%TDIAFILE%CFORMAT = 'LFICDF4'
-        LUNIT_MODEL(IMI)%TDIAFILE%NLFINPRAR = 50
-      END IF
-    ELSE IF (LLFIOUT) THEN
-      LUNIT_MODEL(IMI)%TDIAFILE%CFORMAT = 'LFI'
-      LUNIT_MODEL(IMI)%TDIAFILE%NLFINPRAR = 50
-    ELSE
-      CALL PRINT_MSG(NVERB_FATAL,'IO','INI_MODEL_n','unknown backup/output fileformat')
-    ENDIF
-    LUNIT_MODEL(IMI)%TDIAFILE%CMODE      = 'WRITE'
-    LUNIT_MODEL(IMI)%TDIAFILE%NLFITYPE   = 1
-    LUNIT_MODEL(IMI)%TDIAFILE%NLFIVERB   = NVERB
-    LUNIT_MODEL(IMI)%TDIAFILE%TDADFILE => LUNIT_MODEL(NDAD(IMI))%TDIAFILE
-    IF (.NOT.ASSOCIATED(TFILE_FIRST)) THEN
-      TFILE_FIRST => LUNIT_MODEL(IMI)%TDIAFILE
-    ELSE
-      LUNIT_MODEL(IMI)%TDIAFILE%TFILE_PREV => TFILE_LAST
-    END IF
-    TFILE_LAST => LUNIT_MODEL(IMI)%TDIAFILE
+    WRITE(YNAME, '(A,".",I1,".",A)') CEXP,IMI,TRIM(ADJUSTL(CSEG))//'.000'
+    CALL IO_FILE_ADD2LIST(LUNIT_MODEL(IMI)%TDIAFILE,YNAME,'DIACHRONIC','WRITE', &
+                          KLFINPRAR=50,KLFITYPE=1,KLFIVERB=NVERB,               &
+                          TPDADFILE=LUNIT_MODEL(NDAD(IMI))%TDIAFILE )
   END DO
   !
+  TDIAFILE => LUNIT_MODEL(KMI)%TDIAFILE !Necessary because no call to GOTO_MODEL before needing it
+  !
   IF (CPROGRAM=='MESONH') THEN
     IF ( NDAD(KMI) == 1)  CDAD_NAME(KMI) = CEXP//'.1.'//CSEG
     IF ( NDAD(KMI) == 2)  CDAD_NAME(KMI) = CEXP//'.2.'//CSEG
@@ -1638,7 +1616,7 @@ IF (CCLOUD=='LIMA') CALL INIT_AEROSOL_PROPERTIES
 !              --------------------------------
 !
 CALL MPPDB_CHECK3D(XUT,"INI_MODEL_N-before read_field::XUT",PRECISION)
-CALL READ_FIELD(TPINIFILE%CNAME,HLUOUT,IMASDEV, IIU,IJU,IKU,XTSTEP,           &
+CALL READ_FIELD(TPINIFILE,HLUOUT,IMASDEV, IIU,IJU,IKU,XTSTEP,                 &
                 CGETTKET,CGETRVT,CGETRCT,CGETRRT,CGETRIT,CGETCIT,             &
                 CGETRST,CGETRGT,CGETRHT,CGETSVT,CGETSRCT,CGETSIGS,CGETCLDFR,  &
                 CGETBL_DEPTH,CGETSBL_DEPTH,CGETPHC,CGETPHR,CUVW_ADV_SCHEME,   &
diff --git a/src/MNH/ini_segn.f90 b/src/MNH/ini_segn.f90
index 68c6209b1..72794550f 100644
--- a/src/MNH/ini_segn.f90
+++ b/src/MNH/ini_segn.f90
@@ -18,11 +18,11 @@ SUBROUTINE INI_SEG_n(KMI,HLUOUT,TPINIFILE,HINIFILEPGD,PTSTEP_ALL)
 !
 USE MODD_IO_ll, ONLY : TFILEDATA
 !
-INTEGER,            INTENT(IN)    :: KMI          !Model index
-CHARACTER (LEN=*),  INTENT(OUT)   :: HLUOUT       !Name for output-listing of nested models
-TYPE(TFILEDATA),    INTENT(OUT)   :: TPINIFILE    !Initial file
-CHARACTER (LEN=28), INTENT(OUT)   :: HINIFILEPGD
-REAL,DIMENSION(:),  INTENT(INOUT) :: PTSTEP_ALL   ! Time STEP of ALL models
+INTEGER,                    INTENT(IN)    :: KMI          !Model index
+CHARACTER (LEN=*),          INTENT(OUT)   :: HLUOUT       !Name for output-listing of nested models
+TYPE(TFILEDATA),   POINTER, INTENT(OUT)   :: TPINIFILE    !Initial file
+CHARACTER (LEN=28),         INTENT(OUT)   :: HINIFILEPGD
+REAL,DIMENSION(:),          INTENT(INOUT) :: PTSTEP_ALL   ! Time STEP of ALL models
 !
 END SUBROUTINE INI_SEG_n
 !
@@ -186,6 +186,7 @@ USE MODE_FIELD
 USE MODE_FMREAD
 USE MODE_FM
 USE MODE_IO_ll
+USE MODE_IO_MANAGE_STRUCT, ONLY : IO_FILE_ADD2LIST
 USE MODE_MSG
 USE MODE_POS
 !
@@ -201,11 +202,11 @@ IMPLICIT NONE
 !
 !*       0.1   declarations of arguments 
 !
-INTEGER,            INTENT(IN)    :: KMI          !Model index
-CHARACTER (LEN=*),  INTENT(OUT)   :: HLUOUT       !Name for output-listing of nested models
-TYPE(TFILEDATA),    INTENT(OUT)   :: TPINIFILE    !Initial file
-CHARACTER (LEN=28), INTENT(OUT)   :: HINIFILEPGD
-REAL,DIMENSION(:),  INTENT(INOUT) :: PTSTEP_ALL   ! Time STEP of ALL models
+INTEGER,                    INTENT(IN)    :: KMI          !Model index
+CHARACTER (LEN=*),          INTENT(OUT)   :: HLUOUT       !Name for output-listing of nested models
+TYPE(TFILEDATA),   POINTER, INTENT(OUT)   :: TPINIFILE    !Initial file
+CHARACTER (LEN=28),         INTENT(OUT)   :: HINIFILEPGD
+REAL,DIMENSION(:),          INTENT(INOUT) :: PTSTEP_ALL   ! Time STEP of ALL models
 !
 !*       0.1   declarations of local variables
 !
@@ -255,6 +256,7 @@ CHARACTER (LEN=4)  :: YELEC
 CHARACTER (LEN=3)  :: YEQNSYS
 TYPE(FD_ll), POINTER         :: TZFD
 !
+TPINIFILE => NULL()
 !-------------------------------------------------------------------------------
 !
 !*       1.    OPEN OUPTUT-LISTING FILE AND EXSEG FILE
@@ -342,7 +344,10 @@ IF (CPROGRAM=='MESONH') THEN
    END IF
   HINIFILEPGD=CINIFILEPGD_n
   YINIFILE=CINIFILE_n
-  CALL FMOPEN_ll(YINIFILE,'READ',HLUOUT,0,2,NVERB,ININAR,IRESP)
+
+  CALL IO_FILE_ADD2LIST(TPINIFILE,TRIM(YINIFILE),'PREPIDEALCASE','READ',KLFINPRAR=0,KLFITYPE=2,KLFIVERB=NVERB)
+
+  CALL IO_FILE_OPEN_ll(TPINIFILE,HLUOUT,IRESP)
 END IF
 !
 !-------------------------------------------------------------------------------
@@ -385,6 +390,9 @@ END IF
 !*      6.    READ in the LFI file SOME VARIABLES of MODD_CONF
 !             ------------------------------------------------
 !
+NULLIFY(TPINIFILE)
+ALLOCATE(TPINIFILE) !TODO: deallocate it
+!
 TPINIFILE%CNAME  = YINIFILE
 !TPINIFILE%CTYPE  = ''
 CALL PRINT_MSG(NVERB_WARNING,'IO','INI_SEG_n','filetype not (yet) set')
diff --git a/src/MNH/init_mnh.f90 b/src/MNH/init_mnh.f90
index 8f09d9f73..cfaf842a0 100644
--- a/src/MNH/init_mnh.f90
+++ b/src/MNH/init_mnh.f90
@@ -82,7 +82,7 @@
 !              ------------
 USE MODD_CONF
 USE MODD_DYN_n, ONLY: CPRESOPT,NITR ! only for spawning purpose
-USE MODD_IO_ll, ONLY: TFILEDATA
+USE MODD_IO_ll, ONLY: TPTR2FILE
 USE MODD_LBC_n, ONLY: CLBCX,CLBCY   ! only for spawning purpose
 USE MODD_LUNIT
 USE MODD_PARAMETERS
@@ -113,10 +113,10 @@ IMPLICIT NONE
 !*       0.1   Local variables
 !
 INTEGER :: JMI                                        !  Loop index
-CHARACTER(LEN=16), DIMENSION(JPMODELMAX) :: YLUOUT   ! Name for output-listing
+CHARACTER(LEN=16), DIMENSION(JPMODELMAX) :: YLUOUT    ! Name for output-listing
                                                       ! of nested models
-TYPE(TFILEDATA),   DIMENSION(JPMODELMAX) :: TZINIFILE   ! Initial files
-CHARACTER (LEN=28),DIMENSION(JPMODELMAX) :: YINIFILEPGD
+TYPE(TPTR2FILE),  DIMENSION(JPMODELMAX)  :: TZINIFILE ! Initial files
+CHARACTER(LEN=28),DIMENSION(JPMODELMAX)  :: YINIFILEPGD
 INTEGER  :: ILUOUT0,IRESP                             ! Logical unit number for
                                                       ! output-listing common
                                                       ! to all models and return
@@ -174,11 +174,11 @@ IF (CPROGRAM=='SPAWN ' .OR. CPROGRAM=='DIAG  ' .OR. CPROGRAM=='SPEC  ' .OR. CPRO
 END IF
 !
 CALL GOTO_MODEL(1)
-CALL INI_SEG_n(1,YLUOUT(1),TZINIFILE(1),YINIFILEPGD(1),ZTSTEP_ALL)
+CALL INI_SEG_n(1,YLUOUT(1),TZINIFILE(1)%TZFILE,YINIFILEPGD(1),ZTSTEP_ALL)
 !
 DO JMI=2,NMODEL
   CALL GOTO_MODEL(JMI)
-  CALL INI_SEG_n(JMI,YLUOUT(JMI),TZINIFILE(JMI),YINIFILEPGD(JMI),ZTSTEP_ALL)
+  CALL INI_SEG_n(JMI,YLUOUT(JMI),TZINIFILE(JMI)%TZFILE,YINIFILEPGD(JMI),ZTSTEP_ALL)
 END DO
 !
 IF (CPROGRAM=='SPAWN ') THEN 
@@ -196,14 +196,14 @@ IF (CPROGRAM=='DIAG') CALL RESET_EXSEG(YLUOUT(1))
 !
 DO JMI=1,NMODEL
   CALL GOTO_MODEL(JMI)
-  CALL INI_SIZE_n(JMI,YLUOUT(JMI),TZINIFILE(JMI),YINIFILEPGD(JMI))
+  CALL INI_SIZE_n(JMI,YLUOUT(JMI),TZINIFILE(JMI)%TZFILE,YINIFILEPGD(JMI))
 END DO
 !
 IF (CPROGRAM=='SPAWN ') THEN 
   DPTR_CLBCX=>CLBCX
   DPTR_CLBCY=>CLBCY
   CALL INI_PARAZ_ll(IINFO_ll)
-  CALL INI_SIZE_SPAWN(DPTR_CLBCX,DPTR_CLBCY,CPRESOPT,NITR,TZINIFILE(1)%CNAME)
+  CALL INI_SIZE_SPAWN(DPTR_CLBCX,DPTR_CLBCY,CPRESOPT,NITR,TZINIFILE(1)%TZFILE%CNAME)
 END IF
 !
 !   INITIALIZE data structures of ComLib
@@ -237,11 +237,11 @@ DO JMI=1,NMODEL
   CALL GO_TOMODEL_ll(JMI,IINFO_ll)
   CALL GOTO_MODEL(JMI)
   IF (CPROGRAM/='SPEC  ') THEN
-    CALL INI_MODEL_n(JMI,YLUOUT(JMI),TZINIFILE(JMI),YINIFILEPGD(JMI))
+    CALL INI_MODEL_n(JMI,YLUOUT(JMI),TZINIFILE(JMI)%TZFILE,YINIFILEPGD(JMI))
     !Call necessary to update the TFIELDLIST pointers to the data
     CALL FIELDLIST_GOTO_MODEL(JMI,JMI)
   ELSE
-    CALL INI_SPECTRE_n(JMI,YLUOUT(JMI),TZINIFILE(JMI))
+    CALL INI_SPECTRE_n(JMI,YLUOUT(JMI),TZINIFILE(JMI)%TZFILE)
   END IF  
 END DO
 !
diff --git a/src/MNH/modd_lunitn.f90 b/src/MNH/modd_lunitn.f90
index af4559b63..0b8a5724d 100644
--- a/src/MNH/modd_lunitn.f90
+++ b/src/MNH/modd_lunitn.f90
@@ -55,7 +55,7 @@ TYPE LUNIT_t
   CHARACTER(LEN=28) :: CINIFILE      ! Name of the input FM-file
   CHARACTER(LEN=28) :: CINIFILEPGD   ! Name of the PGD associated to input FM-file  
   CHARACTER(LEN=24) :: COUTFILE      ! Generic name of the output FM-files
-  TYPE(TFILEDATA)   :: TDIAFILE      ! diachronic output file 
+  TYPE(TFILEDATA),POINTER :: TDIAFILE => NULL() ! diachronic output file
 !
   CHARACTER(LEN=16) :: CLUOUT        ! Name of output_listing file
 !JUAN
diff --git a/src/MNH/open_nestpgd_files.f90 b/src/MNH/open_nestpgd_files.f90
index 67c4420e5..8f75b0cf3 100644
--- a/src/MNH/open_nestpgd_files.f90
+++ b/src/MNH/open_nestpgd_files.f90
@@ -14,10 +14,10 @@ MODULE MODI_OPEN_NESTPGD_FILES
 INTERFACE
       SUBROUTINE OPEN_NESTPGD_FILES(TPFILEPGD,TPFILENESTPGD)
 !
-USE MODD_IO_ll, ONLY : TFILEDATA
+USE MODD_IO_ll, ONLY : TPTR2FILE
 !
-TYPE(TFILEDATA),DIMENSION(:),ALLOCATABLE,INTENT(OUT) :: TPFILEPGD     ! Input  PGD files
-TYPE(TFILEDATA),DIMENSION(:),ALLOCATABLE,INTENT(OUT) :: TPFILENESTPGD ! Output PGD files
+TYPE(TPTR2FILE),DIMENSION(:),ALLOCATABLE,       INTENT(OUT) :: TPFILEPGD     ! Input  PGD files
+TYPE(TPTR2FILE),DIMENSION(:),ALLOCATABLE,TARGET,INTENT(OUT) :: TPFILENESTPGD ! Output PGD files
 !
 END SUBROUTINE OPEN_NESTPGD_FILES
 END INTERFACE
@@ -81,12 +81,13 @@ USE MODD_LUNIT
 USE MODD_CONF
 USE MODD_NESTING
 USE MODD_PARAMETERS
-USE MODD_IO_ll, ONLY : LIOCDF4,LLFIOUT,TFILEDATA
+USE MODD_IO_ll, ONLY : LIOCDF4,LLFIOUT,TFILEDATA,TPTR2FILE
 !
 USE MODI_OPEN_LUOUTn
 !
 USE MODE_FIELD, ONLY : INI_FIELD_LIST
 USE MODE_IO_ll
+USE MODE_IO_MANAGE_STRUCT, ONLY : IO_FILE_ADD2LIST
 USE MODE_FM
 USE MODE_POS
 USE MODE_MSG
@@ -104,8 +105,8 @@ IMPLICIT NONE
 !*       0.1   Declaration of arguments
 !              ------------------------
 !
-TYPE(TFILEDATA),DIMENSION(:),ALLOCATABLE,       INTENT(OUT) :: TPFILEPGD     ! Input  PGD files
-TYPE(TFILEDATA),DIMENSION(:),ALLOCATABLE,TARGET,INTENT(OUT) :: TPFILENESTPGD ! Output PGD files
+TYPE(TPTR2FILE),DIMENSION(:),ALLOCATABLE,       INTENT(OUT) :: TPFILEPGD     ! Input  PGD files
+TYPE(TPTR2FILE),DIMENSION(:),ALLOCATABLE,TARGET,INTENT(OUT) :: TPFILENESTPGD ! Output PGD files
 !
 !*       0.2   Declaration of local variables
 !              ------------------------------
@@ -117,7 +118,7 @@ LOGICAL :: GFOUND     ! Return code when searching namelist
 CHARACTER(LEN=28) :: HPRE_NEST_PGD ! name of namelist file
 INTEGER           :: IPRE_NEST_PGD ! logical unit of namelist file
 !
-CHARACTER(LEN=28) :: YPGD      ! name of the pgd file for each model
+CHARACTER(LEN=28),DIMENSION(JPMODELMAX) :: YPGD ! name of the pgd file for each model
 CHARACTER(LEN=28) :: YLUOUT    ! name of output listing file for each model
 CHARACTER(LEN=2)  :: YNEST     ! to define the output pgd file names
 CHARACTER(LEN=28) :: YPGD1, YPGD2, YPGD3, YPGD4, &
@@ -130,6 +131,7 @@ LOGICAL           :: GADD    !
 INTEGER           :: NHALO_MNH
 !
 INTEGER           :: ILUOUT  ! Logical unit number for the EXSPA file
+TYPE(TFILEDATA),POINTER :: TZDADFILE
 !
 !*       0.3   Declaration of namelists
 !              ------------------------
@@ -232,16 +234,16 @@ DO JPGD=1,JPMODELMAX
     IF (GFOUND) READ(UNIT=IPRE_NEST_PGD,NML=NAM_PGD8)
   END IF
   !
-  IF (JPGD==1) YPGD=YPGD1
-  IF (JPGD==2) YPGD=YPGD2
-  IF (JPGD==3) YPGD=YPGD3
-  IF (JPGD==4) YPGD=YPGD4
-  IF (JPGD==5) YPGD=YPGD5
-  IF (JPGD==6) YPGD=YPGD6
-  IF (JPGD==7) YPGD=YPGD7
-  IF (JPGD==8) YPGD=YPGD8
+  IF (JPGD==1) YPGD(1)=YPGD1
+  IF (JPGD==2) YPGD(2)=YPGD2
+  IF (JPGD==3) YPGD(3)=YPGD3
+  IF (JPGD==4) YPGD(4)=YPGD4
+  IF (JPGD==5) YPGD(5)=YPGD5
+  IF (JPGD==6) YPGD(6)=YPGD6
+  IF (JPGD==7) YPGD(7)=YPGD7
+  IF (JPGD==8) YPGD(8)=YPGD8
   !
-  IF (LEN_TRIM(YPGD) == 0) THEN
+  IF (LEN_TRIM(YPGD(JPGD)) == 0) THEN
     IF (JPGD==1) THEN
       WRITE(ILUOUT0,*) 'No pgd file was present for model 1 in namelist NAM_PGD1'
 !callabortstop
@@ -293,47 +295,18 @@ CALL SET_CONFIO_ll()
 ALLOCATE(TPFILEPGD    (NMODEL))
 ALLOCATE(TPFILENESTPGD(NMODEL))
 !
-IF (NMODEL>=1) TPFILEPGD(1)%CNAME = TRIM(YPGD1)
-IF (NMODEL>=2) TPFILEPGD(2)%CNAME = TRIM(YPGD2)
-IF (NMODEL>=3) TPFILEPGD(3)%CNAME = TRIM(YPGD3)
-IF (NMODEL>=4) TPFILEPGD(4)%CNAME = TRIM(YPGD4)
-IF (NMODEL>=5) TPFILEPGD(5)%CNAME = TRIM(YPGD5)
-IF (NMODEL>=6) TPFILEPGD(6)%CNAME = TRIM(YPGD6)
-IF (NMODEL>=7) TPFILEPGD(7)%CNAME = TRIM(YPGD7)
-IF (NMODEL>=8) TPFILEPGD(8)%CNAME = TRIM(YPGD8)
-!
 DO JPGD=1,NMODEL
-  TPFILENESTPGD(JPGD)%CNAME = TRIM(TPFILEPGD(JPGD)%CNAME)//'.nest'//ADJUSTL(YNEST)
+  CALL IO_FILE_ADD2LIST(TPFILEPGD(JPGD)%TZFILE,TRIM(YPGD(JPGD)),'PREPPGD','READ',KLFITYPE=2,KLFIVERB=NVERB)
+  !
   IF (NDAD(JPGD)>=1) THEN
-    TPFILENESTPGD(JPGD)%TDADFILE => TPFILENESTPGD(NDAD(JPGD))
+    TZDADFILE => TPFILENESTPGD(NDAD(JPGD))%TZFILE
   ELSE
-    NULLIFY(TPFILENESTPGD(JPGD)%TDADFILE)
+    NULLIFY(TZDADFILE)
   END IF
+  CALL IO_FILE_ADD2LIST(TPFILENESTPGD(JPGD)%TZFILE,TRIM(YPGD(JPGD))//'.nest'//ADJUSTL(YNEST),'PREPNESTPGD', &
+                        'WRITE',KLFITYPE=1,KLFIVERB=NVERB,TPDADFILE=TZDADFILE)
 END DO
 !
-TPFILEPGD(:)    %CTYPE = 'PREPPGD'
-TPFILENESTPGD(:)%CTYPE = 'PREPNESTPGD'
-IF (LIOCDF4) THEN
-  IF (.NOT.LLFIOUT) THEN
-    TPFILEPGD(:)    %CFORMAT = 'NETCDF4'
-    TPFILENESTPGD(:)%CFORMAT = 'NETCDF4'
-  ELSE
-    TPFILEPGD(:)    %CFORMAT = 'LFICDF4'
-    TPFILENESTPGD(:)%CFORMAT = 'LFICDF4'
-  END IF
-ELSE IF (LLFIOUT) THEN
-  TPFILEPGD(:)    %CFORMAT = 'LFI'
-  TPFILENESTPGD(:)%CFORMAT = 'LFI'
-ELSE
-  CALL PRINT_MSG(NVERB_FATAL,'IO','OPEN_NESTPGD_FILES','unknown backup/output fileformat')
-ENDIF
-TPFILEPGD(:)    %CMODE    = 'READ'
-TPFILENESTPGD(:)%CMODE    = 'WRITE'
-TPFILEPGD(:)    %NLFITYPE = 2
-TPFILENESTPGD(:)%NLFITYPE = 1
-TPFILEPGD(:)    %NLFIVERB = NVERB
-TPFILENESTPGD(:)%NLFIVERB = NVERB
-!
 !-------------------------------------------------------------------------------
 CALL CLOSE_ll(HPRE_NEST_PGD)
 !-------------------------------------------------------------------------------
@@ -342,8 +315,8 @@ CALL CLOSE_ll(HPRE_NEST_PGD)
 !              -------------------------------------
 !
 DO JPGD=1,NMODEL
-  CALL IO_FILE_OPEN_ll(TPFILEPGD(JPGD),    CLUOUT0,IRESP,OPARALLELIO=.FALSE.)
-  CALL IO_FILE_OPEN_ll(TPFILENESTPGD(JPGD),CLUOUT0,IRESP,OPARALLELIO=.FALSE.)
+  CALL IO_FILE_OPEN_ll(TPFILEPGD(JPGD)    %TZFILE,CLUOUT0,IRESP,OPARALLELIO=.FALSE.)
+  CALL IO_FILE_OPEN_ll(TPFILENESTPGD(JPGD)%TZFILE,CLUOUT0,IRESP,OPARALLELIO=.FALSE.)
 END DO
 !
 !-------------------------------------------------------------------------------
diff --git a/src/MNH/prep_ideal_case.f90 b/src/MNH/prep_ideal_case.f90
index 98a4bf971..6c0b614cf 100644
--- a/src/MNH/prep_ideal_case.f90
+++ b/src/MNH/prep_ideal_case.f90
@@ -358,6 +358,7 @@ USE MODE_GRIDPROJ
 USE MODE_FM
 USE MODE_FMREAD
 USE MODE_IO_ll
+USE MODE_IO_MANAGE_STRUCT, ONLY : IO_FILE_ADD2LIST
 USE MODE_ll
 USE MODD_ARGSLIST_ll, ONLY : LIST_ll
 USE MODE_MODELN_HANDLER
@@ -575,8 +576,8 @@ REAL              :: XHSLOP=1.2           ! if LHSLOP filtering of slopes higher
 REAL              :: ZZS_MAX, ZZS_MAX_ll
 INTEGER           :: IJPHEXT
 !
-TYPE(TFILEDATA),TARGET :: TZFILE
-TYPE(TFILEDATA),TARGET :: TZINIFILEPGD
+TYPE(TFILEDATA),POINTER :: TZFILE
+TYPE(TFILEDATA),POINTER :: TZINIFILEPGD
 !
 !
 !*       0.2  Namelist declarations
@@ -620,6 +621,9 @@ NAMELIST/NAM_AERO_PRE/ LORILAM, LINITPM, XINIRADIUSI, XINIRADIUSJ, &
 !              --------
 CALL MPPDB_INIT()
 !
+TZFILE => NULL()
+TZINIFILEPGD => NULL()
+!
 CALL GOTO_MODEL(1)
 !
 CALL INITIO_ll()
@@ -1761,24 +1765,7 @@ NNPRAR = 22 + 2*(NRR+NSV)   &    ! 22 = number of grid variables + reference
 NTYPE=1
 CDESFM=ADJUSTL(ADJUSTR(CINIFILE)//'.des')
 !
-TZFILE%CNAME      = CINIFILE
-TZFILE%CTYPE      = 'PREPIDEALCASE'
-IF (LIOCDF4) THEN
-  IF (.NOT.LLFIOUT) THEN
-    TZFILE%CFORMAT='NETCDF4'
-  ELSE
-    TZFILE%CFORMAT='LFICDF4'
-    TZFILE%NLFINPRAR= NNPRAR
-  END IF
-ELSE IF (LLFIOUT) THEN
-  TZFILE%CFORMAT='LFI'
-  TZFILE%NLFINPRAR= NNPRAR
-ELSE
-  CALL PRINT_MSG(NVERB_FATAL,'IO','PREP_IDEAL_CASE','unknown backup/output fileformat')
-ENDIF
-TZFILE%CMODE      = 'WRITE'
-TZFILE%NLFITYPE   = NTYPE
-TZFILE%NLFIVERB   = NVERB
+CALL IO_FILE_ADD2LIST(TZFILE,TRIM(CINIFILE),'PREPIDEALCASE','WRITE',KLFINPRAR=NNPRAR,KLFITYPE=NTYPE,KLFIVERB=NVERB)
 !
 CALL IO_FILE_OPEN_ll(TZFILE,CLUOUT,NRESP)
 !
@@ -1841,24 +1828,7 @@ IF (CSURF =='EXTE') THEN
     CSTORAGE_TYPE='PG'
     COUTFMFILE = CINIFILEPGD
     !
-    TZINIFILEPGD%CNAME      = CINIFILEPGD
-    TZINIFILEPGD%CTYPE      = 'PREPIDEALCASE'
-    IF (LIOCDF4) THEN
-      IF (.NOT.LLFIOUT) THEN
-        TZINIFILEPGD%CFORMAT='NETCDF4'
-      ELSE
-        TZINIFILEPGD%CFORMAT='LFICDF4'
-        TZINIFILEPGD%NLFINPRAR= NNPRAR
-      END IF
-    ELSE IF (LLFIOUT) THEN
-      TZINIFILEPGD%CFORMAT='LFI'
-      TZINIFILEPGD%NLFINPRAR= NNPRAR
-    ELSE
-      CALL PRINT_MSG(NVERB_FATAL,'IO','PREP_IDEAL_CASE','unknown backup/output fileformat')
-    ENDIF
-    TZINIFILEPGD%CMODE      = 'WRITE'
-    TZINIFILEPGD%NLFITYPE   = NTYPE
-    TZINIFILEPGD%NLFIVERB   = NVERB
+    CALL IO_FILE_ADD2LIST(TZINIFILEPGD,TRIM(CINIFILEPGD),'PREPIDEALCASE','WRITE',KLFINPRAR=NNPRAR,KLFITYPE=NTYPE,KLFIVERB=NVERB)
     !
     CALL IO_FILE_OPEN_ll(TZINIFILEPGD,CLUOUT,NRESP)
     !
diff --git a/src/MNH/prep_nest_pgd.f90 b/src/MNH/prep_nest_pgd.f90
index 96cc35116..ea77ead1e 100644
--- a/src/MNH/prep_nest_pgd.f90
+++ b/src/MNH/prep_nest_pgd.f90
@@ -106,7 +106,7 @@ USE MODD_GRID_n, ONLY : XZSMT
 USE MODD_LUNIT
 USE MODD_NESTING
 USE MODD_CONF_n
-USE MODD_IO_ll, ONLY : TFILEDATA, TFILE_SURFEX
+USE MODD_IO_ll, ONLY : TFILE_SURFEX, TPTR2FILE
 !
 USE MODI_OPEN_NESTPGD_FILES
 USE MODI_RETRIEVE1_NEST_INFO_n
@@ -164,8 +164,8 @@ INTEGER                        :: IDAD
 INTEGER                        :: II
 LOGICAL     :: GISINIT
 !
-TYPE(TFILEDATA),DIMENSION(:),ALLOCATABLE        :: TZFILEPGD     ! Input  PGD files
-TYPE(TFILEDATA),DIMENSION(:),ALLOCATABLE,TARGET :: TZFILENESTPGD ! Output PGD files
+TYPE(TPTR2FILE),DIMENSION(:),ALLOCATABLE        :: TZFILEPGD     ! Input  PGD files
+TYPE(TPTR2FILE),DIMENSION(:),ALLOCATABLE,TARGET :: TZFILENESTPGD ! Output PGD files
 !
 !-------------------------------------------------------------------------------
 !
@@ -218,14 +218,14 @@ CALL MPI_COMM_SIZE(NMNH_COMM_WORLD, NPROC, IINFO_ll)
 CALL SET_DAD0_ll()
 DO JPGD=1,NMODEL
   ! read and set dimensions and ratios of model JPGD
-  CALL FMREAD(TZFILEPGD(JPGD)%CNAME,'IMAX',CLUOUT0,'--',IIMAX,IGRID,ILENCH,YCOMMENT,IRESP)
-  CALL FMREAD(TZFILEPGD(JPGD)%CNAME,'JMAX',CLUOUT0,'--',IJMAX,IGRID,ILENCH,YCOMMENT,IRESP)
-  CALL FMREAD(TZFILEPGD(JPGD)%CNAME,'DXRATIO',CLUOUT0,'--',NDXRATIO_ALL(JPGD),IGRID,ILENCH,YCOMMENT,IRESP)
-  CALL FMREAD(TZFILEPGD(JPGD)%CNAME,'DYRATIO',CLUOUT0,'--',NDYRATIO_ALL(JPGD),IGRID,ILENCH,YCOMMENT,IRESP)
-  CALL FMREAD(TZFILEPGD(JPGD)%CNAME,'XSIZE',CLUOUT0,'--',NXSIZE(JPGD),IGRID,ILENCH,YCOMMENT,IRESP)
-  CALL FMREAD(TZFILEPGD(JPGD)%CNAME,'YSIZE',CLUOUT0,'--',NYSIZE(JPGD),IGRID,ILENCH,YCOMMENT,IRESP)
-  CALL FMREAD(TZFILEPGD(JPGD)%CNAME,'XOR',CLUOUT0,'--',NXOR_ALL(JPGD),IGRID,ILENCH,YCOMMENT,IRESP)
-  CALL FMREAD(TZFILEPGD(JPGD)%CNAME,'YOR',CLUOUT0,'--',NYOR_ALL(JPGD),IGRID,ILENCH,YCOMMENT,IRESP)
+  CALL FMREAD(TZFILEPGD(JPGD)%TZFILE%CNAME,'IMAX',CLUOUT0,'--',IIMAX,IGRID,ILENCH,YCOMMENT,IRESP)
+  CALL FMREAD(TZFILEPGD(JPGD)%TZFILE%CNAME,'JMAX',CLUOUT0,'--',IJMAX,IGRID,ILENCH,YCOMMENT,IRESP)
+  CALL FMREAD(TZFILEPGD(JPGD)%TZFILE%CNAME,'DXRATIO',CLUOUT0,'--',NDXRATIO_ALL(JPGD),IGRID,ILENCH,YCOMMENT,IRESP)
+  CALL FMREAD(TZFILEPGD(JPGD)%TZFILE%CNAME,'DYRATIO',CLUOUT0,'--',NDYRATIO_ALL(JPGD),IGRID,ILENCH,YCOMMENT,IRESP)
+  CALL FMREAD(TZFILEPGD(JPGD)%TZFILE%CNAME,'XSIZE',CLUOUT0,'--',NXSIZE(JPGD),IGRID,ILENCH,YCOMMENT,IRESP)
+  CALL FMREAD(TZFILEPGD(JPGD)%TZFILE%CNAME,'YSIZE',CLUOUT0,'--',NYSIZE(JPGD),IGRID,ILENCH,YCOMMENT,IRESP)
+  CALL FMREAD(TZFILEPGD(JPGD)%TZFILE%CNAME,'XOR',CLUOUT0,'--',NXOR_ALL(JPGD),IGRID,ILENCH,YCOMMENT,IRESP)
+  CALL FMREAD(TZFILEPGD(JPGD)%TZFILE%CNAME,'YOR',CLUOUT0,'--',NYOR_ALL(JPGD),IGRID,ILENCH,YCOMMENT,IRESP)
   CALL SET_DIM_ll(IIMAX, IJMAX, 1)
   ! compute origin and end of local subdomain of model JPGD
   ! initialize variables from MODD_NESTING, origin and end of global model JPGD in coordinates of its father
@@ -262,11 +262,11 @@ DO JPGD=1,NMODEL
   CALL GOTO_MODEL(JPGD)
   CALL GO_TOMODEL_ll(JPGD,IINFO_ll)
   CALL GOTO_SURFEX(JPGD)
-  CALL FMREAD(TZFILEPGD(JPGD)%CNAME,'L1D         ',CLUOUT0,'--',L1D_ALL(JPGD),IGRID,ILENCH,YCOMMENT,IRESP)
-  CALL FMREAD(TZFILEPGD(JPGD)%CNAME,'L2D         ',CLUOUT0,'--',L2D_ALL(JPGD),IGRID,ILENCH,YCOMMENT,IRESP)
-  CALL FMREAD(TZFILEPGD(JPGD)%CNAME,'PACK        ',CLUOUT0,'--',LPACK_ALL(JPGD),IGRID,ILENCH,YCOMMENT,IRESP)
+  CALL FMREAD(TZFILEPGD(JPGD)%TZFILE%CNAME,'L1D         ',CLUOUT0,'--',L1D_ALL(JPGD),IGRID,ILENCH,YCOMMENT,IRESP)
+  CALL FMREAD(TZFILEPGD(JPGD)%TZFILE%CNAME,'L2D         ',CLUOUT0,'--',L2D_ALL(JPGD),IGRID,ILENCH,YCOMMENT,IRESP)
+  CALL FMREAD(TZFILEPGD(JPGD)%TZFILE%CNAME,'PACK        ',CLUOUT0,'--',LPACK_ALL(JPGD),IGRID,ILENCH,YCOMMENT,IRESP)
   CALL SET_FMPACK_ll(L1D_ALL(JPGD),L2D_ALL(JPGD),LPACK_ALL(JPGD))
-  CALL READ_HGRID(JPGD,TZFILEPGD(JPGD)%CNAME,YMY_NAME,YDAD_NAME,YSTORAGE_TYPE)
+  CALL READ_HGRID(JPGD,TZFILEPGD(JPGD)%TZFILE%CNAME,YMY_NAME,YDAD_NAME,YSTORAGE_TYPE)
   CSTORAGE_TYPE='PG'
 END DO
   CALL INI_PARAZ_ll(IINFO_ll)
@@ -317,9 +317,9 @@ END DO
 !              ----------------------
 !
 DO JPGD=1,NMODEL
-  IF (LEN_TRIM(TZFILEPGD(JPGD)%CNAME)>0) THEN
+  IF (LEN_TRIM(TZFILEPGD(JPGD)%TZFILE%CNAME)>0) THEN
     CALL GO_TOMODEL_ll(JPGD,IINFO_ll)
-    CPGDFILE = TZFILEPGD(JPGD)%CNAME
+    CPGDFILE = TZFILEPGD(JPGD)%TZFILE%CNAME
     CALL GOTO_MODEL(JPGD)
     CALL GOTO_SURFEX(JPGD)
     CALL INIT_PGD_SURF_ATM(YSURF_CUR,'MESONH','PGD',                         &
@@ -347,14 +347,14 @@ END DO
 !
 DO JPGD=1,NMODEL
   CALL GO_TOMODEL_ll(JPGD,IINFO_ll)
-  CPGDFILE   = TZFILEPGD(JPGD)%CNAME
-  COUTFMFILE = TZFILENESTPGD(JPGD)%CNAME
+  CPGDFILE   = TZFILEPGD(JPGD)%TZFILE%CNAME
+  COUTFMFILE = TZFILENESTPGD(JPGD)%TZFILE%CNAME
   CALL GOTO_MODEL(JPGD)
   CALL GOTO_SURFEX(JPGD)
-  TFILE_SURFEX => TZFILENESTPGD(JPGD)
+  TFILE_SURFEX => TZFILENESTPGD(JPGD)%TZFILE
   CALL WRITE_PGD_SURF_ATM_n(YSURF_CUR,'MESONH')
   NULLIFY(TFILE_SURFEX)
-  CALL IO_WRITE_FIELD(TZFILENESTPGD(JPGD),'ZSMT',XZSMT)
+  CALL IO_WRITE_FIELD(TZFILENESTPGD(JPGD)%TZFILE,'ZSMT',XZSMT)
 END DO
 !
 !-------------------------------------------------------------------------------
@@ -364,18 +364,18 @@ END DO
 !
 !
 DO JPGD=1,NMODEL
-  CALL IO_WRITE_HEADER(TZFILENESTPGD(JPGD))
-  IF ( ASSOCIATED(TZFILENESTPGD(JPGD)%TDADFILE) ) THEN
-    CALL IO_WRITE_FIELD(TZFILENESTPGD(JPGD),'DXRATIO',NDXRATIO_ALL(JPGD))
-    CALL IO_WRITE_FIELD(TZFILENESTPGD(JPGD),'DYRATIO',NDYRATIO_ALL(JPGD))
-    CALL IO_WRITE_FIELD(TZFILENESTPGD(JPGD),'XOR',    NXOR_ALL(JPGD))
-    CALL IO_WRITE_FIELD(TZFILENESTPGD(JPGD),'YOR',    NYOR_ALL(JPGD))
+  CALL IO_WRITE_HEADER(TZFILENESTPGD(JPGD)%TZFILE)
+  IF ( ASSOCIATED(TZFILENESTPGD(JPGD)%TZFILE%TDADFILE) ) THEN
+    CALL IO_WRITE_FIELD(TZFILENESTPGD(JPGD)%TZFILE,'DXRATIO',NDXRATIO_ALL(JPGD))
+    CALL IO_WRITE_FIELD(TZFILENESTPGD(JPGD)%TZFILE,'DYRATIO',NDYRATIO_ALL(JPGD))
+    CALL IO_WRITE_FIELD(TZFILENESTPGD(JPGD)%TZFILE,'XOR',    NXOR_ALL(JPGD))
+    CALL IO_WRITE_FIELD(TZFILENESTPGD(JPGD)%TZFILE,'YOR',    NYOR_ALL(JPGD))
   END IF
-  CALL IO_WRITE_FIELD(TZFILENESTPGD(JPGD),'SURF',  'EXTE')
-  CALL IO_WRITE_FIELD(TZFILENESTPGD(JPGD),'L1D',   L1D_ALL(JPGD))
-  CALL IO_WRITE_FIELD(TZFILENESTPGD(JPGD),'L2D',   L2D_ALL(JPGD))
-  CALL IO_WRITE_FIELD(TZFILENESTPGD(JPGD),'PACK',  LPACK_ALL(JPGD))
-  CALL IO_WRITE_FIELD(TZFILENESTPGD(JPGD),'JPHEXT',JPHEXT)
+  CALL IO_WRITE_FIELD(TZFILENESTPGD(JPGD)%TZFILE,'SURF',  'EXTE')
+  CALL IO_WRITE_FIELD(TZFILENESTPGD(JPGD)%TZFILE,'L1D',   L1D_ALL(JPGD))
+  CALL IO_WRITE_FIELD(TZFILENESTPGD(JPGD)%TZFILE,'L2D',   L2D_ALL(JPGD))
+  CALL IO_WRITE_FIELD(TZFILENESTPGD(JPGD)%TZFILE,'PACK',  LPACK_ALL(JPGD))
+  CALL IO_WRITE_FIELD(TZFILENESTPGD(JPGD)%TZFILE,'JPHEXT',JPHEXT)
 END DO
 !
 !-------------------------------------------------------------------------------
@@ -384,8 +384,8 @@ END DO
 !              --------------------
 !
 DO JPGD=1,NMODEL
-  CALL IO_FILE_CLOSE_ll(TZFILEPGD(JPGD),    CLUOUT0,IRESP,OPARALLELIO=.FALSE.)
-  CALL IO_FILE_CLOSE_ll(TZFILENESTPGD(JPGD),CLUOUT0,IRESP,OPARALLELIO=.FALSE.)
+  CALL IO_FILE_CLOSE_ll(TZFILEPGD(JPGD)%TZFILE,    CLUOUT0,IRESP,OPARALLELIO=.FALSE.)
+  CALL IO_FILE_CLOSE_ll(TZFILENESTPGD(JPGD)%TZFILE,CLUOUT0,IRESP,OPARALLELIO=.FALSE.)
 END DO
 !
 !* loop to spare enough time to transfer commands before end of program
diff --git a/src/MNH/prep_pgd.f90 b/src/MNH/prep_pgd.f90
index 09025286d..b86f18296 100644
--- a/src/MNH/prep_pgd.f90
+++ b/src/MNH/prep_pgd.f90
@@ -86,6 +86,7 @@ USE MODD_SPAWN, ONLY : NDXRATIO,NDYRATIO,NXSIZE,NYSIZE,NXOR,NYOR
 USE MODE_POS
 USE MODE_FMWRIT
 USE MODE_IO_ll
+USE MODE_IO_MANAGE_STRUCT, ONLY : IO_FILE_ADD2LIST
 USE MODE_FM
 USE MODE_MODELN_HANDLER
 USE MODE_MSG
@@ -140,7 +141,7 @@ INTEGER           :: ILENCH   ! length of comment string
 CHARACTER(LEN=100):: YCOMMENT ! comment string
 INTEGER           :: IIMAX, IJMAX
 INTEGER           :: NHALO_MNH 
-TYPE(TFILEDATA),TARGET :: TZFILE
+TYPE(TFILEDATA),POINTER :: TZFILE
 !
 NAMELIST/NAM_PGDFILE/CPGDFILE, NHALO
 NAMELIST/NAM_ZSFILTER/NZSFILTER,LHSLOP,XHSLOP
@@ -152,6 +153,7 @@ CALL MPPDB_INIT()
 !
 CPROGRAM='PGD   '
 !
+TZFILE => NULL()
 !
 CALL MPPDB_INIT()
 !*    1.      Set default names and parallelized I/O
@@ -238,24 +240,7 @@ CALL PGD_SURF_ATM(YSURF_CUR,'MESONH','                            ','      ',.FA
 !*    3.      Writes the physiographic fields
 !             -------------------------------
 !
-TZFILE%CNAME      = CPGDFILE
-TZFILE%CTYPE      = 'PREPPGD'
-IF (LIOCDF4) THEN
-  IF (.NOT.LLFIOUT) THEN
-    TZFILE%CFORMAT= 'NETCDF4'
-  ELSE
-    TZFILE%CFORMAT= 'LFICDF4'
-    TZFILE%NLFINPRAR= 1
-  END IF
-ELSE IF (LLFIOUT) THEN
-  TZFILE%CFORMAT  = 'LFI'
-  TZFILE%NLFINPRAR= 1
-ELSE
-  CALL PRINT_MSG(NVERB_FATAL,'IO','PREP_PGD','unknown backup/output fileformat')
-ENDIF
-TZFILE%CMODE      = 'WRITE'
-TZFILE%NLFITYPE   = 1
-TZFILE%NLFIVERB   = 5
+CALL IO_FILE_ADD2LIST(TZFILE,CPGDFILE,'PREPPGD','WRITE',KLFINPRAR=1,KLFITYPE=1,KLFIVERB=5)
 !
 CALL IO_FILE_OPEN_ll(TZFILE,CLUOUT0,IRESP,OPARALLELIO=.FALSE.)
 !
diff --git a/src/MNH/prep_real_case.f90 b/src/MNH/prep_real_case.f90
index 930329005..61bc3c37b 100644
--- a/src/MNH/prep_real_case.f90
+++ b/src/MNH/prep_real_case.f90
@@ -393,6 +393,7 @@ USE MODE_POS
 USE MODE_FM
 USE MODE_FMWRIT, ONLY : IO_WRITE_HEADER
 USE MODE_IO_ll
+USE MODE_IO_MANAGE_STRUCT, ONLY : IO_FILE_ADD2LIST
 USE MODE_ll
 USE MODE_MODELN_HANDLER
 USE MODE_FMREAD
@@ -447,7 +448,7 @@ USE MODD_CH_AEROSOL, ONLY: LORILAM, LINITPM, XINIRADIUSI, XINIRADIUSJ,&
                            XINISIGI, XINISIGJ, XN0IMIN, XN0JMIN, CRGUNIT
 USE MODD_DUST,      ONLY:  LDUST, NMODE_DST, CRGUNITD, XINISIG, XINIRADIUS, XN0MIN 
 USE MODD_SALT,      ONLY:  LSALT, NMODE_SLT, CRGUNITS, XINISIG_SLT, XINIRADIUS_SLT, XN0MIN_SLT
-USE MODD_IO_ll,   ONLY : GSMONOPROC,TFILEDATA,LIOCDF4,LLFIOUT, TFILE_SURFEX
+USE MODD_IO_ll,   ONLY : GSMONOPROC,TFILEDATA,LIOCDF4,LLFIOUT,TFILE_SURFEX
 USE MODD_PREP_REAL
 USE MODD_CH_MNHC_n, ONLY: LUSECHAQ_n=>LUSECHAQ,LUSECHIC_n=>LUSECHIC, LUSECHEM_n=>LUSECHEM
 USE MODI_READ_VER_GRID
@@ -513,7 +514,7 @@ LOGICAL  :: LUSECHAQ
 LOGICAL  :: LUSECHIC
 LOGICAL  :: LUSECHEM
 !
-TYPE(TFILEDATA),TARGET :: TZFILE
+TYPE(TFILEDATA),POINTER :: TZFILE
 !
 !
 !*       0.3   Declaration of namelists
@@ -552,6 +553,8 @@ ZHORI  = 0.
 ZSURF  = 0.
 ZTIME1 = ZSTART
 !
+TZFILE => NULL()
+!
 !*       1.    SET DEFAULT VALUES
 !              ------------------
 !
@@ -577,24 +580,8 @@ CALL OPEN_PRC_FILES(YPRE_REAL1,YATMFILE, YATMFILETYPE  &
 CALL FMLOOK_ll(CLUOUT0,CLUOUT0,ILUOUT0,IRESP)
 !
 CPGDFILE = YPGDFILE
-TZFILE%CNAME      = CINIFILE
-TZFILE%CTYPE      = 'PREPREALCASE'
-IF (LIOCDF4) THEN
-  IF (.NOT.LLFIOUT) THEN
-    TZFILE%CFORMAT='NETCDF4'
-  ELSE
-    TZFILE%CFORMAT='LFICDF4'
-    TZFILE%NLFINPRAR= 0
-  END IF
-ELSE IF (LLFIOUT) THEN
-  TZFILE%CFORMAT='LFI'
-  TZFILE%NLFINPRAR= 0
-ELSE
-  CALL PRINT_MSG(NVERB_FATAL,'IO','PREP_REAL_CASE','unknown backup/output fileformat')
-ENDIF
-TZFILE%CMODE      = 'WRITE'
-TZFILE%NLFITYPE   = 1
-TZFILE%NLFIVERB   = NVERB
+!
+CALL IO_FILE_ADD2LIST(TZFILE,CINIFILE,'PREPREALCASE','WRITE',KLFINPRAR=0,KLFITYPE=1,KLFIVERB=NVERB)
 !
 CALL IO_FILE_OPEN_ll(TZFILE,CLUOUT0,IRESP)
 !
diff --git a/src/MNH/prep_surfex.f90 b/src/MNH/prep_surfex.f90
index cfa262431..c7e405b23 100644
--- a/src/MNH/prep_surfex.f90
+++ b/src/MNH/prep_surfex.f90
@@ -50,6 +50,7 @@ USE MODE_FM
 USE MODE_FMREAD
 USE MODE_FMWRIT
 USE MODE_IO_ll
+USE MODE_IO_MANAGE_STRUCT, ONLY : IO_FILE_ADD2LIST
 USE MODE_ll
 USE MODE_MODELN_HANDLER
 USE MODE_SPLITTINGZ_ll
@@ -85,7 +86,7 @@ INTEGER               :: IINFO_ll        ! return code of // routines
 CHARACTER (LEN=100)   :: HCOMMENT
 INTEGER               :: II, IJ, IGRID, ILENGTH
 !
-TYPE(TFILEDATA),TARGET :: TZFILE
+TYPE(TFILEDATA),POINTER :: TZFILE
 !
 !-------------------------------------------------------------------------------
 !
@@ -93,6 +94,8 @@ TYPE(TFILEDATA),TARGET :: TZFILE
 !*       1.    SET DEFAULT VALUES
 !              ------------------
 !
+TZFILE => NULL()
+!
 CALL GOTO_MODEL(1)
 !
 CALL VERSION
@@ -113,25 +116,7 @@ CALL FMLOOK_ll(CLUOUT0,CLUOUT0,ILUOUT0,IRESP)
 !
 CPGDFILE = YPGDFILE
 !
-TZFILE%CNAME      = CINIFILE
-TZFILE%CTYPE      = 'PREPSURFEX'
-print *,'PW: LIOCDF4=',LIOCDF4
-IF (LIOCDF4) THEN
-  IF (.NOT.LLFIOUT) THEN
-    TZFILE%CFORMAT='NETCDF4'
-  ELSE
-    TZFILE%CFORMAT='LFICDF4'
-    TZFILE%NLFINPRAR= 0
-  END IF
-ELSE IF (LLFIOUT) THEN
-  TZFILE%CFORMAT='LFI'
-  TZFILE%NLFINPRAR= 0
-ELSE
-  CALL PRINT_MSG(NVERB_FATAL,'IO','PREP_REAL_CASE','unknown backup/output fileformat')
-ENDIF
-TZFILE%CMODE      = 'WRITE'
-TZFILE%NLFITYPE   = 1
-TZFILE%NLFIVERB   = 1
+CALL IO_FILE_ADD2LIST(TZFILE,TRIM(CINIFILE),'PREPSURFEX','WRITE',KLFINPRAR=0,KLFITYPE=1,KLFIVERB=1)
 !
 CALL IO_FILE_OPEN_ll(TZFILE,CLUOUT0,IRESP)
 !
diff --git a/src/MNH/read_field.f90 b/src/MNH/read_field.f90
index f9d403154..6b35ee155 100644
--- a/src/MNH/read_field.f90
+++ b/src/MNH/read_field.f90
@@ -8,16 +8,16 @@
 !
 INTERFACE 
 !
-      SUBROUTINE READ_FIELD(HINIFILE,HLUOUT,KMASDEV,KIU,KJU,KKU,PTSTEP,      &
+      SUBROUTINE READ_FIELD(TPINIFILE,HLUOUT,KMASDEV,KIU,KJU,KKU,PTSTEP,     &
             HGETTKET,HGETRVT,HGETRCT,HGETRRT,HGETRIT,HGETCIT,                &
             HGETRST,HGETRGT,HGETRHT,HGETSVT,HGETSRCT,HGETSIGS,HGETCLDFR,     &
             HGETBL_DEPTH,HGETSBL_DEPTH,HGETPHC,HGETPHR,HUVW_ADV_SCHEME,      &
-            HTEMP_SCHEME,KSIZELBX_ll,KSIZELBXU_ll,KSIZELBY_ll,KSIZELBYV_ll,               &
+            HTEMP_SCHEME,KSIZELBX_ll,KSIZELBXU_ll,KSIZELBY_ll,KSIZELBYV_ll,  &
             KSIZELBXTKE_ll,KSIZELBYTKE_ll,                                   &
             KSIZELBXR_ll,KSIZELBYR_ll,KSIZELBXSV_ll,KSIZELBYSV_ll,           &
-            PUM,PVM,PWM,PDUM,PDVM,PDWM,                                                     &
+            PUM,PVM,PWM,PDUM,PDVM,PDWM,                                      &
             PUT,PVT,PWT,PTHT,PPABST,PPABSM,PTKET,PRTKEMS,                    &
-            PRT,PSVT,PCIT,PDRYMASST,    &
+            PRT,PSVT,PCIT,PDRYMASST,                                         &
             PSIGS,PSRCT,PCLDFR,PBL_DEPTH,PSBL_DEPTH,PWTHVMF,PPHC,PPHR,       &
             PLSUM,PLSVM,PLSWM,PLSTHM,PLSRVM,                                 &
             PLBXUM,PLBXVM,PLBXWM,PLBXTHM,PLBXTKEM,PLBXRM,PLBXSVM,            &
@@ -29,11 +29,11 @@ INTERFACE
             PVTH_FLUX_M,PWTH_FLUX_M,PVU_FLUX_M,                              &
             PRUS_PRES,PRVS_PRES,PRWS_PRES,PRTHS_CLD,PRRS_CLD,PRSVS_CLD       )
 !
+USE MODD_IO_ll, ONLY : TFILEDATA
 USE MODD_TIME ! for type DATE_TIME
 !
 !
-CHARACTER (LEN=*),         INTENT(IN)  :: HINIFILE       
-                             ! name of the initial file
+TYPE(TFILEDATA),           INTENT(IN)  :: TPINIFILE    !Initial file
 CHARACTER (LEN=*),         INTENT(IN)  :: HLUOUT        
                              ! name for output-listing of nested models
 INTEGER,                   INTENT(IN)  :: KMASDEV
@@ -125,16 +125,16 @@ END INTERFACE
 !
 END MODULE MODI_READ_FIELD
 !     ######spl
-      SUBROUTINE READ_FIELD(HINIFILE,HLUOUT,KMASDEV,KIU,KJU,KKU,PTSTEP,      &
+      SUBROUTINE READ_FIELD(TPINIFILE,HLUOUT,KMASDEV,KIU,KJU,KKU,PTSTEP,     &
             HGETTKET,HGETRVT,HGETRCT,HGETRRT,HGETRIT,HGETCIT,                &
             HGETRST,HGETRGT,HGETRHT,HGETSVT,HGETSRCT,HGETSIGS,HGETCLDFR,     &
             HGETBL_DEPTH,HGETSBL_DEPTH,HGETPHC,HGETPHR,HUVW_ADV_SCHEME,      &
-            HTEMP_SCHEME,KSIZELBX_ll,KSIZELBXU_ll,KSIZELBY_ll,KSIZELBYV_ll,               &
+            HTEMP_SCHEME,KSIZELBX_ll,KSIZELBXU_ll,KSIZELBY_ll,KSIZELBYV_ll,  &
             KSIZELBXTKE_ll,KSIZELBYTKE_ll,                                   &
             KSIZELBXR_ll,KSIZELBYR_ll,KSIZELBXSV_ll,KSIZELBYSV_ll,           &
-            PUM,PVM,PWM,PDUM,PDVM,PDWM,                                                     &
+            PUM,PVM,PWM,PDUM,PDVM,PDWM,                                      &
             PUT,PVT,PWT,PTHT,PPABST,PPABSM,PTKET,PRTKEMS,                    &
-            PRT,PSVT,PCIT,PDRYMASST,    &
+            PRT,PSVT,PCIT,PDRYMASST,                                         &
             PSIGS,PSRCT,PCLDFR,PBL_DEPTH,PSBL_DEPTH,PWTHVMF,PPHC,PPHR,       &
             PLSUM,PLSVM,PLSWM,PLSTHM,PLSRVM,                                 &
             PLBXUM,PLBXVM,PLBXWM,PLBXTHM,PLBXTKEM,PLBXRM,PLBXSVM,            &
@@ -144,7 +144,7 @@ END MODULE MODI_READ_FIELD
             KADVFRC,TPDTADVFRC,PDTHFRC,PDRVFRC,                              &
             KRELFRC,TPDTRELFRC, PTHREL, PRVREL,                              &
             PVTH_FLUX_M,PWTH_FLUX_M,PVU_FLUX_M,                              &
-            PRUS_PRES,PRVS_PRES,PRWS_PRES,PRTHS_CLD,PRRS_CLD, PRSVS_CLD      )
+            PRUS_PRES,PRVS_PRES,PRWS_PRES,PRTHS_CLD,PRRS_CLD,PRSVS_CLD       )
 !     ########################################################################
 !
 !!****  *READ_FIELD* - routine to read prognostic and surface fields
@@ -241,7 +241,9 @@ END MODULE MODI_READ_FIELD
 USE MODE_FM
 USE MODE_IO_ll, ONLY : UPCASE
 !
+USE MODD_IO_ll, ONLY : TFILEDATA
 USE MODD_CONF
+USE MODD_CONF_n
 USE MODD_TIME ! for type DATE_TIME
 USE MODD_CST
 USE MODD_CTURB
@@ -279,8 +281,7 @@ IMPLICIT NONE
 !
 !
 !
-CHARACTER (LEN=*),         INTENT(IN)  :: HINIFILE       
-                             ! name of the initial file
+TYPE(TFILEDATA),           INTENT(IN)  :: TPINIFILE    !Initial file
 CHARACTER (LEN=*),         INTENT(IN)  :: HLUOUT        
                              ! name for output-listing of nested models
 INTEGER,                   INTENT(IN)  :: KMASDEV
@@ -384,7 +385,6 @@ INTEGER             :: ILUOUT                     ! Unit number for prints
 INTEGER             :: JSV                        ! Loop index for additional
                                                   ! scalar variables
 INTEGER             :: ISV                        ! total number of  scalar variables
-INTEGER             :: IRR                        !  counter for moist variables
 INTEGER             :: JKLOOP,JRR                 ! Loop indexes
 INTEGER             :: IIUP,IJUP                  ! size  of working 
                                                   ! window arrays
@@ -413,9 +413,6 @@ GLSOURCE=.FALSE.
 Z3D = 0.0 
 ZWORK = 0.0
 !
-YRECFM='STORAGE_TYPE' 
-YDIR='--'
-CALL FMREAD(HINIFILE,YRECFM,HLUOUT,YDIR,YSTORAGE_TYPE,IGRID,ILENCH,YCOMMENT,IRESP)
 IF (IRESP /= 0) YSTORAGE_TYPE='TT'
 !
 !-------------------------------------------------------------------------------
@@ -430,40 +427,35 @@ IF (KMASDEV<50) THEN
 ELSE
   YRECFM = 'UT'
 ENDIF
-YDIR='XY'
-CALL FMREAD(HINIFILE,YRECFM,HLUOUT,YDIR,PUT,IGRID,ILENCH,YCOMMENT,IRESP)
+CALL IO_READ_FIELD(TPINIFILE,YRECFM,PUT)
 !
 IF (KMASDEV<50) THEN
   YRECFM = 'VM'
 ELSE
   YRECFM = 'VT'
 END IF
-YDIR='XY'
-CALL FMREAD(HINIFILE,YRECFM,HLUOUT,YDIR,PVT,IGRID,ILENCH,YCOMMENT,IRESP)
+CALL IO_READ_FIELD(TPINIFILE,YRECFM,PVT)
 !
 IF (KMASDEV<50) THEN
   YRECFM = 'WM'
 ELSE
   YRECFM = 'WT'
 END IF
-YDIR='XY'
-CALL FMREAD(HINIFILE,YRECFM,HLUOUT,YDIR,PWT,IGRID,ILENCH,YCOMMENT,IRESP)
+CALL IO_READ_FIELD(TPINIFILE,YRECFM,PWT)
 !
 IF (KMASDEV<50) THEN
   YRECFM = 'THM'
 ELSE
   YRECFM = 'THT'
 END IF
-YDIR='XY'
-CALL FMREAD(HINIFILE,YRECFM,HLUOUT,YDIR,PTHT,IGRID,ILENCH,YCOMMENT,IRESP)
+CALL IO_READ_FIELD(TPINIFILE,YRECFM,PTHT)
 !
 IF (KMASDEV<50) THEN
   YRECFM = 'PABSM'
 ELSE
   YRECFM = 'PABST'
 END IF
-YDIR='XY'
-CALL FMREAD(HINIFILE,YRECFM,HLUOUT,YDIR,PPABST,IGRID,ILENCH,YCOMMENT,IRESP)
+CALL IO_READ_FIELD(TPINIFILE,YRECFM,PPABST)
 PPABSM = PPABST
 !
 SELECT CASE(HGETTKET)                   
@@ -474,136 +466,99 @@ SELECT CASE(HGETTKET)
       YRECFM = 'TKET'
     END IF
     YDIR='XY'
-    CALL FMREAD(HINIFILE,YRECFM,HLUOUT,YDIR,PTKET,IGRID,ILENCH,YCOMMENT,IRESP)
+    CALL FMREAD(TPINIFILE%CNAME,YRECFM,HLUOUT,YDIR,PTKET,IGRID,ILENCH,YCOMMENT,IRESP)
     IF (KMASDEV>50 .AND. (CCONF == 'RESTA')) THEN
       YRECFM = 'TKEMS'
       YDIR='XY'
-      CALL FMREAD(HINIFILE,YRECFM,HLUOUT,YDIR,PRTKEMS,IGRID,ILENCH,YCOMMENT,IRESP)
+      CALL FMREAD(TPINIFILE%CNAME,YRECFM,HLUOUT,YDIR,PRTKEMS,IGRID,ILENCH,YCOMMENT,IRESP)
     END IF
   CASE('INIT')
     PTKET(:,:,:)=XTKEMIN
     PRTKEMS(:,:,:)=0.               
 END SELECT 
 !
-IRR=0
-!
 SELECT CASE(HGETRVT)             ! vapor
   CASE('READ')
-    IRR=IRR+1 
     IF (KMASDEV<50) THEN
       YRECFM = 'RVM'
     ELSE
       YRECFM='RVT'
     END IF
-    YDIR='XY'
-    CALL FMREAD(HINIFILE,YRECFM,HLUOUT,YDIR,Z3D,IGRID,ILENCH,  &
-                YCOMMENT,IRESP)
-    PRT(:,:,:,IRR)=Z3D(:,:,:)
+    CALL IO_READ_FIELD(TPINIFILE,YRECFM,PRT(:,:,:,IDX_RVT))
   CASE('INIT')
-    IRR=IRR+1 
-    PRT(:,:,:,IRR)=0.
+    PRT(:,:,:,IDX_RVT)=0.
 END SELECT 
 !
 SELECT CASE(HGETRCT)             ! cloud 
   CASE('READ') 
-    IRR=IRR+1
     IF (KMASDEV<50) THEN
       YRECFM = 'RCM'
     ELSE
       YRECFM='RCT'
     END IF
-    YDIR='XY'
-    CALL FMREAD(HINIFILE,YRECFM,HLUOUT,YDIR,Z3D,IGRID,ILENCH,  &
-                YCOMMENT,IRESP)
-    PRT(:,:,:,IRR)=Z3D(:,:,:)
+    CALL IO_READ_FIELD(TPINIFILE,YRECFM,PRT(:,:,:,IDX_RCT))
   CASE('INIT')
-    IRR=IRR+1 
-    PRT(:,:,:,IRR) = 0.
+    PRT(:,:,:,IDX_RCT) = 0.
 END SELECT
 !
 SELECT CASE(HGETRRT)             ! rain 
   CASE('READ') 
-    IRR=IRR+1
     IF (KMASDEV<50) THEN
       YRECFM = 'RRM'
     ELSE
       YRECFM ='RRT'
     END IF 
-    YDIR='XY'
-    CALL FMREAD(HINIFILE,YRECFM,HLUOUT,YDIR,Z3D,IGRID,ILENCH,  &
-                YCOMMENT,IRESP)
-    PRT(:,:,:,IRR)=Z3D(:,:,:)
+    CALL IO_READ_FIELD(TPINIFILE,YRECFM,PRT(:,:,:,IDX_RRT))
   CASE('INIT')
-    IRR=IRR+1 
-    PRT(:,:,:,IRR) = 0.
+    PRT(:,:,:,IDX_RRT) = 0.
 END SELECT
 !
 SELECT CASE(HGETRIT)             ! cloud ice
   CASE('READ') 
-    IRR=IRR+1 
     IF (KMASDEV<50) THEN
       YRECFM = 'RIM'
     ELSE
       YRECFM ='RIT'
     END IF 
-    YDIR='XY'
-    CALL FMREAD(HINIFILE,YRECFM,HLUOUT,YDIR,Z3D,IGRID,ILENCH,  &
-                YCOMMENT,IRESP)
-    PRT(:,:,:,IRR)=Z3D(:,:,:)
+    CALL IO_READ_FIELD(TPINIFILE,YRECFM,PRT(:,:,:,IDX_RIT))
   CASE('INIT')
-    IRR=IRR+1 
-    PRT(:,:,:,IRR)=0.
+    PRT(:,:,:,IDX_RIT)=0.
 END SELECT
 !
 SELECT CASE(HGETRST)             ! snow
   CASE('READ')
-    IRR=IRR+1 
     IF (KMASDEV<50) THEN
       YRECFM = 'RSM'
     ELSE
       YRECFM ='RST'
     END IF 
-    YDIR='XY'
-    CALL FMREAD(HINIFILE,YRECFM,HLUOUT,YDIR,Z3D,IGRID,ILENCH,  &
-                YCOMMENT,IRESP)
-    PRT(:,:,:,IRR)=Z3D(:,:,:)
+    CALL IO_READ_FIELD(TPINIFILE,YRECFM,PRT(:,:,:,IDX_RST))
   CASE('INIT')
-    IRR=IRR+1 
-    PRT(:,:,:,IRR)=0.
+    PRT(:,:,:,IDX_RST)=0.
 END SELECT
 !
 SELECT CASE(HGETRGT)             ! graupel
   CASE('READ') 
-    IRR=IRR+1 
     IF (KMASDEV<50) THEN
       YRECFM = 'RGM'
     ELSE
       YRECFM ='RGT'
     END IF 
-    YDIR='XY'
-    CALL FMREAD(HINIFILE,YRECFM,HLUOUT,YDIR,Z3D,IGRID,ILENCH,  &
-                YCOMMENT,IRESP)
-    PRT(:,:,:,IRR)=Z3D(:,:,:)
+    CALL IO_READ_FIELD(TPINIFILE,YRECFM,PRT(:,:,:,IDX_RGT))
   CASE('INIT')
-    IRR=IRR+1 
-    PRT(:,:,:,IRR)=0.
+    PRT(:,:,:,IDX_RGT)=0.
 END SELECT
 !
 SELECT CASE(HGETRHT)             ! hail
   CASE('READ') 
-    IRR=IRR+1 
     IF (KMASDEV<50) THEN
       YRECFM = 'RHM'
     ELSE
       YRECFM ='RHT'
     END IF 
-    YDIR='XY'
-    CALL FMREAD(HINIFILE,YRECFM,HLUOUT,YDIR,Z3D,IGRID,ILENCH,  &
-                YCOMMENT,IRESP)
-    PRT(:,:,:,IRR)=Z3D(:,:,:)
+    CALL IO_READ_FIELD(TPINIFILE,YRECFM,PRT(:,:,:,IDX_RHT))
   CASE('INIT')
-    IRR=IRR+1 
-    PRT(:,:,:,IRR)=0.
+    PRT(:,:,:,IDX_RHT)=0.
 END SELECT
 !
 SELECT CASE(HGETCIT)             ! ice concentration
@@ -611,7 +566,7 @@ SELECT CASE(HGETCIT)             ! ice concentration
     YRECFM='CIT'
     YDIR='XY'
     IF (SIZE(PCIT) /= 0 )   &
-    CALL FMREAD(HINIFILE,YRECFM,HLUOUT,YDIR,PCIT,IGRID,ILENCH,  &
+    CALL FMREAD(TPINIFILE%CNAME,YRECFM,HLUOUT,YDIR,PCIT,IGRID,ILENCH,  &
                 YCOMMENT,IRESP)
   CASE('INIT')
     PCIT(:,:,:)=0.
@@ -626,7 +581,7 @@ DO JSV = 1, NSV_USER              ! initialize according to the get indicators
   SELECT CASE(HGETSVT(JSV))
     CASE ('READ')
       WRITE(YRECFM,'(A3,I3.3)')'SVT',JSV
-      CALL FMREAD(HINIFILE,YRECFM,HLUOUT,YDIR,Z3D,IGRID,ILENCH,  &
+      CALL FMREAD(TPINIFILE%CNAME,YRECFM,HLUOUT,YDIR,Z3D,IGRID,ILENCH,  &
                 YCOMMENT,IRESP)
       PSVT(:,:,:,JSV) = Z3D(:,:,:)
     CASE ('INIT')
@@ -638,7 +593,7 @@ DO JSV = NSV_C2R2BEG,NSV_C2R2END
   SELECT CASE(HGETSVT(JSV))
   CASE ('READ')
     YRECFM=TRIM(C2R2NAMES(JSV-NSV_C2R2BEG+1))//'T'
-    CALL FMREAD(HINIFILE,YRECFM,HLUOUT,YDIR,Z3D,IGRID,ILENCH,  &
+    CALL FMREAD(TPINIFILE%CNAME,YRECFM,HLUOUT,YDIR,Z3D,IGRID,ILENCH,  &
          YCOMMENT,IRESP)
     PSVT(:,:,:,JSV) = Z3D(:,:,:)
   CASE ('INIT')
@@ -659,7 +614,7 @@ DO JSV = NSV_C1R3BEG,NSV_C1R3END
   SELECT CASE(HGETSVT(JSV))
   CASE ('READ')
     YRECFM=TRIM(C1R3NAMES(JSV-NSV_C1R3BEG+1))//'T'
-    CALL FMREAD(HINIFILE,YRECFM,HLUOUT,YDIR,Z3D,IGRID,ILENCH,  &
+    CALL FMREAD(TPINIFILE%CNAME,YRECFM,HLUOUT,YDIR,Z3D,IGRID,ILENCH,  &
          YCOMMENT,IRESP)
     PSVT(:,:,:,JSV) = Z3D(:,:,:)
   CASE ('INIT')
@@ -720,7 +675,7 @@ DO JSV = NSV_LIMA_BEG,NSV_LIMA_END
     YRECFM=TRIM(CLIMA_COLD_NAMES(5))//'T'
   END IF
 !
-  CALL FMREAD(HINIFILE,YRECFM,HLUOUT,YDIR,Z3D,IGRID,ILENCH,YCOMMENT,IRESP)
+  CALL FMREAD(TPINIFILE%CNAME,YRECFM,HLUOUT,YDIR,Z3D,IGRID,ILENCH,YCOMMENT,IRESP)
 !
     PSVT(:,:,:,JSV) = Z3D(:,:,:)
   CASE ('INIT')
@@ -732,7 +687,7 @@ DO JSV = NSV_ELECBEG,NSV_ELECEND
   SELECT CASE(HGETSVT(JSV))
   CASE ('READ')
     YRECFM=TRIM(CELECNAMES(JSV-NSV_ELECBEG+1))//'T'
-    CALL FMREAD(HINIFILE,YRECFM,HLUOUT,YDIR,Z3D,IGRID,ILENCH,  &
+    CALL FMREAD(TPINIFILE%CNAME,YRECFM,HLUOUT,YDIR,Z3D,IGRID,ILENCH,  &
          YCOMMENT,IRESP)
     PSVT(:,:,:,JSV) = Z3D(:,:,:)
   CASE ('INIT')
@@ -745,7 +700,7 @@ DO JSV = NSV_CHGSBEG,NSV_CHGSEND
   CASE ('READ')
     CNAMES(JSV-NSV_CHGSBEG+1) = UPCASE(CNAMES(JSV-NSV_CHGSBEG+1))
     YRECFM=TRIM(CNAMES(JSV-NSV_CHGSBEG+1))//'T'
-    CALL FMREAD(HINIFILE,YRECFM,HLUOUT,YDIR,Z3D,IGRID,ILENCH,  &
+    CALL FMREAD(TPINIFILE%CNAME,YRECFM,HLUOUT,YDIR,Z3D,IGRID,ILENCH,  &
          YCOMMENT,IRESP)
     PSVT(:,:,:,JSV) = Z3D(:,:,:)
   CASE ('INIT')
@@ -758,7 +713,7 @@ DO JSV = NSV_CHACBEG,NSV_CHACEND
   CASE ('READ')
     CNAMES(JSV-NSV_CHACBEG+NSV_CHGS+1) = UPCASE(CNAMES(JSV-NSV_CHACBEG+NSV_CHGS+1))
     YRECFM=TRIM(CNAMES(JSV-NSV_CHACBEG+NSV_CHGS+1))//'T'
-    CALL FMREAD(HINIFILE,YRECFM,HLUOUT,YDIR,Z3D,IGRID,ILENCH,  &
+    CALL FMREAD(TPINIFILE%CNAME,YRECFM,HLUOUT,YDIR,Z3D,IGRID,ILENCH,  &
          YCOMMENT,IRESP)
     PSVT(:,:,:,JSV) = Z3D(:,:,:)
   CASE ('INIT')
@@ -771,7 +726,7 @@ DO JSV = NSV_CHICBEG,NSV_CHICEND
   CASE ('READ')
     CICNAMES(JSV-NSV_CHICBEG+1) = UPCASE(CICNAMES(JSV-NSV_CHICBEG+1))
     YRECFM=TRIM(CICNAMES(JSV-NSV_CHICBEG+1))//'T'
-    CALL FMREAD(HINIFILE,YRECFM,HLUOUT,YDIR,Z3D,IGRID,ILENCH,  &
+    CALL FMREAD(TPINIFILE%CNAME,YRECFM,HLUOUT,YDIR,Z3D,IGRID,ILENCH,  &
          YCOMMENT,IRESP)
     PSVT(:,:,:,JSV) = Z3D(:,:,:)
   CASE ('INIT')
@@ -783,7 +738,7 @@ DO JSV = NSV_SLTBEG,NSV_SLTEND
   SELECT CASE(HGETSVT(JSV))
   CASE ('READ')
     YRECFM=TRIM(CSALTNAMES(JSV-NSV_SLTBEG+1))//'T'
-    CALL FMREAD(HINIFILE,YRECFM,HLUOUT,YDIR,Z3D,IGRID,ILENCH,  &
+    CALL FMREAD(TPINIFILE%CNAME,YRECFM,HLUOUT,YDIR,Z3D,IGRID,ILENCH,  &
          YCOMMENT,IRESP)
     PSVT(:,:,:,JSV) = Z3D(:,:,:)
   CASE ('INIT')
@@ -795,7 +750,7 @@ DO JSV = NSV_SLTDEPBEG,NSV_SLTDEPEND
   SELECT CASE(HGETSVT(JSV))
   CASE ('READ')
     YRECFM=TRIM(CDESLTNAMES(JSV-NSV_SLTDEPBEG+1))//'T'
-    CALL FMREAD(HINIFILE,YRECFM,HLUOUT,YDIR,Z3D,IGRID,ILENCH,  &
+    CALL FMREAD(TPINIFILE%CNAME,YRECFM,HLUOUT,YDIR,Z3D,IGRID,ILENCH,  &
          YCOMMENT,IRESP)
     PSVT(:,:,:,JSV) = Z3D(:,:,:)
   CASE ('INIT')
@@ -807,7 +762,7 @@ DO JSV = NSV_DSTBEG,NSV_DSTEND
   SELECT CASE(HGETSVT(JSV))
   CASE ('READ')
     YRECFM=TRIM(CDUSTNAMES(JSV-NSV_DSTBEG+1))//'T'
-    CALL FMREAD(HINIFILE,YRECFM,HLUOUT,YDIR,Z3D,IGRID,ILENCH,  &
+    CALL FMREAD(TPINIFILE%CNAME,YRECFM,HLUOUT,YDIR,Z3D,IGRID,ILENCH,  &
          YCOMMENT,IRESP)
     PSVT(:,:,:,JSV) = Z3D(:,:,:)
   CASE ('INIT')
@@ -819,7 +774,7 @@ DO JSV = NSV_DSTDEPBEG,NSV_DSTDEPEND
   SELECT CASE(HGETSVT(JSV))
   CASE ('READ')
     YRECFM=TRIM(CDEDSTNAMES(JSV-NSV_DSTDEPBEG+1))//'T'
-    CALL FMREAD(HINIFILE,YRECFM,HLUOUT,YDIR,Z3D,IGRID,ILENCH,  &
+    CALL FMREAD(TPINIFILE%CNAME,YRECFM,HLUOUT,YDIR,Z3D,IGRID,ILENCH,  &
          YCOMMENT,IRESP)
     PSVT(:,:,:,JSV) = Z3D(:,:,:)  
     CASE ('INIT')
@@ -831,7 +786,7 @@ DO JSV = NSV_AERBEG,NSV_AEREND
   SELECT CASE(HGETSVT(JSV))
   CASE ('READ')
     YRECFM=TRIM(CAERONAMES(JSV-NSV_AERBEG+1))//'T'
-    CALL FMREAD(HINIFILE,YRECFM,HLUOUT,YDIR,Z3D,IGRID,ILENCH,  &
+    CALL FMREAD(TPINIFILE%CNAME,YRECFM,HLUOUT,YDIR,Z3D,IGRID,ILENCH,  &
          YCOMMENT,IRESP)
     PSVT(:,:,:,JSV) = Z3D(:,:,:)
   CASE ('INIT')
@@ -843,7 +798,7 @@ DO JSV = NSV_AERDEPBEG,NSV_AERDEPEND
   SELECT CASE(HGETSVT(JSV))
   CASE ('READ')
     YRECFM=TRIM(CDEAERNAMES(JSV-NSV_AERDEPBEG+1))//'T'
-    CALL FMREAD(HINIFILE,YRECFM,HLUOUT,YDIR,Z3D,IGRID,ILENCH,  &
+    CALL FMREAD(TPINIFILE%CNAME,YRECFM,HLUOUT,YDIR,Z3D,IGRID,ILENCH,  &
          YCOMMENT,IRESP)
     PSVT(:,:,:,JSV) = Z3D(:,:,:)  
     CASE ('INIT')
@@ -855,7 +810,7 @@ DO JSV = NSV_LGBEG,NSV_LGEND
   SELECT CASE(HGETSVT(JSV))
   CASE ('READ')
     YRECFM=TRIM(CLGNAMES(JSV-NSV_LGBEG+1))//'T'
-    CALL FMREAD(HINIFILE,YRECFM,HLUOUT,YDIR,Z3D,IGRID,ILENCH,  &
+    CALL FMREAD(TPINIFILE%CNAME,YRECFM,HLUOUT,YDIR,Z3D,IGRID,ILENCH,  &
          YCOMMENT,IRESP)
     PSVT(:,:,:,JSV) = Z3D(:,:,:)
   CASE ('INIT')
@@ -867,7 +822,7 @@ DO JSV = NSV_PPBEG,NSV_PPEND
   SELECT CASE(HGETSVT(JSV))
   CASE ('READ')
     WRITE(YRECFM,'(A3,I3.3)')'SVT',JSV
-    CALL FMREAD(HINIFILE,YRECFM,HLUOUT,YDIR,Z3D,IGRID,ILENCH,  &
+    CALL FMREAD(TPINIFILE%CNAME,YRECFM,HLUOUT,YDIR,Z3D,IGRID,ILENCH,  &
          YCOMMENT,IRESP)
     IF ( IRESP ==0 ) THEN
        PSVT(:,:,:,JSV) = Z3D(:,:,:)
@@ -875,7 +830,7 @@ DO JSV = NSV_PPBEG,NSV_PPEND
        PSVT(:,:,:,JSV) = 0.
     END IF
     WRITE(YRECFM,'(A3,I3.3)')'ATC',JSV
-    CALL FMREAD(HINIFILE,YRECFM,HLUOUT,YDIR,Z3D,IGRID,ILENCH,YCOMMENT,IRESP)
+    CALL FMREAD(TPINIFILE%CNAME,YRECFM,HLUOUT,YDIR,Z3D,IGRID,ILENCH,YCOMMENT,IRESP)
     IF (IRESP == 0) THEN
       PATC(:,:,:,JSV-NSV_PPBEG+1) = Z3D(:,:,:)
     ELSE
@@ -892,7 +847,7 @@ DO JSV = NSV_FFBEG,NSV_FFEND
   SELECT CASE(HGETSVT(JSV))
   CASE ('READ')
     WRITE(YRECFM,'(A3,I3.3)')'SVT',JSV
-    CALL FMREAD(HINIFILE,YRECFM,HLUOUT,YDIR,Z3D,IGRID,ILENCH,  &
+    CALL FMREAD(TPINIFILE%CNAME,YRECFM,HLUOUT,YDIR,Z3D,IGRID,ILENCH,  &
          YCOMMENT,IRESP)
     IF (IRESP == 0) THEN
        PSVT(:,:,:,JSV) = Z3D(:,:,:)
@@ -909,7 +864,7 @@ DO JSV = NSV_CSBEG,NSV_CSEND
   SELECT CASE(HGETSVT(JSV))
   CASE ('READ')
     WRITE(YRECFM,'(A3,I3.3)')'SVT',JSV
-    CALL FMREAD(HINIFILE,YRECFM,HLUOUT,YDIR,Z3D,IGRID,ILENCH,  &
+    CALL FMREAD(TPINIFILE%CNAME,YRECFM,HLUOUT,YDIR,Z3D,IGRID,ILENCH,  &
          YCOMMENT,IRESP)
     IF ( IRESP ==0 ) THEN
        PSVT(:,:,:,JSV) = Z3D(:,:,:)
@@ -925,7 +880,7 @@ DO JSV = NSV_LNOXBEG,NSV_LNOXEND
   SELECT CASE(HGETSVT(JSV))
   CASE ('READ')
     YRECFM='LINOXT'
-    CALL FMREAD(HINIFILE,YRECFM,HLUOUT,YDIR,Z3D,IGRID,ILENCH,  &
+    CALL FMREAD(TPINIFILE%CNAME,YRECFM,HLUOUT,YDIR,Z3D,IGRID,ILENCH,  &
          YCOMMENT,IRESP)
     PSVT(:,:,:,JSV) = Z3D(:,:,:)
   CASE ('INIT')
@@ -936,56 +891,56 @@ END DO
 IF (CCONF == 'RESTA') THEN
   YRECFM = 'US_PRES'
   YDIR='XY'
-  CALL FMREAD(HINIFILE,YRECFM,HLUOUT,YDIR,PRUS_PRES,IGRID,ILENCH,YCOMMENT,IRESP)
+  CALL FMREAD(TPINIFILE%CNAME,YRECFM,HLUOUT,YDIR,PRUS_PRES,IGRID,ILENCH,YCOMMENT,IRESP)
   YRECFM = 'VS_PRES'
   YDIR='XY'
-  CALL FMREAD(HINIFILE,YRECFM,HLUOUT,YDIR,PRVS_PRES,IGRID,ILENCH,YCOMMENT,IRESP)
+  CALL FMREAD(TPINIFILE%CNAME,YRECFM,HLUOUT,YDIR,PRVS_PRES,IGRID,ILENCH,YCOMMENT,IRESP)
   YRECFM = 'WS_PRES'
   YDIR='XY'
-  CALL FMREAD(HINIFILE,YRECFM,HLUOUT,YDIR,PRWS_PRES,IGRID,ILENCH,YCOMMENT,IRESP)
+  CALL FMREAD(TPINIFILE%CNAME,YRECFM,HLUOUT,YDIR,PRWS_PRES,IGRID,ILENCH,YCOMMENT,IRESP)
   YRECFM = 'THS_CLD'
   YDIR='XY'
-  CALL FMREAD(HINIFILE,YRECFM,HLUOUT,YDIR,PRTHS_CLD,IGRID,ILENCH,YCOMMENT,IRESP)
+  CALL FMREAD(TPINIFILE%CNAME,YRECFM,HLUOUT,YDIR,PRTHS_CLD,IGRID,ILENCH,YCOMMENT,IRESP)
   DO JRR = 1, SIZE(PRT,4)
    IF (JRR == 1 ) THEN
     YRECFM='RVS_CLD'
-    CALL FMREAD(HINIFILE,YRECFM,HLUOUT,YDIR,Z3D,IGRID,ILENCH,  &
+    CALL FMREAD(TPINIFILE%CNAME,YRECFM,HLUOUT,YDIR,Z3D,IGRID,ILENCH,  &
          YCOMMENT,IRESP)
     PRRS_CLD(:,:,:,JRR) = Z3D(:,:,:)
    END IF
    IF (JRR == 2 ) THEN
     YRECFM='RCS_CLD'
-    CALL FMREAD(HINIFILE,YRECFM,HLUOUT,YDIR,Z3D,IGRID,ILENCH,  &
+    CALL FMREAD(TPINIFILE%CNAME,YRECFM,HLUOUT,YDIR,Z3D,IGRID,ILENCH,  &
          YCOMMENT,IRESP)
     PRRS_CLD(:,:,:,JRR) = Z3D(:,:,:)
    END IF
    IF (JRR == 3 ) THEN
     YRECFM='RRS_CLD'
-    CALL FMREAD(HINIFILE,YRECFM,HLUOUT,YDIR,Z3D,IGRID,ILENCH,  &
+    CALL FMREAD(TPINIFILE%CNAME,YRECFM,HLUOUT,YDIR,Z3D,IGRID,ILENCH,  &
          YCOMMENT,IRESP)
     PRRS_CLD(:,:,:,JRR) = Z3D(:,:,:)
    END IF
    IF (JRR == 4 ) THEN
     YRECFM='RIS_CLD'
-    CALL FMREAD(HINIFILE,YRECFM,HLUOUT,YDIR,Z3D,IGRID,ILENCH,  &
+    CALL FMREAD(TPINIFILE%CNAME,YRECFM,HLUOUT,YDIR,Z3D,IGRID,ILENCH,  &
          YCOMMENT,IRESP)
     PRRS_CLD(:,:,:,JRR) = Z3D(:,:,:)
    END IF
    IF (JRR == 5 ) THEN
     YRECFM='RSS_CLD'
-    CALL FMREAD(HINIFILE,YRECFM,HLUOUT,YDIR,Z3D,IGRID,ILENCH,  &
+    CALL FMREAD(TPINIFILE%CNAME,YRECFM,HLUOUT,YDIR,Z3D,IGRID,ILENCH,  &
          YCOMMENT,IRESP)
     PRRS_CLD(:,:,:,JRR) = Z3D(:,:,:)
    END IF
    IF (JRR == 6 ) THEN
     YRECFM='RGS_CLD'
-    CALL FMREAD(HINIFILE,YRECFM,HLUOUT,YDIR,Z3D,IGRID,ILENCH,  &
+    CALL FMREAD(TPINIFILE%CNAME,YRECFM,HLUOUT,YDIR,Z3D,IGRID,ILENCH,  &
          YCOMMENT,IRESP)
     PRRS_CLD(:,:,:,JRR) = Z3D(:,:,:)
    END IF
    IF (JRR == 7 ) THEN
     YRECFM='RHS_CLD'
-    CALL FMREAD(HINIFILE,YRECFM,HLUOUT,YDIR,Z3D,IGRID,ILENCH,  &
+    CALL FMREAD(TPINIFILE%CNAME,YRECFM,HLUOUT,YDIR,Z3D,IGRID,ILENCH,  &
          YCOMMENT,IRESP)
     PRRS_CLD(:,:,:,JRR) = Z3D(:,:,:)
    END IF
@@ -993,13 +948,13 @@ IF (CCONF == 'RESTA') THEN
   DO JSV = NSV_C2R2BEG,NSV_C2R2END
    IF (JSV == NSV_C2R2BEG ) THEN
     YRECFM='RSVS_CLD1'
-    CALL FMREAD(HINIFILE,YRECFM,HLUOUT,YDIR,Z3D,IGRID,ILENCH,  &
+    CALL FMREAD(TPINIFILE%CNAME,YRECFM,HLUOUT,YDIR,Z3D,IGRID,ILENCH,  &
          YCOMMENT,IRESP)
     PRSVS_CLD(:,:,:,JSV) = Z3D(:,:,:)
    END IF
    IF (JSV == NSV_C2R2BEG ) THEN
     YRECFM='RSVS_CLD2'
-    CALL FMREAD(HINIFILE,YRECFM,HLUOUT,YDIR,Z3D,IGRID,ILENCH,  &
+    CALL FMREAD(TPINIFILE%CNAME,YRECFM,HLUOUT,YDIR,Z3D,IGRID,ILENCH,  &
          YCOMMENT,IRESP)
     PRSVS_CLD(:,:,:,JSV) = Z3D(:,:,:)
    END IF
@@ -1013,27 +968,27 @@ IF (CPROGRAM=='MESONH' .AND. HUVW_ADV_SCHEME(1:3)=='CEN' .AND. &
   IF (CCONF=='RESTA') THEN
     YRECFM = 'UM'
     YDIR='XY'
-    CALL FMREAD(HINIFILE,YRECFM,HLUOUT,YDIR,PUM,IGRID,ILENCH,YCOMMENT,IRESP)
+    CALL FMREAD(TPINIFILE%CNAME,YRECFM,HLUOUT,YDIR,PUM,IGRID,ILENCH,YCOMMENT,IRESP)
     !
     YRECFM = 'VM'
     YDIR='XY'
-    CALL FMREAD(HINIFILE,YRECFM,HLUOUT,YDIR,PVM,IGRID,ILENCH,YCOMMENT,IRESP)
+    CALL FMREAD(TPINIFILE%CNAME,YRECFM,HLUOUT,YDIR,PVM,IGRID,ILENCH,YCOMMENT,IRESP)
     !
     YRECFM = 'WM'
     YDIR='XY'
-    CALL FMREAD(HINIFILE,YRECFM,HLUOUT,YDIR,PWM,IGRID,ILENCH,YCOMMENT,IRESP)
+    CALL FMREAD(TPINIFILE%CNAME,YRECFM,HLUOUT,YDIR,PWM,IGRID,ILENCH,YCOMMENT,IRESP)
     !
     YRECFM = 'DUM'
     YDIR='XY'
-    CALL FMREAD(HINIFILE,YRECFM,HLUOUT,YDIR,PDUM,IGRID,ILENCH,YCOMMENT,IRESP)
+    CALL FMREAD(TPINIFILE%CNAME,YRECFM,HLUOUT,YDIR,PDUM,IGRID,ILENCH,YCOMMENT,IRESP)
     !
     YRECFM = 'DVM'
     YDIR='XY'
-    CALL FMREAD(HINIFILE,YRECFM,HLUOUT,YDIR,PDVM,IGRID,ILENCH,YCOMMENT,IRESP)
+    CALL FMREAD(TPINIFILE%CNAME,YRECFM,HLUOUT,YDIR,PDVM,IGRID,ILENCH,YCOMMENT,IRESP)
     !
     YRECFM = 'DWM'
     YDIR='XY'
-    CALL FMREAD(HINIFILE,YRECFM,HLUOUT,YDIR,PDWM,IGRID,ILENCH,YCOMMENT,IRESP)
+    CALL FMREAD(TPINIFILE%CNAME,YRECFM,HLUOUT,YDIR,PDWM,IGRID,ILENCH,YCOMMENT,IRESP)
   ELSE
     PUM = PUT
     PVM = PVT
@@ -1044,38 +999,38 @@ END IF
 !*       2.2a  3D LS fields  
 !
 !
-CALL INI_LS(HINIFILE,HLUOUT,HGETRVT,GLSOURCE,PLSUM,PLSVM,PLSWM,PLSTHM,PLSRVM)
+CALL INI_LS(TPINIFILE%CNAME,HLUOUT,HGETRVT,GLSOURCE,PLSUM,PLSVM,PLSWM,PLSTHM,PLSRVM)
 !
 !
 !*       2.2b  2D "surfacic" LB fields   
 !
 !
-CALL INI_LB(HINIFILE,HLUOUT,GLSOURCE,ISV,                             &   
+CALL INI_LB(TPINIFILE%CNAME,HLUOUT,GLSOURCE,ISV,                      &
      KSIZELBX_ll,KSIZELBXU_ll,KSIZELBY_ll,KSIZELBYV_ll,               &
      KSIZELBXTKE_ll,KSIZELBYTKE_ll,                                   &
      KSIZELBXR_ll,KSIZELBYR_ll,KSIZELBXSV_ll,KSIZELBYSV_ll,           &
      HGETTKET,HGETRVT,HGETRCT,HGETRRT,HGETRIT,HGETRST,                &
      HGETRGT,HGETRHT,HGETSVT,                                         &
      PLBXUM,PLBXVM,PLBXWM,PLBXTHM,PLBXTKEM,PLBXRM,PLBXSVM,            &
-     PLBYUM,PLBYVM,PLBYWM,PLBYTHM,PLBYTKEM,PLBYRM,PLBYSVM             ) 
+     PLBYUM,PLBYVM,PLBYWM,PLBYTHM,PLBYTKEM,PLBYRM,PLBYSVM             )
 !
 !
 !*       2.3  Some special variables:
 !
 YRECFM = 'DRYMASST'                  ! dry mass
 YDIR='--'
-CALL FMREAD(HINIFILE,YRECFM,HLUOUT,YDIR,PDRYMASST,IGRID,ILENCH,YCOMMENT,IRESP)
+CALL FMREAD(TPINIFILE%CNAME,YRECFM,HLUOUT,YDIR,PDRYMASST,IGRID,ILENCH,YCOMMENT,IRESP)
 !
 SELECT CASE(HGETSRCT)                ! turbulent flux SRC at time t
   CASE('READ')
     YRECFM='SRCT'
     YDIR='XY'
-    CALL FMREAD(HINIFILE,YRECFM,HLUOUT,YDIR,Z3D,IGRID,ILENCH,  &
+    CALL FMREAD(TPINIFILE%CNAME,YRECFM,HLUOUT,YDIR,Z3D,IGRID,ILENCH,  &
                 YCOMMENT,IRESP)
     IF( IRESP /= 0 ) THEN
       YRECFM='SRC'
       YDIR='XY'
-      CALL FMREAD(HINIFILE,YRECFM,HLUOUT,YDIR,Z3D,IGRID,ILENCH,  &
+      CALL FMREAD(TPINIFILE%CNAME,YRECFM,HLUOUT,YDIR,Z3D,IGRID,ILENCH,  &
                   YCOMMENT,IRESP)
     END IF
     PSRCT(:,:,:)=Z3D(:,:,:)
@@ -1087,7 +1042,7 @@ SELECT CASE(HGETSIGS)                ! subgrid condensation
   CASE('READ')
     YRECFM='SIGS'
     YDIR='XY' 
-    CALL FMREAD(HINIFILE,YRECFM,HLUOUT,YDIR,PSIGS,IGRID,ILENCH,  &
+    CALL FMREAD(TPINIFILE%CNAME,YRECFM,HLUOUT,YDIR,PSIGS,IGRID,ILENCH,  &
                 YCOMMENT,IRESP)
   CASE('INIT')
     PSIGS(:,:,:)=0.
@@ -1097,7 +1052,7 @@ SELECT CASE(HGETPHC)             ! pH in cloud water
   CASE('READ')
     YRECFM='PHC'
     YDIR='XY'
-    CALL FMREAD(HINIFILE,YRECFM,HLUOUT,YDIR,PPHC,IGRID,ILENCH,  &
+    CALL FMREAD(TPINIFILE%CNAME,YRECFM,HLUOUT,YDIR,PPHC,IGRID,ILENCH,  &
                 YCOMMENT,IRESP)
   CASE('INIT')
     PPHC(:,:,:)=0.
@@ -1107,7 +1062,7 @@ SELECT CASE(HGETPHR)             ! pH in rainwater
   CASE('READ')
     YRECFM='PHR'
     YDIR='XY'
-    CALL FMREAD(HINIFILE,YRECFM,HLUOUT,YDIR,PPHR,IGRID,ILENCH,  &
+    CALL FMREAD(TPINIFILE%CNAME,YRECFM,HLUOUT,YDIR,PPHR,IGRID,ILENCH,  &
                 YCOMMENT,IRESP)
   CASE('INIT')
     PPHR(:,:,:)=0.
@@ -1117,7 +1072,7 @@ IRESP=0
 IF(HGETCLDFR=='READ') THEN           ! cloud fraction
     YRECFM='CLDFR'
     YDIR='XY' 
-    CALL FMREAD(HINIFILE,YRECFM,HLUOUT,YDIR,PCLDFR,IGRID,ILENCH,  &
+    CALL FMREAD(TPINIFILE%CNAME,YRECFM,HLUOUT,YDIR,PCLDFR,IGRID,ILENCH,  &
                 YCOMMENT,IRESP)
 ENDIF
 IF(HGETCLDFR=='INIT' .OR. IRESP /= 0) THEN
@@ -1141,7 +1096,7 @@ ENDIF
 IF (HGETBL_DEPTH=='READ') THEN
   YRECFM = 'BL_DEPTH'
   YDIR='XY'
-  CALL FMREAD(HINIFILE,YRECFM,HLUOUT,YDIR,PBL_DEPTH,IGRID,ILENCH,YCOMMENT,IRESP)
+  CALL FMREAD(TPINIFILE%CNAME,YRECFM,HLUOUT,YDIR,PBL_DEPTH,IGRID,ILENCH,YCOMMENT,IRESP)
 ELSE
   PBL_DEPTH(:,:)=XUNDEF
 END IF
@@ -1151,7 +1106,7 @@ END IF
 IF (HGETSBL_DEPTH=='READ') THEN
   YRECFM = 'SBL_DEPTH'
   YDIR='XY'
-  CALL FMREAD(HINIFILE,YRECFM,HLUOUT,YDIR,PSBL_DEPTH,IGRID,ILENCH,YCOMMENT,IRESP)
+  CALL FMREAD(TPINIFILE%CNAME,YRECFM,HLUOUT,YDIR,PSBL_DEPTH,IGRID,ILENCH,YCOMMENT,IRESP)
 ELSE
   PSBL_DEPTH(:,:)=0.
 END IF
@@ -1162,7 +1117,7 @@ SELECT CASE(HGETTKET)
   CASE('READ') 
     YRECFM = 'WTHVMF'
     YDIR='XY'
-    CALL FMREAD(HINIFILE,YRECFM,HLUOUT,YDIR,PWTHVMF,IGRID,ILENCH,YCOMMENT,IRESP)
+    CALL FMREAD(TPINIFILE%CNAME,YRECFM,HLUOUT,YDIR,PWTHVMF,IGRID,ILENCH,YCOMMENT,IRESP)
   CASE('INIT')
     PWTHVMF(:,:,:)=0.
 END SELECT 
@@ -1178,63 +1133,63 @@ IF ( LFORCING ) THEN
     WRITE (YFRC,'(I3.3)') JT
     YRECFM='DTFRC'//YFRC//'%TDATE' ! array of rank 3 for date
     YDIR='--'
-    CALL FMREAD(HINIFILE,YRECFM,HLUOUT,YDIR,ITDATE,IGRID,ILENCH,YCOMMENT,IRESP)
+    CALL FMREAD(TPINIFILE%CNAME,YRECFM,HLUOUT,YDIR,ITDATE,IGRID,ILENCH,YCOMMENT,IRESP)
     TPDTFRC(JT)%TDATE%YEAR  = ITDATE(1)
     TPDTFRC(JT)%TDATE%MONTH = ITDATE(2)
     TPDTFRC(JT)%TDATE%DAY   = ITDATE(3)
     YRECFM='DTFRC'//YFRC//'%TIME'
     YDIR='--'
-    CALL FMREAD(HINIFILE,YRECFM,HLUOUT,YDIR,TPDTFRC(JT)%TIME,IGRID,ILENCH, &
+    CALL FMREAD(TPINIFILE%CNAME,YRECFM,HLUOUT,YDIR,TPDTFRC(JT)%TIME,IGRID,ILENCH, &
                 YCOMMENT,IRESP)
 !
     YRECFM='UFRC'//YFRC
     YDIR='--'
-    CALL FMREAD(HINIFILE,YRECFM,HLUOUT,YDIR,Z1D,IGRID,ILENCH,YCOMMENT,IRESP)
+    CALL FMREAD(TPINIFILE%CNAME,YRECFM,HLUOUT,YDIR,Z1D,IGRID,ILENCH,YCOMMENT,IRESP)
     PUFRC(:,JT)=Z1D(:)
 !
     YRECFM='VFRC'//YFRC
     YDIR='--'
-    CALL FMREAD(HINIFILE,YRECFM,HLUOUT,YDIR,Z1D,IGRID,ILENCH,YCOMMENT,IRESP)
+    CALL FMREAD(TPINIFILE%CNAME,YRECFM,HLUOUT,YDIR,Z1D,IGRID,ILENCH,YCOMMENT,IRESP)
     PVFRC(:,JT)=Z1D(:)
 !
     YRECFM='WFRC'//YFRC
     YDIR='--'
-    CALL FMREAD(HINIFILE,YRECFM,HLUOUT,YDIR,Z1D,IGRID,ILENCH,YCOMMENT,IRESP)
+    CALL FMREAD(TPINIFILE%CNAME,YRECFM,HLUOUT,YDIR,Z1D,IGRID,ILENCH,YCOMMENT,IRESP)
     PWFRC(:,JT)=Z1D(:)
 !
     YRECFM='THFRC'//YFRC
     YDIR='--'
-    CALL FMREAD(HINIFILE,YRECFM,HLUOUT,YDIR,Z1D,IGRID,ILENCH,YCOMMENT,IRESP)
+    CALL FMREAD(TPINIFILE%CNAME,YRECFM,HLUOUT,YDIR,Z1D,IGRID,ILENCH,YCOMMENT,IRESP)
     PTHFRC(:,JT)=Z1D(:)
 !
     YRECFM='RVFRC'//YFRC
     YDIR='--'
-    CALL FMREAD(HINIFILE,YRECFM,HLUOUT,YDIR,Z1D,IGRID,ILENCH,YCOMMENT,IRESP)
+    CALL FMREAD(TPINIFILE%CNAME,YRECFM,HLUOUT,YDIR,Z1D,IGRID,ILENCH,YCOMMENT,IRESP)
     PRVFRC(:,JT)=Z1D(:)
 !
     YRECFM='TENDTHFRC'//YFRC
     YDIR='--'
-    CALL FMREAD(HINIFILE,YRECFM,HLUOUT,YDIR,Z1D,IGRID,ILENCH,YCOMMENT,IRESP)
+    CALL FMREAD(TPINIFILE%CNAME,YRECFM,HLUOUT,YDIR,Z1D,IGRID,ILENCH,YCOMMENT,IRESP)
     PTENDTHFRC(:,JT)=Z1D(:)
 !
     YRECFM='TENDRVFRC'//YFRC
     YDIR='--'
-    CALL FMREAD(HINIFILE,YRECFM,HLUOUT,YDIR,Z1D,IGRID,ILENCH,YCOMMENT,IRESP)
+    CALL FMREAD(TPINIFILE%CNAME,YRECFM,HLUOUT,YDIR,Z1D,IGRID,ILENCH,YCOMMENT,IRESP)
     PTENDRVFRC(:,JT)=Z1D(:)
 !
     YRECFM='GXTHFRC'//YFRC
     YDIR='--'
-    CALL FMREAD(HINIFILE,YRECFM,HLUOUT,YDIR,Z1D,IGRID,ILENCH,YCOMMENT,IRESP)
+    CALL FMREAD(TPINIFILE%CNAME,YRECFM,HLUOUT,YDIR,Z1D,IGRID,ILENCH,YCOMMENT,IRESP)
     PGXTHFRC(:,JT)=Z1D(:)
 !
     YRECFM='GYTHFRC'//YFRC
     YDIR='--'
-    CALL FMREAD(HINIFILE,YRECFM,HLUOUT,YDIR,Z1D,IGRID,ILENCH,YCOMMENT,IRESP)
+    CALL FMREAD(TPINIFILE%CNAME,YRECFM,HLUOUT,YDIR,Z1D,IGRID,ILENCH,YCOMMENT,IRESP)
     PGYTHFRC(:,JT)=Z1D(:)
 !
     YRECFM='PGROUNDFRC'//YFRC
     YDIR='--'
-    CALL FMREAD(HINIFILE,YRECFM,HLUOUT,YDIR,PPGROUNDFRC(JT),IGRID,ILENCH,YCOMMENT,IRESP)
+    CALL FMREAD(TPINIFILE%CNAME,YRECFM,HLUOUT,YDIR,PPGROUNDFRC(JT),IGRID,ILENCH,YCOMMENT,IRESP)
 !
   END DO
 END IF
@@ -1247,24 +1202,24 @@ IF (L2D_ADV_FRC) THEN
     WRITE (YFRC,'(I3.3)') JT
     YRECFM='DTADV'//YFRC//'%TDATE' ! array of rank 3 for date
     YDIR='--'
-    CALL FMREAD(HINIFILE,YRECFM,HLUOUT,YDIR,ITDATE,IGRID,ILENCH,YCOMMENT,IRESP)
+    CALL FMREAD(TPINIFILE%CNAME,YRECFM,HLUOUT,YDIR,ITDATE,IGRID,ILENCH,YCOMMENT,IRESP)
     TPDTADVFRC(JT)%TDATE%YEAR  = ITDATE(1)
     TPDTADVFRC(JT)%TDATE%MONTH = ITDATE(2)
     TPDTADVFRC(JT)%TDATE%DAY   = ITDATE(3)
     !
     YRECFM='DTADV'//YFRC//'%TIME'
     YDIR='--'
-    CALL FMREAD(HINIFILE,YRECFM,HLUOUT,YDIR,TPDTADVFRC(JT)%TIME,IGRID,ILENCH, &
+    CALL FMREAD(TPINIFILE%CNAME,YRECFM,HLUOUT,YDIR,TPDTADVFRC(JT)%TIME,IGRID,ILENCH, &
 	    YCOMMENT,IRESP)
     YRECFM='TH_ADV'//YFRC
     YDIR='--'
-    CALL FMREAD(HINIFILE,YRECFM,HLUOUT,YDIR,XDTH3D,IGRID,ILENCH,  &
+    CALL FMREAD(TPINIFILE%CNAME,YRECFM,HLUOUT,YDIR,XDTH3D,IGRID,ILENCH,  &
                                                          YCOMMENT,IRESP)
     PDTHFRC(:,:,:,JT)=XDTH3D(:,:,:)
     !
     YRECFM='Q_ADV'//YFRC
     YDIR='--'
-    CALL FMREAD(HINIFILE,YRECFM,HLUOUT,YDIR,XDRV3D,IGRID,ILENCH,  &
+    CALL FMREAD(TPINIFILE%CNAME,YRECFM,HLUOUT,YDIR,XDRV3D,IGRID,ILENCH,  &
                                                          YCOMMENT,IRESP)
     
     PDRVFRC(:,:,:,JT)=XDRV3D(:,:,:)
@@ -1278,7 +1233,7 @@ IF (L2D_REL_FRC) THEN
     WRITE (YFRC,'(I3.3)') JT
     YRECFM='DTREL'//YFRC//'%TDATE' ! array of rank 3 for date
     YDIR='--'
-    CALL FMREAD(HINIFILE,YRECFM,HLUOUT,YDIR,ITDATE,IGRID,ILENCH,YCOMMENT,IRESP)
+    CALL FMREAD(TPINIFILE%CNAME,YRECFM,HLUOUT,YDIR,ITDATE,IGRID,ILENCH,YCOMMENT,IRESP)
     TPDTRELFRC(JT)%TDATE%YEAR  = ITDATE(1)
     TPDTRELFRC(JT)%TDATE%MONTH = ITDATE(2)
     TPDTRELFRC(JT)%TDATE%DAY   = ITDATE(3)
@@ -1287,14 +1242,14 @@ IF (L2D_REL_FRC) THEN
 
     YRECFM='TH_REL'//YFRC
     YDIR='--'
-    CALL FMREAD(HINIFILE,YRECFM,HLUOUT,YDIR,XDTH3D,IGRID,ILENCH,  &
+    CALL FMREAD(TPINIFILE%CNAME,YRECFM,HLUOUT,YDIR,XDTH3D,IGRID,ILENCH,  &
                                                          YCOMMENT,IRESP)
     
     PTHREL(:,:,:,JT)=XDTH3D(:,:,:)
     !
     YRECFM='Q_REL'//YFRC
     YDIR='--'
-    CALL FMREAD(HINIFILE,YRECFM,HLUOUT,YDIR,XDRV3D,IGRID,ILENCH,  &
+    CALL FMREAD(TPINIFILE%CNAME,YRECFM,HLUOUT,YDIR,XDRV3D,IGRID,ILENCH,  &
                                                          YCOMMENT,IRESP)
 
     PRVREL(:,:,:,JT)=XDRV3D(:,:,:)
@@ -1308,7 +1263,7 @@ IF (LUV_FLX) THEN
    IF ( CCONF /= 'START' .OR. CPROGRAM=='SPAWN ' ) THEN 
        YRECFM='VU_FLX'
        YDIR='--'
-       CALL FMREAD(HINIFILE,YRECFM,HLUOUT,YDIR,PVU_FLUX_M,IGRID, &
+       CALL FMREAD(TPINIFILE%CNAME,YRECFM,HLUOUT,YDIR,PVU_FLUX_M,IGRID, &
                    ILENCH,YCOMMENT,IRESP)
    ELSE IF (CCONF == 'START') THEN
        PVU_FLUX_M(:,:,:)=0.
@@ -1319,11 +1274,11 @@ IF (LTH_FLX) THEN
    IF ( CCONF /= 'START' .OR. CPROGRAM=='SPAWN ' ) THEN 
        YRECFM='VT_FLX'
        YDIR='--'
-       CALL FMREAD(HINIFILE,YRECFM,HLUOUT,YDIR,PVTH_FLUX_M,IGRID, &
+       CALL FMREAD(TPINIFILE%CNAME,YRECFM,HLUOUT,YDIR,PVTH_FLUX_M,IGRID, &
                    ILENCH,YCOMMENT,IRESP)
        YRECFM='WT_FLX'
        YDIR='--'
-       CALL FMREAD(HINIFILE,YRECFM,HLUOUT,YDIR,PWTH_FLUX_M,IGRID, &
+       CALL FMREAD(TPINIFILE%CNAME,YRECFM,HLUOUT,YDIR,PWTH_FLUX_M,IGRID, &
                    ILENCH,YCOMMENT,IRESP)       
    ELSE IF (CCONF == 'START') THEN
        PWTH_FLUX_M(:,:,:)=0.
diff --git a/src/MNH/spawn_model2.f90 b/src/MNH/spawn_model2.f90
index c2607e6b5..86c9c24bb 100644
--- a/src/MNH/spawn_model2.f90
+++ b/src/MNH/spawn_model2.f90
@@ -259,6 +259,7 @@ USE MODI_UPDATE_METRICS
 USE MODE_FM
 USE MODE_FMWRIT, ONLY : IO_WRITE_HEADER
 USE MODE_IO_ll
+USE MODE_IO_MANAGE_STRUCT, ONLY : IO_FILE_ADD2LIST
 USE MODE_MODELN_HANDLER
 USE MODE_FMREAD
 USE MODE_MPPDB
@@ -315,7 +316,6 @@ INTEGER :: IRESP    ! Return codes in FM routines
 INTEGER :: ILUOUT   ! Logical unit number for the output listing 
 INTEGER :: INPRAR   ! Number of articles predicted in the LFIFM file
 INTEGER :: ININAR   ! Number of articles present in the LFIFM file
-INTEGER :: ITYPE    ! Type of file (cpio or not)
 INTEGER             :: IGRID,ILENCH   !   File management
 CHARACTER (LEN=100) :: YCOMMENT       ! variables
 !
@@ -390,7 +390,7 @@ INTEGER,DIMENSION(:,:),ALLOCATABLE   :: IJCOUNT
 !
 REAL                :: ZZS_MAX, ZZS_MAX_ll
 !
-TYPE(TFILEDATA),TARGET :: TZFILE
+TYPE(TFILEDATA),POINTER :: TZFILE
 !-------------------------------------------------------------------------------
 !
 ! Save model index and switch to model 2 variables
@@ -431,6 +431,7 @@ ZTIME1 = ZSTART
 CALL DEALLOCATE_MODEL1(1)
 CALL DEALLOCATE_MODEL1(2)
 !
+TZFILE => NULL()
 !-------------------------------------------------------------------------------
 !
 !
@@ -1443,8 +1444,6 @@ INPRAR = 22 + 2*(4+NRR+NSV) ! 22 = number of grid variables + reference state
                             ! variables +dimension variables
                             ! 2*(4+NRR+NSV) = number of prognostic variables
                             ! at time t and t-dt
-ITYPE=1
-!
 IF ( ( LEN_TRIM(HSPAFILE) /= 0 ) .AND. ( ADJUSTL(HSPAFILE) /= ADJUSTL(CINIFILE) ) ) THEN
   CMY_NAME(2)=HSPAFILE
 ELSE
@@ -1453,24 +1452,7 @@ ELSE
      CMY_NAME(2)=ADJUSTL(ADJUSTR(CINIFILE)//'.spr'//ADJUSTL(HSPANBR))
 END IF
 !
-TZFILE%CNAME      = CMY_NAME(2)
-TZFILE%CTYPE      = 'SPAWNING'
-IF (LIOCDF4) THEN
-  IF (.NOT.LLFIOUT) THEN
-    TZFILE%CFORMAT='NETCDF4'
-  ELSE
-    TZFILE%CFORMAT='LFICDF4'
-    TZFILE%NLFINPRAR= INPRAR
-  END IF
-ELSE IF (LLFIOUT) THEN
-  TZFILE%CFORMAT='LFI'
-  TZFILE%NLFINPRAR= INPRAR
-ELSE
-  CALL PRINT_MSG(NVERB_FATAL,'IO','SPAWN_MODEL2','unknown backup/output fileformat')
-ENDIF
-TZFILE%CMODE      = 'WRITE'
-TZFILE%NLFITYPE   = ITYPE
-TZFILE%NLFIVERB   = NVERB
+CALL IO_FILE_ADD2LIST(TZFILE,CMY_NAME(2),'SPAWNING','WRITE',KLFINPRAR=INPRAR,KLFITYPE=1,KLFIVERB=NVERB)
 !
 CALL IO_FILE_OPEN_ll(TZFILE,CLUOUT,IRESP)
 !
diff --git a/src/MNH/zoom_pgd.f90 b/src/MNH/zoom_pgd.f90
index a288452c6..0a4335a41 100644
--- a/src/MNH/zoom_pgd.f90
+++ b/src/MNH/zoom_pgd.f90
@@ -64,6 +64,7 @@ USE MODE_FM
 USE MODE_FMWRIT
 USE MODE_FMREAD
 USE MODE_IO_ll
+USE MODE_IO_MANAGE_STRUCT, ONLY : IO_FILE_ADD2LIST
 USE MODE_ll
 USE MODE_MSG
 USE MODE_MODELN_HANDLER
@@ -108,13 +109,15 @@ LOGICAL :: GFOUND
 INTEGER            :: IXOR_DAD,IYOR_DAD  ! compared to Dad file, if any
 INTEGER            :: IXOR,IYOR          ! given or computed
 INTEGER            :: IDXRATIO,IDYRATIO
-TYPE(TFILEDATA)    :: TZZOOMFILE
+TYPE(TFILEDATA),POINTER :: TZZOOMFILE
 !
 REAL,  DIMENSION(:,:), ALLOCATABLE :: ZZS1,ZZSMT1,ZZS2,ZZSMT2
 !
 NAMELIST/NAM_PGDFILE/CPGDFILE,YZOOMFILE,YZOOMNBR
 !------------------------------------------------------------------------------
 !
+TZZOOMFILE => NULL()
+!
 CALL GOTO_MODEL(1)
 CALL VERSION
 CPROGRAM='ZOOMPG'
@@ -201,24 +204,7 @@ IF ( (LEN_TRIM(YZOOMFILE) == 0) .OR. (ADJUSTL(YZOOMFILE) == ADJUSTL(CPGDFILE)) )
   YZOOMFILE=ADJUSTL(ADJUSTR(CPGDFILE)//'.z'//ADJUSTL(YZOOMNBR))
 END IF
 !
-TZZOOMFILE%CNAME      = YZOOMFILE
-TZZOOMFILE%CTYPE      = 'ZOOMPGD'
-IF (LIOCDF4) THEN
-  IF (.NOT.LLFIOUT) THEN
-    TZZOOMFILE%CFORMAT='NETCDF4'
-  ELSE
-    TZZOOMFILE%CFORMAT='LFICDF4'
-    TZZOOMFILE%NLFINPRAR= 1
-  END IF
-ELSE IF (LLFIOUT) THEN
-  TZZOOMFILE%CFORMAT='LFI'
-  TZZOOMFILE%NLFINPRAR= 1
-ELSE
-  CALL PRINT_MSG(NVERB_FATAL,'IO','ZOOM_PGD','unknown backup/output fileformat')
-ENDIF
-TZZOOMFILE%CMODE      = 'WRITE'
-TZZOOMFILE%NLFITYPE   = 1
-TZZOOMFILE%NLFIVERB   = 5
+CALL IO_FILE_ADD2LIST(TZZOOMFILE,TRIM(YZOOMFILE),'ZOOMPGD','WRITE',KLFINPRAR=1,KLFITYPE=1,KLFIVERB=5)
 !PW: TODO: points to dad file (if existing) ! TZZOOMFILE%TDADFILE =>
 !
 CALL IO_FILE_OPEN_ll(TZZOOMFILE,CLUOUT0,IRESP)
-- 
GitLab