From ae5b8f7dc1e5787347449d40749ea6b09bf43c81 Mon Sep 17 00:00:00 2001
From: Philippe WAUTELET <philippe.wautelet@aero.obs-mip.fr>
Date: Mon, 20 Nov 2017 17:08:46 +0100
Subject: [PATCH] Philippe 20/11/2017: IO: transfer IOCDF structure from FD_ll
 to TFILEDATA

---
 src/LIB/SURCOUCHE/src/fmwrit_ll.f90 | 133 ++++++++++++++++------------
 src/LIB/SURCOUCHE/src/modd_io.f90   |   3 +-
 src/LIB/SURCOUCHE/src/mode_fd.f90   |   2 -
 src/LIB/SURCOUCHE/src/mode_fm.f90   |  12 +--
 src/LIB/SURCOUCHE/src/mode_io.f90   |  20 +++--
 5 files changed, 97 insertions(+), 73 deletions(-)

diff --git a/src/LIB/SURCOUCHE/src/fmwrit_ll.f90 b/src/LIB/SURCOUCHE/src/fmwrit_ll.f90
index 29a82e335..3d989f9e6 100644
--- a/src/LIB/SURCOUCHE/src/fmwrit_ll.f90
+++ b/src/LIB/SURCOUCHE/src/fmwrit_ll.f90
@@ -168,6 +168,8 @@ END MODULE MODE_GA
 MODULE MODE_FMWRIT
 
   USE MODD_MPIF
+  USE MODD_IO_ll, ONLY: TFILEDATA
+
   USE MODE_FIELD
 #if defined(MNH_IOCDF4)
   USE MODE_NETCDF
@@ -265,7 +267,6 @@ CONTAINS
     !
     USE MODD_CONF
     USE MODD_CONF_n, ONLY : CSTORAGE_TYPE
-    USE MODD_IO_ll, ONLY: TFILEDATA
     !
     TYPE(TFILEDATA),          INTENT(IN)  :: TPFILE   ! File structure
     CHARACTER(LEN=*),OPTIONAL,INTENT(IN)  :: HDAD_NAME
@@ -303,8 +304,6 @@ CONTAINS
 
 
   SUBROUTINE IO_WRITE_FIELD_BYNAME_X0(TPFILE,HNAME,PFIELD,KRESP)
-    !
-    USE MODD_IO_ll, ONLY : TFILEDATA
     !
     !*      0.1   Declarations of arguments
     !
@@ -378,11 +377,11 @@ CONTAINS
     IF (ASSOCIATED(TZFD)) THEN
        IF (GSMONOPROC) THEN ! sequential execution
           IF (LLFIOUT) CALL IO_WRITE_FIELD_LFI(TPFILE,TPFIELD,PFIELD,IRESP)
-          IF (LIOCDF4) CALL IO_WRITE_FIELD_NC4(TPFILE,TPFIELD,TZFD%CDF,PFIELD,IRESP)
+          IF (LIOCDF4) CALL IO_WRITE_FIELD_NC4(TPFILE,TPFIELD,TPFILE%TNCDIMS,PFIELD,IRESP)
        ELSE ! multiprocessor execution
           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)
+             IF (LIOCDF4) CALL IO_WRITE_FIELD_NC4(TPFILE,TPFIELD,TPFILE%TNCDIMS,PFIELD,IRESP)
           END IF
           !
           CALL MPI_BCAST(IRESP,1,MPI_INTEGER,TPFILE%NMASTER_RANK-1,TPFILE%NMPICOMM,IERR)
@@ -401,7 +400,7 @@ CONTAINS
                                  ' not found in list')
                 END IF
                 IF (LLFIOUT) CALL IO_WRITE_FIELD_LFI(TZFILE,TPFIELD,PFIELD,IRESP)
-                IF (LIOCDF4) CALL IO_WRITE_FIELD_NC4(TZFILE,TPFIELD,TZFD_IOZ%CDF,PFIELD,IRESP)
+                IF (LIOCDF4) CALL IO_WRITE_FIELD_NC4(TZFILE,TPFIELD,TZFILE%TNCDIMS,PFIELD,IRESP)
              END IF
           END DO
        ENDIF
@@ -500,7 +499,7 @@ CONTAINS
     IF (ASSOCIATED(TZFD)) THEN
        IF (GSMONOPROC) THEN ! sequential execution
           IF (LLFIOUT) CALL IO_WRITE_FIELD_LFI(TPFILE,TPFIELD,PFIELD,IRESP)
-          IF (LIOCDF4) CALL IO_WRITE_FIELD_NC4(TPFILE,TPFIELD,TZFD%CDF,PFIELD,IRESP)
+          IF (LIOCDF4) CALL IO_WRITE_FIELD_NC4(TPFILE,TPFIELD,TPFILE%TNCDIMS,PFIELD,IRESP)
        ELSE ! multiprocessor execution
 #ifndef MNH_INT8
           CALL MPI_ALLREDUCE(SIZE(PFIELD),ISIZEMAX,1,MPI_INTEGER,MPI_MAX,TPFILE%NMPICOMM,IRESP)
@@ -526,7 +525,7 @@ CONTAINS
           !
           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)
+             IF (LIOCDF4) CALL IO_WRITE_FIELD_NC4(TPFILE,TPFIELD,TPFILE%TNCDIMS,ZFIELDP,IRESP)
           END IF
           !
           CALL MPI_BCAST(IRESP,1,MPI_INTEGER,TPFILE%NMASTER_RANK-1,TPFILE%NMPICOMM,IERR)
@@ -645,15 +644,15 @@ CONTAINS
           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)
              IF (LLFIOUT) CALL IO_WRITE_FIELD_LFI(TPFILE,TPFIELD,ZFIELDP,IRESP)
-             IF (LIOCDF4) CALL IO_WRITE_FIELD_NC4(TPFILE,TPFIELD,TZFD%CDF,ZFIELDP,IRESP)
+             IF (LIOCDF4) CALL IO_WRITE_FIELD_NC4(TPFILE,TPFIELD,TPFILE%TNCDIMS,ZFIELDP,IRESP)
              !    ELSE IF (LPACK .AND. L2D .AND. YDIR=='XY') THEN
           ELSEIF (LPACK .AND. L2D .AND. SIZE(PFIELD,2)==IHEXTOT) THEN
              ZFIELDP=>PFIELD(:,JPHEXT+1:JPHEXT+1)
              IF (LLFIOUT) CALL IO_WRITE_FIELD_LFI(TPFILE,TPFIELD,ZFIELDP,IRESP)
