conspire/domain/fem/block/element/linear/hexahedron/
mod.rs

1const G: usize = 8;
2const N: usize = 8;
3
4pub type Hexahedron = Element<G, N>;
5
6crate::fem::block::element::linear::implement!(Hexahedron);
7
8use super::FRAC_1_SQRT_3;
9
10impl Hexahedron {
11    const fn integration_points() -> [[Scalar; M]; G] {
12        [
13            [-FRAC_1_SQRT_3, -FRAC_1_SQRT_3, -FRAC_1_SQRT_3],
14            [-FRAC_1_SQRT_3, -FRAC_1_SQRT_3, FRAC_1_SQRT_3],
15            [-FRAC_1_SQRT_3, FRAC_1_SQRT_3, -FRAC_1_SQRT_3],
16            [-FRAC_1_SQRT_3, FRAC_1_SQRT_3, FRAC_1_SQRT_3],
17            [FRAC_1_SQRT_3, -FRAC_1_SQRT_3, -FRAC_1_SQRT_3],
18            [FRAC_1_SQRT_3, -FRAC_1_SQRT_3, FRAC_1_SQRT_3],
19            [FRAC_1_SQRT_3, FRAC_1_SQRT_3, -FRAC_1_SQRT_3],
20            [FRAC_1_SQRT_3, FRAC_1_SQRT_3, FRAC_1_SQRT_3],
21        ]
22    }
23    const fn integration_weight() -> Scalars<G> {
24        Scalars::<G>::const_from([1.0; G])
25    }
26    const fn reference() -> ElementNodalReferenceCoordinates<N> {
27        ElementNodalReferenceCoordinates::<N>::const_from([
28            [-1.0, -1.0, -1.0],
29            [1.0, -1.0, -1.0],
30            [1.0, 1.0, -1.0],
31            [-1.0, 1.0, -1.0],
32            [-1.0, -1.0, 1.0],
33            [1.0, -1.0, 1.0],
34            [1.0, 1.0, 1.0],
35            [-1.0, 1.0, 1.0],
36        ])
37    }
38    #[cfg(test)]
39    const fn shape_functions([xi_1, xi_2, xi_3]: [Scalar; M]) -> [Scalar; N] {
40        [
41            (1.0 - xi_1) * (1.0 - xi_2) * (1.0 - xi_3) / 8.0,
42            (1.0 + xi_1) * (1.0 - xi_2) * (1.0 - xi_3) / 8.0,
43            (1.0 + xi_1) * (1.0 + xi_2) * (1.0 - xi_3) / 8.0,
44            (1.0 - xi_1) * (1.0 + xi_2) * (1.0 - xi_3) / 8.0,
45            (1.0 - xi_1) * (1.0 - xi_2) * (1.0 + xi_3) / 8.0,
46            (1.0 + xi_1) * (1.0 - xi_2) * (1.0 + xi_3) / 8.0,
47            (1.0 + xi_1) * (1.0 + xi_2) * (1.0 + xi_3) / 8.0,
48            (1.0 - xi_1) * (1.0 + xi_2) * (1.0 + xi_3) / 8.0,
49        ]
50    }
51    const fn shape_functions_gradients([xi_1, xi_2, xi_3]: [Scalar; M]) -> [[Scalar; M]; N] {
52        [
53            [
54                -(1.0 - xi_2) * (1.0 - xi_3) / 8.0,
55                -(1.0 - xi_1) * (1.0 - xi_3) / 8.0,
56                -(1.0 - xi_1) * (1.0 - xi_2) / 8.0,
57            ],
58            [
59                (1.0 - xi_2) * (1.0 - xi_3) / 8.0,
60                -(1.0 + xi_1) * (1.0 - xi_3) / 8.0,
61                -(1.0 + xi_1) * (1.0 - xi_2) / 8.0,
62            ],
63            [
64                (1.0 + xi_2) * (1.0 - xi_3) / 8.0,
65                (1.0 + xi_1) * (1.0 - xi_3) / 8.0,
66                -(1.0 + xi_1) * (1.0 + xi_2) / 8.0,
67            ],
68            [
69                -(1.0 + xi_2) * (1.0 - xi_3) / 8.0,
70                (1.0 - xi_1) * (1.0 - xi_3) / 8.0,
71                -(1.0 - xi_1) * (1.0 + xi_2) / 8.0,
72            ],
73            [
74                -(1.0 - xi_2) * (1.0 + xi_3) / 8.0,
75                -(1.0 - xi_1) * (1.0 + xi_3) / 8.0,
76                (1.0 - xi_1) * (1.0 - xi_2) / 8.0,
77            ],
78            [
79                (1.0 - xi_2) * (1.0 + xi_3) / 8.0,
80                -(1.0 + xi_1) * (1.0 + xi_3) / 8.0,
81                (1.0 + xi_1) * (1.0 - xi_2) / 8.0,
82            ],
83            [
84                (1.0 + xi_2) * (1.0 + xi_3) / 8.0,
85                (1.0 + xi_1) * (1.0 + xi_3) / 8.0,
86                (1.0 + xi_1) * (1.0 + xi_2) / 8.0,
87            ],
88            [
89                -(1.0 + xi_2) * (1.0 + xi_3) / 8.0,
90                (1.0 - xi_1) * (1.0 + xi_3) / 8.0,
91                (1.0 - xi_1) * (1.0 + xi_2) / 8.0,
92            ],
93        ]
94    }
95}