+int MPI_Group_excl(MPI_Group group, int n, int* ranks, MPI_Group* newgroup) {
+ int retval, i, size, rank, index;
+
+ smpi_bench_end(-1, NULL);
+ if(group == MPI_GROUP_NULL) {
+ retval = MPI_ERR_GROUP;
+ } else if(newgroup == NULL) {
+ retval = MPI_ERR_ARG;
+ } else {
+ if(n == 0) {
+ *newgroup = group;
+ } else if(n == smpi_group_size(group)) {
+ *newgroup = MPI_GROUP_EMPTY;
+ } else {
+ size = smpi_group_size(group) - n;
+ *newgroup = smpi_group_new(size);
+ rank = 0;
+ while(rank < size) {
+ for(i = 0; i < n; i++) {
+ if(ranks[i] == rank) {
+ break;
+ }
+ }
+ if(i >= n) {
+ index = smpi_group_index(group, rank);
+ smpi_group_set_mapping(*newgroup, index, rank);
+ rank++;
+ }
+ }
+ }
+ smpi_group_use(*newgroup);
+ retval = MPI_SUCCESS;
+ }
+ smpi_bench_begin(-1, NULL);
+ return retval;
+}
+
+int MPI_Group_range_incl(MPI_Group group, int n, int ranges[][3], MPI_Group* newgroup) {
+ int retval, i, j, rank, size, index;
+
+ smpi_bench_end(-1, NULL);
+ if(group == MPI_GROUP_NULL) {
+ retval = MPI_ERR_GROUP;
+ } else if(newgroup == NULL) {
+ retval = MPI_ERR_ARG;
+ } else {
+ if(n == 0) {
+ *newgroup = MPI_GROUP_EMPTY;
+ } else {
+ size = 0;
+ for(i = 0; i < n; i++) {
+ for(rank = ranges[i][0]; /* First */
+ rank >= 0 && rank <= ranges[i][1]; /* Last */
+ rank += ranges[i][2] /* Stride */) {
+ size++;
+ }
+ }
+ if(size == smpi_group_size(group)) {
+ *newgroup = group;
+ } else {
+ *newgroup = smpi_group_new(size);
+ j = 0;
+ for(i = 0; i < n; i++) {
+ for(rank = ranges[i][0]; /* First */
+ rank >= 0 && rank <= ranges[i][1]; /* Last */
+ rank += ranges[i][2] /* Stride */) {
+ index = smpi_group_index(group, rank);
+ smpi_group_set_mapping(*newgroup, index, j);
+ j++;
+ }
+ }
+ }
+ }
+ smpi_group_use(*newgroup);
+ retval = MPI_SUCCESS;
+ }
+ smpi_bench_begin(-1, NULL);
+ return retval;
+}