This source file includes following definitions.
- MPI_Group_range_excl
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_excl = PMPI_Group_range_excl
34 #endif
35 #define MPI_Group_range_excl PMPI_Group_range_excl
36 #endif
37
38 static const char FUNC_NAME[] = "MPI_Group_range_excl";
39
40
41 int MPI_Group_range_excl(MPI_Group group, int n_triplets, int ranges[][3],
42 MPI_Group *new_group)
43 {
44 int err, i, group_size, indx;
45 int * elements_int_list;
46
47
48 if( MPI_PARAM_CHECK ) {
49 OMPI_ERR_INIT_FINALIZE(FUNC_NAME);
50 if ( (MPI_GROUP_NULL == group) || (NULL == group) ||
51 (NULL == new_group) ) {
52 return OMPI_ERRHANDLER_INVOKE(MPI_COMM_WORLD, MPI_ERR_GROUP,
53 FUNC_NAME);
54 }
55
56 group_size = ompi_group_size ( group );
57 elements_int_list = (int *) malloc(sizeof(int) * (group_size+1));
58 if (NULL == elements_int_list) {
59 return OMPI_ERRHANDLER_INVOKE(MPI_COMM_WORLD, MPI_ERR_OTHER,
60 FUNC_NAME);
61 }
62 for (i = 0; i < group_size; i++) {
63 elements_int_list[i] = -1;
64 }
65
66 for (i = 0; i < n_triplets; i++) {
67 if ((0 > ranges[i][0]) || (ranges[i][0] > group_size)) {
68 goto error_rank;
69 }
70 if ((0 > ranges[i][1]) || (ranges[i][1] > group_size)) {
71 goto error_rank;
72 }
73 if (ranges[i][2] == 0) {
74 goto error_rank;
75 }
76
77 if (ranges[i][0] < ranges[i][1]) {
78 if (ranges[i][2] < 0) {
79 goto error_rank;
80 }
81
82 for (indx = ranges[i][0]; indx <= ranges[i][1]; indx += ranges[i][2]) {
83
84 if (elements_int_list[indx] != -1) {
85 goto error_rank;
86 }
87 elements_int_list[indx] = i;
88 }
89 } else if (ranges[i][0] > ranges[i][1]) {
90 if (ranges[i][2] > 0) {
91 goto error_rank;
92 }
93
94 for (indx = ranges[i][0]; indx >= ranges[i][1]; indx += ranges[i][2]) {
95
96 if (elements_int_list[indx] != -1) {
97 goto error_rank;
98 }
99 elements_int_list[indx] = i;
100 }
101 } else {
102
103 indx = ranges[i][0];
104 if (elements_int_list[indx] != -1) {
105 goto error_rank;
106 }
107 elements_int_list[indx] = i;
108 }
109 }
110
111 free (elements_int_list);
112 }
113
114 OPAL_CR_ENTER_LIBRARY();
115
116 err = ompi_group_range_excl(group,n_triplets,ranges,new_group);
117 OMPI_ERRHANDLER_RETURN(err, MPI_COMM_WORLD,err,FUNC_NAME);
118
119 error_rank:
120 free(elements_int_list);
121 return OMPI_ERRHANDLER_INVOKE(MPI_COMM_WORLD, MPI_ERR_RANK, FUNC_NAME);
122 }