1 static char help[] = "Tests for refinement of meshes created by hand\n\n";
2
3 #include <petscdmplex.h>
4
5 typedef struct {
6 PetscInt debug; /* The debugging level */
7 PetscInt dim; /* The topological mesh dimension */
8 PetscBool cellHybrid; /* Use a hybrid mesh */
9 PetscBool cellSimplex; /* Use simplices or hexes */
10 PetscBool testPartition; /* Use a fixed partitioning for testing */
11 PetscInt testNum; /* The particular mesh to test */
12 PetscBool uninterpolate; /* Uninterpolate the mesh at the end */
13 PetscBool reinterpolate; /* Reinterpolate the mesh at the end */
14 } AppCtx;
15
ProcessOptions(MPI_Comm comm,AppCtx * options)16 PetscErrorCode ProcessOptions(MPI_Comm comm, AppCtx *options)
17 {
18 PetscFunctionBegin;
19 options->debug = 0;
20 options->dim = 2;
21 options->cellHybrid = PETSC_TRUE;
22 options->cellSimplex = PETSC_TRUE;
23 options->testPartition = PETSC_TRUE;
24 options->testNum = 0;
25 options->uninterpolate = PETSC_FALSE;
26 options->reinterpolate = PETSC_FALSE;
27
28 PetscOptionsBegin(comm, "", "Meshing Problem Options", "DMPLEX");
29 PetscCall(PetscOptionsBoundedInt("-debug", "The debugging level", "ex4.c", options->debug, &options->debug, NULL, 0));
30 PetscCall(PetscOptionsRangeInt("-dim", "The topological mesh dimension", "ex4.c", options->dim, &options->dim, NULL, 1, 3));
31 PetscCall(PetscOptionsBool("-cell_hybrid", "Use a hybrid mesh", "ex4.c", options->cellHybrid, &options->cellHybrid, NULL));
32 PetscCall(PetscOptionsBool("-cell_simplex", "Use simplices if true, otherwise hexes", "ex4.c", options->cellSimplex, &options->cellSimplex, NULL));
33 PetscCall(PetscOptionsBool("-test_partition", "Use a fixed partition for testing", "ex4.c", options->testPartition, &options->testPartition, NULL));
34 PetscCall(PetscOptionsBoundedInt("-test_num", "The particular mesh to test", "ex4.c", options->testNum, &options->testNum, NULL, 0));
35 PetscCall(PetscOptionsBool("-uninterpolate", "Uninterpolate the mesh at the end", "ex4.c", options->uninterpolate, &options->uninterpolate, NULL));
36 PetscCall(PetscOptionsBool("-reinterpolate", "Reinterpolate the mesh at the end", "ex4.c", options->reinterpolate, &options->reinterpolate, NULL));
37 PetscOptionsEnd();
38 PetscFunctionReturn(PETSC_SUCCESS);
39 }
40
41 /* Two segments
42
43 2-------0-------3-------1-------4
44
45 become
46
47 4---0---7---1---5---2---8---3---6
48
49 */
CreateSimplex_1D(MPI_Comm comm,DM * dm)50 PetscErrorCode CreateSimplex_1D(MPI_Comm comm, DM *dm)
51 {
52 PetscInt depth = 1;
53 PetscMPIInt rank;
54
55 PetscFunctionBegin;
56 PetscCallMPI(MPI_Comm_rank(comm, &rank));
57 if (rank == 0) {
58 PetscInt numPoints[2] = {3, 2};
59 PetscInt coneSize[5] = {2, 2, 0, 0, 0};
60 PetscInt cones[4] = {2, 3, 3, 4};
61 PetscInt coneOrientations[16] = {0, 0, 0, 0};
62 PetscScalar vertexCoords[3] = {-1.0, 0.0, 1.0};
63
64 PetscCall(DMPlexCreateFromDAG(*dm, depth, numPoints, coneSize, cones, coneOrientations, vertexCoords));
65 } else {
66 PetscInt numPoints[2] = {0, 0};
67
68 PetscCall(DMPlexCreateFromDAG(*dm, depth, numPoints, NULL, NULL, NULL, NULL));
69 }
70 PetscFunctionReturn(PETSC_SUCCESS);
71 }
72
73 /* Two triangles
74 4
75 / | \
76 8 | 10
77 / | \
78 2 0 7 1 5
79 \ | /
80 6 | 9
81 \ | /
82 3
83
84 Becomes
85 10
86 / | \
87 21 | 26
88 / | \
89 14 2 20 4 16
90 /|\ | /|\
91 22 | 28 | 32 | 25
92 / | \ | / | 6\
93 8 29 3 13 7 31 11
94 \0 | / | \ | /
95 17 | 27 | 30 | 24
96 \|/ | \|/
97 12 1 19 5 15
98 \ | /
99 18 | 23
100 \ | /
101 9
102 */
CreateSimplex_2D(MPI_Comm comm,DM * dm)103 PetscErrorCode CreateSimplex_2D(MPI_Comm comm, DM *dm)
104 {
105 PetscInt depth = 2;
106 PetscMPIInt rank;
107
108 PetscFunctionBegin;
109 PetscCallMPI(MPI_Comm_rank(comm, &rank));
110 if (rank == 0) {
111 PetscInt numPoints[3] = {4, 5, 2};
112 PetscInt coneSize[11] = {3, 3, 0, 0, 0, 0, 2, 2, 2, 2, 2};
113 PetscInt cones[16] = {6, 7, 8, 7, 9, 10, 2, 3, 3, 4, 4, 2, 3, 5, 5, 4};
114 PetscInt coneOrientations[16] = {0, 0, 0, -1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0};
115 PetscScalar vertexCoords[8] = {-0.5, 0.0, 0.0, -0.5, 0.0, 0.5, 0.5, 0.0};
116
117 PetscCall(DMPlexCreateFromDAG(*dm, depth, numPoints, coneSize, cones, coneOrientations, vertexCoords));
118 } else {
119 PetscInt numPoints[3] = {0, 0, 0};
120
121 PetscCall(DMPlexCreateFromDAG(*dm, depth, numPoints, NULL, NULL, NULL, NULL));
122 }
123 PetscFunctionReturn(PETSC_SUCCESS);
124 }
125
126 /* Two triangles separated by a zero-volume cell with 4 vertices/2 edges
127 5--16--8
128 / | | \
129 11 | | 12
130 / | | \
131 3 0 10 2 14 1 6
132 \ | | /
133 9 | | 13
134 \ | | /
135 4--15--7
136 */
CreateSimplexHybrid_2D(MPI_Comm comm,PetscInt testNum,DM * dm)137 PetscErrorCode CreateSimplexHybrid_2D(MPI_Comm comm, PetscInt testNum, DM *dm)
138 {
139 DM idm, hdm = NULL;
140 DMLabel faultLabel, hybridLabel;
141 PetscInt p;
142 PetscMPIInt rank;
143
144 PetscFunctionBegin;
145 PetscCallMPI(MPI_Comm_rank(comm, &rank));
146 if (rank == 0) {
147 switch (testNum) {
148 case 0: {
149 PetscInt numPoints[2] = {4, 2};
150 PetscInt coneSize[6] = {3, 3, 0, 0, 0, 0};
151 PetscInt cones[6] = {2, 3, 4, 5, 4, 3};
152 PetscInt coneOrientations[6] = {0, 0, 0, 0, 0, 0};
153 PetscScalar vertexCoords[8] = {-1.0, -0.5, 0.0, -0.5, 0.0, 0.5, 1.0, 0.5};
154 PetscInt faultPoints[2] = {3, 4};
155
156 PetscCall(DMPlexCreateFromDAG(*dm, 1, numPoints, coneSize, cones, coneOrientations, vertexCoords));
157 for (p = 0; p < 2; ++p) PetscCall(DMSetLabelValue(*dm, "fault", faultPoints[p], 1));
158 } break;
159 case 1: {
160 PetscInt numPoints[2] = {5, 4};
161 PetscInt coneSize[9] = {3, 3, 3, 3, 0, 0, 0, 0, 0};
162 PetscInt cones[12] = {4, 5, 6, 6, 7, 4, 6, 5, 8, 6, 8, 7};
163 PetscInt coneOrientations[12] = {0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0};
164 PetscScalar vertexCoords[10] = {-1.0, 0.0, 0.0, -1.0, 0.0, 0.0, 0.0, 1.0, 1.0, 0.0};
165 PetscInt faultPoints[3] = {5, 6, 7};
166
167 PetscCall(DMPlexCreateFromDAG(*dm, 1, numPoints, coneSize, cones, coneOrientations, vertexCoords));
168 for (p = 0; p < 3; ++p) PetscCall(DMSetLabelValue(*dm, "fault", faultPoints[p], 1));
169 } break;
170 default:
171 SETERRQ(comm, PETSC_ERR_ARG_OUTOFRANGE, "No test mesh %" PetscInt_FMT, testNum);
172 }
173 PetscCall(DMPlexInterpolate(*dm, &idm));
174 PetscCall(PetscObjectSetOptionsPrefix((PetscObject)idm, "in_"));
175 PetscCall(DMPlexDistributeSetDefault(idm, PETSC_FALSE));
176 PetscCall(DMSetFromOptions(idm));
177 PetscCall(DMViewFromOptions(idm, NULL, "-dm_view"));
178 PetscCall(DMGetLabel(*dm, "fault", &faultLabel));
179 PetscCall(DMPlexCreateHybridMesh(idm, faultLabel, NULL, 0, &hybridLabel, NULL, NULL, &hdm));
180 PetscCall(DMLabelDestroy(&hybridLabel));
181 PetscCall(DMDestroy(&idm));
182 PetscCall(DMDestroy(dm));
183 *dm = hdm;
184 } else {
185 PetscInt numPoints[2] = {0, 0};
186
187 PetscCall(DMPlexCreateFromDAG(*dm, 1, numPoints, NULL, NULL, NULL, NULL));
188 PetscCall(DMPlexInterpolate(*dm, &idm));
189 PetscCall(PetscObjectSetOptionsPrefix((PetscObject)idm, "in_"));
190 PetscCall(DMPlexDistributeSetDefault(idm, PETSC_FALSE));
191 PetscCall(DMSetFromOptions(idm));
192 PetscCall(DMViewFromOptions(idm, NULL, "-dm_view"));
193 PetscCall(DMPlexCreateHybridMesh(idm, NULL, NULL, 0, NULL, NULL, NULL, &hdm));
194 PetscCall(DMDestroy(&idm));
195 PetscCall(DMDestroy(dm));
196 *dm = hdm;
197 }
198 PetscFunctionReturn(PETSC_SUCCESS);
199 }
200
201 /* Two quadrilaterals
202
203 5----10-----4----14-----7
204 | | |
205 | | |
206 | | |
207 11 0 9 1 13
208 | | |
209 | | |
210 | | |
211 2-----8-----3----12-----6
212 */
CreateTensorProduct_2D(MPI_Comm comm,PetscInt testNum,DM * dm)213 PetscErrorCode CreateTensorProduct_2D(MPI_Comm comm, PetscInt testNum, DM *dm)
214 {
215 PetscInt depth = 2;
216 PetscMPIInt rank;
217
218 PetscFunctionBegin;
219 PetscCallMPI(MPI_Comm_rank(comm, &rank));
220 if (rank == 0) {
221 PetscInt numPoints[3] = {6, 7, 2};
222 PetscInt coneSize[15] = {4, 4, 0, 0, 0, 0, 0, 0, 2, 2, 2, 2, 2, 2, 2};
223 PetscInt cones[22] = {8, 9, 10, 11, 12, 13, 14, 9, 2, 3, 3, 4, 4, 5, 5, 2, 3, 6, 6, 7, 7, 4};
224 PetscInt coneOrientations[22] = {0, 0, 0, 0, 0, 0, 0, -1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0};
225 PetscScalar vertexCoords[12] = {-1.0, -0.5, 0.0, -0.5, 0.0, 0.5, -1.0, 0.5, 1.0, -0.5, 1.0, 0.5};
226
227 PetscCall(DMPlexCreateFromDAG(*dm, depth, numPoints, coneSize, cones, coneOrientations, vertexCoords));
228 } else {
229 PetscInt numPoints[3] = {0, 0, 0};
230
231 PetscCall(DMPlexCreateFromDAG(*dm, depth, numPoints, NULL, NULL, NULL, NULL));
232 }
233 PetscFunctionReturn(PETSC_SUCCESS);
234 }
235
CreateTensorProductHybrid_2D(MPI_Comm comm,PetscInt testNum,DM * dm)236 PetscErrorCode CreateTensorProductHybrid_2D(MPI_Comm comm, PetscInt testNum, DM *dm)
237 {
238 DM idm, hdm = NULL;
239 DMLabel faultLabel, hybridLabel;
240 PetscInt p;
241 PetscMPIInt rank;
242
243 PetscFunctionBegin;
244 PetscCallMPI(MPI_Comm_rank(comm, &rank));
245 if (rank == 0) {
246 PetscInt numPoints[2] = {6, 2};
247 PetscInt coneSize[8] = {4, 4, 0, 0, 0, 0, 0, 0};
248 PetscInt cones[8] = {
249 2, 3, 4, 5, 3, 6, 7, 4,
250 };
251 PetscInt coneOrientations[8] = {0, 0, 0, 0, 0, 0, 0, 0};
252 PetscScalar vertexCoords[12] = {-1.0, -0.5, 0.0, -0.5, 0.0, 0.5, -1.0, 0.5, 1.0, -0.5, 1.0, 0.5};
253 PetscInt faultPoints[2] = {3, 4};
254
255 PetscCall(DMPlexCreateFromDAG(*dm, 1, numPoints, coneSize, cones, coneOrientations, vertexCoords));
256 for (p = 0; p < 2; ++p) PetscCall(DMSetLabelValue(*dm, "fault", faultPoints[p], 1));
257 PetscCall(DMPlexInterpolate(*dm, &idm));
258 PetscCall(PetscObjectSetOptionsPrefix((PetscObject)idm, "in_"));
259 PetscCall(DMPlexDistributeSetDefault(idm, PETSC_FALSE));
260 PetscCall(DMSetFromOptions(idm));
261 PetscCall(DMViewFromOptions(idm, NULL, "-dm_view"));
262 PetscCall(DMGetLabel(*dm, "fault", &faultLabel));
263 PetscCall(DMPlexCreateHybridMesh(idm, faultLabel, NULL, 0, &hybridLabel, NULL, NULL, &hdm));
264 PetscCall(DMLabelDestroy(&hybridLabel));
265 } else {
266 PetscInt numPoints[3] = {0, 0, 0};
267
268 PetscCall(DMPlexCreateFromDAG(*dm, 1, numPoints, NULL, NULL, NULL, NULL));
269 PetscCall(DMPlexInterpolate(*dm, &idm));
270 PetscCall(PetscObjectSetOptionsPrefix((PetscObject)idm, "in_"));
271 PetscCall(DMPlexDistributeSetDefault(idm, PETSC_FALSE));
272 PetscCall(DMSetFromOptions(idm));
273 PetscCall(DMViewFromOptions(idm, NULL, "-dm_view"));
274 PetscCall(DMPlexCreateHybridMesh(idm, NULL, NULL, 0, NULL, NULL, NULL, &hdm));
275 }
276 PetscCall(DMDestroy(&idm));
277 PetscCall(DMDestroy(dm));
278 *dm = hdm;
279 PetscFunctionReturn(PETSC_SUCCESS);
280 }
281
282 /* Two tetrahedrons
283
284 cell 5 5______ cell
285 0 / | \ |\ \ 1
286 17 | 18 | 18 13 21
287 /8 19 10\ 19 \ \
288 2-14-|----4 | 4--22--6
289 \ 9 | 7 / |10 / /
290 16 | 15 | 15 12 20
291 \ | / |/ /
292 3 3------
293 */
CreateSimplex_3D(MPI_Comm comm,PetscInt testNum,DM * dm)294 PetscErrorCode CreateSimplex_3D(MPI_Comm comm, PetscInt testNum, DM *dm)
295 {
296 DM idm;
297 PetscInt depth = 3;
298 PetscMPIInt rank;
299
300 PetscFunctionBegin;
301 PetscCallMPI(MPI_Comm_rank(comm, &rank));
302 if (rank == 0) {
303 switch (testNum) {
304 case 0: {
305 PetscInt numPoints[4] = {5, 9, 7, 2};
306 PetscInt coneSize[23] = {4, 4, 0, 0, 0, 0, 0, 3, 3, 3, 3, 3, 3, 3, 2, 2, 2, 2, 2, 2, 2, 2, 2};
307 PetscInt cones[47] = {7, 8, 9, 10, 10, 11, 12, 13, 14, 15, 16, 17, 18, 14, 16, 19, 17, 15, 18, 19, 20, 21, 19, 15, 22, 20, 18, 21, 22, 2, 4, 4, 3, 3, 2, 2, 5, 5, 4, 3, 5, 3, 6, 6, 5, 4, 6};
308 PetscInt coneOrientations[47] = {0, 0, 0, 0, -2, 0, 0, 0, 0, 0, 0, 0, 0, -1, -1, 0, -1, -1, -1, -1, 0, 0, -1, -1, 0, -1, -1, -1, -1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0};
309 PetscScalar vertexCoords[15] = {0.0, 0.0, -0.5, 0.0, -0.5, 0.0, 1.0, 0.0, 0.0, 0.0, 0.5, 0.0, 0.0, 0.0, 0.5};
310
311 PetscCall(DMPlexCreateFromDAG(*dm, depth, numPoints, coneSize, cones, coneOrientations, vertexCoords));
312 } break;
313 case 1: {
314 PetscInt numPoints[2] = {5, 2};
315 PetscInt coneSize[7] = {4, 4, 0, 0, 0, 0, 0};
316 PetscInt cones[8] = {4, 3, 5, 2, 5, 3, 4, 6};
317 PetscInt coneOrientations[8] = {0, 0, 0, 0, 0, 0, 0, 0};
318 PetscScalar vertexCoords[15] = {-1.0, 0.0, 0.0, 0.0, -1.0, 0.0, 0.0, 0.0, 1.0, 0.0, 1.0, 0.0, 1.0, 0.0, 0.0};
319
320 depth = 1;
321 PetscCall(DMPlexCreateFromDAG(*dm, depth, numPoints, coneSize, cones, coneOrientations, vertexCoords));
322 PetscCall(DMPlexInterpolate(*dm, &idm));
323 PetscCall(DMViewFromOptions(idm, NULL, "-in_dm_view"));
324 PetscCall(DMDestroy(dm));
325 *dm = idm;
326 } break;
327 case 2: {
328 PetscInt numPoints[2] = {4, 1};
329 PetscInt coneSize[5] = {4, 0, 0, 0, 0};
330 PetscInt cones[4] = {2, 3, 4, 1};
331 PetscInt coneOrientations[4] = {0, 0, 0, 0};
332 PetscScalar vertexCoords[12] = {0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 1.0};
333
334 depth = 1;
335 PetscCall(DMPlexCreateFromDAG(*dm, depth, numPoints, coneSize, cones, coneOrientations, vertexCoords));
336 PetscCall(DMPlexInterpolate(*dm, &idm));
337 PetscCall(DMViewFromOptions(idm, NULL, "-in_dm_view"));
338 PetscCall(DMDestroy(dm));
339 *dm = idm;
340 } break;
341 default:
342 SETERRQ(comm, PETSC_ERR_ARG_OUTOFRANGE, "No test mesh %" PetscInt_FMT, testNum);
343 }
344 } else {
345 PetscInt numPoints[4] = {0, 0, 0, 0};
346
347 PetscCall(DMPlexCreateFromDAG(*dm, depth, numPoints, NULL, NULL, NULL, NULL));
348 switch (testNum) {
349 case 1:
350 PetscCall(DMPlexInterpolate(*dm, &idm));
351 PetscCall(DMViewFromOptions(idm, NULL, "-in_dm_view"));
352 PetscCall(DMDestroy(dm));
353 *dm = idm;
354 break;
355 }
356 }
357 PetscFunctionReturn(PETSC_SUCCESS);
358 }
359
360 /* Two tetrahedrons separated by a zero-volume cell with 6 vertices
361
362 cell 6 ___33___10______ cell
363 0 / | \ |\ \ 1
364 21 | 23 | 29 27
365 /12 24 14\ 30 \ \
366 3-20-|----5--32-|---9--26--7
367 \ 13| 11/ |18 / /
368 19 | 22 | 28 25
369 \ | / |/ /
370 4----31----8------
371 cell 2
372 */
CreateSimplexHybrid_3D(MPI_Comm comm,PetscInt testNum,DM * dm)373 PetscErrorCode CreateSimplexHybrid_3D(MPI_Comm comm, PetscInt testNum, DM *dm)
374 {
375 DM idm, hdm = NULL;
376 DMLabel faultLabel, hybridLabel;
377 PetscInt p;
378 PetscMPIInt rank;
379
380 PetscFunctionBegin;
381 PetscCallMPI(MPI_Comm_rank(comm, &rank));
382 if (rank == 0) {
383 switch (testNum) {
384 case 0: {
385 PetscInt numPoints[2] = {5, 2};
386 PetscInt coneSize[7] = {4, 4, 0, 0, 0, 0, 0};
387 PetscInt cones[8] = {4, 3, 5, 2, 5, 3, 4, 6};
388 PetscInt coneOrientations[8] = {0, 0, 0, 0, 0, 0, 0, 0};
389 PetscScalar vertexCoords[15] = {-1.0, 0.0, 0.0, 0.0, -1.0, 0.0, 0.0, 0.0, 1.0, 0.0, 1.0, 0.0, 1.0, 0.0, 0.0};
390 PetscInt faultPoints[3] = {3, 4, 5};
391
392 PetscCall(DMPlexCreateFromDAG(*dm, 1, numPoints, coneSize, cones, coneOrientations, vertexCoords));
393 for (p = 0; p < 3; ++p) PetscCall(DMSetLabelValue(*dm, "fault", faultPoints[p], 1));
394 } break;
395 case 1: {
396 /* Tets 0,3,5 and 1,2,4 */
397 PetscInt numPoints[2] = {9, 6};
398 PetscInt coneSize[15] = {4, 4, 4, 4, 4, 4, 0, 0, 0, 0, 0, 0, 0, 0, 0};
399 PetscInt cones[24] = {7, 8, 9, 6, 11, 13, 9, 14, 10, 11, 13, 9, 9, 10, 11, 7, 9, 14, 13, 12, 7, 8, 11, 9};
400 PetscInt coneOrientations[24] = {0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0};
401 PetscScalar vertexCoords[27] = {-2.0, -1.0, 0.0, -2.0, 0.0, 0.0, -2.0, 0.0, 1.0, 0.0, -1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 2.0, -1.0, 0.0, 2.0, 0.0, 0.0, 2.0, 0.0, 1.0};
402 PetscInt faultPoints[3] = {9, 10, 11};
403
404 PetscCall(DMPlexCreateFromDAG(*dm, 1, numPoints, coneSize, cones, coneOrientations, vertexCoords));
405 for (p = 0; p < 3; ++p) PetscCall(DMSetLabelValue(*dm, "fault", faultPoints[p], 1));
406 } break;
407 default:
408 SETERRQ(comm, PETSC_ERR_ARG_OUTOFRANGE, "No test mesh %" PetscInt_FMT, testNum);
409 }
410 PetscCall(DMPlexInterpolate(*dm, &idm));
411 PetscCall(PetscObjectSetOptionsPrefix((PetscObject)idm, "in_"));
412 PetscCall(DMPlexDistributeSetDefault(idm, PETSC_FALSE));
413 PetscCall(DMSetFromOptions(idm));
414 PetscCall(DMViewFromOptions(idm, NULL, "-dm_view"));
415 PetscCall(DMGetLabel(*dm, "fault", &faultLabel));
416 PetscCall(DMPlexCreateHybridMesh(idm, faultLabel, NULL, 0, &hybridLabel, NULL, NULL, &hdm));
417 PetscCall(DMLabelDestroy(&hybridLabel));
418 PetscCall(DMDestroy(&idm));
419 PetscCall(DMDestroy(dm));
420 *dm = hdm;
421 } else {
422 PetscInt numPoints[4] = {0, 0, 0, 0};
423
424 PetscCall(DMPlexCreateFromDAG(*dm, 1, numPoints, NULL, NULL, NULL, NULL));
425 PetscCall(DMPlexInterpolate(*dm, &idm));
426 PetscCall(PetscObjectSetOptionsPrefix((PetscObject)idm, "in_"));
427 PetscCall(DMPlexDistributeSetDefault(idm, PETSC_FALSE));
428 PetscCall(DMSetFromOptions(idm));
429 PetscCall(DMViewFromOptions(idm, NULL, "-dm_view"));
430 PetscCall(DMPlexCreateHybridMesh(idm, NULL, NULL, 0, NULL, NULL, NULL, &hdm));
431 PetscCall(DMDestroy(&idm));
432 PetscCall(DMDestroy(dm));
433 *dm = hdm;
434 }
435 PetscFunctionReturn(PETSC_SUCCESS);
436 }
437
CreateTensorProduct_3D(MPI_Comm comm,PetscInt testNum,DM * dm)438 PetscErrorCode CreateTensorProduct_3D(MPI_Comm comm, PetscInt testNum, DM *dm)
439 {
440 DM idm;
441 PetscMPIInt rank;
442
443 PetscFunctionBegin;
444 PetscCallMPI(MPI_Comm_rank(comm, &rank));
445 if (rank == 0) {
446 switch (testNum) {
447 case 0: {
448 PetscInt numPoints[2] = {12, 2};
449 PetscInt coneSize[14] = {8, 8, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0};
450 PetscInt cones[16] = {2, 3, 4, 5, 6, 7, 8, 9, 5, 4, 10, 11, 7, 12, 13, 8};
451 PetscInt coneOrientations[16] = {0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0};
452 PetscScalar vertexCoords[36] = {-1.0, -0.5, -0.5, -1.0, 0.5, -0.5, 0.0, 0.5, -0.5, 0.0, -0.5, -0.5, -1.0, -0.5, 0.5, 0.0, -0.5, 0.5, 0.0, 0.5, 0.5, -1.0, 0.5, 0.5, 1.0, 0.5, -0.5, 1.0, -0.5, -0.5, 1.0, -0.5, 0.5, 1.0, 0.5, 0.5};
453
454 PetscCall(DMPlexCreateFromDAG(*dm, 1, numPoints, coneSize, cones, coneOrientations, vertexCoords));
455 } break;
456 case 1: {
457 PetscInt numPoints[2] = {8, 1};
458 PetscInt coneSize[9] = {8, 0, 0, 0, 0, 0, 0, 0, 0};
459 PetscInt cones[8] = {1, 2, 3, 4, 5, 6, 7, 8};
460 PetscInt coneOrientations[8] = {0, 0, 0, 0, 0, 0, 0, 0};
461 PetscScalar vertexCoords[24] = {-1.0, -1.0, -1.0, -1.0, 1.0, -1.0, 1.0, 1.0, -1.0, 1.0, -1.0, -1.0, -1.0, -1.0, 1.0, 1.0, -1.0, 1.0, 1.0, 1.0, 1.0, -1.0, 1.0, 1.0};
462
463 PetscCall(DMPlexCreateFromDAG(*dm, 1, numPoints, coneSize, cones, coneOrientations, vertexCoords));
464 } break;
465 default:
466 SETERRQ(comm, PETSC_ERR_ARG_OUTOFRANGE, "No test mesh %" PetscInt_FMT, testNum);
467 }
468 } else {
469 PetscInt numPoints[4] = {0, 0, 0, 0};
470
471 PetscCall(DMPlexCreateFromDAG(*dm, 1, numPoints, NULL, NULL, NULL, NULL));
472 }
473 PetscCall(DMPlexInterpolate(*dm, &idm));
474 PetscCall(DMViewFromOptions(idm, NULL, "-in_dm_view"));
475 PetscCall(DMDestroy(dm));
476 *dm = idm;
477 PetscFunctionReturn(PETSC_SUCCESS);
478 }
479
CreateTensorProductHybrid_3D(MPI_Comm comm,PetscInt testNum,DM * dm)480 PetscErrorCode CreateTensorProductHybrid_3D(MPI_Comm comm, PetscInt testNum, DM *dm)
481 {
482 DM idm, hdm = NULL;
483 DMLabel faultLabel;
484 PetscInt p;
485 PetscMPIInt rank;
486
487 PetscFunctionBegin;
488 PetscCallMPI(MPI_Comm_rank(comm, &rank));
489 if (rank == 0) {
490 switch (testNum) {
491 case 0: {
492 PetscInt numPoints[2] = {12, 2};
493 PetscInt coneSize[14] = {8, 8, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0};
494 PetscInt cones[16] = {2, 3, 4, 5, 6, 7, 8, 9, 5, 4, 10, 11, 7, 12, 13, 8};
495 PetscInt coneOrientations[16] = {0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0};
496 PetscScalar vertexCoords[36] = {-1.0, -0.5, -0.5, -1.0, 0.5, -0.5, 0.0, 0.5, -0.5, 0.0, -0.5, -0.5, -1.0, -0.5, 0.5, 0.0, -0.5, 0.5, 0.0, 0.5, 0.5, -1.0, 0.5, 0.5, 1.0, 0.5, -0.5, 1.0, -0.5, -0.5, 1.0, -0.5, 0.5, 1.0, 0.5, 0.5};
497 PetscInt faultPoints[4] = {2, 3, 5, 6};
498
499 PetscCall(DMPlexCreateFromDAG(*dm, 1, numPoints, coneSize, cones, coneOrientations, vertexCoords));
500 for (p = 0; p < 4; ++p) PetscCall(DMSetLabelValue(*dm, "fault", faultPoints[p], 1));
501 } break;
502 case 1: {
503 PetscInt numPoints[2] = {30, 7};
504 PetscInt coneSize[37] = {8, 8, 8, 8, 8, 8, 8, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0};
505 PetscInt cones[56] = {8, 21, 20, 7, 13, 12, 23, 24, 14, 15, 10, 9, 13, 8, 21, 24, 15, 16, 11, 10, 24, 21, 22, 25, 30, 29, 28, 21, 35, 24, 33, 34, 24, 21, 30, 35, 25, 36, 31, 22, 27, 20, 21, 28, 32, 33, 24, 23, 15, 24, 13, 14, 19, 18, 17, 26};
506 PetscInt coneOrientations[56] = {0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0};
507 PetscScalar vertexCoords[90] = {-2.0, -2.0, -2.0, -2.0, -1.0, -2.0, -3.0, 0.0, -2.0, -2.0, 1.0, -2.0, -2.0, 2.0, -2.0, -2.0, -2.0, 0.0, -2.0, -1.0, 0.0, -3.0, 0.0, 0.0, -2.0, 1.0, 0.0, -2.0, 2.0, 0.0,
508 -2.0, -1.0, 2.0, -3.0, 0.0, 2.0, -2.0, 1.0, 2.0, 0.0, -2.0, -2.0, 0.0, 0.0, -2.0, 0.0, 2.0, -2.0, 0.0, -2.0, 0.0, 0.0, 0.0, 0.0, 0.0, 2.0, 0.0, 0.0, 0.0, 2.0,
509 2.0, -2.0, -2.0, 2.0, -1.0, -2.0, 3.0, 0.0, -2.0, 2.0, 1.0, -2.0, 2.0, 2.0, -2.0, 2.0, -2.0, 0.0, 2.0, -1.0, 0.0, 3.0, 0.0, 0.0, 2.0, 1.0, 0.0, 2.0, 2.0, 0.0};
510 PetscInt faultPoints[6] = {20, 21, 22, 23, 24, 25};
511
512 PetscCall(DMPlexCreateFromDAG(*dm, 1, numPoints, coneSize, cones, coneOrientations, vertexCoords));
513 for (p = 0; p < 6; ++p) PetscCall(DMSetLabelValue(*dm, "fault", faultPoints[p], 1));
514 } break;
515 default:
516 SETERRQ(comm, PETSC_ERR_ARG_OUTOFRANGE, "No test mesh %" PetscInt_FMT, testNum);
517 }
518 PetscCall(DMPlexInterpolate(*dm, &idm));
519 PetscCall(PetscObjectSetOptionsPrefix((PetscObject)idm, "in_"));
520 PetscCall(DMPlexDistributeSetDefault(idm, PETSC_FALSE));
521 PetscCall(DMSetFromOptions(idm));
522 PetscCall(DMViewFromOptions(idm, NULL, "-dm_view"));
523 PetscCall(DMGetLabel(*dm, "fault", &faultLabel));
524 PetscCall(DMPlexCreateHybridMesh(idm, faultLabel, NULL, 0, NULL, NULL, NULL, &hdm));
525 PetscCall(DMDestroy(&idm));
526 PetscCall(DMDestroy(dm));
527 *dm = hdm;
528 } else {
529 PetscInt numPoints[4] = {0, 0, 0, 0};
530
531 PetscCall(DMPlexCreateFromDAG(*dm, 1, numPoints, NULL, NULL, NULL, NULL));
532 PetscCall(DMPlexInterpolate(*dm, &idm));
533 PetscCall(PetscObjectSetOptionsPrefix((PetscObject)idm, "in_"));
534 PetscCall(DMPlexDistributeSetDefault(idm, PETSC_FALSE));
535 PetscCall(DMSetFromOptions(idm));
536 PetscCall(DMViewFromOptions(idm, NULL, "-dm_view"));
537 PetscCall(DMPlexCreateHybridMesh(idm, NULL, NULL, 0, NULL, NULL, NULL, &hdm));
538 PetscCall(DMDestroy(&idm));
539 PetscCall(DMDestroy(dm));
540 *dm = hdm;
541 }
542 PetscFunctionReturn(PETSC_SUCCESS);
543 }
544
CreateMesh(MPI_Comm comm,AppCtx * user,DM * dm)545 PetscErrorCode CreateMesh(MPI_Comm comm, AppCtx *user, DM *dm)
546 {
547 PetscInt dim = user->dim;
548 PetscBool cellHybrid = user->cellHybrid;
549 PetscBool cellSimplex = user->cellSimplex;
550 PetscMPIInt rank, size;
551
552 PetscFunctionBegin;
553 PetscCallMPI(MPI_Comm_rank(comm, &rank));
554 PetscCallMPI(MPI_Comm_size(comm, &size));
555 PetscCall(DMCreate(comm, dm));
556 PetscCall(DMSetType(*dm, DMPLEX));
557 PetscCall(DMSetDimension(*dm, dim));
558 switch (dim) {
559 case 1:
560 PetscCheck(!cellHybrid, comm, PETSC_ERR_ARG_OUTOFRANGE, "Cannot make hybrid meshes for dimension %" PetscInt_FMT, dim);
561 PetscCall(CreateSimplex_1D(comm, dm));
562 break;
563 case 2:
564 if (cellSimplex) {
565 if (cellHybrid) {
566 PetscCall(CreateSimplexHybrid_2D(comm, user->testNum, dm));
567 } else {
568 PetscCall(CreateSimplex_2D(comm, dm));
569 }
570 } else {
571 if (cellHybrid) {
572 PetscCall(CreateTensorProductHybrid_2D(comm, user->testNum, dm));
573 } else {
574 PetscCall(CreateTensorProduct_2D(comm, user->testNum, dm));
575 }
576 }
577 break;
578 case 3:
579 if (cellSimplex) {
580 if (cellHybrid) {
581 PetscCall(CreateSimplexHybrid_3D(comm, user->testNum, dm));
582 } else {
583 PetscCall(CreateSimplex_3D(comm, user->testNum, dm));
584 }
585 } else {
586 if (cellHybrid) {
587 PetscCall(CreateTensorProductHybrid_3D(comm, user->testNum, dm));
588 } else {
589 PetscCall(CreateTensorProduct_3D(comm, user->testNum, dm));
590 }
591 }
592 break;
593 default:
594 SETERRQ(comm, PETSC_ERR_ARG_OUTOFRANGE, "Cannot make meshes for dimension %" PetscInt_FMT, dim);
595 }
596 if (user->testPartition && size > 1) {
597 PetscPartitioner part;
598 PetscInt *sizes = NULL;
599 PetscInt *points = NULL;
600
601 if (rank == 0) {
602 if (dim == 2 && cellSimplex && !cellHybrid && size == 2) {
603 switch (user->testNum) {
604 case 0: {
605 PetscInt triSizes_p2[2] = {1, 1};
606 PetscInt triPoints_p2[2] = {0, 1};
607
608 PetscCall(PetscMalloc2(2, &sizes, 2, &points));
609 PetscCall(PetscArraycpy(sizes, triSizes_p2, 2));
610 PetscCall(PetscArraycpy(points, triPoints_p2, 2));
611 break;
612 }
613 default:
614 SETERRQ(PETSC_COMM_WORLD, PETSC_ERR_ARG_WRONG, "Could not find matching test number %" PetscInt_FMT " for triangular mesh on 2 procs", user->testNum);
615 }
616 } else if (dim == 2 && cellSimplex && cellHybrid && size == 2) {
617 switch (user->testNum) {
618 case 0: {
619 PetscInt triSizes_p2[2] = {1, 2};
620 PetscInt triPoints_p2[3] = {0, 1, 2};
621
622 PetscCall(PetscMalloc2(2, &sizes, 3, &points));
623 PetscCall(PetscArraycpy(sizes, triSizes_p2, 2));
624 PetscCall(PetscArraycpy(points, triPoints_p2, 3));
625 break;
626 }
627 default:
628 SETERRQ(PETSC_COMM_WORLD, PETSC_ERR_ARG_WRONG, "Could not find matching test number %" PetscInt_FMT " for triangular hybrid mesh on 2 procs", user->testNum);
629 }
630 } else if (dim == 2 && !cellSimplex && !cellHybrid && size == 2) {
631 switch (user->testNum) {
632 case 0: {
633 PetscInt quadSizes_p2[2] = {1, 1};
634 PetscInt quadPoints_p2[2] = {0, 1};
635
636 PetscCall(PetscMalloc2(2, &sizes, 2, &points));
637 PetscCall(PetscArraycpy(sizes, quadSizes_p2, 2));
638 PetscCall(PetscArraycpy(points, quadPoints_p2, 2));
639 break;
640 }
641 default:
642 SETERRQ(PETSC_COMM_WORLD, PETSC_ERR_ARG_WRONG, "Could not find matching test number %" PetscInt_FMT " for quadrilateral mesh on 2 procs", user->testNum);
643 }
644 } else if (dim == 2 && !cellSimplex && cellHybrid && size == 2) {
645 switch (user->testNum) {
646 case 0: {
647 PetscInt quadSizes_p2[2] = {1, 2};
648 PetscInt quadPoints_p2[3] = {0, 1, 2};
649
650 PetscCall(PetscMalloc2(2, &sizes, 3, &points));
651 PetscCall(PetscArraycpy(sizes, quadSizes_p2, 2));
652 PetscCall(PetscArraycpy(points, quadPoints_p2, 3));
653 break;
654 }
655 default:
656 SETERRQ(PETSC_COMM_WORLD, PETSC_ERR_ARG_WRONG, "Could not find matching test number %" PetscInt_FMT " for quadrilateral hybrid mesh on 2 procs", user->testNum);
657 }
658 } else if (dim == 3 && cellSimplex && !cellHybrid && size == 2) {
659 switch (user->testNum) {
660 case 0: {
661 PetscInt tetSizes_p2[2] = {1, 1};
662 PetscInt tetPoints_p2[2] = {0, 1};
663
664 PetscCall(PetscMalloc2(2, &sizes, 2, &points));
665 PetscCall(PetscArraycpy(sizes, tetSizes_p2, 2));
666 PetscCall(PetscArraycpy(points, tetPoints_p2, 2));
667 break;
668 }
669 case 1: {
670 PetscInt tetSizes_p2[2] = {1, 1};
671 PetscInt tetPoints_p2[2] = {0, 1};
672
673 PetscCall(PetscMalloc2(2, &sizes, 2, &points));
674 PetscCall(PetscArraycpy(sizes, tetSizes_p2, 2));
675 PetscCall(PetscArraycpy(points, tetPoints_p2, 2));
676 break;
677 }
678 default:
679 SETERRQ(PETSC_COMM_WORLD, PETSC_ERR_ARG_WRONG, "Could not find matching test number %" PetscInt_FMT " for tetrahedral mesh on 2 procs", user->testNum);
680 }
681 } else if (dim == 3 && cellSimplex && cellHybrid && size == 2) {
682 switch (user->testNum) {
683 case 0: {
684 PetscInt tetSizes_p2[2] = {1, 2};
685 PetscInt tetPoints_p2[3] = {0, 1, 2};
686
687 PetscCall(PetscMalloc2(2, &sizes, 3, &points));
688 PetscCall(PetscArraycpy(sizes, tetSizes_p2, 2));
689 PetscCall(PetscArraycpy(points, tetPoints_p2, 3));
690 break;
691 }
692 case 1: {
693 PetscInt tetSizes_p2[2] = {3, 4};
694 PetscInt tetPoints_p2[7] = {0, 3, 5, 1, 2, 4, 6};
695
696 PetscCall(PetscMalloc2(2, &sizes, 7, &points));
697 PetscCall(PetscArraycpy(sizes, tetSizes_p2, 2));
698 PetscCall(PetscArraycpy(points, tetPoints_p2, 7));
699 break;
700 }
701 default:
702 SETERRQ(PETSC_COMM_WORLD, PETSC_ERR_ARG_WRONG, "Could not find matching test number %" PetscInt_FMT " for tetrahedral hybrid mesh on 2 procs", user->testNum);
703 }
704 } else if (dim == 3 && !cellSimplex && !cellHybrid && size == 2) {
705 switch (user->testNum) {
706 case 0: {
707 PetscInt hexSizes_p2[2] = {1, 1};
708 PetscInt hexPoints_p2[2] = {0, 1};
709
710 PetscCall(PetscMalloc2(2, &sizes, 2, &points));
711 PetscCall(PetscArraycpy(sizes, hexSizes_p2, 2));
712 PetscCall(PetscArraycpy(points, hexPoints_p2, 2));
713 break;
714 }
715 default:
716 SETERRQ(PETSC_COMM_WORLD, PETSC_ERR_ARG_WRONG, "Could not find matching test number %" PetscInt_FMT " for hexahedral mesh on 2 procs", user->testNum);
717 }
718 } else if (dim == 3 && !cellSimplex && cellHybrid && size == 2) {
719 switch (user->testNum) {
720 case 0: {
721 PetscInt hexSizes_p2[2] = {1, 1};
722 PetscInt hexPoints_p2[2] = {0, 1};
723
724 PetscCall(PetscMalloc2(2, &sizes, 2, &points));
725 PetscCall(PetscArraycpy(sizes, hexSizes_p2, 2));
726 PetscCall(PetscArraycpy(points, hexPoints_p2, 2));
727 break;
728 }
729 case 1: {
730 PetscInt hexSizes_p2[2] = {5, 4};
731 PetscInt hexPoints_p2[9] = {3, 4, 5, 7, 8, 0, 1, 2, 6};
732
733 PetscCall(PetscMalloc2(2, &sizes, 9, &points));
734 PetscCall(PetscArraycpy(sizes, hexSizes_p2, 2));
735 PetscCall(PetscArraycpy(points, hexPoints_p2, 9));
736 break;
737 }
738 default:
739 SETERRQ(PETSC_COMM_WORLD, PETSC_ERR_ARG_WRONG, "Could not find matching test number %" PetscInt_FMT " for hexahedral hybrid mesh on 2 procs", user->testNum);
740 }
741 } else SETERRQ(PETSC_COMM_WORLD, PETSC_ERR_ARG_WRONG, "Could not find matching test partition");
742 }
743 PetscCall(DMPlexGetPartitioner(*dm, &part));
744 PetscCall(PetscPartitionerSetType(part, PETSCPARTITIONERSHELL));
745 PetscCall(PetscPartitionerShellSetPartition(part, size, sizes, points));
746 PetscCall(PetscFree2(sizes, points));
747 } else {
748 PetscPartitioner part;
749
750 PetscCall(DMPlexGetPartitioner(*dm, &part));
751 PetscCall(PetscPartitionerSetFromOptions(part));
752 }
753 {
754 DM pdm = NULL;
755
756 PetscCall(DMPlexDistribute(*dm, 0, NULL, &pdm));
757 if (pdm) {
758 PetscCall(DMViewFromOptions(pdm, NULL, "-dm_view"));
759 PetscCall(DMDestroy(dm));
760 *dm = pdm;
761 }
762 }
763 PetscCall(DMPlexDistributeSetDefault(*dm, PETSC_FALSE));
764 PetscCall(DMViewFromOptions(*dm, NULL, "-dm_view_pre"));
765 PetscCall(DMSetFromOptions(*dm));
766 if (user->uninterpolate || user->reinterpolate) {
767 DM udm = NULL;
768
769 PetscCall(DMPlexUninterpolate(*dm, &udm));
770 PetscCall(DMPlexCopyCoordinates(*dm, udm));
771 PetscCall(DMDestroy(dm));
772 *dm = udm;
773 }
774 if (user->reinterpolate) {
775 DM idm = NULL;
776
777 PetscCall(DMPlexInterpolate(*dm, &idm));
778 PetscCall(DMPlexCopyCoordinates(*dm, idm));
779 PetscCall(DMDestroy(dm));
780 *dm = idm;
781 }
782 PetscCall(DMPlexDistributeSetDefault(*dm, PETSC_FALSE));
783 PetscCall(PetscObjectSetName((PetscObject)*dm, "Hybrid Mesh"));
784 PetscCall(DMViewFromOptions(*dm, NULL, "-dm_view"));
785 PetscCall(PetscObjectSetOptionsPrefix((PetscObject)*dm, "hyb_"));
786 PetscCall(DMSetFromOptions(*dm));
787 PetscFunctionReturn(PETSC_SUCCESS);
788 }
789
main(int argc,char ** argv)790 int main(int argc, char **argv)
791 {
792 DM dm;
793 AppCtx user; /* user-defined work context */
794
795 PetscFunctionBeginUser;
796 PetscCall(PetscInitialize(&argc, &argv, NULL, help));
797 PetscCall(ProcessOptions(PETSC_COMM_WORLD, &user));
798 PetscCall(CreateMesh(PETSC_COMM_WORLD, &user, &dm));
799 PetscCall(DMDestroy(&dm));
800 PetscCall(PetscFinalize());
801 return 0;
802 }
803
804 /*TEST
805
806 # 1D Simplex 29-31
807 testset:
808 args: -dim 1 -cell_hybrid 0 -hyb_dm_plex_check_all -dm_plex_check_all
809 output_file: output/empty.out
810 test:
811 suffix: 29
812 test:
813 suffix: 30
814 args: -dm_refine 1
815 test:
816 suffix: 31
817 args: -dm_refine 5
818
819 # 2D Simplex 0-3
820 testset:
821 args: -dim 2 -cell_hybrid 0 -hyb_dm_plex_check_all -dm_plex_check_all
822 output_file: output/empty.out
823 test:
824 suffix: 0
825 test:
826 suffix: 1
827 args: -dm_refine 1
828 test:
829 suffix: 2
830 nsize: 2
831 test:
832 suffix: 3
833 nsize: 2
834 args: -dm_refine 1
835 test:
836 suffix: 32
837 args: -dm_refine 1 -uninterpolate
838 test:
839 suffix: 33
840 nsize: 2
841 args: -dm_refine 1 -uninterpolate
842 test:
843 suffix: 34
844 nsize: 2
845 args: -dm_refine 3 -uninterpolate
846
847 # 2D Hybrid Simplex 4-7
848 testset:
849 args: -dim 2 -hyb_dm_plex_check_all -in_dm_plex_check_all -dm_plex_check_all
850 output_file: output/empty.out
851 test:
852 suffix: 4
853 test:
854 suffix: 5
855 args: -dm_refine 1
856 test:
857 suffix: 6
858 nsize: 2
859 test:
860 suffix: 7
861 nsize: 2
862 args: -dm_refine 1
863 test:
864 suffix: 24
865 args: -test_num 1 -dm_refine 1
866
867 # 2D Quad 12-13
868 testset:
869 args: -dim 2 -cell_simplex 0 -cell_hybrid 0 -hyb_dm_plex_check_all -dm_plex_check_all
870 output_file: output/empty.out
871 test:
872 suffix: 12
873 args: -dm_refine 1
874 test:
875 suffix: 13
876 nsize: 2
877 args: -dm_refine 1
878
879 # 2D Hybrid Quad 27-28
880 testset:
881 args: -dim 2 -cell_simplex 0 -hyb_dm_plex_check_all -in_dm_plex_check_all -dm_plex_check_all
882 output_file: output/empty.out
883 test:
884 suffix: 27
885 args: -dm_refine 1
886 test:
887 suffix: 28
888 nsize: 2
889 args: -dm_refine 1
890
891 # 3D Simplex 8-11
892 testset:
893 args: -dim 3 -cell_hybrid 0 -hyb_dm_plex_check_all -dm_plex_check_all
894 output_file: output/empty.out
895 test:
896 suffix: 8
897 args: -dm_refine 1
898 test:
899 suffix: 9
900 nsize: 2
901 args: -dm_refine 1
902 test:
903 suffix: 10
904 args: -test_num 1 -dm_refine 1
905 test:
906 suffix: 11
907 nsize: 2
908 args: -test_num 1 -dm_refine 1
909 test:
910 suffix: 25
911 args: -test_num 2 -dm_refine 2
912
913 # 3D Hybrid Simplex 16-19
914 testset:
915 args: -dim 3 -hyb_dm_plex_check_all -in_dm_plex_check_all -dm_plex_check_all
916 output_file: output/empty.out
917 test:
918 suffix: 16
919 args: -dm_refine 1
920 test:
921 suffix: 17
922 nsize: 2
923 args: -dm_refine 1
924 test:
925 suffix: 18
926 args: -test_num 1 -dm_refine 1
927 test:
928 suffix: 19
929 nsize: 2
930 args: -test_num 1 -dm_refine 1
931
932 # 3D Hex 14-15
933 testset:
934 args: -dim 3 -cell_simplex 0 -cell_hybrid 0 -hyb_dm_plex_check_all -dm_plex_check_all
935 output_file: output/empty.out
936 test:
937 suffix: 14
938 args: -dm_refine 1
939 test:
940 suffix: 15
941 nsize: 2
942 args: -dm_refine 1
943 test:
944 suffix: 26
945 args: -test_num 1 -dm_refine 2
946
947 # 3D Hybrid Hex 20-23
948 testset:
949 args: -dim 3 -cell_simplex 0 -hyb_dm_plex_check_all -in_dm_plex_check_all -dm_plex_check_all
950 output_file: output/empty.out
951 test:
952 suffix: 20
953 args: -dm_refine 1
954 test:
955 suffix: 21
956 nsize: 2
957 args: -dm_refine 1
958 test:
959 suffix: 22
960 args: -test_num 1 -dm_refine 1
961 test:
962 suffix: 23
963 nsize: 2
964 args: -test_num 1 -dm_refine 1
965
966 # Hybrid interpolation
967 # TODO Setup new tests (like -reinterpolate) that interpolate hybrid cells
968 testset:
969 nsize: 2
970 args: -test_partition 0 -petscpartitioner_type simple -dm_view -hyb_dm_plex_check_all -in_dm_plex_check_all -dm_plex_check_all
971 test:
972 suffix: hybint_2d_0
973 args: -dim 2 -dm_refine 2
974 test:
975 suffix: hybint_2d_1
976 args: -dim 2 -dm_refine 2 -test_num 1
977 test:
978 suffix: hybint_3d_0
979 args: -dim 3 -dm_refine 1
980 test:
981 suffix: hybint_3d_1
982 args: -dim 3 -dm_refine 1 -test_num 1
983
984 TEST*/
985