xref: /petsc/src/dm/tutorials/ex20.c (revision 42108689fb35c94f800d5ff023bdeab230b63d2b)
1145b44c9SPierre Jolivet static char help[] = "DMSwarm-PIC demonstrator of inserting points into a cell DM \n\
2c4762a1bSJed Brown Options: \n\
3c4762a1bSJed Brown -mode {0,1} : 0 ==> DMDA, 1 ==> DMPLEX cell DM \n\
4c4762a1bSJed Brown -dim {2,3}  : spatial dimension\n";
5c4762a1bSJed Brown 
6c4762a1bSJed Brown #include <petsc.h>
7c4762a1bSJed Brown #include <petscdm.h>
8c4762a1bSJed Brown #include <petscdmda.h>
9c4762a1bSJed Brown #include <petscdmplex.h>
10c4762a1bSJed Brown #include <petscdmswarm.h>
11c4762a1bSJed Brown 
12d71ae5a4SJacob Faibussowitsch PetscErrorCode pic_insert_DMDA(PetscInt dim)
13d71ae5a4SJacob Faibussowitsch {
14c4762a1bSJed Brown   DM        celldm = NULL, swarm;
15c4762a1bSJed Brown   PetscInt  dof, stencil_width;
16c4762a1bSJed Brown   PetscReal min[3], max[3];
17c4762a1bSJed Brown   PetscInt  ndir[3];
18c4762a1bSJed Brown 
19c4762a1bSJed Brown   PetscFunctionBegin;
20c4762a1bSJed Brown   /* Create the background cell DM */
21c4762a1bSJed Brown   dof           = 1;
22c4762a1bSJed Brown   stencil_width = 1;
2348a46eb9SPierre Jolivet   if (dim == 2) PetscCall(DMDACreate2d(PETSC_COMM_WORLD, DM_BOUNDARY_NONE, DM_BOUNDARY_NONE, DMDA_STENCIL_BOX, 25, 13, PETSC_DECIDE, PETSC_DECIDE, dof, stencil_width, NULL, NULL, &celldm));
2448a46eb9SPierre Jolivet   if (dim == 3) PetscCall(DMDACreate3d(PETSC_COMM_WORLD, DM_BOUNDARY_NONE, DM_BOUNDARY_NONE, DM_BOUNDARY_NONE, DMDA_STENCIL_BOX, 25, 13, 19, PETSC_DECIDE, PETSC_DECIDE, PETSC_DECIDE, dof, stencil_width, NULL, NULL, NULL, &celldm));
25c4762a1bSJed Brown 
269566063dSJacob Faibussowitsch   PetscCall(DMDASetElementType(celldm, DMDA_ELEMENT_Q1));
279566063dSJacob Faibussowitsch   PetscCall(DMSetFromOptions(celldm));
289566063dSJacob Faibussowitsch   PetscCall(DMSetUp(celldm));
29c4762a1bSJed Brown 
309566063dSJacob Faibussowitsch   PetscCall(DMDASetUniformCoordinates(celldm, 0.0, 2.0, 0.0, 1.0, 0.0, 1.5));
31c4762a1bSJed Brown 
32c4762a1bSJed Brown   /* Create the DMSwarm */
339566063dSJacob Faibussowitsch   PetscCall(DMCreate(PETSC_COMM_WORLD, &swarm));
349566063dSJacob Faibussowitsch   PetscCall(PetscObjectSetName((PetscObject)swarm, "Swarm"));
359566063dSJacob Faibussowitsch   PetscCall(DMSetType(swarm, DMSWARM));
369566063dSJacob Faibussowitsch   PetscCall(DMSetDimension(swarm, dim));
37c4762a1bSJed Brown 
38c4762a1bSJed Brown   /* Configure swarm to be of type PIC */
399566063dSJacob Faibussowitsch   PetscCall(DMSwarmSetType(swarm, DMSWARM_PIC));
409566063dSJacob Faibussowitsch   PetscCall(DMSwarmSetCellDM(swarm, celldm));
41c4762a1bSJed Brown 
42c4762a1bSJed Brown   /* Register two scalar fields within the DMSwarm */
439566063dSJacob Faibussowitsch   PetscCall(DMSwarmRegisterPetscDatatypeField(swarm, "viscosity", 1, PETSC_DOUBLE));
449566063dSJacob Faibussowitsch   PetscCall(DMSwarmRegisterPetscDatatypeField(swarm, "density", 1, PETSC_DOUBLE));
459566063dSJacob Faibussowitsch   PetscCall(DMSwarmFinalizeFieldRegister(swarm));
46c4762a1bSJed Brown 
47c4762a1bSJed Brown   /* Set initial local sizes of the DMSwarm with a buffer length of zero */
489566063dSJacob Faibussowitsch   PetscCall(DMSwarmSetLocalSizes(swarm, 4, 0));
49c4762a1bSJed Brown 
50c4762a1bSJed Brown   /* Insert swarm coordinates cell-wise */
519566063dSJacob Faibussowitsch   PetscCall(DMSwarmInsertPointsUsingCellDM(swarm, DMSWARMPIC_LAYOUT_REGULAR, 3));
529371c9d4SSatish Balay   min[0]  = 0.5;
539371c9d4SSatish Balay   max[0]  = 0.7;
549371c9d4SSatish Balay   min[1]  = 0.5;
559371c9d4SSatish Balay   max[1]  = 0.8;
569371c9d4SSatish Balay   min[2]  = 0.5;
579371c9d4SSatish Balay   max[2]  = 0.9;
58c4762a1bSJed Brown   ndir[0] = ndir[1] = ndir[2] = 30;
599566063dSJacob Faibussowitsch   PetscCall(DMSwarmSetPointsUniformCoordinates(swarm, min, max, ndir, ADD_VALUES));
60c4762a1bSJed Brown 
61c4762a1bSJed Brown   /* This should be dispatched from a regular DMView() */
629566063dSJacob Faibussowitsch   PetscCall(DMSwarmViewXDMF(swarm, "ex20.xmf"));
639566063dSJacob Faibussowitsch   PetscCall(DMView(celldm, PETSC_VIEWER_STDOUT_WORLD));
649566063dSJacob Faibussowitsch   PetscCall(DMView(swarm, PETSC_VIEWER_STDOUT_WORLD));
65c4762a1bSJed Brown 
66c4762a1bSJed Brown   {
67c4762a1bSJed Brown     PetscInt    npoints, *list;
68c4762a1bSJed Brown     PetscMPIInt rank;
69c4762a1bSJed Brown 
709566063dSJacob Faibussowitsch     PetscCallMPI(MPI_Comm_rank(PETSC_COMM_WORLD, &rank));
719566063dSJacob Faibussowitsch     PetscCall(DMSwarmSortGetAccess(swarm));
729566063dSJacob Faibussowitsch     PetscCall(DMSwarmSortGetNumberOfPointsPerCell(swarm, 0, &npoints));
739566063dSJacob Faibussowitsch     PetscCall(DMSwarmSortGetPointsPerCell(swarm, rank, &npoints, &list));
749566063dSJacob Faibussowitsch     PetscCall(PetscFree(list));
759566063dSJacob Faibussowitsch     PetscCall(DMSwarmSortRestoreAccess(swarm));
76c4762a1bSJed Brown   }
779566063dSJacob Faibussowitsch   PetscCall(DMSwarmMigrate(swarm, PETSC_FALSE));
789566063dSJacob Faibussowitsch   PetscCall(DMDestroy(&celldm));
799566063dSJacob Faibussowitsch   PetscCall(DMDestroy(&swarm));
803ba16761SJacob Faibussowitsch   PetscFunctionReturn(PETSC_SUCCESS);
81c4762a1bSJed Brown }
82c4762a1bSJed Brown 
83d71ae5a4SJacob Faibussowitsch PetscErrorCode pic_insert_DMPLEX_with_cell_list(PetscInt dim)
84d71ae5a4SJacob Faibussowitsch {
85c4762a1bSJed Brown   DM          celldm = NULL, swarm, distributedMesh = NULL;
86c4762a1bSJed Brown   const char *fieldnames[] = {"viscosity"};
87c4762a1bSJed Brown 
88c4762a1bSJed Brown   PetscFunctionBegin;
89c4762a1bSJed Brown   /* Create the background cell DM */
90c4762a1bSJed Brown   if (dim == 2) {
91c4762a1bSJed Brown     PetscInt   cells_per_dim[2], nx[2];
92c4762a1bSJed Brown     PetscInt   n_tricells;
93c4762a1bSJed Brown     PetscInt   n_trivert;
94a4a685f2SJacob Faibussowitsch     PetscInt  *tricells;
95a4a685f2SJacob Faibussowitsch     PetscReal *trivert, dx, dy;
96c4762a1bSJed Brown     PetscInt   ii, jj, cnt;
97c4762a1bSJed Brown 
98c4762a1bSJed Brown     cells_per_dim[0] = 4;
99c4762a1bSJed Brown     cells_per_dim[1] = 4;
100c4762a1bSJed Brown     n_tricells       = cells_per_dim[0] * cells_per_dim[1] * 2;
101c4762a1bSJed Brown     nx[0]            = cells_per_dim[0] + 1;
102c4762a1bSJed Brown     nx[1]            = cells_per_dim[1] + 1;
103c4762a1bSJed Brown     n_trivert        = nx[0] * nx[1];
104c4762a1bSJed Brown 
1059566063dSJacob Faibussowitsch     PetscCall(PetscMalloc1(n_tricells * 3, &tricells));
1069566063dSJacob Faibussowitsch     PetscCall(PetscMalloc1(nx[0] * nx[1] * 2, &trivert));
107c4762a1bSJed Brown 
108c4762a1bSJed Brown     /* verts */
109c4762a1bSJed Brown     cnt = 0;
110c4762a1bSJed Brown     dx  = 2.0 / ((PetscReal)cells_per_dim[0]);
111c4762a1bSJed Brown     dy  = 1.0 / ((PetscReal)cells_per_dim[1]);
112c4762a1bSJed Brown     for (jj = 0; jj < nx[1]; jj++) {
113c4762a1bSJed Brown       for (ii = 0; ii < nx[0]; ii++) {
114c4762a1bSJed Brown         trivert[2 * cnt + 0] = 0.0 + ii * dx;
115c4762a1bSJed Brown         trivert[2 * cnt + 1] = 0.0 + jj * dy;
116c4762a1bSJed Brown         cnt++;
117c4762a1bSJed Brown       }
118c4762a1bSJed Brown     }
119c4762a1bSJed Brown 
120c4762a1bSJed Brown     /* connectivity */
121c4762a1bSJed Brown     cnt = 0;
122c4762a1bSJed Brown     for (jj = 0; jj < cells_per_dim[1]; jj++) {
123c4762a1bSJed Brown       for (ii = 0; ii < cells_per_dim[0]; ii++) {
124c4762a1bSJed Brown         PetscInt idx, idx0, idx1, idx2, idx3;
125c4762a1bSJed Brown 
126c4762a1bSJed Brown         idx  = (ii) + (jj)*nx[0];
127c4762a1bSJed Brown         idx0 = idx;
128c4762a1bSJed Brown         idx1 = idx0 + 1;
129c4762a1bSJed Brown         idx2 = idx1 + nx[0];
130c4762a1bSJed Brown         idx3 = idx0 + nx[0];
131c4762a1bSJed Brown 
132c4762a1bSJed Brown         tricells[3 * cnt + 0] = idx0;
133c4762a1bSJed Brown         tricells[3 * cnt + 1] = idx1;
134c4762a1bSJed Brown         tricells[3 * cnt + 2] = idx2;
135c4762a1bSJed Brown         cnt++;
136c4762a1bSJed Brown 
137c4762a1bSJed Brown         tricells[3 * cnt + 0] = idx0;
138c4762a1bSJed Brown         tricells[3 * cnt + 1] = idx2;
139c4762a1bSJed Brown         tricells[3 * cnt + 2] = idx3;
140c4762a1bSJed Brown         cnt++;
141c4762a1bSJed Brown       }
142c4762a1bSJed Brown     }
1439566063dSJacob Faibussowitsch     PetscCall(DMPlexCreateFromCellListPetsc(PETSC_COMM_WORLD, dim, n_tricells, n_trivert, 3, PETSC_TRUE, tricells, dim, trivert, &celldm));
1449566063dSJacob Faibussowitsch     PetscCall(PetscFree(trivert));
1459566063dSJacob Faibussowitsch     PetscCall(PetscFree(tricells));
146c4762a1bSJed Brown   }
14708401ef6SPierre Jolivet   PetscCheck(dim != 3, PETSC_COMM_WORLD, PETSC_ERR_SUP, "Only 2D PLEX example supported");
148c4762a1bSJed Brown 
149c4762a1bSJed Brown   /* Distribute mesh over processes */
1509566063dSJacob Faibussowitsch   PetscCall(DMPlexDistribute(celldm, 0, NULL, &distributedMesh));
151c4762a1bSJed Brown   if (distributedMesh) {
1529566063dSJacob Faibussowitsch     PetscCall(DMDestroy(&celldm));
153c4762a1bSJed Brown     celldm = distributedMesh;
154c4762a1bSJed Brown   }
1559566063dSJacob Faibussowitsch   PetscCall(PetscObjectSetName((PetscObject)celldm, "Cells"));
1569566063dSJacob Faibussowitsch   PetscCall(DMSetFromOptions(celldm));
157c4762a1bSJed Brown   {
158c4762a1bSJed Brown     PetscInt     numComp[] = {1};
159c4762a1bSJed Brown     PetscInt     numDof[]  = {1, 0, 0}; /* vert, edge, cell */
160c4762a1bSJed Brown     PetscInt     numBC     = 0;
161c4762a1bSJed Brown     PetscSection section;
162c4762a1bSJed Brown 
1639566063dSJacob Faibussowitsch     PetscCall(DMPlexCreateSection(celldm, NULL, numComp, numDof, numBC, NULL, NULL, NULL, NULL, &section));
1649566063dSJacob Faibussowitsch     PetscCall(DMSetLocalSection(celldm, section));
1659566063dSJacob Faibussowitsch     PetscCall(PetscSectionDestroy(&section));
166c4762a1bSJed Brown   }
1679566063dSJacob Faibussowitsch   PetscCall(DMSetUp(celldm));
168c4762a1bSJed Brown   {
169c4762a1bSJed Brown     PetscViewer viewer;
170c4762a1bSJed Brown 
1719566063dSJacob Faibussowitsch     PetscCall(PetscViewerCreate(PETSC_COMM_WORLD, &viewer));
1729566063dSJacob Faibussowitsch     PetscCall(PetscViewerSetType(viewer, PETSCVIEWERVTK));
1739566063dSJacob Faibussowitsch     PetscCall(PetscViewerFileSetMode(viewer, FILE_MODE_WRITE));
1749566063dSJacob Faibussowitsch     PetscCall(PetscViewerFileSetName(viewer, "ex20plex.vtk"));
1759566063dSJacob Faibussowitsch     PetscCall(DMView(celldm, viewer));
1769566063dSJacob Faibussowitsch     PetscCall(PetscViewerDestroy(&viewer));
177c4762a1bSJed Brown   }
178c4762a1bSJed Brown 
179c4762a1bSJed Brown   /* Create the DMSwarm */
1809566063dSJacob Faibussowitsch   PetscCall(DMCreate(PETSC_COMM_WORLD, &swarm));
1819566063dSJacob Faibussowitsch   PetscCall(PetscObjectSetName((PetscObject)swarm, "Swarm"));
1829566063dSJacob Faibussowitsch   PetscCall(DMSetType(swarm, DMSWARM));
1839566063dSJacob Faibussowitsch   PetscCall(DMSetDimension(swarm, dim));
184c4762a1bSJed Brown 
1859566063dSJacob Faibussowitsch   PetscCall(DMSwarmSetType(swarm, DMSWARM_PIC));
1869566063dSJacob Faibussowitsch   PetscCall(DMSwarmSetCellDM(swarm, celldm));
187c4762a1bSJed Brown 
188c4762a1bSJed Brown   /* Register two scalar fields within the DMSwarm */
1899566063dSJacob Faibussowitsch   PetscCall(DMSwarmRegisterPetscDatatypeField(swarm, "viscosity", 1, PETSC_DOUBLE));
1909566063dSJacob Faibussowitsch   PetscCall(DMSwarmRegisterPetscDatatypeField(swarm, "density", 1, PETSC_DOUBLE));
1919566063dSJacob Faibussowitsch   PetscCall(DMSwarmFinalizeFieldRegister(swarm));
192c4762a1bSJed Brown 
193c4762a1bSJed Brown   /* Set initial local sizes of the DMSwarm with a buffer length of zero */
1949566063dSJacob Faibussowitsch   PetscCall(DMSwarmSetLocalSizes(swarm, 4, 0));
195c4762a1bSJed Brown 
196c4762a1bSJed Brown   /* Insert swarm coordinates cell-wise */
1979566063dSJacob Faibussowitsch   PetscCall(DMSwarmInsertPointsUsingCellDM(swarm, DMSWARMPIC_LAYOUT_SUBDIVISION, 2));
1989566063dSJacob Faibussowitsch   PetscCall(DMSwarmViewFieldsXDMF(swarm, "ex20.xmf", 1, fieldnames));
1999566063dSJacob Faibussowitsch   PetscCall(DMView(celldm, PETSC_VIEWER_STDOUT_WORLD));
2009566063dSJacob Faibussowitsch   PetscCall(DMView(swarm, PETSC_VIEWER_STDOUT_WORLD));
2019566063dSJacob Faibussowitsch   PetscCall(DMDestroy(&celldm));
2029566063dSJacob Faibussowitsch   PetscCall(DMDestroy(&swarm));
2033ba16761SJacob Faibussowitsch   PetscFunctionReturn(PETSC_SUCCESS);
204c4762a1bSJed Brown }
205c4762a1bSJed Brown 
206d71ae5a4SJacob Faibussowitsch PetscErrorCode pic_insert_DMPLEX(PetscBool is_simplex, PetscInt dim)
207d71ae5a4SJacob Faibussowitsch {
208c4762a1bSJed Brown   DM          celldm, swarm, distributedMesh = NULL;
209c4762a1bSJed Brown   const char *fieldnames[] = {"viscosity", "DMSwarm_rank"};
210c4762a1bSJed Brown 
211c4762a1bSJed Brown   PetscFunctionBegin;
212c4762a1bSJed Brown   /* Create the background cell DM */
213c4762a1bSJed Brown   {
214c4762a1bSJed Brown     PetscInt faces[3] = {4, 2, 4};
215*42108689Sksagiyam     PetscCall(DMPlexCreateBoxMesh(PETSC_COMM_WORLD, dim, is_simplex, faces, NULL, NULL, NULL, PETSC_TRUE, 0, PETSC_TRUE, &celldm));
216c4762a1bSJed Brown   }
217c4762a1bSJed Brown 
218c4762a1bSJed Brown   /* Distribute mesh over processes */
2199566063dSJacob Faibussowitsch   PetscCall(DMPlexDistribute(celldm, 0, NULL, &distributedMesh));
220c4762a1bSJed Brown   if (distributedMesh) {
2219566063dSJacob Faibussowitsch     PetscCall(DMDestroy(&celldm));
222c4762a1bSJed Brown     celldm = distributedMesh;
223c4762a1bSJed Brown   }
2249566063dSJacob Faibussowitsch   PetscCall(PetscObjectSetName((PetscObject)celldm, "Cells"));
2259566063dSJacob Faibussowitsch   PetscCall(DMSetFromOptions(celldm));
226c4762a1bSJed Brown   {
227c4762a1bSJed Brown     PetscInt     numComp[] = {1};
228c4762a1bSJed Brown     PetscInt     numDof[]  = {1, 0, 0}; /* vert, edge, cell */
229c4762a1bSJed Brown     PetscInt     numBC     = 0;
230c4762a1bSJed Brown     PetscSection section;
231c4762a1bSJed Brown 
2329566063dSJacob Faibussowitsch     PetscCall(DMPlexCreateSection(celldm, NULL, numComp, numDof, numBC, NULL, NULL, NULL, NULL, &section));
2339566063dSJacob Faibussowitsch     PetscCall(DMSetLocalSection(celldm, section));
2349566063dSJacob Faibussowitsch     PetscCall(PetscSectionDestroy(&section));
235c4762a1bSJed Brown   }
2369566063dSJacob Faibussowitsch   PetscCall(DMSetUp(celldm));
237c4762a1bSJed Brown   {
238c4762a1bSJed Brown     PetscViewer viewer;
239c4762a1bSJed Brown 
2409566063dSJacob Faibussowitsch     PetscCall(PetscViewerCreate(PETSC_COMM_WORLD, &viewer));
2419566063dSJacob Faibussowitsch     PetscCall(PetscViewerSetType(viewer, PETSCVIEWERVTK));
2429566063dSJacob Faibussowitsch     PetscCall(PetscViewerFileSetMode(viewer, FILE_MODE_WRITE));
2439566063dSJacob Faibussowitsch     PetscCall(PetscViewerFileSetName(viewer, "ex20plex.vtk"));
2449566063dSJacob Faibussowitsch     PetscCall(DMView(celldm, viewer));
2459566063dSJacob Faibussowitsch     PetscCall(PetscViewerDestroy(&viewer));
246c4762a1bSJed Brown   }
247c4762a1bSJed Brown 
2489566063dSJacob Faibussowitsch   PetscCall(DMCreate(PETSC_COMM_WORLD, &swarm));
2499566063dSJacob Faibussowitsch   PetscCall(PetscObjectSetName((PetscObject)swarm, "Swarm"));
2509566063dSJacob Faibussowitsch   PetscCall(DMSetType(swarm, DMSWARM));
2519566063dSJacob Faibussowitsch   PetscCall(DMSetDimension(swarm, dim));
252c4762a1bSJed Brown 
2539566063dSJacob Faibussowitsch   PetscCall(DMSwarmSetType(swarm, DMSWARM_PIC));
2549566063dSJacob Faibussowitsch   PetscCall(DMSwarmSetCellDM(swarm, celldm));
255c4762a1bSJed Brown 
256c4762a1bSJed Brown   /* Register two scalar fields within the DMSwarm */
2579566063dSJacob Faibussowitsch   PetscCall(DMSwarmRegisterPetscDatatypeField(swarm, "viscosity", 1, PETSC_DOUBLE));
2589566063dSJacob Faibussowitsch   PetscCall(DMSwarmRegisterPetscDatatypeField(swarm, "density", 1, PETSC_DOUBLE));
2599566063dSJacob Faibussowitsch   PetscCall(DMSwarmFinalizeFieldRegister(swarm));
260c4762a1bSJed Brown 
261c4762a1bSJed Brown   /* Set initial local sizes of the DMSwarm with a buffer length of zero */
2629566063dSJacob Faibussowitsch   PetscCall(DMSwarmSetLocalSizes(swarm, 4, 0));
263c4762a1bSJed Brown 
264c4762a1bSJed Brown   /* Insert swarm coordinates cell-wise */
2659566063dSJacob Faibussowitsch   PetscCall(DMSwarmInsertPointsUsingCellDM(swarm, DMSWARMPIC_LAYOUT_GAUSS, 3));
2669566063dSJacob Faibussowitsch   PetscCall(DMSwarmViewFieldsXDMF(swarm, "ex20.xmf", 2, fieldnames));
2679566063dSJacob Faibussowitsch   PetscCall(DMView(celldm, PETSC_VIEWER_STDOUT_WORLD));
2689566063dSJacob Faibussowitsch   PetscCall(DMView(swarm, PETSC_VIEWER_STDOUT_WORLD));
2699566063dSJacob Faibussowitsch   PetscCall(DMDestroy(&celldm));
2709566063dSJacob Faibussowitsch   PetscCall(DMDestroy(&swarm));
2713ba16761SJacob Faibussowitsch   PetscFunctionReturn(PETSC_SUCCESS);
272c4762a1bSJed Brown }
273c4762a1bSJed Brown 
274d71ae5a4SJacob Faibussowitsch int main(int argc, char **args)
275d71ae5a4SJacob Faibussowitsch {
276c4762a1bSJed Brown   PetscInt mode = 0;
277c4762a1bSJed Brown   PetscInt dim  = 2;
278c4762a1bSJed Brown 
279327415f7SBarry Smith   PetscFunctionBeginUser;
2809566063dSJacob Faibussowitsch   PetscCall(PetscInitialize(&argc, &args, (char *)0, help));
2819566063dSJacob Faibussowitsch   PetscCall(PetscOptionsGetInt(NULL, NULL, "-mode", &mode, NULL));
2829566063dSJacob Faibussowitsch   PetscCall(PetscOptionsGetInt(NULL, NULL, "-dim", &dim, NULL));
283c4762a1bSJed Brown   switch (mode) {
284d71ae5a4SJacob Faibussowitsch   case 0:
285d71ae5a4SJacob Faibussowitsch     PetscCall(pic_insert_DMDA(dim));
286d71ae5a4SJacob Faibussowitsch     break;
287c4762a1bSJed Brown   case 1:
288c4762a1bSJed Brown     /* tri / tet */
2899566063dSJacob Faibussowitsch     PetscCall(pic_insert_DMPLEX(PETSC_TRUE, dim));
290c4762a1bSJed Brown     break;
291c4762a1bSJed Brown   case 2:
292c4762a1bSJed Brown     /* quad / hex */
2939566063dSJacob Faibussowitsch     PetscCall(pic_insert_DMPLEX(PETSC_FALSE, dim));
294c4762a1bSJed Brown     break;
295d71ae5a4SJacob Faibussowitsch   default:
296d71ae5a4SJacob Faibussowitsch     PetscCall(pic_insert_DMDA(dim));
297d71ae5a4SJacob Faibussowitsch     break;
298c4762a1bSJed Brown   }
2999566063dSJacob Faibussowitsch   PetscCall(PetscFinalize());
300b122ec5aSJacob Faibussowitsch   return 0;
301c4762a1bSJed Brown }
302c4762a1bSJed Brown 
303c4762a1bSJed Brown /*TEST
304c4762a1bSJed Brown 
305c4762a1bSJed Brown    test:
306c4762a1bSJed Brown       args:
307c4762a1bSJed Brown       requires: !complex double
3087ed4f029SJed Brown       filter: grep -v atomic
309c4762a1bSJed Brown       filter_output: grep -v atomic
310c4762a1bSJed Brown 
311c4762a1bSJed Brown    test:
312c4762a1bSJed Brown       suffix: 2
313c4762a1bSJed Brown       requires: triangle double !complex
314c4762a1bSJed Brown       args: -mode 1
3157ed4f029SJed Brown       filter: grep -v atomic
316c4762a1bSJed Brown       filter_output: grep -v atomic
317c4762a1bSJed Brown 
318c4762a1bSJed Brown TEST*/
319