Actual source code: ex1.c

petsc-3.12.5 2020-03-29
Report Typos and Errors
  1: static char help[] = "Tests various DMPlex routines to construct, refine and distribute a mesh.\n\n";

  3:  #include <petscdmplex.h>

  5: typedef enum {BOX, CYLINDER} DomainShape;
  6: enum {STAGE_LOAD, STAGE_DISTRIBUTE, STAGE_REFINE, STAGE_OVERLAP};

  8: typedef struct {
  9:   DM            dm;                /* REQUIRED in order to use SNES evaluation functions */
 10:   PetscInt      debug;             /* The debugging level */
 11:   PetscLogEvent createMeshEvent;
 12:   PetscLogStage stages[4];
 13:   /* Domain and mesh definition */
 14:   PetscInt      dim;                             /* The topological mesh dimension */
 15:   PetscBool     interpolate;                     /* Generate intermediate mesh elements */
 16:   PetscReal     refinementLimit;                 /* The largest allowable cell volume */
 17:   PetscBool     cellSimplex;                     /* Use simplices or hexes */
 18:   PetscBool     cellWedge;                       /* Use wedges */
 19:   PetscBool     simplex2tensor;                  /* Refine simplicials in hexes */
 20:   DomainShape   domainShape;                     /* Shape of the region to be meshed */
 21:   PetscInt      *domainBoxSizes;                 /* Sizes of the box mesh */
 22:   PetscReal     *domainBoxL,*domainBoxU;         /* Lower left, upper right corner of the box mesh */
 23:   DMBoundaryType periodicity[3];                 /* The domain periodicity */
 24:   char          filename[PETSC_MAX_PATH_LEN];    /* Import mesh from file */
 25:   char          bdfilename[PETSC_MAX_PATH_LEN];  /* Import mesh boundary from file */
 26:   char          extfilename[PETSC_MAX_PATH_LEN]; /* Import 2D mesh to be extruded from file */
 27:   PetscBool     testPartition;                   /* Use a fixed partitioning for testing */
 28:   PetscInt      overlap;                         /* The cell overlap to use during partitioning */
 29:   PetscBool     testShape;                       /* Test the cell shape quality */
 30:   PetscReal     extrude_thickness;               /* Thickness of extrusion */
 31:   PetscInt      extrude_layers;                  /* Layers to be extruded */
 32:   PetscBool     testp4est[2];
 33:   PetscBool     redistribute;
 34:   PetscBool     final_ref;                       /* Run refinement at the end */
 35:   PetscBool     final_diagnostics;               /* Run diagnostics on the final mesh */
 36: } AppCtx;

 38: PetscErrorCode ProcessOptions(MPI_Comm comm, AppCtx *options)
 39: {
 40:   const char       *dShapes[2] = {"box", "cylinder"};
 41:   PetscInt         shape, bd, n;
 42:   static PetscInt  domainBoxSizes[3] = {1,1,1};
 43:   static PetscReal domainBoxL[3] = {0.,0.,0.};
 44:   static PetscReal domainBoxU[3] = {1.,1.,1.};
 45:   PetscBool        flg;
 46:   PetscErrorCode   ierr;

 49:   options->debug             = 0;
 50:   options->dim               = 2;
 51:   options->interpolate       = PETSC_FALSE;
 52:   options->refinementLimit   = 0.0;
 53:   options->cellSimplex       = PETSC_TRUE;
 54:   options->cellWedge         = PETSC_FALSE;
 55:   options->domainShape       = BOX;
 56:   options->domainBoxSizes    = NULL;
 57:   options->domainBoxL        = NULL;
 58:   options->domainBoxU        = NULL;
 59:   options->periodicity[0]    = DM_BOUNDARY_NONE;
 60:   options->periodicity[1]    = DM_BOUNDARY_NONE;
 61:   options->periodicity[2]    = DM_BOUNDARY_NONE;
 62:   options->filename[0]       = '\0';
 63:   options->bdfilename[0]     = '\0';
 64:   options->extfilename[0]    = '\0';
 65:   options->testPartition     = PETSC_FALSE;
 66:   options->overlap           = 0;
 67:   options->testShape         = PETSC_FALSE;
 68:   options->simplex2tensor    = PETSC_FALSE;
 69:   options->extrude_layers    = 2;
 70:   options->extrude_thickness = 0.1;
 71:   options->testp4est[0]      = PETSC_FALSE;
 72:   options->testp4est[1]      = PETSC_FALSE;
 73:   options->redistribute      = PETSC_FALSE;
 74:   options->final_ref         = PETSC_FALSE;
 75:   options->final_diagnostics = PETSC_TRUE;

 77:   PetscOptionsBegin(comm, "", "Meshing Problem Options", "DMPLEX");
 78:   PetscOptionsBoundedInt("-debug", "The debugging level", "ex1.c", options->debug, &options->debug, NULL,0);
 79:   PetscOptionsRangeInt("-dim", "The topological mesh dimension", "ex1.c", options->dim, &options->dim, NULL,1,3);
 80:   PetscOptionsBool("-interpolate", "Generate intermediate mesh elements", "ex1.c", options->interpolate, &options->interpolate, NULL);
 81:   PetscOptionsReal("-refinement_limit", "The largest allowable cell volume", "ex1.c", options->refinementLimit, &options->refinementLimit, NULL);
 82:   PetscOptionsBool("-cell_simplex", "Use simplices if true, otherwise hexes", "ex1.c", options->cellSimplex, &options->cellSimplex, NULL);
 83:   PetscOptionsBool("-cell_wedge", "Use wedges if true", "ex1.c", options->cellWedge, &options->cellWedge, NULL);
 84:   PetscOptionsBool("-simplex2tensor", "Refine simplicial cells in tensor product cells", "ex1.c", options->simplex2tensor, &options->simplex2tensor, NULL);
 85:   if (options->simplex2tensor) options->interpolate = PETSC_TRUE;
 86:   shape = options->domainShape;
 87:   PetscOptionsEList("-domain_shape","The shape of the domain","ex1.c", dShapes, 2, dShapes[options->domainShape], &shape, NULL);
 88:   options->domainShape = (DomainShape) shape;
 89:   PetscOptionsIntArray("-domain_box_sizes","The sizes of the box domain","ex1.c", domainBoxSizes, (n=3,&n), &flg);
 90:   if (flg) { options->domainShape = BOX; options->domainBoxSizes = domainBoxSizes;}
 91:   PetscOptionsRealArray("-domain_box_ll","Coordinates of the lower left corner of the box domain","ex1.c", domainBoxL, (n=3,&n), &flg);
 92:   if (flg) { options->domainBoxL = domainBoxL;}
 93:   PetscOptionsRealArray("-domain_box_ur","Coordinates of the upper right corner of the box domain","ex1.c", domainBoxU, (n=3,&n), &flg);
 94:   if (flg) { options->domainBoxU = domainBoxU;}
 95:   bd = options->periodicity[0];
 96:   PetscOptionsEList("-x_periodicity", "The x-boundary periodicity", "ex1.c", DMBoundaryTypes, 5, DMBoundaryTypes[options->periodicity[0]], &bd, NULL);
 97:   options->periodicity[0] = (DMBoundaryType) bd;
 98:   bd = options->periodicity[1];
 99:   PetscOptionsEList("-y_periodicity", "The y-boundary periodicity", "ex1.c", DMBoundaryTypes, 5, DMBoundaryTypes[options->periodicity[1]], &bd, NULL);
100:   options->periodicity[1] = (DMBoundaryType) bd;
101:   bd = options->periodicity[2];
102:   PetscOptionsEList("-z_periodicity", "The z-boundary periodicity", "ex1.c", DMBoundaryTypes, 5, DMBoundaryTypes[options->periodicity[2]], &bd, NULL);
103:   options->periodicity[2] = (DMBoundaryType) bd;
104:   PetscOptionsString("-filename", "The mesh file", "ex1.c", options->filename, options->filename, PETSC_MAX_PATH_LEN, NULL);
105:   PetscOptionsString("-bd_filename", "The mesh boundary file", "ex1.c", options->bdfilename, options->bdfilename, PETSC_MAX_PATH_LEN, NULL);
106:   PetscOptionsString("-ext_filename", "The 2D mesh file to be extruded", "ex1.c", options->extfilename, options->extfilename, PETSC_MAX_PATH_LEN, NULL);
107:   PetscOptionsBoundedInt("-ext_layers", "The number of layers to extrude", "ex1.c", options->extrude_layers, &options->extrude_layers, NULL,0);
108:   PetscOptionsReal("-ext_thickness", "The thickness of the layer to be extruded", "ex1.c", options->extrude_thickness, &options->extrude_thickness, NULL);
109:   PetscOptionsBool("-test_partition", "Use a fixed partition for testing", "ex1.c", options->testPartition, &options->testPartition, NULL);
110:   PetscOptionsBoundedInt("-overlap", "The cell overlap for partitioning", "ex1.c", options->overlap, &options->overlap, NULL,0);
111:   PetscOptionsBool("-test_shape", "Report cell shape qualities (Jacobian condition numbers)", "ex1.c", options->testShape, &options->testShape, NULL);
112:   PetscOptionsBool("-test_p4est_seq", "Test p4est with sequential base DM", "ex1.c", options->testp4est[0], &options->testp4est[0], NULL);
113:   PetscOptionsBool("-test_p4est_par", "Test p4est with parallel base DM", "ex1.c", options->testp4est[1], &options->testp4est[1], NULL);
114:   PetscOptionsBool("-test_redistribute", "Test redistribution", "ex1.c", options->redistribute, &options->redistribute, NULL);
115:   PetscOptionsBool("-final_ref", "Run uniform refinement on the final mesh", "ex1.c", options->final_ref, &options->final_ref, NULL);
116:   PetscOptionsBool("-final_diagnostics", "Run diagnostics on the final mesh", "ex1.c", options->final_diagnostics, &options->final_diagnostics, NULL);
117:   PetscOptionsEnd();

119:   PetscLogEventRegister("CreateMesh", DM_CLASSID, &options->createMeshEvent);
120:   PetscLogStageRegister("MeshLoad",       &options->stages[STAGE_LOAD]);
121:   PetscLogStageRegister("MeshDistribute", &options->stages[STAGE_DISTRIBUTE]);
122:   PetscLogStageRegister("MeshRefine",     &options->stages[STAGE_REFINE]);
123:   PetscLogStageRegister("MeshOverlap",    &options->stages[STAGE_OVERLAP]);
124:   return(0);
125: }

