From 2ef392a7be2970e65dc14b228d6a328a70bd89c4 Mon Sep 17 00:00:00 2001
From: Philippe WAUTELET <philippe.wautelet@aero.obs-mip.fr>
Date: Fri, 30 Jun 2017 15:44:47 +0200
Subject: [PATCH] Philippe 30/06/2017: IO: * added IO_READ_FIELD_BYNAME_X1 and
 IO_READ_FIELD_BYFIELD_X1 subroutines   to IO_READ_FIELD procedure * added
 IO_READ_FIELD_LFI_X1 subroutine to IO_READ_FIELD_LFI procedure * added
 IO_READ_FIELD_NC4_X1 subroutine to IO_READ_FIELD_NC4 procedure * bug
 corrections in IO_READ_CHECK_FIELD_ATTR_NC4 * use IO_READ_FIELD in
 INI_MODEL_n

---
 src/LIB/SURCOUCHE/src/fmread_ll.f90   | 123 +++++++++++++++++++++++++-
 src/LIB/SURCOUCHE/src/fmreadwrit.f90  |  41 ++++++++-
 src/LIB/SURCOUCHE/src/mode_netcdf.f90 |  77 ++++++++++++++--
 src/MNH/ini_modeln.f90                |  91 +++++++++----------
 src/MNH/init_mnh.f90                  |   2 +-
 5 files changed, 273 insertions(+), 61 deletions(-)

diff --git a/src/LIB/SURCOUCHE/src/fmread_ll.f90 b/src/LIB/SURCOUCHE/src/fmread_ll.f90
index f0d01558e..39546557b 100644
--- a/src/LIB/SURCOUCHE/src/fmread_ll.f90
+++ b/src/LIB/SURCOUCHE/src/fmread_ll.f90
@@ -41,13 +41,15 @@ IMPLICIT NONE
 PRIVATE
 
 INTERFACE IO_READ_FIELD
-   MODULE PROCEDURE IO_READ_FIELD_BYNAME_N0,  &
+   MODULE PROCEDURE IO_READ_FIELD_BYNAME_X1,  &
+                    IO_READ_FIELD_BYNAME_N0,  &
                     IO_READ_FIELD_BYNAME_L0,  &
                     IO_READ_FIELD_BYNAME_C0,  &
+                    IO_READ_FIELD_BYFIELD_X1, &
                     IO_READ_FIELD_BYFIELD_N0, &
                     IO_READ_FIELD_BYFIELD_L0, &
                     IO_READ_FIELD_BYFIELD_C0
-!                       IO_READ_FIELD_BYNAME_X0, IO_READ_FIELD_BYNAME_X1,  &
+!                       IO_READ_FIELD_BYNAME_X0, &
 !                       IO_READ_FIELD_BYNAME_X2, IO_READ_FIELD_BYNAME_X3,  &
 !                       IO_READ_FIELD_BYNAME_X4, IO_READ_FIELD_BYNAME_X5,  &
 !                       IO_READ_FIELD_BYNAME_X6,                            &
@@ -56,7 +58,7 @@ INTERFACE IO_READ_FIELD
 !                       IO_READ_FIELD_BYNAME_L1,  &
 !                       IO_READ_FIELD_BYNAME_C1,  &
 !                       IO_READ_FIELD_BYNAME_T0,                            &
-!                       IO_READ_FIELD_BYFIELD_X0,IO_READ_FIELD_BYFIELD_X1, &
+!                       IO_READ_FIELD_BYFIELD_X0, &
 !                       IO_READ_FIELD_BYFIELD_X2,IO_READ_FIELD_BYFIELD_X3, &
 !                       IO_READ_FIELD_BYFIELD_X4,IO_READ_FIELD_BYFIELD_X5, &
 !                       IO_READ_FIELD_BYFIELD_X6,                           &
@@ -334,6 +336,121 @@ RETURN
 !------------------------------------------------------------------
 END SUBROUTINE FMREADX1_ll
 
