41 std::once_flag h5open_once_flag;
43#if (defined(H5_HAVE_THREADSAFE) || defined(H5_HAVE_CONCURRENCY))
44 bool global_hdf5_mutex_is_active =
false;
46 bool global_hdf5_mutex_is_active =
true;
49 std::mutex global_hdf5_mutex;
50 Hdf5Mutex hdf5_mutex(global_hdf5_mutex, global_hdf5_mutex_is_active);
52#if (defined(H5_HAVE_THREADSAFE) || defined(H5_HAVE_CONCURRENCY))
53#define ARCANE_HDF5_MUTEX
66#define ARCANE_HDF5_MUTEX ScopedMutex scoped_mutex
82 std::call_once(h5open_once_flag, []() { H5open(); });
91#if (defined(H5_HAVE_THREADSAFE) || defined(H5_HAVE_CONCURRENCY))
92 pm->traceMng()->info(4) <<
"HDF5 -- Is HDF5 threadsafe: 1 -- Is Mutex enabled: " << global_hdf5_mutex_is_active;
94 bool env_is_enable =
true;
96 env_is_enable = (v.value() == 0);
99 global_hdf5_mutex.lock();
100 global_hdf5_mutex_is_active = env_is_enable && is_active;
101 global_hdf5_mutex.unlock();
103 pm->traceMng()->info(4) <<
"HDF5 -- Is HDF5 threadsafe: 0 -- Is Mutex enabled: " << global_hdf5_mutex_is_active;
113 hid_t _H5Gopen(hid_t loc_id,
const char* name)
115 return H5Gopen2(loc_id, name, H5P_DEFAULT);
118 hid_t _H5Gcreate(hid_t loc_id,
const char* name)
120 return H5Gcreate2(loc_id, name, H5P_DEFAULT, H5P_DEFAULT, H5P_DEFAULT);
127extern "C" ARCANE_HDF5_EXPORT herr_t
128_ArcaneHdf5UtilsGroupIterateMe(hid_t g,
const char* mn,
void* ptr)
132 return rw->iterateMe(mn);
138void splitString(
const String& str, Array<String>& str_array,
char c)
140 const char* str_str = str.localstr();
144 if (str_str[i] == c && i != offset) {
145 str_array.add(std::string_view(str_str + offset, i - offset));
150 str_array.add(std::string_view(str_str + offset, len - offset));
157openTruncate(
const String& var)
162 _setId(H5Fcreate(var.localstr(), H5F_ACC_TRUNC, H5P_DEFAULT, H5P_DEFAULT));
165 ARCANE_THROW(ReaderWriterException,
"Can not open file '{0}'", var);
169openAppend(
const String& var)
174 _setId(H5Fopen(var.localstr(), H5F_ACC_RDWR, H5P_DEFAULT));
177 ARCANE_THROW(ReaderWriterException,
"Can not open file '{0}'", var);
181openRead(
const String& var)
186 _setId(H5Fopen(var.localstr(), H5F_ACC_RDONLY, H5P_DEFAULT));
189 ARCANE_THROW(ReaderWriterException,
"Can not open file '{0}'", var);
193openTruncate(
const String& var, hid_t plist_id)
198 _setId(H5Fcreate(var.localstr(), H5F_ACC_TRUNC, H5P_DEFAULT, plist_id));
201 ARCANE_THROW(ReaderWriterException,
"Can not open file '{0}'", var);
205openAppend(
const String& var, hid_t plist_id)
210 _setId(H5Fopen(var.localstr(), H5F_ACC_RDWR, plist_id));
213 ARCANE_THROW(ReaderWriterException,
"Can not open file '{0}'", var);
217openRead(
const String& var, hid_t plist_id)
222 _setId(H5Fopen(var.localstr(), H5F_ACC_RDONLY, plist_id));
225 ARCANE_THROW(ReaderWriterException,
"Can not open file '{0}'", var);
251 ARCANE_THROW(ReaderWriterException,
"Can not close file");
258recursiveCreate(
const Hid& loc_id,
const String& var)
260 UniqueArray<String> bufs;
261 splitString(var, bufs,
'/');
262 recursiveCreate(loc_id, bufs);
266recursiveCreate(
const Hid& loc_id,
const Array<String>& bufs)
269 hid_t last_hid = loc_id.id();
270 Integer nb_create = bufs.size();
271 UniqueArray<hid_t> ref_ids(nb_create);
272 for (
Integer i = 0; i < nb_create; ++i) {
273 last_hid = _checkOrCreate(last_hid, bufs[i]);
274 ref_ids[i] = last_hid;
278 for (
Integer i = 0; i < nb_create - 1; ++i) {
279 H5Gclose(ref_ids[i]);
288checkDelete(
const Hid& loc_id,
const String& var)
290 UniqueArray<String> bufs;
291 splitString(var, bufs,
'/');
292 hid_t last_hid = loc_id.id();
293 hid_t parent_hid = last_hid;
296 for (; i < size; ++i) {
297 parent_hid = last_hid;
298 last_hid = _checkExist(last_hid, bufs[i]);
303 if (last_hid > 0 && parent_hid > 0 && i == size) {
306 H5Gunlink(parent_hid, bufs[size - 1].localstr());
314recursiveOpen(
const Hid& loc_id,
const String& var)
317 UniqueArray<String> bufs;
318 splitString(var, bufs,
'/');
319 hid_t last_hid = loc_id.id();
321 UniqueArray<hid_t> ref_ids(nb_open);
323 for (
Integer i = 0; i < nb_open; ++i) {
324 last_hid = _H5Gopen(last_hid, bufs[i].localstr());
325 ref_ids[i] = last_hid;
328 for (
Integer i = 0; i < nb_open - 1; ++i) {
329 H5Gclose(ref_ids[i]);
338openIfExists(
const Hid& loc_id,
const Array<String>& paths)
341 hid_t last_hid = loc_id.id();
342 bool is_valid =
true;
343 Integer nb_open = paths.size();
344 UniqueArray<hid_t> ref_ids;
345 ref_ids.reserve(nb_open);
346 for (
Integer i = 0; i < nb_open; ++i) {
347 if (HGroup::hasChildren(last_hid, paths[i].localstr())) {
349 last_hid = _H5Gopen(last_hid, paths[i].localstr());
350 ref_ids.add(last_hid);
361 for (
Integer i = 0; i < ref_ids.size(); ++i) {
362 if (ref_ids[i] != last_hid) {
363 H5Gclose(ref_ids[i]);
372hasChildren(
const String& var)
374 return hasChildren(
id(), var);
381hasChildren(hid_t loc_id,
const String& var)
383 HGroupSearch gs(var);
385 herr_t v = H5Giterate(loc_id,
".", 0, _ArcaneHdf5UtilsGroupIterateMe, &gs);
386 bool has_children = v > 0;
395_checkOrCreate(hid_t loc_id,
const String& group_name)
401 HGroupSearch gs(group_name);
404 herr_t v = H5Giterate(loc_id,
".", 0, _ArcaneHdf5UtilsGroupIterateMe, &gs);
411 return _H5Gopen(loc_id, group_name.localstr());
413 hid_t new_id = _H5Gcreate(loc_id, group_name.localstr());
422create(
const Hid& loc_id,
const String& group_name)
425 _setId(H5Gcreate2(loc_id.id(), group_name.localstr(), H5P_DEFAULT, H5P_DEFAULT, H5P_DEFAULT));
432openOrCreate(
const Hid& loc_id,
const String& group_name)
434 hid_t
id = _checkOrCreate(loc_id.id(), group_name);
436 ARCANE_THROW(ReaderWriterException,
"Can not open or create group named '{0}'", group_name);
444open(
const Hid& loc_id,
const String& var)
449 id = _H5Gopen(loc_id.id(), var.localstr());
452 ARCANE_THROW(ReaderWriterException,
"Can not find group named '{0}'", var);
473_checkExist(hid_t loc_id,
const String& group_name)
479 HGroupSearch gs(group_name);
482 herr_t v = H5Giterate(loc_id,
".", 0, _ArcaneHdf5UtilsGroupIterateMe, &gs);
489 return _H5Gopen(loc_id, group_name.localstr());
515createSimple(
int nb, hsize_t dims[])
518 _setId(H5Screate_simple(nb, dims,
nullptr));
525createSimple(
int nb, hsize_t dims[], hsize_t max_dims[])
528 _setId(H5Screate_simple(nb, dims, max_dims));
538 return H5Sget_simple_extent_ndims(
id());
545getDimensions(hsize_t dims[], hsize_t max_dims[])
548 return H5Sget_simple_extent_dims(
id(), dims, max_dims);
571create(
const Hid& loc_id,
const String& var, hid_t save_type,
572 const HSpace& space_id, hid_t plist)
575 hid_t hid = H5Dcreate2(loc_id.id(), var.localstr(), save_type, space_id.id(),
576 plist, H5P_DEFAULT, H5P_DEFAULT);
585create(
const Hid& loc_id,
const String& var, hid_t save_type,
590 hid_t hid = H5Dcreate2(loc_id.id(), var.localstr(), save_type, space_id.id(),
591 link_plist.id(), creation_plist.id(), access_plist.id());
600write(hid_t native_type,
const void* array)
604 return H5Dwrite(
id(), native_type, H5S_ALL, H5S_ALL, H5P_DEFAULT, array);
611write(hid_t native_type,
const void* array,
const HSpace& memspace_id,
612 const HSpace& filespace_id, hid_t plist)
616 return H5Dwrite(
id(), native_type, memspace_id.id(), filespace_id.id(), plist, array);
623write(hid_t native_type,
const void* array,
const HSpace& memspace_id,
628 return H5Dwrite(
id(), native_type, memspace_id.id(), filespace_id.id(), plist.id(), array);
635read(hid_t native_type,
void* array)
638 return H5Dread(
id(), native_type, H5S_ALL, H5S_ALL, H5P_DEFAULT, array);
645readWithException(hid_t native_type,
void* array)
650 err = H5Dread(
id(), native_type, H5S_ALL, H5S_ALL, H5P_DEFAULT, array);
663 return HSpace(H5Dget_space(
id()));
670setExtent(
const hsize_t new_dims[])
673 return H5Dset_extent(
id(), new_dims);
680recursiveCreate(
const Hid& loc_id,
const String& var, hid_t save_type,
681 const HSpace& space_id, hid_t plist)
685 UniqueArray<String> paths;
686 splitString(var, paths,
'/');
687 Integer nb_path = paths.size();
689 if (HGroup::hasChildren(loc_id.id(), var)) {
690 _remove(loc_id.id(), var);
692 create(loc_id, var, save_type, space_id, plist);
695 String last_name = paths[nb_path - 1];
696 paths.resize(nb_path - 1);
698 group.recursiveCreate(loc_id, paths);
699 if (group.hasChildren(last_name)) {
700 _remove(group.id(), last_name);
702 create(group.id(), last_name, save_type, space_id, plist);
709_remove(hid_t hid,
const String& var)
712 H5Gunlink(hid, var.localstr());
731remove(
const Hid& loc_id,
const String& var)
734 _setId(H5Adelete(loc_id.id(), var.localstr()));
741create(
const Hid& loc_id,
const String& var, hid_t save_type,
const HSpace& space_id)
744 _setId(H5Acreate2(loc_id.id(), var.localstr(), save_type, space_id.id(), H5P_DEFAULT, H5P_DEFAULT));
751open(
const Hid& loc_id,
const String& var)
754 _setId(H5Aopen_name(loc_id.id(), var.localstr()));
761write(hid_t native_type,
void* array)
764 return H5Awrite(
id(), native_type, array);
771read(hid_t native_type,
void* array)
774 return H5Aread(
id(), native_type, array);
784 return HSpace(H5Aget_space(
id()));
809open(
const Hid& loc_id,
const String& var)
813 _setId(H5Dopen2(loc_id.id(), var.localstr(), H5P_DEFAULT));
816 ARCANE_THROW(IOException,
"Can not open dataset '{0}'", var);
823openIfExists(
const Hid& loc_id,
const String& var)
825 UniqueArray<String> paths;
826 splitString(var, paths,
'/');
827 Integer nb_path = paths.size();
829 String last_name = var;
831 last_name = paths[nb_path - 1];
832 paths.resize(nb_path - 1);
833 parent_group.openIfExists(loc_id, paths);
836 parent_group.open(loc_id,
".");
838 if (parent_group.isBad())
840 if (parent_group.hasChildren(last_name))
841 open(loc_id.id(), var.localstr());
868 _setId(H5Pcreate(cls_id));
877#ifdef H5_HAVE_PARALLEL
881 MPI_Comm mpi_comm = *((MPI_Comm*)arcane_comm);
882 MPI_Info mpi_info = MPI_INFO_NULL;
884 create(H5P_FILE_ACCESS);
885 H5Pset_fapl_mpio(
id(), mpi_comm, mpi_info);
898#ifdef H5_HAVE_PARALLEL
899 create(H5P_DATASET_XFER);
900 H5Pset_dxpl_mpio(
id(), H5FD_MPIO_COLLECTIVE);
902#if (H5_VERS_MAJOR >= 2 || H5_VERS_MINOR >= 14)
903 H5Pset_selection_io(
id(), H5D_SELECTION_IO_MODE_OFF);
917#ifdef H5_HAVE_PARALLEL
918 create(H5P_DATASET_XFER);
919 H5Pset_dxpl_mpio(
id(), H5FD_MPIO_INDEPENDENT);
921#if (H5_VERS_MAJOR >= 2 || H5_VERS_MINOR >= 14)
922 H5Pset_selection_io(
id(), H5D_SELECTION_IO_MODE_OFF);
960 hid_t type_id = H5Tcopy(H5T_NATIVE_CHAR);
964 hid_t type_id = H5Tcopy(H5T_NATIVE_UCHAR);
968 hid_t type_id = H5Tcopy(H5T_NATIVE_SCHAR);
972 hid_t type_id = H5Tcopy(H5T_NATIVE_SHORT);
973 H5Tset_precision(type_id, 8 *
sizeof(
short));
974 H5Tset_order(type_id, H5T_ORDER_LE);
978 hid_t type_id = H5Tcopy(H5T_NATIVE_INT);
979 H5Tset_precision(type_id, 8 *
sizeof(
int));
980 H5Tset_order(type_id, H5T_ORDER_LE);
984 hid_t type_id = H5Tcopy(H5T_NATIVE_LONG);
985 H5Tset_precision(type_id, 8 *
sizeof(
long));
986 H5Tset_order(type_id, H5T_ORDER_LE);
990 hid_t type_id = H5Tcopy(H5T_NATIVE_USHORT);
991 H5Tset_precision(type_id, 8 *
sizeof(
unsigned short));
992 H5Tset_order(type_id, H5T_ORDER_LE);
996 hid_t type_id = H5Tcopy(H5T_NATIVE_UINT);
997 H5Tset_precision(type_id, 8 *
sizeof(
unsigned int));
998 H5Tset_order(type_id, H5T_ORDER_LE);
1002 hid_t type_id = H5Tcopy(H5T_NATIVE_ULONG);
1003 H5Tset_precision(type_id, 8 *
sizeof(
unsigned long));
1004 H5Tset_order(type_id, H5T_ORDER_LE);
1008 hid_t type_id = H5Tcopy(H5T_NATIVE_FLOAT);
1009 H5Tset_precision(type_id, 8 *
sizeof(
float));
1010 H5Tset_order(type_id, H5T_ORDER_LE);
1014 hid_t type_id = H5Tcopy(H5T_NATIVE_DOUBLE);
1015 H5Tset_precision(type_id, 8 *
sizeof(
double));
1016 H5Tset_order(type_id, H5T_ORDER_LE);
1020 hid_t type_id = H5Tcreate(H5T_COMPOUND,
sizeof(
Real2POD));
1021 _H5Tinsert(type_id,
"X", HOFFSET(
Real2POD, x), H5T_NATIVE_DOUBLE);
1022 _H5Tinsert(type_id,
"Y", HOFFSET(
Real2POD, y), H5T_NATIVE_DOUBLE);
1026 hid_t type_id = H5Tcreate(H5T_COMPOUND,
sizeof(
Real3POD));
1027 _H5Tinsert(type_id,
"X", HOFFSET(
Real3POD, x), H5T_NATIVE_DOUBLE);
1028 _H5Tinsert(type_id,
"Y", HOFFSET(
Real3POD, y), H5T_NATIVE_DOUBLE);
1029 _H5Tinsert(type_id,
"Z", HOFFSET(
Real3POD, z), H5T_NATIVE_DOUBLE);
1033 hid_t type_id = H5Tcreate(H5T_COMPOUND,
sizeof(
Real2x2POD));
1034 _H5Tinsert(type_id,
"XX", HOFFSET(
Real2x2POD, x.x), H5T_NATIVE_DOUBLE);
1035 _H5Tinsert(type_id,
"XY", HOFFSET(
Real2x2POD, x.y), H5T_NATIVE_DOUBLE);
1036 _H5Tinsert(type_id,
"YX", HOFFSET(
Real2x2POD, y.x), H5T_NATIVE_DOUBLE);
1037 _H5Tinsert(type_id,
"YY", HOFFSET(
Real2x2POD, y.y), H5T_NATIVE_DOUBLE);
1041 hid_t type_id = H5Tcreate(H5T_COMPOUND,
sizeof(
Real3x3POD));
1042 _H5Tinsert(type_id,
"XX", HOFFSET(
Real3x3POD, x.x), H5T_NATIVE_DOUBLE);
1043 _H5Tinsert(type_id,
"XY", HOFFSET(
Real3x3POD, x.y), H5T_NATIVE_DOUBLE);
1044 _H5Tinsert(type_id,
"XZ", HOFFSET(
Real3x3POD, x.z), H5T_NATIVE_DOUBLE);
1045 _H5Tinsert(type_id,
"YX", HOFFSET(
Real3x3POD, y.x), H5T_NATIVE_DOUBLE);
1046 _H5Tinsert(type_id,
"YY", HOFFSET(
Real3x3POD, y.y), H5T_NATIVE_DOUBLE);
1047 _H5Tinsert(type_id,
"YZ", HOFFSET(
Real3x3POD, y.z), H5T_NATIVE_DOUBLE);
1048 _H5Tinsert(type_id,
"ZX", HOFFSET(
Real3x3POD, z.x), H5T_NATIVE_DOUBLE);
1049 _H5Tinsert(type_id,
"ZY", HOFFSET(
Real3x3POD, z.y), H5T_NATIVE_DOUBLE);
1050 _H5Tinsert(type_id,
"ZZ", HOFFSET(
Real3x3POD, z.z), H5T_NATIVE_DOUBLE);
1060 hid_t type_id = H5Tcopy(H5T_NATIVE_B16);
1065 hid_t type_id = H5Tcopy(H5T_NATIVE_B16);
1082_H5Tinsert(hid_t type,
const char* name,
Integer offset, hid_t field_id)
1085 herr_t herr = H5Tinsert(type, name, offset, field_id);
1094#ifdef ARCANE_REAL_NOT_BUILTIN
1095hid_t StandardTypes::
1096nativeType(
Real)
const
1102hid_t StandardTypes::
1107 return saveType(
Byte());
1109 return saveType(
Real());
1111 return saveType(Real2());
1113 return saveType(Real2x2());
1115 return saveType(Real3());
1117 return saveType(Real3x3());
1119 return saveType(
Int8());
1121 return saveType(
Int16());
1123 return saveType(
Int32());
1125 return saveType(
Int64());
1133 throw ArgumentException(String::format(
"Bad type '{0}'", sd));
1140hid_t StandardTypes::
1145 return nativeType(
Byte());
1147 return nativeType(
Real());
1149 return nativeType(Real2());
1151 return nativeType(Real2x2());
1153 return nativeType(Real3());
1155 return nativeType(Real3x3());
1157 return nativeType(
Int8());
1159 return nativeType(
Int16());
1161 return nativeType(
Int32());
1163 return nativeType(
Int64());
1171 throw ArgumentException(String::format(
"Bad type '{0}'", sd));
1182StandardArray(hid_t hfile,
const String& hpath)
1185, m_ids_hpath(hpath +
"_Ids")
1199 m_hdataset.open(m_hfile, m_hpath);
1200 HSpace hspace(m_hdataset.getSpace());
1202 const int max_dim = 256;
1203 hsize_t hdf_dims[max_dim];
1204 hsize_t max_dims[max_dim];
1208 nb_dim = H5Sget_simple_extent_ndims(hspace.id());
1209 H5Sget_simple_extent_dims(hspace.id(), hdf_dims, max_dims);
1211 for (
Integer i = 0; i < nb_dim; ++i) {
1214 m_dimensions.add((
Int64)hdf_dims[i]);
1219 m_ids_dataset.openIfExists(m_hfile, m_ids_hpath);
1229 m_ids_hpath = ids_path;
1236_write(
const void* buffer,
Integer nb_element, hid_t save_type, hid_t native_type)
1240 dims[0] = nb_element;
1243 hspace.createSimple(1, dims);
1247 m_dimensions.
clear();
1248 m_dimensions.
add(nb_element);
1250 m_hdataset.recursiveCreate(m_hfile, m_hpath, save_type, hspace, H5P_DEFAULT);
1251 if (m_hdataset.isBad())
1257 m_hdataset.write(native_type, buffer);
1267 dataset.openIfExists(m_hfile, m_hpath);
1268 return dataset.id() > 0;
1286 m_hdataset.readWithException(st.nativeType(DataType()), buffer.
data());
1296 buffer.
resize(m_dimensions[0]);
1308 bool has_ids =
false;
1312 if (m_ids_dataset.id() > 0) {
1314 m_ids_dataset.read(st.nativeType(
Int64()), unique_ids.
data());
1317 infos[0] = buf_size;
1318 infos[1] = has_ids ? 1 : 0;
1320 pm->broadcast(iav, master_rank);
1321 pm->broadcast(buffer, master_rank);
1322 pm->broadcast(unique_ids, master_rank);
1327 pm->broadcast(iav, master_rank);
1329 has_ids = infos[1] != 0;
1331 unique_ids.
resize(buf_size);
1332 pm->broadcast(buffer, master_rank);
1333 pm->broadcast(unique_ids, master_rank);
1336 for (
Integer i = 0, is = unique_ids.
size(); i < is; ++i)
1347 Integer nb_element = buffer.size();
1348 _write(buffer.data(), nb_element, st.saveType(DataType()), st.nativeType(DataType()));
1356 ConstArrayView<DataType> buffer,
1361 Integer total_size = buffer.size();
1362 Integer nb_element = unique_ids.size();
1364 if (nb_element != total_size) {
1365 if (nb_element == 0)
1366 ARCANE_THROW(ArgumentException,
"unique_ids size is zero but not buffer size ({0})",
1368 dim2_size = total_size / nb_element;
1369 if (dim2_size * nb_element != total_size)
1370 ARCANE_THROW(ArgumentException,
"buffer size ({0}) is not a multiple of unique_ids size ({1})",
1371 total_size, nb_element);
1374 UniqueArray<ValueWithUid> values_to_sort(nb_element);
1375 UniqueArray<DataType> out_buffer(total_size);
1378 for (
Integer i = 0; i < nb_element; ++i) {
1379 values_to_sort[i].m_uid = unique_ids[i];
1380 values_to_sort[i].m_index = i;
1384 std::sort(std::begin(values_to_sort), std::end(values_to_sort));
1385 for (
Integer i = 0; i < nb_element; ++i) {
1386 Integer old_index = values_to_sort[i].m_index;
1387 for (
Integer j = 0; j < dim2_size; ++j) {
1388 Integer pos = (i * dim2_size) + j;
1389 out_buffer[pos] = buffer[(old_index * dim2_size) + j];
1395 write(st, out_buffer);
1413 bool is_parallel = pm->isParallel();
1414 ITraceMng* tm = pm->traceMng();
1417 _writeSortedValues(tm, st, buffer, unique_ids);
1421 bool is_master = pm->isMasterIO();
1422 Integer master_rank = pm->masterIORank();
1423 Integer nb_rank = pm->commSize();
1424 Integer buf_size = buffer.size();
1425 Integer unique_id_size = unique_ids.size();
1433 buf[1] = unique_id_size;
1435 pm->allGather(iav, rank_sizes);
1437 Integer buffer_total_size = 0;
1438 Integer unique_id_total_size = 0;
1442 for (
Integer i = 0; i < nb_rank; ++i) {
1443 buffer_rank_index[i] = buffer_total_size;
1444 buffer_total_size += rank_sizes[(i * 2)];
1445 unique_id_rank_index[i] = unique_id_total_size;
1446 unique_id_total_size += rank_sizes[(i * 2) + 1];
1449 UniqueArray<DataType> full_buffer(buffer_total_size);
1452 for (
Integer i = 0; i < nb_rank; ++i) {
1454 if (rank_sizes[(i * 2)] == 0)
1456 ArrayView<DataType> local_buf(rank_sizes[(i * 2)], &full_buffer[buffer_rank_index[i]]);
1457 Int64ArrayView local_unique_ids(rank_sizes[(i * 2) + 1], &full_unique_ids[unique_id_rank_index[i]]);
1458 if (i == master_rank) {
1459 local_buf.copy(buffer);
1460 local_unique_ids.copy(unique_ids);
1463 pm->recv(local_buf, i);
1464 pm->recv(local_unique_ids, i);
1467 tm->info(5) <<
"PARALLEL WRITE path=" << m_hpath <<
" total_size=" << full_buffer.size();
1468 _writeSortedValues(tm, st, full_buffer, full_unique_ids);
1473 buf[1] = unique_id_size;
1475 pm->allGather(iav, rank_sizes);
1477 if (buffer.size() > 0) {
1478 pm->send(buffer, master_rank);
1479 pm->send(unique_ids, master_rank);
1507template <
typename DataType> DataType
1512 m_hdataset.open(m_hfile, m_hpath);
1515 const int max_dim = 256;
1516 hsize_t hdf_dims[max_dim];
1517 hsize_t max_dims[max_dim];
1521 nb_dim = H5Sget_simple_extent_ndims(hspace.id());
1522 H5Sget_simple_extent_dims(hspace.id(), hdf_dims, max_dims);
1524 if (nb_dim != 1 || hdf_dims[0] != 1)
1529 m_hdataset.read(st.nativeType(DataType()), &dummy);
1542 m_hdataset.open(m_hfile, m_hpath);
1545 const int max_dim = 256;
1546 hsize_t hdf_dims[max_dim];
1547 hsize_t max_dims[max_dim];
1551 nb_dim = H5Sget_simple_extent_ndims(hspace.id());
1552 H5Sget_simple_extent_dims(hspace.id(), hdf_dims, max_dims);
1557 utf8_bytes.
resize(hdf_dims[0]);
1560 m_hdataset.read(st.nativeType(
Byte()), utf8_bytes.
data());
1561 return String(utf8_bytes);
1566template <
typename DataType>
void
1570 hsize_t dims[1] = { 1 };
1572 hspace.createSimple(1, dims);
1577 m_hdataset.recursiveCreate(m_hfile, m_hpath, st.saveType(DataType()), hspace, H5P_DEFAULT);
1578 if (m_hdataset.isBad())
1581 herr_t herr = m_hdataset.write(st.nativeType(DataType()), &t);
1595 dims[0] = utf8_bytes.
size() + 1;
1598 hspace.createSimple(1, dims);
1603 m_hdataset.recursiveCreate(m_hfile, m_hpath, st.saveType(
Byte()), hspace, H5P_DEFAULT);
1604 if (m_hdataset.isBad())
1607 herr_t herr = m_hdataset.write(st.nativeType(
Byte()), utf8_bytes.
data());