use serde::{Deserialize, Serialize};
use super::{AdaptiveConvergenceStatus, RefinementIndicatorSummary, RefinementMarker};
use crate::field::{MeshSizingField, SizingSample};
#[derive(Debug, Clone, PartialEq, Serialize, Deserialize, Default)]
pub struct SizingFieldUpdate {
#[serde(default)]
pub samples: Vec<SizingSample>,
#[serde(default)]
pub min_size_m: Option<f64>,
#[serde(default)]
pub max_size_m: Option<f64>,
}
impl SizingFieldUpdate {
pub fn apply_to(self, sizing: &mut MeshSizingField) {
if let Some(min_size_m) = self.min_size_m {
sizing.min_size_m = Some(match sizing.min_size_m {
Some(existing) => existing.min(min_size_m),
None => min_size_m,
});
}
if let Some(max_size_m) = self.max_size_m {
sizing.max_size_m = Some(match sizing.max_size_m {
Some(existing) => existing.max(max_size_m),
None => max_size_m,
});
}
sizing.samples.extend(self.samples);
}
}
#[derive(Debug, Clone, PartialEq, Serialize, Deserialize)]
pub struct AdaptiveIterationSummary {
pub iteration_index: usize,
pub node_count: usize,
pub element_count: usize,
pub convergence_status: AdaptiveConvergenceStatus,
#[serde(default)]
pub indicators: Vec<RefinementIndicatorSummary>,
#[serde(default)]
pub markers: Vec<RefinementMarker>,
#[serde(default)]
pub sizing_update: SizingFieldUpdate,
}