1c8e949b3Sksagiyam static char help[] = "Test PetscSFCreateByMatchingIndices\n\n";
2c8e949b3Sksagiyam
3c8e949b3Sksagiyam #include <petsc.h>
4c8e949b3Sksagiyam #include <petscsf.h>
5c8e949b3Sksagiyam
6c8e949b3Sksagiyam /* Test PetscSFCreateByMatchingIndices.
7c8e949b3Sksagiyam
8c8e949b3Sksagiyam testnum 0:
9c8e949b3Sksagiyam
10c8e949b3Sksagiyam rank : 0 1 2
11c8e949b3Sksagiyam numRootIndices : 3 1 1
12c8e949b3Sksagiyam rootIndices : [1 0 2] [3] [3]
13c8e949b3Sksagiyam rootLocalOffset : 100 200 300
14c8e949b3Sksagiyam layout : [0 1] [2] [3]
15c8e949b3Sksagiyam numLeafIndices : 1 1 2
16c8e949b3Sksagiyam leafIndices : [0] [2] [0 3]
17c8e949b3Sksagiyam leafLocalOffset : 400 500 600
18c8e949b3Sksagiyam
19c8e949b3Sksagiyam would build the following SF:
20c8e949b3Sksagiyam
21c8e949b3Sksagiyam [0] 400 <- (0,101)
22c8e949b3Sksagiyam [1] 500 <- (0,102)
23c8e949b3Sksagiyam [2] 600 <- (0,101)
24c8e949b3Sksagiyam [2] 601 <- (2,300)
25c8e949b3Sksagiyam
26c8e949b3Sksagiyam testnum 1:
27c8e949b3Sksagiyam
28c8e949b3Sksagiyam rank : 0 1 2
29c8e949b3Sksagiyam numRootIndices : 3 1 1
30c8e949b3Sksagiyam rootIndices : [1 0 2] [3] [3]
31c8e949b3Sksagiyam rootLocalOffset : 100 200 300
32c8e949b3Sksagiyam layout : [0 1] [2] [3]
33c8e949b3Sksagiyam numLeafIndices : numRootIndices numRootIndices numRootIndices
34c8e949b3Sksagiyam leafIndices : rootIndices rootIndices rootIndices
35c8e949b3Sksagiyam leafLocalOffset : rootLocalOffset rootLocalOffset rootLocalOffset
36c8e949b3Sksagiyam
37c8e949b3Sksagiyam would build the following SF:
38c8e949b3Sksagiyam
39c8e949b3Sksagiyam [1] 200 <- (2,300)
40c8e949b3Sksagiyam
41c8e949b3Sksagiyam testnum 2:
42c8e949b3Sksagiyam
43c8e949b3Sksagiyam No one claims ownership of global index 1, but no one needs it.
44c8e949b3Sksagiyam
45c8e949b3Sksagiyam rank : 0 1 2
46c8e949b3Sksagiyam numRootIndices : 2 1 1
47c8e949b3Sksagiyam rootIndices : [0 2] [3] [3]
48c8e949b3Sksagiyam rootLocalOffset : 100 200 300
49c8e949b3Sksagiyam layout : [0 1] [2] [3]
50c8e949b3Sksagiyam numLeafIndices : 1 1 2
51c8e949b3Sksagiyam leafIndices : [0] [2] [0 3]
52c8e949b3Sksagiyam leafLocalOffset : 400 500 600
53c8e949b3Sksagiyam
54c8e949b3Sksagiyam would build the following SF:
55c8e949b3Sksagiyam
56c8e949b3Sksagiyam [0] 400 <- (0,100)
57c8e949b3Sksagiyam [1] 500 <- (0,101)
58c8e949b3Sksagiyam [2] 600 <- (0,100)
59c8e949b3Sksagiyam [2] 601 <- (2,300)
60c8e949b3Sksagiyam
61c8e949b3Sksagiyam */
62c8e949b3Sksagiyam
main(int argc,char ** argv)63*d71ae5a4SJacob Faibussowitsch int main(int argc, char **argv)
64*d71ae5a4SJacob Faibussowitsch {
65c8e949b3Sksagiyam PetscSF sf;
66c8e949b3Sksagiyam PetscLayout layout;
67c8e949b3Sksagiyam PetscInt N, n;
68c8e949b3Sksagiyam PetscInt nA = -1, *A, offsetA = -1;
69c8e949b3Sksagiyam PetscInt nB = -1, *B, offsetB = -1;
70c8e949b3Sksagiyam PetscMPIInt size, rank;
71c8e949b3Sksagiyam PetscInt testnum;
72c8e949b3Sksagiyam
73327415f7SBarry Smith PetscFunctionBeginUser;
749566063dSJacob Faibussowitsch PetscCall(PetscInitialize(&argc, &argv, NULL, help));
759566063dSJacob Faibussowitsch PetscCall(PetscOptionsGetInt(NULL, NULL, "-testnum", &testnum, NULL));
769566063dSJacob Faibussowitsch PetscCallMPI(MPI_Comm_size(PETSC_COMM_WORLD, &size));
779566063dSJacob Faibussowitsch PetscCallMPI(MPI_Comm_rank(PETSC_COMM_WORLD, &rank));
7808401ef6SPierre Jolivet PetscCheck(size == 3, PETSC_COMM_WORLD, PETSC_ERR_WRONG_MPI_SIZE, "Must run with 3 MPI processes");
79c8e949b3Sksagiyam
80c8e949b3Sksagiyam switch (testnum) {
81c8e949b3Sksagiyam case 0:
82c8e949b3Sksagiyam N = 4;
83c8e949b3Sksagiyam n = PETSC_DECIDE;
84c8e949b3Sksagiyam switch (rank) {
859371c9d4SSatish Balay case 0:
869371c9d4SSatish Balay nA = 3;
879371c9d4SSatish Balay offsetA = 100;
889371c9d4SSatish Balay nB = 1;
899371c9d4SSatish Balay offsetB = 400;
909371c9d4SSatish Balay break;
919371c9d4SSatish Balay case 1:
929371c9d4SSatish Balay nA = 1;
939371c9d4SSatish Balay offsetA = 200;
949371c9d4SSatish Balay nB = 1;
959371c9d4SSatish Balay offsetB = 500;
969371c9d4SSatish Balay break;
979371c9d4SSatish Balay case 2:
989371c9d4SSatish Balay nA = 1;
999371c9d4SSatish Balay offsetA = 300;
1009371c9d4SSatish Balay nB = 2;
1019371c9d4SSatish Balay offsetB = 600;
1029371c9d4SSatish Balay break;
103*d71ae5a4SJacob Faibussowitsch default:
104*d71ae5a4SJacob Faibussowitsch SETERRQ(PETSC_COMM_WORLD, PETSC_ERR_WRONG_MPI_SIZE, "Must run with 3 MPI processes");
105c8e949b3Sksagiyam }
1069566063dSJacob Faibussowitsch PetscCall(PetscMalloc1(nA, &A));
1079566063dSJacob Faibussowitsch PetscCall(PetscMalloc1(nB, &B));
108c8e949b3Sksagiyam switch (rank) {
109c8e949b3Sksagiyam case 0:
1109371c9d4SSatish Balay A[0] = 1;
1119371c9d4SSatish Balay A[1] = 0;
1129371c9d4SSatish Balay A[2] = 2;
113c8e949b3Sksagiyam B[0] = 0;
114c8e949b3Sksagiyam break;
115c8e949b3Sksagiyam case 1:
116c8e949b3Sksagiyam A[0] = 3;
117c8e949b3Sksagiyam B[0] = 2;
118c8e949b3Sksagiyam break;
119c8e949b3Sksagiyam case 2:
120c8e949b3Sksagiyam A[0] = 3;
1219371c9d4SSatish Balay B[0] = 0;
1229371c9d4SSatish Balay B[1] = 3;
123c8e949b3Sksagiyam break;
124*d71ae5a4SJacob Faibussowitsch default:
125*d71ae5a4SJacob Faibussowitsch SETERRQ(PETSC_COMM_WORLD, PETSC_ERR_WRONG_MPI_SIZE, "Must run with 3 MPI processes");
126c8e949b3Sksagiyam }
127c8e949b3Sksagiyam break;
128c8e949b3Sksagiyam case 1:
129c8e949b3Sksagiyam N = 4;
130c8e949b3Sksagiyam n = PETSC_DECIDE;
131c8e949b3Sksagiyam switch (rank) {
1329371c9d4SSatish Balay case 0:
1339371c9d4SSatish Balay nA = 3;
1349371c9d4SSatish Balay offsetA = 100;
1359371c9d4SSatish Balay break;
1369371c9d4SSatish Balay case 1:
1379371c9d4SSatish Balay nA = 1;
1389371c9d4SSatish Balay offsetA = 200;
1399371c9d4SSatish Balay break;
1409371c9d4SSatish Balay case 2:
1419371c9d4SSatish Balay nA = 1;
1429371c9d4SSatish Balay offsetA = 300;
1439371c9d4SSatish Balay break;
144*d71ae5a4SJacob Faibussowitsch default:
145*d71ae5a4SJacob Faibussowitsch SETERRQ(PETSC_COMM_WORLD, PETSC_ERR_WRONG_MPI_SIZE, "Must run with 3 MPI processes");
146c8e949b3Sksagiyam }
1479566063dSJacob Faibussowitsch PetscCall(PetscMalloc1(nA, &A));
148c8e949b3Sksagiyam switch (rank) {
149c8e949b3Sksagiyam case 0:
1509371c9d4SSatish Balay A[0] = 1;
1519371c9d4SSatish Balay A[1] = 0;
1529371c9d4SSatish Balay A[2] = 2;
153c8e949b3Sksagiyam break;
154*d71ae5a4SJacob Faibussowitsch case 1:
155*d71ae5a4SJacob Faibussowitsch A[0] = 3;
156*d71ae5a4SJacob Faibussowitsch break;
157*d71ae5a4SJacob Faibussowitsch case 2:
158*d71ae5a4SJacob Faibussowitsch A[0] = 3;
159*d71ae5a4SJacob Faibussowitsch break;
160*d71ae5a4SJacob Faibussowitsch default:
161*d71ae5a4SJacob Faibussowitsch SETERRQ(PETSC_COMM_WORLD, PETSC_ERR_WRONG_MPI_SIZE, "Must run with 3 MPI processes");
162c8e949b3Sksagiyam }
163c8e949b3Sksagiyam nB = nA;
164c8e949b3Sksagiyam B = A;
165c8e949b3Sksagiyam offsetB = offsetA;
166c8e949b3Sksagiyam break;
167c8e949b3Sksagiyam case 2:
168c8e949b3Sksagiyam N = 4;
169c8e949b3Sksagiyam n = PETSC_DECIDE;
170c8e949b3Sksagiyam switch (rank) {
1719371c9d4SSatish Balay case 0:
1729371c9d4SSatish Balay nA = 2;
1739371c9d4SSatish Balay offsetA = 100;
1749371c9d4SSatish Balay nB = 1;
1759371c9d4SSatish Balay offsetB = 400;
1769371c9d4SSatish Balay break;
1779371c9d4SSatish Balay case 1:
1789371c9d4SSatish Balay nA = 1;
1799371c9d4SSatish Balay offsetA = 200;
1809371c9d4SSatish Balay nB = 1;
1819371c9d4SSatish Balay offsetB = 500;
1829371c9d4SSatish Balay break;
1839371c9d4SSatish Balay case 2:
1849371c9d4SSatish Balay nA = 1;
1859371c9d4SSatish Balay offsetA = 300;
1869371c9d4SSatish Balay nB = 2;
1879371c9d4SSatish Balay offsetB = 600;
1889371c9d4SSatish Balay break;
189*d71ae5a4SJacob Faibussowitsch default:
190*d71ae5a4SJacob Faibussowitsch SETERRQ(PETSC_COMM_WORLD, PETSC_ERR_WRONG_MPI_SIZE, "Must run with 3 MPI processes");
191c8e949b3Sksagiyam }
1929566063dSJacob Faibussowitsch PetscCall(PetscMalloc1(nA, &A));
1939566063dSJacob Faibussowitsch PetscCall(PetscMalloc1(nB, &B));
194c8e949b3Sksagiyam switch (rank) {
195c8e949b3Sksagiyam case 0:
1969371c9d4SSatish Balay A[0] = 0;
1979371c9d4SSatish Balay A[1] = 2;
198c8e949b3Sksagiyam B[0] = 0;
199c8e949b3Sksagiyam break;
200c8e949b3Sksagiyam case 1:
201c8e949b3Sksagiyam A[0] = 3;
202c8e949b3Sksagiyam B[0] = 2;
203c8e949b3Sksagiyam break;
204c8e949b3Sksagiyam case 2:
205c8e949b3Sksagiyam A[0] = 3;
2069371c9d4SSatish Balay B[0] = 0;
2079371c9d4SSatish Balay B[1] = 3;
208c8e949b3Sksagiyam break;
209*d71ae5a4SJacob Faibussowitsch default:
210*d71ae5a4SJacob Faibussowitsch SETERRQ(PETSC_COMM_WORLD, PETSC_ERR_WRONG_MPI_SIZE, "Must run with 3 MPI processes");
211c8e949b3Sksagiyam }
212c8e949b3Sksagiyam break;
213c8e949b3Sksagiyam }
2149566063dSJacob Faibussowitsch PetscCall(PetscLayoutCreate(PETSC_COMM_WORLD, &layout));
2159566063dSJacob Faibussowitsch PetscCall(PetscLayoutSetSize(layout, N));
2169566063dSJacob Faibussowitsch PetscCall(PetscLayoutSetLocalSize(layout, n));
2179566063dSJacob Faibussowitsch PetscCall(PetscLayoutSetBlockSize(layout, 1));
2189566063dSJacob Faibussowitsch PetscCall(PetscSFCreateByMatchingIndices(layout, nA, A, NULL, offsetA, nB, B, NULL, offsetB, NULL, &sf));
2199566063dSJacob Faibussowitsch PetscCall(PetscLayoutDestroy(&layout));
2209566063dSJacob Faibussowitsch PetscCall(PetscFree(A));
2219566063dSJacob Faibussowitsch if (testnum != 1) PetscCall(PetscFree(B));
2229566063dSJacob Faibussowitsch PetscCall(PetscObjectSetName((PetscObject)sf, "sf"));
2239566063dSJacob Faibussowitsch PetscCall(PetscSFView(sf, NULL));
2249566063dSJacob Faibussowitsch PetscCall(PetscSFDestroy(&sf));
225c8e949b3Sksagiyam
2269566063dSJacob Faibussowitsch PetscCall(PetscFinalize());
227b122ec5aSJacob Faibussowitsch return 0;
228c8e949b3Sksagiyam }
229c8e949b3Sksagiyam
230c8e949b3Sksagiyam /*TEST
231c8e949b3Sksagiyam
232c8e949b3Sksagiyam test:
233c8e949b3Sksagiyam suffix: 0
234c8e949b3Sksagiyam nsize: 3
235c8e949b3Sksagiyam args: -testnum 0
236c8e949b3Sksagiyam
237c8e949b3Sksagiyam test:
238c8e949b3Sksagiyam suffix: 1
239c8e949b3Sksagiyam nsize: 3
240c8e949b3Sksagiyam args: -testnum 1
241c8e949b3Sksagiyam
242c8e949b3Sksagiyam test:
243c8e949b3Sksagiyam suffix: 2
244c8e949b3Sksagiyam nsize: 3
245c8e949b3Sksagiyam args: -testnum 2
246c8e949b3Sksagiyam
247c8e949b3Sksagiyam TEST*/
248