23 std::vector<std::unique_ptr<MeshLib::Mesh>>
const& meshes,
24 std::vector<std::string>
const& mesh_names_for_output)
26 std::map<std::string, std::reference_wrapper<MeshLib::Mesh>>
27 map_mesh_name_to_mesh;
28 for (
auto const& mesh : meshes)
30 auto const [it, inserted] =
31 map_mesh_name_to_mesh.emplace(mesh->getName(), *mesh);
35 OGS_FATAL(
"Duplicate mesh name '{}' detected.", mesh->getName());
39 std::vector<std::reference_wrapper<MeshLib::Mesh>> meshes_filtered;
41 for (
auto const& mesh_name : mesh_names_for_output)
44 map_mesh_name_to_mesh, mesh_name,
45 "A mesh that has been requested for output is not known to OGS.");
47 meshes_filtered.push_back(mesh);
50 return meshes_filtered;
90 std::vector<std::reference_wrapper<MeshLib::Mesh>>
const& submesh_refs)
93 auto const sum_elements_submeshes = [&submesh_refs]()
96 for (
auto const& submesh_ref : submesh_refs)
98 n += submesh_ref.get().getNumberOfElements();
103 if (n_elements_bulk != sum_elements_submeshes)
106 "The number of bulk mesh elements does not match the sum of all "
107 "submesh elements: {} != {}. Hence, the set of all submeshes "
108 "cannot be a non-overlapping cover of the bulk mesh.",
109 n_elements_bulk, sum_elements_submeshes);
115 std::vector<std::reference_wrapper<MeshLib::Mesh>>
const& submesh_refs)
119 std::vector<bool> bulk_element_covered(n_elements_bulk);
121 for (
auto const& submesh_ref : submesh_refs)
123 auto const& submesh = submesh_ref.get();
124 auto const& bulk_element_ids = bulkElementIDs(submesh);
125 if (bulk_element_ids ==
nullptr)
128 "The 'bulk_element_ids' property does not exist on the submesh "
133 if (bulk_element_ids->size() != submesh.getNumberOfElements())
136 "There is something terribly wrong with the mesh '{}'. The "
137 "size of 'bulk_element_ids' does not equal the number of "
138 "elements in the mesh: {} != {}",
139 submesh.getName(), bulk_element_ids->size(),
140 submesh.getNumberOfElements());
143 for (
auto const bulk_element_id : *bulk_element_ids)
147 [[unlikely]]
if (bulk_element_id >= n_elements_bulk)
150 "Saw bulk element id {} in submesh '{}', but the bulk mesh "
151 "('{}') has only {} elements, i.e., the maximum allowed "
152 "bulk element id is {}.",
153 bulk_element_id, submesh.getName(), bulk_mesh.
getName(),
154 n_elements_bulk, n_elements_bulk - 1);
157 [[unlikely]]
if (bulk_element_covered[bulk_element_id])
160 "The bulk element id {} has already been covered by "
161 "another submesh. The second submesh covering this bulk "
163 bulk_element_id, submesh.getName());
166 bulk_element_covered[bulk_element_id] =
true;
170 return bulk_element_covered;
175 std::vector<std::reference_wrapper<MeshLib::Mesh>>
const& submesh_refs)
181 std::vector<bool>
const bulk_element_covered =
184 auto const n_elements_covered =
185 std::accumulate(bulk_element_covered.begin(),
186 bulk_element_covered.end(), std::size_t{0});
188 if (n_elements_covered == n_elements_bulk)
194 auto const non_covered_it = std::find(bulk_element_covered.begin(),
195 bulk_element_covered.end(),
false);
196 auto const non_covered_index =
197 std::distance(bulk_element_covered.begin(), non_covered_it);
200 "The bulk mesh ('{}') is not covered completely by the given "
201 "submeshes. Only {} out of {} elements are covered. The first element "
202 "that is not covered is #{}.",
203 bulk_mesh.
getName(), n_elements_covered, n_elements_bulk,