1df2803a8Sksagiyam static char help[] = "Tests for submesh creation for periodic meshes\n\n";
2df2803a8Sksagiyam
3df2803a8Sksagiyam #include <petscdmplex.h>
4df2803a8Sksagiyam #include <petsc/private/dmimpl.h>
5df2803a8Sksagiyam #include <petscsf.h>
6df2803a8Sksagiyam
7df2803a8Sksagiyam /* 3 x 2 2D mesh periodic in x-direction using nproc = 1.
8df2803a8Sksagiyam
9df2803a8Sksagiyam Cell submesh (subdim = 2):
10df2803a8Sksagiyam
11df2803a8Sksagiyam 12--21--13--22--14--23---~ 6--12---7--13---8--14---~
12df2803a8Sksagiyam | | | ~ | | | ~
13df2803a8Sksagiyam 25 3 27 4 29 5 ~ 15 0 16 1 17 2 ~
14df2803a8Sksagiyam | | | ~ | | | ~
15df2803a8Sksagiyam 9--18--10--19--11--20---~ -> 3---9---4--10---5--11---~
16df2803a8Sksagiyam | | | ~
17df2803a8Sksagiyam 24 0 26 1 28 2 ~
18df2803a8Sksagiyam | | | ~
19df2803a8Sksagiyam 6--15---7--16---8--17---~
20df2803a8Sksagiyam
21df2803a8Sksagiyam Facet submesh (subdim = 1):
22df2803a8Sksagiyam
23df2803a8Sksagiyam 12--21--13--22--14--23---~ 3---0---4---1---5---2---~
24df2803a8Sksagiyam | | | ~
25df2803a8Sksagiyam 25 3 27 4 29 5 ~
26df2803a8Sksagiyam | | | ~
27df2803a8Sksagiyam 9--18--10--19--11--20---~ ->
28df2803a8Sksagiyam | | | ~
29df2803a8Sksagiyam 24 0 26 1 28 2 ~
30df2803a8Sksagiyam | | | ~
31df2803a8Sksagiyam 6--15---7--16---8--17---~
32df2803a8Sksagiyam
33df2803a8Sksagiyam */
34df2803a8Sksagiyam
35df2803a8Sksagiyam typedef struct {
36df2803a8Sksagiyam PetscInt subdim; /* The topological dimension of the submesh */
37df2803a8Sksagiyam } AppCtx;
38df2803a8Sksagiyam
ProcessOptions(AppCtx * options)39df2803a8Sksagiyam PetscErrorCode ProcessOptions(AppCtx *options)
40df2803a8Sksagiyam {
41df2803a8Sksagiyam PetscFunctionBegin;
42df2803a8Sksagiyam options->subdim = 2;
43df2803a8Sksagiyam
44df2803a8Sksagiyam PetscOptionsBegin(PETSC_COMM_SELF, "", "Filtering Problem Options", "DMPLEX");
45df2803a8Sksagiyam PetscCall(PetscOptionsBoundedInt("-subdim", "The topological dimension of the submesh", "ex74.c", options->subdim, &options->subdim, NULL, 0));
46df2803a8Sksagiyam PetscOptionsEnd();
47df2803a8Sksagiyam PetscFunctionReturn(PETSC_SUCCESS);
48df2803a8Sksagiyam }
49df2803a8Sksagiyam
main(int argc,char ** argv)50df2803a8Sksagiyam int main(int argc, char **argv)
51df2803a8Sksagiyam {
52df2803a8Sksagiyam PetscInt dim = 2;
53df2803a8Sksagiyam DM dm, subdm, coorddm;
54df2803a8Sksagiyam PetscFE coordfe;
55df2803a8Sksagiyam const PetscInt faces[2] = {3, 2};
56df2803a8Sksagiyam const PetscReal lower[2] = {0., 0.}, upper[2] = {3., 2.};
57df2803a8Sksagiyam const DMBoundaryType periodicity[2] = {DM_BOUNDARY_PERIODIC, DM_BOUNDARY_NONE};
58df2803a8Sksagiyam DMLabel filter;
59df2803a8Sksagiyam const PetscInt filterValue = 1;
60df2803a8Sksagiyam MPI_Comm comm;
61df2803a8Sksagiyam PetscMPIInt size;
62df2803a8Sksagiyam AppCtx user;
63df2803a8Sksagiyam
64df2803a8Sksagiyam PetscFunctionBeginUser;
65df2803a8Sksagiyam PetscCall(PetscInitialize(&argc, &argv, NULL, help));
66df2803a8Sksagiyam PetscCall(ProcessOptions(&user));
67df2803a8Sksagiyam comm = PETSC_COMM_WORLD;
68df2803a8Sksagiyam PetscCallMPI(MPI_Comm_size(comm, &size));
69df2803a8Sksagiyam if (size != 1) {
70df2803a8Sksagiyam PetscCall(PetscPrintf(comm, "This example is specifically designed for comm size == 1.\n"));
71df2803a8Sksagiyam PetscCall(PetscFinalize());
72df2803a8Sksagiyam return 0;
73df2803a8Sksagiyam }
74df2803a8Sksagiyam PetscCall(DMPlexCreateBoxMesh(comm, dim, PETSC_FALSE, faces, lower, upper, periodicity, PETSC_TRUE, 0, PETSC_TRUE, &dm));
75df2803a8Sksagiyam /* Reset DG coordinates so that DMLocalizeCoordinates() will run again */
76df2803a8Sksagiyam /* in DMSetFromOptions() after CG coordinate FE is set. */
77df2803a8Sksagiyam dm->coordinates[1].dim = -1;
78df2803a8Sksagiyam /* Localize coordinates on facets, too, if we are to make a facet submesh. */
79df2803a8Sksagiyam /* Otherwise, DG coordinate values will not be copied from the parent mesh. */
80df2803a8Sksagiyam PetscCall(DMSetFromOptions(dm));
81df2803a8Sksagiyam PetscCall(DMLabelCreate(PETSC_COMM_SELF, "filter", &filter));
82df2803a8Sksagiyam switch (user.subdim) {
83df2803a8Sksagiyam case 2:
84df2803a8Sksagiyam PetscCall(DMLabelSetValue(filter, 3, filterValue));
85df2803a8Sksagiyam PetscCall(DMLabelSetValue(filter, 4, filterValue));
86df2803a8Sksagiyam PetscCall(DMLabelSetValue(filter, 5, filterValue));
87df2803a8Sksagiyam break;
88df2803a8Sksagiyam case 1:
89df2803a8Sksagiyam PetscCall(DMLabelSetValue(filter, 21, filterValue));
90df2803a8Sksagiyam PetscCall(DMLabelSetValue(filter, 22, filterValue));
91df2803a8Sksagiyam PetscCall(DMLabelSetValue(filter, 23, filterValue));
92df2803a8Sksagiyam break;
93df2803a8Sksagiyam default:
94df2803a8Sksagiyam PetscCall(PetscPrintf(comm, "This example is only for subdim == {1, 2}.\n"));
95df2803a8Sksagiyam PetscCall(PetscFinalize());
96df2803a8Sksagiyam return 0;
97df2803a8Sksagiyam }
98*71f1c950SStefano Zampini PetscCall(DMPlexFilter(dm, filter, filterValue, PETSC_FALSE, PETSC_FALSE, PetscObjectComm((PetscObject)dm), NULL, &subdm));
99df2803a8Sksagiyam PetscCall(DMLabelDestroy(&filter));
100df2803a8Sksagiyam PetscCall(DMDestroy(&dm));
101df2803a8Sksagiyam PetscCall(PetscObjectSetName((PetscObject)subdm, "Example_SubDM"));
102df2803a8Sksagiyam PetscCall(DMViewFromOptions(subdm, NULL, "-dm_view"));
103df2803a8Sksagiyam PetscCall(DMGetCellCoordinateDM(subdm, &coorddm));
104df2803a8Sksagiyam PetscCall(DMGetField(coorddm, 0, NULL, (PetscObject *)&coordfe));
105df2803a8Sksagiyam PetscCall(PetscFEView(coordfe, PETSC_VIEWER_STDOUT_WORLD));
106df2803a8Sksagiyam PetscCall(DMDestroy(&subdm));
107df2803a8Sksagiyam PetscCall(PetscFinalize());
108df2803a8Sksagiyam return 0;
109df2803a8Sksagiyam }
110df2803a8Sksagiyam
111df2803a8Sksagiyam /*TEST
112df2803a8Sksagiyam
113df2803a8Sksagiyam testset:
114df2803a8Sksagiyam args: -dm_coord_space 1 -dm_coord_petscspace_degree 1 -dm_localize 1 -dm_view ascii::ascii_info_detail
115df2803a8Sksagiyam
116df2803a8Sksagiyam test:
117df2803a8Sksagiyam suffix: 0
118df2803a8Sksagiyam args: -dm_sparse_localize 0 -dm_localize_height 0 -subdim 2
119df2803a8Sksagiyam
120df2803a8Sksagiyam test:
121df2803a8Sksagiyam suffix: 1
122df2803a8Sksagiyam args: -dm_sparse_localize 1 -dm_localize_height 0 -subdim 2
123df2803a8Sksagiyam
124df2803a8Sksagiyam test:
125df2803a8Sksagiyam suffix: 2
126df2803a8Sksagiyam args: -dm_sparse_localize 0 -dm_localize_height 1 -subdim 1
127df2803a8Sksagiyam
128df2803a8Sksagiyam test:
129df2803a8Sksagiyam suffix: 3
130df2803a8Sksagiyam args: -dm_sparse_localize 1 -dm_localize_height 1 -subdim 1
131df2803a8Sksagiyam
132df2803a8Sksagiyam TEST*/
133