+SUBROUTINE IO_READ_FIELD_BYNAME_X1(TPFILE,HNAME,PFIELD,KRESP,KIMAX_ll,KJMAX_ll,TPSPLITTING)
+!
+USE MODD_IO_ll,        ONLY : ISNPROC
+USE MODD_STRUCTURE_ll, ONLY : ZONE_ll
+!
+TYPE(TFILEDATA),  INTENT(IN)    :: TPFILE
+CHARACTER(LEN=*), INTENT(IN)    :: HNAME    ! name of the field to write
+REAL,DIMENSION(:),INTENT(INOUT) :: PFIELD   ! array containing the data field
+INTEGER,OPTIONAL, INTENT(OUT)   :: KRESP    ! return-code
+INTEGER,OPTIONAL, INTENT(IN)    :: KIMAX_ll
+INTEGER,OPTIONAL, INTENT(IN)    :: KJMAX_ll
+TYPE(ZONE_ll),DIMENSION(ISNPROC),OPTIONAL,INTENT(IN) :: TPSPLITTING  ! splitting of the domain
+!
+INTEGER :: ID ! Index of the field
+INTEGER :: IRESP ! return_code
+!
+CALL PRINT_MSG(NVERB_DEBUG,'IO','IO_READ_FIELD_BYNAME_X1',TRIM(TPFILE%CNAME)//': reading '//TRIM(HNAME))
+!
+CALL FIND_FIELD_ID_FROM_MNHNAME(HNAME,ID,IRESP)
+!
+IF(IRESP==0) CALL IO_READ_FIELD(TPFILE,TFIELDLIST(ID),PFIELD,IRESP,KIMAX_ll,KJMAX_ll,TPSPLITTING)
+!
+IF (PRESENT(KRESP)) KRESP = IRESP
+!
+END SUBROUTINE IO_READ_FIELD_BYNAME_X1
+
+SUBROUTINE IO_READ_FIELD_BYFIELD_X1(TPFILE,TPFIELD,PFIELD,KRESP,KIMAX_ll,KJMAX_ll,TPSPLITTING)
+!
+USE MODD_IO_ll,        ONLY : ISP,GSMONOPROC,ISNPROC
+USE MODD_STRUCTURE_ll, ONLY : ZONE_ll
+!
+USE MODE_SCATTER_ll
+USE MODE_ALLOCBUFFER_ll
+USE MODE_FD_ll, ONLY : GETFD,FD_LL
+!
+TYPE(TFILEDATA),  INTENT(IN)    :: TPFILE
+TYPE(TFIELDDATA), INTENT(INOUT) :: TPFIELD
+REAL,DIMENSION(:),INTENT(INOUT) :: PFIELD   ! array containing the data field
+INTEGER,OPTIONAL, INTENT(OUT)   :: KRESP    ! return-code
+INTEGER,OPTIONAL, INTENT(IN)    :: KIMAX_ll
+INTEGER,OPTIONAL, INTENT(IN)    :: KJMAX_ll
+TYPE(ZONE_ll),DIMENSION(ISNPROC),OPTIONAL,INTENT(IN) :: TPSPLITTING  ! splitting of the domain
+!
+INTEGER                      :: IERR
+TYPE(FD_ll), POINTER         :: TZFD
+REAL,DIMENSION(:),POINTER    :: ZFIELDP
+LOGICAL                      :: GALLOC
+INTEGER                      :: IRESP
+!
+CALL PRINT_MSG(NVERB_DEBUG,'IO','IO_READ_FIELD_BYFIELD_X1',TRIM(TPFILE%CNAME)//': reading '//TRIM(TPFIELD%CMNHNAME))
+!
+GALLOC = .FALSE.
+IRESP = 0
+!
+TZFD=>GETFD(TRIM(ADJUSTL(TPFILE%CNAME))//'.lfi')
+IF (ASSOCIATED(TZFD)) THEN
+  IF (GSMONOPROC) THEN ! sequential execution
+      IF (TPFILE%CFORMAT=='NETCDF4') THEN
+         CALL IO_READ_FIELD_NC4(TPFILE,TPFIELD,PFIELD,IRESP)
+      ELSE IF (TPFILE%CFORMAT=='LFI') THEN
+         CALL IO_READ_FIELD_LFI(TPFILE,TPFIELD,PFIELD,IRESP)
+      ELSE
+         CALL PRINT_MSG(NVERB_FATAL,'IO','IO_READ_FIELD_BYFIELD_X1',&
+                        TRIM(TPFILE%CNAME)//': invalid fileformat ('//TRIM(TPFILE%CFORMAT)//')')
+      END IF
+  ELSE
+    IF (ISP == TZFD%OWNER)  THEN
+      IF( PRESENT(KIMAX_ll) .AND. PRESENT(KJMAX_ll) ) THEN
+        CALL ALLOCBUFFER_ll(ZFIELDP,PFIELD,TPFIELD%CDIR,GALLOC, KIMAX_ll, KJMAX_ll)
+      ELSE
+        CALL ALLOCBUFFER_ll(ZFIELDP,PFIELD,TPFIELD%CDIR,GALLOC)
+      ENDIF
+      IF (TPFILE%CFORMAT=='NETCDF4') THEN
+         CALL IO_READ_FIELD_NC4(TPFILE,TPFIELD,ZFIELDP,IRESP)
+      ELSE IF (TPFILE%CFORMAT=='LFI') THEN
+         CALL IO_READ_FIELD_LFI(TPFILE,TPFIELD,ZFIELDP,IRESP)
+      ELSE
+         CALL PRINT_MSG(NVERB_FATAL,'IO','IO_READ_FIELD_BYFIELD_X1',&
+                        TRIM(TPFILE%CNAME)//': invalid fileformat ('//TRIM(TPFILE%CFORMAT)//')')
+      END IF
+    ELSE
+      ALLOCATE(ZFIELDP(0))
+      GALLOC = .TRUE.
+    END IF
+    !
+    CALL MPI_BCAST(IRESP,1,MPI_INTEGER,TZFD%OWNER-1,TZFD%COMM,IERR)
+    !
+    !Broadcast header only if IRESP==-111
+    !because metadata of field has been modified in IO_READ_FIELD_xxx
+    IF (IRESP==-111) CALL IO_BCAST_FIELD_METADATA(TZFD,TPFIELD)
+    !
+    IF (TPFIELD%CDIR /= 'XX' .AND. TPFIELD%CDIR /='YY') THEN
+      ! Broadcast Field
+      CALL MPI_BCAST(PFIELD,SIZE(PFIELD),MPI_FLOAT,TZFD%OWNER-1,TZFD%COMM,IERR)
+    ELSE
+      !Scatter Field
+      IF( PRESENT(TPSPLITTING) ) THEN
+        CALL SCATTER_XXFIELD(TPFIELD%CDIR,ZFIELDP,PFIELD,TZFD%OWNER,TZFD%COMM,TPSPLITTING)
+      ELSE
+        CALL SCATTER_XXFIELD(TPFIELD%CDIR,ZFIELDP,PFIELD,TZFD%OWNER,TZFD%COMM)
+      ENDIF
+    END IF
+  END IF
+ELSE
+  IRESP = -61
+  CALL PRINT_MSG(NVERB_ERROR,'IO','IO_READ_FIELD_BYFIELD_X1','file '//TRIM(TPFILE%CNAME)//' not found')
+END IF
+!
+IF (GALLOC) DEALLOCATE (ZFIELDP)
+!
+IF (PRESENT(KRESP)) KRESP = IRESP
+!
+END SUBROUTINE IO_READ_FIELD_BYFIELD_X1
+
+
 SUBROUTINE FMREADX2_ll(HFILEM,HRECFM,HFIPRI,HDIR,PFIELD,KGRID,&
      KLENCH,HCOMMENT,KRESP, KIMAX_ll, KJMAX_ll, TPSPLITTING)
 USE MODD_IO_ll, ONLY : ISP,GSMONOPROC,LPACK,L1D,L2D , ISNPROC
diff --git a/src/LIB/SURCOUCHE/src/fmreadwrit.f90 b/src/LIB/SURCOUCHE/src/fmreadwrit.f90
index 44d49aee6..e51eb98c9 100644
--- a/src/LIB/SURCOUCHE/src/fmreadwrit.f90
+++ b/src/LIB/SURCOUCHE/src/fmreadwrit.f90
@@ -272,10 +272,11 @@ IMPLICIT NONE
 PRIVATE
 !
 INTERFACE IO_READ_FIELD_LFI
-   MODULE PROCEDURE IO_READ_FIELD_LFI_N0, &
+   MODULE PROCEDURE IO_READ_FIELD_LFI_X1, &
+                    IO_READ_FIELD_LFI_N0, &
                     IO_READ_FIELD_LFI_L0, &
                     IO_READ_FIELD_LFI_C0
-!                     IO_READ_FIELD_LFI_X0,IO_READ_FIELD_LFI_X1, &
+!                     IO_READ_FIELD_LFI_X0, &
 !                     IO_READ_FIELD_LFI_X2,IO_READ_FIELD_LFI_X3, &
 !                     IO_READ_FIELD_LFI_X4,IO_READ_FIELD_LFI_X5, &
 !                     IO_READ_FIELD_LFI_X6,                       &
@@ -301,6 +302,42 @@ PUBLIC IO_READ_FIELD_LFI,IO_WRITE_FIELD_LFI
 !
 CONTAINS
 !
+SUBROUTINE IO_READ_FIELD_LFI_X1(TPFILE,TPFIELD,PFIELD,KRESP)
+USE MODD_FM
+USE MODD_CONFZ, ONLY : NZ_VERB
+USE MODE_MSG
+!
+IMPLICIT NONE
+!
+!*      0.1   Declarations of arguments
+!
+TYPE(TFILEDATA),  INTENT(IN)    :: TPFILE
+TYPE(TFIELDDATA), INTENT(INOUT) :: TPFIELD
+REAL,DIMENSION(:),INTENT(OUT)   :: PFIELD  ! array containing the data field
+INTEGER,          INTENT(OUT)   :: KRESP   ! return-code if problems occured
+!
+!*      0.2   Declarations of local variables
+!
+INTEGER(KIND=LFI_INT)                    :: IRESP,ITOTAL
+INTEGER                                  :: ILENG
+INTEGER(KIND=8),DIMENSION(:),ALLOCATABLE :: IWORK
+LOGICAL                                  :: GGOOD
+!
+CALL PRINT_MSG(NVERB_DEBUG,'IO','IO_READ_FIELD_LFI_X1',TRIM(TPFILE%CNAME)//': reading '//TRIM(TPFIELD%CMNHNAME))
+!
+ILENG = SIZE(PFIELD)
+!
+CALL IO_READ_CHECK_FIELD_LFI(TPFILE,TPFIELD,ILENG,IWORK,ITOTAL,IRESP,GGOOD)
+!
+IF (GGOOD) CALL TRANSFR(PFIELD,IWORK(IWORK(2)+3),ILENG)
+!
+KRESP=IRESP
+!
+IF (ALLOCATED(IWORK)) DEALLOCATE(IWORK)
+!
+END SUBROUTINE IO_READ_FIELD_LFI_X1
+!
+!
 SUBROUTINE IO_READ_FIELD_LFI_N0(TPFILE,TPFIELD,KFIELD,KRESP)
 USE MODD_FM
 USE MODD_CONFZ, ONLY : NZ_VERB
diff --git a/src/LIB/SURCOUCHE/src/mode_netcdf.f90 b/src/LIB/SURCOUCHE/src/mode_netcdf.f90
index c0c3fbbc0..cf0b1e65c 100644
--- a/src/LIB/SURCOUCHE/src/mode_netcdf.f90
+++ b/src/LIB/SURCOUCHE/src/mode_netcdf.f90
@@ -35,10 +35,11 @@ INTERFACE IO_WRITE_FIELD_NC4
 END INTERFACE IO_WRITE_FIELD_NC4
 
 INTERFACE IO_READ_FIELD_NC4
-   MODULE PROCEDURE IO_READ_FIELD_NC4_N0, &
+   MODULE PROCEDURE IO_READ_FIELD_NC4_X1, &
+                    IO_READ_FIELD_NC4_N0, &
                     IO_READ_FIELD_NC4_L0, &
                     IO_READ_FIELD_NC4_C0
-!                     IO_READ_FIELD_NC4_X0,IO_READ_FIELD_NC4_X1, &
+!                     IO_READ_FIELD_NC4_X0, &
 !                     IO_READ_FIELD_NC4_X2,IO_READ_FIELD_NC4_X3, &
 !                     IO_READ_FIELD_NC4_X4,IO_READ_FIELD_NC4_X5, &
 !                     IO_READ_FIELD_NC4_X6,                      &
@@ -2192,10 +2193,10 @@ END IF
 !
 ! UNITS
 !
-STATUS = NF90_INQUIRE_ATTRIBUTE(KNCID, KVARID, 'UNITS', LEN=ILEN)
+STATUS = NF90_INQUIRE_ATTRIBUTE(KNCID, KVARID, 'units', LEN=ILEN)
 IF (STATUS == NF90_NOERR) THEN
   ALLOCATE(CHARACTER(LEN=ILEN) :: YVALUE)
-  STATUS = NF90_GET_ATT(KNCID, KVARID, 'UNITS', YVALUE)
+  STATUS = NF90_GET_ATT(KNCID, KVARID, 'units', YVALUE)
   IF (TRIM(YVALUE)/=TRIM(TPFIELD%CUNITS)) THEN
     CALL PRINT_MSG(NVERB_WARNING,'IO','IO_READ_CHECK_FIELD_ATTR_NC4','expected UNITS ('//TRIM(TPFIELD%CUNITS)// &
                    ') is different than found ('//TRIM(YVALUE)//')in file for field '//TRIM(TPFIELD%CMNHNAME))
@@ -2219,10 +2220,10 @@ END IF
 ! CALENDAR
 !
 IF(PRESENT(HCALENDAR)) THEN
-STATUS = NF90_INQUIRE_ATTRIBUTE(KNCID, KVARID, 'CALENDAR', LEN=ILEN)
+STATUS = NF90_INQUIRE_ATTRIBUTE(KNCID, KVARID, 'calendar', LEN=ILEN)
 IF (STATUS == NF90_NOERR) THEN
   ALLOCATE(CHARACTER(LEN=ILEN) :: YVALUE)
-  STATUS = NF90_GET_ATT(KNCID, KVARID, 'CALENDAR', YVALUE)
+  STATUS = NF90_GET_ATT(KNCID, KVARID, 'calendar', YVALUE)
   IF (TRIM(YVALUE)/=TRIM(HCALENDAR)) THEN
     CALL PRINT_MSG(NVERB_WARNING,'IO','IO_READ_CHECK_FIELD_ATTR_NC4','expected CALENDAR ('//TRIM(HCALENDAR)// &
                    ') is different than found ('//TRIM(YVALUE)//')in file for field '//TRIM(TPFIELD%CMNHNAME))
@@ -2357,6 +2358,70 @@ KRESP = IRESP
 
 END SUBROUTINE NCREADX1
 
+SUBROUTINE IO_READ_FIELD_NC4_X1(TPFILE, TPFIELD, PFIELD, KRESP)
+USE MODD_FM, ONLY : FMHEADER, JPXKRK
+TYPE(TFILEDATA),  INTENT(IN)    :: TPFILE
+TYPE(TFIELDDATA), INTENT(INOUT) :: TPFIELD
+REAL,DIMENSION(:),INTENT(OUT)   :: PFIELD
+INTEGER,          INTENT(OUT)   :: KRESP  ! return-code
+
+INTEGER(KIND=IDCDF_KIND) :: STATUS
+INTEGER(KIND=IDCDF_KIND) :: INCID
+INTEGER(KIND=IDCDF_KIND) :: IVARID
+INTEGER(KIND=IDCDF_KIND) :: ITYPE   ! variable type
+INTEGER(KIND=IDCDF_KIND) :: IDIMS   ! number of dimensions
+INTEGER(KIND=IDCDF_KIND),DIMENSION(1) :: IVDIMS
+CHARACTER(LEN=30)        :: YVARNAME
+INTEGER                  :: IDIMLEN
+INTEGER                  :: IRESP
+
+CALL PRINT_MSG(NVERB_DEBUG,'IO','IO_READ_FIELD_NC4_X1',TRIM(TPFILE%CNAME)//': reading '//TRIM(TPFIELD%CMNHNAME))
+
+IRESP = 0
+! Get the Netcdf file ID
+INCID = TPFILE%NNCID
+
+CALL CLEANMNHNAME(TPFIELD%CMNHNAME,YVARNAME)
+
+! Get variable ID, NDIMS and TYPE
+STATUS = NF90_INQ_VARID(INCID, YVARNAME, IVARID)
+IF (STATUS /= NF90_NOERR) THEN
+  CALL HANDLE_ERR(status,__LINE__,'IO_READ_FIELD_NC4_X1[NF90_INQ_VARID] '//TRIM(YVARNAME),IRESP)
+  GOTO 1000
+END IF
+STATUS = NF90_INQUIRE_VARIABLE(INCID, IVARID, XTYPE=ITYPE, NDIMS=IDIMS, DIMIDS=IVDIMS)
+IF (STATUS /= NF90_NOERR) CALL HANDLE_ERR(STATUS,__LINE__,'IO_READ_FIELD_NC4_X1[NF90_INQUIRE_VARIABLE] '//TRIM(YVARNAME))
+
+IF (IDIMS == 1 .AND. ITYPE == NF90_DOUBLE) THEN
+  ! Check size of variable before reading
+  STATUS = NF90_INQUIRE_DIMENSION(INCID, IVDIMS(1), LEN=IDIMLEN)
+  IF (STATUS /= NF90_NOERR) CALL HANDLE_ERR(status,__LINE__,'IO_READ_FIELD_NC4_X1[NF90_INQUIRE_DIMENSION] '//TRIM(YVARNAME))
+
+  IF (IDIMLEN == SIZE(PFIELD)) THEN
+    ! Read variable
+    STATUS = NF90_GET_VAR(INCID, IVARID, PFIELD)
+    IF (STATUS /= NF90_NOERR) THEN
+      CALL HANDLE_ERR(status,__LINE__,'IO_READ_FIELD_NC4_X1[NF90_GET_VAR] '//TRIM(YVARNAME),IRESP)
+      GOTO 1000
+    END IF
+    ! Read and check attributes of variable
+    CALL IO_READ_CHECK_FIELD_ATTR_NC4(TPFIELD,INCID,IVARID,IRESP)
+  ELSE
+    CALL PRINT_MSG(NVERB_ERROR,'IO','IO_READ_FIELD_NC4_X1',TRIM(TPFILE%CNAME)//': '//TRIM(YVARNAME)// &
+                                                           ' not read (wrong size)')
+    IRESP = -3
+  END IF
+ELSE
+  CALL PRINT_MSG(NVERB_ERROR,'IO','IO_READ_FIELD_NC4_X1',TRIM(TPFILE%CNAME)//': '//TRIM(YVARNAME)// &
+                                                         ' not read (wrong number of dimensions or wrong type)')
+  IRESP = -3
+END IF
+
+1000 CONTINUE
+KRESP = IRESP
+
+END SUBROUTINE IO_READ_FIELD_NC4_X1
+
 SUBROUTINE NCREADX2(KNCID, HVARNAME, PFIELD, TPFMH, KRESP)
 USE MODD_FM, ONLY : FMHEADER, JPXKRK
 INTEGER(KIND=IDCDF_KIND),INTENT(IN) :: KNCID
diff --git a/src/MNH/ini_modeln.f90 b/src/MNH/ini_modeln.f90
index 5503b0981..3d5c33b50 100644
--- a/src/MNH/ini_modeln.f90
+++ b/src/MNH/ini_modeln.f90
@@ -10,12 +10,14 @@
 !
 INTERFACE
 !
-       SUBROUTINE INI_MODEL_n(KMI,HLUOUT,HINIFILE,HINIFILEPGD)
+       SUBROUTINE INI_MODEL_n(KMI,HLUOUT,TPINIFILE,HINIFILEPGD)
+!
+       USE MODD_IO_ll, ONLY : TFILEDATA
 !
        INTEGER, INTENT(IN)              :: KMI      ! Model index 
        CHARACTER (LEN=*), INTENT(IN)    :: HLUOUT   ! name for output-listing
        !  of nested models
-       CHARACTER (LEN=28), INTENT(IN)   :: HINIFILE ! name of
+       TYPE(TFILEDATA),    INTENT(IN)   :: TPINIFILE    !Initial file
        CHARACTER (LEN=28), INTENT(IN)   :: HINIFILEPGD
 !
 END SUBROUTINE INI_MODEL_n
@@ -24,7 +26,7 @@ END INTERFACE
 !
 END MODULE MODI_INI_MODEL_n
 !     ######################################################
-      SUBROUTINE INI_MODEL_n(KMI,HLUOUT,HINIFILE,HINIFILEPGD)
+      SUBROUTINE INI_MODEL_n(KMI,HLUOUT,TPINIFILE,HINIFILEPGD)
 !     ######################################################
 !
 !!****  *INI_MODEL_n* - routine to initialize the nested model _n
@@ -417,7 +419,7 @@ USE MODD_ADVFRC_n
 USE MODD_RELFRC_n
 USE MODD_2D_FRC
 USE MODD_IO_SURF_MNH, ONLY : IO_SURF_MNH_MODEL
-USE MODD_IO_ll,       ONLY : LIOCDF4,LLFIOUT
+USE MODD_IO_ll,       ONLY : LIOCDF4,LLFIOUT,TFILEDATA
 !
 USE MODD_CH_PRODLOSSTOT_n
 USE MODI_CH_INIT_PRODLOSSTOT_n
@@ -438,8 +440,7 @@ INTEGER, INTENT(IN)              :: KMI      ! Model Index
 
 CHARACTER (LEN=*), INTENT(IN)    :: HLUOUT   ! name for output-listing
                                              !  of nested models
-CHARACTER (LEN=28),  INTENT(IN)   :: HINIFILE ! name of
-                                             ! the initial file
+TYPE(TFILEDATA),    INTENT(IN)   :: TPINIFILE    !Initial file
 CHARACTER (LEN=28), INTENT(IN)   :: HINIFILEPGD       
 !
 !*       0.2   declarations of local variables
@@ -447,9 +448,9 @@ CHARACTER (LEN=28), INTENT(IN)   :: HINIFILEPGD
 INTEGER             :: JSV     ! Loop index
 INTEGER             :: IRESP   ! Return code of FM routines
 INTEGER             :: ININAR  ! File management variable
-INTEGER             :: IMASDEV ! version of MESOHN in the input file
+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
+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
@@ -539,10 +540,10 @@ NULLIFY(TZINITHALO3D_ll)
 !
 CALL FMLOOK_ll(HLUOUT,HLUOUT,ILUOUT,IRESP)
 CLUOUT = HLUOUT
-CINIFILE=HINIFILE
+CINIFILE=TPINIFILE%CNAME
 CINIFILEPGD=HINIFILEPGD
 !
-CALL FMREAD(HINIFILE,'MASDEV',HLUOUT,'--',IMASDEV,IGRID,ILENCH,YCOMMENT,IRESP)
+CALL IO_READ_FIELD(TPINIFILE,'MASDEV',IMASDEV)
 !-------------------------------------------------------------------------------
 !
 !*       2.   END OF READING
@@ -550,13 +551,11 @@ CALL FMREAD(HINIFILE,'MASDEV',HLUOUT,'--',IMASDEV,IGRID,ILENCH,YCOMMENT,IRESP)
 !*       2.1  Read number of forcing fields
 !
 IF (LFORCING) THEN ! Retrieve the number of time-dependent forcings.
-  YRECFM='FRC'
-  YDIR='--'
-  CALL FMREAD(HINIFILE,YRECFM,HLUOUT,YDIR,NFRC,IGRID,ILENCH,YCOMMENT,IRESP)
+  CALL IO_READ_FIELD(TPINIFILE,'FRC',NFRC,IRESP)
   IF ( (IRESP /= 0) .OR. (NFRC <=0) ) THEN
     WRITE(ILUOUT,'(A/A)') &
      "INI_MODEL_n ERROR: you want to read forcing variables from FMfile", &
-     "                   but no fields have been found by FMREAD"
+     "                   but no fields have been found by IO_READ_FIELD"
 !callabortstop
     CALL CLOSE_ll(CLUOUT,IOSTAT=IRESP)
     CALL ABORT
@@ -567,13 +566,11 @@ END IF
 ! Modif PP for time evolving adv forcing
   IF ( L2D_ADV_FRC ) THEN ! Retrieve the number of time-dependent forcings.
     WRITE(ILUOUT,FMT=*) "INI_MODEL_n ENTER ADV_FORCING"
-    YRECFM='NADVFRC1'
-    YDIR='--'
-    CALL FMREAD(HINIFILE,YRECFM,HLUOUT,YDIR,NADVFRC,IGRID,ILENCH,YCOMMENT,IRESP)
+    CALL IO_READ_FIELD(TPINIFILE,'NADVFRC1',NADVFRC,IRESP)
     IF ( (IRESP /= 0) .OR. (NADVFRC <=0) ) THEN
       WRITE(ILUOUT,'(A/A)') &
       "INI_MODELn ERROR: you want to read forcing ADV variables from FMfile", &
-      "                   but no fields have been found by FMREAD"
+      "                   but no fields have been found by IO_READ_FIELD"
     !callabortstop
     CALL CLOSE_ll(CLUOUT,IOSTAT=IRESP)
     CALL ABORT
@@ -584,13 +581,11 @@ END IF
 !
 IF ( L2D_REL_FRC ) THEN ! Retrieve the number of time-dependent forcings.
     WRITE(ILUOUT,FMT=*) "INI_MODEL_n ENTER REL_FORCING"
-    YRECFM='NRELFRC1'
-    YDIR='--'
-    CALL FMREAD(HINIFILE,YRECFM,HLUOUT,YDIR,NRELFRC,IGRID,ILENCH,YCOMMENT,IRESP)
+    CALL IO_READ_FIELD(TPINIFILE,'NRELFRC1',NRELFRC,IRESP)
     IF ( (IRESP /= 0) .OR. (NRELFRC <=0) ) THEN
       WRITE(ILUOUT,'(A/A)') &
       "INI_MODELn ERROR: you want to read forcing REL variables from FMfile", &
-      "                   but no fields have been found by FMREAD"
+      "                   but no fields have been found by IO_READ_FIELD"
     !callabortstop
     CALL CLOSE_ll(CLUOUT,IOSTAT=IRESP)
     CALL ABORT
@@ -602,10 +597,8 @@ END IF
 !
 IKU=NKMAX+2*JPVEXT
 !
-YRECFM = 'ZHAT'
 ALLOCATE(XZHAT(IKU))
- YDIR='--'
-CALL FMREAD(HINIFILE,YRECFM,HLUOUT,YDIR,XZHAT,IGRID,ILENCH,YCOMMENT,IRESP)
+CALL IO_READ_FIELD(TPINIFILE,'ZHAT',XZHAT)
 IF (XALZBOT>=XZHAT(IKU) .AND. LVE_RELAX) THEN
   WRITE(ILUOUT,FMT=*) "INI_MODEL_n ERROR: you want to use vertical relaxation"
   WRITE(ILUOUT,FMT=*) "                  but bottom of layer XALZBOT(",XALZBOT,")"
@@ -1580,7 +1573,7 @@ END IF
 !*       7.    INITIALIZE GRIDS AND METRIC COEFFICIENTS
 !              ----------------------------------------
 !
-CALL SET_GRID(KMI,HINIFILE,HLUOUT,IIU,IJU,IKU,NIMAX_ll,NJMAX_ll,         &
+CALL SET_GRID(KMI,TPINIFILE%CNAME,HLUOUT,IIU,IJU,IKU,NIMAX_ll,NJMAX_ll,  &
               XBMX1,XBMX2,XBMX3,XBMX4,XBMY1,XBMY2,XBMY3,XBMY4,           &
               XBFX1,XBFX2,XBFX3,XBFX4,XBFY1,XBFY2,XBFY3,XBFY4,           &
               NXOR_ALL(KMI),NYOR_ALL(KMI),NXEND_ALL(KMI),NYEND_ALL(KMI), &
@@ -1639,7 +1632,7 @@ IF (CCLOUD=='LIMA') CALL INIT_AEROSOL_PROPERTIES
 !              --------------------------------
 !
 CALL MPPDB_CHECK3D(XUT,"INI_MODEL_N-before read_field::XUT",PRECISION)
-CALL READ_FIELD(HINIFILE,HLUOUT,IMASDEV, IIU,IJU,IKU,XTSTEP,                  &
+CALL READ_FIELD(TPINIFILE%CNAME,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,   &
@@ -1670,10 +1663,10 @@ CALL READ_FIELD(HINIFILE,HLUOUT,IMASDEV, IIU,IJU,IKU,XTSTEP,                  &
 !              ---------------------------
 !
 !
-CALL SET_REF(KMI,HINIFILE,HLUOUT,                                &
-             XZZ,XZHAT,ZJ,XDXX,XDYY,CLBCX,CLBCY,                 &
-             XREFMASS,XMASS_O_PHI0,XLINMASS,                      &
-             XRHODREF,XTHVREF,XRVREF,XEXNREF,XRHODJ              )
+CALL SET_REF(KMI,TPINIFILE%CNAME,HLUOUT,            &
+             XZZ,XZHAT,ZJ,XDXX,XDYY,CLBCX,CLBCY,    &
+             XREFMASS,XMASS_O_PHI0,XLINMASS,        &
+             XRHODREF,XTHVREF,XRVREF,XEXNREF,XRHODJ )
 !
 !-------------------------------------------------------------------------------
 !
@@ -1906,7 +1899,7 @@ IF (CRAD   /= 'NONE') THEN
   ELSE
     GINIRAD  =.FALSE.
   END IF
-  CALL INI_RADIATIONS(HINIFILE,HLUOUT,GINIRAD,TDTCUR,TDTEXP,XZZ, &
+  CALL INI_RADIATIONS(TPINIFILE%CNAME,HLUOUT,GINIRAD,TDTCUR,TDTEXP,XZZ, &
                       XDXX, XDYY,                         &
                       XSINDEL,XCOSDEL,XTSIDER,XCORSOL,    &
                       XSLOPANG,XSLOPAZI,                  &
@@ -1963,7 +1956,7 @@ ALLOCATE(ZEMIS  (IIU,IJU))
 ALLOCATE(ZTSRAD (IIU,IJU))
 !
 IF (IMASDEV>=46) THEN
-  CALL FMREAD(HINIFILE,'SURF',HLUOUT,'--',CSURF,IGRID,ILENCH,YCOMMENT,IRESP)
+  CALL IO_READ_FIELD(TPINIFILE,'SURF',CSURF)
 ELSE
   CSURF = "EXTE"
 END IF
@@ -1983,7 +1976,7 @@ IF (CSURF=='EXTE' .AND. (CPROGRAM=='MESONH' .OR. CPROGRAM=='DIAG  ')) THEN
     ENDIF
   ELSE
   ! case after a spawning
-    CINIFILEPGD = HINIFILE
+    CINIFILEPGD = TPINIFILE%CNAME
   END IF
   !
   CALL GOTO_SURFEX(KMI)
@@ -2036,7 +2029,7 @@ DEALLOCATE(ZCO2)
 !* in a RESTART case, reads surface radiative quantities in the MESONH file
 !
 IF (CRAD   == 'ECMW' .AND. CGETRAD=='READ') THEN
-  CALL INI_SURF_RAD(HINIFILE, CLUOUT, XDIR_ALB, XSCA_ALB, XEMIS, XTSRAD)
+  CALL INI_SURF_RAD(TPINIFILE%CNAME, CLUOUT, XDIR_ALB, XSCA_ALB, XEMIS, XTSRAD)
 END IF
 !
 !
@@ -2067,10 +2060,10 @@ IF (CRAD   == 'ECMW') THEN
       ZBARE(:,:) = 0.
     END IF
 !
-    CALL INI_RADIATIONS_ECMWF (HINIFILE,HLUOUT,                                           &
-                               XZHAT,XPABST,XTHT,XTSRAD,XLAT,XLON,TDTCUR,TDTEXP,          &
-                               CLW,NDLON,NFLEV,NFLUX,NRAD,NSWB,CAER,NAER,NSTATM,          &
-                               XSTATM,ZSEA,ZTOWN,ZBARE,XOZON, XAER,XDST_WL, LSUBG_COND              )
+    CALL INI_RADIATIONS_ECMWF (TPINIFILE%CNAME,HLUOUT,                                 &
+                               XZHAT,XPABST,XTHT,XTSRAD,XLAT,XLON,TDTCUR,TDTEXP,       &
+                               CLW,NDLON,NFLEV,NFLUX,NRAD,NSWB,CAER,NAER,NSTATM,       &
+                               XSTATM,ZSEA,ZTOWN,ZBARE,XOZON, XAER,XDST_WL, LSUBG_COND )
 !
     DEALLOCATE(ZSEA,ZTOWN,ZBARE)
     ALLOCATE (XAER_CLIM(SIZE(XAER,1),SIZE(XAER,2),SIZE(XAER,3),SIZE(XAER,4)))
@@ -2100,14 +2093,14 @@ IF (CDCONV /= 'NONE' .OR. CSCONV == 'KAFR') THEN
   IF (NVERB>=10) THEN
     WRITE(ILUOUT,*) 'XDTCONV has been set to : ',XDTCONV
   END IF
-  CALL INI_DEEP_CONVECTION (HINIFILE,HLUOUT,GINIDCONV,TDTCUR,        &
-                           NCOUNTCONV,XDTHCONV,XDRVCONV,XDRCCONV,    &
-                           XDRICONV,XPRCONV,XPRSCONV,XPACCONV,       &
+  CALL INI_DEEP_CONVECTION (TPINIFILE%CNAME,HLUOUT,GINIDCONV,TDTCUR,         &
+                           NCOUNTCONV,XDTHCONV,XDRVCONV,XDRCCONV,            &
+                           XDRICONV,XPRCONV,XPRSCONV,XPACCONV,               &
                            XUMFCONV,XDMFCONV,XMFCONV,XPRLFLXCONV,XPRSFLXCONV,&
-                           XCAPE,NCLTOPCONV,NCLBASCONV,              &
-                           TDTDCONV, CGETSVCONV, XDSVCONV,           &
-                           LCH_CONV_LINOX, XIC_RATE, XCG_RATE,       &
-                           XIC_TOTAL_NUMBER, XCG_TOTAL_NUMBER        )
+                           XCAPE,NCLTOPCONV,NCLBASCONV,                      &
+                           TDTDCONV, CGETSVCONV, XDSVCONV,                   &
+                           LCH_CONV_LINOX, XIC_RATE, XCG_RATE,               &
+                           XIC_TOTAL_NUMBER, XCG_TOTAL_NUMBER                )
 
 END IF
 !
@@ -2162,9 +2155,9 @@ DEALLOCATE(XSPOWATM)
 !*      23.     BALLOON and AIRCRAFT initializations
 !              ------------------------------------
 !
-CALL INI_AIRCRAFT_BALLOON(HINIFILE,CLUOUT,XTSTEP, TDTSEG, XSEGLEN, NRR, NSV,  &
-                          IKU,CTURB=="TKEL" ,                                 &
-                          XLATORI, XLONORI                                    )
+CALL INI_AIRCRAFT_BALLOON(TPINIFILE%CNAME,CLUOUT,XTSTEP, TDTSEG, XSEGLEN, NRR, NSV,  &
+                          IKU,CTURB=="TKEL" ,                                        &
+                          XLATORI, XLONORI                                           )
 !
 !-------------------------------------------------------------------------------
 !
diff --git a/src/MNH/init_mnh.f90 b/src/MNH/init_mnh.f90
index 1e623dffe..f7219dbb2 100644
--- a/src/MNH/init_mnh.f90
+++ b/src/MNH/init_mnh.f90
@@ -237,7 +237,7 @@ 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)%CNAME,YINIFILEPGD(JMI))
+    CALL INI_MODEL_n(JMI,YLUOUT(JMI),TZINIFILE(JMI),YINIFILEPGD(JMI))
     !Call necessary to update the TFIELDLIST pointers to the data
     CALL FIELDLIST_GOTO_MODEL(JMI,JMI)
   ELSE
-- 
GitLab