5 #include <spdlog/fmt/bundled/core.h>
6 #include <spdlog/fmt/bundled/format.h>
16 #include <string_view>
28 using namespace fmt::literals;
36 "Cell",
"IntegrationPoint"};
40 std::optional<MeshItemType>
const& item_type)
46 OGS_FATAL(
"Cannot convert an empty optional mesh item type.");
54 ogs_to_xdmf_type = {};
63 return ogs_to_xdmf_type;
86 return property_sizes;
102 std::vector<XdmfData>
const& constant_attributes,
103 std::vector<XdmfData>
const& variable_attributes,
104 std::string
const& h5filename, std::string
const&
ogs_version,
105 std::string
const& mesh_name)
111 auto const time_dataitem_genfn =
112 [](
unsigned long long const time_step,
int const max_step,
113 std::string
const& h5filename, std::string
const& mesh_name)
116 [time_step, max_step, h5filename, mesh_name](
auto const& xdmfdata)
119 "\n\t\t<DataItem DataType=\"{datatype}\" "
120 "Dimensions=\"{local_dimensions}\" "
122 "Precision=\"{precision}\">"
123 "{filename}:meshes/{meshname}/{datasetname}|"
124 "{time_step} {starts}:1 {strides}:1 "
125 "{local_dimensions}:{max_step} "
126 "{global_dimensions}</"
129 "local_dimensions"_a =
130 fmt::join(xdmfdata.global_block_dims,
" "),
132 "filename"_a = h5filename,
133 "meshname"_a = mesh_name,
134 "datasetname"_a = xdmfdata.name,
135 "starts"_a = fmt::join(xdmfdata.starts,
" "),
136 "strides"_a = fmt::join(xdmfdata.strides,
" "),
137 "global_dimensions"_a =
138 fmt::join(xdmfdata.global_block_dims,
" "),
145 auto const string_join_fn = [](
auto const& collection)
146 {
return fmt::to_string(fmt::join(collection,
"")); };
149 auto const m_bind_fn = [](
auto const& transform,
auto const& join)
151 return [join, transform](
auto const& collection)
153 std::vector<std::string> temp;
154 temp.reserve(collection.size());
155 std::transform(collection.begin(), collection.end(),
156 std::back_inserter(temp), transform);
164 auto const pointer_transfrom = [](
auto const& elements)
167 "\n\t<xi:include xpointer=\"element(/{elements})\"/>",
168 "elements"_a = fmt::join(elements,
"/"));
173 auto const attribute_transform =
174 [](
XdmfData const& attribute,
auto const& dataitem_transform)
177 "\n\t<Attribute Center=\"{center}\" ElementCell=\"\" "
178 "ElementDegree=\"0\" "
179 "ElementFamily=\"\" ItemType=\"\" Name=\"{name}\" "
180 "Type=\"None\">{dataitem}\n\t</Attribute>",
182 "name"_a = attribute.
name,
183 "dataitem"_a = dataitem_transform(attribute));
187 auto const geometry_transform =
188 [](
XdmfData const& geometry,
auto const& dataitem_transform)
191 "\n\t<Geometry Origin=\"\" Type=\"XYZ\">{dataitem}\n\t</Geometry>",
192 "dataitem"_a = dataitem_transform(geometry));
196 auto const topology_transform =
197 [](
XdmfData const& topology,
auto const& dataitem_transform)
200 "\n\t<Topology Dimensions=\"{dimensions}\" "
201 "Type=\"Mixed\">{dataitem}\n\t</Topology>",
202 "dataitem"_a = dataitem_transform(topology),
208 auto const grid_transform =
209 [](
double const& time_value,
auto const& geometry,
auto const& topology,
210 auto const& constant_attributes,
auto const& variable_attributes)
213 "\n<Grid Name=\"Grid\">\n\t<Time "
214 "Value=\"{time_value}\"/"
215 ">{geometry}{topology}{fix_attributes}{variable_attributes}\n</"
217 "time_value"_a = time_value,
"geometry"_a = geometry,
218 "topology"_a = topology,
"fix_attributes"_a = constant_attributes,
219 "variable_attributes"_a = variable_attributes);
223 enum class time_attribute
231 auto const time_step_fn = [time_dataitem_genfn, pointer_transfrom,
233 mesh_name](
auto const& component_transform,
234 unsigned long long const time_step,
236 time_attribute
const variable)
238 return [component_transform, time_dataitem_genfn, pointer_transfrom,
239 variable, time_step, max_step, h5filename,
244 ((time_step > 0 && (variable == time_attribute::variable)) ||
248 auto dataitem = time_dataitem_genfn(time_step, max_step,
249 h5filename, mesh_name);
250 return component_transform(attr, dataitem);
254 std::array<unsigned int, 5> position = {1, 1, 2, 1, attr.index};
255 return pointer_transfrom(position);
264 auto const time_grid_transform =
265 [time_step_fn, m_bind_fn, string_join_fn, grid_transform,
266 geometry_transform, topology_transform, attribute_transform](
267 double const time,
int const step,
int const max_step,
268 auto const& geometry,
auto const& topology,
269 auto const& constant_attributes,
auto const& variable_attributes)
271 auto const time_step_geometry_transform = time_step_fn(
272 geometry_transform, step, max_step, time_attribute::constant);
273 auto const time_step_topology_transform = time_step_fn(
274 topology_transform, step, max_step, time_attribute::constant);
275 auto const time_step_const_attribute_fn = time_step_fn(
276 attribute_transform, step, max_step, time_attribute::constant);
277 auto const time_step_variable_attribute_fn = time_step_fn(
278 attribute_transform, step, max_step, time_attribute::variable);
282 auto const variable_attributes_transform =
283 m_bind_fn(time_step_variable_attribute_fn, string_join_fn);
284 auto const constant_attributes_transform =
285 m_bind_fn(time_step_const_attribute_fn, string_join_fn);
287 return grid_transform(
288 time, time_step_geometry_transform(geometry),
289 time_step_topology_transform(topology),
290 constant_attributes_transform(constant_attributes),
291 variable_attributes_transform(variable_attributes));
297 auto const temporal_grid_collection_transform =
298 [time_grid_transform](
299 auto const& times,
auto const& geometry,
auto const& topology,
300 auto const& constant_attributes,
auto const& variable_attributes)
303 auto const max_step = times.size();
304 std::vector<std::string> grids;
305 grids.reserve(max_step);
306 for (
size_t time_step = 0; time_step < max_step; ++time_step)
308 grids.push_back(time_grid_transform(
309 times[time_step], time_step, max_step, geometry, topology,
310 constant_attributes, variable_attributes));
313 "\n<Grid CollectionType=\"Temporal\" GridType=\"Collection\" "
314 "Name=\"Collection\">{grids}\n</Grid>\n",
315 "grids"_a = fmt::join(grids,
""));
320 auto const xdmf_writer_fn = [temporal_grid_collection_transform](
322 auto topology,
auto constant_attributes,
323 auto variable_attributes)
328 return [temporal_grid_collection_transform,
330 geometry = std::move(geometry), topology = std::move(topology),
331 constant_attributes = std::move(constant_attributes),
332 variable_attributes = std::move(variable_attributes)](
333 std::vector<double>
const& times)
336 "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<Xdmf "
337 "xmlns:xi=\"http://www.w3.org/2001/XInclude\" "
338 "Version=\"3.0\">\n<Domain>\n<Information Name=\"OGS_VERSION\" "
339 "Value=\"{ogs_version}\"/>{grid_collection}</Domain>\n</Xdmf>",
341 "grid_collection"_a = temporal_grid_collection_transform(
342 times, geometry, topology, constant_attributes,
343 variable_attributes));
347 return xdmf_writer_fn(
ogs_version, geometry, topology, constant_attributes,
348 variable_attributes);
constexpr auto to_underlying(E e) noexcept
Converts an enumeration to its underlying type.
std::string format(const char *format_str,...)
GITINFOLIB_EXPORT const std::string ogs_version
static std::string getPropertyDataTypeString(MeshPropertyDataType const &ogs_data_type)
static auto meshPropertyDatatypeString()
static std::string meshItemTypeString(std::optional< MeshItemType > const &item_type)
constexpr char const * mesh_item_type_strings[]
static std::string getPropertyDataTypeSize(MeshPropertyDataType const &ogs_data_type)
std::function< std::string(std::vector< double >)> write_xdmf(XdmfData const &geometry, XdmfData const &topology, std::vector< XdmfData > const &constant_attributes, std::vector< XdmfData > const &variable_attributes, std::string const &h5filename, std::string const &ogs_version, std::string const &mesh_name)
Generator function that creates a function capturing the spatial data of a mesh Temporal data can lat...
static constexpr auto meshPropertyDatatypeSize()
std::optional< MeshLib::MeshItemType > attribute_center
std::vector< XdmfDimType > global_block_dims
write_xdmf generates a function based on spatial mesh data. The generated function finally generates ...