OGS
QuadraticMeshGenerator.cpp File Reference

Detailed Description

Definition in file QuadraticMeshGenerator.cpp.

Include dependency graph for QuadraticMeshGenerator.cpp:

Go to the source code of this file.

Classes

struct  nodeByCoordinatesComparator
 

Namespaces

 MeshLib
 

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. More...
 
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. More...
 
std::unique_ptr< Mesh > MeshLib::createQuadraticOrderMesh (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 27 of file QuadraticMeshGenerator.cpp.

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

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

◆ 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 27 of file QuadraticMeshGenerator.cpp.

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

◆ 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 97 of file QuadraticMeshGenerator.cpp.

99 {
100  if (e.getCellType() == MeshLib::CellType::LINE2)
101  {
102  return convertLinearToQuadratic<MeshLib::Line3>(e);
103  }
104  if (e.getCellType() == MeshLib::CellType::TRI3)
105  {
106  return convertLinearToQuadratic<MeshLib::Tri6>(e);
107  }
108  if (e.getCellType() == MeshLib::CellType::TET4)
109  {
110  return convertLinearToQuadratic<MeshLib::Tet10>(e);
111  }
112  if (e.getCellType() == MeshLib::CellType::QUAD4)
113  {
114  if (add_centre_node)
115  {
116  return convertLinearToQuadratic<MeshLib::Quad9>(e);
117  }
118  return convertLinearToQuadratic<MeshLib::Quad8>(e);
119  }
120  if (e.getCellType() == MeshLib::CellType::HEX8)
121  {
122  return convertLinearToQuadratic<MeshLib::Hex20>(e);
123  }
124 
125  OGS_FATAL("Mesh element type {:s} is not supported",
126  MeshLib::CellType2String(e.getCellType()));
127 }
#define OGS_FATAL(...)
Definition: Error.h:26
std::string CellType2String(const CellType t)
Given a MeshElemType this returns the appropriate string.
Definition: MeshEnums.cpp:157

References MeshLib::CellType2String(), MeshLib::Element::getCellType(), MeshLib::HEX8, MeshLib::LINE2, OGS_FATAL, MeshLib::QUAD4, MeshLib::TET4, and MeshLib::TRI3.

Referenced by MeshLib::createQuadraticOrderMesh().