xref: /petsc/src/sys/mpiuni/mpi.c (revision 52ecd5ff282b794221c97a229f769f0b0abebc43)
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>
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
27fb53af6bSBarry Smith #define MAX_COMM 128
28fb53af6bSBarry Smith 
29fb53af6bSBarry Smith static int MaxComm = 2;
30e5c89e4eSSatish Balay 
31e5c89e4eSSatish Balay typedef struct {
32e5c89e4eSSatish Balay   void *attribute_val;
33e5c89e4eSSatish Balay   int  active;
34e5c89e4eSSatish Balay } MPI_Attr;
35e5c89e4eSSatish Balay 
3646651e72SBarry Smith typedef struct {
3746651e72SBarry Smith   void                *extra_state;
3846651e72SBarry Smith   MPI_Delete_function *del;
3946651e72SBarry Smith } MPI_Attr_keyval;
4046651e72SBarry Smith 
4146651e72SBarry Smith static MPI_Attr_keyval attr_keyval[MAX_ATTR];
42fb53af6bSBarry Smith static MPI_Attr        attr[MAX_COMM][MAX_ATTR];
43e5c89e4eSSatish Balay static int             num_attr = 1,mpi_tag_ub = 100000000;
44*52ecd5ffSSatish Balay static void*           MPIUNIF_mpi_in_place = 0;
45e5c89e4eSSatish Balay 
46e5c89e4eSSatish Balay #if defined(__cplusplus)
47e5c89e4eSSatish Balay extern "C" {
48e5c89e4eSSatish Balay #endif
49e5c89e4eSSatish Balay 
50e5c89e4eSSatish Balay /*
51e5c89e4eSSatish Balay    To avoid problems with prototypes to the system memcpy() it is duplicated here
52e5c89e4eSSatish Balay */
53a6dfd86eSKarl Rupp int MPIUNI_Memcpy(void *a,const void *b,int n)
54a6dfd86eSKarl Rupp {
55e5c89e4eSSatish Balay   int  i;
56e5c89e4eSSatish Balay   char *aa= (char*)a;
57e5c89e4eSSatish Balay   char *bb= (char*)b;
58e5c89e4eSSatish Balay 
59*52ecd5ffSSatish Balay   if (a == MPI_IN_PLACE || a == MPIUNIF_mpi_in_place) return 0;
60*52ecd5ffSSatish Balay   if (b == MPI_IN_PLACE || b == MPIUNIF_mpi_in_place) return 0;
61e5c89e4eSSatish Balay   for (i=0; i<n; i++) aa[i] = bb[i];
62e5c89e4eSSatish Balay   return 0;
63e5c89e4eSSatish Balay }
64e5c89e4eSSatish Balay 
65e5c89e4eSSatish Balay /*
66e5c89e4eSSatish Balay    Used to set the built-in MPI_TAG_UB attribute
67e5c89e4eSSatish Balay */
68e5c89e4eSSatish Balay static int Keyval_setup(void)
69e5c89e4eSSatish Balay {
70100f28aeSBarry Smith   attr[MPI_COMM_WORLD-1][0].active        = 1;
71100f28aeSBarry Smith   attr[MPI_COMM_WORLD-1][0].attribute_val = &mpi_tag_ub;
72100f28aeSBarry Smith   attr[MPI_COMM_SELF-1][0].active         = 1;
73100f28aeSBarry Smith   attr[MPI_COMM_SELF-1][0].attribute_val  = &mpi_tag_ub;
74e5c89e4eSSatish Balay   return 0;
75e5c89e4eSSatish Balay }
76e5c89e4eSSatish Balay 
77c8217ed5SSatish Balay int MPI_Keyval_create(MPI_Copy_function *copy_fn,MPI_Delete_function *delete_fn,int *keyval,void *extra_state)
78e5c89e4eSSatish Balay {
79e5c89e4eSSatish Balay   if (num_attr >= MAX_ATTR) MPI_Abort(MPI_COMM_WORLD,1);
80e5c89e4eSSatish Balay 
8146651e72SBarry Smith   attr_keyval[num_attr].extra_state = extra_state;
8246651e72SBarry Smith   attr_keyval[num_attr].del         = delete_fn;
83e5c89e4eSSatish Balay   *keyval                           = num_attr++;
84e5c89e4eSSatish Balay   return 0;
85e5c89e4eSSatish Balay }
86e5c89e4eSSatish Balay 
87c8217ed5SSatish Balay int MPI_Keyval_free(int *keyval)
88e5c89e4eSSatish Balay {
89a246e310SBarry Smith   attr_keyval[*keyval].extra_state = 0;
90a246e310SBarry Smith   attr_keyval[*keyval].del         = 0;
91a297a907SKarl Rupp 
92a246e310SBarry Smith   *keyval = 0;
93e5c89e4eSSatish Balay   return MPI_SUCCESS;
94e5c89e4eSSatish Balay }
95e5c89e4eSSatish Balay 
96c8217ed5SSatish Balay int MPI_Attr_put(MPI_Comm comm,int keyval,void *attribute_val)
97e5c89e4eSSatish Balay {
98fb53af6bSBarry Smith   if (comm-1 < 0 || comm-1 > MaxComm) return 1;
99100f28aeSBarry Smith   attr[comm-1][keyval].active        = 1;
100100f28aeSBarry Smith   attr[comm-1][keyval].attribute_val = attribute_val;
101e5c89e4eSSatish Balay   return MPI_SUCCESS;
102e5c89e4eSSatish Balay }
103e5c89e4eSSatish Balay 
104c8217ed5SSatish Balay int MPI_Attr_delete(MPI_Comm comm,int keyval)
105e5c89e4eSSatish Balay {
106fb53af6bSBarry Smith   if (comm-1 < 0 || comm-1 > MaxComm) return 1;
107100f28aeSBarry Smith   if (attr[comm-1][keyval].active && attr_keyval[keyval].del) {
108100f28aeSBarry Smith     void *save_attribute_val = attr[comm-1][keyval].attribute_val;
109100f28aeSBarry Smith     attr[comm-1][keyval].active        = 0;
110100f28aeSBarry Smith     attr[comm-1][keyval].attribute_val = 0;
11146651e72SBarry Smith     (*(attr_keyval[keyval].del))(comm,keyval,save_attribute_val,attr_keyval[keyval].extra_state);
11240776e1bSpetsc   }
113e5c89e4eSSatish Balay   return MPI_SUCCESS;
114e5c89e4eSSatish Balay }
115e5c89e4eSSatish Balay 
116c8217ed5SSatish Balay int MPI_Attr_get(MPI_Comm comm,int keyval,void *attribute_val,int *flag)
117e5c89e4eSSatish Balay {
118fb53af6bSBarry Smith   if (comm-1 < 0 || comm-1 > MaxComm) return 1;
119e5c89e4eSSatish Balay   if (!keyval) Keyval_setup();
120100f28aeSBarry Smith   *flag                  = attr[comm-1][keyval].active;
121100f28aeSBarry Smith   *(void**)attribute_val = attr[comm-1][keyval].attribute_val;
122e5c89e4eSSatish Balay   return MPI_SUCCESS;
123e5c89e4eSSatish Balay }
124e5c89e4eSSatish Balay 
125c8217ed5SSatish Balay int MPI_Comm_create(MPI_Comm comm,MPI_Group group,MPI_Comm *newcomm)
126c8217ed5SSatish Balay {
127fb53af6bSBarry Smith   if (comm-1 < 0 || comm-1 > MaxComm) return 1;
128fb53af6bSBarry Smith   if (MaxComm > MAX_COMM) return MPI_FAILURE;
129fb53af6bSBarry Smith   *newcomm =  MaxComm++;
130c8217ed5SSatish Balay   return MPI_SUCCESS;
131c8217ed5SSatish Balay }
132c8217ed5SSatish Balay 
133c8217ed5SSatish Balay int MPI_Comm_dup(MPI_Comm comm,MPI_Comm *out)
134e5c89e4eSSatish Balay {
135fb53af6bSBarry Smith   if (comm-1 < 0 || comm-1 > MaxComm) return 1;
136fb53af6bSBarry Smith   if (MaxComm > MAX_COMM) return MPI_FAILURE;
137fb53af6bSBarry Smith   *out = MaxComm++;
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 
145fb53af6bSBarry Smith   if (*comm-1 < 0 || *comm-1 > MaxComm) return 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   }
151100f28aeSBarry Smith   *comm = 0;
152e5c89e4eSSatish Balay   return MPI_SUCCESS;
153e5c89e4eSSatish Balay }
154e5c89e4eSSatish Balay 
155d393f697SSatish Balay int MPI_Comm_size(MPI_Comm comm, int *size)
156d393f697SSatish Balay {
157fb53af6bSBarry Smith   if (comm-1 < 0 || comm-1 > MaxComm) return 1;
158d393f697SSatish Balay   *size=1;
159d393f697SSatish Balay   return MPI_SUCCESS;
160d393f697SSatish Balay }
161d393f697SSatish Balay 
162d393f697SSatish Balay int MPI_Comm_rank(MPI_Comm comm, int *rank)
163d393f697SSatish Balay {
164fb53af6bSBarry Smith   if (comm-1 < 0 || comm-1 > MaxComm) return 1;
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)
216*52ecd5ffSSatish Balay #define mpiunisetcommonblock_ MPIUNISETCOMMONBLOCK
217*52ecd5ffSSatish Balay #define mpiunisetfortranbasepointers_  MPIUNISETFORTRANBASEPOINTERS
218f7c6e6aaSSatish Balay #define mpi_init_             MPI_INIT
219f7c6e6aaSSatish Balay #define mpi_finalize_         MPI_FINALIZE
220f7c6e6aaSSatish Balay #define mpi_comm_size_        MPI_COMM_SIZE
221f7c6e6aaSSatish Balay #define mpi_comm_rank_        MPI_COMM_RANK
222f7c6e6aaSSatish Balay #define mpi_abort_            MPI_ABORT
2233b644628SSatish Balay #define mpi_reduce_           MPI_REDUCE
224f7c6e6aaSSatish Balay #define mpi_allreduce_        MPI_ALLREDUCE
225f7c6e6aaSSatish Balay #define mpi_barrier_          MPI_BARRIER
226f7c6e6aaSSatish Balay #define mpi_bcast_            MPI_BCAST
227f7c6e6aaSSatish Balay #define mpi_gather_           MPI_GATHER
228f7c6e6aaSSatish Balay #define mpi_allgather_        MPI_ALLGATHER
22904ab3e84SSatish Balay #define mpi_comm_split_       MPI_COMM_SPLIT
2303b644628SSatish Balay #define mpi_scan_             MPI_SCAN
2311086b069SSatish Balay #define mpi_send_             MPI_SEND
2321086b069SSatish Balay #define mpi_recv_             MPI_RECV
233156bc490SSatish Balay #define mpi_reduce_scatter_   MPI_REDUCE_SCATTER
234156bc490SSatish Balay #define mpi_irecv_            MPI_IRECV
235156bc490SSatish Balay #define mpi_isend_            MPI_ISEND
236156bc490SSatish Balay #define mpi_sendrecv_         MPI_SENDRECV
237156bc490SSatish Balay #define mpi_test_             MPI_TEST
238156bc490SSatish Balay #define mpi_waitall_          MPI_WAITALL
239156bc490SSatish Balay #define mpi_waitany_          MPI_WAITANY
240156bc490SSatish Balay #define mpi_allgatherv_       MPI_ALLGATHERV
241156bc490SSatish Balay #define mpi_alltoallv_        MPI_ALLTOALLV
242156bc490SSatish Balay #define mpi_comm_create_      MPI_COMM_CREATE
243156bc490SSatish Balay #define mpi_address_          MPI_ADDRESS
244156bc490SSatish Balay #define mpi_pack_             MPI_PACK
245156bc490SSatish Balay #define mpi_unpack_           MPI_UNPACK
246156bc490SSatish Balay #define mpi_pack_size_        MPI_PACK_SIZE
247156bc490SSatish Balay #define mpi_type_struct_      MPI_TYPE_STRUCT
248156bc490SSatish Balay #define mpi_type_commit_      MPI_TYPE_COMMIT
249156bc490SSatish Balay #define mpi_wtime_            MPI_WTIME
250f8f52c7dSSatish Balay #define mpi_cancel_           MPI_CANCEL
251f8f52c7dSSatish Balay #define mpi_comm_dup_         MPI_COMM_DUP
252f8f52c7dSSatish Balay #define mpi_comm_free_        MPI_COMM_FREE
253f8f52c7dSSatish Balay #define mpi_get_count_        MPI_GET_COUNT
254f8f52c7dSSatish Balay #define mpi_get_processor_name_ MPI_GET_PROCESSOR_NAME
255f8f52c7dSSatish Balay #define mpi_initialized_      MPI_INITIALIZED
256f8f52c7dSSatish Balay #define mpi_iprobe_           MPI_IPROBE
257f8f52c7dSSatish Balay #define mpi_probe_            MPI_PROBE
258f8f52c7dSSatish Balay #define mpi_request_free_     MPI_REQUEST_FREE
259f8f52c7dSSatish Balay #define mpi_ssend_            MPI_SSEND
260f8f52c7dSSatish Balay #define mpi_wait_             MPI_WAIT
261d4816372SSatish Balay #define mpi_comm_group_       MPI_COMM_GROUP
262d4816372SSatish Balay #define mpi_exscan_           MPI_EXSCAN
263f7c6e6aaSSatish Balay #elif !defined(PETSC_HAVE_FORTRAN_UNDERSCORE)
264*52ecd5ffSSatish Balay #define mpiunisetcommonblock_ mpiunisetcommonblock
265*52ecd5ffSSatish Balay #define mpiunisetfortranbasepointers_  mpiunisetfortranbasepointers
266f7c6e6aaSSatish Balay #define mpi_init_             mpi_init
267f7c6e6aaSSatish Balay #define mpi_finalize_         mpi_finalize
268f7c6e6aaSSatish Balay #define mpi_comm_size_        mpi_comm_size
269f7c6e6aaSSatish Balay #define mpi_comm_rank_        mpi_comm_rank
270f7c6e6aaSSatish Balay #define mpi_abort_            mpi_abort
2713b644628SSatish Balay #define mpi_reduce_           mpi_reduce
272f7c6e6aaSSatish Balay #define mpi_allreduce_        mpi_allreduce
273f7c6e6aaSSatish Balay #define mpi_barrier_          mpi_barrier
274f7c6e6aaSSatish Balay #define mpi_bcast_            mpi_bcast
275f7c6e6aaSSatish Balay #define mpi_gather_           mpi_gather
276f7c6e6aaSSatish Balay #define mpi_allgather_        mpi_allgather
27704ab3e84SSatish Balay #define mpi_comm_split_       mpi_comm_split
2783b644628SSatish Balay #define mpi_scan_             mpi_scan
2791086b069SSatish Balay #define mpi_send_             mpi_send
2801086b069SSatish Balay #define mpi_recv_             mpi_recv
281156bc490SSatish Balay #define mpi_reduce_scatter_   mpi_reduce_scatter
282156bc490SSatish Balay #define mpi_irecv_            mpi_irecv
283156bc490SSatish Balay #define mpi_isend_            mpi_isend
284156bc490SSatish Balay #define mpi_sendrecv_         mpi_sendrecv
285156bc490SSatish Balay #define mpi_test_             mpi_test
286156bc490SSatish Balay #define mpi_waitall_          mpi_waitall
287156bc490SSatish Balay #define mpi_waitany_          mpi_waitany
288156bc490SSatish Balay #define mpi_allgatherv_       mpi_allgatherv
289156bc490SSatish Balay #define mpi_alltoallv_        mpi_alltoallv
290156bc490SSatish Balay #define mpi_comm_create_      mpi_comm_create
291156bc490SSatish Balay #define mpi_address_          mpi_address
292156bc490SSatish Balay #define mpi_pack_             mpi_pack
293156bc490SSatish Balay #define mpi_unpack_           mpi_unpack
294156bc490SSatish Balay #define mpi_pack_size_        mpi_pack_size
295156bc490SSatish Balay #define mpi_type_struct_      mpi_type_struct
296156bc490SSatish Balay #define mpi_type_commit_      mpi_type_commit
297156bc490SSatish Balay #define mpi_wtime_            mpi_wtime
298f8f52c7dSSatish Balay #define mpi_cancel_           mpi_cancel
299f8f52c7dSSatish Balay #define mpi_comm_dup_         mpi_comm_dup
300f8f52c7dSSatish Balay #define mpi_comm_free_        mpi_comm_free
301f8f52c7dSSatish Balay #define mpi_get_count_        mpi_get_count
302f8f52c7dSSatish Balay #define mpi_get_processor_name_ mpi_get_processor_name
303f8f52c7dSSatish Balay #define mpi_initialized_      mpi_initialized
304f8f52c7dSSatish Balay #define mpi_iprobe_           mpi_iprobe
305f8f52c7dSSatish Balay #define mpi_probe_            mpi_probe
306f8f52c7dSSatish Balay #define mpi_request_free_     mpi_request_free
307f8f52c7dSSatish Balay #define mpi_ssend_            mpi_ssend
308f8f52c7dSSatish Balay #define mpi_wait_             mpi_wait
309d4816372SSatish Balay #define mpi_comm_group_       mpi_comm_group
310d4816372SSatish Balay #define mpi_exscan_           mpi_exscan
311f7c6e6aaSSatish Balay #endif
312e5c89e4eSSatish Balay 
313f7c6e6aaSSatish Balay #if defined(PETSC_HAVE_FORTRAN_UNDERSCORE_UNDERSCORE)
314f7c6e6aaSSatish Balay #define mpi_init_             mpi_init__
315f7c6e6aaSSatish Balay #define mpi_finalize_         mpi_finalize__
316f7c6e6aaSSatish Balay #define mpi_comm_size_        mpi_comm_size__
317f7c6e6aaSSatish Balay #define mpi_comm_rank_        mpi_comm_rank__
318f7c6e6aaSSatish Balay #define mpi_abort_            mpi_abort__
3193b644628SSatish Balay #define mpi_reduce_           mpi_reduce__
320f7c6e6aaSSatish Balay #define mpi_allreduce_        mpi_allreduce__
321f7c6e6aaSSatish Balay #define mpi_barrier_          mpi_barrier__
322f7c6e6aaSSatish Balay #define mpi_bcast_            mpi_bcast__
323f7c6e6aaSSatish Balay #define mpi_gather_           mpi_gather__
324f7c6e6aaSSatish Balay #define mpi_allgather_        mpi_allgather__
32504ab3e84SSatish Balay #define mpi_comm_split_       mpi_comm_split__
32639a9255cSSatish Balay #define mpi_scan_             mpi_scan__
3271086b069SSatish Balay #define mpi_send_             mpi_send__
3281086b069SSatish Balay #define mpi_recv_             mpi_recv__
329156bc490SSatish Balay #define mpi_reduce_scatter_   mpi_reduce_scatter__
330156bc490SSatish Balay #define mpi_irecv_            mpi_irecv__
331156bc490SSatish Balay #define mpi_isend_            mpi_isend__
332156bc490SSatish Balay #define mpi_sendrecv_         mpi_sendrecv__
333156bc490SSatish Balay #define mpi_test_             mpi_test__
334156bc490SSatish Balay #define mpi_waitall_          mpi_waitall__
335156bc490SSatish Balay #define mpi_waitany_          mpi_waitany__
336156bc490SSatish Balay #define mpi_allgatherv_       mpi_allgatherv__
337156bc490SSatish Balay #define mpi_alltoallv_        mpi_alltoallv__
338156bc490SSatish Balay #define mpi_comm_create_      mpi_comm_create__
339156bc490SSatish Balay #define mpi_address_          mpi_address__
340156bc490SSatish Balay #define mpi_pack_             mpi_pack__
341156bc490SSatish Balay #define mpi_unpack_           mpi_unpack__
342156bc490SSatish Balay #define mpi_pack_size_        mpi_pack_size__
343156bc490SSatish Balay #define mpi_type_struct_      mpi_type_struct__
344156bc490SSatish Balay #define mpi_type_commit_      mpi_type_commit__
345156bc490SSatish Balay #define mpi_wtime_            mpi_wtime__
346f8f52c7dSSatish Balay #define mpi_cancel_           mpi_cancel__
347f8f52c7dSSatish Balay #define mpi_comm_dup_         mpi_comm_dup__
348f8f52c7dSSatish Balay #define mpi_comm_free_        mpi_comm_free__
349f8f52c7dSSatish Balay #define mpi_get_count_        mpi_get_count__
350f8f52c7dSSatish Balay #define mpi_get_processor_name_ mpi_get_processor_name__
351f8f52c7dSSatish Balay #define mpi_initialized_      mpi_initialized__
352f8f52c7dSSatish Balay #define mpi_iprobe_           mpi_iprobe__
353f8f52c7dSSatish Balay #define mpi_probe_            mpi_probe__
354f8f52c7dSSatish Balay #define mpi_request_free_     mpi_request_free__
355f8f52c7dSSatish Balay #define mpi_ssend_            mpi_ssend__
356f8f52c7dSSatish Balay #define mpi_wait_             mpi_wait__
35739a9255cSSatish Balay #define mpi_comm_group_       mpi_comm_group__
358d4816372SSatish Balay #define mpi_exscan_           mpi_exscan__
359f7c6e6aaSSatish Balay #endif
360e5c89e4eSSatish Balay 
361c8217ed5SSatish Balay /* Do not build fortran interface if MPI namespace colision is to be avoided */
362c8217ed5SSatish Balay #if !defined(MPIUNI_AVOID_MPI_NAMESPACE)
363c8217ed5SSatish Balay 
364*52ecd5ffSSatish Balay PETSC_EXTERN void PETSC_STDCALL mpiunisetcommonblock_(void);
365*52ecd5ffSSatish Balay 
366*52ecd5ffSSatish Balay PETSC_EXTERN void PETSC_STDCALL mpiunisetfortranbasepointers_(void *f_mpi_in_place)
367*52ecd5ffSSatish Balay {
368*52ecd5ffSSatish Balay   MPIUNIF_mpi_in_place   = f_mpi_in_place;
369*52ecd5ffSSatish Balay }
370*52ecd5ffSSatish Balay 
371fa375c27SSatish Balay PETSC_EXTERN void PETSC_STDCALL   mpi_init_(int *ierr)
372e5c89e4eSSatish Balay {
373*52ecd5ffSSatish Balay   mpiunisetcommonblock_();
374c8217ed5SSatish Balay   *ierr = MPI_Init((int*)0, (char***)0);
375e5c89e4eSSatish Balay }
376e5c89e4eSSatish Balay 
377fa375c27SSatish Balay PETSC_EXTERN void PETSC_STDCALL   mpi_finalize_(int *ierr)
378e5c89e4eSSatish Balay {
379c8217ed5SSatish Balay   *ierr = MPI_Finalize();
380e5c89e4eSSatish Balay }
381e5c89e4eSSatish Balay 
382fa375c27SSatish Balay PETSC_EXTERN void PETSC_STDCALL  mpi_comm_size_(MPI_Comm *comm,int *size,int *ierr)
383e5c89e4eSSatish Balay {
384e5c89e4eSSatish Balay   *size = 1;
385e5c89e4eSSatish Balay   *ierr = 0;
386e5c89e4eSSatish Balay }
387e5c89e4eSSatish Balay 
388fa375c27SSatish Balay PETSC_EXTERN void PETSC_STDCALL  mpi_comm_rank_(MPI_Comm *comm,int *rank,int *ierr)
389e5c89e4eSSatish Balay {
390e5c89e4eSSatish Balay   *rank = 0;
391e5c89e4eSSatish Balay   *ierr = MPI_SUCCESS;
392e5c89e4eSSatish Balay }
393e5c89e4eSSatish Balay 
394fa375c27SSatish Balay PETSC_EXTERN void PETSC_STDCALL  mpi_comm_split_(MPI_Comm *comm,int *color,int *key, MPI_Comm *newcomm, int *ierr)
3951f6cc5b2SSatish Balay {
3961f6cc5b2SSatish Balay   *newcomm = *comm;
3971f6cc5b2SSatish Balay   *ierr    = MPI_SUCCESS;
3981f6cc5b2SSatish Balay }
3991f6cc5b2SSatish Balay 
400fa375c27SSatish Balay PETSC_EXTERN void PETSC_STDCALL  mpi_abort_(MPI_Comm *comm,int *errorcode,int *ierr)
401e5c89e4eSSatish Balay {
402e5c89e4eSSatish Balay   abort();
403e5c89e4eSSatish Balay   *ierr = MPI_SUCCESS;
404e5c89e4eSSatish Balay }
405e5c89e4eSSatish Balay 
406fa375c27SSatish Balay PETSC_EXTERN void PETSC_STDCALL  mpi_reduce_(void *sendbuf,void *recvbuf,int *count,int *datatype,int *op,int *root,int *comm,int *ierr)
4073b644628SSatish Balay {
408f30578ecSBarry Smith   *ierr = MPI_Reduce(sendbuf,recvbuf,*count,*datatype,*op,*root,*comm);
4093b644628SSatish Balay }
4103b644628SSatish Balay 
411fa375c27SSatish Balay PETSC_EXTERN void PETSC_STDCALL  mpi_allreduce_(void *sendbuf,void *recvbuf,int *count,int *datatype,int *op,int *comm,int *ierr)
412e5c89e4eSSatish Balay {
413f30578ecSBarry Smith   *ierr = MPI_Allreduce(sendbuf,recvbuf,*count,*datatype,*op,*comm);
414e5c89e4eSSatish Balay }
415e5c89e4eSSatish Balay 
416fa375c27SSatish Balay PETSC_EXTERN void PETSC_STDCALL  mpi_barrier_(MPI_Comm *comm,int *ierr)
417e5c89e4eSSatish Balay {
418e5c89e4eSSatish Balay   *ierr = MPI_SUCCESS;
419e5c89e4eSSatish Balay }
420f7c6e6aaSSatish Balay 
421fa375c27SSatish Balay PETSC_EXTERN void PETSC_STDCALL  mpi_bcast_(void *buf,int *count,int *datatype,int *root,int *comm,int *ierr)
422e5c89e4eSSatish Balay {
423e5c89e4eSSatish Balay   *ierr = MPI_SUCCESS;
424e5c89e4eSSatish Balay }
425f7c6e6aaSSatish Balay 
426fa375c27SSatish 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)
427e5c89e4eSSatish Balay {
428f30578ecSBarry Smith   *ierr = MPI_Gather(sendbuf,*scount,*sdatatype,recvbuf,rcount,rdatatype,*root,*comm);
429f7c6e6aaSSatish Balay }
430f7c6e6aaSSatish Balay 
431fa375c27SSatish Balay PETSC_EXTERN void PETSC_STDCALL  mpi_allgather_(void *sendbuf,int *scount,int *sdatatype, void *recvbuf, int *rcount, int *rdatatype,int *comm,int *ierr)
432f7c6e6aaSSatish Balay {
433f30578ecSBarry Smith   *ierr = MPI_Allgather(sendbuf,*scount,*sdatatype,recvbuf,rcount,rdatatype,*comm);
434e5c89e4eSSatish Balay }
435e5c89e4eSSatish Balay 
436fa375c27SSatish Balay PETSC_EXTERN void PETSC_STDCALL  mpi_scan_(void *sendbuf,void *recvbuf,int *count,int *datatype,int *op,int *comm,int *ierr)
4373b644628SSatish Balay {
438f30578ecSBarry Smith   *ierr = MPIUNI_Memcpy(recvbuf,sendbuf,(*count)*MPIUNI_DATASIZE[*datatype]);
4393b644628SSatish Balay }
4403b644628SSatish Balay 
441fa375c27SSatish Balay PETSC_EXTERN void PETSC_STDCALL  mpi_send_(void *buf,int *count,int *datatype,int *dest,int *tag,int *comm,int *ierr)
4421086b069SSatish Balay {
4434423d37eSSatish Balay   *ierr = MPI_Abort(MPI_COMM_WORLD,0);
4441086b069SSatish Balay }
4451086b069SSatish Balay 
446fa375c27SSatish Balay PETSC_EXTERN void PETSC_STDCALL  mpi_recv_(void *buf,int *count,int *datatype,int *source,int *tag,int *comm,int status,int *ierr)
4471086b069SSatish Balay {
4481086b069SSatish Balay   *ierr = MPI_Abort(MPI_COMM_WORLD,0);
4491086b069SSatish Balay }
4501086b069SSatish Balay 
451fa375c27SSatish Balay PETSC_EXTERN void PETSC_STDCALL  mpi_reduce_scatter_(void *sendbuf,void *recvbuf,int *recvcounts,int *datatype,int *op,int *comm,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_irecv_(void *buf,int *count, int *datatype, int *source, 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_isend_(void *buf,int *count,int *datatype,int *dest,int *tag,int *comm,int *request, int *ierr)
462156bc490SSatish Balay {
463156bc490SSatish Balay   *ierr = MPI_Abort(MPI_COMM_WORLD,0);
464156bc490SSatish Balay }
465156bc490SSatish Balay 
466fa375c27SSatish 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)
467156bc490SSatish Balay {
468f30578ecSBarry Smith   *ierr = MPIUNI_Memcpy(recvbuf,sendbuf,(*sendcount)*MPIUNI_DATASIZE[*sendtype]);
469156bc490SSatish Balay }
470156bc490SSatish Balay 
471fa375c27SSatish Balay PETSC_EXTERN void PETSC_STDCALL  mpi_test_(int *request,int *flag,int *status,int *ierr)
472156bc490SSatish Balay {
473156bc490SSatish Balay   *ierr = MPI_Abort(MPI_COMM_WORLD,0);
474156bc490SSatish Balay }
475156bc490SSatish Balay 
476fa375c27SSatish Balay PETSC_EXTERN void PETSC_STDCALL  mpi_waitall_(int *count,int *array_of_requests,int *array_of_statuses,int *ierr)
477156bc490SSatish Balay {
478156bc490SSatish Balay   *ierr = MPI_SUCCESS;
479156bc490SSatish Balay }
480156bc490SSatish Balay 
481fa375c27SSatish Balay PETSC_EXTERN void PETSC_STDCALL  mpi_waitany_(int *count,int *array_of_requests,int * index, int *status,int *ierr)
482156bc490SSatish Balay {
483156bc490SSatish Balay   *ierr = MPI_SUCCESS;
484156bc490SSatish Balay }
485156bc490SSatish Balay 
486fa375c27SSatish 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)
487156bc490SSatish Balay {
488f30578ecSBarry Smith   *ierr = MPI_Allgatherv(sendbuf,*sendcount,*sendtype,recvbuf,recvcounts,displs,*recvtype,*comm);
489156bc490SSatish Balay }
490156bc490SSatish Balay 
491fa375c27SSatish 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)
492156bc490SSatish Balay {
493f30578ecSBarry Smith   *ierr = MPI_Alltoallv(sendbuf,sendcounts,sdispls,*sendtype,recvbuf,recvcounts,rdispls,*recvtype,*comm);
494156bc490SSatish Balay }
495156bc490SSatish Balay 
496fa375c27SSatish Balay PETSC_EXTERN void PETSC_STDCALL  mpi_comm_create_(int *comm,int *group,int *newcomm,int *ierr)
497156bc490SSatish Balay {
498156bc490SSatish Balay   *newcomm =  *comm;
499156bc490SSatish Balay   *ierr    = MPI_SUCCESS;
500156bc490SSatish Balay }
501156bc490SSatish Balay 
502fa375c27SSatish Balay PETSC_EXTERN void PETSC_STDCALL  mpi_address_(void *location,MPIUNI_INTPTR *address,int *ierr)
503156bc490SSatish Balay {
504e87984cdSSatish Balay   *address =  (MPIUNI_INTPTR) location;
505156bc490SSatish Balay   *ierr    = MPI_SUCCESS;
506156bc490SSatish Balay }
507156bc490SSatish Balay 
508fa375c27SSatish Balay PETSC_EXTERN void PETSC_STDCALL  mpi_pack_(void *inbuf,int *incount,int *datatype,void *outbuf,int *outsize,int *position,int *comm,int *ierr)
509156bc490SSatish Balay {
510156bc490SSatish Balay   *ierr = MPI_Abort(MPI_COMM_WORLD,0);
511156bc490SSatish Balay }
512156bc490SSatish Balay 
513fa375c27SSatish Balay PETSC_EXTERN void PETSC_STDCALL  mpi_unpack_(void *inbuf,int *insize,int *position,void *outbuf,int *outcount,int *datatype,int *comm,int *ierr)
514156bc490SSatish Balay {
515156bc490SSatish Balay   *ierr = MPI_Abort(MPI_COMM_WORLD,0);
516156bc490SSatish Balay }
517156bc490SSatish Balay 
518fa375c27SSatish Balay PETSC_EXTERN void PETSC_STDCALL  mpi_pack_size_(int *incount,int *datatype,int *comm,int *size,int *ierr)
519156bc490SSatish Balay {
520156bc490SSatish Balay   *ierr = MPI_Abort(MPI_COMM_WORLD,0);
521156bc490SSatish Balay }
522156bc490SSatish Balay 
523fa375c27SSatish 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)
524156bc490SSatish Balay {
525156bc490SSatish Balay   *ierr = MPI_Abort(MPI_COMM_WORLD,0);
526156bc490SSatish Balay }
527156bc490SSatish Balay 
528fa375c27SSatish Balay PETSC_EXTERN void PETSC_STDCALL  mpi_type_commit_(int *datatype,int *ierr)
529156bc490SSatish Balay {
530156bc490SSatish Balay   *ierr = MPI_SUCCESS;
531156bc490SSatish Balay }
532156bc490SSatish Balay 
533156bc490SSatish Balay double PETSC_STDCALL mpi_wtime_(void)
534156bc490SSatish Balay {
535156bc490SSatish Balay   return 0.0;
536f8f52c7dSSatish Balay }
537156bc490SSatish Balay 
538fa375c27SSatish Balay PETSC_EXTERN void PETSC_STDCALL  mpi_cancel_(int *request,int *ierr)
539f8f52c7dSSatish Balay {
540f8f52c7dSSatish Balay   *ierr = MPI_SUCCESS;
541f8f52c7dSSatish Balay }
542f8f52c7dSSatish Balay 
543fa375c27SSatish Balay PETSC_EXTERN void PETSC_STDCALL  mpi_comm_dup_(int *comm,int *out,int *ierr)
544f8f52c7dSSatish Balay {
545f8f52c7dSSatish Balay   *out  = *comm;
546f8f52c7dSSatish Balay   *ierr = MPI_SUCCESS;
547f8f52c7dSSatish Balay }
548f8f52c7dSSatish Balay 
549fa375c27SSatish Balay PETSC_EXTERN void PETSC_STDCALL  mpi_comm_free_(int *comm,int *ierr)
550f8f52c7dSSatish Balay {
551f8f52c7dSSatish Balay   *ierr = MPI_SUCCESS;
552f8f52c7dSSatish Balay }
553f8f52c7dSSatish Balay 
554fa375c27SSatish Balay PETSC_EXTERN void PETSC_STDCALL  mpi_get_count_(int *status,int *datatype,int *count,int *ierr)
555f8f52c7dSSatish Balay {
556f8f52c7dSSatish Balay   *ierr = MPI_Abort(MPI_COMM_WORLD,0);
557f8f52c7dSSatish Balay }
558f8f52c7dSSatish Balay 
559ce0a2cd1SBarry Smith /* duplicate from fortranimpl.h */
560f8f52c7dSSatish Balay #if defined(PETSC_HAVE_FORTRAN_MIXED_STR_ARG)
561f8f52c7dSSatish Balay #define PETSC_MIXED_LEN(len) ,int len
562f8f52c7dSSatish Balay #define PETSC_END_LEN(len)
563f8f52c7dSSatish Balay #else
564f8f52c7dSSatish Balay #define PETSC_MIXED_LEN(len)
565f8f52c7dSSatish Balay #define PETSC_END_LEN(len)   ,int len
566f8f52c7dSSatish Balay #endif
567f8f52c7dSSatish Balay 
568fa375c27SSatish 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))
569f8f52c7dSSatish Balay {
570f8f52c7dSSatish Balay   MPIUNI_Memcpy(name,"localhost",9*sizeof(char));
571f8f52c7dSSatish Balay   *result_len = 9;
572f8f52c7dSSatish Balay   *ierr       = MPI_SUCCESS;
573f8f52c7dSSatish Balay }
574f8f52c7dSSatish Balay 
575fa375c27SSatish Balay PETSC_EXTERN void PETSC_STDCALL  mpi_initialized_(int *flag,int *ierr)
576f8f52c7dSSatish Balay {
577f8f52c7dSSatish Balay   *flag = MPI_was_initialized;
578f8f52c7dSSatish Balay   *ierr = MPI_SUCCESS;
579f8f52c7dSSatish Balay }
580f8f52c7dSSatish Balay 
581fa375c27SSatish Balay PETSC_EXTERN void PETSC_STDCALL  mpi_iprobe_(int *source,int *tag,int *comm,int *glag,int *status,int *ierr)
582f8f52c7dSSatish Balay {
583f8f52c7dSSatish Balay   *ierr = MPI_SUCCESS;
584f8f52c7dSSatish Balay }
585f8f52c7dSSatish Balay 
586fa375c27SSatish Balay PETSC_EXTERN void PETSC_STDCALL  mpi_probe_(int *source,int *tag,int *comm,int *flag,int *status,int *ierr)
587f8f52c7dSSatish Balay {
588f8f52c7dSSatish Balay   *ierr = MPI_SUCCESS;
589f8f52c7dSSatish Balay }
590f8f52c7dSSatish Balay 
591fa375c27SSatish Balay PETSC_EXTERN void PETSC_STDCALL  mpi_request_free_(int *request,int *ierr)
592f8f52c7dSSatish Balay {
593f8f52c7dSSatish Balay   *ierr = MPI_SUCCESS;
594f8f52c7dSSatish Balay }
595f8f52c7dSSatish Balay 
596fa375c27SSatish Balay PETSC_EXTERN void PETSC_STDCALL  mpi_ssend_(void *buf,int *count,int *datatype,int *dest,int *tag,int *comm,int *ierr)
597f8f52c7dSSatish Balay {
598f8f52c7dSSatish Balay   *ierr = MPI_Abort(MPI_COMM_WORLD,0);
599f8f52c7dSSatish Balay }
600f8f52c7dSSatish Balay 
601fa375c27SSatish Balay PETSC_EXTERN void PETSC_STDCALL  mpi_wait_(int *request,int *status,int *ierr)
602f8f52c7dSSatish Balay {
603f8f52c7dSSatish Balay   *ierr = MPI_SUCCESS;
604156bc490SSatish Balay }
605156bc490SSatish Balay 
606fa375c27SSatish Balay PETSC_EXTERN void PETSC_STDCALL  mpi_comm_group_(int *comm,int *group,int *ierr)
607d4816372SSatish Balay {
608d4816372SSatish Balay   *ierr = MPI_SUCCESS;
609d4816372SSatish Balay }
610d4816372SSatish Balay 
611fa375c27SSatish Balay PETSC_EXTERN void PETSC_STDCALL  mpi_exscan_(void *sendbuf,void *recvbuf,int *count,int *datatype,int *op,int *comm,int *ierr)
612d4816372SSatish Balay {
613d4816372SSatish Balay   *ierr = MPI_SUCCESS;
614d4816372SSatish Balay }
615d4816372SSatish Balay 
616c8217ed5SSatish Balay #endif /* MPIUNI_AVOID_MPI_NAMESPACE */
617c8217ed5SSatish Balay 
618e5c89e4eSSatish Balay #if defined(__cplusplus)
619e5c89e4eSSatish Balay }
620e5c89e4eSSatish Balay #endif
621