xref: /petsc/src/sys/mpiuni/mpi.c (revision 19caf8f3c08b1f0ca9f5469bde385c134aa76c82)
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 
10e5c89e4eSSatish Balay #define MPI_SUCCESS 0
11e5c89e4eSSatish Balay #define MPI_FAILURE 1
12a297a907SKarl Rupp 
1399256852SLisandro Dalcin void *MPIUNI_TMP = NULL;
1499256852SLisandro Dalcin 
15e5c89e4eSSatish Balay /*
16100f28aeSBarry Smith        With MPI Uni there are exactly four distinct communicators:
17100f28aeSBarry Smith     MPI_COMM_SELF, MPI_COMM_WORLD, and a MPI_Comm_dup() of each of these (duplicates of duplicates return the same communictor)
18100f28aeSBarry Smith 
19100f28aeSBarry Smith     MPI_COMM_SELF and MPI_COMM_WORLD are MPI_Comm_free() in MPI_Finalize() but in general with PETSc,
20100f28aeSBarry Smith      the other communicators are freed once the last PETSc object is freed (before MPI_Finalize()).
21100f28aeSBarry Smith 
22e5c89e4eSSatish Balay */
23e5c89e4eSSatish Balay #define MAX_ATTR 128
24fb53af6bSBarry Smith #define MAX_COMM 128
25fb53af6bSBarry Smith 
26fb53af6bSBarry Smith static int MaxComm = 2;
27e5c89e4eSSatish Balay 
28e5c89e4eSSatish Balay typedef struct {
29e5c89e4eSSatish Balay   void *attribute_val;
30e5c89e4eSSatish Balay   int  active;
31e5c89e4eSSatish Balay } MPI_Attr;
32e5c89e4eSSatish Balay 
3346651e72SBarry Smith typedef struct {
3446651e72SBarry Smith   void                *extra_state;
3546651e72SBarry Smith   MPI_Delete_function *del;
3646651e72SBarry Smith } MPI_Attr_keyval;
3746651e72SBarry Smith 
3846651e72SBarry Smith static MPI_Attr_keyval attr_keyval[MAX_ATTR];
39fb53af6bSBarry Smith static MPI_Attr        attr[MAX_COMM][MAX_ATTR];
40f60917d2SBarry Smith static int             comm_active[MAX_COMM];
41e5c89e4eSSatish Balay static int             num_attr = 1,mpi_tag_ub = 100000000;
4252ecd5ffSSatish Balay static void*           MPIUNIF_mpi_in_place = 0;
43e5c89e4eSSatish Balay 
44e5c89e4eSSatish Balay #if defined(__cplusplus)
45e5c89e4eSSatish Balay extern "C" {
46e5c89e4eSSatish Balay #endif
47e5c89e4eSSatish Balay 
48e5c89e4eSSatish Balay /*
49e5c89e4eSSatish Balay    To avoid problems with prototypes to the system memcpy() it is duplicated here
50e5c89e4eSSatish Balay */
51a6dfd86eSKarl Rupp int MPIUNI_Memcpy(void *a,const void *b,int n)
52a6dfd86eSKarl Rupp {
53e5c89e4eSSatish Balay   int  i;
54e5c89e4eSSatish Balay   char *aa= (char*)a;
55e5c89e4eSSatish Balay   char *bb= (char*)b;
56e5c89e4eSSatish Balay 
5799256852SLisandro Dalcin   if (a == MPI_IN_PLACE || a == MPIUNIF_mpi_in_place) return MPI_SUCCESS;
5899256852SLisandro Dalcin   if (b == MPI_IN_PLACE || b == MPIUNIF_mpi_in_place) return MPI_SUCCESS;
59e5c89e4eSSatish Balay   for (i=0; i<n; i++) aa[i] = bb[i];
6099256852SLisandro Dalcin   return MPI_SUCCESS;
61e5c89e4eSSatish Balay }
62e5c89e4eSSatish Balay 
6312801b39SBarry Smith static int classcnt = 0;
6412801b39SBarry Smith static int codecnt = 0;
6512801b39SBarry Smith 
6612801b39SBarry Smith int MPI_Add_error_class(int *cl)
6712801b39SBarry Smith {
6812801b39SBarry Smith   *cl = classcnt++;
6912801b39SBarry Smith   return MPI_SUCCESS;
7012801b39SBarry Smith }
7112801b39SBarry Smith 
7212801b39SBarry Smith int MPI_Add_error_code(int cl,int *co)
7312801b39SBarry Smith {
7412801b39SBarry Smith   if (cl >= classcnt) return MPI_FAILURE;
7512801b39SBarry Smith   *co = codecnt++;
7612801b39SBarry Smith   return MPI_SUCCESS;
7712801b39SBarry Smith }
7812801b39SBarry Smith 
791a589b05SJed Brown int MPI_Type_get_envelope(MPI_Datatype datatype,int *num_integers,int *num_addresses,int *num_datatypes,int *combiner)
801a589b05SJed Brown {
811a589b05SJed Brown   int comb = datatype >> 28;
821a589b05SJed Brown   switch (comb) {
831a589b05SJed Brown   case MPI_COMBINER_NAMED:
841a589b05SJed Brown     *num_integers = 0;
851a589b05SJed Brown     *num_addresses = 0;
861a589b05SJed Brown     *num_datatypes = 0;
871a589b05SJed Brown     *combiner = comb;
881a589b05SJed Brown     break;
891a589b05SJed Brown   case MPI_COMBINER_DUP:
901a589b05SJed Brown     *num_integers = 0;
911a589b05SJed Brown     *num_addresses = 0;
921a589b05SJed Brown     *num_datatypes = 1;
931a589b05SJed Brown     *combiner = comb;
941a589b05SJed Brown     break;
951a589b05SJed Brown   case MPI_COMBINER_CONTIGUOUS:
961a589b05SJed Brown     *num_integers = 1;
971a589b05SJed Brown     *num_addresses = 0;
981a589b05SJed Brown     *num_datatypes = 1;
991a589b05SJed Brown     *combiner = comb;
1001a589b05SJed Brown     break;
1011a589b05SJed Brown   default:
1021a589b05SJed Brown     return MPIUni_Abort(MPI_COMM_SELF,1);
1031a589b05SJed Brown   }
10499256852SLisandro Dalcin   return MPI_SUCCESS;
1051a589b05SJed Brown }
1061a589b05SJed Brown 
1071a589b05SJed Brown 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)
1081a589b05SJed Brown {
1091a589b05SJed Brown   int comb = datatype >> 28;
1101a589b05SJed Brown   switch (comb) {
1111a589b05SJed Brown   case MPI_COMBINER_NAMED:
1121a589b05SJed Brown     return MPIUni_Abort(MPI_COMM_SELF,1);
1131a589b05SJed Brown     break;
1141a589b05SJed Brown   case MPI_COMBINER_DUP:
1151a589b05SJed Brown     if (max_datatypes < 1) return MPIUni_Abort(MPI_COMM_SELF,1);
1161a589b05SJed Brown     array_of_datatypes[0] = datatype & 0x0fffffff;
1171a589b05SJed Brown     break;
1181a589b05SJed Brown   case MPI_COMBINER_CONTIGUOUS:
1191a589b05SJed Brown     if (max_integers < 1 || max_datatypes < 1) return MPIUni_Abort(MPI_COMM_SELF,1);
1201a589b05SJed Brown     array_of_integers[0] = (datatype >> 8) & 0xfff; /* count */
1211a589b05SJed Brown     array_of_datatypes[0] = (datatype & 0x0ff000ff) | 0x100;  /* basic named type (count=1) from which the contiguous type is derived */
1221a589b05SJed Brown     break;
1231a589b05SJed Brown   default:
1241a589b05SJed Brown     return MPIUni_Abort(MPI_COMM_SELF,1);
1251a589b05SJed Brown   }
12699256852SLisandro Dalcin   return MPI_SUCCESS;
1271a589b05SJed Brown }
1281a589b05SJed Brown 
129e5c89e4eSSatish Balay /*
130e5c89e4eSSatish Balay    Used to set the built-in MPI_TAG_UB attribute
131e5c89e4eSSatish Balay */
132e5c89e4eSSatish Balay static int Keyval_setup(void)
133e5c89e4eSSatish Balay {
134100f28aeSBarry Smith   attr[MPI_COMM_WORLD-1][0].active        = 1;
135100f28aeSBarry Smith   attr[MPI_COMM_WORLD-1][0].attribute_val = &mpi_tag_ub;
136100f28aeSBarry Smith   attr[MPI_COMM_SELF-1][0].active         = 1;
137100f28aeSBarry Smith   attr[MPI_COMM_SELF-1][0].attribute_val  = &mpi_tag_ub;
13899256852SLisandro Dalcin   return MPI_SUCCESS;
139e5c89e4eSSatish Balay }
140e5c89e4eSSatish Balay 
14112801b39SBarry Smith int MPI_Comm_create_keyval(MPI_Copy_function *copy_fn,MPI_Delete_function *delete_fn,int *keyval,void *extra_state)
142e5c89e4eSSatish Balay {
1439cf9c1dbSJed Brown   if (num_attr >= MAX_ATTR) return MPIUni_Abort(MPI_COMM_WORLD,1);
144e5c89e4eSSatish Balay 
14546651e72SBarry Smith   attr_keyval[num_attr].extra_state = extra_state;
14646651e72SBarry Smith   attr_keyval[num_attr].del         = delete_fn;
147e5c89e4eSSatish Balay   *keyval                           = num_attr++;
14899256852SLisandro Dalcin   return MPI_SUCCESS;
149e5c89e4eSSatish Balay }
150e5c89e4eSSatish Balay 
15147435625SJed Brown int MPI_Comm_free_keyval(int *keyval)
152e5c89e4eSSatish Balay {
153a246e310SBarry Smith   attr_keyval[*keyval].extra_state = 0;
154a246e310SBarry Smith   attr_keyval[*keyval].del         = 0;
155a297a907SKarl Rupp 
156a246e310SBarry Smith   *keyval = 0;
157e5c89e4eSSatish Balay   return MPI_SUCCESS;
158e5c89e4eSSatish Balay }
159e5c89e4eSSatish Balay 
16047435625SJed Brown int MPI_Comm_set_attr(MPI_Comm comm,int keyval,void *attribute_val)
161e5c89e4eSSatish Balay {
16299256852SLisandro Dalcin   if (comm-1 < 0 || comm-1 > MaxComm) return MPI_FAILURE;
163100f28aeSBarry Smith   attr[comm-1][keyval].active        = 1;
164100f28aeSBarry Smith   attr[comm-1][keyval].attribute_val = attribute_val;
165e5c89e4eSSatish Balay   return MPI_SUCCESS;
166e5c89e4eSSatish Balay }
167e5c89e4eSSatish Balay 
16847435625SJed Brown int MPI_Comm_delete_attr(MPI_Comm comm,int keyval)
169e5c89e4eSSatish Balay {
17099256852SLisandro Dalcin   if (comm-1 < 0 || comm-1 > MaxComm) return MPI_FAILURE;
171100f28aeSBarry Smith   if (attr[comm-1][keyval].active && attr_keyval[keyval].del) {
172100f28aeSBarry Smith     void *save_attribute_val = attr[comm-1][keyval].attribute_val;
173100f28aeSBarry Smith     attr[comm-1][keyval].active        = 0;
174100f28aeSBarry Smith     attr[comm-1][keyval].attribute_val = 0;
17546651e72SBarry Smith     (*(attr_keyval[keyval].del))(comm,keyval,save_attribute_val,attr_keyval[keyval].extra_state);
17640776e1bSpetsc   }
177e5c89e4eSSatish Balay   return MPI_SUCCESS;
178e5c89e4eSSatish Balay }
179e5c89e4eSSatish Balay 
18047435625SJed Brown int MPI_Comm_get_attr(MPI_Comm comm,int keyval,void *attribute_val,int *flag)
181e5c89e4eSSatish Balay {
18299256852SLisandro Dalcin   if (comm-1 < 0 || comm-1 > MaxComm) return MPI_FAILURE;
183e5c89e4eSSatish Balay   if (!keyval) Keyval_setup();
184100f28aeSBarry Smith   *flag                  = attr[comm-1][keyval].active;
185100f28aeSBarry Smith   *(void**)attribute_val = attr[comm-1][keyval].attribute_val;
186e5c89e4eSSatish Balay   return MPI_SUCCESS;
187e5c89e4eSSatish Balay }
188e5c89e4eSSatish Balay 
189c8217ed5SSatish Balay int MPI_Comm_create(MPI_Comm comm,MPI_Group group,MPI_Comm *newcomm)
190c8217ed5SSatish Balay {
191f60917d2SBarry Smith   int j;
19299256852SLisandro Dalcin   if (comm-1 < 0 || comm-1 > MaxComm) return MPI_FAILURE;
193f60917d2SBarry Smith   for (j=3; j<MaxComm; j++) {
194f60917d2SBarry Smith     if (!comm_active[j-1]) {
195f60917d2SBarry Smith       comm_active[j-1] = 1;
196f60917d2SBarry Smith       *newcomm = j;
197f60917d2SBarry Smith       return MPI_SUCCESS;
198f60917d2SBarry Smith     }
199f60917d2SBarry Smith   }
200fb53af6bSBarry Smith   if (MaxComm > MAX_COMM) return MPI_FAILURE;
201fb53af6bSBarry Smith   *newcomm =  MaxComm++;
202f7f9ee71SBarry Smith   comm_active[*newcomm-1] = 1;
203c8217ed5SSatish Balay   return MPI_SUCCESS;
204c8217ed5SSatish Balay }
205c8217ed5SSatish Balay 
206c8217ed5SSatish Balay int MPI_Comm_dup(MPI_Comm comm,MPI_Comm *out)
207e5c89e4eSSatish Balay {
208f60917d2SBarry Smith   int j;
20999256852SLisandro Dalcin   if (comm-1 < 0 || comm-1 > MaxComm) return MPI_FAILURE;
210f60917d2SBarry Smith   for (j=3; j<MaxComm; j++) {
211f60917d2SBarry Smith     if (!comm_active[j-1]) {
212f60917d2SBarry Smith       comm_active[j-1] = 1;
213f60917d2SBarry Smith       *out = j;
214f60917d2SBarry Smith       return MPI_SUCCESS;
215f60917d2SBarry Smith     }
216f60917d2SBarry Smith   }
217fb53af6bSBarry Smith   if (MaxComm > MAX_COMM) return MPI_FAILURE;
218fb53af6bSBarry Smith   *out = MaxComm++;
219f7f9ee71SBarry Smith   comm_active[*out-1] = 1;
22099256852SLisandro Dalcin   return MPI_SUCCESS;
221e5c89e4eSSatish Balay }
222e5c89e4eSSatish Balay 
223c8217ed5SSatish Balay int MPI_Comm_free(MPI_Comm *comm)
224e5c89e4eSSatish Balay {
225e5c89e4eSSatish Balay   int i;
226e5c89e4eSSatish Balay 
22799256852SLisandro Dalcin   if (*comm-1 < 0 || *comm-1 > MaxComm) return MPI_FAILURE;
228e5c89e4eSSatish Balay   for (i=0; i<num_attr; i++) {
229a297a907SKarl Rupp     if (attr[*comm-1][i].active && attr_keyval[i].del) (*attr_keyval[i].del)(*comm,i,attr[*comm-1][i].attribute_val,attr_keyval[i].extra_state);
230100f28aeSBarry Smith     attr[*comm-1][i].active        = 0;
231a246e310SBarry Smith     attr[*comm-1][i].attribute_val = 0;
232e5c89e4eSSatish Balay   }
233f60917d2SBarry Smith   if (*comm >= 3) comm_active[*comm-1] = 0;
234100f28aeSBarry Smith   *comm = 0;
235e5c89e4eSSatish Balay   return MPI_SUCCESS;
236e5c89e4eSSatish Balay }
237e5c89e4eSSatish Balay 
238d393f697SSatish Balay int MPI_Comm_size(MPI_Comm comm, int *size)
239d393f697SSatish Balay {
24099256852SLisandro Dalcin   if (comm-1 < 0 || comm-1 > MaxComm) return MPI_FAILURE;
241d393f697SSatish Balay   *size=1;
242d393f697SSatish Balay   return MPI_SUCCESS;
243d393f697SSatish Balay }
244d393f697SSatish Balay 
245d393f697SSatish Balay int MPI_Comm_rank(MPI_Comm comm, int *rank)
246d393f697SSatish Balay {
24799256852SLisandro Dalcin   if (comm-1 < 0 || comm-1 > MaxComm) return MPI_FAILURE;
248d393f697SSatish Balay   *rank=0;
249d393f697SSatish Balay   return MPI_SUCCESS;
250d393f697SSatish Balay }
251d393f697SSatish Balay 
25206df1fb1SBarry Smith int MPIUni_Abort(MPI_Comm comm,int errorcode)
25306df1fb1SBarry Smith {
25406df1fb1SBarry Smith   printf("MPI operation not supported by PETSc's sequential MPI wrappers\n");
25506df1fb1SBarry Smith   return MPI_FAILURE;
25606df1fb1SBarry Smith }
25706df1fb1SBarry Smith 
258c8217ed5SSatish Balay int MPI_Abort(MPI_Comm comm,int errorcode)
259e5c89e4eSSatish Balay {
260e5c89e4eSSatish Balay   abort();
261e5c89e4eSSatish Balay   return MPI_SUCCESS;
262e5c89e4eSSatish Balay }
263e5c89e4eSSatish Balay 
26458cd72c3SLisandro Dalcin /* --------------------------------------------------------------------------*/
26558cd72c3SLisandro Dalcin 
266e5c89e4eSSatish Balay static int MPI_was_initialized = 0;
26758cd72c3SLisandro Dalcin static int MPI_was_finalized   = 0;
26858cd72c3SLisandro Dalcin 
269c8217ed5SSatish Balay int MPI_Init(int *argc, char ***argv)
27058cd72c3SLisandro Dalcin {
27199256852SLisandro Dalcin   if (MPI_was_initialized) return MPI_FAILURE;
27299256852SLisandro Dalcin   if (MPI_was_finalized) return MPI_FAILURE;
27358cd72c3SLisandro Dalcin   MPI_was_initialized = 1;
27499256852SLisandro Dalcin   return MPI_SUCCESS;
27558cd72c3SLisandro Dalcin }
27658cd72c3SLisandro Dalcin 
277c8217ed5SSatish Balay int MPI_Finalize(void)
27858cd72c3SLisandro Dalcin {
279100f28aeSBarry Smith   MPI_Comm comm;
28099256852SLisandro Dalcin   if (MPI_was_finalized) return MPI_FAILURE;
28199256852SLisandro Dalcin   if (!MPI_was_initialized) return MPI_FAILURE;
282100f28aeSBarry Smith   comm = MPI_COMM_WORLD;
283100f28aeSBarry Smith   MPI_Comm_free(&comm);
284100f28aeSBarry Smith   comm = MPI_COMM_SELF;
285100f28aeSBarry Smith   MPI_Comm_free(&comm);
28658cd72c3SLisandro Dalcin   MPI_was_finalized = 1;
28799256852SLisandro Dalcin   return MPI_SUCCESS;
28858cd72c3SLisandro Dalcin }
289e5c89e4eSSatish Balay 
290c8217ed5SSatish Balay int MPI_Initialized(int *flag)
291e5c89e4eSSatish Balay {
292e5c89e4eSSatish Balay   *flag = MPI_was_initialized;
29399256852SLisandro Dalcin   return MPI_SUCCESS;
294e5c89e4eSSatish Balay }
295e5c89e4eSSatish Balay 
296c8217ed5SSatish Balay int MPI_Finalized(int *flag)
297e5c89e4eSSatish Balay {
29858cd72c3SLisandro Dalcin   *flag = MPI_was_finalized;
29999256852SLisandro Dalcin   return MPI_SUCCESS;
300e5c89e4eSSatish Balay }
301e5c89e4eSSatish Balay 
302e5c89e4eSSatish Balay /* -------------------     Fortran versions of several routines ------------------ */
303e5c89e4eSSatish Balay 
304f7c6e6aaSSatish Balay #if defined(PETSC_HAVE_FORTRAN_CAPS)
3050134af2dSBarry Smith #define mpiunisetmoduleblock_          MPIUNISETMODULEBLOCK
30652ecd5ffSSatish Balay #define mpiunisetfortranbasepointers_  MPIUNISETFORTRANBASEPOINTERS
307a7b85bbcSSatish Balay #define petsc_mpi_init_                PETSC_MPI_INIT
308a7b85bbcSSatish Balay #define petsc_mpi_finalize_            PETSC_MPI_FINALIZE
309a7b85bbcSSatish Balay #define petsc_mpi_comm_size_           PETSC_MPI_COMM_SIZE
310a7b85bbcSSatish Balay #define petsc_mpi_comm_rank_           PETSC_MPI_COMM_RANK
311a7b85bbcSSatish Balay #define petsc_mpi_abort_               PETSC_MPI_ABORT
312a7b85bbcSSatish Balay #define petsc_mpi_reduce_              PETSC_MPI_REDUCE
313a7b85bbcSSatish Balay #define petsc_mpi_allreduce_           PETSC_MPI_ALLREDUCE
314a7b85bbcSSatish Balay #define petsc_mpi_barrier_             PETSC_MPI_BARRIER
315a7b85bbcSSatish Balay #define petsc_mpi_bcast_               PETSC_MPI_BCAST
316a7b85bbcSSatish Balay #define petsc_mpi_gather_              PETSC_MPI_GATHER
317a7b85bbcSSatish Balay #define petsc_mpi_allgather_           PETSC_MPI_ALLGATHER
318a7b85bbcSSatish Balay #define petsc_mpi_comm_split_          PETSC_MPI_COMM_SPLIT
319a7b85bbcSSatish Balay #define petsc_mpi_scan_                PETSC_MPI_SCAN
320a7b85bbcSSatish Balay #define petsc_mpi_send_                PETSC_MPI_SEND
321a7b85bbcSSatish Balay #define petsc_mpi_recv_                PETSC_MPI_RECV
322a7b85bbcSSatish Balay #define petsc_mpi_reduce_scatter_      PETSC_MPI_REDUCE_SCATTER
323a7b85bbcSSatish Balay #define petsc_mpi_irecv_               PETSC_MPI_IRECV
324a7b85bbcSSatish Balay #define petsc_mpi_isend_               PETSC_MPI_ISEND
325a7b85bbcSSatish Balay #define petsc_mpi_sendrecv_            PETSC_MPI_SENDRECV
326a7b85bbcSSatish Balay #define petsc_mpi_test_                PETSC_MPI_TEST
327a7b85bbcSSatish Balay #define petsc_mpi_waitall_             PETSC_MPI_WAITALL
328a7b85bbcSSatish Balay #define petsc_mpi_waitany_             PETSC_MPI_WAITANY
329a7b85bbcSSatish Balay #define petsc_mpi_allgatherv_          PETSC_MPI_ALLGATHERV
330a7b85bbcSSatish Balay #define petsc_mpi_alltoallv_           PETSC_MPI_ALLTOALLV
331a7b85bbcSSatish Balay #define petsc_mpi_comm_create_         PETSC_MPI_COMM_CREATE
332a7b85bbcSSatish Balay #define petsc_mpi_address_             PETSC_MPI_ADDRESS
333a7b85bbcSSatish Balay #define petsc_mpi_pack_                PETSC_MPI_PACK
334a7b85bbcSSatish Balay #define petsc_mpi_unpack_              PETSC_MPI_UNPACK
335a7b85bbcSSatish Balay #define petsc_mpi_pack_size_           PETSC_MPI_PACK_SIZE
336a7b85bbcSSatish Balay #define petsc_mpi_type_struct_         PETSC_MPI_TYPE_STRUCT
337a7b85bbcSSatish Balay #define petsc_mpi_type_commit_         PETSC_MPI_TYPE_COMMIT
338a7b85bbcSSatish Balay #define petsc_mpi_wtime_               PETSC_MPI_WTIME
339a7b85bbcSSatish Balay #define petsc_mpi_cancel_              PETSC_MPI_CANCEL
340a7b85bbcSSatish Balay #define petsc_mpi_comm_dup_            PETSC_MPI_COMM_DUP
341a7b85bbcSSatish Balay #define petsc_mpi_comm_free_           PETSC_MPI_COMM_FREE
342a7b85bbcSSatish Balay #define petsc_mpi_get_count_           PETSC_MPI_GET_COUNT
343a7b85bbcSSatish Balay #define petsc_mpi_get_processor_name_  PETSC_MPI_GET_PROCESSOR_NAME
344a7b85bbcSSatish Balay #define petsc_mpi_initialized_         PETSC_MPI_INITIALIZED
345a7b85bbcSSatish Balay #define petsc_mpi_iprobe_              PETSC_MPI_IPROBE
346a7b85bbcSSatish Balay #define petsc_mpi_probe_               PETSC_MPI_PROBE
347a7b85bbcSSatish Balay #define petsc_mpi_request_free_        PETSC_MPI_REQUEST_FREE
348a7b85bbcSSatish Balay #define petsc_mpi_ssend_               PETSC_MPI_SSEND
349a7b85bbcSSatish Balay #define petsc_mpi_wait_                PETSC_MPI_WAIT
350a7b85bbcSSatish Balay #define petsc_mpi_comm_group_          PETSC_MPI_COMM_GROUP
351a7b85bbcSSatish Balay #define petsc_mpi_exscan_              PETSC_MPI_EXSCAN
352f7c6e6aaSSatish Balay #elif !defined(PETSC_HAVE_FORTRAN_UNDERSCORE)
3530134af2dSBarry Smith #define mpiunisetmoduleblock_          mpiunisetmoduleblock
35452ecd5ffSSatish Balay #define mpiunisetfortranbasepointers_  mpiunisetfortranbasepointers
355a7b85bbcSSatish Balay #define petsc_mpi_init_                petsc_mpi_init
356a7b85bbcSSatish Balay #define petsc_mpi_finalize_            petsc_mpi_finalize
357a7b85bbcSSatish Balay #define petsc_mpi_comm_size_           petsc_mpi_comm_size
358a7b85bbcSSatish Balay #define petsc_mpi_comm_rank_           petsc_mpi_comm_rank
359a7b85bbcSSatish Balay #define petsc_mpi_abort_               petsc_mpi_abort
360a7b85bbcSSatish Balay #define petsc_mpi_reduce_              petsc_mpi_reduce
361a7b85bbcSSatish Balay #define petsc_mpi_allreduce_           petsc_mpi_allreduce
362a7b85bbcSSatish Balay #define petsc_mpi_barrier_             petsc_mpi_barrier
363a7b85bbcSSatish Balay #define petsc_mpi_bcast_               petsc_mpi_bcast
364a7b85bbcSSatish Balay #define petsc_mpi_gather_              petsc_mpi_gather
365a7b85bbcSSatish Balay #define petsc_mpi_allgather_           petsc_mpi_allgather
366a7b85bbcSSatish Balay #define petsc_mpi_comm_split_          petsc_mpi_comm_split
367a7b85bbcSSatish Balay #define petsc_mpi_scan_                petsc_mpi_scan
368a7b85bbcSSatish Balay #define petsc_mpi_send_                petsc_mpi_send
369a7b85bbcSSatish Balay #define petsc_mpi_recv_                petsc_mpi_recv
370a7b85bbcSSatish Balay #define petsc_mpi_reduce_scatter_      petsc_mpi_reduce_scatter
371a7b85bbcSSatish Balay #define petsc_mpi_irecv_               petsc_mpi_irecv
372a7b85bbcSSatish Balay #define petsc_mpi_isend_               petsc_mpi_isend
373a7b85bbcSSatish Balay #define petsc_mpi_sendrecv_            petsc_mpi_sendrecv
374a7b85bbcSSatish Balay #define petsc_mpi_test_                petsc_mpi_test
375a7b85bbcSSatish Balay #define petsc_mpi_waitall_             petsc_mpi_waitall
376a7b85bbcSSatish Balay #define petsc_mpi_waitany_             petsc_mpi_waitany
377a7b85bbcSSatish Balay #define petsc_mpi_allgatherv_          petsc_mpi_allgatherv
378a7b85bbcSSatish Balay #define petsc_mpi_alltoallv_           petsc_mpi_alltoallv
379a7b85bbcSSatish Balay #define petsc_mpi_comm_create_         petsc_mpi_comm_create
380a7b85bbcSSatish Balay #define petsc_mpi_address_             petsc_mpi_address
381a7b85bbcSSatish Balay #define petsc_mpi_pack_                petsc_mpi_pack
382a7b85bbcSSatish Balay #define petsc_mpi_unpack_              petsc_mpi_unpack
383a7b85bbcSSatish Balay #define petsc_mpi_pack_size_           petsc_mpi_pack_size
384a7b85bbcSSatish Balay #define petsc_mpi_type_struct_         petsc_mpi_type_struct
385a7b85bbcSSatish Balay #define petsc_mpi_type_commit_         petsc_mpi_type_commit
386a7b85bbcSSatish Balay #define petsc_mpi_wtime_               petsc_mpi_wtime
387a7b85bbcSSatish Balay #define petsc_mpi_cancel_              petsc_mpi_cancel
388a7b85bbcSSatish Balay #define petsc_mpi_comm_dup_            petsc_mpi_comm_dup
389a7b85bbcSSatish Balay #define petsc_mpi_comm_free_           petsc_mpi_comm_free
390a7b85bbcSSatish Balay #define petsc_mpi_get_count_           petsc_mpi_get_count
391a7b85bbcSSatish Balay #define petsc_mpi_get_processor_name_  petsc_mpi_get_processor_name
392a7b85bbcSSatish Balay #define petsc_mpi_initialized_         petsc_mpi_initialized
393a7b85bbcSSatish Balay #define petsc_mpi_iprobe_              petsc_mpi_iprobe
394a7b85bbcSSatish Balay #define petsc_mpi_probe_               petsc_mpi_probe
395a7b85bbcSSatish Balay #define petsc_mpi_request_free_        petsc_mpi_request_free
396a7b85bbcSSatish Balay #define petsc_mpi_ssend_               petsc_mpi_ssend
397a7b85bbcSSatish Balay #define petsc_mpi_wait_                petsc_mpi_wait
398a7b85bbcSSatish Balay #define petsc_mpi_comm_group_          petsc_mpi_comm_group
399a7b85bbcSSatish Balay #define petsc_mpi_exscan_              petsc_mpi_exscan
400f7c6e6aaSSatish Balay #endif
401e5c89e4eSSatish Balay 
402f7c6e6aaSSatish Balay #if defined(PETSC_HAVE_FORTRAN_UNDERSCORE_UNDERSCORE)
403a7b85bbcSSatish Balay #define petsc_mpi_init_                petsc_mpi_init__
404a7b85bbcSSatish Balay #define petsc_mpi_finalize_            petsc_mpi_finalize__
405a7b85bbcSSatish Balay #define petsc_mpi_comm_size_           petsc_mpi_comm_size__
406a7b85bbcSSatish Balay #define petsc_mpi_comm_rank_           petsc_mpi_comm_rank__
407a7b85bbcSSatish Balay #define petsc_mpi_abort_               petsc_mpi_abort__
408a7b85bbcSSatish Balay #define petsc_mpi_reduce_              petsc_mpi_reduce__
409a7b85bbcSSatish Balay #define petsc_mpi_allreduce_           petsc_mpi_allreduce__
410a7b85bbcSSatish Balay #define petsc_mpi_barrier_             petsc_mpi_barrier__
411a7b85bbcSSatish Balay #define petsc_mpi_bcast_               petsc_mpi_bcast__
412a7b85bbcSSatish Balay #define petsc_mpi_gather_              petsc_mpi_gather__
413a7b85bbcSSatish Balay #define petsc_mpi_allgather_           petsc_mpi_allgather__
414a7b85bbcSSatish Balay #define petsc_mpi_comm_split_          petsc_mpi_comm_split__
415a7b85bbcSSatish Balay #define petsc_mpi_scan_                petsc_mpi_scan__
416a7b85bbcSSatish Balay #define petsc_mpi_send_                petsc_mpi_send__
417a7b85bbcSSatish Balay #define petsc_mpi_recv_                petsc_mpi_recv__
418a7b85bbcSSatish Balay #define petsc_mpi_reduce_scatter_      petsc_mpi_reduce_scatter__
419a7b85bbcSSatish Balay #define petsc_mpi_irecv_               petsc_mpi_irecv__
420a7b85bbcSSatish Balay #define petsc_mpi_isend_               petsc_mpi_isend__
421a7b85bbcSSatish Balay #define petsc_mpi_sendrecv_            petsc_mpi_sendrecv__
422a7b85bbcSSatish Balay #define petsc_mpi_test_                petsc_mpi_test__
423a7b85bbcSSatish Balay #define petsc_mpi_waitall_             petsc_mpi_waitall__
424a7b85bbcSSatish Balay #define petsc_mpi_waitany_             petsc_mpi_waitany__
425a7b85bbcSSatish Balay #define petsc_mpi_allgatherv_          petsc_mpi_allgatherv__
426a7b85bbcSSatish Balay #define petsc_mpi_alltoallv_           petsc_mpi_alltoallv__
427a7b85bbcSSatish Balay #define petsc_mpi_comm_create_         petsc_mpi_comm_create__
428a7b85bbcSSatish Balay #define petsc_mpi_address_             petsc_mpi_address__
429a7b85bbcSSatish Balay #define petsc_mpi_pack_                petsc_mpi_pack__
430a7b85bbcSSatish Balay #define petsc_mpi_unpack_              petsc_mpi_unpack__
431a7b85bbcSSatish Balay #define petsc_mpi_pack_size_           petsc_mpi_pack_size__
432a7b85bbcSSatish Balay #define petsc_mpi_type_struct_         petsc_mpi_type_struct__
433a7b85bbcSSatish Balay #define petsc_mpi_type_commit_         petsc_mpi_type_commit__
434a7b85bbcSSatish Balay #define petsc_mpi_wtime_               petsc_mpi_wtime__
435a7b85bbcSSatish Balay #define petsc_mpi_cancel_              petsc_mpi_cancel__
436a7b85bbcSSatish Balay #define petsc_mpi_comm_dup_            petsc_mpi_comm_dup__
437a7b85bbcSSatish Balay #define petsc_mpi_comm_free_           petsc_mpi_comm_free__
438a7b85bbcSSatish Balay #define petsc_mpi_get_count_           petsc_mpi_get_count__
439a7b85bbcSSatish Balay #define petsc_mpi_get_processor_name_  petsc_mpi_get_processor_name__
440a7b85bbcSSatish Balay #define petsc_mpi_initialized_         petsc_mpi_initialized__
441a7b85bbcSSatish Balay #define petsc_mpi_iprobe_              petsc_mpi_iprobe__
442a7b85bbcSSatish Balay #define petsc_mpi_probe_               petsc_mpi_probe__
443a7b85bbcSSatish Balay #define petsc_mpi_request_free_        petsc_mpi_request_free__
444a7b85bbcSSatish Balay #define petsc_mpi_ssend_               petsc_mpi_ssend__
445a7b85bbcSSatish Balay #define petsc_mpi_wait_                petsc_mpi_wait__
446a7b85bbcSSatish Balay #define petsc_mpi_comm_group_          petsc_mpi_comm_group__
447a7b85bbcSSatish Balay #define petsc_mpi_exscan_              petsc_mpi_exscan__
448f7c6e6aaSSatish Balay #endif
449e5c89e4eSSatish Balay 
450c8217ed5SSatish Balay /* Do not build fortran interface if MPI namespace colision is to be avoided */
451a7b85bbcSSatish Balay #if defined(PETSC_HAVE_FORTRAN)
452c8217ed5SSatish Balay 
453*19caf8f3SSatish Balay PETSC_EXTERN void mpiunisetmoduleblock_(void);
45452ecd5ffSSatish Balay 
455*19caf8f3SSatish Balay PETSC_EXTERN void mpiunisetfortranbasepointers_(void *f_mpi_in_place)
45652ecd5ffSSatish Balay {
45752ecd5ffSSatish Balay   MPIUNIF_mpi_in_place   = f_mpi_in_place;
45852ecd5ffSSatish Balay }
45952ecd5ffSSatish Balay 
460*19caf8f3SSatish Balay PETSC_EXTERN void petsc_mpi_init_(int *ierr)
461e5c89e4eSSatish Balay {
4620134af2dSBarry Smith   mpiunisetmoduleblock_();
463c8217ed5SSatish Balay   *ierr = MPI_Init((int*)0, (char***)0);
464e5c89e4eSSatish Balay }
465e5c89e4eSSatish Balay 
466*19caf8f3SSatish Balay PETSC_EXTERN void petsc_mpi_finalize_(int *ierr)
467e5c89e4eSSatish Balay {
468c8217ed5SSatish Balay   *ierr = MPI_Finalize();
469e5c89e4eSSatish Balay }
470e5c89e4eSSatish Balay 
471*19caf8f3SSatish Balay PETSC_EXTERN void petsc_mpi_comm_size_(MPI_Comm *comm,int *size,int *ierr)
472e5c89e4eSSatish Balay {
473e5c89e4eSSatish Balay   *size = 1;
474e5c89e4eSSatish Balay   *ierr = 0;
475e5c89e4eSSatish Balay }
476e5c89e4eSSatish Balay 
477*19caf8f3SSatish Balay PETSC_EXTERN void petsc_mpi_comm_rank_(MPI_Comm *comm,int *rank,int *ierr)
478e5c89e4eSSatish Balay {
479e5c89e4eSSatish Balay   *rank = 0;
480e5c89e4eSSatish Balay   *ierr = MPI_SUCCESS;
481e5c89e4eSSatish Balay }
482e5c89e4eSSatish Balay 
483*19caf8f3SSatish Balay PETSC_EXTERN void petsc_mpi_comm_split_(MPI_Comm *comm,int *color,int *key, MPI_Comm *newcomm, int *ierr)
4841f6cc5b2SSatish Balay {
4851f6cc5b2SSatish Balay   *newcomm = *comm;
4861f6cc5b2SSatish Balay   *ierr    = MPI_SUCCESS;
4871f6cc5b2SSatish Balay }
4881f6cc5b2SSatish Balay 
489*19caf8f3SSatish Balay PETSC_EXTERN void petsc_mpi_abort_(MPI_Comm *comm,int *errorcode,int *ierr)
490e5c89e4eSSatish Balay {
491e5c89e4eSSatish Balay   abort();
492e5c89e4eSSatish Balay   *ierr = MPI_SUCCESS;
493e5c89e4eSSatish Balay }
494e5c89e4eSSatish Balay 
495*19caf8f3SSatish Balay PETSC_EXTERN void petsc_mpi_reduce_(void *sendbuf,void *recvbuf,int *count,int *datatype,int *op,int *root,int *comm,int *ierr)
4963b644628SSatish Balay {
497f30578ecSBarry Smith   *ierr = MPI_Reduce(sendbuf,recvbuf,*count,*datatype,*op,*root,*comm);
4983b644628SSatish Balay }
4993b644628SSatish Balay 
500*19caf8f3SSatish Balay PETSC_EXTERN void petsc_mpi_allreduce_(void *sendbuf,void *recvbuf,int *count,int *datatype,int *op,int *comm,int *ierr)
501e5c89e4eSSatish Balay {
502f30578ecSBarry Smith   *ierr = MPI_Allreduce(sendbuf,recvbuf,*count,*datatype,*op,*comm);
503e5c89e4eSSatish Balay }
504e5c89e4eSSatish Balay 
505*19caf8f3SSatish Balay PETSC_EXTERN void petsc_mpi_barrier_(MPI_Comm *comm,int *ierr)
506e5c89e4eSSatish Balay {
507e5c89e4eSSatish Balay   *ierr = MPI_SUCCESS;
508e5c89e4eSSatish Balay }
509f7c6e6aaSSatish Balay 
510*19caf8f3SSatish Balay PETSC_EXTERN void petsc_mpi_bcast_(void *buf,int *count,int *datatype,int *root,int *comm,int *ierr)
511e5c89e4eSSatish Balay {
512e5c89e4eSSatish Balay   *ierr = MPI_SUCCESS;
513e5c89e4eSSatish Balay }
514f7c6e6aaSSatish Balay 
515*19caf8f3SSatish 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)
516e5c89e4eSSatish Balay {
517f30578ecSBarry Smith   *ierr = MPI_Gather(sendbuf,*scount,*sdatatype,recvbuf,rcount,rdatatype,*root,*comm);
518f7c6e6aaSSatish Balay }
519f7c6e6aaSSatish Balay 
520*19caf8f3SSatish Balay PETSC_EXTERN void petsc_mpi_allgather_(void *sendbuf,int *scount,int *sdatatype, void *recvbuf, int *rcount, int *rdatatype,int *comm,int *ierr)
521f7c6e6aaSSatish Balay {
522f30578ecSBarry Smith   *ierr = MPI_Allgather(sendbuf,*scount,*sdatatype,recvbuf,rcount,rdatatype,*comm);
523e5c89e4eSSatish Balay }
524e5c89e4eSSatish Balay 
525*19caf8f3SSatish Balay PETSC_EXTERN void petsc_mpi_scan_(void *sendbuf,void *recvbuf,int *count,int *datatype,int *op,int *comm,int *ierr)
5263b644628SSatish Balay {
5271a589b05SJed Brown   *ierr = MPIUNI_Memcpy(recvbuf,sendbuf,(*count)*MPI_sizeof(*datatype));
5283b644628SSatish Balay }
5293b644628SSatish Balay 
530*19caf8f3SSatish Balay PETSC_EXTERN void petsc_mpi_send_(void *buf,int *count,int *datatype,int *dest,int *tag,int *comm,int *ierr)
5311086b069SSatish Balay {
53206df1fb1SBarry Smith   *ierr = MPIUni_Abort(MPI_COMM_WORLD,0);
5331086b069SSatish Balay }
5341086b069SSatish Balay 
535*19caf8f3SSatish Balay PETSC_EXTERN void petsc_mpi_recv_(void *buf,int *count,int *datatype,int *source,int *tag,int *comm,int status,int *ierr)
5361086b069SSatish Balay {
53706df1fb1SBarry Smith   *ierr = MPIUni_Abort(MPI_COMM_WORLD,0);
5381086b069SSatish Balay }
5391086b069SSatish Balay 
540*19caf8f3SSatish Balay PETSC_EXTERN void petsc_mpi_reduce_scatter_(void *sendbuf,void *recvbuf,int *recvcounts,int *datatype,int *op,int *comm,int *ierr)
541156bc490SSatish Balay {
54206df1fb1SBarry Smith   *ierr = MPIUni_Abort(MPI_COMM_WORLD,0);
543156bc490SSatish Balay }
544156bc490SSatish Balay 
545*19caf8f3SSatish Balay PETSC_EXTERN void petsc_mpi_irecv_(void *buf,int *count, int *datatype, int *source, int *tag, int *comm, int *request, int *ierr)
546156bc490SSatish Balay {
54706df1fb1SBarry Smith   *ierr = MPIUni_Abort(MPI_COMM_WORLD,0);
548156bc490SSatish Balay }
549156bc490SSatish Balay 
550*19caf8f3SSatish Balay PETSC_EXTERN void petsc_mpi_isend_(void *buf,int *count,int *datatype,int *dest,int *tag,int *comm,int *request, int *ierr)
551156bc490SSatish Balay {
55206df1fb1SBarry Smith   *ierr = MPIUni_Abort(MPI_COMM_WORLD,0);
553156bc490SSatish Balay }
554156bc490SSatish Balay 
555*19caf8f3SSatish 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)
556156bc490SSatish Balay {
5571a589b05SJed Brown   *ierr = MPIUNI_Memcpy(recvbuf,sendbuf,(*sendcount)*MPI_sizeof(*sendtype));
558156bc490SSatish Balay }
559156bc490SSatish Balay 
560*19caf8f3SSatish Balay PETSC_EXTERN void petsc_mpi_test_(int *request,int *flag,int *status,int *ierr)
561156bc490SSatish Balay {
56206df1fb1SBarry Smith   *ierr = MPIUni_Abort(MPI_COMM_WORLD,0);
563156bc490SSatish Balay }
564156bc490SSatish Balay 
565*19caf8f3SSatish Balay PETSC_EXTERN void petsc_mpi_waitall_(int *count,int *array_of_requests,int *array_of_statuses,int *ierr)
566156bc490SSatish Balay {
567156bc490SSatish Balay   *ierr = MPI_SUCCESS;
568156bc490SSatish Balay }
569156bc490SSatish Balay 
570*19caf8f3SSatish Balay PETSC_EXTERN void petsc_mpi_waitany_(int *count,int *array_of_requests,int * index, int *status,int *ierr)
571156bc490SSatish Balay {
572156bc490SSatish Balay   *ierr = MPI_SUCCESS;
573156bc490SSatish Balay }
574156bc490SSatish Balay 
575*19caf8f3SSatish 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)
576156bc490SSatish Balay {
577f30578ecSBarry Smith   *ierr = MPI_Allgatherv(sendbuf,*sendcount,*sendtype,recvbuf,recvcounts,displs,*recvtype,*comm);
578156bc490SSatish Balay }
579156bc490SSatish Balay 
580*19caf8f3SSatish 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)
581156bc490SSatish Balay {
582f30578ecSBarry Smith   *ierr = MPI_Alltoallv(sendbuf,sendcounts,sdispls,*sendtype,recvbuf,recvcounts,rdispls,*recvtype,*comm);
583156bc490SSatish Balay }
584156bc490SSatish Balay 
585*19caf8f3SSatish Balay PETSC_EXTERN void petsc_mpi_comm_create_(int *comm,int *group,int *newcomm,int *ierr)
586156bc490SSatish Balay {
587156bc490SSatish Balay   *newcomm =  *comm;
588156bc490SSatish Balay   *ierr    = MPI_SUCCESS;
589156bc490SSatish Balay }
590156bc490SSatish Balay 
591*19caf8f3SSatish Balay PETSC_EXTERN void petsc_mpi_address_(void *location,MPI_Aint *address,int *ierr)
592156bc490SSatish Balay {
59399256852SLisandro Dalcin   *address =  (MPI_Aint) ((char *)location);
594156bc490SSatish Balay   *ierr    = MPI_SUCCESS;
595156bc490SSatish Balay }
596156bc490SSatish Balay 
597*19caf8f3SSatish Balay PETSC_EXTERN void petsc_mpi_pack_(void *inbuf,int *incount,int *datatype,void *outbuf,int *outsize,int *position,int *comm,int *ierr)
598156bc490SSatish Balay {
59906df1fb1SBarry Smith   *ierr = MPIUni_Abort(MPI_COMM_WORLD,0);
600156bc490SSatish Balay }
601156bc490SSatish Balay 
602*19caf8f3SSatish Balay PETSC_EXTERN void petsc_mpi_unpack_(void *inbuf,int *insize,int *position,void *outbuf,int *outcount,int *datatype,int *comm,int *ierr)
603156bc490SSatish Balay {
60406df1fb1SBarry Smith   *ierr = MPIUni_Abort(MPI_COMM_WORLD,0);
605156bc490SSatish Balay }
606156bc490SSatish Balay 
607*19caf8f3SSatish Balay PETSC_EXTERN void petsc_mpi_pack_size_(int *incount,int *datatype,int *comm,int *size,int *ierr)
608156bc490SSatish Balay {
60906df1fb1SBarry Smith   *ierr = MPIUni_Abort(MPI_COMM_WORLD,0);
610156bc490SSatish Balay }
611156bc490SSatish Balay 
612*19caf8f3SSatish 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)
613156bc490SSatish Balay {
61406df1fb1SBarry Smith   *ierr = MPIUni_Abort(MPI_COMM_WORLD,0);
615156bc490SSatish Balay }
616156bc490SSatish Balay 
617*19caf8f3SSatish Balay PETSC_EXTERN void petsc_mpi_type_commit_(int *datatype,int *ierr)
618156bc490SSatish Balay {
619156bc490SSatish Balay   *ierr = MPI_SUCCESS;
620156bc490SSatish Balay }
621156bc490SSatish Balay 
622*19caf8f3SSatish Balay double petsc_mpi_wtime_(void)
623156bc490SSatish Balay {
624156bc490SSatish Balay   return 0.0;
625f8f52c7dSSatish Balay }
626156bc490SSatish Balay 
627*19caf8f3SSatish Balay PETSC_EXTERN void petsc_mpi_cancel_(int *request,int *ierr)
628f8f52c7dSSatish Balay {
629f8f52c7dSSatish Balay   *ierr = MPI_SUCCESS;
630f8f52c7dSSatish Balay }
631f8f52c7dSSatish Balay 
632*19caf8f3SSatish Balay PETSC_EXTERN void petsc_mpi_comm_dup_(int *comm,int *out,int *ierr)
633f8f52c7dSSatish Balay {
634f8f52c7dSSatish Balay   *out  = *comm;
635f8f52c7dSSatish Balay   *ierr = MPI_SUCCESS;
636f8f52c7dSSatish Balay }
637f8f52c7dSSatish Balay 
638*19caf8f3SSatish Balay PETSC_EXTERN void petsc_mpi_comm_free_(int *comm,int *ierr)
639f8f52c7dSSatish Balay {
640f8f52c7dSSatish Balay   *ierr = MPI_SUCCESS;
641f8f52c7dSSatish Balay }
642f8f52c7dSSatish Balay 
643*19caf8f3SSatish Balay PETSC_EXTERN void petsc_mpi_get_count_(int *status,int *datatype,int *count,int *ierr)
644f8f52c7dSSatish Balay {
64506df1fb1SBarry Smith   *ierr = MPIUni_Abort(MPI_COMM_WORLD,0);
646f8f52c7dSSatish Balay }
647f8f52c7dSSatish Balay 
648*19caf8f3SSatish Balay PETSC_EXTERN void petsc_mpi_get_processor_name_(char *name,int *result_len,int *ierr,PETSC_FORTRAN_CHARLEN_T len)
649f8f52c7dSSatish Balay {
650f8f52c7dSSatish Balay   MPIUNI_Memcpy(name,"localhost",9*sizeof(char));
651f8f52c7dSSatish Balay   *result_len = 9;
652f8f52c7dSSatish Balay   *ierr       = MPI_SUCCESS;
653f8f52c7dSSatish Balay }
654f8f52c7dSSatish Balay 
655*19caf8f3SSatish Balay PETSC_EXTERN void petsc_mpi_initialized_(int *flag,int *ierr)
656f8f52c7dSSatish Balay {
657f8f52c7dSSatish Balay   *flag = MPI_was_initialized;
658f8f52c7dSSatish Balay   *ierr = MPI_SUCCESS;
659f8f52c7dSSatish Balay }
660f8f52c7dSSatish Balay 
661*19caf8f3SSatish Balay PETSC_EXTERN void petsc_mpi_iprobe_(int *source,int *tag,int *comm,int *glag,int *status,int *ierr)
662f8f52c7dSSatish Balay {
663f8f52c7dSSatish Balay   *ierr = MPI_SUCCESS;
664f8f52c7dSSatish Balay }
665f8f52c7dSSatish Balay 
666*19caf8f3SSatish Balay PETSC_EXTERN void petsc_mpi_probe_(int *source,int *tag,int *comm,int *flag,int *status,int *ierr)
667f8f52c7dSSatish Balay {
668f8f52c7dSSatish Balay   *ierr = MPI_SUCCESS;
669f8f52c7dSSatish Balay }
670f8f52c7dSSatish Balay 
671*19caf8f3SSatish Balay PETSC_EXTERN void petsc_mpi_request_free_(int *request,int *ierr)
672f8f52c7dSSatish Balay {
673f8f52c7dSSatish Balay   *ierr = MPI_SUCCESS;
674f8f52c7dSSatish Balay }
675f8f52c7dSSatish Balay 
676*19caf8f3SSatish Balay PETSC_EXTERN void petsc_mpi_ssend_(void *buf,int *count,int *datatype,int *dest,int *tag,int *comm,int *ierr)
677f8f52c7dSSatish Balay {
67806df1fb1SBarry Smith   *ierr = MPIUni_Abort(MPI_COMM_WORLD,0);
679f8f52c7dSSatish Balay }
680f8f52c7dSSatish Balay 
681*19caf8f3SSatish Balay PETSC_EXTERN void petsc_mpi_wait_(int *request,int *status,int *ierr)
682f8f52c7dSSatish Balay {
683f8f52c7dSSatish Balay   *ierr = MPI_SUCCESS;
684156bc490SSatish Balay }
685156bc490SSatish Balay 
686*19caf8f3SSatish Balay PETSC_EXTERN void petsc_mpi_comm_group_(int *comm,int *group,int *ierr)
687d4816372SSatish Balay {
688d4816372SSatish Balay   *ierr = MPI_SUCCESS;
689d4816372SSatish Balay }
690d4816372SSatish Balay 
691*19caf8f3SSatish Balay PETSC_EXTERN void petsc_mpi_exscan_(void *sendbuf,void *recvbuf,int *count,int *datatype,int *op,int *comm,int *ierr)
692d4816372SSatish Balay {
693d4816372SSatish Balay   *ierr = MPI_SUCCESS;
694d4816372SSatish Balay }
695d4816372SSatish Balay 
696a7b85bbcSSatish Balay #endif /* PETSC_HAVE_FORTRAN */
697c8217ed5SSatish Balay 
698e5c89e4eSSatish Balay #if defined(__cplusplus)
699e5c89e4eSSatish Balay }
700e5c89e4eSSatish Balay #endif
701