xref: /petsc/src/sys/mpiuni/mpi.c (revision 1572cfd75d26dd4f4650bf196de168459af12242)
1e5c89e4eSSatish Balay /*
2e5c89e4eSSatish Balay       This provides a few of the MPI-uni functions that cannot be implemented
3e5c89e4eSSatish Balay     with C macros
4e5c89e4eSSatish Balay */
5c6db04a5SJed Brown #include <mpiuni/mpi.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
12fa375c27SSatish Balay #include <petscsys.h>
13e5c89e4eSSatish Balay 
14e5c89e4eSSatish Balay #define MPI_SUCCESS 0
15e5c89e4eSSatish Balay #define MPI_FAILURE 1
16a297a907SKarl Rupp 
17e5c89e4eSSatish Balay void *MPIUNI_TMP         = 0;
18f65d6f8aSSatish 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)};
19e5c89e4eSSatish Balay /*
20100f28aeSBarry Smith        With MPI Uni there are exactly four distinct communicators:
21100f28aeSBarry Smith     MPI_COMM_SELF, MPI_COMM_WORLD, and a MPI_Comm_dup() of each of these (duplicates of duplicates return the same communictor)
22100f28aeSBarry Smith 
23100f28aeSBarry Smith     MPI_COMM_SELF and MPI_COMM_WORLD are MPI_Comm_free() in MPI_Finalize() but in general with PETSc,
24100f28aeSBarry Smith      the other communicators are freed once the last PETSc object is freed (before MPI_Finalize()).
25100f28aeSBarry Smith 
26e5c89e4eSSatish Balay */
27e5c89e4eSSatish Balay #define MAX_ATTR 128
28e5c89e4eSSatish Balay 
29e5c89e4eSSatish Balay typedef struct {
30e5c89e4eSSatish Balay   void *attribute_val;
31e5c89e4eSSatish Balay   int  active;
32e5c89e4eSSatish Balay } MPI_Attr;
33e5c89e4eSSatish Balay 
3446651e72SBarry Smith typedef struct {
3546651e72SBarry Smith   void                *extra_state;
3646651e72SBarry Smith   MPI_Delete_function *del;
3746651e72SBarry Smith } MPI_Attr_keyval;
3846651e72SBarry Smith 
3946651e72SBarry Smith static MPI_Attr_keyval attr_keyval[MAX_ATTR];
40100f28aeSBarry Smith static MPI_Attr        attr[4][MAX_ATTR];
41e5c89e4eSSatish Balay static int             num_attr = 1,mpi_tag_ub = 100000000;
42e5c89e4eSSatish Balay 
43e5c89e4eSSatish Balay #if defined(__cplusplus)
44e5c89e4eSSatish Balay extern "C" {
45e5c89e4eSSatish Balay #endif
46e5c89e4eSSatish Balay 
47e5c89e4eSSatish Balay /*
48e5c89e4eSSatish Balay    To avoid problems with prototypes to the system memcpy() it is duplicated here
49e5c89e4eSSatish Balay */
50a6dfd86eSKarl Rupp int MPIUNI_Memcpy(void *a,const void *b,int n)
51a6dfd86eSKarl Rupp {
52e5c89e4eSSatish Balay   int  i;
53e5c89e4eSSatish Balay   char *aa= (char*)a;
54e5c89e4eSSatish Balay   char *bb= (char*)b;
55e5c89e4eSSatish Balay 
5699839c1eSBarry Smith   if (b == MPI_IN_PLACE) return 0;
57e5c89e4eSSatish Balay   for (i=0; i<n; i++) aa[i] = bb[i];
58e5c89e4eSSatish Balay   return 0;
59e5c89e4eSSatish Balay }
60e5c89e4eSSatish Balay 
61e5c89e4eSSatish Balay /*
62e5c89e4eSSatish Balay    Used to set the built-in MPI_TAG_UB attribute
63e5c89e4eSSatish Balay */
64e5c89e4eSSatish Balay static int Keyval_setup(void)
65e5c89e4eSSatish Balay {
66100f28aeSBarry Smith   attr[MPI_COMM_WORLD-1][0].active        = 1;
67100f28aeSBarry Smith   attr[MPI_COMM_WORLD-1][0].attribute_val = &mpi_tag_ub;
68100f28aeSBarry Smith   attr[MPI_COMM_SELF-1][0].active         = 1;
69100f28aeSBarry Smith   attr[MPI_COMM_SELF-1][0].attribute_val  = &mpi_tag_ub;
70e5c89e4eSSatish Balay   return 0;
71e5c89e4eSSatish Balay }
72e5c89e4eSSatish Balay 
73c8217ed5SSatish Balay int MPI_Keyval_create(MPI_Copy_function *copy_fn,MPI_Delete_function *delete_fn,int *keyval,void *extra_state)
74e5c89e4eSSatish Balay {
75e5c89e4eSSatish Balay   if (num_attr >= MAX_ATTR) MPI_Abort(MPI_COMM_WORLD,1);
76e5c89e4eSSatish Balay 
7746651e72SBarry Smith   attr_keyval[num_attr].extra_state = extra_state;
7846651e72SBarry Smith   attr_keyval[num_attr].del         = delete_fn;
79e5c89e4eSSatish Balay   *keyval                           = num_attr++;
80e5c89e4eSSatish Balay   return 0;
81e5c89e4eSSatish Balay }
82e5c89e4eSSatish Balay 
83c8217ed5SSatish Balay int MPI_Keyval_free(int *keyval)
84e5c89e4eSSatish Balay {
85a246e310SBarry Smith   attr_keyval[*keyval].extra_state = 0;
86a246e310SBarry Smith   attr_keyval[*keyval].del         = 0;
87a297a907SKarl Rupp 
88a246e310SBarry Smith   *keyval = 0;
89e5c89e4eSSatish Balay   return MPI_SUCCESS;
90e5c89e4eSSatish Balay }
91e5c89e4eSSatish Balay 
92c8217ed5SSatish Balay int MPI_Attr_put(MPI_Comm comm,int keyval,void *attribute_val)
93e5c89e4eSSatish Balay {
94100f28aeSBarry Smith   if (comm-1 < 0 || comm-1 > 3) return 1;
95100f28aeSBarry Smith   attr[comm-1][keyval].active        = 1;
96100f28aeSBarry Smith   attr[comm-1][keyval].attribute_val = attribute_val;
97e5c89e4eSSatish Balay   return MPI_SUCCESS;
98e5c89e4eSSatish Balay }
99e5c89e4eSSatish Balay 
100c8217ed5SSatish Balay int MPI_Attr_delete(MPI_Comm comm,int keyval)
101e5c89e4eSSatish Balay {
102100f28aeSBarry Smith   if (comm-1 < 0 || comm-1 > 3) return 1;
103100f28aeSBarry Smith   if (attr[comm-1][keyval].active && attr_keyval[keyval].del) {
104100f28aeSBarry Smith     void *save_attribute_val = attr[comm-1][keyval].attribute_val;
105100f28aeSBarry Smith     attr[comm-1][keyval].active        = 0;
106100f28aeSBarry Smith     attr[comm-1][keyval].attribute_val = 0;
10746651e72SBarry Smith     (*(attr_keyval[keyval].del))(comm,keyval,save_attribute_val,attr_keyval[keyval].extra_state);
10840776e1bSpetsc   }
109e5c89e4eSSatish Balay   return MPI_SUCCESS;
110e5c89e4eSSatish Balay }
111e5c89e4eSSatish Balay 
112c8217ed5SSatish Balay int MPI_Attr_get(MPI_Comm comm,int keyval,void *attribute_val,int *flag)
113e5c89e4eSSatish Balay {
114100f28aeSBarry Smith   if (comm-1 < 0 || comm-1 > 3) return 1;
115e5c89e4eSSatish Balay   if (!keyval) Keyval_setup();
116100f28aeSBarry Smith   *flag                  = attr[comm-1][keyval].active;
117100f28aeSBarry Smith   *(void**)attribute_val = attr[comm-1][keyval].attribute_val;
118e5c89e4eSSatish Balay   return MPI_SUCCESS;
119e5c89e4eSSatish Balay }
120e5c89e4eSSatish Balay 
121100f28aeSBarry Smith static int dups[4] = {1,1,1,1};
122c8217ed5SSatish Balay int MPI_Comm_create(MPI_Comm comm,MPI_Group group,MPI_Comm *newcomm)
123c8217ed5SSatish Balay {
124100f28aeSBarry Smith   if (comm-1 < 0 || comm-1 > 3) return 1;
125100f28aeSBarry Smith   dups[comm-1]++;
126c8217ed5SSatish Balay   *newcomm =  comm;
127c8217ed5SSatish Balay   return MPI_SUCCESS;
128c8217ed5SSatish Balay }
129c8217ed5SSatish Balay 
130c8217ed5SSatish Balay int MPI_Comm_dup(MPI_Comm comm,MPI_Comm *out)
131e5c89e4eSSatish Balay {
132100f28aeSBarry Smith   if (comm-1 < 0 || comm-1 > 3) return 1;
133a297a907SKarl Rupp   if (comm == MPI_COMM_WORLD || comm == MPI_COMM_SELF) *out = comm + 2;
134a297a907SKarl Rupp   else {
135e5c89e4eSSatish Balay     *out = comm;
136100f28aeSBarry Smith     dups[comm-1]++;
137100f28aeSBarry Smith   }
138e5c89e4eSSatish Balay   return 0;
139e5c89e4eSSatish Balay }
140e5c89e4eSSatish Balay 
141c8217ed5SSatish Balay int MPI_Comm_free(MPI_Comm *comm)
142e5c89e4eSSatish Balay {
143e5c89e4eSSatish Balay   int i;
144e5c89e4eSSatish Balay 
145100f28aeSBarry Smith   if (*comm-1 < 0 || *comm-1 > 3) return 1;
146c5b75c40SBarry Smith   if (dups[*comm-1] == 1) {
147e5c89e4eSSatish Balay     for (i=0; i<num_attr; i++) {
148a297a907SKarl 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);
149100f28aeSBarry Smith       attr[*comm-1][i].active        = 0;
150a246e310SBarry Smith       attr[*comm-1][i].attribute_val = 0;
151e5c89e4eSSatish Balay     }
152c5b75c40SBarry Smith     dups[*comm-1] = 1;
153100f28aeSBarry Smith     *comm = 0;
154c5b75c40SBarry Smith   } else if (dups[*comm-1] > 1) dups[*comm-1]--;
155e5c89e4eSSatish Balay   return MPI_SUCCESS;
156e5c89e4eSSatish Balay }
157e5c89e4eSSatish Balay 
158d393f697SSatish Balay int MPI_Comm_size(MPI_Comm comm, int *size)
159d393f697SSatish Balay {
160d393f697SSatish Balay   *size=1;
161d393f697SSatish Balay   return MPI_SUCCESS;
162d393f697SSatish Balay }
163d393f697SSatish Balay 
164d393f697SSatish Balay int MPI_Comm_rank(MPI_Comm comm, int *rank)
165d393f697SSatish Balay {
166d393f697SSatish Balay   *rank=0;
167d393f697SSatish Balay   return MPI_SUCCESS;
168d393f697SSatish Balay }
169d393f697SSatish Balay 
170c8217ed5SSatish Balay int MPI_Abort(MPI_Comm comm,int errorcode)
171e5c89e4eSSatish Balay {
172e5c89e4eSSatish Balay   abort();
173e5c89e4eSSatish Balay   return MPI_SUCCESS;
174e5c89e4eSSatish Balay }
175e5c89e4eSSatish Balay 
17658cd72c3SLisandro Dalcin /* --------------------------------------------------------------------------*/
17758cd72c3SLisandro Dalcin 
178e5c89e4eSSatish Balay static int MPI_was_initialized = 0;
17958cd72c3SLisandro Dalcin static int MPI_was_finalized   = 0;
18058cd72c3SLisandro Dalcin 
181c8217ed5SSatish Balay int MPI_Init(int *argc, char ***argv)
18258cd72c3SLisandro Dalcin {
1838f059c70SLisandro Dalcin   if (MPI_was_initialized) return 1;
1848f059c70SLisandro Dalcin   if (MPI_was_finalized) return 1;
18558cd72c3SLisandro Dalcin   MPI_was_initialized = 1;
18658cd72c3SLisandro Dalcin   return 0;
18758cd72c3SLisandro Dalcin }
18858cd72c3SLisandro Dalcin 
189c8217ed5SSatish Balay int MPI_Finalize(void)
19058cd72c3SLisandro Dalcin {
191100f28aeSBarry Smith   MPI_Comm comm;
1928f059c70SLisandro Dalcin   if (MPI_was_finalized) return 1;
1938f059c70SLisandro Dalcin   if (!MPI_was_initialized) return 1;
194100f28aeSBarry Smith   comm = MPI_COMM_WORLD;
195100f28aeSBarry Smith   MPI_Comm_free(&comm);
196100f28aeSBarry Smith   comm = MPI_COMM_SELF;
197100f28aeSBarry Smith   MPI_Comm_free(&comm);
19858cd72c3SLisandro Dalcin   MPI_was_finalized = 1;
19958cd72c3SLisandro Dalcin   return 0;
20058cd72c3SLisandro Dalcin }
201e5c89e4eSSatish Balay 
202c8217ed5SSatish Balay int MPI_Initialized(int *flag)
203e5c89e4eSSatish Balay {
204e5c89e4eSSatish Balay   *flag = MPI_was_initialized;
205e5c89e4eSSatish Balay   return 0;
206e5c89e4eSSatish Balay }
207e5c89e4eSSatish Balay 
208c8217ed5SSatish Balay int MPI_Finalized(int *flag)
209e5c89e4eSSatish Balay {
21058cd72c3SLisandro Dalcin   *flag = MPI_was_finalized;
211e5c89e4eSSatish Balay   return 0;
212e5c89e4eSSatish Balay }
213e5c89e4eSSatish Balay 
214e5c89e4eSSatish Balay /* -------------------     Fortran versions of several routines ------------------ */
215e5c89e4eSSatish Balay 
216f7c6e6aaSSatish Balay #if defined(PETSC_HAVE_FORTRAN_CAPS)
217f7c6e6aaSSatish Balay #define mpi_init_             MPI_INIT
218f7c6e6aaSSatish Balay #define mpi_finalize_         MPI_FINALIZE
219f7c6e6aaSSatish Balay #define mpi_comm_size_        MPI_COMM_SIZE
220f7c6e6aaSSatish Balay #define mpi_comm_rank_        MPI_COMM_RANK
221f7c6e6aaSSatish Balay #define mpi_abort_            MPI_ABORT
2223b644628SSatish Balay #define mpi_reduce_           MPI_REDUCE
223f7c6e6aaSSatish Balay #define mpi_allreduce_        MPI_ALLREDUCE
224f7c6e6aaSSatish Balay #define mpi_barrier_          MPI_BARRIER
225f7c6e6aaSSatish Balay #define mpi_bcast_            MPI_BCAST
226f7c6e6aaSSatish Balay #define mpi_gather_           MPI_GATHER
227f7c6e6aaSSatish Balay #define mpi_allgather_        MPI_ALLGATHER
22804ab3e84SSatish Balay #define mpi_comm_split_       MPI_COMM_SPLIT
2293b644628SSatish Balay #define mpi_scan_             MPI_SCAN
2301086b069SSatish Balay #define mpi_send_             MPI_SEND
2311086b069SSatish Balay #define mpi_recv_             MPI_RECV
232156bc490SSatish Balay #define mpi_reduce_scatter_   MPI_REDUCE_SCATTER
233156bc490SSatish Balay #define mpi_irecv_            MPI_IRECV
234156bc490SSatish Balay #define mpi_isend_            MPI_ISEND
235156bc490SSatish Balay #define mpi_sendrecv_         MPI_SENDRECV
236156bc490SSatish Balay #define mpi_test_             MPI_TEST
237156bc490SSatish Balay #define mpi_waitall_          MPI_WAITALL
238156bc490SSatish Balay #define mpi_waitany_          MPI_WAITANY
239156bc490SSatish Balay #define mpi_allgatherv_       MPI_ALLGATHERV
240156bc490SSatish Balay #define mpi_alltoallv_        MPI_ALLTOALLV
241156bc490SSatish Balay #define mpi_comm_create_      MPI_COMM_CREATE
242156bc490SSatish Balay #define mpi_address_          MPI_ADDRESS
243156bc490SSatish Balay #define mpi_pack_             MPI_PACK
244156bc490SSatish Balay #define mpi_unpack_           MPI_UNPACK
245156bc490SSatish Balay #define mpi_pack_size_        MPI_PACK_SIZE
246156bc490SSatish Balay #define mpi_type_struct_      MPI_TYPE_STRUCT
247156bc490SSatish Balay #define mpi_type_commit_      MPI_TYPE_COMMIT
248156bc490SSatish Balay #define mpi_wtime_            MPI_WTIME
249f8f52c7dSSatish Balay #define mpi_cancel_           MPI_CANCEL
250f8f52c7dSSatish Balay #define mpi_comm_dup_         MPI_COMM_DUP
251f8f52c7dSSatish Balay #define mpi_comm_free_        MPI_COMM_FREE
252f8f52c7dSSatish Balay #define mpi_get_count_        MPI_GET_COUNT
253f8f52c7dSSatish Balay #define mpi_get_processor_name_ MPI_GET_PROCESSOR_NAME
254f8f52c7dSSatish Balay #define mpi_initialized_      MPI_INITIALIZED
255f8f52c7dSSatish Balay #define mpi_iprobe_           MPI_IPROBE
256f8f52c7dSSatish Balay #define mpi_probe_            MPI_PROBE
257f8f52c7dSSatish Balay #define mpi_request_free_     MPI_REQUEST_FREE
258f8f52c7dSSatish Balay #define mpi_ssend_            MPI_SSEND
259f8f52c7dSSatish Balay #define mpi_wait_             MPI_WAIT
260d4816372SSatish Balay #define mpi_comm_group_       MPI_COMM_GROUP
261d4816372SSatish Balay #define mpi_exscan_           MPI_EXSCAN
262f7c6e6aaSSatish Balay #elif !defined(PETSC_HAVE_FORTRAN_UNDERSCORE)
263f7c6e6aaSSatish Balay #define mpi_init_             mpi_init
264f7c6e6aaSSatish Balay #define mpi_finalize_         mpi_finalize
265f7c6e6aaSSatish Balay #define mpi_comm_size_        mpi_comm_size
266f7c6e6aaSSatish Balay #define mpi_comm_rank_        mpi_comm_rank
267f7c6e6aaSSatish Balay #define mpi_abort_            mpi_abort
2683b644628SSatish Balay #define mpi_reduce_           mpi_reduce
269f7c6e6aaSSatish Balay #define mpi_allreduce_        mpi_allreduce
270f7c6e6aaSSatish Balay #define mpi_barrier_          mpi_barrier
271f7c6e6aaSSatish Balay #define mpi_bcast_            mpi_bcast
272f7c6e6aaSSatish Balay #define mpi_gather_           mpi_gather
273f7c6e6aaSSatish Balay #define mpi_allgather_        mpi_allgather
27404ab3e84SSatish Balay #define mpi_comm_split_       mpi_comm_split
2753b644628SSatish Balay #define mpi_scan_             mpi_scan
2761086b069SSatish Balay #define mpi_send_             mpi_send
2771086b069SSatish Balay #define mpi_recv_             mpi_recv
278156bc490SSatish Balay #define mpi_reduce_scatter_   mpi_reduce_scatter
279156bc490SSatish Balay #define mpi_irecv_            mpi_irecv
280156bc490SSatish Balay #define mpi_isend_            mpi_isend
281156bc490SSatish Balay #define mpi_sendrecv_         mpi_sendrecv
282156bc490SSatish Balay #define mpi_test_             mpi_test
283156bc490SSatish Balay #define mpi_waitall_          mpi_waitall
284156bc490SSatish Balay #define mpi_waitany_          mpi_waitany
285156bc490SSatish Balay #define mpi_allgatherv_       mpi_allgatherv
286156bc490SSatish Balay #define mpi_alltoallv_        mpi_alltoallv
287156bc490SSatish Balay #define mpi_comm_create_      mpi_comm_create
288156bc490SSatish Balay #define mpi_address_          mpi_address
289156bc490SSatish Balay #define mpi_pack_             mpi_pack
290156bc490SSatish Balay #define mpi_unpack_           mpi_unpack
291156bc490SSatish Balay #define mpi_pack_size_        mpi_pack_size
292156bc490SSatish Balay #define mpi_type_struct_      mpi_type_struct
293156bc490SSatish Balay #define mpi_type_commit_      mpi_type_commit
294156bc490SSatish Balay #define mpi_wtime_            mpi_wtime
295f8f52c7dSSatish Balay #define mpi_cancel_           mpi_cancel
296f8f52c7dSSatish Balay #define mpi_comm_dup_         mpi_comm_dup
297f8f52c7dSSatish Balay #define mpi_comm_free_        mpi_comm_free
298f8f52c7dSSatish Balay #define mpi_get_count_        mpi_get_count
299f8f52c7dSSatish Balay #define mpi_get_processor_name_ mpi_get_processor_name
300f8f52c7dSSatish Balay #define mpi_initialized_      mpi_initialized
301f8f52c7dSSatish Balay #define mpi_iprobe_           mpi_iprobe
302f8f52c7dSSatish Balay #define mpi_probe_            mpi_probe
303f8f52c7dSSatish Balay #define mpi_request_free_     mpi_request_free
304f8f52c7dSSatish Balay #define mpi_ssend_            mpi_ssend
305f8f52c7dSSatish Balay #define mpi_wait_             mpi_wait
306d4816372SSatish Balay #define mpi_comm_group_       mpi_comm_group
307d4816372SSatish Balay #define mpi_exscan_           mpi_exscan
308f7c6e6aaSSatish Balay #endif
309e5c89e4eSSatish Balay 
310f7c6e6aaSSatish Balay #if defined(PETSC_HAVE_FORTRAN_UNDERSCORE_UNDERSCORE)
311f7c6e6aaSSatish Balay #define mpi_init_             mpi_init__
312f7c6e6aaSSatish Balay #define mpi_finalize_         mpi_finalize__
313f7c6e6aaSSatish Balay #define mpi_comm_size_        mpi_comm_size__
314f7c6e6aaSSatish Balay #define mpi_comm_rank_        mpi_comm_rank__
315f7c6e6aaSSatish Balay #define mpi_abort_            mpi_abort__
3163b644628SSatish Balay #define mpi_reduce_           mpi_reduce__
317f7c6e6aaSSatish Balay #define mpi_allreduce_        mpi_allreduce__
318f7c6e6aaSSatish Balay #define mpi_barrier_          mpi_barrier__
319f7c6e6aaSSatish Balay #define mpi_bcast_            mpi_bcast__
320f7c6e6aaSSatish Balay #define mpi_gather_           mpi_gather__
321f7c6e6aaSSatish Balay #define mpi_allgather_        mpi_allgather__
32204ab3e84SSatish Balay #define mpi_comm_split_       mpi_comm_split__
32339a9255cSSatish Balay #define mpi_scan_             mpi_scan__
3241086b069SSatish Balay #define mpi_send_             mpi_send__
3251086b069SSatish Balay #define mpi_recv_             mpi_recv__
326156bc490SSatish Balay #define mpi_reduce_scatter_   mpi_reduce_scatter__
327156bc490SSatish Balay #define mpi_irecv_            mpi_irecv__
328156bc490SSatish Balay #define mpi_isend_            mpi_isend__
329156bc490SSatish Balay #define mpi_sendrecv_         mpi_sendrecv__
330156bc490SSatish Balay #define mpi_test_             mpi_test__
331156bc490SSatish Balay #define mpi_waitall_          mpi_waitall__
332156bc490SSatish Balay #define mpi_waitany_          mpi_waitany__
333156bc490SSatish Balay #define mpi_allgatherv_       mpi_allgatherv__
334156bc490SSatish Balay #define mpi_alltoallv_        mpi_alltoallv__
335156bc490SSatish Balay #define mpi_comm_create_      mpi_comm_create__
336156bc490SSatish Balay #define mpi_address_          mpi_address__
337156bc490SSatish Balay #define mpi_pack_             mpi_pack__
338156bc490SSatish Balay #define mpi_unpack_           mpi_unpack__
339156bc490SSatish Balay #define mpi_pack_size_        mpi_pack_size__
340156bc490SSatish Balay #define mpi_type_struct_      mpi_type_struct__
341156bc490SSatish Balay #define mpi_type_commit_      mpi_type_commit__
342156bc490SSatish Balay #define mpi_wtime_            mpi_wtime__
343f8f52c7dSSatish Balay #define mpi_cancel_           mpi_cancel__
344f8f52c7dSSatish Balay #define mpi_comm_dup_         mpi_comm_dup__
345f8f52c7dSSatish Balay #define mpi_comm_free_        mpi_comm_free__
346f8f52c7dSSatish Balay #define mpi_get_count_        mpi_get_count__
347f8f52c7dSSatish Balay #define mpi_get_processor_name_ mpi_get_processor_name__
348f8f52c7dSSatish Balay #define mpi_initialized_      mpi_initialized__
349f8f52c7dSSatish Balay #define mpi_iprobe_           mpi_iprobe__
350f8f52c7dSSatish Balay #define mpi_probe_            mpi_probe__
351f8f52c7dSSatish Balay #define mpi_request_free_     mpi_request_free__
352f8f52c7dSSatish Balay #define mpi_ssend_            mpi_ssend__
353f8f52c7dSSatish Balay #define mpi_wait_             mpi_wait__
35439a9255cSSatish Balay #define mpi_comm_group_       mpi_comm_group__
355d4816372SSatish Balay #define mpi_exscan_           mpi_exscan__
356f7c6e6aaSSatish Balay #endif
357e5c89e4eSSatish Balay 
358c8217ed5SSatish Balay 
359c8217ed5SSatish Balay /* Do not build fortran interface if MPI namespace colision is to be avoided */
360c8217ed5SSatish Balay #if !defined(MPIUNI_AVOID_MPI_NAMESPACE)
361c8217ed5SSatish Balay 
362fa375c27SSatish Balay PETSC_EXTERN void PETSC_STDCALL   mpi_init_(int *ierr)
363e5c89e4eSSatish Balay {
364c8217ed5SSatish Balay   *ierr = MPI_Init((int*)0, (char***)0);
365e5c89e4eSSatish Balay }
366e5c89e4eSSatish Balay 
367fa375c27SSatish Balay PETSC_EXTERN void PETSC_STDCALL   mpi_finalize_(int *ierr)
368e5c89e4eSSatish Balay {
369c8217ed5SSatish Balay   *ierr = MPI_Finalize();
370e5c89e4eSSatish Balay }
371e5c89e4eSSatish Balay 
372fa375c27SSatish Balay PETSC_EXTERN void PETSC_STDCALL  mpi_comm_size_(MPI_Comm *comm,int *size,int *ierr)
373e5c89e4eSSatish Balay {
374e5c89e4eSSatish Balay   *size = 1;
375e5c89e4eSSatish Balay   *ierr = 0;
376e5c89e4eSSatish Balay }
377e5c89e4eSSatish Balay 
378fa375c27SSatish Balay PETSC_EXTERN void PETSC_STDCALL  mpi_comm_rank_(MPI_Comm *comm,int *rank,int *ierr)
379e5c89e4eSSatish Balay {
380e5c89e4eSSatish Balay   *rank=0;
381e5c89e4eSSatish Balay   *ierr=MPI_SUCCESS;
382e5c89e4eSSatish Balay }
383e5c89e4eSSatish Balay 
384fa375c27SSatish Balay PETSC_EXTERN void PETSC_STDCALL  mpi_comm_split_(MPI_Comm *comm,int *color,int *key, MPI_Comm *newcomm, int *ierr)
3851f6cc5b2SSatish Balay {
3861f6cc5b2SSatish Balay   *newcomm = *comm;
3871f6cc5b2SSatish Balay   *ierr    =MPI_SUCCESS;
3881f6cc5b2SSatish Balay }
3891f6cc5b2SSatish Balay 
390fa375c27SSatish Balay PETSC_EXTERN void PETSC_STDCALL  mpi_abort_(MPI_Comm *comm,int *errorcode,int *ierr)
391e5c89e4eSSatish Balay {
392e5c89e4eSSatish Balay   abort();
393e5c89e4eSSatish Balay   *ierr = MPI_SUCCESS;
394e5c89e4eSSatish Balay }
395e5c89e4eSSatish Balay 
396fa375c27SSatish Balay PETSC_EXTERN void PETSC_STDCALL  mpi_reduce_(void *sendbuf,void *recvbuf,int *count,int *datatype,int *op,int *root,int *comm,int *ierr)
3973b644628SSatish Balay {
398*1572cfd7SBarry Smith   MPI_Reduce(sendbuf,recvbuf,*count,*datatype,*op,*root,*comm);
3993b644628SSatish Balay   *ierr = MPI_SUCCESS;
4003b644628SSatish Balay }
4013b644628SSatish Balay 
402fa375c27SSatish Balay PETSC_EXTERN void PETSC_STDCALL  mpi_allreduce_(void *sendbuf,void *recvbuf,int *count,int *datatype,int *op,int *comm,int *ierr)
403e5c89e4eSSatish Balay {
404*1572cfd7SBarry Smith   MPI_Allreduce(sendbuf,recvbuf,*count,*datatype,*op,*comm);
405e5c89e4eSSatish Balay   *ierr = MPI_SUCCESS;
406e5c89e4eSSatish Balay }
407e5c89e4eSSatish Balay 
408fa375c27SSatish Balay PETSC_EXTERN void PETSC_STDCALL  mpi_barrier_(MPI_Comm *comm,int *ierr)
409e5c89e4eSSatish Balay {
410e5c89e4eSSatish Balay   *ierr = MPI_SUCCESS;
411e5c89e4eSSatish Balay }
412f7c6e6aaSSatish Balay 
413fa375c27SSatish Balay PETSC_EXTERN void PETSC_STDCALL  mpi_bcast_(void *buf,int *count,int *datatype,int *root,int *comm,int *ierr)
414e5c89e4eSSatish Balay {
415e5c89e4eSSatish Balay   *ierr = MPI_SUCCESS;
416e5c89e4eSSatish Balay }
417f7c6e6aaSSatish Balay 
418f7c6e6aaSSatish Balay 
419fa375c27SSatish 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)
420e5c89e4eSSatish Balay {
421*1572cfd7SBarry Smith   MPI_Gather(sendbuf,*scount,*sdatatype,recvbuf,rcount,rdatatype,*root,*comm);
422f7c6e6aaSSatish Balay   *ierr = MPI_SUCCESS;
423f7c6e6aaSSatish Balay }
424f7c6e6aaSSatish Balay 
425fa375c27SSatish Balay PETSC_EXTERN void PETSC_STDCALL  mpi_allgather_(void *sendbuf,int *scount,int *sdatatype, void *recvbuf, int *rcount, int *rdatatype,int *comm,int *ierr)
426f7c6e6aaSSatish Balay {
427*1572cfd7SBarry Smith   MPI_Allgather(sendbuf,*scount,*sdatatype,recvbuf,rcount,rdatatype,*comm);
428e5c89e4eSSatish Balay }
429e5c89e4eSSatish Balay 
430fa375c27SSatish Balay PETSC_EXTERN void PETSC_STDCALL  mpi_scan_(void *sendbuf,void *recvbuf,int *count,int *datatype,int *op,int *comm,int *ierr)
4313b644628SSatish Balay {
4323b644628SSatish Balay   MPIUNI_Memcpy(recvbuf,sendbuf,(*count)*MPIUNI_DATASIZE[*datatype]);
4333b644628SSatish Balay   *ierr = MPI_SUCCESS;
4343b644628SSatish Balay }
4353b644628SSatish Balay 
436fa375c27SSatish Balay PETSC_EXTERN void PETSC_STDCALL  mpi_send_(void *buf,int *count,int *datatype,int *dest,int *tag,int *comm,int *ierr)
4371086b069SSatish Balay {
4384423d37eSSatish Balay   *ierr = MPI_Abort(MPI_COMM_WORLD,0);
4391086b069SSatish Balay }
4401086b069SSatish Balay 
441fa375c27SSatish Balay PETSC_EXTERN void PETSC_STDCALL  mpi_recv_(void *buf,int *count,int *datatype,int *source,int *tag,int *comm,int status,int *ierr)
4421086b069SSatish Balay {
4431086b069SSatish Balay   *ierr = MPI_Abort(MPI_COMM_WORLD,0);
4441086b069SSatish Balay }
4451086b069SSatish Balay 
446fa375c27SSatish Balay PETSC_EXTERN void PETSC_STDCALL  mpi_reduce_scatter_(void *sendbuf,void *recvbuf,int *recvcounts,int *datatype,int *op,int *comm,int *ierr)
447156bc490SSatish Balay {
448156bc490SSatish Balay   *ierr = MPI_Abort(MPI_COMM_WORLD,0);
449156bc490SSatish Balay }
450156bc490SSatish Balay 
451fa375c27SSatish Balay PETSC_EXTERN void PETSC_STDCALL  mpi_irecv_(void *buf,int *count, int *datatype, int *source, int *tag, int *comm, int *request, int *ierr)
452156bc490SSatish Balay {
453156bc490SSatish Balay   *ierr = MPI_Abort(MPI_COMM_WORLD,0);
454156bc490SSatish Balay }
455156bc490SSatish Balay 
456fa375c27SSatish Balay PETSC_EXTERN void PETSC_STDCALL  mpi_isend_(void *buf,int *count,int *datatype,int *dest,int *tag,int *comm,int *request, int *ierr)
457156bc490SSatish Balay {
458156bc490SSatish Balay   *ierr = MPI_Abort(MPI_COMM_WORLD,0);
459156bc490SSatish Balay }
460156bc490SSatish Balay 
461fa375c27SSatish 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)
462156bc490SSatish Balay {
463156bc490SSatish Balay   MPIUNI_Memcpy(recvbuf,sendbuf,(*sendcount)*MPIUNI_DATASIZE[*sendtype]);
464156bc490SSatish Balay   *ierr = MPI_SUCCESS;
465156bc490SSatish Balay }
466156bc490SSatish Balay 
467fa375c27SSatish Balay PETSC_EXTERN void PETSC_STDCALL  mpi_test_(int *request,int *flag,int *status,int *ierr)
468156bc490SSatish Balay {
469156bc490SSatish Balay   *ierr = MPI_Abort(MPI_COMM_WORLD,0);
470156bc490SSatish Balay }
471156bc490SSatish Balay 
472fa375c27SSatish Balay PETSC_EXTERN void PETSC_STDCALL  mpi_waitall_(int *count,int *array_of_requests,int *array_of_statuses,int *ierr)
473156bc490SSatish Balay {
474156bc490SSatish Balay   *ierr = MPI_SUCCESS;
475156bc490SSatish Balay }
476156bc490SSatish Balay 
477fa375c27SSatish Balay PETSC_EXTERN void PETSC_STDCALL  mpi_waitany_(int *count,int *array_of_requests,int * index, int *status,int *ierr)
478156bc490SSatish Balay {
479156bc490SSatish Balay   *ierr = MPI_SUCCESS;
480156bc490SSatish Balay }
481156bc490SSatish Balay 
482fa375c27SSatish 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)
483156bc490SSatish Balay {
484*1572cfd7SBarry Smith   MPI_Allgatherv(sendbuf,*sendcount,*sendtype,recvbuf,recvcounts,displs,*recvtype,*comm);
485156bc490SSatish Balay   *ierr = MPI_SUCCESS;
486156bc490SSatish Balay }
487156bc490SSatish Balay 
488fa375c27SSatish 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)
489156bc490SSatish Balay {
490*1572cfd7SBarry Smith   MPI_Alltoallv(sendbuf,sendcounts,sdispls,*sendtype,recvbuf,recvcounts,rdispls,*recvtype,*comm);
491156bc490SSatish Balay   *ierr = MPI_SUCCESS;
492156bc490SSatish Balay }
493156bc490SSatish Balay 
494fa375c27SSatish Balay PETSC_EXTERN void PETSC_STDCALL  mpi_comm_create_(int *comm,int *group,int *newcomm,int *ierr)
495156bc490SSatish Balay {
496156bc490SSatish Balay   *newcomm =  *comm;
497156bc490SSatish Balay   *ierr    = MPI_SUCCESS;
498156bc490SSatish Balay }
499156bc490SSatish Balay 
500fa375c27SSatish Balay PETSC_EXTERN void PETSC_STDCALL  mpi_address_(void *location,MPIUNI_INTPTR *address,int *ierr)
501156bc490SSatish Balay {
502e87984cdSSatish Balay   *address =  (MPIUNI_INTPTR) location;
503156bc490SSatish Balay   *ierr    = MPI_SUCCESS;
504156bc490SSatish Balay }
505156bc490SSatish Balay 
506fa375c27SSatish Balay PETSC_EXTERN void PETSC_STDCALL  mpi_pack_(void *inbuf,int *incount,int *datatype,void *outbuf,int *outsize,int *position,int *comm,int *ierr)
507156bc490SSatish Balay {
508156bc490SSatish Balay   *ierr = MPI_Abort(MPI_COMM_WORLD,0);
509156bc490SSatish Balay }
510156bc490SSatish Balay 
511fa375c27SSatish Balay PETSC_EXTERN void PETSC_STDCALL  mpi_unpack_(void *inbuf,int *insize,int *position,void *outbuf,int *outcount,int *datatype,int *comm,int *ierr)
512156bc490SSatish Balay {
513156bc490SSatish Balay   *ierr = MPI_Abort(MPI_COMM_WORLD,0);
514156bc490SSatish Balay }
515156bc490SSatish Balay 
516fa375c27SSatish Balay PETSC_EXTERN void PETSC_STDCALL  mpi_pack_size_(int *incount,int *datatype,int *comm,int *size,int *ierr)
517156bc490SSatish Balay {
518156bc490SSatish Balay   *ierr = MPI_Abort(MPI_COMM_WORLD,0);
519156bc490SSatish Balay }
520156bc490SSatish Balay 
521fa375c27SSatish 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)
522156bc490SSatish Balay {
523156bc490SSatish Balay   *ierr = MPI_Abort(MPI_COMM_WORLD,0);
524156bc490SSatish Balay }
525156bc490SSatish Balay 
526fa375c27SSatish Balay PETSC_EXTERN void PETSC_STDCALL  mpi_type_commit_(int *datatype,int *ierr)
527156bc490SSatish Balay {
528156bc490SSatish Balay   *ierr = MPI_SUCCESS;
529156bc490SSatish Balay }
530156bc490SSatish Balay 
531156bc490SSatish Balay double PETSC_STDCALL mpi_wtime_(void)
532156bc490SSatish Balay {
533156bc490SSatish Balay   return 0.0;
534f8f52c7dSSatish Balay }
535156bc490SSatish Balay 
536fa375c27SSatish Balay PETSC_EXTERN void PETSC_STDCALL  mpi_cancel_(int *request,int *ierr)
537f8f52c7dSSatish Balay {
538f8f52c7dSSatish Balay   *ierr = MPI_SUCCESS;
539f8f52c7dSSatish Balay }
540f8f52c7dSSatish Balay 
541fa375c27SSatish Balay PETSC_EXTERN void PETSC_STDCALL  mpi_comm_dup_(int *comm,int *out,int *ierr)
542f8f52c7dSSatish Balay {
543f8f52c7dSSatish Balay   *out  = *comm;
544f8f52c7dSSatish Balay   *ierr = MPI_SUCCESS;
545f8f52c7dSSatish Balay }
546f8f52c7dSSatish Balay 
547fa375c27SSatish Balay PETSC_EXTERN void PETSC_STDCALL  mpi_comm_free_(int *comm,int *ierr)
548f8f52c7dSSatish Balay {
549f8f52c7dSSatish Balay   *ierr = MPI_SUCCESS;
550f8f52c7dSSatish Balay }
551f8f52c7dSSatish Balay 
552fa375c27SSatish Balay PETSC_EXTERN void PETSC_STDCALL  mpi_get_count_(int *status,int *datatype,int *count,int *ierr)
553f8f52c7dSSatish Balay {
554f8f52c7dSSatish Balay   *ierr = MPI_Abort(MPI_COMM_WORLD,0);
555f8f52c7dSSatish Balay }
556f8f52c7dSSatish Balay 
557ce0a2cd1SBarry Smith /* duplicate from fortranimpl.h */
558f8f52c7dSSatish Balay #if defined(PETSC_HAVE_FORTRAN_MIXED_STR_ARG)
559f8f52c7dSSatish Balay #define PETSC_MIXED_LEN(len) ,int len
560f8f52c7dSSatish Balay #define PETSC_END_LEN(len)
561f8f52c7dSSatish Balay #else
562f8f52c7dSSatish Balay #define PETSC_MIXED_LEN(len)
563f8f52c7dSSatish Balay #define PETSC_END_LEN(len)   ,int len
564f8f52c7dSSatish Balay #endif
565f8f52c7dSSatish Balay 
566fa375c27SSatish 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))
567f8f52c7dSSatish Balay {
568f8f52c7dSSatish Balay   MPIUNI_Memcpy(name,"localhost",9*sizeof(char));
569f8f52c7dSSatish Balay   *result_len = 9;
570f8f52c7dSSatish Balay   *ierr       = MPI_SUCCESS;
571f8f52c7dSSatish Balay }
572f8f52c7dSSatish Balay 
573fa375c27SSatish Balay PETSC_EXTERN void PETSC_STDCALL  mpi_initialized_(int *flag,int *ierr)
574f8f52c7dSSatish Balay {
575f8f52c7dSSatish Balay   *flag = MPI_was_initialized;
576f8f52c7dSSatish Balay   *ierr = MPI_SUCCESS;
577f8f52c7dSSatish Balay }
578f8f52c7dSSatish Balay 
579fa375c27SSatish Balay PETSC_EXTERN void PETSC_STDCALL  mpi_iprobe_(int *source,int *tag,int *comm,int *glag,int *status,int *ierr)
580f8f52c7dSSatish Balay {
581f8f52c7dSSatish Balay   *ierr = MPI_SUCCESS;
582f8f52c7dSSatish Balay }
583f8f52c7dSSatish Balay 
584fa375c27SSatish Balay PETSC_EXTERN void PETSC_STDCALL  mpi_probe_(int *source,int *tag,int *comm,int *flag,int *status,int *ierr)
585f8f52c7dSSatish Balay {
586f8f52c7dSSatish Balay   *ierr = MPI_SUCCESS;
587f8f52c7dSSatish Balay }
588f8f52c7dSSatish Balay 
589fa375c27SSatish Balay PETSC_EXTERN void PETSC_STDCALL  mpi_request_free_(int *request,int *ierr)
590f8f52c7dSSatish Balay {
591f8f52c7dSSatish Balay   *ierr = MPI_SUCCESS;
592f8f52c7dSSatish Balay }
593f8f52c7dSSatish Balay 
594fa375c27SSatish Balay PETSC_EXTERN void PETSC_STDCALL  mpi_ssend_(void *buf,int *count,int *datatype,int *dest,int *tag,int *comm,int *ierr)
595f8f52c7dSSatish Balay {
596f8f52c7dSSatish Balay   *ierr = MPI_Abort(MPI_COMM_WORLD,0);
597f8f52c7dSSatish Balay }
598f8f52c7dSSatish Balay 
599fa375c27SSatish Balay PETSC_EXTERN void PETSC_STDCALL  mpi_wait_(int *request,int *status,int *ierr)
600f8f52c7dSSatish Balay {
601f8f52c7dSSatish Balay   *ierr = MPI_SUCCESS;
602156bc490SSatish Balay }
603156bc490SSatish Balay 
604fa375c27SSatish Balay PETSC_EXTERN void PETSC_STDCALL  mpi_comm_group_(int *comm,int *group,int *ierr)
605d4816372SSatish Balay {
606d4816372SSatish Balay   *ierr = MPI_SUCCESS;
607d4816372SSatish Balay }
608d4816372SSatish Balay 
609fa375c27SSatish Balay PETSC_EXTERN void PETSC_STDCALL  mpi_exscan_(void *sendbuf,void *recvbuf,int *count,int *datatype,int *op,int *comm,int *ierr)
610d4816372SSatish Balay {
611d4816372SSatish Balay   *ierr = MPI_SUCCESS;
612d4816372SSatish Balay }
613d4816372SSatish Balay 
614c8217ed5SSatish Balay #endif /* MPIUNI_AVOID_MPI_NAMESPACE */
615c8217ed5SSatish Balay 
616e5c89e4eSSatish Balay #if defined(__cplusplus)
617e5c89e4eSSatish Balay }
618e5c89e4eSSatish Balay #endif
619