diff --git a/src/LIB/SURCOUCHE/src/modd_netcdf.f90 b/src/LIB/SURCOUCHE/src/modd_netcdf.f90
index 022ee3912b3b24c549c1020c3ed771edff862dd9..a9ae971cd481f0dae10f8ac7106fd3d5c7723c8c 100644
--- a/src/LIB/SURCOUCHE/src/modd_netcdf.f90
+++ b/src/LIB/SURCOUCHE/src/modd_netcdf.f90
@@ -24,7 +24,7 @@ TYPE DIMCDF
    TYPE(DIMCDF), POINTER    :: NEXT => NULL()
 END TYPE DIMCDF
 
-TYPE(DIMCDF),DIMENSION(3,0:8) :: NCOORDID !X,Y,Z coordinates for the Arakawa points
+TYPE(DIMCDF),DIMENSION(3,0:8),TARGET :: NCOORDID !X,Y,Z coordinates for the Arakawa points
                                           !0 2nd-dimension is to treat NGRID=0 case without crash
 
 END MODULE MODD_NETCDF
diff --git a/src/LIB/SURCOUCHE/src/mode_netcdf.f90 b/src/LIB/SURCOUCHE/src/mode_netcdf.f90
index d17d039f4e200c99df19eb405774a69931cc98ed..514bc1475cfb4298bfa4ed7ada8720d147dd56d4 100644
--- a/src/LIB/SURCOUCHE/src/mode_netcdf.f90
+++ b/src/LIB/SURCOUCHE/src/mode_netcdf.f90
@@ -29,8 +29,8 @@ INTERFACE IO_WRITE_FIELD_NC4
                     IO_WRITE_FIELD_NC4_X4,IO_WRITE_FIELD_NC4_X5, &
                     IO_WRITE_FIELD_NC4_X6,                       &
                     IO_WRITE_FIELD_NC4_N0,IO_WRITE_FIELD_NC4_N1, &
-                    IO_WRITE_FIELD_NC4_L0,IO_WRITE_FIELD_NC4_L1, &
                     IO_WRITE_FIELD_NC4_N2,IO_WRITE_FIELD_NC4_N3, &
+                    IO_WRITE_FIELD_NC4_L0,IO_WRITE_FIELD_NC4_L1, &
                     IO_WRITE_FIELD_NC4_C0,IO_WRITE_FIELD_NC4_C1, &
                     IO_WRITE_FIELD_NC4_T0
 END INTERFACE IO_WRITE_FIELD_NC4
@@ -52,7 +52,8 @@ PUBLIC NF90_CLOSE,NF90_OPEN,NF90_CREATE,                                &
        NF90_NOWRITE,NF90_CLOBBER,NF90_NETCDF4,NF90_NOERR,NF90_STRERROR, &
        NF90_FILL_REAL
 ! Public from this module :
-PUBLIC NEWIOCDF,CLEANIOCDF,IO_SET_KNOWNDIMS_NC4,IO_WRITE_COORDVAR_NC4, &
+PUBLIC NEWIOCDF,CLEANIOCDF,IO_GUESS_DIMIDS_NC4,                 &
+       IO_SET_KNOWNDIMS_NC4,IO_WRITE_COORDVAR_NC4,              &
        IO_WRITE_FIELD_NC4,IO_READ_FIELD_NC4,IO_WRITE_HEADER_NC4
 
 CONTAINS
@@ -953,6 +954,111 @@ END DO
 END SUBROUTINE FILLVDIMS
 
 
