diff --git a/src/LIB/SURCOUCHE/src/mode_io_write_nc4.f90 b/src/LIB/SURCOUCHE/src/mode_io_write_nc4.f90
index f711eae6faed7ab48fbd327ef5b3820f74abd908..49fc4d7adc88f44fa4a062d6b8074d6468c9306f 100644
--- a/src/LIB/SURCOUCHE/src/mode_io_write_nc4.f90
+++ b/src/LIB/SURCOUCHE/src/mode_io_write_nc4.f90
@@ -25,6 +25,8 @@
 !  P. Wautelet 26/11/2020: add IO_Field_create_nc4 subroutine + use it for all IO_Field_write_nc4_*
 !  P. Wautelet 04/12/2020: add IO_Field_partial_write_nc4 subroutines
 !  P. Wautelet 11/01/2021: add coordinates for dimension variables in diachronic files
+!  P. Wautelet 14/01/2021: add IO_Field_write_nc4_N4, IO_Field_partial_write_nc4_N2,
+!                          IO_Field_partial_write_nc4_N3 and IO_Field_partial_write_nc4_N4 subroutines
 !-----------------------------------------------------------------
 #ifdef MNH_IOCDF4
 module mode_io_write_nc4
@@ -56,6 +58,7 @@ INTERFACE IO_Field_write_nc4
                     IO_Field_write_nc4_X6,                       &
                     IO_Field_write_nc4_N0,IO_Field_write_nc4_N1, &
                     IO_Field_write_nc4_N2,IO_Field_write_nc4_N3, &
+                    IO_Field_write_nc4_N4,                       &
                     IO_Field_write_nc4_L0,IO_Field_write_nc4_L1, &
                     IO_Field_write_nc4_C0,IO_Field_write_nc4_C1, &
                     IO_Field_write_nc4_T0,IO_Field_write_nc4_T1
@@ -63,7 +66,9 @@ END INTERFACE IO_Field_write_nc4
 
 interface IO_Field_partial_write_nc4
    module procedure IO_Field_partial_write_nc4_X1, IO_Field_partial_write_nc4_X2, &
-                    IO_Field_partial_write_nc4_X3, IO_Field_partial_write_nc4_X4
+                    IO_Field_partial_write_nc4_X3, IO_Field_partial_write_nc4_X4, &
+                    IO_Field_partial_write_nc4_N2, IO_Field_partial_write_nc4_N3, &
+                    IO_Field_partial_write_nc4_N4
 end interface IO_Field_partial_write_nc4
 
 integer,parameter :: NSTRINGCHUNKSIZE = 16 !Dimension of the chunks of strings
