OGS
DuplicateMeshComponents.cpp
Go to the documentation of this file.
1 
16 
18 #include "MeshLib/Mesh.h"
19 
20 namespace MeshLib
21 {
22 std::vector<Node*> copyNodeVector(const std::vector<Node*>& nodes)
23 {
24  const std::size_t nNodes(nodes.size());
25  std::vector<Node*> new_nodes;
26  new_nodes.reserve(nNodes);
27  for (std::size_t k = 0; k < nNodes; ++k)
28  {
29  new_nodes.push_back(new Node(nodes[k]->getCoords(), new_nodes.size()));
30  }
31  return new_nodes;
32 }
33 
34 std::vector<Element*> copyElementVector(
35  std::vector<Element*> const& elements,
36  std::vector<Node*> const& new_nodes,
37  std::vector<std::size_t> const* const node_id_map)
38 {
39  std::vector<Element*> new_elements;
40  new_elements.reserve(elements.size());
41  std::transform(elements.begin(), elements.end(),
42  std::back_inserter(new_elements),
43  [&new_nodes, &node_id_map](auto const& element)
44  { return copyElement(element, new_nodes, node_id_map); });
45  return new_elements;
46 }
47 
50 template <typename E>
51 Element* copyElement(Element const* const element,
52  const std::vector<Node*>& nodes,
53  std::vector<std::size_t> const* const id_map)
54 {
55  unsigned const number_of_element_nodes(element->getNumberOfNodes());
56  auto** new_nodes = new Node*[number_of_element_nodes];
57  if (id_map)
58  {
59  for (unsigned i = 0; i < number_of_element_nodes; ++i)
60  {
61  new_nodes[i] = nodes[(*id_map)[element->getNode(i)->getID()]];
62  }
63  }
64  else
65  {
66  for (unsigned i = 0; i < number_of_element_nodes; ++i)
67  {
68  new_nodes[i] = nodes[element->getNode(i)->getID()];
69  }
70  }
71  return new E(new_nodes);
72 }
73 
74 Element* copyElement(Element const* const element,
75  const std::vector<Node*>& nodes,
76  std::vector<std::size_t> const* const id_map)
77 {
78  switch (element->getCellType())
79  {
80  case CellType::LINE2:
81  return copyElement<Line>(element, nodes, id_map);
82  case CellType::LINE3:
83  return copyElement<Line3>(element, nodes, id_map);
84  case CellType::TRI3:
85  return copyElement<Tri>(element, nodes, id_map);
86  case CellType::TRI6:
87  return copyElement<Tri6>(element, nodes, id_map);
88  case CellType::QUAD4:
89  return copyElement<Quad>(element, nodes, id_map);
90  case CellType::QUAD8:
91  return copyElement<Quad8>(element, nodes, id_map);
92  case CellType::QUAD9:
93  return copyElement<Quad9>(element, nodes, id_map);
94  case CellType::TET4:
95  return copyElement<Tet>(element, nodes, id_map);
96  case CellType::TET10:
97  return copyElement<Tet10>(element, nodes, id_map);
98  case CellType::HEX8:
99  return copyElement<Hex>(element, nodes, id_map);
100  case CellType::HEX20:
101  return copyElement<Hex20>(element, nodes, id_map);
102  case CellType::PYRAMID5:
103  return copyElement<Pyramid>(element, nodes, id_map);
104  case CellType::PYRAMID13:
105  return copyElement<Pyramid13>(element, nodes, id_map);
106  case CellType::PRISM6:
107  return copyElement<Prism>(element, nodes, id_map);
108  case CellType::PRISM15:
109  return copyElement<Prism15>(element, nodes, id_map);
110  default:
111  {
112  ERR("Error: Unknown cell type.");
113  return nullptr;
114  }
115  }
116 }
117 
118 std::vector<Element*> cloneElements(std::vector<Element*> const& elements)
119 {
120  std::vector<Element*> cloned_elements;
121  cloned_elements.reserve(elements.size());
122  std::transform(begin(elements), end(elements),
123  std::back_inserter(cloned_elements),
124  [](Element* const e) { return e->clone(); });
125  return cloned_elements;
126 }
127 
128 } // namespace MeshLib
Definition of Duplicate functions.
void ERR(char const *fmt, Args const &... args)
Definition: Logging.h:42
Definition of the Mesh class.
std::size_t getID() const
Definition: Point3dWithID.h:62
virtual const Node * getNode(unsigned idx) const =0
virtual unsigned getNumberOfNodes() const =0
virtual Element * clone() 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.