xref: /petsc/src/dm/impls/plex/tests/ex14.c (revision ea13f565a9e7eeb46a1941ff623f2af24053d663)
1 static char help[] = "Tests for coarsening\n\n";
2 
3 #include <petscdmplex.h>
4 
5 typedef struct {
6   PetscInt  debug;          /* The debugging level */
7   PetscInt  dim;            /* The topological mesh dimension */
8   PetscInt  testNum;        /* The particular mesh to test */
9   PetscBool uninterpolate;  /* Uninterpolate the mesh at the end */
10   char      filename[2048]; /* The optional mesh file */
11 } AppCtx;
12 
13 PetscErrorCode ProcessOptions(MPI_Comm comm, AppCtx *options)
14 {
15   PetscErrorCode ierr;
16 
17   PetscFunctionBegin;
18   options->debug          = 0;
19   options->dim            = 2;
20   options->testNum        = 0;
21   options->uninterpolate  = PETSC_FALSE;
22   options->filename[0]    = '\0';
23 
24   ierr = PetscOptionsBegin(comm, "", "Meshing Problem Options", "DMPLEX");CHKERRQ(ierr);
25   ierr = PetscOptionsBoundedInt("-debug", "The debugging level", "ex14.c", options->debug, &options->debug, NULL,0);CHKERRQ(ierr);
26   ierr = PetscOptionsRangeInt("-dim", "The topological mesh dimension", "ex14.c", options->dim, &options->dim, NULL,1,3);CHKERRQ(ierr);
27   ierr = PetscOptionsBoundedInt("-test_num", "The particular mesh to test", "ex14.c", options->testNum, &options->testNum, NULL,0);CHKERRQ(ierr);
28   ierr = PetscOptionsBool("-uninterpolate", "Uninterpolate the mesh at the end", "ex14.c", options->uninterpolate, &options->uninterpolate, NULL);CHKERRQ(ierr);
29   ierr = PetscOptionsString("-f", "Filename to read", "ex14.c", options->filename, options->filename, sizeof(options->filename), NULL);CHKERRQ(ierr);
30   ierr = PetscOptionsEnd();
31   PetscFunctionReturn(0);
32 }
33 
34 PetscErrorCode CreateMesh(MPI_Comm comm, AppCtx *user, DM *dm)
35 {
36   const char    *filename = user->filename;
37   PetscInt       dim      = user->dim;
38   size_t         len;
39   PetscErrorCode ierr;
40 
41   PetscFunctionBegin;
42   ierr = PetscStrlen(filename, &len);CHKERRQ(ierr);
43   if (!len) {ierr = DMPlexCreateBoxMesh(comm, dim, PETSC_TRUE, NULL, NULL, NULL, NULL, PETSC_TRUE, dm);CHKERRQ(ierr);}
44   else      {ierr = DMPlexCreateFromFile(comm, filename, PETSC_TRUE, dm);CHKERRQ(ierr);}
45   ierr = DMViewFromOptions(*dm, NULL, "-orig_dm_view");CHKERRQ(ierr);
46   {
47     DM distributedMesh = NULL;
48 
49     ierr = DMPlexDistribute(*dm, 0, NULL, &distributedMesh);CHKERRQ(ierr);
50     if (distributedMesh) {
51       ierr = DMDestroy(dm);CHKERRQ(ierr);
52       *dm  = distributedMesh;
53       ierr = DMViewFromOptions(*dm, NULL, "-dist_dm_view");CHKERRQ(ierr);
54     }
55   }
56   ierr = DMSetFromOptions(*dm);CHKERRQ(ierr);
57   if (user->uninterpolate) {
58     DM udm = NULL;
59 
60     ierr = DMPlexUninterpolate(*dm, &udm);CHKERRQ(ierr);
61     ierr = DMDestroy(dm);CHKERRQ(ierr);
62     *dm  = udm;
63     ierr = DMViewFromOptions(*dm, NULL, "-un_dm_view");CHKERRQ(ierr);
64   }
65   ierr = PetscObjectSetName((PetscObject) *dm, "Test Mesh");CHKERRQ(ierr);
66   ierr = DMViewFromOptions(*dm, NULL, "-dm_view");CHKERRQ(ierr);
67   PetscFunctionReturn(0);
68 }
69 
70 int main(int argc, char **argv)
71 {
72   DM             dm;
73   AppCtx         user;
74   PetscErrorCode ierr;
75 
76   ierr = PetscInitialize(&argc, &argv, NULL, help);if (ierr) return ierr;
77   ierr = ProcessOptions(PETSC_COMM_WORLD, &user);CHKERRQ(ierr);
78   ierr = CreateMesh(PETSC_COMM_WORLD, &user, &dm);CHKERRQ(ierr);
79   ierr = DMDestroy(&dm);CHKERRQ(ierr);
80   ierr = PetscFinalize();
81   return ierr;
82 }
83 
84 /*TEST
85   test:
86     suffix: 0
87     requires: triangle
88     args: -dm_view -dm_refine 1 -dm_coarsen -dm_plex_check_symmetry -dm_plex_check_skeleton -dm_plex_check_faces
89 
90 TEST*/
91