-             IF (LIOCDF4) CALL IO_WRITE_FIELD_NC4(TPFILE,TPFIELD,TZFD%CDF,ZFIELDP,IRESP)
+             IF (LIOCDF4) CALL IO_WRITE_FIELD_NC4(TPFILE,TPFIELD,TPFILE%TNCDIMS,ZFIELDP,IRESP)
           ELSE
              IF (LLFIOUT) CALL IO_WRITE_FIELD_LFI(TPFILE,TPFIELD,PFIELD,IRESP)
-             IF (LIOCDF4) CALL IO_WRITE_FIELD_NC4(TPFILE,TPFIELD,TZFD%CDF,PFIELD,IRESP)
+             IF (LIOCDF4) CALL IO_WRITE_FIELD_NC4(TPFILE,TPFIELD,TPFILE%TNCDIMS,PFIELD,IRESP)
           END IF
        ELSE ! multiprocessor execution
           CALL SECOND_MNH2(T0)
@@ -727,7 +726,7 @@ CONTAINS
           !
           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)
+             IF (LIOCDF4) CALL IO_WRITE_FIELD_NC4(TPFILE,TPFIELD,TPFILE%TNCDIMS,ZFIELDP,IRESP)
           END IF
 #ifdef MNH_GA
 !!$         IF (ISP .EQ. 1 ) THEN
@@ -795,6 +794,7 @@ CONTAINS
     USE MODE_GATHER_ll
     !JUANZ
     USE MODE_IO_ll, ONLY : io_file,io_rank
+    USE MODE_IO_MANAGE_STRUCT, ONLY: IO_FILE_FIND_BYNAME
     USE MODD_TIMEZ, ONLY : TIMEZ
     USE MODE_MNH_TIMING, ONLY : SECOND_MNH2
     !JUANZ 
@@ -806,7 +806,7 @@ CONTAINS
     !
     !*      0.1   Declarations of arguments
     !
-    TYPE(TFILEDATA),             INTENT(IN) :: TPFILE
+    TYPE(TFILEDATA),TARGET,      INTENT(IN) :: TPFILE
     TYPE(TFIELDDATA),            INTENT(IN) :: TPFIELD
     REAL,DIMENSION(:,:,:),TARGET,INTENT(IN) :: PFIELD   ! array containing the data field
     INTEGER,OPTIONAL,            INTENT(OUT):: KRESP    ! return-code 
@@ -853,6 +853,9 @@ CONTAINS
     INTEGER                                  :: IHEXTOT
     CHARACTER(LEN=:),ALLOCATABLE             :: YMSG
     CHARACTER(LEN=6)                         :: YRESP
+    TYPE(TFILEDATA),POINTER                  :: TZFILE
+    !
+    TZFILE => NULL()
     !
     YFILEM   = TPFILE%CNAME
     YRECFM   = TPFIELD%CMNHNAME
@@ -879,15 +882,15 @@ CONTAINS
           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,:)
              IF (LLFIOUT) CALL IO_WRITE_FIELD_LFI(TPFILE,TPFIELD,ZFIELDP,IRESP)
-             IF (LIOCDF4) CALL IO_WRITE_FIELD_NC4(TPFILE,TPFIELD,TZFD%CDF,ZFIELDP,IRESP)
+             IF (LIOCDF4) CALL IO_WRITE_FIELD_NC4(TPFILE,TPFIELD,TPFILE%TNCDIMS,ZFIELDP,IRESP)
              !    ELSE IF (LPACK .AND. L2D .AND. YDIR=='XY') THEN
           ELSEIF (LPACK .AND. L2D .AND. SIZE(PFIELD,2)==IHEXTOT) THEN
              ZFIELDP=>PFIELD(:,JPHEXT+1:JPHEXT+1,:)
              IF (LLFIOUT) CALL IO_WRITE_FIELD_LFI(TPFILE,TPFIELD,ZFIELDP,IRESP)
-             IF (LIOCDF4) CALL IO_WRITE_FIELD_NC4(TPFILE,TPFIELD,TZFD%CDF,ZFIELDP,IRESP)
+             IF (LIOCDF4) CALL IO_WRITE_FIELD_NC4(TPFILE,TPFIELD,TPFILE%TNCDIMS,ZFIELDP,IRESP)
           ELSE
              IF (LLFIOUT) CALL IO_WRITE_FIELD_LFI(TPFILE,TPFIELD,PFIELD,IRESP)
-             IF (LIOCDF4) CALL IO_WRITE_FIELD_NC4(TPFILE,TPFIELD,TZFD%CDF,PFIELD,IRESP)
+             IF (LIOCDF4) CALL IO_WRITE_FIELD_NC4(TPFILE,TPFIELD,TPFILE%TNCDIMS,PFIELD,IRESP)
           END IF
        ELSEIF ( (TZFD%nb_procio .eq. 1 ) .OR. ( YDIR == '--' ) ) THEN  ! multiprocessor execution & 1 proc IO
 #ifndef MNH_INT8
@@ -921,7 +924,7 @@ CONTAINS
           !
           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)
+             IF (LIOCDF4) CALL IO_WRITE_FIELD_NC4(TPFILE,TPFIELD,TPFILE%TNCDIMS,ZFIELDP,IRESP)
           END IF
           !
           CALL MPI_BCAST(IRESP,1,MPI_INTEGER,TPFILE%NMASTER_RANK-1,TPFILE%NMPICOMM,IERR)
@@ -971,6 +974,11 @@ CONTAINS
             write(YK_FILE ,'(".Z",i3.3)') IK_FILE+1
             YFILE_IOZ =  TRIM(YFILEM)//YK_FILE//".lfi"
             TZFD_IOZ => GETFD(YFILE_IOZ)
