1 static char help[] = "Test PetscSFCreateByMatchingIndices\n\n";
2
3 #include <petsc.h>
4 #include <petscsf.h>
5
6 /* Test PetscSFCreateByMatchingIndices.
7
8 testnum 0:
9
10 rank : 0 1 2
11 numRootIndices : 3 1 1
12 rootIndices : [1 0 2] [3] [3]
13 rootLocalOffset : 100 200 300
14 layout : [0 1] [2] [3]
15 numLeafIndices : 1 1 2
16 leafIndices : [0] [2] [0 3]
17 leafLocalOffset : 400 500 600
18
19 would build the following SF:
20
21 [0] 400 <- (0,101)
22 [1] 500 <- (0,102)
23 [2] 600 <- (0,101)
24 [2] 601 <- (2,300)
25
26 testnum 1:
27
28 rank : 0 1 2
29 numRootIndices : 3 1 1
30 rootIndices : [1 0 2] [3] [3]
31 rootLocalOffset : 100 200 300
32 layout : [0 1] [2] [3]
33 numLeafIndices : numRootIndices numRootIndices numRootIndices
34 leafIndices : rootIndices rootIndices rootIndices
35 leafLocalOffset : rootLocalOffset rootLocalOffset rootLocalOffset
36
37 would build the following SF:
38
39 [1] 200 <- (2,300)
40
41 testnum 2:
42
43 No one claims ownership of global index 1, but no one needs it.
44
45 rank : 0 1 2
46 numRootIndices : 2 1 1
47 rootIndices : [0 2] [3] [3]
48 rootLocalOffset : 100 200 300
49 layout : [0 1] [2] [3]
50 numLeafIndices : 1 1 2
51 leafIndices : [0] [2] [0 3]
52 leafLocalOffset : 400 500 600
53
54 would build the following SF:
55
56 [0] 400 <- (0,100)
57 [1] 500 <- (0,101)
58 [2] 600 <- (0,100)
59 [2] 601 <- (2,300)
60
61 */
62
main(int argc,char ** argv)63 int main(int argc, char **argv)
64 {
65 PetscSF sf;
66 PetscLayout layout;
67 PetscInt N, n;
68 PetscInt nA = -1, *A, offsetA = -1;
69 PetscInt nB = -1, *B, offsetB = -1;
70 PetscMPIInt size, rank;
71 PetscInt testnum;
72
73 PetscFunctionBeginUser;
74 PetscCall(PetscInitialize(&argc, &argv, NULL, help));
75 PetscCall(PetscOptionsGetInt(NULL, NULL, "-testnum", &testnum, NULL));
76 PetscCallMPI(MPI_Comm_size(PETSC_COMM_WORLD, &size));
77 PetscCallMPI(MPI_Comm_rank(PETSC_COMM_WORLD, &rank));
78 PetscCheck(size == 3, PETSC_COMM_WORLD, PETSC_ERR_WRONG_MPI_SIZE, "Must run with 3 MPI processes");
79
80 switch (testnum) {
81 case 0:
82 N = 4;
83 n = PETSC_DECIDE;
84 switch (rank) {
85 case 0:
86 nA = 3;
87 offsetA = 100;
88 nB = 1;
89 offsetB = 400;
90 break;
91 case 1:
92 nA = 1;
93 offsetA = 200;
94 nB = 1;
95 offsetB = 500;
96 break;
97 case 2:
98 nA = 1;
99 offsetA = 300;
100 nB = 2;
101 offsetB = 600;
102 break;
103 default:
104 SETERRQ(PETSC_COMM_WORLD, PETSC_ERR_WRONG_MPI_SIZE, "Must run with 3 MPI processes");
105 }
106 PetscCall(PetscMalloc1(nA, &A));
107 PetscCall(PetscMalloc1(nB, &B));
108 switch (rank) {
109 case 0:
110 A[0] = 1;
111 A[1] = 0;
112 A[2] = 2;
113 B[0] = 0;
114 break;
115 case 1:
116 A[0] = 3;
117 B[0] = 2;
118 break;
119 case 2:
120 A[0] = 3;
121 B[0] = 0;
122 B[1] = 3;
123 break;
124 default:
125 SETERRQ(PETSC_COMM_WORLD, PETSC_ERR_WRONG_MPI_SIZE, "Must run with 3 MPI processes");
126 }
127 break;
128 case 1:
129 N = 4;
130 n = PETSC_DECIDE;
131 switch (rank) {
132 case 0:
133 nA = 3;
134 offsetA = 100;
135 break;
136 case 1:
137 nA = 1;
138 offsetA = 200;
139 break;
140 case 2:
141 nA = 1;
142 offsetA = 300;
143 break;
144 default:
145 SETERRQ(PETSC_COMM_WORLD, PETSC_ERR_WRONG_MPI_SIZE, "Must run with 3 MPI processes");
146 }
147 PetscCall(PetscMalloc1(nA, &A));
148 switch (rank) {
149 case 0:
150 A[0] = 1;
151 A[1] = 0;
152 A[2] = 2;
153 break;
154 case 1:
155 A[0] = 3;
156 break;
157 case 2:
158 A[0] = 3;
159 break;
160 default:
161 SETERRQ(PETSC_COMM_WORLD, PETSC_ERR_WRONG_MPI_SIZE, "Must run with 3 MPI processes");
162 }
163 nB = nA;
164 B = A;
165 offsetB = offsetA;
166 break;
167 case 2:
168 N = 4;
169 n = PETSC_DECIDE;
170 switch (rank) {
171 case 0:
172 nA = 2;
173 offsetA = 100;
174 nB = 1;
175 offsetB = 400;
176 break;
177 case 1:
178 nA = 1;
179 offsetA = 200;
180 nB = 1;
181 offsetB = 500;
182 break;
183 case 2:
184 nA = 1;
185 offsetA = 300;
186 nB = 2;
187 offsetB = 600;
188 break;
189 default:
190 SETERRQ(PETSC_COMM_WORLD, PETSC_ERR_WRONG_MPI_SIZE, "Must run with 3 MPI processes");
191 }
192 PetscCall(PetscMalloc1(nA, &A));
193 PetscCall(PetscMalloc1(nB, &B));
194 switch (rank) {
195 case 0:
196 A[0] = 0;
197 A[1] = 2;
198 B[0] = 0;
199 break;
200 case 1:
201 A[0] = 3;
202 B[0] = 2;
203 break;
204 case 2:
205 A[0] = 3;
206 B[0] = 0;
207 B[1] = 3;
208 break;
209 default:
210 SETERRQ(PETSC_COMM_WORLD, PETSC_ERR_WRONG_MPI_SIZE, "Must run with 3 MPI processes");
211 }
212 break;
213 }
214 PetscCall(PetscLayoutCreate(PETSC_COMM_WORLD, &layout));
215 PetscCall(PetscLayoutSetSize(layout, N));
216 PetscCall(PetscLayoutSetLocalSize(layout, n));
217 PetscCall(PetscLayoutSetBlockSize(layout, 1));
218 PetscCall(PetscSFCreateByMatchingIndices(layout, nA, A, NULL, offsetA, nB, B, NULL, offsetB, NULL, &sf));
219 PetscCall(PetscLayoutDestroy(&layout));
220 PetscCall(PetscFree(A));
221 if (testnum != 1) PetscCall(PetscFree(B));
222 PetscCall(PetscObjectSetName((PetscObject)sf, "sf"));
223 PetscCall(PetscSFView(sf, NULL));
224 PetscCall(PetscSFDestroy(&sf));
225
226 PetscCall(PetscFinalize());
227 return 0;
228 }
229
230 /*TEST
231
232 test:
233 suffix: 0
234 nsize: 3
235 args: -testnum 0
236
237 test:
238 suffix: 1
239 nsize: 3
240 args: -testnum 1
241
242 test:
243 suffix: 2
244 nsize: 3
245 args: -testnum 2
246
247 TEST*/
248