diff --git a/src/LIB/SURCOUCHE/src/mode_io_tools_nc4.f90 b/src/LIB/SURCOUCHE/src/mode_io_tools_nc4.f90
index 44507857bb1f54635e278ccfac506942d4a86eb2..343f7125ea6b97fdd392ce7d440dab088288ee06 100644
--- a/src/LIB/SURCOUCHE/src/mode_io_tools_nc4.f90
+++ b/src/LIB/SURCOUCHE/src/mode_io_tools_nc4.f90
@@ -14,6 +14,7 @@
 !  P. Wautelet 14/09/2020: IO_Knowndims_set_nc4: add new dimensions + remove 'time' dimension in diachronic files
 !  P. Wautelet 14/09/2020: IO_Vdims_fill_nc4: use ndimlist when provided to fill dimensions ids
 !  P. Wautelet 10/11/2020: new data structures for netCDF dimensions
+!  P. Wautelet 26/11/2020: IO_Vdims_fill_nc4: support for empty kshape
 !-----------------------------------------------------------------
 #ifdef MNH_IOCDF4
 module mode_io_tools_nc4
@@ -504,8 +505,16 @@ integer(kind=CDFINT)          :: istatus
 !
 CALL PRINT_MSG(NVERB_DEBUG,'IO','IO_Vdims_fill_nc4','called for '//TRIM(TPFIELD%CMNHNAME))
 !
-IF (SIZE(KSHAPE) < 1 .AND. .NOT.TPFIELD%LTIMEDEP) CALL PRINT_MSG(NVERB_FATAL,'IO','IO_Vdims_fill_nc4','empty KSHAPE')
-!
+if ( Size( kshape ) == 0 .and. .not. tpfield%ltimedep) then
+  !Scalar variable case not time dependent
+  if ( tpfield%ndims == 0 ) then
+    Allocate( kvdims(0) )
+    return
+  else
+    call Print_msg( NVERB_FATAL, 'IO', 'IO_Vdims_fill_nc4', 'empty kshape' )
+  end if
+end if
+
 IGRID  =  TPFIELD%NGRID
 YDIR   =  TPFIELD%CDIR
 !
diff --git a/src/LIB/SURCOUCHE/src/mode_io_write_nc4.f90 b/src/LIB/SURCOUCHE/src/mode_io_write_nc4.f90
index 991f19d450b21c797df7887ee2a0d8ca6e500828..4391dad112adf91a6e2e363340f0be0d66831384 100644
--- a/src/LIB/SURCOUCHE/src/mode_io_write_nc4.f90
+++ b/src/LIB/SURCOUCHE/src/mode_io_write_nc4.f90
@@ -22,6 +22,7 @@
 !  P. Wautelet 14/09/2020: IO_Coordvar_write_nc4: do not store 'time' coordinate in diachronic files
 !  P. Wautelet 22/09/2020: add ldimreduced field to allow reduction in the number of dimensions of fields (used by 2D simulations)
 !  P. Wautelet 10/11/2020: new data structures for netCDF dimensions
+!  P. Wautelet 26/11/2020: add IO_Field_create_nc4 subroutine + use it for all IO_Field_write_nc4_*
 !-----------------------------------------------------------------
 #ifdef MNH_IOCDF4
 module mode_io_write_nc4
@@ -42,7 +43,7 @@ implicit none
 
 private
 
-public :: IO_Coordvar_write_nc4, IO_Field_write_nc4, IO_Header_write_nc4
+public :: IO_Coordvar_write_nc4, IO_Field_create_nc4, IO_Field_write_nc4, IO_Header_write_nc4
 public :: IO_Field_header_split_write_nc4
 
 INTERFACE IO_Field_write_nc4
@@ -351,6 +352,162 @@ ENDIF
 END SUBROUTINE IO_Field_attr_write_nc4
 
 
+subroutine IO_Field_create_nc4( tpfile, tpfield, kshape, hcalendar, oiscoord, kvarid, oisempty )
+use NETCDF, only: NF90_CHAR, NF90_FLOAT, NF90_INT1
+
+use modd_field,     only: NMNHDIM_TIME, TYPECHAR, TYPEDATE, TYPEINT, TYPELOG, TYPEREAL, TYPEUNDEF
+use modd_precision, only: MNHINT_NF90, MNHREAL_NF90
+
+type(tfiledata),       intent(in)            :: tpfile
+type(tfielddata),      intent(in)            :: tpfield
+integer, dimension(:), intent(in),  optional :: kshape
+character(len=*),      intent(in),  optional :: hcalendar
+logical,               intent(in),  optional :: oiscoord   ! Is a coordinate variable (->do not write coordinates attribute)
+integer(kind=CDFINT),  intent(out), optional :: kvarid
+logical,               intent(out), optional :: oisempty
+
+character(len = Len( tpfield%cmnhname ))        :: yvarname
+integer                                         :: idims
+integer                                         :: idx
+integer                                         :: ji
+integer(kind=CDFINT)                            :: istatus
+integer(kind=CDFINT)                            :: itype
+integer(kind=CDFINT)                            :: ivarid
+integer(kind=CDFINT), dimension(:), allocatable :: ivdims
+integer(kind=CDFINT), dimension(:), allocatable :: ivdimstmp
+integer(kind=CDFINT), dimension(:), allocatable :: ishape
+logical                                         :: gexisted !True if variable was already defined
+
+call Print_msg( NVERB_DEBUG, 'IO', 'IO_Field_create_nc4', Trim( tpfile%cname ) // ': creating ' // Trim( tpfield%cmnhname ) )
+
+gexisted = .false.
+
+call IO_Mnhname_clean( tpfield%cmnhname, yvarname )
+
+if ( .not. Present( kshape ) .and. tpfield%ndims > 0 ) then
+  !kshape not provided => ndimlist has to be previously populated
+  idims = tpfield%ndims
+  if ( tpfield%ltimedep ) idims = idims + 1
+  Allocate( ivdims(idims) )
+  Allocate( ishape(idims) )
+
+  do ji = 1, tpfield%ndims
+    idx = tpfield%ndimlist(ji)
+    if ( idx > tpfile%tncdims%nmaxdims .or. idx < 1 )                                        &
+      call Print_msg( NVERB_FATAL, 'IO', 'IO_Field_create_nc4', Trim( tpfile%cname ) // ': ' &
+                      // Trim( tpfield%cmnhname ) // ': invalid ndimlist'  )
+    ivdims(ji) = tpfile%tncdims%tdims(idx)%nid
+    ishape(ji) = tpfile%tncdims%tdims(idx)%nlen
+  end do
+
+  !Set the last dimension if variable is time dependent
+  if ( tpfield%ltimedep ) then
+    ivdims(idims) = tpfile%tncdims%tdims(NMNHDIM_TIME)%nid
+    ishape(idims) = 1
+  end if
+else
+  !Guess the dimensions from the shape of the field
+  if ( tpfield%ndims == 0 ) then
+    Allocate( ishape(0) )
+  else
+    Allocate( ishape(Size( kshape )) )
+    ishape(:) = kshape(:)
+  end if
+
+  !Get the netCDF dimensions
+  if ( tpfield%ntype /= TYPECHAR ) then
+    call IO_Vdims_fill_nc4( tpfile, tpfield, ishape, ivdims )
+  else
+    if ( tpfield%ndims == 0 ) then
+      idims = 1
+    else if ( tpfield%ndims == 1 ) then
+      idims = 2
+    else
+      call Print_msg( NVERB_FATAL, 'IO', 'IO_Field_create_nc4', Trim( tpfile%cname ) // ': ' &
+                      // Trim( tpfield%cmnhname ) // ': ndims value not supported for character strings'  )
+    end if
+
+    Allocate( ivdims(idims) )
+    ivdims(1) = IO_Strdimid_get_nc4( tpfile, Int( kshape(1), kind=CDFINT ) )
+
+    if ( idims == 2 ) then
+      call IO_Vdims_fill_nc4( tpfile, tpfield, [ Int( kshape(2), kind=CDFINT ) ], ivdimstmp )
+      ivdims(2) = ivdimstmp(1)
+      Deallocate( ivdimstmp )
+    end if
+  end if
+end if
+
+if ( Present( oisempty ) ) oisempty = .false.
+do ji = 1, Size( ishape )
+  if ( ishape(ji) == 0 ) then
+    if ( Present( oisempty ) ) then
+      call Print_msg( NVERB_WARNING, 'IO', 'IO_Field_create_nc4','ignoring variable with a zero size (' // Trim( yvarname ) // ')' )
+      oisempty = .true.
+      return
+    else
+      call Print_msg( NVERB_ERROR, 'IO', 'IO_Field_create_nc4','variable with a zero size (' // Trim( yvarname ) // ')' )
+    end if
+  end if
+end do
+
+! The variable should not already exist but who knows ?
+istatus = NF90_INQ_VARID( tpfile%nncid, yvarname, ivarid )
+if ( istatus /= NF90_NOERR ) then
+  select case( tpfield%ntype )
+    case ( TYPEINT )
+      itype = MNHINT_NF90
+
+    case ( TYPELOG )
+      itype = NF90_INT1
+
+    case ( TYPEREAL )
+      if ( tpfile%lncreduce_float_precision .and. tpfield%ndims >= 1  ) then
+        itype = NF90_FLOAT
+      else
+        itype = MNHREAL_NF90
+      end if
+
+    case ( TYPECHAR )
+      itype = NF90_CHAR
+
+    case ( TYPEDATE )
+      itype = MNHREAL_NF90
+      if ( .not. Present( hcalendar ) ) &
+        call Print_msg( NVERB_ERROR, 'IO', 'IO_Field_create_nc4', Trim( tpfield%cmnhname ) // ': hcalendar not provided' )
+
+    case ( TYPEUNDEF )
+      call Print_msg( NVERB_ERROR, 'IO', 'IO_Field_create_nc4', Trim( tpfield%cmnhname ) // ': ntype is TYPEUNDEF' )
+      return
+
+    case default
+      call Print_msg( NVERB_ERROR, 'IO', 'IO_Field_create_nc4', Trim( tpfield%cmnhname ) // ': invalid ntype' )
+      return
+  end select
+
+  ! Define the variable
+  istatus = NF90_DEF_VAR( tpfile%nncid, yvarname, itype, ivdims, ivarid )
+  if ( istatus /= NF90_NOERR ) call IO_Err_handle_nc4( istatus, 'IO_Field_create_nc4', 'NF90_DEF_VAR', Trim( yvarname ) )
+
+  ! Add compression if asked for
+  if ( tpfile%lnccompress .and. tpfield%ntype == TYPEREAL .and. tpfield%ndims >= 1 ) then
+    istatus = NF90_DEF_VAR_DEFLATE( tpfile%nncid, ivarid, SHUFFLE, DEFLATE, tpfile%nnccompress_level )
+    if ( istatus /= NF90_NOERR ) call IO_Err_handle_nc4( istatus, 'IO_Field_create_nc4', 'NF90_DEF_VAR_DEFLATE', Trim( yvarname ) )
+  end if
+else
+  gexisted = .true.
+  call Print_msg( NVERB_WARNING, 'IO', 'IO_Field_create_nc4', Trim( tpfile%cname ) // ': ' &
+                  // Trim( yvarname ) // ' already defined' )
+end if
+
+! Write metadata
+call IO_Field_attr_write_nc4( tpfile, tpfield, ivarid, gexisted, kshape = ishape, hcalendar = hcalendar, oiscoord = oiscoord )
+
+if ( Present( kvarid ) ) kvarid = ivarid
+
+end subroutine IO_Field_create_nc4
+
+
 SUBROUTINE IO_Field_write_nc4_X0(TPFILE,TPFIELD,PFIELD,KRESP)
 !
 TYPE(TFILEDATA),       INTENT(IN) :: TPFILE
@@ -358,51 +515,19 @@ TYPE(TFIELDDATA),      INTENT(IN) :: TPFIELD
 REAL,                  INTENT(IN) :: PFIELD
 INTEGER,               INTENT(OUT):: KRESP
 !
-INTEGER(KIND=CDFINT)                            :: STATUS
-INTEGER(KIND=CDFINT)                            :: INCID
-CHARACTER(LEN=LEN(TPFIELD%CMNHNAME))            :: YVARNAME
-INTEGER(KIND=CDFINT)                            :: IVARID
-INTEGER(KIND=CDFINT), DIMENSION(:), ALLOCATABLE :: IVDIMS
-INTEGER                                         :: IRESP
-LOGICAL                                         :: GEXISTED !True if variable was already defined
+INTEGER(KIND=CDFINT) :: STATUS
+INTEGER(KIND=CDFINT) :: IVARID
 !
 CALL PRINT_MSG(NVERB_DEBUG,'IO','IO_Field_write_nc4_X0',TRIM(TPFILE%CNAME)//': writing '//TRIM(TPFIELD%CMNHNAME))
 !
-IRESP = 0
-! Get the Netcdf file ID
-INCID = TPFILE%NNCID
-!
-GEXISTED = .FALSE.
-!
-CALL IO_Mnhname_clean(TPFIELD%CMNHNAME,YVARNAME)
-!
-! The variable should not already exist but who knows ?
-STATUS = NF90_INQ_VARID(INCID, YVARNAME, IVARID)
-IF (STATUS /= NF90_NOERR) THEN
-   IF (TPFIELD%LTIMEDEP) THEN
-     ! Get the netcdf dimensions
-     CALL IO_Vdims_fill_nc4(TPFILE, TPFIELD, INT(SHAPE(PFIELD),KIND=CDFINT), IVDIMS)
-     ! Define the variable
-     STATUS = NF90_DEF_VAR(INCID, YVARNAME, MNHREAL_NF90, IVDIMS, IVARID)
-     IF (status /= NF90_NOERR) CALL IO_Err_handle_nc4(status,'IO_Field_write_nc4_X0','NF90_DEF_VAR',trim(YVARNAME))
-     DEALLOCATE(IVDIMS)
-   ELSE
-     ! Define the scalar variable
-     STATUS = NF90_DEF_VAR(INCID, YVARNAME, MNHREAL_NF90, IVARID)
-     IF (status /= NF90_NOERR) CALL IO_Err_handle_nc4(status,'IO_Field_write_nc4_X0','NF90_DEF_VAR',trim(YVARNAME))
-   END IF
-ELSE
-   GEXISTED = .TRUE.
-   CALL PRINT_MSG(NVERB_WARNING,'IO','IO_Field_write_nc4_X0',TRIM(TPFILE%CNAME)//': '//TRIM(YVARNAME)//' already defined')
-END IF
+KRESP = 0
+
+call IO_Field_create_nc4( tpfile, tpfield, kvarid = ivarid )
 
-! Write metadata
-CALL IO_Field_attr_write_nc4(TPFILE,TPFIELD,IVARID,GEXISTED)
 ! Write the data
-STATUS = NF90_PUT_VAR(INCID, IVARID, PFIELD)
-IF (status /= NF90_NOERR) CALL IO_Err_handle_nc4(status,'IO_Field_write_nc4_X0','NF90_PUT_VAR',trim(YVARNAME),IRESP)
+STATUS = NF90_PUT_VAR(TPFILE%NNCID, IVARID, PFIELD)
+IF (status /= NF90_NOERR) CALL IO_Err_handle_nc4(status,'IO_Field_write_nc4_X0','NF90_PUT_VAR',trim(TPFIELD%CMNHNAME),KRESP)
 
-KRESP = IRESP
 END SUBROUTINE IO_Field_write_nc4_X0
 
 
@@ -413,62 +538,20 @@ TYPE(TFIELDDATA),      INTENT(IN) :: TPFIELD
 REAL,DIMENSION(:),     INTENT(IN) :: PFIELD   ! array containing the data field
 INTEGER,               INTENT(OUT):: KRESP
 !
-INTEGER(KIND=CDFINT)                            :: STATUS
-INTEGER(KIND=CDFINT)                            :: INCID
-CHARACTER(LEN=LEN(TPFIELD%CMNHNAME)+4)          :: YVARNAME
-INTEGER(KIND=CDFINT)                            :: IVARID
-INTEGER(KIND=CDFINT), DIMENSION(:), ALLOCATABLE :: IVDIMS
-INTEGER                                         :: IRESP
-LOGICAL                                         :: GEXISTED !True if variable was already defined
+INTEGER(KIND=CDFINT) :: STATUS
+INTEGER(KIND=CDFINT) :: IVARID
+logical              :: gisempty
 !
 CALL PRINT_MSG(NVERB_DEBUG,'IO','IO_Field_write_nc4_X1',TRIM(TPFILE%CNAME)//': writing '//TRIM(TPFIELD%CMNHNAME))
 !
-IRESP = 0
-! Get the Netcdf file ID
-INCID = TPFILE%NNCID
-!
-GEXISTED = .FALSE.
+KRESP = 0
 !
-CALL IO_Mnhname_clean(TPFIELD%CMNHNAME,YVARNAME)
-
-! The variable should not already exist but who knows ?
-STATUS = NF90_INQ_VARID(INCID, YVARNAME, IVARID)
-IF (STATUS /= NF90_NOERR) THEN
-   IF (SIZE(PFIELD)==0) THEN
-     CALL PRINT_MSG(NVERB_WARNING,'IO','IO_Field_write_nc4_X1','ignoring variable with a zero size ('//TRIM(YVARNAME)//')')
-     KRESP = 0
-     RETURN
-   END IF
+call IO_Field_create_nc4( tpfile, tpfield, kshape = Shape( pfield ), kvarid = ivarid, oisempty = gisempty )
 
-   ! Get the netcdf dimensions
-   CALL IO_Vdims_fill_nc4(TPFILE, TPFIELD, INT(SHAPE(PFIELD),KIND=CDFINT), IVDIMS)
-
-   ! Define the variable
-   IF (TPFILE%LNCREDUCE_FLOAT_PRECISION) THEN
-     STATUS = NF90_DEF_VAR(INCID, YVARNAME, NF90_FLOAT,  IVDIMS, IVARID)
-   ELSE
-     STATUS = NF90_DEF_VAR(INCID, YVARNAME, MNHREAL_NF90, IVDIMS, IVARID)
-   END IF
-     IF (status /= NF90_NOERR) CALL IO_Err_handle_nc4(status,'IO_Field_write_nc4_X1','NF90_DEF_VAR',trim(YVARNAME))
-   ! Add compression if asked for
-   IF (TPFILE%LNCCOMPRESS) THEN
-     STATUS = NF90_DEF_VAR_DEFLATE(INCID, IVARID, SHUFFLE, DEFLATE, TPFILE%NNCCOMPRESS_LEVEL)
-     IF (STATUS /= NF90_NOERR) CALL IO_Err_handle_nc4(status,'IO_Field_write_nc4_X1','NF90_DEF_VAR_DEFLATE',trim(YVARNAME))
-   END IF
-ELSE
-   GEXISTED = .TRUE.
-   CALL PRINT_MSG(NVERB_WARNING,'IO','IO_Field_write_nc4_X1',TRIM(TPFILE%CNAME)//': '//TRIM(YVARNAME)//' already defined')
-END IF
-
-! Write metadata
-CALL IO_Field_attr_write_nc4(TPFILE,TPFIELD,IVARID,GEXISTED)
 ! Write the data
-STATUS = NF90_PUT_VAR(INCID, IVARID, PFIELD)
-IF (status /= NF90_NOERR) CALL IO_Err_handle_nc4(status,'IO_Field_write_nc4_X1','NF90_PUT_VAR',trim(YVARNAME),IRESP)
-
-IF(ALLOCATED(IVDIMS)) DEALLOCATE(IVDIMS)
+if ( .not. gisempty ) STATUS = NF90_PUT_VAR(TPFILE%NNCID, IVARID, PFIELD)
+IF (status /= NF90_NOERR) CALL IO_Err_handle_nc4(status,'IO_Field_write_nc4_X1','NF90_PUT_VAR',trim(TPFIELD%CMNHNAME),KRESP)
 
-KRESP = IRESP
 END SUBROUTINE IO_Field_write_nc4_X1
 
 
@@ -482,18 +565,13 @@ INTEGER,OPTIONAL,      INTENT(IN) :: KVERTLEVEL ! Number of the vertical level (
 INTEGER,OPTIONAL,      INTENT(IN) :: KZFILE     ! Number of the Z-level split file
 LOGICAL,OPTIONAL,      INTENT(IN) :: OISCOORD   ! Is a coordinate variable (->do not write coordinates attribute)
 !
-INTEGER(KIND=CDFINT)                            :: STATUS
-INTEGER(KIND=CDFINT)                            :: INCID
-CHARACTER(LEN=4)                                :: YSUFFIX
-CHARACTER(LEN=LEN(TPFIELD%CMNHNAME)+4)          :: YVARNAME
-INTEGER(KIND=CDFINT)                            :: IVARID
-INTEGER(KIND=CDFINT), DIMENSION(:), ALLOCATABLE :: IVDIMS
-INTEGER                                         :: IRESP
-TYPE(TFIELDDATA)                                :: TZFIELD
-TYPE(TFILEDATA),POINTER                         :: TZFILE
-LOGICAL                                         :: GEXISTED !True if variable was already defined
+INTEGER(KIND=CDFINT)     :: STATUS
+CHARACTER(LEN=4)         :: YSUFFIX
+INTEGER(KIND=CDFINT)     :: IVARID
+TYPE(TFIELDDATA)         :: TZFIELD
+TYPE(TFILEDATA), POINTER :: TZFILE
 !
-IRESP = 0
+KRESP = 0
 !
 IF (PRESENT(KVERTLEVEL)) THEN
   WRITE(YSUFFIX,'(I4.4)') KVERTLEVEL
@@ -515,51 +593,12 @@ ENDIF
 !
 CALL PRINT_MSG(NVERB_DEBUG,'IO','IO_Field_write_nc4_X2',TRIM(TZFILE%CNAME)//': writing '//TRIM(TZFIELD%CMNHNAME))
 !
-! Get the Netcdf file ID
-INCID = TZFILE%NNCID
-!
-GEXISTED = .FALSE.
-!
-CALL IO_Mnhname_clean(TZFIELD%CMNHNAME,YVARNAME)
-
-! The variable should not already exist but who knows ?
-STATUS = NF90_INQ_VARID(INCID, YVARNAME, IVARID)
-IF (STATUS /= NF90_NOERR) THEN
-   IF (SIZE(PFIELD)==0) THEN
-     CALL PRINT_MSG(NVERB_WARNING,'IO','IO_Field_write_nc4_X2','ignoring variable with a zero size ('//TRIM(YVARNAME)//')')
-     KRESP = 0
-     RETURN
-   END IF
-
-   ! Get the netcdf dimensions
-   CALL IO_Vdims_fill_nc4(TZFILE, TZFIELD, INT(SHAPE(PFIELD),KIND=CDFINT), IVDIMS)
+call IO_Field_create_nc4( tzfile, tzfield, kshape = Shape( pfield ), oiscoord = oiscoord, kvarid = ivarid )
 
-   ! Define the variable
-   IF (TZFILE%LNCREDUCE_FLOAT_PRECISION) THEN
-     STATUS = NF90_DEF_VAR(INCID, YVARNAME, NF90_FLOAT,  IVDIMS, IVARID)
-   ELSE
-     STATUS = NF90_DEF_VAR(INCID, YVARNAME, MNHREAL_NF90, IVDIMS, IVARID)
-   END IF
-     IF (status /= NF90_NOERR) CALL IO_Err_handle_nc4(status,'IO_Field_write_nc4_X2','NF90_DEF_VAR',trim(YVARNAME))
-   ! Add compression if asked for
-   IF (TZFILE%LNCCOMPRESS) THEN
-     STATUS = NF90_DEF_VAR_DEFLATE(INCID, IVARID, SHUFFLE, DEFLATE, TZFILE%NNCCOMPRESS_LEVEL)
-     IF (STATUS /= NF90_NOERR) CALL IO_Err_handle_nc4(status,'IO_Field_write_nc4_X2','NF90_DEF_VAR_DEFLATE',trim(YVARNAME))
-   END IF
-ELSE
-   GEXISTED = .TRUE.
-   CALL PRINT_MSG(NVERB_WARNING,'IO','IO_Field_write_nc4_X2',TRIM(TZFILE%CNAME)//': '//TRIM(YVARNAME)//' already defined')
-END IF
-
-! Write metadata
-CALL IO_Field_attr_write_nc4(TZFILE,TZFIELD,IVARID,GEXISTED,KSHAPE=INT(SHAPE(PFIELD),KIND=CDFINT),OISCOORD=OISCOORD)
 ! Write the data
-STATUS = NF90_PUT_VAR(INCID, IVARID, PFIELD)
-IF (status /= NF90_NOERR) CALL IO_Err_handle_nc4(status,'IO_Field_write_nc4_X2','NF90_PUT_VAR',trim(YVARNAME),IRESP)
-
-IF(ALLOCATED(IVDIMS)) DEALLOCATE(IVDIMS)
+STATUS = NF90_PUT_VAR(TZFILE%NNCID, IVARID, PFIELD)
+IF (status /= NF90_NOERR) CALL IO_Err_handle_nc4(status,'IO_Field_write_nc4_X2','NF90_PUT_VAR',trim(TZFIELD%CMNHNAME),KRESP)
 
-KRESP = IRESP
 END SUBROUTINE IO_Field_write_nc4_X2
 
 
@@ -570,64 +609,19 @@ TYPE(TFIELDDATA),      INTENT(IN) :: TPFIELD
 REAL,DIMENSION(:,:,:), INTENT(IN) :: PFIELD   ! array containing the data field
 INTEGER,               INTENT(OUT):: KRESP
 !
-INTEGER(KIND=CDFINT)                            :: STATUS
-INTEGER(KIND=CDFINT)                            :: INCID
-CHARACTER(LEN=LEN(TPFIELD%CMNHNAME))            :: YVARNAME
-INTEGER(KIND=CDFINT)                            :: IVARID
-INTEGER(KIND=CDFINT), DIMENSION(:), ALLOCATABLE :: IVDIMS
-INTEGER                                         :: IRESP
-LOGICAL                                         :: GEXISTED !True if variable was already defined
-!
+INTEGER(KIND=CDFINT) :: STATUS
+INTEGER(KIND=CDFINT) :: IVARID
 !
 CALL PRINT_MSG(NVERB_DEBUG,'IO','IO_Field_write_nc4_X3',TRIM(TPFILE%CNAME)//': writing '//TRIM(TPFIELD%CMNHNAME))
 !
-IRESP = 0
-! Get the Netcdf file ID
-INCID = TPFILE%NNCID
-!
-GEXISTED = .FALSE.
+KRESP = 0
 !
-CALL IO_Mnhname_clean(TPFIELD%CMNHNAME,YVARNAME)
+call IO_Field_create_nc4( tpfile, tpfield, kshape = Shape( pfield ), kvarid = ivarid )
 
-! The variable should not already exist but who knows ?
-STATUS = NF90_INQ_VARID(INCID, YVARNAME, IVARID)
-IF (STATUS /= NF90_NOERR) THEN
-   IF (SIZE(PFIELD)==0) THEN
-     CALL PRINT_MSG(NVERB_WARNING,'IO','IO_Field_write_nc4_X3','ignoring variable with a zero size ('//TRIM(YVARNAME)//')')
-     KRESP = 0
-     RETURN
-   END IF
-
-   ! Get the netcdf dimensions
-   CALL IO_Vdims_fill_nc4(TPFILE, TPFIELD, INT(SHAPE(PFIELD),KIND=CDFINT), IVDIMS)
-
-   ! Define the variable
-   IF (TPFILE%LNCREDUCE_FLOAT_PRECISION) THEN
-     STATUS = NF90_DEF_VAR(INCID, YVARNAME, NF90_FLOAT,  IVDIMS, IVARID)
-   ELSE
-     STATUS = NF90_DEF_VAR(INCID, YVARNAME, MNHREAL_NF90, IVDIMS, IVARID)
-   END IF
-   IF (status /= NF90_NOERR) CALL IO_Err_handle_nc4(status,'IO_Field_write_nc4_X3','NF90_DEF_VAR',trim(YVARNAME))
-
-   ! Add compression if asked for
-   IF (TPFILE%LNCCOMPRESS) THEN
-     STATUS = NF90_DEF_VAR_DEFLATE(INCID, IVARID, SHUFFLE, DEFLATE, TPFILE%NNCCOMPRESS_LEVEL)
-     IF (STATUS /= NF90_NOERR) CALL IO_Err_handle_nc4(status,'IO_Field_write_nc4_X3','NF90_DEF_VAR_DEFLATE',trim(YVARNAME))
-   END IF
-ELSE
-   GEXISTED = .TRUE.
-   CALL PRINT_MSG(NVERB_WARNING,'IO','IO_Field_write_nc4_X3',TRIM(TPFILE%CNAME)//': '//TRIM(YVARNAME)//' already defined')
-END IF
-
-! Write metadata
-CALL IO_Field_attr_write_nc4(TPFILE,TPFIELD,IVARID,GEXISTED,KSHAPE=INT(SHAPE(PFIELD),KIND=CDFINT))
 ! Write the data
-STATUS = NF90_PUT_VAR(INCID, IVARID, PFIELD)
-IF (status /= NF90_NOERR) CALL IO_Err_handle_nc4(status,'IO_Field_write_nc4_X3','NF90_PUT_VAR',trim(YVARNAME),IRESP)
-
-IF(ALLOCATED(IVDIMS)) DEALLOCATE(IVDIMS)
+STATUS = NF90_PUT_VAR(TPFILE%NNCID, IVARID, PFIELD)
+IF (status /= NF90_NOERR) CALL IO_Err_handle_nc4(status,'IO_Field_write_nc4_X3','NF90_PUT_VAR',trim(TPFIELD%CMNHNAME),KRESP)
 
-KRESP = IRESP
 END SUBROUTINE IO_Field_write_nc4_X3
 
 
@@ -638,64 +632,19 @@ TYPE(TFIELDDATA),          INTENT(IN) :: TPFIELD
 REAL,DIMENSION(:,:,:,:),   INTENT(IN) :: PFIELD   ! array containing the data field
 INTEGER,                   INTENT(OUT):: KRESP
 !
-INTEGER(KIND=CDFINT)                            :: STATUS
-INTEGER(KIND=CDFINT)                            :: INCID
-CHARACTER(LEN=LEN(TPFIELD%CMNHNAME))            :: YVARNAME
-INTEGER(KIND=CDFINT)                            :: IVARID
-INTEGER(KIND=CDFINT), DIMENSION(:), ALLOCATABLE :: IVDIMS
-INTEGER                                         :: IRESP
-LOGICAL                                         :: GEXISTED !True if variable was already defined
-!
+INTEGER(KIND=CDFINT) :: STATUS
+INTEGER(KIND=CDFINT) :: IVARID
 !
 CALL PRINT_MSG(NVERB_DEBUG,'IO','IO_Field_write_nc4_X4',TRIM(TPFILE%CNAME)//': writing '//TRIM(TPFIELD%CMNHNAME))
 !
-IRESP = 0
-! Get the Netcdf file ID
-INCID = TPFILE%NNCID
+KRESP = 0
 !
-GEXISTED = .FALSE.
-!
-CALL IO_Mnhname_clean(TPFIELD%CMNHNAME,YVARNAME)
-
-! The variable should not already exist but who knows ?
-STATUS = NF90_INQ_VARID(INCID, YVARNAME, IVARID)
-IF (STATUS /= NF90_NOERR) THEN
-   IF (SIZE(PFIELD)==0) THEN
-     CALL PRINT_MSG(NVERB_WARNING,'IO','IO_Field_write_nc4_X4','ignoring variable with a zero size ('//TRIM(YVARNAME)//')')
-     KRESP = 0
-     RETURN
-   END IF
+call IO_Field_create_nc4( tpfile, tpfield, kshape = Shape( pfield ), kvarid = ivarid )
 
-   ! Get the netcdf dimensions
-   CALL IO_Vdims_fill_nc4(TPFILE, TPFIELD, INT(SHAPE(PFIELD),KIND=CDFINT), IVDIMS)
-
-   ! Define the variable
-   IF (TPFILE%LNCREDUCE_FLOAT_PRECISION) THEN
-     STATUS = NF90_DEF_VAR(INCID, YVARNAME, NF90_FLOAT,  IVDIMS, IVARID)
-   ELSE
-     STATUS = NF90_DEF_VAR(INCID, YVARNAME, MNHREAL_NF90, IVDIMS, IVARID)
-   END IF
-   IF (status /= NF90_NOERR) CALL IO_Err_handle_nc4(status,'IO_Field_write_nc4_X4','NF90_DEF_VAR',trim(YVARNAME))
-
-   ! Add compression if asked for
-   IF (TPFILE%LNCCOMPRESS) THEN
-     STATUS = NF90_DEF_VAR_DEFLATE(INCID, IVARID, SHUFFLE, DEFLATE, TPFILE%NNCCOMPRESS_LEVEL)
-     IF (STATUS /= NF90_NOERR) CALL IO_Err_handle_nc4(status,'IO_Field_write_nc4_X4','NF90_DEF_VAR_DEFLATE',trim(YVARNAME))
-   END IF
-ELSE
-   GEXISTED = .TRUE.
-   CALL PRINT_MSG(NVERB_WARNING,'IO','IO_Field_write_nc4_X4',TRIM(TPFILE%CNAME)//': '//TRIM(YVARNAME)//' already defined')
-END IF
-
-! Write metadata
-CALL IO_Field_attr_write_nc4(TPFILE,TPFIELD,IVARID,GEXISTED,KSHAPE=INT(SHAPE(PFIELD),KIND=CDFINT))
 ! Write the data
-STATUS = NF90_PUT_VAR(INCID, IVARID, PFIELD)
-IF (status /= NF90_NOERR) CALL IO_Err_handle_nc4(status,'IO_Field_write_nc4_X4','NF90_PUT_VAR',trim(YVARNAME),IRESP)
+STATUS = NF90_PUT_VAR(TPFILE%NNCID, IVARID, PFIELD)
+IF (status /= NF90_NOERR) CALL IO_Err_handle_nc4(status,'IO_Field_write_nc4_X4','NF90_PUT_VAR',trim(TPFIELD%CMNHNAME),KRESP)
 
-IF(ALLOCATED(IVDIMS)) DEALLOCATE(IVDIMS)
-
-KRESP = IRESP
 END SUBROUTINE IO_Field_write_nc4_X4
 
 
@@ -706,64 +655,19 @@ TYPE(TFIELDDATA),          INTENT(IN) :: TPFIELD
 REAL,DIMENSION(:,:,:,:,:), INTENT(IN) :: PFIELD   ! array containing the data field
 INTEGER,                   INTENT(OUT):: KRESP
 !
-INTEGER(KIND=CDFINT)                            :: STATUS
-INTEGER(KIND=CDFINT)                            :: INCID
-CHARACTER(LEN=LEN(TPFIELD%CMNHNAME))            :: YVARNAME
-INTEGER(KIND=CDFINT)                            :: IVARID
-INTEGER(KIND=CDFINT), DIMENSION(:), ALLOCATABLE :: IVDIMS
-INTEGER                                         :: IRESP
-LOGICAL                                         :: GEXISTED !True if variable was already defined
-!
+INTEGER(KIND=CDFINT) :: STATUS
+INTEGER(KIND=CDFINT) :: IVARID
 !
 CALL PRINT_MSG(NVERB_DEBUG,'IO','IO_Field_write_nc4_X5',TRIM(TPFILE%CNAME)//': writing '//TRIM(TPFIELD%CMNHNAME))
 !
-IRESP = 0
-! Get the Netcdf file ID
-INCID = TPFILE%NNCID
-!
-GEXISTED = .FALSE.
+KRESP = 0
 !
-CALL IO_Mnhname_clean(TPFIELD%CMNHNAME,YVARNAME)
-
-! The variable should not already exist but who knows ?
-STATUS = NF90_INQ_VARID(INCID, YVARNAME, IVARID)
-IF (STATUS /= NF90_NOERR) THEN
-   IF (SIZE(PFIELD)==0) THEN
-     CALL PRINT_MSG(NVERB_WARNING,'IO','IO_Field_write_nc4_X5','ignoring variable with a zero size ('//TRIM(YVARNAME)//')')
-     KRESP = 0
-     RETURN
-   END IF
-
-   ! Get the netcdf dimensions
-   CALL IO_Vdims_fill_nc4(TPFILE, TPFIELD, INT(SHAPE(PFIELD),KIND=CDFINT), IVDIMS)
-
-   ! Define the variable
-   IF (TPFILE%LNCREDUCE_FLOAT_PRECISION) THEN
-     STATUS = NF90_DEF_VAR(INCID, YVARNAME, NF90_FLOAT,  IVDIMS, IVARID)
-   ELSE
-     STATUS = NF90_DEF_VAR(INCID, YVARNAME, MNHREAL_NF90, IVDIMS, IVARID)
-   END IF
-   IF (status /= NF90_NOERR) CALL IO_Err_handle_nc4(status,'IO_Field_write_nc4_X5','NF90_DEF_VAR',trim(YVARNAME))
-
-   ! Add compression if asked for
-   IF (TPFILE%LNCCOMPRESS) THEN
-     STATUS = NF90_DEF_VAR_DEFLATE(INCID, IVARID, SHUFFLE, DEFLATE, TPFILE%NNCCOMPRESS_LEVEL)
-     IF (STATUS /= NF90_NOERR) CALL IO_Err_handle_nc4(status,'IO_Field_write_nc4_X5','NF90_DEF_VAR_DEFLATE',trim(YVARNAME))
-   END IF
-ELSE
-   GEXISTED = .TRUE.
-   CALL PRINT_MSG(NVERB_WARNING,'IO','IO_Field_write_nc4_X5',TRIM(TPFILE%CNAME)//': '//TRIM(YVARNAME)//' already defined')
-END IF
+call IO_Field_create_nc4( tpfile, tpfield, kshape = Shape( pfield ), kvarid = ivarid )
 
-! Write metadata
-CALL IO_Field_attr_write_nc4(TPFILE,TPFIELD,IVARID,GEXISTED,KSHAPE=INT(SHAPE(PFIELD),KIND=CDFINT))
 ! Write the data
-STATUS = NF90_PUT_VAR(INCID, IVARID, PFIELD)
-IF (status /= NF90_NOERR) CALL IO_Err_handle_nc4(status,'IO_Field_write_nc4_X5','NF90_PUT_VAR',trim(YVARNAME),IRESP)
+STATUS = NF90_PUT_VAR(TPFILE%NNCID, IVARID, PFIELD)
+IF (status /= NF90_NOERR) CALL IO_Err_handle_nc4(status,'IO_Field_write_nc4_X5','NF90_PUT_VAR',trim(TPFIELD%CMNHNAME),KRESP)
 
-IF(ALLOCATED(IVDIMS)) DEALLOCATE(IVDIMS)
-
-KRESP = IRESP
 END SUBROUTINE IO_Field_write_nc4_X5
 
 
@@ -774,64 +678,19 @@ TYPE(TFIELDDATA),            INTENT(IN) :: TPFIELD
 REAL,DIMENSION(:,:,:,:,:,:), INTENT(IN) :: PFIELD   ! array containing the data field
 INTEGER,                     INTENT(OUT):: KRESP
 !
-INTEGER(KIND=CDFINT)                            :: STATUS
-INTEGER(KIND=CDFINT)                            :: INCID
-CHARACTER(LEN=LEN(TPFIELD%CMNHNAME))            :: YVARNAME
-INTEGER(KIND=CDFINT)                            :: IVARID
-INTEGER(KIND=CDFINT), DIMENSION(:), ALLOCATABLE :: IVDIMS
-INTEGER                                         :: IRESP
-LOGICAL                                         :: GEXISTED !True if variable was already defined
-!
+INTEGER(KIND=CDFINT) :: STATUS
+INTEGER(KIND=CDFINT) :: IVARID
 !
 CALL PRINT_MSG(NVERB_DEBUG,'IO','IO_Field_write_nc4_X6',TRIM(TPFILE%CNAME)//': writing '//TRIM(TPFIELD%CMNHNAME))
 !
-IRESP = 0
-! Get the Netcdf file ID
-INCID = TPFILE%NNCID
-!
-GEXISTED = .FALSE.
+KRESP = 0
 !
-CALL IO_Mnhname_clean(TPFIELD%CMNHNAME,YVARNAME)
-
-! The variable should not already exist but who knows ?
-STATUS = NF90_INQ_VARID(INCID, YVARNAME, IVARID)
-IF (STATUS /= NF90_NOERR) THEN
-   IF (SIZE(PFIELD)==0) THEN
-     CALL PRINT_MSG(NVERB_WARNING,'IO','IO_Field_write_nc4_X6','ignoring variable with a zero size ('//TRIM(YVARNAME)//')')
-     KRESP = 0
-     RETURN
-   END IF
-
-   ! Get the netcdf dimensions
-   CALL IO_Vdims_fill_nc4(TPFILE, TPFIELD, INT(SHAPE(PFIELD),KIND=CDFINT), IVDIMS)
-
-   ! Define the variable
-   IF (TPFILE%LNCREDUCE_FLOAT_PRECISION) THEN
-     STATUS = NF90_DEF_VAR(INCID, YVARNAME, NF90_FLOAT,  IVDIMS, IVARID)
-   ELSE
-     STATUS = NF90_DEF_VAR(INCID, YVARNAME, MNHREAL_NF90, IVDIMS, IVARID)
-   END IF
-   IF (status /= NF90_NOERR) CALL IO_Err_handle_nc4(status,'IO_Field_write_nc4_X6','NF90_DEF_VAR',trim(YVARNAME))
-
-     ! Add compression if asked for
-   IF (TPFILE%LNCCOMPRESS) THEN
-     STATUS = NF90_DEF_VAR_DEFLATE(INCID, IVARID, SHUFFLE, DEFLATE, TPFILE%NNCCOMPRESS_LEVEL)
-     IF (STATUS /= NF90_NOERR) CALL IO_Err_handle_nc4(status,'IO_Field_write_nc4_X6','NF90_DEF_VAR_DEFLATE',trim(YVARNAME))
-   END IF
-ELSE
-   GEXISTED = .TRUE.
-   CALL PRINT_MSG(NVERB_WARNING,'IO','IO_Field_write_nc4_X6',TRIM(TPFILE%CNAME)//': '//TRIM(YVARNAME)//' already defined')
-END IF
+call IO_Field_create_nc4( tpfile, tpfield, kshape = Shape( pfield ), kvarid = ivarid )
 
-! Write metadata
-CALL IO_Field_attr_write_nc4(TPFILE,TPFIELD,IVARID,GEXISTED,KSHAPE=INT(SHAPE(PFIELD),KIND=CDFINT))
 ! Write the data
-STATUS = NF90_PUT_VAR(INCID, IVARID, PFIELD)
-IF (status /= NF90_NOERR) CALL IO_Err_handle_nc4(status,'IO_Field_write_nc4_X6','NF90_PUT_VAR',trim(YVARNAME),IRESP)
-
-IF(ALLOCATED(IVDIMS)) DEALLOCATE(IVDIMS)
+STATUS = NF90_PUT_VAR(TPFILE%NNCID, IVARID, PFIELD)
+IF (status /= NF90_NOERR) CALL IO_Err_handle_nc4(status,'IO_Field_write_nc4_X6','NF90_PUT_VAR',trim(TPFIELD%CMNHNAME),KRESP)
 
-KRESP = IRESP
 END SUBROUTINE IO_Field_write_nc4_X6
 
 
@@ -839,7 +698,7 @@ SUBROUTINE IO_Field_write_nc4_N0(TPFILE,TPFIELD,KFIELD,KRESP)
 !
 #if 0
 use modd_field,          only: NMNHDIM_NI, NMNHDIM_NJ, NMNHDIM_LEVEL
-USE MODD_IO,             ONLY: LPACK,L1D,L2D
+USE MODD_IO,             ONLY: LPACK, L2D
 USE MODD_PARAMETERS_ll,  ONLY: JPHEXT, JPVEXT
 #else
 use modd_field,          only: NMNHDIM_LEVEL
@@ -851,60 +710,28 @@ TYPE(TFIELDDATA),      INTENT(IN) :: TPFIELD
 INTEGER,               INTENT(IN) :: KFIELD
 INTEGER,               INTENT(OUT):: KRESP
 !
-integer                                         :: iidx
-INTEGER(KIND=CDFINT)                            :: STATUS
-INTEGER(KIND=CDFINT)                            :: INCID
-CHARACTER(LEN=LEN(TPFIELD%CMNHNAME))            :: YVARNAME
-INTEGER(KIND=CDFINT)                            :: IVARID
-INTEGER(KIND=CDFINT), DIMENSION(:), ALLOCATABLE :: IVDIMS
-INTEGER                                         :: IRESP
-LOGICAL                                         :: GEXISTED !True if variable was already defined
+integer              :: iidx
+INTEGER(KIND=CDFINT) :: STATUS
+INTEGER(KIND=CDFINT) :: IVARID
 !
 CALL PRINT_MSG(NVERB_DEBUG,'IO','IO_Field_write_nc4_N0',TRIM(TPFILE%CNAME)//': writing '//TRIM(TPFIELD%CMNHNAME))
 !
-IRESP = 0
-! Get the Netcdf file ID
-INCID = TPFILE%NNCID
-!
-GEXISTED = .FALSE.
-!
-CALL IO_Mnhname_clean(TPFIELD%CMNHNAME,YVARNAME)
+KRESP = 0
 !
-! The variable should not already exist but who knows ?
-STATUS = NF90_INQ_VARID(INCID, YVARNAME, IVARID)
-IF (STATUS /= NF90_NOERR) THEN
-   IF (TPFIELD%LTIMEDEP) THEN
-     ! Get the netcdf dimensions
-     CALL IO_Vdims_fill_nc4(TPFILE, TPFIELD, INT(SHAPE(KFIELD),KIND=CDFINT), IVDIMS)
-     ! Define the variable
-     STATUS = NF90_DEF_VAR(INCID, YVARNAME, MNHINT_NF90, IVDIMS, IVARID)
-     IF (status /= NF90_NOERR) CALL IO_Err_handle_nc4(status,'IO_Field_write_nc4_N0','NF90_DEF_VAR',trim(YVARNAME))
-     DEALLOCATE(IVDIMS)
-   ELSE
-     ! Define the scalar variable
-     STATUS = NF90_DEF_VAR(INCID, YVARNAME, MNHINT_NF90, IVARID)
-     IF (status /= NF90_NOERR) CALL IO_Err_handle_nc4(status,'IO_Field_write_nc4_N0','NF90_DEF_VAR',trim(YVARNAME))
-   END IF
-ELSE
-   GEXISTED = .TRUE.
-   CALL PRINT_MSG(NVERB_WARNING,'IO','IO_Field_write_nc4_N0',TRIM(TPFILE%CNAME)//': '//TRIM(YVARNAME)//' already defined')
-END IF
+call IO_Field_create_nc4( tpfile, tpfield, kvarid = ivarid )
 
-! Write metadata
-CALL IO_Field_attr_write_nc4(TPFILE,TPFIELD,IVARID,GEXISTED)
 ! Write the data
-STATUS = NF90_PUT_VAR(INCID, IVARID, KFIELD)
-IF (status /= NF90_NOERR) CALL IO_Err_handle_nc4(status,'IO_Field_write_nc4_N0','NF90_PUT_VAR',trim(YVARNAME),IRESP)
-
+STATUS = NF90_PUT_VAR(TPFILE%NNCID, IVARID, KFIELD)
+IF (status /= NF90_NOERR) CALL IO_Err_handle_nc4(status,'IO_Field_write_nc4_N0','NF90_PUT_VAR',trim(TPFIELD%CMNHNAME),KRESP)
 !
 ! Use IMAX, JMAX, KMAX to define DIM_NI, DIM_NJ, DIM_LEVEL
 ! /!\ Can only work if IMAX, JMAX or KMAX are written before any array
 !
 #if 0
-if ( yvarname == 'IMAX' .and. tpfile%tncdims%tdims(NMNHDIM_NI)%nid == -1 ) then
+if ( tpfield%cmnhname == 'IMAX' .and. tpfile%tncdims%tdims(NMNHDIM_NI)%nid == -1 ) then
   call IO_Dim_find_create_nc4( tpfile, kfield + 2 * jphext, iidx, 'X' )
 end if
-if ( yvarname == 'JMAX' .and. tpfile%tncdims%tdims(NMNHDIM_NJ)%nid == -1 ) then
+if ( tpfield%cmnhname == 'JMAX' .and. tpfile%tncdims%tdims(NMNHDIM_NJ)%nid == -1 ) then
   if ( lpack .and. l2d ) then
     call IO_Dim_find_create_nc4( tpfile, 1,                   iidx, 'Y' )
   else
@@ -912,18 +739,17 @@ if ( yvarname == 'JMAX' .and. tpfile%tncdims%tdims(NMNHDIM_NJ)%nid == -1 ) then
   end if
 end if
 #endif
-if ( yvarname == 'KMAX' .and. tpfile%tncdims%tdims(NMNHDIM_LEVEL)%nid == -1 ) then
+if ( tpfield%cmnhname == 'KMAX' .and. tpfile%tncdims%tdims(NMNHDIM_LEVEL)%nid == -1 ) then
   call IO_Dim_find_create_nc4( tpfile, kfield + 2 * JPVEXT, iidx, 'Z' )
 end if
 
-KRESP = IRESP
 END SUBROUTINE IO_Field_write_nc4_N0
 
 
 SUBROUTINE IO_Field_write_nc4_N1(TPFILE,TPFIELD,KFIELD,KRESP)
 !
 #if 0
-USE MODD_IO,             ONLY: LPACK,L1D,L2D
+USE MODD_IO,             ONLY: LPACK, L2D
 USE MODD_PARAMETERS_ll,  ONLY: JPHEXT, JPVEXT
 #else
 USE MODD_PARAMETERS_ll,  ONLY: JPVEXT
@@ -934,53 +760,19 @@ TYPE(TFIELDDATA),      INTENT(IN) :: TPFIELD
 INTEGER, DIMENSION(:), INTENT(IN) :: KFIELD
 INTEGER,               INTENT(OUT):: KRESP
 !
-INTEGER(KIND=CDFINT)                            :: STATUS
-INTEGER(KIND=CDFINT)                            :: INCID
-CHARACTER(LEN=LEN(TPFIELD%CMNHNAME))            :: YVARNAME
-INTEGER(KIND=CDFINT)                            :: IVARID
-INTEGER(KIND=CDFINT), DIMENSION(:), ALLOCATABLE :: IVDIMS
-INTEGER                                         :: IRESP
-LOGICAL                                         :: GEXISTED !True if variable was already defined
+INTEGER(KIND=CDFINT) :: STATUS
+INTEGER(KIND=CDFINT) :: IVARID
 !
 CALL PRINT_MSG(NVERB_DEBUG,'IO','IO_Field_write_nc4_N1',TRIM(TPFILE%CNAME)//': writing '//TRIM(TPFIELD%CMNHNAME))
 !
-IRESP = 0
-! Get the Netcdf file ID
-INCID = TPFILE%NNCID
-!
-GEXISTED = .FALSE.
+KRESP = 0
 !
-CALL IO_Mnhname_clean(TPFIELD%CMNHNAME,YVARNAME)
-
-! The variable should not already exist but who knows ?
-STATUS = NF90_INQ_VARID(INCID, YVARNAME, IVARID)
-IF (STATUS /= NF90_NOERR) THEN
-   IF (SIZE(KFIELD)==0) THEN
-     CALL PRINT_MSG(NVERB_WARNING,'IO','IO_Field_write_nc4_N1','ignoring variable with a zero size ('//TRIM(YVARNAME)//')')
-     KRESP = 0
-     RETURN
-   END IF
-
-   ! Get the netcdf dimensions
-   CALL IO_Vdims_fill_nc4(TPFILE, TPFIELD, INT(SHAPE(KFIELD),KIND=CDFINT), IVDIMS)
-
-   ! Define the variable
-   STATUS = NF90_DEF_VAR(INCID, YVARNAME, MNHINT_NF90, IVDIMS, IVARID)
-   IF (status /= NF90_NOERR) CALL IO_Err_handle_nc4(status,'IO_Field_write_nc4_N1','NF90_DEF_VAR',trim(YVARNAME))
-ELSE
-   GEXISTED = .TRUE.
-   CALL PRINT_MSG(NVERB_WARNING,'IO','IO_Field_write_nc4_N1',TRIM(TPFILE%CNAME)//': '//TRIM(YVARNAME)//' already defined')
-END IF
+call IO_Field_create_nc4( tpfile, tpfield, kshape = Shape( kfield ), kvarid = ivarid )
 
-! Write metadata
-CALL IO_Field_attr_write_nc4(TPFILE,TPFIELD,IVARID,GEXISTED)
 ! Write the data
-STATUS = NF90_PUT_VAR(INCID, IVARID, KFIELD)
-IF (status /= NF90_NOERR) CALL IO_Err_handle_nc4(status,'IO_Field_write_nc4_N1','NF90_PUT_VAR',trim(YVARNAME),IRESP)
-
-IF(ALLOCATED(IVDIMS)) DEALLOCATE(IVDIMS)
+STATUS = NF90_PUT_VAR(TPFILE%NNCID, IVARID, KFIELD)
+IF (status /= NF90_NOERR) CALL IO_Err_handle_nc4(status,'IO_Field_write_nc4_N1','NF90_PUT_VAR',trim(TPFIELD%CMNHNAME),KRESP)
 
-KRESP = IRESP
 END SUBROUTINE IO_Field_write_nc4_N1
 
 
@@ -991,61 +783,22 @@ TYPE(TFIELDDATA),      INTENT(IN) :: TPFIELD
 INTEGER,DIMENSION(:,:),INTENT(IN) :: KFIELD   ! array containing the data field
 INTEGER,               INTENT(OUT):: KRESP
 !
-INTEGER(KIND=CDFINT)                            :: STATUS
-INTEGER(KIND=CDFINT)                            :: INCID
-CHARACTER(LEN=LEN(TPFIELD%CMNHNAME))            :: YVARNAME
-INTEGER(KIND=CDFINT)                            :: IVARID
-INTEGER(KIND=CDFINT), DIMENSION(:), ALLOCATABLE :: IVDIMS
-INTEGER                                         :: IRESP
-LOGICAL                                         :: GEXISTED !True if variable was already defined
-!
-IRESP = 0
+INTEGER(KIND=CDFINT) :: STATUS
+INTEGER(KIND=CDFINT) :: IVARID
 !
 CALL PRINT_MSG(NVERB_DEBUG,'IO','IO_Field_write_nc4_N2',TRIM(TPFILE%CNAME)//': writing '//TRIM(TPFIELD%CMNHNAME))
 !
-! Get the Netcdf file ID
-INCID = TPFILE%NNCID
+KRESP = 0
 !
-GEXISTED = .FALSE.
-!
-CALL IO_Mnhname_clean(TPFIELD%CMNHNAME,YVARNAME)
-
-! The variable should not already exist but who knows ?
-STATUS = NF90_INQ_VARID(INCID, YVARNAME, IVARID)
-IF (STATUS /= NF90_NOERR) THEN
-   IF (SIZE(KFIELD)==0) THEN
-     CALL PRINT_MSG(NVERB_WARNING,'IO','IO_Field_write_nc4_N2','ignoring variable with a zero size ('//TRIM(YVARNAME)//')')
-     KRESP = 0
-     RETURN
-   END IF
+call IO_Field_create_nc4( tpfile, tpfield, kshape = Shape( kfield ), kvarid = ivarid )
 
-   ! Get the netcdf dimensions
-   CALL IO_Vdims_fill_nc4(TPFILE, TPFIELD, INT(SHAPE(KFIELD),KIND=CDFINT), IVDIMS)
-
-   ! Define the variable
-   STATUS = NF90_DEF_VAR(INCID, YVARNAME, MNHINT_NF90, IVDIMS, IVARID)
-   IF (status /= NF90_NOERR) CALL IO_Err_handle_nc4(status,'IO_Field_write_nc4_N2','NF90_DEF_VAR',trim(YVARNAME))
-   ! Add compression if asked for
-   IF (TPFILE%LNCCOMPRESS) THEN
-     STATUS = NF90_DEF_VAR_DEFLATE(INCID, IVARID, SHUFFLE, DEFLATE, TPFILE%NNCCOMPRESS_LEVEL)
-     IF (STATUS /= NF90_NOERR) CALL IO_Err_handle_nc4(status,'IO_Field_write_nc4_N2','NF90_DEF_VAR_DEFLATE',trim(YVARNAME))
-   END IF
-ELSE
-   GEXISTED = .TRUE.
-   CALL PRINT_MSG(NVERB_WARNING,'IO','IO_Field_write_nc4_N2',TRIM(TPFILE%CNAME)//': '//TRIM(YVARNAME)//' already defined')
-END IF
-
-! Write metadata
-CALL IO_Field_attr_write_nc4(TPFILE,TPFIELD,IVARID,GEXISTED,KSHAPE=INT(SHAPE(KFIELD),KIND=CDFINT))
 ! Write the data
-STATUS = NF90_PUT_VAR(INCID, IVARID, KFIELD)
-IF (status /= NF90_NOERR) CALL IO_Err_handle_nc4(status,'IO_Field_write_nc4_N2','NF90_PUT_VAR',trim(YVARNAME),IRESP)
+STATUS = NF90_PUT_VAR(TPFILE%NNCID, IVARID, KFIELD)
+IF (status /= NF90_NOERR) CALL IO_Err_handle_nc4(status,'IO_Field_write_nc4_N2','NF90_PUT_VAR',trim(TPFIELD%CMNHNAME),KRESP)
 
-IF(ALLOCATED(IVDIMS)) DEALLOCATE(IVDIMS)
-
-KRESP = IRESP
 END SUBROUTINE IO_Field_write_nc4_N2
 
+
 SUBROUTINE IO_Field_write_nc4_N3(TPFILE,TPFIELD,KFIELD,KRESP)
 !
 TYPE(TFILEDATA),TARGET,  INTENT(IN) :: TPFILE
@@ -1053,110 +806,38 @@ TYPE(TFIELDDATA),        INTENT(IN) :: TPFIELD
 INTEGER,DIMENSION(:,:,:),INTENT(IN) :: KFIELD   ! array containing the data field
 INTEGER,                 INTENT(OUT):: KRESP
 !
-INTEGER(KIND=CDFINT)                            :: STATUS
-INTEGER(KIND=CDFINT)                            :: INCID
-CHARACTER(LEN=LEN(TPFIELD%CMNHNAME))            :: YVARNAME
-INTEGER(KIND=CDFINT)                            :: IVARID
-INTEGER(KIND=CDFINT), DIMENSION(:), ALLOCATABLE :: IVDIMS
-INTEGER                                         :: IRESP
-LOGICAL                                         :: GEXISTED !True if variable was already defined
-!
-IRESP = 0
+INTEGER(KIND=CDFINT) :: STATUS
+INTEGER(KIND=CDFINT) :: IVARID
 !
 CALL PRINT_MSG(NVERB_DEBUG,'IO','IO_Field_write_nc4_N3',TRIM(TPFILE%CNAME)//': writing '//TRIM(TPFIELD%CMNHNAME))
 !
-! Get the Netcdf file ID
-INCID = TPFILE%NNCID
+KRESP = 0
 !
-GEXISTED = .FALSE.
-!
-CALL IO_Mnhname_clean(TPFIELD%CMNHNAME,YVARNAME)
+call IO_Field_create_nc4( tpfile, tpfield, kshape = Shape( kfield ), kvarid = ivarid )
 
-! The variable should not already exist but who knows ?
-STATUS = NF90_INQ_VARID(INCID, YVARNAME, IVARID)
-IF (STATUS /= NF90_NOERR) THEN
-   IF (SIZE(KFIELD)==0) THEN
-     CALL PRINT_MSG(NVERB_WARNING,'IO','IO_Field_write_nc4_N3','ignoring variable with a zero size ('//TRIM(YVARNAME)//')')
-     KRESP = 0
-     RETURN
-   END IF
-
-   ! Get the netcdf dimensions
-   CALL IO_Vdims_fill_nc4(TPFILE, TPFIELD, INT(SHAPE(KFIELD),KIND=CDFINT), IVDIMS)
-
-   ! Define the variable
-   STATUS = NF90_DEF_VAR(INCID, YVARNAME, MNHINT_NF90, IVDIMS, IVARID)
-   IF (status /= NF90_NOERR) CALL IO_Err_handle_nc4(status,'IO_Field_write_nc4_N3','NF90_DEF_VAR',trim(YVARNAME))
-   ! Add compression if asked for
-   IF (TPFILE%LNCCOMPRESS) THEN
-     STATUS = NF90_DEF_VAR_DEFLATE(INCID, IVARID, SHUFFLE, DEFLATE, TPFILE%NNCCOMPRESS_LEVEL)
-     IF (STATUS /= NF90_NOERR) CALL IO_Err_handle_nc4(status,'IO_Field_write_nc4_N3','NF90_DEF_VAR_DEFLATE',trim(YVARNAME))
-   END IF
-ELSE
-   GEXISTED = .TRUE.
-   CALL PRINT_MSG(NVERB_WARNING,'IO','IO_Field_write_nc4_N3',TRIM(TPFILE%CNAME)//': '//TRIM(YVARNAME)//' already defined')
-END IF
-
-! Write metadata
-CALL IO_Field_attr_write_nc4(TPFILE,TPFIELD,IVARID,GEXISTED,KSHAPE=INT(SHAPE(KFIELD),KIND=CDFINT))
 ! Write the data
-STATUS = NF90_PUT_VAR(INCID, IVARID, KFIELD)
-IF (status /= NF90_NOERR) CALL IO_Err_handle_nc4(status,'IO_Field_write_nc4_N3','NF90_PUT_VAR',trim(YVARNAME),IRESP)
+STATUS = NF90_PUT_VAR(TPFILE%NNCID, IVARID, KFIELD)
+IF (status /= NF90_NOERR) CALL IO_Err_handle_nc4(status,'IO_Field_write_nc4_N3','NF90_PUT_VAR',trim(TPFIELD%CMNHNAME),KRESP)
 
-IF(ALLOCATED(IVDIMS)) DEALLOCATE(IVDIMS)
-
-KRESP = IRESP
 END SUBROUTINE IO_Field_write_nc4_N3
 
+
 SUBROUTINE IO_Field_write_nc4_L0(TPFILE,TPFIELD,OFIELD,KRESP)
 !
-USE MODD_PARAMETERS_ll,  ONLY: JPVEXT
-!
 TYPE(TFILEDATA),       INTENT(IN) :: TPFILE
 TYPE(TFIELDDATA),      INTENT(IN) :: TPFIELD
 LOGICAL,               INTENT(IN) :: OFIELD
 INTEGER,               INTENT(OUT):: KRESP
 !
-INTEGER                                         :: IFIELD
-INTEGER(KIND=CDFINT)                            :: STATUS
-INTEGER(KIND=CDFINT)                            :: INCID
-CHARACTER(LEN=LEN(TPFIELD%CMNHNAME))            :: YVARNAME
-INTEGER(KIND=CDFINT)                            :: IVARID
-INTEGER(KIND=CDFINT), DIMENSION(:), ALLOCATABLE :: IVDIMS
-INTEGER                                         :: IRESP
-LOGICAL                                         :: GEXISTED !True if variable was already defined
+INTEGER              :: IFIELD
+INTEGER(KIND=CDFINT) :: STATUS
+INTEGER(KIND=CDFINT) :: IVARID
 !
 CALL PRINT_MSG(NVERB_DEBUG,'IO','IO_Field_write_nc4_L0',TRIM(TPFILE%CNAME)//': writing '//TRIM(TPFIELD%CMNHNAME))
 !
-IRESP = 0
-! Get the Netcdf file ID
-INCID = TPFILE%NNCID
-!
-GEXISTED = .FALSE.
+KRESP = 0
 !
-CALL IO_Mnhname_clean(TPFIELD%CMNHNAME,YVARNAME)
-!
-! The variable should not already exist but who knows ?
-STATUS = NF90_INQ_VARID(INCID, YVARNAME, IVARID)
-IF (STATUS /= NF90_NOERR) THEN
-   IF (TPFIELD%LTIMEDEP) THEN
-     ! Get the netcdf dimensions
-     CALL IO_Vdims_fill_nc4(TPFILE, TPFIELD, INT(SHAPE(OFIELD),KIND=CDFINT), IVDIMS)
-     ! Define the variable
-     ! Use of NF90_INT1 datatype (=NF90_BYTE) that is enough to store a boolean
-     STATUS = NF90_DEF_VAR(INCID, YVARNAME, NF90_INT1, IVDIMS, IVARID)
-     IF (status /= NF90_NOERR) CALL IO_Err_handle_nc4(status,'IO_Field_write_nc4_L0','NF90_DEF_VAR',trim(YVARNAME))
-     DEALLOCATE(IVDIMS)
-   ELSE
-     ! Define the scalar variable
-     ! Use of NF90_INT1 datatype (=NF90_BYTE) that is enough to store a boolean
-     STATUS = NF90_DEF_VAR(INCID, YVARNAME, NF90_INT1, IVARID)
-     IF (status /= NF90_NOERR) CALL IO_Err_handle_nc4(status,'IO_Field_write_nc4_L0','NF90_DEF_VAR',trim(YVARNAME))
-   END IF
-ELSE
-   GEXISTED = .TRUE.
-   CALL PRINT_MSG(NVERB_WARNING,'IO','IO_Field_write_nc4_L0',TRIM(TPFILE%CNAME)//': '//TRIM(YVARNAME)//' already defined')
-END IF
+call IO_Field_create_nc4( tpfile, tpfield, kvarid = ivarid )
 
 !Convert LOGICAL to INTEGER (LOGICAL format not supported by netCDF files)
 IF (OFIELD) THEN
@@ -1165,63 +846,29 @@ ELSE
   IFIELD = 0
 END IF
 
-! Write metadata
-CALL IO_Field_attr_write_nc4(TPFILE,TPFIELD,IVARID,GEXISTED)
 ! Write the data
-STATUS = NF90_PUT_VAR(INCID, IVARID, IFIELD)
-IF (status /= NF90_NOERR) CALL IO_Err_handle_nc4(status,'IO_Field_write_nc4_L0','NF90_PUT_VAR',trim(YVARNAME),IRESP)
+STATUS = NF90_PUT_VAR(TPFILE%NNCID, IVARID, IFIELD)
+IF (status /= NF90_NOERR) CALL IO_Err_handle_nc4(status,'IO_Field_write_nc4_L0','NF90_PUT_VAR',trim(TPFIELD%CMNHNAME),KRESP)
 
-KRESP = IRESP
 END SUBROUTINE IO_Field_write_nc4_L0
 
+
 SUBROUTINE IO_Field_write_nc4_L1(TPFILE,TPFIELD,OFIELD,KRESP)
 !
-USE MODD_PARAMETERS_ll,  ONLY: JPVEXT
-!
 TYPE(TFILEDATA),       INTENT(IN) :: TPFILE
 TYPE(TFIELDDATA),      INTENT(IN) :: TPFIELD
 LOGICAL, DIMENSION(:), INTENT(IN) :: OFIELD
 INTEGER,               INTENT(OUT):: KRESP
 !
-INTEGER, DIMENSION(SIZE(OFIELD))                :: IFIELD
-INTEGER(KIND=CDFINT)                            :: STATUS
-INTEGER(KIND=CDFINT)                            :: INCID
-CHARACTER(LEN=LEN(TPFIELD%CMNHNAME))            :: YVARNAME
-INTEGER(KIND=CDFINT)                            :: IVARID
-INTEGER(KIND=CDFINT), DIMENSION(:), ALLOCATABLE :: IVDIMS
-INTEGER                                         :: IRESP
-LOGICAL                                         :: GEXISTED !True if variable was already defined
+INTEGER, DIMENSION(SIZE(OFIELD)) :: IFIELD
+INTEGER(KIND=CDFINT)             :: STATUS
+INTEGER(KIND=CDFINT)             :: IVARID
 !
 CALL PRINT_MSG(NVERB_DEBUG,'IO','IO_Field_write_nc4_L1',TRIM(TPFILE%CNAME)//': writing '//TRIM(TPFIELD%CMNHNAME))
 !
-IRESP = 0
-! Get the Netcdf file ID
-INCID = TPFILE%NNCID
+KRESP = 0
 !
-GEXISTED = .FALSE.
-!
-CALL IO_Mnhname_clean(TPFIELD%CMNHNAME,YVARNAME)
-
-! The variable should not already exist but who knows ?
-STATUS = NF90_INQ_VARID(INCID, YVARNAME, IVARID)
-IF (STATUS /= NF90_NOERR) THEN
-   IF (SIZE(OFIELD)==0) THEN
-     CALL PRINT_MSG(NVERB_WARNING,'IO','IO_Field_write_nc4_L1','ignoring variable with a zero size ('//TRIM(YVARNAME)//')')
-     KRESP = 0
-     RETURN
-   END IF
-
-   ! Get the netcdf dimensions
-   CALL IO_Vdims_fill_nc4(TPFILE, TPFIELD, INT(SHAPE(OFIELD),KIND=CDFINT), IVDIMS)
-
-   ! Define the variable
-   ! Use of NF90_INT1 datatype (=NF90_BYTE) that is enough to store a boolean
-   STATUS = NF90_DEF_VAR(INCID, YVARNAME, NF90_INT1, IVDIMS, IVARID)
-     IF (status /= NF90_NOERR) CALL IO_Err_handle_nc4(status,'IO_Field_write_nc4_L1','NF90_DEF_VAR',trim(YVARNAME))
-ELSE
-   GEXISTED = .TRUE.
-   CALL PRINT_MSG(NVERB_WARNING,'IO','IO_Field_write_nc4_L1',TRIM(TPFILE%CNAME)//': '//TRIM(YVARNAME)//' already defined')
-END IF
+call IO_Field_create_nc4( tpfile, tpfield, kshape = Shape( ofield ), kvarid = ivarid )
 
 !Convert LOGICAL to INTEGER (LOGICAL format not supported by netCDF files)
 WHERE (OFIELD)
@@ -1230,15 +877,10 @@ ELSEWHERE
   IFIELD = 0
 END WHERE
 
-! Write metadata
-CALL IO_Field_attr_write_nc4(TPFILE,TPFIELD,IVARID,GEXISTED)
 ! Write the data
-STATUS = NF90_PUT_VAR(INCID, IVARID, IFIELD)
-IF (status /= NF90_NOERR) CALL IO_Err_handle_nc4(status,'IO_Field_write_nc4_L1','NF90_PUT_VAR',trim(YVARNAME),IRESP)
+STATUS = NF90_PUT_VAR(TPFILE%NNCID, IVARID, IFIELD)
+IF (status /= NF90_NOERR) CALL IO_Err_handle_nc4(status,'IO_Field_write_nc4_L1','NF90_PUT_VAR',trim(TPFIELD%CMNHNAME),KRESP)
 
-IF(ALLOCATED(IVDIMS)) DEALLOCATE(IVDIMS)
-
-KRESP = IRESP
 END SUBROUTINE IO_Field_write_nc4_L1
 
 
@@ -1249,61 +891,35 @@ TYPE(TFIELDDATA),      INTENT(IN) :: TPFIELD
 CHARACTER(LEN=*),      INTENT(IN) :: HFIELD
 INTEGER,               INTENT(OUT):: KRESP
 !
-INTEGER(KIND=CDFINT)                 :: STATUS
-INTEGER(KIND=CDFINT)                 :: INCID
-CHARACTER(LEN=LEN(TPFIELD%CMNHNAME)) :: YVARNAME
-INTEGER(KIND=CDFINT)                 :: IVARID
-INTEGER(KIND=CDFINT), DIMENSION(1)   :: IVDIMS
-INTEGER                              :: IRESP, ILEN
-CHARACTER(LEN=:),ALLOCATABLE         :: YFIELD
-LOGICAL                              :: GEXISTED !True if variable was already defined
+INTEGER(KIND=CDFINT)          :: STATUS
+INTEGER(KIND=CDFINT)          :: IVARID
+INTEGER                       :: ILEN
+CHARACTER(LEN=:), ALLOCATABLE :: YFIELD
 !
 CALL PRINT_MSG(NVERB_DEBUG,'IO','IO_Field_write_nc4_C0',TRIM(TPFILE%CNAME)//': writing '//TRIM(TPFIELD%CMNHNAME))
 !
-IRESP = 0
+KRESP = 0
+
 !Store the character string in a string of a size multiple of NSTRINGCHUNKSIZE
 !This is done to limit the number of dimensions in the netCDF file
 ILEN = ((LEN_TRIM(HFIELD)+NSTRINGCHUNKSIZE-1)/NSTRINGCHUNKSIZE)*NSTRINGCHUNKSIZE
 !If the string is empty, create it anyway with a non-zero size (to prevent problems later)
 IF (ILEN==0) ILEN = NSTRINGCHUNKSIZE
 
-! Get the Netcdf file ID
-INCID = TPFILE%NNCID
-!
-GEXISTED = .FALSE.
-!
-CALL IO_Mnhname_clean(TPFIELD%CMNHNAME,YVARNAME)
-!
-IF (TPFIELD%LTIMEDEP) &
-  CALL PRINT_MSG(NVERB_WARNING,'IO','IO_Field_write_nc4_C0',TRIM(TPFILE%CNAME)// &
-                 ': time dependent variable not (yet) possible for 0D variable '//TRIM(TPFIELD%CMNHNAME))
-!
-! The variable should not already exist but who knows ?
-STATUS = NF90_INQ_VARID(INCID, YVARNAME, IVARID)
-IF (STATUS /= NF90_NOERR) THEN
-   ! Get the netcdf string dimensions id
-   IVDIMS(1) = IO_Strdimid_get_nc4(TPFILE,INT(ILEN,KIND=CDFINT))
-   ! Define the variable
-   STATUS = NF90_DEF_VAR(INCID, YVARNAME, NF90_CHAR, IVDIMS, IVARID)
-     IF (status /= NF90_NOERR) CALL IO_Err_handle_nc4(status,'IO_Field_write_nc4_C0','NF90_DEF_VAR',trim(YVARNAME))
-ELSE
-   GEXISTED = .TRUE.
-   CALL PRINT_MSG(NVERB_WARNING,'IO','IO_Field_write_nc4_C0',TRIM(TPFILE%CNAME)//': '//TRIM(YVARNAME)//' already defined')
-END IF
+!PW: si ndimlist populated, pas besoin de passer kshape...
+call IO_Field_create_nc4( tpfile, tpfield, kshape = [ ilen ], kvarid = ivarid )
 
 ALLOCATE(CHARACTER(LEN=ILEN)::YFIELD)
 YFIELD(1:LEN_TRIM(HFIELD))=TRIM(HFIELD)
 YFIELD(LEN_TRIM(HFIELD)+1:)=' '
-! Write metadata
-CALL IO_Field_attr_write_nc4(TPFILE,TPFIELD,IVARID,GEXISTED)
+
 ! Write the data
-STATUS = NF90_PUT_VAR(INCID, IVARID, YFIELD)
-IF (status /= NF90_NOERR) CALL IO_Err_handle_nc4(status,'IO_Field_write_nc4_C0','NF90_PUT_VAR',trim(YVARNAME),IRESP)
-DEALLOCATE(YFIELD)
+STATUS = NF90_PUT_VAR(TPFILE%NNCID, IVARID, YFIELD)
+IF (status /= NF90_NOERR) CALL IO_Err_handle_nc4(status,'IO_Field_write_nc4_C0','NF90_PUT_VAR',trim(TPFIELD%CMNHNAME),KRESP)
 
-KRESP = IRESP
 END SUBROUTINE IO_Field_write_nc4_C0
 
+
 SUBROUTINE IO_Field_write_nc4_C1(TPFILE,TPFIELD,HFIELD,KRESP)
 !  Modif
 !    J.Escobar : 25/04/2018 : missing 'IF ALLOCATED(IVDIMSTMP)' DEALLOCATE
@@ -1315,61 +931,23 @@ INTEGER,                      INTENT(OUT) :: KRESP
 !
 INTEGER(KIND=CDFINT),PARAMETER :: IONE = 1
 !
-INTEGER(KIND=CDFINT)                            :: STATUS
-INTEGER(KIND=CDFINT)                            :: INCID
-CHARACTER(LEN=LEN(TPFIELD%CMNHNAME))            :: YVARNAME
-INTEGER(KIND=CDFINT)                            :: IVARID
-INTEGER(KIND=CDFINT), DIMENSION(2)              :: IVDIMS
-INTEGER(KIND=CDFINT), DIMENSION(:), ALLOCATABLE :: IVDIMSTMP
-INTEGER(KIND=CDFINT)                            :: ILEN, ISIZE
-INTEGER                                         :: IRESP
-LOGICAL                                         :: GEXISTED !True if variable was already defined
+INTEGER(KIND=CDFINT) :: STATUS
+INTEGER(KIND=CDFINT) :: IVARID
+INTEGER(KIND=CDFINT) :: ILEN, ISIZE
 !
 CALL PRINT_MSG(NVERB_DEBUG,'IO','IO_Field_write_nc4_C1',TRIM(TPFILE%CNAME)//': writing '//TRIM(TPFIELD%CMNHNAME))
 !
-IRESP = 0
+KRESP = 0
 
 ILEN  = LEN(HFIELD)
 ISIZE = SIZE(HFIELD)
 
-! Get the Netcdf file ID
-INCID = TPFILE%NNCID
-!
-GEXISTED = .FALSE.
-!
-CALL IO_Mnhname_clean(TPFIELD%CMNHNAME,YVARNAME)
-!
-IF (TPFIELD%LTIMEDEP) THEN
-  !This is an error (+return) and not a warning because IVDIMSTMP could be of size 2 if LTIMEDEP=T
-  CALL PRINT_MSG(NVERB_ERROR,'IO','IO_Field_write_nc4_C1',TRIM(TPFILE%CNAME)// &
-                 ': time dependent variable not (yet) possible for '//TRIM(TPFIELD%CMNHNAME))
-  RETURN
-END IF
-!
-! The variable should not already exist but who knows ?
-STATUS = NF90_INQ_VARID(INCID, YVARNAME, IVARID)
-IF (STATUS /= NF90_NOERR) THEN
-   ! Get the netcdf string dimensions id
-   IVDIMS(1) = IO_Strdimid_get_nc4(TPFILE,ILEN)
-   CALL IO_Vdims_fill_nc4(TPFILE, TPFIELD, (/ISIZE/), IVDIMSTMP)
-   IVDIMS(2) = IVDIMSTMP(1)
-   ! Define the variable
-   STATUS = NF90_DEF_VAR(INCID, YVARNAME, NF90_CHAR, IVDIMS, IVARID)
-     IF (status /= NF90_NOERR) CALL IO_Err_handle_nc4(status,'IO_Field_write_nc4_C1','NF90_DEF_VAR',trim(YVARNAME))
-ELSE
-   GEXISTED = .TRUE.
-   CALL PRINT_MSG(NVERB_WARNING,'IO','IO_Field_write_nc4_C1',TRIM(TPFILE%CNAME)//': '//TRIM(YVARNAME)//' already defined')
-END IF
+call IO_Field_create_nc4( tpfile, tpfield, kshape = [ ilen, isize ], kvarid = ivarid )
 
-! Write metadata
-CALL IO_Field_attr_write_nc4(TPFILE,TPFIELD,IVARID,GEXISTED)
 ! Write the data
-STATUS = NF90_PUT_VAR(INCID, IVARID, HFIELD(1:ISIZE)(1:ILEN), START=(/IONE,IONE/), COUNT=(/ILEN,ISIZE/))
-IF (status /= NF90_NOERR) CALL IO_Err_handle_nc4(status,'IO_Field_write_nc4_C1','NF90_PUT_VAR',trim(YVARNAME),IRESP)
-
-IF(ALLOCATED(IVDIMSTMP)) DEALLOCATE(IVDIMSTMP)
+STATUS = NF90_PUT_VAR(TPFILE%NNCID, IVARID, HFIELD(1:ISIZE)(1:ILEN), START=(/IONE,IONE/), COUNT=(/ILEN,ISIZE/))
+IF (status /= NF90_NOERR) CALL IO_Err_handle_nc4(status,'IO_Field_write_nc4_C1','NF90_PUT_VAR',trim(TPFIELD%CMNHNAME),KRESP)
 
-KRESP = IRESP
 END SUBROUTINE IO_Field_write_nc4_C1
 
 
@@ -1385,33 +963,19 @@ TYPE(TFIELDDATA),      INTENT(IN) :: TPFIELD
 TYPE (DATE_TIME),      INTENT(IN) :: TPDATA
 INTEGER,               INTENT(OUT):: KRESP
 !
-INTEGER(KIND=CDFINT)                 :: STATUS
-INTEGER(KIND=CDFINT)                 :: INCID
-CHARACTER(LEN=LEN(TPFIELD%CMNHNAME)) :: YVARNAME
-INTEGER(KIND=CDFINT)                 :: IVARID
-INTEGER(KIND=CDFINT), DIMENSION(:), ALLOCATABLE :: IVDIMS
-INTEGER                              :: IRESP
-TYPE(TFIELDDATA)                     :: TZFIELD
-CHARACTER(LEN=40)                    :: YUNITS
-LOGICAL                              :: GEXISTED !True if variable was already defined
-REAL                                 :: ZDELTATIME !Distance in seconds since reference date and time
-TYPE(DATE_TIME)                      :: TZREF
+INTEGER(KIND=CDFINT) :: STATUS
+INTEGER(KIND=CDFINT) :: IVARID
+TYPE(TFIELDDATA)     :: TZFIELD
+CHARACTER(LEN=40)    :: YUNITS
+REAL                 :: ZDELTATIME !Distance in seconds since reference date and time
+TYPE(DATE_TIME)      :: TZREF
 !
 CALL PRINT_MSG(NVERB_DEBUG,'IO','IO_Field_write_nc4_T0',TRIM(TPFILE%CNAME)//': writing '//TRIM(TPFIELD%CMNHNAME))
 !
-IRESP = 0
+KRESP = 0
 !
 TZFIELD = TPFIELD
 !
-! Get the Netcdf file ID
-INCID = TPFILE%NNCID
-!
-GEXISTED = .FALSE.
-!
-CALL IO_Mnhname_clean(TPFIELD%CMNHNAME,YVARNAME)
-!
-TZFIELD%CMNHNAME = TRIM(YVARNAME)
-!
 ! Model beginning date (TDTMOD%TDATE) is used as the reference date
 ! Reference time is set to 0.
 IF (.NOT.ASSOCIATED(TDTMOD)) THEN
@@ -1429,35 +993,14 @@ WRITE(YUNITS,'( "seconds since ",I4.4,"-",I2.2,"-",I2.2," 00:00:00 +0:00" )') &
       TZREF%TDATE%YEAR, TZREF%TDATE%MONTH, TZREF%TDATE%DAY
 TZFIELD%CUNITS = TRIM(YUNITS)
 !
-IF (TPFIELD%LTIMEDEP) &
-  CALL PRINT_MSG(NVERB_WARNING,'IO','IO_Field_write_nc4_T0',TRIM(TPFILE%CNAME)// &
-                 ': time dependent variable not (yet) possible for 0D variable '//TRIM(TPFIELD%CMNHNAME))
-!
-! The variable should not already exist but who knows ?
-STATUS = NF90_INQ_VARID(INCID, YVARNAME, IVARID)
-IF (STATUS /= NF90_NOERR) THEN
-   ! Define the scalar variable
-   STATUS = NF90_DEF_VAR(INCID, YVARNAME, MNHREAL_NF90, IVARID)
-   IF (status /= NF90_NOERR) CALL IO_Err_handle_nc4(status,'IO_Field_write_nc4_T0','NF90_DEF_VAR',trim(YVARNAME))
-ELSE
-   GEXISTED = .TRUE.
-   CALL PRINT_MSG(NVERB_WARNING,'IO','IO_Field_write_nc4_T0',TRIM(TPFILE%CNAME)//': '//TRIM(YVARNAME)//' already defined')
-END IF
-
-! Write metadata
-CALL IO_Field_attr_write_nc4(TPFILE,TZFIELD,IVARID,GEXISTED,HCALENDAR='standard')
+call IO_Field_create_nc4( tpfile, tzfield, kvarid = ivarid, hcalendar = 'standard' )
 !
 ! Compute the temporal distance from reference
 CALL DATETIME_DISTANCE(TZREF,TPDATA,ZDELTATIME)
 
 ! Write the data
-STATUS = NF90_PUT_VAR(INCID, IVARID, ZDELTATIME)
-IF (status /= NF90_NOERR) CALL IO_Err_handle_nc4(status,'IO_Field_write_nc4_T0','NF90_PUT_VAR',trim(YVARNAME),IRESP)
-
-IF (IRESP/=0) THEN
-  KRESP = IRESP
-  RETURN
-END IF
+STATUS = NF90_PUT_VAR(TPFILE%NNCID, IVARID, ZDELTATIME)
+IF (status /= NF90_NOERR) CALL IO_Err_handle_nc4(status,'IO_Field_write_nc4_T0','NF90_PUT_VAR',trim(TPFIELD%CMNHNAME),KRESP)
 
 #if 0
 !This part is to keep backward compatibility with MesoNH files
@@ -1517,9 +1060,9 @@ STATUS = NF90_PUT_VAR(INCID, IVARID, TPDATA%TIME)
 IF (status /= NF90_NOERR) CALL IO_Err_handle_nc4(status,'IO_Field_write_nc4_T0','NF90_PUT_VAR',trim(TZFIELD%CMNHNAME),IRESP)
 #endif
 
-KRESP = IRESP
 END SUBROUTINE IO_Field_write_nc4_T0
 
+
 SUBROUTINE IO_Field_write_nc4_T1(TPFILE,TPFIELD,TPDATA,KRESP)
 !
 USE MODD_TIME_n,     ONLY: TDTMOD
@@ -1532,34 +1075,20 @@ TYPE(TFIELDDATA),               INTENT(IN) :: TPFIELD
 TYPE (DATE_TIME), DIMENSION(:), INTENT(IN) :: TPDATA
 INTEGER,                        INTENT(OUT):: KRESP
 !
-INTEGER                              :: JI
-INTEGER(KIND=CDFINT)                 :: STATUS
-INTEGER(KIND=CDFINT)                 :: INCID
-CHARACTER(LEN=LEN(TPFIELD%CMNHNAME)) :: YVARNAME
-INTEGER(KIND=CDFINT)                 :: IVARID
-INTEGER(KIND=CDFINT), DIMENSION(:), ALLOCATABLE :: IVDIMS
-INTEGER                              :: IRESP
-TYPE(TFIELDDATA)                     :: TZFIELD
-CHARACTER(LEN=40)                    :: YUNITS
-LOGICAL                              :: GEXISTED !True if variable was already defined
-REAL, DIMENSION(:), ALLOCATABLE      :: ZDELTATIME !Distance in seconds since reference date and time
-TYPE(DATE_TIME)                      :: TZREF
+CHARACTER(LEN=40)               :: YUNITS
+INTEGER                         :: JI
+INTEGER(KIND=CDFINT)            :: STATUS
+INTEGER(KIND=CDFINT)            :: IVARID
+REAL, DIMENSION(:), ALLOCATABLE :: ZDELTATIME !Distance in seconds since reference date and time
+TYPE(DATE_TIME)                 :: TZREF
+TYPE(TFIELDDATA)                :: TZFIELD
 !
 CALL PRINT_MSG(NVERB_DEBUG,'IO','IO_Field_write_nc4_T1',TRIM(TPFILE%CNAME)//': writing '//TRIM(TPFIELD%CMNHNAME))
 !
-IRESP = 0
+KRESP = 0
 !
 TZFIELD = TPFIELD
 !
-! Get the Netcdf file ID
-INCID = TPFILE%NNCID
-!
-GEXISTED = .FALSE.
-!
-CALL IO_Mnhname_clean(TPFIELD%CMNHNAME,YVARNAME)
-!
-TZFIELD%CMNHNAME = TRIM(YVARNAME)
-!
 ! Model beginning date (TDTMOD%TDATE) is used as the reference date
 ! Reference time is set to 0.
 IF (.NOT.ASSOCIATED(TDTMOD)) THEN
@@ -1577,32 +1106,7 @@ WRITE(YUNITS,'( "seconds since ",I4.4,"-",I2.2,"-",I2.2," 00:00:00 +0:00" )') &
       TZREF%TDATE%YEAR, TZREF%TDATE%MONTH, TZREF%TDATE%DAY
 TZFIELD%CUNITS = TRIM(YUNITS)
 !
-IF (TPFIELD%LTIMEDEP) &
-  CALL PRINT_MSG(NVERB_WARNING,'IO','IO_Field_write_nc4_T1',TRIM(TPFILE%CNAME)// &
-                 ': time dependent variable not (yet) possible for 1D variable '//TRIM(TPFIELD%CMNHNAME))
-!
-! The variable should not already exist but who knows ?
-STATUS = NF90_INQ_VARID(INCID, YVARNAME, IVARID)
-IF (STATUS /= NF90_NOERR) THEN
-   IF (SIZE(TPDATA)==0) THEN
-     CALL PRINT_MSG(NVERB_WARNING,'IO','IO_Field_write_nc4_T1','ignoring variable with a zero size ('//TRIM(YVARNAME)//')')
-     KRESP = 0
-     RETURN
-   END IF
-
-   ! Get the netcdf dimensions
-   CALL IO_Vdims_fill_nc4(TPFILE, TPFIELD, INT(SHAPE(TPDATA),KIND=CDFINT), IVDIMS)
-
-   ! Define the variable
-   STATUS = NF90_DEF_VAR(INCID, YVARNAME, MNHREAL_NF90, IVDIMS, IVARID)
-   IF (status /= NF90_NOERR) CALL IO_Err_handle_nc4(status,'IO_Field_write_nc4_T1','NF90_DEF_VAR',trim(YVARNAME))
-ELSE
-   GEXISTED = .TRUE.
-   CALL PRINT_MSG(NVERB_WARNING,'IO','IO_Field_write_nc4_N1',TRIM(TPFILE%CNAME)//': '//TRIM(YVARNAME)//' already defined')
-END IF
-
-! Write metadata
-CALL IO_Field_attr_write_nc4(TPFILE,TZFIELD,IVARID,GEXISTED,HCALENDAR='standard')
+call IO_Field_create_nc4( tpfile, tzfield, kshape = Shape( tpdata), kvarid = ivarid, hcalendar = 'standard' )
 !
 ! Compute the temporal distances from reference
 ALLOCATE( ZDELTATIME( SIZE( TPDATA ) ) )
@@ -1612,18 +1116,9 @@ DO JI = 1, SIZE( TPDATA )
 END DO
 
 ! Write the data
-STATUS = NF90_PUT_VAR( INCID, IVARID, ZDELTATIME(:) )
-IF (status /= NF90_NOERR) CALL IO_Err_handle_nc4(status,'IO_Field_write_nc4_T1','NF90_PUT_VAR',trim(YVARNAME),IRESP)
-
-IF( ALLOCATED( IVDIMS ) ) DEALLOCATE( IVDIMS )
-DEALLOCATE( ZDELTATIME )
-
-IF (IRESP/=0) THEN
-  KRESP = IRESP
-  RETURN
-END IF
+STATUS = NF90_PUT_VAR( TPFILE%NNCID, IVARID, ZDELTATIME(:) )
+IF (status /= NF90_NOERR) CALL IO_Err_handle_nc4(status,'IO_Field_write_nc4_T1','NF90_PUT_VAR',trim(TPFIELD%CMNHNAME),KRESP)
 
-KRESP = IRESP
 END SUBROUTINE IO_Field_write_nc4_T1
 
 SUBROUTINE IO_Coordvar_write_nc4(TPFILE,HPROGRAM_ORIG)