xref: /petsc/src/sys/mpiuni/mpi.c (revision 663e1fa8ddb49a7ef5b48ce657f58a022852edcd)
1e5c89e4eSSatish Balay /*
2e5c89e4eSSatish Balay       This provides a few of the MPI-uni functions that cannot be implemented
3e5c89e4eSSatish Balay     with C macros
4e5c89e4eSSatish Balay */
5891da655SBarry Smith #include <petscsys.h>
66524c165SJacob Faibussowitsch #ifndef MPIUNI_H
74423d37eSSatish Balay   #error "Wrong mpi.h included! require mpi.h from MPIUNI"
84423d37eSSatish Balay #endif
9e5c89e4eSSatish Balay 
100e6b6b59SJacob Faibussowitsch #include <petscdevice_cupm.h>
110e6b6b59SJacob Faibussowitsch #include <petsc/private/petscimpl.h>
126e42a002SJunchao Zhang 
13e5c89e4eSSatish Balay #define MPI_SUCCESS 0
14e5c89e4eSSatish Balay #define MPI_FAILURE 1
15a297a907SKarl Rupp 
1699256852SLisandro Dalcin void *MPIUNI_TMP = NULL;
1799256852SLisandro Dalcin 
18e5c89e4eSSatish Balay /*
19100f28aeSBarry Smith        With MPI Uni there are exactly four distinct communicators:
20100f28aeSBarry Smith     MPI_COMM_SELF, MPI_COMM_WORLD, and a MPI_Comm_dup() of each of these (duplicates of duplicates return the same communictor)
21100f28aeSBarry Smith 
22100f28aeSBarry Smith     MPI_COMM_SELF and MPI_COMM_WORLD are MPI_Comm_free() in MPI_Finalize() but in general with PETSc,
23100f28aeSBarry Smith      the other communicators are freed once the last PETSc object is freed (before MPI_Finalize()).
24100f28aeSBarry Smith 
25e5c89e4eSSatish Balay */
261ca36541SSatish Balay #define MAX_ATTR 256
27fb53af6bSBarry Smith #define MAX_COMM 128
28fb53af6bSBarry Smith 
29e5c89e4eSSatish Balay typedef struct {
30e5c89e4eSSatish Balay   void *attribute_val;
31e5c89e4eSSatish Balay   int   active;
32e5c89e4eSSatish Balay } MPI_Attr;
33e5c89e4eSSatish Balay 
3446651e72SBarry Smith typedef struct {
3546651e72SBarry Smith   void                *extra_state;
3646651e72SBarry Smith   MPI_Delete_function *del;
37f0463fa0SJunchao Zhang   int                  active; /* Is this keyval in use by some comm? */
3846651e72SBarry Smith } MPI_Attr_keyval;
3946651e72SBarry Smith 
4046651e72SBarry Smith static MPI_Attr_keyval attr_keyval[MAX_ATTR];
41fb53af6bSBarry Smith static MPI_Attr        attr[MAX_COMM][MAX_ATTR];
42f0463fa0SJunchao Zhang static int             comm_active[MAX_COMM]; /* Boolean array indicating which comms are in use */
43f0463fa0SJunchao Zhang static int             mpi_tag_ub           = 100000000;
44f0463fa0SJunchao Zhang static int             num_attr             = 1; /* Maximal number of keyvals/attributes ever created, including the predefined MPI_TAG_UB attribute. */
45f0463fa0SJunchao Zhang static int             MaxComm              = 2; /* Maximal number of communicators ever created, including comm_self(1), comm_world(2), but not comm_null(0) */
4652ecd5ffSSatish Balay static void           *MPIUNIF_mpi_in_place = 0;
47e5c89e4eSSatish Balay 
48f0463fa0SJunchao Zhang #define CommIdx(comm) ((comm) - 1) /* the communicator's internal index used in attr[idx][] and comm_active[idx]. comm_null does not occupy slots in attr[][] */
49f0463fa0SJunchao Zhang 
50e5c89e4eSSatish Balay #if defined(__cplusplus)
51e5c89e4eSSatish Balay extern "C" {
52e5c89e4eSSatish Balay #endif
53e5c89e4eSSatish Balay 
54e5c89e4eSSatish Balay /*
55e5c89e4eSSatish Balay    To avoid problems with prototypes to the system memcpy() it is duplicated here
56e5c89e4eSSatish Balay */
573649609aSBarry Smith int MPIUNI_Memcpy(void *dst, const void *src, MPI_Count n)
58d71ae5a4SJacob Faibussowitsch {
596e42a002SJunchao Zhang   if (dst == MPI_IN_PLACE || dst == MPIUNIF_mpi_in_place) return MPI_SUCCESS;
606e42a002SJunchao Zhang   if (src == MPI_IN_PLACE || src == MPIUNIF_mpi_in_place) return MPI_SUCCESS;
616e42a002SJunchao Zhang   if (!n) return MPI_SUCCESS;
62e5c89e4eSSatish Balay 
6305035670SJunchao Zhang   /* GPU-aware MPIUNI. Use synchronous copy per MPI semantics */
6405035670SJunchao Zhang #if defined(PETSC_HAVE_CUDA)
659371c9d4SSatish Balay   if (PetscDeviceInitialized(PETSC_DEVICE_CUDA)) {
669371c9d4SSatish Balay     cudaError_t cerr = cudaMemcpy(dst, src, n, cudaMemcpyDefault);
679371c9d4SSatish Balay     if (cerr != cudaSuccess) return MPI_FAILURE;
689371c9d4SSatish Balay   } else
6905035670SJunchao Zhang #elif defined(PETSC_HAVE_HIP)
709371c9d4SSatish Balay   if (PetscDeviceInitialized(PETSC_DEVICE_HIP)) {
719371c9d4SSatish Balay     hipError_t cerr = hipMemcpy(dst, src, n, hipMemcpyDefault);
729371c9d4SSatish Balay     if (cerr != hipSuccess) return MPI_FAILURE;
739371c9d4SSatish Balay   } else
74a6191124SJunchao Zhang #endif
759371c9d4SSatish Balay   {
76dd460d27SBarry Smith     (void)memcpy(dst, src, n);
779371c9d4SSatish Balay   }
7899256852SLisandro Dalcin   return MPI_SUCCESS;
79e5c89e4eSSatish Balay }
80e5c89e4eSSatish Balay 
8112801b39SBarry Smith static int classcnt = 0;
8212801b39SBarry Smith static int codecnt  = 0;
8312801b39SBarry Smith 
84d71ae5a4SJacob Faibussowitsch int MPI_Add_error_class(int *cl)
85d71ae5a4SJacob Faibussowitsch {
8612801b39SBarry Smith   *cl = classcnt++;
8712801b39SBarry Smith   return MPI_SUCCESS;
8812801b39SBarry Smith }
8912801b39SBarry Smith 
90d71ae5a4SJacob Faibussowitsch int MPI_Add_error_code(int cl, int *co)
91d71ae5a4SJacob Faibussowitsch {
9212801b39SBarry Smith   if (cl >= classcnt) return MPI_FAILURE;
9312801b39SBarry Smith   *co = codecnt++;
9412801b39SBarry Smith   return MPI_SUCCESS;
9512801b39SBarry Smith }
9612801b39SBarry Smith 
97d71ae5a4SJacob Faibussowitsch int MPI_Type_get_envelope(MPI_Datatype datatype, int *num_integers, int *num_addresses, int *num_datatypes, int *combiner)
98d71ae5a4SJacob Faibussowitsch {
991a589b05SJed Brown   int comb = datatype >> 28;
1001a589b05SJed Brown   switch (comb) {
1011a589b05SJed Brown   case MPI_COMBINER_NAMED:
1021a589b05SJed Brown     *num_integers  = 0;
1031a589b05SJed Brown     *num_addresses = 0;
1041a589b05SJed Brown     *num_datatypes = 0;
1051a589b05SJed Brown     *combiner      = comb;
1061a589b05SJed Brown     break;
1071a589b05SJed Brown   case MPI_COMBINER_DUP:
1081a589b05SJed Brown     *num_integers  = 0;
1091a589b05SJed Brown     *num_addresses = 0;
1101a589b05SJed Brown     *num_datatypes = 1;
1111a589b05SJed Brown     *combiner      = comb;
1121a589b05SJed Brown     break;
1131a589b05SJed Brown   case MPI_COMBINER_CONTIGUOUS:
1141a589b05SJed Brown     *num_integers  = 1;
1151a589b05SJed Brown     *num_addresses = 0;
1161a589b05SJed Brown     *num_datatypes = 1;
1171a589b05SJed Brown     *combiner      = comb;
1181a589b05SJed Brown     break;
119d71ae5a4SJacob Faibussowitsch   default:
120d71ae5a4SJacob Faibussowitsch     return MPIUni_Abort(MPI_COMM_SELF, 1);
1211a589b05SJed Brown   }
12299256852SLisandro Dalcin   return MPI_SUCCESS;
1231a589b05SJed Brown }
1241a589b05SJed Brown 
125d71ae5a4SJacob Faibussowitsch int MPI_Type_get_contents(MPI_Datatype datatype, int max_integers, int max_addresses, int max_datatypes, int *array_of_integers, MPI_Aint *array_of_addresses, MPI_Datatype *array_of_datatypes)
126d71ae5a4SJacob Faibussowitsch {
1271a589b05SJed Brown   int comb = datatype >> 28;
1281a589b05SJed Brown   switch (comb) {
129d71ae5a4SJacob Faibussowitsch   case MPI_COMBINER_NAMED:
130d71ae5a4SJacob Faibussowitsch     return MPIUni_Abort(MPI_COMM_SELF, 1);
1311a589b05SJed Brown   case MPI_COMBINER_DUP:
1321a589b05SJed Brown     if (max_datatypes < 1) return MPIUni_Abort(MPI_COMM_SELF, 1);
1331a589b05SJed Brown     array_of_datatypes[0] = datatype & 0x0fffffff;
1341a589b05SJed Brown     break;
1351a589b05SJed Brown   case MPI_COMBINER_CONTIGUOUS:
1361a589b05SJed Brown     if (max_integers < 1 || max_datatypes < 1) return MPIUni_Abort(MPI_COMM_SELF, 1);
1371a589b05SJed Brown     array_of_integers[0]  = (datatype >> 8) & 0xfff;         /* count */
1381a589b05SJed Brown     array_of_datatypes[0] = (datatype & 0x0ff000ff) | 0x100; /* basic named type (count=1) from which the contiguous type is derived */
1391a589b05SJed Brown     break;
140d71ae5a4SJacob Faibussowitsch   default:
141d71ae5a4SJacob Faibussowitsch     return MPIUni_Abort(MPI_COMM_SELF, 1);
1421a589b05SJed Brown   }
14399256852SLisandro Dalcin   return MPI_SUCCESS;
1441a589b05SJed Brown }
1451a589b05SJed Brown 
146e5c89e4eSSatish Balay /*
147e5c89e4eSSatish Balay    Used to set the built-in MPI_TAG_UB attribute
148e5c89e4eSSatish Balay */
149d71ae5a4SJacob Faibussowitsch static int Keyval_setup(void)
150d71ae5a4SJacob Faibussowitsch {
151f0463fa0SJunchao Zhang   attr[CommIdx(MPI_COMM_WORLD)][0].active        = 1;
152f0463fa0SJunchao Zhang   attr[CommIdx(MPI_COMM_WORLD)][0].attribute_val = &mpi_tag_ub;
153f0463fa0SJunchao Zhang   attr[CommIdx(MPI_COMM_SELF)][0].active         = 1;
154f0463fa0SJunchao Zhang   attr[CommIdx(MPI_COMM_SELF)][0].attribute_val  = &mpi_tag_ub;
155f0463fa0SJunchao Zhang   attr_keyval[0].active                          = 1;
15699256852SLisandro Dalcin   return MPI_SUCCESS;
157e5c89e4eSSatish Balay }
158e5c89e4eSSatish Balay 
159dd460d27SBarry Smith int MPI_Comm_create_keyval(PETSC_UNUSED MPI_Copy_function *copy_fn, PETSC_UNUSED MPI_Delete_function *delete_fn, int *keyval, void *extra_state)
160d71ae5a4SJacob Faibussowitsch {
161f0463fa0SJunchao Zhang   int i, keyid;
162dd460d27SBarry Smith 
163dd460d27SBarry Smith   (void)copy_fn;
164dd460d27SBarry Smith   (void)delete_fn;
165f0463fa0SJunchao Zhang   for (i = 1; i < num_attr; i++) { /* the first attribute is always in use */
166f0463fa0SJunchao Zhang     if (!attr_keyval[i].active) {
167f0463fa0SJunchao Zhang       keyid = i;
168f0463fa0SJunchao Zhang       goto found;
169f0463fa0SJunchao Zhang     }
170f0463fa0SJunchao Zhang   }
1719cf9c1dbSJed Brown   if (num_attr >= MAX_ATTR) return MPIUni_Abort(MPI_COMM_WORLD, 1);
172f0463fa0SJunchao Zhang   keyid = num_attr++;
173e5c89e4eSSatish Balay 
174f0463fa0SJunchao Zhang found:
175f0463fa0SJunchao Zhang   attr_keyval[keyid].extra_state = extra_state;
176f0463fa0SJunchao Zhang   attr_keyval[keyid].del         = delete_fn;
177f0463fa0SJunchao Zhang   attr_keyval[keyid].active      = 1;
178f0463fa0SJunchao Zhang   *keyval                        = keyid;
17999256852SLisandro Dalcin   return MPI_SUCCESS;
180e5c89e4eSSatish Balay }
181e5c89e4eSSatish Balay 
18236f0be53SJacob Faibussowitsch /*
18336f0be53SJacob Faibussowitsch   The reference counting business is here to guard against the following:
18436f0be53SJacob Faibussowitsch 
18536f0be53SJacob Faibussowitsch   MPI_Comm_set_attr(comm, keyval, some_attr);
18636f0be53SJacob Faibussowitsch   MPI_Comm_free_keyval(&keyval);
18736f0be53SJacob Faibussowitsch   MPI_Comm_free(&comm);
18836f0be53SJacob Faibussowitsch 
18936f0be53SJacob Faibussowitsch   Here MPI_Comm_free() will try to destroy all of the attributes of the comm, and hence we
19036f0be53SJacob Faibussowitsch   should not clear the deleter or extra_state until all communicators that have the attribute
19136f0be53SJacob Faibussowitsch   set are either freed or have given up their attribute.
19236f0be53SJacob Faibussowitsch 
19336f0be53SJacob Faibussowitsch   The attribute reference count is INCREASED in:
19436f0be53SJacob Faibussowitsch   - MPI_Comm_create_keyval()
19536f0be53SJacob Faibussowitsch   - MPI_Comm_set_attr()
19636f0be53SJacob Faibussowitsch 
19736f0be53SJacob Faibussowitsch   The atrtibute reference count is DECREASED in:
19836f0be53SJacob Faibussowitsch   - MPI_Comm_free_keyval()
19936f0be53SJacob Faibussowitsch   - MPI_Comm_delete_attr() (but only if the comm has the attribute)
20036f0be53SJacob Faibussowitsch */
201d71ae5a4SJacob Faibussowitsch static int MPI_Attr_dereference_keyval(int keyval)
202d71ae5a4SJacob Faibussowitsch {
203*663e1fa8SPierre Jolivet   if (--attr_keyval[keyval].active <= 0) {
20436f0be53SJacob Faibussowitsch     attr_keyval[keyval].extra_state = 0;
20536f0be53SJacob Faibussowitsch     attr_keyval[keyval].del         = 0;
20636f0be53SJacob Faibussowitsch   }
20736f0be53SJacob Faibussowitsch   return MPI_SUCCESS;
20836f0be53SJacob Faibussowitsch }
20936f0be53SJacob Faibussowitsch 
210d71ae5a4SJacob Faibussowitsch static int MPI_Attr_reference_keyval(int keyval)
211d71ae5a4SJacob Faibussowitsch {
212*663e1fa8SPierre Jolivet   ++attr_keyval[keyval].active;
21336f0be53SJacob Faibussowitsch   return MPI_SUCCESS;
21436f0be53SJacob Faibussowitsch }
21536f0be53SJacob Faibussowitsch 
216d71ae5a4SJacob Faibussowitsch int MPI_Comm_free_keyval(int *keyval)
217d71ae5a4SJacob Faibussowitsch {
21836f0be53SJacob Faibussowitsch   int ret;
21936f0be53SJacob Faibussowitsch 
22036f0be53SJacob Faibussowitsch   if (*keyval < 0 || *keyval >= num_attr) return MPI_FAILURE;
22136f0be53SJacob Faibussowitsch   if ((ret = MPI_Attr_dereference_keyval(*keyval))) return ret;
222a246e310SBarry Smith   *keyval = 0;
223e5c89e4eSSatish Balay   return MPI_SUCCESS;
224e5c89e4eSSatish Balay }
225e5c89e4eSSatish Balay 
226d71ae5a4SJacob Faibussowitsch int MPI_Comm_set_attr(MPI_Comm comm, int keyval, void *attribute_val)
227d71ae5a4SJacob Faibussowitsch {
22836f0be53SJacob Faibussowitsch   int idx = CommIdx(comm), ret;
229f0463fa0SJunchao Zhang   if (comm < 1 || comm > MaxComm) return MPI_FAILURE;
23036f0be53SJacob Faibussowitsch   if (keyval < 0 || keyval >= num_attr) return MPI_FAILURE;
23136f0be53SJacob Faibussowitsch 
23236f0be53SJacob Faibussowitsch   if ((ret = MPI_Comm_delete_attr(comm, keyval))) return ret;
23336f0be53SJacob Faibussowitsch   if ((ret = MPI_Attr_reference_keyval(keyval))) return ret;
234f0463fa0SJunchao Zhang   attr[idx][keyval].active        = 1;
235f0463fa0SJunchao Zhang   attr[idx][keyval].attribute_val = attribute_val;
236e5c89e4eSSatish Balay   return MPI_SUCCESS;
237e5c89e4eSSatish Balay }
238e5c89e4eSSatish Balay 
239d71ae5a4SJacob Faibussowitsch int MPI_Comm_delete_attr(MPI_Comm comm, int keyval)
240d71ae5a4SJacob Faibussowitsch {
241f0463fa0SJunchao Zhang   int idx = CommIdx(comm);
242f0463fa0SJunchao Zhang   if (comm < 1 || comm > MaxComm) return MPI_FAILURE;
24336f0be53SJacob Faibussowitsch   if (keyval < 0 || keyval >= num_attr) return MPI_FAILURE;
24436f0be53SJacob Faibussowitsch   if (attr[idx][keyval].active) {
24536f0be53SJacob Faibussowitsch     int   ret;
246f0463fa0SJunchao Zhang     void *save_attribute_val = attr[idx][keyval].attribute_val;
24736f0be53SJacob Faibussowitsch 
248f0463fa0SJunchao Zhang     attr[idx][keyval].active        = 0;
249f0463fa0SJunchao Zhang     attr[idx][keyval].attribute_val = 0;
25036f0be53SJacob Faibussowitsch     if (attr_keyval[keyval].del) {
251f4f49eeaSPierre Jolivet       if ((ret = (*attr_keyval[keyval].del)(comm, keyval, save_attribute_val, attr_keyval[keyval].extra_state))) return ret;
25236f0be53SJacob Faibussowitsch     }
25336f0be53SJacob Faibussowitsch     if ((ret = MPI_Attr_dereference_keyval(keyval))) return ret;
25440776e1bSpetsc   }
255e5c89e4eSSatish Balay   return MPI_SUCCESS;
256e5c89e4eSSatish Balay }
257e5c89e4eSSatish Balay 
258d71ae5a4SJacob Faibussowitsch int MPI_Comm_get_attr(MPI_Comm comm, int keyval, void *attribute_val, int *flag)
259d71ae5a4SJacob Faibussowitsch {
260f0463fa0SJunchao Zhang   int idx = CommIdx(comm);
261f0463fa0SJunchao Zhang   if (comm < 1 || comm > MaxComm) return MPI_FAILURE;
262e5c89e4eSSatish Balay   if (!keyval) Keyval_setup();
263f0463fa0SJunchao Zhang   *flag                   = attr[idx][keyval].active;
264f0463fa0SJunchao Zhang   *(void **)attribute_val = attr[idx][keyval].attribute_val;
265e5c89e4eSSatish Balay   return MPI_SUCCESS;
266e5c89e4eSSatish Balay }
267e5c89e4eSSatish Balay 
2689371c9d4SSatish Balay static char all_comm_names[MAX_COMM][MPI_MAX_OBJECT_NAME] = {"MPI_COMM_SELF", "MPI_COMM_WORLD"};
2693e1d142dSJacob Faibussowitsch 
270d71ae5a4SJacob Faibussowitsch int MPI_Comm_get_name(MPI_Comm comm, char *comm_name, int *resultlen)
271d71ae5a4SJacob Faibussowitsch {
2723e1d142dSJacob Faibussowitsch   if (comm < 1 || comm > MaxComm) return MPI_FAILURE;
2733e1d142dSJacob Faibussowitsch   if (!comm_name || !resultlen) return MPI_FAILURE;
274dd460d27SBarry Smith   (void)strncpy(comm_name, all_comm_names[CommIdx(comm)], MPI_MAX_OBJECT_NAME - 1);
2753e1d142dSJacob Faibussowitsch   *resultlen = (int)strlen(comm_name);
2763e1d142dSJacob Faibussowitsch   return MPI_SUCCESS;
2773e1d142dSJacob Faibussowitsch }
2783e1d142dSJacob Faibussowitsch 
279d71ae5a4SJacob Faibussowitsch int MPI_Comm_set_name(MPI_Comm comm, const char *comm_name)
280d71ae5a4SJacob Faibussowitsch {
2813e1d142dSJacob Faibussowitsch   if (comm < 1 || comm > MaxComm) return MPI_FAILURE;
2823e1d142dSJacob Faibussowitsch   if (!comm_name) return MPI_FAILURE;
2833e1d142dSJacob Faibussowitsch   if (strlen(comm_name) > MPI_MAX_OBJECT_NAME - 1) return MPI_FAILURE;
284dd460d27SBarry Smith   (void)strncpy(all_comm_names[CommIdx(comm)], comm_name, MPI_MAX_OBJECT_NAME - 1);
2853e1d142dSJacob Faibussowitsch   return MPI_SUCCESS;
2863e1d142dSJacob Faibussowitsch }
2873e1d142dSJacob Faibussowitsch 
288d71ae5a4SJacob Faibussowitsch int MPI_Comm_create(MPI_Comm comm, MPI_Group group, MPI_Comm *newcomm)
289d71ae5a4SJacob Faibussowitsch {
290f60917d2SBarry Smith   int j;
291f0463fa0SJunchao Zhang   if (comm < 1 || comm > MaxComm) return MPI_FAILURE;
292f0463fa0SJunchao Zhang   for (j = 3; j <= MaxComm; j++) {
293f0463fa0SJunchao Zhang     if (!comm_active[CommIdx(j)]) {
294f0463fa0SJunchao Zhang       comm_active[CommIdx(j)] = 1;
295f60917d2SBarry Smith       *newcomm                = j;
296f60917d2SBarry Smith       return MPI_SUCCESS;
297f60917d2SBarry Smith     }
298f60917d2SBarry Smith   }
299f0463fa0SJunchao Zhang   if (MaxComm >= MAX_COMM) return MPI_FAILURE;
300f0463fa0SJunchao Zhang   *newcomm                       = ++MaxComm;
301f0463fa0SJunchao Zhang   comm_active[CommIdx(*newcomm)] = 1;
302c8217ed5SSatish Balay   return MPI_SUCCESS;
303c8217ed5SSatish Balay }
304c8217ed5SSatish Balay 
305d71ae5a4SJacob Faibussowitsch int MPI_Comm_dup(MPI_Comm comm, MPI_Comm *out)
306d71ae5a4SJacob Faibussowitsch {
307f60917d2SBarry Smith   int j;
308f0463fa0SJunchao Zhang   if (comm < 1 || comm > MaxComm) return MPI_FAILURE;
309f0463fa0SJunchao Zhang   for (j = 3; j <= MaxComm; j++) {
310f0463fa0SJunchao Zhang     if (!comm_active[CommIdx(j)]) {
311f0463fa0SJunchao Zhang       comm_active[CommIdx(j)] = 1;
312f60917d2SBarry Smith       *out                    = j;
313f60917d2SBarry Smith       return MPI_SUCCESS;
314f60917d2SBarry Smith     }
315f60917d2SBarry Smith   }
316f0463fa0SJunchao Zhang   if (MaxComm >= MAX_COMM) return MPI_FAILURE;
317f0463fa0SJunchao Zhang   *out                       = ++MaxComm;
318f0463fa0SJunchao Zhang   comm_active[CommIdx(*out)] = 1;
31999256852SLisandro Dalcin   return MPI_SUCCESS;
320e5c89e4eSSatish Balay }
321e5c89e4eSSatish Balay 
322d71ae5a4SJacob Faibussowitsch int MPI_Comm_free(MPI_Comm *comm)
323d71ae5a4SJacob Faibussowitsch {
324f0463fa0SJunchao Zhang   int idx = CommIdx(*comm);
325e5c89e4eSSatish Balay 
326f0463fa0SJunchao Zhang   if (*comm < 1 || *comm > MaxComm) return MPI_FAILURE;
32736f0be53SJacob Faibussowitsch   for (int i = 0; i < num_attr; i++) {
32836f0be53SJacob Faibussowitsch     int ret = MPI_Comm_delete_attr(*comm, i);
32936f0be53SJacob Faibussowitsch 
33036f0be53SJacob Faibussowitsch     if (ret) return ret;
331e5c89e4eSSatish Balay   }
332f0463fa0SJunchao Zhang   if (*comm >= 3) comm_active[idx] = 0;
333100f28aeSBarry Smith   *comm = 0;
334e5c89e4eSSatish Balay   return MPI_SUCCESS;
335e5c89e4eSSatish Balay }
336e5c89e4eSSatish Balay 
337d71ae5a4SJacob Faibussowitsch int MPI_Comm_size(MPI_Comm comm, int *size)
338d71ae5a4SJacob Faibussowitsch {
339f0463fa0SJunchao Zhang   if (comm < 1 || comm > MaxComm) return MPI_FAILURE;
340d393f697SSatish Balay   *size = 1;
341d393f697SSatish Balay   return MPI_SUCCESS;
342d393f697SSatish Balay }
343d393f697SSatish Balay 
344d71ae5a4SJacob Faibussowitsch int MPI_Comm_rank(MPI_Comm comm, int *rank)
345d71ae5a4SJacob Faibussowitsch {
346f0463fa0SJunchao Zhang   if (comm < 1 || comm > MaxComm) return MPI_FAILURE;
347d393f697SSatish Balay   *rank = 0;
348d393f697SSatish Balay   return MPI_SUCCESS;
349d393f697SSatish Balay }
350d393f697SSatish Balay 
351d71ae5a4SJacob Faibussowitsch int MPIUni_Abort(MPI_Comm comm, int errorcode)
352d71ae5a4SJacob Faibussowitsch {
353dd460d27SBarry Smith   (void)printf("MPI operation not supported by PETSc's sequential MPI wrappers\n");
354b3f11779SBarry Smith   return MPI_ERR_NOSUPPORT;
35506df1fb1SBarry Smith }
35606df1fb1SBarry Smith 
357d71ae5a4SJacob Faibussowitsch int MPI_Abort(MPI_Comm comm, int errorcode)
358d71ae5a4SJacob Faibussowitsch {
359e5c89e4eSSatish Balay   abort();
360e5c89e4eSSatish Balay   return MPI_SUCCESS;
361e5c89e4eSSatish Balay }
362e5c89e4eSSatish Balay 
36358cd72c3SLisandro Dalcin /* --------------------------------------------------------------------------*/
36458cd72c3SLisandro Dalcin 
365e5c89e4eSSatish Balay static int MPI_was_initialized = 0;
36658cd72c3SLisandro Dalcin static int MPI_was_finalized   = 0;
36758cd72c3SLisandro Dalcin 
368d71ae5a4SJacob Faibussowitsch int MPI_Init(int *argc, char ***argv)
369d71ae5a4SJacob Faibussowitsch {
37099256852SLisandro Dalcin   if (MPI_was_initialized) return MPI_FAILURE;
3719bcf9d5aSJunchao Zhang   /* MPI standard says "once MPI_Finalize returns, no MPI routine (not even MPI_Init) may be called", so an MPI standard compliant
3729bcf9d5aSJunchao Zhang      MPIU should have this 'if (MPI_was_finalized) return MPI_FAILURE;' check. We relax it here to make life easier for users
3739bcf9d5aSJunchao Zhang      of MPIU so that they can do multiple PetscInitialize/Finalize().
3749bcf9d5aSJunchao Zhang   */
3759bcf9d5aSJunchao Zhang   /* if (MPI_was_finalized) return MPI_FAILURE; */
37658cd72c3SLisandro Dalcin   MPI_was_initialized = 1;
3779bcf9d5aSJunchao Zhang   MPI_was_finalized   = 0;
37899256852SLisandro Dalcin   return MPI_SUCCESS;
37958cd72c3SLisandro Dalcin }
38058cd72c3SLisandro Dalcin 
381d71ae5a4SJacob Faibussowitsch int MPI_Init_thread(int *argc, char ***argv, int required, int *provided)
382d71ae5a4SJacob Faibussowitsch {
3839012378cSStefano Zampini   MPI_Query_thread(provided);
3849012378cSStefano Zampini   return MPI_Init(argc, argv);
3859012378cSStefano Zampini }
3869012378cSStefano Zampini 
387d71ae5a4SJacob Faibussowitsch int MPI_Query_thread(int *provided)
388d71ae5a4SJacob Faibussowitsch {
3899012378cSStefano Zampini   *provided = MPI_THREAD_FUNNELED;
3909012378cSStefano Zampini   return MPI_SUCCESS;
3919012378cSStefano Zampini }
3929012378cSStefano Zampini 
393d71ae5a4SJacob Faibussowitsch int MPI_Finalize(void)
394d71ae5a4SJacob Faibussowitsch {
39536f0be53SJacob Faibussowitsch   if (MPI_was_finalized || !MPI_was_initialized) return MPI_FAILURE;
39636f0be53SJacob Faibussowitsch   MPI_Comm comm = MPI_COMM_WORLD;
39736f0be53SJacob Faibussowitsch   int      ret  = MPI_Comm_free(&comm);
39836f0be53SJacob Faibussowitsch 
39936f0be53SJacob Faibussowitsch   if (ret) return ret;
400100f28aeSBarry Smith   comm = MPI_COMM_SELF;
40136f0be53SJacob Faibussowitsch   ret  = MPI_Comm_free(&comm);
40236f0be53SJacob Faibussowitsch   if (ret) return ret;
40336f0be53SJacob Faibussowitsch   if (PetscDefined(USE_DEBUG)) {
40436f0be53SJacob Faibussowitsch     for (int i = 3; i <= MaxComm; ++i) {
405f0463fa0SJunchao Zhang       if (comm_active[CommIdx(i)]) printf("MPIUni warning: MPI communicator %d is not freed before MPI_Finalize()\n", i);
406f0463fa0SJunchao Zhang     }
40736f0be53SJacob Faibussowitsch 
40836f0be53SJacob Faibussowitsch     for (int i = 1; i <= MaxComm; ++i) {
40936f0be53SJacob Faibussowitsch       for (int j = 0; j < num_attr; ++j) {
41036f0be53SJacob Faibussowitsch         if (attr[CommIdx(i)][j].active) printf("MPIUni warning: MPI communicator %d attribute %d was not freed before MPI_Finalize()\n", i, j);
411f0463fa0SJunchao Zhang       }
41236f0be53SJacob Faibussowitsch     }
41336f0be53SJacob Faibussowitsch 
41436f0be53SJacob Faibussowitsch     for (int i = 1; i < num_attr; ++i) {
41536f0be53SJacob Faibussowitsch       if (attr_keyval[i].active) printf("MPIUni warning: MPI attribute %d was not freed before MPI_Finalize()\n", i);
41636f0be53SJacob Faibussowitsch     }
41736f0be53SJacob Faibussowitsch   }
41836f0be53SJacob Faibussowitsch 
419f0463fa0SJunchao Zhang   /* reset counters */
420f0463fa0SJunchao Zhang   MaxComm             = 2;
421f0463fa0SJunchao Zhang   num_attr            = 1;
42258cd72c3SLisandro Dalcin   MPI_was_finalized   = 1;
4239bcf9d5aSJunchao Zhang   MPI_was_initialized = 0;
4249bcf9d5aSJunchao Zhang   PETSC_COMM_WORLD    = MPI_COMM_NULL;
42599256852SLisandro Dalcin   return MPI_SUCCESS;
42658cd72c3SLisandro Dalcin }
427e5c89e4eSSatish Balay 
428d71ae5a4SJacob Faibussowitsch int MPI_Initialized(int *flag)
429d71ae5a4SJacob Faibussowitsch {
430e5c89e4eSSatish Balay   *flag = MPI_was_initialized;
43199256852SLisandro Dalcin   return MPI_SUCCESS;
432e5c89e4eSSatish Balay }
433e5c89e4eSSatish Balay 
434d71ae5a4SJacob Faibussowitsch int MPI_Finalized(int *flag)
435d71ae5a4SJacob Faibussowitsch {
43658cd72c3SLisandro Dalcin   *flag = MPI_was_finalized;
43799256852SLisandro Dalcin   return MPI_SUCCESS;
438e5c89e4eSSatish Balay }
439e5c89e4eSSatish Balay 
440317ae730SBarry Smith int MPI_Win_free(MPI_Win *win)
441317ae730SBarry Smith {
442317ae730SBarry Smith   free(*win);
443317ae730SBarry Smith   *win = NULL;
444317ae730SBarry Smith   return MPI_SUCCESS;
445317ae730SBarry Smith }
446317ae730SBarry Smith 
447317ae730SBarry Smith int MPI_Win_allocate_shared(size_t sz, size_t asz, MPI_Info info, MPI_Comm comm, void **addr, MPI_Win *win)
448317ae730SBarry Smith {
449317ae730SBarry Smith   *win = *addr = malloc(sz);
450317ae730SBarry Smith   return MPI_SUCCESS;
451317ae730SBarry Smith }
452317ae730SBarry Smith 
453e5c89e4eSSatish Balay /* -------------------     Fortran versions of several routines ------------------ */
454e5c89e4eSSatish Balay 
455f7c6e6aaSSatish Balay #if defined(PETSC_HAVE_FORTRAN_CAPS)
4560134af2dSBarry Smith   #define mpiunisetmoduleblock_         MPIUNISETMODULEBLOCK
45752ecd5ffSSatish Balay   #define mpiunisetfortranbasepointers_ MPIUNISETFORTRANBASEPOINTERS
458a7b85bbcSSatish Balay   #define petsc_mpi_init_               PETSC_MPI_INIT
459a7b85bbcSSatish Balay   #define petsc_mpi_finalize_           PETSC_MPI_FINALIZE
460a7b85bbcSSatish Balay   #define petsc_mpi_comm_size_          PETSC_MPI_COMM_SIZE
461a7b85bbcSSatish Balay   #define petsc_mpi_comm_rank_          PETSC_MPI_COMM_RANK
462a7b85bbcSSatish Balay   #define petsc_mpi_abort_              PETSC_MPI_ABORT
463a7b85bbcSSatish Balay   #define petsc_mpi_reduce_             PETSC_MPI_REDUCE
464a7b85bbcSSatish Balay   #define petsc_mpi_allreduce_          PETSC_MPI_ALLREDUCE
465a7b85bbcSSatish Balay   #define petsc_mpi_barrier_            PETSC_MPI_BARRIER
466a7b85bbcSSatish Balay   #define petsc_mpi_bcast_              PETSC_MPI_BCAST
467a7b85bbcSSatish Balay   #define petsc_mpi_gather_             PETSC_MPI_GATHER
468a7b85bbcSSatish Balay   #define petsc_mpi_allgather_          PETSC_MPI_ALLGATHER
469a7b85bbcSSatish Balay   #define petsc_mpi_comm_split_         PETSC_MPI_COMM_SPLIT
470a7b85bbcSSatish Balay   #define petsc_mpi_scan_               PETSC_MPI_SCAN
471a7b85bbcSSatish Balay   #define petsc_mpi_send_               PETSC_MPI_SEND
472a7b85bbcSSatish Balay   #define petsc_mpi_recv_               PETSC_MPI_RECV
473a7b85bbcSSatish Balay   #define petsc_mpi_reduce_scatter_     PETSC_MPI_REDUCE_SCATTER
474a7b85bbcSSatish Balay   #define petsc_mpi_irecv_              PETSC_MPI_IRECV
475a7b85bbcSSatish Balay   #define petsc_mpi_isend_              PETSC_MPI_ISEND
476a7b85bbcSSatish Balay   #define petsc_mpi_sendrecv_           PETSC_MPI_SENDRECV
477a7b85bbcSSatish Balay   #define petsc_mpi_test_               PETSC_MPI_TEST
478a7b85bbcSSatish Balay   #define petsc_mpi_waitall_            PETSC_MPI_WAITALL
479a7b85bbcSSatish Balay   #define petsc_mpi_waitany_            PETSC_MPI_WAITANY
480a7b85bbcSSatish Balay   #define petsc_mpi_allgatherv_         PETSC_MPI_ALLGATHERV
481a7b85bbcSSatish Balay   #define petsc_mpi_alltoallv_          PETSC_MPI_ALLTOALLV
482a7b85bbcSSatish Balay   #define petsc_mpi_comm_create_        PETSC_MPI_COMM_CREATE
483a7b85bbcSSatish Balay   #define petsc_mpi_address_            PETSC_MPI_ADDRESS
484a7b85bbcSSatish Balay   #define petsc_mpi_pack_               PETSC_MPI_PACK
485a7b85bbcSSatish Balay   #define petsc_mpi_unpack_             PETSC_MPI_UNPACK
486a7b85bbcSSatish Balay   #define petsc_mpi_pack_size_          PETSC_MPI_PACK_SIZE
487a7b85bbcSSatish Balay   #define petsc_mpi_type_struct_        PETSC_MPI_TYPE_STRUCT
488a7b85bbcSSatish Balay   #define petsc_mpi_type_commit_        PETSC_MPI_TYPE_COMMIT
489a7b85bbcSSatish Balay   #define petsc_mpi_wtime_              PETSC_MPI_WTIME
490a7b85bbcSSatish Balay   #define petsc_mpi_cancel_             PETSC_MPI_CANCEL
491a7b85bbcSSatish Balay   #define petsc_mpi_comm_dup_           PETSC_MPI_COMM_DUP
492a7b85bbcSSatish Balay   #define petsc_mpi_comm_free_          PETSC_MPI_COMM_FREE
493a7b85bbcSSatish Balay   #define petsc_mpi_get_count_          PETSC_MPI_GET_COUNT
494a7b85bbcSSatish Balay   #define petsc_mpi_get_processor_name_ PETSC_MPI_GET_PROCESSOR_NAME
495a7b85bbcSSatish Balay   #define petsc_mpi_initialized_        PETSC_MPI_INITIALIZED
496a7b85bbcSSatish Balay   #define petsc_mpi_iprobe_             PETSC_MPI_IPROBE
497a7b85bbcSSatish Balay   #define petsc_mpi_probe_              PETSC_MPI_PROBE
498a7b85bbcSSatish Balay   #define petsc_mpi_request_free_       PETSC_MPI_REQUEST_FREE
499a7b85bbcSSatish Balay   #define petsc_mpi_ssend_              PETSC_MPI_SSEND
500a7b85bbcSSatish Balay   #define petsc_mpi_wait_               PETSC_MPI_WAIT
501a7b85bbcSSatish Balay   #define petsc_mpi_comm_group_         PETSC_MPI_COMM_GROUP
502a7b85bbcSSatish Balay   #define petsc_mpi_exscan_             PETSC_MPI_EXSCAN
503f7c6e6aaSSatish Balay #elif !defined(PETSC_HAVE_FORTRAN_UNDERSCORE)
5040134af2dSBarry Smith   #define mpiunisetmoduleblock_         mpiunisetmoduleblock
50552ecd5ffSSatish Balay   #define mpiunisetfortranbasepointers_ mpiunisetfortranbasepointers
506a7b85bbcSSatish Balay   #define petsc_mpi_init_               petsc_mpi_init
507a7b85bbcSSatish Balay   #define petsc_mpi_finalize_           petsc_mpi_finalize
508a7b85bbcSSatish Balay   #define petsc_mpi_comm_size_          petsc_mpi_comm_size
509a7b85bbcSSatish Balay   #define petsc_mpi_comm_rank_          petsc_mpi_comm_rank
510a7b85bbcSSatish Balay   #define petsc_mpi_abort_              petsc_mpi_abort
511a7b85bbcSSatish Balay   #define petsc_mpi_reduce_             petsc_mpi_reduce
512a7b85bbcSSatish Balay   #define petsc_mpi_allreduce_          petsc_mpi_allreduce
513a7b85bbcSSatish Balay   #define petsc_mpi_barrier_            petsc_mpi_barrier
514a7b85bbcSSatish Balay   #define petsc_mpi_bcast_              petsc_mpi_bcast
515a7b85bbcSSatish Balay   #define petsc_mpi_gather_             petsc_mpi_gather
516a7b85bbcSSatish Balay   #define petsc_mpi_allgather_          petsc_mpi_allgather
517a7b85bbcSSatish Balay   #define petsc_mpi_comm_split_         petsc_mpi_comm_split
518a7b85bbcSSatish Balay   #define petsc_mpi_scan_               petsc_mpi_scan
519a7b85bbcSSatish Balay   #define petsc_mpi_send_               petsc_mpi_send
520a7b85bbcSSatish Balay   #define petsc_mpi_recv_               petsc_mpi_recv
521a7b85bbcSSatish Balay   #define petsc_mpi_reduce_scatter_     petsc_mpi_reduce_scatter
522a7b85bbcSSatish Balay   #define petsc_mpi_irecv_              petsc_mpi_irecv
523a7b85bbcSSatish Balay   #define petsc_mpi_isend_              petsc_mpi_isend
524a7b85bbcSSatish Balay   #define petsc_mpi_sendrecv_           petsc_mpi_sendrecv
525a7b85bbcSSatish Balay   #define petsc_mpi_test_               petsc_mpi_test
526a7b85bbcSSatish Balay   #define petsc_mpi_waitall_            petsc_mpi_waitall
527a7b85bbcSSatish Balay   #define petsc_mpi_waitany_            petsc_mpi_waitany
528a7b85bbcSSatish Balay   #define petsc_mpi_allgatherv_         petsc_mpi_allgatherv
529a7b85bbcSSatish Balay   #define petsc_mpi_alltoallv_          petsc_mpi_alltoallv
530a7b85bbcSSatish Balay   #define petsc_mpi_comm_create_        petsc_mpi_comm_create
531a7b85bbcSSatish Balay   #define petsc_mpi_address_            petsc_mpi_address
532a7b85bbcSSatish Balay   #define petsc_mpi_pack_               petsc_mpi_pack
533a7b85bbcSSatish Balay   #define petsc_mpi_unpack_             petsc_mpi_unpack
534a7b85bbcSSatish Balay   #define petsc_mpi_pack_size_          petsc_mpi_pack_size
535a7b85bbcSSatish Balay   #define petsc_mpi_type_struct_        petsc_mpi_type_struct
536a7b85bbcSSatish Balay   #define petsc_mpi_type_commit_        petsc_mpi_type_commit
537a7b85bbcSSatish Balay   #define petsc_mpi_wtime_              petsc_mpi_wtime
538a7b85bbcSSatish Balay   #define petsc_mpi_cancel_             petsc_mpi_cancel
539a7b85bbcSSatish Balay   #define petsc_mpi_comm_dup_           petsc_mpi_comm_dup
540a7b85bbcSSatish Balay   #define petsc_mpi_comm_free_          petsc_mpi_comm_free
541a7b85bbcSSatish Balay   #define petsc_mpi_get_count_          petsc_mpi_get_count
542a7b85bbcSSatish Balay   #define petsc_mpi_get_processor_name_ petsc_mpi_get_processor_name
543a7b85bbcSSatish Balay   #define petsc_mpi_initialized_        petsc_mpi_initialized
544a7b85bbcSSatish Balay   #define petsc_mpi_iprobe_             petsc_mpi_iprobe
545a7b85bbcSSatish Balay   #define petsc_mpi_probe_              petsc_mpi_probe
546a7b85bbcSSatish Balay   #define petsc_mpi_request_free_       petsc_mpi_request_free
547a7b85bbcSSatish Balay   #define petsc_mpi_ssend_              petsc_mpi_ssend
548a7b85bbcSSatish Balay   #define petsc_mpi_wait_               petsc_mpi_wait
549a7b85bbcSSatish Balay   #define petsc_mpi_comm_group_         petsc_mpi_comm_group
550a7b85bbcSSatish Balay   #define petsc_mpi_exscan_             petsc_mpi_exscan
551f7c6e6aaSSatish Balay #endif
552e5c89e4eSSatish Balay 
553f7c6e6aaSSatish Balay #if defined(PETSC_HAVE_FORTRAN_UNDERSCORE_UNDERSCORE)
554a7b85bbcSSatish Balay   #define petsc_mpi_init_               petsc_mpi_init__
555a7b85bbcSSatish Balay   #define petsc_mpi_finalize_           petsc_mpi_finalize__
556a7b85bbcSSatish Balay   #define petsc_mpi_comm_size_          petsc_mpi_comm_size__
557a7b85bbcSSatish Balay   #define petsc_mpi_comm_rank_          petsc_mpi_comm_rank__
558a7b85bbcSSatish Balay   #define petsc_mpi_abort_              petsc_mpi_abort__
559a7b85bbcSSatish Balay   #define petsc_mpi_reduce_             petsc_mpi_reduce__
560a7b85bbcSSatish Balay   #define petsc_mpi_allreduce_          petsc_mpi_allreduce__
561a7b85bbcSSatish Balay   #define petsc_mpi_barrier_            petsc_mpi_barrier__
562a7b85bbcSSatish Balay   #define petsc_mpi_bcast_              petsc_mpi_bcast__
563a7b85bbcSSatish Balay   #define petsc_mpi_gather_             petsc_mpi_gather__
564a7b85bbcSSatish Balay   #define petsc_mpi_allgather_          petsc_mpi_allgather__
565a7b85bbcSSatish Balay   #define petsc_mpi_comm_split_         petsc_mpi_comm_split__
566a7b85bbcSSatish Balay   #define petsc_mpi_scan_               petsc_mpi_scan__
567a7b85bbcSSatish Balay   #define petsc_mpi_send_               petsc_mpi_send__
568a7b85bbcSSatish Balay   #define petsc_mpi_recv_               petsc_mpi_recv__
569a7b85bbcSSatish Balay   #define petsc_mpi_reduce_scatter_     petsc_mpi_reduce_scatter__
570a7b85bbcSSatish Balay   #define petsc_mpi_irecv_              petsc_mpi_irecv__
571a7b85bbcSSatish Balay   #define petsc_mpi_isend_              petsc_mpi_isend__
572a7b85bbcSSatish Balay   #define petsc_mpi_sendrecv_           petsc_mpi_sendrecv__
573a7b85bbcSSatish Balay   #define petsc_mpi_test_               petsc_mpi_test__
574a7b85bbcSSatish Balay   #define petsc_mpi_waitall_            petsc_mpi_waitall__
575a7b85bbcSSatish Balay   #define petsc_mpi_waitany_            petsc_mpi_waitany__
576a7b85bbcSSatish Balay   #define petsc_mpi_allgatherv_         petsc_mpi_allgatherv__
577a7b85bbcSSatish Balay   #define petsc_mpi_alltoallv_          petsc_mpi_alltoallv__
578a7b85bbcSSatish Balay   #define petsc_mpi_comm_create_        petsc_mpi_comm_create__
579a7b85bbcSSatish Balay   #define petsc_mpi_address_            petsc_mpi_address__
580a7b85bbcSSatish Balay   #define petsc_mpi_pack_               petsc_mpi_pack__
581a7b85bbcSSatish Balay   #define petsc_mpi_unpack_             petsc_mpi_unpack__
582a7b85bbcSSatish Balay   #define petsc_mpi_pack_size_          petsc_mpi_pack_size__
583a7b85bbcSSatish Balay   #define petsc_mpi_type_struct_        petsc_mpi_type_struct__
584a7b85bbcSSatish Balay   #define petsc_mpi_type_commit_        petsc_mpi_type_commit__
585a7b85bbcSSatish Balay   #define petsc_mpi_wtime_              petsc_mpi_wtime__
586a7b85bbcSSatish Balay   #define petsc_mpi_cancel_             petsc_mpi_cancel__
587a7b85bbcSSatish Balay   #define petsc_mpi_comm_dup_           petsc_mpi_comm_dup__
588a7b85bbcSSatish Balay   #define petsc_mpi_comm_free_          petsc_mpi_comm_free__
589a7b85bbcSSatish Balay   #define petsc_mpi_get_count_          petsc_mpi_get_count__
590a7b85bbcSSatish Balay   #define petsc_mpi_get_processor_name_ petsc_mpi_get_processor_name__
591a7b85bbcSSatish Balay   #define petsc_mpi_initialized_        petsc_mpi_initialized__
592a7b85bbcSSatish Balay   #define petsc_mpi_iprobe_             petsc_mpi_iprobe__
593a7b85bbcSSatish Balay   #define petsc_mpi_probe_              petsc_mpi_probe__
594a7b85bbcSSatish Balay   #define petsc_mpi_request_free_       petsc_mpi_request_free__
595a7b85bbcSSatish Balay   #define petsc_mpi_ssend_              petsc_mpi_ssend__
596a7b85bbcSSatish Balay   #define petsc_mpi_wait_               petsc_mpi_wait__
597a7b85bbcSSatish Balay   #define petsc_mpi_comm_group_         petsc_mpi_comm_group__
598a7b85bbcSSatish Balay   #define petsc_mpi_exscan_             petsc_mpi_exscan__
599f7c6e6aaSSatish Balay #endif
600e5c89e4eSSatish Balay 
601da81f932SPierre Jolivet /* Do not build fortran interface if MPI namespace collision is to be avoided */
602fbf9dbe5SBarry Smith #if defined(PETSC_USE_FORTRAN_BINDINGS)
603c8217ed5SSatish Balay 
60419caf8f3SSatish Balay PETSC_EXTERN void mpiunisetmoduleblock_(void);
60552ecd5ffSSatish Balay 
606d71ae5a4SJacob Faibussowitsch PETSC_EXTERN void mpiunisetfortranbasepointers_(void *f_mpi_in_place)
607d71ae5a4SJacob Faibussowitsch {
60852ecd5ffSSatish Balay   MPIUNIF_mpi_in_place = f_mpi_in_place;
60952ecd5ffSSatish Balay }
61052ecd5ffSSatish Balay 
611d71ae5a4SJacob Faibussowitsch PETSC_EXTERN void petsc_mpi_init_(int *ierr)
612d71ae5a4SJacob Faibussowitsch {
6130134af2dSBarry Smith   mpiunisetmoduleblock_();
614c8025a54SPierre Jolivet   *ierr = MPI_Init(NULL, NULL);
615e5c89e4eSSatish Balay }
616e5c89e4eSSatish Balay 
617d71ae5a4SJacob Faibussowitsch PETSC_EXTERN void petsc_mpi_finalize_(int *ierr)
618d71ae5a4SJacob Faibussowitsch {
619c8217ed5SSatish Balay   *ierr = MPI_Finalize();
620e5c89e4eSSatish Balay }
621e5c89e4eSSatish Balay 
622d71ae5a4SJacob Faibussowitsch PETSC_EXTERN void petsc_mpi_comm_size_(MPI_Comm *comm, int *size, int *ierr)
623d71ae5a4SJacob Faibussowitsch {
624e5c89e4eSSatish Balay   *size = 1;
625e5c89e4eSSatish Balay   *ierr = 0;
626e5c89e4eSSatish Balay }
627e5c89e4eSSatish Balay 
628d71ae5a4SJacob Faibussowitsch PETSC_EXTERN void petsc_mpi_comm_rank_(MPI_Comm *comm, int *rank, int *ierr)
629d71ae5a4SJacob Faibussowitsch {
630e5c89e4eSSatish Balay   *rank = 0;
631e5c89e4eSSatish Balay   *ierr = MPI_SUCCESS;
632e5c89e4eSSatish Balay }
633e5c89e4eSSatish Balay 
634d71ae5a4SJacob Faibussowitsch PETSC_EXTERN void petsc_mpi_comm_split_(MPI_Comm *comm, int *color, int *key, MPI_Comm *newcomm, int *ierr)
635d71ae5a4SJacob Faibussowitsch {
6361f6cc5b2SSatish Balay   *newcomm = *comm;
6371f6cc5b2SSatish Balay   *ierr    = MPI_SUCCESS;
6381f6cc5b2SSatish Balay }
6391f6cc5b2SSatish Balay 
640d71ae5a4SJacob Faibussowitsch PETSC_EXTERN void petsc_mpi_abort_(MPI_Comm *comm, int *errorcode, int *ierr)
641d71ae5a4SJacob Faibussowitsch {
642e5c89e4eSSatish Balay   abort();
643e5c89e4eSSatish Balay   *ierr = MPI_SUCCESS;
644e5c89e4eSSatish Balay }
645e5c89e4eSSatish Balay 
646d71ae5a4SJacob Faibussowitsch PETSC_EXTERN void petsc_mpi_reduce_(void *sendbuf, void *recvbuf, int *count, int *datatype, int *op, int *root, int *comm, int *ierr)
647d71ae5a4SJacob Faibussowitsch {
648f30578ecSBarry Smith   *ierr = MPI_Reduce(sendbuf, recvbuf, *count, *datatype, *op, *root, *comm);
6493b644628SSatish Balay }
6503b644628SSatish Balay 
651d71ae5a4SJacob Faibussowitsch PETSC_EXTERN void petsc_mpi_allreduce_(void *sendbuf, void *recvbuf, int *count, int *datatype, int *op, int *comm, int *ierr)
652d71ae5a4SJacob Faibussowitsch {
653f30578ecSBarry Smith   *ierr = MPI_Allreduce(sendbuf, recvbuf, *count, *datatype, *op, *comm);
654e5c89e4eSSatish Balay }
655e5c89e4eSSatish Balay 
656d71ae5a4SJacob Faibussowitsch PETSC_EXTERN void petsc_mpi_barrier_(MPI_Comm *comm, int *ierr)
657d71ae5a4SJacob Faibussowitsch {
658e5c89e4eSSatish Balay   *ierr = MPI_SUCCESS;
659e5c89e4eSSatish Balay }
660f7c6e6aaSSatish Balay 
661d71ae5a4SJacob Faibussowitsch PETSC_EXTERN void petsc_mpi_bcast_(void *buf, int *count, int *datatype, int *root, int *comm, int *ierr)
662d71ae5a4SJacob Faibussowitsch {
663e5c89e4eSSatish Balay   *ierr = MPI_SUCCESS;
664e5c89e4eSSatish Balay }
665f7c6e6aaSSatish Balay 
666d71ae5a4SJacob Faibussowitsch PETSC_EXTERN void petsc_mpi_gather_(void *sendbuf, int *scount, int *sdatatype, void *recvbuf, int *rcount, int *rdatatype, int *root, int *comm, int *ierr)
667d71ae5a4SJacob Faibussowitsch {
668f30578ecSBarry Smith   *ierr = MPI_Gather(sendbuf, *scount, *sdatatype, recvbuf, rcount, rdatatype, *root, *comm);
669f7c6e6aaSSatish Balay }
670f7c6e6aaSSatish Balay 
671d71ae5a4SJacob Faibussowitsch PETSC_EXTERN void petsc_mpi_allgather_(void *sendbuf, int *scount, int *sdatatype, void *recvbuf, int *rcount, int *rdatatype, int *comm, int *ierr)
672d71ae5a4SJacob Faibussowitsch {
673f30578ecSBarry Smith   *ierr = MPI_Allgather(sendbuf, *scount, *sdatatype, recvbuf, rcount, rdatatype, *comm);
674e5c89e4eSSatish Balay }
675e5c89e4eSSatish Balay 
676d71ae5a4SJacob Faibussowitsch PETSC_EXTERN void petsc_mpi_scan_(void *sendbuf, void *recvbuf, int *count, int *datatype, int *op, int *comm, int *ierr)
677d71ae5a4SJacob Faibussowitsch {
6781a589b05SJed Brown   *ierr = MPIUNI_Memcpy(recvbuf, sendbuf, (*count) * MPI_sizeof(*datatype));
6793b644628SSatish Balay }
6803b644628SSatish Balay 
681d71ae5a4SJacob Faibussowitsch PETSC_EXTERN void petsc_mpi_send_(void *buf, int *count, int *datatype, int *dest, int *tag, int *comm, int *ierr)
682d71ae5a4SJacob Faibussowitsch {
68306df1fb1SBarry Smith   *ierr = MPIUni_Abort(MPI_COMM_WORLD, 0);
6841086b069SSatish Balay }
6851086b069SSatish Balay 
686d71ae5a4SJacob Faibussowitsch PETSC_EXTERN void petsc_mpi_recv_(void *buf, int *count, int *datatype, int *source, int *tag, int *comm, int status, int *ierr)
687d71ae5a4SJacob Faibussowitsch {
68806df1fb1SBarry Smith   *ierr = MPIUni_Abort(MPI_COMM_WORLD, 0);
6891086b069SSatish Balay }
6901086b069SSatish Balay 
691d71ae5a4SJacob Faibussowitsch PETSC_EXTERN void petsc_mpi_reduce_scatter_(void *sendbuf, void *recvbuf, int *recvcounts, int *datatype, int *op, int *comm, int *ierr)
692d71ae5a4SJacob Faibussowitsch {
69306df1fb1SBarry Smith   *ierr = MPIUni_Abort(MPI_COMM_WORLD, 0);
694156bc490SSatish Balay }
695156bc490SSatish Balay 
696d71ae5a4SJacob Faibussowitsch PETSC_EXTERN void petsc_mpi_irecv_(void *buf, int *count, int *datatype, int *source, int *tag, int *comm, int *request, int *ierr)
697d71ae5a4SJacob Faibussowitsch {
69806df1fb1SBarry Smith   *ierr = MPIUni_Abort(MPI_COMM_WORLD, 0);
699156bc490SSatish Balay }
700156bc490SSatish Balay 
701d71ae5a4SJacob Faibussowitsch PETSC_EXTERN void petsc_mpi_isend_(void *buf, int *count, int *datatype, int *dest, int *tag, int *comm, int *request, int *ierr)
702d71ae5a4SJacob Faibussowitsch {
70306df1fb1SBarry Smith   *ierr = MPIUni_Abort(MPI_COMM_WORLD, 0);
704156bc490SSatish Balay }
705156bc490SSatish Balay 
706d71ae5a4SJacob Faibussowitsch PETSC_EXTERN void petsc_mpi_sendrecv_(void *sendbuf, int *sendcount, int *sendtype, int *dest, int *sendtag, void *recvbuf, int *recvcount, int *recvtype, int *source, int *recvtag, int *comm, int *status, int *ierr)
707d71ae5a4SJacob Faibussowitsch {
7081a589b05SJed Brown   *ierr = MPIUNI_Memcpy(recvbuf, sendbuf, (*sendcount) * MPI_sizeof(*sendtype));
709156bc490SSatish Balay }
710156bc490SSatish Balay 
711d71ae5a4SJacob Faibussowitsch PETSC_EXTERN void petsc_mpi_test_(int *request, int *flag, int *status, int *ierr)
712d71ae5a4SJacob Faibussowitsch {
71306df1fb1SBarry Smith   *ierr = MPIUni_Abort(MPI_COMM_WORLD, 0);
714156bc490SSatish Balay }
715156bc490SSatish Balay 
716d71ae5a4SJacob Faibussowitsch PETSC_EXTERN void petsc_mpi_waitall_(int *count, int *array_of_requests, int *array_of_statuses, int *ierr)
717d71ae5a4SJacob Faibussowitsch {
718156bc490SSatish Balay   *ierr = MPI_SUCCESS;
719156bc490SSatish Balay }
720156bc490SSatish Balay 
721d71ae5a4SJacob Faibussowitsch PETSC_EXTERN void petsc_mpi_waitany_(int *count, int *array_of_requests, int *index, int *status, int *ierr)
722d71ae5a4SJacob Faibussowitsch {
723156bc490SSatish Balay   *ierr = MPI_SUCCESS;
724156bc490SSatish Balay }
725156bc490SSatish Balay 
726d71ae5a4SJacob Faibussowitsch PETSC_EXTERN void petsc_mpi_allgatherv_(void *sendbuf, int *sendcount, int *sendtype, void *recvbuf, int *recvcounts, int *displs, int *recvtype, int *comm, int *ierr)
727d71ae5a4SJacob Faibussowitsch {
728f30578ecSBarry Smith   *ierr = MPI_Allgatherv(sendbuf, *sendcount, *sendtype, recvbuf, recvcounts, displs, *recvtype, *comm);
729156bc490SSatish Balay }
730156bc490SSatish Balay 
731d71ae5a4SJacob Faibussowitsch PETSC_EXTERN void petsc_mpi_alltoallv_(void *sendbuf, int *sendcounts, int *sdispls, int *sendtype, void *recvbuf, int *recvcounts, int *rdispls, int *recvtype, int *comm, int *ierr)
732d71ae5a4SJacob Faibussowitsch {
733f30578ecSBarry Smith   *ierr = MPI_Alltoallv(sendbuf, sendcounts, sdispls, *sendtype, recvbuf, recvcounts, rdispls, *recvtype, *comm);
734156bc490SSatish Balay }
735156bc490SSatish Balay 
736d71ae5a4SJacob Faibussowitsch PETSC_EXTERN void petsc_mpi_comm_create_(int *comm, int *group, int *newcomm, int *ierr)
737d71ae5a4SJacob Faibussowitsch {
738156bc490SSatish Balay   *newcomm = *comm;
739156bc490SSatish Balay   *ierr    = MPI_SUCCESS;
740156bc490SSatish Balay }
741156bc490SSatish Balay 
742d71ae5a4SJacob Faibussowitsch PETSC_EXTERN void petsc_mpi_address_(void *location, MPI_Aint *address, int *ierr)
743d71ae5a4SJacob Faibussowitsch {
74499256852SLisandro Dalcin   *address = (MPI_Aint)((char *)location);
745156bc490SSatish Balay   *ierr    = MPI_SUCCESS;
746156bc490SSatish Balay }
747156bc490SSatish Balay 
748d71ae5a4SJacob Faibussowitsch PETSC_EXTERN void petsc_mpi_pack_(void *inbuf, int *incount, int *datatype, void *outbuf, int *outsize, int *position, int *comm, int *ierr)
749d71ae5a4SJacob Faibussowitsch {
75006df1fb1SBarry Smith   *ierr = MPIUni_Abort(MPI_COMM_WORLD, 0);
751156bc490SSatish Balay }
752156bc490SSatish Balay 
753d71ae5a4SJacob Faibussowitsch PETSC_EXTERN void petsc_mpi_unpack_(void *inbuf, int *insize, int *position, void *outbuf, int *outcount, int *datatype, int *comm, int *ierr)
754d71ae5a4SJacob Faibussowitsch {
75506df1fb1SBarry Smith   *ierr = MPIUni_Abort(MPI_COMM_WORLD, 0);
756156bc490SSatish Balay }
757156bc490SSatish Balay 
758d71ae5a4SJacob Faibussowitsch PETSC_EXTERN void petsc_mpi_pack_size_(int *incount, int *datatype, int *comm, int *size, int *ierr)
759d71ae5a4SJacob Faibussowitsch {
76006df1fb1SBarry Smith   *ierr = MPIUni_Abort(MPI_COMM_WORLD, 0);
761156bc490SSatish Balay }
762156bc490SSatish Balay 
763d71ae5a4SJacob Faibussowitsch PETSC_EXTERN void petsc_mpi_type_struct_(int *count, int *array_of_blocklengths, int *array_of_displaments, int *array_of_types, int *newtype, int *ierr)
764d71ae5a4SJacob Faibussowitsch {
76506df1fb1SBarry Smith   *ierr = MPIUni_Abort(MPI_COMM_WORLD, 0);
766156bc490SSatish Balay }
767156bc490SSatish Balay 
768d71ae5a4SJacob Faibussowitsch PETSC_EXTERN void petsc_mpi_type_commit_(int *datatype, int *ierr)
769d71ae5a4SJacob Faibussowitsch {
770156bc490SSatish Balay   *ierr = MPI_SUCCESS;
771156bc490SSatish Balay }
772156bc490SSatish Balay 
773d71ae5a4SJacob Faibussowitsch double petsc_mpi_wtime_(void)
774d71ae5a4SJacob Faibussowitsch {
775156bc490SSatish Balay   return 0.0;
776f8f52c7dSSatish Balay }
777156bc490SSatish Balay 
778d71ae5a4SJacob Faibussowitsch PETSC_EXTERN void petsc_mpi_cancel_(int *request, int *ierr)
779d71ae5a4SJacob Faibussowitsch {
780f8f52c7dSSatish Balay   *ierr = MPI_SUCCESS;
781f8f52c7dSSatish Balay }
782f8f52c7dSSatish Balay 
783d71ae5a4SJacob Faibussowitsch PETSC_EXTERN void petsc_mpi_comm_dup_(int *comm, int *out, int *ierr)
784d71ae5a4SJacob Faibussowitsch {
785f8f52c7dSSatish Balay   *out  = *comm;
786f8f52c7dSSatish Balay   *ierr = MPI_SUCCESS;
787f8f52c7dSSatish Balay }
788f8f52c7dSSatish Balay 
789d71ae5a4SJacob Faibussowitsch PETSC_EXTERN void petsc_mpi_comm_free_(int *comm, int *ierr)
790d71ae5a4SJacob Faibussowitsch {
791f8f52c7dSSatish Balay   *ierr = MPI_SUCCESS;
792f8f52c7dSSatish Balay }
793f8f52c7dSSatish Balay 
794d71ae5a4SJacob Faibussowitsch PETSC_EXTERN void petsc_mpi_get_count_(int *status, int *datatype, int *count, int *ierr)
795d71ae5a4SJacob Faibussowitsch {
79606df1fb1SBarry Smith   *ierr = MPIUni_Abort(MPI_COMM_WORLD, 0);
797f8f52c7dSSatish Balay }
798f8f52c7dSSatish Balay 
799d71ae5a4SJacob Faibussowitsch PETSC_EXTERN void petsc_mpi_get_processor_name_(char *name, int *result_len, int *ierr, PETSC_FORTRAN_CHARLEN_T len)
800d71ae5a4SJacob Faibussowitsch {
801f8f52c7dSSatish Balay   MPIUNI_Memcpy(name, "localhost", 9 * sizeof(char));
802f8f52c7dSSatish Balay   *result_len = 9;
803f8f52c7dSSatish Balay   *ierr       = MPI_SUCCESS;
804f8f52c7dSSatish Balay }
805f8f52c7dSSatish Balay 
806d71ae5a4SJacob Faibussowitsch PETSC_EXTERN void petsc_mpi_initialized_(int *flag, int *ierr)
807d71ae5a4SJacob Faibussowitsch {
808f8f52c7dSSatish Balay   *flag = MPI_was_initialized;
809f8f52c7dSSatish Balay   *ierr = MPI_SUCCESS;
810f8f52c7dSSatish Balay }
811f8f52c7dSSatish Balay 
812d71ae5a4SJacob Faibussowitsch PETSC_EXTERN void petsc_mpi_iprobe_(int *source, int *tag, int *comm, int *glag, int *status, int *ierr)
813d71ae5a4SJacob Faibussowitsch {
814f8f52c7dSSatish Balay   *ierr = MPI_SUCCESS;
815f8f52c7dSSatish Balay }
816f8f52c7dSSatish Balay 
817d71ae5a4SJacob Faibussowitsch PETSC_EXTERN void petsc_mpi_probe_(int *source, int *tag, int *comm, int *flag, int *status, int *ierr)
818d71ae5a4SJacob Faibussowitsch {
819f8f52c7dSSatish Balay   *ierr = MPI_SUCCESS;
820f8f52c7dSSatish Balay }
821f8f52c7dSSatish Balay 
822d71ae5a4SJacob Faibussowitsch PETSC_EXTERN void petsc_mpi_request_free_(int *request, int *ierr)
823d71ae5a4SJacob Faibussowitsch {
824f8f52c7dSSatish Balay   *ierr = MPI_SUCCESS;
825f8f52c7dSSatish Balay }
826f8f52c7dSSatish Balay 
827d71ae5a4SJacob Faibussowitsch PETSC_EXTERN void petsc_mpi_ssend_(void *buf, int *count, int *datatype, int *dest, int *tag, int *comm, int *ierr)
828d71ae5a4SJacob Faibussowitsch {
82906df1fb1SBarry Smith   *ierr = MPIUni_Abort(MPI_COMM_WORLD, 0);
830f8f52c7dSSatish Balay }
831f8f52c7dSSatish Balay 
832d71ae5a4SJacob Faibussowitsch PETSC_EXTERN void petsc_mpi_wait_(int *request, int *status, int *ierr)
833d71ae5a4SJacob Faibussowitsch {
834f8f52c7dSSatish Balay   *ierr = MPI_SUCCESS;
835156bc490SSatish Balay }
836156bc490SSatish Balay 
837d71ae5a4SJacob Faibussowitsch PETSC_EXTERN void petsc_mpi_comm_group_(int *comm, int *group, int *ierr)
838d71ae5a4SJacob Faibussowitsch {
839d4816372SSatish Balay   *ierr = MPI_SUCCESS;
840d4816372SSatish Balay }
841d4816372SSatish Balay 
842d71ae5a4SJacob Faibussowitsch PETSC_EXTERN void petsc_mpi_exscan_(void *sendbuf, void *recvbuf, int *count, int *datatype, int *op, int *comm, int *ierr)
843d71ae5a4SJacob Faibussowitsch {
844d4816372SSatish Balay   *ierr = MPI_SUCCESS;
845d4816372SSatish Balay }
846d4816372SSatish Balay 
847fbf9dbe5SBarry Smith #endif /* PETSC_USE_FORTRAN_BINDINGS */
848c8217ed5SSatish Balay 
849e5c89e4eSSatish Balay #if defined(__cplusplus)
850e5c89e4eSSatish Balay }
851e5c89e4eSSatish Balay #endif
852