parallel_io/
parallel_io.rs

1use itertools::izip;
2use mpi::{collective::CommunicatorCollectives, environment::Universe, traits::Communicator};
3use ndelement::{ciarlet::CiarletElement, map::IdentityMap, types::ReferenceCellType};
4use ndgrid::traits::{
5    DistributableGrid, Entity, Grid, ParallelBuilder, ParallelGrid, RONExportParallel,
6    RONImportParallel, Topology,
7};
8use ndgrid::{
9    shapes, types::GraphPartitioner, ParallelGridImpl, SingleElementGrid, SingleElementGridBuilder,
10};
11
12/// Grid I/O
13///
14/// Demonstration of importing and exporting a grid in parallel
15///
16/// Serial I/O is demonstrated in the example `io.rs`
17fn main() {
18    let universe: Universe = mpi::initialize().unwrap();
19    let comm = universe.world();
20    let rank = comm.rank();
21
22    let g = if rank == 0 {
23        // Create a grid using the shapes module: unit_cube_boundary will mesh the surface of a cube
24        let serial_g = shapes::unit_cube_boundary::<f64>(4, 5, 4, ReferenceCellType::Triangle);
25
26        // Distribute this grid across processes
27        serial_g.distribute(&comm, GraphPartitioner::None)
28    } else {
29        let b = SingleElementGridBuilder::<f64>::new(3, (ReferenceCellType::Triangle, 1));
30        b.create_parallel_grid(&comm, 0)
31    };
32
33    // If the serde option is used, the raw grid data can be exported in RON format
34    g.export_as_ron("_unit_cube_boundary_parallel.ron");
35
36    // Wait for export to finish
37    comm.barrier();
38
39    // A grid can be re-imported from raw RON data. Note that it must be imported on the same number of processes as it was exported using
40    let g2 = ParallelGridImpl::<'_, _, SingleElementGrid::<f64, CiarletElement<f64, IdentityMap>>>::import_from_ron(&comm, "_unit_cube_boundary_parallel.ron");
41
42    // Print the first 5 cells of each grid on process 0
43    if rank == 0 {
44        println!("The first 5 cells of the grids");
45        for (cell, cell2) in izip!(g.local_grid().cell_iter(), g2.local_grid().cell_iter()).take(5)
46        {
47            println!(
48                "{:?} {:?}",
49                cell.topology().sub_entity_iter(0).collect::<Vec<_>>(),
50                cell2.topology().sub_entity_iter(0).collect::<Vec<_>>(),
51            );
52        }
53    }
54}