+int MPI_Type_lb(MPI_Datatype datatype, MPI_Aint* disp) {
+ int retval;
+
+ smpi_bench_end(MPI_COMM_NULL, NULL);
+ if(datatype == MPI_DATATYPE_NULL) {
+ retval = MPI_ERR_TYPE;
+ } else if(disp == NULL) {
+ retval = MPI_ERR_ARG;
+ } else {
+ *disp = smpi_datatype_lb(datatype);
+ retval = MPI_SUCCESS;
+ }
+ smpi_bench_begin(MPI_COMM_NULL, NULL);
+ return retval;
+}
+
+int MPI_Type_ub(MPI_Datatype datatype, MPI_Aint* disp) {
+ int retval;
+
+ smpi_bench_end(MPI_COMM_NULL, NULL);
+ if(datatype == MPI_DATATYPE_NULL) {
+ retval = MPI_ERR_TYPE;
+ } else if(disp == NULL) {
+ retval = MPI_ERR_ARG;
+ } else {
+ *disp = smpi_datatype_ub(datatype);
+ retval = MPI_SUCCESS;
+ }
+ smpi_bench_begin(MPI_COMM_NULL, NULL);
+ return retval;
+}
+
+int MPI_Op_create(MPI_User_function* function, int commute, MPI_Op* op) {
+ int retval;
+
+ smpi_bench_end(MPI_COMM_NULL, NULL);
+ if(function == NULL || op == NULL) {
+ retval = MPI_ERR_ARG;
+ } else {
+ *op = smpi_op_new(function, commute);
+ retval = MPI_SUCCESS;
+ }
+ smpi_bench_begin(MPI_COMM_NULL, NULL);
+ return retval;
+}
+
+int MPI_Op_free(MPI_Op* op) {
+ int retval;
+
+ smpi_bench_end(MPI_COMM_NULL, NULL);
+ if(op == NULL) {
+ retval = MPI_ERR_ARG;
+ } else if(*op == MPI_OP_NULL) {
+ retval = MPI_ERR_OP;
+ } else {
+ smpi_op_destroy(*op);
+ *op = MPI_OP_NULL;
+ retval = MPI_SUCCESS;
+ }
+ smpi_bench_begin(MPI_COMM_NULL, NULL);
+ return retval;
+}
+
+int MPI_Group_free(MPI_Group *group) {
+ int retval;
+
+ smpi_bench_end(MPI_COMM_NULL, NULL);
+ if(group == NULL) {
+ retval = MPI_ERR_ARG;
+ } else {
+ smpi_group_destroy(*group);
+ *group = MPI_GROUP_NULL;
+ retval = MPI_SUCCESS;
+ }
+ smpi_bench_begin(MPI_COMM_NULL, NULL);
+ return retval;
+}
+
+int MPI_Group_size(MPI_Group group, int* size) {
+ int retval;
+
+ smpi_bench_end(MPI_COMM_NULL, NULL);
+ if(group == MPI_GROUP_NULL) {
+ retval = MPI_ERR_GROUP;
+ } else if(size == NULL) {
+ retval = MPI_ERR_ARG;
+ } else {
+ *size = smpi_group_size(group);
+ retval = MPI_SUCCESS;
+ }
+ smpi_bench_begin(MPI_COMM_NULL, NULL);
+ return retval;
+}
+
+int MPI_Group_rank(MPI_Group group, int* rank) {
+ int retval;
+
+ smpi_bench_end(MPI_COMM_NULL, NULL);
+ if(group == MPI_GROUP_NULL) {
+ retval = MPI_ERR_GROUP;
+ } else if(rank == NULL) {
+ retval = MPI_ERR_ARG;
+ } else {
+ *rank = smpi_group_rank(group, smpi_process_index());
+ retval = MPI_SUCCESS;
+ }
+ smpi_bench_begin(MPI_COMM_NULL, NULL);
+ return retval;
+}
+
+int MPI_Group_translate_ranks (MPI_Group group1, int n, int* ranks1, MPI_Group group2, int* ranks2) {
+ int retval, i, index;
+
+ smpi_bench_end(MPI_COMM_NULL, NULL);
+ if(group1 == MPI_GROUP_NULL || group2 == MPI_GROUP_NULL) {
+ retval = MPI_ERR_GROUP;
+ } else {
+ for(i = 0; i < n; i++) {
+ index = smpi_group_index(group1, ranks1[i]);
+ ranks2[i] = smpi_group_rank(group2, index);
+ }
+ retval = MPI_SUCCESS;
+ }
+ smpi_bench_begin(MPI_COMM_NULL, NULL);
+ return retval;
+}
+
+int MPI_Group_compare(MPI_Group group1, MPI_Group group2, int* result) {
+ int retval;
+
+ smpi_bench_end(MPI_COMM_NULL, NULL);
+ if(group1 == MPI_GROUP_NULL || group2 == MPI_GROUP_NULL) {
+ retval = MPI_ERR_GROUP;
+ } else if(result == NULL) {
+ retval = MPI_ERR_ARG;
+ } else {
+ *result = smpi_group_compare(group1, group2);
+ retval = MPI_SUCCESS;
+ }
+ smpi_bench_begin(MPI_COMM_NULL, NULL);
+ return retval;
+}
+
+int MPI_Group_union(MPI_Group group1, MPI_Group group2, MPI_Group* newgroup) {
+ int retval, i, proc1, proc2, size, size2;
+
+ smpi_bench_end(MPI_COMM_NULL, NULL);
+ if(group1 == MPI_GROUP_NULL || group2 == MPI_GROUP_NULL) {
+ retval = MPI_ERR_GROUP;
+ } else if(newgroup == NULL) {
+ retval = MPI_ERR_ARG;
+ } else {
+ size = smpi_group_size(group1);
+ size2 = smpi_group_size(group2);
+ for(i = 0; i < size2; i++) {
+ proc2 = smpi_group_index(group2, i);
+ proc1 = smpi_group_rank(group1, proc2);
+ if(proc1 == MPI_UNDEFINED) {
+ size++;
+ }
+ }
+ if(size == 0) {
+ *newgroup = MPI_GROUP_EMPTY;
+ } else {
+ *newgroup = smpi_group_new(size);
+ size2 = smpi_group_size(group1);
+ for(i = 0; i < size2; i++) {
+ proc1 = smpi_group_index(group1, i);
+ smpi_group_set_mapping(*newgroup, proc1, i);
+ }
+ for(i = size2; i < size; i++) {
+ proc2 = smpi_group_index(group2, i - size2);
+ smpi_group_set_mapping(*newgroup, proc2, i);
+ }
+ }
+ smpi_group_use(*newgroup);
+ retval = MPI_SUCCESS;
+ }
+ smpi_bench_begin(MPI_COMM_NULL, NULL);
+ return retval;
+}
+
+int MPI_Group_intersection(MPI_Group group1, MPI_Group group2, MPI_Group* newgroup) {
+ int retval, i, proc1, proc2, size, size2;
+
+ smpi_bench_end(MPI_COMM_NULL, NULL);
+ if(group1 == MPI_GROUP_NULL || group2 == MPI_GROUP_NULL) {
+ retval = MPI_ERR_GROUP;
+ } else if(newgroup == NULL) {
+ retval = MPI_ERR_ARG;
+ } else {
+ size = smpi_group_size(group1);
+ size2 = smpi_group_size(group2);
+ for(i = 0; i < size2; i++) {
+ proc2 = smpi_group_index(group2, i);
+ proc1 = smpi_group_rank(group1, proc2);
+ if(proc1 == MPI_UNDEFINED) {
+ size--;
+ }
+ }
+ if(size == 0) {
+ *newgroup = MPI_GROUP_EMPTY;
+ } else {
+ *newgroup = smpi_group_new(size);
+ size2 = smpi_group_size(group1);
+ for(i = 0; i < size2; i++) {
+ proc1 = smpi_group_index(group1, i);
+ proc2 = smpi_group_rank(group2, proc1);
+ if(proc2 != MPI_UNDEFINED) {
+ smpi_group_set_mapping(*newgroup, proc1, i);
+ }
+ }
+ }
+ smpi_group_use(*newgroup);
+ retval = MPI_SUCCESS;
+ }
+ smpi_bench_begin(MPI_COMM_NULL, NULL);
+ return retval;
+}