@@ -816,6 +821,29 @@ IF (istatus /= NF90_NOERR) CALL IO_Err_handle_nc4(istatus,'IO_Field_write_nc4_N3
 END SUBROUTINE IO_Field_write_nc4_N3
 
 
+SUBROUTINE IO_Field_write_nc4_N4(TPFILE,TPFIELD,KFIELD,KRESP)
+!
+TYPE(TFILEDATA),TARGET,    INTENT(IN) :: TPFILE
+TYPE(TFIELDDATA),          INTENT(IN) :: TPFIELD
+INTEGER,DIMENSION(:,:,:,:),INTENT(IN) :: KFIELD   ! array containing the data field
+INTEGER,                   INTENT(OUT):: KRESP
+!
+INTEGER(KIND=CDFINT) :: istatus
+INTEGER(KIND=CDFINT) :: IVARID
+!
+CALL PRINT_MSG(NVERB_DEBUG,'IO','IO_Field_write_nc4_N4',TRIM(TPFILE%CNAME)//': writing '//TRIM(TPFIELD%CMNHNAME))
+!
+KRESP = 0
+!
+call IO_Field_create_nc4( tpfile, tpfield, kshape = Shape( kfield ), kvarid = ivarid )
+
+! Write the data
+istatus = NF90_PUT_VAR(TPFILE%NNCID, IVARID, KFIELD)
+IF (istatus /= NF90_NOERR) CALL IO_Err_handle_nc4(istatus,'IO_Field_write_nc4_N4','NF90_PUT_VAR',trim(TPFIELD%CMNHNAME),KRESP)
+
+END SUBROUTINE IO_Field_write_nc4_N4
+
+
 SUBROUTINE IO_Field_write_nc4_L0(TPFILE,TPFIELD,OFIELD,KRESP)
 !
 TYPE(TFILEDATA),       INTENT(IN) :: TPFILE
@@ -1215,6 +1243,144 @@ end if
 end subroutine IO_Field_partial_write_nc4_X4
 
 
+subroutine IO_Field_partial_write_nc4_N2( tpfile, tpfield, kfield, koffset, kresp, kvertlevel, kzfile )
+
+type(tfiledata),                  intent(in)  :: tpfile
+type(tfielddata),                 intent(in)  :: tpfield
+integer,          dimension(:,:), intent(in)  :: kfield   ! array containing the data field
+integer,          dimension(2),   intent(in)  :: koffset
+integer,                          intent(out) :: kresp
+integer,                optional, intent(in)  :: kvertlevel ! Number of the vertical level (needed for Z-level split files)
+integer,                optional, intent(in)  :: kzfile     ! Number of the Z-level split file
+
+character(len=4)                   :: ysuffix
+character(len=NMNHNAMELGTMAX)      :: yvarname
+integer(kind=CDFINT)               :: istatus
+integer(kind=CDFINT)               :: ivarid
+integer(kind=CDFINT), dimension(2) :: istarts
+type(tfielddata),     pointer      :: tzfield
+type(tfiledata),      pointer      :: tzfile
+
+kresp = 0
+
+call IO_Select_split_file( tpfile, tpfield, tzfile, tzfield, kvertlevel, kzfile )
+
+call Print_msg( NVERB_DEBUG, 'IO', 'IO_Field_partial_write_nc4_N2',&
+                Trim( tzfile%cname ) // ': writing ' // Trim( tzfield%cmnhname ) )
+
+call IO_Mnhname_clean( tzfield%cmnhname, yvarname )
+
+istatus = NF90_INQ_VARID( tzfile%nncid, yvarname, ivarid )
+if ( istatus /= NF90_NOERR ) then
+  call Print_msg( NVERB_FATAL, 'IO', 'IO_Field_partial_write_nc4_N2', 'variable ' // Trim( yvarname ) &
+                  // ' not yet created (IO_Field_create not yet called?)' )
+end if
+
+! Write the data
+if ( Size( kfield ) > 0 ) then
+  istarts(:) = koffset(:) + 1
+  istatus = NF90_PUT_VAR( tzfile%nncid, ivarid, kfield(:,:), start = istarts(:), count = Shape( kfield ) )
+  if (istatus /= NF90_NOERR) &
+    call IO_Err_handle_nc4( istatus, 'IO_Field_partial_write_nc4_N2', 'NF90_PUT_VAR', Trim( tzfield%cmnhname ), kresp )
+end if
+
+if ( Present( kvertlevel ) ) deallocate( tzfield )
+
+end subroutine IO_Field_partial_write_nc4_N2
+
+
+subroutine IO_Field_partial_write_nc4_N3( tpfile, tpfield, kfield, koffset, kresp, kvertlevel, kzfile )
+
+type(tfiledata),                    intent(in)  :: tpfile
+type(tfielddata),                   intent(in)  :: tpfield
+integer,          dimension(:,:,:), intent(in)  :: kfield   ! array containing the data field
+integer,          dimension(3),     intent(in)  :: koffset
+integer,                            intent(out) :: kresp
+integer,                  optional, intent(in)  :: kvertlevel ! Number of the vertical level (needed for Z-level split files)
+integer,                  optional, intent(in)  :: kzfile     ! Number of the Z-level split file
+
+character(len=4)                   :: ysuffix
+character(len=NMNHNAMELGTMAX)      :: yvarname
+integer(kind=CDFINT)               :: istatus
+integer(kind=CDFINT)               :: ivarid
+integer(kind=CDFINT), dimension(3) :: istarts
+type(tfielddata),     pointer      :: tzfield
+type(tfiledata),      pointer      :: tzfile
+
+kresp = 0
+
+call IO_Select_split_file( tpfile, tpfield, tzfile, tzfield, kvertlevel, kzfile )
+
+call Print_msg( NVERB_DEBUG, 'IO', 'IO_Field_partial_write_nc4_N3',&
+                Trim( tzfile%cname ) // ': writing ' // Trim( tzfield%cmnhname ) )
+
+call IO_Mnhname_clean( tzfield%cmnhname, yvarname )
+
+istatus = NF90_INQ_VARID( tzfile%nncid, yvarname, ivarid )
+if ( istatus /= NF90_NOERR ) then
+  call Print_msg( NVERB_FATAL, 'IO', 'IO_Field_partial_write_nc4_N3', 'variable ' // Trim( yvarname ) &
+                  // ' not yet created (IO_Field_create not yet called?)' )
+end if
+
+! Write the data
+if ( Size( kfield ) > 0 ) then
+  istarts(:) = koffset(:) + 1
+  istatus = NF90_PUT_VAR( tzfile%nncid, ivarid, kfield(:,:,:), start = istarts(:), count = Shape( kfield ) )
+  if (istatus /= NF90_NOERR) &
+    call IO_Err_handle_nc4( istatus, 'IO_Field_partial_write_nc4_N3', 'NF90_PUT_VAR', Trim( tzfield%cmnhname ), kresp )
+end if
+
+if ( Present( kvertlevel ) ) deallocate( tzfield )
+
+end subroutine IO_Field_partial_write_nc4_N3
+
+
+subroutine IO_Field_partial_write_nc4_N4( tpfile, tpfield, kfield, koffset, kresp, kvertlevel, kzfile )
+
+type(tfiledata),                      intent(in)  :: tpfile
+type(tfielddata),                     intent(in)  :: tpfield
+integer,          dimension(:,:,:,:), intent(in)  :: kfield   ! array containing the data field
+integer,          dimension(4),       intent(in)  :: koffset
+integer,                              intent(out) :: kresp
+integer,                    optional, intent(in)  :: kvertlevel ! Number of the vertical level (needed for Z-level split files)
+integer,                    optional, intent(in)  :: kzfile     ! Number of the Z-level split file
+
+character(len=4)                   :: ysuffix
+character(len=NMNHNAMELGTMAX)      :: yvarname
+integer(kind=CDFINT)               :: istatus
+integer(kind=CDFINT)               :: ivarid
+integer(kind=CDFINT), dimension(4) :: istarts
+type(tfielddata),     pointer      :: tzfield
+type(tfiledata),      pointer      :: tzfile
+
+kresp = 0
+
+call IO_Select_split_file( tpfile, tpfield, tzfile, tzfield, kvertlevel, kzfile )
+
+call Print_msg( NVERB_DEBUG, 'IO', 'IO_Field_partial_write_nc4_N4',&
+                Trim( tzfile%cname ) // ': writing ' // Trim( tzfield%cmnhname ) )
+
+call IO_Mnhname_clean( tzfield%cmnhname, yvarname )
+
+istatus = NF90_INQ_VARID( tzfile%nncid, yvarname, ivarid )
+if ( istatus /= NF90_NOERR ) then
+  call Print_msg( NVERB_FATAL, 'IO', 'IO_Field_partial_write_nc4_N4', 'variable ' // Trim( yvarname ) &
+                  // ' not yet created (IO_Field_create not yet called?)' )
+end if
+
+! Write the data
+if ( Size( kfield ) > 0 ) then
+  istarts(:) = koffset(:) + 1
+  istatus = NF90_PUT_VAR( tzfile%nncid, ivarid, kfield(:,:,:,:), start = istarts(:), count = Shape( kfield ) )
+  if (istatus /= NF90_NOERR) &
+    call IO_Err_handle_nc4( istatus, 'IO_Field_partial_write_nc4_N4', 'NF90_PUT_VAR', Trim( tzfield%cmnhname ), kresp )
+end if
+
+if ( Present( kvertlevel ) ) deallocate( tzfield )
+
+end subroutine IO_Field_partial_write_nc4_N4
+
+
 subroutine IO_Coordvar_write_nc4( tpfile, hprogram_orig )
 use modd_aircraft_balloon
 use modd_budget,     only: cbutype, lbu_icp, lbu_jcp, lbu_kcp, nbuih, nbuil, nbujh, nbujl, nbukh, nbukl, nbukmax, &