diff --git a/src/LIB/SURCOUCHE/src/mode_io_field_write.f90 b/src/LIB/SURCOUCHE/src/mode_io_field_write.f90 index e2a158c3d2a159944abbca4d0a3545b54b0d4de4..21d4f3e9559f681f923be26eb60b0df2b635237f 100644 --- a/src/LIB/SURCOUCHE/src/mode_io_field_write.f90 +++ b/src/LIB/SURCOUCHE/src/mode_io_field_write.f90 @@ -3929,7 +3929,8 @@ end subroutine IO_Ndimlist_reduce END SUBROUTINE IO_Field_write_box_byfield_X3 - SUBROUTINE IO_Field_write_box_byfield_X4( TPFILE, TPFIELD, HBUDGET, PFIELD, KXOBOX, KXEBOX, KYOBOX, KYEBOX, KRESP, koffset ) + SUBROUTINE IO_Field_write_box_byfield_X4( TPFILE, TPFIELD, HBUDGET, PFIELD, KXOBOX, KXEBOX, KYOBOX, KYEBOX, & + KZOBOX, KZEBOX, KRESP, koffset ) ! USE MODD_IO, ONLY: GSMONOPROC, ISP ! @@ -3946,12 +3947,15 @@ end subroutine IO_Ndimlist_reduce INTEGER, INTENT(IN) :: KXEBOX ! Global coordinates of the box INTEGER, INTENT(IN) :: KYOBOX ! INTEGER, INTENT(IN) :: KYEBOX ! + INTEGER, OPTIONAL, INTENT(IN) :: KZOBOX ! + INTEGER, OPTIONAL, INTENT(IN) :: KZEBOX ! INTEGER, OPTIONAL, INTENT(OUT) :: KRESP ! return-code integer, dimension(4), optional, intent(in) :: koffset ! !* 0.2 Declarations of local variables ! integer :: iresp, iresp_lfi, iresp_nc4, iresp_glob + INTEGER :: IZOBOX, IZEBOX REAL, DIMENSION(:,:,:,:), POINTER :: ZFIELDP LOGICAL :: GALLOC LOGICAL :: GLFI, GNC4 @@ -3976,10 +3980,22 @@ end subroutine IO_Ndimlist_reduce end if IF (IRESP==0) THEN + IF ( PRESENT( KZOBOX ) ) THEN + IZOBOX = KZOBOX + ELSE + IZOBOX = LBOUND( PFIELD, 3 ) + END IF + + IF ( PRESENT( KZEBOX ) ) THEN + IZEBOX = KZEBOX + ELSE + IZEBOX = UBOUND( PFIELD, 3 ) + END IF + IF (GSMONOPROC) THEN ! sequential execution IF (HBUDGET /= 'BUDGET') THEN ! take the sub-section of PFIELD defined by the box - ZFIELDP=>PFIELD(KXOBOX:KXEBOX,KYOBOX:KYEBOX,:,:) + ZFIELDP=>PFIELD(KXOBOX:KXEBOX,KYOBOX:KYEBOX,IZOBOX:IZEBOX,:) ELSE ! take the field as a budget ZFIELDP=>PFIELD @@ -3994,14 +4010,14 @@ end subroutine IO_Ndimlist_reduce ELSE ! multiprocesses execution IF (ISP == TPFILE%NMASTER_RANK) THEN ! Allocate the box - ALLOCATE(ZFIELDP(KXEBOX-KXOBOX+1,KYEBOX-KYOBOX+1,SIZE(PFIELD,3),SIZE(PFIELD,4))) + ALLOCATE( ZFIELDP(KXEBOX-KXOBOX+1, KYEBOX-KYOBOX+1, IZEBOX-IZOBOX+1, SIZE(PFIELD,4)) ) GALLOC = .TRUE. ELSE ALLOCATE(ZFIELDP(0,0,0,0)) GALLOC = .TRUE. END IF ! - CALL GATHER_XYFIELD(PFIELD,ZFIELDP,TPFILE%NMASTER_RANK,TPFILE%NMPICOMM,& + CALL GATHER_XYFIELD(PFIELD(:,:,IZOBOX:IZEBOX,:),ZFIELDP,TPFILE%NMASTER_RANK,TPFILE%NMPICOMM,& & KXOBOX,KXEBOX,KYOBOX,KYEBOX,HBUDGET) ! IF (ISP == TPFILE%NMASTER_RANK) THEN