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 for (auto* const e : subdomain_mesh.getElements())
107 {
108 std::vector<std::size_t> element_node_ids(e->getNumberOfBaseNodes());
109 for (unsigned n = 0; n < e->getNumberOfBaseNodes(); ++n)
110 {
111 element_node_ids[n] = MeshLib::getNodeIndex(*e, n);
112 }
113 std::vector<std::size_t> element_node_ids_bulk(
114 e->getNumberOfBaseNodes());
115 std::transform(begin(element_node_ids), end(element_node_ids),
116 begin(element_node_ids_bulk),
117 [&bulk_node_ids](std::size_t const id)
118 { return bulk_node_ids[id]; });
119
120 std::vector<std::size_t> bulk_element_ids = findElementsInMesh(
121 element_node_ids_bulk, connected_element_ids_per_node);
122
123 if (bulk_element_ids.empty())
124 {
125 ERR("No element could be found for the subdomain element {:d}. "
126 "Corresponding bulk mesh node ids are:",
127 e->getID());
128 for (auto const i : element_node_ids_bulk)
129 {
130 ERR("\t{:d}", i);
131 }
132 OGS_FATAL(
133 "Expect at least one element to be found in the bulk mesh.");
134 }
135
136 bulk_element_ids_map[e->getID()] = std::move(bulk_element_ids);
137 }
138
139 return bulk_element_ids_map;
140}
#define OGS_FATAL(...)
Definition Error.h:26
std::vector< std::size_t > getNodes(GeoLib::Point const &pnt, std::vector< MeshLib::Node * > const &nodes, MeshLib::PropertyVector< int > const &mat_ids, std::pair< int, int > const &mat_limits, std::pair< double, double > const &elevation_limits, MeshLib::Mesh const &mesh)
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 143 of file IdentifySubdomainMesh.cpp.

147{
148 auto& properties = mesh.getProperties();
149 if (!properties.existsPropertyVector<std::size_t>(property_name))
150 {
151 addPropertyToMesh(mesh, property_name, mesh_item_type, 1, values);
152 return;
153 }
154
155 //
156 // Check the existing property against new values.
157 //
158 auto& original_property =
159 *properties.getPropertyVector<std::size_t>(property_name);
160 if (std::equal(begin(original_property), end(original_property),
161 begin(values), end(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.resize(values.size());
186 std::copy(begin(values), end(values), begin(original_property));
187}
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

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