1e5c89e4eSSatish Balay /* 2e5c89e4eSSatish Balay This provides a few of the MPI-uni functions that cannot be implemented 3e5c89e4eSSatish Balay with C macros 4e5c89e4eSSatish Balay */ 5891da655SBarry Smith #include <petscsys.h> 6*6524c165SJacob Faibussowitsch #ifndef MPIUNI_H 74423d37eSSatish Balay #error "Wrong mpi.h included! require mpi.h from MPIUNI" 84423d37eSSatish Balay #endif 9e5c89e4eSSatish Balay 100e6b6b59SJacob Faibussowitsch #include <petscdevice_cupm.h> 110e6b6b59SJacob Faibussowitsch #include <petsc/private/petscimpl.h> 126e42a002SJunchao Zhang 13e5c89e4eSSatish Balay #define MPI_SUCCESS 0 14e5c89e4eSSatish Balay #define MPI_FAILURE 1 15a297a907SKarl Rupp 1699256852SLisandro Dalcin void *MPIUNI_TMP = NULL; 1799256852SLisandro Dalcin 18e5c89e4eSSatish Balay /* 19100f28aeSBarry Smith With MPI Uni there are exactly four distinct communicators: 20100f28aeSBarry Smith MPI_COMM_SELF, MPI_COMM_WORLD, and a MPI_Comm_dup() of each of these (duplicates of duplicates return the same communictor) 21100f28aeSBarry Smith 22100f28aeSBarry Smith MPI_COMM_SELF and MPI_COMM_WORLD are MPI_Comm_free() in MPI_Finalize() but in general with PETSc, 23100f28aeSBarry Smith the other communicators are freed once the last PETSc object is freed (before MPI_Finalize()). 24100f28aeSBarry Smith 25e5c89e4eSSatish Balay */ 261ca36541SSatish Balay #define MAX_ATTR 256 27fb53af6bSBarry Smith #define MAX_COMM 128 28fb53af6bSBarry Smith 29e5c89e4eSSatish Balay typedef struct { 30e5c89e4eSSatish Balay void *attribute_val; 31e5c89e4eSSatish Balay int active; 32e5c89e4eSSatish Balay } MPI_Attr; 33e5c89e4eSSatish Balay 3446651e72SBarry Smith typedef struct { 3546651e72SBarry Smith void *extra_state; 3646651e72SBarry Smith MPI_Delete_function *del; 37f0463fa0SJunchao Zhang int active; /* Is this keyval in use by some comm? */ 3846651e72SBarry Smith } MPI_Attr_keyval; 3946651e72SBarry Smith 4046651e72SBarry Smith static MPI_Attr_keyval attr_keyval[MAX_ATTR]; 41fb53af6bSBarry Smith static MPI_Attr attr[MAX_COMM][MAX_ATTR]; 42f0463fa0SJunchao Zhang static int comm_active[MAX_COMM]; /* Boolean array indicating which comms are in use */ 43f0463fa0SJunchao Zhang static int mpi_tag_ub = 100000000; 44f0463fa0SJunchao Zhang static int num_attr = 1; /* Maximal number of keyvals/attributes ever created, including the predefined MPI_TAG_UB attribute. */ 45f0463fa0SJunchao Zhang static int MaxComm = 2; /* Maximal number of communicators ever created, including comm_self(1), comm_world(2), but not comm_null(0) */ 4652ecd5ffSSatish Balay static void *MPIUNIF_mpi_in_place = 0; 47e5c89e4eSSatish Balay 48f0463fa0SJunchao Zhang #define CommIdx(comm) ((comm)-1) /* the communicator's internal index used in attr[idx][] and comm_active[idx]. comm_null does not occupy slots in attr[][] */ 49f0463fa0SJunchao Zhang 50e5c89e4eSSatish Balay #if defined(__cplusplus) 51e5c89e4eSSatish Balay extern "C" { 52e5c89e4eSSatish Balay #endif 53e5c89e4eSSatish Balay 54e5c89e4eSSatish Balay /* 55e5c89e4eSSatish Balay To avoid problems with prototypes to the system memcpy() it is duplicated here 56e5c89e4eSSatish Balay */ 579371c9d4SSatish Balay int MPIUNI_Memcpy(void *dst, const void *src, int n) { 586e42a002SJunchao Zhang if (dst == MPI_IN_PLACE || dst == MPIUNIF_mpi_in_place) return MPI_SUCCESS; 596e42a002SJunchao Zhang if (src == MPI_IN_PLACE || src == MPIUNIF_mpi_in_place) return MPI_SUCCESS; 606e42a002SJunchao Zhang if (!n) return MPI_SUCCESS; 61e5c89e4eSSatish Balay 6205035670SJunchao Zhang /* GPU-aware MPIUNI. Use synchronous copy per MPI semantics */ 6305035670SJunchao Zhang #if defined(PETSC_HAVE_CUDA) 649371c9d4SSatish Balay if (PetscDeviceInitialized(PETSC_DEVICE_CUDA)) { 659371c9d4SSatish Balay cudaError_t cerr = cudaMemcpy(dst, src, n, cudaMemcpyDefault); 669371c9d4SSatish Balay if (cerr != cudaSuccess) return MPI_FAILURE; 679371c9d4SSatish Balay } else 6805035670SJunchao Zhang #elif defined(PETSC_HAVE_HIP) 699371c9d4SSatish Balay if (PetscDeviceInitialized(PETSC_DEVICE_HIP)) { 709371c9d4SSatish Balay hipError_t cerr = hipMemcpy(dst, src, n, hipMemcpyDefault); 719371c9d4SSatish Balay if (cerr != hipSuccess) return MPI_FAILURE; 729371c9d4SSatish Balay } else 73a6191124SJunchao Zhang #endif 749371c9d4SSatish Balay { 759371c9d4SSatish Balay memcpy(dst, src, n); 769371c9d4SSatish Balay } 7799256852SLisandro Dalcin return MPI_SUCCESS; 78e5c89e4eSSatish Balay } 79e5c89e4eSSatish Balay 8012801b39SBarry Smith static int classcnt = 0; 8112801b39SBarry Smith static int codecnt = 0; 8212801b39SBarry Smith 839371c9d4SSatish Balay int MPI_Add_error_class(int *cl) { 8412801b39SBarry Smith *cl = classcnt++; 8512801b39SBarry Smith return MPI_SUCCESS; 8612801b39SBarry Smith } 8712801b39SBarry Smith 889371c9d4SSatish Balay int MPI_Add_error_code(int cl, int *co) { 8912801b39SBarry Smith if (cl >= classcnt) return MPI_FAILURE; 9012801b39SBarry Smith *co = codecnt++; 9112801b39SBarry Smith return MPI_SUCCESS; 9212801b39SBarry Smith } 9312801b39SBarry Smith 949371c9d4SSatish Balay int MPI_Type_get_envelope(MPI_Datatype datatype, int *num_integers, int *num_addresses, int *num_datatypes, int *combiner) { 951a589b05SJed Brown int comb = datatype >> 28; 961a589b05SJed Brown switch (comb) { 971a589b05SJed Brown case MPI_COMBINER_NAMED: 981a589b05SJed Brown *num_integers = 0; 991a589b05SJed Brown *num_addresses = 0; 1001a589b05SJed Brown *num_datatypes = 0; 1011a589b05SJed Brown *combiner = comb; 1021a589b05SJed Brown break; 1031a589b05SJed Brown case MPI_COMBINER_DUP: 1041a589b05SJed Brown *num_integers = 0; 1051a589b05SJed Brown *num_addresses = 0; 1061a589b05SJed Brown *num_datatypes = 1; 1071a589b05SJed Brown *combiner = comb; 1081a589b05SJed Brown break; 1091a589b05SJed Brown case MPI_COMBINER_CONTIGUOUS: 1101a589b05SJed Brown *num_integers = 1; 1111a589b05SJed Brown *num_addresses = 0; 1121a589b05SJed Brown *num_datatypes = 1; 1131a589b05SJed Brown *combiner = comb; 1141a589b05SJed Brown break; 1159371c9d4SSatish Balay default: return MPIUni_Abort(MPI_COMM_SELF, 1); 1161a589b05SJed Brown } 11799256852SLisandro Dalcin return MPI_SUCCESS; 1181a589b05SJed Brown } 1191a589b05SJed Brown 1209371c9d4SSatish Balay 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, MPI_Datatype *array_of_datatypes) { 1211a589b05SJed Brown int comb = datatype >> 28; 1221a589b05SJed Brown switch (comb) { 1239371c9d4SSatish Balay case MPI_COMBINER_NAMED: return MPIUni_Abort(MPI_COMM_SELF, 1); 1241a589b05SJed Brown case MPI_COMBINER_DUP: 1251a589b05SJed Brown if (max_datatypes < 1) return MPIUni_Abort(MPI_COMM_SELF, 1); 1261a589b05SJed Brown array_of_datatypes[0] = datatype & 0x0fffffff; 1271a589b05SJed Brown break; 1281a589b05SJed Brown case MPI_COMBINER_CONTIGUOUS: 1291a589b05SJed Brown if (max_integers < 1 || max_datatypes < 1) return MPIUni_Abort(MPI_COMM_SELF, 1); 1301a589b05SJed Brown array_of_integers[0] = (datatype >> 8) & 0xfff; /* count */ 1311a589b05SJed Brown array_of_datatypes[0] = (datatype & 0x0ff000ff) | 0x100; /* basic named type (count=1) from which the contiguous type is derived */ 1321a589b05SJed Brown break; 1339371c9d4SSatish Balay default: return MPIUni_Abort(MPI_COMM_SELF, 1); 1341a589b05SJed Brown } 13599256852SLisandro Dalcin return MPI_SUCCESS; 1361a589b05SJed Brown } 1371a589b05SJed Brown 138e5c89e4eSSatish Balay /* 139e5c89e4eSSatish Balay Used to set the built-in MPI_TAG_UB attribute 140e5c89e4eSSatish Balay */ 1419371c9d4SSatish Balay static int Keyval_setup(void) { 142f0463fa0SJunchao Zhang attr[CommIdx(MPI_COMM_WORLD)][0].active = 1; 143f0463fa0SJunchao Zhang attr[CommIdx(MPI_COMM_WORLD)][0].attribute_val = &mpi_tag_ub; 144f0463fa0SJunchao Zhang attr[CommIdx(MPI_COMM_SELF)][0].active = 1; 145f0463fa0SJunchao Zhang attr[CommIdx(MPI_COMM_SELF)][0].attribute_val = &mpi_tag_ub; 146f0463fa0SJunchao Zhang attr_keyval[0].active = 1; 14799256852SLisandro Dalcin return MPI_SUCCESS; 148e5c89e4eSSatish Balay } 149e5c89e4eSSatish Balay 1509371c9d4SSatish Balay int MPI_Comm_create_keyval(MPI_Copy_function *copy_fn, MPI_Delete_function *delete_fn, int *keyval, void *extra_state) { 151f0463fa0SJunchao Zhang int i, keyid; 152f0463fa0SJunchao Zhang for (i = 1; i < num_attr; i++) { /* the first attribute is always in use */ 153f0463fa0SJunchao Zhang if (!attr_keyval[i].active) { 154f0463fa0SJunchao Zhang keyid = i; 155f0463fa0SJunchao Zhang goto found; 156f0463fa0SJunchao Zhang } 157f0463fa0SJunchao Zhang } 1589cf9c1dbSJed Brown if (num_attr >= MAX_ATTR) return MPIUni_Abort(MPI_COMM_WORLD, 1); 159f0463fa0SJunchao Zhang keyid = num_attr++; 160e5c89e4eSSatish Balay 161f0463fa0SJunchao Zhang found: 162f0463fa0SJunchao Zhang attr_keyval[keyid].extra_state = extra_state; 163f0463fa0SJunchao Zhang attr_keyval[keyid].del = delete_fn; 164f0463fa0SJunchao Zhang attr_keyval[keyid].active = 1; 165f0463fa0SJunchao Zhang *keyval = keyid; 16699256852SLisandro Dalcin return MPI_SUCCESS; 167e5c89e4eSSatish Balay } 168e5c89e4eSSatish Balay 16936f0be53SJacob Faibussowitsch /* 17036f0be53SJacob Faibussowitsch The reference counting business is here to guard against the following: 17136f0be53SJacob Faibussowitsch 17236f0be53SJacob Faibussowitsch MPI_Comm_set_attr(comm, keyval, some_attr); 17336f0be53SJacob Faibussowitsch MPI_Comm_free_keyval(&keyval); 17436f0be53SJacob Faibussowitsch MPI_Comm_free(&comm); 17536f0be53SJacob Faibussowitsch 17636f0be53SJacob Faibussowitsch Here MPI_Comm_free() will try to destroy all of the attributes of the comm, and hence we 17736f0be53SJacob Faibussowitsch should not clear the deleter or extra_state until all communicators that have the attribute 17836f0be53SJacob Faibussowitsch set are either freed or have given up their attribute. 17936f0be53SJacob Faibussowitsch 18036f0be53SJacob Faibussowitsch The attribute reference count is INCREASED in: 18136f0be53SJacob Faibussowitsch - MPI_Comm_create_keyval() 18236f0be53SJacob Faibussowitsch - MPI_Comm_set_attr() 18336f0be53SJacob Faibussowitsch 18436f0be53SJacob Faibussowitsch The atrtibute reference count is DECREASED in: 18536f0be53SJacob Faibussowitsch - MPI_Comm_free_keyval() 18636f0be53SJacob Faibussowitsch - MPI_Comm_delete_attr() (but only if the comm has the attribute) 18736f0be53SJacob Faibussowitsch */ 18836f0be53SJacob Faibussowitsch static int MPI_Attr_dereference_keyval(int keyval) { 18936f0be53SJacob Faibussowitsch if (--(attr_keyval[keyval].active) <= 0) { 19036f0be53SJacob Faibussowitsch attr_keyval[keyval].extra_state = 0; 19136f0be53SJacob Faibussowitsch attr_keyval[keyval].del = 0; 19236f0be53SJacob Faibussowitsch } 19336f0be53SJacob Faibussowitsch return MPI_SUCCESS; 19436f0be53SJacob Faibussowitsch } 19536f0be53SJacob Faibussowitsch 19636f0be53SJacob Faibussowitsch static int MPI_Attr_reference_keyval(int keyval) { 19736f0be53SJacob Faibussowitsch ++(attr_keyval[keyval].active); 19836f0be53SJacob Faibussowitsch return MPI_SUCCESS; 19936f0be53SJacob Faibussowitsch } 20036f0be53SJacob Faibussowitsch 2019371c9d4SSatish Balay int MPI_Comm_free_keyval(int *keyval) { 20236f0be53SJacob Faibussowitsch int ret; 20336f0be53SJacob Faibussowitsch 20436f0be53SJacob Faibussowitsch if (*keyval < 0 || *keyval >= num_attr) return MPI_FAILURE; 20536f0be53SJacob Faibussowitsch if ((ret = MPI_Attr_dereference_keyval(*keyval))) return ret; 206a246e310SBarry Smith *keyval = 0; 207e5c89e4eSSatish Balay return MPI_SUCCESS; 208e5c89e4eSSatish Balay } 209e5c89e4eSSatish Balay 2109371c9d4SSatish Balay int MPI_Comm_set_attr(MPI_Comm comm, int keyval, void *attribute_val) { 21136f0be53SJacob Faibussowitsch int idx = CommIdx(comm), ret; 212f0463fa0SJunchao Zhang if (comm < 1 || comm > MaxComm) return MPI_FAILURE; 21336f0be53SJacob Faibussowitsch if (keyval < 0 || keyval >= num_attr) return MPI_FAILURE; 21436f0be53SJacob Faibussowitsch 21536f0be53SJacob Faibussowitsch if ((ret = MPI_Comm_delete_attr(comm, keyval))) return ret; 21636f0be53SJacob Faibussowitsch if ((ret = MPI_Attr_reference_keyval(keyval))) return ret; 217f0463fa0SJunchao Zhang attr[idx][keyval].active = 1; 218f0463fa0SJunchao Zhang attr[idx][keyval].attribute_val = attribute_val; 219e5c89e4eSSatish Balay return MPI_SUCCESS; 220e5c89e4eSSatish Balay } 221e5c89e4eSSatish Balay 2229371c9d4SSatish Balay int MPI_Comm_delete_attr(MPI_Comm comm, int keyval) { 223f0463fa0SJunchao Zhang int idx = CommIdx(comm); 224f0463fa0SJunchao Zhang if (comm < 1 || comm > MaxComm) return MPI_FAILURE; 22536f0be53SJacob Faibussowitsch if (keyval < 0 || keyval >= num_attr) return MPI_FAILURE; 22636f0be53SJacob Faibussowitsch if (attr[idx][keyval].active) { 22736f0be53SJacob Faibussowitsch int ret; 228f0463fa0SJunchao Zhang void *save_attribute_val = attr[idx][keyval].attribute_val; 22936f0be53SJacob Faibussowitsch 230f0463fa0SJunchao Zhang attr[idx][keyval].active = 0; 231f0463fa0SJunchao Zhang attr[idx][keyval].attribute_val = 0; 23236f0be53SJacob Faibussowitsch if (attr_keyval[keyval].del) { 23336f0be53SJacob Faibussowitsch if ((ret = (*(attr_keyval[keyval].del))(comm, keyval, save_attribute_val, attr_keyval[keyval].extra_state))) return ret; 23436f0be53SJacob Faibussowitsch } 23536f0be53SJacob Faibussowitsch if ((ret = MPI_Attr_dereference_keyval(keyval))) return ret; 23640776e1bSpetsc } 237e5c89e4eSSatish Balay return MPI_SUCCESS; 238e5c89e4eSSatish Balay } 239e5c89e4eSSatish Balay 2409371c9d4SSatish Balay int MPI_Comm_get_attr(MPI_Comm comm, int keyval, void *attribute_val, int *flag) { 241f0463fa0SJunchao Zhang int idx = CommIdx(comm); 242f0463fa0SJunchao Zhang if (comm < 1 || comm > MaxComm) return MPI_FAILURE; 243e5c89e4eSSatish Balay if (!keyval) Keyval_setup(); 244f0463fa0SJunchao Zhang *flag = attr[idx][keyval].active; 245f0463fa0SJunchao Zhang *(void **)attribute_val = attr[idx][keyval].attribute_val; 246e5c89e4eSSatish Balay return MPI_SUCCESS; 247e5c89e4eSSatish Balay } 248e5c89e4eSSatish Balay 2499371c9d4SSatish Balay static char all_comm_names[MAX_COMM][MPI_MAX_OBJECT_NAME] = {"MPI_COMM_SELF", "MPI_COMM_WORLD"}; 2503e1d142dSJacob Faibussowitsch 2519371c9d4SSatish Balay int MPI_Comm_get_name(MPI_Comm comm, char *comm_name, int *resultlen) { 2523e1d142dSJacob Faibussowitsch if (comm < 1 || comm > MaxComm) return MPI_FAILURE; 2533e1d142dSJacob Faibussowitsch if (!comm_name || !resultlen) return MPI_FAILURE; 2543e1d142dSJacob Faibussowitsch strncpy(comm_name, all_comm_names[CommIdx(comm)], MPI_MAX_OBJECT_NAME - 1); 2553e1d142dSJacob Faibussowitsch *resultlen = (int)strlen(comm_name); 2563e1d142dSJacob Faibussowitsch return MPI_SUCCESS; 2573e1d142dSJacob Faibussowitsch } 2583e1d142dSJacob Faibussowitsch 2599371c9d4SSatish Balay int MPI_Comm_set_name(MPI_Comm comm, const char *comm_name) { 2603e1d142dSJacob Faibussowitsch if (comm < 1 || comm > MaxComm) return MPI_FAILURE; 2613e1d142dSJacob Faibussowitsch if (!comm_name) return MPI_FAILURE; 2623e1d142dSJacob Faibussowitsch if (strlen(comm_name) > MPI_MAX_OBJECT_NAME - 1) return MPI_FAILURE; 2633e1d142dSJacob Faibussowitsch strncpy(all_comm_names[CommIdx(comm)], comm_name, MPI_MAX_OBJECT_NAME - 1); 2643e1d142dSJacob Faibussowitsch return MPI_SUCCESS; 2653e1d142dSJacob Faibussowitsch } 2663e1d142dSJacob Faibussowitsch 2679371c9d4SSatish Balay int MPI_Comm_create(MPI_Comm comm, MPI_Group group, MPI_Comm *newcomm) { 268f60917d2SBarry Smith int j; 269f0463fa0SJunchao Zhang if (comm < 1 || comm > MaxComm) return MPI_FAILURE; 270f0463fa0SJunchao Zhang for (j = 3; j <= MaxComm; j++) { 271f0463fa0SJunchao Zhang if (!comm_active[CommIdx(j)]) { 272f0463fa0SJunchao Zhang comm_active[CommIdx(j)] = 1; 273f60917d2SBarry Smith *newcomm = j; 274f60917d2SBarry Smith return MPI_SUCCESS; 275f60917d2SBarry Smith } 276f60917d2SBarry Smith } 277f0463fa0SJunchao Zhang if (MaxComm >= MAX_COMM) return MPI_FAILURE; 278f0463fa0SJunchao Zhang *newcomm = ++MaxComm; 279f0463fa0SJunchao Zhang comm_active[CommIdx(*newcomm)] = 1; 280c8217ed5SSatish Balay return MPI_SUCCESS; 281c8217ed5SSatish Balay } 282c8217ed5SSatish Balay 2839371c9d4SSatish Balay int MPI_Comm_dup(MPI_Comm comm, MPI_Comm *out) { 284f60917d2SBarry Smith int j; 285f0463fa0SJunchao Zhang if (comm < 1 || comm > MaxComm) return MPI_FAILURE; 286f0463fa0SJunchao Zhang for (j = 3; j <= MaxComm; j++) { 287f0463fa0SJunchao Zhang if (!comm_active[CommIdx(j)]) { 288f0463fa0SJunchao Zhang comm_active[CommIdx(j)] = 1; 289f60917d2SBarry Smith *out = j; 290f60917d2SBarry Smith return MPI_SUCCESS; 291f60917d2SBarry Smith } 292f60917d2SBarry Smith } 293f0463fa0SJunchao Zhang if (MaxComm >= MAX_COMM) return MPI_FAILURE; 294f0463fa0SJunchao Zhang *out = ++MaxComm; 295f0463fa0SJunchao Zhang comm_active[CommIdx(*out)] = 1; 29699256852SLisandro Dalcin return MPI_SUCCESS; 297e5c89e4eSSatish Balay } 298e5c89e4eSSatish Balay 2999371c9d4SSatish Balay int MPI_Comm_free(MPI_Comm *comm) { 300f0463fa0SJunchao Zhang int idx = CommIdx(*comm); 301e5c89e4eSSatish Balay 302f0463fa0SJunchao Zhang if (*comm < 1 || *comm > MaxComm) return MPI_FAILURE; 30336f0be53SJacob Faibussowitsch for (int i = 0; i < num_attr; i++) { 30436f0be53SJacob Faibussowitsch int ret = MPI_Comm_delete_attr(*comm, i); 30536f0be53SJacob Faibussowitsch 30636f0be53SJacob Faibussowitsch if (ret) return ret; 307e5c89e4eSSatish Balay } 308f0463fa0SJunchao Zhang if (*comm >= 3) comm_active[idx] = 0; 309100f28aeSBarry Smith *comm = 0; 310e5c89e4eSSatish Balay return MPI_SUCCESS; 311e5c89e4eSSatish Balay } 312e5c89e4eSSatish Balay 3139371c9d4SSatish Balay int MPI_Comm_size(MPI_Comm comm, int *size) { 314f0463fa0SJunchao Zhang if (comm < 1 || comm > MaxComm) return MPI_FAILURE; 315d393f697SSatish Balay *size = 1; 316d393f697SSatish Balay return MPI_SUCCESS; 317d393f697SSatish Balay } 318d393f697SSatish Balay 3199371c9d4SSatish Balay int MPI_Comm_rank(MPI_Comm comm, int *rank) { 320f0463fa0SJunchao Zhang if (comm < 1 || comm > MaxComm) return MPI_FAILURE; 321d393f697SSatish Balay *rank = 0; 322d393f697SSatish Balay return MPI_SUCCESS; 323d393f697SSatish Balay } 324d393f697SSatish Balay 3259371c9d4SSatish Balay int MPIUni_Abort(MPI_Comm comm, int errorcode) { 32606df1fb1SBarry Smith printf("MPI operation not supported by PETSc's sequential MPI wrappers\n"); 327b3f11779SBarry Smith return MPI_ERR_NOSUPPORT; 32806df1fb1SBarry Smith } 32906df1fb1SBarry Smith 3309371c9d4SSatish Balay int MPI_Abort(MPI_Comm comm, int errorcode) { 331e5c89e4eSSatish Balay abort(); 332e5c89e4eSSatish Balay return MPI_SUCCESS; 333e5c89e4eSSatish Balay } 334e5c89e4eSSatish Balay 33558cd72c3SLisandro Dalcin /* --------------------------------------------------------------------------*/ 33658cd72c3SLisandro Dalcin 337e5c89e4eSSatish Balay static int MPI_was_initialized = 0; 33858cd72c3SLisandro Dalcin static int MPI_was_finalized = 0; 33958cd72c3SLisandro Dalcin 3409371c9d4SSatish Balay int MPI_Init(int *argc, char ***argv) { 34199256852SLisandro Dalcin if (MPI_was_initialized) return MPI_FAILURE; 3429bcf9d5aSJunchao Zhang /* MPI standard says "once MPI_Finalize returns, no MPI routine (not even MPI_Init) may be called", so an MPI standard compliant 3439bcf9d5aSJunchao Zhang MPIU should have this 'if (MPI_was_finalized) return MPI_FAILURE;' check. We relax it here to make life easier for users 3449bcf9d5aSJunchao Zhang of MPIU so that they can do multiple PetscInitialize/Finalize(). 3459bcf9d5aSJunchao Zhang */ 3469bcf9d5aSJunchao Zhang /* if (MPI_was_finalized) return MPI_FAILURE; */ 34758cd72c3SLisandro Dalcin MPI_was_initialized = 1; 3489bcf9d5aSJunchao Zhang MPI_was_finalized = 0; 34999256852SLisandro Dalcin return MPI_SUCCESS; 35058cd72c3SLisandro Dalcin } 35158cd72c3SLisandro Dalcin 3529371c9d4SSatish Balay int MPI_Init_thread(int *argc, char ***argv, int required, int *provided) { 3539012378cSStefano Zampini MPI_Query_thread(provided); 3549012378cSStefano Zampini return MPI_Init(argc, argv); 3559012378cSStefano Zampini } 3569012378cSStefano Zampini 3579371c9d4SSatish Balay int MPI_Query_thread(int *provided) { 3589012378cSStefano Zampini *provided = MPI_THREAD_FUNNELED; 3599012378cSStefano Zampini return MPI_SUCCESS; 3609012378cSStefano Zampini } 3619012378cSStefano Zampini 3629371c9d4SSatish Balay int MPI_Finalize(void) { 36336f0be53SJacob Faibussowitsch if (MPI_was_finalized || !MPI_was_initialized) return MPI_FAILURE; 36436f0be53SJacob Faibussowitsch MPI_Comm comm = MPI_COMM_WORLD; 36536f0be53SJacob Faibussowitsch int ret = MPI_Comm_free(&comm); 36636f0be53SJacob Faibussowitsch 36736f0be53SJacob Faibussowitsch if (ret) return ret; 368100f28aeSBarry Smith comm = MPI_COMM_SELF; 36936f0be53SJacob Faibussowitsch ret = MPI_Comm_free(&comm); 37036f0be53SJacob Faibussowitsch if (ret) return ret; 37136f0be53SJacob Faibussowitsch if (PetscDefined(USE_DEBUG)) { 37236f0be53SJacob Faibussowitsch for (int i = 3; i <= MaxComm; ++i) { 373f0463fa0SJunchao Zhang if (comm_active[CommIdx(i)]) printf("MPIUni warning: MPI communicator %d is not freed before MPI_Finalize()\n", i); 374f0463fa0SJunchao Zhang } 37536f0be53SJacob Faibussowitsch 37636f0be53SJacob Faibussowitsch for (int i = 1; i <= MaxComm; ++i) { 37736f0be53SJacob Faibussowitsch for (int j = 0; j < num_attr; ++j) { 37836f0be53SJacob Faibussowitsch if (attr[CommIdx(i)][j].active) printf("MPIUni warning: MPI communicator %d attribute %d was not freed before MPI_Finalize()\n", i, j); 379f0463fa0SJunchao Zhang } 38036f0be53SJacob Faibussowitsch } 38136f0be53SJacob Faibussowitsch 38236f0be53SJacob Faibussowitsch for (int i = 1; i < num_attr; ++i) { 38336f0be53SJacob Faibussowitsch if (attr_keyval[i].active) printf("MPIUni warning: MPI attribute %d was not freed before MPI_Finalize()\n", i); 38436f0be53SJacob Faibussowitsch } 38536f0be53SJacob Faibussowitsch } 38636f0be53SJacob Faibussowitsch 387f0463fa0SJunchao Zhang /* reset counters */ 388f0463fa0SJunchao Zhang MaxComm = 2; 389f0463fa0SJunchao Zhang num_attr = 1; 39058cd72c3SLisandro Dalcin MPI_was_finalized = 1; 3919bcf9d5aSJunchao Zhang MPI_was_initialized = 0; 3929bcf9d5aSJunchao Zhang PETSC_COMM_WORLD = MPI_COMM_NULL; 39399256852SLisandro Dalcin return MPI_SUCCESS; 39458cd72c3SLisandro Dalcin } 395e5c89e4eSSatish Balay 3969371c9d4SSatish Balay int MPI_Initialized(int *flag) { 397e5c89e4eSSatish Balay *flag = MPI_was_initialized; 39899256852SLisandro Dalcin return MPI_SUCCESS; 399e5c89e4eSSatish Balay } 400e5c89e4eSSatish Balay 4019371c9d4SSatish Balay int MPI_Finalized(int *flag) { 40258cd72c3SLisandro Dalcin *flag = MPI_was_finalized; 40399256852SLisandro Dalcin return MPI_SUCCESS; 404e5c89e4eSSatish Balay } 405e5c89e4eSSatish Balay 406e5c89e4eSSatish Balay /* ------------------- Fortran versions of several routines ------------------ */ 407e5c89e4eSSatish Balay 408f7c6e6aaSSatish Balay #if defined(PETSC_HAVE_FORTRAN_CAPS) 4090134af2dSBarry Smith #define mpiunisetmoduleblock_ MPIUNISETMODULEBLOCK 41052ecd5ffSSatish Balay #define mpiunisetfortranbasepointers_ MPIUNISETFORTRANBASEPOINTERS 411a7b85bbcSSatish Balay #define petsc_mpi_init_ PETSC_MPI_INIT 412a7b85bbcSSatish Balay #define petsc_mpi_finalize_ PETSC_MPI_FINALIZE 413a7b85bbcSSatish Balay #define petsc_mpi_comm_size_ PETSC_MPI_COMM_SIZE 414a7b85bbcSSatish Balay #define petsc_mpi_comm_rank_ PETSC_MPI_COMM_RANK 415a7b85bbcSSatish Balay #define petsc_mpi_abort_ PETSC_MPI_ABORT 416a7b85bbcSSatish Balay #define petsc_mpi_reduce_ PETSC_MPI_REDUCE 417a7b85bbcSSatish Balay #define petsc_mpi_allreduce_ PETSC_MPI_ALLREDUCE 418a7b85bbcSSatish Balay #define petsc_mpi_barrier_ PETSC_MPI_BARRIER 419a7b85bbcSSatish Balay #define petsc_mpi_bcast_ PETSC_MPI_BCAST 420a7b85bbcSSatish Balay #define petsc_mpi_gather_ PETSC_MPI_GATHER 421a7b85bbcSSatish Balay #define petsc_mpi_allgather_ PETSC_MPI_ALLGATHER 422a7b85bbcSSatish Balay #define petsc_mpi_comm_split_ PETSC_MPI_COMM_SPLIT 423a7b85bbcSSatish Balay #define petsc_mpi_scan_ PETSC_MPI_SCAN 424a7b85bbcSSatish Balay #define petsc_mpi_send_ PETSC_MPI_SEND 425a7b85bbcSSatish Balay #define petsc_mpi_recv_ PETSC_MPI_RECV 426a7b85bbcSSatish Balay #define petsc_mpi_reduce_scatter_ PETSC_MPI_REDUCE_SCATTER 427a7b85bbcSSatish Balay #define petsc_mpi_irecv_ PETSC_MPI_IRECV 428a7b85bbcSSatish Balay #define petsc_mpi_isend_ PETSC_MPI_ISEND 429a7b85bbcSSatish Balay #define petsc_mpi_sendrecv_ PETSC_MPI_SENDRECV 430a7b85bbcSSatish Balay #define petsc_mpi_test_ PETSC_MPI_TEST 431a7b85bbcSSatish Balay #define petsc_mpi_waitall_ PETSC_MPI_WAITALL 432a7b85bbcSSatish Balay #define petsc_mpi_waitany_ PETSC_MPI_WAITANY 433a7b85bbcSSatish Balay #define petsc_mpi_allgatherv_ PETSC_MPI_ALLGATHERV 434a7b85bbcSSatish Balay #define petsc_mpi_alltoallv_ PETSC_MPI_ALLTOALLV 435a7b85bbcSSatish Balay #define petsc_mpi_comm_create_ PETSC_MPI_COMM_CREATE 436a7b85bbcSSatish Balay #define petsc_mpi_address_ PETSC_MPI_ADDRESS 437a7b85bbcSSatish Balay #define petsc_mpi_pack_ PETSC_MPI_PACK 438a7b85bbcSSatish Balay #define petsc_mpi_unpack_ PETSC_MPI_UNPACK 439a7b85bbcSSatish Balay #define petsc_mpi_pack_size_ PETSC_MPI_PACK_SIZE 440a7b85bbcSSatish Balay #define petsc_mpi_type_struct_ PETSC_MPI_TYPE_STRUCT 441a7b85bbcSSatish Balay #define petsc_mpi_type_commit_ PETSC_MPI_TYPE_COMMIT 442a7b85bbcSSatish Balay #define petsc_mpi_wtime_ PETSC_MPI_WTIME 443a7b85bbcSSatish Balay #define petsc_mpi_cancel_ PETSC_MPI_CANCEL 444a7b85bbcSSatish Balay #define petsc_mpi_comm_dup_ PETSC_MPI_COMM_DUP 445a7b85bbcSSatish Balay #define petsc_mpi_comm_free_ PETSC_MPI_COMM_FREE 446a7b85bbcSSatish Balay #define petsc_mpi_get_count_ PETSC_MPI_GET_COUNT 447a7b85bbcSSatish Balay #define petsc_mpi_get_processor_name_ PETSC_MPI_GET_PROCESSOR_NAME 448a7b85bbcSSatish Balay #define petsc_mpi_initialized_ PETSC_MPI_INITIALIZED 449a7b85bbcSSatish Balay #define petsc_mpi_iprobe_ PETSC_MPI_IPROBE 450a7b85bbcSSatish Balay #define petsc_mpi_probe_ PETSC_MPI_PROBE 451a7b85bbcSSatish Balay #define petsc_mpi_request_free_ PETSC_MPI_REQUEST_FREE 452a7b85bbcSSatish Balay #define petsc_mpi_ssend_ PETSC_MPI_SSEND 453a7b85bbcSSatish Balay #define petsc_mpi_wait_ PETSC_MPI_WAIT 454a7b85bbcSSatish Balay #define petsc_mpi_comm_group_ PETSC_MPI_COMM_GROUP 455a7b85bbcSSatish Balay #define petsc_mpi_exscan_ PETSC_MPI_EXSCAN 456f7c6e6aaSSatish Balay #elif !defined(PETSC_HAVE_FORTRAN_UNDERSCORE) 4570134af2dSBarry Smith #define mpiunisetmoduleblock_ mpiunisetmoduleblock 45852ecd5ffSSatish Balay #define mpiunisetfortranbasepointers_ mpiunisetfortranbasepointers 459a7b85bbcSSatish Balay #define petsc_mpi_init_ petsc_mpi_init 460a7b85bbcSSatish Balay #define petsc_mpi_finalize_ petsc_mpi_finalize 461a7b85bbcSSatish Balay #define petsc_mpi_comm_size_ petsc_mpi_comm_size 462a7b85bbcSSatish Balay #define petsc_mpi_comm_rank_ petsc_mpi_comm_rank 463a7b85bbcSSatish Balay #define petsc_mpi_abort_ petsc_mpi_abort 464a7b85bbcSSatish Balay #define petsc_mpi_reduce_ petsc_mpi_reduce 465a7b85bbcSSatish Balay #define petsc_mpi_allreduce_ petsc_mpi_allreduce 466a7b85bbcSSatish Balay #define petsc_mpi_barrier_ petsc_mpi_barrier 467a7b85bbcSSatish Balay #define petsc_mpi_bcast_ petsc_mpi_bcast 468a7b85bbcSSatish Balay #define petsc_mpi_gather_ petsc_mpi_gather 469a7b85bbcSSatish Balay #define petsc_mpi_allgather_ petsc_mpi_allgather 470a7b85bbcSSatish Balay #define petsc_mpi_comm_split_ petsc_mpi_comm_split 471a7b85bbcSSatish Balay #define petsc_mpi_scan_ petsc_mpi_scan 472a7b85bbcSSatish Balay #define petsc_mpi_send_ petsc_mpi_send 473a7b85bbcSSatish Balay #define petsc_mpi_recv_ petsc_mpi_recv 474a7b85bbcSSatish Balay #define petsc_mpi_reduce_scatter_ petsc_mpi_reduce_scatter 475a7b85bbcSSatish Balay #define petsc_mpi_irecv_ petsc_mpi_irecv 476a7b85bbcSSatish Balay #define petsc_mpi_isend_ petsc_mpi_isend 477a7b85bbcSSatish Balay #define petsc_mpi_sendrecv_ petsc_mpi_sendrecv 478a7b85bbcSSatish Balay #define petsc_mpi_test_ petsc_mpi_test 479a7b85bbcSSatish Balay #define petsc_mpi_waitall_ petsc_mpi_waitall 480a7b85bbcSSatish Balay #define petsc_mpi_waitany_ petsc_mpi_waitany 481a7b85bbcSSatish Balay #define petsc_mpi_allgatherv_ petsc_mpi_allgatherv 482a7b85bbcSSatish Balay #define petsc_mpi_alltoallv_ petsc_mpi_alltoallv 483a7b85bbcSSatish Balay #define petsc_mpi_comm_create_ petsc_mpi_comm_create 484a7b85bbcSSatish Balay #define petsc_mpi_address_ petsc_mpi_address 485a7b85bbcSSatish Balay #define petsc_mpi_pack_ petsc_mpi_pack 486a7b85bbcSSatish Balay #define petsc_mpi_unpack_ petsc_mpi_unpack 487a7b85bbcSSatish Balay #define petsc_mpi_pack_size_ petsc_mpi_pack_size 488a7b85bbcSSatish Balay #define petsc_mpi_type_struct_ petsc_mpi_type_struct 489a7b85bbcSSatish Balay #define petsc_mpi_type_commit_ petsc_mpi_type_commit 490a7b85bbcSSatish Balay #define petsc_mpi_wtime_ petsc_mpi_wtime 491a7b85bbcSSatish Balay #define petsc_mpi_cancel_ petsc_mpi_cancel 492a7b85bbcSSatish Balay #define petsc_mpi_comm_dup_ petsc_mpi_comm_dup 493a7b85bbcSSatish Balay #define petsc_mpi_comm_free_ petsc_mpi_comm_free 494a7b85bbcSSatish Balay #define petsc_mpi_get_count_ petsc_mpi_get_count 495a7b85bbcSSatish Balay #define petsc_mpi_get_processor_name_ petsc_mpi_get_processor_name 496a7b85bbcSSatish Balay #define petsc_mpi_initialized_ petsc_mpi_initialized 497a7b85bbcSSatish Balay #define petsc_mpi_iprobe_ petsc_mpi_iprobe 498a7b85bbcSSatish Balay #define petsc_mpi_probe_ petsc_mpi_probe 499a7b85bbcSSatish Balay #define petsc_mpi_request_free_ petsc_mpi_request_free 500a7b85bbcSSatish Balay #define petsc_mpi_ssend_ petsc_mpi_ssend 501a7b85bbcSSatish Balay #define petsc_mpi_wait_ petsc_mpi_wait 502a7b85bbcSSatish Balay #define petsc_mpi_comm_group_ petsc_mpi_comm_group 503a7b85bbcSSatish Balay #define petsc_mpi_exscan_ petsc_mpi_exscan 504f7c6e6aaSSatish Balay #endif 505e5c89e4eSSatish Balay 506f7c6e6aaSSatish Balay #if defined(PETSC_HAVE_FORTRAN_UNDERSCORE_UNDERSCORE) 507a7b85bbcSSatish Balay #define petsc_mpi_init_ petsc_mpi_init__ 508a7b85bbcSSatish Balay #define petsc_mpi_finalize_ petsc_mpi_finalize__ 509a7b85bbcSSatish Balay #define petsc_mpi_comm_size_ petsc_mpi_comm_size__ 510a7b85bbcSSatish Balay #define petsc_mpi_comm_rank_ petsc_mpi_comm_rank__ 511a7b85bbcSSatish Balay #define petsc_mpi_abort_ petsc_mpi_abort__ 512a7b85bbcSSatish Balay #define petsc_mpi_reduce_ petsc_mpi_reduce__ 513a7b85bbcSSatish Balay #define petsc_mpi_allreduce_ petsc_mpi_allreduce__ 514a7b85bbcSSatish Balay #define petsc_mpi_barrier_ petsc_mpi_barrier__ 515a7b85bbcSSatish Balay #define petsc_mpi_bcast_ petsc_mpi_bcast__ 516a7b85bbcSSatish Balay #define petsc_mpi_gather_ petsc_mpi_gather__ 517a7b85bbcSSatish Balay #define petsc_mpi_allgather_ petsc_mpi_allgather__ 518a7b85bbcSSatish Balay #define petsc_mpi_comm_split_ petsc_mpi_comm_split__ 519a7b85bbcSSatish Balay #define petsc_mpi_scan_ petsc_mpi_scan__ 520a7b85bbcSSatish Balay #define petsc_mpi_send_ petsc_mpi_send__ 521a7b85bbcSSatish Balay #define petsc_mpi_recv_ petsc_mpi_recv__ 522a7b85bbcSSatish Balay #define petsc_mpi_reduce_scatter_ petsc_mpi_reduce_scatter__ 523a7b85bbcSSatish Balay #define petsc_mpi_irecv_ petsc_mpi_irecv__ 524a7b85bbcSSatish Balay #define petsc_mpi_isend_ petsc_mpi_isend__ 525a7b85bbcSSatish Balay #define petsc_mpi_sendrecv_ petsc_mpi_sendrecv__ 526a7b85bbcSSatish Balay #define petsc_mpi_test_ petsc_mpi_test__ 527a7b85bbcSSatish Balay #define petsc_mpi_waitall_ petsc_mpi_waitall__ 528a7b85bbcSSatish Balay #define petsc_mpi_waitany_ petsc_mpi_waitany__ 529a7b85bbcSSatish Balay #define petsc_mpi_allgatherv_ petsc_mpi_allgatherv__ 530a7b85bbcSSatish Balay #define petsc_mpi_alltoallv_ petsc_mpi_alltoallv__ 531a7b85bbcSSatish Balay #define petsc_mpi_comm_create_ petsc_mpi_comm_create__ 532a7b85bbcSSatish Balay #define petsc_mpi_address_ petsc_mpi_address__ 533a7b85bbcSSatish Balay #define petsc_mpi_pack_ petsc_mpi_pack__ 534a7b85bbcSSatish Balay #define petsc_mpi_unpack_ petsc_mpi_unpack__ 535a7b85bbcSSatish Balay #define petsc_mpi_pack_size_ petsc_mpi_pack_size__ 536a7b85bbcSSatish Balay #define petsc_mpi_type_struct_ petsc_mpi_type_struct__ 537a7b85bbcSSatish Balay #define petsc_mpi_type_commit_ petsc_mpi_type_commit__ 538a7b85bbcSSatish Balay #define petsc_mpi_wtime_ petsc_mpi_wtime__ 539a7b85bbcSSatish Balay #define petsc_mpi_cancel_ petsc_mpi_cancel__ 540a7b85bbcSSatish Balay #define petsc_mpi_comm_dup_ petsc_mpi_comm_dup__ 541a7b85bbcSSatish Balay #define petsc_mpi_comm_free_ petsc_mpi_comm_free__ 542a7b85bbcSSatish Balay #define petsc_mpi_get_count_ petsc_mpi_get_count__ 543a7b85bbcSSatish Balay #define petsc_mpi_get_processor_name_ petsc_mpi_get_processor_name__ 544a7b85bbcSSatish Balay #define petsc_mpi_initialized_ petsc_mpi_initialized__ 545a7b85bbcSSatish Balay #define petsc_mpi_iprobe_ petsc_mpi_iprobe__ 546a7b85bbcSSatish Balay #define petsc_mpi_probe_ petsc_mpi_probe__ 547a7b85bbcSSatish Balay #define petsc_mpi_request_free_ petsc_mpi_request_free__ 548a7b85bbcSSatish Balay #define petsc_mpi_ssend_ petsc_mpi_ssend__ 549a7b85bbcSSatish Balay #define petsc_mpi_wait_ petsc_mpi_wait__ 550a7b85bbcSSatish Balay #define petsc_mpi_comm_group_ petsc_mpi_comm_group__ 551a7b85bbcSSatish Balay #define petsc_mpi_exscan_ petsc_mpi_exscan__ 552f7c6e6aaSSatish Balay #endif 553e5c89e4eSSatish Balay 554c8217ed5SSatish Balay /* Do not build fortran interface if MPI namespace colision is to be avoided */ 555a7b85bbcSSatish Balay #if defined(PETSC_HAVE_FORTRAN) 556c8217ed5SSatish Balay 55719caf8f3SSatish Balay PETSC_EXTERN void mpiunisetmoduleblock_(void); 55852ecd5ffSSatish Balay 5599371c9d4SSatish Balay PETSC_EXTERN void mpiunisetfortranbasepointers_(void *f_mpi_in_place) { 56052ecd5ffSSatish Balay MPIUNIF_mpi_in_place = f_mpi_in_place; 56152ecd5ffSSatish Balay } 56252ecd5ffSSatish Balay 5639371c9d4SSatish Balay PETSC_EXTERN void petsc_mpi_init_(int *ierr) { 5640134af2dSBarry Smith mpiunisetmoduleblock_(); 565c8217ed5SSatish Balay *ierr = MPI_Init((int *)0, (char ***)0); 566e5c89e4eSSatish Balay } 567e5c89e4eSSatish Balay 5689371c9d4SSatish Balay PETSC_EXTERN void petsc_mpi_finalize_(int *ierr) { 569c8217ed5SSatish Balay *ierr = MPI_Finalize(); 570e5c89e4eSSatish Balay } 571e5c89e4eSSatish Balay 5729371c9d4SSatish Balay PETSC_EXTERN void petsc_mpi_comm_size_(MPI_Comm *comm, int *size, int *ierr) { 573e5c89e4eSSatish Balay *size = 1; 574e5c89e4eSSatish Balay *ierr = 0; 575e5c89e4eSSatish Balay } 576e5c89e4eSSatish Balay 5779371c9d4SSatish Balay PETSC_EXTERN void petsc_mpi_comm_rank_(MPI_Comm *comm, int *rank, int *ierr) { 578e5c89e4eSSatish Balay *rank = 0; 579e5c89e4eSSatish Balay *ierr = MPI_SUCCESS; 580e5c89e4eSSatish Balay } 581e5c89e4eSSatish Balay 5829371c9d4SSatish Balay PETSC_EXTERN void petsc_mpi_comm_split_(MPI_Comm *comm, int *color, int *key, MPI_Comm *newcomm, int *ierr) { 5831f6cc5b2SSatish Balay *newcomm = *comm; 5841f6cc5b2SSatish Balay *ierr = MPI_SUCCESS; 5851f6cc5b2SSatish Balay } 5861f6cc5b2SSatish Balay 5879371c9d4SSatish Balay PETSC_EXTERN void petsc_mpi_abort_(MPI_Comm *comm, int *errorcode, int *ierr) { 588e5c89e4eSSatish Balay abort(); 589e5c89e4eSSatish Balay *ierr = MPI_SUCCESS; 590e5c89e4eSSatish Balay } 591e5c89e4eSSatish Balay 5929371c9d4SSatish Balay PETSC_EXTERN void petsc_mpi_reduce_(void *sendbuf, void *recvbuf, int *count, int *datatype, int *op, int *root, int *comm, int *ierr) { 593f30578ecSBarry Smith *ierr = MPI_Reduce(sendbuf, recvbuf, *count, *datatype, *op, *root, *comm); 5943b644628SSatish Balay } 5953b644628SSatish Balay 5969371c9d4SSatish Balay PETSC_EXTERN void petsc_mpi_allreduce_(void *sendbuf, void *recvbuf, int *count, int *datatype, int *op, int *comm, int *ierr) { 597f30578ecSBarry Smith *ierr = MPI_Allreduce(sendbuf, recvbuf, *count, *datatype, *op, *comm); 598e5c89e4eSSatish Balay } 599e5c89e4eSSatish Balay 6009371c9d4SSatish Balay PETSC_EXTERN void petsc_mpi_barrier_(MPI_Comm *comm, int *ierr) { 601e5c89e4eSSatish Balay *ierr = MPI_SUCCESS; 602e5c89e4eSSatish Balay } 603f7c6e6aaSSatish Balay 6049371c9d4SSatish Balay PETSC_EXTERN void petsc_mpi_bcast_(void *buf, int *count, int *datatype, int *root, int *comm, int *ierr) { 605e5c89e4eSSatish Balay *ierr = MPI_SUCCESS; 606e5c89e4eSSatish Balay } 607f7c6e6aaSSatish Balay 6089371c9d4SSatish Balay PETSC_EXTERN void petsc_mpi_gather_(void *sendbuf, int *scount, int *sdatatype, void *recvbuf, int *rcount, int *rdatatype, int *root, int *comm, int *ierr) { 609f30578ecSBarry Smith *ierr = MPI_Gather(sendbuf, *scount, *sdatatype, recvbuf, rcount, rdatatype, *root, *comm); 610f7c6e6aaSSatish Balay } 611f7c6e6aaSSatish Balay 6129371c9d4SSatish Balay PETSC_EXTERN void petsc_mpi_allgather_(void *sendbuf, int *scount, int *sdatatype, void *recvbuf, int *rcount, int *rdatatype, int *comm, int *ierr) { 613f30578ecSBarry Smith *ierr = MPI_Allgather(sendbuf, *scount, *sdatatype, recvbuf, rcount, rdatatype, *comm); 614e5c89e4eSSatish Balay } 615e5c89e4eSSatish Balay 6169371c9d4SSatish Balay PETSC_EXTERN void petsc_mpi_scan_(void *sendbuf, void *recvbuf, int *count, int *datatype, int *op, int *comm, int *ierr) { 6171a589b05SJed Brown *ierr = MPIUNI_Memcpy(recvbuf, sendbuf, (*count) * MPI_sizeof(*datatype)); 6183b644628SSatish Balay } 6193b644628SSatish Balay 6209371c9d4SSatish Balay PETSC_EXTERN void petsc_mpi_send_(void *buf, int *count, int *datatype, int *dest, int *tag, int *comm, int *ierr) { 62106df1fb1SBarry Smith *ierr = MPIUni_Abort(MPI_COMM_WORLD, 0); 6221086b069SSatish Balay } 6231086b069SSatish Balay 6249371c9d4SSatish Balay PETSC_EXTERN void petsc_mpi_recv_(void *buf, int *count, int *datatype, int *source, int *tag, int *comm, int status, int *ierr) { 62506df1fb1SBarry Smith *ierr = MPIUni_Abort(MPI_COMM_WORLD, 0); 6261086b069SSatish Balay } 6271086b069SSatish Balay 6289371c9d4SSatish Balay PETSC_EXTERN void petsc_mpi_reduce_scatter_(void *sendbuf, void *recvbuf, int *recvcounts, int *datatype, int *op, int *comm, int *ierr) { 62906df1fb1SBarry Smith *ierr = MPIUni_Abort(MPI_COMM_WORLD, 0); 630156bc490SSatish Balay } 631156bc490SSatish Balay 6329371c9d4SSatish Balay PETSC_EXTERN void petsc_mpi_irecv_(void *buf, int *count, int *datatype, int *source, int *tag, int *comm, int *request, int *ierr) { 63306df1fb1SBarry Smith *ierr = MPIUni_Abort(MPI_COMM_WORLD, 0); 634156bc490SSatish Balay } 635156bc490SSatish Balay 6369371c9d4SSatish Balay PETSC_EXTERN void petsc_mpi_isend_(void *buf, int *count, int *datatype, int *dest, int *tag, int *comm, int *request, int *ierr) { 63706df1fb1SBarry Smith *ierr = MPIUni_Abort(MPI_COMM_WORLD, 0); 638156bc490SSatish Balay } 639156bc490SSatish Balay 6409371c9d4SSatish Balay PETSC_EXTERN void petsc_mpi_sendrecv_(void *sendbuf, int *sendcount, int *sendtype, int *dest, int *sendtag, void *recvbuf, int *recvcount, int *recvtype, int *source, int *recvtag, int *comm, int *status, int *ierr) { 6411a589b05SJed Brown *ierr = MPIUNI_Memcpy(recvbuf, sendbuf, (*sendcount) * MPI_sizeof(*sendtype)); 642156bc490SSatish Balay } 643156bc490SSatish Balay 6449371c9d4SSatish Balay PETSC_EXTERN void petsc_mpi_test_(int *request, int *flag, int *status, int *ierr) { 64506df1fb1SBarry Smith *ierr = MPIUni_Abort(MPI_COMM_WORLD, 0); 646156bc490SSatish Balay } 647156bc490SSatish Balay 6489371c9d4SSatish Balay PETSC_EXTERN void petsc_mpi_waitall_(int *count, int *array_of_requests, int *array_of_statuses, int *ierr) { 649156bc490SSatish Balay *ierr = MPI_SUCCESS; 650156bc490SSatish Balay } 651156bc490SSatish Balay 6529371c9d4SSatish Balay PETSC_EXTERN void petsc_mpi_waitany_(int *count, int *array_of_requests, int *index, int *status, int *ierr) { 653156bc490SSatish Balay *ierr = MPI_SUCCESS; 654156bc490SSatish Balay } 655156bc490SSatish Balay 6569371c9d4SSatish Balay PETSC_EXTERN void petsc_mpi_allgatherv_(void *sendbuf, int *sendcount, int *sendtype, void *recvbuf, int *recvcounts, int *displs, int *recvtype, int *comm, int *ierr) { 657f30578ecSBarry Smith *ierr = MPI_Allgatherv(sendbuf, *sendcount, *sendtype, recvbuf, recvcounts, displs, *recvtype, *comm); 658156bc490SSatish Balay } 659156bc490SSatish Balay 6609371c9d4SSatish Balay PETSC_EXTERN void petsc_mpi_alltoallv_(void *sendbuf, int *sendcounts, int *sdispls, int *sendtype, void *recvbuf, int *recvcounts, int *rdispls, int *recvtype, int *comm, int *ierr) { 661f30578ecSBarry Smith *ierr = MPI_Alltoallv(sendbuf, sendcounts, sdispls, *sendtype, recvbuf, recvcounts, rdispls, *recvtype, *comm); 662156bc490SSatish Balay } 663156bc490SSatish Balay 6649371c9d4SSatish Balay PETSC_EXTERN void petsc_mpi_comm_create_(int *comm, int *group, int *newcomm, int *ierr) { 665156bc490SSatish Balay *newcomm = *comm; 666156bc490SSatish Balay *ierr = MPI_SUCCESS; 667156bc490SSatish Balay } 668156bc490SSatish Balay 6699371c9d4SSatish Balay PETSC_EXTERN void petsc_mpi_address_(void *location, MPI_Aint *address, int *ierr) { 67099256852SLisandro Dalcin *address = (MPI_Aint)((char *)location); 671156bc490SSatish Balay *ierr = MPI_SUCCESS; 672156bc490SSatish Balay } 673156bc490SSatish Balay 6749371c9d4SSatish Balay PETSC_EXTERN void petsc_mpi_pack_(void *inbuf, int *incount, int *datatype, void *outbuf, int *outsize, int *position, int *comm, int *ierr) { 67506df1fb1SBarry Smith *ierr = MPIUni_Abort(MPI_COMM_WORLD, 0); 676156bc490SSatish Balay } 677156bc490SSatish Balay 6789371c9d4SSatish Balay PETSC_EXTERN void petsc_mpi_unpack_(void *inbuf, int *insize, int *position, void *outbuf, int *outcount, int *datatype, int *comm, int *ierr) { 67906df1fb1SBarry Smith *ierr = MPIUni_Abort(MPI_COMM_WORLD, 0); 680156bc490SSatish Balay } 681156bc490SSatish Balay 6829371c9d4SSatish Balay PETSC_EXTERN void petsc_mpi_pack_size_(int *incount, int *datatype, int *comm, int *size, int *ierr) { 68306df1fb1SBarry Smith *ierr = MPIUni_Abort(MPI_COMM_WORLD, 0); 684156bc490SSatish Balay } 685156bc490SSatish Balay 6869371c9d4SSatish Balay PETSC_EXTERN void petsc_mpi_type_struct_(int *count, int *array_of_blocklengths, int *array_of_displaments, int *array_of_types, int *newtype, int *ierr) { 68706df1fb1SBarry Smith *ierr = MPIUni_Abort(MPI_COMM_WORLD, 0); 688156bc490SSatish Balay } 689156bc490SSatish Balay 6909371c9d4SSatish Balay PETSC_EXTERN void petsc_mpi_type_commit_(int *datatype, int *ierr) { 691156bc490SSatish Balay *ierr = MPI_SUCCESS; 692156bc490SSatish Balay } 693156bc490SSatish Balay 6949371c9d4SSatish Balay double petsc_mpi_wtime_(void) { 695156bc490SSatish Balay return 0.0; 696f8f52c7dSSatish Balay } 697156bc490SSatish Balay 6989371c9d4SSatish Balay PETSC_EXTERN void petsc_mpi_cancel_(int *request, int *ierr) { 699f8f52c7dSSatish Balay *ierr = MPI_SUCCESS; 700f8f52c7dSSatish Balay } 701f8f52c7dSSatish Balay 7029371c9d4SSatish Balay PETSC_EXTERN void petsc_mpi_comm_dup_(int *comm, int *out, int *ierr) { 703f8f52c7dSSatish Balay *out = *comm; 704f8f52c7dSSatish Balay *ierr = MPI_SUCCESS; 705f8f52c7dSSatish Balay } 706f8f52c7dSSatish Balay 7079371c9d4SSatish Balay PETSC_EXTERN void petsc_mpi_comm_free_(int *comm, int *ierr) { 708f8f52c7dSSatish Balay *ierr = MPI_SUCCESS; 709f8f52c7dSSatish Balay } 710f8f52c7dSSatish Balay 7119371c9d4SSatish Balay PETSC_EXTERN void petsc_mpi_get_count_(int *status, int *datatype, int *count, int *ierr) { 71206df1fb1SBarry Smith *ierr = MPIUni_Abort(MPI_COMM_WORLD, 0); 713f8f52c7dSSatish Balay } 714f8f52c7dSSatish Balay 7159371c9d4SSatish Balay PETSC_EXTERN void petsc_mpi_get_processor_name_(char *name, int *result_len, int *ierr, PETSC_FORTRAN_CHARLEN_T len) { 716f8f52c7dSSatish Balay MPIUNI_Memcpy(name, "localhost", 9 * sizeof(char)); 717f8f52c7dSSatish Balay *result_len = 9; 718f8f52c7dSSatish Balay *ierr = MPI_SUCCESS; 719f8f52c7dSSatish Balay } 720f8f52c7dSSatish Balay 7219371c9d4SSatish Balay PETSC_EXTERN void petsc_mpi_initialized_(int *flag, int *ierr) { 722f8f52c7dSSatish Balay *flag = MPI_was_initialized; 723f8f52c7dSSatish Balay *ierr = MPI_SUCCESS; 724f8f52c7dSSatish Balay } 725f8f52c7dSSatish Balay 7269371c9d4SSatish Balay PETSC_EXTERN void petsc_mpi_iprobe_(int *source, int *tag, int *comm, int *glag, int *status, int *ierr) { 727f8f52c7dSSatish Balay *ierr = MPI_SUCCESS; 728f8f52c7dSSatish Balay } 729f8f52c7dSSatish Balay 7309371c9d4SSatish Balay PETSC_EXTERN void petsc_mpi_probe_(int *source, int *tag, int *comm, int *flag, int *status, int *ierr) { 731f8f52c7dSSatish Balay *ierr = MPI_SUCCESS; 732f8f52c7dSSatish Balay } 733f8f52c7dSSatish Balay 7349371c9d4SSatish Balay PETSC_EXTERN void petsc_mpi_request_free_(int *request, int *ierr) { 735f8f52c7dSSatish Balay *ierr = MPI_SUCCESS; 736f8f52c7dSSatish Balay } 737f8f52c7dSSatish Balay 7389371c9d4SSatish Balay PETSC_EXTERN void petsc_mpi_ssend_(void *buf, int *count, int *datatype, int *dest, int *tag, int *comm, int *ierr) { 73906df1fb1SBarry Smith *ierr = MPIUni_Abort(MPI_COMM_WORLD, 0); 740f8f52c7dSSatish Balay } 741f8f52c7dSSatish Balay 7429371c9d4SSatish Balay PETSC_EXTERN void petsc_mpi_wait_(int *request, int *status, int *ierr) { 743f8f52c7dSSatish Balay *ierr = MPI_SUCCESS; 744156bc490SSatish Balay } 745156bc490SSatish Balay 7469371c9d4SSatish Balay PETSC_EXTERN void petsc_mpi_comm_group_(int *comm, int *group, int *ierr) { 747d4816372SSatish Balay *ierr = MPI_SUCCESS; 748d4816372SSatish Balay } 749d4816372SSatish Balay 7509371c9d4SSatish Balay PETSC_EXTERN void petsc_mpi_exscan_(void *sendbuf, void *recvbuf, int *count, int *datatype, int *op, int *comm, int *ierr) { 751d4816372SSatish Balay *ierr = MPI_SUCCESS; 752d4816372SSatish Balay } 753d4816372SSatish Balay 754a7b85bbcSSatish Balay #endif /* PETSC_HAVE_FORTRAN */ 755c8217ed5SSatish Balay 756e5c89e4eSSatish Balay #if defined(__cplusplus) 757e5c89e4eSSatish Balay } 758e5c89e4eSSatish Balay #endif 759