#include <stdio.h>
#include "mpi.h"

void Display (int ndims, MPI_Comm comm) {
    int topo, rank_a, rank_b, n, dims[2], coords[2],
        periodicities[2];

    MPI_Comm_rank(MPI_COMM_WORLD,&rank_a);
    if (comm == MPI_COMM_NULL)
        fprintf(stderr,"Rank %2d is not involved\n",rank_a);
    else {
        MPI_Topo_test(comm,&topo);
        if (topo != MPI_CART) {
            fprintf(stderr,"The topology is not Cartesian\n");
            MPI_Abort(MPI_COMM_WORLD,1);
        }
        MPI_Cartdim_get(comm,&n);
        if (n != ndims) {
            fprintf(stderr,"The topology is not 2-D\n");
            MPI_Abort(MPI_COMM_WORLD,1);
        }
        MPI_Comm_rank(comm,&rank_b);
        MPI_Cart_get(comm,ndims,dims,periodicities,coords);
        printf("Rank %2d is rank %2d in dims %d,%d and periodic "
                "%d,%d, with coords %d,%d\n",
            rank_a,rank_b,dims[0],dims[1],periodicities[0],
            periodicities[1],coords[0],coords[1]);
    }
}

int main (int argc, char *argv[]) {
    MPI_Comm comm;
    static int dims[] = { 3, 5 }, periodic[] = { 0, 0 };

    MPI_Init(&argc,&argv);
    MPI_Cart_create(MPI_COMM_WORLD,2,dims,periodic,1,&comm);
    Display(2,comm);
    MPI_Finalize();
    return 0;
}
