xref: /petsc/src/sys/mpiuni/mpi.c (revision 891da655048cc3620744d1b8cff2796e6506dfa8)
1e5c89e4eSSatish Balay /*
2e5c89e4eSSatish Balay       This provides a few of the MPI-uni functions that cannot be implemented
3e5c89e4eSSatish Balay     with C macros
4e5c89e4eSSatish Balay */
5*891da655SBarry Smith #include <petscsys.h>
64423d37eSSatish Balay #if !defined(__MPIUNI_H)
74423d37eSSatish Balay #error "Wrong mpi.h included! require mpi.h from MPIUNI"
84423d37eSSatish Balay #endif
94423d37eSSatish Balay #if !defined(PETSC_STDCALL)
104423d37eSSatish Balay #define PETSC_STDCALL
114423d37eSSatish Balay #endif
12e5c89e4eSSatish Balay 
13e5c89e4eSSatish Balay #define MPI_SUCCESS 0
14e5c89e4eSSatish Balay #define MPI_FAILURE 1
15a297a907SKarl Rupp 
16e5c89e4eSSatish Balay void *MPIUNI_TMP         = 0;
17f65d6f8aSSatish Balay int  MPIUNI_DATASIZE[10] = {sizeof(int),sizeof(float),sizeof(double),2*sizeof(double),sizeof(char),2*sizeof(int),4*sizeof(double),4,8,2*sizeof(double)};
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 */
26e5c89e4eSSatish Balay #define MAX_ATTR 128
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];
39100f28aeSBarry Smith static MPI_Attr        attr[4][MAX_ATTR];
40e5c89e4eSSatish Balay static int             num_attr = 1,mpi_tag_ub = 100000000;
41e5c89e4eSSatish Balay 
42e5c89e4eSSatish Balay #if defined(__cplusplus)
43e5c89e4eSSatish Balay extern "C" {
44e5c89e4eSSatish Balay #endif
45e5c89e4eSSatish Balay 
46e5c89e4eSSatish Balay /*
47e5c89e4eSSatish Balay    To avoid problems with prototypes to the system memcpy() it is duplicated here
48e5c89e4eSSatish Balay */
49a6dfd86eSKarl Rupp int MPIUNI_Memcpy(void *a,const void *b,int n)
50a6dfd86eSKarl Rupp {
51e5c89e4eSSatish Balay   int  i;
52e5c89e4eSSatish Balay   char *aa= (char*)a;
53e5c89e4eSSatish Balay   char *bb= (char*)b;
54e5c89e4eSSatish Balay 
5599839c1eSBarry Smith   if (b == MPI_IN_PLACE) return 0;
56e5c89e4eSSatish Balay   for (i=0; i<n; i++) aa[i] = bb[i];
57e5c89e4eSSatish Balay   return 0;
58e5c89e4eSSatish Balay }
59e5c89e4eSSatish Balay 
60e5c89e4eSSatish Balay /*
61e5c89e4eSSatish Balay    Used to set the built-in MPI_TAG_UB attribute
62e5c89e4eSSatish Balay */
63e5c89e4eSSatish Balay static int Keyval_setup(void)
64e5c89e4eSSatish Balay {
65100f28aeSBarry Smith   attr[MPI_COMM_WORLD-1][0].active        = 1;
66100f28aeSBarry Smith   attr[MPI_COMM_WORLD-1][0].attribute_val = &mpi_tag_ub;
67100f28aeSBarry Smith   attr[MPI_COMM_SELF-1][0].active         = 1;
68100f28aeSBarry Smith   attr[MPI_COMM_SELF-1][0].attribute_val  = &mpi_tag_ub;
69e5c89e4eSSatish Balay   return 0;
70e5c89e4eSSatish Balay }
71e5c89e4eSSatish Balay 
72c8217ed5SSatish Balay int MPI_Keyval_create(MPI_Copy_function *copy_fn,MPI_Delete_function *delete_fn,int *keyval,void *extra_state)
73e5c89e4eSSatish Balay {
74e5c89e4eSSatish Balay   if (num_attr >= MAX_ATTR) MPI_Abort(MPI_COMM_WORLD,1);
75e5c89e4eSSatish Balay 
7646651e72SBarry Smith   attr_keyval[num_attr].extra_state = extra_state;
7746651e72SBarry Smith   attr_keyval[num_attr].del         = delete_fn;
78e5c89e4eSSatish Balay   *keyval                           = num_attr++;
79e5c89e4eSSatish Balay   return 0;
80e5c89e4eSSatish Balay }
81e5c89e4eSSatish Balay 
82c8217ed5SSatish Balay int MPI_Keyval_free(int *keyval)
83e5c89e4eSSatish Balay {
84a246e310SBarry Smith   attr_keyval[*keyval].extra_state = 0;
85a246e310SBarry Smith   attr_keyval[*keyval].del         = 0;
86a297a907SKarl Rupp 
87a246e310SBarry Smith   *keyval = 0;
88e5c89e4eSSatish Balay   return MPI_SUCCESS;
89e5c89e4eSSatish Balay }
90e5c89e4eSSatish Balay 
91c8217ed5SSatish Balay int MPI_Attr_put(MPI_Comm comm,int keyval,void *attribute_val)
92e5c89e4eSSatish Balay {
93100f28aeSBarry Smith   if (comm-1 < 0 || comm-1 > 3) return 1;
94100f28aeSBarry Smith   attr[comm-1][keyval].active        = 1;
95100f28aeSBarry Smith   attr[comm-1][keyval].attribute_val = attribute_val;
96e5c89e4eSSatish Balay   return MPI_SUCCESS;
97e5c89e4eSSatish Balay }
98e5c89e4eSSatish Balay 
99c8217ed5SSatish Balay int MPI_Attr_delete(MPI_Comm comm,int keyval)
100e5c89e4eSSatish Balay {
101100f28aeSBarry Smith   if (comm-1 < 0 || comm-1 > 3) return 1;
102100f28aeSBarry Smith   if (attr[comm-1][keyval].active && attr_keyval[keyval].del) {
103100f28aeSBarry Smith     void *save_attribute_val = attr[comm-1][keyval].attribute_val;
104100f28aeSBarry Smith     attr[comm-1][keyval].active        = 0;
105100f28aeSBarry Smith     attr[comm-1][keyval].attribute_val = 0;
10646651e72SBarry Smith     (*(attr_keyval[keyval].del))(comm,keyval,save_attribute_val,attr_keyval[keyval].extra_state);
10740776e1bSpetsc   }
108e5c89e4eSSatish Balay   return MPI_SUCCESS;
109e5c89e4eSSatish Balay }
110e5c89e4eSSatish Balay 
111c8217ed5SSatish Balay int MPI_Attr_get(MPI_Comm comm,int keyval,void *attribute_val,int *flag)
112e5c89e4eSSatish Balay {
113100f28aeSBarry Smith   if (comm-1 < 0 || comm-1 > 3) return 1;
114e5c89e4eSSatish Balay   if (!keyval) Keyval_setup();
115100f28aeSBarry Smith   *flag                  = attr[comm-1][keyval].active;
116100f28aeSBarry Smith   *(void**)attribute_val = attr[comm-1][keyval].attribute_val;
117e5c89e4eSSatish Balay   return MPI_SUCCESS;
118e5c89e4eSSatish Balay }
119e5c89e4eSSatish Balay 
120100f28aeSBarry Smith static int dups[4] = {1,1,1,1};
121c8217ed5SSatish Balay int MPI_Comm_create(MPI_Comm comm,MPI_Group group,MPI_Comm *newcomm)
122c8217ed5SSatish Balay {
123100f28aeSBarry Smith   if (comm-1 < 0 || comm-1 > 3) return 1;
124100f28aeSBarry Smith   dups[comm-1]++;
125c8217ed5SSatish Balay   *newcomm =  comm;
126c8217ed5SSatish Balay   return MPI_SUCCESS;
127c8217ed5SSatish Balay }
128c8217ed5SSatish Balay 
129c8217ed5SSatish Balay int MPI_Comm_dup(MPI_Comm comm,MPI_Comm *out)
130e5c89e4eSSatish Balay {
131100f28aeSBarry Smith   if (comm-1 < 0 || comm-1 > 3) return 1;
132a297a907SKarl Rupp   if (comm == MPI_COMM_WORLD || comm == MPI_COMM_SELF) *out = comm + 2;
133a297a907SKarl Rupp   else {
134e5c89e4eSSatish Balay     *out = comm;
135100f28aeSBarry Smith     dups[comm-1]++;
136100f28aeSBarry Smith   }
137e5c89e4eSSatish Balay   return 0;
138e5c89e4eSSatish Balay }
139e5c89e4eSSatish Balay 
140c8217ed5SSatish Balay int MPI_Comm_free(MPI_Comm *comm)
141e5c89e4eSSatish Balay {
142e5c89e4eSSatish Balay   int i;
143e5c89e4eSSatish Balay 
144100f28aeSBarry Smith   if (*comm-1 < 0 || *comm-1 > 3) return 1;
145c5b75c40SBarry Smith   if (dups[*comm-1] == 1) {
146e5c89e4eSSatish Balay     for (i=0; i<num_attr; i++) {
147a297a907SKarl 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);
148100f28aeSBarry Smith       attr[*comm-1][i].active        = 0;
149a246e310SBarry Smith       attr[*comm-1][i].attribute_val = 0;
150e5c89e4eSSatish Balay     }
151c5b75c40SBarry Smith     dups[*comm-1] = 1;
152100f28aeSBarry Smith     *comm = 0;
153c5b75c40SBarry Smith   } else if (dups[*comm-1] > 1) dups[*comm-1]--;
154e5c89e4eSSatish Balay   return MPI_SUCCESS;
155e5c89e4eSSatish Balay }
156e5c89e4eSSatish Balay 
157d393f697SSatish Balay int MPI_Comm_size(MPI_Comm comm, int *size)
158d393f697SSatish Balay {
159d393f697SSatish Balay   *size=1;
160d393f697SSatish Balay   return MPI_SUCCESS;
161d393f697SSatish Balay }
162d393f697SSatish Balay 
163d393f697SSatish Balay int MPI_Comm_rank(MPI_Comm comm, int *rank)
164d393f697SSatish Balay {
165d393f697SSatish Balay   *rank=0;
166d393f697SSatish Balay   return MPI_SUCCESS;
167d393f697SSatish Balay }
168d393f697SSatish Balay 
169c8217ed5SSatish Balay int MPI_Abort(MPI_Comm comm,int errorcode)
170e5c89e4eSSatish Balay {
171e5c89e4eSSatish Balay   abort();
172e5c89e4eSSatish Balay   return MPI_SUCCESS;
173e5c89e4eSSatish Balay }
174e5c89e4eSSatish Balay 
17558cd72c3SLisandro Dalcin /* --------------------------------------------------------------------------*/
17658cd72c3SLisandro Dalcin 
177e5c89e4eSSatish Balay static int MPI_was_initialized = 0;
17858cd72c3SLisandro Dalcin static int MPI_was_finalized   = 0;
17958cd72c3SLisandro Dalcin 
180c8217ed5SSatish Balay int MPI_Init(int *argc, char ***argv)
18158cd72c3SLisandro Dalcin {
1828f059c70SLisandro Dalcin   if (MPI_was_initialized) return 1;
1838f059c70SLisandro Dalcin   if (MPI_was_finalized) return 1;
18458cd72c3SLisandro Dalcin   MPI_was_initialized = 1;
18558cd72c3SLisandro Dalcin   return 0;
18658cd72c3SLisandro Dalcin }
18758cd72c3SLisandro Dalcin 
188c8217ed5SSatish Balay int MPI_Finalize(void)
18958cd72c3SLisandro Dalcin {
190100f28aeSBarry Smith   MPI_Comm comm;
1918f059c70SLisandro Dalcin   if (MPI_was_finalized) return 1;
1928f059c70SLisandro Dalcin   if (!MPI_was_initialized) return 1;
193100f28aeSBarry Smith   comm = MPI_COMM_WORLD;
194100f28aeSBarry Smith   MPI_Comm_free(&comm);
195100f28aeSBarry Smith   comm = MPI_COMM_SELF;
196100f28aeSBarry Smith   MPI_Comm_free(&comm);
19758cd72c3SLisandro Dalcin   MPI_was_finalized = 1;
19858cd72c3SLisandro Dalcin   return 0;
19958cd72c3SLisandro Dalcin }
200e5c89e4eSSatish Balay 
201c8217ed5SSatish Balay int MPI_Initialized(int *flag)
202e5c89e4eSSatish Balay {
203e5c89e4eSSatish Balay   *flag = MPI_was_initialized;
204e5c89e4eSSatish Balay   return 0;
205e5c89e4eSSatish Balay }
206e5c89e4eSSatish Balay 
207c8217ed5SSatish Balay int MPI_Finalized(int *flag)
208e5c89e4eSSatish Balay {
20958cd72c3SLisandro Dalcin   *flag = MPI_was_finalized;
210e5c89e4eSSatish Balay   return 0;
211e5c89e4eSSatish Balay }
212e5c89e4eSSatish Balay 
213e5c89e4eSSatish Balay /* -------------------     Fortran versions of several routines ------------------ */
214e5c89e4eSSatish Balay 
215f7c6e6aaSSatish Balay #if defined(PETSC_HAVE_FORTRAN_CAPS)
216f7c6e6aaSSatish Balay #define mpi_init_             MPI_INIT
217f7c6e6aaSSatish Balay #define mpi_finalize_         MPI_FINALIZE
218f7c6e6aaSSatish Balay #define mpi_comm_size_        MPI_COMM_SIZE
219f7c6e6aaSSatish Balay #define mpi_comm_rank_        MPI_COMM_RANK
220f7c6e6aaSSatish Balay #define mpi_abort_            MPI_ABORT
2213b644628SSatish Balay #define mpi_reduce_           MPI_REDUCE
222f7c6e6aaSSatish Balay #define mpi_allreduce_        MPI_ALLREDUCE
223f7c6e6aaSSatish Balay #define mpi_barrier_          MPI_BARRIER
224f7c6e6aaSSatish Balay #define mpi_bcast_            MPI_BCAST
225f7c6e6aaSSatish Balay #define mpi_gather_           MPI_GATHER
226f7c6e6aaSSatish Balay #define mpi_allgather_        MPI_ALLGATHER
22704ab3e84SSatish Balay #define mpi_comm_split_       MPI_COMM_SPLIT
2283b644628SSatish Balay #define mpi_scan_             MPI_SCAN
2291086b069SSatish Balay #define mpi_send_             MPI_SEND
2301086b069SSatish Balay #define mpi_recv_             MPI_RECV
231156bc490SSatish Balay #define mpi_reduce_scatter_   MPI_REDUCE_SCATTER
232156bc490SSatish Balay #define mpi_irecv_            MPI_IRECV
233156bc490SSatish Balay #define mpi_isend_            MPI_ISEND
234156bc490SSatish Balay #define mpi_sendrecv_         MPI_SENDRECV
235156bc490SSatish Balay #define mpi_test_             MPI_TEST
236156bc490SSatish Balay #define mpi_waitall_          MPI_WAITALL
237156bc490SSatish Balay #define mpi_waitany_          MPI_WAITANY
238156bc490SSatish Balay #define mpi_allgatherv_       MPI_ALLGATHERV
239156bc490SSatish Balay #define mpi_alltoallv_        MPI_ALLTOALLV
240156bc490SSatish Balay #define mpi_comm_create_      MPI_COMM_CREATE
241156bc490SSatish Balay #define mpi_address_          MPI_ADDRESS
242156bc490SSatish Balay #define mpi_pack_             MPI_PACK
243156bc490SSatish Balay #define mpi_unpack_           MPI_UNPACK
244156bc490SSatish Balay #define mpi_pack_size_        MPI_PACK_SIZE
245156bc490SSatish Balay #define mpi_type_struct_      MPI_TYPE_STRUCT
246156bc490SSatish Balay #define mpi_type_commit_      MPI_TYPE_COMMIT
247156bc490SSatish Balay #define mpi_wtime_            MPI_WTIME
248f8f52c7dSSatish Balay #define mpi_cancel_           MPI_CANCEL
249f8f52c7dSSatish Balay #define mpi_comm_dup_         MPI_COMM_DUP
250f8f52c7dSSatish Balay #define mpi_comm_free_        MPI_COMM_FREE
251f8f52c7dSSatish Balay #define mpi_get_count_        MPI_GET_COUNT
252f8f52c7dSSatish Balay #define mpi_get_processor_name_ MPI_GET_PROCESSOR_NAME
253f8f52c7dSSatish Balay #define mpi_initialized_      MPI_INITIALIZED
254f8f52c7dSSatish Balay #define mpi_iprobe_           MPI_IPROBE
255f8f52c7dSSatish Balay #define mpi_probe_            MPI_PROBE
256f8f52c7dSSatish Balay #define mpi_request_free_     MPI_REQUEST_FREE
257f8f52c7dSSatish Balay #define mpi_ssend_            MPI_SSEND
258f8f52c7dSSatish Balay #define mpi_wait_             MPI_WAIT
259d4816372SSatish Balay #define mpi_comm_group_       MPI_COMM_GROUP
260d4816372SSatish Balay #define mpi_exscan_           MPI_EXSCAN
261f7c6e6aaSSatish Balay #elif !defined(PETSC_HAVE_FORTRAN_UNDERSCORE)
262f7c6e6aaSSatish Balay #define mpi_init_             mpi_init
263f7c6e6aaSSatish Balay #define mpi_finalize_         mpi_finalize
264f7c6e6aaSSatish Balay #define mpi_comm_size_        mpi_comm_size
265f7c6e6aaSSatish Balay #define mpi_comm_rank_        mpi_comm_rank
266f7c6e6aaSSatish Balay #define mpi_abort_            mpi_abort
2673b644628SSatish Balay #define mpi_reduce_           mpi_reduce
268f7c6e6aaSSatish Balay #define mpi_allreduce_        mpi_allreduce
269f7c6e6aaSSatish Balay #define mpi_barrier_          mpi_barrier
270f7c6e6aaSSatish Balay #define mpi_bcast_            mpi_bcast
271f7c6e6aaSSatish Balay #define mpi_gather_           mpi_gather
272f7c6e6aaSSatish Balay #define mpi_allgather_        mpi_allgather
27304ab3e84SSatish Balay #define mpi_comm_split_       mpi_comm_split
2743b644628SSatish Balay #define mpi_scan_             mpi_scan
2751086b069SSatish Balay #define mpi_send_             mpi_send
2761086b069SSatish Balay #define mpi_recv_             mpi_recv
277156bc490SSatish Balay #define mpi_reduce_scatter_   mpi_reduce_scatter
278156bc490SSatish Balay #define mpi_irecv_            mpi_irecv
279156bc490SSatish Balay #define mpi_isend_            mpi_isend
280156bc490SSatish Balay #define mpi_sendrecv_         mpi_sendrecv
281156bc490SSatish Balay #define mpi_test_             mpi_test
282156bc490SSatish Balay #define mpi_waitall_          mpi_waitall
283156bc490SSatish Balay #define mpi_waitany_          mpi_waitany
284156bc490SSatish Balay #define mpi_allgatherv_       mpi_allgatherv
285156bc490SSatish Balay #define mpi_alltoallv_        mpi_alltoallv
286156bc490SSatish Balay #define mpi_comm_create_      mpi_comm_create
287156bc490SSatish Balay #define mpi_address_          mpi_address
288156bc490SSatish Balay #define mpi_pack_             mpi_pack
289156bc490SSatish Balay #define mpi_unpack_           mpi_unpack
290156bc490SSatish Balay #define mpi_pack_size_        mpi_pack_size
291156bc490SSatish Balay #define mpi_type_struct_      mpi_type_struct
292156bc490SSatish Balay #define mpi_type_commit_      mpi_type_commit
293156bc490SSatish Balay #define mpi_wtime_            mpi_wtime
294f8f52c7dSSatish Balay #define mpi_cancel_           mpi_cancel
295f8f52c7dSSatish Balay #define mpi_comm_dup_         mpi_comm_dup
296f8f52c7dSSatish Balay #define mpi_comm_free_        mpi_comm_free
297f8f52c7dSSatish Balay #define mpi_get_count_        mpi_get_count
298f8f52c7dSSatish Balay #define mpi_get_processor_name_ mpi_get_processor_name
299f8f52c7dSSatish Balay #define mpi_initialized_      mpi_initialized
300f8f52c7dSSatish Balay #define mpi_iprobe_           mpi_iprobe
301f8f52c7dSSatish Balay #define mpi_probe_            mpi_probe
302f8f52c7dSSatish Balay #define mpi_request_free_     mpi_request_free
303f8f52c7dSSatish Balay #define mpi_ssend_            mpi_ssend
304f8f52c7dSSatish Balay #define mpi_wait_             mpi_wait
305d4816372SSatish Balay #define mpi_comm_group_       mpi_comm_group
306d4816372SSatish Balay #define mpi_exscan_           mpi_exscan
307f7c6e6aaSSatish Balay #endif
308e5c89e4eSSatish Balay 
309f7c6e6aaSSatish Balay #if defined(PETSC_HAVE_FORTRAN_UNDERSCORE_UNDERSCORE)
310f7c6e6aaSSatish Balay #define mpi_init_             mpi_init__
311f7c6e6aaSSatish Balay #define mpi_finalize_         mpi_finalize__
312f7c6e6aaSSatish Balay #define mpi_comm_size_        mpi_comm_size__
313f7c6e6aaSSatish Balay #define mpi_comm_rank_        mpi_comm_rank__
314f7c6e6aaSSatish Balay #define mpi_abort_            mpi_abort__
3153b644628SSatish Balay #define mpi_reduce_           mpi_reduce__
316f7c6e6aaSSatish Balay #define mpi_allreduce_        mpi_allreduce__
317f7c6e6aaSSatish Balay #define mpi_barrier_          mpi_barrier__
318f7c6e6aaSSatish Balay #define mpi_bcast_            mpi_bcast__
319f7c6e6aaSSatish Balay #define mpi_gather_           mpi_gather__
320f7c6e6aaSSatish Balay #define mpi_allgather_        mpi_allgather__
32104ab3e84SSatish Balay #define mpi_comm_split_       mpi_comm_split__
32239a9255cSSatish Balay #define mpi_scan_             mpi_scan__
3231086b069SSatish Balay #define mpi_send_             mpi_send__
3241086b069SSatish Balay #define mpi_recv_             mpi_recv__
325156bc490SSatish Balay #define mpi_reduce_scatter_   mpi_reduce_scatter__
326156bc490SSatish Balay #define mpi_irecv_            mpi_irecv__
327156bc490SSatish Balay #define mpi_isend_            mpi_isend__
328156bc490SSatish Balay #define mpi_sendrecv_         mpi_sendrecv__
329156bc490SSatish Balay #define mpi_test_             mpi_test__
330156bc490SSatish Balay #define mpi_waitall_          mpi_waitall__
331156bc490SSatish Balay #define mpi_waitany_          mpi_waitany__
332156bc490SSatish Balay #define mpi_allgatherv_       mpi_allgatherv__
333156bc490SSatish Balay #define mpi_alltoallv_        mpi_alltoallv__
334156bc490SSatish Balay #define mpi_comm_create_      mpi_comm_create__
335156bc490SSatish Balay #define mpi_address_          mpi_address__
336156bc490SSatish Balay #define mpi_pack_             mpi_pack__
337156bc490SSatish Balay #define mpi_unpack_           mpi_unpack__
338156bc490SSatish Balay #define mpi_pack_size_        mpi_pack_size__
339156bc490SSatish Balay #define mpi_type_struct_      mpi_type_struct__
340156bc490SSatish Balay #define mpi_type_commit_      mpi_type_commit__
341156bc490SSatish Balay #define mpi_wtime_            mpi_wtime__
342f8f52c7dSSatish Balay #define mpi_cancel_           mpi_cancel__
343f8f52c7dSSatish Balay #define mpi_comm_dup_         mpi_comm_dup__
344f8f52c7dSSatish Balay #define mpi_comm_free_        mpi_comm_free__
345f8f52c7dSSatish Balay #define mpi_get_count_        mpi_get_count__
346f8f52c7dSSatish Balay #define mpi_get_processor_name_ mpi_get_processor_name__
347f8f52c7dSSatish Balay #define mpi_initialized_      mpi_initialized__
348f8f52c7dSSatish Balay #define mpi_iprobe_           mpi_iprobe__
349f8f52c7dSSatish Balay #define mpi_probe_            mpi_probe__
350f8f52c7dSSatish Balay #define mpi_request_free_     mpi_request_free__
351f8f52c7dSSatish Balay #define mpi_ssend_            mpi_ssend__
352f8f52c7dSSatish Balay #define mpi_wait_             mpi_wait__
35339a9255cSSatish Balay #define mpi_comm_group_       mpi_comm_group__
354d4816372SSatish Balay #define mpi_exscan_           mpi_exscan__
355f7c6e6aaSSatish Balay #endif
356e5c89e4eSSatish Balay 
357c8217ed5SSatish Balay 
358c8217ed5SSatish Balay /* Do not build fortran interface if MPI namespace colision is to be avoided */
359c8217ed5SSatish Balay #if !defined(MPIUNI_AVOID_MPI_NAMESPACE)
360c8217ed5SSatish Balay 
361fa375c27SSatish Balay PETSC_EXTERN void PETSC_STDCALL   mpi_init_(int *ierr)
362e5c89e4eSSatish Balay {
363c8217ed5SSatish Balay   *ierr = MPI_Init((int*)0, (char***)0);
364e5c89e4eSSatish Balay }
365e5c89e4eSSatish Balay 
366fa375c27SSatish Balay PETSC_EXTERN void PETSC_STDCALL   mpi_finalize_(int *ierr)
367e5c89e4eSSatish Balay {
368c8217ed5SSatish Balay   *ierr = MPI_Finalize();
369e5c89e4eSSatish Balay }
370e5c89e4eSSatish Balay 
371fa375c27SSatish Balay PETSC_EXTERN void PETSC_STDCALL  mpi_comm_size_(MPI_Comm *comm,int *size,int *ierr)
372e5c89e4eSSatish Balay {
373e5c89e4eSSatish Balay   *size = 1;
374e5c89e4eSSatish Balay   *ierr = 0;
375e5c89e4eSSatish Balay }
376e5c89e4eSSatish Balay 
377fa375c27SSatish Balay PETSC_EXTERN void PETSC_STDCALL  mpi_comm_rank_(MPI_Comm *comm,int *rank,int *ierr)
378e5c89e4eSSatish Balay {
379e5c89e4eSSatish Balay   *rank=0;
380e5c89e4eSSatish Balay   *ierr=MPI_SUCCESS;
381e5c89e4eSSatish Balay }
382e5c89e4eSSatish Balay 
383fa375c27SSatish Balay PETSC_EXTERN void PETSC_STDCALL  mpi_comm_split_(MPI_Comm *comm,int *color,int *key, MPI_Comm *newcomm, int *ierr)
3841f6cc5b2SSatish Balay {
3851f6cc5b2SSatish Balay   *newcomm = *comm;
3861f6cc5b2SSatish Balay   *ierr    =MPI_SUCCESS;
3871f6cc5b2SSatish Balay }
3881f6cc5b2SSatish Balay 
389fa375c27SSatish Balay PETSC_EXTERN void PETSC_STDCALL  mpi_abort_(MPI_Comm *comm,int *errorcode,int *ierr)
390e5c89e4eSSatish Balay {
391e5c89e4eSSatish Balay   abort();
392e5c89e4eSSatish Balay   *ierr = MPI_SUCCESS;
393e5c89e4eSSatish Balay }
394e5c89e4eSSatish Balay 
395fa375c27SSatish Balay PETSC_EXTERN void PETSC_STDCALL  mpi_reduce_(void *sendbuf,void *recvbuf,int *count,int *datatype,int *op,int *root,int *comm,int *ierr)
3963b644628SSatish Balay {
3971572cfd7SBarry Smith   MPI_Reduce(sendbuf,recvbuf,*count,*datatype,*op,*root,*comm);
3983b644628SSatish Balay   *ierr = MPI_SUCCESS;
3993b644628SSatish Balay }
4003b644628SSatish Balay 
401fa375c27SSatish Balay PETSC_EXTERN void PETSC_STDCALL  mpi_allreduce_(void *sendbuf,void *recvbuf,int *count,int *datatype,int *op,int *comm,int *ierr)
402e5c89e4eSSatish Balay {
4031572cfd7SBarry Smith   MPI_Allreduce(sendbuf,recvbuf,*count,*datatype,*op,*comm);
404e5c89e4eSSatish Balay   *ierr = MPI_SUCCESS;
405e5c89e4eSSatish Balay }
406e5c89e4eSSatish Balay 
407fa375c27SSatish Balay PETSC_EXTERN void PETSC_STDCALL  mpi_barrier_(MPI_Comm *comm,int *ierr)
408e5c89e4eSSatish Balay {
409e5c89e4eSSatish Balay   *ierr = MPI_SUCCESS;
410e5c89e4eSSatish Balay }
411f7c6e6aaSSatish Balay 
412fa375c27SSatish Balay PETSC_EXTERN void PETSC_STDCALL  mpi_bcast_(void *buf,int *count,int *datatype,int *root,int *comm,int *ierr)
413e5c89e4eSSatish Balay {
414e5c89e4eSSatish Balay   *ierr = MPI_SUCCESS;
415e5c89e4eSSatish Balay }
416f7c6e6aaSSatish Balay 
417f7c6e6aaSSatish Balay 
418fa375c27SSatish Balay PETSC_EXTERN void PETSC_STDCALL  mpi_gather_(void *sendbuf,int *scount,int *sdatatype, void *recvbuf, int *rcount, int *rdatatype, int *root,int *comm,int *ierr)
419e5c89e4eSSatish Balay {
4201572cfd7SBarry Smith   MPI_Gather(sendbuf,*scount,*sdatatype,recvbuf,rcount,rdatatype,*root,*comm);
421f7c6e6aaSSatish Balay   *ierr = MPI_SUCCESS;
422f7c6e6aaSSatish Balay }
423f7c6e6aaSSatish Balay 
424fa375c27SSatish Balay PETSC_EXTERN void PETSC_STDCALL  mpi_allgather_(void *sendbuf,int *scount,int *sdatatype, void *recvbuf, int *rcount, int *rdatatype,int *comm,int *ierr)
425f7c6e6aaSSatish Balay {
4261572cfd7SBarry Smith   MPI_Allgather(sendbuf,*scount,*sdatatype,recvbuf,rcount,rdatatype,*comm);
427e5c89e4eSSatish Balay }
428e5c89e4eSSatish Balay 
429fa375c27SSatish Balay PETSC_EXTERN void PETSC_STDCALL  mpi_scan_(void *sendbuf,void *recvbuf,int *count,int *datatype,int *op,int *comm,int *ierr)
4303b644628SSatish Balay {
4313b644628SSatish Balay   MPIUNI_Memcpy(recvbuf,sendbuf,(*count)*MPIUNI_DATASIZE[*datatype]);
4323b644628SSatish Balay   *ierr = MPI_SUCCESS;
4333b644628SSatish Balay }
4343b644628SSatish Balay 
435fa375c27SSatish Balay PETSC_EXTERN void PETSC_STDCALL  mpi_send_(void *buf,int *count,int *datatype,int *dest,int *tag,int *comm,int *ierr)
4361086b069SSatish Balay {
4374423d37eSSatish Balay   *ierr = MPI_Abort(MPI_COMM_WORLD,0);
4381086b069SSatish Balay }
4391086b069SSatish Balay 
440fa375c27SSatish Balay PETSC_EXTERN void PETSC_STDCALL  mpi_recv_(void *buf,int *count,int *datatype,int *source,int *tag,int *comm,int status,int *ierr)
4411086b069SSatish Balay {
4421086b069SSatish Balay   *ierr = MPI_Abort(MPI_COMM_WORLD,0);
4431086b069SSatish Balay }
4441086b069SSatish Balay 
445fa375c27SSatish Balay PETSC_EXTERN void PETSC_STDCALL  mpi_reduce_scatter_(void *sendbuf,void *recvbuf,int *recvcounts,int *datatype,int *op,int *comm,int *ierr)
446156bc490SSatish Balay {
447156bc490SSatish Balay   *ierr = MPI_Abort(MPI_COMM_WORLD,0);
448156bc490SSatish Balay }
449156bc490SSatish Balay 
450fa375c27SSatish Balay PETSC_EXTERN void PETSC_STDCALL  mpi_irecv_(void *buf,int *count, int *datatype, int *source, int *tag, int *comm, int *request, int *ierr)
451156bc490SSatish Balay {
452156bc490SSatish Balay   *ierr = MPI_Abort(MPI_COMM_WORLD,0);
453156bc490SSatish Balay }
454156bc490SSatish Balay 
455fa375c27SSatish Balay PETSC_EXTERN void PETSC_STDCALL  mpi_isend_(void *buf,int *count,int *datatype,int *dest,int *tag,int *comm,int *request, int *ierr)
456156bc490SSatish Balay {
457156bc490SSatish Balay   *ierr = MPI_Abort(MPI_COMM_WORLD,0);
458156bc490SSatish Balay }
459156bc490SSatish Balay 
460fa375c27SSatish Balay PETSC_EXTERN void PETSC_STDCALL  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)
461156bc490SSatish Balay {
462156bc490SSatish Balay   MPIUNI_Memcpy(recvbuf,sendbuf,(*sendcount)*MPIUNI_DATASIZE[*sendtype]);
463156bc490SSatish Balay   *ierr = MPI_SUCCESS;
464156bc490SSatish Balay }
465156bc490SSatish Balay 
466fa375c27SSatish Balay PETSC_EXTERN void PETSC_STDCALL  mpi_test_(int *request,int *flag,int *status,int *ierr)
467156bc490SSatish Balay {
468156bc490SSatish Balay   *ierr = MPI_Abort(MPI_COMM_WORLD,0);
469156bc490SSatish Balay }
470156bc490SSatish Balay 
471fa375c27SSatish Balay PETSC_EXTERN void PETSC_STDCALL  mpi_waitall_(int *count,int *array_of_requests,int *array_of_statuses,int *ierr)
472156bc490SSatish Balay {
473156bc490SSatish Balay   *ierr = MPI_SUCCESS;
474156bc490SSatish Balay }
475156bc490SSatish Balay 
476fa375c27SSatish Balay PETSC_EXTERN void PETSC_STDCALL  mpi_waitany_(int *count,int *array_of_requests,int * index, int *status,int *ierr)
477156bc490SSatish Balay {
478156bc490SSatish Balay   *ierr = MPI_SUCCESS;
479156bc490SSatish Balay }
480156bc490SSatish Balay 
481fa375c27SSatish Balay PETSC_EXTERN void PETSC_STDCALL  mpi_allgatherv_(void *sendbuf,int *sendcount,int *sendtype,void *recvbuf,int *recvcounts,int *displs,int *recvtype,int *comm,int *ierr)
482156bc490SSatish Balay {
4831572cfd7SBarry Smith   MPI_Allgatherv(sendbuf,*sendcount,*sendtype,recvbuf,recvcounts,displs,*recvtype,*comm);
484156bc490SSatish Balay   *ierr = MPI_SUCCESS;
485156bc490SSatish Balay }
486156bc490SSatish Balay 
487fa375c27SSatish Balay PETSC_EXTERN void PETSC_STDCALL  mpi_alltoallv_(void *sendbuf,int *sendcounts,int *sdispls,int *sendtype,void *recvbuf,int *recvcounts,int *rdispls,int *recvtype,int *comm,int *ierr)
488156bc490SSatish Balay {
4891572cfd7SBarry Smith   MPI_Alltoallv(sendbuf,sendcounts,sdispls,*sendtype,recvbuf,recvcounts,rdispls,*recvtype,*comm);
490156bc490SSatish Balay   *ierr = MPI_SUCCESS;
491156bc490SSatish Balay }
492156bc490SSatish Balay 
493fa375c27SSatish Balay PETSC_EXTERN void PETSC_STDCALL  mpi_comm_create_(int *comm,int *group,int *newcomm,int *ierr)
494156bc490SSatish Balay {
495156bc490SSatish Balay   *newcomm =  *comm;
496156bc490SSatish Balay   *ierr    = MPI_SUCCESS;
497156bc490SSatish Balay }
498156bc490SSatish Balay 
499fa375c27SSatish Balay PETSC_EXTERN void PETSC_STDCALL  mpi_address_(void *location,MPIUNI_INTPTR *address,int *ierr)
500156bc490SSatish Balay {
501e87984cdSSatish Balay   *address =  (MPIUNI_INTPTR) location;
502156bc490SSatish Balay   *ierr    = MPI_SUCCESS;
503156bc490SSatish Balay }
504156bc490SSatish Balay 
505fa375c27SSatish Balay PETSC_EXTERN void PETSC_STDCALL  mpi_pack_(void *inbuf,int *incount,int *datatype,void *outbuf,int *outsize,int *position,int *comm,int *ierr)
506156bc490SSatish Balay {
507156bc490SSatish Balay   *ierr = MPI_Abort(MPI_COMM_WORLD,0);
508156bc490SSatish Balay }
509156bc490SSatish Balay 
510fa375c27SSatish Balay PETSC_EXTERN void PETSC_STDCALL  mpi_unpack_(void *inbuf,int *insize,int *position,void *outbuf,int *outcount,int *datatype,int *comm,int *ierr)
511156bc490SSatish Balay {
512156bc490SSatish Balay   *ierr = MPI_Abort(MPI_COMM_WORLD,0);
513156bc490SSatish Balay }
514156bc490SSatish Balay 
515fa375c27SSatish Balay PETSC_EXTERN void PETSC_STDCALL  mpi_pack_size_(int *incount,int *datatype,int *comm,int *size,int *ierr)
516156bc490SSatish Balay {
517156bc490SSatish Balay   *ierr = MPI_Abort(MPI_COMM_WORLD,0);
518156bc490SSatish Balay }
519156bc490SSatish Balay 
520fa375c27SSatish Balay PETSC_EXTERN void PETSC_STDCALL  mpi_type_struct_(int *count,int *array_of_blocklengths,int * array_of_displaments,int *array_of_types,int *newtype,int *ierr)
521156bc490SSatish Balay {
522156bc490SSatish Balay   *ierr = MPI_Abort(MPI_COMM_WORLD,0);
523156bc490SSatish Balay }
524156bc490SSatish Balay 
525fa375c27SSatish Balay PETSC_EXTERN void PETSC_STDCALL  mpi_type_commit_(int *datatype,int *ierr)
526156bc490SSatish Balay {
527156bc490SSatish Balay   *ierr = MPI_SUCCESS;
528156bc490SSatish Balay }
529156bc490SSatish Balay 
530156bc490SSatish Balay double PETSC_STDCALL mpi_wtime_(void)
531156bc490SSatish Balay {
532156bc490SSatish Balay   return 0.0;
533f8f52c7dSSatish Balay }
534156bc490SSatish Balay 
535fa375c27SSatish Balay PETSC_EXTERN void PETSC_STDCALL  mpi_cancel_(int *request,int *ierr)
536f8f52c7dSSatish Balay {
537f8f52c7dSSatish Balay   *ierr = MPI_SUCCESS;
538f8f52c7dSSatish Balay }
539f8f52c7dSSatish Balay 
540fa375c27SSatish Balay PETSC_EXTERN void PETSC_STDCALL  mpi_comm_dup_(int *comm,int *out,int *ierr)
541f8f52c7dSSatish Balay {
542f8f52c7dSSatish Balay   *out  = *comm;
543f8f52c7dSSatish Balay   *ierr = MPI_SUCCESS;
544f8f52c7dSSatish Balay }
545f8f52c7dSSatish Balay 
546fa375c27SSatish Balay PETSC_EXTERN void PETSC_STDCALL  mpi_comm_free_(int *comm,int *ierr)
547f8f52c7dSSatish Balay {
548f8f52c7dSSatish Balay   *ierr = MPI_SUCCESS;
549f8f52c7dSSatish Balay }
550f8f52c7dSSatish Balay 
551fa375c27SSatish Balay PETSC_EXTERN void PETSC_STDCALL  mpi_get_count_(int *status,int *datatype,int *count,int *ierr)
552f8f52c7dSSatish Balay {
553f8f52c7dSSatish Balay   *ierr = MPI_Abort(MPI_COMM_WORLD,0);
554f8f52c7dSSatish Balay }
555f8f52c7dSSatish Balay 
556ce0a2cd1SBarry Smith /* duplicate from fortranimpl.h */
557f8f52c7dSSatish Balay #if defined(PETSC_HAVE_FORTRAN_MIXED_STR_ARG)
558f8f52c7dSSatish Balay #define PETSC_MIXED_LEN(len) ,int len
559f8f52c7dSSatish Balay #define PETSC_END_LEN(len)
560f8f52c7dSSatish Balay #else
561f8f52c7dSSatish Balay #define PETSC_MIXED_LEN(len)
562f8f52c7dSSatish Balay #define PETSC_END_LEN(len)   ,int len
563f8f52c7dSSatish Balay #endif
564f8f52c7dSSatish Balay 
565fa375c27SSatish Balay PETSC_EXTERN void PETSC_STDCALL  mpi_get_processor_name_(char *name PETSC_MIXED_LEN(len),int *result_len,int *ierr PETSC_END_LEN(len))
566f8f52c7dSSatish Balay {
567f8f52c7dSSatish Balay   MPIUNI_Memcpy(name,"localhost",9*sizeof(char));
568f8f52c7dSSatish Balay   *result_len = 9;
569f8f52c7dSSatish Balay   *ierr       = MPI_SUCCESS;
570f8f52c7dSSatish Balay }
571f8f52c7dSSatish Balay 
572fa375c27SSatish Balay PETSC_EXTERN void PETSC_STDCALL  mpi_initialized_(int *flag,int *ierr)
573f8f52c7dSSatish Balay {
574f8f52c7dSSatish Balay   *flag = MPI_was_initialized;
575f8f52c7dSSatish Balay   *ierr = MPI_SUCCESS;
576f8f52c7dSSatish Balay }
577f8f52c7dSSatish Balay 
578fa375c27SSatish Balay PETSC_EXTERN void PETSC_STDCALL  mpi_iprobe_(int *source,int *tag,int *comm,int *glag,int *status,int *ierr)
579f8f52c7dSSatish Balay {
580f8f52c7dSSatish Balay   *ierr = MPI_SUCCESS;
581f8f52c7dSSatish Balay }
582f8f52c7dSSatish Balay 
583fa375c27SSatish Balay PETSC_EXTERN void PETSC_STDCALL  mpi_probe_(int *source,int *tag,int *comm,int *flag,int *status,int *ierr)
584f8f52c7dSSatish Balay {
585f8f52c7dSSatish Balay   *ierr = MPI_SUCCESS;
586f8f52c7dSSatish Balay }
587f8f52c7dSSatish Balay 
588fa375c27SSatish Balay PETSC_EXTERN void PETSC_STDCALL  mpi_request_free_(int *request,int *ierr)
589f8f52c7dSSatish Balay {
590f8f52c7dSSatish Balay   *ierr = MPI_SUCCESS;
591f8f52c7dSSatish Balay }
592f8f52c7dSSatish Balay 
593fa375c27SSatish Balay PETSC_EXTERN void PETSC_STDCALL  mpi_ssend_(void *buf,int *count,int *datatype,int *dest,int *tag,int *comm,int *ierr)
594f8f52c7dSSatish Balay {
595f8f52c7dSSatish Balay   *ierr = MPI_Abort(MPI_COMM_WORLD,0);
596f8f52c7dSSatish Balay }
597f8f52c7dSSatish Balay 
598fa375c27SSatish Balay PETSC_EXTERN void PETSC_STDCALL  mpi_wait_(int *request,int *status,int *ierr)
599f8f52c7dSSatish Balay {
600f8f52c7dSSatish Balay   *ierr = MPI_SUCCESS;
601156bc490SSatish Balay }
602156bc490SSatish Balay 
603fa375c27SSatish Balay PETSC_EXTERN void PETSC_STDCALL  mpi_comm_group_(int *comm,int *group,int *ierr)
604d4816372SSatish Balay {
605d4816372SSatish Balay   *ierr = MPI_SUCCESS;
606d4816372SSatish Balay }
607d4816372SSatish Balay 
608fa375c27SSatish Balay PETSC_EXTERN void PETSC_STDCALL  mpi_exscan_(void *sendbuf,void *recvbuf,int *count,int *datatype,int *op,int *comm,int *ierr)
609d4816372SSatish Balay {
610d4816372SSatish Balay   *ierr = MPI_SUCCESS;
611d4816372SSatish Balay }
612d4816372SSatish Balay 
613c8217ed5SSatish Balay #endif /* MPIUNI_AVOID_MPI_NAMESPACE */
614c8217ed5SSatish Balay 
615e5c89e4eSSatish Balay #if defined(__cplusplus)
616e5c89e4eSSatish Balay }
617e5c89e4eSSatish Balay #endif
618