runmat-meshing-core 0.6.0

Deterministic meshing preparation contracts for RunMat
Documentation
use serde::{Deserialize, Serialize};

use crate::quality::QualityThresholds;

use super::{backend::MeshBackendKind, topology::VolumeElementKind};

pub use runmat_meshing_size::refinement::{
    AdaptiveMeshingOptions, MeshRefinementOptions, RefinementConvergenceOptions,
    RefinementFocusLevel, RefinementFocusOptions, RefinementIndicatorMode,
    RefinementIndicatorOverrides, RefinementStrategy,
};

#[derive(Debug, Clone, Copy, PartialEq, Eq, Serialize, Deserialize)]
#[serde(rename_all = "snake_case")]
pub enum MeshKindRequest {
    Solid,
    Shell,
    Beam,
    DisplayOnly,
}

#[derive(Debug, Clone, Copy, PartialEq, Eq, Serialize, Deserialize)]
#[serde(rename_all = "snake_case")]
pub enum MeshElementOrder {
    Linear,
    Quadratic,
}

#[derive(Debug, Clone, Copy, PartialEq, Eq, Serialize, Deserialize)]
#[serde(rename_all = "snake_case")]
pub enum MeshProfile {
    Coarse,
    AnalysisReady,
    Adaptive,
    Fine,
}

#[derive(Debug, Clone, Copy, PartialEq, Serialize, Deserialize)]
#[serde(rename_all = "snake_case")]
pub enum MeshTargetSize {
    Auto,
    LengthM(f64),
}

#[derive(Debug, Clone, PartialEq, Serialize, Deserialize)]
pub struct MeshValidationPolicyOptions {
    #[serde(default)]
    pub quality: QualityThresholds,
    pub min_bounds_coverage_ratio: f64,
    pub min_volume_coverage_ratio: f64,
    pub min_boundary_area_ratio: f64,
    pub min_boundary_face_recovery_ratio: f64,
    pub min_boundary_edge_recovery_ratio: f64,
    #[serde(default)]
    pub max_volume_component_count: Option<usize>,
}

impl Default for MeshValidationPolicyOptions {
    fn default() -> Self {
        Self {
            quality: QualityThresholds::default(),
            min_bounds_coverage_ratio: 0.90,
            min_volume_coverage_ratio: 0.90,
            min_boundary_area_ratio: 0.90,
            min_boundary_face_recovery_ratio: 1.0,
            min_boundary_edge_recovery_ratio: 1.0,
            max_volume_component_count: None,
        }
    }
}

#[derive(Debug, Clone, PartialEq, Serialize, Deserialize)]
pub struct VolumeMeshingOptions {
    pub backend: MeshBackendKind,
    pub kind: MeshKindRequest,
    pub element: VolumeElementKind,
    pub element_order: MeshElementOrder,
    pub profile: MeshProfile,
    pub max_elements: usize,
    pub target_size: MeshTargetSize,
    #[serde(default)]
    pub min_size_m: Option<f64>,
    #[serde(default)]
    pub max_size_m: Option<f64>,
    #[serde(default)]
    pub growth_rate: Option<f64>,
    pub refinement: MeshRefinementOptions,
    #[serde(default)]
    pub validation: MeshValidationPolicyOptions,
}

impl Default for VolumeMeshingOptions {
    fn default() -> Self {
        Self {
            backend: MeshBackendKind::Auto,
            kind: MeshKindRequest::Solid,
            element: VolumeElementKind::Tetrahedron4,
            element_order: MeshElementOrder::Linear,
            profile: MeshProfile::AnalysisReady,
            max_elements: 250_000,
            target_size: MeshTargetSize::Auto,
            min_size_m: None,
            max_size_m: None,
            growth_rate: None,
            refinement: MeshRefinementOptions::default(),
            validation: MeshValidationPolicyOptions::default(),
        }
    }
}