diff --git a/src/LIB/SURCOUCHE/src/mode_io_field_write.f90 b/src/LIB/SURCOUCHE/src/mode_io_field_write.f90
index e706563ddc318c15661fcea64d12fd796b1dd3b9..81f7ae0291830d7117dbd1d0c5fa73c2d8c1ad0d 100644
--- a/src/LIB/SURCOUCHE/src/mode_io_field_write.f90
+++ b/src/LIB/SURCOUCHE/src/mode_io_field_write.f90
@@ -4428,6 +4428,7 @@ TYPE(TOUTBOXMETADATA), INTENT(INOUT) :: TPBOX
 
 INTEGER              :: IIINF, IJINF, IKINF
 INTEGER              :: IISUP, IJSUP, IKSUP
+INTEGER              :: IKSIZE
 INTEGER              :: IMI
 TYPE(TFIELDMETADATA) :: TZFIELDMD
 
@@ -4763,7 +4764,19 @@ NDIMS: SELECT CASE (TPFIELD%NDIMS)
       ! Modify ndimlist except for main domain
       IF ( TPBOX%CNAME /= CMAINDOMAINNAME ) CALL IO_Dim_main_to_box( TZFIELDMD )
 
-      CALL IO_Dim_box_bounds( TPBOX, TZFIELDMD, KIINF=IIINF, KISUP=IISUP, KJINF=IJINF, KJSUP=IJSUP, KKINF=IKINF, KKSUP=IKSUP )
+      ! Determine 3rd dimension size (useful if it is not the standard vertical dimension)
+      SELECT CASE (TPFIELD%NTYPE)
+        CASE (TYPEREAL)
+          IKSIZE = SIZE( TPFIELD%TFIELD_X3D(IMI)%DATA, 3 )
+        CASE (TYPEINT)
+          IKSIZE = SIZE( TPFIELD%TFIELD_N3D(IMI)%DATA, 3 )
+        CASE DEFAULT
+          call Print_msg( NVERB_ERROR, 'IO', 'IO_Fieldlist_1field_write', trim(tpfield%cmnhname)// &
+                          ': type not yet supported for 3D output' )
+      END SELECT
+
+      CALL IO_Dim_box_bounds( TPBOX, TZFIELDMD, KIINF=IIINF, KISUP=IISUP, KJINF=IJINF, KJSUP=IJSUP, &
+                              KKINF=IKINF, KKSUP=IKSUP, KKSIZE=IKSIZE )
 
       CALL IO_Box_coords_enable( TZFIELDMD, TPBOX )
     END IF
diff --git a/src/LIB/SURCOUCHE/src/mode_io_tools.f90 b/src/LIB/SURCOUCHE/src/mode_io_tools.f90
index b48b26b7b02f25e0503295ededc9ec19fd70a292..0bc64e81353760e79b944df399dfbbbae5ab8d88 100644
--- a/src/LIB/SURCOUCHE/src/mode_io_tools.f90
+++ b/src/LIB/SURCOUCHE/src/mode_io_tools.f90
@@ -222,11 +222,11 @@ SUBROUTINE IO_Dim_main_to_box( TPFIELD )
 END SUBROUTINE IO_Dim_main_to_box
 
 
-SUBROUTINE IO_Dim_box_bounds( TPBOX, TPFIELD, KIINF, KISUP, KJINF, KJSUP, KKINF, KKSUP )
+SUBROUTINE IO_Dim_box_bounds( TPBOX, TPFIELD, KIINF, KISUP, KJINF, KJSUP, KKINF, KKSUP, KKSIZE )
   ! Subroutine to return the box boundaries in global coordinates
   USE MODD_BAKOUT,     ONLY: LOUT_PHYSICAL_SIMPLIFIED
   USE MODD_DIM_n,      ONLY: NIMAX_ll, NJMAX_ll, NKMAX
-  USE MODD_FIELD,      ONLY: TFIELDMETADATA
+  USE MODD_FIELD,      ONLY: NMNHDIM_LEVEL, NMNHDIM_LEVEL_W, TFIELDMETADATA
   USE MODD_OUT_n,      ONLY: CMAINDOMAINNAME, TOUTBOXMETADATA
   USE MODD_PARAMETERS, ONLY: JPHEXT, JPVEXT
 
@@ -240,6 +240,7 @@ SUBROUTINE IO_Dim_box_bounds( TPBOX, TPFIELD, KIINF, KISUP, KJINF, KJSUP, KKINF,
   INTEGER,               OPTIONAL, INTENT(OUT) :: KJSUP
   INTEGER,               OPTIONAL, INTENT(OUT) :: KKINF
   INTEGER,               OPTIONAL, INTENT(OUT) :: KKSUP
+  INTEGER,               OPTIONAL, INTENT(IN)  :: KKSIZE ! Size of 3rd dimension (useful if this is not the vertical dimension)
 
   SELECT CASE ( TPFIELD%CDIR )
     CASE ( 'XY' )
@@ -266,12 +267,20 @@ SUBROUTINE IO_Dim_box_bounds( TPBOX, TPFIELD, KIINF, KISUP, KJINF, KJSUP, KKINF,
         IF ( .NOT.PRESENT(KKINF) .OR. .NOT.PRESENT(KKSUP) ) &
           call Print_msg( NVERB_FATAL, 'IO', 'IO_Dim_box_bounds', trim(tpfield%cmnhname) // ': missing needed dummy arguments' )
 
-        KKINF = JPVEXT + TPBOX%NKINF
-        IF ( TPBOX%CNAME == CMAINDOMAINNAME .AND. TPFIELD%NGRID == 4 .AND. .NOT.LOUT_PHYSICAL_SIMPLIFIED ) THEN
-          ! There is one more PHYSICAL vertical layer for w points (but the same number for physical + unphysical borders)
-          KKSUP = MIN( JPVEXT + TPBOX%NKSUP + 1, NKMAX + 2*JPVEXT )
+        IF ( TPFIELD%NDIMLIST(3) == NMNHDIM_LEVEL .OR. TPFIELD%NDIMLIST(3) == NMNHDIM_LEVEL_W ) THEN
+          KKINF = JPVEXT + TPBOX%NKINF
+          IF ( TPBOX%CNAME == CMAINDOMAINNAME .AND. TPFIELD%NGRID == 4 .AND. .NOT.LOUT_PHYSICAL_SIMPLIFIED ) THEN
+            ! There is one more PHYSICAL vertical layer for w points (but the same number for physical + unphysical borders)
+            KKSUP = MIN( JPVEXT + TPBOX%NKSUP + 1, NKMAX + 2*JPVEXT )
+          ELSE
+            KKSUP = JPVEXT + TPBOX%NKSUP
+          END IF
         ELSE
-          KKSUP = JPVEXT + TPBOX%NKSUP
+          IF ( .NOT.PRESENT(KKSIZE) ) &
+            call Print_msg( NVERB_FATAL, 'IO', 'IO_Dim_box_bounds', trim(tpfield%cmnhname) // &
+                            ': 3rd size mandatory for non vertical dimension' )
+          KKINF = 1
+          KKSUP = KKSIZE
         END IF
       END IF