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 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 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