xref: /petsc/src/dm/impls/plex/tests/ex69.c (revision 6fc0535533fbdadc2fba264c7ee1d07aae61dd04)
1*6fc05355SMatthew G. Knepley static char help[] = "Tests for creation of cohesive meshes by transforms\n\n";
2*6fc05355SMatthew G. Knepley 
3*6fc05355SMatthew G. Knepley #include <petscdmplex.h>
4*6fc05355SMatthew G. Knepley #include <petscsf.h>
5*6fc05355SMatthew G. Knepley 
6*6fc05355SMatthew G. Knepley #include <petsc/private/dmpleximpl.h>
7*6fc05355SMatthew G. Knepley 
8*6fc05355SMatthew G. Knepley PETSC_EXTERN char tri_2_cv[];
9*6fc05355SMatthew G. Knepley char              tri_2_cv[] = "\
10*6fc05355SMatthew G. Knepley 2 4 6 3 1\n\
11*6fc05355SMatthew G. Knepley 0 2 1\n\
12*6fc05355SMatthew G. Knepley 1 2 3\n\
13*6fc05355SMatthew G. Knepley 4 1 5\n\
14*6fc05355SMatthew G. Knepley 4 0 1\n\
15*6fc05355SMatthew G. Knepley -1.0  0.0 0.0  1\n\
16*6fc05355SMatthew G. Knepley  0.0  1.0 0.0 -1\n\
17*6fc05355SMatthew G. Knepley  0.0 -1.0 0.0  1\n\
18*6fc05355SMatthew G. Knepley  1.0  0.0 0.0 -1\n\
19*6fc05355SMatthew G. Knepley -2.0  1.0 0.0  1\n\
20*6fc05355SMatthew G. Knepley -1.0  2.0 0.0 -1";
21*6fc05355SMatthew G. Knepley 
22*6fc05355SMatthew G. Knepley /* List of test meshes
23*6fc05355SMatthew G. Knepley 
24*6fc05355SMatthew G. Knepley Test tri_0: triangle
25*6fc05355SMatthew G. Knepley 
26*6fc05355SMatthew G. Knepley  4-10--5      8-16--7-14--4
27*6fc05355SMatthew G. Knepley  |\  1 |      |\     \  1 |
28*6fc05355SMatthew G. Knepley  | \   |      | \     \   |
29*6fc05355SMatthew G. Knepley  6  8  9  ->  9 12  2  11 13
30*6fc05355SMatthew G. Knepley  |   \ |      |   \     \ |
31*6fc05355SMatthew G. Knepley  | 0  \|      | 0  \     \|
32*6fc05355SMatthew G. Knepley  2--7--3      3-10--6-15--5
33*6fc05355SMatthew G. Knepley 
34*6fc05355SMatthew G. Knepley Test tri_1: triangle, not tensor
35*6fc05355SMatthew G. Knepley 
36*6fc05355SMatthew G. Knepley  4-10--5      8-10--7-16--4
37*6fc05355SMatthew G. Knepley  |\  1 |      |\     \  1 |
38*6fc05355SMatthew G. Knepley  | \   |      | \     \   |
39*6fc05355SMatthew G. Knepley  6  8  9  -> 11 14  2  13 15
40*6fc05355SMatthew G. Knepley  |   \ |      |   \     \ |
41*6fc05355SMatthew G. Knepley  | 0  \|      | 0  \     \|
42*6fc05355SMatthew G. Knepley  2--7--3      3-12--6--9--5
43*6fc05355SMatthew G. Knepley 
44*6fc05355SMatthew G. Knepley Test tri_2: 4 triangles, non-oriented surface
45*6fc05355SMatthew G. Knepley 
46*6fc05355SMatthew G. Knepley            9
47*6fc05355SMatthew G. Knepley           / \
48*6fc05355SMatthew G. Knepley          /   \
49*6fc05355SMatthew G. Knepley        17  2  16
50*6fc05355SMatthew G. Knepley        /       \
51*6fc05355SMatthew G. Knepley       /         \
52*6fc05355SMatthew G. Knepley      8-----15----5
53*6fc05355SMatthew G. Knepley       \         /|\
54*6fc05355SMatthew G. Knepley        \       / | \
55*6fc05355SMatthew G. Knepley        18  3  12 |  14
56*6fc05355SMatthew G. Knepley          \   /   |   \
57*6fc05355SMatthew G. Knepley           \ /    |    \
58*6fc05355SMatthew G. Knepley            4  0 11  1  7
59*6fc05355SMatthew G. Knepley             \    |    /
60*6fc05355SMatthew G. Knepley              \   |   /
61*6fc05355SMatthew G. Knepley              10  |  13
62*6fc05355SMatthew G. Knepley                \ | /
63*6fc05355SMatthew G. Knepley                 \|/
64*6fc05355SMatthew G. Knepley                  6
65*6fc05355SMatthew G. Knepley   becomes
66*6fc05355SMatthew G. Knepley            8
67*6fc05355SMatthew G. Knepley           / \
68*6fc05355SMatthew G. Knepley          /   \
69*6fc05355SMatthew G. Knepley         /     \
70*6fc05355SMatthew G. Knepley       25   2   24
71*6fc05355SMatthew G. Knepley       /         \
72*6fc05355SMatthew G. Knepley      /           \
73*6fc05355SMatthew G. Knepley    13-----18------9
74*6fc05355SMatthew G. Knepley 28  |     5    26/ \
75*6fc05355SMatthew G. Knepley    14----19----10   \
76*6fc05355SMatthew G. Knepley      \         /|   |\
77*6fc05355SMatthew G. Knepley       \       / |   | \
78*6fc05355SMatthew G. Knepley       21  3  20 |   |  23
79*6fc05355SMatthew G. Knepley         \   /   |   |   \
80*6fc05355SMatthew G. Knepley          \ /    |   |    \
81*6fc05355SMatthew G. Knepley           6  0 17 4 16 1  7
82*6fc05355SMatthew G. Knepley            \    |   |    /
83*6fc05355SMatthew G. Knepley             \   |   |   /
84*6fc05355SMatthew G. Knepley             15  |   |  22
85*6fc05355SMatthew G. Knepley               \ |   | /
86*6fc05355SMatthew G. Knepley                \|   |/
87*6fc05355SMatthew G. Knepley                12---11
88*6fc05355SMatthew G. Knepley                  27
89*6fc05355SMatthew G. Knepley 
90*6fc05355SMatthew G. Knepley Test tri_3: tri_2, in parallel
91*6fc05355SMatthew G. Knepley 
92*6fc05355SMatthew G. Knepley            6
93*6fc05355SMatthew G. Knepley           / \
94*6fc05355SMatthew G. Knepley          /   \
95*6fc05355SMatthew G. Knepley         /     \
96*6fc05355SMatthew G. Knepley       12   1   11
97*6fc05355SMatthew G. Knepley       /         \
98*6fc05355SMatthew G. Knepley      /           \
99*6fc05355SMatthew G. Knepley     5-----10------2
100*6fc05355SMatthew G. Knepley                    \
101*6fc05355SMatthew G. Knepley     5-----9-----3   2
102*6fc05355SMatthew G. Knepley      \         /|   |\
103*6fc05355SMatthew G. Knepley       \       / |   | \
104*6fc05355SMatthew G. Knepley       10  1  8  |   |  9
105*6fc05355SMatthew G. Knepley         \   /   |   |   \
106*6fc05355SMatthew G. Knepley          \ /    |   |    \
107*6fc05355SMatthew G. Knepley           2  0  7   7  0  4
108*6fc05355SMatthew G. Knepley            \    |   |    /
109*6fc05355SMatthew G. Knepley             \   |   |   /
110*6fc05355SMatthew G. Knepley              6  |   |  8
111*6fc05355SMatthew G. Knepley               \ |   | /
112*6fc05355SMatthew G. Knepley                \|   |/
113*6fc05355SMatthew G. Knepley                 4   3
114*6fc05355SMatthew G. Knepley   becomes
115*6fc05355SMatthew G. Knepley                  11
116*6fc05355SMatthew G. Knepley                 / \
117*6fc05355SMatthew G. Knepley                /   \
118*6fc05355SMatthew G. Knepley               /     \
119*6fc05355SMatthew G. Knepley             19   1   18
120*6fc05355SMatthew G. Knepley             /         \
121*6fc05355SMatthew G. Knepley            /           \
122*6fc05355SMatthew G. Knepley           8-----14------4
123*6fc05355SMatthew G. Knepley         22 \     3       |
124*6fc05355SMatthew G. Knepley             9------15    |\
125*6fc05355SMatthew G. Knepley                     \    | \
126*6fc05355SMatthew G. Knepley     9------14-----5  \  20 |
127*6fc05355SMatthew G. Knepley   20\    3     18/ \  \/   |
128*6fc05355SMatthew G. Knepley    10----15-----6   |  5   |
129*6fc05355SMatthew G. Knepley      \         /|   |  |   |\
130*6fc05355SMatthew G. Knepley       \       / |   |  |   | \
131*6fc05355SMatthew G. Knepley       17  1 16  |   |  |   |  17
132*6fc05355SMatthew G. Knepley         \   /   | 2 |  | 2 |   \
133*6fc05355SMatthew G. Knepley          \ /    |   |  |   |    \
134*6fc05355SMatthew G. Knepley           4  0  13 12  13  12 0 10
135*6fc05355SMatthew G. Knepley            \    |   |  |   |    /
136*6fc05355SMatthew G. Knepley             \   |   |  |   |   /
137*6fc05355SMatthew G. Knepley             11  |   |  |   |  16
138*6fc05355SMatthew G. Knepley               \ |   |  |   | /
139*6fc05355SMatthew G. Knepley                \|   |  |   |/
140*6fc05355SMatthew G. Knepley                 8---7  7---6
141*6fc05355SMatthew G. Knepley                  19      21
142*6fc05355SMatthew G. Knepley 
143*6fc05355SMatthew G. Knepley Test quad_0: quadrilateral
144*6fc05355SMatthew G. Knepley 
145*6fc05355SMatthew G. Knepley  5-10--6-11--7       5-12-10-20--9-14--6
146*6fc05355SMatthew G. Knepley  |     |     |       |     |     |     |
147*6fc05355SMatthew G. Knepley 12  0 13  1  14 --> 15  0 18  2 17  1  16
148*6fc05355SMatthew G. Knepley  |     |     |       |     |     |     |
149*6fc05355SMatthew G. Knepley  2--8--3--9--4       3-11--8-19--7-13--4
150*6fc05355SMatthew G. Knepley 
151*6fc05355SMatthew G. Knepley Test quad_1: quadrilateral, not tensor
152*6fc05355SMatthew G. Knepley 
153*6fc05355SMatthew G. Knepley  5-10--6-11--7       5-14-10-12--9-16--6
154*6fc05355SMatthew G. Knepley  |     |     |       |     |     |     |
155*6fc05355SMatthew G. Knepley 12  0 13  1  14 --> 17  0 20  2 19  1  18
156*6fc05355SMatthew G. Knepley  |     |     |       |     |     |     |
157*6fc05355SMatthew G. Knepley  2--8--3--9--4       3-13--8-11--7-15--4
158*6fc05355SMatthew G. Knepley 
159*6fc05355SMatthew G. Knepley Test quad_2: quadrilateral, 2 processes
160*6fc05355SMatthew G. Knepley 
161*6fc05355SMatthew G. Knepley  3--6--4  3--6--4       3--9--7-14--6   5-14--4--9--7
162*6fc05355SMatthew G. Knepley  |     |  |     |       |     |     |   |     |     |
163*6fc05355SMatthew G. Knepley  7  0  8  7  0  8  --> 10  0 12  1 11  12  1 11  0  10
164*6fc05355SMatthew G. Knepley  |     |  |     |       |     |     |   |     |     |
165*6fc05355SMatthew G. Knepley  1--5--2  1--5--2       2--8--5-13--4   3-13--2--8--6
166*6fc05355SMatthew G. Knepley 
167*6fc05355SMatthew G. Knepley Test quad_3: quadrilateral, 4 processes, non-oriented surface
168*6fc05355SMatthew G. Knepley 
169*6fc05355SMatthew G. Knepley  3--6--4  3--6--4      3--9--7-14--6   5-14--4--9--7
170*6fc05355SMatthew G. Knepley  |     |  |     |      |     |     |   |     |     |
171*6fc05355SMatthew G. Knepley  7  0  8  7  0  8     10  0  12 1  11 12  1 11  0  10
172*6fc05355SMatthew G. Knepley  |     |  |     |      |     |     |   |     |     |
173*6fc05355SMatthew G. Knepley  1--5--2  1--5--2      2--8--5-13--4   3-13--2--8--6
174*6fc05355SMatthew G. Knepley                    -->
175*6fc05355SMatthew G. Knepley  3--6--4  3--6--4      3--9--7-14--6   5-14--4--9--7
176*6fc05355SMatthew G. Knepley  |     |  |     |      |     |     |   |     |     |
177*6fc05355SMatthew G. Knepley  7  0  8  7  0  8     10  0  12 1  11 12  1 11  0  10
178*6fc05355SMatthew G. Knepley  |     |  |     |      |     |     |   |     |     |
179*6fc05355SMatthew G. Knepley  1--5--2  1--5--2      2--8--5-13--4   3-13--2--8--6
180*6fc05355SMatthew G. Knepley 
181*6fc05355SMatthew G. Knepley Test quad_4: embedded fault
182*6fc05355SMatthew G. Knepley 
183*6fc05355SMatthew G. Knepley 14-24-15-25-16-26--17
184*6fc05355SMatthew G. Knepley  |     |     |     |
185*6fc05355SMatthew G. Knepley 28  3 30  4 32  5  34
186*6fc05355SMatthew G. Knepley  |     |     |     |
187*6fc05355SMatthew G. Knepley 10-21-11-22-12-23--13
188*6fc05355SMatthew G. Knepley  |     |     |     |
189*6fc05355SMatthew G. Knepley 27  0 29  1 31  2  33
190*6fc05355SMatthew G. Knepley  |     |     |     |
191*6fc05355SMatthew G. Knepley  6-18--7-19--8-20--9
192*6fc05355SMatthew G. Knepley 
193*6fc05355SMatthew G. Knepley becomes
194*6fc05355SMatthew G. Knepley 
195*6fc05355SMatthew G. Knepley  13-26-14-27-15-28--16
196*6fc05355SMatthew G. Knepley   |     |     |     |
197*6fc05355SMatthew G. Knepley  30  3 32  4 39  5  40
198*6fc05355SMatthew G. Knepley   |     |     |     |
199*6fc05355SMatthew G. Knepley  12-25-17-36-19-38--21
200*6fc05355SMatthew G. Knepley         |     |     |
201*6fc05355SMatthew G. Knepley        41  6 42  7  43
202*6fc05355SMatthew G. Knepley         |     |     |
203*6fc05355SMatthew G. Knepley  12-25-17-35-18-37--20
204*6fc05355SMatthew G. Knepley   |     |     |     |
205*6fc05355SMatthew G. Knepley  29  0 31  1 33  2  34
206*6fc05355SMatthew G. Knepley   |     |     |     |
207*6fc05355SMatthew G. Knepley   8-22--9-23-10-24--11
208*6fc05355SMatthew G. Knepley 
209*6fc05355SMatthew G. Knepley Test quad_5: two faults
210*6fc05355SMatthew G. Knepley 
211*6fc05355SMatthew G. Knepley 14-24-15-25-16-26--17
212*6fc05355SMatthew G. Knepley  |     |     |     |
213*6fc05355SMatthew G. Knepley 28  3 30  4 32  5  34
214*6fc05355SMatthew G. Knepley  |     |     |     |
215*6fc05355SMatthew G. Knepley 10-21-11-22-12-23--13
216*6fc05355SMatthew G. Knepley  |     |     |     |
217*6fc05355SMatthew G. Knepley 27  0 29  1 31  2  33
218*6fc05355SMatthew G. Knepley  |     |     |     |
219*6fc05355SMatthew G. Knepley  6-18--7-19--8-20--9
220*6fc05355SMatthew G. Knepley 
221*6fc05355SMatthew G. Knepley becomes
222*6fc05355SMatthew G. Knepley 
223*6fc05355SMatthew G. Knepley 12-26-13-27-14-28--15
224*6fc05355SMatthew G. Knepley  |     |     |     |
225*6fc05355SMatthew G. Knepley 37  4 31  3 33  5  40
226*6fc05355SMatthew G. Knepley  |     |     |     |
227*6fc05355SMatthew G. Knepley 17-36-18-25-19-39--21
228*6fc05355SMatthew G. Knepley  |     |     |     |
229*6fc05355SMatthew G. Knepley 43  6  44   41  7  42
230*6fc05355SMatthew G. Knepley  |     |     |     |
231*6fc05355SMatthew G. Knepley 16-35-18-25-19-38--20
232*6fc05355SMatthew G. Knepley  |     |     |     |
233*6fc05355SMatthew G. Knepley 29  0 30  1 32  2  34
234*6fc05355SMatthew G. Knepley  |     |     |     |
235*6fc05355SMatthew G. Knepley  8-22--9-23-10-24--11
236*6fc05355SMatthew G. Knepley 
237*6fc05355SMatthew G. Knepley Test quad_6: T-junction
238*6fc05355SMatthew G. Knepley 
239*6fc05355SMatthew G. Knepley 14-24-15-25-16-26--17
240*6fc05355SMatthew G. Knepley  |     |     |     |
241*6fc05355SMatthew G. Knepley 28  3 30  4 32  5  34
242*6fc05355SMatthew G. Knepley  |     |     |     |
243*6fc05355SMatthew G. Knepley 10-21-11-22-12-23--13
244*6fc05355SMatthew G. Knepley  |     |     |     |
245*6fc05355SMatthew G. Knepley 27  0 29  1 31  2  33
246*6fc05355SMatthew G. Knepley  |     |     |     |
247*6fc05355SMatthew G. Knepley  6-18--7-19--8-20--9
248*6fc05355SMatthew G. Knepley 
249*6fc05355SMatthew G. Knepley becomes
250*6fc05355SMatthew G. Knepley 
251*6fc05355SMatthew G. Knepley  13-26-14-27-15-28--16
252*6fc05355SMatthew G. Knepley   |     |     |     |
253*6fc05355SMatthew G. Knepley  30  3 32  4 39  5  40
254*6fc05355SMatthew G. Knepley   |     |     |     |
255*6fc05355SMatthew G. Knepley  12-25-17-36-19-38--21
256*6fc05355SMatthew G. Knepley         |     |     |
257*6fc05355SMatthew G. Knepley        41  6 42  7  43
258*6fc05355SMatthew G. Knepley         |     |     |
259*6fc05355SMatthew G. Knepley  12-25-17-35-18-37--20
260*6fc05355SMatthew G. Knepley   |     |     |     |
261*6fc05355SMatthew G. Knepley  29  0 31  1 33  2  34
262*6fc05355SMatthew G. Knepley   |     |     |     |
263*6fc05355SMatthew G. Knepley   8-22--9-23-10-24--11
264*6fc05355SMatthew G. Knepley 
265*6fc05355SMatthew G. Knepley becomes
266*6fc05355SMatthew G. Knepley 
267*6fc05355SMatthew G. Knepley  14-28-15-41-21-44--20-29-16
268*6fc05355SMatthew G. Knepley   |     |     |     |     |
269*6fc05355SMatthew G. Knepley  31  3 33  5 43  8 42  4  40
270*6fc05355SMatthew G. Knepley   |     |     |     |     |
271*6fc05355SMatthew G. Knepley  13-27-17-37-23-46--23-39-19
272*6fc05355SMatthew G. Knepley         |     |     |     |
273*6fc05355SMatthew G. Knepley        47  6 48    48  7  49
274*6fc05355SMatthew G. Knepley         |     |     |     |
275*6fc05355SMatthew G. Knepley  13-27-17-36-22-45--22-38-18
276*6fc05355SMatthew G. Knepley   |     |     |     |     |
277*6fc05355SMatthew G. Knepley  30  0 32  1 34    34  2  35
278*6fc05355SMatthew G. Knepley   |     |     |     |     |
279*6fc05355SMatthew G. Knepley   9-24-10-25-11-----11-26-12
280*6fc05355SMatthew G. Knepley 
281*6fc05355SMatthew G. Knepley List of future tests:
282*6fc05355SMatthew G. Knepley - Detect and error on intersecting faults
283*6fc05355SMatthew G. Knepley - 3D
284*6fc05355SMatthew G. Knepley */
285*6fc05355SMatthew G. Knepley 
286*6fc05355SMatthew G. Knepley typedef struct {
287*6fc05355SMatthew G. Knepley   PetscInt testNum; // The mesh to test
288*6fc05355SMatthew G. Knepley } AppCtx;
289*6fc05355SMatthew G. Knepley 
290*6fc05355SMatthew G. Knepley static PetscErrorCode ProcessOptions(MPI_Comm comm, AppCtx *options)
291*6fc05355SMatthew G. Knepley {
292*6fc05355SMatthew G. Knepley   PetscFunctionBegin;
293*6fc05355SMatthew G. Knepley   options->testNum = 0;
294*6fc05355SMatthew G. Knepley 
295*6fc05355SMatthew G. Knepley   PetscOptionsBegin(comm, "", "Cohesive Meshing Options", "DMPLEX");
296*6fc05355SMatthew G. Knepley   PetscCall(PetscOptionsBoundedInt("-test_num", "The particular mesh to test", "ex5.c", options->testNum, &options->testNum, NULL, 0));
297*6fc05355SMatthew G. Knepley   PetscOptionsEnd();
298*6fc05355SMatthew G. Knepley   PetscFunctionReturn(PETSC_SUCCESS);
299*6fc05355SMatthew G. Knepley }
300*6fc05355SMatthew G. Knepley 
301*6fc05355SMatthew G. Knepley static PetscErrorCode CreateQuadMesh1(MPI_Comm comm, AppCtx *user, DM *dm)
302*6fc05355SMatthew G. Knepley {
303*6fc05355SMatthew G. Knepley   const PetscInt faces[2] = {1, 1};
304*6fc05355SMatthew G. Knepley   PetscReal      lower[2], upper[2];
305*6fc05355SMatthew G. Knepley   DMLabel        label;
306*6fc05355SMatthew G. Knepley   PetscMPIInt    rank;
307*6fc05355SMatthew G. Knepley   void          *get_tmp;
308*6fc05355SMatthew G. Knepley   PetscInt64    *cidx;
309*6fc05355SMatthew G. Knepley   PetscMPIInt    flg;
310*6fc05355SMatthew G. Knepley 
311*6fc05355SMatthew G. Knepley   PetscFunctionBeginUser;
312*6fc05355SMatthew G. Knepley   PetscCallMPI(MPI_Comm_rank(comm, &rank));
313*6fc05355SMatthew G. Knepley   // Create serial mesh
314*6fc05355SMatthew G. Knepley   lower[0] = (PetscReal)(rank % 2);
315*6fc05355SMatthew G. Knepley   lower[1] = (PetscReal)(rank / 2);
316*6fc05355SMatthew G. Knepley   upper[0] = (PetscReal)(rank % 2) + 1.;
317*6fc05355SMatthew G. Knepley   upper[1] = (PetscReal)(rank / 2) + 1.;
318*6fc05355SMatthew G. Knepley   PetscCall(DMPlexCreateBoxMesh(PETSC_COMM_SELF, 2, PETSC_FALSE, faces, lower, upper, NULL, PETSC_TRUE, dm));
319*6fc05355SMatthew G. Knepley   PetscCall(PetscObjectSetName((PetscObject)*dm, "box"));
320*6fc05355SMatthew G. Knepley   // Flip edges to make fault non-oriented
321*6fc05355SMatthew G. Knepley   switch (rank) {
322*6fc05355SMatthew G. Knepley   case 2:
323*6fc05355SMatthew G. Knepley     PetscCall(DMPlexOrientPoint(*dm, 8, -1));
324*6fc05355SMatthew G. Knepley     break;
325*6fc05355SMatthew G. Knepley   case 3:
326*6fc05355SMatthew G. Knepley     PetscCall(DMPlexOrientPoint(*dm, 7, -1));
327*6fc05355SMatthew G. Knepley     break;
328*6fc05355SMatthew G. Knepley   default:
329*6fc05355SMatthew G. Knepley     break;
330*6fc05355SMatthew G. Knepley   }
331*6fc05355SMatthew G. Knepley   // Need this so that all procs create the cell types
332*6fc05355SMatthew G. Knepley   PetscCall(DMPlexGetCellTypeLabel(*dm, &label));
333*6fc05355SMatthew G. Knepley   // Replace comm in object (copied from PetscHeaderCreate/Destroy())
334*6fc05355SMatthew G. Knepley   PetscCall(PetscCommDestroy(&(*dm)->hdr.comm));
335*6fc05355SMatthew G. Knepley   PetscCall(PetscCommDuplicate(comm, &(*dm)->hdr.comm, &(*dm)->hdr.tag));
336*6fc05355SMatthew G. Knepley   PetscCallMPI(MPI_Comm_get_attr((*dm)->hdr.comm, Petsc_CreationIdx_keyval, &get_tmp, &flg));
337*6fc05355SMatthew G. Knepley   PetscCheck(flg, (*dm)->hdr.comm, PETSC_ERR_ARG_CORRUPT, "MPI_Comm does not have an object creation index");
338*6fc05355SMatthew G. Knepley   cidx            = (PetscInt64 *)get_tmp;
339*6fc05355SMatthew G. Knepley   (*dm)->hdr.cidx = (*cidx)++;
340*6fc05355SMatthew G. Knepley   // Create new pointSF
341*6fc05355SMatthew G. Knepley   {
342*6fc05355SMatthew G. Knepley     PetscSF      sf;
343*6fc05355SMatthew G. Knepley     PetscInt    *local  = NULL;
344*6fc05355SMatthew G. Knepley     PetscSFNode *remote = NULL;
345*6fc05355SMatthew G. Knepley     PetscInt     Nl;
346*6fc05355SMatthew G. Knepley 
347*6fc05355SMatthew G. Knepley     PetscCall(PetscSFCreate(comm, &sf));
348*6fc05355SMatthew G. Knepley     switch (rank) {
349*6fc05355SMatthew G. Knepley     case 0:
350*6fc05355SMatthew G. Knepley       Nl = 5;
351*6fc05355SMatthew G. Knepley       PetscCall(PetscMalloc1(Nl, &local));
352*6fc05355SMatthew G. Knepley       PetscCall(PetscMalloc1(Nl, &remote));
353*6fc05355SMatthew G. Knepley       local[0]        = 2;
354*6fc05355SMatthew G. Knepley       remote[0].index = 1;
355*6fc05355SMatthew G. Knepley       remote[0].rank  = 1;
356*6fc05355SMatthew G. Knepley       local[1]        = 3;
357*6fc05355SMatthew G. Knepley       remote[1].index = 1;
358*6fc05355SMatthew G. Knepley       remote[1].rank  = 2;
359*6fc05355SMatthew G. Knepley       local[2]        = 4;
360*6fc05355SMatthew G. Knepley       remote[2].index = 1;
361*6fc05355SMatthew G. Knepley       remote[2].rank  = 3;
362*6fc05355SMatthew G. Knepley       local[3]        = 6;
363*6fc05355SMatthew G. Knepley       remote[3].index = 5;
364*6fc05355SMatthew G. Knepley       remote[3].rank  = 2;
365*6fc05355SMatthew G. Knepley       local[4]        = 8;
366*6fc05355SMatthew G. Knepley       remote[4].index = 7;
367*6fc05355SMatthew G. Knepley       remote[4].rank  = 1;
368*6fc05355SMatthew G. Knepley       break;
369*6fc05355SMatthew G. Knepley     case 1:
370*6fc05355SMatthew G. Knepley       Nl = 3;
371*6fc05355SMatthew G. Knepley       PetscCall(PetscMalloc1(Nl, &local));
372*6fc05355SMatthew G. Knepley       PetscCall(PetscMalloc1(Nl, &remote));
373*6fc05355SMatthew G. Knepley       local[0]        = 3;
374*6fc05355SMatthew G. Knepley       remote[0].index = 1;
375*6fc05355SMatthew G. Knepley       remote[0].rank  = 3;
376*6fc05355SMatthew G. Knepley       local[1]        = 4;
377*6fc05355SMatthew G. Knepley       remote[1].index = 2;
378*6fc05355SMatthew G. Knepley       remote[1].rank  = 3;
379*6fc05355SMatthew G. Knepley       local[2]        = 6;
380*6fc05355SMatthew G. Knepley       remote[2].index = 5;
381*6fc05355SMatthew G. Knepley       remote[2].rank  = 3;
382*6fc05355SMatthew G. Knepley       break;
383*6fc05355SMatthew G. Knepley     case 2:
384*6fc05355SMatthew G. Knepley       Nl = 3;
385*6fc05355SMatthew G. Knepley       PetscCall(PetscMalloc1(Nl, &local));
386*6fc05355SMatthew G. Knepley       PetscCall(PetscMalloc1(Nl, &remote));
387*6fc05355SMatthew G. Knepley       local[0]        = 2;
388*6fc05355SMatthew G. Knepley       remote[0].index = 1;
389*6fc05355SMatthew G. Knepley       remote[0].rank  = 3;
390*6fc05355SMatthew G. Knepley       local[1]        = 4;
391*6fc05355SMatthew G. Knepley       remote[1].index = 3;
392*6fc05355SMatthew G. Knepley       remote[1].rank  = 3;
393*6fc05355SMatthew G. Knepley       local[2]        = 8;
394*6fc05355SMatthew G. Knepley       remote[2].index = 7;
395*6fc05355SMatthew G. Knepley       remote[2].rank  = 3;
396*6fc05355SMatthew G. Knepley       break;
397*6fc05355SMatthew G. Knepley     case 3:
398*6fc05355SMatthew G. Knepley       Nl = 0;
399*6fc05355SMatthew G. Knepley       break;
400*6fc05355SMatthew G. Knepley     default:
401*6fc05355SMatthew G. Knepley       SETERRQ(comm, PETSC_ERR_SUP, "This example only supports 4 ranks");
402*6fc05355SMatthew G. Knepley     }
403*6fc05355SMatthew G. Knepley     PetscCall(PetscSFSetGraph(sf, 9, Nl, local, PETSC_OWN_POINTER, remote, PETSC_OWN_POINTER));
404*6fc05355SMatthew G. Knepley     PetscCall(DMSetPointSF(*dm, sf));
405*6fc05355SMatthew G. Knepley     PetscCall(PetscSFDestroy(&sf));
406*6fc05355SMatthew G. Knepley   }
407*6fc05355SMatthew G. Knepley   // Create fault label
408*6fc05355SMatthew G. Knepley   PetscCall(DMCreateLabel(*dm, "fault"));
409*6fc05355SMatthew G. Knepley   PetscCall(DMGetLabel(*dm, "fault", &label));
410*6fc05355SMatthew G. Knepley   switch (rank) {
411*6fc05355SMatthew G. Knepley   case 0:
412*6fc05355SMatthew G. Knepley   case 2:
413*6fc05355SMatthew G. Knepley     PetscCall(DMLabelSetValue(label, 8, 1));
414*6fc05355SMatthew G. Knepley     PetscCall(DMLabelSetValue(label, 2, 0));
415*6fc05355SMatthew G. Knepley     PetscCall(DMLabelSetValue(label, 4, 0));
416*6fc05355SMatthew G. Knepley     break;
417*6fc05355SMatthew G. Knepley   case 1:
418*6fc05355SMatthew G. Knepley   case 3:
419*6fc05355SMatthew G. Knepley     PetscCall(DMLabelSetValue(label, 7, 1));
420*6fc05355SMatthew G. Knepley     PetscCall(DMLabelSetValue(label, 1, 0));
421*6fc05355SMatthew G. Knepley     PetscCall(DMLabelSetValue(label, 3, 0));
422*6fc05355SMatthew G. Knepley     break;
423*6fc05355SMatthew G. Knepley   default:
424*6fc05355SMatthew G. Knepley     break;
425*6fc05355SMatthew G. Knepley   }
426*6fc05355SMatthew G. Knepley   PetscCall(DMPlexOrientLabel(*dm, label));
427*6fc05355SMatthew G. Knepley   PetscCall(DMPlexLabelCohesiveComplete(*dm, label, NULL, 1, PETSC_FALSE, PETSC_FALSE, NULL));
428*6fc05355SMatthew G. Knepley   PetscCall(DMPlexDistributeSetDefault(*dm, PETSC_FALSE));
429*6fc05355SMatthew G. Knepley   PetscFunctionReturn(PETSC_SUCCESS);
430*6fc05355SMatthew G. Knepley }
431*6fc05355SMatthew G. Knepley 
432*6fc05355SMatthew G. Knepley static PetscErrorCode CreateMesh(MPI_Comm comm, AppCtx *user, DM *dm)
433*6fc05355SMatthew G. Knepley {
434*6fc05355SMatthew G. Knepley   PetscFunctionBegin;
435*6fc05355SMatthew G. Knepley   if (user->testNum) {
436*6fc05355SMatthew G. Knepley     PetscCall(CreateQuadMesh1(comm, user, dm));
437*6fc05355SMatthew G. Knepley   } else {
438*6fc05355SMatthew G. Knepley     PetscCall(DMCreate(comm, dm));
439*6fc05355SMatthew G. Knepley     PetscCall(DMSetType(*dm, DMPLEX));
440*6fc05355SMatthew G. Knepley   }
441*6fc05355SMatthew G. Knepley   PetscCall(DMSetFromOptions(*dm));
442*6fc05355SMatthew G. Knepley   {
443*6fc05355SMatthew G. Knepley     const char *prefix;
444*6fc05355SMatthew G. Knepley 
445*6fc05355SMatthew G. Knepley     // We cannot redistribute with cohesive cells in the SF
446*6fc05355SMatthew G. Knepley     PetscCall(DMPlexDistributeSetDefault(*dm, PETSC_FALSE));
447*6fc05355SMatthew G. Knepley     PetscCall(PetscObjectGetOptionsPrefix((PetscObject)*dm, &prefix));
448*6fc05355SMatthew G. Knepley     PetscCall(PetscObjectSetOptionsPrefix((PetscObject)*dm, "f0_"));
449*6fc05355SMatthew G. Knepley     PetscCall(DMSetFromOptions(*dm));
450*6fc05355SMatthew G. Knepley     PetscCall(PetscObjectSetOptionsPrefix((PetscObject)*dm, "f1_"));
451*6fc05355SMatthew G. Knepley     PetscCall(DMSetFromOptions(*dm));
452*6fc05355SMatthew G. Knepley     PetscCall(PetscObjectSetOptionsPrefix((PetscObject)*dm, prefix));
453*6fc05355SMatthew G. Knepley   }
454*6fc05355SMatthew G. Knepley   PetscCall(DMViewFromOptions(*dm, NULL, "-dm_view"));
455*6fc05355SMatthew G. Knepley   PetscFunctionReturn(PETSC_SUCCESS);
456*6fc05355SMatthew G. Knepley }
457*6fc05355SMatthew G. Knepley 
458*6fc05355SMatthew G. Knepley int main(int argc, char **argv)
459*6fc05355SMatthew G. Knepley {
460*6fc05355SMatthew G. Knepley   DM     dm;
461*6fc05355SMatthew G. Knepley   AppCtx user;
462*6fc05355SMatthew G. Knepley 
463*6fc05355SMatthew G. Knepley   PetscFunctionBeginUser;
464*6fc05355SMatthew G. Knepley   PetscCall(PetscInitialize(&argc, &argv, NULL, help));
465*6fc05355SMatthew G. Knepley   PetscCall(ProcessOptions(PETSC_COMM_WORLD, &user));
466*6fc05355SMatthew G. Knepley   PetscCall(CreateMesh(PETSC_COMM_WORLD, &user, &dm));
467*6fc05355SMatthew G. Knepley   PetscCall(DMDestroy(&dm));
468*6fc05355SMatthew G. Knepley   PetscCall(PetscFinalize());
469*6fc05355SMatthew G. Knepley   return 0;
470*6fc05355SMatthew G. Knepley }
471*6fc05355SMatthew G. Knepley 
472*6fc05355SMatthew G. Knepley /*TEST
473*6fc05355SMatthew G. Knepley 
474*6fc05355SMatthew G. Knepley   testset:
475*6fc05355SMatthew G. Knepley     requires: triangle
476*6fc05355SMatthew G. Knepley     args: -dm_refine 1 -dm_plex_transform_type cohesive_extrude \
477*6fc05355SMatthew G. Knepley             -dm_plex_transform_active fault \
478*6fc05355SMatthew G. Knepley           -dm_view ::ascii_info_detail -coarse_dm_view ::ascii_info_detail
479*6fc05355SMatthew G. Knepley 
480*6fc05355SMatthew G. Knepley     test:
481*6fc05355SMatthew G. Knepley       suffix: tri_0
482*6fc05355SMatthew G. Knepley       args: -dm_plex_box_faces 1,1 -dm_plex_cohesive_label_fault 8
483*6fc05355SMatthew G. Knepley     test:
484*6fc05355SMatthew G. Knepley       suffix: tri_1
485*6fc05355SMatthew G. Knepley       args: -dm_plex_box_faces 1,1 -dm_plex_cohesive_label_fault 8 \
486*6fc05355SMatthew G. Knepley               -dm_plex_transform_extrude_use_tensor 0
487*6fc05355SMatthew G. Knepley     test:
488*6fc05355SMatthew G. Knepley       suffix: tri_2
489*6fc05355SMatthew G. Knepley       args: -dm_plex_file_contents dat:tri_2_cv -dm_plex_cohesive_label_fault 11,15
490*6fc05355SMatthew G. Knepley     test:
491*6fc05355SMatthew G. Knepley       suffix: tri_3
492*6fc05355SMatthew G. Knepley       nsize: 2
493*6fc05355SMatthew G. Knepley       args: -dm_plex_file_contents dat:tri_2_cv -dm_plex_cohesive_label_fault 11,15 \
494*6fc05355SMatthew G. Knepley               -petscpartitioner_type shell -petscpartitioner_shell_sizes 2,2 \
495*6fc05355SMatthew G. Knepley               -petscpartitioner_shell_points 0,3,1,2
496*6fc05355SMatthew G. Knepley 
497*6fc05355SMatthew G. Knepley   testset:
498*6fc05355SMatthew G. Knepley     args: -dm_plex_simplex 0 -dm_plex_box_faces 2,1 \
499*6fc05355SMatthew G. Knepley           -dm_refine 1 -dm_plex_transform_type cohesive_extrude \
500*6fc05355SMatthew G. Knepley             -dm_plex_transform_active fault -dm_plex_cohesive_label_fault 13 \
501*6fc05355SMatthew G. Knepley           -dm_view ::ascii_info_detail -coarse_dm_view ::ascii_info_detail
502*6fc05355SMatthew G. Knepley 
503*6fc05355SMatthew G. Knepley     test:
504*6fc05355SMatthew G. Knepley       suffix: quad_0
505*6fc05355SMatthew G. Knepley     test:
506*6fc05355SMatthew G. Knepley       suffix: quad_1
507*6fc05355SMatthew G. Knepley       args: -dm_plex_transform_extrude_use_tensor 0
508*6fc05355SMatthew G. Knepley     test:
509*6fc05355SMatthew G. Knepley       suffix: quad_2
510*6fc05355SMatthew G. Knepley       nsize: 2
511*6fc05355SMatthew G. Knepley       args: -petscpartitioner_type simple
512*6fc05355SMatthew G. Knepley 
513*6fc05355SMatthew G. Knepley   test:
514*6fc05355SMatthew G. Knepley     suffix: quad_3
515*6fc05355SMatthew G. Knepley     nsize: 4
516*6fc05355SMatthew G. Knepley     args: -test_num 1 \
517*6fc05355SMatthew G. Knepley           -dm_refine 1 -dm_plex_transform_type cohesive_extrude \
518*6fc05355SMatthew G. Knepley             -dm_plex_transform_active fault \
519*6fc05355SMatthew G. Knepley           -dm_view ::ascii_info_detail -coarse_dm_view ::ascii_info_detail \
520*6fc05355SMatthew G. Knepley           -orientation_view -orientation_view_synchronized
521*6fc05355SMatthew G. Knepley 
522*6fc05355SMatthew G. Knepley   test:
523*6fc05355SMatthew G. Knepley     suffix: quad_4
524*6fc05355SMatthew G. Knepley     args: -dm_plex_simplex 0 -dm_plex_box_faces 3,2 \
525*6fc05355SMatthew G. Knepley           -dm_refine 1 -dm_plex_transform_type cohesive_extrude \
526*6fc05355SMatthew G. Knepley             -dm_plex_transform_active fault -dm_plex_cohesive_label_fault 22,23 \
527*6fc05355SMatthew G. Knepley           -dm_view ::ascii_info_detail -coarse_dm_view ::ascii_info_detail
528*6fc05355SMatthew G. Knepley 
529*6fc05355SMatthew G. Knepley   test:
530*6fc05355SMatthew G. Knepley     suffix: quad_5
531*6fc05355SMatthew G. Knepley     args: -dm_plex_simplex 0 -dm_plex_box_faces 3,2 \
532*6fc05355SMatthew G. Knepley             -dm_plex_cohesive_label_fault0 21 \
533*6fc05355SMatthew G. Knepley             -dm_plex_cohesive_label_fault1 23 \
534*6fc05355SMatthew G. Knepley           -f0_dm_refine 1 -f0_dm_plex_transform_type cohesive_extrude \
535*6fc05355SMatthew G. Knepley             -f0_dm_plex_transform_active fault0  -f0_coarse_dm_view ::ascii_info_detail \
536*6fc05355SMatthew G. Knepley           -f1_dm_refine 1 -f1_dm_plex_transform_type cohesive_extrude \
537*6fc05355SMatthew G. Knepley             -f1_dm_plex_transform_active fault1  -f1_coarse_dm_view ::ascii_info_detail \
538*6fc05355SMatthew G. Knepley           -dm_view ::ascii_info_detail
539*6fc05355SMatthew G. Knepley 
540*6fc05355SMatthew G. Knepley   test:
541*6fc05355SMatthew G. Knepley     suffix: quad_6
542*6fc05355SMatthew G. Knepley     args: -dm_plex_simplex 0 -dm_plex_box_faces 3,2 \
543*6fc05355SMatthew G. Knepley             -dm_plex_cohesive_label_fault0 22,23 \
544*6fc05355SMatthew G. Knepley             -dm_plex_cohesive_label_fault1 32 \
545*6fc05355SMatthew G. Knepley           -f0_dm_refine 1 -f0_dm_plex_transform_type cohesive_extrude \
546*6fc05355SMatthew G. Knepley             -f0_dm_plex_transform_active fault0  -f0_coarse_dm_view ::ascii_info_detail \
547*6fc05355SMatthew G. Knepley           -f1_dm_refine 1 -f1_dm_plex_transform_type cohesive_extrude \
548*6fc05355SMatthew G. Knepley             -f1_dm_plex_transform_active fault1  -f1_coarse_dm_view ::ascii_info_detail \
549*6fc05355SMatthew G. Knepley           -dm_view ::ascii_info_detail
550*6fc05355SMatthew G. Knepley 
551*6fc05355SMatthew G. Knepley TEST*/
552