diff --git a/src/h5core/h5u_model.c b/src/h5core/h5u_model.c index 0df1edc..c1de9ee 100644 --- a/src/h5core/h5u_model.c +++ b/src/h5core/h5u_model.c @@ -18,7 +18,7 @@ #include "h5core/h5u_model.h" h5_ssize_t -h5u_get_num_particles ( +h5u_get_num_points ( const h5_file_t fh /*!< [in] Handle to open file */ ) { h5_file_p f = (h5_file_p)fh; @@ -27,7 +27,7 @@ h5u_get_num_particles ( if (h5u_has_view ((h5_file_t)f)) { /* if a view exists, use its size as the number of particles */ - TRY (nparticles = h5u_get_num_particles_in_view (fh)); + TRY (nparticles = h5u_get_num_points_in_view (fh)); } else { /* otherwise, report all particles on disk in the first dataset for this timestep */ @@ -38,7 +38,7 @@ h5u_get_num_particles ( } h5_ssize_t -h5u_get_num_particles_in_view ( +h5u_get_num_points_in_view ( const h5_file_t fh /*!< [in] Handle to open file */ ) { h5_file_p f = (h5_file_p)fh; @@ -79,16 +79,19 @@ h5u_get_totalnum_particles_by_idx ( H5_CORE_API_ENTER (h5_ssize_t, "f=%p, idx=%lld", f, (long long)idx); char dataset_name[H5_DATANAME_LEN]; dataset_name[0] = '\0'; - TRY (hdf5_get_name_of_dataset_by_idx ( + h5_err_t h5err; + TRY (h5err = hdf5_get_name_of_dataset_by_idx ( f->step_gid, idx, dataset_name, H5_DATANAME_LEN)); + if (h5err == H5_NOK) + H5_CORE_API_LEAVE (H5_NOK); H5_CORE_API_RETURN (h5u_get_totalnum_particles_by_name (fh, dataset_name)); } h5_err_t -h5u_set_num_particles ( +h5u_set_num_points ( const h5_file_t fh, /*!< [in] Handle to open file */ const h5_size_t nparticles, /*!< [in] Number of particles */ const h5_size_t stride /*!< [in] Stride of particles in memory */ @@ -256,37 +259,74 @@ h5u_set_view ( if (f->u->shape > 0) { TRY (total = hdf5_get_npoints_of_dataspace (f->u->shape) ); } else { - TRY (total = (hsize_t)h5u_get_totalnum_particles_by_idx (fh,0)); + TRY (total = (hsize_t)h5u_get_totalnum_particles_by_idx (fh, 0)); } - if (total == 0) { - /* No datasets have been created yet and no views are set. - * We have to leave the view empty because we don't know how - * many particles there should be! */ - H5_CORE_API_LEAVE (H5_SUCCESS); - } - if (end < 0) { - end = total+end; + h5_debug ("Total = %lld", (long long) total); + if ((long long)total <= 0) { + /* + No datasets have been created yet and no views are set. + We have to leave the view empty because we don't know how + many particles there should be! + + :FIXME: Should 'total == 0' be considered valid or not? + :FIXME: why not gather total size? + */ + if (start < 0) { + H5_CORE_API_LEAVE ( + h5_error( + H5_ERR_INVAL, + "Start of selection '%lld' out of range: must be >= 0", + (long long)start) + ); + } + if (end < start) { + H5_CORE_API_LEAVE ( + h5_error( + H5_ERR_INVAL, + "End of selection '%lld' out of range: must be >= %lld", + (long long)end, + (long long)start) + ); + } +#if PARALLEL_IO + TRY ( + h5priv_mpi_allreduce_max ( + &end, &total, 1, MPI_LONG_LONG, f->props->comm) + ); +#else + total = end - start; +#endif + total++; + TRY (h5u_reset_view(fh)); + + TRY (hdf5_close_dataspace (u->shape)); + TRY (u->shape = hdf5_create_dataspace(1, &total, NULL) ); + } else { + if (end < 0) { + end = total+end; + } + + if (start < 0 || start >= total) { + H5_CORE_API_LEAVE ( + h5_error( + H5_ERR_INVAL, + "Start of selection '%lld' out of range: must be in [0..%lld]", + (long long)start, (long long)total-1)); + } else if (end < 0 || end >= total) { + H5_CORE_API_LEAVE ( + h5_error( + H5_ERR_INVAL, + "End of selection '%lld' out of range: must be in [0..%lld]", + (long long)end, (long long)total-1)); + } else if (end+1 < start) { + H5_CORE_API_LEAVE ( + h5_error( + H5_ERR_INVAL, + "Invalid selection: start=%lld > end=%lld!\n", + (long long)start, (long long)end)); + } } - if (start < 0 || start >= total) { - H5_CORE_API_LEAVE ( - h5_error( - H5_ERR_INVAL, - "Start of selection out of range: %lld not in [0..%lld]", - (long long)start, (long long)total-1)); - } else if (end < 0 || end >= total) { - H5_CORE_API_LEAVE ( - h5_error( - H5_ERR_INVAL, - "End of selection out of range: %lld not in [0..%lld]", - (long long)end, (long long)total-1)); - } else if (end+1 < start) { - H5_CORE_API_LEAVE ( - h5_error( - H5_ERR_INVAL, - "Invalid selection: start=%lld > end=%lld!\n", - (long long)start, (long long)end)); - } /* setting up the new view */ u->viewstart = start; u->viewend = end; @@ -363,7 +403,7 @@ h5u_set_view_length ( u->nparticles = length; h5_debug ( - "This view has %lld particles.", + "This view includes %lld particles.", (long long)u->nparticles ); /* declare overall data size but then will select a subset */ @@ -476,7 +516,7 @@ h5u_get_view ( viewend = u->viewend; } else { - TRY (viewend = h5u_get_num_particles (fh)); + TRY (viewend = h5u_get_num_points (fh)); } if ( start ) *start = viewstart; @@ -497,7 +537,7 @@ h5u_set_canonical_view ( h5_int64_t start = 0; h5_int64_t total = 0; - TRY (total = h5u_get_num_particles (fh)); + TRY (total = h5u_get_num_points (fh)); u->nparticles = total / f->nprocs; diff --git a/src/include/H5Part_model.h b/src/include/H5Part_model.h index bfd9f62..d623098 100644 --- a/src/include/H5Part_model.h +++ b/src/include/H5Part_model.h @@ -46,6 +46,18 @@ extern "C" { \return \c H5_SUCCESS or \c H5_FAILURE. */ +static inline h5_err_t +H5PartSetNumPoints ( + const h5_file_t f, ///< [in] file handle. + h5_size_t npoints ///< [in] Number of elements. + ) { + H5_API_ENTER (h5_err_t, + "f=%p, npoints=%llu", + (h5_file_p)f, (long long unsigned)npoints); + h5_size_t stride = 1; + H5_API_RETURN (h5u_set_num_points (f, npoints, stride)); +} + static inline h5_err_t H5PartSetNumParticles ( const h5_file_t f, ///< [in] file handle. @@ -55,7 +67,7 @@ H5PartSetNumParticles ( "f=%p, nparticles=%llu", (h5_file_p)f, (long long unsigned)nparticles); h5_size_t stride = 1; - H5_API_RETURN (h5u_set_num_particles (f, nparticles, stride)); + H5_API_RETURN (h5u_set_num_points (f, nparticles, stride)); } /*! @@ -81,22 +93,22 @@ H5PartSetNumParticles ( If you instead have a separate array for each fields, such as \c x[] and \c y[], - use \ref H5PartSetNumParticles. + use \ref H5PartSetNumParticles(). \return \c H5_SUCCESS or \c H5_FAILURE. */ static inline h5_err_t H5PartSetNumParticlesStrided ( const h5_file_t f, ///< [in] file handle. - h5_size_t nparticles, ///< [in] number of particles. + h5_size_t npoints, ///< [in] number of elements. h5_size_t stride ///< [in] stride value (e.g. number ///< of fields in the particle array). ) { H5_API_ENTER (h5_err_t, - "f=%p, nparticles=%llu, stride=%llu", - (h5_file_p)f, (long long unsigned)nparticles, + "f=%p, npoints=%llu, stride=%llu", + (h5_file_p)f, (long long unsigned)npoints, (long long unsigned)stride); - H5_API_RETURN (h5u_set_num_particles (f, nparticles, stride)); + H5_API_RETURN (h5u_set_num_points (f, npoints, stride)); } /*! @@ -215,7 +227,7 @@ H5PartGetDatasetInfo ( if a view has been set. If not, it returns the total number of particles across all processors - from the last \ref H5PartSetNumParticles call. + from the last \ref H5PartSetNumParticles() call. If you have neither set the number of particles nor set a view, then this returns the total number of @@ -226,9 +238,19 @@ H5PartGetDatasetInfo ( If none of these conditions are met, an error is thrown. - \return number of particles in current step. + \return number of elements in datasets in current step. \return \c H5_FAILURE on error. */ + static inline h5_ssize_t +H5PartGetNumPoints ( + const h5_file_t f ///< [in] file handle. + ) { + H5_API_ENTER (h5_ssize_t, + "f=%p", + (h5_file_p)f); + H5_API_RETURN (h5u_get_num_points (f)); +} + static inline h5_ssize_t H5PartGetNumParticles ( const h5_file_t f ///< [in] file handle. @@ -236,7 +258,7 @@ H5PartGetNumParticles ( H5_API_ENTER (h5_ssize_t, "f=%p", (h5_file_p)f); - H5_API_RETURN (h5u_get_num_particles (f)); + H5_API_RETURN (h5u_get_num_points (f)); } /*! @@ -260,7 +282,7 @@ H5PartResetView ( \ingroup h5part_model Check whether a view has been set, either automatically with - \ref H5PartSetNumParticles or manually with \ref H5PartSetView + \ref H5PartSetNumParticles() or manually with \ref H5PartSetView or \ref H5PartSetViewIndices. \return \c 1 if view has been set. @@ -288,7 +310,7 @@ H5PartHasView ( is set, or the number of particles in a dataset changes, or the view is "unset" by calling \c H5PartSetView(file,-1,-1); - Before you set a view, \ref H5PartGetNumParticles will return the + Before you set a view, \ref H5PartGetNumPoints will return the total number of particles in the current time-step (even for the parallel reads). However, after you set a view, it will return the number of particles contained in the view. @@ -326,7 +348,7 @@ H5PartSetView ( for all the intermediate values (which will not be touched by the read or write). - Before you set a view, the \c H5PartGetNumParticles() will return the + Before you set a view, the \c H5PartGetNumPoints() will return the total number of particles in the current time-step (even for the parallel reads). However, after you set a view, it will return the number of particles contained in the view. diff --git a/src/include/h5core/h5u_model.h b/src/include/h5core/h5u_model.h index 38762e6..674b34a 100644 --- a/src/include/h5core/h5u_model.h +++ b/src/include/h5core/h5u_model.h @@ -17,11 +17,11 @@ extern "C" { #endif h5_ssize_t -h5u_get_num_particles ( +h5u_get_num_points ( const h5_file_t); h5_ssize_t -h5u_get_num_particles_in_view ( +h5u_get_num_points_in_view ( const h5_file_t); h5_ssize_t @@ -35,7 +35,7 @@ h5u_get_totalnum_particles_by_idx ( h5_id_t); h5_err_t -h5u_set_num_particles ( +h5u_set_num_points ( const h5_file_t, const h5_size_t, const h5_size_t);