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