- for (int rank = ranges[i][0]; /* First */
- rank >= 0 && rank < size_; /* Last */
- ) {
- newsize--;
- if(rank == ranges[i][1]){/*already last ?*/
- break;
- }
- rank += ranges[i][2]; /* Stride */
- if (ranges[i][0] < ranges[i][1]) {
- if (rank > ranges[i][1])
- break;
- } else {
- if (rank < ranges[i][1])
- break;
- }
- }
- }
- if (newsize == 0) {
- *newgroup = MPI_GROUP_EMPTY;
- } else {
- *newgroup = new Group(newsize);
- int newrank = 0;
- int oldrank = 0;
- while (newrank < newsize) {
- int add = 1;
- for (int i = 0; i < n; i++) {
- for (int rank = ranges[i][0]; rank >= 0 && rank < size_;) {
- if(rank==oldrank){
- add = 0;
- break;
- }
- if(rank == ranges[i][1]){/*already last ?*/
- break;
- }
- rank += ranges[i][2]; /* Stride */
- if (ranges[i][0]<ranges[i][1]){
- if (rank > ranges[i][1])
- break;
- }else{
- if (rank < ranges[i][1])
- break;
- }
- }
- }
- if(add==1){
- int index = this->index(oldrank);
- (*newgroup)->set_mapping(index, newrank);
- newrank++;
- }
- oldrank++;
- }