#[cfg(not(feature = "mpi"))]
fn main() {
println!("WARNING: MPI not enabled.");
}
#[cfg(feature = "mpi")]
pub fn main() {
use mpi::traits::Communicator;
use rlst::distributed_tools::GhostCommunicator;
let universe = mpi::initialize().unwrap();
let world = universe.world();
let rank = world.rank();
if world.size() != 3 {
println!("Please run this example with 3 MPI ranks.");
return;
}
assert_eq!(
world.size(),
3,
"This example is designed for three MPI ranks."
);
let ghost_comm = if rank == 0 {
GhostCommunicator::new(&[5, 6], &[1, 1], &world)
} else if rank == 1 {
GhostCommunicator::new(&[10], &[2], &world)
} else {
GhostCommunicator::new(&[5, 0, 1, 2], &[1, 0, 0, 0], &world)
};
if rank == 2 {
println!(
"Process 1: In ranks: {:#?}, Out ranks: {:#?}, send_counts: {:#?}, receive_counts: {:#?}, receive_indices: {:#?}, send_indices: {:#?}",
ghost_comm.in_ranks(),
ghost_comm.out_ranks(),
ghost_comm.send_counts(),
ghost_comm.receive_counts(),
ghost_comm.receive_indices(),
ghost_comm.send_indices(),
);
}
let data = if rank == 0 {
vec![10, 11, 12]
} else if rank == 1 {
vec![13, 14, 13]
} else {
vec![15]
};
let mut received_data = vec![0; ghost_comm.total_receive_count()];
ghost_comm.forward_send_values(&data, &mut received_data);
if rank == 0 {
assert_eq!(received_data[0], 13);
assert_eq!(received_data[1], 14);
} else if rank == 1 {
assert_eq!(received_data[0], 15);
} else {
assert_eq!(received_data[0], 10);
assert_eq!(received_data[1], 11);
assert_eq!(received_data[2], 12);
assert_eq!(received_data[3], 13);
}
let mut send_data = vec![0; ghost_comm.total_send_count()];
ghost_comm.backward_send_values(&received_data, &mut send_data);
if rank == 0 {
assert_eq!(send_data[0], 10);
assert_eq!(send_data[1], 11);
assert_eq!(send_data[2], 12);
} else if rank == 1 {
assert_eq!(send_data[0], 13);
assert_eq!(send_data[1], 14);
assert_eq!(send_data[2], 13);
} else {
assert_eq!(send_data[0], 15);
}
}