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