1e5c89e4eSSatish Balay /* 2e5c89e4eSSatish Balay This provides a few of the MPI-uni functions that cannot be implemented 3e5c89e4eSSatish Balay with C macros 4e5c89e4eSSatish Balay */ 5e5c89e4eSSatish Balay #include "include/mpiuni/mpi.h" 6e5c89e4eSSatish Balay 7e5c89e4eSSatish Balay #if defined(PETSC_HAVE_STDLIB_H) 8e5c89e4eSSatish Balay #include <stdlib.h> 9e5c89e4eSSatish Balay #endif 10e5c89e4eSSatish Balay 11e5c89e4eSSatish Balay #define MPI_SUCCESS 0 12e5c89e4eSSatish Balay #define MPI_FAILURE 1 13e5c89e4eSSatish Balay void *MPIUNI_TMP = 0; 14e5c89e4eSSatish Balay int MPIUNI_DATASIZE[5] = { sizeof(int),sizeof(float),sizeof(double),2*sizeof(double),sizeof(char)}; 15e5c89e4eSSatish Balay /* 16e5c89e4eSSatish Balay With MPI Uni there is only one communicator, which is called 1. 17e5c89e4eSSatish Balay */ 18e5c89e4eSSatish Balay #define MAX_ATTR 128 19e5c89e4eSSatish Balay 20e5c89e4eSSatish Balay typedef struct { 21e5c89e4eSSatish Balay void *extra_state; 22e5c89e4eSSatish Balay void *attribute_val; 23e5c89e4eSSatish Balay int active; 24e5c89e4eSSatish Balay MPI_Delete_function *del; 25e5c89e4eSSatish Balay } MPI_Attr; 26e5c89e4eSSatish Balay 27e5c89e4eSSatish Balay static MPI_Attr attr[MAX_ATTR]; 28e5c89e4eSSatish Balay static int num_attr = 1,mpi_tag_ub = 100000000; 29e5c89e4eSSatish Balay 30e5c89e4eSSatish Balay #if defined(__cplusplus) 31e5c89e4eSSatish Balay extern "C" { 32e5c89e4eSSatish Balay #endif 33e5c89e4eSSatish Balay 34e5c89e4eSSatish Balay /* 35e5c89e4eSSatish Balay To avoid problems with prototypes to the system memcpy() it is duplicated here 36e5c89e4eSSatish Balay */ 37e5c89e4eSSatish Balay int MPIUNI_Memcpy(void *a,const void* b,int n) { 38e5c89e4eSSatish Balay int i; 39e5c89e4eSSatish Balay char *aa= (char*)a; 40e5c89e4eSSatish Balay char *bb= (char*)b; 41e5c89e4eSSatish Balay 42e5c89e4eSSatish Balay for (i=0; i<n; i++) aa[i] = bb[i]; 43e5c89e4eSSatish Balay return 0; 44e5c89e4eSSatish Balay } 45e5c89e4eSSatish Balay 46e5c89e4eSSatish Balay /* 47e5c89e4eSSatish Balay Used to set the built-in MPI_TAG_UB attribute 48e5c89e4eSSatish Balay */ 49e5c89e4eSSatish Balay static int Keyval_setup(void) 50e5c89e4eSSatish Balay { 51e5c89e4eSSatish Balay attr[0].active = 1; 52e5c89e4eSSatish Balay attr[0].attribute_val = &mpi_tag_ub; 53e5c89e4eSSatish Balay return 0; 54e5c89e4eSSatish Balay } 55e5c89e4eSSatish Balay 56e5c89e4eSSatish Balay /* 57e5c89e4eSSatish Balay These functions are mapped to the Petsc_ name by ./mpi.h 58e5c89e4eSSatish Balay */ 59e5c89e4eSSatish Balay int Petsc_MPI_Keyval_create(MPI_Copy_function *copy_fn,MPI_Delete_function *delete_fn,int *keyval,void *extra_state) 60e5c89e4eSSatish Balay { 61e5c89e4eSSatish Balay if (num_attr >= MAX_ATTR) MPI_Abort(MPI_COMM_WORLD,1); 62e5c89e4eSSatish Balay 63e5c89e4eSSatish Balay attr[num_attr].extra_state = extra_state; 64e5c89e4eSSatish Balay attr[num_attr].del = delete_fn; 65e5c89e4eSSatish Balay *keyval = num_attr++; 66e5c89e4eSSatish Balay return 0; 67e5c89e4eSSatish Balay } 68e5c89e4eSSatish Balay 69e5c89e4eSSatish Balay int Petsc_MPI_Keyval_free(int *keyval) 70e5c89e4eSSatish Balay { 71e5c89e4eSSatish Balay attr[*keyval].active = 0; 72e5c89e4eSSatish Balay return MPI_SUCCESS; 73e5c89e4eSSatish Balay } 74e5c89e4eSSatish Balay 75e5c89e4eSSatish Balay int Petsc_MPI_Attr_put(MPI_Comm comm,int keyval,void *attribute_val) 76e5c89e4eSSatish Balay { 77e5c89e4eSSatish Balay attr[keyval].active = 1; 78e5c89e4eSSatish Balay attr[keyval].attribute_val = attribute_val; 79e5c89e4eSSatish Balay return MPI_SUCCESS; 80e5c89e4eSSatish Balay } 81e5c89e4eSSatish Balay 82e5c89e4eSSatish Balay int Petsc_MPI_Attr_delete(MPI_Comm comm,int keyval) 83e5c89e4eSSatish Balay { 84e5c89e4eSSatish Balay if (attr[keyval].active && attr[keyval].del) { 85e5c89e4eSSatish Balay (*(attr[keyval].del))(comm,keyval,attr[keyval].attribute_val,attr[keyval].extra_state); 86e5c89e4eSSatish Balay } 87e5c89e4eSSatish Balay attr[keyval].active = 0; 88e5c89e4eSSatish Balay attr[keyval].attribute_val = 0; 89e5c89e4eSSatish Balay return MPI_SUCCESS; 90e5c89e4eSSatish Balay } 91e5c89e4eSSatish Balay 92e5c89e4eSSatish Balay int Petsc_MPI_Attr_get(MPI_Comm comm,int keyval,void *attribute_val,int *flag) 93e5c89e4eSSatish Balay { 94e5c89e4eSSatish Balay if (!keyval) Keyval_setup(); 95e5c89e4eSSatish Balay *flag = attr[keyval].active; 96a98fc643SBarry Smith *(void **)attribute_val = attr[keyval].attribute_val; 97e5c89e4eSSatish Balay return MPI_SUCCESS; 98e5c89e4eSSatish Balay } 99e5c89e4eSSatish Balay 100e5c89e4eSSatish Balay static int dups = 0; 101e5c89e4eSSatish Balay int Petsc_MPI_Comm_dup(MPI_Comm comm,MPI_Comm *out) 102e5c89e4eSSatish Balay { 103e5c89e4eSSatish Balay *out = comm; 104e5c89e4eSSatish Balay dups++; 105e5c89e4eSSatish Balay return 0; 106e5c89e4eSSatish Balay } 107e5c89e4eSSatish Balay 108e5c89e4eSSatish Balay int Petsc_MPI_Comm_free(MPI_Comm *comm) 109e5c89e4eSSatish Balay { 110e5c89e4eSSatish Balay int i; 111e5c89e4eSSatish Balay 112e5c89e4eSSatish Balay if (--dups) return MPI_SUCCESS; 113e5c89e4eSSatish Balay for (i=0; i<num_attr; i++) { 114e5c89e4eSSatish Balay if (attr[i].active && attr[i].del) { 115e5c89e4eSSatish Balay (*attr[i].del)(*comm,i,attr[i].attribute_val,attr[i].extra_state); 116e5c89e4eSSatish Balay } 117e5c89e4eSSatish Balay attr[i].active = 0; 118e5c89e4eSSatish Balay } 119e5c89e4eSSatish Balay return MPI_SUCCESS; 120e5c89e4eSSatish Balay } 121e5c89e4eSSatish Balay 122e5c89e4eSSatish Balay /* --------------------------------------------------------------------------*/ 123e5c89e4eSSatish Balay 124e5c89e4eSSatish Balay int Petsc_MPI_Abort(MPI_Comm comm,int errorcode) 125e5c89e4eSSatish Balay { 126e5c89e4eSSatish Balay abort(); 127e5c89e4eSSatish Balay return MPI_SUCCESS; 128e5c89e4eSSatish Balay } 129e5c89e4eSSatish Balay 130e5c89e4eSSatish Balay static int MPI_was_initialized = 0; 131e5c89e4eSSatish Balay 132e5c89e4eSSatish Balay int Petsc_MPI_Initialized(int *flag) 133e5c89e4eSSatish Balay { 134e5c89e4eSSatish Balay *flag = MPI_was_initialized; 135e5c89e4eSSatish Balay return 0; 136e5c89e4eSSatish Balay } 137e5c89e4eSSatish Balay 138e5c89e4eSSatish Balay int Petsc_MPI_Finalize(void) 139e5c89e4eSSatish Balay { 140e5c89e4eSSatish Balay MPI_was_initialized = 0; 141e5c89e4eSSatish Balay return 0; 142e5c89e4eSSatish Balay } 143e5c89e4eSSatish Balay 144e5c89e4eSSatish Balay /* ------------------- Fortran versions of several routines ------------------ */ 145e5c89e4eSSatish Balay 146f7c6e6aaSSatish Balay #if defined(PETSC_HAVE_FORTRAN_CAPS) 147f7c6e6aaSSatish Balay #define mpi_init_ MPI_INIT 148f7c6e6aaSSatish Balay #define mpi_finalize_ MPI_FINALIZE 149f7c6e6aaSSatish Balay #define mpi_comm_size_ MPI_COMM_SIZE 150f7c6e6aaSSatish Balay #define mpi_comm_rank_ MPI_COMM_RANK 151f7c6e6aaSSatish Balay #define mpi_abort_ MPI_ABORT 152f7c6e6aaSSatish Balay #define mpi_allreduce_ MPI_ALLREDUCE 153f7c6e6aaSSatish Balay #define mpi_barrier_ MPI_BARRIER 154f7c6e6aaSSatish Balay #define mpi_bcast_ MPI_BCAST 155f7c6e6aaSSatish Balay #define mpi_gather_ MPI_GATHER 156f7c6e6aaSSatish Balay #define mpi_allgather_ MPI_ALLGATHER 15704ab3e84SSatish Balay #define mpi_comm_split_ MPI_COMM_SPLIT 158f7c6e6aaSSatish Balay #elif !defined(PETSC_HAVE_FORTRAN_UNDERSCORE) 159f7c6e6aaSSatish Balay #define mpi_init_ mpi_init 160f7c6e6aaSSatish Balay #define mpi_finalize_ mpi_finalize 161f7c6e6aaSSatish Balay #define mpi_comm_size_ mpi_comm_size 162f7c6e6aaSSatish Balay #define mpi_comm_rank_ mpi_comm_rank 163f7c6e6aaSSatish Balay #define mpi_abort_ mpi_abort 164f7c6e6aaSSatish Balay #define mpi_allreduce_ mpi_allreduce 165f7c6e6aaSSatish Balay #define mpi_barrier_ mpi_barrier 166f7c6e6aaSSatish Balay #define mpi_bcast_ mpi_bcast 167f7c6e6aaSSatish Balay #define mpi_gather_ mpi_gather 168f7c6e6aaSSatish Balay #define mpi_allgather_ mpi_allgather 16904ab3e84SSatish Balay #define mpi_comm_split_ mpi_comm_split 170f7c6e6aaSSatish Balay #endif 171e5c89e4eSSatish Balay 172f7c6e6aaSSatish Balay #if defined(PETSC_HAVE_FORTRAN_UNDERSCORE_UNDERSCORE) 173f7c6e6aaSSatish Balay #define mpi_init_ mpi_init__ 174f7c6e6aaSSatish Balay #define mpi_finalize_ mpi_finalize__ 175f7c6e6aaSSatish Balay #define mpi_comm_size_ mpi_comm_size__ 176f7c6e6aaSSatish Balay #define mpi_comm_rank_ mpi_comm_rank__ 177f7c6e6aaSSatish Balay #define mpi_abort_ mpi_abort__ 178f7c6e6aaSSatish Balay #define mpi_allreduce_ mpi_allreduce__ 179f7c6e6aaSSatish Balay #define mpi_barrier_ mpi_barrier__ 180f7c6e6aaSSatish Balay #define mpi_bcast_ mpi_bcast__ 181f7c6e6aaSSatish Balay #define mpi_gather_ mpi_gather__ 182f7c6e6aaSSatish Balay #define mpi_allgather_ mpi_allgather__ 18304ab3e84SSatish Balay #define mpi_comm_split_ mpi_comm_split__ 184f7c6e6aaSSatish Balay #endif 185e5c89e4eSSatish Balay 18669bb7ac9SSatish Balay void PETSC_STDCALL mpi_init_(int *ierr) 187e5c89e4eSSatish Balay { 188e5c89e4eSSatish Balay MPI_was_initialized = 1; 189e5c89e4eSSatish Balay *ierr = MPI_SUCCESS; 190e5c89e4eSSatish Balay } 191e5c89e4eSSatish Balay 19269bb7ac9SSatish Balay void PETSC_STDCALL mpi_finalize_(int *ierr) 193e5c89e4eSSatish Balay { 194e5c89e4eSSatish Balay *ierr = MPI_SUCCESS; 195e5c89e4eSSatish Balay } 196e5c89e4eSSatish Balay 19769bb7ac9SSatish Balay void PETSC_STDCALL mpi_comm_size_(MPI_Comm *comm,int *size,int *ierr) 198e5c89e4eSSatish Balay { 199e5c89e4eSSatish Balay *size = 1; 200e5c89e4eSSatish Balay *ierr = 0; 201e5c89e4eSSatish Balay } 202e5c89e4eSSatish Balay 20369bb7ac9SSatish Balay void PETSC_STDCALL mpi_comm_rank_(MPI_Comm *comm,int *rank,int *ierr) 204e5c89e4eSSatish Balay { 205e5c89e4eSSatish Balay *rank=0; 206e5c89e4eSSatish Balay *ierr=MPI_SUCCESS; 207e5c89e4eSSatish Balay } 208e5c89e4eSSatish Balay 209*dd46ca73SSatish Balay void PETSC_STDCALL mpi_comm_split_(MPI_Comm *comm,int *color,int *key, MPI_Comm *newcomm, int *ierr) 2101f6cc5b2SSatish Balay { 2111f6cc5b2SSatish Balay *newcomm = *comm; 2121f6cc5b2SSatish Balay *ierr=MPI_SUCCESS; 2131f6cc5b2SSatish Balay } 2141f6cc5b2SSatish Balay 21569bb7ac9SSatish Balay void PETSC_STDCALL mpi_abort_(MPI_Comm *comm,int *errorcode,int *ierr) 216e5c89e4eSSatish Balay { 217e5c89e4eSSatish Balay abort(); 218e5c89e4eSSatish Balay *ierr = MPI_SUCCESS; 219e5c89e4eSSatish Balay } 220e5c89e4eSSatish Balay 22169bb7ac9SSatish Balay void PETSC_STDCALL mpi_allreduce_(void *sendbuf,void *recvbuf,int *count,int *datatype,int *op,int *comm,int *ierr) 222e5c89e4eSSatish Balay { 223e5c89e4eSSatish Balay MPIUNI_Memcpy(recvbuf,sendbuf,(*count)*MPIUNI_DATASIZE[*datatype]); 224e5c89e4eSSatish Balay *ierr = MPI_SUCCESS; 225e5c89e4eSSatish Balay } 226e5c89e4eSSatish Balay 22769bb7ac9SSatish Balay void PETSC_STDCALL mpi_barrier_(MPI_Comm *comm,int *ierr) 228e5c89e4eSSatish Balay { 229e5c89e4eSSatish Balay *ierr = MPI_SUCCESS; 230e5c89e4eSSatish Balay } 231f7c6e6aaSSatish Balay 23269bb7ac9SSatish Balay void PETSC_STDCALL mpi_bcast_(void *buf,int *count,int *datatype,int *root,int *comm,int *ierr) 233e5c89e4eSSatish Balay { 234e5c89e4eSSatish Balay *ierr = MPI_SUCCESS; 235e5c89e4eSSatish Balay } 236f7c6e6aaSSatish Balay 237f7c6e6aaSSatish Balay 23869bb7ac9SSatish Balay void PETSC_STDCALL mpi_gather_(void *sendbuf,int *scount,int *sdatatype, void* recvbuf, int* rcount, int* rdatatype, int *root,int *comm,int *ierr) 239e5c89e4eSSatish Balay { 240f7c6e6aaSSatish Balay MPIUNI_Memcpy(recvbuf,sendbuf,(*scount)*MPIUNI_DATASIZE[*sdatatype]); 241f7c6e6aaSSatish Balay *ierr = MPI_SUCCESS; 242f7c6e6aaSSatish Balay } 243f7c6e6aaSSatish Balay 244f7c6e6aaSSatish Balay 24569bb7ac9SSatish Balay void PETSC_STDCALL mpi_allgather_(void *sendbuf,int *scount,int *sdatatype, void* recvbuf, int* rcount, int* rdatatype,int *comm,int *ierr) 246f7c6e6aaSSatish Balay { 247f7c6e6aaSSatish Balay MPIUNI_Memcpy(recvbuf,sendbuf,(*scount)*MPIUNI_DATASIZE[*sdatatype]); 248e5c89e4eSSatish Balay *ierr = MPI_SUCCESS; 249e5c89e4eSSatish Balay } 250e5c89e4eSSatish Balay 251e5c89e4eSSatish Balay #if defined(__cplusplus) 252e5c89e4eSSatish Balay } 253e5c89e4eSSatish Balay #endif 254e5c89e4eSSatish Balay 255e5c89e4eSSatish Balay 256