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> 66524c165SJacob 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 */ 573649609aSBarry Smith int MPIUNI_Memcpy(void *dst, const void *src, MPI_Count n) 58d71ae5a4SJacob Faibussowitsch { 596e42a002SJunchao Zhang if (dst == MPI_IN_PLACE || dst == MPIUNIF_mpi_in_place) return MPI_SUCCESS; 606e42a002SJunchao Zhang if (src == MPI_IN_PLACE || src == MPIUNIF_mpi_in_place) return MPI_SUCCESS; 616e42a002SJunchao Zhang if (!n) return MPI_SUCCESS; 62e5c89e4eSSatish Balay 6305035670SJunchao Zhang /* GPU-aware MPIUNI. Use synchronous copy per MPI semantics */ 6405035670SJunchao Zhang #if defined(PETSC_HAVE_CUDA) 659371c9d4SSatish Balay if (PetscDeviceInitialized(PETSC_DEVICE_CUDA)) { 669371c9d4SSatish Balay cudaError_t cerr = cudaMemcpy(dst, src, n, cudaMemcpyDefault); 679371c9d4SSatish Balay if (cerr != cudaSuccess) return MPI_FAILURE; 689371c9d4SSatish Balay } else 6905035670SJunchao Zhang #elif defined(PETSC_HAVE_HIP) 709371c9d4SSatish Balay if (PetscDeviceInitialized(PETSC_DEVICE_HIP)) { 719371c9d4SSatish Balay hipError_t cerr = hipMemcpy(dst, src, n, hipMemcpyDefault); 729371c9d4SSatish Balay if (cerr != hipSuccess) return MPI_FAILURE; 739371c9d4SSatish Balay } else 74a6191124SJunchao Zhang #endif 759371c9d4SSatish Balay { 76dd460d27SBarry Smith (void)memcpy(dst, src, n); 779371c9d4SSatish Balay } 7899256852SLisandro Dalcin return MPI_SUCCESS; 79e5c89e4eSSatish Balay } 80e5c89e4eSSatish Balay 8112801b39SBarry Smith static int classcnt = 0; 8212801b39SBarry Smith static int codecnt = 0; 8312801b39SBarry Smith 84d71ae5a4SJacob Faibussowitsch int MPI_Add_error_class(int *cl) 85d71ae5a4SJacob Faibussowitsch { 8612801b39SBarry Smith *cl = classcnt++; 8712801b39SBarry Smith return MPI_SUCCESS; 8812801b39SBarry Smith } 8912801b39SBarry Smith 90d71ae5a4SJacob Faibussowitsch int MPI_Add_error_code(int cl, int *co) 91d71ae5a4SJacob Faibussowitsch { 9212801b39SBarry Smith if (cl >= classcnt) return MPI_FAILURE; 9312801b39SBarry Smith *co = codecnt++; 9412801b39SBarry Smith return MPI_SUCCESS; 9512801b39SBarry Smith } 9612801b39SBarry Smith 97d71ae5a4SJacob Faibussowitsch int MPI_Type_get_envelope(MPI_Datatype datatype, int *num_integers, int *num_addresses, int *num_datatypes, int *combiner) 98d71ae5a4SJacob Faibussowitsch { 991a589b05SJed Brown int comb = datatype >> 28; 1001a589b05SJed Brown switch (comb) { 1011a589b05SJed Brown case MPI_COMBINER_NAMED: 1021a589b05SJed Brown *num_integers = 0; 1031a589b05SJed Brown *num_addresses = 0; 1041a589b05SJed Brown *num_datatypes = 0; 1051a589b05SJed Brown *combiner = comb; 1061a589b05SJed Brown break; 1071a589b05SJed Brown case MPI_COMBINER_DUP: 1081a589b05SJed Brown *num_integers = 0; 1091a589b05SJed Brown *num_addresses = 0; 1101a589b05SJed Brown *num_datatypes = 1; 1111a589b05SJed Brown *combiner = comb; 1121a589b05SJed Brown break; 1131a589b05SJed Brown case MPI_COMBINER_CONTIGUOUS: 1141a589b05SJed Brown *num_integers = 1; 1151a589b05SJed Brown *num_addresses = 0; 1161a589b05SJed Brown *num_datatypes = 1; 1171a589b05SJed Brown *combiner = comb; 1181a589b05SJed Brown break; 119d71ae5a4SJacob Faibussowitsch default: 120d71ae5a4SJacob Faibussowitsch return MPIUni_Abort(MPI_COMM_SELF, 1); 1211a589b05SJed Brown } 12299256852SLisandro Dalcin return MPI_SUCCESS; 1231a589b05SJed Brown } 1241a589b05SJed Brown 125d71ae5a4SJacob Faibussowitsch 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) 126d71ae5a4SJacob Faibussowitsch { 1271a589b05SJed Brown int comb = datatype >> 28; 1281a589b05SJed Brown switch (comb) { 129d71ae5a4SJacob Faibussowitsch case MPI_COMBINER_NAMED: 130d71ae5a4SJacob Faibussowitsch return MPIUni_Abort(MPI_COMM_SELF, 1); 1311a589b05SJed Brown case MPI_COMBINER_DUP: 1321a589b05SJed Brown if (max_datatypes < 1) return MPIUni_Abort(MPI_COMM_SELF, 1); 1331a589b05SJed Brown array_of_datatypes[0] = datatype & 0x0fffffff; 1341a589b05SJed Brown break; 1351a589b05SJed Brown case MPI_COMBINER_CONTIGUOUS: 1361a589b05SJed Brown if (max_integers < 1 || max_datatypes < 1) return MPIUni_Abort(MPI_COMM_SELF, 1); 1371a589b05SJed Brown array_of_integers[0] = (datatype >> 8) & 0xfff; /* count */ 1381a589b05SJed Brown array_of_datatypes[0] = (datatype & 0x0ff000ff) | 0x100; /* basic named type (count=1) from which the contiguous type is derived */ 1391a589b05SJed Brown break; 140d71ae5a4SJacob Faibussowitsch default: 141d71ae5a4SJacob Faibussowitsch return MPIUni_Abort(MPI_COMM_SELF, 1); 1421a589b05SJed Brown } 14399256852SLisandro Dalcin return MPI_SUCCESS; 1441a589b05SJed Brown } 1451a589b05SJed Brown 146e5c89e4eSSatish Balay /* 147e5c89e4eSSatish Balay Used to set the built-in MPI_TAG_UB attribute 148e5c89e4eSSatish Balay */ 149d71ae5a4SJacob Faibussowitsch static int Keyval_setup(void) 150d71ae5a4SJacob Faibussowitsch { 151f0463fa0SJunchao Zhang attr[CommIdx(MPI_COMM_WORLD)][0].active = 1; 152f0463fa0SJunchao Zhang attr[CommIdx(MPI_COMM_WORLD)][0].attribute_val = &mpi_tag_ub; 153f0463fa0SJunchao Zhang attr[CommIdx(MPI_COMM_SELF)][0].active = 1; 154f0463fa0SJunchao Zhang attr[CommIdx(MPI_COMM_SELF)][0].attribute_val = &mpi_tag_ub; 155f0463fa0SJunchao Zhang attr_keyval[0].active = 1; 15699256852SLisandro Dalcin return MPI_SUCCESS; 157e5c89e4eSSatish Balay } 158e5c89e4eSSatish Balay 159dd460d27SBarry Smith int MPI_Comm_create_keyval(PETSC_UNUSED MPI_Copy_function *copy_fn, PETSC_UNUSED MPI_Delete_function *delete_fn, int *keyval, void *extra_state) 160d71ae5a4SJacob Faibussowitsch { 161f0463fa0SJunchao Zhang int i, keyid; 162dd460d27SBarry Smith 163dd460d27SBarry Smith (void)copy_fn; 164dd460d27SBarry Smith (void)delete_fn; 165f0463fa0SJunchao Zhang for (i = 1; i < num_attr; i++) { /* the first attribute is always in use */ 166f0463fa0SJunchao Zhang if (!attr_keyval[i].active) { 167f0463fa0SJunchao Zhang keyid = i; 168f0463fa0SJunchao Zhang goto found; 169f0463fa0SJunchao Zhang } 170f0463fa0SJunchao Zhang } 1719cf9c1dbSJed Brown if (num_attr >= MAX_ATTR) return MPIUni_Abort(MPI_COMM_WORLD, 1); 172f0463fa0SJunchao Zhang keyid = num_attr++; 173e5c89e4eSSatish Balay 174f0463fa0SJunchao Zhang found: 175f0463fa0SJunchao Zhang attr_keyval[keyid].extra_state = extra_state; 176f0463fa0SJunchao Zhang attr_keyval[keyid].del = delete_fn; 177f0463fa0SJunchao Zhang attr_keyval[keyid].active = 1; 178f0463fa0SJunchao Zhang *keyval = keyid; 17999256852SLisandro Dalcin return MPI_SUCCESS; 180e5c89e4eSSatish Balay } 181e5c89e4eSSatish Balay 18236f0be53SJacob Faibussowitsch /* 18336f0be53SJacob Faibussowitsch The reference counting business is here to guard against the following: 18436f0be53SJacob Faibussowitsch 18536f0be53SJacob Faibussowitsch MPI_Comm_set_attr(comm, keyval, some_attr); 18636f0be53SJacob Faibussowitsch MPI_Comm_free_keyval(&keyval); 18736f0be53SJacob Faibussowitsch MPI_Comm_free(&comm); 18836f0be53SJacob Faibussowitsch 18936f0be53SJacob Faibussowitsch Here MPI_Comm_free() will try to destroy all of the attributes of the comm, and hence we 19036f0be53SJacob Faibussowitsch should not clear the deleter or extra_state until all communicators that have the attribute 19136f0be53SJacob Faibussowitsch set are either freed or have given up their attribute. 19236f0be53SJacob Faibussowitsch 19336f0be53SJacob Faibussowitsch The attribute reference count is INCREASED in: 19436f0be53SJacob Faibussowitsch - MPI_Comm_create_keyval() 19536f0be53SJacob Faibussowitsch - MPI_Comm_set_attr() 19636f0be53SJacob Faibussowitsch 19736f0be53SJacob Faibussowitsch The atrtibute reference count is DECREASED in: 19836f0be53SJacob Faibussowitsch - MPI_Comm_free_keyval() 19936f0be53SJacob Faibussowitsch - MPI_Comm_delete_attr() (but only if the comm has the attribute) 20036f0be53SJacob Faibussowitsch */ 201d71ae5a4SJacob Faibussowitsch static int MPI_Attr_dereference_keyval(int keyval) 202d71ae5a4SJacob Faibussowitsch { 203*663e1fa8SPierre Jolivet if (--attr_keyval[keyval].active <= 0) { 20436f0be53SJacob Faibussowitsch attr_keyval[keyval].extra_state = 0; 20536f0be53SJacob Faibussowitsch attr_keyval[keyval].del = 0; 20636f0be53SJacob Faibussowitsch } 20736f0be53SJacob Faibussowitsch return MPI_SUCCESS; 20836f0be53SJacob Faibussowitsch } 20936f0be53SJacob Faibussowitsch 210d71ae5a4SJacob Faibussowitsch static int MPI_Attr_reference_keyval(int keyval) 211d71ae5a4SJacob Faibussowitsch { 212*663e1fa8SPierre Jolivet ++attr_keyval[keyval].active; 21336f0be53SJacob Faibussowitsch return MPI_SUCCESS; 21436f0be53SJacob Faibussowitsch } 21536f0be53SJacob Faibussowitsch 216d71ae5a4SJacob Faibussowitsch int MPI_Comm_free_keyval(int *keyval) 217d71ae5a4SJacob Faibussowitsch { 21836f0be53SJacob Faibussowitsch int ret; 21936f0be53SJacob Faibussowitsch 22036f0be53SJacob Faibussowitsch if (*keyval < 0 || *keyval >= num_attr) return MPI_FAILURE; 22136f0be53SJacob Faibussowitsch if ((ret = MPI_Attr_dereference_keyval(*keyval))) return ret; 222a246e310SBarry Smith *keyval = 0; 223e5c89e4eSSatish Balay return MPI_SUCCESS; 224e5c89e4eSSatish Balay } 225e5c89e4eSSatish Balay 226d71ae5a4SJacob Faibussowitsch int MPI_Comm_set_attr(MPI_Comm comm, int keyval, void *attribute_val) 227d71ae5a4SJacob Faibussowitsch { 22836f0be53SJacob Faibussowitsch int idx = CommIdx(comm), ret; 229f0463fa0SJunchao Zhang if (comm < 1 || comm > MaxComm) return MPI_FAILURE; 23036f0be53SJacob Faibussowitsch if (keyval < 0 || keyval >= num_attr) return MPI_FAILURE; 23136f0be53SJacob Faibussowitsch 23236f0be53SJacob Faibussowitsch if ((ret = MPI_Comm_delete_attr(comm, keyval))) return ret; 23336f0be53SJacob Faibussowitsch if ((ret = MPI_Attr_reference_keyval(keyval))) return ret; 234f0463fa0SJunchao Zhang attr[idx][keyval].active = 1; 235f0463fa0SJunchao Zhang attr[idx][keyval].attribute_val = attribute_val; 236e5c89e4eSSatish Balay return MPI_SUCCESS; 237e5c89e4eSSatish Balay } 238e5c89e4eSSatish Balay 239d71ae5a4SJacob Faibussowitsch int MPI_Comm_delete_attr(MPI_Comm comm, int keyval) 240d71ae5a4SJacob Faibussowitsch { 241f0463fa0SJunchao Zhang int idx = CommIdx(comm); 242f0463fa0SJunchao Zhang if (comm < 1 || comm > MaxComm) return MPI_FAILURE; 24336f0be53SJacob Faibussowitsch if (keyval < 0 || keyval >= num_attr) return MPI_FAILURE; 24436f0be53SJacob Faibussowitsch if (attr[idx][keyval].active) { 24536f0be53SJacob Faibussowitsch int ret; 246f0463fa0SJunchao Zhang void *save_attribute_val = attr[idx][keyval].attribute_val; 24736f0be53SJacob Faibussowitsch 248f0463fa0SJunchao Zhang attr[idx][keyval].active = 0; 249f0463fa0SJunchao Zhang attr[idx][keyval].attribute_val = 0; 25036f0be53SJacob Faibussowitsch if (attr_keyval[keyval].del) { 251f4f49eeaSPierre Jolivet if ((ret = (*attr_keyval[keyval].del)(comm, keyval, save_attribute_val, attr_keyval[keyval].extra_state))) return ret; 25236f0be53SJacob Faibussowitsch } 25336f0be53SJacob Faibussowitsch if ((ret = MPI_Attr_dereference_keyval(keyval))) return ret; 25440776e1bSpetsc } 255e5c89e4eSSatish Balay return MPI_SUCCESS; 256e5c89e4eSSatish Balay } 257e5c89e4eSSatish Balay 258d71ae5a4SJacob Faibussowitsch int MPI_Comm_get_attr(MPI_Comm comm, int keyval, void *attribute_val, int *flag) 259d71ae5a4SJacob Faibussowitsch { 260f0463fa0SJunchao Zhang int idx = CommIdx(comm); 261f0463fa0SJunchao Zhang if (comm < 1 || comm > MaxComm) return MPI_FAILURE; 262e5c89e4eSSatish Balay if (!keyval) Keyval_setup(); 263f0463fa0SJunchao Zhang *flag = attr[idx][keyval].active; 264f0463fa0SJunchao Zhang *(void **)attribute_val = attr[idx][keyval].attribute_val; 265e5c89e4eSSatish Balay return MPI_SUCCESS; 266e5c89e4eSSatish Balay } 267e5c89e4eSSatish Balay 2689371c9d4SSatish Balay static char all_comm_names[MAX_COMM][MPI_MAX_OBJECT_NAME] = {"MPI_COMM_SELF", "MPI_COMM_WORLD"}; 2693e1d142dSJacob Faibussowitsch 270d71ae5a4SJacob Faibussowitsch int MPI_Comm_get_name(MPI_Comm comm, char *comm_name, int *resultlen) 271d71ae5a4SJacob Faibussowitsch { 2723e1d142dSJacob Faibussowitsch if (comm < 1 || comm > MaxComm) return MPI_FAILURE; 2733e1d142dSJacob Faibussowitsch if (!comm_name || !resultlen) return MPI_FAILURE; 274dd460d27SBarry Smith (void)strncpy(comm_name, all_comm_names[CommIdx(comm)], MPI_MAX_OBJECT_NAME - 1); 2753e1d142dSJacob Faibussowitsch *resultlen = (int)strlen(comm_name); 2763e1d142dSJacob Faibussowitsch return MPI_SUCCESS; 2773e1d142dSJacob Faibussowitsch } 2783e1d142dSJacob Faibussowitsch 279d71ae5a4SJacob Faibussowitsch int MPI_Comm_set_name(MPI_Comm comm, const char *comm_name) 280d71ae5a4SJacob Faibussowitsch { 2813e1d142dSJacob Faibussowitsch if (comm < 1 || comm > MaxComm) return MPI_FAILURE; 2823e1d142dSJacob Faibussowitsch if (!comm_name) return MPI_FAILURE; 2833e1d142dSJacob Faibussowitsch if (strlen(comm_name) > MPI_MAX_OBJECT_NAME - 1) return MPI_FAILURE; 284dd460d27SBarry Smith (void)strncpy(all_comm_names[CommIdx(comm)], comm_name, MPI_MAX_OBJECT_NAME - 1); 2853e1d142dSJacob Faibussowitsch return MPI_SUCCESS; 2863e1d142dSJacob Faibussowitsch } 2873e1d142dSJacob Faibussowitsch 288d71ae5a4SJacob Faibussowitsch int MPI_Comm_create(MPI_Comm comm, MPI_Group group, MPI_Comm *newcomm) 289d71ae5a4SJacob Faibussowitsch { 290f60917d2SBarry Smith int j; 291f0463fa0SJunchao Zhang if (comm < 1 || comm > MaxComm) return MPI_FAILURE; 292f0463fa0SJunchao Zhang for (j = 3; j <= MaxComm; j++) { 293f0463fa0SJunchao Zhang if (!comm_active[CommIdx(j)]) { 294f0463fa0SJunchao Zhang comm_active[CommIdx(j)] = 1; 295f60917d2SBarry Smith *newcomm = j; 296f60917d2SBarry Smith return MPI_SUCCESS; 297f60917d2SBarry Smith } 298f60917d2SBarry Smith } 299f0463fa0SJunchao Zhang if (MaxComm >= MAX_COMM) return MPI_FAILURE; 300f0463fa0SJunchao Zhang *newcomm = ++MaxComm; 301f0463fa0SJunchao Zhang comm_active[CommIdx(*newcomm)] = 1; 302c8217ed5SSatish Balay return MPI_SUCCESS; 303c8217ed5SSatish Balay } 304c8217ed5SSatish Balay 305d71ae5a4SJacob Faibussowitsch int MPI_Comm_dup(MPI_Comm comm, MPI_Comm *out) 306d71ae5a4SJacob Faibussowitsch { 307f60917d2SBarry Smith int j; 308f0463fa0SJunchao Zhang if (comm < 1 || comm > MaxComm) return MPI_FAILURE; 309f0463fa0SJunchao Zhang for (j = 3; j <= MaxComm; j++) { 310f0463fa0SJunchao Zhang if (!comm_active[CommIdx(j)]) { 311f0463fa0SJunchao Zhang comm_active[CommIdx(j)] = 1; 312f60917d2SBarry Smith *out = j; 313f60917d2SBarry Smith return MPI_SUCCESS; 314f60917d2SBarry Smith } 315f60917d2SBarry Smith } 316f0463fa0SJunchao Zhang if (MaxComm >= MAX_COMM) return MPI_FAILURE; 317f0463fa0SJunchao Zhang *out = ++MaxComm; 318f0463fa0SJunchao Zhang comm_active[CommIdx(*out)] = 1; 31999256852SLisandro Dalcin return MPI_SUCCESS; 320e5c89e4eSSatish Balay } 321e5c89e4eSSatish Balay 322d71ae5a4SJacob Faibussowitsch int MPI_Comm_free(MPI_Comm *comm) 323d71ae5a4SJacob Faibussowitsch { 324f0463fa0SJunchao Zhang int idx = CommIdx(*comm); 325e5c89e4eSSatish Balay 326f0463fa0SJunchao Zhang if (*comm < 1 || *comm > MaxComm) return MPI_FAILURE; 32736f0be53SJacob Faibussowitsch for (int i = 0; i < num_attr; i++) { 32836f0be53SJacob Faibussowitsch int ret = MPI_Comm_delete_attr(*comm, i); 32936f0be53SJacob Faibussowitsch 33036f0be53SJacob Faibussowitsch if (ret) return ret; 331e5c89e4eSSatish Balay } 332f0463fa0SJunchao Zhang if (*comm >= 3) comm_active[idx] = 0; 333100f28aeSBarry Smith *comm = 0; 334e5c89e4eSSatish Balay return MPI_SUCCESS; 335e5c89e4eSSatish Balay } 336e5c89e4eSSatish Balay 337d71ae5a4SJacob Faibussowitsch int MPI_Comm_size(MPI_Comm comm, int *size) 338d71ae5a4SJacob Faibussowitsch { 339f0463fa0SJunchao Zhang if (comm < 1 || comm > MaxComm) return MPI_FAILURE; 340d393f697SSatish Balay *size = 1; 341d393f697SSatish Balay return MPI_SUCCESS; 342d393f697SSatish Balay } 343d393f697SSatish Balay 344d71ae5a4SJacob Faibussowitsch int MPI_Comm_rank(MPI_Comm comm, int *rank) 345d71ae5a4SJacob Faibussowitsch { 346f0463fa0SJunchao Zhang if (comm < 1 || comm > MaxComm) return MPI_FAILURE; 347d393f697SSatish Balay *rank = 0; 348d393f697SSatish Balay return MPI_SUCCESS; 349d393f697SSatish Balay } 350d393f697SSatish Balay 351d71ae5a4SJacob Faibussowitsch int MPIUni_Abort(MPI_Comm comm, int errorcode) 352d71ae5a4SJacob Faibussowitsch { 353dd460d27SBarry Smith (void)printf("MPI operation not supported by PETSc's sequential MPI wrappers\n"); 354b3f11779SBarry Smith return MPI_ERR_NOSUPPORT; 35506df1fb1SBarry Smith } 35606df1fb1SBarry Smith 357d71ae5a4SJacob Faibussowitsch int MPI_Abort(MPI_Comm comm, int errorcode) 358d71ae5a4SJacob Faibussowitsch { 359e5c89e4eSSatish Balay abort(); 360e5c89e4eSSatish Balay return MPI_SUCCESS; 361e5c89e4eSSatish Balay } 362e5c89e4eSSatish Balay 36358cd72c3SLisandro Dalcin /* --------------------------------------------------------------------------*/ 36458cd72c3SLisandro Dalcin 365e5c89e4eSSatish Balay static int MPI_was_initialized = 0; 36658cd72c3SLisandro Dalcin static int MPI_was_finalized = 0; 36758cd72c3SLisandro Dalcin 368d71ae5a4SJacob Faibussowitsch int MPI_Init(int *argc, char ***argv) 369d71ae5a4SJacob Faibussowitsch { 37099256852SLisandro Dalcin if (MPI_was_initialized) return MPI_FAILURE; 3719bcf9d5aSJunchao Zhang /* MPI standard says "once MPI_Finalize returns, no MPI routine (not even MPI_Init) may be called", so an MPI standard compliant 3729bcf9d5aSJunchao Zhang MPIU should have this 'if (MPI_was_finalized) return MPI_FAILURE;' check. We relax it here to make life easier for users 3739bcf9d5aSJunchao Zhang of MPIU so that they can do multiple PetscInitialize/Finalize(). 3749bcf9d5aSJunchao Zhang */ 3759bcf9d5aSJunchao Zhang /* if (MPI_was_finalized) return MPI_FAILURE; */ 37658cd72c3SLisandro Dalcin MPI_was_initialized = 1; 3779bcf9d5aSJunchao Zhang MPI_was_finalized = 0; 37899256852SLisandro Dalcin return MPI_SUCCESS; 37958cd72c3SLisandro Dalcin } 38058cd72c3SLisandro Dalcin 381d71ae5a4SJacob Faibussowitsch int MPI_Init_thread(int *argc, char ***argv, int required, int *provided) 382d71ae5a4SJacob Faibussowitsch { 3839012378cSStefano Zampini MPI_Query_thread(provided); 3849012378cSStefano Zampini return MPI_Init(argc, argv); 3859012378cSStefano Zampini } 3869012378cSStefano Zampini 387d71ae5a4SJacob Faibussowitsch int MPI_Query_thread(int *provided) 388d71ae5a4SJacob Faibussowitsch { 3899012378cSStefano Zampini *provided = MPI_THREAD_FUNNELED; 3909012378cSStefano Zampini return MPI_SUCCESS; 3919012378cSStefano Zampini } 3929012378cSStefano Zampini 393d71ae5a4SJacob Faibussowitsch int MPI_Finalize(void) 394d71ae5a4SJacob Faibussowitsch { 39536f0be53SJacob Faibussowitsch if (MPI_was_finalized || !MPI_was_initialized) return MPI_FAILURE; 39636f0be53SJacob Faibussowitsch MPI_Comm comm = MPI_COMM_WORLD; 39736f0be53SJacob Faibussowitsch int ret = MPI_Comm_free(&comm); 39836f0be53SJacob Faibussowitsch 39936f0be53SJacob Faibussowitsch if (ret) return ret; 400100f28aeSBarry Smith comm = MPI_COMM_SELF; 40136f0be53SJacob Faibussowitsch ret = MPI_Comm_free(&comm); 40236f0be53SJacob Faibussowitsch if (ret) return ret; 40336f0be53SJacob Faibussowitsch if (PetscDefined(USE_DEBUG)) { 40436f0be53SJacob Faibussowitsch for (int i = 3; i <= MaxComm; ++i) { 405f0463fa0SJunchao Zhang if (comm_active[CommIdx(i)]) printf("MPIUni warning: MPI communicator %d is not freed before MPI_Finalize()\n", i); 406f0463fa0SJunchao Zhang } 40736f0be53SJacob Faibussowitsch 40836f0be53SJacob Faibussowitsch for (int i = 1; i <= MaxComm; ++i) { 40936f0be53SJacob Faibussowitsch for (int j = 0; j < num_attr; ++j) { 41036f0be53SJacob Faibussowitsch if (attr[CommIdx(i)][j].active) printf("MPIUni warning: MPI communicator %d attribute %d was not freed before MPI_Finalize()\n", i, j); 411f0463fa0SJunchao Zhang } 41236f0be53SJacob Faibussowitsch } 41336f0be53SJacob Faibussowitsch 41436f0be53SJacob Faibussowitsch for (int i = 1; i < num_attr; ++i) { 41536f0be53SJacob Faibussowitsch if (attr_keyval[i].active) printf("MPIUni warning: MPI attribute %d was not freed before MPI_Finalize()\n", i); 41636f0be53SJacob Faibussowitsch } 41736f0be53SJacob Faibussowitsch } 41836f0be53SJacob Faibussowitsch 419f0463fa0SJunchao Zhang /* reset counters */ 420f0463fa0SJunchao Zhang MaxComm = 2; 421f0463fa0SJunchao Zhang num_attr = 1; 42258cd72c3SLisandro Dalcin MPI_was_finalized = 1; 4239bcf9d5aSJunchao Zhang MPI_was_initialized = 0; 4249bcf9d5aSJunchao Zhang PETSC_COMM_WORLD = MPI_COMM_NULL; 42599256852SLisandro Dalcin return MPI_SUCCESS; 42658cd72c3SLisandro Dalcin } 427e5c89e4eSSatish Balay 428d71ae5a4SJacob Faibussowitsch int MPI_Initialized(int *flag) 429d71ae5a4SJacob Faibussowitsch { 430e5c89e4eSSatish Balay *flag = MPI_was_initialized; 43199256852SLisandro Dalcin return MPI_SUCCESS; 432e5c89e4eSSatish Balay } 433e5c89e4eSSatish Balay 434d71ae5a4SJacob Faibussowitsch int MPI_Finalized(int *flag) 435d71ae5a4SJacob Faibussowitsch { 43658cd72c3SLisandro Dalcin *flag = MPI_was_finalized; 43799256852SLisandro Dalcin return MPI_SUCCESS; 438e5c89e4eSSatish Balay } 439e5c89e4eSSatish Balay 440317ae730SBarry Smith int MPI_Win_free(MPI_Win *win) 441317ae730SBarry Smith { 442317ae730SBarry Smith free(*win); 443317ae730SBarry Smith *win = NULL; 444317ae730SBarry Smith return MPI_SUCCESS; 445317ae730SBarry Smith } 446317ae730SBarry Smith 447317ae730SBarry Smith int MPI_Win_allocate_shared(size_t sz, size_t asz, MPI_Info info, MPI_Comm comm, void **addr, MPI_Win *win) 448317ae730SBarry Smith { 449317ae730SBarry Smith *win = *addr = malloc(sz); 450317ae730SBarry Smith return MPI_SUCCESS; 451317ae730SBarry Smith } 452317ae730SBarry Smith 453e5c89e4eSSatish Balay /* ------------------- Fortran versions of several routines ------------------ */ 454e5c89e4eSSatish Balay 455f7c6e6aaSSatish Balay #if defined(PETSC_HAVE_FORTRAN_CAPS) 4560134af2dSBarry Smith #define mpiunisetmoduleblock_ MPIUNISETMODULEBLOCK 45752ecd5ffSSatish Balay #define mpiunisetfortranbasepointers_ MPIUNISETFORTRANBASEPOINTERS 458a7b85bbcSSatish Balay #define petsc_mpi_init_ PETSC_MPI_INIT 459a7b85bbcSSatish Balay #define petsc_mpi_finalize_ PETSC_MPI_FINALIZE 460a7b85bbcSSatish Balay #define petsc_mpi_comm_size_ PETSC_MPI_COMM_SIZE 461a7b85bbcSSatish Balay #define petsc_mpi_comm_rank_ PETSC_MPI_COMM_RANK 462a7b85bbcSSatish Balay #define petsc_mpi_abort_ PETSC_MPI_ABORT 463a7b85bbcSSatish Balay #define petsc_mpi_reduce_ PETSC_MPI_REDUCE 464a7b85bbcSSatish Balay #define petsc_mpi_allreduce_ PETSC_MPI_ALLREDUCE 465a7b85bbcSSatish Balay #define petsc_mpi_barrier_ PETSC_MPI_BARRIER 466a7b85bbcSSatish Balay #define petsc_mpi_bcast_ PETSC_MPI_BCAST 467a7b85bbcSSatish Balay #define petsc_mpi_gather_ PETSC_MPI_GATHER 468a7b85bbcSSatish Balay #define petsc_mpi_allgather_ PETSC_MPI_ALLGATHER 469a7b85bbcSSatish Balay #define petsc_mpi_comm_split_ PETSC_MPI_COMM_SPLIT 470a7b85bbcSSatish Balay #define petsc_mpi_scan_ PETSC_MPI_SCAN 471a7b85bbcSSatish Balay #define petsc_mpi_send_ PETSC_MPI_SEND 472a7b85bbcSSatish Balay #define petsc_mpi_recv_ PETSC_MPI_RECV 473a7b85bbcSSatish Balay #define petsc_mpi_reduce_scatter_ PETSC_MPI_REDUCE_SCATTER 474a7b85bbcSSatish Balay #define petsc_mpi_irecv_ PETSC_MPI_IRECV 475a7b85bbcSSatish Balay #define petsc_mpi_isend_ PETSC_MPI_ISEND 476a7b85bbcSSatish Balay #define petsc_mpi_sendrecv_ PETSC_MPI_SENDRECV 477a7b85bbcSSatish Balay #define petsc_mpi_test_ PETSC_MPI_TEST 478a7b85bbcSSatish Balay #define petsc_mpi_waitall_ PETSC_MPI_WAITALL 479a7b85bbcSSatish Balay #define petsc_mpi_waitany_ PETSC_MPI_WAITANY 480a7b85bbcSSatish Balay #define petsc_mpi_allgatherv_ PETSC_MPI_ALLGATHERV 481a7b85bbcSSatish Balay #define petsc_mpi_alltoallv_ PETSC_MPI_ALLTOALLV 482a7b85bbcSSatish Balay #define petsc_mpi_comm_create_ PETSC_MPI_COMM_CREATE 483a7b85bbcSSatish Balay #define petsc_mpi_address_ PETSC_MPI_ADDRESS 484a7b85bbcSSatish Balay #define petsc_mpi_pack_ PETSC_MPI_PACK 485a7b85bbcSSatish Balay #define petsc_mpi_unpack_ PETSC_MPI_UNPACK 486a7b85bbcSSatish Balay #define petsc_mpi_pack_size_ PETSC_MPI_PACK_SIZE 487a7b85bbcSSatish Balay #define petsc_mpi_type_struct_ PETSC_MPI_TYPE_STRUCT 488a7b85bbcSSatish Balay #define petsc_mpi_type_commit_ PETSC_MPI_TYPE_COMMIT 489a7b85bbcSSatish Balay #define petsc_mpi_wtime_ PETSC_MPI_WTIME 490a7b85bbcSSatish Balay #define petsc_mpi_cancel_ PETSC_MPI_CANCEL 491a7b85bbcSSatish Balay #define petsc_mpi_comm_dup_ PETSC_MPI_COMM_DUP 492a7b85bbcSSatish Balay #define petsc_mpi_comm_free_ PETSC_MPI_COMM_FREE 493a7b85bbcSSatish Balay #define petsc_mpi_get_count_ PETSC_MPI_GET_COUNT 494a7b85bbcSSatish Balay #define petsc_mpi_get_processor_name_ PETSC_MPI_GET_PROCESSOR_NAME 495a7b85bbcSSatish Balay #define petsc_mpi_initialized_ PETSC_MPI_INITIALIZED 496a7b85bbcSSatish Balay #define petsc_mpi_iprobe_ PETSC_MPI_IPROBE 497a7b85bbcSSatish Balay #define petsc_mpi_probe_ PETSC_MPI_PROBE 498a7b85bbcSSatish Balay #define petsc_mpi_request_free_ PETSC_MPI_REQUEST_FREE 499a7b85bbcSSatish Balay #define petsc_mpi_ssend_ PETSC_MPI_SSEND 500a7b85bbcSSatish Balay #define petsc_mpi_wait_ PETSC_MPI_WAIT 501a7b85bbcSSatish Balay #define petsc_mpi_comm_group_ PETSC_MPI_COMM_GROUP 502a7b85bbcSSatish Balay #define petsc_mpi_exscan_ PETSC_MPI_EXSCAN 503f7c6e6aaSSatish Balay #elif !defined(PETSC_HAVE_FORTRAN_UNDERSCORE) 5040134af2dSBarry Smith #define mpiunisetmoduleblock_ mpiunisetmoduleblock 50552ecd5ffSSatish Balay #define mpiunisetfortranbasepointers_ mpiunisetfortranbasepointers 506a7b85bbcSSatish Balay #define petsc_mpi_init_ petsc_mpi_init 507a7b85bbcSSatish Balay #define petsc_mpi_finalize_ petsc_mpi_finalize 508a7b85bbcSSatish Balay #define petsc_mpi_comm_size_ petsc_mpi_comm_size 509a7b85bbcSSatish Balay #define petsc_mpi_comm_rank_ petsc_mpi_comm_rank 510a7b85bbcSSatish Balay #define petsc_mpi_abort_ petsc_mpi_abort 511a7b85bbcSSatish Balay #define petsc_mpi_reduce_ petsc_mpi_reduce 512a7b85bbcSSatish Balay #define petsc_mpi_allreduce_ petsc_mpi_allreduce 513a7b85bbcSSatish Balay #define petsc_mpi_barrier_ petsc_mpi_barrier 514a7b85bbcSSatish Balay #define petsc_mpi_bcast_ petsc_mpi_bcast 515a7b85bbcSSatish Balay #define petsc_mpi_gather_ petsc_mpi_gather 516a7b85bbcSSatish Balay #define petsc_mpi_allgather_ petsc_mpi_allgather 517a7b85bbcSSatish Balay #define petsc_mpi_comm_split_ petsc_mpi_comm_split 518a7b85bbcSSatish Balay #define petsc_mpi_scan_ petsc_mpi_scan 519a7b85bbcSSatish Balay #define petsc_mpi_send_ petsc_mpi_send 520a7b85bbcSSatish Balay #define petsc_mpi_recv_ petsc_mpi_recv 521a7b85bbcSSatish Balay #define petsc_mpi_reduce_scatter_ petsc_mpi_reduce_scatter 522a7b85bbcSSatish Balay #define petsc_mpi_irecv_ petsc_mpi_irecv 523a7b85bbcSSatish Balay #define petsc_mpi_isend_ petsc_mpi_isend 524a7b85bbcSSatish Balay #define petsc_mpi_sendrecv_ petsc_mpi_sendrecv 525a7b85bbcSSatish Balay #define petsc_mpi_test_ petsc_mpi_test 526a7b85bbcSSatish Balay #define petsc_mpi_waitall_ petsc_mpi_waitall 527a7b85bbcSSatish Balay #define petsc_mpi_waitany_ petsc_mpi_waitany 528a7b85bbcSSatish Balay #define petsc_mpi_allgatherv_ petsc_mpi_allgatherv 529a7b85bbcSSatish Balay #define petsc_mpi_alltoallv_ petsc_mpi_alltoallv 530a7b85bbcSSatish Balay #define petsc_mpi_comm_create_ petsc_mpi_comm_create 531a7b85bbcSSatish Balay #define petsc_mpi_address_ petsc_mpi_address 532a7b85bbcSSatish Balay #define petsc_mpi_pack_ petsc_mpi_pack 533a7b85bbcSSatish Balay #define petsc_mpi_unpack_ petsc_mpi_unpack 534a7b85bbcSSatish Balay #define petsc_mpi_pack_size_ petsc_mpi_pack_size 535a7b85bbcSSatish Balay #define petsc_mpi_type_struct_ petsc_mpi_type_struct 536a7b85bbcSSatish Balay #define petsc_mpi_type_commit_ petsc_mpi_type_commit 537a7b85bbcSSatish Balay #define petsc_mpi_wtime_ petsc_mpi_wtime 538a7b85bbcSSatish Balay #define petsc_mpi_cancel_ petsc_mpi_cancel 539a7b85bbcSSatish Balay #define petsc_mpi_comm_dup_ petsc_mpi_comm_dup 540a7b85bbcSSatish Balay #define petsc_mpi_comm_free_ petsc_mpi_comm_free 541a7b85bbcSSatish Balay #define petsc_mpi_get_count_ petsc_mpi_get_count 542a7b85bbcSSatish Balay #define petsc_mpi_get_processor_name_ petsc_mpi_get_processor_name 543a7b85bbcSSatish Balay #define petsc_mpi_initialized_ petsc_mpi_initialized 544a7b85bbcSSatish Balay #define petsc_mpi_iprobe_ petsc_mpi_iprobe 545a7b85bbcSSatish Balay #define petsc_mpi_probe_ petsc_mpi_probe 546a7b85bbcSSatish Balay #define petsc_mpi_request_free_ petsc_mpi_request_free 547a7b85bbcSSatish Balay #define petsc_mpi_ssend_ petsc_mpi_ssend 548a7b85bbcSSatish Balay #define petsc_mpi_wait_ petsc_mpi_wait 549a7b85bbcSSatish Balay #define petsc_mpi_comm_group_ petsc_mpi_comm_group 550a7b85bbcSSatish Balay #define petsc_mpi_exscan_ petsc_mpi_exscan 551f7c6e6aaSSatish Balay #endif 552e5c89e4eSSatish Balay 553f7c6e6aaSSatish Balay #if defined(PETSC_HAVE_FORTRAN_UNDERSCORE_UNDERSCORE) 554a7b85bbcSSatish Balay #define petsc_mpi_init_ petsc_mpi_init__ 555a7b85bbcSSatish Balay #define petsc_mpi_finalize_ petsc_mpi_finalize__ 556a7b85bbcSSatish Balay #define petsc_mpi_comm_size_ petsc_mpi_comm_size__ 557a7b85bbcSSatish Balay #define petsc_mpi_comm_rank_ petsc_mpi_comm_rank__ 558a7b85bbcSSatish Balay #define petsc_mpi_abort_ petsc_mpi_abort__ 559a7b85bbcSSatish Balay #define petsc_mpi_reduce_ petsc_mpi_reduce__ 560a7b85bbcSSatish Balay #define petsc_mpi_allreduce_ petsc_mpi_allreduce__ 561a7b85bbcSSatish Balay #define petsc_mpi_barrier_ petsc_mpi_barrier__ 562a7b85bbcSSatish Balay #define petsc_mpi_bcast_ petsc_mpi_bcast__ 563a7b85bbcSSatish Balay #define petsc_mpi_gather_ petsc_mpi_gather__ 564a7b85bbcSSatish Balay #define petsc_mpi_allgather_ petsc_mpi_allgather__ 565a7b85bbcSSatish Balay #define petsc_mpi_comm_split_ petsc_mpi_comm_split__ 566a7b85bbcSSatish Balay #define petsc_mpi_scan_ petsc_mpi_scan__ 567a7b85bbcSSatish Balay #define petsc_mpi_send_ petsc_mpi_send__ 568a7b85bbcSSatish Balay #define petsc_mpi_recv_ petsc_mpi_recv__ 569a7b85bbcSSatish Balay #define petsc_mpi_reduce_scatter_ petsc_mpi_reduce_scatter__ 570a7b85bbcSSatish Balay #define petsc_mpi_irecv_ petsc_mpi_irecv__ 571a7b85bbcSSatish Balay #define petsc_mpi_isend_ petsc_mpi_isend__ 572a7b85bbcSSatish Balay #define petsc_mpi_sendrecv_ petsc_mpi_sendrecv__ 573a7b85bbcSSatish Balay #define petsc_mpi_test_ petsc_mpi_test__ 574a7b85bbcSSatish Balay #define petsc_mpi_waitall_ petsc_mpi_waitall__ 575a7b85bbcSSatish Balay #define petsc_mpi_waitany_ petsc_mpi_waitany__ 576a7b85bbcSSatish Balay #define petsc_mpi_allgatherv_ petsc_mpi_allgatherv__ 577a7b85bbcSSatish Balay #define petsc_mpi_alltoallv_ petsc_mpi_alltoallv__ 578a7b85bbcSSatish Balay #define petsc_mpi_comm_create_ petsc_mpi_comm_create__ 579a7b85bbcSSatish Balay #define petsc_mpi_address_ petsc_mpi_address__ 580a7b85bbcSSatish Balay #define petsc_mpi_pack_ petsc_mpi_pack__ 581a7b85bbcSSatish Balay #define petsc_mpi_unpack_ petsc_mpi_unpack__ 582a7b85bbcSSatish Balay #define petsc_mpi_pack_size_ petsc_mpi_pack_size__ 583a7b85bbcSSatish Balay #define petsc_mpi_type_struct_ petsc_mpi_type_struct__ 584a7b85bbcSSatish Balay #define petsc_mpi_type_commit_ petsc_mpi_type_commit__ 585a7b85bbcSSatish Balay #define petsc_mpi_wtime_ petsc_mpi_wtime__ 586a7b85bbcSSatish Balay #define petsc_mpi_cancel_ petsc_mpi_cancel__ 587a7b85bbcSSatish Balay #define petsc_mpi_comm_dup_ petsc_mpi_comm_dup__ 588a7b85bbcSSatish Balay #define petsc_mpi_comm_free_ petsc_mpi_comm_free__ 589a7b85bbcSSatish Balay #define petsc_mpi_get_count_ petsc_mpi_get_count__ 590a7b85bbcSSatish Balay #define petsc_mpi_get_processor_name_ petsc_mpi_get_processor_name__ 591a7b85bbcSSatish Balay #define petsc_mpi_initialized_ petsc_mpi_initialized__ 592a7b85bbcSSatish Balay #define petsc_mpi_iprobe_ petsc_mpi_iprobe__ 593a7b85bbcSSatish Balay #define petsc_mpi_probe_ petsc_mpi_probe__ 594a7b85bbcSSatish Balay #define petsc_mpi_request_free_ petsc_mpi_request_free__ 595a7b85bbcSSatish Balay #define petsc_mpi_ssend_ petsc_mpi_ssend__ 596a7b85bbcSSatish Balay #define petsc_mpi_wait_ petsc_mpi_wait__ 597a7b85bbcSSatish Balay #define petsc_mpi_comm_group_ petsc_mpi_comm_group__ 598a7b85bbcSSatish Balay #define petsc_mpi_exscan_ petsc_mpi_exscan__ 599f7c6e6aaSSatish Balay #endif 600e5c89e4eSSatish Balay 601da81f932SPierre Jolivet /* Do not build fortran interface if MPI namespace collision is to be avoided */ 602fbf9dbe5SBarry Smith #if defined(PETSC_USE_FORTRAN_BINDINGS) 603c8217ed5SSatish Balay 60419caf8f3SSatish Balay PETSC_EXTERN void mpiunisetmoduleblock_(void); 60552ecd5ffSSatish Balay 606d71ae5a4SJacob Faibussowitsch PETSC_EXTERN void mpiunisetfortranbasepointers_(void *f_mpi_in_place) 607d71ae5a4SJacob Faibussowitsch { 60852ecd5ffSSatish Balay MPIUNIF_mpi_in_place = f_mpi_in_place; 60952ecd5ffSSatish Balay } 61052ecd5ffSSatish Balay 611d71ae5a4SJacob Faibussowitsch PETSC_EXTERN void petsc_mpi_init_(int *ierr) 612d71ae5a4SJacob Faibussowitsch { 6130134af2dSBarry Smith mpiunisetmoduleblock_(); 614c8025a54SPierre Jolivet *ierr = MPI_Init(NULL, NULL); 615e5c89e4eSSatish Balay } 616e5c89e4eSSatish Balay 617d71ae5a4SJacob Faibussowitsch PETSC_EXTERN void petsc_mpi_finalize_(int *ierr) 618d71ae5a4SJacob Faibussowitsch { 619c8217ed5SSatish Balay *ierr = MPI_Finalize(); 620e5c89e4eSSatish Balay } 621e5c89e4eSSatish Balay 622d71ae5a4SJacob Faibussowitsch PETSC_EXTERN void petsc_mpi_comm_size_(MPI_Comm *comm, int *size, int *ierr) 623d71ae5a4SJacob Faibussowitsch { 624e5c89e4eSSatish Balay *size = 1; 625e5c89e4eSSatish Balay *ierr = 0; 626e5c89e4eSSatish Balay } 627e5c89e4eSSatish Balay 628d71ae5a4SJacob Faibussowitsch PETSC_EXTERN void petsc_mpi_comm_rank_(MPI_Comm *comm, int *rank, int *ierr) 629d71ae5a4SJacob Faibussowitsch { 630e5c89e4eSSatish Balay *rank = 0; 631e5c89e4eSSatish Balay *ierr = MPI_SUCCESS; 632e5c89e4eSSatish Balay } 633e5c89e4eSSatish Balay 634d71ae5a4SJacob Faibussowitsch PETSC_EXTERN void petsc_mpi_comm_split_(MPI_Comm *comm, int *color, int *key, MPI_Comm *newcomm, int *ierr) 635d71ae5a4SJacob Faibussowitsch { 6361f6cc5b2SSatish Balay *newcomm = *comm; 6371f6cc5b2SSatish Balay *ierr = MPI_SUCCESS; 6381f6cc5b2SSatish Balay } 6391f6cc5b2SSatish Balay 640d71ae5a4SJacob Faibussowitsch PETSC_EXTERN void petsc_mpi_abort_(MPI_Comm *comm, int *errorcode, int *ierr) 641d71ae5a4SJacob Faibussowitsch { 642e5c89e4eSSatish Balay abort(); 643e5c89e4eSSatish Balay *ierr = MPI_SUCCESS; 644e5c89e4eSSatish Balay } 645e5c89e4eSSatish Balay 646d71ae5a4SJacob Faibussowitsch PETSC_EXTERN void petsc_mpi_reduce_(void *sendbuf, void *recvbuf, int *count, int *datatype, int *op, int *root, int *comm, int *ierr) 647d71ae5a4SJacob Faibussowitsch { 648f30578ecSBarry Smith *ierr = MPI_Reduce(sendbuf, recvbuf, *count, *datatype, *op, *root, *comm); 6493b644628SSatish Balay } 6503b644628SSatish Balay 651d71ae5a4SJacob Faibussowitsch PETSC_EXTERN void petsc_mpi_allreduce_(void *sendbuf, void *recvbuf, int *count, int *datatype, int *op, int *comm, int *ierr) 652d71ae5a4SJacob Faibussowitsch { 653f30578ecSBarry Smith *ierr = MPI_Allreduce(sendbuf, recvbuf, *count, *datatype, *op, *comm); 654e5c89e4eSSatish Balay } 655e5c89e4eSSatish Balay 656d71ae5a4SJacob Faibussowitsch PETSC_EXTERN void petsc_mpi_barrier_(MPI_Comm *comm, int *ierr) 657d71ae5a4SJacob Faibussowitsch { 658e5c89e4eSSatish Balay *ierr = MPI_SUCCESS; 659e5c89e4eSSatish Balay } 660f7c6e6aaSSatish Balay 661d71ae5a4SJacob Faibussowitsch PETSC_EXTERN void petsc_mpi_bcast_(void *buf, int *count, int *datatype, int *root, int *comm, int *ierr) 662d71ae5a4SJacob Faibussowitsch { 663e5c89e4eSSatish Balay *ierr = MPI_SUCCESS; 664e5c89e4eSSatish Balay } 665f7c6e6aaSSatish Balay 666d71ae5a4SJacob Faibussowitsch PETSC_EXTERN void petsc_mpi_gather_(void *sendbuf, int *scount, int *sdatatype, void *recvbuf, int *rcount, int *rdatatype, int *root, int *comm, int *ierr) 667d71ae5a4SJacob Faibussowitsch { 668f30578ecSBarry Smith *ierr = MPI_Gather(sendbuf, *scount, *sdatatype, recvbuf, rcount, rdatatype, *root, *comm); 669f7c6e6aaSSatish Balay } 670f7c6e6aaSSatish Balay 671d71ae5a4SJacob Faibussowitsch PETSC_EXTERN void petsc_mpi_allgather_(void *sendbuf, int *scount, int *sdatatype, void *recvbuf, int *rcount, int *rdatatype, int *comm, int *ierr) 672d71ae5a4SJacob Faibussowitsch { 673f30578ecSBarry Smith *ierr = MPI_Allgather(sendbuf, *scount, *sdatatype, recvbuf, rcount, rdatatype, *comm); 674e5c89e4eSSatish Balay } 675e5c89e4eSSatish Balay 676d71ae5a4SJacob Faibussowitsch PETSC_EXTERN void petsc_mpi_scan_(void *sendbuf, void *recvbuf, int *count, int *datatype, int *op, int *comm, int *ierr) 677d71ae5a4SJacob Faibussowitsch { 6781a589b05SJed Brown *ierr = MPIUNI_Memcpy(recvbuf, sendbuf, (*count) * MPI_sizeof(*datatype)); 6793b644628SSatish Balay } 6803b644628SSatish Balay 681d71ae5a4SJacob Faibussowitsch PETSC_EXTERN void petsc_mpi_send_(void *buf, int *count, int *datatype, int *dest, int *tag, int *comm, int *ierr) 682d71ae5a4SJacob Faibussowitsch { 68306df1fb1SBarry Smith *ierr = MPIUni_Abort(MPI_COMM_WORLD, 0); 6841086b069SSatish Balay } 6851086b069SSatish Balay 686d71ae5a4SJacob Faibussowitsch PETSC_EXTERN void petsc_mpi_recv_(void *buf, int *count, int *datatype, int *source, int *tag, int *comm, int status, int *ierr) 687d71ae5a4SJacob Faibussowitsch { 68806df1fb1SBarry Smith *ierr = MPIUni_Abort(MPI_COMM_WORLD, 0); 6891086b069SSatish Balay } 6901086b069SSatish Balay 691d71ae5a4SJacob Faibussowitsch PETSC_EXTERN void petsc_mpi_reduce_scatter_(void *sendbuf, void *recvbuf, int *recvcounts, int *datatype, int *op, int *comm, int *ierr) 692d71ae5a4SJacob Faibussowitsch { 69306df1fb1SBarry Smith *ierr = MPIUni_Abort(MPI_COMM_WORLD, 0); 694156bc490SSatish Balay } 695156bc490SSatish Balay 696d71ae5a4SJacob Faibussowitsch PETSC_EXTERN void petsc_mpi_irecv_(void *buf, int *count, int *datatype, int *source, int *tag, int *comm, int *request, int *ierr) 697d71ae5a4SJacob Faibussowitsch { 69806df1fb1SBarry Smith *ierr = MPIUni_Abort(MPI_COMM_WORLD, 0); 699156bc490SSatish Balay } 700156bc490SSatish Balay 701d71ae5a4SJacob Faibussowitsch PETSC_EXTERN void petsc_mpi_isend_(void *buf, int *count, int *datatype, int *dest, int *tag, int *comm, int *request, int *ierr) 702d71ae5a4SJacob Faibussowitsch { 70306df1fb1SBarry Smith *ierr = MPIUni_Abort(MPI_COMM_WORLD, 0); 704156bc490SSatish Balay } 705156bc490SSatish Balay 706d71ae5a4SJacob Faibussowitsch 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) 707d71ae5a4SJacob Faibussowitsch { 7081a589b05SJed Brown *ierr = MPIUNI_Memcpy(recvbuf, sendbuf, (*sendcount) * MPI_sizeof(*sendtype)); 709156bc490SSatish Balay } 710156bc490SSatish Balay 711d71ae5a4SJacob Faibussowitsch PETSC_EXTERN void petsc_mpi_test_(int *request, int *flag, int *status, int *ierr) 712d71ae5a4SJacob Faibussowitsch { 71306df1fb1SBarry Smith *ierr = MPIUni_Abort(MPI_COMM_WORLD, 0); 714156bc490SSatish Balay } 715156bc490SSatish Balay 716d71ae5a4SJacob Faibussowitsch PETSC_EXTERN void petsc_mpi_waitall_(int *count, int *array_of_requests, int *array_of_statuses, int *ierr) 717d71ae5a4SJacob Faibussowitsch { 718156bc490SSatish Balay *ierr = MPI_SUCCESS; 719156bc490SSatish Balay } 720156bc490SSatish Balay 721d71ae5a4SJacob Faibussowitsch PETSC_EXTERN void petsc_mpi_waitany_(int *count, int *array_of_requests, int *index, int *status, int *ierr) 722d71ae5a4SJacob Faibussowitsch { 723156bc490SSatish Balay *ierr = MPI_SUCCESS; 724156bc490SSatish Balay } 725156bc490SSatish Balay 726d71ae5a4SJacob Faibussowitsch PETSC_EXTERN void petsc_mpi_allgatherv_(void *sendbuf, int *sendcount, int *sendtype, void *recvbuf, int *recvcounts, int *displs, int *recvtype, int *comm, int *ierr) 727d71ae5a4SJacob Faibussowitsch { 728f30578ecSBarry Smith *ierr = MPI_Allgatherv(sendbuf, *sendcount, *sendtype, recvbuf, recvcounts, displs, *recvtype, *comm); 729156bc490SSatish Balay } 730156bc490SSatish Balay 731d71ae5a4SJacob Faibussowitsch 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) 732d71ae5a4SJacob Faibussowitsch { 733f30578ecSBarry Smith *ierr = MPI_Alltoallv(sendbuf, sendcounts, sdispls, *sendtype, recvbuf, recvcounts, rdispls, *recvtype, *comm); 734156bc490SSatish Balay } 735156bc490SSatish Balay 736d71ae5a4SJacob Faibussowitsch PETSC_EXTERN void petsc_mpi_comm_create_(int *comm, int *group, int *newcomm, int *ierr) 737d71ae5a4SJacob Faibussowitsch { 738156bc490SSatish Balay *newcomm = *comm; 739156bc490SSatish Balay *ierr = MPI_SUCCESS; 740156bc490SSatish Balay } 741156bc490SSatish Balay 742d71ae5a4SJacob Faibussowitsch PETSC_EXTERN void petsc_mpi_address_(void *location, MPI_Aint *address, int *ierr) 743d71ae5a4SJacob Faibussowitsch { 74499256852SLisandro Dalcin *address = (MPI_Aint)((char *)location); 745156bc490SSatish Balay *ierr = MPI_SUCCESS; 746156bc490SSatish Balay } 747156bc490SSatish Balay 748d71ae5a4SJacob Faibussowitsch PETSC_EXTERN void petsc_mpi_pack_(void *inbuf, int *incount, int *datatype, void *outbuf, int *outsize, int *position, int *comm, int *ierr) 749d71ae5a4SJacob Faibussowitsch { 75006df1fb1SBarry Smith *ierr = MPIUni_Abort(MPI_COMM_WORLD, 0); 751156bc490SSatish Balay } 752156bc490SSatish Balay 753d71ae5a4SJacob Faibussowitsch PETSC_EXTERN void petsc_mpi_unpack_(void *inbuf, int *insize, int *position, void *outbuf, int *outcount, int *datatype, int *comm, int *ierr) 754d71ae5a4SJacob Faibussowitsch { 75506df1fb1SBarry Smith *ierr = MPIUni_Abort(MPI_COMM_WORLD, 0); 756156bc490SSatish Balay } 757156bc490SSatish Balay 758d71ae5a4SJacob Faibussowitsch PETSC_EXTERN void petsc_mpi_pack_size_(int *incount, int *datatype, int *comm, int *size, int *ierr) 759d71ae5a4SJacob Faibussowitsch { 76006df1fb1SBarry Smith *ierr = MPIUni_Abort(MPI_COMM_WORLD, 0); 761156bc490SSatish Balay } 762156bc490SSatish Balay 763d71ae5a4SJacob Faibussowitsch 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) 764d71ae5a4SJacob Faibussowitsch { 76506df1fb1SBarry Smith *ierr = MPIUni_Abort(MPI_COMM_WORLD, 0); 766156bc490SSatish Balay } 767156bc490SSatish Balay 768d71ae5a4SJacob Faibussowitsch PETSC_EXTERN void petsc_mpi_type_commit_(int *datatype, int *ierr) 769d71ae5a4SJacob Faibussowitsch { 770156bc490SSatish Balay *ierr = MPI_SUCCESS; 771156bc490SSatish Balay } 772156bc490SSatish Balay 773d71ae5a4SJacob Faibussowitsch double petsc_mpi_wtime_(void) 774d71ae5a4SJacob Faibussowitsch { 775156bc490SSatish Balay return 0.0; 776f8f52c7dSSatish Balay } 777156bc490SSatish Balay 778d71ae5a4SJacob Faibussowitsch PETSC_EXTERN void petsc_mpi_cancel_(int *request, int *ierr) 779d71ae5a4SJacob Faibussowitsch { 780f8f52c7dSSatish Balay *ierr = MPI_SUCCESS; 781f8f52c7dSSatish Balay } 782f8f52c7dSSatish Balay 783d71ae5a4SJacob Faibussowitsch PETSC_EXTERN void petsc_mpi_comm_dup_(int *comm, int *out, int *ierr) 784d71ae5a4SJacob Faibussowitsch { 785f8f52c7dSSatish Balay *out = *comm; 786f8f52c7dSSatish Balay *ierr = MPI_SUCCESS; 787f8f52c7dSSatish Balay } 788f8f52c7dSSatish Balay 789d71ae5a4SJacob Faibussowitsch PETSC_EXTERN void petsc_mpi_comm_free_(int *comm, int *ierr) 790d71ae5a4SJacob Faibussowitsch { 791f8f52c7dSSatish Balay *ierr = MPI_SUCCESS; 792f8f52c7dSSatish Balay } 793f8f52c7dSSatish Balay 794d71ae5a4SJacob Faibussowitsch PETSC_EXTERN void petsc_mpi_get_count_(int *status, int *datatype, int *count, int *ierr) 795d71ae5a4SJacob Faibussowitsch { 79606df1fb1SBarry Smith *ierr = MPIUni_Abort(MPI_COMM_WORLD, 0); 797f8f52c7dSSatish Balay } 798f8f52c7dSSatish Balay 799d71ae5a4SJacob Faibussowitsch PETSC_EXTERN void petsc_mpi_get_processor_name_(char *name, int *result_len, int *ierr, PETSC_FORTRAN_CHARLEN_T len) 800d71ae5a4SJacob Faibussowitsch { 801f8f52c7dSSatish Balay MPIUNI_Memcpy(name, "localhost", 9 * sizeof(char)); 802f8f52c7dSSatish Balay *result_len = 9; 803f8f52c7dSSatish Balay *ierr = MPI_SUCCESS; 804f8f52c7dSSatish Balay } 805f8f52c7dSSatish Balay 806d71ae5a4SJacob Faibussowitsch PETSC_EXTERN void petsc_mpi_initialized_(int *flag, int *ierr) 807d71ae5a4SJacob Faibussowitsch { 808f8f52c7dSSatish Balay *flag = MPI_was_initialized; 809f8f52c7dSSatish Balay *ierr = MPI_SUCCESS; 810f8f52c7dSSatish Balay } 811f8f52c7dSSatish Balay 812d71ae5a4SJacob Faibussowitsch PETSC_EXTERN void petsc_mpi_iprobe_(int *source, int *tag, int *comm, int *glag, int *status, int *ierr) 813d71ae5a4SJacob Faibussowitsch { 814f8f52c7dSSatish Balay *ierr = MPI_SUCCESS; 815f8f52c7dSSatish Balay } 816f8f52c7dSSatish Balay 817d71ae5a4SJacob Faibussowitsch PETSC_EXTERN void petsc_mpi_probe_(int *source, int *tag, int *comm, int *flag, int *status, int *ierr) 818d71ae5a4SJacob Faibussowitsch { 819f8f52c7dSSatish Balay *ierr = MPI_SUCCESS; 820f8f52c7dSSatish Balay } 821f8f52c7dSSatish Balay 822d71ae5a4SJacob Faibussowitsch PETSC_EXTERN void petsc_mpi_request_free_(int *request, int *ierr) 823d71ae5a4SJacob Faibussowitsch { 824f8f52c7dSSatish Balay *ierr = MPI_SUCCESS; 825f8f52c7dSSatish Balay } 826f8f52c7dSSatish Balay 827d71ae5a4SJacob Faibussowitsch PETSC_EXTERN void petsc_mpi_ssend_(void *buf, int *count, int *datatype, int *dest, int *tag, int *comm, int *ierr) 828d71ae5a4SJacob Faibussowitsch { 82906df1fb1SBarry Smith *ierr = MPIUni_Abort(MPI_COMM_WORLD, 0); 830f8f52c7dSSatish Balay } 831f8f52c7dSSatish Balay 832d71ae5a4SJacob Faibussowitsch PETSC_EXTERN void petsc_mpi_wait_(int *request, int *status, int *ierr) 833d71ae5a4SJacob Faibussowitsch { 834f8f52c7dSSatish Balay *ierr = MPI_SUCCESS; 835156bc490SSatish Balay } 836156bc490SSatish Balay 837d71ae5a4SJacob Faibussowitsch PETSC_EXTERN void petsc_mpi_comm_group_(int *comm, int *group, int *ierr) 838d71ae5a4SJacob Faibussowitsch { 839d4816372SSatish Balay *ierr = MPI_SUCCESS; 840d4816372SSatish Balay } 841d4816372SSatish Balay 842d71ae5a4SJacob Faibussowitsch PETSC_EXTERN void petsc_mpi_exscan_(void *sendbuf, void *recvbuf, int *count, int *datatype, int *op, int *comm, int *ierr) 843d71ae5a4SJacob Faibussowitsch { 844d4816372SSatish Balay *ierr = MPI_SUCCESS; 845d4816372SSatish Balay } 846d4816372SSatish Balay 847fbf9dbe5SBarry Smith #endif /* PETSC_USE_FORTRAN_BINDINGS */ 848c8217ed5SSatish Balay 849e5c89e4eSSatish Balay #if defined(__cplusplus) 850e5c89e4eSSatish Balay } 851e5c89e4eSSatish Balay #endif 852