OGS
anonymous_namespace{IdentifySubdomainMesh.cpp} Namespace Reference

Functions

std::vector< std::size_t > identifySubdomainMeshNodes (MeshLib::Mesh const &subdomain_mesh, MeshGeoToolsLib::MeshNodeSearcher const &mesh_node_searcher)
std::vector< std::size_t > findElementsInMesh (std::vector< std::size_t > const &node_ids, std::vector< std::vector< std::size_t > > const &connected_element_ids_per_node)
std::vector< std::vector< std::size_t > > identifySubdomainMeshElements (MeshLib::Mesh const &subdomain_mesh, MeshLib::Mesh const &bulk_mesh)
void updateOrCheckExistingSubdomainProperty (MeshLib::Mesh &mesh, std::string_view property_name, std::vector< std::size_t > const &values, MeshLib::MeshItemType const mesh_item_type, bool const force_overwrite)
 Updates or checks the existing mesh's property with the given values.

Function Documentation

◆ findElementsInMesh()

std::vector< std::size_t > anonymous_namespace{IdentifySubdomainMesh.cpp}::findElementsInMesh ( std::vector< std::size_t > const & node_ids,
std::vector< std::vector< std::size_t > > const & connected_element_ids_per_node )

Find all elements which consist of all of the given node ids.

Note
It is recommended to include only base nodes of elements into the search node_ids.

Definition at line 47 of file IdentifySubdomainMesh.cpp.

50{
51 //
52 // Count how often an element is shared by all nodes.
53 //
54 std::unordered_map<std::size_t, int> element_counts(8);
55 for (auto const node_id : node_ids)
56 {
57 for (auto const element_id : connected_element_ids_per_node[node_id])
58 {
59 element_counts[element_id]++;
60 }
61 }
62
63 //
64 // Elements which are shared by as many nodes as the input nodes are the
65 // desired elements.
66 //
67 auto const nnodes = node_ids.size();
68 std::vector<std::size_t> element_ids;
69 for (auto const& pair : element_counts)
70 {
71 if (pair.second == static_cast<int>(nnodes))
72 {
73 element_ids.push_back(pair.first);
74 }
75 }
76
77 return element_ids;
78}

Referenced by identifySubdomainMeshElements().

◆ identifySubdomainMeshElements()

std::vector< std::vector< std::size_t > > anonymous_namespace{IdentifySubdomainMesh.cpp}::identifySubdomainMeshElements ( MeshLib::Mesh const & subdomain_mesh,
MeshLib::Mesh const & bulk_mesh )

Tries to find all elements' ids in the bulk mesh. The subdomain elements' nodes are mapped to the bulk mesh and are then used to identify the bulk mesh elements.

Definition at line 83 of file IdentifySubdomainMesh.cpp.

85{
86 auto const& bulk_node_ids = *MeshLib::bulkNodeIDs(subdomain_mesh);
87
88 // Allocate space for all elements for random insertion.
89 std::vector<std::vector<std::size_t>> bulk_element_ids_map(
90 subdomain_mesh.getNumberOfElements());
91
92 // For each node a vector of connected element ids of that node.
93 std::vector<std::vector<std::size_t>> connected_element_ids_per_node(
94 bulk_mesh.getNumberOfNodes());
95 for (auto const node_id : bulk_mesh.getNodes() | MeshLib::views::ids)
96 {
97 connected_element_ids_per_node[node_id] =
98 bulk_mesh.getElementsConnectedToNode(node_id) |
99 MeshLib::views::ids | ranges::to<std::vector>;
100 }
101
102 auto const& elements = subdomain_mesh.getElements();
103#pragma omp parallel for
104 for (std::ptrdiff_t j = 0; j < std::ssize(elements); ++j)
105 {
106 auto* const e = elements[j];
107 std::vector<std::size_t> element_node_ids(e->getNumberOfBaseNodes());
108 for (unsigned n = 0; n < e->getNumberOfBaseNodes(); ++n)
109 {
110 element_node_ids[n] = MeshLib::getNodeIndex(*e, n);
111 }
112 std::vector<std::size_t> element_node_ids_bulk(
113 e->getNumberOfBaseNodes());
114 std::transform(begin(element_node_ids), end(element_node_ids),
115 begin(element_node_ids_bulk),
116 [&bulk_node_ids](std::size_t const id)
117 { return bulk_node_ids[id]; });
118
119 std::vector<std::size_t> bulk_element_ids = findElementsInMesh(
120 element_node_ids_bulk, connected_element_ids_per_node);
121
122 if (bulk_element_ids.empty())
123 {
124 ERR("No element could be found for the subdomain element {:d}. "
125 "Corresponding bulk mesh node ids are:",
126 e->getID());
127 for (auto const i : element_node_ids_bulk)
128 {
129 ERR("\t{:d}", i);
130 }
131 OGS_FATAL(
132 "Expect at least one element to be found in the bulk mesh.");
133 }
134
135 bulk_element_ids_map[e->getID()] = std::move(bulk_element_ids);
136 }
137
138 return bulk_element_ids_map;
139}
#define OGS_FATAL(...)
Definition Error.h:19
void ERR(fmt::format_string< Args... > fmt, Args &&... args)
Definition Logging.h:40
constexpr ranges::views::view_closure ids
For an element of a range view return its id.
Definition Mesh.h:216
std::size_t getNodeIndex(Element const &element, unsigned const idx)
Definition Element.cpp:226
PropertyVector< std::size_t > const * bulkNodeIDs(Mesh const &mesh)
Definition Mesh.cpp:282
std::vector< std::size_t > findElementsInMesh(std::vector< std::size_t > const &node_ids, std::vector< std::vector< std::size_t > > const &connected_element_ids_per_node)

