xref: /petsc/src/vec/is/sf/tests/ex16.c (revision 2c71b3e237ead271e4f3aa1505f92bf476e3413d)
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 
63c8e949b3Sksagiyam int main(int argc, char **argv)
64c8e949b3Sksagiyam {
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   PetscErrorCode  ierr;
73c8e949b3Sksagiyam 
74c8e949b3Sksagiyam   ierr = PetscInitialize(&argc,&argv,NULL,help);if (ierr) return ierr;
75c8e949b3Sksagiyam   ierr = PetscOptionsGetInt(NULL,NULL, "-testnum", &testnum, NULL);CHKERRQ(ierr);
76c8e949b3Sksagiyam   ierr = MPI_Comm_size(PETSC_COMM_WORLD,&size);CHKERRMPI(ierr);
77c8e949b3Sksagiyam   ierr = MPI_Comm_rank(PETSC_COMM_WORLD,&rank);CHKERRMPI(ierr);
78*2c71b3e2SJacob Faibussowitsch   PetscCheckFalse(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) {
85c8e949b3Sksagiyam     case 0: nA = 3; offsetA = 100; nB = 1; offsetB = 400; break;
86c8e949b3Sksagiyam     case 1: nA = 1; offsetA = 200; nB = 1; offsetB = 500; break;
87c8e949b3Sksagiyam     case 2: nA = 1; offsetA = 300; nB = 2; offsetB = 600; break;
88c8e949b3Sksagiyam     default: SETERRQ(PETSC_COMM_WORLD,PETSC_ERR_WRONG_MPI_SIZE,"Must run with 3 MPI processes");
89c8e949b3Sksagiyam     }
90c8e949b3Sksagiyam     ierr = PetscMalloc1(nA, &A);CHKERRQ(ierr);
91c8e949b3Sksagiyam     ierr = PetscMalloc1(nB, &B);CHKERRQ(ierr);
92c8e949b3Sksagiyam     switch (rank) {
93c8e949b3Sksagiyam     case 0:
94c8e949b3Sksagiyam       A[0] = 1; A[1] = 0; A[2] = 2;
95c8e949b3Sksagiyam       B[0] = 0;
96c8e949b3Sksagiyam       break;
97c8e949b3Sksagiyam     case 1:
98c8e949b3Sksagiyam       A[0] = 3;
99c8e949b3Sksagiyam       B[0] = 2;
100c8e949b3Sksagiyam       break;
101c8e949b3Sksagiyam     case 2:
102c8e949b3Sksagiyam       A[0] = 3;
103c8e949b3Sksagiyam       B[0] = 0; B[1] = 3;
104c8e949b3Sksagiyam       break;
105c8e949b3Sksagiyam     default: SETERRQ(PETSC_COMM_WORLD,PETSC_ERR_WRONG_MPI_SIZE,"Must run with 3 MPI processes");
106c8e949b3Sksagiyam     }
107c8e949b3Sksagiyam     break;
108c8e949b3Sksagiyam   case 1:
109c8e949b3Sksagiyam     N = 4;
110c8e949b3Sksagiyam     n = PETSC_DECIDE;
111c8e949b3Sksagiyam     switch (rank) {
112c8e949b3Sksagiyam     case 0: nA = 3; offsetA = 100; break;
113c8e949b3Sksagiyam     case 1: nA = 1; offsetA = 200; break;
114c8e949b3Sksagiyam     case 2: nA = 1; offsetA = 300; break;
115c8e949b3Sksagiyam     default: SETERRQ(PETSC_COMM_WORLD,PETSC_ERR_WRONG_MPI_SIZE,"Must run with 3 MPI processes");
116c8e949b3Sksagiyam     }
117c8e949b3Sksagiyam     ierr = PetscMalloc1(nA, &A);CHKERRQ(ierr);
118c8e949b3Sksagiyam     switch (rank) {
119c8e949b3Sksagiyam     case 0:
120c8e949b3Sksagiyam       A[0] = 1; A[1] = 0; A[2] = 2;
121c8e949b3Sksagiyam       break;
122c8e949b3Sksagiyam     case 1:
123c8e949b3Sksagiyam       A[0] = 3;
124c8e949b3Sksagiyam       break;
125c8e949b3Sksagiyam     case 2:
126c8e949b3Sksagiyam       A[0] = 3;
127c8e949b3Sksagiyam       break;
128c8e949b3Sksagiyam     default: SETERRQ(PETSC_COMM_WORLD,PETSC_ERR_WRONG_MPI_SIZE,"Must run with 3 MPI processes");
129c8e949b3Sksagiyam     }
130c8e949b3Sksagiyam     nB = nA;
131c8e949b3Sksagiyam     B = A;
132c8e949b3Sksagiyam     offsetB = offsetA;
133c8e949b3Sksagiyam     break;
134c8e949b3Sksagiyam   case 2:
135c8e949b3Sksagiyam     N = 4;
136c8e949b3Sksagiyam     n = PETSC_DECIDE;
137c8e949b3Sksagiyam     switch (rank) {
138c8e949b3Sksagiyam     case 0: nA = 2; offsetA = 100; nB = 1; offsetB = 400; break;
139c8e949b3Sksagiyam     case 1: nA = 1; offsetA = 200; nB = 1; offsetB = 500; break;
140c8e949b3Sksagiyam     case 2: nA = 1; offsetA = 300; nB = 2; offsetB = 600; break;
141c8e949b3Sksagiyam     default: SETERRQ(PETSC_COMM_WORLD,PETSC_ERR_WRONG_MPI_SIZE,"Must run with 3 MPI processes");
142c8e949b3Sksagiyam     }
143c8e949b3Sksagiyam     ierr = PetscMalloc1(nA, &A);CHKERRQ(ierr);
144c8e949b3Sksagiyam     ierr = PetscMalloc1(nB, &B);CHKERRQ(ierr);
145c8e949b3Sksagiyam     switch (rank) {
146c8e949b3Sksagiyam     case 0:
147c8e949b3Sksagiyam       A[0] = 0; A[1] = 2;
148c8e949b3Sksagiyam       B[0] = 0;
149c8e949b3Sksagiyam       break;
150c8e949b3Sksagiyam     case 1:
151c8e949b3Sksagiyam       A[0] = 3;
152c8e949b3Sksagiyam       B[0] = 2;
153c8e949b3Sksagiyam       break;
154c8e949b3Sksagiyam     case 2:
155c8e949b3Sksagiyam       A[0] = 3;
156c8e949b3Sksagiyam       B[0] = 0; B[1] = 3;
157c8e949b3Sksagiyam       break;
158c8e949b3Sksagiyam     default: SETERRQ(PETSC_COMM_WORLD,PETSC_ERR_WRONG_MPI_SIZE,"Must run with 3 MPI processes");
159c8e949b3Sksagiyam     }
160c8e949b3Sksagiyam     break;
161c8e949b3Sksagiyam   }
162c8e949b3Sksagiyam   ierr = PetscLayoutCreate(PETSC_COMM_WORLD, &layout);CHKERRQ(ierr);
163c8e949b3Sksagiyam   ierr = PetscLayoutSetSize(layout, N);CHKERRQ(ierr);
164c8e949b3Sksagiyam   ierr = PetscLayoutSetLocalSize(layout, n);CHKERRQ(ierr);
165c8e949b3Sksagiyam   ierr = PetscLayoutSetBlockSize(layout, 1);CHKERRQ(ierr);
166c8e949b3Sksagiyam   ierr = PetscSFCreateByMatchingIndices(layout, nA, A, NULL, offsetA, nB, B, NULL, offsetB, NULL, &sf);CHKERRQ(ierr);
167c8e949b3Sksagiyam   ierr = PetscLayoutDestroy(&layout);CHKERRQ(ierr);
168c8e949b3Sksagiyam   ierr = PetscFree(A);CHKERRQ(ierr);
169c8e949b3Sksagiyam   if (testnum != 1) {ierr = PetscFree(B);CHKERRQ(ierr);}
170c8e949b3Sksagiyam   ierr = PetscObjectSetName((PetscObject)sf, "sf");CHKERRQ(ierr);
171c8e949b3Sksagiyam   ierr = PetscSFView(sf, NULL);CHKERRQ(ierr);
172c8e949b3Sksagiyam   ierr = PetscSFDestroy(&sf);CHKERRQ(ierr);
173c8e949b3Sksagiyam 
174c8e949b3Sksagiyam   ierr = PetscFinalize();
175c8e949b3Sksagiyam   return ierr;
176c8e949b3Sksagiyam }
177c8e949b3Sksagiyam 
178c8e949b3Sksagiyam /*TEST
179c8e949b3Sksagiyam 
180c8e949b3Sksagiyam   test:
181c8e949b3Sksagiyam     suffix: 0
182c8e949b3Sksagiyam     nsize: 3
183c8e949b3Sksagiyam     args: -testnum 0
184c8e949b3Sksagiyam 
185c8e949b3Sksagiyam   test:
186c8e949b3Sksagiyam     suffix: 1
187c8e949b3Sksagiyam     nsize: 3
188c8e949b3Sksagiyam     args: -testnum 1
189c8e949b3Sksagiyam 
190c8e949b3Sksagiyam   test:
191c8e949b3Sksagiyam     suffix: 2
192c8e949b3Sksagiyam     nsize: 3
193c8e949b3Sksagiyam     args: -testnum 2
194c8e949b3Sksagiyam 
195c8e949b3Sksagiyam TEST*/
196