Skip to main content

runmat_analysis_fea/assembly/elements/solid/
quality.rs

1use serde::{Deserialize, Serialize};
2
3#[derive(Debug, Clone, Copy, PartialEq, Serialize, Deserialize)]
4pub struct SolidElementQuality {
5    pub volume_m3: f64,
6    pub min_edge_length_m: f64,
7    pub max_edge_length_m: f64,
8    pub aspect_ratio: f64,
9}
10
11impl SolidElementQuality {
12    pub fn from_tetrahedron4_nodes(nodes_m: [[f64; 3]; 4], volume_m3: f64) -> Self {
13        let mut min_edge_length_m = f64::INFINITY;
14        let mut max_edge_length_m = 0.0_f64;
15        for (left, right) in [(0, 1), (0, 2), (0, 3), (1, 2), (1, 3), (2, 3)] {
16            let length = distance(nodes_m[left], nodes_m[right]);
17            min_edge_length_m = min_edge_length_m.min(length);
18            max_edge_length_m = max_edge_length_m.max(length);
19        }
20        let aspect_ratio = max_edge_length_m / min_edge_length_m.max(f64::EPSILON);
21        Self {
22            volume_m3,
23            min_edge_length_m,
24            max_edge_length_m,
25            aspect_ratio,
26        }
27    }
28}
29
30fn distance(left: [f64; 3], right: [f64; 3]) -> f64 {
31    ((right[0] - left[0]).powi(2) + (right[1] - left[1]).powi(2) + (right[2] - left[2]).powi(2))
32        .sqrt()
33}