+            CALL IO_FILE_FIND_BYNAME(TRIM(YFILEM)//YK_FILE,TZFILE,IRESP)
+            IF (IRESP/=0) THEN
+              CALL PRINT_MSG(NVERB_FATAL,'IO','IO_WRITE_FIELD_BYFIELD_X3','file '//TRIM(YFILE_IOZ)//&
+                             ' not found in list')
+            END IF
             !
             IK_RANK   =  TZFD_IOZ%OWNER
             !IK_RANK   =  1 + io_rank(IK_FILE,ISNPROC,TZFD%nb_procio)
@@ -992,7 +1000,7 @@ CONTAINS
                TIMEZ%T_WRIT3D_RECV=TIMEZ%T_WRIT3D_RECV + T1 - T0
                !
                IF (LLFIOUT) CALL IO_WRITE_FIELD_LFI(TPFILE,TPFIELD,ZSLIDE_ll,IRESP,KVERTLEVEL=JKK,KZFILE=IK_FILE+1)
-               IF (LIOCDF4) CALL IO_WRITE_FIELD_NC4(TPFILE,TPFIELD,TZFD_IOZ%CDF,ZSLIDE_ll,IRESP,KVERTLEVEL=JKK,KZFILE=IK_FILE+1)
+               IF (LIOCDF4) CALL IO_WRITE_FIELD_NC4(TPFILE,TPFIELD,TZFILE%TNCDIMS,ZSLIDE_ll,IRESP,KVERTLEVEL=JKK,KZFILE=IK_FILE+1)
                CALL SECOND_MNH2(T2)
                TIMEZ%T_WRIT3D_WRIT=TIMEZ%T_WRIT3D_WRIT + T2 - T1
             END IF
@@ -1033,8 +1041,14 @@ CONTAINS
                    write(YK_FILE ,'(".Z",i3.3)') IK_FILE+1
                    YFILE_IOZ =  TRIM(YFILEM)//YK_FILE//".lfi"
                    TZFD_IOZ => GETFD(YFILE_IOZ)
+                   CALL IO_FILE_FIND_BYNAME(TRIM(YFILEM)//YK_FILE,TZFILE,IRESP)
+                   IF (IRESP/=0) THEN
+                     CALL PRINT_MSG(NVERB_FATAL,'IO','IO_WRITE_FIELD_BYFIELD_X3','file '//TRIM(YFILE_IOZ)//&
+                                    ' not found in list')
+                   END IF
                 ELSE
                    TZFD_IOZ => TZFD
+                   TZFILE => TPFILE
                 END IF
                 !
                 !IK_RANK   =  1 + io_rank(IK_FILE,ISNPROC,TZFD%nb_procio)
@@ -1080,8 +1094,14 @@ CONTAINS
                    write(YK_FILE ,'(".Z",i3.3)') IK_FILE+1
                    YFILE_IOZ =  TRIM(YFILEM)//YK_FILE//".lfi"
                    TZFD_IOZ => GETFD(YFILE_IOZ)
+                   CALL IO_FILE_FIND_BYNAME(TRIM(YFILEM)//YK_FILE,TZFILE,IRESP)
+                   IF (IRESP/=0) THEN
+                     CALL PRINT_MSG(NVERB_FATAL,'IO','IO_WRITE_FIELD_BYFIELD_X3','file '//TRIM(YFILE_IOZ)//&
+                                    ' not found in list')
+                   END IF
                 ELSE
                    TZFD_IOZ => TZFD
+                   TZFILE => TPFILE
                 ENDIF
                 IK_RANK   =  TZFD_IOZ%OWNER
                 !IK_RANK   =  1 + io_rank(IK_FILE,ISNPROC,TZFD%nb_procio)
@@ -1111,7 +1131,8 @@ CONTAINS
                    TIMEZ%T_WRIT3D_RECV=TIMEZ%T_WRIT3D_RECV + T1 - T0
                    !JUANIOZ 
                    IF (LLFIOUT) CALL IO_WRITE_FIELD_LFI(TPFILE,TPFIELD,ZSLIDE_ll,IRESP,KVERTLEVEL=JKK,KZFILE=IK_FILE+1)
-                   IF (LIOCDF4) CALL IO_WRITE_FIELD_NC4(TPFILE,TPFIELD,TZFD_IOZ%CDF,ZSLIDE_ll,IRESP,KVERTLEVEL=JKK,KZFILE=IK_FILE+1)
+                   IF (LIOCDF4) CALL IO_WRITE_FIELD_NC4(TPFILE,TPFIELD,TZFILE%TNCDIMS,ZSLIDE_ll,IRESP, &
+                                                        KVERTLEVEL=JKK,KZFILE=IK_FILE+1)
                    CALL SECOND_MNH2(T2)
                    TIMEZ%T_WRIT3D_WRIT=TIMEZ%T_WRIT3D_WRIT + T2 - T1
                 END IF
@@ -1245,10 +1266,10 @@ CONTAINS
           ELSEIF (LPACK .AND. L2D .AND. SIZE(PFIELD,2)==IHEXTOT) THEN
              ZFIELDP=>PFIELD(:,JPHEXT+1:JPHEXT+1,:,:)
              IF (LLFIOUT) CALL IO_WRITE_FIELD_LFI(TPFILE,TPFIELD,ZFIELDP,IRESP)
-             IF (LIOCDF4) CALL IO_WRITE_FIELD_NC4(TPFILE,TPFIELD,TZFD%CDF,ZFIELDP,IRESP)
+             IF (LIOCDF4) CALL IO_WRITE_FIELD_NC4(TPFILE,TPFIELD,TPFILE%TNCDIMS,ZFIELDP,IRESP)
           ELSE
              IF (LLFIOUT) CALL IO_WRITE_FIELD_LFI(TPFILE,TPFIELD,PFIELD,IRESP)
-             IF (LIOCDF4) CALL IO_WRITE_FIELD_NC4(TPFILE,TPFIELD,TZFD%CDF,PFIELD,IRESP)
+             IF (LIOCDF4) CALL IO_WRITE_FIELD_NC4(TPFILE,TPFIELD,TPFILE%TNCDIMS,PFIELD,IRESP)
           END IF
        ELSE
 #ifndef MNH_INT8
@@ -1281,7 +1302,7 @@ CONTAINS
           !
           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)
+             IF (LIOCDF4) CALL IO_WRITE_FIELD_NC4(TPFILE,TPFIELD,TPFILE%TNCDIMS,ZFIELDP,IRESP)
           END IF
           !
           CALL MPI_BCAST(IRESP,1,MPI_INTEGER,TPFILE%NMASTER_RANK-1,TPFILE%NMPICOMM,IERR)
@@ -1389,10 +1410,10 @@ CONTAINS
           ELSEIF (LPACK .AND. L2D .AND. SIZE(PFIELD,2)==IHEXTOT) THEN
              ZFIELDP=>PFIELD(:,JPHEXT+1:JPHEXT+1,:,:,:)
              IF (LLFIOUT) CALL IO_WRITE_FIELD_LFI(TPFILE,TPFIELD,ZFIELDP,IRESP)
-             IF (LIOCDF4) CALL IO_WRITE_FIELD_NC4(TPFILE,TPFIELD,TZFD%CDF,ZFIELDP,IRESP)
+             IF (LIOCDF4) CALL IO_WRITE_FIELD_NC4(TPFILE,TPFIELD,TPFILE%TNCDIMS,ZFIELDP,IRESP)
           ELSE
              IF (LLFIOUT) CALL IO_WRITE_FIELD_LFI(TPFILE,TPFIELD,PFIELD,IRESP)
-             IF (LIOCDF4) CALL IO_WRITE_FIELD_NC4(TPFILE,TPFIELD,TZFD%CDF,PFIELD,IRESP)
+             IF (LIOCDF4) CALL IO_WRITE_FIELD_NC4(TPFILE,TPFIELD,TPFILE%TNCDIMS,PFIELD,IRESP)
           END IF
        ELSE
 #ifndef MNH_INT8
@@ -1426,7 +1447,7 @@ CONTAINS
           !
           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)
+             IF (LIOCDF4) CALL IO_WRITE_FIELD_NC4(TPFILE,TPFIELD,TPFILE%TNCDIMS,ZFIELDP,IRESP)
           END IF
           !
           CALL MPI_BCAST(IRESP,1,MPI_INTEGER,TPFILE%NMASTER_RANK-1,TPFILE%NMPICOMM,IERR)
@@ -1527,7 +1548,7 @@ CONTAINS
     IF (ASSOCIATED(TZFD)) THEN
        IF (GSMONOPROC) THEN ! sequential execution
           IF (LLFIOUT) CALL IO_WRITE_FIELD_LFI(TPFILE,TPFIELD,PFIELD,IRESP)
-          IF (LIOCDF4) CALL IO_WRITE_FIELD_NC4(TPFILE,TPFIELD,TZFD%CDF,PFIELD,IRESP)
+          IF (LIOCDF4) CALL IO_WRITE_FIELD_NC4(TPFILE,TPFIELD,TPFILE%TNCDIMS,PFIELD,IRESP)
        ELSE
 #ifndef MNH_INT8
           CALL MPI_ALLREDUCE(SIZE(PFIELD),ISIZEMAX,1,MPI_INTEGER,MPI_MAX,TPFILE%NMPICOMM,IRESP)
@@ -1555,7 +1576,7 @@ CONTAINS
           !
           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)
