runmat-meshing-core 0.6.0

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

use super::options::VolumeMeshingOptions;

#[derive(Debug, Clone, Copy, PartialEq, Eq, Serialize, Deserialize)]
#[serde(rename_all = "snake_case")]
pub enum MeshBackendKind {
    Auto,
    Solid,
    StructuredGridTetrahedron,
}

impl Default for MeshBackendKind {
    fn default() -> Self {
        Self::Auto
    }
}

#[derive(Debug, Clone, PartialEq, Eq)]
pub struct MeshBackendSelection {
    pub requested: MeshBackendKind,
    pub selected: MeshBackendKind,
    pub solid_ready: bool,
    pub reason: &'static str,
}

pub fn select_volume_backend(options: &VolumeMeshingOptions) -> MeshBackendSelection {
    match options.backend {
        MeshBackendKind::Auto => MeshBackendSelection {
            requested: MeshBackendKind::Auto,
            selected: MeshBackendKind::Solid,
            solid_ready: true,
            reason: "solid_backend_default",
        },
        MeshBackendKind::Solid => MeshBackendSelection {
            requested: MeshBackendKind::Solid,
            selected: MeshBackendKind::Solid,
            solid_ready: true,
            reason: "explicit_solid_backend",
        },
        MeshBackendKind::StructuredGridTetrahedron => MeshBackendSelection {
            requested: MeshBackendKind::StructuredGridTetrahedron,
            selected: MeshBackendKind::StructuredGridTetrahedron,
            solid_ready: false,
            reason: "explicit_structured_grid_tetrahedron",
        },
    }
}

#[cfg(test)]
mod tests {
    use super::*;

    #[test]
    fn auto_selects_solid_backend() {
        let selection = select_volume_backend(&VolumeMeshingOptions::default());

        assert_eq!(selection.requested, MeshBackendKind::Auto);
        assert_eq!(selection.selected, MeshBackendKind::Solid);
        assert!(selection.solid_ready);
        assert_eq!(selection.reason, "solid_backend_default");
    }

    #[test]
    fn explicit_structured_grid_tetrahedron_selects_structured_backend() {
        let selection = select_volume_backend(&VolumeMeshingOptions {
            backend: MeshBackendKind::StructuredGridTetrahedron,
            ..VolumeMeshingOptions::default()
        });

        assert_eq!(
            selection.requested,
            MeshBackendKind::StructuredGridTetrahedron
        );
        assert_eq!(
            selection.selected,
            MeshBackendKind::StructuredGridTetrahedron
        );
        assert!(!selection.solid_ready);
        assert_eq!(selection.reason, "explicit_structured_grid_tetrahedron");
    }
}