conspire/domain/fem/block/element/linear/hexahedron/
mod.rs1const 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}