OGS
RemoveMeshComponents.cpp
Go to the documentation of this file.
1// SPDX-FileCopyrightText: Copyright (c) OpenGeoSys Community (opengeosys.org)
2// SPDX-License-Identifier: BSD-3-Clause
3
5
9#include "MeshLib/Node.h"
11
12namespace MeshToolsLib
13{
15 const MeshLib::Mesh& mesh,
16 const std::vector<std::size_t>& removed_element_ids,
17 const std::string& new_mesh_name)
18{
19 if (removed_element_ids.empty())
20 {
21 INFO("No elements to remove");
22 return nullptr;
23 }
24
25 INFO("Removing total {:d} elements...", removed_element_ids.size());
26 std::vector<MeshLib::Element*> tmp_elems =
27 BaseLib::excludeObjectCopy(mesh.getElements(), removed_element_ids);
28 INFO("{:d} elements remain in mesh.", tmp_elems.size());
29
30 // copy node and element objects
31 std::vector<MeshLib::Node*> new_nodes =
33 std::vector<MeshLib::Element*> new_elems =
34 MeshLib::copyElementVector(tmp_elems, new_nodes);
35
36 // delete unused nodes
37 MeshLib::NodeSearch ns(mesh);
38 ns.searchNodesConnectedToOnlyGivenElements(removed_element_ids);
39 auto& removed_node_ids(ns.getSearchedNodeIDs());
40 INFO("Removing total {:d} nodes...", removed_node_ids.size());
41 for (auto nodeid : removed_node_ids)
42 {
43 delete new_nodes[nodeid];
44 new_nodes[nodeid] = nullptr;
45 }
46 new_nodes.erase(std::remove(new_nodes.begin(), new_nodes.end(), nullptr),
47 new_nodes.end());
48
49 if (!new_elems.empty())
50 {
51 MeshLib::Mesh* new_mesh =
52 new MeshLib::Mesh(new_mesh_name, new_nodes, new_elems,
53 true /* compute_element_neighbors */,
55 removed_element_ids, removed_node_ids));
56 return new_mesh;
57 }
58
59 INFO("Current selection removes all elements.");
60 return nullptr;
61}
62
63std::vector<bool> markUnusedNodes(
64 std::vector<MeshLib::Element*> const& elements,
65 std::vector<MeshLib::Node*> const& nodes)
66{
67 std::vector<bool> unused_nodes(nodes.size(), true);
68 for (auto e : elements)
69 {
70 for (unsigned i = 0; i < e->getNumberOfNodes(); i++)
71 {
72 unused_nodes[getNodeIndex(*e, i)] = false;
73 }
74 }
75
76 return unused_nodes;
77}
78
79void removeMarkedNodes(std::vector<bool> const& nodes_to_delete,
80 std::vector<MeshLib::Node*>& nodes)
81{
82 assert(nodes_to_delete.size() == nodes.size());
83
84 for (std::size_t i = 0; i < nodes.size(); i++)
85 {
86 if (nodes_to_delete[i])
87 {
88 delete nodes[i];
89 nodes[i] = nullptr;
90 }
91 }
92 nodes.erase(remove(begin(nodes), end(nodes), nullptr), end(nodes));
93}
94
96 const std::vector<std::size_t>& del_nodes_idx,
97 const std::string& new_mesh_name)
98{
99 if (del_nodes_idx.empty())
100 {
101 return nullptr;
102 }
103
104 // copy node and element objects
105 std::vector<MeshLib::Node*> new_nodes =
107 std::vector<MeshLib::Element*> new_elems =
108 MeshLib::copyElementVector(mesh.getElements(), new_nodes);
109
110 // delete elements
111 MeshLib::ElementSearch es(mesh);
112 es.searchByNodeIDs(del_nodes_idx);
113 auto& removed_element_ids = es.getSearchedElementIDs();
114 for (auto eid : removed_element_ids)
115 {
116 delete new_elems[eid];
117 new_elems[eid] = nullptr;
118 }
119 new_elems.erase(std::remove(new_elems.begin(), new_elems.end(), nullptr),
120 new_elems.end());
121
122 // check unused nodes due to element deletion
123 std::vector<bool> const node_delete_flag =
124 markUnusedNodes(new_elems, new_nodes);
125
126 // delete unused nodes
127 removeMarkedNodes(node_delete_flag, new_nodes);
128
129 if (!new_elems.empty())
130 {
131 MeshLib::Mesh* new_mesh =
132 new MeshLib::Mesh(new_mesh_name, new_nodes, new_elems,
133 true /* compute_element_neighbors */,
135 removed_element_ids, del_nodes_idx));
136 return new_mesh;
137 }
138
139 return nullptr;
140}
141} // namespace MeshToolsLib
void INFO(fmt::format_string< Args... > fmt, Args &&... args)
Definition Logging.h:28
Element search class.
const std::vector< std::size_t > & getSearchedElementIDs() const
return marked elements
std::size_t searchByNodeIDs(const std::vector< std::size_t > &nodes)
Marks all elements connecting to any of the given nodes.
std::vector< Node * > const & getNodes() const
Get the nodes-vector for the mesh.
Definition Mesh.h:97
std::vector< Element * > const & getElements() const
Get the element-vector for the mesh.
Definition Mesh.h:100
Properties & getProperties()
Definition Mesh.h:125
Node search class.
Definition NodeSearch.h:18
std::size_t searchNodesConnectedToOnlyGivenElements(const std::vector< std::size_t > &elements)
const std::vector< std::size_t > & getSearchedNodeIDs() const
return marked node IDs
Definition NodeSearch.h:23
Properties excludeCopyProperties(std::vector< std::size_t > const &exclude_elem_ids, std::vector< std::size_t > const &exclude_node_ids) const
std::vector< T > excludeObjectCopy(std::vector< T > const &src_vec, std::vector< std::size_t > const &exclude_positions)
Definition Algorithm.h:35
std::vector< Node * > copyNodeVector(const std::vector< Node * > &nodes)
Creates a deep copy of a Node vector.
std::vector< Element * > copyElementVector(std::vector< Element * > const &elements, std::vector< Node * > const &new_nodes, std::vector< std::size_t > const *const node_id_map)
std::vector< bool > markUnusedNodes(std::vector< MeshLib::Element * > const &elements, std::vector< MeshLib::Node * > const &nodes)
Marks nodes not used by any of the elements.
void removeMarkedNodes(std::vector< bool > const &nodes_to_delete, std::vector< MeshLib::Node * > &nodes)
Deallocates and removes nodes marked true.
MeshLib::Mesh * removeNodes(const MeshLib::Mesh &mesh, const std::vector< std::size_t > &del_nodes_idx, const std::string &new_mesh_name)
MeshLib::Mesh * removeElements(const MeshLib::Mesh &mesh, const std::vector< std::size_t > &removed_element_ids, const std::string &new_mesh_name)