xref: /petsc/src/dm/impls/plex/tests/ex74.c (revision 62ed42821f84f33353546905c9271ed730d39ff0)
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