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*beceaeb6SBarry Smith #if !defined(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 */
MPIUNI_Memcpy(void * dst,const void * src,MPI_Count n)573649609aSBarry Smith int MPIUNI_Memcpy(void *dst, const void *src, MPI_Count n)
58d71ae5a4SJacob Faibussowitsch {
596e42a002SJunchao Zhang if (dst == MPI_IN_PLACE || dst == MPIUNIF_mpi_in_place) return MPI_SUCCESS;
606e42a002SJunchao Zhang if (src == MPI_IN_PLACE || src == MPIUNIF_mpi_in_place) return MPI_SUCCESS;
616e42a002SJunchao Zhang if (!n) return MPI_SUCCESS;
62e5c89e4eSSatish Balay
6305035670SJunchao Zhang /* GPU-aware MPIUNI. Use synchronous copy per MPI semantics */
6405035670SJunchao Zhang #if defined(PETSC_HAVE_CUDA)
659371c9d4SSatish Balay if (PetscDeviceInitialized(PETSC_DEVICE_CUDA)) {
669371c9d4SSatish Balay cudaError_t cerr = cudaMemcpy(dst, src, n, cudaMemcpyDefault);
679371c9d4SSatish Balay if (cerr != cudaSuccess) return MPI_FAILURE;
689371c9d4SSatish Balay } else
6905035670SJunchao Zhang #elif defined(PETSC_HAVE_HIP)
709371c9d4SSatish Balay if (PetscDeviceInitialized(PETSC_DEVICE_HIP)) {
719371c9d4SSatish Balay hipError_t cerr = hipMemcpy(dst, src, n, hipMemcpyDefault);
729371c9d4SSatish Balay if (cerr != hipSuccess) return MPI_FAILURE;
739371c9d4SSatish Balay } else
74a6191124SJunchao Zhang #endif
759371c9d4SSatish Balay {
76dd460d27SBarry Smith (void)memcpy(dst, src, n);
779371c9d4SSatish Balay }
7899256852SLisandro Dalcin return MPI_SUCCESS;
79e5c89e4eSSatish Balay }
80e5c89e4eSSatish Balay
8112801b39SBarry Smith static int classcnt = 0;
8212801b39SBarry Smith static int codecnt = 0;
8312801b39SBarry Smith
MPI_Add_error_class(int * cl)84d71ae5a4SJacob Faibussowitsch int MPI_Add_error_class(int *cl)
85d71ae5a4SJacob Faibussowitsch {
8612801b39SBarry Smith *cl = classcnt++;
8712801b39SBarry Smith return MPI_SUCCESS;
8812801b39SBarry Smith }
8912801b39SBarry Smith
MPI_Add_error_code(int cl,int * co)90d71ae5a4SJacob Faibussowitsch int MPI_Add_error_code(int cl, int *co)
91d71ae5a4SJacob Faibussowitsch {
9212801b39SBarry Smith if (cl >= classcnt) return MPI_FAILURE;
9312801b39SBarry Smith *co = codecnt++;
9412801b39SBarry Smith return MPI_SUCCESS;
9512801b39SBarry Smith }
9612801b39SBarry Smith
MPI_Type_get_envelope(MPI_Datatype datatype,int * num_integers,int * num_addresses,int * num_datatypes,int * combiner)97d71ae5a4SJacob Faibussowitsch int MPI_Type_get_envelope(MPI_Datatype datatype, int *num_integers, int *num_addresses, int *num_datatypes, int *combiner)
98d71ae5a4SJacob Faibussowitsch {
991a589b05SJed Brown int comb = datatype >> 28;
1001a589b05SJed Brown switch (comb) {
1011a589b05SJed Brown case MPI_COMBINER_NAMED:
1021a589b05SJed Brown *num_integers = 0;
1031a589b05SJed Brown *num_addresses = 0;
1041a589b05SJed Brown *num_datatypes = 0;
1051a589b05SJed Brown *combiner = comb;
1061a589b05SJed Brown break;
1071a589b05SJed Brown case MPI_COMBINER_DUP:
1081a589b05SJed Brown *num_integers = 0;
1091a589b05SJed Brown *num_addresses = 0;
1101a589b05SJed Brown *num_datatypes = 1;
1111a589b05SJed Brown *combiner = comb;
1121a589b05SJed Brown break;
1131a589b05SJed Brown case MPI_COMBINER_CONTIGUOUS:
1141a589b05SJed Brown *num_integers = 1;
1151a589b05SJed Brown *num_addresses = 0;
1161a589b05SJed Brown *num_datatypes = 1;
1171a589b05SJed Brown *combiner = comb;
1181a589b05SJed Brown break;
119d71ae5a4SJacob Faibussowitsch default:
120d71ae5a4SJacob Faibussowitsch return MPIUni_Abort(MPI_COMM_SELF, 1);
1211a589b05SJed Brown }
12299256852SLisandro Dalcin return MPI_SUCCESS;
1231a589b05SJed Brown }
1241a589b05SJed Brown
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)125d71ae5a4SJacob Faibussowitsch int MPI_Type_get_contents(MPI_Datatype datatype, int max_integers, int max_addresses, int max_datatypes, int *array_of_integers, MPI_Aint *array_of_addresses, MPI_Datatype *array_of_datatypes)
126d71ae5a4SJacob Faibussowitsch {
1271a589b05SJed Brown int comb = datatype >> 28;
1281a589b05SJed Brown switch (comb) {
129d71ae5a4SJacob Faibussowitsch case MPI_COMBINER_NAMED:
130d71ae5a4SJacob Faibussowitsch return MPIUni_Abort(MPI_COMM_SELF, 1);
1311a589b05SJed Brown case MPI_COMBINER_DUP:
1321a589b05SJed Brown if (max_datatypes < 1) return MPIUni_Abort(MPI_COMM_SELF, 1);
1331a589b05SJed Brown array_of_datatypes[0] = datatype & 0x0fffffff;
1341a589b05SJed Brown break;
1351a589b05SJed Brown case MPI_COMBINER_CONTIGUOUS:
1361a589b05SJed Brown if (max_integers < 1 || max_datatypes < 1) return MPIUni_Abort(MPI_COMM_SELF, 1);
1371a589b05SJed Brown array_of_integers[0] = (datatype >> 8) & 0xfff; /* count */
1381a589b05SJed Brown array_of_datatypes[0] = (datatype & 0x0ff000ff) | 0x100; /* basic named type (count=1) from which the contiguous type is derived */
1391a589b05SJed Brown break;
140d71ae5a4SJacob Faibussowitsch default:
141d71ae5a4SJacob Faibussowitsch return MPIUni_Abort(MPI_COMM_SELF, 1);
1421a589b05SJed Brown }
14399256852SLisandro Dalcin return MPI_SUCCESS;
1441a589b05SJed Brown }
1451a589b05SJed Brown
146e5c89e4eSSatish Balay /*
147e5c89e4eSSatish Balay Used to set the built-in MPI_TAG_UB attribute
148e5c89e4eSSatish Balay */
Keyval_setup(void)149d71ae5a4SJacob Faibussowitsch static int Keyval_setup(void)
150d71ae5a4SJacob Faibussowitsch {
151f0463fa0SJunchao Zhang attr[CommIdx(MPI_COMM_WORLD)][0].active = 1;
152f0463fa0SJunchao Zhang attr[CommIdx(MPI_COMM_WORLD)][0].attribute_val = &mpi_tag_ub;
153f0463fa0SJunchao Zhang attr[CommIdx(MPI_COMM_SELF)][0].active = 1;
154f0463fa0SJunchao Zhang attr[CommIdx(MPI_COMM_SELF)][0].attribute_val = &mpi_tag_ub;
155f0463fa0SJunchao Zhang attr_keyval[0].active = 1;
15699256852SLisandro Dalcin return MPI_SUCCESS;
157e5c89e4eSSatish Balay }
158e5c89e4eSSatish Balay
MPI_Comm_create_keyval(PETSC_UNUSED MPI_Copy_function * copy_fn,PETSC_UNUSED MPI_Delete_function * delete_fn,int * keyval,void * extra_state)159dd460d27SBarry Smith int MPI_Comm_create_keyval(PETSC_UNUSED MPI_Copy_function *copy_fn, PETSC_UNUSED MPI_Delete_function *delete_fn, int *keyval, void *extra_state)
160d71ae5a4SJacob Faibussowitsch {
161f0463fa0SJunchao Zhang int i, keyid;
162dd460d27SBarry Smith
163dd460d27SBarry Smith (void)copy_fn;
164dd460d27SBarry Smith (void)delete_fn;
165f0463fa0SJunchao Zhang for (i = 1; i < num_attr; i++) { /* the first attribute is always in use */
166f0463fa0SJunchao Zhang if (!attr_keyval[i].active) {
167f0463fa0SJunchao Zhang keyid = i;
168f0463fa0SJunchao Zhang goto found;
169f0463fa0SJunchao Zhang }
170f0463fa0SJunchao Zhang }
1719cf9c1dbSJed Brown if (num_attr >= MAX_ATTR) return MPIUni_Abort(MPI_COMM_WORLD, 1);
172f0463fa0SJunchao Zhang keyid = num_attr++;
173e5c89e4eSSatish Balay
174f0463fa0SJunchao Zhang found:
175f0463fa0SJunchao Zhang attr_keyval[keyid].extra_state = extra_state;
176f0463fa0SJunchao Zhang attr_keyval[keyid].del = delete_fn;
177f0463fa0SJunchao Zhang attr_keyval[keyid].active = 1;
178f0463fa0SJunchao Zhang *keyval = keyid;
17999256852SLisandro Dalcin return MPI_SUCCESS;
180e5c89e4eSSatish Balay }
181e5c89e4eSSatish Balay
18236f0be53SJacob Faibussowitsch /*
18336f0be53SJacob Faibussowitsch The reference counting business is here to guard against the following:
18436f0be53SJacob Faibussowitsch
18536f0be53SJacob Faibussowitsch MPI_Comm_set_attr(comm, keyval, some_attr);
18636f0be53SJacob Faibussowitsch MPI_Comm_free_keyval(&keyval);
18736f0be53SJacob Faibussowitsch MPI_Comm_free(&comm);
18836f0be53SJacob Faibussowitsch
18936f0be53SJacob Faibussowitsch Here MPI_Comm_free() will try to destroy all of the attributes of the comm, and hence we
19036f0be53SJacob Faibussowitsch should not clear the deleter or extra_state until all communicators that have the attribute
19136f0be53SJacob Faibussowitsch set are either freed or have given up their attribute.
19236f0be53SJacob Faibussowitsch
19336f0be53SJacob Faibussowitsch The attribute reference count is INCREASED in:
19436f0be53SJacob Faibussowitsch - MPI_Comm_create_keyval()
19536f0be53SJacob Faibussowitsch - MPI_Comm_set_attr()
19636f0be53SJacob Faibussowitsch
19736f0be53SJacob Faibussowitsch The atrtibute reference count is DECREASED in:
19836f0be53SJacob Faibussowitsch - MPI_Comm_free_keyval()
19936f0be53SJacob Faibussowitsch - MPI_Comm_delete_attr() (but only if the comm has the attribute)
20036f0be53SJacob Faibussowitsch */
MPI_Attr_dereference_keyval(int keyval)201d71ae5a4SJacob Faibussowitsch static int MPI_Attr_dereference_keyval(int keyval)
202d71ae5a4SJacob Faibussowitsch {
203663e1fa8SPierre Jolivet if (--attr_keyval[keyval].active <= 0) {
20436f0be53SJacob Faibussowitsch attr_keyval[keyval].extra_state = 0;
20536f0be53SJacob Faibussowitsch attr_keyval[keyval].del = 0;
20636f0be53SJacob Faibussowitsch }
20736f0be53SJacob Faibussowitsch return MPI_SUCCESS;
20836f0be53SJacob Faibussowitsch }
20936f0be53SJacob Faibussowitsch
MPI_Attr_reference_keyval(int keyval)210d71ae5a4SJacob Faibussowitsch static int MPI_Attr_reference_keyval(int keyval)
211d71ae5a4SJacob Faibussowitsch {
212663e1fa8SPierre Jolivet ++attr_keyval[keyval].active;
21336f0be53SJacob Faibussowitsch return MPI_SUCCESS;
21436f0be53SJacob Faibussowitsch }
21536f0be53SJacob Faibussowitsch
MPI_Comm_free_keyval(int * keyval)216d71ae5a4SJacob Faibussowitsch int MPI_Comm_free_keyval(int *keyval)
217d71ae5a4SJacob Faibussowitsch {
21836f0be53SJacob Faibussowitsch int ret;
21936f0be53SJacob Faibussowitsch
22036f0be53SJacob Faibussowitsch if (*keyval < 0 || *keyval >= num_attr) return MPI_FAILURE;
22136f0be53SJacob Faibussowitsch if ((ret = MPI_Attr_dereference_keyval(*keyval))) return ret;
222a246e310SBarry Smith *keyval = 0;
223e5c89e4eSSatish Balay return MPI_SUCCESS;
224e5c89e4eSSatish Balay }
225e5c89e4eSSatish Balay
MPI_Comm_set_attr(MPI_Comm comm,int keyval,void * attribute_val)226d71ae5a4SJacob Faibussowitsch int MPI_Comm_set_attr(MPI_Comm comm, int keyval, void *attribute_val)
227d71ae5a4SJacob Faibussowitsch {
22836f0be53SJacob Faibussowitsch int idx = CommIdx(comm), ret;
229f0463fa0SJunchao Zhang if (comm < 1 || comm > MaxComm) return MPI_FAILURE;
23036f0be53SJacob Faibussowitsch if (keyval < 0 || keyval >= num_attr) return MPI_FAILURE;
23136f0be53SJacob Faibussowitsch
23236f0be53SJacob Faibussowitsch if ((ret = MPI_Comm_delete_attr(comm, keyval))) return ret;
23336f0be53SJacob Faibussowitsch if ((ret = MPI_Attr_reference_keyval(keyval))) return ret;
234f0463fa0SJunchao Zhang attr[idx][keyval].active = 1;
235f0463fa0SJunchao Zhang attr[idx][keyval].attribute_val = attribute_val;
236e5c89e4eSSatish Balay return MPI_SUCCESS;
237e5c89e4eSSatish Balay }
238e5c89e4eSSatish Balay
MPI_Comm_delete_attr(MPI_Comm comm,int keyval)239d71ae5a4SJacob Faibussowitsch int MPI_Comm_delete_attr(MPI_Comm comm, int keyval)
240d71ae5a4SJacob Faibussowitsch {
241f0463fa0SJunchao Zhang int idx = CommIdx(comm);
242f0463fa0SJunchao Zhang if (comm < 1 || comm > MaxComm) return MPI_FAILURE;
24336f0be53SJacob Faibussowitsch if (keyval < 0 || keyval >= num_attr) return MPI_FAILURE;
24436f0be53SJacob Faibussowitsch if (attr[idx][keyval].active) {
24536f0be53SJacob Faibussowitsch int ret;
246f0463fa0SJunchao Zhang void *save_attribute_val = attr[idx][keyval].attribute_val;
24736f0be53SJacob Faibussowitsch
248f0463fa0SJunchao Zhang attr[idx][keyval].active = 0;
249f0463fa0SJunchao Zhang attr[idx][keyval].attribute_val = 0;
25036f0be53SJacob Faibussowitsch if (attr_keyval[keyval].del) {
251f4f49eeaSPierre Jolivet if ((ret = (*attr_keyval[keyval].del)(comm, keyval, save_attribute_val, attr_keyval[keyval].extra_state))) return ret;
25236f0be53SJacob Faibussowitsch }
25336f0be53SJacob Faibussowitsch if ((ret = MPI_Attr_dereference_keyval(keyval))) return ret;
25440776e1bSpetsc }
255e5c89e4eSSatish Balay return MPI_SUCCESS;
256e5c89e4eSSatish Balay }
257e5c89e4eSSatish Balay
MPI_Comm_get_attr(MPI_Comm comm,int keyval,void * attribute_val,int * flag)258d71ae5a4SJacob Faibussowitsch int MPI_Comm_get_attr(MPI_Comm comm, int keyval, void *attribute_val, int *flag)
259d71ae5a4SJacob Faibussowitsch {
260f0463fa0SJunchao Zhang int idx = CommIdx(comm);
261f0463fa0SJunchao Zhang if (comm < 1 || comm > MaxComm) return MPI_FAILURE;
262e5c89e4eSSatish Balay if (!keyval) Keyval_setup();
263f0463fa0SJunchao Zhang *flag = attr[idx][keyval].active;
264f0463fa0SJunchao Zhang *(void **)attribute_val = attr[idx][keyval].attribute_val;
265e5c89e4eSSatish Balay return MPI_SUCCESS;
266e5c89e4eSSatish Balay }
267e5c89e4eSSatish Balay
2689371c9d4SSatish Balay static char all_comm_names[MAX_COMM][MPI_MAX_OBJECT_NAME] = {"MPI_COMM_SELF", "MPI_COMM_WORLD"};
2693e1d142dSJacob Faibussowitsch
MPI_Comm_get_name(MPI_Comm comm,char * comm_name,int * resultlen)270d71ae5a4SJacob Faibussowitsch int MPI_Comm_get_name(MPI_Comm comm, char *comm_name, int *resultlen)
271d71ae5a4SJacob Faibussowitsch {
2723e1d142dSJacob Faibussowitsch if (comm < 1 || comm > MaxComm) return MPI_FAILURE;
2733e1d142dSJacob Faibussowitsch if (!comm_name || !resultlen) return MPI_FAILURE;
274dd460d27SBarry Smith (void)strncpy(comm_name, all_comm_names[CommIdx(comm)], MPI_MAX_OBJECT_NAME - 1);
2753e1d142dSJacob Faibussowitsch *resultlen = (int)strlen(comm_name);
2763e1d142dSJacob Faibussowitsch return MPI_SUCCESS;
2773e1d142dSJacob Faibussowitsch }
2783e1d142dSJacob Faibussowitsch
MPI_Comm_set_name(MPI_Comm comm,const char * comm_name)279d71ae5a4SJacob Faibussowitsch int MPI_Comm_set_name(MPI_Comm comm, const char *comm_name)
280d71ae5a4SJacob Faibussowitsch {
2813e1d142dSJacob Faibussowitsch if (comm < 1 || comm > MaxComm) return MPI_FAILURE;
2823e1d142dSJacob Faibussowitsch if (!comm_name) return MPI_FAILURE;
2833e1d142dSJacob Faibussowitsch if (strlen(comm_name) > MPI_MAX_OBJECT_NAME - 1) return MPI_FAILURE;
284dd460d27SBarry Smith (void)strncpy(all_comm_names[CommIdx(comm)], comm_name, MPI_MAX_OBJECT_NAME - 1);
2853e1d142dSJacob Faibussowitsch return MPI_SUCCESS;
2863e1d142dSJacob Faibussowitsch }
2873e1d142dSJacob Faibussowitsch
MPI_Comm_create(MPI_Comm comm,MPI_Group group,MPI_Comm * newcomm)288d71ae5a4SJacob Faibussowitsch int MPI_Comm_create(MPI_Comm comm, MPI_Group group, MPI_Comm *newcomm)
289d71ae5a4SJacob Faibussowitsch {
290f60917d2SBarry Smith int j;
291f0463fa0SJunchao Zhang if (comm < 1 || comm > MaxComm) return MPI_FAILURE;
292f0463fa0SJunchao Zhang for (j = 3; j <= MaxComm; j++) {
293f0463fa0SJunchao Zhang if (!comm_active[CommIdx(j)]) {
294f0463fa0SJunchao Zhang comm_active[CommIdx(j)] = 1;
295f60917d2SBarry Smith *newcomm = j;
296f60917d2SBarry Smith return MPI_SUCCESS;
297f60917d2SBarry Smith }
298f60917d2SBarry Smith }
299f0463fa0SJunchao Zhang if (MaxComm >= MAX_COMM) return MPI_FAILURE;
300f0463fa0SJunchao Zhang *newcomm = ++MaxComm;
301f0463fa0SJunchao Zhang comm_active[CommIdx(*newcomm)] = 1;
302c8217ed5SSatish Balay return MPI_SUCCESS;
303c8217ed5SSatish Balay }
304c8217ed5SSatish Balay
MPI_Comm_dup(MPI_Comm comm,MPI_Comm * out)305d71ae5a4SJacob Faibussowitsch int MPI_Comm_dup(MPI_Comm comm, MPI_Comm *out)
306d71ae5a4SJacob Faibussowitsch {
307f60917d2SBarry Smith int j;
308f0463fa0SJunchao Zhang if (comm < 1 || comm > MaxComm) return MPI_FAILURE;
309f0463fa0SJunchao Zhang for (j = 3; j <= MaxComm; j++) {
310f0463fa0SJunchao Zhang if (!comm_active[CommIdx(j)]) {
311f0463fa0SJunchao Zhang comm_active[CommIdx(j)] = 1;
312f60917d2SBarry Smith *out = j;
313f60917d2SBarry Smith return MPI_SUCCESS;
314f60917d2SBarry Smith }
315f60917d2SBarry Smith }
316f0463fa0SJunchao Zhang if (MaxComm >= MAX_COMM) return MPI_FAILURE;
317f0463fa0SJunchao Zhang *out = ++MaxComm;
318f0463fa0SJunchao Zhang comm_active[CommIdx(*out)] = 1;
31999256852SLisandro Dalcin return MPI_SUCCESS;
320e5c89e4eSSatish Balay }
321e5c89e4eSSatish Balay
MPI_Comm_free(MPI_Comm * comm)322d71ae5a4SJacob Faibussowitsch int MPI_Comm_free(MPI_Comm *comm)
323d71ae5a4SJacob Faibussowitsch {
324f0463fa0SJunchao Zhang int idx = CommIdx(*comm);
325e5c89e4eSSatish Balay
326f0463fa0SJunchao Zhang if (*comm < 1 || *comm > MaxComm) return MPI_FAILURE;
32736f0be53SJacob Faibussowitsch for (int i = 0; i < num_attr; i++) {
32836f0be53SJacob Faibussowitsch int ret = MPI_Comm_delete_attr(*comm, i);
32936f0be53SJacob Faibussowitsch
33036f0be53SJacob Faibussowitsch if (ret) return ret;
331e5c89e4eSSatish Balay }
332f0463fa0SJunchao Zhang if (*comm >= 3) comm_active[idx] = 0;
333100f28aeSBarry Smith *comm = 0;
334e5c89e4eSSatish Balay return MPI_SUCCESS;
335e5c89e4eSSatish Balay }
336e5c89e4eSSatish Balay
MPI_Comm_size(MPI_Comm comm,int * size)337d71ae5a4SJacob Faibussowitsch int MPI_Comm_size(MPI_Comm comm, int *size)
338d71ae5a4SJacob Faibussowitsch {
339f0463fa0SJunchao Zhang if (comm < 1 || comm > MaxComm) return MPI_FAILURE;
340d393f697SSatish Balay *size = 1;
341d393f697SSatish Balay return MPI_SUCCESS;
342d393f697SSatish Balay }
343d393f697SSatish Balay
MPI_Comm_rank(MPI_Comm comm,int * rank)344d71ae5a4SJacob Faibussowitsch int MPI_Comm_rank(MPI_Comm comm, int *rank)
345d71ae5a4SJacob Faibussowitsch {
346f0463fa0SJunchao Zhang if (comm < 1 || comm > MaxComm) return MPI_FAILURE;
347d393f697SSatish Balay *rank = 0;
348d393f697SSatish Balay return MPI_SUCCESS;
349d393f697SSatish Balay }
350d393f697SSatish Balay
MPIUni_Abort(MPI_Comm comm,int errorcode)351d71ae5a4SJacob Faibussowitsch int MPIUni_Abort(MPI_Comm comm, int errorcode)
352d71ae5a4SJacob Faibussowitsch {
353dd460d27SBarry Smith (void)printf("MPI operation not supported by PETSc's sequential MPI wrappers\n");
354b3f11779SBarry Smith return MPI_ERR_NOSUPPORT;
35506df1fb1SBarry Smith }
35606df1fb1SBarry Smith
MPI_Abort(MPI_Comm comm,int errorcode)357d71ae5a4SJacob Faibussowitsch int MPI_Abort(MPI_Comm comm, int errorcode)
358d71ae5a4SJacob Faibussowitsch {
359e5c89e4eSSatish Balay abort();
360e5c89e4eSSatish Balay return MPI_SUCCESS;
361e5c89e4eSSatish Balay }
362e5c89e4eSSatish Balay
363e5c89e4eSSatish Balay static int MPI_was_initialized = 0;
36458cd72c3SLisandro Dalcin static int MPI_was_finalized = 0;
36558cd72c3SLisandro Dalcin
MPI_Init(int * argc,char *** argv)366d71ae5a4SJacob Faibussowitsch int MPI_Init(int *argc, char ***argv)
367d71ae5a4SJacob Faibussowitsch {
36899256852SLisandro Dalcin if (MPI_was_initialized) return MPI_FAILURE;
3699bcf9d5aSJunchao Zhang /* MPI standard says "once MPI_Finalize returns, no MPI routine (not even MPI_Init) may be called", so an MPI standard compliant
3709bcf9d5aSJunchao Zhang MPIU should have this 'if (MPI_was_finalized) return MPI_FAILURE;' check. We relax it here to make life easier for users
3719bcf9d5aSJunchao Zhang of MPIU so that they can do multiple PetscInitialize/Finalize().
3729bcf9d5aSJunchao Zhang */
3739bcf9d5aSJunchao Zhang /* if (MPI_was_finalized) return MPI_FAILURE; */
37458cd72c3SLisandro Dalcin MPI_was_initialized = 1;
3759bcf9d5aSJunchao Zhang MPI_was_finalized = 0;
37699256852SLisandro Dalcin return MPI_SUCCESS;
37758cd72c3SLisandro Dalcin }
37858cd72c3SLisandro Dalcin
MPI_Init_thread(int * argc,char *** argv,int required,int * provided)379d71ae5a4SJacob Faibussowitsch int MPI_Init_thread(int *argc, char ***argv, int required, int *provided)
380d71ae5a4SJacob Faibussowitsch {
3819012378cSStefano Zampini MPI_Query_thread(provided);
3829012378cSStefano Zampini return MPI_Init(argc, argv);
3839012378cSStefano Zampini }
3849012378cSStefano Zampini
MPI_Query_thread(int * provided)385d71ae5a4SJacob Faibussowitsch int MPI_Query_thread(int *provided)
386d71ae5a4SJacob Faibussowitsch {
3879012378cSStefano Zampini *provided = MPI_THREAD_FUNNELED;
3889012378cSStefano Zampini return MPI_SUCCESS;
3899012378cSStefano Zampini }
3909012378cSStefano Zampini
MPI_Finalize(void)391d71ae5a4SJacob Faibussowitsch int MPI_Finalize(void)
392d71ae5a4SJacob Faibussowitsch {
39336f0be53SJacob Faibussowitsch if (MPI_was_finalized || !MPI_was_initialized) return MPI_FAILURE;
39436f0be53SJacob Faibussowitsch MPI_Comm comm = MPI_COMM_WORLD;
39536f0be53SJacob Faibussowitsch int ret = MPI_Comm_free(&comm);
39636f0be53SJacob Faibussowitsch
39736f0be53SJacob Faibussowitsch if (ret) return ret;
398100f28aeSBarry Smith comm = MPI_COMM_SELF;
39936f0be53SJacob Faibussowitsch ret = MPI_Comm_free(&comm);
40036f0be53SJacob Faibussowitsch if (ret) return ret;
40136f0be53SJacob Faibussowitsch if (PetscDefined(USE_DEBUG)) {
40236f0be53SJacob Faibussowitsch for (int i = 3; i <= MaxComm; ++i) {
403f0463fa0SJunchao Zhang if (comm_active[CommIdx(i)]) printf("MPIUni warning: MPI communicator %d is not freed before MPI_Finalize()\n", i);
404f0463fa0SJunchao Zhang }
40536f0be53SJacob Faibussowitsch
40636f0be53SJacob Faibussowitsch for (int i = 1; i <= MaxComm; ++i) {
40736f0be53SJacob Faibussowitsch for (int j = 0; j < num_attr; ++j) {
40836f0be53SJacob Faibussowitsch if (attr[CommIdx(i)][j].active) printf("MPIUni warning: MPI communicator %d attribute %d was not freed before MPI_Finalize()\n", i, j);
409f0463fa0SJunchao Zhang }
41036f0be53SJacob Faibussowitsch }
41136f0be53SJacob Faibussowitsch
41236f0be53SJacob Faibussowitsch for (int i = 1; i < num_attr; ++i) {
41336f0be53SJacob Faibussowitsch if (attr_keyval[i].active) printf("MPIUni warning: MPI attribute %d was not freed before MPI_Finalize()\n", i);
41436f0be53SJacob Faibussowitsch }
41536f0be53SJacob Faibussowitsch }
41636f0be53SJacob Faibussowitsch
417f0463fa0SJunchao Zhang /* reset counters */
418f0463fa0SJunchao Zhang MaxComm = 2;
419f0463fa0SJunchao Zhang num_attr = 1;
42058cd72c3SLisandro Dalcin MPI_was_finalized = 1;
4219bcf9d5aSJunchao Zhang MPI_was_initialized = 0;
4229bcf9d5aSJunchao Zhang PETSC_COMM_WORLD = MPI_COMM_NULL;
42399256852SLisandro Dalcin return MPI_SUCCESS;
42458cd72c3SLisandro Dalcin }
425e5c89e4eSSatish Balay
MPI_Initialized(int * flag)426d71ae5a4SJacob Faibussowitsch int MPI_Initialized(int *flag)
427d71ae5a4SJacob Faibussowitsch {
428e5c89e4eSSatish Balay *flag = MPI_was_initialized;
42999256852SLisandro Dalcin return MPI_SUCCESS;
430e5c89e4eSSatish Balay }
431e5c89e4eSSatish Balay
MPI_Finalized(int * flag)432d71ae5a4SJacob Faibussowitsch int MPI_Finalized(int *flag)
433d71ae5a4SJacob Faibussowitsch {
43458cd72c3SLisandro Dalcin *flag = MPI_was_finalized;
43599256852SLisandro Dalcin return MPI_SUCCESS;
436e5c89e4eSSatish Balay }
437e5c89e4eSSatish Balay
MPI_Win_free(MPI_Win * win)438317ae730SBarry Smith int MPI_Win_free(MPI_Win *win)
439317ae730SBarry Smith {
440317ae730SBarry Smith free(*win);
441317ae730SBarry Smith *win = NULL;
442317ae730SBarry Smith return MPI_SUCCESS;
443317ae730SBarry Smith }
444317ae730SBarry Smith
MPI_Win_allocate_shared(size_t sz,size_t asz,MPI_Info info,MPI_Comm comm,void ** addr,MPI_Win * win)445317ae730SBarry Smith int MPI_Win_allocate_shared(size_t sz, size_t asz, MPI_Info info, MPI_Comm comm, void **addr, MPI_Win *win)
446317ae730SBarry Smith {
447317ae730SBarry Smith *win = *addr = malloc(sz);
448317ae730SBarry Smith return MPI_SUCCESS;
449317ae730SBarry Smith }
450317ae730SBarry Smith
451e5c89e4eSSatish Balay /* ------------------- Fortran versions of several routines ------------------ */
452e5c89e4eSSatish Balay
453f7c6e6aaSSatish Balay #if defined(PETSC_HAVE_FORTRAN_CAPS)
4540134af2dSBarry Smith #define mpiunisetmoduleblock_ MPIUNISETMODULEBLOCK
45552ecd5ffSSatish Balay #define mpiunisetfortranbasepointers_ MPIUNISETFORTRANBASEPOINTERS
456a7b85bbcSSatish Balay #define petsc_mpi_init_ PETSC_MPI_INIT
457a7b85bbcSSatish Balay #define petsc_mpi_finalize_ PETSC_MPI_FINALIZE
458a7b85bbcSSatish Balay #define petsc_mpi_comm_size_ PETSC_MPI_COMM_SIZE
459a7b85bbcSSatish Balay #define petsc_mpi_comm_rank_ PETSC_MPI_COMM_RANK
460a7b85bbcSSatish Balay #define petsc_mpi_abort_ PETSC_MPI_ABORT
461a7b85bbcSSatish Balay #define petsc_mpi_reduce_ PETSC_MPI_REDUCE
462a7b85bbcSSatish Balay #define petsc_mpi_allreduce_ PETSC_MPI_ALLREDUCE
463a7b85bbcSSatish Balay #define petsc_mpi_barrier_ PETSC_MPI_BARRIER
464a7b85bbcSSatish Balay #define petsc_mpi_bcast_ PETSC_MPI_BCAST
465a7b85bbcSSatish Balay #define petsc_mpi_gather_ PETSC_MPI_GATHER
466a7b85bbcSSatish Balay #define petsc_mpi_allgather_ PETSC_MPI_ALLGATHER
467a7b85bbcSSatish Balay #define petsc_mpi_comm_split_ PETSC_MPI_COMM_SPLIT
468a7b85bbcSSatish Balay #define petsc_mpi_scan_ PETSC_MPI_SCAN
469a7b85bbcSSatish Balay #define petsc_mpi_send_ PETSC_MPI_SEND
470a7b85bbcSSatish Balay #define petsc_mpi_recv_ PETSC_MPI_RECV
471a7b85bbcSSatish Balay #define petsc_mpi_reduce_scatter_ PETSC_MPI_REDUCE_SCATTER
472a7b85bbcSSatish Balay #define petsc_mpi_irecv_ PETSC_MPI_IRECV
473a7b85bbcSSatish Balay #define petsc_mpi_isend_ PETSC_MPI_ISEND
474a7b85bbcSSatish Balay #define petsc_mpi_sendrecv_ PETSC_MPI_SENDRECV
475a7b85bbcSSatish Balay #define petsc_mpi_test_ PETSC_MPI_TEST
476a7b85bbcSSatish Balay #define petsc_mpi_waitall_ PETSC_MPI_WAITALL
477a7b85bbcSSatish Balay #define petsc_mpi_waitany_ PETSC_MPI_WAITANY
478a7b85bbcSSatish Balay #define petsc_mpi_allgatherv_ PETSC_MPI_ALLGATHERV
479a7b85bbcSSatish Balay #define petsc_mpi_alltoallv_ PETSC_MPI_ALLTOALLV
480a7b85bbcSSatish Balay #define petsc_mpi_comm_create_ PETSC_MPI_COMM_CREATE
481a7b85bbcSSatish Balay #define petsc_mpi_address_ PETSC_MPI_ADDRESS
482a7b85bbcSSatish Balay #define petsc_mpi_pack_ PETSC_MPI_PACK
483a7b85bbcSSatish Balay #define petsc_mpi_unpack_ PETSC_MPI_UNPACK
484a7b85bbcSSatish Balay #define petsc_mpi_pack_size_ PETSC_MPI_PACK_SIZE
485a7b85bbcSSatish Balay #define petsc_mpi_type_struct_ PETSC_MPI_TYPE_STRUCT
486a7b85bbcSSatish Balay #define petsc_mpi_type_commit_ PETSC_MPI_TYPE_COMMIT
487a7b85bbcSSatish Balay #define petsc_mpi_wtime_ PETSC_MPI_WTIME
488a7b85bbcSSatish Balay #define petsc_mpi_cancel_ PETSC_MPI_CANCEL
489a7b85bbcSSatish Balay #define petsc_mpi_comm_dup_ PETSC_MPI_COMM_DUP
490a7b85bbcSSatish Balay #define petsc_mpi_comm_free_ PETSC_MPI_COMM_FREE
491a7b85bbcSSatish Balay #define petsc_mpi_get_count_ PETSC_MPI_GET_COUNT
492a7b85bbcSSatish Balay #define petsc_mpi_get_processor_name_ PETSC_MPI_GET_PROCESSOR_NAME
493a7b85bbcSSatish Balay #define petsc_mpi_initialized_ PETSC_MPI_INITIALIZED
494a7b85bbcSSatish Balay #define petsc_mpi_iprobe_ PETSC_MPI_IPROBE
495a7b85bbcSSatish Balay #define petsc_mpi_probe_ PETSC_MPI_PROBE
496a7b85bbcSSatish Balay #define petsc_mpi_request_free_ PETSC_MPI_REQUEST_FREE
497a7b85bbcSSatish Balay #define petsc_mpi_ssend_ PETSC_MPI_SSEND
498a7b85bbcSSatish Balay #define petsc_mpi_wait_ PETSC_MPI_WAIT
499a7b85bbcSSatish Balay #define petsc_mpi_comm_group_ PETSC_MPI_COMM_GROUP
500a7b85bbcSSatish Balay #define petsc_mpi_exscan_ PETSC_MPI_EXSCAN
501f7c6e6aaSSatish Balay #elif !defined(PETSC_HAVE_FORTRAN_UNDERSCORE)
5020134af2dSBarry Smith #define mpiunisetmoduleblock_ mpiunisetmoduleblock
50352ecd5ffSSatish Balay #define mpiunisetfortranbasepointers_ mpiunisetfortranbasepointers
504a7b85bbcSSatish Balay #define petsc_mpi_init_ petsc_mpi_init
505a7b85bbcSSatish Balay #define petsc_mpi_finalize_ petsc_mpi_finalize
506a7b85bbcSSatish Balay #define petsc_mpi_comm_size_ petsc_mpi_comm_size
507a7b85bbcSSatish Balay #define petsc_mpi_comm_rank_ petsc_mpi_comm_rank
508a7b85bbcSSatish Balay #define petsc_mpi_abort_ petsc_mpi_abort
509a7b85bbcSSatish Balay #define petsc_mpi_reduce_ petsc_mpi_reduce
510a7b85bbcSSatish Balay #define petsc_mpi_allreduce_ petsc_mpi_allreduce
511a7b85bbcSSatish Balay #define petsc_mpi_barrier_ petsc_mpi_barrier
512a7b85bbcSSatish Balay #define petsc_mpi_bcast_ petsc_mpi_bcast
513a7b85bbcSSatish Balay #define petsc_mpi_gather_ petsc_mpi_gather
514a7b85bbcSSatish Balay #define petsc_mpi_allgather_ petsc_mpi_allgather
515a7b85bbcSSatish Balay #define petsc_mpi_comm_split_ petsc_mpi_comm_split
516a7b85bbcSSatish Balay #define petsc_mpi_scan_ petsc_mpi_scan
517a7b85bbcSSatish Balay #define petsc_mpi_send_ petsc_mpi_send
518a7b85bbcSSatish Balay #define petsc_mpi_recv_ petsc_mpi_recv
519a7b85bbcSSatish Balay #define petsc_mpi_reduce_scatter_ petsc_mpi_reduce_scatter
520a7b85bbcSSatish Balay #define petsc_mpi_irecv_ petsc_mpi_irecv
521a7b85bbcSSatish Balay #define petsc_mpi_isend_ petsc_mpi_isend
522a7b85bbcSSatish Balay #define petsc_mpi_sendrecv_ petsc_mpi_sendrecv
523a7b85bbcSSatish Balay #define petsc_mpi_test_ petsc_mpi_test
524a7b85bbcSSatish Balay #define petsc_mpi_waitall_ petsc_mpi_waitall
525a7b85bbcSSatish Balay #define petsc_mpi_waitany_ petsc_mpi_waitany
526a7b85bbcSSatish Balay #define petsc_mpi_allgatherv_ petsc_mpi_allgatherv
527a7b85bbcSSatish Balay #define petsc_mpi_alltoallv_ petsc_mpi_alltoallv
528a7b85bbcSSatish Balay #define petsc_mpi_comm_create_ petsc_mpi_comm_create
529a7b85bbcSSatish Balay #define petsc_mpi_address_ petsc_mpi_address
530a7b85bbcSSatish Balay #define petsc_mpi_pack_ petsc_mpi_pack
531a7b85bbcSSatish Balay #define petsc_mpi_unpack_ petsc_mpi_unpack
532a7b85bbcSSatish Balay #define petsc_mpi_pack_size_ petsc_mpi_pack_size
533a7b85bbcSSatish Balay #define petsc_mpi_type_struct_ petsc_mpi_type_struct
534a7b85bbcSSatish Balay #define petsc_mpi_type_commit_ petsc_mpi_type_commit
535a7b85bbcSSatish Balay #define petsc_mpi_wtime_ petsc_mpi_wtime
536a7b85bbcSSatish Balay #define petsc_mpi_cancel_ petsc_mpi_cancel
537a7b85bbcSSatish Balay #define petsc_mpi_comm_dup_ petsc_mpi_comm_dup
538a7b85bbcSSatish Balay #define petsc_mpi_comm_free_ petsc_mpi_comm_free
539a7b85bbcSSatish Balay #define petsc_mpi_get_count_ petsc_mpi_get_count
540a7b85bbcSSatish Balay #define petsc_mpi_get_processor_name_ petsc_mpi_get_processor_name
541a7b85bbcSSatish Balay #define petsc_mpi_initialized_ petsc_mpi_initialized
542a7b85bbcSSatish Balay #define petsc_mpi_iprobe_ petsc_mpi_iprobe
543a7b85bbcSSatish Balay #define petsc_mpi_probe_ petsc_mpi_probe
544a7b85bbcSSatish Balay #define petsc_mpi_request_free_ petsc_mpi_request_free
545a7b85bbcSSatish Balay #define petsc_mpi_ssend_ petsc_mpi_ssend
546a7b85bbcSSatish Balay #define petsc_mpi_wait_ petsc_mpi_wait
547a7b85bbcSSatish Balay #define petsc_mpi_comm_group_ petsc_mpi_comm_group
548a7b85bbcSSatish Balay #define petsc_mpi_exscan_ petsc_mpi_exscan
549f7c6e6aaSSatish Balay #endif
550e5c89e4eSSatish Balay
551f7c6e6aaSSatish Balay #if defined(PETSC_HAVE_FORTRAN_UNDERSCORE_UNDERSCORE)
552a7b85bbcSSatish Balay #define petsc_mpi_init_ petsc_mpi_init__
553a7b85bbcSSatish Balay #define petsc_mpi_finalize_ petsc_mpi_finalize__
554a7b85bbcSSatish Balay #define petsc_mpi_comm_size_ petsc_mpi_comm_size__
555a7b85bbcSSatish Balay #define petsc_mpi_comm_rank_ petsc_mpi_comm_rank__
556a7b85bbcSSatish Balay #define petsc_mpi_abort_ petsc_mpi_abort__
557a7b85bbcSSatish Balay #define petsc_mpi_reduce_ petsc_mpi_reduce__
558a7b85bbcSSatish Balay #define petsc_mpi_allreduce_ petsc_mpi_allreduce__
559a7b85bbcSSatish Balay #define petsc_mpi_barrier_ petsc_mpi_barrier__
560a7b85bbcSSatish Balay #define petsc_mpi_bcast_ petsc_mpi_bcast__
561a7b85bbcSSatish Balay #define petsc_mpi_gather_ petsc_mpi_gather__
562a7b85bbcSSatish Balay #define petsc_mpi_allgather_ petsc_mpi_allgather__
563a7b85bbcSSatish Balay #define petsc_mpi_comm_split_ petsc_mpi_comm_split__
564a7b85bbcSSatish Balay #define petsc_mpi_scan_ petsc_mpi_scan__
565a7b85bbcSSatish Balay #define petsc_mpi_send_ petsc_mpi_send__
566a7b85bbcSSatish Balay #define petsc_mpi_recv_ petsc_mpi_recv__
567a7b85bbcSSatish Balay #define petsc_mpi_reduce_scatter_ petsc_mpi_reduce_scatter__
568a7b85bbcSSatish Balay #define petsc_mpi_irecv_ petsc_mpi_irecv__
569a7b85bbcSSatish Balay #define petsc_mpi_isend_ petsc_mpi_isend__
570a7b85bbcSSatish Balay #define petsc_mpi_sendrecv_ petsc_mpi_sendrecv__
571a7b85bbcSSatish Balay #define petsc_mpi_test_ petsc_mpi_test__
572a7b85bbcSSatish Balay #define petsc_mpi_waitall_ petsc_mpi_waitall__
573a7b85bbcSSatish Balay #define petsc_mpi_waitany_ petsc_mpi_waitany__
574a7b85bbcSSatish Balay #define petsc_mpi_allgatherv_ petsc_mpi_allgatherv__
575a7b85bbcSSatish Balay #define petsc_mpi_alltoallv_ petsc_mpi_alltoallv__
576a7b85bbcSSatish Balay #define petsc_mpi_comm_create_ petsc_mpi_comm_create__
577a7b85bbcSSatish Balay #define petsc_mpi_address_ petsc_mpi_address__
578a7b85bbcSSatish Balay #define petsc_mpi_pack_ petsc_mpi_pack__
579a7b85bbcSSatish Balay #define petsc_mpi_unpack_ petsc_mpi_unpack__
580a7b85bbcSSatish Balay #define petsc_mpi_pack_size_ petsc_mpi_pack_size__
581a7b85bbcSSatish Balay #define petsc_mpi_type_struct_ petsc_mpi_type_struct__
582a7b85bbcSSatish Balay #define petsc_mpi_type_commit_ petsc_mpi_type_commit__
583a7b85bbcSSatish Balay #define petsc_mpi_wtime_ petsc_mpi_wtime__
584a7b85bbcSSatish Balay #define petsc_mpi_cancel_ petsc_mpi_cancel__
585a7b85bbcSSatish Balay #define petsc_mpi_comm_dup_ petsc_mpi_comm_dup__
586a7b85bbcSSatish Balay #define petsc_mpi_comm_free_ petsc_mpi_comm_free__
587a7b85bbcSSatish Balay #define petsc_mpi_get_count_ petsc_mpi_get_count__
588a7b85bbcSSatish Balay #define petsc_mpi_get_processor_name_ petsc_mpi_get_processor_name__
589a7b85bbcSSatish Balay #define petsc_mpi_initialized_ petsc_mpi_initialized__
590a7b85bbcSSatish Balay #define petsc_mpi_iprobe_ petsc_mpi_iprobe__
591a7b85bbcSSatish Balay #define petsc_mpi_probe_ petsc_mpi_probe__
592a7b85bbcSSatish Balay #define petsc_mpi_request_free_ petsc_mpi_request_free__
593a7b85bbcSSatish Balay #define petsc_mpi_ssend_ petsc_mpi_ssend__
594a7b85bbcSSatish Balay #define petsc_mpi_wait_ petsc_mpi_wait__
595a7b85bbcSSatish Balay #define petsc_mpi_comm_group_ petsc_mpi_comm_group__
596a7b85bbcSSatish Balay #define petsc_mpi_exscan_ petsc_mpi_exscan__
597f7c6e6aaSSatish Balay #endif
598e5c89e4eSSatish Balay
599da81f932SPierre Jolivet /* Do not build fortran interface if MPI namespace collision is to be avoided */
600fbf9dbe5SBarry Smith #if defined(PETSC_USE_FORTRAN_BINDINGS)
601c8217ed5SSatish Balay
60219caf8f3SSatish Balay PETSC_EXTERN void mpiunisetmoduleblock_(void);
60352ecd5ffSSatish Balay
mpiunisetfortranbasepointers_(void * f_mpi_in_place)604d71ae5a4SJacob Faibussowitsch PETSC_EXTERN void mpiunisetfortranbasepointers_(void *f_mpi_in_place)
605d71ae5a4SJacob Faibussowitsch {
60652ecd5ffSSatish Balay MPIUNIF_mpi_in_place = f_mpi_in_place;
60752ecd5ffSSatish Balay }
60852ecd5ffSSatish Balay
petsc_mpi_init_(int * ierr)609d71ae5a4SJacob Faibussowitsch PETSC_EXTERN void petsc_mpi_init_(int *ierr)
610d71ae5a4SJacob Faibussowitsch {
6110134af2dSBarry Smith mpiunisetmoduleblock_();
612c8025a54SPierre Jolivet *ierr = MPI_Init(NULL, NULL);
613e5c89e4eSSatish Balay }
614e5c89e4eSSatish Balay
petsc_mpi_finalize_(int * ierr)615d71ae5a4SJacob Faibussowitsch PETSC_EXTERN void petsc_mpi_finalize_(int *ierr)
616d71ae5a4SJacob Faibussowitsch {
617c8217ed5SSatish Balay *ierr = MPI_Finalize();
618e5c89e4eSSatish Balay }
619e5c89e4eSSatish Balay
petsc_mpi_comm_size_(MPI_Comm * comm,int * size,int * ierr)620d71ae5a4SJacob Faibussowitsch PETSC_EXTERN void petsc_mpi_comm_size_(MPI_Comm *comm, int *size, int *ierr)
621d71ae5a4SJacob Faibussowitsch {
622e5c89e4eSSatish Balay *size = 1;
623e5c89e4eSSatish Balay *ierr = 0;
624e5c89e4eSSatish Balay }
625e5c89e4eSSatish Balay
petsc_mpi_comm_rank_(MPI_Comm * comm,int * rank,int * ierr)626d71ae5a4SJacob Faibussowitsch PETSC_EXTERN void petsc_mpi_comm_rank_(MPI_Comm *comm, int *rank, int *ierr)
627d71ae5a4SJacob Faibussowitsch {
628e5c89e4eSSatish Balay *rank = 0;
629e5c89e4eSSatish Balay *ierr = MPI_SUCCESS;
630e5c89e4eSSatish Balay }
631e5c89e4eSSatish Balay
petsc_mpi_comm_split_(MPI_Comm * comm,int * color,int * key,MPI_Comm * newcomm,int * ierr)632d71ae5a4SJacob Faibussowitsch PETSC_EXTERN void petsc_mpi_comm_split_(MPI_Comm *comm, int *color, int *key, MPI_Comm *newcomm, int *ierr)
633d71ae5a4SJacob Faibussowitsch {
6341f6cc5b2SSatish Balay *newcomm = *comm;
6351f6cc5b2SSatish Balay *ierr = MPI_SUCCESS;
6361f6cc5b2SSatish Balay }
6371f6cc5b2SSatish Balay
petsc_mpi_abort_(MPI_Comm * comm,int * errorcode,int * ierr)638d71ae5a4SJacob Faibussowitsch PETSC_EXTERN void petsc_mpi_abort_(MPI_Comm *comm, int *errorcode, int *ierr)
639d71ae5a4SJacob Faibussowitsch {
640e5c89e4eSSatish Balay abort();
641e5c89e4eSSatish Balay *ierr = MPI_SUCCESS;
642e5c89e4eSSatish Balay }
643e5c89e4eSSatish Balay
petsc_mpi_reduce_(void * sendbuf,void * recvbuf,int * count,int * datatype,int * op,int * root,int * comm,int * ierr)644d71ae5a4SJacob Faibussowitsch PETSC_EXTERN void petsc_mpi_reduce_(void *sendbuf, void *recvbuf, int *count, int *datatype, int *op, int *root, int *comm, int *ierr)
645d71ae5a4SJacob Faibussowitsch {
646f30578ecSBarry Smith *ierr = MPI_Reduce(sendbuf, recvbuf, *count, *datatype, *op, *root, *comm);
6473b644628SSatish Balay }
6483b644628SSatish Balay
petsc_mpi_allreduce_(void * sendbuf,void * recvbuf,int * count,int * datatype,int * op,int * comm,int * ierr)649d71ae5a4SJacob Faibussowitsch PETSC_EXTERN void petsc_mpi_allreduce_(void *sendbuf, void *recvbuf, int *count, int *datatype, int *op, int *comm, int *ierr)
650d71ae5a4SJacob Faibussowitsch {
651f30578ecSBarry Smith *ierr = MPI_Allreduce(sendbuf, recvbuf, *count, *datatype, *op, *comm);
652e5c89e4eSSatish Balay }
653e5c89e4eSSatish Balay
petsc_mpi_barrier_(MPI_Comm * comm,int * ierr)654d71ae5a4SJacob Faibussowitsch PETSC_EXTERN void petsc_mpi_barrier_(MPI_Comm *comm, int *ierr)
655d71ae5a4SJacob Faibussowitsch {
656e5c89e4eSSatish Balay *ierr = MPI_SUCCESS;
657e5c89e4eSSatish Balay }
658f7c6e6aaSSatish Balay
petsc_mpi_bcast_(void * buf,int * count,int * datatype,int * root,int * comm,int * ierr)659d71ae5a4SJacob Faibussowitsch PETSC_EXTERN void petsc_mpi_bcast_(void *buf, int *count, int *datatype, int *root, int *comm, int *ierr)
660d71ae5a4SJacob Faibussowitsch {
661e5c89e4eSSatish Balay *ierr = MPI_SUCCESS;
662e5c89e4eSSatish Balay }
663f7c6e6aaSSatish Balay
petsc_mpi_gather_(void * sendbuf,int * scount,int * sdatatype,void * recvbuf,int * rcount,int * rdatatype,int * root,int * comm,int * ierr)664d71ae5a4SJacob Faibussowitsch PETSC_EXTERN void petsc_mpi_gather_(void *sendbuf, int *scount, int *sdatatype, void *recvbuf, int *rcount, int *rdatatype, int *root, int *comm, int *ierr)
665d71ae5a4SJacob Faibussowitsch {
666f30578ecSBarry Smith *ierr = MPI_Gather(sendbuf, *scount, *sdatatype, recvbuf, rcount, rdatatype, *root, *comm);
667f7c6e6aaSSatish Balay }
668f7c6e6aaSSatish Balay
petsc_mpi_allgather_(void * sendbuf,int * scount,int * sdatatype,void * recvbuf,int * rcount,int * rdatatype,int * comm,int * ierr)669d71ae5a4SJacob Faibussowitsch PETSC_EXTERN void petsc_mpi_allgather_(void *sendbuf, int *scount, int *sdatatype, void *recvbuf, int *rcount, int *rdatatype, int *comm, int *ierr)
670d71ae5a4SJacob Faibussowitsch {
671f30578ecSBarry Smith *ierr = MPI_Allgather(sendbuf, *scount, *sdatatype, recvbuf, rcount, rdatatype, *comm);
672e5c89e4eSSatish Balay }
673e5c89e4eSSatish Balay
petsc_mpi_scan_(void * sendbuf,void * recvbuf,int * count,int * datatype,int * op,int * comm,int * ierr)674d71ae5a4SJacob Faibussowitsch PETSC_EXTERN void petsc_mpi_scan_(void *sendbuf, void *recvbuf, int *count, int *datatype, int *op, int *comm, int *ierr)
675d71ae5a4SJacob Faibussowitsch {
6761a589b05SJed Brown *ierr = MPIUNI_Memcpy(recvbuf, sendbuf, (*count) * MPI_sizeof(*datatype));
6773b644628SSatish Balay }
6783b644628SSatish Balay
petsc_mpi_send_(void * buf,int * count,int * datatype,int * dest,int * tag,int * comm,int * ierr)679d71ae5a4SJacob Faibussowitsch PETSC_EXTERN void petsc_mpi_send_(void *buf, int *count, int *datatype, int *dest, int *tag, int *comm, int *ierr)
680d71ae5a4SJacob Faibussowitsch {
68106df1fb1SBarry Smith *ierr = MPIUni_Abort(MPI_COMM_WORLD, 0);
6821086b069SSatish Balay }
6831086b069SSatish Balay
petsc_mpi_recv_(void * buf,int * count,int * datatype,int * source,int * tag,int * comm,int status,int * ierr)684d71ae5a4SJacob Faibussowitsch PETSC_EXTERN void petsc_mpi_recv_(void *buf, int *count, int *datatype, int *source, int *tag, int *comm, int status, int *ierr)
685d71ae5a4SJacob Faibussowitsch {
68606df1fb1SBarry Smith *ierr = MPIUni_Abort(MPI_COMM_WORLD, 0);
6871086b069SSatish Balay }
6881086b069SSatish Balay
petsc_mpi_reduce_scatter_(void * sendbuf,void * recvbuf,int * recvcounts,int * datatype,int * op,int * comm,int * ierr)689d71ae5a4SJacob Faibussowitsch PETSC_EXTERN void petsc_mpi_reduce_scatter_(void *sendbuf, void *recvbuf, int *recvcounts, int *datatype, int *op, int *comm, int *ierr)
690d71ae5a4SJacob Faibussowitsch {
69106df1fb1SBarry Smith *ierr = MPIUni_Abort(MPI_COMM_WORLD, 0);
692156bc490SSatish Balay }
693156bc490SSatish Balay
petsc_mpi_irecv_(void * buf,int * count,int * datatype,int * source,int * tag,int * comm,int * request,int * ierr)694d71ae5a4SJacob Faibussowitsch PETSC_EXTERN void petsc_mpi_irecv_(void *buf, int *count, int *datatype, int *source, int *tag, int *comm, int *request, int *ierr)
695d71ae5a4SJacob Faibussowitsch {
69606df1fb1SBarry Smith *ierr = MPIUni_Abort(MPI_COMM_WORLD, 0);
697156bc490SSatish Balay }
698156bc490SSatish Balay
petsc_mpi_isend_(void * buf,int * count,int * datatype,int * dest,int * tag,int * comm,int * request,int * ierr)699d71ae5a4SJacob Faibussowitsch PETSC_EXTERN void petsc_mpi_isend_(void *buf, int *count, int *datatype, int *dest, int *tag, int *comm, int *request, int *ierr)
700d71ae5a4SJacob Faibussowitsch {
70106df1fb1SBarry Smith *ierr = MPIUni_Abort(MPI_COMM_WORLD, 0);
702156bc490SSatish Balay }
703156bc490SSatish Balay
petsc_mpi_sendrecv_(void * sendbuf,int * sendcount,int * sendtype,int * dest,int * sendtag,void * recvbuf,int * recvcount,int * recvtype,int * source,int * recvtag,int * comm,int * status,int * ierr)704d71ae5a4SJacob Faibussowitsch 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)
705d71ae5a4SJacob Faibussowitsch {
7061a589b05SJed Brown *ierr = MPIUNI_Memcpy(recvbuf, sendbuf, (*sendcount) * MPI_sizeof(*sendtype));
707156bc490SSatish Balay }
708156bc490SSatish Balay
petsc_mpi_test_(int * request,int * flag,int * status,int * ierr)709d71ae5a4SJacob Faibussowitsch PETSC_EXTERN void petsc_mpi_test_(int *request, int *flag, int *status, int *ierr)
710d71ae5a4SJacob Faibussowitsch {
71106df1fb1SBarry Smith *ierr = MPIUni_Abort(MPI_COMM_WORLD, 0);
712156bc490SSatish Balay }
713156bc490SSatish Balay
petsc_mpi_waitall_(int * count,int * array_of_requests,int * array_of_statuses,int * ierr)714d71ae5a4SJacob Faibussowitsch PETSC_EXTERN void petsc_mpi_waitall_(int *count, int *array_of_requests, int *array_of_statuses, int *ierr)
715d71ae5a4SJacob Faibussowitsch {
716156bc490SSatish Balay *ierr = MPI_SUCCESS;
717156bc490SSatish Balay }
718156bc490SSatish Balay
petsc_mpi_waitany_(int * count,int * array_of_requests,int * index,int * status,int * ierr)719d71ae5a4SJacob Faibussowitsch PETSC_EXTERN void petsc_mpi_waitany_(int *count, int *array_of_requests, int *index, int *status, int *ierr)
720d71ae5a4SJacob Faibussowitsch {
721156bc490SSatish Balay *ierr = MPI_SUCCESS;
722156bc490SSatish Balay }
723156bc490SSatish Balay
petsc_mpi_allgatherv_(void * sendbuf,int * sendcount,int * sendtype,void * recvbuf,int * recvcounts,int * displs,int * recvtype,int * comm,int * ierr)724d71ae5a4SJacob Faibussowitsch PETSC_EXTERN void petsc_mpi_allgatherv_(void *sendbuf, int *sendcount, int *sendtype, void *recvbuf, int *recvcounts, int *displs, int *recvtype, int *comm, int *ierr)
725d71ae5a4SJacob Faibussowitsch {
726f30578ecSBarry Smith *ierr = MPI_Allgatherv(sendbuf, *sendcount, *sendtype, recvbuf, recvcounts, displs, *recvtype, *comm);
727156bc490SSatish Balay }
728156bc490SSatish Balay
petsc_mpi_alltoallv_(void * sendbuf,int * sendcounts,int * sdispls,int * sendtype,void * recvbuf,int * recvcounts,int * rdispls,int * recvtype,int * comm,int * ierr)729d71ae5a4SJacob Faibussowitsch 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)
730d71ae5a4SJacob Faibussowitsch {
731f30578ecSBarry Smith *ierr = MPI_Alltoallv(sendbuf, sendcounts, sdispls, *sendtype, recvbuf, recvcounts, rdispls, *recvtype, *comm);
732156bc490SSatish Balay }
733156bc490SSatish Balay
petsc_mpi_comm_create_(int * comm,int * group,int * newcomm,int * ierr)734d71ae5a4SJacob Faibussowitsch PETSC_EXTERN void petsc_mpi_comm_create_(int *comm, int *group, int *newcomm, int *ierr)
735d71ae5a4SJacob Faibussowitsch {
736156bc490SSatish Balay *newcomm = *comm;
737156bc490SSatish Balay *ierr = MPI_SUCCESS;
738156bc490SSatish Balay }
739156bc490SSatish Balay
petsc_mpi_address_(void * location,MPI_Aint * address,int * ierr)740d71ae5a4SJacob Faibussowitsch PETSC_EXTERN void petsc_mpi_address_(void *location, MPI_Aint *address, int *ierr)
741d71ae5a4SJacob Faibussowitsch {
74299256852SLisandro Dalcin *address = (MPI_Aint)((char *)location);
743156bc490SSatish Balay *ierr = MPI_SUCCESS;
744156bc490SSatish Balay }
745156bc490SSatish Balay
petsc_mpi_pack_(void * inbuf,int * incount,int * datatype,void * outbuf,int * outsize,int * position,int * comm,int * ierr)746d71ae5a4SJacob Faibussowitsch PETSC_EXTERN void petsc_mpi_pack_(void *inbuf, int *incount, int *datatype, void *outbuf, int *outsize, int *position, int *comm, int *ierr)
747d71ae5a4SJacob Faibussowitsch {
74806df1fb1SBarry Smith *ierr = MPIUni_Abort(MPI_COMM_WORLD, 0);
749156bc490SSatish Balay }
750156bc490SSatish Balay
petsc_mpi_unpack_(void * inbuf,int * insize,int * position,void * outbuf,int * outcount,int * datatype,int * comm,int * ierr)751d71ae5a4SJacob Faibussowitsch PETSC_EXTERN void petsc_mpi_unpack_(void *inbuf, int *insize, int *position, void *outbuf, int *outcount, int *datatype, int *comm, int *ierr)
752d71ae5a4SJacob Faibussowitsch {
75306df1fb1SBarry Smith *ierr = MPIUni_Abort(MPI_COMM_WORLD, 0);
754156bc490SSatish Balay }
755156bc490SSatish Balay
petsc_mpi_pack_size_(int * incount,int * datatype,int * comm,int * size,int * ierr)756d71ae5a4SJacob Faibussowitsch PETSC_EXTERN void petsc_mpi_pack_size_(int *incount, int *datatype, int *comm, int *size, int *ierr)
757d71ae5a4SJacob Faibussowitsch {
75806df1fb1SBarry Smith *ierr = MPIUni_Abort(MPI_COMM_WORLD, 0);
759156bc490SSatish Balay }
760156bc490SSatish Balay
petsc_mpi_type_struct_(int * count,int * array_of_blocklengths,int * array_of_displaments,int * array_of_types,int * newtype,int * ierr)761d71ae5a4SJacob Faibussowitsch PETSC_EXTERN void petsc_mpi_type_struct_(int *count, int *array_of_blocklengths, int *array_of_displaments, int *array_of_types, int *newtype, int *ierr)
762d71ae5a4SJacob Faibussowitsch {
76306df1fb1SBarry Smith *ierr = MPIUni_Abort(MPI_COMM_WORLD, 0);
764156bc490SSatish Balay }
765156bc490SSatish Balay
petsc_mpi_type_commit_(int * datatype,int * ierr)766d71ae5a4SJacob Faibussowitsch PETSC_EXTERN void petsc_mpi_type_commit_(int *datatype, int *ierr)
767d71ae5a4SJacob Faibussowitsch {
768156bc490SSatish Balay *ierr = MPI_SUCCESS;
769156bc490SSatish Balay }
770156bc490SSatish Balay
petsc_mpi_wtime_(void)771d71ae5a4SJacob Faibussowitsch double petsc_mpi_wtime_(void)
772d71ae5a4SJacob Faibussowitsch {
773156bc490SSatish Balay return 0.0;
774f8f52c7dSSatish Balay }
775156bc490SSatish Balay
petsc_mpi_cancel_(int * request,int * ierr)776d71ae5a4SJacob Faibussowitsch PETSC_EXTERN void petsc_mpi_cancel_(int *request, int *ierr)
777d71ae5a4SJacob Faibussowitsch {
778f8f52c7dSSatish Balay *ierr = MPI_SUCCESS;
779f8f52c7dSSatish Balay }
780f8f52c7dSSatish Balay
petsc_mpi_comm_dup_(int * comm,int * out,int * ierr)781d71ae5a4SJacob Faibussowitsch PETSC_EXTERN void petsc_mpi_comm_dup_(int *comm, int *out, int *ierr)
782d71ae5a4SJacob Faibussowitsch {
783f8f52c7dSSatish Balay *out = *comm;
784f8f52c7dSSatish Balay *ierr = MPI_SUCCESS;
785f8f52c7dSSatish Balay }
786f8f52c7dSSatish Balay
petsc_mpi_comm_free_(int * comm,int * ierr)787d71ae5a4SJacob Faibussowitsch PETSC_EXTERN void petsc_mpi_comm_free_(int *comm, int *ierr)
788d71ae5a4SJacob Faibussowitsch {
789f8f52c7dSSatish Balay *ierr = MPI_SUCCESS;
790f8f52c7dSSatish Balay }
791f8f52c7dSSatish Balay
petsc_mpi_get_count_(int * status,int * datatype,int * count,int * ierr)792d71ae5a4SJacob Faibussowitsch PETSC_EXTERN void petsc_mpi_get_count_(int *status, int *datatype, int *count, int *ierr)
793d71ae5a4SJacob Faibussowitsch {
79406df1fb1SBarry Smith *ierr = MPIUni_Abort(MPI_COMM_WORLD, 0);
795f8f52c7dSSatish Balay }
796f8f52c7dSSatish Balay
petsc_mpi_get_processor_name_(char * name,int * result_len,int * ierr,PETSC_FORTRAN_CHARLEN_T len)797d71ae5a4SJacob Faibussowitsch PETSC_EXTERN void petsc_mpi_get_processor_name_(char *name, int *result_len, int *ierr, PETSC_FORTRAN_CHARLEN_T len)
798d71ae5a4SJacob Faibussowitsch {
799f8f52c7dSSatish Balay MPIUNI_Memcpy(name, "localhost", 9 * sizeof(char));
800f8f52c7dSSatish Balay *result_len = 9;
801f8f52c7dSSatish Balay *ierr = MPI_SUCCESS;
802f8f52c7dSSatish Balay }
803f8f52c7dSSatish Balay
petsc_mpi_initialized_(int * flag,int * ierr)804d71ae5a4SJacob Faibussowitsch PETSC_EXTERN void petsc_mpi_initialized_(int *flag, int *ierr)
805d71ae5a4SJacob Faibussowitsch {
806f8f52c7dSSatish Balay *flag = MPI_was_initialized;
807f8f52c7dSSatish Balay *ierr = MPI_SUCCESS;
808f8f52c7dSSatish Balay }
809f8f52c7dSSatish Balay
petsc_mpi_iprobe_(int * source,int * tag,int * comm,int * glag,int * status,int * ierr)810d71ae5a4SJacob Faibussowitsch PETSC_EXTERN void petsc_mpi_iprobe_(int *source, int *tag, int *comm, int *glag, int *status, int *ierr)
811d71ae5a4SJacob Faibussowitsch {
812f8f52c7dSSatish Balay *ierr = MPI_SUCCESS;
813f8f52c7dSSatish Balay }
814f8f52c7dSSatish Balay
petsc_mpi_probe_(int * source,int * tag,int * comm,int * flag,int * status,int * ierr)815d71ae5a4SJacob Faibussowitsch PETSC_EXTERN void petsc_mpi_probe_(int *source, int *tag, int *comm, int *flag, int *status, int *ierr)
816d71ae5a4SJacob Faibussowitsch {
817f8f52c7dSSatish Balay *ierr = MPI_SUCCESS;
818f8f52c7dSSatish Balay }
819f8f52c7dSSatish Balay
petsc_mpi_request_free_(int * request,int * ierr)820d71ae5a4SJacob Faibussowitsch PETSC_EXTERN void petsc_mpi_request_free_(int *request, int *ierr)
821d71ae5a4SJacob Faibussowitsch {
822f8f52c7dSSatish Balay *ierr = MPI_SUCCESS;
823f8f52c7dSSatish Balay }
824f8f52c7dSSatish Balay
petsc_mpi_ssend_(void * buf,int * count,int * datatype,int * dest,int * tag,int * comm,int * ierr)825d71ae5a4SJacob Faibussowitsch PETSC_EXTERN void petsc_mpi_ssend_(void *buf, int *count, int *datatype, int *dest, int *tag, int *comm, int *ierr)
826d71ae5a4SJacob Faibussowitsch {
82706df1fb1SBarry Smith *ierr = MPIUni_Abort(MPI_COMM_WORLD, 0);
828f8f52c7dSSatish Balay }
829f8f52c7dSSatish Balay
petsc_mpi_wait_(int * request,int * status,int * ierr)830d71ae5a4SJacob Faibussowitsch PETSC_EXTERN void petsc_mpi_wait_(int *request, int *status, int *ierr)
831d71ae5a4SJacob Faibussowitsch {
832f8f52c7dSSatish Balay *ierr = MPI_SUCCESS;
833156bc490SSatish Balay }
834156bc490SSatish Balay
petsc_mpi_comm_group_(int * comm,int * group,int * ierr)835d71ae5a4SJacob Faibussowitsch PETSC_EXTERN void petsc_mpi_comm_group_(int *comm, int *group, int *ierr)
836d71ae5a4SJacob Faibussowitsch {
837d4816372SSatish Balay *ierr = MPI_SUCCESS;
838d4816372SSatish Balay }
839d4816372SSatish Balay
petsc_mpi_exscan_(void * sendbuf,void * recvbuf,int * count,int * datatype,int * op,int * comm,int * ierr)840d71ae5a4SJacob Faibussowitsch PETSC_EXTERN void petsc_mpi_exscan_(void *sendbuf, void *recvbuf, int *count, int *datatype, int *op, int *comm, int *ierr)
841d71ae5a4SJacob Faibussowitsch {
842d4816372SSatish Balay *ierr = MPI_SUCCESS;
843d4816372SSatish Balay }
844d4816372SSatish Balay
845fbf9dbe5SBarry Smith #endif /* PETSC_USE_FORTRAN_BINDINGS */
846c8217ed5SSatish Balay
847e5c89e4eSSatish Balay #if defined(__cplusplus)
848e5c89e4eSSatish Balay }
849e5c89e4eSSatish Balay #endif
850