103 std::vector<XdmfData>
const& constant_attributes,
104 std::vector<XdmfData>
const& variable_attributes,
105 std::string
const& static_h5filename, std::string
const& dynamic_h5filename,
106 std::string
const& ogs_version, std::string
const& mesh_name)
112 auto const time_dataitem_genfn =
113 [](
unsigned long long const time_step,
int const max_step,
114 std::string
const& h5filename, std::string
const& mesh_name)
117 [time_step, max_step, h5filename, mesh_name](
auto const& xdmfdata)
120 fmt::runtime(
"\n\t\t<DataItem DataType=\"{datatype}\" "
121 "Dimensions=\"{local_dimensions}\" "
123 "Precision=\"{precision}\">"
124 "{filename}:/meshes/{meshname}/{datasetname}|"
125 "{time_step} {starts}:1 {strides}:1 "
126 "{local_dimensions}:{max_step} "
127 "{global_dimensions}</"
130 "local_dimensions"_a =
131 fmt::join(xdmfdata.global_block_dims,
" "),
133 "filename"_a = h5filename,
134 "meshname"_a = mesh_name,
135 "datasetname"_a = xdmfdata.name,
136 "starts"_a = fmt::join(xdmfdata.starts,
" "),
137 "strides"_a = fmt::join(xdmfdata.strides,
" "),
138 "global_dimensions"_a =
139 fmt::join(xdmfdata.global_block_dims,
" "),
140 "time_step"_a = fmt::format(
"{}", time_step),
141 "max_step"_a = fmt::format(
"{}", max_step));
146 auto const string_join_fn = [](
auto const& collection)
147 {
return fmt::to_string(fmt::join(collection,
"")); };
151 auto const m_bind_fn = [](
auto const& transform,
auto const& join)
153 return [join, transform](
auto const& collection)
155 std::vector<std::string> temp;
156 temp.reserve(collection.size());
157 for (std::size_t i = 0; i < collection.size(); ++i)
160 temp.push_back(transform(collection[i], i + 4));
169 auto const pointer_transfrom = [](
auto const& elements)
172 fmt::runtime(
"\n\t<xi:include xpointer=\"element(/{elements})\"/>"),
173 "elements"_a = fmt::join(elements,
"/"));
178 auto const attribute_transform =
179 [](
XdmfData const& attribute,
auto const& dataitem_transform)
182 "\n\t<Attribute Center=\"{center}\" ElementCell=\"\" "
183 "ElementDegree=\"0\" "
184 "ElementFamily=\"\" ItemType=\"\" Name=\"{name}\" "
185 "Type=\"None\">{dataitem}\n\t</Attribute>",
187 "name"_a = attribute.
name,
188 "dataitem"_a = dataitem_transform(attribute));
192 auto const geometry_transform =
193 [](
XdmfData const& geometry,
auto const& dataitem_transform)
196 fmt::runtime(
"\n\t<Geometry Origin=\"\" "
197 "Type=\"XYZ\">{dataitem}\n\t</Geometry>"),
198 "dataitem"_a = dataitem_transform(geometry));
201 auto tag_string = [](
auto const& topology,
int nodes_per_element,
202 auto const& dataitem_transform)
205 fmt::runtime(
"\n\t<Topology Type=\"{topology_type}\" "
206 "NodesPerElement=\"{nodes_per_element}\" "
207 "NumberOfElements=\"{number_of_elements}\">{dataitem}"
211 "dataitem"_a = dataitem_transform(topology),
212 "nodes_per_element"_a = nodes_per_element,
217 auto const topology_transform =
218 [&tag_string](
XdmfData const& topology,
auto const& dataitem_transform)
223 return tag_string(topology, 1, dataitem_transform);
225 return tag_string(topology, 2, dataitem_transform);
246 "Type=\"{topology_type}\">{dataitem}\n\t</Topology>"),
249 "dataitem"_a = dataitem_transform(topology));
251 OGS_FATAL(
"Could not transform unknown XDMF topology type");
252 return std::string{};
257 auto const grid_transform =
258 [](
double const& time_value,
auto const& geometry,
auto const& topology,
259 auto const& constant_attributes,
auto const& variable_attributes)
263<Grid Name="Grid" GridType="Uniform">
264 <Time Value="{time_value:.{precision}g}"/>
270 "time_value"_a = time_value,
272 "precision"_a = std::numeric_limits<double>::max_digits10,
273 "geometry"_a = geometry,
274 "topology"_a = topology,
275 "fix_attributes"_a = constant_attributes,
276 "variable_attributes"_a = variable_attributes);
280 enum class time_attribute
288 auto const time_step_fn =
289 [pointer_transfrom, mesh_name](
auto const& component_transform,
290 unsigned long long const time_step,
292 time_attribute
const variable,
293 std::string
const& h5filename,
294 auto const& dataitem_genfn)
296 return [component_transform, dataitem_genfn, pointer_transfrom,
297 variable, time_step, max_step, h5filename,
298 mesh_name](
XdmfData const& attr, std::size_t
const index)
302 ((time_step > 0 && (variable == time_attribute::variable)) ||
307 dataitem_genfn(time_step, max_step, h5filename, mesh_name);
308 return component_transform(attr, dataitem);
311 std::array<unsigned int, 5> position = {
312 1, 1, 2, 1,
static_cast<unsigned int>(index)};
313 return pointer_transfrom(position);
321 auto const time_grid_transform =
322 [time_step_fn, m_bind_fn, string_join_fn, grid_transform,
323 geometry_transform, topology_transform, attribute_transform,
324 time_dataitem_genfn](
325 double const time,
int const step,
int const max_step,
326 auto const& geometry,
auto const& topology,
327 auto const& constant_attributes,
auto const& variable_attributes,
328 std::string
const& static_h5filename,
329 std::string
const& dynamic_h5filename)
332 auto const constant_dataitem_genfn =
333 [&time_dataitem_genfn](
unsigned long long const,
int const,
334 std::string
const& h5fn,
335 std::string
const& mn)
336 -> std::function<std::string(
XdmfData const&)>
337 {
return time_dataitem_genfn(0, 1, h5fn, mn); };
339 auto const time_step_geometry_transform = time_step_fn(
340 geometry_transform, step, max_step, time_attribute::constant,
341 static_h5filename, constant_dataitem_genfn);
342 auto const time_step_topology_transform = time_step_fn(
343 topology_transform, step, max_step, time_attribute::constant,
344 static_h5filename, constant_dataitem_genfn);
345 auto const time_step_const_attribute_fn = time_step_fn(
346 attribute_transform, step, max_step, time_attribute::constant,
347 static_h5filename, constant_dataitem_genfn);
348 auto const time_step_variable_attribute_fn = time_step_fn(
349 attribute_transform, step, max_step, time_attribute::variable,
350 dynamic_h5filename, time_dataitem_genfn);
354 auto const variable_attributes_transform =
355 m_bind_fn(time_step_variable_attribute_fn, string_join_fn);
356 auto const constant_attributes_transform =
357 m_bind_fn(time_step_const_attribute_fn, string_join_fn);
359 return grid_transform(
360 time, time_step_geometry_transform(geometry, 2),
361 time_step_topology_transform(topology, 3),
362 constant_attributes_transform(constant_attributes),
363 variable_attributes_transform(variable_attributes));
369 auto const temporal_grid_collection_transform =
370 [time_grid_transform](
371 auto const& times,
auto const& geometry,
auto const& topology,
372 auto const& constant_attributes,
auto const& variable_attributes,
373 std::string
const& static_h5filename,
374 std::string
const& dynamic_h5filename)
377 auto const max_step = times.size();
378 std::vector<std::string> grids;
379 grids.reserve(max_step);
380 for (
size_t time_step = 0; time_step < max_step; ++time_step)
382 grids.push_back(time_grid_transform(
383 times[time_step], time_step, max_step, geometry, topology,
384 constant_attributes, variable_attributes, static_h5filename,
385 dynamic_h5filename));
389 "\n<Grid CollectionType=\"Temporal\" GridType=\"Collection\" "
390 "Name=\"Collection\">{grids}\n</Grid>\n"),
391 "grids"_a = fmt::join(grids,
""));
396 auto const xdmf_writer_fn = [temporal_grid_collection_transform,
398 dynamic_h5filename](
auto ogs_version,
401 auto constant_attributes,
402 auto variable_attributes)
407 return [temporal_grid_collection_transform, static_h5filename,
408 dynamic_h5filename, ogs_version = std::move(ogs_version),
409 geometry = std::move(geometry), topology = std::move(topology),
410 constant_attributes = std::move(constant_attributes),
411 variable_attributes = std::move(variable_attributes)](
412 std::vector<double>
const& times)
415 "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<Xdmf "
416 "xmlns:xi=\"http://www.w3.org/2001/XInclude\" "
417 "Version=\"3.0\">\n<Domain>\n<Information Name=\"OGS_VERSION\" "
418 "Value=\"{ogs_version}\"/>{grid_collection}</Domain>\n</Xdmf>",
419 "ogs_version"_a = ogs_version,
420 "grid_collection"_a = temporal_grid_collection_transform(
421 times, geometry, topology, constant_attributes,
422 variable_attributes, static_h5filename,