runmat-meshing-core 0.6.0

Deterministic meshing preparation contracts for RunMat
Documentation
use crate::{
    contracts::{
        artifact::ANALYSIS_MESH_SCHEMA_VERSION, AnalysisBoundaryEdge, AnalysisBoundaryFace,
        AnalysisMeshArtifact, AnalysisMeshNode, AnalysisMeshProvenance, AnalysisVolumeElement,
        BoundaryElementKind, MeshEntityProvenance, SourceEntityKind, VolumeElementKind,
    },
    quality::AnalysisMeshQualityReport,
};
use runmat_meshing_size::field::MeshSizingField;

pub(super) fn valid_tetrahedron_mesh() -> AnalysisMeshArtifact {
    AnalysisMeshArtifact {
        schema_version: ANALYSIS_MESH_SCHEMA_VERSION.to_string(),
        mesh_id: "mesh_valid".to_string(),
        nodes: vec![
            AnalysisMeshNode {
                node_id: 1,
                coordinates_m: [0.0, 0.0, 0.0],
                provenance: Vec::new(),
            },
            AnalysisMeshNode {
                node_id: 2,
                coordinates_m: [1.0, 0.0, 0.0],
                provenance: Vec::new(),
            },
            AnalysisMeshNode {
                node_id: 3,
                coordinates_m: [0.0, 1.0, 0.0],
                provenance: Vec::new(),
            },
            AnalysisMeshNode {
                node_id: 4,
                coordinates_m: [0.0, 0.0, 1.0],
                provenance: Vec::new(),
            },
        ],
        volume_elements: vec![AnalysisVolumeElement {
            element_id: "e1".to_string(),
            kind: VolumeElementKind::Tetrahedron4,
            node_ids: vec![1, 2, 3, 4],
            material_region_id: "mat_region".to_string(),
            provenance: Vec::new(),
        }],
        boundary_faces: vec![AnalysisBoundaryFace {
            face_id: "f1".to_string(),
            kind: BoundaryElementKind::Tri3,
            node_ids: vec![1, 2, 3],
            adjacent_volume_element_ids: vec!["e1".to_string()],
            region_ids: vec!["fixed".to_string()],
            provenance: Vec::new(),
        }],
        boundary_edges: Vec::new(),
        quality: AnalysisMeshQualityReport::default(),
        sizing: MeshSizingField::default(),
        field_topology: Vec::new(),
        backend: Default::default(),
        adaptive_iterations: Vec::new(),
        provenance: AnalysisMeshProvenance {
            algorithm: "test".to_string(),
            source_geometry_id: "geo".to_string(),
            source_geometry_revision: 1,
            source_geometry_sha256: None,
        },
    }
}

pub(super) fn solid_tetrahedron_mesh_with_plc_input_evidence() -> AnalysisMeshArtifact {
    let mut mesh = valid_tetrahedron_mesh();
    mesh.backend.backend = "solid".to_string();
    mesh.backend.algorithm = "plc_tetrahedron/v1".to_string();
    mesh.backend.plc_input_node_count = 4;
    mesh.backend.plc_input_facet_count = 4;
    mesh.backend.plc_input_protected_edge_count = 1;
    mesh.backend.plc_input_boundary_component_count = 1;
    mesh.backend.plc_input_boundary_component_node_count = 4;
    mesh.backend.plc_input_max_boundary_component_node_count = 4;
    mesh.backend.plc_input_shell_nesting_classified = true;
    mesh.backend.plc_input_outer_shell_count = 1;
    mesh.backend.plc_input_material_region_count = 1;
    mesh.backend.plc_input_material_region_facet_count = 4;
    mesh.backend.plc_input_surface_boundary_node_count = 4;
    mesh.backend.tetrahedron_generation_family = "single_tetrahedron".to_string();
    mesh.backend.tetrahedron_generation_attempted_family_count = 1;
    mesh.backend.tetrahedron_generation_rejected_family_count = 0;
    mesh.backend.tetrahedron_generation_selected_family_index = 1;
    mesh.backend.tetrahedron_material_region_count = 1;
    mesh.backend.tetrahedron_unclassified_material_element_count = 0;
    mesh.boundary_faces[0]
        .provenance
        .push(source_provenance(SourceEntityKind::Face, "source_face_1"));
    mesh.boundary_edges = vec![AnalysisBoundaryEdge {
        edge_id: "edge_1".to_string(),
        node_ids: [1, 2],
        adjacent_boundary_face_ids: vec!["f1".to_string()],
        region_ids: vec!["fixed".to_string()],
        provenance: vec![source_provenance(SourceEntityKind::Edge, "source_edge_1")],
    }];
    mesh
}

fn source_provenance(kind: SourceEntityKind, entity_id: &str) -> MeshEntityProvenance {
    MeshEntityProvenance {
        source_geometry_id: "geo".to_string(),
        source_geometry_revision: 1,
        source_entity_kind: kind,
        source_entity_id: entity_id.to_string(),
        region_ids: Vec::new(),
    }
}