xref: /petsc/src/dm/impls/plex/tests/ex69.c (revision 2ff79c18c26c94ed8cb599682f680f231dca6444)
1 static char help[] = "Tests for creation of cohesive meshes by transforms\n\n";
2 
3 #include <petscdmplex.h>
4 #include <petscsf.h>
5 
6 #include <petsc/private/dmpleximpl.h>
7 
8 PETSC_EXTERN char tri_2_cv[];
9 char              tri_2_cv[] = "\
10 2 4 6 3 1\n\
11 0 2 1\n\
12 1 2 3\n\
13 4 1 5\n\
14 4 0 1\n\
15 -1.0  0.0 0.0  1\n\
16  0.0  1.0 0.0 -1\n\
17  0.0 -1.0 0.0  1\n\
18  1.0  0.0 0.0 -1\n\
19 -2.0  1.0 0.0  1\n\
20 -1.0  2.0 0.0 -1";
21 
22 /* List of test meshes
23 
24 Test tri_0: triangle
25 
26  4-10--5      8-16--7-14--4
27  |\  1 |      |\     \  1 |
28  | \   |      | \     \   |
29  6  8  9  ->  9 12  2  11 13
30  |   \ |      |   \     \ |
31  | 0  \|      | 0  \     \|
32  2--7--3      3-10--6-15--5
33 
34 Test tri_1: triangle, not tensor
35 
36  4-10--5      8-10--7-16--4
37  |\  1 |      |\     \  1 |
38  | \   |      | \     \   |
39  6  8  9  -> 11 14  2  13 15
40  |   \ |      |   \     \ |
41  | 0  \|      | 0  \     \|
42  2--7--3      3-12--6--9--5
43 
44 Test tri_2: 4 triangles, non-oriented surface
45 
46            9
47           / \
48          /   \
49        17  2  16
50        /       \
51       /         \
52      8-----15----5
53       \         /|\
54        \       / | \
55        18  3  12 |  14
56          \   /   |   \
57           \ /    |    \
58            4  0 11  1  7
59             \    |    /
60              \   |   /
61              10  |  13
62                \ | /
63                 \|/
64                  6
65   becomes
66            8
67           / \
68          /   \
69         /     \
70       25   2   24
71       /         \
72      /           \
73    13-----18------9
74 28  |     5    26/ \
75    14----19----10   \
76      \         /|   |\
77       \       / |   | \
78       21  3  20 |   |  23
79         \   /   |   |   \
80          \ /    |   |    \
81           6  0 17 4 16 1  7
82            \    |   |    /
83             \   |   |   /
84             15  |   |  22
85               \ |   | /
86                \|   |/
87                12---11
88                  27
89 
90 Test tri_3: tri_2, in parallel
91 
92            6
93           / \
94          /   \
95         /     \
96       12   1   11
97       /         \
98      /           \
99     5-----10------2
100                    \
101     5-----9-----3   2
102      \         /|   |\
103       \       / |   | \
104       10  1  8  |   |  9
105         \   /   |   |   \
106          \ /    |   |    \
107           2  0  7   7  0  4
108            \    |   |    /
109             \   |   |   /
110              6  |   |  8
111               \ |   | /
112                \|   |/
113                 4   3
114   becomes
115                  11
116                 / \
117                /   \
118               /     \
119             19   1   18
120             /         \
121            /           \
122           8-----14------4
123         22 \     3       |
124             9------15    |\
125                     \    | \
126     9------14-----5  \  20 |
127   20\    3     18/ \  \/   |
128    10----15-----6   |  5   |
129      \         /|   |  |   |\
130       \       / |   |  |   | \
131       17  1 16  |   |  |   |  17
132         \   /   | 2 |  | 2 |   \
133          \ /    |   |  |   |    \
134           4  0  13 12  13  12 0 10
135            \    |   |  |   |    /
136             \   |   |  |   |   /
137             11  |   |  |   |  16
138               \ |   |  |   | /
139                \|   |  |   |/
140                 8---7  7---6
141                  19      21
142 
143 Test quad_0: quadrilateral
144 
145  5-10--6-11--7       5-12-10-20--9-14--6
146  |     |     |       |     |     |     |
147 12  0 13  1  14 --> 15  0 18  2 17  1  16
148  |     |     |       |     |     |     |
149  2--8--3--9--4       3-11--8-19--7-13--4
150 
151 Test quad_1: quadrilateral, not tensor
152 
153  5-10--6-11--7       5-14-10-12--9-16--6
154  |     |     |       |     |     |     |
155 12  0 13  1  14 --> 17  0 20  2 19  1  18
156  |     |     |       |     |     |     |
157  2--8--3--9--4       3-13--8-11--7-15--4
158 
159 Test quad_2: quadrilateral, 2 processes
160 
161  3--6--4  3--6--4       3--9--7-14--6   5-14--4--9--7
162  |     |  |     |       |     |     |   |     |     |
163  7  0  8  7  0  8  --> 10  0 12  1 11  12  1 11  0  10
164  |     |  |     |       |     |     |   |     |     |
165  1--5--2  1--5--2       2--8--5-13--4   3-13--2--8--6
166 
167 Test quad_3: quadrilateral, 4 processes, non-oriented surface
168 
169  3--6--4  3--6--4      3--9--7-14--6   5-14--4--9--7
170  |     |  |     |      |     |     |   |     |     |
171  7  0  8  7  0  8     10  0  12 1  11 12  1 11  0  10
172  |     |  |     |      |     |     |   |     |     |
173  1--5--2  1--5--2      2--8--5-13--4   3-13--2--8--6
174                    -->
175  3--6--4  3--6--4      3--9--7-14--6   5-14--4--9--7
176  |     |  |     |      |     |     |   |     |     |
177  7  0  8  7  0  8     10  0  12 1  11 12  1 11  0  10
178  |     |  |     |      |     |     |   |     |     |
179  1--5--2  1--5--2      2--8--5-13--4   3-13--2--8--6
180 
181 Test quad_4: embedded fault
182 
183 14-24-15-25-16-26--17
184  |     |     |     |
185 28  3 30  4 32  5  34
186  |     |     |     |
187 10-21-11-22-12-23--13
188  |     |     |     |
189 27  0 29  1 31  2  33
190  |     |     |     |
191  6-18--7-19--8-20--9
192 
193 becomes
194 
195  13-26-14-27-15-28--16
196   |     |     |     |
197  30  3 32  4 39  5  40
198   |     |     |     |
199  12-25-17-36-19-38--21
200         |     |     |
201        41  6 42  7  43
202         |     |     |
203  12-25-17-35-18-37--20
204   |     |     |     |
205  29  0 31  1 33  2  34
206   |     |     |     |
207   8-22--9-23-10-24--11
208 
209 Test quad_5: two faults
210 
211 14-24-15-25-16-26--17
212  |     |     |     |
213 28  3 30  4 32  5  34
214  |     |     |     |
215 10-21-11-22-12-23--13
216  |     |     |     |
217 27  0 29  1 31  2  33
218  |     |     |     |
219  6-18--7-19--8-20--9
220 
221 becomes
222 
223 12-26-13-27-14-28--15
224  |     |     |     |
225 37  4 31  3 33  5  40
226  |     |     |     |
227 17-36-18-25-19-39--21
228  |     |     |     |
229 43  6  44   41  7  42
230  |     |     |     |
231 16-35-18-25-19-38--20
232  |     |     |     |
233 29  0 30  1 32  2  34
234  |     |     |     |
235  8-22--9-23-10-24--11
236 
237 Test quad_6: T-junction
238 
239 14-24-15-25-16-26--17
240  |     |     |     |
241 28  3 30  4 32  5  34
242  |     |     |     |
243 10-21-11-22-12-23--13
244  |     |     |     |
245 27  0 29  1 31  2  33
246  |     |     |     |
247  6-18--7-19--8-20--9
248 
249 becomes
250 
251  13-26-14-27-15-28--16
252   |     |     |     |
253  30  3 32  4 39  5  40
254   |     |     |     |
255  12-25-17-36-19-38--21
256         |     |     |
257        41  6 42  7  43
258         |     |     |
259  12-25-17-35-18-37--20
260   |     |     |     |
261  29  0 31  1 33  2  34
262   |     |     |     |
263   8-22--9-23-10-24--11
264 
265 becomes
266 
267  14-28-15-41-21-44--20-29-16
268   |     |     |     |     |
269  31  3 33  5 43  8 42  4  40
270   |     |     |     |     |
271  13-27-17-37-23-46--23-39-19
272         |     |     |     |
273        47  6 48    48  7  49
274         |     |     |     |
275  13-27-17-36-22-45--22-38-18
276   |     |     |     |     |
277  30  0 32  1 34    34  2  35
278   |     |     |     |     |
279   9-24-10-25-11-----11-26-12
280 
281 Test tet_0: Two tets sharing a face
282 
283  cell   5 _______    cell
284  0    / | \      \      1
285     19  |  16     20
286     /  15   \      \
287    2-17------4--22--6
288     \   |   /      /
289     18  |  14     21
290       \ | /      /
291         3-------
292 
293 becomes
294 
295  cell  10 ___36____9______    cell
296  0    / | \        |\      \     1
297     29  |  27      | 26     31
298     /  25   \     24  \      \
299    3-28------8--35-----7--33--4
300     \   |   /      |  /      /
301     30  |  23      | 22     32
302       \ | /        |/      /
303         6----34----5------
304          cell 2
305 
306 Test tet_1: Two tets sharing a face in parallel
307 
308  cell   4          3______    cell
309  0    / | \        |\      \     0
310     14  |  11      | 11     12
311     /  10   \     10  \      \
312    1-12------3     |   2--14--4
313     \   |   /      |  /      /
314     13  |  9       | 9      13
315       \ | /        |/      /
316         2          1------
317 
318 becomes
319            cell 1              cell 1
320  cell   8---28---7           7---28---6______    cell
321  0    / | \      |\          |\       |\      \     0
322     24  |  22    | 21        | 22     | 21     23
323     /  20   \    |   \       |  \    19  \      \
324    2-23------6---27---5     20  5---27---4--25--8
325     \   |   /   19   /       |  /     |  /      /
326     25  |  18    | 17        | 18     | 17     24
327       \ | /      |/          |/       |/      /
328         4---26---3           3---26---2------
329 
330 Test hex_0: Two hexes sharing a face
331 
332 cell  11-----31-----12-----32------13 cell
333 0     /|            /|            /|     1
334     36 |   22      37|   24      38|
335     /  |          /  |          /  |
336    8-----29------9-----30------10  |
337    |   |     18  |   |     20  |   |
338    |  42         |  43         |   44
339    |14 |         |15 |         |16 |
340   39   |  17    40   |   19   41   |
341    |   5-----27--|---6-----28--|---7
342    |  /          |  /          |  /
343    | 33   21     | 34    23    | 35
344    |/            |/            |/
345    2-----25------3-----26------4
346 
347 becomes
348 
349                          cell 2
350 cell   9-----38-----18-----62------17----42------10 cell
351 0     /|            /|            /|            /|     1
352     45 |   30      54|  32       53|   24      46|
353     /  |          /  |          /  |          /  |
354    7-----37-----16-----61------15--|-41------8   |
355    |   |     28  |   |         |   |     22  |   |
356    |  49         |  58         |   57        |   50
357    |19 |         |26 |         |25 |         |20 |
358   47   |  27    56   |        55   |   21   48   |
359    |   5-----36--|--14-----60--|---13----40--|---6
360    |  /          |  /          |  /          |  /
361    | 43   29     | 52   31     | 51    23    | 44
362    |/            |/            |/            |/
363    3-----35-----12-----59------11----39------4
364 
365 Test hex_1: Two hexes sharing a face, in parallel
366 
367 cell   7-----18------8             7-----18------8 cell
368 0     /|            /|            /|            /|    0
369     21 |   14      22|           21|   14      22|
370     /  |          /  |          /  |          /  |
371    5-----17------6   |         5---|-17------6   |
372    |   |     12  |   |         |   |     12  |   |
373    |  25         |  26         |  25         |  26
374    | 9 |         |10 |         | 9 |         |10 |
375   23   |  11    24   |        23   |   11   24   |
376    |   3-----16--|---4         |   3-----16--|---4
377    |  /          |  /          |  /          |  /
378    | 19   13     | 20          | 19    13    | 20
379    |/            |/            |/            |/
380    1-----15------2             1-----15------2
381 
382 becomes
383                         cell 1                      cell 1
384 cell   5-----28-----13-----44-----12             9-----44-----8-----28------13 cell
385 0     /|            /|           /|             /|           /|            /|     0
386     30 |   20      36|   22     35|            36|   22     35|   20      30|
387     /  |          /  |         /  |           /  |         /  |          /  |
388    4-----27-----11-----43-----10  |          7-----43-----6-----27------12  |
389    |   |     18  |   |        |   |          |   |        |   |     18  |   |
390    |  32         |  40        |   39         |  40        |   39        |   32
391    |14 |         |16 |        | 15|          |15 |        |14 |         |16 |
392   31   |  17    38   |        37  |         38   |       37   |   17   31   |
393    |   3-----26--|---9-----42-|---8          |   5----42--|---4-----26--|---11
394    |  /          |  /         |  /           |  /         |  /          |  /
395    | 29   19     | 34    21   | 33           | 34    21   | 33    19    | 29
396    |/            |/           |/             |/           |/            |/
397    2-----25------7-----41-----6              3-----41-----2-----25------10
398 
399 Test hex_2: hexahedra, 4 processes, non-oriented surface
400 
401           cell 0                  cell 0
402        7-----18------8       7-----18------8
403       /|            /|      /|            /|
404     21 |   14      22|    21 |   14      22|
405     /  |          /  |    /  |          /  |
406    5-----17------6   |   5-----17------6   |
407    |   |     12  |   |   |   |     12  |   |
408    |  25         |  26   |  25         |   26
409    |9  |         |10 |   |9  |         |10 |
410   23   |  11    24   |  23   |  11    24   |
411    |   3-----16--|---4   |   3-----16--|---4
412    |  /          |  /    |  /          |  /
413    | 19    13    | 20    | 19    13    | 20
414    |/            |/      |/            |/
415    1-----15------2       1-----15------2
416 
417        7-----18------8       7-----18------8
418       /|            /|      /|            /|
419     21 |   14      22|    21 |   14      22|
420     /  |          /  |    /  |          /  |
421    5-----17------6   |   5-----17------6   |
422    |   |     12  |   |   |   |     12  |   |
423    |  25         |  26   |  25         |  26
424    |9  |         |10 |   |9  |         |10 |
425   23   |  11    24   |  23   |   11   24   |
426    |   3-----16--|---4   |   3-----16--|---4
427    |  /          |  /    |  /          |  /
428    | 19   13     | 20    | 19    13    | 20
429    |/            |/      |/            |/
430    1-----15------2       1-----15------2
431       cell 0                cell 0
432 
433 becomes
434 
435           cell 0         cell 1                cell 1        cell 0
436        5-----28------13----44------12      9-----44------8-----28------13
437       /|            /|            /|      /|            /|            /|
438     30 |   20      36|   22      35|     36|   22     35 |   20      30|
439     /  |          /  |          /  |    /  |          /  |          /  |
440    4-----27------11----43------10  |   7-----43------6-----27------12  |
441    |   |     18  |   |         |   |   |   |         |   |     18  |   |
442    |  32         |  40         |  39   |  40         |  39         |   32
443    |14 |         |16 |         |15 |   |15 |         |14 |         |16 |
444   31   |  17    38   |         37  |   38  |        37   |  17    31   |
445    |   3-----26--|---9-----42--|---8   |   5-----42--|---4-----26--|---11
446    |  /          |  /          |  /    |  /          |  /          |  /
447    | 29    19    | 34    21    |33     | 34    21    | 33    19    | 29
448    |/            |/            |/      |/            |/            |/
449    2-----25------7-----41------6       3-----41------2-----25------10
450 
451        5-----28------13----44------12      9-----44------8-----28------13
452       /|            /|            /|      /|            /|            /|
453     30 |   20      36|   22      35|     36|    22     35|   20      30|
454     /  |          /  |          /  |    /  |          /  |          /  |
455    4-----27------11----43------10  |   7-----43------6-----27------12  |
456    |   |     18  |   |         |   |   |   |         |   |     18  |   |
457    |  32         |  40         |   39  |   40        |  39         |   32
458    |14 |         |16 |         |15 |   |15 |         |14 |         |16 |
459   31   |  17    38   |         37  |   38  |        37   |  17    31   |
460    |   3-----26--|---9-----42--|---8   |   5-----42--|---4-----26--|---11
461    |  /          |  /          |  /    |  /          |  /          |  /
462    | 29    19    | 34    21    |33     | 34    21    | 33    19    | 29
463    |/            |/            |/      |/            |/            |/
464    2-----25------7-----41------6       3-----41------2-----25------10
465       cell 0         cell 1                cell 1        cell 0
466 
467 Test hex_3: T-junction
468 
469       19-----52-----20-----53------21
470       /|            /|            /|
471     60 |   38      61|   41      62|
472     /  |          /  |          /  |
473   16-----50-----17-----51------18  |
474    |   |     33  |   |     35  |   |
475    |  70         |  72         |   74
476    |25 |         |26 |         |27 |
477   64   |  32    66   |  34    68   |
478    |  13-----48--|--14-----49--|---15
479    |  /|         |  /|         |  /|
480    |57 |   37    | 58|   40    | 59|
481    |/  |         |/  |         |/  |
482   10-----46-----11-----47------12  |
483    |   |     29  |   |     31  |   |
484    |  69         |  71         |   73
485    |22 |         |23 |         |24 |
486   63   |  28    65   |   30   67   |
487    |   7-----44--|---8-----45--|---9
488    |  /          |  /          |  /
489    | 54   36     | 55    39    | 56
490    |/            |/            |/
491    4-----42------5-----43------6
492       cell 0         cell 1
493 
494 becomes
495 
496       15----102-----28---112----___27-----73------16
497       /|            /|         /   /             /|
498     77 |   55     104|      ---  103    46      78|
499     /  |          /  |     /     /             /  |
500   13----101-----26---111--/----25-----72------14  |
501    |   |     54  |   |  107   /           43  |   |
502    |  81         |  108 / 51 /                |   82
503    |40 |         |52 | /   105                |41 |
504   79   |  53    106  |/   /            42    80   |
505    |  21-----87--|--31---/-89------23-------/----/
506    |  /|         |  /|  /         /|       /
507    |91 |   47    |109|-- 49      93|  -----
508    |/  |         |/ /|          /  | /
509   17-----83-----29-----85------19----
510    |   |         |   |         |   |
511    |  120        |  121        |  122
512    |   |         |26 |         |   |
513  117   |        118  |        119  |
514    |  22-----88--|--32-----90--|---24
515    |  /|         |  /|         |  /|
516    |92 |   48    |110|   50    | 94|
517    |/  |         |/  |         |/  |
518   18-----84-----30-----86------20  |
519    |   |     37  |   |     39  |   |
520    |  98         |  99         |   100
521    |33 |         |34 |         |35 |
522   95   |  36    96   |   38   97   |
523    |  10-----70--|--11-----71--|---12
524    |  /          |  /          |  /
525    | 74   44     | 75    45    | 76
526    |/            |/            |/
527    7-----68------8-----69------9
528       cell 0         cell 1
529 
530 Test hex_4: Two non-intersecting faults
531 
532           cell 4         cell 5         cell 6        cell 7
533       33-----96-----34-----97-----35-----98-----36-----99------37
534       /|            /|            /|            /|            /|
535     110|   66     111|   69     112|   72     113|   75     114|
536     /  |          /  |          /  |          /  |          /  |
537   28-----92-----29-----93-----30-----94-----31-----95------32  |
538    |   |     57  |   |     59  |   |     61  |   |     63  |   |
539    |  126        |  128        |  130        |  132        |  134
540    |43 |         |44 |         |45 |         |46 |         |47 |
541   116  |  56    118  |  58    120  |  60    122  |  62    124  |
542    |  23-----88--|--24-----89--|--25-----90--|--26-----91--|---27
543    |  /|         |  /|         |  /|         |  /|         |  /|
544    |105|   65    |106|   68    |107|   71    |108|   74    |109|
545    |/  |         |/  |         |/  |         |/  |         |/  |
546   18-----84-----19-----95-----20-----86-----21-----87------22  |
547    |   |     49  |   |     51  |   |     53  |   |     55  |   |
548    |  125        |  127        |  129        |  131        |  133
549    |38 |         |39 |         |40 |         |41 |         |42 |
550   115  |  48    117  |  50    119  |  52    121  |  54    123  |
551    |  13-----80--|--14-----81--|--15-----82--|--16-----83--|---17
552    |  /          |  /          |  /          |  /          |  /
553    |100    64    |101    67    |102    70    |103    73    |104
554    |/            |/            |/            |/            |/
555    8-----76------9-----77-----10-----78-----11-----79------12
556       cell 0         cell 1        cell 2        cell 3
557 
558 becomes
559 
560           cell 4         cell 5        cell 7        cell 10       cell 6
561       27-----114----28-----115----29-----159----46-----170----45------116----30
562       /|            /|            /|            /|            /|            /|
563     123|   71     124|   73     125|   87     162|          161|    78    126|
564     /  |          /  |          /  |          /  |          /  |          /  |
565   23-----111----24-----112----25-----158----44-----169----43-----113-----26  |
566    |   |     65  |   |    67   |   |    86   |   |         |   |     69  |   |
567    |  134        |  135        |  137        |  166        |  165        |  140
568    |56 |         |57 |         |58 |         |84 |         |83 |         |59 |
569   127  |  64    128  |  66    130  |  85    164  |        163  |  68    133  |
570    |  35-----143-|--37-----151-|--40-----109-|--42-----168-|--42-----110-|---22
571    |  /|         |  /|         |  /|         |  /          |  /          |  /
572    |145|   79    |147|   81    |153|   75    |160          |160    77    |122
573    |/ 173        |/ 174        |/ 176        |/            |/            |/
574   31-----141----33-----149----39-----107----41-----167----41-----108-----21
575 cell   |         |   |         |   | cell 9
576 8  |  36-----144-|--38-----152-|--40-----109----42-----110-----22
577   171 /|        172 /|        175 /|            /|            /|
578    |146|   80    |148|   82    |153|    75    160|   77     122|
579    |/  |         |/  |         |/  |          /  |          /  |
580   32-----142----34-----150----39-----107----41-----108-----21  |
581    |   |     50  |   |    52   |   |    61   |   |     63  |   |
582    |  156        |  157        |  136        |  138        |  139
583    |47 |         |48 |         |53 |         |54 |         |55 |
584   154  |  49    155  |  51    129  |  60    131  |  62    132  |
585    |  16-----103-|--17-----104-|--18-----105-|--19-----106-|---20
586    |  /          |  /          |  /          |  /          |  /
587    |117    70    |118    72    |119    74    |120    76    |121
588    |/            |/            |/            |/            |/
589   11-----99-----12-----100----13-----101----14-----102-----15
590       cell 0         cell 1        cell 2        cell 3
591 
592 */
593 
594 typedef struct {
595   PetscInt testNum; // The mesh to test
596 } AppCtx;
597 
598 static PetscErrorCode ProcessOptions(MPI_Comm comm, AppCtx *options)
599 {
600   PetscFunctionBegin;
601   options->testNum = 0;
602 
603   PetscOptionsBegin(comm, "", "Cohesive Meshing Options", "DMPLEX");
604   PetscCall(PetscOptionsBoundedInt("-test_num", "The particular mesh to test", "ex5.c", options->testNum, &options->testNum, NULL, 0));
605   PetscOptionsEnd();
606   PetscFunctionReturn(PETSC_SUCCESS);
607 }
608 
609 static PetscErrorCode CreateQuadMesh1(MPI_Comm comm, AppCtx *user, DM *dm)
610 {
611   const PetscInt faces[2] = {1, 1};
612   PetscReal      lower[2], upper[2];
613   DMLabel        label;
614   PetscMPIInt    rank;
615   void          *get_tmp;
616   PetscInt64    *cidx;
617   PetscMPIInt    iflg;
618 
619   PetscFunctionBeginUser;
620   PetscCallMPI(MPI_Comm_rank(comm, &rank));
621   // Create serial mesh
622   lower[0] = (PetscReal)(rank % 2);
623   lower[1] = (PetscReal)(rank / 2);
624   upper[0] = (PetscReal)(rank % 2) + 1.;
625   upper[1] = (PetscReal)(rank / 2) + 1.;
626   PetscCall(DMPlexCreateBoxMesh(PETSC_COMM_SELF, 2, PETSC_FALSE, faces, lower, upper, NULL, PETSC_TRUE, 0, PETSC_TRUE, dm));
627   PetscCall(PetscObjectSetName((PetscObject)*dm, "box"));
628   // Flip edges to make fault non-oriented
629   switch (rank) {
630   case 2:
631     PetscCall(DMPlexOrientPoint(*dm, 8, -1));
632     break;
633   case 3:
634     PetscCall(DMPlexOrientPoint(*dm, 7, -1));
635     break;
636   default:
637     break;
638   }
639   // Need this so that all procs create the cell types
640   PetscCall(DMPlexGetCellTypeLabel(*dm, &label));
641   // Replace comm in object (copied from PetscHeaderCreate/Destroy())
642   PetscCall(PetscCommDestroy(&(*dm)->hdr.comm));
643   PetscCall(PetscCommDuplicate(comm, &(*dm)->hdr.comm, &(*dm)->hdr.tag));
644   PetscCallMPI(MPI_Comm_get_attr((*dm)->hdr.comm, Petsc_CreationIdx_keyval, &get_tmp, &iflg));
645   PetscCheck(iflg, (*dm)->hdr.comm, PETSC_ERR_ARG_CORRUPT, "MPI_Comm does not have an object creation index");
646   cidx            = (PetscInt64 *)get_tmp;
647   (*dm)->hdr.cidx = (*cidx)++;
648   // Create new pointSF
649   {
650     PetscSF      sf;
651     PetscInt    *local  = NULL;
652     PetscSFNode *remote = NULL;
653     PetscInt     Nl;
654 
655     PetscCall(PetscSFCreate(comm, &sf));
656     switch (rank) {
657     case 0:
658       Nl = 5;
659       PetscCall(PetscMalloc1(Nl, &local));
660       PetscCall(PetscMalloc1(Nl, &remote));
661       local[0]        = 2;
662       remote[0].index = 1;
663       remote[0].rank  = 1;
664       local[1]        = 3;
665       remote[1].index = 1;
666       remote[1].rank  = 2;
667       local[2]        = 4;
668       remote[2].index = 1;
669       remote[2].rank  = 3;
670       local[3]        = 6;
671       remote[3].index = 5;
672       remote[3].rank  = 2;
673       local[4]        = 8;
674       remote[4].index = 7;
675       remote[4].rank  = 1;
676       break;
677     case 1:
678       Nl = 3;
679       PetscCall(PetscMalloc1(Nl, &local));
680       PetscCall(PetscMalloc1(Nl, &remote));
681       local[0]        = 3;
682       remote[0].index = 1;
683       remote[0].rank  = 3;
684       local[1]        = 4;
685       remote[1].index = 2;
686       remote[1].rank  = 3;
687       local[2]        = 6;
688       remote[2].index = 5;
689       remote[2].rank  = 3;
690       break;
691     case 2:
692       Nl = 3;
693       PetscCall(PetscMalloc1(Nl, &local));
694       PetscCall(PetscMalloc1(Nl, &remote));
695       local[0]        = 2;
696       remote[0].index = 1;
697       remote[0].rank  = 3;
698       local[1]        = 4;
699       remote[1].index = 3;
700       remote[1].rank  = 3;
701       local[2]        = 8;
702       remote[2].index = 7;
703       remote[2].rank  = 3;
704       break;
705     case 3:
706       Nl = 0;
707       break;
708     default:
709       SETERRQ(comm, PETSC_ERR_SUP, "This example only supports 4 ranks");
710     }
711     PetscCall(PetscSFSetGraph(sf, 9, Nl, local, PETSC_OWN_POINTER, remote, PETSC_OWN_POINTER));
712     PetscCall(DMSetPointSF(*dm, sf));
713     PetscCall(PetscSFDestroy(&sf));
714   }
715   // Create fault label
716   PetscCall(DMCreateLabel(*dm, "fault"));
717   PetscCall(DMGetLabel(*dm, "fault", &label));
718   switch (rank) {
719   case 0:
720   case 2:
721     PetscCall(DMLabelSetValue(label, 8, 1));
722     PetscCall(DMLabelSetValue(label, 2, 0));
723     PetscCall(DMLabelSetValue(label, 4, 0));
724     break;
725   case 1:
726   case 3:
727     PetscCall(DMLabelSetValue(label, 7, 1));
728     PetscCall(DMLabelSetValue(label, 1, 0));
729     PetscCall(DMLabelSetValue(label, 3, 0));
730     break;
731   default:
732     break;
733   }
734   PetscCall(DMPlexOrientLabel(*dm, label));
735   PetscCall(DMPlexLabelCohesiveComplete(*dm, label, NULL, 1, PETSC_FALSE, PETSC_FALSE, NULL));
736   PetscCall(DMPlexDistributeSetDefault(*dm, PETSC_FALSE));
737   PetscFunctionReturn(PETSC_SUCCESS);
738 }
739 
740 static PetscErrorCode CreateHexMesh1(MPI_Comm comm, AppCtx *user, DM *dm)
741 {
742   const PetscInt faces[3] = {1, 1, 1};
743   PetscReal      lower[3], upper[3];
744   DMLabel        label;
745   PetscMPIInt    rank;
746   void          *get_tmp;
747   PetscInt64    *cidx;
748   PetscMPIInt    iflg;
749 
750   PetscFunctionBeginUser;
751   PetscCallMPI(MPI_Comm_rank(comm, &rank));
752   // Create serial mesh
753   lower[0] = (PetscReal)(rank % 2);
754   lower[1] = 0.;
755   lower[2] = (PetscReal)(rank / 2);
756   upper[0] = (PetscReal)(rank % 2) + 1.;
757   upper[1] = 1.;
758   upper[2] = (PetscReal)(rank / 2) + 1.;
759   PetscCall(DMPlexCreateBoxMesh(PETSC_COMM_SELF, 3, PETSC_FALSE, faces, lower, upper, NULL, PETSC_TRUE, 0, PETSC_TRUE, dm));
760   PetscCall(PetscObjectSetName((PetscObject)*dm, "box"));
761   // Flip edges to make fault non-oriented
762   switch (rank) {
763   case 2:
764     PetscCall(DMPlexOrientPoint(*dm, 10, -1));
765     break;
766   case 3:
767     PetscCall(DMPlexOrientPoint(*dm, 9, -1));
768     break;
769   default:
770     break;
771   }
772   // Need this so that all procs create the cell types
773   PetscCall(DMPlexGetCellTypeLabel(*dm, &label));
774   // Replace comm in object (copied from PetscHeaderCreate/Destroy())
775   PetscCall(PetscCommDestroy(&(*dm)->hdr.comm));
776   PetscCall(PetscCommDuplicate(comm, &(*dm)->hdr.comm, &(*dm)->hdr.tag));
777   PetscCallMPI(MPI_Comm_get_attr((*dm)->hdr.comm, Petsc_CreationIdx_keyval, &get_tmp, &iflg));
778   PetscCheck(iflg, (*dm)->hdr.comm, PETSC_ERR_ARG_CORRUPT, "MPI_Comm does not have an object creation index");
779   cidx            = (PetscInt64 *)get_tmp;
780   (*dm)->hdr.cidx = (*cidx)++;
781   // Create new pointSF
782   {
783     PetscSF      sf;
784     PetscInt    *local  = NULL;
785     PetscSFNode *remote = NULL;
786     PetscInt     Nl;
787 
788     PetscCall(PetscSFCreate(comm, &sf));
789     switch (rank) {
790     case 0:
791       Nl = 15;
792       PetscCall(PetscMalloc1(Nl, &local));
793       PetscCall(PetscMalloc1(Nl, &remote));
794       local[0]         = 2;
795       remote[0].index  = 1;
796       remote[0].rank   = 1;
797       local[1]         = 4;
798       remote[1].index  = 3;
799       remote[1].rank   = 1;
800       local[2]         = 5;
801       remote[2].index  = 1;
802       remote[2].rank   = 2;
803       local[3]         = 6;
804       remote[3].index  = 1;
805       remote[3].rank   = 3;
806       local[4]         = 7;
807       remote[4].index  = 3;
808       remote[4].rank   = 2;
809       local[5]         = 8;
810       remote[5].index  = 3;
811       remote[5].rank   = 3;
812       local[6]         = 17;
813       remote[6].index  = 15;
814       remote[6].rank   = 2;
815       local[7]         = 18;
816       remote[7].index  = 16;
817       remote[7].rank   = 2;
818       local[8]         = 20;
819       remote[8].index  = 19;
820       remote[8].rank   = 1;
821       local[9]         = 21;
822       remote[9].index  = 19;
823       remote[9].rank   = 2;
824       local[10]        = 22;
825       remote[10].index = 19;
826       remote[10].rank  = 3;
827       local[11]        = 24;
828       remote[11].index = 23;
829       remote[11].rank  = 1;
830       local[12]        = 26;
831       remote[12].index = 25;
832       remote[12].rank  = 1;
833       local[13]        = 10;
834       remote[13].index = 9;
835       remote[13].rank  = 1;
836       local[14]        = 14;
837       remote[14].index = 13;
838       remote[14].rank  = 2;
839       break;
840     case 1:
841       Nl = 9;
842       PetscCall(PetscMalloc1(Nl, &local));
843       PetscCall(PetscMalloc1(Nl, &remote));
844       local[0]        = 5;
845       remote[0].index = 1;
846       remote[0].rank  = 3;
847       local[1]        = 6;
848       remote[1].index = 2;
849       remote[1].rank  = 3;
850       local[2]        = 7;
851       remote[2].index = 3;
852       remote[2].rank  = 3;
853       local[3]        = 8;
854       remote[3].index = 4;
855       remote[3].rank  = 3;
856       local[4]        = 17;
857       remote[4].index = 15;
858       remote[4].rank  = 3;
859       local[5]        = 18;
860       remote[5].index = 16;
861       remote[5].rank  = 3;
862       local[6]        = 21;
863       remote[6].index = 19;
864       remote[6].rank  = 3;
865       local[7]        = 22;
866       remote[7].index = 20;
867       remote[7].rank  = 3;
868       local[8]        = 14;
869       remote[8].index = 13;
870       remote[8].rank  = 3;
871       break;
872     case 2:
873       Nl = 9;
874       PetscCall(PetscMalloc1(Nl, &local));
875       PetscCall(PetscMalloc1(Nl, &remote));
876       local[0]        = 2;
877       remote[0].index = 1;
878       remote[0].rank  = 3;
879       local[1]        = 4;
880       remote[1].index = 3;
881       remote[1].rank  = 3;
882       local[2]        = 6;
883       remote[2].index = 5;
884       remote[2].rank  = 3;
885       local[3]        = 8;
886       remote[3].index = 7;
887       remote[3].rank  = 3;
888       local[4]        = 20;
889       remote[4].index = 19;
890       remote[4].rank  = 3;
891       local[5]        = 22;
892       remote[5].index = 21;
893       remote[5].rank  = 3;
894       local[6]        = 24;
895       remote[6].index = 23;
896       remote[6].rank  = 3;
897       local[7]        = 26;
898       remote[7].index = 25;
899       remote[7].rank  = 3;
900       local[8]        = 10;
901       remote[8].index = 9;
902       remote[8].rank  = 3;
903       break;
904     case 3:
905       Nl = 0;
906       break;
907     default:
908       SETERRQ(comm, PETSC_ERR_SUP, "This example only supports 4 ranks");
909     }
910     PetscCall(PetscSFSetGraph(sf, 27, Nl, local, PETSC_OWN_POINTER, remote, PETSC_OWN_POINTER));
911     PetscCall(DMSetPointSF(*dm, sf));
912     PetscCall(PetscSFDestroy(&sf));
913   }
914   // Create fault label
915   PetscCall(DMCreateLabel(*dm, "fault"));
916   PetscCall(DMGetLabel(*dm, "fault", &label));
917   switch (rank) {
918   case 0:
919   case 2:
920     PetscCall(DMLabelSetValue(label, 10, 2));
921     PetscCall(DMLabelSetValue(label, 20, 1));
922     PetscCall(DMLabelSetValue(label, 22, 1));
923     PetscCall(DMLabelSetValue(label, 24, 1));
924     PetscCall(DMLabelSetValue(label, 26, 1));
925     PetscCall(DMLabelSetValue(label, 2, 0));
926     PetscCall(DMLabelSetValue(label, 4, 0));
927     PetscCall(DMLabelSetValue(label, 6, 0));
928     PetscCall(DMLabelSetValue(label, 8, 0));
929     break;
930   case 1:
931   case 3:
932     PetscCall(DMLabelSetValue(label, 9, 2));
933     PetscCall(DMLabelSetValue(label, 19, 1));
934     PetscCall(DMLabelSetValue(label, 21, 1));
935     PetscCall(DMLabelSetValue(label, 23, 1));
936     PetscCall(DMLabelSetValue(label, 25, 1));
937     PetscCall(DMLabelSetValue(label, 1, 0));
938     PetscCall(DMLabelSetValue(label, 3, 0));
939     PetscCall(DMLabelSetValue(label, 5, 0));
940     PetscCall(DMLabelSetValue(label, 7, 0));
941     break;
942   default:
943     break;
944   }
945   PetscCall(DMPlexOrientLabel(*dm, label));
946   PetscCall(DMPlexLabelCohesiveComplete(*dm, label, NULL, 1, PETSC_FALSE, PETSC_FALSE, NULL));
947   PetscCall(DMPlexDistributeSetDefault(*dm, PETSC_FALSE));
948   PetscFunctionReturn(PETSC_SUCCESS);
949 }
950 
951 static PetscErrorCode CreateMesh(MPI_Comm comm, AppCtx *user, DM *dm)
952 {
953   PetscFunctionBegin;
954   switch (user->testNum) {
955   case 1:
956     PetscCall(CreateQuadMesh1(comm, user, dm));
957     break;
958   case 2:
959     PetscCall(CreateHexMesh1(comm, user, dm));
960     break;
961   default:
962     PetscCall(DMCreate(comm, dm));
963     PetscCall(DMSetType(*dm, DMPLEX));
964     break;
965   }
966   PetscCall(DMSetFromOptions(*dm));
967   {
968     const char *prefix;
969 
970     // We cannot redistribute with cohesive cells in the SF
971     PetscCall(DMPlexDistributeSetDefault(*dm, PETSC_FALSE));
972     PetscCall(PetscObjectGetOptionsPrefix((PetscObject)*dm, &prefix));
973     PetscCall(PetscObjectSetOptionsPrefix((PetscObject)*dm, "f0_"));
974     PetscCall(DMSetFromOptions(*dm));
975     PetscCall(PetscObjectSetOptionsPrefix((PetscObject)*dm, "f1_"));
976     PetscCall(DMSetFromOptions(*dm));
977     PetscCall(PetscObjectSetOptionsPrefix((PetscObject)*dm, prefix));
978   }
979   PetscCall(DMViewFromOptions(*dm, NULL, "-dm_view"));
980   PetscFunctionReturn(PETSC_SUCCESS);
981 }
982 
983 int main(int argc, char **argv)
984 {
985   DM     dm;
986   AppCtx user;
987 
988   PetscFunctionBeginUser;
989   PetscCall(PetscInitialize(&argc, &argv, NULL, help));
990   PetscCall(ProcessOptions(PETSC_COMM_WORLD, &user));
991   PetscCall(CreateMesh(PETSC_COMM_WORLD, &user, &dm));
992   PetscCall(DMDestroy(&dm));
993   PetscCall(PetscFinalize());
994   return 0;
995 }
996 
997 /*TEST
998 
999   testset:
1000     requires: triangle
1001     args: -dm_refine 1 -dm_plex_transform_type cohesive_extrude \
1002             -dm_plex_transform_active fault \
1003           -dm_view ::ascii_info_detail -coarse_dm_view ::ascii_info_detail
1004 
1005     test:
1006       suffix: tri_0
1007       args: -dm_plex_box_faces 1,1 -dm_plex_cohesive_label_fault 8
1008     test:
1009       suffix: tri_1
1010       args: -dm_plex_box_faces 1,1 -dm_plex_cohesive_label_fault 8 \
1011               -dm_plex_transform_extrude_use_tensor 0
1012     test:
1013       suffix: tri_2
1014       args: -dm_plex_file_contents dat:tri_2_cv -dm_plex_cohesive_label_fault 11,15
1015     test:
1016       suffix: tri_3
1017       nsize: 2
1018       args: -dm_plex_file_contents dat:tri_2_cv -dm_plex_cohesive_label_fault 11,15 \
1019               -petscpartitioner_type shell -petscpartitioner_shell_sizes 2,2 \
1020               -petscpartitioner_shell_points 0,3,1,2
1021 
1022   testset:
1023     args: -dm_plex_simplex 0 -dm_plex_box_faces 2,1 \
1024           -dm_refine 1 -dm_plex_transform_type cohesive_extrude \
1025             -dm_plex_transform_active fault -dm_plex_cohesive_label_fault 13 \
1026           -dm_view ::ascii_info_detail -coarse_dm_view ::ascii_info_detail
1027 
1028     test:
1029       suffix: quad_0
1030     test:
1031       suffix: quad_1
1032       args: -dm_plex_transform_extrude_use_tensor 0
1033     test:
1034       suffix: quad_2
1035       nsize: 2
1036       args: -petscpartitioner_type simple
1037 
1038   test:
1039     suffix: quad_3
1040     nsize: 4
1041     args: -test_num 1 \
1042           -dm_refine 1 -dm_plex_transform_type cohesive_extrude \
1043             -dm_plex_transform_active fault \
1044           -dm_view ::ascii_info_detail -coarse_dm_view ::ascii_info_detail \
1045           -orientation_view -orientation_view_synchronized
1046 
1047   test:
1048     suffix: quad_4
1049     args: -dm_plex_simplex 0 -dm_plex_box_faces 3,2 \
1050           -dm_refine 1 -dm_plex_transform_type cohesive_extrude \
1051             -dm_plex_transform_active fault -dm_plex_cohesive_label_fault 22,23 \
1052           -dm_view ::ascii_info_detail -coarse_dm_view ::ascii_info_detail
1053 
1054   test:
1055     suffix: quad_5
1056     args: -dm_plex_simplex 0 -dm_plex_box_faces 3,2 \
1057             -dm_plex_cohesive_label_fault0 21 \
1058             -dm_plex_cohesive_label_fault1 23 \
1059           -f0_dm_refine 1 -f0_dm_plex_transform_type cohesive_extrude \
1060             -f0_dm_plex_transform_active fault0  -f0_coarse_dm_view ::ascii_info_detail \
1061           -f1_dm_refine 1 -f1_dm_plex_transform_type cohesive_extrude \
1062             -f1_dm_plex_transform_active fault1  -f1_coarse_dm_view ::ascii_info_detail \
1063           -dm_view ::ascii_info_detail
1064 
1065   test:
1066     suffix: quad_6
1067     args: -dm_plex_simplex 0 -dm_plex_box_faces 3,2 \
1068             -dm_plex_cohesive_label_fault0 22,23 \
1069             -dm_plex_cohesive_label_fault1 32 \
1070           -f0_dm_refine 1 -f0_dm_plex_transform_type cohesive_extrude \
1071             -f0_dm_plex_transform_active fault0  -f0_coarse_dm_view ::ascii_info_detail \
1072           -f1_dm_refine 1 -f1_dm_plex_transform_type cohesive_extrude \
1073             -f1_dm_plex_transform_active fault1  -f1_coarse_dm_view ::ascii_info_detail \
1074           -dm_view ::ascii_info_detail
1075 
1076   test:
1077     suffix: quad_6w
1078     args: -dm_plex_simplex 0 -dm_plex_box_faces 3,2 \
1079             -dm_plex_cohesive_label_fault0 22,23 \
1080             -dm_plex_cohesive_label_fault1 32 \
1081           -f0_dm_refine 1 -f0_dm_plex_transform_type cohesive_extrude \
1082             -f0_dm_plex_transform_active fault0  -f0_coarse_dm_view ::ascii_info_detail \
1083             -f0_dm_plex_transform_cohesive_width 0.05 \
1084           -f1_dm_refine 1 -f1_dm_plex_transform_type cohesive_extrude \
1085             -f1_dm_plex_transform_active fault1  -f1_coarse_dm_view ::ascii_info_detail \
1086             -f1_dm_plex_transform_cohesive_width 0.05 \
1087           -dm_view ::ascii_info_detail
1088 
1089   testset:
1090     args: -dm_plex_dim 3 -dm_plex_shape doublet \
1091           -dm_refine 1 -dm_plex_transform_type cohesive_extrude \
1092             -dm_plex_transform_active fault -dm_plex_cohesive_label_fault 7 \
1093           -dm_view ::ascii_info_detail -coarse_dm_view ::ascii_info_detail
1094 
1095     test:
1096       suffix: tet_0
1097     test:
1098       suffix: tet_1
1099       nsize: 2
1100       args: -petscpartitioner_type simple
1101 
1102   testset:
1103     args: -dm_plex_dim 3 -dm_plex_simplex 0 -dm_plex_box_faces 2,1,1 -dm_plex_box_upper 2,1,1 \
1104           -dm_refine 1 -dm_plex_transform_type cohesive_extrude \
1105             -dm_plex_transform_active fault -dm_plex_cohesive_label_fault 15 \
1106           -dm_view ::ascii_info_detail -coarse_dm_view ::ascii_info_detail
1107 
1108     test:
1109       suffix: hex_0
1110     test:
1111       suffix: hex_1
1112       nsize: 2
1113       args: -petscpartitioner_type simple
1114 
1115   test:
1116     suffix: hex_2
1117     nsize: 4
1118     args: -test_num 2 \
1119           -dm_refine 1 -dm_plex_transform_type cohesive_extrude \
1120             -dm_plex_transform_active fault \
1121           -dm_view ::ascii_info_detail -coarse_dm_view ::ascii_info_detail \
1122           -orientation_view -orientation_view_synchronized
1123 
1124   test:
1125     suffix: hex_3
1126     args: -dm_plex_dim 3 -dm_plex_simplex 0 -dm_plex_box_faces 2,1,2 -dm_plex_box_upper 2.,1.,2. \
1127             -dm_plex_cohesive_label_fault0 37,40 \
1128             -dm_plex_cohesive_label_fault1 26 \
1129           -f0_dm_refine 1 -f0_dm_plex_transform_type cohesive_extrude \
1130             -f0_dm_plex_transform_active fault0  -f0_coarse_dm_view ::ascii_info_detail \
1131           -f1_dm_refine 1 -f1_dm_plex_transform_type cohesive_extrude \
1132             -f1_dm_plex_transform_active fault1  -f1_coarse_dm_view ::ascii_info_detail \
1133           -dm_view ::ascii_info_detail
1134 
1135   test:
1136     suffix: hex_4
1137     args: -dm_plex_dim 3 -dm_plex_simplex 0 -dm_plex_box_faces 4,1,2 -dm_plex_box_upper 4.,1.,2. \
1138             -dm_plex_cohesive_label_fault0 65,68 \
1139             -dm_plex_cohesive_label_fault1 46 \
1140           -f0_dm_refine 1 -f0_dm_plex_transform_type cohesive_extrude \
1141             -f0_dm_plex_transform_active fault0  -f0_coarse_dm_view ::ascii_info_detail \
1142           -f1_dm_refine 1 -f1_dm_plex_transform_type cohesive_extrude \
1143             -f1_dm_plex_transform_active fault1  -f1_coarse_dm_view ::ascii_info_detail \
1144           -dm_view ::ascii_info_detail
1145 
1146 TEST*/
1147