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
ProcessOptions(MPI_Comm comm,AppCtx * options)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
CreateQuadMesh1(MPI_Comm comm,AppCtx * user,DM * dm)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
CreateHexMesh1(MPI_Comm comm,AppCtx * user,DM * dm)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
CreateMesh(MPI_Comm comm,AppCtx * user,DM * dm)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
main(int argc,char ** argv)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