Files
src_old/src/h5core/h5u_readwrite.c
T
gsell b0c321dd54 - renamed functions:
h5_get_num_hdf5_groups() -> hdf5_get_num_groups()
  h5_get_num_hdf5_groups_matching_prefix() -> hdf5_get_num_groups_matching_prefix()
  h5_get_hdf5_groupname_by_idx() -> h5_get_hdf5_groupname_by_idx()
  h5_get_hdf5_groupname_by_idx() -> hdf5_get_num_datasets()
  h5_get_hdf5_datasetname_by_idx() -> hdf5_get_name_of_dataset_by_idx()
  h5_get_objname() -> hdf5_get_objname()
- added functions:
  hdf5_get_dataset_info_by_idx()
- changed args:
  h5_get_dataset_type(): file handle removed
2011-03-11 15:08:02 +00:00

161 lines
3.8 KiB
C

#include "h5core/h5_core.h"
#include "h5_core_private.h"
h5_err_t
h5u_read_data (
h5_file_t *f, /*!< [in] Handle to open file */
const char *name, /*!< [in] Name to associate dataset with */
void *data, /*!< [out] Array of data */
const hid_t type
) {
H5_CORE_API_ENTER (h5_err_t);
CHECK_TIMEGROUP (f);
struct h5u_fdata *u = f->u;
hid_t dataset_id;
hid_t space_id;
hid_t memspace_id;
hsize_t ndisk, nread, nmem;
if ( f->step_gid < 0 ) {
TRY (h5_set_step (f, f->step_idx));
}
char name2[H5_DATANAME_LEN];
TRY (h5_normalize_dataset_name (name, name2));
TRY (dataset_id = hdf5_open_dataset (f->step_gid, name2));
/* default spaces, if not using a view selection */
memspace_id = H5S_ALL;
TRY (space_id = hdf5_get_dataset_space (dataset_id));
/* get the number of elements on disk for the datset */
TRY (ndisk = hdf5_get_npoints_of_dataspace (space_id));
if (u->diskshape != H5S_ALL) {
TRY (nread = hdf5_get_npoints_of_dataspace(u->diskshape));
/* make sure the disk space selected by the view doesn't
* exceed the size of the dataset */
if (nread <= ndisk) {
/* we no longer need the dataset space... */
TRY (hdf5_close_dataspace(space_id));
/* ...because it's safe to use the view selection */
space_id = f->u->diskshape;
} else {
/* the view selection is too big?
* fall back to using the dataset space */
h5_warn (
"Ignoring view: dataset[%s] has fewer "
"elements on disk (%lld) than are selected "
"(%lld).",
name2, (long long)ndisk, (long long)nread );
nread = ndisk;
}
} else {
/* since the view selection is H5S_ALL, we will
* read all available elements in the dataset space */
nread = ndisk;
}
if (u->memshape != H5S_ALL) {
TRY (nmem = hdf5_get_npoints_of_dataspace (u->memshape));
/* make sure the memory space selected by the view has
* enough capacity for the read */
if (nmem >= nread) {
memspace_id = f->u->memshape;
} else {
/* the view selection is too small?
* fall back to using H5S_ALL */
h5_warn (
"Ignoring view: dataset[%s] has more "
"elements selected (%lld) than are available "
"in memory (%lld).",
name2, (long long)nread, (long long)nmem );
memspace_id = H5S_ALL;
}
}
#ifdef PARALLEL_IO
TRY (h5_start_throttle (f));
#endif
TRY (hdf5_read_dataset (
dataset_id,
type,
memspace_id,
space_id,
f->xfer_prop,
data ));
#ifdef PARALLEL_IO
TRY (h5_end_throttle (f));
#endif
if (space_id != f->u->diskshape) {
TRY (hdf5_close_dataspace (space_id));
}
TRY (hdf5_close_dataset (dataset_id));
H5_CORE_API_RETURN (H5_SUCCESS);
}
h5_err_t
h5u_write_data (
h5_file_t *f, /*!< IN: Handle to open file */
const char *name, /*!< IN: Name to associate array with */
const void *data, /*!< IN: Array to commit to disk */
const hid_t type /*!< IN: Type of data */
) {
H5_CORE_API_ENTER (h5_err_t);
CHECK_TIMEGROUP( f );
CHECK_WRITABLE_MODE( f );
struct h5u_fdata *u = f->u;
hid_t dset_id;
char name2[H5_DATANAME_LEN];
TRY (h5_normalize_dataset_name (name, name2));
if ( u->shape == H5S_ALL )
h5_warn("The view is unset or invalid.");
/* test for existing dataset */
H5E_BEGIN_TRY
dset_id = H5Dopen(f->step_gid, name2, H5P_DEFAULT);
H5E_END_TRY
if (dset_id > 0) {
h5_warn("Dataset %s/%s already exists",
hdf5_get_objname(f->step_gid), name2);
} else {
TRY (dset_id = hdf5_create_dataset (
f->step_gid,
name2,
type,
u->shape,
H5P_DEFAULT));
}
#ifdef PARALLEL_IO
TRY (h5_start_throttle (f));
#endif
h5_info ("Writing dataset %s/%s.",
hdf5_get_objname(f->step_gid), name2);
TRY (hdf5_write_dataset (
dset_id,
type,
u->memshape,
u->diskshape,
f->xfer_prop,
data));
#ifdef PARALLEL_IO
TRY (h5_end_throttle (f));
#endif
TRY (hdf5_close_dataset (dset_id));
f->empty = 0;
H5_CORE_API_RETURN (H5_SUCCESS);
}