26 #include "libmesh/libmesh_common.h" 27 #include "libmesh/fe.h" 28 #include "libmesh/fe_interface.h" 29 #include "libmesh/quadrature.h" 30 #include "libmesh/elem.h" 31 #include "libmesh/libmesh_logging.h" 32 #include "libmesh/tensor_value.h" 40 #define REINIT_ERROR(_dim, _type, _func) \ 42 void FE<_dim,_type>::_func(const Elem *, \ 45 const std::vector<Point> * const, \ 46 const std::vector<Real> * const) 48 #define SIDEMAP_ERROR(_dim, _type, _func) \ 50 void FE<_dim,_type>::_func(const Elem *, \ 53 const std::vector<Point> &, \ 56 #define FACE_EDGE_SHAPE_ERROR(_dim, _func) \ 58 void FEMap::_func<_dim>(const std::vector<Point> &, \ 61 libmesh_error_msg("ERROR: This method makes no sense for low-D elements!"); \ 65 #define LIBMESH_ERRORS_IN_LOW_D(_type) \ 66 REINIT_ERROR(0, _type, reinit) { libmesh_error_msg("ERROR: Cannot reinit 0D " #_type " elements!"); } \ 67 REINIT_ERROR(0, _type, edge_reinit) { libmesh_error_msg("ERROR: Cannot edge_reinit 0D " #_type " elements!"); } \ 68 SIDEMAP_ERROR(0, _type, side_map) { libmesh_error_msg("ERROR: Cannot side_map 0D " #_type " elements!"); } \ 69 SIDEMAP_ERROR(0, _type, edge_map) { libmesh_error_msg("ERROR: Cannot edge_map 0D " #_type " elements!"); } \ 70 REINIT_ERROR(1, _type, edge_reinit) { libmesh_error_msg("ERROR: Cannot edge_reinit 1D " #_type " elements!"); } \ 71 SIDEMAP_ERROR(1, _type, edge_map) { libmesh_error_msg("ERROR: Cannot edge_map 1D " #_type " elements!"); } 92 #ifdef LIBMESH_ENABLE_HIGHER_ORDER_SHAPES 108 template <
unsigned int Dim, FEFamily T>
110 const unsigned int s,
112 const std::vector<Point> *
const pts,
113 const std::vector<Real> *
const weights)
123 if (this->calculating_nothing())
125 this->calculations_started =
true;
132 this->_fe_map->add_calculations();
133 this->_fe_map->get_JxW();
134 this->_fe_map->get_xyz();
135 this->determine_calculations();
142 unsigned int side_p_level = elem->
p_level();
151 this->shapes_on_quadrature =
false;
154 this->_fe_map->template init_face_shape_functions<Dim>(*pts, side.get());
157 if (weights !=
nullptr)
159 this->_fe_map->compute_face_map (Dim, *weights, side.get());
163 std::vector<Real> dummy_weights (pts->size(), 1.);
164 this->_fe_map->compute_face_map (Dim, dummy_weights, side.get());
172 this->qrule->init(*side, side_p_level);
174 if (this->qrule->shapes_need_reinit())
175 this->shapes_on_quadrature =
false;
180 if ((this->get_type() != elem->
type()) ||
182 this->_elem != elem) ||
183 (side->type() != last_side) ||
184 (this->_elem_p_level != side_p_level) ||
185 this->shapes_need_reinit() ||
186 !this->shapes_on_quadrature)
190 this->_elem_type = elem->
type();
193 last_side = side->type();
196 this->_p_level = this->_add_p_level_in_reinit * side_p_level;
199 this->_fe_map->template init_face_shape_functions<Dim>(this->qrule->get_points(), side.get());
205 this->_fe_map->compute_face_map (Dim, this->qrule->get_weights(), side.get());
208 this->shapes_on_quadrature =
true;
212 const std::vector<Real> JxW_int(this->_fe_map->get_JxW());
215 bool shapes_on_quadrature_side = this->shapes_on_quadrature;
219 const std::vector<Point> * ref_qp;
223 ref_qp = &this->qrule->get_points();
225 std::vector<Point> qp;
226 this->side_map(elem, side.get(), s, *ref_qp, qp);
230 this->reinit (elem, &qp);
232 this->shapes_on_quadrature = shapes_on_quadrature_side;
234 this->_elem_p_level = side_p_level;
237 this->_fe_map->get_JxW() = JxW_int;
242 template <
unsigned int Dim, FEFamily T>
244 const unsigned int e,
246 const std::vector<Point> *
const pts,
247 const std::vector<Real> *
const weights)
252 libmesh_assert_not_equal_to (Dim, 1);
257 this->_fe_map->add_calculations();
258 this->_fe_map->get_JxW();
259 this->_fe_map->get_xyz();
260 this->determine_calculations();
270 this->shapes_on_quadrature =
false;
273 this->_fe_map->template init_edge_shape_functions<Dim> (*pts, edge.get());
276 if (weights !=
nullptr)
278 this->_fe_map->compute_edge_map (Dim, *weights, edge.get());
282 std::vector<Real> dummy_weights (pts->size(), 1.);
283 this->_fe_map->compute_edge_map (Dim, dummy_weights, edge.get());
291 this->qrule->init(*edge, elem->
p_level());
293 if (this->qrule->shapes_need_reinit())
294 this->shapes_on_quadrature =
false;
297 if ((this->get_type() != elem->
type()) ||
299 this->_elem != elem) ||
300 (edge->type() != last_edge) ||
301 this->shapes_need_reinit() ||
302 !this->shapes_on_quadrature)
306 this->_elem_type = elem->
type();
309 last_edge = edge->type();
312 this->_fe_map->template init_edge_shape_functions<Dim> (this->qrule->get_points(), edge.get());
318 this->_fe_map->compute_edge_map (Dim, this->qrule->get_weights(), edge.get());
321 this->shapes_on_quadrature =
true;
325 const std::vector<Real> JxW_int(this->_fe_map->get_JxW());
329 const std::vector<Point> * ref_qp;
333 ref_qp = & this->qrule->get_points();
335 std::vector<Point> qp;
336 this->edge_map(elem, edge.get(), e, *ref_qp, qp);
340 this->reinit (elem, &qp);
343 this->_fe_map->get_JxW() = JxW_int;
346 template <
unsigned int Dim, FEFamily T>
349 const unsigned int s,
350 const std::vector<Point> & reference_side_points,
351 std::vector<Point> & reference_points)
354 this->calculate_phi =
true;
355 this->determine_calculations();
357 unsigned int side_p_level = elem->
p_level();
361 if (side->
type() != last_side ||
363 this->_elem != elem) ||
364 side_p_level != this->_elem_p_level ||
365 !this->shapes_on_quadrature)
369 this->_elem_type = elem->
type();
370 this->_elem_p_level = side_p_level;
371 this->_p_level = this->_add_p_level_in_reinit * side_p_level;
374 last_side = side->
type();
377 this->_fe_map->template init_face_shape_functions<Dim>(reference_side_points, side);
382 const unsigned int n_points =
383 cast_int<unsigned int>(reference_side_points.size());
384 reference_points.resize(n_points);
385 for (
unsigned int i = 0; i < n_points; i++)
386 reference_points[i].
zero();
388 std::vector<Point> refspace_nodes;
389 this->get_refspace_nodes(elem->
type(), refspace_nodes);
391 const std::vector<std::vector<Real>> & psi_map = this->_fe_map->get_psi();
397 for (
unsigned int p=0; p<n_points; p++)
398 reference_points[p].add_scaled (side_node, psi_map[i][p]);
402 template <
unsigned int Dim, FEFamily T>
405 const unsigned int e,
406 const std::vector<Point> & reference_edge_points,
407 std::vector<Point> & reference_points)
410 this->calculate_phi =
true;
411 this->determine_calculations();
413 unsigned int edge_p_level = elem->
p_level();
415 if (edge->
type() != last_edge ||
417 this->_elem != elem) ||
418 edge_p_level != this->_elem_p_level ||
419 !this->shapes_on_quadrature)
423 this->_elem_type = elem->
type();
424 this->_elem_p_level = edge_p_level;
425 this->_p_level = this->_add_p_level_in_reinit * edge_p_level;
428 last_edge = edge->
type();
431 this->_fe_map->template init_edge_shape_functions<Dim>(reference_edge_points, edge);
436 const unsigned int n_points =
437 cast_int<unsigned int>(reference_edge_points.size());
438 reference_points.resize(n_points);
439 for (
unsigned int i = 0; i < n_points; i++)
440 reference_points[i].
zero();
442 std::vector<Point> refspace_nodes;
443 this->get_refspace_nodes(elem->
type(), refspace_nodes);
445 const std::vector<std::vector<Real>> & psi_map = this->_fe_map->get_psi();
451 for (
unsigned int p=0; p<n_points; p++)
452 reference_points[p].add_scaled (edge_node, psi_map[i][p]);
457 template<
unsigned int Dim>
462 LOG_SCOPE(
"init_face_shape_functions()",
"FEMap");
475 const unsigned int n_qp = cast_int<unsigned int>(qp.size());
478 const unsigned int n_mapping_shape_functions =
484 this->
psi_map.resize (n_mapping_shape_functions);
489 this->
dpsidxi_map.resize (n_mapping_shape_functions);
490 #ifdef LIBMESH_ENABLE_SECOND_DERIVATIVES 500 #ifdef LIBMESH_ENABLE_SECOND_DERIVATIVES 515 #ifdef LIBMESH_ENABLE_SECOND_DERIVATIVES 520 for (
unsigned int i=0; i<n_mapping_shape_functions; i++)
525 this->
psi_map[i].resize (n_qp);
530 #ifdef LIBMESH_ENABLE_SECOND_DERIVATIVES 539 #ifdef LIBMESH_ENABLE_SECOND_DERIVATIVES 551 for (
unsigned int p=0; p<n_qp; p++)
559 #ifdef LIBMESH_ENABLE_SECOND_DERIVATIVES 573 #ifdef LIBMESH_ENABLE_SECOND_DERIVATIVES 585 template<
unsigned int Dim>
590 LOG_SCOPE(
"init_edge_shape_functions()",
"FEMap");
603 const unsigned int n_qp = cast_int<unsigned int>(qp.size());
606 const unsigned int n_mapping_shape_functions =
612 this->
psi_map.resize (n_mapping_shape_functions);
614 this->
dpsidxi_map.resize (n_mapping_shape_functions);
615 #ifdef LIBMESH_ENABLE_SECOND_DERIVATIVES 626 #ifdef LIBMESH_ENABLE_SECOND_DERIVATIVES 629 #endif // LIBMESH_ENABLE_SECOND_DERIVATIVES 631 for (
unsigned int i=0; i<n_mapping_shape_functions; i++)
636 this->
psi_map[i].resize (n_qp);
639 #ifdef LIBMESH_ENABLE_SECOND_DERIVATIVES 646 for (
unsigned int p=0; p<n_qp; p++)
652 #ifdef LIBMESH_ENABLE_SECOND_DERIVATIVES 670 LOG_SCOPE(
"compute_face_map()",
"FEMap");
673 const unsigned int n_qp = cast_int<unsigned int>(qw.size());
680 const unsigned int n_mapping_shape_functions =
694 this->
xyz.resize(n_qp);
699 this->
JxW.resize(n_qp);
720 libmesh_assert_equal_to (side->
node_id(0),
730 libmesh_assert_equal_to (this->
psi_map.size(), 1);
733 for (
unsigned int p=0; p<n_qp; p++)
743 this->
JxW[p] = 1.0*qw[p];
759 this->
xyz.resize(n_qp);
766 this->
JxW.resize(n_qp);
769 #ifdef LIBMESH_ENABLE_SECOND_DERIVATIVES 780 for (
unsigned int p=0; p<n_qp; p++)
786 this->
tangents[p].resize(LIBMESH_DIM-1);
789 #ifdef LIBMESH_ENABLE_SECOND_DERIVATIVES 796 for (
unsigned int i=0; i<n_mapping_shape_functions; i++)
800 for (
unsigned int p=0; p<n_qp; p++)
803 this->
xyz[p].add_scaled (side_point, this->
psi_map[i][p]);
806 #ifdef LIBMESH_ENABLE_SECOND_DERIVATIVES 816 for (
unsigned int p=0; p<n_qp; p++)
826 #elif LIBMESH_DIM == 3 849 #ifdef LIBMESH_ENABLE_SECOND_DERIVATIVES 863 libmesh_assert_not_equal_to (denominator, 0);
870 for (
unsigned int p=0; p<n_qp; p++)
874 libmesh_assert_greater (the_jac, 0.);
876 this->
JxW[p] = the_jac*qw[p];
892 this->
xyz.resize(n_qp);
899 this->
JxW.resize(n_qp);
901 #ifdef LIBMESH_ENABLE_SECOND_DERIVATIVES 913 for (
unsigned int p=0; p<n_qp; p++)
919 this->
tangents[p].resize(LIBMESH_DIM-1);
923 #ifdef LIBMESH_ENABLE_SECOND_DERIVATIVES 934 for (
unsigned int i=0; i<n_mapping_shape_functions; i++)
938 for (
unsigned int p=0; p<n_qp; p++)
941 this->
xyz[p].add_scaled (side_point, this->
psi_map[i][p]);
947 #ifdef LIBMESH_ENABLE_SECOND_DERIVATIVES 961 for (
unsigned int p=0; p<n_qp; p++)
968 #ifdef LIBMESH_ENABLE_SECOND_DERIVATIVES 982 const Real G = this->dxyzdeta_map[p].norm_sq();
984 const Real numerator = E*N -2.*F*M + G*L;
985 const Real denominator = E*G - F*F;
986 libmesh_assert_not_equal_to (denominator, 0.);
994 for (
unsigned int p=0; p<n_qp; p++)
1004 const Real g21 = g12;
1011 const Real the_jac = std::sqrt(g11*g22 - g12*g21);
1013 libmesh_assert_greater (the_jac, 0.);
1015 this->
JxW[p] = the_jac*qw[p];
1025 libmesh_error_msg(
"Invalid dimension dim = " <<
dim);
1033 const std::vector<Real> & qw,
1047 libmesh_assert_equal_to (
dim, 3);
1049 LOG_SCOPE(
"compute_edge_map()",
"FEMap");
1055 const unsigned int n_qp = cast_int<unsigned int>(qw.size());
1059 this->
xyz.resize(n_qp);
1066 this->
JxW.resize(n_qp);
1068 #ifdef LIBMESH_ENABLE_SECOND_DERIVATIVES 1079 for (
unsigned int p=0; p<n_qp; p++)
1082 this->
xyz[p].zero();
1089 #ifdef LIBMESH_ENABLE_SECOND_DERIVATIVES 1100 for (
unsigned int i=0,
1101 psi_map_size=cast_int<unsigned int>(
psi_map.size());
1102 i != psi_map_size; i++)
1106 for (
unsigned int p=0; p<n_qp; p++)
1109 this->
xyz[p].add_scaled (edge_point, this->
psi_map[i][p]);
1112 #ifdef LIBMESH_ENABLE_SECOND_DERIVATIVES 1122 for (
unsigned int p=0; p<n_qp; p++)
1132 libmesh_assert_greater (the_jac, 0.);
1134 this->
JxW[p] = the_jac*qw[p];
1140 FACE_EDGE_SHAPE_ERROR(0,init_face_shape_functions)
1141 template LIBMESH_EXPORT
void FEMap::init_face_shape_functions<1>(
const std::vector<Point> &,
const Elem *);
1142 template LIBMESH_EXPORT
void FEMap::init_face_shape_functions<2>(
const std::vector<Point> &,
const Elem *);
1143 template LIBMESH_EXPORT
void FEMap::init_face_shape_functions<3>(
const std::vector<Point> &,
const Elem *);
1145 FACE_EDGE_SHAPE_ERROR(0,init_edge_shape_functions)
1146 template LIBMESH_EXPORT
void FEMap::init_edge_shape_functions<1>(
const std::vector<Point> &,
const Elem *);
1147 template LIBMESH_EXPORT
void FEMap::init_edge_shape_functions<2>(
const std::vector<Point> &,
const Elem *);
1148 template LIBMESH_EXPORT
void FEMap::init_edge_shape_functions<3>(
const std::vector<Point> &,
const Elem *);
1152 #define REINIT_AND_SIDE_MAPS(_type) \ 1153 template LIBMESH_EXPORT void FE<1,_type>::reinit(Elem const *, unsigned int, Real, const std::vector<Point> * const, const std::vector<Real> * const); \ 1154 template LIBMESH_EXPORT void FE<1,_type>::side_map(Elem const *, Elem const *, const unsigned int, const std::vector<Point> &, std::vector<Point> &); \ 1155 template LIBMESH_EXPORT void FE<2,_type>::reinit(Elem const *, unsigned int, Real, const std::vector<Point> * const, const std::vector<Real> * const); \ 1156 template LIBMESH_EXPORT void FE<2,_type>::side_map(Elem const *, Elem const *, const unsigned int, const std::vector<Point> &, std::vector<Point> &); \ 1157 template LIBMESH_EXPORT void FE<2,_type>::edge_map(Elem const *, Elem const *, const unsigned int, const std::vector<Point> &, std::vector<Point> &); \ 1158 template LIBMESH_EXPORT void FE<2,_type>::edge_reinit(Elem const *, unsigned int, Real, const std::vector<Point> * const, const std::vector<Real> * const); \ 1159 template LIBMESH_EXPORT void FE<3,_type>::reinit(Elem const *, unsigned int, Real, const std::vector<Point> * const, const std::vector<Real> * const); \ 1160 template LIBMESH_EXPORT void FE<3,_type>::side_map(Elem const *, Elem const *, const unsigned int, const std::vector<Point> &, std::vector<Point> &); \ 1161 template LIBMESH_EXPORT void FE<3,_type>::edge_map(Elem const *, Elem const *, const unsigned int, const std::vector<Point> &, std::vector<Point> &); \ 1162 template LIBMESH_EXPORT void FE<3,_type>::edge_reinit(Elem const *, unsigned int, Real, const std::vector<Point> * const, const std::vector<Real> * const) 1173 REINIT_AND_SIDE_MAPS(
CLOUGH);
1174 REINIT_AND_SIDE_MAPS(
HERMITE);
1177 REINIT_AND_SIDE_MAPS(
SCALAR);
1178 REINIT_AND_SIDE_MAPS(
XYZ);
1180 #ifdef LIBMESH_ENABLE_HIGHER_ORDER_SHAPES 1182 REINIT_AND_SIDE_MAPS(
SZABAB);
Real(* shape_deriv_ptr)(const FEType fet, const Elem *elem, const unsigned int i, const unsigned int j, const Point &p, const bool add_p_level)
Typedef for pointer to a function that returns FE shape function derivative values.
class FEType hides (possibly multiple) FEFamily and approximation orders, thereby enabling specialize...
void init_edge_shape_functions(const std::vector< Point > &qp, const Elem *edge)
Same as before, but for an edge.
Real dzdeta_map(const unsigned int p) const
Used in FEMap::compute_map(), which should be be usable in derived classes, and therefore protected...
std::vector< std::vector< Real > > dpsideta_map
Map for the derivative of the side function, d(psi)/d(eta).
std::vector< std::vector< Real > > psi_map
Map for the side shape functions, psi.
Order
defines an enum for polynomial orders.
std::vector< std::vector< Real > > d2psideta2_map
Map for the second derivatives (in eta) of the side shape functions.
virtual void side_map(const Elem *elem, const Elem *side, const unsigned int s, const std::vector< Point > &reference_side_points, std::vector< Point > &reference_points) override
Computes the reference space quadrature points on the side of an element based on the side quadrature...
static shape_ptr shape_function(const unsigned int dim, const FEType &fe_t, const ElemType t)
const Elem * interior_parent() const
bool calculate_dxyz
Should we calculate mapping gradients?
virtual std::unique_ptr< Elem > build_side_ptr(const unsigned int i)=0
void compute_edge_map(int dim, const std::vector< Real > &qw, const Elem *side)
Same as before, but for an edge.
static Point inverse_map(const unsigned int dim, const Elem *elem, const Point &p, const Real tolerance=TOLERANCE, const bool secure=true, const bool extra_checks=true)
virtual bool runtime_topology() const
Real dxdeta_map(const unsigned int p) const
Used in FEMap::compute_map(), which should be be usable in derived classes, and therefore protected...
Real dzdxi_map(const unsigned int p) const
Used in FEMap::compute_map(), which should be be usable in derived classes, and therefore protected...
This is the base class from which all geometric element types are derived.
unsigned int p_level() const
The libMesh namespace provides an interface to certain functionality in the library.
std::vector< std::vector< Real > > d2psidxideta_map
Map for the second (cross) derivatives in xi, eta of the side shape functions.
std::vector< RealGradient > d2xyzdxideta_map
Vector of mixed second partial derivatives in xi-eta: d^2(x)/d(xi)d(eta) d^2(y)/d(xi)d(eta) d^2(z)/d(...
virtual void reinit(const Elem *elem, const std::vector< Point > *const pts=nullptr, const std::vector< Real > *const weights=nullptr) override
This is at the core of this class.
std::vector< RealGradient > dxyzdxi_map
Vector of partial derivatives: d(x)/d(xi), d(y)/d(xi), d(z)/d(xi)
TypeVector< T > unit() const
std::vector< RealGradient > d2xyzdeta2_map
Vector of second partial derivatives in eta: d^2(x)/d(eta)^2.
REINIT_ERROR(1, RAVIART_THOMAS, reinit)
SIDEMAP_ERROR(1, NEDELEC_ONE, side_map)
static unsigned int n_shape_functions(const unsigned int dim, const FEType &fe_t, const ElemType t)
std::vector< RealGradient > d2xyzdxi2_map
Vector of second partial derivatives in xi: d^2(x)/d(xi)^2, d^2(y)/d(xi)^2, d^2(z)/d(xi)^2.
virtual unsigned int local_side_node(unsigned int side, unsigned int side_node) const =0
LIBMESH_ERRORS_IN_LOW_D(CLOUGH)
bool calculate_d2xyz
Should we calculate mapping hessians?
virtual unsigned int local_edge_node(unsigned int edge, unsigned int edge_node) const =0
Similar to Elem::local_side_node(), but instead of a side id, takes an edge id and a node id on that ...
bool calculate_xyz
Should we calculate physical point locations?
TypeVector< typename CompareTypes< T, T2 >::supertype > cross(const TypeVector< T2 > &v) const
std::vector< Real > curvatures
The mean curvature (= one half the sum of the principal curvatures) on the boundary at the quadrature...
std::vector< std::vector< Real > > d2psidxi2_map
Map for the second derivatives (in xi) of the side shape functions.
static shape_deriv_ptr shape_deriv_function(const unsigned int dim, const FEType &fe_t, const ElemType t)
std::vector< Real > JxW
Jacobian*Weight values at quadrature points.
std::vector< Point > normals
Normal vectors on boundary at quadrature points.
std::vector< Point > xyz
The spatial locations of the quadrature points.
const Elem * neighbor_ptr(unsigned int i) const
Real(* shape_ptr)(const FEType fe_t, const Elem *elem, const unsigned int i, const Point &p, const bool add_p_level)
Typedef for pointer to a function that returns FE shape function values.
DIE A HORRIBLE DEATH HERE typedef LIBMESH_DEFAULT_SCALAR_TYPE Real
Real dydeta_map(const unsigned int p) const
Used in FEMap::compute_map(), which should be be usable in derived classes, and therefore protected...
static shape_second_deriv_ptr shape_second_deriv_function(const unsigned int dim, const FEType &fe_t, const ElemType t)
virtual void edge_map(const Elem *elem, const Elem *edge, const unsigned int e, const std::vector< Point > &reference_edge_points, std::vector< Point > &reference_points)
Computes the reference space quadrature points on the side of an element based on the edge quadrature...
std::vector< std::vector< Real > > dpsidxi_map
Map for the derivative of the side functions, d(psi)/d(xi).
std::vector< std::vector< Point > > tangents
Tangent vectors on boundary at quadrature points.
std::vector< RealGradient > dxyzdeta_map
Vector of partial derivatives: d(x)/d(eta), d(y)/d(eta), d(z)/d(eta)
static Point map_deriv(const unsigned int dim, const Elem *elem, const unsigned int j, const Point &reference_point)
Real(* shape_second_deriv_ptr)(const FEType fet, const Elem *elem, const unsigned int i, const unsigned int j, const Point &p, const bool add_p_level)
Typedef for pointer to a function that returns FE shape function second derivative values...
Real dxdxi_map(const unsigned int p) const
Used in FEMap::compute_map(), which should be be usable in derived classes, and therefore protected...
void determine_calculations()
Determine which values are to be calculated.
Real dydxi_map(const unsigned int p) const
Used in FEMap::compute_map(), which should be be usable in derived classes, and therefore protected...
virtual void compute_face_map(int dim, const std::vector< Real > &qw, const Elem *side)
Same as compute_map, but for a side.
FEFamily
defines an enum for finite element families.
virtual std::unique_ptr< Elem > build_edge_ptr(const unsigned int i)=0
virtual Order default_order() const =0
virtual void edge_reinit(const Elem *elem, const unsigned int edge, const Real tolerance=TOLERANCE, const std::vector< Point > *const pts=nullptr, const std::vector< Real > *const weights=nullptr) override
Reinitializes all the physical element-dependent data based on the edge.
virtual ElemType type() const =0
A Point defines a location in LIBMESH_DIM dimensional Real space.
dof_id_type node_id(const unsigned int i) const
const Point & point(const unsigned int i) const
auto index_range(const T &sizable)
Helper function that returns an IntRange<std::size_t> representing all the indices of the passed-in v...
void init_face_shape_functions(const std::vector< Point > &qp, const Elem *side)
Initializes the reference to physical element map for a side.
static FEFamily map_fe_type(const Elem &elem)