xref: /petsc/src/sys/mpiuni/mpi.c (revision 9371c9d470a9602b6d10a8bf50c9b2280a79e45a)
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 */
60*9371c9d4SSatish 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)
67*9371c9d4SSatish Balay   if (PetscDeviceInitialized(PETSC_DEVICE_CUDA)) {
68*9371c9d4SSatish Balay     cudaError_t cerr = cudaMemcpy(dst, src, n, cudaMemcpyDefault);
69*9371c9d4SSatish Balay     if (cerr != cudaSuccess) return MPI_FAILURE;
70*9371c9d4SSatish Balay   } else
7105035670SJunchao Zhang #elif defined(PETSC_HAVE_HIP)
72*9371c9d4SSatish Balay   if (PetscDeviceInitialized(PETSC_DEVICE_HIP)) {
73*9371c9d4SSatish Balay     hipError_t cerr = hipMemcpy(dst, src, n, hipMemcpyDefault);
74*9371c9d4SSatish Balay     if (cerr != hipSuccess) return MPI_FAILURE;
75*9371c9d4SSatish Balay   } else
76a6191124SJunchao Zhang #endif
77*9371c9d4SSatish Balay   {
78*9371c9d4SSatish Balay     memcpy(dst, src, n);
79*9371c9d4SSatish Balay   }
8099256852SLisandro Dalcin   return MPI_SUCCESS;
81e5c89e4eSSatish Balay }
82e5c89e4eSSatish Balay 
8312801b39SBarry Smith static int classcnt = 0;
8412801b39SBarry Smith static int codecnt  = 0;
8512801b39SBarry Smith 
86*9371c9d4SSatish Balay int MPI_Add_error_class(int *cl) {
8712801b39SBarry Smith   *cl = classcnt++;
8812801b39SBarry Smith   return MPI_SUCCESS;
8912801b39SBarry Smith }
9012801b39SBarry Smith 
91*9371c9d4SSatish 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 
97*9371c9d4SSatish 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;
118*9371c9d4SSatish Balay   default: return MPIUni_Abort(MPI_COMM_SELF, 1);
1191a589b05SJed Brown   }
12099256852SLisandro Dalcin   return MPI_SUCCESS;
1211a589b05SJed Brown }
1221a589b05SJed Brown 
123*9371c9d4SSatish 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) {
126*9371c9d4SSatish 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;
136*9371c9d4SSatish 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 */
144*9371c9d4SSatish 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 
153*9371c9d4SSatish 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*9371c9d4SSatish Balay int MPI_Comm_free_keyval(int *keyval) {
173a246e310SBarry Smith   attr_keyval[*keyval].extra_state = 0;
174a246e310SBarry Smith   attr_keyval[*keyval].del         = 0;
175f0463fa0SJunchao Zhang   attr_keyval[*keyval].active      = 0;
176a246e310SBarry Smith   *keyval                          = 0;
177e5c89e4eSSatish Balay   return MPI_SUCCESS;
178e5c89e4eSSatish Balay }
179e5c89e4eSSatish Balay 
180*9371c9d4SSatish Balay int MPI_Comm_set_attr(MPI_Comm comm, int keyval, void *attribute_val) {
181f0463fa0SJunchao Zhang   int idx = CommIdx(comm);
182f0463fa0SJunchao Zhang   if (comm < 1 || comm > MaxComm) return MPI_FAILURE;
183f0463fa0SJunchao Zhang   attr[idx][keyval].active        = 1;
184f0463fa0SJunchao Zhang   attr[idx][keyval].attribute_val = attribute_val;
185e5c89e4eSSatish Balay   return MPI_SUCCESS;
186e5c89e4eSSatish Balay }
187e5c89e4eSSatish Balay 
188*9371c9d4SSatish Balay int MPI_Comm_delete_attr(MPI_Comm comm, int keyval) {
189f0463fa0SJunchao Zhang   int idx = CommIdx(comm);
190f0463fa0SJunchao Zhang   if (comm < 1 || comm > MaxComm) return MPI_FAILURE;
191f0463fa0SJunchao Zhang   if (attr[idx][keyval].active && attr_keyval[keyval].del) {
192f0463fa0SJunchao Zhang     void *save_attribute_val        = attr[idx][keyval].attribute_val;
193f0463fa0SJunchao Zhang     attr[idx][keyval].active        = 0;
194f0463fa0SJunchao Zhang     attr[idx][keyval].attribute_val = 0;
19546651e72SBarry Smith     (*(attr_keyval[keyval].del))(comm, keyval, save_attribute_val, attr_keyval[keyval].extra_state);
19640776e1bSpetsc   }
197e5c89e4eSSatish Balay   return MPI_SUCCESS;
198e5c89e4eSSatish Balay }
199e5c89e4eSSatish Balay 
200*9371c9d4SSatish Balay int MPI_Comm_get_attr(MPI_Comm comm, int keyval, void *attribute_val, int *flag) {
201f0463fa0SJunchao Zhang   int idx = CommIdx(comm);
202f0463fa0SJunchao Zhang   if (comm < 1 || comm > MaxComm) return MPI_FAILURE;
203e5c89e4eSSatish Balay   if (!keyval) Keyval_setup();
204f0463fa0SJunchao Zhang   *flag                   = attr[idx][keyval].active;
205f0463fa0SJunchao Zhang   *(void **)attribute_val = attr[idx][keyval].attribute_val;
206e5c89e4eSSatish Balay   return MPI_SUCCESS;
207e5c89e4eSSatish Balay }
208e5c89e4eSSatish Balay 
209*9371c9d4SSatish Balay static char all_comm_names[MAX_COMM][MPI_MAX_OBJECT_NAME] = {"MPI_COMM_SELF", "MPI_COMM_WORLD"};
2103e1d142dSJacob Faibussowitsch 
211*9371c9d4SSatish Balay int MPI_Comm_get_name(MPI_Comm comm, char *comm_name, int *resultlen) {
2123e1d142dSJacob Faibussowitsch   if (comm < 1 || comm > MaxComm) return MPI_FAILURE;
2133e1d142dSJacob Faibussowitsch   if (!comm_name || !resultlen) return MPI_FAILURE;
2143e1d142dSJacob Faibussowitsch   strncpy(comm_name, all_comm_names[CommIdx(comm)], MPI_MAX_OBJECT_NAME - 1);
2153e1d142dSJacob Faibussowitsch   *resultlen = (int)strlen(comm_name);
2163e1d142dSJacob Faibussowitsch   return MPI_SUCCESS;
2173e1d142dSJacob Faibussowitsch }
2183e1d142dSJacob Faibussowitsch 
219*9371c9d4SSatish Balay int MPI_Comm_set_name(MPI_Comm comm, const char *comm_name) {
2203e1d142dSJacob Faibussowitsch   if (comm < 1 || comm > MaxComm) return MPI_FAILURE;
2213e1d142dSJacob Faibussowitsch   if (!comm_name) return MPI_FAILURE;
2223e1d142dSJacob Faibussowitsch   if (strlen(comm_name) > MPI_MAX_OBJECT_NAME - 1) return MPI_FAILURE;
2233e1d142dSJacob Faibussowitsch   strncpy(all_comm_names[CommIdx(comm)], comm_name, MPI_MAX_OBJECT_NAME - 1);
2243e1d142dSJacob Faibussowitsch   return MPI_SUCCESS;
2253e1d142dSJacob Faibussowitsch }
2263e1d142dSJacob Faibussowitsch 
227*9371c9d4SSatish Balay int MPI_Comm_create(MPI_Comm comm, MPI_Group group, MPI_Comm *newcomm) {
228f60917d2SBarry Smith   int j;
229f0463fa0SJunchao Zhang   if (comm < 1 || comm > MaxComm) return MPI_FAILURE;
230f0463fa0SJunchao Zhang   for (j = 3; j <= MaxComm; j++) {
231f0463fa0SJunchao Zhang     if (!comm_active[CommIdx(j)]) {
232f0463fa0SJunchao Zhang       comm_active[CommIdx(j)] = 1;
233f60917d2SBarry Smith       *newcomm                = j;
234f60917d2SBarry Smith       return MPI_SUCCESS;
235f60917d2SBarry Smith     }
236f60917d2SBarry Smith   }
237f0463fa0SJunchao Zhang   if (MaxComm >= MAX_COMM) return MPI_FAILURE;
238f0463fa0SJunchao Zhang   *newcomm                       = ++MaxComm;
239f0463fa0SJunchao Zhang   comm_active[CommIdx(*newcomm)] = 1;
240c8217ed5SSatish Balay   return MPI_SUCCESS;
241c8217ed5SSatish Balay }
242c8217ed5SSatish Balay 
243*9371c9d4SSatish Balay int MPI_Comm_dup(MPI_Comm comm, MPI_Comm *out) {
244f60917d2SBarry Smith   int j;
245f0463fa0SJunchao Zhang   if (comm < 1 || comm > MaxComm) return MPI_FAILURE;
246f0463fa0SJunchao Zhang   for (j = 3; j <= MaxComm; j++) {
247f0463fa0SJunchao Zhang     if (!comm_active[CommIdx(j)]) {
248f0463fa0SJunchao Zhang       comm_active[CommIdx(j)] = 1;
249f60917d2SBarry Smith       *out                    = j;
250f60917d2SBarry Smith       return MPI_SUCCESS;
251f60917d2SBarry Smith     }
252f60917d2SBarry Smith   }
253f0463fa0SJunchao Zhang   if (MaxComm >= MAX_COMM) return MPI_FAILURE;
254f0463fa0SJunchao Zhang   *out                       = ++MaxComm;
255f0463fa0SJunchao Zhang   comm_active[CommIdx(*out)] = 1;
25699256852SLisandro Dalcin   return MPI_SUCCESS;
257e5c89e4eSSatish Balay }
258e5c89e4eSSatish Balay 
259*9371c9d4SSatish Balay int MPI_Comm_free(MPI_Comm *comm) {
260e5c89e4eSSatish Balay   int i;
261f0463fa0SJunchao Zhang   int idx = CommIdx(*comm);
262e5c89e4eSSatish Balay 
263f0463fa0SJunchao Zhang   if (*comm < 1 || *comm > MaxComm) return MPI_FAILURE;
264e5c89e4eSSatish Balay   for (i = 0; i < num_attr; i++) {
265f0463fa0SJunchao Zhang     if (attr[idx][i].active && attr_keyval[i].del) (*attr_keyval[i].del)(*comm, i, attr[idx][i].attribute_val, attr_keyval[i].extra_state);
266f0463fa0SJunchao Zhang     attr[idx][i].active        = 0;
267f0463fa0SJunchao Zhang     attr[idx][i].attribute_val = 0;
268e5c89e4eSSatish Balay   }
269f0463fa0SJunchao Zhang   if (*comm >= 3) comm_active[idx] = 0;
270100f28aeSBarry Smith   *comm = 0;
271e5c89e4eSSatish Balay   return MPI_SUCCESS;
272e5c89e4eSSatish Balay }
273e5c89e4eSSatish Balay 
274*9371c9d4SSatish Balay int MPI_Comm_size(MPI_Comm comm, int *size) {
275f0463fa0SJunchao Zhang   if (comm < 1 || comm > MaxComm) return MPI_FAILURE;
276d393f697SSatish Balay   *size = 1;
277d393f697SSatish Balay   return MPI_SUCCESS;
278d393f697SSatish Balay }
279d393f697SSatish Balay 
280*9371c9d4SSatish Balay int MPI_Comm_rank(MPI_Comm comm, int *rank) {
281f0463fa0SJunchao Zhang   if (comm < 1 || comm > MaxComm) return MPI_FAILURE;
282d393f697SSatish Balay   *rank = 0;
283d393f697SSatish Balay   return MPI_SUCCESS;
284d393f697SSatish Balay }
285d393f697SSatish Balay 
286*9371c9d4SSatish Balay int MPIUni_Abort(MPI_Comm comm, int errorcode) {
28706df1fb1SBarry Smith   printf("MPI operation not supported by PETSc's sequential MPI wrappers\n");
288b3f11779SBarry Smith   return MPI_ERR_NOSUPPORT;
28906df1fb1SBarry Smith }
29006df1fb1SBarry Smith 
291*9371c9d4SSatish Balay int MPI_Abort(MPI_Comm comm, int errorcode) {
292e5c89e4eSSatish Balay   abort();
293e5c89e4eSSatish Balay   return MPI_SUCCESS;
294e5c89e4eSSatish Balay }
295e5c89e4eSSatish Balay 
29658cd72c3SLisandro Dalcin /* --------------------------------------------------------------------------*/
29758cd72c3SLisandro Dalcin 
298e5c89e4eSSatish Balay static int MPI_was_initialized = 0;
29958cd72c3SLisandro Dalcin static int MPI_was_finalized   = 0;
30058cd72c3SLisandro Dalcin 
301*9371c9d4SSatish Balay int MPI_Init(int *argc, char ***argv) {
30299256852SLisandro Dalcin   if (MPI_was_initialized) return MPI_FAILURE;
3039bcf9d5aSJunchao Zhang   /* MPI standard says "once MPI_Finalize returns, no MPI routine (not even MPI_Init) may be called", so an MPI standard compliant
3049bcf9d5aSJunchao Zhang      MPIU should have this 'if (MPI_was_finalized) return MPI_FAILURE;' check. We relax it here to make life easier for users
3059bcf9d5aSJunchao Zhang      of MPIU so that they can do multiple PetscInitialize/Finalize().
3069bcf9d5aSJunchao Zhang   */
3079bcf9d5aSJunchao Zhang   /* if (MPI_was_finalized) return MPI_FAILURE; */
30858cd72c3SLisandro Dalcin   MPI_was_initialized = 1;
3099bcf9d5aSJunchao Zhang   MPI_was_finalized   = 0;
31099256852SLisandro Dalcin   return MPI_SUCCESS;
31158cd72c3SLisandro Dalcin }
31258cd72c3SLisandro Dalcin 
313*9371c9d4SSatish Balay int MPI_Init_thread(int *argc, char ***argv, int required, int *provided) {
3149012378cSStefano Zampini   MPI_Query_thread(provided);
3159012378cSStefano Zampini   return MPI_Init(argc, argv);
3169012378cSStefano Zampini }
3179012378cSStefano Zampini 
318*9371c9d4SSatish Balay int MPI_Query_thread(int *provided) {
3199012378cSStefano Zampini   *provided = MPI_THREAD_FUNNELED;
3209012378cSStefano Zampini   return MPI_SUCCESS;
3219012378cSStefano Zampini }
3229012378cSStefano Zampini 
323*9371c9d4SSatish Balay int MPI_Finalize(void) {
324100f28aeSBarry Smith   MPI_Comm comm;
32599256852SLisandro Dalcin   if (MPI_was_finalized) return MPI_FAILURE;
32699256852SLisandro Dalcin   if (!MPI_was_initialized) return MPI_FAILURE;
327100f28aeSBarry Smith   comm = MPI_COMM_WORLD;
328100f28aeSBarry Smith   MPI_Comm_free(&comm);
329100f28aeSBarry Smith   comm = MPI_COMM_SELF;
330100f28aeSBarry Smith   MPI_Comm_free(&comm);
331f0463fa0SJunchao Zhang #if defined(PETSC_USE_DEBUG)
332f0463fa0SJunchao Zhang   {
333f0463fa0SJunchao Zhang     int i;
334f0463fa0SJunchao Zhang     for (i = 3; i <= MaxComm; i++) {
335f0463fa0SJunchao Zhang       if (comm_active[CommIdx(i)]) printf("MPIUni warning: MPI communicator %d is not freed before MPI_Finalize()\n", i);
336f0463fa0SJunchao Zhang     }
337f0463fa0SJunchao Zhang   }
338f0463fa0SJunchao Zhang #endif
339f0463fa0SJunchao Zhang   /* reset counters */
340f0463fa0SJunchao Zhang   MaxComm             = 2;
341f0463fa0SJunchao Zhang   num_attr            = 1;
34258cd72c3SLisandro Dalcin   MPI_was_finalized   = 1;
3439bcf9d5aSJunchao Zhang   MPI_was_initialized = 0;
3449bcf9d5aSJunchao Zhang   PETSC_COMM_WORLD    = MPI_COMM_NULL;
34599256852SLisandro Dalcin   return MPI_SUCCESS;
34658cd72c3SLisandro Dalcin }
347e5c89e4eSSatish Balay 
348*9371c9d4SSatish Balay int MPI_Initialized(int *flag) {
349e5c89e4eSSatish Balay   *flag = MPI_was_initialized;
35099256852SLisandro Dalcin   return MPI_SUCCESS;
351e5c89e4eSSatish Balay }
352e5c89e4eSSatish Balay 
353*9371c9d4SSatish Balay int MPI_Finalized(int *flag) {
35458cd72c3SLisandro Dalcin   *flag = MPI_was_finalized;
35599256852SLisandro Dalcin   return MPI_SUCCESS;
356e5c89e4eSSatish Balay }
357e5c89e4eSSatish Balay 
358e5c89e4eSSatish Balay /* -------------------     Fortran versions of several routines ------------------ */
359e5c89e4eSSatish Balay 
360f7c6e6aaSSatish Balay #if defined(PETSC_HAVE_FORTRAN_CAPS)
3610134af2dSBarry Smith #define mpiunisetmoduleblock_         MPIUNISETMODULEBLOCK
36252ecd5ffSSatish Balay #define mpiunisetfortranbasepointers_ MPIUNISETFORTRANBASEPOINTERS
363a7b85bbcSSatish Balay #define petsc_mpi_init_               PETSC_MPI_INIT
364a7b85bbcSSatish Balay #define petsc_mpi_finalize_           PETSC_MPI_FINALIZE
365a7b85bbcSSatish Balay #define petsc_mpi_comm_size_          PETSC_MPI_COMM_SIZE
366a7b85bbcSSatish Balay #define petsc_mpi_comm_rank_          PETSC_MPI_COMM_RANK
367a7b85bbcSSatish Balay #define petsc_mpi_abort_              PETSC_MPI_ABORT
368a7b85bbcSSatish Balay #define petsc_mpi_reduce_             PETSC_MPI_REDUCE
369a7b85bbcSSatish Balay #define petsc_mpi_allreduce_          PETSC_MPI_ALLREDUCE
370a7b85bbcSSatish Balay #define petsc_mpi_barrier_            PETSC_MPI_BARRIER
371a7b85bbcSSatish Balay #define petsc_mpi_bcast_              PETSC_MPI_BCAST
372a7b85bbcSSatish Balay #define petsc_mpi_gather_             PETSC_MPI_GATHER
373a7b85bbcSSatish Balay #define petsc_mpi_allgather_          PETSC_MPI_ALLGATHER
374a7b85bbcSSatish Balay #define petsc_mpi_comm_split_         PETSC_MPI_COMM_SPLIT
375a7b85bbcSSatish Balay #define petsc_mpi_scan_               PETSC_MPI_SCAN
376a7b85bbcSSatish Balay #define petsc_mpi_send_               PETSC_MPI_SEND
377a7b85bbcSSatish Balay #define petsc_mpi_recv_               PETSC_MPI_RECV
378a7b85bbcSSatish Balay #define petsc_mpi_reduce_scatter_     PETSC_MPI_REDUCE_SCATTER
379a7b85bbcSSatish Balay #define petsc_mpi_irecv_              PETSC_MPI_IRECV
380a7b85bbcSSatish Balay #define petsc_mpi_isend_              PETSC_MPI_ISEND
381a7b85bbcSSatish Balay #define petsc_mpi_sendrecv_           PETSC_MPI_SENDRECV
382a7b85bbcSSatish Balay #define petsc_mpi_test_               PETSC_MPI_TEST
383a7b85bbcSSatish Balay #define petsc_mpi_waitall_            PETSC_MPI_WAITALL
384a7b85bbcSSatish Balay #define petsc_mpi_waitany_            PETSC_MPI_WAITANY
385a7b85bbcSSatish Balay #define petsc_mpi_allgatherv_         PETSC_MPI_ALLGATHERV
386a7b85bbcSSatish Balay #define petsc_mpi_alltoallv_          PETSC_MPI_ALLTOALLV
387a7b85bbcSSatish Balay #define petsc_mpi_comm_create_        PETSC_MPI_COMM_CREATE
388a7b85bbcSSatish Balay #define petsc_mpi_address_            PETSC_MPI_ADDRESS
389a7b85bbcSSatish Balay #define petsc_mpi_pack_               PETSC_MPI_PACK
390a7b85bbcSSatish Balay #define petsc_mpi_unpack_             PETSC_MPI_UNPACK
391a7b85bbcSSatish Balay #define petsc_mpi_pack_size_          PETSC_MPI_PACK_SIZE
392a7b85bbcSSatish Balay #define petsc_mpi_type_struct_        PETSC_MPI_TYPE_STRUCT
393a7b85bbcSSatish Balay #define petsc_mpi_type_commit_        PETSC_MPI_TYPE_COMMIT
394a7b85bbcSSatish Balay #define petsc_mpi_wtime_              PETSC_MPI_WTIME
395a7b85bbcSSatish Balay #define petsc_mpi_cancel_             PETSC_MPI_CANCEL
396a7b85bbcSSatish Balay #define petsc_mpi_comm_dup_           PETSC_MPI_COMM_DUP
397a7b85bbcSSatish Balay #define petsc_mpi_comm_free_          PETSC_MPI_COMM_FREE
398a7b85bbcSSatish Balay #define petsc_mpi_get_count_          PETSC_MPI_GET_COUNT
399a7b85bbcSSatish Balay #define petsc_mpi_get_processor_name_ PETSC_MPI_GET_PROCESSOR_NAME
400a7b85bbcSSatish Balay #define petsc_mpi_initialized_        PETSC_MPI_INITIALIZED
401a7b85bbcSSatish Balay #define petsc_mpi_iprobe_             PETSC_MPI_IPROBE
402a7b85bbcSSatish Balay #define petsc_mpi_probe_              PETSC_MPI_PROBE
403a7b85bbcSSatish Balay #define petsc_mpi_request_free_       PETSC_MPI_REQUEST_FREE
404a7b85bbcSSatish Balay #define petsc_mpi_ssend_              PETSC_MPI_SSEND
405a7b85bbcSSatish Balay #define petsc_mpi_wait_               PETSC_MPI_WAIT
406a7b85bbcSSatish Balay #define petsc_mpi_comm_group_         PETSC_MPI_COMM_GROUP
407a7b85bbcSSatish Balay #define petsc_mpi_exscan_             PETSC_MPI_EXSCAN
408f7c6e6aaSSatish Balay #elif !defined(PETSC_HAVE_FORTRAN_UNDERSCORE)
4090134af2dSBarry Smith #define mpiunisetmoduleblock_         mpiunisetmoduleblock
41052ecd5ffSSatish Balay #define mpiunisetfortranbasepointers_ mpiunisetfortranbasepointers
411a7b85bbcSSatish Balay #define petsc_mpi_init_               petsc_mpi_init
412a7b85bbcSSatish Balay #define petsc_mpi_finalize_           petsc_mpi_finalize
413a7b85bbcSSatish Balay #define petsc_mpi_comm_size_          petsc_mpi_comm_size
414a7b85bbcSSatish Balay #define petsc_mpi_comm_rank_          petsc_mpi_comm_rank
415a7b85bbcSSatish Balay #define petsc_mpi_abort_              petsc_mpi_abort
416a7b85bbcSSatish Balay #define petsc_mpi_reduce_             petsc_mpi_reduce
417a7b85bbcSSatish Balay #define petsc_mpi_allreduce_          petsc_mpi_allreduce
418a7b85bbcSSatish Balay #define petsc_mpi_barrier_            petsc_mpi_barrier
419a7b85bbcSSatish Balay #define petsc_mpi_bcast_              petsc_mpi_bcast
420a7b85bbcSSatish Balay #define petsc_mpi_gather_             petsc_mpi_gather
421a7b85bbcSSatish Balay #define petsc_mpi_allgather_          petsc_mpi_allgather
422a7b85bbcSSatish Balay #define petsc_mpi_comm_split_         petsc_mpi_comm_split
423a7b85bbcSSatish Balay #define petsc_mpi_scan_               petsc_mpi_scan
424a7b85bbcSSatish Balay #define petsc_mpi_send_               petsc_mpi_send
425a7b85bbcSSatish Balay #define petsc_mpi_recv_               petsc_mpi_recv
426a7b85bbcSSatish Balay #define petsc_mpi_reduce_scatter_     petsc_mpi_reduce_scatter
427a7b85bbcSSatish Balay #define petsc_mpi_irecv_              petsc_mpi_irecv
428a7b85bbcSSatish Balay #define petsc_mpi_isend_              petsc_mpi_isend
429a7b85bbcSSatish Balay #define petsc_mpi_sendrecv_           petsc_mpi_sendrecv
430a7b85bbcSSatish Balay #define petsc_mpi_test_               petsc_mpi_test
431a7b85bbcSSatish Balay #define petsc_mpi_waitall_            petsc_mpi_waitall
432a7b85bbcSSatish Balay #define petsc_mpi_waitany_            petsc_mpi_waitany
433a7b85bbcSSatish Balay #define petsc_mpi_allgatherv_         petsc_mpi_allgatherv
434a7b85bbcSSatish Balay #define petsc_mpi_alltoallv_          petsc_mpi_alltoallv
435a7b85bbcSSatish Balay #define petsc_mpi_comm_create_        petsc_mpi_comm_create
436a7b85bbcSSatish Balay #define petsc_mpi_address_            petsc_mpi_address
437a7b85bbcSSatish Balay #define petsc_mpi_pack_               petsc_mpi_pack
438a7b85bbcSSatish Balay #define petsc_mpi_unpack_             petsc_mpi_unpack
439a7b85bbcSSatish Balay #define petsc_mpi_pack_size_          petsc_mpi_pack_size
440a7b85bbcSSatish Balay #define petsc_mpi_type_struct_        petsc_mpi_type_struct
441a7b85bbcSSatish Balay #define petsc_mpi_type_commit_        petsc_mpi_type_commit
442a7b85bbcSSatish Balay #define petsc_mpi_wtime_              petsc_mpi_wtime
443a7b85bbcSSatish Balay #define petsc_mpi_cancel_             petsc_mpi_cancel
444a7b85bbcSSatish Balay #define petsc_mpi_comm_dup_           petsc_mpi_comm_dup
445a7b85bbcSSatish Balay #define petsc_mpi_comm_free_          petsc_mpi_comm_free
446a7b85bbcSSatish Balay #define petsc_mpi_get_count_          petsc_mpi_get_count
447a7b85bbcSSatish Balay #define petsc_mpi_get_processor_name_ petsc_mpi_get_processor_name
448a7b85bbcSSatish Balay #define petsc_mpi_initialized_        petsc_mpi_initialized
449a7b85bbcSSatish Balay #define petsc_mpi_iprobe_             petsc_mpi_iprobe
450a7b85bbcSSatish Balay #define petsc_mpi_probe_              petsc_mpi_probe
451a7b85bbcSSatish Balay #define petsc_mpi_request_free_       petsc_mpi_request_free
452a7b85bbcSSatish Balay #define petsc_mpi_ssend_              petsc_mpi_ssend
453a7b85bbcSSatish Balay #define petsc_mpi_wait_               petsc_mpi_wait
454a7b85bbcSSatish Balay #define petsc_mpi_comm_group_         petsc_mpi_comm_group
455a7b85bbcSSatish Balay #define petsc_mpi_exscan_             petsc_mpi_exscan
456f7c6e6aaSSatish Balay #endif
457e5c89e4eSSatish Balay 
458f7c6e6aaSSatish Balay #if defined(PETSC_HAVE_FORTRAN_UNDERSCORE_UNDERSCORE)
459a7b85bbcSSatish Balay #define petsc_mpi_init_               petsc_mpi_init__
460a7b85bbcSSatish Balay #define petsc_mpi_finalize_           petsc_mpi_finalize__
461a7b85bbcSSatish Balay #define petsc_mpi_comm_size_          petsc_mpi_comm_size__
462a7b85bbcSSatish Balay #define petsc_mpi_comm_rank_          petsc_mpi_comm_rank__
463a7b85bbcSSatish Balay #define petsc_mpi_abort_              petsc_mpi_abort__
464a7b85bbcSSatish Balay #define petsc_mpi_reduce_             petsc_mpi_reduce__
465a7b85bbcSSatish Balay #define petsc_mpi_allreduce_          petsc_mpi_allreduce__
466a7b85bbcSSatish Balay #define petsc_mpi_barrier_            petsc_mpi_barrier__
467a7b85bbcSSatish Balay #define petsc_mpi_bcast_              petsc_mpi_bcast__
468a7b85bbcSSatish Balay #define petsc_mpi_gather_             petsc_mpi_gather__
469a7b85bbcSSatish Balay #define petsc_mpi_allgather_          petsc_mpi_allgather__
470a7b85bbcSSatish Balay #define petsc_mpi_comm_split_         petsc_mpi_comm_split__
471a7b85bbcSSatish Balay #define petsc_mpi_scan_               petsc_mpi_scan__
472a7b85bbcSSatish Balay #define petsc_mpi_send_               petsc_mpi_send__
473a7b85bbcSSatish Balay #define petsc_mpi_recv_               petsc_mpi_recv__
474a7b85bbcSSatish Balay #define petsc_mpi_reduce_scatter_     petsc_mpi_reduce_scatter__
475a7b85bbcSSatish Balay #define petsc_mpi_irecv_              petsc_mpi_irecv__
476a7b85bbcSSatish Balay #define petsc_mpi_isend_              petsc_mpi_isend__
477a7b85bbcSSatish Balay #define petsc_mpi_sendrecv_           petsc_mpi_sendrecv__
478a7b85bbcSSatish Balay #define petsc_mpi_test_               petsc_mpi_test__
479a7b85bbcSSatish Balay #define petsc_mpi_waitall_            petsc_mpi_waitall__
480a7b85bbcSSatish Balay #define petsc_mpi_waitany_            petsc_mpi_waitany__
481a7b85bbcSSatish Balay #define petsc_mpi_allgatherv_         petsc_mpi_allgatherv__
482a7b85bbcSSatish Balay #define petsc_mpi_alltoallv_          petsc_mpi_alltoallv__
483a7b85bbcSSatish Balay #define petsc_mpi_comm_create_        petsc_mpi_comm_create__
484a7b85bbcSSatish Balay #define petsc_mpi_address_            petsc_mpi_address__
485a7b85bbcSSatish Balay #define petsc_mpi_pack_               petsc_mpi_pack__
486a7b85bbcSSatish Balay #define petsc_mpi_unpack_             petsc_mpi_unpack__
487a7b85bbcSSatish Balay #define petsc_mpi_pack_size_          petsc_mpi_pack_size__
488a7b85bbcSSatish Balay #define petsc_mpi_type_struct_        petsc_mpi_type_struct__
489a7b85bbcSSatish Balay #define petsc_mpi_type_commit_        petsc_mpi_type_commit__
490a7b85bbcSSatish Balay #define petsc_mpi_wtime_              petsc_mpi_wtime__
491a7b85bbcSSatish Balay #define petsc_mpi_cancel_             petsc_mpi_cancel__
492a7b85bbcSSatish Balay #define petsc_mpi_comm_dup_           petsc_mpi_comm_dup__
493a7b85bbcSSatish Balay #define petsc_mpi_comm_free_          petsc_mpi_comm_free__
494a7b85bbcSSatish Balay #define petsc_mpi_get_count_          petsc_mpi_get_count__
495a7b85bbcSSatish Balay #define petsc_mpi_get_processor_name_ petsc_mpi_get_processor_name__
496a7b85bbcSSatish Balay #define petsc_mpi_initialized_        petsc_mpi_initialized__
497a7b85bbcSSatish Balay #define petsc_mpi_iprobe_             petsc_mpi_iprobe__
498a7b85bbcSSatish Balay #define petsc_mpi_probe_              petsc_mpi_probe__
499a7b85bbcSSatish Balay #define petsc_mpi_request_free_       petsc_mpi_request_free__
500a7b85bbcSSatish Balay #define petsc_mpi_ssend_              petsc_mpi_ssend__
501a7b85bbcSSatish Balay #define petsc_mpi_wait_               petsc_mpi_wait__
502a7b85bbcSSatish Balay #define petsc_mpi_comm_group_         petsc_mpi_comm_group__
503a7b85bbcSSatish Balay #define petsc_mpi_exscan_             petsc_mpi_exscan__
504f7c6e6aaSSatish Balay #endif
505e5c89e4eSSatish Balay 
506c8217ed5SSatish Balay /* Do not build fortran interface if MPI namespace colision is to be avoided */
507a7b85bbcSSatish Balay #if defined(PETSC_HAVE_FORTRAN)
508c8217ed5SSatish Balay 
50919caf8f3SSatish Balay PETSC_EXTERN void mpiunisetmoduleblock_(void);
51052ecd5ffSSatish Balay 
511*9371c9d4SSatish Balay PETSC_EXTERN void mpiunisetfortranbasepointers_(void *f_mpi_in_place) {
51252ecd5ffSSatish Balay   MPIUNIF_mpi_in_place = f_mpi_in_place;
51352ecd5ffSSatish Balay }
51452ecd5ffSSatish Balay 
515*9371c9d4SSatish Balay PETSC_EXTERN void petsc_mpi_init_(int *ierr) {
5160134af2dSBarry Smith   mpiunisetmoduleblock_();
517c8217ed5SSatish Balay   *ierr = MPI_Init((int *)0, (char ***)0);
518e5c89e4eSSatish Balay }
519e5c89e4eSSatish Balay 
520*9371c9d4SSatish Balay PETSC_EXTERN void petsc_mpi_finalize_(int *ierr) {
521c8217ed5SSatish Balay   *ierr = MPI_Finalize();
522e5c89e4eSSatish Balay }
523e5c89e4eSSatish Balay 
524*9371c9d4SSatish Balay PETSC_EXTERN void petsc_mpi_comm_size_(MPI_Comm *comm, int *size, int *ierr) {
525e5c89e4eSSatish Balay   *size = 1;
526e5c89e4eSSatish Balay   *ierr = 0;
527e5c89e4eSSatish Balay }
528e5c89e4eSSatish Balay 
529*9371c9d4SSatish Balay PETSC_EXTERN void petsc_mpi_comm_rank_(MPI_Comm *comm, int *rank, int *ierr) {
530e5c89e4eSSatish Balay   *rank = 0;
531e5c89e4eSSatish Balay   *ierr = MPI_SUCCESS;
532e5c89e4eSSatish Balay }
533e5c89e4eSSatish Balay 
534*9371c9d4SSatish Balay PETSC_EXTERN void petsc_mpi_comm_split_(MPI_Comm *comm, int *color, int *key, MPI_Comm *newcomm, int *ierr) {
5351f6cc5b2SSatish Balay   *newcomm = *comm;
5361f6cc5b2SSatish Balay   *ierr    = MPI_SUCCESS;
5371f6cc5b2SSatish Balay }
5381f6cc5b2SSatish Balay 
539*9371c9d4SSatish Balay PETSC_EXTERN void petsc_mpi_abort_(MPI_Comm *comm, int *errorcode, int *ierr) {
540e5c89e4eSSatish Balay   abort();
541e5c89e4eSSatish Balay   *ierr = MPI_SUCCESS;
542e5c89e4eSSatish Balay }
543e5c89e4eSSatish Balay 
544*9371c9d4SSatish Balay PETSC_EXTERN void petsc_mpi_reduce_(void *sendbuf, void *recvbuf, int *count, int *datatype, int *op, int *root, int *comm, int *ierr) {
545f30578ecSBarry Smith   *ierr = MPI_Reduce(sendbuf, recvbuf, *count, *datatype, *op, *root, *comm);
5463b644628SSatish Balay }
5473b644628SSatish Balay 
548*9371c9d4SSatish Balay PETSC_EXTERN void petsc_mpi_allreduce_(void *sendbuf, void *recvbuf, int *count, int *datatype, int *op, int *comm, int *ierr) {
549f30578ecSBarry Smith   *ierr = MPI_Allreduce(sendbuf, recvbuf, *count, *datatype, *op, *comm);
550e5c89e4eSSatish Balay }
551e5c89e4eSSatish Balay 
552*9371c9d4SSatish Balay PETSC_EXTERN void petsc_mpi_barrier_(MPI_Comm *comm, int *ierr) {
553e5c89e4eSSatish Balay   *ierr = MPI_SUCCESS;
554e5c89e4eSSatish Balay }
555f7c6e6aaSSatish Balay 
556*9371c9d4SSatish Balay PETSC_EXTERN void petsc_mpi_bcast_(void *buf, int *count, int *datatype, int *root, int *comm, int *ierr) {
557e5c89e4eSSatish Balay   *ierr = MPI_SUCCESS;
558e5c89e4eSSatish Balay }
559f7c6e6aaSSatish Balay 
560*9371c9d4SSatish 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) {
561f30578ecSBarry Smith   *ierr = MPI_Gather(sendbuf, *scount, *sdatatype, recvbuf, rcount, rdatatype, *root, *comm);
562f7c6e6aaSSatish Balay }
563f7c6e6aaSSatish Balay 
564*9371c9d4SSatish Balay PETSC_EXTERN void petsc_mpi_allgather_(void *sendbuf, int *scount, int *sdatatype, void *recvbuf, int *rcount, int *rdatatype, int *comm, int *ierr) {
565f30578ecSBarry Smith   *ierr = MPI_Allgather(sendbuf, *scount, *sdatatype, recvbuf, rcount, rdatatype, *comm);
566e5c89e4eSSatish Balay }
567e5c89e4eSSatish Balay 
568*9371c9d4SSatish Balay PETSC_EXTERN void petsc_mpi_scan_(void *sendbuf, void *recvbuf, int *count, int *datatype, int *op, int *comm, int *ierr) {
5691a589b05SJed Brown   *ierr = MPIUNI_Memcpy(recvbuf, sendbuf, (*count) * MPI_sizeof(*datatype));
5703b644628SSatish Balay }
5713b644628SSatish Balay 
572*9371c9d4SSatish Balay PETSC_EXTERN void petsc_mpi_send_(void *buf, int *count, int *datatype, int *dest, int *tag, int *comm, int *ierr) {
57306df1fb1SBarry Smith   *ierr = MPIUni_Abort(MPI_COMM_WORLD, 0);
5741086b069SSatish Balay }
5751086b069SSatish Balay 
576*9371c9d4SSatish Balay PETSC_EXTERN void petsc_mpi_recv_(void *buf, int *count, int *datatype, int *source, int *tag, int *comm, int status, int *ierr) {
57706df1fb1SBarry Smith   *ierr = MPIUni_Abort(MPI_COMM_WORLD, 0);
5781086b069SSatish Balay }
5791086b069SSatish Balay 
580*9371c9d4SSatish Balay PETSC_EXTERN void petsc_mpi_reduce_scatter_(void *sendbuf, void *recvbuf, int *recvcounts, int *datatype, int *op, int *comm, int *ierr) {
58106df1fb1SBarry Smith   *ierr = MPIUni_Abort(MPI_COMM_WORLD, 0);
582156bc490SSatish Balay }
583156bc490SSatish Balay 
584*9371c9d4SSatish Balay PETSC_EXTERN void petsc_mpi_irecv_(void *buf, int *count, int *datatype, int *source, int *tag, int *comm, int *request, int *ierr) {
58506df1fb1SBarry Smith   *ierr = MPIUni_Abort(MPI_COMM_WORLD, 0);
586156bc490SSatish Balay }
587156bc490SSatish Balay 
588*9371c9d4SSatish Balay PETSC_EXTERN void petsc_mpi_isend_(void *buf, int *count, int *datatype, int *dest, int *tag, int *comm, int *request, int *ierr) {
58906df1fb1SBarry Smith   *ierr = MPIUni_Abort(MPI_COMM_WORLD, 0);
590156bc490SSatish Balay }
591156bc490SSatish Balay 
592*9371c9d4SSatish 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) {
5931a589b05SJed Brown   *ierr = MPIUNI_Memcpy(recvbuf, sendbuf, (*sendcount) * MPI_sizeof(*sendtype));
594156bc490SSatish Balay }
595156bc490SSatish Balay 
596*9371c9d4SSatish Balay PETSC_EXTERN void petsc_mpi_test_(int *request, int *flag, int *status, int *ierr) {
59706df1fb1SBarry Smith   *ierr = MPIUni_Abort(MPI_COMM_WORLD, 0);
598156bc490SSatish Balay }
599156bc490SSatish Balay 
600*9371c9d4SSatish Balay PETSC_EXTERN void petsc_mpi_waitall_(int *count, int *array_of_requests, int *array_of_statuses, int *ierr) {
601156bc490SSatish Balay   *ierr = MPI_SUCCESS;
602156bc490SSatish Balay }
603156bc490SSatish Balay 
604*9371c9d4SSatish Balay PETSC_EXTERN void petsc_mpi_waitany_(int *count, int *array_of_requests, int *index, int *status, int *ierr) {
605156bc490SSatish Balay   *ierr = MPI_SUCCESS;
606156bc490SSatish Balay }
607156bc490SSatish Balay 
608*9371c9d4SSatish 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) {
609f30578ecSBarry Smith   *ierr = MPI_Allgatherv(sendbuf, *sendcount, *sendtype, recvbuf, recvcounts, displs, *recvtype, *comm);
610156bc490SSatish Balay }
611156bc490SSatish Balay 
612*9371c9d4SSatish 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) {
613f30578ecSBarry Smith   *ierr = MPI_Alltoallv(sendbuf, sendcounts, sdispls, *sendtype, recvbuf, recvcounts, rdispls, *recvtype, *comm);
614156bc490SSatish Balay }
615156bc490SSatish Balay 
616*9371c9d4SSatish Balay PETSC_EXTERN void petsc_mpi_comm_create_(int *comm, int *group, int *newcomm, int *ierr) {
617156bc490SSatish Balay   *newcomm = *comm;
618156bc490SSatish Balay   *ierr    = MPI_SUCCESS;
619156bc490SSatish Balay }
620156bc490SSatish Balay 
621*9371c9d4SSatish Balay PETSC_EXTERN void petsc_mpi_address_(void *location, MPI_Aint *address, int *ierr) {
62299256852SLisandro Dalcin   *address = (MPI_Aint)((char *)location);
623156bc490SSatish Balay   *ierr    = MPI_SUCCESS;
624156bc490SSatish Balay }
625156bc490SSatish Balay 
626*9371c9d4SSatish Balay PETSC_EXTERN void petsc_mpi_pack_(void *inbuf, int *incount, int *datatype, void *outbuf, int *outsize, int *position, int *comm, int *ierr) {
62706df1fb1SBarry Smith   *ierr = MPIUni_Abort(MPI_COMM_WORLD, 0);
628156bc490SSatish Balay }
629156bc490SSatish Balay 
630*9371c9d4SSatish Balay PETSC_EXTERN void petsc_mpi_unpack_(void *inbuf, int *insize, int *position, void *outbuf, int *outcount, int *datatype, int *comm, int *ierr) {
63106df1fb1SBarry Smith   *ierr = MPIUni_Abort(MPI_COMM_WORLD, 0);
632156bc490SSatish Balay }
633156bc490SSatish Balay 
634*9371c9d4SSatish Balay PETSC_EXTERN void petsc_mpi_pack_size_(int *incount, int *datatype, int *comm, int *size, int *ierr) {
63506df1fb1SBarry Smith   *ierr = MPIUni_Abort(MPI_COMM_WORLD, 0);
636156bc490SSatish Balay }
637156bc490SSatish Balay 
638*9371c9d4SSatish 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) {
63906df1fb1SBarry Smith   *ierr = MPIUni_Abort(MPI_COMM_WORLD, 0);
640156bc490SSatish Balay }
641156bc490SSatish Balay 
642*9371c9d4SSatish Balay PETSC_EXTERN void petsc_mpi_type_commit_(int *datatype, int *ierr) {
643156bc490SSatish Balay   *ierr = MPI_SUCCESS;
644156bc490SSatish Balay }
645156bc490SSatish Balay 
646*9371c9d4SSatish Balay double petsc_mpi_wtime_(void) {
647156bc490SSatish Balay   return 0.0;
648f8f52c7dSSatish Balay }
649156bc490SSatish Balay 
650*9371c9d4SSatish Balay PETSC_EXTERN void petsc_mpi_cancel_(int *request, int *ierr) {
651f8f52c7dSSatish Balay   *ierr = MPI_SUCCESS;
652f8f52c7dSSatish Balay }
653f8f52c7dSSatish Balay 
654*9371c9d4SSatish Balay PETSC_EXTERN void petsc_mpi_comm_dup_(int *comm, int *out, int *ierr) {
655f8f52c7dSSatish Balay   *out  = *comm;
656f8f52c7dSSatish Balay   *ierr = MPI_SUCCESS;
657f8f52c7dSSatish Balay }
658f8f52c7dSSatish Balay 
659*9371c9d4SSatish Balay PETSC_EXTERN void petsc_mpi_comm_free_(int *comm, int *ierr) {
660f8f52c7dSSatish Balay   *ierr = MPI_SUCCESS;
661f8f52c7dSSatish Balay }
662f8f52c7dSSatish Balay 
663*9371c9d4SSatish Balay PETSC_EXTERN void petsc_mpi_get_count_(int *status, int *datatype, int *count, int *ierr) {
66406df1fb1SBarry Smith   *ierr = MPIUni_Abort(MPI_COMM_WORLD, 0);
665f8f52c7dSSatish Balay }
666f8f52c7dSSatish Balay 
667*9371c9d4SSatish Balay PETSC_EXTERN void petsc_mpi_get_processor_name_(char *name, int *result_len, int *ierr, PETSC_FORTRAN_CHARLEN_T len) {
668f8f52c7dSSatish Balay   MPIUNI_Memcpy(name, "localhost", 9 * sizeof(char));
669f8f52c7dSSatish Balay   *result_len = 9;
670f8f52c7dSSatish Balay   *ierr       = MPI_SUCCESS;
671f8f52c7dSSatish Balay }
672f8f52c7dSSatish Balay 
673*9371c9d4SSatish Balay PETSC_EXTERN void petsc_mpi_initialized_(int *flag, int *ierr) {
674f8f52c7dSSatish Balay   *flag = MPI_was_initialized;
675f8f52c7dSSatish Balay   *ierr = MPI_SUCCESS;
676f8f52c7dSSatish Balay }
677f8f52c7dSSatish Balay 
678*9371c9d4SSatish Balay PETSC_EXTERN void petsc_mpi_iprobe_(int *source, int *tag, int *comm, int *glag, int *status, int *ierr) {
679f8f52c7dSSatish Balay   *ierr = MPI_SUCCESS;
680f8f52c7dSSatish Balay }
681f8f52c7dSSatish Balay 
682*9371c9d4SSatish Balay PETSC_EXTERN void petsc_mpi_probe_(int *source, int *tag, int *comm, int *flag, int *status, int *ierr) {
683f8f52c7dSSatish Balay   *ierr = MPI_SUCCESS;
684f8f52c7dSSatish Balay }
685f8f52c7dSSatish Balay 
686*9371c9d4SSatish Balay PETSC_EXTERN void petsc_mpi_request_free_(int *request, int *ierr) {
687f8f52c7dSSatish Balay   *ierr = MPI_SUCCESS;
688f8f52c7dSSatish Balay }
689f8f52c7dSSatish Balay 
690*9371c9d4SSatish Balay PETSC_EXTERN void petsc_mpi_ssend_(void *buf, int *count, int *datatype, int *dest, int *tag, int *comm, int *ierr) {
69106df1fb1SBarry Smith   *ierr = MPIUni_Abort(MPI_COMM_WORLD, 0);
692f8f52c7dSSatish Balay }
693f8f52c7dSSatish Balay 
694*9371c9d4SSatish Balay PETSC_EXTERN void petsc_mpi_wait_(int *request, int *status, int *ierr) {
695f8f52c7dSSatish Balay   *ierr = MPI_SUCCESS;
696156bc490SSatish Balay }
697156bc490SSatish Balay 
698*9371c9d4SSatish Balay PETSC_EXTERN void petsc_mpi_comm_group_(int *comm, int *group, int *ierr) {
699d4816372SSatish Balay   *ierr = MPI_SUCCESS;
700d4816372SSatish Balay }
701d4816372SSatish Balay 
702*9371c9d4SSatish Balay PETSC_EXTERN void petsc_mpi_exscan_(void *sendbuf, void *recvbuf, int *count, int *datatype, int *op, int *comm, int *ierr) {
703d4816372SSatish Balay   *ierr = MPI_SUCCESS;
704d4816372SSatish Balay }
705d4816372SSatish Balay 
706a7b85bbcSSatish Balay #endif /* PETSC_HAVE_FORTRAN */
707c8217ed5SSatish Balay 
708e5c89e4eSSatish Balay #if defined(__cplusplus)
709e5c89e4eSSatish Balay }
710e5c89e4eSSatish Balay #endif
711