21#include <unordered_map>
42 POINT = 0, SEGMENT, TRIANGLE, SQUARE, TETRAHEDRON,
CUBE, PRISM, PYRAMID,
46 static const int NumGeom = NUM_GEOMETRIES;
47 static const int MaxDim = 3;
48 static const int NumBdrArray[NumGeom];
49 static const char *Name[NumGeom];
51 static const int Dimension[NumGeom];
52 static const int DimStart[MaxDim+2];
53 static const int NumVerts[NumGeom];
54 static const int NumEdges[NumGeom];
55 static const int NumFaces[NumGeom];
76 {
return GeomCenter[GeomType]; }
103 {
return *GeomToPerfGeomJac[GeomType]; }
105 {
return PerfGeomToGeomJac[GeomType]; }
106 void GetPerfPointMat(
int GeomType,
DenseMatrix &pm)
const;
107 void JacToPerfJac(
int GeomType,
const DenseMatrix &J,
113 {
return geom == SEGMENT || geom == SQUARE || geom == CUBE; }
121 case 0:
return POINT;
122 case 1:
return SEGMENT;
123 case 2:
return SQUARE;
125 default: MFEM_ABORT(
"Invalid dimension.");
return INVALID;
130 static int GetInverseOrientation(Type geom_type,
int orientation);
133 int NumBdr(
int GeomType)
const {
return NumBdrArray[GeomType]; }
142 static const int Dimension = 0;
143 static const int NumVert = 1;
145 static const int NumOrient = 1;
146 static const int Orient[NumOrient][NumVert];
147 static const int InvOrient[NumOrient];
156 static const int Dimension = 1;
157 static const int NumVert = 2;
158 static const int NumEdges = 1;
159 static const int Edges[NumEdges][2];
161 static const int NumOrient = 2;
162 static const int Orient[NumOrient][NumVert];
163 static const int InvOrient[NumOrient];
172 static const int Dimension = 2;
173 static const int NumVert = 3;
174 static const int NumEdges = 3;
175 static const int Edges[NumEdges][2];
179 static const int I[NumVert];
180 static const int J[NumEdges][2];
182 static const int NumFaces = 1;
183 static const int FaceVert[NumFaces][NumVert];
190 static const int NumOrient = 6;
191 static const int Orient[NumOrient][NumVert];
193 static const int InvOrient[NumOrient];
202 static const int Dimension = 2;
203 static const int NumVert = 4;
204 static const int NumEdges = 4;
205 static const int Edges[NumEdges][2];
209 static const int I[NumVert];
210 static const int J[NumEdges][2];
212 static const int NumFaces = 1;
213 static const int FaceVert[NumFaces][NumVert];
215 static const int NumOrient = 8;
216 static const int Orient[NumOrient][NumVert];
217 static const int InvOrient[NumOrient];
226 static const int Dimension = 3;
227 static const int NumVert = 4;
228 static const int NumEdges = 6;
229 static const int Edges[NumEdges][2];
230 static const int NumFaces = 4;
231 static const int FaceTypes[NumFaces];
232 static const int MaxFaceVert = 3;
233 static const int FaceVert[NumFaces][MaxFaceVert];
237 static const int I[NumVert];
238 static const int J[NumEdges][2];
241 static const int NumOrient = 24;
242 static const int Orient[NumOrient][NumVert];
243 static const int InvOrient[NumOrient];
252 static const int Dimension = 3;
253 static const int NumVert = 8;
254 static const int NumEdges = 12;
255 static const int Edges[NumEdges][2];
256 static const int NumFaces = 6;
257 static const int FaceTypes[NumFaces];
258 static const int MaxFaceVert = 4;
259 static const int FaceVert[NumFaces][MaxFaceVert];
263 static const int I[NumVert];
264 static const int J[NumEdges][2];
274 static const int Dimension = 3;
275 static const int NumVert = 6;
276 static const int NumEdges = 9;
277 static const int Edges[NumEdges][2];
278 static const int NumFaces = 5;
279 static const int FaceTypes[NumFaces];
280 static const int MaxFaceVert = 4;
281 static const int FaceVert[NumFaces][MaxFaceVert];
285 static const int I[NumVert];
286 static const int J[NumEdges][2];
296 static const int Dimension = 3;
297 static const int NumVert = 5;
298 static const int NumEdges = 8;
299 static const int Edges[NumEdges][2];
300 static const int NumFaces = 5;
301 static const int FaceTypes[NumFaces];
302 static const int MaxFaceVert = 4;
303 static const int FaceVert[NumFaces][MaxFaceVert];
307 static const int I[NumVert];
308 static const int J[NumEdges][2];
338 std::unordered_map<std::array<int, 3>, std::unique_ptr<IntegrationRule>,
Data type dense matrix using column-major storage.
RefinedGeometry * Refine(Geometry::Type Geom, int Times, int ETimes=1)
int GetType() const
Get the Quadrature1D type of points used for subdivision.
void SetType(int t)
Set the Quadrature1D type of points to use for subdivision.
const IntegrationRule * RefineInterior(Geometry::Type Geom, int Times)
const IntegrationRule * EdgeScan(Geometry::Type Geom, int NPts1d)
Get an integration rule which scans along the r/s/t=0 edges of the element.
static int GetRefinementLevelFromElems(Geometry::Type geom, int Npts)
Get the Refinement level based on number of elements.
static int GetRefinementLevelFromPoints(Geometry::Type Geom, int Npts)
Get the Refinement level based on number of points.
GeometryRefiner(int t=Quadrature1D::ClosedUniform)
const IntegrationPoint & GetCenter(int GeomType) const
Return the center of the given Geometry::Type, GeomType.
static bool IsTensorProduct(Type geom)
int NumBdr(int GeomType) const
Return the number of boundary "faces" of a given Geometry::Type.
const DenseMatrix * GetPerfGeomToGeomJac(int GeomType) const
static Type TensorProductGeometry(int dim)
const DenseMatrix & GetGeomToPerfGeomJac(int GeomType) const
Class for integration point with weight.
Class for an integration rule - an Array of IntegrationPoint.
@ ClosedUniform
aka closed Newton-Cotes
RefinedGeometry(int NPts, int NRefG, int NRefE, int NBdrE=0)
real_t Volume()
Analytic volume integral over subdomain with positive level-set.
GeometryRefiner GlobGeometryRefiner
Helper class for hashing std::array. Usable in place of std::hash<std::array<T,N>>