conspire/domain/fem/block/element/quadratic/tetrahedron/
mod.rs1#[cfg(test)]
2pub mod test;
3
4use crate::{
5 fem::block::element::{
6 FiniteElement, ParametricCoordinate, ParametricCoordinates, ParametricReference,
7 ShapeFunctions, ShapeFunctionsGradients,
8 quadratic::{M, QuadraticElement, QuadraticFiniteElement},
9 },
10 math::ScalarList,
11};
12
13const G: usize = 4;
14const N: usize = 10;
15const P: usize = N;
16
17pub type Tetrahedron = QuadraticElement<G, N>;
18
19impl FiniteElement<G, M, N, P> for Tetrahedron {
20 fn integration_points() -> ParametricCoordinates<G, M> {
21 let alpha = (1.0 + 3.0 / 5.0_f64.sqrt()) / 4.0;
22 let beta = (1.0 - 1.0 / 5.0_f64.sqrt()) / 4.0;
23 [
24 [beta, beta, beta],
25 [alpha, beta, beta],
26 [beta, alpha, beta],
27 [beta, beta, alpha],
28 ]
29 .into()
30 }
31 fn integration_weights(&self) -> &ScalarList<G> {
32 &self.integration_weights
33 }
34 fn parametric_reference() -> ParametricReference<M, N> {
35 [
36 [0.0, 0.0, 0.0],
37 [1.0, 0.0, 0.0],
38 [0.0, 1.0, 0.0],
39 [0.0, 0.0, 1.0],
40 [0.5, 0.0, 0.0],
41 [0.5, 0.5, 0.0],
42 [0.0, 0.5, 0.0],
43 [0.0, 0.0, 0.5],
44 [0.5, 0.0, 0.5],
45 [0.0, 0.5, 0.5],
46 ]
47 .into()
48 }
49 fn parametric_weights() -> ScalarList<G> {
50 [1.0 / 24.0; G].into()
51 }
52 fn shape_functions(parametric_coordinate: ParametricCoordinate<M>) -> ShapeFunctions<N> {
53 let [xi_1, xi_2, xi_3] = parametric_coordinate.into();
54 let xi_0 = 1.0 - xi_1 - xi_2 - xi_3;
55 [
56 xi_0 * (2.0 * xi_0 - 1.0),
57 xi_1 * (2.0 * xi_1 - 1.0),
58 xi_2 * (2.0 * xi_2 - 1.0),
59 xi_3 * (2.0 * xi_3 - 1.0),
60 4.0 * xi_0 * xi_1,
61 4.0 * xi_1 * xi_2,
62 4.0 * xi_0 * xi_2,
63 4.0 * xi_0 * xi_3,
64 4.0 * xi_1 * xi_3,
65 4.0 * xi_2 * xi_3,
66 ]
67 .into()
68 }
69 fn shape_functions_gradients(
70 parametric_coordinate: ParametricCoordinate<M>,
71 ) -> ShapeFunctionsGradients<M, N> {
72 let [xi_1, xi_2, xi_3] = parametric_coordinate.into();
73 let xi_0 = 1.0 - xi_1 - xi_2 - xi_3;
74 [
75 [-4.0 * xi_0 + 1.0, -4.0 * xi_0 + 1.0, -4.0 * xi_0 + 1.0],
76 [4.0 * xi_1 - 1.0, 0.0, 0.0],
77 [0.0, 4.0 * xi_2 - 1.0, 0.0],
78 [0.0, 0.0, 4.0 * xi_3 - 1.0],
79 [4.0 * (xi_0 - xi_1), -4.0 * xi_1, -4.0 * xi_1],
80 [4.0 * xi_2, 4.0 * xi_1, 0.0],
81 [-4.0 * xi_2, 4.0 * (xi_0 - xi_2), -4.0 * xi_2],
82 [-4.0 * xi_3, -4.0 * xi_3, 4.0 * (xi_0 - xi_3)],
83 [4.0 * xi_3, 0.0, 4.0 * xi_1],
84 [0.0, 4.0 * xi_3, 4.0 * xi_2],
85 ]
86 .into()
87 }
88}
89
90impl QuadraticFiniteElement<G, N> for Tetrahedron {}