+             IF (LIOCDF4) CALL IO_WRITE_FIELD_NC4(TPFILE,TPFIELD,TPFILE%TNCDIMS,ZFIELDP,IRESP)
           END IF
           !
           CALL MPI_BCAST(IRESP,1,MPI_INTEGER,TPFILE%NMASTER_RANK-1,TPFILE%NMPICOMM,IERR)
@@ -1641,11 +1662,11 @@ CONTAINS
     IF (ASSOCIATED(TZFD)) THEN
        IF (GSMONOPROC) THEN ! sequential execution
           IF (LLFIOUT) CALL IO_WRITE_FIELD_LFI(TPFILE,TPFIELD,KFIELD,IRESP)
-          IF (LIOCDF4) CALL IO_WRITE_FIELD_NC4(TPFILE,TPFIELD,TZFD%CDF,KFIELD,IRESP)
+          IF (LIOCDF4) CALL IO_WRITE_FIELD_NC4(TPFILE,TPFIELD,TPFILE%TNCDIMS,KFIELD,IRESP)
        ELSE 
           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)
+             IF (LIOCDF4) CALL IO_WRITE_FIELD_NC4(TPFILE,TPFIELD,TPFILE%TNCDIMS,KFIELD,IRESP)
           END IF
           !
           CALL MPI_BCAST(IRESP,1,MPI_INTEGER,TPFILE%NMASTER_RANK-1,TPFILE%NMPICOMM,IERR)
@@ -1664,7 +1685,7 @@ CONTAINS
                                   ' not found in list')
                 END IF
                 IF (LLFIOUT) CALL IO_WRITE_FIELD_LFI(TZFILE,TPFIELD,KFIELD,IRESP)
-                IF (LIOCDF4) CALL IO_WRITE_FIELD_NC4(TZFILE,TPFIELD,TZFD_IOZ%CDF,KFIELD,IRESP)
+                IF (LIOCDF4) CALL IO_WRITE_FIELD_NC4(TZFILE,TPFIELD,TZFILE%TNCDIMS,KFIELD,IRESP)
              END IF
           END DO
        ENDIF
@@ -1758,7 +1779,7 @@ CONTAINS
     IF (ASSOCIATED(TZFD)) THEN
        IF (GSMONOPROC) THEN ! sequential execution
           IF (LLFIOUT) CALL IO_WRITE_FIELD_LFI(TPFILE,TPFIELD,KFIELD,IRESP)
-          IF (LIOCDF4) CALL IO_WRITE_FIELD_NC4(TPFILE,TPFIELD,TZFD%CDF,KFIELD,IRESP)
+          IF (LIOCDF4) CALL IO_WRITE_FIELD_NC4(TPFILE,TPFIELD,TPFILE%TNCDIMS,KFIELD,IRESP)
        ELSE ! multiprocessor execution
 #ifndef MNH_INT8
           CALL MPI_ALLREDUCE(SIZE(KFIELD),ISIZEMAX,1,MPI_INTEGER,MPI_MAX,TPFILE%NMPICOMM,IRESP)
@@ -1784,7 +1805,7 @@ CONTAINS
           !
           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)
+             IF (LIOCDF4) CALL IO_WRITE_FIELD_NC4(TPFILE,TPFIELD,TPFILE%TNCDIMS,IFIELDP,IRESP)
           END IF
           !
           CALL MPI_BCAST(IRESP,1,MPI_INTEGER,TPFILE%NMASTER_RANK-1,TPFILE%NMPICOMM,IERR)
@@ -1894,15 +1915,15 @@ CONTAINS
           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)
              IF (LLFIOUT) CALL IO_WRITE_FIELD_LFI(TPFILE,TPFIELD,IFIELDP,IRESP)
-             IF (LIOCDF4) CALL IO_WRITE_FIELD_NC4(TPFILE,TPFIELD,TZFD%CDF,IFIELDP,IRESP)
+             IF (LIOCDF4) CALL IO_WRITE_FIELD_NC4(TPFILE,TPFIELD,TPFILE%TNCDIMS,IFIELDP,IRESP)
              !    ELSE IF (LPACK .AND. L2D .AND. YDIR=='XY') THEN
           ELSEIF (LPACK .AND. L2D .AND. SIZE(KFIELD,2)==IHEXTOT) THEN
              IFIELDP=>KFIELD(:,JPHEXT+1:JPHEXT+1)
              IF (LLFIOUT) CALL IO_WRITE_FIELD_LFI(TPFILE,TPFIELD,IFIELDP,IRESP)
-             IF (LIOCDF4) CALL IO_WRITE_FIELD_NC4(TPFILE,TPFIELD,TZFD%CDF,IFIELDP,IRESP)
+             IF (LIOCDF4) CALL IO_WRITE_FIELD_NC4(TPFILE,TPFIELD,TPFILE%TNCDIMS,IFIELDP,IRESP)
           ELSE
              IF (LLFIOUT) CALL IO_WRITE_FIELD_LFI(TPFILE,TPFIELD,KFIELD,IRESP)
