108 std::vector<XdmfData>
const& constant_attributes,
109 std::vector<XdmfData>
const& variable_attributes,
110 std::string
const& h5filename, std::string
const& ogs_version,
111 std::string
const& mesh_name)
117 auto const time_dataitem_genfn =
118 [](
unsigned long long const time_step,
int const max_step,
119 std::string
const& h5filename, std::string
const& mesh_name)
122 [time_step, max_step, h5filename, mesh_name](
auto const& xdmfdata)
125 fmt::runtime(
"\n\t\t<DataItem DataType=\"{datatype}\" "
126 "Dimensions=\"{local_dimensions}\" "
128 "Precision=\"{precision}\">"
129 "{filename}:/meshes/{meshname}/{datasetname}|"
130 "{time_step} {starts}:1 {strides}:1 "
131 "{local_dimensions}:{max_step} "
132 "{global_dimensions}</"
135 "local_dimensions"_a =
136 fmt::join(xdmfdata.global_block_dims,
" "),
138 "filename"_a = h5filename,
139 "meshname"_a = mesh_name,
140 "datasetname"_a = xdmfdata.name,
141 "starts"_a = fmt::join(xdmfdata.starts,
" "),
142 "strides"_a = fmt::join(xdmfdata.strides,
" "),
143 "global_dimensions"_a =
144 fmt::join(xdmfdata.global_block_dims,
" "),
145 "time_step"_a = fmt::format(
"{}", time_step),
146 "max_step"_a = fmt::format(
"{}", max_step));
151 auto const string_join_fn = [](
auto const& collection)
152 {
return fmt::to_string(fmt::join(collection,
"")); };
155 auto const m_bind_fn = [](
auto const& transform,
auto const& join)
157 return [join, transform](
auto const& collection)
159 std::vector<std::string> temp;
160 temp.reserve(collection.size());
161 std::transform(collection.begin(), collection.end(),
162 std::back_inserter(temp), transform);
170 auto const pointer_transfrom = [](
auto const& elements)
173 fmt::runtime(
"\n\t<xi:include xpointer=\"element(/{elements})\"/>"),
174 "elements"_a = fmt::join(elements,
"/"));
179 auto const attribute_transform =
180 [](
XdmfData const& attribute,
auto const& dataitem_transform)
183 "\n\t<Attribute Center=\"{center}\" ElementCell=\"\" "
184 "ElementDegree=\"0\" "
185 "ElementFamily=\"\" ItemType=\"\" Name=\"{name}\" "
186 "Type=\"None\">{dataitem}\n\t</Attribute>",
188 "name"_a = attribute.
name,
189 "dataitem"_a = dataitem_transform(attribute));
193 auto const geometry_transform =
194 [](
XdmfData const& geometry,
auto const& dataitem_transform)
197 fmt::runtime(
"\n\t<Geometry Origin=\"\" "
198 "Type=\"XYZ\">{dataitem}\n\t</Geometry>"),
199 "dataitem"_a = dataitem_transform(geometry));
203 auto const topology_transform =
204 [](
XdmfData const& topology,
auto const& dataitem_transform)
207 fmt::runtime(
"\n\t<Topology Dimensions=\"{dimensions}\" "
208 "Type=\"Mixed\">{dataitem}\n\t</Topology>"),
209 "dataitem"_a = dataitem_transform(topology),
215 auto const grid_transform =
216 [](
double const& time_value,
auto const& geometry,
auto const& topology,
217 auto const& constant_attributes,
auto const& variable_attributes)
220 static_assert(15 == std::numeric_limits<double>::digits10);
223<Grid Name="Grid" GridType="Uniform">
224 <Time Value="{time_value:.15g}"/>
230 "time_value"_a = time_value,
"geometry"_a = geometry,
231 "topology"_a = topology,
"fix_attributes"_a = constant_attributes,
232 "variable_attributes"_a = variable_attributes);
236 enum class time_attribute
244 auto const time_step_fn = [time_dataitem_genfn, pointer_transfrom,
246 mesh_name](
auto const& component_transform,
247 unsigned long long const time_step,
249 time_attribute
const variable)
251 return [component_transform, time_dataitem_genfn, pointer_transfrom,
252 variable, time_step, max_step, h5filename,
257 ((time_step > 0 && (variable == time_attribute::variable)) ||
261 auto dataitem = time_dataitem_genfn(time_step, max_step,
262 h5filename, mesh_name);
263 return component_transform(attr, dataitem);
267 std::array<unsigned int, 5> position = {1, 1, 2, 1, attr.index};
268 return pointer_transfrom(position);
277 auto const time_grid_transform =
278 [time_step_fn, m_bind_fn, string_join_fn, grid_transform,
279 geometry_transform, topology_transform, attribute_transform](
280 double const time,
int const step,
int const max_step,
281 auto const& geometry,
auto const& topology,
282 auto const& constant_attributes,
auto const& variable_attributes)
284 auto const time_step_geometry_transform = time_step_fn(
285 geometry_transform, step, max_step, time_attribute::constant);
286 auto const time_step_topology_transform = time_step_fn(
287 topology_transform, step, max_step, time_attribute::constant);
288 auto const time_step_const_attribute_fn = time_step_fn(
289 attribute_transform, step, max_step, time_attribute::constant);
290 auto const time_step_variable_attribute_fn = time_step_fn(
291 attribute_transform, step, max_step, time_attribute::variable);
295 auto const variable_attributes_transform =
296 m_bind_fn(time_step_variable_attribute_fn, string_join_fn);
297 auto const constant_attributes_transform =
298 m_bind_fn(time_step_const_attribute_fn, string_join_fn);
300 return grid_transform(
301 time, time_step_geometry_transform(geometry),
302 time_step_topology_transform(topology),
303 constant_attributes_transform(constant_attributes),
304 variable_attributes_transform(variable_attributes));
310 auto const temporal_grid_collection_transform =
311 [time_grid_transform](
312 auto const& times,
auto const& geometry,
auto const& topology,
313 auto const& constant_attributes,
auto const& variable_attributes)
316 auto const max_step = times.size();
317 std::vector<std::string> grids;
318 grids.reserve(max_step);
319 for (
size_t time_step = 0; time_step < max_step; ++time_step)
321 grids.push_back(time_grid_transform(
322 times[time_step], time_step, max_step, geometry, topology,
323 constant_attributes, variable_attributes));
327 "\n<Grid CollectionType=\"Temporal\" GridType=\"Collection\" "
328 "Name=\"Collection\">{grids}\n</Grid>\n"),
329 "grids"_a = fmt::join(grids,
""));
334 auto const xdmf_writer_fn = [temporal_grid_collection_transform](
335 auto ogs_version,
auto geometry,
336 auto topology,
auto constant_attributes,
337 auto variable_attributes)
342 return [temporal_grid_collection_transform,
343 ogs_version = std::move(ogs_version),
344 geometry = std::move(geometry), topology = std::move(topology),
345 constant_attributes = std::move(constant_attributes),
346 variable_attributes = std::move(variable_attributes)](
347 std::vector<double>
const& times)
350 "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<Xdmf "
351 "xmlns:xi=\"http://www.w3.org/2001/XInclude\" "
352 "Version=\"3.0\">\n<Domain>\n<Information Name=\"OGS_VERSION\" "
353 "Value=\"{ogs_version}\"/>{grid_collection}</Domain>\n</Xdmf>",
354 "ogs_version"_a = ogs_version,
355 "grid_collection"_a = temporal_grid_collection_transform(
356 times, geometry, topology, constant_attributes,