diff --git a/src/Fortran/H5Block_model.c b/src/Fortran/H5Block_model.c index 86dcb22..49c0d21 100755 --- a/src/Fortran/H5Block_model.c +++ b/src/Fortran/H5Block_model.c @@ -69,7 +69,8 @@ h5bl_3d_setview ( f, *i_start-1, *i_end-1, *j_start-1, *j_end-1, - *k_start-1, *k_end-1 )); + *k_start-1, *k_end-1, + 0)); } #define h5bl_3d_getview FC_MANGLING ( \ diff --git a/src/h5core/h5b_model.c b/src/h5core/h5b_model.c index 7feb851..d2234ee 100644 --- a/src/h5core/h5b_model.c +++ b/src/h5core/h5b_model.c @@ -417,7 +417,6 @@ _dissolve_ghostzones ( p_el = p_save; } } - } h5_free (p_begin); H5_RETURN (H5_SUCCESS); @@ -544,7 +543,8 @@ h5b_3d_set_view ( const h5_size_t j_start, /*!< IN: start index of \c j */ const h5_size_t j_end, /*!< IN: end index of \c j */ const h5_size_t k_start, /*!< IN: start index of \c k */ - const h5_size_t k_end /*!< IN: end index of \c k */ + const h5_size_t k_end, /*!< IN: end index of \c k */ + const h5_int64_t dissolve_ghostzones /*!< IN: bool: dissolve ghost-zones */ ) { h5_file_p f = (h5_file_p)fh; H5_CORE_API_ENTER (h5_err_t, @@ -571,7 +571,6 @@ h5b_3d_set_view ( h5b_partition_t *write_layout; TRY (user_layout = h5_calloc (f->nprocs, sizeof (*user_layout))); - TRY (write_layout = h5_calloc (f->nprocs, sizeof (*write_layout))); user_layout[f->myproc] = b->user_layout[0]; @@ -580,11 +579,7 @@ h5b_3d_set_view ( user_layout, 1, f->b->partition_mpi_t, f->props->comm)); _get_max_dimensions(f, user_layout); - - TRY (_dissolve_ghostzones (f, user_layout, write_layout)); - b->user_layout[0] = user_layout[f->myproc]; - b->write_layout[0] = write_layout[f->myproc]; - + //b->user_layout[0] = user_layout[f->myproc]; h5_debug ( "User layout: %lld:%lld, %lld:%lld, %lld:%lld", (long long)b->user_layout[0].i_start, @@ -594,17 +589,25 @@ h5b_3d_set_view ( (long long)b->user_layout[0].k_start, (long long)b->user_layout[0].k_end ); - h5_debug ( - "Ghost-zone layout: %lld:%lld, %lld:%lld, %lld:%lld", - (long long)b->write_layout[0].i_start, - (long long)b->write_layout[0].i_end, - (long long)b->write_layout[0].j_start, - (long long)b->write_layout[0].j_end, - (long long)b->write_layout[0].k_start, - (long long)b->write_layout[0].k_end ); + if (dissolve_ghostzones) { + TRY (write_layout = h5_calloc (f->nprocs, sizeof (*write_layout))); + TRY (_dissolve_ghostzones (f, user_layout, write_layout)); + b->write_layout[0] = write_layout[f->myproc]; + + h5_debug ( + "Ghost-zone layout: %lld:%lld, %lld:%lld, %lld:%lld", + (long long)b->write_layout[0].i_start, + (long long)b->write_layout[0].i_end, + (long long)b->write_layout[0].j_start, + (long long)b->write_layout[0].j_end, + (long long)b->write_layout[0].k_start, + (long long)b->write_layout[0].k_end ); + h5_free(write_layout); + } else { + b->write_layout[0] = b->user_layout[0]; + } h5_free(user_layout); - h5_free(write_layout); #else b->write_layout[0] = b->user_layout[0]; b->i_max = b->user_layout->i_end; diff --git a/src/include/H5Block_model.h b/src/include/H5Block_model.h index b2cc7ce..12c3cba 100644 --- a/src/include/H5Block_model.h +++ b/src/include/H5Block_model.h @@ -220,7 +220,51 @@ H5Block3dSetView ( h5b_3d_set_view (f, i_start, i_end, j_start, j_end, - k_start, k_end)); + k_start, k_end, + 0 + )); +} + +/** + Defines the partition of the field that this processor owns, using + Fortran ordering: the fastest moving index is \c i. + + For writing ghost-zone are dissolved. + + This routine uses an MPI_Allgather, so at large concurrency it should + be called as infrequently as possible. For instance, if several + steps/iteration use the same field dimensions, set the layout only + once. + + \return \c H5_SUCCESS on success + \return \c H5_FAILURE on error +*/ +static inline h5_err_t +H5Block3dSetViewDissolveGhostZones ( + const h5_file_t f, ///< [in] File handle. + const h5_int64_t i_start, ///< [in] start index of \c i + const h5_int64_t i_end, ///< [in] end index of \c i + const h5_int64_t j_start, ///< [in] start index of \c j + const h5_int64_t j_end, ///< [in] end index of \c j + const h5_int64_t k_start, ///< [in] start index of \c k + const h5_int64_t k_end ///< [in] end index of \c k + ) { + H5_API_ENTER (h5_err_t, + "f=%p, " + "i_start=%lld, i_end=%lld, " + "j_start=%lld, j_end=%lld, " + "k_start=%lld, k_end=%lld", + (h5_file_p)f, + (long long)i_start, (long long)i_end, + (long long)j_start, (long long)j_end, + (long long)k_start, (long long)k_end); + H5_API_RETURN ( + h5b_3d_set_view (f, + i_start, i_end, + j_start, j_end, + k_start, k_end, + 1 + )); } /** diff --git a/src/include/h5core/h5b_model.h b/src/include/h5core/h5b_model.h index f3af119..9326a71 100644 --- a/src/include/h5core/h5b_model.h +++ b/src/include/h5core/h5b_model.h @@ -51,7 +51,8 @@ h5b_3d_set_view ( const h5_file_t, const h5_size_t, const h5_size_t, const h5_size_t, const h5_size_t, - const h5_size_t, const h5_size_t); + const h5_size_t, const h5_size_t, + const h5_int64_t); h5_err_t h5b_3d_get_view (