conspire/domain/fem/block/element/quadratic/tetrahedron/
mod.rs1#[cfg(test)]
2pub mod test;
3
4use crate::{
5 fem::block::element::{
6 ElementNodalEitherCoordinates, FiniteElement, ParametricCoordinate, ParametricCoordinates,
7 ParametricReference, 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 scaled_jacobians<const I: usize>(
53 _nodal_coordinates: ElementNodalEitherCoordinates<I, N>,
54 ) -> ScalarList<P> {
55 todo!()
56 }
57 fn shape_functions(parametric_coordinate: ParametricCoordinate<M>) -> ShapeFunctions<N> {
58 let [xi_1, xi_2, xi_3] = parametric_coordinate.into();
59 let xi_0 = 1.0 - xi_1 - xi_2 - xi_3;
60 [
61 xi_0 * (2.0 * xi_0 - 1.0),
62 xi_1 * (2.0 * xi_1 - 1.0),
63 xi_2 * (2.0 * xi_2 - 1.0),
64 xi_3 * (2.0 * xi_3 - 1.0),
65 4.0 * xi_0 * xi_1,
66 4.0 * xi_1 * xi_2,
67 4.0 * xi_0 * xi_2,
68 4.0 * xi_0 * xi_3,
69 4.0 * xi_1 * xi_3,
70 4.0 * xi_2 * xi_3,
71 ]
72 .into()
73 }
74 fn shape_functions_gradients(
75 parametric_coordinate: ParametricCoordinate<M>,
76 ) -> ShapeFunctionsGradients<M, N> {
77 let [xi_1, xi_2, xi_3] = parametric_coordinate.into();
78 let xi_0 = 1.0 - xi_1 - xi_2 - xi_3;
79 [
80 [-4.0 * xi_0 + 1.0, -4.0 * xi_0 + 1.0, -4.0 * xi_0 + 1.0],
81 [4.0 * xi_1 - 1.0, 0.0, 0.0],
82 [0.0, 4.0 * xi_2 - 1.0, 0.0],
83 [0.0, 0.0, 4.0 * xi_3 - 1.0],
84 [4.0 * (xi_0 - xi_1), -4.0 * xi_1, -4.0 * xi_1],
85 [4.0 * xi_2, 4.0 * xi_1, 0.0],
86 [-4.0 * xi_2, 4.0 * (xi_0 - xi_2), -4.0 * xi_2],
87 [-4.0 * xi_3, -4.0 * xi_3, 4.0 * (xi_0 - xi_3)],
88 [4.0 * xi_3, 0.0, 4.0 * xi_1],
89 [0.0, 4.0 * xi_3, 4.0 * xi_2],
90 ]
91 .into()
92 }
93}
94
95impl QuadraticFiniteElement<G, N> for Tetrahedron {}