OGS
QuadraticMeshGenerator.cpp File Reference
Include dependency graph for QuadraticMeshGenerator.cpp:

Go to the source code of this file.

Classes

struct  nodeByCoordinatesComparator

Namespaces

namespace  MeshToolsLib

Functions

template<typename QuadraticElement>
std::unique_ptr< QuadraticElement > convertLinearToQuadratic (MeshLib::Element const &e)
template<>
std::unique_ptr< MeshLib::Quad9convertLinearToQuadratic< MeshLib::Quad9 > (MeshLib::Element const &e)
 Special case for Quad-9 adding a centre node too.
template<>
std::unique_ptr< MeshLib::Prism15convertLinearToQuadratic< MeshLib::Prism15 > (MeshLib::Element const &e)
 Special case for Prism15.
std::unique_ptr< MeshLib::ElementcreateQuadraticElement (MeshLib::Element const &e, bool const add_centre_node)
 Return a new quadratic element corresponding to the linear element's type.
std::unique_ptr< MeshLib::MeshMeshToolsLib::createQuadraticOrderMesh (MeshLib::Mesh const &linear_mesh, bool const add_centre_node)

Function Documentation

◆ convertLinearToQuadratic()

template<typename QuadraticElement>
std::unique_ptr< QuadraticElement > convertLinearToQuadratic ( MeshLib::Element const & e)

Given an (linear) element divide all its edges by inserting a point in the middle and return a new element.

Definition at line 23 of file QuadraticMeshGenerator.cpp.

25{
26 int const n_all_nodes = QuadraticElement::n_all_nodes;
27 int const n_base_nodes = QuadraticElement::n_base_nodes;
28 assert(n_base_nodes == e.getNumberOfBaseNodes());
29
30 // Copy base nodes of element to the quadratic element new nodes'.
31 std::array<MeshLib::Node*, n_all_nodes> nodes{};
32 for (int i = 0; i < n_base_nodes; i++)
33 {
34 nodes[i] = const_cast<MeshLib::Node*>(e.getNode(i));
35 }
36
37 // For each edge create a middle node.
38 int const number_of_edges = e.getNumberOfEdges();
39 for (int i = 0; i < number_of_edges; i++)
40 {
41 auto const& a = *e.getEdgeNode(i, 0);
42 auto const& b = *e.getEdgeNode(i, 1);
43
44 nodes[n_base_nodes + i] = new MeshLib::Node(
45 (a[0] + b[0]) / 2, (a[1] + b[1]) / 2, (a[2] + b[2]) / 2);
46 }
47
48 return std::make_unique<QuadraticElement>(nodes, e.getID());
49}

References MeshLib::Element::getEdgeNode(), MeshLib::Element::getID(), MeshLib::Element::getNode(), MeshLib::Element::getNumberOfBaseNodes(), MeshLib::Element::getNumberOfEdges(), and MeshLib::Node.

Referenced by createQuadraticElement().

◆ convertLinearToQuadratic< MeshLib::Prism15 >()

template<>
std::unique_ptr< MeshLib::Prism15 > convertLinearToQuadratic< MeshLib::Prism15 > ( MeshLib::Element const & e)

Special case for Prism15.

Definition at line 23 of file QuadraticMeshGenerator.cpp.

96{
97 int const n_all_nodes = MeshLib::Prism15::n_all_nodes;
98 int const n_base_nodes = MeshLib::Prism15::n_base_nodes;
99 assert(n_base_nodes == e.getNumberOfBaseNodes());
100
101 // Copy base nodes of element to the quadratic element new nodes'.
102 std::array<MeshLib::Node*, n_all_nodes> nodes{};
103 for (int i = 0; i < n_base_nodes; i++)
104 {
105 nodes[i] = const_cast<MeshLib::Node*>(e.getNode(i));
106 }
107
108 // For each edge create a middle node.
109 int const number_of_edges = e.getNumberOfEdges();
110 for (int i = 0; i < 3; i++)
111 {
112 auto const& a = *e.getEdgeNode(i, 0);
113 auto const& b = *e.getEdgeNode(i, 1);
114
115 nodes[n_base_nodes + i] = new MeshLib::Node(
116 (a[0] + b[0]) / 2, (a[1] + b[1]) / 2, (a[2] + b[2]) / 2);
117 }
118 for (int i = 3; i < 6; i++)
119 {
120 auto const& a = *e.getEdgeNode(i + 3, 0);
121 auto const& b = *e.getEdgeNode(i + 3, 1);
122
123 nodes[n_base_nodes + i] = new MeshLib::Node(
124 (a[0] + b[0]) / 2, (a[1] + b[1]) / 2, (a[2] + b[2]) / 2);
125 }
126 for (int i = 6; i < number_of_edges; i++)
127 {
128 auto const& a = *e.getEdgeNode(i - 3, 0);
129 auto const& b = *e.getEdgeNode(i - 3, 1);
130
131 nodes[n_base_nodes + i] = new MeshLib::Node(
132 (a[0] + b[0]) / 2, (a[1] + b[1]) / 2, (a[2] + b[2]) / 2);
133 }
134
135 return std::make_unique<MeshLib::Prism15>(nodes, e.getID());
136}

