xref: /petsc/src/vec/is/sf/tests/ex16.c (revision 061e922f3926be00487707c73b78dd3d40309129)
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