Write xdmf and h5 file with geometry and topology data.
52 std::function<bool(HdfData)>
const is_variable_hdf_attribute =
53 [&variable_output_names](
54 bool outputnames) -> std::function<
bool(HdfData)>
58 return [&variable_output_names](HdfData
const& data) ->
bool
60 return std::find(variable_output_names.begin(),
61 variable_output_names.end(),
62 data.name) != variable_output_names.end();
67 return [](HdfData
const&) ->
bool {
return true; };
69 }(!variable_output_names.empty());
71 auto is_variable_xdmf_attribute =
72 [&variable_output_names](XdmfData
const& data) ->
bool
74 return std::find(variable_output_names.begin(),
75 variable_output_names.end(),
76 data.name) != variable_output_names.end();
81 auto const transform_ogs_mesh_data_to_xdmf_conforming_data =
82 [&n_files](
auto const& mesh)
86 XdmfHdfData
const& geometry =
88 auto const flattened_topology_values =
90 return std::make_unique<TransformedMeshData>(
91 TransformedMeshData{std::move(flattened_geometry_values),
92 std::move(flattened_topology_values)});
96 auto const transform_to_meta_data =
97 [&transform_ogs_mesh_data_to_xdmf_conforming_data,
98 &n_files](
auto const& mesh)
102 std::unique_ptr<TransformedMeshData> xdmf_conforming_data =
103 transform_ogs_mesh_data_to_xdmf_conforming_data(mesh);
105 mesh, xdmf_conforming_data->flattened_geometry_values.data(),
108 xdmf_conforming_data->flattened_topology_values, n_files);
110 return XdmfHdfMesh{std::move(geometry), std::move(topology),
111 std::move(attributes), mesh.get().getName(),
112 std::move(xdmf_conforming_data)};
116 auto const transform_metamesh_to_hdf =
117 [&is_variable_hdf_attribute](
auto const& metamesh)
120 std::vector<HdfData> hdf_data_attributes = {metamesh.geometry.hdf,
121 metamesh.topology.hdf};
123 hdf_data_attributes.reserve(hdf_data_attributes.size() +
124 metamesh.attributes.size());
125 std::transform(metamesh.attributes.begin(), metamesh.attributes.end(),
126 std::back_inserter(hdf_data_attributes),
127 [](XdmfHdfData att) -> HdfData { return att.hdf; });
130 std::copy_if(hdf_data_attributes.begin(), hdf_data_attributes.end(),
131 back_inserter(constant_attributes),
132 std::not_fn(is_variable_hdf_attribute));
134 std::copy_if(hdf_data_attributes.begin(), hdf_data_attributes.end(),
135 back_inserter(variable_attributes),
136 is_variable_hdf_attribute);
139 .constant_attributes = std::move(constant_attributes),
140 .variable_attributes = std::move(variable_attributes),
141 .name = std::move(metamesh.name)};
145 std::vector<XdmfHdfMesh> xdmf_hdf_meshes;
146 xdmf_hdf_meshes.reserve(meshes.size());
147 std::transform(meshes.begin(), meshes.end(),
148 std::back_inserter(xdmf_hdf_meshes), transform_to_meta_data);
150 std::vector<MeshHdfData> hdf_meshes;
151 hdf_meshes.reserve(xdmf_hdf_meshes.size());
152 std::transform(xdmf_hdf_meshes.begin(), xdmf_hdf_meshes.end(),
153 std::back_inserter(hdf_meshes), transform_metamesh_to_hdf);
156 std::filesystem::path
const hdf_filepath =
157 filepath.parent_path() / (filepath.stem().string() +
".h5");
160 _hdf_writer = std::make_unique<HdfWriter>(std::move(hdf_meshes), time_step,
161 hdf_filepath, use_compression,
162 is_file_manager, n_files);
166 if (!is_file_manager)
173 auto const transform_metamesh_to_xdmf =
174 [&is_variable_xdmf_attribute, &filepath, &hdf_filepath,
175 &initial_time](XdmfHdfMesh& metamesh)
177 std::string
const xdmf_name = metamesh.name;
178 std::filesystem::path
const xdmf_filepath =
179 filepath.parent_path() /
180 (filepath.stem().string() +
"_" + xdmf_name +
".xdmf");
182 std::vector<XdmfData> xdmf_attributes;
183 std::transform(metamesh.attributes.begin(), metamesh.attributes.end(),
184 std::back_inserter(xdmf_attributes),
185 [](XdmfHdfData
const& att) -> XdmfData
186 { return att.xdmf; });
188 for (std::size_t i = 0; i < metamesh.attributes.size(); ++i)
192 xdmf_attributes[i].index = i + 4;
195 std::vector<XdmfData> xdmf_variable_attributes;
196 std::copy_if(xdmf_attributes.begin(), xdmf_attributes.end(),
197 back_inserter(xdmf_variable_attributes),
198 is_variable_xdmf_attribute);
199 std::vector<XdmfData> xdmf_constant_attributes;
200 std::copy_if(xdmf_attributes.begin(), xdmf_attributes.end(),
201 back_inserter(xdmf_constant_attributes),
202 std::not_fn(is_variable_xdmf_attribute));
204 auto const xdmf_writer_fn =
205 write_xdmf(metamesh.geometry.xdmf, metamesh.topology.xdmf,
206 xdmf_constant_attributes, xdmf_variable_attributes,
207 hdf_filepath.filename().string(),
209 auto xdmf_writer = std::make_unique<XdmfWriter>(xdmf_filepath.string(),
211 xdmf_writer->addTimeStep(initial_time);
215 std::transform(xdmf_hdf_meshes.begin(), xdmf_hdf_meshes.end(),
217 transform_metamesh_to_xdmf);
std::unique_ptr< HdfWriter > _hdf_writer
std::vector< std::unique_ptr< XdmfWriter > > _xdmf_writer
GITINFOLIB_EXPORT const std::string ogs_version
std::vector< XdmfHdfData > transformAttributes(MeshLib::Mesh const &mesh, unsigned int const n_files)
Create meta data for attributes used for hdf5 and xdmf.
XdmfHdfData transformGeometry(MeshLib::Mesh const &mesh, double const *data_ptr, unsigned int const n_files)
Create meta data for geometry used for hdf5 and xdmf.
std::vector< int > transformToXDMFTopology(MeshLib::Mesh const &mesh, std::size_t const offset)
Copies all cells into a new vector. Contiguous data used for writing. The topology is specific to xdm...
std::vector< double > transformToXDMFGeometry(MeshLib::Mesh const &mesh)
Copies all node points into a new vector. Contiguous data used for writing. Conform with XDMF standar...
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...
std::vector< HdfData > HDFAttributes
XdmfHdfData transformTopology(std::vector< int > const &values, unsigned int const n_files)
Create meta data for topology used for HDF5 and XDMF.