PhysicsBasedAnimationToolkit 0.0.10
Cross-platform C++20 library of algorithms and data structures commonly used in computer graphics research on physically-based simulation.
Loading...
Searching...
No Matches
Triangle.h
Go to the documentation of this file.
1
11#ifndef PBAT_FEM_TRIANGLE_H
12#define PBAT_FEM_TRIANGLE_H
13
14#include "pbat/Aliases.h"
16#include "QuadratureRules.h"
17
18#include <array>
19
20namespace pbat {
21namespace fem {
22
23namespace detail {
24
25template <int Order>
26struct Triangle;
27
28} // namespace detail
29
37template <int Order>
38using Triangle = typename detail::Triangle<Order>;
39
40namespace detail {
41
42template <>
43struct Triangle<1>
44{
45 using AffineBaseType = Triangle<1>;
46
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 =
51 {0,0,1,0,0,1};
52 static std::array<int, AffineBaseType::kNodes> constexpr Vertices = {0,1,2};
53 static bool constexpr bHasConstantJacobian = true;
54
55 template <int PolynomialOrder, common::CFloatingPoint TScalar = Scalar>
57
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_)
60 {
61#include "pbat/warning/Push.h"
62#include "pbat/warning/SignConversion.h"
63 using namespace pbat::math;
64 Eigen::Vector<TScalar, kNodes> Nm;
65 auto const X = X_.reshaped();
66 Nm[0] = -X[0] - X[1] + 1;
67 Nm[1] = X[0];
68 Nm[2] = X[1];
69 return Nm;
70#include "pbat/warning/Pop.h"
71 }
72
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_)
75 {
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();
81 GNp[0] = -1;
82 GNp[1] = 1;
83 GNp[2] = 0;
84 GNp[3] = -1;
85 GNp[4] = 0;
86 GNp[5] = 1;
87 return GNm;
88#include "pbat/warning/Pop.h"
89 }
90};
91
92template <>
93struct Triangle<2>
94{
95 using AffineBaseType = Triangle<1>;
96
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;
104
105 template <int PolynomialOrder, common::CFloatingPoint TScalar = Scalar>
107
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_)
110 {
111#include "pbat/warning/Push.h"
112#include "pbat/warning/SignConversion.h"
113 using namespace pbat::math;
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);
121 Nm[1] = -a3*X[0];
122 Nm[2] = a2*X[0];
123 Nm[3] = -a3*X[1];
124 Nm[4] = 4*X[0]*X[1];
125 Nm[5] = (a1 - 1)*X[1];
126 return Nm;
127#include "pbat/warning/Pop.h"
128 }
129
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_)
132 {
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;
141 GNp[0] = a2;
142 GNp[1] = -a1 - 8*X[0] + 4;
143 GNp[2] = a0 - 1;
144 GNp[3] = -a1;
145 GNp[4] = a1;
146 GNp[5] = 0;
147 GNp[6] = a2;
148 GNp[7] = -a0;
149 GNp[8] = 0;
150 GNp[9] = -a0 - 8*X[1] + 4;
151 GNp[10] = a0;
152 GNp[11] = a1 - 1;
153 return GNm;
154#include "pbat/warning/Pop.h"
155 }
156};
157
158template <>
159struct Triangle<3>
160{
161 using AffineBaseType = Triangle<1>;
162
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;
170
171 template <int PolynomialOrder, common::CFloatingPoint TScalar = Scalar>
173
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_)
176 {
177#include "pbat/warning/Push.h"
178#include "pbat/warning/SignConversion.h"
179 using namespace pbat::math;
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);
194 Nm[1] = a5*a6;
195 Nm[2] = -a3*a7;
196 Nm[3] = (1.0/2.0)*a2*a4*X[0];
197 Nm[4] = a5*a8;
198 Nm[5] = -27*a3*X[0]*X[1];
199 Nm[6] = a7*X[1];
200 Nm[7] = -a3*a8*a9;
201 Nm[8] = a10*a6;
202 Nm[9] = (1.0/2.0)*a10*(a0 - 2);
203 return Nm;
204#include "pbat/warning/Pop.h"
205 }
206
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_)
209 {
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];
245 GNp[0] = a8;
246 GNp[1] = a11 + a17;
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];
249 GNp[4] = a22;
250 GNp[5] = a24 + a25*X[1];
251 GNp[6] = a18*X[1] + a26;
252 GNp[7] = a29;
253 GNp[8] = a27*X[1];
254 GNp[9] = 0;
255 GNp[10] = a8;
256 GNp[11] = a17;
257 GNp[12] = a20;
258 GNp[13] = 0;
259 GNp[14] = a11 + a22;
260 GNp[15] = a24 + a25*X[0];
261 GNp[16] = a18*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];
265 return GNm;
266#include "pbat/warning/Pop.h"
267 }
268};
269
270} // namespace detail
271} // namespace fem
272} // namespace pbat
273
274#endif // PBAT_FEM_TRIANGLE_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