Skip to main content

runmat_meshing_core/contracts/
options.rs

1use serde::{Deserialize, Serialize};
2
3use crate::quality::QualityThresholds;
4
5use super::{backend::MeshBackendKind, topology::VolumeElementKind};
6
7pub use runmat_meshing_size::refinement::{
8    AdaptiveMeshingOptions, MeshRefinementOptions, RefinementConvergenceOptions,
9    RefinementFocusLevel, RefinementFocusOptions, RefinementIndicatorMode,
10    RefinementIndicatorOverrides, RefinementStrategy,
11};
12
13#[derive(Debug, Clone, Copy, PartialEq, Eq, Serialize, Deserialize)]
14#[serde(rename_all = "snake_case")]
15pub enum MeshKindRequest {
16    Solid,
17    Shell,
18    Beam,
19    DisplayOnly,
20}
21
22#[derive(Debug, Clone, Copy, PartialEq, Eq, Serialize, Deserialize)]
23#[serde(rename_all = "snake_case")]
24pub enum MeshElementOrder {
25    Linear,
26    Quadratic,
27}
28
29#[derive(Debug, Clone, Copy, PartialEq, Eq, Serialize, Deserialize)]
30#[serde(rename_all = "snake_case")]
31pub enum MeshProfile {
32    Coarse,
33    AnalysisReady,
34    Adaptive,
35    Fine,
36}
37
38#[derive(Debug, Clone, Copy, PartialEq, Serialize, Deserialize)]
39#[serde(rename_all = "snake_case")]
40pub enum MeshTargetSize {
41    Auto,
42    LengthM(f64),
43}
44
45#[derive(Debug, Clone, PartialEq, Serialize, Deserialize)]
46pub struct MeshValidationPolicyOptions {
47    #[serde(default)]
48    pub quality: QualityThresholds,
49    pub min_bounds_coverage_ratio: f64,
50    pub min_volume_coverage_ratio: f64,
51    pub min_boundary_area_ratio: f64,
52    pub min_boundary_face_recovery_ratio: f64,
53    pub min_boundary_edge_recovery_ratio: f64,
54    #[serde(default)]
55    pub max_volume_component_count: Option<usize>,
56}
57
58impl Default for MeshValidationPolicyOptions {
59    fn default() -> Self {
60        Self {
61            quality: QualityThresholds::default(),
62            min_bounds_coverage_ratio: 0.90,
63            min_volume_coverage_ratio: 0.90,
64            min_boundary_area_ratio: 0.90,
65            min_boundary_face_recovery_ratio: 1.0,
66            min_boundary_edge_recovery_ratio: 1.0,
67            max_volume_component_count: None,
68        }
69    }
70}
71
72#[derive(Debug, Clone, PartialEq, Serialize, Deserialize)]
73pub struct VolumeMeshingOptions {
74    pub backend: MeshBackendKind,
75    pub kind: MeshKindRequest,
76    pub element: VolumeElementKind,
77    pub element_order: MeshElementOrder,
78    pub profile: MeshProfile,
79    pub max_elements: usize,
80    pub target_size: MeshTargetSize,
81    #[serde(default)]
82    pub min_size_m: Option<f64>,
83    #[serde(default)]
84    pub max_size_m: Option<f64>,
85    #[serde(default)]
86    pub growth_rate: Option<f64>,
87    pub refinement: MeshRefinementOptions,
88    #[serde(default)]
89    pub validation: MeshValidationPolicyOptions,
90}
91
92impl Default for VolumeMeshingOptions {
93    fn default() -> Self {
94        Self {
95            backend: MeshBackendKind::Auto,
96            kind: MeshKindRequest::Solid,
97            element: VolumeElementKind::Tetrahedron4,
98            element_order: MeshElementOrder::Linear,
99            profile: MeshProfile::AnalysisReady,
100            max_elements: 250_000,
101            target_size: MeshTargetSize::Auto,
102            min_size_m: None,
103            max_size_m: None,
104            growth_rate: None,
105            refinement: MeshRefinementOptions::default(),
106            validation: MeshValidationPolicyOptions::default(),
107        }
108    }
109}