xref: /petsc/src/dm/tutorials/ex20.c (revision b122ec5aa1bd4469eb4e0673542fb7de3f411254)
1c4762a1bSJed Brown 
2c4762a1bSJed Brown static char help[] = "DMSwarm-PIC demonstator of inserting points into a cell DM \n\
3c4762a1bSJed Brown Options: \n\
4c4762a1bSJed Brown -mode {0,1} : 0 ==> DMDA, 1 ==> DMPLEX cell DM \n\
5c4762a1bSJed Brown -dim {2,3}  : spatial dimension\n";
6c4762a1bSJed Brown 
7c4762a1bSJed Brown #include <petsc.h>
8c4762a1bSJed Brown #include <petscdm.h>
9c4762a1bSJed Brown #include <petscdmda.h>
10c4762a1bSJed Brown #include <petscdmplex.h>
11c4762a1bSJed Brown #include <petscdmswarm.h>
12c4762a1bSJed Brown 
13c4762a1bSJed Brown PetscErrorCode pic_insert_DMDA(PetscInt dim)
14c4762a1bSJed Brown {
15c4762a1bSJed Brown   DM             celldm = NULL,swarm;
16c4762a1bSJed Brown   PetscInt       dof,stencil_width;
17c4762a1bSJed Brown   PetscReal      min[3],max[3];
18c4762a1bSJed Brown   PetscInt       ndir[3];
19c4762a1bSJed Brown 
20c4762a1bSJed Brown   PetscFunctionBegin;
21c4762a1bSJed Brown   /* Create the background cell DM */
22c4762a1bSJed Brown   dof = 1;
23c4762a1bSJed Brown   stencil_width = 1;
24c4762a1bSJed Brown   if (dim == 2) {
255f80ce2aSJacob Faibussowitsch     CHKERRQ(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));
26c4762a1bSJed Brown   }
27c4762a1bSJed Brown   if (dim == 3) {
285f80ce2aSJacob Faibussowitsch     CHKERRQ(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));
29c4762a1bSJed Brown   }
30c4762a1bSJed Brown 
315f80ce2aSJacob Faibussowitsch   CHKERRQ(DMDASetElementType(celldm,DMDA_ELEMENT_Q1));
325f80ce2aSJacob Faibussowitsch   CHKERRQ(DMSetFromOptions(celldm));
335f80ce2aSJacob Faibussowitsch   CHKERRQ(DMSetUp(celldm));
34c4762a1bSJed Brown 
355f80ce2aSJacob Faibussowitsch   CHKERRQ(DMDASetUniformCoordinates(celldm,0.0,2.0,0.0,1.0,0.0,1.5));
36c4762a1bSJed Brown 
37c4762a1bSJed Brown   /* Create the DMSwarm */
385f80ce2aSJacob Faibussowitsch   CHKERRQ(DMCreate(PETSC_COMM_WORLD,&swarm));
395f80ce2aSJacob Faibussowitsch   CHKERRQ(PetscObjectSetName((PetscObject)swarm,"Swarm"));
405f80ce2aSJacob Faibussowitsch   CHKERRQ(DMSetType(swarm,DMSWARM));
415f80ce2aSJacob Faibussowitsch   CHKERRQ(DMSetDimension(swarm,dim));
42c4762a1bSJed Brown 
43c4762a1bSJed Brown   /* Configure swarm to be of type PIC */
445f80ce2aSJacob Faibussowitsch   CHKERRQ(DMSwarmSetType(swarm,DMSWARM_PIC));
455f80ce2aSJacob Faibussowitsch   CHKERRQ(DMSwarmSetCellDM(swarm,celldm));
46c4762a1bSJed Brown 
47c4762a1bSJed Brown   /* Register two scalar fields within the DMSwarm */
485f80ce2aSJacob Faibussowitsch   CHKERRQ(DMSwarmRegisterPetscDatatypeField(swarm,"viscosity",1,PETSC_DOUBLE));
495f80ce2aSJacob Faibussowitsch   CHKERRQ(DMSwarmRegisterPetscDatatypeField(swarm,"density",1,PETSC_DOUBLE));
505f80ce2aSJacob Faibussowitsch   CHKERRQ(DMSwarmFinalizeFieldRegister(swarm));
51c4762a1bSJed Brown 
52c4762a1bSJed Brown   /* Set initial local sizes of the DMSwarm with a buffer length of zero */
535f80ce2aSJacob Faibussowitsch   CHKERRQ(DMSwarmSetLocalSizes(swarm,4,0));
54c4762a1bSJed Brown 
55c4762a1bSJed Brown   /* Insert swarm coordinates cell-wise */
565f80ce2aSJacob Faibussowitsch   CHKERRQ(DMSwarmInsertPointsUsingCellDM(swarm,DMSWARMPIC_LAYOUT_REGULAR,3));
57c4762a1bSJed Brown   min[0] = 0.5; max[0] = 0.7;
58c4762a1bSJed Brown   min[1] = 0.5; max[1] = 0.8;
59c4762a1bSJed Brown   min[2] = 0.5; max[2] = 0.9;
60c4762a1bSJed Brown   ndir[0] = ndir[1] = ndir[2] = 30;
615f80ce2aSJacob Faibussowitsch   CHKERRQ(DMSwarmSetPointsUniformCoordinates(swarm,min,max,ndir,ADD_VALUES));
62c4762a1bSJed Brown 
63c4762a1bSJed Brown   /* This should be dispatched from a regular DMView() */
645f80ce2aSJacob Faibussowitsch   CHKERRQ(DMSwarmViewXDMF(swarm,"ex20.xmf"));
655f80ce2aSJacob Faibussowitsch   CHKERRQ(DMView(celldm,PETSC_VIEWER_STDOUT_WORLD));
665f80ce2aSJacob Faibussowitsch   CHKERRQ(DMView(swarm,PETSC_VIEWER_STDOUT_WORLD));
67c4762a1bSJed Brown 
68c4762a1bSJed Brown   {
69c4762a1bSJed Brown     PetscInt    npoints,*list;
70c4762a1bSJed Brown     PetscMPIInt rank;
71c4762a1bSJed Brown 
725f80ce2aSJacob Faibussowitsch     CHKERRMPI(MPI_Comm_rank(PETSC_COMM_WORLD,&rank));
735f80ce2aSJacob Faibussowitsch     CHKERRQ(DMSwarmSortGetAccess(swarm));
745f80ce2aSJacob Faibussowitsch     CHKERRQ(DMSwarmSortGetNumberOfPointsPerCell(swarm,0,&npoints));
755f80ce2aSJacob Faibussowitsch     CHKERRQ(DMSwarmSortGetPointsPerCell(swarm,rank,&npoints,&list));
765f80ce2aSJacob Faibussowitsch     CHKERRQ(PetscFree(list));
775f80ce2aSJacob Faibussowitsch     CHKERRQ(DMSwarmSortRestoreAccess(swarm));
78c4762a1bSJed Brown   }
795f80ce2aSJacob Faibussowitsch   CHKERRQ(DMSwarmMigrate(swarm,PETSC_FALSE));
805f80ce2aSJacob Faibussowitsch   CHKERRQ(DMDestroy(&celldm));
815f80ce2aSJacob Faibussowitsch   CHKERRQ(DMDestroy(&swarm));
82c4762a1bSJed Brown   PetscFunctionReturn(0);
83c4762a1bSJed Brown }
84c4762a1bSJed Brown 
85c4762a1bSJed Brown PetscErrorCode pic_insert_DMPLEX_with_cell_list(PetscInt dim)
86c4762a1bSJed Brown {
87c4762a1bSJed Brown   DM             celldm = NULL,swarm,distributedMesh = NULL;
88c4762a1bSJed Brown   const  char    *fieldnames[] = {"viscosity"};
89c4762a1bSJed Brown 
90c4762a1bSJed Brown   PetscFunctionBegin;
91c4762a1bSJed Brown   /* Create the background cell DM */
92c4762a1bSJed Brown   if (dim == 2) {
93c4762a1bSJed Brown     PetscInt   cells_per_dim[2],nx[2];
94c4762a1bSJed Brown     PetscInt   n_tricells;
95c4762a1bSJed Brown     PetscInt   n_trivert;
96a4a685f2SJacob Faibussowitsch     PetscInt   *tricells;
97a4a685f2SJacob Faibussowitsch     PetscReal  *trivert,dx,dy;
98c4762a1bSJed Brown     PetscInt   ii,jj,cnt;
99c4762a1bSJed Brown 
100c4762a1bSJed Brown     cells_per_dim[0] = 4;
101c4762a1bSJed Brown     cells_per_dim[1] = 4;
102c4762a1bSJed Brown     n_tricells = cells_per_dim[0] * cells_per_dim[1] * 2;
103c4762a1bSJed Brown     nx[0] = cells_per_dim[0] + 1;
104c4762a1bSJed Brown     nx[1] = cells_per_dim[1] + 1;
105c4762a1bSJed Brown     n_trivert = nx[0] * nx[1];
106c4762a1bSJed Brown 
1075f80ce2aSJacob Faibussowitsch     CHKERRQ(PetscMalloc1(n_tricells*3,&tricells));
1085f80ce2aSJacob Faibussowitsch     CHKERRQ(PetscMalloc1(nx[0]*nx[1]*2,&trivert));
109c4762a1bSJed Brown 
110c4762a1bSJed Brown     /* verts */
111c4762a1bSJed Brown     cnt = 0;
112c4762a1bSJed Brown     dx = 2.0/((PetscReal)cells_per_dim[0]);
113c4762a1bSJed Brown     dy = 1.0/((PetscReal)cells_per_dim[1]);
114c4762a1bSJed Brown     for (jj=0; jj<nx[1]; jj++) {
115c4762a1bSJed Brown       for (ii=0; ii<nx[0]; ii++) {
116c4762a1bSJed Brown         trivert[2*cnt+0] = 0.0 + ii * dx;
117c4762a1bSJed Brown         trivert[2*cnt+1] = 0.0 + jj * dy;
118c4762a1bSJed Brown         cnt++;
119c4762a1bSJed Brown       }
120c4762a1bSJed Brown     }
121c4762a1bSJed Brown 
122c4762a1bSJed Brown     /* connectivity */
123c4762a1bSJed Brown     cnt = 0;
124c4762a1bSJed Brown     for (jj=0; jj<cells_per_dim[1]; jj++) {
125c4762a1bSJed Brown       for (ii=0; ii<cells_per_dim[0]; ii++) {
126c4762a1bSJed Brown         PetscInt idx,idx0,idx1,idx2,idx3;
127c4762a1bSJed Brown 
128c4762a1bSJed Brown         idx = (ii) + (jj) * nx[0];
129c4762a1bSJed Brown         idx0 = idx;
130c4762a1bSJed Brown         idx1 = idx0 + 1;
131c4762a1bSJed Brown         idx2 = idx1 + nx[0];
132c4762a1bSJed Brown         idx3 = idx0 + nx[0];
133c4762a1bSJed Brown 
134c4762a1bSJed Brown         tricells[3*cnt+0] = idx0;
135c4762a1bSJed Brown         tricells[3*cnt+1] = idx1;
136c4762a1bSJed Brown         tricells[3*cnt+2] = idx2;
137c4762a1bSJed Brown         cnt++;
138c4762a1bSJed Brown 
139c4762a1bSJed Brown         tricells[3*cnt+0] = idx0;
140c4762a1bSJed Brown         tricells[3*cnt+1] = idx2;
141c4762a1bSJed Brown         tricells[3*cnt+2] = idx3;
142c4762a1bSJed Brown         cnt++;
143c4762a1bSJed Brown       }
144c4762a1bSJed Brown     }
1455f80ce2aSJacob Faibussowitsch     CHKERRQ(DMPlexCreateFromCellListPetsc(PETSC_COMM_WORLD,dim,n_tricells,n_trivert,3,PETSC_TRUE,tricells,dim,trivert,&celldm));
1465f80ce2aSJacob Faibussowitsch     CHKERRQ(PetscFree(trivert));
1475f80ce2aSJacob Faibussowitsch     CHKERRQ(PetscFree(tricells));
148c4762a1bSJed Brown   }
1492c71b3e2SJacob Faibussowitsch   PetscCheckFalse(dim == 3,PETSC_COMM_WORLD,PETSC_ERR_SUP,"Only 2D PLEX example supported");
150c4762a1bSJed Brown 
151c4762a1bSJed Brown   /* Distribute mesh over processes */
1525f80ce2aSJacob Faibussowitsch   CHKERRQ(DMPlexDistribute(celldm,0,NULL,&distributedMesh));
153c4762a1bSJed Brown   if (distributedMesh) {
1545f80ce2aSJacob Faibussowitsch     CHKERRQ(DMDestroy(&celldm));
155c4762a1bSJed Brown     celldm = distributedMesh;
156c4762a1bSJed Brown   }
1575f80ce2aSJacob Faibussowitsch   CHKERRQ(PetscObjectSetName((PetscObject)celldm,"Cells"));
1585f80ce2aSJacob Faibussowitsch   CHKERRQ(DMSetFromOptions(celldm));
159c4762a1bSJed Brown   {
160c4762a1bSJed Brown     PetscInt     numComp[] = {1};
161c4762a1bSJed Brown     PetscInt     numDof[] = {1,0,0}; /* vert, edge, cell */
162c4762a1bSJed Brown     PetscInt     numBC = 0;
163c4762a1bSJed Brown     PetscSection section;
164c4762a1bSJed Brown 
1655f80ce2aSJacob Faibussowitsch     CHKERRQ(DMPlexCreateSection(celldm,NULL,numComp,numDof,numBC,NULL,NULL,NULL,NULL,&section));
1665f80ce2aSJacob Faibussowitsch     CHKERRQ(DMSetLocalSection(celldm,section));
1675f80ce2aSJacob Faibussowitsch     CHKERRQ(PetscSectionDestroy(&section));
168c4762a1bSJed Brown   }
1695f80ce2aSJacob Faibussowitsch   CHKERRQ(DMSetUp(celldm));
170c4762a1bSJed Brown   {
171c4762a1bSJed Brown     PetscViewer viewer;
172c4762a1bSJed Brown 
1735f80ce2aSJacob Faibussowitsch     CHKERRQ(PetscViewerCreate(PETSC_COMM_WORLD,&viewer));
1745f80ce2aSJacob Faibussowitsch     CHKERRQ(PetscViewerSetType(viewer,PETSCVIEWERVTK));
1755f80ce2aSJacob Faibussowitsch     CHKERRQ(PetscViewerFileSetMode(viewer,FILE_MODE_WRITE));
1765f80ce2aSJacob Faibussowitsch     CHKERRQ(PetscViewerFileSetName(viewer,"ex20plex.vtk"));
1775f80ce2aSJacob Faibussowitsch     CHKERRQ(DMView(celldm,viewer));
1785f80ce2aSJacob Faibussowitsch     CHKERRQ(PetscViewerDestroy(&viewer));
179c4762a1bSJed Brown   }
180c4762a1bSJed Brown 
181c4762a1bSJed Brown   /* Create the DMSwarm */
1825f80ce2aSJacob Faibussowitsch   CHKERRQ(DMCreate(PETSC_COMM_WORLD,&swarm));
1835f80ce2aSJacob Faibussowitsch   CHKERRQ(PetscObjectSetName((PetscObject)swarm,"Swarm"));
1845f80ce2aSJacob Faibussowitsch   CHKERRQ(DMSetType(swarm,DMSWARM));
1855f80ce2aSJacob Faibussowitsch   CHKERRQ(DMSetDimension(swarm,dim));
186c4762a1bSJed Brown 
1875f80ce2aSJacob Faibussowitsch   CHKERRQ(DMSwarmSetType(swarm,DMSWARM_PIC));
1885f80ce2aSJacob Faibussowitsch   CHKERRQ(DMSwarmSetCellDM(swarm,celldm));
189c4762a1bSJed Brown 
190c4762a1bSJed Brown   /* Register two scalar fields within the DMSwarm */
1915f80ce2aSJacob Faibussowitsch   CHKERRQ(DMSwarmRegisterPetscDatatypeField(swarm,"viscosity",1,PETSC_DOUBLE));
1925f80ce2aSJacob Faibussowitsch   CHKERRQ(DMSwarmRegisterPetscDatatypeField(swarm,"density",1,PETSC_DOUBLE));
1935f80ce2aSJacob Faibussowitsch   CHKERRQ(DMSwarmFinalizeFieldRegister(swarm));
194c4762a1bSJed Brown 
195c4762a1bSJed Brown   /* Set initial local sizes of the DMSwarm with a buffer length of zero */
1965f80ce2aSJacob Faibussowitsch   CHKERRQ(DMSwarmSetLocalSizes(swarm,4,0));
197c4762a1bSJed Brown 
198c4762a1bSJed Brown   /* Insert swarm coordinates cell-wise */
1995f80ce2aSJacob Faibussowitsch   CHKERRQ(DMSwarmInsertPointsUsingCellDM(swarm,DMSWARMPIC_LAYOUT_SUBDIVISION,2));
2005f80ce2aSJacob Faibussowitsch   CHKERRQ(DMSwarmViewFieldsXDMF(swarm,"ex20.xmf",1,fieldnames));
2015f80ce2aSJacob Faibussowitsch   CHKERRQ(DMView(celldm,PETSC_VIEWER_STDOUT_WORLD));
2025f80ce2aSJacob Faibussowitsch   CHKERRQ(DMView(swarm,PETSC_VIEWER_STDOUT_WORLD));
2035f80ce2aSJacob Faibussowitsch   CHKERRQ(DMDestroy(&celldm));
2045f80ce2aSJacob Faibussowitsch   CHKERRQ(DMDestroy(&swarm));
205c4762a1bSJed Brown   PetscFunctionReturn(0);
206c4762a1bSJed Brown }
207c4762a1bSJed Brown 
208c4762a1bSJed Brown PetscErrorCode pic_insert_DMPLEX(PetscBool is_simplex,PetscInt dim)
209c4762a1bSJed Brown {
210c4762a1bSJed Brown   DM             celldm,swarm,distributedMesh = NULL;
211c4762a1bSJed Brown   const char     *fieldnames[] = {"viscosity","DMSwarm_rank"};
212c4762a1bSJed Brown 
213c4762a1bSJed Brown   PetscFunctionBegin;
214c4762a1bSJed Brown 
215c4762a1bSJed Brown   /* Create the background cell DM */
216c4762a1bSJed Brown   {
217c4762a1bSJed Brown     PetscInt faces[3] = {4, 2, 4};
2185f80ce2aSJacob Faibussowitsch     CHKERRQ(DMPlexCreateBoxMesh(PETSC_COMM_WORLD, dim, is_simplex, faces, NULL, NULL, NULL, PETSC_TRUE, &celldm));
219c4762a1bSJed Brown   }
220c4762a1bSJed Brown 
221c4762a1bSJed Brown   /* Distribute mesh over processes */
2225f80ce2aSJacob Faibussowitsch   CHKERRQ(DMPlexDistribute(celldm,0,NULL,&distributedMesh));
223c4762a1bSJed Brown   if (distributedMesh) {
2245f80ce2aSJacob Faibussowitsch     CHKERRQ(DMDestroy(&celldm));
225c4762a1bSJed Brown     celldm = distributedMesh;
226c4762a1bSJed Brown   }
2275f80ce2aSJacob Faibussowitsch   CHKERRQ(PetscObjectSetName((PetscObject)celldm,"Cells"));
2285f80ce2aSJacob Faibussowitsch   CHKERRQ(DMSetFromOptions(celldm));
229c4762a1bSJed Brown   {
230c4762a1bSJed Brown     PetscInt     numComp[] = {1};
231c4762a1bSJed Brown     PetscInt     numDof[] = {1,0,0}; /* vert, edge, cell */
232c4762a1bSJed Brown     PetscInt     numBC = 0;
233c4762a1bSJed Brown     PetscSection section;
234c4762a1bSJed Brown 
2355f80ce2aSJacob Faibussowitsch     CHKERRQ(DMPlexCreateSection(celldm,NULL,numComp,numDof,numBC,NULL,NULL,NULL,NULL,&section));
2365f80ce2aSJacob Faibussowitsch     CHKERRQ(DMSetLocalSection(celldm,section));
2375f80ce2aSJacob Faibussowitsch     CHKERRQ(PetscSectionDestroy(&section));
238c4762a1bSJed Brown   }
2395f80ce2aSJacob Faibussowitsch   CHKERRQ(DMSetUp(celldm));
240c4762a1bSJed Brown   {
241c4762a1bSJed Brown     PetscViewer viewer;
242c4762a1bSJed Brown 
2435f80ce2aSJacob Faibussowitsch     CHKERRQ(PetscViewerCreate(PETSC_COMM_WORLD,&viewer));
2445f80ce2aSJacob Faibussowitsch     CHKERRQ(PetscViewerSetType(viewer,PETSCVIEWERVTK));
2455f80ce2aSJacob Faibussowitsch     CHKERRQ(PetscViewerFileSetMode(viewer,FILE_MODE_WRITE));
2465f80ce2aSJacob Faibussowitsch     CHKERRQ(PetscViewerFileSetName(viewer,"ex20plex.vtk"));
2475f80ce2aSJacob Faibussowitsch     CHKERRQ(DMView(celldm,viewer));
2485f80ce2aSJacob Faibussowitsch     CHKERRQ(PetscViewerDestroy(&viewer));
249c4762a1bSJed Brown   }
250c4762a1bSJed Brown 
2515f80ce2aSJacob Faibussowitsch   CHKERRQ(DMCreate(PETSC_COMM_WORLD,&swarm));
2525f80ce2aSJacob Faibussowitsch   CHKERRQ(PetscObjectSetName((PetscObject)swarm,"Swarm"));
2535f80ce2aSJacob Faibussowitsch   CHKERRQ(DMSetType(swarm,DMSWARM));
2545f80ce2aSJacob Faibussowitsch   CHKERRQ(DMSetDimension(swarm,dim));
255c4762a1bSJed Brown 
2565f80ce2aSJacob Faibussowitsch   CHKERRQ(DMSwarmSetType(swarm,DMSWARM_PIC));
2575f80ce2aSJacob Faibussowitsch   CHKERRQ(DMSwarmSetCellDM(swarm,celldm));
258c4762a1bSJed Brown 
259c4762a1bSJed Brown   /* Register two scalar fields within the DMSwarm */
2605f80ce2aSJacob Faibussowitsch   CHKERRQ(DMSwarmRegisterPetscDatatypeField(swarm,"viscosity",1,PETSC_DOUBLE));
2615f80ce2aSJacob Faibussowitsch   CHKERRQ(DMSwarmRegisterPetscDatatypeField(swarm,"density",1,PETSC_DOUBLE));
2625f80ce2aSJacob Faibussowitsch   CHKERRQ(DMSwarmFinalizeFieldRegister(swarm));
263c4762a1bSJed Brown 
264c4762a1bSJed Brown   /* Set initial local sizes of the DMSwarm with a buffer length of zero */
2655f80ce2aSJacob Faibussowitsch   CHKERRQ(DMSwarmSetLocalSizes(swarm,4,0));
266c4762a1bSJed Brown 
267c4762a1bSJed Brown   /* Insert swarm coordinates cell-wise */
2685f80ce2aSJacob Faibussowitsch   CHKERRQ(DMSwarmInsertPointsUsingCellDM(swarm,DMSWARMPIC_LAYOUT_GAUSS,3));
2695f80ce2aSJacob Faibussowitsch   CHKERRQ(DMSwarmViewFieldsXDMF(swarm,"ex20.xmf",2,fieldnames));
2705f80ce2aSJacob Faibussowitsch   CHKERRQ(DMView(celldm,PETSC_VIEWER_STDOUT_WORLD));
2715f80ce2aSJacob Faibussowitsch   CHKERRQ(DMView(swarm,PETSC_VIEWER_STDOUT_WORLD));
2725f80ce2aSJacob Faibussowitsch   CHKERRQ(DMDestroy(&celldm));
2735f80ce2aSJacob Faibussowitsch   CHKERRQ(DMDestroy(&swarm));
274c4762a1bSJed Brown   PetscFunctionReturn(0);
275c4762a1bSJed Brown }
276c4762a1bSJed Brown 
277c4762a1bSJed Brown int main(int argc,char **args)
278c4762a1bSJed Brown {
279c4762a1bSJed Brown   PetscInt       mode = 0;
280c4762a1bSJed Brown   PetscInt       dim = 2;
281c4762a1bSJed Brown 
282*b122ec5aSJacob Faibussowitsch   CHKERRQ(PetscInitialize(&argc,&args,(char*)0,help));
2835f80ce2aSJacob Faibussowitsch   CHKERRQ(PetscOptionsGetInt(NULL,NULL,"-mode",&mode,NULL));
2845f80ce2aSJacob Faibussowitsch   CHKERRQ(PetscOptionsGetInt(NULL,NULL,"-dim",&dim,NULL));
285c4762a1bSJed Brown   switch (mode) {
286c4762a1bSJed Brown     case 0:
2875f80ce2aSJacob Faibussowitsch       CHKERRQ(pic_insert_DMDA(dim));
288c4762a1bSJed Brown       break;
289c4762a1bSJed Brown     case 1:
290c4762a1bSJed Brown       /* tri / tet */
2915f80ce2aSJacob Faibussowitsch       CHKERRQ(pic_insert_DMPLEX(PETSC_TRUE,dim));
292c4762a1bSJed Brown       break;
293c4762a1bSJed Brown     case 2:
294c4762a1bSJed Brown       /* quad / hex */
2955f80ce2aSJacob Faibussowitsch       CHKERRQ(pic_insert_DMPLEX(PETSC_FALSE,dim));
296c4762a1bSJed Brown       break;
297c4762a1bSJed Brown     default:
2985f80ce2aSJacob Faibussowitsch       CHKERRQ(pic_insert_DMDA(dim));
299c4762a1bSJed Brown       break;
300c4762a1bSJed Brown   }
301*b122ec5aSJacob Faibussowitsch   CHKERRQ(PetscFinalize());
302*b122ec5aSJacob Faibussowitsch   return 0;
303c4762a1bSJed Brown }
304c4762a1bSJed Brown 
305c4762a1bSJed Brown /*TEST
306c4762a1bSJed Brown 
307c4762a1bSJed Brown    test:
308c4762a1bSJed Brown       args:
309c4762a1bSJed Brown       requires: !complex double
3107ed4f029SJed Brown       filter: grep -v atomic
311c4762a1bSJed Brown       filter_output: grep -v atomic
312c4762a1bSJed Brown 
313c4762a1bSJed Brown    test:
314c4762a1bSJed Brown       suffix: 2
315c4762a1bSJed Brown       requires: triangle double !complex
316c4762a1bSJed Brown       args: -mode 1
3177ed4f029SJed Brown       filter: grep -v atomic
318c4762a1bSJed Brown       filter_output: grep -v atomic
319c4762a1bSJed Brown 
320c4762a1bSJed Brown TEST*/
321