diff --git a/src/LIB/SURCOUCHE/src/mode_io_field_write.f90 b/src/LIB/SURCOUCHE/src/mode_io_field_write.f90
index 6eed332ee4b291acf9485c31723b3f889631e74e..8ee639a3f930ea26aab09e8a9eda8b92f75c3d7b 100644
--- a/src/LIB/SURCOUCHE/src/mode_io_field_write.f90
+++ b/src/LIB/SURCOUCHE/src/mode_io_field_write.f90
@@ -1,4 +1,4 @@
-!MNH_LIC Copyright 1994-2023 CNRS, Meteo-France and Universite Paul Sabatier
+!MNH_LIC Copyright 1994-2024 CNRS, Meteo-France and Universite Paul Sabatier
 !MNH_LIC This is part of the Meso-NH software governed by the CeCILL-C licence
 !MNH_LIC version 1. See LICENSE, CeCILL-C_V1-en.txt and CeCILL-C_V1-fr.txt
 !MNH_LIC for details. version 1.
@@ -20,6 +20,7 @@
 !  P. Wautelet 07/12/2020: add support for partial write of fields (optional argument: koffset, not all subroutines, no LFI spport)
 !  P. Wautelet 14/01/2021: add IO_Field_write_byname_N4 and IO_Field_write_byfield_N4 subroutines
 !  P. Wautelet 07/04/2023: correct IO_Field_user_write examples
+!  P. Wautelet 08/01/2024: add zero-size check for monoprocess runs
 !-----------------------------------------------------------------
 
 #define MNH_SCALARS_IN_SPLITFILES 0
@@ -672,6 +673,12 @@ end subroutine IO_Ndimlist_reduce
     !
     IF (IRESP==0) THEN
        IF (GSMONOPROC) THEN ! sequential execution
