xref: /petsc/src/sys/mpiuni/mpi.c (revision 6524c165f7ddaf30fd7457737f668f984c8ababf)
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>
6*6524c165SJacob 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 */
579371c9d4SSatish Balay int MPIUNI_Memcpy(void *dst, const void *src, int n) {
586e42a002SJunchao Zhang   if (dst == MPI_IN_PLACE || dst == MPIUNIF_mpi_in_place) return MPI_SUCCESS;
596e42a002SJunchao Zhang   if (src == MPI_IN_PLACE || src == MPIUNIF_mpi_in_place) return MPI_SUCCESS;
606e42a002SJunchao Zhang   if (!n) return MPI_SUCCESS;
61e5c89e4eSSatish Balay 
6205035670SJunchao Zhang     /* GPU-aware MPIUNI. Use synchronous copy per MPI semantics */
6305035670SJunchao Zhang #if defined(PETSC_HAVE_CUDA)
649371c9d4SSatish Balay   if (PetscDeviceInitialized(PETSC_DEVICE_CUDA)) {
659371c9d4SSatish Balay     cudaError_t cerr = cudaMemcpy(dst, src, n, cudaMemcpyDefault);
669371c9d4SSatish Balay     if (cerr != cudaSuccess) return MPI_FAILURE;
679371c9d4SSatish Balay   } else
6805035670SJunchao Zhang #elif defined(PETSC_HAVE_HIP)
699371c9d4SSatish Balay   if (PetscDeviceInitialized(PETSC_DEVICE_HIP)) {
709371c9d4SSatish Balay     hipError_t cerr = hipMemcpy(dst, src, n, hipMemcpyDefault);
719371c9d4SSatish Balay     if (cerr != hipSuccess) return MPI_FAILURE;
729371c9d4SSatish Balay   } else
73a6191124SJunchao Zhang #endif
749371c9d4SSatish Balay   {
759371c9d4SSatish Balay     memcpy(dst, src, n);
769371c9d4SSatish Balay   }
7799256852SLisandro Dalcin   return MPI_SUCCESS;
78e5c89e4eSSatish Balay }
79e5c89e4eSSatish Balay 
8012801b39SBarry Smith static int classcnt = 0;
8112801b39SBarry Smith static int codecnt  = 0;
8212801b39SBarry Smith 
839371c9d4SSatish Balay int MPI_Add_error_class(int *cl) {
8412801b39SBarry Smith   *cl = classcnt++;
8512801b39SBarry Smith   return MPI_SUCCESS;
8612801b39SBarry Smith }
8712801b39SBarry Smith 
889371c9d4SSatish Balay int MPI_Add_error_code(int cl, int *co) {
8912801b39SBarry Smith   if (cl >= classcnt) return MPI_FAILURE;
9012801b39SBarry Smith   *co = codecnt++;
9112801b39SBarry Smith   return MPI_SUCCESS;
9212801b39SBarry Smith }
9312801b39SBarry Smith 
949371c9d4SSatish Balay int MPI_Type_get_envelope(MPI_Datatype datatype, int *num_integers, int *num_addresses, int *num_datatypes, int *combiner) {
951a589b05SJed Brown   int comb = datatype >> 28;
961a589b05SJed Brown   switch (comb) {
971a589b05SJed Brown   case MPI_COMBINER_NAMED:
981a589b05SJed Brown     *num_integers  = 0;
991a589b05SJed Brown     *num_addresses = 0;
1001a589b05SJed Brown     *num_datatypes = 0;
1011a589b05SJed Brown     *combiner      = comb;
1021a589b05SJed Brown     break;
1031a589b05SJed Brown   case MPI_COMBINER_DUP:
1041a589b05SJed Brown     *num_integers  = 0;
1051a589b05SJed Brown     *num_addresses = 0;
1061a589b05SJed Brown     *num_datatypes = 1;
1071a589b05SJed Brown     *combiner      = comb;
1081a589b05SJed Brown     break;
1091a589b05SJed Brown   case MPI_COMBINER_CONTIGUOUS:
1101a589b05SJed Brown     *num_integers  = 1;
1111a589b05SJed Brown     *num_addresses = 0;
1121a589b05SJed Brown     *num_datatypes = 1;
1131a589b05SJed Brown     *combiner      = comb;
1141a589b05SJed Brown     break;
1159371c9d4SSatish Balay   default: return MPIUni_Abort(MPI_COMM_SELF, 1);
1161a589b05SJed Brown   }
11799256852SLisandro Dalcin   return MPI_SUCCESS;
1181a589b05SJed Brown }
1191a589b05SJed Brown 
1209371c9d4SSatish Balay 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) {
1211a589b05SJed Brown   int comb = datatype >> 28;
1221a589b05SJed Brown   switch (comb) {
1239371c9d4SSatish Balay   case MPI_COMBINER_NAMED: return MPIUni_Abort(MPI_COMM_SELF, 1);
1241a589b05SJed Brown   case MPI_COMBINER_DUP:
1251a589b05SJed Brown     if (max_datatypes < 1) return MPIUni_Abort(MPI_COMM_SELF, 1);
1261a589b05SJed Brown     array_of_datatypes[0] = datatype & 0x0fffffff;
1271a589b05SJed Brown     break;
1281a589b05SJed Brown   case MPI_COMBINER_CONTIGUOUS:
1291a589b05SJed Brown     if (max_integers < 1 || max_datatypes < 1) return MPIUni_Abort(MPI_COMM_SELF, 1);
1301a589b05SJed Brown     array_of_integers[0]  = (datatype >> 8) & 0xfff;         /* count */
1311a589b05SJed Brown     array_of_datatypes[0] = (datatype & 0x0ff000ff) | 0x100; /* basic named type (count=1) from which the contiguous type is derived */
1321a589b05SJed Brown     break;
1339371c9d4SSatish Balay   default: return MPIUni_Abort(MPI_COMM_SELF, 1);
1341a589b05SJed Brown   }
13599256852SLisandro Dalcin   return MPI_SUCCESS;
1361a589b05SJed Brown }
1371a589b05SJed Brown 
138e5c89e4eSSatish Balay /*
139e5c89e4eSSatish Balay    Used to set the built-in MPI_TAG_UB attribute
140e5c89e4eSSatish Balay */
1419371c9d4SSatish Balay static int Keyval_setup(void) {
142f0463fa0SJunchao Zhang   attr[CommIdx(MPI_COMM_WORLD)][0].active        = 1;
143f0463fa0SJunchao Zhang   attr[CommIdx(MPI_COMM_WORLD)][0].attribute_val = &mpi_tag_ub;
144f0463fa0SJunchao Zhang   attr[CommIdx(MPI_COMM_SELF)][0].active         = 1;
145f0463fa0SJunchao Zhang   attr[CommIdx(MPI_COMM_SELF)][0].attribute_val  = &mpi_tag_ub;
146f0463fa0SJunchao Zhang   attr_keyval[0].active                          = 1;
14799256852SLisandro Dalcin   return MPI_SUCCESS;
148e5c89e4eSSatish Balay }
149e5c89e4eSSatish Balay 
1509371c9d4SSatish Balay int MPI_Comm_create_keyval(MPI_Copy_function *copy_fn, MPI_Delete_function *delete_fn, int *keyval, void *extra_state) {
151f0463fa0SJunchao Zhang   int i, keyid;
152f0463fa0SJunchao Zhang   for (i = 1; i < num_attr; i++) { /* the first attribute is always in use */
153f0463fa0SJunchao Zhang     if (!attr_keyval[i].active) {
154f0463fa0SJunchao Zhang       keyid = i;
155f0463fa0SJunchao Zhang       goto found;
156f0463fa0SJunchao Zhang     }
157f0463fa0SJunchao Zhang   }
1589cf9c1dbSJed Brown   if (num_attr >= MAX_ATTR) return MPIUni_Abort(MPI_COMM_WORLD, 1);
159f0463fa0SJunchao Zhang   keyid = num_attr++;
160e5c89e4eSSatish Balay 
161f0463fa0SJunchao Zhang found:
162f0463fa0SJunchao Zhang   attr_keyval[keyid].extra_state = extra_state;
163f0463fa0SJunchao Zhang   attr_keyval[keyid].del         = delete_fn;
164f0463fa0SJunchao Zhang   attr_keyval[keyid].active      = 1;
165f0463fa0SJunchao Zhang   *keyval                        = keyid;
16699256852SLisandro Dalcin   return MPI_SUCCESS;
167e5c89e4eSSatish Balay }
168e5c89e4eSSatish Balay 
16936f0be53SJacob Faibussowitsch /*
17036f0be53SJacob Faibussowitsch   The reference counting business is here to guard against the following:
17136f0be53SJacob Faibussowitsch 
17236f0be53SJacob Faibussowitsch   MPI_Comm_set_attr(comm, keyval, some_attr);
17336f0be53SJacob Faibussowitsch   MPI_Comm_free_keyval(&keyval);
17436f0be53SJacob Faibussowitsch   MPI_Comm_free(&comm);
17536f0be53SJacob Faibussowitsch 
17636f0be53SJacob Faibussowitsch   Here MPI_Comm_free() will try to destroy all of the attributes of the comm, and hence we
17736f0be53SJacob Faibussowitsch   should not clear the deleter or extra_state until all communicators that have the attribute
17836f0be53SJacob Faibussowitsch   set are either freed or have given up their attribute.
17936f0be53SJacob Faibussowitsch 
18036f0be53SJacob Faibussowitsch   The attribute reference count is INCREASED in:
18136f0be53SJacob Faibussowitsch   - MPI_Comm_create_keyval()
18236f0be53SJacob Faibussowitsch   - MPI_Comm_set_attr()
18336f0be53SJacob Faibussowitsch 
18436f0be53SJacob Faibussowitsch   The atrtibute reference count is DECREASED in:
18536f0be53SJacob Faibussowitsch   - MPI_Comm_free_keyval()
18636f0be53SJacob Faibussowitsch   - MPI_Comm_delete_attr() (but only if the comm has the attribute)
18736f0be53SJacob Faibussowitsch */
18836f0be53SJacob Faibussowitsch static int MPI_Attr_dereference_keyval(int keyval) {
18936f0be53SJacob Faibussowitsch   if (--(attr_keyval[keyval].active) <= 0) {
19036f0be53SJacob Faibussowitsch     attr_keyval[keyval].extra_state = 0;
19136f0be53SJacob Faibussowitsch     attr_keyval[keyval].del         = 0;
19236f0be53SJacob Faibussowitsch   }
19336f0be53SJacob Faibussowitsch   return MPI_SUCCESS;
19436f0be53SJacob Faibussowitsch }
19536f0be53SJacob Faibussowitsch 
19636f0be53SJacob Faibussowitsch static int MPI_Attr_reference_keyval(int keyval) {
19736f0be53SJacob Faibussowitsch   ++(attr_keyval[keyval].active);
19836f0be53SJacob Faibussowitsch   return MPI_SUCCESS;
19936f0be53SJacob Faibussowitsch }
20036f0be53SJacob Faibussowitsch 
2019371c9d4SSatish Balay int MPI_Comm_free_keyval(int *keyval) {
20236f0be53SJacob Faibussowitsch   int ret;
20336f0be53SJacob Faibussowitsch 
20436f0be53SJacob Faibussowitsch   if (*keyval < 0 || *keyval >= num_attr) return MPI_FAILURE;
20536f0be53SJacob Faibussowitsch   if ((ret = MPI_Attr_dereference_keyval(*keyval))) return ret;
206a246e310SBarry Smith   *keyval = 0;
207e5c89e4eSSatish Balay   return MPI_SUCCESS;
208e5c89e4eSSatish Balay }
209e5c89e4eSSatish Balay 
2109371c9d4SSatish Balay int MPI_Comm_set_attr(MPI_Comm comm, int keyval, void *attribute_val) {
21136f0be53SJacob Faibussowitsch   int idx = CommIdx(comm), ret;
212f0463fa0SJunchao Zhang   if (comm < 1 || comm > MaxComm) return MPI_FAILURE;
21336f0be53SJacob Faibussowitsch   if (keyval < 0 || keyval >= num_attr) return MPI_FAILURE;
21436f0be53SJacob Faibussowitsch 
21536f0be53SJacob Faibussowitsch   if ((ret = MPI_Comm_delete_attr(comm, keyval))) return ret;
21636f0be53SJacob Faibussowitsch   if ((ret = MPI_Attr_reference_keyval(keyval))) return ret;
217f0463fa0SJunchao Zhang   attr[idx][keyval].active        = 1;
218f0463fa0SJunchao Zhang   attr[idx][keyval].attribute_val = attribute_val;
219e5c89e4eSSatish Balay   return MPI_SUCCESS;
220e5c89e4eSSatish Balay }
221e5c89e4eSSatish Balay 
2229371c9d4SSatish Balay int MPI_Comm_delete_attr(MPI_Comm comm, int keyval) {
223f0463fa0SJunchao Zhang   int idx = CommIdx(comm);
224f0463fa0SJunchao Zhang   if (comm < 1 || comm > MaxComm) return MPI_FAILURE;
22536f0be53SJacob Faibussowitsch   if (keyval < 0 || keyval >= num_attr) return MPI_FAILURE;
22636f0be53SJacob Faibussowitsch   if (attr[idx][keyval].active) {
22736f0be53SJacob Faibussowitsch     int   ret;
228f0463fa0SJunchao Zhang     void *save_attribute_val = attr[idx][keyval].attribute_val;
22936f0be53SJacob Faibussowitsch 
230f0463fa0SJunchao Zhang     attr[idx][keyval].active        = 0;
231f0463fa0SJunchao Zhang     attr[idx][keyval].attribute_val = 0;
23236f0be53SJacob Faibussowitsch     if (attr_keyval[keyval].del) {
23336f0be53SJacob Faibussowitsch       if ((ret = (*(attr_keyval[keyval].del))(comm, keyval, save_attribute_val, attr_keyval[keyval].extra_state))) return ret;
23436f0be53SJacob Faibussowitsch     }
23536f0be53SJacob Faibussowitsch     if ((ret = MPI_Attr_dereference_keyval(keyval))) return ret;
23640776e1bSpetsc   }
237e5c89e4eSSatish Balay   return MPI_SUCCESS;
238e5c89e4eSSatish Balay }
239e5c89e4eSSatish Balay 
2409371c9d4SSatish Balay int MPI_Comm_get_attr(MPI_Comm comm, int keyval, void *attribute_val, int *flag) {
241f0463fa0SJunchao Zhang   int idx = CommIdx(comm);
242f0463fa0SJunchao Zhang   if (comm < 1 || comm > MaxComm) return MPI_FAILURE;
243e5c89e4eSSatish Balay   if (!keyval) Keyval_setup();
244f0463fa0SJunchao Zhang   *flag                   = attr[idx][keyval].active;
245f0463fa0SJunchao Zhang   *(void **)attribute_val = attr[idx][keyval].attribute_val;
246e5c89e4eSSatish Balay   return MPI_SUCCESS;
247e5c89e4eSSatish Balay }
248e5c89e4eSSatish Balay 
2499371c9d4SSatish Balay static char all_comm_names[MAX_COMM][MPI_MAX_OBJECT_NAME] = {"MPI_COMM_SELF", "MPI_COMM_WORLD"};
2503e1d142dSJacob Faibussowitsch 
2519371c9d4SSatish Balay int MPI_Comm_get_name(MPI_Comm comm, char *comm_name, int *resultlen) {
2523e1d142dSJacob Faibussowitsch   if (comm < 1 || comm > MaxComm) return MPI_FAILURE;
2533e1d142dSJacob Faibussowitsch   if (!comm_name || !resultlen) return MPI_FAILURE;
2543e1d142dSJacob Faibussowitsch   strncpy(comm_name, all_comm_names[CommIdx(comm)], MPI_MAX_OBJECT_NAME - 1);
2553e1d142dSJacob Faibussowitsch   *resultlen = (int)strlen(comm_name);
2563e1d142dSJacob Faibussowitsch   return MPI_SUCCESS;
2573e1d142dSJacob Faibussowitsch }
2583e1d142dSJacob Faibussowitsch 
2599371c9d4SSatish Balay int MPI_Comm_set_name(MPI_Comm comm, const char *comm_name) {
2603e1d142dSJacob Faibussowitsch   if (comm < 1 || comm > MaxComm) return MPI_FAILURE;
2613e1d142dSJacob Faibussowitsch   if (!comm_name) return MPI_FAILURE;
2623e1d142dSJacob Faibussowitsch   if (strlen(comm_name) > MPI_MAX_OBJECT_NAME - 1) return MPI_FAILURE;
2633e1d142dSJacob Faibussowitsch   strncpy(all_comm_names[CommIdx(comm)], comm_name, MPI_MAX_OBJECT_NAME - 1);
2643e1d142dSJacob Faibussowitsch   return MPI_SUCCESS;
2653e1d142dSJacob Faibussowitsch }
2663e1d142dSJacob Faibussowitsch 
2679371c9d4SSatish Balay int MPI_Comm_create(MPI_Comm comm, MPI_Group group, MPI_Comm *newcomm) {
268f60917d2SBarry Smith   int j;
269f0463fa0SJunchao Zhang   if (comm < 1 || comm > MaxComm) return MPI_FAILURE;
270f0463fa0SJunchao Zhang   for (j = 3; j <= MaxComm; j++) {
271f0463fa0SJunchao Zhang     if (!comm_active[CommIdx(j)]) {
272f0463fa0SJunchao Zhang       comm_active[CommIdx(j)] = 1;
273f60917d2SBarry Smith       *newcomm                = j;
274f60917d2SBarry Smith       return MPI_SUCCESS;
275f60917d2SBarry Smith     }
276f60917d2SBarry Smith   }
277f0463fa0SJunchao Zhang   if (MaxComm >= MAX_COMM) return MPI_FAILURE;
278f0463fa0SJunchao Zhang   *newcomm                       = ++MaxComm;
279f0463fa0SJunchao Zhang   comm_active[CommIdx(*newcomm)] = 1;
280c8217ed5SSatish Balay   return MPI_SUCCESS;
281c8217ed5SSatish Balay }
282c8217ed5SSatish Balay 
2839371c9d4SSatish Balay int MPI_Comm_dup(MPI_Comm comm, MPI_Comm *out) {
284f60917d2SBarry Smith   int j;
285f0463fa0SJunchao Zhang   if (comm < 1 || comm > MaxComm) return MPI_FAILURE;
286f0463fa0SJunchao Zhang   for (j = 3; j <= MaxComm; j++) {
287f0463fa0SJunchao Zhang     if (!comm_active[CommIdx(j)]) {
288f0463fa0SJunchao Zhang       comm_active[CommIdx(j)] = 1;
289f60917d2SBarry Smith       *out                    = j;
290f60917d2SBarry Smith       return MPI_SUCCESS;
291f60917d2SBarry Smith     }
292f60917d2SBarry Smith   }
293f0463fa0SJunchao Zhang   if (MaxComm >= MAX_COMM) return MPI_FAILURE;
294f0463fa0SJunchao Zhang   *out                       = ++MaxComm;
295f0463fa0SJunchao Zhang   comm_active[CommIdx(*out)] = 1;
29699256852SLisandro Dalcin   return MPI_SUCCESS;
297e5c89e4eSSatish Balay }
298e5c89e4eSSatish Balay 
2999371c9d4SSatish Balay int MPI_Comm_free(MPI_Comm *comm) {
300f0463fa0SJunchao Zhang   int idx = CommIdx(*comm);
301e5c89e4eSSatish Balay 
302f0463fa0SJunchao Zhang   if (*comm < 1 || *comm > MaxComm) return MPI_FAILURE;
30336f0be53SJacob Faibussowitsch   for (int i = 0; i < num_attr; i++) {
30436f0be53SJacob Faibussowitsch     int ret = MPI_Comm_delete_attr(*comm, i);
30536f0be53SJacob Faibussowitsch 
30636f0be53SJacob Faibussowitsch     if (ret) return ret;
307e5c89e4eSSatish Balay   }
308f0463fa0SJunchao Zhang   if (*comm >= 3) comm_active[idx] = 0;
309100f28aeSBarry Smith   *comm = 0;
310e5c89e4eSSatish Balay   return MPI_SUCCESS;
311e5c89e4eSSatish Balay }
312e5c89e4eSSatish Balay 
3139371c9d4SSatish Balay int MPI_Comm_size(MPI_Comm comm, int *size) {
314f0463fa0SJunchao Zhang   if (comm < 1 || comm > MaxComm) return MPI_FAILURE;
315d393f697SSatish Balay   *size = 1;
316d393f697SSatish Balay   return MPI_SUCCESS;
317d393f697SSatish Balay }
318d393f697SSatish Balay 
3199371c9d4SSatish Balay int MPI_Comm_rank(MPI_Comm comm, int *rank) {
320f0463fa0SJunchao Zhang   if (comm < 1 || comm > MaxComm) return MPI_FAILURE;
321d393f697SSatish Balay   *rank = 0;
322d393f697SSatish Balay   return MPI_SUCCESS;
323d393f697SSatish Balay }
324d393f697SSatish Balay 
3259371c9d4SSatish Balay int MPIUni_Abort(MPI_Comm comm, int errorcode) {
32606df1fb1SBarry Smith   printf("MPI operation not supported by PETSc's sequential MPI wrappers\n");
327b3f11779SBarry Smith   return MPI_ERR_NOSUPPORT;
32806df1fb1SBarry Smith }
32906df1fb1SBarry Smith 
3309371c9d4SSatish Balay int MPI_Abort(MPI_Comm comm, int errorcode) {
331e5c89e4eSSatish Balay   abort();
332e5c89e4eSSatish Balay   return MPI_SUCCESS;
333e5c89e4eSSatish Balay }
334e5c89e4eSSatish Balay 
33558cd72c3SLisandro Dalcin /* --------------------------------------------------------------------------*/
33658cd72c3SLisandro Dalcin 
337e5c89e4eSSatish Balay static int MPI_was_initialized = 0;
33858cd72c3SLisandro Dalcin static int MPI_was_finalized   = 0;
33958cd72c3SLisandro Dalcin 
3409371c9d4SSatish Balay int MPI_Init(int *argc, char ***argv) {
34199256852SLisandro Dalcin   if (MPI_was_initialized) return MPI_FAILURE;
3429bcf9d5aSJunchao Zhang   /* MPI standard says "once MPI_Finalize returns, no MPI routine (not even MPI_Init) may be called", so an MPI standard compliant
3439bcf9d5aSJunchao Zhang      MPIU should have this 'if (MPI_was_finalized) return MPI_FAILURE;' check. We relax it here to make life easier for users
3449bcf9d5aSJunchao Zhang      of MPIU so that they can do multiple PetscInitialize/Finalize().
3459bcf9d5aSJunchao Zhang   */
3469bcf9d5aSJunchao Zhang   /* if (MPI_was_finalized) return MPI_FAILURE; */
34758cd72c3SLisandro Dalcin   MPI_was_initialized = 1;
3489bcf9d5aSJunchao Zhang   MPI_was_finalized   = 0;
34999256852SLisandro Dalcin   return MPI_SUCCESS;
35058cd72c3SLisandro Dalcin }
35158cd72c3SLisandro Dalcin 
3529371c9d4SSatish Balay int MPI_Init_thread(int *argc, char ***argv, int required, int *provided) {
3539012378cSStefano Zampini   MPI_Query_thread(provided);
3549012378cSStefano Zampini   return MPI_Init(argc, argv);
3559012378cSStefano Zampini }
3569012378cSStefano Zampini 
3579371c9d4SSatish Balay int MPI_Query_thread(int *provided) {
3589012378cSStefano Zampini   *provided = MPI_THREAD_FUNNELED;
3599012378cSStefano Zampini   return MPI_SUCCESS;
3609012378cSStefano Zampini }
3619012378cSStefano Zampini 
3629371c9d4SSatish Balay int MPI_Finalize(void) {
36336f0be53SJacob Faibussowitsch   if (MPI_was_finalized || !MPI_was_initialized) return MPI_FAILURE;
36436f0be53SJacob Faibussowitsch   MPI_Comm comm = MPI_COMM_WORLD;
36536f0be53SJacob Faibussowitsch   int      ret  = MPI_Comm_free(&comm);
36636f0be53SJacob Faibussowitsch 
36736f0be53SJacob Faibussowitsch   if (ret) return ret;
368100f28aeSBarry Smith   comm = MPI_COMM_SELF;
36936f0be53SJacob Faibussowitsch   ret  = MPI_Comm_free(&comm);
37036f0be53SJacob Faibussowitsch   if (ret) return ret;
37136f0be53SJacob Faibussowitsch   if (PetscDefined(USE_DEBUG)) {
37236f0be53SJacob Faibussowitsch     for (int i = 3; i <= MaxComm; ++i) {
373f0463fa0SJunchao Zhang       if (comm_active[CommIdx(i)]) printf("MPIUni warning: MPI communicator %d is not freed before MPI_Finalize()\n", i);
374f0463fa0SJunchao Zhang     }
37536f0be53SJacob Faibussowitsch 
37636f0be53SJacob Faibussowitsch     for (int i = 1; i <= MaxComm; ++i) {
37736f0be53SJacob Faibussowitsch       for (int j = 0; j < num_attr; ++j) {
37836f0be53SJacob Faibussowitsch         if (attr[CommIdx(i)][j].active) printf("MPIUni warning: MPI communicator %d attribute %d was not freed before MPI_Finalize()\n", i, j);
379f0463fa0SJunchao Zhang       }
38036f0be53SJacob Faibussowitsch     }
38136f0be53SJacob Faibussowitsch 
38236f0be53SJacob Faibussowitsch     for (int i = 1; i < num_attr; ++i) {
38336f0be53SJacob Faibussowitsch       if (attr_keyval[i].active) printf("MPIUni warning: MPI attribute %d was not freed before MPI_Finalize()\n", i);
38436f0be53SJacob Faibussowitsch     }
38536f0be53SJacob Faibussowitsch   }
38636f0be53SJacob Faibussowitsch 
387f0463fa0SJunchao Zhang   /* reset counters */
388f0463fa0SJunchao Zhang   MaxComm             = 2;
389f0463fa0SJunchao Zhang   num_attr            = 1;
39058cd72c3SLisandro Dalcin   MPI_was_finalized   = 1;
3919bcf9d5aSJunchao Zhang   MPI_was_initialized = 0;
3929bcf9d5aSJunchao Zhang   PETSC_COMM_WORLD    = MPI_COMM_NULL;
39399256852SLisandro Dalcin   return MPI_SUCCESS;
39458cd72c3SLisandro Dalcin }
395e5c89e4eSSatish Balay 
3969371c9d4SSatish Balay int MPI_Initialized(int *flag) {
397e5c89e4eSSatish Balay   *flag = MPI_was_initialized;
39899256852SLisandro Dalcin   return MPI_SUCCESS;
399e5c89e4eSSatish Balay }
400e5c89e4eSSatish Balay 
4019371c9d4SSatish Balay int MPI_Finalized(int *flag) {
40258cd72c3SLisandro Dalcin   *flag = MPI_was_finalized;
40399256852SLisandro Dalcin   return MPI_SUCCESS;
404e5c89e4eSSatish Balay }
405e5c89e4eSSatish Balay 
406e5c89e4eSSatish Balay /* -------------------     Fortran versions of several routines ------------------ */
407e5c89e4eSSatish Balay 
408f7c6e6aaSSatish Balay #if defined(PETSC_HAVE_FORTRAN_CAPS)
4090134af2dSBarry Smith #define mpiunisetmoduleblock_         MPIUNISETMODULEBLOCK
41052ecd5ffSSatish Balay #define mpiunisetfortranbasepointers_ MPIUNISETFORTRANBASEPOINTERS
411a7b85bbcSSatish Balay #define petsc_mpi_init_               PETSC_MPI_INIT
412a7b85bbcSSatish Balay #define petsc_mpi_finalize_           PETSC_MPI_FINALIZE
413a7b85bbcSSatish Balay #define petsc_mpi_comm_size_          PETSC_MPI_COMM_SIZE
414a7b85bbcSSatish Balay #define petsc_mpi_comm_rank_          PETSC_MPI_COMM_RANK
415a7b85bbcSSatish Balay #define petsc_mpi_abort_              PETSC_MPI_ABORT
416a7b85bbcSSatish Balay #define petsc_mpi_reduce_             PETSC_MPI_REDUCE
417a7b85bbcSSatish Balay #define petsc_mpi_allreduce_          PETSC_MPI_ALLREDUCE
418a7b85bbcSSatish Balay #define petsc_mpi_barrier_            PETSC_MPI_BARRIER
419a7b85bbcSSatish Balay #define petsc_mpi_bcast_              PETSC_MPI_BCAST
420a7b85bbcSSatish Balay #define petsc_mpi_gather_             PETSC_MPI_GATHER
421a7b85bbcSSatish Balay #define petsc_mpi_allgather_          PETSC_MPI_ALLGATHER
422a7b85bbcSSatish Balay #define petsc_mpi_comm_split_         PETSC_MPI_COMM_SPLIT
423a7b85bbcSSatish Balay #define petsc_mpi_scan_               PETSC_MPI_SCAN
424a7b85bbcSSatish Balay #define petsc_mpi_send_               PETSC_MPI_SEND
425a7b85bbcSSatish Balay #define petsc_mpi_recv_               PETSC_MPI_RECV
426a7b85bbcSSatish Balay #define petsc_mpi_reduce_scatter_     PETSC_MPI_REDUCE_SCATTER
427a7b85bbcSSatish Balay #define petsc_mpi_irecv_              PETSC_MPI_IRECV
428a7b85bbcSSatish Balay #define petsc_mpi_isend_              PETSC_MPI_ISEND
429a7b85bbcSSatish Balay #define petsc_mpi_sendrecv_           PETSC_MPI_SENDRECV
430a7b85bbcSSatish Balay #define petsc_mpi_test_               PETSC_MPI_TEST
431a7b85bbcSSatish Balay #define petsc_mpi_waitall_            PETSC_MPI_WAITALL
432a7b85bbcSSatish Balay #define petsc_mpi_waitany_            PETSC_MPI_WAITANY
433a7b85bbcSSatish Balay #define petsc_mpi_allgatherv_         PETSC_MPI_ALLGATHERV
434a7b85bbcSSatish Balay #define petsc_mpi_alltoallv_          PETSC_MPI_ALLTOALLV
435a7b85bbcSSatish Balay #define petsc_mpi_comm_create_        PETSC_MPI_COMM_CREATE
436a7b85bbcSSatish Balay #define petsc_mpi_address_            PETSC_MPI_ADDRESS
437a7b85bbcSSatish Balay #define petsc_mpi_pack_               PETSC_MPI_PACK
438a7b85bbcSSatish Balay #define petsc_mpi_unpack_             PETSC_MPI_UNPACK
439a7b85bbcSSatish Balay #define petsc_mpi_pack_size_          PETSC_MPI_PACK_SIZE
440a7b85bbcSSatish Balay #define petsc_mpi_type_struct_        PETSC_MPI_TYPE_STRUCT
441a7b85bbcSSatish Balay #define petsc_mpi_type_commit_        PETSC_MPI_TYPE_COMMIT
442a7b85bbcSSatish Balay #define petsc_mpi_wtime_              PETSC_MPI_WTIME
443a7b85bbcSSatish Balay #define petsc_mpi_cancel_             PETSC_MPI_CANCEL
444a7b85bbcSSatish Balay #define petsc_mpi_comm_dup_           PETSC_MPI_COMM_DUP
445a7b85bbcSSatish Balay #define petsc_mpi_comm_free_          PETSC_MPI_COMM_FREE
446a7b85bbcSSatish Balay #define petsc_mpi_get_count_          PETSC_MPI_GET_COUNT
447a7b85bbcSSatish Balay #define petsc_mpi_get_processor_name_ PETSC_MPI_GET_PROCESSOR_NAME
448a7b85bbcSSatish Balay #define petsc_mpi_initialized_        PETSC_MPI_INITIALIZED
449a7b85bbcSSatish Balay #define petsc_mpi_iprobe_             PETSC_MPI_IPROBE
450a7b85bbcSSatish Balay #define petsc_mpi_probe_              PETSC_MPI_PROBE
451a7b85bbcSSatish Balay #define petsc_mpi_request_free_       PETSC_MPI_REQUEST_FREE
452a7b85bbcSSatish Balay #define petsc_mpi_ssend_              PETSC_MPI_SSEND
453a7b85bbcSSatish Balay #define petsc_mpi_wait_               PETSC_MPI_WAIT
454a7b85bbcSSatish Balay #define petsc_mpi_comm_group_         PETSC_MPI_COMM_GROUP
455a7b85bbcSSatish Balay #define petsc_mpi_exscan_             PETSC_MPI_EXSCAN
456f7c6e6aaSSatish Balay #elif !defined(PETSC_HAVE_FORTRAN_UNDERSCORE)
4570134af2dSBarry Smith #define mpiunisetmoduleblock_         mpiunisetmoduleblock
45852ecd5ffSSatish Balay #define mpiunisetfortranbasepointers_ mpiunisetfortranbasepointers
459a7b85bbcSSatish Balay #define petsc_mpi_init_               petsc_mpi_init
460a7b85bbcSSatish Balay #define petsc_mpi_finalize_           petsc_mpi_finalize
461a7b85bbcSSatish Balay #define petsc_mpi_comm_size_          petsc_mpi_comm_size
462a7b85bbcSSatish Balay #define petsc_mpi_comm_rank_          petsc_mpi_comm_rank
463a7b85bbcSSatish Balay #define petsc_mpi_abort_              petsc_mpi_abort
464a7b85bbcSSatish Balay #define petsc_mpi_reduce_             petsc_mpi_reduce
465a7b85bbcSSatish Balay #define petsc_mpi_allreduce_          petsc_mpi_allreduce
466a7b85bbcSSatish Balay #define petsc_mpi_barrier_            petsc_mpi_barrier
467a7b85bbcSSatish Balay #define petsc_mpi_bcast_              petsc_mpi_bcast
468a7b85bbcSSatish Balay #define petsc_mpi_gather_             petsc_mpi_gather
469a7b85bbcSSatish Balay #define petsc_mpi_allgather_          petsc_mpi_allgather
470a7b85bbcSSatish Balay #define petsc_mpi_comm_split_         petsc_mpi_comm_split
471a7b85bbcSSatish Balay #define petsc_mpi_scan_               petsc_mpi_scan
472a7b85bbcSSatish Balay #define petsc_mpi_send_               petsc_mpi_send
473a7b85bbcSSatish Balay #define petsc_mpi_recv_               petsc_mpi_recv
474a7b85bbcSSatish Balay #define petsc_mpi_reduce_scatter_     petsc_mpi_reduce_scatter
475a7b85bbcSSatish Balay #define petsc_mpi_irecv_              petsc_mpi_irecv
476a7b85bbcSSatish Balay #define petsc_mpi_isend_              petsc_mpi_isend
477a7b85bbcSSatish Balay #define petsc_mpi_sendrecv_           petsc_mpi_sendrecv
478a7b85bbcSSatish Balay #define petsc_mpi_test_               petsc_mpi_test
479a7b85bbcSSatish Balay #define petsc_mpi_waitall_            petsc_mpi_waitall
480a7b85bbcSSatish Balay #define petsc_mpi_waitany_            petsc_mpi_waitany
481a7b85bbcSSatish Balay #define petsc_mpi_allgatherv_         petsc_mpi_allgatherv
482a7b85bbcSSatish Balay #define petsc_mpi_alltoallv_          petsc_mpi_alltoallv
483a7b85bbcSSatish Balay #define petsc_mpi_comm_create_        petsc_mpi_comm_create
484a7b85bbcSSatish Balay #define petsc_mpi_address_            petsc_mpi_address
485a7b85bbcSSatish Balay #define petsc_mpi_pack_               petsc_mpi_pack
486a7b85bbcSSatish Balay #define petsc_mpi_unpack_             petsc_mpi_unpack
487a7b85bbcSSatish Balay #define petsc_mpi_pack_size_          petsc_mpi_pack_size
488a7b85bbcSSatish Balay #define petsc_mpi_type_struct_        petsc_mpi_type_struct
489a7b85bbcSSatish Balay #define petsc_mpi_type_commit_        petsc_mpi_type_commit
490a7b85bbcSSatish Balay #define petsc_mpi_wtime_              petsc_mpi_wtime
491a7b85bbcSSatish Balay #define petsc_mpi_cancel_             petsc_mpi_cancel
492a7b85bbcSSatish Balay #define petsc_mpi_comm_dup_           petsc_mpi_comm_dup
493a7b85bbcSSatish Balay #define petsc_mpi_comm_free_          petsc_mpi_comm_free
494a7b85bbcSSatish Balay #define petsc_mpi_get_count_          petsc_mpi_get_count
495a7b85bbcSSatish Balay #define petsc_mpi_get_processor_name_ petsc_mpi_get_processor_name
496a7b85bbcSSatish Balay #define petsc_mpi_initialized_        petsc_mpi_initialized
497a7b85bbcSSatish Balay #define petsc_mpi_iprobe_             petsc_mpi_iprobe
498a7b85bbcSSatish Balay #define petsc_mpi_probe_              petsc_mpi_probe
499a7b85bbcSSatish Balay #define petsc_mpi_request_free_       petsc_mpi_request_free
500a7b85bbcSSatish Balay #define petsc_mpi_ssend_              petsc_mpi_ssend
501a7b85bbcSSatish Balay #define petsc_mpi_wait_               petsc_mpi_wait
502a7b85bbcSSatish Balay #define petsc_mpi_comm_group_         petsc_mpi_comm_group
503a7b85bbcSSatish Balay #define petsc_mpi_exscan_             petsc_mpi_exscan
504f7c6e6aaSSatish Balay #endif
505e5c89e4eSSatish Balay 
506f7c6e6aaSSatish Balay #if defined(PETSC_HAVE_FORTRAN_UNDERSCORE_UNDERSCORE)
507a7b85bbcSSatish Balay #define petsc_mpi_init_               petsc_mpi_init__
508a7b85bbcSSatish Balay #define petsc_mpi_finalize_           petsc_mpi_finalize__
509a7b85bbcSSatish Balay #define petsc_mpi_comm_size_          petsc_mpi_comm_size__
510a7b85bbcSSatish Balay #define petsc_mpi_comm_rank_          petsc_mpi_comm_rank__
511a7b85bbcSSatish Balay #define petsc_mpi_abort_              petsc_mpi_abort__
512a7b85bbcSSatish Balay #define petsc_mpi_reduce_             petsc_mpi_reduce__
513a7b85bbcSSatish Balay #define petsc_mpi_allreduce_          petsc_mpi_allreduce__
514a7b85bbcSSatish Balay #define petsc_mpi_barrier_            petsc_mpi_barrier__
515a7b85bbcSSatish Balay #define petsc_mpi_bcast_              petsc_mpi_bcast__
516a7b85bbcSSatish Balay #define petsc_mpi_gather_             petsc_mpi_gather__
517a7b85bbcSSatish Balay #define petsc_mpi_allgather_          petsc_mpi_allgather__
518a7b85bbcSSatish Balay #define petsc_mpi_comm_split_         petsc_mpi_comm_split__
519a7b85bbcSSatish Balay #define petsc_mpi_scan_               petsc_mpi_scan__
520a7b85bbcSSatish Balay #define petsc_mpi_send_               petsc_mpi_send__
521a7b85bbcSSatish Balay #define petsc_mpi_recv_               petsc_mpi_recv__
522a7b85bbcSSatish Balay #define petsc_mpi_reduce_scatter_     petsc_mpi_reduce_scatter__
523a7b85bbcSSatish Balay #define petsc_mpi_irecv_              petsc_mpi_irecv__
524a7b85bbcSSatish Balay #define petsc_mpi_isend_              petsc_mpi_isend__
525a7b85bbcSSatish Balay #define petsc_mpi_sendrecv_           petsc_mpi_sendrecv__
526a7b85bbcSSatish Balay #define petsc_mpi_test_               petsc_mpi_test__
527a7b85bbcSSatish Balay #define petsc_mpi_waitall_            petsc_mpi_waitall__
528a7b85bbcSSatish Balay #define petsc_mpi_waitany_            petsc_mpi_waitany__
529a7b85bbcSSatish Balay #define petsc_mpi_allgatherv_         petsc_mpi_allgatherv__
530a7b85bbcSSatish Balay #define petsc_mpi_alltoallv_          petsc_mpi_alltoallv__
531a7b85bbcSSatish Balay #define petsc_mpi_comm_create_        petsc_mpi_comm_create__
532a7b85bbcSSatish Balay #define petsc_mpi_address_            petsc_mpi_address__
533a7b85bbcSSatish Balay #define petsc_mpi_pack_               petsc_mpi_pack__
534a7b85bbcSSatish Balay #define petsc_mpi_unpack_             petsc_mpi_unpack__
535a7b85bbcSSatish Balay #define petsc_mpi_pack_size_          petsc_mpi_pack_size__
536a7b85bbcSSatish Balay #define petsc_mpi_type_struct_        petsc_mpi_type_struct__
537a7b85bbcSSatish Balay #define petsc_mpi_type_commit_        petsc_mpi_type_commit__
538a7b85bbcSSatish Balay #define petsc_mpi_wtime_              petsc_mpi_wtime__
539a7b85bbcSSatish Balay #define petsc_mpi_cancel_             petsc_mpi_cancel__
540a7b85bbcSSatish Balay #define petsc_mpi_comm_dup_           petsc_mpi_comm_dup__
541a7b85bbcSSatish Balay #define petsc_mpi_comm_free_          petsc_mpi_comm_free__
542a7b85bbcSSatish Balay #define petsc_mpi_get_count_          petsc_mpi_get_count__
543a7b85bbcSSatish Balay #define petsc_mpi_get_processor_name_ petsc_mpi_get_processor_name__
544a7b85bbcSSatish Balay #define petsc_mpi_initialized_        petsc_mpi_initialized__
545a7b85bbcSSatish Balay #define petsc_mpi_iprobe_             petsc_mpi_iprobe__
546a7b85bbcSSatish Balay #define petsc_mpi_probe_              petsc_mpi_probe__
547a7b85bbcSSatish Balay #define petsc_mpi_request_free_       petsc_mpi_request_free__
548a7b85bbcSSatish Balay #define petsc_mpi_ssend_              petsc_mpi_ssend__
549a7b85bbcSSatish Balay #define petsc_mpi_wait_               petsc_mpi_wait__
550a7b85bbcSSatish Balay #define petsc_mpi_comm_group_         petsc_mpi_comm_group__
551a7b85bbcSSatish Balay #define petsc_mpi_exscan_             petsc_mpi_exscan__
552f7c6e6aaSSatish Balay #endif
553e5c89e4eSSatish Balay 
554c8217ed5SSatish Balay /* Do not build fortran interface if MPI namespace colision is to be avoided */
555a7b85bbcSSatish Balay #if defined(PETSC_HAVE_FORTRAN)
556c8217ed5SSatish Balay 
55719caf8f3SSatish Balay PETSC_EXTERN void mpiunisetmoduleblock_(void);
55852ecd5ffSSatish Balay 
5599371c9d4SSatish Balay PETSC_EXTERN void mpiunisetfortranbasepointers_(void *f_mpi_in_place) {
56052ecd5ffSSatish Balay   MPIUNIF_mpi_in_place = f_mpi_in_place;
56152ecd5ffSSatish Balay }
56252ecd5ffSSatish Balay 
5639371c9d4SSatish Balay PETSC_EXTERN void petsc_mpi_init_(int *ierr) {
5640134af2dSBarry Smith   mpiunisetmoduleblock_();
565c8217ed5SSatish Balay   *ierr = MPI_Init((int *)0, (char ***)0);
566e5c89e4eSSatish Balay }
567e5c89e4eSSatish Balay 
5689371c9d4SSatish Balay PETSC_EXTERN void petsc_mpi_finalize_(int *ierr) {
569c8217ed5SSatish Balay   *ierr = MPI_Finalize();
570e5c89e4eSSatish Balay }
571e5c89e4eSSatish Balay 
5729371c9d4SSatish Balay PETSC_EXTERN void petsc_mpi_comm_size_(MPI_Comm *comm, int *size, int *ierr) {
573e5c89e4eSSatish Balay   *size = 1;
574e5c89e4eSSatish Balay   *ierr = 0;
575e5c89e4eSSatish Balay }
576e5c89e4eSSatish Balay 
5779371c9d4SSatish Balay PETSC_EXTERN void petsc_mpi_comm_rank_(MPI_Comm *comm, int *rank, int *ierr) {
578e5c89e4eSSatish Balay   *rank = 0;
579e5c89e4eSSatish Balay   *ierr = MPI_SUCCESS;
580e5c89e4eSSatish Balay }
581e5c89e4eSSatish Balay 
5829371c9d4SSatish Balay PETSC_EXTERN void petsc_mpi_comm_split_(MPI_Comm *comm, int *color, int *key, MPI_Comm *newcomm, int *ierr) {
5831f6cc5b2SSatish Balay   *newcomm = *comm;
5841f6cc5b2SSatish Balay   *ierr    = MPI_SUCCESS;
5851f6cc5b2SSatish Balay }
5861f6cc5b2SSatish Balay 
5879371c9d4SSatish Balay PETSC_EXTERN void petsc_mpi_abort_(MPI_Comm *comm, int *errorcode, int *ierr) {
588e5c89e4eSSatish Balay   abort();
589e5c89e4eSSatish Balay   *ierr = MPI_SUCCESS;
590e5c89e4eSSatish Balay }
591e5c89e4eSSatish Balay 
5929371c9d4SSatish Balay PETSC_EXTERN void petsc_mpi_reduce_(void *sendbuf, void *recvbuf, int *count, int *datatype, int *op, int *root, int *comm, int *ierr) {
593f30578ecSBarry Smith   *ierr = MPI_Reduce(sendbuf, recvbuf, *count, *datatype, *op, *root, *comm);
5943b644628SSatish Balay }
5953b644628SSatish Balay 
5969371c9d4SSatish Balay PETSC_EXTERN void petsc_mpi_allreduce_(void *sendbuf, void *recvbuf, int *count, int *datatype, int *op, int *comm, int *ierr) {
597f30578ecSBarry Smith   *ierr = MPI_Allreduce(sendbuf, recvbuf, *count, *datatype, *op, *comm);
598e5c89e4eSSatish Balay }
599e5c89e4eSSatish Balay 
6009371c9d4SSatish Balay PETSC_EXTERN void petsc_mpi_barrier_(MPI_Comm *comm, int *ierr) {
601e5c89e4eSSatish Balay   *ierr = MPI_SUCCESS;
602e5c89e4eSSatish Balay }
603f7c6e6aaSSatish Balay 
6049371c9d4SSatish Balay PETSC_EXTERN void petsc_mpi_bcast_(void *buf, int *count, int *datatype, int *root, int *comm, int *ierr) {
605e5c89e4eSSatish Balay   *ierr = MPI_SUCCESS;
606e5c89e4eSSatish Balay }
607f7c6e6aaSSatish Balay 
6089371c9d4SSatish Balay PETSC_EXTERN void petsc_mpi_gather_(void *sendbuf, int *scount, int *sdatatype, void *recvbuf, int *rcount, int *rdatatype, int *root, int *comm, int *ierr) {
609f30578ecSBarry Smith   *ierr = MPI_Gather(sendbuf, *scount, *sdatatype, recvbuf, rcount, rdatatype, *root, *comm);
610f7c6e6aaSSatish Balay }
611f7c6e6aaSSatish Balay 
6129371c9d4SSatish Balay PETSC_EXTERN void petsc_mpi_allgather_(void *sendbuf, int *scount, int *sdatatype, void *recvbuf, int *rcount, int *rdatatype, int *comm, int *ierr) {
613f30578ecSBarry Smith   *ierr = MPI_Allgather(sendbuf, *scount, *sdatatype, recvbuf, rcount, rdatatype, *comm);
614e5c89e4eSSatish Balay }
615e5c89e4eSSatish Balay 
6169371c9d4SSatish Balay PETSC_EXTERN void petsc_mpi_scan_(void *sendbuf, void *recvbuf, int *count, int *datatype, int *op, int *comm, int *ierr) {
6171a589b05SJed Brown   *ierr = MPIUNI_Memcpy(recvbuf, sendbuf, (*count) * MPI_sizeof(*datatype));
6183b644628SSatish Balay }
6193b644628SSatish Balay 
6209371c9d4SSatish Balay PETSC_EXTERN void petsc_mpi_send_(void *buf, int *count, int *datatype, int *dest, int *tag, int *comm, int *ierr) {
62106df1fb1SBarry Smith   *ierr = MPIUni_Abort(MPI_COMM_WORLD, 0);
6221086b069SSatish Balay }
6231086b069SSatish Balay 
6249371c9d4SSatish Balay PETSC_EXTERN void petsc_mpi_recv_(void *buf, int *count, int *datatype, int *source, int *tag, int *comm, int status, int *ierr) {
62506df1fb1SBarry Smith   *ierr = MPIUni_Abort(MPI_COMM_WORLD, 0);
6261086b069SSatish Balay }
6271086b069SSatish Balay 
6289371c9d4SSatish Balay PETSC_EXTERN void petsc_mpi_reduce_scatter_(void *sendbuf, void *recvbuf, int *recvcounts, int *datatype, int *op, int *comm, int *ierr) {
62906df1fb1SBarry Smith   *ierr = MPIUni_Abort(MPI_COMM_WORLD, 0);
630156bc490SSatish Balay }
631156bc490SSatish Balay 
6329371c9d4SSatish Balay PETSC_EXTERN void petsc_mpi_irecv_(void *buf, int *count, int *datatype, int *source, int *tag, int *comm, int *request, int *ierr) {
63306df1fb1SBarry Smith   *ierr = MPIUni_Abort(MPI_COMM_WORLD, 0);
634156bc490SSatish Balay }
635156bc490SSatish Balay 
6369371c9d4SSatish Balay PETSC_EXTERN void petsc_mpi_isend_(void *buf, int *count, int *datatype, int *dest, int *tag, int *comm, int *request, int *ierr) {
63706df1fb1SBarry Smith   *ierr = MPIUni_Abort(MPI_COMM_WORLD, 0);
638156bc490SSatish Balay }
639156bc490SSatish Balay 
6409371c9d4SSatish Balay 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) {
6411a589b05SJed Brown   *ierr = MPIUNI_Memcpy(recvbuf, sendbuf, (*sendcount) * MPI_sizeof(*sendtype));
642156bc490SSatish Balay }
643156bc490SSatish Balay 
6449371c9d4SSatish Balay PETSC_EXTERN void petsc_mpi_test_(int *request, int *flag, int *status, int *ierr) {
64506df1fb1SBarry Smith   *ierr = MPIUni_Abort(MPI_COMM_WORLD, 0);
646156bc490SSatish Balay }
647156bc490SSatish Balay 
6489371c9d4SSatish Balay PETSC_EXTERN void petsc_mpi_waitall_(int *count, int *array_of_requests, int *array_of_statuses, int *ierr) {
649156bc490SSatish Balay   *ierr = MPI_SUCCESS;
650156bc490SSatish Balay }
651156bc490SSatish Balay 
6529371c9d4SSatish Balay PETSC_EXTERN void petsc_mpi_waitany_(int *count, int *array_of_requests, int *index, int *status, int *ierr) {
653156bc490SSatish Balay   *ierr = MPI_SUCCESS;
654156bc490SSatish Balay }
655156bc490SSatish Balay 
6569371c9d4SSatish Balay PETSC_EXTERN void petsc_mpi_allgatherv_(void *sendbuf, int *sendcount, int *sendtype, void *recvbuf, int *recvcounts, int *displs, int *recvtype, int *comm, int *ierr) {
657f30578ecSBarry Smith   *ierr = MPI_Allgatherv(sendbuf, *sendcount, *sendtype, recvbuf, recvcounts, displs, *recvtype, *comm);
658156bc490SSatish Balay }
659156bc490SSatish Balay 
6609371c9d4SSatish Balay 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) {
661f30578ecSBarry Smith   *ierr = MPI_Alltoallv(sendbuf, sendcounts, sdispls, *sendtype, recvbuf, recvcounts, rdispls, *recvtype, *comm);
662156bc490SSatish Balay }
663156bc490SSatish Balay 
6649371c9d4SSatish Balay PETSC_EXTERN void petsc_mpi_comm_create_(int *comm, int *group, int *newcomm, int *ierr) {
665156bc490SSatish Balay   *newcomm = *comm;
666156bc490SSatish Balay   *ierr    = MPI_SUCCESS;
667156bc490SSatish Balay }
668156bc490SSatish Balay 
6699371c9d4SSatish Balay PETSC_EXTERN void petsc_mpi_address_(void *location, MPI_Aint *address, int *ierr) {
67099256852SLisandro Dalcin   *address = (MPI_Aint)((char *)location);
671156bc490SSatish Balay   *ierr    = MPI_SUCCESS;
672156bc490SSatish Balay }
673156bc490SSatish Balay 
6749371c9d4SSatish Balay PETSC_EXTERN void petsc_mpi_pack_(void *inbuf, int *incount, int *datatype, void *outbuf, int *outsize, int *position, int *comm, int *ierr) {
67506df1fb1SBarry Smith   *ierr = MPIUni_Abort(MPI_COMM_WORLD, 0);
676156bc490SSatish Balay }
677156bc490SSatish Balay 
6789371c9d4SSatish Balay PETSC_EXTERN void petsc_mpi_unpack_(void *inbuf, int *insize, int *position, void *outbuf, int *outcount, int *datatype, int *comm, int *ierr) {
67906df1fb1SBarry Smith   *ierr = MPIUni_Abort(MPI_COMM_WORLD, 0);
680156bc490SSatish Balay }
681156bc490SSatish Balay 
6829371c9d4SSatish Balay PETSC_EXTERN void petsc_mpi_pack_size_(int *incount, int *datatype, int *comm, int *size, int *ierr) {
68306df1fb1SBarry Smith   *ierr = MPIUni_Abort(MPI_COMM_WORLD, 0);
684156bc490SSatish Balay }
685156bc490SSatish Balay 
6869371c9d4SSatish Balay 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) {
68706df1fb1SBarry Smith   *ierr = MPIUni_Abort(MPI_COMM_WORLD, 0);
688156bc490SSatish Balay }
689156bc490SSatish Balay 
6909371c9d4SSatish Balay PETSC_EXTERN void petsc_mpi_type_commit_(int *datatype, int *ierr) {
691156bc490SSatish Balay   *ierr = MPI_SUCCESS;
692156bc490SSatish Balay }
693156bc490SSatish Balay 
6949371c9d4SSatish Balay double petsc_mpi_wtime_(void) {
695156bc490SSatish Balay   return 0.0;
696f8f52c7dSSatish Balay }
697156bc490SSatish Balay 
6989371c9d4SSatish Balay PETSC_EXTERN void petsc_mpi_cancel_(int *request, int *ierr) {
699f8f52c7dSSatish Balay   *ierr = MPI_SUCCESS;
700f8f52c7dSSatish Balay }
701f8f52c7dSSatish Balay 
7029371c9d4SSatish Balay PETSC_EXTERN void petsc_mpi_comm_dup_(int *comm, int *out, int *ierr) {
703f8f52c7dSSatish Balay   *out  = *comm;
704f8f52c7dSSatish Balay   *ierr = MPI_SUCCESS;
705f8f52c7dSSatish Balay }
706f8f52c7dSSatish Balay 
7079371c9d4SSatish Balay PETSC_EXTERN void petsc_mpi_comm_free_(int *comm, int *ierr) {
708f8f52c7dSSatish Balay   *ierr = MPI_SUCCESS;
709f8f52c7dSSatish Balay }
710f8f52c7dSSatish Balay 
7119371c9d4SSatish Balay PETSC_EXTERN void petsc_mpi_get_count_(int *status, int *datatype, int *count, int *ierr) {
71206df1fb1SBarry Smith   *ierr = MPIUni_Abort(MPI_COMM_WORLD, 0);
713f8f52c7dSSatish Balay }
714f8f52c7dSSatish Balay 
7159371c9d4SSatish Balay PETSC_EXTERN void petsc_mpi_get_processor_name_(char *name, int *result_len, int *ierr, PETSC_FORTRAN_CHARLEN_T len) {
716f8f52c7dSSatish Balay   MPIUNI_Memcpy(name, "localhost", 9 * sizeof(char));
717f8f52c7dSSatish Balay   *result_len = 9;
718f8f52c7dSSatish Balay   *ierr       = MPI_SUCCESS;
719f8f52c7dSSatish Balay }
720f8f52c7dSSatish Balay 
7219371c9d4SSatish Balay PETSC_EXTERN void petsc_mpi_initialized_(int *flag, int *ierr) {
722f8f52c7dSSatish Balay   *flag = MPI_was_initialized;
723f8f52c7dSSatish Balay   *ierr = MPI_SUCCESS;
724f8f52c7dSSatish Balay }
725f8f52c7dSSatish Balay 
7269371c9d4SSatish Balay PETSC_EXTERN void petsc_mpi_iprobe_(int *source, int *tag, int *comm, int *glag, int *status, int *ierr) {
727f8f52c7dSSatish Balay   *ierr = MPI_SUCCESS;
728f8f52c7dSSatish Balay }
729f8f52c7dSSatish Balay 
7309371c9d4SSatish Balay PETSC_EXTERN void petsc_mpi_probe_(int *source, int *tag, int *comm, int *flag, int *status, int *ierr) {
731f8f52c7dSSatish Balay   *ierr = MPI_SUCCESS;
732f8f52c7dSSatish Balay }
733f8f52c7dSSatish Balay 
7349371c9d4SSatish Balay PETSC_EXTERN void petsc_mpi_request_free_(int *request, int *ierr) {
735f8f52c7dSSatish Balay   *ierr = MPI_SUCCESS;
736f8f52c7dSSatish Balay }
737f8f52c7dSSatish Balay 
7389371c9d4SSatish Balay PETSC_EXTERN void petsc_mpi_ssend_(void *buf, int *count, int *datatype, int *dest, int *tag, int *comm, int *ierr) {
73906df1fb1SBarry Smith   *ierr = MPIUni_Abort(MPI_COMM_WORLD, 0);
740f8f52c7dSSatish Balay }
741f8f52c7dSSatish Balay 
7429371c9d4SSatish Balay PETSC_EXTERN void petsc_mpi_wait_(int *request, int *status, int *ierr) {
743f8f52c7dSSatish Balay   *ierr = MPI_SUCCESS;
744156bc490SSatish Balay }
745156bc490SSatish Balay 
7469371c9d4SSatish Balay PETSC_EXTERN void petsc_mpi_comm_group_(int *comm, int *group, int *ierr) {
747d4816372SSatish Balay   *ierr = MPI_SUCCESS;
748d4816372SSatish Balay }
749d4816372SSatish Balay 
7509371c9d4SSatish Balay PETSC_EXTERN void petsc_mpi_exscan_(void *sendbuf, void *recvbuf, int *count, int *datatype, int *op, int *comm, int *ierr) {
751d4816372SSatish Balay   *ierr = MPI_SUCCESS;
752d4816372SSatish Balay }
753d4816372SSatish Balay 
754a7b85bbcSSatish Balay #endif /* PETSC_HAVE_FORTRAN */
755c8217ed5SSatish Balay 
756e5c89e4eSSatish Balay #if defined(__cplusplus)
757e5c89e4eSSatish Balay }
758e5c89e4eSSatish Balay #endif
759