xref: /petsc/src/sys/mpiuni/mpi.c (revision 36f0be53e0644c7a79c5d6ccee4c1a28cdf94d67)
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>
6c9b973beSBarry Smith #if !defined(MPIUNI_H)
74423d37eSSatish Balay #error "Wrong mpi.h included! require mpi.h from MPIUNI"
84423d37eSSatish Balay #endif
9e5c89e4eSSatish Balay 
1005035670SJunchao Zhang #include <petsc/private/petscimpl.h> /* for PetscCUPMInitialized */
1105035670SJunchao Zhang 
12a4af0ceeSJacob Faibussowitsch #if defined(PETSC_HAVE_CUDA) || defined(PETSC_HAVE_HIP)
13a4af0ceeSJacob Faibussowitsch #include <petscdevice.h>
146e42a002SJunchao Zhang #endif
156e42a002SJunchao Zhang 
16e5c89e4eSSatish Balay #define MPI_SUCCESS 0
17e5c89e4eSSatish Balay #define MPI_FAILURE 1
18a297a907SKarl Rupp 
1999256852SLisandro Dalcin void *MPIUNI_TMP = NULL;
2099256852SLisandro Dalcin 
21e5c89e4eSSatish Balay /*
22100f28aeSBarry Smith        With MPI Uni there are exactly four distinct communicators:
23100f28aeSBarry Smith     MPI_COMM_SELF, MPI_COMM_WORLD, and a MPI_Comm_dup() of each of these (duplicates of duplicates return the same communictor)
24100f28aeSBarry Smith 
25100f28aeSBarry Smith     MPI_COMM_SELF and MPI_COMM_WORLD are MPI_Comm_free() in MPI_Finalize() but in general with PETSc,
26100f28aeSBarry Smith      the other communicators are freed once the last PETSc object is freed (before MPI_Finalize()).
27100f28aeSBarry Smith 
28e5c89e4eSSatish Balay */
291ca36541SSatish Balay #define MAX_ATTR 256
30fb53af6bSBarry Smith #define MAX_COMM 128
31fb53af6bSBarry Smith 
32e5c89e4eSSatish Balay typedef struct {
33e5c89e4eSSatish Balay   void *attribute_val;
34e5c89e4eSSatish Balay   int   active;
35e5c89e4eSSatish Balay } MPI_Attr;
36e5c89e4eSSatish Balay 
3746651e72SBarry Smith typedef struct {
3846651e72SBarry Smith   void                *extra_state;
3946651e72SBarry Smith   MPI_Delete_function *del;
40f0463fa0SJunchao Zhang   int                  active; /* Is this keyval in use by some comm? */
4146651e72SBarry Smith } MPI_Attr_keyval;
4246651e72SBarry Smith 
4346651e72SBarry Smith static MPI_Attr_keyval attr_keyval[MAX_ATTR];
44fb53af6bSBarry Smith static MPI_Attr        attr[MAX_COMM][MAX_ATTR];
45f0463fa0SJunchao Zhang static int             comm_active[MAX_COMM]; /* Boolean array indicating which comms are in use */
46f0463fa0SJunchao Zhang static int             mpi_tag_ub           = 100000000;
47f0463fa0SJunchao Zhang static int             num_attr             = 1; /* Maximal number of keyvals/attributes ever created, including the predefined MPI_TAG_UB attribute. */
48f0463fa0SJunchao Zhang static int             MaxComm              = 2; /* Maximal number of communicators ever created, including comm_self(1), comm_world(2), but not comm_null(0) */
4952ecd5ffSSatish Balay static void           *MPIUNIF_mpi_in_place = 0;
50e5c89e4eSSatish Balay 
51f0463fa0SJunchao 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[][] */
52f0463fa0SJunchao Zhang 
53e5c89e4eSSatish Balay #if defined(__cplusplus)
54e5c89e4eSSatish Balay extern "C" {
55e5c89e4eSSatish Balay #endif
56e5c89e4eSSatish Balay 
57e5c89e4eSSatish Balay /*
58e5c89e4eSSatish Balay    To avoid problems with prototypes to the system memcpy() it is duplicated here
59e5c89e4eSSatish Balay */
609371c9d4SSatish Balay int MPIUNI_Memcpy(void *dst, const void *src, int n) {
616e42a002SJunchao Zhang   if (dst == MPI_IN_PLACE || dst == MPIUNIF_mpi_in_place) return MPI_SUCCESS;
626e42a002SJunchao Zhang   if (src == MPI_IN_PLACE || src == MPIUNIF_mpi_in_place) return MPI_SUCCESS;
636e42a002SJunchao Zhang   if (!n) return MPI_SUCCESS;
64e5c89e4eSSatish Balay 
6505035670SJunchao Zhang     /* GPU-aware MPIUNI. Use synchronous copy per MPI semantics */
6605035670SJunchao Zhang #if defined(PETSC_HAVE_CUDA)
679371c9d4SSatish Balay   if (PetscDeviceInitialized(PETSC_DEVICE_CUDA)) {
689371c9d4SSatish Balay     cudaError_t cerr = cudaMemcpy(dst, src, n, cudaMemcpyDefault);
699371c9d4SSatish Balay     if (cerr != cudaSuccess) return MPI_FAILURE;
709371c9d4SSatish Balay   } else
7105035670SJunchao Zhang #elif defined(PETSC_HAVE_HIP)
729371c9d4SSatish Balay   if (PetscDeviceInitialized(PETSC_DEVICE_HIP)) {
739371c9d4SSatish Balay     hipError_t cerr = hipMemcpy(dst, src, n, hipMemcpyDefault);
749371c9d4SSatish Balay     if (cerr != hipSuccess) return MPI_FAILURE;
759371c9d4SSatish Balay   } else
76a6191124SJunchao Zhang #endif
779371c9d4SSatish Balay   {
789371c9d4SSatish Balay     memcpy(dst, src, n);
799371c9d4SSatish Balay   }
8099256852SLisandro Dalcin   return MPI_SUCCESS;
81e5c89e4eSSatish Balay }
82e5c89e4eSSatish Balay 
8312801b39SBarry Smith static int classcnt = 0;
8412801b39SBarry Smith static int codecnt  = 0;
8512801b39SBarry Smith 
869371c9d4SSatish Balay int MPI_Add_error_class(int *cl) {
8712801b39SBarry Smith   *cl = classcnt++;
8812801b39SBarry Smith   return MPI_SUCCESS;
8912801b39SBarry Smith }
9012801b39SBarry Smith 
919371c9d4SSatish Balay int MPI_Add_error_code(int cl, int *co) {
9212801b39SBarry Smith   if (cl >= classcnt) return MPI_FAILURE;
9312801b39SBarry Smith   *co = codecnt++;
9412801b39SBarry Smith   return MPI_SUCCESS;
9512801b39SBarry Smith }
9612801b39SBarry Smith 
979371c9d4SSatish Balay int MPI_Type_get_envelope(MPI_Datatype datatype, int *num_integers, int *num_addresses, int *num_datatypes, int *combiner) {
981a589b05SJed Brown   int comb = datatype >> 28;
991a589b05SJed Brown   switch (comb) {
1001a589b05SJed Brown   case MPI_COMBINER_NAMED:
1011a589b05SJed Brown     *num_integers  = 0;
1021a589b05SJed Brown     *num_addresses = 0;
1031a589b05SJed Brown     *num_datatypes = 0;
1041a589b05SJed Brown     *combiner      = comb;
1051a589b05SJed Brown     break;
1061a589b05SJed Brown   case MPI_COMBINER_DUP:
1071a589b05SJed Brown     *num_integers  = 0;
1081a589b05SJed Brown     *num_addresses = 0;
1091a589b05SJed Brown     *num_datatypes = 1;
1101a589b05SJed Brown     *combiner      = comb;
1111a589b05SJed Brown     break;
1121a589b05SJed Brown   case MPI_COMBINER_CONTIGUOUS:
1131a589b05SJed Brown     *num_integers  = 1;
1141a589b05SJed Brown     *num_addresses = 0;
1151a589b05SJed Brown     *num_datatypes = 1;
1161a589b05SJed Brown     *combiner      = comb;
1171a589b05SJed Brown     break;
1189371c9d4SSatish Balay   default: return MPIUni_Abort(MPI_COMM_SELF, 1);
1191a589b05SJed Brown   }
12099256852SLisandro Dalcin   return MPI_SUCCESS;
1211a589b05SJed Brown }
1221a589b05SJed Brown 
1239371c9d4SSatish 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) {
1241a589b05SJed Brown   int comb = datatype >> 28;
1251a589b05SJed Brown   switch (comb) {
1269371c9d4SSatish Balay   case MPI_COMBINER_NAMED: return MPIUni_Abort(MPI_COMM_SELF, 1);
1271a589b05SJed Brown   case MPI_COMBINER_DUP:
1281a589b05SJed Brown     if (max_datatypes < 1) return MPIUni_Abort(MPI_COMM_SELF, 1);
1291a589b05SJed Brown     array_of_datatypes[0] = datatype & 0x0fffffff;
1301a589b05SJed Brown     break;
1311a589b05SJed Brown   case MPI_COMBINER_CONTIGUOUS:
1321a589b05SJed Brown     if (max_integers < 1 || max_datatypes < 1) return MPIUni_Abort(MPI_COMM_SELF, 1);
1331a589b05SJed Brown     array_of_integers[0]  = (datatype >> 8) & 0xfff;         /* count */
1341a589b05SJed Brown     array_of_datatypes[0] = (datatype & 0x0ff000ff) | 0x100; /* basic named type (count=1) from which the contiguous type is derived */
1351a589b05SJed Brown     break;
1369371c9d4SSatish Balay   default: return MPIUni_Abort(MPI_COMM_SELF, 1);
1371a589b05SJed Brown   }
13899256852SLisandro Dalcin   return MPI_SUCCESS;
1391a589b05SJed Brown }
1401a589b05SJed Brown 
141e5c89e4eSSatish Balay /*
142e5c89e4eSSatish Balay    Used to set the built-in MPI_TAG_UB attribute
143e5c89e4eSSatish Balay */
1449371c9d4SSatish Balay static int Keyval_setup(void) {
145f0463fa0SJunchao Zhang   attr[CommIdx(MPI_COMM_WORLD)][0].active        = 1;
146f0463fa0SJunchao Zhang   attr[CommIdx(MPI_COMM_WORLD)][0].attribute_val = &mpi_tag_ub;
147f0463fa0SJunchao Zhang   attr[CommIdx(MPI_COMM_SELF)][0].active         = 1;
148f0463fa0SJunchao Zhang   attr[CommIdx(MPI_COMM_SELF)][0].attribute_val  = &mpi_tag_ub;
149f0463fa0SJunchao Zhang   attr_keyval[0].active                          = 1;
15099256852SLisandro Dalcin   return MPI_SUCCESS;
151e5c89e4eSSatish Balay }
152e5c89e4eSSatish Balay 
1539371c9d4SSatish Balay int MPI_Comm_create_keyval(MPI_Copy_function *copy_fn, MPI_Delete_function *delete_fn, int *keyval, void *extra_state) {
154f0463fa0SJunchao Zhang   int i, keyid;
155f0463fa0SJunchao Zhang   for (i = 1; i < num_attr; i++) { /* the first attribute is always in use */
156f0463fa0SJunchao Zhang     if (!attr_keyval[i].active) {
157f0463fa0SJunchao Zhang       keyid = i;
158f0463fa0SJunchao Zhang       goto found;
159f0463fa0SJunchao Zhang     }
160f0463fa0SJunchao Zhang   }
1619cf9c1dbSJed Brown   if (num_attr >= MAX_ATTR) return MPIUni_Abort(MPI_COMM_WORLD, 1);
162f0463fa0SJunchao Zhang   keyid = num_attr++;
163e5c89e4eSSatish Balay 
164f0463fa0SJunchao Zhang found:
165f0463fa0SJunchao Zhang   attr_keyval[keyid].extra_state = extra_state;
166f0463fa0SJunchao Zhang   attr_keyval[keyid].del         = delete_fn;
167f0463fa0SJunchao Zhang   attr_keyval[keyid].active      = 1;
168f0463fa0SJunchao Zhang   *keyval                        = keyid;
16999256852SLisandro Dalcin   return MPI_SUCCESS;
170e5c89e4eSSatish Balay }
171e5c89e4eSSatish Balay 
172*36f0be53SJacob Faibussowitsch /*
173*36f0be53SJacob Faibussowitsch   The reference counting business is here to guard against the following:
174*36f0be53SJacob Faibussowitsch 
175*36f0be53SJacob Faibussowitsch   MPI_Comm_set_attr(comm, keyval, some_attr);
176*36f0be53SJacob Faibussowitsch   MPI_Comm_free_keyval(&keyval);
177*36f0be53SJacob Faibussowitsch   MPI_Comm_free(&comm);
178*36f0be53SJacob Faibussowitsch 
179*36f0be53SJacob Faibussowitsch   Here MPI_Comm_free() will try to destroy all of the attributes of the comm, and hence we
180*36f0be53SJacob Faibussowitsch   should not clear the deleter or extra_state until all communicators that have the attribute
181*36f0be53SJacob Faibussowitsch   set are either freed or have given up their attribute.
182*36f0be53SJacob Faibussowitsch 
183*36f0be53SJacob Faibussowitsch   The attribute reference count is INCREASED in:
184*36f0be53SJacob Faibussowitsch   - MPI_Comm_create_keyval()
185*36f0be53SJacob Faibussowitsch   - MPI_Comm_set_attr()
186*36f0be53SJacob Faibussowitsch 
187*36f0be53SJacob Faibussowitsch   The atrtibute reference count is DECREASED in:
188*36f0be53SJacob Faibussowitsch   - MPI_Comm_free_keyval()
189*36f0be53SJacob Faibussowitsch   - MPI_Comm_delete_attr() (but only if the comm has the attribute)
190*36f0be53SJacob Faibussowitsch */
191*36f0be53SJacob Faibussowitsch static int MPI_Attr_dereference_keyval(int keyval) {
192*36f0be53SJacob Faibussowitsch   if (--(attr_keyval[keyval].active) <= 0) {
193*36f0be53SJacob Faibussowitsch     attr_keyval[keyval].extra_state = 0;
194*36f0be53SJacob Faibussowitsch     attr_keyval[keyval].del         = 0;
195*36f0be53SJacob Faibussowitsch   }
196*36f0be53SJacob Faibussowitsch   return MPI_SUCCESS;
197*36f0be53SJacob Faibussowitsch }
198*36f0be53SJacob Faibussowitsch 
199*36f0be53SJacob Faibussowitsch static int MPI_Attr_reference_keyval(int keyval) {
200*36f0be53SJacob Faibussowitsch   ++(attr_keyval[keyval].active);
201*36f0be53SJacob Faibussowitsch   return MPI_SUCCESS;
202*36f0be53SJacob Faibussowitsch }
203*36f0be53SJacob Faibussowitsch 
2049371c9d4SSatish Balay int MPI_Comm_free_keyval(int *keyval) {
205*36f0be53SJacob Faibussowitsch   int ret;
206*36f0be53SJacob Faibussowitsch 
207*36f0be53SJacob Faibussowitsch   if (*keyval < 0 || *keyval >= num_attr) return MPI_FAILURE;
208*36f0be53SJacob Faibussowitsch   if ((ret = MPI_Attr_dereference_keyval(*keyval))) return ret;
209a246e310SBarry Smith   *keyval = 0;
210e5c89e4eSSatish Balay   return MPI_SUCCESS;
211e5c89e4eSSatish Balay }
212e5c89e4eSSatish Balay 
2139371c9d4SSatish Balay int MPI_Comm_set_attr(MPI_Comm comm, int keyval, void *attribute_val) {
214*36f0be53SJacob Faibussowitsch   int idx = CommIdx(comm), ret;
215f0463fa0SJunchao Zhang   if (comm < 1 || comm > MaxComm) return MPI_FAILURE;
216*36f0be53SJacob Faibussowitsch   if (keyval < 0 || keyval >= num_attr) return MPI_FAILURE;
217*36f0be53SJacob Faibussowitsch 
218*36f0be53SJacob Faibussowitsch   if ((ret = MPI_Comm_delete_attr(comm, keyval))) return ret;
219*36f0be53SJacob Faibussowitsch   if ((ret = MPI_Attr_reference_keyval(keyval))) return ret;
220f0463fa0SJunchao Zhang   attr[idx][keyval].active        = 1;
221f0463fa0SJunchao Zhang   attr[idx][keyval].attribute_val = attribute_val;
222e5c89e4eSSatish Balay   return MPI_SUCCESS;
223e5c89e4eSSatish Balay }
224e5c89e4eSSatish Balay 
2259371c9d4SSatish Balay int MPI_Comm_delete_attr(MPI_Comm comm, int keyval) {
226f0463fa0SJunchao Zhang   int idx = CommIdx(comm);
227f0463fa0SJunchao Zhang   if (comm < 1 || comm > MaxComm) return MPI_FAILURE;
228*36f0be53SJacob Faibussowitsch   if (keyval < 0 || keyval >= num_attr) return MPI_FAILURE;
229*36f0be53SJacob Faibussowitsch   if (attr[idx][keyval].active) {
230*36f0be53SJacob Faibussowitsch     int   ret;
231f0463fa0SJunchao Zhang     void *save_attribute_val = attr[idx][keyval].attribute_val;
232*36f0be53SJacob Faibussowitsch 
233f0463fa0SJunchao Zhang     attr[idx][keyval].active        = 0;
234f0463fa0SJunchao Zhang     attr[idx][keyval].attribute_val = 0;
235*36f0be53SJacob Faibussowitsch     if (attr_keyval[keyval].del) {
236*36f0be53SJacob Faibussowitsch       if ((ret = (*(attr_keyval[keyval].del))(comm, keyval, save_attribute_val, attr_keyval[keyval].extra_state))) return ret;
237*36f0be53SJacob Faibussowitsch     }
238*36f0be53SJacob Faibussowitsch     if ((ret = MPI_Attr_dereference_keyval(keyval))) return ret;
23940776e1bSpetsc   }
240e5c89e4eSSatish Balay   return MPI_SUCCESS;
241e5c89e4eSSatish Balay }
242e5c89e4eSSatish Balay 
2439371c9d4SSatish Balay int MPI_Comm_get_attr(MPI_Comm comm, int keyval, void *attribute_val, int *flag) {
244f0463fa0SJunchao Zhang   int idx = CommIdx(comm);
245f0463fa0SJunchao Zhang   if (comm < 1 || comm > MaxComm) return MPI_FAILURE;
246e5c89e4eSSatish Balay   if (!keyval) Keyval_setup();
247f0463fa0SJunchao Zhang   *flag                   = attr[idx][keyval].active;
248f0463fa0SJunchao Zhang   *(void **)attribute_val = attr[idx][keyval].attribute_val;
249e5c89e4eSSatish Balay   return MPI_SUCCESS;
250e5c89e4eSSatish Balay }
251e5c89e4eSSatish Balay 
2529371c9d4SSatish Balay static char all_comm_names[MAX_COMM][MPI_MAX_OBJECT_NAME] = {"MPI_COMM_SELF", "MPI_COMM_WORLD"};
2533e1d142dSJacob Faibussowitsch 
2549371c9d4SSatish Balay int MPI_Comm_get_name(MPI_Comm comm, char *comm_name, int *resultlen) {
2553e1d142dSJacob Faibussowitsch   if (comm < 1 || comm > MaxComm) return MPI_FAILURE;
2563e1d142dSJacob Faibussowitsch   if (!comm_name || !resultlen) return MPI_FAILURE;
2573e1d142dSJacob Faibussowitsch   strncpy(comm_name, all_comm_names[CommIdx(comm)], MPI_MAX_OBJECT_NAME - 1);
2583e1d142dSJacob Faibussowitsch   *resultlen = (int)strlen(comm_name);
2593e1d142dSJacob Faibussowitsch   return MPI_SUCCESS;
2603e1d142dSJacob Faibussowitsch }
2613e1d142dSJacob Faibussowitsch 
2629371c9d4SSatish Balay int MPI_Comm_set_name(MPI_Comm comm, const char *comm_name) {
2633e1d142dSJacob Faibussowitsch   if (comm < 1 || comm > MaxComm) return MPI_FAILURE;
2643e1d142dSJacob Faibussowitsch   if (!comm_name) return MPI_FAILURE;
2653e1d142dSJacob Faibussowitsch   if (strlen(comm_name) > MPI_MAX_OBJECT_NAME - 1) return MPI_FAILURE;
2663e1d142dSJacob Faibussowitsch   strncpy(all_comm_names[CommIdx(comm)], comm_name, MPI_MAX_OBJECT_NAME - 1);
2673e1d142dSJacob Faibussowitsch   return MPI_SUCCESS;
2683e1d142dSJacob Faibussowitsch }
2693e1d142dSJacob Faibussowitsch 
2709371c9d4SSatish Balay int MPI_Comm_create(MPI_Comm comm, MPI_Group group, MPI_Comm *newcomm) {
271f60917d2SBarry Smith   int j;
272f0463fa0SJunchao Zhang   if (comm < 1 || comm > MaxComm) return MPI_FAILURE;
273f0463fa0SJunchao Zhang   for (j = 3; j <= MaxComm; j++) {
274f0463fa0SJunchao Zhang     if (!comm_active[CommIdx(j)]) {
275f0463fa0SJunchao Zhang       comm_active[CommIdx(j)] = 1;
276f60917d2SBarry Smith       *newcomm                = j;
277f60917d2SBarry Smith       return MPI_SUCCESS;
278f60917d2SBarry Smith     }
279f60917d2SBarry Smith   }
280f0463fa0SJunchao Zhang   if (MaxComm >= MAX_COMM) return MPI_FAILURE;
281f0463fa0SJunchao Zhang   *newcomm                       = ++MaxComm;
282f0463fa0SJunchao Zhang   comm_active[CommIdx(*newcomm)] = 1;
283c8217ed5SSatish Balay   return MPI_SUCCESS;
284c8217ed5SSatish Balay }
285c8217ed5SSatish Balay 
2869371c9d4SSatish Balay int MPI_Comm_dup(MPI_Comm comm, MPI_Comm *out) {
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       *out                    = j;
293f60917d2SBarry Smith       return MPI_SUCCESS;
294f60917d2SBarry Smith     }
295f60917d2SBarry Smith   }
296f0463fa0SJunchao Zhang   if (MaxComm >= MAX_COMM) return MPI_FAILURE;
297f0463fa0SJunchao Zhang   *out                       = ++MaxComm;
298f0463fa0SJunchao Zhang   comm_active[CommIdx(*out)] = 1;
29999256852SLisandro Dalcin   return MPI_SUCCESS;
300e5c89e4eSSatish Balay }
301e5c89e4eSSatish Balay 
3029371c9d4SSatish Balay int MPI_Comm_free(MPI_Comm *comm) {
303f0463fa0SJunchao Zhang   int idx = CommIdx(*comm);
304e5c89e4eSSatish Balay 
305f0463fa0SJunchao Zhang   if (*comm < 1 || *comm > MaxComm) return MPI_FAILURE;
306*36f0be53SJacob Faibussowitsch   for (int i = 0; i < num_attr; i++) {
307*36f0be53SJacob Faibussowitsch     int ret = MPI_Comm_delete_attr(*comm, i);
308*36f0be53SJacob Faibussowitsch 
309*36f0be53SJacob Faibussowitsch     if (ret) return ret;
310e5c89e4eSSatish Balay   }
311f0463fa0SJunchao Zhang   if (*comm >= 3) comm_active[idx] = 0;
312100f28aeSBarry Smith   *comm = 0;
313e5c89e4eSSatish Balay   return MPI_SUCCESS;
314e5c89e4eSSatish Balay }
315e5c89e4eSSatish Balay 
3169371c9d4SSatish Balay int MPI_Comm_size(MPI_Comm comm, int *size) {
317f0463fa0SJunchao Zhang   if (comm < 1 || comm > MaxComm) return MPI_FAILURE;
318d393f697SSatish Balay   *size = 1;
319d393f697SSatish Balay   return MPI_SUCCESS;
320d393f697SSatish Balay }
321d393f697SSatish Balay 
3229371c9d4SSatish Balay int MPI_Comm_rank(MPI_Comm comm, int *rank) {
323f0463fa0SJunchao Zhang   if (comm < 1 || comm > MaxComm) return MPI_FAILURE;
324d393f697SSatish Balay   *rank = 0;
325d393f697SSatish Balay   return MPI_SUCCESS;
326d393f697SSatish Balay }
327d393f697SSatish Balay 
3289371c9d4SSatish Balay int MPIUni_Abort(MPI_Comm comm, int errorcode) {
32906df1fb1SBarry Smith   printf("MPI operation not supported by PETSc's sequential MPI wrappers\n");
330b3f11779SBarry Smith   return MPI_ERR_NOSUPPORT;
33106df1fb1SBarry Smith }
33206df1fb1SBarry Smith 
3339371c9d4SSatish Balay int MPI_Abort(MPI_Comm comm, int errorcode) {
334e5c89e4eSSatish Balay   abort();
335e5c89e4eSSatish Balay   return MPI_SUCCESS;
336e5c89e4eSSatish Balay }
337e5c89e4eSSatish Balay 
33858cd72c3SLisandro Dalcin /* --------------------------------------------------------------------------*/
33958cd72c3SLisandro Dalcin 
340e5c89e4eSSatish Balay static int MPI_was_initialized = 0;
34158cd72c3SLisandro Dalcin static int MPI_was_finalized   = 0;
34258cd72c3SLisandro Dalcin 
3439371c9d4SSatish Balay int MPI_Init(int *argc, char ***argv) {
34499256852SLisandro Dalcin   if (MPI_was_initialized) return MPI_FAILURE;
3459bcf9d5aSJunchao Zhang   /* MPI standard says "once MPI_Finalize returns, no MPI routine (not even MPI_Init) may be called", so an MPI standard compliant
3469bcf9d5aSJunchao Zhang      MPIU should have this 'if (MPI_was_finalized) return MPI_FAILURE;' check. We relax it here to make life easier for users
3479bcf9d5aSJunchao Zhang      of MPIU so that they can do multiple PetscInitialize/Finalize().
3489bcf9d5aSJunchao Zhang   */
3499bcf9d5aSJunchao Zhang   /* if (MPI_was_finalized) return MPI_FAILURE; */
35058cd72c3SLisandro Dalcin   MPI_was_initialized = 1;
3519bcf9d5aSJunchao Zhang   MPI_was_finalized   = 0;
35299256852SLisandro Dalcin   return MPI_SUCCESS;
35358cd72c3SLisandro Dalcin }
35458cd72c3SLisandro Dalcin 
3559371c9d4SSatish Balay int MPI_Init_thread(int *argc, char ***argv, int required, int *provided) {
3569012378cSStefano Zampini   MPI_Query_thread(provided);
3579012378cSStefano Zampini   return MPI_Init(argc, argv);
3589012378cSStefano Zampini }
3599012378cSStefano Zampini 
3609371c9d4SSatish Balay int MPI_Query_thread(int *provided) {
3619012378cSStefano Zampini   *provided = MPI_THREAD_FUNNELED;
3629012378cSStefano Zampini   return MPI_SUCCESS;
3639012378cSStefano Zampini }
3649012378cSStefano Zampini 
3659371c9d4SSatish Balay int MPI_Finalize(void) {
366*36f0be53SJacob Faibussowitsch   if (MPI_was_finalized || !MPI_was_initialized) return MPI_FAILURE;
367*36f0be53SJacob Faibussowitsch   MPI_Comm comm = MPI_COMM_WORLD;
368*36f0be53SJacob Faibussowitsch   int      ret  = MPI_Comm_free(&comm);
369*36f0be53SJacob Faibussowitsch 
370*36f0be53SJacob Faibussowitsch   if (ret) return ret;
371100f28aeSBarry Smith   comm = MPI_COMM_SELF;
372*36f0be53SJacob Faibussowitsch   ret  = MPI_Comm_free(&comm);
373*36f0be53SJacob Faibussowitsch   if (ret) return ret;
374*36f0be53SJacob Faibussowitsch   if (PetscDefined(USE_DEBUG)) {
375*36f0be53SJacob Faibussowitsch     for (int i = 3; i <= MaxComm; ++i) {
376f0463fa0SJunchao Zhang       if (comm_active[CommIdx(i)]) printf("MPIUni warning: MPI communicator %d is not freed before MPI_Finalize()\n", i);
377f0463fa0SJunchao Zhang     }
378*36f0be53SJacob Faibussowitsch 
379*36f0be53SJacob Faibussowitsch     for (int i = 1; i <= MaxComm; ++i) {
380*36f0be53SJacob Faibussowitsch       for (int j = 0; j < num_attr; ++j) {
381*36f0be53SJacob Faibussowitsch         if (attr[CommIdx(i)][j].active) printf("MPIUni warning: MPI communicator %d attribute %d was not freed before MPI_Finalize()\n", i, j);
382f0463fa0SJunchao Zhang       }
383*36f0be53SJacob Faibussowitsch     }
384*36f0be53SJacob Faibussowitsch 
385*36f0be53SJacob Faibussowitsch     for (int i = 1; i < num_attr; ++i) {
386*36f0be53SJacob Faibussowitsch       if (attr_keyval[i].active) printf("MPIUni warning: MPI attribute %d was not freed before MPI_Finalize()\n", i);
387*36f0be53SJacob Faibussowitsch     }
388*36f0be53SJacob Faibussowitsch   }
389*36f0be53SJacob Faibussowitsch 
390f0463fa0SJunchao Zhang   /* reset counters */
391f0463fa0SJunchao Zhang   MaxComm             = 2;
392f0463fa0SJunchao Zhang   num_attr            = 1;
39358cd72c3SLisandro Dalcin   MPI_was_finalized   = 1;
3949bcf9d5aSJunchao Zhang   MPI_was_initialized = 0;
3959bcf9d5aSJunchao Zhang   PETSC_COMM_WORLD    = MPI_COMM_NULL;
39699256852SLisandro Dalcin   return MPI_SUCCESS;
39758cd72c3SLisandro Dalcin }
398e5c89e4eSSatish Balay 
3999371c9d4SSatish Balay int MPI_Initialized(int *flag) {
400e5c89e4eSSatish Balay   *flag = MPI_was_initialized;
40199256852SLisandro Dalcin   return MPI_SUCCESS;
402e5c89e4eSSatish Balay }
403e5c89e4eSSatish Balay 
4049371c9d4SSatish Balay int MPI_Finalized(int *flag) {
40558cd72c3SLisandro Dalcin   *flag = MPI_was_finalized;
40699256852SLisandro Dalcin   return MPI_SUCCESS;
407e5c89e4eSSatish Balay }
408e5c89e4eSSatish Balay 
409e5c89e4eSSatish Balay /* -------------------     Fortran versions of several routines ------------------ */
410e5c89e4eSSatish Balay 
411f7c6e6aaSSatish Balay #if defined(PETSC_HAVE_FORTRAN_CAPS)
4120134af2dSBarry Smith #define mpiunisetmoduleblock_         MPIUNISETMODULEBLOCK
41352ecd5ffSSatish Balay #define mpiunisetfortranbasepointers_ MPIUNISETFORTRANBASEPOINTERS
414a7b85bbcSSatish Balay #define petsc_mpi_init_               PETSC_MPI_INIT
415a7b85bbcSSatish Balay #define petsc_mpi_finalize_           PETSC_MPI_FINALIZE
416a7b85bbcSSatish Balay #define petsc_mpi_comm_size_          PETSC_MPI_COMM_SIZE
417a7b85bbcSSatish Balay #define petsc_mpi_comm_rank_          PETSC_MPI_COMM_RANK
418a7b85bbcSSatish Balay #define petsc_mpi_abort_              PETSC_MPI_ABORT
419a7b85bbcSSatish Balay #define petsc_mpi_reduce_             PETSC_MPI_REDUCE
420a7b85bbcSSatish Balay #define petsc_mpi_allreduce_          PETSC_MPI_ALLREDUCE
421a7b85bbcSSatish Balay #define petsc_mpi_barrier_            PETSC_MPI_BARRIER
422a7b85bbcSSatish Balay #define petsc_mpi_bcast_              PETSC_MPI_BCAST
423a7b85bbcSSatish Balay #define petsc_mpi_gather_             PETSC_MPI_GATHER
424a7b85bbcSSatish Balay #define petsc_mpi_allgather_          PETSC_MPI_ALLGATHER
425a7b85bbcSSatish Balay #define petsc_mpi_comm_split_         PETSC_MPI_COMM_SPLIT
426a7b85bbcSSatish Balay #define petsc_mpi_scan_               PETSC_MPI_SCAN
427a7b85bbcSSatish Balay #define petsc_mpi_send_               PETSC_MPI_SEND
428a7b85bbcSSatish Balay #define petsc_mpi_recv_               PETSC_MPI_RECV
429a7b85bbcSSatish Balay #define petsc_mpi_reduce_scatter_     PETSC_MPI_REDUCE_SCATTER
430a7b85bbcSSatish Balay #define petsc_mpi_irecv_              PETSC_MPI_IRECV
431a7b85bbcSSatish Balay #define petsc_mpi_isend_              PETSC_MPI_ISEND
432a7b85bbcSSatish Balay #define petsc_mpi_sendrecv_           PETSC_MPI_SENDRECV
433a7b85bbcSSatish Balay #define petsc_mpi_test_               PETSC_MPI_TEST
434a7b85bbcSSatish Balay #define petsc_mpi_waitall_            PETSC_MPI_WAITALL
435a7b85bbcSSatish Balay #define petsc_mpi_waitany_            PETSC_MPI_WAITANY
436a7b85bbcSSatish Balay #define petsc_mpi_allgatherv_         PETSC_MPI_ALLGATHERV
437a7b85bbcSSatish Balay #define petsc_mpi_alltoallv_          PETSC_MPI_ALLTOALLV
438a7b85bbcSSatish Balay #define petsc_mpi_comm_create_        PETSC_MPI_COMM_CREATE
439a7b85bbcSSatish Balay #define petsc_mpi_address_            PETSC_MPI_ADDRESS
440a7b85bbcSSatish Balay #define petsc_mpi_pack_               PETSC_MPI_PACK
441a7b85bbcSSatish Balay #define petsc_mpi_unpack_             PETSC_MPI_UNPACK
442a7b85bbcSSatish Balay #define petsc_mpi_pack_size_          PETSC_MPI_PACK_SIZE
443a7b85bbcSSatish Balay #define petsc_mpi_type_struct_        PETSC_MPI_TYPE_STRUCT
444a7b85bbcSSatish Balay #define petsc_mpi_type_commit_        PETSC_MPI_TYPE_COMMIT
445a7b85bbcSSatish Balay #define petsc_mpi_wtime_              PETSC_MPI_WTIME
446a7b85bbcSSatish Balay #define petsc_mpi_cancel_             PETSC_MPI_CANCEL
447a7b85bbcSSatish Balay #define petsc_mpi_comm_dup_           PETSC_MPI_COMM_DUP
448a7b85bbcSSatish Balay #define petsc_mpi_comm_free_          PETSC_MPI_COMM_FREE
449a7b85bbcSSatish Balay #define petsc_mpi_get_count_          PETSC_MPI_GET_COUNT
450a7b85bbcSSatish Balay #define petsc_mpi_get_processor_name_ PETSC_MPI_GET_PROCESSOR_NAME
451a7b85bbcSSatish Balay #define petsc_mpi_initialized_        PETSC_MPI_INITIALIZED
452a7b85bbcSSatish Balay #define petsc_mpi_iprobe_             PETSC_MPI_IPROBE
453a7b85bbcSSatish Balay #define petsc_mpi_probe_              PETSC_MPI_PROBE
454a7b85bbcSSatish Balay #define petsc_mpi_request_free_       PETSC_MPI_REQUEST_FREE
455a7b85bbcSSatish Balay #define petsc_mpi_ssend_              PETSC_MPI_SSEND
456a7b85bbcSSatish Balay #define petsc_mpi_wait_               PETSC_MPI_WAIT
457a7b85bbcSSatish Balay #define petsc_mpi_comm_group_         PETSC_MPI_COMM_GROUP
458a7b85bbcSSatish Balay #define petsc_mpi_exscan_             PETSC_MPI_EXSCAN
459f7c6e6aaSSatish Balay #elif !defined(PETSC_HAVE_FORTRAN_UNDERSCORE)
4600134af2dSBarry Smith #define mpiunisetmoduleblock_         mpiunisetmoduleblock
46152ecd5ffSSatish Balay #define mpiunisetfortranbasepointers_ mpiunisetfortranbasepointers
462a7b85bbcSSatish Balay #define petsc_mpi_init_               petsc_mpi_init
463a7b85bbcSSatish Balay #define petsc_mpi_finalize_           petsc_mpi_finalize
464a7b85bbcSSatish Balay #define petsc_mpi_comm_size_          petsc_mpi_comm_size
465a7b85bbcSSatish Balay #define petsc_mpi_comm_rank_          petsc_mpi_comm_rank
466a7b85bbcSSatish Balay #define petsc_mpi_abort_              petsc_mpi_abort
467a7b85bbcSSatish Balay #define petsc_mpi_reduce_             petsc_mpi_reduce
468a7b85bbcSSatish Balay #define petsc_mpi_allreduce_          petsc_mpi_allreduce
469a7b85bbcSSatish Balay #define petsc_mpi_barrier_            petsc_mpi_barrier
470a7b85bbcSSatish Balay #define petsc_mpi_bcast_              petsc_mpi_bcast
471a7b85bbcSSatish Balay #define petsc_mpi_gather_             petsc_mpi_gather
472a7b85bbcSSatish Balay #define petsc_mpi_allgather_          petsc_mpi_allgather
473a7b85bbcSSatish Balay #define petsc_mpi_comm_split_         petsc_mpi_comm_split
474a7b85bbcSSatish Balay #define petsc_mpi_scan_               petsc_mpi_scan
475a7b85bbcSSatish Balay #define petsc_mpi_send_               petsc_mpi_send
476a7b85bbcSSatish Balay #define petsc_mpi_recv_               petsc_mpi_recv
477a7b85bbcSSatish Balay #define petsc_mpi_reduce_scatter_     petsc_mpi_reduce_scatter
478a7b85bbcSSatish Balay #define petsc_mpi_irecv_              petsc_mpi_irecv
479a7b85bbcSSatish Balay #define petsc_mpi_isend_              petsc_mpi_isend
480a7b85bbcSSatish Balay #define petsc_mpi_sendrecv_           petsc_mpi_sendrecv
481a7b85bbcSSatish Balay #define petsc_mpi_test_               petsc_mpi_test
482a7b85bbcSSatish Balay #define petsc_mpi_waitall_            petsc_mpi_waitall
483a7b85bbcSSatish Balay #define petsc_mpi_waitany_            petsc_mpi_waitany
484a7b85bbcSSatish Balay #define petsc_mpi_allgatherv_         petsc_mpi_allgatherv
485a7b85bbcSSatish Balay #define petsc_mpi_alltoallv_          petsc_mpi_alltoallv
486a7b85bbcSSatish Balay #define petsc_mpi_comm_create_        petsc_mpi_comm_create
487a7b85bbcSSatish Balay #define petsc_mpi_address_            petsc_mpi_address
488a7b85bbcSSatish Balay #define petsc_mpi_pack_               petsc_mpi_pack
489a7b85bbcSSatish Balay #define petsc_mpi_unpack_             petsc_mpi_unpack
490a7b85bbcSSatish Balay #define petsc_mpi_pack_size_          petsc_mpi_pack_size
491a7b85bbcSSatish Balay #define petsc_mpi_type_struct_        petsc_mpi_type_struct
492a7b85bbcSSatish Balay #define petsc_mpi_type_commit_        petsc_mpi_type_commit
493a7b85bbcSSatish Balay #define petsc_mpi_wtime_              petsc_mpi_wtime
494a7b85bbcSSatish Balay #define petsc_mpi_cancel_             petsc_mpi_cancel
495a7b85bbcSSatish Balay #define petsc_mpi_comm_dup_           petsc_mpi_comm_dup
496a7b85bbcSSatish Balay #define petsc_mpi_comm_free_          petsc_mpi_comm_free
497a7b85bbcSSatish Balay #define petsc_mpi_get_count_          petsc_mpi_get_count
498a7b85bbcSSatish Balay #define petsc_mpi_get_processor_name_ petsc_mpi_get_processor_name
499a7b85bbcSSatish Balay #define petsc_mpi_initialized_        petsc_mpi_initialized
500a7b85bbcSSatish Balay #define petsc_mpi_iprobe_             petsc_mpi_iprobe
501a7b85bbcSSatish Balay #define petsc_mpi_probe_              petsc_mpi_probe
502a7b85bbcSSatish Balay #define petsc_mpi_request_free_       petsc_mpi_request_free
503a7b85bbcSSatish Balay #define petsc_mpi_ssend_              petsc_mpi_ssend
504a7b85bbcSSatish Balay #define petsc_mpi_wait_               petsc_mpi_wait
505a7b85bbcSSatish Balay #define petsc_mpi_comm_group_         petsc_mpi_comm_group
506a7b85bbcSSatish Balay #define petsc_mpi_exscan_             petsc_mpi_exscan
507f7c6e6aaSSatish Balay #endif
508e5c89e4eSSatish Balay 
509f7c6e6aaSSatish Balay #if defined(PETSC_HAVE_FORTRAN_UNDERSCORE_UNDERSCORE)
510a7b85bbcSSatish Balay #define petsc_mpi_init_               petsc_mpi_init__
511a7b85bbcSSatish Balay #define petsc_mpi_finalize_           petsc_mpi_finalize__
512a7b85bbcSSatish Balay #define petsc_mpi_comm_size_          petsc_mpi_comm_size__
513a7b85bbcSSatish Balay #define petsc_mpi_comm_rank_          petsc_mpi_comm_rank__
514a7b85bbcSSatish Balay #define petsc_mpi_abort_              petsc_mpi_abort__
515a7b85bbcSSatish Balay #define petsc_mpi_reduce_             petsc_mpi_reduce__
516a7b85bbcSSatish Balay #define petsc_mpi_allreduce_          petsc_mpi_allreduce__
517a7b85bbcSSatish Balay #define petsc_mpi_barrier_            petsc_mpi_barrier__
518a7b85bbcSSatish Balay #define petsc_mpi_bcast_              petsc_mpi_bcast__
519a7b85bbcSSatish Balay #define petsc_mpi_gather_             petsc_mpi_gather__
520a7b85bbcSSatish Balay #define petsc_mpi_allgather_          petsc_mpi_allgather__
521a7b85bbcSSatish Balay #define petsc_mpi_comm_split_         petsc_mpi_comm_split__
522a7b85bbcSSatish Balay #define petsc_mpi_scan_               petsc_mpi_scan__
523a7b85bbcSSatish Balay #define petsc_mpi_send_               petsc_mpi_send__
524a7b85bbcSSatish Balay #define petsc_mpi_recv_               petsc_mpi_recv__
525a7b85bbcSSatish Balay #define petsc_mpi_reduce_scatter_     petsc_mpi_reduce_scatter__
526a7b85bbcSSatish Balay #define petsc_mpi_irecv_              petsc_mpi_irecv__
527a7b85bbcSSatish Balay #define petsc_mpi_isend_              petsc_mpi_isend__
528a7b85bbcSSatish Balay #define petsc_mpi_sendrecv_           petsc_mpi_sendrecv__
529a7b85bbcSSatish Balay #define petsc_mpi_test_               petsc_mpi_test__
530a7b85bbcSSatish Balay #define petsc_mpi_waitall_            petsc_mpi_waitall__
531a7b85bbcSSatish Balay #define petsc_mpi_waitany_            petsc_mpi_waitany__
532a7b85bbcSSatish Balay #define petsc_mpi_allgatherv_         petsc_mpi_allgatherv__
533a7b85bbcSSatish Balay #define petsc_mpi_alltoallv_          petsc_mpi_alltoallv__
534a7b85bbcSSatish Balay #define petsc_mpi_comm_create_        petsc_mpi_comm_create__
535a7b85bbcSSatish Balay #define petsc_mpi_address_            petsc_mpi_address__
536a7b85bbcSSatish Balay #define petsc_mpi_pack_               petsc_mpi_pack__
537a7b85bbcSSatish Balay #define petsc_mpi_unpack_             petsc_mpi_unpack__
538a7b85bbcSSatish Balay #define petsc_mpi_pack_size_          petsc_mpi_pack_size__
539a7b85bbcSSatish Balay #define petsc_mpi_type_struct_        petsc_mpi_type_struct__
540a7b85bbcSSatish Balay #define petsc_mpi_type_commit_        petsc_mpi_type_commit__
541a7b85bbcSSatish Balay #define petsc_mpi_wtime_              petsc_mpi_wtime__
542a7b85bbcSSatish Balay #define petsc_mpi_cancel_             petsc_mpi_cancel__
543a7b85bbcSSatish Balay #define petsc_mpi_comm_dup_           petsc_mpi_comm_dup__
544a7b85bbcSSatish Balay #define petsc_mpi_comm_free_          petsc_mpi_comm_free__
545a7b85bbcSSatish Balay #define petsc_mpi_get_count_          petsc_mpi_get_count__
546a7b85bbcSSatish Balay #define petsc_mpi_get_processor_name_ petsc_mpi_get_processor_name__
547a7b85bbcSSatish Balay #define petsc_mpi_initialized_        petsc_mpi_initialized__
548a7b85bbcSSatish Balay #define petsc_mpi_iprobe_             petsc_mpi_iprobe__
549a7b85bbcSSatish Balay #define petsc_mpi_probe_              petsc_mpi_probe__
550a7b85bbcSSatish Balay #define petsc_mpi_request_free_       petsc_mpi_request_free__
551a7b85bbcSSatish Balay #define petsc_mpi_ssend_              petsc_mpi_ssend__
552a7b85bbcSSatish Balay #define petsc_mpi_wait_               petsc_mpi_wait__
553a7b85bbcSSatish Balay #define petsc_mpi_comm_group_         petsc_mpi_comm_group__
554a7b85bbcSSatish Balay #define petsc_mpi_exscan_             petsc_mpi_exscan__
555f7c6e6aaSSatish Balay #endif
556e5c89e4eSSatish Balay 
557c8217ed5SSatish Balay /* Do not build fortran interface if MPI namespace colision is to be avoided */
558a7b85bbcSSatish Balay #if defined(PETSC_HAVE_FORTRAN)
559c8217ed5SSatish Balay 
56019caf8f3SSatish Balay PETSC_EXTERN void mpiunisetmoduleblock_(void);
56152ecd5ffSSatish Balay 
5629371c9d4SSatish Balay PETSC_EXTERN void mpiunisetfortranbasepointers_(void *f_mpi_in_place) {
56352ecd5ffSSatish Balay   MPIUNIF_mpi_in_place = f_mpi_in_place;
56452ecd5ffSSatish Balay }
56552ecd5ffSSatish Balay 
5669371c9d4SSatish Balay PETSC_EXTERN void petsc_mpi_init_(int *ierr) {
5670134af2dSBarry Smith   mpiunisetmoduleblock_();
568c8217ed5SSatish Balay   *ierr = MPI_Init((int *)0, (char ***)0);
569e5c89e4eSSatish Balay }
570e5c89e4eSSatish Balay 
5719371c9d4SSatish Balay PETSC_EXTERN void petsc_mpi_finalize_(int *ierr) {
572c8217ed5SSatish Balay   *ierr = MPI_Finalize();
573e5c89e4eSSatish Balay }
574e5c89e4eSSatish Balay 
5759371c9d4SSatish Balay PETSC_EXTERN void petsc_mpi_comm_size_(MPI_Comm *comm, int *size, int *ierr) {
576e5c89e4eSSatish Balay   *size = 1;
577e5c89e4eSSatish Balay   *ierr = 0;
578e5c89e4eSSatish Balay }
579e5c89e4eSSatish Balay 
5809371c9d4SSatish Balay PETSC_EXTERN void petsc_mpi_comm_rank_(MPI_Comm *comm, int *rank, int *ierr) {
581e5c89e4eSSatish Balay   *rank = 0;
582e5c89e4eSSatish Balay   *ierr = MPI_SUCCESS;
583e5c89e4eSSatish Balay }
584e5c89e4eSSatish Balay 
5859371c9d4SSatish Balay PETSC_EXTERN void petsc_mpi_comm_split_(MPI_Comm *comm, int *color, int *key, MPI_Comm *newcomm, int *ierr) {
5861f6cc5b2SSatish Balay   *newcomm = *comm;
5871f6cc5b2SSatish Balay   *ierr    = MPI_SUCCESS;
5881f6cc5b2SSatish Balay }
5891f6cc5b2SSatish Balay 
5909371c9d4SSatish Balay PETSC_EXTERN void petsc_mpi_abort_(MPI_Comm *comm, int *errorcode, int *ierr) {
591e5c89e4eSSatish Balay   abort();
592e5c89e4eSSatish Balay   *ierr = MPI_SUCCESS;
593e5c89e4eSSatish Balay }
594e5c89e4eSSatish Balay 
5959371c9d4SSatish Balay PETSC_EXTERN void petsc_mpi_reduce_(void *sendbuf, void *recvbuf, int *count, int *datatype, int *op, int *root, int *comm, int *ierr) {
596f30578ecSBarry Smith   *ierr = MPI_Reduce(sendbuf, recvbuf, *count, *datatype, *op, *root, *comm);
5973b644628SSatish Balay }
5983b644628SSatish Balay 
5999371c9d4SSatish Balay PETSC_EXTERN void petsc_mpi_allreduce_(void *sendbuf, void *recvbuf, int *count, int *datatype, int *op, int *comm, int *ierr) {
600f30578ecSBarry Smith   *ierr = MPI_Allreduce(sendbuf, recvbuf, *count, *datatype, *op, *comm);
601e5c89e4eSSatish Balay }
602e5c89e4eSSatish Balay 
6039371c9d4SSatish Balay PETSC_EXTERN void petsc_mpi_barrier_(MPI_Comm *comm, int *ierr) {
604e5c89e4eSSatish Balay   *ierr = MPI_SUCCESS;
605e5c89e4eSSatish Balay }
606f7c6e6aaSSatish Balay 
6079371c9d4SSatish Balay PETSC_EXTERN void petsc_mpi_bcast_(void *buf, int *count, int *datatype, int *root, int *comm, int *ierr) {
608e5c89e4eSSatish Balay   *ierr = MPI_SUCCESS;
609e5c89e4eSSatish Balay }
610f7c6e6aaSSatish Balay 
6119371c9d4SSatish 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) {
612f30578ecSBarry Smith   *ierr = MPI_Gather(sendbuf, *scount, *sdatatype, recvbuf, rcount, rdatatype, *root, *comm);
613f7c6e6aaSSatish Balay }
614f7c6e6aaSSatish Balay 
6159371c9d4SSatish Balay PETSC_EXTERN void petsc_mpi_allgather_(void *sendbuf, int *scount, int *sdatatype, void *recvbuf, int *rcount, int *rdatatype, int *comm, int *ierr) {
616f30578ecSBarry Smith   *ierr = MPI_Allgather(sendbuf, *scount, *sdatatype, recvbuf, rcount, rdatatype, *comm);
617e5c89e4eSSatish Balay }
618e5c89e4eSSatish Balay 
6199371c9d4SSatish Balay PETSC_EXTERN void petsc_mpi_scan_(void *sendbuf, void *recvbuf, int *count, int *datatype, int *op, int *comm, int *ierr) {
6201a589b05SJed Brown   *ierr = MPIUNI_Memcpy(recvbuf, sendbuf, (*count) * MPI_sizeof(*datatype));
6213b644628SSatish Balay }
6223b644628SSatish Balay 
6239371c9d4SSatish Balay PETSC_EXTERN void petsc_mpi_send_(void *buf, int *count, int *datatype, int *dest, int *tag, int *comm, int *ierr) {
62406df1fb1SBarry Smith   *ierr = MPIUni_Abort(MPI_COMM_WORLD, 0);
6251086b069SSatish Balay }
6261086b069SSatish Balay 
6279371c9d4SSatish Balay PETSC_EXTERN void petsc_mpi_recv_(void *buf, int *count, int *datatype, int *source, int *tag, int *comm, int status, int *ierr) {
62806df1fb1SBarry Smith   *ierr = MPIUni_Abort(MPI_COMM_WORLD, 0);
6291086b069SSatish Balay }
6301086b069SSatish Balay 
6319371c9d4SSatish Balay PETSC_EXTERN void petsc_mpi_reduce_scatter_(void *sendbuf, void *recvbuf, int *recvcounts, int *datatype, int *op, int *comm, int *ierr) {
63206df1fb1SBarry Smith   *ierr = MPIUni_Abort(MPI_COMM_WORLD, 0);
633156bc490SSatish Balay }
634156bc490SSatish Balay 
6359371c9d4SSatish Balay PETSC_EXTERN void petsc_mpi_irecv_(void *buf, int *count, int *datatype, int *source, int *tag, int *comm, int *request, int *ierr) {
63606df1fb1SBarry Smith   *ierr = MPIUni_Abort(MPI_COMM_WORLD, 0);
637156bc490SSatish Balay }
638156bc490SSatish Balay 
6399371c9d4SSatish Balay PETSC_EXTERN void petsc_mpi_isend_(void *buf, int *count, int *datatype, int *dest, int *tag, int *comm, int *request, int *ierr) {
64006df1fb1SBarry Smith   *ierr = MPIUni_Abort(MPI_COMM_WORLD, 0);
641156bc490SSatish Balay }
642156bc490SSatish Balay 
6439371c9d4SSatish 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) {
6441a589b05SJed Brown   *ierr = MPIUNI_Memcpy(recvbuf, sendbuf, (*sendcount) * MPI_sizeof(*sendtype));
645156bc490SSatish Balay }
646156bc490SSatish Balay 
6479371c9d4SSatish Balay PETSC_EXTERN void petsc_mpi_test_(int *request, int *flag, int *status, int *ierr) {
64806df1fb1SBarry Smith   *ierr = MPIUni_Abort(MPI_COMM_WORLD, 0);
649156bc490SSatish Balay }
650156bc490SSatish Balay 
6519371c9d4SSatish Balay PETSC_EXTERN void petsc_mpi_waitall_(int *count, int *array_of_requests, int *array_of_statuses, int *ierr) {
652156bc490SSatish Balay   *ierr = MPI_SUCCESS;
653156bc490SSatish Balay }
654156bc490SSatish Balay 
6559371c9d4SSatish Balay PETSC_EXTERN void petsc_mpi_waitany_(int *count, int *array_of_requests, int *index, int *status, int *ierr) {
656156bc490SSatish Balay   *ierr = MPI_SUCCESS;
657156bc490SSatish Balay }
658156bc490SSatish Balay 
6599371c9d4SSatish 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) {
660f30578ecSBarry Smith   *ierr = MPI_Allgatherv(sendbuf, *sendcount, *sendtype, recvbuf, recvcounts, displs, *recvtype, *comm);
661156bc490SSatish Balay }
662156bc490SSatish Balay 
6639371c9d4SSatish 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) {
664f30578ecSBarry Smith   *ierr = MPI_Alltoallv(sendbuf, sendcounts, sdispls, *sendtype, recvbuf, recvcounts, rdispls, *recvtype, *comm);
665156bc490SSatish Balay }
666156bc490SSatish Balay 
6679371c9d4SSatish Balay PETSC_EXTERN void petsc_mpi_comm_create_(int *comm, int *group, int *newcomm, int *ierr) {
668156bc490SSatish Balay   *newcomm = *comm;
669156bc490SSatish Balay   *ierr    = MPI_SUCCESS;
670156bc490SSatish Balay }
671156bc490SSatish Balay 
6729371c9d4SSatish Balay PETSC_EXTERN void petsc_mpi_address_(void *location, MPI_Aint *address, int *ierr) {
67399256852SLisandro Dalcin   *address = (MPI_Aint)((char *)location);
674156bc490SSatish Balay   *ierr    = MPI_SUCCESS;
675156bc490SSatish Balay }
676156bc490SSatish Balay 
6779371c9d4SSatish Balay PETSC_EXTERN void petsc_mpi_pack_(void *inbuf, int *incount, int *datatype, void *outbuf, int *outsize, int *position, int *comm, int *ierr) {
67806df1fb1SBarry Smith   *ierr = MPIUni_Abort(MPI_COMM_WORLD, 0);
679156bc490SSatish Balay }
680156bc490SSatish Balay 
6819371c9d4SSatish Balay PETSC_EXTERN void petsc_mpi_unpack_(void *inbuf, int *insize, int *position, void *outbuf, int *outcount, int *datatype, int *comm, int *ierr) {
68206df1fb1SBarry Smith   *ierr = MPIUni_Abort(MPI_COMM_WORLD, 0);
683156bc490SSatish Balay }
684156bc490SSatish Balay 
6859371c9d4SSatish Balay PETSC_EXTERN void petsc_mpi_pack_size_(int *incount, int *datatype, int *comm, int *size, int *ierr) {
68606df1fb1SBarry Smith   *ierr = MPIUni_Abort(MPI_COMM_WORLD, 0);
687156bc490SSatish Balay }
688156bc490SSatish Balay 
6899371c9d4SSatish 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) {
69006df1fb1SBarry Smith   *ierr = MPIUni_Abort(MPI_COMM_WORLD, 0);
691156bc490SSatish Balay }
692156bc490SSatish Balay 
6939371c9d4SSatish Balay PETSC_EXTERN void petsc_mpi_type_commit_(int *datatype, int *ierr) {
694156bc490SSatish Balay   *ierr = MPI_SUCCESS;
695156bc490SSatish Balay }
696156bc490SSatish Balay 
6979371c9d4SSatish Balay double petsc_mpi_wtime_(void) {
698156bc490SSatish Balay   return 0.0;
699f8f52c7dSSatish Balay }
700156bc490SSatish Balay 
7019371c9d4SSatish Balay PETSC_EXTERN void petsc_mpi_cancel_(int *request, int *ierr) {
702f8f52c7dSSatish Balay   *ierr = MPI_SUCCESS;
703f8f52c7dSSatish Balay }
704f8f52c7dSSatish Balay 
7059371c9d4SSatish Balay PETSC_EXTERN void petsc_mpi_comm_dup_(int *comm, int *out, int *ierr) {
706f8f52c7dSSatish Balay   *out  = *comm;
707f8f52c7dSSatish Balay   *ierr = MPI_SUCCESS;
708f8f52c7dSSatish Balay }
709f8f52c7dSSatish Balay 
7109371c9d4SSatish Balay PETSC_EXTERN void petsc_mpi_comm_free_(int *comm, int *ierr) {
711f8f52c7dSSatish Balay   *ierr = MPI_SUCCESS;
712f8f52c7dSSatish Balay }
713f8f52c7dSSatish Balay 
7149371c9d4SSatish Balay PETSC_EXTERN void petsc_mpi_get_count_(int *status, int *datatype, int *count, int *ierr) {
71506df1fb1SBarry Smith   *ierr = MPIUni_Abort(MPI_COMM_WORLD, 0);
716f8f52c7dSSatish Balay }
717f8f52c7dSSatish Balay 
7189371c9d4SSatish Balay PETSC_EXTERN void petsc_mpi_get_processor_name_(char *name, int *result_len, int *ierr, PETSC_FORTRAN_CHARLEN_T len) {
719f8f52c7dSSatish Balay   MPIUNI_Memcpy(name, "localhost", 9 * sizeof(char));
720f8f52c7dSSatish Balay   *result_len = 9;
721f8f52c7dSSatish Balay   *ierr       = MPI_SUCCESS;
722f8f52c7dSSatish Balay }
723f8f52c7dSSatish Balay 
7249371c9d4SSatish Balay PETSC_EXTERN void petsc_mpi_initialized_(int *flag, int *ierr) {
725f8f52c7dSSatish Balay   *flag = MPI_was_initialized;
726f8f52c7dSSatish Balay   *ierr = MPI_SUCCESS;
727f8f52c7dSSatish Balay }
728f8f52c7dSSatish Balay 
7299371c9d4SSatish Balay PETSC_EXTERN void petsc_mpi_iprobe_(int *source, int *tag, int *comm, int *glag, int *status, int *ierr) {
730f8f52c7dSSatish Balay   *ierr = MPI_SUCCESS;
731f8f52c7dSSatish Balay }
732f8f52c7dSSatish Balay 
7339371c9d4SSatish Balay PETSC_EXTERN void petsc_mpi_probe_(int *source, int *tag, int *comm, int *flag, int *status, int *ierr) {
734f8f52c7dSSatish Balay   *ierr = MPI_SUCCESS;
735f8f52c7dSSatish Balay }
736f8f52c7dSSatish Balay 
7379371c9d4SSatish Balay PETSC_EXTERN void petsc_mpi_request_free_(int *request, int *ierr) {
738f8f52c7dSSatish Balay   *ierr = MPI_SUCCESS;
739f8f52c7dSSatish Balay }
740f8f52c7dSSatish Balay 
7419371c9d4SSatish Balay PETSC_EXTERN void petsc_mpi_ssend_(void *buf, int *count, int *datatype, int *dest, int *tag, int *comm, int *ierr) {
74206df1fb1SBarry Smith   *ierr = MPIUni_Abort(MPI_COMM_WORLD, 0);
743f8f52c7dSSatish Balay }
744f8f52c7dSSatish Balay 
7459371c9d4SSatish Balay PETSC_EXTERN void petsc_mpi_wait_(int *request, int *status, int *ierr) {
746f8f52c7dSSatish Balay   *ierr = MPI_SUCCESS;
747156bc490SSatish Balay }
748156bc490SSatish Balay 
7499371c9d4SSatish Balay PETSC_EXTERN void petsc_mpi_comm_group_(int *comm, int *group, int *ierr) {
750d4816372SSatish Balay   *ierr = MPI_SUCCESS;
751d4816372SSatish Balay }
752d4816372SSatish Balay 
7539371c9d4SSatish Balay PETSC_EXTERN void petsc_mpi_exscan_(void *sendbuf, void *recvbuf, int *count, int *datatype, int *op, int *comm, int *ierr) {
754d4816372SSatish Balay   *ierr = MPI_SUCCESS;
755d4816372SSatish Balay }
756d4816372SSatish Balay 
757a7b85bbcSSatish Balay #endif /* PETSC_HAVE_FORTRAN */
758c8217ed5SSatish Balay 
759e5c89e4eSSatish Balay #if defined(__cplusplus)
760e5c89e4eSSatish Balay }
761e5c89e4eSSatish Balay #endif
762