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 12958cd72c3SLisandro Dalcin /* --------------------------------------------------------------------------*/ 13058cd72c3SLisandro Dalcin 131e5c89e4eSSatish Balay static int MPI_was_initialized = 0; 13258cd72c3SLisandro Dalcin static int MPI_was_finalized = 0; 13358cd72c3SLisandro Dalcin 13458cd72c3SLisandro Dalcin int Petsc_MPI_Init(int *argc, char ***argv) 13558cd72c3SLisandro Dalcin { 1368f059c70SLisandro Dalcin if (MPI_was_initialized) return 1; 1378f059c70SLisandro Dalcin if (MPI_was_finalized) return 1; 13858cd72c3SLisandro Dalcin MPI_was_initialized = 1; 13958cd72c3SLisandro Dalcin return 0; 14058cd72c3SLisandro Dalcin } 14158cd72c3SLisandro Dalcin 14258cd72c3SLisandro Dalcin int Petsc_MPI_Finalize(void) 14358cd72c3SLisandro Dalcin { 1448f059c70SLisandro Dalcin if (MPI_was_finalized) return 1; 1458f059c70SLisandro Dalcin if (!MPI_was_initialized) return 1; 14658cd72c3SLisandro Dalcin MPI_was_finalized = 1; 14758cd72c3SLisandro Dalcin return 0; 14858cd72c3SLisandro Dalcin } 149e5c89e4eSSatish Balay 150e5c89e4eSSatish Balay int Petsc_MPI_Initialized(int *flag) 151e5c89e4eSSatish Balay { 152e5c89e4eSSatish Balay *flag = MPI_was_initialized; 153e5c89e4eSSatish Balay return 0; 154e5c89e4eSSatish Balay } 155e5c89e4eSSatish Balay 15658cd72c3SLisandro Dalcin int Petsc_MPI_Finalized(int *flag) 157e5c89e4eSSatish Balay { 15858cd72c3SLisandro Dalcin *flag = MPI_was_finalized; 159e5c89e4eSSatish Balay return 0; 160e5c89e4eSSatish Balay } 161e5c89e4eSSatish Balay 162e5c89e4eSSatish Balay /* ------------------- Fortran versions of several routines ------------------ */ 163e5c89e4eSSatish Balay 164f7c6e6aaSSatish Balay #if defined(PETSC_HAVE_FORTRAN_CAPS) 165f7c6e6aaSSatish Balay #define mpi_init_ MPI_INIT 166f7c6e6aaSSatish Balay #define mpi_finalize_ MPI_FINALIZE 167f7c6e6aaSSatish Balay #define mpi_comm_size_ MPI_COMM_SIZE 168f7c6e6aaSSatish Balay #define mpi_comm_rank_ MPI_COMM_RANK 169f7c6e6aaSSatish Balay #define mpi_abort_ MPI_ABORT 1703b644628SSatish Balay #define mpi_reduce_ MPI_REDUCE 171f7c6e6aaSSatish Balay #define mpi_allreduce_ MPI_ALLREDUCE 172f7c6e6aaSSatish Balay #define mpi_barrier_ MPI_BARRIER 173f7c6e6aaSSatish Balay #define mpi_bcast_ MPI_BCAST 174f7c6e6aaSSatish Balay #define mpi_gather_ MPI_GATHER 175f7c6e6aaSSatish Balay #define mpi_allgather_ MPI_ALLGATHER 17604ab3e84SSatish Balay #define mpi_comm_split_ MPI_COMM_SPLIT 1773b644628SSatish Balay #define mpi_scan_ MPI_SCAN 178*1086b069SSatish Balay #define mpi_send_ MPI_SEND 179*1086b069SSatish Balay #define mpi_recv_ MPI_RECV 180*1086b069SSatish Balay 181f7c6e6aaSSatish Balay #elif !defined(PETSC_HAVE_FORTRAN_UNDERSCORE) 182f7c6e6aaSSatish Balay #define mpi_init_ mpi_init 183f7c6e6aaSSatish Balay #define mpi_finalize_ mpi_finalize 184f7c6e6aaSSatish Balay #define mpi_comm_size_ mpi_comm_size 185f7c6e6aaSSatish Balay #define mpi_comm_rank_ mpi_comm_rank 186f7c6e6aaSSatish Balay #define mpi_abort_ mpi_abort 1873b644628SSatish Balay #define mpi_reduce_ mpi_reduce 188f7c6e6aaSSatish Balay #define mpi_allreduce_ mpi_allreduce 189f7c6e6aaSSatish Balay #define mpi_barrier_ mpi_barrier 190f7c6e6aaSSatish Balay #define mpi_bcast_ mpi_bcast 191f7c6e6aaSSatish Balay #define mpi_gather_ mpi_gather 192f7c6e6aaSSatish Balay #define mpi_allgather_ mpi_allgather 19304ab3e84SSatish Balay #define mpi_comm_split_ mpi_comm_split 1943b644628SSatish Balay #define mpi_scan_ mpi_scan 195*1086b069SSatish Balay #define mpi_send_ mpi_send 196*1086b069SSatish Balay #define mpi_recv_ mpi_recv 197f7c6e6aaSSatish Balay #endif 198e5c89e4eSSatish Balay 199f7c6e6aaSSatish Balay #if defined(PETSC_HAVE_FORTRAN_UNDERSCORE_UNDERSCORE) 200f7c6e6aaSSatish Balay #define mpi_init_ mpi_init__ 201f7c6e6aaSSatish Balay #define mpi_finalize_ mpi_finalize__ 202f7c6e6aaSSatish Balay #define mpi_comm_size_ mpi_comm_size__ 203f7c6e6aaSSatish Balay #define mpi_comm_rank_ mpi_comm_rank__ 204f7c6e6aaSSatish Balay #define mpi_abort_ mpi_abort__ 2053b644628SSatish Balay #define mpi_reduce_ mpi_reduce__ 206f7c6e6aaSSatish Balay #define mpi_allreduce_ mpi_allreduce__ 207f7c6e6aaSSatish Balay #define mpi_barrier_ mpi_barrier__ 208f7c6e6aaSSatish Balay #define mpi_bcast_ mpi_bcast__ 209f7c6e6aaSSatish Balay #define mpi_gather_ mpi_gather__ 210f7c6e6aaSSatish Balay #define mpi_allgather_ mpi_allgather__ 21104ab3e84SSatish Balay #define mpi_comm_split_ mpi_comm_split__ 2123b644628SSatish Balay #define mpi_scan mpi_scan__ 213*1086b069SSatish Balay #define mpi_send_ mpi_send__ 214*1086b069SSatish Balay #define mpi_recv_ mpi_recv__ 215f7c6e6aaSSatish Balay #endif 216e5c89e4eSSatish Balay 21769bb7ac9SSatish Balay void PETSC_STDCALL mpi_init_(int *ierr) 218e5c89e4eSSatish Balay { 2198f059c70SLisandro Dalcin *ierr = Petsc_MPI_Init((int*)0, (char***)0); 220e5c89e4eSSatish Balay } 221e5c89e4eSSatish Balay 22269bb7ac9SSatish Balay void PETSC_STDCALL mpi_finalize_(int *ierr) 223e5c89e4eSSatish Balay { 2248f059c70SLisandro Dalcin *ierr = Petsc_MPI_Finalize(); 225e5c89e4eSSatish Balay } 226e5c89e4eSSatish Balay 22769bb7ac9SSatish Balay void PETSC_STDCALL mpi_comm_size_(MPI_Comm *comm,int *size,int *ierr) 228e5c89e4eSSatish Balay { 229e5c89e4eSSatish Balay *size = 1; 230e5c89e4eSSatish Balay *ierr = 0; 231e5c89e4eSSatish Balay } 232e5c89e4eSSatish Balay 23369bb7ac9SSatish Balay void PETSC_STDCALL mpi_comm_rank_(MPI_Comm *comm,int *rank,int *ierr) 234e5c89e4eSSatish Balay { 235e5c89e4eSSatish Balay *rank=0; 236e5c89e4eSSatish Balay *ierr=MPI_SUCCESS; 237e5c89e4eSSatish Balay } 238e5c89e4eSSatish Balay 239dd46ca73SSatish Balay void PETSC_STDCALL mpi_comm_split_(MPI_Comm *comm,int *color,int *key, MPI_Comm *newcomm, int *ierr) 2401f6cc5b2SSatish Balay { 2411f6cc5b2SSatish Balay *newcomm = *comm; 2421f6cc5b2SSatish Balay *ierr=MPI_SUCCESS; 2431f6cc5b2SSatish Balay } 2441f6cc5b2SSatish Balay 24569bb7ac9SSatish Balay void PETSC_STDCALL mpi_abort_(MPI_Comm *comm,int *errorcode,int *ierr) 246e5c89e4eSSatish Balay { 247e5c89e4eSSatish Balay abort(); 248e5c89e4eSSatish Balay *ierr = MPI_SUCCESS; 249e5c89e4eSSatish Balay } 250e5c89e4eSSatish Balay 2513b644628SSatish Balay void PETSC_STDCALL mpi_reduce_(void *sendbuf,void *recvbuf,int *count,int *datatype,int *op,int *root,int *comm,int *ierr) 2523b644628SSatish Balay { 2533b644628SSatish Balay MPIUNI_Memcpy(recvbuf,sendbuf,(*count)*MPIUNI_DATASIZE[*datatype]); 2543b644628SSatish Balay *ierr = MPI_SUCCESS; 2553b644628SSatish Balay } 2563b644628SSatish Balay 25769bb7ac9SSatish Balay void PETSC_STDCALL mpi_allreduce_(void *sendbuf,void *recvbuf,int *count,int *datatype,int *op,int *comm,int *ierr) 258e5c89e4eSSatish Balay { 259e5c89e4eSSatish Balay MPIUNI_Memcpy(recvbuf,sendbuf,(*count)*MPIUNI_DATASIZE[*datatype]); 260e5c89e4eSSatish Balay *ierr = MPI_SUCCESS; 261e5c89e4eSSatish Balay } 262e5c89e4eSSatish Balay 26369bb7ac9SSatish Balay void PETSC_STDCALL mpi_barrier_(MPI_Comm *comm,int *ierr) 264e5c89e4eSSatish Balay { 265e5c89e4eSSatish Balay *ierr = MPI_SUCCESS; 266e5c89e4eSSatish Balay } 267f7c6e6aaSSatish Balay 26869bb7ac9SSatish Balay void PETSC_STDCALL mpi_bcast_(void *buf,int *count,int *datatype,int *root,int *comm,int *ierr) 269e5c89e4eSSatish Balay { 270e5c89e4eSSatish Balay *ierr = MPI_SUCCESS; 271e5c89e4eSSatish Balay } 272f7c6e6aaSSatish Balay 273f7c6e6aaSSatish Balay 27469bb7ac9SSatish Balay void PETSC_STDCALL mpi_gather_(void *sendbuf,int *scount,int *sdatatype, void* recvbuf, int* rcount, int* rdatatype, int *root,int *comm,int *ierr) 275e5c89e4eSSatish Balay { 276f7c6e6aaSSatish Balay MPIUNI_Memcpy(recvbuf,sendbuf,(*scount)*MPIUNI_DATASIZE[*sdatatype]); 277f7c6e6aaSSatish Balay *ierr = MPI_SUCCESS; 278f7c6e6aaSSatish Balay } 279f7c6e6aaSSatish Balay 28069bb7ac9SSatish Balay void PETSC_STDCALL mpi_allgather_(void *sendbuf,int *scount,int *sdatatype, void* recvbuf, int* rcount, int* rdatatype,int *comm,int *ierr) 281f7c6e6aaSSatish Balay { 282f7c6e6aaSSatish Balay MPIUNI_Memcpy(recvbuf,sendbuf,(*scount)*MPIUNI_DATASIZE[*sdatatype]); 283e5c89e4eSSatish Balay *ierr = MPI_SUCCESS; 284e5c89e4eSSatish Balay } 285e5c89e4eSSatish Balay 2863b644628SSatish Balay void PETSC_STDCALL mpi_scan_(void *sendbuf,void *recvbuf,int *count,int *datatype,int *op,int *comm,int *ierr) 2873b644628SSatish Balay { 2883b644628SSatish Balay MPIUNI_Memcpy(recvbuf,sendbuf,(*count)*MPIUNI_DATASIZE[*datatype]); 2893b644628SSatish Balay *ierr = MPI_SUCCESS; 2903b644628SSatish Balay } 2913b644628SSatish Balay 292*1086b069SSatish Balay void PETSC_STDCALL mpi_send_(void*buf,int *count,int *datatype,int *dest,int *tag,int *comm,int *ierr ) 293*1086b069SSatish Balay { 294*1086b069SSatish Balay *ierr = MPI_SUCCESS; 295*1086b069SSatish Balay } 296*1086b069SSatish Balay 297*1086b069SSatish Balay void PETSC_STDCALL mpi_recv_(void*buf,int *count,int *datatype,int *source,int *tag,int *comm,int status,int *ierr ) 298*1086b069SSatish Balay { 299*1086b069SSatish Balay *ierr = MPI_Abort(MPI_COMM_WORLD,0); 300*1086b069SSatish Balay } 301*1086b069SSatish Balay 302e5c89e4eSSatish Balay #if defined(__cplusplus) 303e5c89e4eSSatish Balay } 304e5c89e4eSSatish Balay #endif 305