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*beceaeb6SBarry Smith #if !defined(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 { 203663e1fa8SPierre 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 { 212663e1fa8SPierre 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 363e5c89e4eSSatish Balay static int MPI_was_initialized = 0; 36458cd72c3SLisandro Dalcin static int MPI_was_finalized = 0; 36558cd72c3SLisandro Dalcin 366d71ae5a4SJacob Faibussowitsch int MPI_Init(int *argc, char ***argv) 367d71ae5a4SJacob Faibussowitsch { 36899256852SLisandro Dalcin if (MPI_was_initialized) return MPI_FAILURE; 3699bcf9d5aSJunchao Zhang /* MPI standard says "once MPI_Finalize returns, no MPI routine (not even MPI_Init) may be called", so an MPI standard compliant 3709bcf9d5aSJunchao Zhang MPIU should have this 'if (MPI_was_finalized) return MPI_FAILURE;' check. We relax it here to make life easier for users 3719bcf9d5aSJunchao Zhang of MPIU so that they can do multiple PetscInitialize/Finalize(). 3729bcf9d5aSJunchao Zhang */ 3739bcf9d5aSJunchao Zhang /* if (MPI_was_finalized) return MPI_FAILURE; */ 37458cd72c3SLisandro Dalcin MPI_was_initialized = 1; 3759bcf9d5aSJunchao Zhang MPI_was_finalized = 0; 37699256852SLisandro Dalcin return MPI_SUCCESS; 37758cd72c3SLisandro Dalcin } 37858cd72c3SLisandro Dalcin 379d71ae5a4SJacob Faibussowitsch int MPI_Init_thread(int *argc, char ***argv, int required, int *provided) 380d71ae5a4SJacob Faibussowitsch { 3819012378cSStefano Zampini MPI_Query_thread(provided); 3829012378cSStefano Zampini return MPI_Init(argc, argv); 3839012378cSStefano Zampini } 3849012378cSStefano Zampini 385d71ae5a4SJacob Faibussowitsch int MPI_Query_thread(int *provided) 386d71ae5a4SJacob Faibussowitsch { 3879012378cSStefano Zampini *provided = MPI_THREAD_FUNNELED; 3889012378cSStefano Zampini return MPI_SUCCESS; 3899012378cSStefano Zampini } 3909012378cSStefano Zampini 391d71ae5a4SJacob Faibussowitsch int MPI_Finalize(void) 392d71ae5a4SJacob Faibussowitsch { 39336f0be53SJacob Faibussowitsch if (MPI_was_finalized || !MPI_was_initialized) return MPI_FAILURE; 39436f0be53SJacob Faibussowitsch MPI_Comm comm = MPI_COMM_WORLD; 39536f0be53SJacob Faibussowitsch int ret = MPI_Comm_free(&comm); 39636f0be53SJacob Faibussowitsch 39736f0be53SJacob Faibussowitsch if (ret) return ret; 398100f28aeSBarry Smith comm = MPI_COMM_SELF; 39936f0be53SJacob Faibussowitsch ret = MPI_Comm_free(&comm); 40036f0be53SJacob Faibussowitsch if (ret) return ret; 40136f0be53SJacob Faibussowitsch if (PetscDefined(USE_DEBUG)) { 40236f0be53SJacob Faibussowitsch for (int i = 3; i <= MaxComm; ++i) { 403f0463fa0SJunchao Zhang if (comm_active[CommIdx(i)]) printf("MPIUni warning: MPI communicator %d is not freed before MPI_Finalize()\n", i); 404f0463fa0SJunchao Zhang } 40536f0be53SJacob Faibussowitsch 40636f0be53SJacob Faibussowitsch for (int i = 1; i <= MaxComm; ++i) { 40736f0be53SJacob Faibussowitsch for (int j = 0; j < num_attr; ++j) { 40836f0be53SJacob Faibussowitsch if (attr[CommIdx(i)][j].active) printf("MPIUni warning: MPI communicator %d attribute %d was not freed before MPI_Finalize()\n", i, j); 409f0463fa0SJunchao Zhang } 41036f0be53SJacob Faibussowitsch } 41136f0be53SJacob Faibussowitsch 41236f0be53SJacob Faibussowitsch for (int i = 1; i < num_attr; ++i) { 41336f0be53SJacob Faibussowitsch if (attr_keyval[i].active) printf("MPIUni warning: MPI attribute %d was not freed before MPI_Finalize()\n", i); 41436f0be53SJacob Faibussowitsch } 41536f0be53SJacob Faibussowitsch } 41636f0be53SJacob Faibussowitsch 417f0463fa0SJunchao Zhang /* reset counters */ 418f0463fa0SJunchao Zhang MaxComm = 2; 419f0463fa0SJunchao Zhang num_attr = 1; 42058cd72c3SLisandro Dalcin MPI_was_finalized = 1; 4219bcf9d5aSJunchao Zhang MPI_was_initialized = 0; 4229bcf9d5aSJunchao Zhang PETSC_COMM_WORLD = MPI_COMM_NULL; 42399256852SLisandro Dalcin return MPI_SUCCESS; 42458cd72c3SLisandro Dalcin } 425e5c89e4eSSatish Balay 426d71ae5a4SJacob Faibussowitsch int MPI_Initialized(int *flag) 427d71ae5a4SJacob Faibussowitsch { 428e5c89e4eSSatish Balay *flag = MPI_was_initialized; 42999256852SLisandro Dalcin return MPI_SUCCESS; 430e5c89e4eSSatish Balay } 431e5c89e4eSSatish Balay 432d71ae5a4SJacob Faibussowitsch int MPI_Finalized(int *flag) 433d71ae5a4SJacob Faibussowitsch { 43458cd72c3SLisandro Dalcin *flag = MPI_was_finalized; 43599256852SLisandro Dalcin return MPI_SUCCESS; 436e5c89e4eSSatish Balay } 437e5c89e4eSSatish Balay 438317ae730SBarry Smith int MPI_Win_free(MPI_Win *win) 439317ae730SBarry Smith { 440317ae730SBarry Smith free(*win); 441317ae730SBarry Smith *win = NULL; 442317ae730SBarry Smith return MPI_SUCCESS; 443317ae730SBarry Smith } 444317ae730SBarry Smith 445317ae730SBarry Smith int MPI_Win_allocate_shared(size_t sz, size_t asz, MPI_Info info, MPI_Comm comm, void **addr, MPI_Win *win) 446317ae730SBarry Smith { 447317ae730SBarry Smith *win = *addr = malloc(sz); 448317ae730SBarry Smith return MPI_SUCCESS; 449317ae730SBarry Smith } 450317ae730SBarry Smith 451e5c89e4eSSatish Balay /* ------------------- Fortran versions of several routines ------------------ */ 452e5c89e4eSSatish Balay 453f7c6e6aaSSatish Balay #if defined(PETSC_HAVE_FORTRAN_CAPS) 4540134af2dSBarry Smith #define mpiunisetmoduleblock_ MPIUNISETMODULEBLOCK 45552ecd5ffSSatish Balay #define mpiunisetfortranbasepointers_ MPIUNISETFORTRANBASEPOINTERS 456a7b85bbcSSatish Balay #define petsc_mpi_init_ PETSC_MPI_INIT 457a7b85bbcSSatish Balay #define petsc_mpi_finalize_ PETSC_MPI_FINALIZE 458a7b85bbcSSatish Balay #define petsc_mpi_comm_size_ PETSC_MPI_COMM_SIZE 459a7b85bbcSSatish Balay #define petsc_mpi_comm_rank_ PETSC_MPI_COMM_RANK 460a7b85bbcSSatish Balay #define petsc_mpi_abort_ PETSC_MPI_ABORT 461a7b85bbcSSatish Balay #define petsc_mpi_reduce_ PETSC_MPI_REDUCE 462a7b85bbcSSatish Balay #define petsc_mpi_allreduce_ PETSC_MPI_ALLREDUCE 463a7b85bbcSSatish Balay #define petsc_mpi_barrier_ PETSC_MPI_BARRIER 464a7b85bbcSSatish Balay #define petsc_mpi_bcast_ PETSC_MPI_BCAST 465a7b85bbcSSatish Balay #define petsc_mpi_gather_ PETSC_MPI_GATHER 466a7b85bbcSSatish Balay #define petsc_mpi_allgather_ PETSC_MPI_ALLGATHER 467a7b85bbcSSatish Balay #define petsc_mpi_comm_split_ PETSC_MPI_COMM_SPLIT 468a7b85bbcSSatish Balay #define petsc_mpi_scan_ PETSC_MPI_SCAN 469a7b85bbcSSatish Balay #define petsc_mpi_send_ PETSC_MPI_SEND 470a7b85bbcSSatish Balay #define petsc_mpi_recv_ PETSC_MPI_RECV 471a7b85bbcSSatish Balay #define petsc_mpi_reduce_scatter_ PETSC_MPI_REDUCE_SCATTER 472a7b85bbcSSatish Balay #define petsc_mpi_irecv_ PETSC_MPI_IRECV 473a7b85bbcSSatish Balay #define petsc_mpi_isend_ PETSC_MPI_ISEND 474a7b85bbcSSatish Balay #define petsc_mpi_sendrecv_ PETSC_MPI_SENDRECV 475a7b85bbcSSatish Balay #define petsc_mpi_test_ PETSC_MPI_TEST 476a7b85bbcSSatish Balay #define petsc_mpi_waitall_ PETSC_MPI_WAITALL 477a7b85bbcSSatish Balay #define petsc_mpi_waitany_ PETSC_MPI_WAITANY 478a7b85bbcSSatish Balay #define petsc_mpi_allgatherv_ PETSC_MPI_ALLGATHERV 479a7b85bbcSSatish Balay #define petsc_mpi_alltoallv_ PETSC_MPI_ALLTOALLV 480a7b85bbcSSatish Balay #define petsc_mpi_comm_create_ PETSC_MPI_COMM_CREATE 481a7b85bbcSSatish Balay #define petsc_mpi_address_ PETSC_MPI_ADDRESS 482a7b85bbcSSatish Balay #define petsc_mpi_pack_ PETSC_MPI_PACK 483a7b85bbcSSatish Balay #define petsc_mpi_unpack_ PETSC_MPI_UNPACK 484a7b85bbcSSatish Balay #define petsc_mpi_pack_size_ PETSC_MPI_PACK_SIZE 485a7b85bbcSSatish Balay #define petsc_mpi_type_struct_ PETSC_MPI_TYPE_STRUCT 486a7b85bbcSSatish Balay #define petsc_mpi_type_commit_ PETSC_MPI_TYPE_COMMIT 487a7b85bbcSSatish Balay #define petsc_mpi_wtime_ PETSC_MPI_WTIME 488a7b85bbcSSatish Balay #define petsc_mpi_cancel_ PETSC_MPI_CANCEL 489a7b85bbcSSatish Balay #define petsc_mpi_comm_dup_ PETSC_MPI_COMM_DUP 490a7b85bbcSSatish Balay #define petsc_mpi_comm_free_ PETSC_MPI_COMM_FREE 491a7b85bbcSSatish Balay #define petsc_mpi_get_count_ PETSC_MPI_GET_COUNT 492a7b85bbcSSatish Balay #define petsc_mpi_get_processor_name_ PETSC_MPI_GET_PROCESSOR_NAME 493a7b85bbcSSatish Balay #define petsc_mpi_initialized_ PETSC_MPI_INITIALIZED 494a7b85bbcSSatish Balay #define petsc_mpi_iprobe_ PETSC_MPI_IPROBE 495a7b85bbcSSatish Balay #define petsc_mpi_probe_ PETSC_MPI_PROBE 496a7b85bbcSSatish Balay #define petsc_mpi_request_free_ PETSC_MPI_REQUEST_FREE 497a7b85bbcSSatish Balay #define petsc_mpi_ssend_ PETSC_MPI_SSEND 498a7b85bbcSSatish Balay #define petsc_mpi_wait_ PETSC_MPI_WAIT 499a7b85bbcSSatish Balay #define petsc_mpi_comm_group_ PETSC_MPI_COMM_GROUP 500a7b85bbcSSatish Balay #define petsc_mpi_exscan_ PETSC_MPI_EXSCAN 501f7c6e6aaSSatish Balay #elif !defined(PETSC_HAVE_FORTRAN_UNDERSCORE) 5020134af2dSBarry Smith #define mpiunisetmoduleblock_ mpiunisetmoduleblock 50352ecd5ffSSatish Balay #define mpiunisetfortranbasepointers_ mpiunisetfortranbasepointers 504a7b85bbcSSatish Balay #define petsc_mpi_init_ petsc_mpi_init 505a7b85bbcSSatish Balay #define petsc_mpi_finalize_ petsc_mpi_finalize 506a7b85bbcSSatish Balay #define petsc_mpi_comm_size_ petsc_mpi_comm_size 507a7b85bbcSSatish Balay #define petsc_mpi_comm_rank_ petsc_mpi_comm_rank 508a7b85bbcSSatish Balay #define petsc_mpi_abort_ petsc_mpi_abort 509a7b85bbcSSatish Balay #define petsc_mpi_reduce_ petsc_mpi_reduce 510a7b85bbcSSatish Balay #define petsc_mpi_allreduce_ petsc_mpi_allreduce 511a7b85bbcSSatish Balay #define petsc_mpi_barrier_ petsc_mpi_barrier 512a7b85bbcSSatish Balay #define petsc_mpi_bcast_ petsc_mpi_bcast 513a7b85bbcSSatish Balay #define petsc_mpi_gather_ petsc_mpi_gather 514a7b85bbcSSatish Balay #define petsc_mpi_allgather_ petsc_mpi_allgather 515a7b85bbcSSatish Balay #define petsc_mpi_comm_split_ petsc_mpi_comm_split 516a7b85bbcSSatish Balay #define petsc_mpi_scan_ petsc_mpi_scan 517a7b85bbcSSatish Balay #define petsc_mpi_send_ petsc_mpi_send 518a7b85bbcSSatish Balay #define petsc_mpi_recv_ petsc_mpi_recv 519a7b85bbcSSatish Balay #define petsc_mpi_reduce_scatter_ petsc_mpi_reduce_scatter 520a7b85bbcSSatish Balay #define petsc_mpi_irecv_ petsc_mpi_irecv 521a7b85bbcSSatish Balay #define petsc_mpi_isend_ petsc_mpi_isend 522a7b85bbcSSatish Balay #define petsc_mpi_sendrecv_ petsc_mpi_sendrecv 523a7b85bbcSSatish Balay #define petsc_mpi_test_ petsc_mpi_test 524a7b85bbcSSatish Balay #define petsc_mpi_waitall_ petsc_mpi_waitall 525a7b85bbcSSatish Balay #define petsc_mpi_waitany_ petsc_mpi_waitany 526a7b85bbcSSatish Balay #define petsc_mpi_allgatherv_ petsc_mpi_allgatherv 527a7b85bbcSSatish Balay #define petsc_mpi_alltoallv_ petsc_mpi_alltoallv 528a7b85bbcSSatish Balay #define petsc_mpi_comm_create_ petsc_mpi_comm_create 529a7b85bbcSSatish Balay #define petsc_mpi_address_ petsc_mpi_address 530a7b85bbcSSatish Balay #define petsc_mpi_pack_ petsc_mpi_pack 531a7b85bbcSSatish Balay #define petsc_mpi_unpack_ petsc_mpi_unpack 532a7b85bbcSSatish Balay #define petsc_mpi_pack_size_ petsc_mpi_pack_size 533a7b85bbcSSatish Balay #define petsc_mpi_type_struct_ petsc_mpi_type_struct 534a7b85bbcSSatish Balay #define petsc_mpi_type_commit_ petsc_mpi_type_commit 535a7b85bbcSSatish Balay #define petsc_mpi_wtime_ petsc_mpi_wtime 536a7b85bbcSSatish Balay #define petsc_mpi_cancel_ petsc_mpi_cancel 537a7b85bbcSSatish Balay #define petsc_mpi_comm_dup_ petsc_mpi_comm_dup 538a7b85bbcSSatish Balay #define petsc_mpi_comm_free_ petsc_mpi_comm_free 539a7b85bbcSSatish Balay #define petsc_mpi_get_count_ petsc_mpi_get_count 540a7b85bbcSSatish Balay #define petsc_mpi_get_processor_name_ petsc_mpi_get_processor_name 541a7b85bbcSSatish Balay #define petsc_mpi_initialized_ petsc_mpi_initialized 542a7b85bbcSSatish Balay #define petsc_mpi_iprobe_ petsc_mpi_iprobe 543a7b85bbcSSatish Balay #define petsc_mpi_probe_ petsc_mpi_probe 544a7b85bbcSSatish Balay #define petsc_mpi_request_free_ petsc_mpi_request_free 545a7b85bbcSSatish Balay #define petsc_mpi_ssend_ petsc_mpi_ssend 546a7b85bbcSSatish Balay #define petsc_mpi_wait_ petsc_mpi_wait 547a7b85bbcSSatish Balay #define petsc_mpi_comm_group_ petsc_mpi_comm_group 548a7b85bbcSSatish Balay #define petsc_mpi_exscan_ petsc_mpi_exscan 549f7c6e6aaSSatish Balay #endif 550e5c89e4eSSatish Balay 551f7c6e6aaSSatish Balay #if defined(PETSC_HAVE_FORTRAN_UNDERSCORE_UNDERSCORE) 552a7b85bbcSSatish Balay #define petsc_mpi_init_ petsc_mpi_init__ 553a7b85bbcSSatish Balay #define petsc_mpi_finalize_ petsc_mpi_finalize__ 554a7b85bbcSSatish Balay #define petsc_mpi_comm_size_ petsc_mpi_comm_size__ 555a7b85bbcSSatish Balay #define petsc_mpi_comm_rank_ petsc_mpi_comm_rank__ 556a7b85bbcSSatish Balay #define petsc_mpi_abort_ petsc_mpi_abort__ 557a7b85bbcSSatish Balay #define petsc_mpi_reduce_ petsc_mpi_reduce__ 558a7b85bbcSSatish Balay #define petsc_mpi_allreduce_ petsc_mpi_allreduce__ 559a7b85bbcSSatish Balay #define petsc_mpi_barrier_ petsc_mpi_barrier__ 560a7b85bbcSSatish Balay #define petsc_mpi_bcast_ petsc_mpi_bcast__ 561a7b85bbcSSatish Balay #define petsc_mpi_gather_ petsc_mpi_gather__ 562a7b85bbcSSatish Balay #define petsc_mpi_allgather_ petsc_mpi_allgather__ 563a7b85bbcSSatish Balay #define petsc_mpi_comm_split_ petsc_mpi_comm_split__ 564a7b85bbcSSatish Balay #define petsc_mpi_scan_ petsc_mpi_scan__ 565a7b85bbcSSatish Balay #define petsc_mpi_send_ petsc_mpi_send__ 566a7b85bbcSSatish Balay #define petsc_mpi_recv_ petsc_mpi_recv__ 567a7b85bbcSSatish Balay #define petsc_mpi_reduce_scatter_ petsc_mpi_reduce_scatter__ 568a7b85bbcSSatish Balay #define petsc_mpi_irecv_ petsc_mpi_irecv__ 569a7b85bbcSSatish Balay #define petsc_mpi_isend_ petsc_mpi_isend__ 570a7b85bbcSSatish Balay #define petsc_mpi_sendrecv_ petsc_mpi_sendrecv__ 571a7b85bbcSSatish Balay #define petsc_mpi_test_ petsc_mpi_test__ 572a7b85bbcSSatish Balay #define petsc_mpi_waitall_ petsc_mpi_waitall__ 573a7b85bbcSSatish Balay #define petsc_mpi_waitany_ petsc_mpi_waitany__ 574a7b85bbcSSatish Balay #define petsc_mpi_allgatherv_ petsc_mpi_allgatherv__ 575a7b85bbcSSatish Balay #define petsc_mpi_alltoallv_ petsc_mpi_alltoallv__ 576a7b85bbcSSatish Balay #define petsc_mpi_comm_create_ petsc_mpi_comm_create__ 577a7b85bbcSSatish Balay #define petsc_mpi_address_ petsc_mpi_address__ 578a7b85bbcSSatish Balay #define petsc_mpi_pack_ petsc_mpi_pack__ 579a7b85bbcSSatish Balay #define petsc_mpi_unpack_ petsc_mpi_unpack__ 580a7b85bbcSSatish Balay #define petsc_mpi_pack_size_ petsc_mpi_pack_size__ 581a7b85bbcSSatish Balay #define petsc_mpi_type_struct_ petsc_mpi_type_struct__ 582a7b85bbcSSatish Balay #define petsc_mpi_type_commit_ petsc_mpi_type_commit__ 583a7b85bbcSSatish Balay #define petsc_mpi_wtime_ petsc_mpi_wtime__ 584a7b85bbcSSatish Balay #define petsc_mpi_cancel_ petsc_mpi_cancel__ 585a7b85bbcSSatish Balay #define petsc_mpi_comm_dup_ petsc_mpi_comm_dup__ 586a7b85bbcSSatish Balay #define petsc_mpi_comm_free_ petsc_mpi_comm_free__ 587a7b85bbcSSatish Balay #define petsc_mpi_get_count_ petsc_mpi_get_count__ 588a7b85bbcSSatish Balay #define petsc_mpi_get_processor_name_ petsc_mpi_get_processor_name__ 589a7b85bbcSSatish Balay #define petsc_mpi_initialized_ petsc_mpi_initialized__ 590a7b85bbcSSatish Balay #define petsc_mpi_iprobe_ petsc_mpi_iprobe__ 591a7b85bbcSSatish Balay #define petsc_mpi_probe_ petsc_mpi_probe__ 592a7b85bbcSSatish Balay #define petsc_mpi_request_free_ petsc_mpi_request_free__ 593a7b85bbcSSatish Balay #define petsc_mpi_ssend_ petsc_mpi_ssend__ 594a7b85bbcSSatish Balay #define petsc_mpi_wait_ petsc_mpi_wait__ 595a7b85bbcSSatish Balay #define petsc_mpi_comm_group_ petsc_mpi_comm_group__ 596a7b85bbcSSatish Balay #define petsc_mpi_exscan_ petsc_mpi_exscan__ 597f7c6e6aaSSatish Balay #endif 598e5c89e4eSSatish Balay 599da81f932SPierre Jolivet /* Do not build fortran interface if MPI namespace collision is to be avoided */ 600fbf9dbe5SBarry Smith #if defined(PETSC_USE_FORTRAN_BINDINGS) 601c8217ed5SSatish Balay 60219caf8f3SSatish Balay PETSC_EXTERN void mpiunisetmoduleblock_(void); 60352ecd5ffSSatish Balay 604d71ae5a4SJacob Faibussowitsch PETSC_EXTERN void mpiunisetfortranbasepointers_(void *f_mpi_in_place) 605d71ae5a4SJacob Faibussowitsch { 60652ecd5ffSSatish Balay MPIUNIF_mpi_in_place = f_mpi_in_place; 60752ecd5ffSSatish Balay } 60852ecd5ffSSatish Balay 609d71ae5a4SJacob Faibussowitsch PETSC_EXTERN void petsc_mpi_init_(int *ierr) 610d71ae5a4SJacob Faibussowitsch { 6110134af2dSBarry Smith mpiunisetmoduleblock_(); 612c8025a54SPierre Jolivet *ierr = MPI_Init(NULL, NULL); 613e5c89e4eSSatish Balay } 614e5c89e4eSSatish Balay 615d71ae5a4SJacob Faibussowitsch PETSC_EXTERN void petsc_mpi_finalize_(int *ierr) 616d71ae5a4SJacob Faibussowitsch { 617c8217ed5SSatish Balay *ierr = MPI_Finalize(); 618e5c89e4eSSatish Balay } 619e5c89e4eSSatish Balay 620d71ae5a4SJacob Faibussowitsch PETSC_EXTERN void petsc_mpi_comm_size_(MPI_Comm *comm, int *size, int *ierr) 621d71ae5a4SJacob Faibussowitsch { 622e5c89e4eSSatish Balay *size = 1; 623e5c89e4eSSatish Balay *ierr = 0; 624e5c89e4eSSatish Balay } 625e5c89e4eSSatish Balay 626d71ae5a4SJacob Faibussowitsch PETSC_EXTERN void petsc_mpi_comm_rank_(MPI_Comm *comm, int *rank, int *ierr) 627d71ae5a4SJacob Faibussowitsch { 628e5c89e4eSSatish Balay *rank = 0; 629e5c89e4eSSatish Balay *ierr = MPI_SUCCESS; 630e5c89e4eSSatish Balay } 631e5c89e4eSSatish Balay 632d71ae5a4SJacob Faibussowitsch PETSC_EXTERN void petsc_mpi_comm_split_(MPI_Comm *comm, int *color, int *key, MPI_Comm *newcomm, int *ierr) 633d71ae5a4SJacob Faibussowitsch { 6341f6cc5b2SSatish Balay *newcomm = *comm; 6351f6cc5b2SSatish Balay *ierr = MPI_SUCCESS; 6361f6cc5b2SSatish Balay } 6371f6cc5b2SSatish Balay 638d71ae5a4SJacob Faibussowitsch PETSC_EXTERN void petsc_mpi_abort_(MPI_Comm *comm, int *errorcode, int *ierr) 639d71ae5a4SJacob Faibussowitsch { 640e5c89e4eSSatish Balay abort(); 641e5c89e4eSSatish Balay *ierr = MPI_SUCCESS; 642e5c89e4eSSatish Balay } 643e5c89e4eSSatish Balay 644d71ae5a4SJacob Faibussowitsch PETSC_EXTERN void petsc_mpi_reduce_(void *sendbuf, void *recvbuf, int *count, int *datatype, int *op, int *root, int *comm, int *ierr) 645d71ae5a4SJacob Faibussowitsch { 646f30578ecSBarry Smith *ierr = MPI_Reduce(sendbuf, recvbuf, *count, *datatype, *op, *root, *comm); 6473b644628SSatish Balay } 6483b644628SSatish Balay 649d71ae5a4SJacob Faibussowitsch PETSC_EXTERN void petsc_mpi_allreduce_(void *sendbuf, void *recvbuf, int *count, int *datatype, int *op, int *comm, int *ierr) 650d71ae5a4SJacob Faibussowitsch { 651f30578ecSBarry Smith *ierr = MPI_Allreduce(sendbuf, recvbuf, *count, *datatype, *op, *comm); 652e5c89e4eSSatish Balay } 653e5c89e4eSSatish Balay 654d71ae5a4SJacob Faibussowitsch PETSC_EXTERN void petsc_mpi_barrier_(MPI_Comm *comm, int *ierr) 655d71ae5a4SJacob Faibussowitsch { 656e5c89e4eSSatish Balay *ierr = MPI_SUCCESS; 657e5c89e4eSSatish Balay } 658f7c6e6aaSSatish Balay 659d71ae5a4SJacob Faibussowitsch PETSC_EXTERN void petsc_mpi_bcast_(void *buf, int *count, int *datatype, int *root, int *comm, int *ierr) 660d71ae5a4SJacob Faibussowitsch { 661e5c89e4eSSatish Balay *ierr = MPI_SUCCESS; 662e5c89e4eSSatish Balay } 663f7c6e6aaSSatish Balay 664d71ae5a4SJacob 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) 665d71ae5a4SJacob Faibussowitsch { 666f30578ecSBarry Smith *ierr = MPI_Gather(sendbuf, *scount, *sdatatype, recvbuf, rcount, rdatatype, *root, *comm); 667f7c6e6aaSSatish Balay } 668f7c6e6aaSSatish Balay 669d71ae5a4SJacob Faibussowitsch PETSC_EXTERN void petsc_mpi_allgather_(void *sendbuf, int *scount, int *sdatatype, void *recvbuf, int *rcount, int *rdatatype, int *comm, int *ierr) 670d71ae5a4SJacob Faibussowitsch { 671f30578ecSBarry Smith *ierr = MPI_Allgather(sendbuf, *scount, *sdatatype, recvbuf, rcount, rdatatype, *comm); 672e5c89e4eSSatish Balay } 673e5c89e4eSSatish Balay 674d71ae5a4SJacob Faibussowitsch PETSC_EXTERN void petsc_mpi_scan_(void *sendbuf, void *recvbuf, int *count, int *datatype, int *op, int *comm, int *ierr) 675d71ae5a4SJacob Faibussowitsch { 6761a589b05SJed Brown *ierr = MPIUNI_Memcpy(recvbuf, sendbuf, (*count) * MPI_sizeof(*datatype)); 6773b644628SSatish Balay } 6783b644628SSatish Balay 679d71ae5a4SJacob Faibussowitsch PETSC_EXTERN void petsc_mpi_send_(void *buf, int *count, int *datatype, int *dest, int *tag, int *comm, int *ierr) 680d71ae5a4SJacob Faibussowitsch { 68106df1fb1SBarry Smith *ierr = MPIUni_Abort(MPI_COMM_WORLD, 0); 6821086b069SSatish Balay } 6831086b069SSatish Balay 684d71ae5a4SJacob Faibussowitsch PETSC_EXTERN void petsc_mpi_recv_(void *buf, int *count, int *datatype, int *source, int *tag, int *comm, int status, int *ierr) 685d71ae5a4SJacob Faibussowitsch { 68606df1fb1SBarry Smith *ierr = MPIUni_Abort(MPI_COMM_WORLD, 0); 6871086b069SSatish Balay } 6881086b069SSatish Balay 689d71ae5a4SJacob Faibussowitsch PETSC_EXTERN void petsc_mpi_reduce_scatter_(void *sendbuf, void *recvbuf, int *recvcounts, int *datatype, int *op, int *comm, int *ierr) 690d71ae5a4SJacob Faibussowitsch { 69106df1fb1SBarry Smith *ierr = MPIUni_Abort(MPI_COMM_WORLD, 0); 692156bc490SSatish Balay } 693156bc490SSatish Balay 694d71ae5a4SJacob Faibussowitsch PETSC_EXTERN void petsc_mpi_irecv_(void *buf, int *count, int *datatype, int *source, int *tag, int *comm, int *request, int *ierr) 695d71ae5a4SJacob Faibussowitsch { 69606df1fb1SBarry Smith *ierr = MPIUni_Abort(MPI_COMM_WORLD, 0); 697156bc490SSatish Balay } 698156bc490SSatish Balay 699d71ae5a4SJacob Faibussowitsch PETSC_EXTERN void petsc_mpi_isend_(void *buf, int *count, int *datatype, int *dest, int *tag, int *comm, int *request, int *ierr) 700d71ae5a4SJacob Faibussowitsch { 70106df1fb1SBarry Smith *ierr = MPIUni_Abort(MPI_COMM_WORLD, 0); 702156bc490SSatish Balay } 703156bc490SSatish Balay 704d71ae5a4SJacob 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) 705d71ae5a4SJacob Faibussowitsch { 7061a589b05SJed Brown *ierr = MPIUNI_Memcpy(recvbuf, sendbuf, (*sendcount) * MPI_sizeof(*sendtype)); 707156bc490SSatish Balay } 708156bc490SSatish Balay 709d71ae5a4SJacob Faibussowitsch PETSC_EXTERN void petsc_mpi_test_(int *request, int *flag, int *status, int *ierr) 710d71ae5a4SJacob Faibussowitsch { 71106df1fb1SBarry Smith *ierr = MPIUni_Abort(MPI_COMM_WORLD, 0); 712156bc490SSatish Balay } 713156bc490SSatish Balay 714d71ae5a4SJacob Faibussowitsch PETSC_EXTERN void petsc_mpi_waitall_(int *count, int *array_of_requests, int *array_of_statuses, int *ierr) 715d71ae5a4SJacob Faibussowitsch { 716156bc490SSatish Balay *ierr = MPI_SUCCESS; 717156bc490SSatish Balay } 718156bc490SSatish Balay 719d71ae5a4SJacob Faibussowitsch PETSC_EXTERN void petsc_mpi_waitany_(int *count, int *array_of_requests, int *index, int *status, int *ierr) 720d71ae5a4SJacob Faibussowitsch { 721156bc490SSatish Balay *ierr = MPI_SUCCESS; 722156bc490SSatish Balay } 723156bc490SSatish Balay 724d71ae5a4SJacob 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) 725d71ae5a4SJacob Faibussowitsch { 726f30578ecSBarry Smith *ierr = MPI_Allgatherv(sendbuf, *sendcount, *sendtype, recvbuf, recvcounts, displs, *recvtype, *comm); 727156bc490SSatish Balay } 728156bc490SSatish Balay 729d71ae5a4SJacob 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) 730d71ae5a4SJacob Faibussowitsch { 731f30578ecSBarry Smith *ierr = MPI_Alltoallv(sendbuf, sendcounts, sdispls, *sendtype, recvbuf, recvcounts, rdispls, *recvtype, *comm); 732156bc490SSatish Balay } 733156bc490SSatish Balay 734d71ae5a4SJacob Faibussowitsch PETSC_EXTERN void petsc_mpi_comm_create_(int *comm, int *group, int *newcomm, int *ierr) 735d71ae5a4SJacob Faibussowitsch { 736156bc490SSatish Balay *newcomm = *comm; 737156bc490SSatish Balay *ierr = MPI_SUCCESS; 738156bc490SSatish Balay } 739156bc490SSatish Balay 740d71ae5a4SJacob Faibussowitsch PETSC_EXTERN void petsc_mpi_address_(void *location, MPI_Aint *address, int *ierr) 741d71ae5a4SJacob Faibussowitsch { 74299256852SLisandro Dalcin *address = (MPI_Aint)((char *)location); 743156bc490SSatish Balay *ierr = MPI_SUCCESS; 744156bc490SSatish Balay } 745156bc490SSatish Balay 746d71ae5a4SJacob Faibussowitsch PETSC_EXTERN void petsc_mpi_pack_(void *inbuf, int *incount, int *datatype, void *outbuf, int *outsize, int *position, int *comm, int *ierr) 747d71ae5a4SJacob Faibussowitsch { 74806df1fb1SBarry Smith *ierr = MPIUni_Abort(MPI_COMM_WORLD, 0); 749156bc490SSatish Balay } 750156bc490SSatish Balay 751d71ae5a4SJacob Faibussowitsch PETSC_EXTERN void petsc_mpi_unpack_(void *inbuf, int *insize, int *position, void *outbuf, int *outcount, int *datatype, int *comm, int *ierr) 752d71ae5a4SJacob Faibussowitsch { 75306df1fb1SBarry Smith *ierr = MPIUni_Abort(MPI_COMM_WORLD, 0); 754156bc490SSatish Balay } 755156bc490SSatish Balay 756d71ae5a4SJacob Faibussowitsch PETSC_EXTERN void petsc_mpi_pack_size_(int *incount, int *datatype, int *comm, int *size, int *ierr) 757d71ae5a4SJacob Faibussowitsch { 75806df1fb1SBarry Smith *ierr = MPIUni_Abort(MPI_COMM_WORLD, 0); 759156bc490SSatish Balay } 760156bc490SSatish Balay 761d71ae5a4SJacob 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) 762d71ae5a4SJacob Faibussowitsch { 76306df1fb1SBarry Smith *ierr = MPIUni_Abort(MPI_COMM_WORLD, 0); 764156bc490SSatish Balay } 765156bc490SSatish Balay 766d71ae5a4SJacob Faibussowitsch PETSC_EXTERN void petsc_mpi_type_commit_(int *datatype, int *ierr) 767d71ae5a4SJacob Faibussowitsch { 768156bc490SSatish Balay *ierr = MPI_SUCCESS; 769156bc490SSatish Balay } 770156bc490SSatish Balay 771d71ae5a4SJacob Faibussowitsch double petsc_mpi_wtime_(void) 772d71ae5a4SJacob Faibussowitsch { 773156bc490SSatish Balay return 0.0; 774f8f52c7dSSatish Balay } 775156bc490SSatish Balay 776d71ae5a4SJacob Faibussowitsch PETSC_EXTERN void petsc_mpi_cancel_(int *request, int *ierr) 777d71ae5a4SJacob Faibussowitsch { 778f8f52c7dSSatish Balay *ierr = MPI_SUCCESS; 779f8f52c7dSSatish Balay } 780f8f52c7dSSatish Balay 781d71ae5a4SJacob Faibussowitsch PETSC_EXTERN void petsc_mpi_comm_dup_(int *comm, int *out, int *ierr) 782d71ae5a4SJacob Faibussowitsch { 783f8f52c7dSSatish Balay *out = *comm; 784f8f52c7dSSatish Balay *ierr = MPI_SUCCESS; 785f8f52c7dSSatish Balay } 786f8f52c7dSSatish Balay 787d71ae5a4SJacob Faibussowitsch PETSC_EXTERN void petsc_mpi_comm_free_(int *comm, int *ierr) 788d71ae5a4SJacob Faibussowitsch { 789f8f52c7dSSatish Balay *ierr = MPI_SUCCESS; 790f8f52c7dSSatish Balay } 791f8f52c7dSSatish Balay 792d71ae5a4SJacob Faibussowitsch PETSC_EXTERN void petsc_mpi_get_count_(int *status, int *datatype, int *count, int *ierr) 793d71ae5a4SJacob Faibussowitsch { 79406df1fb1SBarry Smith *ierr = MPIUni_Abort(MPI_COMM_WORLD, 0); 795f8f52c7dSSatish Balay } 796f8f52c7dSSatish Balay 797d71ae5a4SJacob Faibussowitsch PETSC_EXTERN void petsc_mpi_get_processor_name_(char *name, int *result_len, int *ierr, PETSC_FORTRAN_CHARLEN_T len) 798d71ae5a4SJacob Faibussowitsch { 799f8f52c7dSSatish Balay MPIUNI_Memcpy(name, "localhost", 9 * sizeof(char)); 800f8f52c7dSSatish Balay *result_len = 9; 801f8f52c7dSSatish Balay *ierr = MPI_SUCCESS; 802f8f52c7dSSatish Balay } 803f8f52c7dSSatish Balay 804d71ae5a4SJacob Faibussowitsch PETSC_EXTERN void petsc_mpi_initialized_(int *flag, int *ierr) 805d71ae5a4SJacob Faibussowitsch { 806f8f52c7dSSatish Balay *flag = MPI_was_initialized; 807f8f52c7dSSatish Balay *ierr = MPI_SUCCESS; 808f8f52c7dSSatish Balay } 809f8f52c7dSSatish Balay 810d71ae5a4SJacob Faibussowitsch PETSC_EXTERN void petsc_mpi_iprobe_(int *source, int *tag, int *comm, int *glag, int *status, int *ierr) 811d71ae5a4SJacob Faibussowitsch { 812f8f52c7dSSatish Balay *ierr = MPI_SUCCESS; 813f8f52c7dSSatish Balay } 814f8f52c7dSSatish Balay 815d71ae5a4SJacob Faibussowitsch PETSC_EXTERN void petsc_mpi_probe_(int *source, int *tag, int *comm, int *flag, int *status, int *ierr) 816d71ae5a4SJacob Faibussowitsch { 817f8f52c7dSSatish Balay *ierr = MPI_SUCCESS; 818f8f52c7dSSatish Balay } 819f8f52c7dSSatish Balay 820d71ae5a4SJacob Faibussowitsch PETSC_EXTERN void petsc_mpi_request_free_(int *request, int *ierr) 821d71ae5a4SJacob Faibussowitsch { 822f8f52c7dSSatish Balay *ierr = MPI_SUCCESS; 823f8f52c7dSSatish Balay } 824f8f52c7dSSatish Balay 825d71ae5a4SJacob Faibussowitsch PETSC_EXTERN void petsc_mpi_ssend_(void *buf, int *count, int *datatype, int *dest, int *tag, int *comm, int *ierr) 826d71ae5a4SJacob Faibussowitsch { 82706df1fb1SBarry Smith *ierr = MPIUni_Abort(MPI_COMM_WORLD, 0); 828f8f52c7dSSatish Balay } 829f8f52c7dSSatish Balay 830d71ae5a4SJacob Faibussowitsch PETSC_EXTERN void petsc_mpi_wait_(int *request, int *status, int *ierr) 831d71ae5a4SJacob Faibussowitsch { 832f8f52c7dSSatish Balay *ierr = MPI_SUCCESS; 833156bc490SSatish Balay } 834156bc490SSatish Balay 835d71ae5a4SJacob Faibussowitsch PETSC_EXTERN void petsc_mpi_comm_group_(int *comm, int *group, int *ierr) 836d71ae5a4SJacob Faibussowitsch { 837d4816372SSatish Balay *ierr = MPI_SUCCESS; 838d4816372SSatish Balay } 839d4816372SSatish Balay 840d71ae5a4SJacob Faibussowitsch PETSC_EXTERN void petsc_mpi_exscan_(void *sendbuf, void *recvbuf, int *count, int *datatype, int *op, int *comm, int *ierr) 841d71ae5a4SJacob Faibussowitsch { 842d4816372SSatish Balay *ierr = MPI_SUCCESS; 843d4816372SSatish Balay } 844d4816372SSatish Balay 845fbf9dbe5SBarry Smith #endif /* PETSC_USE_FORTRAN_BINDINGS */ 846c8217ed5SSatish Balay 847e5c89e4eSSatish Balay #if defined(__cplusplus) 848e5c89e4eSSatish Balay } 849e5c89e4eSSatish Balay #endif 850