-             IF (LIOCDF4) CALL IO_WRITE_FIELD_NC4(TPFILE,TPFIELD,TZFD%CDF,KFIELD,IRESP)
+             IF (LIOCDF4) CALL IO_WRITE_FIELD_NC4(TPFILE,TPFIELD,TPFILE%TNCDIMS,KFIELD,IRESP)
           END IF
        ELSE ! multiprocessor execution
 #ifndef MNH_INT8
@@ -1939,7 +1960,7 @@ CONTAINS
           !
           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)
+             IF (LIOCDF4) CALL IO_WRITE_FIELD_NC4(TPFILE,TPFIELD,TPFILE%TNCDIMS,IFIELDP,IRESP)
           END IF
           CALL SECOND_MNH2(T2)
           TIMEZ%T_WRIT2D_WRIT=TIMEZ%T_WRIT2D_WRIT + T2 - T1
@@ -2049,15 +2070,15 @@ CONTAINS
           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,:)
              IF (LLFIOUT) CALL IO_WRITE_FIELD_LFI(TPFILE,TPFIELD,IFIELDP,IRESP)
-             IF (LIOCDF4) CALL IO_WRITE_FIELD_NC4(TPFILE,TPFIELD,TZFD%CDF,IFIELDP,IRESP)
+             IF (LIOCDF4) CALL IO_WRITE_FIELD_NC4(TPFILE,TPFIELD,TPFILE%TNCDIMS,IFIELDP,IRESP)
              !    ELSE IF (LPACK .AND. L2D .AND. YDIR=='XY') THEN
           ELSEIF (LPACK .AND. L2D .AND. SIZE(KFIELD,2)==IHEXTOT) THEN
              IFIELDP=>KFIELD(:,JPHEXT+1:JPHEXT+1,:)
              IF (LLFIOUT) CALL IO_WRITE_FIELD_LFI(TPFILE,TPFIELD,IFIELDP,IRESP)
-             IF (LIOCDF4) CALL IO_WRITE_FIELD_NC4(TPFILE,TPFIELD,TZFD%CDF,IFIELDP,IRESP)
+             IF (LIOCDF4) CALL IO_WRITE_FIELD_NC4(TPFILE,TPFIELD,TPFILE%TNCDIMS,IFIELDP,IRESP)
           ELSE
              IF (LLFIOUT) CALL IO_WRITE_FIELD_LFI(TPFILE,TPFIELD,KFIELD,IRESP)
-             IF (LIOCDF4) CALL IO_WRITE_FIELD_NC4(TPFILE,TPFIELD,TZFD%CDF,KFIELD,IRESP)
+             IF (LIOCDF4) CALL IO_WRITE_FIELD_NC4(TPFILE,TPFIELD,TPFILE%TNCDIMS,KFIELD,IRESP)
           END IF
        ELSE ! multiprocessor execution
 #ifndef MNH_INT8
@@ -2091,7 +2112,7 @@ CONTAINS
           !
           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)
+             IF (LIOCDF4) CALL IO_WRITE_FIELD_NC4(TPFILE,TPFIELD,TPFILE%TNCDIMS,IFIELDP,IRESP)
           END IF
           !
           CALL MPI_BCAST(IRESP,1,MPI_INTEGER,TPFILE%NMASTER_RANK-1,TPFILE%NMPICOMM,IERR)
@@ -2180,11 +2201,11 @@ CONTAINS
     IF (ASSOCIATED(TZFD)) THEN
        IF (GSMONOPROC) THEN ! sequential execution
           IF (LLFIOUT) CALL IO_WRITE_FIELD_LFI(TPFILE,TPFIELD,OFIELD,IRESP)
-          IF (LIOCDF4) CALL IO_WRITE_FIELD_NC4(TPFILE,TPFIELD,TZFD%CDF,OFIELD,IRESP)
+          IF (LIOCDF4) CALL IO_WRITE_FIELD_NC4(TPFILE,TPFIELD,TPFILE%TNCDIMS,OFIELD,IRESP)
        ELSE
           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)
+             IF (LIOCDF4) CALL IO_WRITE_FIELD_NC4(TPFILE,TPFIELD,TPFILE%TNCDIMS,OFIELD,IRESP)
           END IF
           !
           CALL MPI_BCAST(IRESP,1,MPI_INTEGER,TPFILE%NMASTER_RANK-1,TPFILE%NMPICOMM,IERR)
@@ -2203,7 +2224,7 @@ CONTAINS
                                  ' not found in list')
                 END IF
                 IF (LLFIOUT) CALL IO_WRITE_FIELD_LFI(TZFILE,TPFIELD,OFIELD,IRESP)
-                IF (LIOCDF4) CALL IO_WRITE_FIELD_NC4(TZFILE,TPFIELD,TZFD_IOZ%CDF,OFIELD,IRESP)
+                IF (LIOCDF4) CALL IO_WRITE_FIELD_NC4(TZFILE,TPFIELD,TZFILE%TNCDIMS,OFIELD,IRESP)
              END IF
           END DO
        ENDIF
@@ -2297,7 +2318,7 @@ CONTAINS
     IF (ASSOCIATED(TZFD)) THEN
        IF (GSMONOPROC) THEN ! sequential execution
           IF (LLFIOUT) CALL IO_WRITE_FIELD_LFI(TPFILE,TPFIELD,OFIELD,IRESP)
-          IF (LIOCDF4) CALL IO_WRITE_FIELD_NC4(TPFILE,TPFIELD,TZFD%CDF,OFIELD,IRESP)
+          IF (LIOCDF4) CALL IO_WRITE_FIELD_NC4(TPFILE,TPFIELD,TPFILE%TNCDIMS,OFIELD,IRESP)
        ELSE ! multiprocessor execution
 #ifndef MNH_INT8
           CALL MPI_ALLREDUCE(SIZE(OFIELD),ISIZEMAX,1,MPI_INTEGER,MPI_MAX,TPFILE%NMPICOMM,IRESP)
@@ -2323,7 +2344,7 @@ CONTAINS
           !
           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)
+             IF (LIOCDF4) CALL IO_WRITE_FIELD_NC4(TPFILE,TPFIELD,TPFILE%TNCDIMS,GFIELDP,IRESP)
           END IF
           !
           CALL MPI_BCAST(IRESP,1,MPI_INTEGER,TPFILE%NMASTER_RANK-1,TPFILE%NMPICOMM,IERR)
