diff --git a/src/LIB/SURCOUCHE/src/mode_io_field_write.f90 b/src/LIB/SURCOUCHE/src/mode_io_field_write.f90 index 73d73fb8a988b5dbd313ee70c29c1d1c32ff3c64..e7e7ed37a715c408f46a4c5d9d49d8396965b316 100644 --- a/src/LIB/SURCOUCHE/src/mode_io_field_write.f90 +++ b/src/LIB/SURCOUCHE/src/mode_io_field_write.f90 @@ -3961,17 +3961,15 @@ END SUBROUTINE IO_Fieldlist_write SUBROUTINE IO_Fieldlist_1field_write( TPOUTPUT, KMI, TPFIELD, TPBOX ) -USE MODD_BAKOUT, ONLY: LOUT_PHYSICAL_SIMPLIFIED -USE MODD_DIM_n, ONLY: NIMAX_ll, NJMAX_ll, NKMAX USE MODD_FIELD, ONLY: TFIELDDATA, TFIELDMETADATA USE MODD_OUT_n, ONLY: CMAINDOMAINNAME, TOUTBOXMETADATA -USE MODD_PARAMETERS, ONLY: JPHEXT, JPVEXT TYPE(TFILEDATA), INTENT(IN) :: TPOUTPUT !Output file INTEGER, INTENT(IN) :: KMI TYPE(TFIELDDATA), INTENT(IN) :: TPFIELD TYPE(TOUTBOXMETADATA), OPTIONAL, INTENT(IN) :: TPBOX +INTEGER :: IIINF, IJINF, IKINF INTEGER :: IISUP, IJSUP, IKSUP TYPE(TFIELDMETADATA) :: TZFIELDMD @@ -4263,28 +4261,12 @@ NDIMS: SELECT CASE (TPFIELD%NDIMS) ! Modify ndimlist except for main domain IF ( TPBOX%CNAME /= CMAINDOMAINNAME ) CALL IO_Dim_main_to_box(TZFIELDMD ) - IF ( TPBOX%CNAME == CMAINDOMAINNAME .AND. TZFIELDMD%NGRID == 2 .AND. .NOT.LOUT_PHYSICAL_SIMPLIFIED ) THEN - ! There is one more PHYSICAL horizontal layer for u points (but the same number for physical + unphysical borders) - IISUP = MIN( JPHEXT + TPBOX%NISUP + 1, NIMAX_ll + 2*JPHEXT ) - ELSE - IISUP = JPHEXT + TPBOX%NISUP - END IF - IF ( TPBOX%CNAME == CMAINDOMAINNAME .AND. TZFIELDMD%NGRID == 3 .AND. .NOT.LOUT_PHYSICAL_SIMPLIFIED ) THEN - ! There is one more PHYSICAL horizontal layer for v points (but the same number for physical + unphysical borders) - IJSUP = MIN( JPHEXT + TPBOX%NJSUP + 1, NJMAX_ll + 2*JPHEXT ) - ELSE - IJSUP = JPHEXT + TPBOX%NJSUP - END IF - IF ( TPBOX%CNAME == CMAINDOMAINNAME .AND. TZFIELDMD%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) - IKSUP = MIN( JPVEXT + TPBOX%NKSUP + 1, NKMAX + 2*JPVEXT ) - ELSE - IKSUP = JPVEXT + TPBOX%NKSUP - END IF + CALL IO_Dim_box_bounds( TPBOX, TZFIELDMD, KIINF=IIINF, KISUP=IISUP, KJINF=IJINF, KJSUP=IJSUP, KKINF=IKINF, KKSUP=IKSUP ) + CALL IO_Field_write_BOX( TPOUTPUT, TZFIELDMD, 'OTHER', TPFIELD%TFIELD_X3D(KMI)%DATA, & - KXOBOX = JPHEXT + TPBOX%NIINF, KXEBOX = IISUP, & - KYOBOX = JPHEXT + TPBOX%NJINF, KYEBOX = IJSUP, & - KZOBOX = JPVEXT + TPBOX%NKINF, KZEBOX = IKSUP ) + KXOBOX = IIINF, KXEBOX = IISUP, & + KYOBOX = IJINF, KYEBOX = IJSUP, & + KZOBOX = IKINF, KZEBOX = IKSUP ) END IF ELSE call Print_msg( NVERB_ERROR, 'IO', 'IO_Fieldlist_1field_write', trim(tpfield%cmnhname)// & @@ -4491,6 +4473,63 @@ 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 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_OUT_n, ONLY: CMAINDOMAINNAME, TOUTBOXMETADATA + USE MODD_PARAMETERS, ONLY: JPHEXT, JPVEXT + + TYPE(TOUTBOXMETADATA), INTENT(IN) :: TPBOX + CLASS(TFIELDMETADATA), INTENT(IN) :: TPFIELD + INTEGER, OPTIONAL, INTENT(OUT) :: KIINF + INTEGER, OPTIONAL, INTENT(OUT) :: KISUP + INTEGER, OPTIONAL, INTENT(OUT) :: KJINF + INTEGER, OPTIONAL, INTENT(OUT) :: KJSUP + INTEGER, OPTIONAL, INTENT(OUT) :: KKINF + INTEGER, OPTIONAL, INTENT(OUT) :: KKSUP + + IF ( TPFIELD%CDIR == 'XY' ) THEN + IF ( .NOT.PRESENT(KIINF) .OR. .NOT.PRESENT(KISUP) .OR. .NOT.PRESENT(KJINF) .OR. .NOT.PRESENT(KJSUP) ) & + call Print_msg( NVERB_FATAL, 'IO', 'IO_Dim_box_bounds', trim(tpfield%cmnhname) // ': missing needed dummy arguments' ) + + KIINF = JPHEXT + TPBOX%NIINF + IF ( TPBOX%CNAME == CMAINDOMAINNAME .AND. TPFIELD%NGRID == 2 .AND. .NOT.LOUT_PHYSICAL_SIMPLIFIED ) THEN + ! There is one more PHYSICAL horizontal layer for u points (but the same number for physical + unphysical borders) + KISUP = MIN( JPHEXT + TPBOX%NISUP + 1, NIMAX_ll + 2*JPHEXT ) + ELSE + KISUP = JPHEXT + TPBOX%NISUP + END IF + + KJINF = JPHEXT + TPBOX%NJINF + IF ( TPBOX%CNAME == CMAINDOMAINNAME .AND. TPFIELD%NGRID == 3 .AND. .NOT.LOUT_PHYSICAL_SIMPLIFIED ) THEN + ! There is one more PHYSICAL horizontal layer for v points (but the same number for physical + unphysical borders) + KJSUP = MIN( JPHEXT + TPBOX%NJSUP + 1, NJMAX_ll + 2*JPHEXT ) + ELSE + KJSUP = JPHEXT + TPBOX%NJSUP + END IF + + IF ( TPFIELD%NDIMS > 2 ) THEN + 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 ) + ELSE + KKSUP = JPVEXT + TPBOX%NKSUP + END IF + END IF + ELSE + call Print_msg( NVERB_FATAL, 'IO', 'IO_Dim_box_bounds', & + trim(tpfield%cmnhname) // ': unsupported CDIR (' // trim(tpfield%cdir) // ')' ) + END IF + +END SUBROUTINE IO_Dim_box_bounds + + SUBROUTINE IO_Field_user_write( TPOUTPUT ) ! #if 0