runmat_meshing_size/adaptive/
iteration.rs1use 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}