Two tests added : that the rank is in the right range at all times, and that we don't go after the last one wanted.
Hopefully this will be enough to cover all cases.
Test commcreate1 from mpich 3 testsuite has been confirmed to pass with one process
The test with 1 process has been added to the test suite (it was with 8 processes before)
size = 0;
for (i = 0; i < n; i++) {
for (rank = ranges[i][0]; /* First */
size = 0;
for (i = 0; i < n; i++) {
for (rank = ranges[i][0]; /* First */
+ rank >= 0 && rank < smpi_group_size(group); /* Last */
+ 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])
rank += ranges[i][2]; /* Stride */
if (ranges[i][0]<ranges[i][1]){
if(rank > ranges[i][1])
j = 0;
for (i = 0; i < n; i++) {
for (rank = ranges[i][0]; /* First */
j = 0;
for (i = 0; i < n; i++) {
for (rank = ranges[i][0]; /* First */
+ rank >= 0 && rank < smpi_group_size(group); /* Last */
) {
index = smpi_group_index(group, rank);
smpi_group_set_mapping(*newgroup, index, j);
j++;
) {
index = smpi_group_index(group, rank);
smpi_group_set_mapping(*newgroup, index, j);
j++;
+ 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])
rank += ranges[i][2]; /* Stride */
if (ranges[i][0]<ranges[i][1]){
if(rank > ranges[i][1])
size = smpi_group_size(group);
for (i = 0; i < n; i++) {
for (rank = ranges[i][0]; /* First */
size = smpi_group_size(group);
for (i = 0; i < n; i++) {
for (rank = ranges[i][0]; /* First */
+ rank >= 0 && rank < smpi_group_size(group); /* Last */
+ 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])
rank += ranges[i][2]; /* Stride */
if (ranges[i][0]<ranges[i][1]){
if(rank > ranges[i][1])
while (newrank < size) {
add=1;
for (i = 0; i < n; i++) {
while (newrank < size) {
add=1;
for (i = 0; i < n; i++) {
- for (rank = ranges[i][0];rank >= 0;){
+ for (rank = ranges[i][0];
+ rank >= 0 && rank < smpi_group_size(group);
+ ){
if(rank==oldrank){
add=0;
break;
}
if(rank==oldrank){
add=0;
break;
}
+ if(rank == ranges[i][1]){/*already last ?*/
+ break;
+ }
rank += ranges[i][2]; /* Stride */
rank += ranges[i][2]; /* Stride */
if (ranges[i][0]<ranges[i][1]){
if(rank > ranges[i][1])
break;
if (ranges[i][0]<ranges[i][1]){
if(rank > ranges[i][1])
break;
#dupic 4
#works, but needs MPI_Comm_set_name
commcreate1 8
#dupic 4
#works, but needs MPI_Comm_set_name
commcreate1 8
#needs MPI_Comm_set_name and MPI_Intercomm_create
#commname 4
#ic1 4
#needs MPI_Comm_set_name and MPI_Intercomm_create
#commname 4
#ic1 4