From bdf2fa6fd549c0f146cefc4cc35ef03e278c9fc9 Mon Sep 17 00:00:00 2001
From: Philippe WAUTELET <philippe.wautelet@aero.obs-mip.fr>
Date: Tue, 22 Sep 2020 10:13:55 +0200
Subject: [PATCH] Philippe 22/09/2020: add IO_Format_read_select subroutine

---
 src/LIB/SURCOUCHE/src/mode_io_field_read.f90 | 406 +++++++------------
 1 file changed, 151 insertions(+), 255 deletions(-)

diff --git a/src/LIB/SURCOUCHE/src/mode_io_field_read.f90 b/src/LIB/SURCOUCHE/src/mode_io_field_read.f90
index 8e99f4161..e14424891 100644
--- a/src/LIB/SURCOUCHE/src/mode_io_field_read.f90
+++ b/src/LIB/SURCOUCHE/src/mode_io_field_read.f90
@@ -16,6 +16,7 @@
 !  P. Wautelet 26/04/2019: use modd_precision parameters for datatypes of MPI communications
 !  P. Wautelet 25/06/2019: added IO_Field_read for 3D integer arrays (IO_Field_read_byname_N3 and IO_Field_read_byfield_N3)
 !  J. Escobar  11/02/2020: for GA & // IO, add update_halo + sync, & mpi_allreduce for error handling in // IO
+!  P. Wautelet 22/09/2020: add IO_Format_read_select subroutine
 !-----------------------------------------------------------------
 
 MODULE MODE_IO_FIELD_READ
@@ -96,6 +97,21 @@ END IF
 END SUBROUTINE IO_File_read_check
 
 
+subroutine IO_Format_read_select( tpfile, olfi, onc4 )
+type(tfiledata), intent(in)  :: tpfile ! File structure
+logical,         intent(out) :: olfi   ! Read in LFI format?
+logical,         intent(out) :: onc4   ! Read in netCDF format?
+
+olfi = .false.
+onc4 = .false.
+if ( tpfile%cformat == 'LFI' )                                     olfi = .true.
+#ifdef MNH_IOCDF4
+if ( tpfile%cformat == 'NETCDF4' .or. tpfile%cformat == 'LFICDF4') onc4 = .true.
+#endif
+
+end subroutine IO_Format_read_select
+
+
 SUBROUTINE IO_Field_metadata_bcast(TPFILE,TPFIELD)
 TYPE(TFILEDATA),  INTENT(IN)    :: TPFILE
 TYPE(TFIELDDATA), INTENT(INOUT) :: TPFIELD
@@ -149,31 +165,24 @@ INTEGER,OPTIONAL, INTENT(OUT)   :: KRESP    ! return-code
 !
 INTEGER                      :: IERR
 INTEGER                      :: IRESP
