mesh-sieve 4.0.1

Modular, high-performance Rust library for mesh and data management, designed for scientific computing and PDE codes.
Documentation
use crate::topology::point::PointId;
use crate::topology::{
    BOUNDARY_CLASS_LABEL, BOUNDARY_ROLE_LABEL, BoundaryClass, CoastalLabelQueries,
    CoastalMetadataError, CoastalValidationOptions, LabelSet, OpenBoundaryRole,
    VERTICAL_LAYER_LABEL, validate_coastal_metadata,
};

#[test]
fn canonical_coastal_queries_return_expected_points() {
    let p = |v| PointId::new(v).unwrap();
    let mut labels = LabelSet::new();
    labels.set_label(
        p(1),
        BOUNDARY_CLASS_LABEL,
        BoundaryClass::FreeSurface.code(),
    );
    labels.set_label(p(2), BOUNDARY_CLASS_LABEL, BoundaryClass::Bed.code());
    labels.set_label(p(3), BOUNDARY_CLASS_LABEL, BoundaryClass::Open.code());
    labels.set_label(p(3), BOUNDARY_ROLE_LABEL, OpenBoundaryRole::Inflow.code());
    labels.set_label(p(10), VERTICAL_LAYER_LABEL, 0);
    labels.set_label(p(11), VERTICAL_LAYER_LABEL, 1);

    assert_eq!(labels.free_surface_points(), vec![p(1)]);
    assert_eq!(labels.bed_points(), vec![p(2)]);
    assert_eq!(labels.open_boundary_points(), vec![p(3)]);
    assert_eq!(labels.inflow_points(), vec![p(3)]);
    assert_eq!(labels.vertical_layer_points(0), vec![p(10)]);
}

#[test]
fn validates_open_role_membership() {
    let p = |v| PointId::new(v).unwrap();
    let mut labels = LabelSet::new();
    labels.set_label(p(9), BOUNDARY_ROLE_LABEL, OpenBoundaryRole::Outflow.code());

    let err = validate_coastal_metadata(&labels, None, None, CoastalValidationOptions::default())
        .expect_err("open role without open class should fail");
    assert_eq!(
        err,
        CoastalMetadataError::OpenRoleWithoutOpenClass { points: vec![p(9)] }
    );
}

#[test]
fn validates_open_role_and_coverage() {
    let p = |v| PointId::new(v).unwrap();
    let mut labels = LabelSet::new();
    labels.set_label(p(2), BOUNDARY_CLASS_LABEL, BoundaryClass::Open.code());

    let err = validate_coastal_metadata(&labels, None, None, CoastalValidationOptions::default())
        .expect_err("open boundary role is required by default");
    assert_eq!(
        err,
        CoastalMetadataError::MissingOpenBoundaryRole { points: vec![p(2)] }
    );

    labels.set_label(p(2), BOUNDARY_ROLE_LABEL, OpenBoundaryRole::Tidal.code());

    let opts = CoastalValidationOptions {
        require_complete_boundary_partition: true,
        require_open_role_on_open_boundary: true,
        require_complete_vertical_coverage: true,
    };

    let err = validate_coastal_metadata(&labels, Some(&[p(1), p(2)]), Some(&[p(10)]), opts)
        .expect_err("missing coverage should fail");
    assert_eq!(
        err,
        CoastalMetadataError::MissingBoundaryClass { points: vec![p(1)] }
    );
}