xref: /petsc/src/sys/mpiuni/mpi.c (revision 46651e72798c4246bb21523be095c828a0fe92ef)
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
124423d37eSSatish Balay #include <stdio.h>
13e5c89e4eSSatish Balay #if defined(PETSC_HAVE_STDLIB_H)
14e5c89e4eSSatish Balay #include <stdlib.h>
15e5c89e4eSSatish Balay #endif
16e5c89e4eSSatish Balay 
17e5c89e4eSSatish Balay #define MPI_SUCCESS 0
18e5c89e4eSSatish Balay #define MPI_FAILURE 1
19e5c89e4eSSatish Balay void    *MPIUNI_TMP        = 0;
20f65d6f8aSSatish 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)};
21e5c89e4eSSatish Balay /*
22e5c89e4eSSatish Balay        With MPI Uni there is only one communicator, which is called 1.
23e5c89e4eSSatish Balay */
24e5c89e4eSSatish Balay #define MAX_ATTR 128
25e5c89e4eSSatish Balay 
26e5c89e4eSSatish Balay typedef struct {
27e5c89e4eSSatish Balay   void                *attribute_val;
28e5c89e4eSSatish Balay   int                 active;
29e5c89e4eSSatish Balay } MPI_Attr;
30e5c89e4eSSatish Balay 
31*46651e72SBarry Smith typedef struct {
32*46651e72SBarry Smith   void                *extra_state;
33*46651e72SBarry Smith   MPI_Delete_function *del;
34*46651e72SBarry Smith } MPI_Attr_keyval;
35*46651e72SBarry Smith 
36*46651e72SBarry Smith static MPI_Attr_keyval attr_keyval[MAX_ATTR];
37e5c89e4eSSatish Balay static MPI_Attr        attr[MAX_ATTR];
38e5c89e4eSSatish Balay static int             num_attr = 1,mpi_tag_ub = 100000000;
39e5c89e4eSSatish Balay 
40e5c89e4eSSatish Balay #if defined(__cplusplus)
41e5c89e4eSSatish Balay extern "C" {
42e5c89e4eSSatish Balay #endif
43e5c89e4eSSatish Balay 
44e5c89e4eSSatish Balay /*
45e5c89e4eSSatish Balay    To avoid problems with prototypes to the system memcpy() it is duplicated here
46e5c89e4eSSatish Balay */
47e5c89e4eSSatish Balay int MPIUNI_Memcpy(void *a,const void* b,int n) {
48e5c89e4eSSatish Balay   int  i;
49e5c89e4eSSatish Balay   char *aa= (char*)a;
50e5c89e4eSSatish Balay   char *bb= (char*)b;
51e5c89e4eSSatish Balay 
5299839c1eSBarry Smith   if (b == MPI_IN_PLACE) return 0;
53e5c89e4eSSatish Balay   for (i=0; i<n; i++) aa[i] = bb[i];
54e5c89e4eSSatish Balay   return 0;
55e5c89e4eSSatish Balay }
56e5c89e4eSSatish Balay 
57e5c89e4eSSatish Balay /*
58e5c89e4eSSatish Balay    Used to set the built-in MPI_TAG_UB attribute
59e5c89e4eSSatish Balay */
60e5c89e4eSSatish Balay static int Keyval_setup(void)
61e5c89e4eSSatish Balay {
62e5c89e4eSSatish Balay   attr[0].active        = 1;
63e5c89e4eSSatish Balay   attr[0].attribute_val = &mpi_tag_ub;
64e5c89e4eSSatish Balay   return 0;
65e5c89e4eSSatish Balay }
66e5c89e4eSSatish Balay 
67c8217ed5SSatish Balay int MPI_Keyval_create(MPI_Copy_function *copy_fn,MPI_Delete_function *delete_fn,int *keyval,void *extra_state)
68e5c89e4eSSatish Balay {
69e5c89e4eSSatish Balay   if (num_attr >= MAX_ATTR) MPI_Abort(MPI_COMM_WORLD,1);
70e5c89e4eSSatish Balay 
71*46651e72SBarry Smith   attr_keyval[num_attr].extra_state = extra_state;
72*46651e72SBarry Smith   attr_keyval[num_attr].del         = delete_fn;
73e5c89e4eSSatish Balay   *keyval                           = num_attr++;
74e5c89e4eSSatish Balay   return 0;
75e5c89e4eSSatish Balay }
76e5c89e4eSSatish Balay 
77c8217ed5SSatish Balay int MPI_Keyval_free(int *keyval)
78e5c89e4eSSatish Balay {
79e5c89e4eSSatish Balay   return MPI_SUCCESS;
80e5c89e4eSSatish Balay }
81e5c89e4eSSatish Balay 
82c8217ed5SSatish Balay int MPI_Attr_put(MPI_Comm comm,int keyval,void *attribute_val)
83e5c89e4eSSatish Balay {
84e5c89e4eSSatish Balay   attr[keyval].active        = 1;
85e5c89e4eSSatish Balay   attr[keyval].attribute_val = attribute_val;
86e5c89e4eSSatish Balay   return MPI_SUCCESS;
87e5c89e4eSSatish Balay }
88e5c89e4eSSatish Balay 
89c8217ed5SSatish Balay int MPI_Attr_delete(MPI_Comm comm,int keyval)
90e5c89e4eSSatish Balay {
91*46651e72SBarry Smith   if (attr[keyval].active && attr_keyval[keyval].del) {
9240776e1bSpetsc     void* save_attribute_val   = attr[keyval].attribute_val;
93e5c89e4eSSatish Balay     attr[keyval].active        = 0;
94e5c89e4eSSatish Balay     attr[keyval].attribute_val = 0;
95*46651e72SBarry Smith     (*(attr_keyval[keyval].del))(comm,keyval,save_attribute_val,attr_keyval[keyval].extra_state);
9640776e1bSpetsc   }
97e5c89e4eSSatish Balay   return MPI_SUCCESS;
98e5c89e4eSSatish Balay }
99e5c89e4eSSatish Balay 
100c8217ed5SSatish Balay int MPI_Attr_get(MPI_Comm comm,int keyval,void *attribute_val,int *flag)
101e5c89e4eSSatish Balay {
102e5c89e4eSSatish Balay   if (!keyval) Keyval_setup();
103e5c89e4eSSatish Balay   *flag                   = attr[keyval].active;
104a98fc643SBarry Smith   *(void **)attribute_val = attr[keyval].attribute_val;
105e5c89e4eSSatish Balay   return MPI_SUCCESS;
106e5c89e4eSSatish Balay }
107e5c89e4eSSatish Balay 
10871d60426SBarry Smith static int dups = 0;
109c8217ed5SSatish Balay int MPI_Comm_create(MPI_Comm comm,MPI_Group group,MPI_Comm *newcomm)
110c8217ed5SSatish Balay {
11171d60426SBarry Smith   dups++;
112c8217ed5SSatish Balay   *newcomm =  comm;
113c8217ed5SSatish Balay   return MPI_SUCCESS;
114c8217ed5SSatish Balay }
115c8217ed5SSatish Balay 
116c8217ed5SSatish Balay int MPI_Comm_dup(MPI_Comm comm,MPI_Comm *out)
117e5c89e4eSSatish Balay {
118e5c89e4eSSatish Balay   *out = comm;
119e5c89e4eSSatish Balay   dups++;
120e5c89e4eSSatish Balay   return 0;
121e5c89e4eSSatish Balay }
122e5c89e4eSSatish Balay 
123c8217ed5SSatish Balay int MPI_Comm_free(MPI_Comm *comm)
124e5c89e4eSSatish Balay {
125e5c89e4eSSatish Balay   int i;
126e5c89e4eSSatish Balay 
127e5c89e4eSSatish Balay   if (--dups) return MPI_SUCCESS;
128e5c89e4eSSatish Balay   for (i=0; i<num_attr; i++) {
129*46651e72SBarry Smith     if (attr[i].active && attr_keyval[i].del) {
130*46651e72SBarry Smith       (*attr_keyval[i].del)(*comm,i,attr[i].attribute_val,attr_keyval[i].extra_state);
131e5c89e4eSSatish Balay     }
132e5c89e4eSSatish Balay     attr[i].active = 0;
133e5c89e4eSSatish Balay   }
134e5c89e4eSSatish Balay   return MPI_SUCCESS;
135e5c89e4eSSatish Balay }
136e5c89e4eSSatish Balay 
137d393f697SSatish Balay int MPI_Comm_size(MPI_Comm comm, int*size)
138d393f697SSatish Balay {
139d393f697SSatish Balay   *size=1;
140d393f697SSatish Balay   return MPI_SUCCESS;
141d393f697SSatish Balay }
142d393f697SSatish Balay 
143d393f697SSatish Balay int MPI_Comm_rank(MPI_Comm comm, int*rank)
144d393f697SSatish Balay {
145d393f697SSatish Balay   *rank=0;
146d393f697SSatish Balay   return MPI_SUCCESS;
147d393f697SSatish Balay }
148d393f697SSatish Balay 
149c8217ed5SSatish Balay int MPI_Abort(MPI_Comm comm,int errorcode)
150e5c89e4eSSatish Balay {
151e5c89e4eSSatish Balay   abort();
152e5c89e4eSSatish Balay   return MPI_SUCCESS;
153e5c89e4eSSatish Balay }
154e5c89e4eSSatish Balay 
15558cd72c3SLisandro Dalcin /* --------------------------------------------------------------------------*/
15658cd72c3SLisandro Dalcin 
157e5c89e4eSSatish Balay static int MPI_was_initialized = 0;
15858cd72c3SLisandro Dalcin static int MPI_was_finalized   = 0;
15958cd72c3SLisandro Dalcin 
160c8217ed5SSatish Balay int MPI_Init(int *argc, char ***argv)
16158cd72c3SLisandro Dalcin {
1628f059c70SLisandro Dalcin   if (MPI_was_initialized) return 1;
1638f059c70SLisandro Dalcin   if (MPI_was_finalized) return 1;
16458cd72c3SLisandro Dalcin   MPI_was_initialized = 1;
16558cd72c3SLisandro Dalcin   return 0;
16658cd72c3SLisandro Dalcin }
16758cd72c3SLisandro Dalcin 
168c8217ed5SSatish Balay int MPI_Finalize(void)
16958cd72c3SLisandro Dalcin {
1708f059c70SLisandro Dalcin   if (MPI_was_finalized) return 1;
1718f059c70SLisandro Dalcin   if (!MPI_was_initialized) return 1;
17258cd72c3SLisandro Dalcin   MPI_was_finalized = 1;
17358cd72c3SLisandro Dalcin   return 0;
17458cd72c3SLisandro Dalcin }
175e5c89e4eSSatish Balay 
176c8217ed5SSatish Balay int MPI_Initialized(int *flag)
177e5c89e4eSSatish Balay {
178e5c89e4eSSatish Balay   *flag = MPI_was_initialized;
179e5c89e4eSSatish Balay   return 0;
180e5c89e4eSSatish Balay }
181e5c89e4eSSatish Balay 
182c8217ed5SSatish Balay int MPI_Finalized(int *flag)
183e5c89e4eSSatish Balay {
18458cd72c3SLisandro Dalcin   *flag = MPI_was_finalized;
185e5c89e4eSSatish Balay   return 0;
186e5c89e4eSSatish Balay }
187e5c89e4eSSatish Balay 
188e5c89e4eSSatish Balay /* -------------------     Fortran versions of several routines ------------------ */
189e5c89e4eSSatish Balay 
190f7c6e6aaSSatish Balay #if defined(PETSC_HAVE_FORTRAN_CAPS)
191f7c6e6aaSSatish Balay #define mpi_init_             MPI_INIT
192f7c6e6aaSSatish Balay #define mpi_finalize_         MPI_FINALIZE
193f7c6e6aaSSatish Balay #define mpi_comm_size_        MPI_COMM_SIZE
194f7c6e6aaSSatish Balay #define mpi_comm_rank_        MPI_COMM_RANK
195f7c6e6aaSSatish Balay #define mpi_abort_            MPI_ABORT
1963b644628SSatish Balay #define mpi_reduce_           MPI_REDUCE
197f7c6e6aaSSatish Balay #define mpi_allreduce_        MPI_ALLREDUCE
198f7c6e6aaSSatish Balay #define mpi_barrier_          MPI_BARRIER
199f7c6e6aaSSatish Balay #define mpi_bcast_            MPI_BCAST
200f7c6e6aaSSatish Balay #define mpi_gather_           MPI_GATHER
201f7c6e6aaSSatish Balay #define mpi_allgather_        MPI_ALLGATHER
20204ab3e84SSatish Balay #define mpi_comm_split_       MPI_COMM_SPLIT
2033b644628SSatish Balay #define mpi_scan_             MPI_SCAN
2041086b069SSatish Balay #define mpi_send_             MPI_SEND
2051086b069SSatish Balay #define mpi_recv_             MPI_RECV
206156bc490SSatish Balay #define mpi_reduce_scatter_   MPI_REDUCE_SCATTER
207156bc490SSatish Balay #define mpi_irecv_            MPI_IRECV
208156bc490SSatish Balay #define mpi_isend_            MPI_ISEND
209156bc490SSatish Balay #define mpi_sendrecv_         MPI_SENDRECV
210156bc490SSatish Balay #define mpi_test_             MPI_TEST
211156bc490SSatish Balay #define mpi_waitall_          MPI_WAITALL
212156bc490SSatish Balay #define mpi_waitany_          MPI_WAITANY
213156bc490SSatish Balay #define mpi_allgatherv_       MPI_ALLGATHERV
214156bc490SSatish Balay #define mpi_alltoallv_        MPI_ALLTOALLV
215156bc490SSatish Balay #define mpi_comm_create_      MPI_COMM_CREATE
216156bc490SSatish Balay #define mpi_address_          MPI_ADDRESS
217156bc490SSatish Balay #define mpi_pack_             MPI_PACK
218156bc490SSatish Balay #define mpi_unpack_           MPI_UNPACK
219156bc490SSatish Balay #define mpi_pack_size_        MPI_PACK_SIZE
220156bc490SSatish Balay #define mpi_type_struct_      MPI_TYPE_STRUCT
221156bc490SSatish Balay #define mpi_type_commit_      MPI_TYPE_COMMIT
222156bc490SSatish Balay #define mpi_wtime_            MPI_WTIME
223f8f52c7dSSatish Balay #define mpi_cancel_           MPI_CANCEL
224f8f52c7dSSatish Balay #define mpi_comm_dup_         MPI_COMM_DUP
225f8f52c7dSSatish Balay #define mpi_comm_free_        MPI_COMM_FREE
226f8f52c7dSSatish Balay #define mpi_get_count_        MPI_GET_COUNT
227f8f52c7dSSatish Balay #define mpi_get_processor_name_ MPI_GET_PROCESSOR_NAME
228f8f52c7dSSatish Balay #define mpi_initialized_      MPI_INITIALIZED
229f8f52c7dSSatish Balay #define mpi_iprobe_           MPI_IPROBE
230f8f52c7dSSatish Balay #define mpi_probe_            MPI_PROBE
231f8f52c7dSSatish Balay #define mpi_request_free_     MPI_REQUEST_FREE
232f8f52c7dSSatish Balay #define mpi_ssend_            MPI_SSEND
233f8f52c7dSSatish Balay #define mpi_wait_             MPI_WAIT
234d4816372SSatish Balay #define mpi_comm_group_       MPI_COMM_GROUP
235d4816372SSatish Balay #define mpi_exscan_           MPI_EXSCAN
236f7c6e6aaSSatish Balay #elif !defined(PETSC_HAVE_FORTRAN_UNDERSCORE)
237f7c6e6aaSSatish Balay #define mpi_init_             mpi_init
238f7c6e6aaSSatish Balay #define mpi_finalize_         mpi_finalize
239f7c6e6aaSSatish Balay #define mpi_comm_size_        mpi_comm_size
240f7c6e6aaSSatish Balay #define mpi_comm_rank_        mpi_comm_rank
241f7c6e6aaSSatish Balay #define mpi_abort_            mpi_abort
2423b644628SSatish Balay #define mpi_reduce_           mpi_reduce
243f7c6e6aaSSatish Balay #define mpi_allreduce_        mpi_allreduce
244f7c6e6aaSSatish Balay #define mpi_barrier_          mpi_barrier
245f7c6e6aaSSatish Balay #define mpi_bcast_            mpi_bcast
246f7c6e6aaSSatish Balay #define mpi_gather_           mpi_gather
247f7c6e6aaSSatish Balay #define mpi_allgather_        mpi_allgather
24804ab3e84SSatish Balay #define mpi_comm_split_       mpi_comm_split
2493b644628SSatish Balay #define mpi_scan_             mpi_scan
2501086b069SSatish Balay #define mpi_send_             mpi_send
2511086b069SSatish Balay #define mpi_recv_             mpi_recv
252156bc490SSatish Balay #define mpi_reduce_scatter_   mpi_reduce_scatter
253156bc490SSatish Balay #define mpi_irecv_            mpi_irecv
254156bc490SSatish Balay #define mpi_isend_            mpi_isend
255156bc490SSatish Balay #define mpi_sendrecv_         mpi_sendrecv
256156bc490SSatish Balay #define mpi_test_             mpi_test
257156bc490SSatish Balay #define mpi_waitall_          mpi_waitall
258156bc490SSatish Balay #define mpi_waitany_          mpi_waitany
259156bc490SSatish Balay #define mpi_allgatherv_       mpi_allgatherv
260156bc490SSatish Balay #define mpi_alltoallv_        mpi_alltoallv
261156bc490SSatish Balay #define mpi_comm_create_      mpi_comm_create
262156bc490SSatish Balay #define mpi_address_          mpi_address
263156bc490SSatish Balay #define mpi_pack_             mpi_pack
264156bc490SSatish Balay #define mpi_unpack_           mpi_unpack
265156bc490SSatish Balay #define mpi_pack_size_        mpi_pack_size
266156bc490SSatish Balay #define mpi_type_struct_      mpi_type_struct
267156bc490SSatish Balay #define mpi_type_commit_      mpi_type_commit
268156bc490SSatish Balay #define mpi_wtime_            mpi_wtime
269f8f52c7dSSatish Balay #define mpi_cancel_           mpi_cancel
270f8f52c7dSSatish Balay #define mpi_comm_dup_         mpi_comm_dup
271f8f52c7dSSatish Balay #define mpi_comm_free_        mpi_comm_free
272f8f52c7dSSatish Balay #define mpi_get_count_        mpi_get_count
273f8f52c7dSSatish Balay #define mpi_get_processor_name_ mpi_get_processor_name
274f8f52c7dSSatish Balay #define mpi_initialized_      mpi_initialized
275f8f52c7dSSatish Balay #define mpi_iprobe_           mpi_iprobe
276f8f52c7dSSatish Balay #define mpi_probe_            mpi_probe
277f8f52c7dSSatish Balay #define mpi_request_free_     mpi_request_free
278f8f52c7dSSatish Balay #define mpi_ssend_            mpi_ssend
279f8f52c7dSSatish Balay #define mpi_wait_             mpi_wait
280d4816372SSatish Balay #define mpi_comm_group_       mpi_comm_group
281d4816372SSatish Balay #define mpi_exscan_           mpi_exscan
282f7c6e6aaSSatish Balay #endif
283e5c89e4eSSatish Balay 
284f7c6e6aaSSatish Balay #if defined(PETSC_HAVE_FORTRAN_UNDERSCORE_UNDERSCORE)
285f7c6e6aaSSatish Balay #define mpi_init_             mpi_init__
286f7c6e6aaSSatish Balay #define mpi_finalize_         mpi_finalize__
287f7c6e6aaSSatish Balay #define mpi_comm_size_        mpi_comm_size__
288f7c6e6aaSSatish Balay #define mpi_comm_rank_        mpi_comm_rank__
289f7c6e6aaSSatish Balay #define mpi_abort_            mpi_abort__
2903b644628SSatish Balay #define mpi_reduce_           mpi_reduce__
291f7c6e6aaSSatish Balay #define mpi_allreduce_        mpi_allreduce__
292f7c6e6aaSSatish Balay #define mpi_barrier_          mpi_barrier__
293f7c6e6aaSSatish Balay #define mpi_bcast_            mpi_bcast__
294f7c6e6aaSSatish Balay #define mpi_gather_           mpi_gather__
295f7c6e6aaSSatish Balay #define mpi_allgather_        mpi_allgather__
29604ab3e84SSatish Balay #define mpi_comm_split_       mpi_comm_split__
29739a9255cSSatish Balay #define mpi_scan_             mpi_scan__
2981086b069SSatish Balay #define mpi_send_             mpi_send__
2991086b069SSatish Balay #define mpi_recv_             mpi_recv__
300156bc490SSatish Balay #define mpi_reduce_scatter_   mpi_reduce_scatter__
301156bc490SSatish Balay #define mpi_irecv_            mpi_irecv__
302156bc490SSatish Balay #define mpi_isend_            mpi_isend__
303156bc490SSatish Balay #define mpi_sendrecv_         mpi_sendrecv__
304156bc490SSatish Balay #define mpi_test_             mpi_test__
305156bc490SSatish Balay #define mpi_waitall_          mpi_waitall__
306156bc490SSatish Balay #define mpi_waitany_          mpi_waitany__
307156bc490SSatish Balay #define mpi_allgatherv_       mpi_allgatherv__
308156bc490SSatish Balay #define mpi_alltoallv_        mpi_alltoallv__
309156bc490SSatish Balay #define mpi_comm_create_      mpi_comm_create__
310156bc490SSatish Balay #define mpi_address_          mpi_address__
311156bc490SSatish Balay #define mpi_pack_             mpi_pack__
312156bc490SSatish Balay #define mpi_unpack_           mpi_unpack__
313156bc490SSatish Balay #define mpi_pack_size_        mpi_pack_size__
314156bc490SSatish Balay #define mpi_type_struct_      mpi_type_struct__
315156bc490SSatish Balay #define mpi_type_commit_      mpi_type_commit__
316156bc490SSatish Balay #define mpi_wtime_            mpi_wtime__
317f8f52c7dSSatish Balay #define mpi_cancel_           mpi_cancel__
318f8f52c7dSSatish Balay #define mpi_comm_dup_         mpi_comm_dup__
319f8f52c7dSSatish Balay #define mpi_comm_free_        mpi_comm_free__
320f8f52c7dSSatish Balay #define mpi_get_count_        mpi_get_count__
321f8f52c7dSSatish Balay #define mpi_get_processor_name_ mpi_get_processor_name__
322f8f52c7dSSatish Balay #define mpi_initialized_      mpi_initialized__
323f8f52c7dSSatish Balay #define mpi_iprobe_           mpi_iprobe__
324f8f52c7dSSatish Balay #define mpi_probe_            mpi_probe__
325f8f52c7dSSatish Balay #define mpi_request_free_     mpi_request_free__
326f8f52c7dSSatish Balay #define mpi_ssend_            mpi_ssend__
327f8f52c7dSSatish Balay #define mpi_wait_             mpi_wait__
32839a9255cSSatish Balay #define mpi_comm_group_       mpi_comm_group__
329d4816372SSatish Balay #define mpi_exscan_           mpi_exscan__
330f7c6e6aaSSatish Balay #endif
331e5c89e4eSSatish Balay 
332c8217ed5SSatish Balay 
333c8217ed5SSatish Balay /* Do not build fortran interface if MPI namespace colision is to be avoided */
334c8217ed5SSatish Balay #if !defined(MPIUNI_AVOID_MPI_NAMESPACE)
335c8217ed5SSatish Balay 
33669bb7ac9SSatish Balay void PETSC_STDCALL  mpi_init_(int *ierr)
337e5c89e4eSSatish Balay {
338c8217ed5SSatish Balay   *ierr = MPI_Init((int*)0, (char***)0);
339e5c89e4eSSatish Balay }
340e5c89e4eSSatish Balay 
34169bb7ac9SSatish Balay void PETSC_STDCALL  mpi_finalize_(int *ierr)
342e5c89e4eSSatish Balay {
343c8217ed5SSatish Balay   *ierr = MPI_Finalize();
344e5c89e4eSSatish Balay }
345e5c89e4eSSatish Balay 
34669bb7ac9SSatish Balay void PETSC_STDCALL mpi_comm_size_(MPI_Comm *comm,int *size,int *ierr)
347e5c89e4eSSatish Balay {
348e5c89e4eSSatish Balay   *size = 1;
349e5c89e4eSSatish Balay   *ierr = 0;
350e5c89e4eSSatish Balay }
351e5c89e4eSSatish Balay 
35269bb7ac9SSatish Balay void PETSC_STDCALL mpi_comm_rank_(MPI_Comm *comm,int *rank,int *ierr)
353e5c89e4eSSatish Balay {
354e5c89e4eSSatish Balay   *rank=0;
355e5c89e4eSSatish Balay   *ierr=MPI_SUCCESS;
356e5c89e4eSSatish Balay }
357e5c89e4eSSatish Balay 
358dd46ca73SSatish Balay void PETSC_STDCALL mpi_comm_split_(MPI_Comm *comm,int *color,int *key, MPI_Comm *newcomm, int *ierr)
3591f6cc5b2SSatish Balay {
3601f6cc5b2SSatish Balay   *newcomm = *comm;
3611f6cc5b2SSatish Balay   *ierr=MPI_SUCCESS;
3621f6cc5b2SSatish Balay }
3631f6cc5b2SSatish Balay 
36469bb7ac9SSatish Balay void PETSC_STDCALL mpi_abort_(MPI_Comm *comm,int *errorcode,int *ierr)
365e5c89e4eSSatish Balay {
366e5c89e4eSSatish Balay   abort();
367e5c89e4eSSatish Balay   *ierr = MPI_SUCCESS;
368e5c89e4eSSatish Balay }
369e5c89e4eSSatish Balay 
3703b644628SSatish Balay void PETSC_STDCALL mpi_reduce_(void *sendbuf,void *recvbuf,int *count,int *datatype,int *op,int *root,int *comm,int *ierr)
3713b644628SSatish Balay {
3723b644628SSatish Balay   MPIUNI_Memcpy(recvbuf,sendbuf,(*count)*MPIUNI_DATASIZE[*datatype]);
3733b644628SSatish Balay   *ierr = MPI_SUCCESS;
3743b644628SSatish Balay }
3753b644628SSatish Balay 
37669bb7ac9SSatish Balay void PETSC_STDCALL mpi_allreduce_(void *sendbuf,void *recvbuf,int *count,int *datatype,int *op,int *comm,int *ierr)
377e5c89e4eSSatish Balay {
378e5c89e4eSSatish Balay   MPIUNI_Memcpy(recvbuf,sendbuf,(*count)*MPIUNI_DATASIZE[*datatype]);
379e5c89e4eSSatish Balay   *ierr = MPI_SUCCESS;
380e5c89e4eSSatish Balay }
381e5c89e4eSSatish Balay 
38269bb7ac9SSatish Balay void PETSC_STDCALL mpi_barrier_(MPI_Comm *comm,int *ierr)
383e5c89e4eSSatish Balay {
384e5c89e4eSSatish Balay   *ierr = MPI_SUCCESS;
385e5c89e4eSSatish Balay }
386f7c6e6aaSSatish Balay 
38769bb7ac9SSatish Balay void PETSC_STDCALL mpi_bcast_(void *buf,int *count,int *datatype,int *root,int *comm,int *ierr)
388e5c89e4eSSatish Balay {
389e5c89e4eSSatish Balay   *ierr = MPI_SUCCESS;
390e5c89e4eSSatish Balay }
391f7c6e6aaSSatish Balay 
392f7c6e6aaSSatish Balay 
39369bb7ac9SSatish Balay void PETSC_STDCALL mpi_gather_(void *sendbuf,int *scount,int *sdatatype, void* recvbuf, int* rcount, int* rdatatype, int *root,int *comm,int *ierr)
394e5c89e4eSSatish Balay {
395f7c6e6aaSSatish Balay   MPIUNI_Memcpy(recvbuf,sendbuf,(*scount)*MPIUNI_DATASIZE[*sdatatype]);
396f7c6e6aaSSatish Balay   *ierr = MPI_SUCCESS;
397f7c6e6aaSSatish Balay }
398f7c6e6aaSSatish Balay 
39969bb7ac9SSatish Balay void PETSC_STDCALL mpi_allgather_(void *sendbuf,int *scount,int *sdatatype, void* recvbuf, int* rcount, int* rdatatype,int *comm,int *ierr)
400f7c6e6aaSSatish Balay {
401f7c6e6aaSSatish Balay   MPIUNI_Memcpy(recvbuf,sendbuf,(*scount)*MPIUNI_DATASIZE[*sdatatype]);
402e5c89e4eSSatish Balay   *ierr = MPI_SUCCESS;
403e5c89e4eSSatish Balay }
404e5c89e4eSSatish Balay 
4053b644628SSatish Balay void PETSC_STDCALL mpi_scan_(void *sendbuf,void *recvbuf,int *count,int *datatype,int *op,int *comm,int *ierr)
4063b644628SSatish Balay {
4073b644628SSatish Balay   MPIUNI_Memcpy(recvbuf,sendbuf,(*count)*MPIUNI_DATASIZE[*datatype]);
4083b644628SSatish Balay   *ierr = MPI_SUCCESS;
4093b644628SSatish Balay }
4103b644628SSatish Balay 
4111086b069SSatish Balay void PETSC_STDCALL mpi_send_(void*buf,int *count,int *datatype,int *dest,int *tag,int *comm,int *ierr )
4121086b069SSatish Balay {
4134423d37eSSatish Balay   *ierr = MPI_Abort(MPI_COMM_WORLD,0);
4141086b069SSatish Balay }
4151086b069SSatish Balay 
4161086b069SSatish Balay void PETSC_STDCALL mpi_recv_(void*buf,int *count,int *datatype,int *source,int *tag,int *comm,int status,int *ierr )
4171086b069SSatish Balay {
4181086b069SSatish Balay   *ierr = MPI_Abort(MPI_COMM_WORLD,0);
4191086b069SSatish Balay }
4201086b069SSatish Balay 
421156bc490SSatish Balay void PETSC_STDCALL mpi_reduce_scatter_(void*sendbuf,void*recvbuf,int *recvcounts,int *datatype,int *op,int *comm,int *ierr)
422156bc490SSatish Balay {
423156bc490SSatish Balay   *ierr = MPI_Abort(MPI_COMM_WORLD,0);
424156bc490SSatish Balay }
425156bc490SSatish Balay 
426156bc490SSatish Balay void PETSC_STDCALL mpi_irecv_(void*buf,int *count, int *datatype, int *source, int *tag, int *comm, int *request, int *ierr)
427156bc490SSatish Balay {
428156bc490SSatish Balay   *ierr = MPI_Abort(MPI_COMM_WORLD,0);
429156bc490SSatish Balay }
430156bc490SSatish Balay 
431156bc490SSatish Balay void PETSC_STDCALL mpi_isend_(void*buf,int *count,int *datatype,int *dest,int *tag,int *comm,int *request, int *ierr)
432156bc490SSatish Balay {
433156bc490SSatish Balay   *ierr = MPI_Abort(MPI_COMM_WORLD,0);
434156bc490SSatish Balay }
435156bc490SSatish Balay 
436156bc490SSatish Balay 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)
437156bc490SSatish Balay {
438156bc490SSatish Balay   MPIUNI_Memcpy(recvbuf,sendbuf,(*sendcount)*MPIUNI_DATASIZE[*sendtype]);
439156bc490SSatish Balay   *ierr = MPI_SUCCESS;
440156bc490SSatish Balay }
441156bc490SSatish Balay 
442156bc490SSatish Balay void PETSC_STDCALL mpi_test_(int *request,int *flag,int *status,int *ierr)
443156bc490SSatish Balay {
444156bc490SSatish Balay   *ierr = MPI_Abort(MPI_COMM_WORLD,0);
445156bc490SSatish Balay }
446156bc490SSatish Balay 
447156bc490SSatish Balay void PETSC_STDCALL mpi_waitall_(int *count,int *array_of_requests,int *array_of_statuses,int *ierr)
448156bc490SSatish Balay {
449156bc490SSatish Balay   *ierr = MPI_SUCCESS;
450156bc490SSatish Balay }
451156bc490SSatish Balay 
452156bc490SSatish Balay   void PETSC_STDCALL mpi_waitany_(int *count,int *array_of_requests,int * index, int *status,int *ierr)
453156bc490SSatish Balay {
454156bc490SSatish Balay   *ierr = MPI_SUCCESS;
455156bc490SSatish Balay }
456156bc490SSatish Balay 
457156bc490SSatish Balay void PETSC_STDCALL mpi_allgatherv_(void*sendbuf,int *sendcount,int *sendtype,void*recvbuf,int *recvcounts,int *displs,int *recvtype,int *comm,int *ierr)
458156bc490SSatish Balay {
459156bc490SSatish Balay   MPIUNI_Memcpy(recvbuf,sendbuf,(*sendcount)*MPIUNI_DATASIZE[*sendtype]);
460156bc490SSatish Balay   *ierr = MPI_SUCCESS;
461156bc490SSatish Balay }
462156bc490SSatish Balay 
463156bc490SSatish Balay 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)
464156bc490SSatish Balay {
465156bc490SSatish Balay   MPIUNI_Memcpy(recvbuf,sendbuf,(*sendcounts)*MPIUNI_DATASIZE[*sendtype]);
466156bc490SSatish Balay   *ierr = MPI_SUCCESS;
467156bc490SSatish Balay }
468156bc490SSatish Balay 
469156bc490SSatish Balay void PETSC_STDCALL mpi_comm_create_(int *comm,int *group,int *newcomm,int *ierr)
470156bc490SSatish Balay {
471156bc490SSatish Balay   *newcomm =  *comm;
472156bc490SSatish Balay   *ierr = MPI_SUCCESS;
473156bc490SSatish Balay }
474156bc490SSatish Balay 
475e87984cdSSatish Balay void PETSC_STDCALL mpi_address_(void*location,MPIUNI_INTPTR *address,int *ierr)
476156bc490SSatish Balay {
477e87984cdSSatish Balay   *address =  (MPIUNI_INTPTR) location;
478156bc490SSatish Balay   *ierr = MPI_SUCCESS;
479156bc490SSatish Balay }
480156bc490SSatish Balay 
481156bc490SSatish Balay void PETSC_STDCALL mpi_pack_(void*inbuf,int *incount,int *datatype,void*outbuf,int *outsize,int *position,int *comm,int *ierr)
482156bc490SSatish Balay {
483156bc490SSatish Balay   *ierr = MPI_Abort(MPI_COMM_WORLD,0);
484156bc490SSatish Balay }
485156bc490SSatish Balay 
486156bc490SSatish Balay void PETSC_STDCALL mpi_unpack_(void*inbuf,int *insize,int *position,void*outbuf,int *outcount,int *datatype,int *comm,int *ierr)
487156bc490SSatish Balay {
488156bc490SSatish Balay   *ierr = MPI_Abort(MPI_COMM_WORLD,0);
489156bc490SSatish Balay }
490156bc490SSatish Balay 
491156bc490SSatish Balay void PETSC_STDCALL mpi_pack_size_(int *incount,int *datatype,int *comm,int *size,int *ierr)
492156bc490SSatish Balay {
493156bc490SSatish Balay   *ierr = MPI_Abort(MPI_COMM_WORLD,0);
494156bc490SSatish Balay }
495156bc490SSatish Balay 
496156bc490SSatish Balay void PETSC_STDCALL mpi_type_struct_(int *count,int *array_of_blocklengths,int * array_of_displaments,int *array_of_types,int *newtype,int *ierr)
497156bc490SSatish Balay {
498156bc490SSatish Balay   *ierr = MPI_Abort(MPI_COMM_WORLD,0);
499156bc490SSatish Balay }
500156bc490SSatish Balay 
501156bc490SSatish Balay void PETSC_STDCALL mpi_type_commit_(int *datatype,int *ierr)
502156bc490SSatish Balay {
503156bc490SSatish Balay   *ierr = MPI_SUCCESS;
504156bc490SSatish Balay }
505156bc490SSatish Balay 
506156bc490SSatish Balay double PETSC_STDCALL mpi_wtime_(void)
507156bc490SSatish Balay {
508156bc490SSatish Balay   return 0.0;
509f8f52c7dSSatish Balay }
510156bc490SSatish Balay 
511f8f52c7dSSatish Balay void PETSC_STDCALL mpi_cancel_(int *request,int *ierr)
512f8f52c7dSSatish Balay {
513f8f52c7dSSatish Balay   *ierr = MPI_SUCCESS;
514f8f52c7dSSatish Balay }
515f8f52c7dSSatish Balay 
516f8f52c7dSSatish Balay void PETSC_STDCALL mpi_comm_dup_(int *comm,int *out,int *ierr)
517f8f52c7dSSatish Balay {
518f8f52c7dSSatish Balay   *out = *comm;
519f8f52c7dSSatish Balay   *ierr = MPI_SUCCESS;
520f8f52c7dSSatish Balay }
521f8f52c7dSSatish Balay 
522f8f52c7dSSatish Balay void PETSC_STDCALL mpi_comm_free_(int *comm,int *ierr)
523f8f52c7dSSatish Balay {
524f8f52c7dSSatish Balay   *ierr = MPI_SUCCESS;
525f8f52c7dSSatish Balay }
526f8f52c7dSSatish Balay 
527f8f52c7dSSatish Balay void PETSC_STDCALL mpi_get_count_(int *status,int *datatype,int *count,int *ierr)
528f8f52c7dSSatish Balay {
529f8f52c7dSSatish Balay   *ierr = MPI_Abort(MPI_COMM_WORLD,0);
530f8f52c7dSSatish Balay }
531f8f52c7dSSatish Balay 
532ce0a2cd1SBarry Smith /* duplicate from fortranimpl.h */
533f8f52c7dSSatish Balay #if defined(PETSC_HAVE_FORTRAN_MIXED_STR_ARG)
534f8f52c7dSSatish Balay #define PETSC_MIXED_LEN(len) ,int len
535f8f52c7dSSatish Balay #define PETSC_END_LEN(len)
536f8f52c7dSSatish Balay #else
537f8f52c7dSSatish Balay #define PETSC_MIXED_LEN(len)
538f8f52c7dSSatish Balay #define PETSC_END_LEN(len)   ,int len
539f8f52c7dSSatish Balay #endif
540f8f52c7dSSatish Balay 
541f8f52c7dSSatish Balay void PETSC_STDCALL mpi_get_processor_name_(char *name PETSC_MIXED_LEN(len),int *result_len,int *ierr PETSC_END_LEN(len))
542f8f52c7dSSatish Balay {
543f8f52c7dSSatish Balay   MPIUNI_Memcpy(name,"localhost",9*sizeof(char));
544f8f52c7dSSatish Balay   *result_len = 9;
545f8f52c7dSSatish Balay   *ierr = MPI_SUCCESS;
546f8f52c7dSSatish Balay }
547f8f52c7dSSatish Balay 
548f8f52c7dSSatish Balay void PETSC_STDCALL mpi_initialized_(int *flag,int *ierr)
549f8f52c7dSSatish Balay {
550f8f52c7dSSatish Balay   *flag = MPI_was_initialized;
551f8f52c7dSSatish Balay   *ierr = MPI_SUCCESS;
552f8f52c7dSSatish Balay }
553f8f52c7dSSatish Balay 
554f8f52c7dSSatish Balay void PETSC_STDCALL mpi_iprobe_(int *source,int *tag,int *comm,int *glag,int *status,int *ierr)
555f8f52c7dSSatish Balay {
556f8f52c7dSSatish Balay   *ierr = MPI_SUCCESS;
557f8f52c7dSSatish Balay }
558f8f52c7dSSatish Balay 
559f8f52c7dSSatish Balay void PETSC_STDCALL mpi_probe_(int *source,int *tag,int *comm,int *flag,int *status,int *ierr)
560f8f52c7dSSatish Balay {
561f8f52c7dSSatish Balay   *ierr = MPI_SUCCESS;
562f8f52c7dSSatish Balay }
563f8f52c7dSSatish Balay 
564f8f52c7dSSatish Balay void PETSC_STDCALL mpi_request_free_(int *request,int *ierr)
565f8f52c7dSSatish Balay {
566f8f52c7dSSatish Balay   *ierr = MPI_SUCCESS;
567f8f52c7dSSatish Balay }
568f8f52c7dSSatish Balay 
569f8f52c7dSSatish Balay void PETSC_STDCALL mpi_ssend_(void*buf,int *count,int *datatype,int *dest,int *tag,int *comm,int *ierr)
570f8f52c7dSSatish Balay {
571f8f52c7dSSatish Balay   *ierr = MPI_Abort(MPI_COMM_WORLD,0);
572f8f52c7dSSatish Balay }
573f8f52c7dSSatish Balay 
574f8f52c7dSSatish Balay void PETSC_STDCALL mpi_wait_(int *request,int *status,int *ierr)
575f8f52c7dSSatish Balay {
576f8f52c7dSSatish Balay   *ierr = MPI_SUCCESS;
577156bc490SSatish Balay }
578156bc490SSatish Balay 
579d4816372SSatish Balay void PETSC_STDCALL mpi_comm_group_(int*comm,int*group,int *ierr)
580d4816372SSatish Balay {
581d4816372SSatish Balay   *ierr = MPI_SUCCESS;
582d4816372SSatish Balay }
583d4816372SSatish Balay 
584d4816372SSatish Balay void PETSC_STDCALL mpi_exscan_(void*sendbuf,void*recvbuf,int*count,int*datatype,int*op,int*comm,int*ierr)
585d4816372SSatish Balay {
586d4816372SSatish Balay   *ierr = MPI_SUCCESS;
587d4816372SSatish Balay }
588d4816372SSatish Balay 
589c8217ed5SSatish Balay #endif /* MPIUNI_AVOID_MPI_NAMESPACE */
590c8217ed5SSatish Balay 
591e5c89e4eSSatish Balay #if defined(__cplusplus)
592e5c89e4eSSatish Balay }
593e5c89e4eSSatish Balay #endif
594