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