OGS
ReferenceElement.h
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#pragma once
5
6#include <vector>
7
10
11namespace NumLib
12{
13template <typename MeshElementType>
15{
16 static std::vector<MeshLib::Node> createReferenceElementNodes()
17 {
18 constexpr auto natural_node_coordss =
20
21 // natural and real node coordinates coincide on most reference elements
22 std::vector<MeshLib::Node> real_node_coords{
23 natural_node_coordss.begin(), natural_node_coordss.end()};
24
25 if constexpr (std::is_same_v<MeshElementType, MeshLib::Pyramid13>)
26 {
27 // on pyramid reference elements some natural and real coordinates
28 // differ
29 real_node_coords[9] = {-0.5, -0.5, 0};
30 real_node_coords[10] = {0.5, -0.5, 0};
31 real_node_coords[11] = {0.5, 0.5, 0};
32 real_node_coords[12] = {-0.5, 0.5, 0};
33 }
34
35 return real_node_coords;
36 }
37
38 static MeshElementType createElement(
39 std::vector<MeshLib::Node> const& nodes)
40 {
41 constexpr unsigned num_nodes = MeshElementType::n_all_nodes;
42
43 std::array<MeshLib::Node*, num_nodes> node_ptrs{};
44
45 for (std::size_t i = 0; i < num_nodes; ++i)
46 {
47 node_ptrs[i] = const_cast<MeshLib::Node*>(&(nodes[i]));
48 }
49
50 return MeshElementType(node_ptrs);
51 }
52
53 std::vector<MeshLib::Node> const nodes = createReferenceElementNodes();
54
55public:
56 MeshElementType const element = createElement(nodes);
57};
58} // namespace NumLib
static MeshElementType createElement(std::vector< MeshLib::Node > const &nodes)
static std::vector< MeshLib::Node > createReferenceElementNodes()
std::vector< MeshLib::Node > const nodes
MeshElementType const element