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