@@ -2409,11 +2430,11 @@ CONTAINS
     IF (ASSOCIATED(TZFD)) THEN
        IF (GSMONOPROC) THEN ! sequential execution
           IF (LLFIOUT) CALL IO_WRITE_FIELD_LFI(TPFILE,TPFIELD,HFIELD,IRESP)
-          IF (LIOCDF4) CALL IO_WRITE_FIELD_NC4(TPFILE,TPFIELD,TZFD%CDF,HFIELD,IRESP)
+          IF (LIOCDF4) CALL IO_WRITE_FIELD_NC4(TPFILE,TPFIELD,TPFILE%TNCDIMS,HFIELD,IRESP)
        ELSE 
           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)
+             IF (LIOCDF4) CALL IO_WRITE_FIELD_NC4(TPFILE,TPFIELD,TPFILE%TNCDIMS,HFIELD,IRESP)
           END IF
           !
           CALL MPI_BCAST(IRESP,1,MPI_INTEGER,TPFILE%NMASTER_RANK-1,TPFILE%NMPICOMM,IERR)
@@ -2516,11 +2537,11 @@ CONTAINS
     IF (ASSOCIATED(TZFD)) THEN
        IF (GSMONOPROC) THEN ! sequential execution
           IF (LLFIOUT) CALL IO_WRITE_FIELD_LFI(TPFILE,TPFIELD,IFIELD,IRESP)
-          IF (LIOCDF4) CALL IO_WRITE_FIELD_NC4(TPFILE,TPFIELD,TZFD%CDF,HFIELD,IRESP)
+          IF (LIOCDF4) CALL IO_WRITE_FIELD_NC4(TPFILE,TPFIELD,TPFILE%TNCDIMS,HFIELD,IRESP)
        ELSE 
           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)
+             IF (LIOCDF4) CALL IO_WRITE_FIELD_NC4(TPFILE,TPFIELD,TPFILE%TNCDIMS,HFIELD,IRESP)
           END IF
           !
           CALL MPI_BCAST(IRESP,1,MPI_INTEGER,TPFILE%NMASTER_RANK-1,TPFILE%NMPICOMM,IERR)
@@ -2601,11 +2622,11 @@ CONTAINS
     IF (ASSOCIATED(TZFD)) THEN
        IF (GSMONOPROC) THEN ! sequential execution
           IF (LLFIOUT) CALL IO_WRITE_FIELD_LFI(TPFILE,TPFIELD,TFIELD,IRESP)
-          IF (LIOCDF4) CALL IO_WRITE_FIELD_NC4(TPFILE,TPFIELD,TZFD%CDF,TFIELD,IRESP)
+          IF (LIOCDF4) CALL IO_WRITE_FIELD_NC4(TPFILE,TPFIELD,TPFILE%TNCDIMS,TFIELD,IRESP)
        ELSE 
           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)
+             IF (LIOCDF4) CALL IO_WRITE_FIELD_NC4(TPFILE,TPFIELD,TPFILE%TNCDIMS,TFIELD,IRESP)
           END IF
           !
           CALL MPI_BCAST(IRESP,1,MPI_INTEGER,TPFILE%NMASTER_RANK-1,TPFILE%NMPICOMM,IERR)
@@ -2728,10 +2749,10 @@ CONTAINS
           IF (LPACK .AND. L2D) THEN
              TX3DP=>PLB(:,JPHEXT+1:JPHEXT+1,:)
              IF (LLFIOUT) CALL IO_WRITE_FIELD_LFI(TPFILE,TPFIELD,TX3DP,IRESP)
-             IF (LIOCDF4) CALL IO_WRITE_FIELD_NC4(TPFILE,TPFIELD,TZFD%CDF,TX3DP,IRESP)
+             IF (LIOCDF4) CALL IO_WRITE_FIELD_NC4(TPFILE,TPFIELD,TPFILE%TNCDIMS,TX3DP,IRESP)
           ELSE
              IF (LLFIOUT) CALL IO_WRITE_FIELD_LFI(TPFILE,TPFIELD,PLB,IRESP)
-             IF (LIOCDF4) CALL IO_WRITE_FIELD_NC4(TPFILE,TPFIELD,TZFD%CDF,PLB,IRESP)
+             IF (LIOCDF4) CALL IO_WRITE_FIELD_NC4(TPFILE,TPFIELD,TPFILE%TNCDIMS,PLB,IRESP)
           END IF
        ELSE
           IF (ISP == TPFILE%NMASTER_RANK)  THEN
@@ -2760,7 +2781,7 @@ CONTAINS
                 TX3DP=>Z3D
              END IF
              IF (LLFIOUT) CALL IO_WRITE_FIELD_LFI(TPFILE,TPFIELD,TX3DP,IRESP)
-             IF (LIOCDF4) CALL IO_WRITE_FIELD_NC4(TPFILE,TPFIELD,TZFD%CDF,TX3DP,IRESP)
+             IF (LIOCDF4) CALL IO_WRITE_FIELD_NC4(TPFILE,TPFIELD,TPFILE%TNCDIMS,TX3DP,IRESP)
           ELSE
              NB_REQ=0
              ALLOCATE(REQ_TAB(1))
@@ -2853,7 +2874,7 @@ CONTAINS
              ZFIELDP=>PFIELD
           END IF
           IF (LLFIOUT) CALL IO_WRITE_FIELD_LFI(TPFILE,TPFIELD,ZFIELDP,IRESP)
-          IF (LIOCDF4) CALL IO_WRITE_FIELD_NC4(TPFILE,TPFIELD,TZFD%CDF,ZFIELDP,IRESP)
+          IF (LIOCDF4) CALL IO_WRITE_FIELD_NC4(TPFILE,TPFIELD,TPFILE%TNCDIMS,ZFIELDP,IRESP)
        ELSE ! multiprocessor execution
           IF (ISP == TPFILE%NMASTER_RANK)  THEN
              ! Allocate the box
@@ -2870,7 +2891,7 @@ CONTAINS
           !
           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)
+             IF (LIOCDF4) CALL IO_WRITE_FIELD_NC4(TPFILE,TPFIELD,TPFILE%TNCDIMS,ZFIELDP,IRESP)
           END IF
           !
           CALL MPI_BCAST(IRESP,1,MPI_INTEGER,TPFILE%NMASTER_RANK-1,TPFILE%NMPICOMM,IERR)
diff --git a/src/LIB/SURCOUCHE/src/modd_io.f90 b/src/LIB/SURCOUCHE/src/modd_io.f90
index 91ee161de..1a2a24373 100644
--- a/src/LIB/SURCOUCHE/src/modd_io.f90
+++ b/src/LIB/SURCOUCHE/src/modd_io.f90
@@ -14,7 +14,7 @@
 
 MODULE MODD_IO_ll
 !
