xref: /petsc/src/dm/impls/plex/tutorials/ex1.c (revision 8ec8862e4af6348283b361bd0ad8267c26fc94e0)
1c4762a1bSJed Brown static char help[] = "Define a simple field over the mesh\n\n";
2c4762a1bSJed Brown 
3c4762a1bSJed Brown #include <petscdmplex.h>
4c4762a1bSJed Brown 
5c4762a1bSJed Brown int main(int argc, char **argv)
6c4762a1bSJed Brown {
7c4762a1bSJed Brown   DM             dm, dmDist = NULL;
8c4762a1bSJed Brown   Vec            u;
9c4762a1bSJed Brown   PetscSection   section;
10c4762a1bSJed Brown   PetscViewer    viewer;
11c4762a1bSJed Brown   PetscInt       dim = 2, numFields, numBC, i;
12c4762a1bSJed Brown   PetscInt       numComp[3];
13c4762a1bSJed Brown   PetscInt       numDof[12];
14c4762a1bSJed Brown   PetscInt       bcField[1];
15c4762a1bSJed Brown   IS             bcPointIS[1];
16c4762a1bSJed Brown   PetscBool      interpolate = PETSC_TRUE;
17c4762a1bSJed Brown   PetscErrorCode ierr;
18c4762a1bSJed Brown 
19c4762a1bSJed Brown   ierr = PetscInitialize(&argc, &argv, NULL,help);if (ierr) return ierr;
20c4762a1bSJed Brown   ierr = PetscOptionsGetInt(NULL,NULL, "-dim", &dim, NULL);CHKERRQ(ierr);
21c4762a1bSJed Brown   /* Create a mesh */
22c4762a1bSJed Brown   ierr = DMPlexCreateBoxMesh(PETSC_COMM_WORLD, dim, PETSC_TRUE, NULL, NULL, NULL, NULL, interpolate, &dm);CHKERRQ(ierr);
23c4762a1bSJed Brown   /* Distribute mesh over processes */
24c4762a1bSJed Brown   ierr = DMPlexDistribute(dm, 0, NULL, &dmDist);CHKERRQ(ierr);
25c4762a1bSJed Brown   if (dmDist) {ierr = DMDestroy(&dm);CHKERRQ(ierr); dm = dmDist;}
26c4762a1bSJed Brown   /* Create a scalar field u, a vector field v, and a surface vector field w */
27c4762a1bSJed Brown   numFields  = 3;
28c4762a1bSJed Brown   numComp[0] = 1;
29c4762a1bSJed Brown   numComp[1] = dim;
30c4762a1bSJed Brown   numComp[2] = dim-1;
31c4762a1bSJed Brown   for (i = 0; i < numFields*(dim+1); ++i) numDof[i] = 0;
32c4762a1bSJed Brown   /* Let u be defined on vertices */
33c4762a1bSJed Brown   numDof[0*(dim+1)+0]     = 1;
34c4762a1bSJed Brown   /* Let v be defined on cells */
35c4762a1bSJed Brown   numDof[1*(dim+1)+dim]   = dim;
36c4762a1bSJed Brown   /* Let w be defined on faces */
37c4762a1bSJed Brown   numDof[2*(dim+1)+dim-1] = dim-1;
38c4762a1bSJed Brown   /* Setup boundary conditions */
39c4762a1bSJed Brown   numBC = 1;
40c4762a1bSJed Brown   /* Prescribe a Dirichlet condition on u on the boundary
41c4762a1bSJed Brown        Label "marker" is made by the mesh creation routine */
42c4762a1bSJed Brown   bcField[0] = 0;
43c4762a1bSJed Brown   ierr = DMGetStratumIS(dm, "marker", 1, &bcPointIS[0]);CHKERRQ(ierr);
44c4762a1bSJed Brown   /* Create a PetscSection with this data layout */
45c4762a1bSJed Brown   ierr = DMSetNumFields(dm, numFields);CHKERRQ(ierr);
46c4762a1bSJed Brown   ierr = DMPlexCreateSection(dm, NULL, numComp, numDof, numBC, bcField, NULL, bcPointIS, NULL, &section);CHKERRQ(ierr);
47c4762a1bSJed Brown   ierr = ISDestroy(&bcPointIS[0]);CHKERRQ(ierr);
48c4762a1bSJed Brown   /* Name the Field variables */
49c4762a1bSJed Brown   ierr = PetscSectionSetFieldName(section, 0, "u");CHKERRQ(ierr);
50c4762a1bSJed Brown   ierr = PetscSectionSetFieldName(section, 1, "v");CHKERRQ(ierr);
51c4762a1bSJed Brown   ierr = PetscSectionSetFieldName(section, 2, "w");CHKERRQ(ierr);
52c4762a1bSJed Brown   ierr = PetscSectionView(section, PETSC_VIEWER_STDOUT_WORLD);CHKERRQ(ierr);
53c4762a1bSJed Brown   /* Tell the DM to use this data layout */
54c4762a1bSJed Brown   ierr = DMSetLocalSection(dm, section);CHKERRQ(ierr);
55c4762a1bSJed Brown   /* Create a Vec with this layout and view it */
56c4762a1bSJed Brown   ierr = DMGetGlobalVector(dm, &u);CHKERRQ(ierr);
57c4762a1bSJed Brown   ierr = PetscViewerCreate(PETSC_COMM_WORLD, &viewer);CHKERRQ(ierr);
58c4762a1bSJed Brown   ierr = PetscViewerSetType(viewer, PETSCVIEWERVTK);CHKERRQ(ierr);
59*8ec8862eSJed Brown   ierr = PetscViewerFileSetName(viewer, "sol.vtu");CHKERRQ(ierr);
60c4762a1bSJed Brown   ierr = VecView(u, viewer);CHKERRQ(ierr);
61c4762a1bSJed Brown   ierr = PetscViewerDestroy(&viewer);CHKERRQ(ierr);
62c4762a1bSJed Brown   ierr = DMRestoreGlobalVector(dm, &u);CHKERRQ(ierr);
63c4762a1bSJed Brown   /* Cleanup */
64c4762a1bSJed Brown   ierr = PetscSectionDestroy(&section);CHKERRQ(ierr);
65c4762a1bSJed Brown   ierr = DMDestroy(&dm);CHKERRQ(ierr);
66c4762a1bSJed Brown   ierr = PetscFinalize();
67c4762a1bSJed Brown   return ierr;
68c4762a1bSJed Brown }
69c4762a1bSJed Brown 
70c4762a1bSJed Brown /*TEST
71c4762a1bSJed Brown 
72c4762a1bSJed Brown   test:
73c4762a1bSJed Brown     suffix: 0
74c4762a1bSJed Brown     requires: triangle
75c20d7725SJed Brown     args: -info :~sys
76c4762a1bSJed Brown   test:
77c4762a1bSJed Brown     suffix: 1
78c4762a1bSJed Brown     requires: ctetgen
79c20d7725SJed Brown     args: -dim 3 -info :~sys
80c4762a1bSJed Brown 
81c4762a1bSJed Brown TEST*/
82