+logical                      :: glfi, gnc4
 !
 CALL PRINT_MSG(NVERB_DEBUG,'IO','IO_Field_read_byfield_X0',TRIM(TPFILE%CNAME)//': reading '//TRIM(TPFIELD%CMNHNAME))
 !
 IRESP = 0
 !
 CALL IO_File_read_check(TPFILE,'IO_Field_read_byfield_X0',IRESP)
-!
+
+call IO_Format_read_select( tpfile, glfi, gnc4 )
+
 IF (IRESP==0) THEN
   IF (GSMONOPROC) THEN ! sequential execution
-      IF (TPFILE%CFORMAT=='NETCDF4') THEN
-         CALL IO_Field_read_nc4(TPFILE,TPFIELD,PFIELD,IRESP)
-      ELSE IF (TPFILE%CFORMAT=='LFI') THEN
-         CALL IO_Field_read_lfi(TPFILE,TPFIELD,PFIELD,IRESP)
-      ELSE IF (TPFILE%CFORMAT=='LFICDF4') THEN
-        CALL IO_Field_read_nc4(TPFILE,TPFIELD,PFIELD,IRESP)
-      END IF
+    if ( gnc4 ) call IO_Field_read_nc4( tpfile, tpfield, pfield, iresp )
+    if ( glfi ) call IO_Field_read_lfi( tpfile, tpfield, pfield, iresp )
   ELSE
     IF (ISP == TPFILE%NMASTER_RANK)  THEN
-      IF (TPFILE%CFORMAT=='NETCDF4') THEN
-         CALL IO_Field_read_nc4(TPFILE,TPFIELD,PFIELD,IRESP)
-      ELSE IF (TPFILE%CFORMAT=='LFI') THEN
-         CALL IO_Field_read_lfi(TPFILE,TPFIELD,PFIELD,IRESP)
-      ELSE IF (TPFILE%CFORMAT=='LFICDF4') THEN
-        CALL IO_Field_read_nc4(TPFILE,TPFIELD,PFIELD,IRESP)
-      END IF
+      if ( gnc4 ) call IO_Field_read_nc4( tpfile, tpfield, pfield, iresp )
+      if ( glfi ) call IO_Field_read_lfi( tpfile, tpfield, pfield, iresp )
     END IF
     !
     CALL MPI_BCAST(IRESP,1,MNHINT_MPI,TPFILE%NMASTER_RANK-1,TPFILE%NMPICOMM,IERR)
@@ -239,6 +248,7 @@ TYPE(ZONE_ll),DIMENSION(ISNPROC),OPTIONAL,INTENT(IN) :: TPSPLITTING  ! splitting
 INTEGER                      :: IERR
 REAL,DIMENSION(:),POINTER    :: ZFIELDP
 LOGICAL                      :: GALLOC
+logical                      :: glfi, gnc4
 INTEGER                      :: IRESP
 !
 CALL PRINT_MSG(NVERB_DEBUG,'IO','IO_Field_read_byfield_X1',TRIM(TPFILE%CNAME)//': reading '//TRIM(TPFIELD%CMNHNAME))
@@ -248,26 +258,18 @@ IRESP = 0
 ZFIELDP => NULL()
 !
 CALL IO_File_read_check(TPFILE,'IO_Field_read_byfield_X1',IRESP)
-!
+
+call IO_Format_read_select( tpfile, glfi, gnc4 )
+
 IF (IRESP==0) THEN
   IF (GSMONOPROC) THEN ! sequential execution
-      IF (TPFILE%CFORMAT=='NETCDF4') THEN
-         CALL IO_Field_read_nc4(TPFILE,TPFIELD,PFIELD,IRESP)
-      ELSE IF (TPFILE%CFORMAT=='LFI') THEN
-         CALL IO_Field_read_lfi(TPFILE,TPFIELD,PFIELD,IRESP)
-      ELSE IF (TPFILE%CFORMAT=='LFICDF4') THEN
-        CALL IO_Field_read_nc4(TPFILE,TPFIELD,PFIELD,IRESP)
-      END IF
+    if ( gnc4 ) call IO_Field_read_nc4( tpfile, tpfield, pfield, iresp )
+    if ( glfi ) call IO_Field_read_lfi( tpfile, tpfield, pfield, iresp )
   ELSE
     IF (ISP == TPFILE%NMASTER_RANK)  THEN
       CALL ALLOCBUFFER_ll(ZFIELDP,PFIELD,TPFIELD%CDIR,GALLOC, KIMAX_ll, KJMAX_ll)
-      IF (TPFILE%CFORMAT=='NETCDF4') THEN
-         CALL IO_Field_read_nc4(TPFILE,TPFIELD,ZFIELDP,IRESP)
-      ELSE IF (TPFILE%CFORMAT=='LFI') THEN
-         CALL IO_Field_read_lfi(TPFILE,TPFIELD,ZFIELDP,IRESP)
-      ELSE IF (TPFILE%CFORMAT=='LFICDF4') THEN
-        CALL IO_Field_read_nc4(TPFILE,TPFIELD,ZFIELDP,IRESP)
-      END IF
+      if ( gnc4 ) call IO_Field_read_nc4( tpfile, tpfield, zfieldp, iresp )
+      if ( glfi ) call IO_Field_read_lfi( tpfile, tpfield, zfieldp, iresp )
     ELSE
       !Not really necessary but useful to suppress alerts with Valgrind
       ALLOCATE(ZFIELDP(0))
@@ -356,6 +358,7 @@ TYPE(ZONE_ll),DIMENSION(ISNPROC),OPTIONAL,INTENT(IN) :: TPSPLITTING  ! splitting
 INTEGER                      :: IERR
 REAL,DIMENSION(:,:),POINTER  :: ZFIELDP
 LOGICAL                      :: GALLOC
+logical                          :: glfi, gnc4
 INTEGER                      :: IRESP
 INTEGER                      :: IHEXTOT
 REAL(kind=MNHTIME), DIMENSION(2) :: T0, T1, T2
@@ -375,7 +378,9 @@ ZFIELDP => NULL()
 !
 IHEXTOT = 2*JPHEXT+1
 CALL IO_File_read_check(TPFILE,'IO_Field_read_byfield_X2',IRESP)
-!
+
+call IO_Format_read_select( tpfile, glfi, gnc4 )
+
 IF (IRESP==0) THEN
   IF (GSMONOPROC) THEN ! sequential execution
     IF (LPACK .AND. L1D .AND. SIZE(PFIELD,1)==IHEXTOT .AND. SIZE(PFIELD,2)==IHEXTOT) THEN
@@ -385,13 +390,8 @@ IF (IRESP==0) THEN
     ELSE
       ZFIELDP=>PFIELD(:,:)
     END IF
-    IF (TPFILE%CFORMAT=='NETCDF4') THEN
-      CALL IO_Field_read_nc4(TPFILE,TPFIELD,ZFIELDP,IRESP)
-    ELSE IF (TPFILE%CFORMAT=='LFI') THEN
-      CALL IO_Field_read_lfi(TPFILE,TPFIELD,ZFIELDP,IRESP)
-    ELSE IF (TPFILE%CFORMAT=='LFICDF4') THEN
-      CALL IO_Field_read_nc4(TPFILE,TPFIELD,ZFIELDP,IRESP)
-    END IF
+    if ( gnc4 ) call IO_Field_read_nc4( tpfile, tpfield, zfieldp, iresp )
+    if ( glfi ) call IO_Field_read_lfi( tpfile, tpfield, zfieldp, iresp )
     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
@@ -402,13 +402,8 @@ IF (IRESP==0) THEN
     IF (ISP == TPFILE%NMASTER_RANK)  THEN
       ! I/O process case
       CALL ALLOCBUFFER_ll(ZFIELDP,PFIELD,TPFIELD%CDIR,GALLOC, KIMAX_ll, KJMAX_ll)
-      IF (TPFILE%CFORMAT=='NETCDF4') THEN
-         CALL IO_Field_read_nc4(TPFILE,TPFIELD,ZFIELDP,IRESP)
-      ELSE IF (TPFILE%CFORMAT=='LFI') THEN
-         CALL IO_Field_read_lfi(TPFILE,TPFIELD,ZFIELDP,IRESP)
-      ELSE IF (TPFILE%CFORMAT=='LFICDF4') THEN
-        CALL IO_Field_read_nc4(TPFILE,TPFIELD,ZFIELDP,IRESP)
-      END IF
+      if ( gnc4 ) call IO_Field_read_nc4( tpfile, tpfield, zfieldp, iresp )
+      if ( glfi ) call IO_Field_read_lfi( tpfile, tpfield, zfieldp, iresp )
     ELSE
       !Not really necessary but useful to suppress alerts with Valgrind
       ALLOCATE(ZFIELDP(0,0))
@@ -541,6 +536,7 @@ INTEGER                               :: NB_REQ
 INTEGER,ALLOCATABLE,DIMENSION(:)      :: REQ_TAB
 INTEGER, DIMENSION(MPI_STATUS_SIZE)   :: STATUS
 LOGICAL                               :: GALLOC, GALLOC_ll
+logical                               :: glfi, gnc4
 REAL,DIMENSION(:,:),POINTER           :: TX2DP
 REAL,DIMENSION(:,:),POINTER           :: ZSLICE_ll,ZSLICE
 REAL,DIMENSION(:,:,:),POINTER         :: ZFIELDP
@@ -571,7 +567,9 @@ YDIR = TPFIELD%CDIR
 IHEXTOT = 2*JPHEXT+1
 !
 CALL IO_File_read_check(TPFILE,'IO_Field_read_byfield_X3',IRESP)
-!
+
+call IO_Format_read_select( tpfile, glfi, gnc4 )
+
 IF (IRESP==0) THEN
   IF (GSMONOPROC  .AND. TPFILE%NSUBFILES_IOZ==0 ) THEN ! sequential execution
     IF (LPACK .AND. L1D .AND. SIZE(PFIELD,1)==IHEXTOT .AND. SIZE(PFIELD,2)==IHEXTOT) THEN
@@ -581,13 +579,8 @@ IF (IRESP==0) THEN
     ELSE
       ZFIELDP=>PFIELD(:,:,:)
     END IF
-    IF (TPFILE%CFORMAT=='NETCDF4') THEN
-      CALL IO_Field_read_nc4(TPFILE,TPFIELD,ZFIELDP,IRESP)
-    ELSE IF (TPFILE%CFORMAT=='LFI') THEN
-      CALL IO_Field_read_lfi(TPFILE,TPFIELD,ZFIELDP,IRESP)
-    ELSE IF (TPFILE%CFORMAT=='LFICDF4') THEN
-      CALL IO_Field_read_nc4(TPFILE,TPFIELD,ZFIELDP,IRESP)
-    END IF
+    if ( gnc4 ) call IO_Field_read_nc4( tpfile, tpfield, zfieldp, iresp )
+    if ( glfi ) call IO_Field_read_lfi( tpfile, tpfield, zfieldp, iresp )
     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
@@ -597,13 +590,8 @@ IF (IRESP==0) THEN
     IF (ISP == TPFILE%NMASTER_RANK)  THEN
       ! I/O process case
       CALL ALLOCBUFFER_ll(ZFIELDP,PFIELD,YDIR,GALLOC)
-      IF (TPFILE%CFORMAT=='NETCDF4') THEN
-        CALL IO_Field_read_nc4(TPFILE,TPFIELD,ZFIELDP,IRESP)
-      ELSE IF (TPFILE%CFORMAT=='LFI') THEN
-        CALL IO_Field_read_lfi(TPFILE,TPFIELD,ZFIELDP,IRESP)
-      ELSE IF (TPFILE%CFORMAT=='LFICDF4') THEN
-        CALL IO_Field_read_nc4(TPFILE,TPFIELD,ZFIELDP,IRESP)
-      END IF
+      if ( gnc4 ) call IO_Field_read_nc4( tpfile, tpfield, zfieldp, iresp )
+      if ( glfi ) call IO_Field_read_lfi( tpfile, tpfield, zfieldp, iresp )
     ELSE
       !Not really necessary but useful to suppress alerts with Valgrind
       ALLOCATE(ZFIELDP(0,0,0))
@@ -669,13 +657,9 @@ IF (IRESP==0) THEN
         CALL SECOND_MNH2(T0)
         WRITE(YK,'(I4.4)')  JKK
         YRECZSLICE = TRIM(TPFIELD%CMNHNAME)//YK
-        IF (TPFILE%CFORMAT=='NETCDF4') THEN
-          CALL IO_Field_read_nc4(TZFILE,TZFIELD,ZSLICE_ll,IRESP_TMP)
-        ELSE IF (TPFILE%CFORMAT=='LFI') THEN
-          CALL IO_Field_read_lfi(TZFILE,TZFIELD,ZSLICE_ll,IRESP_TMP)
-        ELSE IF (TPFILE%CFORMAT=='LFICDF4') THEN
-          CALL IO_Field_read_nc4(TZFILE,TZFIELD,ZSLICE_ll,IRESP_TMP)
-        END IF
+        call IO_Format_read_select( tzfile, glfi, gnc4 ) !Safer to do that (probably useless)
+        if ( gnc4 ) call IO_Field_read_nc4( tzfile, tzfield, zslice_ll, iresp_tmp )
+        if ( glfi ) call IO_Field_read_lfi( tzfile, tzfield, zslice_ll, iresp_tmp )
         IF (IRESP_TMP .NE. 0 ) IRESP_ISP = IRESP_TMP
         CALL SECOND_MNH2(T1)
         TIMEZ%T_READ3D_READ=TIMEZ%T_READ3D_READ + T1 - T0
@@ -741,13 +725,9 @@ IF (IRESP==0) THEN
           CALL SECOND_MNH2(T0)
           WRITE(YK,'(I4.4)')  JKK
           YRECZSLICE = TRIM(TPFIELD%CMNHNAME)//YK
-          IF (TZFILE%CFORMAT=='NETCDF4') THEN
-            CALL IO_Field_read_nc4(TZFILE,TZFIELD,ZSLICE_ll,IRESP_TMP)
-          ELSE IF (TZFILE%CFORMAT=='LFI') THEN
-            CALL IO_Field_read_lfi(TZFILE,TZFIELD,ZSLICE_ll,IRESP_TMP)
-          ELSE IF (TZFILE%CFORMAT=='LFICDF4') THEN
-            CALL IO_Field_read_nc4(TZFILE,TZFIELD,ZSLICE_ll,IRESP_TMP)
-          END IF
+          call IO_Format_read_select( tzfile, glfi, gnc4 ) !Safer to do that (probably useless)
+          if ( gnc4 ) call IO_Field_read_nc4( tzfile, tzfield, zslice_ll, iresp_tmp )
+          if ( glfi ) call IO_Field_read_lfi( tzfile, tzfield, zslice_ll, iresp_tmp )
           IF (IRESP_TMP .NE. 0 ) IRESP_ISP = IRESP_TMP
           CALL SECOND_MNH2(T1)
           TIMEZ%T_READ3D_READ=TIMEZ%T_READ3D_READ + T1 - T0
@@ -893,6 +873,7 @@ INTEGER, OPTIONAL,             INTENT(OUT)   :: KRESP    ! return-code
 INTEGER                          :: IERR
 REAL,DIMENSION(:,:,:,:),POINTER  :: ZFIELDP
 LOGICAL                          :: GALLOC
+logical                          :: glfi, gnc4
 INTEGER                          :: IRESP
 INTEGER                          :: IHEXTOT
 !
@@ -904,7 +885,9 @@ ZFIELDP => NULL()
 !
 IHEXTOT = 2*JPHEXT+1
 CALL IO_File_read_check(TPFILE,'IO_Field_read_byfield_X4',IRESP)
-!
+
+call IO_Format_read_select( tpfile, glfi, gnc4 )
+
 IF (IRESP==0) THEN
   IF (GSMONOPROC) THEN ! sequential execution
     IF (LPACK .AND. L1D .AND. SIZE(PFIELD,1)==IHEXTOT .AND. SIZE(PFIELD,2)==IHEXTOT) THEN
@@ -914,13 +897,8 @@ IF (IRESP==0) THEN
     ELSE
       ZFIELDP=>PFIELD(:,:,:,:)
     END IF
-    IF (TPFILE%CFORMAT=='NETCDF4') THEN
-      CALL IO_Field_read_nc4(TPFILE,TPFIELD,ZFIELDP,IRESP)
-    ELSE IF (TPFILE%CFORMAT=='LFI') THEN
-      CALL IO_Field_read_lfi(TPFILE,TPFIELD,ZFIELDP,IRESP)
-    ELSE IF (TPFILE%CFORMAT=='LFICDF4') THEN
-      CALL IO_Field_read_nc4(TPFILE,TPFIELD,ZFIELDP,IRESP)
-    END IF
+    if ( gnc4 ) call IO_Field_read_nc4( tpfile, tpfield, zfieldp, iresp )
+    if ( glfi ) call IO_Field_read_lfi( tpfile, tpfield, zfieldp, iresp )
     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
@@ -930,13 +908,8 @@ IF (IRESP==0) THEN
     IF (ISP == TPFILE%NMASTER_RANK)  THEN
       ! I/O process case
       CALL ALLOCBUFFER_ll(ZFIELDP,PFIELD,TPFIELD%CDIR,GALLOC)
-      IF (TPFILE%CFORMAT=='NETCDF4') THEN
-         CALL IO_Field_read_nc4(TPFILE,TPFIELD,ZFIELDP,IRESP)
-      ELSE IF (TPFILE%CFORMAT=='LFI') THEN
-         CALL IO_Field_read_lfi(TPFILE,TPFIELD,ZFIELDP,IRESP)
-      ELSE IF (TPFILE%CFORMAT=='LFICDF4') THEN
-        CALL IO_Field_read_nc4(TPFILE,TPFIELD,ZFIELDP,IRESP)
-      END IF
+      if ( gnc4 ) call IO_Field_read_nc4( tpfile, tpfield, zfieldp, iresp )
+      if ( glfi ) call IO_Field_read_lfi( tpfile, tpfield, zfieldp, iresp )
     ELSE
       !Not really necessary but useful to suppress alerts with Valgrind
       ALLOCATE(ZFIELDP(0,0,0,0))
@@ -1014,6 +987,7 @@ INTEGER, OPTIONAL,               INTENT(OUT)   :: KRESP    ! return-code
 INTEGER                            :: IERR
 REAL,DIMENSION(:,:,:,:,:),POINTER  :: ZFIELDP
 LOGICAL                            :: GALLOC
+logical                            :: glfi, gnc4
 INTEGER                            :: IRESP
 INTEGER                            :: IHEXTOT
 !
@@ -1025,7 +999,9 @@ ZFIELDP => NULL()
 !
 IHEXTOT = 2*JPHEXT+1
 CALL IO_File_read_check(TPFILE,'IO_Field_read_byfield_X5',IRESP)
-!
+
+call IO_Format_read_select( tpfile, glfi, gnc4 )
+
 IF (IRESP==0) THEN
   IF (GSMONOPROC) THEN ! sequential execution
     IF (LPACK .AND. L1D .AND. SIZE(PFIELD,1)==IHEXTOT .AND. SIZE(PFIELD,2)==IHEXTOT) THEN
@@ -1035,13 +1011,8 @@ IF (IRESP==0) THEN
     ELSE
       ZFIELDP=>PFIELD(:,:,:,:,:)
     END IF
-    IF (TPFILE%CFORMAT=='NETCDF4') THEN
-      CALL IO_Field_read_nc4(TPFILE,TPFIELD,ZFIELDP,IRESP)
-    ELSE IF (TPFILE%CFORMAT=='LFI') THEN
-      CALL IO_Field_read_lfi(TPFILE,TPFIELD,ZFIELDP,IRESP)
-    ELSE IF (TPFILE%CFORMAT=='LFICDF4') THEN
-      CALL IO_Field_read_nc4(TPFILE,TPFIELD,ZFIELDP,IRESP)
-    END IF
+    if ( gnc4 ) call IO_Field_read_nc4( tpfile, tpfield, zfieldp, iresp )
+    if ( glfi ) call IO_Field_read_lfi( tpfile, tpfield, zfieldp, iresp )
     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
@@ -1051,13 +1022,8 @@ IF (IRESP==0) THEN
     IF (ISP == TPFILE%NMASTER_RANK)  THEN
       ! I/O process case
       CALL ALLOCBUFFER_ll(ZFIELDP,PFIELD,TPFIELD%CDIR,GALLOC)
-      IF (TPFILE%CFORMAT=='NETCDF4') THEN
-         CALL IO_Field_read_nc4(TPFILE,TPFIELD,ZFIELDP,IRESP)
-      ELSE IF (TPFILE%CFORMAT=='LFI') THEN
-         CALL IO_Field_read_lfi(TPFILE,TPFIELD,ZFIELDP,IRESP)
-      ELSE IF (TPFILE%CFORMAT=='LFICDF4') THEN
-        CALL IO_Field_read_nc4(TPFILE,TPFIELD,ZFIELDP,IRESP)
-      END IF
+      if ( gnc4 ) call IO_Field_read_nc4( tpfile, tpfield, zfieldp, iresp )
+      if ( glfi ) call IO_Field_read_lfi( tpfile, tpfield, zfieldp, iresp )
     ELSE
       !Not really necessary but useful to suppress alerts with Valgrind
       ALLOCATE(ZFIELDP(0,0,0,0,0))
@@ -1119,7 +1085,7 @@ END SUBROUTINE IO_Field_read_byname_X6
 
 SUBROUTINE IO_Field_read_byfield_X6(TPFILE,TPFIELD,PFIELD,KRESP)
 !
-USE MODD_IO,             ONLY: GSMONOPROC,ISP,LPACK,L1D,L2D
+USE MODD_IO,             ONLY: GSMONOPROC, ISP
 USE MODD_PARAMETERS_ll,  ONLY: JPHEXT
 USE MODD_TIMEZ,          ONLY: TIMEZ
 !
@@ -1135,6 +1101,7 @@ INTEGER, OPTIONAL,                 INTENT(OUT)   :: KRESP    ! return-code
 INTEGER                              :: IERR
 REAL,DIMENSION(:,:,:,:,:,:),POINTER  :: ZFIELDP
 LOGICAL                              :: GALLOC
+logical                              :: glfi, gnc4
 INTEGER                              :: IRESP
 INTEGER                              :: IHEXTOT
 !
@@ -1146,27 +1113,19 @@ ZFIELDP => NULL()
 !
 IHEXTOT = 2*JPHEXT+1
 CALL IO_File_read_check(TPFILE,'IO_Field_read_byfield_X6',IRESP)
-!
+
+call IO_Format_read_select( tpfile, glfi, gnc4 )
+
 IF (IRESP==0) THEN
   IF (GSMONOPROC) THEN ! sequential execution
-    IF (TPFILE%CFORMAT=='NETCDF4') THEN
-      CALL IO_Field_read_nc4(TPFILE,TPFIELD,PFIELD,IRESP)
-    ELSE IF (TPFILE%CFORMAT=='LFI') THEN
-      CALL IO_Field_read_lfi(TPFILE,TPFIELD,PFIELD,IRESP)
-    ELSE IF (TPFILE%CFORMAT=='LFICDF4') THEN
-      CALL IO_Field_read_nc4(TPFILE,TPFIELD,PFIELD,IRESP)
-    END IF
+    if ( gnc4 ) call IO_Field_read_nc4( tpfile, tpfield, pfield, iresp )
+    if ( glfi ) call IO_Field_read_lfi( tpfile, tpfield, pfield, iresp )
   ELSE
     IF (ISP == TPFILE%NMASTER_RANK)  THEN
       ! I/O process case
       CALL ALLOCBUFFER_ll(ZFIELDP,PFIELD,TPFIELD%CDIR,GALLOC)
-      IF (TPFILE%CFORMAT=='NETCDF4') THEN
-         CALL IO_Field_read_nc4(TPFILE,TPFIELD,ZFIELDP,IRESP)
-      ELSE IF (TPFILE%CFORMAT=='LFI') THEN
-         CALL IO_Field_read_lfi(TPFILE,TPFIELD,ZFIELDP,IRESP)
-      ELSE IF (TPFILE%CFORMAT=='LFICDF4') THEN
-        CALL IO_Field_read_nc4(TPFILE,TPFIELD,ZFIELDP,IRESP)
-      END IF
+      if ( gnc4 ) call IO_Field_read_nc4( tpfile, tpfield, zfieldp, iresp )
+      if ( glfi ) call IO_Field_read_lfi( tpfile, tpfield, zfieldp, iresp )
     ELSE
       !Not really necessary but useful to suppress alerts with Valgrind
       ALLOCATE(ZFIELDP(0,0,0,0,0,0))
@@ -1231,31 +1190,24 @@ INTEGER,OPTIONAL, INTENT(OUT)   :: KRESP    ! return-code
 !
 INTEGER                      :: IERR
 INTEGER                      :: IRESP
+logical                      :: glfi, gnc4
 !
 CALL PRINT_MSG(NVERB_DEBUG,'IO','IO_Field_read_byfield_N0',TRIM(TPFILE%CNAME)//': reading '//TRIM(TPFIELD%CMNHNAME))
 !
 IRESP = 0
 !
 CALL IO_File_read_check(TPFILE,'IO_Field_read_byfield_N0',IRESP)
-!
+
+call IO_Format_read_select( tpfile, glfi, gnc4 )
+
 IF (IRESP==0) THEN
   IF (GSMONOPROC) THEN ! sequential execution
-      IF (TPFILE%CFORMAT=='NETCDF4') THEN
-         CALL IO_Field_read_nc4(TPFILE,TPFIELD,KFIELD,IRESP)
-      ELSE IF (TPFILE%CFORMAT=='LFI') THEN
-         CALL IO_Field_read_lfi(TPFILE,TPFIELD,KFIELD,IRESP)
-      ELSE IF (TPFILE%CFORMAT=='LFICDF4') THEN
-        CALL IO_Field_read_nc4(TPFILE,TPFIELD,KFIELD,IRESP)
-      END IF
+    if ( gnc4 ) call IO_Field_read_nc4( tpfile, tpfield, kfield, iresp )
+    if ( glfi ) call IO_Field_read_lfi( tpfile, tpfield, kfield, iresp )
   ELSE
     IF (ISP == TPFILE%NMASTER_RANK)  THEN
-      IF (TPFILE%CFORMAT=='NETCDF4') THEN
-         CALL IO_Field_read_nc4(TPFILE,TPFIELD,KFIELD,IRESP)
-      ELSE IF (TPFILE%CFORMAT=='LFI') THEN
-         CALL IO_Field_read_lfi(TPFILE,TPFIELD,KFIELD,IRESP)
-      ELSE IF (TPFILE%CFORMAT=='LFICDF4') THEN
-        CALL IO_Field_read_nc4(TPFILE,TPFIELD,KFIELD,IRESP)
-      END IF
+      if ( gnc4 ) call IO_Field_read_nc4( tpfile, tpfield, kfield, iresp )
+      if ( glfi ) call IO_Field_read_lfi( tpfile, tpfield, kfield, iresp )
     END IF
     !
     CALL MPI_BCAST(IRESP,1,MNHINT_MPI,TPFILE%NMASTER_RANK-1,TPFILE%NMPICOMM,IERR)
@@ -1311,6 +1263,7 @@ INTEGER                      :: IERR
 INTEGER                      :: IRESP
 INTEGER,DIMENSION(:),POINTER :: IFIELDP
 LOGICAL                      :: GALLOC
+logical                      :: glfi, gnc4
 !
 CALL PRINT_MSG(NVERB_DEBUG,'IO','IO_Field_read_byfield_N1',TRIM(TPFILE%CNAME)//': reading '//TRIM(TPFIELD%CMNHNAME))
 !
@@ -1319,26 +1272,18 @@ IRESP = 0
 IFIELDP => NULL()
 !
 CALL IO_File_read_check(TPFILE,'IO_Field_read_byfield_N1',IRESP)
-!
+
+call IO_Format_read_select( tpfile, glfi, gnc4 )
+
 IF (IRESP==0) THEN
   IF (GSMONOPROC) THEN ! sequential execution
-      IF (TPFILE%CFORMAT=='NETCDF4') THEN
-         CALL IO_Field_read_nc4(TPFILE,TPFIELD,KFIELD,IRESP)
-      ELSE IF (TPFILE%CFORMAT=='LFI') THEN
-         CALL IO_Field_read_lfi(TPFILE,TPFIELD,KFIELD,IRESP)
-      ELSE IF (TPFILE%CFORMAT=='LFICDF4') THEN
-        CALL IO_Field_read_nc4(TPFILE,TPFIELD,KFIELD,IRESP)
-      END IF
+    if ( gnc4 ) call IO_Field_read_nc4( tpfile, tpfield, kfield, iresp )
+    if ( glfi ) call IO_Field_read_lfi( tpfile, tpfield, kfield, iresp )
   ELSE
     IF (ISP == TPFILE%NMASTER_RANK)  THEN
       CALL ALLOCBUFFER_ll(IFIELDP,KFIELD,TPFIELD%CDIR,GALLOC)
-      IF (TPFILE%CFORMAT=='NETCDF4') THEN
-         CALL IO_Field_read_nc4(TPFILE,TPFIELD,IFIELDP,IRESP)
-      ELSE IF (TPFILE%CFORMAT=='LFI') THEN
-         CALL IO_Field_read_lfi(TPFILE,TPFIELD,IFIELDP,IRESP)
-      ELSE IF (TPFILE%CFORMAT=='LFICDF4') THEN
-        CALL IO_Field_read_nc4(TPFILE,TPFIELD,IFIELDP,IRESP)
-      END IF
+      if ( gnc4 ) call IO_Field_read_nc4( tpfile, tpfield, ifieldp, iresp )
+      if ( glfi ) call IO_Field_read_lfi( tpfile, tpfield, ifieldp, iresp )
     ELSE
       !Not really necessary but useful to suppress alerts with Valgrind
       ALLOCATE(IFIELDP(0))
@@ -1407,6 +1352,7 @@ INTEGER, OPTIONAL,            INTENT(OUT)   :: KRESP    ! return-code
 INTEGER                         :: IERR
 INTEGER,DIMENSION(:,:),POINTER  :: IFIELDP
 LOGICAL                         :: GALLOC
+logical                         :: glfi, gnc4
 INTEGER                         :: IRESP
 INTEGER                         :: IHEXTOT
 !
@@ -1418,7 +1364,9 @@ IFIELDP => NULL()
 !
 IHEXTOT = 2*JPHEXT+1
 CALL IO_File_read_check(TPFILE,'IO_Field_read_byfield_N2',IRESP)
-!
+
+call IO_Format_read_select( tpfile, glfi, gnc4 )
+
 IF (IRESP==0) THEN
   IF (GSMONOPROC) THEN ! sequential execution
     IF (LPACK .AND. L1D .AND. SIZE(KFIELD,1)==IHEXTOT .AND. SIZE(KFIELD,2)==IHEXTOT) THEN
@@ -1428,13 +1376,8 @@ IF (IRESP==0) THEN
     ELSE
       IFIELDP=>KFIELD(:,:)
     END IF
-    IF (TPFILE%CFORMAT=='NETCDF4') THEN
-      CALL IO_Field_read_nc4(TPFILE,TPFIELD,IFIELDP,IRESP)
-    ELSE IF (TPFILE%CFORMAT=='LFI') THEN
-      CALL IO_Field_read_lfi(TPFILE,TPFIELD,IFIELDP,IRESP)
-    ELSE IF (TPFILE%CFORMAT=='LFICDF4') THEN
-      CALL IO_Field_read_nc4(TPFILE,TPFIELD,IFIELDP,IRESP)
-    END IF
+    if ( gnc4 ) call IO_Field_read_nc4( tpfile, tpfield, ifieldp, iresp )
+    if ( glfi ) call IO_Field_read_lfi( tpfile, tpfield, ifieldp, iresp )
     IF (LPACK .AND. L1D .AND. SIZE(KFIELD,1)==IHEXTOT .AND. SIZE(KFIELD,2)==IHEXTOT) THEN
       KFIELD(:,:)=SPREAD(SPREAD(KFIELD(JPHEXT+1,JPHEXT+1),DIM=1,NCOPIES=IHEXTOT),DIM=2,NCOPIES=IHEXTOT)
     ELSE IF (LPACK .AND. L2D .AND. SIZE(KFIELD,2)==IHEXTOT) THEN
@@ -1444,13 +1387,8 @@ IF (IRESP==0) THEN
     IF (ISP == TPFILE%NMASTER_RANK)  THEN
       ! I/O process case
       CALL ALLOCBUFFER_ll(IFIELDP,KFIELD,TPFIELD%CDIR,GALLOC)
-      IF (TPFILE%CFORMAT=='NETCDF4') THEN
-         CALL IO_Field_read_nc4(TPFILE,TPFIELD,IFIELDP,IRESP)
-      ELSE IF (TPFILE%CFORMAT=='LFI') THEN
-         CALL IO_Field_read_lfi(TPFILE,TPFIELD,IFIELDP,IRESP)
-      ELSE IF (TPFILE%CFORMAT=='LFICDF4') THEN
-        CALL IO_Field_read_nc4(TPFILE,TPFIELD,IFIELDP,IRESP)
-      END IF
+      if ( gnc4 ) call IO_Field_read_nc4( tpfile, tpfield, ifieldp, iresp )
+      if ( glfi ) call IO_Field_read_lfi( tpfile, tpfield, ifieldp, iresp )
     ELSE
       !Not really necessary but useful to suppress alerts with Valgrind
       ALLOCATE(IFIELDP(0,0))
@@ -1530,6 +1468,7 @@ INTEGER, OPTIONAL,              INTENT(OUT)   :: KRESP    ! return-code
 INTEGER                           :: IERR
 INTEGER,DIMENSION(:,:,:),POINTER  :: IFIELDP
 LOGICAL                           :: GALLOC
+logical                           :: glfi, gnc4
 INTEGER                           :: IRESP
 INTEGER                           :: IHEXTOT
 !
@@ -1541,7 +1480,9 @@ IFIELDP => NULL()
 !
 IHEXTOT = 2*JPHEXT+1
 CALL IO_File_read_check(TPFILE,'IO_Field_read_byfield_N3',IRESP)
-!
+
+call IO_Format_read_select( tpfile, glfi, gnc4 )
+
 IF (IRESP==0) THEN
   IF (GSMONOPROC) THEN ! sequential execution
     IF (LPACK .AND. L1D .AND. SIZE(KFIELD,1)==IHEXTOT .AND. SIZE(KFIELD,2)==IHEXTOT) THEN
@@ -1551,13 +1492,8 @@ IF (IRESP==0) THEN
     ELSE
       IFIELDP=>KFIELD(:,:,:)
     END IF
-    IF (TPFILE%CFORMAT=='NETCDF4') THEN
-      CALL IO_Field_read_nc4(TPFILE,TPFIELD,IFIELDP,IRESP)
-    ELSE IF (TPFILE%CFORMAT=='LFI') THEN
-      CALL IO_Field_read_lfi(TPFILE,TPFIELD,IFIELDP,IRESP)
-    ELSE IF (TPFILE%CFORMAT=='LFICDF4') THEN
-      CALL IO_Field_read_nc4(TPFILE,TPFIELD,IFIELDP,IRESP)
-    END IF
+    if ( gnc4 ) call IO_Field_read_nc4( tpfile, tpfield, ifieldp, iresp )
+    if ( glfi ) call IO_Field_read_lfi( tpfile, tpfield, ifieldp, iresp )
     IF (LPACK .AND. L1D .AND. SIZE(KFIELD,1)==IHEXTOT .AND. SIZE(KFIELD,2)==IHEXTOT) THEN
       KFIELD(:,:,:)=SPREAD(SPREAD(KFIELD(JPHEXT+1,JPHEXT+1,:),DIM=1,NCOPIES=IHEXTOT),DIM=2,NCOPIES=IHEXTOT)
     ELSE IF (LPACK .AND. L2D .AND. SIZE(KFIELD,2)==IHEXTOT) THEN
@@ -1567,13 +1503,8 @@ IF (IRESP==0) THEN
     IF (ISP == TPFILE%NMASTER_RANK)  THEN
       ! I/O process case
       CALL ALLOCBUFFER_ll(IFIELDP,KFIELD,TPFIELD%CDIR,GALLOC)
-      IF (TPFILE%CFORMAT=='NETCDF4') THEN
-         CALL IO_Field_read_nc4(TPFILE,TPFIELD,IFIELDP,IRESP)
-      ELSE IF (TPFILE%CFORMAT=='LFI') THEN
-         CALL IO_Field_read_lfi(TPFILE,TPFIELD,IFIELDP,IRESP)
-      ELSE IF (TPFILE%CFORMAT=='LFICDF4') THEN
-        CALL IO_Field_read_nc4(TPFILE,TPFIELD,IFIELDP,IRESP)
-      END IF
+      if ( gnc4 ) call IO_Field_read_nc4( tpfile, tpfield, ifieldp, iresp )
+      if ( glfi ) call IO_Field_read_lfi( tpfile, tpfield, ifieldp, iresp )
     ELSE
       !Not really necessary but useful to suppress alerts with Valgrind
       ALLOCATE(IFIELDP(0,0,0))
@@ -1647,31 +1578,24 @@ INTEGER,OPTIONAL, INTENT(OUT)   :: KRESP    ! return-code
 !
 INTEGER                      :: IERR
 INTEGER                      :: IRESP
+logical                      :: glfi, gnc4
 !
 CALL PRINT_MSG(NVERB_DEBUG,'IO','IO_Field_read_byfield_L0',TRIM(TPFILE%CNAME)//': reading '//TRIM(TPFIELD%CMNHNAME))
 !
 IRESP = 0
 !
 CALL IO_File_read_check(TPFILE,'IO_Field_read_byfield_L0',IRESP)
-!
+
+call IO_Format_read_select( tpfile, glfi, gnc4 )
+
 IF (IRESP==0) THEN
   IF (GSMONOPROC) THEN ! sequential execution
-      IF (TPFILE%CFORMAT=='NETCDF4') THEN
-         CALL IO_Field_read_nc4(TPFILE,TPFIELD,OFIELD,IRESP)
-      ELSE IF (TPFILE%CFORMAT=='LFI') THEN
-         CALL IO_Field_read_lfi(TPFILE,TPFIELD,OFIELD,IRESP)
-      ELSE IF (TPFILE%CFORMAT=='LFICDF4') THEN
-        CALL IO_Field_read_nc4(TPFILE,TPFIELD,OFIELD,IRESP)
-      END IF
+    if ( gnc4 ) call IO_Field_read_nc4( tpfile, tpfield, ofield, iresp )
+    if ( glfi ) call IO_Field_read_lfi( tpfile, tpfield, ofield, iresp )
   ELSE
     IF (ISP == TPFILE%NMASTER_RANK)  THEN
-      IF (TPFILE%CFORMAT=='NETCDF4') THEN
-         CALL IO_Field_read_nc4(TPFILE,TPFIELD,OFIELD,IRESP)
-      ELSE IF (TPFILE%CFORMAT=='LFI') THEN
-         CALL IO_Field_read_lfi(TPFILE,TPFIELD,OFIELD,IRESP)
-      ELSE IF (TPFILE%CFORMAT=='LFICDF4') THEN
-        CALL IO_Field_read_nc4(TPFILE,TPFIELD,OFIELD,IRESP)
-      END IF
+      if ( gnc4 ) call IO_Field_read_nc4( tpfile, tpfield, ofield, iresp )
+      if ( glfi ) call IO_Field_read_lfi( tpfile, tpfield, ofield, iresp )
     END IF
     !
     CALL MPI_BCAST(IRESP,1,MNHINT_MPI,TPFILE%NMASTER_RANK-1,TPFILE%NMPICOMM,IERR)
@@ -1722,31 +1646,24 @@ INTEGER,OPTIONAL,    INTENT(OUT)   :: KRESP    ! return-code
 !
 INTEGER                      :: IERR
 INTEGER                      :: IRESP
+logical                      :: glfi, gnc4
 !
 CALL PRINT_MSG(NVERB_DEBUG,'IO','IO_Field_read_byfield_L1',TRIM(TPFILE%CNAME)//': reading '//TRIM(TPFIELD%CMNHNAME))
 !
 IRESP = 0
 !
 CALL IO_File_read_check(TPFILE,'IO_Field_read_byfield_L1',IRESP)
-!
+
+call IO_Format_read_select( tpfile, glfi, gnc4 )
+
 IF (IRESP==0) THEN
   IF (GSMONOPROC) THEN ! sequential execution
-      IF (TPFILE%CFORMAT=='NETCDF4') THEN
-         CALL IO_Field_read_nc4(TPFILE,TPFIELD,OFIELD,IRESP)
-      ELSE IF (TPFILE%CFORMAT=='LFI') THEN
-         CALL IO_Field_read_lfi(TPFILE,TPFIELD,OFIELD,IRESP)
-      ELSE IF (TPFILE%CFORMAT=='LFICDF4') THEN
-        CALL IO_Field_read_nc4(TPFILE,TPFIELD,OFIELD,IRESP)
-      END IF
+    if ( gnc4 ) call IO_Field_read_nc4( tpfile, tpfield, ofield, iresp )
+    if ( glfi ) call IO_Field_read_lfi( tpfile, tpfield, ofield, iresp )
   ELSE
     IF (ISP == TPFILE%NMASTER_RANK)  THEN
-      IF (TPFILE%CFORMAT=='NETCDF4') THEN
-         CALL IO_Field_read_nc4(TPFILE,TPFIELD,OFIELD,IRESP)
-      ELSE IF (TPFILE%CFORMAT=='LFI') THEN
-         CALL IO_Field_read_lfi(TPFILE,TPFIELD,OFIELD,IRESP)
-      ELSE IF (TPFILE%CFORMAT=='LFICDF4') THEN
-        CALL IO_Field_read_nc4(TPFILE,TPFIELD,OFIELD,IRESP)
-      END IF
+      if ( gnc4 ) call IO_Field_read_nc4( tpfile, tpfield, ofield, iresp )
+      if ( glfi ) call IO_Field_read_lfi( tpfile, tpfield, ofield, iresp )
     END IF
     !
     CALL MPI_BCAST(IRESP,1,MNHINT_MPI,TPFILE%NMASTER_RANK-1,TPFILE%NMPICOMM,IERR)
@@ -1797,31 +1714,24 @@ INTEGER,OPTIONAL, INTENT(OUT)   :: KRESP    ! return-code
 !
 INTEGER                      :: IERR
 INTEGER                      :: IRESP
+logical                      :: glfi, gnc4
 !
 CALL PRINT_MSG(NVERB_DEBUG,'IO','IO_Field_read_byfield_C0',TRIM(TPFILE%CNAME)//': reading '//TRIM(TPFIELD%CMNHNAME))
 !
 IRESP = 0
 !
 CALL IO_File_read_check(TPFILE,'IO_Field_read_byfield_C0',IRESP)
-!
+
+call IO_Format_read_select( tpfile, glfi, gnc4 )
+
 IF (IRESP==0) THEN
   IF (GSMONOPROC) THEN ! sequential execution
-      IF (TPFILE%CFORMAT=='NETCDF4') THEN
-         CALL IO_Field_read_nc4(TPFILE,TPFIELD,HFIELD,IRESP)
-      ELSE IF (TPFILE%CFORMAT=='LFI') THEN
-         CALL IO_Field_read_lfi(TPFILE,TPFIELD,HFIELD,IRESP)
-      ELSE IF (TPFILE%CFORMAT=='LFICDF4') THEN
-        CALL IO_Field_read_nc4(TPFILE,TPFIELD,HFIELD,IRESP)
-      END IF
+    if ( gnc4 ) call IO_Field_read_nc4( tpfile, tpfield, hfield, iresp )
+    if ( glfi ) call IO_Field_read_lfi( tpfile, tpfield, hfield, iresp )
   ELSE
     IF (ISP == TPFILE%NMASTER_RANK)  THEN
-      IF (TPFILE%CFORMAT=='NETCDF4') THEN
-         CALL IO_Field_read_nc4(TPFILE,TPFIELD,HFIELD,IRESP)
-      ELSE IF (TPFILE%CFORMAT=='LFI') THEN
-         CALL IO_Field_read_lfi(TPFILE,TPFIELD,HFIELD,IRESP)
-      ELSE IF (TPFILE%CFORMAT=='LFICDF4') THEN
-        CALL IO_Field_read_nc4(TPFILE,TPFIELD,HFIELD,IRESP)
-      END IF
+      if ( gnc4 ) call IO_Field_read_nc4( tpfile, tpfield, hfield, iresp )
+      if ( glfi ) call IO_Field_read_lfi( tpfile, tpfield, hfield, iresp )
     END IF
     !
     CALL MPI_BCAST(IRESP,1,MNHINT_MPI,TPFILE%NMASTER_RANK-1,TPFILE%NMPICOMM,IERR)
@@ -1876,31 +1786,24 @@ INTEGER,OPTIONAL, INTENT(OUT)   :: KRESP    ! return-code
 INTEGER                      :: IERR
 INTEGER                      :: IRESP
 INTEGER,DIMENSION(3)         :: ITDATE
+logical                      :: glfi, gnc4
 !
 CALL PRINT_MSG(NVERB_DEBUG,'IO','IO_Field_read_byfield_T0',TRIM(TPFILE%CNAME)//': reading '//TRIM(TPFIELD%CMNHNAME))
 !
 IRESP = 0
 !
 CALL IO_File_read_check(TPFILE,'IO_Field_read_byfield_T0',IRESP)
-!
+
+call IO_Format_read_select( tpfile, glfi, gnc4 )
+
 IF (IRESP==0) THEN
   IF (GSMONOPROC) THEN ! sequential execution
-      IF (TPFILE%CFORMAT=='NETCDF4') THEN
-         CALL IO_Field_read_nc4(TPFILE,TPFIELD,TPDATA,IRESP)
-      ELSE IF (TPFILE%CFORMAT=='LFI') THEN
-         CALL IO_Field_read_lfi(TPFILE,TPFIELD,TPDATA,IRESP)
-      ELSE IF (TPFILE%CFORMAT=='LFICDF4') THEN
-        CALL IO_Field_read_nc4(TPFILE,TPFIELD,TPDATA,IRESP)
-      END IF
+    if ( gnc4 ) call IO_Field_read_nc4( tpfile, tpfield, tpdata, iresp )
+    if ( glfi ) call IO_Field_read_lfi( tpfile, tpfield, tpdata, iresp )
   ELSE
     IF (ISP == TPFILE%NMASTER_RANK)  THEN
-      IF (TPFILE%CFORMAT=='NETCDF4') THEN
-         CALL IO_Field_read_nc4(TPFILE,TPFIELD,TPDATA,IRESP)
-      ELSE IF (TPFILE%CFORMAT=='LFI') THEN
-         CALL IO_Field_read_lfi(TPFILE,TPFIELD,TPDATA,IRESP)
-      ELSE IF (TPFILE%CFORMAT=='LFICDF4') THEN
-        CALL IO_Field_read_nc4(TPFILE,TPFIELD,TPDATA,IRESP)
-      END IF
+      if ( gnc4 ) call IO_Field_read_nc4( tpfile, tpfield, tpdata, iresp )
+      if ( glfi ) call IO_Field_read_lfi( tpfile, tpfield, tpdata, iresp )
       ITDATE(1) = TPDATA%TDATE%YEAR
       ITDATE(2) = TPDATA%TDATE%MONTH
       ITDATE(3) = TPDATA%TDATE%DAY
@@ -1983,6 +1886,7 @@ INTEGER                                  :: NB_REQ,IKU
 INTEGER, DIMENSION(MPI_STATUS_SIZE)      :: STATUS
 INTEGER, ALLOCATABLE,DIMENSION(:,:)      :: STATUSES
 INTEGER,ALLOCATABLE,DIMENSION(:)         :: REQ_TAB
+logical                                  :: glfi, gnc4
 REAL,DIMENSION(:,:,:),ALLOCATABLE,TARGET :: Z3D
 REAL,DIMENSION(:,:,:), POINTER           :: TX3DP
 REAL(kind=MNHTIME), DIMENSION(2)         :: T0, T1, T2, T3
@@ -2006,7 +1910,9 @@ IRESP = 0
 !------------------------------------------------------------------
 IHEXTOT = 2*JPHEXT+1
 CALL IO_File_read_check(TPFILE,'IO_Field_read_byfield_lb',IRESP)
-!
+
+call IO_Format_read_select( tpfile, glfi, gnc4 )
+
 IF (IRESP==0) THEN
   IF (GSMONOPROC) THEN ! sequential execution
     IF (YLBTYPE == 'LBX' .OR. YLBTYPE == 'LBXU') THEN
@@ -2022,13 +1928,8 @@ IF (IRESP==0) THEN
       Z3D = 0.0
       TX3DP => Z3D(:,:,:)
     END IF
-    IF (TPFILE%CFORMAT=='NETCDF4') THEN
-      CALL IO_Field_read_nc4(TPFILE,TPFIELD,TX3DP,IRESP)
-    ELSE IF (TPFILE%CFORMAT=='LFI') THEN
-      CALL IO_Field_read_lfi(TPFILE,TPFIELD,TX3DP,IRESP)
-    ELSE IF (TPFILE%CFORMAT=='LFICDF4') THEN
-      CALL IO_Field_read_nc4(TPFILE,TPFIELD,TX3DP,IRESP)
-    END IF
+    if ( gnc4 ) call IO_Field_read_nc4( tpfile, tpfield, tx3dp, iresp )
+    if ( glfi ) call IO_Field_read_lfi( tpfile, tpfield, tx3dp, iresp )
     IF (YLBTYPE == 'LBX' .OR. YLBTYPE == 'LBXU') THEN
       IF (LPACK .AND. L2D) Z3D(:,:,:) = SPREAD(Z3D(:,JPHEXT+1,:),DIM=2,NCOPIES=IHEXTOT)
       PLB(1:KRIM+JPHEXT,:,:)          = Z3D(1:KRIM+JPHEXT,:,:)
@@ -2054,13 +1955,8 @@ IF (IRESP==0) THEN
         Z3D = 0.0
         TX3DP => Z3D(:,:,:)
       END IF
-      IF (TPFILE%CFORMAT=='NETCDF4') THEN
-        CALL IO_Field_read_nc4(TPFILE,TPFIELD,TX3DP,IRESP)
-      ELSE IF (TPFILE%CFORMAT=='LFI') THEN
-        CALL IO_Field_read_lfi(TPFILE,TPFIELD,TX3DP,IRESP)
-      ELSE IF (TPFILE%CFORMAT=='LFICDF4') THEN
-        CALL IO_Field_read_nc4(TPFILE,TPFIELD,TX3DP,IRESP)
-      END IF
+      if ( gnc4 ) call IO_Field_read_nc4( tpfile, tpfield, tx3dp, iresp )
+      if ( glfi ) call IO_Field_read_lfi( tpfile, tpfield, tx3dp, iresp )
       IF (YLBTYPE == 'LBX' .OR. YLBTYPE == 'LBXU') THEN
         IF (LPACK .AND. L2D) Z3D(:,:,:) = SPREAD(Z3D(:,JPHEXT+1,:),DIM=2,NCOPIES=IHEXTOT)
         ! erase gap in LB field
-- 
GitLab