+SUBROUTINE IO_GUESS_DIMIDS_NC4(TPFILE, TPFIELD, KLEN, TPDIMS)
+!Used by LFI2CDF
+TYPE(TFILEDATA),                      INTENT(IN)  :: TPFILE
+TYPE(TFIELDDATA),                     INTENT(IN)  :: TPFIELD
+INTEGER,                              INTENT(IN)  :: KLEN
+TYPE(DIMCDF),DIMENSION(:),INTENT(OUT) :: TPDIMS
+!
+INTEGER               :: IGRID
+INTEGER               :: ILEN, ISIZE
+INTEGER               :: JI
+CHARACTER(LEN=32)     :: YINT
+CHARACTER(LEN=2)      :: YDIR
+TYPE(DIMCDF), POINTER :: PTDIM
+!
+CALL PRINT_MSG(NVERB_DEBUG,'IO','IO_GUESS_DIMIDS_NC4','called for '//TRIM(TPFIELD%CMNHNAME))
+!
+IGRID  =  TPFIELD%NGRID
+YDIR   =  TPFIELD%CDIR
+!
+ILEN = 0
+PTDIM => NULL()
+!
+IF(IGRID<0 .OR. IGRID>8) THEN
+  WRITE(YINT,'( I0 )') IGRID
+  CALL PRINT_MSG(NVERB_FATAL,'IO','IO_GUESS_DIMIDS_NC4','invalid NGRID ('//TRIM(YINT)//') for field '//TRIM(TPFIELD%CMNHNAME))
+END IF
+!
+IF(IGRID==0 .AND. YDIR/='--' .AND. YDIR/=''  ) THEN
+  CALL PRINT_MSG(NVERB_FATAL,'IO','IO_GUESS_DIMIDS_NC4','invalid YDIR ('//TRIM(YDIR)//') with NGRID=0 for field '&
+                 //TRIM(TPFIELD%CMNHNAME))
+END IF
+!
+IF (IGRID==0) THEN
+  SELECT CASE(TPFIELD%NDIMS)
+    CASE (0)
+      ILEN = 1
+    CASE (1)
+      PTDIM => GETDIMCDF(TPFILE,KLEN)
+      TPDIMS(1) = PTDIM
+      ILEN      = PTDIM%LEN
+    CASE DEFAULT
+      CALL PRINT_MSG(NVERB_FATAL,'IO','IO_GUESS_DIMIDS_NC4','NGRID=0 and NDIMS>1 not yet supported (field '&
+                     //TRIM(TPFIELD%CMNHNAME)//')')
+  END SELECT
+ELSE
+  IF (TPFIELD%NDIMS==0) ILEN = 1
+  !
+  DO JI=1,TPFIELD%NDIMS
+    IF (JI == 1) THEN
+      IF ( (YDIR == 'XX' .OR. YDIR == 'XY') ) THEN
+        PTDIM => NCOORDID(1,IGRID)
+      ELSE IF ( YDIR == 'YY' ) THEN
+        PTDIM => NCOORDID(2,IGRID)
+      ELSE IF ( YDIR == 'ZZ' ) THEN
+        PTDIM => NCOORDID(3,IGRID)
+      ELSE
+        CALL PRINT_MSG(NVERB_FATAL,'IO','IO_GUESS_DIMIDS_NC4','can not guess 1st dimension for field '//TRIM(TPFIELD%CMNHNAME))
+      END IF
+      ILEN       = PTDIM%LEN
+      TPDIMS(JI) = PTDIM
+    ELSE IF (JI == 2) THEN
+      IF ( YDIR == 'XY') THEN
+        PTDIM => NCOORDID(2,IGRID)
+      ELSE IF (JI==TPFIELD%NDIMS) THEN !Guess last dimension
+        ISIZE = KLEN/ILEN
+        IF (MOD(KLEN,ILEN)/=0) CALL PRINT_MSG(NVERB_FATAL,'IO','IO_GUESS_DIMIDS_NC4', &
+                                              'can not guess 2nd and last dimension for field '//TRIM(TPFIELD%CMNHNAME))
+        PTDIM => GETDIMCDF(TPFILE, ISIZE)
+      ELSE
+        CALL PRINT_MSG(NVERB_FATAL,'IO','IO_GUESS_DIMIDS_NC4','can not guess 2nd dimension for field '//TRIM(TPFIELD%CMNHNAME))
+      END IF
+      ILEN       = ILEN * PTDIM%LEN
+      TPDIMS(JI) = PTDIM
+    ELSE IF (JI == 3) THEN
+      IF ( YDIR == 'XY' ) THEN
+        PTDIM => NCOORDID(3,IGRID)
+      ELSE IF (JI==TPFIELD%NDIMS) THEN !Guess last dimension
+        ISIZE = KLEN/ILEN
+        IF (MOD(KLEN,ILEN)/=0) CALL PRINT_MSG(NVERB_FATAL,'IO','IO_GUESS_DIMIDS_NC4', &
+                                              'can not guess 3rd and last dimension for field '//TRIM(TPFIELD%CMNHNAME))
+        PTDIM => GETDIMCDF(TPFILE, ISIZE)
+      ELSE
+        CALL PRINT_MSG(NVERB_FATAL,'IO','IO_GUESS_DIMIDS_NC4','can not guess 3rd dimension for field '//TRIM(TPFIELD%CMNHNAME))
+      END IF
+      ILEN       = ILEN * PTDIM%LEN
+      TPDIMS(JI) = PTDIM
+    ELSE IF (JI==4 .AND. JI==TPFIELD%NDIMS) THEN !Guess last dimension
+      ISIZE = KLEN/ILEN
+      IF (MOD(KLEN,ILEN)/=0) CALL PRINT_MSG(NVERB_FATAL,'IO','IO_GUESS_DIMIDS_NC4', &
+                                            'can not guess 4th and last dimension for field '//TRIM(TPFIELD%CMNHNAME))
+      PTDIM => GETDIMCDF(TPFILE, ISIZE)
+      ILEN       = ILEN * PTDIM%LEN
+      TPDIMS(JI) = PTDIM
+    ELSE
+        CALL PRINT_MSG(NVERB_FATAL,'IO','IO_GUESS_DIMIDS_NC4','can not guess dimension above 4 for field '//TRIM(TPFIELD%CMNHNAME))
+    END IF
+  END DO
+END IF
+!
+IF (KLEN /= ILEN) CALL PRINT_MSG(NVERB_FATAL,'IO','IO_GUESS_DIMIDS_NC4','problem with dimensions for field '&
+                                 //TRIM(TPFIELD%CMNHNAME))
+!
+END SUBROUTINE IO_GUESS_DIMIDS_NC4
+
+
 SUBROUTINE IO_WRITE_FIELD_NC4_X0(TPFILE,TPFIELD,PFIELD,KRESP)
 !
 TYPE(TFILEDATA),       INTENT(IN) :: TPFILE