This source file includes following definitions.
- MPI_Group_range_incl
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22 #include "ompi_config.h"
23 #include <stdio.h>
24
25 #include "ompi/mpi/c/bindings.h"
26 #include "ompi/runtime/params.h"
27 #include "ompi/group/group.h"
28 #include "ompi/errhandler/errhandler.h"
29 #include "ompi/communicator/communicator.h"
30
31 #if OMPI_BUILD_MPI_PROFILING
32 #if OPAL_HAVE_WEAK_SYMBOLS
33 #pragma weak MPI_Group_range_incl = PMPI_Group_range_incl
34 #endif
35 #define MPI_Group_range_incl PMPI_Group_range_incl
36 #endif
37
38 static const char FUNC_NAME[] = "MPI_Group_range_incl";
39
40
41 int MPI_Group_range_incl(MPI_Group group, int n_triplets, int ranges[][3],
42 MPI_Group *new_group)
43 {
44 int err, i,indx;
45 int group_size;
46 int * elements_int_list;
47
48
49 if( MPI_PARAM_CHECK ) {
50 OMPI_ERR_INIT_FINALIZE(FUNC_NAME);
51
52 if ( (MPI_GROUP_NULL == group) || (NULL == group) ||
53 (NULL == new_group) ) {
54 return OMPI_ERRHANDLER_INVOKE(MPI_COMM_WORLD, MPI_ERR_GROUP,
55 FUNC_NAME);
56 }
57
58 group_size = ompi_group_size ( group);
59 elements_int_list = (int *) malloc(sizeof(int) * (group_size+1));
60 if (NULL == elements_int_list) {
61 return OMPI_ERRHANDLER_INVOKE(MPI_COMM_WORLD, MPI_ERR_OTHER, FUNC_NAME);
62 }
63 for (i = 0; i < group_size; i++) {
64 elements_int_list[i] = -1;
65 }
66
67 for ( i=0; i < n_triplets; i++) {
68 if ((0 > ranges[i][0]) || (ranges[i][0] > group_size)) {
69 goto error_rank;
70 }
71 if ((0 > ranges[i][1]) || (ranges[i][1] > group_size)) {
72 goto error_rank;
73 }
74 if (ranges[i][2] == 0) {
75 goto error_rank;
76 }
77
78 if ((ranges[i][0] < ranges[i][1])) {
79 if (ranges[i][2] < 0) {
80 goto error_rank;
81 }
82
83 for (indx = ranges[i][0]; indx <= ranges[i][1]; indx += ranges[i][2]) {
84
85 if (elements_int_list[indx] != -1) {
86 goto error_rank;
87 }
88 elements_int_list[indx] = i;
89 }
90 } else if (ranges[i][0] > ranges[i][1]) {
91 if (ranges[i][2] > 0) {
92 goto error_rank;
93 }
94
95 for (indx = ranges[i][0]; indx >= ranges[i][1]; indx += ranges[i][2]) {
96
97 if (elements_int_list[indx] != -1) {
98 goto error_rank;
99 }
100 elements_int_list[indx] = i;
101 }
102 } else {
103
104 indx = ranges[i][0];
105 if (elements_int_list[indx] != -1) {
106 goto error_rank;
107 }
108 elements_int_list[indx] = i;
109 }
110 }
111
112 free ( elements_int_list);
113 }
114
115 OPAL_CR_ENTER_LIBRARY();
116
117 err = ompi_group_range_incl ( group, n_triplets, ranges, new_group );
118 OMPI_ERRHANDLER_RETURN(err, MPI_COMM_WORLD, err, FUNC_NAME );
119
120 error_rank:
121 free(elements_int_list);
122 return OMPI_ERRHANDLER_INVOKE(MPI_COMM_WORLD, MPI_ERR_RANK, FUNC_NAME);
123 }