xref: /petsc/src/dm/impls/plex/tests/ex4.c (revision 7f9d8d6c43f7fbbdd5907f9e37b46cde7806873b)
154fcfd0cSMatthew G. Knepley static char help[] = "Tests for refinement of meshes created by hand\n\n";
2c4762a1bSJed Brown 
3c4762a1bSJed Brown #include <petscdmplex.h>
4c4762a1bSJed Brown 
5c4762a1bSJed Brown typedef struct {
6c4762a1bSJed Brown   PetscInt  debug;          /* The debugging level */
7c4762a1bSJed Brown   PetscInt  dim;            /* The topological mesh dimension */
8c4762a1bSJed Brown   PetscBool cellHybrid;     /* Use a hybrid mesh */
9c4762a1bSJed Brown   PetscBool cellSimplex;    /* Use simplices or hexes */
10c4762a1bSJed Brown   PetscBool testPartition;  /* Use a fixed partitioning for testing */
11c4762a1bSJed Brown   PetscInt  testNum;        /* The particular mesh to test */
12c4762a1bSJed Brown   PetscBool uninterpolate;  /* Uninterpolate the mesh at the end */
13c4762a1bSJed Brown   PetscBool reinterpolate;  /* Reinterpolate the mesh at the end */
14c4762a1bSJed Brown } AppCtx;
15c4762a1bSJed Brown 
16c4762a1bSJed Brown PetscErrorCode ProcessOptions(MPI_Comm comm, AppCtx *options)
17c4762a1bSJed Brown {
18c4762a1bSJed Brown   PetscFunctionBegin;
19c4762a1bSJed Brown   options->debug          = 0;
20c4762a1bSJed Brown   options->dim            = 2;
21c4762a1bSJed Brown   options->cellHybrid     = PETSC_TRUE;
22c4762a1bSJed Brown   options->cellSimplex    = PETSC_TRUE;
23c4762a1bSJed Brown   options->testPartition  = PETSC_TRUE;
24c4762a1bSJed Brown   options->testNum        = 0;
25c4762a1bSJed Brown   options->uninterpolate  = PETSC_FALSE;
26c4762a1bSJed Brown   options->reinterpolate  = PETSC_FALSE;
27c4762a1bSJed Brown 
28d0609cedSBarry Smith   PetscOptionsBegin(comm, "", "Meshing Problem Options", "DMPLEX");
299566063dSJacob Faibussowitsch   PetscCall(PetscOptionsBoundedInt("-debug", "The debugging level", "ex4.c", options->debug, &options->debug, NULL,0));
309566063dSJacob Faibussowitsch   PetscCall(PetscOptionsRangeInt("-dim", "The topological mesh dimension", "ex4.c", options->dim, &options->dim, NULL,1,3));
319566063dSJacob Faibussowitsch   PetscCall(PetscOptionsBool("-cell_hybrid", "Use a hybrid mesh", "ex4.c", options->cellHybrid, &options->cellHybrid, NULL));
329566063dSJacob Faibussowitsch   PetscCall(PetscOptionsBool("-cell_simplex", "Use simplices if true, otherwise hexes", "ex4.c", options->cellSimplex, &options->cellSimplex, NULL));
339566063dSJacob Faibussowitsch   PetscCall(PetscOptionsBool("-test_partition", "Use a fixed partition for testing", "ex4.c", options->testPartition, &options->testPartition, NULL));
349566063dSJacob Faibussowitsch   PetscCall(PetscOptionsBoundedInt("-test_num", "The particular mesh to test", "ex4.c", options->testNum, &options->testNum, NULL,0));
359566063dSJacob Faibussowitsch   PetscCall(PetscOptionsBool("-uninterpolate", "Uninterpolate the mesh at the end", "ex4.c", options->uninterpolate, &options->uninterpolate, NULL));
369566063dSJacob Faibussowitsch   PetscCall(PetscOptionsBool("-reinterpolate", "Reinterpolate the mesh at the end", "ex4.c", options->reinterpolate, &options->reinterpolate, NULL));
37d0609cedSBarry Smith   PetscOptionsEnd();
38c4762a1bSJed Brown   PetscFunctionReturn(0);
39c4762a1bSJed Brown }
40c4762a1bSJed Brown 
41c4762a1bSJed Brown /* Two segments
42c4762a1bSJed Brown 
43c4762a1bSJed Brown   2-------0-------3-------1-------4
44c4762a1bSJed Brown 
45c4762a1bSJed Brown become
46c4762a1bSJed Brown 
47c4762a1bSJed Brown   4---0---7---1---5---2---8---3---6
48c4762a1bSJed Brown 
49c4762a1bSJed Brown */
50c4762a1bSJed Brown PetscErrorCode CreateSimplex_1D(MPI_Comm comm, DM *dm)
51c4762a1bSJed Brown {
52c4762a1bSJed Brown   PetscInt       depth = 1;
53c4762a1bSJed Brown   PetscMPIInt    rank;
54c4762a1bSJed Brown 
55c4762a1bSJed Brown   PetscFunctionBegin;
569566063dSJacob Faibussowitsch   PetscCallMPI(MPI_Comm_rank(comm, &rank));
57dd400576SPatrick Sanan   if (rank == 0) {
58c4762a1bSJed Brown     PetscInt    numPoints[2]         = {3, 2};
59c4762a1bSJed Brown     PetscInt    coneSize[5]          = {2, 2, 0, 0, 0};
60c4762a1bSJed Brown     PetscInt    cones[4]             = {2, 3,  3, 4};
61c4762a1bSJed Brown     PetscInt    coneOrientations[16] = {0, 0,  0, 0};
62c4762a1bSJed Brown     PetscScalar vertexCoords[3]      = {-1.0, 0.0, 1.0};
63c4762a1bSJed Brown 
649566063dSJacob Faibussowitsch     PetscCall(DMPlexCreateFromDAG(*dm, depth, numPoints, coneSize, cones, coneOrientations, vertexCoords));
65c4762a1bSJed Brown   } else {
66c4762a1bSJed Brown     PetscInt numPoints[2] = {0, 0};
67c4762a1bSJed Brown 
689566063dSJacob Faibussowitsch     PetscCall(DMPlexCreateFromDAG(*dm, depth, numPoints, NULL, NULL, NULL, NULL));
69c4762a1bSJed Brown   }
70c4762a1bSJed Brown   PetscFunctionReturn(0);
71c4762a1bSJed Brown }
72c4762a1bSJed Brown 
73c4762a1bSJed Brown /* Two triangles
74c4762a1bSJed Brown         4
75c4762a1bSJed Brown       / | \
76c4762a1bSJed Brown      8  |  10
77c4762a1bSJed Brown     /   |   \
78c4762a1bSJed Brown    2  0 7  1 5
79c4762a1bSJed Brown     \   |   /
80c4762a1bSJed Brown      6  |  9
81c4762a1bSJed Brown       \ | /
82c4762a1bSJed Brown         3
83c4762a1bSJed Brown 
84c4762a1bSJed Brown Becomes
85c4762a1bSJed Brown            10
86c4762a1bSJed Brown           / | \
87c4762a1bSJed Brown         21  |  26
88c4762a1bSJed Brown         /   |   \
89c4762a1bSJed Brown       14 2 20 4  16
90c4762a1bSJed Brown       /|\   |   /|\
91c4762a1bSJed Brown     22 | 28 | 32 | 25
92c4762a1bSJed Brown     /  |  \ | /  | 6\
93c4762a1bSJed Brown    8  29 3 13  7 31  11
94c4762a1bSJed Brown     \0 |  / | \  |  /
95c4762a1bSJed Brown     17 | 27 | 30 | 24
96c4762a1bSJed Brown       \|/   |   \|/
97c4762a1bSJed Brown       12 1 19 5  15
98c4762a1bSJed Brown         \   |   /
99c4762a1bSJed Brown         18  |  23
100c4762a1bSJed Brown           \ | /
101c4762a1bSJed Brown             9
102c4762a1bSJed Brown */
103c4762a1bSJed Brown PetscErrorCode CreateSimplex_2D(MPI_Comm comm, DM *dm)
104c4762a1bSJed Brown {
105c4762a1bSJed Brown   PetscInt       depth = 2;
106c4762a1bSJed Brown   PetscMPIInt    rank;
107c4762a1bSJed Brown 
108c4762a1bSJed Brown   PetscFunctionBegin;
1099566063dSJacob Faibussowitsch   PetscCallMPI(MPI_Comm_rank(comm, &rank));
110dd400576SPatrick Sanan   if (rank == 0) {
111c4762a1bSJed Brown     PetscInt    numPoints[3]         = {4, 5, 2};
112c4762a1bSJed Brown     PetscInt    coneSize[11]         = {3, 3, 0, 0, 0, 0, 2, 2, 2, 2, 2};
113c4762a1bSJed Brown     PetscInt    cones[16]            = {6, 7, 8,  7, 9, 10,  2, 3,  3, 4,  4, 2,  3, 5,  5, 4};
114b5a892a1SMatthew G. Knepley     PetscInt    coneOrientations[16] = {0, 0, 0, -1, 0,  0,  0, 0,  0, 0,  0, 0,  0, 0,  0, 0};
115c4762a1bSJed Brown     PetscScalar vertexCoords[8]      = {-0.5, 0.0,  0.0, -0.5,  0.0, 0.5,  0.5, 0.0};
116c4762a1bSJed Brown 
1179566063dSJacob Faibussowitsch     PetscCall(DMPlexCreateFromDAG(*dm, depth, numPoints, coneSize, cones, coneOrientations, vertexCoords));
118c4762a1bSJed Brown   } else {
119c4762a1bSJed Brown     PetscInt numPoints[3] = {0, 0, 0};
120c4762a1bSJed Brown 
1219566063dSJacob Faibussowitsch     PetscCall(DMPlexCreateFromDAG(*dm, depth, numPoints, NULL, NULL, NULL, NULL));
122c4762a1bSJed Brown   }
123c4762a1bSJed Brown   PetscFunctionReturn(0);
124c4762a1bSJed Brown }
125c4762a1bSJed Brown 
126c4762a1bSJed Brown /* Two triangles separated by a zero-volume cell with 4 vertices/2 edges
127c4762a1bSJed Brown         5--16--8
128c4762a1bSJed Brown       / |      | \
129c4762a1bSJed Brown     11  |      |  12
130c4762a1bSJed Brown     /   |      |   \
131c4762a1bSJed Brown    3  0 10  2 14 1  6
132c4762a1bSJed Brown     \   |      |   /
133c4762a1bSJed Brown      9  |      |  13
134c4762a1bSJed Brown       \ |      | /
135c4762a1bSJed Brown         4--15--7
136c4762a1bSJed Brown */
137c4762a1bSJed Brown PetscErrorCode CreateSimplexHybrid_2D(MPI_Comm comm, PetscInt testNum, DM *dm)
138c4762a1bSJed Brown {
139c4762a1bSJed Brown   DM             idm, hdm = NULL;
140c4762a1bSJed Brown   DMLabel        faultLabel, hybridLabel;
141c4762a1bSJed Brown   PetscInt       p;
142c4762a1bSJed Brown   PetscMPIInt    rank;
143c4762a1bSJed Brown 
144c4762a1bSJed Brown   PetscFunctionBegin;
1459566063dSJacob Faibussowitsch   PetscCallMPI(MPI_Comm_rank(comm, &rank));
146dd400576SPatrick Sanan   if (rank == 0) {
147c4762a1bSJed Brown     switch (testNum) {
148c4762a1bSJed Brown     case 0:
149c4762a1bSJed Brown     {
150c4762a1bSJed Brown       PetscInt    numPoints[2]        = {4, 2};
151c4762a1bSJed Brown       PetscInt    coneSize[6]         = {3, 3, 0, 0, 0, 0};
152c4762a1bSJed Brown       PetscInt    cones[6]            = {2, 3, 4,  5, 4, 3};
153c4762a1bSJed Brown       PetscInt    coneOrientations[6] = {0, 0, 0,  0, 0, 0};
154c4762a1bSJed Brown       PetscScalar vertexCoords[8]     = {-1.0, -0.5,  0.0, -0.5,  0.0, 0.5,  1.0, 0.5};
155c4762a1bSJed Brown       PetscInt    faultPoints[2]      = {3, 4};
156c4762a1bSJed Brown 
1579566063dSJacob Faibussowitsch       PetscCall(DMPlexCreateFromDAG(*dm, 1, numPoints, coneSize, cones, coneOrientations, vertexCoords));
1589566063dSJacob Faibussowitsch       for (p = 0; p < 2; ++p) PetscCall(DMSetLabelValue(*dm, "fault", faultPoints[p], 1));
159c4762a1bSJed Brown     }
160c4762a1bSJed Brown     break;
161c4762a1bSJed Brown     case 1:
162c4762a1bSJed Brown     {
163c4762a1bSJed Brown       PetscInt    numPoints[2]         = {5, 4};
164c4762a1bSJed Brown       PetscInt    coneSize[9]          = {3, 3, 3, 3, 0, 0, 0, 0, 0};
165c4762a1bSJed Brown       PetscInt    cones[12]            = {4, 5, 6,  6, 7, 4,  6, 5, 8,  6, 8, 7};
166c4762a1bSJed Brown       PetscInt    coneOrientations[12] = {0, 0, 0,  0, 0, 0,  0, 0, 0,  0, 0, 0};
167c4762a1bSJed Brown       PetscScalar vertexCoords[10]     = {-1.0, 0.0,  0.0, -1.0,  0.0, 0.0,  0.0, 1.0,  1.0, 0.0};
168c4762a1bSJed Brown       PetscInt    faultPoints[3]       = {5, 6, 7};
169c4762a1bSJed Brown 
1709566063dSJacob Faibussowitsch       PetscCall(DMPlexCreateFromDAG(*dm, 1, numPoints, coneSize, cones, coneOrientations, vertexCoords));
1719566063dSJacob Faibussowitsch       for (p = 0; p < 3; ++p) PetscCall(DMSetLabelValue(*dm, "fault", faultPoints[p], 1));
172c4762a1bSJed Brown     }
173c4762a1bSJed Brown     break;
17463a3b9bcSJacob Faibussowitsch     default: SETERRQ(comm, PETSC_ERR_ARG_OUTOFRANGE, "No test mesh %" PetscInt_FMT, testNum);
175c4762a1bSJed Brown     }
1769566063dSJacob Faibussowitsch     PetscCall(DMPlexInterpolate(*dm, &idm));
1779566063dSJacob Faibussowitsch     PetscCall(PetscObjectSetOptionsPrefix((PetscObject) idm, "in_"));
1789566063dSJacob Faibussowitsch     PetscCall(DMPlexDistributeSetDefault(idm, PETSC_FALSE));
1799566063dSJacob Faibussowitsch     PetscCall(DMSetFromOptions(idm));
1809566063dSJacob Faibussowitsch     PetscCall(DMViewFromOptions(idm, NULL, "-dm_view"));
1819566063dSJacob Faibussowitsch     PetscCall(DMGetLabel(*dm, "fault", &faultLabel));
182caf9e14dSMatthew G. Knepley     PetscCall(DMPlexCreateHybridMesh(idm, faultLabel, NULL, 0, &hybridLabel, NULL, NULL, &hdm));
1839566063dSJacob Faibussowitsch     PetscCall(DMLabelDestroy(&hybridLabel));
1849566063dSJacob Faibussowitsch     PetscCall(DMDestroy(&idm));
1859566063dSJacob Faibussowitsch     PetscCall(DMDestroy(dm));
186c4762a1bSJed Brown     *dm  = hdm;
187c4762a1bSJed Brown   } else {
188c4762a1bSJed Brown     PetscInt numPoints[2] = {0, 0};
189c4762a1bSJed Brown 
1909566063dSJacob Faibussowitsch     PetscCall(DMPlexCreateFromDAG(*dm, 1, numPoints, NULL, NULL, NULL, NULL));
1919566063dSJacob Faibussowitsch     PetscCall(DMPlexInterpolate(*dm, &idm));
1929566063dSJacob Faibussowitsch     PetscCall(PetscObjectSetOptionsPrefix((PetscObject) idm, "in_"));
1939566063dSJacob Faibussowitsch     PetscCall(DMPlexDistributeSetDefault(idm, PETSC_FALSE));
1949566063dSJacob Faibussowitsch     PetscCall(DMSetFromOptions(idm));
1959566063dSJacob Faibussowitsch     PetscCall(DMViewFromOptions(idm, NULL, "-dm_view"));
196caf9e14dSMatthew G. Knepley     PetscCall(DMPlexCreateHybridMesh(idm, NULL, NULL, 0, NULL, NULL, NULL, &hdm));
1979566063dSJacob Faibussowitsch     PetscCall(DMDestroy(&idm));
1989566063dSJacob Faibussowitsch     PetscCall(DMDestroy(dm));
199c4762a1bSJed Brown     *dm  = hdm;
200c4762a1bSJed Brown   }
201c4762a1bSJed Brown   PetscFunctionReturn(0);
202c4762a1bSJed Brown }
203c4762a1bSJed Brown 
204c4762a1bSJed Brown /* Two quadrilaterals
205c4762a1bSJed Brown 
206c4762a1bSJed Brown   5----10-----4----14-----7
207c4762a1bSJed Brown   |           |           |
208c4762a1bSJed Brown   |           |           |
209c4762a1bSJed Brown   |           |           |
210c4762a1bSJed Brown  11     0     9     1     13
211c4762a1bSJed Brown   |           |           |
212c4762a1bSJed Brown   |           |           |
213c4762a1bSJed Brown   |           |           |
214c4762a1bSJed Brown   2-----8-----3----12-----6
215c4762a1bSJed Brown */
216c4762a1bSJed Brown PetscErrorCode CreateTensorProduct_2D(MPI_Comm comm, PetscInt testNum, DM *dm)
217c4762a1bSJed Brown {
218c4762a1bSJed Brown   PetscInt       depth = 2;
219c4762a1bSJed Brown   PetscMPIInt    rank;
220c4762a1bSJed Brown 
221c4762a1bSJed Brown   PetscFunctionBegin;
2229566063dSJacob Faibussowitsch   PetscCallMPI(MPI_Comm_rank(comm, &rank));
223dd400576SPatrick Sanan   if (rank == 0) {
224c4762a1bSJed Brown     PetscInt    numPoints[3]         = {6, 7, 2};
225c4762a1bSJed Brown     PetscInt    coneSize[15]         = {4, 4, 0, 0, 0, 0, 0, 0, 2, 2, 2, 2, 2, 2, 2};
226c4762a1bSJed Brown     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};
227b5a892a1SMatthew G. Knepley     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};
228c4762a1bSJed Brown     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};
229c4762a1bSJed Brown 
2309566063dSJacob Faibussowitsch     PetscCall(DMPlexCreateFromDAG(*dm, depth, numPoints, coneSize, cones, coneOrientations, vertexCoords));
231c4762a1bSJed Brown   } else {
232c4762a1bSJed Brown     PetscInt numPoints[3] = {0, 0, 0};
233c4762a1bSJed Brown 
2349566063dSJacob Faibussowitsch     PetscCall(DMPlexCreateFromDAG(*dm, depth, numPoints, NULL, NULL, NULL, NULL));
235c4762a1bSJed Brown   }
236c4762a1bSJed Brown   PetscFunctionReturn(0);
237c4762a1bSJed Brown }
238c4762a1bSJed Brown 
239c4762a1bSJed Brown PetscErrorCode CreateTensorProductHybrid_2D(MPI_Comm comm, PetscInt testNum, DM *dm)
240c4762a1bSJed Brown {
241c4762a1bSJed Brown   DM             idm, hdm = NULL;
242c4762a1bSJed Brown   DMLabel        faultLabel, hybridLabel;
243c4762a1bSJed Brown   PetscInt       p;
244c4762a1bSJed Brown   PetscMPIInt    rank;
245c4762a1bSJed Brown 
246c4762a1bSJed Brown   PetscFunctionBegin;
2479566063dSJacob Faibussowitsch   PetscCallMPI(MPI_Comm_rank(comm, &rank));
248dd400576SPatrick Sanan   if (rank == 0) {
249c4762a1bSJed Brown     PetscInt    numPoints[2]        = {6, 2};
250c4762a1bSJed Brown     PetscInt    coneSize[8]         = {4, 4, 0, 0, 0, 0, 0, 0};
251c4762a1bSJed Brown     PetscInt    cones[8]            = {2, 3, 4, 5,  3, 6, 7, 4,};
252c4762a1bSJed Brown     PetscInt    coneOrientations[8] = {0, 0, 0, 0,  0, 0, 0, 0};
253c4762a1bSJed Brown     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};
254c4762a1bSJed Brown     PetscInt    faultPoints[2]      = {3, 4};
255c4762a1bSJed Brown 
2569566063dSJacob Faibussowitsch     PetscCall(DMPlexCreateFromDAG(*dm, 1, numPoints, coneSize, cones, coneOrientations, vertexCoords));
2579566063dSJacob Faibussowitsch     for (p = 0; p < 2; ++p) PetscCall(DMSetLabelValue(*dm, "fault", faultPoints[p], 1));
2589566063dSJacob Faibussowitsch     PetscCall(DMPlexInterpolate(*dm, &idm));
2599566063dSJacob Faibussowitsch     PetscCall(PetscObjectSetOptionsPrefix((PetscObject) idm, "in_"));
2609566063dSJacob Faibussowitsch     PetscCall(DMPlexDistributeSetDefault(idm, PETSC_FALSE));
2619566063dSJacob Faibussowitsch     PetscCall(DMSetFromOptions(idm));
2629566063dSJacob Faibussowitsch     PetscCall(DMViewFromOptions(idm, NULL, "-dm_view"));
2639566063dSJacob Faibussowitsch     PetscCall(DMGetLabel(*dm, "fault", &faultLabel));
264caf9e14dSMatthew G. Knepley     PetscCall(DMPlexCreateHybridMesh(idm, faultLabel, NULL, 0, &hybridLabel, NULL, NULL, &hdm));
2659566063dSJacob Faibussowitsch     PetscCall(DMLabelDestroy(&hybridLabel));
266c4762a1bSJed Brown   } else {
267c4762a1bSJed Brown     PetscInt numPoints[3] = {0, 0, 0};
268c4762a1bSJed Brown 
2699566063dSJacob Faibussowitsch     PetscCall(DMPlexCreateFromDAG(*dm, 1, numPoints, NULL, NULL, NULL, NULL));
2709566063dSJacob Faibussowitsch     PetscCall(DMPlexInterpolate(*dm, &idm));
2719566063dSJacob Faibussowitsch     PetscCall(PetscObjectSetOptionsPrefix((PetscObject) idm, "in_"));
2729566063dSJacob Faibussowitsch     PetscCall(DMPlexDistributeSetDefault(idm, PETSC_FALSE));
2739566063dSJacob Faibussowitsch     PetscCall(DMSetFromOptions(idm));
2749566063dSJacob Faibussowitsch     PetscCall(DMViewFromOptions(idm, NULL, "-dm_view"));
275caf9e14dSMatthew G. Knepley     PetscCall(DMPlexCreateHybridMesh(idm, NULL, NULL, 0, NULL, NULL, NULL, &hdm));
276c4762a1bSJed Brown   }
2779566063dSJacob Faibussowitsch   PetscCall(DMDestroy(&idm));
2789566063dSJacob Faibussowitsch   PetscCall(DMDestroy(dm));
279c4762a1bSJed Brown   *dm  = hdm;
280c4762a1bSJed Brown   PetscFunctionReturn(0);
281c4762a1bSJed Brown }
282c4762a1bSJed Brown 
283c4762a1bSJed Brown /* Two tetrahedrons
284c4762a1bSJed Brown 
285c4762a1bSJed Brown  cell   5          5______    cell
286c4762a1bSJed Brown  0    / | \        |\      \     1
287c4762a1bSJed Brown     17  |  18      | 18 13  21
288c4762a1bSJed Brown     /8 19 10\     19  \      \
289c4762a1bSJed Brown    2-14-|----4     |   4--22--6
290c4762a1bSJed Brown     \ 9 | 7 /      |10 /      /
291c4762a1bSJed Brown     16  |  15      | 15  12 20
292c4762a1bSJed Brown       \ | /        |/      /
293c4762a1bSJed Brown         3          3------
294c4762a1bSJed Brown */
295c4762a1bSJed Brown PetscErrorCode CreateSimplex_3D(MPI_Comm comm, PetscInt testNum, DM *dm)
296c4762a1bSJed Brown {
297c4762a1bSJed Brown   DM             idm;
298c4762a1bSJed Brown   PetscInt       depth = 3;
299c4762a1bSJed Brown   PetscMPIInt    rank;
300c4762a1bSJed Brown 
301c4762a1bSJed Brown   PetscFunctionBegin;
3029566063dSJacob Faibussowitsch   PetscCallMPI(MPI_Comm_rank(comm, &rank));
303dd400576SPatrick Sanan   if (rank == 0) {
304c4762a1bSJed Brown     switch (testNum) {
305c4762a1bSJed Brown     case 0:
306c4762a1bSJed Brown     {
307c4762a1bSJed Brown       PetscInt    numPoints[4]         = {5, 9, 7, 2};
308c4762a1bSJed Brown       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};
309c4762a1bSJed Brown       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};
310b5a892a1SMatthew G. Knepley       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};
311c4762a1bSJed Brown       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};
312c4762a1bSJed Brown 
3139566063dSJacob Faibussowitsch       PetscCall(DMPlexCreateFromDAG(*dm, depth, numPoints, coneSize, cones, coneOrientations, vertexCoords));
314c4762a1bSJed Brown     }
315c4762a1bSJed Brown     break;
316c4762a1bSJed Brown     case 1:
317c4762a1bSJed Brown     {
318c4762a1bSJed Brown       PetscInt    numPoints[2]        = {5, 2};
319c4762a1bSJed Brown       PetscInt    coneSize[7]         = {4, 4, 0, 0, 0, 0, 0};
320c4762a1bSJed Brown       PetscInt    cones[8]            = {4, 3, 5, 2,  5, 3, 4, 6};
321c4762a1bSJed Brown       PetscInt    coneOrientations[8] = {0, 0, 0, 0,  0, 0, 0, 0};
322c4762a1bSJed Brown       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};
323c4762a1bSJed Brown 
324c4762a1bSJed Brown       depth = 1;
3259566063dSJacob Faibussowitsch       PetscCall(DMPlexCreateFromDAG(*dm, depth, numPoints, coneSize, cones, coneOrientations, vertexCoords));
3269566063dSJacob Faibussowitsch       PetscCall(DMPlexInterpolate(*dm, &idm));
3279566063dSJacob Faibussowitsch       PetscCall(DMViewFromOptions(idm, NULL, "-in_dm_view"));
3289566063dSJacob Faibussowitsch       PetscCall(DMDestroy(dm));
329c4762a1bSJed Brown       *dm  = idm;
330c4762a1bSJed Brown     }
331c4762a1bSJed Brown     break;
332c4762a1bSJed Brown     case 2:
333c4762a1bSJed Brown     {
334c4762a1bSJed Brown       PetscInt    numPoints[2]        = {4, 1};
335c4762a1bSJed Brown       PetscInt    coneSize[5]         = {4, 0, 0, 0, 0};
336c4762a1bSJed Brown       PetscInt    cones[4]            = {2, 3, 4, 1};
337c4762a1bSJed Brown       PetscInt    coneOrientations[4] = {0, 0, 0, 0};
338c4762a1bSJed Brown       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};
339c4762a1bSJed Brown 
340c4762a1bSJed Brown       depth = 1;
3419566063dSJacob Faibussowitsch       PetscCall(DMPlexCreateFromDAG(*dm, depth, numPoints, coneSize, cones, coneOrientations, vertexCoords));
3429566063dSJacob Faibussowitsch       PetscCall(DMPlexInterpolate(*dm, &idm));
3439566063dSJacob Faibussowitsch       PetscCall(DMViewFromOptions(idm, NULL, "-in_dm_view"));
3449566063dSJacob Faibussowitsch       PetscCall(DMDestroy(dm));
345c4762a1bSJed Brown       *dm  = idm;
346c4762a1bSJed Brown     }
347c4762a1bSJed Brown     break;
34863a3b9bcSJacob Faibussowitsch     default: SETERRQ(comm, PETSC_ERR_ARG_OUTOFRANGE, "No test mesh %" PetscInt_FMT, testNum);
349c4762a1bSJed Brown     }
350c4762a1bSJed Brown   } else {
351c4762a1bSJed Brown     PetscInt numPoints[4] = {0, 0, 0, 0};
352c4762a1bSJed Brown 
3539566063dSJacob Faibussowitsch     PetscCall(DMPlexCreateFromDAG(*dm, depth, numPoints, NULL, NULL, NULL, NULL));
354c4762a1bSJed Brown     switch (testNum) {
355c4762a1bSJed Brown     case 1:
3569566063dSJacob Faibussowitsch       PetscCall(DMPlexInterpolate(*dm, &idm));
3579566063dSJacob Faibussowitsch       PetscCall(DMViewFromOptions(idm, NULL, "-in_dm_view"));
3589566063dSJacob Faibussowitsch       PetscCall(DMDestroy(dm));
359c4762a1bSJed Brown       *dm  = idm;
360c4762a1bSJed Brown       break;
361c4762a1bSJed Brown     }
362c4762a1bSJed Brown   }
363c4762a1bSJed Brown   PetscFunctionReturn(0);
364c4762a1bSJed Brown }
365c4762a1bSJed Brown 
366c4762a1bSJed Brown /* Two tetrahedrons separated by a zero-volume cell with 6 vertices
367c4762a1bSJed Brown 
368c4762a1bSJed Brown  cell   6 ___33___10______    cell
369c4762a1bSJed Brown  0    / | \        |\      \     1
370c4762a1bSJed Brown     21  |  23      | 29     27
371c4762a1bSJed Brown     /12 24 14\    30  \      \
372c4762a1bSJed Brown    3-20-|----5--32-|---9--26--7
373c4762a1bSJed Brown     \ 13| 11/      |18 /      /
374c4762a1bSJed Brown     19  |  22      | 28     25
375c4762a1bSJed Brown       \ | /        |/      /
376c4762a1bSJed Brown         4----31----8------
377c4762a1bSJed Brown          cell 2
378c4762a1bSJed Brown */
379c4762a1bSJed Brown PetscErrorCode CreateSimplexHybrid_3D(MPI_Comm comm, PetscInt testNum, DM *dm)
380c4762a1bSJed Brown {
381c4762a1bSJed Brown   DM             idm, hdm = NULL;
382c4762a1bSJed Brown   DMLabel        faultLabel, hybridLabel;
383c4762a1bSJed Brown   PetscInt       p;
384c4762a1bSJed Brown   PetscMPIInt    rank;
385c4762a1bSJed Brown 
386c4762a1bSJed Brown   PetscFunctionBegin;
3879566063dSJacob Faibussowitsch   PetscCallMPI(MPI_Comm_rank(comm, &rank));
388dd400576SPatrick Sanan   if (rank == 0) {
389c4762a1bSJed Brown     switch (testNum) {
390c4762a1bSJed Brown     case 0:
391c4762a1bSJed Brown     {
392c4762a1bSJed Brown       PetscInt    numPoints[2]        = {5, 2};
393c4762a1bSJed Brown       PetscInt    coneSize[7]         = {4, 4, 0, 0, 0, 0, 0};
394c4762a1bSJed Brown       PetscInt    cones[8]            = {4, 3, 5, 2,  5, 3, 4, 6};
395c4762a1bSJed Brown       PetscInt    coneOrientations[8] = {0, 0, 0, 0,  0, 0, 0, 0};
396c4762a1bSJed Brown       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};
397c4762a1bSJed Brown       PetscInt    faultPoints[3]      = {3, 4, 5};
398c4762a1bSJed Brown 
3999566063dSJacob Faibussowitsch       PetscCall(DMPlexCreateFromDAG(*dm, 1, numPoints, coneSize, cones, coneOrientations, vertexCoords));
4009566063dSJacob Faibussowitsch       for (p = 0; p < 3; ++p) PetscCall(DMSetLabelValue(*dm, "fault", faultPoints[p], 1));
401c4762a1bSJed Brown     }
402c4762a1bSJed Brown     break;
403c4762a1bSJed Brown     case 1:
404c4762a1bSJed Brown     {
405c4762a1bSJed Brown       /* Tets 0,3,5 and 1,2,4 */
406c4762a1bSJed Brown       PetscInt    numPoints[2]         = {9, 6};
407c4762a1bSJed Brown       PetscInt    coneSize[15]         = {4, 4, 4, 4, 4, 4, 0, 0, 0, 0, 0, 0, 0, 0, 0};
40854fcfd0cSMatthew G. Knepley       PetscInt    cones[24]            = { 7,  8,  9, 6,  11, 13,  9, 14,  10, 11, 13, 9,
40954fcfd0cSMatthew G. Knepley                                            9, 10, 11, 7,   9, 14, 13, 12,   7,  8, 11, 9};
410c4762a1bSJed Brown       PetscInt    coneOrientations[24] = { 0, 0,  0, 0,   0,  0,  0,  0,   0,  0,  0, 0,
411c4762a1bSJed Brown                                            0, 0,  0, 0,   0,  0,  0,  0,   0,  0,  0, 0};
412c4762a1bSJed Brown       PetscScalar vertexCoords[27]     = {-2.0, -1.0,  0.0,  -2.0,  0.0,  0.0,  -2.0,  0.0,  1.0,
413c4762a1bSJed Brown                                            0.0, -1.0,  0.0,   0.0,  0.0,  0.0,   0.0,  0.0,  1.0,
414c4762a1bSJed Brown                                            2.0, -1.0,  0.0,   2.0,  0.0,  0.0,   2.0,  0.0,  1.0};
415c4762a1bSJed Brown       PetscInt    faultPoints[3]       = {9, 10, 11};
416c4762a1bSJed Brown 
4179566063dSJacob Faibussowitsch       PetscCall(DMPlexCreateFromDAG(*dm, 1, numPoints, coneSize, cones, coneOrientations, vertexCoords));
4189566063dSJacob Faibussowitsch       for (p = 0; p < 3; ++p) PetscCall(DMSetLabelValue(*dm, "fault", faultPoints[p], 1));
419c4762a1bSJed Brown     }
420c4762a1bSJed Brown     break;
42163a3b9bcSJacob Faibussowitsch     default: SETERRQ(comm, PETSC_ERR_ARG_OUTOFRANGE, "No test mesh %" PetscInt_FMT, testNum);
422c4762a1bSJed Brown     }
4239566063dSJacob Faibussowitsch     PetscCall(DMPlexInterpolate(*dm, &idm));
4249566063dSJacob Faibussowitsch     PetscCall(PetscObjectSetOptionsPrefix((PetscObject) idm, "in_"));
4259566063dSJacob Faibussowitsch     PetscCall(DMPlexDistributeSetDefault(idm, PETSC_FALSE));
4269566063dSJacob Faibussowitsch     PetscCall(DMSetFromOptions(idm));
4279566063dSJacob Faibussowitsch     PetscCall(DMViewFromOptions(idm, NULL, "-dm_view"));
4289566063dSJacob Faibussowitsch     PetscCall(DMGetLabel(*dm, "fault", &faultLabel));
429caf9e14dSMatthew G. Knepley     PetscCall(DMPlexCreateHybridMesh(idm, faultLabel, NULL, 0, &hybridLabel, NULL, NULL, &hdm));
4309566063dSJacob Faibussowitsch     PetscCall(DMLabelDestroy(&hybridLabel));
4319566063dSJacob Faibussowitsch     PetscCall(DMDestroy(&idm));
4329566063dSJacob Faibussowitsch     PetscCall(DMDestroy(dm));
433c4762a1bSJed Brown     *dm  = hdm;
434c4762a1bSJed Brown   } else {
435c4762a1bSJed Brown     PetscInt numPoints[4] = {0, 0, 0, 0};
436c4762a1bSJed Brown 
4379566063dSJacob Faibussowitsch     PetscCall(DMPlexCreateFromDAG(*dm, 1, numPoints, NULL, NULL, NULL, NULL));
4389566063dSJacob Faibussowitsch     PetscCall(DMPlexInterpolate(*dm, &idm));
4399566063dSJacob Faibussowitsch     PetscCall(PetscObjectSetOptionsPrefix((PetscObject) idm, "in_"));
4409566063dSJacob Faibussowitsch     PetscCall(DMPlexDistributeSetDefault(idm, PETSC_FALSE));
4419566063dSJacob Faibussowitsch     PetscCall(DMSetFromOptions(idm));
4429566063dSJacob Faibussowitsch     PetscCall(DMViewFromOptions(idm, NULL, "-dm_view"));
443caf9e14dSMatthew G. Knepley     PetscCall(DMPlexCreateHybridMesh(idm, NULL, NULL, 0, NULL, NULL, NULL, &hdm));
4449566063dSJacob Faibussowitsch     PetscCall(DMDestroy(&idm));
4459566063dSJacob Faibussowitsch     PetscCall(DMDestroy(dm));
446c4762a1bSJed Brown     *dm  = hdm;
447c4762a1bSJed Brown   }
448c4762a1bSJed Brown   PetscFunctionReturn(0);
449c4762a1bSJed Brown }
450c4762a1bSJed Brown 
451c4762a1bSJed Brown PetscErrorCode CreateTensorProduct_3D(MPI_Comm comm, PetscInt testNum, DM *dm)
452c4762a1bSJed Brown {
453c4762a1bSJed Brown   DM             idm;
454c4762a1bSJed Brown   PetscMPIInt    rank;
455c4762a1bSJed Brown 
456c4762a1bSJed Brown   PetscFunctionBegin;
4579566063dSJacob Faibussowitsch   PetscCallMPI(MPI_Comm_rank(comm, &rank));
458dd400576SPatrick Sanan   if (rank == 0) {
459c4762a1bSJed Brown     switch (testNum) {
460c4762a1bSJed Brown     case 0:
461c4762a1bSJed Brown     {
462c4762a1bSJed Brown       PetscInt    numPoints[2]         = {12, 2};
463c4762a1bSJed Brown       PetscInt    coneSize[14]         = {8, 8, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0};
464c4762a1bSJed Brown       PetscInt    cones[16]            = {2, 3, 4, 5, 6, 7, 8, 9,  5, 4, 10, 11, 7, 12, 13, 8};
465c4762a1bSJed Brown       PetscInt    coneOrientations[16] = {0, 0, 0, 0, 0, 0, 0, 0,  0, 0,  0,  0, 0,  0,  0, 0};
466c4762a1bSJed Brown       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,
467c4762a1bSJed Brown                                           -1.0, -0.5,  0.5,   0.0, -0.5,  0.5,  0.0,  0.5,  0.5,  -1.0,  0.5,  0.5,
468c4762a1bSJed Brown                                           1.0,  0.5, -0.5,   1.0, -0.5, -0.5,  1.0, -0.5,  0.5,   1.0,  0.5,  0.5};
469c4762a1bSJed Brown 
4709566063dSJacob Faibussowitsch       PetscCall(DMPlexCreateFromDAG(*dm, 1, numPoints, coneSize, cones, coneOrientations, vertexCoords));
471c4762a1bSJed Brown     }
472c4762a1bSJed Brown     break;
473c4762a1bSJed Brown     case 1:
474c4762a1bSJed Brown     {
475c4762a1bSJed Brown       PetscInt    numPoints[2]        = {8, 1};
476c4762a1bSJed Brown       PetscInt    coneSize[9]         = {8, 0, 0, 0, 0, 0, 0, 0, 0};
477c4762a1bSJed Brown       PetscInt    cones[8]            = {1, 2, 3, 4, 5, 6, 7, 8};
478c4762a1bSJed Brown       PetscInt    coneOrientations[8] = {0, 0, 0, 0, 0, 0, 0, 0};
479c4762a1bSJed Brown       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,
480c4762a1bSJed Brown                                          -1.0, -1.0,  1.0,   1.0, -1.0,  1.0,  1.0,  1.0,  1.0,  -1.0,  1.0,  1.0};
481c4762a1bSJed Brown 
4829566063dSJacob Faibussowitsch       PetscCall(DMPlexCreateFromDAG(*dm, 1, numPoints, coneSize, cones, coneOrientations, vertexCoords));
483c4762a1bSJed Brown     }
484c4762a1bSJed Brown     break;
48563a3b9bcSJacob Faibussowitsch     default: SETERRQ(comm, PETSC_ERR_ARG_OUTOFRANGE, "No test mesh %" PetscInt_FMT, testNum);
486c4762a1bSJed Brown     }
487c4762a1bSJed Brown   } else {
488c4762a1bSJed Brown     PetscInt numPoints[4] = {0, 0, 0, 0};
489c4762a1bSJed Brown 
4909566063dSJacob Faibussowitsch     PetscCall(DMPlexCreateFromDAG(*dm, 1, numPoints, NULL, NULL, NULL, NULL));
491c4762a1bSJed Brown   }
4929566063dSJacob Faibussowitsch   PetscCall(DMPlexInterpolate(*dm, &idm));
4939566063dSJacob Faibussowitsch   PetscCall(DMViewFromOptions(idm, NULL, "-in_dm_view"));
4949566063dSJacob Faibussowitsch   PetscCall(DMDestroy(dm));
495c4762a1bSJed Brown   *dm  = idm;
496c4762a1bSJed Brown   PetscFunctionReturn(0);
497c4762a1bSJed Brown }
498c4762a1bSJed Brown 
499c4762a1bSJed Brown PetscErrorCode CreateTensorProductHybrid_3D(MPI_Comm comm, PetscInt testNum, DM *dm)
500c4762a1bSJed Brown {
501c4762a1bSJed Brown   DM             idm, hdm = NULL;
502c4762a1bSJed Brown   DMLabel        faultLabel;
503c4762a1bSJed Brown   PetscInt       p;
504c4762a1bSJed Brown   PetscMPIInt    rank;
505c4762a1bSJed Brown 
506c4762a1bSJed Brown   PetscFunctionBegin;
5079566063dSJacob Faibussowitsch   PetscCallMPI(MPI_Comm_rank(comm, &rank));
508dd400576SPatrick Sanan   if (rank == 0) {
509c4762a1bSJed Brown     switch (testNum) {
510c4762a1bSJed Brown     case 0:
511c4762a1bSJed Brown     {
512c4762a1bSJed Brown       PetscInt    numPoints[2]         = {12, 2};
513c4762a1bSJed Brown       PetscInt    coneSize[14]         = {8, 8, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0};
514c4762a1bSJed Brown       PetscInt    cones[16]            = {2, 3, 4, 5, 6, 7, 8, 9,  5, 4, 10, 11, 7, 12, 13, 8};
515c4762a1bSJed Brown       PetscInt    coneOrientations[16] = {0, 0, 0, 0, 0, 0, 0, 0,  0, 0,  0,  0, 0,  0,  0, 0};
516c4762a1bSJed Brown       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,
517c4762a1bSJed Brown                                           -1.0, -0.5,  0.5,   0.0, -0.5,  0.5,  0.0,  0.5,  0.5,  -1.0,  0.5,  0.5,
518c4762a1bSJed Brown                                           1.0,  0.5, -0.5,   1.0, -0.5, -0.5,  1.0, -0.5,  0.5,   1.0,  0.5,  0.5};
519c4762a1bSJed Brown       PetscInt    faultPoints[4]       = {2, 3, 5, 6};
520c4762a1bSJed Brown 
5219566063dSJacob Faibussowitsch       PetscCall(DMPlexCreateFromDAG(*dm, 1, numPoints, coneSize, cones, coneOrientations, vertexCoords));
5229566063dSJacob Faibussowitsch       for (p = 0; p < 4; ++p) PetscCall(DMSetLabelValue(*dm, "fault", faultPoints[p], 1));
523c4762a1bSJed Brown     }
524c4762a1bSJed Brown     break;
525c4762a1bSJed Brown     case 1:
526c4762a1bSJed Brown     {
527c4762a1bSJed Brown       PetscInt    numPoints[2]         = {30, 7};
528c4762a1bSJed Brown       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};
529c4762a1bSJed Brown       PetscInt    cones[56]            = { 8, 21, 20,  7, 13, 12, 23, 24,
530c4762a1bSJed Brown                                           14, 15, 10,  9, 13,  8, 21, 24,
531c4762a1bSJed Brown                                           15, 16, 11, 10, 24, 21, 22, 25,
532c4762a1bSJed Brown                                           30, 29, 28, 21, 35, 24, 33, 34,
533c4762a1bSJed Brown                                           24, 21, 30, 35, 25, 36, 31, 22,
534c4762a1bSJed Brown                                           27, 20, 21, 28, 32, 33, 24, 23,
535c4762a1bSJed Brown                                           15, 24, 13, 14, 19, 18, 17, 26};
536c4762a1bSJed Brown       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};
537c4762a1bSJed Brown       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,
538c4762a1bSJed Brown                                           -2.0, -1.0,  0.0,  -3.0,  0.0,  0.0,  -2.0,  1.0,  0.0,  -2.0,  2.0,  0.0,  -2.0, -1.0,  2.0,  -3.0,  0.0,  2.0,
539c4762a1bSJed Brown                                           -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,
540c4762a1bSJed Brown                                            0.0,  2.0,  0.0,   0.0,  0.0,  2.0,   2.0, -2.0, -2.0,   2.0, -1.0, -2.0,   3.0,  0.0, -2.0,   2.0,  1.0, -2.0,
541c4762a1bSJed Brown                                            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};
542c4762a1bSJed Brown       PetscInt    faultPoints[6]       = {20, 21, 22, 23, 24, 25};
543c4762a1bSJed Brown 
5449566063dSJacob Faibussowitsch       PetscCall(DMPlexCreateFromDAG(*dm, 1, numPoints, coneSize, cones, coneOrientations, vertexCoords));
5459566063dSJacob Faibussowitsch       for (p = 0; p < 6; ++p) PetscCall(DMSetLabelValue(*dm, "fault", faultPoints[p], 1));
546c4762a1bSJed Brown     }
547c4762a1bSJed Brown     break;
54863a3b9bcSJacob Faibussowitsch     default: SETERRQ(comm, PETSC_ERR_ARG_OUTOFRANGE, "No test mesh %" PetscInt_FMT, testNum);
549c4762a1bSJed Brown     }
5509566063dSJacob Faibussowitsch     PetscCall(DMPlexInterpolate(*dm, &idm));
5519566063dSJacob Faibussowitsch     PetscCall(PetscObjectSetOptionsPrefix((PetscObject) idm, "in_"));
5529566063dSJacob Faibussowitsch     PetscCall(DMPlexDistributeSetDefault(idm, PETSC_FALSE));
5539566063dSJacob Faibussowitsch     PetscCall(DMSetFromOptions(idm));
5549566063dSJacob Faibussowitsch     PetscCall(DMViewFromOptions(idm, NULL, "-dm_view"));
5559566063dSJacob Faibussowitsch     PetscCall(DMGetLabel(*dm, "fault", &faultLabel));
556caf9e14dSMatthew G. Knepley     PetscCall(DMPlexCreateHybridMesh(idm, faultLabel, NULL, 0, NULL, NULL, NULL, &hdm));
5579566063dSJacob Faibussowitsch     PetscCall(DMDestroy(&idm));
5589566063dSJacob Faibussowitsch     PetscCall(DMDestroy(dm));
559c4762a1bSJed Brown     *dm  = hdm;
560c4762a1bSJed Brown   } else {
561c4762a1bSJed Brown     PetscInt numPoints[4] = {0, 0, 0, 0};
562c4762a1bSJed Brown 
5639566063dSJacob Faibussowitsch     PetscCall(DMPlexCreateFromDAG(*dm, 1, numPoints, NULL, NULL, NULL, NULL));
5649566063dSJacob Faibussowitsch     PetscCall(DMPlexInterpolate(*dm, &idm));
5659566063dSJacob Faibussowitsch     PetscCall(PetscObjectSetOptionsPrefix((PetscObject) idm, "in_"));
5669566063dSJacob Faibussowitsch     PetscCall(DMPlexDistributeSetDefault(idm, PETSC_FALSE));
5679566063dSJacob Faibussowitsch     PetscCall(DMSetFromOptions(idm));
5689566063dSJacob Faibussowitsch     PetscCall(DMViewFromOptions(idm, NULL, "-dm_view"));
569caf9e14dSMatthew G. Knepley     PetscCall(DMPlexCreateHybridMesh(idm, NULL, NULL, 0, NULL, NULL, NULL, &hdm));
5709566063dSJacob Faibussowitsch     PetscCall(DMDestroy(&idm));
5719566063dSJacob Faibussowitsch     PetscCall(DMDestroy(dm));
572c4762a1bSJed Brown     *dm  = hdm;
573c4762a1bSJed Brown   }
574c4762a1bSJed Brown   PetscFunctionReturn(0);
575c4762a1bSJed Brown }
576c4762a1bSJed Brown 
577c4762a1bSJed Brown PetscErrorCode CreateMesh(MPI_Comm comm, AppCtx *user, DM *dm)
578c4762a1bSJed Brown {
579c4762a1bSJed Brown   PetscInt       dim         = user->dim;
580c4762a1bSJed Brown   PetscBool      cellHybrid  = user->cellHybrid;
581c4762a1bSJed Brown   PetscBool      cellSimplex = user->cellSimplex;
582c4762a1bSJed Brown   PetscMPIInt    rank, size;
583c4762a1bSJed Brown 
584c4762a1bSJed Brown   PetscFunctionBegin;
5859566063dSJacob Faibussowitsch   PetscCallMPI(MPI_Comm_rank(comm, &rank));
5869566063dSJacob Faibussowitsch   PetscCallMPI(MPI_Comm_size(comm, &size));
5879566063dSJacob Faibussowitsch   PetscCall(DMCreate(comm, dm));
5889566063dSJacob Faibussowitsch   PetscCall(DMSetType(*dm, DMPLEX));
5899566063dSJacob Faibussowitsch   PetscCall(DMSetDimension(*dm, dim));
590c4762a1bSJed Brown   switch (dim) {
591c4762a1bSJed Brown   case 1:
59263a3b9bcSJacob Faibussowitsch     PetscCheck(!cellHybrid,comm, PETSC_ERR_ARG_OUTOFRANGE, "Cannot make hybrid meshes for dimension %" PetscInt_FMT, dim);
5939566063dSJacob Faibussowitsch     PetscCall(CreateSimplex_1D(comm, dm));
594c4762a1bSJed Brown     break;
595c4762a1bSJed Brown   case 2:
596c4762a1bSJed Brown     if (cellSimplex) {
597c4762a1bSJed Brown       if (cellHybrid) {
5989566063dSJacob Faibussowitsch         PetscCall(CreateSimplexHybrid_2D(comm, user->testNum, dm));
599c4762a1bSJed Brown       } else {
6009566063dSJacob Faibussowitsch         PetscCall(CreateSimplex_2D(comm, dm));
601c4762a1bSJed Brown       }
602c4762a1bSJed Brown     } else {
603c4762a1bSJed Brown       if (cellHybrid) {
6049566063dSJacob Faibussowitsch         PetscCall(CreateTensorProductHybrid_2D(comm, user->testNum, dm));
605c4762a1bSJed Brown       } else {
6069566063dSJacob Faibussowitsch         PetscCall(CreateTensorProduct_2D(comm, user->testNum, dm));
607c4762a1bSJed Brown       }
608c4762a1bSJed Brown     }
609c4762a1bSJed Brown     break;
610c4762a1bSJed Brown   case 3:
611c4762a1bSJed Brown     if (cellSimplex) {
612c4762a1bSJed Brown       if (cellHybrid) {
6139566063dSJacob Faibussowitsch         PetscCall(CreateSimplexHybrid_3D(comm, user->testNum, dm));
614c4762a1bSJed Brown       } else {
6159566063dSJacob Faibussowitsch         PetscCall(CreateSimplex_3D(comm, user->testNum, dm));
616c4762a1bSJed Brown       }
617c4762a1bSJed Brown     } else {
618c4762a1bSJed Brown       if (cellHybrid) {
6199566063dSJacob Faibussowitsch         PetscCall(CreateTensorProductHybrid_3D(comm, user->testNum, dm));
620c4762a1bSJed Brown       } else {
6219566063dSJacob Faibussowitsch         PetscCall(CreateTensorProduct_3D(comm, user->testNum, dm));
622c4762a1bSJed Brown       }
623c4762a1bSJed Brown     }
624c4762a1bSJed Brown     break;
625c4762a1bSJed Brown   default:
62663a3b9bcSJacob Faibussowitsch     SETERRQ(comm, PETSC_ERR_ARG_OUTOFRANGE, "Cannot make meshes for dimension %" PetscInt_FMT, dim);
627c4762a1bSJed Brown   }
628c4762a1bSJed Brown   if (user->testPartition && size > 1) {
629c4762a1bSJed Brown     PetscPartitioner part;
630c4762a1bSJed Brown     PetscInt  *sizes  = NULL;
631c4762a1bSJed Brown     PetscInt  *points = NULL;
632c4762a1bSJed Brown 
633dd400576SPatrick Sanan     if (rank == 0) {
634c4762a1bSJed Brown       if (dim == 2 && cellSimplex && !cellHybrid && size == 2) {
635c4762a1bSJed Brown         switch (user->testNum) {
636c4762a1bSJed Brown         case 0: {
637c4762a1bSJed Brown           PetscInt triSizes_p2[2]  = {1, 1};
638c4762a1bSJed Brown           PetscInt triPoints_p2[2] = {0, 1};
639c4762a1bSJed Brown 
6409566063dSJacob Faibussowitsch           PetscCall(PetscMalloc2(2, &sizes, 2, &points));
6419566063dSJacob Faibussowitsch           PetscCall(PetscArraycpy(sizes,  triSizes_p2, 2));
6429566063dSJacob Faibussowitsch           PetscCall(PetscArraycpy(points, triPoints_p2, 2));break;}
643c4762a1bSJed Brown         default:
64463a3b9bcSJacob Faibussowitsch           SETERRQ(PETSC_COMM_WORLD, PETSC_ERR_ARG_WRONG, "Could not find matching test number %" PetscInt_FMT " for triangular mesh on 2 procs", user->testNum);
645c4762a1bSJed Brown         }
646c4762a1bSJed Brown       } else if (dim == 2 && cellSimplex && cellHybrid && size == 2) {
647c4762a1bSJed Brown         switch (user->testNum) {
648c4762a1bSJed Brown         case 0: {
649c4762a1bSJed Brown           PetscInt triSizes_p2[2]  = {1, 2};
650c4762a1bSJed Brown           PetscInt triPoints_p2[3] = {0, 1, 2};
651c4762a1bSJed Brown 
6529566063dSJacob Faibussowitsch           PetscCall(PetscMalloc2(2, &sizes, 3, &points));
6539566063dSJacob Faibussowitsch           PetscCall(PetscArraycpy(sizes,  triSizes_p2, 2));
6549566063dSJacob Faibussowitsch           PetscCall(PetscArraycpy(points, triPoints_p2, 3));break;}
655c4762a1bSJed Brown         default:
65663a3b9bcSJacob Faibussowitsch           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);
657c4762a1bSJed Brown         }
658c4762a1bSJed Brown       } else if (dim == 2 && !cellSimplex && !cellHybrid && size == 2) {
659c4762a1bSJed Brown         switch (user->testNum) {
660c4762a1bSJed Brown         case 0: {
661c4762a1bSJed Brown           PetscInt quadSizes_p2[2]  = {1, 1};
662c4762a1bSJed Brown           PetscInt quadPoints_p2[2] = {0, 1};
663c4762a1bSJed Brown 
6649566063dSJacob Faibussowitsch           PetscCall(PetscMalloc2(2, &sizes, 2, &points));
6659566063dSJacob Faibussowitsch           PetscCall(PetscArraycpy(sizes,  quadSizes_p2, 2));
6669566063dSJacob Faibussowitsch           PetscCall(PetscArraycpy(points, quadPoints_p2, 2));break;}
667c4762a1bSJed Brown         default:
66863a3b9bcSJacob Faibussowitsch           SETERRQ(PETSC_COMM_WORLD, PETSC_ERR_ARG_WRONG, "Could not find matching test number %" PetscInt_FMT " for quadrilateral mesh on 2 procs", user->testNum);
669c4762a1bSJed Brown         }
670c4762a1bSJed Brown       } else if (dim == 2 && !cellSimplex && cellHybrid && size == 2) {
671c4762a1bSJed Brown         switch (user->testNum) {
672c4762a1bSJed Brown         case 0: {
673c4762a1bSJed Brown           PetscInt quadSizes_p2[2]  = {1, 2};
674c4762a1bSJed Brown           PetscInt quadPoints_p2[3] = {0, 1, 2};
675c4762a1bSJed Brown 
6769566063dSJacob Faibussowitsch           PetscCall(PetscMalloc2(2, &sizes, 3, &points));
6779566063dSJacob Faibussowitsch           PetscCall(PetscArraycpy(sizes,  quadSizes_p2, 2));
6789566063dSJacob Faibussowitsch           PetscCall(PetscArraycpy(points, quadPoints_p2, 3));break;}
679c4762a1bSJed Brown         default:
68063a3b9bcSJacob Faibussowitsch           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);
681c4762a1bSJed Brown         }
682c4762a1bSJed Brown       } else if (dim == 3 && cellSimplex && !cellHybrid && size == 2) {
683c4762a1bSJed Brown         switch (user->testNum) {
684c4762a1bSJed Brown         case 0: {
685c4762a1bSJed Brown           PetscInt tetSizes_p2[2]  = {1, 1};
686c4762a1bSJed Brown           PetscInt tetPoints_p2[2] = {0, 1};
687c4762a1bSJed Brown 
6889566063dSJacob Faibussowitsch           PetscCall(PetscMalloc2(2, &sizes, 2, &points));
6899566063dSJacob Faibussowitsch           PetscCall(PetscArraycpy(sizes,  tetSizes_p2, 2));
6909566063dSJacob Faibussowitsch           PetscCall(PetscArraycpy(points, tetPoints_p2, 2));break;}
691c4762a1bSJed Brown         case 1: {
692c4762a1bSJed Brown           PetscInt tetSizes_p2[2]  = {1, 1};
693c4762a1bSJed Brown           PetscInt tetPoints_p2[2] = {0, 1};
694c4762a1bSJed Brown 
6959566063dSJacob Faibussowitsch           PetscCall(PetscMalloc2(2, &sizes, 2, &points));
6969566063dSJacob Faibussowitsch           PetscCall(PetscArraycpy(sizes,  tetSizes_p2, 2));
6979566063dSJacob Faibussowitsch           PetscCall(PetscArraycpy(points, tetPoints_p2, 2));break;}
698c4762a1bSJed Brown         default:
69963a3b9bcSJacob Faibussowitsch           SETERRQ(PETSC_COMM_WORLD, PETSC_ERR_ARG_WRONG, "Could not find matching test number %" PetscInt_FMT " for tetrahedral mesh on 2 procs", user->testNum);
700c4762a1bSJed Brown         }
701c4762a1bSJed Brown       } else if (dim == 3 && cellSimplex && cellHybrid && size == 2) {
702c4762a1bSJed Brown         switch (user->testNum) {
703c4762a1bSJed Brown         case 0: {
704c4762a1bSJed Brown           PetscInt tetSizes_p2[2]  = {1, 2};
705c4762a1bSJed Brown           PetscInt tetPoints_p2[3] = {0, 1, 2};
706c4762a1bSJed Brown 
7079566063dSJacob Faibussowitsch           PetscCall(PetscMalloc2(2, &sizes, 3, &points));
7089566063dSJacob Faibussowitsch           PetscCall(PetscArraycpy(sizes,  tetSizes_p2, 2));
7099566063dSJacob Faibussowitsch           PetscCall(PetscArraycpy(points, tetPoints_p2, 3));break;}
710c4762a1bSJed Brown         case 1: {
711c4762a1bSJed Brown           PetscInt tetSizes_p2[2]  = {3, 4};
712c4762a1bSJed Brown           PetscInt tetPoints_p2[7] = {0, 3, 5, 1, 2, 4, 6};
713c4762a1bSJed Brown 
7149566063dSJacob Faibussowitsch           PetscCall(PetscMalloc2(2, &sizes, 7, &points));
7159566063dSJacob Faibussowitsch           PetscCall(PetscArraycpy(sizes,  tetSizes_p2, 2));
7169566063dSJacob Faibussowitsch           PetscCall(PetscArraycpy(points, tetPoints_p2, 7));break;}
717c4762a1bSJed Brown         default:
71863a3b9bcSJacob Faibussowitsch           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);
719c4762a1bSJed Brown         }
720c4762a1bSJed Brown       } else if (dim == 3 && !cellSimplex && !cellHybrid && size == 2) {
721c4762a1bSJed Brown         switch (user->testNum) {
722c4762a1bSJed Brown         case 0: {
723c4762a1bSJed Brown           PetscInt hexSizes_p2[2]  = {1, 1};
724c4762a1bSJed Brown           PetscInt hexPoints_p2[2] = {0, 1};
725c4762a1bSJed Brown 
7269566063dSJacob Faibussowitsch           PetscCall(PetscMalloc2(2, &sizes, 2, &points));
7279566063dSJacob Faibussowitsch           PetscCall(PetscArraycpy(sizes,  hexSizes_p2, 2));
7289566063dSJacob Faibussowitsch           PetscCall(PetscArraycpy(points, hexPoints_p2, 2));break;}
729c4762a1bSJed Brown         default:
73063a3b9bcSJacob Faibussowitsch           SETERRQ(PETSC_COMM_WORLD, PETSC_ERR_ARG_WRONG, "Could not find matching test number %" PetscInt_FMT " for hexahedral mesh on 2 procs", user->testNum);
731c4762a1bSJed Brown         }
732c4762a1bSJed Brown       } else if (dim == 3 && !cellSimplex && cellHybrid && size == 2) {
733c4762a1bSJed Brown         switch (user->testNum) {
734c4762a1bSJed Brown         case 0: {
735c4762a1bSJed Brown           PetscInt hexSizes_p2[2]  = {1, 1};
736c4762a1bSJed Brown           PetscInt hexPoints_p2[2] = {0, 1};
737c4762a1bSJed Brown 
7389566063dSJacob Faibussowitsch           PetscCall(PetscMalloc2(2, &sizes, 2, &points));
7399566063dSJacob Faibussowitsch           PetscCall(PetscArraycpy(sizes,  hexSizes_p2, 2));
7409566063dSJacob Faibussowitsch           PetscCall(PetscArraycpy(points, hexPoints_p2, 2));break;}
741c4762a1bSJed Brown         case 1: {
742c4762a1bSJed Brown           PetscInt hexSizes_p2[2]  = {5, 4};
743c4762a1bSJed Brown           PetscInt hexPoints_p2[9] = {3, 4, 5, 7, 8, 0, 1, 2, 6};
744c4762a1bSJed Brown 
7459566063dSJacob Faibussowitsch           PetscCall(PetscMalloc2(2, &sizes, 9, &points));
7469566063dSJacob Faibussowitsch           PetscCall(PetscArraycpy(sizes,  hexSizes_p2, 2));
7479566063dSJacob Faibussowitsch           PetscCall(PetscArraycpy(points, hexPoints_p2, 9));break;}
748c4762a1bSJed Brown         default:
74963a3b9bcSJacob Faibussowitsch           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);
750c4762a1bSJed Brown         }
751c4762a1bSJed Brown       } else SETERRQ(PETSC_COMM_WORLD, PETSC_ERR_ARG_WRONG, "Could not find matching test partition");
752c4762a1bSJed Brown     }
7539566063dSJacob Faibussowitsch     PetscCall(DMPlexGetPartitioner(*dm, &part));
7549566063dSJacob Faibussowitsch     PetscCall(PetscPartitionerSetType(part, PETSCPARTITIONERSHELL));
7559566063dSJacob Faibussowitsch     PetscCall(PetscPartitionerShellSetPartition(part, size, sizes, points));
7569566063dSJacob Faibussowitsch     PetscCall(PetscFree2(sizes, points));
757c4762a1bSJed Brown   } else {
758c4762a1bSJed Brown     PetscPartitioner part;
759c4762a1bSJed Brown 
7609566063dSJacob Faibussowitsch     PetscCall(DMPlexGetPartitioner(*dm,&part));
7619566063dSJacob Faibussowitsch     PetscCall(PetscPartitionerSetFromOptions(part));
762c4762a1bSJed Brown   }
763c4762a1bSJed Brown   {
764c4762a1bSJed Brown     DM pdm = NULL;
765c4762a1bSJed Brown 
7669566063dSJacob Faibussowitsch     PetscCall(DMPlexDistribute(*dm, 0, NULL, &pdm));
767c4762a1bSJed Brown     if (pdm) {
7689566063dSJacob Faibussowitsch       PetscCall(DMViewFromOptions(pdm, NULL, "-dm_view"));
7699566063dSJacob Faibussowitsch       PetscCall(DMDestroy(dm));
770c4762a1bSJed Brown       *dm  = pdm;
771c4762a1bSJed Brown     }
772c4762a1bSJed Brown   }
7739566063dSJacob Faibussowitsch   PetscCall(DMPlexDistributeSetDefault(*dm, PETSC_FALSE));
7749566063dSJacob Faibussowitsch   PetscCall(DMViewFromOptions(*dm, NULL, "-dm_view_pre"));
7759566063dSJacob Faibussowitsch   PetscCall(DMSetFromOptions(*dm));
776c4762a1bSJed Brown   if (user->uninterpolate || user->reinterpolate) {
777c4762a1bSJed Brown     DM udm = NULL;
778c4762a1bSJed Brown 
7799566063dSJacob Faibussowitsch     PetscCall(DMPlexUninterpolate(*dm, &udm));
7809566063dSJacob Faibussowitsch     PetscCall(DMPlexCopyCoordinates(*dm, udm));
7819566063dSJacob Faibussowitsch     PetscCall(DMDestroy(dm));
782c4762a1bSJed Brown     *dm  = udm;
783c4762a1bSJed Brown   }
784c4762a1bSJed Brown   if (user->reinterpolate) {
785c4762a1bSJed Brown     DM idm = NULL;
786c4762a1bSJed Brown 
7879566063dSJacob Faibussowitsch     PetscCall(DMPlexInterpolate(*dm, &idm));
7889566063dSJacob Faibussowitsch     PetscCall(DMPlexCopyCoordinates(*dm, idm));
7899566063dSJacob Faibussowitsch     PetscCall(DMDestroy(dm));
790c4762a1bSJed Brown     *dm  = idm;
791c4762a1bSJed Brown   }
7929566063dSJacob Faibussowitsch   PetscCall(DMPlexDistributeSetDefault(*dm, PETSC_FALSE));
7939566063dSJacob Faibussowitsch   PetscCall(PetscObjectSetName((PetscObject) *dm, "Hybrid Mesh"));
7949566063dSJacob Faibussowitsch   PetscCall(DMViewFromOptions(*dm, NULL, "-dm_view"));
7959566063dSJacob Faibussowitsch   PetscCall(PetscObjectSetOptionsPrefix((PetscObject) *dm, "hyb_"));
7969566063dSJacob Faibussowitsch   PetscCall(DMSetFromOptions(*dm));
797c4762a1bSJed Brown   PetscFunctionReturn(0);
798c4762a1bSJed Brown }
799c4762a1bSJed Brown 
800c4762a1bSJed Brown int main(int argc, char **argv)
801c4762a1bSJed Brown {
802c4762a1bSJed Brown   DM             dm;
803c4762a1bSJed Brown   AppCtx         user;                 /* user-defined work context */
804c4762a1bSJed Brown 
8059566063dSJacob Faibussowitsch   PetscCall(PetscInitialize(&argc, &argv, NULL, help));
8069566063dSJacob Faibussowitsch   PetscCall(ProcessOptions(PETSC_COMM_WORLD, &user));
8079566063dSJacob Faibussowitsch   PetscCall(CreateMesh(PETSC_COMM_WORLD, &user, &dm));
8089566063dSJacob Faibussowitsch   PetscCall(DMDestroy(&dm));
8099566063dSJacob Faibussowitsch   PetscCall(PetscFinalize());
810b122ec5aSJacob Faibussowitsch   return 0;
811c4762a1bSJed Brown }
812c4762a1bSJed Brown 
813c4762a1bSJed Brown /*TEST
814c4762a1bSJed Brown 
815c4762a1bSJed Brown   # 1D Simplex 29-31
816c4762a1bSJed Brown   testset:
81754fcfd0cSMatthew G. Knepley     args: -dim 1 -cell_hybrid 0 -hyb_dm_plex_check_all -dm_plex_check_all
818c4762a1bSJed Brown     test:
819c4762a1bSJed Brown       suffix: 29
820c4762a1bSJed Brown     test:
821c4762a1bSJed Brown       suffix: 30
822c4762a1bSJed Brown       args: -dm_refine 1
823c4762a1bSJed Brown     test:
824c4762a1bSJed Brown       suffix: 31
825c4762a1bSJed Brown       args: -dm_refine 5
826c4762a1bSJed Brown 
827c4762a1bSJed Brown   # 2D Simplex 0-3
828c4762a1bSJed Brown   testset:
82954fcfd0cSMatthew G. Knepley     args: -dim 2 -cell_hybrid 0 -hyb_dm_plex_check_all -dm_plex_check_all
830c4762a1bSJed Brown     test:
831c4762a1bSJed Brown       suffix: 0
832c4762a1bSJed Brown     test:
833c4762a1bSJed Brown       suffix: 1
834*7f9d8d6cSVaclav Hapla       args: -dm_refine 1
835c4762a1bSJed Brown     test:
836c4762a1bSJed Brown       suffix: 2
837c4762a1bSJed Brown       nsize: 2
838c4762a1bSJed Brown     test:
839c4762a1bSJed Brown       suffix: 3
840c4762a1bSJed Brown       nsize: 2
841*7f9d8d6cSVaclav Hapla       args: -dm_refine 1
842c4762a1bSJed Brown     test:
843c4762a1bSJed Brown       suffix: 32
844c4762a1bSJed Brown       args: -dm_refine 1 -uninterpolate
845c4762a1bSJed Brown     test:
846c4762a1bSJed Brown       suffix: 33
847c4762a1bSJed Brown       nsize: 2
848c4762a1bSJed Brown       args: -dm_refine 1 -uninterpolate
849c4762a1bSJed Brown     test:
850c4762a1bSJed Brown       suffix: 34
851c4762a1bSJed Brown       nsize: 2
852c4762a1bSJed Brown       args: -dm_refine 3 -uninterpolate
853c4762a1bSJed Brown 
854c4762a1bSJed Brown   # 2D Hybrid Simplex 4-7
855c4762a1bSJed Brown   testset:
85654fcfd0cSMatthew G. Knepley     args: -dim 2 -hyb_dm_plex_check_all -in_dm_plex_check_all -dm_plex_check_all
857c4762a1bSJed Brown     test:
858c4762a1bSJed Brown       suffix: 4
859c4762a1bSJed Brown     test:
860c4762a1bSJed Brown       suffix: 5
861c4762a1bSJed Brown       args: -dm_refine 1
862c4762a1bSJed Brown     test:
863c4762a1bSJed Brown       suffix: 6
864c4762a1bSJed Brown       nsize: 2
865c4762a1bSJed Brown     test:
866c4762a1bSJed Brown       suffix: 7
867c4762a1bSJed Brown       nsize: 2
868c4762a1bSJed Brown       args: -dm_refine 1
869c4762a1bSJed Brown     test:
870c4762a1bSJed Brown       suffix: 24
871c4762a1bSJed Brown       args: -test_num 1 -dm_refine 1
872c4762a1bSJed Brown 
873c4762a1bSJed Brown   # 2D Quad 12-13
874c4762a1bSJed Brown   testset:
87554fcfd0cSMatthew G. Knepley     args: -dim 2 -cell_simplex 0 -cell_hybrid 0 -hyb_dm_plex_check_all -dm_plex_check_all
876c4762a1bSJed Brown     test:
877c4762a1bSJed Brown       suffix: 12
878c4762a1bSJed Brown       args: -dm_refine 1
879c4762a1bSJed Brown     test:
880c4762a1bSJed Brown       suffix: 13
881c4762a1bSJed Brown       nsize: 2
882c4762a1bSJed Brown       args: -dm_refine 1
883c4762a1bSJed Brown 
884c4762a1bSJed Brown   # 2D Hybrid Quad 27-28
885c4762a1bSJed Brown   testset:
88654fcfd0cSMatthew G. Knepley     args: -dim 2 -cell_simplex 0 -hyb_dm_plex_check_all -in_dm_plex_check_all -dm_plex_check_all
887c4762a1bSJed Brown     test:
888c4762a1bSJed Brown       suffix: 27
889c4762a1bSJed Brown       args: -dm_refine 1
890c4762a1bSJed Brown     test:
891c4762a1bSJed Brown       suffix: 28
892c4762a1bSJed Brown       nsize: 2
893c4762a1bSJed Brown       args: -dm_refine 1
894c4762a1bSJed Brown 
895c4762a1bSJed Brown   # 3D Simplex 8-11
896c4762a1bSJed Brown   testset:
89754fcfd0cSMatthew G. Knepley     args: -dim 3 -cell_hybrid 0 -hyb_dm_plex_check_all -dm_plex_check_all
898c4762a1bSJed Brown     test:
899c4762a1bSJed Brown       suffix: 8
900c4762a1bSJed Brown       args: -dm_refine 1
901c4762a1bSJed Brown     test:
902c4762a1bSJed Brown       suffix: 9
903c4762a1bSJed Brown       nsize: 2
904c4762a1bSJed Brown       args: -dm_refine 1
905c4762a1bSJed Brown     test:
906c4762a1bSJed Brown       suffix: 10
907c4762a1bSJed Brown       args: -test_num 1 -dm_refine 1
908c4762a1bSJed Brown     test:
909c4762a1bSJed Brown       suffix: 11
910c4762a1bSJed Brown       nsize: 2
911c4762a1bSJed Brown       args: -test_num 1 -dm_refine 1
912c4762a1bSJed Brown     test:
913c4762a1bSJed Brown       suffix: 25
914c4762a1bSJed Brown       args: -test_num 2 -dm_refine 2
915c4762a1bSJed Brown 
916c4762a1bSJed Brown   # 3D Hybrid Simplex 16-19
917c4762a1bSJed Brown   testset:
91854fcfd0cSMatthew G. Knepley     args: -dim 3 -hyb_dm_plex_check_all -in_dm_plex_check_all -dm_plex_check_all
919c4762a1bSJed Brown     test:
920c4762a1bSJed Brown       suffix: 16
921c4762a1bSJed Brown       args: -dm_refine 1
922c4762a1bSJed Brown     test:
923c4762a1bSJed Brown       suffix: 17
924c4762a1bSJed Brown       nsize: 2
925c4762a1bSJed Brown       args: -dm_refine 1
926c4762a1bSJed Brown     test:
927c4762a1bSJed Brown       suffix: 18
928c4762a1bSJed Brown       args: -test_num 1 -dm_refine 1
929c4762a1bSJed Brown     test:
930c4762a1bSJed Brown       suffix: 19
931c4762a1bSJed Brown       nsize: 2
932c4762a1bSJed Brown       args: -test_num 1 -dm_refine 1
933c4762a1bSJed Brown 
934c4762a1bSJed Brown   # 3D Hex 14-15
935c4762a1bSJed Brown   testset:
93654fcfd0cSMatthew G. Knepley     args: -dim 3 -cell_simplex 0 -cell_hybrid 0 -hyb_dm_plex_check_all -dm_plex_check_all
937c4762a1bSJed Brown     test:
938c4762a1bSJed Brown       suffix: 14
939c4762a1bSJed Brown       args: -dm_refine 1
940c4762a1bSJed Brown     test:
941c4762a1bSJed Brown       suffix: 15
942c4762a1bSJed Brown       nsize: 2
943c4762a1bSJed Brown      args: -dm_refine 1
944c4762a1bSJed Brown     test:
945c4762a1bSJed Brown       suffix: 26
946c4762a1bSJed Brown       args: -test_num 1 -dm_refine 2
947c4762a1bSJed Brown 
948c4762a1bSJed Brown   # 3D Hybrid Hex 20-23
949c4762a1bSJed Brown   testset:
95054fcfd0cSMatthew G. Knepley     args: -dim 3 -cell_simplex 0 -hyb_dm_plex_check_all -in_dm_plex_check_all -dm_plex_check_all
951c4762a1bSJed Brown     test:
952c4762a1bSJed Brown       suffix: 20
953c4762a1bSJed Brown       args: -dm_refine 1
954c4762a1bSJed Brown     test:
955c4762a1bSJed Brown       suffix: 21
956c4762a1bSJed Brown       nsize: 2
957c4762a1bSJed Brown       args: -dm_refine 1
958c4762a1bSJed Brown     test:
959c4762a1bSJed Brown       suffix: 22
960c4762a1bSJed Brown       args: -test_num 1 -dm_refine 1
961c4762a1bSJed Brown     test:
962c4762a1bSJed Brown       suffix: 23
963c4762a1bSJed Brown       nsize: 2
964c4762a1bSJed Brown       args: -test_num 1 -dm_refine 1
965c4762a1bSJed Brown 
966c4762a1bSJed Brown   # Hybrid interpolation
96754fcfd0cSMatthew G. Knepley   #   TODO Setup new tests (like -reinterpolate) that interpolate hybrid cells
968c4762a1bSJed Brown   testset:
969c4762a1bSJed Brown     nsize: 2
97054fcfd0cSMatthew G. Knepley     args: -test_partition 0 -petscpartitioner_type simple -dm_view -hyb_dm_plex_check_all -in_dm_plex_check_all -dm_plex_check_all
971c4762a1bSJed Brown     test:
972c4762a1bSJed Brown       suffix: hybint_2d_0
973c4762a1bSJed Brown       args: -dim 2 -dm_refine 2
974c4762a1bSJed Brown     test:
975c4762a1bSJed Brown       suffix: hybint_2d_1
976c4762a1bSJed Brown       args: -dim 2 -dm_refine 2 -test_num 1
977c4762a1bSJed Brown     test:
978c4762a1bSJed Brown       suffix: hybint_3d_0
979c4762a1bSJed Brown       args: -dim 3 -dm_refine 1
980c4762a1bSJed Brown     test:
981c4762a1bSJed Brown       suffix: hybint_3d_1
982c4762a1bSJed Brown       args: -dim 3 -dm_refine 1 -test_num 1
983c4762a1bSJed Brown 
984c4762a1bSJed Brown TEST*/
985