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 */ 57d71ae5a4SJacob Faibussowitsch int MPIUNI_Memcpy(void *dst, const void *src, int 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 { 769371c9d4SSatish Balay 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 159d71ae5a4SJacob Faibussowitsch int MPI_Comm_create_keyval(MPI_Copy_function *copy_fn, MPI_Delete_function *delete_fn, int *keyval, void *extra_state) 160d71ae5a4SJacob Faibussowitsch { 161f0463fa0SJunchao Zhang int i, keyid; 162f0463fa0SJunchao Zhang for (i = 1; i < num_attr; i++) { /* the first attribute is always in use */ 163f0463fa0SJunchao Zhang if (!attr_keyval[i].active) { 164f0463fa0SJunchao Zhang keyid = i; 165f0463fa0SJunchao Zhang goto found; 166f0463fa0SJunchao Zhang } 167f0463fa0SJunchao Zhang } 1689cf9c1dbSJed Brown if (num_attr >= MAX_ATTR) return MPIUni_Abort(MPI_COMM_WORLD, 1); 169f0463fa0SJunchao Zhang keyid = num_attr++; 170e5c89e4eSSatish Balay 171f0463fa0SJunchao Zhang found: 172f0463fa0SJunchao Zhang attr_keyval[keyid].extra_state = extra_state; 173f0463fa0SJunchao Zhang attr_keyval[keyid].del = delete_fn; 174f0463fa0SJunchao Zhang attr_keyval[keyid].active = 1; 175f0463fa0SJunchao Zhang *keyval = keyid; 17699256852SLisandro Dalcin return MPI_SUCCESS; 177e5c89e4eSSatish Balay } 178e5c89e4eSSatish Balay 17936f0be53SJacob Faibussowitsch /* 18036f0be53SJacob Faibussowitsch The reference counting business is here to guard against the following: 18136f0be53SJacob Faibussowitsch 18236f0be53SJacob Faibussowitsch MPI_Comm_set_attr(comm, keyval, some_attr); 18336f0be53SJacob Faibussowitsch MPI_Comm_free_keyval(&keyval); 18436f0be53SJacob Faibussowitsch MPI_Comm_free(&comm); 18536f0be53SJacob Faibussowitsch 18636f0be53SJacob Faibussowitsch Here MPI_Comm_free() will try to destroy all of the attributes of the comm, and hence we 18736f0be53SJacob Faibussowitsch should not clear the deleter or extra_state until all communicators that have the attribute 18836f0be53SJacob Faibussowitsch set are either freed or have given up their attribute. 18936f0be53SJacob Faibussowitsch 19036f0be53SJacob Faibussowitsch The attribute reference count is INCREASED in: 19136f0be53SJacob Faibussowitsch - MPI_Comm_create_keyval() 19236f0be53SJacob Faibussowitsch - MPI_Comm_set_attr() 19336f0be53SJacob Faibussowitsch 19436f0be53SJacob Faibussowitsch The atrtibute reference count is DECREASED in: 19536f0be53SJacob Faibussowitsch - MPI_Comm_free_keyval() 19636f0be53SJacob Faibussowitsch - MPI_Comm_delete_attr() (but only if the comm has the attribute) 19736f0be53SJacob Faibussowitsch */ 198d71ae5a4SJacob Faibussowitsch static int MPI_Attr_dereference_keyval(int keyval) 199d71ae5a4SJacob Faibussowitsch { 20036f0be53SJacob Faibussowitsch if (--(attr_keyval[keyval].active) <= 0) { 20136f0be53SJacob Faibussowitsch attr_keyval[keyval].extra_state = 0; 20236f0be53SJacob Faibussowitsch attr_keyval[keyval].del = 0; 20336f0be53SJacob Faibussowitsch } 20436f0be53SJacob Faibussowitsch return MPI_SUCCESS; 20536f0be53SJacob Faibussowitsch } 20636f0be53SJacob Faibussowitsch 207d71ae5a4SJacob Faibussowitsch static int MPI_Attr_reference_keyval(int keyval) 208d71ae5a4SJacob Faibussowitsch { 20936f0be53SJacob Faibussowitsch ++(attr_keyval[keyval].active); 21036f0be53SJacob Faibussowitsch return MPI_SUCCESS; 21136f0be53SJacob Faibussowitsch } 21236f0be53SJacob Faibussowitsch 213d71ae5a4SJacob Faibussowitsch int MPI_Comm_free_keyval(int *keyval) 214d71ae5a4SJacob Faibussowitsch { 21536f0be53SJacob Faibussowitsch int ret; 21636f0be53SJacob Faibussowitsch 21736f0be53SJacob Faibussowitsch if (*keyval < 0 || *keyval >= num_attr) return MPI_FAILURE; 21836f0be53SJacob Faibussowitsch if ((ret = MPI_Attr_dereference_keyval(*keyval))) return ret; 219a246e310SBarry Smith *keyval = 0; 220e5c89e4eSSatish Balay return MPI_SUCCESS; 221e5c89e4eSSatish Balay } 222e5c89e4eSSatish Balay 223d71ae5a4SJacob Faibussowitsch int MPI_Comm_set_attr(MPI_Comm comm, int keyval, void *attribute_val) 224d71ae5a4SJacob Faibussowitsch { 22536f0be53SJacob Faibussowitsch int idx = CommIdx(comm), ret; 226f0463fa0SJunchao Zhang if (comm < 1 || comm > MaxComm) return MPI_FAILURE; 22736f0be53SJacob Faibussowitsch if (keyval < 0 || keyval >= num_attr) return MPI_FAILURE; 22836f0be53SJacob Faibussowitsch 22936f0be53SJacob Faibussowitsch if ((ret = MPI_Comm_delete_attr(comm, keyval))) return ret; 23036f0be53SJacob Faibussowitsch if ((ret = MPI_Attr_reference_keyval(keyval))) return ret; 231f0463fa0SJunchao Zhang attr[idx][keyval].active = 1; 232f0463fa0SJunchao Zhang attr[idx][keyval].attribute_val = attribute_val; 233e5c89e4eSSatish Balay return MPI_SUCCESS; 234e5c89e4eSSatish Balay } 235e5c89e4eSSatish Balay 236d71ae5a4SJacob Faibussowitsch int MPI_Comm_delete_attr(MPI_Comm comm, int keyval) 237d71ae5a4SJacob Faibussowitsch { 238f0463fa0SJunchao Zhang int idx = CommIdx(comm); 239f0463fa0SJunchao Zhang if (comm < 1 || comm > MaxComm) return MPI_FAILURE; 24036f0be53SJacob Faibussowitsch if (keyval < 0 || keyval >= num_attr) return MPI_FAILURE; 24136f0be53SJacob Faibussowitsch if (attr[idx][keyval].active) { 24236f0be53SJacob Faibussowitsch int ret; 243f0463fa0SJunchao Zhang void *save_attribute_val = attr[idx][keyval].attribute_val; 24436f0be53SJacob Faibussowitsch 245f0463fa0SJunchao Zhang attr[idx][keyval].active = 0; 246f0463fa0SJunchao Zhang attr[idx][keyval].attribute_val = 0; 24736f0be53SJacob Faibussowitsch if (attr_keyval[keyval].del) { 248*f4f49eeaSPierre Jolivet if ((ret = (*attr_keyval[keyval].del)(comm, keyval, save_attribute_val, attr_keyval[keyval].extra_state))) return ret; 24936f0be53SJacob Faibussowitsch } 25036f0be53SJacob Faibussowitsch if ((ret = MPI_Attr_dereference_keyval(keyval))) return ret; 25140776e1bSpetsc } 252e5c89e4eSSatish Balay return MPI_SUCCESS; 253e5c89e4eSSatish Balay } 254e5c89e4eSSatish Balay 255d71ae5a4SJacob Faibussowitsch int MPI_Comm_get_attr(MPI_Comm comm, int keyval, void *attribute_val, int *flag) 256d71ae5a4SJacob Faibussowitsch { 257f0463fa0SJunchao Zhang int idx = CommIdx(comm); 258f0463fa0SJunchao Zhang if (comm < 1 || comm > MaxComm) return MPI_FAILURE; 259e5c89e4eSSatish Balay if (!keyval) Keyval_setup(); 260f0463fa0SJunchao Zhang *flag = attr[idx][keyval].active; 261f0463fa0SJunchao Zhang *(void **)attribute_val = attr[idx][keyval].attribute_val; 262e5c89e4eSSatish Balay return MPI_SUCCESS; 263e5c89e4eSSatish Balay } 264e5c89e4eSSatish Balay 2659371c9d4SSatish Balay static char all_comm_names[MAX_COMM][MPI_MAX_OBJECT_NAME] = {"MPI_COMM_SELF", "MPI_COMM_WORLD"}; 2663e1d142dSJacob Faibussowitsch 267d71ae5a4SJacob Faibussowitsch int MPI_Comm_get_name(MPI_Comm comm, char *comm_name, int *resultlen) 268d71ae5a4SJacob Faibussowitsch { 2693e1d142dSJacob Faibussowitsch if (comm < 1 || comm > MaxComm) return MPI_FAILURE; 2703e1d142dSJacob Faibussowitsch if (!comm_name || !resultlen) return MPI_FAILURE; 2713e1d142dSJacob Faibussowitsch strncpy(comm_name, all_comm_names[CommIdx(comm)], MPI_MAX_OBJECT_NAME - 1); 2723e1d142dSJacob Faibussowitsch *resultlen = (int)strlen(comm_name); 2733e1d142dSJacob Faibussowitsch return MPI_SUCCESS; 2743e1d142dSJacob Faibussowitsch } 2753e1d142dSJacob Faibussowitsch 276d71ae5a4SJacob Faibussowitsch int MPI_Comm_set_name(MPI_Comm comm, const char *comm_name) 277d71ae5a4SJacob Faibussowitsch { 2783e1d142dSJacob Faibussowitsch if (comm < 1 || comm > MaxComm) return MPI_FAILURE; 2793e1d142dSJacob Faibussowitsch if (!comm_name) return MPI_FAILURE; 2803e1d142dSJacob Faibussowitsch if (strlen(comm_name) > MPI_MAX_OBJECT_NAME - 1) return MPI_FAILURE; 2813e1d142dSJacob Faibussowitsch strncpy(all_comm_names[CommIdx(comm)], comm_name, MPI_MAX_OBJECT_NAME - 1); 2823e1d142dSJacob Faibussowitsch return MPI_SUCCESS; 2833e1d142dSJacob Faibussowitsch } 2843e1d142dSJacob Faibussowitsch 285d71ae5a4SJacob Faibussowitsch int MPI_Comm_create(MPI_Comm comm, MPI_Group group, MPI_Comm *newcomm) 286d71ae5a4SJacob Faibussowitsch { 287f60917d2SBarry Smith int j; 288f0463fa0SJunchao Zhang if (comm < 1 || comm > MaxComm) return MPI_FAILURE; 289f0463fa0SJunchao Zhang for (j = 3; j <= MaxComm; j++) { 290f0463fa0SJunchao Zhang if (!comm_active[CommIdx(j)]) { 291f0463fa0SJunchao Zhang comm_active[CommIdx(j)] = 1; 292f60917d2SBarry Smith *newcomm = j; 293f60917d2SBarry Smith return MPI_SUCCESS; 294f60917d2SBarry Smith } 295f60917d2SBarry Smith } 296f0463fa0SJunchao Zhang if (MaxComm >= MAX_COMM) return MPI_FAILURE; 297f0463fa0SJunchao Zhang *newcomm = ++MaxComm; 298f0463fa0SJunchao Zhang comm_active[CommIdx(*newcomm)] = 1; 299c8217ed5SSatish Balay return MPI_SUCCESS; 300c8217ed5SSatish Balay } 301c8217ed5SSatish Balay 302d71ae5a4SJacob Faibussowitsch int MPI_Comm_dup(MPI_Comm comm, MPI_Comm *out) 303d71ae5a4SJacob Faibussowitsch { 304f60917d2SBarry Smith int j; 305f0463fa0SJunchao Zhang if (comm < 1 || comm > MaxComm) return MPI_FAILURE; 306f0463fa0SJunchao Zhang for (j = 3; j <= MaxComm; j++) { 307f0463fa0SJunchao Zhang if (!comm_active[CommIdx(j)]) { 308f0463fa0SJunchao Zhang comm_active[CommIdx(j)] = 1; 309f60917d2SBarry Smith *out = j; 310f60917d2SBarry Smith return MPI_SUCCESS; 311f60917d2SBarry Smith } 312f60917d2SBarry Smith } 313f0463fa0SJunchao Zhang if (MaxComm >= MAX_COMM) return MPI_FAILURE; 314f0463fa0SJunchao Zhang *out = ++MaxComm; 315f0463fa0SJunchao Zhang comm_active[CommIdx(*out)] = 1; 31699256852SLisandro Dalcin return MPI_SUCCESS; 317e5c89e4eSSatish Balay } 318e5c89e4eSSatish Balay 319d71ae5a4SJacob Faibussowitsch int MPI_Comm_free(MPI_Comm *comm) 320d71ae5a4SJacob Faibussowitsch { 321f0463fa0SJunchao Zhang int idx = CommIdx(*comm); 322e5c89e4eSSatish Balay 323f0463fa0SJunchao Zhang if (*comm < 1 || *comm > MaxComm) return MPI_FAILURE; 32436f0be53SJacob Faibussowitsch for (int i = 0; i < num_attr; i++) { 32536f0be53SJacob Faibussowitsch int ret = MPI_Comm_delete_attr(*comm, i); 32636f0be53SJacob Faibussowitsch 32736f0be53SJacob Faibussowitsch if (ret) return ret; 328e5c89e4eSSatish Balay } 329f0463fa0SJunchao Zhang if (*comm >= 3) comm_active[idx] = 0; 330100f28aeSBarry Smith *comm = 0; 331e5c89e4eSSatish Balay return MPI_SUCCESS; 332e5c89e4eSSatish Balay } 333e5c89e4eSSatish Balay 334d71ae5a4SJacob Faibussowitsch int MPI_Comm_size(MPI_Comm comm, int *size) 335d71ae5a4SJacob Faibussowitsch { 336f0463fa0SJunchao Zhang if (comm < 1 || comm > MaxComm) return MPI_FAILURE; 337d393f697SSatish Balay *size = 1; 338d393f697SSatish Balay return MPI_SUCCESS; 339d393f697SSatish Balay } 340d393f697SSatish Balay 341d71ae5a4SJacob Faibussowitsch int MPI_Comm_rank(MPI_Comm comm, int *rank) 342d71ae5a4SJacob Faibussowitsch { 343f0463fa0SJunchao Zhang if (comm < 1 || comm > MaxComm) return MPI_FAILURE; 344d393f697SSatish Balay *rank = 0; 345d393f697SSatish Balay return MPI_SUCCESS; 346d393f697SSatish Balay } 347d393f697SSatish Balay 348d71ae5a4SJacob Faibussowitsch int MPIUni_Abort(MPI_Comm comm, int errorcode) 349d71ae5a4SJacob Faibussowitsch { 35006df1fb1SBarry Smith printf("MPI operation not supported by PETSc's sequential MPI wrappers\n"); 351b3f11779SBarry Smith return MPI_ERR_NOSUPPORT; 35206df1fb1SBarry Smith } 35306df1fb1SBarry Smith 354d71ae5a4SJacob Faibussowitsch int MPI_Abort(MPI_Comm comm, int errorcode) 355d71ae5a4SJacob Faibussowitsch { 356e5c89e4eSSatish Balay abort(); 357e5c89e4eSSatish Balay return MPI_SUCCESS; 358e5c89e4eSSatish Balay } 359e5c89e4eSSatish Balay 36058cd72c3SLisandro Dalcin /* --------------------------------------------------------------------------*/ 36158cd72c3SLisandro Dalcin 362e5c89e4eSSatish Balay static int MPI_was_initialized = 0; 36358cd72c3SLisandro Dalcin static int MPI_was_finalized = 0; 36458cd72c3SLisandro Dalcin 365d71ae5a4SJacob Faibussowitsch int MPI_Init(int *argc, char ***argv) 366d71ae5a4SJacob Faibussowitsch { 36799256852SLisandro Dalcin if (MPI_was_initialized) return MPI_FAILURE; 3689bcf9d5aSJunchao Zhang /* MPI standard says "once MPI_Finalize returns, no MPI routine (not even MPI_Init) may be called", so an MPI standard compliant 3699bcf9d5aSJunchao Zhang MPIU should have this 'if (MPI_was_finalized) return MPI_FAILURE;' check. We relax it here to make life easier for users 3709bcf9d5aSJunchao Zhang of MPIU so that they can do multiple PetscInitialize/Finalize(). 3719bcf9d5aSJunchao Zhang */ 3729bcf9d5aSJunchao Zhang /* if (MPI_was_finalized) return MPI_FAILURE; */ 37358cd72c3SLisandro Dalcin MPI_was_initialized = 1; 3749bcf9d5aSJunchao Zhang MPI_was_finalized = 0; 37599256852SLisandro Dalcin return MPI_SUCCESS; 37658cd72c3SLisandro Dalcin } 37758cd72c3SLisandro Dalcin 378d71ae5a4SJacob Faibussowitsch int MPI_Init_thread(int *argc, char ***argv, int required, int *provided) 379d71ae5a4SJacob Faibussowitsch { 3809012378cSStefano Zampini MPI_Query_thread(provided); 3819012378cSStefano Zampini return MPI_Init(argc, argv); 3829012378cSStefano Zampini } 3839012378cSStefano Zampini 384d71ae5a4SJacob Faibussowitsch int MPI_Query_thread(int *provided) 385d71ae5a4SJacob Faibussowitsch { 3869012378cSStefano Zampini *provided = MPI_THREAD_FUNNELED; 3879012378cSStefano Zampini return MPI_SUCCESS; 3889012378cSStefano Zampini } 3899012378cSStefano Zampini 390d71ae5a4SJacob Faibussowitsch int MPI_Finalize(void) 391d71ae5a4SJacob Faibussowitsch { 39236f0be53SJacob Faibussowitsch if (MPI_was_finalized || !MPI_was_initialized) return MPI_FAILURE; 39336f0be53SJacob Faibussowitsch MPI_Comm comm = MPI_COMM_WORLD; 39436f0be53SJacob Faibussowitsch int ret = MPI_Comm_free(&comm); 39536f0be53SJacob Faibussowitsch 39636f0be53SJacob Faibussowitsch if (ret) return ret; 397100f28aeSBarry Smith comm = MPI_COMM_SELF; 39836f0be53SJacob Faibussowitsch ret = MPI_Comm_free(&comm); 39936f0be53SJacob Faibussowitsch if (ret) return ret; 40036f0be53SJacob Faibussowitsch if (PetscDefined(USE_DEBUG)) { 40136f0be53SJacob Faibussowitsch for (int i = 3; i <= MaxComm; ++i) { 402f0463fa0SJunchao Zhang if (comm_active[CommIdx(i)]) printf("MPIUni warning: MPI communicator %d is not freed before MPI_Finalize()\n", i); 403f0463fa0SJunchao Zhang } 40436f0be53SJacob Faibussowitsch 40536f0be53SJacob Faibussowitsch for (int i = 1; i <= MaxComm; ++i) { 40636f0be53SJacob Faibussowitsch for (int j = 0; j < num_attr; ++j) { 40736f0be53SJacob Faibussowitsch if (attr[CommIdx(i)][j].active) printf("MPIUni warning: MPI communicator %d attribute %d was not freed before MPI_Finalize()\n", i, j); 408f0463fa0SJunchao Zhang } 40936f0be53SJacob Faibussowitsch } 41036f0be53SJacob Faibussowitsch 41136f0be53SJacob Faibussowitsch for (int i = 1; i < num_attr; ++i) { 41236f0be53SJacob Faibussowitsch if (attr_keyval[i].active) printf("MPIUni warning: MPI attribute %d was not freed before MPI_Finalize()\n", i); 41336f0be53SJacob Faibussowitsch } 41436f0be53SJacob Faibussowitsch } 41536f0be53SJacob Faibussowitsch 416f0463fa0SJunchao Zhang /* reset counters */ 417f0463fa0SJunchao Zhang MaxComm = 2; 418f0463fa0SJunchao Zhang num_attr = 1; 41958cd72c3SLisandro Dalcin MPI_was_finalized = 1; 4209bcf9d5aSJunchao Zhang MPI_was_initialized = 0; 4219bcf9d5aSJunchao Zhang PETSC_COMM_WORLD = MPI_COMM_NULL; 42299256852SLisandro Dalcin return MPI_SUCCESS; 42358cd72c3SLisandro Dalcin } 424e5c89e4eSSatish Balay 425d71ae5a4SJacob Faibussowitsch int MPI_Initialized(int *flag) 426d71ae5a4SJacob Faibussowitsch { 427e5c89e4eSSatish Balay *flag = MPI_was_initialized; 42899256852SLisandro Dalcin return MPI_SUCCESS; 429e5c89e4eSSatish Balay } 430e5c89e4eSSatish Balay 431d71ae5a4SJacob Faibussowitsch int MPI_Finalized(int *flag) 432d71ae5a4SJacob Faibussowitsch { 43358cd72c3SLisandro Dalcin *flag = MPI_was_finalized; 43499256852SLisandro Dalcin return MPI_SUCCESS; 435e5c89e4eSSatish Balay } 436e5c89e4eSSatish Balay 437e5c89e4eSSatish Balay /* ------------------- Fortran versions of several routines ------------------ */ 438e5c89e4eSSatish Balay 439f7c6e6aaSSatish Balay #if defined(PETSC_HAVE_FORTRAN_CAPS) 4400134af2dSBarry Smith #define mpiunisetmoduleblock_ MPIUNISETMODULEBLOCK 44152ecd5ffSSatish Balay #define mpiunisetfortranbasepointers_ MPIUNISETFORTRANBASEPOINTERS 442a7b85bbcSSatish Balay #define petsc_mpi_init_ PETSC_MPI_INIT 443a7b85bbcSSatish Balay #define petsc_mpi_finalize_ PETSC_MPI_FINALIZE 444a7b85bbcSSatish Balay #define petsc_mpi_comm_size_ PETSC_MPI_COMM_SIZE 445a7b85bbcSSatish Balay #define petsc_mpi_comm_rank_ PETSC_MPI_COMM_RANK 446a7b85bbcSSatish Balay #define petsc_mpi_abort_ PETSC_MPI_ABORT 447a7b85bbcSSatish Balay #define petsc_mpi_reduce_ PETSC_MPI_REDUCE 448a7b85bbcSSatish Balay #define petsc_mpi_allreduce_ PETSC_MPI_ALLREDUCE 449a7b85bbcSSatish Balay #define petsc_mpi_barrier_ PETSC_MPI_BARRIER 450a7b85bbcSSatish Balay #define petsc_mpi_bcast_ PETSC_MPI_BCAST 451a7b85bbcSSatish Balay #define petsc_mpi_gather_ PETSC_MPI_GATHER 452a7b85bbcSSatish Balay #define petsc_mpi_allgather_ PETSC_MPI_ALLGATHER 453a7b85bbcSSatish Balay #define petsc_mpi_comm_split_ PETSC_MPI_COMM_SPLIT 454a7b85bbcSSatish Balay #define petsc_mpi_scan_ PETSC_MPI_SCAN 455a7b85bbcSSatish Balay #define petsc_mpi_send_ PETSC_MPI_SEND 456a7b85bbcSSatish Balay #define petsc_mpi_recv_ PETSC_MPI_RECV 457a7b85bbcSSatish Balay #define petsc_mpi_reduce_scatter_ PETSC_MPI_REDUCE_SCATTER 458a7b85bbcSSatish Balay #define petsc_mpi_irecv_ PETSC_MPI_IRECV 459a7b85bbcSSatish Balay #define petsc_mpi_isend_ PETSC_MPI_ISEND 460a7b85bbcSSatish Balay #define petsc_mpi_sendrecv_ PETSC_MPI_SENDRECV 461a7b85bbcSSatish Balay #define petsc_mpi_test_ PETSC_MPI_TEST 462a7b85bbcSSatish Balay #define petsc_mpi_waitall_ PETSC_MPI_WAITALL 463a7b85bbcSSatish Balay #define petsc_mpi_waitany_ PETSC_MPI_WAITANY 464a7b85bbcSSatish Balay #define petsc_mpi_allgatherv_ PETSC_MPI_ALLGATHERV 465a7b85bbcSSatish Balay #define petsc_mpi_alltoallv_ PETSC_MPI_ALLTOALLV 466a7b85bbcSSatish Balay #define petsc_mpi_comm_create_ PETSC_MPI_COMM_CREATE 467a7b85bbcSSatish Balay #define petsc_mpi_address_ PETSC_MPI_ADDRESS 468a7b85bbcSSatish Balay #define petsc_mpi_pack_ PETSC_MPI_PACK 469a7b85bbcSSatish Balay #define petsc_mpi_unpack_ PETSC_MPI_UNPACK 470a7b85bbcSSatish Balay #define petsc_mpi_pack_size_ PETSC_MPI_PACK_SIZE 471a7b85bbcSSatish Balay #define petsc_mpi_type_struct_ PETSC_MPI_TYPE_STRUCT 472a7b85bbcSSatish Balay #define petsc_mpi_type_commit_ PETSC_MPI_TYPE_COMMIT 473a7b85bbcSSatish Balay #define petsc_mpi_wtime_ PETSC_MPI_WTIME 474a7b85bbcSSatish Balay #define petsc_mpi_cancel_ PETSC_MPI_CANCEL 475a7b85bbcSSatish Balay #define petsc_mpi_comm_dup_ PETSC_MPI_COMM_DUP 476a7b85bbcSSatish Balay #define petsc_mpi_comm_free_ PETSC_MPI_COMM_FREE 477a7b85bbcSSatish Balay #define petsc_mpi_get_count_ PETSC_MPI_GET_COUNT 478a7b85bbcSSatish Balay #define petsc_mpi_get_processor_name_ PETSC_MPI_GET_PROCESSOR_NAME 479a7b85bbcSSatish Balay #define petsc_mpi_initialized_ PETSC_MPI_INITIALIZED 480a7b85bbcSSatish Balay #define petsc_mpi_iprobe_ PETSC_MPI_IPROBE 481a7b85bbcSSatish Balay #define petsc_mpi_probe_ PETSC_MPI_PROBE 482a7b85bbcSSatish Balay #define petsc_mpi_request_free_ PETSC_MPI_REQUEST_FREE 483a7b85bbcSSatish Balay #define petsc_mpi_ssend_ PETSC_MPI_SSEND 484a7b85bbcSSatish Balay #define petsc_mpi_wait_ PETSC_MPI_WAIT 485a7b85bbcSSatish Balay #define petsc_mpi_comm_group_ PETSC_MPI_COMM_GROUP 486a7b85bbcSSatish Balay #define petsc_mpi_exscan_ PETSC_MPI_EXSCAN 487f7c6e6aaSSatish Balay #elif !defined(PETSC_HAVE_FORTRAN_UNDERSCORE) 4880134af2dSBarry Smith #define mpiunisetmoduleblock_ mpiunisetmoduleblock 48952ecd5ffSSatish Balay #define mpiunisetfortranbasepointers_ mpiunisetfortranbasepointers 490a7b85bbcSSatish Balay #define petsc_mpi_init_ petsc_mpi_init 491a7b85bbcSSatish Balay #define petsc_mpi_finalize_ petsc_mpi_finalize 492a7b85bbcSSatish Balay #define petsc_mpi_comm_size_ petsc_mpi_comm_size 493a7b85bbcSSatish Balay #define petsc_mpi_comm_rank_ petsc_mpi_comm_rank 494a7b85bbcSSatish Balay #define petsc_mpi_abort_ petsc_mpi_abort 495a7b85bbcSSatish Balay #define petsc_mpi_reduce_ petsc_mpi_reduce 496a7b85bbcSSatish Balay #define petsc_mpi_allreduce_ petsc_mpi_allreduce 497a7b85bbcSSatish Balay #define petsc_mpi_barrier_ petsc_mpi_barrier 498a7b85bbcSSatish Balay #define petsc_mpi_bcast_ petsc_mpi_bcast 499a7b85bbcSSatish Balay #define petsc_mpi_gather_ petsc_mpi_gather 500a7b85bbcSSatish Balay #define petsc_mpi_allgather_ petsc_mpi_allgather 501a7b85bbcSSatish Balay #define petsc_mpi_comm_split_ petsc_mpi_comm_split 502a7b85bbcSSatish Balay #define petsc_mpi_scan_ petsc_mpi_scan 503a7b85bbcSSatish Balay #define petsc_mpi_send_ petsc_mpi_send 504a7b85bbcSSatish Balay #define petsc_mpi_recv_ petsc_mpi_recv 505a7b85bbcSSatish Balay #define petsc_mpi_reduce_scatter_ petsc_mpi_reduce_scatter 506a7b85bbcSSatish Balay #define petsc_mpi_irecv_ petsc_mpi_irecv 507a7b85bbcSSatish Balay #define petsc_mpi_isend_ petsc_mpi_isend 508a7b85bbcSSatish Balay #define petsc_mpi_sendrecv_ petsc_mpi_sendrecv 509a7b85bbcSSatish Balay #define petsc_mpi_test_ petsc_mpi_test 510a7b85bbcSSatish Balay #define petsc_mpi_waitall_ petsc_mpi_waitall 511a7b85bbcSSatish Balay #define petsc_mpi_waitany_ petsc_mpi_waitany 512a7b85bbcSSatish Balay #define petsc_mpi_allgatherv_ petsc_mpi_allgatherv 513a7b85bbcSSatish Balay #define petsc_mpi_alltoallv_ petsc_mpi_alltoallv 514a7b85bbcSSatish Balay #define petsc_mpi_comm_create_ petsc_mpi_comm_create 515a7b85bbcSSatish Balay #define petsc_mpi_address_ petsc_mpi_address 516a7b85bbcSSatish Balay #define petsc_mpi_pack_ petsc_mpi_pack 517a7b85bbcSSatish Balay #define petsc_mpi_unpack_ petsc_mpi_unpack 518a7b85bbcSSatish Balay #define petsc_mpi_pack_size_ petsc_mpi_pack_size 519a7b85bbcSSatish Balay #define petsc_mpi_type_struct_ petsc_mpi_type_struct 520a7b85bbcSSatish Balay #define petsc_mpi_type_commit_ petsc_mpi_type_commit 521a7b85bbcSSatish Balay #define petsc_mpi_wtime_ petsc_mpi_wtime 522a7b85bbcSSatish Balay #define petsc_mpi_cancel_ petsc_mpi_cancel 523a7b85bbcSSatish Balay #define petsc_mpi_comm_dup_ petsc_mpi_comm_dup 524a7b85bbcSSatish Balay #define petsc_mpi_comm_free_ petsc_mpi_comm_free 525a7b85bbcSSatish Balay #define petsc_mpi_get_count_ petsc_mpi_get_count 526a7b85bbcSSatish Balay #define petsc_mpi_get_processor_name_ petsc_mpi_get_processor_name 527a7b85bbcSSatish Balay #define petsc_mpi_initialized_ petsc_mpi_initialized 528a7b85bbcSSatish Balay #define petsc_mpi_iprobe_ petsc_mpi_iprobe 529a7b85bbcSSatish Balay #define petsc_mpi_probe_ petsc_mpi_probe 530a7b85bbcSSatish Balay #define petsc_mpi_request_free_ petsc_mpi_request_free 531a7b85bbcSSatish Balay #define petsc_mpi_ssend_ petsc_mpi_ssend 532a7b85bbcSSatish Balay #define petsc_mpi_wait_ petsc_mpi_wait 533a7b85bbcSSatish Balay #define petsc_mpi_comm_group_ petsc_mpi_comm_group 534a7b85bbcSSatish Balay #define petsc_mpi_exscan_ petsc_mpi_exscan 535f7c6e6aaSSatish Balay #endif 536e5c89e4eSSatish Balay 537f7c6e6aaSSatish Balay #if defined(PETSC_HAVE_FORTRAN_UNDERSCORE_UNDERSCORE) 538a7b85bbcSSatish Balay #define petsc_mpi_init_ petsc_mpi_init__ 539a7b85bbcSSatish Balay #define petsc_mpi_finalize_ petsc_mpi_finalize__ 540a7b85bbcSSatish Balay #define petsc_mpi_comm_size_ petsc_mpi_comm_size__ 541a7b85bbcSSatish Balay #define petsc_mpi_comm_rank_ petsc_mpi_comm_rank__ 542a7b85bbcSSatish Balay #define petsc_mpi_abort_ petsc_mpi_abort__ 543a7b85bbcSSatish Balay #define petsc_mpi_reduce_ petsc_mpi_reduce__ 544a7b85bbcSSatish Balay #define petsc_mpi_allreduce_ petsc_mpi_allreduce__ 545a7b85bbcSSatish Balay #define petsc_mpi_barrier_ petsc_mpi_barrier__ 546a7b85bbcSSatish Balay #define petsc_mpi_bcast_ petsc_mpi_bcast__ 547a7b85bbcSSatish Balay #define petsc_mpi_gather_ petsc_mpi_gather__ 548a7b85bbcSSatish Balay #define petsc_mpi_allgather_ petsc_mpi_allgather__ 549a7b85bbcSSatish Balay #define petsc_mpi_comm_split_ petsc_mpi_comm_split__ 550a7b85bbcSSatish Balay #define petsc_mpi_scan_ petsc_mpi_scan__ 551a7b85bbcSSatish Balay #define petsc_mpi_send_ petsc_mpi_send__ 552a7b85bbcSSatish Balay #define petsc_mpi_recv_ petsc_mpi_recv__ 553a7b85bbcSSatish Balay #define petsc_mpi_reduce_scatter_ petsc_mpi_reduce_scatter__ 554a7b85bbcSSatish Balay #define petsc_mpi_irecv_ petsc_mpi_irecv__ 555a7b85bbcSSatish Balay #define petsc_mpi_isend_ petsc_mpi_isend__ 556a7b85bbcSSatish Balay #define petsc_mpi_sendrecv_ petsc_mpi_sendrecv__ 557a7b85bbcSSatish Balay #define petsc_mpi_test_ petsc_mpi_test__ 558a7b85bbcSSatish Balay #define petsc_mpi_waitall_ petsc_mpi_waitall__ 559a7b85bbcSSatish Balay #define petsc_mpi_waitany_ petsc_mpi_waitany__ 560a7b85bbcSSatish Balay #define petsc_mpi_allgatherv_ petsc_mpi_allgatherv__ 561a7b85bbcSSatish Balay #define petsc_mpi_alltoallv_ petsc_mpi_alltoallv__ 562a7b85bbcSSatish Balay #define petsc_mpi_comm_create_ petsc_mpi_comm_create__ 563a7b85bbcSSatish Balay #define petsc_mpi_address_ petsc_mpi_address__ 564a7b85bbcSSatish Balay #define petsc_mpi_pack_ petsc_mpi_pack__ 565a7b85bbcSSatish Balay #define petsc_mpi_unpack_ petsc_mpi_unpack__ 566a7b85bbcSSatish Balay #define petsc_mpi_pack_size_ petsc_mpi_pack_size__ 567a7b85bbcSSatish Balay #define petsc_mpi_type_struct_ petsc_mpi_type_struct__ 568a7b85bbcSSatish Balay #define petsc_mpi_type_commit_ petsc_mpi_type_commit__ 569a7b85bbcSSatish Balay #define petsc_mpi_wtime_ petsc_mpi_wtime__ 570a7b85bbcSSatish Balay #define petsc_mpi_cancel_ petsc_mpi_cancel__ 571a7b85bbcSSatish Balay #define petsc_mpi_comm_dup_ petsc_mpi_comm_dup__ 572a7b85bbcSSatish Balay #define petsc_mpi_comm_free_ petsc_mpi_comm_free__ 573a7b85bbcSSatish Balay #define petsc_mpi_get_count_ petsc_mpi_get_count__ 574a7b85bbcSSatish Balay #define petsc_mpi_get_processor_name_ petsc_mpi_get_processor_name__ 575a7b85bbcSSatish Balay #define petsc_mpi_initialized_ petsc_mpi_initialized__ 576a7b85bbcSSatish Balay #define petsc_mpi_iprobe_ petsc_mpi_iprobe__ 577a7b85bbcSSatish Balay #define petsc_mpi_probe_ petsc_mpi_probe__ 578a7b85bbcSSatish Balay #define petsc_mpi_request_free_ petsc_mpi_request_free__ 579a7b85bbcSSatish Balay #define petsc_mpi_ssend_ petsc_mpi_ssend__ 580a7b85bbcSSatish Balay #define petsc_mpi_wait_ petsc_mpi_wait__ 581a7b85bbcSSatish Balay #define petsc_mpi_comm_group_ petsc_mpi_comm_group__ 582a7b85bbcSSatish Balay #define petsc_mpi_exscan_ petsc_mpi_exscan__ 583f7c6e6aaSSatish Balay #endif 584e5c89e4eSSatish Balay 585da81f932SPierre Jolivet /* Do not build fortran interface if MPI namespace collision is to be avoided */ 586fbf9dbe5SBarry Smith #if defined(PETSC_USE_FORTRAN_BINDINGS) 587c8217ed5SSatish Balay 58819caf8f3SSatish Balay PETSC_EXTERN void mpiunisetmoduleblock_(void); 58952ecd5ffSSatish Balay 590d71ae5a4SJacob Faibussowitsch PETSC_EXTERN void mpiunisetfortranbasepointers_(void *f_mpi_in_place) 591d71ae5a4SJacob Faibussowitsch { 59252ecd5ffSSatish Balay MPIUNIF_mpi_in_place = f_mpi_in_place; 59352ecd5ffSSatish Balay } 59452ecd5ffSSatish Balay 595d71ae5a4SJacob Faibussowitsch PETSC_EXTERN void petsc_mpi_init_(int *ierr) 596d71ae5a4SJacob Faibussowitsch { 5970134af2dSBarry Smith mpiunisetmoduleblock_(); 598c8217ed5SSatish Balay *ierr = MPI_Init((int *)0, (char ***)0); 599e5c89e4eSSatish Balay } 600e5c89e4eSSatish Balay 601d71ae5a4SJacob Faibussowitsch PETSC_EXTERN void petsc_mpi_finalize_(int *ierr) 602d71ae5a4SJacob Faibussowitsch { 603c8217ed5SSatish Balay *ierr = MPI_Finalize(); 604e5c89e4eSSatish Balay } 605e5c89e4eSSatish Balay 606d71ae5a4SJacob Faibussowitsch PETSC_EXTERN void petsc_mpi_comm_size_(MPI_Comm *comm, int *size, int *ierr) 607d71ae5a4SJacob Faibussowitsch { 608e5c89e4eSSatish Balay *size = 1; 609e5c89e4eSSatish Balay *ierr = 0; 610e5c89e4eSSatish Balay } 611e5c89e4eSSatish Balay 612d71ae5a4SJacob Faibussowitsch PETSC_EXTERN void petsc_mpi_comm_rank_(MPI_Comm *comm, int *rank, int *ierr) 613d71ae5a4SJacob Faibussowitsch { 614e5c89e4eSSatish Balay *rank = 0; 615e5c89e4eSSatish Balay *ierr = MPI_SUCCESS; 616e5c89e4eSSatish Balay } 617e5c89e4eSSatish Balay 618d71ae5a4SJacob Faibussowitsch PETSC_EXTERN void petsc_mpi_comm_split_(MPI_Comm *comm, int *color, int *key, MPI_Comm *newcomm, int *ierr) 619d71ae5a4SJacob Faibussowitsch { 6201f6cc5b2SSatish Balay *newcomm = *comm; 6211f6cc5b2SSatish Balay *ierr = MPI_SUCCESS; 6221f6cc5b2SSatish Balay } 6231f6cc5b2SSatish Balay 624d71ae5a4SJacob Faibussowitsch PETSC_EXTERN void petsc_mpi_abort_(MPI_Comm *comm, int *errorcode, int *ierr) 625d71ae5a4SJacob Faibussowitsch { 626e5c89e4eSSatish Balay abort(); 627e5c89e4eSSatish Balay *ierr = MPI_SUCCESS; 628e5c89e4eSSatish Balay } 629e5c89e4eSSatish Balay 630d71ae5a4SJacob Faibussowitsch PETSC_EXTERN void petsc_mpi_reduce_(void *sendbuf, void *recvbuf, int *count, int *datatype, int *op, int *root, int *comm, int *ierr) 631d71ae5a4SJacob Faibussowitsch { 632f30578ecSBarry Smith *ierr = MPI_Reduce(sendbuf, recvbuf, *count, *datatype, *op, *root, *comm); 6333b644628SSatish Balay } 6343b644628SSatish Balay 635d71ae5a4SJacob Faibussowitsch PETSC_EXTERN void petsc_mpi_allreduce_(void *sendbuf, void *recvbuf, int *count, int *datatype, int *op, int *comm, int *ierr) 636d71ae5a4SJacob Faibussowitsch { 637f30578ecSBarry Smith *ierr = MPI_Allreduce(sendbuf, recvbuf, *count, *datatype, *op, *comm); 638e5c89e4eSSatish Balay } 639e5c89e4eSSatish Balay 640d71ae5a4SJacob Faibussowitsch PETSC_EXTERN void petsc_mpi_barrier_(MPI_Comm *comm, int *ierr) 641d71ae5a4SJacob Faibussowitsch { 642e5c89e4eSSatish Balay *ierr = MPI_SUCCESS; 643e5c89e4eSSatish Balay } 644f7c6e6aaSSatish Balay 645d71ae5a4SJacob Faibussowitsch PETSC_EXTERN void petsc_mpi_bcast_(void *buf, int *count, int *datatype, int *root, int *comm, int *ierr) 646d71ae5a4SJacob Faibussowitsch { 647e5c89e4eSSatish Balay *ierr = MPI_SUCCESS; 648e5c89e4eSSatish Balay } 649f7c6e6aaSSatish Balay 650d71ae5a4SJacob 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) 651d71ae5a4SJacob Faibussowitsch { 652f30578ecSBarry Smith *ierr = MPI_Gather(sendbuf, *scount, *sdatatype, recvbuf, rcount, rdatatype, *root, *comm); 653f7c6e6aaSSatish Balay } 654f7c6e6aaSSatish Balay 655d71ae5a4SJacob Faibussowitsch PETSC_EXTERN void petsc_mpi_allgather_(void *sendbuf, int *scount, int *sdatatype, void *recvbuf, int *rcount, int *rdatatype, int *comm, int *ierr) 656d71ae5a4SJacob Faibussowitsch { 657f30578ecSBarry Smith *ierr = MPI_Allgather(sendbuf, *scount, *sdatatype, recvbuf, rcount, rdatatype, *comm); 658e5c89e4eSSatish Balay } 659e5c89e4eSSatish Balay 660d71ae5a4SJacob Faibussowitsch PETSC_EXTERN void petsc_mpi_scan_(void *sendbuf, void *recvbuf, int *count, int *datatype, int *op, int *comm, int *ierr) 661d71ae5a4SJacob Faibussowitsch { 6621a589b05SJed Brown *ierr = MPIUNI_Memcpy(recvbuf, sendbuf, (*count) * MPI_sizeof(*datatype)); 6633b644628SSatish Balay } 6643b644628SSatish Balay 665d71ae5a4SJacob Faibussowitsch PETSC_EXTERN void petsc_mpi_send_(void *buf, int *count, int *datatype, int *dest, int *tag, int *comm, int *ierr) 666d71ae5a4SJacob Faibussowitsch { 66706df1fb1SBarry Smith *ierr = MPIUni_Abort(MPI_COMM_WORLD, 0); 6681086b069SSatish Balay } 6691086b069SSatish Balay 670d71ae5a4SJacob Faibussowitsch PETSC_EXTERN void petsc_mpi_recv_(void *buf, int *count, int *datatype, int *source, int *tag, int *comm, int status, int *ierr) 671d71ae5a4SJacob Faibussowitsch { 67206df1fb1SBarry Smith *ierr = MPIUni_Abort(MPI_COMM_WORLD, 0); 6731086b069SSatish Balay } 6741086b069SSatish Balay 675d71ae5a4SJacob Faibussowitsch PETSC_EXTERN void petsc_mpi_reduce_scatter_(void *sendbuf, void *recvbuf, int *recvcounts, int *datatype, int *op, int *comm, int *ierr) 676d71ae5a4SJacob Faibussowitsch { 67706df1fb1SBarry Smith *ierr = MPIUni_Abort(MPI_COMM_WORLD, 0); 678156bc490SSatish Balay } 679156bc490SSatish Balay 680d71ae5a4SJacob Faibussowitsch PETSC_EXTERN void petsc_mpi_irecv_(void *buf, int *count, int *datatype, int *source, int *tag, int *comm, int *request, int *ierr) 681d71ae5a4SJacob Faibussowitsch { 68206df1fb1SBarry Smith *ierr = MPIUni_Abort(MPI_COMM_WORLD, 0); 683156bc490SSatish Balay } 684156bc490SSatish Balay 685d71ae5a4SJacob Faibussowitsch PETSC_EXTERN void petsc_mpi_isend_(void *buf, int *count, int *datatype, int *dest, int *tag, int *comm, int *request, int *ierr) 686d71ae5a4SJacob Faibussowitsch { 68706df1fb1SBarry Smith *ierr = MPIUni_Abort(MPI_COMM_WORLD, 0); 688156bc490SSatish Balay } 689156bc490SSatish Balay 690d71ae5a4SJacob 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) 691d71ae5a4SJacob Faibussowitsch { 6921a589b05SJed Brown *ierr = MPIUNI_Memcpy(recvbuf, sendbuf, (*sendcount) * MPI_sizeof(*sendtype)); 693156bc490SSatish Balay } 694156bc490SSatish Balay 695d71ae5a4SJacob Faibussowitsch PETSC_EXTERN void petsc_mpi_test_(int *request, int *flag, int *status, int *ierr) 696d71ae5a4SJacob Faibussowitsch { 69706df1fb1SBarry Smith *ierr = MPIUni_Abort(MPI_COMM_WORLD, 0); 698156bc490SSatish Balay } 699156bc490SSatish Balay 700d71ae5a4SJacob Faibussowitsch PETSC_EXTERN void petsc_mpi_waitall_(int *count, int *array_of_requests, int *array_of_statuses, int *ierr) 701d71ae5a4SJacob Faibussowitsch { 702156bc490SSatish Balay *ierr = MPI_SUCCESS; 703156bc490SSatish Balay } 704156bc490SSatish Balay 705d71ae5a4SJacob Faibussowitsch PETSC_EXTERN void petsc_mpi_waitany_(int *count, int *array_of_requests, int *index, int *status, int *ierr) 706d71ae5a4SJacob Faibussowitsch { 707156bc490SSatish Balay *ierr = MPI_SUCCESS; 708156bc490SSatish Balay } 709156bc490SSatish Balay 710d71ae5a4SJacob 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) 711d71ae5a4SJacob Faibussowitsch { 712f30578ecSBarry Smith *ierr = MPI_Allgatherv(sendbuf, *sendcount, *sendtype, recvbuf, recvcounts, displs, *recvtype, *comm); 713156bc490SSatish Balay } 714156bc490SSatish Balay 715d71ae5a4SJacob 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) 716d71ae5a4SJacob Faibussowitsch { 717f30578ecSBarry Smith *ierr = MPI_Alltoallv(sendbuf, sendcounts, sdispls, *sendtype, recvbuf, recvcounts, rdispls, *recvtype, *comm); 718156bc490SSatish Balay } 719156bc490SSatish Balay 720d71ae5a4SJacob Faibussowitsch PETSC_EXTERN void petsc_mpi_comm_create_(int *comm, int *group, int *newcomm, int *ierr) 721d71ae5a4SJacob Faibussowitsch { 722156bc490SSatish Balay *newcomm = *comm; 723156bc490SSatish Balay *ierr = MPI_SUCCESS; 724156bc490SSatish Balay } 725156bc490SSatish Balay 726d71ae5a4SJacob Faibussowitsch PETSC_EXTERN void petsc_mpi_address_(void *location, MPI_Aint *address, int *ierr) 727d71ae5a4SJacob Faibussowitsch { 72899256852SLisandro Dalcin *address = (MPI_Aint)((char *)location); 729156bc490SSatish Balay *ierr = MPI_SUCCESS; 730156bc490SSatish Balay } 731156bc490SSatish Balay 732d71ae5a4SJacob Faibussowitsch PETSC_EXTERN void petsc_mpi_pack_(void *inbuf, int *incount, int *datatype, void *outbuf, int *outsize, int *position, int *comm, int *ierr) 733d71ae5a4SJacob Faibussowitsch { 73406df1fb1SBarry Smith *ierr = MPIUni_Abort(MPI_COMM_WORLD, 0); 735156bc490SSatish Balay } 736156bc490SSatish Balay 737d71ae5a4SJacob Faibussowitsch PETSC_EXTERN void petsc_mpi_unpack_(void *inbuf, int *insize, int *position, void *outbuf, int *outcount, int *datatype, int *comm, int *ierr) 738d71ae5a4SJacob Faibussowitsch { 73906df1fb1SBarry Smith *ierr = MPIUni_Abort(MPI_COMM_WORLD, 0); 740156bc490SSatish Balay } 741156bc490SSatish Balay 742d71ae5a4SJacob Faibussowitsch PETSC_EXTERN void petsc_mpi_pack_size_(int *incount, int *datatype, int *comm, int *size, int *ierr) 743d71ae5a4SJacob Faibussowitsch { 74406df1fb1SBarry Smith *ierr = MPIUni_Abort(MPI_COMM_WORLD, 0); 745156bc490SSatish Balay } 746156bc490SSatish Balay 747d71ae5a4SJacob 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) 748d71ae5a4SJacob Faibussowitsch { 74906df1fb1SBarry Smith *ierr = MPIUni_Abort(MPI_COMM_WORLD, 0); 750156bc490SSatish Balay } 751156bc490SSatish Balay 752d71ae5a4SJacob Faibussowitsch PETSC_EXTERN void petsc_mpi_type_commit_(int *datatype, int *ierr) 753d71ae5a4SJacob Faibussowitsch { 754156bc490SSatish Balay *ierr = MPI_SUCCESS; 755156bc490SSatish Balay } 756156bc490SSatish Balay 757d71ae5a4SJacob Faibussowitsch double petsc_mpi_wtime_(void) 758d71ae5a4SJacob Faibussowitsch { 759156bc490SSatish Balay return 0.0; 760f8f52c7dSSatish Balay } 761156bc490SSatish Balay 762d71ae5a4SJacob Faibussowitsch PETSC_EXTERN void petsc_mpi_cancel_(int *request, int *ierr) 763d71ae5a4SJacob Faibussowitsch { 764f8f52c7dSSatish Balay *ierr = MPI_SUCCESS; 765f8f52c7dSSatish Balay } 766f8f52c7dSSatish Balay 767d71ae5a4SJacob Faibussowitsch PETSC_EXTERN void petsc_mpi_comm_dup_(int *comm, int *out, int *ierr) 768d71ae5a4SJacob Faibussowitsch { 769f8f52c7dSSatish Balay *out = *comm; 770f8f52c7dSSatish Balay *ierr = MPI_SUCCESS; 771f8f52c7dSSatish Balay } 772f8f52c7dSSatish Balay 773d71ae5a4SJacob Faibussowitsch PETSC_EXTERN void petsc_mpi_comm_free_(int *comm, int *ierr) 774d71ae5a4SJacob Faibussowitsch { 775f8f52c7dSSatish Balay *ierr = MPI_SUCCESS; 776f8f52c7dSSatish Balay } 777f8f52c7dSSatish Balay 778d71ae5a4SJacob Faibussowitsch PETSC_EXTERN void petsc_mpi_get_count_(int *status, int *datatype, int *count, int *ierr) 779d71ae5a4SJacob Faibussowitsch { 78006df1fb1SBarry Smith *ierr = MPIUni_Abort(MPI_COMM_WORLD, 0); 781f8f52c7dSSatish Balay } 782f8f52c7dSSatish Balay 783d71ae5a4SJacob Faibussowitsch PETSC_EXTERN void petsc_mpi_get_processor_name_(char *name, int *result_len, int *ierr, PETSC_FORTRAN_CHARLEN_T len) 784d71ae5a4SJacob Faibussowitsch { 785f8f52c7dSSatish Balay MPIUNI_Memcpy(name, "localhost", 9 * sizeof(char)); 786f8f52c7dSSatish Balay *result_len = 9; 787f8f52c7dSSatish Balay *ierr = MPI_SUCCESS; 788f8f52c7dSSatish Balay } 789f8f52c7dSSatish Balay 790d71ae5a4SJacob Faibussowitsch PETSC_EXTERN void petsc_mpi_initialized_(int *flag, int *ierr) 791d71ae5a4SJacob Faibussowitsch { 792f8f52c7dSSatish Balay *flag = MPI_was_initialized; 793f8f52c7dSSatish Balay *ierr = MPI_SUCCESS; 794f8f52c7dSSatish Balay } 795f8f52c7dSSatish Balay 796d71ae5a4SJacob Faibussowitsch PETSC_EXTERN void petsc_mpi_iprobe_(int *source, int *tag, int *comm, int *glag, int *status, int *ierr) 797d71ae5a4SJacob Faibussowitsch { 798f8f52c7dSSatish Balay *ierr = MPI_SUCCESS; 799f8f52c7dSSatish Balay } 800f8f52c7dSSatish Balay 801d71ae5a4SJacob Faibussowitsch PETSC_EXTERN void petsc_mpi_probe_(int *source, int *tag, int *comm, int *flag, int *status, int *ierr) 802d71ae5a4SJacob Faibussowitsch { 803f8f52c7dSSatish Balay *ierr = MPI_SUCCESS; 804f8f52c7dSSatish Balay } 805f8f52c7dSSatish Balay 806d71ae5a4SJacob Faibussowitsch PETSC_EXTERN void petsc_mpi_request_free_(int *request, int *ierr) 807d71ae5a4SJacob Faibussowitsch { 808f8f52c7dSSatish Balay *ierr = MPI_SUCCESS; 809f8f52c7dSSatish Balay } 810f8f52c7dSSatish Balay 811d71ae5a4SJacob Faibussowitsch PETSC_EXTERN void petsc_mpi_ssend_(void *buf, int *count, int *datatype, int *dest, int *tag, int *comm, int *ierr) 812d71ae5a4SJacob Faibussowitsch { 81306df1fb1SBarry Smith *ierr = MPIUni_Abort(MPI_COMM_WORLD, 0); 814f8f52c7dSSatish Balay } 815f8f52c7dSSatish Balay 816d71ae5a4SJacob Faibussowitsch PETSC_EXTERN void petsc_mpi_wait_(int *request, int *status, int *ierr) 817d71ae5a4SJacob Faibussowitsch { 818f8f52c7dSSatish Balay *ierr = MPI_SUCCESS; 819156bc490SSatish Balay } 820156bc490SSatish Balay 821d71ae5a4SJacob Faibussowitsch PETSC_EXTERN void petsc_mpi_comm_group_(int *comm, int *group, int *ierr) 822d71ae5a4SJacob Faibussowitsch { 823d4816372SSatish Balay *ierr = MPI_SUCCESS; 824d4816372SSatish Balay } 825d4816372SSatish Balay 826d71ae5a4SJacob Faibussowitsch PETSC_EXTERN void petsc_mpi_exscan_(void *sendbuf, void *recvbuf, int *count, int *datatype, int *op, int *comm, int *ierr) 827d71ae5a4SJacob Faibussowitsch { 828d4816372SSatish Balay *ierr = MPI_SUCCESS; 829d4816372SSatish Balay } 830d4816372SSatish Balay 831fbf9dbe5SBarry Smith #endif /* PETSC_USE_FORTRAN_BINDINGS */ 832c8217ed5SSatish Balay 833e5c89e4eSSatish Balay #if defined(__cplusplus) 834e5c89e4eSSatish Balay } 835e5c89e4eSSatish Balay #endif 836