xref: /petsc/src/dm/impls/plex/tests/ex16.c (revision b122ec5aa1bd4469eb4e0673542fb7de3f411254)
1c4762a1bSJed Brown static char help[] = "Tests for creation of submeshes\n\n";
2c4762a1bSJed Brown 
3c4762a1bSJed Brown #include <petscdmplex.h>
4c4762a1bSJed Brown 
530602db0SMatthew G. Knepley PetscErrorCode CreateMesh(MPI_Comm comm, DM *dm)
6c4762a1bSJed Brown {
7c4762a1bSJed Brown   PetscFunctionBegin;
85f80ce2aSJacob Faibussowitsch   CHKERRQ(DMCreate(comm, dm));
95f80ce2aSJacob Faibussowitsch   CHKERRQ(DMSetType(*dm, DMPLEX));
105f80ce2aSJacob Faibussowitsch   CHKERRQ(DMSetFromOptions(*dm));
115f80ce2aSJacob Faibussowitsch   CHKERRQ(DMViewFromOptions(*dm, NULL, "-dm_view"));
12c4762a1bSJed Brown   PetscFunctionReturn(0);
13c4762a1bSJed Brown }
14c4762a1bSJed Brown 
15c4762a1bSJed Brown PetscErrorCode CreateSubmesh(DM dm, PetscBool start, DM *subdm)
16c4762a1bSJed Brown {
17c4762a1bSJed Brown   DMLabel        label, map;
18c4762a1bSJed Brown   PetscInt       cStart, cEnd, cStartSub, cEndSub, c;
19c4762a1bSJed Brown 
20c4762a1bSJed Brown   PetscFunctionBegin;
215f80ce2aSJacob Faibussowitsch   CHKERRQ(DMPlexGetHeightStratum(dm, 0, &cStart, &cEnd));
225f80ce2aSJacob Faibussowitsch   CHKERRQ(DMCreateLabel(dm, "cells"));
235f80ce2aSJacob Faibussowitsch   CHKERRQ(DMGetLabel(dm, "cells", &label));
245f80ce2aSJacob Faibussowitsch   CHKERRQ(DMLabelClearStratum(label, 1));
25c4762a1bSJed Brown   if (start) {cStartSub = cStart; cEndSub = cEnd/2;}
26c4762a1bSJed Brown   else       {cStartSub = cEnd/2; cEndSub = cEnd;}
275f80ce2aSJacob Faibussowitsch   for (c = cStartSub; c < cEndSub; ++c) CHKERRQ(DMLabelSetValue(label, c, 1));
285f80ce2aSJacob Faibussowitsch   CHKERRQ(DMPlexFilter(dm, label, 1, subdm));
295f80ce2aSJacob Faibussowitsch   CHKERRQ(PetscObjectSetName((PetscObject) *subdm, "Submesh"));
305f80ce2aSJacob Faibussowitsch   CHKERRQ(DMViewFromOptions(*subdm, NULL, "-dm_view"));
315f80ce2aSJacob Faibussowitsch   CHKERRQ(DMPlexGetSubpointMap(*subdm, &map));
325f80ce2aSJacob Faibussowitsch   CHKERRQ(DMLabelView(map, PETSC_VIEWER_STDOUT_WORLD));
33c4762a1bSJed Brown   PetscFunctionReturn(0);
34c4762a1bSJed Brown }
35c4762a1bSJed Brown 
36c4762a1bSJed Brown int main(int argc, char **argv)
37c4762a1bSJed Brown {
38c4762a1bSJed Brown   DM             dm, subdm;
39c4762a1bSJed Brown 
40*b122ec5aSJacob Faibussowitsch   CHKERRQ(PetscInitialize(&argc, &argv, NULL, help));
415f80ce2aSJacob Faibussowitsch   CHKERRQ(CreateMesh(PETSC_COMM_WORLD, &dm));
425f80ce2aSJacob Faibussowitsch   CHKERRQ(CreateSubmesh(dm, PETSC_TRUE, &subdm));
435f80ce2aSJacob Faibussowitsch   CHKERRQ(DMSetFromOptions(subdm));
445f80ce2aSJacob Faibussowitsch   CHKERRQ(DMDestroy(&subdm));
455f80ce2aSJacob Faibussowitsch   CHKERRQ(CreateSubmesh(dm, PETSC_FALSE, &subdm));
465f80ce2aSJacob Faibussowitsch   CHKERRQ(DMSetFromOptions(subdm));
475f80ce2aSJacob Faibussowitsch   CHKERRQ(DMDestroy(&subdm));
485f80ce2aSJacob Faibussowitsch   CHKERRQ(DMDestroy(&dm));
49*b122ec5aSJacob Faibussowitsch   CHKERRQ(PetscFinalize());
50*b122ec5aSJacob Faibussowitsch   return 0;
51c4762a1bSJed Brown }
52c4762a1bSJed Brown 
53c4762a1bSJed Brown /*TEST
54c4762a1bSJed Brown 
55c4762a1bSJed Brown   test:
56c4762a1bSJed Brown     suffix: 0
57c4762a1bSJed Brown     requires: triangle
5830602db0SMatthew G. Knepley     args: -dm_coord_space 0 -dm_view ascii::ascii_info_detail -dm_plex_check_all
59c4762a1bSJed Brown 
60c4762a1bSJed Brown TEST*/
61