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