use mpi::traits::*;
pub struct DomainDecomposition {
pub rank: usize,
pub size: usize,
pub global_shape: [usize; 3],
pub local_x1_range: (usize, usize),
pub ghost_width: usize,
}
impl DomainDecomposition {
pub fn new(global_shape: [usize; 3], ghost_width: usize, rank: usize, size: usize) -> Self {
let nx = global_shape[0];
let chunk = nx / size;
let start = rank * chunk;
let end = if rank == size - 1 { nx } else { start + chunk };
Self {
rank,
size,
global_shape,
local_x1_range: (start, end),
ghost_width,
}
}
pub fn local_nx1(&self) -> usize {
self.local_x1_range.1 - self.local_x1_range.0
}
}
pub struct MpiContext {
pub decomposition: DomainDecomposition,
}
impl MpiContext {
pub fn new(global_shape: [usize; 3], ghost_width: usize) -> Self {
let universe = mpi::initialize().expect("MPI initialization failed");
let world = universe.world();
let rank = world.rank() as usize;
let size = world.size() as usize;
Self {
decomposition: DomainDecomposition::new(global_shape, ghost_width, rank, size),
}
}
pub fn is_root(&self) -> bool {
self.decomposition.rank == 0
}
}