Referenced by createQuadraticElement().

◆ convertLinearToQuadratic< MeshLib::Quad9 >()

template<>
std::unique_ptr< MeshLib::Quad9 > convertLinearToQuadratic< MeshLib::Quad9 > ( MeshLib::Element const & e)

Special case for Quad-9 adding a centre node too.

Definition at line 23 of file QuadraticMeshGenerator.cpp.

55{
56 int const n_all_nodes = MeshLib::Quad9::n_all_nodes;
57 int const n_base_nodes = MeshLib::Quad9::n_base_nodes;
58 assert(n_base_nodes == e.getNumberOfBaseNodes());
59
60 // Copy base nodes of element to the quadratic element new nodes'.
61 std::array<MeshLib::Node*, n_all_nodes> nodes{};
62 for (int i = 0; i < n_base_nodes; i++)
63 {
64 nodes[i] = const_cast<MeshLib::Node*>(e.getNode(i));
65 }
66
67 // For each edge create a middle node.
68 int const number_of_edges = e.getNumberOfEdges();
69 for (int i = 0; i < number_of_edges; i++)
70 {
71 auto const& a = *e.getEdgeNode(i, 0);
72 auto const& b = *e.getEdgeNode(i, 1);
73
74 nodes[n_base_nodes + i] = new MeshLib::Node(
75 (a[0] + b[0]) / 2, (a[1] + b[1]) / 2, (a[2] + b[2]) / 2);
76 }
77
78 // Compute the centre point coordinates.
79 auto* centre_node = new MeshLib::Node(0, 0, 0);
80 for (int i = 0; i < n_base_nodes; i++)
81 {
82 for (int d = 0; d < 3; d++)
83 {
84 (*centre_node)[d] += (*nodes[i])[d] / n_base_nodes;
85 }
86 }
87 nodes[n_all_nodes - 1] = centre_node;
88
89 return std::make_unique<MeshLib::Quad9>(nodes, e.getID());
90}

Referenced by createQuadraticElement().

◆ createQuadraticElement()

std::unique_ptr< MeshLib::Element > createQuadraticElement ( MeshLib::Element const & e,
bool const add_centre_node )

Return a new quadratic element corresponding to the linear element's type.

Definition at line 139 of file QuadraticMeshGenerator.cpp.

141{
142 if (e.getCellType() == MeshLib::CellType::LINE2)
143 {
145 }
146 if (e.getCellType() == MeshLib::CellType::TRI3)
147 {
149 }
150 if (e.getCellType() == MeshLib::CellType::TET4)
151 {
153 }
154 if (e.getCellType() == MeshLib::CellType::QUAD4)
155 {
156 if (add_centre_node)
157 {
159 }
161 }
162 if (e.getCellType() == MeshLib::CellType::HEX8)
163 {
165 }
166 if (e.getCellType() == MeshLib::CellType::PRISM6)
167 {
169 }
170 if (e.getCellType() == MeshLib::CellType::PYRAMID5)
171 {
173 }
174
175 OGS_FATAL("Mesh element type {:s} is not supported",
176 MeshLib::CellType2String(e.getCellType()));
177}
#define OGS_FATAL(...)
Definition Error.h:19
std::unique_ptr< MeshLib::Prism15 > convertLinearToQuadratic< MeshLib::Prism15 >(MeshLib::Element const &e)
Special case for Prism15.
std::unique_ptr< QuadraticElement > convertLinearToQuadratic(MeshLib::Element const &e)
std::unique_ptr< MeshLib::Quad9 > convertLinearToQuadratic< MeshLib::Quad9 >(MeshLib::Element const &e)
Special case for Quad-9 adding a centre node too.
std::string CellType2String(const CellType t)
Given a MeshElemType this returns the appropriate string.

References MeshLib::CellType2String(), convertLinearToQuadratic(), convertLinearToQuadratic< MeshLib::Prism15 >(), convertLinearToQuadratic< MeshLib::Quad9 >(), MeshLib::Element::getCellType(), MeshLib::HEX8, MeshLib::LINE2, OGS_FATAL, MeshLib::PRISM6, MeshLib::PYRAMID5, MeshLib::QUAD4, MeshLib::TET4, and MeshLib::TRI3.

Referenced by MeshToolsLib::createQuadraticOrderMesh().