MFEM v4.10.0
Finite element discretization library
Loading...
Searching...
No Matches
fe_pyramid.hpp
Go to the documentation of this file.
1// Copyright (c) 2010-2026, Lawrence Livermore National Security, LLC. Produced
2// at the Lawrence Livermore National Laboratory. All Rights reserved. See files
3// LICENSE and NOTICE for details. LLNL-CODE-806117.
4//
5// This file is part of the MFEM library. For more information and source code
6// availability visit https://mfem.org.
7//
8// MFEM is free software; you can redistribute it and/or modify it under the
9// terms of the BSD-3 license. We welcome feedback and contributions, see file
10// CONTRIBUTING.md for details.
11
12#ifndef MFEM_FE_PYRAMID
13#define MFEM_FE_PYRAMID
14
15#include "fe_base.hpp"
16
17namespace mfem
18{
19
21{
22 // Default basis type for H1 and L2 pyramids
23 static inline int DefaultType = 1; // Bergot(0) or Fuentes(1)
24};
25
26/** Base class for arbitrary order basis functions on pyramid-shaped elements
27
28 This base class provides a common class to store temporary vectors,
29 matrices, and tensors computed by various functions defined on
30 pyramid-shaped elements.
31
32 The function names defined here are chosen to reflect, as closely as
33 possible, those used in the paper "Orientation embedded high order
34 shape functions for the exact sequence elements of all shapes" by
35 Federico Fuentes, Brendan Keith, Leszek Demkowicz, and Sriram
36 Nagaraj, see https://doi.org/10.1016/j.camwa.2015.04.027.
37
38 @note Many of the functions below, e.g. lam1, lam2, etc. and related
39 functions, are singular or multi-valued at the apex of the pyramid. The
40 values returned near the apex are computed in the limit z->1 using
41 (x, y, z) = ((1-z)/2, (1-z)/2, z) i.e. along the line from the center
42 of the base to the apex.
43*/
45{
46private:
47#ifndef MFEM_THREAD_SAFE
48 mutable DenseMatrix phi_E_mtmp;
49 mutable Vector phi_Q_vtmp1;
50 mutable Vector phi_Q_vtmp2;
51 mutable DenseMatrix phi_Q_mtmp1;
52 mutable DenseMatrix phi_Q_mtmp2;
53 mutable Vector phi_T_vtmp1;
54 mutable Vector phi_T_vtmp2;
55 mutable Vector phi_T_vtmp3;
56 mutable Vector phi_T_vtmp4;
57 mutable DenseMatrix phi_T_mtmp1;
58 mutable Vector E_E_vtmp;
59 mutable Vector E_Q_vtmp;
60 mutable DenseMatrix E_Q_mtmp1;
61 mutable DenseMatrix E_Q_mtmp2;
62 mutable DenseMatrix E_Q_mtmp3;
63 mutable Vector E_T_vtmp1;
64 mutable Vector E_T_vtmp2;
65 mutable Vector E_T_vtmp3;
66 mutable DenseMatrix E_T_mtmp1;
67 mutable DenseMatrix E_T_mtmp2;
68 mutable DenseMatrix V_Q_mtmp1;
69 mutable DenseMatrix V_Q_mtmp2;
70 mutable Vector V_T_vtmp1;
71 mutable Vector V_T_vtmp2;
72 mutable DenseMatrix V_T_mtmp1;
73 mutable Vector VT_T_vtmp1;
74 mutable Vector VT_T_vtmp2;
75 mutable DenseMatrix VT_T_mtmp1;
76 mutable DenseTensor VT_T_ttmp1;
77 mutable Vector V_L_vtmp1;
78 mutable Vector V_L_vtmp2;
79 mutable DenseMatrix V_L_mtmp1;
80 mutable DenseMatrix V_L_mtmp2;
81 mutable Vector V_R_vtmp;
82 mutable DenseMatrix V_R_mtmp;
83#endif
84
85protected:
86 static constexpr real_t one = 1.0;
87 static constexpr real_t zero = 0.0;
88 static constexpr real_t apex_tol = 1e-8;
89
90public:
91 FuentesPyramid() = default;
92
93 static bool CheckZ(real_t z) { return std::abs(z - 1.0) > apex_tol; }
94
95 /// Pyramid "Affine" Coordinates
96 static real_t lam1(real_t x, real_t y, real_t z)
97 { return CheckZ(z) ? (1.0 - x - z) * (1.0 - y - z) / (1.0 - z): 0.0; }
98 static real_t lam2(real_t x, real_t y, real_t z)
99 { return CheckZ(z) ? x * (1.0 - y - z) / (1.0 - z): 0.0; }
101 { return CheckZ(z) ? x * y / (1.0 - z): 0.0; }
103 { return CheckZ(z) ? (1.0 - x - z) * y / (1.0 - z): 0.0; }
105 { return CheckZ(z) ? z : 1.0; }
106
107 /// Gradients of the "Affine" Coordinates
108 static Vector grad_lam1(real_t x, real_t y, real_t z);
109 static Vector grad_lam2(real_t x, real_t y, real_t z);
110 static Vector grad_lam3(real_t x, real_t y, real_t z);
111 static Vector grad_lam4(real_t x, real_t y, real_t z);
112 static Vector grad_lam5(real_t x, real_t y, real_t z);
113
114 /// Two component vectors associated with edges touching the apex
116 { return Vector({lam1(x, y, z), lam5(x, y, z)}); }
118 { return Vector({lam2(x, y, z), lam5(x, y, z)}); }
120 { return Vector({lam3(x, y, z), lam5(x, y, z)}); }
122 { return Vector({lam4(x, y, z), lam5(x, y, z)}); }
123
124 /// Gradients of the above two component vectors
125 static DenseMatrix grad_lam15(real_t x, real_t y, real_t z);
126 static DenseMatrix grad_lam25(real_t x, real_t y, real_t z);
127 static DenseMatrix grad_lam35(real_t x, real_t y, real_t z);
128 static DenseMatrix grad_lam45(real_t x, real_t y, real_t z);
129
130 /// Computes $\lambda_i \nabla \lambda_5 - \lambda_5 \nabla \lambda_i$
135
136 /// Three component vectors associated with triangular faces
138 { return Vector({lam1(x, y, z), lam2(x, y, z), lam5(x, y, z)}); }
140 { return Vector({lam2(x, y, z), lam3(x, y, z), lam5(x, y, z)}); }
142 { return Vector({lam3(x, y, z), lam4(x, y, z), lam5(x, y, z)}); }
144 { return Vector({lam4(x, y, z), lam3(x, y, z), lam5(x, y, z)}); }
146 { return Vector({lam4(x, y, z), lam1(x, y, z), lam5(x, y, z)}); }
148 { return Vector({lam1(x, y, z), lam4(x, y, z), lam5(x, y, z)}); }
149
150 /// Vector functions related to the normals to the triangular faces
151 ///
152 /// Computes
153 /// $
154 /// \lambda_i \nabla\lambda_j \times \nabla \lambda_5
155 /// + \lambda_j \nabla\lambda_5 \times \nabla \lambda_i
156 /// + \lambda_5 \nabla\lambda_i \times \nabla \lambda_j
157 /// $
164
165 /// Divergences of the above "normal" vector functions divided by 3
172
173 static real_t mu0(real_t z)
174 { return 1.0 - z; }
175 static real_t mu1(real_t z)
176 { return z; }
177
179 { return Vector({0.0, 0.0, -1.0}); }
181 { return Vector({0.0, 0.0, 1.0}); }
182
184 { return Vector({mu0(z), mu1(z)}); }
185
186 static DenseMatrix grad_mu01(real_t z);
187
188 static real_t mu0(real_t z, const Vector &xy, unsigned int ab)
189 { return 1.0 - xy[ab-1] / (1.0 - z); }
190 static real_t mu1(real_t z, const Vector &xy, unsigned int ab)
191 { return xy[ab-1] / (1.0 - z); }
192
193 static Vector grad_mu0(real_t z, const Vector xy, unsigned int ab);
194 static Vector grad_mu1(real_t z, const Vector xy, unsigned int ab);
195
196 static Vector mu01(real_t z, Vector xy, unsigned int ab)
197 { return Vector({mu0(z, xy, ab), mu1(z, xy, ab)}); }
198
199 static DenseMatrix grad_mu01(real_t z, Vector xy, unsigned int ab);
200 static Vector mu01_grad_mu01(real_t z, Vector xy, unsigned int ab);
201
202 static real_t nu0(real_t z, Vector xy, unsigned int ab)
203 { return 1.0 - xy[ab-1] - z; }
204 static real_t nu1(real_t z, Vector xy, unsigned int ab) { return xy[ab-1]; }
205 static real_t nu2(real_t z, Vector xy, unsigned int ab) { return z; }
206
207 static Vector grad_nu0(real_t z, const Vector xy, unsigned int ab);
208 static Vector grad_nu1(real_t z, const Vector xy, unsigned int ab);
209 static Vector grad_nu2(real_t z, const Vector xy, unsigned int ab);
210
211 static Vector nu01(real_t z, Vector xy, unsigned int ab)
212 { return Vector({nu0(z, xy, ab), nu1(z, xy, ab)}); }
213 static Vector nu12(real_t z, Vector xy, unsigned int ab)
214 { return Vector({nu1(z, xy, ab), nu2(z, xy, ab)}); }
215 static Vector nu012(real_t z, Vector xy, unsigned int ab)
216 { return Vector({nu0(z, xy, ab), nu1(z, xy, ab), nu2(z, xy, ab)}); }
217 static Vector nu120(real_t z, Vector xy, unsigned int ab)
218 { return Vector({nu1(z, xy, ab), nu2(z, xy, ab), nu0(z, xy, ab)}); }
219
220 static DenseMatrix grad_nu01(real_t z, Vector xy, unsigned int ab);
221 static DenseMatrix grad_nu012(real_t z, Vector xy, unsigned int ab);
222 static DenseMatrix grad_nu120(real_t z, Vector xy, unsigned int ab);
223
224 static Vector nu01_grad_nu01(real_t z, Vector xy, unsigned int ab);
225 static Vector nu12_grad_nu12(real_t z, Vector xy, unsigned int ab);
226 static Vector nu012_grad_nu012(real_t z, Vector xy, unsigned int ab);
227
228 /// Shifted and Scaled Legendre Polynomials
229 /** Implements a scaled and shifted set of Legendre polynomials
230
231 $P_i(x;t) = P_i(x / t) * t^i$
232
233 where @a t >= 0.0, @a x $\in [0,t]$, and $P_i$ is the shifted Legendre
234 polynomial defined on $[0,1]$ rather than the usual $[-1,1]$. The
235 entries stored in @a u correspond to the values of
236 $P_0$, $P_1$, ... $P_p$.
237
238 @a u must be at least @a p + 1 in length
239 */
240 static void CalcScaledLegendre(int p, real_t x, real_t t,
241 real_t *u);
242 static void CalcScaledLegendre(int p, real_t x, real_t t,
243 real_t *u, real_t *dudx, real_t *dudt);
244
245 static void CalcScaledLegendre(int p, real_t x, real_t t,
246 Vector &u);
247 static void CalcScaledLegendre(int p, real_t x, real_t t,
248 Vector &u, Vector &dudx, Vector &dudt);
249
250 /// Integrated Legendre Polynomials
251 /** These are the integrals of the shifted and scaled Legendre polynomials
252 provided above and defined as:
253
254 $L_i(x;t) = \int_0^x P_{i-1}(y;t)dy\mbox{ for }i>=1$
255
256 These polynomials are computed as:
257
258 $L_0(x;t) = 0$, $L_1(x;t) = x$,
259
260 $2(2i-1)L_i(x;t) = P_i(x;t) - t^2 P_{i-2}(x;t)\mbox{ for }i>=2$
261
262 @a u must be at least @a p + 1 in length
263 */
264 static void CalcIntegratedLegendre(int p, real_t x,
265 real_t t, real_t *u);
266 static void CalcIntegratedLegendre(int p, real_t x,
267 real_t t, real_t *u,
268 real_t *dudx, real_t *dudt);
269
270 static void CalcIntegratedLegendre(int p, real_t x,
271 real_t t, Vector &u);
272 static void CalcIntegratedLegendre(int p, real_t x,
273 real_t t, Vector &u,
274 Vector &dudx, Vector &dudt);
275
276 /** @a u must be at least @a p + 1 in length */
277 static void CalcHomogenizedScaLegendre(int p, real_t s0, real_t s1,
278 real_t *u);
279 static void CalcHomogenizedScaLegendre(int p,
280 real_t s0, real_t s1,
281 real_t *u,
282 real_t *duds0, real_t *duds1);
283 static void CalcHomogenizedScaLegendre(int p, real_t s0, real_t s1,
284 Vector &u);
285 static void CalcHomogenizedScaLegendre(int p,
286 real_t s0, real_t s1,
287 Vector &u,
288 Vector &duds0, Vector &duds1);
289
290 /** @a u must be at least @a p + 1 in length */
291 static void CalcHomogenizedIntLegendre(int p,
292 real_t t0, real_t t1,
293 real_t *u);
294 static void CalcHomogenizedIntLegendre(int p,
295 real_t t0, real_t t1,
296 real_t *u,
297 real_t *dudt0, real_t *dudt1);
298 static void CalcHomogenizedIntLegendre(int p,
299 real_t t0, real_t t1,
300 Vector &u);
301 static void CalcHomogenizedIntLegendre(int p,
302 real_t t0, real_t t1,
303 Vector &u,
304 Vector &dudt0, Vector &dudt1);
305
306 /// Shifted and Scaled Jacobi Polynomials
307 /** Implements a scaled and shifted set of Jacobi polynomials
308
309 $P^\alpha_i(x / t) * t^i$
310
311 where @a alpha $= \alpha >-1$, @a t $>= 0.0$, @a x $\in [0,t]$, and
312 $P^\alpha_i$ is the shifted Jacobi polynomial defined on $[0,1]$ rather
313 than the usual $[-1,1]$. The entries stored in @a u correspond to the
314 values of $P^\alpha_0$, $P^\alpha_1$, ... $P^\alpha_p$.
315
316 @note Jacobi polynomials typically posses two parameters,
317 $P^{\alpha, \beta}_i$, but we only consider the special case where
318 $\beta=0$.
319
320 @a u must be at least @a p + 1 in length
321 */
322 static void CalcScaledJacobi(int p, real_t alpha,
323 real_t x, real_t t,
324 real_t *u);
325 static void CalcScaledJacobi(int p, real_t alpha,
326 real_t x, real_t t,
327 real_t *u, real_t *dudx, real_t *dudt);
328
329 static void CalcScaledJacobi(int p, real_t alpha,
330 real_t x, real_t t,
331 Vector &u);
332 static void CalcScaledJacobi(int p, real_t alpha,
333 real_t x, real_t t,
334 Vector &u, Vector &dudx, Vector &dudt);
335
336 /// Integrated Jacobi Polynomials
337 /** These are the integrals of the shifted and scaled Jacobi polynomials
338 provided above and defined as:
339
340 $L^\alpha_i(x;t) = \int_0^x P^\alpha_{i-1}(y;t)dy\mbox{ for }i>=1$
341
342 These polynomials are computed as:
343
344 $L^\alpha_0(x;t) = 0$, $L^\alpha_1(x;t) = x$,
345
346 $L^\alpha_i(x;t) = a_i P^\alpha_i(x;t) + b_i t P^\alpha_{i-1}(x;t)
347 - c_i t^2 P^\alpha_{i-2}(x;t)\mbox{ for }i>=2$
348
349 With
350
351 $a_i = (i + \alpha) / (2i + \alpha - 1)(2i + \alpha)$
352
353 $b_i = \alpha / (2i + \alpha - 2)(2i + \alpha)$
354
355 $c_i = (i - 1) / (2i + \alpha - 2)(2i + \alpha - 1)$
356
357 @a u must be at least @a p + 1 in length
358 */
359 static void CalcIntegratedJacobi(int p, real_t alpha,
360 real_t x, real_t t,
361 real_t *u);
362 static void CalcIntegratedJacobi(int p, real_t alpha,
363 real_t x, real_t t,
364 real_t *u, real_t *dudx, real_t *dudt);
365
367 real_t x, real_t t,
368 Vector &u)
369 { CalcIntegratedJacobi(p, alpha, x, t, u.GetData()); }
371 real_t x, real_t t,
372 Vector &u, Vector &dudx, Vector &dudt)
373 {
374 CalcIntegratedJacobi(p, alpha, x, t, u.GetData(),
375 dudx.GetData(), dudt.GetData());
376 }
377
378 /** @a u must be at least @a p + 1 in length */
380 real_t t0, real_t t1,
381 real_t *u)
382 { CalcScaledJacobi(p, alpha, t1, t0 + t1, u); }
383 static void CalcHomogenizedScaJacobi(int p, real_t alpha,
384 real_t t0, real_t t1,
385 real_t *u,
386 real_t *dudt0, real_t *dudt1);
387 static void CalcHomogenizedScaJacobi(int p, real_t alpha,
388 real_t t0, real_t t1,
389 Vector &u);
390 static void CalcHomogenizedScaJacobi(int p, real_t alpha,
391 real_t t0, real_t t1,
392 Vector &u,
393 Vector &dudt0, Vector &dudt1);
394
395 /** @a u must be at least @a p + 1 in length */
397 real_t t0, real_t t1,
398 real_t *u)
399 { CalcIntegratedJacobi(p, alpha, t1, t0 + t1, u); }
400 static void CalcHomogenizedIntJacobi(int p, real_t alpha,
401 real_t t0, real_t t1,
402 real_t *u,
403 real_t *dudt0, real_t *dudt1);
404 static void CalcHomogenizedIntJacobi(int p, real_t alpha,
405 real_t t0, real_t t1,
406 Vector &u);
407 static void CalcHomogenizedIntJacobi(int p, real_t alpha,
408 real_t t0, real_t t1,
409 Vector &u,
410 Vector &dudt0, Vector &dudt1);
411
412 /** @a u must be at least @a p + 1 in length */
413 static void phi_E(int p, real_t s0, real_t s1, real_t *u);
414 static void phi_E(int p, real_t s0, real_t s1, real_t *u,
415 real_t *duds0, real_t *duds1);
416 static void phi_E(int p, Vector s, Vector &u);
417 static void phi_E(int p, Vector s, Vector &u, DenseMatrix &duds);
418
419 /** @a grad_s must be 2x3 */
420 void phi_E(int p, Vector s, const DenseMatrix &grad_s,
421 Vector &u, DenseMatrix &grad_u) const;
422
423 /** @a u must be at least (p+1)x(p+1) in size */
424 void phi_Q(int p, Vector s, Vector t, DenseMatrix &u) const;
425 void phi_Q(int p, Vector s, const DenseMatrix &grad_s,
426 Vector t, const DenseMatrix &grad_t,
427 DenseMatrix &u, DenseTensor &grad_u) const;
428 void phi_T(int p, Vector nu, DenseMatrix &u) const;
429 void phi_T(int p, Vector nu, const DenseMatrix &grad_nu,
430 DenseMatrix &u, DenseTensor &grad_u) const;
431
432 /** This is a vector-valued function associated with an edge of a pyramid
433
434 The vector @a s contains two coordinate values and @a ds is related to the
435 gradient of these coordinates with respect to the reference coordinates i.e.
436 sds = s0 grad s1 - s1 grad s0
437 */
438 void E_E(int p, Vector s, Vector sds, DenseMatrix &u) const;
439 void E_E(int p, Vector s, const DenseMatrix &grad_s, DenseMatrix &u,
440 DenseMatrix &curl_u) const;
441
442 void E_Q(int p, Vector s, Vector ds, Vector t,
443 DenseTensor &u) const;
444 void E_Q(int p, Vector s, const DenseMatrix &grad_s,
445 Vector t, const DenseMatrix &grad_t,
446 DenseTensor &u, DenseTensor &curl_u) const;
447
448 void E_T(int p, Vector s, Vector sds, DenseTensor &u) const;
449 void E_T(int p, Vector s, const DenseMatrix &grad_s,
450 DenseTensor &u, DenseTensor &curl_u) const;
451
452 /** This is a vector-valued function associated with the quadrilateral face
453 of a pyramid
454
455 The vectors @a s and @a t contain pairs of coordinate values and @a ds and
456 @a dt are related to derivatives of these coordinates:
457
458 ds = s0 grad s1 - s1 grad s0
459
460 dt = t0 grad t1 - t1 grad t0
461 */
462 void V_Q(int p, Vector s, Vector ds, Vector t, Vector dt,
463 DenseTensor &u) const;
464
465 /** This is a vector-valued function associated with the triangular faces of
466 a pyramid
467
468 The vector @a s contains three coordinate values and @a sdsxds is related to
469 derivatives of these coordinates with respect to the reference coordinates:
470
471 sdsxds = s0 grad s1 x grad s2 + s1 grad s2 x grad s0 +
472 s2 grad s0 x grad s1
473 */
474 void V_T(int p, Vector s, Vector sdsxds, DenseTensor &u) const;
475
476 /** This computes V_T as above and its divergence
477
478 The vector @a s contains three coordinate values and @a sdsxds is related to
479 derivatives of these coordinates with respect to the reference coordinates:
480
481 sdsxds = s0 grad s1 x grad s2 + s1 grad s2 x grad s0 +
482 s2 grad s0 x grad s1
483
484 The scalar @a dsdsxds is the divergence of sdsxds:
485
486 dsdsxds = grad s0 dot (grad s1 x grad s2)
487 */
488 void V_T(int p, Vector s, Vector sdsxds, real_t dsdsxds,
489 DenseTensor &u, DenseMatrix &du) const;
490
491 void VT_T(int p, Vector s, Vector sds, Vector sdsxds,
492 real_t mu, Vector grad_mu, DenseTensor &u) const;
493 void VT_T(int p, Vector s, Vector sds, Vector sdsxds,
494 Vector grad_s2, real_t mu, Vector grad_mu,
495 DenseTensor &u, DenseMatrix &du) const;
496
497 /** This implements $V^\unlhd_{ij}$ from the Fuentes paper
498
499 @a u must be at least (p+1)x(p+1)x3
500 */
501 void V_L(int p, Vector sx, const DenseMatrix &grad_sx,
502 Vector sy, const DenseMatrix &grad_sy,
503 real_t t, Vector grad_t, DenseTensor &u) const;
504
505 /** This implements $V^\unrhd_i$ from the Fuentes paper
506
507 @a u must be at least (p+1)x3 */
508 void V_R(int p, Vector s, const DenseMatrix &grad_s,
509 real_t mu, Vector grad_mu,
510 real_t t, Vector grad_t, DenseMatrix &u) const;
511};
512
513} // namespace mfem
514
515#endif
516
Data type dense matrix using column-major storage.
Definition densemat.hpp:24
Rank 3 tensor (array of matrices)
static DenseMatrix grad_mu01(real_t z)
static Vector lam45_grad_lam45(real_t x, real_t y, real_t z)
void phi_Q(int p, Vector s, Vector t, DenseMatrix &u) const
static void CalcHomogenizedIntJacobi(int p, real_t alpha, real_t t0, real_t t1, real_t *u)
static Vector nu12(real_t z, Vector xy, unsigned int ab)
void V_R(int p, Vector s, const DenseMatrix &grad_s, real_t mu, Vector grad_mu, real_t t, Vector grad_t, DenseMatrix &u) const
static Vector lam125_grad_lam125(real_t x, real_t y, real_t z)
static constexpr real_t apex_tol
static Vector lam145_grad_lam145(real_t x, real_t y, real_t z)
static void CalcIntegratedJacobi(int p, real_t alpha, real_t x, real_t t, Vector &u)
static Vector lam45(real_t x, real_t y, real_t z)
static void phi_E(int p, real_t s0, real_t s1, real_t *u)
static Vector nu012(real_t z, Vector xy, unsigned int ab)
static DenseMatrix grad_nu120(real_t z, Vector xy, unsigned int ab)
static real_t lam4(real_t x, real_t y, real_t z)
static DenseMatrix grad_lam25(real_t x, real_t y, real_t z)
void E_E(int p, Vector s, Vector sds, DenseMatrix &u) const
static void CalcIntegratedLegendre(int p, real_t x, real_t t, real_t *u)
Integrated Legendre Polynomials.
static Vector nu01_grad_nu01(real_t z, Vector xy, unsigned int ab)
static Vector lam35(real_t x, real_t y, real_t z)
static Vector grad_lam5(real_t x, real_t y, real_t z)
static real_t lam3(real_t x, real_t y, real_t z)
static Vector lam235(real_t x, real_t y, real_t z)
static real_t div_lam345_grad_lam345(real_t x, real_t y, real_t z)
static Vector lam25(real_t x, real_t y, real_t z)
static Vector nu01(real_t z, Vector xy, unsigned int ab)
void VT_T(int p, Vector s, Vector sds, Vector sdsxds, real_t mu, Vector grad_mu, DenseTensor &u) const
static Vector lam25_grad_lam25(real_t x, real_t y, real_t z)
static Vector lam415_grad_lam415(real_t x, real_t y, real_t z)
static Vector lam235_grad_lam235(real_t x, real_t y, real_t z)
static Vector mu01(real_t z)
static DenseMatrix grad_nu012(real_t z, Vector xy, unsigned int ab)
static void CalcIntegratedJacobi(int p, real_t alpha, real_t x, real_t t, real_t *u)
Integrated Jacobi Polynomials.
FuentesPyramid()=default
static real_t div_lam145_grad_lam145(real_t x, real_t y, real_t z)
void V_L(int p, Vector sx, const DenseMatrix &grad_sx, Vector sy, const DenseMatrix &grad_sy, real_t t, Vector grad_t, DenseTensor &u) const
static Vector lam125(real_t x, real_t y, real_t z)
Three component vectors associated with triangular faces.
static Vector grad_lam4(real_t x, real_t y, real_t z)
static Vector grad_nu2(real_t z, const Vector xy, unsigned int ab)
static Vector grad_mu1(real_t z)
void V_Q(int p, Vector s, Vector ds, Vector t, Vector dt, DenseTensor &u) const
static void CalcScaledLegendre(int p, real_t x, real_t t, real_t *u)
Shifted and Scaled Legendre Polynomials.
void E_T(int p, Vector s, Vector sds, DenseTensor &u) const
static real_t mu0(real_t z)
static Vector mu01(real_t z, Vector xy, unsigned int ab)
static Vector nu120(real_t z, Vector xy, unsigned int ab)
static Vector lam345(real_t x, real_t y, real_t z)
static real_t lam2(real_t x, real_t y, real_t z)
static void CalcHomogenizedScaJacobi(int p, real_t alpha, real_t t0, real_t t1, real_t *u)
static Vector lam15_grad_lam15(real_t x, real_t y, real_t z)
Computes .
static real_t mu0(real_t z, const Vector &xy, unsigned int ab)
static Vector lam35_grad_lam35(real_t x, real_t y, real_t z)
static real_t div_lam415_grad_lam415(real_t x, real_t y, real_t z)
static real_t lam1(real_t x, real_t y, real_t z)
Pyramid "Affine" Coordinates.
void V_T(int p, Vector s, Vector sdsxds, DenseTensor &u) const
static Vector lam435_grad_lam435(real_t x, real_t y, real_t z)
static real_t div_lam235_grad_lam235(real_t x, real_t y, real_t z)
static Vector grad_mu0(real_t z)
static constexpr real_t one
static DenseMatrix grad_lam35(real_t x, real_t y, real_t z)
static real_t lam5(real_t x, real_t y, real_t z)
static real_t mu1(real_t z, const Vector &xy, unsigned int ab)
static Vector lam415(real_t x, real_t y, real_t z)
static real_t nu0(real_t z, Vector xy, unsigned int ab)
static DenseMatrix grad_lam15(real_t x, real_t y, real_t z)
Gradients of the above two component vectors.
static Vector grad_nu1(real_t z, const Vector xy, unsigned int ab)
void E_Q(int p, Vector s, Vector ds, Vector t, DenseTensor &u) const
static Vector grad_lam1(real_t x, real_t y, real_t z)
Gradients of the "Affine" Coordinates.
static Vector lam15(real_t x, real_t y, real_t z)
Two component vectors associated with edges touching the apex.
static Vector mu01_grad_mu01(real_t z, Vector xy, unsigned int ab)
static Vector lam145(real_t x, real_t y, real_t z)
static real_t mu1(real_t z)
static real_t nu2(real_t z, Vector xy, unsigned int ab)
static Vector nu012_grad_nu012(real_t z, Vector xy, unsigned int ab)
static Vector grad_lam2(real_t x, real_t y, real_t z)
static Vector lam345_grad_lam345(real_t x, real_t y, real_t z)
static void CalcHomogenizedIntLegendre(int p, real_t t0, real_t t1, real_t *u)
static real_t div_lam125_grad_lam125(real_t x, real_t y, real_t z)
Divergences of the above "normal" vector functions divided by 3.
static DenseMatrix grad_lam45(real_t x, real_t y, real_t z)
static DenseMatrix grad_nu01(real_t z, Vector xy, unsigned int ab)
static real_t nu1(real_t z, Vector xy, unsigned int ab)
static Vector lam435(real_t x, real_t y, real_t z)
static void CalcIntegratedJacobi(int p, real_t alpha, real_t x, real_t t, Vector &u, Vector &dudx, Vector &dudt)
static bool CheckZ(real_t z)
static void CalcScaledJacobi(int p, real_t alpha, real_t x, real_t t, real_t *u)
Shifted and Scaled Jacobi Polynomials.
static void CalcHomogenizedScaLegendre(int p, real_t s0, real_t s1, real_t *u)
static Vector grad_nu0(real_t z, const Vector xy, unsigned int ab)
void phi_T(int p, Vector nu, DenseMatrix &u) const
static Vector nu12_grad_nu12(real_t z, Vector xy, unsigned int ab)
static real_t div_lam435_grad_lam435(real_t x, real_t y, real_t z)
static Vector grad_lam3(real_t x, real_t y, real_t z)
static constexpr real_t zero
Vector data type.
Definition vector.hpp:82
real_t * GetData() const
Return a pointer to the beginning of the Vector data.
Definition vector.hpp:243
const real_t alpha
Definition ex15.cpp:369
real_t mu
Definition ex25.cpp:140
real_t u(const Vector &xvec)
Definition lor_mms.hpp:22
float real_t
Definition config.hpp:46
real_t p(const Vector &x, real_t t)
static int DefaultType