From bab9c20496531ed05ad2bb6b7932381efa0d296b Mon Sep 17 00:00:00 2001
From: Philippe WAUTELET <philippe.wautelet@aero.obs-mip.fr>
Date: Tue, 4 Jul 2017 12:57:54 +0200
Subject: [PATCH] Philippe 30/06/2017: IO: * added
 IO_READ_FIELD_BYNAME_X0/X2/T0 and IO_READ_FIELD_BYFIELD_X0/X2/T0 subroutines 
  to IO_READ_FIELD procedure * added IO_READ_FIELD_LFI_X0/X2/T0 subroutines to
 IO_READ_FIELD_LFI procedure * added IO_READ_FIELD_NC4_X0/X2/T0 subroutines to
 IO_READ_FIELD_NC4 procedure * use IO_READ_FIELD in SET_GRID

---
 src/LIB/SURCOUCHE/src/fmread_ll.f90   | 378 ++++++++++++++++++++++++--
 src/LIB/SURCOUCHE/src/fmreadwrit.f90  | 151 +++++++++-
 src/LIB/SURCOUCHE/src/mode_netcdf.f90 | 237 +++++++++++++++-
 src/MNH/ini_modeln.f90                |   2 +-
 src/MNH/ini_spectren.f90              |  44 ++-
 src/MNH/init_mnh.f90                  |   2 +-
 src/MNH/set_grid.f90                  | 144 +++-------
 7 files changed, 785 insertions(+), 173 deletions(-)

diff --git a/src/LIB/SURCOUCHE/src/fmread_ll.f90 b/src/LIB/SURCOUCHE/src/fmread_ll.f90
index 39546557b..a258b67eb 100644
--- a/src/LIB/SURCOUCHE/src/fmread_ll.f90
+++ b/src/LIB/SURCOUCHE/src/fmread_ll.f90
@@ -41,32 +41,32 @@ IMPLICIT NONE
 PRIVATE
 
 INTERFACE IO_READ_FIELD
-   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_X2, IO_READ_FIELD_BYNAME_X3,  &
+   MODULE PROCEDURE IO_READ_FIELD_BYNAME_X0, IO_READ_FIELD_BYNAME_X1,  &
+                    IO_READ_FIELD_BYNAME_X2,                           &
+                    IO_READ_FIELD_BYNAME_N0,                           &
+                    IO_READ_FIELD_BYNAME_L0,                           &
+                    IO_READ_FIELD_BYNAME_C0,                           &
+                    IO_READ_FIELD_BYNAME_T0,                           &
+                    IO_READ_FIELD_BYFIELD_X0,IO_READ_FIELD_BYFIELD_X1, &
+                    IO_READ_FIELD_BYFIELD_X2,                          &
+                    IO_READ_FIELD_BYFIELD_N0,                          &
+                    IO_READ_FIELD_BYFIELD_L0,                          &
+                    IO_READ_FIELD_BYFIELD_C0,                          &
+                    IO_READ_FIELD_BYFIELD_T0
+!                        IO_READ_FIELD_BYNAME_X3,  &
 !                       IO_READ_FIELD_BYNAME_X4, IO_READ_FIELD_BYNAME_X5,  &
 !                       IO_READ_FIELD_BYNAME_X6,                            &
 !                       IO_READ_FIELD_BYNAME_N1,  &
 !                       IO_READ_FIELD_BYNAME_N2, IO_READ_FIELD_BYNAME_N3,  &
 !                       IO_READ_FIELD_BYNAME_L1,  &
 !                       IO_READ_FIELD_BYNAME_C1,  &
-!                       IO_READ_FIELD_BYNAME_T0,                            &
-!                       IO_READ_FIELD_BYFIELD_X0, &
-!                       IO_READ_FIELD_BYFIELD_X2,IO_READ_FIELD_BYFIELD_X3, &
+!                       IO_READ_FIELD_BYFIELD_X3, &
 !                       IO_READ_FIELD_BYFIELD_X4,IO_READ_FIELD_BYFIELD_X5, &
 !                       IO_READ_FIELD_BYFIELD_X6,                           &
 !                       IO_READ_FIELD_BYFIELD_N1, &
 !                       IO_READ_FIELD_BYFIELD_N2,IO_READ_FIELD_BYFIELD_N3, &
 !                       IO_READ_FIELD_BYFIELD_L1, &
 !                       IO_READ_FIELD_BYFIELD_C1, &
-!                       IO_READ_FIELD_BYFIELD_T0
 END INTERFACE
 
 INTERFACE FMREAD
@@ -224,6 +224,87 @@ RETURN
     
 END SUBROUTINE FMREADX0_ll
 
+SUBROUTINE IO_READ_FIELD_BYNAME_X0(TPFILE,HNAME,PFIELD,KRESP)
+!
+TYPE(TFILEDATA),  INTENT(IN)    :: TPFILE
+CHARACTER(LEN=*), INTENT(IN)    :: HNAME    ! name of the field to write
+REAL,             INTENT(INOUT) :: PFIELD   ! data field
+INTEGER,OPTIONAL, INTENT(OUT)   :: KRESP    ! return-code
+!
+INTEGER :: ID ! Index of the field
+INTEGER :: IRESP ! return_code
+!
+CALL PRINT_MSG(NVERB_DEBUG,'IO','IO_READ_FIELD_BYNAME_X0',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)
+!
+IF (PRESENT(KRESP)) KRESP = IRESP
+!
+END SUBROUTINE IO_READ_FIELD_BYNAME_X0
+
+SUBROUTINE IO_READ_FIELD_BYFIELD_X0(TPFILE,TPFIELD,PFIELD,KRESP)
+!
+USE MODD_IO_ll,        ONLY : ISP,GSMONOPROC
+!
+USE MODE_FD_ll, ONLY : GETFD,FD_ll
+!
+TYPE(TFILEDATA),  INTENT(IN)    :: TPFILE
+TYPE(TFIELDDATA), INTENT(INOUT) :: TPFIELD
+REAL,             INTENT(INOUT) :: PFIELD   ! data field
+INTEGER,OPTIONAL, INTENT(OUT)   :: KRESP    ! return-code
+!
+INTEGER                      :: IERR
+TYPE(FD_ll), POINTER         :: TZFD
+INTEGER                      :: IRESP
+!
+CALL PRINT_MSG(NVERB_DEBUG,'IO','IO_READ_FIELD_BYFIELD_X0',TRIM(TPFILE%CNAME)//': reading '//TRIM(TPFIELD%CMNHNAME))
+!
+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_X0',&
+                        TRIM(TPFILE%CNAME)//': invalid fileformat ('//TRIM(TPFILE%CFORMAT)//')')
+      END IF
+  ELSE
+    IF (ISP == TZFD%OWNER)  THEN
+      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_X0',&
+                        TRIM(TPFILE%CNAME)//': invalid fileformat ('//TRIM(TPFILE%CFORMAT)//')')
+      END IF
+    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)
+    !
+    ! Broadcast Field
+    CALL MPI_BCAST(PFIELD,1,MPI_FLOAT,TZFD%OWNER-1,TZFD%COMM,IERR)
+  END IF
+ELSE
+  IRESP = -61
+  CALL PRINT_MSG(NVERB_ERROR,'IO','IO_READ_FIELD_BYFIELD_X0','file '//TRIM(TPFILE%CNAME)//' not found')
+END IF
+!
+IF (PRESENT(KRESP)) KRESP = IRESP
+!
+END SUBROUTINE IO_READ_FIELD_BYFIELD_X0
+
+
 SUBROUTINE FMREADX1_ll(HFILEM,HRECFM,HFIPRI,HDIR,PFIELD,KGRID,&
      KLENCH,HCOMMENT,KRESP, KIMAX_ll, KJMAX_ll, TPSPLITTING)
 USE MODD_IO_ll, ONLY : ISP,GSMONOPROC, ISNPROC
@@ -403,11 +484,7 @@ IF (ASSOCIATED(TZFD)) THEN
       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
+      CALL ALLOCBUFFER_ll(ZFIELDP,PFIELD,TPFIELD%CDIR,GALLOC, KIMAX_ll, KJMAX_ll)
       IF (TPFILE%CFORMAT=='NETCDF4') THEN
          CALL IO_READ_FIELD_NC4(TPFILE,TPFIELD,ZFIELDP,IRESP)
       ELSE IF (TPFILE%CFORMAT=='LFI') THEN
@@ -416,9 +493,6 @@ IF (ASSOCIATED(TZFD)) THEN
          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)
