VTK  9.7.20261001
HexCnGradient.h
Go to the documentation of this file.
1// Gradients of the arbitrary-order Lagrange interpolants on the hexahedron.
2//
3// Each 1-d interpolant and its derivative are computed along each parametric
4// axis (see EdgeCnBasis.h and EdgeCnGradient.h), then combined by the product
5// rule to form the gradient of the tensor-product basis.
6RealT invspcR = RealT(order[0]) / 2.;
7RealT invspcS = RealT(order[1]) / 2.;
8RealT invspcT = RealT(order[2]) / 2.;
9
10WORKSPACE(RealT, rtmp, order[0] + 1);
11WORKSPACE(RealT, stmp, order[1] + 1);
12WORKSPACE(RealT, ttmp, order[2] + 1);
13WORKSPACE(RealT, drtmp, order[0] + 1);
14WORKSPACE(RealT, dstmp, order[1] + 1);
15WORKSPACE(RealT, dttmp, order[2] + 1);
16
17// Compute the basis and its derivative along the r-axis.
18for (int ll = 0; ll <= order[0]; ++ll)
19{
20 RealT termSum = 0.;
21 rtmp[ll] = 1.;
22 for (int kk = 0; kk <= order[0]; ++kk)
23 {
24 if (kk == ll)
25 {
26 continue;
27 }
28 rtmp[ll] *= (rr * invspcR - (RealT(kk) - invspcR)) / RealT(ll - kk);
29 RealT term = invspcR / RealT(ll - kk);
30 for (int ii = 0; ii <= order[0]; ++ii)
31 {
32 if (ii == kk || ii == ll)
33 {
34 continue;
35 }
36 term *= (rr * invspcR - (RealT(ii) - invspcR)) / RealT(ll - ii);
37 }
38 termSum += term;
39 }
40 drtmp[ll] = termSum;
41}
42
43// Compute the basis and its derivative along the s-axis.
44for (int mm = 0; mm <= order[1]; ++mm)
45{
46 RealT termSum = 0.;
47 stmp[mm] = 1.;
48 for (int kk = 0; kk <= order[1]; ++kk)
49 {
50 if (kk == mm)
51 {
52 continue;
53 }
54 stmp[mm] *= (ss * invspcS - (RealT(kk) - invspcS)) / RealT(mm - kk);
55 RealT term = invspcS / RealT(mm - kk);
56 for (int ii = 0; ii <= order[1]; ++ii)
57 {
58 if (ii == kk || ii == mm)
59 {
60 continue;
61 }
62 term *= (ss * invspcS - (RealT(ii) - invspcS)) / RealT(mm - ii);
63 }
64 termSum += term;
65 }
66 dstmp[mm] = termSum;
67}
68
69// Compute the basis and its derivative along the t-axis.
70for (int nn = 0; nn <= order[2]; ++nn)
71{
72 RealT termSum = 0.;
73 ttmp[nn] = 1.;
74 for (int kk = 0; kk <= order[2]; ++kk)
75 {
76 if (kk == nn)
77 {
78 continue;
79 }
80 ttmp[nn] *= (tt * invspcT - (RealT(kk) - invspcT)) / RealT(nn - kk);
81 RealT term = invspcT / RealT(nn - kk);
82 for (int ii = 0; ii <= order[2]; ++ii)
83 {
84 if (ii == kk || ii == nn)
85 {
86 continue;
87 }
88 term *= (tt * invspcT - (RealT(ii) - invspcT)) / RealT(nn - ii);
89 }
90 termSum += term;
91 }
92 dttmp[nn] = termSum;
93}
94
95// Compute the tensor product of basis derivatives as (∂/∂r, ∂/∂s, ∂/∂t) tuples:
96int idx = 0;
97for (int nn = 0; nn <= order[2]; ++nn)
98{
99 for (int mm = 0; mm <= order[1]; ++mm)
100 {
101 for (int ll = 0; ll <= order[0]; ++ll)
102 {
103 basisGradient[idx++] = drtmp[ll] * stmp[mm] * ttmp[nn]; // ∂/∂r
104 basisGradient[idx++] = rtmp[ll] * dstmp[mm] * ttmp[nn]; // ∂/∂s
105 basisGradient[idx++] = rtmp[ll] * stmp[mm] * dttmp[nn]; // ∂/∂t
106 }
107 }
108}
int idx
Definition HexCnBasis.h:79
WORKSPACE(RealT, rtmp, order[0]+1)
basisGradient[0]
RealT invspcT
Definition HexCnBasis.h:8
RealT invspcR
Definition HexCnBasis.h:6
RealT invspcS
Definition HexCnBasis.h:7
RealT nn
Definition TetCnBasis.h:7
int term
Definition HexGnBasis.h:23
@ order
Definition vtkX3D.h:441