References MeshLib::bulkNodeIDs(), ERR(), findElementsInMesh(), MeshLib::Mesh::getElements(), MeshLib::Mesh::getElementsConnectedToNode(), MeshLib::getNodeIndex(), MeshLib::Mesh::getNodes(), MeshLib::Mesh::getNumberOfElements(), MeshLib::Mesh::getNumberOfNodes(), MeshLib::views::ids, and OGS_FATAL.

◆ identifySubdomainMeshNodes()

std::vector< std::size_t > anonymous_namespace{IdentifySubdomainMesh.cpp}::identifySubdomainMeshNodes ( MeshLib::Mesh const & subdomain_mesh,
MeshGeoToolsLib::MeshNodeSearcher const & mesh_node_searcher )

Find one-to-one mapping of subdomain nodes to the bulk mesh nodes and returns the map of ids.

Definition at line 20 of file IdentifySubdomainMesh.cpp.

23{
24 // Convert nodes pointers needed for the mesh_node_searcher algorithm.
25 auto const& nodes = subdomain_mesh.getNodes();
26 std::vector<MathLib::Point3dWithID*> subdomain_points{begin(nodes),
27 end(nodes)};
28
29 auto const& bulk_node_ids =
30 mesh_node_searcher.getMeshNodeIDs(subdomain_points);
31
32 if (bulk_node_ids.size() != subdomain_mesh.getNumberOfNodes())
33 {
35 "Expected to find exactly one node in the bulk mesh for each node "
36 "of the subdomain; Found {:d} nodes in the bulk mesh out of {:d} "
37 "nodes in the subdomain.",
38 bulk_node_ids.size(), subdomain_mesh.getNumberOfNodes());
39 }
40
41 return bulk_node_ids;
42}

References MeshGeoToolsLib::MeshNodeSearcher::getMeshNodeIDs(), MeshLib::Mesh::getNodes(), MeshLib::Mesh::getNumberOfNodes(), and OGS_FATAL.

◆ updateOrCheckExistingSubdomainProperty()

void anonymous_namespace{IdentifySubdomainMesh.cpp}::updateOrCheckExistingSubdomainProperty ( MeshLib::Mesh & mesh,
std::string_view property_name,
std::vector< std::size_t > const & values,
MeshLib::MeshItemType const mesh_item_type,
bool const force_overwrite )

Updates or checks the existing mesh's property with the given values.

Definition at line 142 of file IdentifySubdomainMesh.cpp.

146{
147 auto& properties = mesh.getProperties();
148 if (!properties.existsPropertyVector<std::size_t>(property_name,
149 mesh_item_type, 1))
150 {
151 addPropertyToMesh<std::size_t>(mesh, property_name, mesh_item_type, 1,
152 {values});
153 return;
154 }
155
156 //
157 // Check the existing property against new values.
158 //
159 auto& original_property =
160 *properties.getPropertyVector<std::size_t>(property_name);
161 if (ranges::equal(original_property, values))
162 {
163 INFO(
164 "There is already a '{:s}' property present in the subdomain mesh "
165 "'{:s}' and it is equal to the newly computed values.",
166 property_name, mesh.getName());
167 return;
168 }
169
170 //
171 // Property differs. Notify and update if forced.
172 //
173 WARN(
174 "There is already a '{:s}' property present in the subdomain mesh "
175 "'{:s}' and it is not equal to the newly computed values.",
176 property_name,
177 mesh.getName());
178
179 if (!force_overwrite)
180 {
181 OGS_FATAL("The force overwrite flag was not specified, exiting.");
182 }
183
184 INFO("Overwriting '{:s}' property.", property_name);
185 original_property.assign(values);
186}
void INFO(fmt::format_string< Args... > fmt, Args &&... args)
Definition Logging.h:28
void WARN(fmt::format_string< Args... > fmt, Args &&... args)
Definition Logging.h:34
Properties & getProperties()
Definition Mesh.h:125
const std::string getName() const
Get name of the mesh.
Definition Mesh.h:94
PropertyVector< T > const * getPropertyVector(std::string_view name) const

References MeshLib::Mesh::getName(), MeshLib::Mesh::getProperties(), MeshLib::Properties::getPropertyVector(), INFO(), OGS_FATAL, and WARN().