work in progress
This commit is contained in:
+106
-21
@@ -12,6 +12,86 @@ open_space_all (
|
||||
return H5S_ALL;
|
||||
}
|
||||
|
||||
/*
|
||||
experimental code, will replace h5priv_write_dataset_by_name() somewhen
|
||||
*/
|
||||
write_dataset_by_name (
|
||||
h5_file_t* const f,
|
||||
const hid_t loc_id,
|
||||
h5_dsetobject_t* dset
|
||||
) {
|
||||
H5_PRIV_API_ENTER (h5_err_t);
|
||||
h5_info ("Writing dataset %s/%s.",
|
||||
hdf5_get_objname (loc_id), dset->name);
|
||||
|
||||
h5_err_t exists;
|
||||
TRY (exists = hdf5_link_exists (loc_id, dsinfo->name));
|
||||
if ((exists > 0) && ((f->mode==H5_O_WRONLY) || (f->mode==H5_O_APPEND))) {
|
||||
h5_warn ("Dataset %s/%s already exist.",
|
||||
hdf5_get_objname (loc_id), dsinfo->name);
|
||||
H5_PRIV_API_LEAVE (h5priv_handle_file_mode_error(f->mode));
|
||||
}
|
||||
|
||||
/*
|
||||
open/create dataset
|
||||
*/
|
||||
hid_t dset_id;
|
||||
hid_t dataspace_id;
|
||||
hid_t diskspace_id;
|
||||
hid_t memspace_id;
|
||||
|
||||
if (exists) {
|
||||
/* overwrite dataset */
|
||||
TRY (dset_id = hdf5_open_dataset (loc_id, dsinfo->name));
|
||||
TRY (dataspace_id = hdf5_get_dataset_space (dset_id));
|
||||
TRY (hdf5_set_dataset_extent (dset_id, dsinfo->dims));
|
||||
/* exten dataset? */
|
||||
} else {
|
||||
/* create dataset */
|
||||
TRY (dataspace_id = hdf5_create_dataspace (
|
||||
dsinfo->rank,
|
||||
dsinfo->dims,
|
||||
dsinfo->max_dims));
|
||||
TRY (dset_id = hdf5_create_dataset (
|
||||
loc_id,
|
||||
dsinfo->name,
|
||||
dsinfo->type_id,
|
||||
dataspace_id,
|
||||
dsinfo->create_prop));
|
||||
}
|
||||
TRY (memspace_id = (*set_memspace)(f, 0));
|
||||
TRY (diskspace_id = (*set_diskspace)(f, dataspace_id));
|
||||
#ifdef PARALLEL_IO
|
||||
TRY (h5_start_throttle (f));
|
||||
#endif
|
||||
TRY (hdf5_write_dataset (
|
||||
dset_id,
|
||||
dsinfo->type_id,
|
||||
memspace_id,
|
||||
diskspace_id,
|
||||
f->xfer_prop,
|
||||
data));
|
||||
#ifdef PARALLEL_IO
|
||||
TRY (h5_end_throttle (f));
|
||||
#endif
|
||||
TRY (hdf5_close_dataspace (diskspace_id));
|
||||
TRY (hdf5_close_dataspace (memspace_id));
|
||||
TRY (hdf5_close_dataset (dset_id));
|
||||
f->empty = 0;
|
||||
|
||||
H5_PRIV_API_RETURN (H5_SUCCESS);
|
||||
}
|
||||
|
||||
/*
|
||||
- on all procs create dataset with given size of content
|
||||
- create diskspace
|
||||
- set hyperslap on diskspace:
|
||||
- select all on proc 0
|
||||
- select 0 byte on proc > 0
|
||||
- create memspace with size of selection
|
||||
- write
|
||||
- close objects
|
||||
*/
|
||||
h5_err_t
|
||||
h5_write_attachment (
|
||||
h5_file_t* const f,
|
||||
@@ -23,34 +103,39 @@ h5_write_attachment (
|
||||
H5_CORE_API_ENTER4 (h5_ssize_t,
|
||||
"name=\"%s\", type=%ld, content=0x%p, size=%llu",
|
||||
name, (long)type, content, (unsigned long long)size);
|
||||
// write only on proc 0
|
||||
if (f->myproc != 0) {
|
||||
H5_CORE_API_LEAVE (H5_SUCCESS);
|
||||
}
|
||||
hid_t group_id;
|
||||
TRY (group_id = h5priv_open_group (f, f->file, H5_ATTACHMENT));
|
||||
h5_err_t exists;
|
||||
TRY (exists = hdf5_link_exists (group_id, name));
|
||||
if (exists > 0) {
|
||||
// warn user on overwrite
|
||||
h5_warn ("Dataset %s/%s already exists",
|
||||
hdf5_get_objname(group_id), name);
|
||||
}
|
||||
h5_dsinfo_t dsinfo;
|
||||
strncpy (dsinfo.name, name, sizeof (dsinfo.name) - 1);
|
||||
dsinfo.rank = 1;
|
||||
dsinfo.dims[0] = size;
|
||||
dsinfo.max_dims[0] = size;
|
||||
dsinfo.type_id = type;
|
||||
dsinfo.create_prop = f->create_prop;
|
||||
dsinfo.access_prop = f->access_prop;
|
||||
|
||||
hid_t group_id;
|
||||
TRY (group_id = h5priv_open_group (f, f->file, H5_ATTACHMENT));
|
||||
|
||||
h5_err_t exists;
|
||||
TRY (exists = hdf5_link_exists (group_id, name));
|
||||
// write only on proc 0
|
||||
if (f->myproc != 0) {
|
||||
// write on proc 0 only
|
||||
dsinfo.dims[0] = size;
|
||||
dsinfo.max_dims[0] = size;
|
||||
if (exists > 0) {
|
||||
h5_warn ("Dataset %s/%s already exists",
|
||||
hdf5_get_objname(group_id), name);
|
||||
}
|
||||
} else {
|
||||
// write 0 bytes on all other procs
|
||||
dsinfo.dims[0] = 0;
|
||||
dsinfo.max_dims[0] = 0;
|
||||
}
|
||||
TRY (h5priv_write_dataset_by_name (
|
||||
f,
|
||||
group_id,
|
||||
&dsinfo,
|
||||
open_space_all,
|
||||
open_space_all,
|
||||
content));
|
||||
f,
|
||||
group_id,
|
||||
&dsinfo,
|
||||
open_space_all,
|
||||
open_space_all,
|
||||
content));
|
||||
TRY (hdf5_close_group (group_id));
|
||||
H5_CORE_API_RETURN (H5_SUCCESS);
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user