OGS
FlipElements.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
4#include "FlipElements.h"
5
10#include "MeshLib/Node.h"
12
13namespace MeshToolsLib
14{
15std::unique_ptr<MeshLib::Element> createFlippedElement(
16 MeshLib::Element const& elem, std::vector<MeshLib::Node*> const& nodes)
17{
18 if (elem.getDimension() > 2)
19 {
20 return nullptr;
21 }
22
23 unsigned const n_nodes(elem.getNumberOfNodes());
24 auto elem_nodes = std::make_unique<MeshLib::Node*[]>(n_nodes);
25 for (unsigned i = 0; i < n_nodes; ++i)
26 {
27 elem_nodes[i] = nodes[elem.getNode(i)->getID()];
28 }
29 std::swap(elem_nodes[0], elem_nodes[1]);
30
32 {
33 return std::make_unique<MeshLib::Line>(elem_nodes.release(),
34 elem.getID());
35 }
37 {
38 return std::make_unique<MeshLib::Tri>(elem_nodes.release(),
39 elem.getID());
40 }
42 {
43 std::swap(elem_nodes[2], elem_nodes[3]);
44 return std::make_unique<MeshLib::Quad>(elem_nodes.release(),
45 elem.getID());
46 }
47 return nullptr;
48}
49
50std::unique_ptr<MeshLib::Mesh> createFlippedMesh(MeshLib::Mesh const& mesh)
51{
52 if (mesh.getDimension() > 2)
53 {
54 return nullptr;
55 }
56
57 std::vector<MeshLib::Node*> new_nodes(copyNodeVector(mesh.getNodes()));
58 std::vector<MeshLib::Element*> const& elems(mesh.getElements());
59 std::vector<MeshLib::Element*> new_elems;
60 std::size_t n_elems(mesh.getNumberOfElements());
61 new_elems.reserve(n_elems);
62
63 for (std::size_t i = 0; i < n_elems; ++i)
64 {
65 new_elems.push_back(
66 createFlippedElement(*elems[i], new_nodes).release());
67 }
68
69 return std::make_unique<MeshLib::Mesh>(
70 "FlippedElementMesh", new_nodes, new_elems,
71 true /* compute_element_neighbors */, mesh.getProperties());
72}
73
74} // namespace MeshToolsLib
std::size_t getID() const
virtual MeshElemType getGeomType() const =0
virtual unsigned getNumberOfNodes() const =0
virtual const Node * getNode(unsigned idx) const =0
virtual constexpr unsigned getDimension() const =0
Get dimension of the mesh element.
std::size_t getID() const
Returns the ID of the element.
Definition Element.h:80
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
unsigned getDimension() const
Returns the dimension of the mesh (determined by the maximum dimension over all elements).
Definition Mesh.h:79
Properties & getProperties()
Definition Mesh.h:125
std::size_t getNumberOfElements() const
Get the number of elements.
Definition Mesh.h:88
std::unique_ptr< MeshLib::Element > createFlippedElement(MeshLib::Element const &elem, std::vector< MeshLib::Node * > const &nodes)
std::unique_ptr< MeshLib::Mesh > createFlippedMesh(MeshLib::Mesh const &mesh)