#define MPI_ERR_DIMS 17
#define MPI_ERR_TOPOLOGY 18
#define MPI_ERR_NO_MEM 19
+#define MPI_ERR_WIN 20
#define MPI_ERRCODES_IGNORE (int *)0
#define MPI_IDENT 0
#define MPI_SIMILAR 1
#define MPI_IO 0
#define MPI_BSEND_OVERHEAD 0
+
+#define MPI_MODE_NOSTORE 0x1
+#define MPI_MODE_NOPUT 0x2
+#define MPI_MODE_NOPRECEDE 0x4
+#define MPI_MODE_NOSUCCEED 0x8
+#define MPI_MODE_NOCHECK 0x10
+
+
#define MPI_KEYVAL_INVALID 0
#define MPI_NULL_COPY_FN NULL
#define MPI_NULL_DELETE_FN NULL
#define MPI_CXX_DOUBLE_COMPLEX MPI_DATATYPE_NULL
#define MPI_CXX_LONG_DOUBLE_COMPLEX MPI_DATATYPE_NULL
-#define MPI_REAL4 MPI_DATATYPE_NULL
-#define MPI_REAL8 MPI_DATATYPE_NULL
-#define MPI_REAL16 MPI_DATATYPE_NULL
-#define MPI_COMPLEX8 MPI_DATATYPE_NULL
-#define MPI_COMPLEX16 MPI_DATATYPE_NULL
-#define MPI_COMPLEX32 MPI_DATATYPE_NULL
-#define MPI_INTEGER1 MPI_DATATYPE_NULL
-#define MPI_INTEGER2 MPI_DATATYPE_NULL
-#define MPI_INTEGER4 MPI_DATATYPE_NULL
-#define MPI_INTEGER8 MPI_DATATYPE_NULL
-#define MPI_COMPLEX MPI_DATATYPE_NULL
-#define MPI_DOUBLE_COMPLEX MPI_DATATYPE_NULL
-#define MPI_2DOUBLE_PRECISION MPI_DATATYPE_NULL
-#define MPI_REAL MPI_DATATYPE_NULL
-#define MPI_LOGICAL MPI_DATATYPE_NULL
-#define MPI_DOUBLE_PRECISION MPI_DATATYPE_NULL
-#define MPI_INTEGER MPI_DATATYPE_NULL
-
#define MPI_DISTRIBUTE_BLOCK 0
#define MPI_DISTRIBUTE_NONE 1
#define MPI_DISTRIBUTE_CYCLIC 2
#define MPI_ROOT 0
#define MPI_INFO_NULL -1
#define MPI_COMM_TYPE_SHARED 1
+#define MPI_WIN_NULL NULL
#define MPI_VERSION 1
#define MPI_SUBVERSION 1
#define MPI_LOCK_EXCLUSIVE 1
#define MPI_LOCK_SHARED 2
+// FIXME : used nowhere...
typedef enum MPIR_Combiner_enum{
MPI_COMBINER_NAMED,
MPI_COMBINER_DUP,
int count;
} MPI_Status;
+struct s_smpi_mpi_win;
+typedef struct s_smpi_mpi_win* MPI_Win;
+typedef int MPI_Info;
+
#define MPI_STATUS_IGNORE ((MPI_Status*)NULL)
#define MPI_STATUSES_IGNORE ((MPI_Status*)NULL)
XBT_PUBLIC_DATA( MPI_Datatype ) MPI_INT32_T;
XBT_PUBLIC_DATA( MPI_Datatype ) MPI_INT64_T;
XBT_PUBLIC_DATA( MPI_Datatype ) MPI_UINT8_T;
-#define MPI_BYTE MPI_UINT8_T
+XBT_PUBLIC_DATA( MPI_Datatype ) MPI_BYTE;
XBT_PUBLIC_DATA( MPI_Datatype ) MPI_UINT16_T;
XBT_PUBLIC_DATA( MPI_Datatype ) MPI_UINT32_T;
XBT_PUBLIC_DATA( MPI_Datatype ) MPI_UINT64_T;
XBT_PUBLIC_DATA(MPI_Datatype) MPI_LONG_DOUBLE_INT;
XBT_PUBLIC_DATA(MPI_Datatype) MPI_2FLOAT;
XBT_PUBLIC_DATA(MPI_Datatype) MPI_2DOUBLE;
+XBT_PUBLIC_DATA(MPI_Datatype) MPI_2LONG;//only for compatibility with Fortran
+
+XBT_PUBLIC_DATA(MPI_Datatype) MPI_REAL4;
+XBT_PUBLIC_DATA(MPI_Datatype) MPI_REAL8;
+XBT_PUBLIC_DATA(MPI_Datatype) MPI_REAL16;
+XBT_PUBLIC_DATA(MPI_Datatype) MPI_COMPLEX8;
+XBT_PUBLIC_DATA(MPI_Datatype) MPI_COMPLEX16;
+XBT_PUBLIC_DATA(MPI_Datatype) MPI_COMPLEX32;
+XBT_PUBLIC_DATA(MPI_Datatype) MPI_INTEGER1;
+XBT_PUBLIC_DATA(MPI_Datatype) MPI_INTEGER2;
+XBT_PUBLIC_DATA(MPI_Datatype) MPI_INTEGER4;
+XBT_PUBLIC_DATA(MPI_Datatype) MPI_INTEGER8;
+XBT_PUBLIC_DATA(MPI_Datatype) MPI_INTEGER16;
+
//for now we only send int values at max
#define MPI_Count int
#define MPI_COUNT MPI_INT
+//defines for fortran compatibility
+#if defined(__alpha__) || defined(__sparc64__) || defined(__x86_64__) || defined(__ia64__)
+ #define MPI_INTEGER MPI_INT
+ #define MPI_2INTEGER MPI_2INT
+ #define MPI_LOGICAL MPI_INT
+#else
+ #define MPI_INTEGER MPI_LONG
+ #define MPI_2INTEGER MPI_2LONG
+ #define MPI_LOGICAL MPI_LONG
+#endif
+
+#define MPI_COMPLEX MPI_C_FLOAT_COMPLEX
+#define MPI_DOUBLE_COMPLEX MPI_C_DOUBLE_COMPLEX
+#define MPI_LOGICAL1 MPI_UINT8_T
+#define MPI_LOGICAL2 MPI_UINT16_T
+#define MPI_LOGICAL4 MPI_UINT32_T
+#define MPI_LOGICAL8 MPI_UINT64_T
+#define MPI_2REAL MPI_2FLOAT
+#define MPI_CHARACTER MPI_CHAR
+#define MPI_DOUBLE_PRECISION MPI_DOUBLE
+#define MPI_2DOUBLE_PRECISION MPI_2DOUBLE
+
+
+
typedef void MPI_User_function(void *invec, void *inoutvec, int *len,
MPI_Datatype * datatype);
struct s_smpi_mpi_op;
XBT_PUBLIC_DATA( MPI_Op ) MPI_BAND;
XBT_PUBLIC_DATA( MPI_Op ) MPI_BOR;
XBT_PUBLIC_DATA( MPI_Op ) MPI_BXOR;
+//For accumulate
+XBT_PUBLIC_DATA( MPI_Op ) MPI_REPLACE;
struct s_smpi_mpi_topology;
typedef struct s_smpi_mpi_topology *MPI_Topology;
-
+
struct s_smpi_mpi_group;
typedef struct s_smpi_mpi_group *MPI_Group;
MPI_CALL(XBT_PUBLIC(int), MPI_Reduce_local,(void *inbuf, void *inoutbuf, int count,
MPI_Datatype datatype, MPI_Op op));
+MPI_CALL(XBT_PUBLIC(int), MPI_Win_free,( MPI_Win* win));
+MPI_CALL(XBT_PUBLIC(int), MPI_Win_create,( void *base, MPI_Aint size, int disp_unit, MPI_Info info, MPI_Comm comm, MPI_Win *win));
+MPI_CALL(XBT_PUBLIC(int), MPI_Win_set_name,(MPI_Win win, char * name));
+MPI_CALL(XBT_PUBLIC(int), MPI_Win_get_name,(MPI_Win win, char * name, int* len));
+MPI_CALL(XBT_PUBLIC(int), MPI_Win_fence,( int assert, MPI_Win win));
+
+MPI_CALL(XBT_PUBLIC(int), MPI_Get,( void *origin_addr, int origin_count, MPI_Datatype origin_datatype, int target_rank,
+ MPI_Aint target_disp, int target_count, MPI_Datatype target_datatype, MPI_Win win));
+MPI_CALL(XBT_PUBLIC(int), MPI_Put,( void *origin_addr, int origin_count, MPI_Datatype origin_datatype, int target_rank,
+ MPI_Aint target_disp, int target_count, MPI_Datatype target_datatype, MPI_Win win));
+MPI_CALL(XBT_PUBLIC(int), MPI_Accumulate,( void *origin_addr, int origin_count, MPI_Datatype origin_datatype, int target_rank,
+ MPI_Aint target_disp, int target_count, MPI_Datatype target_datatype, MPI_Op op, MPI_Win win));
+MPI_CALL(XBT_PUBLIC(int), MPI_Alloc_mem, (MPI_Aint size, MPI_Info info, void *baseptr));
+MPI_CALL(XBT_PUBLIC(int), MPI_Free_mem, (void *base));
+
+
//FIXME: these are not yet implemented
typedef void MPI_Handler_function(MPI_Comm*, int*, ...);
-typedef int MPI_Win;
-typedef int MPI_Info;
+
typedef void* MPI_Errhandler;
typedef int MPI_Copy_function(MPI_Comm oldcomm, int keyval, void* extra_state, void* attribute_val_in,
MPI_CALL(XBT_PUBLIC(int), MPI_Dims_create, (int nnodes, int ndims, int* dims));
MPI_CALL(XBT_PUBLIC(int), MPI_Initialized, (int* flag));
MPI_CALL(XBT_PUBLIC(int), MPI_Pcontrol, (const int level ));
-MPI_CALL(XBT_PUBLIC(int), MPI_Win_fence,( int assert, MPI_Win win));
-MPI_CALL(XBT_PUBLIC(int), MPI_Win_free,( MPI_Win* win));
-MPI_CALL(XBT_PUBLIC(int), MPI_Win_create,( void *base, MPI_Aint size, int disp_unit, MPI_Info info, MPI_Comm comm, MPI_Win *win));
+
MPI_CALL(XBT_PUBLIC(int), MPI_Info_create,( MPI_Info *info));
MPI_CALL(XBT_PUBLIC(int), MPI_Info_set,( MPI_Info info, char *key, char *value));
MPI_CALL(XBT_PUBLIC(int), MPI_Info_get,(MPI_Info info,char *key,int valuelen, char *value, int *flag));
MPI_CALL(XBT_PUBLIC(int), MPI_Info_get_nthkey,( MPI_Info info, int n, char *key));
MPI_CALL(XBT_PUBLIC(int), MPI_Info_get_valuelen,( MPI_Info info, char *key, int *valuelen, int *flag));
-MPI_CALL(XBT_PUBLIC(int), MPI_Get,( void *origin_addr, int origin_count, MPI_Datatype origin_datatype, int target_rank,
- MPI_Aint target_disp, int target_count, MPI_Datatype target_datatype, MPI_Win win));
+
+MPI_CALL(XBT_PUBLIC(int), MPI_Win_set_errhandler, (MPI_Win win, MPI_Errhandler errhandler));
MPI_CALL(XBT_PUBLIC(int), MPI_Type_get_envelope,(MPI_Datatype datatype,int *num_integers,int *num_addresses,int *num_datatypes, int *combiner));
MPI_CALL(XBT_PUBLIC(int), MPI_Type_get_contents,(MPI_Datatype datatype, int max_integers, int max_addresses,
int max_datatypes, int* array_of_integers, MPI_Aint* array_of_addresses,