OGS
DuplicateMeshComponents.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
7
8namespace MeshLib
9{
10std::vector<Node*> copyNodeVector(const std::vector<Node*>& nodes)
11{
12 const std::size_t nNodes(nodes.size());
13 std::vector<Node*> new_nodes;
14 new_nodes.reserve(nNodes);
15 for (std::size_t k = 0; k < nNodes; ++k)
16 {
17 new_nodes.push_back(new Node(nodes[k]->data(), new_nodes.size()));
18 }
19 return new_nodes;
20}
21
22std::vector<Element*> copyElementVector(
23 std::vector<Element*> const& elements,
24 std::vector<Node*> const& new_nodes,
25 std::vector<std::size_t> const* const node_id_map)
26{
27 std::vector<Element*> new_elements;
28 new_elements.reserve(elements.size());
29 std::transform(elements.begin(), elements.end(),
30 std::back_inserter(new_elements),
31 [&new_nodes, &node_id_map](auto const& element)
32 { return copyElement(element, new_nodes, node_id_map); });
33 return new_elements;
34}
35
38template <typename E>
39Element* copyElement(Element const* const element,
40 const std::vector<Node*>& nodes,
41 std::vector<std::size_t> const* const id_map)
42{
43 unsigned const number_of_element_nodes(element->getNumberOfNodes());
44 auto** new_nodes = new Node*[number_of_element_nodes];
45 if (id_map)
46 {
47 for (unsigned i = 0; i < number_of_element_nodes; ++i)
48 {
49 new_nodes[i] = nodes[(*id_map)[element->getNode(i)->getID()]];
50 }
51 }
52 else
53 {
54 for (unsigned i = 0; i < number_of_element_nodes; ++i)
55 {
56 new_nodes[i] = nodes[element->getNode(i)->getID()];
57 }
58 }
59 return new E(new_nodes);
60}
61
62Element* copyElement(Element const* const element,
63 const std::vector<Node*>& nodes,
64 std::vector<std::size_t> const* const id_map)
65{
66 switch (element->getCellType())
67 {
68 case CellType::LINE2:
69 return copyElement<Line>(element, nodes, id_map);
70 case CellType::LINE3:
71 return copyElement<Line3>(element, nodes, id_map);
72 case CellType::TRI3:
73 return copyElement<Tri>(element, nodes, id_map);
74 case CellType::TRI6:
75 return copyElement<Tri6>(element, nodes, id_map);
76 case CellType::QUAD4:
77 return copyElement<Quad>(element, nodes, id_map);
78 case CellType::QUAD8:
79 return copyElement<Quad8>(element, nodes, id_map);
80 case CellType::QUAD9:
81 return copyElement<Quad9>(element, nodes, id_map);
82 case CellType::TET4:
83 return copyElement<Tet>(element, nodes, id_map);
84 case CellType::TET10:
85 return copyElement<Tet10>(element, nodes, id_map);
86 case CellType::HEX8:
87 return copyElement<Hex>(element, nodes, id_map);
88 case CellType::HEX20:
89 return copyElement<Hex20>(element, nodes, id_map);
91 return copyElement<Pyramid>(element, nodes, id_map);
93 return copyElement<Pyramid13>(element, nodes, id_map);
95 return copyElement<Prism>(element, nodes, id_map);
97 return copyElement<Prism15>(element, nodes, id_map);
98 default:
99 {
100 ERR("Error: Unknown cell type.");
101 return nullptr;
102 }
103 }
104}
105
106std::vector<Element*> cloneElements(std::vector<Element*> const& elements)
107{
108 std::vector<Element*> cloned_elements;
109 cloned_elements.reserve(elements.size());
110 std::transform(begin(elements), end(elements),
111 std::back_inserter(cloned_elements),
112 [](Element const* const e) { return e->clone(); });
113 return cloned_elements;
114}
115
116} // namespace MeshLib
void ERR(fmt::format_string< Args... > fmt, Args &&... args)
Definition Logging.h:40
std::size_t getID() const
virtual CellType getCellType() const =0
virtual unsigned getNumberOfNodes() const =0
virtual Element * clone() const =0
virtual const Node * getNode(unsigned idx) const =0
std::vector< Node * > copyNodeVector(const std::vector< Node * > &nodes)
Creates a deep copy of a Node vector.
Element * copyElement(Element const *const element, const std::vector< Node * > &nodes, std::vector< std::size_t > const *const id_map)
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< Element * > cloneElements(std::vector< Element * > const &elements)
Clones a vector of elements using the Element::clone() function.