-USE MODD_NETCDF, ONLY: IDCDF_KIND
+USE MODD_NETCDF, ONLY: IDCDF_KIND, IOCDF
 !
 IMPLICIT NONE 
 !
@@ -95,6 +95,7 @@ TYPE TFILEDATA
                                                                   ! instead of double precision
   LOGICAL                  :: LNCCOMPRESS = .FALSE. ! Do compression on fields
   INTEGER(KIND=IDCDF_KIND) :: NNCCOMPRESS_LEVEL = 0 ! Compression level
+  TYPE(IOCDF),POINTER      :: TNCDIMS => NULL()     ! Structure containing netCDF dimensions
   !
   !Fields for other files
   INTEGER :: NLU = -1                      !Logical unit number
diff --git a/src/LIB/SURCOUCHE/src/mode_fd.f90 b/src/LIB/SURCOUCHE/src/mode_fd.f90
index 4233dc991..9fad3e0f2 100644
--- a/src/LIB/SURCOUCHE/src/mode_fd.f90
+++ b/src/LIB/SURCOUCHE/src/mode_fd.f90
@@ -29,7 +29,6 @@ TYPE FD_ll
   CHARACTER(LEN=15)        :: MODE  ! Flag mode acces ('distrib','global','specific')   
   INTEGER                  :: OWNER ! I/O Processor number 
   TYPE(LFIPARAM),  POINTER :: PARAM
-  TYPE(IOCDF),     POINTER :: CDF
 !JUANZ
   INTEGER                  :: NB_PROCIO = 1
 !JUANZ
@@ -97,7 +96,6 @@ IF (IRESP > 0) THEN
   PRINT *, 'NEWFD : Erreur d"allocation memoire...'
 END IF
 
-NULLIFY(TZFD%CDF)
 !! Add TZFD to top of list TPFDLIST
 TZFD%NEXT=>TFDLIST
 TFDLIST=>TZFD
diff --git a/src/LIB/SURCOUCHE/src/mode_fm.f90 b/src/LIB/SURCOUCHE/src/mode_fm.f90
index 206b34326..ad4a9b116 100644
--- a/src/LIB/SURCOUCHE/src/mode_fm.f90
+++ b/src/LIB/SURCOUCHE/src/mode_fm.f90
@@ -241,7 +241,6 @@ SELECT CASE(TPFILE%CTYPE)
     CALL FMOPEN_ll(TPFILE,IRESP,OPARALLELIO=OPARALLELIO)
     !
     TZFDLFI=>GETFD(ADJUSTL(TRIM(TPFILE%CNAME)//'.lfi'))
-    !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))
@@ -440,7 +439,7 @@ IF (ISP == TPFILE%NMASTER_RANK) THEN
   IF (LIOCDF4) THEN
      IF (YACTION == 'READ' .AND. .NOT. LLFIREAD) THEN
         !! Open NetCDF File for reading
