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" 678401e0eSSatish 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 int Petsc_MPI_Abort(MPI_Comm comm,int errorcode) 124e5c89e4eSSatish Balay { 125e5c89e4eSSatish Balay abort(); 126e5c89e4eSSatish Balay return MPI_SUCCESS; 127e5c89e4eSSatish Balay } 128e5c89e4eSSatish Balay 129*58cd72c3SLisandro Dalcin /* --------------------------------------------------------------------------*/ 130*58cd72c3SLisandro Dalcin 131e5c89e4eSSatish Balay static int MPI_was_initialized = 0; 132*58cd72c3SLisandro Dalcin static int MPI_was_finalized = 0; 133*58cd72c3SLisandro Dalcin 134*58cd72c3SLisandro Dalcin int Petsc_MPI_Init(int *argc, char ***argv) 135*58cd72c3SLisandro Dalcin { 136*58cd72c3SLisandro Dalcin MPI_was_initialized = 1; 137*58cd72c3SLisandro Dalcin return 0; 138*58cd72c3SLisandro Dalcin } 139*58cd72c3SLisandro Dalcin 140*58cd72c3SLisandro Dalcin int Petsc_MPI_Finalize(void) 141*58cd72c3SLisandro Dalcin { 142*58cd72c3SLisandro Dalcin MPI_was_finalized = 1; 143*58cd72c3SLisandro Dalcin return 0; 144*58cd72c3SLisandro Dalcin } 145e5c89e4eSSatish Balay 146e5c89e4eSSatish Balay int Petsc_MPI_Initialized(int *flag) 147e5c89e4eSSatish Balay { 148e5c89e4eSSatish Balay *flag = MPI_was_initialized; 149e5c89e4eSSatish Balay return 0; 150e5c89e4eSSatish Balay } 151e5c89e4eSSatish Balay 152*58cd72c3SLisandro Dalcin int Petsc_MPI_Finalized(int *flag) 153e5c89e4eSSatish Balay { 154*58cd72c3SLisandro Dalcin *flag = MPI_was_finalized; 155e5c89e4eSSatish Balay return 0; 156e5c89e4eSSatish Balay } 157e5c89e4eSSatish Balay 158e5c89e4eSSatish Balay /* ------------------- Fortran versions of several routines ------------------ */ 159e5c89e4eSSatish Balay 160f7c6e6aaSSatish Balay #if defined(PETSC_HAVE_FORTRAN_CAPS) 161f7c6e6aaSSatish Balay #define mpi_init_ MPI_INIT 162f7c6e6aaSSatish Balay #define mpi_finalize_ MPI_FINALIZE 163f7c6e6aaSSatish Balay #define mpi_comm_size_ MPI_COMM_SIZE 164f7c6e6aaSSatish Balay #define mpi_comm_rank_ MPI_COMM_RANK 165f7c6e6aaSSatish Balay #define mpi_abort_ MPI_ABORT 166f7c6e6aaSSatish Balay #define mpi_allreduce_ MPI_ALLREDUCE 167f7c6e6aaSSatish Balay #define mpi_barrier_ MPI_BARRIER 168f7c6e6aaSSatish Balay #define mpi_bcast_ MPI_BCAST 169f7c6e6aaSSatish Balay #define mpi_gather_ MPI_GATHER 170f7c6e6aaSSatish Balay #define mpi_allgather_ MPI_ALLGATHER 17104ab3e84SSatish Balay #define mpi_comm_split_ MPI_COMM_SPLIT 172f7c6e6aaSSatish Balay #elif !defined(PETSC_HAVE_FORTRAN_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 186f7c6e6aaSSatish Balay #if defined(PETSC_HAVE_FORTRAN_UNDERSCORE_UNDERSCORE) 187f7c6e6aaSSatish Balay #define mpi_init_ mpi_init__ 188f7c6e6aaSSatish Balay #define mpi_finalize_ mpi_finalize__ 189f7c6e6aaSSatish Balay #define mpi_comm_size_ mpi_comm_size__ 190f7c6e6aaSSatish Balay #define mpi_comm_rank_ mpi_comm_rank__ 191f7c6e6aaSSatish Balay #define mpi_abort_ mpi_abort__ 192f7c6e6aaSSatish Balay #define mpi_allreduce_ mpi_allreduce__ 193f7c6e6aaSSatish Balay #define mpi_barrier_ mpi_barrier__ 194f7c6e6aaSSatish Balay #define mpi_bcast_ mpi_bcast__ 195f7c6e6aaSSatish Balay #define mpi_gather_ mpi_gather__ 196f7c6e6aaSSatish Balay #define mpi_allgather_ mpi_allgather__ 19704ab3e84SSatish Balay #define mpi_comm_split_ mpi_comm_split__ 198f7c6e6aaSSatish Balay #endif 199e5c89e4eSSatish Balay 20069bb7ac9SSatish Balay void PETSC_STDCALL mpi_init_(int *ierr) 201e5c89e4eSSatish Balay { 202e5c89e4eSSatish Balay MPI_was_initialized = 1; 203e5c89e4eSSatish Balay *ierr = MPI_SUCCESS; 204e5c89e4eSSatish Balay } 205e5c89e4eSSatish Balay 20669bb7ac9SSatish Balay void PETSC_STDCALL mpi_finalize_(int *ierr) 207e5c89e4eSSatish Balay { 208*58cd72c3SLisandro Dalcin MPI_was_finalized = 1; 209e5c89e4eSSatish Balay *ierr = MPI_SUCCESS; 210e5c89e4eSSatish Balay } 211e5c89e4eSSatish Balay 21269bb7ac9SSatish Balay void PETSC_STDCALL mpi_comm_size_(MPI_Comm *comm,int *size,int *ierr) 213e5c89e4eSSatish Balay { 214e5c89e4eSSatish Balay *size = 1; 215e5c89e4eSSatish Balay *ierr = 0; 216e5c89e4eSSatish Balay } 217e5c89e4eSSatish Balay 21869bb7ac9SSatish Balay void PETSC_STDCALL mpi_comm_rank_(MPI_Comm *comm,int *rank,int *ierr) 219e5c89e4eSSatish Balay { 220e5c89e4eSSatish Balay *rank=0; 221e5c89e4eSSatish Balay *ierr=MPI_SUCCESS; 222e5c89e4eSSatish Balay } 223e5c89e4eSSatish Balay 224dd46ca73SSatish Balay void PETSC_STDCALL mpi_comm_split_(MPI_Comm *comm,int *color,int *key, MPI_Comm *newcomm, int *ierr) 2251f6cc5b2SSatish Balay { 2261f6cc5b2SSatish Balay *newcomm = *comm; 2271f6cc5b2SSatish Balay *ierr=MPI_SUCCESS; 2281f6cc5b2SSatish Balay } 2291f6cc5b2SSatish Balay 23069bb7ac9SSatish Balay void PETSC_STDCALL mpi_abort_(MPI_Comm *comm,int *errorcode,int *ierr) 231e5c89e4eSSatish Balay { 232e5c89e4eSSatish Balay abort(); 233e5c89e4eSSatish Balay *ierr = MPI_SUCCESS; 234e5c89e4eSSatish Balay } 235e5c89e4eSSatish Balay 23669bb7ac9SSatish Balay void PETSC_STDCALL mpi_allreduce_(void *sendbuf,void *recvbuf,int *count,int *datatype,int *op,int *comm,int *ierr) 237e5c89e4eSSatish Balay { 238e5c89e4eSSatish Balay MPIUNI_Memcpy(recvbuf,sendbuf,(*count)*MPIUNI_DATASIZE[*datatype]); 239e5c89e4eSSatish Balay *ierr = MPI_SUCCESS; 240e5c89e4eSSatish Balay } 241e5c89e4eSSatish Balay 24269bb7ac9SSatish Balay void PETSC_STDCALL mpi_barrier_(MPI_Comm *comm,int *ierr) 243e5c89e4eSSatish Balay { 244e5c89e4eSSatish Balay *ierr = MPI_SUCCESS; 245e5c89e4eSSatish Balay } 246f7c6e6aaSSatish Balay 24769bb7ac9SSatish Balay void PETSC_STDCALL mpi_bcast_(void *buf,int *count,int *datatype,int *root,int *comm,int *ierr) 248e5c89e4eSSatish Balay { 249e5c89e4eSSatish Balay *ierr = MPI_SUCCESS; 250e5c89e4eSSatish Balay } 251f7c6e6aaSSatish Balay 252f7c6e6aaSSatish Balay 25369bb7ac9SSatish Balay void PETSC_STDCALL mpi_gather_(void *sendbuf,int *scount,int *sdatatype, void* recvbuf, int* rcount, int* rdatatype, int *root,int *comm,int *ierr) 254e5c89e4eSSatish Balay { 255f7c6e6aaSSatish Balay MPIUNI_Memcpy(recvbuf,sendbuf,(*scount)*MPIUNI_DATASIZE[*sdatatype]); 256f7c6e6aaSSatish Balay *ierr = MPI_SUCCESS; 257f7c6e6aaSSatish Balay } 258f7c6e6aaSSatish Balay 259f7c6e6aaSSatish Balay 26069bb7ac9SSatish Balay void PETSC_STDCALL mpi_allgather_(void *sendbuf,int *scount,int *sdatatype, void* recvbuf, int* rcount, int* rdatatype,int *comm,int *ierr) 261f7c6e6aaSSatish Balay { 262f7c6e6aaSSatish Balay MPIUNI_Memcpy(recvbuf,sendbuf,(*scount)*MPIUNI_DATASIZE[*sdatatype]); 263e5c89e4eSSatish Balay *ierr = MPI_SUCCESS; 264e5c89e4eSSatish Balay } 265e5c89e4eSSatish Balay 266e5c89e4eSSatish Balay #if defined(__cplusplus) 267e5c89e4eSSatish Balay } 268e5c89e4eSSatish Balay #endif 269e5c89e4eSSatish Balay 270e5c89e4eSSatish Balay 271