Go to the documentation of this file.
21 #include "libmesh/fe_interface.h"
22 #include "libmesh/elem.h"
23 #include "libmesh/fe.h"
24 #include "libmesh/fe_compute_data.h"
25 #include "libmesh/dof_map.h"
26 #include "libmesh/enum_fe_family.h"
27 #include "libmesh/enum_order.h"
28 #include "libmesh/enum_elem_type.h"
29 #include "libmesh/enum_to_string.h"
38 libmesh_error_msg(
"ERROR: Do not define an object of this type.");
43 #ifndef LIBMESH_ENABLE_INFINITE_ELEMENTS
78 #endif //ifndef LIBMESH_ENABLE_INFINITE_ELEMENTS
82 #ifdef LIBMESH_ENABLE_HIGHER_ORDER_SHAPES
83 #define fe_family_switch(dim, func_and_args, prefix, suffix) \
85 switch (fe_t.family) \
88 prefix FE<dim,CLOUGH>::func_and_args suffix \
90 prefix FE<dim,HERMITE>::func_and_args suffix \
92 prefix FE<dim,HIERARCHIC>::func_and_args suffix \
94 prefix FE<dim,L2_HIERARCHIC>::func_and_args suffix \
96 prefix FE<dim,LAGRANGE>::func_and_args suffix \
98 prefix FE<dim,L2_LAGRANGE>::func_and_args suffix \
100 prefix FE<dim,MONOMIAL>::func_and_args suffix \
102 prefix FE<dim,SCALAR>::func_and_args suffix \
104 prefix FE<dim,BERNSTEIN>::func_and_args suffix \
106 prefix FE<dim,SZABAB>::func_and_args suffix \
107 case RATIONAL_BERNSTEIN: \
108 prefix FE<dim,RATIONAL_BERNSTEIN>::func_and_args suffix \
110 prefix FEXYZ<dim>::func_and_args suffix \
112 libmesh_assert_equal_to (dim, 2); \
113 prefix FE<2,SUBDIVISION>::func_and_args suffix \
115 libmesh_error_msg("Unsupported family = " << fe_t.family); \
119 #define fe_family_with_vec_switch(dim, func_and_args, prefix, suffix) \
121 switch (fe_t.family) \
124 prefix FE<dim,CLOUGH>::func_and_args suffix \
126 prefix FE<dim,HERMITE>::func_and_args suffix \
128 prefix FE<dim,HIERARCHIC>::func_and_args suffix \
129 case L2_HIERARCHIC: \
130 prefix FE<dim,L2_HIERARCHIC>::func_and_args suffix \
132 prefix FE<dim,LAGRANGE>::func_and_args suffix \
134 prefix FELagrangeVec<dim>::func_and_args suffix \
136 prefix FE<dim,L2_LAGRANGE>::func_and_args suffix \
138 prefix FE<dim,MONOMIAL>::func_and_args suffix \
140 prefix FEMonomialVec<dim>::func_and_args suffix \
142 prefix FE<dim,SCALAR>::func_and_args suffix \
144 prefix FE<dim,BERNSTEIN>::func_and_args suffix \
146 prefix FE<dim,SZABAB>::func_and_args suffix \
147 case RATIONAL_BERNSTEIN: \
148 prefix FE<dim,RATIONAL_BERNSTEIN>::func_and_args suffix \
150 prefix FEXYZ<dim>::func_and_args suffix \
152 libmesh_assert_equal_to (dim, 2); \
153 prefix FE<2,SUBDIVISION>::func_and_args suffix \
155 prefix FENedelecOne<dim>::func_and_args suffix \
157 libmesh_error_msg("Unsupported family = " << fe_t.family); \
161 #define fe_scalar_vec_error_switch(dim, func_and_args, prefix, suffix) \
163 switch (fe_t.family) \
166 prefix FE<dim,CLOUGH>::func_and_args suffix \
168 prefix FE<dim,HERMITE>::func_and_args suffix \
170 prefix FE<dim,HIERARCHIC>::func_and_args suffix \
171 case L2_HIERARCHIC: \
172 prefix FE<dim,L2_HIERARCHIC>::func_and_args suffix \
174 prefix FE<dim,LAGRANGE>::func_and_args suffix \
176 prefix FE<dim,L2_LAGRANGE>::func_and_args suffix \
178 prefix FE<dim,MONOMIAL>::func_and_args suffix \
180 prefix FE<dim,SCALAR>::func_and_args suffix \
182 prefix FE<dim,BERNSTEIN>::func_and_args suffix \
183 case RATIONAL_BERNSTEIN: \
184 prefix FE<dim,RATIONAL_BERNSTEIN>::func_and_args suffix \
186 prefix FE<dim,SZABAB>::func_and_args suffix \
188 prefix FEXYZ<dim>::func_and_args suffix \
190 libmesh_assert_equal_to (dim, 2); \
191 prefix FE<2,SUBDIVISION>::func_and_args suffix \
195 libmesh_error_msg("Error: Can only request scalar valued elements for Real FEInterface::func_and_args"); \
197 libmesh_error_msg("Unsupported family = " << fe_t.family); \
202 #define fe_vector_scalar_error_switch(dim, func_and_args, prefix, suffix) \
204 switch (fe_t.family) \
207 prefix FELagrangeVec<dim>::func_and_args suffix \
209 prefix FENedelecOne<dim>::func_and_args suffix \
211 prefix FEMonomialVec<dim>::func_and_args suffix \
214 case L2_HIERARCHIC: \
221 case RATIONAL_BERNSTEIN: \
224 libmesh_error_msg("Error: Can only request vector valued elements for RealGradient FEInterface::shape"); \
226 libmesh_error_msg("Unsupported family = " << fe_t.family); \
231 #define fe_family_switch(dim, func_and_args, prefix, suffix) \
233 switch (fe_t.family) \
236 prefix FE<dim,CLOUGH>::func_and_args suffix \
238 prefix FE<dim,HERMITE>::func_and_args suffix \
240 prefix FE<dim,HIERARCHIC>::func_and_args suffix \
241 case L2_HIERARCHIC: \
242 prefix FE<dim,L2_HIERARCHIC>::func_and_args suffix \
244 prefix FE<dim,LAGRANGE>::func_and_args suffix \
246 prefix FE<dim,L2_LAGRANGE>::func_and_args suffix \
248 prefix FE<dim,MONOMIAL>::func_and_args suffix \
250 prefix FE<dim,SCALAR>::func_and_args suffix \
252 prefix FEXYZ<dim>::func_and_args suffix \
254 libmesh_assert_equal_to (dim, 2); \
255 prefix FE<2,SUBDIVISION>::func_and_args suffix \
257 libmesh_error_msg("Unsupported family = " << fe_t.family); \
261 #define fe_family_with_vec_switch(dim, func_and_args, prefix, suffix) \
263 switch (fe_t.family) \
266 prefix FE<dim,CLOUGH>::func_and_args suffix \
268 prefix FE<dim,HERMITE>::func_and_args suffix \
270 prefix FE<dim,HIERARCHIC>::func_and_args suffix \
271 case L2_HIERARCHIC: \
272 prefix FE<dim,L2_HIERARCHIC>::func_and_args suffix \
274 prefix FE<dim,LAGRANGE>::func_and_args suffix \
276 prefix FELagrangeVec<dim>::func_and_args suffix \
278 prefix FE<dim,L2_LAGRANGE>::func_and_args suffix \
280 prefix FE<dim,MONOMIAL>::func_and_args suffix \
282 prefix FEMonomialVec<dim>::func_and_args suffix \
284 prefix FE<dim,SCALAR>::func_and_args suffix \
286 prefix FEXYZ<dim>::func_and_args suffix \
288 libmesh_assert_equal_to (dim, 2); \
289 prefix FE<2,SUBDIVISION>::func_and_args suffix \
291 prefix FENedelecOne<dim>::func_and_args suffix \
293 libmesh_error_msg("Unsupported family = " << fe_t.family); \
297 #define fe_scalar_vec_error_switch(dim, func_and_args, prefix, suffix) \
299 switch (fe_t.family) \
302 prefix FE<dim,CLOUGH>::func_and_args suffix \
304 prefix FE<dim,HERMITE>::func_and_args suffix \
306 prefix FE<dim,HIERARCHIC>::func_and_args suffix \
307 case L2_HIERARCHIC: \
308 prefix FE<dim,L2_HIERARCHIC>::func_and_args suffix \
310 prefix FE<dim,LAGRANGE>::func_and_args suffix \
312 prefix FE<dim,L2_LAGRANGE>::func_and_args suffix \
314 prefix FE<dim,MONOMIAL>::func_and_args suffix \
316 prefix FE<dim,SCALAR>::func_and_args suffix \
318 prefix FEXYZ<dim>::func_and_args suffix \
320 libmesh_assert_equal_to (dim, 2); \
321 prefix FE<2,SUBDIVISION>::func_and_args suffix \
325 libmesh_error_msg("Error: Can only request scalar valued elements for Real FEInterface::func_and_args"); \
327 libmesh_error_msg("Unsupported family = " << fe_t.family); \
332 #define fe_vector_scalar_error_switch(dim, func_and_args, prefix, suffix) \
334 switch (fe_t.family) \
337 prefix FELagrangeVec<dim>::func_and_args suffix \
339 prefix FENedelecOne<dim>::func_and_args suffix \
341 prefix FEMonomialVec<dim>::func_and_args suffix \
344 case L2_HIERARCHIC: \
351 libmesh_error_msg("Error: Can only request vector valued elements for RealGradient FEInterface::func_and_args"); \
353 libmesh_error_msg("Unsupported family = " << fe_t.family); \
359 #define fe_switch(func_and_args) \
365 fe_family_switch (0, func_and_args, return, ;); \
368 fe_family_switch (1, func_and_args, return, ;); \
371 fe_family_switch (2, func_and_args, return, ;); \
374 fe_family_switch (3, func_and_args, return, ;); \
376 libmesh_error_msg("Invalid dim = " << dim); \
380 #define fe_with_vec_switch(func_and_args) \
386 fe_family_with_vec_switch (0, func_and_args, return, ;); \
389 fe_family_with_vec_switch (1, func_and_args, return, ;); \
392 fe_family_with_vec_switch (2, func_and_args, return, ;); \
395 fe_family_with_vec_switch (3, func_and_args, return, ;); \
397 libmesh_error_msg("Invalid dim = " << dim); \
402 #define void_fe_switch(func_and_args) \
408 fe_family_switch (0, func_and_args, ;, ; return;); \
411 fe_family_switch (1, func_and_args, ;, ; return;); \
414 fe_family_switch (2, func_and_args, ;, ; return;); \
417 fe_family_switch (3, func_and_args, ;, ; return;); \
419 libmesh_error_msg("Invalid dim = " << dim); \
423 #define void_fe_with_vec_switch(func_and_args) \
429 fe_family_with_vec_switch (0, func_and_args, ;, ; return;); \
432 fe_family_with_vec_switch (1, func_and_args, ;, ; return;); \
435 fe_family_with_vec_switch (2, func_and_args, ;, ; return;); \
438 fe_family_with_vec_switch (3, func_and_args, ;, ; return;); \
440 libmesh_error_msg("Invalid dim = " << dim); \
451 #ifdef LIBMESH_ENABLE_INFINITE_ELEMENTS
476 #ifdef LIBMESH_ENABLE_INFINITE_ELEMENTS
485 fe_with_vec_switch(
n_dofs(t, o));
496 FEType p_refined_fe_t = fe_t;
497 p_refined_fe_t.
order = static_cast<Order>(p_refined_fe_t.
order + elem->
p_level());
506 const unsigned int n)
508 #ifdef LIBMESH_ENABLE_INFINITE_ELEMENTS
538 #ifdef LIBMESH_ENABLE_INFINITE_ELEMENTS
554 const unsigned int dim,
557 std::vector<unsigned int> & di)
567 const unsigned int dim,
570 std::vector<unsigned int> & di)
583 const std::vector<Number> & elem_soln,
584 std::vector<Number> & nodal_soln)
586 #ifdef LIBMESH_ENABLE_INFINITE_ELEMENTS
609 #ifdef LIBMESH_ENABLE_INFINITE_ELEMENTS
613 fe_with_vec_switch(
map(elem, p));
624 const Real tolerance,
627 #ifdef LIBMESH_ENABLE_INFINITE_ELEMENTS
634 fe_with_vec_switch(
inverse_map(elem, p, tolerance, secure));
643 const std::vector<Point> & physical_points,
644 std::vector<Point> & reference_points,
645 const Real tolerance,
648 const std::size_t n_pts = physical_points.
size();
651 reference_points.resize(n_pts);
655 libMesh::err <<
"WARNING: empty vector physical_points!"
661 #ifdef LIBMESH_ENABLE_INFINITE_ELEMENTS
672 void_fe_with_vec_switch(
inverse_map(elem, physical_points, reference_points, tolerance, secure));
690 const unsigned int i,
693 #ifdef LIBMESH_ENABLE_INFINITE_ELEMENTS
702 fe_switch(
shape(t,o,i,p));
708 const unsigned int i,
711 #ifdef LIBMESH_ENABLE_INFINITE_ELEMENTS
720 fe_switch(
shape(elem,o,i,p));
724 void FEInterface::shape<Real>(
const unsigned int dim,
727 const unsigned int i,
731 #ifdef LIBMESH_ENABLE_INFINITE_ELEMENTS
746 fe_scalar_vec_error_switch(0,
shape(t,o,i,p), phi = , ;
break;);
749 fe_scalar_vec_error_switch(1,
shape(t,o,i,p), phi = , ;
break;);
752 fe_scalar_vec_error_switch(2,
shape(t,o,i,p), phi = , ;
break;);
755 fe_scalar_vec_error_switch(3,
shape(t,o,i,p), phi = , ;
break;);
758 libmesh_error_msg(
"Invalid dimension = " <<
dim);
765 void FEInterface::shape<Real>(
const unsigned int dim,
768 const unsigned int i,
772 #ifdef LIBMESH_ENABLE_INFINITE_ELEMENTS
786 fe_scalar_vec_error_switch(0,
shape(elem,o,i,p), phi = , ;
break;);
789 fe_scalar_vec_error_switch(1,
shape(elem,o,i,p), phi = , ;
break;);
792 fe_scalar_vec_error_switch(2,
shape(elem,o,i,p), phi = , ;
break;);
795 fe_scalar_vec_error_switch(3,
shape(elem,o,i,p), phi = , ;
break;);
798 libmesh_error_msg(
"Invalid dimension = " <<
dim);
805 void FEInterface::shape<RealGradient>(
const unsigned int dim,
808 const unsigned int i,
818 fe_vector_scalar_error_switch(0,
shape(t,o,i,p), phi = , ;
break;);
821 fe_vector_scalar_error_switch(1,
shape(t,o,i,p), phi = , ;
break;);
824 fe_vector_scalar_error_switch(2,
shape(t,o,i,p), phi = , ;
break;);
827 fe_vector_scalar_error_switch(3,
shape(t,o,i,p), phi = , ;
break;);
830 libmesh_error_msg(
"Invalid dimension = " <<
dim);
848 const unsigned int i,
849 const unsigned int j,
852 libmesh_assert_greater (
dim,j);
853 #ifdef LIBMESH_ENABLE_INFINITE_ELEMENTS
866 fe_family_switch (0,
shape_deriv(t, o, i, j, p),
return , ;);
868 fe_family_switch (1,
shape_deriv(t, o, i, j, p),
return , ;);
870 fe_family_switch (2,
shape_deriv(t, o, i, j, p),
return , ;);
872 fe_family_switch (3,
shape_deriv(t, o, i, j, p),
return , ;);
874 libmesh_error_msg(
"Invalid dimension = " <<
dim);
883 const unsigned int i,
884 const unsigned int j,
887 libmesh_assert_greater (
dim,j);
888 #ifdef LIBMESH_ENABLE_INFINITE_ELEMENTS
901 fe_family_switch (0,
shape_deriv(elem, o, i, j, p),
return , ;);
903 fe_family_switch (1,
shape_deriv(elem, o, i, j, p),
return , ;);
905 fe_family_switch (2,
shape_deriv(elem, o, i, j, p),
return , ;);
907 fe_family_switch (3,
shape_deriv(elem, o, i, j, p),
return , ;);
909 libmesh_error_msg(
"Invalid dimension = " <<
dim);
923 #ifdef LIBMESH_ENABLE_SECOND_DERIVATIVES
927 const unsigned int i,
928 const unsigned int j,
931 libmesh_assert_greater (
dim*(
dim-1),j);
932 #ifdef LIBMESH_ENABLE_INFINITE_ELEMENTS
934 libmesh_not_implemented();
950 libmesh_error_msg(
"Invalid dimension = " <<
dim);
959 const unsigned int i,
960 const unsigned int j,
963 libmesh_assert_greater (
dim,j);
964 #ifdef LIBMESH_ENABLE_INFINITE_ELEMENTS
966 libmesh_not_implemented();
982 libmesh_error_msg(
"Invalid dimension = " <<
dim);
994 #endif //LIBMESH_ENABLE_SECOND_DERIVATIVES
998 void FEInterface::shape<RealGradient>(
const unsigned int dim,
1001 const unsigned int i,
1010 fe_vector_scalar_error_switch(0,
shape(elem,o,i,p), phi = , ;
break;);
1013 fe_vector_scalar_error_switch(1,
shape(elem,o,i,p), phi = , ;
break;);
1016 fe_vector_scalar_error_switch(2,
shape(elem,o,i,p), phi = , ;
break;);
1019 fe_vector_scalar_error_switch(3,
shape(elem,o,i,p), phi = , ;
break;);
1022 libmesh_error_msg(
"Invalid dimension = " <<
dim);
1033 #ifdef LIBMESH_ENABLE_INFINITE_ELEMENTS
1044 const unsigned int n_dof =
n_dofs (
dim, fe_t, elem);
1046 data.shape.resize(n_dof);
1048 if (
data.need_derivative())
1050 data.dshape.resize(n_dof);
1051 data.local_transform.resize(
dim);
1053 for (
unsigned int d=0; d<
dim; d++)
1054 data.local_transform[d].resize(
dim);
1057 std::vector<Point> pt(1);
1060 fe->reinit(elem, &pt);
1063 data.local_transform[0][0] = fe->get_dxidx()[0];
1066 data.local_transform[1][0] = fe->get_detadx()[0];
1067 data.local_transform[1][1] = fe->get_detady()[0];
1068 data.local_transform[0][1] = fe->get_dxidy()[0];
1071 data.local_transform[2][0] = fe->get_dzetadx()[0];
1072 data.local_transform[2][1] = fe->get_dzetady()[0];
1073 data.local_transform[2][2] = fe->get_dzetadz()[0];
1074 data.local_transform[1][2] = fe->get_detadz()[0];
1075 data.local_transform[0][2] = fe->get_dxidz()[0];
1083 for (
unsigned int n=0; n<n_dof; n++)
1091 if (
data.need_derivative())
1093 for (
unsigned int j=0; j<
dim; j++)
1101 #ifdef LIBMESH_ENABLE_AMR
1105 const unsigned int variable_number,
1112 switch (elem->
dim())
1163 #ifdef LIBMESH_ENABLE_HIGHER_ORDER_SHAPES
1222 #ifdef LIBMESH_ENABLE_HIGHER_ORDER_SHAPES
1249 libmesh_error_msg(
"Invalid dimension = " << elem->
dim());
1253 #endif // #ifdef LIBMESH_ENABLE_AMR
1257 #ifdef LIBMESH_ENABLE_PERIODIC
1264 const unsigned int variable_number,
1277 #endif // #ifdef LIBMESH_ENABLE_PERIODIC
1288 const unsigned int unlimited = 11;
1292 const unsigned int unknown = unlimited;
1371 #ifdef LIBMESH_ENABLE_HIGHER_ORDER_SHAPES
1673 #ifdef LIBMESH_ENABLE_HIGHER_ORDER_SHAPES
1711 return mesh.mesh_dimension();
The constraint matrix storage format.
static shape_ptr shape_function(const unsigned int dim, const FEType &fe_t)
We're using a class instead of a typedef to allow forward declarations and future flexibility.
static void compute_periodic_constraints(DofConstraints &constraints, DofMap &dof_map, const PeriodicBoundaries &boundaries, const MeshBase &mesh, const PointLocatorBase *point_locator, const unsigned int variable_number, const Elem *elem)
Computes the constraint matrix contributions (for meshes with periodic boundary conditions) correspon...
static bool on_reference_element(const Point &p, const ElemType t, const Real eps=TOLERANCE)
static bool extra_hanging_dofs(const FEType &fe_t)
class FEComputeData hides arbitrary data to be passed to and from children of FEBase through the FEIn...
static unsigned int n_shape_functions(const unsigned int dim, const FEType &fe_t, const ElemType t)
static FEContinuity get_continuity(const FEType &fe_type)
Returns the input FEType's FEContinuity based on the underlying FEFamily and potentially the Order,...
static unsigned int n_vec_dim(const MeshBase &mesh, const FEType &fe_type)
FEFamily family
The type of finite element.
static Point inverse_map(const unsigned int dim, const FEType &fe_t, const Elem *elem, const Point &p, const Real tolerance=TOLERANCE, const bool secure=true)
This is now deprecated; use FEMap::inverse_map instead.
static void ifem_nodal_soln(const unsigned int dim, const FEType &fe_t, const Elem *elem, const std::vector< Number > &elem_soln, std::vector< Number > &nodal_soln)
static n_dofs_at_node_ptr n_dofs_at_node_function(const unsigned int dim, const FEType &fe_t)
static unsigned int ifem_n_dofs(const unsigned int dim, const FEType &fe_t, const ElemType t)
static unsigned int n_dofs_at_node(const unsigned int dim, const FEType &fe_t, const ElemType t, const unsigned int n)
static Real shape_second_deriv(const unsigned int dim, const FEType &fe_t, const ElemType t, const unsigned int i, const unsigned int j, const Point &p)
static unsigned int ifem_n_dofs_per_elem(const unsigned int dim, const FEType &fe_t, const ElemType t)
The libMesh namespace provides an interface to certain functionality in the library.
virtual unsigned short dim() const =0
virtual bool infinite() const =0
static shape_deriv_ptr shape_deriv_function(const unsigned int dim, const FEType &fe_t)
unsigned int p_level() const
static bool is_InfFE_elem(const ElemType et)
Real(* shape_ptr)(const Elem *elem, const Order o, const unsigned int i, const Point &p, const bool add_p_level)
unsigned int(* n_dofs_at_node_ptr)(const ElemType, const Order, const unsigned int)
static void nodal_soln(const unsigned int dim, const FEType &fe_t, const Elem *elem, const std::vector< Number > &elem_soln, std::vector< Number > &nodal_soln)
Build the nodal soln from the element soln.
static void compute_periodic_constraints(DofConstraints &constraints, DofMap &dof_map, const PeriodicBoundaries &boundaries, const MeshBase &mesh, const PointLocatorBase *point_locator, const unsigned int variable_number, const Elem *elem)
Computes the constraint matrix contributions (for periodic boundary conditions) corresponding to vari...
static Real ifem_shape_deriv(const unsigned int dim, const FEType &fe_t, const ElemType t, const unsigned int i, const unsigned int j, const Point &p)
auto size() const -> decltype(std::norm(T()))
This is the MeshBase class.
std::unique_ptr< T > UniquePtr
static unsigned int n_dofs_per_elem(const unsigned int dim, const FEType &fe_t, const ElemType t)
static std::unique_ptr< FEGenericBase > build(const unsigned int dim, const FEType &type)
Builds a specific finite element type.
A Point defines a location in LIBMESH_DIM dimensional Real space.
static void dofs_on_edge(const Elem *const elem, const unsigned int dim, const FEType &fe_t, unsigned int e, std::vector< unsigned int > &di)
Fills the vector di with the local degree of freedom indices associated with edge e of element elem A...
static void compute_constraints(DofConstraints &constraints, DofMap &dof_map, const unsigned int variable_number, const Elem *elem)
Computes the constraint matrix contributions (for non-conforming adapted meshes) corresponding to var...
static unsigned int ifem_n_dofs_at_node(const unsigned int dim, const FEType &fe_t, const ElemType t, const unsigned int n)
static unsigned int n_dofs(const unsigned int dim, const FEType &fe_t, const ElemType t)
const FEType & variable_type(const unsigned int c) const
std::string enum_to_string(const T e)
Real(* shape_deriv_ptr)(const Elem *elem, const Order o, const unsigned int i, const unsigned int j, const Point &p, const bool add_p_level)
static unsigned int ifem_n_shape_functions(const unsigned int dim, const FEType &fe_t, const ElemType t)
static Point map(unsigned int dim, const FEType &fe_t, const Elem *elem, const Point &p)
This is now deprecated; use FEMap::map instead.
static Real ifem_shape(const unsigned int dim, const FEType &fe_t, const ElemType t, const unsigned int i, const Point &p)
static void dofs_on_side(const Elem *const elem, const unsigned int dim, const FEType &fe_t, unsigned int s, std::vector< unsigned int > &di)
Fills the vector di with the local degree of freedom indices associated with side s of element elem A...
static bool on_reference_element(const Point &p, const ElemType t, const Real eps=TOLERANCE)
static Real shape_deriv(const unsigned int dim, const FEType &fe_t, const ElemType t, const unsigned int i, const unsigned int j, const Point &p)
class FEType hides (possibly multiple) FEFamily and approximation orders, thereby enabling specialize...
OrderWrapper order
The approximation order of the element.
This class handles the numbering of degrees of freedom on a mesh.
static FEFieldType field_type(const FEType &fe_type)
Real(* shape_second_deriv_ptr)(const Elem *elem, const Order o, const unsigned int i, const unsigned int j, const Point &p, const bool add_p_level)
This is the base class from which all geometric element types are derived.
static void compute_constraints(DofConstraints &constraints, DofMap &dof_map, const unsigned int variable_number, const Elem *elem)
Computes the constraint matrix contributions (for non-conforming adapted meshes) corresponding to var...
IterBase * data
Ideally this private member data should have protected access.
static Point ifem_inverse_map(const unsigned int dim, const FEType &fe_t, const Elem *elem, const Point &p, const Real tolerance=TOLERANCE, const bool secure=true)
DIE A HORRIBLE DEATH HERE typedef LIBMESH_DEFAULT_SCALAR_TYPE Real
static shape_second_deriv_ptr shape_second_deriv_function(const unsigned int dim, const FEType &fe_t)
This is the base class for point locators.
static void ifem_compute_data(const unsigned int dim, const FEType &fe_t, const Elem *elem, FEComputeData &data)
static unsigned int max_order(const FEType &fe_t, const ElemType &el_t)
virtual ElemType type() const =0
ElemType
Defines an enum for geometric element types.
FEInterface()
Empty constructor.
static void compute_data(const unsigned int dim, const FEType &fe_t, const Elem *elem, FEComputeData &data)
Lets the appropriate child of FEBase compute the requested data for the input specified in data,...
static Real shape(const unsigned int dim, const FEType &fe_t, const ElemType t, const unsigned int i, const Point &p)
static Point ifem_map(const unsigned int dim, const FEType &fe_t, const Elem *elem, const Point &p)