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