127: PetscErrorCode CreateMesh(MPI_Comm comm, AppCtx *user, DM *dm)
128: {
129:   PetscInt       dim                  = user->dim;
130:   PetscBool      interpolate          = user->interpolate;
131:   PetscReal      refinementLimit      = user->refinementLimit;
132:   PetscBool      cellSimplex          = user->cellSimplex;
133:   PetscBool      cellWedge            = user->cellWedge;
134:   PetscBool      simplex2tensor       = user->simplex2tensor;
135:   const char    *filename             = user->filename;
136:   const char    *bdfilename           = user->bdfilename;
137:   const char    *extfilename          = user->extfilename;
138:   PetscBool      testp4est_seq        = user->testp4est[0];
139:   PetscBool      testp4est_par        = user->testp4est[1];
140:   PetscInt       triSizes_n2[2]       = {4, 4};
141:   PetscInt       triPoints_n2[8]      = {3, 5, 6, 7, 0, 1, 2, 4};
142:   PetscInt       triSizes_n8[8]       = {1, 1, 1, 1, 1, 1, 1, 1};
143:   PetscInt       triPoints_n8[8]      = {0, 1, 2, 3, 4, 5, 6, 7};
144:   PetscInt       quadSizes[2]         = {2, 2};
145:   PetscInt       quadPoints[4]        = {2, 3, 0, 1};
146:   PetscInt       gmshSizes_n3[3]      = {14, 14, 14};
147:   PetscInt       gmshPoints_n3[42]    = {1, 2,  4,  5,  9, 10, 11, 15, 16, 20, 21, 27, 28, 29,
148:                                          3, 8, 12, 30, 31, 32, 33, 34, 35, 36, 37, 38, 39, 40,
149:                                          0, 6,  7, 13, 14, 17, 18, 19, 22, 23, 24, 25, 26, 41};
150:   PetscInt       fluentSizes_n3[3]    = {50, 50, 50};
151:   PetscInt       fluentPoints_n3[150] = { 5,  6,  7,  8, 12, 14, 16,  34,  36,  37,  38,  39,  40,  41,  42,  43,  44,  45,  46,  48,  50,  51,  80,  81,  89,
152:                                          91, 93, 94, 95, 96, 97, 98,  99, 100, 101, 104, 121, 122, 124, 125, 126, 127, 128, 129, 131, 133, 143, 144, 145, 147,
153:                                           1,  3,  4,  9, 10, 17, 18,  19,  24,  25,  26,  27,  28,  29,  30,  31,  32,  33,  35,  47,  61,  71,  72,  73,  74,
154:                                          75, 76, 77, 78, 79, 86, 87,  88,  90,  92, 113, 115, 116, 117, 118, 119, 120, 123, 138, 140, 141, 142, 146, 148, 149,
155:                                           0,  2, 11, 13, 15, 20, 21,  22,  23,  49,  52,  53,  54,  55,  56,  57,  58,  59,  60,  62,  63,  64,  65,  66,  67,
156:                                          68, 69, 70, 82, 83, 84, 85, 102, 103, 105, 106, 107, 108, 109, 110, 111, 112, 114, 130, 132, 134, 135, 136, 137, 139};
157:   size_t         len, bdlen, extlen;
158:   PetscMPIInt    rank, size;

162:   PetscLogEventBegin(user->createMeshEvent,0,0,0,0);
163:   MPI_Comm_rank(comm, &rank);
164:   MPI_Comm_size(comm, &size);
165:   PetscStrlen(filename, &len);
166:   PetscStrlen(bdfilename, &bdlen);
167:   PetscStrlen(extfilename, &extlen);
168:   PetscLogStagePush(user->stages[STAGE_LOAD]);
169:   if (len) {
170:     DMPlexCreateFromFile(comm, filename, interpolate, dm);
171:   } else if (bdlen) {
172:     DM boundary;

174:     DMPlexCreateFromFile(comm, bdfilename, interpolate, &boundary);
175:     DMPlexGenerate(boundary, NULL, interpolate, dm);
176:     DMDestroy(&boundary);
177:   } else if (extlen) {
178:     DM edm;

180:     DMPlexCreateFromFile(comm, extfilename, interpolate, &edm);
181:     DMPlexExtrude(edm, user->extrude_layers, user->extrude_thickness, PETSC_TRUE, interpolate, dm);
182:     DMDestroy(&edm);
183:   } else {
184:     switch (user->domainShape) {
185:     case BOX:
186:       if (cellWedge) {
187:         if (dim != 3) SETERRQ1(comm, PETSC_ERR_ARG_WRONG, "Dimension must be 3 for a wedge mesh, not %D", dim);
188:         DMPlexCreateWedgeBoxMesh(comm, user->domainBoxSizes, user->domainBoxL, user->domainBoxU, user->periodicity, PETSC_FALSE, interpolate, dm);
189:       } else {
190:         DMPlexCreateBoxMesh(comm, dim, cellSimplex, user->domainBoxSizes, user->domainBoxL, user->domainBoxU, user->periodicity, interpolate, dm);
191:       }
192:       break;
193:     case CYLINDER:
194:       if (cellSimplex) SETERRQ(comm, PETSC_ERR_ARG_WRONG, "Cannot mesh a cylinder with simplices");
195:       if (dim != 3)    SETERRQ1(comm, PETSC_ERR_ARG_WRONG, "Dimension must be 3 for a cylinder mesh, not %D", dim);
196:       if (cellWedge) {
197:         DMPlexCreateWedgeCylinderMesh(comm, 6, interpolate, dm);
198:       } else {
199:         DMPlexCreateHexCylinderMesh(comm, 3, user->periodicity[2], dm);
200:       }
201:       break;
202:     default: SETERRQ1(comm, PETSC_ERR_ARG_WRONG, "Unknown domain shape %D", user->domainShape);
203:     }
204:   }
205:   DMLocalizeCoordinates(*dm); /* needed for periodic */
206:   DMViewFromOptions(*dm,NULL,"-init_dm_view");
207:   DMGetDimension(*dm,&dim);

209:   if (testp4est_seq) {
210: #if defined(PETSC_HAVE_P4EST)
211:     DM dmConv = NULL;

213:     DMPlexSetRefinementUniform(*dm, PETSC_TRUE);
214:     DMPlexRefineSimplexToTensor(*dm, &dmConv);
215:     if (dmConv) {
216:       DMDestroy(dm);
217:       *dm  = dmConv;
218:     }
219:     user->cellSimplex = PETSC_FALSE;

221:     DMConvert(*dm,dim == 2 ? DMP4EST : DMP8EST,&dmConv);
222:     if (dmConv) {
223:       PetscObjectSetOptionsPrefix((PetscObject) dmConv, "conv_seq_1_");
224:       DMSetFromOptions(dmConv);
225:       DMDestroy(dm);
226:       *dm  = dmConv;
227:     }
228:     PetscObjectSetOptionsPrefix((PetscObject) *dm, "conv_seq_1_");
229:     DMSetUp(*dm);
230:     DMViewFromOptions(*dm, NULL, "-dm_view");
231:     DMConvert(*dm,DMPLEX,&dmConv);
232:     if (dmConv) {
233:       PetscObjectSetOptionsPrefix((PetscObject) dmConv, "conv_seq_2_");
234:       DMSetFromOptions(dmConv);
235:       DMDestroy(dm);
236:       *dm  = dmConv;
237:     }
238:     PetscObjectSetOptionsPrefix((PetscObject) *dm, "conv_seq_2_");
239:     DMViewFromOptions(*dm, NULL, "-dm_view");
240:     PetscObjectSetOptionsPrefix((PetscObject) *dm, NULL);
241: #else
242:     SETERRQ(PETSC_COMM_WORLD,PETSC_ERR_SUP,"Recompile with --download-p4est");
243: #endif
244:   }

246:   PetscLogStagePop();
247:   if (!testp4est_seq) {
248:     DM refinedMesh     = NULL;
249:     DM distributedMesh = NULL;

251:     if (user->testPartition) {
252:       const PetscInt  *sizes = NULL;
253:       const PetscInt  *points = NULL;
254:       PetscPartitioner part;

256:       if (!rank) {
257:         if (dim == 2 && cellSimplex && size == 2) {
258:            sizes = triSizes_n2; points = triPoints_n2;
259:         } else if (dim == 2 && cellSimplex && size == 8) {
260:           sizes = triSizes_n8; points = triPoints_n8;
261:         } else if (dim == 2 && !cellSimplex && size == 2) {
262:           sizes = quadSizes; points = quadPoints;
263:         } else if (dim == 2 && size == 3) {
264:           PetscInt Nc;

266:           DMPlexGetHeightStratum(*dm, 0, NULL, &Nc);
267:           if (Nc == 42) { /* Gmsh 3 & 4 */
268:             sizes = gmshSizes_n3; points = gmshPoints_n3;
269:           } else if (Nc == 150) { /* Fluent 1 */
270:             sizes = fluentSizes_n3; points = fluentPoints_n3;
271:           } else if (Nc == 42) { /* Med 1 */
272:           } else if (Nc == 161) { /* Med 3 */
273:           }
274:         }
275:       }
276:       DMPlexGetPartitioner(*dm, &part);
277:       PetscPartitionerSetType(part, PETSCPARTITIONERSHELL);
278:       PetscPartitionerShellSetPartition(part, size, sizes, points);
279:     } else {
280:       PetscPartitioner part;

282:       DMPlexGetPartitioner(*dm,&part);
283:       PetscPartitionerSetFromOptions(part);
284:     }
285:     /* Distribute mesh over processes */
286:     PetscLogStagePush(user->stages[STAGE_DISTRIBUTE]);
287:     DMViewFromOptions(*dm, NULL, "-dm_pre_dist_view");
288:     DMPlexDistribute(*dm, 0, NULL, &distributedMesh);
289:     if (distributedMesh) {
290:       DMDestroy(dm);
291:       *dm  = distributedMesh;
292:     }
293:     PetscLogStagePop();
294:     DMViewFromOptions(*dm, NULL, "-distributed_dm_view");
295:     /* Refine mesh using a volume constraint */
296:     PetscLogStagePush(user->stages[STAGE_REFINE]);
297:     DMPlexSetRefinementUniform(*dm, PETSC_FALSE);
298:     DMPlexSetRefinementLimit(*dm, refinementLimit);
299:     DMRefine(*dm, comm, &refinedMesh);
300:     if (refinedMesh) {
301:       DMDestroy(dm);
302:       *dm  = refinedMesh;
303:     }
304:     PetscLogStagePop();
305:   }
306:   PetscLogStagePush(user->stages[STAGE_REFINE]);
307:   DMSetFromOptions(*dm);
308:   PetscLogStagePop();

310:   if (testp4est_par) {
311: #if defined(PETSC_HAVE_P4EST)
312:     DM dmConv = NULL;

314:     DMPlexSetRefinementUniform(*dm, PETSC_TRUE);
315:     DMPlexRefineSimplexToTensor(*dm, &dmConv);
316:     if (dmConv) {
317:       DMDestroy(dm);
318:       *dm  = dmConv;
319:     }
320:     user->cellSimplex = PETSC_FALSE;

322:     DMConvert(*dm,dim == 2 ? DMP4EST : DMP8EST,&dmConv);
323:     if (dmConv) {
324:       PetscObjectSetOptionsPrefix((PetscObject) dmConv, "conv_par_1_");
325:       DMSetFromOptions(dmConv);
326:       DMDestroy(dm);
327:       *dm  = dmConv;
328:     }
329:     PetscObjectSetOptionsPrefix((PetscObject) *dm, "conv_par_1_");
330:     DMSetUp(*dm);
331:     DMViewFromOptions(*dm, NULL, "-dm_view");
332:     DMConvert(*dm, DMPLEX, &dmConv);
333:     if (dmConv) {
334:       PetscObjectSetOptionsPrefix((PetscObject) dmConv, "conv_par_2_");
335:       DMSetFromOptions(dmConv);
336:       DMDestroy(dm);
337:       *dm  = dmConv;
338:     }
339:     PetscObjectSetOptionsPrefix((PetscObject) *dm, "conv_par_2_");
340:     DMViewFromOptions(*dm, NULL, "-dm_view");
341:     PetscObjectSetOptionsPrefix((PetscObject) *dm, NULL);
342: #else
343:     SETERRQ(PETSC_COMM_WORLD,PETSC_ERR_SUP,"Recompile with --download-p4est");
344: #endif
345:   }

347:   /* test redistribution of an already distributed mesh */
348:   if (user->redistribute) {
349:     DM distributedMesh;


352:     DMViewFromOptions(*dm, NULL, "-dm_pre_redist_view");
353:     DMPlexDistribute(*dm, 0, NULL, &distributedMesh);
354:     if (distributedMesh) {
355:       DMDestroy(dm);
356:       *dm  = distributedMesh;
357:     }
358:     DMViewFromOptions(*dm, NULL, "-dm_post_redist_view");
359:   }

361:   if (user->overlap) {
362:     DM overlapMesh = NULL;

364:     /* Add the overlap to refined mesh */
365:     PetscLogStagePush(user->stages[STAGE_OVERLAP]);
366:     DMViewFromOptions(*dm, NULL, "-dm_pre_overlap_view");
367:     DMPlexDistributeOverlap(*dm, user->overlap, NULL, &overlapMesh);
368:     if (overlapMesh) {
369:       PetscInt overlap;
370:       DMPlexGetOverlap(overlapMesh, &overlap);
371:       PetscViewerASCIIPrintf(PETSC_VIEWER_STDOUT_WORLD, "Overlap: %D\n", overlap);
372:       DMDestroy(dm);
373:       *dm = overlapMesh;
374:     }
375:     DMViewFromOptions(*dm, NULL, "-dm_post_overlap_view");
376:     PetscLogStagePop();
377:   }

379:   if (simplex2tensor) {
380:     DM rdm = NULL;
381:     DMPlexSetRefinementUniform(*dm, PETSC_TRUE);
382:     DMPlexRefineSimplexToTensor(*dm, &rdm);
383:     if (rdm) {
384:       DMDestroy(dm);
385:       *dm  = rdm;
386:     }
387:     user->cellSimplex = PETSC_FALSE;
388:   }

390:   if (user->final_ref) {
391:     DM refinedMesh = NULL;

393:     DMPlexSetRefinementUniform(*dm, PETSC_TRUE);
394:     DMRefine(*dm, comm, &refinedMesh);
395:     if (refinedMesh) {
396:       DMDestroy(dm);
397:       *dm  = refinedMesh;
398:     }
399:   }

401:   PetscObjectSetName((PetscObject) *dm, "Simplicial Mesh");
402:   DMViewFromOptions(*dm, NULL, "-dm_view");
403:   if (user->final_diagnostics) {
404:     PetscBool interpolated = PETSC_TRUE;
405:     PetscInt  dim, depth;

407:     DMGetDimension(*dm, &dim);
408:     DMPlexGetDepth(*dm, &depth);
409:     if (depth >= 0 && dim != depth) interpolated = PETSC_FALSE;

411:     DMPlexCheckSymmetry(*dm);
412:     if (interpolated) {
413:       DMPlexCheckFaces(*dm, 0);
414:     }
415:     DMPlexCheckSkeleton(*dm, 0);
416:     DMPlexCheckGeometry(*dm);
417:   }
418:   PetscLogEventEnd(user->createMeshEvent,0,0,0,0);
419:   user->dm = *dm;
420:   return(0);
421: }

