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 52 of file IdentifySubdomainMesh.cpp.

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

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 88 of file IdentifySubdomainMesh.cpp.

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

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

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 147 of file IdentifySubdomainMesh.cpp.

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

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