1 /*
2 * Copyright (c) 2004-2005 The Trustees of Indiana University and Indiana
3 * University Research and Technology
4 * Corporation. All rights reserved.
5 * Copyright (c) 2004-2013 The University of Tennessee and The University
6 * of Tennessee Research Foundation. All rights
7 * reserved.
8 * Copyright (c) 2004-2005 High Performance Computing Center Stuttgart,
9 * University of Stuttgart. All rights reserved.
10 * Copyright (c) 2004-2005 The Regents of the University of California.
11 * All rights reserved.
12 * Copyright (c) 2008 Cisco Systems, Inc. All rights reserved.
13 * Copyright (c) 2012-2013 Inria. All rights reserved.
14 * $COPYRIGHT$
15 *
16 * Additional copyrights may follow
17 *
18 * $HEADER$
19 */
20
21 #include "ompi_config.h"
22 #include "ompi/mca/topo/base/base.h"
23 #include "ompi/communicator/communicator.h"
24
25 /*
26 * function - determines process coords in cartesian topology given
27 * rank in group
28 *
29 * @param comm - communicator with cartesian structure (handle)
30 * @param rank - rank of a process within group of 'comm' (integer)
31 * @param maxdims - length of vector 'coords' in the calling program (integer)
32 * @param coords - integer array (of size 'ndims') containing the cartesian
33 * coordinates of specified process (integer)
34 *
35 * @retval MPI_SUCCESS
36 */
37
mca_topo_base_cart_coords(ompi_communicator_t * comm,int rank,int maxdims,int * coords)38 int mca_topo_base_cart_coords(ompi_communicator_t* comm,
39 int rank,
40 int maxdims,
41 int *coords)
42 {
43 int dim, remprocs, i, *d;
44
45 /*
46 * loop computing the co-ordinates
47 */
48 d = comm->c_topo->mtc.cart->dims;
49 remprocs = ompi_comm_size(comm);
50
51 for (i = 0;
52 (i < comm->c_topo->mtc.cart->ndims) && (i < maxdims);
53 ++i, ++d) {
54 dim = *d;
55 remprocs /= dim;
56 *coords++ = rank / remprocs;
57 rank %= remprocs;
58 }
59
60 return MPI_SUCCESS;
61 }
62