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