@@ -432,11 +506,7 @@ IF (ASSOCIATED(TZFD)) THEN
       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
+      CALL SCATTER_XXFIELD(TPFIELD%CDIR,ZFIELDP,PFIELD,TZFD%OWNER,TZFD%COMM,TPSPLITTING)
     END IF
   END IF
 ELSE
@@ -642,6 +712,173 @@ TIMEZ%T_READ2D_ALL=TIMEZ%T_READ2D_ALL + T22 - T11
 
 END SUBROUTINE FMREADX2_ll
 
+SUBROUTINE IO_READ_FIELD_BYNAME_X2(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_X2',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_X2
+
+SUBROUTINE IO_READ_FIELD_BYFIELD_X2(TPFILE,TPFIELD,PFIELD,KRESP,KIMAX_ll,KJMAX_ll,TPSPLITTING)
+!
+USE MODD_IO_ll,        ONLY : GSMONOPROC,ISP,ISNPROC,LPACK,L1D,L2D
+USE MODD_STRUCTURE_ll, ONLY : ZONE_ll
+USE MODD_TIMEZ,        ONLY : TIMEZ
+!
+USE MODE_ALLOCBUFFER_ll
+USE MODE_FD_ll,        ONLY : GETFD,FD_LL
+USE MODE_MNH_TIMING,   ONLY : SECOND_MNH2
+USE MODE_SCATTER_ll
+!
+TYPE(TFILEDATA),           INTENT(IN)    :: TPFILE
+TYPE(TFIELDDATA),          INTENT(INOUT) :: TPFIELD
+REAL,DIMENSION(:,:),TARGET,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
+INTEGER                      :: IHEXTOT
+REAL(KIND=8),DIMENSION(2)    :: T0,T1,T2
+REAL(KIND=8),DIMENSION(2)    :: T11,T22
+!
+CALL PRINT_MSG(NVERB_DEBUG,'IO','IO_READ_FIELD_BYFIELD_X2',TRIM(TPFILE%CNAME)//': reading '//TRIM(TPFIELD%CMNHNAME))
+!
+CALL SECOND_MNH2(T11)
+GALLOC = .FALSE.
+IRESP = 0
+!
+IHEXTOT = 2*JPHEXT+1
+TZFD=>GETFD(TRIM(ADJUSTL(TPFILE%CNAME))//'.lfi')
+IF (ASSOCIATED(TZFD)) THEN
+  IF (GSMONOPROC) THEN ! sequential execution
+    IF (LPACK .AND. L1D .AND. SIZE(PFIELD,1)==IHEXTOT .AND. SIZE(PFIELD,2)==IHEXTOT) THEN
+      ZFIELDP=>PFIELD(JPHEXT+1:JPHEXT+1,JPHEXT+1:JPHEXT+1)
+    ELSE IF (LPACK .AND. L2D .AND. SIZE(PFIELD,2)==IHEXTOT) THEN
+      ZFIELDP=>PFIELD(:,JPHEXT+1:JPHEXT+1)
+    ELSE
+      ZFIELDP=>PFIELD(:,:)
+    END IF
+    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_X2',&
+                     TRIM(TPFILE%CNAME)//': invalid fileformat ('//TRIM(TPFILE%CFORMAT)//')')
+    END IF
+    IF (LPACK .AND. L1D .AND. SIZE(PFIELD,1)==IHEXTOT .AND. SIZE(PFIELD,2)==IHEXTOT) THEN
+      PFIELD(:,:)=SPREAD(SPREAD(PFIELD(JPHEXT+1,JPHEXT+1),DIM=1,NCOPIES=IHEXTOT),DIM=2,NCOPIES=IHEXTOT)
+    ELSE IF (LPACK .AND. L2D .AND. SIZE(PFIELD,2)==IHEXTOT) THEN
+      PFIELD(:,:)=SPREAD(PFIELD(:,JPHEXT+1),DIM=2,NCOPIES=IHEXTOT)
+    END IF
+  ELSE
+    CALL SECOND_MNH2(T0)
+    IF (ISP == TZFD%OWNER)  THEN
+      ! I/O processor case
+      CALL ALLOCBUFFER_ll(ZFIELDP,PFIELD,TPFIELD%CDIR,GALLOC, KIMAX_ll, KJMAX_ll)
+      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_X2',&
+                        TRIM(TPFILE%CNAME)//': invalid fileformat ('//TRIM(TPFILE%CFORMAT)//')')
+      END IF
+    END IF
+    CALL SECOND_MNH2(T1)
+    TIMEZ%T_READ2D_READ=TIMEZ%T_READ2D_READ + T1 - T0
+    !
+    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' .OR. TPFIELD%CDIR == 'YY') THEN
+      ! XX or YY Scatter Field
+      CALL SCATTER_XXFIELD(TPFIELD%CDIR,ZFIELDP,PFIELD,TZFD%OWNER,TZFD%COMM,TPSPLITTING)
+      ! Broadcast Field
+      CALL MPI_BCAST(PFIELD,SIZE(PFIELD),MPI_FLOAT,TZFD%OWNER-1,TZFD%COMM,IERR)
+    ELSE IF (TPFIELD%CDIR == 'XY') THEN
+      IF (LPACK .AND. L2D) THEN
+        ! 2D compact case
+        CALL SCATTER_XXFIELD('XX',ZFIELDP(:,1),PFIELD(:,JPHEXT+1),TZFD%OWNER,TZFD%COMM,TPSPLITTING)
+        PFIELD(:,:) = SPREAD(PFIELD(:,JPHEXT+1),DIM=2,NCOPIES=IHEXTOT)
+      ELSE
+#ifdef MNH_GA
+        !
+        ! init/create the ga , dim3 = 1
+        !
+        CALL MNH_INIT_GA(SIZE(PFIELD,1),SIZE(PFIELD,2),1,HRECFM,"READ")
+        IF (ISP == TZFD%OWNER)  THEN
+          !
+          ! put the data in the g_a , this proc get this 1 slide
+          !
+          lo_zplan(JPIZ) = 1
+          hi_zplan(JPIZ) = 1
+          call nga_put(g_a, lo_zplan, hi_zplan,ZFIELDP, ld_zplan)
+        END IF
+        call ga_sync
+        !
+        ! get the columun data in this proc
+        !
+        ! temp buf to avoid problem with none stride PFIELDS buffer  with HALO 
+        ALLOCATE (ZFIELD_GA (SIZE(PFIELD,1),SIZE(PFIELD,2)))
+        call nga_get(g_a, lo_col, hi_col,ZFIELD_GA(1,1) , ld_col)
+        PFIELD = ZFIELD_GA
+        DEALLOCATE(ZFIELD_GA)
+#else
+        ! XY Scatter Field
+        CALL SCATTER_XYFIELD(ZFIELDP,PFIELD,TZFD%OWNER,TZFD%COMM)
+#endif
+      END IF
+    ELSE
+      CALL MPI_BCAST(PFIELD,SIZE(PFIELD),MPI_FLOAT,TZFD%OWNER-1,TZFD%COMM,IERR)
+    END IF
+  END IF
+  CALL SECOND_MNH2(T2)
+  TIMEZ%T_READ2D_SCAT=TIMEZ%T_READ2D_SCAT + T2 - T1    
+ELSE
+  IRESP = -61
+  CALL PRINT_MSG(NVERB_ERROR,'IO','IO_READ_FIELD_BYFIELD_X2','file '//TRIM(TPFILE%CNAME)//' not found')
+END IF
+!
+IF (GALLOC) DEALLOCATE (ZFIELDP)
+!
+IF (PRESENT(KRESP)) KRESP = IRESP
+!
+CALL SECOND_MNH2(T22)
+TIMEZ%T_READ2D_ALL=TIMEZ%T_READ2D_ALL + T22 - T11
+!
+END SUBROUTINE IO_READ_FIELD_BYFIELD_X2
+
+
 SUBROUTINE FMREADX3_ll(HFILEM,HRECFM,HFIPRI,HDIR,PFIELD,KGRID,&
      KLENCH,HCOMMENT,KRESP)
 USE MODD_IO_ll, ONLY : ISP,GSMONOPROC,LPACK,L1D,L2D 
@@ -2255,6 +2492,93 @@ RETURN
 
 END SUBROUTINE FMREADT0_ll
 
+SUBROUTINE IO_READ_FIELD_BYNAME_T0(TPFILE,HNAME,TPDATA,KRESP)
+!
+TYPE(TFILEDATA),  INTENT(IN)    :: TPFILE
+CHARACTER(LEN=*), INTENT(IN)    :: HNAME    ! name of the field to write
+TYPE (DATE_TIME), INTENT(INOUT) :: TPDATA   ! array containing the data field
+INTEGER,OPTIONAL, INTENT(OUT)   :: KRESP    ! return-code
+!
+INTEGER :: ID ! Index of the field
+INTEGER :: IRESP ! return_code
+!
+CALL PRINT_MSG(NVERB_DEBUG,'IO','IO_READ_FIELD_BYNAME_T0',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),TPDATA,IRESP)
+!
+IF (PRESENT(KRESP)) KRESP = IRESP
+!
+END SUBROUTINE IO_READ_FIELD_BYNAME_T0
+
+SUBROUTINE IO_READ_FIELD_BYFIELD_T0(TPFILE,TPFIELD,TPDATA,KRESP)
+!
+USE MODD_IO_ll, ONLY : ISP,GSMONOPROC
+USE MODE_FD_ll, ONLY : GETFD,FD_LL
+!
+TYPE(TFILEDATA),  INTENT(IN)    :: TPFILE
+TYPE(TFIELDDATA), INTENT(INOUT) :: TPFIELD
+TYPE (DATE_TIME), INTENT(INOUT) :: TPDATA   ! array containing the data field
+INTEGER,OPTIONAL, INTENT(OUT)   :: KRESP    ! return-code
+!
+INTEGER                      :: IERR
+TYPE(FD_ll), POINTER         :: TZFD
+INTEGER                      :: IRESP
+INTEGER,DIMENSION(3)         :: ITDATE
+!
+CALL PRINT_MSG(NVERB_DEBUG,'IO','IO_READ_FIELD_BYFIELD_T0',TRIM(TPFILE%CNAME)//': reading '//TRIM(TPFIELD%CMNHNAME))
+!
+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,TPDATA,IRESP)
+      ELSE IF (TPFILE%CFORMAT=='LFI') THEN
+         CALL IO_READ_FIELD_LFI(TPFILE,TPFIELD,TPDATA,IRESP)
+      ELSE
+         CALL PRINT_MSG(NVERB_FATAL,'IO','IO_READ_FIELD_BYFIELD_T0',&
+                        TRIM(TPFILE%CNAME)//': invalid fileformat ('//TRIM(TPFILE%CFORMAT)//')')
+      END IF
+  ELSE
+    IF (ISP == TZFD%OWNER)  THEN
+      IF (TPFILE%CFORMAT=='NETCDF4') THEN
+         CALL IO_READ_FIELD_NC4(TPFILE,TPFIELD,TPDATA,IRESP)
+      ELSE IF (TPFILE%CFORMAT=='LFI') THEN
+         CALL IO_READ_FIELD_LFI(TPFILE,TPFIELD,TPDATA,IRESP)
+      ELSE
+         CALL PRINT_MSG(NVERB_FATAL,'IO','IO_READ_FIELD_BYFIELD_T0',&
+                        TRIM(TPFILE%CNAME)//': invalid fileformat ('//TRIM(TPFILE%CFORMAT)//')')
+      END IF
+      ITDATE(1) = TPDATA%TDATE%YEAR
+      ITDATE(2) = TPDATA%TDATE%MONTH
+      ITDATE(3) = TPDATA%TDATE%DAY
+    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)
+    !
+    CALL MPI_BCAST(ITDATE,     3,MPI_INTEGER,TZFD%OWNER-1,TZFD%COMM,IERR)
+    CALL MPI_BCAST(TPDATA%TIME,1,MPI_FLOAT,  TZFD%OWNER-1,TZFD%COMM,IERR)
+    TPDATA%TDATE%YEAR  = ITDATE(1)
+    TPDATA%TDATE%MONTH = ITDATE(2)
+    TPDATA%TDATE%DAY   = ITDATE(3)
+  END IF
+ELSE
+  IRESP = -61
+  CALL PRINT_MSG(NVERB_ERROR,'IO','IO_READ_FIELD_BYFIELD_T0','file '//TRIM(TPFILE%CNAME)//' not found')
+END IF
+!
+IF (PRESENT(KRESP)) KRESP = IRESP
+!
+END SUBROUTINE IO_READ_FIELD_BYFIELD_T0
+
+
 SUBROUTINE FMREAD_LB(HFILEM,HRECFM,HFIPRI,HLBTYPE,PLB,KRIM,KL3D,&
      & KGRID,KLENCH,HCOMMENT,KRESP)
 USE MODD_FM
diff --git a/src/LIB/SURCOUCHE/src/fmreadwrit.f90 b/src/LIB/SURCOUCHE/src/fmreadwrit.f90
index e51eb98c9..9049ccfc9 100644
--- a/src/LIB/SURCOUCHE/src/fmreadwrit.f90
+++ b/src/LIB/SURCOUCHE/src/fmreadwrit.f90
@@ -272,18 +272,18 @@ IMPLICIT NONE
 PRIVATE
 !
 INTERFACE IO_READ_FIELD_LFI
-   MODULE PROCEDURE IO_READ_FIELD_LFI_X1, &
+   MODULE PROCEDURE IO_READ_FIELD_LFI_X0, IO_READ_FIELD_LFI_X1, &
+                    IO_READ_FIELD_LFI_X2, &
                     IO_READ_FIELD_LFI_N0, &
                     IO_READ_FIELD_LFI_L0, &
-                    IO_READ_FIELD_LFI_C0
-!                     IO_READ_FIELD_LFI_X0, &
-!                     IO_READ_FIELD_LFI_X2,IO_READ_FIELD_LFI_X3, &
+                    IO_READ_FIELD_LFI_C0, &
+                    IO_READ_FIELD_LFI_T0
+!                     IO_READ_FIELD_LFI_X3, &
 !                     IO_READ_FIELD_LFI_X4,IO_READ_FIELD_LFI_X5, &
 !                     IO_READ_FIELD_LFI_X6,                       &
 !                     IO_READ_FIELD_LFI_N1, &
 !                     IO_READ_FIELD_LFI_N2,IO_READ_FIELD_LFI_N3, &
 !                     IO_READ_FIELD_LFI_L1, &
-!                     IO_READ_FIELD_LFI_T0
 END INTERFACE IO_READ_FIELD_LFI
 !
 INTERFACE IO_WRITE_FIELD_LFI
@@ -302,6 +302,42 @@ PUBLIC IO_READ_FIELD_LFI,IO_WRITE_FIELD_LFI
 !
 CONTAINS
 !
+SUBROUTINE IO_READ_FIELD_LFI_X0(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,             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_X0',TRIM(TPFILE%CNAME)//': reading '//TRIM(TPFIELD%CMNHNAME))
+!
+ILENG = 1
+!
+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_X0
+!
+!
 SUBROUTINE IO_READ_FIELD_LFI_X1(TPFILE,TPFIELD,PFIELD,KRESP)
 USE MODD_FM
 USE MODD_CONFZ, ONLY : NZ_VERB
@@ -338,6 +374,42 @@ IF (ALLOCATED(IWORK)) DEALLOCATE(IWORK)
 END SUBROUTINE IO_READ_FIELD_LFI_X1
 !
 !
+SUBROUTINE IO_READ_FIELD_LFI_X2(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_X2',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_X2
+!
+!
 SUBROUTINE IO_READ_FIELD_LFI_N0(TPFILE,TPFIELD,KFIELD,KRESP)
 USE MODD_FM
 USE MODD_CONFZ, ONLY : NZ_VERB
@@ -463,6 +535,75 @@ IF (ALLOCATED(IWORK)) DEALLOCATE(IWORK)
 END SUBROUTINE IO_READ_FIELD_LFI_C0
 !
 !
+SUBROUTINE IO_READ_FIELD_LFI_T0(TPFILE,TPFIELD,TPDATA,KRESP)
+!
+USE MODD_CONFZ, ONLY : NZ_VERB
+USE MODD_FM
+USE MODE_MSG
+USE MODD_TYPE_DATE
+!
+IMPLICIT NONE
+!
+!*      0.1   Declarations of arguments
+!
+TYPE(TFILEDATA), INTENT(IN)    :: TPFILE
+TYPE(TFIELDDATA),INTENT(INOUT) :: TPFIELD
+TYPE (DATE_TIME),INTENT(INOUT) :: TPDATA  ! 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
+TYPE(TFIELDDATA)                         :: TZFIELD
+INTEGER, DIMENSION(3)                    :: ITDATE    ! date array
+!
+CALL PRINT_MSG(NVERB_DEBUG,'IO','IO_READ_FIELD_LFI_T0',TRIM(TPFILE%CNAME)//': reading '//TRIM(TPFIELD%CMNHNAME))
+!
+TZFIELD = TPFIELD
+!
+! Read date
+!
+TZFIELD%CMNHNAME = TRIM(TPFIELD%CMNHNAME)//'%TDATE'
+TZFIELD%CCOMMENT = 'YYYYMMDD'
+!
+ILENG=SIZE(ITDATE)
+!
+CALL IO_READ_CHECK_FIELD_LFI(TPFILE,TZFIELD,ILENG,IWORK,ITOTAL,IRESP,GGOOD)
+!
+IF (GGOOD) THEN
+  TPDATA%TDATE%YEAR  = IWORK(IWORK(2)+2+1)
+  TPDATA%TDATE%MONTH = IWORK(IWORK(2)+2+2)
+  TPDATA%TDATE%DAY   = IWORK(IWORK(2)+2+3)
+END IF
+!
+IF (ALLOCATED(IWORK)) DEALLOCATE(IWORK)
+!
+IF (.NOT.GGOOD) THEN
+  KRESP = IRESP
+  RETURN
+END IF
+!
+! Read time
+!
+TZFIELD%CMNHNAME = TRIM(TPFIELD%CMNHNAME)//'%TIME'
+TZFIELD%CCOMMENT = 'SECONDS'
+!
+ILENG=1
+!
+CALL IO_READ_CHECK_FIELD_LFI(TPFILE,TZFIELD,ILENG,IWORK,ITOTAL,IRESP,GGOOD)
+!
+IF (GGOOD) CALL TRANSFR(TPDATA%TIME,IWORK(IWORK(2)+3),ILENG)
+!
+IF (ALLOCATED(IWORK)) DEALLOCATE(IWORK)
+!
+KRESP = IRESP
+!
+END SUBROUTINE IO_READ_FIELD_LFI_T0
+!
+!
 SUBROUTINE IO_READ_CHECK_FIELD_LFI(TPFILE,TPFIELD,KLENG,KWORK,KTOTAL,KRESP,OGOOD)
 !
 TYPE(TFILEDATA),                         INTENT(IN)    :: TPFILE
diff --git a/src/LIB/SURCOUCHE/src/mode_netcdf.f90 b/src/LIB/SURCOUCHE/src/mode_netcdf.f90
index cf0b1e65c..a34d3d780 100644
--- a/src/LIB/SURCOUCHE/src/mode_netcdf.f90
+++ b/src/LIB/SURCOUCHE/src/mode_netcdf.f90
@@ -35,11 +35,12 @@ INTERFACE IO_WRITE_FIELD_NC4
 END INTERFACE IO_WRITE_FIELD_NC4
 
 INTERFACE IO_READ_FIELD_NC4
-   MODULE PROCEDURE IO_READ_FIELD_NC4_X1, &
+   MODULE PROCEDURE IO_READ_FIELD_NC4_X0,IO_READ_FIELD_NC4_X1, &
+                    IO_READ_FIELD_NC4_X2, &
                     IO_READ_FIELD_NC4_N0, &
                     IO_READ_FIELD_NC4_L0, &
-                    IO_READ_FIELD_NC4_C0
-!                     IO_READ_FIELD_NC4_X0, &
+                    IO_READ_FIELD_NC4_C0, &
+                    IO_READ_FIELD_NC4_T0
 !                     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,                      &
@@ -47,7 +48,6 @@ INTERFACE IO_READ_FIELD_NC4
 !                     IO_READ_FIELD_NC4_L1, &
 !                     IO_READ_FIELD_NC4_N2,IO_READ_FIELD_NC4_N3, &
 !                     IO_READ_FIELD_NC4_C1, &
-!                     IO_READ_FIELD_NC4_T0
 END INTERFACE IO_READ_FIELD_NC4
 
 INTERFACE NCWRIT
@@ -2198,10 +2198,15 @@ IF (STATUS == NF90_NOERR) THEN
   ALLOCATE(CHARACTER(LEN=ILEN) :: 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))
+    IF(.NOT.PRESENT(HCALENDAR)) 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))
+      KRESP = -111 !Used later to broadcast modified metadata
+    ELSE
+      CALL PRINT_MSG(NVERB_DEBUG,'IO','IO_READ_CHECK_FIELD_ATTR_NC4','UNITS found in file for field ' &
+                                                                     //TRIM(TPFIELD%CMNHNAME)//' (will be analysed later)')
+    END IF
     TPFIELD%CUNITS=TRIM(YVALUE)
-    KRESP = -111 !Used later to broadcast modified metadata
   ELSE
     CALL PRINT_MSG(NVERB_DEBUG,'IO','IO_READ_CHECK_FIELD_ATTR_NC4','expected UNITS found in file for field ' &
                                                                    //TRIM(TPFIELD%CMNHNAME))
@@ -2212,8 +2217,14 @@ ELSE !no UNITS
     CALL PRINT_MSG(NVERB_DEBUG,'IO','IO_READ_CHECK_FIELD_ATTR_NC4','no UNITS (as expected) in file for field ' &
                                                                    //TRIM(TPFIELD%CMNHNAME))
   ELSE
-    CALL PRINT_MSG(NVERB_WARNING,'IO','IO_READ_CHECK_FIELD_ATTR_NC4','expected UNITS but not found in file for field ' &
-                                                                  //TRIM(TPFIELD%CMNHNAME))
+    IF(.NOT.PRESENT(HCALENDAR)) THEN
+      CALL PRINT_MSG(NVERB_WARNING,'IO','IO_READ_CHECK_FIELD_ATTR_NC4','expected UNITS but not found in file for field ' &
+                                                                       //TRIM(TPFIELD%CMNHNAME))
+    ELSE
+      CALL PRINT_MSG(NVERB_ERROR,'IO','IO_READ_CHECK_FIELD_ATTR_NC4','expected UNITS but not found in file for field ' &
+                                                                     //TRIM(TPFIELD%CMNHNAME))
+      KRESP = -3
+    END IF
   END IF
 END IF
 !
@@ -2233,8 +2244,8 @@ IF (STATUS == NF90_NOERR) THEN
   END IF
   DEALLOCATE(YVALUE)
 ELSE !no CALENDAR
-  CALL PRINT_MSG(NVERB_INFO,'IO','IO_READ_CHECK_FIELD_ATTR_NC4','expected CALENDAR but not found in file for field ' &
-                                                                //TRIM(TPFIELD%CMNHNAME))
+  CALL PRINT_MSG(NVERB_WARNING,'IO','IO_READ_CHECK_FIELD_ATTR_NC4','expected CALENDAR but not found in file for field ' &
+                                                                   //TRIM(TPFIELD%CMNHNAME))
 END IF
 ENDIF
 !
@@ -2291,6 +2302,58 @@ KRESP = IRESP
 
 END SUBROUTINE NCREADX0
 
+SUBROUTINE IO_READ_FIELD_NC4_X0(TPFILE, TPFIELD, PFIELD, KRESP)
+USE MODD_FM, ONLY : FMHEADER, JPXKRK
+TYPE(TFILEDATA),  INTENT(IN)    :: TPFILE
+TYPE(TFIELDDATA), INTENT(INOUT) :: TPFIELD
+REAL,             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
+CHARACTER(LEN=30)        :: YVARNAME
+INTEGER                  :: IRESP
+
+CALL PRINT_MSG(NVERB_DEBUG,'IO','IO_READ_FIELD_NC4_X0',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_X0[NF90_INQ_VARID] '//TRIM(YVARNAME),IRESP)
+  GOTO 1000
+END IF
+STATUS = NF90_INQUIRE_VARIABLE(INCID, IVARID, XTYPE=ITYPE, NDIMS=IDIMS)
+IF (STATUS /= NF90_NOERR) CALL HANDLE_ERR(STATUS,__LINE__,'IO_READ_FIELD_NC4_X0[NF90_INQUIRE_VARIABLE] '//TRIM(YVARNAME))
+
+IF (IDIMS == 0 .AND. ITYPE == NF90_DOUBLE) THEN
+  ! Read variable
+  STATUS = NF90_GET_VAR(INCID, IVARID, PFIELD)
+  IF (STATUS /= NF90_NOERR) THEN
+    CALL HANDLE_ERR(status,__LINE__,'IO_READ_FIELD_NC4_X0[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_X0',TRIM(TPFILE%CNAME)//': '//TRIM(YVARNAME)// &
+                                                         ' not read (wrong size or type)')
+  IRESP = -3
+END IF
+
+1000 CONTINUE
+KRESP = IRESP
+
+END SUBROUTINE IO_READ_FIELD_NC4_X0
+
 SUBROUTINE NCREADX1(KNCID, HVARNAME, PFIELD, TPFMH, KRESP)
 USE MODD_FM, ONLY : FMHEADER, JPXKRK
 INTEGER(KIND=IDCDF_KIND),INTENT(IN) :: KNCID
@@ -2372,7 +2435,7 @@ 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(KIND=IDCDF_KIND) :: IDIMLEN
 INTEGER                  :: IRESP
 
 CALL PRINT_MSG(NVERB_DEBUG,'IO','IO_READ_FIELD_NC4_X1',TRIM(TPFILE%CNAME)//': reading '//TRIM(TPFIELD%CMNHNAME))
@@ -2503,6 +2566,88 @@ KRESP = IRESP
 
 END SUBROUTINE NCREADX2
 
+SUBROUTINE IO_READ_FIELD_NC4_X2(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(3) :: IVDIMS
+CHARACTER(LEN=30)        :: YVARNAME
+INTEGER(KIND=IDCDF_KIND) :: IDIMLEN
+INTEGER                  :: IVARSIZE
+INTEGER                  :: IRESP
+
+CALL PRINT_MSG(NVERB_DEBUG,'IO','IO_READ_FIELD_NC4_X2',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_X2[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_X2[NF90_INQUIRE_VARIABLE] '//TRIM(YVARNAME))
+
+!Treat special case of a degenerated 3D array (3rd dimension size is 1)
+IF (IDIMS==3) THEN
+  STATUS = NF90_INQUIRE_DIMENSION(INCID, IVDIMS(3), LEN=IDIMLEN)
+  IF (STATUS /= NF90_NOERR) CALL HANDLE_ERR(status,__LINE__,'IO_READ_FIELD_NC4_X2[NF90_INQUIRE_DIMENSION] '//TRIM(YVARNAME))
+  IF (IDIMLEN==1) THEN
+    CALL PRINT_MSG(NVERB_INFO,'IO','IO_READ_FIELD_NC4_X2',TRIM(TPFILE%CNAME)// &
+                   ': reading 3D array with degenerated third dimension in 2D array for '//TRIM(YVARNAME))
+    IDIMS = 2
+  ELSE
+    CALL PRINT_MSG(NVERB_FATAL,'IO','IO_READ_FIELD_NC4_X2',TRIM(TPFILE%CNAME)//': wrong number of dimensions for '//TRIM(YVARNAME))
+  END IF
+END IF
+
+IF (IDIMS == 2 .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_X2[NF90_INQUIRE_DIMENSION] '//TRIM(YVARNAME))
+  IVARSIZE = IDIMLEN
+  STATUS = NF90_INQUIRE_DIMENSION(INCID, IVDIMS(2), LEN=IDIMLEN)
+  IF (STATUS /= NF90_NOERR) CALL HANDLE_ERR(status,__LINE__,'IO_READ_FIELD_NC4_X2[NF90_INQUIRE_DIMENSION] '//TRIM(YVARNAME))
+  IVARSIZE = IVARSIZE*IDIMLEN
+
+  IF (IVARSIZE == 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_X2[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_X2',TRIM(TPFILE%CNAME)//': '//TRIM(YVARNAME)// &
+                                                           ' not read (wrong size)')
+    IRESP = -3
+  END IF
+ELSE
+  CALL PRINT_MSG(NVERB_ERROR,'IO','IO_READ_FIELD_NC4_X2',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_X2
+
 SUBROUTINE NCREADX3(KNCID, HVARNAME, PFIELD, TPFMH, KRESP)
 USE MODD_FM, ONLY : FMHEADER, JPXKRK
 INTEGER(KIND=IDCDF_KIND),INTENT(IN) :: KNCID
@@ -3221,6 +3366,74 @@ KRESP = IRESP
 
 END SUBROUTINE IO_READ_FIELD_NC4_C0
 
+SUBROUTINE IO_READ_FIELD_NC4_T0(TPFILE, TPFIELD, TPDATA, KRESP)
+
+USE MODD_FM, ONLY : FMHEADER, JPXKRK
+USE MODD_TYPE_DATE
+
+TYPE(TFILEDATA),  INTENT(IN)    :: TPFILE
+TYPE(TFIELDDATA), INTENT(INOUT) :: TPFIELD
+TYPE (DATE_TIME), INTENT(OUT)   :: TPDATA
+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
+CHARACTER(LEN=30)            :: YVARNAME
+CHARACTER(LEN=:),ALLOCATABLE :: YSTR
+INTEGER(KIND=IDCDF_KIND)     :: IDIMLEN
+INTEGER                      :: IDX,IRESP
+
+CALL PRINT_MSG(NVERB_DEBUG,'IO','IO_READ_FIELD_NC4_T0',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_T0[NF90_INQ_VARID] '//TRIM(YVARNAME),IRESP)
+   GOTO 1000
+END IF
+STATUS = NF90_INQUIRE_VARIABLE(INCID, IVARID, XTYPE=ITYPE, NDIMS=IDIMS)
+IF (STATUS /= NF90_NOERR) CALL HANDLE_ERR(STATUS,__LINE__,'IO_READ_FIELD_NC4_T0[NF90_INQUIRE_VARIABLE] '//TRIM(YVARNAME))
+
+IF (IDIMS == 0 .AND. ITYPE == NF90_DOUBLE) THEN
+  ! Read time
+  STATUS = NF90_GET_VAR(INCID, IVARID, TPDATA%TIME)
+  IF (STATUS /= NF90_NOERR) THEN
+    CALL HANDLE_ERR(status,__LINE__,'IO_READ_FIELD_NC4_X0[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,HCALENDAR='standard')
+  ! Extract date from UNITS
+  IDX =  INDEX(TPFIELD%CUNITS,'since ')
+  READ(TPFIELD%CUNITS(IDX+6 :IDX+9), '( I4.4 )') TPDATA%TDATE%YEAR
+  READ(TPFIELD%CUNITS(IDX+11:IDX+12),'( I2.2 )') TPDATA%TDATE%MONTH
+  READ(TPFIELD%CUNITS(IDX+14:IDX+15),'( I2.2 )') TPDATA%TDATE%DAY
+  ! Simple check (should catch most errors)
+  IF ( TPDATA%TDATE%DAY<1 .OR. TPDATA%TDATE%DAY>31 .OR. TPDATA%TDATE%MONTH<1 .OR. TPDATA%TDATE%MONTH>12 ) THEN
+    CALL PRINT_MSG(NVERB_ERROR,'IO','IO_READ_FIELD_NC4_T0',TRIM(TPFILE%CNAME)//': '//TRIM(YVARNAME)// &
+                                                           ' read date is invalid')
+    IRESP = -3
+  END IF
+ELSE
+   CALL PRINT_MSG(NVERB_ERROR,'IO','IO_READ_FIELD_NC4_T0',TRIM(TPFILE%CNAME)//': '//TRIM(YVARNAME)// &
+                                                          ' not read (wrong size or type)')
+   IRESP = -3
+END IF
+
+1000 CONTINUE
+KRESP = IRESP
+
+END SUBROUTINE IO_READ_FIELD_NC4_T0
+
 END MODULE MODE_NETCDF
 
 #else
diff --git a/src/MNH/ini_modeln.f90 b/src/MNH/ini_modeln.f90
index 3d5c33b50..e5a52597c 100644
--- a/src/MNH/ini_modeln.f90
+++ b/src/MNH/ini_modeln.f90
@@ -1573,7 +1573,7 @@ END IF
 !*       7.    INITIALIZE GRIDS AND METRIC COEFFICIENTS
 !              ----------------------------------------
 !
-CALL SET_GRID(KMI,TPINIFILE%CNAME,HLUOUT,IIU,IJU,IKU,NIMAX_ll,NJMAX_ll,  &
+CALL SET_GRID(KMI,TPINIFILE,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), &
diff --git a/src/MNH/ini_spectren.f90 b/src/MNH/ini_spectren.f90
index a2f68bdbe..f35dd1bfe 100644
--- a/src/MNH/ini_spectren.f90
+++ b/src/MNH/ini_spectren.f90
@@ -11,12 +11,13 @@
 !
 INTERFACE
 !
-       SUBROUTINE INI_SPECTRE_n(KMI,HLUOUT,HINIFILE)
+       SUBROUTINE INI_SPECTRE_n(KMI,HLUOUT,TPINIFILE)
 !
-       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
+       USE MODD_IO_ll, ONLY: TFILEDATA
+!
+       INTEGER,           INTENT(IN) :: KMI       ! Model index 
+       CHARACTER (LEN=*), INTENT(IN) :: HLUOUT    ! Name for output-listing of nested models
+       TYPE(TFILEDATA),   INTENT(IN) :: TPINIFILE ! Initial file
 !
 END SUBROUTINE INI_SPECTRE_n
 !
@@ -24,7 +25,7 @@ END INTERFACE
 !
 END MODULE MODI_INI_SPECTRE_n
 !     ######################################################
-      SUBROUTINE INI_SPECTRE_n(KMI,HLUOUT,HINIFILE)
+      SUBROUTINE INI_SPECTRE_n(KMI,HLUOUT,TPINIFILE)
 !     ######################################################
 !
 !!****  *INI_SPECTRE_n* - routine to initialize SPECTRE (based on ini_modeln.f90)
@@ -56,7 +57,7 @@ USE MODD_DUST
 USE MODD_DYN
 USE MODD_DYNZD
 USE MODD_FRC
-USE MODD_IO_ll, ONLY : LIOCDF4,LLFIOUT
+USE MODD_IO_ll, ONLY : LIOCDF4,LLFIOUT,TFILEDATA
 USE MODD_REF
 USE MODD_SERIES, ONLY: LSERIES
 USE MODD_TIME
@@ -141,12 +142,9 @@ IMPLICIT NONE
 !*       0.1   declarations of arguments
 !
 !
-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
+INTEGER,           INTENT(IN) :: KMI       ! Model index 
+CHARACTER (LEN=*), INTENT(IN) :: HLUOUT    ! Name for output-listing of nested models
+TYPE(TFILEDATA),   INTENT(IN) :: TPINIFILE ! Initial file
 !
 !*       0.2   declarations of local variables
 !
@@ -230,7 +228,7 @@ NULLIFY(TZINITHALO3D_ll)
 !
 CALL FMLOOK_ll(HLUOUT,HLUOUT,ILUOUT,IRESP)
 CLUOUT = HLUOUT
-CINIFILE=HINIFILE
+CINIFILE=TPINIFILE%CNAME
 !
 !-------------------------------------------------------------------------------
 !
@@ -245,7 +243,7 @@ IKU=NKMAX+2*JPVEXT
 YRECFM = 'ZHAT'
 ALLOCATE(XZHAT(IKU))
  YDIR='--'
-CALL FMREAD(HINIFILE,YRECFM,HLUOUT,YDIR,XZHAT,IGRID,ILENCH,YCOMMENT,IRESP)
+CALL FMREAD(TPINIFILE%CNAME,YRECFM,HLUOUT,YDIR,XZHAT,IGRID,ILENCH,YCOMMENT,IRESP)
 IF (XALZBOT>=XZHAT(IKU) .AND. LVE_RELAX) THEN
   WRITE(ILUOUT,FMT=*) "INI_SPECTRE_n ERROR: you want to use vertical relaxation"
   WRITE(ILUOUT,FMT=*) "                  but bottom of layer XALZBOT(",XALZBOT,")"
@@ -731,7 +729,7 @@ CALL INI_BIKHARDT_n (NDXRATIO_ALL(KMI),NDYRATIO_ALL(KMI),KMI)
 !*       6.    INITIALIZE GRIDS AND METRIC COEFFICIENTS
 !              ----------------------------------------
 !
-CALL SET_GRID(KMI,HINIFILE,HLUOUT,IIU,IJU,IKU,NIMAX_ll,NJMAX_ll,         &
+CALL SET_GRID(KMI,TPINIFILE,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), &
@@ -769,35 +767,35 @@ IF (LSPECTRE_U) THEN
   ALLOCATE(XUT(IIU,IJU,IKU))      ; XUT  = 0.0
   YRECFM = 'UT'
   YDIR='XY'
-  CALL FMREAD(HINIFILE,YRECFM,HLUOUT,YDIR,XUT,IGRID,ILENCH,YCOMMENT,IRESP)
+  CALL FMREAD(TPINIFILE%CNAME,YRECFM,HLUOUT,YDIR,XUT,IGRID,ILENCH,YCOMMENT,IRESP)
 END IF
 !
 IF (LSPECTRE_V) THEN
   ALLOCATE(XVT(IIU,IJU,IKU))      ; XVT  = 0.0
   YRECFM = 'VT'
   YDIR='XY'
-  CALL FMREAD(HINIFILE,YRECFM,HLUOUT,YDIR,XVT,IGRID,ILENCH,YCOMMENT,IRESP)
+  CALL FMREAD(TPINIFILE%CNAME,YRECFM,HLUOUT,YDIR,XVT,IGRID,ILENCH,YCOMMENT,IRESP)
 END IF
 !
 IF (LSPECTRE_W) THEN  
   ALLOCATE(XWT(IIU,IJU,IKU))      ; XWT  = 0.0
   YRECFM = 'WT'
   YDIR='XY'
-  CALL FMREAD(HINIFILE,YRECFM,HLUOUT,YDIR,XWT,IGRID,ILENCH,YCOMMENT,IRESP)
+  CALL FMREAD(TPINIFILE%CNAME,YRECFM,HLUOUT,YDIR,XWT,IGRID,ILENCH,YCOMMENT,IRESP)
 END IF
 !
 IF (LSPECTRE_TH) THEN
   ALLOCATE(XTHT(IIU,IJU,IKU))     ; XTHT = 0.0
   YRECFM = 'THT'
   YDIR='XY'
-  CALL FMREAD(HINIFILE,YRECFM,HLUOUT,YDIR,XTHT,IGRID,ILENCH,YCOMMENT,IRESP)
+  CALL FMREAD(TPINIFILE%CNAME,YRECFM,HLUOUT,YDIR,XTHT,IGRID,ILENCH,YCOMMENT,IRESP)
 END IF
 !
 IF (LSPECTRE_RV) THEN
   ALLOCATE(XRT(IIU,IJU,IKU,NRR))
   YRECFM = 'RVT'
   YDIR='XY'
-  CALL FMREAD(HINIFILE,YRECFM,HLUOUT,YDIR,XRT(:,:,:,1),IGRID,ILENCH,YCOMMENT,IRESP)
+  CALL FMREAD(TPINIFILE%CNAME,YRECFM,HLUOUT,YDIR,XRT(:,:,:,1),IGRID,ILENCH,YCOMMENT,IRESP)
 END IF
 !
 !-------------------------------------------------------------------------------
@@ -807,9 +805,9 @@ END IF
 !              ---------------------------
 !
 !
-CALL SET_REF(KMI,HINIFILE,HLUOUT,                                &
+CALL SET_REF(KMI,TPINIFILE%CNAME,HLUOUT,                         &
              XZZ,XZHAT,ZJ,XDXX,XDYY,CLBCX,CLBCY,                 &
-             XREFMASS,XMASS_O_PHI0,XLINMASS,                      &
+             XREFMASS,XMASS_O_PHI0,XLINMASS,                     &
              XRHODREF,XTHVREF,XRVREF,XEXNREF,XRHODJ              )
 !-------------------------------------------------------------------------------
 !
diff --git a/src/MNH/init_mnh.f90 b/src/MNH/init_mnh.f90
index f7219dbb2..8f09d9f73 100644
--- a/src/MNH/init_mnh.f90
+++ b/src/MNH/init_mnh.f90
@@ -241,7 +241,7 @@ DO JMI=1,NMODEL
     !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)%CNAME)
+    CALL INI_SPECTRE_n(JMI,YLUOUT(JMI),TZINIFILE(JMI))
   END IF  
 END DO
 !
diff --git a/src/MNH/set_grid.f90 b/src/MNH/set_grid.f90
index 09476616c..93c40d04c 100644
--- a/src/MNH/set_grid.f90
+++ b/src/MNH/set_grid.f90
@@ -14,7 +14,7 @@
 !
 INTERFACE
 !
-      SUBROUTINE SET_GRID(KMI,HINIFILE,HLUOUT,                                &
+      SUBROUTINE SET_GRID(KMI,TPINIFILE,HLUOUT,                               &
                           KIU,KJU,KKU,KIMAX_ll,KJMAX_ll,                      &
                           PBMX1,PBMX2,PBMX3,PBMX4,PBMY1,PBMY2,PBMY3,PBMY4,    &
                           PBFX1,PBFX2,PBFX3,PBFX4,PBFY1,PBFY2,PBFY3,PBFY4,    &
@@ -29,10 +29,10 @@ INTERFACE
                           KBAK_NUMB,KOUT_NUMB,TPBACKUPN,TPOUTPUTN             )
 !
 USE MODD_TYPE_DATE
-USE MODD_IO_ll, ONLY:TOUTBAK
+USE MODD_IO_ll, ONLY: TFILEDATA,TOUTBAK
 !
 INTEGER,                INTENT(IN)  :: KMI       ! Model index
-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)  :: KIU       ! Upper dimension in x direction
@@ -41,9 +41,9 @@ INTEGER,                INTENT(IN)  :: KJU       ! Upper dimension in y directio
                                                  ! for sub-domain arrays
 INTEGER,                INTENT(IN)  :: KKU       ! Upper dimension in z direction
                                                  ! for domain arrays
-INTEGER,               INTENT(IN)   :: KIMAX_ll  !  Dimensions  in x direction
+INTEGER,                INTENT(IN)  :: KIMAX_ll  !  Dimensions  in x direction
                                                  ! of the physical domain,
-INTEGER,               INTENT(IN)   :: KJMAX_ll  !  Dimensions  in y direction
+INTEGER,                INTENT(IN)  :: KJMAX_ll  !  Dimensions  in y direction
                                                  ! of the physical domain,
 REAL, DIMENSION(:), INTENT(IN) :: PBMX1,PBMX2,PBMX3,PBMX4 ! Mass points in X-direc.
 REAL, DIMENSION(:), INTENT(IN) :: PBMY1,PBMY2,PBMY3,PBMY4 ! Mass points in Y-direc.
@@ -105,7 +105,7 @@ END MODULE MODI_SET_GRID
 !
 !
 !     #########################################################################
-      SUBROUTINE SET_GRID(KMI,HINIFILE,HLUOUT,                                &
+      SUBROUTINE SET_GRID(KMI,TPINIFILE,HLUOUT,                               &
                           KIU,KJU,KKU,KIMAX_ll,KJMAX_ll,                      &
                           PBMX1,PBMX2,PBMX3,PBMX4,PBMY1,PBMY2,PBMY3,PBMY4,    &
                           PBFX1,PBFX2,PBFX3,PBFX4,PBFY1,PBFY2,PBFY3,PBFY4,    &
@@ -243,7 +243,7 @@ USE MODD_PARAMETERS
 USE MODD_CONF
 USE MODD_CONF_n
 USE MODD_GRID
-USE MODD_IO_ll, ONLY:TOUTBAK
+USE MODD_IO_ll, ONLY:TFILEDATA,TOUTBAK
 USE MODD_BUDGET
 USE MODD_DYN
 USE MODD_NESTING
@@ -263,7 +263,7 @@ IMPLICIT NONE
 !*       0.1   declarations of argument
 !
 INTEGER,                INTENT(IN)  :: KMI       ! Model index
-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)  :: KIU       ! Upper dimension in x direction
@@ -333,11 +333,7 @@ REAL, DIMENSION(:), ALLOCATABLE   :: ZYHAT_ll    !   Position y in the conformal
                                                  ! plane (array on the complete domain)
 REAL                         :: ZXHATM,ZYHATM    ! coordinates of mass point
 REAL                         :: ZLATORI, ZLONORI ! lat and lon of left-bottom point
-INTEGER                :: IGRID,ILENCH,IRESP  !   File
-CHARACTER (LEN=16)     :: YRECFM              ! management
-CHARACTER (LEN=100)    :: YCOMMENT            ! variables
-CHARACTER (LEN=2)      :: YDIR                !
-INTEGER, DIMENSION(3)  :: ITDATE           ! date array
+INTEGER                :: IRESP
 CHARACTER (LEN=40)     :: YTITLE                    ! Title for date print
 INTEGER                :: ILUOUT                    ! Logical unit number for
                                                     ! output-listing
@@ -348,59 +344,43 @@ INTEGER                :: IIUP,IJUP ,ISUP=1         ! size  of working
 INTEGER                :: IMASDEV                   ! masdev of the file
 !-------------------------------------------------------------------------------
 !
-YRECFM='MASDEV'
-YDIR='--'
-CALL FMREAD(HINIFILE,YRECFM,HLUOUT,YDIR,IMASDEV,IGRID,ILENCH,YCOMMENT,IRESP)
+CALL IO_READ_FIELD(TPINIFILE,'MASDEV',IMASDEV)
 !
 !*       1.    READ GRID  VARIABLES IN INITIAL FILE
 !              ------------------------------------
 !
 !*       1.1   Spatial grid
 !
-  YRECFM='STORAGE_TYPE'
-  YDIR='--'
-  CALL FMREAD(HINIFILE,YRECFM,HLUOUT,YDIR,CSTORAGE_TYPE,IGRID,ILENCH,YCOMMENT,IRESP)
-  IF (IRESP /= 0) CSTORAGE_TYPE='TT'
-  !
+CALL IO_READ_FIELD(TPINIFILE,'STORAGE_TYPE',CSTORAGE_TYPE,IRESP)
+IF (IRESP /= 0) CSTORAGE_TYPE='TT'
+!
 IF (KMI == 1) THEN
-  YRECFM='LON0'     ! this parameter is also useful in the cartesian to
-  YDIR='--'        ! compute the sun position for the radiation scheme
-  CALL FMREAD(HINIFILE,YRECFM,HLUOUT,YDIR,XLON0,IGRID,ILENCH,YCOMMENT,IRESP)
+  ! this parameter is also useful in the cartesian to
+  ! compute the sun position for the radiation scheme
+  CALL IO_READ_FIELD(TPINIFILE,'LON0',XLON0)
   !
-  YRECFM='LAT0'     ! this parameter is also useful in the cartesian to
-  YDIR='--'        ! compute the Coriolis parameter
-  CALL FMREAD(HINIFILE,YRECFM,HLUOUT,YDIR,XLAT0,IGRID,ILENCH,YCOMMENT,IRESP)
+  ! this parameter is also useful in the cartesian to
+  ! compute the Coriolis parameter
+  CALL IO_READ_FIELD(TPINIFILE,'LAT0',XLAT0)
   !
-  YRECFM='BETA'     ! this parameter is also useful in the cartesian to
-  YDIR='--'           ! rotate the simulatin domain
-  CALL FMREAD(HINIFILE,YRECFM,HLUOUT,YDIR,XBETA,IGRID,ILENCH,YCOMMENT,IRESP)
+  ! this parameter is also useful in the cartesian to
+  ! rotate the simulatin domain
+  CALL IO_READ_FIELD(TPINIFILE,'BETA',XBETA)
 END IF
 !
-YRECFM='XHAT'
-YDIR='XX'
-CALL FMREAD(HINIFILE,YRECFM,HLUOUT,YDIR,PXHAT,IGRID,ILENCH,YCOMMENT,IRESP)
-!
-YRECFM='YHAT'
-YDIR='YY'
-CALL FMREAD(HINIFILE,YRECFM,HLUOUT,YDIR,PYHAT,IGRID,ILENCH,YCOMMENT,IRESP)
+CALL IO_READ_FIELD(TPINIFILE,'XHAT',PXHAT)
+CALL IO_READ_FIELD(TPINIFILE,'YHAT',PYHAT)
 !
 IF (.NOT.LCARTESIAN) THEN
-  YRECFM='RPK'
-  YDIR='--'
-  CALL FMREAD(HINIFILE,YRECFM,HLUOUT,YDIR,XRPK,IGRID,ILENCH,YCOMMENT,IRESP)
+  CALL IO_READ_FIELD(TPINIFILE,'RPK',XRPK)
   !
   IF (IMASDEV > 45) THEN
-    YRECFM='LONORI'
-    YDIR='--'
-    CALL FMREAD(HINIFILE,YRECFM,HLUOUT,YDIR,PLONORI,IGRID,ILENCH,YCOMMENT,IRESP)
-  !
-    YRECFM='LATORI'
-    YDIR='--'
-    CALL FMREAD(HINIFILE,YRECFM,HLUOUT,YDIR,PLATORI,IGRID,ILENCH,YCOMMENT,IRESP)
+    CALL IO_READ_FIELD(TPINIFILE,'LONORI',PLONORI)
+    CALL IO_READ_FIELD(TPINIFILE,'LATORI',PLATORI)
   !
   ELSE                     
-    CALL FMREAD(HINIFILE,'LONOR',HLUOUT,'--',PLONORI,IGRID,ILENCH,YCOMMENT,IRESP)
-    CALL FMREAD(HINIFILE,'LATOR',HLUOUT,'--',PLATORI,IGRID,ILENCH,YCOMMENT,IRESP)
+    CALL IO_READ_FIELD(TPINIFILE,'LONOR',PLONORI)
+    CALL IO_READ_FIELD(TPINIFILE,'LATOR',PLATORI)
     ALLOCATE(ZXHAT_ll(KIMAX_ll+ 2 * JPHEXT),ZYHAT_ll(KJMAX_ll+2 * JPHEXT))
     CALL GATHERALL_FIELD_ll('XX',PXHAT,ZXHAT_ll,IRESP) !//
     CALL GATHERALL_FIELD_ll('YY',PYHAT,ZYHAT_ll,IRESP) !//
@@ -414,13 +394,8 @@ IF (.NOT.LCARTESIAN) THEN
   !
 END IF
 
-YRECFM='ZS'
-YDIR='XY'
-CALL FMREAD(HINIFILE,YRECFM,HLUOUT,YDIR,PZS,IGRID,ILENCH,YCOMMENT,IRESP)
-!
-YRECFM='ZHAT'
-YDIR='--'
-CALL FMREAD(HINIFILE,YRECFM,HLUOUT,YDIR,PZHAT,IGRID,ILENCH,YCOMMENT,IRESP)
+CALL IO_READ_FIELD(TPINIFILE,'ZS',PZS)
+CALL IO_READ_FIELD(TPINIFILE,'ZHAT',PZHAT)
 !
 CALL DEFAULT_SLEVE(OSLEVE,PLEN1,PLEN2)
 !
@@ -428,64 +403,25 @@ IF (IMASDEV<=46) THEN
   PZSMT  = PZS
   OSLEVE = .FALSE.
 ELSE
-  YRECFM='SLEVE'
-  YDIR='--'
-  CALL FMREAD(HINIFILE,YRECFM,HLUOUT,YDIR,OSLEVE,IGRID,ILENCH,YCOMMENT,IRESP)
-  !
-  YRECFM='ZSMT'
-  YDIR='XY'
-  CALL FMREAD(HINIFILE,YRECFM,HLUOUT,YDIR,PZSMT,IGRID,ILENCH,YCOMMENT,IRESP)
+  CALL IO_READ_FIELD(TPINIFILE,'ZSMT',PZSMT)
+  CALL IO_READ_FIELD(TPINIFILE,'SLEVE',OSLEVE)
 END IF
 !
 IF (OSLEVE) THEN
-  YRECFM='LEN1'
-  YDIR='--'
-  CALL FMREAD(HINIFILE,YRECFM,HLUOUT,YDIR,PLEN1,IGRID,ILENCH,YCOMMENT,IRESP)
-  !
-  YRECFM='LEN2'
-  YDIR='--'
-  CALL FMREAD(HINIFILE,YRECFM,HLUOUT,YDIR,PLEN2,IGRID,ILENCH,YCOMMENT,IRESP)
+  CALL IO_READ_FIELD(TPINIFILE,'LEN1',PLEN1)
+  CALL IO_READ_FIELD(TPINIFILE,'LEN2',PLEN2)
 END IF
 !
 !*       1.2   Temporal grid
 !
+CALL IO_READ_FIELD(TPINIFILE,'DTMOD',TPDTMOD)
+CALL IO_READ_FIELD(TPINIFILE,'DTCUR',TPDTCUR)
+!
 IF (KMI == 1) THEN
-  YRECFM='DTEXP%TDATE'
-  YDIR='--'
-  CALL FMREAD(HINIFILE,YRECFM,HLUOUT,YDIR,ITDATE,IGRID,ILENCH,YCOMMENT,IRESP)
-  TDTEXP%TDATE=DATE(ITDATE(1),ITDATE(2),ITDATE(3))
-  YRECFM='DTEXP%TIME'
-  YDIR='--'
-  CALL FMREAD(HINIFILE,YRECFM,HLUOUT,YDIR,TDTEXP%TIME,IGRID,ILENCH,           &
-             YCOMMENT,IRESP)
+CALL IO_READ_FIELD(TPINIFILE,'DTEXP',TDTEXP)
 END IF
 !
-YRECFM='DTCUR%TDATE'
-YDIR='--'
-CALL FMREAD(HINIFILE,YRECFM,HLUOUT,YDIR,ITDATE,IGRID,ILENCH,YCOMMENT,IRESP)
-TPDTCUR%TDATE=DATE(ITDATE(1),ITDATE(2),ITDATE(3))
-YRECFM='DTCUR%TIME'
-YDIR='--'
-CALL FMREAD(HINIFILE,YRECFM,HLUOUT,YDIR,TPDTCUR%TIME,IGRID,ILENCH,           &
-            YCOMMENT,IRESP)
-!
-YRECFM='DTMOD%TDATE'
-YDIR='--'
-CALL FMREAD(HINIFILE,YRECFM,HLUOUT,YDIR,ITDATE,IGRID,ILENCH,YCOMMENT,IRESP)
-TPDTMOD%TDATE=DATE(ITDATE(1),ITDATE(2),ITDATE(3))
-YRECFM='DTMOD%TIME'
-YDIR='--'
-CALL FMREAD(HINIFILE,YRECFM,HLUOUT,YDIR,TPDTMOD%TIME,IGRID,ILENCH,           &
-            YCOMMENT,IRESP)
-!
-YRECFM='DTSEG%TDATE'
-YDIR='--'
-CALL FMREAD(HINIFILE,YRECFM,HLUOUT,YDIR,ITDATE,IGRID,ILENCH,YCOMMENT,IRESP)
-TDTSEG%TDATE=DATE(ITDATE(1),ITDATE(2),ITDATE(3))
-YRECFM='DTSEG%TIME'
-YDIR='--'
-CALL FMREAD(HINIFILE,YRECFM,HLUOUT,YDIR,TDTSEG%TIME,IGRID,ILENCH,           &
-            YCOMMENT,IRESP)
+CALL IO_READ_FIELD(TPINIFILE,'DTSEG',TDTSEG)
 !
 !-------------------------------------------------------------------------------
 !
-- 
GitLab