VTK  9.7.20261001
TetCnGradient.h
Go to the documentation of this file.
1// Gradients of the arbitrary-order Lagrange interpolants on the tetrahedron.
2//
3// See TetCnBasis.h for the interpolants and TriCnGradient.h for the chain rule;
4// here ∂λ0/∂r = -1, ∂λ1/∂r = 1 and the other barycentric coordinates are
5// constant along r (and likewise for s and t), so
6//
7// ∂L/∂r = P_{i2} P_{i3} (P'_{i1} P_{i0} - P'_{i0} P_{i1})
8RealT nn = RealT(order[0]);
9
10WORKSPACE(RealT, bary, 4);
11bary[0] = 1. - rr - ss - tt;
12bary[1] = rr;
13bary[2] = ss;
14bary[3] = tt;
15
16WORKSPACE(RealT, pval, 4 * (order[0] + 1));
17WORKSPACE(RealT, pder, 4 * (order[0] + 1));
18for (int kk = 0; kk < 4; ++kk)
19{
20 int base = kk * (order[0] + 1);
21 pval[base] = 1.;
22 pder[base] = 0.;
23 for (int mm = 1; mm <= order[0]; ++mm)
24 {
25 RealT rmm = RealT(mm);
26 RealT factor = nn * bary[kk] - (rmm - 1.);
27 pder[base + mm] = (pder[base + mm - 1] * factor + pval[base + mm - 1] * nn) / rmm;
28 pval[base + mm] = pval[base + mm - 1] * factor / rmm;
29 }
30}
31
32int idx = 0;
33for (int i3 = 0; i3 <= order[0]; ++i3)
34{
35 for (int i2 = 0; i2 <= order[0] - i3; ++i2)
36 {
37 for (int i1 = 0; i1 <= order[0] - i2 - i3; ++i1)
38 {
39 int i0 = order[0] - i1 - i2 - i3;
40 RealT p0 = pval[i0];
41 RealT p1 = pval[(order[0] + 1) + i1];
42 RealT p2 = pval[2 * (order[0] + 1) + i2];
43 RealT p3 = pval[3 * (order[0] + 1) + i3];
44 RealT d0 = pder[i0];
45 RealT d1 = pder[(order[0] + 1) + i1];
46 RealT d2 = pder[2 * (order[0] + 1) + i2];
47 RealT d3 = pder[3 * (order[0] + 1) + i3];
48 basisGradient[idx++] = p2 * p3 * (d1 * p0 - d0 * p1); // ∂/∂r
49 basisGradient[idx++] = p1 * p3 * (d2 * p0 - d0 * p2); // ∂/∂s
50 basisGradient[idx++] = p1 * p2 * (d3 * p0 - d0 * p3); // ∂/∂t
51 }
52 }
53}
int idx
Definition HexCnBasis.h:79
bary[0]
Definition TetCnBasis.h:15
WORKSPACE(RealT, bary, 4)
basisGradient[0]
RealT nn
Definition TetCnBasis.h:7