xref: /petsc/src/vec/is/sf/tests/ex16.c (revision 9371c9d470a9602b6d10a8bf50c9b2280a79e45a)
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 
63*9371c9d4SSatish Balay int main(int argc, char **argv) {
64c8e949b3Sksagiyam   PetscSF     sf;
65c8e949b3Sksagiyam   PetscLayout layout;
66c8e949b3Sksagiyam   PetscInt    N, n;
67c8e949b3Sksagiyam   PetscInt    nA = -1, *A, offsetA = -1;
68c8e949b3Sksagiyam   PetscInt    nB = -1, *B, offsetB = -1;
69c8e949b3Sksagiyam   PetscMPIInt size, rank;
70c8e949b3Sksagiyam   PetscInt    testnum;
71c8e949b3Sksagiyam 
72327415f7SBarry Smith   PetscFunctionBeginUser;
739566063dSJacob Faibussowitsch   PetscCall(PetscInitialize(&argc, &argv, NULL, help));
749566063dSJacob Faibussowitsch   PetscCall(PetscOptionsGetInt(NULL, NULL, "-testnum", &testnum, NULL));
759566063dSJacob Faibussowitsch   PetscCallMPI(MPI_Comm_size(PETSC_COMM_WORLD, &size));
769566063dSJacob Faibussowitsch   PetscCallMPI(MPI_Comm_rank(PETSC_COMM_WORLD, &rank));
7708401ef6SPierre Jolivet   PetscCheck(size == 3, PETSC_COMM_WORLD, PETSC_ERR_WRONG_MPI_SIZE, "Must run with 3 MPI processes");
78c8e949b3Sksagiyam 
79c8e949b3Sksagiyam   switch (testnum) {
80c8e949b3Sksagiyam   case 0:
81c8e949b3Sksagiyam     N = 4;
82c8e949b3Sksagiyam     n = PETSC_DECIDE;
83c8e949b3Sksagiyam     switch (rank) {
84*9371c9d4SSatish Balay     case 0:
85*9371c9d4SSatish Balay       nA      = 3;
86*9371c9d4SSatish Balay       offsetA = 100;
87*9371c9d4SSatish Balay       nB      = 1;
88*9371c9d4SSatish Balay       offsetB = 400;
89*9371c9d4SSatish Balay       break;
90*9371c9d4SSatish Balay     case 1:
91*9371c9d4SSatish Balay       nA      = 1;
92*9371c9d4SSatish Balay       offsetA = 200;
93*9371c9d4SSatish Balay       nB      = 1;
94*9371c9d4SSatish Balay       offsetB = 500;
95*9371c9d4SSatish Balay       break;
96*9371c9d4SSatish Balay     case 2:
97*9371c9d4SSatish Balay       nA      = 1;
98*9371c9d4SSatish Balay       offsetA = 300;
99*9371c9d4SSatish Balay       nB      = 2;
100*9371c9d4SSatish Balay       offsetB = 600;
101*9371c9d4SSatish Balay       break;
102c8e949b3Sksagiyam     default: SETERRQ(PETSC_COMM_WORLD, PETSC_ERR_WRONG_MPI_SIZE, "Must run with 3 MPI processes");
103c8e949b3Sksagiyam     }
1049566063dSJacob Faibussowitsch     PetscCall(PetscMalloc1(nA, &A));
1059566063dSJacob Faibussowitsch     PetscCall(PetscMalloc1(nB, &B));
106c8e949b3Sksagiyam     switch (rank) {
107c8e949b3Sksagiyam     case 0:
108*9371c9d4SSatish Balay       A[0] = 1;
109*9371c9d4SSatish Balay       A[1] = 0;
110*9371c9d4SSatish Balay       A[2] = 2;
111c8e949b3Sksagiyam       B[0] = 0;
112c8e949b3Sksagiyam       break;
113c8e949b3Sksagiyam     case 1:
114c8e949b3Sksagiyam       A[0] = 3;
115c8e949b3Sksagiyam       B[0] = 2;
116c8e949b3Sksagiyam       break;
117c8e949b3Sksagiyam     case 2:
118c8e949b3Sksagiyam       A[0] = 3;
119*9371c9d4SSatish Balay       B[0] = 0;
120*9371c9d4SSatish Balay       B[1] = 3;
121c8e949b3Sksagiyam       break;
122c8e949b3Sksagiyam     default: SETERRQ(PETSC_COMM_WORLD, PETSC_ERR_WRONG_MPI_SIZE, "Must run with 3 MPI processes");
123c8e949b3Sksagiyam     }
124c8e949b3Sksagiyam     break;
125c8e949b3Sksagiyam   case 1:
126c8e949b3Sksagiyam     N = 4;
127c8e949b3Sksagiyam     n = PETSC_DECIDE;
128c8e949b3Sksagiyam     switch (rank) {
129*9371c9d4SSatish Balay     case 0:
130*9371c9d4SSatish Balay       nA      = 3;
131*9371c9d4SSatish Balay       offsetA = 100;
132*9371c9d4SSatish Balay       break;
133*9371c9d4SSatish Balay     case 1:
134*9371c9d4SSatish Balay       nA      = 1;
135*9371c9d4SSatish Balay       offsetA = 200;
136*9371c9d4SSatish Balay       break;
137*9371c9d4SSatish Balay     case 2:
138*9371c9d4SSatish Balay       nA      = 1;
139*9371c9d4SSatish Balay       offsetA = 300;
140*9371c9d4SSatish Balay       break;
141c8e949b3Sksagiyam     default: SETERRQ(PETSC_COMM_WORLD, PETSC_ERR_WRONG_MPI_SIZE, "Must run with 3 MPI processes");
142c8e949b3Sksagiyam     }
1439566063dSJacob Faibussowitsch     PetscCall(PetscMalloc1(nA, &A));
144c8e949b3Sksagiyam     switch (rank) {
145c8e949b3Sksagiyam     case 0:
146*9371c9d4SSatish Balay       A[0] = 1;
147*9371c9d4SSatish Balay       A[1] = 0;
148*9371c9d4SSatish Balay       A[2] = 2;
149c8e949b3Sksagiyam       break;
150*9371c9d4SSatish Balay     case 1: A[0] = 3; break;
151*9371c9d4SSatish Balay     case 2: A[0] = 3; break;
152c8e949b3Sksagiyam     default: SETERRQ(PETSC_COMM_WORLD, PETSC_ERR_WRONG_MPI_SIZE, "Must run with 3 MPI processes");
153c8e949b3Sksagiyam     }
154c8e949b3Sksagiyam     nB      = nA;
155c8e949b3Sksagiyam     B       = A;
156c8e949b3Sksagiyam     offsetB = offsetA;
157c8e949b3Sksagiyam     break;
158c8e949b3Sksagiyam   case 2:
159c8e949b3Sksagiyam     N = 4;
160c8e949b3Sksagiyam     n = PETSC_DECIDE;
161c8e949b3Sksagiyam     switch (rank) {
162*9371c9d4SSatish Balay     case 0:
163*9371c9d4SSatish Balay       nA      = 2;
164*9371c9d4SSatish Balay       offsetA = 100;
165*9371c9d4SSatish Balay       nB      = 1;
166*9371c9d4SSatish Balay       offsetB = 400;
167*9371c9d4SSatish Balay       break;
168*9371c9d4SSatish Balay     case 1:
169*9371c9d4SSatish Balay       nA      = 1;
170*9371c9d4SSatish Balay       offsetA = 200;
171*9371c9d4SSatish Balay       nB      = 1;
172*9371c9d4SSatish Balay       offsetB = 500;
173*9371c9d4SSatish Balay       break;
174*9371c9d4SSatish Balay     case 2:
175*9371c9d4SSatish Balay       nA      = 1;
176*9371c9d4SSatish Balay       offsetA = 300;
177*9371c9d4SSatish Balay       nB      = 2;
178*9371c9d4SSatish Balay       offsetB = 600;
179*9371c9d4SSatish Balay       break;
180c8e949b3Sksagiyam     default: SETERRQ(PETSC_COMM_WORLD, PETSC_ERR_WRONG_MPI_SIZE, "Must run with 3 MPI processes");
181c8e949b3Sksagiyam     }
1829566063dSJacob Faibussowitsch     PetscCall(PetscMalloc1(nA, &A));
1839566063dSJacob Faibussowitsch     PetscCall(PetscMalloc1(nB, &B));
184c8e949b3Sksagiyam     switch (rank) {
185c8e949b3Sksagiyam     case 0:
186*9371c9d4SSatish Balay       A[0] = 0;
187*9371c9d4SSatish Balay       A[1] = 2;
188c8e949b3Sksagiyam       B[0] = 0;
189c8e949b3Sksagiyam       break;
190c8e949b3Sksagiyam     case 1:
191c8e949b3Sksagiyam       A[0] = 3;
192c8e949b3Sksagiyam       B[0] = 2;
193c8e949b3Sksagiyam       break;
194c8e949b3Sksagiyam     case 2:
195c8e949b3Sksagiyam       A[0] = 3;
196*9371c9d4SSatish Balay       B[0] = 0;
197*9371c9d4SSatish Balay       B[1] = 3;
198c8e949b3Sksagiyam       break;
199c8e949b3Sksagiyam     default: SETERRQ(PETSC_COMM_WORLD, PETSC_ERR_WRONG_MPI_SIZE, "Must run with 3 MPI processes");
200c8e949b3Sksagiyam     }
201c8e949b3Sksagiyam     break;
202c8e949b3Sksagiyam   }
2039566063dSJacob Faibussowitsch   PetscCall(PetscLayoutCreate(PETSC_COMM_WORLD, &layout));
2049566063dSJacob Faibussowitsch   PetscCall(PetscLayoutSetSize(layout, N));
2059566063dSJacob Faibussowitsch   PetscCall(PetscLayoutSetLocalSize(layout, n));
2069566063dSJacob Faibussowitsch   PetscCall(PetscLayoutSetBlockSize(layout, 1));
2079566063dSJacob Faibussowitsch   PetscCall(PetscSFCreateByMatchingIndices(layout, nA, A, NULL, offsetA, nB, B, NULL, offsetB, NULL, &sf));
2089566063dSJacob Faibussowitsch   PetscCall(PetscLayoutDestroy(&layout));
2099566063dSJacob Faibussowitsch   PetscCall(PetscFree(A));
2109566063dSJacob Faibussowitsch   if (testnum != 1) PetscCall(PetscFree(B));
2119566063dSJacob Faibussowitsch   PetscCall(PetscObjectSetName((PetscObject)sf, "sf"));
2129566063dSJacob Faibussowitsch   PetscCall(PetscSFView(sf, NULL));
2139566063dSJacob Faibussowitsch   PetscCall(PetscSFDestroy(&sf));
214c8e949b3Sksagiyam 
2159566063dSJacob Faibussowitsch   PetscCall(PetscFinalize());
216b122ec5aSJacob Faibussowitsch   return 0;
217c8e949b3Sksagiyam }
218c8e949b3Sksagiyam 
219c8e949b3Sksagiyam /*TEST
220c8e949b3Sksagiyam 
221c8e949b3Sksagiyam   test:
222c8e949b3Sksagiyam     suffix: 0
223c8e949b3Sksagiyam     nsize: 3
224c8e949b3Sksagiyam     args: -testnum 0
225c8e949b3Sksagiyam 
226c8e949b3Sksagiyam   test:
227c8e949b3Sksagiyam     suffix: 1
228c8e949b3Sksagiyam     nsize: 3
229c8e949b3Sksagiyam     args: -testnum 1
230c8e949b3Sksagiyam 
231c8e949b3Sksagiyam   test:
232c8e949b3Sksagiyam     suffix: 2
233c8e949b3Sksagiyam     nsize: 3
234c8e949b3Sksagiyam     args: -testnum 2
235c8e949b3Sksagiyam 
236c8e949b3Sksagiyam TEST*/
237