MPIX_Cart_comm_create() и размерности трехмерных решеток

Следующий пример, будучи запущенным, для заданного числа процессоров выведет информацию о размерностях трехмерной решетки раздела.

#include <stdio.h>
#include <stdlib.h>
#include <mpi.h>
#include <mpix.h>

#define MAXDIMS 4

static void Print_Array(const char *name, int n, const int a[])
{
    int i;

    printf("%s: (", name);
    for (i = 0; i < n-1; ++i)
        printf("%d, ", a[i]);
    printf("%d)\n", a[n-1]);
}

int main(int argc, char **argv)
{
    MPI_Comm comm;
    int rank, size;
    const int root = 0;
    int res;

    MPI_Init(&argc, &argv);

    /* Create BG/P Cartesian communucator */
    res = MPIX_Cart_comm_create(&comm);
    if (res != MPI_SUCCESS)
    {
        fprintf(stderr, "MPIX_Cart_comm_create() failed "
                "(return code: %d)\n", res);
        MPI_Abort(MPI_COMM_WORLD, EXIT_FAILURE);
    }

    MPI_Comm_rank(comm, &rank);

    if (rank == root)
    {
        MPI_Comm_size(comm, &size);
        printf("size: %d\n", size);
    }

    /* Print values of some environment variables */
    if (rank == root)
    {
        const char *val, *name;

        name = "OMP_NUM_THREADS";
        printf("%s: %s\n", name, (val = getenv(name)) ? val: "");

        name = "BG_MAPPING";
        printf("%s: %s\n", name, (val = getenv(name)) ? val: "");
    }

    /* Print some info on Cartesian topology */
    if (rank == root)
    {
        int ndims;
        int dims[MAXDIMS], periods[MAXDIMS], coords[MAXDIMS];

        MPI_Cartdim_get(comm, &ndims);
        printf("Number of dimensions: %d\n", ndims);

        MPI_Cart_get(comm, MAXDIMS, dims, periods, coords);
        Print_Array("Dimensions", ndims, dims);
        Print_Array("Periods", ndims, periods);
        Print_Array("Coordinates", ndims, coords);
    }

    /* Mark Cartesian communicator for deallocation */
    MPI_Comm_free(&comm);

    MPI_Finalize();
    return 0;
}