xref: /petsc/src/sys/mpiuni/mpi.c (revision f4f49eeac7efa77fffa46b7ff95a3ed169f659ed)
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 */
57d71ae5a4SJacob Faibussowitsch int MPIUNI_Memcpy(void *dst, const void *src, int 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   {
769371c9d4SSatish Balay     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 
159d71ae5a4SJacob Faibussowitsch int MPI_Comm_create_keyval(MPI_Copy_function *copy_fn, MPI_Delete_function *delete_fn, int *keyval, void *extra_state)
160d71ae5a4SJacob Faibussowitsch {
161f0463fa0SJunchao Zhang   int i, keyid;
162f0463fa0SJunchao Zhang   for (i = 1; i < num_attr; i++) { /* the first attribute is always in use */
163f0463fa0SJunchao Zhang     if (!attr_keyval[i].active) {
164f0463fa0SJunchao Zhang       keyid = i;
165f0463fa0SJunchao Zhang       goto found;
166f0463fa0SJunchao Zhang     }
167f0463fa0SJunchao Zhang   }
1689cf9c1dbSJed Brown   if (num_attr >= MAX_ATTR) return MPIUni_Abort(MPI_COMM_WORLD, 1);
169f0463fa0SJunchao Zhang   keyid = num_attr++;
170e5c89e4eSSatish Balay 
171f0463fa0SJunchao Zhang found:
172f0463fa0SJunchao Zhang   attr_keyval[keyid].extra_state = extra_state;
173f0463fa0SJunchao Zhang   attr_keyval[keyid].del         = delete_fn;
174f0463fa0SJunchao Zhang   attr_keyval[keyid].active      = 1;
175f0463fa0SJunchao Zhang   *keyval                        = keyid;
17699256852SLisandro Dalcin   return MPI_SUCCESS;
177e5c89e4eSSatish Balay }
178e5c89e4eSSatish Balay 
17936f0be53SJacob Faibussowitsch /*
18036f0be53SJacob Faibussowitsch   The reference counting business is here to guard against the following:
18136f0be53SJacob Faibussowitsch 
18236f0be53SJacob Faibussowitsch   MPI_Comm_set_attr(comm, keyval, some_attr);
18336f0be53SJacob Faibussowitsch   MPI_Comm_free_keyval(&keyval);
18436f0be53SJacob Faibussowitsch   MPI_Comm_free(&comm);
18536f0be53SJacob Faibussowitsch 
18636f0be53SJacob Faibussowitsch   Here MPI_Comm_free() will try to destroy all of the attributes of the comm, and hence we
18736f0be53SJacob Faibussowitsch   should not clear the deleter or extra_state until all communicators that have the attribute
18836f0be53SJacob Faibussowitsch   set are either freed or have given up their attribute.
18936f0be53SJacob Faibussowitsch 
19036f0be53SJacob Faibussowitsch   The attribute reference count is INCREASED in:
19136f0be53SJacob Faibussowitsch   - MPI_Comm_create_keyval()
19236f0be53SJacob Faibussowitsch   - MPI_Comm_set_attr()
19336f0be53SJacob Faibussowitsch 
19436f0be53SJacob Faibussowitsch   The atrtibute reference count is DECREASED in:
19536f0be53SJacob Faibussowitsch   - MPI_Comm_free_keyval()
19636f0be53SJacob Faibussowitsch   - MPI_Comm_delete_attr() (but only if the comm has the attribute)
19736f0be53SJacob Faibussowitsch */
198d71ae5a4SJacob Faibussowitsch static int MPI_Attr_dereference_keyval(int keyval)
199d71ae5a4SJacob Faibussowitsch {
20036f0be53SJacob Faibussowitsch   if (--(attr_keyval[keyval].active) <= 0) {
20136f0be53SJacob Faibussowitsch     attr_keyval[keyval].extra_state = 0;
20236f0be53SJacob Faibussowitsch     attr_keyval[keyval].del         = 0;
20336f0be53SJacob Faibussowitsch   }
20436f0be53SJacob Faibussowitsch   return MPI_SUCCESS;
20536f0be53SJacob Faibussowitsch }
20636f0be53SJacob Faibussowitsch 
207d71ae5a4SJacob Faibussowitsch static int MPI_Attr_reference_keyval(int keyval)
208d71ae5a4SJacob Faibussowitsch {
20936f0be53SJacob Faibussowitsch   ++(attr_keyval[keyval].active);
21036f0be53SJacob Faibussowitsch   return MPI_SUCCESS;
21136f0be53SJacob Faibussowitsch }
21236f0be53SJacob Faibussowitsch 
213d71ae5a4SJacob Faibussowitsch int MPI_Comm_free_keyval(int *keyval)
214d71ae5a4SJacob Faibussowitsch {
21536f0be53SJacob Faibussowitsch   int ret;
21636f0be53SJacob Faibussowitsch 
21736f0be53SJacob Faibussowitsch   if (*keyval < 0 || *keyval >= num_attr) return MPI_FAILURE;
21836f0be53SJacob Faibussowitsch   if ((ret = MPI_Attr_dereference_keyval(*keyval))) return ret;
219a246e310SBarry Smith   *keyval = 0;
220e5c89e4eSSatish Balay   return MPI_SUCCESS;
221e5c89e4eSSatish Balay }
222e5c89e4eSSatish Balay 
223d71ae5a4SJacob Faibussowitsch int MPI_Comm_set_attr(MPI_Comm comm, int keyval, void *attribute_val)
224d71ae5a4SJacob Faibussowitsch {
22536f0be53SJacob Faibussowitsch   int idx = CommIdx(comm), ret;
226f0463fa0SJunchao Zhang   if (comm < 1 || comm > MaxComm) return MPI_FAILURE;
22736f0be53SJacob Faibussowitsch   if (keyval < 0 || keyval >= num_attr) return MPI_FAILURE;
22836f0be53SJacob Faibussowitsch 
22936f0be53SJacob Faibussowitsch   if ((ret = MPI_Comm_delete_attr(comm, keyval))) return ret;
23036f0be53SJacob Faibussowitsch   if ((ret = MPI_Attr_reference_keyval(keyval))) return ret;
231f0463fa0SJunchao Zhang   attr[idx][keyval].active        = 1;
232f0463fa0SJunchao Zhang   attr[idx][keyval].attribute_val = attribute_val;
233e5c89e4eSSatish Balay   return MPI_SUCCESS;
234e5c89e4eSSatish Balay }
235e5c89e4eSSatish Balay 
236d71ae5a4SJacob Faibussowitsch int MPI_Comm_delete_attr(MPI_Comm comm, int keyval)
237d71ae5a4SJacob Faibussowitsch {
238f0463fa0SJunchao Zhang   int idx = CommIdx(comm);
239f0463fa0SJunchao Zhang   if (comm < 1 || comm > MaxComm) return MPI_FAILURE;
24036f0be53SJacob Faibussowitsch   if (keyval < 0 || keyval >= num_attr) return MPI_FAILURE;
24136f0be53SJacob Faibussowitsch   if (attr[idx][keyval].active) {
24236f0be53SJacob Faibussowitsch     int   ret;
243f0463fa0SJunchao Zhang     void *save_attribute_val = attr[idx][keyval].attribute_val;
24436f0be53SJacob Faibussowitsch 
245f0463fa0SJunchao Zhang     attr[idx][keyval].active        = 0;
246f0463fa0SJunchao Zhang     attr[idx][keyval].attribute_val = 0;
24736f0be53SJacob Faibussowitsch     if (attr_keyval[keyval].del) {
248*f4f49eeaSPierre Jolivet       if ((ret = (*attr_keyval[keyval].del)(comm, keyval, save_attribute_val, attr_keyval[keyval].extra_state))) return ret;
24936f0be53SJacob Faibussowitsch     }
25036f0be53SJacob Faibussowitsch     if ((ret = MPI_Attr_dereference_keyval(keyval))) return ret;
25140776e1bSpetsc   }
252e5c89e4eSSatish Balay   return MPI_SUCCESS;
253e5c89e4eSSatish Balay }
254e5c89e4eSSatish Balay 
255d71ae5a4SJacob Faibussowitsch int MPI_Comm_get_attr(MPI_Comm comm, int keyval, void *attribute_val, int *flag)
256d71ae5a4SJacob Faibussowitsch {
257f0463fa0SJunchao Zhang   int idx = CommIdx(comm);
258f0463fa0SJunchao Zhang   if (comm < 1 || comm > MaxComm) return MPI_FAILURE;
259e5c89e4eSSatish Balay   if (!keyval) Keyval_setup();
260f0463fa0SJunchao Zhang   *flag                   = attr[idx][keyval].active;
261f0463fa0SJunchao Zhang   *(void **)attribute_val = attr[idx][keyval].attribute_val;
262e5c89e4eSSatish Balay   return MPI_SUCCESS;
263e5c89e4eSSatish Balay }
264e5c89e4eSSatish Balay 
2659371c9d4SSatish Balay static char all_comm_names[MAX_COMM][MPI_MAX_OBJECT_NAME] = {"MPI_COMM_SELF", "MPI_COMM_WORLD"};
2663e1d142dSJacob Faibussowitsch 
267d71ae5a4SJacob Faibussowitsch int MPI_Comm_get_name(MPI_Comm comm, char *comm_name, int *resultlen)
268d71ae5a4SJacob Faibussowitsch {
2693e1d142dSJacob Faibussowitsch   if (comm < 1 || comm > MaxComm) return MPI_FAILURE;
2703e1d142dSJacob Faibussowitsch   if (!comm_name || !resultlen) return MPI_FAILURE;
2713e1d142dSJacob Faibussowitsch   strncpy(comm_name, all_comm_names[CommIdx(comm)], MPI_MAX_OBJECT_NAME - 1);
2723e1d142dSJacob Faibussowitsch   *resultlen = (int)strlen(comm_name);
2733e1d142dSJacob Faibussowitsch   return MPI_SUCCESS;
2743e1d142dSJacob Faibussowitsch }
2753e1d142dSJacob Faibussowitsch 
276d71ae5a4SJacob Faibussowitsch int MPI_Comm_set_name(MPI_Comm comm, const char *comm_name)
277d71ae5a4SJacob Faibussowitsch {
2783e1d142dSJacob Faibussowitsch   if (comm < 1 || comm > MaxComm) return MPI_FAILURE;
2793e1d142dSJacob Faibussowitsch   if (!comm_name) return MPI_FAILURE;
2803e1d142dSJacob Faibussowitsch   if (strlen(comm_name) > MPI_MAX_OBJECT_NAME - 1) return MPI_FAILURE;
2813e1d142dSJacob Faibussowitsch   strncpy(all_comm_names[CommIdx(comm)], comm_name, MPI_MAX_OBJECT_NAME - 1);
2823e1d142dSJacob Faibussowitsch   return MPI_SUCCESS;
2833e1d142dSJacob Faibussowitsch }
2843e1d142dSJacob Faibussowitsch 
285d71ae5a4SJacob Faibussowitsch int MPI_Comm_create(MPI_Comm comm, MPI_Group group, MPI_Comm *newcomm)
286d71ae5a4SJacob Faibussowitsch {
287f60917d2SBarry Smith   int j;
288f0463fa0SJunchao Zhang   if (comm < 1 || comm > MaxComm) return MPI_FAILURE;
289f0463fa0SJunchao Zhang   for (j = 3; j <= MaxComm; j++) {
290f0463fa0SJunchao Zhang     if (!comm_active[CommIdx(j)]) {
291f0463fa0SJunchao Zhang       comm_active[CommIdx(j)] = 1;
292f60917d2SBarry Smith       *newcomm                = j;
293f60917d2SBarry Smith       return MPI_SUCCESS;
294f60917d2SBarry Smith     }
295f60917d2SBarry Smith   }
296f0463fa0SJunchao Zhang   if (MaxComm >= MAX_COMM) return MPI_FAILURE;
297f0463fa0SJunchao Zhang   *newcomm                       = ++MaxComm;
298f0463fa0SJunchao Zhang   comm_active[CommIdx(*newcomm)] = 1;
299c8217ed5SSatish Balay   return MPI_SUCCESS;
300c8217ed5SSatish Balay }
301c8217ed5SSatish Balay 
302d71ae5a4SJacob Faibussowitsch int MPI_Comm_dup(MPI_Comm comm, MPI_Comm *out)
303d71ae5a4SJacob Faibussowitsch {
304f60917d2SBarry Smith   int j;
305f0463fa0SJunchao Zhang   if (comm < 1 || comm > MaxComm) return MPI_FAILURE;
306f0463fa0SJunchao Zhang   for (j = 3; j <= MaxComm; j++) {
307f0463fa0SJunchao Zhang     if (!comm_active[CommIdx(j)]) {
308f0463fa0SJunchao Zhang       comm_active[CommIdx(j)] = 1;
309f60917d2SBarry Smith       *out                    = j;
310f60917d2SBarry Smith       return MPI_SUCCESS;
311f60917d2SBarry Smith     }
312f60917d2SBarry Smith   }
313f0463fa0SJunchao Zhang   if (MaxComm >= MAX_COMM) return MPI_FAILURE;
314f0463fa0SJunchao Zhang   *out                       = ++MaxComm;
315f0463fa0SJunchao Zhang   comm_active[CommIdx(*out)] = 1;
31699256852SLisandro Dalcin   return MPI_SUCCESS;
317e5c89e4eSSatish Balay }
318e5c89e4eSSatish Balay 
319d71ae5a4SJacob Faibussowitsch int MPI_Comm_free(MPI_Comm *comm)
320d71ae5a4SJacob Faibussowitsch {
321f0463fa0SJunchao Zhang   int idx = CommIdx(*comm);
322e5c89e4eSSatish Balay 
323f0463fa0SJunchao Zhang   if (*comm < 1 || *comm > MaxComm) return MPI_FAILURE;
32436f0be53SJacob Faibussowitsch   for (int i = 0; i < num_attr; i++) {
32536f0be53SJacob Faibussowitsch     int ret = MPI_Comm_delete_attr(*comm, i);
32636f0be53SJacob Faibussowitsch 
32736f0be53SJacob Faibussowitsch     if (ret) return ret;
328e5c89e4eSSatish Balay   }
329f0463fa0SJunchao Zhang   if (*comm >= 3) comm_active[idx] = 0;
330100f28aeSBarry Smith   *comm = 0;
331e5c89e4eSSatish Balay   return MPI_SUCCESS;
332e5c89e4eSSatish Balay }
333e5c89e4eSSatish Balay 
334d71ae5a4SJacob Faibussowitsch int MPI_Comm_size(MPI_Comm comm, int *size)
335d71ae5a4SJacob Faibussowitsch {
336f0463fa0SJunchao Zhang   if (comm < 1 || comm > MaxComm) return MPI_FAILURE;
337d393f697SSatish Balay   *size = 1;
338d393f697SSatish Balay   return MPI_SUCCESS;
339d393f697SSatish Balay }
340d393f697SSatish Balay 
341d71ae5a4SJacob Faibussowitsch int MPI_Comm_rank(MPI_Comm comm, int *rank)
342d71ae5a4SJacob Faibussowitsch {
343f0463fa0SJunchao Zhang   if (comm < 1 || comm > MaxComm) return MPI_FAILURE;
344d393f697SSatish Balay   *rank = 0;
345d393f697SSatish Balay   return MPI_SUCCESS;
346d393f697SSatish Balay }
347d393f697SSatish Balay 
348d71ae5a4SJacob Faibussowitsch int MPIUni_Abort(MPI_Comm comm, int errorcode)
349d71ae5a4SJacob Faibussowitsch {
35006df1fb1SBarry Smith   printf("MPI operation not supported by PETSc's sequential MPI wrappers\n");
351b3f11779SBarry Smith   return MPI_ERR_NOSUPPORT;
35206df1fb1SBarry Smith }
35306df1fb1SBarry Smith 
354d71ae5a4SJacob Faibussowitsch int MPI_Abort(MPI_Comm comm, int errorcode)
355d71ae5a4SJacob Faibussowitsch {
356e5c89e4eSSatish Balay   abort();
357e5c89e4eSSatish Balay   return MPI_SUCCESS;
358e5c89e4eSSatish Balay }
359e5c89e4eSSatish Balay 
36058cd72c3SLisandro Dalcin /* --------------------------------------------------------------------------*/
36158cd72c3SLisandro Dalcin 
362e5c89e4eSSatish Balay static int MPI_was_initialized = 0;
36358cd72c3SLisandro Dalcin static int MPI_was_finalized   = 0;
36458cd72c3SLisandro Dalcin 
365d71ae5a4SJacob Faibussowitsch int MPI_Init(int *argc, char ***argv)
366d71ae5a4SJacob Faibussowitsch {
36799256852SLisandro Dalcin   if (MPI_was_initialized) return MPI_FAILURE;
3689bcf9d5aSJunchao Zhang   /* MPI standard says "once MPI_Finalize returns, no MPI routine (not even MPI_Init) may be called", so an MPI standard compliant
3699bcf9d5aSJunchao Zhang      MPIU should have this 'if (MPI_was_finalized) return MPI_FAILURE;' check. We relax it here to make life easier for users
3709bcf9d5aSJunchao Zhang      of MPIU so that they can do multiple PetscInitialize/Finalize().
3719bcf9d5aSJunchao Zhang   */
3729bcf9d5aSJunchao Zhang   /* if (MPI_was_finalized) return MPI_FAILURE; */
37358cd72c3SLisandro Dalcin   MPI_was_initialized = 1;
3749bcf9d5aSJunchao Zhang   MPI_was_finalized   = 0;
37599256852SLisandro Dalcin   return MPI_SUCCESS;
37658cd72c3SLisandro Dalcin }
37758cd72c3SLisandro Dalcin 
378d71ae5a4SJacob Faibussowitsch int MPI_Init_thread(int *argc, char ***argv, int required, int *provided)
379d71ae5a4SJacob Faibussowitsch {
3809012378cSStefano Zampini   MPI_Query_thread(provided);
3819012378cSStefano Zampini   return MPI_Init(argc, argv);
3829012378cSStefano Zampini }
3839012378cSStefano Zampini 
384d71ae5a4SJacob Faibussowitsch int MPI_Query_thread(int *provided)
385d71ae5a4SJacob Faibussowitsch {
3869012378cSStefano Zampini   *provided = MPI_THREAD_FUNNELED;
3879012378cSStefano Zampini   return MPI_SUCCESS;
3889012378cSStefano Zampini }
3899012378cSStefano Zampini 
390d71ae5a4SJacob Faibussowitsch int MPI_Finalize(void)
391d71ae5a4SJacob Faibussowitsch {
39236f0be53SJacob Faibussowitsch   if (MPI_was_finalized || !MPI_was_initialized) return MPI_FAILURE;
39336f0be53SJacob Faibussowitsch   MPI_Comm comm = MPI_COMM_WORLD;
39436f0be53SJacob Faibussowitsch   int      ret  = MPI_Comm_free(&comm);
39536f0be53SJacob Faibussowitsch 
39636f0be53SJacob Faibussowitsch   if (ret) return ret;
397100f28aeSBarry Smith   comm = MPI_COMM_SELF;
39836f0be53SJacob Faibussowitsch   ret  = MPI_Comm_free(&comm);
39936f0be53SJacob Faibussowitsch   if (ret) return ret;
40036f0be53SJacob Faibussowitsch   if (PetscDefined(USE_DEBUG)) {
40136f0be53SJacob Faibussowitsch     for (int i = 3; i <= MaxComm; ++i) {
402f0463fa0SJunchao Zhang       if (comm_active[CommIdx(i)]) printf("MPIUni warning: MPI communicator %d is not freed before MPI_Finalize()\n", i);
403f0463fa0SJunchao Zhang     }
40436f0be53SJacob Faibussowitsch 
40536f0be53SJacob Faibussowitsch     for (int i = 1; i <= MaxComm; ++i) {
40636f0be53SJacob Faibussowitsch       for (int j = 0; j < num_attr; ++j) {
40736f0be53SJacob Faibussowitsch         if (attr[CommIdx(i)][j].active) printf("MPIUni warning: MPI communicator %d attribute %d was not freed before MPI_Finalize()\n", i, j);
408f0463fa0SJunchao Zhang       }
40936f0be53SJacob Faibussowitsch     }
41036f0be53SJacob Faibussowitsch 
41136f0be53SJacob Faibussowitsch     for (int i = 1; i < num_attr; ++i) {
41236f0be53SJacob Faibussowitsch       if (attr_keyval[i].active) printf("MPIUni warning: MPI attribute %d was not freed before MPI_Finalize()\n", i);
41336f0be53SJacob Faibussowitsch     }
41436f0be53SJacob Faibussowitsch   }
41536f0be53SJacob Faibussowitsch 
416f0463fa0SJunchao Zhang   /* reset counters */
417f0463fa0SJunchao Zhang   MaxComm             = 2;
418f0463fa0SJunchao Zhang   num_attr            = 1;
41958cd72c3SLisandro Dalcin   MPI_was_finalized   = 1;
4209bcf9d5aSJunchao Zhang   MPI_was_initialized = 0;
4219bcf9d5aSJunchao Zhang   PETSC_COMM_WORLD    = MPI_COMM_NULL;
42299256852SLisandro Dalcin   return MPI_SUCCESS;
42358cd72c3SLisandro Dalcin }
424e5c89e4eSSatish Balay 
425d71ae5a4SJacob Faibussowitsch int MPI_Initialized(int *flag)
426d71ae5a4SJacob Faibussowitsch {
427e5c89e4eSSatish Balay   *flag = MPI_was_initialized;
42899256852SLisandro Dalcin   return MPI_SUCCESS;
429e5c89e4eSSatish Balay }
430e5c89e4eSSatish Balay 
431d71ae5a4SJacob Faibussowitsch int MPI_Finalized(int *flag)
432d71ae5a4SJacob Faibussowitsch {
43358cd72c3SLisandro Dalcin   *flag = MPI_was_finalized;
43499256852SLisandro Dalcin   return MPI_SUCCESS;
435e5c89e4eSSatish Balay }
436e5c89e4eSSatish Balay 
437e5c89e4eSSatish Balay /* -------------------     Fortran versions of several routines ------------------ */
438e5c89e4eSSatish Balay 
439f7c6e6aaSSatish Balay #if defined(PETSC_HAVE_FORTRAN_CAPS)
4400134af2dSBarry Smith   #define mpiunisetmoduleblock_         MPIUNISETMODULEBLOCK
44152ecd5ffSSatish Balay   #define mpiunisetfortranbasepointers_ MPIUNISETFORTRANBASEPOINTERS
442a7b85bbcSSatish Balay   #define petsc_mpi_init_               PETSC_MPI_INIT
443a7b85bbcSSatish Balay   #define petsc_mpi_finalize_           PETSC_MPI_FINALIZE
444a7b85bbcSSatish Balay   #define petsc_mpi_comm_size_          PETSC_MPI_COMM_SIZE
445a7b85bbcSSatish Balay   #define petsc_mpi_comm_rank_          PETSC_MPI_COMM_RANK
446a7b85bbcSSatish Balay   #define petsc_mpi_abort_              PETSC_MPI_ABORT
447a7b85bbcSSatish Balay   #define petsc_mpi_reduce_             PETSC_MPI_REDUCE
448a7b85bbcSSatish Balay   #define petsc_mpi_allreduce_          PETSC_MPI_ALLREDUCE
449a7b85bbcSSatish Balay   #define petsc_mpi_barrier_            PETSC_MPI_BARRIER
450a7b85bbcSSatish Balay   #define petsc_mpi_bcast_              PETSC_MPI_BCAST
451a7b85bbcSSatish Balay   #define petsc_mpi_gather_             PETSC_MPI_GATHER
452a7b85bbcSSatish Balay   #define petsc_mpi_allgather_          PETSC_MPI_ALLGATHER
453a7b85bbcSSatish Balay   #define petsc_mpi_comm_split_         PETSC_MPI_COMM_SPLIT
454a7b85bbcSSatish Balay   #define petsc_mpi_scan_               PETSC_MPI_SCAN
455a7b85bbcSSatish Balay   #define petsc_mpi_send_               PETSC_MPI_SEND
456a7b85bbcSSatish Balay   #define petsc_mpi_recv_               PETSC_MPI_RECV
457a7b85bbcSSatish Balay   #define petsc_mpi_reduce_scatter_     PETSC_MPI_REDUCE_SCATTER
458a7b85bbcSSatish Balay   #define petsc_mpi_irecv_              PETSC_MPI_IRECV
459a7b85bbcSSatish Balay   #define petsc_mpi_isend_              PETSC_MPI_ISEND
460a7b85bbcSSatish Balay   #define petsc_mpi_sendrecv_           PETSC_MPI_SENDRECV
461a7b85bbcSSatish Balay   #define petsc_mpi_test_               PETSC_MPI_TEST
462a7b85bbcSSatish Balay   #define petsc_mpi_waitall_            PETSC_MPI_WAITALL
463a7b85bbcSSatish Balay   #define petsc_mpi_waitany_            PETSC_MPI_WAITANY
464a7b85bbcSSatish Balay   #define petsc_mpi_allgatherv_         PETSC_MPI_ALLGATHERV
465a7b85bbcSSatish Balay   #define petsc_mpi_alltoallv_          PETSC_MPI_ALLTOALLV
466a7b85bbcSSatish Balay   #define petsc_mpi_comm_create_        PETSC_MPI_COMM_CREATE
467a7b85bbcSSatish Balay   #define petsc_mpi_address_            PETSC_MPI_ADDRESS
468a7b85bbcSSatish Balay   #define petsc_mpi_pack_               PETSC_MPI_PACK
469a7b85bbcSSatish Balay   #define petsc_mpi_unpack_             PETSC_MPI_UNPACK
470a7b85bbcSSatish Balay   #define petsc_mpi_pack_size_          PETSC_MPI_PACK_SIZE
471a7b85bbcSSatish Balay   #define petsc_mpi_type_struct_        PETSC_MPI_TYPE_STRUCT
472a7b85bbcSSatish Balay   #define petsc_mpi_type_commit_        PETSC_MPI_TYPE_COMMIT
473a7b85bbcSSatish Balay   #define petsc_mpi_wtime_              PETSC_MPI_WTIME
474a7b85bbcSSatish Balay   #define petsc_mpi_cancel_             PETSC_MPI_CANCEL
475a7b85bbcSSatish Balay   #define petsc_mpi_comm_dup_           PETSC_MPI_COMM_DUP
476a7b85bbcSSatish Balay   #define petsc_mpi_comm_free_          PETSC_MPI_COMM_FREE
477a7b85bbcSSatish Balay   #define petsc_mpi_get_count_          PETSC_MPI_GET_COUNT
478a7b85bbcSSatish Balay   #define petsc_mpi_get_processor_name_ PETSC_MPI_GET_PROCESSOR_NAME
479a7b85bbcSSatish Balay   #define petsc_mpi_initialized_        PETSC_MPI_INITIALIZED
480a7b85bbcSSatish Balay   #define petsc_mpi_iprobe_             PETSC_MPI_IPROBE
481a7b85bbcSSatish Balay   #define petsc_mpi_probe_              PETSC_MPI_PROBE
482a7b85bbcSSatish Balay   #define petsc_mpi_request_free_       PETSC_MPI_REQUEST_FREE
483a7b85bbcSSatish Balay   #define petsc_mpi_ssend_              PETSC_MPI_SSEND
484a7b85bbcSSatish Balay   #define petsc_mpi_wait_               PETSC_MPI_WAIT
485a7b85bbcSSatish Balay   #define petsc_mpi_comm_group_         PETSC_MPI_COMM_GROUP
486a7b85bbcSSatish Balay   #define petsc_mpi_exscan_             PETSC_MPI_EXSCAN
487f7c6e6aaSSatish Balay #elif !defined(PETSC_HAVE_FORTRAN_UNDERSCORE)
4880134af2dSBarry Smith   #define mpiunisetmoduleblock_         mpiunisetmoduleblock
48952ecd5ffSSatish Balay   #define mpiunisetfortranbasepointers_ mpiunisetfortranbasepointers
490a7b85bbcSSatish Balay   #define petsc_mpi_init_               petsc_mpi_init
491a7b85bbcSSatish Balay   #define petsc_mpi_finalize_           petsc_mpi_finalize
492a7b85bbcSSatish Balay   #define petsc_mpi_comm_size_          petsc_mpi_comm_size
493a7b85bbcSSatish Balay   #define petsc_mpi_comm_rank_          petsc_mpi_comm_rank
494a7b85bbcSSatish Balay   #define petsc_mpi_abort_              petsc_mpi_abort
495a7b85bbcSSatish Balay   #define petsc_mpi_reduce_             petsc_mpi_reduce
496a7b85bbcSSatish Balay   #define petsc_mpi_allreduce_          petsc_mpi_allreduce
497a7b85bbcSSatish Balay   #define petsc_mpi_barrier_            petsc_mpi_barrier
498a7b85bbcSSatish Balay   #define petsc_mpi_bcast_              petsc_mpi_bcast
499a7b85bbcSSatish Balay   #define petsc_mpi_gather_             petsc_mpi_gather
500a7b85bbcSSatish Balay   #define petsc_mpi_allgather_          petsc_mpi_allgather
501a7b85bbcSSatish Balay   #define petsc_mpi_comm_split_         petsc_mpi_comm_split
502a7b85bbcSSatish Balay   #define petsc_mpi_scan_               petsc_mpi_scan
503a7b85bbcSSatish Balay   #define petsc_mpi_send_               petsc_mpi_send
504a7b85bbcSSatish Balay   #define petsc_mpi_recv_               petsc_mpi_recv
505a7b85bbcSSatish Balay   #define petsc_mpi_reduce_scatter_     petsc_mpi_reduce_scatter
506a7b85bbcSSatish Balay   #define petsc_mpi_irecv_              petsc_mpi_irecv
507a7b85bbcSSatish Balay   #define petsc_mpi_isend_              petsc_mpi_isend
508a7b85bbcSSatish Balay   #define petsc_mpi_sendrecv_           petsc_mpi_sendrecv
509a7b85bbcSSatish Balay   #define petsc_mpi_test_               petsc_mpi_test
510a7b85bbcSSatish Balay   #define petsc_mpi_waitall_            petsc_mpi_waitall
511a7b85bbcSSatish Balay   #define petsc_mpi_waitany_            petsc_mpi_waitany
512a7b85bbcSSatish Balay   #define petsc_mpi_allgatherv_         petsc_mpi_allgatherv
513a7b85bbcSSatish Balay   #define petsc_mpi_alltoallv_          petsc_mpi_alltoallv
514a7b85bbcSSatish Balay   #define petsc_mpi_comm_create_        petsc_mpi_comm_create
515a7b85bbcSSatish Balay   #define petsc_mpi_address_            petsc_mpi_address
516a7b85bbcSSatish Balay   #define petsc_mpi_pack_               petsc_mpi_pack
517a7b85bbcSSatish Balay   #define petsc_mpi_unpack_             petsc_mpi_unpack
518a7b85bbcSSatish Balay   #define petsc_mpi_pack_size_          petsc_mpi_pack_size
519a7b85bbcSSatish Balay   #define petsc_mpi_type_struct_        petsc_mpi_type_struct
520a7b85bbcSSatish Balay   #define petsc_mpi_type_commit_        petsc_mpi_type_commit
521a7b85bbcSSatish Balay   #define petsc_mpi_wtime_              petsc_mpi_wtime
522a7b85bbcSSatish Balay   #define petsc_mpi_cancel_             petsc_mpi_cancel
523a7b85bbcSSatish Balay   #define petsc_mpi_comm_dup_           petsc_mpi_comm_dup
524a7b85bbcSSatish Balay   #define petsc_mpi_comm_free_          petsc_mpi_comm_free
525a7b85bbcSSatish Balay   #define petsc_mpi_get_count_          petsc_mpi_get_count
526a7b85bbcSSatish Balay   #define petsc_mpi_get_processor_name_ petsc_mpi_get_processor_name
527a7b85bbcSSatish Balay   #define petsc_mpi_initialized_        petsc_mpi_initialized
528a7b85bbcSSatish Balay   #define petsc_mpi_iprobe_             petsc_mpi_iprobe
529a7b85bbcSSatish Balay   #define petsc_mpi_probe_              petsc_mpi_probe
530a7b85bbcSSatish Balay   #define petsc_mpi_request_free_       petsc_mpi_request_free
531a7b85bbcSSatish Balay   #define petsc_mpi_ssend_              petsc_mpi_ssend
532a7b85bbcSSatish Balay   #define petsc_mpi_wait_               petsc_mpi_wait
533a7b85bbcSSatish Balay   #define petsc_mpi_comm_group_         petsc_mpi_comm_group
534a7b85bbcSSatish Balay   #define petsc_mpi_exscan_             petsc_mpi_exscan
535f7c6e6aaSSatish Balay #endif
536e5c89e4eSSatish Balay 
537f7c6e6aaSSatish Balay #if defined(PETSC_HAVE_FORTRAN_UNDERSCORE_UNDERSCORE)
538a7b85bbcSSatish Balay   #define petsc_mpi_init_               petsc_mpi_init__
539a7b85bbcSSatish Balay   #define petsc_mpi_finalize_           petsc_mpi_finalize__
540a7b85bbcSSatish Balay   #define petsc_mpi_comm_size_          petsc_mpi_comm_size__
541a7b85bbcSSatish Balay   #define petsc_mpi_comm_rank_          petsc_mpi_comm_rank__
542a7b85bbcSSatish Balay   #define petsc_mpi_abort_              petsc_mpi_abort__
543a7b85bbcSSatish Balay   #define petsc_mpi_reduce_             petsc_mpi_reduce__
544a7b85bbcSSatish Balay   #define petsc_mpi_allreduce_          petsc_mpi_allreduce__
545a7b85bbcSSatish Balay   #define petsc_mpi_barrier_            petsc_mpi_barrier__
546a7b85bbcSSatish Balay   #define petsc_mpi_bcast_              petsc_mpi_bcast__
547a7b85bbcSSatish Balay   #define petsc_mpi_gather_             petsc_mpi_gather__
548a7b85bbcSSatish Balay   #define petsc_mpi_allgather_          petsc_mpi_allgather__
549a7b85bbcSSatish Balay   #define petsc_mpi_comm_split_         petsc_mpi_comm_split__
550a7b85bbcSSatish Balay   #define petsc_mpi_scan_               petsc_mpi_scan__
551a7b85bbcSSatish Balay   #define petsc_mpi_send_               petsc_mpi_send__
552a7b85bbcSSatish Balay   #define petsc_mpi_recv_               petsc_mpi_recv__
553a7b85bbcSSatish Balay   #define petsc_mpi_reduce_scatter_     petsc_mpi_reduce_scatter__
554a7b85bbcSSatish Balay   #define petsc_mpi_irecv_              petsc_mpi_irecv__
555a7b85bbcSSatish Balay   #define petsc_mpi_isend_              petsc_mpi_isend__
556a7b85bbcSSatish Balay   #define petsc_mpi_sendrecv_           petsc_mpi_sendrecv__
557a7b85bbcSSatish Balay   #define petsc_mpi_test_               petsc_mpi_test__
558a7b85bbcSSatish Balay   #define petsc_mpi_waitall_            petsc_mpi_waitall__
559a7b85bbcSSatish Balay   #define petsc_mpi_waitany_            petsc_mpi_waitany__
560a7b85bbcSSatish Balay   #define petsc_mpi_allgatherv_         petsc_mpi_allgatherv__
561a7b85bbcSSatish Balay   #define petsc_mpi_alltoallv_          petsc_mpi_alltoallv__
562a7b85bbcSSatish Balay   #define petsc_mpi_comm_create_        petsc_mpi_comm_create__
563a7b85bbcSSatish Balay   #define petsc_mpi_address_            petsc_mpi_address__
564a7b85bbcSSatish Balay   #define petsc_mpi_pack_               petsc_mpi_pack__
565a7b85bbcSSatish Balay   #define petsc_mpi_unpack_             petsc_mpi_unpack__
566a7b85bbcSSatish Balay   #define petsc_mpi_pack_size_          petsc_mpi_pack_size__
567a7b85bbcSSatish Balay   #define petsc_mpi_type_struct_        petsc_mpi_type_struct__
568a7b85bbcSSatish Balay   #define petsc_mpi_type_commit_        petsc_mpi_type_commit__
569a7b85bbcSSatish Balay   #define petsc_mpi_wtime_              petsc_mpi_wtime__
570a7b85bbcSSatish Balay   #define petsc_mpi_cancel_             petsc_mpi_cancel__
571a7b85bbcSSatish Balay   #define petsc_mpi_comm_dup_           petsc_mpi_comm_dup__
572a7b85bbcSSatish Balay   #define petsc_mpi_comm_free_          petsc_mpi_comm_free__
573a7b85bbcSSatish Balay   #define petsc_mpi_get_count_          petsc_mpi_get_count__
574a7b85bbcSSatish Balay   #define petsc_mpi_get_processor_name_ petsc_mpi_get_processor_name__
575a7b85bbcSSatish Balay   #define petsc_mpi_initialized_        petsc_mpi_initialized__
576a7b85bbcSSatish Balay   #define petsc_mpi_iprobe_             petsc_mpi_iprobe__
577a7b85bbcSSatish Balay   #define petsc_mpi_probe_              petsc_mpi_probe__
578a7b85bbcSSatish Balay   #define petsc_mpi_request_free_       petsc_mpi_request_free__
579a7b85bbcSSatish Balay   #define petsc_mpi_ssend_              petsc_mpi_ssend__
580a7b85bbcSSatish Balay   #define petsc_mpi_wait_               petsc_mpi_wait__
581a7b85bbcSSatish Balay   #define petsc_mpi_comm_group_         petsc_mpi_comm_group__
582a7b85bbcSSatish Balay   #define petsc_mpi_exscan_             petsc_mpi_exscan__
583f7c6e6aaSSatish Balay #endif
584e5c89e4eSSatish Balay 
585da81f932SPierre Jolivet /* Do not build fortran interface if MPI namespace collision is to be avoided */
586fbf9dbe5SBarry Smith #if defined(PETSC_USE_FORTRAN_BINDINGS)
587c8217ed5SSatish Balay 
58819caf8f3SSatish Balay PETSC_EXTERN void mpiunisetmoduleblock_(void);
58952ecd5ffSSatish Balay 
590d71ae5a4SJacob Faibussowitsch PETSC_EXTERN void mpiunisetfortranbasepointers_(void *f_mpi_in_place)
591d71ae5a4SJacob Faibussowitsch {
59252ecd5ffSSatish Balay   MPIUNIF_mpi_in_place = f_mpi_in_place;
59352ecd5ffSSatish Balay }
59452ecd5ffSSatish Balay 
595d71ae5a4SJacob Faibussowitsch PETSC_EXTERN void petsc_mpi_init_(int *ierr)
596d71ae5a4SJacob Faibussowitsch {
5970134af2dSBarry Smith   mpiunisetmoduleblock_();
598c8217ed5SSatish Balay   *ierr = MPI_Init((int *)0, (char ***)0);
599e5c89e4eSSatish Balay }
600e5c89e4eSSatish Balay 
601d71ae5a4SJacob Faibussowitsch PETSC_EXTERN void petsc_mpi_finalize_(int *ierr)
602d71ae5a4SJacob Faibussowitsch {
603c8217ed5SSatish Balay   *ierr = MPI_Finalize();
604e5c89e4eSSatish Balay }
605e5c89e4eSSatish Balay 
606d71ae5a4SJacob Faibussowitsch PETSC_EXTERN void petsc_mpi_comm_size_(MPI_Comm *comm, int *size, int *ierr)
607d71ae5a4SJacob Faibussowitsch {
608e5c89e4eSSatish Balay   *size = 1;
609e5c89e4eSSatish Balay   *ierr = 0;
610e5c89e4eSSatish Balay }
611e5c89e4eSSatish Balay 
612d71ae5a4SJacob Faibussowitsch PETSC_EXTERN void petsc_mpi_comm_rank_(MPI_Comm *comm, int *rank, int *ierr)
613d71ae5a4SJacob Faibussowitsch {
614e5c89e4eSSatish Balay   *rank = 0;
615e5c89e4eSSatish Balay   *ierr = MPI_SUCCESS;
616e5c89e4eSSatish Balay }
617e5c89e4eSSatish Balay 
618d71ae5a4SJacob Faibussowitsch PETSC_EXTERN void petsc_mpi_comm_split_(MPI_Comm *comm, int *color, int *key, MPI_Comm *newcomm, int *ierr)
619d71ae5a4SJacob Faibussowitsch {
6201f6cc5b2SSatish Balay   *newcomm = *comm;
6211f6cc5b2SSatish Balay   *ierr    = MPI_SUCCESS;
6221f6cc5b2SSatish Balay }
6231f6cc5b2SSatish Balay 
624d71ae5a4SJacob Faibussowitsch PETSC_EXTERN void petsc_mpi_abort_(MPI_Comm *comm, int *errorcode, int *ierr)
625d71ae5a4SJacob Faibussowitsch {
626e5c89e4eSSatish Balay   abort();
627e5c89e4eSSatish Balay   *ierr = MPI_SUCCESS;
628e5c89e4eSSatish Balay }
629e5c89e4eSSatish Balay 
630d71ae5a4SJacob Faibussowitsch PETSC_EXTERN void petsc_mpi_reduce_(void *sendbuf, void *recvbuf, int *count, int *datatype, int *op, int *root, int *comm, int *ierr)
631d71ae5a4SJacob Faibussowitsch {
632f30578ecSBarry Smith   *ierr = MPI_Reduce(sendbuf, recvbuf, *count, *datatype, *op, *root, *comm);
6333b644628SSatish Balay }
6343b644628SSatish Balay 
635d71ae5a4SJacob Faibussowitsch PETSC_EXTERN void petsc_mpi_allreduce_(void *sendbuf, void *recvbuf, int *count, int *datatype, int *op, int *comm, int *ierr)
636d71ae5a4SJacob Faibussowitsch {
637f30578ecSBarry Smith   *ierr = MPI_Allreduce(sendbuf, recvbuf, *count, *datatype, *op, *comm);
638e5c89e4eSSatish Balay }
639e5c89e4eSSatish Balay 
640d71ae5a4SJacob Faibussowitsch PETSC_EXTERN void petsc_mpi_barrier_(MPI_Comm *comm, int *ierr)
641d71ae5a4SJacob Faibussowitsch {
642e5c89e4eSSatish Balay   *ierr = MPI_SUCCESS;
643e5c89e4eSSatish Balay }
644f7c6e6aaSSatish Balay 
645d71ae5a4SJacob Faibussowitsch PETSC_EXTERN void petsc_mpi_bcast_(void *buf, int *count, int *datatype, int *root, int *comm, int *ierr)
646d71ae5a4SJacob Faibussowitsch {
647e5c89e4eSSatish Balay   *ierr = MPI_SUCCESS;
648e5c89e4eSSatish Balay }
649f7c6e6aaSSatish Balay 
650d71ae5a4SJacob 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)
651d71ae5a4SJacob Faibussowitsch {
652f30578ecSBarry Smith   *ierr = MPI_Gather(sendbuf, *scount, *sdatatype, recvbuf, rcount, rdatatype, *root, *comm);
653f7c6e6aaSSatish Balay }
654f7c6e6aaSSatish Balay 
655d71ae5a4SJacob Faibussowitsch PETSC_EXTERN void petsc_mpi_allgather_(void *sendbuf, int *scount, int *sdatatype, void *recvbuf, int *rcount, int *rdatatype, int *comm, int *ierr)
656d71ae5a4SJacob Faibussowitsch {
657f30578ecSBarry Smith   *ierr = MPI_Allgather(sendbuf, *scount, *sdatatype, recvbuf, rcount, rdatatype, *comm);
658e5c89e4eSSatish Balay }
659e5c89e4eSSatish Balay 
660d71ae5a4SJacob Faibussowitsch PETSC_EXTERN void petsc_mpi_scan_(void *sendbuf, void *recvbuf, int *count, int *datatype, int *op, int *comm, int *ierr)
661d71ae5a4SJacob Faibussowitsch {
6621a589b05SJed Brown   *ierr = MPIUNI_Memcpy(recvbuf, sendbuf, (*count) * MPI_sizeof(*datatype));
6633b644628SSatish Balay }
6643b644628SSatish Balay 
665d71ae5a4SJacob Faibussowitsch PETSC_EXTERN void petsc_mpi_send_(void *buf, int *count, int *datatype, int *dest, int *tag, int *comm, int *ierr)
666d71ae5a4SJacob Faibussowitsch {
66706df1fb1SBarry Smith   *ierr = MPIUni_Abort(MPI_COMM_WORLD, 0);
6681086b069SSatish Balay }
6691086b069SSatish Balay 
670d71ae5a4SJacob Faibussowitsch PETSC_EXTERN void petsc_mpi_recv_(void *buf, int *count, int *datatype, int *source, int *tag, int *comm, int status, int *ierr)
671d71ae5a4SJacob Faibussowitsch {
67206df1fb1SBarry Smith   *ierr = MPIUni_Abort(MPI_COMM_WORLD, 0);
6731086b069SSatish Balay }
6741086b069SSatish Balay 
675d71ae5a4SJacob Faibussowitsch PETSC_EXTERN void petsc_mpi_reduce_scatter_(void *sendbuf, void *recvbuf, int *recvcounts, int *datatype, int *op, int *comm, int *ierr)
676d71ae5a4SJacob Faibussowitsch {
67706df1fb1SBarry Smith   *ierr = MPIUni_Abort(MPI_COMM_WORLD, 0);
678156bc490SSatish Balay }
679156bc490SSatish Balay 
680d71ae5a4SJacob Faibussowitsch PETSC_EXTERN void petsc_mpi_irecv_(void *buf, int *count, int *datatype, int *source, int *tag, int *comm, int *request, int *ierr)
681d71ae5a4SJacob Faibussowitsch {
68206df1fb1SBarry Smith   *ierr = MPIUni_Abort(MPI_COMM_WORLD, 0);
683156bc490SSatish Balay }
684156bc490SSatish Balay 
685d71ae5a4SJacob Faibussowitsch PETSC_EXTERN void petsc_mpi_isend_(void *buf, int *count, int *datatype, int *dest, int *tag, int *comm, int *request, int *ierr)
686d71ae5a4SJacob Faibussowitsch {
68706df1fb1SBarry Smith   *ierr = MPIUni_Abort(MPI_COMM_WORLD, 0);
688156bc490SSatish Balay }
689156bc490SSatish Balay 
690d71ae5a4SJacob 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)
691d71ae5a4SJacob Faibussowitsch {
6921a589b05SJed Brown   *ierr = MPIUNI_Memcpy(recvbuf, sendbuf, (*sendcount) * MPI_sizeof(*sendtype));
693156bc490SSatish Balay }
694156bc490SSatish Balay 
695d71ae5a4SJacob Faibussowitsch PETSC_EXTERN void petsc_mpi_test_(int *request, int *flag, int *status, int *ierr)
696d71ae5a4SJacob Faibussowitsch {
69706df1fb1SBarry Smith   *ierr = MPIUni_Abort(MPI_COMM_WORLD, 0);
698156bc490SSatish Balay }
699156bc490SSatish Balay 
700d71ae5a4SJacob Faibussowitsch PETSC_EXTERN void petsc_mpi_waitall_(int *count, int *array_of_requests, int *array_of_statuses, int *ierr)
701d71ae5a4SJacob Faibussowitsch {
702156bc490SSatish Balay   *ierr = MPI_SUCCESS;
703156bc490SSatish Balay }
704156bc490SSatish Balay 
705d71ae5a4SJacob Faibussowitsch PETSC_EXTERN void petsc_mpi_waitany_(int *count, int *array_of_requests, int *index, int *status, int *ierr)
706d71ae5a4SJacob Faibussowitsch {
707156bc490SSatish Balay   *ierr = MPI_SUCCESS;
708156bc490SSatish Balay }
709156bc490SSatish Balay 
710d71ae5a4SJacob 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)
711d71ae5a4SJacob Faibussowitsch {
712f30578ecSBarry Smith   *ierr = MPI_Allgatherv(sendbuf, *sendcount, *sendtype, recvbuf, recvcounts, displs, *recvtype, *comm);
713156bc490SSatish Balay }
714156bc490SSatish Balay 
715d71ae5a4SJacob 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)
716d71ae5a4SJacob Faibussowitsch {
717f30578ecSBarry Smith   *ierr = MPI_Alltoallv(sendbuf, sendcounts, sdispls, *sendtype, recvbuf, recvcounts, rdispls, *recvtype, *comm);
718156bc490SSatish Balay }
719156bc490SSatish Balay 
720d71ae5a4SJacob Faibussowitsch PETSC_EXTERN void petsc_mpi_comm_create_(int *comm, int *group, int *newcomm, int *ierr)
721d71ae5a4SJacob Faibussowitsch {
722156bc490SSatish Balay   *newcomm = *comm;
723156bc490SSatish Balay   *ierr    = MPI_SUCCESS;
724156bc490SSatish Balay }
725156bc490SSatish Balay 
726d71ae5a4SJacob Faibussowitsch PETSC_EXTERN void petsc_mpi_address_(void *location, MPI_Aint *address, int *ierr)
727d71ae5a4SJacob Faibussowitsch {
72899256852SLisandro Dalcin   *address = (MPI_Aint)((char *)location);
729156bc490SSatish Balay   *ierr    = MPI_SUCCESS;
730156bc490SSatish Balay }
731156bc490SSatish Balay 
732d71ae5a4SJacob Faibussowitsch PETSC_EXTERN void petsc_mpi_pack_(void *inbuf, int *incount, int *datatype, void *outbuf, int *outsize, int *position, int *comm, int *ierr)
733d71ae5a4SJacob Faibussowitsch {
73406df1fb1SBarry Smith   *ierr = MPIUni_Abort(MPI_COMM_WORLD, 0);
735156bc490SSatish Balay }
736156bc490SSatish Balay 
737d71ae5a4SJacob Faibussowitsch PETSC_EXTERN void petsc_mpi_unpack_(void *inbuf, int *insize, int *position, void *outbuf, int *outcount, int *datatype, int *comm, int *ierr)
738d71ae5a4SJacob Faibussowitsch {
73906df1fb1SBarry Smith   *ierr = MPIUni_Abort(MPI_COMM_WORLD, 0);
740156bc490SSatish Balay }
741156bc490SSatish Balay 
742d71ae5a4SJacob Faibussowitsch PETSC_EXTERN void petsc_mpi_pack_size_(int *incount, int *datatype, int *comm, int *size, int *ierr)
743d71ae5a4SJacob Faibussowitsch {
74406df1fb1SBarry Smith   *ierr = MPIUni_Abort(MPI_COMM_WORLD, 0);
745156bc490SSatish Balay }
746156bc490SSatish Balay 
747d71ae5a4SJacob 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)
748d71ae5a4SJacob Faibussowitsch {
74906df1fb1SBarry Smith   *ierr = MPIUni_Abort(MPI_COMM_WORLD, 0);
750156bc490SSatish Balay }
751156bc490SSatish Balay 
752d71ae5a4SJacob Faibussowitsch PETSC_EXTERN void petsc_mpi_type_commit_(int *datatype, int *ierr)
753d71ae5a4SJacob Faibussowitsch {
754156bc490SSatish Balay   *ierr = MPI_SUCCESS;
755156bc490SSatish Balay }
756156bc490SSatish Balay 
757d71ae5a4SJacob Faibussowitsch double petsc_mpi_wtime_(void)
758d71ae5a4SJacob Faibussowitsch {
759156bc490SSatish Balay   return 0.0;
760f8f52c7dSSatish Balay }
761156bc490SSatish Balay 
762d71ae5a4SJacob Faibussowitsch PETSC_EXTERN void petsc_mpi_cancel_(int *request, int *ierr)
763d71ae5a4SJacob Faibussowitsch {
764f8f52c7dSSatish Balay   *ierr = MPI_SUCCESS;
765f8f52c7dSSatish Balay }
766f8f52c7dSSatish Balay 
767d71ae5a4SJacob Faibussowitsch PETSC_EXTERN void petsc_mpi_comm_dup_(int *comm, int *out, int *ierr)
768d71ae5a4SJacob Faibussowitsch {
769f8f52c7dSSatish Balay   *out  = *comm;
770f8f52c7dSSatish Balay   *ierr = MPI_SUCCESS;
771f8f52c7dSSatish Balay }
772f8f52c7dSSatish Balay 
773d71ae5a4SJacob Faibussowitsch PETSC_EXTERN void petsc_mpi_comm_free_(int *comm, int *ierr)
774d71ae5a4SJacob Faibussowitsch {
775f8f52c7dSSatish Balay   *ierr = MPI_SUCCESS;
776f8f52c7dSSatish Balay }
777f8f52c7dSSatish Balay 
778d71ae5a4SJacob Faibussowitsch PETSC_EXTERN void petsc_mpi_get_count_(int *status, int *datatype, int *count, int *ierr)
779d71ae5a4SJacob Faibussowitsch {
78006df1fb1SBarry Smith   *ierr = MPIUni_Abort(MPI_COMM_WORLD, 0);
781f8f52c7dSSatish Balay }
782f8f52c7dSSatish Balay 
783d71ae5a4SJacob Faibussowitsch PETSC_EXTERN void petsc_mpi_get_processor_name_(char *name, int *result_len, int *ierr, PETSC_FORTRAN_CHARLEN_T len)
784d71ae5a4SJacob Faibussowitsch {
785f8f52c7dSSatish Balay   MPIUNI_Memcpy(name, "localhost", 9 * sizeof(char));
786f8f52c7dSSatish Balay   *result_len = 9;
787f8f52c7dSSatish Balay   *ierr       = MPI_SUCCESS;
788f8f52c7dSSatish Balay }
789f8f52c7dSSatish Balay 
790d71ae5a4SJacob Faibussowitsch PETSC_EXTERN void petsc_mpi_initialized_(int *flag, int *ierr)
791d71ae5a4SJacob Faibussowitsch {
792f8f52c7dSSatish Balay   *flag = MPI_was_initialized;
793f8f52c7dSSatish Balay   *ierr = MPI_SUCCESS;
794f8f52c7dSSatish Balay }
795f8f52c7dSSatish Balay 
796d71ae5a4SJacob Faibussowitsch PETSC_EXTERN void petsc_mpi_iprobe_(int *source, int *tag, int *comm, int *glag, int *status, int *ierr)
797d71ae5a4SJacob Faibussowitsch {
798f8f52c7dSSatish Balay   *ierr = MPI_SUCCESS;
799f8f52c7dSSatish Balay }
800f8f52c7dSSatish Balay 
801d71ae5a4SJacob Faibussowitsch PETSC_EXTERN void petsc_mpi_probe_(int *source, int *tag, int *comm, int *flag, int *status, int *ierr)
802d71ae5a4SJacob Faibussowitsch {
803f8f52c7dSSatish Balay   *ierr = MPI_SUCCESS;
804f8f52c7dSSatish Balay }
805f8f52c7dSSatish Balay 
806d71ae5a4SJacob Faibussowitsch PETSC_EXTERN void petsc_mpi_request_free_(int *request, int *ierr)
807d71ae5a4SJacob Faibussowitsch {
808f8f52c7dSSatish Balay   *ierr = MPI_SUCCESS;
809f8f52c7dSSatish Balay }
810f8f52c7dSSatish Balay 
811d71ae5a4SJacob Faibussowitsch PETSC_EXTERN void petsc_mpi_ssend_(void *buf, int *count, int *datatype, int *dest, int *tag, int *comm, int *ierr)
812d71ae5a4SJacob Faibussowitsch {
81306df1fb1SBarry Smith   *ierr = MPIUni_Abort(MPI_COMM_WORLD, 0);
814f8f52c7dSSatish Balay }
815f8f52c7dSSatish Balay 
816d71ae5a4SJacob Faibussowitsch PETSC_EXTERN void petsc_mpi_wait_(int *request, int *status, int *ierr)
817d71ae5a4SJacob Faibussowitsch {
818f8f52c7dSSatish Balay   *ierr = MPI_SUCCESS;
819156bc490SSatish Balay }
820156bc490SSatish Balay 
821d71ae5a4SJacob Faibussowitsch PETSC_EXTERN void petsc_mpi_comm_group_(int *comm, int *group, int *ierr)
822d71ae5a4SJacob Faibussowitsch {
823d4816372SSatish Balay   *ierr = MPI_SUCCESS;
824d4816372SSatish Balay }
825d4816372SSatish Balay 
826d71ae5a4SJacob Faibussowitsch PETSC_EXTERN void petsc_mpi_exscan_(void *sendbuf, void *recvbuf, int *count, int *datatype, int *op, int *comm, int *ierr)
827d71ae5a4SJacob Faibussowitsch {
828d4816372SSatish Balay   *ierr = MPI_SUCCESS;
829d4816372SSatish Balay }
830d4816372SSatish Balay 
831fbf9dbe5SBarry Smith #endif /* PETSC_USE_FORTRAN_BINDINGS */
832c8217ed5SSatish Balay 
833e5c89e4eSSatish Balay #if defined(__cplusplus)
834e5c89e4eSSatish Balay }
835e5c89e4eSSatish Balay #endif
836