mesh-sieve 4.0.2

Modular, high-performance Rust library for mesh and data management, designed for scientific computing and PDE codes.
Documentation
// Example demonstrating reading and writing mixed sections in a mesh using Mesh Sieve.
// cargo run --example mixed_sections
use mesh_sieve::data::atlas::Atlas;
use mesh_sieve::data::coordinates::Coordinates;
use mesh_sieve::data::mixed_section::MixedSectionStore;
use mesh_sieve::data::section::Section;
use mesh_sieve::data::storage::VecStorage;
use mesh_sieve::io::{
    MeshData, SieveSectionReader, SieveSectionWriter, gmsh::GmshReader, gmsh::GmshWriter,
};
use mesh_sieve::topology::cell_type::CellType;
use mesh_sieve::topology::point::PointId;
use mesh_sieve::topology::sieve::{MeshSieve, MutableSieve, Sieve};

fn main() -> Result<(), Box<dyn std::error::Error>> {
    let p1 = PointId::new(1)?;
    let p2 = PointId::new(2)?;
    let elem = PointId::new(3)?;

    let mut sieve = MeshSieve::default();
    MutableSieve::add_point(&mut sieve, p1);
    MutableSieve::add_point(&mut sieve, p2);
    MutableSieve::add_point(&mut sieve, elem);
    sieve.add_arrow(elem, p1, ());
    sieve.add_arrow(elem, p2, ());

    let mut coord_atlas = Atlas::default();
    coord_atlas.try_insert(p1, 2)?;
    coord_atlas.try_insert(p2, 2)?;
    let mut coords = Coordinates::<f64, VecStorage<f64>>::try_new(2, 2, coord_atlas)?;
    coords.section_mut().try_set(p1, &[0.0, 0.0])?;
    coords.section_mut().try_set(p2, &[1.0, 0.0])?;

    let mut cell_atlas = Atlas::default();
    cell_atlas.try_insert(elem, 1)?;
    let mut cell_types = Section::<CellType, VecStorage<CellType>>::new(cell_atlas);
    cell_types.try_set(elem, &[CellType::Segment])?;

    let mut temp_atlas = Atlas::default();
    temp_atlas.try_insert(p1, 1)?;
    temp_atlas.try_insert(p2, 1)?;
    let mut temperature = Section::<f64, VecStorage<f64>>::new(temp_atlas);
    temperature.try_set(p1, &[300.0])?;
    temperature.try_set(p2, &[310.0])?;

    let mut mat_atlas = Atlas::default();
    mat_atlas.try_insert(elem, 1)?;
    let mut material_id = Section::<i32, VecStorage<i32>>::new(mat_atlas);
    material_id.try_set(elem, &[7])?;

    let mut mixed_sections = MixedSectionStore::default();
    mixed_sections.insert::<f64>("temperature", temperature);
    mixed_sections.insert::<i32>("material_id", material_id);

    let mut mesh = MeshData::new(sieve);
    mesh.coordinates = Some(coords);
    mesh.cell_types = Some(cell_types);
    mesh.mixed_sections = mixed_sections;

    let mut buffer = Vec::new();
    GmshWriter::default().write(&mut buffer, &mesh)?;

    let round_trip = GmshReader::default().read(buffer.as_slice())?;
    let temps = round_trip
        .mixed_sections
        .get::<f64>("temperature")
        .expect("temperature section missing");
    let mats = round_trip
        .mixed_sections
        .get::<i32>("material_id")
        .expect("material_id section missing");

    println!("temperature len = {}", temps.atlas().points().count());
    println!("material_id len = {}", mats.atlas().points().count());
    Ok(())
}