53 MPI_Comm comm = MPI_COMM_NULL;
56 const int mpi_size = 1;
58 const int mpi_rank = 0;
61 hid_t fapl = H5I_INVALID_HID;
63 hid_t file = H5I_INVALID_HID;
65 hid_t vtk = H5I_INVALID_HID;
67 hid_t dxpl = H5P_DEFAULT;
69 hid_t cell_data = H5I_INVALID_HID;
71 hid_t point_data = H5I_INVALID_HID;
74 int compression_level = 6;
79 static constexpr size_t MAX_NDIMS = 2;
80 std::array<hsize_t, MAX_NDIMS> data = { };
83 Dims(
int ndims_) : ndims(ndims_) { MFEM_ASSERT(ndims <= MAX_NDIMS,
""); }
84 Dims(
int ndims_, hsize_t val) : Dims(ndims_) { data.fill(val); }
86 Dims(std::initializer_list<T> data_) : Dims(int(data_.size()))
87 { std::copy(data_.begin(), data_.end(), data.begin()); }
88 operator hsize_t*() {
return data.data(); }
89 hsize_t &operator[](
int i) {
return data[i]; }
90 hsize_t TotalSize()
const;
97 hid_t steps = H5I_INVALID_HID;
100 unsigned long nsteps = 0;
107 void Update(hsize_t offset)
115 Offsets point_offsets;
116 Offsets cell_offsets;
117 Offsets connectivity_offsets;
120 std::unordered_map<std::string,Offsets> point_data_offsets;
125 const Mesh *mesh_ptr =
nullptr;
127 long nodes_sequence = -1;
128 bool high_order =
true;
139 bool HasChanged(
const Mesh &mesh)
const
141 if (mesh_ptr == &mesh)
143 return sequence != mesh.GetSequence() ||
144 nodes_sequence != mesh.GetNodesSequence();
151 bool HasChanged(
const Mesh &mesh,
bool high_order_,
int ref_)
const
153 return HasChanged(mesh) || high_order != high_order_ || ref != ref_;
156 void Set(
const Mesh &mesh,
bool high_order_,
int ref_)
159 sequence = mesh.GetSequence();
160 nodes_sequence = mesh.GetNodesSequence();
161 high_order = high_order_;
165 int GetRefinementLevel()
const {
return ref; }
177 struct OffsetTotal {
size_t offset;
size_t total; };
193 hid_t EnsureDataset(hid_t
f,
const std::string &name, hid_t type, Dims &dims);
199 void EnsureGroup(
const std::string &name, hid_t &group);
207 template <
typename T>
208 void AppendParData(hid_t
f,
const std::string &name, hsize_t locsize,
209 hsize_t offset, Dims globsize, T *data);
221 template <
typename T>
222 OffsetTotal AppendParVector(hid_t
f,
const std::string &name,
223 const std::vector<T> &data, Dims dims = Dims(1));
226 template <
typename T>
227 void AppendValue(
const hid_t
f,
const std::string &name, T value);
230 template <
typename T>
231 std::vector<T> AllGather(
const T loc)
const;
241 OffsetTotal GetOffsetAndTotal(
const size_t loc)
const;
248 bool UsingMpi()
const;
251 void Barrier()
const;
254 template <
typename T>
static hid_t GetTypeID();
260 void CreateFile(
const std::string &filename, Restart restart);
263 template <
typename T>
264 std::vector<T> ReadDataset(
const std::string &name)
const;
267 template <
typename T>
268 T ReadValue(
const std::string &name, hsize_t
index)
const;
271 void TruncateDataset(
const std::string &name, hsize_t size);
274 void Truncate(
const real_t t);
286#ifdef MFEM_PARALLEL_HDF5
296 VTKHDF(
const std::string &filename, MPI_Comm comm_,
324 template <
typename FP_T = real_t>
325 void SaveMesh(
const Mesh &mesh,
bool high_order =
true,
int ref = -1);
328 template <
typename FP_T = real_t>