xref: /petsc/src/dm/impls/plex/tutorials/ex2.c (revision ee12ae39415b2e672d944cdca066227dadbf8b14)
1 static char help[] = "Read in a mesh and test whether it is valid\n\n";
2 
3 #include <petscdmplex.h>
4 #if defined(PETSC_HAVE_CGNS)
5 #undef I /* Very old CGNS stupidly uses I as a variable, which fails when using complex. Curse you idiot package managers */
6 #include <cgnslib.h>
7 #endif
8 #if defined(PETSC_HAVE_EXODUSII)
9 #include <exodusII.h>
10 #endif
11 
12 typedef struct {
13   PetscBool interpolate;                  /* Generate intermediate mesh elements */
14   char      filename[PETSC_MAX_PATH_LEN]; /* Mesh filename */
15   PetscInt  dim;
16   PetscErrorCode (**bcFuncs)(PetscInt dim, const PetscReal x[], PetscInt Nf, PetscScalar *u, void *ctx);
17 } AppCtx;
18 
19 static PetscErrorCode zero(PetscInt dim, const PetscReal x[], PetscInt Nf, PetscScalar *u, void *ctx)
20 {
21   PetscInt i;
22   for (i = 0; i < dim; ++i) u[i] = 0.0;
23   return 0;
24 }
25 
26 static PetscErrorCode ProcessOptions(MPI_Comm comm, AppCtx *options)
27 {
28   PetscErrorCode ierr;
29 
30   PetscFunctionBeginUser;
31   options->interpolate = PETSC_TRUE;
32   options->filename[0] = '\0';
33   options->dim         = 2;
34   options->bcFuncs     = NULL;
35 
36   ierr = PetscOptionsBegin(comm, "", "Meshing Problem Options", "DMPLEX");CHKERRQ(ierr);
37   ierr = PetscOptionsBool("-interpolate", "Generate intermediate mesh elements", "ex2.c", options->interpolate, &options->interpolate, NULL);CHKERRQ(ierr);
38   ierr = PetscOptionsString("-filename", "The mesh file", "ex2.c", options->filename, options->filename, sizeof(options->filename), NULL);CHKERRQ(ierr);
39   ierr = PetscOptionsRangeInt("-dim", "The dimension of problem used for non-file mesh", "ex2.c", options->dim, &options->dim, NULL,1,3);CHKERRQ(ierr);
40   ierr = PetscOptionsEnd();
41   PetscFunctionReturn(0);
42 }
43 
44 static PetscErrorCode CreateMesh(MPI_Comm comm, AppCtx *user, DM *dm)
45 {
46   size_t         len;
47   PetscErrorCode ierr;
48 
49   PetscFunctionBeginUser;
50   ierr = PetscStrlen(user->filename, &len);CHKERRQ(ierr);
51   if (!len) {
52     DMLabel  label;
53     PetscInt id = 1;
54 
55     ierr = DMPlexCreateBoxMesh(comm, user->dim, PETSC_TRUE, NULL, NULL, NULL, NULL, user->interpolate, dm);CHKERRQ(ierr);
56     /* Mark boundary and set BC */
57     ierr = DMCreateLabel(*dm, "boundary");CHKERRQ(ierr);
58     ierr = DMGetLabel(*dm, "boundary", &label);CHKERRQ(ierr);
59     ierr = DMPlexMarkBoundaryFaces(*dm, 1, label);CHKERRQ(ierr);
60     ierr = DMPlexLabelComplete(*dm, label);CHKERRQ(ierr);
61     ierr = PetscMalloc1(1, &user->bcFuncs);CHKERRQ(ierr);
62     user->bcFuncs[0] = zero;
63     ierr = DMAddBoundary(*dm, DM_BC_ESSENTIAL, "wall", "boundary", 0, 0, NULL, (void (*)(void)) user->bcFuncs[0], NULL, 1, &id, user);CHKERRQ(ierr);
64   } else {
65     ierr = DMPlexCreateFromFile(comm, user->filename, user->interpolate, dm);CHKERRQ(ierr);
66   }
67   ierr = PetscObjectSetName((PetscObject) *dm, "Mesh");CHKERRQ(ierr);
68   ierr = DMSetFromOptions(*dm);CHKERRQ(ierr);
69   ierr = DMViewFromOptions(*dm, NULL, "-dm_view");CHKERRQ(ierr);
70   PetscFunctionReturn(0);
71 }
72 
73 int main(int argc, char **argv)
74 {
75   DM             dm;
76   AppCtx         user;
77   PetscErrorCode ierr;
78 
79   ierr = PetscInitialize(&argc, &argv, NULL,help);if (ierr) return ierr;
80   ierr = ProcessOptions(PETSC_COMM_WORLD, &user);CHKERRQ(ierr);
81   ierr = CreateMesh(PETSC_COMM_WORLD, &user, &dm);CHKERRQ(ierr);
82   ierr = DMDestroy(&dm);CHKERRQ(ierr);
83   ierr = PetscFree(user.bcFuncs);CHKERRQ(ierr);
84   ierr = PetscFinalize();
85   return ierr;
86 }
87 
88 /*TEST
89 
90   testset:
91     args: -dm_plex_check_symmetry -dm_plex_check_skeleton -dm_plex_check_faces -dm_plex_check_geometry
92     # CGNS meshes 0-1
93     test:
94       suffix: 0
95       requires: cgns
96       args: -filename ${wPETSC_DIR}/share/petsc/datafiles/meshes/tut21.cgns
97     test:
98       suffix: 1
99       requires: cgns
100       TODO: broken
101       args: -filename ${wPETSC_DIR}/share/petsc/datafiles/meshes/grid_c.cgns
102     # Gmsh meshes 2-4
103     test:
104       suffix: 2
105       requires: double
106       args: -filename ${wPETSC_DIR}/share/petsc/datafiles/meshes/doublet-tet.msh
107     test:
108       suffix: 3
109       requires: double
110       args: -filename ${wPETSC_DIR}/share/petsc/datafiles/meshes/square.msh
111     test:
112       suffix: 4
113       requires: double
114       args: -filename ${wPETSC_DIR}/share/petsc/datafiles/meshes/square_bin.msh
115     # Exodus meshes 5-9
116     test:
117       suffix: 5
118       requires: exodusii
119       args: -filename ${wPETSC_DIR}/share/petsc/datafiles/meshes/sevenside-quad.exo
120     test:
121       suffix: 6
122       requires: exodusii
123       args: -filename ${wPETSC_DIR}/share/petsc/datafiles/meshes/sevenside-quad-15.exo
124     test:
125       suffix: 7
126       requires: exodusii
127       args: -filename ${wPETSC_DIR}/share/petsc/datafiles/meshes/squaremotor-30.exo
128     test:
129       suffix: 8
130       requires: exodusii
131       args: -filename ${wPETSC_DIR}/share/petsc/datafiles/meshes/blockcylinder-50.exo
132     test:
133       suffix: 9
134       requires: exodusii
135      args: -filename ${wPETSC_DIR}/share/petsc/datafiles/meshes/simpleblock-100.exo
136 
137 TEST*/
138