conspire 0.7.1

The Rust interface to conspire.
Documentation
use crate::{
    geometry::{
        grid::{Input, Voxels},
        mesh::Mesh,
    },
    io::{Npy, Write},
};

fn first_element(mesh: &Mesh<3>, block: usize) -> &[usize] {
    mesh.iter().nth(block).unwrap().iter().next().unwrap()
}

fn min_corner(mesh: &Mesh<3>, element: &[usize]) -> [usize; 3] {
    let coordinates = mesh.coordinates();
    let mut min = [usize::MAX; 3];
    element.iter().for_each(|&node| {
        let point = &coordinates[node];
        (0..3).for_each(|axis| min[axis] = min[axis].min(point[axis] as usize))
    });
    min
}

#[test]
fn c_order_npy_meshes_with_correct_orientation() {
    let nel = [2usize, 1, 3];
    let [nx, ny, nz] = nel;
    let path = "target/orient_mesh.npy";
    Npy {
        data: (1..=(nx * ny * nz) as u8).collect(),
        shape: vec![nx, ny, nz],
        fortran_order: false,
    }
    .write(path)
    .unwrap();
    let voxels = Voxels::<u8>::try_from(Input::Npy(path)).unwrap();
    let mesh = Mesh::from_voxels(voxels, None);
    assert_eq!(min_corner(&mesh, first_element(&mesh, 3)), [1, 0, 0]);
    assert_eq!(min_corner(&mesh, first_element(&mesh, 2)), [0, 0, 2]);
    assert_eq!(min_corner(&mesh, first_element(&mesh, 0)), [0, 0, 0]);
    assert_eq!(min_corner(&mesh, first_element(&mesh, 5)), [1, 0, 2]);
}

#[test]
fn all_voxels_grouped_by_material() {
    let mesh = Mesh::from_voxels(Voxels::new(vec![1u8, 2], [2, 1, 1]), None);
    assert_eq!(mesh.number_of_elements(), 2);
    assert_eq!(mesh.number_of_nodes(), 12);
    assert_eq!(mesh.number_of_element_blocks(), 2);
    assert_eq!(first_element(&mesh, 0), [0, 1, 4, 3, 6, 7, 10, 9]);
    assert_eq!(first_element(&mesh, 1), [1, 2, 5, 4, 7, 8, 11, 10]);
}

#[test]
fn removes_material() {
    let mesh = Mesh::from_voxels(Voxels::new(vec![1u8, 2], [2, 1, 1]), Some(&[2]));
    assert_eq!(mesh.number_of_elements(), 1);
    assert_eq!(mesh.number_of_nodes(), 8);
    assert_eq!(mesh.number_of_element_blocks(), 1);
    assert_eq!(first_element(&mesh, 0), [0, 1, 3, 2, 4, 5, 7, 6]);
}