File: BI_TransUserComm.c

package info (click to toggle)
blacs-mpi 1.1-28.2
  • links: PTS
  • area: main
  • in suites: squeeze
  • size: 2,320 kB
  • ctags: 2,031
  • sloc: fortran: 14,968; ansic: 12,353; makefile: 531; sh: 1
file content (79 lines) | stat: -rw-r--r-- 2,116 bytes parent folder | download | duplicates (9)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
#include "Bdef.h"

#ifdef UseF77Mpi
int BI_TransUserComm(MPI_Comm Ucomm, int Np, int *pmap)
#else
MPI_Comm BI_TransUserComm(int Ucomm, int Np, int *pmap)
#endif
/*
 * Here I am using system-dependent internals to tranlate a fortran
 * communicator to a C communicator, or vice versa.  Since these routines are
 * not part of the standard, this routine is fragile, and may change with
 * releases.  If no translation is possible, we can convert all ranks to
 * MPI_COMM_WORLD, and thus make the translation.  However,
 * this approach makes it so all processes in MPI_COMM_WORLD must call
 * BLACS_GRIDMAP for it to complete, when the translation takes place.  I.e.,
 * if BLACS_GRIDMAP is called from C, but the F77 internals are used.
 */
{
   BI_MPI_Comm bcomm, ucomm;
   BI_MPI_Group bgrp, ugrp;
   int i;
#ifdef UseF77Mpi
   void BI_MPI_C_to_f77_trans_comm(MPI_Comm, int *);
#else
   void BI_MPI_F77_to_c_trans_comm(int F77comm, MPI_Comm *Ccomm);
#endif

#if (BI_TransComm == BONEHEAD)

   int k;
#ifdef UseF77Mpi
   MPI_Group Ugrp, Wgrp;

/*
 * Translate ranks based on user's comm to MPI_COMM_WORLD
 */
   MPI_Comm_group(Ucomm, &Ugrp);
   MPI_Comm_group(MPI_COMM_WORLD, &Wgrp);
   for (i=0; i < Np; i++)
   {
      k = pmap[i];
      MPI_Group_translate_ranks(Ugrp, 1, &k, Wgrp, &pmap[i]);
   }
   ucomm = *BI_F77_MPI_COMM_WORLD;
   MPI_Group_free(&Ugrp);
   MPI_Group_free(&Wgrp);
#else
   int Ugrp, Wgrp, ierr, one=1;

   mpi_comm_group_(&Ucomm, &Ugrp, &ierr);
   mpi_comm_group_(BI_F77_MPI_COMM_WORLD, &Wgrp, &ierr);
   for (i=0; i < Np; i++)
   {
      k = pmap[i];
      mpi_group_translate_ranks_(&Ugrp, &one, &k, &Wgrp, &pmap[i], &ierr);
   }
   ucomm = MPI_COMM_WORLD;
   mpi_group_free_(&Ugrp, &ierr);
   mpi_group_free_(&Wgrp, &ierr);
#endif

#else

#ifdef UseF77Mpi
   BI_MPI_C_to_f77_trans_comm(Ucomm, &ucomm);
#else
   BI_MPI_F77_to_c_trans_comm(Ucomm, &ucomm);
#endif

#endif

   BI_MPI_Comm_group(ucomm, &ugrp, i);
   BI_MPI_Group_incl(ugrp, Np, pmap, &bgrp, i);
   BI_MPI_Comm_create(ucomm, bgrp, &bcomm, i);
   BI_MPI_Group_free(&ugrp, i);
   BI_MPI_Group_free(&bgrp, i);

   return(bcomm);
}