xref: /petsc/src/sys/mpiuni/mpi.c (revision 3649609aa339dc518577d1c6cd903e3f7e9dedf4)
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 */
57*3649609aSBarry 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   {
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) {
248f4f49eeaSPierre 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 
437317ae730SBarry Smith int MPI_Win_free(MPI_Win *win)
438317ae730SBarry Smith {
439317ae730SBarry Smith   free(*win);
440317ae730SBarry Smith   *win = NULL;
441317ae730SBarry Smith   return MPI_SUCCESS;
442317ae730SBarry Smith }
443317ae730SBarry Smith 
444317ae730SBarry Smith int MPI_Win_allocate_shared(size_t sz, size_t asz, MPI_Info info, MPI_Comm comm, void **addr, MPI_Win *win)
445317ae730SBarry Smith {
446317ae730SBarry Smith   *win = *addr = malloc(sz);
447317ae730SBarry Smith   return MPI_SUCCESS;
448317ae730SBarry Smith }
449317ae730SBarry Smith 
450e5c89e4eSSatish Balay /* -------------------     Fortran versions of several routines ------------------ */
451e5c89e4eSSatish Balay 
452f7c6e6aaSSatish Balay #if defined(PETSC_HAVE_FORTRAN_CAPS)
4530134af2dSBarry Smith   #define mpiunisetmoduleblock_         MPIUNISETMODULEBLOCK
45452ecd5ffSSatish Balay   #define mpiunisetfortranbasepointers_ MPIUNISETFORTRANBASEPOINTERS
455a7b85bbcSSatish Balay   #define petsc_mpi_init_               PETSC_MPI_INIT
456a7b85bbcSSatish Balay   #define petsc_mpi_finalize_           PETSC_MPI_FINALIZE
457a7b85bbcSSatish Balay   #define petsc_mpi_comm_size_          PETSC_MPI_COMM_SIZE
458a7b85bbcSSatish Balay   #define petsc_mpi_comm_rank_          PETSC_MPI_COMM_RANK
459a7b85bbcSSatish Balay   #define petsc_mpi_abort_              PETSC_MPI_ABORT
460a7b85bbcSSatish Balay   #define petsc_mpi_reduce_             PETSC_MPI_REDUCE
461a7b85bbcSSatish Balay   #define petsc_mpi_allreduce_          PETSC_MPI_ALLREDUCE
462a7b85bbcSSatish Balay   #define petsc_mpi_barrier_            PETSC_MPI_BARRIER
463a7b85bbcSSatish Balay   #define petsc_mpi_bcast_              PETSC_MPI_BCAST
464a7b85bbcSSatish Balay   #define petsc_mpi_gather_             PETSC_MPI_GATHER
465a7b85bbcSSatish Balay   #define petsc_mpi_allgather_          PETSC_MPI_ALLGATHER
466a7b85bbcSSatish Balay   #define petsc_mpi_comm_split_         PETSC_MPI_COMM_SPLIT
467a7b85bbcSSatish Balay   #define petsc_mpi_scan_               PETSC_MPI_SCAN
468a7b85bbcSSatish Balay   #define petsc_mpi_send_               PETSC_MPI_SEND
469a7b85bbcSSatish Balay   #define petsc_mpi_recv_               PETSC_MPI_RECV
470a7b85bbcSSatish Balay   #define petsc_mpi_reduce_scatter_     PETSC_MPI_REDUCE_SCATTER
471a7b85bbcSSatish Balay   #define petsc_mpi_irecv_              PETSC_MPI_IRECV
472a7b85bbcSSatish Balay   #define petsc_mpi_isend_              PETSC_MPI_ISEND
473a7b85bbcSSatish Balay   #define petsc_mpi_sendrecv_           PETSC_MPI_SENDRECV
474a7b85bbcSSatish Balay   #define petsc_mpi_test_               PETSC_MPI_TEST
475a7b85bbcSSatish Balay   #define petsc_mpi_waitall_            PETSC_MPI_WAITALL
476a7b85bbcSSatish Balay   #define petsc_mpi_waitany_            PETSC_MPI_WAITANY
477a7b85bbcSSatish Balay   #define petsc_mpi_allgatherv_         PETSC_MPI_ALLGATHERV
478a7b85bbcSSatish Balay   #define petsc_mpi_alltoallv_          PETSC_MPI_ALLTOALLV
479a7b85bbcSSatish Balay   #define petsc_mpi_comm_create_        PETSC_MPI_COMM_CREATE
480a7b85bbcSSatish Balay   #define petsc_mpi_address_            PETSC_MPI_ADDRESS
481a7b85bbcSSatish Balay   #define petsc_mpi_pack_               PETSC_MPI_PACK
482a7b85bbcSSatish Balay   #define petsc_mpi_unpack_             PETSC_MPI_UNPACK
483a7b85bbcSSatish Balay   #define petsc_mpi_pack_size_          PETSC_MPI_PACK_SIZE
484a7b85bbcSSatish Balay   #define petsc_mpi_type_struct_        PETSC_MPI_TYPE_STRUCT
485a7b85bbcSSatish Balay   #define petsc_mpi_type_commit_        PETSC_MPI_TYPE_COMMIT
486a7b85bbcSSatish Balay   #define petsc_mpi_wtime_              PETSC_MPI_WTIME
487a7b85bbcSSatish Balay   #define petsc_mpi_cancel_             PETSC_MPI_CANCEL
488a7b85bbcSSatish Balay   #define petsc_mpi_comm_dup_           PETSC_MPI_COMM_DUP
489a7b85bbcSSatish Balay   #define petsc_mpi_comm_free_          PETSC_MPI_COMM_FREE
490a7b85bbcSSatish Balay   #define petsc_mpi_get_count_          PETSC_MPI_GET_COUNT
491a7b85bbcSSatish Balay   #define petsc_mpi_get_processor_name_ PETSC_MPI_GET_PROCESSOR_NAME
492a7b85bbcSSatish Balay   #define petsc_mpi_initialized_        PETSC_MPI_INITIALIZED
493a7b85bbcSSatish Balay   #define petsc_mpi_iprobe_             PETSC_MPI_IPROBE
494a7b85bbcSSatish Balay   #define petsc_mpi_probe_              PETSC_MPI_PROBE
495a7b85bbcSSatish Balay   #define petsc_mpi_request_free_       PETSC_MPI_REQUEST_FREE
496a7b85bbcSSatish Balay   #define petsc_mpi_ssend_              PETSC_MPI_SSEND
497a7b85bbcSSatish Balay   #define petsc_mpi_wait_               PETSC_MPI_WAIT
498a7b85bbcSSatish Balay   #define petsc_mpi_comm_group_         PETSC_MPI_COMM_GROUP
499a7b85bbcSSatish Balay   #define petsc_mpi_exscan_             PETSC_MPI_EXSCAN
500f7c6e6aaSSatish Balay #elif !defined(PETSC_HAVE_FORTRAN_UNDERSCORE)
5010134af2dSBarry Smith   #define mpiunisetmoduleblock_         mpiunisetmoduleblock
50252ecd5ffSSatish Balay   #define mpiunisetfortranbasepointers_ mpiunisetfortranbasepointers
503a7b85bbcSSatish Balay   #define petsc_mpi_init_               petsc_mpi_init
504a7b85bbcSSatish Balay   #define petsc_mpi_finalize_           petsc_mpi_finalize
505a7b85bbcSSatish Balay   #define petsc_mpi_comm_size_          petsc_mpi_comm_size
506a7b85bbcSSatish Balay   #define petsc_mpi_comm_rank_          petsc_mpi_comm_rank
507a7b85bbcSSatish Balay   #define petsc_mpi_abort_              petsc_mpi_abort
508a7b85bbcSSatish Balay   #define petsc_mpi_reduce_             petsc_mpi_reduce
509a7b85bbcSSatish Balay   #define petsc_mpi_allreduce_          petsc_mpi_allreduce
510a7b85bbcSSatish Balay   #define petsc_mpi_barrier_            petsc_mpi_barrier
511a7b85bbcSSatish Balay   #define petsc_mpi_bcast_              petsc_mpi_bcast
512a7b85bbcSSatish Balay   #define petsc_mpi_gather_             petsc_mpi_gather
513a7b85bbcSSatish Balay   #define petsc_mpi_allgather_          petsc_mpi_allgather
514a7b85bbcSSatish Balay   #define petsc_mpi_comm_split_         petsc_mpi_comm_split
515a7b85bbcSSatish Balay   #define petsc_mpi_scan_               petsc_mpi_scan
516a7b85bbcSSatish Balay   #define petsc_mpi_send_               petsc_mpi_send
517a7b85bbcSSatish Balay   #define petsc_mpi_recv_               petsc_mpi_recv
518a7b85bbcSSatish Balay   #define petsc_mpi_reduce_scatter_     petsc_mpi_reduce_scatter
519a7b85bbcSSatish Balay   #define petsc_mpi_irecv_              petsc_mpi_irecv
520a7b85bbcSSatish Balay   #define petsc_mpi_isend_              petsc_mpi_isend
521a7b85bbcSSatish Balay   #define petsc_mpi_sendrecv_           petsc_mpi_sendrecv
522a7b85bbcSSatish Balay   #define petsc_mpi_test_               petsc_mpi_test
523a7b85bbcSSatish Balay   #define petsc_mpi_waitall_            petsc_mpi_waitall
524a7b85bbcSSatish Balay   #define petsc_mpi_waitany_            petsc_mpi_waitany
525a7b85bbcSSatish Balay   #define petsc_mpi_allgatherv_         petsc_mpi_allgatherv
526a7b85bbcSSatish Balay   #define petsc_mpi_alltoallv_          petsc_mpi_alltoallv
527a7b85bbcSSatish Balay   #define petsc_mpi_comm_create_        petsc_mpi_comm_create
528a7b85bbcSSatish Balay   #define petsc_mpi_address_            petsc_mpi_address
529a7b85bbcSSatish Balay   #define petsc_mpi_pack_               petsc_mpi_pack
530a7b85bbcSSatish Balay   #define petsc_mpi_unpack_             petsc_mpi_unpack
531a7b85bbcSSatish Balay   #define petsc_mpi_pack_size_          petsc_mpi_pack_size
532a7b85bbcSSatish Balay   #define petsc_mpi_type_struct_        petsc_mpi_type_struct
533a7b85bbcSSatish Balay   #define petsc_mpi_type_commit_        petsc_mpi_type_commit
534a7b85bbcSSatish Balay   #define petsc_mpi_wtime_              petsc_mpi_wtime
535a7b85bbcSSatish Balay   #define petsc_mpi_cancel_             petsc_mpi_cancel
536a7b85bbcSSatish Balay   #define petsc_mpi_comm_dup_           petsc_mpi_comm_dup
537a7b85bbcSSatish Balay   #define petsc_mpi_comm_free_          petsc_mpi_comm_free
538a7b85bbcSSatish Balay   #define petsc_mpi_get_count_          petsc_mpi_get_count
539a7b85bbcSSatish Balay   #define petsc_mpi_get_processor_name_ petsc_mpi_get_processor_name
540a7b85bbcSSatish Balay   #define petsc_mpi_initialized_        petsc_mpi_initialized
541a7b85bbcSSatish Balay   #define petsc_mpi_iprobe_             petsc_mpi_iprobe
542a7b85bbcSSatish Balay   #define petsc_mpi_probe_              petsc_mpi_probe
543a7b85bbcSSatish Balay   #define petsc_mpi_request_free_       petsc_mpi_request_free
544a7b85bbcSSatish Balay   #define petsc_mpi_ssend_              petsc_mpi_ssend
545a7b85bbcSSatish Balay   #define petsc_mpi_wait_               petsc_mpi_wait
546a7b85bbcSSatish Balay   #define petsc_mpi_comm_group_         petsc_mpi_comm_group
547a7b85bbcSSatish Balay   #define petsc_mpi_exscan_             petsc_mpi_exscan
548f7c6e6aaSSatish Balay #endif
549e5c89e4eSSatish Balay 
550f7c6e6aaSSatish Balay #if defined(PETSC_HAVE_FORTRAN_UNDERSCORE_UNDERSCORE)
551a7b85bbcSSatish Balay   #define petsc_mpi_init_               petsc_mpi_init__
552a7b85bbcSSatish Balay   #define petsc_mpi_finalize_           petsc_mpi_finalize__
553a7b85bbcSSatish Balay   #define petsc_mpi_comm_size_          petsc_mpi_comm_size__
554a7b85bbcSSatish Balay   #define petsc_mpi_comm_rank_          petsc_mpi_comm_rank__
555a7b85bbcSSatish Balay   #define petsc_mpi_abort_              petsc_mpi_abort__
556a7b85bbcSSatish Balay   #define petsc_mpi_reduce_             petsc_mpi_reduce__
557a7b85bbcSSatish Balay   #define petsc_mpi_allreduce_          petsc_mpi_allreduce__
558a7b85bbcSSatish Balay   #define petsc_mpi_barrier_            petsc_mpi_barrier__
559a7b85bbcSSatish Balay   #define petsc_mpi_bcast_              petsc_mpi_bcast__
560a7b85bbcSSatish Balay   #define petsc_mpi_gather_             petsc_mpi_gather__
561a7b85bbcSSatish Balay   #define petsc_mpi_allgather_          petsc_mpi_allgather__
562a7b85bbcSSatish Balay   #define petsc_mpi_comm_split_         petsc_mpi_comm_split__
563a7b85bbcSSatish Balay   #define petsc_mpi_scan_               petsc_mpi_scan__
564a7b85bbcSSatish Balay   #define petsc_mpi_send_               petsc_mpi_send__
565a7b85bbcSSatish Balay   #define petsc_mpi_recv_               petsc_mpi_recv__
566a7b85bbcSSatish Balay   #define petsc_mpi_reduce_scatter_     petsc_mpi_reduce_scatter__
567a7b85bbcSSatish Balay   #define petsc_mpi_irecv_              petsc_mpi_irecv__
568a7b85bbcSSatish Balay   #define petsc_mpi_isend_              petsc_mpi_isend__
569a7b85bbcSSatish Balay   #define petsc_mpi_sendrecv_           petsc_mpi_sendrecv__
570a7b85bbcSSatish Balay   #define petsc_mpi_test_               petsc_mpi_test__
571a7b85bbcSSatish Balay   #define petsc_mpi_waitall_            petsc_mpi_waitall__
572a7b85bbcSSatish Balay   #define petsc_mpi_waitany_            petsc_mpi_waitany__
573a7b85bbcSSatish Balay   #define petsc_mpi_allgatherv_         petsc_mpi_allgatherv__
574a7b85bbcSSatish Balay   #define petsc_mpi_alltoallv_          petsc_mpi_alltoallv__
575a7b85bbcSSatish Balay   #define petsc_mpi_comm_create_        petsc_mpi_comm_create__
576a7b85bbcSSatish Balay   #define petsc_mpi_address_            petsc_mpi_address__
577a7b85bbcSSatish Balay   #define petsc_mpi_pack_               petsc_mpi_pack__
578a7b85bbcSSatish Balay   #define petsc_mpi_unpack_             petsc_mpi_unpack__
579a7b85bbcSSatish Balay   #define petsc_mpi_pack_size_          petsc_mpi_pack_size__
580a7b85bbcSSatish Balay   #define petsc_mpi_type_struct_        petsc_mpi_type_struct__
581a7b85bbcSSatish Balay   #define petsc_mpi_type_commit_        petsc_mpi_type_commit__
582a7b85bbcSSatish Balay   #define petsc_mpi_wtime_              petsc_mpi_wtime__
583a7b85bbcSSatish Balay   #define petsc_mpi_cancel_             petsc_mpi_cancel__
584a7b85bbcSSatish Balay   #define petsc_mpi_comm_dup_           petsc_mpi_comm_dup__
585a7b85bbcSSatish Balay   #define petsc_mpi_comm_free_          petsc_mpi_comm_free__
586a7b85bbcSSatish Balay   #define petsc_mpi_get_count_          petsc_mpi_get_count__
587a7b85bbcSSatish Balay   #define petsc_mpi_get_processor_name_ petsc_mpi_get_processor_name__
588a7b85bbcSSatish Balay   #define petsc_mpi_initialized_        petsc_mpi_initialized__
589a7b85bbcSSatish Balay   #define petsc_mpi_iprobe_             petsc_mpi_iprobe__
590a7b85bbcSSatish Balay   #define petsc_mpi_probe_              petsc_mpi_probe__
591a7b85bbcSSatish Balay   #define petsc_mpi_request_free_       petsc_mpi_request_free__
592a7b85bbcSSatish Balay   #define petsc_mpi_ssend_              petsc_mpi_ssend__
593a7b85bbcSSatish Balay   #define petsc_mpi_wait_               petsc_mpi_wait__
594a7b85bbcSSatish Balay   #define petsc_mpi_comm_group_         petsc_mpi_comm_group__
595a7b85bbcSSatish Balay   #define petsc_mpi_exscan_             petsc_mpi_exscan__
596f7c6e6aaSSatish Balay #endif
597e5c89e4eSSatish Balay 
598da81f932SPierre Jolivet /* Do not build fortran interface if MPI namespace collision is to be avoided */
599fbf9dbe5SBarry Smith #if defined(PETSC_USE_FORTRAN_BINDINGS)
600c8217ed5SSatish Balay 
60119caf8f3SSatish Balay PETSC_EXTERN void mpiunisetmoduleblock_(void);
60252ecd5ffSSatish Balay 
603d71ae5a4SJacob Faibussowitsch PETSC_EXTERN void mpiunisetfortranbasepointers_(void *f_mpi_in_place)
604d71ae5a4SJacob Faibussowitsch {
60552ecd5ffSSatish Balay   MPIUNIF_mpi_in_place = f_mpi_in_place;
60652ecd5ffSSatish Balay }
60752ecd5ffSSatish Balay 
608d71ae5a4SJacob Faibussowitsch PETSC_EXTERN void petsc_mpi_init_(int *ierr)
609d71ae5a4SJacob Faibussowitsch {
6100134af2dSBarry Smith   mpiunisetmoduleblock_();
611c8217ed5SSatish Balay   *ierr = MPI_Init((int *)0, (char ***)0);
612e5c89e4eSSatish Balay }
613e5c89e4eSSatish Balay 
614d71ae5a4SJacob Faibussowitsch PETSC_EXTERN void petsc_mpi_finalize_(int *ierr)
615d71ae5a4SJacob Faibussowitsch {
616c8217ed5SSatish Balay   *ierr = MPI_Finalize();
617e5c89e4eSSatish Balay }
618e5c89e4eSSatish Balay 
619d71ae5a4SJacob Faibussowitsch PETSC_EXTERN void petsc_mpi_comm_size_(MPI_Comm *comm, int *size, int *ierr)
620d71ae5a4SJacob Faibussowitsch {
621e5c89e4eSSatish Balay   *size = 1;
622e5c89e4eSSatish Balay   *ierr = 0;
623e5c89e4eSSatish Balay }
624e5c89e4eSSatish Balay 
625d71ae5a4SJacob Faibussowitsch PETSC_EXTERN void petsc_mpi_comm_rank_(MPI_Comm *comm, int *rank, int *ierr)
626d71ae5a4SJacob Faibussowitsch {
627e5c89e4eSSatish Balay   *rank = 0;
628e5c89e4eSSatish Balay   *ierr = MPI_SUCCESS;
629e5c89e4eSSatish Balay }
630e5c89e4eSSatish Balay 
631d71ae5a4SJacob Faibussowitsch PETSC_EXTERN void petsc_mpi_comm_split_(MPI_Comm *comm, int *color, int *key, MPI_Comm *newcomm, int *ierr)
632d71ae5a4SJacob Faibussowitsch {
6331f6cc5b2SSatish Balay   *newcomm = *comm;
6341f6cc5b2SSatish Balay   *ierr    = MPI_SUCCESS;
6351f6cc5b2SSatish Balay }
6361f6cc5b2SSatish Balay 
637d71ae5a4SJacob Faibussowitsch PETSC_EXTERN void petsc_mpi_abort_(MPI_Comm *comm, int *errorcode, int *ierr)
638d71ae5a4SJacob Faibussowitsch {
639e5c89e4eSSatish Balay   abort();
640e5c89e4eSSatish Balay   *ierr = MPI_SUCCESS;
641e5c89e4eSSatish Balay }
642e5c89e4eSSatish Balay 
643d71ae5a4SJacob Faibussowitsch PETSC_EXTERN void petsc_mpi_reduce_(void *sendbuf, void *recvbuf, int *count, int *datatype, int *op, int *root, int *comm, int *ierr)
644d71ae5a4SJacob Faibussowitsch {
645f30578ecSBarry Smith   *ierr = MPI_Reduce(sendbuf, recvbuf, *count, *datatype, *op, *root, *comm);
6463b644628SSatish Balay }
6473b644628SSatish Balay 
648d71ae5a4SJacob Faibussowitsch PETSC_EXTERN void petsc_mpi_allreduce_(void *sendbuf, void *recvbuf, int *count, int *datatype, int *op, int *comm, int *ierr)
649d71ae5a4SJacob Faibussowitsch {
650f30578ecSBarry Smith   *ierr = MPI_Allreduce(sendbuf, recvbuf, *count, *datatype, *op, *comm);
651e5c89e4eSSatish Balay }
652e5c89e4eSSatish Balay 
653d71ae5a4SJacob Faibussowitsch PETSC_EXTERN void petsc_mpi_barrier_(MPI_Comm *comm, int *ierr)
654d71ae5a4SJacob Faibussowitsch {
655e5c89e4eSSatish Balay   *ierr = MPI_SUCCESS;
656e5c89e4eSSatish Balay }
657f7c6e6aaSSatish Balay 
658d71ae5a4SJacob Faibussowitsch PETSC_EXTERN void petsc_mpi_bcast_(void *buf, int *count, int *datatype, int *root, int *comm, int *ierr)
659d71ae5a4SJacob Faibussowitsch {
660e5c89e4eSSatish Balay   *ierr = MPI_SUCCESS;
661e5c89e4eSSatish Balay }
662f7c6e6aaSSatish Balay 
663d71ae5a4SJacob 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)
664d71ae5a4SJacob Faibussowitsch {
665f30578ecSBarry Smith   *ierr = MPI_Gather(sendbuf, *scount, *sdatatype, recvbuf, rcount, rdatatype, *root, *comm);
666f7c6e6aaSSatish Balay }
667f7c6e6aaSSatish Balay 
668d71ae5a4SJacob Faibussowitsch PETSC_EXTERN void petsc_mpi_allgather_(void *sendbuf, int *scount, int *sdatatype, void *recvbuf, int *rcount, int *rdatatype, int *comm, int *ierr)
669d71ae5a4SJacob Faibussowitsch {
670f30578ecSBarry Smith   *ierr = MPI_Allgather(sendbuf, *scount, *sdatatype, recvbuf, rcount, rdatatype, *comm);
671e5c89e4eSSatish Balay }
672e5c89e4eSSatish Balay 
673d71ae5a4SJacob Faibussowitsch PETSC_EXTERN void petsc_mpi_scan_(void *sendbuf, void *recvbuf, int *count, int *datatype, int *op, int *comm, int *ierr)
674d71ae5a4SJacob Faibussowitsch {
6751a589b05SJed Brown   *ierr = MPIUNI_Memcpy(recvbuf, sendbuf, (*count) * MPI_sizeof(*datatype));
6763b644628SSatish Balay }
6773b644628SSatish Balay 
678d71ae5a4SJacob Faibussowitsch PETSC_EXTERN void petsc_mpi_send_(void *buf, int *count, int *datatype, int *dest, int *tag, int *comm, int *ierr)
679d71ae5a4SJacob Faibussowitsch {
68006df1fb1SBarry Smith   *ierr = MPIUni_Abort(MPI_COMM_WORLD, 0);
6811086b069SSatish Balay }
6821086b069SSatish Balay 
683d71ae5a4SJacob Faibussowitsch PETSC_EXTERN void petsc_mpi_recv_(void *buf, int *count, int *datatype, int *source, int *tag, int *comm, int status, int *ierr)
684d71ae5a4SJacob Faibussowitsch {
68506df1fb1SBarry Smith   *ierr = MPIUni_Abort(MPI_COMM_WORLD, 0);
6861086b069SSatish Balay }
6871086b069SSatish Balay 
688d71ae5a4SJacob Faibussowitsch PETSC_EXTERN void petsc_mpi_reduce_scatter_(void *sendbuf, void *recvbuf, int *recvcounts, int *datatype, int *op, int *comm, int *ierr)
689d71ae5a4SJacob Faibussowitsch {
69006df1fb1SBarry Smith   *ierr = MPIUni_Abort(MPI_COMM_WORLD, 0);
691156bc490SSatish Balay }
692156bc490SSatish Balay 
693d71ae5a4SJacob Faibussowitsch PETSC_EXTERN void petsc_mpi_irecv_(void *buf, int *count, int *datatype, int *source, int *tag, int *comm, int *request, int *ierr)
694d71ae5a4SJacob Faibussowitsch {
69506df1fb1SBarry Smith   *ierr = MPIUni_Abort(MPI_COMM_WORLD, 0);
696156bc490SSatish Balay }
697156bc490SSatish Balay 
698d71ae5a4SJacob Faibussowitsch PETSC_EXTERN void petsc_mpi_isend_(void *buf, int *count, int *datatype, int *dest, int *tag, int *comm, int *request, int *ierr)
699d71ae5a4SJacob Faibussowitsch {
70006df1fb1SBarry Smith   *ierr = MPIUni_Abort(MPI_COMM_WORLD, 0);
701156bc490SSatish Balay }
702156bc490SSatish Balay 
703d71ae5a4SJacob 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)
704d71ae5a4SJacob Faibussowitsch {
7051a589b05SJed Brown   *ierr = MPIUNI_Memcpy(recvbuf, sendbuf, (*sendcount) * MPI_sizeof(*sendtype));
706156bc490SSatish Balay }
707156bc490SSatish Balay 
708d71ae5a4SJacob Faibussowitsch PETSC_EXTERN void petsc_mpi_test_(int *request, int *flag, int *status, int *ierr)
709d71ae5a4SJacob Faibussowitsch {
71006df1fb1SBarry Smith   *ierr = MPIUni_Abort(MPI_COMM_WORLD, 0);
711156bc490SSatish Balay }
712156bc490SSatish Balay 
713d71ae5a4SJacob Faibussowitsch PETSC_EXTERN void petsc_mpi_waitall_(int *count, int *array_of_requests, int *array_of_statuses, int *ierr)
714d71ae5a4SJacob Faibussowitsch {
715156bc490SSatish Balay   *ierr = MPI_SUCCESS;
716156bc490SSatish Balay }
717156bc490SSatish Balay 
718d71ae5a4SJacob Faibussowitsch PETSC_EXTERN void petsc_mpi_waitany_(int *count, int *array_of_requests, int *index, int *status, int *ierr)
719d71ae5a4SJacob Faibussowitsch {
720156bc490SSatish Balay   *ierr = MPI_SUCCESS;
721156bc490SSatish Balay }
722156bc490SSatish Balay 
723d71ae5a4SJacob 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)
724d71ae5a4SJacob Faibussowitsch {
725f30578ecSBarry Smith   *ierr = MPI_Allgatherv(sendbuf, *sendcount, *sendtype, recvbuf, recvcounts, displs, *recvtype, *comm);
726156bc490SSatish Balay }
727156bc490SSatish Balay 
728d71ae5a4SJacob 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)
729d71ae5a4SJacob Faibussowitsch {
730f30578ecSBarry Smith   *ierr = MPI_Alltoallv(sendbuf, sendcounts, sdispls, *sendtype, recvbuf, recvcounts, rdispls, *recvtype, *comm);
731156bc490SSatish Balay }
732156bc490SSatish Balay 
733d71ae5a4SJacob Faibussowitsch PETSC_EXTERN void petsc_mpi_comm_create_(int *comm, int *group, int *newcomm, int *ierr)
734d71ae5a4SJacob Faibussowitsch {
735156bc490SSatish Balay   *newcomm = *comm;
736156bc490SSatish Balay   *ierr    = MPI_SUCCESS;
737156bc490SSatish Balay }
738156bc490SSatish Balay 
739d71ae5a4SJacob Faibussowitsch PETSC_EXTERN void petsc_mpi_address_(void *location, MPI_Aint *address, int *ierr)
740d71ae5a4SJacob Faibussowitsch {
74199256852SLisandro Dalcin   *address = (MPI_Aint)((char *)location);
742156bc490SSatish Balay   *ierr    = MPI_SUCCESS;
743156bc490SSatish Balay }
744156bc490SSatish Balay 
745d71ae5a4SJacob Faibussowitsch PETSC_EXTERN void petsc_mpi_pack_(void *inbuf, int *incount, int *datatype, void *outbuf, int *outsize, int *position, int *comm, int *ierr)
746d71ae5a4SJacob Faibussowitsch {
74706df1fb1SBarry Smith   *ierr = MPIUni_Abort(MPI_COMM_WORLD, 0);
748156bc490SSatish Balay }
749156bc490SSatish Balay 
750d71ae5a4SJacob Faibussowitsch PETSC_EXTERN void petsc_mpi_unpack_(void *inbuf, int *insize, int *position, void *outbuf, int *outcount, int *datatype, int *comm, int *ierr)
751d71ae5a4SJacob Faibussowitsch {
75206df1fb1SBarry Smith   *ierr = MPIUni_Abort(MPI_COMM_WORLD, 0);
753156bc490SSatish Balay }
754156bc490SSatish Balay 
755d71ae5a4SJacob Faibussowitsch PETSC_EXTERN void petsc_mpi_pack_size_(int *incount, int *datatype, int *comm, int *size, int *ierr)
756d71ae5a4SJacob Faibussowitsch {
75706df1fb1SBarry Smith   *ierr = MPIUni_Abort(MPI_COMM_WORLD, 0);
758156bc490SSatish Balay }
759156bc490SSatish Balay 
760d71ae5a4SJacob 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)
761d71ae5a4SJacob Faibussowitsch {
76206df1fb1SBarry Smith   *ierr = MPIUni_Abort(MPI_COMM_WORLD, 0);
763156bc490SSatish Balay }
764156bc490SSatish Balay 
765d71ae5a4SJacob Faibussowitsch PETSC_EXTERN void petsc_mpi_type_commit_(int *datatype, int *ierr)
766d71ae5a4SJacob Faibussowitsch {
767156bc490SSatish Balay   *ierr = MPI_SUCCESS;
768156bc490SSatish Balay }
769156bc490SSatish Balay 
770d71ae5a4SJacob Faibussowitsch double petsc_mpi_wtime_(void)
771d71ae5a4SJacob Faibussowitsch {
772156bc490SSatish Balay   return 0.0;
773f8f52c7dSSatish Balay }
774156bc490SSatish Balay 
775d71ae5a4SJacob Faibussowitsch PETSC_EXTERN void petsc_mpi_cancel_(int *request, int *ierr)
776d71ae5a4SJacob Faibussowitsch {
777f8f52c7dSSatish Balay   *ierr = MPI_SUCCESS;
778f8f52c7dSSatish Balay }
779f8f52c7dSSatish Balay 
780d71ae5a4SJacob Faibussowitsch PETSC_EXTERN void petsc_mpi_comm_dup_(int *comm, int *out, int *ierr)
781d71ae5a4SJacob Faibussowitsch {
782f8f52c7dSSatish Balay   *out  = *comm;
783f8f52c7dSSatish Balay   *ierr = MPI_SUCCESS;
784f8f52c7dSSatish Balay }
785f8f52c7dSSatish Balay 
786d71ae5a4SJacob Faibussowitsch PETSC_EXTERN void petsc_mpi_comm_free_(int *comm, int *ierr)
787d71ae5a4SJacob Faibussowitsch {
788f8f52c7dSSatish Balay   *ierr = MPI_SUCCESS;
789f8f52c7dSSatish Balay }
790f8f52c7dSSatish Balay 
791d71ae5a4SJacob Faibussowitsch PETSC_EXTERN void petsc_mpi_get_count_(int *status, int *datatype, int *count, int *ierr)
792d71ae5a4SJacob Faibussowitsch {
79306df1fb1SBarry Smith   *ierr = MPIUni_Abort(MPI_COMM_WORLD, 0);
794f8f52c7dSSatish Balay }
795f8f52c7dSSatish Balay 
796d71ae5a4SJacob Faibussowitsch PETSC_EXTERN void petsc_mpi_get_processor_name_(char *name, int *result_len, int *ierr, PETSC_FORTRAN_CHARLEN_T len)
797d71ae5a4SJacob Faibussowitsch {
798f8f52c7dSSatish Balay   MPIUNI_Memcpy(name, "localhost", 9 * sizeof(char));
799f8f52c7dSSatish Balay   *result_len = 9;
800f8f52c7dSSatish Balay   *ierr       = MPI_SUCCESS;
801f8f52c7dSSatish Balay }
802f8f52c7dSSatish Balay 
803d71ae5a4SJacob Faibussowitsch PETSC_EXTERN void petsc_mpi_initialized_(int *flag, int *ierr)
804d71ae5a4SJacob Faibussowitsch {
805f8f52c7dSSatish Balay   *flag = MPI_was_initialized;
806f8f52c7dSSatish Balay   *ierr = MPI_SUCCESS;
807f8f52c7dSSatish Balay }
808f8f52c7dSSatish Balay 
809d71ae5a4SJacob Faibussowitsch PETSC_EXTERN void petsc_mpi_iprobe_(int *source, int *tag, int *comm, int *glag, int *status, int *ierr)
810d71ae5a4SJacob Faibussowitsch {
811f8f52c7dSSatish Balay   *ierr = MPI_SUCCESS;
812f8f52c7dSSatish Balay }
813f8f52c7dSSatish Balay 
814d71ae5a4SJacob Faibussowitsch PETSC_EXTERN void petsc_mpi_probe_(int *source, int *tag, int *comm, int *flag, int *status, int *ierr)
815d71ae5a4SJacob Faibussowitsch {
816f8f52c7dSSatish Balay   *ierr = MPI_SUCCESS;
817f8f52c7dSSatish Balay }
818f8f52c7dSSatish Balay 
819d71ae5a4SJacob Faibussowitsch PETSC_EXTERN void petsc_mpi_request_free_(int *request, int *ierr)
820d71ae5a4SJacob Faibussowitsch {
821f8f52c7dSSatish Balay   *ierr = MPI_SUCCESS;
822f8f52c7dSSatish Balay }
823f8f52c7dSSatish Balay 
824d71ae5a4SJacob Faibussowitsch PETSC_EXTERN void petsc_mpi_ssend_(void *buf, int *count, int *datatype, int *dest, int *tag, int *comm, int *ierr)
825d71ae5a4SJacob Faibussowitsch {
82606df1fb1SBarry Smith   *ierr = MPIUni_Abort(MPI_COMM_WORLD, 0);
827f8f52c7dSSatish Balay }
828f8f52c7dSSatish Balay 
829d71ae5a4SJacob Faibussowitsch PETSC_EXTERN void petsc_mpi_wait_(int *request, int *status, int *ierr)
830d71ae5a4SJacob Faibussowitsch {
831f8f52c7dSSatish Balay   *ierr = MPI_SUCCESS;
832156bc490SSatish Balay }
833156bc490SSatish Balay 
834d71ae5a4SJacob Faibussowitsch PETSC_EXTERN void petsc_mpi_comm_group_(int *comm, int *group, int *ierr)
835d71ae5a4SJacob Faibussowitsch {
836d4816372SSatish Balay   *ierr = MPI_SUCCESS;
837d4816372SSatish Balay }
838d4816372SSatish Balay 
839d71ae5a4SJacob Faibussowitsch PETSC_EXTERN void petsc_mpi_exscan_(void *sendbuf, void *recvbuf, int *count, int *datatype, int *op, int *comm, int *ierr)
840d71ae5a4SJacob Faibussowitsch {
841d4816372SSatish Balay   *ierr = MPI_SUCCESS;
842d4816372SSatish Balay }
843d4816372SSatish Balay 
844fbf9dbe5SBarry Smith #endif /* PETSC_USE_FORTRAN_BINDINGS */
845c8217ed5SSatish Balay 
846e5c89e4eSSatish Balay #if defined(__cplusplus)
847e5c89e4eSSatish Balay }
848e5c89e4eSSatish Balay #endif
849