423: int main(int argc, char **argv)
424: {
425:   AppCtx         user;                 /* user-defined work context */

428:   PetscInitialize(&argc, &argv, NULL, help);if (ierr) return ierr;
429:   ProcessOptions(PETSC_COMM_WORLD, &user);
430:   CreateMesh(PETSC_COMM_WORLD, &user, &user.dm);
431:   if (user.testShape) {DMPlexCheckCellShape(user.dm, PETSC_TRUE, PETSC_DETERMINE);}
432:   DMDestroy(&user.dm);
433:   PetscFinalize();
434:   return ierr;
435: }

437: /*TEST

439:   # CTetGen 0-1
440:   test:
441:     suffix: 0
442:     requires: ctetgen
443:     args: -dim 3 -ctetgen_verbose 4 -dm_view ascii::ascii_info_detail -info -info_exclude null
444:   test:
445:     suffix: 1
446:     requires: ctetgen
447:     args: -dim 3 -ctetgen_verbose 4 -refinement_limit 0.0625 -dm_view ascii::ascii_info_detail -info -info_exclude null

449:   # 2D LaTex and ASCII output 2-9
450:   test:
451:     suffix: 2
452:     requires: triangle
453:     args: -dim 2 -dm_view ascii::ascii_latex
454:   test:
455:     suffix: 3
456:     requires: triangle
457:     args: -dim 2 -dm_refine 1 -interpolate 1 -dm_view ascii::ascii_info_detail
458:   test:
459:     suffix: 4
460:     requires: triangle
461:     nsize: 2
462:     args: -dim 2 -dm_refine 1 -interpolate 1 -test_partition -dm_view ascii::ascii_info_detail
463:   test:
464:     suffix: 5
465:     requires: triangle
466:     nsize: 2
467:     args: -dim 2 -dm_refine 1 -interpolate 1 -test_partition -dm_view ascii::ascii_latex
468:   test:
469:     suffix: 6
470:     args: -dim 2 -cell_simplex 0 -interpolate -dm_view ascii::ascii_info_detail
471:   test:
472:     suffix: 7
473:     args: -dim 2 -cell_simplex 0 -interpolate -dm_refine 1 -dm_view ascii::ascii_info_detail
474:   test:
475:     suffix: 8
476:     nsize: 2
477:     args: -dim 2 -cell_simplex 0 -interpolate -dm_refine 1 -interpolate 1 -test_partition -dm_view ascii::ascii_latex

479:   # 1D ASCII output
480:   test:
481:     suffix: 1d_0
482:     args: -dim 1 -domain_shape box -dm_view ascii::ascii_info_detail
483:   test:
484:     suffix: 1d_1
485:     args: -dim 1 -domain_shape box -dm_refine 2 -dm_view ascii::ascii_info_detail
486:   test:
487:     suffix: 1d_2
488:     args: -dim 1 -domain_box_sizes 5 -x_periodicity periodic -dm_view ascii::ascii_info_detail -test_shape

490:   # Parallel refinement tests with overlap
491:   test:
492:     suffix: refine_overlap_1d
493:     nsize: 2
494:     args: -dim 1 -domain_box_sizes 4 -dm_refine 1 -overlap {{0 1 2}separate output} -petscpartitioner_type simple -dm_view ascii::ascii_info
495:   test:
496:     suffix: refine_overlap_2d
497:     requires: triangle
498:     nsize: {{2 8}separate output}
499:     args: -dim 2 -cell_simplex 1 -dm_refine 1 -interpolate 1 -test_partition -overlap {{0 1 2}separate output} -dm_view ascii::ascii_info

501:   # Parallel simple partitioner tests
502:   test:
503:     suffix: part_simple_0
504:     requires: triangle
505:     nsize: 2
506:     args: -dim 2 -cell_simplex 1 -dm_refine 0 -interpolate 0 -petscpartitioner_type simple -partition_view -dm_view ascii::ascii_info_detail
507:   test:
508:     suffix: part_simple_1
509:     requires: triangle
510:     nsize: 8
511:     args: -dim 2 -cell_simplex 1 -dm_refine 1 -interpolate 1 -petscpartitioner_type simple -partition_view -dm_view ascii::ascii_info_detail

513:   # Parallel partitioner tests
514:   test:
515:     suffix: part_parmetis_0
516:     requires: parmetis
517:     nsize: 2
518:     args: -dim 2 -cell_simplex 0 -dm_refine 1 -interpolate 1 -petscpartitioner_type parmetis -dm_view -petscpartitioner_view -test_redistribute -dm_plex_csr_via_mat {{0 1}} -dm_pre_redist_view ::load_balance -dm_post_redist_view ::load_balance -petscpartitioner_view_graph
519:   test:
520:     suffix: part_ptscotch_0
521:     requires: ptscotch
522:     nsize: 2
523:     args: -dim 2 -cell_simplex 0 -dm_refine 0 -interpolate 1 -petscpartitioner_type ptscotch -petscpartitioner_view -petscpartitioner_ptscotch_strategy quality -test_redistribute -dm_plex_csr_via_mat {{0 1}} -dm_pre_redist_view ::load_balance -dm_post_redist_view ::load_balance -petscpartitioner_view_graph
524:   test:
525:     suffix: part_ptscotch_1
526:     requires: ptscotch
527:     nsize: 8
528:     args: -dim 2 -cell_simplex 0 -dm_refine 1 -interpolate 1 -petscpartitioner_type ptscotch -petscpartitioner_view -petscpartitioner_ptscotch_imbalance 0.1

530:   # CGNS reader tests 10-11 (need to find smaller test meshes)
531:   test:
532:     suffix: cgns_0
533:     requires: cgns
534:     args: -filename ${wPETSC_DIR}/share/petsc/datafiles/meshes/tut21.cgns -interpolate 1 -dm_view

536:   # Gmsh mesh reader tests
537:   test:
538:     suffix: gmsh_0
539:     requires: !single
540:     args: -filename ${wPETSC_DIR}/share/petsc/datafiles/meshes/doublet-tet.msh -interpolate 1 -dm_view
541:   test:
542:     suffix: gmsh_1
543:     requires: !single
544:     args: -filename ${wPETSC_DIR}/share/petsc/datafiles/meshes/square.msh -interpolate 1 -dm_view
545:   test:
546:     suffix: gmsh_2
547:     requires: !single
548:     args: -filename ${wPETSC_DIR}/share/petsc/datafiles/meshes/square_bin.msh -interpolate 1 -dm_view
549:   test:
550:     suffix: gmsh_3
551:     nsize: 3
552:     requires: !single
553:     args: -filename ${wPETSC_DIR}/share/petsc/datafiles/meshes/square.msh -test_partition -interpolate 1 -dm_view
554:   test:
555:     suffix: gmsh_4
556:     nsize: 3
557:     requires: !single
558:     args: -filename ${wPETSC_DIR}/share/petsc/datafiles/meshes/square_bin.msh -test_partition -interpolate 1 -dm_view
559:   test:
560:     suffix: gmsh_5
561:     requires: !single
562:     args: -filename ${wPETSC_DIR}/share/petsc/datafiles/meshes/square_quad.msh -interpolate 1 -dm_view
563:   # TODO: it seems the mesh is not a valid gmsh (inverted cell)
564:   test:
565:     suffix: gmsh_6
566:     requires: !single
567:     args: -filename ${wPETSC_DIR}/share/petsc/datafiles/meshes/square_bin_physnames.msh -interpolate 1 -dm_view -final_diagnostics 0
568:   test:
569:     suffix: gmsh_7
570:     args: -filename ${wPETSC_DIR}/share/petsc/datafiles/meshes/mesh-3d-box-innersphere_bin.msh -dm_view ::ascii_info_detail -interpolate -test_shape
571:   test:
572:     suffix: gmsh_8
573:     args: -filename ${wPETSC_DIR}/share/petsc/datafiles/meshes/mesh-3d-box-innersphere.msh -dm_view ::ascii_info_detail -interpolate -test_shape
574:   testset:
575:     args: -filename ${wPETSC_DIR}/share/petsc/datafiles/meshes/square_periodic_bin.msh -dm_view ::ascii_info_detail -interpolate -test_shape
576:     test:
577:       suffix: gmsh_9
578:     test:
579:       suffix: gmsh_9_periodic_0
580:       args: -dm_plex_gmsh_periodic 0
581:   testset:
582:     args: -filename ${wPETSC_DIR}/share/petsc/datafiles/meshes/square_periodic.msh -dm_view ::ascii_info_detail -interpolate -test_shape
583:     test:
584:       suffix: gmsh_10
585:     test:
586:       suffix: gmsh_10_periodic_0
587:       args: -dm_plex_gmsh_periodic 0
588:   testset:
589:     args: -filename ${wPETSC_DIR}/share/petsc/datafiles/meshes/square_periodic.msh -dm_view ::ascii_info_detail -interpolate -test_shape -dm_refine 1
590:     test:
591:       suffix: gmsh_11
592:     test:
593:       suffix: gmsh_11_periodic_0
594:       args: -dm_plex_gmsh_periodic 0
595:   # TODO: it seems the mesh is not a valid gmsh (inverted cell)
596:   test:
597:     suffix: gmsh_12
598:     nsize: 4
599:     requires: !single mpiio
600:     args: -filename ${wPETSC_DIR}/share/petsc/datafiles/meshes/square_bin_physnames.msh -viewer_binary_mpiio -petscpartitioner_type simple -interpolate 1 -dm_view -final_diagnostics 0
601:   test:
602:     suffix: gmsh_13_hybs2t
603:     nsize: 4
604:     args: -filename ${wPETSC_DIR}/share/petsc/datafiles/meshes/hybrid_triquad.msh -petscpartitioner_type simple -interpolate 1 -dm_view -test_shape -simplex2tensor -dm_plex_check_faces -dm_plex_check_skeleton -dm_plex_check_symmetry
605:   test:
606:     suffix: gmsh_14_ext
607:     requires: !single
608:     args: -ext_layers 2 -ext_thickness 1.5 -ext_filename ${wPETSC_DIR}/share/petsc/datafiles/meshes/square_bin.msh -dm_view -dm_plex_check_symmetry -dm_plex_check_skeleton
609:   test:
610:     suffix: gmsh_14_ext_s2t
611:     requires: !single
612:     args: -ext_layers 2 -ext_thickness 1.5 -ext_filename ${wPETSC_DIR}/share/petsc/datafiles/meshes/square_bin.msh -dm_view -interpolate -dm_plex_check_faces -dm_plex_check_symmetry -dm_plex_check_skeleton -simplex2tensor -test_shape
613:   test:
614:     suffix: gmsh_15_hyb3d
615:     args: -filename ${wPETSC_DIR}/share/petsc/datafiles/meshes/hybrid_tetwedge.msh -dm_view -interpolate -dm_plex_check_faces -dm_plex_check_symmetry -dm_plex_check_skeleton
616:   test:
617:     suffix: gmsh_15_hyb3d_vtk
618:     args: -filename ${wPETSC_DIR}/share/petsc/datafiles/meshes/hybrid_tetwedge.msh -dm_view vtk: -dm_plex_gmsh_hybrid
619:   test:
620:     suffix: gmsh_15_hyb3d_s2t
621:     args: -filename ${wPETSC_DIR}/share/petsc/datafiles/meshes/hybrid_tetwedge.msh -dm_view -interpolate -dm_plex_check_faces -dm_plex_check_symmetry -dm_plex_check_skeleton -simplex2tensor -test_shape
622:   test:
623:     suffix: gmsh_16_spheresurface
624:     nsize : 4
625:     args: -filename ${wPETSC_DIR}/share/petsc/datafiles/meshes/surfacesphere_bin.msh -dm_plex_gmsh_spacedim 3 -dm_plex_check_symmetry -dm_plex_check_faces -dm_plex_check_skeleton -dm_view -interpolate -test_shape -petscpartitioner_type simple
626:   test:
627:     suffix: gmsh_16_spheresurface_s2t
628:     nsize : 4
629:     args: -filename ${wPETSC_DIR}/share/petsc/datafiles/meshes/surfacesphere_bin.msh -dm_plex_gmsh_spacedim 3 -simplex2tensor -dm_plex_check_symmetry -dm_plex_check_faces -dm_plex_check_skeleton -dm_view -interpolate -test_shape -petscpartitioner_type simple
630:   test:
631:     suffix: gmsh_16_spheresurface_extruded
632:     nsize : 4
633:     args: -ext_layers 3 -ext_filename ${wPETSC_DIR}/share/petsc/datafiles/meshes/surfacesphere_bin.msh -dm_plex_gmsh_spacedim 3 -dm_plex_check_symmetry -dm_plex_check_faces -dm_plex_check_skeleton -dm_view -interpolate -petscpartitioner_type simple
634:   test:
635:     suffix: gmsh_16_spheresurface_extruded_s2t
636:     nsize : 4
637:     args: -ext_layers 3 -ext_filename ${wPETSC_DIR}/share/petsc/datafiles/meshes/surfacesphere_bin.msh -dm_plex_gmsh_spacedim 3 -simplex2tensor -dm_plex_check_symmetry -dm_plex_check_faces -dm_plex_check_skeleton -dm_view -interpolate -test_shape -petscpartitioner_type simple
638:   test:
639:     suffix: gmsh_17_hyb3d_ascii
640:     args: -filename ${wPETSC_DIR}/share/petsc/datafiles/meshes/hybrid_hexwedge.msh -dm_view -dm_plex_gmsh_hybrid
641:   test:
642:     suffix: gmsh_17_hyb3d_interp_ascii
643:     args: -filename ${wPETSC_DIR}/share/petsc/datafiles/meshes/hybrid_hexwedge.msh -dm_view -interpolate
644:   test:
645:     suffix: exodus_17_hyb3d_interp_ascii
646:     requires: exodusii
647:     args: -filename ${wPETSC_DIR}/share/petsc/datafiles/meshes/hybrid_hexwedge.exo -dm_view -interpolate

649:   # Legacy Gmsh v22/v40 ascii/binary reader tests
650:   testset:
651:     output_file: output/ex1_gmsh_3d_legacy.out
652:     args: -dm_view ::ascii_info_detail -interpolate -dm_plex_check_symmetry -dm_plex_check_faces -test_shape
653:     test:
654:       suffix: gmsh_3d_ascii_v22
655:       args: -filename ${wPETSC_DIR}/share/petsc/datafiles/meshes/gmsh-3d-ascii.msh2
656:     test:
657:       suffix: gmsh_3d_ascii_v40
658:       args: -filename ${wPETSC_DIR}/share/petsc/datafiles/meshes/gmsh-3d-ascii.msh4
659:     test:
660:       suffix: gmsh_3d_binary_v22
661:       args: -filename ${wPETSC_DIR}/share/petsc/datafiles/meshes/gmsh-3d-binary.msh2
662:     test:
663:       suffix: gmsh_3d_binary_v40
664:       requires: long64
665:       args: -filename ${wPETSC_DIR}/share/petsc/datafiles/meshes/gmsh-3d-binary.msh4

667:   # Gmsh v41 ascii/binary reader tests
668:   testset: # 32bit mesh, sequential
669:     args: -dm_view ::ascii_info_detail -interpolate -dm_plex_check_symmetry -dm_plex_check_faces -test_shape
670:     output_file: output/ex1_gmsh_3d_32.out
671:     test:
672:       suffix: gmsh_3d_ascii_v41_32
673:       args: -filename ${wPETSC_DIR}/share/petsc/datafiles/meshes/gmsh-3d-ascii-32.msh
674:     test:
675:       suffix: gmsh_3d_binary_v41_32
676:       args: -filename ${wPETSC_DIR}/share/petsc/datafiles/meshes/gmsh-3d-binary-32.msh
677:     test:
678:       suffix: gmsh_3d_binary_v41_32_mpiio
679:       requires: define(PETSC_HAVE_MPIIO)
680:       args: -filename ${wPETSC_DIR}/share/petsc/datafiles/meshes/gmsh-3d-binary-32.msh -viewer_binary_mpiio
681:   testset:  # 32bit mesh, parallel
682:     args:  -petscpartitioner_type simple -dm_view ::ascii_info_detail -interpolate -dm_plex_check_symmetry -dm_plex_check_faces -test_shape
683:     nsize: 2
684:     output_file: output/ex1_gmsh_3d_32_np2.out
685:     test:
686:       suffix: gmsh_3d_ascii_v41_32_np2
687:       args: -filename ${wPETSC_DIR}/share/petsc/datafiles/meshes/gmsh-3d-ascii-32.msh
688:     test:
689:       suffix: gmsh_3d_binary_v41_32_np2
690:       args: -filename ${wPETSC_DIR}/share/petsc/datafiles/meshes/gmsh-3d-binary-32.msh
691:     test:
692:       suffix: gmsh_3d_binary_v41_32_np2_mpiio
693:       requires: define(PETSC_HAVE_MPIIO)
694:       args: -filename ${wPETSC_DIR}/share/petsc/datafiles/meshes/gmsh-3d-binary-32.msh -viewer_binary_mpiio
695:   testset: # 64bit mesh, sequential
696:     args: -dm_view ::ascii_info_detail -interpolate -dm_plex_check_symmetry -dm_plex_check_faces -test_shape
697:     output_file: output/ex1_gmsh_3d_64.out
698:     test:
699:       suffix: gmsh_3d_ascii_v41_64
700:       args: -filename ${wPETSC_DIR}/share/petsc/datafiles/meshes/gmsh-3d-ascii-64.msh
701:     test:
702:       suffix: gmsh_3d_binary_v41_64
703:       args: -filename ${wPETSC_DIR}/share/petsc/datafiles/meshes/gmsh-3d-binary-64.msh
704:     test:
705:       suffix: gmsh_3d_binary_v41_64_mpiio
706:       requires: define(PETSC_HAVE_MPIIO)
707:       args: -filename ${wPETSC_DIR}/share/petsc/datafiles/meshes/gmsh-3d-binary-64.msh -viewer_binary_mpiio
708:   testset:  # 64bit mesh, parallel
709:     args:  -petscpartitioner_type simple -dm_view ::ascii_info_detail -interpolate -dm_plex_check_symmetry -dm_plex_check_faces -test_shape
710:     nsize: 2
711:     output_file: output/ex1_gmsh_3d_64_np2.out
712:     test:
713:       suffix: gmsh_3d_ascii_v41_64_np2
714:       args: -filename ${wPETSC_DIR}/share/petsc/datafiles/meshes/gmsh-3d-ascii-64.msh
715:     test:
716:       suffix: gmsh_3d_binary_v41_64_np2
717:       args: -filename ${wPETSC_DIR}/share/petsc/datafiles/meshes/gmsh-3d-binary-64.msh
718:     test:
719:       suffix: gmsh_3d_binary_v41_64_np2_mpiio
720:       requires: define(PETSC_HAVE_MPIIO)
721:       args: -filename ${wPETSC_DIR}/share/petsc/datafiles/meshes/gmsh-3d-binary-64.msh -viewer_binary_mpiio

723:   # Fluent mesh reader tests
724:   # TODO: Geometry checks fail
725:   test:
726:     suffix: fluent_0
727:     requires: !complex
728:     args: -filename ${wPETSC_DIR}/share/petsc/datafiles/meshes/square.cas -interpolate 1 -dm_view -final_diagnostics 0
729:   test:
730:     suffix: fluent_1
731:     nsize: 3
732:     requires: !complex
733:     args: -filename ${wPETSC_DIR}/share/petsc/datafiles/meshes/square.cas -interpolate 1 -test_partition -dm_view -final_diagnostics 0
734:   test:
735:     suffix: fluent_2
736:     requires: !complex
737:     args: -filename ${wPETSC_DIR}/share/petsc/datafiles/meshes/cube_5tets_ascii.cas -interpolate 1 -dm_view -final_diagnostics 0
738:   test:
739:     suffix: fluent_3
740:     requires: !complex
741:     TODO: broken
742:     args: -filename ${wPETSC_DIR}/share/petsc/datafiles/meshes/cube_5tets.cas -interpolate 1 -dm_view -final_diagnostics 0

744:   # Med mesh reader tests, including parallel file reads
745:   test:
746:     suffix: med_0
747:     requires: med
748:     args: -filename ${wPETSC_DIR}/share/petsc/datafiles/meshes/square.med -interpolate 1 -dm_view
749:   test:
750:     suffix: med_1
751:     requires: med
752:     nsize: 3
753:     args: -filename ${wPETSC_DIR}/share/petsc/datafiles/meshes/square.med -interpolate 1 -petscpartitioner_type simple -dm_view
754:   test:
755:     suffix: med_2
756:     requires: med
757:     args: -filename ${wPETSC_DIR}/share/petsc/datafiles/meshes/cylinder.med -interpolate 1 -dm_view
758:   test:
759:     suffix: med_3
760:     requires: med
761:     TODO: MED
762:     nsize: 3
763:     args: -filename ${wPETSC_DIR}/share/petsc/datafiles/meshes/cylinder.med -interpolate 1 -petscpartitioner_type simple -dm_view

765:   # Test shape quality
766:   test:
767:     suffix: test_shape
768:     requires: ctetgen
769:     args: -dim 3 -interpolate -dm_refine_hierarchy 3 -test_shape

771:   # Test simplex to tensor conversion
772:   test:
773:     suffix: s2t2
774:     requires: triangle
775:     args: -dim 2 -simplex2tensor -refinement_limit 0.0625 -dm_view ascii::ascii_info_detail

777:   test:
778:     suffix: s2t3
779:     requires: ctetgen
780:     args: -dim 3 -simplex2tensor -refinement_limit 0.0625 -dm_view ascii::ascii_info_detail

782:   # Test domain shapes
783:   test:
784:     suffix: cylinder
785:     args: -dim 3 -cell_simplex 0 -interpolate -domain_shape cylinder -test_shape -dm_view

787:   test:
788:     suffix: cylinder_per
789:     args: -dim 3 -cell_simplex 0 -interpolate -domain_shape cylinder -z_periodicity periodic -test_shape -dm_view

791:   test:
792:     suffix: cylinder_wedge
793:     args: -dim 3 -cell_simplex 0 -interpolate 0 -cell_wedge -domain_shape cylinder -dm_view vtk: -dm_plex_check_symmetry -dm_plex_check_faces -dm_plex_check_skeleton

795:   test:
796:     suffix: cylinder_wedge_int
797:     output_file: output/ex1_cylinder_wedge.out
798:     args: -dim 3 -cell_simplex 0 -interpolate -cell_wedge -domain_shape cylinder -dm_view vtk: -dm_plex_check_symmetry -dm_plex_check_faces -dm_plex_check_skeleton

800:   test:
801:     suffix: box_2d
802:     args: -dim 2 -cell_simplex 0 -interpolate -domain_shape box -dm_refine 2 -test_shape -dm_view

804:   test:
805:     suffix: box_2d_per
806:     args: -dim 2 -cell_simplex 0 -interpolate -domain_shape box -dm_refine 2 -test_shape -dm_view

808:   test:
809:     suffix: box_2d_per_unint
810:     args: -dim 2 -cell_simplex 0 -interpolate 0 -domain_shape box -domain_box_sizes 3,3 -test_shape -dm_view ::ascii_info_detail

812:   test:
813:     suffix: box_3d
814:     args: -dim 3 -cell_simplex 0 -interpolate -domain_shape box -dm_refine 3 -test_shape -dm_view

816:   test:
817:     requires: triangle
818:     suffix: box_wedge
819:     args: -dim 3 -cell_simplex 0 -interpolate -cell_wedge -domain_shape box -dm_view vtk: -dm_plex_check_symmetry -dm_plex_check_faces -dm_plex_check_skeleton

821:   testset:
822:     requires: triangle
823:     args: -dim 3 -cell_simplex 0 -interpolate -cell_wedge -domain_shape box -domain_box_sizes 2,3,1 -dm_view -dm_plex_check_symmetry -dm_plex_check_faces -dm_plex_check_skeleton -simplex2tensor -test_shape
824:     test:
825:       suffix: box_wedge_s2t
826:     test:
827:       nsize: 3
828:       args: -petscpartitioner_type simple
829:       suffix: box_wedge_s2t_parallel

831:   # Test GLVis output
832:   test:
833:     suffix: glvis_2d_tet
834:     args: -filename ${wPETSC_DIR}/share/petsc/datafiles/meshes/square_periodic.msh -dm_plex_gmsh_periodic 0 -dm_view glvis:

836:   test:
837:     suffix: glvis_2d_tet_per
838:     args: -filename ${wPETSC_DIR}/share/petsc/datafiles/meshes/square_periodic.msh -dm_view glvis: -viewer_glvis_dm_plex_enable_boundary 0

840:   test:
841:     suffix: glvis_2d_tet_per_mfem
842:     args: -filename ${wPETSC_DIR}/share/petsc/datafiles/meshes/square_periodic.msh -viewer_glvis_dm_plex_enable_boundary -viewer_glvis_dm_plex_enable_mfem -dm_view glvis: -interpolate

844:   test:
845:     suffix: glvis_2d_quad
846:     args: -dim 2 -cell_simplex 0 -interpolate -domain_shape box -domain_box_sizes 3,3 -dm_view glvis:

848:   test:
849:     suffix: glvis_2d_quad_per
850:     args: -dim 2 -cell_simplex 0 -interpolate -domain_shape box -domain_box_sizes 3,3 -x_periodicity periodic -y_periodicity periodic -dm_view glvis: -viewer_glvis_dm_plex_enable_boundary

852:   test:
853:     suffix: glvis_2d_quad_per_mfem
854:     args: -dim 2 -cell_simplex 0 -interpolate -domain_shape box -domain_box_sizes 3,3 -x_periodicity periodic -y_periodicity periodic -dm_view glvis: -viewer_glvis_dm_plex_enable_boundary -viewer_glvis_dm_plex_enable_mfem

856:   test:
857:     suffix: glvis_3d_tet
858:     args: -filename ${wPETSC_DIR}/share/petsc/datafiles/meshes/mesh-3d-box-innersphere_bin.msh -dm_plex_gmsh_periodic 0 -dm_view glvis:

860:   test:
861:     suffix: glvis_3d_tet_per
862:     args: -filename ${wPETSC_DIR}/share/petsc/datafiles/meshes/mesh-3d-box-innersphere_bin.msh -dm_view glvis: -interpolate -viewer_glvis_dm_plex_enable_boundary

864:   test:
865:     suffix: glvis_3d_tet_per_mfem
866:     TODO: broken
867:     args: -filename ${wPETSC_DIR}/share/petsc/datafiles/meshes/mesh-3d-box-innersphere_bin.msh -viewer_glvis_dm_plex_enable_mfem -dm_view glvis: -interpolate

869:   test:
870:     suffix: glvis_3d_hex
871:     args: -dim 3 -cell_simplex 0 -domain_shape box -domain_box_sizes 3,3,3 -dm_view glvis:

873:   test:
874:     suffix: glvis_3d_hex_per
875:     args: -dim 3 -cell_simplex 0 -domain_shape box -domain_box_sizes 3,3,3 -x_periodicity periodic -y_periodicity periodic -z_periodicity periodic -dm_view glvis: -viewer_glvis_dm_plex_enable_boundary 0

877:   test:
878:     suffix: glvis_3d_hex_per_mfem
879:     args: -dim 3 -cell_simplex 0 -domain_shape box -domain_box_sizes 3,3,3 -x_periodicity periodic -y_periodicity periodic -z_periodicity periodic -dm_view glvis: -viewer_glvis_dm_plex_enable_boundary -viewer_glvis_dm_plex_enable_mfem -interpolate

881:   # Test P4EST
882:   testset:
883:     requires: p4est
884:     args: -interpolate -dm_view -test_p4est_seq -test_shape -conv_seq_2_dm_plex_check_symmetry -conv_seq_2_dm_plex_check_skeleton -conv_seq_2_dm_plex_check_faces -conv_seq_1_dm_forest_minimum_refinement 1
885:     test:
886:       suffix: p4est_periodic
887:       args: -dim 2 -domain_shape box -cell_simplex 0 -x_periodicity periodic -y_periodicity periodic -domain_box_sizes 3,5 -conv_seq_1_dm_forest_initial_refinement 0 -conv_seq_1_dm_forest_maximum_refinement 2 -conv_seq_1_dm_p4est_refine_pattern hash
888:     test:
889:       suffix: p4est_periodic_3d
890:       args: -dim 3 -domain_shape box -cell_simplex 0 -x_periodicity periodic -y_periodicity periodic -z_periodicity -domain_box_sizes 3,5,4 -conv_seq_1_dm_forest_initial_refinement 0 -conv_seq_1_dm_forest_maximum_refinement 2 -conv_seq_1_dm_p4est_refine_pattern hash
891:     test:
892:       suffix: p4est_gmsh_periodic
893:       args: -conv_seq_1_dm_forest_initial_refinement 0 -conv_seq_1_dm_forest_maximum_refinement 1 -conv_seq_1_dm_p4est_refine_pattern hash -filename ${wPETSC_DIR}/share/petsc/datafiles/meshes/square_periodic.msh
894:     test:
895:       suffix: p4est_gmsh_surface
896:       args: -conv_seq_1_dm_forest_initial_refinement 0 -conv_seq_1_dm_forest_maximum_refinement 1 -conv_seq_1_dm_p4est_refine_pattern hash -filename ${wPETSC_DIR}/share/petsc/datafiles/meshes/surfacesphere_bin.msh -dm_plex_gmsh_spacedim 3
897:     test:
898:       suffix: p4est_gmsh_surface_parallel
899:       nsize: 2
900:       args: -conv_seq_1_dm_forest_initial_refinement 0 -conv_seq_1_dm_forest_maximum_refinement 1 -conv_seq_1_dm_p4est_refine_pattern hash -filename ${wPETSC_DIR}/share/petsc/datafiles/meshes/surfacesphere_bin.msh -dm_plex_gmsh_spacedim 3 -petscpartitioner_type simple -dm_view ::load_balance
901:     test:
902:       suffix: p4est_hyb_2d
903:       args: -conv_seq_1_dm_forest_initial_refinement 0 -conv_seq_1_dm_forest_maximum_refinement 1 -conv_seq_1_dm_p4est_refine_pattern hash -filename ${wPETSC_DIR}/share/petsc/datafiles/meshes/hybrid_triquad.msh
904:     test:
905:       suffix: p4est_hyb_3d
906:       args: -conv_seq_1_dm_forest_initial_refinement 0 -conv_seq_1_dm_forest_maximum_refinement 1 -conv_seq_1_dm_p4est_refine_pattern hash -filename ${wPETSC_DIR}/share/petsc/datafiles/meshes/hybrid_tetwedge.msh
907:     test:
908:       requires: ctetgen
909:       suffix: p4est_s2t_bugfaces_3d
910:       args: -conv_seq_1_dm_forest_initial_refinement 0 -conv_seq_1_dm_forest_maximum_refinement 0 -dim 3 -domain_box_sizes 1,1 -cell_simplex
911:     test:
912:       suffix: p4est_bug_overlapsf
913:       nsize: 3
914:       args: -dim 3 -cell_simplex 0 -domain_box_sizes 2,2,1 -conv_seq_1_dm_forest_initial_refinement 0 -conv_seq_1_dm_forest_maximum_refinement 1 -conv_seq_1_dm_p4est_refine_pattern hash  -petscpartitioner_type simple
915:     test:
916:       suffix: p4est_redistribute
917:       nsize: 3
918:       args: -dim 3 -cell_simplex 0 -domain_box_sizes 2,2,1 -conv_seq_1_dm_forest_initial_refinement 0 -conv_seq_1_dm_forest_maximum_refinement 1 -conv_seq_1_dm_p4est_refine_pattern hash  -petscpartitioner_type simple -test_redistribute -dm_plex_csr_via_mat {{0 1}} -dm_view ::load_balance
919:     test:
920:       suffix: p4est_gmsh_s2t_3d
921:       args: -conv_seq_1_dm_forest_initial_refinement 1 -filename ${wPETSC_DIR}/share/petsc/datafiles/meshes/doublet-tet.msh
922:     test:
923:       suffix: p4est_gmsh_s2t_3d_hash
924:       args: -conv_seq_1_dm_forest_initial_refinement 1 -conv_seq_1_dm_forest_maximum_refinement 2 -conv_seq_1_dm_p4est_refine_pattern hash -filename ${wPETSC_DIR}/share/petsc/datafiles/meshes/doublet-tet.msh
925:     test:
926:       requires: long_runtime
927:       suffix: p4est_gmsh_periodic_3d
928:       args: -conv_seq_1_dm_forest_initial_refinement 0 -conv_seq_1_dm_forest_maximum_refinement 1 -conv_seq_1_dm_p4est_refine_pattern hash -filename ${wPETSC_DIR}/share/petsc/datafiles/meshes/mesh-3d-box-innersphere.msh

930:   testset:
931:     requires: p4est
932:     nsize: 6
933:     args: -interpolate -test_p4est_par -test_shape -conv_par_2_dm_plex_check_symmetry -conv_par_2_dm_plex_check_skeleton -conv_par_2_dm_plex_check_faces -conv_par_1_dm_forest_minimum_refinement 1 -conv_par_1_dm_forest_partition_overlap 0
934:     test:
935:       suffix: p4est_par_periodic
936:       args: -dim 2 -domain_shape box -cell_simplex 0 -x_periodicity periodic -y_periodicity periodic -domain_box_sizes 3,5 -conv_par_1_dm_forest_initial_refinement 0 -conv_par_1_dm_forest_maximum_refinement 2 -conv_par_1_dm_p4est_refine_pattern hash
937:     test:
938:       suffix: p4est_par_periodic_3d
939:       args: -dim 3 -domain_shape box -cell_simplex 0 -x_periodicity periodic -y_periodicity periodic -z_periodicity -domain_box_sizes 3,5,4 -conv_par_1_dm_forest_initial_refinement 0 -conv_par_1_dm_forest_maximum_refinement 2 -conv_par_1_dm_p4est_refine_pattern hash
940:     test:
941:       suffix: p4est_par_gmsh_periodic
942:       args: -conv_par_1_dm_forest_initial_refinement 0 -conv_par_1_dm_forest_maximum_refinement 1 -conv_par_1_dm_p4est_refine_pattern hash -filename ${wPETSC_DIR}/share/petsc/datafiles/meshes/square_periodic.msh
943:     test:
944:       suffix: p4est_par_gmsh_surface
945:       args: -conv_par_1_dm_forest_initial_refinement 0 -conv_par_1_dm_forest_maximum_refinement 1 -conv_par_1_dm_p4est_refine_pattern hash -filename ${wPETSC_DIR}/share/petsc/datafiles/meshes/surfacesphere_bin.msh -dm_plex_gmsh_spacedim 3
946:     test:
947:       suffix: p4est_par_gmsh_s2t_3d
948:       args: -conv_par_1_dm_forest_initial_refinement 1 -filename ${wPETSC_DIR}/share/petsc/datafiles/meshes/doublet-tet.msh
949:     test:
950:       suffix: p4est_par_gmsh_s2t_3d_hash
951:       args: -conv_par_1_dm_forest_initial_refinement 1 -conv_par_1_dm_forest_maximum_refinement 2 -conv_par_1_dm_p4est_refine_pattern hash -filename ${wPETSC_DIR}/share/petsc/datafiles/meshes/doublet-tet.msh
952:     test:
953:       requires: long_runtime
954:       suffix: p4est_par_gmsh_periodic_3d
955:       args: -conv_par_1_dm_forest_initial_refinement 0 -conv_par_1_dm_forest_maximum_refinement 1 -conv_par_1_dm_p4est_refine_pattern hash -filename ${wPETSC_DIR}/share/petsc/datafiles/meshes/mesh-3d-box-innersphere.msh

957:   testset:
958:     requires: p4est
959:     nsize: 6
960:     args: -interpolate -test_p4est_par -test_shape -conv_par_2_dm_plex_check_symmetry -conv_par_2_dm_plex_check_skeleton -conv_par_2_dm_plex_check_faces -conv_par_1_dm_forest_minimum_refinement 1 -conv_par_1_dm_forest_partition_overlap 1 -petscpartitioner_type simple
961:     test:
962:       suffix: p4est_par_ovl_periodic
963:       args: -dim 2 -domain_shape box -cell_simplex 0 -x_periodicity periodic -y_periodicity periodic -domain_box_sizes 3,5 -conv_par_1_dm_forest_initial_refinement 0 -conv_par_1_dm_forest_maximum_refinement 2 -conv_par_1_dm_p4est_refine_pattern hash
964:     #TODO Mesh cell 201 is inverted, vol = 0. (FVM Volume. Is it correct? -> Diagnostics disabled)
965:     test:
966:       suffix: p4est_par_ovl_periodic_3d
967:       args: -dim 3 -domain_shape box -cell_simplex 0 -x_periodicity periodic -y_periodicity periodic -z_periodicity -domain_box_sizes 3,5,4 -conv_par_1_dm_forest_initial_refinement 0 -conv_par_1_dm_forest_maximum_refinement 2 -conv_par_1_dm_p4est_refine_pattern hash -final_diagnostics 0
968:     test:
969:       suffix: p4est_par_ovl_gmsh_periodic
970:       args: -conv_par_1_dm_forest_initial_refinement 0 -conv_par_1_dm_forest_maximum_refinement 1 -conv_par_1_dm_p4est_refine_pattern hash -filename ${wPETSC_DIR}/share/petsc/datafiles/meshes/square_periodic.msh
971:     test:
972:       suffix: p4est_par_ovl_gmsh_surface
973:       args: -conv_par_1_dm_forest_initial_refinement 0 -conv_par_1_dm_forest_maximum_refinement 1 -conv_par_1_dm_p4est_refine_pattern hash -filename ${wPETSC_DIR}/share/petsc/datafiles/meshes/surfacesphere_bin.msh -dm_plex_gmsh_spacedim 3
974:     test:
975:       suffix: p4est_par_ovl_gmsh_s2t_3d
976:       args: -conv_par_1_dm_forest_initial_refinement 1 -filename ${wPETSC_DIR}/share/petsc/datafiles/meshes/doublet-tet.msh
977:     test:
978:       suffix: p4est_par_ovl_gmsh_s2t_3d_hash
979:       args: -conv_par_1_dm_forest_initial_refinement 1 -conv_par_1_dm_forest_maximum_refinement 2 -conv_par_1_dm_p4est_refine_pattern hash -filename ${wPETSC_DIR}/share/petsc/datafiles/meshes/doublet-tet.msh
980:     test:
981:       requires: long_runtime
982:       suffix: p4est_par_ovl_gmsh_periodic_3d
983:       args: -conv_par_1_dm_forest_initial_refinement 0 -conv_par_1_dm_forest_maximum_refinement 1 -conv_par_1_dm_p4est_refine_pattern hash -filename ${wPETSC_DIR}/share/petsc/datafiles/meshes/mesh-3d-box-innersphere.msh
984:     test:
985:       suffix: p4est_par_ovl_hyb_2d
986:       args: -conv_par_1_dm_forest_initial_refinement 0 -conv_par_1_dm_forest_maximum_refinement 1 -conv_par_1_dm_p4est_refine_pattern hash -filename ${wPETSC_DIR}/share/petsc/datafiles/meshes/hybrid_triquad.msh
987:     test:
988:       suffix: p4est_par_ovl_hyb_3d
989:       args: -conv_par_1_dm_forest_initial_refinement 0 -conv_par_1_dm_forest_maximum_refinement 1 -conv_par_1_dm_p4est_refine_pattern hash -filename ${wPETSC_DIR}/share/petsc/datafiles/meshes/hybrid_tetwedge.msh

991:   test:
992:     TODO: broken
993:     requires: p4est
994:     nsize: 2
995:     suffix: p4est_bug_labels_noovl
996:     args: -interpolate -test_p4est_seq -test_shape -dm_plex_check_symmetry -dm_plex_check_skeleton -dm_plex_check_faces -dm_forest_minimum_refinement 0 -dm_forest_partition_overlap 1 -dim 2 -domain_shape box -cell_simplex 0 -domain_box_sizes 3,3 -dm_forest_initial_refinement 0 -dm_forest_maximum_refinement 2 -dm_p4est_refine_pattern hash -petscpartitioner_type simple -dm_forest_print_label_error

998:   test:
999:     requires: p4est
1000:     nsize: 2
1001:     suffix: p4est_bug_distribute_overlap
1002:     args: -interpolate -test_p4est_seq -test_shape -conv_seq_2_dm_plex_check_symmetry -conv_seq_2_dm_plex_check_skeleton -conv_seq_2_dm_plex_check_faces -conv_seq_1_dm_forest_minimum_refinement 0 -conv_seq_1_dm_forest_partition_overlap 0 -dim 2 -domain_shape box -cell_simplex 0 -domain_box_sizes 3,3 -conv_seq_1_dm_forest_initial_refinement 0 -conv_seq_1_dm_forest_maximum_refinement 2 -conv_seq_1_dm_p4est_refine_pattern hash -petscpartitioner_type simple -overlap 1 -dm_view ::load_balance
1003:     args: -dm_post_overlap_view

1005:   test:
1006:     suffix: glvis_2d_hyb
1007:     args: -dim 2 -filename ${wPETSC_DIR}/share/petsc/datafiles/meshes/hybrid_triquad.msh -interpolate -dm_view glvis: -viewer_glvis_dm_plex_enable_boundary -petscpartitioner_type simple

1009:   test:
1010:     suffix: glvis_3d_hyb
1011:     args: -dim 3 -filename ${wPETSC_DIR}/share/petsc/datafiles/meshes/hybrid_tetwedge.msh -interpolate -dm_view glvis: -viewer_glvis_dm_plex_enable_boundary -petscpartitioner_type simple

1013:   test:
1014:     suffix: glvis_3d_hyb_s2t
1015:     args: -dim 3 -filename ${wPETSC_DIR}/share/petsc/datafiles/meshes/hybrid_3d_cube.msh -interpolate -dm_view glvis: -viewer_glvis_dm_plex_enable_boundary -petscpartitioner_type simple -simplex2tensor
1016: TEST*/