runmat_meshing_core/contracts/
options.rs1use 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}