Setting Up The Grid
void Setup_grid(GRID_INFO_T* grid /* out */) {
/* Set up Global Grid Information */
MPI_Comm_size(MPI_COMM_WORLD, &(grid->p));
MPI_Comm_rank(MPI_COMM_WORLD, &old_rank);
/* We assume p is a perfect square */
grid->q = (int) sqrt((double) grid->p);
dimensions[0] = dimensions[1] = grid->q;
/* We want a circular shift in second dimension. */
/* Don't care about first */
wrap_around[0] = wrap_around[1] = 1;
MPI_Cart_create(MPI_COMM_WORLD, 2, dimensions,
wrap_around, 1, &(grid->comm));
MPI_Comm_rank(grid->comm, &(grid->my_rank));
MPI_Cart_coords(grid->comm, grid->my_rank, 2,
grid->my_row = coordinates[0];
grid->my_col = coordinates[1];
/* Set up row communicators */
MPI_Cart_sub(grid->comm, free_coords,
/* Set up column communicators */
MPI_Cart_sub(grid->comm, free_coords,