-        TZFDLFI%CDF => NEWIOCDF()
+        TPFILE%TNCDIMS => NEWIOCDF()
         CALL PRINT_MSG(NVERB_DEBUG,'IO','FMOPEN_ll','NF90_OPEN for '//TRIM(YFILEM)//'.nc')
         INCERR = NF90_OPEN(ADJUSTL(TRIM(YFILEM))//".nc", NF90_NOWRITE, TPFILE%NNCID)
         IF (INCERR /= NF90_NOERR) THEN
@@ -448,11 +447,11 @@ IF (ISP == TPFILE%NMASTER_RANK) THEN
            PRINT *, 'Error in opening (FMOPEN_ll/NF90_OPEN) ', TRIM(YFILEM)//'.nc', ' : ', NF90_STRERROR(INCERR)
            STOP
         END IF
-        TZFDLFI%CDF%NCID = TPFILE%NNCID
+        TPFILE%TNCDIMS%NCID = TPFILE%NNCID
      END IF
      
      IF (YACTION == 'WRITE') THEN
-        TZFDLFI%CDF => NEWIOCDF()
+        TPFILE%TNCDIMS => NEWIOCDF()
         CALL PRINT_MSG(NVERB_DEBUG,'IO','FMOPEN_ll','NF90_CREATE for '//TRIM(YFILEM)//'.nc')
         INCERR = NF90_CREATE(ADJUSTL(TRIM(YFILEM))//".nc", &
              &IOR(NF90_CLOBBER,NF90_NETCDF4), TPFILE%NNCID)
@@ -461,7 +460,7 @@ IF (ISP == TPFILE%NMASTER_RANK) THEN
            PRINT *, 'Error in opening (FMOPEN_ll/NF90_CREATE) ', TRIM(YFILEM)//'.nc', ' : ', NF90_STRERROR(INCERR)
            STOP
         END IF
-        TZFDLFI%CDF%NCID = TPFILE%NNCID
+        TPFILE%TNCDIMS%NCID = TPFILE%NNCID
      END IF
   END IF
 #endif
@@ -744,7 +743,8 @@ IF (ISP == TPFILE%NMASTER_RANK) THEN
      CALL LFIFER(IRESP8,TPFILE%NLFIFLU,YSTATU)
      IRESP = IRESP8
   END IF
-  IF (ASSOCIATED(TZFDLFI%CDF)) CALL CLEANIOCDF(TZFDLFI%CDF)
+!   IF (ASSOCIATED(TZFDLFI%CDF)) CALL CLEANIOCDF(TZFDLFI%CDF)
+  IF (ASSOCIATED(TPFILE%TNCDIMS)) CALL CLEANIOCDF(TPFILE%TNCDIMS)
   IF (IRESP == 0) THEN
     !! Write in pipe
 #if defined(MNH_LINUX) || defined(MNH_SP4)
diff --git a/src/LIB/SURCOUCHE/src/mode_io.f90 b/src/LIB/SURCOUCHE/src/mode_io.f90
index f1699a77f..32602066c 100644
--- a/src/LIB/SURCOUCHE/src/mode_io.f90
+++ b/src/LIB/SURCOUCHE/src/mode_io.f90
@@ -698,9 +698,10 @@ CONTAINS
                 IF (LIOCDF4) THEN
                    IF (YACTION == 'READ' .AND. .NOT. LLFIREAD) THEN
                       ! Open NetCDF File for reading
-                      TZFD_IOZ%CDF => NEWIOCDF()
+                      TZSPLITFILE%TNCDIMS => NEWIOCDF()
                       CALL PRINT_MSG(NVERB_DEBUG,'IO','OPEN_ll','NF90_OPEN(IO_ZSPLIT) for '//TRIM(TPFILE%CNAME)//cfile//'.nc')
-                      IOSCDF = NF90_OPEN(TRIM(TPFILE%CNAME)//cfile//".nc", NF90_NOWRITE, TZFD_IOZ%CDF%NCID)
+                      IOSCDF = NF90_OPEN(TRIM(TPFILE%CNAME)//cfile//".nc", NF90_NOWRITE, TZSPLITFILE%NNCID)
+                      TZSPLITFILE%TNCDIMS%NCID = TZSPLITFILE%NNCID
                       IF (IOSCDF /= NF90_NOERR) THEN
    PRINT *, 'Error in opening (NF90_OPEN) ', TRIM(TPFILE%CNAME)//cfile//'.nc', ' : ', NF90_STRERROR(IOSCDF)
                          STOP
@@ -712,10 +713,11 @@ CONTAINS
                    IF (YACTION == 'WRITE') THEN
                       ! YACTION == 'WRITE'
                       ! Create NetCDF File for writing
-                      TZFD_IOZ%CDF => NEWIOCDF()
+                      TZSPLITFILE%TNCDIMS => NEWIOCDF()
                       CALL PRINT_MSG(NVERB_DEBUG,'IO','OPEN_ll','NF90_CREATE(IO_ZSPLIT) for '//TRIM(TPFILE%CNAME)//cfile//'.nc')
                       IOSCDF = NF90_CREATE(TRIM(TPFILE%CNAME)//cfile//".nc", &
-                           &IOR(NF90_CLOBBER,NF90_NETCDF4), TZFD_IOZ%CDF%NCID)
+                           &IOR(NF90_CLOBBER,NF90_NETCDF4), TZSPLITFILE%NNCID)
+                      TZSPLITFILE%TNCDIMS%NCID = TZSPLITFILE%NNCID
                       IF (IOSCDF /= NF90_NOERR) THEN
                          PRINT *, 'Error in opening (NF90_CREATE) ', TRIM(TPFILE%CNAME)//cfile//'.nc', ' : ', NF90_STRERROR(IOSCDF)
                          STOP
@@ -769,7 +771,6 @@ CONTAINS
     END SELECT
 print *,'PW: TPFILE%CNAME=',TPFILE%CNAME,'master,multimasters=',TPFILE%LMASTER,TPFILE%LMULTIMASTERS
 
-!PW: not done here because TZFDLFI%CDF not yet set
 !    CALL UPDATE_METADATA(TPFILE)
 
     ! Recherche d'un communicateur a reutiliser
@@ -831,7 +832,7 @@ print *,'PW: TPFILE%CNAME=',TPFILE%CNAME,'master,multimasters=',TPFILE%LMASTER,T
       !TZFDLFI%CDF exists only if ISP == TZFDLFI%OWNER
       IF (TRIM(TPFILEMD%CMODE) == 'READ' .AND. ISP == TPFILEMD%NMASTER_RANK) THEN
         IF (LIOCDF4 .AND. .NOT.LLFIREAD) THEN
-          TPFILEMD%NNCID = TZFDLFI%CDF%NCID
+!           TPFILEMD%NNCID = TZFDLFI%CDF%NCID
           IF (TPFILEMD%NNCID<0) CALL PRINT_MSG(NVERB_FATAL,'IO','OPEN_ll::UPDATE_METADATA','invalid NNCID for '&
                                                //TRIM(TPFILEMD%CNAME))
         ELSE
@@ -841,7 +842,7 @@ print *,'PW: TPFILE%CNAME=',TPFILE%CNAME,'master,multimasters=',TPFILE%LMASTER,T
         ENDIF
       ELSE IF (TRIM(TPFILEMD%CMODE) == 'WRITE' .AND. ISP == TPFILEMD%NMASTER_RANK) THEN
         IF (LIOCDF4) THEN
-          TPFILEMD%NNCID = TZFDLFI%CDF%NCID
+!           TPFILEMD%NNCID = TZFDLFI%CDF%NCID
           IF (TPFILEMD%NNCID<0) CALL PRINT_MSG(NVERB_FATAL,'IO','OPEN_ll::UPDATE_METADATA','invalid NNCID for '&
                                                //TRIM(TPFILEMD%CNAME))
         END IF
@@ -860,6 +861,7 @@ print *,'PW: TPFILE%CNAME=',TPFILE%CNAME,'master,multimasters=',TPFILE%LMASTER,T
 
   SUBROUTINE CLOSE_ll(HFILE,IOSTAT,STATUS,OPARALLELIO)
   USE MODD_IO_ll
+  USE MODE_IO_MANAGE_STRUCT, ONLY: IO_FILE_FIND_BYNAME
 #if defined(MNH_IOCDF4)
   USE MODE_NETCDF
 #endif
@@ -882,6 +884,7 @@ print *,'PW: TPFILE%CNAME=',TPFILE%CNAME,'master,multimasters=',TPFILE%LMASTER,T
     INTEGER(KIND=LFI_INT)                 :: IRESP8,INUM8
     CHARACTER(LEN=7)                      :: YSTATU  
     LOGICAL                               :: GPARALLELIO
+    TYPE(TFILEDATA),POINTER               :: TZFILE
 
     CALL PRINT_MSG(NVERB_DEBUG,'IO','CLOSE_ll','closing '//TRIM(HFILE))
 
@@ -934,6 +937,7 @@ print *,'PW: TPFILE%CNAME=',TPFILE%CNAME,'master,multimasters=',TPFILE%LMASTER,T
              ilen = len_trim(TZFD%NAME)
              YFILE_IOZ   = TRIM(TZFD%NAME(1:ilen-4))//yfile//".lfi"
              TZFD_IOZ => GETFD(YFILE_IOZ)
+             CALL IO_FILE_FIND_BYNAME(TRIM(TZFD%NAME(1:ilen-4))//yfile,TZFILE,IRESP)
              IF (ISP == TZFD_IOZ%OWNER) THEN
                 IF (TZFD_IOZ%FLU > 0) THEN
                    INUM8=TZFD_IOZ%FLU
@@ -941,7 +945,7 @@ print *,'PW: TPFILE%CNAME=',TPFILE%CNAME,'master,multimasters=',TPFILE%LMASTER,T
                    CALL IOFREEFLU(TZFD_IOZ%FLU)
                    IRESP = IRESP8
                 END IF
-                IF (ASSOCIATED(TZFD_IOZ%CDF)) CALL CLEANIOCDF(TZFD_IOZ%CDF)
+                IF (ASSOCIATED(TZFILE%TNCDIMS)) CALL CLEANIOCDF(TZFILE%TNCDIMS)
              END IF
           END DO
        END IF
-- 
GitLab