Skip to main content

runmat_meshing_size/adaptive/
iteration.rs

1use serde::{Deserialize, Serialize};
2
3use super::{AdaptiveConvergenceStatus, RefinementIndicatorSummary, RefinementMarker};
4use crate::field::{MeshSizingField, SizingSample};
5
6#[derive(Debug, Clone, PartialEq, Serialize, Deserialize, Default)]
7pub struct SizingFieldUpdate {
8    #[serde(default)]
9    pub samples: Vec<SizingSample>,
10    #[serde(default)]
11    pub min_size_m: Option<f64>,
12    #[serde(default)]
13    pub max_size_m: Option<f64>,
14}
15
16impl SizingFieldUpdate {
17    pub fn apply_to(self, sizing: &mut MeshSizingField) {
18        if let Some(min_size_m) = self.min_size_m {
19            sizing.min_size_m = Some(match sizing.min_size_m {
20                Some(existing) => existing.min(min_size_m),
21                None => min_size_m,
22            });
23        }
24        if let Some(max_size_m) = self.max_size_m {
25            sizing.max_size_m = Some(match sizing.max_size_m {
26                Some(existing) => existing.max(max_size_m),
27                None => max_size_m,
28            });
29        }
30        sizing.samples.extend(self.samples);
31    }
32}
33
34#[derive(Debug, Clone, PartialEq, Serialize, Deserialize)]
35pub struct AdaptiveIterationSummary {
36    pub iteration_index: usize,
37    pub node_count: usize,
38    pub element_count: usize,
39    pub convergence_status: AdaptiveConvergenceStatus,
40    #[serde(default)]
41    pub indicators: Vec<RefinementIndicatorSummary>,
42    #[serde(default)]
43    pub markers: Vec<RefinementMarker>,
44    #[serde(default)]
45    pub sizing_update: SizingFieldUpdate,
46}