runmat_analysis_fea/assembly/elements/solid/
quality.rs1use 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}