11#ifndef PBAT_FEM_TRIANGLE_H
12#define PBAT_FEM_TRIANGLE_H
16#include "QuadratureRules.h"
38using Triangle =
typename detail::Triangle<Order>;
47 static int constexpr kOrder = 1;
48 static int constexpr kDims = 2;
49 static int constexpr kNodes = 3;
50 static std::array<int, kNodes * kDims>
constexpr Coordinates =
52 static std::array<int, AffineBaseType::kNodes>
constexpr Vertices = {0,1,2};
53 static bool constexpr bHasConstantJacobian =
true;
55 template <
int PolynomialOrder, common::CFloatingPo
int TScalar = Scalar>
58 template <
class TDerived,
class TScalar =
typename TDerived::Scalar>
59 [[maybe_unused]]
static Eigen::Vector<TScalar, kNodes> N([[maybe_unused]] Eigen::DenseBase<TDerived>
const& X_)
61#include "pbat/warning/Push.h"
62#include "pbat/warning/SignConversion.h"
64 Eigen::Vector<TScalar, kNodes> Nm;
65 auto const X = X_.reshaped();
66 Nm[0] = -X[0] - X[1] + 1;
70#include "pbat/warning/Pop.h"
73 template <
class TDerived,
class TScalar =
typename TDerived::Scalar>
74 [[maybe_unused]]
static Eigen::Matrix<TScalar, kNodes, kDims> GradN([[maybe_unused]] Eigen::DenseBase<TDerived>
const& X_)
76#include "pbat/warning/Push.h"
77#include "pbat/warning/SignConversion.h"
78 Eigen::Matrix<TScalar, kNodes, kDims> GNm;
79 TScalar* GNp = GNm.data();
80 [[maybe_unused]]
auto const X = X_.reshaped();
88#include "pbat/warning/Pop.h"
97 static int constexpr kOrder = 2;
98 static int constexpr kDims = 2;
99 static int constexpr kNodes = 6;
100 static std::array<int, kNodes * kDims>
constexpr Coordinates =
101 {0,0,1,0,2,0,0,1,1,1,0,2};
102 static std::array<int, AffineBaseType::kNodes>
constexpr Vertices = {0,2,5};
103 static bool constexpr bHasConstantJacobian =
false;
105 template <
int PolynomialOrder, common::CFloatingPo
int TScalar = Scalar>
108 template <
class TDerived,
class TScalar =
typename TDerived::Scalar>
109 [[maybe_unused]]
static Eigen::Vector<TScalar, kNodes> N([[maybe_unused]] Eigen::DenseBase<TDerived>
const& X_)
111#include "pbat/warning/Push.h"
112#include "pbat/warning/SignConversion.h"
114 Eigen::Vector<TScalar, kNodes> Nm;
115 auto const X = X_.reshaped();
116 auto const a0 = X[0] + X[1] - 1;
117 auto const a1 = 2*X[1];
118 auto const a2 = 2*X[0] - 1;
119 auto const a3 = 4*a0;
120 Nm[0] = a0*(a1 + a2);
125 Nm[5] = (a1 - 1)*X[1];
127#include "pbat/warning/Pop.h"
130 template <
class TDerived,
class TScalar =
typename TDerived::Scalar>
131 [[maybe_unused]]
static Eigen::Matrix<TScalar, kNodes, kDims> GradN([[maybe_unused]] Eigen::DenseBase<TDerived>
const& X_)
133#include "pbat/warning/Push.h"
134#include "pbat/warning/SignConversion.h"
135 Eigen::Matrix<TScalar, kNodes, kDims> GNm;
136 TScalar* GNp = GNm.data();
137 [[maybe_unused]]
auto const X = X_.reshaped();
138 auto const a0 = 4*X[0];
139 auto const a1 = 4*X[1];
140 auto const a2 = a0 + a1 - 3;
142 GNp[1] = -a1 - 8*X[0] + 4;
150 GNp[9] = -a0 - 8*X[1] + 4;
154#include "pbat/warning/Pop.h"
163 static int constexpr kOrder = 3;
164 static int constexpr kDims = 2;
165 static int constexpr kNodes = 10;
166 static std::array<int, kNodes * kDims>
constexpr Coordinates =
167 {0,0,1,0,2,0,3,0,0,1,1,1,2,1,0,2,1,2,0,3};
168 static std::array<int, AffineBaseType::kNodes>
constexpr Vertices = {0,3,9};
169 static bool constexpr bHasConstantJacobian =
false;
171 template <
int PolynomialOrder, common::CFloatingPo
int TScalar = Scalar>
174 template <
class TDerived,
class TScalar =
typename TDerived::Scalar>
175 [[maybe_unused]]
static Eigen::Vector<TScalar, kNodes> N([[maybe_unused]] Eigen::DenseBase<TDerived>
const& X_)
177#include "pbat/warning/Push.h"
178#include "pbat/warning/SignConversion.h"
180 Eigen::Vector<TScalar, kNodes> Nm;
181 auto const X = X_.reshaped();
182 auto const a0 = 3*X[1];
183 auto const a1 = 3*X[0];
184 auto const a2 = a1 - 1;
185 auto const a3 = X[0] + X[1] - 1;
186 auto const a4 = a1 - 2;
187 auto const a5 = a3*(a0 + a4);
188 auto const a6 = (9.0/2.0)*X[0];
189 auto const a7 = a2*a6;
190 auto const a8 = (9.0/2.0)*X[1];
191 auto const a9 = a0 - 1;
192 auto const a10 = a9*X[1];
193 Nm[0] = -1.0/2.0*a5*(a0 + a2);
196 Nm[3] = (1.0/2.0)*a2*a4*X[0];
198 Nm[5] = -27*a3*X[0]*X[1];
202 Nm[9] = (1.0/2.0)*a10*(a0 - 2);
204#include "pbat/warning/Pop.h"
207 template <
class TDerived,
class TScalar =
typename TDerived::Scalar>
208 [[maybe_unused]]
static Eigen::Matrix<TScalar, kNodes, kDims> GradN([[maybe_unused]] Eigen::DenseBase<TDerived>
const& X_)
210#include "pbat/warning/Push.h"
211#include "pbat/warning/SignConversion.h"
212 Eigen::Matrix<TScalar, kNodes, kDims> GNm;
213 TScalar* GNp = GNm.data();
214 [[maybe_unused]]
auto const X = X_.reshaped();
215 auto const a0 = X[0] + X[1] - 1;
216 auto const a1 = (3.0/2.0)*X[1];
217 auto const a2 = (3.0/2.0)*X[0];
218 auto const a3 = a2 - 1.0/2.0;
219 auto const a4 = -a1 - a3;
220 auto const a5 = 3*X[1];
221 auto const a6 = 3*X[0] - 2;
222 auto const a7 = a5 + a6;
223 auto const a8 = 3*a0*a4 + a4*a7 + a7*(-a1 - a2 + 3.0/2.0);
224 auto const a9 = (9.0/2.0)*X[0];
225 auto const a10 = (9.0/2.0)*X[1];
226 auto const a11 = a7*(a10 + a9 - 9.0/2.0);
227 auto const a12 = (27.0/2.0)*X[0];
228 auto const a13 = (27.0/2.0)*X[1];
229 auto const a14 = a12 + a13;
230 auto const a15 = a14 - 27.0/2.0;
231 auto const a16 = a14 - 9;
232 auto const a17 = a15*X[0] + a16*X[0];
233 auto const a18 = a12 - 9.0/2.0;
234 auto const a19 = -a18;
235 auto const a20 = a19*X[0];
236 auto const a21 = -a15;
237 auto const a22 = a15*X[1] + a16*X[1];
238 auto const a23 = 27*X[0];
239 auto const a24 = -a23*X[1];
240 auto const a25 = -a23 - 27*X[1] + 27;
241 auto const a26 = a12*X[1];
242 auto const a27 = a13 - 9.0/2.0;
243 auto const a28 = -a27;
244 auto const a29 = a28*X[1];
247 GNp[2] = a0*a19 + a20 + a21*X[0];
248 GNp[3] = a3*a6 + (a9 - 3)*X[0] + (a9 - 3.0/2.0)*X[0];
250 GNp[5] = a24 + a25*X[1];
251 GNp[6] = a18*X[1] + a26;
260 GNp[15] = a24 + a25*X[0];
262 GNp[17] = a0*a28 + a21*X[1] + a29;
263 GNp[18] = a26 + a27*X[0];
264 GNp[19] = (a1 - 1.0/2.0)*(a5 - 2) + (a10 - 3)*X[1] + (a10 - 3.0/2.0)*X[1];
266#include "pbat/warning/Pop.h"
Concepts for common types.
Finite Element Method (FEM)
Definition Concepts.h:19
typename detail::Triangle< Order > Triangle
Triangle finite element.
Definition Triangle.h:38
Math related functionality.
Definition Concepts.h:19
typename detail::SymmetricSimplexPolynomialQuadratureRule< Dims, Order, TScalar > SymmetricSimplexPolynomialQuadratureRule
Symmetric quadrature rule for reference simplices in dimensions .
Definition SymmetricQuadratureRules.h:96
The main namespace of the library.
Definition Aliases.h:15