xref: /petsc/src/dm/impls/plex/plexgenerate.c (revision a1cb98fac0cdf0eb4d3e8a0c8b58f3fe8f800bc6)
1af0996ceSBarry Smith #include <petsc/private/dmpleximpl.h> /*I      "petscdmplex.h"   I*/
2d9deefdfSMatthew G. Knepley 
3d9deefdfSMatthew G. Knepley /*@C
4*a1cb98faSBarry Smith   DMPlexInvertCell - Flips cell orientations since `DMPLEX` stores some of them internally with outward normals.
5d9deefdfSMatthew G. Knepley 
6d9deefdfSMatthew G. Knepley   Input Parameters:
796ca5757SLisandro Dalcin + cellType - The cell type
8d9deefdfSMatthew G. Knepley - cone - The incoming cone
9d9deefdfSMatthew G. Knepley 
10d9deefdfSMatthew G. Knepley   Output Parameter:
11d9deefdfSMatthew G. Knepley . cone - The inverted cone (in-place)
12d9deefdfSMatthew G. Knepley 
13d9deefdfSMatthew G. Knepley   Level: developer
14d9deefdfSMatthew G. Knepley 
15*a1cb98faSBarry Smith .seealso: [](chapter_unstructured), `DM`, `DMPLEX`, `DMPolytopeType`, `DMPlexGenerate()`
16d9deefdfSMatthew G. Knepley @*/
17d71ae5a4SJacob Faibussowitsch PetscErrorCode DMPlexInvertCell(DMPolytopeType cellType, PetscInt cone[])
18d71ae5a4SJacob Faibussowitsch {
1996ca5757SLisandro Dalcin #define SWAPCONE(cone, i, j) \
2096ca5757SLisandro Dalcin   do { \
2196ca5757SLisandro Dalcin     PetscInt _cone_tmp; \
2296ca5757SLisandro Dalcin     _cone_tmp = (cone)[i]; \
2396ca5757SLisandro Dalcin     (cone)[i] = (cone)[j]; \
2496ca5757SLisandro Dalcin     (cone)[j] = _cone_tmp; \
2596ca5757SLisandro Dalcin   } while (0)
26d9deefdfSMatthew G. Knepley 
27d9deefdfSMatthew G. Knepley   PetscFunctionBegin;
2896ca5757SLisandro Dalcin   switch (cellType) {
29d71ae5a4SJacob Faibussowitsch   case DM_POLYTOPE_POINT:
30d71ae5a4SJacob Faibussowitsch     break;
31d71ae5a4SJacob Faibussowitsch   case DM_POLYTOPE_SEGMENT:
32d71ae5a4SJacob Faibussowitsch     break;
33d71ae5a4SJacob Faibussowitsch   case DM_POLYTOPE_POINT_PRISM_TENSOR:
34d71ae5a4SJacob Faibussowitsch     break;
35d71ae5a4SJacob Faibussowitsch   case DM_POLYTOPE_TRIANGLE:
36d71ae5a4SJacob Faibussowitsch     break;
37d71ae5a4SJacob Faibussowitsch   case DM_POLYTOPE_QUADRILATERAL:
38d71ae5a4SJacob Faibussowitsch     break;
39d71ae5a4SJacob Faibussowitsch   case DM_POLYTOPE_SEG_PRISM_TENSOR:
40d71ae5a4SJacob Faibussowitsch     SWAPCONE(cone, 2, 3);
41d71ae5a4SJacob Faibussowitsch     break;
42d71ae5a4SJacob Faibussowitsch   case DM_POLYTOPE_TETRAHEDRON:
43d71ae5a4SJacob Faibussowitsch     SWAPCONE(cone, 0, 1);
44d71ae5a4SJacob Faibussowitsch     break;
45d71ae5a4SJacob Faibussowitsch   case DM_POLYTOPE_HEXAHEDRON:
46d71ae5a4SJacob Faibussowitsch     SWAPCONE(cone, 1, 3);
47d71ae5a4SJacob Faibussowitsch     break;
48d71ae5a4SJacob Faibussowitsch   case DM_POLYTOPE_TRI_PRISM:
49d71ae5a4SJacob Faibussowitsch     SWAPCONE(cone, 1, 2);
50d71ae5a4SJacob Faibussowitsch     break;
51d71ae5a4SJacob Faibussowitsch   case DM_POLYTOPE_TRI_PRISM_TENSOR:
52d71ae5a4SJacob Faibussowitsch     break;
53d71ae5a4SJacob Faibussowitsch   case DM_POLYTOPE_QUAD_PRISM_TENSOR:
54d71ae5a4SJacob Faibussowitsch     break;
55d71ae5a4SJacob Faibussowitsch   case DM_POLYTOPE_PYRAMID:
56d71ae5a4SJacob Faibussowitsch     SWAPCONE(cone, 1, 3);
57d71ae5a4SJacob Faibussowitsch     break;
58d71ae5a4SJacob Faibussowitsch   default:
59d71ae5a4SJacob Faibussowitsch     break;
60d9deefdfSMatthew G. Knepley   }
61d9deefdfSMatthew G. Knepley   PetscFunctionReturn(0);
6296ca5757SLisandro Dalcin #undef SWAPCONE
6396ca5757SLisandro Dalcin }
6496ca5757SLisandro Dalcin 
6596ca5757SLisandro Dalcin /*@C
66*a1cb98faSBarry Smith   DMPlexReorderCell - Flips cell orientations since `DMPLEX` stores some of them internally with outward normals.
6796ca5757SLisandro Dalcin 
6896ca5757SLisandro Dalcin   Input Parameters:
69*a1cb98faSBarry Smith + dm - The `DMPLEX` object
7096ca5757SLisandro Dalcin . cell - The cell
7196ca5757SLisandro Dalcin - cone - The incoming cone
7296ca5757SLisandro Dalcin 
7396ca5757SLisandro Dalcin   Output Parameter:
7496ca5757SLisandro Dalcin . cone - The reordered cone (in-place)
7596ca5757SLisandro Dalcin 
7696ca5757SLisandro Dalcin   Level: developer
7796ca5757SLisandro Dalcin 
78*a1cb98faSBarry Smith .seealso: [](chapter_unstructured), `DM`, `DMPLEX`, `DMPolytopeType`, `DMPlexGenerate()`
7996ca5757SLisandro Dalcin @*/
80d71ae5a4SJacob Faibussowitsch PetscErrorCode DMPlexReorderCell(DM dm, PetscInt cell, PetscInt cone[])
81d71ae5a4SJacob Faibussowitsch {
8296ca5757SLisandro Dalcin   DMPolytopeType cellType;
8396ca5757SLisandro Dalcin 
8496ca5757SLisandro Dalcin   PetscFunctionBegin;
859566063dSJacob Faibussowitsch   PetscCall(DMPlexGetCellType(dm, cell, &cellType));
869566063dSJacob Faibussowitsch   PetscCall(DMPlexInvertCell(cellType, cone));
8796ca5757SLisandro Dalcin   PetscFunctionReturn(0);
88d9deefdfSMatthew G. Knepley }
89d9deefdfSMatthew G. Knepley 
9094ef8ddeSSatish Balay /*@C
91d9deefdfSMatthew G. Knepley   DMPlexTriangleSetOptions - Set the options used for the Triangle mesh generator
92d9deefdfSMatthew G. Knepley 
93d9deefdfSMatthew G. Knepley   Not Collective
94d9deefdfSMatthew G. Knepley 
95d9deefdfSMatthew G. Knepley   Inputs Parameters:
96*a1cb98faSBarry Smith + dm - The `DMPLEX` object
97d9deefdfSMatthew G. Knepley - opts - The command line options
98d9deefdfSMatthew G. Knepley 
99d9deefdfSMatthew G. Knepley   Level: developer
100d9deefdfSMatthew G. Knepley 
101*a1cb98faSBarry Smith .seealso: [](chapter_unstructured), `DM`, `DMPLEX`, `DMPlexTetgenSetOptions()`, `DMPlexGenerate()`
102d9deefdfSMatthew G. Knepley @*/
103d71ae5a4SJacob Faibussowitsch PetscErrorCode DMPlexTriangleSetOptions(DM dm, const char *opts)
104d71ae5a4SJacob Faibussowitsch {
105d9deefdfSMatthew G. Knepley   DM_Plex *mesh = (DM_Plex *)dm->data;
106d9deefdfSMatthew G. Knepley 
107d9deefdfSMatthew G. Knepley   PetscFunctionBegin;
108d9deefdfSMatthew G. Knepley   PetscValidHeaderSpecific(dm, DM_CLASSID, 1);
109dadcf809SJacob Faibussowitsch   PetscValidCharPointer(opts, 2);
1109566063dSJacob Faibussowitsch   PetscCall(PetscFree(mesh->triangleOpts));
1119566063dSJacob Faibussowitsch   PetscCall(PetscStrallocpy(opts, &mesh->triangleOpts));
112d9deefdfSMatthew G. Knepley   PetscFunctionReturn(0);
113d9deefdfSMatthew G. Knepley }
114d9deefdfSMatthew G. Knepley 
11594ef8ddeSSatish Balay /*@C
116d9deefdfSMatthew G. Knepley   DMPlexTetgenSetOptions - Set the options used for the Tetgen mesh generator
117d9deefdfSMatthew G. Knepley 
118d9deefdfSMatthew G. Knepley   Not Collective
119d9deefdfSMatthew G. Knepley 
120d9deefdfSMatthew G. Knepley   Inputs Parameters:
121*a1cb98faSBarry Smith + dm - The `DMPLEX` object
122d9deefdfSMatthew G. Knepley - opts - The command line options
123d9deefdfSMatthew G. Knepley 
124d9deefdfSMatthew G. Knepley   Level: developer
125d9deefdfSMatthew G. Knepley 
126*a1cb98faSBarry Smith .seealso: [](chapter_unstructured), `DM`, `DMPLEX`, `DMPlexTriangleSetOptions()`, `DMPlexGenerate()`
127d9deefdfSMatthew G. Knepley @*/
128d71ae5a4SJacob Faibussowitsch PetscErrorCode DMPlexTetgenSetOptions(DM dm, const char *opts)
129d71ae5a4SJacob Faibussowitsch {
130d9deefdfSMatthew G. Knepley   DM_Plex *mesh = (DM_Plex *)dm->data;
131d9deefdfSMatthew G. Knepley 
132d9deefdfSMatthew G. Knepley   PetscFunctionBegin;
133d9deefdfSMatthew G. Knepley   PetscValidHeaderSpecific(dm, DM_CLASSID, 1);
134dadcf809SJacob Faibussowitsch   PetscValidCharPointer(opts, 2);
1359566063dSJacob Faibussowitsch   PetscCall(PetscFree(mesh->tetgenOpts));
1369566063dSJacob Faibussowitsch   PetscCall(PetscStrallocpy(opts, &mesh->tetgenOpts));
137d9deefdfSMatthew G. Knepley   PetscFunctionReturn(0);
138d9deefdfSMatthew G. Knepley }
139d9deefdfSMatthew G. Knepley 
140d9deefdfSMatthew G. Knepley /*@C
141d9deefdfSMatthew G. Knepley   DMPlexGenerate - Generates a mesh.
142d9deefdfSMatthew G. Knepley 
143d9deefdfSMatthew G. Knepley   Not Collective
144d9deefdfSMatthew G. Knepley 
145d9deefdfSMatthew G. Knepley   Input Parameters:
146*a1cb98faSBarry Smith + boundary - The `DMPLEX` boundary object
147d9deefdfSMatthew G. Knepley . name - The mesh generation package name
148d9deefdfSMatthew G. Knepley - interpolate - Flag to create intermediate mesh elements
149d9deefdfSMatthew G. Knepley 
150d9deefdfSMatthew G. Knepley   Output Parameter:
151*a1cb98faSBarry Smith . mesh - The `DMPLEX` object
152d9deefdfSMatthew G. Knepley 
153*a1cb98faSBarry Smith   Options Database Keys:
1542c4dacf2SBarry Smith +  -dm_plex_generate <name> - package to generate mesh, for example, triangle, ctetgen or tetgen
155c0517cd5SMatthew G. Knepley -  -dm_generator <name> - package to generate mesh, for example, triangle, ctetgen or tetgen
1562c4dacf2SBarry Smith 
157d9deefdfSMatthew G. Knepley   Level: intermediate
158d9deefdfSMatthew G. Knepley 
159*a1cb98faSBarry Smith .seealso: [](chapter_unstructured), `DM`, `DMPLEX`, `DMPlexCreate()`, `DMRefine()`
160d9deefdfSMatthew G. Knepley @*/
161d71ae5a4SJacob Faibussowitsch PetscErrorCode DMPlexGenerate(DM boundary, const char name[], PetscBool interpolate, DM *mesh)
162d71ae5a4SJacob Faibussowitsch {
163c0517cd5SMatthew G. Knepley   DMGeneratorFunctionList fl;
1643f2a96e3SMatthew G. Knepley   char                    genname[PETSC_MAX_PATH_LEN];
1653f2a96e3SMatthew G. Knepley   const char             *suggestions;
166d9deefdfSMatthew G. Knepley   PetscInt                dim;
1673a074057SBarry Smith   PetscBool               flg;
168d9deefdfSMatthew G. Knepley 
169d9deefdfSMatthew G. Knepley   PetscFunctionBegin;
170d9deefdfSMatthew G. Knepley   PetscValidHeaderSpecific(boundary, DM_CLASSID, 1);
171064a246eSJacob Faibussowitsch   PetscValidLogicalCollectiveBool(boundary, interpolate, 3);
1729566063dSJacob Faibussowitsch   PetscCall(DMGetDimension(boundary, &dim));
1739566063dSJacob Faibussowitsch   PetscCall(PetscOptionsGetString(((PetscObject)boundary)->options, ((PetscObject)boundary)->prefix, "-dm_generator", genname, sizeof(genname), &flg));
174d9deefdfSMatthew G. Knepley   if (flg) name = genname;
1752c4dacf2SBarry Smith   else {
1769566063dSJacob Faibussowitsch     PetscCall(PetscOptionsGetString(((PetscObject)boundary)->options, ((PetscObject)boundary)->prefix, "-dm_plex_generate", genname, sizeof(genname), &flg));
1772c4dacf2SBarry Smith     if (flg) name = genname;
1782c4dacf2SBarry Smith   }
1793a074057SBarry Smith 
180c0517cd5SMatthew G. Knepley   fl = DMGenerateList;
181d9deefdfSMatthew G. Knepley   if (name) {
1823a074057SBarry Smith     while (fl) {
1839566063dSJacob Faibussowitsch       PetscCall(PetscStrcmp(fl->name, name, &flg));
1843a074057SBarry Smith       if (flg) {
1859566063dSJacob Faibussowitsch         PetscCall((*fl->generate)(boundary, interpolate, mesh));
1863a074057SBarry Smith         PetscFunctionReturn(0);
187d9deefdfSMatthew G. Knepley       }
1883a074057SBarry Smith       fl = fl->next;
189d9deefdfSMatthew G. Knepley     }
19098921bdaSJacob Faibussowitsch     SETERRQ(PETSC_COMM_SELF, PETSC_ERR_ARG_OUTOFRANGE, "Grid generator %s not registered; you may need to add --download-%s to your ./configure options", name, name);
1913a074057SBarry Smith   } else {
1923a074057SBarry Smith     while (fl) {
1933a074057SBarry Smith       if (boundary->dim == fl->dim) {
1949566063dSJacob Faibussowitsch         PetscCall((*fl->generate)(boundary, interpolate, mesh));
1953a074057SBarry Smith         PetscFunctionReturn(0);
1963a074057SBarry Smith       }
1973a074057SBarry Smith       fl = fl->next;
1983a074057SBarry Smith     }
1992c4dacf2SBarry Smith     suggestions = "";
2002c4dacf2SBarry Smith     if (boundary->dim + 1 == 2) suggestions = " You may need to add --download-triangle to your ./configure options";
2012c4dacf2SBarry Smith     else if (boundary->dim + 1 == 3) suggestions = " You may need to add --download-ctetgen or --download-tetgen in your ./configure options";
20263a3b9bcSJacob Faibussowitsch     SETERRQ(PETSC_COMM_SELF, PETSC_ERR_ARG_OUTOFRANGE, "No grid generator of dimension %" PetscInt_FMT " registered%s", boundary->dim + 1, suggestions);
2033a074057SBarry Smith   }
2043a074057SBarry Smith }
205