+          IF ( SIZE(PFIELD) == 0 ) THEN
+            CALL PRINT_MSG(NVERB_INFO,'IO','IO_Field_write_byfield_X1','ignoring variable with a zero size ('//TRIM(YRECFM)//')')
+            IF (PRESENT(KRESP)) KRESP=0
+            RETURN
+          END IF
+
           if ( Present( koffset ) ) then
             !if ( glfi ) call IO_Field_partial_write_lfi( tpfile, tpfield, pfield, koffset, iresp_lfi )
             if ( gnc4 ) call IO_Field_partial_write_nc4( tpfile, tpfield, pfield, koffset, iresp_nc4 )
@@ -820,6 +827,12 @@ end subroutine IO_Ndimlist_reduce
 
     IF (IRESP==0) THEN
       IF (GSMONOPROC) THEN ! sequential execution
+        IF ( SIZE(PFIELD) == 0 ) THEN
+          CALL PRINT_MSG(NVERB_INFO,'IO','IO_Field_write_byfield_X2','ignoring variable with a zero size ('//TRIM(YRECFM)//')')
+          IF (PRESENT(KRESP)) KRESP=0
+          RETURN
+        END IF
+
          !    IF (LPACK .AND. L1D .AND. YDIR=='XY') THEN
         IF (LPACK .AND. L1D .AND. SIZE(PFIELD,1)==IHEXTOT .AND. SIZE(PFIELD,2)==IHEXTOT) THEN
           Allocate( tzfield, source = tpfield )
@@ -1101,6 +1114,12 @@ end subroutine IO_Ndimlist_reduce
 
     IF (IRESP==0) THEN
       IF (GSMONOPROC .AND. TPFILE%NSUBFILES_IOZ==0 ) THEN ! sequential execution
+        IF ( SIZE(PFIELD) == 0 ) THEN
+          CALL PRINT_MSG(NVERB_INFO,'IO','IO_Field_write_byfield_X3','ignoring variable with a zero size ('//TRIM(YRECFM)//')')
+          IF (PRESENT(KRESP)) KRESP=0
+          RETURN
+        END IF
+
           !    IF (LPACK .AND. L1D .AND. YDIR=='XY') THEN
         IF (LPACK .AND. L1D .AND. SIZE(PFIELD,1)==IHEXTOT .AND. SIZE(PFIELD,2)==IHEXTOT) THEN
           Allocate( tzfield, source = tpfield )
@@ -1536,6 +1555,12 @@ end subroutine IO_Ndimlist_reduce
 
     IF (IRESP==0) THEN
       IF (GSMONOPROC) THEN ! sequential execution
+        IF ( SIZE(PFIELD) == 0 ) THEN
+          CALL PRINT_MSG(NVERB_INFO,'IO','IO_Field_write_byfield_X4','ignoring variable with a zero size ('//TRIM(YRECFM)//')')
+          IF (PRESENT(KRESP)) KRESP=0
+          RETURN
+         END IF
+
         !    IF (LPACK .AND. L1D .AND. YDIR=='XY') THEN
         IF (LPACK .AND. L1D .AND. SIZE(PFIELD,1)==IHEXTOT .AND. SIZE(PFIELD,2)==IHEXTOT) THEN
           Allocate( tzfield, source = tpfield )
@@ -1741,6 +1766,12 @@ end subroutine IO_Ndimlist_reduce
     !
     IF (IRESP==0) THEN
       IF (GSMONOPROC) THEN ! sequential execution
+        IF ( SIZE(PFIELD) == 0 ) THEN
+          CALL PRINT_MSG(NVERB_INFO,'IO','IO_Field_write_byfield_X5','ignoring variable with a zero size ('//TRIM(YRECFM)//')')
+          IF (PRESENT(KRESP)) KRESP=0
+          RETURN
+        END IF
+
         !    IF (LPACK .AND. L1D .AND. YDIR=='XY') THEN
         IF (LPACK .AND. L1D .AND. SIZE(PFIELD,1)==IHEXTOT .AND. SIZE(PFIELD,2)==IHEXTOT) THEN
           Allocate( tzfield, source = tpfield )
@@ -1909,6 +1940,12 @@ end subroutine IO_Ndimlist_reduce
     !
     IF (IRESP==0) THEN
        IF (GSMONOPROC) THEN ! sequential execution
+          IF ( SIZE(PFIELD) == 0 ) THEN
+            CALL PRINT_MSG(NVERB_INFO,'IO','IO_Field_write_byfield_X6','ignoring variable with a zero size ('//TRIM(YRECFM)//')')
+            IF (PRESENT(KRESP)) KRESP=0
+            RETURN
+          END IF
+
           IF (GLFI) CALL IO_Field_write_lfi(TPFILE,TPFIELD,PFIELD,iresp_lfi)
           IF (GNC4) CALL IO_Field_write_nc4(TPFILE,TPFIELD,PFIELD,iresp_nc4)
        ELSE
@@ -2109,6 +2146,12 @@ end subroutine IO_Ndimlist_reduce
     !
     IF (IRESP==0) THEN
        IF (GSMONOPROC) THEN ! sequential execution
+          IF ( SIZE(KFIELD) == 0 ) THEN
+            CALL PRINT_MSG(NVERB_INFO,'IO','IO_Field_write_byfield_N1','ignoring variable with a zero size ('//TRIM(YRECFM)//')')
+            IF (PRESENT(KRESP)) KRESP=0
+            RETURN
+          END IF
+
           IF (GLFI) CALL IO_Field_write_lfi(TPFILE,TPFIELD,KFIELD,iresp_lfi)
           IF (GNC4) CALL IO_Field_write_nc4(TPFILE,TPFIELD,KFIELD,iresp_nc4)
        ELSE ! multiprocesses execution
@@ -2232,6 +2275,12 @@ end subroutine IO_Ndimlist_reduce
     !
     IF (IRESP==0) THEN
       IF (GSMONOPROC) THEN ! sequential execution
+        IF ( SIZE(KFIELD) == 0 ) THEN
+          CALL PRINT_MSG(NVERB_INFO,'IO','IO_Field_write_byfield_N2','ignoring variable with a zero size ('//TRIM(YRECFM)//')')
+          IF (PRESENT(KRESP)) KRESP=0
+          RETURN
+        END IF
+
         IF (LPACK .AND. L1D .AND. SIZE(KFIELD,1)==IHEXTOT .AND. SIZE(KFIELD,2)==IHEXTOT) THEN
           Allocate( tzfield, source = tpfield )
           if ( tpfile%ldimreduced ) then
@@ -2410,6 +2459,12 @@ end subroutine IO_Ndimlist_reduce
     !
     IF (IRESP==0) THEN
       IF (GSMONOPROC) THEN ! sequential execution
+        IF ( SIZE(KFIELD) == 0 ) THEN
+          CALL PRINT_MSG(NVERB_INFO,'IO','IO_Field_write_byfield_N3','ignoring variable with a zero size ('//TRIM(YRECFM)//')')
+          IF (PRESENT(KRESP)) KRESP=0
+          RETURN
+        END IF
+
         IF (LPACK .AND. L1D .AND. SIZE(KFIELD,1)==IHEXTOT .AND. SIZE(KFIELD,2)==IHEXTOT) THEN
           Allocate( tzfield, source = tpfield )
           if ( tpfile%ldimreduced ) then
@@ -2590,6 +2645,12 @@ end subroutine IO_Ndimlist_reduce
 
     IF (IRESP==0) THEN
       IF (GSMONOPROC) THEN ! sequential execution
+        IF ( SIZE(KFIELD) == 0 ) THEN
+          CALL PRINT_MSG(NVERB_INFO,'IO','IO_Field_write_byfield_N4','ignoring variable with a zero size ('//TRIM(YRECFM)//')')
+          IF (PRESENT(KRESP)) KRESP=0
+          RETURN
+        END IF
+
         !    IF (LPACK .AND. L1D .AND. YDIR=='XY') THEN
         IF (LPACK .AND. L1D .AND. SIZE(KFIELD,1)==IHEXTOT .AND. SIZE(KFIELD,2)==IHEXTOT) THEN
           Allocate( tzfield, source = tpfield )
@@ -2875,6 +2936,12 @@ end subroutine IO_Ndimlist_reduce
     !
     IF (IRESP==0) THEN
        IF (GSMONOPROC) THEN ! sequential execution
+          IF ( SIZE(OFIELD) == 0 ) THEN
+            CALL PRINT_MSG(NVERB_INFO,'IO','IO_Field_write_byfield_L1','ignoring variable with a zero size ('//TRIM(YRECFM)//')')
+            IF (PRESENT(KRESP)) KRESP=0
+            RETURN
+          END IF
+
           IF (GLFI) CALL IO_Field_write_lfi(TPFILE,TPFIELD,OFIELD,iresp_lfi)
           IF (GNC4) CALL IO_Field_write_nc4(TPFILE,TPFIELD,OFIELD,iresp_nc4)
        ELSE ! multiprocesses execution