From 17297fabce4d971c9bd7a591692b9dfa224aa54e Mon Sep 17 00:00:00 2001
From: Philippe WAUTELET <philippe.wautelet@aero.obs-mip.fr>
Date: Fri, 17 Nov 2017 15:33:43 +0100
Subject: [PATCH] Philippe 17/11/2017: IO: add fields to TFILEDATA to begin
 removing of FD_ll structures

---
 src/LIB/SURCOUCHE/src/fmread_ll.f90   | 599 ++++++++------------------
 src/LIB/SURCOUCHE/src/fmwrit_ll.f90   | 215 +++++----
 src/LIB/SURCOUCHE/src/modd_io.f90     |   9 +-
 src/LIB/SURCOUCHE/src/mode_fm.f90     |  22 +-
 src/LIB/SURCOUCHE/src/mode_io.f90     |  36 +-
 src/LIB/SURCOUCHE/src/mode_netcdf.f90 |   7 +-
 6 files changed, 345 insertions(+), 543 deletions(-)

diff --git a/src/LIB/SURCOUCHE/src/fmread_ll.f90 b/src/LIB/SURCOUCHE/src/fmread_ll.f90
index aee1bd05a..4021ea21a 100644
--- a/src/LIB/SURCOUCHE/src/fmread_ll.f90
+++ b/src/LIB/SURCOUCHE/src/fmread_ll.f90
@@ -69,25 +69,55 @@ PUBLIC IO_READ_FIELD,IO_READ_FIELD_LB
 
 CONTAINS 
 
