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)