-SUBROUTINE IO_BCAST_FIELD_METADATA(TPFD,TPFIELD)
-USE MODE_FD_ll, ONLY : FD_ll
-TYPE(FD_ll), POINTER, INTENT(IN)    :: TPFD
-TYPE(TFIELDDATA),     INTENT(INOUT) :: TPFIELD
+SUBROUTINE IO_FILE_READ_CHECK(TPFILE,HSUBR,KRESP)
+TYPE(TFILEDATA),  INTENT(IN)  :: TPFILE
+CHARACTER(LEN=*), INTENT(IN)  :: HSUBR
+INTEGER,          INTENT(OUT) :: KRESP
+!
+KRESP = 0
+!
+!Check if file is opened
+IF (.NOT.TPFILE%LOPENED) THEN
+  CALL PRINT_MSG(NVERB_ERROR,'IO',HSUBR,TRIM(TPFILE%CNAME)//' is not opened')
+  KRESP = -201
+  RETURN
+END IF
+!
+!Check if file is in the right opening mode
+IF (TPFILE%CMODE/='READ') THEN
+  CALL PRINT_MSG(NVERB_WARNING,'IO',HSUBR,&
+                 TRIM(TPFILE%CNAME)//': reading in a file opened in '//TRIM(TPFILE%CMODE)//' mode')
+END IF
+!
+!Check fileformat
+IF (TPFILE%CFORMAT/='NETCDF4' .AND. TPFILE%CFORMAT=='LFI' .AND. TPFILE%CFORMAT=='LFICDF4') THEN
+  CALL PRINT_MSG(NVERB_FATAL,'IO',HSUBR,&
+                 TRIM(TPFILE%CNAME)//': invalid fileformat ('//TRIM(TPFILE%CFORMAT)//')')
+  KRESP = -202
+  RETURN
+END IF
+!
+END SUBROUTINE IO_FILE_READ_CHECK
+
+
+SUBROUTINE IO_BCAST_FIELD_METADATA(TPFILE,TPFIELD)
+TYPE(TFILEDATA),  INTENT(IN)    :: TPFILE
+TYPE(TFIELDDATA), INTENT(INOUT) :: TPFIELD
 !
 INTEGER :: IERR
 !
 CALL PRINT_MSG(NVERB_DEBUG,'IO','IO_BCAST_FIELD_METADATA','called for '//TRIM(TPFIELD%CMNHNAME))
 !
-CALL MPI_BCAST(TPFIELD%CMNHNAME, LEN(TPFIELD%CMNHNAME), MPI_CHARACTER,TPFD%OWNER-1,TPFD%COMM,IERR)
-CALL MPI_BCAST(TPFIELD%CSTDNAME, LEN(TPFIELD%CSTDNAME), MPI_CHARACTER,TPFD%OWNER-1,TPFD%COMM,IERR)
-CALL MPI_BCAST(TPFIELD%CLONGNAME,LEN(TPFIELD%CLONGNAME),MPI_CHARACTER,TPFD%OWNER-1,TPFD%COMM,IERR)
-CALL MPI_BCAST(TPFIELD%CUNITS,   LEN(TPFIELD%CUNITS),   MPI_CHARACTER,TPFD%OWNER-1,TPFD%COMM,IERR)
-CALL MPI_BCAST(TPFIELD%CDIR,     LEN(TPFIELD%CDIR),     MPI_CHARACTER,TPFD%OWNER-1,TPFD%COMM,IERR)
-CALL MPI_BCAST(TPFIELD%CLBTYPE,  LEN(TPFIELD%CLBTYPE),  MPI_CHARACTER,TPFD%OWNER-1,TPFD%COMM,IERR)
-CALL MPI_BCAST(TPFIELD%CCOMMENT, LEN(TPFIELD%CCOMMENT), MPI_CHARACTER,TPFD%OWNER-1,TPFD%COMM,IERR)
-CALL MPI_BCAST(TPFIELD%NGRID,    1,                     MPI_INTEGER,  TPFD%OWNER-1,TPFD%COMM,IERR)
-CALL MPI_BCAST(TPFIELD%NTYPE,    1,                     MPI_INTEGER,  TPFD%OWNER-1,TPFD%COMM,IERR)
-CALL MPI_BCAST(TPFIELD%NDIMS,    1,                     MPI_INTEGER,  TPFD%OWNER-1,TPFD%COMM,IERR)
+CALL MPI_BCAST(TPFIELD%CMNHNAME, LEN(TPFIELD%CMNHNAME), MPI_CHARACTER,TPFILE%NMASTER_RANK-1,TPFILE%NMPICOMM,IERR)
+CALL MPI_BCAST(TPFIELD%CSTDNAME, LEN(TPFIELD%CSTDNAME), MPI_CHARACTER,TPFILE%NMASTER_RANK-1,TPFILE%NMPICOMM,IERR)
+CALL MPI_BCAST(TPFIELD%CLONGNAME,LEN(TPFIELD%CLONGNAME),MPI_CHARACTER,TPFILE%NMASTER_RANK-1,TPFILE%NMPICOMM,IERR)
+CALL MPI_BCAST(TPFIELD%CUNITS,   LEN(TPFIELD%CUNITS),   MPI_CHARACTER,TPFILE%NMASTER_RANK-1,TPFILE%NMPICOMM,IERR)
+CALL MPI_BCAST(TPFIELD%CDIR,     LEN(TPFIELD%CDIR),     MPI_CHARACTER,TPFILE%NMASTER_RANK-1,TPFILE%NMPICOMM,IERR)
+CALL MPI_BCAST(TPFIELD%CLBTYPE,  LEN(TPFIELD%CLBTYPE),  MPI_CHARACTER,TPFILE%NMASTER_RANK-1,TPFILE%NMPICOMM,IERR)
+CALL MPI_BCAST(TPFIELD%CCOMMENT, LEN(TPFIELD%CCOMMENT), MPI_CHARACTER,TPFILE%NMASTER_RANK-1,TPFILE%NMPICOMM,IERR)
+CALL MPI_BCAST(TPFIELD%NGRID,    1,                     MPI_INTEGER,  TPFILE%NMASTER_RANK-1,TPFILE%NMPICOMM,IERR)
+CALL MPI_BCAST(TPFIELD%NTYPE,    1,                     MPI_INTEGER,  TPFILE%NMASTER_RANK-1,TPFILE%NMPICOMM,IERR)
+CALL MPI_BCAST(TPFIELD%NDIMS,    1,                     MPI_INTEGER,  TPFILE%NMASTER_RANK-1,TPFILE%NMPICOMM,IERR)
 !
 END SUBROUTINE IO_BCAST_FIELD_METADATA
 
@@ -124,60 +154,43 @@ 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
+CALL IO_FILE_READ_CHECK(TPFILE,'IO_READ_FIELD_BYFIELD_X0',IRESP)
+!
+IF (IRESP==0) 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 IF (TPFILE%CFORMAT=='LFICDF4') THEN
-        !Only detected if CFORMAT='LFICDF4'
-        !This seems to be allowed for netCDF4 but it is not clean
-        CALL PRINT_MSG(NVERB_WARNING,'IO','IO_READ_FIELD_BYFIELD_X0',&
-                       TRIM(TPFILE%CNAME)//': reading in a file opened in WRITE mode')
         CALL IO_READ_FIELD_NC4(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 (ISP == TPFILE%NMASTER_RANK)  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 IF (TPFILE%CFORMAT=='LFICDF4') THEN
-        !Only detected if CFORMAT='LFICDF4'
-        !This seems to be allowed for netCDF4 but it is not clean
-        CALL PRINT_MSG(NVERB_WARNING,'IO','IO_READ_FIELD_BYFIELD_X0',&
-                       TRIM(TPFILE%CNAME)//': reading in a file opened in WRITE mode')
         CALL IO_READ_FIELD_NC4(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)
+    CALL MPI_BCAST(IRESP,1,MPI_INTEGER,TPFILE%NMASTER_RANK-1,TPFILE%NMPICOMM,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 (IRESP==-111) CALL IO_BCAST_FIELD_METADATA(TPFILE,TPFIELD)
     !
     ! Broadcast Field
-    CALL MPI_BCAST(PFIELD,1,MPI_FLOAT,TZFD%OWNER-1,TZFD%COMM,IERR)
+    CALL MPI_BCAST(PFIELD,1,MPI_FLOAT,TPFILE%NMASTER_RANK-1,TPFILE%NMPICOMM,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 (IRESP==-111) IRESP = 0 !-111 is not really an error (metadata has changed)
@@ -231,7 +244,6 @@ 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
@@ -242,39 +254,26 @@ GALLOC = .FALSE.
 IRESP = 0
 ZFIELDP => NULL()
 !
-TZFD=>GETFD(TRIM(ADJUSTL(TPFILE%CNAME))//'.lfi')
-IF (ASSOCIATED(TZFD)) THEN
+CALL IO_FILE_READ_CHECK(TPFILE,'IO_READ_FIELD_BYFIELD_X1',IRESP)
+!
+IF (IRESP==0) 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 IF (TPFILE%CFORMAT=='LFICDF4') THEN
-        !Only detected if CFORMAT='LFICDF4'
-        !This seems to be allowed for netCDF4 but it is not clean
-        CALL PRINT_MSG(NVERB_WARNING,'IO','IO_READ_FIELD_BYFIELD_X1',&
-                       TRIM(TPFILE%CNAME)//': reading in a file opened in WRITE mode')
         CALL IO_READ_FIELD_NC4(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 (ISP == TPFILE%NMASTER_RANK)  THEN
       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 IF (TPFILE%CFORMAT=='LFICDF4') THEN
-        !Only detected if CFORMAT='LFICDF4'
-        !This seems to be allowed for netCDF4 but it is not clean
-        CALL PRINT_MSG(NVERB_WARNING,'IO','IO_READ_FIELD_BYFIELD_X1',&
-                       TRIM(TPFILE%CNAME)//': reading in a file opened in WRITE mode')
         CALL IO_READ_FIELD_NC4(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
       !Not really necessary but useful to suppress alerts with Valgrind
@@ -282,23 +281,20 @@ IF (ASSOCIATED(TZFD)) THEN
       GALLOC = .TRUE.
     END IF
     !
-    CALL MPI_BCAST(IRESP,1,MPI_INTEGER,TZFD%OWNER-1,TZFD%COMM,IERR)
+    CALL MPI_BCAST(IRESP,1,MPI_INTEGER,TPFILE%NMASTER_RANK-1,TPFILE%NMPICOMM,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 (IRESP==-111) CALL IO_BCAST_FIELD_METADATA(TPFILE,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)
+      CALL MPI_BCAST(PFIELD,SIZE(PFIELD),MPI_FLOAT,TPFILE%NMASTER_RANK-1,TPFILE%NMPICOMM,IERR)
     ELSE
       !Scatter Field
-      CALL SCATTER_XXFIELD(TPFIELD%CDIR,ZFIELDP,PFIELD,TZFD%OWNER,TZFD%COMM,TPSPLITTING)
+      CALL SCATTER_XXFIELD(TPFIELD%CDIR,ZFIELDP,PFIELD,TPFILE%NMASTER_RANK,TPFILE%NMPICOMM,TPSPLITTING)
     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)
@@ -357,7 +353,6 @@ 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
@@ -373,8 +368,9 @@ IRESP = 0
 ZFIELDP => NULL()
 !
 IHEXTOT = 2*JPHEXT+1
-TZFD=>GETFD(TRIM(ADJUSTL(TPFILE%CNAME))//'.lfi')
-IF (ASSOCIATED(TZFD)) THEN
+CALL IO_FILE_READ_CHECK(TPFILE,'IO_READ_FIELD_BYFIELD_X2',IRESP)
+!
+IF (IRESP==0) 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)
@@ -388,14 +384,7 @@ IF (ASSOCIATED(TZFD)) THEN
     ELSE IF (TPFILE%CFORMAT=='LFI') THEN
       CALL IO_READ_FIELD_LFI(TPFILE,TPFIELD,ZFIELDP,IRESP)
     ELSE IF (TPFILE%CFORMAT=='LFICDF4') THEN
-      !Only detected if CFORMAT='LFICDF4'
-      !This seems to be allowed for netCDF4 but it is not clean
-      CALL PRINT_MSG(NVERB_WARNING,'IO','IO_READ_FIELD_BYFIELD_X2',&
-                     TRIM(TPFILE%CNAME)//': reading in a file opened in WRITE mode')
       CALL IO_READ_FIELD_NC4(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)
@@ -404,7 +393,7 @@ IF (ASSOCIATED(TZFD)) THEN
     END IF
   ELSE
     CALL SECOND_MNH2(T0)
-    IF (ISP == TZFD%OWNER)  THEN
+    IF (ISP == TPFILE%NMASTER_RANK)  THEN
       ! I/O processor case
       CALL ALLOCBUFFER_ll(ZFIELDP,PFIELD,TPFIELD%CDIR,GALLOC, KIMAX_ll, KJMAX_ll)
       IF (TPFILE%CFORMAT=='NETCDF4') THEN
@@ -412,14 +401,7 @@ IF (ASSOCIATED(TZFD)) THEN
       ELSE IF (TPFILE%CFORMAT=='LFI') THEN
          CALL IO_READ_FIELD_LFI(TPFILE,TPFIELD,ZFIELDP,IRESP)
       ELSE IF (TPFILE%CFORMAT=='LFICDF4') THEN
-        !Only detected if CFORMAT='LFICDF4'
-        !This seems to be allowed for netCDF4 but it is not clean
-        CALL PRINT_MSG(NVERB_WARNING,'IO','IO_READ_FIELD_BYFIELD_X2',&
-                       TRIM(TPFILE%CNAME)//': reading in a file opened in WRITE mode')
         CALL IO_READ_FIELD_NC4(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
     ELSE
       !Not really necessary but useful to suppress alerts with Valgrind
@@ -429,19 +411,19 @@ IF (ASSOCIATED(TZFD)) THEN
     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)
+    CALL MPI_BCAST(IRESP,1,MPI_INTEGER,TPFILE%NMASTER_RANK-1,TPFILE%NMPICOMM,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 (IRESP==-111) CALL IO_BCAST_FIELD_METADATA(TPFILE,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)
+      CALL SCATTER_XXFIELD(TPFIELD%CDIR,ZFIELDP,PFIELD,TPFILE%NMASTER_RANK,TPFILE%NMPICOMM,TPSPLITTING)
     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)
+        CALL SCATTER_XXFIELD('XX',ZFIELDP(:,1),PFIELD(:,JPHEXT+1),TPFILE%NMASTER_RANK,TPFILE%NMPICOMM,TPSPLITTING)
         PFIELD(:,:) = SPREAD(PFIELD(:,JPHEXT+1),DIM=2,NCOPIES=IHEXTOT)
       ELSE
 #ifdef MNH_GA
@@ -449,7 +431,7 @@ IF (ASSOCIATED(TZFD)) THEN
         ! init/create the ga , dim3 = 1
         !
         CALL MNH_INIT_GA(SIZE(PFIELD,1),SIZE(PFIELD,2),1,HRECFM,"READ")
-        IF (ISP == TZFD%OWNER)  THEN
+        IF (ISP == TPFILE%NMASTER_RANK)  THEN
           !
           ! put the data in the g_a , this proc get this 1 slide
           !
@@ -468,18 +450,15 @@ IF (ASSOCIATED(TZFD)) THEN
         DEALLOCATE(ZFIELD_GA)
 #else
         ! XY Scatter Field
-        CALL SCATTER_XYFIELD(ZFIELDP,PFIELD,TZFD%OWNER,TZFD%COMM)
+        CALL SCATTER_XYFIELD(ZFIELDP,PFIELD,TPFILE%NMASTER_RANK,TPFILE%NMPICOMM)
 #endif
       END IF
     ELSE
-      CALL MPI_BCAST(PFIELD,SIZE(PFIELD),MPI_FLOAT,TZFD%OWNER-1,TZFD%COMM,IERR)
+      CALL MPI_BCAST(PFIELD,SIZE(PFIELD),MPI_FLOAT,TPFILE%NMASTER_RANK-1,TPFILE%NMPICOMM,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)
@@ -573,7 +552,9 @@ YDIR = TPFIELD%CDIR
 !
 IHEXTOT = 2*JPHEXT+1
 TZFD=>GETFD(TRIM(ADJUSTL(TPFILE%CNAME))//'.lfi')
-IF (ASSOCIATED(TZFD)) THEN
+CALL IO_FILE_READ_CHECK(TPFILE,'IO_READ_FIELD_BYFIELD_X3',IRESP)
+!
+IF (IRESP==0) THEN
   IF (GSMONOPROC  .AND.  (TZFD%NB_PROCIO==1) ) 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,:)
@@ -588,14 +569,7 @@ IF (ASSOCIATED(TZFD)) THEN
     ELSE IF (TPFILE%CFORMAT=='LFI') THEN
       CALL IO_READ_FIELD_LFI(TPFILE,TPFIELD,ZFIELDP,IRESP)
     ELSE IF (TPFILE%CFORMAT=='LFICDF4') THEN
-      !Only detected if CFORMAT='LFICDF4'
-      !This seems to be allowed for netCDF4 but it is not clean
-      CALL PRINT_MSG(NVERB_WARNING,'IO','IO_READ_FIELD_BYFIELD_X3',&
-                     TRIM(TPFILE%CNAME)//': reading in a file opened in WRITE mode')
       CALL IO_READ_FIELD_NC4(TPFILE,TPFIELD,ZFIELDP,IRESP)
-    ELSE
-      CALL PRINT_MSG(NVERB_FATAL,'IO','IO_READ_FIELD_BYFIELD_X3',&
-                     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)
@@ -603,7 +577,7 @@ IF (ASSOCIATED(TZFD)) THEN
       PFIELD(:,:,:)=SPREAD(ZFIELDP(:,1,:),DIM=2,NCOPIES=IHEXTOT)
     END IF
   ELSE IF ( TZFD%NB_PROCIO==1 .OR. YDIR == '--' ) THEN ! multiprocesses execution & 1 IO proc
-    IF (ISP == TZFD%OWNER)  THEN
+    IF (ISP == TPFILE%NMASTER_RANK)  THEN
       ! I/O process case
       CALL ALLOCBUFFER_ll(ZFIELDP,PFIELD,YDIR,GALLOC)
       IF (TPFILE%CFORMAT=='NETCDF4') THEN
@@ -611,14 +585,7 @@ IF (ASSOCIATED(TZFD)) THEN
       ELSE IF (TPFILE%CFORMAT=='LFI') THEN
         CALL IO_READ_FIELD_LFI(TPFILE,TPFIELD,ZFIELDP,IRESP)
       ELSE IF (TPFILE%CFORMAT=='LFICDF4') THEN
-        !Only detected if CFORMAT='LFICDF4'
-        !This seems to be allowed for netCDF4 but it is not clean
-        CALL PRINT_MSG(NVERB_WARNING,'IO','IO_READ_FIELD_BYFIELD_X3',&
-                       TRIM(TPFILE%CNAME)//': reading in a file opened in WRITE mode')
         CALL IO_READ_FIELD_NC4(TPFILE,TPFIELD,ZFIELDP,IRESP)
-      ELSE
-        CALL PRINT_MSG(NVERB_FATAL,'IO','IO_READ_FIELD_BYFIELD_X3',&
-                       TRIM(TPFILE%CNAME)//': invalid fileformat ('//TRIM(TPFILE%CFORMAT)//')')
       END IF
     ELSE
       !Not really necessary but useful to suppress alerts with Valgrind
@@ -626,27 +593,27 @@ IF (ASSOCIATED(TZFD)) THEN
       GALLOC = .TRUE.
     END IF
     !
-    CALL MPI_BCAST(IRESP,1,MPI_INTEGER,TZFD%OWNER-1,TZFD%COMM,IERR)
+    CALL MPI_BCAST(IRESP,1,MPI_INTEGER,TPFILE%NMASTER_RANK-1,TPFILE%NMPICOMM,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 (IRESP==-111) CALL IO_BCAST_FIELD_METADATA(TPFILE,TPFIELD)
     !
     IF (YDIR == 'XX' .OR. YDIR =='YY') THEN
       ! XX or YY Scatter Field
-      CALL SCATTER_XXFIELD(YDIR,ZFIELDP,PFIELD,TZFD%OWNER,TZFD%COMM)
+      CALL SCATTER_XXFIELD(YDIR,ZFIELDP,PFIELD,TPFILE%NMASTER_RANK,TPFILE%NMPICOMM)
     ELSE IF (YDIR == 'XY') THEN
       IF (LPACK .AND. L2D) THEN
         ! 2D compact case
-        CALL SCATTER_XXFIELD('XX',ZFIELDP(:,1,:),PFIELD(:,JPHEXT+1,:),TZFD%OWNER,TZFD%COMM)
+        CALL SCATTER_XXFIELD('XX',ZFIELDP(:,1,:),PFIELD(:,JPHEXT+1,:),TPFILE%NMASTER_RANK,TPFILE%NMPICOMM)
         PFIELD(:,:,:) = SPREAD(PFIELD(:,JPHEXT+1,:),DIM=2,NCOPIES=IHEXTOT)
       ELSE
         ! XY Scatter Field
-        CALL SCATTER_XYFIELD(ZFIELDP,PFIELD,TZFD%OWNER,TZFD%COMM)
+        CALL SCATTER_XYFIELD(ZFIELDP,PFIELD,TPFILE%NMASTER_RANK,TPFILE%NMPICOMM)
       END IF
     ELSE
       ! Broadcast Field
-      CALL MPI_BCAST(PFIELD,SIZE(PFIELD),MPI_FLOAT,TZFD%OWNER-1,TZFD%COMM,IERR)
+      CALL MPI_BCAST(PFIELD,SIZE(PFIELD),MPI_FLOAT,TPFILE%NMASTER_RANK-1,TPFILE%NMPICOMM,IERR)
     END IF
   ELSE  ! multiprocesses execution & // IO
 !
@@ -673,7 +640,7 @@ IF (ASSOCIATED(TZFD)) THEN
       WRITE(YSUFFIX,'(I4.4)') JKK
       TZFIELD%CMNHNAME = TRIM(TPFIELD%CMNHNAME)//TRIM(YSUFFIX)
       !
-      IK_RANK   =  TZFD_IOZ%OWNER
+      IK_RANK   =  TZFILE%NMASTER_RANK
       !
       IF (ISP == IK_RANK )  THEN
         IF ( SIZE(ZSLICE_ll) .EQ. 0 ) THEN
@@ -688,10 +655,9 @@ IF (ASSOCIATED(TZFD)) THEN
           CALL IO_READ_FIELD_NC4(TZFILE,TZFIELD,ZSLICE_ll,IRESP)
         ELSE IF (TPFILE%CFORMAT=='LFI') THEN
           CALL IO_READ_FIELD_LFI(TZFILE,TZFIELD,ZSLICE_ll,IRESP)
-        ELSE
-          CALL PRINT_MSG(NVERB_FATAL,'IO','IO_READ_FIELD_BYFIELD_X3',&
-                         TRIM(TPFILE%CNAME)//': invalid fileformat ('//TRIM(TPFILE%CFORMAT)//')')
-          END IF
+        ELSE IF (TPFILE%CFORMAT=='LFICDF4') THEN
+          CALL IO_READ_FIELD_NC4(TZFILE,TZFIELD,ZSLICE_ll,IRESP)
+        END IF
         CALL SECOND_MNH2(T1)
         TIMEZ%T_READ3D_READ=TIMEZ%T_READ3D_READ + T1 - T0
         !
@@ -739,7 +705,7 @@ IF (ASSOCIATED(TZFD)) THEN
           TZFILE => TPFILE
           TZFIELD = TPFIELD
         END IF
-        IK_RANK   =  TZFD_IOZ%OWNER
+        IK_RANK   =  TZFILE%NMASTER_RANK
         IF (ISP == IK_RANK )  THEN
           IF ( SIZE(ZSLICE_ll) .EQ. 0 ) THEN
             DEALLOCATE(ZSLICE_ll)
@@ -753,9 +719,8 @@ IF (ASSOCIATED(TZFD)) THEN
             CALL IO_READ_FIELD_NC4(TZFILE,TZFIELD,ZSLICE_ll,IRESP)
           ELSE IF (TPFILE%CFORMAT=='LFI') THEN
             CALL IO_READ_FIELD_LFI(TZFILE,TZFIELD,ZSLICE_ll,IRESP)
-          ELSE
-            CALL PRINT_MSG(NVERB_FATAL,'IO','IO_READ_FIELD_BYFIELD_X3',&
-                           TRIM(TPFILE%CNAME)//': invalid fileformat ('//TRIM(TPFILE%CFORMAT)//')')
+          ELSE IF (TPFILE%CFORMAT=='LFICDF4') THEN
+            CALL IO_READ_FIELD_NC4(TZFILE,TZFIELD,ZSLICE_ll,IRESP)
           END IF
           !JUANIOZ
           CALL SECOND_MNH2(T1)
@@ -785,12 +750,12 @@ IF (ASSOCIATED(TZFD)) THEN
       IF (YDIR == 'XX' .OR. YDIR =='YY') THEN
         ! XX or YY Scatter Field
         STOP " XX ou YY NON PREVU SUR BG POUR LE MOMENT "
-        CALL SCATTER_XXFIELD(YDIR,ZFIELDP,PFIELD,TZFD%OWNER,TZFD%COMM)
+        CALL SCATTER_XXFIELD(YDIR,ZFIELDP,PFIELD,TPFILE%NMASTER_RANK,TPFILE%NMPICOMM)
       ELSE IF (YDIR == 'XY') THEN
         IF (LPACK .AND. L2D) THEN
           ! 2D compact case
           STOP " L2D NON PREVU SUR BG POUR LE MOMENT "
-          CALL SCATTER_XXFIELD('XX',ZFIELDP(:,1,:),PFIELD(:,JPHEXT+1,:),TZFD%OWNER,TZFD%COMM)
+          CALL SCATTER_XXFIELD('XX',ZFIELDP(:,1,:),PFIELD(:,JPHEXT+1,:),TPFILE%NMASTER_RANK,TPFILE%NMPICOMM)
           PFIELD(:,:,:) = SPREAD(PFIELD(:,JPHEXT+1,:),DIM=2,NCOPIES=IHEXTOT)
         ELSE
           !
@@ -828,7 +793,7 @@ IF (ASSOCIATED(TZFD)) THEN
       ELSE
         ! Broadcast Field
         STOP "  Broadcast Field NON PREVU SUR BG POUR LE MOMENT "
-        CALL MPI_BCAST(PFIELD,SIZE(PFIELD),MPI_FLOAT,TZFD%OWNER-1,TZFD%COMM,IERR)
+        CALL MPI_BCAST(PFIELD,SIZE(PFIELD),MPI_FLOAT,TPFILE%NMASTER_RANK-1,TPFILE%NMPICOMM,IERR)
       END IF
       CALL SECOND_MNH2(T0)
       IF (NB_REQ .GT.0 ) THEN
@@ -843,14 +808,11 @@ IF (ASSOCIATED(TZFD)) THEN
     !
     !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 (IRESP==-111) CALL IO_BCAST_FIELD_METADATA(TPFILE,TPFIELD)
     !
 #endif
 !JUAN BG Z SLICE
   END IF !(GSMONOPROC)
-ELSE
-  IRESP = -61
-  CALL PRINT_MSG(NVERB_ERROR,'IO','IO_READ_FIELD_BYFIELD_X3','file '//TRIM(TPFILE%CNAME)//' not found')
 END IF
 !
 IF (GALLOC)    DEALLOCATE (ZFIELDP)
@@ -907,7 +869,6 @@ REAL,DIMENSION(:,:,:,:),TARGET,INTENT(INOUT) :: PFIELD   ! array containing the
 INTEGER, OPTIONAL,             INTENT(OUT)   :: KRESP    ! return-code
 !
 INTEGER                          :: IERR
-TYPE(FD_ll), POINTER             :: TZFD
 REAL,DIMENSION(:,:,:,:),POINTER  :: ZFIELDP
 LOGICAL                          :: GALLOC
 INTEGER                          :: IRESP
@@ -920,8 +881,9 @@ IRESP = 0
 ZFIELDP => NULL()
 !
 IHEXTOT = 2*JPHEXT+1
-TZFD=>GETFD(TRIM(ADJUSTL(TPFILE%CNAME))//'.lfi')
-IF (ASSOCIATED(TZFD)) THEN
+CALL IO_FILE_READ_CHECK(TPFILE,'IO_READ_FIELD_BYFIELD_X4',IRESP)
+!
+IF (IRESP==0) 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,:,:)
@@ -935,14 +897,7 @@ IF (ASSOCIATED(TZFD)) THEN
     ELSE IF (TPFILE%CFORMAT=='LFI') THEN
       CALL IO_READ_FIELD_LFI(TPFILE,TPFIELD,ZFIELDP,IRESP)
     ELSE IF (TPFILE%CFORMAT=='LFICDF4') THEN
-      !Only detected if CFORMAT='LFICDF4'
-      !This seems to be allowed for netCDF4 but it is not clean
-      CALL PRINT_MSG(NVERB_WARNING,'IO','IO_READ_FIELD_BYFIELD_X4',&
-                     TRIM(TPFILE%CNAME)//': reading in a file opened in WRITE mode')
       CALL IO_READ_FIELD_NC4(TPFILE,TPFIELD,ZFIELDP,IRESP)
-    ELSE
-      CALL PRINT_MSG(NVERB_FATAL,'IO','IO_READ_FIELD_BYFIELD_X4',&
-                     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)
@@ -950,7 +905,7 @@ IF (ASSOCIATED(TZFD)) THEN
       PFIELD(:,:,:,:)=SPREAD(PFIELD(:,JPHEXT+1,:,:),DIM=2,NCOPIES=IHEXTOT)
     END IF
   ELSE
-    IF (ISP == TZFD%OWNER)  THEN
+    IF (ISP == TPFILE%NMASTER_RANK)  THEN
       ! I/O processor case
       CALL ALLOCBUFFER_ll(ZFIELDP,PFIELD,TPFIELD%CDIR,GALLOC)
       IF (TPFILE%CFORMAT=='NETCDF4') THEN
@@ -958,14 +913,7 @@ IF (ASSOCIATED(TZFD)) THEN
       ELSE IF (TPFILE%CFORMAT=='LFI') THEN
          CALL IO_READ_FIELD_LFI(TPFILE,TPFIELD,ZFIELDP,IRESP)
       ELSE IF (TPFILE%CFORMAT=='LFICDF4') THEN
-        !Only detected if CFORMAT='LFICDF4'
-        !This seems to be allowed for netCDF4 but it is not clean
-        CALL PRINT_MSG(NVERB_WARNING,'IO','IO_READ_FIELD_BYFIELD_X4',&
-                       TRIM(TPFILE%CNAME)//': reading in a file opened in WRITE mode')
         CALL IO_READ_FIELD_NC4(TPFILE,TPFIELD,ZFIELDP,IRESP)
-      ELSE
-         CALL PRINT_MSG(NVERB_FATAL,'IO','IO_READ_FIELD_BYFIELD_X4',&
-                        TRIM(TPFILE%CNAME)//': invalid fileformat ('//TRIM(TPFILE%CFORMAT)//')')
       END IF
     ELSE
       !Not really necessary but useful to suppress alerts with Valgrind
@@ -973,31 +921,28 @@ IF (ASSOCIATED(TZFD)) THEN
       GALLOC = .TRUE.
     END IF
     !
-    CALL MPI_BCAST(IRESP,1,MPI_INTEGER,TZFD%OWNER-1,TZFD%COMM,IERR)
+    CALL MPI_BCAST(IRESP,1,MPI_INTEGER,TPFILE%NMASTER_RANK-1,TPFILE%NMPICOMM,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 (IRESP==-111) CALL IO_BCAST_FIELD_METADATA(TPFILE,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)
+      CALL SCATTER_XXFIELD(TPFIELD%CDIR,ZFIELDP,PFIELD,TPFILE%NMASTER_RANK,TPFILE%NMPICOMM)
     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)
+        CALL SCATTER_XXFIELD('XX',ZFIELDP(:,1,:,:),PFIELD(:,JPHEXT+1,:,:),TPFILE%NMASTER_RANK,TPFILE%NMPICOMM)
         PFIELD(:,:,:,:) = SPREAD(PFIELD(:,JPHEXT+1,:,:),DIM=2,NCOPIES=IHEXTOT)
       ELSE
         ! XY Scatter Field
-        CALL SCATTER_XYFIELD(ZFIELDP,PFIELD,TZFD%OWNER,TZFD%COMM)
+        CALL SCATTER_XYFIELD(ZFIELDP,PFIELD,TPFILE%NMASTER_RANK,TPFILE%NMPICOMM)
       END IF
     ELSE
-      CALL MPI_BCAST(PFIELD,SIZE(PFIELD),MPI_FLOAT,TZFD%OWNER-1,TZFD%COMM,IERR)
+      CALL MPI_BCAST(PFIELD,SIZE(PFIELD),MPI_FLOAT,TPFILE%NMASTER_RANK-1,TPFILE%NMPICOMM,IERR)
     END IF
   END IF
-ELSE
-  IRESP = -61
-  CALL PRINT_MSG(NVERB_ERROR,'IO','IO_READ_FIELD_BYFIELD_X4','file '//TRIM(TPFILE%CNAME)//' not found')
 END IF
 !
 IF (GALLOC) DEALLOCATE (ZFIELDP)
@@ -1050,7 +995,6 @@ REAL,DIMENSION(:,:,:,:,:),TARGET,INTENT(INOUT) :: PFIELD   ! array containing th
 INTEGER, OPTIONAL,               INTENT(OUT)   :: KRESP    ! return-code
 !
 INTEGER                            :: IERR
-TYPE(FD_ll), POINTER               :: TZFD
 REAL,DIMENSION(:,:,:,:,:),POINTER  :: ZFIELDP
 LOGICAL                            :: GALLOC
 INTEGER                            :: IRESP
@@ -1063,8 +1007,9 @@ IRESP = 0
 ZFIELDP => NULL()
 !
 IHEXTOT = 2*JPHEXT+1
-TZFD=>GETFD(TRIM(ADJUSTL(TPFILE%CNAME))//'.lfi')
-IF (ASSOCIATED(TZFD)) THEN
+CALL IO_FILE_READ_CHECK(TPFILE,'IO_READ_FIELD_BYFIELD_X5',IRESP)
+!
+IF (IRESP==0) 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,:,:,:)
@@ -1078,14 +1023,7 @@ IF (ASSOCIATED(TZFD)) THEN
     ELSE IF (TPFILE%CFORMAT=='LFI') THEN
       CALL IO_READ_FIELD_LFI(TPFILE,TPFIELD,ZFIELDP,IRESP)
     ELSE IF (TPFILE%CFORMAT=='LFICDF4') THEN
-      !Only detected if CFORMAT='LFICDF4'
-      !This seems to be allowed for netCDF4 but it is not clean
-      CALL PRINT_MSG(NVERB_WARNING,'IO','IO_READ_FIELD_BYFIELD_X5',&
-                     TRIM(TPFILE%CNAME)//': reading in a file opened in WRITE mode')
       CALL IO_READ_FIELD_NC4(TPFILE,TPFIELD,ZFIELDP,IRESP)
-    ELSE
-      CALL PRINT_MSG(NVERB_FATAL,'IO','IO_READ_FIELD_BYFIELD_X5',&
-                     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)
@@ -1093,7 +1031,7 @@ IF (ASSOCIATED(TZFD)) THEN
       PFIELD(:,:,:,:,:)=SPREAD(PFIELD(:,JPHEXT+1,:,:,:),DIM=2,NCOPIES=IHEXTOT)
     END IF
   ELSE
-    IF (ISP == TZFD%OWNER)  THEN
+    IF (ISP == TPFILE%NMASTER_RANK)  THEN
       ! I/O processor case
       CALL ALLOCBUFFER_ll(ZFIELDP,PFIELD,TPFIELD%CDIR,GALLOC)
       IF (TPFILE%CFORMAT=='NETCDF4') THEN
@@ -1101,14 +1039,7 @@ IF (ASSOCIATED(TZFD)) THEN
       ELSE IF (TPFILE%CFORMAT=='LFI') THEN
          CALL IO_READ_FIELD_LFI(TPFILE,TPFIELD,ZFIELDP,IRESP)
       ELSE IF (TPFILE%CFORMAT=='LFICDF4') THEN
-        !Only detected if CFORMAT='LFICDF4'
-        !This seems to be allowed for netCDF4 but it is not clean
-        CALL PRINT_MSG(NVERB_WARNING,'IO','IO_READ_FIELD_BYFIELD_X5',&
-                       TRIM(TPFILE%CNAME)//': reading in a file opened in WRITE mode')
         CALL IO_READ_FIELD_NC4(TPFILE,TPFIELD,ZFIELDP,IRESP)
-      ELSE
-         CALL PRINT_MSG(NVERB_FATAL,'IO','IO_READ_FIELD_BYFIELD_X5',&
-                        TRIM(TPFILE%CNAME)//': invalid fileformat ('//TRIM(TPFILE%CFORMAT)//')')
       END IF
     ELSE
       !Not really necessary but useful to suppress alerts with Valgrind
@@ -1116,31 +1047,28 @@ IF (ASSOCIATED(TZFD)) THEN
       GALLOC = .TRUE.
     END IF
     !
-    CALL MPI_BCAST(IRESP,1,MPI_INTEGER,TZFD%OWNER-1,TZFD%COMM,IERR)
+    CALL MPI_BCAST(IRESP,1,MPI_INTEGER,TPFILE%NMASTER_RANK-1,TPFILE%NMPICOMM,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 (IRESP==-111) CALL IO_BCAST_FIELD_METADATA(TPFILE,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)
+      CALL SCATTER_XXFIELD(TPFIELD%CDIR,ZFIELDP,PFIELD,TPFILE%NMASTER_RANK,TPFILE%NMPICOMM)
     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)
+        CALL SCATTER_XXFIELD('XX',ZFIELDP(:,1,:,:,:),PFIELD(:,JPHEXT+1,:,:,:),TPFILE%NMASTER_RANK,TPFILE%NMPICOMM)
         PFIELD(:,:,:,:,:) = SPREAD(PFIELD(:,JPHEXT+1,:,:,:),DIM=2,NCOPIES=IHEXTOT)
       ELSE
         ! XY Scatter Field
-        CALL SCATTER_XYFIELD(ZFIELDP,PFIELD,TZFD%OWNER,TZFD%COMM)
+        CALL SCATTER_XYFIELD(ZFIELDP,PFIELD,TPFILE%NMASTER_RANK,TPFILE%NMPICOMM)
       END IF
     ELSE
-      CALL MPI_BCAST(PFIELD,SIZE(PFIELD),MPI_FLOAT,TZFD%OWNER-1,TZFD%COMM,IERR)
+      CALL MPI_BCAST(PFIELD,SIZE(PFIELD),MPI_FLOAT,TPFILE%NMASTER_RANK-1,TPFILE%NMPICOMM,IERR)
     END IF
   END IF
-ELSE
-  IRESP = -61
-  CALL PRINT_MSG(NVERB_ERROR,'IO','IO_READ_FIELD_BYFIELD_X5','file '//TRIM(TPFILE%CNAME)//' not found')
 END IF
 !
 IF (GALLOC) DEALLOCATE (ZFIELDP)
@@ -1193,7 +1121,6 @@ REAL,DIMENSION(:,:,:,:,:,:),TARGET,INTENT(INOUT) :: PFIELD   ! array containing
 INTEGER, OPTIONAL,                 INTENT(OUT)   :: KRESP    ! return-code
 !
 INTEGER                              :: IERR
-TYPE(FD_ll), POINTER                 :: TZFD
 REAL,DIMENSION(:,:,:,:,:,:),POINTER  :: ZFIELDP
 LOGICAL                              :: GALLOC
 INTEGER                              :: IRESP
@@ -1206,25 +1133,19 @@ IRESP = 0
 ZFIELDP => NULL()
 !
 IHEXTOT = 2*JPHEXT+1
-TZFD=>GETFD(TRIM(ADJUSTL(TPFILE%CNAME))//'.lfi')
-IF (ASSOCIATED(TZFD)) THEN
+CALL IO_FILE_READ_CHECK(TPFILE,'IO_READ_FIELD_BYFIELD_X6',IRESP)
+!
+IF (IRESP==0) 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 IF (TPFILE%CFORMAT=='LFICDF4') THEN
-      !Only detected if CFORMAT='LFICDF4'
-      !This seems to be allowed for netCDF4 but it is not clean
-      CALL PRINT_MSG(NVERB_WARNING,'IO','IO_READ_FIELD_BYFIELD_X6',&
-                     TRIM(TPFILE%CNAME)//': reading in a file opened in WRITE mode')
       CALL IO_READ_FIELD_NC4(TPFILE,TPFIELD,PFIELD,IRESP)
-    ELSE
-      CALL PRINT_MSG(NVERB_FATAL,'IO','IO_READ_FIELD_BYFIELD_X6',&
-                     TRIM(TPFILE%CNAME)//': invalid fileformat ('//TRIM(TPFILE%CFORMAT)//')')
     END IF
   ELSE
-    IF (ISP == TZFD%OWNER)  THEN
+    IF (ISP == TPFILE%NMASTER_RANK)  THEN
       ! I/O processor case
       CALL ALLOCBUFFER_ll(ZFIELDP,PFIELD,TPFIELD%CDIR,GALLOC)
       IF (TPFILE%CFORMAT=='NETCDF4') THEN
@@ -1232,14 +1153,7 @@ IF (ASSOCIATED(TZFD)) THEN
       ELSE IF (TPFILE%CFORMAT=='LFI') THEN
          CALL IO_READ_FIELD_LFI(TPFILE,TPFIELD,ZFIELDP,IRESP)
       ELSE IF (TPFILE%CFORMAT=='LFICDF4') THEN
-        !Only detected if CFORMAT='LFICDF4'
-        !This seems to be allowed for netCDF4 but it is not clean
-        CALL PRINT_MSG(NVERB_WARNING,'IO','IO_READ_FIELD_BYFIELD_X6',&
-                       TRIM(TPFILE%CNAME)//': reading in a file opened in WRITE mode')
         CALL IO_READ_FIELD_NC4(TPFILE,TPFIELD,ZFIELDP,IRESP)
-      ELSE
-         CALL PRINT_MSG(NVERB_FATAL,'IO','IO_READ_FIELD_BYFIELD_X6',&
-                        TRIM(TPFILE%CNAME)//': invalid fileformat ('//TRIM(TPFILE%CFORMAT)//')')
       END IF
     ELSE
       !Not really necessary but useful to suppress alerts with Valgrind
@@ -1247,25 +1161,22 @@ IF (ASSOCIATED(TZFD)) THEN
       GALLOC = .TRUE.
     END IF
     !
-    CALL MPI_BCAST(IRESP,1,MPI_INTEGER,TZFD%OWNER-1,TZFD%COMM,IERR)
+    CALL MPI_BCAST(IRESP,1,MPI_INTEGER,TPFILE%NMASTER_RANK-1,TPFILE%NMPICOMM,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 (IRESP==-111) CALL IO_BCAST_FIELD_METADATA(TPFILE,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)
+      CALL SCATTER_XXFIELD(TPFIELD%CDIR,ZFIELDP,PFIELD,TPFILE%NMASTER_RANK,TPFILE%NMPICOMM)
     ELSE IF (TPFIELD%CDIR == 'XY') THEN
       ! XY Scatter Field
-      CALL SCATTER_XYFIELD(ZFIELDP,PFIELD,TZFD%OWNER,TZFD%COMM)
+      CALL SCATTER_XYFIELD(ZFIELDP,PFIELD,TPFILE%NMASTER_RANK,TPFILE%NMPICOMM)
     ELSE
-      CALL MPI_BCAST(PFIELD,SIZE(PFIELD),MPI_FLOAT,TZFD%OWNER-1,TZFD%COMM,IERR)
+      CALL MPI_BCAST(PFIELD,SIZE(PFIELD),MPI_FLOAT,TPFILE%NMASTER_RANK-1,TPFILE%NMPICOMM,IERR)
     END IF
   END IF
-ELSE
-  IRESP = -61
-  CALL PRINT_MSG(NVERB_ERROR,'IO','IO_READ_FIELD_BYFIELD_X6','file '//TRIM(TPFILE%CNAME)//' not found')
 END IF
 !
 IF (GALLOC) DEALLOCATE (ZFIELDP)
@@ -1308,59 +1219,42 @@ INTEGER,          INTENT(INOUT) :: KFIELD   ! array containing the 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_N0',TRIM(TPFILE%CNAME)//': reading '//TRIM(TPFIELD%CMNHNAME))
 !
 IRESP = 0
 !
-TZFD=>GETFD(TRIM(ADJUSTL(TPFILE%CNAME))//'.lfi')
-IF (ASSOCIATED(TZFD)) THEN
+CALL IO_FILE_READ_CHECK(TPFILE,'IO_READ_FIELD_BYFIELD_N0',IRESP)
+!
+IF (IRESP==0) THEN
   IF (GSMONOPROC) THEN ! sequential execution
       IF (TPFILE%CFORMAT=='NETCDF4') THEN
          CALL IO_READ_FIELD_NC4(TPFILE,TPFIELD,KFIELD,IRESP)
       ELSE IF (TPFILE%CFORMAT=='LFI') THEN
          CALL IO_READ_FIELD_LFI(TPFILE,TPFIELD,KFIELD,IRESP)
       ELSE IF (TPFILE%CFORMAT=='LFICDF4') THEN
-        !Only detected if CFORMAT='LFICDF4'
-        !This seems to be allowed for netCDF4 but it is not clean
-        CALL PRINT_MSG(NVERB_WARNING,'IO','IO_READ_FIELD_BYFIELD_N0',&
-                       TRIM(TPFILE%CNAME)//': reading in a file opened in WRITE mode')
         CALL IO_READ_FIELD_NC4(TPFILE,TPFIELD,KFIELD,IRESP)
-      ELSE
-         CALL PRINT_MSG(NVERB_FATAL,'IO','IO_READ_FIELD_BYFIELD_N0',&
-                        TRIM(TPFILE%CNAME)//': invalid fileformat ('//TRIM(TPFILE%CFORMAT)//')')
       END IF
   ELSE
-    IF (ISP == TZFD%OWNER)  THEN
+    IF (ISP == TPFILE%NMASTER_RANK)  THEN
       IF (TPFILE%CFORMAT=='NETCDF4') THEN
          CALL IO_READ_FIELD_NC4(TPFILE,TPFIELD,KFIELD,IRESP)
       ELSE IF (TPFILE%CFORMAT=='LFI') THEN
          CALL IO_READ_FIELD_LFI(TPFILE,TPFIELD,KFIELD,IRESP)
       ELSE IF (TPFILE%CFORMAT=='LFICDF4') THEN
-        !Only detected if CFORMAT='LFICDF4'
-        !This seems to be allowed for netCDF4 but it is not clean
-        CALL PRINT_MSG(NVERB_WARNING,'IO','IO_READ_FIELD_BYFIELD_N0',&
-                       TRIM(TPFILE%CNAME)//': reading in a file opened in WRITE mode')
         CALL IO_READ_FIELD_NC4(TPFILE,TPFIELD,KFIELD,IRESP)
-      ELSE
-         CALL PRINT_MSG(NVERB_FATAL,'IO','IO_READ_FIELD_BYFIELD_N0',&
-                        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)
+    CALL MPI_BCAST(IRESP,1,MPI_INTEGER,TPFILE%NMASTER_RANK-1,TPFILE%NMPICOMM,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 (IRESP==-111) CALL IO_BCAST_FIELD_METADATA(TPFILE,TPFIELD)
     !
-    CALL MPI_BCAST(KFIELD,1,MPI_INTEGER,TZFD%OWNER-1,TZFD%COMM,IERR)
+    CALL MPI_BCAST(KFIELD,1,MPI_INTEGER,TPFILE%NMASTER_RANK-1,TPFILE%NMPICOMM,IERR)
   END IF
-ELSE
-  IRESP = -61
-  CALL PRINT_MSG(NVERB_ERROR,'IO','IO_READ_FIELD_BYFIELD_N0','file '//TRIM(TPFILE%CNAME)//' not found')
 END IF
 !
 IF (IRESP==-111) IRESP = 0 !-111 is not really an error (metadata has changed)
@@ -1404,7 +1298,6 @@ INTEGER,DIMENSION(:),INTENT(INOUT) :: KFIELD   ! array containing the data field
 INTEGER,OPTIONAL,    INTENT(OUT)   :: KRESP    ! return-code
 !
 INTEGER                      :: IERR
-TYPE(FD_ll), POINTER         :: TZFD
 INTEGER                      :: IRESP
 INTEGER,DIMENSION(:),POINTER :: IFIELDP
 LOGICAL                      :: GALLOC
@@ -1415,39 +1308,26 @@ GALLOC = .FALSE.
 IRESP = 0
 IFIELDP => NULL()
 !
-TZFD=>GETFD(TRIM(ADJUSTL(TPFILE%CNAME))//'.lfi')
-IF (ASSOCIATED(TZFD)) THEN
+CALL IO_FILE_READ_CHECK(TPFILE,'IO_READ_FIELD_BYFIELD_N1',IRESP)
+!
+IF (IRESP==0) THEN
   IF (GSMONOPROC) THEN ! sequential execution
       IF (TPFILE%CFORMAT=='NETCDF4') THEN
          CALL IO_READ_FIELD_NC4(TPFILE,TPFIELD,KFIELD,IRESP)
       ELSE IF (TPFILE%CFORMAT=='LFI') THEN
          CALL IO_READ_FIELD_LFI(TPFILE,TPFIELD,KFIELD,IRESP)
       ELSE IF (TPFILE%CFORMAT=='LFICDF4') THEN
-        !Only detected if CFORMAT='LFICDF4'
-        !This seems to be allowed for netCDF4 but it is not clean
-        CALL PRINT_MSG(NVERB_WARNING,'IO','IO_READ_FIELD_BYFIELD_N1',&
-                       TRIM(TPFILE%CNAME)//': reading in a file opened in WRITE mode')
         CALL IO_READ_FIELD_NC4(TPFILE,TPFIELD,KFIELD,IRESP)
-      ELSE
-         CALL PRINT_MSG(NVERB_FATAL,'IO','IO_READ_FIELD_BYFIELD_N1',&
-                        TRIM(TPFILE%CNAME)//': invalid fileformat ('//TRIM(TPFILE%CFORMAT)//')')
       END IF
   ELSE
-    IF (ISP == TZFD%OWNER)  THEN
+    IF (ISP == TPFILE%NMASTER_RANK)  THEN
       CALL ALLOCBUFFER_ll(IFIELDP,KFIELD,TPFIELD%CDIR,GALLOC)
       IF (TPFILE%CFORMAT=='NETCDF4') THEN
          CALL IO_READ_FIELD_NC4(TPFILE,TPFIELD,IFIELDP,IRESP)
       ELSE IF (TPFILE%CFORMAT=='LFI') THEN
          CALL IO_READ_FIELD_LFI(TPFILE,TPFIELD,IFIELDP,IRESP)
       ELSE IF (TPFILE%CFORMAT=='LFICDF4') THEN
-        !Only detected if CFORMAT='LFICDF4'
-        !This seems to be allowed for netCDF4 but it is not clean
-        CALL PRINT_MSG(NVERB_WARNING,'IO','IO_READ_FIELD_BYFIELD_N1',&
-                       TRIM(TPFILE%CNAME)//': reading in a file opened in WRITE mode')
         CALL IO_READ_FIELD_NC4(TPFILE,TPFIELD,IFIELDP,IRESP)
-      ELSE
-         CALL PRINT_MSG(NVERB_FATAL,'IO','IO_READ_FIELD_BYFIELD_N1',&
-                        TRIM(TPFILE%CNAME)//': invalid fileformat ('//TRIM(TPFILE%CFORMAT)//')')
       END IF
     ELSE
       !Not really necessary but useful to suppress alerts with Valgrind
@@ -1455,23 +1335,20 @@ IF (ASSOCIATED(TZFD)) THEN
       GALLOC = .TRUE.
     END IF
     !
-    CALL MPI_BCAST(IRESP,1,MPI_INTEGER,TZFD%OWNER-1,TZFD%COMM,IERR)
+    CALL MPI_BCAST(IRESP,1,MPI_INTEGER,TPFILE%NMASTER_RANK-1,TPFILE%NMPICOMM,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 (IRESP==-111) CALL IO_BCAST_FIELD_METADATA(TPFILE,TPFIELD)
     !
     IF (TPFIELD%CDIR /= 'XX' .AND. TPFIELD%CDIR /='YY') THEN
       ! Broadcast Field
-      CALL MPI_BCAST(KFIELD,SIZE(KFIELD),MPI_INTEGER,TZFD%OWNER-1,TZFD%COMM,IERR)
+      CALL MPI_BCAST(KFIELD,SIZE(KFIELD),MPI_INTEGER,TPFILE%NMASTER_RANK-1,TPFILE%NMPICOMM,IERR)
     ELSE
       !Scatter Field
-      CALL SCATTER_XXFIELD(TPFIELD%CDIR,IFIELDP,KFIELD,TZFD%OWNER,TZFD%COMM)
+      CALL SCATTER_XXFIELD(TPFIELD%CDIR,IFIELDP,KFIELD,TPFILE%NMASTER_RANK,TPFILE%NMPICOMM)
     END IF
   END IF
-ELSE
-  IRESP = -61
-  CALL PRINT_MSG(NVERB_ERROR,'IO','IO_READ_FIELD_BYFIELD_N1','file '//TRIM(TPFILE%CNAME)//' not found')
 END IF
 !
 IF (GALLOC) DEALLOCATE (IFIELDP)
@@ -1523,7 +1400,6 @@ INTEGER,DIMENSION(:,:),TARGET,INTENT(INOUT) :: KFIELD   ! array containing the d
 INTEGER, OPTIONAL,            INTENT(OUT)   :: KRESP    ! return-code
 !
 INTEGER                         :: IERR
-TYPE(FD_ll), POINTER            :: TZFD
 INTEGER,DIMENSION(:,:),POINTER  :: IFIELDP
 LOGICAL                         :: GALLOC
 INTEGER                         :: IRESP
@@ -1536,8 +1412,9 @@ IRESP = 0
 IFIELDP => NULL()
 !
 IHEXTOT = 2*JPHEXT+1
-TZFD=>GETFD(TRIM(ADJUSTL(TPFILE%CNAME))//'.lfi')
-IF (ASSOCIATED(TZFD)) THEN
+CALL IO_FILE_READ_CHECK(TPFILE,'IO_READ_FIELD_BYFIELD_N2',IRESP)
+!
+IF (IRESP==0) THEN
   IF (GSMONOPROC) THEN ! sequential execution
     IF (LPACK .AND. L1D .AND. SIZE(KFIELD,1)==IHEXTOT .AND. SIZE(KFIELD,2)==IHEXTOT) THEN
       IFIELDP=>KFIELD(JPHEXT+1:JPHEXT+1,JPHEXT+1:JPHEXT+1)
@@ -1551,14 +1428,7 @@ IF (ASSOCIATED(TZFD)) THEN
     ELSE IF (TPFILE%CFORMAT=='LFI') THEN
       CALL IO_READ_FIELD_LFI(TPFILE,TPFIELD,IFIELDP,IRESP)
     ELSE IF (TPFILE%CFORMAT=='LFICDF4') THEN
-      !Only detected if CFORMAT='LFICDF4'
-      !This seems to be allowed for netCDF4 but it is not clean
-      CALL PRINT_MSG(NVERB_WARNING,'IO','IO_READ_FIELD_BYFIELD_N2',&
-                     TRIM(TPFILE%CNAME)//': reading in a file opened in WRITE mode')
       CALL IO_READ_FIELD_NC4(TPFILE,TPFIELD,IFIELDP,IRESP)
-    ELSE
-      CALL PRINT_MSG(NVERB_FATAL,'IO','IO_READ_FIELD_BYFIELD_N2',&
-                     TRIM(TPFILE%CNAME)//': invalid fileformat ('//TRIM(TPFILE%CFORMAT)//')')
     END IF
     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)
@@ -1566,7 +1436,7 @@ IF (ASSOCIATED(TZFD)) THEN
       KFIELD(:,:)=SPREAD(KFIELD(:,JPHEXT+1),DIM=2,NCOPIES=IHEXTOT)
     END IF
   ELSE
-    IF (ISP == TZFD%OWNER)  THEN
+    IF (ISP == TPFILE%NMASTER_RANK)  THEN
       ! I/O processor case
       CALL ALLOCBUFFER_ll(IFIELDP,KFIELD,TPFIELD%CDIR,GALLOC)
       IF (TPFILE%CFORMAT=='NETCDF4') THEN
@@ -1574,14 +1444,7 @@ IF (ASSOCIATED(TZFD)) THEN
       ELSE IF (TPFILE%CFORMAT=='LFI') THEN
          CALL IO_READ_FIELD_LFI(TPFILE,TPFIELD,IFIELDP,IRESP)
       ELSE IF (TPFILE%CFORMAT=='LFICDF4') THEN
-        !Only detected if CFORMAT='LFICDF4'
-        !This seems to be allowed for netCDF4 but it is not clean
-        CALL PRINT_MSG(NVERB_WARNING,'IO','IO_READ_FIELD_BYFIELD_N2',&
-                       TRIM(TPFILE%CNAME)//': reading in a file opened in WRITE mode')
         CALL IO_READ_FIELD_NC4(TPFILE,TPFIELD,IFIELDP,IRESP)
-      ELSE
-         CALL PRINT_MSG(NVERB_FATAL,'IO','IO_READ_FIELD_BYFIELD_N2',&
-                        TRIM(TPFILE%CNAME)//': invalid fileformat ('//TRIM(TPFILE%CFORMAT)//')')
       END IF
     ELSE
       !Not really necessary but useful to suppress alerts with Valgrind
@@ -1589,34 +1452,31 @@ IF (ASSOCIATED(TZFD)) THEN
       GALLOC = .TRUE.
     END IF
     !
-    CALL MPI_BCAST(IRESP,1,MPI_INTEGER,TZFD%OWNER-1,TZFD%COMM,IERR)
+    CALL MPI_BCAST(IRESP,1,MPI_INTEGER,TPFILE%NMASTER_RANK-1,TPFILE%NMPICOMM,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 (IRESP==-111) CALL IO_BCAST_FIELD_METADATA(TPFILE,TPFIELD)
     !
     IF (TPFIELD%CDIR == 'XX' .OR. TPFIELD%CDIR == 'YY') THEN
       ! XX or YY Scatter Field
-      CALL SCATTER_XXFIELD(TPFIELD%CDIR,IFIELDP,KFIELD,TZFD%OWNER,TZFD%COMM)
+      CALL SCATTER_XXFIELD(TPFIELD%CDIR,IFIELDP,KFIELD,TPFILE%NMASTER_RANK,TPFILE%NMPICOMM)
       ! Broadcast Field
-      CALL MPI_BCAST(KFIELD,SIZE(KFIELD),MPI_FLOAT,TZFD%OWNER-1,TZFD%COMM,IERR)
+      CALL MPI_BCAST(KFIELD,SIZE(KFIELD),MPI_FLOAT,TPFILE%NMASTER_RANK-1,TPFILE%NMPICOMM,IERR)
     ELSE IF (TPFIELD%CDIR == 'XY') THEN
       IF (LPACK .AND. L2D) THEN
         ! 2D compact case
-        CALL SCATTER_XXFIELD('XX',IFIELDP(:,1),KFIELD(:,JPHEXT+1),TZFD%OWNER,TZFD%COMM)
+        CALL SCATTER_XXFIELD('XX',IFIELDP(:,1),KFIELD(:,JPHEXT+1),TPFILE%NMASTER_RANK,TPFILE%NMPICOMM)
         KFIELD(:,:) = SPREAD(KFIELD(:,JPHEXT+1),DIM=2,NCOPIES=IHEXTOT)
       ELSE
         ! XY Scatter Field
-        CALL SCATTER_XYFIELD(IFIELDP,KFIELD,TZFD%OWNER,TZFD%COMM)
+        CALL SCATTER_XYFIELD(IFIELDP,KFIELD,TPFILE%NMASTER_RANK,TPFILE%NMPICOMM)
       END IF
     ELSE
-      IF (ISP == TZFD%OWNER) KFIELD = IFIELDP
-      CALL MPI_BCAST(KFIELD,SIZE(KFIELD),MPI_INTEGER,TZFD%OWNER-1,TZFD%COMM,IERR)
+      IF (ISP == TPFILE%NMASTER_RANK) KFIELD = IFIELDP
+      CALL MPI_BCAST(KFIELD,SIZE(KFIELD),MPI_INTEGER,TPFILE%NMASTER_RANK-1,TPFILE%NMPICOMM,IERR)
     END IF
   END IF
-ELSE
-  IRESP = -61
-  CALL PRINT_MSG(NVERB_ERROR,'IO','IO_READ_FIELD_BYFIELD_N2','file '//TRIM(TPFILE%CNAME)//' not found')
 END IF
 !
 IF (GALLOC) DEALLOCATE (IFIELDP)
@@ -1659,59 +1519,42 @@ LOGICAL,          INTENT(INOUT) :: OFIELD   ! array containing the 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_L0',TRIM(TPFILE%CNAME)//': reading '//TRIM(TPFIELD%CMNHNAME))
 !
 IRESP = 0
 !
-TZFD=>GETFD(TRIM(ADJUSTL(TPFILE%CNAME))//'.lfi')
-IF (ASSOCIATED(TZFD)) THEN
+CALL IO_FILE_READ_CHECK(TPFILE,'IO_READ_FIELD_BYFIELD_L0',IRESP)
+!
+IF (IRESP==0) THEN
   IF (GSMONOPROC) THEN ! sequential execution
       IF (TPFILE%CFORMAT=='NETCDF4') THEN
          CALL IO_READ_FIELD_NC4(TPFILE,TPFIELD,OFIELD,IRESP)
       ELSE IF (TPFILE%CFORMAT=='LFI') THEN
          CALL IO_READ_FIELD_LFI(TPFILE,TPFIELD,OFIELD,IRESP)
       ELSE IF (TPFILE%CFORMAT=='LFICDF4') THEN
-        !Only detected if CFORMAT='LFICDF4'
-        !This seems to be allowed for netCDF4 but it is not clean
-        CALL PRINT_MSG(NVERB_WARNING,'IO','IO_READ_FIELD_BYFIELD_L0',&
-                       TRIM(TPFILE%CNAME)//': reading in a file opened in WRITE mode')
         CALL IO_READ_FIELD_NC4(TPFILE,TPFIELD,OFIELD,IRESP)
-      ELSE
-         CALL PRINT_MSG(NVERB_FATAL,'IO','IO_READ_FIELD_BYFIELD_L0',&
-                        TRIM(TPFILE%CNAME)//': invalid fileformat ('//TRIM(TPFILE%CFORMAT)//')')
       END IF
   ELSE
-    IF (ISP == TZFD%OWNER)  THEN
+    IF (ISP == TPFILE%NMASTER_RANK)  THEN
       IF (TPFILE%CFORMAT=='NETCDF4') THEN
          CALL IO_READ_FIELD_NC4(TPFILE,TPFIELD,OFIELD,IRESP)
       ELSE IF (TPFILE%CFORMAT=='LFI') THEN
          CALL IO_READ_FIELD_LFI(TPFILE,TPFIELD,OFIELD,IRESP)
       ELSE IF (TPFILE%CFORMAT=='LFICDF4') THEN
-        !Only detected if CFORMAT='LFICDF4'
-        !This seems to be allowed for netCDF4 but it is not clean
-        CALL PRINT_MSG(NVERB_WARNING,'IO','IO_READ_FIELD_BYFIELD_L0',&
-                       TRIM(TPFILE%CNAME)//': reading in a file opened in WRITE mode')
         CALL IO_READ_FIELD_NC4(TPFILE,TPFIELD,OFIELD,IRESP)
-      ELSE
-         CALL PRINT_MSG(NVERB_FATAL,'IO','IO_READ_FIELD_BYFIELD_L0',&
-                        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)
+    CALL MPI_BCAST(IRESP,1,MPI_INTEGER,TPFILE%NMASTER_RANK-1,TPFILE%NMPICOMM,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 (IRESP==-111) CALL IO_BCAST_FIELD_METADATA(TPFILE,TPFIELD)
     !
-    CALL MPI_BCAST(OFIELD,1,MPI_LOGICAL,TZFD%OWNER-1,TZFD%COMM,IERR)
+    CALL MPI_BCAST(OFIELD,1,MPI_LOGICAL,TPFILE%NMASTER_RANK-1,TPFILE%NMPICOMM,IERR)
   END IF
-ELSE
-  IRESP = -61
-  CALL PRINT_MSG(NVERB_ERROR,'IO','IO_READ_FIELD_BYFIELD_L0','file '//TRIM(TPFILE%CNAME)//' not found')
 END IF
 !
 IF (IRESP==-111) IRESP = 0 !-111 is not really an error (metadata has changed)
@@ -1752,59 +1595,42 @@ LOGICAL,DIMENSION(:),INTENT(INOUT) :: OFIELD   ! array containing the 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_L1',TRIM(TPFILE%CNAME)//': reading '//TRIM(TPFIELD%CMNHNAME))
 !
 IRESP = 0
 !
-TZFD=>GETFD(TRIM(ADJUSTL(TPFILE%CNAME))//'.lfi')
-IF (ASSOCIATED(TZFD)) THEN
+CALL IO_FILE_READ_CHECK(TPFILE,'IO_READ_FIELD_BYFIELD_L1',IRESP)
+!
+IF (IRESP==0) THEN
   IF (GSMONOPROC) THEN ! sequential execution
       IF (TPFILE%CFORMAT=='NETCDF4') THEN
          CALL IO_READ_FIELD_NC4(TPFILE,TPFIELD,OFIELD,IRESP)
       ELSE IF (TPFILE%CFORMAT=='LFI') THEN
          CALL IO_READ_FIELD_LFI(TPFILE,TPFIELD,OFIELD,IRESP)
       ELSE IF (TPFILE%CFORMAT=='LFICDF4') THEN
-        !Only detected if CFORMAT='LFICDF4'
-        !This seems to be allowed for netCDF4 but it is not clean
-        CALL PRINT_MSG(NVERB_WARNING,'IO','IO_READ_FIELD_BYFIELD_L1',&
-                       TRIM(TPFILE%CNAME)//': reading in a file opened in WRITE mode')
         CALL IO_READ_FIELD_NC4(TPFILE,TPFIELD,OFIELD,IRESP)
-      ELSE
-         CALL PRINT_MSG(NVERB_FATAL,'IO','IO_READ_FIELD_BYFIELD_L1',&
-                        TRIM(TPFILE%CNAME)//': invalid fileformat ('//TRIM(TPFILE%CFORMAT)//')')
       END IF
   ELSE
-    IF (ISP == TZFD%OWNER)  THEN
+    IF (ISP == TPFILE%NMASTER_RANK)  THEN
       IF (TPFILE%CFORMAT=='NETCDF4') THEN
          CALL IO_READ_FIELD_NC4(TPFILE,TPFIELD,OFIELD,IRESP)
       ELSE IF (TPFILE%CFORMAT=='LFI') THEN
          CALL IO_READ_FIELD_LFI(TPFILE,TPFIELD,OFIELD,IRESP)
       ELSE IF (TPFILE%CFORMAT=='LFICDF4') THEN
-        !Only detected if CFORMAT='LFICDF4'
-        !This seems to be allowed for netCDF4 but it is not clean
-        CALL PRINT_MSG(NVERB_WARNING,'IO','IO_READ_FIELD_BYFIELD_L1',&
-                       TRIM(TPFILE%CNAME)//': reading in a file opened in WRITE mode')
         CALL IO_READ_FIELD_NC4(TPFILE,TPFIELD,OFIELD,IRESP)
-      ELSE
-         CALL PRINT_MSG(NVERB_FATAL,'IO','IO_READ_FIELD_BYFIELD_L1',&
-                        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)
+    CALL MPI_BCAST(IRESP,1,MPI_INTEGER,TPFILE%NMASTER_RANK-1,TPFILE%NMPICOMM,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 (IRESP==-111) CALL IO_BCAST_FIELD_METADATA(TPFILE,TPFIELD)
     !
-    CALL MPI_BCAST(OFIELD,SIZE(OFIELD),MPI_LOGICAL,TZFD%OWNER-1,TZFD%COMM,IERR)
+    CALL MPI_BCAST(OFIELD,SIZE(OFIELD),MPI_LOGICAL,TPFILE%NMASTER_RANK-1,TPFILE%NMPICOMM,IERR)
   END IF
-ELSE
-  IRESP = -61
-  CALL PRINT_MSG(NVERB_ERROR,'IO','IO_READ_FIELD_BYFIELD_L1','file '//TRIM(TPFILE%CNAME)//' not found')
 END IF
 !
 IF (IRESP==-111) IRESP = 0 !-111 is not really an error (metadata has changed)
@@ -1845,59 +1671,42 @@ CHARACTER(LEN=*), INTENT(INOUT) :: HFIELD   ! array containing the 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_C0',TRIM(TPFILE%CNAME)//': reading '//TRIM(TPFIELD%CMNHNAME))
 !
 IRESP = 0
 !
-TZFD=>GETFD(TRIM(ADJUSTL(TPFILE%CNAME))//'.lfi')
-IF (ASSOCIATED(TZFD)) THEN
+CALL IO_FILE_READ_CHECK(TPFILE,'IO_READ_FIELD_BYFIELD_C0',IRESP)
+!
+IF (IRESP==0) THEN
   IF (GSMONOPROC) THEN ! sequential execution
       IF (TPFILE%CFORMAT=='NETCDF4') THEN
          CALL IO_READ_FIELD_NC4(TPFILE,TPFIELD,HFIELD,IRESP)
       ELSE IF (TPFILE%CFORMAT=='LFI') THEN
          CALL IO_READ_FIELD_LFI(TPFILE,TPFIELD,HFIELD,IRESP)
       ELSE IF (TPFILE%CFORMAT=='LFICDF4') THEN
-        !Only detected if CFORMAT='LFICDF4'
-        !This seems to be allowed for netCDF4 but it is not clean
-        CALL PRINT_MSG(NVERB_WARNING,'IO','IO_READ_FIELD_BYFIELD_C0',&
-                       TRIM(TPFILE%CNAME)//': reading in a file opened in WRITE mode')
         CALL IO_READ_FIELD_NC4(TPFILE,TPFIELD,HFIELD,IRESP)
-      ELSE
-         CALL PRINT_MSG(NVERB_FATAL,'IO','IO_READ_FIELD_BYFIELD_C0',&
-                        TRIM(TPFILE%CNAME)//': invalid fileformat ('//TRIM(TPFILE%CFORMAT)//')')
       END IF
   ELSE
-    IF (ISP == TZFD%OWNER)  THEN
+    IF (ISP == TPFILE%NMASTER_RANK)  THEN
       IF (TPFILE%CFORMAT=='NETCDF4') THEN
          CALL IO_READ_FIELD_NC4(TPFILE,TPFIELD,HFIELD,IRESP)
       ELSE IF (TPFILE%CFORMAT=='LFI') THEN
          CALL IO_READ_FIELD_LFI(TPFILE,TPFIELD,HFIELD,IRESP)
       ELSE IF (TPFILE%CFORMAT=='LFICDF4') THEN
-        !Only detected if CFORMAT='LFICDF4'
-        !This seems to be allowed for netCDF4 but it is not clean
-        CALL PRINT_MSG(NVERB_WARNING,'IO','IO_READ_FIELD_BYFIELD_C0',&
-                       TRIM(TPFILE%CNAME)//': reading in a file opened in WRITE mode')
         CALL IO_READ_FIELD_NC4(TPFILE,TPFIELD,HFIELD,IRESP)
-      ELSE
-         CALL PRINT_MSG(NVERB_FATAL,'IO','IO_READ_FIELD_BYFIELD_C0',&
-                        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)
+    CALL MPI_BCAST(IRESP,1,MPI_INTEGER,TPFILE%NMASTER_RANK-1,TPFILE%NMPICOMM,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 (IRESP==-111) CALL IO_BCAST_FIELD_METADATA(TPFILE,TPFIELD)
     !
-    CALL MPI_BCAST(HFIELD,LEN(HFIELD),MPI_CHARACTER,TZFD%OWNER-1,TZFD%COMM,IERR)
+    CALL MPI_BCAST(HFIELD,LEN(HFIELD),MPI_CHARACTER,TPFILE%NMASTER_RANK-1,TPFILE%NMPICOMM,IERR)
   END IF
-ELSE
-  IRESP = -61
-  CALL PRINT_MSG(NVERB_ERROR,'IO','IO_READ_FIELD_BYFIELD_C0','file '//TRIM(TPFILE%CNAME)//' not found')
 END IF
 !
 IF (IRESP==-111) IRESP = 0 !-111 is not really an error (metadata has changed)
@@ -1938,7 +1747,6 @@ 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
 !
@@ -1946,59 +1754,43 @@ CALL PRINT_MSG(NVERB_DEBUG,'IO','IO_READ_FIELD_BYFIELD_T0',TRIM(TPFILE%CNAME)//'
 !
 IRESP = 0
 !
-TZFD=>GETFD(TRIM(ADJUSTL(TPFILE%CNAME))//'.lfi')
-IF (ASSOCIATED(TZFD)) THEN
+CALL IO_FILE_READ_CHECK(TPFILE,'IO_READ_FIELD_BYFIELD_T0',IRESP)
+!
+IF (IRESP==0) 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 IF (TPFILE%CFORMAT=='LFICDF4') THEN
-        !Only detected if CFORMAT='LFICDF4'
-        !This seems to be allowed for netCDF4 but it is not clean
-        CALL PRINT_MSG(NVERB_WARNING,'IO','IO_READ_FIELD_BYFIELD_T0',&
-                       TRIM(TPFILE%CNAME)//': reading in a file opened in WRITE mode')
         CALL IO_READ_FIELD_NC4(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 (ISP == TPFILE%NMASTER_RANK)  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 IF (TPFILE%CFORMAT=='LFICDF4') THEN
-        !Only detected if CFORMAT='LFICDF4'
-        !This seems to be allowed for netCDF4 but it is not clean
-        CALL PRINT_MSG(NVERB_WARNING,'IO','IO_READ_FIELD_BYFIELD_T0',&
-                       TRIM(TPFILE%CNAME)//': reading in a file opened in WRITE mode')
         CALL IO_READ_FIELD_NC4(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)
+    CALL MPI_BCAST(IRESP,1,MPI_INTEGER,TPFILE%NMASTER_RANK-1,TPFILE%NMPICOMM,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 (IRESP==-111) CALL IO_BCAST_FIELD_METADATA(TPFILE,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)
+    CALL MPI_BCAST(ITDATE,     3,MPI_INTEGER,TPFILE%NMASTER_RANK-1,TPFILE%NMPICOMM,IERR)
+    CALL MPI_BCAST(TPDATA%TIME,1,MPI_FLOAT,  TPFILE%NMASTER_RANK-1,TPFILE%NMPICOMM,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 (IRESP==-111) IRESP = 0 !-111 is not really an error (metadata has changed)
@@ -2069,7 +1861,6 @@ REAL,DIMENSION(:,:,:),ALLOCATABLE,TARGET :: Z3D
 REAL,DIMENSION(:,:,:), POINTER           :: TX3DP
 REAL(KIND=8),DIMENSION(2)                :: T0,T1,T2,T3
 REAL(KIND=8),DIMENSION(2)                :: T11,T22
-TYPE(FD_ll), POINTER                     :: TZFD
 TYPE(TX_3DP),ALLOCATABLE,DIMENSION(:)    :: T_TX3DP
 !
 CALL PRINT_MSG(NVERB_DEBUG,'IO','IO_READ_FIELD_BYFIELD_LB','reading '//TRIM(TPFIELD%CMNHNAME))
@@ -2088,8 +1879,9 @@ CALL SECOND_MNH2(T11)
 IRESP = 0
 !------------------------------------------------------------------
 IHEXTOT = 2*JPHEXT+1
-TZFD=>GETFD(TRIM(ADJUSTL(TPFILE%CNAME))//'.lfi')
-IF (ASSOCIATED(TZFD)) THEN
+CALL IO_FILE_READ_CHECK(TPFILE,'IO_READ_FIELD_BYFIELD_LB',IRESP)
+!
+IF (IRESP==0) THEN
   IF (GSMONOPROC) THEN ! sequential execution
     IF (YLBTYPE == 'LBX' .OR. YLBTYPE == 'LBXU') THEN
       ALLOCATE(Z3D(KL3D,SIZE(PLB,2),SIZE(PLB,3)))
@@ -2109,14 +1901,7 @@ IF (ASSOCIATED(TZFD)) THEN
     ELSE IF (TPFILE%CFORMAT=='LFI') THEN
       CALL IO_READ_FIELD_LFI(TPFILE,TPFIELD,TX3DP,IRESP)
     ELSE IF (TPFILE%CFORMAT=='LFICDF4') THEN
-      !Only detected if CFORMAT='LFICDF4'
-      !This seems to be allowed for netCDF4 but it is not clean
-      CALL PRINT_MSG(NVERB_WARNING,'IO','IO_READ_FIELD_BYFIELD_LB',&
-                     TRIM(TPFILE%CNAME)//': reading in a file opened in WRITE mode')
       CALL IO_READ_FIELD_NC4(TPFILE,TPFIELD,TX3DP,IRESP)
-    ELSE
-      CALL PRINT_MSG(NVERB_FATAL,'IO','IO_READ_FIELD_BYFIELD_LB',&
-                     TRIM(TPFILE%CNAME)//': invalid fileformat ('//TRIM(TPFILE%CFORMAT)//')')
     END IF
     IF (YLBTYPE == 'LBX' .OR. YLBTYPE == 'LBXU') THEN
       IF (LPACK .AND. L2D) Z3D(:,:,:) = SPREAD(Z3D(:,JPHEXT+1,:),DIM=2,NCOPIES=IHEXTOT)
@@ -2127,7 +1912,7 @@ IF (ASSOCIATED(TZFD)) THEN
       PLB(:,KRIM+JPHEXT+1:2*(KRIM+JPHEXT),:) = Z3D(:,KL3D-KRIM-JPHEXT+1:KL3D,:)
     END IF
   ELSE                 ! multiprocessor execution
-    IF (ISP == TZFD%OWNER)  THEN
+    IF (ISP == TPFILE%NMASTER_RANK)  THEN
       CALL SECOND_MNH2(T0)
       CALL GET_GLOBALDIMS_ll(IIMAX_ll,IJMAX_ll)
       IF (YLBTYPE == 'LBX' .OR. YLBTYPE == 'LBXU') THEN
@@ -2148,14 +1933,7 @@ IF (ASSOCIATED(TZFD)) THEN
       ELSE IF (TPFILE%CFORMAT=='LFI') THEN
         CALL IO_READ_FIELD_LFI(TPFILE,TPFIELD,TX3DP,IRESP)
       ELSE IF (TPFILE%CFORMAT=='LFICDF4') THEN
-        !Only detected if CFORMAT='LFICDF4'
-        !This seems to be allowed for netCDF4 but it is not clean
-        CALL PRINT_MSG(NVERB_WARNING,'IO','IO_READ_FIELD_BYFIELD_LB',&
-                       TRIM(TPFILE%CNAME)//': reading in a file opened in WRITE mode')
         CALL IO_READ_FIELD_NC4(TPFILE,TPFIELD,TX3DP,IRESP)
-      ELSE
-        CALL PRINT_MSG(NVERB_FATAL,'IO','IO_READ_FIELD_BYFIELD_LB',&
-                       TRIM(TPFILE%CNAME)//': invalid fileformat ('//TRIM(TPFILE%CFORMAT)//')')
       END IF
       IF (YLBTYPE == 'LBX' .OR. YLBTYPE == 'LBXU') THEN
         IF (LPACK .AND. L2D) Z3D(:,:,:) = SPREAD(Z3D(:,JPHEXT+1,:),DIM=2,NCOPIES=IHEXTOT)
@@ -2169,16 +1947,16 @@ IF (ASSOCIATED(TZFD)) THEN
       TIMEZ%T_READLB_READ=TIMEZ%T_READLB_READ + T1 - T0
     END IF
     !
-    CALL MPI_BCAST(IRESP,1,MPI_INTEGER,TZFD%OWNER-1,TZFD%COMM,IERR)
+    CALL MPI_BCAST(IRESP,1,MPI_INTEGER,TPFILE%NMASTER_RANK-1,TPFILE%NMPICOMM,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 (IRESP==-111) CALL IO_BCAST_FIELD_METADATA(TPFILE,TPFIELD)
     !
     NB_REQ=0
     ALLOCATE(REQ_TAB(ISNPROC-1))
     !REQ_TAB=MPI_REQUEST_NULL
-    IF (ISP == TZFD%OWNER)  THEN
+    IF (ISP == TPFILE%NMASTER_RANK)  THEN
        CALL SECOND_MNH2(T1)
       !ALLOCATE(REQ_TAB(ISNPROC-1))
       !REQ_TAB=MPI_REQUEST_NULL
@@ -2192,8 +1970,8 @@ IF (ASSOCIATED(TZFD)) THEN
             NB_REQ = NB_REQ + 1
             ALLOCATE(T_TX3DP(NB_REQ)%X(IIB:IIE,IJB:IJE,IKU))
             T_TX3DP(NB_REQ)%X=Z3D(IIB:IIE,IJB:IJE,:)
-            CALL MPI_ISEND(T_TX3DP(NB_REQ)%X,SIZE(TX3DP),MPI_FLOAT,JI-1,99,TZFD%COMM,REQ_TAB(NB_REQ),IERR)
-            !CALL MPI_BSEND(T_TX3DP(NB_REQ)%X,SIZE(TX3DP),MPI_FLOAT,JI-1,99,TZFD%COMM,IERR)
+            CALL MPI_ISEND(T_TX3DP(NB_REQ)%X,SIZE(TX3DP),MPI_FLOAT,JI-1,99,TPFILE%NMPICOMM,REQ_TAB(NB_REQ),IERR)
+            !CALL MPI_BSEND(T_TX3DP(NB_REQ)%X,SIZE(TX3DP),MPI_FLOAT,JI-1,99,TPFILE%NMPICOMM,IERR)
           ELSE
             CALL GET_DISTRIB_LB(YLBTYPE,JI,'LOC','READ',KRIM,IIB,IIE,IJB,IJE)
             PLB(IIB:IIE,IJB:IJE,:) = TX3DP(:,:,:)
@@ -2220,9 +1998,9 @@ IF (ASSOCIATED(TZFD)) THEN
       CALL GET_DISTRIB_LB(YLBTYPE,ISP,'LOC','READ',KRIM,IIB,IIE,IJB,IJE)
       IF (IIB /= 0) THEN
         TX3DP=>PLB(IIB:IIE,IJB:IJE,:)
-        CALL MPI_RECV(TX3DP,SIZE(TX3DP),MPI_FLOAT,TZFD%OWNER-1,99,TZFD%COMM,STATUS,IERR)
+        CALL MPI_RECV(TX3DP,SIZE(TX3DP),MPI_FLOAT,TPFILE%NMASTER_RANK-1,99,TPFILE%NMPICOMM,STATUS,IERR)
         !NB_REQ = NB_REQ + 1
-        !CALL MPI_IRECV(TX3DP,SIZE(TX3DP),MPI_FLOAT,TZFD%OWNER-1,99,TZFD%COMM,REQ_TAB(NB_REQ),IERR)
+        !CALL MPI_IRECV(TX3DP,SIZE(TX3DP),MPI_FLOAT,TPFILE%NMASTER_RANK-1,99,TPFILE%NMPICOMM,REQ_TAB(NB_REQ),IERR)
         !IF (NB_REQ .GT.0 ) CALL MPI_WAITALL(NB_REQ,REQ_TAB,MNH_STATUSES_IGNORE,IERR)
       END IF
       CALL SECOND_MNH2(T1)
@@ -2230,9 +2008,6 @@ IF (ASSOCIATED(TZFD)) THEN
     END IF
     DEALLOCATE(REQ_TAB)
   END IF !(GSMONOPROC)
-ELSE
-  IRESP = -61
-  CALL PRINT_MSG(NVERB_ERROR,'IO','IO_READ_FIELD_BYFIELD_LB','file '//TRIM(TPFILE%CNAME)//' not found')
 END IF
 !----------------------------------------------------------------
 !
diff --git a/src/LIB/SURCOUCHE/src/fmwrit_ll.f90 b/src/LIB/SURCOUCHE/src/fmwrit_ll.f90
index 9915319f2..29a82e335 100644
--- a/src/LIB/SURCOUCHE/src/fmwrit_ll.f90
+++ b/src/LIB/SURCOUCHE/src/fmwrit_ll.f90
@@ -380,12 +380,12 @@ CONTAINS
           IF (LLFIOUT) CALL IO_WRITE_FIELD_LFI(TPFILE,TPFIELD,PFIELD,IRESP)
           IF (LIOCDF4) CALL IO_WRITE_FIELD_NC4(TPFILE,TPFIELD,TZFD%CDF,PFIELD,IRESP)
        ELSE ! multiprocessor execution
-          IF (ISP == TZFD%OWNER)  THEN
+          IF (ISP == TPFILE%NMASTER_RANK)  THEN
              IF (LLFIOUT) CALL IO_WRITE_FIELD_LFI(TPFILE,TPFIELD,PFIELD,IRESP)
              IF (LIOCDF4) CALL IO_WRITE_FIELD_NC4(TPFILE,TPFIELD,TZFD%CDF,PFIELD,IRESP)
           END IF
           !
-          CALL MPI_BCAST(IRESP,1,MPI_INTEGER,TZFD%OWNER-1,TZFD%COMM,IERR)
+          CALL MPI_BCAST(IRESP,1,MPI_INTEGER,TPFILE%NMASTER_RANK-1,TPFILE%NMPICOMM,IERR)
        END IF ! multiprocessor execution
        IF (TZFD%nb_procio.gt.1) THEN
           ! write the data in all Z files
@@ -503,9 +503,9 @@ CONTAINS
           IF (LIOCDF4) CALL IO_WRITE_FIELD_NC4(TPFILE,TPFIELD,TZFD%CDF,PFIELD,IRESP)
        ELSE ! multiprocessor execution
 #ifndef MNH_INT8
-          CALL MPI_ALLREDUCE(SIZE(PFIELD),ISIZEMAX,1,MPI_INTEGER,MPI_MAX,TZFD%COMM,IRESP)
+          CALL MPI_ALLREDUCE(SIZE(PFIELD),ISIZEMAX,1,MPI_INTEGER,MPI_MAX,TPFILE%NMPICOMM,IRESP)
 #else
-          CALL MPI_ALLREDUCE(SIZE(PFIELD),ISIZEMAX,1,MPI_INTEGER8,MPI_MAX,TZFD%COMM,IRESP)
+          CALL MPI_ALLREDUCE(SIZE(PFIELD),ISIZEMAX,1,MPI_INTEGER8,MPI_MAX,TPFILE%NMPICOMM,IRESP)
 #endif
           IF (ISIZEMAX==0) THEN
              CALL PRINT_MSG(NVERB_INFO,'IO','IO_WRITE_FIELD_BYFIELD_X1','ignoring variable with a zero size ('//TRIM(YRECFM)//')')
@@ -513,7 +513,7 @@ CONTAINS
              RETURN
           END IF
 
-          IF (ISP == TZFD%OWNER)  THEN
+          IF (ISP == TPFILE%NMASTER_RANK)  THEN
              CALL ALLOCBUFFER_ll(ZFIELDP,PFIELD,YDIR,GALLOC)
           ELSE
              ALLOCATE(ZFIELDP(0))
@@ -521,15 +521,15 @@ CONTAINS
           END IF
           !
           IF (YDIR == 'XX' .OR. YDIR =='YY') THEN
-             CALL GATHER_XXFIELD(YDIR,PFIELD,ZFIELDP,TZFD%OWNER,TZFD%COMM)
+             CALL GATHER_XXFIELD(YDIR,PFIELD,ZFIELDP,TPFILE%NMASTER_RANK,TPFILE%NMPICOMM)
           END IF
           !
-          IF (ISP == TZFD%OWNER)  THEN
+          IF (ISP == TPFILE%NMASTER_RANK)  THEN
              IF (LLFIOUT) CALL IO_WRITE_FIELD_LFI(TPFILE,TPFIELD,ZFIELDP,IRESP)
              IF (LIOCDF4) CALL IO_WRITE_FIELD_NC4(TPFILE,TPFIELD,TZFD%CDF,ZFIELDP,IRESP)
           END IF
           !
-          CALL MPI_BCAST(IRESP,1,MPI_INTEGER,TZFD%OWNER-1,TZFD%COMM,IERR)
+          CALL MPI_BCAST(IRESP,1,MPI_INTEGER,TPFILE%NMASTER_RANK-1,TPFILE%NMPICOMM,IERR)
        END IF ! multiprocessor execution
     ELSE
        IRESP = -61
@@ -658,9 +658,9 @@ CONTAINS
        ELSE ! multiprocessor execution
           CALL SECOND_MNH2(T0)
 #ifndef MNH_INT8
-          CALL MPI_ALLREDUCE(SIZE(PFIELD),ISIZEMAX,1,MPI_INTEGER,MPI_MAX,TZFD%COMM,IRESP)
+          CALL MPI_ALLREDUCE(SIZE(PFIELD),ISIZEMAX,1,MPI_INTEGER,MPI_MAX,TPFILE%NMPICOMM,IRESP)
 #else
-          CALL MPI_ALLREDUCE(SIZE(PFIELD),ISIZEMAX,1,MPI_INTEGER8,MPI_MAX,TZFD%COMM,IRESP)
+          CALL MPI_ALLREDUCE(SIZE(PFIELD),ISIZEMAX,1,MPI_INTEGER8,MPI_MAX,TPFILE%NMPICOMM,IRESP)
 #endif
           IF (ISIZEMAX==0) THEN
              CALL PRINT_MSG(NVERB_INFO,'IO','IO_WRITE_FIELD_BYFIELD_X2','ignoring variable with a zero size ('//TRIM(YRECFM)//')')
@@ -668,7 +668,7 @@ CONTAINS
              RETURN
           END IF
 
-          IF (ISP == TZFD%OWNER)  THEN
+          IF (ISP == TPFILE%NMASTER_RANK)  THEN
              ! I/O processor case
              CALL ALLOCBUFFER_ll(ZFIELDP,PFIELD,YDIR,GALLOC)
           ELSE
@@ -677,10 +677,10 @@ CONTAINS
           END IF
           !   
           IF (YDIR == 'XX' .OR. YDIR =='YY') THEN
-             CALL GATHER_XXFIELD(YDIR,PFIELD,ZFIELDP,TZFD%OWNER,TZFD%COMM)
+             CALL GATHER_XXFIELD(YDIR,PFIELD,ZFIELDP,TPFILE%NMASTER_RANK,TPFILE%NMPICOMM)
           ELSEIF (YDIR == 'XY') THEN
              IF (LPACK .AND. L2D) THEN
-                CALL GATHER_XXFIELD('XX',PFIELD(:,JPHEXT+1),ZFIELDP(:,1),TZFD%OWNER,TZFD%COMM)
+                CALL GATHER_XXFIELD('XX',PFIELD(:,JPHEXT+1),ZFIELDP(:,1),TPFILE%NMASTER_RANK,TPFILE%NMPICOMM)
              ELSE
 #ifdef MNH_GA
           !
@@ -697,7 +697,7 @@ CONTAINS
 !!$          " NIXO_L=",NIXO_L,"NIYO_L=",NIYO_L," ld_col=",ld_col," ISP=",ISP
          call ga_sync
          DEALLOCATE (ZFIELD_GA)
-         IF (ISP == TZFD%OWNER)  THEN      
+         IF (ISP == TPFILE%NMASTER_RANK) THEN
             !
             ! this proc get the  Z slide to write
             !
@@ -710,8 +710,8 @@ CONTAINS
          END IF
 !!$         call ga_sync
 #else
-         CALL GATHER_XYFIELD(PFIELD,ZFIELDP,TZFD%OWNER,TZFD%COMM)
-!!$         IF (ISP == TZFD%OWNER)  THEN   
+         CALL GATHER_XYFIELD(PFIELD,ZFIELDP,TPFILE%NMASTER_RANK,TPFILE%NMPICOMM)
+!!$         IF (ISP == TPFILE%NMASTER_RANK)  THEN
 !!$            print*,YRECFM, "ERR=", MAXVAL (ZFIELDP_GA - ZFIELDP)
 !!$            DO JI=1,IJU_ll
 !!$            !print*,YRECFM, "ERR=", ZFIELDP_GA(:,JI) - ZFIELDP(:,JI)
@@ -725,7 +725,7 @@ CONTAINS
           CALL SECOND_MNH2(T1)
           TIMEZ%T_WRIT2D_GATH=TIMEZ%T_WRIT2D_GATH + T1 - T0
           !
-          IF (ISP == TZFD%OWNER)  THEN             
+          IF (ISP == TPFILE%NMASTER_RANK) THEN
              IF (LLFIOUT) CALL IO_WRITE_FIELD_LFI(TPFILE,TPFIELD,ZFIELDP,IRESP)
              IF (LIOCDF4) CALL IO_WRITE_FIELD_NC4(TPFILE,TPFIELD,TZFD%CDF,ZFIELDP,IRESP)
           END IF
@@ -740,8 +740,7 @@ CONTAINS
           CALL SECOND_MNH2(T2)
           TIMEZ%T_WRIT2D_WRIT=TIMEZ%T_WRIT2D_WRIT + T2 - T1
           !
-          CALL MPI_BCAST(IRESP,1,MPI_INTEGER,TZFD%OWNER-1,TZFD&
-               & %COMM,IERR)
+          CALL MPI_BCAST(IRESP,1,MPI_INTEGER,TPFILE%NMASTER_RANK-1,TPFILE%NMPICOMM,IERR)
        END IF
     ELSE
        IRESP = -61
@@ -755,7 +754,7 @@ CONTAINS
     END IF
     IF (GALLOC) DEALLOCATE(ZFIELDP)
     IF (PRESENT(KRESP)) KRESP = IRESP
-    IF (ASSOCIATED(TZFD)) CALL MPI_BARRIER(TZFD%COMM,IERR)
+    IF (ASSOCIATED(TZFD)) CALL MPI_BARRIER(TPFILE%NMPICOMM,IERR)
     CALL SECOND_MNH2(T22)
     TIMEZ%T_WRIT2D_ALL=TIMEZ%T_WRIT2D_ALL + T22 - T11
   END SUBROUTINE IO_WRITE_FIELD_BYFIELD_X2
@@ -892,9 +891,9 @@ CONTAINS
           END IF
        ELSEIF ( (TZFD%nb_procio .eq. 1 ) .OR. ( YDIR == '--' ) ) THEN  ! multiprocessor execution & 1 proc IO
 #ifndef MNH_INT8
-          CALL MPI_ALLREDUCE(SIZE(PFIELD),ISIZEMAX,1,MPI_INTEGER,MPI_MAX,TZFD%COMM,IRESP)
+          CALL MPI_ALLREDUCE(SIZE(PFIELD),ISIZEMAX,1,MPI_INTEGER,MPI_MAX,TPFILE%NMPICOMM,IRESP)
 #else
-          CALL MPI_ALLREDUCE(SIZE(PFIELD),ISIZEMAX,1,MPI_INTEGER8,MPI_MAX,TZFD%COMM,IRESP)
+          CALL MPI_ALLREDUCE(SIZE(PFIELD),ISIZEMAX,1,MPI_INTEGER8,MPI_MAX,TPFILE%NMPICOMM,IRESP)
 #endif
           IF (ISIZEMAX==0) THEN
              CALL PRINT_MSG(NVERB_INFO,'IO','IO_WRITE_FIELD_BYFIELD_X3','ignoring variable with a zero size ('//TRIM(YRECFM)//')')
@@ -903,7 +902,7 @@ CONTAINS
           END IF
 
           ! write 3D field in 1 time = output for graphique
-          IF (ISP == TZFD%OWNER)  THEN
+          IF (ISP == TPFILE%NMASTER_RANK)  THEN
              CALL ALLOCBUFFER_ll(ZFIELDP,PFIELD,YDIR,GALLOC)
           ELSE
              ALLOCATE(ZFIELDP(0,0,0))
@@ -911,28 +910,27 @@ CONTAINS
           END IF
           !
           IF (YDIR == 'XX' .OR. YDIR =='YY') THEN
-             CALL GATHER_XXFIELD(YDIR,PFIELD,ZFIELDP,TZFD%OWNER,TZFD%COMM)
+             CALL GATHER_XXFIELD(YDIR,PFIELD,ZFIELDP,TPFILE%NMASTER_RANK,TPFILE%NMPICOMM)
           ELSEIF (YDIR == 'XY') THEN
              IF (LPACK .AND. L2D) THEN
-                CALL GATHER_XXFIELD('XX',PFIELD(:,JPHEXT+1,:),ZFIELDP(:,1,:),TZFD%OWNER,TZFD%COMM)
+                CALL GATHER_XXFIELD('XX',PFIELD(:,JPHEXT+1,:),ZFIELDP(:,1,:),TPFILE%NMASTER_RANK,TPFILE%NMPICOMM)
              ELSE
-                CALL GATHER_XYFIELD(PFIELD,ZFIELDP,TZFD%OWNER,TZFD%COMM)
+                CALL GATHER_XYFIELD(PFIELD,ZFIELDP,TPFILE%NMASTER_RANK,TPFILE%NMPICOMM)
              END IF
           END IF
           !
-          IF (ISP == TZFD%OWNER)  THEN
+          IF (ISP == TPFILE%NMASTER_RANK)  THEN
              IF (LLFIOUT) CALL IO_WRITE_FIELD_LFI(TPFILE,TPFIELD,ZFIELDP,IRESP)
              IF (LIOCDF4) CALL IO_WRITE_FIELD_NC4(TPFILE,TPFIELD,TZFD%CDF,ZFIELDP,IRESP)
           END IF
           !
-          CALL MPI_BCAST(IRESP,1,MPI_INTEGER,TZFD%OWNER-1,TZFD&
-               & %COMM,IERR)
+          CALL MPI_BCAST(IRESP,1,MPI_INTEGER,TPFILE%NMASTER_RANK-1,TPFILE%NMPICOMM,IERR)
           !
        ELSE ! multiprocessor execution & // IO
 #ifndef MNH_INT8
-          CALL MPI_ALLREDUCE(SIZE(PFIELD),ISIZEMAX,1,MPI_INTEGER,MPI_MAX,TZFD%COMM,IRESP)
+          CALL MPI_ALLREDUCE(SIZE(PFIELD),ISIZEMAX,1,MPI_INTEGER,MPI_MAX,TPFILE%NMPICOMM,IRESP)
 #else
-          CALL MPI_ALLREDUCE(SIZE(PFIELD),ISIZEMAX,1,MPI_INTEGER8,MPI_MAX,TZFD%COMM,IRESP)
+          CALL MPI_ALLREDUCE(SIZE(PFIELD),ISIZEMAX,1,MPI_INTEGER8,MPI_MAX,TPFILE%NMPICOMM,IRESP)
 #endif
           IF (ISIZEMAX==0) THEN
              CALL PRINT_MSG(NVERB_INFO,'IO','IO_WRITE_FIELD_BYFIELD_X3','ignoring variable with a zero size ('//TRIM(YRECFM)//')')
@@ -1044,11 +1042,11 @@ CONTAINS
                 !
                 IF (YDIR == 'XX' .OR. YDIR =='YY') THEN
                    STOP " XX NON PREVU SUR BG POUR LE MOMENT "
-                   CALL GATHER_XXFIELD(YDIR,PFIELD,ZFIELDP,TZFD%OWNER,TZFD%COMM)
+                   CALL GATHER_XXFIELD(YDIR,PFIELD,ZFIELDP,TPFILE%NMASTER_RANK,TPFILE%NMPICOMM)
                 ELSEIF (YDIR == 'XY') THEN
                    IF (LPACK .AND. L2D) THEN
                       STOP " L2D NON PREVU SUR BG POUR LE MOMENT "
-                      CALL GATHER_XXFIELD('XX',PFIELD(:,JPHEXT+1,:),ZFIELDP(:,1,:),TZFD%OWNER,TZFD%COMM)
+                      CALL GATHER_XXFIELD('XX',PFIELD(:,JPHEXT+1,:),ZFIELDP(:,1,:),TPFILE%NMASTER_RANK,TPFILE%NMPICOMM)
                    ELSE
                       !CALL GATHER_XYFIELD(ZSLIDE,ZSLIDE_ll,TZFD_IOZ%OWNER,TZFD_IOZ%COMM)
                       !JUANIOZ
@@ -1153,7 +1151,7 @@ CONTAINS
     IF (GALLOC_ll) DEALLOCATE(ZSLIDE_ll)
     !IF (Associated(ZSLIDE_ll)) DEALLOCATE(ZSLIDE_ll)
     IF (PRESENT(KRESP)) KRESP = IRESP
-    IF (ASSOCIATED(TZFD)) CALL MPI_BARRIER(TZFD%COMM,IERR)
+    IF (ASSOCIATED(TZFD)) CALL MPI_BARRIER(TPFILE%NMPICOMM,IERR)
     CALL SECOND_MNH2(T22)
     TIMEZ%T_WRIT3D_ALL=TIMEZ%T_WRIT3D_ALL + T22 - T11
   END SUBROUTINE IO_WRITE_FIELD_BYFIELD_X3
@@ -1254,9 +1252,9 @@ CONTAINS
           END IF
        ELSE
 #ifndef MNH_INT8
-          CALL MPI_ALLREDUCE(SIZE(PFIELD),ISIZEMAX,1,MPI_INTEGER,MPI_MAX,TZFD%COMM,IRESP)
+          CALL MPI_ALLREDUCE(SIZE(PFIELD),ISIZEMAX,1,MPI_INTEGER,MPI_MAX,TPFILE%NMPICOMM,IRESP)
 #else
-          CALL MPI_ALLREDUCE(SIZE(PFIELD),ISIZEMAX,1,MPI_INTEGER8,MPI_MAX,TZFD%COMM,IRESP)
+          CALL MPI_ALLREDUCE(SIZE(PFIELD),ISIZEMAX,1,MPI_INTEGER8,MPI_MAX,TPFILE%NMPICOMM,IRESP)
 #endif
           IF (ISIZEMAX==0) THEN
              CALL PRINT_MSG(NVERB_INFO,'IO','IO_WRITE_FIELD_BYFIELD_X4','ignoring variable with a zero size ('//TRIM(YRECFM)//')')
@@ -1264,7 +1262,7 @@ CONTAINS
              RETURN
           END IF
 
-          IF (ISP == TZFD%OWNER)  THEN
+          IF (ISP == TPFILE%NMASTER_RANK)  THEN
              CALL ALLOCBUFFER_ll(ZFIELDP,PFIELD,YDIR,GALLOC)
           ELSE
              ALLOCATE(ZFIELDP(0,0,0,0))
@@ -1272,21 +1270,21 @@ CONTAINS
           END IF
           !
           IF (YDIR == 'XX' .OR. YDIR =='YY') THEN
-             CALL GATHER_XXFIELD(YDIR,PFIELD,ZFIELDP,TZFD%OWNER,TZFD%COMM)
+             CALL GATHER_XXFIELD(YDIR,PFIELD,ZFIELDP,TPFILE%NMASTER_RANK,TPFILE%NMPICOMM)
           ELSEIF (YDIR == 'XY') THEN
              IF (LPACK .AND. L2D) THEN
-                CALL GATHER_XXFIELD('XX',PFIELD(:,JPHEXT+1,:,:),ZFIELDP(:,1,:,:),TZFD%OWNER,TZFD%COMM)
+                CALL GATHER_XXFIELD('XX',PFIELD(:,JPHEXT+1,:,:),ZFIELDP(:,1,:,:),TPFILE%NMASTER_RANK,TPFILE%NMPICOMM)
              ELSE
-                CALL GATHER_XYFIELD(PFIELD,ZFIELDP,TZFD%OWNER,TZFD%COMM)
+                CALL GATHER_XYFIELD(PFIELD,ZFIELDP,TPFILE%NMASTER_RANK,TPFILE%NMPICOMM)
              END IF
           END IF
           !
-          IF (ISP == TZFD%OWNER)  THEN
+          IF (ISP == TPFILE%NMASTER_RANK)  THEN
              IF (LLFIOUT) CALL IO_WRITE_FIELD_LFI(TPFILE,TPFIELD,ZFIELDP,IRESP)
              IF (LIOCDF4) CALL IO_WRITE_FIELD_NC4(TPFILE,TPFIELD,TZFD%CDF,ZFIELDP,IRESP)
           END IF
           !
-          CALL MPI_BCAST(IRESP,1,MPI_INTEGER,TZFD%OWNER-1,TZFD%COMM,IERR)
+          CALL MPI_BCAST(IRESP,1,MPI_INTEGER,TPFILE%NMASTER_RANK-1,TPFILE%NMPICOMM,IERR)
        END IF ! multiprocessor execution
     ELSE
        IRESP = -61
@@ -1398,9 +1396,9 @@ CONTAINS
           END IF
        ELSE
 #ifndef MNH_INT8
-          CALL MPI_ALLREDUCE(SIZE(PFIELD),ISIZEMAX,1,MPI_INTEGER,MPI_MAX,TZFD%COMM,IRESP)
+          CALL MPI_ALLREDUCE(SIZE(PFIELD),ISIZEMAX,1,MPI_INTEGER,MPI_MAX,TPFILE%NMPICOMM,IRESP)
 #else
-          CALL MPI_ALLREDUCE(SIZE(PFIELD),ISIZEMAX,1,MPI_INTEGER8,MPI_MAX,TZFD%COMM,IRESP)
+          CALL MPI_ALLREDUCE(SIZE(PFIELD),ISIZEMAX,1,MPI_INTEGER8,MPI_MAX,TPFILE%NMPICOMM,IRESP)
 #endif
           IF (ISIZEMAX==0) THEN
              CALL PRINT_MSG(NVERB_INFO,'IO','IO_WRITE_FIELD_BYFIELD_X5','ignoring variable with a zero size ('//TRIM(YRECFM)//')')
@@ -1408,7 +1406,7 @@ CONTAINS
              RETURN
           END IF
 
-          IF (ISP == TZFD%OWNER)  THEN
+          IF (ISP == TPFILE%NMASTER_RANK)  THEN
              CALL ALLOCBUFFER_ll(ZFIELDP,PFIELD,YDIR,GALLOC)
           ELSE
              ALLOCATE(ZFIELDP(0,0,0,0,0))
@@ -1416,22 +1414,22 @@ CONTAINS
           END IF
           !
           IF (YDIR == 'XX' .OR. YDIR =='YY') THEN
-             CALL GATHER_XXFIELD(YDIR,PFIELD,ZFIELDP,TZFD%OWNER,TZFD%COMM)
+             CALL GATHER_XXFIELD(YDIR,PFIELD,ZFIELDP,TPFILE%NMASTER_RANK,TPFILE%NMPICOMM)
           ELSEIF (YDIR == 'XY') THEN
              IF (LPACK .AND. L2D) THEN
                 CALL GATHER_XXFIELD('XX',PFIELD(:,JPHEXT+1,:,:,:),ZFIELDP(:,1,:,:,:),&
-                     & TZFD%OWNER,TZFD%COMM)
+                     & TPFILE%NMASTER_RANK,TPFILE%NMPICOMM)
              ELSE
-                CALL GATHER_XYFIELD(PFIELD,ZFIELDP,TZFD%OWNER,TZFD%COMM)
+                CALL GATHER_XYFIELD(PFIELD,ZFIELDP,TPFILE%NMASTER_RANK,TPFILE%NMPICOMM)
              END IF
           END IF
           !
-          IF (ISP == TZFD%OWNER)  THEN
+          IF (ISP == TPFILE%NMASTER_RANK)  THEN
              IF (LLFIOUT) CALL IO_WRITE_FIELD_LFI(TPFILE,TPFIELD,ZFIELDP,IRESP)
              IF (LIOCDF4) CALL IO_WRITE_FIELD_NC4(TPFILE,TPFIELD,TZFD%CDF,ZFIELDP,IRESP)
           END IF
           !
-          CALL MPI_BCAST(IRESP,1,MPI_INTEGER,TZFD%OWNER-1,TZFD%COMM,IERR)
+          CALL MPI_BCAST(IRESP,1,MPI_INTEGER,TPFILE%NMASTER_RANK-1,TPFILE%NMPICOMM,IERR)
        END IF ! multiprocessor execution
     ELSE
        IRESP = -61
@@ -1532,9 +1530,9 @@ CONTAINS
           IF (LIOCDF4) CALL IO_WRITE_FIELD_NC4(TPFILE,TPFIELD,TZFD%CDF,PFIELD,IRESP)
        ELSE
 #ifndef MNH_INT8
-          CALL MPI_ALLREDUCE(SIZE(PFIELD),ISIZEMAX,1,MPI_INTEGER,MPI_MAX,TZFD%COMM,IRESP)
+          CALL MPI_ALLREDUCE(SIZE(PFIELD),ISIZEMAX,1,MPI_INTEGER,MPI_MAX,TPFILE%NMPICOMM,IRESP)
 #else
-          CALL MPI_ALLREDUCE(SIZE(PFIELD),ISIZEMAX,1,MPI_INTEGER8,MPI_MAX,TZFD%COMM,IRESP)
+          CALL MPI_ALLREDUCE(SIZE(PFIELD),ISIZEMAX,1,MPI_INTEGER8,MPI_MAX,TPFILE%NMPICOMM,IRESP)
 #endif
           IF (ISIZEMAX==0) THEN
              CALL PRINT_MSG(NVERB_INFO,'IO','IO_WRITE_FIELD_BYFIELD_X6','ignoring variable with a zero size ('//TRIM(YRECFM)//')')
@@ -1542,7 +1540,7 @@ CONTAINS
              RETURN
           END IF
 
-          IF (ISP == TZFD%OWNER)  THEN
+          IF (ISP == TPFILE%NMASTER_RANK)  THEN
              CALL ALLOCBUFFER_ll(ZFIELDP,PFIELD,YDIR,GALLOC)
           ELSE
              ALLOCATE(ZFIELDP(0,0,0,0,0,0))
@@ -1550,17 +1548,17 @@ CONTAINS
           END IF
           !
           IF (YDIR == 'XX' .OR. YDIR =='YY') THEN
-             CALL GATHER_XXFIELD(YDIR,PFIELD,ZFIELDP,TZFD%OWNER,TZFD%COMM)
+             CALL GATHER_XXFIELD(YDIR,PFIELD,ZFIELDP,TPFILE%NMASTER_RANK,TPFILE%NMPICOMM)
           ELSEIF (YDIR == 'XY') THEN
-             CALL GATHER_XYFIELD(PFIELD,ZFIELDP,TZFD%OWNER,TZFD%COMM)
+             CALL GATHER_XYFIELD(PFIELD,ZFIELDP,TPFILE%NMASTER_RANK,TPFILE%NMPICOMM)
           END IF
           !
-          IF (ISP == TZFD%OWNER)  THEN
+          IF (ISP == TPFILE%NMASTER_RANK)  THEN
              IF (LLFIOUT) CALL IO_WRITE_FIELD_LFI(TPFILE,TPFIELD,ZFIELDP,IRESP)
              IF (LIOCDF4) CALL IO_WRITE_FIELD_NC4(TPFILE,TPFIELD,TZFD%CDF,ZFIELDP,IRESP)
           END IF
           !
-          CALL MPI_BCAST(IRESP,1,MPI_INTEGER,TZFD%OWNER-1,TZFD%COMM,IERR)
+          CALL MPI_BCAST(IRESP,1,MPI_INTEGER,TPFILE%NMASTER_RANK-1,TPFILE%NMPICOMM,IERR)
        END IF ! multiprocessor execution
     ELSE
        IRESP = -61
@@ -1645,12 +1643,12 @@ CONTAINS
           IF (LLFIOUT) CALL IO_WRITE_FIELD_LFI(TPFILE,TPFIELD,KFIELD,IRESP)
           IF (LIOCDF4) CALL IO_WRITE_FIELD_NC4(TPFILE,TPFIELD,TZFD%CDF,KFIELD,IRESP)
        ELSE 
-          IF (ISP == TZFD%OWNER)  THEN
+          IF (ISP == TPFILE%NMASTER_RANK)  THEN
              IF (LLFIOUT) CALL IO_WRITE_FIELD_LFI(TPFILE,TPFIELD,KFIELD,IRESP)
              IF (LIOCDF4) CALL IO_WRITE_FIELD_NC4(TPFILE,TPFIELD,TZFD%CDF,KFIELD,IRESP)
           END IF
           !
-          CALL MPI_BCAST(IRESP,1,MPI_INTEGER,TZFD%OWNER-1,TZFD%COMM,IERR)
+          CALL MPI_BCAST(IRESP,1,MPI_INTEGER,TPFILE%NMASTER_RANK-1,TPFILE%NMPICOMM,IERR)
        END IF ! multiprocessor execution
        IF (TZFD%nb_procio.gt.1) THEN
           ! write the data in all Z files
@@ -1763,9 +1761,9 @@ CONTAINS
           IF (LIOCDF4) CALL IO_WRITE_FIELD_NC4(TPFILE,TPFIELD,TZFD%CDF,KFIELD,IRESP)
        ELSE ! multiprocessor execution
 #ifndef MNH_INT8
-          CALL MPI_ALLREDUCE(SIZE(KFIELD),ISIZEMAX,1,MPI_INTEGER,MPI_MAX,TZFD%COMM,IRESP)
+          CALL MPI_ALLREDUCE(SIZE(KFIELD),ISIZEMAX,1,MPI_INTEGER,MPI_MAX,TPFILE%NMPICOMM,IRESP)
 #else
-          CALL MPI_ALLREDUCE(SIZE(KFIELD),ISIZEMAX,1,MPI_INTEGER8,MPI_MAX,TZFD%COMM,IRESP)
+          CALL MPI_ALLREDUCE(SIZE(KFIELD),ISIZEMAX,1,MPI_INTEGER8,MPI_MAX,TPFILE%NMPICOMM,IRESP)
 #endif
           IF (ISIZEMAX==0) THEN
              CALL PRINT_MSG(NVERB_INFO,'IO','IO_WRITE_FIELD_BYFIELD_N1','ignoring variable with a zero size ('//TRIM(YRECFM)//')')
@@ -1773,7 +1771,7 @@ CONTAINS
              RETURN
           END IF
 
-          IF (ISP == TZFD%OWNER)  THEN
+          IF (ISP == TPFILE%NMASTER_RANK)  THEN
              CALL ALLOCBUFFER_ll(IFIELDP,KFIELD,YDIR,GALLOC)
           ELSE
              ALLOCATE(IFIELDP(0))
@@ -1781,15 +1779,15 @@ CONTAINS
           END IF
           !
           IF (YDIR == 'XX' .OR. YDIR =='YY') THEN
-             CALL GATHER_XXFIELD(YDIR,KFIELD,IFIELDP,TZFD%OWNER,TZFD%COMM)
+             CALL GATHER_XXFIELD(YDIR,KFIELD,IFIELDP,TPFILE%NMASTER_RANK,TPFILE%NMPICOMM)
           END IF
           !
-          IF (ISP == TZFD%OWNER)  THEN
+          IF (ISP == TPFILE%NMASTER_RANK)  THEN
              IF (LLFIOUT) CALL IO_WRITE_FIELD_LFI(TPFILE,TPFIELD,IFIELDP,IRESP)
              IF (LIOCDF4) CALL IO_WRITE_FIELD_NC4(TPFILE,TPFIELD,TZFD%CDF,IFIELDP,IRESP)
           END IF
           !
-          CALL MPI_BCAST(IRESP,1,MPI_INTEGER,TZFD%OWNER-1,TZFD%COMM,IERR)
+          CALL MPI_BCAST(IRESP,1,MPI_INTEGER,TPFILE%NMASTER_RANK-1,TPFILE%NMPICOMM,IERR)
        END IF
     ELSE
        IRESP = -61
@@ -1803,7 +1801,7 @@ CONTAINS
     END IF
     IF (GALLOC) DEALLOCATE(IFIELDP)
     IF (PRESENT(KRESP)) KRESP = IRESP
-    IF (ASSOCIATED(TZFD)) CALL MPI_BARRIER(TZFD%COMM,IERR)
+    IF (ASSOCIATED(TZFD)) CALL MPI_BARRIER(TPFILE%NMPICOMM,IERR)
     !
   END SUBROUTINE IO_WRITE_FIELD_BYFIELD_N1
 
@@ -1908,9 +1906,9 @@ CONTAINS
           END IF
        ELSE ! multiprocessor execution
 #ifndef MNH_INT8
-          CALL MPI_ALLREDUCE(SIZE(KFIELD),ISIZEMAX,1,MPI_INTEGER,MPI_MAX,TZFD%COMM,IRESP)
+          CALL MPI_ALLREDUCE(SIZE(KFIELD),ISIZEMAX,1,MPI_INTEGER,MPI_MAX,TPFILE%NMPICOMM,IRESP)
 #else
-          CALL MPI_ALLREDUCE(SIZE(KFIELD),ISIZEMAX,1,MPI_INTEGER8,MPI_MAX,TZFD%COMM,IRESP)
+          CALL MPI_ALLREDUCE(SIZE(KFIELD),ISIZEMAX,1,MPI_INTEGER8,MPI_MAX,TPFILE%NMPICOMM,IRESP)
 #endif
           IF (ISIZEMAX==0) THEN
              CALL PRINT_MSG(NVERB_INFO,'IO','IO_WRITE_FIELD_BYFIELD_N2','ignoring variable with a zero size ('//TRIM(YRECFM)//')')
@@ -1919,7 +1917,7 @@ CONTAINS
           END IF
 
           CALL SECOND_MNH2(T0)
-          IF (ISP == TZFD%OWNER)  THEN
+          IF (ISP == TPFILE%NMASTER_RANK) THEN
              ! I/O processor case
              CALL ALLOCBUFFER_ll(IFIELDP,KFIELD,YDIR,GALLOC)
           ELSE
@@ -1928,25 +1926,25 @@ CONTAINS
           END IF
           !   
           IF (YDIR == 'XX' .OR. YDIR =='YY') THEN
-             CALL GATHER_XXFIELD(YDIR,KFIELD,IFIELDP,TZFD%OWNER,TZFD%COMM)
+             CALL GATHER_XXFIELD(YDIR,KFIELD,IFIELDP,TPFILE%NMASTER_RANK,TPFILE%NMPICOMM)
           ELSEIF (YDIR == 'XY') THEN
              IF (LPACK .AND. L2D) THEN
-                CALL GATHER_XXFIELD('XX',KFIELD(:,JPHEXT+1),IFIELDP(:,1),TZFD%OWNER,TZFD%COMM)
+                CALL GATHER_XXFIELD('XX',KFIELD(:,JPHEXT+1),IFIELDP(:,1),TPFILE%NMASTER_RANK,TPFILE%NMPICOMM)
              ELSE
-                CALL GATHER_XYFIELD(KFIELD,IFIELDP,TZFD%OWNER,TZFD%COMM)
+                CALL GATHER_XYFIELD(KFIELD,IFIELDP,TPFILE%NMASTER_RANK,TPFILE%NMPICOMM)
              END IF
           END IF
           CALL SECOND_MNH2(T1)
           TIMEZ%T_WRIT2D_GATH=TIMEZ%T_WRIT2D_GATH + T1 - T0
           !
-          IF (ISP == TZFD%OWNER)  THEN             
+          IF (ISP == TPFILE%NMASTER_RANK) THEN
              IF (LLFIOUT) CALL IO_WRITE_FIELD_LFI(TPFILE,TPFIELD,IFIELDP,IRESP)
              IF (LIOCDF4) CALL IO_WRITE_FIELD_NC4(TPFILE,TPFIELD,TZFD%CDF,IFIELDP,IRESP)
           END IF
           CALL SECOND_MNH2(T2)
           TIMEZ%T_WRIT2D_WRIT=TIMEZ%T_WRIT2D_WRIT + T2 - T1
           !
-          CALL MPI_BCAST(IRESP,1,MPI_INTEGER,TZFD%OWNER-1,TZFD%COMM,IERR)
+          CALL MPI_BCAST(IRESP,1,MPI_INTEGER,TPFILE%NMASTER_RANK-1,TPFILE%NMPICOMM,IERR)
        END IF
     ELSE
        IRESP = -61
@@ -1960,7 +1958,7 @@ CONTAINS
     END IF
     IF (GALLOC) DEALLOCATE(IFIELDP)
     IF (PRESENT(KRESP)) KRESP = IRESP
-    IF (ASSOCIATED(TZFD)) CALL MPI_BARRIER(TZFD%COMM,IERR)
+    IF (ASSOCIATED(TZFD)) CALL MPI_BARRIER(TPFILE%NMPICOMM,IERR)
     CALL SECOND_MNH2(T22)
     TIMEZ%T_WRIT2D_ALL=TIMEZ%T_WRIT2D_ALL + T22 - T11
     !
@@ -2063,9 +2061,9 @@ CONTAINS
           END IF
        ELSE ! multiprocessor execution
 #ifndef MNH_INT8
-          CALL MPI_ALLREDUCE(SIZE(KFIELD),ISIZEMAX,1,MPI_INTEGER,MPI_MAX,TZFD%COMM,IRESP)
+          CALL MPI_ALLREDUCE(SIZE(KFIELD),ISIZEMAX,1,MPI_INTEGER,MPI_MAX,TPFILE%NMPICOMM,IRESP)
 #else
-          CALL MPI_ALLREDUCE(SIZE(KFIELD),ISIZEMAX,1,MPI_INTEGER8,MPI_MAX,TZFD%COMM,IRESP)
+          CALL MPI_ALLREDUCE(SIZE(KFIELD),ISIZEMAX,1,MPI_INTEGER8,MPI_MAX,TPFILE%NMPICOMM,IRESP)
 #endif
           IF (ISIZEMAX==0) THEN
              CALL PRINT_MSG(NVERB_INFO,'IO','IO_WRITE_FIELD_BYFIELD_N3','ignoring variable with a zero size ('//TRIM(YRECFM)//')')
@@ -2073,7 +2071,7 @@ CONTAINS
              RETURN
           END IF
 
-          IF (ISP == TZFD%OWNER)  THEN
+          IF (ISP == TPFILE%NMASTER_RANK) THEN
              ! I/O processor case
              CALL ALLOCBUFFER_ll(IFIELDP,KFIELD,YDIR,GALLOC)
           ELSE
@@ -2082,21 +2080,21 @@ CONTAINS
           END IF
           !   
           IF (YDIR == 'XX' .OR. YDIR =='YY') THEN
-             CALL GATHER_XXFIELD(YDIR,KFIELD,IFIELDP,TZFD%OWNER,TZFD%COMM)
+             CALL GATHER_XXFIELD(YDIR,KFIELD,IFIELDP,TPFILE%NMASTER_RANK,TPFILE%NMPICOMM)
           ELSEIF (YDIR == 'XY') THEN
              IF (LPACK .AND. L2D) THEN
-                CALL GATHER_XXFIELD('XX',KFIELD(:,JPHEXT+1,:),IFIELDP(:,1,:),TZFD%OWNER,TZFD%COMM)
+                CALL GATHER_XXFIELD('XX',KFIELD(:,JPHEXT+1,:),IFIELDP(:,1,:),TPFILE%NMASTER_RANK,TPFILE%NMPICOMM)
              ELSE
-                CALL GATHER_XYFIELD(KFIELD,IFIELDP,TZFD%OWNER,TZFD%COMM)
+                CALL GATHER_XYFIELD(KFIELD,IFIELDP,TPFILE%NMASTER_RANK,TPFILE%NMPICOMM)
              END IF
           END IF
           !
-          IF (ISP == TZFD%OWNER)  THEN             
+          IF (ISP == TPFILE%NMASTER_RANK) THEN
              IF (LLFIOUT) CALL IO_WRITE_FIELD_LFI(TPFILE,TPFIELD,IFIELDP,IRESP)
              IF (LIOCDF4) CALL IO_WRITE_FIELD_NC4(TPFILE,TPFIELD,TZFD%CDF,IFIELDP,IRESP)
           END IF
           !
-          CALL MPI_BCAST(IRESP,1,MPI_INTEGER,TZFD%OWNER-1,TZFD%COMM,IERR)
+          CALL MPI_BCAST(IRESP,1,MPI_INTEGER,TPFILE%NMASTER_RANK-1,TPFILE%NMPICOMM,IERR)
        END IF
     ELSE
        IRESP = -61
@@ -2110,7 +2108,7 @@ CONTAINS
     END IF
     IF (GALLOC) DEALLOCATE(IFIELDP)
     IF (PRESENT(KRESP)) KRESP = IRESP
-    IF (ASSOCIATED(TZFD)) CALL MPI_BARRIER(TZFD%COMM,IERR)
+    IF (ASSOCIATED(TZFD)) CALL MPI_BARRIER(TPFILE%NMPICOMM,IERR)
     CALL SECOND_MNH2(T22)
     TIMEZ%T_WRIT3D_ALL=TIMEZ%T_WRIT3D_ALL + T22 - T11
     !
@@ -2184,12 +2182,12 @@ CONTAINS
           IF (LLFIOUT) CALL IO_WRITE_FIELD_LFI(TPFILE,TPFIELD,OFIELD,IRESP)
           IF (LIOCDF4) CALL IO_WRITE_FIELD_NC4(TPFILE,TPFIELD,TZFD%CDF,OFIELD,IRESP)
        ELSE
-          IF (ISP == TZFD%OWNER)  THEN
+          IF (ISP == TPFILE%NMASTER_RANK)  THEN
              IF (LLFIOUT) CALL IO_WRITE_FIELD_LFI(TPFILE,TPFIELD,OFIELD,IRESP)
              IF (LIOCDF4) CALL IO_WRITE_FIELD_NC4(TPFILE,TPFIELD,TZFD%CDF,OFIELD,IRESP)
           END IF
           !
-          CALL MPI_BCAST(IRESP,1,MPI_INTEGER,TZFD%OWNER-1,TZFD%COMM,IERR)
+          CALL MPI_BCAST(IRESP,1,MPI_INTEGER,TPFILE%NMASTER_RANK-1,TPFILE%NMPICOMM,IERR)
        END IF ! multiprocessor execution
        IF (TZFD%nb_procio.gt.1) THEN
           ! write the data in all Z files
@@ -2302,9 +2300,9 @@ CONTAINS
           IF (LIOCDF4) CALL IO_WRITE_FIELD_NC4(TPFILE,TPFIELD,TZFD%CDF,OFIELD,IRESP)
        ELSE ! multiprocessor execution
 #ifndef MNH_INT8
-          CALL MPI_ALLREDUCE(SIZE(OFIELD),ISIZEMAX,1,MPI_INTEGER,MPI_MAX,TZFD%COMM,IRESP)
+          CALL MPI_ALLREDUCE(SIZE(OFIELD),ISIZEMAX,1,MPI_INTEGER,MPI_MAX,TPFILE%NMPICOMM,IRESP)
 #else
-          CALL MPI_ALLREDUCE(SIZE(OFIELD),ISIZEMAX,1,MPI_INTEGER8,MPI_MAX,TZFD%COMM,IRESP)
+          CALL MPI_ALLREDUCE(SIZE(OFIELD),ISIZEMAX,1,MPI_INTEGER8,MPI_MAX,TPFILE%NMPICOMM,IRESP)
 #endif
           IF (ISIZEMAX==0) THEN
              CALL PRINT_MSG(NVERB_INFO,'IO','IO_WRITE_FIELD_BYFIELD_L1','ignoring variable with a zero size ('//TRIM(YRECFM)//')')
@@ -2312,7 +2310,7 @@ CONTAINS
              RETURN
           END IF
 
-          IF (ISP == TZFD%OWNER)  THEN
+          IF (ISP == TPFILE%NMASTER_RANK)  THEN
              CALL ALLOCBUFFER_ll(GFIELDP,OFIELD,YDIR,GALLOC)
           ELSE
              ALLOCATE(GFIELDP(0))
@@ -2320,15 +2318,15 @@ CONTAINS
           END IF
           !
           IF (YDIR == 'XX' .OR. YDIR =='YY') THEN
-             CALL GATHER_XXFIELD(YDIR,OFIELD,GFIELDP,TZFD%OWNER,TZFD%COMM)
+             CALL GATHER_XXFIELD(YDIR,OFIELD,GFIELDP,TPFILE%NMASTER_RANK,TPFILE%NMPICOMM)
           END IF
           !
-          IF (ISP == TZFD%OWNER)  THEN
+          IF (ISP == TPFILE%NMASTER_RANK)  THEN
              IF (LLFIOUT) CALL IO_WRITE_FIELD_LFI(TPFILE,TPFIELD,GFIELDP,IRESP)
              IF (LIOCDF4) CALL IO_WRITE_FIELD_NC4(TPFILE,TPFIELD,TZFD%CDF,GFIELDP,IRESP)
           END IF
           !
-          CALL MPI_BCAST(IRESP,1,MPI_INTEGER,TZFD%OWNER-1,TZFD%COMM,IERR)
+          CALL MPI_BCAST(IRESP,1,MPI_INTEGER,TPFILE%NMASTER_RANK-1,TPFILE%NMPICOMM,IERR)
        END IF
     ELSE
        IRESP = -61
@@ -2342,7 +2340,7 @@ CONTAINS
     END IF
     IF (GALLOC) DEALLOCATE(GFIELDP)
     IF (PRESENT(KRESP)) KRESP = IRESP
-    IF (ASSOCIATED(TZFD)) CALL MPI_BARRIER(TZFD%COMM,IERR)
+    IF (ASSOCIATED(TZFD)) CALL MPI_BARRIER(TPFILE%NMPICOMM,IERR)
     !
   END SUBROUTINE IO_WRITE_FIELD_BYFIELD_L1
 
@@ -2413,12 +2411,12 @@ CONTAINS
           IF (LLFIOUT) CALL IO_WRITE_FIELD_LFI(TPFILE,TPFIELD,HFIELD,IRESP)
           IF (LIOCDF4) CALL IO_WRITE_FIELD_NC4(TPFILE,TPFIELD,TZFD%CDF,HFIELD,IRESP)
        ELSE 
-          IF (ISP == TZFD%OWNER)  THEN
+          IF (ISP == TPFILE%NMASTER_RANK)  THEN
              IF (LLFIOUT) CALL IO_WRITE_FIELD_LFI(TPFILE,TPFIELD,HFIELD,IRESP)
              IF (LIOCDF4) CALL IO_WRITE_FIELD_NC4(TPFILE,TPFIELD,TZFD%CDF,HFIELD,IRESP)
           END IF
           !
-          CALL MPI_BCAST(IRESP,1,MPI_INTEGER,TZFD%OWNER-1,TZFD%COMM,IERR)
+          CALL MPI_BCAST(IRESP,1,MPI_INTEGER,TPFILE%NMASTER_RANK-1,TPFILE%NMPICOMM,IERR)
        END IF
     ELSE 
        IRESP = -61
@@ -2520,12 +2518,12 @@ CONTAINS
           IF (LLFIOUT) CALL IO_WRITE_FIELD_LFI(TPFILE,TPFIELD,IFIELD,IRESP)
           IF (LIOCDF4) CALL IO_WRITE_FIELD_NC4(TPFILE,TPFIELD,TZFD%CDF,HFIELD,IRESP)
        ELSE 
-          IF (ISP == TZFD%OWNER)  THEN
+          IF (ISP == TPFILE%NMASTER_RANK)  THEN
              IF (LLFIOUT) CALL IO_WRITE_FIELD_LFI(TPFILE,TPFIELD,IFIELD,IRESP)
              IF (LIOCDF4) CALL IO_WRITE_FIELD_NC4(TPFILE,TPFIELD,TZFD%CDF,HFIELD,IRESP)
           END IF
           !
-          CALL MPI_BCAST(IRESP,1,MPI_INTEGER,TZFD%OWNER-1,TZFD%COMM,IERR)
+          CALL MPI_BCAST(IRESP,1,MPI_INTEGER,TPFILE%NMASTER_RANK-1,TPFILE%NMPICOMM,IERR)
        END IF
     ELSE 
        IRESP = -61
@@ -2605,12 +2603,12 @@ CONTAINS
           IF (LLFIOUT) CALL IO_WRITE_FIELD_LFI(TPFILE,TPFIELD,TFIELD,IRESP)
           IF (LIOCDF4) CALL IO_WRITE_FIELD_NC4(TPFILE,TPFIELD,TZFD%CDF,TFIELD,IRESP)
        ELSE 
-          IF (ISP == TZFD%OWNER)  THEN
+          IF (ISP == TPFILE%NMASTER_RANK)  THEN
              IF (LLFIOUT) CALL IO_WRITE_FIELD_LFI(TPFILE,TPFIELD,TFIELD,IRESP)
              IF (LIOCDF4) CALL IO_WRITE_FIELD_NC4(TPFILE,TPFIELD,TZFD%CDF,TFIELD,IRESP)
           END IF
           !
-          CALL MPI_BCAST(IRESP,1,MPI_INTEGER,TZFD%OWNER-1,TZFD%COMM,IERR)
+          CALL MPI_BCAST(IRESP,1,MPI_INTEGER,TPFILE%NMASTER_RANK-1,TPFILE%NMPICOMM,IERR)
        END IF
     ELSE 
        IRESP = -61
@@ -2736,7 +2734,7 @@ CONTAINS
              IF (LIOCDF4) CALL IO_WRITE_FIELD_NC4(TPFILE,TPFIELD,TZFD%CDF,PLB,IRESP)
           END IF
        ELSE
-          IF (ISP == TZFD%OWNER)  THEN
+          IF (ISP == TPFILE%NMASTER_RANK)  THEN
              ! I/O proc case
              CALL GET_GLOBALDIMS_ll(IIMAX_ll,IJMAX_ll)
              IF (YLBTYPE == 'LBX' .OR. YLBTYPE == 'LBXU') THEN 
@@ -2749,7 +2747,7 @@ CONTAINS
                 IF (IIB /= 0) THEN
                    TX3DP=>Z3D(IIB:IIE,IJB:IJE,:)
                    IF (ISP /= JI) THEN
-                      CALL MPI_RECV(TX3DP,SIZE(TX3DP),MPI_FLOAT,JI-1,99,TZFD%COMM,STATUS,IERR) 
+                      CALL MPI_RECV(TX3DP,SIZE(TX3DP),MPI_FLOAT,JI-1,99,TPFILE%NMPICOMM,STATUS,IERR)
                    ELSE
                       CALL GET_DISTRIB_LB(YLBTYPE,JI,'LOC','WRITE',IRIM,IIB,IIE,IJB,IJE)
                       TX3DP = PLB(IIB:IIE,IJB:IJE,:)
@@ -2775,8 +2773,9 @@ CONTAINS
                 NB_REQ = NB_REQ + 1
                 ALLOCATE(T_TX3DP(NB_REQ)%X(IIB:IIE,IJB:IJE,IKU))  
                 T_TX3DP(NB_REQ)%X=PLB(IIB:IIE,IJB:IJE,:)
-                CALL MPI_ISEND(T_TX3DP(NB_REQ)%X,SIZE(TX3DP),MPI_FLOAT,TZFD%OWNER-1,99,TZFD%COMM,REQ_TAB(NB_REQ),IERR)
-                !CALL MPI_BSEND(TX3DP,SIZE(TX3DP),MPI_FLOAT,TZFD%OWNER-1,99,TZFD%COMM,IERR)
+                CALL MPI_ISEND(T_TX3DP(NB_REQ)%X,SIZE(TX3DP),MPI_FLOAT,TPFILE%NMASTER_RANK-1,99, &
+                               TPFILE%NMPICOMM,REQ_TAB(NB_REQ),IERR)
+                !CALL MPI_BSEND(TX3DP,SIZE(TX3DP),MPI_FLOAT,TPFILE%NMASTER_RANK-1,99,TPFILE%NMPICOMM,IERR)
              END IF
              IF (NB_REQ .GT.0 ) THEN
                 CALL MPI_WAITALL(NB_REQ,REQ_TAB,MNH_STATUSES_IGNORE,IERR)
@@ -2785,7 +2784,7 @@ CONTAINS
              DEALLOCATE(T_TX3DP,REQ_TAB)
           END IF
           !
-          CALL MPI_BCAST(IRESP,1,MPI_INTEGER,TZFD%OWNER-1,TZFD&
+          CALL MPI_BCAST(IRESP,1,MPI_INTEGER,TPFILE%NMASTER_RANK-1,TZFD&
                & %COMM,IERR)
        END IF !(GSMONOPROC)
     ELSE
@@ -2856,7 +2855,7 @@ CONTAINS
           IF (LLFIOUT) CALL IO_WRITE_FIELD_LFI(TPFILE,TPFIELD,ZFIELDP,IRESP)
           IF (LIOCDF4) CALL IO_WRITE_FIELD_NC4(TPFILE,TPFIELD,TZFD%CDF,ZFIELDP,IRESP)
        ELSE ! multiprocessor execution
-          IF (ISP == TZFD%OWNER)  THEN
+          IF (ISP == TPFILE%NMASTER_RANK)  THEN
              ! Allocate the box
              ALLOCATE(ZFIELDP(KXEBOX-KXOBOX+1,KYEBOX-KYOBOX+1,SIZE(PFIELD,3),&
                   & SIZE(PFIELD,4),SIZE(PFIELD,5)))
@@ -2866,15 +2865,15 @@ CONTAINS
              GALLOC = .TRUE.
           END IF
           !
-          CALL GATHER_XYFIELD(PFIELD,ZFIELDP,TZFD%OWNER,TZFD%COMM,&
+          CALL GATHER_XYFIELD(PFIELD,ZFIELDP,TPFILE%NMASTER_RANK,TPFILE%NMPICOMM,&
                & KXOBOX,KXEBOX,KYOBOX,KYEBOX,HBUDGET)
           !
-          IF (ISP == TZFD%OWNER)  THEN
+          IF (ISP == TPFILE%NMASTER_RANK)  THEN
              IF (LLFIOUT) CALL IO_WRITE_FIELD_LFI(TPFILE,TPFIELD,ZFIELDP,IRESP)
              IF (LIOCDF4) CALL IO_WRITE_FIELD_NC4(TPFILE,TPFIELD,TZFD%CDF,ZFIELDP,IRESP)
           END IF
           !
-          CALL MPI_BCAST(IRESP,1,MPI_INTEGER,TZFD%OWNER-1,TZFD%COMM,IERR)
+          CALL MPI_BCAST(IRESP,1,MPI_INTEGER,TPFILE%NMASTER_RANK-1,TPFILE%NMPICOMM,IERR)
        END IF ! multiprocessor execution
     ELSE
        IRESP = -61
diff --git a/src/LIB/SURCOUCHE/src/modd_io.f90 b/src/LIB/SURCOUCHE/src/modd_io.f90
index fa7528b8f..91ee161de 100644
--- a/src/LIB/SURCOUCHE/src/modd_io.f90
+++ b/src/LIB/SURCOUCHE/src/modd_io.f90
@@ -78,10 +78,15 @@ TYPE TFILEDATA
   INTEGER           :: NOPEN   = 0         !Number of times the file has been opened (during the current execution)
   INTEGER           :: NCLOSE  = 0         !Number of times the file has been closed (during the current execution)
   !
+  INTEGER           :: NMPICOMM      = -1      !MPI communicator used for IO on this file
+  INTEGER           :: NMASTER_RANK  = -1      !Rank of the master process (no meaning if LMULTIMASTERS=.T.)
+  LOGICAL           :: LMASTER       = .FALSE. !True if process is master of the file (process that open/read/write/close)
+  LOGICAL           :: LMULTIMASTERS = .FALSE. !True if several processes may access the file
+  !
   ! Fields for LFI files
   INTEGER(KIND=LFI_INT) :: NLFINPRAR = 0  !Number of predicted articles of the LFI file (non crucial)
-  INTEGER :: NLFITYPE  = -1 !Type of the file (used to generate list of files to transfers)
-  INTEGER :: NLFIVERB  = 1  !LFI verbosity level
+  INTEGER               :: NLFITYPE  = -1 !Type of the file (used to generate list of files to transfers)
+  INTEGER               :: NLFIVERB  = 1  !LFI verbosity level
   INTEGER(KIND=LFI_INT) :: NLFIFLU   = -1 !File identifier
   !
   ! Fields for netCDF files
diff --git a/src/LIB/SURCOUCHE/src/mode_fm.f90 b/src/LIB/SURCOUCHE/src/mode_fm.f90
index 7740ed8aa..206b34326 100644
--- a/src/LIB/SURCOUCHE/src/mode_fm.f90
+++ b/src/LIB/SURCOUCHE/src/mode_fm.f90
@@ -162,6 +162,7 @@ CALL PRINT_MSG(NVERB_DEBUG,'IO','IO_FILE_OPEN_ll','opening '//TRIM(TPFILE%CNAME)
 !
 IF (.NOT.ASSOCIATED(TPFILE)) CALL PRINT_MSG(NVERB_FATAL,'IO','IO_FILE_OPEN_ll','TPFILE is not associated')
 !
+TPFILE%NOPEN         = TPFILE%NOPEN + 1
 TPFILE%NOPEN_CURRENT = TPFILE%NOPEN_CURRENT + 1
 !
 IF (TPFILE%LOPENED) THEN
@@ -169,6 +170,8 @@ IF (TPFILE%LOPENED) THEN
   RETURN
 END IF
 !
+TPFILE%LOPENED       = .TRUE.
+!
 !Check if file is in filelist
 CALL IO_FILE_FIND_BYNAME(TRIM(TPFILE%CNAME),TZFILE_DUMMY,IRESP)
 IF (IRESP/=0) CALL PRINT_MSG(NVERB_ERROR,'IO','IO_FILE_OPEN_ll','file '//TRIM(TPFILE%CNAME)//' not in filelist')
@@ -238,15 +241,15 @@ SELECT CASE(TPFILE%CTYPE)
     CALL FMOPEN_ll(TPFILE,IRESP,OPARALLELIO=OPARALLELIO)
     !
     TZFDLFI=>GETFD(ADJUSTL(TRIM(TPFILE%CNAME)//'.lfi'))
-    !TZFDLFI%CDF exists only if ISP == TZFDLFI%OWNER
-    IF (TRIM(TPFILE%CMODE) == 'READ' .AND. ISP == TZFDLFI%OWNER) THEN
+    !TZFDLFI%CDF exists only if ISP == TPFILE%NMASTER_RANK
+    IF (TRIM(TPFILE%CMODE) == 'READ' .AND. ISP == TPFILE%NMASTER_RANK) THEN
       IF (LIOCDF4 .AND. .NOT.LLFIREAD) THEN
         IF (TPFILE%NNCID<0) CALL PRINT_MSG(NVERB_FATAL,'IO','IO_FILE_OPEN_ll','invalid NNCID for '//TRIM(TPFILE%CNAME))
       ELSE
         TPFILE%NLFIFLU = TZFDLFI%FLU
         IF (TPFILE%NLFIFLU<0) CALL PRINT_MSG(NVERB_FATAL,'IO','IO_FILE_OPEN_ll','invalid NLFIFLU for '//TRIM(TPFILE%CNAME))
       ENDIF
-    ELSE IF (TRIM(TPFILE%CMODE) == 'WRITE' .AND. ISP == TZFDLFI%OWNER) THEN
+    ELSE IF (TRIM(TPFILE%CMODE) == 'WRITE' .AND. ISP == TPFILE%NMASTER_RANK) THEN
       IF (LIOCDF4) THEN
         IF (TPFILE%NNCID<0) CALL PRINT_MSG(NVERB_FATAL,'IO','IO_FILE_OPEN_ll','invalid NNCID for '//TRIM(TPFILE%CNAME))
       END IF
@@ -318,9 +321,6 @@ SELECT CASE(TPFILE%CTYPE)
     END IF
 END SELECT
 !
-TPFILE%LOPENED = .TRUE.
-TPFILE%NOPEN   = TPFILE%NOPEN + 1
-!
 IF (PRESENT(KRESP)) KRESP = IRESP
 !
 END SUBROUTINE IO_FILE_OPEN_ll
@@ -429,7 +429,7 @@ CALL OPEN_ll(TPFILE,STATUS="UNKNOWN",MODE='IO_ZSPLIT',LFIPAR=TZPARA,IOSTAT=IRESP
 IF (IRESP /= 0) GOTO 1000
 
 TZFDLFI=>GETFD(YFNLFI)
-IF (ISP == TZFDLFI%OWNER) THEN
+IF (ISP == TPFILE%NMASTER_RANK) THEN
   ! Proc I/O case
   IF (GSFIRST) THEN
     GSFIRST = .FALSE.
@@ -506,8 +506,7 @@ IF (ISP == TZFDLFI%OWNER) THEN
   ENDIF
 END IF
 ! Broadcast ERROR
-CALL MPI_BCAST(IRESP,1,MPI_INTEGER,TZFDLFI%OWNER-1,TZFDLFI%COMM&
-     & ,IERR)
+CALL MPI_BCAST(IRESP,1,MPI_INTEGER,TPFILE%NMASTER_RANK-1,TZFDLFI%COMM,IERR)
 IF (IRESP /= 0) GOTO 1000
 
 
@@ -740,7 +739,7 @@ YFNLFI=ADJUSTL(TRIM(YFILEM)//'.lfi')
 
 TZFDLFI=>GETFD(YFNLFI)
 
-IF (ISP == TZFDLFI%OWNER) THEN
+IF (ISP == TPFILE%NMASTER_RANK) THEN
   IF (TPFILE%NLFIFLU > 0) THEN
      CALL LFIFER(IRESP8,TPFILE%NLFIFLU,YSTATU)
      IRESP = IRESP8
@@ -789,8 +788,7 @@ IF (ISP == TZFDLFI%OWNER) THEN
   END IF
 END IF
 
-500 CALL MPI_BCAST(IRESP,1,MPI_INTEGER,TZFDLFI%OWNER-1,TZFDLFI%COMM&
-     & ,IERR)
+500 CALL MPI_BCAST(IRESP,1,MPI_INTEGER,TPFILE%NMASTER_RANK-1,TZFDLFI%COMM,IERR)
 IF (IRESP /= 0) GOTO 1000
 
 DEALLOCATE(TZFDLFI%PARAM)
diff --git a/src/LIB/SURCOUCHE/src/mode_io.f90 b/src/LIB/SURCOUCHE/src/mode_io.f90
index 1a87a52f1..f1699a77f 100644
--- a/src/LIB/SURCOUCHE/src/mode_io.f90
+++ b/src/LIB/SURCOUCHE/src/mode_io.f90
@@ -413,8 +413,21 @@ CONTAINS
     CASE('GLOBAL')
        IF (YACTION == 'READ') THEN
           TZFD%OWNER = ISP
-       ELSE 
+          TPFILE%NMASTER_RANK  = -1
+          TPFILE%LMASTER       = .TRUE. !Every process read the file
+          TPFILE%LMULTIMASTERS = .TRUE.
+       ELSE
           TZFD%OWNER = ISIOP
+          IF (TPFILE%CTYPE=='OUTPUTLISTING') THEN
+            TZFD%OWNER = ISP
+            TPFILE%NMASTER_RANK  = -1
+            TPFILE%LMASTER       = .TRUE. !Every process may write in the file
+            TPFILE%LMULTIMASTERS = .TRUE.
+          ELSE
+            TPFILE%NMASTER_RANK  = ISIOP
+            TPFILE%LMASTER       = (ISP == ISIOP)
+            TPFILE%LMULTIMASTERS = .FALSE.
+          END IF
        END IF
 
        IF (ISP == TZFD%OWNER) THEN 
@@ -529,6 +542,9 @@ CONTAINS
     CASE('SPECIFIC')
        TZFD%OWNER = ISP
        TZFD%FLU = IONEWFLU()
+       TPFILE%NMASTER_RANK  = -1
+       TPFILE%LMASTER       = .TRUE. !Every process use the file
+       TPFILE%LMULTIMASTERS = .TRUE.
 
 #ifdef MNH_VPP
        OPEN(UNIT=TZFD%FLU,                      &
@@ -609,6 +625,10 @@ CONTAINS
        END IF
        TZFD%PARAM=>LFIPAR
 
+       TPFILE%NMASTER_RANK  = ISIOP
+       TPFILE%LMASTER       = (ISP == ISIOP)
+       TPFILE%LMULTIMASTERS = .FALSE.
+
        IF (ISP == TZFD%OWNER) THEN 
           TZFD%FLU = IONEWFLU()
        ELSE 
@@ -617,7 +637,11 @@ CONTAINS
           TZFD%FLU = -1
        END IF
 
+
     CASE('IO_ZSPLIT')
+       TPFILE%NMASTER_RANK  = ISIOP
+       TPFILE%LMASTER       = (ISP == ISIOP)
+       TPFILE%LMULTIMASTERS = .FALSE.
 
        TZFD%OWNER = ISIOP
        TZFD%NAME  = TRIM(TPFILE%CNAME)//".lfi"
@@ -663,6 +687,11 @@ CONTAINS
                CALL IO_FILE_ADD2LIST(TZSPLITFILE,TRIM(TPFILE%CNAME)//TRIM(CFILE),TPFILE%CTYPE,TPFILE%CMODE, &
                                      KLFINPRAR=TPFILE%NLFINPRAR,KLFITYPE=TPFILE%NLFITYPE,KLFIVERB=TPFILE%NLFIVERB)
              END IF
+             !Done outside of the previous IF to prevent problems with .OUT files
+             TZSPLITFILE%NMPICOMM      = ICOMM
+             TZSPLITFILE%NMASTER_RANK  = irank_procio
+             TZSPLITFILE%LMASTER       = (ISP == irank_procio)
+             TZSPLITFILE%LMULTIMASTERS = .FALSE.
 
              IF ( irank_procio .EQ. ISP ) THEN
 #if defined(MNH_IOCDF4)                   
@@ -746,6 +775,7 @@ print *,'PW: TPFILE%CNAME=',TPFILE%CNAME,'master,multimasters=',TPFILE%LMASTER,T
     ! Recherche d'un communicateur a reutiliser
     ! TZFD is the first element
 
+    TPFILE%NMPICOMM = ICOMM
     TZFD%COMM = ICOMM
 !!$    TZFD%COMM = MPI_COMM_NULL
 
@@ -799,7 +829,7 @@ print *,'PW: TPFILE%CNAME=',TPFILE%CNAME,'master,multimasters=',TPFILE%LMASTER,T
                                                //TRIM(TPFILEMD%CNAME))
 
       !TZFDLFI%CDF exists only if ISP == TZFDLFI%OWNER
-      IF (TRIM(TPFILEMD%CMODE) == 'READ' .AND. ISP == TZFDLFI%OWNER) THEN
+      IF (TRIM(TPFILEMD%CMODE) == 'READ' .AND. ISP == TPFILEMD%NMASTER_RANK) THEN
         IF (LIOCDF4 .AND. .NOT.LLFIREAD) THEN
           TPFILEMD%NNCID = TZFDLFI%CDF%NCID
           IF (TPFILEMD%NNCID<0) CALL PRINT_MSG(NVERB_FATAL,'IO','OPEN_ll::UPDATE_METADATA','invalid NNCID for '&
@@ -809,7 +839,7 @@ print *,'PW: TPFILE%CNAME=',TPFILE%CNAME,'master,multimasters=',TPFILE%LMASTER,T
           IF (TPFILEMD%NLFIFLU<0) CALL PRINT_MSG(NVERB_FATAL,'IO','OPEN_ll::UPDATE_METADATA','invalid NLFIFLU for '&
                                                 //TRIM(TPFILEMD%CNAME))
         ENDIF
-      ELSE IF (TRIM(TPFILEMD%CMODE) == 'WRITE' .AND. ISP == TZFDLFI%OWNER) THEN
+      ELSE IF (TRIM(TPFILEMD%CMODE) == 'WRITE' .AND. ISP == TPFILEMD%NMASTER_RANK) THEN
         IF (LIOCDF4) THEN
           TPFILEMD%NNCID = TZFDLFI%CDF%NCID
           IF (TPFILEMD%NNCID<0) CALL PRINT_MSG(NVERB_FATAL,'IO','OPEN_ll::UPDATE_METADATA','invalid NNCID for '&
diff --git a/src/LIB/SURCOUCHE/src/mode_netcdf.f90 b/src/LIB/SURCOUCHE/src/mode_netcdf.f90
index 5b42aefa8..084ea9d17 100644
--- a/src/LIB/SURCOUCHE/src/mode_netcdf.f90
+++ b/src/LIB/SURCOUCHE/src/mode_netcdf.f90
@@ -163,20 +163,15 @@ SUBROUTINE IO_WRITE_HEADER_NC4(TPFILE)
 !
 USE MODD_IO_ll, ONLY: ISP,TFILEDATA
 !
-USE MODE_FD_ll
-!
 TYPE(TFILEDATA), INTENT(IN)  :: TPFILE ! File structure
 !
 INTEGER(KIND=IDCDF_KIND) :: ISTATUS
-TYPE(FD_ll), POINTER         :: TZFD
 !
 IF (TRIM(TPFILE%CFORMAT)/='NETCDF4' .AND. TRIM(TPFILE%CFORMAT)/='LFICDF4') RETURN
 !
 CALL PRINT_MSG(NVERB_DEBUG,'IO','IO_WRITE_HEADER_NC4','called for file '//TRIM(TPFILE%CNAME))
 !
-TZFD=>GETFD(TRIM(ADJUSTL(TPFILE%CNAME))//'.lfi')
-!
-IF (ISP == TZFD%OWNER)  THEN
+IF (ISP == TPFILE%NMASTER_RANK)  THEN
   ISTATUS = NF90_PUT_ATT(TPFILE%NNCID, NF90_GLOBAL, 'Conventions', 'CF-1.6')
   IF (ISTATUS /= NF90_NOERR) CALL HANDLE_ERR(ISTATUS,__LINE__,'IO_FILE_WRITE_HEADER[NF90_PUT_ATT]')
 
-- 
GitLab